ํ๋ก์ธ์์ ๋ค์ํ ๋์์ ์์ธ์ ์ธ ํ๋ฆ์ ๋ฐ์์ํฌ ์ ์์ผ๋ฉฐ,
์์ธ๋ค์ ๋ด๋ถ์ ์ผ๋ก ๋ฐ์ํ๊ฑฐ๋ ์ธ๋ถ์ ์ผ๋ก ๋ฐ์ํ ์ ์๋ค.
ํ์ดํ๋ผ์ธ์ ์ฌ์ฉํ ์์คํ ์์ ์์ธ์ฒ๋ฆฌ๋ ์ฌ๋ฌ๊ฐ์ง ๋ฏธ๋ฌํ ๋ถ๋ถ๋ค๊ณผ ๊ด๊ณ๊ฐ ์๋ ๊ฒฝ์ฐ๊ฐ ์๋๋ฐ, ๊ทธ ๋ถ๋ถ์ ๋ํด์ ์ดํด๋ณด๋ ค๊ณ ํ๋ค.
halt ๋ช
๋ น โ halt ์์ธ์์ ์ฝ๋:
1 irmovq $1, %rax # RAX โ 1
2 xorq %rsp, %rsp # RSP โ 0, CC โ 100
3 pushq %rax # ์คํ ํฌ์ธํฐ ๊ฐ์ โ 0xfffffffffffffff8 โ ์ฃผ์ ์์ธ(์ฌ์ฉ์๊ฐ ์ ๊ทผํ ์ ์๋ ์ฃผ์๋ก ๊ฐ์ )
4 addq %rax, %rax # (์คํ๋๋ฉด ์ ๋จ) CC โ 000
pushq โ ๋ฉ๋ชจ๋ฆฌ ๋จ๊ณ์์ ์ฃผ์ ์์ธ ๋ฐ์.addq โ ์คํ ๋จ๊ณ์์ CC ๋ณ๊ฒฝ ์๋.์์์ ๋งํ ์์ธ๋ค์ ๋ํด์ ์ด๋ ํ ๋ฐฉ๋ฒ์ผ๋ก ์ฐ๋ฆฌ๊ฐ ์ธ๊ธํ ๋ฏธ๋ฌํ ์ ๋ค์ ์ฒ๋ฆฌํ๋์ง ์๊ฐํด๋ณด์
์ํ์ฝ๋(stat) ํ๋๋ฅผ ์ฌ์ฉํ์
stat์ ์์ธ ์ข
๋ฅ ๊ธฐ๋ก์์ธ ๋ฐ์ ํ, ๋ค์ ๋ช ๋ น์ด๋ ํ๋ก๊ทธ๋๋จธ ๊ฐ์ ์ํ๋ฅผ ๋ณ๊ฒฝํด์๋ ์๋๋ค.
์ฆ, ์์ธ๊ฐ ๋ ์์ ์ดํ์ ๋ช ๋ น๋ค์ CPU ์์์๋ ํ์ดํ๋ผ์ธ์ ๋ค์ด์ ์๋๋ผ๋, ํ๋ก๊ทธ๋จ์ด ๋ณผ ์ ์๋ ์ํ(๋ ์ง์คํฐ ๊ฐ, ๋ฉ๋ชจ๋ฆฌ ๋ด์ฉ ๋ฑ)๋ฅผ ์ ๋๋ก ๋ฐ๊พธ๋ฉด ์ ๋๋ค.
stat์ ์ ์ฅ.์ด ๋ถ๋ถ์์๋ Y86-64 PIPE ํ๋ก์ธ์๊ฐ ์ค์ ๋ก ์ด๋ป๊ฒ ๋ช
๋ น์ด๋ฅผ ์ฒ๋ฆฌํ๋์ง,
๊ฐ ๋จ๊ณ๋ณ(Fetch โ Decode โ Execute โ Memory โ Write back) ์ญํ ๊ณผ ๋ฐ์ดํฐ ํ๋ฆ, ๊ทธ๋ฆฌ๊ณ ์ฐํ๋ง(Forwarding), ์คํจ/๋ฒ๋ธ ์ ์ด, ์์ธ ์ฒ๋ฆฌ, ์ฑ๋ฅ ๋ถ์ ๋ฑ์ ํ๋์จ์ด ์ ์ด ๊ด์ ์์ ์ดํด๋ณด๋ ค๊ณ ํ๋ค.

