Extract remain assembly to asm.rs

This commit is contained in:
Brendan Hansknecht 2020-11-15 21:05:53 -08:00
parent 0fcb1df344
commit ec4e19d01f
2 changed files with 30 additions and 9 deletions

View file

@ -22,7 +22,8 @@ pub enum Register {
R15, R15,
} }
const REX_W: u8 = 0x48; const REX: u8 = 0x40;
const REX_W: u8 = REX + 0x8;
fn add_rm_extension(reg: Register, byte: u8) -> u8 { fn add_rm_extension(reg: Register, byte: u8) -> u8 {
if reg as u8 > 7 { if reg as u8 > 7 {
@ -68,3 +69,27 @@ pub fn mov_register64bit_register64bit<'a>(buf: &mut Vec<'a, u8>, dst: Register,
let src_mod = (src as u8 % 8) << 3; let src_mod = (src as u8 % 8) << 3;
buf.extend(&[rex, 0x89, 0xC0 + dst_mod + src_mod]); buf.extend(&[rex, 0x89, 0xC0 + dst_mod + src_mod]);
} }
pub fn ret_near<'a>(buf: &mut Vec<'a, u8>) {
buf.push(0xC3);
}
pub fn pop_register64bit<'a>(buf: &mut Vec<'a, u8>, reg: Register) {
if reg as u8 > 7 {
let rex = add_reg_extension(reg, REX);
let reg_mod = reg as u8 % 8;
buf.extend(&[rex, 0x58 + reg_mod]);
} else {
buf.push(0x50 + reg as u8);
}
}
pub fn push_register64bit<'a>(buf: &mut Vec<'a, u8>, reg: Register) {
if reg as u8 > 7 {
let rex = add_reg_extension(reg, REX);
let reg_mod = reg as u8 % 8;
buf.extend(&[rex, 0x50 + reg_mod]);
} else {
buf.push(0x50 + reg as u8);
}
}

View file

@ -57,19 +57,15 @@ impl<'a> Backend<'a> for X86_64Backend<'a> {
// TODO: handle allocating and cleaning up data on the stack. // TODO: handle allocating and cleaning up data on the stack.
let mut out = bumpalo::vec![in self.env.arena]; let mut out = bumpalo::vec![in self.env.arena];
if !self.leaf_proc { if !self.leaf_proc {
// push rbp (0x55) asm::push_register64bit(&mut out, Register::RBP);
// mov rbp, rsp (0x48, 0x89, 0xE5) asm::mov_register64bit_register64bit(&mut out, Register::RBP, Register::RSP);
out.extend(&[0x55]);
asm::mov_register64bit_register64bit(&mut out, Register::RBP, Register::RSP)
} }
out.extend(&self.buf); out.extend(&self.buf);
if !self.leaf_proc { if !self.leaf_proc {
// pop rbp asm::pop_register64bit(&mut out, Register::RBP);
out.push(0x5D);
} }
// ret asm::ret_near(&mut out);
out.push(0xC3);
out.into_bump_slice() out.into_bump_slice()
} }