xmm寄存器何时__m128?

问题描述 投票:0回答:1

呼叫_mm_load_ps将返回__m128。在英特尔内部函数指南it says中:

将128位(由4个压缩的单精度(32位)浮点元素组成)从内存加载到dst。 mem_addr必须在16字节边界上对齐,否则可能会生成常规保护异常。

((编者注:对于可能未对齐的负载使用_mm_loadu_ps


这是否意味着只要__m128仍然有效,第4个浮点程序包就驻留在xmm寄存器中?然后这是否意味着堆栈上的__m128数多于可用的xmm寄存器会导致溢出?

c++ compilation sse cpu-registers intrinsics
1个回答
2
投票

这是否意味着只要__m128仍然有效,第4个浮点程序包就驻留在xmm寄存器中?

没有内在函数由编译器编译,向量变量将像其他变量一样进行寄存器分配。

正如您在第二句话中所指出的那样-您可以编写具有比寄存器更多的__m128变量的代码-这会溢出到堆栈中。

内部函数API旨在让您假装您正在用汇编编写,但是实际上加载/存储内部函数只是将类型/对齐信息传递给编译器。

([alignof(__m128) = 16,因此任何溢出/重新加载都可以使用需要对齐的指令来完成。重新加载甚至可以将其用作存储源操作数,而不是加载到寄存器中。]

__m128变量也将需要溢出到非内联函数调用中,尤其是在没有保留调用的XMM寄存器的调用约定中。 (例如x86-64系统V)。 Windows x64有几个保留呼叫的XMM寄存器,但是有些是易失性的(呼叫密集的),因此函数中有几个XMM寄存器可以使用。

© www.soinside.com 2019 - 2024. All rights reserved.