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) 명령어가 이 역할을 한다.
'Computer > 컴퓨터구조' 카테고리의 다른 글
[컴퓨터구조] Arithmetic for Computers(1): 덧셈과 뺄셈 (0) | 2024.05.29 |
---|---|
[컴퓨터구조] Instructions, RISC-V(5): 프로시저(Procedure) (0) | 2024.05.29 |
[컴퓨터구조] Instructions, RISC-V(3): 명령어의 컴퓨터 내부 표현 (0) | 2024.05.29 |
[컴퓨터구조] Instructions, RISC-V(1): 산술, 적재, 저장 명령어 (0) | 2024.05.29 |