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

컴퓨터 구조 zero extension, sign extension ( 부호 확장, 영 확장 )

by 전컴반 2022. 2. 26.
반응형

먼저 32bit cpu로 예를 들어보자

add x5 x6 x7을 수행하면, R-type으로 전체 32비트 레지스터가 ALU에 각각 32비트에 맞게 들어간다. 전혀 문제가 없다.
하지만 addi x5 x6 5와 같은 immediates를 하면 x6는 문제없지만 아래와 같아 imm [11:0] 즉, 12bit와 32bit는 짝이 맞지 않다. 여기서 어떻게 해야 숫자 5 (12bit)를 32bit에 맞게 집어넣을 수 있을까??


2가지 방법이 있다.
하나는 모두 0으로 채우는 Zero Extension
다른 하나는 MEB값으로 채우는 Sign Extension이 있다. 하나씩 알아보자

Zero Extension


빈 bit를 모두 0으로 채우는 것이다. 예를 들어, addi t0 s3 -12라면, -12는 12bit 111111110100으로 표현될 수 있다.
zero extension이기 때문에 나머지 20bit를 0으로 채워 입력으로 넣어준다. 이러면 안 된다. 왜냐면 다 0으로 집어넣고 계산을 하면 -12가 아니라 다른 수가 나온다.
이렇기 때문에 zero extension은 산술 연산에 사용하지 않고 논리 연산에 주로 사용한다. 가량 andi t0 x6 0x7FE 같은 경우를 말한다. 0x7FE를 상수로 보진 않기 때문이다.

MIPS난 ARM 같은 ISA는 사용하지만, RSIC-V에선 zero extension을 사용하지 않고 논리 연산 또한 sign extension을 사용한다.

Sign Extension


immediates는 sign extension에 해당된다. 예를 들어, addi t0 s3 -12라면, -12는 12bit 111111110100으로 표현될 수 있다. MSB가 1이기 때문에 나머지 20bit를 1로 채워 입력으로 넣어준다. 0 xFFFF_FFF4로 입력을 넣어준다. 이게 맞는지 확인하려면 2의 보수를 취해서 역으로 +12가 나오는지 보면 된다. 2의 보수를 취하면 0x0000_000C로 +12가 나오는 걸 확인할 수 있다.

RISC-V에선 andi x5, x6, 0x7FF를 하면, 7FF는 원래 0111... 이기 때문에 MSB인 0으로 채워서 동작한다.
하지만 만약 andi x5, x6, 0xFFF를 하면, 컴파일 에러가 뜬다. illegal operands라고 말이다. 보통 0000_0FFF로 동작한다 생각하고 적지만 0000_0FFF가 아니라, FFFF_FFFF로 변형된다. 이렇게 때문에 컴파일은 의도와 다르다고 생각하여 혼란을 줄 수 있기 때문에 지원하지 않는다. 따라서 0xFFF가 아니라 정확하게 명시해줘야 한다. andi x5, x6 -1처럼 말이다. -1은 다 1이기 때문이다.

반응형

댓글