fixing wide return value

This commit is contained in:
mlokr 2024-09-17 15:25:31 +02:00
parent 74eca58a91
commit afd3c2b506

View file

@ -1369,24 +1369,32 @@ impl Codegen {
tk => Some(Value::ty(tk.compress())), tk => Some(Value::ty(tk.compress())),
}, },
E::Return { pos, val, .. } => { E::Return { pos, val, .. } => {
let ty = if let Some(val) = val {
let size = self.ci.ret.map_or(17, |ty| self.tys.size_of(ty)); let size = self.ci.ret.map_or(17, |ty| self.tys.size_of(ty));
let loc = match size { let loc = match size {
_ if self.ci.inline_ret_loc != Loc::default() => { _ if self.ci.inline_ret_loc != Loc::default() => {
Some(self.ci.inline_ret_loc.as_ref()) Some(self.ci.inline_ret_loc.as_ref())
} }
0 => None, 0 => None,
1..=16 => Some(Loc::reg(1)), 1..=8 => Some(Loc::reg(1)),
9..=16 => None,
_ => Some(Loc::reg(self.ci.ret_reg.as_ref()).into_derefed()), _ => Some(Loc::reg(self.ci.ret_reg.as_ref()).into_derefed()),
}; };
self.expr_ctx(val, Ctx { ty: self.ci.ret, loc })?.ty let loc_is_none = loc.is_none();
let value = if let Some(val) = val {
self.expr_ctx(val, Ctx { ty: self.ci.ret, loc })?
} else { } else {
ty::VOID.into() Value::void()
}; };
match self.ci.ret { match self.ci.ret {
None => self.ci.ret = Some(ty), None => self.ci.ret = Some(value.ty),
Some(ret) => _ = self.assert_ty(pos, ty, ret, "return type"), Some(ret) => _ = self.assert_ty(pos, value.ty, ret, "return type"),
}
if let 9..=16 = size
&& loc_is_none
{
self.store_sized(value.loc, Loc::reg(1), size);
} }
self.ci.ret_relocs.push(Reloc::new(self.ci.code.len(), 1, 4)); self.ci.ret_relocs.push(Reloc::new(self.ci.code.len(), 1, 4));