divu
lyszt.net은 divu 및 기타 RISC-V 명령어를 더 자세히 다룹니다.
인코딩 형식
설명
divu는 부호 없는 나눗셈을 수행합니다. 레지스터의 32비트는 두 가지 방식으로 해석될 수 있습니다. 부호 있는 해석에서는 최상위 비트가 음수를 나타내므로, 비트는 약 -20억에서 +20억까지의 값을 나타냅니다. 부호 없는 해석에서는 음수가 존재하지 않으며, 비트는 0에서 약 40억까지를 셉니다. 비트는 변하지 않습니다. 해석만 변합니다.
div는 입력을 부호 있는 값으로 취급하고, divu는 부호 없는 값으로 취급합니다. 범위의 상한 근처에서 이 둘은 서로 다른 결과를 냅니다. 모든 비트가 1로 설정된 레지스터는 div에게는 -1이고, divu에게는 4,294,967,295입니다.
divu는 음수가 될 수 없는 값에 적합합니다. 배열 위치, 바이트 단위 크기, 루프 횟수, 픽셀 좌표 등입니다. 이러한 값이 약 20억을 넘으면 부호 있는 div는 잘못된 결과를 반환합니다. 최상위 비트가 켜지고, 부호 있는 해석은 그 값을 음수로 만듭니다.
RISC-V 매뉴얼은 부호 없는 나눗셈의 0으로 나누기의 몫을 모든 비트가 1로 설정된 값으로, 나머지를 피제수와 같다고 정의합니다. 매뉴얼에 따르면 부호 없는 나눗셈의 오버플로는 발생할 수 없습니다. 모든 비트가 1로 설정된 값은 가장 큰 부호 없는 수이며, 단순한 부호 없는 나눗셈 회로는 스스로 이를 생성합니다. 그래서 매뉴얼이 그것을 선택한 것입니다.
0으로 나누기는 가장 큰 부호 없는 값을 반환하며, 모든 비트가 1로 설정됩니다. 제수가 2의 거듭제곱이면 논리 오른쪽 시프트(srli)가 더 빠르게 나눕니다. 3만큼 오른쪽으로 시프트하면 부호 없는 수를 8로 나눕니다.
예시
li t0, -2 li t1, 2 divu t2, t0, t1 # t2 = 2147483647 (t0 read as unsigned)
