본문 바로가기
시스템 반도체/컴퓨터 구조 (RISC-V)

컴퓨터 구조 shifit ( 사용 이유, sll, slli, sra, srl, RISC-V )

by 전컴반 2022. 2. 26.
반응형
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을 사용한다. 

반응형

댓글