Fix issue in which CSR returns were incorrectly ordered.

This commit is contained in:
Tyler McMullen
2017-11-30 22:44:38 -08:00
committed by Jakob Stoklund Olesen
parent 6ec4bfc4ca
commit 2f3edc1bc6

View File

@@ -143,23 +143,27 @@ impl TargetIsa for Isa {
let total_stack_size = layout_stack(&mut func.stack_slots, word_size)?; let total_stack_size = layout_stack(&mut func.stack_slots, word_size)?;
let local_stack_size = total_stack_size - csr_stack_size; let local_stack_size = total_stack_size - csr_stack_size;
// Append frame pointer to function signature // Build up list of args, which we'll append forwards to the params and
let rbp_arg = ir::AbiParam::special_reg( // backwards to the returns.
let mut csr_args = Vec::new();
csr_args.push(ir::AbiParam::special_reg(
csr_type, csr_type,
ir::ArgumentPurpose::FramePointer, ir::ArgumentPurpose::FramePointer,
RU::rbp as RegUnit, RU::rbp as RegUnit,
); ));
func.signature.params.push(rbp_arg);
func.signature.returns.push(rbp_arg);
for reg in &csrs { for reg in &csrs {
let csr_arg = ir::AbiParam::special_reg( csr_args.push(ir::AbiParam::special_reg(
csr_type, csr_type,
ir::ArgumentPurpose::CalleeSaved, ir::ArgumentPurpose::CalleeSaved,
*reg as RegUnit, *reg as RegUnit,
); ));
func.signature.params.push(csr_arg); }
func.signature.returns.push(csr_arg);
for csr_arg in &csr_args {
func.signature.params.push(*csr_arg);
}
for csr_arg in csr_args.iter().rev() {
func.signature.returns.push(*csr_arg);
} }
// Append param to entry EBB // Append param to entry EBB