問題タブ [register-allocation]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
4 に答える
5083 参照

c - GCC: 一部レジスタの使用禁止

変なお願いですが、出来る気がします。GCC のレジスタ アロケータがそれらを使用しないように、いくつかのプラグマまたはディレクティブをコード (C で記述) の領域に挿入したいと考えています。

このようなことができることを理解しています。これにより、この変数用にこのレジスタが確保される可能性があります

問題は、新しい命令 (ハードウェア シミュレータ用) を直接挿入していて、GCC と GAS がまだこれらを認識していないことです。新しい命令は既存の汎用レジスタを使用できますが、それらのいくつか (つまり、r12->r15) を確保したいと考えています。

現在、私はモックアップ環境で作業しており、実験を迅速に行いたいと考えています。将来的には、GAS を追加し、組み込み関数を GCC に追加しますが、今は簡単な修正を探しています。

ありがとう!

0 投票する
4 に答える
1897 参照

c++ - 変数定義の前に移動 - その値はどうなりますか?

ここで、ふと疑問に思ったことがあります。次のコードが与えられた場合、その出力について確信を持てますか?

finished: 10これは、C++ 標準に従って出力されることが保証されていますか? aまたは、コンパイラは、格納されgotoているレジスタを占有できaますか?

0 投票する
2 に答える
2324 参照

c - GCCが関数呼び出しで予約済みレジスタを保存/復元しない

GCC で問題を引き起こすシナリオがあります。私が得る行動は、私が期待する行動ではありません。状況を要約すると、ハードウェア シミュレータに実装される x86-64 用のいくつかの新しい命令を提案しています。これらの命令をテストするために、既存の C ソース コードを使用し、16 進数を使用して新しい命令をハンドコーディングしています。これらの命令は既存の x86-64 レジスターと対話するため、入力/出力/クロバー リストを使用して GCC の依存関係を宣言します。

何が起こっているかというと、printf などの関数を呼び出すと、依存するレジスタが保存および復元されません。

例えば

101 は r9 に割り当てられ、インライン アセンブリ (この例では偽物) は r9 に依存しています。これはprintfがなくても正しく実行されますが、ある場合、GCCはr9を保存および復元せず、カスタム命令が呼び出されるまでに別の値がそこにあります。

おそらくGCCが変数r9への代入をこっそり変更したのではないかと思ったのですが、こうすると

アセンブリの出力を確認すると、実際に %r9 が使用されています。

gcc 4.4.5 を使用しています。何が起こっていると思いますか?GCC は常に関数呼び出しでレジスタを保存および復元すると思っていました。強制できる方法はありますか?

ありがとう!

編集:ちなみに、私はこのようなプログラムをコンパイルしています

0 投票する
2 に答える
110 参照

embedded - レジスタを使用した入力設定

n個のフィボナッチ数を印刷するための簡単なcプログラムがあり、それをELFオブジェクトファイルにコンパイルしたいと思います。フィボナッチ数(n)をcコードで直接設定するのではなく、ARMプロセッサ用にシミュレートしているので、レジスタに設定したいと思いますが、どうすればよいですか?

これがコードスニペットです

コードではなく、レジスターにITERATIONSカウンターを設定したいと思います。

前もって感謝します

0 投票する
1 に答える
1580 参照

gcc - GCC でインライン ARM アセンブリを使用する場合の使用レジスタの最適化

C コードでインライン ARM アセンブリを作成したいと考えています。このコードでは、関数への入力および出力として宣言されているものだけでなく、レジスタを 1 つまたは 2 つ多く使用する必要があります。クロバーリストを使用して、計算を行うために追加のレジスタを使用することを GCC に伝える方法を知っています。

しかし、GCC は、最適化時にどのレジスターを何に使用するかをシャッフルする自由を享受していると確信しています。つまり、計算に固定レジスタを使用するのは悪い考えだと感じています。

固定レジスタを使用せずに、インライン アセンブリの入力でも出力でもない追加のレジスタを使用する最良の方法は何ですか?

PSダミーの出力変数を使用するとうまくいくかもしれないと思っていましたが、他にどのような奇妙な効果があるのか​​ わかりません...

0 投票する
1 に答える
179 参照

if-statement - if での余分なレジスタの使用法

私は大規模な cuda カーネルで作業していましたが、カーネルがスレッドごとに 43 個のレジスタを使用していることに気付きました。何が起こっているのかを理解するために、レジスタの使用法を把握する小さなプログラムを作成しました。ifを使用するたびに、レジスタの使用率が上がることに気付きました。小さなコードは次のとおりです。

