Baldrdash: implement support for sign-extension in returns;
This commit is contained in:
@@ -6,8 +6,8 @@ use crate::entity::SecondaryMap;
|
||||
use crate::inst_predicates::has_side_effect;
|
||||
use crate::ir::instructions::BranchInfo;
|
||||
use crate::ir::{
|
||||
Block, ExternalName, Function, GlobalValueData, Inst, InstructionData, MemFlags, Opcode,
|
||||
Signature, SourceLoc, Type, Value, ValueDef,
|
||||
ArgumentExtension, Block, ExternalName, Function, GlobalValueData, Inst, InstructionData,
|
||||
MemFlags, Opcode, Signature, SourceLoc, Type, Value, ValueDef,
|
||||
};
|
||||
use crate::machinst::{ABIBody, BlockIndex, VCode, VCodeBuilder, VCodeInst};
|
||||
use crate::num_uses::NumUses;
|
||||
@@ -116,7 +116,7 @@ pub struct Lower<'func, I: VCodeInst> {
|
||||
value_regs: SecondaryMap<Value, Reg>,
|
||||
|
||||
/// Return-value vregs.
|
||||
retval_regs: Vec<Reg>,
|
||||
retval_regs: Vec<(Reg, ArgumentExtension)>,
|
||||
|
||||
/// Next virtual register number to allocate.
|
||||
next_vreg: u32,
|
||||
@@ -190,7 +190,7 @@ impl<'func, I: VCodeInst> Lower<'func, I> {
|
||||
next_vreg += 1;
|
||||
let regclass = I::rc_for_type(ret.value_type);
|
||||
let vreg = Reg::new_virtual(regclass, v);
|
||||
retval_regs.push(vreg);
|
||||
retval_regs.push((vreg, ret.extension));
|
||||
vcode.set_vreg_type(vreg.as_virtual_reg().unwrap(), ret.value_type);
|
||||
}
|
||||
|
||||
@@ -220,9 +220,12 @@ impl<'func, I: VCodeInst> Lower<'func, I> {
|
||||
}
|
||||
|
||||
fn gen_retval_setup(&mut self, gen_ret_inst: GenerateReturn) {
|
||||
for (i, reg) in self.retval_regs.iter().enumerate() {
|
||||
let insn = self.vcode.abi().gen_copy_reg_to_retval(i, *reg);
|
||||
self.vcode.push(insn);
|
||||
for (i, (reg, ext)) in self.retval_regs.iter().enumerate() {
|
||||
let reg = Writable::from_reg(*reg);
|
||||
let insns = self.vcode.abi().gen_copy_reg_to_retval(i, reg, *ext);
|
||||
for insn in insns {
|
||||
self.vcode.push(insn);
|
||||
}
|
||||
}
|
||||
let inst = match gen_ret_inst {
|
||||
GenerateReturn::Yes => self.vcode.abi().gen_ret(),
|
||||
@@ -640,7 +643,7 @@ impl<'func, I: VCodeInst> LowerCtx for Lower<'func, I> {
|
||||
|
||||
/// Get the register for a return value.
|
||||
fn retval(&self, idx: usize) -> Writable<Reg> {
|
||||
Writable::from_reg(self.retval_regs[idx])
|
||||
Writable::from_reg(self.retval_regs[idx].0)
|
||||
}
|
||||
|
||||
/// Get the target for a call instruction, as an `ExternalName`.
|
||||
|
||||
Reference in New Issue
Block a user