Rust: 'asm'์— ๋Œ€ํ•œ ์ถ”์  ๋ฌธ์ œ(์ธ๋ผ์ธ ์–ด์…ˆ๋ธ”๋ฆฌ)

์— ๋งŒ๋“  2015๋…„ 11์›” 09์ผ  ยท  111์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: rust-lang/rust

์ด ๋ฌธ์ œ๋Š” ์ธ๋ผ์ธ ์–ด์…ˆ๋ธ”๋ฆฌ์˜ ์•ˆ์ •ํ™”๋ฅผ ์ถ”์ ํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ๊ธฐ๋Šฅ์€ RFC ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š์•˜์œผ๋ฉฐ ์•„๋งˆ๋„ ์•ˆ์ •ํ™” ์ „์— ์ˆ˜ํ–‰ํ•ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

A-inline-assembly B-unstable C-tracking-issue T-lang requires-nightly

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

LLVM์˜ ์ธ๋ผ์ธ asm ๊ตฌ๋ฌธ์ด clang/gcc์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ตฌ๋ฌธ๊ณผ ๋‹ค๋ฅด๋‹ค๋Š” ์ ์„ ์ง€์ ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ฐจ์ด์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • LLVM์€ ์‚ฌ์šฉ $0 ๋Œ€์‹  %0 .
  • LLVM์€ ๋ช…๋ช…๋œ asm ํ”ผ์—ฐ์‚ฐ์ž %[name] ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • LLVM์€ ๋‹ค๋ฅธ ๋ ˆ์ง€์Šคํ„ฐ ์ œ์•ฝ ์กฐ๊ฑด ์œ ํ˜•์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค ์˜ˆ๋ฅผ ๋“ค์–ด "{eax}" ๋Œ€์‹  "a" 86์—.
  • LLVM์€ ๋ช…์‹œ์  ๋ ˆ์ง€์Šคํ„ฐ ์ œ์•ฝ ์กฐ๊ฑด( "{r11}" )์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. C์—์„œ๋Š” ๊ฐ’์„ ๋ ˆ์ง€์Šคํ„ฐ( register asm("r11") int x )์— ๋ฐ”์ธ๋”ฉํ•˜๊ธฐ ์œ„ํ•ด ๋ ˆ์ง€์Šคํ„ฐ asm ๋ณ€์ˆ˜๋ฅผ ๋Œ€์‹  ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • LLVM "m" ๋ฐ "=m" ์ œ์•ฝ ์กฐ๊ฑด์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๊นจ์กŒ์Šต๋‹ˆ๋‹ค. Clang์€ ์ด๋ฅผ ๊ฐ„์ ‘ ๋ฉ”๋ชจ๋ฆฌ ์ œ์•ฝ "*m" ๋ฐ "=*m" ๋กœ ๋ณ€ํ™˜ํ•˜๊ณ  ๋ณ€์ˆ˜ ์ž์ฒด ๋Œ€์‹  LLVM์— ๋ณ€์ˆ˜ ์ฃผ์†Œ๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
  • ๋“ฑ...

Clang์€ ์ธ๋ผ์ธ asm์„ LLVM์— ์ „๋‹ฌํ•˜๊ธฐ ์ „์— gcc ํ˜•์‹์—์„œ LLVM ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์ œ์•ฝ ์กฐ๊ฑด์˜ ์ผ๋ถ€ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด "i" ํ”ผ์—ฐ์‚ฐ์ž๊ฐ€ ์ปดํŒŒ์ผ ํƒ€์ž„ ์ƒ์ˆ˜์ธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.


์ด์— ๋น„์ถ”์–ด ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ clang์ด ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ ๋ฒˆ์—ญ ๋ฐ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์ด์ƒํ•œ LLVM ๋Œ€์‹  ์ ์ ˆํ•œ gcc ์ธ๋ผ์ธ asm ๊ตฌ๋ฌธ์„ ์ง€์›ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  111 ๋Œ“๊ธ€

