intel syntax because at&t just sucks so much to read idek how
This commit is contained in:
parent
010e6d2bec
commit
c13ed77ddf
|
@ -666,7 +666,7 @@ impl core::fmt::Display for RegisterDisplay {
|
|||
Registers::R15 => "r15",
|
||||
};
|
||||
|
||||
write!(f, "%{prefix}{name}{suffix}")
|
||||
write!(f, "{prefix}{name}{suffix}")
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -744,7 +744,7 @@ impl StackMem {
|
|||
|
||||
impl core::fmt::Display for StackMem {
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||
write!(f, "-{}(%rbp)", self.offset)
|
||||
write!(f, "[rbp - 0x{:x}]", self.offset)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -758,8 +758,8 @@ enum ImmRegMem {
|
|||
impl core::fmt::Display for ImmRegMem {
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||
match self {
|
||||
ImmRegMem::ImmU32(v) => write!(f, "{v}"),
|
||||
ImmRegMem::ImmU64(v) => write!(f, "{v}"),
|
||||
ImmRegMem::ImmU32(v) => write!(f, "0x{v:x}"),
|
||||
ImmRegMem::ImmU64(v) => write!(f, "0x{v:x}"),
|
||||
ImmRegMem::Mem(mem) => write!(f, "{mem}"),
|
||||
ImmRegMem::Reg(reg, width) => write!(f, "{}", reg.display(*width)),
|
||||
}
|
||||
|
@ -783,8 +783,8 @@ impl Function {
|
|||
writeln!(w, "push {}", reg.display(Width::QWord))?;
|
||||
}
|
||||
|
||||
writeln!(w, "push %rbp")?;
|
||||
writeln!(w, "mov %rsp, %rbp")?;
|
||||
writeln!(w, "push rbp")?;
|
||||
writeln!(w, "mov rbp, rsp")?;
|
||||
|
||||
write!(w, "{}", self.entry)?;
|
||||
|
||||
|
@ -799,8 +799,8 @@ impl Function {
|
|||
}
|
||||
|
||||
writeln!(w, "{}__epilogue:", self.name)?;
|
||||
writeln!(w, "mov %rbp, %rsp")?;
|
||||
writeln!(w, "pop %rbp")?;
|
||||
writeln!(w, "mov rsp, rbp")?;
|
||||
writeln!(w, "pop rbp")?;
|
||||
|
||||
for reg in self.used_registers.iter().rev() {
|
||||
writeln!(w, "pop {}", reg.display(Width::QWord))?;
|
||||
|
@ -898,7 +898,7 @@ impl<'a> Assembler<'a> {
|
|||
let reg = register_store.take_any().unwrap();
|
||||
writeln!(
|
||||
func.branches.get_mut(¤t_branch).unwrap(),
|
||||
"mov ${value}, {}",
|
||||
"mov {}, {value}",
|
||||
reg.display(Width::DWord)
|
||||
)?;
|
||||
registers.insert(reg, node);
|
||||
|
@ -914,7 +914,7 @@ impl<'a> Assembler<'a> {
|
|||
let reg = register_store.take_any().unwrap();
|
||||
writeln!(
|
||||
func.branches.get_mut(¤t_branch).unwrap(),
|
||||
"mov ${value}, {}",
|
||||
"mov {}, {value}",
|
||||
reg.display(Width::QWord)
|
||||
)?;
|
||||
registers.insert(reg, node);
|
||||
|
@ -933,7 +933,7 @@ impl<'a> Assembler<'a> {
|
|||
Inst::Alloca => {
|
||||
let (size, align) = data.unwrap().as_lhs_rhs();
|
||||
let size = size.next_multiple_of(align);
|
||||
writeln!(&mut func.entry, "sub ${size}, %rsp")?;
|
||||
writeln!(&mut func.entry, "sub rsp, 0x{size:x}")?;
|
||||
stack_offset += size;
|
||||
allocas.insert(node, stack_offset);
|
||||
}
|
||||
|
@ -957,27 +957,28 @@ impl<'a> Assembler<'a> {
|
|||
ImmRegMem::Reg(_, _) => {
|
||||
writeln!(
|
||||
func.branches.get_mut(¤t_branch).unwrap(),
|
||||
"mov ({}), {}",
|
||||
src,
|
||||
"mov {}, [{}]",
|
||||
dst_reg.display(Width::from_size(ty.size()).unwrap()),
|
||||
src,
|
||||
)?;
|
||||
}
|
||||
_ => {
|
||||
ImmRegMem::Mem(ref mem) => {
|
||||
let tmp_reg = register_store.take_any().unwrap();
|
||||
writeln!(
|
||||
func.branches.get_mut(¤t_branch).unwrap(),
|
||||
"mov {}, {}",
|
||||
src,
|
||||
tmp_reg.display(Width::QWord),
|
||||
mem,
|
||||
)?;
|
||||
writeln!(
|
||||
func.branches.get_mut(¤t_branch).unwrap(),
|
||||
"mov ({}), {}",
|
||||
tmp_reg.display(Width::QWord),
|
||||
"mov {}, [{}]",
|
||||
dst_reg.display(Width::from_size(ty.size()).unwrap()),
|
||||
tmp_reg.display(Width::QWord),
|
||||
)?;
|
||||
register_store.free(tmp_reg);
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
|
||||
if let ImmRegMem::Reg(reg, _) = src {
|
||||
|
@ -1015,8 +1016,8 @@ impl<'a> Assembler<'a> {
|
|||
writeln!(
|
||||
func.branches.get_mut(¤t_branch).unwrap(),
|
||||
"mov {}, {}",
|
||||
src,
|
||||
dst,
|
||||
src,
|
||||
)?;
|
||||
|
||||
if let ImmRegMem::Reg(reg, _) = src {
|
||||
|
@ -1044,8 +1045,8 @@ impl<'a> Assembler<'a> {
|
|||
writeln!(
|
||||
func.branches.get_mut(¤t_branch).unwrap(),
|
||||
"lea {}, {}",
|
||||
src,
|
||||
ImmRegMem::Reg(dst_reg, Width::QWord),
|
||||
src,
|
||||
)?;
|
||||
}
|
||||
|
||||
|
@ -1053,8 +1054,7 @@ impl<'a> Assembler<'a> {
|
|||
if offset != 0 {
|
||||
writeln!(
|
||||
func.branches.get_mut(¤t_branch).unwrap(),
|
||||
"lea {}({}), {}",
|
||||
offset,
|
||||
"lea {}, [{} + {offset}]",
|
||||
ImmRegMem::Reg(dst_reg, Width::QWord),
|
||||
ImmRegMem::Reg(dst_reg, Width::QWord),
|
||||
)?;
|
||||
|
@ -1081,8 +1081,8 @@ impl<'a> Assembler<'a> {
|
|||
writeln!(
|
||||
func.branches.get_mut(¤t_branch).unwrap(),
|
||||
"add {}, {}",
|
||||
src_reg.display(Width::from_size(ty.size()).unwrap()),
|
||||
dst_reg.display(Width::from_size(ty.size()).unwrap()),
|
||||
src_reg.display(Width::from_size(ty.size()).unwrap()),
|
||||
)?;
|
||||
|
||||
if src_reg != dst_reg {
|
||||
|
@ -1109,8 +1109,8 @@ impl<'a> Assembler<'a> {
|
|||
writeln!(
|
||||
func.branches.get_mut(¤t_branch).unwrap(),
|
||||
"sub {}, {}",
|
||||
src,
|
||||
dst_reg.display(Width::from_size(ty.size()).unwrap()),
|
||||
src,
|
||||
)?;
|
||||
|
||||
if let ImmRegMem::Reg(reg, _) = src {
|
||||
|
@ -1139,8 +1139,8 @@ impl<'a> Assembler<'a> {
|
|||
writeln!(
|
||||
func.branches.get_mut(¤t_branch).unwrap(),
|
||||
"imul {}, {}",
|
||||
src,
|
||||
dst_reg.display(Width::from_size(ty.size()).unwrap()),
|
||||
src,
|
||||
)?;
|
||||
|
||||
if let ImmRegMem::Reg(reg, _) = src {
|
||||
|
@ -1167,7 +1167,7 @@ impl<'a> Assembler<'a> {
|
|||
));
|
||||
writeln!(
|
||||
func.branches.get_mut(¤t_branch).unwrap(),
|
||||
"mov {}, %rax\njmp {}__epilogue",
|
||||
"mov rax, {}\njmp {}__epilogue",
|
||||
reg.display(Width::QWord),
|
||||
func.name
|
||||
)?;
|
||||
|
@ -1210,6 +1210,8 @@ impl<'a> Assembler<'a> {
|
|||
}
|
||||
|
||||
fn finish<W: core::fmt::Write>(&self, w: &mut W) -> core::fmt::Result {
|
||||
writeln!(w, ".intel_syntax")?;
|
||||
writeln!(w, ".text")?;
|
||||
for func in self.functions.iter() {
|
||||
writeln!(w, ".globl {}", func.name)?;
|
||||
}
|
||||
|
@ -1618,6 +1620,7 @@ impl<'a> MirBuilder<'a> {
|
|||
mir.gen_ret_val(src)
|
||||
}
|
||||
Inst::Return => mir.gen_ret(),
|
||||
#[allow(unreachable_patterns)]
|
||||
_ => {
|
||||
unimplemented!()
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue