slli
lyszt.net은 slli 및 기타 RISC-V 명령어를 더 자세히 다룹니다.
인코딩 형식
설명
slli는 비트를 고정된 양만큼 왼쪽으로 시프트합니다. 이 연산은 sll과 같습니다. 비트는 왼쪽으로 밀리고, 오른쪽은 0으로 채워지며, 왼쪽 끝을 넘어간 비트는 사라지고, 한 자리 이동할 때마다 값이 두 배가 됩니다(동작 방식은 sll 페이지에서 다룹니다). 이 명령은 시프트 거리를 상수로 가지므로 레지스터가 이를 제공하지 않습니다. i는 즉시값(immediate)을 의미하며, 이는 명령에 기록되는 상수를 가리키는 용어입니다.
slli의 형식은 아래와 같으며, amount는 0에서 31까지의 고정된 수입니다.
slli rd, rs1, amount
다음 줄은 t0를 3자리 왼쪽으로 시프트하며, 이는 8을 곱하는 것과 같습니다.
slli t1, t0, 3
배열은 이 명령을 흔하게 만듭니다. 배열의 32비트 값은 4바이트를 차지하므로, i번째 항목은 시작 위치에서 i 곱하기 4바이트만큼 떨어져 있고, 왼쪽으로 2만큼 시프트하면 4를 곱하는 것과 같습니다. 일반적인 패턴은 인덱스를 시프트하여 바이트 오프셋을 만들고, 배열의 시작 주소를 더한 다음, 값을 로드합니다. 이 시프트, 더하기, 로드 순서를 알아보면 다른 사람이 작성한 어셈블리를 읽을 때 도움이 됩니다.
RISC-V 매뉴얼은 상수에 의한 시프트를 표준 명령 레이아웃 중 하나인 I-type 형식의 특수화로 인코딩합니다. rs1은 시프트될 피연산자를 담고, 즉시값 필드의 하위 5비트가 시프트 양을 담습니다. slli는 논리 왼쪽 시프트를 수행하며, 하위 비트에는 0이 들어갑니다.
코드를 작성할 때 시프트 거리를 알고 있다면 slli를 사용하세요. 프로그램이 실행되는 동안 양이 계산된다면 sll을 사용하세요. 예제는 5를 3만큼 왼쪽으로 시프트하며, 이는 5 곱하기 8, 즉 40이 됩니다.
예시
li t0, 5 slli t1, t0, 3 # t1 = 5 << 3 = 40 (5 * 8)
