AArch64 SIMD指令是否零/符号扩展结果?未覆盖寄存器位处理疑问
AArch64 SIMD指令未覆盖寄存器位的处理规则
针对abs v31.2s,v13.2s的行为结论
abs v31.2s,v13.2s指令执行后,v31的高64位不会被清零,会保持指令执行前的原值。
该指令操作2个单精度浮点元素(共64位),属于NEON窄元素算术指令。ARM架构规范中,这类仅操作寄存器低部元素的算术/逻辑指令,未被显式处理的高位寄存器内容不会被修改——伪代码中未初始化result的高位部分,是因为这部分的保留行为属于架构通用规则,无需在单条指令的伪代码中重复说明。
通用规则:并非所有未覆盖完整寄存器的指令都会修改高位
需要区分不同指令类型:
- 算术/逻辑类窄操作指令(如
abs、add、mul等,使用.2s/.1s等窄操作符):未操作的高位部分保持原值不变。 - 广播/填充类指令、部分特殊加载指令:这类指令会覆盖整个寄存器,比如将单个元素广播到寄存器所有位置,此时高位会被对应元素值覆盖;部分清零指令则会直接清空整个寄存器。
- 若指令使用完整寄存器宽度的操作符(如
.4s对应128位V寄存器),则会覆盖寄存器全部位。
内容的提问来源于stack exchange,提问作者John Källen
相关产品推荐
相关产品推荐

