配列のgccインラインasm入力および出力パラメーター?

2
Warp 2019-10-21 09:51.

gccスタイルのインラインasmを作成するときは、すべての入力パラメーターと出力パラメーター(およびクローバー)について非常に具体的かつ正確である必要があることを理解しています。これにより、コンパイラーはコードにレジスターを割り当てる方法とその機能を正確に知ることができます。これらのレジスタの値と、asmコードが読み取ったり変更したりする可能性のあるメモリについて想定します。コンパイラーはこの情報を使用して、周囲のコードを可能な限り最適化します(さらに、何にも影響がないと判断した場合は、インラインasmを完全に削除します)。これについて十分に具体的にしないと、コンパイラが誤った仕様に基づいて仮定を行っているため、誤った動作が発生する可能性があります。

配列に関して、自分のasmが何を読み書きしているのかを正確に指定する必要があるかどうかは少しわかりません。配列全体を読み取ったり書き込んだりしていることをコンパイラーに通知しないと、誤った仮定を行い、誤った動作を引き起こすようにコードを最適化する可能性があります。

unsigned intサイズが2つの配列、Nたとえばarray1array2、であり、asmコードが両方の配列を読み取り、新しいデータをに書き込むと仮定しarray1ます。これはコンパイラにこれを伝える正しい方法ですか?

asm("some asm here using %[array1] and %[array2]"
    : "+m"(*(unsigned(*)[N])array1)
    : [array1]"r"(array1), [array2]"r"(array2),
      "m"(*(unsigned(*)[N])array1),
      "m"(*(unsigned(*)[N])array2)
    : /* possible clobbers, like "cc" */);

これにより、少なくとも現在のコードは機能しますが、これが正確に実行されるべき方法であるかどうかは100%わかりません。(コンパイラーは、これらのパラメーターが実際にasmコード文字列で使用されている場合にのみ、入力パラメーターと出力パラメーターにレジスターを割り当てますか?言い換えると、コンパイラーに全体を読み書きしていることを通知するためだけに存在する追加の入力と出力は、コンパイラにレジスタなどを不必要に割り当てさせますか?)

gcc自身のドキュメントでは、出力配列の構文について言及していますが、入力配列については言及していないようです。そのため、ここでは大げさな推測をしています。

1 answers

1
Peter Cordes 2019-10-21 10:13.

はい、同じ配列の入力を冗長に"+m"することを除いて、私には正しく見え"m"ます。ちょうど使用"+m"読み取り/書き込みアレイ用および"m"読み取り専用の配列のため。しかし、あなたがしているのと同じキャストからアレイへ。

"=m"理論的には、入力オペランドと出力オペランドを別々にすると、asmをコピーアンドオペレートとして使用できることがコンパイラに通知されます(したがって、入力の読み取りと出力の書き込みに異なるポインタを使用することが真実でない限り、そうしないでください)。スカラーとは異なり、GCCが配列の新しいコピーを発明するとは思いません。ただし"+m"、コンパイラにそのオプションがないように、インプレースで変更することを意味します。


インラインASM引数によって*ポイントされた*メモリが使用される可能性があることをどのように示すことができますか?を参照してください(この質問はそれとほぼ同じです)。任意の長さの*(const char (*)[])入力を使用した入力配列の例を示しています。実際には[N]、コンパイル時定数でない場合は無視される(無制限として扱われる)ように見えます。これは、オブジェクト全体にアクセスできることを意味します。たとえばarr[N+1]、Gcc(int (*)[N])は、Nがコンパイル時定数でない限り、を使用してストアを最適化したり、asmステートメントの前後に並べ替えたりしません。

また、入力が単なるポインタではなく、本当にC配列である場合は、キャストする必要がないことにも注意してください。入力、全体の配列を意味し、メモリ内のポインタに減衰しません。int arr[1024]"m"(arr)


