Architecture / ISA
Intermediate
RISC-V RV32IM / GCC
RISC-V M 확장(RV32M) 정수 곱셈 및 나눗셈 하드웨어 명령어 구조
기본 RV32I에 8개의 정수 곱셈(mul, mulh, mulhu, mulhsu)과 나눗셈/나머지(div, divu, rem, remu) 하드웨어 명령어를 추가하는 RV32M 확장 레퍼런스.
#RISC-V #RV32M #Arithmetic #Hardware #ISA
핵심 개념기본 RV32I에는 실리콘 면적을 아끼기 위해 하드웨어 곱셈기가 없습니다. M 확장(Standard Extension for Integer Multiplication and Division)을 켜면 32비트 × 32비트 = 64비트 곱셈의 상위 32비트(
mulh)와 하위 32비트(mul), 부호/비부호 나눗셈(div/divu) 및 나머지(rem/remu)를 단일 명령어로 실행할 수 있습니다.1. RV32M 명령어 세트 요약
| 명령어 | 형식 | 연산 내용 | 용도 |
|---|---|---|---|
| mul rd, rs1, rs2 | R-type | rd = (rs1 * rs2)[31:0] | 32비트 곱셈 결과의 하위 32비트 |
| mulh rd, rs1, rs2 | R-type | rd = (rs1 * rs2)[63:32] | 부호 있는 64비트 곱셈 상위 32비트 |
| mulhu rd, rs1, rs2 | R-type | rd = (rs1 * rs2)[63:32] | 부호 없는(unsigned) 상위 32비트 |
| div rd, rs1, rs2 | R-type | rd = rs1 / rs2 | 부호 있는 32비트 정수 나눗셈 |
| divu rd, rs1, rs2 | R-type | rd = rs1 / rs2 | 부호 없는 32비트 정수 나눗셈 |
| rem rd, rs1, rs2 | R-type | rd = rs1 % rs2 | 부호 있는 나머지 연산 |
| remu rd, rs1, rs2 | R-type | rd = rs1 % rs2 | 부호 없는 나머지 연산 |
2. 64비트 전체 곱셈 결과 얻기 예제
# 32비트 정수 a(t0)와 b(t1)의 64비트 전체 곱을 (a1:a0)에 저장
# a1 = 상위 32비트, a0 = 하위 32비트
mul a0, t0, t1 # 하위 32비트 계산
mulh a1, t0, t1 # 상위 32비트 계산 (부호 보존)
# 0으로 나누기(Divide by Zero) 처리:
# RISC-V는 0으로 나누어도 트랩을 발생시키지 않고 규격상 -1(0xFFFFFFFF)을 반환합니다.