์•ˆ์ •์ ์ธ ์ฝ”๋“œ์—์„œ ์ธ๋ผ์ธ ์–ด์…ˆ๋ธ”๋ฆฌ์˜ ํ•˜์œ„ ํ˜ธํ™˜์„ฑ์„ ๋ณด์žฅํ•˜๋Š” ๋ฐ ์–ด๋ ค์›€์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@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์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ตฌ๋ฌธ๊ณผ ๋‹ค๋ฅด๋‹ค๋Š” ์ ์„ ์ง€์ ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ฐจ์ด์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • LLVM์€ ์‚ฌ์šฉ $0 ๋Œ€์‹  %0 .
  • LLVM์€ ๋ช…๋ช…๋œ asm ํ”ผ์—ฐ์‚ฐ์ž %[name] ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • LLVM์€ ๋‹ค๋ฅธ ๋ ˆ์ง€์Šคํ„ฐ ์ œ์•ฝ ์กฐ๊ฑด ์œ ํ˜•์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค ์˜ˆ๋ฅผ ๋“ค์–ด "{eax}" ๋Œ€์‹  "a" 86์—.
  • LLVM์€ ๋ช…์‹œ์  ๋ ˆ์ง€์Šคํ„ฐ ์ œ์•ฝ ์กฐ๊ฑด( "{r11}" )์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. C์—์„œ๋Š” ๊ฐ’์„ ๋ ˆ์ง€์Šคํ„ฐ( register asm("r11") int x )์— ๋ฐ”์ธ๋”ฉํ•˜๊ธฐ ์œ„ํ•ด ๋ ˆ์ง€์Šคํ„ฐ asm ๋ณ€์ˆ˜๋ฅผ ๋Œ€์‹  ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • LLVM "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์— ๊ตญํ•œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ฐ€์žฅ ์ตœ๊ทผ์˜ ์ž‘์—… ์ฃผ์—์„œ ์–ป์€ ๊ฒฐ๋ก ์„ ๋‹ค์‹œ ๋ฐ˜๋ณตํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

  • ์˜ค๋Š˜๋‚  ์šฐ๋ฆฌ๊ฐ€ ์•„๋Š” ํ•œ ์ด ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ๋ฌธ์„œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์—†์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” LLVM ๋‚ด๋ถ€ ๋ฐ ๋ชจ๋“  ๊ฒƒ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.
  • ์šฐ๋ฆฌ๊ฐ€ ์•„๋Š” ํ•œ LLVM์€ ์•ˆ์ •์„ฑ์„ ๋ณด์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” LLVM์˜ ์ธ๋ผ์ธ ์–ด์…ˆ๋ธ”๋ฆฌ ๊ตฌํ˜„์ด ์–ธ์ œ๋“ ์ง€ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ด๊ฒƒ์€ ํ˜„์žฌ Rustc์—์„œ ๋งค์šฐ ๋ฒ„๊ทธ๊ฐ€ ๋งŽ์€ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ ํƒ€์ž„์— segfaults, ICE ๋ฐ ์ด์ƒํ•œ LLVM ์˜ค๋ฅ˜๋กœ ๊ฐ€๋“ ์ฐจ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์‚ฌ์–‘์ด ์—†์œผ๋ฉด ์ด์— ๋Œ€ํ•œ ๋Œ€์ฒด ๋ฐฑ์—”๋“œ๋ฅผ ์ƒ์ƒ์กฐ์ฐจ ํ•˜๋Š” ๊ฒƒ์ด ๊ฑฐ์˜ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๋‚˜์—๊ฒŒ ์ด๊ฒƒ์€ "์ง€๊ธˆ ์ด๊ฒƒ์„ ์•ˆ์ •ํ™”ํ•˜๋ฉด ๋ฏธ๋ž˜์— ํ›„ํšŒํ•  ๊ฒƒ์„ ๋ณด์žฅํ•  ๊ฒƒ"์˜ ์ •์˜์ด๋ฉฐ "์œ ๊ฐ์Šค๋Ÿฝ๊ฒŒ๋„" ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ "์ƒˆ๋กœ์šด ์‹œ์Šคํ…œ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ์‹ฌ๊ฐํ•œ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ๊ฐ€๋Šฅ์„ฑ์ด ๋งค์šฐ ๋†’์•„ ๋ณด์ž…๋‹ˆ๋‹ค."