(コンパイラは、入力パラメータと出力パラメータが実際にasmコード文字列で使用されている場合にのみ、それらのパラメータにレジスタを割り当てますか?

いいえ、オペランドのレジスタ割り当ては、実際にテンプレートに入力されているかどうかとは異なります。

GCCは"a"%%rax(の代わりに%0)使用できる"r"入力と、テンプレートが使用する%0必要がある入力、または%[name]コンパイラが何を選択するかがわからないために、入力を区別する必要はありません。


gcc自身のドキュメントでは、出力配列の構文について言及していますが、入力配列については言及していないようです。そのため、ここでは大げさな推測をしています。

それは同じです、そしてはい、それは必要です。

配列(または"memory"クローバー)をカバーする適切なダミー入力がないと、asmステートメントを使用してデッドストアを削除したり、ストアを並べ替えたりすることができます。(たとえばfoo[2] = 1; asm(); foo[2] = 3;、最初のストアを後で移動したり、2番目のストアを前に移動したりして、1つだけ実行できます。

Related questions

MORE COOL STUFF

ケイト・ブランシェットは3日間一緒に夫と一緒に寝て、25年経ってもまだ夫と結婚しています

ケイト・ブランシェットは3日間一緒に夫と一緒に寝て、25年経ってもまだ夫と結婚しています

ケイト・ブランシェットは、夫に会ったとき、典型的な交際のアドバイスに逆らいました。

マイケルシーンが非営利の俳優である理由

マイケルシーンが非営利の俳優である理由

マイケルシーンは非営利の俳優ですが、それは正確にはどういう意味ですか?

ホールマークスターのコリンエッグレスフィールドがRomaDramaLiveでスリル満点のファンと出会う![エクスクルーシブ]

ホールマークスターのコリンエッグレスフィールドがRomaDramaLiveでスリル満点のファンと出会う![エクスクルーシブ]

特徴的なスターのコリン・エッグレスフィールドは、RomaDrama Liveでのスリル満点のファンとの出会いについて料理しました!加えて、大会での彼のINSPIREプログラム。

「たどりつけば」をオンラインでストリーミングできない理由

「たどりつけば」をオンラインでストリーミングできない理由

ノーザンエクスポージャーが90年代の最も人気のある番組の1つになった理由を確認するには、Blu-rayまたはDVDプレーヤーをほこりで払う必要があります。

Where in the World Are You? Take our GeoGuesser Quiz

Where in the World Are You? Take our GeoGuesser Quiz

The world is a huge place, yet some GeoGuessr players know locations in mere seconds. Are you one of GeoGuessr's gifted elite? Take our quiz to find out!

バイオニック読書はあなたをより速く読むことができますか?

バイオニック読書はあなたをより速く読むことができますか?

BionicReadingアプリの人気が爆発的に高まっています。しかし、それは本当にあなたを速読術にすることができますか?

ドミニカのボイリング湖:アクセスは簡単ではありませんが、ハイキングする価値があります

ドミニカのボイリング湖:アクセスは簡単ではありませんが、ハイキングする価値があります

ドミニカのボイリング湖は、世界で2番目に大きいボイリング湖です。そこにたどり着くまでのトレッキングは大変で長いですが、努力する価値は十分にあります。

私たちの水をきれいに保つのを助けるためにあなたの髪を寄付してください

私たちの水をきれいに保つのを助けるためにあなたの髪を寄付してください

サロンからのヘアトリミングや個人的な寄付は、油流出を吸収して環境を保護するのに役立つマットとして再利用できます。

グアンタナモ湾で唯一のイスラム教徒の軍曹としてラマダンを祝うのはどのようなものですか

グアンタナモ湾で唯一のイスラム教徒の軍曹としてラマダンを祝うのはどのようなものですか

この画像は法的な理由で削除されました。グアンタナモ湾の116人のイスラム教徒の囚人が断食をし、金曜日の夜にラマダンの30日間を終えたとき、彼らは1か月の夜間の祈りと強制給餌を日没まで延期しました。

木曜日のお得な情報:スタンディングデスク、ロボット掃除機、ライトニングケーブルなど

木曜日のお得な情報:スタンディングデスク、ロボット掃除機、ライトニングケーブルなど

2つのスタンディングデスク、新しいロボット掃除機、6フィートの稲妻ケーブル、その他多くの今日のお得な情報を大幅に節約できます。Kinjaディールをブックマークして、TwitterやFacebookでフォローしたり、Kinjaディールコミュニティグループに参加したり、ニュースレターに登録して、ディールを見逃さないようにしてください。

次の大きな日食は1年先ですが、人々はすでにパーティーを計画しています

次の大きな日食は1年先ですが、人々はすでにパーティーを計画しています

写真提供者:APこれだけの計画で、アメリカ人は結婚式をまとめていると思うでしょうが、実際にはもっと大きなもののためです。

70年以上にわたる世界の核兵器の興亡

70年以上にわたる世界の核兵器の興亡

1987年以来、原子力科学者会報は、各国の核兵器を核ノートに数え、これらの数をしばしば取り巻く秘密のベールを剥がしてきました。Bulletinは廃止され、NuclearNotebookがすっきりとしたインタラクティブなグラフィックになりました。

Plathville の Kim と Olivia Plath が数年ぶりに言葉を交わすことへようこそ

Plathville の Kim と Olivia Plath が数年ぶりに言葉を交わすことへようこそ

イーサン プラスの誕生日のお祝いは、TLC のウェルカム トゥ プラスビルのシーズン 4 のフィナーレで、戦争中の母親のキム プラスと妻のオリビア プラスを結びつけました。

Nicky Hilton Forced to Borrow Paris' 'I Love Paris' Sweatshirt After 'Airline Loses All [My] Luggage'

Nicky Hilton Forced to Borrow Paris' 'I Love Paris' Sweatshirt After 'Airline Loses All [My] Luggage'

Nicky Hilton Rothschild's luggage got lost, but luckily she has an incredible closet to shop: Sister Paris Hilton's!

ケイト・ミドルトンはロンドンの水辺で一日を過ごし、さらにジェニファー・ロペス、ジュリアン・ハフなど

ケイト・ミドルトンはロンドンの水辺で一日を過ごし、さらにジェニファー・ロペス、ジュリアン・ハフなど

ケイト・ミドルトンはロンドンの水辺で 1 日を過ごし、ジェニファー・ロペス、ジュリアン・ハフなども。ハリウッドからニューヨークまで、そしてその間のあらゆる場所で、お気に入りのスターの活躍をご覧ください!

ウィスコンシン川でのナイフ攻撃で 17 歳の少年が刺されて死亡、他の 4 人が負傷したままになっている

ウィスコンシン川でのナイフ攻撃で 17 歳の少年が刺されて死亡、他の 4 人が負傷したままになっている

捜査官は、グループと容疑者が攻撃の前にお互いを知っていたかどうかを調べています

滑走路着陸

滑走路着陸

晩夏と秋はノスタルジックな季節。街灯は雨で濡れた通りに光を放ち、足元の葉 - 夕暮れの影の中で落ち着いた赤オレンジ - は過ぎ去った日々を思い出させます。

実際に変換するコンテンツ戦略を作成することを想像してみてください。それが可能だ。

実際に変換するコンテンツ戦略を作成することを想像してみてください。それが可能だ。

2021 年には、サービスを提供する顧客と顧客に伝えるストーリーについて知っていることをすべて再考することをお勧めします。あとずさりする。

マンモスロスは私の心を愛に開いた

マンモスロスは私の心を愛に開いた

フェリックス ザ キャットの 9 歳の誕生日の日に、大人になってからの最大の損失の 1 つである 2013 年のソフィーを思い出します。私はこのエッセイを書き、2013 年にこのプラットフォームで簡単に共有しました。

あなたがインターネットがあなたに望んでいる人になれないとき

あなたがインターネットがあなたに望んでいる人になれないとき

私は「列車事故」という言葉が嫌いです。人々は自分自身の道徳的羅針盤に安らぎを覚え、そうすることで自分自身が判断を下していることに気づきます。

Language