
SEQ๋ Y86-64 ๋ช ๋ น์ด๋ค์ ํ ํด๋ญ ์ฌ์ดํด์ ํ๋์ฉ, ์์๋๋ก ์ฒ๋ฆฌํ๋ CPU ์ค๊ณ ๋ชจ๋ธ๋ก ํ์ดํ๋ผ์ธ๋ ๋ณ๋ ฌ ์ฒ๋ฆฌ๋ ์กด์ฌํ์ง ์๊ธฐ ๋๋ฌธ์ ํด๋ญ ์๋๊ฐ ๋งค์ฐ ๋๋ฆฌ๋ค.
์ด๋ ๋ฏ ๋งค์ฐ ๋๋ฆฌ์ง๋ง ๋ฐฐ์ฐ๊ธฐ ์ฌ์ด ๊ตฌ์กฐ์ด๊ธฐ ๋๋ฌธ์ ์ดํ์ SEQ๋ฅผ ๋ฐํ์ผ๋ก ํ์ดํ๋ผ์ธ ๊ตฌ์กฐ๋ฅผ ์ค๊ณํ๋๋ฐ์ ๋์์ ์ค ์ ์๋ค.
| ํน์ง | SEQ | Pipeline |
|---|---|---|
| ์ฒ๋ฆฌ ๋ฐฉ์ | ์์ฐจ์ | ๋ณ๋ ฌ์ |
| ํ ์ฌ์ดํด์ ์คํ๋๋ ๋ช ๋ น์ด ์ | 1๊ฐ | ์ต๋ N๊ฐ (์คํ ์ด์ง ์๋งํผ) |
| ์ค๊ณ ๋ณต์ก๋ | ๋งค์ฐ ์ฌ์ ๐ | ๋ณต์กํจ ๐ต (ํด์ ๋ ์ฒ๋ฆฌ ๋ฑ) |
| ์ฑ๋ฅ | ๋ฎ์ | ๋์ |
โ๏ธ ๊ทธ๋์ SEQ๋ ํ ์ฌ์ดํด์ ์ด๋ค ์์
์ ์ฒ๋ฆฌํ๊ธธ๋ ์ค๋๊ฑธ๋ฆฌ๋๊ฐ?
SEQ๋ ํ ์ฌ์ดํด์ ์๋ ๋จ๊ณ๋ฅผ ๋ชจ๋ ์ฒ๋ฆฌํ๋ ค๊ณ ํ๋ค ๋ณด๋ ํด๋ญ ์ฃผ๊ธฐ๊ฐ ๊ธธ์ด์ง๋ค.
๊ฐ ๋จ๊ณ๋ฅผ ์์ธํ ์ดํด๋ณด๋ ค๊ณ ํ๋ค.
ํ๋ก๊ทธ๋จ ์นด์ดํฐ๋ฅผ ์ด์ฉํด์ ์ธ์คํธ๋ญ์ ๋ค์ ๋ฉ๋ชจ๋ฆฌ์์ ์ฝ๊ณ , ํ์ํ ์ ๋ณด๋ฅผ ์ ์ฅํ๊ณ , ๋ค์ ๋ช ๋ น์ด ์ฃผ์๋ฅผ ๊ณ์ฐํ๋ค.

โ
"Y86-64 ๋ช
๋ น์ด๋ ๋ฉ๋ชจ๋ฆฌ์์ ์ฐ์๋ ๋ฐ์ดํธ๋ก ์ ์ฅ๋๋ค"
์ฆ, ๋ช
๋ น์ด๋ ํญ์ PC๋ถํฐ ์์ํด์, ๊ทธ ๋ค์ ๋ฐ์ดํธ, ๋ ๊ทธ ๋ค์ ๋ฐ์ดํธ... ์ด๋ ๊ฒ ์ฐ์์ ์ผ๋ก ์ ์ฅ๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋ช
๋ น์ด์ ์ด ๊ธธ์ด๋ฅผ ์๋ฉด ๋ค์ ๋ช
๋ น์ด์ ์์ ์์น๋
๐ PC + ๋ช
๋ น์ด ๊ธธ์ด โ valP ์ธ ๊ฒ์ด๋ค.
๋ช ๋ น์ด์ ๋ค์ด์๋ rA, rB๋ฅผ ์ด์ฉํด R[rA] โ valA, R[rB] โ valB ๋ก ์ฝ์ด์ด

