什么是 __m128d?

What is __m128d?

我真的无法理解 C++ 中 "keyword" 与 __m128d 的区别。

我正在使用 MSVC,it 说:The __m128d data type, for use with the Streaming SIMD Extensions 2 instructions intrinsics, is defined in <emmintrin.h>

那么,它是一种数据类型吗? typedef?如果我这样做:

#include <emmintrin.h>

int main() {
    __m128d x;
}

我看不到 <emmintrin.h> 上的定义。好像是keyword的编译器?它会自动将该关键字转换为 "move register xmm0" 等内容吗?或者哪种操作呢?

它似乎根本不是一种数据类型。

有人可以照亮我吗?

Is it a typedef?

是的!

__m128d 是一种数据类型,编译器希望在优化时将其存储在 XMM 128 位寄存器中(如果没有像@PeterCordes 评论的那样对其进行优化)。它与 intlong 在本质上没有区别,编译器希望在优化时将其存储在整数寄存器中。

实际定义是特定于编译器的;旨在在 MSVC 和其他实现英特尔内在函数的主要编译器之间可移植的代码应避免依赖于定义的细节。

MSVC 将向量类型定义为不同元素大小的数组的并集。

在实现 GNU C 扩展(gcc 和 clang)的编译器中,它被类型定义为 doubles 的 16 字节 GNU C 本机向量:

// 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 forum and <xmmintrin.h>