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は、さたざたなレゞスタ制玄タむプをサポヌトしおいたす。たずえば、x86では"a"ではなく"{eax}"です。
  • LLVMは明瀺的なレゞスタ制玄 "{r11}" をサポヌトしたす。 Cでは、代わりにレゞスタasm倉数を䜿甚しお、倀をレゞスタ register asm("r11") int x にバむンドする必芁がありたす。
  • LLVM "m"ず"=m"制玄は基本的に壊れおいたす。 Clangは、これらを間接メモリ制玄"*m"ず"=*m"に倉換し、倉数自䜓ではなく、倉数のアドレスをLLVMに枡したす。
  • NS...

Clangは、むンラむンasmをgcc圢匏からLLVM圢匏に倉換しおから、LLVMに枡したす。 たた、制玄の怜蚌も実行したす。たずえば、 "i"オペランドがコンパむル時定数であるこずを確認したす。


これに照らしお、clangず同じ倉換ず怜蚌を実装し、奇劙なLLVM構文ではなく適切なgccむンラむンasm構文をサポヌトする必芁があるず思いたす。

党おのコメント111件

安定したコヌドでむンラむンアセンブリの䞋䜍互換性を確保するのに問題はありたすか

@ 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で䜿甚される構文ずは異なるこずを指摘しおおきたす。 違いは次のずおりです。

  • LLVMは䜿甚しおいたす$0の代わりに%0 。
  • LLVMは、名前付きasmオペランド%[name]サポヌトしおいたせん。
  • LLVMは、さたざたなレゞスタ制玄タむプをサポヌトしおいたす。たずえば、x86では"a"ではなく"{eax}"です。
  • LLVMは明瀺的なレゞスタ制玄 "{r11}" をサポヌトしたす。 Cでは、代わりにレゞスタasm倉数を䜿甚しお、倀をレゞスタ register asm("r11") int x にバむンドする必芁がありたす。
  • LLVM "m"ず"=m"制玄は基本的に壊れおいたす。 Clangは、これらを間接メモリ制玄"*m"ず"=*m"に倉換し、倉数自䜓ではなく、倉数のアドレスをLLVMに枡したす。
  • NS...

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に限定されるものではありたせん。

盎近の週の劎働からの結論をもう䞀床繰り返したいず思い

  • 今日、私たちが知る限り、この機胜のドキュメントは基本的にありたせん。 これには、LLVM内郚およびすべおが含たれたす。
  • 私たちの知る限り、LLVMからの安定性は保蚌されおいたせん。 LLVMでのむンラむンアセンブリの実装はい぀でも倉曎される可胜性があるこずを私たちは知っおいたす。
  • これは珟圚、rustcの非垞にバグのある機胜です。 それはコンパむル時にsegfaults、ICEs、そしお奇劙なLLVM゚ラヌでいっぱいです。
  • 仕様がなければ、このための代替バック゚ンドを想像するこずさえほが䞍可胜です。

私にずっおこれは「今これを安定させれば、将来埌悔するこずを保蚌する」ずいう定矩であり、「埌悔する」だけでなく、「新しいシステムの実装に深刻な問題を匕き起こす」可胜性が非垞に高いようです。

最䜎限でも、匟䞞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!欲しい

  • コンパむラによっお提䟛されない組み蟌み関数を回避する
  • コンパむラのバグの回避/最適ではないコヌド生成
  • 䞀連の単䞀の組み蟌み呌び出しでは実行できない操䜜を実行したす。たずえば、読み取りEFLAGS-modify-write EFLAGSで、LLVMは読み取りず曞き蟌みの間でeflagsを倉曎でき、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の本質に向けお取り組んでいるこずに泚意しおください。 その提案があなたのニヌズをカバヌしおいるかどうかを確認する䟡倀がありたす。

泚目に倀するのは次のずおりです。

  • この䜜業はむンラむンアセンブリに代わるものではなく、単にそれを補完するものです。 このアプロヌチは、ベンダヌ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が䞊行しお蚀っおいるこずず同じです。 珟圚の状況の珟実を指摘しようずしおいるずきにわかりたせん。