このコードをコンパイルすると、各スレッドは 5 つのレジスタを使用します

しかし、コメントを外すifと、各スレッドは 8 つのレジスタを使用します。誰が私に何が起こっているのか説明してもらえますか?

0 投票する
1 に答える
289 参照

compiler-construction - グラフ彩色レジスタ アロケータ

私のコンパイラ コースでは、MIPS アーキテクチャのグラフ カラーリングに基づくレジスタ アロケータを構築しています。私は私の実装のために同じことについてMuchnickの扱いに従っています。

Muchnick は、これらのアロケータで関数の引数をどのように扱うかについて、少しあいまいでした。

私はいくつかの仮定を立て、同じことを明確にしたいと考えました。

  1. 中間レベルの IR から低レベルの IR に変換するこのステップがあります。ネストされた関数呼び出しは処理されていません。私の考えは、関数呼び出しを右から左にスキャンし、最も内側の呼び出しの IR を外側に配置することです。このようにして、最初のいくつかの引数を引数レジスタに割り当て、残りを最小量のスピル (ちょうど 1) でスタックするという MIPS 呼び出し規則を使用できます。
  2. 本書のレジスタ合体処理は、関数の引数を固定引数レジスタに移動する LIR コードがどのように処理されるかを扱っていないため、私には直感的ではありません。多くの審議の後、私は、引数の受け渡しの動きに対してレジスタ合体を行うべきではないという結論に達しました。

これらの仮定に関するフィードバック/考えは非常に高く評価されています。

0 投票する
1 に答える
239 参照

java - レジスタ割り当ての事前に色付けされたノード-各色の最大1つ?

コンパイラでのレジスタ割り当てに関するトピックを調べています。レジスタ割り当てに広く使用されているアルゴリズムは、単純化による反復グラフ彩色です。AndrewW.Appelによる著書「 ModernCompilerImplementationin Java」の第11章では、レジスタ割り当ての状態について次のように述べています。

干渉グラフの各ノードは一時的な値を表します。

[...]

一部の一時的なものは事前に色付けされています-それらはマシンレジスタを表します。フロントエンドは、たとえば、モジュールの境界を越えて標準の呼び出し規約に接続するときにこれらを生成します。フレームポインタ、standard-argument-1-register、standard-argument-2-registerなど、特定の目的に使用される実際のレジスタごとに、CodegenorFrameモジュールは永続的にバインドされている特定の一時レジスタを使用する必要がありますそのレジスタに。任意の色(つまり、任意のマシンレジスタ)に対して、その色の事前に色付けされたノードは1つだけである必要があります。

上記の引用で示された行を完全には理解していません。同じレジスターでプレカラーされる複数の一時的なものがある状況を想像することができます。たとえば、x86mul命令は結果をEDX:EAXレジスタペアに格納しますが、関数はレジスタに値も返しますEAX。だから私は同じ色の異なる一時的なものを持っています。それらの異なる使用法はEAX異なるノードでなければならないと思いますか、それとも私は間違っていますか?

誰かが強調表示された文を説明できますか、おそらくいくつかの例を提示できますか?

0 投票する
1 に答える
846 参照

cpu-registers - レジスタ+スタックベースの仮想マシンはどのように機能しますか?

レジスタベースとスタックベースの仮想マシンがどのように独立して機能するかを知っています。私は両方の長所と短所を知っています。私が知りたいのは、誰かが2つをマージしようとしたことがあるということです。

そのような仮想マシンの存在をネットで検索しようとしましたが、役に立ちませんでした。私が得た最高の結果は、ハイブリッド仮想マシン(HyVM)に関する記事でした。そのような仮想マシンが実際にプログラミング言語用に作成された場合、そのソースコードを見て、その動作を理解することに興味があります。

おそらく、誰かが私を正しい方向に向けてそのような仮想マシンを見つけるか、このトピックで詳しく説明している記事やブログ投稿に私をリンクすることができます。

0 投票する
3 に答える
1035 参照

assembly - FPUおよびMMXレジスタを「汎用レジスタ」として使用する

ほとんどのアセンブリプログラムは4つの汎用レジスタを使用しますが、スタックをeax ebx ecx edx何度も移動することなくタスクを簡単に実行するには、4つ以上のレジスタを使用する必要があることがよくあります。私のプログラムは、浮動小数点計算またはそれらの「意図された使用」のためにFPUまたはMMXレジスタを使用する意図がないので、プログラムでこれらの追加のレジスタを使用することは許容できると考えられますか?pushpop

例えば。xmm0ループインクリメントカウンタを使用して、ecxレジスタを解放して他のことを実行します。