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