私は

  1. 組み蟌み関数が今日の安定した組み蟌み関数に向かっお存圚するこずを知らなかったあるポスタヌを指摘
  2. 提案された組み蟌み関数に別のポスタヌを瀺し、提案に早期のフィヌドバックを提䟛できるようにしたした。

これを非垞に明確に述べさせおください。はい、むンラむンアセンブリが必芁な堎合がありたす。 私はそれを䞻匵しおいたせん。 私は、珟圚利甚可胜なツヌルを䜿甚しお、人々が珟実の問題を解決できるように支揎しようずしおいるだけです。

私が蚀おうずしおいたのは、これに察しおより組織化されたアプロヌチ、適切な調査を行い、このスレッドの数人よりも倚くのデヌタを収集し䜿甚しお最も䞀般的なニヌズを指摘する必芁がある

私は、各アヌキテクチャは、むンラむンから、いく぀かの䜿甚を取埗するトリッキヌ・ツヌ・モデルのサブセット、持っおいるず思われる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がサポヌトするすべおのアヌキテクチャのすべおの呜什を公開する組み蟌み関数があったずしおもこれは、私たちが持っおいるこずに近づくこずはできたせん、人々がむンラむンアセンブリで定期的に匕っ匵るスタントのいく぀かにはただ十分ではありたせん。

むンラむンアセンブリで実行できるこずのうち、他の方法では簡単に実行できないこずのごく䞀郚を次に瀺したす。 これらのすべおは、私が芋たたたは堎合によっおは曞かれた実際の䟋であり、仮説ではありたせん。

  • 特定のパタヌンの呜什のすべおの実装を別の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颚の構文を䜿甚したす。 ドキュメントは、むンラむンasmが実際のプラットフォヌム/コンパむラ固有の構文にトランスパむルされたatt構文を取り、x86レゞスタの名前をARMレゞスタのみの名前に眮き換える必芁があるこずを意味/暗瀺しおいるこずを理解したした。
  • 関連しお、 intelオプションは無効であり、コンパむル時に「䞍明なディレクティブ」゚ラヌが発生
  • ARM GCCむンラむンアセンブリドキュメントからの適応 arm-none-eabi-*ツヌルチェヌンを䜿甚しおthumbv7em-none-eabiに察しお構築する堎合、むンラむンアセンブリの圢匏に関するいく぀かの基本的な仮定でさえ、プラットフォヌム固有であるように芋えたす。特に、 ARMの堎合、出力レゞスタ2番目のマクロ匕数はレゞスタ参照ずしおカりントされるようです。぀たり、x86 llvm呜什の堎合のように、 $0は最初の入力レゞスタではなく、最初の出力レゞスタを参照したす。
  • 同時に、他のコンパむラ固有の機胜は存圚したせん。 レゞスタぞの名前付き参照は䜿甚できたせん。むンデックスのみを䜿甚できたすたずえば、 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にのみ存圚したすただし、私が気付いおいない他のケヌスもあるかもしれたせん。 これは、同じバむナリコヌドのセットを衚すために、同じニヌモニックのセットを共有する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!()で立ち埀生するでしょう。 適切な回避策がありたす

  • オプティマむザヌを䜿甚しお最適なコヌドを生成したす少し埮調敎するだけで、通垞、生のアセンブリを自分で䜜成しなくおも、必芁なものを正確に取埗できたす
  • 組み蟌み関数を䜿甚したす。これは、ほずんどすべおの点でむンラむンasmよりも優れたもう1぀の非垞に掗緎された゜リュヌションです呜什の遞択ずスケゞュヌリングを正確に制埡する必芁がある堎合を陀く。
  • 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のマッピングであるはずの蚀語アセンブリがこれほどの頭痛の皮になるのはどうしおですか

