Make s390x non-clobber-only vector register support unstable

This commit is contained in:
Taiki Endo 2024-11-24 21:42:22 +09:00
parent 2c8f6de1ba
commit c024d8ccdf
21 changed files with 822 additions and 145 deletions

View File

@ -152,6 +152,8 @@ ast_lowering_register2 = register `{$reg2_name}`
ast_lowering_register_class_only_clobber = ast_lowering_register_class_only_clobber =
register class `{$reg_class_name}` can only be used as a clobber, not as an input or output register class `{$reg_class_name}` can only be used as a clobber, not as an input or output
ast_lowering_register_class_only_clobber_stable =
register class `{$reg_class_name}` can only be used as a clobber in stable
ast_lowering_register_conflict = ast_lowering_register_conflict =
register `{$reg1_name}` conflicts with register `{$reg2_name}` register `{$reg1_name}` conflicts with register `{$reg2_name}`

View File

@ -17,7 +17,8 @@ use super::errors::{
InlineAsmUnsupportedTarget, InvalidAbiClobberAbi, InvalidAsmTemplateModifierConst, InlineAsmUnsupportedTarget, InvalidAbiClobberAbi, InvalidAsmTemplateModifierConst,
InvalidAsmTemplateModifierLabel, InvalidAsmTemplateModifierRegClass, InvalidAsmTemplateModifierLabel, InvalidAsmTemplateModifierRegClass,
InvalidAsmTemplateModifierRegClassSub, InvalidAsmTemplateModifierSym, InvalidRegister, InvalidAsmTemplateModifierRegClassSub, InvalidAsmTemplateModifierSym, InvalidRegister,
InvalidRegisterClass, RegisterClassOnlyClobber, RegisterConflict, InvalidRegisterClass, RegisterClassOnlyClobber, RegisterClassOnlyClobberStable,
RegisterConflict,
}; };
use crate::{ use crate::{
AllowReturnTypeNotation, ImplTraitContext, ImplTraitPosition, ParamMode, AllowReturnTypeNotation, ImplTraitContext, ImplTraitPosition, ParamMode,
@ -61,6 +62,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
.emit(); .emit();
} }
} }
let allow_experimental_reg = self.tcx.features().asm_experimental_reg();
if asm.options.contains(InlineAsmOptions::ATT_SYNTAX) if asm.options.contains(InlineAsmOptions::ATT_SYNTAX)
&& !matches!(asm_arch, Some(asm::InlineAsmArch::X86 | asm::InlineAsmArch::X86_64)) && !matches!(asm_arch, Some(asm::InlineAsmArch::X86 | asm::InlineAsmArch::X86_64))
&& !self.tcx.sess.opts.actually_rustdoc && !self.tcx.sess.opts.actually_rustdoc
@ -333,11 +335,29 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
// means that we disallow passing a value in/out of the asm and // means that we disallow passing a value in/out of the asm and
// require that the operand name an explicit register, not a // require that the operand name an explicit register, not a
// register class. // register class.
if reg_class.is_clobber_only(asm_arch.unwrap()) && !op.is_clobber() { if reg_class.is_clobber_only(asm_arch.unwrap(), allow_experimental_reg)
self.dcx().emit_err(RegisterClassOnlyClobber { && !op.is_clobber()
op_span: op_sp, {
reg_class_name: reg_class.name(), if allow_experimental_reg || reg_class.is_clobber_only(asm_arch.unwrap(), true)
}); {
// always clobber-only
self.dcx().emit_err(RegisterClassOnlyClobber {
op_span: op_sp,
reg_class_name: reg_class.name(),
});
} else {
// clobber-only in stable
self.tcx
.sess
.create_feature_err(
RegisterClassOnlyClobberStable {
op_span: op_sp,
reg_class_name: reg_class.name(),
},
sym::asm_experimental_reg,
)
.emit();
}
continue; continue;
} }

View File

