Shifting
shifting은 비트를 이동시키는 걸 말한다. 2가지 종류가 있다. 논리 쉬프트와 산술 쉬프트가 있다.
left (왼쪽) | right (오른쪽) | |
Arithmetic (산술) | sll, slli ex (1100 <<< 1) = 1000 |
sra, srai ex (1100 >>> 1) = 1110 |
Logical (논리) | sll, slli ex (11001011 << 3) = 01011000
|
srl, srli ex (11001011 >> 3) = 00011001
|
왼쪽으로 이동시키고 남은 자리는 산술이든 논리든 모두 0으로 채우기 때문에 구분하지 않는다. sll은 shift left logical의 약자다.
하지만 오른쪽으로 이동시키는 건 산술과 논리가 다르다. 논리는 왼쪽과 마찬가지로 0으로 채운다. 이에 반해 산술, sra는 MSB로 채운다. 만약 MSB가 1이라면 1로 채우는 게 다르다.
왜 사용하는가?
RISC-V 기본 동작에서는 +, -를 지원하지만, 곱셈과 나눗셈은 지원하지 않는다. 만약 사용하려면 M extension을 사용해야 한다.
이렇게 때문에 곱셉과 나눗셈을 하고 싶으면 shift 연산을 사용해야 한다.
왼쪽으로 이동하면 *2^n을 하는 것이고 오른쪽으로 이동시키면 /2^n의 효과를 얻을 수 있기 때문이다. 단, 나눗셈의 경우 int연산이라 소수점은 버림 한다.
이클립스 동작 예
예를 들어보자 이클립스에서
a = b * 4를 하고 dump파일을 보자
a = b *4;
// dump
slli a5,a5,2
28: 00279793 slli a5,a5,0x2
이렇듯 곱셉은 slli를 이용한다.
그렇다면 a = b * 5는 어떻게 될까? 5는 2의 제곱수가 아니다. 조금만 생각하면 쉽게 답을 찾을 수 있다.
b * 5 = b * 4 + b를 하면 된다. 그렇기 때문에 slli동작과 add동작을 수행하면 된다.
a = b * 5;
// dump
slli a5,a5,2
2c: 00279793 slli a5,a5,0x2
add a5,a5,a4
30: 00e787b3 add a5,a5,a4
이본에는 M extension을 사용하여 곱셉을 해보자, makefile에서 m을 추가하여 실행해봤다.
하지만 우리의 예상과 달리 mul을 사용하지 않는다. 이유는 뭘까?
이유는 M extension을 사용하더라도 곱셈보다, 쉬프트와 덧셈을 사용하는 게 더 저렴하다고 판단되면 그렇게 곱셉을 사용하지 않는다.
그렇기 때문에 상수가 아닌 변수를 연산한다면 우리가 생각한 동작을 수행할 것이다.
이에 a = b * c를 해보자
a = b * c;
//dump
mul a5,a4,a5
4c: 02f707b3 mul a5,a4,a5
이렇게 해야 M extension을 사용한다.
'시스템 반도체 > 컴퓨터 구조 (RISC-V)' 카테고리의 다른 글
컴퓨터 구조 lw, sw instruction (RISC-V) (0) | 2022.02.27 |
---|---|
컴퓨터 구조 Data transfer ( instruction acess, Data acess, read, write, PC register ) (0) | 2022.02.26 |
컴퓨터 구조 zero extension, sign extension ( 부호 확장, 영 확장 ) (0) | 2022.02.26 |
컴퓨터 구조 CPU register ( 레지스터, R-type, I-tpye, 메모리 계층 ) (0) | 2022.02.25 |
컴퓨터 구조 CPU 동작 ( Data processing instructions, Memory access instructions, Branch instructions ) (0) | 2022.02.25 |
댓글