๋ค์ํ ์ฐ์ฐ์ ์ํํ๊ฑฐ๋, ์กฐ๊ฑด์ฝ๋๋ค์ ์ค์ ํ๋ค

ํ์์์ ๋ฉ๋ชจ๋ฆฌ์ ์ ๊ทผํ๋ค
๊ณ์ฐ ๊ฒฐ๊ณผ๋ฅผ ๋ ์ง์คํฐ์ ์ ์ฅํ๋ค.
๋ค์ ์ธ์คํธ๋ญ์ ์ ์ฃผ์๋ก PC๋ฅผ ์ค์ ํ๋ค
ํ๋ก์ธ์๋ ์์ ๊ฐ์ ๋จ๊ณ๋ค์ ๋ฌดํํ ๋ฐ๋ณตํ๋ฉฐ ํ ๊ฐ์ ์ธ์คํธ๋ญ์
์ ์คํํ๋๋ฐ์ ๋๋ผ์ด ์์ ์์
์ ์๊ตฌํ๋ค.
๋ค๋ง, ์ ์ฒด์ ์ธ ํ๋ฆ์ ๋ชจ๋ ์ธ์คํธ๋ญ์
๋ค์ด ์ ์ฌํ๋ค๋ ๊ฒ์ ์ ์ ์๋ค.

์์ ๊ฐ์ ํ ์ฒ๋ผ ์ฌ๋ฌ ์ธ์คํธ๋ญ์ ๋ฅผ ์ผ๋ฐ์ ์ธ ํ๋ ์์ํฌ ๋ด์ ๋ง์ถฐ ๋ฃ๊ธฐ์ํด ํ์ํ ๊ณ์ฐ๋ค์ ์ฐพ๋ ๊ฒ์ด ์ด๋ ค์ด ๋ถ๋ถ์ด๋ค. ๋ํ ์ด๋ฌํ ํ๋ค์ ํ๋์จ์ด์ ์ง์ ๋งค์นญ๋ ์ ์๋ ํํ๋ก ๊ทธ๋ ค์ง๋ค. ๋ค๋ง ์ดํด๋ฅผ ๋์ธ ๋ฟ ์ค์ ํ๋ก๋ก ๋ง๋ค๋๋ ๋๋ถ๋ถ ๋ณ๋ ฌ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋ฏ๋ก ์๊ฒฉํ๊ฒ ์์ฐจ๋ฅผ ์งํฌ ํ์๋ ์๋ค.

