ãã®åé¡ã¯ãã€ã³ã©ã€ã³ã¢ã»ã³ããªã®å®å®åã远跡ããŸãã çŸåšã®æ©èœã¯RFCããã»ã¹ãééããŠããããããããå®å®åã®åã«ééããå¿ èŠããããŸãã
å®å®ããã³ãŒãã§ã€ã³ã©ã€ã³ã¢ã»ã³ããªã®äžäœäºææ§ã確ä¿ããã®ã«åé¡ã¯ãããŸããïŒ
@ main-- https://github.com/rust-lang/rfcs/pull/1471#issuecomment -173982852ã«ãåŸäžã®ããã«ããã§åçŸããŠããçŽ æŽãããã³ã¡ã³ãããã
asmãåãå·»ããã¹ãŠã®æªè§£æ±ºã®ãã°ãšäžå®å®æ§ïŒïŒ ïŒãããããããŸãïŒãããã®ã§ãRustã§å®å®ããã€ã³ã©ã€ã³asmã欲ããã®ã«ãå®å®åã®æºåãã§ããŠãããšã¯æ¬åœã«æããŸããã
ãŸããä»æ¥ã®asmïŒïŒïŒãæ¬åœã«æè¯ã®è§£æ±ºçã§ãããã©ããããŸãã¯RFC ïŒ129ãŸãã¯Dã«æ²¿ã£ããã®ãããè¯ããã©ããã«ã€ããŠãè°è«ããå¿ èŠããããŸãã ããã§èæ ®ãã¹ãéèŠãªç¹ã®1ã€ã¯ãasmïŒïŒãgccãšåãäžé£ã®å¶çŽããµããŒãããŠããªãããšã§ãã ãããã£ãŠã次ã®ãããããå®è¡ã§ããŸãã
- LLVMã®åäœã«åºå·ãããã®ããã®ããã¥ã¡ã³ããäœæããŸãïŒäœãèŠã€ãããªãã£ãããïŒã rustcã®è€éããåé¿ã§ããã®ã§äŸ¿å©ã§ãã C / C ++ããæ¥ãããã°ã©ããŒãæ··ä¹±ãããããã€ãã®å¶çŽãRustã³ãŒãã§ãšãã¥ã¬ãŒãããã®ãé£ãããããããªãã®ã§æªãã§ãã
- gccããšãã¥ã¬ãŒãããããã¥ã¡ã³ãã«ãªã³ã¯ããã ãã§ããå€ãã®ããã°ã©ããŒã¯ãã§ã«ãããç¥ã£ãŠãããããããªå€æŽãå ããŠã³ããŒã¢ã³ãããŒã¹ãã§ããäŸãããããããã®ã§ããã°ãããã§ãã ã³ã³ãã€ã©ã®éèŠãªæ¡åŒµæ©èœã§ãããããåé¡ããããŸãã
- ä»ã®ããšãããïŒDã®ããã«ïŒïŒå ±ããããããããªãããå ±ãããªããããããªãå€ãã®ä»äºã æ£ããè¡ãããã°ãããã¯äººéå·¥åŠã®ç¹ã§gccã¹ã¿ã€ã«ãããã¯ããã«åªããŠããå¯èœæ§ããããŸãããäžéæãªããããããèšèªãã³ã³ãã€ã©ãŒãšããŸãçµ±åã§ããå¯èœæ§ããããŸãïŒãããè©äŸ¡ããããã®ã³ã³ãã€ã©ãŒã®å éšã«ç²ŸéããŠããªããããããã§ã¯å€ãã®ææ¯ããè¡ãããŸãïŒ ã
æåŸã«ãèæ ®ãã¹ããã1ã€ã®ããšã¯ïŒ1201ã§ããããã¯ãçŸåšã®èšèšã§ã¯ïŒç§ãæãã«ïŒã€ã³ã©ã€ã³asmã«å€§ããäŸåããŠããŸããã€ãŸããã€ã³ã©ã€ã³asmã¯æ£ããå®è¡ãããŠããŸãã
å人çã«ã¯ãMicrosoftãMSVC x64ã§è¡ã£ãããšãå®è¡ããæ¹ããããšæããŸããã€ãŸããasmåœä»€ããšã«ïŒã»ãŒïŒå æ¬çãªçµã¿èŸŒã¿é¢æ°ã®ã»ãããå®çŸ©ãããããã®çµã¿èŸŒã¿é¢æ°ã®ã¿ã䜿çšããŠãã€ã³ã©ã€ã³asmããå®è¡ããŸãã ããããªããšãã€ã³ã©ã€ã³asmãåãå·»ãã³ãŒããæé©åããããšãéåžžã«å°é£ã«ãªããŸããããã¯ãã€ã³ã©ã€ã³asmã®å€ãã®çšéãããã©ãŒãã³ã¹ã®æé©åãç®çãšããŠãããããç®èãªããšã§ãã
ã€ã³ã¹ããªã³ã·ãã¯ããŒã¹ã®ã¢ãããŒãã®å©ç¹ã®1ã€ã¯ããªãŒã«ãªã¢ããã·ã³ã°ã§ããå¿
èŠããªãããšã§ãã æåã«æãå¿
èŠãªçµã¿èŸŒã¿é¢æ°ãå®çŸ©ãã段éçã«èšå®ãæ§ç¯ã§ããŸãã ããšãã°ãæå·ã®å Žåã _addcarry_u64
ã _addcarry_u32
ãŸãã ã€ã³ã¹ããªã³ã·ã¯ã¹ãå®è¡ããããã®äœæ¥ã¯ããã§ã«ããªã培åºçã«è¡ãããŠããããã«èŠããããšã«æ³šæããŠãã ããïŒ //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#ãåç
§ããŠãã ããã
äžæ¹ãçµã¿èŸŒã¿é¢æ°ã¯ããååã«ã¹ããŒããªã³ã³ãã€ã©ãã«å€§ããäŸåããŠãæåã§ããŒã«ãããasmå®è£ ã§åŸãããããã©ãŒãã³ã¹ã_å°ãªããšã_éæããŸãã ããã«é¢ããç§ã®ç¥èã¯æ代é ãã§ããã倧ããªé²æ©ããªãéããçµã¿èŸŒã¿é¢æ°ããŒã¹ã®å®è£ ã¯ãã»ãšãã©ã§ã¯ãªãã«ããŠããå€ãã®å ŽåããŸã ããªãå£ã£ãŠããŸãã ãã¡ããããããã¯ã¯ããã«äœ¿ããããã§ãããããã°ã©ããŒã¯ãç¹å®ã®CPUåœä»€ã®äžçã«é²ãã§ãããšãã¯ãå®éã«ã¯ããã»ã©æ°ã«ããŸããã
ããã§ããã1ã€ã®èå³æ·±ãèæ ®äºé ã¯ãçµã¿èŸŒã¿é¢æ°ãããµããŒããããŠããªãã¢ãŒããã¯ãã£ãŒã®ãã©ãŒã«ããã¯ã³ãŒããšçµåãããå¯èœæ§ãããããšã§ãã ããã«ãããäž¡æ¹ã®é·æãåŸãããŸããã³ãŒãã¯åŒãç¶ã移æ€å¯èœã§ããããŒããŠã§ã¢ããµããŒãããå Žåã¯ãããŒããŠã§ã¢ã¢ã¯ã»ã©ã¬ãŒã·ã§ã³ã«ããæäœã䜿çšã§ããŸãã ãã¡ãããããã¯éåžžã«äžè¬çãªåœä»€ããŸãã¯ã¢ããªã±ãŒã·ã§ã³ã«1ã€ã®æãããªã¿ãŒã²ããã¢ãŒããã¯ãã£ãããå Žåã«ã®ã¿å®éã«å¹æããããŸãã ããŠãããã«ã€ããŠèšåããçç±ã¯ãããã¯_compiler-provided_çµã¿èŸŒã¿é¢æ°ã§ã¯_æãŸãããªã_å¯èœæ§ããããšäž»åŒµããããšãã§ããŸããïŒå®éã«é«éåãããããŒãžã§ã³ãšã³ã³ãã€ã©ã®è€éããå®éã«ååŸãããã©ããã¯æ±ºããŠè¯ããªãã®ã§ïŒç§ã¯çµã¿èŸŒã¿é¢æ°ã_library_ã«ãã£ãŠæäŸãããå ŽåïŒãããŠã€ã³ã©ã€ã³asmã䜿çšããŠã®ã¿å®è£ ãããå ŽåïŒã¯å¥ã®è©±ã ãšæããŸãã å®éãã€ã³ã©ã€ã³asmãããçµã¿èŸŒã¿é¢æ°ã䜿çšããŠããããšãããããŸãããããã¯ç§ã奜ãå šäœåã§ãã
ïŒRFC ïŒ1199ã®çµã¿èŸŒã¿ã¯ãäž»ã«SIMDãæ©èœãããããã«ååšããããããã®èª¬æãšã¯å€å°çŽäº€ããŠãããšæããŸããïŒ
@briansmith
ããããªããšãã€ã³ã©ã€ã³asmãåãå·»ãã³ãŒããæé©åããããšãéåžžã«å°é£ã«ãªããŸããããã¯ãã€ã³ã©ã€ã³asmã®å€ãã®çšéãããã©ãŒãã³ã¹ã®æé©åãç®çãšããŠãããããç®èãªããšã§ãã
ããã§äœãæå³ããã®ãããããŸããã ã³ã³ãã€ã©ãŒãasmãåã
ã®æäœã«å解ããŠã匷床ã®äœäžãã®ããç©Žã®æé©åãè¡ãããšã¯ã§ããªãã®ã¯äºå®ã§ãã ãã ããGCCã¢ãã«ã§ã¯ãå°ãªããšããã³ã³ãã€ã©ã¯äœ¿çšããã¬ãžã¹ã¿ãå²ãåœãŠãããã³ãŒããã¹ãè€è£œãããšãã«ã³ããŒãããã䜿çšããããšããªãå Žåã¯åé€ãããããããšãã§ããŸãã asmãæ®çºæ§ã§ãªãå ŽåãGCCã«ã¯ãããšãã°fsin
ãããªä»ã®äžéæãªæäœãšåãããã«æ±ãã®ã«ååãªæ
å ±ããããŸãã å¥åŠãªãã¶ã€ã³ã®å
šäœçãªåæ©ã¯ãã€ã³ã©ã€ã³asmããªããã£ãã€ã¶ãŒãæ··ä¹±ãããå¯èœæ§ã®ãããã®ã«ããããšã§ãã
ããããç¹ã«æè¿ã§ã¯ãããŸã䜿çšããŠããŸããã ãŸããLLVMã«ããæ©èœã®è¡šçŸã«ã€ããŠã¯çµéšããããŸããã ã ããç§ã¯äœãå€ãã£ãã®ãããããšãç§ããã£ãšèª€è§£ããŠããã®ãçåã«æã£ãŠããŸãã
@japaricã«ããno_std
ãšã³ã·ã¹ãã ã®asm!
ãã¯ããå«ãŸããŠããããããã®åé¡ã«ã€ããŠæè¿ã®é±ã«è©±ãåããŸããã æ®å¿µãªããããã®æ©èœãå®å®ãããããã®ç°¡åãªæ¹æ³ã¯ããããŸããã§ããããããããã¹ãŠãå¿ããªãããã«ããããã«å¿
èŠãªã¡ã¢ãæžãçããŠãããããšæããŸããã
ãŸããçŸåšã asm!
ãã¯ãã§åãå
¥ããããæ§æã®åªããä»æ§ããããŸããã ä»ã®ãšãããéåžžã¯ãLLVMãèŠãŠããšè¡šç€ºããããclangãèŠãŠããšè¡šç€ºããããgccã衚瀺ããšè¡šç€ºãããŸãããåªããããã¥ã¡ã³ãã¯ãããŸããã çµå±ãããã¯éåžžããä»ã®èª°ãã®äŸãèªãã§ãããé©å¿ãããããŸãã¯ãLLVMã®ãœãŒã¹ã³ãŒããèªããã§çµãããŸãã å®å®åã®ããã®æäœéã®ããšã¯ãæ§æãšããã¥ã¡ã³ãã®ä»æ§ãçšæããå¿
èŠããããšããããšã§ãã
çŸåšãç§ãã¡ãç¥ãéããLLVMããã®å®å®æ§ã®ä¿èšŒã¯ãããŸããã asm!
ãã¯ãã¯ãLLVMãçŸåšå®è¡ããŠããããšãžã®çŽæ¥ãã€ã³ãã£ã³ã°ã§ãã ããã¯ãå¿
èŠãªãšãã«LLVMãèªç±ã«ã¢ããã°ã¬ãŒãã§ããããšãæå³ããŸããïŒ LLVMã¯ããã®æ§æãç Žãããããšã¯æ±ºããŠãªãããšãä¿èšŒããŸããïŒ ãã®æžå¿µã軜æžããæ¹æ³ã¯ãLLVMã®æ§æã«ã³ã³ãã€ã«ãããç¬èªã®ã¬ã€ã€ãŒãasm!
ç§ãã¡ã¯åºæ¬çã«éã®å®å®ãä¿èšŒããããã€ãã®ã¡ã«ããºã ãå¿
èŠãšããå®å®ã«ãªãããšã§ãã
çŸåšãã€ã³ã©ã€ã³ã¢ã»ã³ããªã«é¢é£ãããã°ãããªããããŸãã A-inline-assemblyã¿ã°ã¯è¯ãåºçºç¹ã§ãããçŸåšICEãLLVMã®segfaultsãªã©ãæ£ãã°ã£ãŠããŸããå šäœãšããŠããã®æ©èœã¯ãä»æ¥å®è£ ãããŠããããã«ãä»ã®äººãå®å®ãããã®ã«æåŸ ããå質ä¿èšŒãæºãããŠããªãããã§ãã Rustã®æ©èœã
ã€ã³ã©ã€ã³ã¢ã»ã³ããªãå®å®ããããšã代æ¿ããã¯ãšã³ãã®å®è£ ãéåžžã«å°é£ã«ãªãå ŽåããããŸãã ããšãã°ãmiriãcraneliftãªã©ã®ããã¯ãšã³ãã¯ãå®è£ ã«ãã£ãŠã¯ãLLVMããã¯ãšã³ããšåçã®æ©èœã«å°éãããŸã§ã«éåžžã«é·ãæéããããå ŽåããããŸãã ããã¯ãããã§å®è¡ã§ããããšã®äžéšãå°ããããšãæå³ããå ŽåããããŸãããã€ã³ã©ã€ã³ã¢ã»ã³ããªã®å®å®åãæ€èšããéã«ã¯ãçæããããšãéèŠã§ãã
äžèšã®åé¡ã«ãããããããç§ãã¡ã¯å°ãªããšããã®åé¡ãåé²ãããããã®äœããã®èœåã確å®ã«åãé€ãããšæã£ãŠããŸããïŒ ãã®ããã«ãã€ã³ã©ã€ã³ã¢ã»ã³ããªãå®å®åã«åããŠåŸ®èª¿æŽããæ¹æ³ã«ã€ããŠããã€ãã®æŠç¥ããã¬ã€ã³ã¹ããŒãã³ã°ããŸããã åé²ããããã®äž»ãªæ¹æ³ã¯ãclangãäœããããã調æ»ããããšã§ãã ãããããclangãšCã¯å¹æçã«å®å®ããã€ã³ã©ã€ã³ã¢ã»ã³ããªæ§æãæã£ãŠãããclangãè¡ãããšïŒç¹ã«LLVMïŒããã©ãŒãªã³ã°ã§ããå¯èœæ§ããããŸãã clangãã€ã³ã©ã€ã³ã¢ã»ã³ããªãå®è£ ããæ¹æ³ãããæ·±ãç解ããããšã¯çŽ æŽãããããšã§ãã clangã«ã¯ç¬èªã®ç¿»èš³ã¬ã€ã€ãŒããããŸããïŒ å ¥åãã©ã¡ãŒã¿ãæ€èšŒããŸããïŒ ïŒNSïŒ
åé²ããããã®ãã1ã€ã®å¯èœæ§ã¯ããã§ã«å®å®ããŠããä»ã®å Žæããæ£ããå€ãããšãã§ããã¢ã»ã³ãã©ãŒããããã©ããã確èªããããšã§ãã ããã§ã®ããã€ãã®ã¢ã€ãã¢ã¯ãnasmãŸãã¯plan9ã¢ã»ã³ãã©ãŒã§ããã LLVMã®ã¢ã»ã³ãã©ã䜿çšãããšãIRã®ã€ã³ã©ã€ã³ã¢ã»ã³ããªåœä»€ãšåãå®å®æ§ã®ä¿èšŒã«é¢ããåé¡ãçºçããŸãã ïŒå¯èœæ§ã¯ãããŸããã䜿çšããåã«å®å®æ§ã®ä¿èšŒãå¿ èŠã§ãïŒ
LLVMã®ã€ã³ã©ã€ã³asmæ§æã¯ãclang / gccã§äœ¿çšãããæ§æãšã¯ç°ãªãããšãææããŠãããŸãã éãã¯æ¬¡ã®ãšããã§ãã
$0
ã®ä»£ããã«%0
ã%[name]
ãµããŒãããŠããŸããã"a"
ã§ã¯ãªã"{eax}"
ã§ãã"{r11}"
ïŒããµããŒãããŸãã Cã§ã¯ã代ããã«ã¬ãžã¹ã¿asmå€æ°ã䜿çšããŠãå€ãã¬ãžã¹ã¿ïŒ register asm("r11") int x
ïŒã«ãã€ã³ãããå¿
èŠããããŸãã"m"
ãš"=m"
å¶çŽã¯åºæ¬çã«å£ããŠããŸãã Clangã¯ãããããéæ¥ã¡ã¢ãªå¶çŽ"*m"
ãš"=*m"
ã«å€æããå€æ°èªäœã§ã¯ãªããå€æ°ã®ã¢ãã¬ã¹ãLLVMã«æž¡ããŸããClangã¯ãã€ã³ã©ã€ã³asmãgcc圢åŒããLLVM圢åŒã«å€æããŠããã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ã®%
è¡šèšãšã¯ç°ãªãããã©ãŒãããçšã®éã³ã{}
æ§æã¯ã¢ã»ã³ããªèšèªã«å¹²æžããŸããã
LLVMã¯ãç¹ã«LLVMã«ãã£ãŠçæãããªãåœä»€ã§ãã©ã®ã¬ãžã¹ã¿ãç Žå£ãããããå®éã«èå¥ãããšããç¹ã§ãé©ãã»ã©æªãä»äºãããŸãã ããã¯ããŠãŒã¶ãŒãã©ã®ã¬ãžã¹ã¿ãŒãç Žå£ãããããæåã§æå®ããå¿ èŠãããããšãæå³ããŸãã
ã¢ã»ã³ããªãèªåã§è§£æããããšãããšãæªå€¢ã«ãªãå¯èœæ§ããããŸãã LLVM-C APIã¯MCAsmParserããžãã¯ãå ¬éããŠãããããããã®ã¯ã©ã¹ã¯bindgenã䜿çšããã®ãéåžžã«é¢åã§ãïŒç§ã¯ãããå®è¡ããŸããïŒã
ä»ã®ããã¯ãšã³ããžã®ç§»æ€æ§ã®ããã«ãã€ã³ã©ã€ã³ã¢ã»ã³ããªãããã®æååãå°ãã®ã¬ãžã¹ã¿å²ãåœãŠãšæåå眮æã§ã³ããŒã¢ã³ãããŒã¹ããããã¬ãã«ã«ç¶æããéããããã¯ãšã³ããããã»ã©é»å®³ããã¹ãã§ã¯ãããŸããã æŽæ°å®æ°ãšã¡ã¢ãªã®å¶çŽãåé€ããã¬ãžã¹ã¿ãã³ã¯ã®å¶çŽã ããä¿æããŠããåé¡ã¯çºçããŸããã
æç¶ãåãã¯ãã§äœãã§ãããã確èªããããã«å°ãéãã§ããŸãã GCCã¹ã¿ã€ã«ã®ã€ã³ã©ã€ã³ã¢ã»ã³ããªãrustã¹ã¿ã€ã«ã«å€æãããã®ãäœæããŸããhttps://github.com/parched/gcc-asm-rsã ãŸãããŠãŒã¶ãŒãå¶çŽãç解ããå¿ èŠããªãããã¹ãŠãèªåçã«åŠçãããDSLã䜿çšãããã®ã®éçºãéå§ããŸããã
ã ããç§ã¯ããã³ã裞ã®ãã«ãã£ã³ã°ãããã¯ãå®å®ãããã ãã§ãããšæããšããçµè«ã«éããŸãããããããã°ãã³ãã¥ããã£ã¯ãã¯ãã䜿ã£ãŠããªãŒããå埩ããæè¯ã®è§£æ±ºçãèãåºãããšãã§ããŸãã åºæ¬çã«ã¯ããrããšãiãããããŠãããããmãã®å¶çŽã®ã¿ã䜿çšããã¯ããŒããŒã䜿çšããã«ãçŸåšã®llvmã¹ã¿ã€ã«ãå®å®ãããã ãã§ãã ä»ã®å¶çŽãšã¯ããŒããŒã¯ãåŸã§ç¬èªã®ããrfcã¿ã€ãã®ãã®ã§å®å®ãããããšãã§ããŸãã
å人çã«ã¯ããã®æ©èœãå®å®ãããããšã¯ã誰ãããã«ã¿ã€ã ã®å°éæ¥è
ãéã£ãŠ1幎éãããæšé²ããªãéãã決ããŠæãéããããªããããªå€§èŠæš¡ãªäœæ¥ã§ãããšæãå§ããŠããŸãã asm!
å°ããã€å®å®ããããšãã@parchedã®ææ¡ãããããæ±ãããããããšä¿¡ãããã 誰ãããããæã«åã£ãŠå®è¡ããããšãé¡ã£ãŠããŸãã ããããããã§ãªãå Žåã¯ã決ããŠå°éããªãæºè¶³ã®ãã解決çã«å°éããããšããã®ãããã次ã®ãããªäžååãªè§£æ±ºçã«å°éããå¿
èŠããããŸãïŒ asm!
ãã®ãŸãŸå®å®ããããããŒãICEããã°ãªã©ããžã£ã³ã¯ãšé移æ€æ§ã宣äŒããããã¥ã¡ã³ãã®æãã倧èãªèŠåã§ããããŠæºè¶³ã®ããå®è£
ãå¥è·¡çã«éããŠãç¥ããéãããå Žåããã€ããã®å€©åœã®ãã¹ãã«éé£ããæå³ããããŸãã IOWãç§ãã¡ã¯macro_rules!
ãã£ãããšãæ£ç¢ºã«è¡ãå¿
èŠããããŸãïŒãããŠãã¡ããã macro_rules!
å Žåãšåãããã«ãçæéã®å¿
æ»ã®ãã³ãæ¯æŽãšæŒãã®ããæªæ¥ã®èšŒæ ãåŸãããšãã§ããŸãïŒã 代æ¿ããã¯ãšã³ãã®åœ±é¿ã«ã€ããŠã¯æ²ããã§ãããã·ã¹ãã èšèªãã€ã³ã©ã€ã³ã¢ã»ã³ããªããã®ãããªåé¡ã«ä»»ããã®ã¯æ¥ãã¹ãããšã§ãããè€æ°ã®ããã¯ãšã³ããå®éã«äœ¿çšã§ãã1ã€ã®ããã¯ãšã³ãã®ååšã劚ãç¶ãããšãã仮説ãç«ãŠãããšã¯ã§ããŸããã ç§ã¯ããªãã«ãé¡ãããŸããç§ãééã£ãŠããããšã蚌æããŠãã ããïŒ
ã·ã¹ãã èšèªãã€ã³ã©ã€ã³ã¢ã»ã³ããªããã®ãããªåé¡ã«ä»»ããã®ã¯æ¥ãã¹ãããšã§ã
ããŒã¿ãã€ã³ããšããŠãç§ã¯ããŸããŸãå®å®ããRustã§ããã€ãã®asmãæŸåºããããšãå¯äžã®ç®çãšããŠã gcc
ã«äŸåããã¯ã¬ãŒãã«åãçµãã§ããŸãïŒ //github.com/main--/unwind- rs / blob / 266e0f26b6423f4a2b8a8c72442b319b5c33b658 / src / unwind_helper.c
ããã«ã¯ç¢ºãã«å©ç¹ããããŸãããç§ã¯ããã«ãã£ã³ã°ãããã¯ãå®å®ãããæ®ããproc-macrosã«ä»»ãããã¢ãããŒãã«å°ãèŠæããŠããŸãã ããã¯æ¬è³ªçã«ãèšèšãRFCãããã³å®è£ ããã»ã¹ããä»äºãããã人ãæœåšçã«ã¯èª°ã«ãå€æ³šããŸãã ãã¡ãããå®å®æ§/å質ã®ä¿èšŒã匱ãããšãå šäœã®ãã€ã³ãã§ãïŒãã¬ãŒããªãã¯ãäœããäžå®å šã§ããæ¹ãããŸã£ãããªããããã¯ããã«åªããŠãããšããããšã§ãïŒãç§ã¯ãããç解ããŠããŸãã
å°ãªããšããã«ãã£ã³ã°ãããã¯ã¯é©åã«èšèšãããŠããå¿
èŠããããŸããç§ã®æèŠã§ã¯ã "expr" : foo : bar : baz
ééããªãããã§ã¯ãããŸããã ç§ã¯æåã®è©Šã¿ã§æ³šæãæ£ããããããšãä»ãŸã§èŠããŠããŸãããç§ã¯ãã€ãããã調ã¹ãªããã°ãªããŸããã ãã³ãã³ã§åºåãããéæ³ã®ã«ããŽãªã§ãéæ³ã®æåãå«ãå®æ°æååãæå®ãããšãå€æ°åã«éæ³ã®ãããªããšãããŠããŸããããã§ããã·ã¥ã¢ããããã ãã§ãããšããã®ã¯æªãããšã§ãã
1ã€ã®ã¢ã€ãã¢ãâŠ
çŸåšãdynasmãšããååã®ãããžã§ã¯ãããã§ã«ãããŸããããã¯ã1ã€ã®ãã¬ãŒããŒã®x64ã³ãŒãã§ã¢ã»ã³ããªãååŠçããããã«äœ¿çšããããã©ã°ã€ã³ã䜿çšããŠã¢ã»ã³ããªã³ãŒããçæããã®ã«åœ¹ç«ã¡ãŸãã
ãã®ãããžã§ã¯ãã¯ã€ã³ã©ã€ã³ã¢ã»ã³ããªã®åé¡ã«çããŸããããrustcãå€æ°ãã¬ãžã¹ã¿ã«ãããããã³ãŒãã«ãã€ãã®ã»ãããæ¿å ¥ããããšãåãå ¥ããæ¹æ³ãæäŸããå Žåããã®ãããªãããžã§ã¯ãã䜿çšããŠåããããšãã§ããŸã-ãããã®ãã€ãã®ã»ãããå¢ãããŸãã
ãã®ããã«ãrustcã®èŠ³ç¹ããå¿ èŠãªå¯äžã®æšæºåéšåã¯ãçæãããã³ãŒãã«ä»»æã®ãã€ãã·ãŒã±ã³ã¹ãæ¿å ¥ããç¹å®ã®ã¬ãžã¹ã¿å²ãåœãŠãé©çšããæ©èœã§ãã ããã«ãããç¹å®ã®èšèªãã¬ãŒããŒã®ãã¹ãŠã®éžæè¢ãåé€ãããŸãã
ãã€ããºã ããªããŠããããã¯cpuid / rtdscåœä»€ã®ãã¯ããäœæããæ¹æ³ãšããŠã䜿çšã§ããŸããããã¯ããã€ãã®çã®ã·ãŒã±ã³ã¹ã«å€æãããã ãã§ãã
次ã®è³ªåã¯ããã€ãã·ãŒã±ã³ã¹ã«ããããã£/å¶çŽãè¿œå ãããã©ããã ãšæããŸãã
[ç·šéïŒãã®ã³ã¡ã³ãã§ç§ãèšã£ãããšã¯æ£ãããšã¯æããªãã]
LLVMã®çµ±åã¢ã»ã³ãã©ãŒãåŒãç¶ã䜿çšããå ŽåïŒããã¯å€éšã¢ã»ã³ãã©ãŒãçæãããããé«éã§ãããšæããŸãïŒãå®å®åãšã¯ãLLVMã®ã€ã³ã©ã€ã³ã¢ã»ã³ããªåŒãšçµ±åã¢ã»ã³ãã©ãŒã®ãµããŒããæ£ç¢ºã«å®å®ããããããã®å€æŽãçºçããå Žåã«ãããè£æ£ããããšãæå³ããŸãã
å€éšã¢ã»ã³ãã©ãŒãçæããå Žåã¯ãä»»æã®æ§æã䜿çšã§ããŸãããçµ±åã¢ã»ã³ãã©ãŒã®å©ç¹ãå åãããåŒã³åºããŠããå€éšã¢ã»ã³ãã©ãŒã®å€æŽã«ãããããŸãã
Clangã§ããããããªãã®ã«ãLLVMã®ãã©ãŒãããã§å®å®ããã®ã¯å¥åŠã ãšæããŸãã ããããå éšã§LLVMã®ãµããŒãã䜿çšããŸãããGCCã«äŒŒãã€ã³ã¿ãŒãã§ã€ã¹ãæäŸããŸãã
ç¹ã«AFAIKClangã®ã¹ã¿ã³ã¹ã¯ãClangã¯GCCããµããŒããããã®ãæ£ç¢ºã«ãµããŒããããã§ããããããRustã¯ClangããµããŒããããã®ãæ£ç¢ºã«ãµããŒãããããšèšã£ãŠ1æ¥ãšåŒãã§ã100ïŒ åé¡ãããŸããã å®éã®Rustä»æ§ãããå Žåã¯ãèšèªããã€ã³ã©ã€ã³ã¢ã»ã³ããªã¯å®è£ å®çŸ©ãã«ç·©åã§ããŸãã åªå é äœãšäºå®äžã®æšæºåã¯åŒ·åãªããŒã«ã§ãã GCCæ§æãLLVMã«å€æããããã«Clangç¬èªã®ã³ãŒããåå©çšã§ããã°ããªãããã§ãã 代æ¿ã®ããã¯ãšã³ãã®æžå¿µã¯ãªããªãããšã¯ãããŸããããçè«çã«ã¯ãGCCãžã®Rustããã³ããšã³ãã¯ããã»ã©åä»ã§ã¯ãããŸããã ç§ãã¡ãèšèšããããšããç¡éã«èªè»¢è»ã«ä¹ãããšããæããããšããç¶æããããšãå°ãªããªããŸãã
clangããµããŒããããã®ã«é¢ããŠå®çŸ©ããããã®ãå®å®ãããå Žåããããclang_asm!
ãšåŒã¶å¿
èŠããããŸãã asm!
ååã¯ãä»ã®äž»èŠãªRustæ©èœã®ããã«ãå®å
šãªRFCããã»ã¹ãéããŠèšèšããããã®ã®ããã«äºçŽããå¿
èŠããããŸãã #bikeshed
Rustã€ã³ã©ã€ã³ã¢ã»ã³ããªã§èŠããããšãããã€ããããŸãã
template-with-substitutionsãã¿ãŒã³ã¯éãã§ãã ã¢ã»ã³ããªããã¹ããšå¶çŽãªã¹ãã®éãåžžã«è¡ãæ¥ããŠããŸãã ç°¡æœãã¯ã人ã ãäœçœ®ãã©ã¡ãŒã¿ã䜿çšããããšã奚å±ããŸããããã«ãããèªã¿ããããäœäžããŸãã ã·ã³ããªãã¯åã¯ãå€ãã®å Žåãåãååã3åç¹°ãè¿ãããããšãæå³ããŸãããã³ãã¬ãŒãããªãã©ã³ãã®ååä»ããããã³ãªãã©ã³ãã«ãã€ã³ããããŠããåŒã§ãã Alexã®ã³ã¡ã³ãã§èšåãããŠããã¹ã©ã€ãã¯ãDãšMSVCã䜿çšãããšãã³ãŒãå ã®å€æ°ãç°¡åã«åç §ã§ããããšã瀺ããŠããŸãã
å¶çŽã¯ç解ããã®ãé£ãããïŒã»ãšãã©ïŒã¢ã»ã³ããªã³ãŒããšåé·ã§ãã Rustã«ãåœä»€ã®ååã«è©³çŽ°ãªã¢ãã«ãåããçµ±åã¢ã»ã³ãã©ãããã°ããªãã©ã³ãã®å¶çŽãæšæž¬ããŠããšã©ãŒãæ··ä¹±ã®åå ãåãé€ãããšãã§ããŸãã ããã°ã©ããŒãåœä»€ã®ç¹å®ã®ãšã³ã³ãŒãã£ã³ã°ãå¿ èŠãšããå Žåãæ瀺çãªå¶çŽãæäŸããå¿ èŠããããŸãããããã¯éåžžã¯å¿ èŠãããŸããã
Norman RamseyãšMaryFernándezã¯ãã¢ã»ã³ããªãšæ©æ¢°èªã®ãã¢ãã³ã³ãã¯ãã«èšè¿°ããããã®åªããã¢ã€ãã¢ãæã£ãŠãããšãã«ã New Jersey Machine CodeToolkitã«é¢ããããã€ãã®è«æãæžããŸããã 圌ãã¯ïŒPentium Proæ代ã®ïŒiA-32åœä»€ãšã³ã³ãŒãã£ã³ã°ã«åãçµãã§ããŸãã ãã¡ããšããRISCISAã«éå®ããããã®ã§ã¯ãããŸããã
çŽè¿ã®é±ã®åŽåããã®çµè«ãããäžåºŠç¹°ãè¿ããããšæã
ç§ã«ãšã£ãŠããã¯ãä»ãããå®å®ãããã°ãå°æ¥åŸæããããšãä¿èšŒããããšããå®çŸ©ã§ããããåŸæãããã ãã§ãªãããæ°ããã·ã¹ãã ã®å®è£ ã«æ·±å»ãªåé¡ãåŒãèµ·ãããå¯èœæ§ãéåžžã«é«ãããã§ãã
æäœéã§ãã匟䞞ïŒ2ïŒã¯åŠ¥åã§ããªããšç¢ºä¿¡ããŠããŸãïŒå¥åãå®å®ãã£ãã«ãã§ã®å®å®ã®å®çŸ©ïŒã ä»ã®ç®æ¡æžãã¯ãçŸåšéåžžã«é«ãRustã³ã³ãã€ã©ã®æåŸ ãããå質ãæãªããããéåžžã«æ²ãããªããŸãã
@jcranmerã¯æžããïŒ
LLVMã¯ãç¹ã«LLVMã«ãã£ãŠçæãããªãåœä»€ã§ãã©ã®ã¬ãžã¹ã¿ãç Žå£ãããããå®éã«èå¥ãããšããç¹ã§ãé©ãã»ã©æªãä»äºãããŸãã ããã¯ããŠãŒã¶ãŒãã©ã®ã¬ãžã¹ã¿ãŒãç Žå£ãããããæåã§æå®ããå¿ èŠãããããšãæå³ããŸãã
å®éã«ã¯ãã¯ããŒããŒãªã¹ããæšæž¬ããã®ã¯éåžžã«é£ãããšæããŸãã æ©æ¢°èªãã©ã°ã¡ã³ããã¬ãžã¹ã¿ãŒã䜿çšããŠãããããšãã£ãŠããããã¬ãžã¹ã¿ãŒãç Žå£ããããã§ã¯ãããŸããã ããããããã¯ãããä¿åããããã埩å ããŸãã ä¿å®çãªã¢ãããŒãã¯ãã³ãŒããžã§ãã¬ãŒã¿ãŒã䜿çšã«é©ããã¬ãžã¹ã¿ãŒã䜿çšããããšãæããšã©ãŸãããå¯èœæ§ããããŸãã
@alexcrichtonã¯æžããïŒ
ç§ãã¡ã®ç¥ãéããLLVMããã®å®å®æ§ã¯ä¿èšŒãããŠããŸããã LLVMã§ã®ã€ã³ã©ã€ã³ã¢ã»ã³ããªã®å®è£ ã¯ãã€ã§ãå€æŽãããå¯èœæ§ãããããšãç§ãã¡ã¯ç¥ã£ãŠããŸãã
LLVMããã¥ã¡ã³ãã¯ããæ°ãããªãªãŒã¹ã¯å€ããªãªãŒã¹ã®æ©èœãç¡èŠã§ããŸããããããã誀ã£ãŠã³ã³ãã€ã«ããããšã¯ã§ããŸããããšä¿èšŒããŠããŸãã ïŒIRäºææ§ã«é¢ããŠïŒã ããã¯ãããã€ã³ã©ã€ã³ã¢ã»ã³ããªãå€æŽã§ããéãå¶éããäžã§è«ããããã«ãçŸåšã®ç¶æ³ããã»ãã³ãã£ã¯ã¹ãæ ¹æ¬çã«å€æŽããLLVMã¬ãã«ã§ã®å®è¡å¯èœãªçœ®ãæãã¯å®éã«ã¯ãããŸããïŒããšãã°ãpoisonãundefã«é¢ããé²è¡äžã®åé¡ãšã¯ç°ãªããŸãïŒã ãããã£ãŠããã®äºæ³ãããäžå®å®æ§ã«ãããRust asm!
ãããã¯ã®ããŒã¹ãšããŠäœ¿çšã§ããªããšèšãã®ã¯ããäžèª å®ã§ãã ããŠãããã¯ä»ã®åé¡ããããšèšã£ãŠããããã§ã¯ãããŸããïŒããã¯æ¹åãããŸããããäžååãªããã¥ã¡ã³ããå¶çŽã®æªãã貧匱ãªèšºæããããŠããŸãäžè¬çã§ãªãã·ããªãªã§ã®ãã°ãé ã«æµ®ãã¶ãã®ã§ãïŒã
ã¹ã¬ãããèªãéã®ç§ã®æ倧ã®å¿é ã¯ãç§ãã¡ãå®ç§ãåã®æµã«ããããšã§ãã ç¹ã«ãããã€ãã®éæ³ã®DSL仲ä»è ãæ€çŽ¢ãããšãã€ã³ã©ã€ã³asmã§äœ¿çšå¯èœãªåœ¢åŒã«ãŸãšããã®ã«æ°å¹Žãããã®ã§ã¯ãªãããšå¿é ããŠããŸãã人ã ã¯ãasmããŒãµãŒãçµ±åããããããLLVMãšé£æºãããããšãããšããšããžã±ãŒã¹ã
LLVMã¯ãåäœãæå®ãããŠããªãæ©èœã誀ã£ãŠã³ã³ãã€ã«ããªãããšãæ¬åœã«ä¿èšŒããŠããŸããïŒ å€æŽã誀ã³ã³ãã€ã«ã§ãããã©ãããã©ã®ããã«å€æããã®ã§ããããã IRã®ä»ã®éšåã§ããããèŠãããšãã§ããŸããããããã¯å€ãã®ããšãæåŸ ããŠããããã§ãã
Clangã§ããããããªãã®ã«ãLLVMã®ãã©ãŒãããã§å®å®ããã®ã¯å¥åŠã ãšæããŸãã
Clangã¯ãGCCçšã«äœæãããã³ãŒããã³ã³ãã€ã«ã§ããããã«ããããšãç®çãšããŠããããããããè¡ããŸããã rustcã«ã¯ãã®ç®çã¯ãããŸããã GCC圢åŒã¯äººéå·¥åŠçã§ã¯ãªãã®ã§ãæçµçã«ã¯ãããæãŸãªããšæããŸãããä»ã®ãšããããã䜿çšããã»ãããããã©ããã¯ããããŸããã çŸåšã®Rust圢åŒã䜿çšããïŒæ¯æ©ã®ïŒã³ãŒãã¯ãããããããŸãããGCCã¹ã¿ã€ã«ã«å€æŽãããšå£ããŠããŸããããç¹ã«åªãããã®ãæãä»ãããšãã§ããå Žåã«ã®ã¿å€æŽãã䟡å€ããããŸãã
å°ãªããšããã«ãã£ã³ã°ãããã¯ã¯é©åã«èšèšãããŠããå¿ èŠããããŸããç§ã®æèŠã§ã¯ã
"expr" : foo : bar : baz
ééããªãããã§ã¯ãããŸããã
åæããŸããã å°ãªããšããå¶çŽãšã¯ããŒããŒããã¹ãŠ1ã€ã®ãªã¹ãã«å«ãŸããŠããçã®LLVM圢åŒã奜ã¿ãŸãã çŸåšãã=ããã¬ãã£ãã¯ã¹ãæå®ããŠåºåãªã¹ãã«è¿œå ããå¿
èŠãããåé·æ§ããããŸãã ãŸããLLVMãããããåºåãåŒã®çµæã§ããé¢æ°åŒã³åºãã®ããã«æ±ãæ¹æ³ãèããŸããçŸåšã®asm!
å®è£
ã¯ããoutããã©ã¡ãŒã¿ãŒãæã€rustã®å¯äžã®éšåã§ãã
LLVMã¯ãå®éã«ã©ã®ã¬ãžã¹ã¿ãç Žå£ãããããç¹å®ãããšããç¹ã§ãé©ãã»ã©æªãä»äºãããŠããŸãã
ã€ã³ã©ã€ã³ã¢ã»ã³ããªã®äž»ãªçç±ã¯ãLLVMãç解ã§ããªãã³ãŒããå«ããããšã§ãããããAFAIKLLVMã¯ãããå®è¡ããããšã¯ããŸããã å®éã®ã¢ã»ã³ããªãèŠãã«ãã¬ãžã¹ã¿å²ãåœãŠãšãã³ãã¬ãŒã眮æã®ã¿ãè¡ããŸãã ïŒæããã«ããã段éã§å®éã®ã¢ã»ã³ããªã解æããŠãã·ã³ã³ãŒããçæããŸãããããã¯åŸã§çºçãããšæããŸãïŒ
å€éšã¢ã»ã³ãã©ãçæããå Žå
çµ±åã€ã³ã©ã€ã³ã¢ã»ã³ãã©ã䜿çšãã代ããã®æ¹æ³ããããã©ããã¯ããããŸãããLLVMã«ã¬ãžã¹ã¿ãå²ãåœãŠãæ¹æ³ãããããã§ãã ãã ããã°ããŒãã«ã¢ã»ã³ããªã®å Žåã¯ãå€éšã¢ã»ã³ãã©ãæ©èœããŸãã
LLVMã€ã³ã©ã€ã³ã¢ã»ã³ãã©ã®é倧ãªå€æŽã«é¢ããŠã¯ãClangãšåãããŒãã«ä¹ã£ãŠããŸãã ã€ãŸãã圌ããããã€ãã®å€æŽãå ããå Žåãç§ãã¡ã¯ããããèµ·ãã£ããšãã«ããããåé¿ããå¿ èŠããããŸãã
clangããµããŒããããã®ã«é¢ããŠå®çŸ©ããããã®ãå®å®ãããå Žåããããclang_asmïŒãšåŒã¶å¿ èŠããããŸãã asmïŒ ååã¯ãä»ã®äž»èŠãªRustæ©èœã®ããã«ãå®å šãªRFCããã»ã¹ãéããŠèšèšããããã®ã®ããã«äºçŽããå¿ èŠããããŸãã #bikeshed
ç§ã¯ããã§ãã¹ãŠã§ãã +1
çŸåšã®Rust圢åŒã䜿çšããïŒæ¯æ©ã®ïŒã³ãŒãã¯ãããããããŸãããGCCã¹ã¿ã€ã«ã«å€æŽãããšå£ããŠããŸããããç¹ã«åªãããã®ãæãä»ãããšãã§ããå Žåã«ã®ã¿å€æŽãã䟡å€ããããŸãã
@parchedäžã§åŒçšãã@jimblandyã®ææ¡ã«ãããšã asm!
ã䜿çšããŠãã人ã¯èª°ã§ãããããåŒãç¶ã䜿çšã§ããŸãã
ä»æ¥ãç§ãã¡ãç¥ãéãããã®æ©èœã®ããã¥ã¡ã³ãã¯åºæ¬çã«ãããŸããã ããã«ã¯ãLLVMå éšããã³ãã¹ãŠãå«ãŸããŸãã
GCCã®ã¢ã»ã³ããªæ§æã30幎åŸã«æ¬åœã«æå®ãŸãã¯ææžåãããŠããªãå Žåãææžåãããã¢ã»ã³ããªãµãèšèªãäœæããããšã¯ããªãœãŒã¹ãéãããŠããããã«Rustã®èœåãè¶ ããã»ã©å°é£ãªã¿ã¹ã¯ã§ãããããŸãã¯ã¢ã»ã³ããªã䜿çšããã人ã¯åã«æ°ã«ããŸããã
ç§ãã¡ã®ç¥ãéããLLVMããã®å®å®æ§ã¯ä¿èšŒãããŠããŸããã LLVMã§ã®ã€ã³ã©ã€ã³ã¢ã»ã³ããªã®å®è£ ã¯ãã€ã§ãå€æŽãããå¯èœæ§ãããããšãç§ãã¡ã¯ç¥ã£ãŠããŸãã
GCC / Clangã®ã€ã³ã©ã€ã³ã¢ã»ã³ããªã®å®è£ ãå€æŽãããå¯èœæ§ã¯äœããšæãããŸããããã¯ã90幎代以éã«èšè¿°ããããã¹ãŠã®Cã³ãŒããç Žæããããã§ãã
ä»æ§ããªããã°ããã®ããã®ä»£æ¿ããã¯ãšã³ããæ³åããããšããã»ãŒäžå¯èœã§ãã
èšèªãšããŠã®Rustããã¢ã»ã³ããªã«ããããããã®ãæ¥ããããããã«çãæ®ããªãå Žåãç¡æ æ²ã«ãªããªã¹ã¯ããããŸããã代æ¿ããã¯ãšã³ãã®å¯èœæ§ã¯ãããŸããã Nightlyã¯Rustã§ãããšããèããæé»ã®ãã¡ã«æ¯æãããå Žåãé€ããŠãNightlyã¯ååã§ã¯ãããŸãããããã¯ãLLVMã®å€æŽã®èŠéããããRustã®å®å®æ§ã®ä¿èšŒãæãªãããšã«ãªããŸãã
ä»ã®ç®æ¡æžãã¯ãçŸåšéåžžã«é«ãRustã³ã³ãã€ã©ã®æåŸ ãããå質ãæãªããããéåžžã«æ²ãããªããŸãã
Rustéçºè
ã®æ
床ãšã圌ããä¿æããŠããèšå€§ãªå質åºæºã«æ¯æ¥æè¬ããŠãããšèšã£ãŠããç§ã¯åãã€ããŠããŸããïŒå®éãããªãããã®å質ãç¶æã§ããããã«ããã¹ãŠãé
ããªãããšãé¡ã£ãŠããŸããã©ã€ã¢ã³ã®ããã«çãå°œããããšãªãïŒã ããããluqmanaã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èªäœã«æ害ãäžããŸãã
代æ¿æ§æã®ææ¡ãå«ãpre-RFCãå éšãã©ãŒã©ã ã«æçš¿ããŸããïŒ https ïŒ
ç§ã«ã¯ãæé«ã®ãã®ã¯ééããªãããã§ã®çš®é¡ã®æµã§ããããã«èŠããŸãã ä»ã®ãšãããäºææ§ã®ããæ§æãšã»ãã³ãã£ã¯ã¹ãåããå®å®çã«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"))]
次ã«ã cpuid
æ
å ±ãååŸããŠã popcnt
ãååšãããã©ããã確èªããŸãã Rustã«ããæè¿ã®Googlecpu_featuresã©ã€ãã©ãªhttps://opensource.googleblog.com/2018/02/cpu-features-library.htmlã«äŒŒããã®ãRustã«ãããšäŸ¿å©ã§ãããc'est lavieã§ãã
ããã¯äœããããã¢ããã°ã©ã ãªã®ã§ãã€ã³ã©ã€ã³ã¢ã»ã³ããªãç¶æããããšæããŸãã å®éã®ããã°ã©ã ã®å Žåã count_ones()
çµã¿èŸŒã¿é¢æ°ã§ååã§ãããã ãã popcntl
ã䜿çšããã«RUSTFLAGS
ä»ããŠã-Ctarget-cpu = nativeããCargoã«æž¡ãå¿
èŠããããŸãã ïŒåé¡ïŒ1137ããã³ããã€ãã®é¢é£ããåé¡ãåç
§ããŠãã ããïŒ .cargo/config
ããœãŒã¹ãšäžç·ã«é
åžããã®ã¯è¯ãèãã§ã¯ãªãããã§ããã€ãŸããçŸåšãCargoãåŒã³åºãMakefileããããŸãã
èŠããã«ãå®éã®ã¢ããªã±ãŒã·ã§ã³ã§Intelãä»ã®äººã®æŽŸæãªãããã«ãŠã³ãåœä»€ã䜿çšã§ããã°ããã®ã§ãããããã¯å¿
èŠä»¥äžã«é£ããããã§ãã çµã¿èŸŒã¿é¢æ°ã¯å®å
šã«çãã§ã¯ãããŸããã çŸåšã®asm!
ã¯ãå®å®ããŠå©çšã§ããã°å€§äžå€«ã§ãã ã€ã³ã©ã€ã³ã¢ã»ã³ããªã®æ§æãšã»ãã³ãã£ã¯ã¹ãåªããŠãããšäŸ¿å©ã§ãããå®éã«ã¯å¿
èŠãããŸããã target-cpu=native
ãCargo.toml
ã§çŽæ¥æå®ã§ããã®ã¯çŽ æŽãããããšã§ãããããã§ã¯ç§ã®åé¡ã¯å®éã«ã¯è§£æ±ºãããŸããã
ãã¿ãŸããããšããšãã®ãªãã§ãã ãªãç§ããããæ°ã«ããã®ããå ±æããããšæã£ãã ãã§ãã
@BartMasseyããããŸããããªãã©ãããŠãããªã«å¿ æ»ã«popcntã«ã³ã³ãã€ã«ããå¿ èŠãããã®ã§ããïŒ ç§ãèŠãããšãã§ããå¯äžã®çç±ã¯ãããã©ãŒãã³ã¹ãšIMOã§ããããã®å Žåã¯å¿ ãcount_onesïŒïŒã䜿çšããå¿ èŠããããŸãã æ¢ããŠããã®ã¯ã€ã³ã©ã€ã³asmã§ã¯ãªãtarget_featureïŒrust-lang / rfcsïŒ2045ïŒãªã®ã§ãpopcntã®çºè¡ãèš±å¯ãããŠããããšãã³ã³ãã€ã©ãŒã«éç¥ã§ããŸãã
@BartMasseyããã«ã¯ã€ã³ã©ã€ã³ã¢ã»ã³ããªã䜿çšããå¿
èŠã¯ãããŸããã coresimd
cfg_feature_enabled!("popcnt")
ã䜿çšããŠããã€ããªãå®è¡ãããŠããCPUãpopcnt
åœä»€ããµããŒãããŠãããã©ãããç
§äŒããŸãïŒå¯èœã§ããã°ãã³ã³ãã€ã«æã«ããã解決ããŸãïŒã
coresimd
ã¯ã popcnt
åœä»€ã®äœ¿çšãä¿èšŒãããŠããpopcnt
çµã¿èŸŒã¿é¢æ°ãæäŸããŸãã
@gnzlbg
coresimdã¯ãpopcntåœä»€ã®äœ¿çšãä¿èšŒãããŠããpopcntçµã¿èŸŒã¿é¢æ°ãæäŸããŸãã
å°ã話é¡ããå€ããŠããŸããããã®å£°æã¯å³å¯ã«ã¯çå®ã§ã¯ãããŸããã _popcnt64
ã¯å
éšã§leading_zeros
ã䜿çšããããã popcnt
æ©èœãã¯ã¬ãŒããŠãŒã¶ãŒã«ãã£ãŠæå¹ã«ãªãããã¯ã¬ãŒãäœæè
ã#![cfg(target_feature = "popcnt")]
䜿çšãå¿ããå Žåããã®çµã¿èŸŒã¿é¢æ°ã¯æ¬¡ã®ããã«ãªããŸããå¹æã®ãªãã¢ã»ã³ããªã«ã³ã³ãã€ã«ãããããã«å¯Ÿããä¿è·æ段ã¯ãã
ãããã£ãŠãpopcntæ©èœãcrateãŠãŒã¶ãŒã«ãã£ãŠæå¹ã«ãããªãå Žå
ã€ã³ããªãžã§ã³ã¹ã¯#[target_feature(enable = "popcnt")]
å±æ§ã䜿çšããŠãã¯ã¬ãŒããŠãŒã¶ãŒãæå¹ãŸãã¯ç¡å¹ã«ãããã®ã«é¢ä¿ãªããã€ã³ããªãžã§ã³ã¹ã®popcnt
æ©èœãç¡æ¡ä»¶ã«æå¹ã«ãããããããã¯æ£ãããããŸããã ãŸãã assert_instr(popcnt)
å±æ§ã¯ãRustããµããŒããããã¹ãŠã®x86
ãã©ãããã©ãŒã ã§ãçµã¿èŸŒã¿é¢æ°ãpopcnt
ã«å解ãããããšãä¿èšŒããŸãã
RustãçŸåšãµããŒãããŠããªãx86
ãã©ãããã©ãŒã ã§Rustã䜿çšããŠããå Žåã¯ã core
ã移æ€ãã人ãããããã®çµã¿èŸŒã¿é¢æ°ããã®ã¿ãŒã²ããã§popcnt
ãçæããããã«ããŸãã
ç·šéïŒ @newpavlov
ãããã£ãŠãpopcntæ©èœãcrateãŠãŒã¶ãŒã«ãã£ãŠæå¹ã«ãªãããcrateäœæè ãïŒïŒ[cfgïŒtarget_feature = "popcnt"ïŒ]ã®äœ¿çšãå¿ããå Žåããã®çµã¿èŸŒã¿é¢æ°ã¯ç¡å¹ãªã¢ã»ã³ããªã«ã³ã³ãã€ã«ãããããã«å¯Ÿããä¿è·æ段ã¯ãããŸããã
å°ãªããšããã®åé¡ã§èšåããäŸã§ã¯ããããè¡ããšæªå®çŸ©ã®åäœãããã°ã©ã ã«å°å ¥ããããã®å Žåãã³ã³ãã€ã©ãŒã¯äœã§ãå®è¡ã§ããŸãã åäœããäžè¯codegenã¯ãååŸã§ããè€æ°ã®çµæã®1ã€ã§ãã
ãŸã第äžã«ãè°è«ãçãããããšããè©«ã³ããŸãã ç§ã®èŠç¹ãç¹°ãè¿ããããšæããŸãããgcc_asmïŒãŸãã¯clang_asmïŒãŸãã¯llvm_asmïŒãã¯ãïŒãŸãã¯ãã®é©åãªãµãã»ããïŒããäºææ§ã®ããæ§æãšã»ãã³ãã£ã¯ã¹ãåããå®å®çã«è²Œãä»ããããšãå®å šã«ãµããŒãããŸãããããè¯ã解決çãæ€èšãããŠããŸãã ãã
ã€ã³ã©ã€ã³ã¢ã»ã³ããªã®ãã€ã³ãã¯ãããããããã«ãŠã³ããã³ãããŒã¯/ãã¢ã§ãããšããããšã§ãã ããŒã¹ã©ã€ã³ãšããŠããŸãã€ã³ã©ã€ã³ã¢ã»ã³ããªã®äœ¿çšæ¹æ³ã説æããããã«ãå¯èœãªå Žåã¯çã«ä¿èšŒãããpopcntl
åœä»€ãå¿
èŠã§ãã ãŸããRustcãGCCãClangãšæ¯èŒããŠã²ã©ãèŠããªãããã«ãå¯èœãªå Žåã¯count_ones()
ãpopcountåœä»€ã䜿çšããããšãä¿èšŒããããšæããŸãã
target_feature=popcnt
ããææããã ãããããšãããããŸãã ããã§äœ¿ãæ¹ãèããŸãã ãŠãŒã¶ãŒãã³ã³ãã€ã«ããŠããCPUã«é¢ä¿ãªãããŸãpopcountåœä»€ããããã©ããã«é¢ä¿ãªãã count_ones()
ããã³ãã«å
¥ããããšæããŸãã ã¿ãŒã²ããCPUã«ãããã«ãŠã³ããããå Žåã¯count_ones()
ãããã䜿çšããããšã確èªãããã ãã§ãã
stdsimd
/ coresimd
æšæ ã¯èŠæ ããããããããããããã®ãã³ãããŒã¯ã§æå¹ã«ããå¿
èŠããããŸãã ããããšãïŒ ãã®ã¢ããªã§ã¯ãæšæºèšèªã®æ©èœä»¥å€ã¯ã§ããã ã䜿çšããªãã»ãããããšæããŸãïŒ lazy_static
ã«ã€ããŠã¯ãã§ã«çœªæªæãæããŠããŸãïŒã ãããããããã®æœèšã¯ç¡èŠã§ããªãã»ã©è¯ãããã«èŠãããå
¬åŒãã«ãªãããã®éãé 調ã«é²ãã§ããããã§ãã
@nbpã«ãã£ãŠcrateãªã©ïŒã«ç§»è¡ããå®è£ ãããããããã®ãã€ãã¯ã³ãŒãå ã®ç¹å®ã®å Žæã«çŽæ¥å«ãŸããŸãã
é¢æ°å ã®ä»»æã®å Žæã«ä»»æã®ã³ãŒããã€ããã¹ãã©ã€ã¹ããããšã¯ã解決ããã®ãã¯ããã«ç°¡åãªåé¡ã®ããã«æãããŸãïŒãã ããå ¥åãåºåãããã³ãããã®å¶çŽãã¯ããŒããŒãšåããããããæå®ããæ©èœã¯å¿ èŠã§ãïŒã
cc @eddyb
@nagisaããã¯åãªããã·ã³ã³ãŒãã®ãã£ãã¯ã§ã¯ãããŸããããå ¥åãåºåãããã³ã¯ããŒããŒã¬ãžã¹ã¿ã«ã泚æããå¿ èŠããããŸãã ASMãã£ã³ã¯ãïŒ raxã«ç¹å®ã®å€æ°ãå¿ èŠã§ãããïŒ esiãå£ããŠããŸããšèšã£ãŠããå Žåã¯ãåšå²ã®ã³ãŒããé©åã«æ©èœããããšã確èªããå¿ èŠããããŸãã ãŸããéçºè ãã³ã³ãã€ã©ã«ã¬ãžã¹ã¿ãå²ãåœãŠãããå Žåã¯ãå€ãããŒããã移åãããããªãããã«ãå²ãåœãŠãæé©åããããšããå§ãããŸãã
@simias ã確ãã«ãå€æ°ãç¹å®ã®ã¬ãžã¹ã¿ã«é¢é£ä»ããæ¹æ³ãšãã©ã®ã¬ãžã¹ã¿ãäžæžãããããæå®ããå¿ èŠããããŸããããããã¯ãã¹ãŠãã¢ã»ã³ããªèšèªãLLVMã¢ã»ã³ããªèšèªãæšæºåãããããå°ãããã®ã§ãã
ãã€ãã·ãŒã±ã³ã¹ã§ã®æšæºåã¯ãã¢ã»ã³ããªãã¬ãŒããŒããã©ã€ããŒ/ proc-macroã«ç§»åããããšã§ãããããæãç°¡åãªæ¹æ³ã§ãã
é©åãªã€ã³ã©ã€ã³ã¢ã»ã³ããªã®ä»£ããã«éèªçãªãã€ãã䜿çšããããšã®åé¡ã®1ã€ã¯ãã³ã³ãã€ã©ã«ã¬ãžã¹ã¿ã®ã¢ã«ãã¡ååå€æŽãè¡ããªãã·ã§ã³ããªãããšã§ããããã¯ãã€ã³ã©ã€ã³ã¢ã»ã³ããªãäœæãã人ã ãæåŸ ããŠããããšã§ããããŸããã
ããããã³ã³ãã€ã©ã«ãããåŠçããããå Žåãããã¯ã¬ãžã¹ã¿å²ãåœãŠã§ã©ã®ããã«æ©èœããŸããïŒ ããšãã°ã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ã®ã€ã³ã©ã€ã³ã¢ã»ã³ãã©åŒã«ããããç°¡åã«ãããã³ã°ã§ããŸãã
äžæ¹ãrawãã€ãã®æ¿å
¥ã¯ãLLVMã§ãµããŒããããŠããïŒãŸãã¯LLVM IRãªãã¡ã¬ã³ã¹ããã¥ã¢ã«ãããããïŒç§ãç¥ãéãã§ã¯ãããŸããã ãããã£ãŠãåºæ¬çã«LLVM IRãæ¡åŒµããå¥ã®ã¯ã¬ãŒãã䜿çšããŠLLVMã«ãã§ã«ååšããæ©èœïŒã·ã¹ãã ã¢ã»ã³ããªã®ã¢ã»ã³ããªïŒãåå®è£
ããŸãã
@nbp
å®éãå€æ°ãç¹å®ã®ã¬ãžã¹ã¿ã«é¢é£ä»ããæ¹æ³ãšãã©ã®ã¬ãžã¹ã¿ãäžæžãããããæå®ããå¿ èŠããããŸããããããã¯ãã¹ãŠãã¢ã»ã³ããªèšèªãLLVMã¢ã»ã³ããªèšèªãæšæºåãããããå°ãããã®ã§ãã
ã§ã¯ãããã¯ã©ã®ããã«è¡ãããã®ã§ããããïŒ ç§ã¯ããŒãã³ãŒããããã¬ãžã¹ã¿ãåãããã€ãã®ã·ãŒã±ã³ã¹ãæã£ãŠããŸããããã¯åºæ¬çã«ãå ¥å/åºåã¬ãžã¹ã¿ãã¯ããŒããŒãªã©ããã¹ãŠãã®ãã€ãã®ã·ãŒã±ã³ã¹å ã«ããŒãã³ãŒããããŠããããšãæå³ããŸãã
ä»ãç§ã¯ãã®ãã€ããç§ã®éã³ããã€ããªã®ã©ããã«æ³šå ¥ããŸãã ã©ã®ã¬ãžã¹ã¿ãå ¥åºåã§ããããã©ã®ã¬ãžã¹ã¿ãç Žå£ãããããªã©ãrustcã«äŒããã«ã¯ã©ãããã°ããã§ããïŒ ããã¯ãã€ã³ã©ã€ã³ã¢ã»ã³ããªãå®å®ãããããããã©ã®ããã«è§£æ±ºãã¹ãå°ããªåé¡ã§ããïŒ ããã¯ã€ã³ã©ã€ã³ã¢ã»ã³ããªãè¡ãããšãšãŸã£ããåãã§ããããã«èŠããŸãããäœæãããã¢ã»ã³ããªã§å ¥å/åºåã¯ããŒããŒã2åæå®ããå¿ èŠãããããã®æ å ±ãrustcã«æž¡ãå¿ èŠãããããã§ãã ãŸããrustcã¯ãããæ€èšŒããã®ã«ç°¡åãªæéã¯ãããŸããããã®ããã«ã¯ããã€ãã®ã·ãŒã±ã³ã¹ã解æããŠã¢ã»ã³ããªã«å ¥ãããããæ€æ»ã§ããå¿ èŠãããããã§ãã ç§ã¯äœãæ¬ ããŠããŸããïŒ
@simias
asm ("leal (%1, %1, 4), %0"
: "=r" (five_times_x)
: "r" (x));
ãã€ãã®rawã§ã¯ã¬ãžã¹ã¿ã®ã¢ã«ãã¡åã®å€æŽãèš±å¯ãããŠããªããããããã¯äžå¯èœã§ãããã¬ãžã¹ã¿ã¯å ã®ã³ãŒãã·ãŒã±ã³ã¹ã«ãã£ãŠåŒ·å¶ãããå¿ èŠããããŸãã
@Florob
å°ãªããšãç§ã«ãšã£ãŠã¯ãã·ã¹ãã ã¢ã»ã³ãã©ã䜿çšããã¢ã»ã³ããªèšèªãåãå ¥ãããããšããåæãåžžã«ãããŸããã
ç§ã®ç解ã§ã¯ãã·ã¹ãã ã¢ã»ã³ãã©ã«äŸåããããšã¯ãç§ãã¡ãä¿¡é Œãããããšã§ã¯ãªãã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ã¢ã»ã³ããªã®2ã€ã®ç°ãªãæ§æãé€ããŠãã¢ã»ã³ããªæ§æã¯äž»ã«æšæºã§ç§»æ€å¯èœã§ãã ã·ã¹ãã ã¢ã»ã³ãã©ã®å¯äžã®åé¡ã¯ãæ°ããåœä»€ããªãããšãããããŸããããããã¯æé©åãã䟡å€ã®ãªãããããªç¶æ³ã§ãã
å®éã®åé¡ã¯ãã¬ãžã¹ã¿å²ãåœãŠãžã®æ¥çå€ã§ãã ããããå®éã®ã¢ã»ã³ããªæååèªäœã«é¢ããéããããã¯åã«èª°ããæååã®çœ®æã解æãè¡ãå¿ èŠãããããšãæå³ããŸãããã®çš®ã®çœ®æã¯ãæšå®ãããããã¯ãšã³ãã§ç°¡åã«å©çšã§ããã¯ãã§ãã
ãã®ãããªãã®ã®LLVMïŒãŸãã¯gccïŒã®æ§æã¯ãã ããªãããšã«åæããŸãããããªã³ã³ãã€ã«ããããã€ãã«ç§»åãããšããããšã¯ãasm crateãå®å šãªã¢ã»ã³ãã©ãŒãšå Žåã«ãã£ãŠã¯å®å šãªã¬ãžã¹ã¿ã¢ãã±ãŒã¿ãŒãã€ã³ã¹ããŒã«ããïŒãŸãã¯ããã°ã©ããŒã«ã¬ãžã¹ã¿ãæåã§å²ãåœãŠãïŒå¿ èŠãããããšãæå³ããŸããã·ã¹ãã ã¢ã»ã³ãã©ã䜿çšããŸãã ãã®æç¹ã§ã¯ãå®éã«ã¯ããã»ã©å€ãã®äŸ¡å€ãè¿œå ããŠããããã«ã¯èŠããŸããã
@jcranmer
...ããããããªã³ã³ãã€ã«ããããã€ãã«ç§»åãããšããããšã¯ãasm crateãå®å šãªã¢ã»ã³ãã©ãŒãšå Žåã«ãã£ãŠã¯å®å šãªã¬ãžã¹ã¿ã¢ãã±ãŒã¿ãŒãã€ã³ã¹ããŒã«ããïŒãŸãã¯ããã°ã©ããŒã«ã¬ãžã¹ã¿ãæåã§å²ãåœãŠãïŒããã·ã¹ãã ã¢ã»ã³ãã©ãŒã䜿çšããå¿ èŠãããããšãæå³ããŸã
https://github.com/CensoredUsername/dynasm-rs
ãã®ã¯ã¬ãŒãã¯ããã©ã°ã€ã³ã«ãã£ãŠåŠçããããã¯ãã䜿çšããŠãã¢ã»ã³ããªã³ãŒããã¢ã»ã³ãã«ããå®è¡æã«é£çµãããçã®ã¢ã»ã³ããªã³ãŒãã®ãã¯ãã«ãçæããŸãã
@nbpããããç§ã®
ã¢ã»ã³ããªblobãåšå²ã®ã³ã³ãã€ã©ããåºåãããã¢ã»ã³ããªãšããŸãçµ±åãããªãå Žåã¯ãé¢æ°åŒã³åºãã«åãã¿ã€ãã®ã¬ãžã¹ã¿ããããããã¹ã¿ã³ãã¢ãã³ã®.sã¢ã»ã³ããªãã¡ã€ã«ã®å€éšCã¹ã¿ã€ã«ã¡ãœããã§ASMã¹ã¿ããå æ°å解ããããšãã§ããŸãã -å²ãåœãŠã®å¶çŽã ããã¯ä»æ¥ãã§ã«æ©èœããŠããŸãããrustcã«çµã¿èŸŒããšãã¹ã¿ã³ãã¢ãã³ã®ã¢ã»ã³ããªãã¡ã€ã«ã䜿çšããå Žåã«æ¯ã¹ãŠãã«ãã·ã¹ãã ãç°¡çŽ åãããå¯èœæ§ããããŸãã ç§ãèšã£ãŠããã®ã¯ãIMOã®ææ¡ã¯ãçŸåšã®ç¶æ³ãšæ¯ã¹ãŠããã»ã©é ããªããšããããšã ãšæããŸãã
ãŸããASMã³ãŒãããªã³ã«ãŒã«ãã£ãŠè§£æ±ºãããå€éšã·ã³ãã«ãåŒã³åºãå Žåã¯ã©ããªããŸããïŒ ã³ã³ãã€ã«ããã»ã¹ã®åŸåãŸã§è§£æ±ºã§ããªãå¯èœæ§ãããããããã®æ å ±ãæž¡ãå¿ èŠããããŸãã ãã€ãé åãšäžç·ã«åç §ãæž¡ãããªã³ã«ã«åŸã§ãããã解決ãããå¿ èŠããããŸãã
@jcranmer
x86ã¢ã»ã³ããªã®2ã€ã®ç°ãªãæ§æãé€ããŠãã¢ã»ã³ããªæ§æã¯äž»ã«æšæºã§ç§»æ€å¯èœã§ãã
ãããäœãæå³ããã®ãç解ã§ããŸãããæããã«ãASMæ§æã¯ã¢ãŒããã¯ãã£éã§ç§»æ€ã§ããŸããã ãŸããåãã¢ãŒããã¯ãã£å ã§ãã£ãŠããèšèªã®çµã¿ç«ãŠæ¹æ³ãå€æŽããããªãšãŒã·ã§ã³ããªãã·ã§ã³ãååšããããšããããããŸãã
äŸãšããŠMIPSãæããŸãããã¢ã»ã³ãã©ã®åäœã埮調æŽãã2ã€ã®éèŠãªæ§æãã©ã°ããããŸãã 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ã¯ãå³å€ã2ã€ã®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ã»ã³ããèœãšãããã£ãã ãã§ãããªããªããç§ã¯ãã ã®ãŠãŒã¶ãŒã§ãããéåžžã«æ¥ãããããå±ã§éããªäººã§ããããã«æãããŠããŸãã
ãããããã®éäŒã®ããšã¯ãã ã¯ã¬ã€ãžãŒã§ããã€ãŸãã3幎éã®äŒè©±ã§ãããããããã®ã¢ã€ãã¢ãšäžæºããããŸãããæäœéã®ã³ã³ã»ã³ãµã¹ã®ããã«ã¯æããŸããã RFCã§ã¯ãªã3幎ã§ãããã¯å°ãæ»ã®çµããã®ããã«æããŸãã ç§ã¯è¬èãªæ°åŠã©ã€ãã©ãªãéçºããŠããŸãïŒ2ã€ãŸãã¯3ã€ã®ã¯ã¬ãŒãã§å®çŸããããšãé¡ã£ãŠããŸãïŒããããŠç§ã«ãšã£ãŠïŒãããŠãéã³ãã¢ã»ã³ããªãæžãããšã«èå³ãããä»ã®ä»²éã«ãšã£ãŠïŒæãéèŠãªããšã¯å®éã«ã§ããããšã§ãããïŒ ç¿æ¥ãã¹ãŠãå€ãããªããšããæäœéã®ä¿èšŒããããŸãïŒãããäžå®å®ãªãã£ã³ãã«ãç¹ã«ãã®äŒè©±ãç§ã«æãããããã®ã§ãïŒã
ããã®èª°ããæè¯ã®è§£æ±ºçãæãã§ããããšãç解ããŠããŸãããããŠãããããã€ã誰ãããããæãä»ãã§ãããããããä»æ¥ã«é¢ããŠã¯ç§ã¯çŸåšã®ãã¯ãã¯ã¡ããã©è¯ããšä¿¡ããŠããŸãïŒãŸããããã€ãã®ç¹ã§å°ãå¶éããããããããŸããããããŸãããã°ãããã§ããªãããšã¯äœããããŸãã挞é²çã«å¯ŸåŠããïŒã ã¢ã»ã³ããªãæžãããšã¯ãã·ã¹ãã èšèªã§æãéèŠãªããšã®ããã§ãããéåžžã«å¿ èŠãªæ©èœã§ãããããä¿®æ£ããããŸã§ã¯cpp_buildã«é Œã£ãŠã倧äžå€«ã§ããããã£ãšæéãããããšã次ã®ããã«ãªãã®ã§ã¯ãªãããšå¿é ããŠããŸããæ°žé ã®äŸåé¢ä¿ã çç±ã¯ããããŸãããããããäžåçãªèããšåŒãã§ããŸãããã¢ã»ã³ããªãåŒã³åºãããã«cppãåŒã³åºããªããã°ãªããªãã®ã¯å°ãæ²ããããšã§ãããçŽç²ãªéã®è§£æ±ºçãå¿ èŠã§ãã
FWIWéã¯ããã§ç¹å¥ã«ã¯ãMSVCã¯ãx86_64ã®ããããã®ã€ã³ã©ã€ã³ã¢ã»ã³ãã©ãæã£ãŠããªããšããããšã§ã¯ãããŸããã å€æ°ããªãã©ã³ããšããŠäœ¿çšã§ãããšããéåžžã«å¥åŠãªå®è£ ããããŸãããããã¯x86ã§ã®ã¿æ©èœããŸãã
@josevalaadã€ã³ã©ã€ã³ã¢ã»ã³ããªãäœã«äœ¿çšããŠããã®ãã«ã€ããŠè©³ããæããŠãã ããã
ç§ãã¡ã¯ãããã¯OSã®ãããªãåæ§ã«ä»ã®çç±ã®ããã«ãå€éã«äžè¬çã«ç«ã¡åŸçããŠããç¶æ³ã§äœ¿çšãããå¯äžã®äžè¬çã«èŠãŠããã®åŸã圌ãã¯ã»ãšãã©äœ¿çšasm!
ããšãŠãå®å®asm!
AãããŠããŸããLLVMã®å€éšã§é©åã«åç¶ãããã¹ãŠã®äººãåã°ããããšãã§ãããã®ãèšèšããã³éçºããããã®ååãªåªå
é äœã
ããã«ãã»ãšãã©ã®ããšã¯ãå ¬éããããã©ãããã©ãŒã çµã¿èŸŒã¿é¢æ°ã䜿çšããŠå®è¡ã§ããŸãã x86ãšx86_64ã¯å®å®åãããŠãããä»ã®ãã©ãããã©ãŒã ãé²è¡äžã§ãã ããããç®æšã®95ã99ïŒ ãéæããããšã¯ãã»ãšãã©ã®äººã®æåŸ ã§ãã ããã€ãã®åºæã®ãã®ã䜿çšããäŸãšããŠãç§èªèº«ã®ã¯ã¬ãŒãjetsciiãèŠãããšãã§ããŸãã
ã€ã³ã©ã€ã³ã¢ã»ã³ããªã䜿çšããŠLLVMã®ã³ãŒãçæãã°ãåé¿ããjemallocPRãããŒãžããŸãã-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ãããšãç§ã¯å°ããªè¡å代æ°ã©ã€ãã©ãªãæžããŠããŸãã ãã®ã©ã€ãã©ãªå ã§ãã©ã€ãã©ãªãçŽç²ãªrustå®è£ ã«ãããã£ãã®ã§ãRustã«BLASãããããããã€ãã®LAPACKïŒãŸã ååšããªãïŒã«ãŒãã³ãå®è£ ããŠããŸãã ãŸã æ·±å»ãªããšã§ã¯ãããŸãããããšã«ããããŠãŒã¶ãŒããç¹ã«GEMMæäœã䜿çšããŠãå¿ èŠäžå¯æ¬ ãªasmã®é床ãšæ¥œãã¿ãéžæã§ããããã«ãããã£ãã®ã§ãïŒãšã«ãããæããã䜿çšãããBLISã®äººã ã®ã¢ãããŒãã«åŸãå Žåå°ãªããšãx86 / x86_64ã§ã¯ãå¿ èŠãªãã®ã¯ãã¹ãŠæã£ãŠããŸãã ãããŠãããã¯å®å šãªè©±ã§ãã ãã¡ãããå€éã®ãã£ã³ãã«ã䜿çšã§ããŸãããæ©èœã®å®å®åãšããå®çšçãªæ¹åã«å°ãæŒãããã£ãã ãã§ãã
@shepmasterçµã¿èŸŒã¿é¢æ°ã§ã¯äžååãªãŠãŒã¹ã±ãŒã¹ã_
å®å®ããã€ã³ã©ã€ã³asmã¯éèŠã§ãããæ¬è³ªçãªãã®ã ãã§ã¯äžååã§ãã
ç§ã®åœåã®ãã€ã³ãã¯ã誰ããããé«éãªã³ãŒããèšè¿°ã§ããããã«ããããšã§ããã 圌ãã¯ãçµã¿èŸŒã¿é¢æ°ãå©çšå¯èœã§ããããããšãç¥ã£ãŠããããšã«èšåããŠããŸããã§ããããããŠããã¯ç§ãå ±æããããšãããã¹ãŠã§ãã æ®ãã¯èæ¯æ å ±ã§ããã
ç§ã¯ç¹å®ã®èŠ³ç¹ã䞻匵ããããšããããŠããªãã®ã§ãç§ãšè°è«ããããšããªãã§ãã ããâç§ã¯ãã®ã¬ãŒã¹ã«å©å®³é¢ä¿ããããŸããã ç§ãç解ããŠããããã«ãç§ã¯åã«çŸåšã®èŠç¹ãäœã§ããããç¹°ãè¿ããŠã€ã³ã©ã€ã³ã¢ã»ã³ããªãå¿ èŠãšãããããžã§ã¯ãã«åå ããŠ
ã¯ããä»ã®ãšããçµã¿ç«ãŠãå¿ èŠãªå Žåãããã°ãæ°žé ã«å¿ èŠã«ãªãå ŽåããããŸããç§ã¯æåã«åãããã«èšããŸããïŒæ確ã«ããããã«åŒ·èª¿ãè¿œå ããŸããïŒã
[çµã¿èŸŒã¿é¢æ°]ãç®æšã®95ã99ïŒ ãéæããããšã¯ãã»ãšãã©ã®äººã®æåŸ ã§ãã
ç§ã®æèŠã§ã¯ãå®å®ããéäŒãèŠããã®ã§ããã°ã誰ãïŒãŸãã¯äººã ã®ã°ã«ãŒãïŒãRustããŒã ããéå§ã®æ¹åæ§ã«ã€ããŠäžè¬çãªã³ã³ã»ã³ãµã¹ãåŸãŠããããå®çŸããããã«å€å€§ãªåªåãæãå¿ èŠããããŸãã ã
ãŸã æ·±å»ãªããšã§ã¯ãããŸãããããšã«ããããŠãŒã¶ãŒããç¹ã«GEMMæäœã䜿çšããŠãå¿ èŠäžå¯æ¬ ãªasmã®é床ãšæ¥œãã¿ãéžæã§ããããã«ãããã£ãã®ã§ãïŒãšã«ãããæããã䜿çšãããBLISã®äººã ã®ã¢ãããŒãã«åŸãå Žåå°ãªããšãx86 / x86_64ã§ã¯ãå¿ èŠãªãã®ã¯ãã¹ãŠæã£ãŠããŸãã
ã€ã³ã©ã€ã³ã¢ã»ã³ããªãªãã§ã¯ã¢ã¯ã»ã¹ã§ããªããã¢ã¯ã»ã¹ããå¿
èŠã®ããåœä»€ããŸã ç解ããŠããŸããã ãããšããç®è¡åœä»€ã®ç¹å®ã®ã·ãŒã±ã³ã¹ã§ããïŒ
ãããããªããã€ã³ã©ã€ã³ã¢ã»ã³ããªã«å¯ŸããŠåçã®RustãœãŒã¹ããã³ãããŒã¯ããŸãããïŒ
ã€ã³ã©ã€ã³ã¢ã»ã³ããªãªãã§ã¯ã¢ã¯ã»ã¹ã§ããªããã¢ã¯ã»ã¹ããå¿ èŠã®ããåœä»€
ããŠãæ°åŠã§ã®ã¢ã»ã³ããªã«ã€ããŠè©±ããŠãããšãã¯ãåºæ¬çã«ãSIMDã¬ãžã¹ã¿ãš_mm256_mul_pdã_mm256_permute2f128_pdãªã©ã®åœä»€ã®äœ¿çšãšãããé²ããã¯ãã«åæäœã«ã€ããŠè©±ããŠããããšã«ãªããŸãã éèŠãªã®ã¯ããã¯ãã«åã«ããŸããŸãªã¢ãããŒãããšãããšãã§ãããšããããšã§ããéåžžãã¿ãŒã²ãããšããããã»ããµãšå¿µé ã«çœ®ããŠãã䜿çšæ³ã«å¯ŸããŠæé©åãããããã©ãŒãã³ã¹ãåŸããããŸã§ãå°ãè©Šè¡é¯èª€ããŸãã ãããã£ãŠãéåžžãã©ã€ãã©ãªã¬ãã«ã§ã¯ãæåã«ããã»ããµã«ã¯ãšãªãå®è¡ããŠasmã³ãŒããæ¿å ¥ãããµããŒããããŠããåœä»€ãšã¬ãžã¹ã¿ã®ã»ããã確èªããŠãããç¹å®ã®ããŒãžã§ã³ã®æ°åŠasmã«ãŒãã«ãæ¡ä»¶ä»ãã³ã³ãã€ã«ããå¿ èŠããããŸãã
ãããããªããã€ã³ã©ã€ã³ã¢ã»ã³ããªã«å¯ŸããŠåçã®RustãœãŒã¹ããã³ãããŒã¯ããŸãããïŒ
çŸåšãå ·äœçãªãã¹ãã¯ãããŸãããäŒæäžãªã®ã§ãããŸãé¢ãããããªãã®ã§ããã2ã3é±éããã ããã°ãããã©ãŒãã³ã¹ã®æ¯èŒãæçš¿ã§ããŸãã ãããã«ãããã³ã³ãã€ã©ãæåã§èª¿æŽãããã¢ã»ã³ããªã䜿çšããŠã§ããéãé«éã«ã³ãŒããçæããããšã¯äžå¯èœã§ããã å°ãªããšãCã§ã¯ãå¿ èŠã«å¿ããŠæåã§ã«ãŒããå±éãããªã©ã®åŸæ¥ã®ããã©ãŒãã³ã¹ææ³ã䜿çšããŠãäžå¯èœã§ãããããRustã§ã¯äžå¯èœã§ãããšæããŸãã
Taylor Cramerã¯ãããã«æçš¿ããããšãææ¡ããŸããã è°è«ã®çŸç¶ãç解ããããã«ãã¹ãŠã®ã³ã¡ã³ããèªãã ããã§ã¯ãªãã®ã§ãèš±ããŠãã ããã ããã¯ãç§ãã¡ã®ç¶æ³ãæ¯æããè¡šæããããã®å£°ã«ãããŸããã
Googleã®ãã¢ã¡ã¿ã«ãããžã§ã¯ãã§ã¯ãã€ã³ã©ã€ã³ããã³ã¢ãžã¥ãŒã«ã¬ãã«ã®ã¢ã»ã³ãã©ã®å®å®åã«é¢ããåããèŠãããããšãæãã§ããŸãã å¥ã®æ¹æ³ã¯ãFFIã䜿çšããŠãçŽç²ãªã¢ã»ã³ããªã§èšè¿°ãããåå¥ã«ã¢ã»ã³ãã«ããããã€ããªã«ãªã³ã¯ãããé¢æ°ãåŒã³åºãããšã§ãã
ã¢ã»ã³ãã©ãŒã§é¢æ°ãå®çŸ©ããFFIãä»ããŠããããåŒã³åºããå¥ã®ã¹ãããã§ãããããªã³ã¯ããããšãã§ããŸãããè€éããšããã©ãŒãã³ã¹ã®äž¡æ¹ã®ç¹ã§æ¬ ç¹ãããããããããæä»çã«è¡ãæ·±å»ãªãã¢ã¡ã¿ã«ãããžã§ã¯ãã¯ãããŸããã ã¬ããã¯ã¹ã¯ãasmïŒãã䜿çšããŸãã LinuxãBSDãmacOSãWindowsãªã©ã®éåžžã®å®¹çè ã¯ãã¹ãŠãã€ã³ã©ã€ã³ã¢ã»ã³ãã©ãå€çšããŠããŸãã ãžã«ã³ã³ãšseL4ããããè¡ããŸãã ãã©ã³9ã§ãããæ°å¹Žåã«ããŒãã€ãã©ãŒã¯ã§ããã«é¥ããŸããã
ããã©ãŒãã³ã¹ãéèŠãªå ŽåãåŒã³åºãããé¢æ°ã®è€éãã«ãã£ãŠã¯ãé¢æ°åŒã³åºãã®ãªãŒããŒããããæ¯é çã«ãªãå¯èœæ§ããããŸãã è€éãã®èŠ³ç¹ãããåäžã®åœä»€ãåŒã³åºããããã¬ãžã¹ã¿ãŒãèªã¿æžããããããããã¯ãŠãŒã¶ãŒã¹ããŒã¹ããã°ã©ããŒããéåžžã¯é ãããŠãããã·ã³ç¶æ ãæäœãããããããã ãã«åå¥ã®ã¢ã»ã³ãã©ãŒé¢æ°ãå®çŸ©ããããšã¯ãééããç¯ãããã®ããéå±ãªå®åæãæå³ããŸãã ãããã«ããããããè¡ãã«ã¯ãCargoã®äœ¿çšïŒãŸãã¯å€éšãã«ãã·ã¹ãã ãã·ã§ã«ã¹ã¯ãªãããªã©ã®è£è¶³ïŒãããåµé çã«ããå¿ èŠããããŸãã ããããbuild.rsãããã§åœ¹ç«ã€ãããããŸããããããããªã³ã«ãŒã«ãã£ãŒãããã®ã¯ãã£ãšé£ããããã§ãã
ã·ã³ããªãã¯å®æ°ã®å€ãã¢ã»ã³ãã©ãŒãã³ãã¬ãŒãã«çµã¿èŸŒãæ¹æ³ãããã°ããããéåžžã«æ°ã«å ¥ã£ãŠããŸãã
ã€ã³ã©ã€ã³ããã³ã¢ãžã¥ãŒã«ã¬ãã«ã®ã¢ã»ã³ãã©ãŒã®å®å®åã«é¢ããåããèŠãŠã¿ãããšæããŸãã
æåŸã®pre-RFCïŒhttps://internals.rust-lang.org/t/pre-rfc-inline-assembly/6443ïŒã¯ã6ãæåã«ã³ã³ã»ã³ãµã¹ãéæããããïŒå°ãªããšãåºæ¬çãªåé¡ã®ã»ãšãã©ã«ã€ããŠïŒã次ã®ã¹ããããã®äžã«æ§ç¯ãããRFCãæåºããããšã§ãã ããããã£ãšæ©ãèµ·ãããããã®ãªãã @ Florobã«é£çµ¡ããããšããå§ãããŸãã
ãã®äŸ¡å€ã«ã€ããŠã¯ãWindowsã§TEBæ§é äœãžã®ãã€ã³ã¿ãååŸããããã«FSGSã¬ãžã¹ã¿ã«çŽæ¥ã¢ã¯ã»ã¹ããå¿
èŠããããŸãããŸããä»»æã®ã¡ã¢ãªäœçœ®ã«bt
ãé©çšããããã®_bittest64
ãããªçµã¿èŸŒã¿é¢æ°ãå¿
èŠã§ããã©ã¡ãããã€ã³ã©ã€ã³ã¢ã»ã³ããªãŸãã¯å€éšåŒã³åºããªãã§è¡ãæ¹æ³ãèŠã€ããããšãã§ããŸããã§ããã
ãã ããããã§èª¬æãã3çªç®ã®ãã€ã³ãã¯ç§ã«é¢ä¿ããŸããLLVMã¯ãäœãåé¡ãçºçããå Žåã«Just Crashãåªå ãããšã©ãŒã¡ãã»ãŒãžããŸã£ãã衚瀺ãããªãããã§ãã
@MSxDOS
ãŸããä»»æã®ã¡ã¢ãªäœçœ®ã«btãé©çšããã«ã¯ã_bittest64ã®ãããªçµã¿èŸŒã¿é¢æ°ãå¿ èŠã§ããã©ã¡ãããã€ã³ã©ã€ã³ã¢ã»ã³ããªãŸãã¯å€éšåŒã³åºããªãã§å®è¡ããæ¹æ³ãèŠã€ããããšãã§ããŸããã§ããã
ãããstdsimd
ã«è¿œå ããã®ã¯é£ããããšã§ã¯ãããŸãããclangã¯ã€ã³ã©ã€ã³ã¢ã»ã³ããªã䜿çšããŠããããå®è£
ããŸãïŒhttps://github.com/llvm-mirror/clang/blob/c1c07cca8cae5f924cedaac7b202b0f3c167111d/test/CodeGen/bittest-intrin .cïŒL45ïŒãã ãããããstdã©ã€ãã©ãªã§äœ¿çšããŠãçµã¿èŸŒã¿é¢æ°ãå®å
šãªRustã«å
¬éã§ããŸãã
æ¬ èœããŠããçµã¿èŸŒã¿é¢æ°ã«é¢ããåé¡ãstdsimdãªããžããªã§éãããšããå§ãããŸãã
@josevalaad
ããŠãæ°åŠã§ã®ã¢ã»ã³ããªã«ã€ããŠè©±ããŠãããšãã¯ãåºæ¬çã«ãSIMDã¬ãžã¹ã¿ãš_mm256_mul_pdã_mm256_permute2f128_pdãªã©ã®åœä»€ã®äœ¿çšãšãããé²ããã¯ãã«åæäœã«ã€ããŠè©±ããŠããããšã«ãªããŸãã
ããããããããããªããšæã£ãã è©ŠããŠã¿ããå Žåã¯ãã¢ã»ã³ããªãstd::arch
çµã¿èŸŒã¿åŒã³åºãã«å€æããŠãåãããã©ãŒãã³ã¹ãåŸããããã©ããã確èªã§ããŸãã
ããã§ãªãå Žåã¯ãåé¡ãæåºããŠãã ããã LLVMã¯éæ³ã§ã¯ãããŸããããå°ãªããšãçµã¿èŸŒã¿é¢æ°ã¯asmãšåããããåªããŠããå¿ èŠããããŸãã
@dancrossnyc質åããŠãæ§ããªãã®ã§ããã°ãããªãã®ç¶æ³ã§ãç¹ã«ã€ã³ã©ã€ã³ã¢ã»ã³ããªãå¿ èŠãšãããŠãŒã¹ã±ãŒã¹/ãã©ãããã©ãŒã æ©èœã¯
@MSxDOSãã¶ãããã»ã°ã¡ã³ããã¬ãžã¹ã¿ãèªã¿åãããã®çµã¿èŸŒã¿é¢æ°ãå ¬éããå¿ èŠããããŸããïŒ
ãã¶ããããŒã¿åéãè¡ã£ãŠã人ã
ãæ¬åœã«asm!
ãæãã§ãããã®ã®å
èš³ãååŸããä»ã®æ¹æ³ã§ãµããŒãã§ãããã®ãããã€ãããã確èªããå¿
èŠããããŸãã
ãã¶ããç§ãã¡ã¯ããã€ãã®ããŒã¿åéãè¡ãã人ã ãæ¬åœã«asmãæãã§ãããã®ã®å èš³ãååŸããå¿ èŠããããŸãïŒ
asm!
欲ããïŒ
asm!
ãããã¯ãšããŠæžã蟌ãããšã§ãïŒããããŠããããã®ãã¡ã®ããã€ãä»ã®æ¹æ³ã§ãµããŒããããå¯èœæ§ããããã確èªããŠãã ããã
äœããã®åœ¢ã®ã€ã³ã©ã€ã³ã¢ã»ã³ããªã䌎ããªããããã®ãŠãŒã¹ã±ãŒã¹ããµããŒãããä»ã®æ¹æ³ã¯èŠåœãããŸããããç§ã®å¿ã¯éããŠããŸãã
以åã®RFCã¹ã¬ããã®æçš¿ããã³ããŒãããã®ã§ããçŸåšã®ãããžã§ã¯ãã§äœ¿çšããŠããã€ã³ã©ã€ã³ã¢ã»ã³ããªïŒARM64ïŒã次ã«ç€ºããŸãã
// Common code for interruptible syscalls
macro_rules! asm_interruptible_syscall {
() => {
r#"
# If a signal interrupts us between 0 and 1, the signal handler
# will rewind the PC back to 0 so that the interrupt flag check is
# atomic.
0:
ldrb ${0:w}, $2
cbnz ${0:w}, 2f
1:
svc #0
2:
# Record the range of instructions which should be atomic.
.section interrupt_restart_list, "aw"
.quad 0b
.quad 1b
.previous
"#
};
}
// There are other versions of this function with different numbers of
// arguments, however they all share the same asm code above.
#[inline]
pub unsafe fn interruptible_syscall3(
interrupt_flag: &AtomicBool,
nr: usize,
arg0: usize,
arg1: usize,
arg2: usize,
) -> Interruptible<usize> {
let result;
let interrupted: u64;
asm!(
asm_interruptible_syscall!()
: "=&r" (interrupted)
"={x0}" (result)
: "*m" (interrupt_flag)
"{x8}" (nr as u64)
"{x0}" (arg0 as u64)
"{x1}" (arg1 as u64)
"{x2}" (arg2 as u64)
: "x8", "memory"
: "volatile"
);
if interrupted == 0 {
Ok(result)
} else {
Err(Interrupted)
}
}
@Amanieuã¯ã @ japaricãARMã®æ¬è³ªã«åããŠåãçµãã§ããããšã«æ³šæããŠãã ããã ãã®ææ¡ãããªãã®ããŒãºãã«ããŒããŠãããã©ããã確èªãã䟡å€ããããŸãã
@shepmaster
@Amanieuã¯ã @ japaricãARMã®æ¬è³ªã«åããŠåãçµãã§ããããšã«æ³šæããŠãã ããã ãã®ææ¡ãããªãã®ããŒãºãã«ããŒããŠãããã©ããã確èªãã䟡å€ããããŸãã
泚ç®ã«å€ããã®ã¯æ¬¡ã®ãšããã§ãã
ãã®äœæ¥ã¯ã€ã³ã©ã€ã³ã¢ã»ã³ããªã«ä»£ãããã®ã§ã¯ãªããåã«ãããè£å®ãããã®ã§ãã ãã®ã¢ãããŒãã¯ããã³ããŒAPIãstd::arch
ã§å®è£
ããŸãããããã®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ã«ãã£ãŠå®è¡ãããããšãå
¬éãããŠããªãå ŽåããŸãã¯APIãçµã¿åãããããšãã§ããªãå Žåããã®ã¢ãããŒãã¯åœ¹ã«ç«ã¡ãŸããã
LLVMã®çµã¿èŸŒã¿é¢æ°ïŒç¹ã«SIMDïŒã®å®è£ ã«ã€ããŠéåžžã«é©ãã¹ãããšã¯ãçµã¿èŸŒã¿é¢æ°ã®åœä»€ãžã®Intelã®æ瀺çãªãããã³ã°ã«ãŸã£ããæºæ ããŠããªãããšã§ãããããã¯ãã³ã³ãã€ã©ãŒã®å¹ åºãæé©åã®å¯Ÿè±¡ãšãªããŸãã ããšãã°ãããå®æ°ãã¡ã¢ãªããããŒãããã®ã§ã¯ãªããä»ã®å®æ°ããèšç®ããããšã§ã¡ã¢ãªã®è² è·ã軜æžããããšãããšãã®ããšãèŠããŠããŸãã ããããLLVMã¯åçŽã«ãåé¿ããããšããŠããæ£ç¢ºãªã¡ã¢ãªè² è·ã«å šäœãå®æ°ç³ã¿èŸŒã¿ã«æ»ããŸããã å¥ã®ã±ãŒã¹ã§ã¯ãport5ã®å§åãäžããããã«ã16ãããã®ã·ã£ããã«ã8ãããã®ã·ã£ããã«ã«çœ®ãæããããšãæ€èšããããšæããŸããã ãããããã®æãŠããªãç¥æµã®äžã§ããããŸã§ã«åœ¹ç«ã€LLVMãªããã£ãã€ã¶ãŒã¯ãç§ã®8ãããã·ã£ããã«ãå®éã«ã¯16ãããã·ã£ããã«ã§ããããšã«æ°ã¥ããããã眮ãæããŸããã
ã©ã¡ãã®æé©åã確ãã«ïŒç¹ã«ãã€ããŒã¹ã¬ããã£ã³ã°ã«çŽé¢ããŠïŒããè¯ãã¹ã«ãŒãããããããããŸãããç§ãéæããããšæã£ãŠããã¬ã€ãã³ã·ãŒã®åæžã¯ãããŸããã ç§ã¯ãã®å®éšã®ããã«nasmãŸã§ãã£ãšããããããŠã³ããããšã«ãªããŸããããã³ãŒããçµã¿èŸŒã¿é¢æ°ãããã¬ãŒã³asmã«æžãçŽããªããã°ãªããªãã®ã¯äžå¿ èŠãªæ©æŠã§ããã ãã¡ãããé«ã¬ãã«ã®ãã¯ãã«APIã䜿çšããå Žåã¯ããªããã£ãã€ã¶ãŒã§åœä»€ã®éžæãå®æ°ç³ã¿èŸŒã¿ãªã©ãåŠçããå¿ èŠããããŸãã ããããã©ã®åœä»€ã䜿çšããããæ瀺çã«æ±ºå®ãããšããã³ã³ãã€ã©ãŒããããããããããªãã®ã§ãã å¯äžã®éžæè¢ã¯ã€ã³ã©ã€ã³asmã§ãã
ãããã£ãŠããã³ããŒAPIãRustã§å®è£ å¯èœã§ããã
std::arch
ã§å©çšå¯èœã§ãããåââé¡ã解決ããããã«çµã¿åãããããšãã§ããå Žåãã€ã³ã©ã€ã³ã¢ã»ã³ããªãããåªããŠããããšã«åæããŸãã
ç§ãæåã«èšã£ãŠããã®ã¯ããã ãã§ã
ç®æšã®95ã99ïŒ ãéæãã
ã¯ããä»ã®ãšããçµã¿ç«ãŠãå¿ èŠãªå Žåãããã°ãæ°žé ã«å¿ èŠã«ãªãå ŽåããããŸããç§ã¯æåã«åãããã«èšããŸããïŒæ確ã«ããããã«åŒ·èª¿ãè¿œå ããŸããïŒã
[çµã¿èŸŒã¿é¢æ°]ãç®æšã®95ã99ïŒ ãéæããããšã¯ãã»ãšãã©ã®äººã®æåŸ ã§ãã
ããã¯ã @ eddybã䞊è¡ããŠèšã£ãŠããããšãšåãã§ãã çŸåšã®ç¶æ³ã®çŸå®ãææããããšããŠãããšãã«ããããŸããã
ç§ã¯
ãããéåžžã«æ確ã«è¿°ã¹ãããŠãã ãããã¯ããã€ã³ã©ã€ã³ã¢ã»ã³ããªãå¿ èŠãªå ŽåããããŸãã ç§ã¯ããã䞻匵ããŠããŸããã ç§ã¯ãçŸåšå©çšå¯èœãªããŒã«ã䜿çšããŠã人ã ãçŸå®ã®åé¡ã解決ã§ããããã«æ¯æŽããããšããŠããã ãã§ãã
ç§ãèšãããšããŠããã®ã¯ãããã«å¯ŸããŠããçµç¹åãããã¢ãããŒããé©åãªèª¿æ»ãè¡ãããã®ã¹ã¬ããã®æ°äººãããå€ãã®ããŒã¿ãåéã䜿çšããŠæãäžè¬çãªããŒãºãææããå¿ èŠããã
ç§ã¯ãåã¢ãŒããã¯ãã£ã¯ãã€ã³ã©ã€ã³ãããããã€ãã®äœ¿çšãååŸããããªãããŒã»ããŒã»ã¢ãã«ã®ãµãã»ãããæã£ãŠãããšæãããasm!
ããããŠå€åç§éã¯ãããã®ãµãã»ããã«çŠç¹ãåœãŠããã®åŸãäžè¬åããããšããå¿
èŠããããŸãã
cc @ rust-lang / lang
@eddyb _require_ã¯åŒ·åãªèšèã§ãããã€ã³ã©ã€ã³ã¢ã»ã³ãã©ã䜿çšããå¿ èŠã¯å³å¯ã«ã¯ãããŸããã å ã«è¿°ã¹ãããã«ãçŽç²ãªã¢ã»ã³ããªèšèªã§ããã·ãŒãžã£ãå®çŸ©ããããããåå¥ã«ã¢ã»ã³ãã«ããFFIãä»ããŠRustããã°ã©ã ã«ãªã³ã¯ããããšãã§ããŸãã
ãã ããåã«è¿°ã¹ãããã«ããããå®è¡ããæ·±å»ãªOSã¬ãã«ã®ãããžã§ã¯ãã¯ãããŸããã ããã¯ãå€ãã®ãã€ã©ãŒãã¬ãŒãïŒèªã¿ïŒééããç¯ãå¯èœæ§ãé«ãïŒãããè€éãªãã«ãããã»ã¹ïŒä»ã®ãšãããåçŽãªcargo
åŒã³åºããšããªã³ã¯ãããã»ãŒããã«å®è¡ã§ããã«ãŒãã«ãããäžæ¹ã®ç«¯ããé£ã³åºããŸããå¥ã®ã¹ãããã§ã¢ã»ã³ãã©ãŒãšãªã³ã¯ãåŒã³åºãå¿
èŠããããŸãïŒãã€ã³ã©ã€ã³åããæ©èœã倧å¹
ã«äœäžããŸãã ã»ãŒç¢ºå®ã«ããã©ãŒãã³ã¹ãäœäžããŸãã
ã³ã³ãã€ã©çµã¿èŸŒã¿é¢æ°ã®ãããªãã®ã¯å€ãã®å Žåã«åœ¹ç«ã¡ãŸãããã¿ãŒã²ããISAã®ç£èŠåœä»€ã»ããã®ãããªãã®ãç¹ã«ããé£è§£ãªããŒããŠã§ã¢æ©èœïŒãã€ããŒãã€ã¶ãŒããšã³ã¯ã¬ãŒãæ©èœãªã©ïŒã®å Žåãçµã¿èŸŒã¿é¢æ°ããªãããšãå€ãã no_stdç°å¢ã å€ãã®å Žåãããã«ããçµã¿èŸŒã¿é¢æ°ã§ã¯äžååã§ãã ããšãã°ãx86å²ã蟌ã¿åŒã³åºãèŠçŽã¯ãã£ãããããã«èŠããŸããããã©ãããã¬ãŒã å ã®æ±çšã¬ãžã¹ã¿ãžã®å¯å€ã¢ã¯ã»ã¹ãæäŸããŸããããšãã¥ã¬ãŒã·ã§ã³ãè¡ãç®çã§æªå®çŸ©ã®åœä»€äŸå€ãååŸãããšãã¥ã¬ãŒããããåœä»€ãå€ãè¿ããšããŸãã ïŒ raxãäœãã§; åŒã³åºãèŠçŽã§ã¯ããããåŒã³åºããµã€ãã«æ»ãè¯ãæ¹æ³ãåŸãããªããããèªåã§ããŒã«ããå¿ èŠããããŸããã ããã¯ãã¢ã»ã³ãã©ã§ç¬èªã®äŸå€åŠçã³ãŒããäœæããããšãæå³ããŸããã
ãããã£ãŠãæ£çŽã«èšããšãã€ã³ã©ã€ã³ã¢ã»ã³ãã©ã¯å¿ èŠãããŸããããããããªãããšã¯ã»ãšãã©åå¿è ã§ã¯ãªãã®ã§ååã«åœ¹ç«ã¡ãŸãã
@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
ã xsaves
ã xsaveopt
ã...ãxsave
ã¢ãžã¥ãŒã«ã«å®è£
ããŸãïŒhttpsïŒ //github.com/rust-lang-nursery/stdsimd/blob/master/coresimd/x86/xsave.rsïŒã
ãããã¯core
ã§å
¥æã§ãããããx86çšã®OSã«ãŒãã«ãäœæããããã«äœ¿çšã§ããŸãã ãŠãŒã¶ãŒã¹ããŒã¹ã§ã¯ããããã¯åœ¹ã«ç«ããªãAFAICTã§ãïŒåžžã«äŸå€ãçºçããŸãïŒãã core
ãããåºå¥ããæ¹æ³ããããŸããã core
ã§ããå
¬éã§ããã std
ã§ã¯å
¬éã§ããŸãã
@gnzlbg xsaveopt
ãŸãã¯xsave
ããŠãŒã¶ãŒã¹ããŒã¹ã§äŸå€ãçºçãããçç±ãããããŸããïŒ xsaves
ã¯ãäŸå€ãçæããããã«å®çŸ©ãããŠãããã¡ããªã®1ã€ã ãã§ãïŒ#GP CPL> 0ã®å ŽåïŒãä¿è·ã¢ãŒãã®ã¿ïŒSDMvol.1chã13;vol.2Cchã5XSAVESïŒã xsave
ãšxsaveopt
ã¯ãããªãšã³ããã£ããŠãŒã¶ãŒã¹ããŒã¹ã¹ã¬ãããªã©ã®å®è£
ã«åœ¹ç«ã¡ãŸãããããã£ãŠãçµã¿èŸŒã¿é¢æ°ãšããŠã®ååšã¯å®éã«ã¯çã«ããªã£ãŠããŸãã xsaves
ã®æ¬è³ªã¯ã誰ããxsave
ãã¡ããªãŒãããã¹ãŠãè¿œå ããã ãã§ãç¹æš©ã®åé¡ã«æ°ä»ããªãã£ãããïŒã€ãŸãããŠãŒã¶ãŒã¹ããŒã¹ããåŒã³åºãå¯èœã§ãããšæ³å®ããå ŽåïŒããŸãã¯èª°ãããããåŒã³åºããããšæã£ãããã ãšæããŸãããªã¢ã«ã¢ãŒãããã åŸè
ã¯ãšãŠã€ããªãããã«èŠãããããããŸããããããšãã°ClangãšLLVMã䜿çšããŠãªã¢ã«ã¢ãŒããã¡ãŒã ãŠã§ã¢ãæ§ç¯ããŠãã人ãããããšã¯ç¥ã£ãŠããŸãã
誀解ããªãã§ãã ããã core
ã«LLVMçµã¿èŸŒã¿é¢æ°ãååšããããšã¯çŽ æŽãããããšã§ãã rdtscp
ã®çµæãåã³æçšãªåœ¢åŒã«å€æããããã«ããã®ã°ãããäžé£ã®åœä»€ãæžãå¿
èŠããªããã°ãç§ã¯å¹žãã«ãªããŸãã ãã ããã«ãŒãã«ããã®ä»ã®ãã¢ã¡ã¿ã«ç£èŠã®ãããªãã®ãäœæããå ŽåãçŸåšã®çµã¿èŸŒã¿é¢æ°ã®ã»ããã¯ã€ã³ã©ã€ã³ã¢ã»ã³ãã©ã®ä»£ããã«ã¯ãªããŸããã
@dancrossnyc xsave
ã«ã€ããŠèšåãããšããCPUIDãããXSAVEãXSAVEOPTãXSAVECãªã©ã®èåŸã§äœ¿çšå¯èœãªçµã¿èŸŒã¿é¢æ°ã®ããã€ããåç
§ããŠããŸããããããã®çµã¿èŸŒã¿é¢æ°ã®ããã€ãã¯ç¹æš©ã¢ãŒããå¿
èŠãšããŸãã
ã³ã³ãã€ã©ãïŒããšãã°ïŒç¹æš©åœä»€ãµãã»ããã®äžéšã§ãããç¹å®ã®ããã»ããµããŒãžã§ã³ãæ¡ä»¶ãšããçµã¿èŸŒã¿é¢æ°ãšããŠäœããå ¬éããããšã¯åççã§ããããïŒ
ãã§ã«è¡ã£ãŠãããå®å®ããRustã§å©çšã§ããŸãã
xsavesã®æ¬è³ªã¯ãç¹æš©ã®åé¡ã«æ°ä»ããã«èª°ããxsaveãã¡ããªãŒãããã¹ãŠãè¿œå ããããã ãšæããŸãã
ãããã®çµã¿èŸŒã¿é¢æ°ãè¿œå ããŸããã core
ã«äŸåããããã°ã©ã ããããã䜿çšãããOSã«ãŒãã«ã§ããããšãå®å
šã«åé¡ãªãããŠãŒã¶ãŒã¹ããŒã¹ã§ç¡å®³ã§ãããããç¹æš©ã®åé¡ãèªèãããšã«ããè¿œå ããããšã«ããŸããããããã䜿çšããããšãããšãããã»ã¹ãçµäºããŸãïŒã
ãã ããã«ãŒãã«ããã®ä»ã®ãã¢ã¡ã¿ã«ç£èŠã®ãããªãã®ãäœæããå ŽåãçŸåšã®çµã¿èŸŒã¿é¢æ°ã®ã»ããã¯ã€ã³ã©ã€ã³ã¢ã»ã³ãã©ã®ä»£ããã«ã¯ãªããŸããã
åæããŸãããããããã®åé¡ããŸã éããŠããçç±ã§ã;ïŒ
@gnzlbgç³ãèš³ãããŸãããã xsave
ãããã®ç©ŽãéããŠãããè±ç·ãããã€ããã¯ãããŸããã
ãã ããç§ãç¥ãéããç¹æš©å®è¡ãå¿
èŠãšããçµã¿èŸŒã¿é¢æ°ã¯xsaves
é¢é£ãããã®ã ãã§ãããããã§ãåžžã«ç¹æš©ããããšã¯ãïŒããã§ãããªã¢ã«ã¢ãŒãã¯é¢ä¿ãããŸããïŒã ããããå®å®ããRustã§ïŒçå£ã«ïŒå©çšã§ããã®ã¯çŽ æŽãããããšã§ãã ä»ã®ãã®ã¯ãŠãŒã¶ãŒã¹ããŒã¹ã§åœ¹ç«ã€ãããããŸããããããŠåæ§ã«ç§ã¯ããããããã«ããããšã¯çŽ æŽããããšæããŸãã ãã ãã xsaves
ãšxrstors
ã¯ãç¹æš©åœä»€ã»ããã®ããäžéšã§ããã2ã€ã®åœä»€ã«çµã¿èŸŒã¿é¢æ°ãè¿œå ããããšã¯ãäžè¬çã«è¡ãããšãšã¯è³ªçã«ç°ãªããŸããããã¯_äžè¬çã«_é©åã§ãã ããšãã°ãVMXæ¡åŒµæ©èœããã®VMWRITE
åœä»€ã«ã€ããŠèããŠã¿ãŸãã çµã¿èŸŒã¿é¢æ°ãå®è¡åœä»€ã®ãããªããšãããŠããrflags
ãè¿ãããšæ³åããŸãã ããã¯ãæ¬è³ªçãªãã®ãšããŠæã€ã¹ãå¥åŠã«ç¹æ®åããããã®ã®äžçš®ã§ãã
ããã§ãªããã°ãç§ãã¡ã¯ããã§åæããŠãããšæããŸãã
std::arch
RFCã«ããFWIWã¯ãçŸåšããã³ããŒãAPIã§å
¬éããŠããstd::arch
ã®ã¿çµã¿èŸŒã¿é¢æ°ãè¿œå ã§ããŸãã xsave
å Žåã Intelã¯ããããC APIã§ã¯ãããŸããã çŸåšå
¬éãããŠããªããã³ããŒçµã¿èŸŒã¿é¢æ°ãå¿
èŠãªå Žåã¯ãç¹æš©ã¢ãŒããå¿
èŠãã©ããã«é¢ä¿ãªããåé¡ãéããŸãã
ãã³ããŒããã®çµã¿èŸŒã¿é¢æ°ãå
¬éããŠããªãå Žåã std::arch
ã¯ãã®å Žæã§ã¯ãªãå¯èœæ§ããããŸãããããã«ä»£ããæ¹æ³ã¯ãããããããŸãïŒã€ã³ã©ã€ã³ã¢ã»ã³ããªãã°ããŒãã«ã¢ã»ã³ããªãCã®åŒã³åºããªã©ïŒã
ç³ãèš³ãããŸããããã€ã³ãã«ã®çµã¿èŸŒã¿é¢æ°ãæå³ããããã«xsave
çµã¿èŸŒã¿é¢æ°ãäœæãããšã®ããšã§ããã ç§ã®ä»¥åã®ã³ã¡ã³ãã¯ããªãxsaves
ãæ¬è³ªçã§ãããšæãã®ãã«ã€ããŠãåœãŠã¯ãŸããŸãïŒIntelã®ã³ã³ãã€ã©ã©ã€ã¿ãŒã«ããäºæ
ãã誰ãããªã¢ã«ã¢ãŒãã§ãããæãã§ããããã§ããåè
ã¯ããã«æ°ä»ããšæããŸãããã¡ãŒã ãŠã§ã¢ã¯å¥åŠãªããšãããã®ã§ãåŸè
ã¯ç§ããŸã£ããé©ãããŸããïŒã
ãšã«ãããã¯ããç§ãã¡ã¯åºæ¬çã«åæãããšæããŸããçµã¿èŸŒã¿é¢æ°ã¯ãã¹ãŠã®å Žæã§ã¯ãªãã®ã§ãasmïŒïŒïŒãå®å®ããç¶æ ã«ç§»è¡ããããšãæãã§ããŸãã æšæ¥ãã£ããã£ãããã«ããã®åéã§é²æ©ãèŠãããŠããããšããšãŠãããããæããŸãã @ Florobããã£ãš
asm!
ã®ããã€ãã®è¿œå ã®è©³çŽ°ãšãŠãŒã¹ã±ãŒã¹ïŒ
ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ããã¡ãŒã ãŠã§ã¢ãç¹å®ã®çš®é¡ã®ã©ã€ãã©ãªããŸãã¯ç¹å®ã®ä»ã®çš®é¡ã®ã·ã¹ãã ã³ãŒããäœæããå Žåã¯ããã©ãããã©ãŒã ã¬ãã«ã®ã¢ã»ã³ããªãžã®ãã«ã¢ã¯ã»ã¹ãå¿ èŠã§ãã RustããµããŒããããã¹ãŠã®ã¢ãŒããã¯ãã£ã®ãã¹ãŠã®åœä»€ãå ¬éããçµã¿èŸŒã¿é¢æ°ããã£ããšããŠãïŒããã¯ãç§ãã¡ãæã£ãŠããããšã«è¿ã¥ãããšã¯ã§ããŸããïŒã人ã ãã€ã³ã©ã€ã³ã¢ã»ã³ããªã§å®æçã«åŒã£åŒµãã¹ã¿ã³ãã®ããã€ãã«ã¯ãŸã ååã§ã¯ãããŸããã
ã€ã³ã©ã€ã³ã¢ã»ã³ããªã§å®è¡ã§ããããšã®ãã¡ãä»ã®æ¹æ³ã§ã¯ç°¡åã«å®è¡ã§ããªãããšã®ããäžéšã次ã«ç€ºããŸãã ãããã®ãã¹ãŠã¯ãç§ãèŠãïŒãŸãã¯å Žåã«ãã£ãŠã¯æžãããïŒå®éã®äŸã§ããã仮説ã§ã¯ãããŸããã
+ 1e6
@eddyb
ããŠãç§ã¯æ¬è³ªçãªã¢ãããŒããè©ŠããŠããããã©ãã«è¡ãã®ããèŠãŠãããŸãã ããªãã¯ããããæ£ããã§ãããããããŠããã¯ç§ã®å Žåã®æè¯ã®ã¢ãããŒãã§ãã ããããšãããããŸããïŒ
@joshtriplettã¯ãããéä»ãã«ããŸããïŒ ãããã¯ç§ã念é ã«çœ®ããŠããæ£ç¢ºãªãŠãŒã¹ã±ãŒã¹ã§ãã
loop {
:thumbs_up:
}
ä»ã®ããã€ãã®ãŠãŒã¹ã±ãŒã¹ãè¿œå ããŸãã
@ mark-im絶察ã«ïŒ ãããŠãäž¡æ¹ã®ãªã¹ãã«ãµãã±ãŒã¹ããããã€ã³ããäžè¬åããïŒåŒã³åºãèŠçŽéã®å€æã
ç§ã¯ãã®åé¡ã«è³æããŠïŒ53118ãç· ãããããèšé²ã®ããã«ããã«PRãã³ããŒããŸãã ããã¯8æã®ãã®ã§ãããç°¡åã«èŠãŠã¿ããšãç¶æ³ã¯å€ãã£ãŠããªãããã§ãã
ã€ã³ã©ã€ã³ã¢ã»ã³ããªã®rustc
ãšäžè¬çãªrustèšèªã«é¢é£ä»ããããŠããããšãæå³ããŸãã ããã¥ã¡ã³ãå
šäœã®ã»ãšãã©ã¯ãllvmããŒã«ãã§ãŒã³ã䜿çšããx86 / x86_64ã¢ã»ã³ããªã«åºæã®ãã®ã§ãã æ確ã«ããããã«ãç§ã¯æããã«ãã©ãããã©ãŒã åºæã®ã¢ã»ã³ããªã³ãŒãèªäœãåç
§ããŠããã®ã§ã¯ãªããã€ã³ã©ã€ã³ã¢ã»ã³ããªã®äžè¬çãªã¢ãŒããã¯ãã£ãšäœ¿çšæ³å
šäœãåç
§ããŠããŸãã
ARMã¿ãŒã²ããã«é¢ããŠã¯ãã€ã³ã©ã€ã³ã¢ã»ã³ããªã®åäœã«é¢ããä¿¡é Œã§ããæ å ±æºã¯èŠã€ãããŸããã§ããããå®éšãšARM GCCã€ã³ã©ã€ã³ã¢ã»ã³ããªã®ããã¥ã¡ã³ããåç §ãããšã次ã®ç¹ãå®å šã«ãããŠããããã§ãã
intel
ãªãã·ã§ã³ã¯ç¡å¹ã§ãããã³ã³ãã€ã«æã«ãäžæãªãã£ã¬ã¯ãã£ãããšã©ãŒãçºçarm-none-eabi-*
ããŒã«ãã§ãŒã³ã䜿çšããŠthumbv7em-none-eabi
ã«å¯ŸããŠæ§ç¯ããå Žåãã€ã³ã©ã€ã³ã¢ã»ã³ããªã®åœ¢åŒã«é¢ããããã€ãã®åºæ¬çãªä»®å®ã§ããããã©ãããã©ãŒã åºæã§ããããã«èŠããŸããç¹ã«ã ARMã®å Žåãåºåã¬ãžã¹ã¿ïŒ2çªç®ã®ãã¯ãåŒæ°ïŒã¯ã¬ãžã¹ã¿åç
§ãšããŠã«ãŠã³ããããããã§ããã€ãŸããx86 llvmåœä»€ã®å Žåã®ããã«ã $0
ã¯æåã®å
¥åã¬ãžã¹ã¿ã§ã¯ãªããæåã®åºåã¬ãžã¹ã¿ãåç
§ããŸããasm("mov %[result],%[value],ror #1":[result] "=r" (y):[value] "r" (x));
ã¯ç¡å¹ã§ãïŒã$0
ãš$2
ã䜿çšãããšããããã®çªå·ãéžæãããçç±ã説æãããŠããªããããéåžžã«æ··ä¹±ããŸããïŒç§ãæãé©ãããã®ã¯ãç· ããããã®èšèã ãšæããŸãã
asmã®çŸåšã®å®è£ ïŒ ãã¯ãã¯LLVMã®ã€ã³ã©ã€ã³ã¢ã»ã³ãã©åŒã«çŽæ¥ãã€ã³ããããŠãããããã¯ããŒããŒãå¶çŽãªã©ã®è©³çŽ°ã«ã€ããŠã¯ãããã¥ã¡ã³ãã確èªããŠãã ããã
ããã¯æ®éçã«çå®ã§ã¯ãªãããã§ãã
ããã¥ã¡ã³ãã¯ãã€ã³ã©ã€ã³asmãå®éã®ãã©ãããã©ãŒã /ã³ã³ãã€ã©åºæã®æ§æã«ãã©ã³ã¹ãã€ã«ãããatïŒtæ§æãåããx86ã¬ãžã¹ã¿ã®ååãARMã¬ãžã¹ã¿ã®ã¿ã®ååã«çœ®ãæããå¿ èŠãããããšãæå³/æ瀺ããŠããããšãç解ããŸããã
intelãšatïŒtã®æ§æã®æŠå¿µã¯ãx86ã«ã®ã¿ååšããŸãïŒãã ããç§ãæ°ä»ããŠããªãä»ã®ã±ãŒã¹ããããããããŸããïŒã ããã¯ãåããã€ããªã³ãŒãã®ã»ãããè¡šãããã«ãåãããŒã¢ããã¯ã®ã»ãããå
±æãã2ã€ã®ç°ãªãèšèªã§ãããšããç¹ã§ç¬ç¹ã§ãã GNUãšã³ã·ã¹ãã ã¯ãx86ã®äžçã®äž»èŠãªããã©ã«ããšããŠatïŒtæ§æã確ç«ããŸãããããããã€ã³ã©ã€ã³asmã®ããã©ã«ãã§ããçç±ã§ãã LLVMã®ã€ã³ã©ã€ã³ã¢ã»ã³ãã©åŒã«çŽæ¥ãã€ã³ããããŠãããšããç¹ã§èª€è§£ãããŠããŸããLLVMã®ã€ã³ã©ã€ã³ã¢ã»ã³ãã©åŒã¯ãã»ãšãã©ã®å ŽåãïŒçœ®æãåŠçããåŸã®ïŒãã¬ãŒã³ããã¹ããããã¹ãã¢ã»ã³ããªããã°ã©ã ã«ãã³ãããã ãã§ãã ããã¯ãå®å
šã«ãã©ãããã©ãŒã åºæã§ãããx86ã®äžçãè¶
ããŠå®å
šã«ç¡æå³ã§ãããããä»æ¥ã®asm!()
åºæïŒãŸãã¯é¢é£æ§ããïŒã§ã¯ãããŸããã
é¢é£ããŠã
intel
ãªãã·ã§ã³ã¯ç¡å¹ã§ãããã³ã³ãã€ã«æã«ãäžæãªãã£ã¬ã¯ãã£ãããšã©ãŒãçºçããŸãã
ããã¯ãäžèšã§èª¬æããããã ã/åçŽãªå¹³æã®æ¿å
¥ã®çŽæ¥çãªçµæã§ãã ãšã©ãŒã¡ãã»ãŒãžã瀺ãããã«ã .intel_syntax
ãã£ã¬ã¯ãã£ãã¯ãµããŒããããŠããŸããã ããã¯ãGCCïŒattã¹ã¿ã€ã«ãåºåïŒã§Intelã¹ã¿ã€ã«ã®ã€ã³ã©ã€ã³asmã䜿çšããããã®å€ããŠããç¥ãããåé¿çã§ããã€ã³ã©ã€ã³asmãããã¯ã®å
é ã«.intel_syntax
ãšèšè¿°ããŠãããããã€ãã®Intel-ãèšè¿°ããŸãã asmã®ã¹ã¿ã€ã«ãèšå®ããæåŸã«.att_syntax
çµäºããŠãã¢ã»ã³ãã©ãattã¢ãŒãã«æ»ããïŒåŸç¶ã®ïŒã³ã³ãã€ã©ã§çæãããã³ãŒããããäžåºŠæ£ããåŠçã§ããããã«ããŸãã ããã¯æ±ãããã¯ã§ãããå°ãªããšãLLVMå®è£
ã«ã¯é·ãéå¥åŠãªçããã£ãããšãèŠããŠããã®ã§ãæçµçã«åé€ãããããããã®ãšã©ãŒã衚瀺ãããŠããããã§ãã æ®å¿µãªãããããã§ã®å¯äžã®æ£ããè¡åã¯ãrustcãã"intel"
ãªãã·ã§ã³ãåé€ããããšã§ãã
ã€ã³ã©ã€ã³ã¢ã»ã³ããªã®åœ¢åŒã«é¢ããããã€ãã®åºæ¬çãªä»®å®ã§ããããã©ãããã©ãŒã åºæã§ããããã«èŠããŸã
ããªãã®èŠ³å¯ã¯å®å šã«æ£ããã§ããåãã©ãããã©ãŒã ã¯ããèªèº«ã®ãã€ããªãã©ãŒããããšããèªèº«ã®ã¢ã»ã³ããªèšèªã®äž¡æ¹ãæ§æããŸãã ãããã¯å®å šã«ç¬ç«ããŠãããïŒã»ãšãã©ïŒã³ã³ãã€ã©ã«ãã£ãŠåŠçãããŸããããããrawã¢ã»ã³ãã©ã§ã®ããã°ã©ãã³ã°ã®èŠç¹ã§ãã
ã¬ãžã¹ã¿ãžã®ååä»ãåç §ã¯äœ¿çšã§ãããã€ã³ããã¯ã¹ã®ã¿ã䜿çšã§ããŸã
æ²ããããšã«ãrustcãå
¬éããLLVMã®ã€ã³ã©ã€ã³asmå®è£
ãšGCCïŒclangããšãã¥ã¬ãŒãããïŒã®å®è£
ã®éã«ã¯ããªã倧ããªäžäžèŽããããŸãã asm!()
ãã©ã®ããã«é²ãããã«ã€ããŠã®æ±ºå®ããªããã°ããããæ¹åããåæ©ã¯ã»ãšãã©ãããŸãããããã«ãç§ã¯ãã£ãšåã«äž»èŠãªãªãã·ã§ã³ã®æŠèŠã説æããŸãããããããã«ã¯ãã¹ãŠæãããªæ¬ ç¹ããããŸãã ããã¯åªå
äºé
ã§ã¯ãªãããã«æãããã®ã§ãå°ãªããšãæ°å¹Žéã¯ä»æ¥ã®asm!()
ã§ç«ã¡åŸçããã§ãããã é©åãªåé¿çããããŸãïŒ
build.rs
ããcc
ã¯ã¬ãŒããåŒã³åºããŠãCãªããžã§ã¯ããã€ã³ã©ã€ã³asmã«ãªã³ã¯ããŸãbuild.rs
ãã奜ããªã¢ã»ã³ãã©ãåŒã³åºãã ãã§ããCã³ã³ãã€ã©ã䜿çšããã®ã¯ããéãã«æãããããããŸãããã build.rs
ã·ã¹ãã ãšçµ±åããæéãçãããšãã§ããŸãããããã®åé¿çã¯ãéåžžã«ç¹æ®ãªãšããžã±ãŒã¹ã®ããäžéšãé€ããã¹ãŠã«é©çšãããŸãã ããªãããããã®1ã€ã«åœãã£ãå ŽåïŒå¹žããªããšã«ç§ã¯ãŸã ã§ãïŒãããªãã¯éãæªãã§ãã
ããã¥ã¡ã³ãã¯éåžžã«å
æ²¢ããªãããšã«åæããŸãããã€ã³ã©ã€ã³asmã«ç²ŸéããŠãã人ã«ã¯ååã§ãã ããã§ãªãå Žåã¯ãããããããã䜿çšããã¹ãã§ã¯ãããŸããã 誀解ããªãã§ãã ãã-ããªãã¯ééããªãèªç±ã«å®éšããŠåŠã¶ã¹ãã§ããã asm!()
ã¯äžå®å®ã§ç¡èŠãããŠãããæ¬åœã«è¯ãåé¿çãããã®ã§ãå¯èœãªéãæ·±å»ãªãããžã§ã¯ãã§äœ¿çšããªãããšã匷ããå§ãããŸãã
build.rsããcccrateãåŒã³åºããŠãCãªããžã§ã¯ããã€ã³ã©ã€ã³asmã«ãªã³ã¯ããŸã
build.rs
ããcc
ã¯ã¬ãŒããåŒã³åºããŠããã¬ãŒã³ãªã¢ã»ã³ããªãã¡ã€ã«ãäœæããããšãã§ããŸããããã«ãããæ倧éã®å¶åŸ¡ãå¯èœã«ãªããŸãã äžèšã®2ã€ã®ãåé¿çãããŠãŒã¹ã±ãŒã¹ã§æ©èœããªãå Žåã«åããŠããããæ£ç¢ºã«å®è¡ããããšã匷ããå§ãããŸãã
@ main--æžã蟌ã¿ïŒ
ãããã®åé¿çã¯ãéåžžã«ç¹æ®ãªãšããžã±ãŒã¹ã®ããäžéšãé€ããã¹ãŠã«é©çšãããŸãã ããªãããããã®1ã€ã«åœãã£ãå ŽåïŒå¹žããªããšã«ç§ã¯ãŸã ã§ãïŒãããªãã¯éãæªãã§ãã
ã€ãŸããå®å
šã«éãæªãããã§ã¯ãããŸããã Rustã®inline asm
ã䜿çšããå¿
èŠããããŸãã ãªã¹ããããŠããåé¿çã®ããããããã§ã«ããŒããŠããªããšãããšããžã±ãŒã¹ããããŸãã ããªããèšãããã«ãããªããä»ã®ã³ã³ãã€ã©ããã®ããã»ã¹ã«ç²ŸéããŠãããªããããã¯ã»ãšãã©åé¡ãããŸããã
ïŒå¥ã®ãŠãŒã¹ã±ãŒã¹ããããŸãããã€ãCã®ä»£ããã«Rustã䜿çšããŠã³ã³ãã¥ãŒã¿ãŒã¢ãŒããã¯ãã£ãªã©ãããã°ã©ãã³ã°ããã·ã¹ãã ãæããããšæããŸããã€ã³ã©ã€ã³ã¢ã»ã³ããªããªããšãããã¯ã¯ããã«åä»ã«ãªããŸããïŒ
Rustã§ã€ã³ã©ã€ã³ã¢ã»ã³ããªãåªå ããåŸã§ã§ã¯ãªãæ©ãå®å®ãããããšæããŸãã å€åããã¯Rust2019ã®ç®æšã«ãªãã¯ãã§ãã ç§ã¯ããªãã以åã«ããªãã®çŽ æµãªã³ã¡ã³ãã§ãªã¹ããã解決çã®ã©ãã§ã倧äžå€«ã§ãïŒç§ã¯ãããã®ã©ãã®åé¡ã§ãçããããšãã§ããŸããã ã¢ã»ã³ããªã³ãŒããã€ã³ã©ã€ã³åã§ããããšã¯ãç§ã«ãšã£ãŠãCã®ä»£ããã«Rustãã©ãã«ã§ãæžãããã®åææ¡ä»¶ã§ããç§ã¯ãããå®å®ããŠããå¿ èŠããããŸãã
Rustã§ã€ã³ã©ã€ã³ã¢ã»ã³ããªãåªå ããåŸã§ã§ã¯ãªãæ©ãå®å®ãããããšæããŸãã å€åããã¯Rust2019ã®ç®æšã«ãªãã¯ãã§ãã
Rust 2019ã®ããã°æçš¿ãæžããŠããã®æžå¿µãè¡šæããŠãã ããã ç§ãã¡ã®ååãªæ°ããããè¡ããªãã°ãç§ãã¡ã¯ããŒããããã«åœ±é¿ãäžããããšãã§ãããšæããŸãã
äžèšã®ç§ã®ã³ã¡ã³ããæ確ã«ããããã«-åé¡ã¯ãããã¥ã¡ã³ããasm!(..)
ãã¯ãã®å
容ãã©ã®ããã«ãæ·±ãã解æ/çžäºäœçšããããã説æããŠããªãããšã§ãã ç§ã¯x86ãšMIPS / ARMã¢ã»ã³ããªã«ç²ŸéããŠããŸãããllvmã«ã¯ç¬èªã®ã¢ã»ã³ããªèšèªåœ¢åŒããããšæããŸãã ç§ã¯ä»¥åã«x86ã®ã€ã³ã©ã€ã³ã¢ã»ã³ããªã䜿çšããŸããããasmããbrigeCããã³ASMãžã®ããã§ãªããã©ã®çšåºŠé²ãã ãã¯æ確ã§ã¯ãããŸããã§ããã rustã€ã³ã©ã€ã³ã¢ã»ã³ããªã»ã¯ã·ã§ã³ã®æèšã«åºã¥ãç§ã®æšå®ïŒçŸåšã¯ç¡å¹ïŒã¯ãLLVMã«ã¯atïŒtã¢ãŒããŸãã¯Intelã¢ãŒãã®ããããã§x86ã¢ã»ã³ããªãæš¡å£ããããã«æ§ç¯ãããç¬èªã®ASM圢åŒããããå¿
ç¶çã«ç€ºãããŠããx86ã®äŸã®ããã«èŠãããšãããã®ã§ããã
ïŒç§ãå©ããã®ã¯ãå±éããããã¯ãåºåãç 究ããããšã§ãããããã«ãããäœãèµ·ãã£ãŠããã®ããæããã«ãªããŸããïŒ
ãã®ããŒãžã®æœè±¡åãæžããå¿ èŠããããšæããŸãã LLVMã«ãã£ãŠè§£æããããã®ãšãASMãšããŠçŽæ¥è§£éããããã®ãæ確ã«ããŸãã ã©ã®éšåãéã«åºæã§ãããã©ã®éšåãå®è¡ããŠããããŒããŠã§ã¢ã«åºæã§ãããã©ã®éšåãããããäžç·ã«ä¿æããæ¥çå€ã«å±ããŠãããã
build.rs
ããcc
ã¯ã¬ãŒããåŒã³åºããŠãCãªããžã§ã¯ããã€ã³ã©ã€ã³asmã«ãªã³ã¯ããŸã
ã¯ãã¹ã©ã³ã²ãŒãžLTOã®æè¿ã®é²æ©ã«ããããã®ãå€éšã¢ã»ã³ããªãããããå¹æçã«ã€ã³ã©ã€ã³åããŠããã®ã¢ããã¥ãŒã®æ¬ ç¹ã®ããã€ããæžããããšãã§ãããã©ããçåã«æããŸãã ïŒããããããã§ã¯ãããŸããïŒ
build.rs
ããcc
ã¯ã¬ãŒããåŒã³åºããŠãCãªããžã§ã¯ããã€ã³ã©ã€ã³asmã«ãªã³ã¯ããŸãã¯ãã¹ã©ã³ã²ãŒãžLTOã®æè¿ã®é²æ©ã«ããããã®ãå€éšã¢ã»ã³ããªãããããå¹æçã«ã€ã³ã©ã€ã³åããŠããã®ã¢ããã¥ãŒã®æ¬ ç¹ã®ããã€ããæžããããšãã§ãããã©ããçåã«æããŸãã
ãããæ©èœããŠããã€ã³ã©ã€ã³ã¢ã»ã³ããªãCã§èšè¿°ããããããŸãããRustã§èšè¿°ããããšæããŸãã :-)
ã€ã³ã©ã€ã³ã¢ã»ã³ããªãCã§èšè¿°ããããããŸããã
.s
ãã¡ã€ã«ãš.S
ãã¡ã€ã«ãçŽæ¥ã³ã³ãã€ã«ããŠãªã³ã¯ããããšãã§ããŸãïŒããšãã°ããã®ã¯ã¬ãŒããåç
§ïŒãããã¯ãç§ã®æ¬ã§ã¯Cããååã«é¢ããŠããŸãã:)
ãã®éã®æ¬ ç¹ã®ããã€ããæžããããšãã§ããã°
ã¯ãã¹ã©ã³ã²ãŒãžLTOã¯LLVMIRã«äŸåããŠãããã¢ã»ã³ããªã§ã¯ãããçæãããªããããããã¯çŸåšå®çŸå¯èœã§ã¯ãªããšæããŸãã
ã¯ãã¹ã©ã³ã²ãŒãžLTOã¯LLVMIRã«äŸåããŠãããã¢ã»ã³ããªã§ã¯ãããçæãããªããããããã¯çŸåšå®çŸå¯èœã§ã¯ãªããšæããŸãã
ã¢ã»ã³ããªãLLVMIRã¢ãžã¥ãŒã«ã®ã¢ãžã¥ãŒã«ã¬ãã«ã®ã¢ã»ã³ããªã«è©°ã蟌ãããšãã§ããŸãã
ææ°ã®ææ¡/çŸåšã®ç¶æ³ãç¥ã£ãŠãã人ã¯ããŸããïŒ ä»å¹Žã®ããŒãã¯ãå§ãããã®ã®æçãšä»äžãã asm
ããããã
æ°ããïŒå®å®åãããïŒæ§æã®æŒ ç¶ãšããèšç»ãæšå¹Ž2æã«è°è«ãããŸããïŒ https ïŒ
ãããã®ã¡ã¢ã«ãããšã @ joshtriplettãš@Amanieuã¯RFCãæžãããã«ãµã€ã³ã¢ããããŸããã
æ°ããæ§æã®ã¹ããŒã¿ã¹ã¯ã©ããªã£ãŠããŸããïŒ
ããã¯RFCãããæ¯æ©å®è£ ãããå¿ èŠããããŸã
ping @joshtriplett @Amanieuããã§ç©äºãé²ããã®ãæäŒã£ãŠããããã©ããæããŠãã ããïŒ éããªããé£çµ¡ããããŸãã
@cramertj AFAICT誰ã§ããããåé²ãããããšãã§ããŸããããã¯ãããã¯ãããŠä»å ¥ããŠäœæ¥ãéå§ããã®ãåŸ ã£ãŠããŸãã å šäœçãªèšèšãã¹ã±ããããpre-RFCãããã次ã®ã¹ãããã¯ãããå®è£ ãããããprocãã¯ãããã©ãŒã¯ããŸãã¯å¥ã®äžå®å®ãªæ©èœãšããŠå®éã«æ©èœãããã©ããã確èªããããšã§ãã
ããããããã®pre-RFCãé©åãªRFCã«å€æããŠéä¿¡ããããšããããšãã§ããŸãããå®è£ ããªããã°ããã®ãããªRFCã説åŸåããããšã¯æããŸããã
ç·šéïŒæ確ã«ããããã«ãç§ã¯å ·äœçã«ãã®ãããªpre-RFCã®äžéšãæå³ããããšãçŽåŸãããããšã«ãã£ãŠïŒ
ããã«ãã¬ãžã¹ã¿ã¯ã©ã¹ã®ãããã³ã°ãå¿ èŠã«å¿ããŠè¿œå ãããŸãïŒllvm-constraint 6ãåç §ïŒã
lang-refã«ã¯æ°åã®archåºæã®ã¬ãžã¹ã¿ã¯ã©ã¹ããããŸãã RFCã¯ããããã¹ãŠãåçŽã«æé€ããããšã¯ã§ããããããããã¹ãŠæ³å®ã©ããã«æ©èœããããæå³ããããããŸãã¯ããããå ¬éã§ããããã«LLVMã§ååã«ãå®å®ãããŠããããšãªã©ã確èªããããšã§ãå®è£ ã®ã¡ãªãããåŸãããŸããããããè©ŠããŠã¿ãŠãã ããã
RISC-Vã€ã³ã©ã€ã³ã¢ã»ã³ããªã¯ããã§#![feature(asm)]
ãµããŒããããŠããŸããïŒ
ç§ã®ç¥ãéãããµããŒããããŠãããã©ââãããã©ãŒã ã§ã®ãã¹ãŠã®ã¢ã»ã³ããªããµããŒããããŠããŸãã ããã¯ãllvmã³ã³ãã€ã©ã®asmãµããŒããžã®ã»ãŒçã®ã¢ã¯ã»ã¹ã§ãã
ã¯ããRISC-VããµããŒããããŠããŸãã ã¢ãŒããã¯ãã£åºæã®å ¥å/åºå/ã¯ããŒããŒå¶çŽã¯ã©ã¹ã¯ãLLVMlangrefã«ææžåãã
ãã ãã泚æç¹ããããŸããå ¥å/åºå/ã¯ããŒããŒå¶çŽã§åã ã®ã¬ãžã¹ã¿ã«å¶çŽããå¿ èŠãããå Žåã¯ãABIåã§ã¯ãªããã¢ãŒããã¯ãã£ã¬ãžã¹ã¿åïŒx0-x31ãf0-f31ïŒã䜿çšããå¿ èŠããããŸãã ã¢ã»ã³ããªãã©ã°ã¡ã³ãèªäœã§ã¯ãã©ã¡ãã®çš®é¡ã®ã¬ãžã¹ã¿åã䜿çšã§ããŸãã
ãããã®æŠå¿µã«äžæ £ããªäººãšããŠãç§ã¯ãã èšãããšãã§ããŸã...ãã®å šäœã®è°è«ã¯_ã°ãããŠãã_ããã§ãã ãã·ã³ã³ãŒããšã®1察1ã®ãããã³ã°ã§ããã¯ãã®èšèªïŒã¢ã»ã³ããªïŒãããã»ã©ã®é çã®çš®ã«ãªãã®ã¯ã©ãããŠã§ããïŒ
ç§ã¯ããªãæ··ä¹±ããŠããŸãïŒ
#[cfg(...)]
人éãïŒæžãçŽãå¿
èŠã¯ãããŸãããïŒäžäœäºææ§ãåé¡ã«ãªããšæããŸããããã°ã®æ°ãéåžžã«å€ãããããå®å®ããªãã£ããšããäºå®ããããããããã¯ãšã³ãã«æž¡ãæ¹ããããããããŸããã Rustã¯ãLLVMãgccããŸãã¯ä»ã®èª°ãã®å¥åŠãªæ§æã®ééããä¿®æ£ããããšããããžãã¹ã«åŸäºããã¹ãã§ã¯ãããŸããã Rustã¯ã察象ãšãªãã¢ãŒããã¯ãã£ãšã³ã³ãã€ã©ã®ãã·ã³ã³ãŒããçºè¡ããããžãã¹ãè¡ã£ãŠããŸã...ãããŠasmã¯ãã§ã«åºæ¬çã«ãã®ã³ãŒãã§ãïŒ
ããã§é²å±ããªãçç±ã¯ã誰ããã®åé¡ã®ä¿®æ£ã«æéãè²»ãããŠããªãããã§ãã ããã¯ãæ©èœãå®å®ãããããã®é©åãªçç±ã§ã¯ãããŸããã
ãã®ã¹ã¬ãããèªãã§ããéãç§ã¯ã¢ã€ãã¢ãæãã€ãããããæçš¿ããªããã°ãªããŸããã§ããã å€ãæçš¿ã«åçããŠããå Žåã¯ç³ãèš³ãããŸããããããã ãã®äŸ¡å€ããããšæããŸããã
@ main--èšã£ãïŒ
ã©ã¡ãã®æé©åã確ãã«ïŒç¹ã«ãã€ããŒã¹ã¬ããã£ã³ã°ã«çŽé¢ããŠïŒããè¯ãã¹ã«ãŒãããããããããŸãããç§ãéæããããšæã£ãŠããã¬ã€ãã³ã·ãŒã®åæžã¯ãããŸããã ç§ã¯ãã®å®éšã®ããã«nasmãŸã§ãã£ãšããããããŠã³ããããšã«ãªããŸããããã³ãŒããçµã¿èŸŒã¿é¢æ°ãããã¬ãŒã³asmã«æžãçŽããªããã°ãªããªãã®ã¯äžå¿ èŠãªæ©æŠã§ããã ãã¡ãããé«ã¬ãã«ã®ãã¯ãã«APIã䜿çšããå Žåã¯ããªããã£ãã€ã¶ãŒã§åœä»€ã®éžæãå®æ°ç³ã¿èŸŒã¿ãªã©ãåŠçããå¿ èŠããããŸãã ããããã©ã®åœä»€ã䜿çšããããæ瀺çã«æ±ºå®ãããšããã³ã³ãã€ã©ãŒããããããããããªãã®ã§ãã å¯äžã®éžæè¢ã¯ã€ã³ã©ã€ã³asmã§ãã
ã€ã³ã©ã€ã³asmã®ä»£ããã«ãããã§æ¬åœã«å¿ èŠãªã®ã¯ããªããã£ãã€ã¶ãŒã«ãã¹ã«ãŒãããçšã«ãããæé©åãããããã¬ã€ãã³ã·ãŒçšã«ãããæé©åããããããã€ããªãµã€ãºçšã«ãããæé©åããããšããLLVMã®é¢æ°å±æ§ã§ãã ãã®ãœãªã¥ãŒã·ã§ã³ãã¢ããã¹ããªãŒã ã§ããããšã¯ããã£ãŠããŸãããç¹å®ã®åé¡ãèªåçã«è§£æ±ºããã ãã§ãªãïŒã¬ã€ãã³ã·ãŒãäœãããã ãã§ãªããã¢ã«ãŽãªãºã ã®å圢å®è£ ãæäŸããããšã§ïŒãRustããã°ã©ããŒãããã©ãŒãã³ã¹ç¹æ§ããããã现ããå¶åŸ¡ã§ããããã«ãªããŸããããã¯åœŒãã«ãšã£ãŠéèŠã§ãã
@ felix91grããã¯ãå²ã蟌ã¿ãã³ãã©ãªã©ãåœä»€ã®æ£ç¢ºãªã·ãŒã±ã³ã¹ãçºè¡ããå¿ èŠããããŠãŒã¹ã±ãŒã¹ã解決ããŸããã
@ mark-imã¯ãã¡ããéããŸãã ã ããç§ã¯æåéãã®åŒçšãããŸããïŒ ð
ç§ã®ãã€ã³ãã¯ãã€ã³ã©ã€ã³asmæ©èœã䜿çšããŠããã³ã³ãã€ã©ãŒãå¿ èŠãªãã®ãšã¯éã®æ¹æ³ã§æé©åãããïŒãã®å Žåã¯å€å žçã§ãïŒã¬ã€ãã³ã·ãŒãšã¹ã«ãŒãããïŒã解決ã§ãããšããŠããããããïŒãããŠééããªãïŒãã®ãŠãŒã¹ã±ãŒã¹ã¯æé©åããããã现ããå¶åŸ¡ããããšã§ãããé©åã«æ©èœããŸã:)
ã€ã³ã©ã€ã³ã¢ã»ã³ããªã®ä»åŸã®å€æŽã«ç §ãããŠããã®åé¡ã®ã»ãšãã©ã®è°è«ã¯ãã¯ãé¢é£æ§ããããŸããã ãã®ããããã®åé¡ãéããŠãã€ã³ã©ã€ã³ã¢ã»ã³ããªã®ãã¬ãŒããŒããšã«2ã€ã®åå¥ã®è¿œè·¡åé¡ãäœæããŸãã
llvm_asm
ïŒïŒ70173asm!
ïŒïŒ72016
æãåèã«ãªãã³ã¡ã³ã
LLVMã®ã€ã³ã©ã€ã³asmæ§æã¯ãclang / gccã§äœ¿çšãããæ§æãšã¯ç°ãªãããšãææããŠãããŸãã éãã¯æ¬¡ã®ãšããã§ãã
$0
ã®ä»£ããã«%0
ã%[name]
ãµããŒãããŠããŸããã"a"
ã§ã¯ãªã"{eax}"
ã§ãã"{r11}"
ïŒããµããŒãããŸãã Cã§ã¯ã代ããã«ã¬ãžã¹ã¿asmå€æ°ã䜿çšããŠãå€ãã¬ãžã¹ã¿ïŒregister asm("r11") int x
ïŒã«ãã€ã³ãããå¿ èŠããããŸãã"m"
ãš"=m"
å¶çŽã¯åºæ¬çã«å£ããŠããŸãã Clangã¯ãããããéæ¥ã¡ã¢ãªå¶çŽ"*m"
ãš"=*m"
ã«å€æããå€æ°èªäœã§ã¯ãªããå€æ°ã®ã¢ãã¬ã¹ãLLVMã«æž¡ããŸããClangã¯ãã€ã³ã©ã€ã³asmãgcc圢åŒããLLVM圢åŒã«å€æããŠãããLLVMã«æž¡ããŸãã ãŸããå¶çŽã®æ€èšŒãå®è¡ããŸããããšãã°ã
"i"
ãªãã©ã³ããã³ã³ãã€ã«æå®æ°ã§ããããšã確èªããŸããããã«ç §ãããŠãclangãšåãå€æãšæ€èšŒãå®è£ ããå¥åŠãªLLVMæ§æã§ã¯ãªãé©åãªgccã€ã³ã©ã€ã³asmæ§æããµããŒãããå¿ èŠããããšæããŸãã