Инструкция SSE2 в коде C - PullRequest
       36

Инструкция SSE2 в коде C

1 голос
/ 28 февраля 2012

Я пытаюсь восстановить инженерный код, но эту часть сборки я не могу понять.Я знаю, что это часть расширения SSE.Однако кое-что действительно отличается от того, к чему я привык в инструкциях по x86.

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"?

Ответы [ 2 ]

2 голосов
/ 28 февраля 2012

Вам захочется взглянуть на это GCC Inline Asssembly HOWTO .

Цифры знака процента являются операндами инструкции.

0 голосов
/ 28 февраля 2012

Встроенный ассемблер работает аналогично макропроцессору.Операнды с ровно одним начальным процентом заменяются входными параметрами в том порядке, в котором они отображаются в списке параметров, в этом случае:

%0    h                output, register, r/w
%1    blk1             output, register, r/w
%2    blk2             output, register, r/w
%3    (x86_reg)stride  input, register, read only

Параметры являются обычными выражениями C.Они могут быть дополнительно определены с помощью «ограничений», в этом случае «r» означает, что значение должно быть в регистре, а не «m», который является операндом памяти.Модификатор ограничения "= r" делает этот операнд только для записи, "+ r" - операнд для чтения и записи, а "r" - операнд для обычного чтения.

После первого двоеточия выходные операнды появляются послевторой - входные операнды, а после необязательной третьей - засоренные регистры.

Таким образом, последовательность команд вычисляет сумму абсолютных разностей в каждом байте blk1 и blk2.Это происходит в 16-байтовых блоках, поэтому, если stride равно 16, блоки являются смежными, в противном случае имеются дыры.Каждая инструкция появляется дважды, поскольку выполняется минимальное развертывание цикла, параметр h - это число 32-байтовых блоков для обработки.Второй блок asm кажется бесполезным, поскольку инструкция psadbw суммируется только в младшем 16-битовом регистре назначения.(Вы пропустили какой-то код?)

...