div
lyszt.net은 div 및 기타 RISC-V 명령어를 더 자세히 다룹니다.
인코딩 형식
설명
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
