bltu

bltu

RISC-V 어셈블리 참조

lyszt.net은 bltu 및 기타 RISC-V 명령어를 더 자세히 다룹니다.

인코딩 형식

R
31–25funct7
24–20rs2
19–15rs1
14–12funct3
11–7rd
6–0opcode
I
31–20imm[11:0]
19–15rs1
14–12funct3
11–7rd
6–0opcode
S
31–25imm[11:5]
24–20rs2
19–15rs1
14–12funct3
11–7imm[4:0]
6–0opcode
B
31–25imm[12,10:5]
24–20rs2
19–15rs1
14–12funct3
11–7imm[4:1,11]
6–0opcode
U
31–12imm[31:12]
11–7rd
6–0opcode
J
31–12imm[20,10:1,11,19:12]
11–7rd
6–0opcode

설명

bltu는 blt와 같은 분기를 수행하지만 두 레지스터를 모두 부호 없는 값으로 읽습니다. 이름은 branch if less than, unsigned를 뜻합니다. rs1이 rs2보다 작을 때 분기가 실행되며, 두 값 모두 0부터 약 40억까지의 음수가 아닌 수로 읽힙니다. blt 페이지에서는 분기 자체를 설명합니다. 이 페이지에서는 부호 없는 읽기에 자체 명령이 있는 이유를 설명합니다.

같은 32비트라도 최상위 비트를 부호로 읽는지 값의 일부로 읽는지에 따라 다른 수를 나타냅니다. blt는 비트를 부호 있는 값으로 읽고 bltu는 부호 없는 값으로 읽으며, 두 읽기는 서로 일치하지 않습니다. 모든 비트가 1로 설정된 레지스터는 blt에게는 -1, 즉 매우 작은 값이고 bltu에게는 가능한 가장 큰 값입니다. 잘못된 명령을 선택하면 오류 메시지 없이 잘못된 결과가 나옵니다.

bltu는 메모리 주소, 크기, 개수, 위치처럼 음수가 될 수 없는 모든 것에 적합합니다. 부호 있는 blt로 주소를 비교하면 주소가 커져서 최상위 비트가 설정되는 순간 실패합니다. 부호 있는 읽기에서는 음수로 간주되기 때문입니다.

RISC-V 매뉴얼에도 같은 범위 검사에 대한 언급이 있습니다. 부호 있는 배열 경계는 단일 bltu로 검사할 수 있습니다. 음수 인덱스는 음수가 아닌 경계보다 큰 것으로 비교되기 때문입니다.

단일 bltu는 인덱스가 범위 안에 있는지, 즉 0 이상이고 크기 n 미만인지 검사합니다.

bltu i, n, ok

i가 음수이면 부호 없는 읽기 값이 매우 큰 수가 되어 검사에 실패하므로, 부호 없는 비교 한 번으로 너무 큰 경우와 음수인 경우를 모두 잡을 수 있습니다.

예시

li t0, 1
li t1, -1
bltu t0, t1, done   # t1 read as unsigned is huge, so jump to 'done'