我真的无法获得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”等吗?还是哪种操作?
似乎根本不是数据类型。
有人可以照耀我吗?
答案 0 :(得分:6)
它是typedef吗?
是的!
__m128d
是一种数据类型,编译器在优化时有望将其存储在XMM 128位寄存器中(如果没有像@PeterCordes所评论的那样对其进行优化)。它与int
或long
并没有本质上的区别,在优化时编译器有望将它们存储在整数寄存器中。
实际定义是特定于编译器的;打算在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>
。