2009-07-22 4 views
1

Я пишу приложение в C в GCC (для Linux/Ubuntu), которое использует следующую встроенную сборку.Как написать следующий встроенный код сборки в Visual C++ 6.0?

float a[4] = { 10, 20, 30, 40 }; 
float b[4] = { 0.1, 0.1, 0.1, 0.1 }; 

asm volatile("movups (%0), %%xmm0\n\t" 
      "mulps (%1), %%xmm0\n\t" 
      "movups %%xmm0, (%1)" 
      :: "r" (a), "r" (b)); 

Извините, что указано выше (я пишу из памяти). Что такое эквивалентный встроенный ассемблер в Visual C++ 6.0? Я обнаружил, что мне нужно портировать код.

+0

Вы можете найти его проще портировать приложения Linux для Windows, с помощью одного из окна НКУ-на- порты: http://wiki.answers.com/Q/How_do_you_install_GCC_in_Windows_XP –

ответ

2
__declspec(align(16)) float a[4] = { 10, 20, 30, 40 }; 
__declspec(align(16)) float b[4] = { 0.1f, 0.1f, 0.1f, 0.1f }; 

__asm { 
    movups xmm0, a; // could be movaps if array aligned 
    mulps xmm0, b; 
    movups b, xmm0; // could be movaps if array aligned 
} 

Я не уверен, что Visual C++ 6, но он будет работать в Visual C++ 2008.

+0

спасибо за это, плохо попробуй это, следующий шанс я получаю :) – horseyguy

+1

TBH, если вы выравниваете массивы с плавающей запятой до 16 байтов, вы можете также использовать подвижки как это будет МНОГО раз быстрее ... – Goz

+1

@Goz, добавил ваше примечание в ответ. Я попытался написать точную копию вопроса и добавил '__declspec (align (16))' из привычки –