pushq rArA์ ๊ฐ์ ์คํ์ ์ ์ฅํ๋ ์ธ์คํธ๋ญ์ ์ SEQ
โ๏ธ Pipeline Stages
| Stage | Operation | Explanation |
|---|---|---|
| Fetch | icode:ifun โ M1[PC] | Fetch instruction code |
rA:rB โ M1[PC+1] | Get register specifier | |
valP โ PC + 2 | Next instruction address | |
| Decode | valA โ R[rA] | Value to push |
valB โ R[%rsp] | Current stack pointer | |
| Execute | valE โ valB + (-8) | Allocate space on stack |
| Memory | M8[valE] โ valA | Store rA's value to new stack slot |
| Write Back | R[%rsp] โ valE | Update stack pointer |
| PC Update | PC โ valP | Move to next instruction |
popq rA์คํ์์ ๊ฐ์ ๊บผ๋ด์ rA์ ์ ์ฅํ๋ ์ธ์คํธ๋ญ์ ์ SEQ
| Stage | Operation | Explanation |
|---|---|---|
| Fetch | icode:ifun โ M1[PC] | Fetch instruction code |
rA:rB โ M1[PC+1] | Get register specifier | |
valP โ PC + 2 | Next instruction address | |
| Decode | valA โ R[%rsp] | Current top of stack address |
valB โ R[%rsp] | For computing new %rsp | |
| Execute | valE โ valB + 8 | Reclaim space on stack |
| Memory | valM โ M8[valA] | Load value from top of stack |
| Write Back | R[rA] โ valM | Store popped value to rA |
R[%rsp] โ valE | Update stack pointer | |
| PC Update | PC โ valP | Move to next instruction |
์์์ ๋ณธ ๊ฒ ์ฒ๋ผ ์ฐ๋ฆฌ๋ ์ด์ Y86-64์ ๋ชจ๋ ์ธ์คํธ๋ญ์ ์ ์ฒ๋ฆฌํ ์ ์๋ ํฌ๊ฒ 6๊ฐ์ง ๋จ๊ณ์ ํต์ผ๋ ํ๋ ์์ํฌ๋ฅผ ๋ง๋ค์๋ค. ์ด์ ์ฐ๋ฆฌ๊ฐ ์ด์ด์ ํ ๋ด์ฉ์ ์ด๋ฌํ ๋จ๊ณ๋ค์ ์ค์ ๊ตฌํํ๋ ํ๋์จ์ด๋ฅผ ์ค๊ณํ๊ณ ์ด๋ค์ ์๋ก ์ฐ๊ฒฐํ๋ ๊ฒ์ด๋ค.
๋ค์ ๊ทธ๋ฆผ์ Y86-64์ ๋ชจ๋ ์ธ์คํธ๋ญ์
์ ์์ฐจ์ ์ผ๋ก ์ํํ ์ ์๋ ํ๋์จ์ด ๊ตฌ์กฐ์ ์ถ์์ ์ธ ๊ด์ ์ด๋ค.