rA/rB, valC, valP ์ฐ์ถ โ ์์ธก PC ๊ณ์ฐ.Need_regids, Need_valC (๋ช
๋ น ์ข
๋ฅ๋ณ)
d_srcA, d_srcB, d_dstE, d_dstM) โ ๋ ์ง์คํฐ ํ์ผ/์ฐํ๋ง์์ ์ต์ ๊ฐ ์ ํ โ d_valA, d_valB ์์ฑ.๊ทธ๋ฆผ ์ Sel+Fwd A ๋ธ๋ก์ ๋ ๊ฐ์ง ์ผ์ ๋์์ ํ๋ค.
1. valP + valA ๋ณํฉ
valP : ๋ค์ ๋ช
๋ น์ด ์ฃผ์(PC + ๋ช
๋ น์ด ๊ธธ์ด) valA : ๋ช
๋ น์ด ์คํ์ ํ์ํ ๋ ์ง์คํฐ ๊ฐ valP๊ฐ ํ์ํ๋๊น, ๋๋จธ์ง ๊ฒฝ์ฐ๋ valA๋ก ๋์ฒดํด์ ์ ๋ฌForwarding ๊ฒฝ๋ก๋ ์ฌ๋ฌ ๊ตฐ๋ฐ์์ ๊ฐ์ด ์ฌ ์ ์์.
๊ฐ์ ๋ ์ง์คํฐ๋ฅผ ์ฌ๋ฌ ๋ช
๋ น์ด๊ฐ ๊ฐฑ์ ํ๋ ค๊ณ ํ ๋,
ํ๋ก๊ทธ๋จ ์คํ ์์์ ๊ฐ์ฅ ๋์ค์ ์คํ๋ ๋ช
๋ น์ด์ ๊ฐ์ ์ ํํด์ผ ํ๋ค.
ํ์ดํ๋ผ์ธ์์๋ ์ด ๊ฐ์ด ๊ฐ์ฅ ์์ชฝ(earliest) ๋จ๊ณ์ ์์นํด ์๋ค.
์ด์ : ํ๋ก๊ทธ๋จ ์์์์ ๋ ๋์ค์ ์์นํ ๋ช ๋ น์ด๊ฐ ๊ฒฐ๊ตญ ์ต์ข ์ ์ผ๋ก ๋ ์ง์คํฐ๋ฅผ ๋ฎ์ด์ฐ๊ฒ ๋๋ฏ๋ก, ๊ทธ ๊ฐ์ ๋ฏธ๋ฆฌ ์ ๋ฌํด์ผ ํ๋ค.
์) E ๋จ๊ณ์ ์๋ค๋ฉด, ๊ฐ์ ์ฌ์ดํด์์ M ๋จ๊ณ๋ W ๋จ๊ณ์ ์๋ ๊ฐ๋ณด๋ค โ์ต์ข ๊ฐโ์ด๋ฏ๋ก ์ฐ์ ์์๊ฐ ๋ ๋๋ค.
| ์ฐ์ ์์ | ์กฐ๊ฑด | ์ฌ์ฉ ๊ฐ | ์ถ์ฒ(Stage) | ์ด์ |
|---|---|---|---|---|
| 1 | E_dstE == d_src | e_valE | Execute ๋จ๊ณ ALU ๊ฒฐ๊ณผ | ๊ฐ์ฅ ์ต์ ๊ฐ์ด Execute ๋จ๊ณ์์ ๋ฐ๋ก ๋์๊ธฐ ๋๋ฌธ์, ๋ฉ๋ชจ๋ฆฌยท๋ ์ง์คํฐ์ ๊ธฐ๋ก๋๊ธฐ ์ ์ด๋ผ๋ ์ด ๊ฐ์ ์ฐ๋ฉด ์ง์ฐ ์์ด ์ต์ ๊ฒฐ๊ณผ ์ฌ์ฉ ๊ฐ๋ฅ |
| 2 | M_dstM == d_src | m_valM | Memory ๋จ๊ณ์์ ์ฝ์ ๋ฉ๋ชจ๋ฆฌ ๊ฐ | Memory ๋จ๊ณ์์ ๋ฉ๋ชจ๋ฆฌ ์ฝ๊ธฐ(load)๋ก ์ป์ ๊ฐ์ด๋ฏ๋ก, ์ด ์์ ์์๋ง ์ป์ ์ ์๋ ์ต์ ๋ฐ์ดํฐ |
| 3 | M_dstE == d_src | M_valE | Memory ๋จ๊ณ์์ ALU ๊ฒฐ๊ณผ | Execute์์ ๋์จ ๊ฐ์ด์ง๋ง ์ง๊ธ Memory ๋จ๊ณ์ ์์ผ๋ฏ๋ก, 1๋ฒ๋ณด๋ค ํ ์ฌ์ดํด ๋ฆ์ |
| 4 | W_dstM == d_src | W_valM | Write-back ๋จ๊ณ์์ ๋ฉ๋ชจ๋ฆฌ ๊ฐ | ๋ฉ๋ชจ๋ฆฌ์์ ์ฝ์ด์ ์ด์ ๋ ์ง์คํฐ์ ๊ธฐ๋ก ์ง์ ์ธ ๊ฐ. ์ด์ ๋จ๊ณ๋ณด๋ค ํ ์ฌ์ดํด ๋ ์ง๋ ๊ฐ |
| 5 | W_dstE == d_src | W_valE | Write-back ๋จ๊ณ์์ ALU ๊ฒฐ๊ณผ | ALU ๊ณ์ฐ ๊ฒฐ๊ณผ๋ฅผ ๋ ์ง์คํฐ์ ๊ธฐ๋ก ์ง์ . ๊ฐ์ฅ ์ค๋๋ ๊ฐ์ด๋ฏ๋ก ์ฐ์ ์์ ๊ฐ์ฅ ๋ฎ์ |
| 6 | ๊ทธ ์ธ | d_rvalA | Register File | ์ ๋ชจ๋ ๊ฒฝ์ฐ์ ํด๋น ์ ๋ ๋๋ง ๋ ์ง์คํฐ ํ์ผ ๊ฐ ์ฌ์ฉ |
์์) E_dstE == d_src : Execute ๋จ๊ณ์ ์๋ ๋ช ๋ น์ด์ ๋ชฉ์ ์ง ๋ ์ง์คํฐ(E_dstE)๊ฐ, Decode ๋จ๊ณ์์ ์ฝ์ผ๋ ค๋ ์์ค ๋ ์ง์คํฐ์ ๊ฐ์ผ๋๊น Execute๊ฒฐ๊ณผ์ธ e_valE์ ๊ฐ๋ค ์ฌ์ฉํด๋ ๋๋ค๋ ๋ป
aluA/aluB ์ ํ โ ALU ์ฐ์ฐ(alufun) โ e_valE ์์ฑe_Cnd)ZF, SF, OF), cmovXX/jXX์ ์ฌ์ฉW_dstE := W_valE, W_dstM := W_valM์ด์ ๋ง์ง๋ง์ผ๋ก ํ์ดํ๋ผ์ธ ์ ์ด ๋ก์ง๋ง ๋ง๋ค๋ฉด PIPE ์ค๊ณ๊ฐ ๋๋๋๋ฐ
์ด ๋ก์ง์ ๋ฐ์ดํฐ ํฌ์๋ฉ์ด๋ ๋ถ๊ธฐ ์์ธก์ผ๋ก๋ ํด๊ฒฐํ ์ ์๋ ๋ค ๊ฐ์ง ์ ์ด ์ํฉ์ ์ฒ๋ฆฌํ๊ธฐ ์ํ ๊ฒ์ด๋ค.
Load/use ํด์ ๋
ret ์ฒ๋ฆฌ
ret ๋ช
๋ น์ด Write-back ๋จ๊ณ์ ๋๋ฌํ ๋๊น์ง ํ์ดํ๋ผ์ธ ์ ์ง๋ถ๊ธฐ ์์ธก ์คํจ
์์ธ ๋ฐ์
mrmovq, popq (๋ฉ๋ชจ๋ฆฌ ์ฝ๊ธฐ) ๋ช
๋ นret ์ฒ๋ฆฌret์ด Memory ๋จ๊ณ์์ ๋ฐํ ์ฃผ์๋ฅผ ์ฝ์ ๋๊น์ง Fetch ๋จ๊ณ๊ฐ ์ ์์ ์ผ๋ก ์งํ๋์ง ์์set_cc = 0)