div

div

RISC-V 어셈블리 참조

lyszt.net은 div 및 기타 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

설명

div는 한 레지스터를 다른 레지스터로 나눕니다. 소스 레지스터 rs1과 rs2를 읽고, 첫 번째를 두 번째로 나누고, 결과를 목적지 레지스터 rd에 씁니다. 아래 형식은 rd = rs1 / rs2를 의미합니다.

div rd, rs1, rs2

곱셈과 마찬가지로, 이것은 선택적 수학 명령어의 M 확장에 속하며, 이 시뮬레이터에도 포함되어 있습니다.

이것은 정수 나눗셈이므로 소수 부분은 버려집니다. 7을 2로 나누면 3이 됩니다. 남은 1은 rem에서 나오며, 같은 두 수의 나머지를 계산합니다. 음수 결과는 0 방향으로 반올림되므로 -7 / 2는 -3이 됩니다.

0으로 나누면 -1이 반환되며, 이는 모든 비트가 1로 설정된 레지스터입니다. 하드웨어는 경고를 주지 않으므로, 0 제수를 오류로 처리해야 하는 코드는 나누기 전에 제수를 확인합니다.

RISC-V 매뉴얼은 특수한 경우를 명시합니다. 0으로 나누면 모든 비트가 설정된 몫이 나오며, 이는 div의 경우 -1로 읽히고, 나머지는 피제수와 같습니다. 부호 있는 오버플로는 가장 음수인 수를 -1로 나눌 때만 발생합니다. 그때 몫은 피제수와 같아지고 나머지는 0이 됩니다. 매뉴얼에 따르면 0으로 나누기 시 트랩은 고려되었으나 거부되었는데, 그것이 명령어 세트에서 유일한 산술 트랩이 될 것이기 때문이며, 모든 비트를 설정하는 것이 나눗셈 회로를 단순하게 유지하기 때문입니다.

오버플로하지 않는 모든 나눗셈에서 피제수는 제수 곱하기 몫 더하기 나머지와 같습니다. 몫과 나머지가 모두 필요할 때, 매뉴얼은 아래 두 줄을 권장하며, rdq는 rs1 및 rs2와 달라야 합니다. 그러면 프로세서가 둘을 단일 나눗셈으로 융합할 수 있습니다.

div rdq, rs1, rs2
rem rdr, rs1, rs2

나눗셈은 프로세서가 수행하는 가장 느린 산술 연산이며, 종종 곱셈보다 몇 배나 느립니다. 2의 거듭제곱(2, 4, 8 등)으로 나누는 것은 대신 오른쪽 시프트를 사용할 수 있습니다(srai 참조). 예제는 17을 5로 나눕니다. 5는 17에 3번 들어가고 2가 남으므로, 몫 3이 t2에 들어갑니다.

예시

li t0, 17
li t1, 5
div t2, t0, t1   # t2 = 3