Выравнивание переменных стека в D - PullRequest
10 голосов
/ 11 сентября 2011

В D вы можете выровнять членов структуры / класса, используя ключевое слово align, например ::

struct Vec4 { align(16) float[4] elems; }

Однако, похоже, что вы не можете сделать то же самое в стеке:

void foo()
{
    align(16) float[4] vec; // error: found 'align' instead of statement
}

Есть ли способ выровнять данные в стеке? В частности, я хочу создать 16-байтовый выровненный массив чисел с плавающей запятой для загрузки в регистры XMM, используя movaps, что значительно быстрее, чем movups.

, например * * 1016

void foo()
{
    float[4] v = [1.0f, 2.0f, 3.0f, 4.0f];
    asm
    {
        movaps XMM0, v; // v must be 16-byte aligned for this to work.
        ...
    }
}

1 Ответ

5 голосов
/ 11 сентября 2011

Если вы хотите записать дополнительные 16 байтов, вы можете выполнить выравнивание самостоятельно во время выполнения. Кроме того, я бы не знал.

...