Среда 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 работают для повышения производительности.Любые рекомендации по материалам, которые я должен прочитать?