mulh

mulh

RISC-V 어셈블리 참조

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

설명

mulh는 곱의 상위 32비트를 반환합니다. 두 개의 32비트 수를 곱하면 결과가 64비트만큼 넓어질 수 있지만, 레지스터는 32비트만 담을 수 있습니다. mul 명령어는 하위 32비트를 유지하고 나머지는 버립니다. mulh(multiply high)는 상위 32비트를 유지합니다.

같은 입력에 두 명령어를 모두 실행하면 곱 전체를 얻을 수 있습니다. mulh는 상위 절반을 한 레지스터에 쓰고, mul은 하위 절반을 다른 레지스터에 쓰며, 이 쌍이 완전한 64비트 결과를 담습니다.

상위 절반은 오버플로, 즉 32비트에 너무 큰 곱을 나타냅니다. 상위 절반에 의미 있는 값이 있다면 그 곱은 레지스터 하나에 들어가지 않는다는 뜻입니다. 매우 큰 수의 연산과 암호학은 두 절반 모두에 의존합니다.

RISC-V 매뉴얼은 mulh 외에 두 가지 변형을 더 정의합니다. mulhu는 두 개의 부호 없는 수를 곱하고, mulhsu는 rs1의 부호 있는 수에 rs2의 부호 없는 수를 곱합니다. 매뉴얼에 따르면 mulhsu는 다중 워드 부호 있는 곱셈에 나타나며, 한 수의 부호 비트를 가진 최상위 워드가 다른 수의 부호 없는 하위 워드와 곱해집니다.

h는 high를 뜻합니다. 이 버전은 피연산자를 부호 있는 것으로 취급하므로 음수가 될 수 있습니다. RISC-V 명세는 부호 없는 변형도 정의하지만, 이 시뮬레이터는 부호 있는 mulh를 제공합니다. 모든 곱셈 및 나눗셈 명령어와 마찬가지로 상수 형식은 존재하지 않으므로 두 입력 모두 레지스터에서 옵니다.

예시

li t0, 100000
li t1, 100000
mulh t2, t0, t1   # t2 = 2 (high bits of 100000 * 100000)