Мне нужно скомпилировать некоторый ассемблерный код как в 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?
Вы, конечно, можете сказать GCC, какой регистр SSE использовать для каждой переменной:
register __m128i x asm("xmm6");
Но я думаю, что VS не поддерживает это. (Я также немного удивлен, что вам это нужно для приличной производительности. Назначение регистров и планирование команд — две основные вещи, которые знает оптимизирующий компилятор. Вы уверены, что вы включили оптимизацию :-)?)
Я, вероятно, просто написал бы две функции, одну с использованием встроенных функций, а другую с использованием asm для того, какой компилятор не знает, как правильно планировать инструкции.
Других решений пока нет …