about summary refs log tree commit diff
diff options
context:
space:
mode:
authorGary Guo <gary@garyguo.net>2021-11-22 02:58:53 +0000
committerGary Guo <gary@garyguo.net>2021-11-22 16:28:14 +0000
commitcfdf10b259f20e94f82c39dcb87faaa12f7f8dc7 (patch)
treebd25a1b13c94ce8f4f81fd7642554de47be7fde7
parenteaf88c5b5299dfe721cb777b1632a18f8fff3cd0 (diff)
downloadrust-cfdf10b259f20e94f82c39dcb87faaa12f7f8dc7.tar.gz
rust-cfdf10b259f20e94f82c39dcb87faaa12f7f8dc7.zip
x86 inline asm support
-rw-r--r--src/inline_asm.rs20
1 files changed, 19 insertions, 1 deletions
diff --git a/src/inline_asm.rs b/src/inline_asm.rs
index 19c3a9b82d1..35876e57f35 100644
--- a/src/inline_asm.rs
+++ b/src/inline_asm.rs
@@ -493,6 +493,10 @@ impl<'tcx> InlineAssemblyGenerator<'_, 'tcx> {
 
     fn prologue(generated_asm: &mut String, arch: InlineAsmArch) {
         match arch {
+            InlineAsmArch::X86 => {
+                generated_asm.push_str("    push ebp\n");
+                generated_asm.push_str("    mov ebp,[esp+8]\n");
+            }
             InlineAsmArch::X86_64 => {
                 generated_asm.push_str("    push rbp\n");
                 generated_asm.push_str("    mov rbp,rdi\n");
@@ -503,6 +507,10 @@ impl<'tcx> InlineAssemblyGenerator<'_, 'tcx> {
 
     fn epilogue(generated_asm: &mut String, arch: InlineAsmArch) {
         match arch {
+            InlineAsmArch::X86 => {
+                generated_asm.push_str("    pop ebp\n");
+                generated_asm.push_str("    ret\n");
+            }
             InlineAsmArch::X86_64 => {
                 generated_asm.push_str("    pop rbp\n");
                 generated_asm.push_str("    ret\n");
@@ -513,7 +521,7 @@ impl<'tcx> InlineAssemblyGenerator<'_, 'tcx> {
 
     fn epilogue_noreturn(generated_asm: &mut String, arch: InlineAsmArch) {
         match arch {
-            InlineAsmArch::X86_64 => {
+            InlineAsmArch::X86 | InlineAsmArch::X86_64 => {
                 generated_asm.push_str("    ud2\n");
             }
             _ => unimplemented!("epilogue_noreturn for {:?}", arch),
@@ -527,6 +535,11 @@ impl<'tcx> InlineAssemblyGenerator<'_, 'tcx> {
         offset: Size,
     ) {
         match arch {
+            InlineAsmArch::X86 => {
+                write!(generated_asm, "    mov [ebp+0x{:x}], ", offset.bytes()).unwrap();
+                reg.emit(generated_asm, InlineAsmArch::X86, None).unwrap();
+                generated_asm.push('\n');
+            }
             InlineAsmArch::X86_64 => {
                 write!(generated_asm, "    mov [rbp+0x{:x}], ", offset.bytes()).unwrap();
                 reg.emit(generated_asm, InlineAsmArch::X86_64, None).unwrap();
@@ -543,6 +556,11 @@ impl<'tcx> InlineAssemblyGenerator<'_, 'tcx> {
         offset: Size,
     ) {
         match arch {
+            InlineAsmArch::X86 => {
+                generated_asm.push_str("    mov ");
+                reg.emit(generated_asm, InlineAsmArch::X86, None).unwrap();
+                writeln!(generated_asm, ", [ebp+0x{:x}]", offset.bytes()).unwrap();
+            }
             InlineAsmArch::X86_64 => {
                 generated_asm.push_str("    mov ");
                 reg.emit(generated_asm, InlineAsmArch::X86_64, None).unwrap();