]> git.lizzy.rs Git - rust.git/commitdiff
Auto merge of #86416 - Amanieu:asm_clobber_only, r=nagisa
authorbors <bors@rust-lang.org>
Sun, 11 Jul 2021 01:06:58 +0000 (01:06 +0000)
committerbors <bors@rust-lang.org>
Sun, 11 Jul 2021 01:06:58 +0000 (01:06 +0000)
Add clobber-only register classes for asm!

These are needed to properly express a function call ABI using a clobber
list, even though we don't support passing actual values into/out of
these registers.

1  2 
compiler/rustc_codegen_llvm/src/asm.rs
compiler/rustc_span/src/symbol.rs
compiler/rustc_target/src/asm/mod.rs
src/doc/unstable-book/src/library-features/asm.md

index ecf62ed213df82aec1daaf5b5b1cf958d0f9054c,bd2751790aa63679a9918b0d5ac0bb5d01e4d8e9..7bd9397d64950d19eba45c753c9a9faa61d49294
@@@ -593,9 -619,10 +620,12 @@@ fn reg_to_llvm(reg: InlineAsmRegOrRegCl
              | InlineAsmRegClass::X86(X86InlineAsmRegClass::ymm_reg) => "x",
              InlineAsmRegClass::X86(X86InlineAsmRegClass::zmm_reg) => "v",
              InlineAsmRegClass::X86(X86InlineAsmRegClass::kreg) => "^Yk",
+             InlineAsmRegClass::X86(
+                 X86InlineAsmRegClass::x87_reg | X86InlineAsmRegClass::mmx_reg,
+             ) => unreachable!("clobber-only"),
              InlineAsmRegClass::Wasm(WasmInlineAsmRegClass::local) => "r",
 +            InlineAsmRegClass::Bpf(BpfInlineAsmRegClass::reg) => "r",
 +            InlineAsmRegClass::Bpf(BpfInlineAsmRegClass::wreg) => "w",
              InlineAsmRegClass::SpirV(SpirVInlineAsmRegClass::reg) => {
                  bug!("LLVM backend does not support SPIR-V")
              }
@@@ -663,8 -696,10 +699,11 @@@ fn modifier_to_llvm
              _ => unreachable!(),
          },
          InlineAsmRegClass::X86(X86InlineAsmRegClass::kreg) => None,
+         InlineAsmRegClass::X86(X86InlineAsmRegClass::x87_reg | X86InlineAsmRegClass::mmx_reg) => {
+             unreachable!("clobber-only")
+         }
          InlineAsmRegClass::Wasm(WasmInlineAsmRegClass::local) => None,
 +        InlineAsmRegClass::Bpf(_) => None,
          InlineAsmRegClass::SpirV(SpirVInlineAsmRegClass::reg) => {
              bug!("LLVM backend does not support SPIR-V")
          }
@@@ -711,9 -752,10 +756,12 @@@ fn dummy_output_type(cx: &CodegenCx<'ll
          | InlineAsmRegClass::X86(X86InlineAsmRegClass::ymm_reg)
          | InlineAsmRegClass::X86(X86InlineAsmRegClass::zmm_reg) => cx.type_f32(),
          InlineAsmRegClass::X86(X86InlineAsmRegClass::kreg) => cx.type_i16(),
+         InlineAsmRegClass::X86(X86InlineAsmRegClass::x87_reg | X86InlineAsmRegClass::mmx_reg) => {
+             unreachable!("clobber-only")
+         }
          InlineAsmRegClass::Wasm(WasmInlineAsmRegClass::local) => cx.type_i32(),
 +        InlineAsmRegClass::Bpf(BpfInlineAsmRegClass::reg) => cx.type_i64(),
 +        InlineAsmRegClass::Bpf(BpfInlineAsmRegClass::wreg) => cx.type_i32(),
          InlineAsmRegClass::SpirV(SpirVInlineAsmRegClass::reg) => {
              bug!("LLVM backend does not support SPIR-V")
          }
index 9051c9d69b5c1e7b98dc5000ff5bd993f341b85b,a8a7797e74a91517a17b054ec2eea79df32f223b..cfa0c79004c002b946f4f31ff2816f18d73e062a
@@@ -1341,8 -1334,8 +1343,9 @@@ symbols! 
          wrapping_add,
          wrapping_mul,
          wrapping_sub,
 +        wreg,
          write_bytes,
+         x87_reg,
          xmm_reg,
          ymm_reg,
          zmm_reg,
Simple merge