作者:古镇飞天 | 来源:互联网 | 2022-11-25 12:59
我真的无法得到__m128d
C++中的"关键字" .
我正在使用MSVC,它说:The __m128d data type, for use with the Streaming SIMD Extensions 2 instructions intrinsics, is defined in
.
那么,它是数据类型吗?typedef
?如果我做:
#include
int main() {
__m128d x;
}
我无法看清楚
.它似乎是一个keyword
编译器?它会自动将该关键字转换为"移动寄存器xmm0"等等吗?或者哪种操作呢?
它似乎根本不是数据类型.
有人可以照耀我吗?
1> gsamaras..:
它是typedef吗?
是!
__m128d
是一种数据类型,编译器在优化时希望存储在XMM 128位寄存器中(如果没有将其优化为@PeterCordes注释).它本身并不与编译器在优化时希望存储在整数寄存器中的int
或不同long
.
实际定义是特定于编译器的 ; 打算在MSVC和实现Intel内在函数的其他主要编译器之间移植的代码应避免依赖于定义的细节.
MSVC将矢量类型定义为不同元素大小的数组的并集.
在实现GNU C扩展(gcc和clang)的编译器中,它的typedef是一个16字节的GNU C本机向量double
:
// 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__));
在
@Default评论中.
该may_alias
属性告诉编译器__m128d*
可以使用相同的方式对其他类型进行别名char*
,以便基于C++严格别名规则进行优化.
用法示例:(初始化可在MSVC和其他编译器之间移植)
__m128d a2 = { -1.388539L, 0.0L };
对于__m128
,请查看英特尔论坛和
.
它不是字面上的寄存器,就像`int foo;`不是字面意义上的整数寄存器.它是一个C变量,编译器在优化时希望保留在寄存器中,如果它没有优化掉的话.它是一种可以映射到XMM寄存器的数据类型.
您编辑了MSVC定义,并具有GNU C定义的旧版本或简化版本.我为你解决了这个问题,并添加了一个很大的警告:它在实现之间是*不同的.我不是100%确定英特尔自己的编译器如何定义它.ICC实现GNU C扩展,因此它支持GNU C本机向量.但IDK如果用gcc的方式用本地向量定义`__m128`.