โ๏ธ ์ด๋, ์ ์
๋จ๊ณ์ ์๋ ์ธ์คํธ๋ญ์
๋ฉ๋ชจ๋ฆฌ์ ๋ฉ๋ชจ๋ฆฌ ๋จ๊ณ์ ์๋ ๋ฐ์ดํฐ ๋ฉ๋ชจ๋ฆฌ๋ ๊ฐ์ RAM์ด๋ค.
๊ทธ์ , ๋ค๋ฅธ ๋ชฉ์ ๊ณผ ๋ค๋ฅธ ๋จ๊ณ์์ ์ฌ์ฉํ๊ฒ ๋ค๋ ์๋ฏธ๋ฅผ ์ํด ์ด๋ฆ์ ๋ค๋ฅด๊ฒ ๋ช
๋ช
ํด์ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค.
๊ฒฐ๊ตญ ์์์ ํ๋ ๋ชจ๋ ๊ณ์ฐ๋ค(ex. push/pop)์ ๋ฐฉ๊ธ ๋ณธ ์ค์ ํ๋์จ์ด๋ก ์ฎ๊ธฐ๊ธฐ ์ํด ์ฐ๋ฆฐ ์ ์ด ๋ก์ง์ ๋ง๋ค์ด์ผ ํ๋ค.
๋ค์๋งํด ALU๋ฅผ ์ผค์ง ๋ง์ง, ๋ฉ๋ชจ๋ฆฌ์ ์ ๊ทผํ ์ง ๋ง์ง, ์ด๋ค ๋ ์ง์คํฐ๋ฅผ ์ฝ๊ณ ์ธ์ง ๋ฑ์ ์์ธ ์ค๊ณ๋ฅผ ๋ง๋ค์ด์ผ ํ๋ ๊ฒ์ด๋ค.
์์์ push/pop์ ์ธ์คํธ๋ญ์
์ด ์ฒ๋ฆฌ๋๋ ํ๋ฅผ ๋ดค๊ณ , ํ๋์จ์ด์ ๊ตฌ์กฐ๋ ๋ดค๋ค.
ํ์์๋ ์ธ์คํธ๋ญ์
์ด ์์ฐจ์ ์ผ๋ก ์ํ๋๋ค๋ ๊ฒ์ ๋ณด์์ง๋ง ์ค์ ํ๋์จ์ด๋ ๊ทธ๋ฐ ๊ฒ ์์ด ์ ๋ถ ํ๋ฒ์ ์ฒ๋ฆฌํ๋ค.
์ฆ, ํ๋์จ์ด๋ ํธ๋ฆฌ๊ฑฐ๊ฐ ๋๋ ํน์ ํด๋ญ ๋ณํ๊ฐ ์๊ธฐ๋ฉด ๋ชจ๋ ํ๋ก์ ์์๊ฐ์ ์ ํธ๊ฐ ํผ์ง๊ณ ์ธ์คํธ๋ญ์
์ ์ฒ๋ฆฌํ๋ค.
๊ทธ๋ ๋ค๋ฉด ์ด์ ๋ ํ๋์จ์ด๊ฐ ์ด๋ฌํ ์ฒ๋ฆฌ๋ฅผ ์ด๋ป๊ฒ ํ๋์ง ์์๋ณด๋ ค๊ณ ํ๋ค.
SEQ๋ ์กฐํฉ๋ ผ๋ฆฌํ๋ก์ ๋ ๊ฐ์ง ํํ์ ๋ฉ๋ชจ๋ฆฌ ์ฅ์น๋ก ์ด๋ฃจ์ด์ง๋ค.
์์ฐจ์ฒ๋ฆฌ๋ ์ ์ด๋ฅผ ํ์๋ก ํ์ง ์์ผ๋ฉฐ ์
๋ ฅ์ด ๋ฐ๋๋๋ง๋ค ๋
ผ๋ฆฌ ๊ฒ์ดํธ์ ๋คํธ์ํฌ๋ฅผ ํตํด ์ ์ ๋ก ์ ํ๋๋ค.
์ฆ, ํด๋ญ์ด๋ ํ์ด๋ฐ ์ ํธ ์์ด ์๋ํ๋ค.
๋ ์ง์คํฐ ํ์ผ, ์ธ์คํธ๋ญ์ ๋ฉ๋ชจ๋ฆฌ, ๋ฐ์ดํฐ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํฌํจ๋๋ค.
์ด๋, ์ธ์คํธ๋ญ์
๋ฉ๋ชจ๋ฆฌ๋ ์ฝ๊ธฐ ์ ์ฉ์ด๊ธฐ ๋๋ฌธ์ ์ํ๋ ์๊ฐ๋ง๋ค ๊ฒฐ๊ณผ ๊ฐ์ด ๋ฐ๋ก ๋์จ๋ค๊ณ ์๊ฐํด๋ ๋ฌด๋ฐฉํ๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์กฐํฉ๋
ผ๋ฆฌ์ฒ๋ผ ๊ณ ๋ คํด๋ ๋๋ค.
ํ๋ก๊ทธ๋จ ์นด์ดํฐ, ์กฐ๊ฑด์ฝ๋ ๋ ์ง์คํฐ๊ฐ ํฌํจ๋๋ค.
SEQ ๊ตฌ์ฑ์์๋ค ์ค์์ ์์ 4๊ฐ์ง๋ ์ธ์คํธ๋ญ์
๋ฉ๋ชจ๋ฆฌ, ์กฐํฉ๋
ผ๋ฆฌํ๋ก์ ๋ฌ๋ฆฌ ํด๋ญ ์ ํธ์ ์ํด์ ์ ์ด๋๋ค.
์ด์ฒ๋ผ ๋ ์ง์คํฐ๋ค๊ณผ ๋ฉ๋ชจ๋ฆฌ์ ํด๋ญ์ ๊ณต๊ธํ๋ ๊ฒ์, ์ฐ๋ฆฌ๊ฐ ์ค๊ณํ ํ๋ก์ธ์์์ ์ฌ๋ฌ ๋์๋ค์ ์์๋๋ก ์ ์ดํ๊ธฐ ์ํด ํ์ํ ๋ชจ๋ ๊ฒ์ด๋ค.
No Reading Back Principle
โ "ํ ์ธ์คํธ๋ญ์ ์ด ์์ ์ด ๊ฐฑ์ ํ ์ํ๊ฐ์ ๋ค์ ์ฝ๋ ๋์์ ์์ด์ผ ํ๋ค."
pushq ๋ช
๋ น์ด ์ฒ๋ฆฌ%rsp๋ฅผ 8๋งํผ ๊ฐ์%rsp ๊ฐ์ ๋ค์ ์ฝ์ด์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅโ ์ด๋ ์ํ๊ฐ์ ๊ฐฑ์ ํ ํ ๋ค์ ์ฝ๋ ๊ตฌ์กฐ์ด๋ฏ๋ก ์์น ์๋ฐ!
%rsp - 8 ๊ฐ์ valE๋ก ์์ฑvalE๋ฅผ:โ ๊ฐฑ์ ํ ๊ฐ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์๋๊ณ valE๋ผ๋ ์์๊ฐ์ ์์ฑ๊ฐ์ ์ฌ์ฉํ๋ ๊ฒ์
โ ๋์ผํ valE๋ฅผ ๋์์ ์ฌ์ฉํ์ฌ ๋ฉ๋ชจ๋ฆฌ ๋ฐ ๋ ์ง์คํฐ์ ์ฐ๊ธฐ ๊ฐ๋ฅ
โ ํด๋ญ ์์น ์์ ์ ๋ชจ๋ ์ฐ๊ธฐ ๋์์ด ์ ๋ ฌ๋จ
addq, subq ๋ฑ์ Condition Codes๋ฅผ ์ค์ jXX, cmovXX ๋ฑ์ Condition Codes๋ฅผ ์ฝ์
%rbx๋ ์์ง 0x100 ์ํ (addq ๊ฒฐ๊ณผ ๋ฐ์ ์ )%rbx โ 0x300 (addq ์ํ ๊ฒฐ๊ณผ)000 (ZF=0)je ์ํ: ZF=0 โ ๋ถ๊ธฐ ์คํจ โ PC โ 0x01f๋ชจ๋ ์ธ์คํธ๋ญ์
์ ํ๋์จ์ด๋ก ์ฎ๊ธฐ๊ธฐ ์ํด ์ฐ๋ฆฐ ์ ์ด๋ก์ง์ ๋ง๋ค์ด์ผ ํ๋ค๊ณ ํ๋ค.
๊ทธ๋ฆฌ๊ณ ๊ทธ๋ฌํ ์ ์ด๋ก์ง ๋ธ๋ก์ ์ํ HCL(Hardware Control Language) ์์ฑ ๋ฐฉ๋ฒ์ ์ ๋ฆฌํ๋ค.

