mirror of
https://github.com/roc-lang/roc.git
synced 2025-09-27 13:59:08 +00:00
changes after review
This commit is contained in:
parent
0b03a0bc26
commit
654cf7b861
17 changed files with 142 additions and 123 deletions
|
@ -2791,14 +2791,7 @@ impl<
|
|||
.storage_manager
|
||||
.load_to_general_reg(&mut self.buf, structure);
|
||||
|
||||
let mask_symbol = self.debug_symbol("tag_id_mask");
|
||||
let mask_reg = self
|
||||
.storage_manager
|
||||
.claim_general_reg(&mut self.buf, &mask_symbol);
|
||||
ASM::mov_reg64_imm64(&mut self.buf, mask_reg, (!0b111) as _);
|
||||
|
||||
// mask out the tag id bits
|
||||
ASM::and_reg64_reg64_reg64(&mut self.buf, mask_reg, ptr_reg, mask_reg);
|
||||
let (mask_symbol, mask_reg) = self.clear_tag_id(ptr_reg);
|
||||
|
||||
let mut offset = 0;
|
||||
for field in &other_fields[..index as usize] {
|
||||
|
@ -2814,6 +2807,8 @@ impl<
|
|||
element_layout,
|
||||
*sym,
|
||||
);
|
||||
|
||||
self.free_symbol(&mask_symbol)
|
||||
}
|
||||
UnionLayout::Recursive(tag_layouts) => {
|
||||
let other_fields = tag_layouts[tag_id as usize];
|
||||
|
@ -2824,22 +2819,13 @@ impl<
|
|||
.load_to_general_reg(&mut self.buf, structure);
|
||||
|
||||
// mask out the tag id bits
|
||||
let unmasked_reg = if union_layout
|
||||
.stores_tag_id_as_data(self.storage_manager.target_info)
|
||||
{
|
||||
ptr_reg
|
||||
} else {
|
||||
let umasked_symbol = self.debug_symbol("unmasked");
|
||||
let unmasked_reg = self
|
||||
.storage_manager
|
||||
.claim_general_reg(&mut self.buf, &umasked_symbol);
|
||||
|
||||
ASM::mov_reg64_imm64(&mut self.buf, unmasked_reg, (!0b111) as _);
|
||||
|
||||
ASM::and_reg64_reg64_reg64(&mut self.buf, unmasked_reg, ptr_reg, unmasked_reg);
|
||||
|
||||
unmasked_reg
|
||||
};
|
||||
let (unmasked_symbol, unmasked_reg) =
|
||||
if union_layout.stores_tag_id_as_data(self.storage_manager.target_info) {
|
||||
(None, ptr_reg)
|
||||
} else {
|
||||
let (mask_symbol, mask_reg) = self.clear_tag_id(ptr_reg);
|
||||
(Some(mask_symbol), mask_reg)
|
||||
};
|
||||
|
||||
let mut offset = 0;
|
||||
for field in &other_fields[..index as usize] {
|
||||
|
@ -2855,6 +2841,10 @@ impl<
|
|||
element_layout,
|
||||
*sym,
|
||||
);
|
||||
|
||||
if let Some(unmasked_symbol) = unmasked_symbol {
|
||||
self.free_symbol(&unmasked_symbol);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2911,14 +2901,7 @@ impl<
|
|||
other_tags[tag_id as usize - 1]
|
||||
};
|
||||
|
||||
let mask_symbol = self.debug_symbol("tag_id_mask");
|
||||
let mask_reg = self
|
||||
.storage_manager
|
||||
.claim_general_reg(&mut self.buf, &mask_symbol);
|
||||
ASM::mov_reg64_imm64(&mut self.buf, mask_reg, (!0b111) as _);
|
||||
|
||||
// mask out the tag id bits
|
||||
ASM::and_reg64_reg64_reg64(&mut self.buf, mask_reg, ptr_reg, mask_reg);
|
||||
let (mask_symbol, mask_reg) = self.clear_tag_id(ptr_reg);
|
||||
|
||||
let mut offset = 0;
|
||||
for field in &other_fields[..index as usize] {
|
||||
|
@ -2926,6 +2909,8 @@ impl<
|
|||
}
|
||||
|
||||
ASM::add_reg64_reg64_imm32(&mut self.buf, sym_reg, mask_reg, offset as i32);
|
||||
|
||||
self.free_symbol(&mask_symbol);
|
||||
}
|
||||
UnionLayout::Recursive(tag_layouts) => {
|
||||
let other_fields = tag_layouts[tag_id as usize];
|
||||
|
@ -2935,22 +2920,13 @@ impl<
|
|||
.load_to_general_reg(&mut self.buf, structure);
|
||||
|
||||
// mask out the tag id bits
|
||||
let unmasked_reg = if union_layout
|
||||
.stores_tag_id_as_data(self.storage_manager.target_info)
|
||||
{
|
||||
ptr_reg
|
||||
} else {
|
||||
let umasked_symbol = self.debug_symbol("unmasked");
|
||||
let unmasked_reg = self
|
||||
.storage_manager
|
||||
.claim_general_reg(&mut self.buf, &umasked_symbol);
|
||||
|
||||
ASM::mov_reg64_imm64(&mut self.buf, unmasked_reg, (!0b111) as _);
|
||||
|
||||
ASM::and_reg64_reg64_reg64(&mut self.buf, unmasked_reg, ptr_reg, unmasked_reg);
|
||||
|
||||
unmasked_reg
|
||||
};
|
||||
let (unmasked_symbol, unmasked_reg) =
|
||||
if union_layout.stores_tag_id_as_data(self.storage_manager.target_info) {
|
||||
(None, ptr_reg)
|
||||
} else {
|
||||
let (mask_symbol, mask_reg) = self.clear_tag_id(ptr_reg);
|
||||
(Some(mask_symbol), mask_reg)
|
||||
};
|
||||
|
||||
let mut offset = 0;
|
||||
for field in &other_fields[..index as usize] {
|
||||
|
@ -2958,6 +2934,10 @@ impl<
|
|||
}
|
||||
|
||||
ASM::add_reg64_reg64_imm32(&mut self.buf, sym_reg, unmasked_reg, offset as i32);
|
||||
|
||||
if let Some(unmasked_symbol) = unmasked_symbol {
|
||||
self.free_symbol(&unmasked_symbol);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -3986,6 +3966,19 @@ impl<
|
|||
CC: CallConv<GeneralReg, FloatReg, ASM>,
|
||||
> Backend64Bit<'a, 'r, GeneralReg, FloatReg, ASM, CC>
|
||||
{
|
||||
fn clear_tag_id(&mut self, ptr_reg: GeneralReg) -> (Symbol, GeneralReg) {
|
||||
let unmasked_symbol = self.debug_symbol("unmasked");
|
||||
let unmasked_reg = self
|
||||
.storage_manager
|
||||
.claim_general_reg(&mut self.buf, &unmasked_symbol);
|
||||
|
||||
ASM::mov_reg64_imm64(&mut self.buf, unmasked_reg, (!0b111) as _);
|
||||
|
||||
ASM::and_reg64_reg64_reg64(&mut self.buf, unmasked_reg, ptr_reg, unmasked_reg);
|
||||
|
||||
(unmasked_symbol, unmasked_reg)
|
||||
}
|
||||
|
||||
fn compare(
|
||||
&mut self,
|
||||
op: CompareOperation,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue