This commit is contained in:
Folkert 2023-10-09 15:40:28 +02:00
parent b39c592bea
commit c0d67edfd3
No known key found for this signature in database
GPG key ID: 1F17F6FFD112B97C
5 changed files with 12 additions and 19 deletions

View file

@ -510,6 +510,7 @@ impl CallConv<AArch64GeneralReg, AArch64FloatReg, AArch64Assembler> for AArch64C
args: &'a [(InLayout<'a>, Symbol)],
ret_layout: &InLayout<'a>,
) {
// loading arguments occurs at an offset (but storing arguments does not)
let mut state = AArch64CallLoadArgs {
general_i: 0,
float_i: 0,
@ -550,6 +551,7 @@ impl CallConv<AArch64GeneralReg, AArch64FloatReg, AArch64Assembler> for AArch64C
);
}
// storing arguments does not have a stack offset (loading arguments does)
let mut state = AArch64CallStoreArgs {
general_i: 0,
float_i: 0,
@ -1137,9 +1139,7 @@ impl AArch64CallStoreArgs {
self.general_i += 1;
}
None => {
// Copy to stack using return reg as buffer.
let tmp = AArch64GeneralReg::X15;
ASM::mov_reg64_base32(buf, tmp, offset);
ASM::mov_stack32_reg64(buf, self.tmp_stack_offset, tmp);
@ -1167,9 +1167,7 @@ impl AArch64CallStoreArgs {
self.general_i += 2;
} else {
// Copy to stack using return reg as buffer.
let reg = AArch64GeneralReg::X15;
ASM::mov_reg64_base32(buf, reg, offset);
ASM::mov_stack32_reg64(buf, self.tmp_stack_offset, reg);

View file

@ -3184,6 +3184,12 @@ impl<
let mut element_symbols = std::vec::Vec::new();
// NOTE: this realizes all the list elements on the stack before they are put into the
// list. This turns out to be important. Creating the literals as we go causes issues with
// register usage.
//
// Of course this is inefficient when there are many elements (causes lots of stack
// spillage.
for (i, elem) in elements.iter().enumerate() {
match elem {
ListLiteralElement::Symbol(sym) => {
@ -3228,11 +3234,9 @@ impl<
}
// Setup list on stack.
dbg!("we will now be putting things onto the stack");
self.storage_manager.with_tmp_general_reg(
&mut self.buf,
|storage_manager, buf, tmp_reg| {
dbg!(tmp_reg);
let alignment = Ord::max(8, element_alignment) as u32;
let base_offset =
storage_manager.claim_stack_area_with_alignment(*sym, 24, alignment);

View file

@ -2039,6 +2039,8 @@ impl Assembler<X86_64GeneralReg, X86_64FloatReg> for X86_64Assembler {
name: fn_name,
});
// on X86_64, we actually get a pointer to a pointer
// so we just dereference to get just a pointer to the data
X86_64Assembler::mov_reg64_mem64_offset32(buf, dst, dst, 0);
}