@ -279,6 +279,14 @@ pub(crate) struct RegisterClassOnlyClobber {
pub reg_class_name: Symbol, pub reg_class_name: Symbol,
} }
#[derive(Diagnostic)]
#[diag(ast_lowering_register_class_only_clobber_stable)]
pub(crate) struct RegisterClassOnlyClobberStable {
#[primary_span]
pub op_span: Span,
pub reg_class_name: Symbol,
}
#[derive(Diagnostic)] #[derive(Diagnostic)]
#[diag(ast_lowering_register_conflict)] #[diag(ast_lowering_register_conflict)]
pub(crate) struct RegisterConflict<'a> { pub(crate) struct RegisterConflict<'a> {

View File

@ -462,8 +462,12 @@ impl<'tcx> InlineAssemblyGenerator<'_, 'tcx> {
let mut slots_output = vec![None; self.operands.len()]; let mut slots_output = vec![None; self.operands.len()];
let new_slot_fn = |slot_size: &mut Size, reg_class: InlineAsmRegClass| { let new_slot_fn = |slot_size: &mut Size, reg_class: InlineAsmRegClass| {
let reg_size = let reg_size = reg_class
reg_class.supported_types(self.arch).iter().map(|(ty, _)| ty.size()).max().unwrap(); .supported_types(self.arch, true)
.iter()
.map(|(ty, _)| ty.size())
.max()
.unwrap();
let align = rustc_abi::Align::from_bytes(reg_size.bytes()).unwrap(); let align = rustc_abi::Align::from_bytes(reg_size.bytes()).unwrap();
let offset = slot_size.align_to(align); let offset = slot_size.align_to(align);
*slot_size = offset + reg_size; *slot_size = offset + reg_size;

View File

@ -186,7 +186,7 @@ impl<'a, 'gcc, 'tcx> AsmBuilderMethods<'tcx> for Builder<'a, 'gcc, 'tcx> {
// `clobber_abi` can add lots of clobbers that are not supported by the target, // `clobber_abi` can add lots of clobbers that are not supported by the target,
// such as AVX-512 registers, so we just ignore unsupported registers // such as AVX-512 registers, so we just ignore unsupported registers
let is_target_supported = let is_target_supported =
reg.reg_class().supported_types(asm_arch).iter().any( reg.reg_class().supported_types(asm_arch, true).iter().any(
|&(_, feature)| { |&(_, feature)| {
if let Some(feature) = feature { if let Some(feature) = feature {
self.tcx self.tcx

View File

@ -45,7 +45,7 @@ impl<'ll, 'tcx> AsmBuilderMethods<'tcx> for Builder<'_, 'll, 'tcx> {
match *op { match *op {
InlineAsmOperandRef::Out { reg, late, place } => { InlineAsmOperandRef::Out { reg, late, place } => {
let is_target_supported = |reg_class: InlineAsmRegClass| { let is_target_supported = |reg_class: InlineAsmRegClass| {
for &(_, feature) in reg_class.supported_types(asm_arch) { for &(_, feature) in reg_class.supported_types(asm_arch, true) {
if let Some(feature) = feature { if let Some(feature) = feature {
if self if self
.tcx .tcx
@ -85,7 +85,7 @@ impl<'ll, 'tcx> AsmBuilderMethods<'tcx> for Builder<'_, 'll, 'tcx> {
} }
continue; continue;
} else if !is_target_supported(reg.reg_class()) } else if !is_target_supported(reg.reg_class())
|| reg.reg_class().is_clobber_only(asm_arch) || reg.reg_class().is_clobber_only(asm_arch, true)
{ {
// We turn discarded outputs into clobber constraints // We turn discarded outputs into clobber constraints
// if the target feature needed by the register class is // if the target feature needed by the register class is

View File

@ -376,6 +376,8 @@ declare_features! (
(unstable, arbitrary_self_types_pointers, "1.83.0", Some(44874)), (unstable, arbitrary_self_types_pointers, "1.83.0", Some(44874)),
/// Enables experimental inline assembly support for additional architectures. /// Enables experimental inline assembly support for additional architectures.
(unstable, asm_experimental_arch, "1.58.0", Some(93335)), (unstable, asm_experimental_arch, "1.58.0", Some(93335)),
/// Enables experimental register support in inline assembly.
(unstable, asm_experimental_reg, "CURRENT_RUSTC_VERSION", Some(133416)),
/// Allows using `label` operands in inline assembly. /// Allows using `label` operands in inline assembly.
(unstable, asm_goto, "1.78.0", Some(119364)), (unstable, asm_goto, "1.78.0", Some(119364)),
/// Allows the `may_unwind` option in inline assembly. /// Allows the `may_unwind` option in inline assembly.

View File

@ -424,6 +424,9 @@ hir_analysis_recursive_generic_parameter = {$param_def_kind} `{$param_name}` is
hir_analysis_redundant_lifetime_args = unnecessary lifetime parameter `{$victim}` hir_analysis_redundant_lifetime_args = unnecessary lifetime parameter `{$victim}`
.note = you can use the `{$candidate}` lifetime directly, in place of `{$victim}` .note = you can use the `{$candidate}` lifetime directly, in place of `{$victim}`
hir_analysis_register_type_unstable =
type `{$ty}` cannot be used with this register class in stable
hir_analysis_requires_note = the `{$trait_name}` impl for `{$ty}` requires that `{$error_predicate}` hir_analysis_requires_note = the `{$trait_name}` impl for `{$ty}` requires that `{$error_predicate}`
hir_analysis_return_type_notation_equality_bound = hir_analysis_return_type_notation_equality_bound =

View File

@ -7,12 +7,14 @@ use rustc_hir::{self as hir, LangItem};
use rustc_middle::bug; use rustc_middle::bug;
use rustc_middle::ty::{self, FloatTy, IntTy, Ty, TyCtxt, TypeVisitableExt, UintTy}; use rustc_middle::ty::{self, FloatTy, IntTy, Ty, TyCtxt, TypeVisitableExt, UintTy};
use rustc_session::lint; use rustc_session::lint;
use rustc_span::Symbol;
use rustc_span::def_id::LocalDefId; use rustc_span::def_id::LocalDefId;
use rustc_span::{Symbol, sym};
use rustc_target::asm::{ use rustc_target::asm::{
InlineAsmReg, InlineAsmRegClass, InlineAsmRegOrRegClass, InlineAsmType, ModifierInfo, InlineAsmReg, InlineAsmRegClass, InlineAsmRegOrRegClass, InlineAsmType, ModifierInfo,
}; };
use crate::errors::RegisterTypeUnstable;
pub struct InlineAsmCtxt<'a, 'tcx> { pub struct InlineAsmCtxt<'a, 'tcx> {
tcx: TyCtxt<'tcx>, tcx: TyCtxt<'tcx>,
typing_env: ty::TypingEnv<'tcx>, typing_env: ty::TypingEnv<'tcx>,
@ -218,17 +220,29 @@ impl<'a, 'tcx> InlineAsmCtxt<'a, 'tcx> {
// Check the type against the list of types supported by the selected // Check the type against the list of types supported by the selected
// register class. // register class.
let asm_arch = self.tcx.sess.asm_arch.unwrap(); let asm_arch = self.tcx.sess.asm_arch.unwrap();
let allow_experimental_reg = self.tcx.features().asm_experimental_reg();
let reg_class = reg.reg_class(); let reg_class = reg.reg_class();
let supported_tys = reg_class.supported_types(asm_arch); let supported_tys = reg_class.supported_types(asm_arch, allow_experimental_reg);
let Some((_, feature)) = supported_tys.iter().find(|&&(t, _)| t == asm_ty) else { let Some((_, feature)) = supported_tys.iter().find(|&&(t, _)| t == asm_ty) else {
let msg = format!("type `{ty}` cannot be used with this register class"); let mut err = if !allow_experimental_reg
let mut err = self.tcx.dcx().struct_span_err(expr.span, msg); && reg_class.supported_types(asm_arch, true).iter().any(|&(t, _)| t == asm_ty)
let supported_tys: Vec<_> = supported_tys.iter().map(|(t, _)| t.to_string()).collect(); {
err.note(format!( self.tcx.sess.create_feature_err(
"register class `{}` supports these types: {}", RegisterTypeUnstable { span: expr.span, ty },
reg_class.name(), sym::asm_experimental_reg,
supported_tys.join(", "), )
)); } else {
let msg = format!("type `{ty}` cannot be used with this register class");
let mut err = self.tcx.dcx().struct_span_err(expr.span, msg);
let supported_tys: Vec<_> =
supported_tys.iter().map(|(t, _)| t.to_string()).collect();
err.note(format!(
"register class `{}` supports these types: {}",
reg_class.name(),
supported_tys.join(", "),
));
err
};
if let Some(suggest) = reg_class.suggest_class(asm_arch, asm_ty) { if let Some(suggest) = reg_class.suggest_class(asm_arch, asm_ty) {
err.help(format!("consider using the `{}` register class instead", suggest.name())); err.help(format!("consider using the `{}` register class instead", suggest.name()));
} }
@ -313,6 +327,7 @@ impl<'a, 'tcx> InlineAsmCtxt<'a, 'tcx> {
self.tcx.dcx().delayed_bug("target architecture does not support asm"); self.tcx.dcx().delayed_bug("target architecture does not support asm");
return; return;
}; };
let allow_experimental_reg = self.tcx.features().asm_experimental_reg();
for (idx, (op, op_sp)) in asm.operands.iter().enumerate() { for (idx, (op, op_sp)) in asm.operands.iter().enumerate() {
// Validate register classes against currently enabled target // Validate register classes against currently enabled target
// features. We check that at least one type is available for // features. We check that at least one type is available for
@ -352,7 +367,8 @@ impl<'a, 'tcx> InlineAsmCtxt<'a, 'tcx> {
if let InlineAsmRegClass::Err = reg_class { if let InlineAsmRegClass::Err = reg_class {
continue; continue;
} }
for &(_, feature) in reg_class.supported_types(asm_arch) { for &(_, feature) in reg_class.supported_types(asm_arch, allow_experimental_reg)
{
match feature { match feature {
Some(feature) => { Some(feature) => {
if target_features.contains(&feature) { if target_features.contains(&feature) {

View File

@ -1685,3 +1685,11 @@ pub(crate) struct CmseEntryGeneric {
#[primary_span] #[primary_span]
pub span: Span, pub span: Span,
} }
#[derive(Diagnostic)]
#[diag(hir_analysis_register_type_unstable)]
pub(crate) struct RegisterTypeUnstable<'a> {
#[primary_span]
pub span: Span,
pub ty: Ty<'a>,
}

View File

@ -416,6 +416,7 @@ symbols! {
asm, asm,
asm_const, asm_const,
asm_experimental_arch, asm_experimental_arch,
asm_experimental_reg,
asm_goto, asm_goto,
asm_sym, asm_sym,
asm_unwind, asm_unwind,

View File

@ -604,9 +604,13 @@ impl InlineAsmRegClass {
/// Returns a list of supported types for this register class, each with an /// Returns a list of supported types for this register class, each with an
/// options target feature required to use this type. /// options target feature required to use this type.
///
/// At the codegen stage, it is fine to always pass true for `allow_experimental_reg`,
/// since all the stability checking will have been done in prior stages.
pub fn supported_types( pub fn supported_types(
self, self,
arch: InlineAsmArch, arch: InlineAsmArch,
allow_experimental_reg: bool,
) -> &'static [(InlineAsmType, Option<Symbol>)] { ) -> &'static [(InlineAsmType, Option<Symbol>)] {
match self { match self {
Self::X86(r) => r.supported_types(arch), Self::X86(r) => r.supported_types(arch),
@ -618,7 +622,7 @@ impl InlineAsmRegClass {
Self::Hexagon(r) => r.supported_types(arch), Self::Hexagon(r) => r.supported_types(arch),
Self::LoongArch(r) => r.supported_types(arch), Self::LoongArch(r) => r.supported_types(arch),
Self::Mips(r) => r.supported_types(arch), Self::Mips(r) => r.supported_types(arch),
Self::S390x(r) => r.supported_types(arch), Self::S390x(r) => r.supported_types(arch, allow_experimental_reg),
Self::Sparc(r) => r.supported_types(arch), Self::Sparc(r) => r.supported_types(arch),
Self::SpirV(r) => r.supported_types(arch), Self::SpirV(r) => r.supported_types(arch),
Self::Wasm(r) => r.supported_types(arch), Self::Wasm(r) => r.supported_types(arch),
@ -696,8 +700,11 @@ impl InlineAsmRegClass {
/// Returns whether registers in this class can only be used as clobbers /// Returns whether registers in this class can only be used as clobbers
/// and not as inputs/outputs. /// and not as inputs/outputs.
pub fn is_clobber_only(self, arch: InlineAsmArch) -> bool { ///
self.supported_types(arch).is_empty() /// At the codegen stage, it is fine to always pass true for `allow_experimental_reg`,
/// since all the stability checking will have been done in prior stages.
pub fn is_clobber_only(self, arch: InlineAsmArch, allow_experimental_reg: bool) -> bool {
self.supported_types(arch, allow_experimental_reg).is_empty()
} }
} }

View File

@ -38,14 +38,22 @@ impl S390xInlineAsmRegClass {
pub fn supported_types( pub fn supported_types(
self, self,
_arch: InlineAsmArch, _arch: InlineAsmArch,
allow_experimental_reg: bool,
) -> &'static [(InlineAsmType, Option<Symbol>)] { ) -> &'static [(InlineAsmType, Option<Symbol>)] {
match self { match self {
Self::reg | Self::reg_addr => types! { _: I8, I16, I32, I64; }, Self::reg | Self::reg_addr => types! { _: I8, I16, I32, I64; },
Self::freg => types! { _: F32, F64; }, Self::freg => types! { _: F32, F64; },
Self::vreg => types! { Self::vreg => {
vector: I32, F32, I64, F64, I128, F128, if allow_experimental_reg {
VecI8(16), VecI16(8), VecI32(4), VecI64(2), VecF32(4), VecF64(2); // non-clobber-only vector register support is unstable.
}, types! {
vector: I32, F32, I64, F64, I128, F128,
VecI8(16), VecI16(8), VecI32(4), VecI64(2), VecF32(4), VecF64(2);
}
} else {
&[]
}
}
Self::areg => &[], Self::areg => &[],
} }
} }

View File

@ -0,0 +1,40 @@
# `asm_experimental_arch`
The tracking issue for this feature is: [#133416]
[#133416]: https://github.com/rust-lang/rust/issues/133416
------------------------
This tracks support for additional registers in architectures where inline assembly is already stable.
## Register classes
| Architecture | Register class | Registers | LLVM constraint code |
| ------------ | -------------- | --------- | -------------------- |
| s390x | `vreg` | `v[0-31]` | `v` |
> **Notes**:
> - s390x `vreg` is clobber-only in stable.
## Register class supported types
| Architecture | Register class | Target feature | Allowed types |
| ------------ | -------------- | -------------- | ------------- |
| s390x | `vreg` | `vector` | `i32`, `f32`, `i64`, `f64`, `i128`, `f128`, `i8x16`, `i16x8`, `i32x4`, `i64x2`, `f32x4`, `f64x2` |
## Register aliases
| Architecture | Base register | Aliases |
| ------------ | ------------- | ------- |
## Unsupported registers
| Architecture | Unsupported register | Reason |
| ------------ | -------------------- | ------ |
## Template modifiers
| Architecture | Register class | Modifier | Example output | LLVM modifier |
| ------------ | -------------- | -------- | -------------- | ------------- |
| s390x | `vreg` | None | `%v0` | None |

View File

@ -7,6 +7,7 @@
//@ compile-flags: -Zmerge-functions=disabled //@ compile-flags: -Zmerge-functions=disabled
#![feature(no_core, lang_items, rustc_attrs, repr_simd, f128)] #![feature(no_core, lang_items, rustc_attrs, repr_simd, f128)]
#![cfg_attr(s390x_vector, feature(asm_experimental_reg))]
#![crate_type = "rlib"] #![crate_type = "rlib"]
#![no_core] #![no_core]
#![allow(asm_sub_register, non_camel_case_types)] #![allow(asm_sub_register, non_camel_case_types)]

View File

@ -1,13 +1,16 @@
//@ add-core-stubs //@ add-core-stubs
//@ needs-asm-support //@ needs-asm-support
//@ revisions: s390x s390x_vector //@ revisions: s390x s390x_vector s390x_vector_stable
//@[s390x] compile-flags: --target s390x-unknown-linux-gnu //@[s390x] compile-flags: --target s390x-unknown-linux-gnu
//@[s390x] needs-llvm-components: systemz //@[s390x] needs-llvm-components: systemz
//@[s390x_vector] compile-flags: --target s390x-unknown-linux-gnu -C target-feature=+vector //@[s390x_vector] compile-flags: --target s390x-unknown-linux-gnu -C target-feature=+vector
//@[s390x_vector] needs-llvm-components: systemz //@[s390x_vector] needs-llvm-components: systemz
//@[s390x_vector_stable] compile-flags: --target s390x-unknown-linux-gnu -C target-feature=+vector
//@[s390x_vector_stable] needs-llvm-components: systemz
#![crate_type = "rlib"] #![crate_type = "rlib"]
#![feature(no_core, rustc_attrs, repr_simd)] #![feature(no_core, rustc_attrs, repr_simd)]
#![cfg_attr(not(s390x_vector_stable), feature(asm_experimental_reg))]
#![no_core] #![no_core]
#![allow(non_camel_case_types)] #![allow(non_camel_case_types)]
@ -68,29 +71,48 @@ fn f() {
// vreg // vreg
asm!("", out("v0") _); // always ok asm!("", out("v0") _); // always ok
asm!("", in("v0") v); // requires vector asm!("", in("v0") v); // requires vector & asm_experimental_reg
//[s390x]~^ ERROR register class `vreg` requires the `vector` target feature //[s390x]~^ ERROR register class `vreg` requires the `vector` target feature
asm!("", out("v0") v); // requires vector //[s390x_vector_stable]~^^ ERROR register class `vreg` can only be used as a clobber in stable [E0658]
//[s390x_vector_stable]~| ERROR type `i64x2` cannot be used with this register class in stable [E0658]
asm!("", out("v0") v); // requires vector & asm_experimental_reg
//[s390x]~^ ERROR register class `vreg` requires the `vector` target feature //[s390x]~^ ERROR register class `vreg` requires the `vector` target feature
asm!("", in("v0") x); // requires vector //[s390x_vector_stable]~^^ ERROR register class `vreg` can only be used as a clobber in stable [E0658]
//[s390x_vector_stable]~| ERROR type `i64x2` cannot be used with this register class in stable [E0658]
asm!("", in("v0") x); // requires vector & asm_experimental_reg
//[s390x]~^ ERROR register class `vreg` requires the `vector` target feature //[s390x]~^ ERROR register class `vreg` requires the `vector` target feature
asm!("", out("v0") x); // requires vector //[s390x_vector_stable]~^^ ERROR register class `vreg` can only be used as a clobber in stable [E0658]
//[s390x_vector_stable]~| ERROR type `i32` cannot be used with this register class in stable [E0658]
asm!("", out("v0") x); // requires vector & asm_experimental_reg
//[s390x]~^ ERROR register class `vreg` requires the `vector` target feature //[s390x]~^ ERROR register class `vreg` requires the `vector` target feature
//[s390x_vector_stable]~^^ ERROR register class `vreg` can only be used as a clobber in stable [E0658]
//[s390x_vector_stable]~| ERROR type `i32` cannot be used with this register class in stable [E0658]
asm!("", in("v0") b); asm!("", in("v0") b);
//[s390x]~^ ERROR register class `vreg` requires the `vector` target feature //[s390x]~^ ERROR register class `vreg` requires the `vector` target feature
//[s390x_vector]~^^ ERROR type `u8` cannot be used with this register class //[s390x_vector]~^^ ERROR type `u8` cannot be used with this register class
//[s390x_vector_stable]~^^^ ERROR register class `vreg` can only be used as a clobber in stable [E0658]
//[s390x_vector_stable]~| ERROR type `u8` cannot be used with this register class
asm!("", out("v0") b); asm!("", out("v0") b);
//[s390x]~^ ERROR register class `vreg` requires the `vector` target feature //[s390x]~^ ERROR register class `vreg` requires the `vector` target feature
//[s390x_vector]~^^ ERROR type `u8` cannot be used with this register class //[s390x_vector]~^^ ERROR type `u8` cannot be used with this register class
asm!("/* {} */", in(vreg) v); // requires vector //[s390x_vector_stable]~^^^ ERROR register class `vreg` can only be used as a clobber in stable [E0658]
//[s390x_vector_stable]~| ERROR type `u8` cannot be used with this register class
asm!("/* {} */", in(vreg) v); // requires vector & asm_experimental_reg
//[s390x]~^ ERROR register class `vreg` requires the `vector` target feature //[s390x]~^ ERROR register class `vreg` requires the `vector` target feature
asm!("/* {} */", in(vreg) x); // requires vector //[s390x_vector_stable]~^^ ERROR register class `vreg` can only be used as a clobber in stable [E0658]
//[s390x_vector_stable]~| ERROR type `i64x2` cannot be used with this register class in stable [E0658]
asm!("/* {} */", in(vreg) x); // requires vector & asm_experimental_reg
//[s390x]~^ ERROR register class `vreg` requires the `vector` target feature //[s390x]~^ ERROR register class `vreg` requires the `vector` target feature
//[s390x_vector_stable]~^^ ERROR register class `vreg` can only be used as a clobber in stable [E0658]
//[s390x_vector_stable]~| ERROR type `i32` cannot be used with this register class in stable [E0658]
asm!("/* {} */", in(vreg) b); asm!("/* {} */", in(vreg) b);
//[s390x]~^ ERROR register class `vreg` requires the `vector` target feature //[s390x]~^ ERROR register class `vreg` requires the `vector` target feature
//[s390x_vector]~^^ ERROR type `u8` cannot be used with this register class //[s390x_vector]~^^ ERROR type `u8` cannot be used with this register class
asm!("/* {} */", out(vreg) _); // requires vector //[s390x_vector_stable]~^^^ ERROR register class `vreg` can only be used as a clobber in stable [E0658]
//[s390x_vector_stable]~| ERROR type `u8` cannot be used with this register class
asm!("/* {} */", out(vreg) _); // requires vector & asm_experimental_reg
//[s390x]~^ ERROR register class `vreg` requires the `vector` target feature //[s390x]~^ ERROR register class `vreg` requires the `vector` target feature
//[s390x_vector_stable]~^^ ERROR register class `vreg` can only be used as a clobber in stable [E0658]
// Clobber-only registers // Clobber-only registers
// areg // areg

View File

@ -1,149 +1,149 @@
error: invalid register `r11`: The frame pointer cannot be used as an operand for inline asm error: invalid register `r11`: The frame pointer cannot be used as an operand for inline asm
--> $DIR/bad-reg.rs:28:18 --> $DIR/bad-reg.rs:31:18
| |
LL | asm!("", out("r11") _); LL | asm!("", out("r11") _);
| ^^^^^^^^^^^^ | ^^^^^^^^^^^^
error: invalid register `r15`: The stack pointer cannot be used as an operand for inline asm error: invalid register `r15`: The stack pointer cannot be used as an operand for inline asm
--> $DIR/bad-reg.rs:30:18 --> $DIR/bad-reg.rs:33:18
| |
LL | asm!("", out("r15") _); LL | asm!("", out("r15") _);
| ^^^^^^^^^^^^ | ^^^^^^^^^^^^
error: invalid register `c0`: control registers are reserved by the kernel and cannot be used as operands for inline asm error: invalid register `c0`: control registers are reserved by the kernel and cannot be used as operands for inline asm
--> $DIR/bad-reg.rs:32:18 --> $DIR/bad-reg.rs:35:18
| |
LL | asm!("", out("c0") _); LL | asm!("", out("c0") _);
| ^^^^^^^^^^^ | ^^^^^^^^^^^
error: invalid register `c1`: control registers are reserved by the kernel and cannot be used as operands for inline asm error: invalid register `c1`: control registers are reserved by the kernel and cannot be used as operands for inline asm
--> $DIR/bad-reg.rs:34:18 --> $DIR/bad-reg.rs:37:18
| |
LL | asm!("", out("c1") _); LL | asm!("", out("c1") _);
| ^^^^^^^^^^^ | ^^^^^^^^^^^
error: invalid register `c2`: control registers are reserved by the kernel and cannot be used as operands for inline asm error: invalid register `c2`: control registers are reserved by the kernel and cannot be used as operands for inline asm
--> $DIR/bad-reg.rs:36:18 --> $DIR/bad-reg.rs:39:18
| |
LL | asm!("", out("c2") _); LL | asm!("", out("c2") _);
| ^^^^^^^^^^^ | ^^^^^^^^^^^
error: invalid register `c3`: control registers are reserved by the kernel and cannot be used as operands for inline asm error: invalid register `c3`: control registers are reserved by the kernel and cannot be used as operands for inline asm
--> $DIR/bad-reg.rs:38:18 --> $DIR/bad-reg.rs:41:18
| |
LL | asm!("", out("c3") _); LL | asm!("", out("c3") _);
| ^^^^^^^^^^^ | ^^^^^^^^^^^
error: invalid register `c4`: control registers are reserved by the kernel and cannot be used as operands for inline asm error: invalid register `c4`: control registers are reserved by the kernel and cannot be used as operands for inline asm
--> $DIR/bad-reg.rs:40:18 --> $DIR/bad-reg.rs:43:18
| |
LL | asm!("", out("c4") _); LL | asm!("", out("c4") _);
| ^^^^^^^^^^^ | ^^^^^^^^^^^
error: invalid register `c5`: control registers are reserved by the kernel and cannot be used as operands for inline asm error: invalid register `c5`: control registers are reserved by the kernel and cannot be used as operands for inline asm
--> $DIR/bad-reg.rs:42:18 --> $DIR/bad-reg.rs:45:18
| |
LL | asm!("", out("c5") _); LL | asm!("", out("c5") _);
| ^^^^^^^^^^^ | ^^^^^^^^^^^
error: invalid register `c6`: control registers are reserved by the kernel and cannot be used as operands for inline asm error: invalid register `c6`: control registers are reserved by the kernel and cannot be used as operands for inline asm
--> $DIR/bad-reg.rs:44:18 --> $DIR/bad-reg.rs:47:18
| |
LL | asm!("", out("c6") _); LL | asm!("", out("c6") _);
| ^^^^^^^^^^^ | ^^^^^^^^^^^
error: invalid register `c7`: control registers are reserved by the kernel and cannot be used as operands for inline asm error: invalid register `c7`: control registers are reserved by the kernel and cannot be used as operands for inline asm
--> $DIR/bad-reg.rs:46:18 --> $DIR/bad-reg.rs:49:18
| |
LL | asm!("", out("c7") _); LL | asm!("", out("c7") _);
| ^^^^^^^^^^^ | ^^^^^^^^^^^
error: invalid register `c8`: control registers are reserved by the kernel and cannot be used as operands for inline asm error: invalid register `c8`: control registers are reserved by the kernel and cannot be used as operands for inline asm
--> $DIR/bad-reg.rs:48:18 --> $DIR/bad-reg.rs:51:18
| |
LL | asm!("", out("c8") _); LL | asm!("", out("c8") _);
| ^^^^^^^^^^^ | ^^^^^^^^^^^
error: invalid register `c9`: control registers are reserved by the kernel and cannot be used as operands for inline asm error: invalid register `c9`: control registers are reserved by the kernel and cannot be used as operands for inline asm
--> $DIR/bad-reg.rs:50:18 --> $DIR/bad-reg.rs:53:18
| |
LL | asm!("", out("c9") _); LL | asm!("", out("c9") _);
| ^^^^^^^^^^^ | ^^^^^^^^^^^
error: invalid register `c10`: control registers are reserved by the kernel and cannot be used as operands for inline asm error: invalid register `c10`: control registers are reserved by the kernel and cannot be used as operands for inline asm
--> $DIR/bad-reg.rs:52:18 --> $DIR/bad-reg.rs:55:18
| |
LL | asm!("", out("c10") _); LL | asm!("", out("c10") _);
| ^^^^^^^^^^^^ | ^^^^^^^^^^^^
error: invalid register `c11`: control registers are reserved by the kernel and cannot be used as operands for inline asm error: invalid register `c11`: control registers are reserved by the kernel and cannot be used as operands for inline asm
--> $DIR/bad-reg.rs:54:18 --> $DIR/bad-reg.rs:57:18
| |
LL | asm!("", out("c11") _); LL | asm!("", out("c11") _);
| ^^^^^^^^^^^^ | ^^^^^^^^^^^^
error: invalid register `c12`: control registers are reserved by the kernel and cannot be used as operands for inline asm error: invalid register `c12`: control registers are reserved by the kernel and cannot be used as operands for inline asm
--> $DIR/bad-reg.rs:56:18 --> $DIR/bad-reg.rs:59:18
| |
LL | asm!("", out("c12") _); LL | asm!("", out("c12") _);
| ^^^^^^^^^^^^ | ^^^^^^^^^^^^
error: invalid register `c13`: control registers are reserved by the kernel and cannot be used as operands for inline asm error: invalid register `c13`: control registers are reserved by the kernel and cannot be used as operands for inline asm
--> $DIR/bad-reg.rs:58:18 --> $DIR/bad-reg.rs:61:18
| |
LL | asm!("", out("c13") _); LL | asm!("", out("c13") _);
| ^^^^^^^^^^^^ | ^^^^^^^^^^^^
error: invalid register `c14`: control registers are reserved by the kernel and cannot be used as operands for inline asm error: invalid register `c14`: control registers are reserved by the kernel and cannot be used as operands for inline asm
--> $DIR/bad-reg.rs:60:18 --> $DIR/bad-reg.rs:63:18
| |
LL | asm!("", out("c14") _); LL | asm!("", out("c14") _);
| ^^^^^^^^^^^^ | ^^^^^^^^^^^^
error: invalid register `c15`: control registers are reserved by the kernel and cannot be used as operands for inline asm error: invalid register `c15`: control registers are reserved by the kernel and cannot be used as operands for inline asm
--> $DIR/bad-reg.rs:62:18 --> $DIR/bad-reg.rs:65:18
| |
LL | asm!("", out("c15") _); LL | asm!("", out("c15") _);
| ^^^^^^^^^^^^ | ^^^^^^^^^^^^
error: invalid register `a0`: a0 and a1 are reserved for system use and cannot be used as operands for inline asm error: invalid register `a0`: a0 and a1 are reserved for system use and cannot be used as operands for inline asm
--> $DIR/bad-reg.rs:64:18 --> $DIR/bad-reg.rs:67:18
| |
LL | asm!("", out("a0") _); LL | asm!("", out("a0") _);
| ^^^^^^^^^^^ | ^^^^^^^^^^^
error: invalid register `a1`: a0 and a1 are reserved for system use and cannot be used as operands for inline asm error: invalid register `a1`: a0 and a1 are reserved for system use and cannot be used as operands for inline asm
--> $DIR/bad-reg.rs:66:18 --> $DIR/bad-reg.rs:69:18
| |
LL | asm!("", out("a1") _); LL | asm!("", out("a1") _);
| ^^^^^^^^^^^ | ^^^^^^^^^^^
error: register class `areg` can only be used as a clobber, not as an input or output error: register class `areg` can only be used as a clobber, not as an input or output
--> $DIR/bad-reg.rs:98:18 --> $DIR/bad-reg.rs:120:18
| |
LL | asm!("", in("a2") x); LL | asm!("", in("a2") x);
| ^^^^^^^^^^ | ^^^^^^^^^^
error: register class `areg` can only be used as a clobber, not as an input or output error: register class `areg` can only be used as a clobber, not as an input or output
--> $DIR/bad-reg.rs:101:18 --> $DIR/bad-reg.rs:123:18
| |
LL | asm!("", out("a2") x); LL | asm!("", out("a2") x);
| ^^^^^^^^^^^ | ^^^^^^^^^^^
error: register class `areg` can only be used as a clobber, not as an input or output error: register class `areg` can only be used as a clobber, not as an input or output
--> $DIR/bad-reg.rs:104:26 --> $DIR/bad-reg.rs:126:26
| |
LL | asm!("/* {} */", in(areg) x); LL | asm!("/* {} */", in(areg) x);
| ^^^^^^^^^^ | ^^^^^^^^^^
error: register class `areg` can only be used as a clobber, not as an input or output error: register class `areg` can only be used as a clobber, not as an input or output
--> $DIR/bad-reg.rs:107:26 --> $DIR/bad-reg.rs:129:26
| |
LL | asm!("/* {} */", out(areg) _); LL | asm!("/* {} */", out(areg) _);
| ^^^^^^^^^^^ | ^^^^^^^^^^^
error: register `f0` conflicts with register `v0` error: register `f0` conflicts with register `v0`
--> $DIR/bad-reg.rs:112:31 --> $DIR/bad-reg.rs:134:31
| |
LL | asm!("", out("v0") _, out("f0") _); LL | asm!("", out("v0") _, out("f0") _);
| ----------- ^^^^^^^^^^^ register `f0` | ----------- ^^^^^^^^^^^ register `f0`
@ -151,7 +151,7 @@ LL | asm!("", out("v0") _, out("f0") _);
| register `v0` | register `v0`
error: register `f1` conflicts with register `v1` error: register `f1` conflicts with register `v1`
--> $DIR/bad-reg.rs:114:31 --> $DIR/bad-reg.rs:136:31
| |
LL | asm!("", out("v1") _, out("f1") _); LL | asm!("", out("v1") _, out("f1") _);
| ----------- ^^^^^^^^^^^ register `f1` | ----------- ^^^^^^^^^^^ register `f1`
@ -159,7 +159,7 @@ LL | asm!("", out("v1") _, out("f1") _);
| register `v1` | register `v1`
error: register `f2` conflicts with register `v2` error: register `f2` conflicts with register `v2`
--> $DIR/bad-reg.rs:116:31 --> $DIR/bad-reg.rs:138:31
| |
LL | asm!("", out("v2") _, out("f2") _); LL | asm!("", out("v2") _, out("f2") _);
| ----------- ^^^^^^^^^^^ register `f2` | ----------- ^^^^^^^^^^^ register `f2`
@ -167,7 +167,7 @@ LL | asm!("", out("v2") _, out("f2") _);
| register `v2` | register `v2`
error: register `f3` conflicts with register `v3` error: register `f3` conflicts with register `v3`
--> $DIR/bad-reg.rs:118:31 --> $DIR/bad-reg.rs:140:31
| |
LL | asm!("", out("v3") _, out("f3") _); LL | asm!("", out("v3") _, out("f3") _);
| ----------- ^^^^^^^^^^^ register `f3` | ----------- ^^^^^^^^^^^ register `f3`
@ -175,7 +175,7 @@ LL | asm!("", out("v3") _, out("f3") _);
| register `v3` | register `v3`
error: register `f4` conflicts with register `v4` error: register `f4` conflicts with register `v4`
--> $DIR/bad-reg.rs:120:31 --> $DIR/bad-reg.rs:142:31
| |
LL | asm!("", out("v4") _, out("f4") _); LL | asm!("", out("v4") _, out("f4") _);
| ----------- ^^^^^^^^^^^ register `f4` | ----------- ^^^^^^^^^^^ register `f4`
@ -183,7 +183,7 @@ LL | asm!("", out("v4") _, out("f4") _);
| register `v4` | register `v4`
error: register `f5` conflicts with register `v5` error: register `f5` conflicts with register `v5`
--> $DIR/bad-reg.rs:122:31 --> $DIR/bad-reg.rs:144:31
| |
LL | asm!("", out("v5") _, out("f5") _); LL | asm!("", out("v5") _, out("f5") _);
| ----------- ^^^^^^^^^^^ register `f5` | ----------- ^^^^^^^^^^^ register `f5`
@ -191,7 +191,7 @@ LL | asm!("", out("v5") _, out("f5") _);
| register `v5` | register `v5`
error: register `f6` conflicts with register `v6` error: register `f6` conflicts with register `v6`
--> $DIR/bad-reg.rs:124:31 --> $DIR/bad-reg.rs:146:31
| |
LL | asm!("", out("v6") _, out("f6") _); LL | asm!("", out("v6") _, out("f6") _);
| ----------- ^^^^^^^^^^^ register `f6` | ----------- ^^^^^^^^^^^ register `f6`
@ -199,7 +199,7 @@ LL | asm!("", out("v6") _, out("f6") _);
| register `v6` | register `v6`
error: register `f7` conflicts with register `v7` error: register `f7` conflicts with register `v7`
--> $DIR/bad-reg.rs:126:31 --> $DIR/bad-reg.rs:148:31
| |
LL | asm!("", out("v7") _, out("f7") _); LL | asm!("", out("v7") _, out("f7") _);
| ----------- ^^^^^^^^^^^ register `f7` | ----------- ^^^^^^^^^^^ register `f7`
@ -207,7 +207,7 @@ LL | asm!("", out("v7") _, out("f7") _);
| register `v7` | register `v7`
error: register `f8` conflicts with register `v8` error: register `f8` conflicts with register `v8`
--> $DIR/bad-reg.rs:128:31 --> $DIR/bad-reg.rs:150:31
| |
LL | asm!("", out("v8") _, out("f8") _); LL | asm!("", out("v8") _, out("f8") _);
| ----------- ^^^^^^^^^^^ register `f8` | ----------- ^^^^^^^^^^^ register `f8`
@ -215,7 +215,7 @@ LL | asm!("", out("v8") _, out("f8") _);
| register `v8` | register `v8`
error: register `f9` conflicts with register `v9` error: register `f9` conflicts with register `v9`
--> $DIR/bad-reg.rs:130:31 --> $DIR/bad-reg.rs:152:31
| |
LL | asm!("", out("v9") _, out("f9") _); LL | asm!("", out("v9") _, out("f9") _);
| ----------- ^^^^^^^^^^^ register `f9` | ----------- ^^^^^^^^^^^ register `f9`
@ -223,7 +223,7 @@ LL | asm!("", out("v9") _, out("f9") _);
| register `v9` | register `v9`
error: register `f10` conflicts with register `v10` error: register `f10` conflicts with register `v10`
--> $DIR/bad-reg.rs:132:32 --> $DIR/bad-reg.rs:154:32
| |
LL | asm!("", out("v10") _, out("f10") _); LL | asm!("", out("v10") _, out("f10") _);
| ------------ ^^^^^^^^^^^^ register `f10` | ------------ ^^^^^^^^^^^^ register `f10`
@ -231,7 +231,7 @@ LL | asm!("", out("v10") _, out("f10") _);
| register `v10` | register `v10`
error: register `f11` conflicts with register `v11` error: register `f11` conflicts with register `v11`
--> $DIR/bad-reg.rs:134:32 --> $DIR/bad-reg.rs:156:32
| |
LL | asm!("", out("v11") _, out("f11") _); LL | asm!("", out("v11") _, out("f11") _);
| ------------ ^^^^^^^^^^^^ register `f11` | ------------ ^^^^^^^^^^^^ register `f11`
@ -239,7 +239,7 @@ LL | asm!("", out("v11") _, out("f11") _);
| register `v11` | register `v11`
error: register `f12` conflicts with register `v12` error: register `f12` conflicts with register `v12`
--> $DIR/bad-reg.rs:136:32 --> $DIR/bad-reg.rs:158:32
| |
LL | asm!("", out("v12") _, out("f12") _); LL | asm!("", out("v12") _, out("f12") _);
| ------------ ^^^^^^^^^^^^ register `f12` | ------------ ^^^^^^^^^^^^ register `f12`
@ -247,7 +247,7 @@ LL | asm!("", out("v12") _, out("f12") _);
| register `v12` | register `v12`
error: register `f13` conflicts with register `v13` error: register `f13` conflicts with register `v13`
--> $DIR/bad-reg.rs:138:32 --> $DIR/bad-reg.rs:160:32
| |
LL | asm!("", out("v13") _, out("f13") _); LL | asm!("", out("v13") _, out("f13") _);
| ------------ ^^^^^^^^^^^^ register `f13` | ------------ ^^^^^^^^^^^^ register `f13`
@ -255,7 +255,7 @@ LL | asm!("", out("v13") _, out("f13") _);
| register `v13` | register `v13`
error: register `f14` conflicts with register `v14` error: register `f14` conflicts with register `v14`
--> $DIR/bad-reg.rs:140:32 --> $DIR/bad-reg.rs:162:32
| |
LL | asm!("", out("v14") _, out("f14") _); LL | asm!("", out("v14") _, out("f14") _);
| ------------ ^^^^^^^^^^^^ register `f14` | ------------ ^^^^^^^^^^^^ register `f14`
@ -263,7 +263,7 @@ LL | asm!("", out("v14") _, out("f14") _);
| register `v14` | register `v14`
error: register `f15` conflicts with register `v15` error: register `f15` conflicts with register `v15`
--> $DIR/bad-reg.rs:142:32 --> $DIR/bad-reg.rs:164:32
| |
LL | asm!("", out("v15") _, out("f15") _); LL | asm!("", out("v15") _, out("f15") _);
| ------------ ^^^^^^^^^^^^ register `f15` | ------------ ^^^^^^^^^^^^ register `f15`
@ -271,73 +271,73 @@ LL | asm!("", out("v15") _, out("f15") _);
| register `v15` | register `v15`
error: invalid register `f16`: unknown register error: invalid register `f16`: unknown register
--> $DIR/bad-reg.rs:145:32 --> $DIR/bad-reg.rs:167:32
| |
LL | asm!("", out("v16") _, out("f16") _); LL | asm!("", out("v16") _, out("f16") _);
| ^^^^^^^^^^^^ | ^^^^^^^^^^^^
error: register class `vreg` requires the `vector` target feature error: register class `vreg` requires the `vector` target feature
--> $DIR/bad-reg.rs:71:18 --> $DIR/bad-reg.rs:74:18
| |
LL | asm!("", in("v0") v); // requires vector LL | asm!("", in("v0") v); // requires vector & asm_experimental_reg
| ^^^^^^^^^^ | ^^^^^^^^^^
error: register class `vreg` requires the `vector` target feature error: register class `vreg` requires the `vector` target feature
--> $DIR/bad-reg.rs:73:18 --> $DIR/bad-reg.rs:78:18
| |
LL | asm!("", out("v0") v); // requires vector LL | asm!("", out("v0") v); // requires vector & asm_experimental_reg
| ^^^^^^^^^^^ | ^^^^^^^^^^^
error: register class `vreg` requires the `vector` target feature error: register class `vreg` requires the `vector` target feature
--> $DIR/bad-reg.rs:75:18 --> $DIR/bad-reg.rs:82:18
| |
LL | asm!("", in("v0") x); // requires vector LL | asm!("", in("v0") x); // requires vector & asm_experimental_reg
| ^^^^^^^^^^ | ^^^^^^^^^^
error: register class `vreg` requires the `vector` target feature error: register class `vreg` requires the `vector` target feature
--> $DIR/bad-reg.rs:77:18 --> $DIR/bad-reg.rs:86:18
| |
LL | asm!("", out("v0") x); // requires vector LL | asm!("", out("v0") x); // requires vector & asm_experimental_reg
| ^^^^^^^^^^^ | ^^^^^^^^^^^
error: register class `vreg` requires the `vector` target feature error: register class `vreg` requires the `vector` target feature
--> $DIR/bad-reg.rs:79:18 --> $DIR/bad-reg.rs:90:18
| |
LL | asm!("", in("v0") b); LL | asm!("", in("v0") b);
| ^^^^^^^^^^ | ^^^^^^^^^^
error: register class `vreg` requires the `vector` target feature error: register class `vreg` requires the `vector` target feature
--> $DIR/bad-reg.rs:82:18 --> $DIR/bad-reg.rs:95:18
| |
LL | asm!("", out("v0") b); LL | asm!("", out("v0") b);
| ^^^^^^^^^^^ | ^^^^^^^^^^^
error: register class `vreg` requires the `vector` target feature error: register class `vreg` requires the `vector` target feature
--> $DIR/bad-reg.rs:85:26 --> $DIR/bad-reg.rs:100:26
| |
LL | asm!("/* {} */", in(vreg) v); // requires vector LL | asm!("/* {} */", in(vreg) v); // requires vector & asm_experimental_reg
| ^^^^^^^^^^ | ^^^^^^^^^^
error: register class `vreg` requires the `vector` target feature error: register class `vreg` requires the `vector` target feature
--> $DIR/bad-reg.rs:87:26 --> $DIR/bad-reg.rs:104:26
| |
LL | asm!("/* {} */", in(vreg) x); // requires vector LL | asm!("/* {} */", in(vreg) x); // requires vector & asm_experimental_reg
| ^^^^^^^^^^ | ^^^^^^^^^^
error: register class `vreg` requires the `vector` target feature error: register class `vreg` requires the `vector` target feature
--> $DIR/bad-reg.rs:89:26 --> $DIR/bad-reg.rs:108:26
| |
LL | asm!("/* {} */", in(vreg) b); LL | asm!("/* {} */", in(vreg) b);
| ^^^^^^^^^^ | ^^^^^^^^^^
error: register class `vreg` requires the `vector` target feature error: register class `vreg` requires the `vector` target feature
--> $DIR/bad-reg.rs:92:26 --> $DIR/bad-reg.rs:113:26
| |
LL | asm!("/* {} */", out(vreg) _); // requires vector LL | asm!("/* {} */", out(vreg) _); // requires vector & asm_experimental_reg
| ^^^^^^^^^^^ | ^^^^^^^^^^^
error: type `i32` cannot be used with this register class error: type `i32` cannot be used with this register class
--> $DIR/bad-reg.rs:98:27 --> $DIR/bad-reg.rs:120:27
| |
LL | asm!("", in("a2") x); LL | asm!("", in("a2") x);
| ^ | ^
@ -345,7 +345,7 @@ LL | asm!("", in("a2") x);
= note: register class `areg` supports these types: = note: register class `areg` supports these types:
error: type `i32` cannot be used with this register class error: type `i32` cannot be used with this register class
--> $DIR/bad-reg.rs:101:28 --> $DIR/bad-reg.rs:123:28
| |
LL | asm!("", out("a2") x); LL | asm!("", out("a2") x);
| ^ | ^
@ -353,7 +353,7 @@ LL | asm!("", out("a2") x);
= note: register class `areg` supports these types: = note: register class `areg` supports these types:
error: type `i32` cannot be used with this register class error: type `i32` cannot be used with this register class
--> $DIR/bad-reg.rs:104:35 --> $DIR/bad-reg.rs:126:35
| |
LL | asm!("/* {} */", in(areg) x); LL | asm!("/* {} */", in(areg) x);
| ^ | ^

View File

@ -1,149 +1,149 @@
error: invalid register `r11`: The frame pointer cannot be used as an operand for inline asm error: invalid register `r11`: The frame pointer cannot be used as an operand for inline asm
--> $DIR/bad-reg.rs:28:18 --> $DIR/bad-reg.rs:31:18
| |
LL | asm!("", out("r11") _); LL | asm!("", out("r11") _);
| ^^^^^^^^^^^^ | ^^^^^^^^^^^^
error: invalid register `r15`: The stack pointer cannot be used as an operand for inline asm error: invalid register `r15`: The stack pointer cannot be used as an operand for inline asm
--> $DIR/bad-reg.rs:30:18 --> $DIR/bad-reg.rs:33:18
| |
LL | asm!("", out("r15") _); LL | asm!("", out("r15") _);
| ^^^^^^^^^^^^ | ^^^^^^^^^^^^
error: invalid register `c0`: control registers are reserved by the kernel and cannot be used as operands for inline asm error: invalid register `c0`: control registers are reserved by the kernel and cannot be used as operands for inline asm
--> $DIR/bad-reg.rs:32:18 --> $DIR/bad-reg.rs:35:18
| |
LL | asm!("", out("c0") _); LL | asm!("", out("c0") _);
| ^^^^^^^^^^^ | ^^^^^^^^^^^
error: invalid register `c1`: control registers are reserved by the kernel and cannot be used as operands for inline asm error: invalid register `c1`: control registers are reserved by the kernel and cannot be used as operands for inline asm
--> $DIR/bad-reg.rs:34:18 --> $DIR/bad-reg.rs:37:18
| |
LL | asm!("", out("c1") _); LL | asm!("", out("c1") _);
| ^^^^^^^^^^^ | ^^^^^^^^^^^
error: invalid register `c2`: control registers are reserved by the kernel and cannot be used as operands for inline asm error: invalid register `c2`: control registers are reserved by the kernel and cannot be used as operands for inline asm
--> $DIR/bad-reg.rs:36:18 --> $DIR/bad-reg.rs:39:18
| |
LL | asm!("", out("c2") _); LL | asm!("", out("c2") _);
| ^^^^^^^^^^^ | ^^^^^^^^^^^
error: invalid register `c3`: control registers are reserved by the kernel and cannot be used as operands for inline asm error: invalid register `c3`: control registers are reserved by the kernel and cannot be used as operands for inline asm
--> $DIR/bad-reg.rs:38:18 --> $DIR/bad-reg.rs:41:18
| |
LL | asm!("", out("c3") _); LL | asm!("", out("c3") _);
| ^^^^^^^^^^^ | ^^^^^^^^^^^
error: invalid register `c4`: control registers are reserved by the kernel and cannot be used as operands for inline asm error: invalid register `c4`: control registers are reserved by the kernel and cannot be used as operands for inline asm
--> $DIR/bad-reg.rs:40:18 --> $DIR/bad-reg.rs:43:18
| |
LL | asm!("", out("c4") _); LL | asm!("", out("c4") _);
| ^^^^^^^^^^^ | ^^^^^^^^^^^
error: invalid register `c5`: control registers are reserved by the kernel and cannot be used as operands for inline asm error: invalid register `c5`: control registers are reserved by the kernel and cannot be used as operands for inline asm
--> $DIR/bad-reg.rs:42:18 --> $DIR/bad-reg.rs:45:18
| |
LL | asm!("", out("c5") _); LL | asm!("", out("c5") _);
| ^^^^^^^^^^^ | ^^^^^^^^^^^
error: invalid register `c6`: control registers are reserved by the kernel and cannot be used as operands for inline asm error: invalid register `c6`: control registers are reserved by the kernel and cannot be used as operands for inline asm
--> $DIR/bad-reg.rs:44:18 --> $DIR/bad-reg.rs:47:18
| |
LL | asm!("", out("c6") _); LL | asm!("", out("c6") _);
| ^^^^^^^^^^^ | ^^^^^^^^^^^
error: invalid register `c7`: control registers are reserved by the kernel and cannot be used as operands for inline asm error: invalid register `c7`: control registers are reserved by the kernel and cannot be used as operands for inline asm
--> $DIR/bad-reg.rs:46:18 --> $DIR/bad-reg.rs:49:18
| |
LL | asm!("", out("c7") _); LL | asm!("", out("c7") _);
| ^^^^^^^^^^^ | ^^^^^^^^^^^
error: invalid register `c8`: control registers are reserved by the kernel and cannot be used as operands for inline asm error: invalid register `c8`: control registers are reserved by the kernel and cannot be used as operands for inline asm
--> $DIR/bad-reg.rs:48:18 --> $DIR/bad-reg.rs:51:18
| |
LL | asm!("", out("c8") _); LL | asm!("", out("c8") _);
| ^^^^^^^^^^^ | ^^^^^^^^^^^
error: invalid register `c9`: control registers are reserved by the kernel and cannot be used as operands for inline asm error: invalid register `c9`: control registers are reserved by the kernel and cannot be used as operands for inline asm
--> $DIR/bad-reg.rs:50:18 --> $DIR/bad-reg.rs:53:18
| |
LL | asm!("", out("c9") _); LL | asm!("", out("c9") _);
| ^^^^^^^^^^^ | ^^^^^^^^^^^
error: invalid register `c10`: control registers are reserved by the kernel and cannot be used as operands for inline asm error: invalid register `c10`: control registers are reserved by the kernel and cannot be used as operands for inline asm
--> $DIR/bad-reg.rs:52:18 --> $DIR/bad-reg.rs:55:18
| |
LL | asm!("", out("c10") _); LL | asm!("", out("c10") _);
| ^^^^^^^^^^^^ | ^^^^^^^^^^^^
error: invalid register `c11`: control registers are reserved by the kernel and cannot be used as operands for inline asm error: invalid register `c11`: control registers are reserved by the kernel and cannot be used as operands for inline asm
--> $DIR/bad-reg.rs:54:18 --> $DIR/bad-reg.rs:57:18
| |
LL | asm!("", out("c11") _); LL | asm!("", out("c11") _);
| ^^^^^^^^^^^^ | ^^^^^^^^^^^^
error: invalid register `c12`: control registers are reserved by the kernel and cannot be used as operands for inline asm error: invalid register `c12`: control registers are reserved by the kernel and cannot be used as operands for inline asm
--> $DIR/bad-reg.rs:56:18 --> $DIR/bad-reg.rs:59:18
| |
LL | asm!("", out("c12") _); LL | asm!("", out("c12") _);
| ^^^^^^^^^^^^ | ^^^^^^^^^^^^
error: invalid register `c13`: control registers are reserved by the kernel and cannot be used as operands for inline asm error: invalid register `c13`: control registers are reserved by the kernel and cannot be used as operands for inline asm
--> $DIR/bad-reg.rs:58:18 --> $DIR/bad-reg.rs:61:18
| |
LL | asm!("", out("c13") _); LL | asm!("", out("c13") _);
| ^^^^^^^^^^^^ | ^^^^^^^^^^^^
error: invalid register `c14`: control registers are reserved by the kernel and cannot be used as operands for inline asm error: invalid register `c14`: control registers are reserved by the kernel and cannot be used as operands for inline asm
--> $DIR/bad-reg.rs:60:18 --> $DIR/bad-reg.rs:63:18
| |
LL | asm!("", out("c14") _); LL | asm!("", out("c14") _);
| ^^^^^^^^^^^^ | ^^^^^^^^^^^^
error: invalid register `c15`: control registers are reserved by the kernel and cannot be used as operands for inline asm error: invalid register `c15`: control registers are reserved by the kernel and cannot be used as operands for inline asm
--> $DIR/bad-reg.rs:62:18 --> $DIR/bad-reg.rs:65:18
| |
LL | asm!("", out("c15") _); LL | asm!("", out("c15") _);
| ^^^^^^^^^^^^ | ^^^^^^^^^^^^
error: invalid register `a0`: a0 and a1 are reserved for system use and cannot be used as operands for inline asm error: invalid register `a0`: a0 and a1 are reserved for system use and cannot be used as operands for inline asm
--> $DIR/bad-reg.rs:64:18 --> $DIR/bad-reg.rs:67:18
| |
LL | asm!("", out("a0") _); LL | asm!("", out("a0") _);
| ^^^^^^^^^^^ | ^^^^^^^^^^^
error: invalid register `a1`: a0 and a1 are reserved for system use and cannot be used as operands for inline asm error: invalid register `a1`: a0 and a1 are reserved for system use and cannot be used as operands for inline asm
--> $DIR/bad-reg.rs:66:18 --> $DIR/bad-reg.rs:69:18
| |
LL | asm!("", out("a1") _); LL | asm!("", out("a1") _);
| ^^^^^^^^^^^ | ^^^^^^^^^^^
error: register class `areg` can only be used as a clobber, not as an input or output error: register class `areg` can only be used as a clobber, not as an input or output
--> $DIR/bad-reg.rs:98:18 --> $DIR/bad-reg.rs:120:18
| |
LL | asm!("", in("a2") x); LL | asm!("", in("a2") x);
| ^^^^^^^^^^ | ^^^^^^^^^^
error: register class `areg` can only be used as a clobber, not as an input or output error: register class `areg` can only be used as a clobber, not as an input or output
--> $DIR/bad-reg.rs:101:18 --> $DIR/bad-reg.rs:123:18
| |
LL | asm!("", out("a2") x); LL | asm!("", out("a2") x);
| ^^^^^^^^^^^ | ^^^^^^^^^^^
error: register class `areg` can only be used as a clobber, not as an input or output error: register class `areg` can only be used as a clobber, not as an input or output
--> $DIR/bad-reg.rs:104:26 --> $DIR/bad-reg.rs:126:26
| |
LL | asm!("/* {} */", in(areg) x); LL | asm!("/* {} */", in(areg) x);
| ^^^^^^^^^^ | ^^^^^^^^^^
error: register class `areg` can only be used as a clobber, not as an input or output error: register class `areg` can only be used as a clobber, not as an input or output
--> $DIR/bad-reg.rs:107:26 --> $DIR/bad-reg.rs:129:26
| |
LL | asm!("/* {} */", out(areg) _); LL | asm!("/* {} */", out(areg) _);
| ^^^^^^^^^^^ | ^^^^^^^^^^^
error: register `f0` conflicts with register `v0` error: register `f0` conflicts with register `v0`
--> $DIR/bad-reg.rs:112:31 --> $DIR/bad-reg.rs:134:31
| |
LL | asm!("", out("v0") _, out("f0") _); LL | asm!("", out("v0") _, out("f0") _);
| ----------- ^^^^^^^^^^^ register `f0` | ----------- ^^^^^^^^^^^ register `f0`
@ -151,7 +151,7 @@ LL | asm!("", out("v0") _, out("f0") _);
| register `v0` | register `v0`
error: register `f1` conflicts with register `v1` error: register `f1` conflicts with register `v1`
--> $DIR/bad-reg.rs:114:31 --> $DIR/bad-reg.rs:136:31
| |
LL | asm!("", out("v1") _, out("f1") _); LL | asm!("", out("v1") _, out("f1") _);
| ----------- ^^^^^^^^^^^ register `f1` | ----------- ^^^^^^^^^^^ register `f1`
@ -159,7 +159,7 @@ LL | asm!("", out("v1") _, out("f1") _);
| register `v1` | register `v1`
error: register `f2` conflicts with register `v2` error: register `f2` conflicts with register `v2`
--> $DIR/bad-reg.rs:116:31 --> $DIR/bad-reg.rs:138:31
| |
LL | asm!("", out("v2") _, out("f2") _); LL | asm!("", out("v2") _, out("f2") _);
| ----------- ^^^^^^^^^^^ register `f2` | ----------- ^^^^^^^^^^^ register `f2`
@ -167,7 +167,7 @@ LL | asm!("", out("v2") _, out("f2") _);
| register `v2` | register `v2`
error: register `f3` conflicts with register `v3` error: register `f3` conflicts with register `v3`
--> $DIR/bad-reg.rs:118:31 --> $DIR/bad-reg.rs:140:31
| |
LL | asm!("", out("v3") _, out("f3") _); LL | asm!("", out("v3") _, out("f3") _);
| ----------- ^^^^^^^^^^^ register `f3` | ----------- ^^^^^^^^^^^ register `f3`
@ -175,7 +175,7 @@ LL | asm!("", out("v3") _, out("f3") _);
| register `v3` | register `v3`
error: register `f4` conflicts with register `v4` error: register `f4` conflicts with register `v4`
--> $DIR/bad-reg.rs:120:31 --> $DIR/bad-reg.rs:142:31
| |
LL | asm!("", out("v4") _, out("f4") _); LL | asm!("", out("v4") _, out("f4") _);
| ----------- ^^^^^^^^^^^ register `f4` | ----------- ^^^^^^^^^^^ register `f4`
@ -183,7 +183,7 @@ LL | asm!("", out("v4") _, out("f4") _);
| register `v4` | register `v4`
error: register `f5` conflicts with register `v5` error: register `f5` conflicts with register `v5`
--> $DIR/bad-reg.rs:122:31 --> $DIR/bad-reg.rs:144:31
| |
LL | asm!("", out("v5") _, out("f5") _); LL | asm!("", out("v5") _, out("f5") _);
| ----------- ^^^^^^^^^^^ register `f5` | ----------- ^^^^^^^^^^^ register `f5`
@ -191,7 +191,7 @@ LL | asm!("", out("v5") _, out("f5") _);
| register `v5` | register `v5`
error: register `f6` conflicts with register `v6` error: register `f6` conflicts with register `v6`
--> $DIR/bad-reg.rs:124:31 --> $DIR/bad-reg.rs:146:31
| |
LL | asm!("", out("v6") _, out("f6") _); LL | asm!("", out("v6") _, out("f6") _);
| ----------- ^^^^^^^^^^^ register `f6` | ----------- ^^^^^^^^^^^ register `f6`
@ -199,7 +199,7 @@ LL | asm!("", out("v6") _, out("f6") _);
| register `v6` | register `v6`
error: register `f7` conflicts with register `v7` error: register `f7` conflicts with register `v7`
--> $DIR/bad-reg.rs:126:31 --> $DIR/bad-reg.rs:148:31
| |
LL | asm!("", out("v7") _, out("f7") _); LL | asm!("", out("v7") _, out("f7") _);
| ----------- ^^^^^^^^^^^ register `f7` | ----------- ^^^^^^^^^^^ register `f7`
@ -207,7 +207,7 @@ LL | asm!("", out("v7") _, out("f7") _);
| register `v7` | register `v7`
error: register `f8` conflicts with register `v8` error: register `f8` conflicts with register `v8`
--> $DIR/bad-reg.rs:128:31 --> $DIR/bad-reg.rs:150:31
| |
LL | asm!("", out("v8") _, out("f8") _); LL | asm!("", out("v8") _, out("f8") _);
| ----------- ^^^^^^^^^^^ register `f8` | ----------- ^^^^^^^^^^^ register `f8`
@ -215,7 +215,7 @@ LL | asm!("", out("v8") _, out("f8") _);
| register `v8` | register `v8`
error: register `f9` conflicts with register `v9` error: register `f9` conflicts with register `v9`
--> $DIR/bad-reg.rs:130:31 --> $DIR/bad-reg.rs:152:31
| |
LL | asm!("", out("v9") _, out("f9") _); LL | asm!("", out("v9") _, out("f9") _);
| ----------- ^^^^^^^^^^^ register `f9` | ----------- ^^^^^^^^^^^ register `f9`
@ -223,7 +223,7 @@ LL | asm!("", out("v9") _, out("f9") _);
| register `v9` | register `v9`
error: register `f10` conflicts with register `v10` error: register `f10` conflicts with register `v10`
--> $DIR/bad-reg.rs:132:32 --> $DIR/bad-reg.rs:154:32
| |
LL | asm!("", out("v10") _, out("f10") _); LL | asm!("", out("v10") _, out("f10") _);
| ------------ ^^^^^^^^^^^^ register `f10` | ------------ ^^^^^^^^^^^^ register `f10`
@ -231,7 +231,7 @@ LL | asm!("", out("v10") _, out("f10") _);
| register `v10` | register `v10`
error: register `f11` conflicts with register `v11` error: register `f11` conflicts with register `v11`
--> $DIR/bad-reg.rs:134:32 --> $DIR/bad-reg.rs:156:32
| |
LL | asm!("", out("v11") _, out("f11") _); LL | asm!("", out("v11") _, out("f11") _);
| ------------ ^^^^^^^^^^^^ register `f11` | ------------ ^^^^^^^^^^^^ register `f11`
@ -239,7 +239,7 @@ LL | asm!("", out("v11") _, out("f11") _);
| register `v11` | register `v11`
error: register `f12` conflicts with register `v12` error: register `f12` conflicts with register `v12`
--> $DIR/bad-reg.rs:136:32 --> $DIR/bad-reg.rs:158:32
| |
LL | asm!("", out("v12") _, out("f12") _); LL | asm!("", out("v12") _, out("f12") _);
| ------------ ^^^^^^^^^^^^ register `f12` | ------------ ^^^^^^^^^^^^ register `f12`
@ -247,7 +247,7 @@ LL | asm!("", out("v12") _, out("f12") _);
| register `v12` | register `v12`
error: register `f13` conflicts with register `v13` error: register `f13` conflicts with register `v13`
--> $DIR/bad-reg.rs:138:32 --> $DIR/bad-reg.rs:160:32
| |
LL | asm!("", out("v13") _, out("f13") _); LL | asm!("", out("v13") _, out("f13") _);
| ------------ ^^^^^^^^^^^^ register `f13` | ------------ ^^^^^^^^^^^^ register `f13`
@ -255,7 +255,7 @@ LL | asm!("", out("v13") _, out("f13") _);
| register `v13` | register `v13`
error: register `f14` conflicts with register `v14` error: register `f14` conflicts with register `v14`
--> $DIR/bad-reg.rs:140:32 --> $DIR/bad-reg.rs:162:32
| |
LL | asm!("", out("v14") _, out("f14") _); LL | asm!("", out("v14") _, out("f14") _);
| ------------ ^^^^^^^^^^^^ register `f14` | ------------ ^^^^^^^^^^^^ register `f14`
@ -263,7 +263,7 @@ LL | asm!("", out("v14") _, out("f14") _);
| register `v14` | register `v14`
error: register `f15` conflicts with register `v15` error: register `f15` conflicts with register `v15`
--> $DIR/bad-reg.rs:142:32 --> $DIR/bad-reg.rs:164:32
| |
LL | asm!("", out("v15") _, out("f15") _); LL | asm!("", out("v15") _, out("f15") _);
| ------------ ^^^^^^^^^^^^ register `f15` | ------------ ^^^^^^^^^^^^ register `f15`
@ -271,13 +271,13 @@ LL | asm!("", out("v15") _, out("f15") _);
| register `v15` | register `v15`
error: invalid register `f16`: unknown register error: invalid register `f16`: unknown register
--> $DIR/bad-reg.rs:145:32 --> $DIR/bad-reg.rs:167:32
| |
LL | asm!("", out("v16") _, out("f16") _); LL | asm!("", out("v16") _, out("f16") _);
| ^^^^^^^^^^^^ | ^^^^^^^^^^^^
error: type `u8` cannot be used with this register class error: type `u8` cannot be used with this register class
--> $DIR/bad-reg.rs:79:27 --> $DIR/bad-reg.rs:90:27
| |
LL | asm!("", in("v0") b); LL | asm!("", in("v0") b);
| ^ | ^
@ -285,7 +285,7 @@ LL | asm!("", in("v0") b);
= note: register class `vreg` supports these types: i32, f32, i64, f64, i128, f128, i8x16, i16x8, i32x4, i64x2, f32x4, f64x2 = note: register class `vreg` supports these types: i32, f32, i64, f64, i128, f128, i8x16, i16x8, i32x4, i64x2, f32x4, f64x2
error: type `u8` cannot be used with this register class error: type `u8` cannot be used with this register class
--> $DIR/bad-reg.rs:82:28 --> $DIR/bad-reg.rs:95:28
| |
LL | asm!("", out("v0") b); LL | asm!("", out("v0") b);
| ^ | ^
@ -293,7 +293,7 @@ LL | asm!("", out("v0") b);
= note: register class `vreg` supports these types: i32, f32, i64, f64, i128, f128, i8x16, i16x8, i32x4, i64x2, f32x4, f64x2 = note: register class `vreg` supports these types: i32, f32, i64, f64, i128, f128, i8x16, i16x8, i32x4, i64x2, f32x4, f64x2
error: type `u8` cannot be used with this register class error: type `u8` cannot be used with this register class
--> $DIR/bad-reg.rs:89:35 --> $DIR/bad-reg.rs:108:35
| |
LL | asm!("/* {} */", in(vreg) b); LL | asm!("/* {} */", in(vreg) b);
| ^ | ^
@ -301,7 +301,7 @@ LL | asm!("/* {} */", in(vreg) b);
= note: register class `vreg` supports these types: i32, f32, i64, f64, i128, f128, i8x16, i16x8, i32x4, i64x2, f32x4, f64x2 = note: register class `vreg` supports these types: i32, f32, i64, f64, i128, f128, i8x16, i16x8, i32x4, i64x2, f32x4, f64x2
error: type `i32` cannot be used with this register class error: type `i32` cannot be used with this register class
--> $DIR/bad-reg.rs:98:27 --> $DIR/bad-reg.rs:120:27
| |
LL | asm!("", in("a2") x); LL | asm!("", in("a2") x);
| ^ | ^
@ -309,7 +309,7 @@ LL | asm!("", in("a2") x);
= note: register class `areg` supports these types: = note: register class `areg` supports these types:
error: type `i32` cannot be used with this register class error: type `i32` cannot be used with this register class
--> $DIR/bad-reg.rs:101:28 --> $DIR/bad-reg.rs:123:28
| |
LL | asm!("", out("a2") x); LL | asm!("", out("a2") x);
| ^ | ^
@ -317,7 +317,7 @@ LL | asm!("", out("a2") x);
= note: register class `areg` supports these types: = note: register class `areg` supports these types:
error: type `i32` cannot be used with this register class error: type `i32` cannot be used with this register class
--> $DIR/bad-reg.rs:104:35 --> $DIR/bad-reg.rs:126:35
| |
LL | asm!("/* {} */", in(areg) x); LL | asm!("/* {} */", in(areg) x);
| ^ | ^

View File

@ -0,0 +1,489 @@
error: invalid register `r11`: The frame pointer cannot be used as an operand for inline asm
--> $DIR/bad-reg.rs:31:18
|
LL | asm!("", out("r11") _);
| ^^^^^^^^^^^^
error: invalid register `r15`: The stack pointer cannot be used as an operand for inline asm
--> $DIR/bad-reg.rs:33:18
|
LL | asm!("", out("r15") _);
| ^^^^^^^^^^^^
error: invalid register `c0`: control registers are reserved by the kernel and cannot be used as operands for inline asm
--> $DIR/bad-reg.rs:35:18
|
LL | asm!("", out("c0") _);
| ^^^^^^^^^^^
error: invalid register `c1`: control registers are reserved by the kernel and cannot be used as operands for inline asm
--> $DIR/bad-reg.rs:37:18
|
LL | asm!("", out("c1") _);
| ^^^^^^^^^^^
error: invalid register `c2`: control registers are reserved by the kernel and cannot be used as operands for inline asm
--> $DIR/bad-reg.rs:39:18
|
LL | asm!("", out("c2") _);
| ^^^^^^^^^^^
error: invalid register `c3`: control registers are reserved by the kernel and cannot be used as operands for inline asm
--> $DIR/bad-reg.rs:41:18
|
LL | asm!("", out("c3") _);
| ^^^^^^^^^^^
error: invalid register `c4`: control registers are reserved by the kernel and cannot be used as operands for inline asm
--> $DIR/bad-reg.rs:43:18
|
LL | asm!("", out("c4") _);
| ^^^^^^^^^^^
error: invalid register `c5`: control registers are reserved by the kernel and cannot be used as operands for inline asm
--> $DIR/bad-reg.rs:45:18
|
LL | asm!("", out("c5") _);
| ^^^^^^^^^^^
error: invalid register `c6`: control registers are reserved by the kernel and cannot be used as operands for inline asm
--> $DIR/bad-reg.rs:47:18
|
LL | asm!("", out("c6") _);
| ^^^^^^^^^^^
error: invalid register `c7`: control registers are reserved by the kernel and cannot be used as operands for inline asm
--> $DIR/bad-reg.rs:49:18
|
LL | asm!("", out("c7") _);
| ^^^^^^^^^^^
error: invalid register `c8`: control registers are reserved by the kernel and cannot be used as operands for inline asm
--> $DIR/bad-reg.rs:51:18
|
LL | asm!("", out("c8") _);
| ^^^^^^^^^^^
error: invalid register `c9`: control registers are reserved by the kernel and cannot be used as operands for inline asm
--> $DIR/bad-reg.rs:53:18
|
LL | asm!("", out("c9") _);
| ^^^^^^^^^^^
error: invalid register `c10`: control registers are reserved by the kernel and cannot be used as operands for inline asm
--> $DIR/bad-reg.rs:55:18
|
LL | asm!("", out("c10") _);
| ^^^^^^^^^^^^
error: invalid register `c11`: control registers are reserved by the kernel and cannot be used as operands for inline asm
--> $DIR/bad-reg.rs:57:18
|
LL | asm!("", out("c11") _);
| ^^^^^^^^^^^^
error: invalid register `c12`: control registers are reserved by the kernel and cannot be used as operands for inline asm
--> $DIR/bad-reg.rs:59:18
|
LL | asm!("", out("c12") _);
| ^^^^^^^^^^^^
error: invalid register `c13`: control registers are reserved by the kernel and cannot be used as operands for inline asm
--> $DIR/bad-reg.rs:61:18
|
LL | asm!("", out("c13") _);
| ^^^^^^^^^^^^
error: invalid register `c14`: control registers are reserved by the kernel and cannot be used as operands for inline asm
--> $DIR/bad-reg.rs:63:18
|
LL | asm!("", out("c14") _);
| ^^^^^^^^^^^^
error: invalid register `c15`: control registers are reserved by the kernel and cannot be used as operands for inline asm
--> $DIR/bad-reg.rs:65:18
|
LL | asm!("", out("c15") _);
| ^^^^^^^^^^^^
error: invalid register `a0`: a0 and a1 are reserved for system use and cannot be used as operands for inline asm
--> $DIR/bad-reg.rs:67:18
|
LL | asm!("", out("a0") _);
| ^^^^^^^^^^^
error: invalid register `a1`: a0 and a1 are reserved for system use and cannot be used as operands for inline asm
--> $DIR/bad-reg.rs:69:18
|
LL | asm!("", out("a1") _);
| ^^^^^^^^^^^
error[E0658]: register class `vreg` can only be used as a clobber in stable
--> $DIR/bad-reg.rs:74:18
|
LL | asm!("", in("v0") v); // requires vector & asm_experimental_reg
| ^^^^^^^^^^
|
= note: see issue #133416 <https://github.com/rust-lang/rust/issues/133416> for more information
= help: add `#![feature(asm_experimental_reg)]` to the crate attributes to enable
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
error[E0658]: register class `vreg` can only be used as a clobber in stable
--> $DIR/bad-reg.rs:78:18
|
LL | asm!("", out("v0") v); // requires vector & asm_experimental_reg
| ^^^^^^^^^^^
|
= note: see issue #133416 <https://github.com/rust-lang/rust/issues/133416> for more information
= help: add `#![feature(asm_experimental_reg)]` to the crate attributes to enable
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
error[E0658]: register class `vreg` can only be used as a clobber in stable
--> $DIR/bad-reg.rs:82:18
|
LL | asm!("", in("v0") x); // requires vector & asm_experimental_reg
| ^^^^^^^^^^
|
= note: see issue #133416 <https://github.com/rust-lang/rust/issues/133416> for more information
= help: add `#![feature(asm_experimental_reg)]` to the crate attributes to enable
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
error[E0658]: register class `vreg` can only be used as a clobber in stable
--> $DIR/bad-reg.rs:86:18
|
LL | asm!("", out("v0") x); // requires vector & asm_experimental_reg
| ^^^^^^^^^^^
|
= note: see issue #133416 <https://github.com/rust-lang/rust/issues/133416> for more information
= help: add `#![feature(asm_experimental_reg)]` to the crate attributes to enable
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
error[E0658]: register class `vreg` can only be used as a clobber in stable
--> $DIR/bad-reg.rs:90:18
|
LL | asm!("", in("v0") b);
| ^^^^^^^^^^
|
= note: see issue #133416 <https://github.com/rust-lang/rust/issues/133416> for more information
= help: add `#![feature(asm_experimental_reg)]` to the crate attributes to enable
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
error[E0658]: register class `vreg` can only be used as a clobber in stable
--> $DIR/bad-reg.rs:95:18
|
LL | asm!("", out("v0") b);
| ^^^^^^^^^^^
|
= note: see issue #133416 <https://github.com/rust-lang/rust/issues/133416> for more information
= help: add `#![feature(asm_experimental_reg)]` to the crate attributes to enable
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
error[E0658]: register class `vreg` can only be used as a clobber in stable
--> $DIR/bad-reg.rs:100:26
|
LL | asm!("/* {} */", in(vreg) v); // requires vector & asm_experimental_reg
| ^^^^^^^^^^
|
= note: see issue #133416 <https://github.com/rust-lang/rust/issues/133416> for more information
= help: add `#![feature(asm_experimental_reg)]` to the crate attributes to enable
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
error[E0658]: register class `vreg` can only be used as a clobber in stable
--> $DIR/bad-reg.rs:104:26
|
LL | asm!("/* {} */", in(vreg) x); // requires vector & asm_experimental_reg
| ^^^^^^^^^^
|
= note: see issue #133416 <https://github.com/rust-lang/rust/issues/133416> for more information
= help: add `#![feature(asm_experimental_reg)]` to the crate attributes to enable
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
error[E0658]: register class `vreg` can only be used as a clobber in stable
--> $DIR/bad-reg.rs:108:26
|
LL | asm!("/* {} */", in(vreg) b);
| ^^^^^^^^^^
|
= note: see issue #133416 <https://github.com/rust-lang/rust/issues/133416> for more information
= help: add `#![feature(asm_experimental_reg)]` to the crate attributes to enable
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
error[E0658]: register class `vreg` can only be used as a clobber in stable
--> $DIR/bad-reg.rs:113:26
|
LL | asm!("/* {} */", out(vreg) _); // requires vector & asm_experimental_reg
| ^^^^^^^^^^^
|
= note: see issue #133416 <https://github.com/rust-lang/rust/issues/133416> for more information
= help: add `#![feature(asm_experimental_reg)]` to the crate attributes to enable
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
error: register class `areg` can only be used as a clobber, not as an input or output
--> $DIR/bad-reg.rs:120:18
|
LL | asm!("", in("a2") x);
| ^^^^^^^^^^
error: register class `areg` can only be used as a clobber, not as an input or output
--> $DIR/bad-reg.rs:123:18
|
LL | asm!("", out("a2") x);
| ^^^^^^^^^^^
error: register class `areg` can only be used as a clobber, not as an input or output
--> $DIR/bad-reg.rs:126:26
|
LL | asm!("/* {} */", in(areg) x);
| ^^^^^^^^^^
error: register class `areg` can only be used as a clobber, not as an input or output
--> $DIR/bad-reg.rs:129:26
|
LL | asm!("/* {} */", out(areg) _);
| ^^^^^^^^^^^
error: register `f0` conflicts with register `v0`
--> $DIR/bad-reg.rs:134:31
|
LL | asm!("", out("v0") _, out("f0") _);
| ----------- ^^^^^^^^^^^ register `f0`
| |
| register `v0`
error: register `f1` conflicts with register `v1`
--> $DIR/bad-reg.rs:136:31
|
LL | asm!("", out("v1") _, out("f1") _);
| ----------- ^^^^^^^^^^^ register `f1`
| |
| register `v1`
error: register `f2` conflicts with register `v2`
--> $DIR/bad-reg.rs:138:31
|
LL | asm!("", out("v2") _, out("f2") _);
| ----------- ^^^^^^^^^^^ register `f2`
| |
| register `v2`
error: register `f3` conflicts with register `v3`
--> $DIR/bad-reg.rs:140:31
|
LL | asm!("", out("v3") _, out("f3") _);
| ----------- ^^^^^^^^^^^ register `f3`
| |
| register `v3`
error: register `f4` conflicts with register `v4`
--> $DIR/bad-reg.rs:142:31
|
LL | asm!("", out("v4") _, out("f4") _);
| ----------- ^^^^^^^^^^^ register `f4`
| |
| register `v4`
error: register `f5` conflicts with register `v5`
--> $DIR/bad-reg.rs:144:31
|
LL | asm!("", out("v5") _, out("f5") _);
| ----------- ^^^^^^^^^^^ register `f5`
| |
| register `v5`
error: register `f6` conflicts with register `v6`
--> $DIR/bad-reg.rs:146:31
|
LL | asm!("", out("v6") _, out("f6") _);
| ----------- ^^^^^^^^^^^ register `f6`
| |
| register `v6`
error: register `f7` conflicts with register `v7`
--> $DIR/bad-reg.rs:148:31
|
LL | asm!("", out("v7") _, out("f7") _);
| ----------- ^^^^^^^^^^^ register `f7`
| |
| register `v7`
error: register `f8` conflicts with register `v8`
--> $DIR/bad-reg.rs:150:31
|
LL | asm!("", out("v8") _, out("f8") _);
| ----------- ^^^^^^^^^^^ register `f8`
| |
| register `v8`
error: register `f9` conflicts with register `v9`
--> $DIR/bad-reg.rs:152:31
|
LL | asm!("", out("v9") _, out("f9") _);
| ----------- ^^^^^^^^^^^ register `f9`
| |
| register `v9`
error: register `f10` conflicts with register `v10`
--> $DIR/bad-reg.rs:154:32
|
LL | asm!("", out("v10") _, out("f10") _);
| ------------ ^^^^^^^^^^^^ register `f10`
| |
| register `v10`
error: register `f11` conflicts with register `v11`
--> $DIR/bad-reg.rs:156:32
|
LL | asm!("", out("v11") _, out("f11") _);
| ------------ ^^^^^^^^^^^^ register `f11`
| |
| register `v11`
error: register `f12` conflicts with register `v12`
--> $DIR/bad-reg.rs:158:32
|
LL | asm!("", out("v12") _, out("f12") _);
| ------------ ^^^^^^^^^^^^ register `f12`
| |
| register `v12`
error: register `f13` conflicts with register `v13`
--> $DIR/bad-reg.rs:160:32
|
LL | asm!("", out("v13") _, out("f13") _);
| ------------ ^^^^^^^^^^^^ register `f13`
| |
| register `v13`
error: register `f14` conflicts with register `v14`
--> $DIR/bad-reg.rs:162:32
|
LL | asm!("", out("v14") _, out("f14") _);
| ------------ ^^^^^^^^^^^^ register `f14`
| |
| register `v14`
error: register `f15` conflicts with register `v15`
--> $DIR/bad-reg.rs:164:32
|
LL | asm!("", out("v15") _, out("f15") _);
| ------------ ^^^^^^^^^^^^ register `f15`
| |
| register `v15`
error: invalid register `f16`: unknown register
--> $DIR/bad-reg.rs:167:32
|
LL | asm!("", out("v16") _, out("f16") _);
| ^^^^^^^^^^^^
error[E0658]: type `i64x2` cannot be used with this register class in stable
--> $DIR/bad-reg.rs:74:27
|
LL | asm!("", in("v0") v); // requires vector & asm_experimental_reg
| ^
|
= note: see issue #133416 <https://github.com/rust-lang/rust/issues/133416> for more information
= help: add `#![feature(asm_experimental_reg)]` to the crate attributes to enable
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
error[E0658]: type `i64x2` cannot be used with this register class in stable
--> $DIR/bad-reg.rs:78:28
|
LL | asm!("", out("v0") v); // requires vector & asm_experimental_reg
| ^
|
= note: see issue #133416 <https://github.com/rust-lang/rust/issues/133416> for more information
= help: add `#![feature(asm_experimental_reg)]` to the crate attributes to enable
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
error[E0658]: type `i32` cannot be used with this register class in stable
--> $DIR/bad-reg.rs:82:27
|
LL | asm!("", in("v0") x); // requires vector & asm_experimental_reg
| ^
|
= note: see issue #133416 <https://github.com/rust-lang/rust/issues/133416> for more information
= help: add `#![feature(asm_experimental_reg)]` to the crate attributes to enable
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
error[E0658]: type `i32` cannot be used with this register class in stable
--> $DIR/bad-reg.rs:86:28
|
LL | asm!("", out("v0") x); // requires vector & asm_experimental_reg
| ^
|
= note: see issue #133416 <https://github.com/rust-lang/rust/issues/133416> for more information
= help: add `#![feature(asm_experimental_reg)]` to the crate attributes to enable
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
error: type `u8` cannot be used with this register class
--> $DIR/bad-reg.rs:90:27
|
LL | asm!("", in("v0") b);
| ^
|
= note: register class `vreg` supports these types:
error: type `u8` cannot be used with this register class
--> $DIR/bad-reg.rs:95:28
|
LL | asm!("", out("v0") b);
| ^
|
= note: register class `vreg` supports these types:
error[E0658]: type `i64x2` cannot be used with this register class in stable
--> $DIR/bad-reg.rs:100:35
|
LL | asm!("/* {} */", in(vreg) v); // requires vector & asm_experimental_reg
| ^
|
= note: see issue #133416 <https://github.com/rust-lang/rust/issues/133416> for more information
= help: add `#![feature(asm_experimental_reg)]` to the crate attributes to enable
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
error[E0658]: type `i32` cannot be used with this register class in stable
--> $DIR/bad-reg.rs:104:35
|
LL | asm!("/* {} */", in(vreg) x); // requires vector & asm_experimental_reg
| ^
|
= note: see issue #133416 <https://github.com/rust-lang/rust/issues/133416> for more information
= help: add `#![feature(asm_experimental_reg)]` to the crate attributes to enable
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
error: type `u8` cannot be used with this register class
--> $DIR/bad-reg.rs:108:35
|
LL | asm!("/* {} */", in(vreg) b);
| ^
|
= note: register class `vreg` supports these types:
error: type `i32` cannot be used with this register class
--> $DIR/bad-reg.rs:120:27
|
LL | asm!("", in("a2") x);
| ^
|
= note: register class `areg` supports these types:
error: type `i32` cannot be used with this register class
--> $DIR/bad-reg.rs:123:28
|
LL | asm!("", out("a2") x);
| ^
|
= note: register class `areg` supports these types:
error: type `i32` cannot be used with this register class
--> $DIR/bad-reg.rs:126:35
|
LL | asm!("/* {} */", in(areg) x);
| ^
|
= note: register class `areg` supports these types:
error: aborting due to 63 previous errors
For more information about this error, try `rustc --explain E0658`.

View File

@ -0,0 +1,23 @@
//@ needs-asm-support
//@ compile-flags: --target s390x-unknown-linux-gnu
//@ needs-llvm-components: systemz
#![feature(no_core, lang_items, rustc_attrs)]
#![crate_type = "rlib"]
#![no_core]
#[rustc_builtin_macro]
macro_rules! asm {
() => {};
}
#[lang = "sized"]
trait Sized {}
#[lang = "copy"]
trait Copy {}
unsafe fn main() {
asm!("", in("v0") 0);
//~^ ERROR register class `vreg` can only be used as a clobber in stable
//~| ERROR type `i32` cannot be used with this register class
}

View File

@ -0,0 +1,23 @@
error[E0658]: register class `vreg` can only be used as a clobber in stable
--> $DIR/feature-gate-asm_experimental_reg.rs:20:14
|
LL | asm!("", in("v0") 0);
| ^^^^^^^^^^
|
= note: see issue #133416 <https://github.com/rust-lang/rust/issues/133416> for more information
= help: add `#![feature(asm_experimental_reg)]` to the crate attributes to enable
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
error[E0658]: type `i32` cannot be used with this register class in stable
--> $DIR/feature-gate-asm_experimental_reg.rs:20:23
|
LL | asm!("", in("v0") 0);
| ^
|
= note: see issue #133416 <https://github.com/rust-lang/rust/issues/133416> for more information
= help: add `#![feature(asm_experimental_reg)]` to the crate attributes to enable
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
error: aborting due to 2 previous errors
For more information about this error, try `rustc --explain E0658`.