呼叫_mm_load_ps
将返回__m128
。在英特尔内部函数指南it says中:
将128位(由4个压缩的单精度(32位)浮点元素组成)从内存加载到dst。 mem_addr必须在16字节边界上对齐,否则可能会生成常规保护异常。
((编者注:对于可能未对齐的负载使用_mm_loadu_ps
)
这是否意味着只要__m128仍然有效,第4个浮点程序包就驻留在xmm寄存器中?然后这是否意味着堆栈上的__m128数多于可用的xmm寄存器会导致溢出?
这是否意味着只要__m128仍然有效,第4个浮点程序包就驻留在xmm寄存器中?
没有内在函数由编译器编译,向量变量将像其他变量一样进行寄存器分配。
正如您在第二句话中所指出的那样-您可以编写具有比寄存器更多的__m128
变量的代码-这会溢出到堆栈中。
内部函数API旨在让您假装您正在用汇编编写,但是实际上加载/存储内部函数只是将类型/对齐信息传递给编译器。
([alignof(__m128) = 16
,因此任何溢出/重新加载都可以使用需要对齐的指令来完成。重新加载甚至可以将其用作存储源操作数,而不是加载到寄存器中。]
__m128
变量也将需要溢出到非内联函数调用中,尤其是在没有保留调用的XMM寄存器的调用约定中。 (例如x86-64系统V)。 Windows x64有几个保留呼叫的XMM寄存器,但是有些是易失性的(呼叫密集的),因此函数中有几个XMM寄存器可以使用。