mul

mul

RISC-V 어셈블리 참조

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

설명

mul은 두 레지스터를 곱합니다. rs1과 rs2를 읽고, 그 값들을 곱한 뒤, 그 곱을 rd에 씁니다. 아래 형식은 rd = rs1 * rs2를 의미합니다.

mul rd, rs1, rs2

RISC-V는 확장(extension)이라는 계층으로 구성됩니다. 곱셈과 나눗셈은 M이라는 확장에 속하며, 가장 작은 RISC-V 코어는 이를 생략할 수 있습니다. 이 시뮬레이터는 이를 포함하는데, 전체 이름 RV32IM이 M으로 끝나므로 mul과 div를 사용할 수 있습니다. M이 없는 프로세서는 이 작업을 소프트웨어로 수행해야 합니다.

두 32비트 수의 곱은 64비트에 이를 수 있으며, 이는 레지스터 하나가 담을 수 있는 범위를 초과합니다. mul은 하위 32비트를 유지합니다. 작은 값에서는 그것이 전체 답입니다. 상위 32비트는 별도의 명령어인 mulh에서 나옵니다. 부호 있는 입력과 부호 없는 입력은 동일한 하위 32비트를 생성하므로, 하나의 명령어가 둘 다 처리합니다.

곱의 양쪽 절반이 모두 필요할 때, RISC-V 매뉴얼은 고정된 명령어 쌍을 권장합니다. mulh 명령어(또는 그 부호 없는 변형 중 하나)가 상위 절반을 제공하고, 동일한 소스 레지스터를 동일한 순서로 사용하는 mul이 하위 절반을 제공합니다. 상위 절반의 목적지는 rs1이나 rs2일 수 없습니다. 그러면 프로세서는 두 명령어를 하나의 곱셈으로 융합할 수 있습니다.

2의 거듭제곱(2, 4, 8, 16 등)을 곱하는 경우에는 대신 왼쪽 시프트를 사용할 수 있습니다. 왼쪽으로 3자리 시프트하면 8을 곱하는 것이며, 시프트는 곱셈보다 비용이 적습니다(slli 참조). 컴파일러는 이 대체를 자동으로 수행합니다. 예제는 6에 7을 곱하여 t2에 42를 남깁니다.

예시

li t0, 6
li t1, 7
mul t2, t0, t1   # t2 = 42