私はCコードをリバースエンジニアリングしようとしていますが、この部分のアセンブリは本当に理解できません。私はそれがSSE拡張の一部であることを知っています。しかし、何かは実際に私がx86命令で慣れていたものとはまったく異なります。CコードのSSE2命令
static int sad16_sse2(void *v, uint8_t *blk2, uint8_t *blk1, int stride, int h)
{
int ret;
__asm__ volatile(
"pxor %%xmm6, %%xmm6 \n\t"
ASMALIGN(4)
"1: \n\t"
"movdqu (%1), %%xmm0 \n\t"
"movdqu (%1, %3), %%xmm1 \n\t"
"psadbw (%2), %%xmm0 \n\t"
"psadbw (%2, %3), %%xmm1 \n\t"
"paddw %%xmm0, %%xmm6 \n\t"
"paddw %%xmm1, %%xmm6 \n\t"
"lea (%1,%3,2), %1 \n\t"
"lea (%2,%3,2), %2 \n\t"
"sub $2, %0 \n\t"
" jg 1b \n\t"
: "+r" (h), "+r" (blk1), "+r" (blk2)
: "r" ((x86_reg)stride)
);
__asm__ volatile(
"movhlps %%xmm6, %%xmm0 \n\t"
"paddw %%xmm0, %%xmm6 \n\t"
"movd %%xmm6, %0 \n\t"
: "=r"(ret)
);
return ret;
}
%1、%2、%3とは何ですか? (%1、%2、%3)はどういう意味ですか?また、 "+ r"、 " - r"、 "= r"はどういう意味ですか?
このコードの_two disjointed_ inlineアセンブリブロックの使用は無効です。それはうまくいくかもしれませんが、無限の知恵のコンパイラが2番目の '__asm__'ブロックの"宣言されていない入力 "(regs'%xmm0'/'%xmm6')を使って何かを行うことを選択するかもしれないからです。それを修正する方法の詳細については、http://stackoverflow.com/questions/8891139/why-is-this-inline-assembly-not-workingを参照してください。 –