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 어셈블리 블록을 사용할 수 없습니다. 그것은 작동하지만 그것은 무한한 지혜로운 컴파일러가 입력하기 전에 두 번째'__asm__' 블록의 "선언되지 않은 입력"(regs'% xmm0' /'% xmm6')을 사용하여 무언가를 할 수도 있기 때문에 보장 할 수 없습니다. 수정 방법에 대한 자세한 내용은 http://stackoverflow.com/questions/8891139/why-is-this-inline-assembly-not-working를 참조하십시오. –