Это typedef?
Да!
__m128d
- это тип данных, который, мы надеемся, компилятор сохранит в 128-битном регистре XMM при оптимизации (если не оптимизировать его, как прокомментировал @PeterCordes).По своей сути он не отличается от int
или long
, которые, как мы надеемся, компилятор будет хранить в целочисленных регистрах при оптимизации.
Фактическое определение зависит от компилятора ;код, который намеревается быть переносимым между MSVC и другими основными компиляторами, которые реализуют встроенные функции Intel, следует избегать в зависимости от деталей определения.
MSVC определяет векторные типы как объединение массивов элементов разных размеров.
В компиляторах, которые реализуют расширения GNU C (gcc и clang), он определяется как 16-байтовый собственный вектор GNU C, равный double
s:
// From gcc 7.3's emmintrin.h (SSE2 extensions). SSE1 stuff in xmmintrin.h
/* The Intel API is flexible enough that we must allow aliasing with other
vector types, and their scalar components. */
typedef long long __m128i __attribute__ ((__vector_size__ (16), __may_alias__));
typedef double __m128d __attribute__ ((__vector_size__ (16), __may_alias__));
в <emmintrin.h>
, как прокомментировал @Default.
Атрибут may_alias
сообщает компилятору, что __m128d*
может использовать псевдонимы других типов так же, как char*
, для целей оптимизации на основе C ++правила строгого наложения.
Пример использования: (инициализация переносима между MSVC и другими компиляторами)
__m128d a2 = { -1.388539L, 0.0L };
Для __m128
проверьте Форум Intel и <xmmintrin.h>
.