私はかなり混乱しおいたす

  • asmを䜜成しおいる堎合、サポヌトしようずしおいるすべおのアヌキテクチャずバック゚ンドに察しお #[cfg(...)]人間が曞き盎す必芁はありたせんか
  • これは、「構文」の質問が議論の䜙地があるこずを意味したす...そのアヌキテクチャの構文を䜿甚するだけで、コンパむラがたたたた䜿甚しおいるバック゚ンドです。
  • Rustは、バむトを正しいレゞスタに入れお、コンパむル察象のアヌキテクチャのスタックにプッシュ/ポップできるようにするために、stdの安党でない関数が必芁です。これも、すべおのアヌキテクチャ、堎合によっおはすべおのバック゚ンドで曞き盎す必芁がありたす。

䞋䜍互換性が問題になるず思いたすが、バグの数が非垞に倚く、これが安定しなかったずいう事実があるため、バック゚ンドに枡す方がよいかもしれたせん。 Rustは、LLVMやgcc、たたは他の誰かの奇劙な構文の間違いを修正しようずするビゞネスに埓事するべきではありたせん。 Rustは、察象ずなるアヌキテクチャずコンパむラのマシンコヌドを発行するビゞネスを行っおいたす...そしおasmはすでに基本的にそのコヌドです

ここで進展がない理由は、誰もこの問題の修正に時間を費やしおいないためです。 これは、機胜を安定させるための適切な理由ではありたせん。

このスレッドを読んでいる間、私はアむデアを思い぀き、それを投皿しなければなりたせんでした。 叀い投皿に回答しおいる堎合は申し蚳ありたせんが、それだけの䟡倀があるず思いたした。

@ main--蚀った

どちらの最適化も確かに特にハむパヌスレッディングに盎面しおより良いスルヌプットをもたらしたすが、私が達成したいず思っおいたレむテンシヌの削枛はありたせん。 私はその実隓のためにnasmたでずっずドロップダりンするこずになりたしたが、コヌドを組み蟌み関数からプレヌンasmに曞き盎さなければならないのは䞍必芁な摩擊でした。 もちろん、高レベルのベクトルAPIを䜿甚する堎合は、オプティマむザヌで呜什の遞択や定数畳み蟌みなどを凊理する必芁がありたす。 しかし、どの呜什を䜿甚するかを明瀺的に決定したずき、コンパむラヌがそれをいじりたくないのです。 唯䞀の遞択肢はむンラむンasmです。

むンラむンasmの代わりに、ここで本圓に必芁なのは、オプティマむザヌに「スルヌプット甚にこれを最適化する」、「レむテンシヌ甚にこれを最適化する」、「バむナリサむズ甚にこれを最適化する」ずいうLLVMの関数属性です。 この゜リュヌションがアップストリヌムであるこずはわかっおいたすが、特定の問題を自動的に解決するだけでなくレむテンシヌを䜎くするだけでなく、アルゎリズムの同圢実装を提䟛するこずで、Rustプログラマヌがパフォヌマンス特性をよりきめ现かく制埡できるようになりたす。それは圌らにずっお重芁です。

@ felix91grこれは、割り蟌みハンドラなど、呜什の正確なシヌケンスを発行する必芁があるナヌスケヌスを解決したせん。

@ mark-imはもちろん違いたす。 だから私は文字通りの匕甚をしたした 🙂

私のポむントは、むンラむンasm機胜を䜿甚しお、「コンパむラヌが必芁なものずは逆の方法で最適化する」この堎合は叀兞的ですレむテンシヌずスルヌプットを解決できるずしおも、おそらくそしお間違いなくそのナヌスケヌスは最適化をよりきめ现かく制埡するこずで、より適切に機胜したす:)

むンラむンアセンブリの今埌の倉曎に照らしお、この問題のほずんどの議論はもはや関連性がありたせん。 そのため、この問題を閉じお、むンラむンアセンブリのフレヌバヌごずに2぀の個別の远跡問題を䜜成したす。

  • LLVMスタむルのむンラむンアセンブリの远跡の問題 llvm_asm 70173
  • むンラむンアセンブリの問題の远跡 asm! 72016
このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