gcc — ссылки на переменные во встроенной сборке в стиле Intel и в стиле AT & T, переполнение стека

Мне нужно скомпилировать некоторый ассемблерный код как в Visual Studio, так и в IDE, используя G ++ 4.6.1. Флаг -masm = intel работает, пока я не ссылаюсь и не обращаюсь к каким-либо переменным, что, однако, мне нужно сделать.

Я рассмотрел использование встроенных функций, но скомпилированная сборка совсем не оптимальна (например, я не могу определить sse-регистр, который будет использоваться, и, следовательно, оптимизация канала невозможна).

Рассмотрим эти части кода (целочисленная сборка):

mov       ecx, dword ptr [p_pXcoords]
mov       edx, dword ptr [p_pYcoords]
movhpd    xmm6, qword ptr [oAvgX]
movhpd    xmm7, qword ptr [oAvgY]
movlpd    xmm6, qword ptr [oAvgX]
movlpd    xmm7, qword ptr [oAvgY]

где p_pXcoords и p_pYcoords представляют собой удвоенные массивы * и параметры функций, oAvgX и oAvgY — простые двойные значения.

Вот еще одна строка кода, которая находится в середине блока сборки:

movhpd    xmm6, qword ptr [oAvgY]

другими словами, мне нужно получить доступ к переменным и использовать их в определенных sse-регистрах в середине кода. Как я могу сделать это с AT & Синтаксис T, лучше всего: могу ли я сделать это с помощью компилятора g ++ с использованием флага -masm?

Можно ли вообще использовать один ассемблерный код как для VS, так и для компилятора на основе g ++ 4.6.1?

2

Решение

Вы, конечно, можете сказать GCC, какой регистр SSE использовать для каждой переменной:

register __m128i x asm("xmm6");

Но я думаю, что VS не поддерживает это. (Я также немного удивлен, что вам это нужно для приличной производительности. Назначение регистров и планирование команд — две основные вещи, которые знает оптимизирующий компилятор. Вы уверены, что вы включили оптимизацию :-)?)

Я, вероятно, просто написал бы две функции, одну с использованием встроенных функций, а другую с использованием asm для того, какой компилятор не знает, как правильно планировать инструкции.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]