From 2a25159b7e5f7f94300aa68251a3598ed4fed824 Mon Sep 17 00:00:00 2001 From: lemon Date: Thu, 25 Aug 2022 18:39:29 +0200 Subject: vararg promotion --- src/llvm.cff | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/llvm.cff b/src/llvm.cff index e23b65d..a33ca56 100644 --- a/src/llvm.cff +++ b/src/llvm.cff @@ -776,8 +776,16 @@ fn genexpr(f *Fn, ex *Expr) Value { let fnty = &(lhs.ty->is(:Ptr) ? lhs.ty.u.Ptr : lhs.ty).u.Fn; let args *Value = xcalloc(call.args.#len, sizeof Value); defer free(args); + + fn varargpromote(ty *const Type) *const Type { + if ty->is(:Bool) { return ty_int; }; + if ty->is(:Int) { return typeof2(ty, ty); } + if ty->is(:Flo) and ty.size < 8 { return ty_f64; } + return ty; + } + foreach_ptr(arg, i, call.args) { - let ty = i < fnty.params.#len ? fnty.params[i] : typeof2(arg.ty, arg.ty); + let ty = i < fnty.params.#len ? fnty.params[i] : varargpromote(arg.ty); args[i] = convert(f, ty, arg); } let t Value #?; @@ -789,7 +797,7 @@ fn genexpr(f *Fn, ex *Expr) Value { gen("\t%v = call %t %v(", t, call.lhs.ty, lhs); } foreach_ptr(arg, i, call.args) { - let ty = i < fnty.params.#len ? fnty.params[i] : typeof2(arg.ty, arg.ty); + let ty = i < fnty.params.#len ? fnty.params[i] : varargpromote(arg.ty); gen("%t %v", ty, args[i]); if i < call.args.#len - 1 { gen(", "); -- cgit v1.2.3