diff --git a/App/lib/core/Gen/AssignGenMixin.vp b/App/lib/core/Gen/AssignGenMixin.vp index 819af60..8379e88 100644 --- a/App/lib/core/Gen/AssignGenMixin.vp +++ b/App/lib/core/Gen/AssignGenMixin.vp @@ -121,9 +121,13 @@ novirtual class AssignGenMixin: t: int64 = res if res < 0: t = res ^ int64(-1) vw: int = 1 # 符号位 - while t != 0: + # 固定 64 次上界(i64 最多 64 位):不用 `while t != 0` —— 某些代码生成下 + # i64 的移位/比较不收敛,会死循环。 + bi: int = 0 + while bi < 64 and t > 0: vw += 1 t = t >> 1 + bi += 1 if vw > w: w = vw if w > 0: if w <= 8: bits_out[0] = 8 diff --git a/App/lib/core/Gen/Expr/ExprGenOps.vp b/App/lib/core/Gen/Expr/ExprGenOps.vp index d019bc7..a786e41 100644 --- a/App/lib/core/Gen/Expr/ExprGenOps.vp +++ b/App/lib/core/Gen/Expr/ExprGenOps.vp @@ -1358,9 +1358,13 @@ novirtual class ExprGenOps(ExprGenBase.ExprGenBase): t_cf: int64 = cf_v if cf_v < 0: t_cf = cf_v ^ int64(-1) vw_cf: int = 1 # 符号位 - while t_cf != 0: + # 固定 64 次上界(i64 最多 64 位):不用 `while t != 0` —— 某些代码生成下 + # i64 的移位/比较不收敛,会死循环(现场:主编译器卡死在 ExprGenOps 死循环里)。 + bi_cf: int = 0 + while bi_cf < 64 and t_cf > 0: vw_cf += 1 t_cf = t_cf >> 1 + bi_cf += 1 if vw_cf > cf_w: cf_w = vw_cf if cf_w <= 8: cf_w = 8 elif cf_w <= 16: cf_w = 16