pass floats independently of general registers

This commit is contained in:
Folkert 2023-05-02 01:05:44 +02:00
parent cd8c865a66
commit e4b0d77f2e
No known key found for this signature in database
GPG key ID: 1F17F6FFD112B97C
3 changed files with 33 additions and 13 deletions

View file

@ -2336,7 +2336,10 @@ impl<
// Refactor this and switch to one external match.
// We also could make loadining indivitual literals much faster
let element_symbol = match elem {
ListLiteralElement::Symbol(sym) => *sym,
ListLiteralElement::Symbol(sym) => {
self.load_literal_symbols(&[*sym]);
*sym
}
ListLiteralElement::Literal(lit) => {
self.load_literal(&Symbol::DEV_TMP, element_in_layout, lit);
Symbol::DEV_TMP

View file

@ -724,8 +724,8 @@ impl X64_64SystemVLoadArgs {
storage_manager: &mut X86_64StorageManager<'_, '_, X86_64SystemV>,
sym: Symbol,
) {
if self.general_i < X86_64SystemV::GENERAL_PARAM_REGS.len() {
let reg = X86_64SystemV::FLOAT_PARAM_REGS[self.general_i];
if self.float_i < X86_64SystemV::FLOAT_PARAM_REGS.len() {
let reg = X86_64SystemV::FLOAT_PARAM_REGS[self.float_i];
storage_manager.float_reg_arg(&sym, reg);
self.float_i += 1;
} else {
@ -942,15 +942,21 @@ impl CallConv<X86_64GeneralReg, X86_64FloatReg, X86_64Assembler> for X86_64Windo
storage_manager.claim_stack_area(dst, layout_interner.stack_size(*ret_layout));
todo!("claim first parama reg for the address");
}
for (i, (sym, layout)) in args.iter().zip(arg_layouts.iter()).enumerate() {
let mut general_registers_used = 0;
let mut float_registers_used = 0;
for (_, (sym, layout)) in args.iter().zip(arg_layouts.iter()).enumerate() {
match *layout {
single_register_integers!() => {
if i < Self::GENERAL_PARAM_REGS.len() {
if general_registers_used < Self::GENERAL_PARAM_REGS.len() {
storage_manager.load_to_specified_general_reg(
buf,
sym,
Self::GENERAL_PARAM_REGS[i],
Self::GENERAL_PARAM_REGS[general_registers_used],
);
general_registers_used += 1;
} else {
// Copy to stack using return reg as buffer.
storage_manager.load_to_specified_general_reg(
@ -967,12 +973,14 @@ impl CallConv<X86_64GeneralReg, X86_64FloatReg, X86_64Assembler> for X86_64Windo
}
}
single_register_floats!() => {
if i < Self::FLOAT_PARAM_REGS.len() {
if float_registers_used < Self::FLOAT_PARAM_REGS.len() {
storage_manager.load_to_specified_float_reg(
buf,
sym,
Self::FLOAT_PARAM_REGS[i],
Self::FLOAT_PARAM_REGS[float_registers_used],
);
float_registers_used += 1;
} else {
// Copy to stack using return reg as buffer.
storage_manager.load_to_specified_float_reg(

View file

@ -1572,14 +1572,23 @@ fn list_join_one_empty_list() {
}
#[test]
#[cfg(any(feature = "gen-llvm", feature = "gen-wasm"))]
#[cfg(any(feature = "gen-llvm", feature = "gen-wasm", feature = "gen-dev"))]
fn list_single() {
assert_evals_to!("List.single 1", RocList::from_slice(&[1]), RocList<i64>);
assert_evals_to!("List.single 5.6", RocList::from_slice(&[5.6]), RocList<f64>);
assert_evals_to!(
"List.single 5.6f32",
RocList::from_slice(&[5.6]),
RocList<f32>
);
assert_evals_to!(
"List.single 5.6f64",
RocList::from_slice(&[5.6]),
RocList<f64>
);
}
#[test]
#[cfg(any(feature = "gen-llvm", feature = "gen-wasm"))]
#[cfg(any(feature = "gen-llvm", feature = "gen-wasm", feature = "gen-dev"))]
fn list_repeat() {
assert_evals_to!(
"List.repeat 1 5",
@ -1654,7 +1663,7 @@ fn list_reverse_empty_list_of_int() {
}
#[test]
#[cfg(any(feature = "gen-llvm", feature = "gen-wasm"))]
#[cfg(any(feature = "gen-llvm", feature = "gen-wasm", feature = "gen-dev"))]
fn list_reverse_empty_list() {
assert_evals_to!(
"List.reverse []",
@ -1732,7 +1741,7 @@ fn list_concat_two_non_empty_lists() {
}
#[test]
#[cfg(any(feature = "gen-llvm", feature = "gen-wasm"))]
#[cfg(any(feature = "gen-llvm", feature = "gen-wasm", feature = "gen-dev"))]
fn list_concat_two_bigger_non_empty_lists() {
assert_evals_to!(
"List.concat [1.1, 2.2] [3.3, 4.4, 5.5]",