fix(viperc): 浮点常量按目标类型/声明宽度直接出 f32,不再先出 double

- 浮点字面量在 f32 目标(float(1.5) / x: float = 1.5 / f32 形参)下直接物化 f32 常量,
  负号折叠(-c)同口径;去掉旧的「f64 常量 + fptrunc」
- CDefine 浮点条目记录宽度种类(1=f64 / 2=f32):define PI: float = ... 的使用处
  直接出 f32 常量,与 f32 字面量混算不再被提升成 double(现场 33 处 cvtss2sd)
- 本模块注册 / pyi·vpi 跨模块重解析 / xmod 缓存三处都按注解裁决宽度,保持跨模块一致
This commit is contained in:
TermiNexus committed 2026-10-15 18:35:48 +08:00
1 parent 3a687db0bb
commit 508428bbc9
12 files changed
+202 -29

No files matched your search

+6 -2
View File
@@ -2092,7 +2092,10 @@ def _vpi_register_typedef_closure(pool: memhub.MemBuddy*, import_mods: str, temp
if cdef_t.id is None: continue
if aa_r.value.kind() == ast.ASTKind.Constant:
cn_v: ast.Constant* = ast.Constant*(aa_r.value)
if cn_v.const_kind == ast.CONST_FLOAT: GenApi.register_cdefine_double(pool, cdef_t.id, cn_v.float_val)
if cn_v.const_kind == ast.CONST_FLOAT:
# 浮点宽度同样由声明注解裁决(与定义方同一套),
# 否则 `define PI: float = ...` 的使用方会把 f32 当 double
GenApi.register_cdefine_double(pool, cdef_t.id, cn_v.float_val, GenApi.cdefine_decl_float_bits(pool, aa_r.annotation))
elif cn_v.const_kind == ast.CONST_INT:
cdef_val: int64 = GenApi.extract_cdefine_int_value(aa_r.value)
# 位宽与定义方同一套裁决(注解 → 右侧强转 → 值的最小可存宽度),
@@ -2421,7 +2424,8 @@ def _ParseVpiIntoModuleImpl(pool: memhub.MemBuddy*, mod: mlirlite.LLVMModule*, v
if cdef_is_str == 0 and cdef_is_float != 0:
# Float CDefine (e.g. FRAGMENTATION_THRESHOLD: t.CDefine = 0.7): register via
# register_cdefine_double (integer extraction would fail fast).
GenApi.register_cdefine_double(pool, cdef_tgt.id, cdef_float_val)
# 注解声明 float 时带上 f32 种类(与定义方同一套裁决)。
GenApi.register_cdefine_double(pool, cdef_tgt.id, cdef_float_val, GenApi.cdefine_decl_float_bits(pool, aa.annotation))
elif cdef_is_str == 0:
cdef_val: int64 = GenApi.extract_cdefine_int_value(aa.value)
# 位宽与定义方同一套裁决(注解 → 右侧强转 → 值的最小可存宽度)