我試圖對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_內聯彙編塊是無效的;它可能有效,但不能保證,因爲編譯器在其無限智慧中可能會選擇在輸入第二個__asm__塊之前對第二個「__asm__」塊的「非聲明輸入」(regs'%xmm0' /'%xmm6')做些什麼。請參閱http://stackoverflow.com/questions/8891139/why-is-this-inline-assembly-not-working關於如何解決該問題的一些細節。 – 2012-02-28 10:56:28