본문 바로가기
Computer/컴퓨터구조

[컴퓨터구조] Instructions, RISC-V(4): 논리 연산 명령어, 조건부 분기

by 거부기씨 2024. 5. 29.
728x90
반응형

1. 논리 연산 명령어 (Logical Operations)

워드 내 비트에 대한 연산을 수행한다.

Logical operations C operators RISC-V instructions
shift left << sll, slli
shift right >> srl, srli
shift right arithmetic >> sra, srai
bit-by-bit AND & and, andi
bit-by-bit OR | or, ori
bit-by-bit XOR ^ xor, xori
bit-by-bit NOT ~ xori

 

2. 조건부 분기 (Conditional Branch)

조건부 분기는 값을 검사하고 검사 결과에 따라 프로그램 내의 새로운 주소로 제어를 넘기는 명령어이다.

 

RISC-V 어셈블리 언어는 go to가 있는 if문과 비슷한 2개의 판단 명령어를 갖고 있다.

 

beq rs1, rs2, L1

beq(branch if equal)은 rs1, rs2의 값이 같으면 L1에 해당하는 문장으로 가라는 뜻이다.

 

bne rs1, rs2, L1

bne(branch if not equal)은 rs1, rs2의 값이 같지 않으면 L1에 해당하는 문장으로 가라는 뜻이다.

 

조건부 분기는 레이블과 함께 사용된다. 다음 예시를 통해 살펴보자.

 

        bne x22, x23, Else
        add x19, x20, x21
        beq x0, x0, Exit
Else: 	sub x19, x20, x21
Exit:

 

L1에는 레이블이 들어가고, 조건을 만족시키면 해당 레이블로 넘어간다.

 

순환문

판단 기능은 둘 중 하나를 선택하는 데에도 중요하지만, 계산의 반복에도 중요하다. 두 경우 모두 같은 어셈블리 명령어가 사용된다.

 

다음 C 코드를 RISC-V 어셈블리 언어로 표현해보자.

while (save[i] == k)
	i += 1;

 

Loop:   slli x10, x22, 2
        add x10, x10, x25
        lw x9, 0(x10)
        bne x9, x24, Exit
        addi x22, x22, 1
        beq x0, x0, Loop
Exit:

 

이렇게 분기 명령어로 끝나는 명령어 시권스를 basic block이라고 부른다. basic block은 분기 명령을 포함하지 않고(맨 뒤는 허용된다), 분기 목적지나 분기 레이블도 없는(맨 앞은 허용된다) 시퀀스이다.

 

두 변수 간 대소 비교를 검사하는 명령어도 존재한다.

  • less than: blt(branch if less than), bltu(branch if less than, unsigned)
  • less than or equal
  • greater than
  • greater than or equal: bge(branch if greater than or equal), bgeu(branch if greater than or equal, unsigned)
  • equal
  • not equal

RISC-V에서는 blt, bge를 통해 대소 비교를 구현할 수 있다. 뒤에 u가 붙으면 레지스터의 값들이 부호없는 수로 취급된다.

 

빠른 경계 검사 방법

부호있는 정수를 부호없는 정수처럼 다루면 특수한 상황(0<=x<y)에서 검사 비용을 낮출 수 있다. 이 검사는 인덱스가 배열의 한계를 벗어났는지 확인하는 검사에서 유용하다.

bgeu x20, x11, IndexOutOfBounds

 

해당 명령어에서는 x20이 x11보다 크거나 같고, 또는 x20이 음수이면 IndexOutOfBounds로 분기한다.

 

Case/Switch 문장

여러 프로그래밍 언어에서는 case와 switch 문장을 갖고 있다. 이를 구현하는 가장 간단한 방법은 연속적인 조건 검사를 시행하는 것이다. 하지만 여러 코드의 시작 주소를 표로 만들면 더 효율적으로 구현할 수 있는데, 이 때 프로그램은 분기 주소 테이블 (branch address table)의 인덱스만 계산해서 분기한다.

 

분기 주소 테이블은 프로그램상의 레이블에 해당하는 주소를 저장하고 있는 워드 배열이다.

 

RISC-V는 이런 상황을 위해 indirect jump 명령어를 가진다. 즉, 레지스터에 명시된 주소로 무조건 분기한다. RISC-V에서는 jalr(jump-and-link register) 명령어가 이 역할을 한다.

728x90
반응형