Расширенная встроенная сборка, нарушающая функцию - PullRequest
0 голосов
/ 02 апреля 2019

Среда x86_64 в Linux.Я пытаюсь ускорить некоторые вычисления в функции foo, написав встроенную сборку.Я хочу передать 4 символа в 32-разрядный регистр и выполнить вычисления один раз вместо выполнения вычислений отдельно для 4 символов.Переменные a, b и c являются указателями на 4 символа.

Это рабочий код, который позволяет мне получить правильные результаты вычислений, но он намного медленнее, чем исходный код C.Я вычисляю 4 символа отдельно.

__asm__(
     "lea (%%esi, %%eax, 2), %%eax \n\t"
     //... more calculations for a.x and a.x
     : "=g" (a.x), "=g" (b.x)
     : "r" (b.x), "r" (a.x), "r" (c.x)
     :"%edx"
);
__asm__(
     "lea (%%esi, %%eax, 2), %%eax \n\t"
     //... more calculations for a.y and b.y
     : "=g" (a.y), "=g" (b.y)
     : "r" (b.y), "r" (a.y), "r" (c.y)
     :"%edx"
);
__asm__(
     "lea (%%esi, %%eax, 2), %%eax \n\t"
     //... more calculations for a.b and a.c
     : "=g" (a.z), "=g" (b.z)
     : "r" (b.z), "r" (a.z), "r" (c.z)
     :"%edx"
);

Вместо того, чтобы передавать символы отдельно, я попытался передать a, b и c напрямую.Я не получаю никакой ошибки сегментации, но внешняя функция полностью испорчена (не из-за переполнения).Мне нужно лучше понять, как конвейерная обработка и x86_64 работают для повышения производительности.Любые рекомендации по материалам, которые я должен прочитать?

...