๐ ์ปดํจํฐ ๊ตฌ์กฐ ์ค๊ฐ๊ณ ์ฌ ์ ๋ฆฌ
์ค๊ฐ๊ณ ์ฌ
1
์ปดํจํฐ๋ ๋ณธ์ง์ ์ผ๋ก ๋ชจ๋ ๊ฐ์ ๊ธฐ๋ฅ์ ํ๋ค. ์ฐจ์ด์ ์ ์ฉ๋์ ํน์ฑํ์์ ์จ๋ค.
ํผํฌ๋จผ์ค์ ์ํฅ์ ์ฃผ๋ ์์ธ : ์๊ณ ๋ฆฌ์ฆ, ์ธ์ด/์ปดํ์ผ๋ฌ/์ํคํ ์ณ, ํ๋ก์ธ์/๋ฉ๋ชจ๋ฆฌ, OS๋ฅผ ๋น๋กฏํ IO
๊ณตํ์์ ๊ฐ์ฅ ์ค์ํ ๊ฐ์น๋ ๊ณตํต์ ์ธ ๋ฌธ์ ๋ฅผ ๋น ๋ฅด๊ฒ ๋ง๋๋ ๊ฒ. ์ค์ํ ๊ฑด ์๋๊ฑฐ ๊ฐ๊ธด ํ๋ฐ ์๋ฌดํผ
์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ๋ ApplicationSoftware๋ Hardware์๊ฒ ์ผ์ ์ํจ๋ค. ๊ทธ ์ผ์ ์ํฌ ๋ ์ฌ๋ฌ๊ฐ์ง ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์๋๋ก ์ค๊ฐ์์ ๋งค๊ฐ ํด์ฃผ๋ ์ญํ ์ ํ๋ ๊ฒ์ด SystemSoftware์ด๋ค. โ shell
AssemblyLanguage ์ machine Instruction์ 1๋1 ๋์๊ด๊ณ์ด๋ค. ํํ์ด ๋ค๋ฅผ ๋ฟ.
์ปดํจํฐ์ ๋ชจ๋ ์ ๋ณด๋ 2์ง์๋ก ํํ๋๋ค.
ISA = Instruction Set Architecture (ABI : Application Binary Interface, Microarchitecture)
ํผํฌ๋จผ์ค์ ๋น๊ต๋ ๋จ์ ๋ง์ ์ผ๋ก ๊ณ์ฐํ ์ ์๋ค. ์ํธ ์ฐ๊ด์ด ์๊ธฐ ๋๋ฌธ. ๋ชจ๋ ๊ณฑํ๊ฑฐ๋ ๊ฐ์ค์น๋ฅผ ํตํด ๊ณ์ฐํด์ค์ผํจ.
์๋ต์๊ฐ : ์ฒ๋ฆฌํ๋๋ฐ ๋ช์ด ๊ฑธ๋ฆผ?
์ฒ๋ฆฌ์จ : ๋จ์ ์๊ฐ๋น ๋ช๋ฒ ์ฒ๋ฆฌํจ?
1์ด์ 10๋ฒ ์ฒ๋ฆฌํ๋ค โ ์๋ต์๊ฐ 0.1์ด, ์ฒ๋ฆฌ์จ 10ํ ํ๋ก์ธ์๋ฅผ ๋น ๋ฅธ๊ฒ์ผ๋ก ๊ต์ฒดํ๋ค โ ์ฒ๋ฆฌ์จ์ ์ค๋ฅด๊ณ ์๋ต์๊ฐ์ ์ค์ด๋ ๋ค ํ๋ก์ธ์์ ๊ฐ์๋ฅผ ๋๋ฆฐ๋ค โ ์ฒ๋ฆฌ์จ์ ์ค๋ฅธ๋ค(์ ์์๊ฐ์ ๋์ผํ์ ์ฒ๋ฆฌ, ๋๋ ์ํ๋๊น), CPU์ ์๋ต์๋๋ ๊ทธ๋๋ก๋ค. ๊ฐ์ CPU๋ฅผ ๊ทธ๋ฅ ๋์๋ฅผ ๋๋ฆฐ๊ฑฐ๋๊น.
์ฑ๋ฅ์ ์๊ฐ์ ์ญ์ด๋ค. ์๊ฐ์ด ์ ๊ฒ๊ฑธ๋ ค์ผ ์ฑ๋ฅ์ด ์ข์ ๊ฒ!
๊ฒฝ๊ณผ์๊ฐ : cputime์ ํฌํจํด ๋ชจ๋ ๊ฑธ๋ฆฐ์๊ฐ์ ๋ค ๋ํ๊ฒ IO๋ OS์ ์ค๋ฒํค๋, idle time๊น์ง ์ ๋ถ
CPU time : ์์ํ๊ฒ CPU์์์๋ง ๊ฑธ๋ฆฐ ์๊ฐ์ ๊ณ์ฐ ํ ๊ฒ. (User + System)CPU time
ํด๋ฝ : ๋ ผ๋ฆฌํ๋ก๋ ๋ฐฐ์ด ๊ทธ ํด๋ฝ ๋ง๋ค. ํด๋ฝ์ด๋ ์ง๋์๋ ์ญ์๋ค.
pico = 10^-12 โ tera = 10^12 nano = 10^-9 โ giga = 10^9
CPU Time = ๋ช๋ฒ์ ์ฌ์ดํด? (CC) * ์ฌ์ดํด๋น ์ผ๋ง์์๊ฐ?(CCT) โ ๋๋ฌด๋ ์๋ช ํ๋ค
๋จ ์ฌ๊ธฐ์ CC๋ CCT๋ ๋ ๋ฆฝ๋ณ์๊ฐ ์๋. CC๊ฐ ์ค๋ฉด CCT๊ฐ ์ค๋ฅด๊ณ CCT๊ฐ ์ค๋ฉด CC๊ฐ ์ค๋ฅด๊ณ ๊ทธ๋ฐ๋ค. ๋ฐ๋ผ์ ๊ทธ ๋์ ์ ์ ํ ํํ์ ์ ์ฐพ๋๊ฒ์ด CPU์ค๊ณ์์ ์ค์ํจ
CC(๋ช๋ฒ์ ์ธ์ดํด?) = sum(์ธ์คํธ๋ญ์ ๋ช๊ฐ? (IC) * ์ธ์คํธ๋ญ์ ๋น ์ฌ์ดํด ๋ช๊ฐ? (CPI))
์ธ์คํธ๋ญ์ ์ด ์คํ๋ ๋ ์ฌ์ดํด์ด ํ์ํ๋๊น ๋ชจ๋ ์ธ์คํธ๋ญ์ ์ ๋ํด ๊ทธ ์ธ์คํธ๋ญ์ ๋ช๊ฐ๊ฐ ํ์ํ๊ณ ๊ทธ ์ธ์คํธ๋ญ์ ์ด ์ฌ์ดํด ๋ช๊ฐ๋ฅผ ์๋ชจํ๋์ง ๊ณ์ฐํด์ ๋ค ๋ํด๋ฒ๋ฆฌ๋ฉด ๊ทธ๊ฒ ์ด ํ์ํ ์ฌ์ดํด์ ๊ฐ์ ์ฆ CC๊ฐ ๋ ๊ฒ.
ํ๊ท CPI = ์ ์ฒด ํ์ํ ์ฌ์ดํด ์๋ฅผ ๋ชจ๋ ์ธ์คํธ๋ญ์ ์ ๊ฐ์๋ก ๋๋๋ฉด ๋๊ฒ ์ง? ์์์ ๊ตฌํ CC๋ฅผ IC๋ก๋๋๋ค.
CPI 1, 2, 3 IC1 2, 1, 2 IC2 4, 1, 1 1โ CC = 12 + 21 + 32 = 10, avgCPI = 10 / (2 + 1 + 2) = 2 2โ CC = 14 + 21 + 31 = 9, avgCPI = 9 / (4 + 1 + 1) = 1.5
๊ฐ์ ISA๋ฅผ ๊ฐ์ง๊ฒ์ ์๊ฐ A : CCT = 250ps, CPI = 2.0 B : CCT = 500ps, CPI = 1.2 A CPUT = IC * CPI * CCT = IC * 2.0 * 250ps = 500ICps B CPUT = IC * CPI * CCT = IC * 1.2 * 500ps = 600ICps ์๊ฐ์ ์ฑ๋ฅ์ ๋ฐ๋น๋กํ๋ค. B์ ์ฑ๋ฅ์ด 1.2๋ฐฐ ์ข๋ค.
2GHz์ clock์ ๊ฐ์ง A๋ 10์ด๊ฐ ๊ฑธ๋ ธ๊ณ ์กฐ๊ธ ๋ ๋น ๋ฅธ clock์ ๊ฐ์ง B์์๋ ๊ฐ์ ํ๋ก๊ทธ๋จ์ด 6์ด๊ฐ ๊ฑธ๋ ธ๋ค. B๊ฐ clock์ด ๋นจ๋ผ์ง ๋์ clock cycle์ ๊ฐ์๊ฐ 1.2๋ฐฐ๊ฐ ๋์๋ค๋ฉด B์ clock ์ ์ผ๋ง์ผ๊น? CPUTA = CC * CCTA = CC / 2GHz = 10sec โ CC = 20GHzsec CPUTB = 1.2CC * CCTB = 1.2CC / CCTB = 6sec โ 20GHzsec * 1.2 / CCTB = 6sec =20GHz / CCTB = 5 โ20GHz = 5CCTB โCCTB = 4GHz
๋ฉํฐํ๋ก์ธ์ : ์ฑ๊ธ ํ๋ก์ธ์์ ์๋ ๊ฐ์ ์ ํ๊ณ๋ฅผ ๋ํํ๊ธฐ์ํด ์ฌ๋ฌ ์ฑ๊ธ ํ๋ก์ธ์๋ฅผ ํ๋๋ก ๋ฌถ์ด์ ์ด์ฉํ๋ค. ๊ทธ์น๋ง ํ๋์ ํ๋ก๊ทธ๋จ์์ ์ฌ๋ฌ๊ฐ์ ์ฝ์ด๋ฅผ ๋์์ ์ฌ์ฉํ๋๋ก ํ๋๊ฑด ์๊ฐ๋ณด๋ค ์ฝ์ง ์๋ค.
๊ธฐํ ํ๊ท : ์ฐ์ ํ๊ท ์ด ๋ง์ ๊ฐ๋ค์ ํ๊ท ์ด๋ฏ, ๊ธฐํ ํ๊ท ์ ๊ณฑ์ ๊ฐ๋ค์ ํ๊ท ์ ๋ํ๋ธ๋ค. ๋ชจ๋ ๊ณฑ์ ๊ฐ๋ค์ ๊ณฑํ๊ณ ๊ฐ์๋งํผ์ผ๋ก ์ ๊ณฑ๊ทผ์ ํด์ ๊ตฌํ๋ค. ์ฑ๋ฅ ๋น๊ต์์ ์ฌ์ฉ๋จ ์ฑ๋ฅ์ ๋จ์ํ ๋ํด์ ์ป์์ ์๋๊ฒ ์๋๋ค.
2
์ธ์คํธ๋ญ์ : ๋ก์ฐ๋ ๋ฒจ. ํ๋ฆ๊ตฌ๋ฌธ์ด ์์. ๋ค๋ฅธ ์ปดํจํฐ๋ ๋ค๋ฅธ ISA๋ฅผ ๊ฐ๋๋ค.
CISC VS RISC : Complex vs Reduced์ธ๋ฐ ๋ง๊ทธ๋๋ก complex๊ฐ ISA๊ฐ ๋ฐฉ๋ํ๋ค. ๊ทผ๋ฐ ๊ทธ๋งํผ ๋ค ์ฌ์ฉํ๋๊ฑด ์๋. ๋ฐ๋ผ์ ๋ฌด์กฐ๊ฑด ํฌ๋ค๊ณ ์ข์๊ฑด ์๋. ์ต์ ํ์๋ ๋ฌธ์ ๊ฐ์๊ณ ..
RISC-V : 32๊ฐ์ ๋ ์ง์คํฐ x0~31์ ์ฌ์ฉํ๋ค. (๊ฐ ๋ ์ง์คํฐ์ ๊ธธ์ด๋ 64๋นํธ์) 64๋นํธ ์ฒด๊ณ์ด๋ฏ๋ก ๋ฉ๋ชจ๋ฆฌ๋ 2^64๋ฅผ ์ฌ์ฉํ ์ ์๋๋ฐ, word์ ๊ธธ์ด๋ 32bit, ์ฆ 2^3๋ฐ์ดํธ์ด๋ค. ๋ฐ๋ผ์ 2^61 word๋ฅผ ์ฌ์ฉํ ์ ์๋ค. ๋๋ธ์๋๋ word * 2 ์ฆ 2^4, 64๋นํธ์ด๋ค.
๋์์ธ ์์น : ๊ฐ๋จํ๊ณ ๊ท์น์ ์ด์ด์ผ ํ๋ค. add dst, src, src ์ฒ๋ผ dst๋ src์ ์์น๊ฐ ์ผ์ ํ๋ฐฉ์์ผ๋ก ๋์์ธ๋์ด์๋ค.
๋ ์ง์คํฐ ์ปจ๋ฒค์ :
x0 = constant 0 x1 = return address x2 = stack pointer x5~7 = temp x8~9 = saved x10~17 = args, returns x18~27 = saved x28~31 = temp
๋์์ธ ์์น : ์์์๋ก ๋น ๋ฅด๋ค. โ ๋ ์ง์คํฐ ํด ํ์๋ ์๋ค ๋ฌด์กฐ๊ฑด ์์๊ฑฐ 32๊ฐ ๋ ์ง์คํฐ
๋ ์ง์คํฐ๊ฐ ์ปค์ง๋ฉด ํต๊ณผํ ๊ฒ์ดํธ๊ฐ ๋ง์์ง๊ณ ๊ฒฐ๊ตญ์ ์๊ฐ์ด ๋ง์ดํ์ํ๊ฒ๋๋๊ฑฐ
byte address : ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ฐ์ดํธ ์ด๋๋ ์ค๋ก ๋ํ๋ธ๋ค. ํ ๋ธ๋ญ์ด ํ ๋ฐ์ดํธ๋ฅผ ๋ํ๋. word๋ 4๋ฐ์ดํธ์ด๋ค โ 32๋นํธ. ๋ฉ๋ชจ๋ฆฌ ์ฒด๊ณ์์ 2^62๊ฐ word๊ฐ ํํ๋ ์ ์์.
์๋์ : big endian ํ์์ฃผ์ โ ์์์ฃผ์๋ก MSB๋ถํฐ LSB๊น์ง, small endian ํ์์ฃผ์ โ ์์์ฃผ์๋ก LSB๋ถํฐ MSB๊น์ง
์ค๋ง์ถค : align, RISC-V์์๋ align์ ์ง์ํ์ง ์๋๋ค. ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณต๊ฐ์ ๋ฐฐ์์ ๋ง์ถฐ์์ ์ฅํ๋๋ก ํ๋๊ฒ์ธ๋ฐ ๊ณต๊ฐ์ ๋ญ๋น๊ฐ ๋ฐ์ํ๋ค. ๋์ ์ง์ ์ฃผ์๋ฅผ ์ฌ์ฉํ๊ธฐ๋ ํ๋ค..
offset
A[12] = h + A[8]; //adrs of A = x22, h = x21
-----------------------------------------------------------------
ld x9, 64(x22) //x22์ฆ A์ ์ฃผ์๋ก๋ถํฐ 64, ์ฆ 8์นธ ๋จ์ด์ง๊ณณ์ ์์๋ฅผ x9์ ์ ์ฅ
add x9, x21, x9 //x9์๋ A[8]๊ฐ์ด ์ ์ฅ๋์ด์๋ค. ์ด๊ฑฐ๋ h๋ฅผ ๋ํด์ x9์ ์ ์ฅ
sd x9, 96(x22) //x9์๋ ๊ณ์ฐ๊ฐ์ด ์ ์ฅ๋์ด์๋ค. A๋ก๋ถํฐ 96, 12์นธ ๋จ์ด์ง๊ณณ์ x9์ ์ ์ฅ
๋ ์ง์คํฐ vs ๋ฉ๋ชจ๋ฆฌ : ๋ ์ง์คํฐ๋ ๋น ๋ฅด๋ค. CPU์ ๋ฐํ์์ผ๋๊น ๋น์ฐํ ๋ ๋น ๋ฅด๋ค. ๋ฐ๋ฉด ๋ฉ๋ชจ๋ฆฌ๋ ์ฌ์ฉํ๋ ค๋ฉด ldํด์ผํ๊ณ sdํด์ผํ๋ instruction์ด ๋ ๋ง์ด ๋ค์ด๊ฐ๊ณ ๊ฒฐ๊ตญ์ ์๋๊ฐ ๋๋ ค์ง๋ค. C์ธ์ด๊ฐ์ ํ์ด๋ ๋ฒจ ๋ญ๊ธฐ์ง์์ register๋ฅผ ๊ตณ์ด ๋ถ์ฌ์ฃผ์ง ์์๋ ์ปดํ์ผ๋ฌ๊ฐ ์์์ ๋ ์ง์คํฐ๋ฅผ ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ๋ ์ง์คํฐ๋ ์ฐ์์ ์ธ ์ฃผ์์ฒด๊ณ๋ฅผ ๊ฐ์ง๊ฒ์ด ์๋๊ธฐ๋๋ฌธ์ ๋ฐฐ์ด์ฒ๋ผ ์ฌ์ฉํ๋ค๊ฑฐ๋ ๊ทธ๋ฐ๊ฑด ๋ถ๊ฐ๋ฅํจ.
immediate : ์์๊ฐ์ ๋ค๋ฃจ๋๊ฒฝ์ฐ ๋ณ์๋ฅผ ์ ์ธํ ํ์ ์์ด ๋ฐ๋ก ๊ฐ์ ธ๋ค ์ธ ์ ์๋๋ก ํด์ค. ๊ทธ๋ฌ๋ instruction์ ๊ธธ์ด๊ฐ word๋จ์์ด๊ธฐ๋๋ฌธ์, word๋จ์ ๋ด์์ ์๋ง์ ์์๋ง ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ ๊ธธ์ด์ ์ ํ์ด ์๊ธด๋ค.
๋ถํธ ํ์ฅ : 2์ง์ ์ฒด๊ณ์์ ์์๋ MSB๊ฐ 1์ด๋ 0์ด๋๋ก ๊ฒฐ์ ์ด ๋๋ค. shift instruction์ ์ด์ฉํด ์ฐ๋ฆฌ๋ 2์ง์๋ฅผ ์ผ์ชฝ ์ค๋ฅธ์ชฝ์ผ๋ก ๋ฐ ์ ์๋๋ฐ, ์ด๋ฐ ์ผ์ ํ ๋ MSB๋ฅผ ์ด๋ป๊ฒ ๋ค๋ค์ฃผ๋๋์ ๋ฐ๋ผ์ ๋ถํธ ์์ฒด๊ฐ ๋ฐ๊ปด๋ฒ๋ฆฐ๋ค. ์ผ๋ฐ์ ์ผ๋ก logical shift๋ฅผ ํด์ ๋น์๋ฆฌ๋ฅผ 0์ผ๋ก ์ฑ์ฐ๊ณ ์ฐ์ธก shift์์๋ง arithmetic shift๋ฅผ ๊ณ ๋ คํด์ฃผ๋ฉด ๋๋ค. MSB๋ฅผ ์ด๋ฆฌ๋ฉด์ ์์ง์ด๋๊ฑฐ. ๋ค์๋งํด์ MSB 0 ์ด์์ผ๋ฉด 0์ผ๋ก, 1์ด์์ผ๋ฉด 1๋ก ์ฑ์ฐ๋๊ฒ. ๊ฐ์ข instruction์์ ์๋ฆฟ์์ ์๋ง๋ immediate์ด๋ค์ด์ค๋ฉด extensionํด์ ์๋ฆฌ๋ฅผ ๋ง์ถฐ์ค์ผ๊ฒ ์ง. ๊ทธ๋ด๋ ์ฌ์ฉ๋๋ค.
instruction format : ์ฐ์ฐ์์ ๋ฐ๋ผ์ instruction์ ํฌ๋งท์ ๋๋ ์ ์๋ค. ๋ชจ๋ ๋ฐ์ด๋๋ฆฌ ์ฝ๋๋ก ๊ตฌํ๋์ด์์ง๋ง, ์ผ์ข ์ ํฌ๋งท์ ์ ํด์ ๊ทธ binary๋ฅผ ์ด๋ป๊ฒ ํด์ํ ๊ฒ์ธ๊ฐ ์ฌ์ง๋ฅผ ์ฃผ๋๊ฒ. ๋ฐฐ์น๊ฐ ๊ต์ฅํ ์ค์ํ๋ค๋ ์ฌ์ค. RISC-V๋ ๊ฐ๋จํจ์ ์ต๊ณ ๋ก ์ฌ๊ธฐ๊ธฐ ๋๋ฌธ์ instruction์ ๊ธธ์ด๋ ๋ฌด์กฐ๊ฑด 32๋นํธ๋ก ๊ณ ์ ๋์ด์๋ค. ํฌ๋งท์ ๊ฐ๋ฅํ ๊ฐ๋จํ๊ณ ๋์ผํ๊ฒ ์ ์งํ๋ ค๊ณ ํ์
stored program : instruction๋ ๋ฐ์ดํฐ์ ๋ค๋ฆ์์ด 2์ง์๋ก ๋ฉ๋ชจ๋ฆฌ์ ํํ๋จ
Logical instruction :
ยซย slli : shift left logical immediate
srli : shift right logical immediate ~ xor : xor ์๊ธฐ์์ ์ ํตํด์ ๊ตฌํด์ง๋ค.
a = 1, b = 2์ผ ๋ a&b = 1 (๋ ๋ค true) a&&b = 0 (๊ฐ์ง ์๋ค) logical ๊ณผ arithmetic์ ์ฐจ์ด
and or xor์ rํฌ๋งท andi ori xori๋ iํฌ๋งท
ํ๋ก์์ ธ : ํจ์๋ ๊ฐ๋ค๊ณ ๋ณด๋ฉด๋๋ค ์ฝ๋์ ์ฌํ์ฉ์ฑ์ ๋๋ ค ์ฝ๋์ ์์ ์ค์ด๊ณ flow๋ฅผ ๊ผฌ์์ค๋ค. ์ํ์๊ฐ์ ๋์ด๋์ง๋ง ์ฌ์ฉํ๋ ๊ณต๊ฐ์ ์ค์ผ ์ ์๊ณ , ์ด๋ฏธ ๊ตฌํ๋์ด์๋๊ฑธ ๊ฐ์ ธ๋ค ์ฐ๊ธฐ๋ง ํ ์ ์๊ธฐ ๋๋ฌธ์ ์ฌ๋ฌ๋ชจ๋ก ์ฅ์ ์ด ๋ง๋ค. ๊ทผ๋ฐ ํ๋ก์์ ๋ ์ ์ด์ ํ๋ฆ์ด ์ฎ๊ฒจ๊ฐ๋๊ฑฐ๋๊น ํ๋ฆ์ธ PC์ ๋ฐ์ดํฐ๊ฐ๋ค์ด์๋ x10~17๋ ์ง์คํฐ ๋ฑ ์ ๊ฒฝ์จ์ค์ผํ๋ ๋ถ๋ถ์ด ๋ง๋ค.
- ํ๋ผ๋ฏธํฐ๋ค์ x10~x17์ ๋ฐฐ์นํด์ค๋ค.
- ์ปจํธ๋กค์ ํ๋ก์์ ธ๋ก ์ฎ๊ธด๋ค. ์ด๋ง์ ์ฆ ํ๋ก๊ทธ๋จ ์นด์ดํฐ์ ํ๋ก์์ ์ ์ฃผ์๊ฐ ์ค๋๋ก ํด์ผํ๋ค๋ ๊ฒ. jal x1 procedure ๋ก ํ ์ ์๋ค.
- ํ๋ก์์ ์์ ๊ณต๊ฐ์ ์ฌ์ฉํ ์๋ ์๋ค. ๋ฐ๋ผ์ ๋ฐฑ์ ์ด ํ์ํ ๋ฐ์ดํฐ๋ค์ stack ์ push ํด์ค์ผํ๋ค. x8~x9, x18~27๊น์ง save๋์ด์ผํ๋ ๋ ์ง์คํฐ๋ค, ํน์ ํ์์ ์์ ๋์๊ฐ์ผํ๋ ๋ฆฌํด์ฃผ์ ๋ฑ.
- ํ๋ก์์ ๊ฐ ์ํฅ์ ๋ผ์น ์ ์๋ ๊ณต๊ฐ์ ์ ๋ฆฌํด์ ์ํฅ ๋ฐ์ง ์๋๋ก ํ์๊ณ , ํ๋ผ๋ฏธํฐ๋ค์ x10~17๋ ์ง์คํฐ๋ฅผ ํตํด ์ ๊ทผ์ด ๊ฐ๋ฅํ๋, ์ด์ ํ๋ก์์ ์์ ์๋ํ ํ์๊ฐ ์ด๋ค์ง๋ฉด ๋๋ค.
- ํ์์ ๊ฒฐ๊ณผ๋ฅผ caller๊ฐ ์ ๊ทผํ ์ ์๋ x10~17์ ์ ์ฅํด์ค๋ค
- ๋ฌด์กฐ๊ฑด์ ์ผ๋ก ๋์๊ฐ๋ค.
jalr : ๋ณดํต sd์ x0๋ฅผ ๋ฃ์ด์ ๋ฌด์กฐ๊ฑด ์ด๋์ผ๋ก ์ฐ์ง๋ง ์ฌ์ค์ ๋ค๋ฅธ๊ฑธ ๋ฃ์ด์ switch๋ฌธ์ผ๋ก๋ ์ธ ์ ์๋ค.
๋๋จ ํ๋ก์์ ธ
long long leaf_example(long long g, h, i, j){
long long f;
f = (g + h) - (i + j);
return f;
}
laef_example :
addi sp, sp, -8 <- sp ๊ณต๊ฐํ๋ณด
sd x20, 0(sp) <- ํ๋ณด๋ sp์ x20์ ์ ์ฅ. x18~27์ saved๋์ด์ผํ๋ค
add x5, x10, x11 <- g + h๋ฅผ x5์ ์ ์ฅ.
add x6, x12, x13 <- i + j๋ฅผ x6์ ์ ์ฅ.
sub x20, x5, x6 <- ๋ ๊ฒฐ๊ณผ๋ฅผ ๋บ๊ฑธ x20์ ์ ์ฅ. ๊ทธ๋ฅ ํ๋ฒ ํด๋ณด๋๋ฏ?
addi x10, x20, 0 <- caller๊ฐ ์ ๊ทผ ๊ฐ๋ฅํ x10~17์ return value์ ์ฅ
ld x20, 0(sp) <- stack์ ๋ฐฑ์
ํ๋ x20๊ฐ ๋ณต์
addi sp, sp, 8 <- garbage collect. ์คํ ๊ณต๊ฐ release
jalr x0, 0(x1) <- ๋ค์ instruction์ผ๋ก ๋ฌด์กฐ๊ฑด ๋ถ๊ธฐ
leaf_example :
addi sp, sp, -8
sd x1, 0(sp)
add x5, x10, x11
add x6, x12, x13
sub x10, x5, x6
ld x1, 0(sp)
addi sp, sp, 8
jalr x0, 0(x1)
์คํ๋ฉ๋ชจ๋ฆฌ : ์คํ์ ๋์๊ณณ์์ ๋ฎ์๊ณณ์ผ๋ก ์ฐฌ๋ค. ์๋ก์ด ์์๋ฅผ ๋ฃ๊ณ ์ถ์ผ๋ฉด sp๋ฅผ ๋นผ๋ผ
๋๋จ์ด ์๋ ํ๋ก์์ ธ
long long fact(long long n){
if(n < 1) return 1;
else return n * fact(n - 1);
}
fact :
addi sp, sp, -16 <- ํ๋ก์์ ธ๊ฐ ๋ฐ๋ณต๋๋ฉด ๋ฆฌํด์ฃผ์๋ ์ธ์๊ฐ์ ์ ์ฅ๋์ด์ผ
sd x1, 8(sp) <- ์คํ 16์๋ฆฌ ๋๋ ค์ 8์๋ฆฌ 8์๋ฆฌ ๋ฆฌํด์ฃผ์๋ ์ธ์๊ฐ ๋จน๋๋ค.
sd x10, 0(sp)
addi x5, x10, -1 <- x10 - 1 0๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์ผ๋ฉด else๋ก ์๋๋ฉด ๊ทธ๋๋ก
bge x5, x0, else
addi x10, x0, 1 <- 1์ ๋ฆฌํดํด์ค๋ค.
addi sp, sp, 16 <- ๋๋ฌ์ผ๋ ์ก์๋จน์๋ ์คํ์ ๊ฑ ๋ ๋ ค๋๋จ.
jalr x0, 0(x1) <- ๋๋๋ฉด ๊ฐ์ผ๋๋๊ณณ์ผ๋ก ๋์๊ฐ๋ค.
else :
addi x10, x10, -1 <- ๊ธฐ์กด x10์ sp์ ์ ์ฅ๋์ด์์ผ๋ ใฑใ
jal x1, fact <- x10 - 1๋ก fact ๋ฅผ ๋ค์ ์คํ ์คํ์ sp์ ๊ฐ์ ์ ์ฅํ๋ ใฑใ
addi x6, x10, 0 <- ๊ธฐ์กด x10์ ๋ณต๊ท์์ผ์ผํ๋ x6์ผ๋ก ์ฎ๊ฒจ์ค๋ค.
ld x10, 0(sp)
ld x1, 8(sp)
addi sp, sp, 16 <- ์ด๋ฒ ๋ผ์ดํ์ฌ์ดํด์ ๋๋จ. sp์ ํ์์๋ 16๋นํธ ์ ๊ฑฐ
mul x10, x10, x6 <- ๊ฒฐ๊ณผ๋ฅผ caller๊ฐ ์ ๊ทผํ ์ ์๋ x10~17์ ๋ฐฐ์นํ๊ณ
jalr x0, 0(x1) <- ๋๋๋ฉด ๋์๊ฐ์ผํ๋ ๊ณณ์ผ๋ก ๋์๊ฐ๋ค.
fact :
4 addi sp, sp, -16
8 sd x1, 8(sp)
12 sd x10, 0(sp)
16 addi x5, x10, -1
20 bge x5, x0, Else //offset 12
24 addi sp, sp, 16
28 jalr x0, 0(x1)
Else :
32 addi x10, x10, -1
36 jal x1, fact //offset -32
40 addi x6, x10, 0
44 ld x10, 0(sp)
48 ld x1, 8(sp)
52 addi sp, sp, 16
56 mul x10, x10, x6
60 jalr x0, 0(x1)
์คํ์ ์์ด๋๊ฑด ์ธ์, ๋ฆฌํด์ฃผ์, ์ ์ฅ๋ ๋ ์ง์คํฐ์ฃผ์, ๋ฐฐ์ด๊ตฌ์กฐ ๋ฑ๋ฑ ์กด๋๋ค์ํจ
์ ์ญ๋ณ์๋ static data์์ญ์, ์ง์ญ๋ณ์๋ stack์์ญ์, ๋์ ํ ๋น๋๊ฒ์ dynamic data์์ญ์ ์ ์ฅ๋๋ค. ์ง์ญ๋ณ์๋ ๋์ ํ ๋น์ ๋ฐํ์์ค์ ๋์ ์ผ๋ก ํ ๋น์ด๋ ์ ์์ด์ ํฌ๊ธฐ๊ฐ ์ ํด์ ธ์์ง ์๋ค. stack์ ์์์ dynamic์ ์๋์์ ์ฌ๋ผ์ค๋ฉฐ ์๋ก ํ์ํ ๊ณต๊ฐ์ ๋๋ ๋จน๋๋ค.
wide immediate : ๋๋ถ๋ถ์ immediate ์์๋ ํด ํ์๊ฐ ์์ง๋ง ๊ฐ๋ ์กด๋ํฐ๊ฒ ํ์ํ๋ค. I format์์ ์ง์ํ๋ ์ต๋ immediate ํฌ๊ธฐ๋ 12๋นํธ๋๊น ์ปค๋ด์ผ -2^11~2^11 -1 ์. ๊ฐ๋์ฉ 32๋นํธ ์์๋ฅผ ์จ์ผํ๋ ์ผ์ด ๋ฐ์ํ ์ ์๋๋ฐ ๊ทธ๋ด๋๋ฅผ ์ํด์ ์์ 20๋นํธ (load upper immeidate)๋ฅผ ์ฌ์ฉํ ์ ์๋๋กํด์ค๋ค.
0x003d0500 โ ์์ 20 = 0x003d0(000) ํ์ 12 = 0x500 lui x19, 0x003d0 โ ์ด๋ ๊ฒ ํ๋ฉด ์์์ ํ์ 12๋นํธ๋ 0์ผ๋ก, ์์ ๋นํธ๋ MSB๋ง์ถฐ์ ํ์ฅํด์ ๋ํด์ค addi x19, 0x500 โ lui์์ ๋ค ์ฒ๋ฆฌํ์ง ๋ชปํ ํ์ 12๋นํธ๋ ์ฒ๋ฆฌ
๋๋ถ๋ถ์ ๊ฐ์ง์น๊ธฐ๋ 12๋นํธ ์์ชฝ์์ ๋๋ผ ์ ์๋ ๊ฐ๊น์ด ๊ฐ์ง์น๊ธฐ์ด๋ค.
immediate * 2๋งํผ์ ์ฃผ์๋ฅผ ๋ํด์ ๋ณด๋ธ๋ค. โ RISC-V๊ฐ ์ง์ ์ฃผ์์ฒด๊ณ๋ฅผ ์ง์ํ๊ธฐ ๋๋ฌธ?
์กฐ๊ฑด๋ถ ๊ฐ์ง์น๊ธฐ : ์ต์ฝ๋์ ๋ ์ง์คํฐ ๋๊ฐ, 12๋นํธ์ ์ด๋ฏธ๋์์ ์ฌ์ฉ. 0๋ฒ์งธ ๋นํธ๋ ์๋ต ๊ฐ๋ฅ. ์ง์ ์ฃผ์๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ. ๋ฐ๋ผ์ ํํ์ ๋์๋๋ ๋นํธ๋ 13์๋ฆฌ โ -2^12-1 ~ 2^12 -2 ๋ก -4096 ~ 4094๋ฐ์ดํธ์ ๋ฒ์(๋ฉ๋ชจ๋ฆฌ๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฐ์ดํธ ์ด๋๋ ์ฑ)๋ฅผ ์ด๋ํ ์ ์์ ์ด๊ฑธ +-2^10 word (4๋ฐ์ดํธ๊ฐ 32๋นํธ 32๋นํธ๊ฐ word)(+-4Kib)๋ก ๋๋ต์ ์ผ๋ก ํํํ ์ ์๋ค.
๋ฌด์กฐ๊ฑด ๊ฐ์ง์น๊ธฐ : ์ต์ฝ๋์ ๋ ์ง์คํฐ ํ๋, 20๋นํธ์ ์ด๋ฏธ๋์ ์ฌ์ฉ. ๋ฐ๋ผ์ +-2^18word ๋ฒ์ (+- 1Mib)
20๋นํธ์ ์ด๋ฏธ๋์ ์ฌ์ฉ โ 0๋ฒ์งธ ๋นํธ๋ ๋ฌด๋ฃ โ 21๊ฐ์ ๊ฐ์ฉ๋นํธ โ -2^21-1 ~ 2^21-2
๋ ๋ค ์ง์์ฃผ์์ฒด๊ณ๋ผ 1๋นํธ๊ฐ ๋จ๋๋ค ๋ฐ๋ผ์ ๊ฐ๊ฐ 13๋นํธ์ 21๋นํธ์ ๋ฒ์๋ฅผ ๊ฐ์ง๋ง ์์๋ฅผ ๊ณ ๋ คํด์ผํจ โ 12, 20 ์๋ ๊ธธ์ด๋ ๋ฐ์ดํธ์
U-format์ ์ด์ฉํ๋ฉด ๋ ๋ฉ๋ฆฌ jumpํ ์ ์๋ค.
๋ง์ผ๋ฉด L1์ผ๋ก ๋ฐ๋ก ๋ณด๋ด(beq)๋ ๋์ ๋ง์ผ๋ฉด L2๋ก ๋ณด๋ด๊ณ ํ๋ฆฌ๋ฉด U-format์ผ๋ก L1์ ๋ณด๋ด๋์์ผ๋ก ๋ ผ๋ฆฌ์ ์ฝ๋๋ฅผ ๋ฐ๊พธ์ด์ฃผ๋ฉด L1์ uformat์ ํ๊ณ ๋ ๋ฉ๋ฆฌ ๊ฐ ์ ์๋ค. (20๋นํธ ์ด๋ฏธ๋์)
jal์ iํฌ๋งท์ด๋ค โ register๋ก๋ถํฐ immediate 12๋นํธ ๋ฒ์๊น์ง ๋ณด๋ผ ์ ์๋ค.
jalr์ด ujํฌ๋งท โ ํ์์น๋ก๋ถํฐ ๋ก๋ถํฐ immediate 20๋นํธ ๋ฒ์๊น์ง ๋ณด๋ผ ์ ์๋ค. SB์ฒ๋ผ ์ง์์ฒด๊ณ ์ด์ฉ
lui๋ uํฌ๋งท โ upper immediate์ ์ด์ฉํ๋๋ฐ ์ฌ์ฉํ๋ค.
jal x1 label : jal์ ์ฃผ์๋ก๋ถํฐ label(immediate)๋งํผ ๋จ์ด์ง ๊ณณ์ผ๋ก jumpํจ๊ณผ ๋์์ x1์๋ ํ์ฌ์ ๋ค์ ์คํ ์์ ์ฃผ์ ์ฆ PC +4๊ฐ ์ ์ฅ๋๋ค ๊ทธ๋์ x1๋์ x0์ ์ฃผ๋ฉด ๋ฆฌํด์ฃผ์๋ฅผ ๋จ๊ธฐ์ง ์๊ณ jump๋ฅผ ํ ์ ์๋๊ฑฐ๊ณ ์ํ๋ค๋ฉด ๋ค๋ฅธ ๋ ์ง์คํฐ๋ฅผ ์ค์ ๋ค๋ฅธ ๋ ์ง์คํฐ์ ๋ฆฌํด ์ฃผ์๋ฅผ ๋จ๊ธธ ์ ๋ ์๋ค.
jalr๋ ๋์ผํ๋ค. ์ ์ด์ jump๋ผ๋๊ฑด flow๊ฐ ์ฎ๊ฒจ๊ฐ๋๊ฑฐ์. jal์ jal์ ์์น์์ 20์๋ฆฌ immediate๋งํผ jumpํ์ง๋ง, jalr์์๋ register+ 12์๋ฆฌ immediate๋งํผ jump๋ฅผ ํ๋ค. ๋๋ค rd์๋ฆฌ์ ๋์์ฌ ์ฃผ์๋ฅผ ์ง์ด๋ฃ๋๋ฐ jalr๊ฐ์๊ฒฝ์ฐ๋ ๋ณดํต ๋์์ฌ๋, ์ฆ ๊ธฐ์ค์ PC๋ฅผ ํตํด ๋์์ค๋๊ฒฝ์ฐ, ๋ค์ ์ด์ชฝ์ผ๋ก ์ฌ ํ์๊ฐ ์๊ธฐ๋๋ฌธ์ constant์ธ x0์ ๋ฃ์ด์ ์ฃผ์ ์ ์ฅ์์ด ๋์์ค๋๊ฒ์ด๋ค. ๋ง์ฝ์ ๋ค๋ฅธ ๋ ์ง์คํฐ๋ฅผ ๋ฃ๊ณ ์ ํ๋ค๋ฉด ๊ทธ ๋ ์ง์คํฐ์๋ ๋์์ฌ ์ฃผ์๊ฐ ๋ค์ด๊ฐ๊ฑฐ๊ณ , ๊ทธ๊ฑด switch๋ฌธ ๊ฐ์๋ฐ์ ์ฐ์ธ๋ค.
MIPS = Million Instructions Per Second = IC / (CPUT * 10^6)
ISA = Instruction Set Architecture ๋ช ๋ น์ด ์งํฉ์ผ๋ก Intel CPU์ AMD CPU์ ๊ฒฝ์ฐ ISA๋ ๊ฐ์ง๋ง ๋ง์ดํฌ๋ก ์ํคํ ์ณ๊ฐ ๋ค๋ฅด๋ค๊ณ ๋ณผ ์ ์๋ค. ๋์ผํ ISA๋ฅผ ๊ฐ๋๋ค๋๊ฒ์ ๊ทธ ๋ฐ๋จ์ธ ๋ง์ดํฌ๋ก ์ํคํ ์ณ๊ฐ ์ด๋ป๊ฒ ๊ตฌํ๋๋์ง๋ ๋ชฐ๋ผ๋, ๊ฐ์ ๋ช ๋ น์ด ์ ์ผ๋ก ๋์ํ๋ค๋ ์๋ฏธ์ด๋ฏ๋ก binary compatibleํ๋ค๊ณ ๋ณผ ์ ์๋ค.
addressing mode
- immediate addressing : operand ํ๋๋ reg, ํ๋๋ imm โ immediate์ผ๋ก๋ถํฐ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ด
- register addressing : operand ๋ ๋ค reg โ ๋ ์ง์คํฐ๋ก๋ถํฐ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ด
- base addressing : ํ๋๋ reg, ํ๋๋ ๋ฉ๋ชจ๋ฆฌ (reg + imm) โ ๋ฉ๋ชจ๋ฆฌ๋ก๋ถํฐ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ด immediate์ด offset
- pc relative addressing : ํ๋๋ reg, ํ๋๋ PC (reg + imm) โ PC๋ก๋ถํฐ ๋ถ๊ธฐํจ immediate์ด offset
RISC-V๋ byte ordering์ด๋ค โ ํ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ญ์ด ํ ๋ฐ์ดํธ๋ฅผ ๊ฐ๋๋ค align์ ์ง์ํ๋ค โ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ word ์ฌ์ด์ฆ์ ๋ง์ถฐ์ ํ๋ค (RISC-V๋ align์ ์ง์ํ์ง ์๋๋ค. ๋์ ์ง์์ฃผ์๋ฅผ ์ด์ฉ. ์ฐธ๊ณ ๋ก RISC-V์ word์ฌ์ด์ฆ๋ 4๋ฐ์ดํธ 32๋นํธ)
3
REVIEW ๊ฐํ instruction์ ๊ทธ ํ๋์จ์ด ๊ตฌํ์ด ๋ ๋ณต์กํด์ง๊ณ ๊ทธ๋ก์ธํด ์๋๋ฅผ ๋๋ฆฌ๊ฒ๋ง๋ ๋ค Assembly์ฝ๋ฉ์ ์ปดํ์ผ๋ฌ๊ฐ ๋ ์ํ๊ณ ์ค๋ฅ๋ ๋ ์์ก๋๋ค. binary compatibility๋ฅผ ์ง์ํ๋ ค๋ฉด ISA๊ฐ ๊ฐ๊ฑฐ๋ ํฌํจํ๊ณ ์์ด์ผํ๋ค. word๋ ๋ฉ๋ชจ๋ฆฌ 4๋ธ๋ญ์ฉ ์ฐจ์ด๋๋ค. ๋ฉ๋ชจ๋ฆฌ ํ๋ธ๋ญ์ 1๋ฐ์ดํธ(8๋นํธ), word๋ 4๋ฐ์ดํธ(32๋นํธ)
arithmetic ์ฐ์ฐ์์ ์ฐ๋ฆฌ๋ signed์ unsigned๋ฅผ ๊ตฌ๋ถํด HW๋ฅผ ์ค๊ณํ์ง ์์๋ ๋๋ค. ๊ทธ๋ ๊ฒ๋ ๋ฌผ๋ก ํ ์ ์์ง๋ง ์์ ๋งํ๋ฏ ํ๋์จ์ด์ ๋ณต์กํจ์ ์๋๋ฅผ ์ ํ์ํจ๋ค. ๋ฐ๋ผ์ ๋ ๋ค ๊ณ์ฐ์ด ๋๊ฒ ํ๊ณ ๋ฐ์ํ๋ ๋ฌธ์ , ์๋ฅผ๋ค์ด ์ค๋ฒํ๋ก์ฐ ๊ฐ์ ๋ฌธ์ ๋ค์ SW๋จ์์ ํด๊ฒฐํ ์ ์๋๋ก ํด์ค๋ค. HW์ SW์ฌ์ด์ ๊ท ํ์ ๋ง์ถฐ์ ํด๊ฒฐํ๋๊ฒ
๋ง์ ์ฐ์ฐ์์์ overflow๋ ์+์ = ์ ์+์ = ์ ์ด ๋๊ฐ์ง๋ฅผ ๋งํ๋ค. unsigned์์ carry๋นํธ๋ก์ธํด ๋ฒ์๋ฅผ ๋ฒ์ด๋๋๊ฒ์ overflow๋ผ๊ณ ํ์ง ์๋๋ค.
์์๋ฅผ ๋นผ๋ ๊ฒ๊ณผ ์์๋ฅผ ๋ํ๋๊ฒ์ ๋์ผํ ํจ๊ณผ๋ฅผ ๋ธ๋ค. ์ฌ์ค์ ๋บ์ ๋ ๋ง์ ๊ณผ ๊ฐ์๊ฒ. ๋ฐ๋ผ์ ๋บ์ ์์์ overflow๋ ๋ง์ ์ผ๋ก ๋ฐ๊ฟ์ ์๊ฐํด์ฃผ๋ฉด ๊ฐ๋จํ๊ฒ ํด๊ฒฐ๋๋ค.
๊ณฑ์ ์๊ณ ๋ฆฌ์ฆ : ๊ณฑ์ ์ multiplier์ ๊ฐ์๋ฆฌ์ multiplicand๋ฅผ ๊ณฑํ ๋ถ๋ถ ๊ณฑ๋ค์ ๋ชจ๋ ๋ํด์ ํด๊ฒฐํ ์ ์๋ค. ์ด๋ฅผ HW์ ์ผ๋ก ํด๊ฒฐํ๊ธฐ ์ํด์๋ multiplier๋ ๋งค ๋ฐ๋ณต๋ง๋ค ์ค๋ฅธ์ชฝ์ผ๋ก, multiplicand๋ ์ผ์ชฝ์ผ๋ก shiftํด์ฃผ๋ฉด ํด๊ฒฐ๋๋ค.
multiplier์ LSB์ multiplicand๋ฅผ ๊ณฑํด์ ๋ถ๋ถ๊ณฑ์ ์ป์ด๋ด๋๋ฐ, ๊ฐ ์ฐ์ฐ์ด ๋ฐ๋ณต๋ ์๋ก ์ฐ์ฐ์ ๊ฒฐ๊ณผ๊ฐ์ 2๋ฐฐ๊ฐ๋์ด์ผํ๋ค (์ฐ์ฐ์ ๊ฒฐ๊ณผ๊ฐ์ด 2๋ฐฐ๊ฐ๋๋ค โ ์ฐ์ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ผ์ชฝ์ผ๋ก shiftํด์ค์ผํ๋ค) โ multiplicand๋ฅผ left shift ๋งค๋ฒ ๊ณฑํด์ง๋ multiplier์ LSB๋ฅผ ์ํด์ multiplier๋ฅผ right shiftํ๋ค. โ multiplier ๋ฅผ right shift
๊ณฑ์ ์ ๊ฒฐ๊ณผ์ ๊ธธ์ด๋ operand length์ ํฉ๊ณผ ๊ฐ๋ค. 64๋นํธ ์ ๋๊ฐ๋ฅผ ๊ณฑํ์ ๋ ์ต๋ ๊ธธ์ด๋ 128์ด๋๋ค. ๊ทผ๋ฐ ์๋ฒฝํ๊ทธ๋ฐ๊ฑด ์๋๊ณ carry ๋ฐ์ ์ํ๋ฉด 127์์ ๋ฉ์ถ์๋์๋ค. ์ต์ ์ ๊ฒฝ์ฐ๊ฐ 128๋นํธ์ธ๋ฐ ์ต์ ์ ๊ฒฝ์ฐ์ ๋ง์ถฐ์ค์ผํ๋ค.
multiply flow chart multiplier์ LSB๊ฐ 0์ด๋ฉด ๊ทธ๋ฅ ์ง๋๊ฐ๊ณ 1์ด๋ฉด multiplicand๋ฅผ ๊ฒฐ๊ณผ๊ฐ์ด๋ ๋ํด์ค๋ค. multiplicand๋ ์ผ์ชฝ์ผ๋ก 1๋นํธ, multiplier๋ ์ค๋ฅธ์ชฝ์ผ๋ก 1๋นํธ์ฉ shift ํด์ค๋ค. ๋ฐ๋ณต์ 64 ๋ฒ ํ๋ค๋ฉด ์ฐ์ฐ์ด ์๋ฃ๋๊ฒ. ๊ทธ๋ ์ง ์๋ค๋ฉด ๋ฐ๋ณตํ๋ค.
์ด๊ธฐ ๋ง์ ํ๋ก : multiplicand, multiplier, product ๋ ์ง์คํฐ๋ฅผ ์ฌ์ฉํ๋๋ฐ, multiplicand๋ ์ผ์ชฝ์ผ๋ก 64๋ฒ shift ํด์ผํ๊ณ product๋ 64๋นํธ ์ ๋๊ฐ์ ๊ณฑ์ ๊ฐ์ ์ ์ฅํด์ผํ๋ฏ๋ก 128๋นํธ์ ํฌ๊ธฐ๋ฅผ ๊ฐ์ ธ์ผํ๋ค. multiplier๋ ์ค๋ฅธ์ชฝ์ผ๋ก shiftํ๊ธฐ๋งํ๋๊น 128์ผํ์๋ ์๋ค. ๋ง์ ๊ธฐ๋ ์ต๋ 128๋นํธ๊น์ง ๋ํด์ผํ๋ฏ๋ก 128๋นํธ์ฌ์ผํจ.
ex) 0010(multiplicand) * 0011(multiplier) ๋ถ๋ถ๊ณฑ : 0011, 0000 0010 = 1 * 0000 0010 = 0000 0010 ์ํํธ : 0001, 0000 0100 โโโโโโโโโโโโโโโโโโโโโโโโ- ๋ถ๋ถ๊ณฑ : 0001, 0000 0100 = 1 * 0000 0100 = 0000 0010 + 0000 0100 = 0000 0110 ์ํํธ : 0000, 0000 1000 โโโโโโโโโโโโโโโโโโโโโโโโ- ๋ถ๋ถ๊ณฑ : 0000, 0000 1000 = 0 * 0000 1000 = 0000 0110 + 0000 0000 = 0000 0110 ์ํํธ : 0000, 0001 0000 โโโโโโโโโโโโโโโโโโโโโโโโ- ๋ถ๋ถ๊ณฑ : 0000, 0001 0000 = 0 * 0001 0000 = 0000 0110 + 0000 0000 = 0000 0110 ์ํํธ : 0000, 0010 0000 โโโโโโโโโโโโโโโโโโโโโโโโ- 4๋ฒ ๋ฐ๋ณต : multiplier ์ bit ์ ๋งํผ ์ฐ์ฐ ํ ์ข ๋ฃ
๊ฐ์ ๋ ๋ฒ์ ์ ๋ง์ ํ๋ก : multiplicand๋ ์ด์งํผ ์์ง์ฌ๋ด์ผ ๋ค์ 0๋ง ์ฃผ๋ ์ฃผ๋ ๋ฌ๊ณ ๋์ค๋๋ฐ, ํฐ ์๋ฏธ ์์ผ๋๊น ๊ทธ๋ฌ์ง๋ง๊ณ ๊ฑ ํฉํ ๋ product๋ฅผ ์ค๋ฅธ์ชฝ์ผ๋ก shift์์ผ์ ๋ํ๋ ์์น๋ฅผ ๋ฐ๊ฟ์ฃผ์. multiplicand๋ ๊ณ ์ ์ํค๊ณ ์ฐ์ฐํ ๋๋ง๋ค ๊ฒฐ๊ณผ์ธ product๋ฅผ ์ค๋ฅธ์ชฝ์ผ๋ก ๋ฐ์ด์ค๋ค. multiplier๋ ์ด์งํผ ์ค๋ฅธ์ชฝ์ผ๋ก ๋ฐ๋ ค์ผํ๋๊น product์ ์ต์ข ํฌ๊ธฐ์ธ 128๋นํธ์ multiplier ์ด๊ธฐํฌ๊ธฐ 64๋นํธ, ๊ฒฐ๊ณผ๋ ์ด๊ธฐ์ 64๋นํธ๋ง ๋์ค๋๊น ํ๋นํ๋ค ํ์๋ฆฌ์ฉ ๋ฐ์ด์ฃผ๋ฉด์ ํ์
๋ ๋น ๋ฅธ ๋ฒ์ : ALU๋ฅผ ์กด๋๋ง์ด์จ์ ํ๋ฒ์ ๊ณ์ฐ์๋๋ฆฐ๋ค๋ฉด? ๋ค์์ ์์์ ๋ชจ๋ ๊ณ์ฐํ๋ฉด์ ๋ท๋นํธ ์๋นํธ ๋นผ๋ด๊ณ ์ต์ข ์ ์ผ๋ก ์ค๊ฐ ๋นํธ๊น์ง ๋นผ๋ด๋ฉด ๊ทธ๊ฒ ๊ฒฐ๊ตญ์ ๊ณฑ์ ์ฐ์ฐ ์ํํ๊ฑฐ๋ ๊ฐ๋ค. 32 + 16 + 8 + โฆ + 1๊ฐ ํด์ ์ด 63๊ฐ์ ALU๋ฅผ ๋์ํด์ 128๋นํธ๋ฅผ ๊ณ์ฐํด๋ผ ์ ์๊ณ , 6์ ๊น์ด๋ฅผ ๊ฐ๊ธฐ ๋๋ฌธ์, ์๊ฐ์ ์ ๊ฒ๋จน๋๋ค. ์ฌ๊ธฐ์ ํ์ดํ๋ผ์ธ์ ํตํด์ ๋ ๋นจ๋ผ์ง ์๋ ์๋ค.
๊ณฑ์ instruction : 64๋นํธ์ ๊ณฑ์ ์ 128๋นํธ์ ๊ฒฐ๊ณผ๋ฅผ ๋์ถํ๋ค. 4๊ฐ์ง์ instruction์ด ์๋๋ฐ, ๋ณดํต ์ฐ๋ฆฌ๊ฐ ๊ณ์ฐํ๋๊ฑด 64๋นํธ๋งํด๋ ์กด๋๊ฒ ํฐ ์ซ์๊ธฐ๋๋ฌธ์ ํ์ 64๋นํธ๋ง ์๊ฐ์ ํด์ค๋ ๋๋ค. ๊ทธ๋์ ๋ค๋ฅธ ISA๋ค๊ณผ ๋ฌ๋ฆฌ RICS-V์์๋ ๊ณฑ์ ๋ Rํฌ๋งท์ผ๋ก ๋ํ๋ผ์์๋ค ๊ต์ฅํ ์์ธ์ ์ธ๊ฒ.
mul : ๊ณฑ์ ์ฐ์ฐ ๊ฒฐ๊ณผ 128๋นํธ์ ํ์ 64๋นํธ๋ง์ ๋ฐํํด์ค๋ค mulh : ๊ณฑ์ ์ฐ์ฐ ๊ฒฐ๊ณผ ์์ 64๋นํธ๋ฅผ ๋ฐํํด์ฃผ๋๋ฐ, ์ด๋ ๋ ๋ค signed ์ฐ์ฐํ์ ๊ฒฝ์ฐ, mulhu : mulh๋ ๊ฐ์๋ฐ ๋ ๋ค unsigned์์๊ฒฝ์ฐ mulhsu : mulh๋ ๊ฐ์๋ฐ ํ๋๋ signed, ํ๋๋ unsigned์์ ๊ฒฝ์ฐ๋ค
mul๋ง์ผ๋ก ๊ฐ์ ํํํ๊ณ ์ถ์๋ฐ ํน์๋ผ๋ ๋ฒ์๋ฅผ ๋ฒ์ด๋ฌ๋ค๋ฉด? โ ๋ง์ฝ mul๋ก ํํํ ์ ์๋ ๋ฒ์๋ฅผ ๋์ด๊ฐ๋ค๋ฉด mulh๊ฐ์ด ์์๊ฒ์ด๋ค. ๋๊ธฐ์ง ์์๋ค๋ฉด mul์ MSB๊ฐ์ผ๋ก sign extension๋ ๊ฐ์ด mulh์ ๋ค์ด๊ฐ๊ฒ ์ง๋ง, ํน์๋ผ๋ ๊ทธ๋ ์ง ์๋ค๋๊ฑด mul๋ก ํํ์ ๋ค ํ์ง ๋ชปํ๋(overflow)๊ฐ์ด ๊ณ์ฐ๋์๋ค๋ ์๋ฏธ์. SW์ ์ผ๋ก ์ด๋ฅผ ์์์ ์ฒ๋ฆฌํด์ค๋ค. ๊ฑฑ์ ํ ํ์๋ ์
DIVISOR ์๋์ต๋๋ค!~~
C โ RISC-V Instruction Session
PDF ์์ 1
long long leaf_example(long long g, h, i, j){
long long f;
f = (g + h) - (i + j);
result f;
}
leaf_example :
add x5, x10, x11
add x6, x12, x13
sub x10, x5, x6
jalr x0, 0(x1)
return value๊ฐ ์ ์ฅ๋ x10์ ๊ทธ๋ฅ ์ง๋นต์ผ๋ก ๊ฐ์ ์ ์ฅํ๋ ๋ฐฉ์์ผ๋ก ํ๋ฉด ์ด๋ ๊ฒ ๊ฐ๋จํ๊ฒ ๋ ๊ฒ.
leaf_example :
addi sp, sp, -8
sd x20, 0(sp)
add x5, x10, x11
add x6, x12, x13
addi x10, x20, 0
ld x20, 0(sp)
addi sp, sp, 8
jalr x0, 0(x1)
๊ตณ์ด x20์ฒ๋ผ save๋์ด์ผํ๋ register๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ๋๋ต ์ด๋ฐ ๊ผด์ด ๋๋ค.
PDF ์์ 2
long long fact (long long n){
if(n < 1) return 1;
else return n * fact(n - 1);
}
fact :
addi sp, sp, -16
sd x1, 8(sp)
sd x10, 0(sp)
addi x5, x10, -1
bge x5, x0, L1
addi x10, x0, 1
addi sp, sp, 16
jalr x0, 0(x1)
L1 :
addi x10, x10, -1 //recursive call์ ์ํ ์ argument n-1
jal x1, fact //recursive call
addi x6, x10, 0 //x10์ ์๋ ๊ฐ ๋๋ ค๋๊ธฐ ์ ์ ๋ฐํ๊ฐ ๋ฐฑ์
ld x10 0(sp) //์ฌ๊ท๊ฐ ๋๋์ผ ๋ฐํ๋๋๊น ์ด์์ ์์ ์ด๋ฒ์งธ ๋ฐฑ์
๋ ๊ฐ ๋ณต๊ตฌ๋๋๊ฑฐ
ld x1 8(sp)
addi sp, sp, 16
mul x10, x10, x6
jalr x0, 0(x1)
๊ณผ์ 1
for ( i = 1; i <= 100; i++){
sum += i;
}
Loop :
addi x7, x6, -100 //x7์ i - 100์ ์ ์ฅํด๋๋ค.
blt x0, x7, Exit //(i <= 100) => (i-100 <= 0) => !(i-100 > 0) => ! (0 < i-100)
add x5, x5, x6
addi x6, x6, 1
beq x0, x0, Loop
Exit :
๋ด ์ ๋ต
Loop :
addi x7, x0, 100 //x7์ 100์ ์ ์ฅํด๋๋ค.
blt x7, x6, Exit //(i <= 100) => !(i > 100) => !(100 < i)
add x5, x5, x6
addi x6, x6, 1
beq x0, x0, Loop
Exit :
์ฌ์ฉ
๊ณผ์ 2
int fib(int n){
if(n == 0) return 0;
if(n == 1) return 1;
return fib(n - 1) * fib(n - 2);
}
๋ด ์ ๋ต
fib :
addi sp, sp, -32 //ํ์ฌ ๋ฐ๋ณต์ด n๋ฒ์งธ๋ผ๋ฉด n-1๋ฒ์งธ์ ์ ๋ณด ๋ฐฑ์
sd x1, 24(sp)
sd x10, 16(sp)
sd x18, 8(sp)
sd x19, 0(sp)
bne x10, x0, L1
addi sp, sp, 32
jalr x0, 0(x1)
L1 :
addi x5, x10, -1
bne x5, x0, L2
addi sp, sp, 32
jalr x0, 0(x1)
L2 :
addi x10, x10, -1 //x10์์ 1 ๋บ ๊ฐ์ ์ธ์๋ก ์ค ์ฌ๊ท
jal x1, fib
addi x18, x10, 0 //๊ฒฐ๊ณผ๋ฅผ saved ๋ ์ง์คํฐ์ ์ ์ฅ
ld x10, 16(sp) //x10์ด ๋ณ๊ฒฝ๋์์ผ๋ฏ๋ก ์คํ์์ load
addi x10, x10, -2 //x10์์ 2 ๋บ ๊ฐ์ ์ธ์๋ก ์ค ์ฌ๊ท
jal x1, fib
addi x19, x10, 0 //๊ฒฐ๊ณผ๋ฅผ saved ๋ ์ง์คํฐ์ ์ ์ฅ
add x10, x18, x19 //๋ฆฌํด์ ์ํด x10์ saved์ ์ ์ฅํ ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ํด์ caller์๊ฒ ์ ๋ฌ
ld x19, 0(sp) //recursion์ด ๋๋๋ฉด ์ด์ ์ ์ ์ฅํ ๊ฐ๋ค์ ๋๋๋ฆฐ๋ค.
ld x18, 8(sp)
ld x1, 24(sp)
addi sp, sp, 32 //stackํด์
jalr x0, 0(x1) //jump
Comments