Вы можете написать структуру, которая автоматически конвертирует в и из __m128
:
struct alignas(16) Vec4f
{
float x, y, z, w;
operator __m128() const { return _mm_load_ps(&x);}
Vec4f(__m128 const v) { _mm_store_ps(&x, v);}
};
Это имеет тот недостаток, что Vec4f
будет передаваться через два регистра SSE вместо одного (при передаче по значению).: https://godbolt.org/z/sutmuM).
В целом, я бы предложил создать структуру, которая бы содержала только методы __m128
и overload x()
, y()
и т. Д. Элементные операции над регистрами SSE должны бытьпо возможности избегать (за исключением использования нулевого элемента).
Примечание: alignas(16)
требует C ++ 11, для большинства компиляторов существуют специфичные для компилятора альтернативы. В качестве альтернативы вы можете использовать _mm_loadu_ps
и _mm_storeu_ps
вместо.