Skip to content

Commit ae46d2f

Browse files
committed
x86 inline asm support
1 parent c0f2e47 commit ae46d2f

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
@@ -493,6 +493,10 @@ impl<'tcx> InlineAssemblyGenerator<'_, 'tcx> {
493493

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

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

514522
fn epilogue_noreturn(generated_asm: &mut String, arch: InlineAsmArch) {
515523
match arch {
516-
InlineAsmArch::X86_64 => {
524+
InlineAsmArch::X86 | InlineAsmArch::X86_64 => {
517525
generated_asm.push_str(" ud2\n");
518526
}
519527
_ => unimplemented!("epilogue_noreturn for {:?}", arch),
@@ -527,6 +535,11 @@ impl<'tcx> InlineAssemblyGenerator<'_, 'tcx> {
527535
offset: Size,
528536
) {
529537
match arch {
538+
InlineAsmArch::X86 => {
539+
write!(generated_asm, " mov [ebp+0x{:x}], ", offset.bytes()).unwrap();
540+
reg.emit(generated_asm, InlineAsmArch::X86, None).unwrap();
541+
generated_asm.push('\n');
542+
}
530543
InlineAsmArch::X86_64 => {
531544
write!(generated_asm, " mov [rbp+0x{:x}], ", offset.bytes()).unwrap();
532545
reg.emit(generated_asm, InlineAsmArch::X86_64, None).unwrap();
@@ -543,6 +556,11 @@ impl<'tcx> InlineAssemblyGenerator<'_, 'tcx> {
543556
offset: Size,
544557
) {
545558
match arch {
559+
InlineAsmArch::X86 => {
560+
generated_asm.push_str(" mov ");
561+
reg.emit(generated_asm, InlineAsmArch::X86, None).unwrap();
562+
writeln!(generated_asm, ", [ebp+0x{:x}]", offset.bytes()).unwrap();
563+
}
546564
InlineAsmArch::X86_64 => {
547565
generated_asm.push_str(" mov ");
548566
reg.emit(generated_asm, InlineAsmArch::X86_64, None).unwrap();

0 commit comments

Comments
 (0)