什么是__m128d?

时间:2018-12-13 08:19:20

标签: c++ intel intrinsics sse2

我真的无法获得C ++之类的__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的编译器?它会自动将该关键字转换为“移动寄存器xmm0”等吗?还是哪种操作?

似乎根本不是数据类型。

有人可以照耀我吗?

1 个答案:

答案 0 :(得分:6)

  

它是typedef吗?

是的!

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

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

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

在实现GNU C扩展(gcc和clang)的编译器中,将其定义为double s的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<xmmintrin.h>