clobber リストに何も記述しない場合、gcc コンパイラはレジスタのバックアップに push/pop を使用しますか? 入力リストレジスタと出力リストレジスタはどうなりますか?
いくつかの汎用レジスターを XMM/YMM レジスターに保存し、汎用レジスターで再生する短い asm インラインを作成します。最後に、元の値が XMM/YMM レジスタから汎用レジスタに戻されます。とにかく、コンパイラはそれらを保存するためにプッシュ/ポップを配置しますか?
GCCコンパイラにどのように伝えることができますか:
何かのようなもの:
__asm__ __volatile__ (
".intel_syntax noprefix \n\t"
"movd xmm0,eax \n\t"//storing in xmm registers instead of pushing
"movd xmm1,ebx \n\t"
"movd xmm2,ecx \n\t"
"movd xmm3,edx \n\t"
"movd xmm4,edi \n\t" // end of backups
//.
//... doing work
//.
"movd edi,xmm4 \n\t"
"movd edx,xmm3 \n\t"
"movd ecx,xmm2 \n\t"
"movd ebx,xmm1 \n\t"
"movd eax,xmm0 \n\t" // end of pops
://outputs
"=g"(x[0]), //%0
"=g"(x[1]) //%1
://inputs
"g"(x[0]), //%2
"g"(x[1]) //%3
://no clobber list
);
またはこのようなもの(このスワッピングが非常に遅いことは知っていますが、プッシュポップを機能させたかっただけです):
__asm__ __volatile__ (
".intel_syntax noprefix \n\t"
"push rax \n\t"
"push rbx \n\t"
"push rcx \n\t"
"push rdx \n\t"
"mov eax,%2 \n\t"
"mov ecx,%3 \n\t"
"mov edx,eax \n\t"
"mov eax,ecx \n\t"
"mov ecx,edx \n\t"
"mov %0,eax \n\t"
"mov %1,ecx \n\t"
"pop rdx \n\t"
"pop rcx \n\t"
"pop rbx \n\t"
"pop rax \n\t"
://outputs
"=g"(x[0]), //%0
"=g"(x[1]) //%1
://inputs
"g"(x[0]), //%2
"g"(x[1]) //%3
://no clobber list
);