x86-64-psABI 3.2.3中SSE/SSEUP、X87类差异及术语释义问询
x86-64 psABI 3.2.3 参数分类疑问解答
针对你在x86-64 psABI 3.2.3章节遇到的参数分类疑问,我整理了清晰的解答如下:
1. SSE 与 SSEUP 类的区别,以及SSEUP中“高字节传递返回”的含义
- SSE类:这类参数是完全适配XMM等向量寄存器的类型,比如单个
float、double,或者__m128这类128位向量类型。它们会被完整存放在向量寄存器中(通常是整个寄存器空间),作为独立的完整参数单元传递/返回。 - SSEUP类:它是SSE类的“补充搭档”,不能单独作为参数类型存在。当参数大小超过一个向量寄存器容量(比如超过16字节的结构体),拆分后有部分数据需要放在向量寄存器的高64位时,这部分就会被标记为SSEUP类。
- 关于“可在向量寄存器高字节中传递和返回”的具体含义:这里的“高字节”实际指向量寄存器的高64位(以128位XMM寄存器为例)。举个例子,一个包含两个
double的结构体,第一个double会放在XMM寄存器的低64位(属于SSE类),第二个double就会放到同一个寄存器的高64位(属于SSEUP类),这样能高效利用寄存器空间,减少栈操作的开销。
2. X87、X87UP 与 COMPLEX_X87 类的区别
这三个分类虽然描述相近,但对应不同的x87 FPU使用场景,用来区分不同类型的参数传递方式:
- X87类:针对单个的x87扩展精度浮点数,比如
long double(x86-64下是80位)。这类参数会直接放入x87 FPU的栈顶寄存器ST0,作为独立的单值进行传递和返回。 - X87UP类:和SSEUP的角色类似,是X87类的补充。当一个参数需要占用多个x87寄存器时,除了放在ST0的X87类主数据,后续的部分会被标记为X87UP类,存到x87栈的下一层寄存器(比如ST1)。不过这种场景比较少见,因为x87寄存器主要用于单个扩展精度浮点数。
- COMPLEX_X87类:专门为复数类型的扩展精度浮点数设计,也就是
_Complex long double。这类参数的实部存在ST0,虚部存在ST1,整个复数通过x87的寄存器对来传递返回,这个分类明确了复数在x87寄存器中的存储规则。
内容的提问来源于stack exchange,提问作者Kevin_xie
相关产品推荐
相关产品推荐