์ ˆ๋Œ€์ ์œผ๋กœ ์ตœ์†Œํ•œ์˜ ์ด์•Œ(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! ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค.

  • ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š” ๋‚ด์žฅ ํ•จ์ˆ˜ ํ•ด๊ฒฐ
  • ์ปดํŒŒ์ผ๋Ÿฌ ๋ฒ„๊ทธ ํ•ด๊ฒฐ / ์ฐจ์„ ์˜ ์ฝ”๋“œ ์ƒ์„ฑ
  • ๋‹จ์ผ ๋‚ด์žฅ ํ˜ธ์ถœ ์‹œํ€€์Šค๋ฅผ ํ†ตํ•ด ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†๋Š” ์ž‘์—… ์ˆ˜ํ–‰(์˜ˆ: ์ฝ๊ธฐ EFLAGS-modify-write EFLAGS ์—ฌ๊ธฐ์„œ LLVM์€ ์ฝ๊ธฐ์™€ ์“ฐ๊ธฐ ๊ฐ„์— eflag๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ LLVM์€ ์‚ฌ์šฉ์ž๊ฐ€ ์ˆ˜์ •ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋’ค์— ์žˆ์Šต๋‹ˆ๋‹ค(์ฆ‰, EFLAGS๋กœ ์•ˆ์ „ํ•˜๊ฒŒ ์ž‘์—…ํ•˜๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์€ ์ฝ๊ธฐ-์ˆ˜์ •-์“ฐ๊ธฐ ์ž‘์—…์„ ๋‹จ์ผ ์›์ž 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 ๊ฐ€ ๋ณ‘๋ ฌ๋กœ ๋งํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ํ˜„์žฌ ์ƒํ™ฉ์˜ ํ˜„์‹ค ์„ ์ง€์ ํ•˜๋ ค๊ณ ํ•˜๋ฉด์„œ ์ธ๋ผ์ธ ์–ด์…ˆ๋ธ”๋ฆฌ์˜ ์œ ์šฉ์„ฑ์„ ์™„์ „ํžˆ ๋ฌด์‹œํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์—ฌ๋Ÿฌ ์‚ฌ๋žŒ๋“ค์ด ํ–‰๋™ํ•˜๋Š” ์ด์œ ๊ฐ€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š”

  1. ๋‚ด์žฅ์ด ์กด์žฌํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์— ๋Œ€ํ•ด ์–ธ๊ธ‰ํ•˜์ง€ ์•Š์€ ํ•œ ํฌ์Šคํ„ฐ๋Š” ์˜ค๋Š˜๋‚ ์˜ ์•ˆ์ •์ ์ธ ๋‚ด์žฅ์„ ํ–ฅํ•ด ์กด์žฌํ•œ๋‹ค๊ณ  ์ง€์ ํ–ˆ์Šต๋‹ˆ๋‹ค.
  2. ์ œ์•ˆ์— ๋Œ€ํ•œ ์ดˆ๊ธฐ ํ”ผ๋“œ๋ฐฑ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋„๋ก ์ œ์•ˆ๋œ ๋‚ด์žฅ ์š”์†Œ์— ๋Œ€ํ•ด ๋‹ค๋ฅธ ํฌ์Šคํ„ฐ๋ฅผ ๊ฐ€๋ฆฌ์ผฐ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์„ ๋งค์šฐ ๋ช…ํ™•ํ•˜๊ฒŒ ๋งํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์˜ˆ, ์ธ๋ผ์ธ ์–ด์…ˆ๋ธ”๋ฆฌ๊ฐ€ ๋•Œ๋•Œ๋กœ ํ•„์š”ํ•˜๊ณ  ์ข‹์Šต๋‹ˆ๋‹ค . ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์ฃผ์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ €๋Š” ์‚ฌ๋žŒ๋“ค์ด ํ˜„์žฌ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹ค์ œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ๋„์›€์„ ์ฃผ๋ ค๊ณ  ํ•  ๋ฟ์ž…๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋งํ•˜๋ ค๊ณ  ํ•˜๋Š” ๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ์ด์— ๋Œ€ํ•ด ์ข€ ๋” ์กฐ์ง์ ์ธ ์ ‘๊ทผ ๋ฐฉ์‹, ์ ์ ˆํ•œ ์„ค๋ฌธ์กฐ์‚ฌ๋ฅผ ํ•ด์•ผ ํ•˜๊ณ  ์ด ์Šค๋ ˆ๋“œ์—์„œ ์šฐ๋ฆฌ ์ค‘ ์†Œ์ˆ˜๋ณด๋‹ค ํ›จ์”ฌ ๋” ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•œ ๋‹ค์Œ ์ด๋ฅผ ์‚ฌ์šฉ ํ•˜์—ฌ ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ง€์ 

๊ฐ ์•„ํ‚คํ…์ฒ˜์—๋Š” ์ธ๋ผ์ธ 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๊ฐ€ ์ง€์›ํ•˜๋Š” ๋ชจ๋“  ์•„ํ‚คํ…์ฒ˜์—์„œ ๋ชจ๋“  ๋‹จ์ผ ๋ช…๋ น์–ด๋ฅผ ๋…ธ์ถœํ•˜๋Š” ๋‚ด์žฅ ํ•จ์ˆ˜๊ฐ€ ์žˆ๋”๋ผ๋„(์ด๋Š” ๊ฑฐ์˜ ๊ฐ–๊ณ  ์žˆ์ง€ ์•Š์Œ) ์‚ฌ๋žŒ๋“ค์ด ์ธ๋ผ์ธ ์–ด์…ˆ๋ธ”๋ฆฌ๋กœ ์ •๊ธฐ์ ์œผ๋กœ ๋Œ์–ด์˜ค๋Š” ์ผ๋ถ€ ์Šคํ„ดํŠธ์—๋Š” ์—ฌ์ „ํžˆ ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” ์‰ฝ๊ฒŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†๋Š” ์ธ๋ผ์ธ ์–ด์…ˆ๋ธ”๋ฆฌ๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ž‘์—…์˜ ์ž‘์€ ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค. ์ด๋“ค ๊ฐ๊ฐ์€ ๋‚ด๊ฐ€ ๋ณธ(๋˜๋Š” ์–ด๋–ค ๊ฒฝ์šฐ์—๋Š” ์ž‘์„ฑ๋œ) ์‹ค์ œ ์‚ฌ๋ก€์ด๋ฉฐ ๊ฐ€์ƒ์ด ์•„๋‹™๋‹ˆ๋‹ค.

  • ๋ณ„๋„์˜ ELF ์„น์…˜์— ํŠน์ • ํŒจํ„ด์˜ ๋ช…๋ น์–ด ๊ตฌํ˜„์„ ๋ชจ๋‘ ์ˆ˜์ง‘ํ•œ ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ๋กœ๋“œํ•  ๋•Œ ์‹คํ–‰ ์ค‘์ธ ์‹œ์Šคํ…œ์˜ ํŠน์„ฑ์— ๋”ฐ๋ผ ๋Ÿฐํƒ€์ž„์— ํ•ด๋‹น ์„น์…˜์„ ํŒจ์น˜ํ•ฉ๋‹ˆ๋‹ค.
  • ๋Œ€์ƒ์ด ๋Ÿฐํƒ€์ž„์— ํŒจ์น˜๋˜๋Š” ์ ํ”„ ๋ช…๋ น์–ด๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • ์ค‘๊ฐ„์— ์ž ์žฌ์ ์ธ ์ค‘๋‹จ์„ ์‹ ์ค‘ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š” ํŒจํ„ด์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ •ํ™•ํ•œ ๋ช…๋ น์–ด ์‹œํ€€์Šค ๋ฅผ ๋‚ด๋ณด๋‚ด์‹ญ์‹œ์˜ค(๊ฐœ๋ณ„ ๋ช…๋ น์–ด์— ๋Œ€ํ•ด ๋‚ด์žฅ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Œ).
  • ๋ช…๋ น์„ ๋‚ด๋ณด๋‚ธ ๋‹ค์Œ asm ๋ธ”๋ก์˜ ๋์œผ๋กœ ์ ํ”„ํ•œ ๋‹ค์Œ ๋ช…๋ น์ด ์˜ค๋ฅ˜๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒฝ์šฐ ํ•˜๋“œ์›จ์–ด ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๊ธฐ๊ฐ€ ์ ํ”„ํ•  ์˜ค๋ฅ˜ ๋ณต๊ตฌ ์ฝ”๋“œ๊ฐ€ ๋’ค๋”ฐ๋ฆ…๋‹ˆ๋‹ค.
  • ์–ด์…ˆ๋ธ”๋Ÿฌ๊ฐ€ ์•„์ง ์•Œ์ง€ ๋ชปํ•˜๋Š” ๋ช…๋ น์–ด์— ํ•ด๋‹นํ•˜๋Š” ๋ฐ”์ดํŠธ ์‹œํ€€์Šค๋ฅผ ๋‚ด๋ณด๋ƒ…๋‹ˆ๋‹ค.
  • ์‹ ์ค‘ํ•˜๊ฒŒ ๋‹ค๋ฅธ ์Šคํƒ์œผ๋กœ ์ „ํ™˜ํ•œ ๋‹ค์Œ ๋‹ค๋ฅธ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์‹ญ์‹œ์˜ค.
  • ํŠน์ • ๋ ˆ์ง€์Šคํ„ฐ์˜ ์ธ์ˆ˜๊ฐ€ ํ•„์š”ํ•œ ์–ด์…ˆ๋ธ”๋ฆฌ ๋ฃจํ‹ด ๋˜๋Š” ์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

+1e6

@eddyb

์ข‹์•„, ๋‚˜๋Š” ๋‚ด์žฅ ์ ‘๊ทผ๋ฒ•์„ ์‹œ๋„ํ•˜๊ณ  ๊ทธ๊ฒƒ์ด ํ•„์š”ํ•œ ๊ณณ์„ ๋ณผ ๊ฒƒ์ด๋‹ค. ๋‹น์‹ ์ด ์˜ณ์„ ๊ฒƒ์ด๊ณ  ๊ทธ๊ฒƒ์ด ์ œ ๊ฒฝ์šฐ์— ๊ฐ€์žฅ ์ข‹์€ ์ ‘๊ทผ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

@joshtriplett ๊ฐ€ ์„ฑ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค! ์ด๊ฒƒ๋“ค์€ ๋‚ด๊ฐ€ ์—ผ๋‘์— ๋‘” ์ •ํ™•ํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€์ž…๋‹ˆ๋‹ค.

loop {
   :thumbs_up:
}

๋ช‡ ๊ฐ€์ง€ ๋‹ค๋ฅธ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

  • BIOS/EFI ํ˜ธ์ถœ ๋ฐ 16๋น„ํŠธ ๋ฆฌ์–ผ ๋ชจ๋“œ์™€ ๊ฐ™์€ ์ด์ƒํ•œ ์•„ํ‚คํ…์ฒ˜ ๋ชจ๋“œ์—์„œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • ์ด์ƒํ•˜๊ฑฐ๋‚˜ ํŠน์ดํ•œ ์ฃผ์†Œ ์ง€์ • ๋ชจ๋“œ๋กœ ์ฝ”๋“œ ์ž‘์„ฑ(16๋น„ํŠธ ๋ฆฌ์–ผ ๋ชจ๋“œ, ๋ถ€ํŠธ๋กœ๋” ๋“ฑ์—์„œ ์ž์ฃผ ๋‚˜ํƒ€๋‚จ)

@mark-im ๋ฌผ๋ก ์ž…๋‹ˆ๋‹ค! ๊ทธ๋ฆฌ๊ณ  ๋‘ ๋ชฉ๋ก ๋ชจ๋‘์— ํ•˜์œ„ ์‚ฌ๋ก€๊ฐ€ ์žˆ๋Š” ์š”์ ์„ ์ผ๋ฐ˜ํ™”ํ•ฉ๋‹ˆ๋‹ค. ํ˜ธ์ถœ ๊ทœ์น™ ๊ฐ„์— ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์ €๋Š” ์ด ๋ฌธ์ œ์— ์ฐฌ์„ฑํ•˜์—ฌ #53118์„ ๋งˆ๊ฐํ•˜๊ณ  ๊ธฐ๋ก์„ ์œ„ํ•ด ์—ฌ๊ธฐ์— PR์„ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ 8์›”์˜ ๊ฒƒ์ด์ง€๋งŒ ๊ฐ„๋‹จํžˆ ์‚ดํŽด๋ณด๋ฉด ์ƒํ™ฉ์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.


์ธ๋ผ์ธ ์–ด์…ˆ๋ธ”๋ฆฌ ์„น์…˜ ์€ ์ •๋ฐ€ ๊ฒ€์‚ฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ์ƒํƒœ์—์„œ๋Š” ๋™์ž‘๊ณผ ๊ตฌ๋ฌธ์ด rustc ๋ฐ ์ผ๋ฐ˜์ ์œผ๋กœ Rust ์–ธ์–ด์— ๋ฌถ์—ฌ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ฑฐ์˜ ์ „์ฒด ๋ฌธ์„œ๋Š” llvm ๋„๊ตฌ ์ฒด์ธ์„ ์‚ฌ์šฉํ•˜๋Š” x86/x86_64 ์–ด์…ˆ๋ธ”๋ฆฌ์—๋งŒ ํ•ด๋‹น๋ฉ๋‹ˆ๋‹ค. ๋ถ„๋ช…ํžˆ ๋งํ•ด์„œ, ๋‚˜๋Š” ๋ถ„๋ช…ํžˆ ํ”Œ๋žซํผ์— ํŠน์ •ํ•œ ์–ด์…ˆ๋ธ”๋ฆฌ ์ฝ”๋“œ ์ž์ฒด๋ฅผ ๋งํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ธ๋ผ์ธ ์–ด์…ˆ๋ธ”๋ฆฌ์˜ ์ผ๋ฐ˜์ ์ธ ์•„ํ‚คํ…์ฒ˜์™€ ์‚ฌ์šฉ๋ฒ•์„ ๋งํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ARM ํƒ€๊ฒŸ๊ณผ ๊ด€๋ จํ•˜์—ฌ ์ธ๋ผ์ธ ์–ด์…ˆ๋ธ”๋ฆฌ ๋™์ž‘์— ๋Œ€ํ•œ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ์†Œ์Šค๋ฅผ ์ฐพ์ง€ ๋ชปํ–ˆ์ง€๋งŒ ๋‚ด ์‹คํ—˜ ๋ฐ ARM GCC ์ธ๋ผ์ธ ์–ด์…ˆ๋ธ”๋ฆฌ ์„ค๋ช…์„œ ์ฐธ์กฐ ์— ๋”ฐ๋ฅด๋ฉด ๋‹ค์Œ ์‚ฌํ•ญ์ด ์™„์ „ํžˆ ์ž˜๋ชป๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ARM/MIPS(๋ฐ ๋Œ€๋ถ€๋ถ„์˜ ๋‹ค๋ฅธ CISC?)์™€ ๊ฐ™์€ ASM ๊ตฌ๋ฌธ์€ ๋Œ€์ƒ ๋ ˆ์ง€์Šคํ„ฐ์™€ ํ•จ๊ป˜ Intel-esque ๊ตฌ๋ฌธ์„ ๋จผ์ € ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ธ๋ผ์ธ asm์ด ์‹ค์ œ ํ”Œ๋žซํผ/์ปดํŒŒ์ผ๋Ÿฌ๋ณ„ ๊ตฌ๋ฌธ์œผ๋กœ ๋ณ€ํ™˜๋œ at&t ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ–ˆ์œผ๋ฉฐ x86 ๋ ˆ์ง€์Šคํ„ฐ ์ด๋ฆ„์„ ARM ๋ ˆ์ง€์Šคํ„ฐ ์ด๋ฆ„์œผ๋กœ๋งŒ ๋Œ€์ฒดํ•ด์•ผ ํ•จ์„ ์˜๋ฏธ/์•”์‹œํ•˜๋Š” ๋ฌธ์„œ๋ฅผ ์ดํ•ดํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ์ด์™€ ๊ด€๋ จํ•˜์—ฌ intel ์˜ต์…˜์€ ์œ ํšจํ•˜์ง€ ์•Š์œผ๋ฉฐ ์ปดํŒŒ์ผํ•  ๋•Œ "์•Œ ์ˆ˜ ์—†๋Š” ์ง€์‹œ๋ฌธ" ์˜ค๋ฅ˜๊ฐ€
  • ARM GCC ์ธ๋ผ์ธ ์–ด์…ˆ๋ธ”๋ฆฌ ๋ฌธ์„œ ( arm-none-eabi-* ๋„๊ตฌ ์ฒด์ธ์„ ์‚ฌ์šฉํ•˜์—ฌ thumbv7em-none-eabi ์— ๋Œ€ํ•ด ๋นŒ๋“œํ•˜๋Š” ๊ฒฝ์šฐ ์ธ๋ผ์ธ ์–ด์…ˆ๋ธ”๋ฆฌ ํ˜•์‹์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ๊ธฐ๋ณธ ๊ฐ€์ •์กฐ์ฐจ๋„ ํ”Œ๋žซํผ์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ARM์˜ ๊ฒฝ์šฐ ์ถœ๋ ฅ ๋ ˆ์ง€์Šคํ„ฐ(๋‘ ๋ฒˆ์งธ ๋งคํฌ๋กœ ์ธ์ˆ˜)๋Š” ๋ ˆ์ง€์Šคํ„ฐ ์ฐธ์กฐ๋กœ ๊ณ„์‚ฐ๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, $0 ๋Š” x86 llvm ๋ช…๋ น์–ด์˜ ๊ฒฝ์šฐ์™€ ๊ฐ™์ด ์ฒซ ๋ฒˆ์งธ ์ž…๋ ฅ ๋ ˆ์ง€์Šคํ„ฐ๊ฐ€ ์•„๋‹ˆ๋ผ ์ฒซ ๋ฒˆ์งธ ์ถœ๋ ฅ ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค.
  • ๋™์‹œ์— ๋‹ค๋ฅธ ์ปดํŒŒ์ผ๋Ÿฌ ๊ด€๋ จ ๊ธฐ๋Šฅ์€ _not_ ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ ˆ์ง€์Šคํ„ฐ์— ๋ช…๋ช…๋œ ์ฐธ์กฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ์ธ๋ฑ์Šค๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: asm("mov %[result],%[value],ror #1":[result] "=r" (y):[value] "r" (x)); ๋Š” ์œ ํšจํ•˜์ง€ ์•Š์Œ).
  • (x86/x86_64 ํƒ€๊ฒŸ์˜ ๊ฒฝ์šฐ์—๋„ ์ธ๋ผ์ธ ์–ด์…ˆ๋ธ”๋ฆฌ ์˜ˆ์ œ์—์„œ $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!() ์— ๊ฐ‡ํ˜€ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ ์ ˆํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ตœ์ ํ™” ํ”„๋กœ๊ทธ๋žจ์— ์˜์กดํ•˜์—ฌ ์ตœ์ ์˜ ์ฝ”๋“œ ์ƒ์„ฑ
  • ๊ฑฐ์˜ ๋ชจ๋“  ๋ฉด์—์„œ ์ธ๋ผ์ธ 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 ๋งคํ•‘ ์ด ๋˜์–ด์•ผ ํ•˜๋Š” ์–ธ์–ด(์–ด์…ˆ๋ธ”๋ฆฌ)๊ฐ€ ์–ด๋–ป๊ฒŒ ์ดํ† ๋ก ๊ณจ์น˜ ์•„ํ”ˆ ์ผ์„ ์ผ์œผํ‚ค๋‚˜์š”?

๋‚˜๋Š” ๊ฝค ํ˜ผ๋ž€ ์Šค๋Ÿฝ๋‹ค :

  • ๋‹น์‹ ์€ ASM์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒฝ์šฐ, ๊ทธ๊ฒƒ์€ (์™€ ์ธ๊ฐ„์— ์˜ํ•ด ๋‹ค์‹œ ์“ธ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค #[cfg(...)] ๋ชจ๋“  ์•„ํ‚คํ…์ฒ˜) _and ๋‹น์‹ ์ด ์ง€์›ํ•˜๋ ค๊ณ ํ•˜๋Š” backend_?
  • ์ด๊ฒƒ์€ "๊ตฌ๋ฌธ" ์งˆ๋ฌธ์ด ๋ฌด์˜๋ฏธํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค... ํ•ด๋‹น ์•„ํ‚คํ…์ฒ˜์— ๋Œ€ํ•œ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๊ณ  ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋Š” ๋ฐฑ์—”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.
  • Rust๋Š” ๋ฐ”์ดํŠธ๋ฅผ ์˜ฌ๋ฐ”๋ฅธ ๋ ˆ์ง€์Šคํ„ฐ์— ๋„ฃ๊ณ  ์–ด๋–ค ์•„ํ‚คํ…์ฒ˜์— ๋Œ€ํ•ด ์ปดํŒŒ์ผ๋˜๋Š”์ง€์— ๋Œ€ํ•ด ์Šคํƒ์— ํ‘ธ์‹œ/ํŒ์„ ํ•  ์ˆ˜ ์žˆ๋Š” std ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ํ•จ์ˆ˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ ์ด๊ฒƒ์€ ๋ชจ๋“  ์•„ํ‚คํ…์ฒ˜์™€ ์‹ฌ์ง€์–ด ๋ชจ๋“  ๋ฐฑ์—”๋“œ์— ๋Œ€ํ•ด ๋‹ค์‹œ ์ž‘์„ฑํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์ด ๋ฌธ์ œ๋ผ๋Š” ๊ฒƒ์€ ์•Œ์ง€๋งŒ ์—„์ฒญ๋‚œ ์ˆ˜์˜ ๋ฒ„๊ทธ์™€ ์ด๊ฒƒ์ด ๊ฒฐ์ฝ” ์•ˆ์ •ํ™”๋˜์ง€ ์•Š์•˜๋‹ค๋Š” ์‚ฌ์‹ค๋กœ ์ธํ•ด ๋ฐฑ์—”๋“œ๋กœ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚˜์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. Rust๋Š” LLVM์ด๋‚˜ gcc ๋˜๋Š” ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ์ž˜๋ชป๋œ ๊ตฌ๋ฌธ์„ ์ˆ˜์ •ํ•˜๋ ค๊ณ  ํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. Rust๋Š” ๋ชฉํ‘œ๋กœ ์‚ผ๊ณ  ์žˆ๋Š” ์•„ํ‚คํ…์ฒ˜์™€ ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์œ„ํ•œ ๊ธฐ๊ณ„์–ด ์ฝ”๋“œ๋ฅผ ๋‚ด๋ณด๋‚ด๋Š” ์‚ฌ์—…์„ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค... ๊ทธ๋ฆฌ๊ณ  asm์€ ์ด๋ฏธ ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ทธ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค!

์—ฌ๊ธฐ์„œ ์ง„์ „์ด ์—†๋Š” ์ด์œ ๋Š” ์•„๋ฌด๋„ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์„ ํˆฌ์žํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๊ธฐ๋Šฅ์„ ์•ˆ์ •ํ™”ํ•˜๋Š” ์ข‹์€ ์ด์œ ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

์ด ์Šค๋ ˆ๋“œ๋ฅผ ์ฝ๋Š” ๋™์•ˆ ์•„์ด๋””์–ด๊ฐ€ ์ƒ๊ฒจ ๊ฒŒ์‹œํ•ด์•ผํ–ˆ์Šต๋‹ˆ๋‹ค. ์˜ค๋ž˜๋œ ๊ฒŒ์‹œ๋ฌผ์— ๋‹ตํ•˜๋Š” ๊ฒƒ์ด๋ผ๋ฉด ์ฃ„์†กํ•˜์ง€๋งŒ ๊ทธ๋งŒํ•œ ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

@main-- ๋งํ–ˆ๋‹ค:

๋‘ ์ตœ์ ํ™” ๋ชจ๋‘ ํ™•์‹คํžˆ ๋” ๋‚˜์€ ์ฒ˜๋ฆฌ๋Ÿ‰(ํŠนํžˆ ํ•˜์ดํผ์Šค๋ ˆ๋”ฉ์˜ ๊ฒฝ์šฐ)์„ ์ œ๊ณตํ•˜์ง€๋งŒ ๋‚ด๊ฐ€ ๋‹ฌ์„ฑํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋˜ ๋Œ€๊ธฐ ์‹œ๊ฐ„ ๊ฐ์†Œ๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ฒฐ๊ตญ ๊ทธ ์‹คํ—˜์„ ์œ„ํ•ด nasm์œผ๋กœ ๋–จ์–ด์กŒ์ง€๋งŒ ๋‚ด์žฅ ์ฝ”๋“œ์—์„œ ์ผ๋ฐ˜ asm์œผ๋กœ ์ฝ”๋“œ๋ฅผ ๋‹ค์‹œ ์ž‘์„ฑํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์€ ๋ถˆํ•„์š”ํ•œ ๋งˆ์ฐฐ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  ๋‚˜๋Š” ์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ ์ผ๋ถ€ ๊ณ ๊ธ‰ ๋ฒกํ„ฐ API๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋ช…๋ น์–ด ์„ ํƒ์ด๋‚˜ ์ƒ์ˆ˜ ํด๋”ฉ๊ณผ ๊ฐ™์€ ๊ฒƒ๋“ค์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์‚ฌ์šฉํ•  ๋ช…๋ น์„ ๋ช…์‹œ์ ์œผ๋กœ ๊ฒฐ์ •ํ–ˆ์„ ๋•Œ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ด๋ฅผ ์–ด์ง€๋Ÿฝํžˆ๋Š” ๊ฒƒ์„ ์ •๋ง๋กœ ์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์œ ์ผํ•œ ๋Œ€์•ˆ์€ ์ธ๋ผ์ธ asm์ž…๋‹ˆ๋‹ค.

์•„๋งˆ๋„ ์ธ๋ผ์ธ asm ๋Œ€์‹ ์— ์—ฌ๊ธฐ์—์„œ ์šฐ๋ฆฌ๊ฐ€ ์ •๋ง๋กœ ํ•„์š”ํ•œ ๊ฒƒ์€ ์˜ตํ‹ฐ๋งˆ์ด์ €์—๊ฒŒ "์ด๊ฒƒ์„ ์ฒ˜๋ฆฌ๋Ÿ‰์„ ์œ„ํ•ด ์ตœ์ ํ™”", "์ง€์—ฐ์„ ์œ„ํ•ด ์ด๊ฒƒ์„ ์ตœ์ ํ™”", "๋ฐ”์ด๋„ˆ๋ฆฌ ํฌ๊ธฐ์— ๋งž๊ฒŒ ์ด๊ฒƒ์„ ์ตœ์ ํ™”"๋ผ๊ณ  ์•Œ๋ ค์ฃผ๋Š” LLVM์— ๋Œ€ํ•œ ๊ธฐ๋Šฅ ์†์„ฑ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด ์†”๋ฃจ์…˜์ด ์—…์ŠคํŠธ๋ฆผ์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ, ์ด๊ฒƒ์€ ๋‹น์‹ ์˜ ํŠน์ • ๋ฌธ์ œ๋ฅผ ์ž๋™์œผ๋กœ ํ•ด๊ฒฐํ•  ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ(๋‚ฎ์€ ๋Œ€๊ธฐ ์‹œ๊ฐ„์„ ์ œ๊ณตํ•˜์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๋™ํ˜• ๊ตฌํ˜„์„ ์ œ๊ณตํ•จ์œผ๋กœ์จ), ๋˜ํ•œ Rust ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์„ฑ๋Šฅ ํŠน์„ฑ์„ ๋ณด๋‹ค ์„ธ๋ฐ€ํ•˜๊ฒŒ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค. ๊ทธ๋“ค์—๊ฒŒ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

@felix91gr ๊ทธ๊ฒƒ์€ ์ธํ„ฐ๋ŸฝํŠธ ํ•ธ๋“ค๋Ÿฌ์™€ ๊ฐ™์ด ์ •ํ™•ํ•œ ๋ช…๋ น์–ด ์‹œํ€€์Šค๋ฅผ ๋ฐฉ์ถœํ•ด์•ผ ํ•˜๋Š” ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

@mark-im ๋ฌผ๋ก  ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ œ๊ฐ€ ์ง์—ญ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค! ๐Ÿ™‚

๋‚ด ์š”์ ์€ ์ธ๋ผ์ธ asm ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ "์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋‚ด๊ฐ€ ํ•„์š”๋กœ ํ•˜๋Š” ๊ฒƒ๊ณผ ๋ฐ˜๋Œ€๋˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ตœ์ ํ™”"(์ด ๊ฒฝ์šฐ ๊ณ ์ „์ ์ธ ๋ฐฉ์‹: ๋Œ€๊ธฐ ์‹œ๊ฐ„ ๋Œ€ ์ฒ˜๋ฆฌ๋Ÿ‰)๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์•„๋งˆ๋„ ๊ทธ ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ๋ณด๋‹ค ์„ธ๋ถ„ํ™”๋œ ์ตœ์ ํ™” ์ œ์–ด๋ฅผ ํ†ตํ•ด ๋” ๋‚˜์€ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณต๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. :)

์ธ๋ผ์ธ ์–ด์…ˆ๋ธ”๋ฆฌ์— ๋Œ€ํ•œ ํ–ฅํ›„ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๋น„์ถ”์–ด ์ด ๋ฌธ์ œ์˜ ๋Œ€๋ถ€๋ถ„์˜ ๋…ผ์˜๋Š” ๋” ์ด์ƒ ๊ด€๋ จ์ด ์—†์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ธ๋ผ์ธ ์–ด์…ˆ๋ธ”๋ฆฌ์˜ ๊ฐ ์œ ํ˜•์— ๋Œ€ํ•œ ๋‘ ๊ฐ€์ง€ ๊ฐœ๋ณ„ ์ถ”์  ๋ฌธ์ œ๋ฅผ ์œ„ํ•ด ์ด ๋ฌธ์ œ๋ฅผ ๋งˆ๋ฌด๋ฆฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

  • LLVM ์Šคํƒ€์ผ ์ธ๋ผ์ธ ์–ด์…ˆ๋ธ”๋ฆฌ์— ๋Œ€ํ•œ ์ถ”์  ๋ฌธ์ œ( llvm_asm ) #70173
  • ์ธ๋ผ์ธ ์–ด์…ˆ๋ธ”๋ฆฌ์— ๋Œ€ํ•œ ์ถ”์  ๋ฌธ์ œ( asm! ) #72016
์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