From c47209c54af51a77b3e650fac59e8ed108562f2c Mon Sep 17 00:00:00 2001 From: Brendan Hansknecht Date: Sat, 19 Feb 2022 16:48:27 -0800 Subject: [PATCH] add copying any memcpy-able symbols to a stack offset --- compiler/gen_dev/src/generic64/storage.rs | 34 ++++++++--------------- compiler/gen_dev/src/lib.rs | 2 +- 2 files changed, 13 insertions(+), 23 deletions(-) diff --git a/compiler/gen_dev/src/generic64/storage.rs b/compiler/gen_dev/src/generic64/storage.rs index 9bc2dac2c8..8f4f075ec5 100644 --- a/compiler/gen_dev/src/generic64/storage.rs +++ b/compiler/gen_dev/src/generic64/storage.rs @@ -701,28 +701,18 @@ impl< ASM::mov_base32_reg64(buf, to_offset + 8, reg); }); } - // Layout::Struct(_) if layout.safe_to_memcpy() => { - // // self.storage_manager.with_tmp_float_reg(&mut self.buf, |buf, storage, ) - // // if let Some(SymbolStorage::Base { - // // offset: from_offset, - // // size, - // // .. - // // }) = self.symbol_storage_map.get(sym) - // // { - // // debug_assert_eq!( - // // *size, - // // layout.stack_size(self.target_info), - // // "expected struct to have same size as data being stored in it" - // // ); - // // for i in 0..layout.stack_size(self.target_info) as i32 { - // // ASM::mov_reg64_base32(&mut self.buf, tmp_reg, from_offset + i); - // // ASM::mov_base32_reg64(&mut self.buf, to_offset + i, tmp_reg); - // // } - // todo!() - // } else { - // internal_error!("unknown struct: {:?}", sym); - // } - // } + _ if layout.safe_to_memcpy() => { + let (from_offset, size) = self.stack_offset_and_size(sym); + debug_assert!(from_offset % 8 == 0); + debug_assert!(size % 8 == 0); + debug_assert_eq!(size, layout.stack_size(self.target_info)); + self.with_tmp_general_reg(buf, |_storage_manager, buf, reg| { + for i in (0..size as i32).step_by(8) { + ASM::mov_reg64_base32(buf, reg, from_offset + i); + ASM::mov_base32_reg64(buf, to_offset + i, reg); + } + }); + } x => todo!("copying data to the stack with layout, {:?}", x), } } diff --git a/compiler/gen_dev/src/lib.rs b/compiler/gen_dev/src/lib.rs index 0989a47088..a67236d294 100644 --- a/compiler/gen_dev/src/lib.rs +++ b/compiler/gen_dev/src/lib.rs @@ -626,7 +626,7 @@ trait Backend<'a> { self.build_eq(sym, &args[0], &Symbol::DEV_TMP, &arg_layouts[0]); self.free_symbol(&Symbol::DEV_TMP) } - Symbol::LIST_GET => { + Symbol::LIST_GET | Symbol::LIST_SET => { // TODO: This is probably simple enough to be worth inlining. let layout_id = LayoutIds::default().get(func_sym, ret_layout); let fn_name = self.symbol_to_string(func_sym, layout_id);