2

OS開発クラスの宿題プロジェクトに取り組んでいます。1つのタスクは、割り込み時にSSEレジスタのコンテキストを保存することです。これで、コンテキストの保存と復元が簡単になりました(fxsave / fxsave)。しかし、私はテストに問題があります。同じサンプル日付をレジスタの1つに入れたいのですが、取得するのはエラー割り込み6だけです。コードは次のとおりです。

// load some SSE registers
struct Vec4 {
    int x, y, z, w;
} vec = { 0, 1, 2, 3 }; 


asm volatile (  "movl %0, %%eax"
        : /* no output */
        : "r"( &vec )
        :
        );
asm volatile ( "movups (%eax), %xmm0" );

私は解決策をインターネットで検索しました。私が得たのは、それが効果的なアドレス空間と関係があるかもしれないということだけです。しかし、それが何であるかはわかりません。

4

3 に答える 3

2

何が問題なのかわかりました。SSE命令の実行は、CR0およびCR4レジスタにいくつかのフラグを設定して有効にする必要があります。詳細はこちら:http ://wiki.osdev.org/SSE

于 2012-03-28T00:48:11.253 に答える
2

インラインアセンブリの制約としてメモリオペランドを使用する必要があります。これは、(演算子で試したように)自分でアドレスを生成してレジスタにロードするよりもはるかに優れています。これは、アドレスが相対的または再配置可能&である場合、後者は機能しないためです。rip

asm volatile ( "movups %0, %%xmm0" 
        : /* no output */
        : "m"( vec )
        :
        );

また、名前を登録する前に2つの「%%」を使用する必要があります。

gccの制約について詳しくは、http://gcc.gnu.org/onlinedocs/gcc/Simple-Constraints.html#Simple-Constraintsをご覧ください。この概念は単純ではないため、タイトルはやや誤解を招く可能性があります:-)

于 2012-03-27T01:12:20.800 に答える
0

この方法を必要以上に難しくしています-*mmintrin.hヘッダーの組み込み関数を使用するだけです。

#include <emmintrin.h>

__m128i vec = _mm_set_epi32(3, 2, 1, 0);

これを特定のXMMレジスタに配置する必要がある場合は、上記の例を開始点として使用してから、asmを生成します。たとえばgcc -S、生成されたasmを独自のコードのテンプレートとして使用します。

于 2012-03-26T20:43:57.563 に答える