Skip to content

Commit

Permalink
rt: Emit more constants add end of instruction stream
Browse files Browse the repository at this point in the history
  • Loading branch information
dinfuehr committed Jan 1, 2025
1 parent 94903da commit 5d84381
Show file tree
Hide file tree
Showing 2 changed files with 52 additions and 57 deletions.
72 changes: 42 additions & 30 deletions dora-asm/src/x64.rs
Original file line number Diff line number Diff line change
Expand Up @@ -772,14 +772,7 @@ impl AssemblerX64 {
pub fn movq_rl(&mut self, dest: Register, label: Label) {
self.emit_rex(true, dest.needs_rex(), false, false);
self.emit_u8(0x8B);
self.emit_modrm(0b00, dest.low_bits(), 0b101);

self.unresolved_jumps.push(ForwardJump {
offset: self.position().try_into().unwrap(),
label,
distance: JumpDistance::Far,
});
self.emit_u32(0);
self.emit_label_address(dest.low_bits(), label);
}

pub fn movq_rr(&mut self, dest: Register, src: Register) {
Expand All @@ -806,22 +799,33 @@ impl AssemblerX64 {
self.emit_modrm(0b11, dest.low_bits(), src.low_bits());
}

pub fn movsd_rr(&mut self, dest: XmmRegister, src: XmmRegister) {
pub fn movsd_ra(&mut self, dest: XmmRegister, src: Address) {
debug_assert!(!self.has_avx2);
self.emit_u8(0xf2);
self.emit_rex_sse_modrm_optional(dest, src);
self.emit_rex_sse_address_optional(dest, src);
self.emit_u8(0x0f);
self.emit_u8(0x10);
self.emit_modrm(0b11, dest.low_bits(), src.low_bits());
self.emit_address(dest.low_bits(), src);
}

pub fn movsd_ra(&mut self, dest: XmmRegister, src: Address) {
pub fn movsd_rl(&mut self, dest: XmmRegister, label: Label) {
debug_assert!(!self.has_avx2);
self.emit_u8(0xf2);
self.emit_rex_sse_address_optional(dest, src);
if dest.needs_rex() {
self.emit_rex(false, true, false, false);
}
self.emit_u8(0x0f);
self.emit_u8(0x10);
self.emit_address(dest.low_bits(), src);
self.emit_label_address(dest.low_bits(), label);
}

pub fn movsd_rr(&mut self, dest: XmmRegister, src: XmmRegister) {
debug_assert!(!self.has_avx2);
self.emit_u8(0xf2);
self.emit_rex_sse_modrm_optional(dest, src);
self.emit_u8(0x0f);
self.emit_u8(0x10);
self.emit_modrm(0b11, dest.low_bits(), src.low_bits());
}

pub fn movsd_ar(&mut self, dest: Address, src: XmmRegister) {
Expand Down Expand Up @@ -851,6 +855,17 @@ impl AssemblerX64 {
self.emit_address(dest.low_bits(), src);
}

pub fn movss_rl(&mut self, dest: XmmRegister, label: Label) {
debug_assert!(!self.has_avx2);
self.emit_u8(0xf3);
if dest.needs_rex() {
self.emit_rex(false, true, false, false);
}
self.emit_u8(0x0f);
self.emit_u8(0x10);
self.emit_label_address(dest.low_bits(), label);
}

pub fn movss_rr(&mut self, dest: XmmRegister, src: XmmRegister) {
debug_assert!(!self.has_avx2);
self.emit_u8(0xf3);
Expand Down Expand Up @@ -1714,14 +1729,7 @@ impl AssemblerX64 {
VEX_PP_F2,
);
self.emit_u8(0x10);
self.emit_modrm(0b00, dest.low_bits(), 0b101);

self.unresolved_jumps.push(ForwardJump {
offset: self.position().try_into().unwrap(),
label,
distance: JumpDistance::Far,
});
self.emit_u32(0);
self.emit_label_address(dest.low_bits(), label);
}

pub fn vmovsd_rr(&mut self, dest: XmmRegister, lhs: XmmRegister, rhs: XmmRegister) {
Expand Down Expand Up @@ -1785,14 +1793,7 @@ impl AssemblerX64 {
VEX_PP_F3,
);
self.emit_u8(0x10);
self.emit_modrm(0b00, dest.low_bits(), 0b101);

self.unresolved_jumps.push(ForwardJump {
offset: self.position().try_into().unwrap(),
label,
distance: JumpDistance::Far,
});
self.emit_u32(0);
self.emit_label_address(dest.low_bits(), label);
}

pub fn vmovss_rr(&mut self, dest: XmmRegister, lhs: XmmRegister, rhs: XmmRegister) {
Expand Down Expand Up @@ -2269,6 +2270,17 @@ impl AssemblerX64 {
}
}

fn emit_label_address(&mut self, reg: u8, label: Label) {
self.emit_modrm(0b00, reg, 0b101);

self.unresolved_jumps.push(ForwardJump {
offset: self.position().try_into().unwrap(),
label,
distance: JumpDistance::Far,
});
self.emit_u32(0);
}

fn emit_alu64_imm(&mut self, reg: Register, imm: Immediate, modrm_reg: u8, rax_opcode: u8) {
assert!(imm.is_int32());
self.emit_rex(true, false, false, reg.needs_rex());
Expand Down
37 changes: 10 additions & 27 deletions dora-runtime/src/masm/x64.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1272,15 +1272,15 @@ impl MacroAssembler {
return;
}

if has_avx2() {
let const_value = match mode {
MachineMode::Float32 => ConstPoolValue::Float32(imm as f32),
MachineMode::Float64 => ConstPoolValue::Float64(imm),
_ => unreachable!(),
};
let label = self.asm.create_label();
self.epilog_constants.push((label, const_value));
let const_value = match mode {
MachineMode::Float32 => ConstPoolValue::Float32(imm as f32),
MachineMode::Float64 => ConstPoolValue::Float64(imm),
_ => unreachable!(),
};
let label = self.asm.create_label();
self.epilog_constants.push((label, const_value));

if has_avx2() {
match mode {
MachineMode::Float32 => {
self.asm.vmovss_rl(dest.into(), label);
Expand All @@ -1293,26 +1293,9 @@ impl MacroAssembler {
_ => unreachable!(),
}
} else {
let pos = self.pos() as i32;
let inst_size = 8 + if dest.msb() != 0 { 1 } else { 0 };

match mode {
MachineMode::Float32 => {
let const_offset = self.add_const_f32(imm as f32);
self.asm.movss_ra(
dest.into(),
AsmAddress::rip(-(const_offset + pos + inst_size)),
)
}

MachineMode::Float64 => {
let const_offset = self.add_const_f64(imm);
self.asm.movsd_ra(
dest.into(),
AsmAddress::rip(-(const_offset + pos + inst_size)),
)
}

MachineMode::Float32 => self.asm.movss_rl(dest.into(), label),
MachineMode::Float64 => self.asm.movsd_rl(dest.into(), label),
_ => unreachable!(),
}
}
Expand Down

0 comments on commit 5d84381

Please sign in to comment.