์ ์ฌ์ง์ ์์ผ๋ก ๋ณผ HCL ๋ฌธ์ฅ์์ ์ฌ์ฉํ ์์ ๊ฐ์ผ๋ก ๊ฐ๊ฐ
์ธ์คํธ๋ญ์
์ธ์ฝ๋ฉ, ํจ์์ฝ๋, ๋ ์ง์คํฐID, ALU์ฐ์ฐ, ์ํ์ฝ๋ ๋ฑ์ ๋ํ๋ธ๋ค.
๋จ๊ณ)

bool need_regids =
icode in { IRRMOVQ, IOPQ, IPUSHQ, IPOPQ,
IIRMOVQ, IRMMOVQ, IMRMOVQ };
Instruction Memory ๋ฅผ ํฌํจํ๊ณ ์๋ค.
Split ๋ธ๋ก์์ ๋ ๊ฐ์ 4-bit ๊ฐ์ผ๋ก ๋ถํ :icode: Instruction Code = ๋ช
๋ น์ด์ ์ข
๋ฅifun: Function Code = ๋ช
๋ น์ด์ ์ธ๋ถ ๋์Align ๋ฅผ ํฌํจํ๊ณ ์๋ค.
๋ ์ง์คํฐ ํ๋์ ์์ ์๋์ ๋ํ ์ฒ๋ฆฌ ์์
์ ์ํํ๋ค.PC increment ๋ฅผ ํฌํจํ๊ณ ์๋ค.
imem_error ์ ํธ๊ฐ ํ์ฑํ๋๋ค.icode, ifun์ nop ๋ช
๋ น์ด ๊ฐ(0) ์ผ๋ก ๋์ฒด๋๋ค.icode ๊ฐ์ ๊ธฐ๋ฐ์ผ๋ก 3๊ฐ์ 1๋นํธ ์ ์ด ์ ํธ๋ฅผ ๊ณ์ฐํ๋ค.
word srcA = [
icode in { IRRMOVQ, IRMMOVQ, IOPQ, IPUSHQ } : rA;
icode in { IPOPQ, IRET } : RRSP;
1 : RNONE; # Donโt need register
];
word dstE = [
icode in { IRRMOVQ } : rB;
icode in { IIRMOVQ, IOPQ} : rB;
icode in { IPUSHQ, IPOPQ, ICALL, IRET } : RRSP;
1 : RNONE; # Donโt write any register
];
๋ ๋จ๊ณ ๋ชจ๋ ๋ ์ง์คํฐ ํ์ผ์ ์ ๊ทผํ๊ธฐ ๋๋ฌธ์ ํจ๊ป ์ค๋ช ํ๋ค.

