diff --git a/compiler/gen_dev/src/generic64/storage.rs b/compiler/gen_dev/src/generic64/storage.rs index 8f874d7462..1334e5ae7c 100644 --- a/compiler/gen_dev/src/generic64/storage.rs +++ b/compiler/gen_dev/src/generic64/storage.rs @@ -733,15 +733,6 @@ impl< let reg = self.load_to_float_reg(buf, sym); ASM::mov_base32_freg64(buf, to_offset, reg); } - Layout::Builtin(Builtin::Str | Builtin::List(_)) => { - let (from_offset, _) = self.stack_offset_and_size(sym); - self.with_tmp_general_reg(buf, |_storage_manager, buf, reg| { - ASM::mov_reg64_base32(buf, reg, from_offset); - ASM::mov_base32_reg64(buf, to_offset, reg); - ASM::mov_reg64_base32(buf, reg, from_offset + 8); - ASM::mov_base32_reg64(buf, to_offset + 8, reg); - }); - } _ if layout.stack_size(self.target_info) == 0 => {} _ if layout.safe_to_memcpy() && layout.stack_size(self.target_info) > 8 => { let (from_offset, size) = self.stack_offset_and_size(sym); diff --git a/compiler/gen_dev/src/generic64/x86_64.rs b/compiler/gen_dev/src/generic64/x86_64.rs index a3cb970d97..4d0e5a4360 100644 --- a/compiler/gen_dev/src/generic64/x86_64.rs +++ b/compiler/gen_dev/src/generic64/x86_64.rs @@ -200,7 +200,7 @@ impl CallConv for X86_64Syste #[inline(always)] fn load_args<'a>( - buf: &mut Vec<'a, u8>, + _buf: &mut Vec<'a, u8>, storage_manager: &mut StorageManager< 'a, X86_64GeneralReg, @@ -239,19 +239,6 @@ impl CallConv for X86_64Syste arg_offset += 8; } } - Layout::Builtin(Builtin::Str | Builtin::List(_)) => { - if general_i + 1 < Self::GENERAL_PARAM_REGS.len() { - // Load the value from the param reg into a useable base offset. - let src1 = Self::GENERAL_PARAM_REGS[general_i]; - let src2 = Self::GENERAL_PARAM_REGS[general_i + 1]; - let base_offset = storage_manager.claim_stack_area(sym, 16); - X86_64Assembler::mov_base32_reg64(buf, base_offset, src1); - X86_64Assembler::mov_base32_reg64(buf, base_offset + 8, src2); - general_i += 2; - } else { - todo!("loading lists and strings args on the stack"); - } - } _ if stack_size == 0 => { storage_manager.no_data_arg(sym); } @@ -347,37 +334,25 @@ impl CallConv for X86_64Syste tmp_stack_offset += 8; } } - Layout::Builtin(Builtin::Str | Builtin::List(_)) => { - if general_i + 1 < Self::GENERAL_PARAM_REGS.len() { - let (base_offset, _size) = storage_manager.stack_offset_and_size(sym); - debug_assert_eq!(base_offset % 8, 0); - X86_64Assembler::mov_reg64_base32( - buf, - Self::GENERAL_PARAM_REGS[general_i], - base_offset, - ); - X86_64Assembler::mov_reg64_base32( - buf, - Self::GENERAL_PARAM_REGS[general_i + 1], - base_offset + 8, - ); - general_i += 2; - } else { - todo!("calling functions with strings on the stack"); - } - } x if x.stack_size(TARGET_INFO) == 0 => {} x if x.stack_size(TARGET_INFO) > 16 => { // TODO: Double check this. // Just copy onto the stack. + // Use return reg as buffer because it will be empty right now. let (base_offset, size) = storage_manager.stack_offset_and_size(sym); debug_assert_eq!(base_offset % 8, 0); - storage_manager.with_tmp_general_reg(buf, |_storage_manager, buf, reg| { - for i in (0..size as i32).step_by(8) { - X86_64Assembler::mov_reg64_base32(buf, reg, base_offset + i); - X86_64Assembler::mov_stack32_reg64(buf, tmp_stack_offset + i, reg); - } - }); + for i in (0..size as i32).step_by(8) { + X86_64Assembler::mov_reg64_base32( + buf, + Self::GENERAL_RETURN_REGS[0], + base_offset + i, + ); + X86_64Assembler::mov_stack32_reg64( + buf, + tmp_stack_offset + i, + Self::GENERAL_RETURN_REGS[0], + ); + } tmp_stack_offset += size as i32; } x => { @@ -404,16 +379,6 @@ impl CallConv for X86_64Syste single_register_layouts!() => { internal_error!("single register layouts are not complex symbols"); } - Layout::Builtin(Builtin::Str | Builtin::List(_)) => { - let (base_offset, _size) = storage_manager.stack_offset_and_size(sym); - debug_assert_eq!(base_offset % 8, 0); - X86_64Assembler::mov_reg64_base32(buf, Self::GENERAL_RETURN_REGS[0], base_offset); - X86_64Assembler::mov_reg64_base32( - buf, - Self::GENERAL_RETURN_REGS[1], - base_offset + 8, - ); - } x if x.stack_size(TARGET_INFO) == 0 => {} x if !Self::returns_via_arg_pointer(x) => { let (base_offset, size) = storage_manager.stack_offset_and_size(sym); @@ -470,11 +435,6 @@ impl CallConv for X86_64Syste single_register_layouts!() => { internal_error!("single register layouts are not complex symbols"); } - Layout::Builtin(Builtin::Str | Builtin::List(_)) => { - let offset = storage_manager.claim_stack_area(sym, 16); - X86_64Assembler::mov_base32_reg64(buf, offset, Self::GENERAL_RETURN_REGS[0]); - X86_64Assembler::mov_base32_reg64(buf, offset + 8, Self::GENERAL_RETURN_REGS[1]); - } x if x.stack_size(TARGET_INFO) == 0 => {} x if !Self::returns_via_arg_pointer(x) => { let size = layout.stack_size(TARGET_INFO); @@ -670,10 +630,6 @@ impl CallConv for X86_64Windo storage_manager.float_reg_arg(sym, Self::FLOAT_PARAM_REGS[i]); i += 1; } - Layout::Builtin(Builtin::Str) => { - // I think this just needs to be passed on the stack, so not a huge deal. - todo!("Passing str args with Windows fast call"); - } x if x.stack_size(TARGET_INFO) == 0 => {} x => { todo!("Loading args with layout {:?}", x); @@ -760,10 +716,6 @@ impl CallConv for X86_64Windo tmp_stack_offset += 8; } } - Layout::Builtin(Builtin::Str | Builtin::List(_)) => { - // I think this just needs to be passed on the stack, so not a huge deal. - todo!("Passing str args with Windows fast call"); - } x if x.stack_size(TARGET_INFO) == 0 => {} x => { todo!("calling with arg type, {:?}", x);