Skip to content

fix: ARM64 RA rewrite 物化超出单指令编码范围的栈槽位移

mr cino requested to merge fix/arm64-jit-large-stack-displacement into master

当函数栈帧过深(如数千个同时存活的溢出虚寄存器导致 local_stack > 32KB), 栈槽偏移可能超出 ARM64 单条 ldr/str 指令的立即数编码范围 (scaled [0, 4095*size]、unscaled [-256, 255] 的并集)。

此前 rewrite 阶段直接将 reg-home 内存操作数的位移写入指令, 导致汇编器报 InvalidDisplacement(如 stur x0, [sp, 32824])。

修复:rewrite 时检测偏移是否可编码;若不可编码,则用 scratch 寄存器 (x28,或 x27 当 x28 为本指令值寄存器时)通过 1–2 条 add/sub 计算 有效地址 base+offset,再将内存操作数改为间接寻址 [scratch]。位移 分解复用 prolog/epilog 的 0xFFF|0xFFF000 两步模式。

Merge request reports