word aluA = [
icode in { IRRMOVQ, IOPQ } : valA;
icode in { IIRMOVQ, IRMMOVQ, IMRMOVQ } : valC;
icode in { ICALL, IPUSHQ } : -8;
icode in { IRET, IPOPQ } : 8;
# Other instructions donโt need ALU
];

word mem_addr = [
icode in { IRMMOVQ, IPUSHQ, ICALL, IMRMOVQ } : valE;
icode in { IPOPQ, IRET } : valA;
# Other instructions donโt need address
];
bool mem_read = icode in { IMRMOVQ, IPOPQ, IRET };
- ๋ฉ๋ชจ๋ฆฌ๋ ํญ์ valE ๋๋ valA ์ค ํ๋๋ฅผ ์ฃผ์๋ก ์ฌ์ฉํ๋ค.

word new_pc = [
# Call. Use instruction constant
icode == ICALL : valC;
# Taken branch. Use instruction constant
icode == IJXX && Cnd : valC;
# Completion of RET instruction. Use value from stack
icode == IRET : valM;
# Default: Use incremented PC
1 : valP;
];
-SEQ์ ์ต์ข ๋จ๊ณ๋กํ๋ก๊ทธ๋จ ์นด์ดํฐ ๊ฐ์ ์์ฑํ๋ค.
ret ๋ช
๋ น์ดret ๋ช
๋ น์ด๋ฅผ ์คํํ๋ ค๋ฉด ๋ค์์ ๋์์ด ๋ชจ๋ ํ๋์ ์ฌ์ดํด ๋ด์์ ์ํ๋์ด์ผ ํจ:
โฑ ์ ๊ณผ์ ์ด ๋ชจ๋ ํ ํด๋ญ ์์น ์์ ๋ด์ ์๋ฃ๋์ด์ผ ํ๋ฏ๋ก, ํด๋ญ์ ๋งค์ฐ ๋๋ฆฌ๊ฒ ํด์ผ ํจ