2014-12-04 2 views
0

мне нужно, чтобы получить что-то вроде этого, вероятно, но в странной GCC встроенного ассемблеракак сделать простой float4 добавить в GCC/MinGW встроенного ассемблера

void add4(float* a, float* b, float* out) 
{ 
    mov edx, [esp+4] 
    movaps xmm0, oword [edx+0] 
    mov edx, [esp+8] 
    movaps xmm1, oword [edx+0] 
    addps xmm0, xmm1 
    mov edx, [esp+12] 
    movaps oword [edx+0], xmm0 
    ret 
} 

1) одна тема, как упаковать это в GCC встроенного синтаксиса 2) вторая тема - как переписать ее (возможно, избавиться от явного доступа к памяти) , чтобы сделать такую ​​встроенную рутину хорошо интегрированной с окружающим кодом GCC (mingw32)

+0

Вы рассматривали использование типов векторов gcc и позволяете компилятору выполнять всю работу за вас? – JS1

+0

Вместо использования встроенной сборки используйте функции intrinsics. –

ответ

1

Существует два способа сделать это.

Первым способом было бы использовать ключевое слово asm, чтобы включить встроенную сборку в виде литеральной строки. Вы также можете передать параметры функции, и GCC будет генерировать необходимый код для доступа к ним. Это избавит вас от необходимости вручную использовать доступ к памяти, особенно при работе с различными соглашениями о вызовах. Это общий способ встраивания сборки в C-функции.

Второй способ, который более конкретно относится к тому, что вы пытаетесь сделать, - использовать встроенные функции SSE (предоставляется <xmmintrin.h>. Полученный код выглядит как обычные вызовы функций C, но вместо этого компилятор будет генерировать соответствующие инструкции куча вызовов функций. Дополнительную информацию об использовании этих свойств можно найти в Intel Intrinsics Guide.

+0

, но что именно он должен искать в встроенной сборке gcc? – user2214913

+0

В вашем случае просто поместите каждую строку кода сборки в кавычки (вам также понадобится вставить буквальный '\ n' в конец ea ch string), затем оберните все это в 'asm (' и ');'. Я могу отредактировать свой ответ, если вам нужен пример. –

+1

Нужно также пример этого странного окончания asm ("movl% 1, %% eax;:" = r "(b)/* output */ :" r "(a)/* input */ :"% eax "/ * clobbered register */ ); – user2214913

Смежные вопросы