์ด ๋ฌธ์ ๋ ์ธ๋ผ์ธ ์ด์ ๋ธ๋ฆฌ์ ์์ ํ๋ฅผ ์ถ์ ํฉ๋๋ค. ํ์ฌ ๊ธฐ๋ฅ์ RFC ํ๋ก์ธ์ค๋ฅผ ๊ฑฐ์น์ง ์์์ผ๋ฉฐ ์๋ง๋ ์์ ํ ์ ์ ์ํํด์ผ ํ ๊ฒ์ ๋๋ค.
์์ ์ ์ธ ์ฝ๋์์ ์ธ๋ผ์ธ ์ด์ ๋ธ๋ฆฌ์ ํ์ ํธํ์ฑ์ ๋ณด์ฅํ๋ ๋ฐ ์ด๋ ค์์ด ์์ต๋๊น?
@main-- https://github.com/rust-lang/rfcs/pull/1471#issuecomment -173982852์ ํ๋ฅญํ ์๊ฒฌ์ด ์์ต๋๋ค. ๋ด๊ฐ ํ์์ ์ํด ์ฌ๊ธฐ์์ ์ฌํํ๊ณ ์์ต๋๋ค.
์ ๋ชจ๋ ์ด๋ฆฐ ๋ฒ๊ทธ ๋ฐ ๋ถ์์ ์ฑ ์ฃผ๋ณ ์ ASM์ ()! (๊ฑฐ๊ธฐ์ ๋ง์ , ์ ๋ง์ด ์์ ํ๋ฅผ์ํ ์ค๋น๊ฐ ์๊ฐํ์ง ์์ต๋๋ค) - ๋๋ ๋ น ์์ ์ ์ธ ์ธ๋ผ์ธ ์ด์ ๋ธ๋ฆฌ๋ฅผ ์ฌ๋ ํ์์๋ ๋ถ๊ตฌํ๊ณ .
์ฐ๋ฆฌ๋ ๋ํ ์ค๋๋ ์ asm!()์ด ์ ๋ง ์ต๊ณ ์ ์๋ฃจ์ ์ธ์ง ๋๋ RFC #129 ๋๋ D ์ ๋ผ์ธ์ ๋ฐ๋ฅด๋ ๊ฒ์ด ๋ ๋์์ง ๋ ผ์ํด์ผ ํฉ๋๋ค. ์ฌ๊ธฐ์ ๊ณ ๋ คํด์ผ ํ ํ ๊ฐ์ง ์ค์ํ ์ ์ asm()์ด gcc์ ๋์ผํ ์ ์ฝ ์กฐ๊ฑด ์งํฉ์ ์ง์ํ์ง ์๋๋ค๋ ๊ฒ์ ๋๋ค. ๋ฐ๋ผ์ ๋ค์ ์ค ํ๋๋ฅผ ์ํํ ์ ์์ต๋๋ค.
- LLVM ๋์์ ๊ณ ์ํ๊ณ ์ด์ ๋ํ ๋ฌธ์๋ฅผ ์์ฑํ์ญ์์ค(์ฐพ์ ์ ์์๊ธฐ ๋๋ฌธ์). Rustc์ ๋ณต์ก์ฑ์ ํผํ๊ธฐ ๋๋ฌธ์ ์ข์ต๋๋ค. C/C++์์ ์จ ํ๋ก๊ทธ๋๋จธ๋ฅผ ํผ๋์ค๋ฝ๊ฒ ํ๊ณ ์ผ๋ถ ์ ์ฝ ์กฐ๊ฑด์ Rust ์ฝ๋์์ ์๋ฎฌ๋ ์ดํธํ๊ธฐ ์ด๋ ค์ธ ์ ์๊ธฐ ๋๋ฌธ์ ์ข์ง ์์ต๋๋ค.
- gcc๋ฅผ ์๋ฎฌ๋ ์ดํธ ํ๊ณ ๋ฌธ์์ ๋งํฌํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค. ๋ง์ ํ๋ก๊ทธ๋๋จธ๊ฐ ์ด๋ฏธ ์ด๊ฒ์ ์๊ณ ์๊ณ ์ฝ๊ฐ์ ์์ ์ผ๋ก ๋ณต์ฌํ์ฌ ๋ถ์ฌ๋ฃ์ ์ ์๋ ์์ ๊ฐ ๋ง๊ธฐ ๋๋ฌธ์ ์ข์ต๋๋ค. ์ปดํ์ผ๋ฌ์ ๋ํ ์ค์ํ์ง ์์ ํ์ฅ์ด๊ธฐ ๋๋ฌธ์ ์ข์ง ์์ต๋๋ค.
- ๋ค๋ฅธ ์ผ์ ํ์ญ์์ค(D๊ฐ ํ๋ ๊ฒ๊ณผ ๊ฐ์ด): ์ฑ๊ณผ๊ฐ ์์ ์๋ ์๊ณ ์์ ์๋ ์๋ ๋ง์ ์ผ. ์ฌ๋ฐ๋ฅด๊ฒ ์ํ๋๋ฉด ์ธ์ฒด ๊ณตํ ์ธก๋ฉด์์ gcc ์คํ์ผ๋ณด๋ค ํจ์ฌ ์ฐ์ํ ์ ์์ผ๋ฉฐ ๋ถํฌ๋ช ํ ์ผ๋ฃฉ๋ณด๋ค ์ธ์ด ๋ฐ ์ปดํ์ผ๋ฌ์ ๋ ์ ํตํฉ๋ ์ ์์ต๋๋ค. .
๋ง์ง๋ง์ผ๋ก ๊ณ ๋ คํด์ผ ํ ๋ ๋ค๋ฅธ ์ฌํญ์ ํ์ฌ ๋์์ธ์์ ์ธ๋ผ์ธ asm์ ์๋นํ ์์กดํ๊ฑฐ๋ ์ธ๋ผ์ธ asm์ด ์ฌ๋ฐ๋ฅด๊ฒ ์ํ๋๋ #1201 ์ ๋๋ค.
๊ฐ์ธ์ ์ผ๋ก MSVC x64์์ Microsoft๊ฐ ์ํํ ์์ ์ ์ํํ๋ ๊ฒ์ด ๋ ๋ซ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ฐ asm ๋ช ๋ น์ ๋ํด (๊ฑฐ์) ํฌ๊ด์ ์ธ ๋ด์ฅ ํจ์ ์ธํธ๋ฅผ ์ ์ํ๊ณ ํด๋น ๋ด์ฅ ํจ์๋ฅผ ํตํด์๋ง "์ธ๋ผ์ธ asm"์ ์ํํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์ธ๋ผ์ธ asm์ ๋๋ฌ์ผ ์ฝ๋๋ฅผ ์ต์ ํํ๊ธฐ๊ฐ ๋งค์ฐ ์ด๋ ต์ต๋๋ค. ์ด๋ ์ธ๋ผ์ธ asm์ ๋ง์ ์ฌ์ฉ์ด ์ฑ๋ฅ ์ต์ ํ๋ฅผ ์ํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์์ด๋ฌ๋ํฉ๋๋ค.
๋ณธ์ง์ ๊ธฐ๋ฐ ์ ๊ทผ ๋ฐฉ์์ ํ ๊ฐ์ง ์ฅ์ ์ ๊ทธ๊ฒ์ด ์ ๋ถ ์๋๋ฉด ์ ๋ฌด์ผ ํ์๊ฐ ์๋ค๋ ๊ฒ์
๋๋ค. ๊ฐ์ฅ ํ์ํ ๋ด์ฅ ํจ์๋ฅผ ๋จผ์ ์ ์ํ๊ณ ์ ์ง์ ์ผ๋ก ์ค์ ์ ๊ตฌ์ถํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ์ํธํ์ ๊ฒฝ์ฐ _addcarry_u64
, _addcarry_u32
์์ต๋๋ค. ๋ณธ์ง์ ์ธ ์์
์ ์ํํ๋ ์์
์ ์ด๋ฏธ ์ฒ ์ ํ๊ฒ ์๋ฃ๋ ๊ฒ์ผ๋ก ๋ณด์
๋๋ค: https://github.com/huonw/llvmint.
๋ํ ๋ด์ฅ ํจ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ํจ์ฌ ๋ ํธ๋ฆฌํ๊ธฐ ๋๋ฌธ์(C ๋ฐ C++์์ ์ฌ์ฉํ ๊ฒฝํ์ ๊ธฐ๋ฐ์ผ๋ก) ๊ถ๊ทน์ ์ผ๋ก ์ธ๋ผ์ธ asm์ ์ง์ํ๊ธฐ๋ก ๊ฒฐ์ ํ ๊ฒฝ์ฐ์๋ ๋ด์ฅ ํจ์๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ฐ๋ฆฌ๊ฐ ์ด๋๊น์ง ๋๋ฌํ๋์ง๋ ์๋ชป๋ ์ํ์ด ์ ํ ์๋ ๊ฒ์ฒ๋ผ ๋ณด์ ๋๋ค.
๋ด์ฅ ํจ์๋ ์ข์ง๋ง asm!
๋ ๋ช
๋ น์ด๋ฅผ ์ฝ์
ํ๋ ๊ฒ ์ด์์ ์ฉ๋๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด, probe
์์์์ ELF ๋ฉ๋ชจ๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ์ฐธ์กฐํ์ญ์์ค.
https://github.com/cuviper/rust-libprobe/blob/master/src/platform/systemtap.rs
๊ทธ๋ฐ ์ข ๋ฅ์ ํด์ปค๊ฐ ๋๋ฌผ์ง ์์๊น ์๊ฐํ์ง๋ง ์ฌ์ ํ ์ง์ํ๋ ๋ฐ ์ ์ฉํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
@briansmith
์ธ๋ผ์ธ asm์ ์์ฒด ๋ ์ง์คํฐ/์คํ ํ ๋น(์: ๋ค์ดํค๋ ํจ์)์ ์ํํ๋ ค๋ ์ฝ๋์๋ ์ ์ฉํฉ๋๋ค.
@briansmith ์, ๊ฐ๋ฅํ ๊ฒฝ์ฐ ๋ด์ฅ ๊ธฐ๋ฅ์ ์ฌ์ฉํด์ผ ํ๋ ๋ช ๊ฐ์ง ํ๋ฅญํ ์ด์ ์ ๋๋ค. ๊ทธ๋ฌ๋ ๊ถ๊ทน์ ์ธ ํ์ถ ํด์น๋ก ์ธ๋ผ์ธ ์ด์ ๋ธ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
@briansmith asm!()
๋ ๋ด์ฅ ํจ์์ _์ข
๋ฅ_์
๋๋ค. ์ ์๋ฅผ ์ฌ์ฉํ์ฌ ํ์๋ฅผ ๋น๋ํ ์ ์๊ธฐ ๋๋ฌธ์
๋๋ค. (์ด ์ถ๋ก ์ ๋ฐ๋ํ๋ ์ผ๋ฐ์ ์ธ ์ฃผ์ฅ์ ์ปดํ์ผ๋ฌ๊ฐ ์ด๋ก ์ ์ผ๋ก ๋ด์ฅ ํจ์๋ฅผ _through_ ์ต์ ํํ ์ ์๋ค๋ ๊ฒ์
๋๋ค. ์๋ฅผ ๋ค์ด ๋ฃจํ์์ ๋์ด์ฌ๋ฆฌ๊ณ , ๊ทธ์ ๋ํด CSE๋ฅผ ์คํํ๋ ๋ฑ์
๋๋ค. ๊ทธ๋ฌ๋ _optimization_ ๋ชฉ์ ์ผ๋ก asm์ ์์ฑํ๋ ์ฌ๋์ด ๋ ๋์ ์์
์ ์ํํ ๊ฒ์ด๋ผ๋ ๊ฒ์ ๊ฝค ๊ฐ๋ ฅํ ๋ฐ๋์
๋๋ค. ์ด์จ๋ ์ปดํ์ผ๋ฌ๋ณด๋ค.) https://github.com/rust-lang/rust/issues/29722#issuecomment -207628164 ๋ฐ https://github.com/rust-lang/rust/issues/29722# ๋ ์ฐธ์กฐ ํ์ญ์์ค. inline asm์ ์๋ํ์ง๋ง ๋ด์ฅ์ ์๋ํ์ง ์๋ ๊ฒฝ์ฐ issuecomment -207823543์
๋๋ค.
๋ฐ๋ฉด์ ๋ด์ฅ ํจ์๋ ์์ผ๋ก ๊ตด๋ฆฐ asm ๊ตฌํ์ผ๋ก ์ป์ ์ ์๋ _์ ์ด๋_ ์ฑ๋ฅ์ ๋ฌ์ฑํ๊ธฐ ์ํด "์ถฉ๋ถํ ๋๋ํ ์ปดํ์ผ๋ฌ"์ ํฌ๊ฒ ์์กดํฉ๋๋ค. ์ด์ ๋ํ ๋์ ์ง์์ ๊ตฌ์์ด์ง๋ง ์๋นํ ์ง์ ์ด ์๋ ํ ๋ด์ฅ ๊ธฐ๋ฐ ๊ตฌํ์ ๋๋ถ๋ถ์ ์๋์ง๋ง ๋ง์ ๊ฒฝ์ฐ์์ ์ฌ์ ํ ์ธก์ ๊ฐ๋ฅํ๊ฒ ์ด๋ฑํฉ๋๋ค. ๋ฌผ๋ก ๊ทธ๊ฒ๋ค์ ์ฌ์ฉํ๊ธฐ๊ฐ ํจ์ฌ ๋ ํธ๋ฆฌํ์ง๋ง ํ๋ก๊ทธ๋๋จธ๊ฐ ํน์ CPU ๋ช ๋ น์ด์ ์ธ๊ณ๋ก ๊ธฐ๊บผ์ด ๋ด๋ ค๊ฐ๋ ค๊ณ ํ ๋ _๊ทธ๊ฒ_์ ๋ํด ๋ณ๋ก ์ ๊ฒฝ ์ฐ์ง ์๋๋ค๊ณ ๋งํ๊ณ ์ถ์ต๋๋ค.
์ด์ ๋ ๋ค๋ฅธ ํฅ๋ฏธ๋ก์ด ๊ณ ๋ ค ์ฌํญ์ ๋ด์ฅ ๊ธฐ๋ฅ์ด ์ง์๋์ง ์๋ ์ํคํ ์ฒ์์ ๋์ฒด ์ฝ๋์ ๊ฒฐํฉ๋ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. ์ด๊ฒ์ ๋ ๊ฐ์ง ์ฅ์ ์ ๋ชจ๋ ์ ๊ณตํฉ๋๋ค. ์ฝ๋๋ ์ฌ์ ํ ์ด์ ๊ฐ๋ฅํฉ๋๋ค. ํ๋์จ์ด๊ฐ ์ง์ํ๋ ์ผ๋ถ ํ๋์จ์ด ๊ฐ์ ์์ ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ฌผ๋ก ์ด๊ฒ์ ๋งค์ฐ ์ผ๋ฐ์ ์ธ ์ง์นจ์ด๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ํ๋์ ๋ถ๋ช ํ ๋์ ์ํคํ ์ฒ๊ฐ ์๋ ๊ฒฝ์ฐ์๋ง ์ค์ ๋ก ํจ๊ณผ๊ฐ ์์ต๋๋ค. ์ด์ ๋ด๊ฐ ์ด๊ฒ์ ์ธ๊ธํ๋ ์ด์ ๋ ์ด๊ฒ์ด _compiler-provided_ ๋ด์ฅ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ฌ์ ์ผ๋ก _๋ฐ๋์งํ์ง ์์_ ์ผ ์ ์๋ค๊ณ ์ฃผ์ฅํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ด์ฅ ๊ธฐ๋ฅ์ด _library_์์ ์ ๊ณต๋๋ ๊ฒฝ์ฐ(๊ทธ๋ฆฌ๊ณ ์ธ๋ผ์ธ asm์ ์ฌ์ฉํด์๋ง ๊ตฌํ๋๋ ๊ฒฝ์ฐ) ๋ค๋ฅธ ์ด์ผ๊ธฐ๋ผ๊ณ ํ ์ ์์ต๋๋ค. ์ฌ์ค, ์ธ๋ผ์ธ asm๋ณด๋ค ๋ด์ฅ ๊ธฐ๋ฅ์ ๋ ๋ง์ด ์ฌ์ฉํ๋ ์ ์์ ์ ๋ณผ ์ ์์ง๋ง ์ด๊ฒ์ด ์ ๊ฐ ์ ํธํ๋ ํฐ ๊ทธ๋ฆผ์ ๋๋ค.
(RFC #1199 ์ ๋ด์ฅ ํจ์๋ ๋๋ถ๋ถ SIMD๋ฅผ ์๋์ํค๊ธฐ ์ํด ์กด์ฌํ๋ฏ๋ก ์ด ๋ ผ์์ ๋ค์ ์ง๊ตํ๋ค๊ณ ์๊ฐํฉ๋๋ค.)
@briansmith
๊ทธ๋ ์ง ์์ผ๋ฉด ์ธ๋ผ์ธ asm์ ๋๋ฌ์ผ ์ฝ๋๋ฅผ ์ต์ ํํ๊ธฐ๊ฐ ๋งค์ฐ ์ด๋ ต์ต๋๋ค. ์ด๋ ์ธ๋ผ์ธ asm์ ๋ง์ ์ฌ์ฉ์ด ์ฑ๋ฅ ์ต์ ํ๋ฅผ ์ํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์์ด๋ฌ๋ํฉ๋๋ค.
๋ฌด์จ ๋ง์ธ์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์ปดํ์ผ๋ฌ๊ฐ asm์ ๊ฐ๋ณ ์์
์ผ๋ก ๋ถํดํ์ฌ ๊ฐ๋ ๊ฐ์ ๋๋ ์ฟ๋ณด๊ธฐ ์ต์ ํ๋ฅผ ์ํํ ์ ์๋ ๊ฒ์ ์ฌ์ค์
๋๋ค. ๊ทธ๋ฌ๋ GCC ๋ชจ๋ธ์์๋ ์ต์ํ ์ปดํ์ผ๋ฌ๊ฐ ์ฌ์ฉํ๋ ๋ ์ง์คํฐ๋ฅผ ํ ๋นํ๊ณ , ์ฝ๋ ๊ฒฝ๋ก๋ฅผ ๋ณต์ ํ ๋ ๋ณต์ฌํ๊ณ , ์ฌ์ฉํ์ง ์๋ ๊ฒฝ์ฐ ์ญ์ ํ๋ ๋ฑ์ ์์
์ ์ํํ ์ ์์ต๋๋ค. asm์ด ํ๋ฐ์ฑ์ด ์๋ ๊ฒฝ์ฐ GCC๋ fsin
์ ๊ฐ์ ๋ค๋ฅธ ๋ถํฌ๋ช
์์
์ฒ๋ผ ์ฒ๋ฆฌํ๊ธฐ์ ์ถฉ๋ถํ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์ด์ํ ๋์์ธ์ ์ ์ฒด ๋๊ธฐ๋ ์ธ๋ผ์ธ asm์ ์ต์ ํ ํ๋ก๊ทธ๋จ์ด ์๋ง์ผ๋ก ๋ง๋ค ์ ์๋๋ก ํ๋ ๊ฒ์
๋๋ค.
๊ทธ๋ฌ๋ ๋๋ ๊ทธ๊ฒ์ ๋ง์ด ์ฌ์ฉํ์ง ์์์ต๋๋ค. ํนํ ์ต๊ทผ์๋ ๊ทธ๋ฌํ์ง ์์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ ๋ LLVM์ ๊ธฐ๋ฅ ํํ์ ๋ํ ๊ฒฝํ์ด ์์ต๋๋ค. ๊ทธ๋์ ๊ทธ๋์ ์ ๊ฐ ๋ญ ์๋ชป ์ดํดํ๋์ง, ๋ญ๊ฐ ๋ฌ๋ผ์ก๋์ง ๊ถ๊ธํฉ๋๋ค.
no_std
์ํ๊ณ ์ ๋ํ @japaric ์ ์ค๋ฌธ์กฐ์ฌ ์์ asm!
๋งคํฌ๋ก๊ฐ ๊ฐ์ฅ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋๋ ๊ธฐ๋ฅ ์ค ํ๋๋ก ํฌํจ๋์ด ์๊ธฐ ๋๋ฌธ์ ์ต๊ทผ ์์
์ฃผ์ ์ด ๋ฌธ์ ์ ๋ํด ๋
ผ์ํ์ต๋๋ค. ๋ถํํ๋ ์ฐ๋ฆฌ๋ ์ด ๊ธฐ๋ฅ์ ์์ ํํ ์ ์๋ ์ฌ์ด ๋ฐฉ๋ฒ์ ์ฐพ์ง ๋ชปํ์ง๋ง ์ด ๋ชจ๋ ๊ฒ์ ์์ง ์๊ธฐ ์ํด ๋ฉ๋ชจ๋ฅผ ์ ์ด๋๊ณ ์ถ์์ต๋๋ค.
์ฒซ์งธ, ํ์ฌ asm!
๋งคํฌ๋ก์์ ํ์ฉ๋๋ ๊ตฌ๋ฌธ์ ๋ํ ํ๋ฅญํ ์ฌ์์ด ์์ต๋๋ค. ์ง๊ธ์ ์ผ๋ฐ์ ์ผ๋ก ํ๋ฅญํ ๋ฌธ์๊ฐ ์๋ "gcc๋ฅผ ๋ณด์ธ์"๋ผ๊ณ ๋งํ๋ "ํด๋ญ์ ๋ณด์ธ์"๋ผ๊ณ ๋งํ๋ "LLVM์ ๋ณด์ธ์"๋ก ๋๋ฉ๋๋ค. ๊ฒฐ๊ตญ ์ด๊ฒ์ ์ผ๋ฐ์ ์ผ๋ก "๋ค๋ฅธ ์ฌ๋์ ์์ ๋ฅผ ์ฝ๊ณ ์ ์ฉ" ๋๋ "LLVM์ ์์ค ์ฝ๋ ์ฝ๊ธฐ"๋ก ๋๋ฉ๋๋ค. ์์ ํ๋ฅผ ์ํด ์ต์ํ์ ๊ตฌ๋ฌธ ๋ฐ ๋ฌธ์ ์ฌ์์ด ํ์ํฉ๋๋ค.
ํ์ฌ ์ฐ๋ฆฌ๊ฐ ์๋ ํ LLVM์ ์์ ์ฑ ๋ณด์ฅ์ ์์ต๋๋ค. asm!
๋งคํฌ๋ก๋ LLVM์ด ํ์ฌ ์ํํ๋ ์์
์ ๋ํ ์ง์ ๋ฐ์ธ๋ฉ์
๋๋ค. ์ด๊ฒ์ ์ฐ๋ฆฌ๊ฐ ์ํ ๋ LLVM์ ์ฌ์ ํ ์์ ๋กญ๊ฒ ์
๊ทธ๋ ์ด๋ํ ์ ์์์ ์๋ฏธํฉ๋๊น? LLVM์ ์ด ๊ตฌ๋ฌธ์ ์ ๋ ์๋ฐํ์ง ์์ ๊ฒ์ด๋ผ๊ณ ๋ณด์ฅํฉ๋๊น? ์ด ๋ฌธ์ ๋ฅผ ์ํํ๋ ๋ฐฉ๋ฒ์ LLVM์ ๊ตฌ๋ฌธ์ผ๋ก ์ปดํ์ผ๋๋ ์์ฒด ๊ณ์ธต์ ๊ฐ๋ ๊ฒ์
๋๋ค. ๊ทธ๋ ๊ฒ ํ๋ฉด ์ํ ๋๋ง๋ค LLVM์ ๋ณ๊ฒฝํ ์ ์๊ณ LLVM์ ์ธ๋ผ์ธ ์ด์
๋ธ๋ฆฌ ๊ตฌํ์ด ๋ณ๊ฒฝ๋๋ฉด LLVM ๊ตฌ๋ฌธ์ผ๋ก ๋ฒ์ญ์ ์
๋ฐ์ดํธํ ์ ์์ต๋๋ค. asm!
๊ฐ ์์ ํ๋๋ ค๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก Rust์์ ์์ ์ฑ์ ๋ณด์ฅ ํ๋ ๋ฉ์ปค๋์ฆ์ด ํ์ํฉ๋๋ค.
ํ์ฌ ์ธ๋ผ์ธ ์ด์ ๋ธ๋ฆฌ์ ๊ด๋ จ๋ ๋ฒ๊ทธ๊ฐ ๊ฝค ์์ต๋๋ค. A-inline-assembly ํ๊ทธ๋ ์ข์ ์ถ๋ฐ์ ์ด๋ฉฐ ํ์ฌ ICE, LLVM์ segfaults ๋ฑ์ด ์ฐ์ฌํด ์์ต๋๋ค. ์ ๋ฐ์ ์ผ๋ก ์ค๋๋ ๊ตฌํ๋ ์ด ๊ธฐ๋ฅ์ ๋ค๋ฅธ ์ฌ๋๋ค์ด ์์ ์ ์ธ Rust์ ๊ธฐ๋ฅ.
์ธ๋ผ์ธ ์ด์ ๋ธ๋ฆฌ๋ฅผ ์์ ํํ๋ฉด ๋์ฒด ๋ฐฑ์๋ ๊ตฌํ์ด ๋งค์ฐ ์ด๋ ค์ธ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ๋ฏธ๋ฆฌ ๋๋ ํฌ๋ ์ธ ๋ฆฌํํธ์ ๊ฐ์ ๋ฐฑ์๋๋ ๊ตฌํ์ ๋ฐ๋ผ LLVM ๋ฐฑ์๋์ ๊ธฐ๋ฅ ํจ๋ฆฌํฐ์ ๋๋ฌํ๋ ๋ฐ ๋งค์ฐ ์ค๋ ์๊ฐ์ด ๊ฑธ๋ฆด ์ ์์ต๋๋ค. ์ด๊ฒ์ ์ฌ๊ธฐ์ ์ํํ ์ ์๋ ์์ ์ ์์ ๋ถ๋ถ์ด ์์์ ์๋ฏธํ ์ ์์ง๋ง ์ธ๋ผ์ธ ์ด์ ๋ธ๋ฆฌ ์์ ํ๋ฅผ ๊ณ ๋ คํ ๋ ์ผ๋์ ๋์ด์ผ ํ ์ค์ํ ์ฌํญ์ ๋๋ค.
์ฐ๋ฆฌ ์์ ๋์ด๋ ๋ฌธ์ ์๋ ๋ถ๊ตฌํ๊ณ ์ ์ด๋ ์์ผ๋ก์ด ๋ฌธ์ ๋ฅผ ์ด๋ํ๋ ๋ช ๊ฐ์ง ๋ฅ๋ ฅ์ ๋ฉ๋ฆฌ ์จ์ ๋ฐ๋์ ์ถ์ด! ์ด๋ฅผ ์ํด ์ฐ๋ฆฌ๋ ์ธ๋ผ์ธ ์ด์ ๋ธ๋ฆฌ๋ฅผ ์์ ํ ๋ฐฉํฅ์ผ๋ก ์กฐ๊ธ์ฉ ์์ง์ผ ์ ์๋ ๋ฐฉ๋ฒ์ ๋ํ ๋ช ๊ฐ์ง ์ ๋ต์ ๋ธ๋ ์ธ์คํ ๋ฐํ์ต๋๋ค. ์์ผ๋ก์ ์ฃผ์ ๋ฐฉ๋ฒ์ clang์ด ํ๋ ์ผ์ ์กฐ์ฌํ๋ ๊ฒ์ ๋๋ค. ์๋ง๋ clang๊ณผ C๋ ํจ๊ณผ์ ์ผ๋ก ์์ ์ ์ธ ์ธ๋ผ์ธ ์ด์ ๋ธ๋ฆฌ ๊ตฌ๋ฌธ์ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ clang์ด ํ๋ ๋ชจ๋ ์ผ(ํนํ wrt LLVM)์ ๋ฏธ๋ฌ๋งํ ์ ์์ต๋๋ค. clang์ด ์ธ๋ผ์ธ ์ด์ ๋ธ๋ฆฌ๋ฅผ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ๋ ๊น์ด ์ดํดํ๋ ๊ฒ์ด ์ข์ต๋๋ค. clang์๋ ์์ฒด ๋ฒ์ญ ๋ ์ด์ด๊ฐ ์์ต๋๊น? ์ ๋ ฅ ๋งค๊ฐ๋ณ์์ ์ ํจ์ฑ์ ๊ฒ์ฌํฉ๋๊น? (๋ฑ)
์์ผ๋ก ๋์๊ฐ๊ธฐ ์ํ ๋ ๋ค๋ฅธ ๊ฐ๋ฅ์ฑ์ ์ด๋ฏธ ์์ ์ ์ธ ๋ค๋ฅธ ๊ณณ์์ ์ ๋ฐ์ ์ ๊ฑฐํ ์ ์๋ ์ด์ ๋ธ๋ฌ๊ฐ ์๋์ง ํ์ธํ๋ ๊ฒ์ ๋๋ค. ์ฌ๊ธฐ์ ์๋ ๋ช ๊ฐ์ง ์์ด๋์ด๋ nasm ๋๋ plan9 ์ด์ ๋ธ๋ฌ์์ต๋๋ค. LLVM์ ์ด์ ๋ธ๋ฌ๋ฅผ ์ฌ์ฉํ๋ฉด IR์ ์ธ๋ผ์ธ ์ด์ ๋ธ๋ฆฌ ๋ช ๋ น๊ณผ ๋์ผํ ์์ ์ฑ ๋ณด์ฅ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. (๊ฐ๋ฅํ์ง๋ง ์ฌ์ฉํ๊ธฐ ์ ์ ์์ ์ฑ ๋ณด์ฅ์ด ํ์ํฉ๋๋ค)
LLVM์ ์ธ๋ผ์ธ asm ๊ตฌ๋ฌธ์ด clang/gcc์์ ์ฌ์ฉ๋๋ ๊ตฌ๋ฌธ๊ณผ ๋ค๋ฅด๋ค๋ ์ ์ ์ง์ ํ๊ณ ์ถ์ต๋๋ค. ์ฐจ์ด์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
$0
๋์ %0
.%[name]
์ง์ํ์ง ์์ต๋๋ค."{eax}"
๋์ "a"
86์."{r11}"
)์ ์ง์ํฉ๋๋ค. C์์๋ ๊ฐ์ ๋ ์ง์คํฐ( register asm("r11") int x
)์ ๋ฐ์ธ๋ฉํ๊ธฐ ์ํด ๋ ์ง์คํฐ asm ๋ณ์๋ฅผ ๋์ ์ฌ์ฉํด์ผ ํฉ๋๋ค."m"
๋ฐ "=m"
์ ์ฝ ์กฐ๊ฑด์ ๊ธฐ๋ณธ์ ์ผ๋ก ๊นจ์ก์ต๋๋ค. Clang์ ์ด๋ฅผ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ์ ์ฝ "*m"
๋ฐ "=*m"
๋ก ๋ณํํ๊ณ ๋ณ์ ์์ฒด ๋์ LLVM์ ๋ณ์ ์ฃผ์๋ฅผ ์ ๋ฌํฉ๋๋ค.Clang์ ์ธ๋ผ์ธ asm์ LLVM์ ์ ๋ฌํ๊ธฐ ์ ์ gcc ํ์์์ LLVM ํ์์ผ๋ก ๋ณํํฉ๋๋ค. ๋ํ ์ ์ฝ ์กฐ๊ฑด์ ์ผ๋ถ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ์ํํฉ๋๋ค. ์๋ฅผ ๋ค์ด "i"
ํผ์ฐ์ฐ์๊ฐ ์ปดํ์ผ ํ์ ์์์ธ์ง ํ์ธํฉ๋๋ค.
์ด์ ๋น์ถ์ด ๋๋ ์ฐ๋ฆฌ๊ฐ clang์ด ์ํํ๋ ๊ฒ๊ณผ ๋์ผํ ๋ฒ์ญ ๋ฐ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ๊ตฌํํ๊ณ ์ด์ํ LLVM ๋์ ์ ์ ํ gcc ์ธ๋ผ์ธ asm ๊ตฌ๋ฌธ์ ์ง์ํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
์จ๋ผ์ธ ์ฌ๋ผ์ด๋ ๊ฐ ํฌํจ๋ D, MSVC, gcc, LLVM ๋ฐ Rust ์์ฝ์ ๋ํ ํ๋ฅญํ ๋น๋์ค ๊ฐ ์์ต๋๋ค.
์์ ์ ์ธ Rust์์ ์ธ๋ผ์ธ ASM์ ์ฌ์ฉํ๊ณ ์ถ๊ณ Rust์ LLVM MC API์ ์ก์ธ์คํ๋ ค๊ณ ํ๋ ๊ฒ๋ณด๋ค ๋ ๋ง์ ๊ฒฝํ์ด ์๋ ์ฌ๋์ผ๋ก์ ๋ค์๊ณผ ๊ฐ์ ์๊ฐ์ด ๋ญ๋๋ค.
์ธ๋ผ์ธ ASM์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ผ๋ถ ๋ฌธ์์ด ๋์ฒด ํ ์ด์ ๋ธ์ ์ํด ์ถ๋ ฅ .s ํ์ผ์ ์ฝ๋ ์กฐ๊ฐ์ ๋ณต์ฌํ์ฌ ๋ถ์ฌ๋ฃ๋ ๊ฒ์ ๋๋ค. ๋ํ ์ ๋ ฅ ๋ฐ ์ถ๋ ฅ ๋ ์ง์คํฐ์ ํด๋ก๋ฒ ๋ ์ง์คํฐ๊ฐ ์ฒจ๋ถ๋์ด ์์ต๋๋ค. ์ด ๊ธฐ๋ณธ ํ๋ ์์ํฌ๋ LLVM์์ ์ค์ ๋ก ๋ณ๊ฒฝ๋ ๊ฐ๋ฅ์ฑ์ด ๊ฑฐ์ ์์ผ๋ฉฐ(์ผ๋ถ ์ธ๋ถ ์ฌํญ์ ์ฝ๊ฐ ๋ค๋ฅผ ์ ์์) ์ด๊ฒ์ด ์๋นํ ํ๋ ์์ํฌ ๋ ๋ฆฝ์ ์ธ ํํ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
Rust ์งํฅ ์ฌ์์์ LLVM ์งํฅ IR ํ์์ผ๋ก ๋ณํ์ ๊ตฌ์ฑํ๋ ๊ฒ์ ์ด๋ ต์ง ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ LLVM์ $
๋ฐ GCC์ %
ํ๊ธฐ๋ฒ๊ณผ ๋ฌ๋ฆฌ ํ์ ์ง์ ์ ์ํ rust {}
๊ตฌ๋ฌธ์ ์ด์
๋ธ๋ฆฌ ์ธ์ด๋ฅผ ๋ฐฉํดํ์ง ์๋ ๊ฒ์ด ์ข์ต๋๋ค.
LLVM์ ํนํ LLVM์ ์ํด ์์ฑ๋์ง ์์ ๋ช ๋ น์ด์์ ์ด๋ค ๋ ์ง์คํฐ๊ฐ ํด๋ก๋ฒ๋ง๋๋์ง ์ค์ ๋ก ์๋ณํ๋ ์ค์ ๋ก ๋๋๊ฒ๋ ๋์ ์์ ์ ์ํํฉ๋๋ค. ์ด๊ฒ์ ์ฌ์ฉ์๊ฐ ํด๋ก๋ฒ๋ง๋๋ ๋ ์ง์คํฐ๋ฅผ ์๋์ผ๋ก ์ง์ ํ๋ ๊ฒ์ด ๊ฑฐ์ ํ์ํ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
์ด์ ๋ธ๋ฆฌ๋ฅผ ์ง์ ๊ตฌ๋ฌธ ๋ถ์ํ๋ ๊ฒ์ ์ ๋ชฝ์ผ ๊ฒ์ ๋๋ค. LLVM-C API๋ MCAsmParser ๋ ผ๋ฆฌ๋ฅผ ๋ ธ์ถํ์ง ์์ผ๋ฉฐ ์ด๋ฌํ ํด๋์ค๋ bindgen์ผ๋ก ์์ ํ๋ ๋ฐ ์๋นํ ์ฑ๊ฐ์ญ๋๋ค(์ ๊ฐ ์๋ฃํ์ต๋๋ค).
๋ค๋ฅธ ๋ฐฑ์๋๋ก์ ์ด์์ฑ์ ์ํด ์ธ๋ผ์ธ ์ด์ ๋ธ๋ฆฌ๋ฅผ ๋๋ถ๋ถ "์ด ๋ฌธ์์ด์ ์ฝ๊ฐ์ ๋ ์ง์คํฐ ํ ๋น ๋ฐ ๋ฌธ์์ด ๋์ฒด๋ก ๋ณต์ฌํ์ฌ ๋ถ์ฌ๋ฃ๊ธฐ" ์์ค์ผ๋ก ์ ์งํ๋ ํ ๋ฐฑ์๋๋ฅผ ๊ทธ๋ ๊ฒ ๋ง์ด ์ต์ ํ์ง ์์์ผ ํฉ๋๋ค. ์ ์ ์์ ๋ฐ ๋ฉ๋ชจ๋ฆฌ ์ ์ฝ ์กฐ๊ฑด์ ์ญ์ ํ๊ณ ๋ ์ง์คํฐ ๋ฑ ํฌ ์ ์ฝ ์กฐ๊ฑด๋ง ์ ์งํ๋ฉด ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์์ต๋๋ค.
๋๋ ์ ์ฐจ์ ๋งคํฌ๋ก๋ก ๋ฌด์์ ํ ์ ์๋์ง ์์๋ณด๊ธฐ ์ํด ์ฝ๊ฐ์ ํ๋ ์ด๋ฅผ ํ์ต๋๋ค. GCC ์คํ์ผ ์ธ๋ผ์ธ ์ด์ ๋ธ๋ฆฌ๋ฅผ Rust ์คํ์ผ https://github.com/parched/gcc-asm-rs ๋ก ๋ณํํ๋ ๊ฒ์ ์์ฑํ์ต๋๋ค
๊ทธ๋์ ์ ๋ ๋ น์ด ๊ธฐ๋ณธ ๋น๋ฉ ๋ธ๋ก์ ์์ ํ์์ผ์ผ ํ๋ค๊ณ ์๊ฐํ๊ณ ์ปค๋ฎค๋ํฐ๊ฐ ๋งคํฌ๋ก๋ฅผ ์ฌ์ฉํ์ฌ ํธ๋ฆฌ ๋ฐ์ผ๋ก ๋ฐ๋ณตํ์ฌ ์ต์์ ์๋ฃจ์ ์ ์ฐพ์๋ผ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก "r" ๋ฐ "i" ๋ฐ ์๋ง๋ "m" ์ ์ฝ ์กฐ๊ฑด๋ง ์ฌ์ฉํ๊ณ ํด๋ก๋ฒ ์์ด ํ์ฌ ๊ฐ์ง๊ณ ์๋ llvm ์คํ์ผ์ ์์ ํํ์ญ์์ค. ๋ค๋ฅธ ์ ์ฝ ๋ฐ ํด๋ก๋ฒ๋ ๋์ค์ ์์ฒด ๋ฏธ๋ RFC ์ ํ์ผ๋ก ์์ ํ๋ ์ ์์ต๋๋ค.
๊ฐ์ธ์ ์ผ๋ก ์ ๋ ์ด ๊ธฐ๋ฅ์ ์์ ํํ๋ ๊ฒ์ด ๋๊ตฐ๊ฐ๊ฐ 1๋
๋ด๋ด ์ด ์์
์ ์ํํ ์ ๊ท์ง ์ ๋ฌธ ๊ณ์ฝ์๋ฅผ ๊ณ ์ฉํ์ง ์๋ ํ ๊ฒฐ์ฝ ์ํํ ์ ์๋ ์ผ์ข
์ ๋๊ท๋ชจ ์์
์ด๋ผ๊ณ ๋๋ผ๊ธฐ ์์ํ์ต๋๋ค. asm!
๋ฅผ ์์ ํํ์๋ @parched ์ ์ ์์ด ์ด๊ฒ์ ๋ค๋ฃจ๊ธฐ ์ฝ๊ฒ ๋ง๋ค ๊ฒ์ด๋ผ๊ณ ๋ฏฟ๊ณ ์ถ์ต๋๋ค. ๋๊ตฐ๊ฐ๊ฐ ๊ทธ๊ฒ์ ์ง์ด ๋ค๊ณ ์คํ๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ๋ ์ง ์๋ค๋ฉด ๊ฒฐ์ฝ ๋์ฐฉํ์ง ์์ ๋ง์กฑ์ค๋ฌ์ด ์๋ฃจ์
์ ๋๋ฌํ๋ ค๋ ์๋๋ฅผ ์ค๋จํ๊ณ ๋ค์๊ณผ ๊ฐ์ ๋ถ๋ง์กฑ์ค๋ฌ์ด ์๋ฃจ์
์ ๋๋ฌํด์ผ ํฉ๋๋ค. asm!
๊ทธ๋๋ก, ์ฌ๋ง๊ท, ICE, ๋ฒ๊ทธ ๋ฐ ๋ชจ๋ ๊ฒ์ ์์ ํ , ๋ฒ๋ฒ
์๊ณผ ๋น ์ด์์ฑ์ ๊ด๊ณ ํ๋ ๋ฌธ์์์ ๋ฐ๊ณ ๋๋ดํ ๊ฒฝ๊ณ ์ ํจ๊ป ๋ง์กฑ์ค๋ฌ์ด ๊ตฌํ์ด ํ๋์ ํธ์คํธ์ ๊ธฐ์ ์ ์ผ๋ก ๋ด๋ ค์ค๋ฉด ์ธ์ ๊ฐ๋ ์ฌ์ฉํ์ง ์์ ์๋๋ก. IOW, ์ฐ๋ฆฌ๋ ์ฐ๋ฆฌ๊ฐ macro_rules!
๋ํด ํ ์ผ์ ์ ํํ ํด์ผ ํฉ๋๋ค(๋ฌผ๋ก macro_rules!
์ฒ๋ผ, ์ฐ๋ฆฌ๋ ์งง์ ๊ธฐ๊ฐ ๋์ ๋ฏธ์น ๋ฏ์ด ๋ฐ์ฐฝ๊ณ ๋ฅผ ํ๊ณ ๋์ถ๋๋ ๋ฏธ๋๋ฅผ ๋๋นํ ์ ์์ต๋๋ค). ๋์ฒด ๋ฐฑ์๋์ ๋ํ ๊ฒฐ๊ณผ๊ฐ ์ํ๊น์ง๋ง ์์คํ
์ธ์ด๊ฐ ์ธ๋ผ์ธ ์ด์
๋ธ๋ฆฌ๋ฅผ ๊ทธ๋ฌํ ๋ฆผ๋ณด๋ก ๋ถ๋ฅํ๋ ๊ฒ์ ๋ถ๋๋ฌ์ด ์ผ์ด๋ฉฐ ์ฌ๋ฌ ๋ฐฑ์๋์ ๊ฐ์ ๊ฐ๋ฅ์ฑ์ด ์ค์ ๋ก ์ฌ์ฉ ๊ฐ๋ฅํ ํ๋์ ๋ฐฑ์๋์ ์กด์ฌ๋ฅผ ๊ณ์ ๋ฐฉํดํ๋๋ก ํ ์ ์์ต๋๋ค. ๋ด๊ฐ ๋น์ ์๊ฒ ๊ฐ์ฒญํฉ๋๋ค, ๋ด๊ฐ ํ๋ ธ๋ค๋ ๊ฒ์ ์ฆ๋ช
ํ์ญ์์ค!
์์คํ ์ธ์ด๊ฐ ์ธ๋ผ์ธ ์ด์ ๋ธ๋ฆฌ๋ฅผ ๊ทธ๋ฐ ๋ฆผ๋ณด๋ก ๊ฒฉํํ๋ ๊ฒ์ ๋ถ๋๋ฌ์ด ์ผ์ ๋๋ค.
๋ฐ์ดํฐ ํฌ์ธํธ๋ก์, ์ ๋ ์์ ์ ์ธ Rust๋ก ์ผ๋ถ asm์ ๋ฐฉ์ถํ๊ธฐ ์ํ ์ ์ผํ ๋ชฉ์ ์ผ๋ก gcc
์ ์์กดํ๋ ์์์์ ์์
ํ๊ณ ์์ต๋๋ค: https://github.com/main--/unwind- rs/blob/266e0f26b6423f4a2b8a8c72442b319b5c33b658/src/unwind_helper.c
ํ์คํ ์ฅ์ ์ด ์์ง๋ง "๊ตฌ์ฑ ์์๋ฅผ ์์ ํํ๊ณ ๋๋จธ์ง๋ ๋งคํฌ๋ก ๋งคํฌ๋ก์ ๋งก๊ธฐ๋" ์ ๊ทผ ๋ฐฉ์์ ๋ํด ์ฝ๊ฐ ์กฐ์ฌ์ค๋ฝ์ต๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์ค๊ณ, RFC ๋ฐ ๊ตฌํ ํ๋ก์ธ์ค๋ฅผ ์์ ์ ์ํํ๋ ค๋ ์ฌ๋์๊ฒ ์์์์ฑํฉ๋๋ค. ๋ฌผ๋ก ์์ ์ฑ/ํ์ง ๋ณด์ฆ์ด ์ฝํ ๊ฒ์ด ์์ ์ ๋๋ค(์ ์ถฉ์์ ๋ถ์์ ํ ๊ฒ์ด ์๋ ๊ฒ์ด ์์ ์๋ ๊ฒ๋ณด๋ค ํจ์ฌ ๋ซ๋ค๋ ๊ฒ์ ๋๋ค).
์ต์ํ ๋น๋ฉ ๋ธ๋ก์ ์ ์ค๊ณ๋์ด์ผ ํฉ๋๋ค. ์ ์๊ฐ์๋ "expr" : foo : bar : baz
ํ์คํ ๊ทธ๋ ์ง ์์ต๋๋ค. ์ฒซ ๋ฒ์งธ ์๋์์ ์ฃผ๋ฌธ์ ์ ๋๋ก ๋ฐ์ ๊ธฐ์ต์ด ์๊ณ ํญ์ ์ฐพ์๋ด์ผ ํฉ๋๋ค. "๋ง๋ฒ ๋ฒ์ฃผ๋ฅผ ์ฝ๋ก ์ผ๋ก ๊ตฌ๋ถํ์ฌ ๋ง๋ฒ ๋ฌธ์๋ก ์์ ๋ฌธ์์ด์ ์ง์ ํ์ฌ ๋ณ์ ์ด๋ฆ์ ๋ง๋ฒ ๊ฐ์ ์ผ์ ํ๊ฒ ํ๊ณ ์ด๋ป๊ฒ๋ ๊ฑฐ๊ธฐ์ ๋งค์ฌ"ํ๋ ๊ฒ์ ์ข์ง ์์ต๋๋ค.
ํ๋์ ์์ด๋์ด, โฆ
์ค๋๋ ์๋ x64 ์ฝ๋์ ํ ๊ฐ์ง ๋ฒ์ ์ผ๋ก ์ด์ ๋ธ๋ฆฌ๋ฅผ ์ฌ์ ์ฒ๋ฆฌํ๋ ๋ฐ ์ฌ์ฉ๋๋ ํ๋ฌ๊ทธ์ธ์ผ๋ก ์ด์ ๋ธ๋ฆฌ ์ฝ๋๋ฅผ ์์ฑํ๋ ๋ฐ ๋์์ด ๋ ์ ์๋ dynasm์ด๋ผ๋ ํ๋ก์ ํธ๊ฐ ์ด๋ฏธ ์์ต๋๋ค.
์ด ํ๋ก์ ํธ๋ ์ธ๋ผ์ธ ์ด์ ๋ธ๋ฆฌ์ ๋ฌธ์ ์ ๋ํ ๋ต์ ์๋์ง๋ง ํ์คํ ๋์์ด ๋ ์ ์์ต๋๋ค. ๋ง์ฝ rustc๊ฐ ๋ณ์๋ฅผ ๋ ์ง์คํฐ์ ๋งคํํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๊ณ ์ฝ๋์ ๋ฐ์ดํธ ์ธํธ๋ฅผ ์ฝ์ ํ๋ ๊ฒ์ ํ์ฉํ๋ค๋ฉด ๊ทธ๋ฌํ ํ๋ก์ ํธ๋ ๋ค์์ ์ฑ์ฐ๋ ๋ฐ์๋ ์ฌ์ฉ๋ ์ ์์ต๋๋ค. ์ด ๋ฐ์ดํธ ์งํฉ์ ์ฌ๋ฆฝ๋๋ค.
์ด๋ฐ ์์ผ๋ก, Rustc ๊ด์ ์์ ํ์ํ ์ ์ผํ ํ์คํ ๋ถ๋ถ์ ์์ฑ๋ ์ฝ๋์ ๋ฐ์ดํธ ์ํ์ค๋ฅผ ์ฝ์ ํ๊ณ ํน์ ๋ ์ง์คํฐ ํ ๋น์ ์ ์ฉํ๋ ๊ธฐ๋ฅ์ ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ํน์ ์ธ์ด ๋ฒ์ ์ ๋ํ ๋ชจ๋ ์ ํ ์ฌํญ์ด ์ ๊ฑฐ๋ฉ๋๋ค.
์ญ๋์ฑ์ด ์๋๋ผ๋ ์ด๊ฒ์ cpuid / rtdsc ๋ช ๋ น์ด์ ๋ํ ๋งคํฌ๋ก๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ผ๋ก ์ฌ์ฉ๋ ์๋ ์์ต๋๋ค. ์ด ๋งคํฌ๋ก๋ ์์ ๋ฐ์ดํธ ์ํ์ค๋ก ๋ณํ๋ฉ๋๋ค.
๋ค์ ์ง๋ฌธ์ ๋ฐ์ดํธ ์ํ์ค์ ์ถ๊ฐ ์์ฑ/์ ์ฝ ์กฐ๊ฑด์ ์ถ๊ฐํ๋ ค๋ ๊ฒฝ์ฐ์ผ ์ ์์ต๋๋ค.
[ํธ์ง: ๋๋ ์ด ๋๊ธ์์ ๋ด๊ฐ ๋งํ ๋ชจ๋ ๊ฒ์ด ์ณ๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค.]
LLVM์ ํตํฉ ์ด์ ๋ธ๋ฌ๋ฅผ ๊ณ์ ์ฌ์ฉํ๋ ค๋ ๊ฒฝ์ฐ(์ธ๋ถ ์ด์ ๋ธ๋ฌ๋ฅผ ์์ฑํ๋ ๊ฒ๋ณด๋ค ๋น ๋ฅด๋ค๊ณ ๊ฐ์ ), ์์ ํ๋ LLVM์ ์ธ๋ผ์ธ ์ด์ ๋ธ๋ฆฌ ํํ์ ๋ฐ ํตํฉ ์ด์ ๋ธ๋ฌ ์ง์์ด ์ ํํ ๋ฌด์์ธ์ง์ ๋ํด ์์ ํํ๊ณ ๋ณ๊ฒฝ ์ฌํญ์ด ๋ฐ์ํ ๊ฒฝ์ฐ ์ด๋ฅผ ๋ณด์ํ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
์ธ๋ถ ์ด์ ๋ธ๋ฌ๋ฅผ ์์ฑํ๋ ค๋ ๊ฒฝ์ฐ ์ํ๋ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ ์ ์์ง๋ง ํตํฉ ์ด์ ๋ธ๋ฌ์ ์ด์ ์ ๋ฌด์ํ๊ณ ํธ์ถํ๋ ์ธ๋ถ ์ด์ ๋ธ๋ฌ์ ๋ณ๊ฒฝ ์ฌํญ์ ๋ ธ์ถ๋ฉ๋๋ค.
Clang์์๋ ๊ทธ๋ ๊ฒ ํ์ง ์๋๋ฐ LLVM์ ํ์์ผ๋ก ์์ ํํ๋ ๊ฒ์ด ์ด์ํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์๋ง๋ ๋ด๋ถ์ ์ผ๋ก LLVM์ ์ง์์ ์ฌ์ฉํ์ง๋ง GCC์ ๊ฐ์ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํฉ๋๋ค.
ํนํ AFAIK Clang์ ์ ์ฅ์ด "Clang์ GCC๊ฐ ์ง์ํ๋ ๊ฒ์ ์ ํํ ์ง์ํฉ๋๋ค"์ด๊ธฐ ๋๋ฌธ์ "Rust๋ Clang์ด ์ง์ํ๋ ๊ฒ์ ์ ํํ ์ง์ํฉ๋๋ค"๋ผ๊ณ ๋งํ๋ ๊ฒ์ด 100% ๊ด์ฐฎ์ต๋๋ค. ์ค์ Rust ์ฌ์์ด ์๋ค๋ฉด ์ธ์ด๋ฅผ "์ธ๋ผ์ธ ์ด์ ๋ธ๋ฆฌ๋ ๊ตฌํ ์ ์"๋ก ๋ถ๋๋ฝ๊ฒ ํ ์ ์์ต๋๋ค. ์ฐ์ ์์ ๋ฐ ์ฌ์ค์์ ํ์คํ๋ ๊ฐ๋ ฅํ ๋๊ตฌ์ ๋๋ค. GCC ๊ตฌ๋ฌธ์ LLVM์ผ๋ก ๋ณํํ๊ธฐ ์ํด Clang์ ์์ฒด ์ฝ๋๋ฅผ ์ฌ์ฌ์ฉํ ์ ์๋ค๋ฉด ๋์ฑ ์ข์ต๋๋ค. ๋์์ ์ธ ๋ฐฑ์๋ ๋ฌธ์ ๋ ์ฌ๋ผ์ง์ง ์์ง๋ง ์ด๋ก ์ ์ผ๋ก GCC์ ๋ํ Rust ํ๋ก ํธ์๋๋ ๊ทธ๋ค์ง ์ง์ฆ๋์ง ์์ ๊ฒ์ ๋๋ค. ์ฐ๋ฆฌ๊ฐ ์ค๊ณํด์ผ ํ๋ ์ผ๋, ๋์์ด ์์ ๊ฑฐ๋ฅผ ๋ชฐ๊ณ ๊ฐ์ผ ํ๋ ์ผ๋ ์ ๊ณ , ๊ฐ๋ฅด์ณ์ผ ํ๋ ์ผ๋ ์ ๊ณ , ์ ์ง ๊ด๋ฆฌํด์ผ ํ๋ ์ผ๋ ์ ์ต๋๋ค.
clang์ด ์ง์ํ๋ ์ธก๋ฉด์์ ์ ์๋ ๊ฒ์ ์์ ํํ๋ฉด clang_asm!
๋ผ๊ณ ํด์ผ ํฉ๋๋ค. asm!
์ด๋ฆ์ ๋ค๋ฅธ ์ฃผ์ Rust ๊ธฐ๋ฅ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์ ์ฒด RFC ํ๋ก์ธ์ค๋ฅผ ํตํด ์ค๊ณ๋ ๊ฒ์ ์ํด ์์ฝํด์ผ ํฉ๋๋ค. #์์ ๊ฑฐ๋ณด๊ด์
Rust ์ธ๋ผ์ธ ์ด์ ๋ธ๋ฆฌ์์ ๋ณด๊ณ ์ถ์ ๋ช ๊ฐ์ง ์ฌํญ์ด ์์ต๋๋ค.
ํ ํ๋ฆฟ์ด ์๋ ๋์ฒด ํจํด์ ๋ณด๊ธฐ ํํฉ๋๋ค. ๋๋ ํญ์ ์ด์ ๋ธ๋ฆฌ ํ ์คํธ์ ์ ์ฝ ๋ชฉ๋ก ์ฌ์ด๋ฅผ ์๋ค๊ฐ๋ค ํฉ๋๋ค. ๊ฐ๊ฒฐํจ์ ์ฌ๋๋ค์ด ์์น ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ๋๋ก ๊ถ์ฅํ์ฌ ๊ฐ๋ ์ฑ์ ๋จ์ด๋จ๋ฆฝ๋๋ค. ๊ธฐํธ ์ด๋ฆ์ ์ข ์ข ํ ํ๋ฆฟ์์ ํผ์ฐ์ฐ์ ์ด๋ฆ ์ง์ ๋ฐ ํผ์ฐ์ฐ์์ ๋ฐ์ธ๋ฉ๋๋ ํํ์์์ ๋์ผํ ์ด๋ฆ์ด ์ธ ๋ฒ ๋ฐ๋ณต๋๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. Alex์ ์ฝ๋ฉํธ ์์ ์ธ๊ธํ ์ฌ๋ผ์ด๋๋ D์ MSVC๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๋์์ ๋ณ์๋ฅผ ๋จ์ํ ์ฐธ์กฐํ ์ ์๋ค๋ ๊ฒ์ ๋ณด์ฌ์ค๋๋ค. ์ด๋ ํจ์ฌ ๋ ์ข์ ๋ณด์ ๋๋ค.
์ ์ฝ ์กฐ๊ฑด์ ์ดํดํ๊ธฐ ์ด๋ ต๊ณ (๋๋ถ๋ถ) ์ด์ ๋ธ๋ฆฌ ์ฝ๋์ ์ค๋ณต๋ฉ๋๋ค. ๋ฌ์คํธ์ ๋ช ๋ น์ ์ถฉ๋ถํ ์์ธํ ๋ชจ๋ธ์ด ์๋ ํตํฉ ์ด์ ๋ธ๋ฌ๊ฐ ์๋ค๋ฉด ํผ์ฐ์ฐ์์ ๋ํ ์ ์ฝ ์กฐ๊ฑด์ ์ ์ถํ์ฌ ์ค๋ฅ์ ํผ๋์ ์์ธ์ ์ ๊ฑฐํ ์ ์์ต๋๋ค. ํ๋ก๊ทธ๋๋จธ๊ฐ ๋ช ๋ น์ด์ ํน์ ์ธ์ฝ๋ฉ์ ํ์๋ก ํ๋ ๊ฒฝ์ฐ ๋ช ์์ ์ ์ฝ ์กฐ๊ฑด์ ์ ๊ณตํด์ผ ํ์ง๋ง ์ผ๋ฐ์ ์ผ๋ก ์ด๊ฒ์ ํ์ํ์ง ์์ต๋๋ค.
Norman Ramsey์ Mary Fernรกndez๋ ์ด์ ๋ธ๋ฆฌ/๊ธฐ๊ณ์ด ์์ ๊ฐ๊ฒฐํ ๋ฐฉ์์ผ๋ก ์ค๋ช ํ๊ธฐ ์ํ ํ๋ฅญํ ์์ด๋์ด๊ฐ ์๋ New Jersey Machine Code Toolkit ์ ๋ํ ๋ช ๊ฐ์ง ๋ ผ๋ฌธ์ ์ ์ ํ์ต๋๋ค. ๊ทธ๋ค์ (Pentium Pro-era) iA-32 ๋ช ๋ น์ด ์ธ์ฝ๋ฉ์ ๋ค๋ฃน๋๋ค. ๊น๋ํ RISC ISA์ ๊ตญํ๋์ง ์์ต๋๋ค.
๊ฐ์ฅ ์ต๊ทผ์ ์์ ์ฃผ์์ ์ป์ ๊ฒฐ๋ก ์ ๋ค์ ๋ฐ๋ณตํ๊ณ ์ถ์ต๋๋ค.
๋์๊ฒ ์ด๊ฒ์ "์ง๊ธ ์ด๊ฒ์ ์์ ํํ๋ฉด ๋ฏธ๋์ ํํํ ๊ฒ์ ๋ณด์ฅํ ๊ฒ"์ ์ ์์ด๋ฉฐ "์ ๊ฐ์ค๋ฝ๊ฒ๋" ๋ฟ๋ง ์๋๋ผ "์๋ก์ด ์์คํ ์ ๊ตฌํํ๋ ๋ฐ ์ฌ๊ฐํ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ๊ฐ๋ฅ์ฑ์ด ๋งค์ฐ ๋์ ๋ณด์ ๋๋ค."
์ ๋์ ์ผ๋ก ์ต์ํ์ ์ด์(2)์ ํํํ ์ ์๋ค๊ณ ๊ตณ๊ฒ ๋ฏฟ์ต๋๋ค(์ผ๋ช "์์ ๋ ์ฑ๋"์์ ์์ ์ ์ ์). ๋ค๋ฅธ ์ด์์ ํ์ฌ ์๋นํ ๋์ Rust ์ปดํ์ผ๋ฌ์ ์์ ํ์ง์ ์ ํ์ํค๊ธฐ ๋๋ฌธ์ ํฌ๊ธฐํ๊ธฐ์๋ ๋งค์ฐ ์ฌํ ๊ฒ์ ๋๋ค.
@jcranmer ๋ ๋ค์
LLVM์ ํนํ LLVM์ ์ํด ์์ฑ๋์ง ์์ ๋ช ๋ น์ด์์ ์ด๋ค ๋ ์ง์คํฐ๊ฐ ํด๋ก๋ฒ๋ง๋๋์ง ์ค์ ๋ก ์๋ณํ๋ ์ค์ ๋ก ๋๋๊ฒ๋ ๋์ ์์ ์ ์ํํฉ๋๋ค. ์ด๊ฒ์ ์ฌ์ฉ์๊ฐ ํด๋ก๋ฒ๋ง๋๋ ๋ ์ง์คํฐ๋ฅผ ์๋์ผ๋ก ์ง์ ํ๋ ๊ฒ์ด ๊ฑฐ์ ํ์ํ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
์ค์ ๋ก๋ ํด๋ก๋ฒ ๋ชฉ๋ก์ ์ถ๋ก ํ๋ ๊ฒ์ด ์๋นํ ์ด๋ ค์ธ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๊ธฐ๊ณ์ด ์กฐ๊ฐ์ด ๋ ์ง์คํฐ๋ฅผ ์ฌ์ฉํ๋ค๊ณ ํด์ ๋ ์ง์คํฐ๋ฅผ ๋ฐฉํดํ๋ ๊ฒ์ ์๋๋๋ค. ์๋ง๋ ๊ทธ๊ฒ์ ์ ์ฅํ๊ณ ๋ณต์ํฉ๋๋ค. ๋ณด์์ ์ธ ์ ๊ทผ ๋ฐฉ์์ ์ฝ๋ ์์ฑ๊ธฐ๊ฐ ์ฌ์ฉํ๊ธฐ์ ์ข์ ๋ ์ง์คํฐ๋ฅผ ์ฌ์ฉํ์ง ๋ชปํ๊ฒ ํ ์ ์์ต๋๋ค.
@alexcrichton ์ ๋ค์
์ฐ๋ฆฌ๊ฐ ์๋ ํ LLVM์ ์์ ์ฑ์ ๋ณด์ฅํ์ง ์์ต๋๋ค. ์ฐ๋ฆฌ๋ LLVM์ ์ธ๋ผ์ธ ์ด์ ๋ธ๋ฆฌ ๊ตฌํ์ด ์ธ์ ๋ ์ง ๋ณ๊ฒฝ๋ ์ ์๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค.
LLVM ๋ฌธ์๋ "์ต์ ๋ฆด๋ฆฌ์ค๋ ์ด์ ๋ฆด๋ฆฌ์ค์ ๊ธฐ๋ฅ์ ๋ฌด์ํ ์ ์์ง๋ง ์๋ชป ์ปดํ์ผํ ์๋ ์์ต๋๋ค."๋ผ๊ณ ๋ณด์ฅํฉ๋๋ค. (IR ํธํ์ฑ๊ณผ ๊ด๋ จํ์ฌ). ์ด๋ ์ธ๋ผ์ธ ์ด์
๋ธ๋ฆฌ๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ ๋ฒ์๋ฅผ ์ ํํ๋ฉฐ, ์์์ ๋
ผ์ํ ๊ฒ์ฒ๋ผ ํ์ฌ ์ํฉ์์ ์๋ฏธ ์ฒด๊ณ๋ฅผ ๊ทผ๋ณธ์ ์ผ๋ก ๋ณ๊ฒฝํ๋ LLVM ์์ค์์ ์ค์ ๋ก ์คํ ๊ฐ๋ฅํ ๋์ฒดํ์ ์์ต๋๋ค(์: Poison ๋ฐ undef์ ๋ํ ์ง์์ ์ธ ๋ฌธ์ ์ ๋ฌ๋ฆฌ). ๋ฐ๋ผ์ ์ ์ฌ์ ์ธ ๋ถ์์ ์ฑ์ผ๋ก ์ธํด Rust asm!
๋ธ๋ก์ ๊ธฐ๋ฐ์ผ๋ก ์ฌ์ฉํ ์ ์๋ค๊ณ ๋งํ๋ ๊ฒ์ ๋ค์ ๋ถ์ ์งํฉ๋๋ค. ์ด์ ๊ทธ๊ฒ์ ๋ํด ๋ค๋ฅธ ๋ฌธ์ ๊ฐ ์๋ค๋ ๋ง์ ์๋๋๋ค(๊ฐ์ ๋์์ง๋ง ๋ฌธ์ ์ํ๊ฐ ์ข์ง ์์, ๋ถํธํจ์ ์ ์ฝํจ, ์ง๋จ์ด ์ข์ง ์์, ๋ ์ผ๋ฐ์ ์ธ ์๋๋ฆฌ์ค์ ๋ฒ๊ทธ๊ฐ ๋ง์์ ๋ ์ค๋ฅด๋ ๊ฒ์
๋๋ค).
์ค๋ ๋๋ฅผ ์ฝ์ ๋ ๊ฐ์ฅ ํฐ ๊ฑฑ์ ์ ์ฐ๋ฆฌ๊ฐ ์๋ฒฝ์ ์ ์ ์ ์ผ๋ก ๋ง๋๋ ๊ฒ์ ๋๋ค. ํนํ ์ฌ๋๋ค์ด asm ํ์๋ฅผ ํตํฉํ๊ณ LLVM๊ณผ ํจ๊ป ์๋ํ๋๋ก ํ๋ฉด ๋ ๋ง์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค๋ ์ฌ์ค์ ์๊ฒ ๋จ์ ๋ฐ๋ผ ์ผ๋ถ ๋ง์ DSL ์ค๊ฐ์๋ฅผ ์ฐพ๋ ๋ฐ ์ธ๋ผ์ธ asm์ ์ฌ์ฉํ ์ ์๋ ํ์์ผ๋ก ์จ๋ฆํ๋ ๋ฐ ๋ช ๋ ์ด ๊ฑธ๋ฆด ๊ฒ์ด๋ผ๊ณ ๊ฑฑ์ ํฉ๋๋ค. ์ฃ์ง ์ผ์ด์ค.
LLVM์ ์ค์ ๋ก ๋์์ ์ง์ ํ์ง ์์ ๊ธฐ๋ฅ์ ์๋ชป ์ปดํ์ผํ์ง ์์ ๊ฒ์ด๋ผ๊ณ ๋ณด์ฅํฉ๋๊น? ๋ณ๊ฒฝ ์ฌํญ์ด ์๋ชป ์ปดํ์ผ๋์๋์ง ์ฌ๋ถ๋ฅผ ์ด๋ป๊ฒ ๊ฒฐ์ ํ ์ ์์ต๋๊น? IR์ ๋ค๋ฅธ ๋ถ๋ถ์์๋ ๋ณผ ์ ์์์ง๋ง ์ด๊ฒ์ ๋ง์ ๊ฒ์ ๊ธฐ๋ํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
Clang์์๋ ๊ทธ๋ ๊ฒ ํ์ง ์๋๋ฐ LLVM์ ํ์์ผ๋ก ์์ ํํ๋ ๊ฒ์ด ์ด์ํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
Clang์ GCC์ฉ์ผ๋ก ์์ฑ๋ ์ฝ๋๋ฅผ ์ปดํ์ผํ๋ ๊ฒ์ ๋ชฉํ๋ก ํ๊ธฐ ๋๋ฌธ์ ๊ทธ๋ ๊ฒ ํ์ง ์์ต๋๋ค. Rustc๋ ๊ทธ๋ฐ ๋ชฉ์ ์ด ์์ต๋๋ค. GCC ํ์์ ์ธ์ฒด๊ณตํ์ ์ด์ง ์๊ธฐ ๋๋ฌธ์ ๊ถ๊ทน์ ์ผ๋ก ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ์ํ์ง ์๋๋ค๊ณ ์๊ฐํ์ง๋ง, ์ง๊ธ์ผ๋ก์๋ ๊ทธ๊ฒ์ด ๋ ๋์์ง ์ฌ๋ถ๋ ํ์คํ์ง ์์ต๋๋ค. ํ์ฌ Rust ํ์์ ์ฌ์ฉํ๋ ๋ง์ (์ผ๊ฐ) ์ฝ๋๊ฐ ์์ผ๋ฉฐ GCC ์คํ์ผ๋ก ๋ณ๊ฒฝํ๋ฉด ์ค๋จ๋ ์ ์์ผ๋ฏ๋ก ๋์ ๋๊ฒ ๋ ๋์ ๊ฒ์ ์๊ฐํด๋ผ ์ ์๋ ๊ฒฝ์ฐ์๋ง ๋ณ๊ฒฝํ ๊ฐ์น๊ฐ ์์ต๋๋ค.
์ต์ํ ๋น๋ฉ ๋ธ๋ก์ ์ ์ค๊ณ๋์ด์ผ ํฉ๋๋ค. ์ ์๊ฐ์๋
"expr" : foo : bar : baz
ํ์คํ ๊ทธ๋ ์ง ์์ต๋๋ค.
๋์. ์ต์ํ ์ ๋ ์ ์ฝ ์กฐ๊ฑด๊ณผ ํด๋ก๋ฒ๊ฐ ๋ชจ๋ ํ๋์ ๋ชฉ๋ก์ ์๋ ์์ LLVM ํ์์ ์ ํธํฉ๋๋ค. ํ์ฌ "=" ์ ๋์ฌ๋ฅผ ์ง์ ํ๊ณ ์ถ๋ ฅ ๋ชฉ๋ก์ ๋ฃ์ด์ผ ํ๋ ์ค๋ณต์ฑ์ด ์์ต๋๋ค. ๋ํ LLVM์ด ์ถ๋ ฅ์ด ํํ์์ ๊ฒฐ๊ณผ์ธ ํจ์ ํธ์ถ์ฒ๋ผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ๋ ์๊ฐํฉ๋๋ค. AFAIK ํ์ฌ asm!
๊ตฌํ์ "out" ๋งค๊ฐ๋ณ์๊ฐ ์๋ Rust์ ์ ์ผํ ๋ถ๋ถ์
๋๋ค.
LLVM์ ์ค์ ๋ก ์ด๋ค ๋ ์ง์คํฐ๊ฐ ํด๋ก๋ฒ๋ง๋๋์ง ์๋ณํ๋ ์ค์ ๋ก ๋งค์ฐ ๋์ ์์ ์ ์ํํฉ๋๋ค.
AFAIK LLVM์ ์ธ๋ผ์ธ ์ด์ ๋ธ๋ฆฌ์ ์ฃผ๋ ์ด์ ๊ฐ LLVM์ด ์ดํดํ์ง ๋ชปํ๋ ์ผ๋ถ ์ฝ๋๋ฅผ ํฌํจํ๊ธฐ ๋๋ฌธ์ ์ด ์์ ์ ์๋ํ์ง ์์ต๋๋ค. ์ค์ ์ด์ ๋ธ๋ฆฌ๋ฅผ ๋ณด์ง ์๊ณ ๋ ์ง์คํฐ ํ ๋น ๋ฐ ํ ํ๋ฆฟ ๋์ฒด๋ง ์ํํฉ๋๋ค. (๋ฌผ๋ก ๊ธฐ๊ณ์ด๋ฅผ ์์ฑํ๊ธฐ ์ํด ์ด๋ค ๋จ๊ณ์์ ์ค์ ๋ก ์ด์ ๋ธ๋ฆฌ๋ฅผ ํ์ฑํ์ง๋ง ๋์ค์ ์ผ์ด๋๋ค๊ณ ์๊ฐํฉ๋๋ค)
์ธ๋ถ ์ด์ ๋ธ๋ฌ๋ฅผ ์์ฑํ๋ ค๋ ๊ฒฝ์ฐ
ํตํฉ ์ธ๋ผ์ธ ์ด์ ๋ธ๋ฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋ํ ๋์์ด ์์ ์ ์๋์ง ํ์ ํ ์ ์์ต๋๋ค. LLVM์ด ๋ ์ง์คํฐ๋ฅผ ํ ๋นํ๋๋ก ํ๋ ๋ฐฉ๋ฒ์ด ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ๊ทธ๋ฌ๋ ์ ์ญ ์ด์ ๋ธ๋ฆฌ์ ๊ฒฝ์ฐ ์ธ๋ถ ์ด์ ๋ธ๋ฌ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
LLVM ์ธ๋ผ์ธ ์ด์ ๋ธ๋ฌ์ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ๊ณผ ๊ด๋ จํ์ฌ ์ฐ๋ฆฌ๋ Clang๊ณผ ๊ฐ์ ๋ณดํธ์ ์์ต๋๋ค. ์ฆ, ๋ณ๊ฒฝ ์ฌํญ์ด ์๋ ๊ฒฝ์ฐ ๋ณ๊ฒฝ ์ฌํญ์ด ๋ฐ์ํ์ ๋ ํด๊ฒฐํด์ผ ํฉ๋๋ค.
clang์ด ์ง์ํ๋ ์ธก๋ฉด์์ ์ ์๋ ๊ฒ์ ์์ ํํ๋ ค๋ฉด clang_asm!์ด๋ผ๊ณ ๋ถ๋ฌ์ผ ํฉ๋๋ค. ์์ ! name์ ๋ค๋ฅธ ์ฃผ์ Rust ๊ธฐ๋ฅ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์ ์ฒด RFC ํ๋ก์ธ์ค๋ฅผ ํตํด ์ค๊ณ๋ ๊ฒ์ผ๋ก ์์ฝ๋์ด์ผ ํฉ๋๋ค. #์์ ๊ฑฐ๋ณด๊ด์
๋๋ ๊ทธ๊ฒ์ ์ํด ๋ชจ๋ ์ ๋๋ค. +1
ํ์ฌ Rust ํ์์ ์ฌ์ฉํ๋ ๋ง์ (์ผ๊ฐ) ์ฝ๋๊ฐ ์์ผ๋ฉฐ GCC ์คํ์ผ๋ก ๋ณ๊ฒฝํ๋ฉด ์ค๋จ๋ ์ ์์ผ๋ฏ๋ก ๋์ ๋๊ฒ ๋ ๋์ ๊ฒ์ ์๊ฐํด๋ผ ์ ์๋ ๊ฒฝ์ฐ์๋ง ๋ณ๊ฒฝํ ๊ฐ์น๊ฐ ์์ต๋๋ค.
@parched ์์์ ์ธ์ฉํ @jimblandy ์ ์ ์์ ๋ฐ๋ฅด๋ฉด asm!
์ฌ์ฉํ๋ ์ฌ๋์ ๋๊ตฌ๋ ํ๋ณตํ๊ฒ ๊ณ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ค๋๋ ์ฐ๋ฆฌ๊ฐ ์๋ ํ ์ด ๊ธฐ๋ฅ์ ๋ํ ๋ฌธ์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์์ต๋๋ค. ์ฌ๊ธฐ์๋ LLVM ๋ด๋ถ ๋ฐ ๋ชจ๋ ๊ฒ์ด ํฌํจ๋ฉ๋๋ค.
GCC์ ์ด์ ๋ธ๋ฆฌ ๊ตฌ๋ฌธ์ด 30๋ ํ์๋ ์ง์ ๋๊ฑฐ๋ ๋ฌธ์ํ๋์ง ์์ ๊ฒฝ์ฐ, ๋ฌธ์ํ๋ ์ด์ ๋ธ๋ฆฌ ํ์ ์ธ์ด๋ฅผ ์์ฑํ๋ ๊ฒ์ด ๋๋ฌด ์ด๋ ค์์ ์ฐ๋ฆฌ์ ์ ํ๋ ๋ฆฌ์์ค๋ฅผ ๊ฐ์ํ ๋ Rust์ ๋ฅ๋ ฅ์ ๋์ด์๋ ์์ ์ด๋ผ๊ณ ๊ฐ์ ํ๋ ๊ฒ์ด ์์ ํด ๋ณด์ ๋๋ค. ์ด์ ๋ธ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ค๋ ์ฌ๋๋ค์ ๋จ์ํ ์ ๊ฒฝ ์ฐ์ง ์์ต๋๋ค.
์ฐ๋ฆฌ๊ฐ ์๋ ํ LLVM์ ์์ ์ฑ์ ๋ณด์ฅํ์ง ์์ต๋๋ค. ์ฐ๋ฆฌ๋ LLVM์ ์ธ๋ผ์ธ ์ด์ ๋ธ๋ฆฌ ๊ตฌํ์ด ์ธ์ ๋ ์ง ๋ณ๊ฒฝ๋ ์ ์๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค.
GCC/Clang์ ์ธ๋ผ์ธ ์ด์ ๋ธ๋ฆฌ ๊ตฌํ์ 90๋ ๋ ์ดํ ์์ฑ๋ ๋ชจ๋ C ์ฝ๋๋ฅผ ๊นจ๋จ๋ฆด ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋ณ๊ฒฝ๋ ๊ฐ๋ฅ์ฑ์ ๊ฑฐ์ ์์ต๋๋ค.
์ฌ์์ด ์์ผ๋ฉด ์ด์ ๋ํ ๋์ฒด ๋ฐฑ์๋๋ฅผ ์์์กฐ์ฐจ ํ๋ ๊ฒ์ด ๊ฑฐ์ ๋ถ๊ฐ๋ฅํฉ๋๋ค.
๋๋ดํด์ง ์ํ์ ๋ฌด๋ฆ ์ฐ๊ณ , ์ธ์ด๋ก์์ Rust๊ฐ ์ด์ ๋ธ๋ฆฌ์ ๋น ์ง๋ ๋นํน์ค๋ฌ์ด ๋ฌด๋ฅ๋ ฅ์ผ๋ก ์ธํด ์ด์๋จ์ง ๋ชปํ๋ค๋ฉด ๋์์ ์ธ ๋ฐฑ์๋์ ๋ํ ์ ๋ง์ ๋ฌด์๋ฏธํฉ๋๋ค. Nightly๋ LLVM ๋ณ๊ฒฝ์ ์ ๋ง๋ณด๋ค Rust์ ์์ ์ฑ ๋ณด์ฅ์ ์ฝํ์ํค๋ Nightly ๊ฐ Rust๋ผ๋ ์์ด๋์ด๋ฅผ ์๋ฌต์ ์ผ๋ก ์ง์งํ์ง ์๋ ํ Nightly๋ก ์ถฉ๋ถํ์ง ์์ต๋๋ค.
๋ค๋ฅธ ์ด์์ ํ์ฌ ์๋นํ ๋์ Rust ์ปดํ์ผ๋ฌ์ ์์ ํ์ง์ ์ ํ์ํค๊ธฐ ๋๋ฌธ์ ํฌ๊ธฐํ๊ธฐ์๋ ๋งค์ฐ ์ฌํ ๊ฒ์ ๋๋ค.
๋ด๊ฐ ๋งค์ผ Rust ๊ฐ๋ฐ์๋ค์ ํ๋์ ๊ทธ๋ค์ด ์ ์งํ๋ ์์ฒญ๋ ํ์ง ํ์ค์ ๊ฐ์ฌํ๋ค๊ณ ๋งํ๋ ๊ฒ์ ๊ฑฐ์ง๋ง์ด ์๋๋๋ค(์ฌ์ค ๋๋๋ก ๋๋ ์ฌ๋ฌ๋ถ์ด ๊ทธ ํ์ง์ ์ ์งํ ์ ์๋๋ก ์๋๋ฅผ ๋ฆ์ถ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค Brian์ฒ๋ผ ์์ ์ ํ์ฐ์ง ์๊ณ ). ๊ทธ๋ฌ๋ luqmana๊ฐ 4๋
์ ์ asm!
๋งคํฌ๋ก๋ฅผ ์ถ๊ฐ ํ์ ๋ ์ฌ๊ธฐ์ ์์๊ณ ์ดํ ์์ ํ์ ์ง์ ์ด ์์์ผ๋ฉฐ Rust์ ์ํธํ๊ฐ ์ฌ์ ํ ๋ถ๊ฐ๋ฅํ๊ณ SIMD๊ฐ Rust์์๋ ํฌ๋ก์ค ํ๋ซํผ ์ธํฐํ์ด์ค๊ฐ ์ฒ์ฒํ ๊ฒฐ์ ๋๋ ๋์ ํด๊ฒฐ ๋ฐฉ๋ฒ์กฐ์ฐจ ์์ต๋๋ค. ์ ๋ ๋๋ดํฉ๋๋ค. ๋ด๊ฐ ์ฌ๊ธฐ์์ ๊ฐ์กฐํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ ๊ฒ์ ์ด ๋ฌธ์ ๋ฅผ ํ๋ก์ ํธ์ ์์กด์ ๋ํ ์ค์กด์ ์ธ ๊ฒ์ผ๋ก ๋ณด๊ธฐ ๋๋ฌธ์
๋๋ค. ์ง๊ธ ๋น์ฅ์ ์๊ธฐ๊ฐ ์๋ ์๋ ์์ง๋ง, ๋ชจ๋ ๊ฒ์ ์์ ํํ๋ ๋ฐ๋ ์๊ฐ์ด ๊ฑธ๋ฆฌ๊ณ , ์ธ๊ณ ์์ค์ ์ด์
๋ธ๋ฆฌ ์ธ์ด๋ฅผ ์ฒ์๋ถํฐ ์ค๊ณํ๊ณ ๊ตฌํํ๋ ๋ฐ ๋ช ๋
์ด ๊ฑธ๋ฆฌ์ง ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ง๋ 4๋
๋์ ์ด์ ๋ํ ์ง์ ์ด ์์์ต๋๋ค.) Rust๋ 2018๋
์ธ์ ๊ฐ ์์ ์ ์ธ ์ธ๋ผ์ธ ์ด์
๋ธ๋ฆฌ ๊ฐ ํ์ํฉ๋๋ค. ์ด๋ฅผ ํด๋ด๋ ค๋ฉด ์ ํ ๊ธฐ์ ์ด ํ์ํฉ๋๋ค. macro_rules!
์ํฉ์ ๋๋ก๋ ๋ ๋์ ๊ฒ์ด ๋ ๋ซ๋ค๋ ๊ฒ์ ์ธ์ ํ์ต๋๋ค. ๋ค์ ํ๋ฒ, ๋๋ ๋๊ตฐ๊ฐ์๊ฒ ๋ด๊ฐ ํ๋ ธ๋ค๋ ๊ฒ์ ์ฆ๋ช
ํด๋ฌ๋ผ๊ณ ๊ฐ์ฒญํฉ๋๋ค.
FWIW ๋ฐ ํํฐ์ ๋ฆ๊ฒ ์ค๋ @florob ์ ํฅ์ ํ ํฌ๊ฐ ์ ์ํ ๊ฒ์ ์ข์ํฉ๋๋ค. ์ ๋ณด์ ๋ถ๋ค์ ์ํด ์์ง๋ ์ด๋ ์ต๋๋ค.
// Add 5 to variable:
let mut var = 0;
unsafe {
asm!("add $5, {}", inout(reg) var);
}
// Get L1 cache size
let ebx: i32;
let ecx: i32;
unsafe {
asm!(r"
mov $$4, %eax;
xor %ecx, %ecx;
cpuid;
mov %ebx, {};",
out(reg) ebx, out(ecx) ecx, clobber(eax, ebx, edx)
);
}
println!("L1 Cache: {}", ((ebx >> 22) + 1)
* (((ebx >> 12) & 0x3ff) + 1)
* ((ebx & 0xfff) + 1) * (ecx + 1));
๋ค์ ์ ๋ต์ ์ด๋ป์ต๋๊น? ํ์ฌ asm
์ llvm_asm
๋ณ๊ฒฝํ๊ณ (๋ํ ์ฝ๊ฐ์ ์ฝ๊ฐ์ ๋ณ๊ฒฝ์ด ์์ ์ ์์) ๋์์ด LLVM์ ๊ตฌํ ์ธ๋ถ ์ฌํญ์์ ๋ช
์ํ๋ฏ๋ก Rust ์์ ์ฑ ๋ณด์ฅ์ด ์์ ํ ํ์ฅ๋์ง ์์ต๋๊น? ๋ค๋ฅธ ๋ฐฑ์๋์ ๋ฌธ์ ๋ ์ฌ์ฉ๋๋ ๋ฐฑ์๋์ ๋ฐ๋ผ ์กฐ๊ฑด๋ถ ์ปดํ์ผ ๊ธฐ๋ฅ๊ณผ ๊ฐ์ target_feature
๋ค์ ํด๊ฒฐ๋์ด์ผ ํฉ๋๋ค. ์, ์ด๋ฌํ ์ ๊ทผ ๋ฐฉ์์ Rust ์์ ์ฑ์ ์ฝ๊ฐ ํ๋ฆฌ๊ฒ ๋ง๋ค์ง๋ง, ์ด์ ๊ฐ์ด ์ด์
๋ธ๋ฆฌ๋ฅผ ๋ถ์์ ํ ์ํ๋ก ์ ์งํ๋ฉด Rust ์์ฒด์ ์์์ ์ค๋๋ค.
๋๋ ๋ด๋ถ ํฌ๋ผ( https://internals.rust-lang.org/t/pre-rfc-inline-assembly/6443)์ ๋์ฒด ๊ตฌ๋ฌธ ์ ์๊ณผ ํจ๊ป ์ฌ์ RFC๋ฅผ ๊ฒ์ํ์ต๋๋ค. ํผ๋๋ฐฑ ํ์ํฉ๋๋ค.
๋ด๊ฐ ๋ณด๊ธฐ์ ์ต๊ณ ๋ ํ์คํ ์ฌ๊ธฐ์์ ๊ด์ฐฎ์ ์ข
๋ฅ์ ์ ์
๋๋ค. ๋ ๋์ ์๋ฃจ์
์ด ๊ฐ๋ฐ๋๋ ๋์ ํ์ฌ๋ก์๋ gcc_asm!
๋๋ clang_asm!
๋๋ llvm_asm!
๋งคํฌ๋ก(๋๋ ์ ์ ํ ํ์ ์งํฉ)๋ฅผ ํธํ ๊ฐ๋ฅํ ๊ตฌ๋ฌธ ๋ฐ ์๋ฏธ ์ฒด๊ณ๋ก ์์ ์ ์ผ๋ก ๊ณ ์ ํ๋ ๊ฒ์ ์ ์ ์ผ๋ก ์ง์ํฉ๋๋ค. . ํฐ ์ ์ง ๊ด๋ฆฌ ๋ถ๋ด์ผ๋ก ๊ทธ๋ฐ ๊ฒ์ ์์ํ ์ง์ํ๋ ๊ฒ์ ์๋๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์์์ ์ ์ํ ๋ณด๋ค ์ ๊ตํ ์์คํ
์ ๊ตฌ์ ๋งคํฌ๋ก๋ฅผ ์ ๋งคํฌ๋ก์ ๊ตฌ๋ฌธ ์ฌ์นด๋ฆฐ์ผ๋ก ๋ฐ๊พธ๋ ๊ฒ์ ๋งค์ฐ ์ฝ๊ฒ ์ง์ํ๋ ๊ฒ์ฒ๋ผ ๋ณด์
๋๋ค.
x86_64 popcntl
๋ช
๋ น์ด์ ๋ํ ์ธ๋ผ์ธ ์ด์
๋ธ๋ฆฌ๊ฐ ํ์ํ ๋ฐ์ด๋๋ฆฌ ํ๋ก๊ทธ๋จ http://[email protected]/BartMassey/popcount ๊ฐ ์์ต๋๋ค. ์ด ์ธ๋ผ์ธ ์ด์
๋ธ๋ฆฌ๋ ์ผ๊ฐ์ ์ด ์ฝ๋๋ฅผ ์ ์งํ๋ ์ ์ผํ ๊ฒ์
๋๋ค. ์ฝ๋๋ 12๋
๋ C ํ๋ก๊ทธ๋จ์์ ํ์๋์์ต๋๋ค.
์ง๊ธ ๋ด ์ด์ ๋ธ๋ฆฌ๋
#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
๊ทธ๋ฐ ๋ค์ popcnt
๊ฐ ์๋์ง ํ์ธํ๊ธฐ ์ํด cpuid
์ ๋ณด๋ฅผ ๊ฐ์ ธ์ต๋๋ค. Rust์ ์ต๊ทผ Google cpu_features ๋ผ์ด๋ธ๋ฌ๋ฆฌ https://opensource.googleblog.com/2018/02/cpu-features-library.html ๊ณผ ์ ์ฌํ ๊ฒ์ Rust์ ๊ฐ๋ ๊ฒ์ด ์ข๊ฒ ์ง๋ง c'est la vie.
๋ฌด์๋ณด๋ค ๋ฐ๋ชจ ํ๋ก๊ทธ๋จ์ด๊ธฐ ๋๋ฌธ์ ์ธ๋ผ์ธ ์ด์
๋ธ๋ฆฌ๋ฅผ ์ ์งํ๊ณ ์ถ์ต๋๋ค. ์ค์ ํ๋ก๊ทธ๋จ์ ๊ฒฝ์ฐ count_ones()
๋ด์ฅ์ผ๋ก ์ถฉ๋ถํฉ๋๋ค. ๋จ, popcntl
ํ๋ ค๋ฉด RUSTFLAGS
ํตํด Cargo์ "-C target-cpu=native"๋ฅผ ์ ๋ฌํด์ผ ํฉ๋๋ค. (๋ฌธ์ #1137 ๋ฐ ์ฌ๋ฌ ๊ด๋ จ ๋ฌธ์ ์ฐธ์กฐ) ๋ด ์์ค์ ํจ๊ป .cargo/config
๋ฅผ ๋ฐฐํฌํ๋ ๊ฒ์ ์ข์ ์๊ฐ์ด ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ฆ, ํ์ฌ Cargo๋ฅผ ํธ์ถํ๋ Makefile์ด ์๋ค๋ ๋ป์
๋๋ค.
๊ฐ๋จํ ๋งํด์ ์ค์ ์์ฉ ํ๋ก๊ทธ๋จ์์ Intel ๋ฐ ํ์ฌ์ ๋ฉ์ง popcount ๋ช
๋ น์ ์ฌ์ฉํ ์ ์์ผ๋ฉด ์ข๊ฒ ์ง๋ง ํ์ ์ด์์ผ๋ก ์ด๋ ค์ ๋ณด์
๋๋ค. ๋ณธ์ง์ด ์์ ํ ๋ต์ ์๋๋๋ค. ํ์ฌ asm!
๋ ์์ ์ ์ธ ์ํ์์ ์ฌ์ฉํ ์ ์๋ ๊ฒฝ์ฐ ๊ด์ฐฎ์ ๋ต๋ณ์
๋๋ค. ์ธ๋ผ์ธ ์ด์
๋ธ๋ฆฌ๋ฅผ ์ํ ๋ ๋์ ๊ตฌ๋ฌธ๊ณผ ์๋ฏธ ์ฒด๊ณ๊ฐ ์์ผ๋ฉด ์ข๊ฒ ์ง๋ง ์ค์ ๋ก ํ์ํ์ง๋ ์์ต๋๋ค. target-cpu=native
๋ฅผ Cargo.toml
์ง์ ์ง์ ํ ์ ์์ผ๋ฉด ์ข๊ฒ ์ง target-cpu=native
์ค์ ๋ก ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์ง๋ ์์ต๋๋ค.
์ฃ์กํฉ๋๋ค. ๋ด๊ฐ ์ ์ด๊ฒ์ ๊ด์ฌ์ด ์๋์ง ๊ณต์ ํ ์๊ฐ์ ๋๋ค.
@BartMassey ์ดํด๊ฐ ์
@BartMassey ์ด๋ฅผ ์ํด ์ธ๋ผ์ธ ์ด์
๋ธ๋ฆฌ๋ฅผ ์ฌ์ฉํ ํ์์กฐ์ฐจ ์์ต๋๋ค. coresimd
cfg_feature_enabled!("popcnt")
๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ด๋๋ฆฌ๊ฐ ์คํ๋๋ CPU๊ฐ popcnt
๋ช
๋ น์ ์ง์ํ๋์ง ์ฟผ๋ฆฌํ๊ธฐ
coresimd
๋ popcnt
๋ช
๋ น์ด ์ฌ์ฉ์ ๋ณด์ฅํ๋ popcnt
๋ด์ฅ ํจ์๋ ์ ๊ณตํฉ๋๋ค.
@gnzlbg
coresimd๋ ๋ํ popcnt ๋ช ๋ น์ ์ฌ์ฉํ๋๋ก ๋ณด์ฅ๋๋ popcnt ๋ด์ฅ์ ์ ๊ณตํฉ๋๋ค.
์ฝ๊ฐ ์ฃผ์ ์์ ๋ฒ์ด๋์ง๋ง ์ด ์ง์ ์ ์๋ฐํ ๋งํ๋ฉด ์ฌ์ค์ด ์๋๋๋ค. _popcnt64
๋ ๋ด๋ถ์ ์ผ๋ก leading_zeros
๋ฅผ ์ฌ์ฉํ๋ฏ๋ก popcnt
๊ธฐ๋ฅ์ด crate ์ฌ์ฉ์์ ์ํด ํ์ฑํ๋์ง ์๊ณ crate ์์ฑ์๊ฐ #![cfg(target_feature = "popcnt")]
์ฌ์ฉ์ ์์ด๋ฒ๋ฆฌ๋ฉด ์ด ๋ด์ฅ ํจ์๋ ๋ค์์ ์ป์ต๋๋ค. ๋นํจ์จ์ ์ธ ์ด์
๋ธ๋ฆฌ ๋ก ์ปดํ์ผ๋๊ณ ์ด์ ๋ํ ๋ณดํธ ์ฅ์น ๊ฐ
๋ฐ๋ผ์ popcnt ๊ธฐ๋ฅ์ด crate ์ฌ์ฉ์์ ์ํด ํ์ฑํ๋์ง ์๋ ๊ฒฝ์ฐ
๋ด์ฅ์ #[target_feature(enable = "popcnt")]
์์ฑ์ ์ฌ์ฉํ์ฌ crate ์ฌ์ฉ์๊ฐ ํ์ฑํ ๋๋ ๋นํ์ฑํํ๋ ๊ฒ๊ณผ ๋ฌด๊ดํ๊ฒ ๋ด์ฅ์ ๋ํ popcnt
๊ธฐ๋ฅ์ ๋ฌด์กฐ๊ฑด์ ์ผ๋ก ํ์ฑํํ๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ์ฌ๋ฐ๋ฅด์ง ์์ต๋๋ค. ๋ํ assert_instr(popcnt)
์์ฑ์ ๋ด์ฅ์ด Rust๊ฐ ์ง์ํ๋ ๋ชจ๋ x86
ํ๋ซํผ์์ popcnt
๋ก ๋ถํด๋๋๋ก ํฉ๋๋ค.
Rust๊ฐ ํ์ฌ ์ง์ํ์ง ์๋ x86
ํ๋ซํผ์์ Rust๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ, ์ด๋ฌํ ๋ด์ฅ ํจ์๊ฐ ํด๋น ๋์์์ popcnt
๋ฅผ ์์ฑํ๋๋ก core
๋ฅผ ์ด์ํ๋ ์ฌ๋์ ์ฑ
์์
๋๋ค.
ํธ์ง: @newpavlov
๋ฐ๋ผ์ popcnt ๊ธฐ๋ฅ์ด ํฌ๋ ์ดํธ ์ฌ์ฉ์์ ์ํด ํ์ฑํ๋์ง ์๊ณ ํฌ๋ ์ดํธ ์์ฑ์๊ฐ #![cfg(target_feature = "popcnt")] ์ฌ์ฉ์ ์์ด๋ฒ๋ฆฌ๋ฉด ์ด ๋ด์ฅ ํจ์๋ ๋นํจ์จ์ ์ธ ์ด์ ๋ธ๋ฆฌ๋ก ์ปดํ์ผ๋๊ณ ์ด์ ๋ํ ๋ณดํธ ์ฅ์น๊ฐ ์์ต๋๋ค.
์ ์ด๋ ๋ฌธ์ ์์ ์ธ๊ธํ ์์์ ์ด๋ ๊ฒ ํ๋ฉด ํ๋ก๊ทธ๋จ์ ์ ์๋์ง ์์ ๋์์ด ๋์ ๋๋ฉฐ ์ด ๊ฒฝ์ฐ ์ปดํ์ผ๋ฌ๋ ๋ฌด์์ด๋ ํ ์ ์์ต๋๋ค. ์๋ํ๋ ๋์ codegen์ ์ป์ ์ ์๋ ์ฌ๋ฌ ๊ฒฐ๊ณผ ์ค ํ๋์ ๋๋ค.
๋จผ์ ํ ๋ก ์ ์ฐจ์ง์ด ์๊ธด ์ ์ฌ๊ณผ๋๋ฆฝ๋๋ค. "์ ๋ gcc_asm! ๋๋ clang_asm! ๋๋ llvm_asm! ๋งคํฌ๋ก(๋๋ ์ ์ ํ ํ์ ์งํฉ)๋ฅผ ํธํ ๊ฐ๋ฅํ ๊ตฌ๋ฌธ ๋ฐ ์๋ฏธ ์ฒด๊ณ๋ก ์์ ์ ์ธ ์ํ๋ก ์ ์งํ๋ ๊ฒ์ ์ ์ ์ผ๋ก ์ง์ํฉ๋๋ค. ๊ทธ ๋์ ๋ ๋์ ์๋ฃจ์ ์ด ๊ฐ๋ฐ๋ฉ๋๋ค. "
์ธ๋ผ์ธ ์ด์
๋ธ๋ฆฌ์ ์์ ์ ์ด๊ฒ์ด popcount ๋ฒค์น๋งํฌ/๋ฐ๋ชจ๋ผ๋ ๊ฒ์
๋๋ค. ๊ฐ๋ฅํ ๊ฒฝ์ฐ ๊ธฐ์ค์ผ๋ก ๊ทธ๋ฆฌ๊ณ ์ธ๋ผ์ธ ์ด์
๋ธ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช
ํ๊ธฐ ์ํด ์ง์ ํ ๋ณด์ฅ๋ popcntl
๋ช
๋ น์ ์ํฉ๋๋ค. ๋ํ ๊ฐ๋ฅํ ๊ฒฝ์ฐ count_ones()
๊ฐ popcount ๋ช
๋ น์ ์ฌ์ฉํ์ฌ Rustc๊ฐ GCC ๋ฐ Clang์ ๋นํด ๋์ฐํด ๋ณด์ด์ง ์๋๋ก ๋ณด์ฅํ๊ณ ์ถ์ต๋๋ค.
target_feature=popcnt
์ง์ ํด ์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค. ์ฌ๊ธฐ์์ ์ด๋ป๊ฒ ์ฌ์ฉํ ์ง ๊ณ ๋ฏผํ๊ฒ ์ต๋๋ค. ์ฌ์ฉ์๊ฐ ์ปดํ์ผํ๋ CPU์ popcount ๋ช
๋ น์ด ์๋์ง ์ฌ๋ถ์ ๊ด๊ณ์์ด count_ones()
๋ฅผ ๋ฒค์น๋งํนํ๊ณ ์ถ์ต๋๋ค. ๋์ CPU์ popcount count_ones()
๊ฐ ์๋์ง ํ์ธํ๊ณ ์ถ์ต๋๋ค.
stdsimd
/ coresimd
์์๋ ๋ณด๊ธฐ์ ์ข๊ณ ์ด ๋ฒค์น๋งํฌ์ ๋ํด ํ์ฑํํด์ผ ํฉ๋๋ค. ๊ฐ์ฌ ํด์! ์ด ์ฑ์ ๊ฒฝ์ฐ ํ์ค ์ธ์ด ๊ธฐ๋ฅ ์ธ์ ๊ฐ๋ฅํ ํ ์ ๊ฒ ์ฌ์ฉํ๋ ๊ฒ์ ์ ํธํฉ๋๋ค(์ ๋ ์ด๋ฏธ lazy_static
๋ํด ์ฃ์ฑ
๊ฐ์ ๋๋ผ๊ณ ์์ต๋๋ค). ๊ทธ๋ฌ๋ ์ด๋ฌํ ์์ค์ ๋ฌด์ํ๊ธฐ์๋ ๋๋ฌด ์ข์ ๋ณด์ด๋ฉฐ "๊ณต์"์ด ๋๊ธฐ ์ํด ์ ๊ฐ๊ณ ์๋ ๊ฒ์ฒ๋ผ ๋ณด์
๋๋ค.
@nbp ์ ์ํด
์์์ ์ฝ๋ ๋ฐ์ดํธ๋ฅผ ํจ์ ๋ด์ ์์์ ์์น์ ์ฐ๊ฒฐํ๋ ๊ฒ์ ํจ์ฌ ๋ ์ฝ๊ฒ ํด๊ฒฐํ ์ ์๋ ๋ฌธ์ ์ฒ๋ผ ๋ณด์ ๋๋ค.
cc @eddyb
@nagisa ๋จ์ํ ๊ธฐ๊ณ์ด ์ฝ๋๊ฐ ์๋๋ผ ์ ๋ ฅ, ์ถ๋ ฅ ๋ฐ ํด๋ก๋ฒ ๋ ์ง์คํฐ์ ๋ํด์๋ ์ฃผ์ํด์ผ ํฉ๋๋ค. ASM ์ฒญํฌ๊ฐ %rax์ ํน์ ๋ณ์๋ฅผ ์ํ๊ณ %esi๋ฅผ ๋ฐฉํดํ๋ค๊ณ ๋งํ๋ฉด ์ฃผ๋ณ ์ฝ๋๊ฐ ์ ๋๋ก ์ฌ์๋๋์ง ํ์ธํด์ผ ํฉ๋๋ค. ๋ํ ๊ฐ๋ฐ์๊ฐ ์ปดํ์ผ๋ฌ๊ฐ ๋ ์ง์คํฐ๋ฅผ ํ ๋นํ๋๋ก ํ์ฉํ๋ ๊ฒฝ์ฐ ๊ฐ์ ํ๋ฆฌ๊ฑฐ๋ ์ด๋ํ๋ ๊ฒ์ ๋ฐฉ์งํ๊ธฐ ์ํด ํ ๋น์ ์ต์ ํํ๊ณ ์ถ์ ๊ฒ์ ๋๋ค.
@simias , ์ค์ ๋ก ๋ณ์๊ฐ ํน์ ๋ ์ง์คํฐ์ ์ฐ๊ฒฐ๋๋ ๋ฐฉ์๊ณผ ์ด๋ค ๋ ์ง์คํฐ๊ฐ
๋ฐ์ดํธ ์ํ์ค์ ๋ํ ํ์คํ๋ ์ด์ ๋ธ๋ฆฌ ํ๋ ์ด๋ฒ๋ฅผ ๋๋ผ์ด๋ฒ/ํ๋ก์์ ๋งคํฌ๋ก๋ก ์ด๋ํ๋ ๊ฐ์ฅ ์ฌ์ด ๋ฐฉ๋ฒ์ผ ๊ฒ์ ๋๋ค.
์ ์ ํ ์ธ๋ผ์ธ ์ด์ ๋ธ๋ฆฌ ๋์ ์ถ์ ๋ฐ์ดํธ๋ฅผ ์ฌ์ฉํ๋ ํ ๊ฐ์ง ๋ฌธ์ ๋ ์ปดํ์ผ๋ฌ์ ๋ ์ง์คํฐ ์ํ ์ด๋ฆ ๋ฐ๊พธ๊ธฐ๋ฅผ ์ํํ๋ ์ต์ ์ด ์๋ค๋ ๊ฒ์ ๋๋ค. ์ธ๋ผ์ธ ์ด์ ๋ธ๋ฆฌ๋ฅผ ์์ฑํ๋ ์ฌ๋๋ค๋ ๊ธฐ๋ํ์ง ์์ต๋๋ค.
๊ทธ๋ฌ๋ ์ปดํ์ผ๋ฌ๊ฐ ์ด๋ฅผ ์ฒ๋ฆฌํ๋๋ก ํ๋ ค๋ฉด ๋ ์ง์คํฐ ํ ๋น๊ณผ ํจ๊ป ์ด๋ป๊ฒ ์๋ํ ๊น์? ์๋ฅผ ๋ค์ด, GCC์ (๋์ฐํ) ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
asm ("leal (%1, %1, 4), %0"
: "=r" (five_times_x)
: "r" (x));
์ด์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์ปดํ์ผ๋ฌ๊ฐ ๋ ์ง์คํฐ๋ฅผ ํ ๋นํ๋๋ก ํ์ฌ ๊ฐ์ฅ ํธ๋ฆฌํ๊ณ ํจ์จ์ ์ธ ๊ฒ์ ์ ๊ณตํ ๊ฒ์ผ๋ก ๊ธฐ๋ํฉ๋๋ค. ์๋ฅผ ๋ค์ด x86 64์์ five_time_x
๊ฐ ๋ฐํ ๊ฐ์ด๋ฉด ์ปดํ์ผ๋ฌ๋ eax
ํ ๋นํ๊ณ x
๊ฐ ํจ์ ๋งค๊ฐ๋ณ์์ด๋ฉด ์ผ๋ถ ๋ ์ง์คํฐ์์ ์ด๋ฏธ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ฌผ๋ก ์ปดํ์ผ๋ฌ๋ ์ปดํ์ผ ์ํ์ค์์ ๊ฝค ๋ฆ๊ฒ ๋ ์ง์คํฐ๋ฅผ ํ ๋นํ๋ ๋ฐฉ๋ฒ๋ง ์ ํํ ์๊ณ ์์ต๋๋ค(ํนํ ๋จ์ํ ํจ์ ๋งค๊ฐ๋ณ์ ๋ฐ ๋ฐํ ๊ฐ๋งํผ ์ฌ์ํ์ง ์์ ๊ฒฝ์ฐ).
์ ์ํ ์๋ฃจ์ ์ด ์ด์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์๋ํฉ๋๊น?
@nbp ๋๋ ์ด ์ ์์ ์ฝ๊ฐ ํผ๋์ค๋ฝ๋ค๊ณ ๋งํด์ผ ํ๋ค.
์ฐ์ , ์ด์
๋ธ๋ฆฌ ์ธ์ด๋ฅผ ํ์คํํ๋ ๊ฒ์ ์ธ๋ผ์ธ ์ด์
๋ธ๋ฆฌ๋ก ๋ฌ์ฑํ๊ณ ์ ํ๋ ๊ฒ์ด ๊ฒฐ์ฝ ์๋์์ต๋๋ค. ์ ์ด๋ ๋์๊ฒ ์ ์ ๋ ํญ์ ์์คํ
์ด์
๋ธ๋ฌ๊ฐ ์ฌ์ฉํ๋ ์ด์
๋ธ๋ฆฌ ์ธ์ด๊ฐ ๋ฐ์๋ค์ฌ์ง ๊ฒ์ด๋ผ๋ ๊ฒ์ด์์ต๋๋ค.
๋ฌธ์ ๋ ์ด์
๋ธ๋ฆฌ๋ฅผ ๊ตฌ๋ฌธ ๋ถ์/์ด์
๋ธํ์ง ์๋ ๊ฒ์ด๋ฏ๋ก LLVM์ ์ฝ๊ฒ ์ ๋ฌํ ์ ์์ต๋๋ค.
๋ฌธ์ ๋ ํ
ํ๋ฆฟ ์ด์
๋ธ๋ฆฌ๋ฅผ ์ฑ์ฐ๊ณ (๋๋ ์ด๋ฅผ ์ํํ๋ ๋ฐ ํ์ํ ์ ๋ณด๋ฅผ LLVM์ ์ ๊ณต) ์
๋ ฅ, ์ถ๋ ฅ ๋ฐ ํด๋ก๋ฒ๋ฅผ ์ง์ ํ๋ ๊ฒ์
๋๋ค.
๋์ค์ ๋ฌธ์ ๋ ์ค์ ๋ก ๊ทํ์ ์ ์์ผ๋ก ํด๊ฒฐ๋์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ @simias ๊ฐ ์์ฒญํ๋ ๋ ์ง์คํฐ ํด๋์ค๋ฅผ ์ง์ํ์ง ์๊ฑฐ๋ ์ง์ํ ์ ์๊ธฐ ๋๋ฌธ์ ์ํ๋์ง๋ง ๊ตฌ์ฒด์ ์ธ ๋ ์ง์คํฐ๋ง ์ง์ํฉ๋๋ค.
์ ์ฝ ์กฐ๊ฑด์ด ํด๋น ํ์ฅ์ผ๋ก ๋จ์ํ๋๋ ์ง์ ์์ ์ค์ ๋ก "์ค์ " ์ธ๋ผ์ธ ์ด์
๋ธ๋ฆฌ๋ฅผ ์ง์ํ๋ ๊ฒ๋งํผ์ด๋ ์ฝ์ต๋๋ค. ์ฒซ ๋ฒ์งธ ์ธ์๋ (ํ
ํ๋ฆฟ์ด ์๋) ์ด์
๋ธ๋ฆฌ๋ฅผ ํฌํจํ๋ ๋ฌธ์์ด์ด๊ณ ๋ค๋ฅธ ์ธ์๋ ์ ์ฝ ์กฐ๊ฑด์
๋๋ค. ์ด๊ฒ์ LLVM์ ์ธ๋ผ์ธ ์ด์
๋ธ๋ฌ ํํ์์ ๋ค์ ์ฝ๊ฒ ๋งคํ๋ฉ๋๋ค.
๋ฐ๋ฉด์ ์์ ๋ฐ์ดํธ๋ฅผ ์ฝ์
ํ๋ ๊ฒ์ LLVM์์ ์ง์ํ๋ ๋ด๊ฐ ์๋ ํ(๋๋ LLVM IR ์ฐธ์กฐ ์ค๋ช
์์์ ์ ์ ์๋ ํ) ์๋๋๋ค. ๋ฐ๋ผ์ ๊ธฐ๋ณธ์ ์ผ๋ก LLVM IR์ ํ์ฅํ๊ณ ๋ณ๋์ ์์๋ฅผ ์ฌ์ฉํ์ฌ LLVM์ ์ด๋ฏธ ์๋ ๊ธฐ๋ฅ(์์คํ
์ด์
๋ธ๋ฆฌ ์กฐ๋ฆฝ)์ ๋ค์ ๊ตฌํํฉ๋๋ค.
@nbp
์ค์ ๋ก ๋ณ์๊ฐ ํน์ ๋ ์ง์คํฐ์ ์ฐ๊ฒฐ๋๋ ๋ฐฉ์๊ณผ ์ด๋ค ๋ ์ง์คํฐ๊ฐ ํด๋ก๋ฒ๋๋์ง๋ฅผ ์ง์ ํด์ผ ํ์ง๋ง ์ด ๋ชจ๋ ๊ฒ์ด ์ด์ ๋ธ๋ฆฌ ์ธ์ด๋ LLVM ์ด์ ๋ธ๋ฆฌ ์ธ์ด๋ฅผ ํ์คํํ๋ ๊ฒ๋ณด๋ค ์์ต๋๋ค.
์ด๋ป๊ฒ ํ๋ฉด ๋ ๊น์? ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๋ ฅ/์ถ๋ ฅ ๋ ์ง์คํฐ, ํด๋ก๋ฒ ๋ฑ์ด ๋ชจ๋ ์ด ๋ฐ์ดํธ ์ํ์ค ๋ด์์ ํ๋์ฝ๋ฉ๋๋ค๋ ๊ฒ์ ์๋ฏธํ๋ ํ๋์ฝ๋ฉ๋ ๋ ์ง์คํฐ๊ฐ ์๋ ๋ฐ์ดํธ ์ํ์ค๊ฐ โโ์์ต๋๋ค.
์ด์ Rust ๋ฐ์ด๋๋ฆฌ ์ด๋๊ฐ์ ์ด ๋ฐ์ดํธ๋ฅผ ์ฝ์ ํฉ๋๋ค. ์ด๋ค ๋ ์ง์คํฐ๊ฐ ์ ๋ ฅ/์ถ๋ ฅ์ธ์ง, ์ด๋ค ๋ ์ง์คํฐ๊ฐ ํด๋ก๋ฒ(clobbed)๋์๋์ง ๋ฑ์ ์ด๋ป๊ฒ Rustc์ ์๋ฆด ์ ์์ต๋๊น? ์ธ๋ผ์ธ ์ด์ ๋ธ๋ฆฌ๋ฅผ ์์ ํํ๋ ๊ฒ๋ณด๋ค ํด๊ฒฐํด์ผ ํ ๋ ์์ ๋ฌธ์ ๋ ๋ฌด์์ ๋๊น? ๋ด๊ฐ ๋ณด๊ธฐ์๋ ์ด๊ฒ์ด ์ธ๋ผ์ธ ์ด์ ๋ธ๋ฆฌ๊ฐ ํ๋ ์ผ์ ๋๋ค. ์์ฑ๋ ์ด์ ๋ธ๋ฆฌ์์ ์ ๋ ฅ/์ถ๋ ฅ ํด๋ก๋ฒ๋ฅผ ๋ ๋ฒ ์ง์ ํด์ผ ํ๊ณ ์ด๋ค ๋ฐฉ์์ผ๋ก๋ ์ด ์ ๋ณด๋ฅผ rustc์ ์ ๋ฌํด์ผ ํ๊ธฐ ๋๋ฌธ์ ์กฐ๊ธ ๋ ์ด๋ ค์ธ ์ ์์ต๋๋ค. ๋ํ, Rustc๋ ์ด๋ฅผ ๊ฒ์ฆํ๋ ๋ฐ ์ฌ์ด ์๊ฐ์ด ์์ ๊ฒ์ ๋๋ค. ์๋ํ๋ฉด ์ด๋ฅผ ์ํด์๋ ๋ฐ์ดํธ ์ํ์ค๋ฅผ ์ด์ ๋ธ๋ฆฌ๋ก ๊ตฌ๋ฌธ ๋ถ์ํ ๋ค์ ์ด๋ฅผ ๊ฒ์ฌํ ์ ์์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ด๊ฐ ๋ฌด์์ ๋์น๊ณ ์์ต๋๊น?
@simias
asm ("leal (%1, %1, 4), %0"
: "=r" (five_times_x)
: "r" (x));
์์ ๋ฐ์ดํธ๋ ๋ ์ง์คํฐ์ ์ํ ์ด๋ฆ ๋ณ๊ฒฝ์ ํ์ฉํ์ง ์๊ณ ๋ ์ง์คํฐ๋ ์์ ์ฝ๋ ์ํ์ค์ ์ํด ์ํ๋์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ถ๊ฐ๋ฅํฉ๋๋ค.
@ํ๋ก๋กญ
์ ์ด๋ ๋์๊ฒ ์ ์ ๋ ํญ์ ์์คํ ์ด์ ๋ธ๋ฌ๊ฐ ์ฌ์ฉํ๋ ์ด์ ๋ธ๋ฆฌ ์ธ์ด๊ฐ ๋ฐ์๋ค์ฌ์ง ๊ฒ์ด๋ผ๋ ๊ฒ์ด์์ต๋๋ค.
๋ด ์ดํด์ ๋ฐ๋ฅด๋ฉด ์์คํ ์ด์ ๋ธ๋ฌ์ ์์กดํ๋ ๊ฒ์ ์ฐ๋ฆฌ๊ฐ ์์กดํ๊ณ ์ถ์ ๊ฒ์ด ์๋๋ผ asm์ ์ผ๋ถ๋ก ํ์ฉ๋๋ ๊ฒฐํจ์ ๋๋ค! ๋งคํฌ๋ก. ๋ํ asm์ ์์กด! LLVM ๊ตฌ๋ฌธ์ด ๋๋ ๊ฒ์ ์ถ๊ฐ ๋ฐฑ์๋ ๊ฐ๋ฐ์ ๊ณ ํต์ค๋ฌ์ธ ๊ฒ์ ๋๋ค.
@gnzlbg
์ด๋ป๊ฒ ํ๋ฉด ๋ ๊น์? ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๋ ฅ/์ถ๋ ฅ ๋ ์ง์คํฐ, ํด๋ก๋ฒ ๋ฑ์ด ๋ชจ๋ ์ด ๋ฐ์ดํธ ์ํ์ค ๋ด์์ ํ๋์ฝ๋ฉ๋๋ค๋ ๊ฒ์ ์๋ฏธํ๋ ํ๋์ฝ๋ฉ๋ ๋ ์ง์คํฐ๊ฐ ์๋ ๋ฐ์ดํธ ์ํ์ค๊ฐ โโ์์ต๋๋ค.
์์ด๋์ด๋ ์ ๋ ฅ, ์ถ๋ ฅ ๋ฐ ํด๋ก๋ฒ๋ ๋ ์ง์คํฐ ๋ชฉ๋ก์ ๊ฐ๋ ๊ฒ์ ๋๋ค. ์ฌ๊ธฐ์ ์ ๋ ฅ์ (๋ณ๊ฒฝ ๊ฐ๋ฅํ) ์ฐธ์กฐ ๋๋ ๋ณต์ฌ์ ๊ด๋ จ๋ ๋ ์ง์คํฐ ์ด๋ฆ์ ํํ์ด๊ณ ํด๋ก๋ฒ๋ ๋ ์ง์คํฐ๋ ๋ ์ง์คํฐ ์ด๋ฆ์ ๋ชฉ๋ก์ด ๋ ๊ฒ์ ๋๋ค. ์ถ๋ ฅ์ ์ถ๋ ฅ ๋ ์ง์คํฐ์ ๋ชฉ๋ก์ด ๋ ๊ฒ์ด๋ฉฐ ๊ด๋ จ ์ ํ์ด ์๋ ๋ช ๋ช ๋ ๋ ์ง์คํฐ์ ํํ์ ํ์ฑํ ๊ฒ์ ๋๋ค.
fn swap(a: u32, b: u32) -> (u32, u32) {
unsafe{
asm_raw!{
bytes: [0x91],
inputs: [(std::asm::eax, a), (std::asm::ecx, b)],
clobbered: [],
outputs: (std::asm::eax, std::asm::ecx),
}
}
}
์ด ์ฝ๋ ์ํ์ค๋ ๋ค์๊ณผ ๊ฐ์ ์ผ๋ถ ์ปดํ์ผ๋ฌ ์ ์ฐจ ๋งคํฌ๋ก์ ์ถ๋ ฅ์ผ ์ ์์ต๋๋ค.
fn swap(a: u32, b: u32) -> (u32, u32) {
unsafe{
asm_x64!{
; <-- (eax, a), (ecx, b)
xchg eax, ecx
; --> (eax, ecx)
}
}
}
์ด๋ฌํ ์ํ์ค๋ ์ด๋ค ๊ธฐํธ๋ ์ฃผ์๋ ์ง์ ํฌํจํ ์ ์์ผ๋ฉฐ ๊ณ์ฐ๋์ด ๋ ์ง์คํฐ๋ก ์ ๊ณต๋์ด์ผ ํฉ๋๋ค. ๋์ค์ ๋ฐ์ดํธ ์ํ์ค ๋ด์ ์ผ๋ถ ๊ธฐํธ ์ฃผ์๋ฅผ ์ฝ์ ํ๋ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ์ ์์๋ผ ์ ์์ ๊ฒ์ด๋ผ๊ณ ํ์ ํฉ๋๋ค.
์ด ์ ๊ทผ ๋ฐฉ์์ ์ฅ์ ์ ๋ ์ง์คํฐ ๋ฐ ์ ์ฝ ์กฐ๊ฑด์ ๋ชฉ๋ก๋ง ํ์คํํ๋ฉด ๋๋ฉฐ ์ด๋ ํฅํ ๋ชจ๋ ๋ฐฑ์๋์์ ์ฝ๊ฒ ์ง์๋ ์ ์๋ค๋ ๊ฒ์ ๋๋ค.
@nbp
๋ด ์ดํด์ ๋ฐ๋ฅด๋ฉด ์์คํ ์ด์ ๋ธ๋ฌ์ ์์กดํ๋ ๊ฒ์ ์ฐ๋ฆฌ๊ฐ ์์กดํ๊ณ ์ถ์ ๊ฒ์ด ์๋๋ผ asm์ ์ผ๋ถ๋ก ํ์ฉ๋๋ ๊ฒฐํจ์ ๋๋ค! ๋งคํฌ๋ก. ๋ํ asm์ ์์กด! LLVM ๊ตฌ๋ฌธ์ด ๋๋ ๊ฒ์ ์ถ๊ฐ ๋ฐฑ์๋ ๊ฐ๋ฐ์ ๊ณ ํต์ค๋ฌ์ธ ๊ฒ์ ๋๋ค.
์ ํํ ํ๊ฐ๊ฐ ์๋ ๊ฒ ๊ฐ์๋ฐ์? x86 ์ด์ ๋ธ๋ฆฌ์ ๋ํ ๋ ๊ฐ์ง ๋ค๋ฅธ ๊ตฌ๋ฌธ์ ์ ์ธํ๊ณ ์ด์ ๋ธ๋ฆฌ ๊ตฌ๋ฌธ์ ๋๋ถ๋ถ ํ์ค์ด๋ฉฐ ์ด์ ๊ฐ๋ฅํฉ๋๋ค. ์์คํ ์ด์ ๋ธ๋ฌ์ ์ ์ผํ ๋ฌธ์ ๋ ์ต์ ์ง์นจ์ด ์๋ค๋ ๊ฒ์ผ ์ ์์ง๋ง ์ต์ ํํ ๊ฐ์น๊ฐ ์๋ ํ์ ์ํฉ์ ๋๋ค.
์ค์ ๋ฌธ์ ๋ ๋ ์ง์คํฐ ํ ๋น์ ๋ํ ์ ์ฐฉ์ ์ ๋๋ค. ๊ทธ๋ฌ๋ ์ค์ ์ด์ ๋ธ๋ฆฌ ๋ฌธ์์ด ์์ฒด์ ๊ดํ ํ ์ด๊ฒ์ ๋๊ตฐ๊ฐ๊ฐ ๋ฌธ์์ด ๋์ฒด ์์ ๊ณผ ์ผ๋ถ ๊ตฌ๋ฌธ ๋ถ์์ ์ํํด์ผ ํจ์ ์๋ฏธํ๋ฉฐ ์ด๋ฌํ ์ ํ์ ๋์ฒด๋ ๋ชจ๋ ์ถ์ ๋ฐฑ์๋์์ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์์ด์ผ ํฉ๋๋ค.
์ด ํญ๋ชฉ์ ๋ํ LLVM(๋๋ gcc)์ ๊ตฌ๋ฌธ์ด ์ฐ๋ ๊ธฐ๋ผ๋ ๋ฐ ๋์ํ์ง๋ง ๋ฏธ๋ฆฌ ์ปดํ์ผ๋ ๋ฐ์ดํธ๋ก ์ด๋ํ๋ฉด ๋ชจ๋ asm ํฌ๋ ์ดํธ๊ฐ ์ด์ ์ ์ฒด ์ด์ ๋ธ๋ฌ์ ์ ์ฒด ๋ ์ง์คํฐ ํ ๋น์๋ฅผ ์ค์นํด์ผ ํฉ๋๋ค(๋๋ ํ๋ก๊ทธ๋๋จธ๊ฐ ์๋์ผ๋ก ๋ ์ง์คํฐ๋ฅผ ํ ๋นํ๋๋ก ํจ). ์์คํ ์ด์ ๋ธ๋ฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๊ทธ ์์ ์์ ์ค์ ๋ก ๋ง์ ๊ฐ์น๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง ์์ต๋๋ค.
@jcranmer
... ํ์ง๋ง ๋ฏธ๋ฆฌ ์ปดํ์ผ๋ ๋ฐ์ดํธ๋ก ์ด๋ํ๋ค๋ ๊ฒ์ ๋ชจ๋ asm ํฌ๋ ์ดํธ๊ฐ ์ด์ ์ ์ฒด ์ด์ ๋ธ๋ฌ์ ์๋ง๋ ์ ์ฒด ๋ ์ง์คํฐ ํ ๋น์๋ฅผ ์ค์นํด์ผ ํ๊ฑฐ๋(๋๋ ํ๋ก๊ทธ๋๋จธ๊ฐ ๋ ์ง์คํฐ๋ฅผ ์๋์ผ๋ก ํ ๋นํ๋๋ก) ์์คํ ์ด์ ๋ธ๋ฌ๋ฅผ ์ฌ์ฉํ๋ ค๊ณ ์๋ํด์ผ ํ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
https://github.com/CensoredUsername/dynasm-rs
์ด ํฌ๋ ์ดํธ๋ ํ๋ฌ๊ทธ์ธ์ด ์ฒ๋ฆฌํ๋ ๋งคํฌ๋ก๋ฅผ ์ฌ์ฉํ์ฌ ์ด์ ๋ธ๋ฆฌ ์ฝ๋๋ฅผ ์ด์ ๋ธํ๊ณ ๋ฐํ์์ ์ฐ๊ฒฐ๋ ์์ ์ด์ ๋ธ๋ฆฌ ์ฝ๋์ ๋ฒกํฐ๋ฅผ ์์ฑํฉ๋๋ค.
@nbp ์๋ง๋ ๋ด ์ฌ์ฉ ์ฌ๋ก๋ ๋ ํนํ์ง๋ง ๋ ์ง์คํฐ ์ด๋ฆ ๋ณ๊ฒฝ์ด ๋ถ์กฑํ๊ณ ์ปดํ์ผ๋ฌ๊ฐ ๋ ์ง์คํฐ๋ฅผ ํ ๋นํ๋๋ก ํ๋ ๊ฒ์ ๋ด๊ฐ ๋ ์ง์คํฐ๋ฅผ ์ ํํ๋ ๋ฐ ๋งค์ฐ ์ด์ด
์ด์ ๋ธ๋ฆฌ blob์ด ์ฃผ๋ณ ์ปดํ์ผ๋ฌ ๋ฐฉ์ถ ์ด์ ๋ธ๋ฆฌ์ ์ ํตํฉ๋์ง ์์ผ๋ฉด ํจ์ ํธ์ถ์ ๋์ผํ ์ ํ์ ๋ ์ง์คํฐ๊ฐ ์์ผ๋ฏ๋ก ๋ ๋ฆฝ ์คํํ .s ์ด์ ๋ธ๋ฆฌ ํ์ผ์ ์ธ๋ถ C ์คํ์ผ ๋ฉ์๋์์ ASM ์คํ ์ ์ธ์๋ถํดํ๋ ๊ฒ์ด ์ข์ต๋๋ค. - ํ ๋น ์ ์ฝ. ์ด๊ฒ์ ์ด๋ฏธ ์ค๋๋ ์๋ํ์ง๋ง, Rustc์ ๋น๋ํ๋ฉด ๋ ๋ฆฝ ์คํํ ์ด์ ๋ธ๋ฆฌ ํ์ผ์ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๋น๊ตํ์ฌ ๋น๋ ์์คํ ์ ๋จ์ํํ ์ ์์ต๋๋ค. ๋ด๊ฐ ๋งํ๊ณ ์ ํ๋ ๋ฐ๋ IMO ๊ทํ์ ์ ์์ด ํ์ฌ ์ํฉ์ ๋นํด ์ฐ๋ฆฌ์๊ฒ ๊ทธ๋ค์ง ๋์์ด ๋์ง ์๋๋ค๋ ๊ฒ์ ๋๋ค.
๊ทธ๋ฆฌ๊ณ ASM ์ฝ๋๊ฐ ๋ง์ปค์ ์ํด ํด๊ฒฐ๋ ์ธ๋ถ ๊ธฐํธ๋ฅผ ํธ์ถํ๋ฉด ์ด๋ป๊ฒ ๋ ๊น์? ์ปดํ์ผ ํ๋ก์ธ์ค๊ฐ ๋๋ ๋๊น์ง ํด๋น ์ ๋ณด๋ฅผ ํด๊ฒฐํ ์ ์๊ธฐ ๋๋ฌธ์ ํด๋น ์ ๋ณด๋ฅผ ์ ๋ฌํด์ผ ํฉ๋๋ค. ๋ฐ์ดํธ ๋ฐฐ์ด๊ณผ ํจ๊ป ์ฐธ์กฐ๋ฅผ ์ ๋ฌํ๊ณ ๋ง์ปค๊ฐ ๋์ค์ ํด๊ฒฐํ๋๋ก ํด์ผ ํฉ๋๋ค.
@jcranmer
x86 ์ด์ ๋ธ๋ฆฌ์ ๋ํ ๋ ๊ฐ์ง ๋ค๋ฅธ ๊ตฌ๋ฌธ์ ์ ์ธํ๊ณ ์ด์ ๋ธ๋ฆฌ ๊ตฌ๋ฌธ์ ๋๋ถ๋ถ ํ์ค์ด๋ฉฐ ์ด์ ๊ฐ๋ฅํฉ๋๋ค.
๋ฌด์จ ๋ง์ธ์ง ์ดํด๊ฐ ์ ์ ๊ฐ๋๋ค. ๋ถ๋ช ํ ASM ๊ตฌ๋ฌธ์ ์ํคํ ์ฒ ๊ฐ์ ์ด์ํ ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋์ผํ ์ํคํ ์ฒ ๋ด์์๋ ์ธ์ด๊ฐ ์กฐํฉ๋๋ ๋ฐฉ์์ ๋ณ๊ฒฝํ๋ ๋ณํ๊ณผ ์ต์ ์ด ์๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค.
MIPS๋ฅผ ์๋ก ๋ค ์ ์์ต๋๋ค. ์ด์
๋ธ๋ฌ ๋์์ ์กฐ์ ํ๋ ๋ ๊ฐ์ง ์ค์ํ ๊ตฌ์ฑ ํ๋๊ทธ๊ฐ ์์ต๋๋ค: at
๋ฐ reorder
. at
๋ ์ด์
๋ธ๋ฌ๊ฐ ํน์ ์์ฌ ๋ช
๋ น์ด๋ฅผ ์ด์
๋ธํ ๋ AT
(์ด์
๋ธ๋ฌ ์์) ๋ ์ง์คํฐ๋ฅผ ์์์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋์ง ์ฌ๋ถ๋ฅผ ๋ํ๋
๋๋ค. ๋ช
์ ์ ์ผ๋ก ์ฌ์ฉํ๋ ์ฝ๋ AT
๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๋ฐ ํจ๊ป ์กฐ๋ฆฝํด์ผํฉ๋๋ค at
๋๋ ํด์ ๊ฒ์
๋๋ค.
reorder
๋ ์ฝ๋๊ฐ ๋ถ๊ธฐ ์ง์ฐ ์ฌ๋กฏ์ ์๋์ผ๋ก ์ฒ๋ฆฌํ๋์ง ๋๋ ์ฒ๋ฆฌํ ์ด์
๋ธ๋ฌ๋ฅผ ์ ๋ขฐํ๋์ง ์ ์ํฉ๋๋ค. ์๋ชป๋ reorder
์ค์ ์ผ๋ก ์ฝ๋๋ฅผ ์กฐํฉํ๋ฉด ๊ฑฐ์ ํ์คํ๊ฒ ๊ฐ์ง ๊ธฐ๊ณ ์ฝ๋๊ฐ ์์ฑ๋ฉ๋๋ค. MIPS ์ด์
๋ธ๋ฆฌ๋ฅผ ์์ฑํ ๋ ๋ถ๊ธฐ ๋ช
๋ น์ด ํฌํจ๋ ๊ฒฝ์ฐ ํญ์ ํ์ฌ ๋ชจ๋๋ฅผ ์๊ณ ์์ด์ผ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด reorder
๊ฐ ํ์ฑํ๋์ด ์๋์ง ๋ชจ๋ฅด๋ ๊ฒฝ์ฐ ์ด MIPS ๋ชฉ๋ก์ ์๋ฏธ๋ฅผ ์ ์ ์์ต๋๋ค.
addui $a0, 4
jal some_func
addui $a1, $s0, 3
32๋นํธ ARM ์ด์ ๋ธ๋ฆฌ์๋ Thumb/ARM ๋ณํ์ด ์์ผ๋ฏ๋ก ๋์์ผ๋ก ํ๋ ๋ช ๋ น์ด ์ธํธ๋ฅผ ์๋ ๊ฒ์ด ์ค์ํฉ๋๋ค(ํจ์ ํธ์ถ์์ ์ฆ์์์ ๋ณ๊ฒฝํ ์ ์์). ๋ ์ธํธ๋ฅผ ํผํฉํ๋ ๊ฒ์ ๋งค์ฐ ์ ์คํ๊ฒ ์ด๋ฃจ์ด์ ธ์ผ ํฉ๋๋ค. ARM ์ฝ๋๋ ๋ํ ์ผ๋ฐ์ ์ผ๋ก ์์์ PC ๊ธฐ์ค ๋ก๋๋ฅผ ์ฌ์ฉํ์ฌ ํฐ ์ฆ์ ๊ฐ์ ๋ก๋ํฉ๋๋ค. ์ฝ๋๋ฅผ ๋ฏธ๋ฆฌ ์ด์ ๋ธํ๋ ๊ฒฝ์ฐ ์ด๋ฌํ ๊ฐ์ด ๊ฐ๊น์ด ์์ด์ผ ํ์ง๋ง ์ค์ ๋ช ๋ น์ด๊ฐ ์๋๊ธฐ ๋๋ฌธ์ ์ด๋ฌํ ๊ฐ์ ์ ๋ฌํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์ฃผ์ํด์ผ ํฉ๋๋ค. ์ ์ ์ ๋ ์์น. ๋ค์๊ณผ ๊ฐ์ ์์ฌ ๋ช ๋ น์ด์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์์ต๋๋ค.
ldr r2, =0x89abcdef
๋ฐ๋ฉด MIPS๋ ์ฆ๊ฐ์ ์ธ ๊ฐ์ ๋ ๊ฐ์ 16๋นํธ ๊ฐ์ผ๋ก ๋ถํ ํ๊ณ lui/ori ๋๋ lui/andi ์ฝค๋ณด๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝํฅ์ด ์์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก li
/ la
์์ฌ ๋ช
๋ น์ด ๋ค์ ์จ๊ฒจ์ ธ ์์ง๋ง noreorder
์ฝ๋๋ฅผ ์์ฑํ๊ณ ์ง์ฐ ์ฌ๋กฏ์ ๋ญ๋นํ๊ณ ์ถ์ง ์๋ค๋ฉด ๋๋๋ก ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค. ๊ทธ๊ฒ์ ์์ผ๋ก ํ๋ฉด ์ฌ๋ฏธ์๋ ์ฝ๋๊ฐ ๋์ต๋๋ค.
.set noreorder
/* Display a message using printf */
lui $a0, %hi(hello)
jal printf
ori $a0, %lo(hello)
.data
hello:
.string "Hello, world!\n"
%hi
๋ฐ %lo
๊ตฌ๋ฌธ์ ๊ฐ๊ฐ hello
๊ธฐํธ์ ์์ 16๋นํธ ๋ฐ ํ์ 16๋นํธ์ ๋ํ ์ฐธ์กฐ๋ฅผ ์์ฑํ๋๋ก ์ด์
๋ธ๋ฆฌ์ ์ง์ํ๋ ๋ฐฉ๋ฒ์
๋๋ค.
์ผ๋ถ ์ฝ๋์๋ ๋งค์ฐ ๋ ํนํ ์ ๋ ฌ ์ ์ฝ ์กฐ๊ฑด์ด ํ์ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์์์ ์ธ๊ธํ ๊ฒ์ฒ๋ผ ์ปดํ์ผ ๊ณผ์ ์์ ์ด ์์ ์์ ํด๊ฒฐํ ์ ์๋ ์ธ๋ถ ๊ธฐํธ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
๋๋ ๋ด๊ฐ ์ ์์ง ๋ชปํ๋ ๋ค๋ฅธ ์ํคํ ์ฒ๋ค์ ๋ํ ํน์ง์ ์๊ฐํด๋ผ ์ ์๋ค๊ณ ํ์ ํฉ๋๋ค. ์ด๋ฌํ ์ด์ ๋ก ๋งคํฌ๋ก/DSL ์ ๊ทผ ๋ฐฉ์์ ๋ํด ๋งค์ฐ ๋๊ด์ ์ด๋ผ๊ณ ํ์ ํ ์ ์์ต๋๋ค. ์ฝ๋ ์ค๊ฐ์ ์์์ ๋ถํฌ๋ช ํ ๋ฌธ์์ด ๋ฆฌํฐ๋ด์ ๊ฐ๋ ๊ฒ์ด ๋งค์ฐ ์ฐ์ํ์ง ์๋ค๋ ๊ฒ์ ์ดํดํ์ง๋ง ์ ์ฒด ASM ๊ตฌ๋ฌธ์ ๋ น์ผ๋ก ํตํฉํ๋ ๊ฒ์ด ์ด๋ค ์์ผ๋ก๋ Rust์ ๋ํ ์ง์์ ์ถ๊ฐํ ๋ ์ถ๊ฐ์ ์ธ ๊ณจ์นซ๊ฑฐ๋ฆฌ๋ฅผ ์ ์ธํ๊ณ ์ฐ๋ฆฌ์๊ฒ ์ ๊ณตํ๋ ๊ฒ์ด ๋ฌด์์ธ์ง ์ค์ ๋ก ์์ง ๋ชปํฉ๋๋ค. ์๋ก์ด ์ํคํ ์ฒ.
์ด์ ๋ธ๋ฌ๋ฅผ ์์ฑํ๋ ๊ฒ์ ์ธ๋ป ๋ณด๋ฉด ์ฌ์ํด ๋ณด์ผ ์ ์์ง๋ง ๋ชจ๋ ์ํคํ ์ฒ์ ๋ชจ๋ ์ข , ํํ๋ ๋ฐ ๋จ์ ์ ์ง์ํ๋ ค๋ ๊ฒฝ์ฐ ๋งค์ฐ ๊น๋ค๋ก์ธ ์ ์์ต๋๋ค.
๋ฐ๋ฉด์ ๋ฐ์ธ๋ฉ๊ณผ ํด๋ก๋ฒ๋ฅผ ์ง์ ํ๋ ์ข์ ๋ฐฉ๋ฒ์ ๊ฐ๋ ๊ฒ์ ๋งค์ฐ ๊ฐ์น๊ฐ ์์ ๊ฒ์ ๋๋ค(gcc์... ์๋ฒฝํ ๊ตฌ๋ฌธ๊ณผ ๋น๊ตํ์ฌ).
์๋ ํ์ธ์ ์ฌ๋ฌ๋ถ,
๊ท์ฐฎ๊ฒ ํด์ ์ฃ์กํฉ๋๋ค. ์ ๋ 2์ผํธ๋ง ๋๋ฆฌ๊ณ ์ถ์์ต๋๋ค. ์ ๋ ์ฌ์ฉ์์ผ ๋ฟ์ด๊ณ ์ ๋ง ์์ค์์ด ๋ง๊ณ ์กฐ์ฉํ ์ฌ๋์ด๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ค, ๊ทธ๋ฆฌ๊ณ ์๋ก ์จ ์ฌ๋์ ๋๋ค. ์ ๋ ์ต๊ทผ์ Rust์ ๋์ฐฉํ์ง๋ง ์ด๋ฏธ ๊ทธ๊ฒ๊ณผ ์ฌ๋์.
ํ์ง๋ง ์ด ์กฐ๋ฆฝ์ ๋ฏธ์น ์ง์ ๋๋ค. ์ ๋ง์, 3๋ ์ ๊ฑธ์น ๋ํ์์ต๋๋ค. ์๋ง์ ์์ด๋์ด์ ๋ถํ์ด ์์์ง๋ง ์ต์ํ์ ํฉ์์ฒ๋ผ ๋ณด์ด์ง๋ ์์์ต๋๋ค. RFC๊ฐ ์๋ 3๋ , ๊ทธ๊ฒ์ ์ฃฝ์์ ๋๊ณผ ๊ฐ์ ๊ฒ ๊ฐ์ต๋๋ค. ์ ๋ ๊ฒธ์ํ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ฐ๋ฐ ์ค์ด๋ฉฐ(๋์ธ ๊ฐ์ ์์์์ ๊ตฌ์ฒดํ๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค), ์ ์๊ฒ(๊ทธ๋ฆฌ๊ณ ๋ น์ผ๋ก ์ด์ ๋ธ๋ฆฌ๋ฅผ ์์ฑํ๋ ๋ฐ ๊ด์ฌ์ด ์๋ ๋ค๋ฅธ ์ฌ๋์๊ฒ) ๊ฐ์ฅ ์ค์ํ ๊ฒ์ ์ค์ ๋ก ๋ค์์ ์ํํ ์ ์๋ ๊ฒ์ ๋๋ค. ํด! ๋ค์ ๋ ๋ชจ๋ ๊ฒ์ด ๋ฐ๋์ง ์์ ๊ฒ์ด๋ผ๋ ์ต์ํ์ ๋ณด์ฅ๊ณผ ํจ๊ป(์ด๊ฒ์ด ๋ถ์์ ํ ์ฑ๋, ํนํ ์ด ๋ํ๊ฐ ๋๋ฅผ ๋๋ผ๊ฒ ํ๋ ์ด์ ์ ๋๋ค).
์ฌ๊ธฐ ์๋ ๋ชจ๋ ์ฌ๋๋ค์ด ์ต์์ ์๋ฃจ์ ์ ์ํ๊ณ ์ธ์ ๊ฐ๋ ๋๊ตฐ๊ฐ๊ฐ ๊ทธ ์๋ฃจ์ ์ ๋ด๋์ ์๋ ์๋ค๋ ๊ฒ์ ์ดํดํฉ๋๋ค. ํ์ง๋ง ์ค๋์ ํ์ฌ ๋งคํฌ๋ก๊ฐ ๊ด์ฐฎ๋ค๊ณ ๋ฏฟ์ต๋๋ค(์, ์ด๋ค ๋ฉด์์ ์ฝ๊ฐ ์ ํ์ ์ผ ์ ์์ง๋ง ๋ฐ๋ผ๊ฑด๋ ๊ทธ๋ ๊ฒ ํ ์ ์๋ ๊ฒ์ ์์ต๋๋ค. ์ฆ๋ถ ๋ฐฉ์์ผ๋ก ํด๊ฒฐ). ์ด์ ๋ธ๋ฆฌ๋ฅผ ์์ฑํ๋ ๊ฒ์ ์์คํ ์ธ์ด์์ ๊ฐ์ฅ ์ค์ํ ๊ฒ๊ณผ ๋งค์ฐ ํ์ํ ๊ธฐ๋ฅ์ ๋๋ค. ์ด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋ ๋๊น์ง cpp_build์ ์์กดํ๋ ๊ฒ์ ๊ด์ฐฎ์ง๋ง ์๊ฐ์ด ๋ ์ค๋ ๊ฑธ๋ฆฌ๋ฉด ์์ํ ์์กด. ์ ๊ทธ๋ฐ์ง๋ ๋ชจ๋ฅด๊ฒ ์ง๋ง, ๊ทธ๊ฒ์ ๋นํฉ๋ฆฌ์ ์ธ ์๊ฐ์ด๋ผ๊ณ ๋ถ๋ฅด์ง๋ง ์ด์ ๋ธ๋ฆฌ๋ฅผ ํธ์ถํ๊ธฐ ์ํด cpp๋ฅผ ํธ์ถํด์ผ ํ๋ ๊ฒ์ด ์กฐ๊ธ ์ฌํ๋ค๋ ๊ฒ์ ์๊ฒ ๋์์ต๋๋ค. ์ ๋ ์์ํ ๋ น ์๋ฃจ์ ์ ์ํฉ๋๋ค.
FWIW Rust๋ ์ฌ๊ธฐ์์ ๊ทธ๋ ๊ฒ ํน๋ณํ์ง ์์ต๋๋ค. MSVC์๋ x86_64์ฉ ์ธ๋ผ์ธ asm๋ ์์ต๋๋ค. ๋ณ์๋ฅผ ํผ์ฐ์ฐ์๋ก ์ฌ์ฉํ ์ ์์ง๋ง x86์์๋ง ์๋ํ๋ ์ ๋ง ์ด์ํ ๊ตฌํ์ด ์์ต๋๋ค.
@josevalaad ์ธ๋ผ์ธ ์ด์ ๋ธ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๋ง์ํด ์ฃผ ์๊ฒ ์ต๋๊น?
์ฐ๋ฆฌ๋ ์ผ๋ฐ์ ์ผ๋ก ๋ค๋ฅธ ์ด์ ๋ก ์ผ๊ฐ์ ๋ฉ์ถ OS์ ๊ฐ์ ์ํฉ์์๋ง ์ฌ์ฉ๋๋ ๊ฒ์ ๋ณด๊ณ asm!
๋ฅผ ๊ฑฐ์ ์ฌ์ฉํ์ง ์์ผ๋ฏ๋ก asm!
์์ ํ๋ LLVM ์ธ๋ถ์์ ์ ์ ํ๊ฒ ์์กดํ ์ ์๊ณ ๋ชจ๋๋ฅผ ๊ธฐ์๊ฒ ํ ์ ์๋ ๊ฒ์ ์ค๊ณ ๋ฐ ๊ฐ๋ฐํ๋ ๋ฐ ์ถฉ๋ถํ ์ฐ์ ์์๊ฐ ์์ต๋๋ค.
๋ํ ๋๋ถ๋ถ์ ์์ ์ ๋ ธ์ถ๋ ํ๋ซํผ ๋ด์ฅ ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ฌ ์ํํ ์ ์์ต๋๋ค. x86 ๋ฐ x86_64 ๊ฐ ์์ ํ๋์์ผ๋ฉฐ ๋ค๋ฅธ ํ๋ซํผ์ด ์งํ ์ค์ ๋๋ค. ๋๋ถ๋ถ์ ์ฌ๋๋ค์ ์ด๊ฒ์ด ๋ชฉํ์ 95-99%๋ฅผ ๋ฌ์ฑํ ๊ฒ์ด๋ผ๊ณ ๊ธฐ๋ํฉ๋๋ค. ์ผ๋ถ ๋ด์ฅ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ์๋ก ๋ด ์์ ์ ํฌ๋ ์ดํธ ์ ํธ์คํค ๋ฅผ ๋ณผ ์ ์์ต๋๋ค.
์ธ๋ผ์ธ ์ด์ ๋ธ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ jemalloc PR์ ๋ณํฉํ์ฌ LLVM์ ์ฝ๋ ์์ฑ ๋ฒ๊ทธ๋ฅผ ํด๊ฒฐํ์ต๋๋ค( https://github.com/jemalloc/jemalloc/pull/1303) . ์ด ๋ฌธ์ (https://github.com/rust-lang/rust/issues/53232#issue-349262078)์์ ๋๊ตฐ๊ฐ jetscii ์์์์ ๋ฐ์ํ Rust(LLVM)์ ์ฝ๋ ์์ฑ ๋ฒ๊ทธ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ธ๋ผ์ธ ์ด์ ๋ธ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ต๋๋ค. ๋ ๋ค ์ง๋ 2์ฃผ ๋์ ๋ฐ์ํ์ผ๋ฉฐ ๋ ๊ฒฝ์ฐ ๋ชจ๋ ์ฌ์ฉ์๊ฐ ๋ด์ฅ ํจ์๋ฅผ ์๋ํ์ง๋ง ์ปดํ์ผ๋ฌ๊ฐ ์คํจํ์ต๋๋ค.
C ์ปดํ์ผ๋ฌ์ ๋ํ ์ฝ๋ ์์ฑ์ด ํ์ฉ๋์ง ์๋ ๊ฒฝ์ฐ ์ต์ ์ ๊ฒฝ์ฐ ์ฌ์ฉ์๋ ์ธ๋ผ์ธ ์ด์ ๋ธ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ณ C์์ ๊ณ์ ์์ ํ ์ ์์ต๋๋ค.
์ด๊ฒ์ด ์์ ์ ์ธ Rust์์ ์ผ์ด๋ ๋, ์ง๊ธ ์ฐ๋ฆฌ๋ ์ฌ๋๋ค์๊ฒ ๋ค๋ฅธ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ๋ถํ์คํ ์๊ฐ(์ข ์ข ๋ช ๋ ์ ๋)์ ๊ธฐ๋ค๋ฆฌ๋ผ๊ณ ๋งํด์ผ ํฉ๋๋ค. ๊ทธ๊ฒ์ ์ข์ง ์๋ค.
@eddyb ๊ธ์, ๋๋ ์์ ํ๋ ฌ ๋์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์์ฑ ์ค์ ๋๋ค. ๊ทธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์์ ์ ๋ BLAS๋ฅผ ๊ตฌํํ๊ณ ์์ต๋๋ค. ์๋ง๋ Rust์ ์ผ๋ถ LAPACK(์์ง ์๋) ๋ฃจํด์ผ ๊ฒ์ ๋๋ค. ์๋ํ๋ฉด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์์ํ Rust ๊ตฌํ์ด๊ธฐ๋ฅผ ์ํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ์์ง ์ฌ๊ฐํ์ง๋ ์์ง๋ง ์ด์จ๋ ๋๋ ์ฌ์ฉ์๊ฐ ํนํ GEMM ์์ ๊ณผ ํจ๊ป ํ์์ ์ธ asm ์๋์ ์ฌ๋ฏธ๋ฅผ ์ ํํ ์ ์๊ธฐ๋ฅผ ์ํ์ต๋๋ค. ํ์ํ ๋ชจ๋ ๊ฒ์ ๋๋ค), ์ต์ํ x86/x86_64์์. ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ด ์ ์ฒด ์ด์ผ๊ธฐ์ ๋๋ค. ๋ถ๋ช ํ ์ผ๊ฐ ์ฑ๋๋ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ธฐ๋ฅ ์์ ํ๋ผ๋ ์ค์ฉ์ ์ธ ๋ฐฉํฅ์ผ๋ก ์กฐ๊ธ ๋ฐ๊ณ ์ถ์์ต๋๋ค.
@shepmaster ๋ด์ฅ ํจ์๋ก๋ ์ถฉ๋ถํ์ง ์์ ์ฌ์ฉ ์ฌ๋ก๊ฐ _
์์ ์ ์ธ ์ธ๋ผ์ธ asm์ ์ค์ํ์ง๋ง ๋ด์ฅ ๊ธฐ๋ฅ๋ง์ผ๋ก๋ ์ถฉ๋ถํ์ง ์์ต๋๋ค.
๋ด ์๋ ์์ ์ ๋๊ตฐ๊ฐ๊ฐ ๋ ๋น ๋ฅธ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋๋ก ๋์ฐ๋ ค๋ ๊ฒ์ด์์ต๋๋ค. ๊ทธ๋ค์ ๋ด์ฅ ๊ธฐ๋ฅ๋ ์ฌ์ฉํ ์ ์๋ค๋ ์ฌ์ค์ ๋ํด ์ธ๊ธํ์ง ์์์ผ๋ฉฐ ์ด๊ฒ์ด ์ ๊ฐ ๊ณต์ ํ๋ ค๊ณ ํ๋ ์ ๋ถ์ ๋๋ค. ๋๋จธ์ง๋ ๋ฐฐ๊ฒฝ ์ ๋ณด์์ต๋๋ค.
์ ๋ ํน์ ๊ด์ ์ ์นํธํ๋ ๊ฒ๋ ์๋๋ฏ๋ก ์ ์ ๋ ผ์ํ๋ ค๊ณ ํ์ง ๋ง์ญ์์ค. ์ ๋ ์ด ๊ฒฝ์ฃผ์ ์๋ฌด๋ฐ ์ดํด๊ด๊ณ๊ฐ ์์ต๋๋ค. ๋๋ ๋จ์ง ํ์ฌ์ ๊ด์ ์ด ๋ด๊ฐ ์ดํดํ๋ ๋ฐ๋ฅผ ๋ฐ๋ณตํ๊ณ ์์ ๋ฟ์ ๋๋ค. ๋๋ ๊ฐ๊น์ด ์ฅ๋์ ๋ด์ฅ์ด ์์ ๊ฐ๋ฅ์ฑ์ด ๋งค์ฐ ๋์ ์ธ๋ผ์ธ ์ด์ ๋ธ๋ฆฌ๊ฐ ํ์ํ ํ๋ก์ ํธ์ ์ฐธ์ฌํ๊ณ ์๊ธฐ ๋๋ฌธ์ ์ด๋ ์ ๋ ์์ ์ ์ธ ์ธ๋ผ์ธ ์ด์ ๋ธ๋ฆฌ์ ๊ด์ฌ์ด ์์ง๋ง ์ผ๊ฐ ์ด์ ๋ธ๋ฆฌ๋ ๋๋ฅผ ํฌ๊ฒ ๊ดด๋กญํ์ง ์์ผ๋ฉฐ ์ด์ ๋ธ๋ฌ๋ฅผ ํธ์ถํ์ง๋ ์์ต๋๋ค.
์, ์ง๊ธ์ ์กฐ๋ฆฝ์ด ํ์ํ ๊ฒฝ์ฐ๊ฐ ์๊ณ ์์ํ ํ์ํ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค. ์๋๋๋ก ๋งํ์ต๋๋ค(๋ช ํ์ฑ์ ์ํด ๊ฐ์กฐํจ).
๋๋ถ๋ถ์ ์ฌ๋๋ค์ [๋ณธ์ง]์ด ๋ชฉํ์ 95-99% ๋ฅผ ๋ฌ์ฑํ ๊ฒ์ด๋ผ๊ณ ๊ธฐ๋ํฉ๋๋ค.
์์ ์ ์ธ ์ด์ ๋ธ๋ฆฌ๋ฅผ ๋ณด๊ณ ์ถ๋ค๋ฉด ๋๊ตฐ๊ฐ(๋๋ ์ฌ๋๋ค์ ๊ทธ๋ฃน)๊ฐ ์์ ๋ฐฉํฅ์ ๋ํด Rust ํ์ ์ผ๋ฐ์ ์ธ ํฉ์๋ฅผ ์ป์ ๋ค์ ๊ตฌํํ๊ธฐ ์ํด ๋ง์ ๋ ธ๋ ฅ์ ๊ธฐ์ธ์ฌ์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. .
์์ง ์ฌ๊ฐํ์ง๋ ์์ง๋ง ์ด์จ๋ ๋๋ ์ฌ์ฉ์๊ฐ ํนํ GEMM ์์ ๊ณผ ํจ๊ป ํ์์ ์ธ asm ์๋์ ์ฌ๋ฏธ๋ฅผ ์ ํํ ์ ์๊ธฐ๋ฅผ ์ํ์ต๋๋ค. ํ์ํ ๋ชจ๋ ๊ฒ์ ๋๋ค), ์ต์ํ x86/x86_64์์.
์ธ๋ผ์ธ ์ด์
๋ธ๋ฆฌ ์์ด๋ ์ก์ธ์คํ ์ ์๋ ์ก์ธ์ค ์ง์นจ์ด ๋ฌด์์ธ์ง ์ฌ์ ํ ์ดํดํ์ง ๋ชปํฉ๋๋ค. ์๋๋ฉด ์ฐ์ ๋ช
๋ น์ด์ ํน์ ์ํ์ค์
๋๊น?
๊ทธ๋ ๋ค๋ฉด ์ธ๋ผ์ธ ์ด์
๋ธ๋ฆฌ์ ๋ํด ๋๋ฑํ Rust ์์ค๋ฅผ ๋ฒค์น๋งํนํ์ต๋๊น?
์ธ๋ผ์ธ ์ด์ ๋ธ๋ฆฌ ์์ด๋ ์ก์ธ์คํ ์ ์๋ ์ก์ธ์ค ์ง์นจ
์, ์ํ์์ ์ด์ ๋ธ๋ฆฌ์ ๋ํด ์ด์ผ๊ธฐํ ๋ ๊ธฐ๋ณธ์ ์ผ๋ก _mm256_mul_pd, _mm256_permute2f128_pd ๋ฑ๊ณผ ๊ฐ์ SIMD ๋ ์ง์คํฐ ๋ฐ ๋ช ๋ น์ด ์ฌ์ฉ ๋ฐ ์งํ๋๋ ๋ฒกํฐํ ์์ ์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์์ต๋๋ค. ๋ฌธ์ ๋ ๋ฒกํฐํ์ ๋ํด ๋ค๋ฅธ ์ ๊ทผ ๋ฐฉ์์ ์ทจํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ๋ชฉํ๋ก ํ๋ ํ๋ก์ธ์์ ์ผ๋์ ๋๊ณ ์๋ ์ฉ๋์ ๋ํด ์ต์ ํ๋ ์ฑ๋ฅ์ ์ป์ ๋๊น์ง ์ฝ๊ฐ์ ์ํ์ฐฉ์ค๋ฅผ ๊ฑฐ์นฉ๋๋ค. ๋ฐ๋ผ์ ์ผ๋ฐ์ ์ผ๋ก ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ค์์ ์ง์๋๋ ๋ช ๋ น์ด ๋ฐ ๋ ์ง์คํฐ ์งํฉ์ ์๊ธฐ ์ํด asm ์ฝ๋๋ฅผ ์ฃผ์ ํ๋ ํ๋ก์ธ์์ ๋จผ์ ์ฟผ๋ฆฌํ ๋ค์ ์ํ asm ์ปค๋์ ํน์ ๋ฒ์ ์ ์กฐ๊ฑด๋ถ ์ปดํ์ผํด์ผ ํฉ๋๋ค.
๊ทธ๋ ๋ค๋ฉด ์ธ๋ผ์ธ ์ด์ ๋ธ๋ฆฌ์ ๋ํด ๋๋ฑํ Rust ์์ค๋ฅผ ๋ฒค์น๋งํนํ์ต๋๊น?
์ง๊ธ ๋น์ฅ์ ํน๋ณํ ํ ์คํธ๊ฐ ์๊ณ ํด๊ฐ ์ค์ด๋ฏ๋ก ๋ง์ด ์ฐธ์ฌํ์ง ์๋ ๊ฒ์ด ์ข์ต๋๋ค. ํ์ง๋ง 2์ฃผ ์ ๋ ์๊ฐ์ ์ฃผ์๋ฉด ์ฑ๋ฅ ๋น๊ต๋ฅผ ๊ฒ์ํ ์ ์์ต๋๋ค. ์ด์จ๋ ์ปดํ์ผ๋ฌ๊ฐ ์๋์ผ๋ก ์กฐ์ ๋ ์ด์ ๋ธ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ๋ฅํ ํ ๋นจ๋ฆฌ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํฉ๋๋ค. ํ์ํ ๊ฒฝ์ฐ ์๋ ๋ฃจํ ํ๊ธฐ ๋ฑ๊ณผ ๊ฐ์ ๊ณ ์ ์ ์ธ ์ฑ๋ฅ ๊ธฐ์ ์ ์ฌ์ฉํ๋๋ผ๋ ์ต์ํ C์์๋ ๋ถ๊ฐ๋ฅํ๋ฏ๋ก Rust์์๋ ๋ถ๊ฐ๋ฅํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
Taylor Cramer๊ฐ ์ฌ๊ธฐ์ ๊ฒ์ํ ๊ฒ์ ์ ์ํ์ต๋๋ค. ํ ๋ก ์ ํ์ฌ ์ํ๋ฅผ ํ์ ํ๊ธฐ ์ํด ๋ชจ๋ ์๊ฒฌ์ ์ฝ์ง ๋ชปํ ์ ์ ์ฉ์ํด ์ฃผ์ญ์์ค. ์ด๊ฒ์ ์ฐ๋ฆฌ์ ์ํฉ์ ๋ํ ์ง์ง์ ์ฑ๋ช ์ผ ๋ฟ์ ๋๋ค.
Google์ ๋ฒ ์ด๋ฉํ ํ๋ก์ ํธ์ ๊ฒฝ์ฐ ์ธ๋ผ์ธ ๋ฐ ๋ชจ๋ ์์ค ์ด์ ๋ธ๋ฌ ์์ ํ์ ๋ํ ์์ง์์ ๋ณด๊ณ ์ถ์ต๋๋ค. ๋์์ FFI๋ฅผ ์ฌ์ฉํ์ฌ ์์ ์ด์ ๋ธ๋ฆฌ๋ก ์์ฑ๋๊ณ ๋ณ๋๋ก ์กฐ๋ฆฝ๋๊ณ ๋ฐ์ด๋๋ฆฌ๋ก ํจ๊ป ์ฐ๊ฒฐ๋ ํจ์๋ฅผ ํธ์ถํ๋ ๊ฒ์ ๋๋ค.
์ฐ๋ฆฌ ๋ ์ด์ ๋ธ๋ฌ์์ ํจ์๋ฅผ ์ ์ํ๊ณ FFI๋ฅผ ํตํด ํธ์ถํ์ฌ ๋ณ๋์ ๋จ๊ณ์์ ์ฐ๊ฒฐํ ์ ์์ง๋ง ๋ณต์ก์ฑ๊ณผ ์ฑ๋ฅ ๋ฉด์์ ๋ชจ๋ ๋จ์ ์ด ์๊ธฐ ๋๋ฌธ์ ๋ ์ ์ ์ผ๋ก ์ํํ๋ ์ฌ๊ฐํ ๋ฒ ์ด๋ฉํ ํ๋ก์ ํธ๊ฐ ์๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค. Redox๋ 'asm!'์ ์ฌ์ฉํฉ๋๋ค. Linux, BSD, macOS, Windows ๋ฑ์ ์ผ๋ฐ์ ์ธ ์ฉ์์๋ ๋ชจ๋ ์ธ๋ผ์ธ ์ด์ ๋ธ๋ฌ๋ฅผ ๋ง์ด ์ฌ์ฉํฉ๋๋ค. ์ง๋ฅด์ฝ๊ณผ seL4๊ฐ ๊ทธ ์ญํ ์ ํฉ๋๋ค. ํ๋ 9์กฐ์ฐจ๋ ๋ช ๋ ์ Harvey ํฌํฌ์์ ์ด์ ๋ํด ๊ตด๋ณตํ์ต๋๋ค.
์ฑ๋ฅ์ด ์ค์ํ ํญ๋ชฉ์ ๊ฒฝ์ฐ ํธ์ถ๋ ํจ์์ ๋ณต์ก์ฑ์ ๋ฐ๋ผ ํจ์ ํธ์ถ ์ค๋ฒํค๋๊ฐ ์ง๋ฐฐ์ ์ผ ์ ์์ต๋๋ค. ๋ณต์ก์ฑ ์ธก๋ฉด์์ ๋ณผ ๋, ๋จ์ผ ๋ช ๋ น์ด๋ฅผ ํธ์ถํ๊ฑฐ๋, ๋ ์ง์คํฐ๋ฅผ ์ฝ๊ฑฐ๋ ์ฐ๊ฑฐ๋, ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ์ ๊ณต๊ฐ ํ๋ก๊ทธ๋๋จธ์๊ฒ ์จ๊ฒจ์ ธ ์๋ ๊ธฐ๊ณ ์ํ๋ฅผ ์กฐ์ํ๊ธฐ ์ํด ๋ณ๋์ ์ด์ ๋ธ๋ฌ ๊ธฐ๋ฅ์ ์ ์ํ๋ ๊ฒ์ ๋ ์ง๋ฃจํ ์์ฉ๊ตฌ๋ฅผ ์๋ชป ์ฌ์ฉํ๋ค๋ ์๋ฏธ์ ๋๋ค. ์ด์จ๋ ์ฐ๋ฆฌ๋ ์ด๊ฒ์ ํ๊ธฐ ์ํด Cargo๋ฅผ ์ฌ์ฉํ ๋(๋๋ ์ธ๋ถ ๋น๋ ์์คํ ์ด๋ ์ ์คํฌ๋ฆฝํธ ๋ฑ์ผ๋ก ๋ณด์ํด์ผ ํ ) ๋ ์ฐฝ์์ ์ด์ด์ผ ํฉ๋๋ค. ์๋ง๋ build.rs๊ฐ ์ฌ๊ธฐ์์ ๋์์ด ๋ ์ ์์ง๋ง ๋ง์ปค์ ๊ณต๊ธํ๋ ๊ฒ์ด ๋ ์ด๋ ค์ ๋ณด์ ๋๋ค.
๋ํ ๊ธฐํธ ์์์ ๊ฐ์ ์ด์ ๋ธ๋ฌ ํ ํ๋ฆฟ์ ์ฐ๊ฒฐํ๋ ๋ฐฉ๋ฒ์ด ์๋ค๋ฉด ๋งค์ฐ ์ข์ํ ๊ฒ์ ๋๋ค.
์ธ๋ผ์ธ ๋ฐ ๋ชจ๋ ์์ค ์ด์ ๋ธ๋ฌ ์์ ํ์ ๋ํ ์์ง์์ ๋ณด๊ณ ์ถ์ต๋๋ค.
๋ง์ง๋ง pre-RFC(https://internals.rust-lang.org/t/pre-rfc-inline-assembly/6443)๋ 6๊ฐ์ ์ ์(์ ์ด๋ ๋๋ถ๋ถ์ ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ ์ ๋ํด) ํฉ์๋ฅผ ์ป์์ผ๋ฏ๋ก ๋ค์ ๋จ๊ณ๋ ๊ทธ๊ฒ์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ RFC๋ฅผ ์ ์ถํ๋ ๊ฒ์ ๋๋ค. ์ด ์์ ์ ๋ ๋นจ๋ฆฌ ์ํํ๋ ค๋ฉด @Florob ์ ๋ฌธ์ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
๊ทธ๋งํ ๊ฐ์น๊ฐ ์๊ธฐ ๋๋ฌธ์ Windows์์ TEB ๊ตฌ์กฐ์ฒด์ ๋ํ ํฌ์ธํฐ๋ฅผ ์ป์ผ๋ ค๋ฉด FSGS ๋ ์ง์คํฐ์ ์ง์ ์ก์ธ์คํด์ผ ํฉ๋๋ค. ๋ํ bt
๋ฅผ ์์์ ๋ฉ๋ชจ๋ฆฌ ์์น์ ์ ์ฉํ๋ ค๋ฉด _bittest64
๊ฐ์ ๋ด์ฅ ํจ์๊ฐ ํ์ํฉ๋๋ค. ์ธ๋ผ์ธ ์ด์
๋ธ๋ฆฌ๋ extern ํธ์ถ ์์ด๋ ํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ฐพ์ง ๋ชปํ์ต๋๋ค.
์ฌ๊ธฐ์ ์ธ๊ธ ๋ ์ธ ๋ฒ์งธ ์์ ์ LLVM์ด ์ค์ ๋ก ๋ฌธ์ ๊ฐ ์๋ ๊ฒฝ์ฐ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ์ ๊ณตํ์ง ์๋ ๊ฒฝ์ฐ Just Crash๋ฅผ ์ ํธํ๊ธฐ ๋๋ฌธ์ ์ ์ ๊ด๋ จ์ด ์์ต๋๋ค.
@MSxDOS
๋ํ bt๋ฅผ ์์์ ๋ฉ๋ชจ๋ฆฌ ์์น์ ์ ์ฉํ๋ ค๋ฉด _bittest64์ ๊ฐ์ ๋ด์ฅ ํจ์๊ฐ ํ์ํฉ๋๋ค. ๋ ๋ค ์ธ๋ผ์ธ ์ด์ ๋ธ๋ฆฌ๋ extern ํธ์ถ ์์ด ์ํํ ๋ฐฉ๋ฒ์ ์ฐพ์ ์ ์์ต๋๋ค.
stdsimd
์ ์ถ๊ฐํ๋ ๊ฒ์ ์ด๋ ต์ง ์์์ผ ํฉ๋๋ค. clang์ ์ธ๋ผ์ธ ์ด์
๋ธ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฅผ ๊ตฌํํฉ๋๋ค(https://github.com/llvm-mirror/clang/blob/c1c07cca8cae5f924cedaac7b202b0f3c167111d/test/CodeGen/bittest-intrin .c#L45) ํ์ง๋ง std ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ด๋ฅผ ์ฌ์ฉํ๊ณ ๋ด์ฅ์ ์์ ํ Rust์ ๋
ธ์ถํ ์ ์์ต๋๋ค.
๋๋ฝ๋ ๋ด์ฅ ํจ์์ ๋ํด stdsimd ๋ฆฌํฌ์งํ ๋ฆฌ์์ ๋ฌธ์ ๋ฅผ ์ฌ๋ ๊ฒ์ด ์ข์ต๋๋ค.
@josevalaad
์, ์ํ์์ ์ด์ ๋ธ๋ฆฌ์ ๋ํด ์ด์ผ๊ธฐํ ๋ ๊ธฐ๋ณธ์ ์ผ๋ก _mm256_mul_pd, _mm256_permute2f128_pd ๋ฑ๊ณผ ๊ฐ์ SIMD ๋ ์ง์คํฐ ๋ฐ ๋ช ๋ น์ด ์ฌ์ฉ ๋ฐ ์งํ๋๋ ๋ฒกํฐํ ์์ ์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์์ต๋๋ค.
์, ๊ทธ๋ด์ง๋ ๋ชจ๋ฅธ๋ค๋ ์๊ฐ์ด ๋ค์๋ค. ์, ์๋ํด ๋ณด๊ณ ์ถ๋ค๋ฉด ์ด์
๋ธ๋ฆฌ๋ฅผ std::arch
๋ด์ฅ ํธ์ถ๋ก ๋ณํํ๊ณ ๋์ผํ ์ฑ๋ฅ์ ์ป์ ์ ์๋์ง ํ์ธํ ์ ์์ต๋๋ค.
๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ ๋ฌธ์ ๋ฅผ ์ ์ถํ์ญ์์ค. LLVM์ ๋ง๋ฒ์ด ์๋์ง๋ง ์ต์ํ ๋ด์ฅ ๊ธฐ๋ฅ์ asm๋งํผ ์ข์์ผ ํฉ๋๋ค.
@dancrossnyc ์ง๋ฌธํด๋ ๋ฉ๋๊น? ๊ทํ์ ์ํฉ์์ ํนํ ์ธ๋ผ์ธ ์ด์ ๋ธ๋ฆฌ๊ฐ ํ์ํ ์ฌ์ฉ ์ฌ๋ก/ํ๋ซํผ ๊ธฐ๋ฅ์ด ์์ต๋๊น?
@MSxDOS ์ด์ฉ๋ฉด "์ธ๊ทธ๋จผํธ" ๋ ์ง์คํฐ๋ฅผ ์ฝ๊ธฐ ์ํด ๋ด์ฅ ํจ์๋ฅผ ๋ ธ์ถํด์ผ ํ ๊น์?
์๋ง๋ ์ฐ๋ฆฌ๋ ๋ฐ์ดํฐ ์์ง์ ํ๊ณ ์ฌ๋๋ค ์ด asm!
๋ํด ์ ๋ง๋ก ์ํ๋ ๊ฒ์ด ๋ฌด์์ธ์ง ๋ถ์ํ๊ณ ๊ทธ ์ค ์ผ๋ง๋ ๋ง์ ๊ฒ์ด ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ์ง์๋ ์ ์๋์ง ํ์ธํด์ผ ํฉ๋๋ค.
์๋ง๋ ์ฐ๋ฆฌ๋ ๋ฐ์ดํฐ ์์ง์ ํ๊ณ ์ฌ๋๋ค์ด asm์ ์ง์ ์ผ๋ก ์ํ๋ ๊ฒ์ด ๋ฌด์์ธ์ง ๋ถ์ํด์ผ ํ ๊ฒ์ ๋๋ค!
๋ค์์ ์ํด asm!
๋ฅผ ์ํฉ๋๋ค.
asm!
๋ธ๋ก์ผ๋ก ์์ฑํ๋ ๊ฒ์
๋๋ค).๊ทธ๋ฆฌ๊ณ ๊ทธ ์ค ์ผ๋ง๋ ๋ง์ ๊ฒ์ด ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ์ง์๋ ์ ์๋์ง ํ์ธํ์ญ์์ค.
์ด๋ค ํํ์ ์ธ๋ผ์ธ ์ด์ ๋ธ๋ฆฌ๋ฅผ ํฌํจํ์ง ์๋ ์ ์ค ์ผ์ด์ค๋ฅผ ์ง์ํ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์์ง๋ง ๋ง์์ ์ด๋ ค ์์ต๋๋ค.
RFC ์ด์ ์ค๋ ๋์ ๋ด ๊ฒ์๋ฌผ์์ ๋ณต์ฌํ ๋ค์์ ํ์ฌ ํ๋ก์ ํธ์์ ์ฌ์ฉ ์ค์ธ ์ผ๋ถ ์ธ๋ผ์ธ ์ด์ ๋ธ๋ฆฌ(ARM64)์ ๋๋ค.
// Common code for interruptible syscalls
macro_rules! asm_interruptible_syscall {
() => {
r#"
# If a signal interrupts us between 0 and 1, the signal handler
# will rewind the PC back to 0 so that the interrupt flag check is
# atomic.
0:
ldrb ${0:w}, $2
cbnz ${0:w}, 2f
1:
svc #0
2:
# Record the range of instructions which should be atomic.
.section interrupt_restart_list, "aw"
.quad 0b
.quad 1b
.previous
"#
};
}
// There are other versions of this function with different numbers of
// arguments, however they all share the same asm code above.
#[inline]
pub unsafe fn interruptible_syscall3(
interrupt_flag: &AtomicBool,
nr: usize,
arg0: usize,
arg1: usize,
arg2: usize,
) -> Interruptible<usize> {
let result;
let interrupted: u64;
asm!(
asm_interruptible_syscall!()
: "=&r" (interrupted)
"={x0}" (result)
: "*m" (interrupt_flag)
"{x8}" (nr as u64)
"{x0}" (arg0 as u64)
"{x1}" (arg1 as u64)
"{x2}" (arg2 as u64)
: "x8", "memory"
: "volatile"
);
if interrupted == 0 {
Ok(result)
} else {
Err(Interrupted)
}
}
@Amanieu ๋ @japaric ์ด ARM์ฉ ๋ด์ฅ ๊ธฐ๋ฅ์ ์ํด ๋ ธ๋ ฅํ๊ณ ์๋ค๋ ์ ์ ์ ์ํ์ญ์์ค. ํด๋น ์ ์์ด ๊ทํ์ ์๊ตฌ ์ฌํญ์ ์ถฉ์กฑํ๋์ง ํ์ธํ ๊ฐ์น๊ฐ ์์ต๋๋ค.
@shepmaster
@Amanieu ๋ @japaric ์ด ARM์ฉ ๋ด์ฅ ๊ธฐ๋ฅ์ ๊ฐ๋ฐํ๊ณ ์๋ค๋ ์ ์ ์ฃผ๋ชฉํฉ๋๋ค. ํด๋น ์ ์์ด ๊ทํ์ ์๊ตฌ ์ฌํญ์ ์ถฉ์กฑํ๋์ง ํ์ธํ ๊ฐ์น๊ฐ ์์ต๋๋ค.
์ฃผ๋ชฉํ ๊ฐ์น๊ฐ ์์ต๋๋ค:
์ด ์์
์ ์ธ๋ผ์ธ ์ด์
๋ธ๋ฆฌ๋ฅผ ๋์ฒดํ์ง ์๊ณ ๋จ์ง ๋ณด์ํ ๋ฟ์
๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ std::arch
์์ ๊ณต๊ธ์
์ฒด API๋ฅผ ๊ตฌํํฉ๋๋ค. ์ด๋ฌํ API๋ ์ด๋ฏธ ์ผ๋ถ ์ฌ๋๋ค์๊ฒ๋ ์ถฉ๋ถํ์ง ์์ต๋๋ค.
์ด ์ ๊ทผ ๋ฐฉ์์ foo(); bar(); baz();
์ ๊ฐ์ ์ผ๋ จ์ ๊ณ ์ ํธ์ถ์ด ํด๋น ๋ช
๋ น์ด ์ํ์ค์ ๊ตฌ๋ณํ ์ ์๋ ์ฝ๋๋ฅผ ์์ฑํ ๋๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ฐ๋์ ๊ทธ๋ฐ ๊ฒ์ ์๋๋ฉฐ, ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ ์ฌ๋ฐ๋ฅธ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ ์ฝ๋๊ฐ ๊ธฐ๊ปํด์ผ ์๋ชป๋ ๊ฒฐ๊ณผ๋ฅผ ์์ฑํฉ๋๋ค. ์ ์๋์ง ์์ ๋์์ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, ์ต์
์ ๊ฒฐ๊ณผ๋ (์ฐ๋ฆฌ์์ด ๋๋ฌธ์ ๋ฒ๊ทธ๋ฅผํ๋ค x86
๋ฐ x86_64
์์ std
์ด๋ฏธ, ์๋ฅผ ๋ค์ด, https://github.com/rust- lang-nursery/stdsimd/blob/master/coresimd/x86/cpuid.rs#L108 - ๋ค๋ฅธ ์ํคํ
์ฒ์๋ ์ด๋ฌํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
์ผ๋ถ ๋ด์ฅ ํจ์์๋ ํจ์ ํธ์ถ์ ํตํด ์ ๋ฌํ ์ ์๋ ์ฆ์ ๋ชจ๋ ์ธ์๊ฐ ์์ผ๋ฏ๋ก foo(3)
๊ฐ ์๋ํ์ง ์์ต๋๋ค. ์ด ๋ฌธ์ ์ ๋ํ ๋ชจ๋ ์๋ฃจ์
์ ํ์ฌ ์๋ฑํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด๋ฉฐ ์ด๋ค ๊ฒฝ์ฐ์๋ ํ์ฌ Rust์์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ๋ถ๊ฐ๋ฅํ๋ฏ๋ก ์ด๋ฌํ ๋ด์ฅ ๊ธฐ๋ฅ ์ค ์ผ๋ถ๋ฅผ ์ ๊ณตํ์ง ์์ต๋๋ค.
๋ฐ๋ผ์ ๊ณต๊ธ์
์ฒด API๊ฐ Rust์์ ๊ตฌํ ๊ฐ๋ฅํ๊ณ std::arch
์์ ์ฌ์ฉ ๊ฐ๋ฅํ๊ณ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๊ฒฐํฉ๋ ์ ์๋ค๋ฉด ์ธ๋ผ์ธ ์ด์
๋ธ๋ฆฌ๋ณด๋ค ๋ซ๋ค๋ ๋ฐ ๋์ํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋๋๋ก API๋ฅผ ์ฌ์ฉํ ์ ์๊ฑฐ๋ ๊ตฌํํ ์ ์๊ฑฐ๋ ์ฌ๋ฐ๋ฅด๊ฒ ๊ฒฐํฉํ ์ ์์ต๋๋ค. ํฅํ "๊ตฌํ์ฑ ๋ฌธ์ "๋ฅผ ์์ ํ ์ ์์ง๋ง ์ํ๋ ์์
์ด ๊ณต๊ธ์
์ฒด API์ ์ํด ๋
ธ์ถ๋์ง ์๊ฑฐ๋ API๋ฅผ ๊ฒฐํฉํ ์ ์๋ ๊ฒฝ์ฐ ์ด ์ ๊ทผ ๋ฐฉ์์ ๋์์ด ๋์ง ์์ต๋๋ค.
LLVM์ ๋ด์ฅ ํจ์(ํนํ SIMD) ๊ตฌํ์ ๋ํด ๋งค์ฐ ๋๋ผ์ด ์ ์ ๋ด์ฅ ํจ์๋ฅผ ๋ช ๋ น์ ๋ํ Intel์ ๋ช ์์ ๋งคํ์ ์ ํ ์ค์ํ์ง ์๋๋ค๋ ๊ฒ์ ๋๋ค. ์ฆ, ๊ด๋ฒ์ํ ์ปดํ์ผ๋ฌ ์ต์ ํ๊ฐ ์ ์ฉ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด ๋ฉ๋ชจ๋ฆฌ์์ ๋ก๋ํ๋ ๋์ ๋ค๋ฅธ ์์์์ ์ผ๋ถ ์์๋ฅผ ๊ณ์ฐํ์ฌ ๋ฉ๋ชจ๋ฆฌ ์๋ ฅ์ ์ค์ด๋ ค๊ณ ์๋ํ ์ ์ด ์์ต๋๋ค. ๊ทธ๋ฌ๋ LLVM์ ๋ด๊ฐ ํผํ๋ ค๊ณ ํ๋ ์ ํํ ๋ฉ๋ชจ๋ฆฌ ๋ก๋๋ก ์ ์ฒด๋ฅผ ๋ค์ ์ผ์ ํ๊ฒ ์ ๊ธฐ ์์ํ์ต๋๋ค. ๋ค๋ฅธ ๊ฒฝ์ฐ์๋ port5 ์๋ ฅ์ ์ค์ด๊ธฐ ์ํด 16๋นํธ ์ ํ์ 8๋นํธ ์ ํ๋ก ๊ต์ฒดํ๋ ๋ฐฉ๋ฒ์ ์กฐ์ฌํ๊ณ ์ถ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋์๋ ์งํ๋ก ํญ์ ๋์์ด๋๋ LLVM ์ต์ ํ ํ๋ก๊ทธ๋จ์ ๋ด 8๋นํธ ์ ํ์ด ์ค์ ๋ก 16๋นํธ ์ ํ์์ ์์์ฐจ๋ฆฌ๊ณ ์ด๋ฅผ ๋์ฒดํ์ต๋๋ค.
๋ ์ต์ ํ ๋ชจ๋ ํ์คํ ๋ ๋์ ์ฒ๋ฆฌ๋(ํนํ ํ์ดํผ์ค๋ ๋ฉ์ ๊ฒฝ์ฐ)์ ์ ๊ณตํ์ง๋ง ๋ด๊ฐ ๋ฌ์ฑํ๊ธฐ๋ฅผ ๋ฐ๋๋ ๋๊ธฐ ์๊ฐ ๊ฐ์๋ ์๋๋๋ค. ๋๋ ๊ฒฐ๊ตญ ๊ทธ ์คํ์ ์ํด nasm์ผ๋ก ๋จ์ด์ก์ง๋ง ๋ด์ฅ ์ฝ๋์์ ์ผ๋ฐ asm์ผ๋ก ์ฝ๋๋ฅผ ๋ค์ ์์ฑํด์ผ ํ๋ ๊ฒ์ ๋ถํ์ํ ๋ง์ฐฐ์ด์์ต๋๋ค. ๋ฌผ๋ก ๋๋ ์ตํฐ๋ง์ด์ ๊ฐ ์ผ๋ถ ๊ณ ๊ธ ๋ฒกํฐ API๋ฅผ ์ฌ์ฉํ ๋ ๋ช ๋ น์ด ์ ํ์ด๋ ์์ ํด๋ฉ๊ณผ ๊ฐ์ ๊ฒ๋ค์ ์ฒ๋ฆฌํ๊ธฐ๋ฅผ ์ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ฌ์ฉํ ๋ช ๋ น์ ๋ช ์์ ์ผ๋ก ๊ฒฐ์ ํ์ ๋ ์ปดํ์ผ๋ฌ๊ฐ ์ด๋ฅผ ์ด์ง๋ฝํ๋ ๊ฒ์ ์ ๋ง๋ก ์ํ์ง ์์ต๋๋ค. ์ ์ผํ ๋์์ ์ธ๋ผ์ธ asm์ ๋๋ค.
๋ฐ๋ผ์ ๊ณต๊ธ์ ์ฒด API๊ฐ Rust์์ ๊ตฌํ ๊ฐ๋ฅํ๊ณ
std::arch
์์ ์ฌ์ฉ ๊ฐ๋ฅํ๊ณ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๊ฒฐํฉ๋ ์ ์๋ค๋ฉด ์ธ๋ผ์ธ ์ด์ ๋ธ๋ฆฌ๋ณด๋ค ๋ซ๋ค๋ ๋ฐ ๋์ํฉ๋๋ค.
๊ทธ๊ฒ ๋ด๊ฐ ๋ง์ ๋ดค๋๋ฐ ์ ๋ถ ์ฒ์
๋ชฉํ์ 95-99% ๋ฌ์ฑ
์, ์ง๊ธ์ ์กฐ๋ฆฝ์ด ํ์ํ ๊ฒฝ์ฐ๊ฐ ์๊ณ ์์ํ ํ์ํ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค. ์๋๋๋ก ๋งํ์ต๋๋ค(๋ช ํ์ฑ์ ์ํด ๊ฐ์กฐํจ).
๋๋ถ๋ถ์ ์ฌ๋๋ค์ [๋ณธ์ง]์ด ๋ชฉํ์ 95-99%๋ฅผ ๋ฌ์ฑํ ๊ฒ์ด๋ผ๊ณ ๊ธฐ๋ํฉ๋๋ค.
์ด๊ฒ์ @eddyb ๊ฐ ๋ณ๋ ฌ๋ก ๋งํ๋ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค. ๋๋ ํ์ฌ ์ํฉ์ ํ์ค ์ ์ง์ ํ๋ ค๊ณ ํ๋ฉด์ ์ธ๋ผ์ธ ์ด์ ๋ธ๋ฆฌ์ ์ ์ฉ์ฑ์ ์์ ํ ๋ฌด์ํ๋ ๊ฒ์ฒ๋ผ ์ฌ๋ฌ ์ฌ๋๋ค์ด ํ๋ํ๋ ์ด์ ๊ฐ ํ์คํ์ง ์์ต๋๋ค.
๋๋
์ด๊ฒ์ ๋งค์ฐ ๋ช ํํ๊ฒ ๋งํ๊ฒ ์ต๋๋ค. ์, ์ธ๋ผ์ธ ์ด์ ๋ธ๋ฆฌ๊ฐ ๋๋๋ก ํ์ํ๊ณ ์ข์ต๋๋ค . ๋๋ ๊ทธ๊ฒ์ ์ฃผ์ฅํ์ง ์์ต๋๋ค. ์ ๋ ์ฌ๋๋ค์ด ํ์ฌ ์ฌ์ฉ ๊ฐ๋ฅํ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ค์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ๋์์ ์ฃผ๋ ค๊ณ ํ ๋ฟ์ ๋๋ค.
๋ด๊ฐ ๋งํ๋ ค๊ณ ํ๋ ๊ฒ์ ์ฐ๋ฆฌ๊ฐ ์ด์ ๋ํด ์ข ๋ ์กฐ์ง์ ์ธ ์ ๊ทผ ๋ฐฉ์, ์ ์ ํ ์ค๋ฌธ์กฐ์ฌ๋ฅผ ํด์ผ ํ๊ณ ์ด ์ค๋ ๋์์ ์ฐ๋ฆฌ ์ค ์์๋ณด๋ค ํจ์ฌ ๋ ๋ง์ ๋ฐ์ดํฐ๋ฅผ ์์งํ ๋ค์ ์ด๋ฅผ ์ฌ์ฉ ํ์ฌ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ์๊ตฌ ์ฌํญ์ ์ง์
๊ฐ ์ํคํ
์ฒ์๋ ์ธ๋ผ์ธ asm!
์์ ์ฝ๊ฐ์ ์ฌ์ฉ์ ์ป๋ ๊น๋ค๋ก์ด ๋ชจ๋ธ ํ์ ์งํฉ์ด ์๋ค๊ณ ์๊ฐ ํ๊ณ ์ด๋ฌํ ํ์ ์งํฉ์ ์ด์ ์ ๋ง์ถ ๋ค์ ์ผ๋ฐํํด์ผ ํ ์๋ ์์ต๋๋ค.
cc @rust-lang/lang
@eddyb _require_๋ ๊ฐ๋ ฅํ ๋จ์ด์ด๋ฉฐ ์ธ๋ผ์ธ ์ด์ ๋ธ๋ฌ๋ฅผ ๋ฐ๋์ ์ฌ์ฉํด์ผ ํ๋ ๊ฒ์ ์๋๋๋ค. ์์ ์ธ๊ธํ๋ฏ์ด ์์ ์ด์ ๋ธ๋ฆฌ ์ธ์ด๋ก ํ๋ก์์ ๋ฅผ ์ ์ํ๊ณ ๋ณ๋๋ก ์ด์ ๋ธํ ๋ค์ FFI๋ฅผ ํตํด Rust ํ๋ก๊ทธ๋จ์ ์ฐ๊ฒฐํ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ์์ ๋งํ๋ฏ์ด ๊ทธ๋ ๊ฒ ํ๋ ์ฌ๊ฐํ OS ์์ค ํ๋ก์ ํธ๋ ์์ต๋๋ค. ์ด๋ ๋ง์ ๋ณด์ผ๋ฌ ํ๋ ์ดํธ(์ค์ํ ๊ฐ๋ฅ์ฑ์ด ๋ ๋์), ๋ ๋ณต์กํ ๋น๋ ํ๋ก์ธ์ค(์ง๊ธ ์ฐ๋ฆฌ๋ ์ด์ด ์ข๊ฒ๋ ๊ฐ๋จํ cargo
ํธ์ถ ๋ฐ ์ฐ๊ฒฐ๋ ๊ฑฐ์ ์คํ ์ค๋น๊ฐ ๋ ์ปค๋์ด ๋ฐ๋์ชฝ ๋์์ ํ์ด๋์ ๋ณ๋์ ๋จ๊ณ์์ ์ด์
๋ธ๋ฌ์ ๋งํฌ๋ฅผ ํธ์ถํด์ผ ํ๋ฉฐ ์ธ๋ผ์ธ ๊ธฐ๋ฅ์ด ๊ธ๊ฒฉํ ๊ฐ์ํฉ๋๋ค. ๊ฑฐ์ ํ์คํ ์ฑ๋ฅ ์ ํ๊ฐ ์์ ๊ฒ์
๋๋ค.
์ปดํ์ผ๋ฌ ๋ด์ฅ ํจ์์ ๊ฐ์ ๊ฒ์ ๋ง์ ๊ฒฝ์ฐ์ ๋์์ด ๋์ง๋ง ๋์ ISA์ ๊ฐ๋ ๋ช ๋ น์ด ์ธํธ, ํนํ ๋ ๋ํดํ ํ๋์จ์ด ๊ธฐ๋ฅ(์: ํ์ดํผ๋ฐ์ด์ ๋ฐ ์ํด๋ ์ด๋ธ ๊ธฐ๋ฅ)์ ๊ฒฝ์ฐ ๋ด์ฅ ํจ์๊ฐ ์๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. no_std ํ๊ฒฝ. ๋ด์ฅ๋ ๊ธฐ๋ฅ์ผ๋ก๋ ์ถฉ๋ถํ์ง ์์ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ์๋ฅผ ๋ค์ด, x86-์ธํฐ๋ฝํธ ํธ์ถ ๊ท์น์ ๋ฉ์ ธ ๋ณด์ด์ง๋ง ํธ๋ฉ ํ๋ ์์ ๋ฒ์ฉ ๋ ์ง์คํฐ์ ๋ํ ๋ณ๊ฒฝ ๊ฐ๋ฅํ ์ก์ธ์ค๋ฅผ ์ ๊ณตํ์ง ์์ต๋๋ค. %rax ๋๋ ๋ฌด์ธ๊ฐ์์; ํธ์ถ ๊ท์น์ ํธ์ถ ์ฌ์ดํธ๋ก ๋ค์ ์ ๋ฌํ๋ ์ข์ ๋ฐฉ๋ฒ์ ์ ๊ณตํ์ง ์์ผ๋ฏ๋ก ์ฐ๋ฆฌ๋ ์์ฒด์ ์ผ๋ก ๋กค๋งํด์ผ ํ์ต๋๋ค. ๊ทธ๊ฒ์ ์ด์ ๋ธ๋ฌ์์ ๋ด ์์ ์ ์์ธ ์ฒ๋ฆฌ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ์ ์๋ฏธํ์ต๋๋ค.
๊ทธ๋์ ์์งํ ๋งํด์, ์ฐ๋ฆฌ๋ ์ธ๋ผ์ธ ์ด์ ๋ธ๋ฌ๋ฅผ _require_ ํ์ํ์ง ์์ง๋ง, ๊ทธ๊ฒ์ ๊ฐ์ง์ง ์๋ ๊ฒ์ด ๊ฑฐ์ ์ด๋ณด์๊ฐ ๋ ์ ๋๋ก ์ถฉ๋ถํ ์ ์ฉํฉ๋๋ค.
@dancrossnyc ์ ๋ ํนํ ๋ณ๋์ ์กฐ๋ฆฝ์ ํผํ๋ ๊ฒ , ์ฆ ๋งํฌํ๋ ๋ฐฉ๋ฒ์ ๊ด๊ณ์์ด ํ๋ก์ ํธ ์์ ์ด๋ค ์ข ๋ฅ์ ์กฐ๋ฆฝ์ด ํ์ํ์ง ๊ถ๊ธํฉ๋๋ค.
๊ทํ์ ๊ฒฝ์ฐ ์ํผ๋ฐ์ด์ /ํ์ดํผ๋ฐ์ด์ /์ํด๋ ์ด๋ธ ๊ถํ ์๋ ISA ํ์ ์งํฉ์ธ ๊ฒ ๊ฐ์ต๋๋ค. ๋ง์ต๋๊น?
์ข ์ข ๋ด์ฅ์ด ์์ต๋๋ค
์ด๊ฒ์ ํ์ฐ์ ์ธ ๊ฒ์
๋๊น? ์๋ฅผ ๋ค์ด LLVM์ ํตํด ๋ด์ฅ ํธ์ถ๋ก ์ปดํ์ผํ ๋ ์ง์นจ์ ๋นํฉ๋ฆฌ์ ์ผ๋ก ์ด๋ ต๊ฑฐ๋ ์ ์งํ๊ธฐ์กฐ์ฐจ ๋ถ๊ฐ๋ฅํ ์๊ตฌ ์ฌํญ์ด ์์ต๋๊น?
์๋๋ฉด ๋๋ถ๋ถ์ ๊ฐ๋ฐ์์๊ฒ ์ ์ฉํ๊ธฐ์๋ ๋๋ฌด ํน์ํ ๊ฒฝ์ฐ๋ผ๊ณ ๊ฐ์ ํ๊ธฐ ๋๋ฌธ์
๋๊น?
๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ๋ no_std ํ๊ฒฝ์ ์์ต๋๋ค
๊ธฐ๋ก์ ์ํด ๊ณต๊ธ์
์ฒด ๋ด์ฅ ๊ธฐ๋ฅ์ std::arch
๋ฐ core::arch
(์ ์๋ ์ฌ์์ถ).
x86 ์ธํฐ๋ฝํธ ํธ์ถ ๊ท์น์ ๋ฉ์ง ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง ํธ๋ฉ ํ๋ ์์ ๋ฒ์ฉ ๋ ์ง์คํฐ์ ๋ํ ๋ณ๊ฒฝ ๊ฐ๋ฅํ ์ก์ธ์ค๋ฅผ ์ ๊ณตํ์ง ์์ต๋๋ค.
cc @rkruppe ์ด๊ฒ์ด LLVM์์ ๊ตฌํ๋ ์ ์์ต๋๊น?
@eddyb ๋ง์ต๋๋ค. ISA์ ๊ฐ๋ ์ ํ์ ์งํฉ์ด ํ์ํฉ๋๋ค. ํ์ฌ๋ก์๋ ํน์ ์ฌ์ฉ ์ฌ๋ก์ ๋ํด ๋ ์ด์ ๋งํ ์ ์์ต๋๋ค.
์ด๊ฒ์ ํ์ฐ์ ์ธ ๊ฒ์ ๋๊น? ์๋ฅผ ๋ค์ด LLVM์ ํตํด ๋ด์ฅ ํธ์ถ๋ก ์ปดํ์ผํ ๋ ์ง์นจ์ ๋นํฉ๋ฆฌ์ ์ผ๋ก ์ด๋ ต๊ฑฐ๋ ์ ์งํ๊ธฐ์กฐ์ฐจ ๋ถ๊ฐ๋ฅํ ์๊ตฌ ์ฌํญ์ด ์์ต๋๊น?
์๋๋ฉด ๋๋ถ๋ถ์ ๊ฐ๋ฐ์์๊ฒ ์ ์ฉํ๊ธฐ์๋ ๋๋ฌด ํน์ํ ๊ฒฝ์ฐ๋ผ๊ณ ๊ฐ์ ํ๊ธฐ ๋๋ฌธ์ ๋๊น?
์ด๋ ์ ๋๋ ๋ ๋ค ์ฌ์ค์ด์ง๋ง, ๊ท ํ์ ์ํด ๋๋ ํ์๊ฐ ์ฌ๊ธฐ์์ ๋ ์ ์ ํ๋ค๊ณ ๋งํ๊ณ ์ถ์ต๋๋ค. ์ผ๋ถ๋ ๋ง์ดํฌ๋ก์ํคํ ์ฒ์ ๋ฐ๋ผ ๋ค๋ฅด๋ฉฐ ํน์ ํ๋ก์ธ์ ํจํค์ง ๊ตฌ์ฑ์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค. ์ปดํ์ผ๋ฌ๊ฐ (์๋ฅผ ๋ค์ด) ํน์ ํ๋ก์ธ์ ๋ฒ์ ์ ๋ฐ๋ผ ์กฐ๊ฑด์ด ์ง์ ๋ ๊ถํ ์๋ ๋ช ๋ น ํ์ ์งํฉ _๋ฐ_์ ์ผ๋ถ์ธ ๋ด์ฅ์ผ๋ก ๋ฌด์ธ๊ฐ๋ฅผ ๋ ธ์ถํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ ๋๊น? ์์งํ ๋ชจ๋ฅด๊ฒ ๋ค.
๊ธฐ๋ก์ ์ํด ๊ณต๊ธ์ ์ฒด ๋ด์ฅ ํจ์๋ std::arch์ core::arch ๋ชจ๋์ ์์ต๋๋ค(์ ์๋ ๋ค์ ๋ด๋ณด๋ด๊ธฐ).
์ค์ ๋ก ์์๋๋ฉด ์ข์ต๋๋ค. ๊ฐ์ฌ ํด์!
์ปดํ์ผ๋ฌ๊ฐ (์๋ฅผ ๋ค์ด) ๊ถํ ์๋ ๋ช ๋ น ํ์ ์งํฉ์ ์ผ๋ถ์ด๊ณ ํน์ ํ๋ก์ธ์ ๋ฒ์ ์ ์กฐ๊ฑด์ผ๋ก ํ๋ ๋ด์ฅ์ผ๋ก ๋ฌด์ธ๊ฐ๋ฅผ ๋ ธ์ถํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ ๋๊น? ์์งํ ๋ชจ๋ฅด๊ฒ ๋ค.
์ฐ๋ฆฌ๋ ์ด๋ฏธ ํ๊ณ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด xsave
x86 ๋ช
๋ น์ด๋ core::arch
์ ๊ตฌํ ๋ฐ ๋
ธ์ถ๋๋ฉฐ ๋ชจ๋ ํ๋ก์ธ์์์ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ ๋๋ถ๋ถ์ ๊ถํ ๋ชจ๋๊ฐ ํ์ํฉ๋๋ค.
@gnzlbg xsave
์(๋) ๊ถํ์ด ์์ต๋๋ค. xsaves
์ฐพ์ผ์
จ์ต๋๊น?
๋๋ https://rust-lang-nursery.github.io/stdsimd/x86_64/stdsimd/arch/x86_64/index.html์ ์ดํด๋ณด๊ณ ๋ด ๋น ๋ฅธ ์ฒญ์์์ ๋ณธ ์ ์ผํ ๊ถํ ์๋ ์ง์นจ์ ๋ณด์์ต๋๋ค(๋๋ ์ ์ฒด ๊ฒ์) xsaves
, xsaves64
, xrstors
๋ฐ xrstors64
์
๋๋ค. ๋๋ ๊ทธ๊ฒ๋ค์ด ์ผ๋ฐ XSAVE*
๊ณ์ด์ ์ํ๊ณ ๋ฆฌ์ผ ๋ชจ๋์์ ์์ธ๋ฅผ ์์ฑํ์ง ์๊ธฐ ๋๋ฌธ์ ๋ด์ฅ ํจ์๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ผ๋ถ ์ฌ๋๋ค์ clang/llvm์ ์ฌ์ฉํ์ฌ ๋ฆฌ์ผ ๋ชจ๋ ์ฝ๋๋ฅผ ์ปดํ์ผํ๊ธฐ๋ฅผ ์ํฉ๋๋ค.
@dancrossnyc ๋ค, ๊ทธ ์ค ์ผ๋ถ๋ ์ ๊ฐ ์๋ฏธํ ๊ฒ์
๋๋ค( xsave
๋ชจ๋์์ xsave
, xsaves
, xsaveopt
, ... ๊ตฌํํฉ๋๋ค: https: //github.com/rust-lang-nursery/stdsimd/blob/master/coresimd/x86/xsave.rs).
core
์์ ์ฌ์ฉํ ์ ์์ผ๋ฏ๋ก x86์ฉ OS ์ปค๋์ ์์ฑํ๋ ๋ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ฌ์ฉ์ ๊ณต๊ฐ์์๋ ์ธ๋ชจ์๋ AFAICT(ํญ์ ์์ธ๊ฐ ๋ฐ์ํจ)์ด์ง๋ง core
์์ ์ด๋ฅผ ๊ตฌ๋ถํ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. ๊ทธ๋ฌ๋ std
๊ฐ ์๋๋ผ core
์๋ง ๋
ธ์ถ๋ ์ ์์ง๋ง ์ด๋ฏธ ์์ ์ ์ด๋ฏ๋ก ํด๋น ๋ฐฐ๋ ํญํดํ์ต๋๋ค. ๋๊ฐ ์๊ฒ ์ต๋๊น, ์ผ๋ถ OS๋ ์ธ์ ๊ฐ ๋ง 0์์ ๋ชจ๋ ๊ฒ์ ์คํํ๊ณ ๊ฑฐ๊ธฐ์ ์ฌ์ฉํ ์ ์์ต๋๋ค...
@gnzlbg xsaveopt
๋๋ xsave
๊ฐ ์ฌ์ฉ์ ๊ณต๊ฐ์์ ์์ธ๋ฅผ ๋ฐ์์ํค๋ ์ด์ ๋ฅผ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. xsaves
๋ ์์ธ(#GP CPL>0์ธ ๊ฒฝ์ฐ), ๊ทธ๋ฆฌ๊ณ ๋ณดํธ ๋ชจ๋์์๋ง(SDM vol.1 ch. 13; vol.2C ch. 5 XSAVES). xsave
๋ฐ xsaveopt
๋ ์ ์ ํ ์ฌ์ฉ์ ๊ณต๊ฐ ์ค๋ ๋๋ฅผ ๊ตฌํํ๋ ๋ฐ ์ ์ฉํ๋ฏ๋ก ๋ด์ฅ ๊ธฐ๋ฅ์ผ๋ก์์ ์กด์ฌ๊ฐ ์ค์ ๋ก ์๋ฏธ๊ฐ ์์ต๋๋ค. xsaves
์ ๋ํ ๋ด์ฅ ๊ธฐ๋ฅ์ ๋๊ตฐ๊ฐ๊ฐ ๊ถํ ๋ฌธ์ ๋ฅผ ๊นจ๋ซ์ง ์๊ณ xsave
์ ํ๊ตฐ์ ๋ชจ๋ ๊ฒ์ ์ถ๊ฐํ๊ฑฐ๋(์ฆ, ์ฌ์ฉ์ ๊ณต๊ฐ์์ ํธ์ถํ ์ ์๋ค๊ณ ๊ฐ์ ) ๋๊ตฐ๊ฐ๊ฐ ๊ทธ๊ฒ์ ํธ์ถํ๊ธฐ๋ฅผ ์ํ๊ธฐ ๋๋ฌธ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋ฆฌ์ผ ๋ชจ๋์์. ํ์๋ ์ต์ง์ค๋ฌ์ ๋ณด์ผ ์ ์์ง๋ง ์ฌ๋๋ค์ด ์๋ฅผ ๋ค์ด Clang ๋ฐ LLVM์ ์ฌ์ฉํ์ฌ ๋ฆฌ์ผ ๋ชจ๋ ํ์จ์ด๋ฅผ ๊ตฌ์ถํ๊ณ ์๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค.
์คํดํ์ง ๋ง์ธ์. core
์ LLVM ๋ด์ฅ ํจ์๊ฐ ์๋ค๋ ๊ฒ์ ๋๋จํ ์ผ์
๋๋ค. rdtscp
์ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฉํ ํ์์ผ๋ก ๋ค์ ๊ฐ์ ธ์ค๊ธฐ ์ํด ์ด๋ฆฌ์์ ๋ช
๋ น ์ํ์ค๋ฅผ ์์ฑํ ํ์๊ฐ ์๋ค๋ฉด ์ ๋ ๊ธฐ์ ๊ฒ์
๋๋ค. ๊ทธ๋ฌ๋ ํ์ฌ ๋ด์ฅ ํจ์ ์ธํธ๋ ์ปค๋์ด๋ ๊ธฐํ ๋ฒ ์ด ๋ฉํ ๊ฐ๋
์ข
๋ฅ๋ฅผ ์์ฑํ ๋ ์ธ๋ผ์ธ ์ด์
๋ธ๋ฌ๋ฅผ ๋์ฒดํ ์ ์์ต๋๋ค.
@dancrossnyc์์ xsave
๋ฅผ ์ธ๊ธํ ๋ CPUID ๋นํธ XSAVE, XSAVEOPT, XSAVEC ๋ฑ ๋ค์์ ์ฌ์ฉํ ์ ์๋ ๋ด์ฅ ๊ธฐ๋ฅ ์ค ์ผ๋ถ๋ฅผ ์ธ๊ธํ์ต๋๋ค. ์ด๋ฌํ ๋ด์ฅ ๊ธฐ๋ฅ ์ค ์ผ๋ถ๋ ํน๊ถ ๋ชจ๋๊ฐ ํ์ํฉ๋๋ค.
์ปดํ์ผ๋ฌ๊ฐ (์๋ฅผ ๋ค์ด) ๊ถํ ์๋ ๋ช ๋ น ํ์ ์งํฉ์ ์ผ๋ถ์ด๊ณ ํน์ ํ๋ก์ธ์ ๋ฒ์ ์ ์กฐ๊ฑด์ผ๋ก ํ๋ ๋ด์ฅ์ผ๋ก ๋ฌด์ธ๊ฐ๋ฅผ ๋ ธ์ถํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ ๋๊น?
์ฐ๋ฆฌ๋ ์ด๋ฏธ ๊ทธ๋ ๊ฒ ํ๊ณ ์์ผ๋ฉฐ ์์ ์ ์ธ Rust์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
xsave์ ๊ณ ์ ๊ธฐ๋ฅ์ ๋๊ตฐ๊ฐ๊ฐ ๊ถํ ๋ฌธ์ ๋ฅผ ๊นจ๋ซ์ง ์๊ณ xsave ์ ํ๊ตฐ์ ๋ชจ๋ ๊ฒ์ ๋ฐฉ๊ธ ์ถ๊ฐํ๊ธฐ ๋๋ฌธ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์ด๋ฌํ ๋ด์ฅ ๊ธฐ๋ฅ์ ์ถ๊ฐํ์ต๋๋ค. ์ฐ๋ฆฌ๋ ๊ถํ ๋ฌธ์ ๋ฅผ ๊นจ๋ฌ์๊ณ core
์ ์์กดํ๋ ํ๋ก๊ทธ๋จ์ด ์ด๊ฒ์ ์ฌ์ฉํ๋ ค๋ OS ์ปค๋์ด ๋๋ ๊ฒ์ด ์๋ฒฝํ๊ณ ์ฌ์ฉ์ ๊ณต๊ฐ์์ ๋ฌดํดํ๊ธฐ ๋๋ฌธ์ ์ด์จ๋ ์ถ๊ฐํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค
๊ทธ๋ฌ๋ ํ์ฌ ๋ด์ฅ ํจ์ ์ธํธ๋ ์ปค๋์ด๋ ๊ธฐํ ๋ฒ ์ด ๋ฉํ ๊ฐ๋ ์ข ๋ฅ๋ฅผ ์์ฑํ ๋ ์ธ๋ผ์ธ ์ด์ ๋ธ๋ฌ๋ฅผ ๋์ฒดํ ์ ์์ต๋๋ค.
๋์ํฉ๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ด ๋ฌธ์ ๊ฐ ์์ง ์ด๋ ค ์์ต๋๋ค. ;)
@gnzlbg ์ฃ์กํฉ๋๋ค. xsave
et al.
๊ทธ๋ฌ๋ ๋ด๊ฐ ๋งํ ์ ์๋ ํ ๊ถํ ์๋ ์คํ์ด ํ์ํ ์ ์ผํ ๋ด์ฅ ํจ์๋ xsaves
์ ๊ด๋ จ๋ ๋ด์ฅ ํจ์์ด๊ณ ํญ์ ๊ถํ์ด ์๋ ๊ฒ์ xsaves
๋ฐ xrstors
๋ ๊ถํ ์๋ ๋ช
๋ น์ด ์ธํธ์ ์์ฃผ ์์ ๋ถ๋ถ์ด๋ฉฐ ๋ ๋ช
๋ น์ด์ ๋ํด ๋ด์ฅ ํจ์๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ์ผ๋ฐ์ ์ผ๋ก ๊ทธ๋ ๊ฒ ํ๋ ๊ฒ๊ณผ ์ง์ ์ผ๋ก ๋ค๋ฅด๋ฉฐ ๋ค์๊ณผ ๊ฐ์ ์ง๋ฌธ์ด ๋จ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. _์ผ๋ฐ์ ์ผ๋ก_ ์ ์ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด VMX ํ์ฅ์ VMWRITE
๋ช
๋ น์ ๊ณ ๋ คํ์ญ์์ค. ๋ด์ฅ ํจ์๊ฐ ๋ช
๋ น ์คํ๊ณผ ๊ฐ์ ์์
์ ์ํํ ๋ค์ rflags
"๋ฐํ"ํ๋ค๊ณ ์์ํฉ๋๋ค. ๊ทธ๊ฒ์ ๋ณธ์ง์ ์ผ๋ก ๊ฐ์ง๊ณ ์๋ ์ผ์ข
์ ์ด์ํ๊ฒ ์ ๋ฌธํ๋ ๊ฒ์
๋๋ค.
๊ทธ๋ ์ง ์์ผ๋ฉด ์ฐ๋ฆฌ๋ ์ฌ๊ธฐ์ ๋์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
std::arch
RFC์ ๋ฐ๋ผ FWIW๋ ํ์ฌ ๊ณต๊ธ์
์ฒด๊ฐ API์์ ๋
ธ์ถํ๋ std::arch
์๋ง ๋ด์ฅ ํจ์๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค. xsave
๊ฒฝ์ฐ Intel์ C API์ ์ด๋ฅผ ๋
ธ์ถ ํ๋ฏ๋ก ๊ฑฐ๊ธฐ์ ์๋ ๊ฒ์ด ์ข์ต๋๋ค. ํ์ฌ ๋
ธ์ถ๋์ง ์์ ๊ณต๊ธ์
์ฒด ๋ด์ฅ ๊ธฐ๋ฅ์ด ํ์ํ ๊ฒฝ์ฐ ๊ถํ ๋ชจ๋๊ฐ ํ์ํ์ง ์ฌ๋ถ์ ๊ด๊ณ์์ด ๋ฌธ์ ๋ฅผ ์ฝ๋๋ค.
๊ณต๊ธ์
์ฒด๊ฐ ๋ด์ฅ ๊ธฐ๋ฅ์ ๋
ธ์ถํ์ง ์์ผ๋ฉด std::arch
๊ฐ ์ ํฉํ์ง ์์ ์ ์์ง๋ง ์ด์ ๋ํ ๋ง์ ๋์์ด ์์ต๋๋ค(์ธ๋ผ์ธ ์ด์
๋ธ๋ฆฌ, ๊ธ๋ก๋ฒ asm, C ํธ์ถ ๋ฑ).
์ฃ์กํฉ๋๋ค. xsave
์ ๋ํ ๋ด์ฅ ๊ธฐ๋ฅ์ Intel ๋ด์ฅ ๊ธฐ๋ฅ์ ์๋ฏธํ๊ธฐ ์ํด ์์ฑํ๋ค๊ณ ๋ง์ํ์ ๊ฒ์ ์ดํดํ์ต๋๋ค. ๋ด๊ฐ xsaves
๊ฐ ๋ด์ฌ์ ์ด๋ผ๊ณ ์๊ฐํ๋ ์ด์ ์ ๋ํ ๋ด ์ด์ ์๊ฒฌ์ ์ฌ์ ํ โโ์ ์ฉ๋ฉ๋๋ค(Intel์ ์ปดํ์ผ๋ฌ ์์ฑ์์ ์ฌ๊ณ ์ด๊ฑฐ๋ ๋๊ตฐ๊ฐ๊ฐ ๋ฆฌ์ผ ๋ชจ๋๋ฅผ ์ํ๊ธฐ ๋๋ฌธ์
๋๋ค. ์ ์๋ ์ ๋ง ๋นจ๋ฆฌ ์์์ฐจ๋ฆด ์ ์์ ๊ฒ ๊ฐ์ง๋ง ํ์จ์ด๋ ์ด์ํ ์ผ์ ํ๋ฏ๋ก ํ์๋ ์ ํ ๋๋ผ์ง ์์ ๊ฒ์
๋๋ค).
์ด์จ๋ , ๋ค, ์ ๋ ์ฐ๋ฆฌ๊ฐ ๊ทผ๋ณธ์ ์ผ๋ก ๋์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ด์ฅ ํจ์๋ ๋ชจ๋ ๊ฒ์ ์ํ ์ฅ์๊ฐ ์๋๋ฉฐ, ์ด๊ฒ์ด ์ฐ๋ฆฌ๊ฐ asm!()์ด ์์ ์ผ๋ก ์ฎ๊ฒจ์ง ๊ฒ์ ๋ณด๊ณ ์ถ์ ์ด์ ์ ๋๋ค. ์ด์ ๋ง์ํ์ ๊ฒ์ฒ๋ผ ์ด ์์ญ์์ ์ง์ ์ด ์ด๋ฃจ์ด์ง๊ณ ์๋ค๋ ์์์ ๋ค์ผ๋ ์ ๋ง ๊ธฐ์ฉ๋๋ค. @Florob ์ด ์ด๊ฒ์ ์คํ์ ๋งจ ์์ ๋ ๊ฐ๊น๊ฒ ๋ฒ๋ธ
asm!
๋ํ ๋ช ๊ฐ์ง ์ถ๊ฐ ์ธ๋ถ์ ๋ณด ๋ฐ ์ฌ์ฉ ์ฌ๋ก:
์ด์ ์ฒด์ , ํ์จ์ด, ํน์ ์ ํ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋๋ ๊ธฐํ ํน์ ์ ํ์ ์์คํ ์ฝ๋๋ฅผ ์์ฑํ ๋ ํ๋ซํผ ์์ค ์ด์ ๋ธ๋ฆฌ์ ๋ํ ์ ์ฒด ์ก์ธ์ค ๊ถํ์ด ํ์ํฉ๋๋ค. Rust๊ฐ ์ง์ํ๋ ๋ชจ๋ ์ํคํ ์ฒ์์ ๋ชจ๋ ๋จ์ผ ๋ช ๋ น์ด๋ฅผ ๋ ธ์ถํ๋ ๋ด์ฅ ํจ์๊ฐ ์๋๋ผ๋(์ด๋ ๊ฑฐ์ ๊ฐ๊ณ ์์ง ์์) ์ฌ๋๋ค์ด ์ธ๋ผ์ธ ์ด์ ๋ธ๋ฆฌ๋ก ์ ๊ธฐ์ ์ผ๋ก ๋์ด์ค๋ ์ผ๋ถ ์คํดํธ์๋ ์ฌ์ ํ ์ถฉ๋ถํ์ง ์์ต๋๋ค.
๋ค์์ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก๋ ์ฝ๊ฒ ์ํํ ์ ์๋ ์ธ๋ผ์ธ ์ด์ ๋ธ๋ฆฌ๋ก ์ํํ ์ ์๋ ์์ ์ ์์ ๋ถ๋ถ์ ๋๋ค. ์ด๋ค ๊ฐ๊ฐ์ ๋ด๊ฐ ๋ณธ(๋๋ ์ด๋ค ๊ฒฝ์ฐ์๋ ์์ฑ๋) ์ค์ ์ฌ๋ก์ด๋ฉฐ ๊ฐ์์ด ์๋๋๋ค.
+1e6
@eddyb
์ข์, ๋๋ ๋ด์ฅ ์ ๊ทผ๋ฒ์ ์๋ํ๊ณ ๊ทธ๊ฒ์ด ํ์ํ ๊ณณ์ ๋ณผ ๊ฒ์ด๋ค. ๋น์ ์ด ์ณ์ ๊ฒ์ด๊ณ ๊ทธ๊ฒ์ด ์ ๊ฒฝ์ฐ์ ๊ฐ์ฅ ์ข์ ์ ๊ทผ ๋ฐฉ์์ ๋๋ค. ๊ฐ์ฌํฉ๋๋ค!
@joshtriplett ๊ฐ ์ฑ๊ณตํ์ต๋๋ค! ์ด๊ฒ๋ค์ ๋ด๊ฐ ์ผ๋์ ๋ ์ ํํ ์ฌ์ฉ ์ฌ๋ก์ ๋๋ค.
loop {
:thumbs_up:
}
๋ช ๊ฐ์ง ๋ค๋ฅธ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ถ๊ฐํ๊ฒ ์ต๋๋ค.
@mark-im ๋ฌผ๋ก ์ ๋๋ค! ๊ทธ๋ฆฌ๊ณ ๋ ๋ชฉ๋ก ๋ชจ๋์ ํ์ ์ฌ๋ก๊ฐ ์๋ ์์ ์ ์ผ๋ฐํํฉ๋๋ค. ํธ์ถ ๊ท์น ๊ฐ์ ๋ณํํฉ๋๋ค.
์ ๋ ์ด ๋ฌธ์ ์ ์ฐฌ์ฑํ์ฌ #53118์ ๋ง๊ฐํ๊ณ ๊ธฐ๋ก์ ์ํด ์ฌ๊ธฐ์ PR์ ๋ณต์ฌํฉ๋๋ค. ์ด๊ฒ์ 8์์ ๊ฒ์ด์ง๋ง ๊ฐ๋จํ ์ดํด๋ณด๋ฉด ์ํฉ์ด ๋ณ๊ฒฝ๋์ง ์์์์ ๋ํ๋ ๋๋ค.
์ธ๋ผ์ธ ์ด์
๋ธ๋ฆฌ ์น์
์ ์ ๋ฐ ๊ฒ์ฌ๊ฐ ํ์ํฉ๋๋ค. ํ์ฌ ์ํ์์๋ ๋์๊ณผ ๊ตฌ๋ฌธ์ด rustc
๋ฐ ์ผ๋ฐ์ ์ผ๋ก Rust ์ธ์ด์ ๋ฌถ์ฌ ์์์ ์๋ฏธํฉ๋๋ค. ๊ฑฐ์ ์ ์ฒด ๋ฌธ์๋ llvm ๋๊ตฌ ์ฒด์ธ์ ์ฌ์ฉํ๋ x86/x86_64 ์ด์
๋ธ๋ฆฌ์๋ง ํด๋น๋ฉ๋๋ค. ๋ถ๋ช
ํ ๋งํด์, ๋๋ ๋ถ๋ช
ํ ํ๋ซํผ์ ํน์ ํ ์ด์
๋ธ๋ฆฌ ์ฝ๋ ์์ฒด๋ฅผ ๋งํ๋ ๊ฒ์ด ์๋๋ผ ์ธ๋ผ์ธ ์ด์
๋ธ๋ฆฌ์ ์ผ๋ฐ์ ์ธ ์ํคํ
์ฒ์ ์ฌ์ฉ๋ฒ์ ๋งํ๋ ๊ฒ์
๋๋ค.
ARM ํ๊ฒ๊ณผ ๊ด๋ จํ์ฌ ์ธ๋ผ์ธ ์ด์ ๋ธ๋ฆฌ ๋์์ ๋ํ ์ ๋ขฐํ ์ ์๋ ์์ค๋ฅผ ์ฐพ์ง ๋ชปํ์ง๋ง ๋ด ์คํ ๋ฐ ARM GCC ์ธ๋ผ์ธ ์ด์ ๋ธ๋ฆฌ ์ค๋ช ์ ์ฐธ์กฐ ์ ๋ฐ๋ฅด๋ฉด ๋ค์ ์ฌํญ์ด ์์ ํ ์๋ชป๋ ๊ฒ ๊ฐ์ต๋๋ค.
intel
์ต์
์ ์ ํจํ์ง ์์ผ๋ฉฐ ์ปดํ์ผํ ๋ "์ ์ ์๋ ์ง์๋ฌธ" ์ค๋ฅ๊ฐ arm-none-eabi-*
๋๊ตฌ ์ฒด์ธ์ ์ฌ์ฉํ์ฌ thumbv7em-none-eabi
์ ๋ํด ๋น๋ํ๋ ๊ฒฝ์ฐ ์ธ๋ผ์ธ ์ด์
๋ธ๋ฆฌ ํ์์ ๋ํ ๋ช ๊ฐ์ง ๊ธฐ๋ณธ ๊ฐ์ ์กฐ์ฐจ๋ ํ๋ซํผ์ ๋ฐ๋ผ ๋ค๋ฆ
๋๋ค. ARM์ ๊ฒฝ์ฐ ์ถ๋ ฅ ๋ ์ง์คํฐ(๋ ๋ฒ์งธ ๋งคํฌ๋ก ์ธ์)๋ ๋ ์ง์คํฐ ์ฐธ์กฐ๋ก ๊ณ์ฐ๋ฉ๋๋ค. ์ฆ, $0
๋ x86 llvm ๋ช
๋ น์ด์ ๊ฒฝ์ฐ์ ๊ฐ์ด ์ฒซ ๋ฒ์งธ ์
๋ ฅ ๋ ์ง์คํฐ๊ฐ ์๋๋ผ ์ฒซ ๋ฒ์งธ ์ถ๋ ฅ ๋ ์ง์คํฐ๋ฅผ ์ฐธ์กฐํฉ๋๋ค.asm("mov %[result],%[value],ror #1":[result] "=r" (y):[value] "r" (x));
๋ ์ ํจํ์ง ์์).$0
๋ฐ $2
์ ์ฌ์ฉ๋ฒ์ ํด๋น ์ซ์๊ฐ ์ ํ๋ ์ด์ ๋ฅผ ์ค๋ช
ํ์ง ์๊ธฐ ๋๋ฌธ์ ๋งค์ฐ ํผ๋์ค๋ฝ์ต๋๋ค.)์ ์๊ฒ ๊ฐ์ฅ ์ถฉ๊ฒฉ์ ์คฌ๋ ๊ฒ์ ๋ค์๊ณผ ๊ฐ์ ๋ง์ง๋ง ๋ฌธ์ฅ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
ํ์ฌ asm ๊ตฌํ! ๋งคํฌ๋ก๋ LLVM์ ์ธ๋ผ์ธ ์ด์ ๋ธ๋ฌ ํํ์์ ๋ํ ์ง์ ๋ฐ์ธ๋ฉ์ด๋ฏ๋ก ํด๋ก๋ฒ, ์ ์ฝ ์กฐ๊ฑด ๋ฑ์ ๋ํ ์์ธํ ๋ด์ฉ์ ์ค๋ช ์๋ ํ์ธํ์ญ์์ค.
๋ณดํธ์ ์ผ๋ก ์ฌ์ค์ด ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
์ธ๋ผ์ธ asm์ด ์ค์ ํ๋ซํผ/์ปดํ์ผ๋ฌ๋ณ ๊ตฌ๋ฌธ์ผ๋ก ๋ณํ๋ at&t ๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ผ๋ฉฐ x86 ๋ ์ง์คํฐ ์ด๋ฆ์ ARM ๋ ์ง์คํฐ ์ด๋ฆ์ผ๋ก๋ง ๋์ฒดํด์ผ ํจ์ ์๋ฏธ/์์ํ๋ ๋ฌธ์๋ฅผ ์ดํดํ์ต๋๋ค.
intel ๋ at&t ๊ตฌ๋ฌธ์ ๊ฐ๋
์ x86์๋ง ์กด์ฌํฉ๋๋ค(๋ด๊ฐ ์์ง ๋ชปํ๋ ๋ค๋ฅธ ๊ฒฝ์ฐ๊ฐ ์์ ์ ์์). ๋์ผํ ์ด์ง ์ฝ๋ ์ธํธ๋ฅผ ๋ํ๋ด๊ธฐ ์ํด ๋์ผํ ๋๋ชจ๋ ์ธํธ๋ฅผ ๊ณต์ ํ๋ ๋ ๊ฐ์ ๋ค๋ฅธ ์ธ์ด๋ผ๋ ์ ์์ ๋
ํนํฉ๋๋ค. GNU ์ํ๊ณ๋ at&t ๊ตฌ๋ฌธ์ x86 ์ธ๊ณ์ ์ง๋ฐฐ์ ์ธ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ค์ ํ์ต๋๋ค. ์ด๊ฒ์ด ์ธ๋ผ์ธ asm์ด ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ฌ์ฉ๋๋ ์ด์ ์
๋๋ค. ์ด๊ฒ์ด LLVM์ ์ธ๋ผ์ธ ์ด์
๋ธ๋ฌ ํํ์์ ๋ํ ์ง์ ์ ์ธ ๋ฐ์ธ๋ฉ์ด๋ผ๋ ์ ์์ ์ฐฉ๊ฐํ๊ณ ์์ต๋๋ค. ์ด ํํ์์ ๋๋ถ๋ถ ์ผ๋ฐ ํ
์คํธ(๋์ฒด ์ฒ๋ฆฌ ํ)๋ฅผ ํ
์คํธ ์ด์
๋ธ๋ฆฌ ํ๋ก๊ทธ๋จ์ ๋คํํฉ๋๋ค. ์ด ์ค ์ด๋ ๊ฒ๋ ์ค๋๋ ์ asm!()
๊ณ ์ ํ๊ฑฐ๋ ๊ด๋ จ์ด ์์ต๋๋ค. ์ด๋ ์ ์ ์ผ๋ก ํ๋ซํผ์ ๋ฐ๋ผ ๋ค๋ฅด๋ฉฐ x86 ์ธ๊ณ๋ฅผ ๋์ด์๋ ์์ ํ ๋ฌด์๋ฏธํ๊ธฐ ๋๋ฌธ์
๋๋ค.
์ด์ ๊ด๋ จํ์ฌ
intel
์ต์ ์ ์ ํจํ์ง ์์ผ๋ฉฐ ์ปดํ์ผํ ๋ "์ ์ ์๋ ์ง์๋ฌธ" ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
์ด๊ฒ์ ์์์ ์ค๋ช
ํ "๋ฉ์ฒญํ"/๋จ์ํ ์ผ๋ฐ ํ
์คํธ ์ฝ์
์ ์ง์ ์ ์ธ ๊ฒฐ๊ณผ์
๋๋ค. ์ค๋ฅ ๋ฉ์์ง๋ .intel_syntax
์ง์๋ฌธ์ด ์ง์๋์ง ์์์ ๋ํ๋
๋๋ค. ์ด๊ฒ์ intel ์คํ์ผ inline-asm์ GCC(att ์คํ์ผ์ ๋ด๋ณด๋)์ ํจ๊ป ์ฌ์ฉํ๊ธฐ ์ํ ์ค๋๋๊ณ ์ ์๋ ค์ง ํด๊ฒฐ ๋ฐฉ๋ฒ์
๋๋ค. ์ธ๋ผ์ธ asm ๋ธ๋ก์ ์์ ๋ถ๋ถ์ .intel_syntax
๋ฅผ ์ด ๋ค์ ์ผ๋ถ intel-asm์ ์์ฑํ๋ฉด ๋ฉ๋๋ค. asm ์คํ์ผ์ ์ง์ ํ๊ณ ๋ง์ง๋ง์ผ๋ก .att_syntax
๋ก ์ข
๋ฃํ์ฌ ์ด์
๋ธ๋ฌ๋ฅผ att ๋ชจ๋๋ก ๋ค์ ์ค์ ํ์ฌ (๋ค์) ์ปดํ์ผ๋ฌ ์์ฑ ์ฝ๋๋ฅผ ๋ค์ ํ ๋ฒ ์ฌ๋ฐ๋ฅด๊ฒ ์ฒ๋ฆฌํฉ๋๋ค. ๊ทธ๊ฒ์ ๋๋ฌ์ด ํดํน์ด๋ฉฐ ์ ์ด๋ LLVM ๊ตฌํ์ด ์ค๋ซ๋์ ์ด์ํ ๋จ์ ์ ๊ฐ์ง๊ณ ์์๊ธฐ ๋๋ฌธ์ ๋ง์นจ๋ด ์ ๊ฑฐ๋์๊ธฐ ๋๋ฌธ์ ์ด ์ค๋ฅ๊ฐ ํ์๋๋ ๊ฒ์ฒ๋ผ ๋ณด์
๋๋ค. ์ฌํ๊ฒ๋, ์ฌ๊ธฐ์ ์ ์ผํ ์ฌ๋ฐ๋ฅธ ์กฐ์น๋ Rustc์์ "intel"
์ต์
์ ์ ๊ฑฐํ๋ ๊ฒ์
๋๋ค.
์ธ๋ผ์ธ ์ด์ ๋ธ๋ฆฌ ํ์์ ๋ํ ๋ช ๊ฐ์ง ๊ธฐ๋ณธ ๊ฐ์ ์กฐ์ฐจ๋ ํ๋ซํผ์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค.
๊ทํ์ ๊ด์ฐฐ์ ์์ ํ ์ ํํฉ๋๋ค. ๊ฐ ํ๋ซํผ์ ์์ฒด ๋ฐ์ด๋๋ฆฌ ํ์๊ณผ ์์ฒด ์ด์ ๋ธ๋ฆฌ ์ธ์ด๋ฅผ ๋ชจ๋ ๊ตฌ์ฑํฉ๋๋ค. ๊ทธ๊ฒ๋ค์ ์์ ํ ๋ ๋ฆฝ์ ์ด๋ฉฐ (๋๋ถ๋ถ) ์ปดํ์ผ๋ฌ์ ์ํด ์ฒ๋ฆฌ๋์ง ์์ต๋๋ค. ์ด๊ฒ์ด ์์ ์ด์ ๋ธ๋ฌ ํ๋ก๊ทธ๋๋ฐ์ ์์ ์ ๋๋ค!
๋ ์ง์คํฐ์ ๋ช ๋ช ๋ ์ฐธ์กฐ๋ฅผ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ ์ธ๋ฑ์ค๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ฌํ๊ฒ๋ Rustc๊ฐ ๋
ธ์ถํ๋ LLVM์ ์ธ๋ผ์ธ asm ๊ตฌํ๊ณผ (clang์ด ์๋ฎฌ๋ ์ดํธํ๋) GCC ๊ตฌํ ์ฌ์ด์๋ ์๋นํ ๋ถ์ผ์น๊ฐ ์์ต๋๋ค. asm!()
๋ก ์์ผ๋ก ๋์๊ฐ ๋ฐฉ๋ฒ์ ๋ํ ๊ฒฐ์ ์ด ์์ผ๋ฉด ์ด๋ฅผ ๊ฐ์ ํ ๋๊ธฐ๊ฐ ๊ฑฐ์ ์์ต๋๋ค. ๊ฒ๋ค๊ฐ ์ ๋ ์ค๋์ ์ ์ฃผ์ ์ต์
์ asm!()
์ ๊ฐํ ์์ ๊ฒ์
๋๋ค. ์ ์ ํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
cc
์์ ์์ build.rs
์ธ๋ผ์ธ ASM์ผ๋ก C ๊ฐ์ฒด๋ฅผ ์ฐ๊ฒฐํ๋build.rs
์์ ์ํ๋ ์ด์
๋ธ๋ฌ๋ฅผ ํธ์ถํ๊ธฐ๋ง ํ๋ฉด C ์ปดํ์ผ๋ฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๊ณผ๋ํ๊ฒ ๋ณด์ผ ์ ์์ง๋ง build.rs
์์คํ
๊ณผ ํตํฉํ๋ ๋ฒ๊ฑฐ๋ก์์ ๋์ด์ค๋๋ค.์ด๋ฌํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋งค์ฐ ํน์ ํ ๊ทน๋จ์ ์ธ ๊ฒฝ์ฐ๋ฅผ ์ ์ธํ๊ณ ๋ ๋ชจ๋ ์ ์ฉ๋ฉ๋๋ค. ๋น์ ์ด ๊ทธ ์ค ํ๋๋ฅผ ์น๋ฉด (๋คํํ ๋๋ ์์ง ํ์ง ์์๋ค) ๋น์ ์ ์ด์ด ์์ต๋๋ค.
๋๋ ๋ฌธ์๊ฐ ์๋นํ ๋ถ์กฑํ๋ค๋ ๋ฐ ๋์ํ์ง๋ง ์ธ๋ผ์ธ asm์ ์ต์ํ ์ฌ๋์๊ฒ๋ ์ถฉ๋ถํฉ๋๋ค. ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ ์ฌ์ฉํ์ง ์์์ผ ํฉ๋๋ค . ์คํดํ์ง ๋ง์ธ์. ์์ ๋กญ๊ฒ ์คํํ๊ณ ๋ฐฐ์ธ ์ ์์ด์ผ ํ์ง๋ง asm!()
๋ ๋ถ์์ ํ๊ณ ๋ฌด์๋๋ฉฐ ์ ๋ง ์ข์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฅํ๋ฉด ์ง์งํ ํ๋ก์ ํธ์์ ์ฌ์ฉํ์ง ๋ง๋ผ๊ณ ๊ฐ๋ ฅํ ์กฐ์ธํฉ๋๋ค. .
C ๊ฐ์ฒด๋ฅผ ์ธ๋ผ์ธ asm๊ณผ ์ฐ๊ฒฐํ๊ธฐ ์ํด build.rs์์ cc ์์๋ฅผ ํธ์ถํฉ๋๋ค.
๋ํ build.rs
์์ cc
ํฌ๋ ์ดํธ๋ฅผ ํธ์ถํ์ฌ ์ต๋ ์ ์ด ์์ค์ ์ ๊ณตํ๋ ์ผ๋ฐ ์ด์
๋ธ๋ฆฌ ํ์ผ์ ๋น๋ํ ์ ์์ต๋๋ค. ์์ ๋ ๊ฐ์ง "ํด๊ฒฐ ๋ฐฉ๋ฒ"์ด ์ฌ์ฉ ์ฌ๋ก์์ ์๋ํ์ง ์๋ ๊ฒฝ์ฐ๋ฅผ ๋๋นํ์ฌ ์ ํํ ์ด ์์
์ ์ํํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
@main-- ์ด:
์ด๋ฌํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋งค์ฐ ํน์ ํ ๊ทน๋จ์ ์ธ ๊ฒฝ์ฐ๋ฅผ ์ ์ธํ๊ณ ๋ ๋ชจ๋ ์ ์ฉ๋ฉ๋๋ค. ๋น์ ์ด ๊ทธ ์ค ํ๋๋ฅผ ์น๋ฉด (๋คํํ ๋๋ ์์ง ํ์ง ์์๋ค) ๋น์ ์ ์ด์ด ์์ต๋๋ค.
์์ ํ ์ด์ด ์ข์ง๋ ์์ต๋๋ค. Rust์ inline asm
๋ฉ๋๋ค. ์ฌ๊ธฐ์ ๋์ด๋ ํด๊ฒฐ ๋ฐฉ๋ฒ ์ค ์ด๋ ๊ฒ๋ ๋ค๋ฃจ์ง ์๋ ๊ทน๋จ์ ์ธ ๊ฒฝ์ฐ๊ฐ
(์ ์๊ฒ๋ ๋ ๋ค๋ฅธ ์ฌ์ฉ ์ฌ๋ก๊ฐ ์์ต๋๋ค. ์ ๋ ์ธ์ ๊ฐ C ๋์ Rust๋ฅผ ์ฌ์ฉํ์ฌ ์ปดํจํฐ ์ํคํ ์ฒ์ ๋ฌผ๊ฑด์ ํ๋ก๊ทธ๋๋ฐํ๋ ์์คํ ์ ๊ฐ๋ฅด์น๊ณ ์ถ์ต๋๋ค. ์ธ๋ผ์ธ ์ด์ ๋ธ๋ฆฌ๊ฐ ์์ผ๋ฉด ํจ์ฌ ๋ ์ด์ํฉ๋๋ค.)
์ฐ๋ฆฌ๊ฐ Rust์์ ์ธ๋ผ์ธ ์ด์ ๋ธ๋ฆฌ๋ฅผ ์ฐ์ ์์๋ก ์ผ๊ณ ๋นจ๋ฆฌ ์์ ํ๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ์ด๊ฒ์ Rust 2019์ ๋ชฉํ์ผ ๊ฒ์ ๋๋ค. ๋๋ ์ด์ ์ ์ข์ ์๊ฒฌ์ ๋์ดํ ์๋ฃจ์ ์ค ์ด๋ ๊ฒ์ด๋ ๊ด์ฐฎ์ต๋๋ค. ์ด์ ๋ธ๋ฆฌ ์ฝ๋๋ฅผ ์ธ๋ผ์ธํ ์ ์๋ค๋ ๊ฒ์ ์ด๋์์๋ C ๋์ Rust๋ฅผ ์์ฑํ๊ธฐ ์ํ ์ ์ ์กฐ๊ฑด์ ๋๋ค. ์์ ์ ์ด๋ ค๋ฉด ์ ๋ง ํ์ํฉ๋๋ค.
์ฐ๋ฆฌ๊ฐ Rust์์ ์ธ๋ผ์ธ ์ด์ ๋ธ๋ฆฌ๋ฅผ ์ฐ์ ์์๋ก ์ผ๊ณ ๋นจ๋ฆฌ ์์ ํ๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ์ด๊ฒ์ Rust 2019์ ๋ชฉํ์ผ ๊ฒ์ ๋๋ค.
Rust 2019 ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์ ์์ฑํ๊ณ ์ด ์ฐ๋ ค๋ฅผ ํํํ์ธ์. ์ฐ๋ฆฌ ์ค ์ถฉ๋ถํ ๊ทธ๋ ๊ฒ ํ๋ค๋ฉด ๋ก๋๋งต์ ์ํฅ์ ๋ฏธ์น ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
์์ ๋ด ์๊ฒฌ์ ๋ช
ํํ ํ๊ธฐ ์ํด - ๋ฌธ์ ๋ ๋ฌธ์๊ฐ asm!(..)
๋งคํฌ๋ก์ ๋ด์ฉ์ด ๊ตฌ๋ฌธ ๋ถ์/์ํธ์์ฉํ๋ ๋ฐฉ๋ฒ์ "๊น์ด" ์ค๋ช
ํ์ง ์๋๋ค๋ ๊ฒ์
๋๋ค. ์ ๋ x86 ๋ฐ MIPS/ARM ์ด์
๋ธ๋ฆฌ์ ์ต์ํ์ง๋ง llvm์๋ ์์ฒด ์ด์
๋ธ๋ฆฌ ์ธ์ด ํ์์ด ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. ์ด์ ์ x86์ฉ ์ธ๋ผ์ธ ์ด์
๋ธ๋ฆฌ๋ฅผ ์ฌ์ฉํ ์ ์ด ์์ง๋ง C์ ASM์ ์ฐ๊ฒฐํ๊ธฐ ์ํ asm์ ๋์ ์ง์ด ์ด๋ ์ ๋ ์งํ๋์๋์ง ๋ช
ํํ์ง ์์์ต๋๋ค. ๋ฌ์คํธ ์ธ๋ผ์ธ ์ด์
๋ธ๋ฆฌ ์น์
์ ๋ฌธ๊ตฌ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ ๋ด ์ถ์ (ํ์ฌ ๋ฌดํจํ๋จ)์ LLVM์ด at&t ๋๋ intel ๋ชจ๋์์ x86 ์ด์
๋ธ๋ฆฌ๋ฅผ ๋ชจ๋ฐฉํ๋๋ก ๊ตฌ์ถ๋ ์์ฒด ASM ํ์์ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ ๋ฐ๋์ ํ์๋ x86 ์์ ์ ์ ์ฌํด์ผ ํ๋ค๋ ๊ฒ์
๋๋ค.
(๋๋ฅผ ๋์ด ๊ฒ์ ํ์ฅ๋ ๋งคํฌ๋ก ์ถ๋ ฅ์ ์ฐ๊ตฌํ๋ ๊ฒ์ด์๊ณ , ์ด๋ ์งํ ์ค์ธ ์ผ์ ์ ๋ฆฌํ์ต๋๋ค.)
๋๋ ๊ทธ ํ์ด์ง์์ ๋ ์ถ์ํ๋ ํ์๊ฐ ์๋ค๊ณ ์๊ฐํ๋ค. LLVM์ ์ํด ๊ตฌ๋ฌธ ๋ถ์๋๋ ํญ๋ชฉ๊ณผ ASM์ผ๋ก ์ง์ ํด์๋๋ ํญ๋ชฉ์ ๋ ๋ช ํํ๊ฒ ํฉ๋๋ค. ์ด๋ค ๋ถ๋ถ์ด ๋ น๊ณผ ๊ด๋ จ์ด ์๋์ง, ์ด๋ค ๋ถ๋ถ์ด ์คํ ์ค์ธ ํ๋์จ์ด์ ํน์ ํ์ง, ๊ทธ๋ฆฌ๊ณ ์ด๋ค ๋ถ๋ถ์ด ์ด๋ค์ ํจ๊ป ๊ณ ์ ์ํค๋ ์ ์ฐฉ์ ์ ์ํ๋์ง ๋ฑ์ ๋๋ค.
์ธ๋ณด
cc
ํ ์์build.rs
์ธ๋ผ์ธ ASM์ C์ ์ค๋ธ์ ํธ๋ฅผ ์ฐ๊ฒฐํ๋
๊ต์ฐจ ์ธ์ด LTO ์ ๋ํ ์ต๊ทผ์ ๋ฐ์ ์ผ๋ก ์ธํด ์ด ๋ฐฉ๋ฒ์ ์ผ๋ถ ๋จ์ ์ด ์ค์ด๋ค์ด ์ด "์ธ๋ถ ์ด์ ๋ธ๋ฆฌ blob"์ ํจ๊ณผ์ ์ผ๋ก ์ธ๋ผ์ธํ ์ ์๋์ง ๊ถ๊ธํฉ๋๋ค. ( ์๋ง๋ )
์ธ๋ณด
cc
ํ ์์build.rs
์ธ๋ผ์ธ ASM์ C์ ์ค๋ธ์ ํธ๋ฅผ ์ฐ๊ฒฐํ๋๊ต์ฐจ ์ธ์ด LTO ์ ๋ํ ์ต๊ทผ์ ๋ฐ์ ์ผ๋ก ์ธํด ์ด ๋ฐฉ๋ฒ์ ์ผ๋ถ ๋จ์ ์ด ์ค์ด๋ค์ด ์ด "์ธ๋ถ ์ด์ ๋ธ๋ฆฌ blob"์ ํจ๊ณผ์ ์ผ๋ก ์ธ๋ผ์ธํ ์ ์๋์ง ๊ถ๊ธํฉ๋๋ค.
์ด๊ฒ์ด ์๋ํ๋๋ผ๋ C๋ก ์ธ๋ผ์ธ ์ด์ ๋ธ๋ฆฌ๋ฅผ ์์ฑํ๊ณ ์ถ์ง ์์ต๋๋ค. Rust๋ก ์์ฑํ๊ณ ์ถ์ต๋๋ค. :-)
์ธ๋ผ์ธ ์ด์ ๋ธ๋ฆฌ๋ฅผ C๋ก ์์ฑํ๊ณ ์ถ์ง ์์ต๋๋ค.
.s
๋ฐ .S
ํ์ผ์ ์ง์ ์ปดํ์ผํ๊ณ ์ฐ๊ฒฐํ ์ ์์ต๋๋ค(์: ์ด crate ์ฐธ์กฐ). ๋ด ์ฑ
์์๋ C์์ ์ถฉ๋ถํ ๋ฉ๋ฆฌ ๋จ์ด์ ธ ์์ต๋๋ค. :)
์ด ๋๋ก์ ๋จ์ ์ค ์ผ๋ถ๋ฅผ ์ค์ผ ์ ์๋ค๋ฉด
์ธ์ด ๊ฐ LTO๊ฐ LLVM IR์ ์์กดํ๊ณ ์ด์ ๋ธ๋ฆฌ๊ฐ ์ด๊ฒ์ ์์ฑํ์ง ์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ด ํ์ฌ ์คํ ๊ฐ๋ฅํ์ง ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ธ์ด ๊ฐ LTO๊ฐ LLVM IR์ ์์กดํ๊ณ ์ด์ ๋ธ๋ฆฌ๊ฐ ์ด๊ฒ์ ์์ฑํ์ง ์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ด ํ์ฌ ์คํ ๊ฐ๋ฅํ์ง ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
LLVM IR ๋ชจ๋์ ๋ชจ๋ ์์ค ์ด์ ๋ธ๋ฆฌ์ ์ด์ ๋ธ๋ฆฌ๋ฅผ ์ฑ์ธ ์ ์์ต๋๋ค.
๊ฐ์ฅ ์ต๊ทผ์ ์ ์/ํ์ฌ ์ํ๊ฐ ๋ฌด์์ธ์ง ์๋ ์ฌ๋์ด ์์ต๋๊น? ์ฌํด์ ์ฃผ์ ๋ "์ฑ์๊ณผ ์ฐ๋ฆฌ๊ฐ ์์ํ ์ผ์ ๋ง๋ฌด๋ฆฌ"์ด๊ธฐ ๋๋ฌธ์ ๋ง์นจ๋ด asm
๋ง๋ฌด๋ฆฌํ ์ ์๋ ์ข์ ๊ธฐํ์ธ ๊ฒ ๊ฐ์ต๋๋ค.
์๋ก์ด (์์ ํ๋ ) ๊ตฌ๋ฌธ์ ๋ํ ๋ง์ฐํ ๊ณํ์ ์ง๋ 2์์ ๋ ผ์๋์์ต๋๋ค: https://paper.dropbox.com/doc/FFI-5NmXV30TGiSsr9dIxpqpq
๊ทธ ๋ฉ๋ชจ์ ๋ฐ๋ฅด๋ฉด @joshtriplett ์ @Amanieu ๋ RFC๋ฅผ ์์ฑํ๊ธฐ ์ํด ์๋ช ํ์ต๋๋ค.
์ ๊ตฌ๋ฌธ์ ์ํ๋ ๋ฌด์์ ๋๊น?
RFC๋ฅผ ์ ์ฉํ๊ณ ์ผ๊ฐ์ ๊ตฌํํด์ผ ํฉ๋๋ค.
ping @joshtriplett @Amanieu ์ฌ๊ธฐ๋ก ์ด๋ํ๋ ๊ฒ์ ๋์ธ ์ ์๋์ง ์๋ ค์ฃผ์ธ์! ๊ณง ์ฐ๋ฝ๋๋ฆฌ๊ฒ ์ต๋๋ค.
@cramertj AFAICT ๋๊ตฌ๋ ์ด ์์ ์ ๊ฐ์ ํ์ฌ ์์ ์ ์ํํ๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ณ ์์ต๋๋ค. ์ ์ฒด ๋์์ธ์ ์ค์ผ์นํ๋ ์ฌ์ RFC๊ฐ ์์ผ๋ฉฐ ๋ค์ ๋จ๊ณ๋ ์ด๋ฅผ ๊ตฌํํ๊ณ proc ๋งคํฌ๋ก, ํฌํฌ ๋๋ ๋ค๋ฅธ ๋ถ์์ ํ ๊ธฐ๋ฅ์ผ๋ก ์ค์ ๋ก ์๋ํ๋์ง ํ์ธํ๋ ๊ฒ์ ๋๋ค.
์๋ง๋ pre-RFC๋ฅผ ์ ์ ํ RFC๋ก ๋ณํํ์ฌ ์ ์ถํ๋ ค๊ณ ํ ์ ์์ง๋ง ๊ตฌํ ์์ด ๊ทธ๋ฌํ RFC๊ฐ ์ค๋๋ ฅ์ด ์์ ์ ์๋์ง ์์ฌ์ค๋ฝ์ต๋๋ค.
ํธ์ง: ๋ถ๋ช ํ ํ๊ธฐ ์ํด ๋๋ ๋ค์๊ณผ ๊ฐ์ pre-RFC์ ์ผ๋ถ๋ฅผ ์๋ฏธํ๋ค๊ณ ํ์ ํฉ๋๋ค.
์ถ๊ฐ๋ก ๋ ์ง์คํฐ ํด๋์ค์ ๋ํ ๋งคํ์ด ์ ์ ํ๊ฒ ์ถ๊ฐ๋ฉ๋๋ค(cf. llvm-constraint 6).
lang-ref์๋ ์์ญ ๊ฐ์ ์์น๋ณ ๋ ์ง์คํฐ ํด๋์ค๊ฐ ์์ต๋๋ค. RFC๋ ์ด ๋ชจ๋ ๊ฒ์ ๊ทธ๋ฅ ๋๊ธธ ์ ์์ผ๋ฉฐ, ๋ชจ๋ ๊ฒ์ด ์์๋๋ก ์๋ํ๊ฑฐ๋ ์๋ฏธ๊ฐ ์๊ฑฐ๋ ์ฌ๊ธฐ์์ ๋ ธ์ถ๋ LLVM์์ ์ถฉ๋ถํ "์์ ์ "์ธ์ง ํ์ธํ๋ ๋ฑ์ ๊ตฌํ์์ ์ด์ ์ ์ป์ ์ ์์ต๋๋ค. ๊ทธ๋ฅ ์ด๊ฒ๋ค์ ์๋ํ์ญ์์ค.
์ฌ๊ธฐ์ #![feature(asm)]
RISC-V ์ธ๋ผ์ธ ์ด์
๋ธ๋ฆฌ๊ฐ ์ง์๋ฉ๋๊น?
๋ด๊ฐ ์๋ ํ, ์ง์๋๋ ํ๋ซํผ์ ๋ชจ๋ ์ด์ ๋ธ๋ฆฌ๊ฐ ์ง์๋ฉ๋๋ค. llvm ์ปดํ์ผ๋ฌ์ asm ์ง์์ ๋ํ ๊ฑฐ์ ์์ ์ก์ธ์ค์ ๋๋ค.
์, RISC-V๊ฐ ์ง์๋ฉ๋๋ค. ์ํคํ ์ฒ๋ณ ์ ๋ ฅ/์ถ๋ ฅ/ ํด๋ก๋ฒ ์ ์ฝ ํด๋์ค๋
๊ทธ๋ฌ๋ ์ฃผ์ ์ฌํญ์ด ์์ต๋๋ค. ์ ๋ ฅ/์ถ๋ ฅ/ํด๋ก๋ฒ ์ ์ฝ ์กฐ๊ฑด์์ ๊ฐ๋ณ ๋ ์ง์คํฐ๋ฅผ ์ ํํด์ผ ํ๋ ๊ฒฝ์ฐ ABI ์ด๋ฆ์ด ์๋ ์ํคํ ์ฒ ๋ ์ง์คํฐ ์ด๋ฆ(x0-x31, f0-f31)์ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ์ด์ ๋ธ๋ฆฌ ์กฐ๊ฐ ์์ฒด์์ ๋ ์ข ๋ฅ์ ๋ ์ง์คํฐ ์ด๋ฆ ์ค ํ๋๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ด๋ฌํ ๊ฐ๋ ์ ์ฒ์ ์ ํ๋ ์ฌ๋์ผ๋ก์ ์ ๊ฐ ๋งํ ์ ์๋ ๊ฒ์... ์ด ์ ์ฒด ํ ๋ก ์ _์ด๋ฆฌ์์_ ๊ฒ ๊ฐ์ต๋๋ค. ๊ธฐ๊ณ ์ฝ๋์ 1:1 ๋งคํ ์ด ๋์ด์ผ ํ๋ ์ธ์ด(์ด์ ๋ธ๋ฆฌ)๊ฐ ์ด๋ป๊ฒ ์ดํ ๋ก ๊ณจ์น ์ํ ์ผ์ ์ผ์ผํค๋์?
๋๋ ๊ฝค ํผ๋ ์ค๋ฝ๋ค :
#[cfg(...)]
๋ชจ๋ ์ํคํ
์ฒ) _and ๋น์ ์ด ์ง์ํ๋ ค๊ณ ํ๋ backend_?์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ์ด ๋ฌธ์ ๋ผ๋ ๊ฒ์ ์์ง๋ง ์์ฒญ๋ ์์ ๋ฒ๊ทธ์ ์ด๊ฒ์ด ๊ฒฐ์ฝ ์์ ํ๋์ง ์์๋ค๋ ์ฌ์ค๋ก ์ธํด ๋ฐฑ์๋๋ก ์ ๋ฌํ๋ ๊ฒ์ด ๋ ๋์ ์๋ ์์ต๋๋ค. Rust๋ LLVM์ด๋ gcc ๋๋ ๋ค๋ฅธ ์ฌ๋์ ์๋ชป๋ ๊ตฌ๋ฌธ์ ์์ ํ๋ ค๊ณ ํด์๋ ์ ๋ฉ๋๋ค. Rust๋ ๋ชฉํ๋ก ์ผ๊ณ ์๋ ์ํคํ
์ฒ์ ์ปดํ์ผ๋ฌ๋ฅผ ์ํ ๊ธฐ๊ณ์ด ์ฝ๋๋ฅผ ๋ด๋ณด๋ด๋ ์ฌ์
์ ํ๊ณ ์์ต๋๋ค... ๊ทธ๋ฆฌ๊ณ asm์ ์ด๋ฏธ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ทธ ์ฝ๋์
๋๋ค!
์ฌ๊ธฐ์ ์ง์ ์ด ์๋ ์ด์ ๋ ์๋ฌด๋ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ์๊ฐ์ ํฌ์ํ์ง ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ๊ทธ๊ฒ์ ๊ธฐ๋ฅ์ ์์ ํํ๋ ์ข์ ์ด์ ๊ฐ ์๋๋๋ค.
์ด ์ค๋ ๋๋ฅผ ์ฝ๋ ๋์ ์์ด๋์ด๊ฐ ์๊ฒจ ๊ฒ์ํด์ผํ์ต๋๋ค. ์ค๋๋ ๊ฒ์๋ฌผ์ ๋ตํ๋ ๊ฒ์ด๋ผ๋ฉด ์ฃ์กํ์ง๋ง ๊ทธ๋งํ ๊ฐ์น๊ฐ ์๋ค๊ณ ์๊ฐํ์ต๋๋ค.
@main-- ๋งํ๋ค:
๋ ์ต์ ํ ๋ชจ๋ ํ์คํ ๋ ๋์ ์ฒ๋ฆฌ๋(ํนํ ํ์ดํผ์ค๋ ๋ฉ์ ๊ฒฝ์ฐ)์ ์ ๊ณตํ์ง๋ง ๋ด๊ฐ ๋ฌ์ฑํ๊ธฐ๋ฅผ ๋ฐ๋๋ ๋๊ธฐ ์๊ฐ ๊ฐ์๋ ์๋๋๋ค. ๋๋ ๊ฒฐ๊ตญ ๊ทธ ์คํ์ ์ํด nasm์ผ๋ก ๋จ์ด์ก์ง๋ง ๋ด์ฅ ์ฝ๋์์ ์ผ๋ฐ asm์ผ๋ก ์ฝ๋๋ฅผ ๋ค์ ์์ฑํด์ผ ํ๋ ๊ฒ์ ๋ถํ์ํ ๋ง์ฐฐ์ด์์ต๋๋ค. ๋ฌผ๋ก ๋๋ ์ตํฐ๋ง์ด์ ๊ฐ ์ผ๋ถ ๊ณ ๊ธ ๋ฒกํฐ API๋ฅผ ์ฌ์ฉํ ๋ ๋ช ๋ น์ด ์ ํ์ด๋ ์์ ํด๋ฉ๊ณผ ๊ฐ์ ๊ฒ๋ค์ ์ฒ๋ฆฌํ๊ธฐ๋ฅผ ์ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ฌ์ฉํ ๋ช ๋ น์ ๋ช ์์ ์ผ๋ก ๊ฒฐ์ ํ์ ๋ ์ปดํ์ผ๋ฌ๊ฐ ์ด๋ฅผ ์ด์ง๋ฝํ๋ ๊ฒ์ ์ ๋ง๋ก ์ํ์ง ์์ต๋๋ค. ์ ์ผํ ๋์์ ์ธ๋ผ์ธ asm์ ๋๋ค.
์๋ง๋ ์ธ๋ผ์ธ asm ๋์ ์ ์ฌ๊ธฐ์์ ์ฐ๋ฆฌ๊ฐ ์ ๋ง๋ก ํ์ํ ๊ฒ์ ์ตํฐ๋ง์ด์ ์๊ฒ "์ด๊ฒ์ ์ฒ๋ฆฌ๋์ ์ํด ์ต์ ํ", "์ง์ฐ์ ์ํด ์ด๊ฒ์ ์ต์ ํ", "๋ฐ์ด๋๋ฆฌ ํฌ๊ธฐ์ ๋ง๊ฒ ์ด๊ฒ์ ์ต์ ํ"๋ผ๊ณ ์๋ ค์ฃผ๋ LLVM์ ๋ํ ๊ธฐ๋ฅ ์์ฑ์ ๋๋ค. ๋๋ ์ด ์๋ฃจ์ ์ด ์ ์คํธ๋ฆผ์ด๋ผ๋ ๊ฒ์ ์๊ณ ์์ง๋ง, ์ด๊ฒ์ ๋น์ ์ ํน์ ๋ฌธ์ ๋ฅผ ์๋์ผ๋ก ํด๊ฒฐํ ๋ฟ๋ง ์๋๋ผ(๋ฎ์ ๋๊ธฐ ์๊ฐ์ ์ ๊ณตํ์ง๋ง ๊ทธ๋ ์ง ์์ผ๋ฉด ์๊ณ ๋ฆฌ์ฆ์ ๋ํ ๊ตฌํ์ ์ ๊ณตํจ์ผ๋ก์จ), ๋ํ Rust ํ๋ก๊ทธ๋๋จธ๊ฐ ์ฑ๋ฅ ํน์ฑ์ ๋ณด๋ค ์ธ๋ฐํ๊ฒ ์ ์ดํ ์ ์๊ฒ ํด์ค๋๋ค. ๊ทธ๋ค์๊ฒ ์ค์ํฉ๋๋ค.
@felix91gr ๊ทธ๊ฒ์ ์ธํฐ๋ฝํธ ํธ๋ค๋ฌ์ ๊ฐ์ด ์ ํํ ๋ช ๋ น์ด ์ํ์ค๋ฅผ ๋ฐฉ์ถํด์ผ ํ๋ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ํด๊ฒฐํ์ง ๋ชปํฉ๋๋ค.
@mark-im ๋ฌผ๋ก ์๋๋๋ค. ๊ทธ๋์ ์ ๊ฐ ์ง์ญ์ ํ์ต๋๋ค! ๐
๋ด ์์ ์ ์ธ๋ผ์ธ asm ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ฌ "์ปดํ์ผ๋ฌ๊ฐ ๋ด๊ฐ ํ์๋ก ํ๋ ๊ฒ๊ณผ ๋ฐ๋๋๋ ๋ฐฉ์์ผ๋ก ์ต์ ํ"(์ด ๊ฒฝ์ฐ ๊ณ ์ ์ ์ธ ๋ฐฉ์: ๋๊ธฐ ์๊ฐ ๋ ์ฒ๋ฆฌ๋)๋ฅผ ํด๊ฒฐํ ์ ์์ง๋ง ์๋ง๋ ๊ทธ ์ฌ์ฉ ์ฌ๋ก๋ ๋ณด๋ค ์ธ๋ถํ๋ ์ต์ ํ ์ ์ด๋ฅผ ํตํด ๋ ๋์ ์๋น์ค๋ฅผ ์ ๊ณต๋ฐ์ ์ ์์ต๋๋ค. :)
์ธ๋ผ์ธ ์ด์ ๋ธ๋ฆฌ์ ๋ํ ํฅํ ๋ณ๊ฒฝ ์ฌํญ์ ๋น์ถ์ด ์ด ๋ฌธ์ ์ ๋๋ถ๋ถ์ ๋ ผ์๋ ๋ ์ด์ ๊ด๋ จ์ด ์์ต๋๋ค. ๋ฐ๋ผ์ ์ฐ๋ฆฌ๊ฐ ๊ฐ์ง๊ณ ์๋ ์ธ๋ผ์ธ ์ด์ ๋ธ๋ฆฌ์ ๊ฐ ์ ํ์ ๋ํ ๋ ๊ฐ์ง ๊ฐ๋ณ ์ถ์ ๋ฌธ์ ๋ฅผ ์ํด ์ด ๋ฌธ์ ๋ฅผ ๋ง๋ฌด๋ฆฌํ๊ฒ ์ต๋๋ค.
llvm_asm
) #70173asm!
) #72016
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
LLVM์ ์ธ๋ผ์ธ asm ๊ตฌ๋ฌธ์ด clang/gcc์์ ์ฌ์ฉ๋๋ ๊ตฌ๋ฌธ๊ณผ ๋ค๋ฅด๋ค๋ ์ ์ ์ง์ ํ๊ณ ์ถ์ต๋๋ค. ์ฐจ์ด์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
$0
๋์%0
.%[name]
์ง์ํ์ง ์์ต๋๋ค."{eax}"
๋์"a"
86์."{r11}"
)์ ์ง์ํฉ๋๋ค. C์์๋ ๊ฐ์ ๋ ์ง์คํฐ(register asm("r11") int x
)์ ๋ฐ์ธ๋ฉํ๊ธฐ ์ํด ๋ ์ง์คํฐ asm ๋ณ์๋ฅผ ๋์ ์ฌ์ฉํด์ผ ํฉ๋๋ค."m"
๋ฐ"=m"
์ ์ฝ ์กฐ๊ฑด์ ๊ธฐ๋ณธ์ ์ผ๋ก ๊นจ์ก์ต๋๋ค. Clang์ ์ด๋ฅผ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ์ ์ฝ"*m"
๋ฐ"=*m"
๋ก ๋ณํํ๊ณ ๋ณ์ ์์ฒด ๋์ LLVM์ ๋ณ์ ์ฃผ์๋ฅผ ์ ๋ฌํฉ๋๋ค.Clang์ ์ธ๋ผ์ธ asm์ LLVM์ ์ ๋ฌํ๊ธฐ ์ ์ gcc ํ์์์ LLVM ํ์์ผ๋ก ๋ณํํฉ๋๋ค. ๋ํ ์ ์ฝ ์กฐ๊ฑด์ ์ผ๋ถ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ์ํํฉ๋๋ค. ์๋ฅผ ๋ค์ด
"i"
ํผ์ฐ์ฐ์๊ฐ ์ปดํ์ผ ํ์ ์์์ธ์ง ํ์ธํฉ๋๋ค.์ด์ ๋น์ถ์ด ๋๋ ์ฐ๋ฆฌ๊ฐ clang์ด ์ํํ๋ ๊ฒ๊ณผ ๋์ผํ ๋ฒ์ญ ๋ฐ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ๊ตฌํํ๊ณ ์ด์ํ LLVM ๋์ ์ ์ ํ gcc ์ธ๋ผ์ธ asm ๊ตฌ๋ฌธ์ ์ง์ํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.