Skip to content

Commit d5baba9

Browse files
committed
x86 inline asm support
1 parent c5693cb commit d5baba9

File tree

1 file changed

+19
-1
lines changed

1 file changed

+19
-1
lines changed

src/inline_asm.rs

+19-1
Original file line numberDiff line numberDiff line change
@@ -492,6 +492,10 @@ impl<'tcx> InlineAssemblyGenerator<'_, 'tcx> {
492492

493493
fn prologue(generated_asm: &mut String, arch: InlineAsmArch) {
494494
match arch {
495+
InlineAsmArch::X86 => {
496+
generated_asm.push_str(" push ebp\n");
497+
generated_asm.push_str(" mov ebp,edi\n");
498+
}
495499
InlineAsmArch::X86_64 => {
496500
generated_asm.push_str(" push rbp\n");
497501
generated_asm.push_str(" mov rbp,rdi\n");
@@ -502,6 +506,10 @@ impl<'tcx> InlineAssemblyGenerator<'_, 'tcx> {
502506

503507
fn epilogue(generated_asm: &mut String, arch: InlineAsmArch) {
504508
match arch {
509+
InlineAsmArch::X86 => {
510+
generated_asm.push_str(" pop ebp\n");
511+
generated_asm.push_str(" ret\n");
512+
}
505513
InlineAsmArch::X86_64 => {
506514
generated_asm.push_str(" pop rbp\n");
507515
generated_asm.push_str(" ret\n");
@@ -512,7 +520,7 @@ impl<'tcx> InlineAssemblyGenerator<'_, 'tcx> {
512520

513521
fn epilogue_noreturn(generated_asm: &mut String, arch: InlineAsmArch) {
514522
match arch {
515-
InlineAsmArch::X86_64 => {
523+
InlineAsmArch::X86 | InlineAsmArch::X86_64 => {
516524
generated_asm.push_str(" ud2\n");
517525
}
518526
_ => unimplemented!("epilogue_noreturn for {:?}", arch),
@@ -526,6 +534,11 @@ impl<'tcx> InlineAssemblyGenerator<'_, 'tcx> {
526534
offset: Size,
527535
) {
528536
match arch {
537+
InlineAsmArch::X86 => {
538+
write!(generated_asm, " mov [ebp+0x{:x}], ", offset.bytes()).unwrap();
539+
reg.emit(generated_asm, InlineAsmArch::X86, None).unwrap();
540+
generated_asm.push('\n');
541+
}
529542
InlineAsmArch::X86_64 => {
530543
write!(generated_asm, " mov [rbp+0x{:x}], ", offset.bytes()).unwrap();
531544
reg.emit(generated_asm, InlineAsmArch::X86_64, None).unwrap();
@@ -542,6 +555,11 @@ impl<'tcx> InlineAssemblyGenerator<'_, 'tcx> {
542555
offset: Size,
543556
) {
544557
match arch {
558+
InlineAsmArch::X86 => {
559+
generated_asm.push_str(" mov ");
560+
reg.emit(generated_asm, InlineAsmArch::X86, None).unwrap();
561+
writeln!(generated_asm, ", [ebp+0x{:x}]", offset.bytes()).unwrap();
562+
}
545563
InlineAsmArch::X86_64 => {
546564
generated_asm.push_str(" mov ");
547565
reg.emit(generated_asm, InlineAsmArch::X86_64, None).unwrap();

0 commit comments

Comments
 (0)