Branch
- ๊ณ์ฐ๊ธฐ์ ๋ค๋ฅธ ์ปดํจํฐ์ ์ฅ์ ์ ์ด๋ค ์์ฌ๊ฒฐ์ ์ ํ ์ ์๋ ๋ฅ๋ ฅ์ด ์๋ค๋ ๊ฒ!
- ์ปดํจํฐ๋ ์ํฉ์ ๋ฐ๋ผ์ ๋ค๋ฅธ ์์ ์ ์ํํ ์ ์๋ค.
- high-level language๋ก 'if/else, case, while, for loops' ๋ฌธ๋ค์ด ๋ฐ๋ก ์กฐ๊ฑด๋ถ ์ฝ๋(Conditionally execute code) ์!
- ์๋ PC(Program Counter)๋ instruction์ ์์๋๋ก ์คํํ๊ธฐ ์ํด์ ํ ๋ช ๋ น์ด ๋๋๋ฉด 4์ฉ ์ฆ๊ฐํ๋ค (๊ฐ ๋ช ๋ น ํฌ๊ธฐ๊ฐ 4 byte์ ใ ใ )
- Branch Instruction์ ์ฝ๋๋ฅผ ์ค๊ฐ์ ๋ฐ์ด ๋๊ฑฐ๋, ์ด์ ์ฝ๋๋ก ๋์๊ฐ ์ ์๊ฒ๋ PC๋ฅผ ์์ ํ ์ ์๋ ๋ช ๋ น!
- Branch Instruction์๋ ๋ ์ข
๋ฅ๊ฐ ์์
- Conditional branch : ์กฐ๊ฑด์ด ์ฐธ์ผ ๋์๋ง ์คํ.
- beq (branch if equal) : a == b
- bne (branch if not equal) : a != b
- blt (branch if less than) : a < b
- bge (branch if greater than or equal) : a >= b
- bltu (branch if less than unsigned) : a < b (a, b๋ unsigned)
- bgeu (branch if greater than or equal for unsigned) : a >= b (a, b๋ unsigned)
- Unconditional branch : ์กฐ๊ฑด ์์ด ํญ์ branch ๋จ.
- jal (jump and link)
- jalr (jump and link register)
- Pseudo Instructions
- Conditional branch : ์กฐ๊ฑด์ด ์ฐธ์ผ ๋์๋ง ์คํ.
a > b ๋ฅผ ๋ํ๋ด๊ธฐ ์ํด์๋ blt์์ a, b ์์น๋ง ๋ฐ๊ฟ์ ๋ฃ์ด์ฃผ๊ณ , a <= b ๋ ๋ง์ฐฌ๊ฐ์ง๋ก bge๋ฅผ ๋ค์ง์ด์ ์ฌ์ฉํ๋ค!
Branch Instructions
1. beq, bne, blt, bge, bltu, bgeu
- B-Type instruction
beq rs1, rs2, label
beq s0, s1, skip # go to "skip" if (s0 == s1)
.
.
.
skip : add t0, t1, t2
์ ์ฝ๋๋ฅผ ๋ณด๋ฉด s0์ s1 ์ฆ i์ j๊ฐ ๊ฐ์ ๊ฒฝ์ฐ ์๋๋ฅผ ๊ทธ๋๋ก ์คํํ๊ณ (add)
๋ง์ฝ i์ j ๊ฐ ๋ค๋ฅผ ๊ฒฝ์ฐ skip์ผ๋ก ๋ฐ๋ก ๋๊ฒจ์ add ์๋ตํ๊ณ skip ๋ถํฐ ์คํํ๋ค.
์ฐธ๊ณ ๋ก ๊ฐ์์ง ์๋์ง๋ sub instruction์ ํ์ฉํ๋ค. s0์ s1์ ๋นผ์ ์ด 32 bit ๊ฒฐ๊ณผ๊ฐ์ or ์ฐ์ฐ์ ํ์ ๋ ๋ชจ๋ 0์ด ๋์ค๋์ง ํ์ธํ๋ค.
Branch Destination Address
B-type instructions๋ 12-bit immediate (imm[12:1]) ์ ๊ฐ์ง๊ณ ์๋ค.
- Branch Instructions์ immediate field๋ฅผ offset์ผ๋ก ์ฌ์ฉํ๋ค. (base ์์ ๋ํ๊ณ ๋นผ๋..?)
- Offset์ ํ์ฌ์ PC์ ๊ด๋ จ ๋์ด์์. ํ์ฌ PC ๊ธฐ์ค์ผ๋ก ๋ํ๊ฑฐ๋ ๋บ
Branch destination calculation
- branch instruction์์ ๋ถํฐ -2^12 ~ +2^12 - 2 bytes ์ฌ์ด์ ๋ฒ์๋ก ๋ถ๊ธฐ์ ๋ฒ์๋ฅผ ํ์ ํ๋ค.
(jump ํ๊ณ ์ถ์ด๋ ๋๋ฌด ๋ฉ๋ฆฌ๋ ๋ชปํ๋ค๋ ๋ป) - ๊ทธ ๊ฒฐ๊ณผ, destination = PC + sign - extended {imm[12:1], 1'b0}
ํ์ฌ PC(32 bit)์ offset (immediate imm[12:1]) ์ ๋ํ ๊ฐ์ด Branch Destination address์ด๋ค.
์ด ๋ offset๊ณผ pc์ ๋นํธ๊ฐ ์๋ง์ผ๋ฏ๋ก offset์ MSB๋ก sign-extend ํด์ 32 bit์ ์๋ถ๋ถ์ ์ฑ์์ค๋ค.
๋ณด๋ฉด if ๋ฌธ ์์ i==j๊ฐ ์์ง๋ง ์ค์ ๋ก assembly test์์๋ ๋ฐ๋์ธ i != j๋ฅผ ์คํํ๋ค.
2. slt, sltu, slti, sltiu
- ์ ๋ช ๋ น์ด๋ค์ ์ฐธ์ธ์ง ๊ฑฐ์ง์ธ์ง ํ๋ณํด์ rd์ ์ฐธ์ด๋ฉด 1์, ๊ฑฐ์ง์ด๋ฉด 0์ ์ ์ฅํ๋ ๋ช ๋ น์ด๋ค.
- slt, slti ๋ sign numbers
sltu, sltiu ๋ unsigned numbers์์ ์ด๋ค. - slti์ sltiu์์ immediates๋ sign-extended๋ฅผ ์ฌ์ฉํ๋ค.
slt rd, rs1, rs2 # set on less than (R-type)
sltu rd, rs2, rs2 # set on less than unsigned (R-type)
slti rd, rs1, imm12 # set on less than immediate (I-type)
sltiu rd, rs1, imm12 # set on less than unsigned immediate (I-type)
slt t0, s0, s1 # if (s0 < s1) then t0 = 1;
sltiu t0, s0, 25 # if (s0 < 25) then t0 = 1;
3. jal (jump and link)
- J-type instruction
- Unconditional branch
- jal ์ ๋ค์ ๋์์ฌ ์ฃผ์๋ฅผ ๊ธฐ์ตํ๊ณ ๋ค๋ฅธ ์ด๋๊ฐ์ ์ฃผ์๋ก jump ํ๋ ๋ช
๋ น์ด
(ret์ ๋ง๋๋ฉด ๋์์ค๋ ค๊ณ ํ ์ฃผ์๋ก ๋์์จ๋ค)
jal rd, target // PC <- target
// rd <- PC + 4
์์ฒ๋ผ PC๋ฅผ target์ผ๋ก ์ด๋ํ ๊ฑด๋ฐ, rd ์๋ฆฌ์ ์๋ ์ฝ๋ PC+4 ๋ฅผ ์ ์ฅํด๋๊ณ (์๋ ์งํ์ค์ธ ๋ช
๋ น์ ๋ค์ ๋ช
๋ น ์ฆ jal ๋ค์ ๋ช
๋ น)
target ์ฝ์ผ๋ฌ ๊ฐ.
j LLL // == jal x0, LLL
jal foo // == jal ra, foo
j instruction์ pseudo instruction์ด๋ค! jal x0 , LLL ์ด๋๊น LLL๋ก jump ํ ๊ฑฐ๊ธด ํ๋ฐ, rd ๊ฐ x0 ๋ก ์ง์ ์ด ๋์์ผ๋ฏ๋ก PC+4๋ฅผ ๋์ ํ์ง ์๊ณ ์๋ฌด๊ฒ๋ ์ํ๊ณ ๊ทธ๋ฅ jumpํ๊ณ ๋๋ธ๋ค. x0 ์ ๊ฐ์ 0์ผ๋ก ๋ณํ์ง ์๊ธฐ ๋๋ฌธ!
jal foo๋ ra๊ฐ ์๋ต๋ ๊ฒ์ผ๋ก, foo๋ก ์ ํํ๋ค๊ฐ ์๋ ์ฝ๋ ๋ช ๋ น jal ๋ค์ ๋ช ๋ น์ ์ฃผ์๊ฐ์ ra์ ์์๋ก ์ ์ฅํด๋๋ค๊ฐ foo๋ฅผ ์ฝ์ผ๋ฌ ๊ฐ๋ค.
Procedure (function)
- ํ๋ก๊ทธ๋๋จธ๋ค์ procedure๋ function์ ์ด์ฉํด์ ํ๋ก๊ทธ๋จ์ ์ง๊ฒ ๋๋ค.
- ํ๋ก๊ทธ๋จ์ modular, ์ฆ ๋ชจ๋ํ ํ๊ณ ์ดํดํ๊ธฐ ์ฝ๊ฒ ๋ง๋ค๊ธฐ ์ํด!
- ์ฝ๋์ ์ฌ์ฌ์ฉ์ฑ์ ๋์ด๊ธฐ ์ํด!
- procedure๋ ํ๋ก๊ทธ๋๋จธ๊ฐ ํ ๋ฒ์ ํ ๋ถ๋ถ์๋ง ์ง์คํ ์ ์๊ฒ ํด์ค๋ค!
- Parameters (=arguments)๋ procedure๊ณผ ๋๋จธ์ง ํ๋ก๊ทธ๋จ ์ฌ์ด์ interface ์ญํ ์ ํด์ค๋ค.
- procedure๋ ๋ถ๋ฅธ๋ค.
- caller : calling procedure (ํจ์ ํธ์ถ ๋ถ๋ถ)
- callee : called procedure (ํธ์ถ๋ ํจ์)
jal - ret pair
jal๋ก ํจ์๋ฅผ ํธ์ถํด pc๋ฅผ ์ด๋์์ผฐ๋ค๋ฉด ์ด๋ป๊ฒ ๋ค์ ๋์์ค๋! ๋ฐ๋ก ret์ด๋ผ๋ ๋ช
๋ น์ด๋ค.
ret ์ ์ด์ ์ ์ ์ฅํ ra์ ์ฃผ์๋ก ๋ค์ ์ ํํ๋ค.
์ฆ, jal ์ด ra์๋ค๊ฐ PC+4์ ์ฃผ์๋ฅผ ์ ์ฅ์ ํ ๋ค์ simple๋ก jump๋ฅผ ํ๋ฉด simple์ ์ฝ๊ธฐ ์์ํ ๊ฑฐ๊ณ , simple์ ์ฝ๋ค๊ฐ ret์ ๋ง๋๋ฉด ์๊น ์ ์ฅํ ra์ ์ฃผ์๋ก ๋ค์ jump๋ฅผ ํด์ jal์ ๋ค์ instruction์ ๋ค์ ์ฐจ๋ก๋๋ก ์ฝ์ด๋๊ฐ๋ค.
4. jalr (jump and link register)
- I-Type instruction
- Indirect jump
jalr rd, imm12(rs1) // PC <- rs1 + imm12
// rd <- PC + 4
jalr x1, 4(t0)
jair์ ์ง์ ์ด๋ฆ์ผ๋ก ์ ๊ทผํ๋๊ฒ ์๋๋ผ rs1 + imm12 ๊ฐ ์ฃผ์์ธ ๊ณณ์ผ๋ก ์ง์ ์ฐพ์๊ฐ๋ค.
rd๋ jal ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ํ์ฌ ๋ณด๊ณ ์๋ ๋ช
๋ น ๋ค์ ์ค, ์ฆ PC+4 ๋ฅผ ์ ์ฅํด์ค๋ค.
Jumping Far Away
- ๋ง์ฝ jal ์ destination์ด ๋ฐ๋ก ๊ฐ ์ ์๋ 20-bit๋ณด๋ค ๋ ๋๋ฌด ๋ฉ๋ฉด ์ด๋ป๊ฒ ํ ๊น?
- call pseudo instruction์ ์ด์ฉํ์! (= auipc + jalr )
๋ณด๋ฉด foo๊ฐ jal๋ก ๋ถํฐ ๋๋ฌด ๋ฉ๋ค! ์ด๋ด ๊ฒฝ์ฐ์๋ auipc๋ฅผ ํ์ฉํ๋ค.
์์ด๋ฒ๋ ธ์ ๊ฒ ๊ฐ์ผ๋ auipc๊ฐ ๋ญ๋๋ฉด
auipc๋ ํ์ฌ ๋ณด๊ณ ์๋ instruction์ ์ฃผ์(=PC)๋ก ๋ถํฐ ์์๋งํผ ๋ํ ์ซ์๋ฅผ ์ ์ฅํ๋ ๊ฒ]
์ฆ, auipc x1, offset[31:12] + offset[11] ์ ํ๋ฉด x1 ์๋ฆฌ์ offset 11๋ถํฐ 31๊น์ง๋ฅผ ์ ์ฅ์ ํ๊ณ
jal x1, offset[11:0](x1)์ ํตํด x1 ์ฆ offset์ 11~31 ๋ฒ์ + offset[11:0] ์ฆ offset์ 0~11 ๋ฒ์๋ฅผ ๋ํด ๊ทธ ์์น๋ก jump๋ฅผ ํด์ฃผ๋ฉด ๋๋ค.
์ ๋ฆฌํ์๋ฉด ๊ธฐ๋๊ธด, ๊ฐ๊ณ ์ ํ๋ ํจ์์ ์ฃผ์๋ฅผ ์ชผ๊ฐ์ ๋ํ๊ณ ๊ทธ ์์น๋ก jump๋ฅผ ํ๋ค๋ ๊ฒ
5. Jump Pseudo-Instructions
๊ทธ๋ ๋ค๋ฉด auipc์์ ์ ๊ตณ์ด offset์ 31:12 ์ 11๋ก ์ชผ๊ฐค๊น??
์ฐธ๊ณ ๋ก offset[11] ์ sign-extention ์ด๋ค. offset[11] ์ด 0์ผ ๋์ 1์ผ ๋๋ฅผ ๋ณด์
1) offset[11] == 0 : {offset[31:12], offset[11:0]}
2) offset[11] == 1 : {{offset[31:12], 0x000} + {0xffff_f, offset[11:0] = {offset[31:!2] , offset[11:0]}
'๐ก๐ธ๐ธ๐ถ5: ๐ฆ๐๐๐๐ถ ๐ฐ๐๐พ๐ > Computer Architecture(COSE222)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์ปดํจํฐ๊ตฌ์กฐ] CH4. RISC-V & RISC-V Instruction #2 (0) | 2021.10.13 |
---|---|
[์ปดํจํฐ๊ตฌ์กฐ] CH4. RISC-V & RISC-V Instruction #1 (0) | 2021.10.09 |
[์ปดํจํฐ๊ตฌ์กฐ] CH3. Performance (0) | 2021.10.09 |
[์ปดํจํฐ๊ตฌ์กฐ] CH2. Instructions and High-level to Machine Code (0) | 2021.10.08 |
[์ปดํจํฐ๊ตฌ์กฐ] CH1. Computer and Technology (0) | 2021.10.08 |