조건이 참이면 결과를 1, 거짓이면 0로 둔다. 이를 slt
명령어라고 한다.
slt rd, rs, rt
-if (rs < rt) rd = 1; else rd = 0;
slti rt, rs, constant
-if (rs < constant) rt = 1; else rt = 0;
이를 이용해서 bne
, beq
와 같이 사용할 수 있다.
slt $t0, $s1, $s2 # if ($s1 < $s2)
bne $t0, $zero, L # branch to L
slti
는 명령어에서 알수 있듯이 i포맷을 가진다. 따라서 constant와 비교하여 사용한다.
slti $t0 $s0 1
라는 명령어가 있다면 if($s0<1) $t0 = 1
가 되는것이다.
기본 블록은 컴파일러에게 중요한 명령어 시퀀스다. 기본블럭이 되기 위해선 몇가지 조건이 존재한다.
이는 레이블이 붙어있는 실행단락, 즉 함수와 같은 부분으로 나눠서 작은 조각으로 쪼개는 의미이다.때문에 첫부분에 분기명령어가 없어야 하고, 처음 이외에는 레이블이 존재하지 않는다.
근데 >= 같은걸 만들면 되는거 아님? 왜 beq,slt 섞어서 씀?
<, ≥, …을 위한 하드웨어는 =, ≠을 위한 하드웨어보다 느리다. branch (분기) 와 다른 조건 명령어를 합치면 명령어당 더 많은 일이 필요하기 때문에, 클럭이 느려지고 다른 명령어들도 느려지게 된다. 7가지 방법중 작은것이 빠르다를 기억하자.
부호가 있거나 없는 경우에 따라서 연산이 달라진다. MSB를 이용해서 음수를 판단하기 때문에 부호를 사용할지 말지를 결정하고 연산을 한다. 떄문에 명령어에 unsigned를 의미하는 u가 추가된 명령어를 사용한다.
ex)
$s0 = 1111 1111 1111 1111 1111 1111 1111 1111
$s1 = 0000 0000 0000 0000 0000 0000 0000 0001
slt $t0, $s0, $s1
# 부호있음
–1 < +1 ➡️ $t0 = 1
sltu $t0, $s0, $s1
# 부호없음
+4,294,967,295 > +1 ➡️ $t0 = 0