Skip to content

Commit

Permalink
Be somewhat clearer about upper bits in the codegen.
Browse files Browse the repository at this point in the history
This is a bit of a hodgepodge of changes, but there are three major
things:

  1. Get rid of all the "weird" sized ints, none of which we see in
     practise, and which we thus have low confidence are correct.
  2. Simplify some of the zero extension stuff.
  3. Zero extend all values to 64 bits before a call. We do this
     crudely for now.
  • Loading branch information
ltratt committed Jan 22, 2025
1 parent a70179c commit 4b3b0ca
Show file tree
Hide file tree
Showing 4 changed files with 233 additions and 315 deletions.
32 changes: 18 additions & 14 deletions ykrt/src/compile/jitc_yk/codegen/x64/lsregalloc.rs
Original file line number Diff line number Diff line change
Expand Up @@ -829,15 +829,17 @@ impl LSRegAlloc<'_> {
RegState::FromInst(iidx) => {
if self.spills[usize::from(iidx)] == SpillState::Empty {
let inst = self.m.inst(iidx);
let size = inst.def_byte_size(self.m);
self.stack.align(size); // FIXME
let frame_off = self.stack.grow(size);
let bitw = inst.def_bitw(self.m);
let bytew = inst.def_byte_size(self.m);
debug_assert!(bitw >= bytew);
self.stack.align(bytew);
let frame_off = self.stack.grow(bytew);
let off = i32::try_from(frame_off).unwrap();
match size {
1 => dynasm!(asm; mov BYTE [rbp - off], Rb(reg.code())),
2 => dynasm!(asm; mov WORD [rbp - off], Rw(reg.code())),
4 => dynasm!(asm; mov DWORD [rbp - off], Rd(reg.code())),
8 => dynasm!(asm; mov QWORD [rbp - off], Rq(reg.code())),
match bitw {
8 => dynasm!(asm; mov BYTE [rbp - off], Rb(reg.code())),
16 => dynasm!(asm; mov WORD [rbp - off], Rw(reg.code())),
32 => dynasm!(asm; mov DWORD [rbp - off], Rd(reg.code())),
64 => dynasm!(asm; mov QWORD [rbp - off], Rq(reg.code())),
_ => unreachable!(),
}
self.spills[usize::from(iidx)] = SpillState::Stack(off);
Expand Down Expand Up @@ -1380,13 +1382,15 @@ impl LSRegAlloc<'_> {
RegState::FromInst(iidx) => {
if self.spills[usize::from(iidx)] == SpillState::Empty {
let inst = self.m.inst(iidx);
let size = inst.def_byte_size(self.m);
self.stack.align(size); // FIXME
let frame_off = self.stack.grow(size);
let bitw = inst.def_bitw(self.m);
let bytew = inst.def_byte_size(self.m);
debug_assert!(bitw >= bytew);
self.stack.align(bytew);
let frame_off = self.stack.grow(bytew);
let off = i32::try_from(frame_off).unwrap();
match size {
4 => dynasm!(asm ; movss [rbp - off], Rx(reg.code())),
8 => dynasm!(asm ; movsd [rbp - off], Rx(reg.code())),
match bitw {
32 => dynasm!(asm ; movss [rbp - off], Rx(reg.code())),
64 => dynasm!(asm ; movsd [rbp - off], Rx(reg.code())),
_ => unreachable!(),
}
self.spills[usize::from(iidx)] = SpillState::Stack(off);
Expand Down
Loading

0 comments on commit 4b3b0ca

Please sign in to comment.