diff options
| author | Gary Guo <gary@garyguo.net> | 2021-11-22 02:58:53 +0000 |
|---|---|---|
| committer | Gary Guo <gary@garyguo.net> | 2021-11-22 16:28:14 +0000 |
| commit | cfdf10b259f20e94f82c39dcb87faaa12f7f8dc7 (patch) | |
| tree | bd25a1b13c94ce8f4f81fd7642554de47be7fde7 | |
| parent | eaf88c5b5299dfe721cb777b1632a18f8fff3cd0 (diff) | |
| download | rust-cfdf10b259f20e94f82c39dcb87faaa12f7f8dc7.tar.gz rust-cfdf10b259f20e94f82c39dcb87faaa12f7f8dc7.zip | |
x86 inline asm support
| -rw-r--r-- | src/inline_asm.rs | 20 |
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(); |
