Skip to main content

rustc_target/asm/
sparc.rs

1use std::fmt;
2
3use rustc_data_structures::fx::FxIndexSet;
4use rustc_span::{Symbol, sym};
5
6use super::{InlineAsmArch, InlineAsmType, ModifierInfo};
7use crate::spec::{RelocModel, Target};
8
9#[allow(non_camel_case_types)]
pub enum SparcInlineAsmRegClass { reg, freg, dreg, qreg, yreg, }
#[automatically_derived]
#[allow(non_camel_case_types)]
impl ::core::marker::Copy for SparcInlineAsmRegClass { }
#[automatically_derived]
#[doc(hidden)]
#[allow(non_camel_case_types)]
unsafe impl ::core::clone::TrivialClone for SparcInlineAsmRegClass { }
#[automatically_derived]
#[allow(non_camel_case_types)]
impl ::core::clone::Clone for SparcInlineAsmRegClass {
    #[inline]
    fn clone(&self) -> SparcInlineAsmRegClass { *self }
}
const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for SparcInlineAsmRegClass {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        SparcInlineAsmRegClass::reg => { 0usize }
                        SparcInlineAsmRegClass::freg => { 1usize }
                        SparcInlineAsmRegClass::dreg => { 2usize }
                        SparcInlineAsmRegClass::qreg => { 3usize }
                        SparcInlineAsmRegClass::yreg => { 4usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
            }
        }
    };
const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for SparcInlineAsmRegClass {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { SparcInlineAsmRegClass::reg }
                    1usize => { SparcInlineAsmRegClass::freg }
                    2usize => { SparcInlineAsmRegClass::dreg }
                    3usize => { SparcInlineAsmRegClass::qreg }
                    4usize => { SparcInlineAsmRegClass::yreg }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `SparcInlineAsmRegClass`, expected 0..5, actual {0}",
                                n));
                    }
                }
            }
        }
    };
#[automatically_derived]
#[allow(non_camel_case_types)]
impl ::core::fmt::Debug for SparcInlineAsmRegClass {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                SparcInlineAsmRegClass::reg => "reg",
                SparcInlineAsmRegClass::freg => "freg",
                SparcInlineAsmRegClass::dreg => "dreg",
                SparcInlineAsmRegClass::qreg => "qreg",
                SparcInlineAsmRegClass::yreg => "yreg",
            })
    }
}
#[automatically_derived]
#[allow(non_camel_case_types)]
impl ::core::cmp::Eq for SparcInlineAsmRegClass {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {}
}
#[automatically_derived]
#[allow(non_camel_case_types)]
impl ::core::marker::StructuralPartialEq for SparcInlineAsmRegClass { }
#[automatically_derived]
#[allow(non_camel_case_types)]
impl ::core::cmp::PartialEq for SparcInlineAsmRegClass {
    #[inline]
    fn eq(&self, other: &SparcInlineAsmRegClass) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr
    }
}
#[automatically_derived]
#[allow(non_camel_case_types)]
impl ::core::cmp::PartialOrd for SparcInlineAsmRegClass {
    #[inline]
    fn partial_cmp(&self, other: &SparcInlineAsmRegClass)
        -> ::core::option::Option<::core::cmp::Ordering> {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        ::core::cmp::PartialOrd::partial_cmp(&__self_discr, &__arg1_discr)
    }
}
#[automatically_derived]
#[allow(non_camel_case_types)]
impl ::core::hash::Hash for SparcInlineAsmRegClass {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        ::core::hash::Hash::hash(&__self_discr, state)
    }
}
const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for
            SparcInlineAsmRegClass {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                ::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
                match *self {
                    SparcInlineAsmRegClass::reg => {}
                    SparcInlineAsmRegClass::freg => {}
                    SparcInlineAsmRegClass::dreg => {}
                    SparcInlineAsmRegClass::qreg => {}
                    SparcInlineAsmRegClass::yreg => {}
                }
            }
        }
    };
impl SparcInlineAsmRegClass {
    pub fn name(self) -> rustc_span::Symbol {
        match self {
            Self::reg => rustc_span::sym::reg,
            Self::freg => rustc_span::sym::freg,
            Self::dreg => rustc_span::sym::dreg,
            Self::qreg => rustc_span::sym::qreg,
            Self::yreg => rustc_span::sym::yreg,
        }
    }
    pub fn parse(name: rustc_span::Symbol)
        -> Result<Self, &'static [rustc_span::Symbol]> {
        match name {
            rustc_span::sym::reg => Ok(Self::reg),
            rustc_span::sym::freg => Ok(Self::freg),
            rustc_span::sym::dreg => Ok(Self::dreg),
            rustc_span::sym::qreg => Ok(Self::qreg),
            rustc_span::sym::yreg => Ok(Self::yreg),
            _ =>
                Err(&[rustc_span::sym::reg, rustc_span::sym::freg,
                                rustc_span::sym::dreg, rustc_span::sym::qreg,
                                rustc_span::sym::yreg]),
        }
    }
}
pub(super) fn regclass_map()
    ->
        rustc_data_structures::fx::FxHashMap<super::InlineAsmRegClass,
        rustc_data_structures::fx::FxIndexSet<super::InlineAsmReg>> {
    use rustc_data_structures::fx::FxHashMap;
    use rustc_data_structures::fx::FxIndexSet;
    use super::InlineAsmRegClass;
    let mut map = FxHashMap::default();
    map.insert(InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::reg),
        FxIndexSet::default());
    map.insert(InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::freg),
        FxIndexSet::default());
    map.insert(InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::dreg),
        FxIndexSet::default());
    map.insert(InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::qreg),
        FxIndexSet::default());
    map.insert(InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::yreg),
        FxIndexSet::default());
    map
}def_reg_class! {
10    Sparc SparcInlineAsmRegClass {
11        reg,
12        freg,
13        dreg,
14        qreg,
15        yreg,
16    }
17}
18
19impl SparcInlineAsmRegClass {
20    pub fn valid_modifiers(self, _arch: super::InlineAsmArch) -> &'static [char] {
21        &[]
22    }
23
24    pub fn suggest_class(self, _arch: InlineAsmArch, _ty: InlineAsmType) -> Option<Self> {
25        None
26    }
27
28    pub fn suggest_modifier(
29        self,
30        _arch: InlineAsmArch,
31        _ty: InlineAsmType,
32    ) -> Option<ModifierInfo> {
33        None
34    }
35
36    pub fn default_modifier(self, _arch: InlineAsmArch) -> Option<ModifierInfo> {
37        None
38    }
39
40    pub fn supported_types(
41        self,
42        arch: InlineAsmArch,
43    ) -> &'static [(InlineAsmType, Option<Symbol>)] {
44        match self {
45            Self::reg => {
46                if arch == InlineAsmArch::Sparc {
47                    {
    use super::InlineAsmType::*;
    &[(I8, None), (I16, None), (I32, None)]
}types! {
48                        _: I8, I16, I32;
49                        // FIXME: i64 is ok for g*/o* registers on SPARC-V8+ ("h" constraint in GCC),
50                        //        but not yet supported in LLVM.
51                        // v8plus: I64;
52                    }
53                } else {
54                    {
    use super::InlineAsmType::*;
    &[(I8, None), (I16, None), (I32, None), (I64, None)]
}types! { _: I8, I16, I32, I64; }
55                }
56            }
57            Self::freg => {
    use super::InlineAsmType::*;
    &[(F32, None)]
}types! { _: F32; },
58            Self::dreg => {
    use super::InlineAsmType::*;
    &[(F64, None)]
}types! { _: F64; },
59            Self::qreg => {
    use super::InlineAsmType::*;
    &[(F128, None)]
}types! { _: F128; },
60            Self::yreg => &[],
61        }
62    }
63}
64
65fn reserved_g5(
66    arch: InlineAsmArch,
67    _reloc_model: RelocModel,
68    _target_features: &FxIndexSet<Symbol>,
69    _target: &Target,
70    _is_clobber: bool,
71) -> Result<(), &'static str> {
72    if arch == InlineAsmArch::Sparc {
73        // FIXME: Section 2.1.5 "Function Registers with Unassigned Roles" of the V8+ Technical
74        // Specification says "%g5; no longer reserved for system software" [1], but LLVM always
75        // reserves it on SPARC32 [2].
76        // [1]: https://temlib.org/pub/SparcStation/Standards/V8plus.pdf
77        // [2]: https://github.com/llvm/llvm-project/blob/llvmorg-19.1.0/llvm/lib/Target/Sparc/SparcRegisterInfo.cpp#L64-L66
78        Err("g5 is reserved for system on SPARC32")
79    } else {
80        Ok(())
81    }
82}
83
84fn v9_only(
85    _arch: InlineAsmArch,
86    _reloc_model: RelocModel,
87    target_features: &FxIndexSet<Symbol>,
88    _target: &Target,
89    _is_clobber: bool,
90) -> Result<(), &'static str> {
91    // FIXME: This is the what GCC/LLVM currently use to limit access to upper-half registers, but
92    // it's unclear whether this is the correct behaviour. See the discussion around
93    // https://github.com/rust-lang/rust/pull/160949#discussion_r3806194355.
94    if !target_features.contains(&sym::v9) {
95        Err("floating point registers in the upper half can only be used on SPARCv9")
96    } else {
97        Ok(())
98    }
99}
100
101#[allow(unreachable_code)]
#[allow(non_camel_case_types)]
pub enum SparcInlineAsmReg {
    r2,
    r3,
    r4,
    r5,
    r8,
    r9,
    r10,
    r11,
    r12,
    r13,
    r15,
    r16,
    r17,
    r18,
    r19,
    r20,
    r21,
    r22,
    r23,
    r24,
    r25,
    r26,
    r27,
    r28,
    r29,
    f0,
    f1,
    f2,
    f3,
    f4,
    f5,
    f6,
    f7,
    f8,
    f9,
    f10,
    f11,
    f12,
    f13,
    f14,
    f15,
    f16,
    f17,
    f18,
    f19,
    f20,
    f21,
    f22,
    f23,
    f24,
    f25,
    f26,
    f27,
    f28,
    f29,
    f30,
    f31,
    d0,
    d2,
    d4,
    d6,
    d8,
    d10,
    d12,
    d14,
    d16,
    d18,
    d20,
    d22,
    d24,
    d26,
    d28,
    d30,
    d32,
    d34,
    d36,
    d38,
    d40,
    d42,
    d44,
    d46,
    d48,
    d50,
    d52,
    d54,
    d56,
    d58,
    d60,
    d62,
    q0,
    q4,
    q8,
    q12,
    q16,
    q20,
    q24,
    q28,
    q32,
    q36,
    q40,
    q44,
    q48,
    q52,
    q56,
    q60,
    y,
}
#[automatically_derived]
#[allow(unreachable_code)]
#[allow(non_camel_case_types)]
impl ::core::marker::Copy for SparcInlineAsmReg { }
#[automatically_derived]
#[doc(hidden)]
#[allow(unreachable_code)]
#[allow(non_camel_case_types)]
unsafe impl ::core::clone::TrivialClone for SparcInlineAsmReg { }
#[automatically_derived]
#[allow(unreachable_code)]
#[allow(non_camel_case_types)]
impl ::core::clone::Clone for SparcInlineAsmReg {
    #[inline]
    fn clone(&self) -> SparcInlineAsmReg { *self }
}
const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for SparcInlineAsmReg {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        SparcInlineAsmReg::r2 => { 0usize }
                        SparcInlineAsmReg::r3 => { 1usize }
                        SparcInlineAsmReg::r4 => { 2usize }
                        SparcInlineAsmReg::r5 => { 3usize }
                        SparcInlineAsmReg::r8 => { 4usize }
                        SparcInlineAsmReg::r9 => { 5usize }
                        SparcInlineAsmReg::r10 => { 6usize }
                        SparcInlineAsmReg::r11 => { 7usize }
                        SparcInlineAsmReg::r12 => { 8usize }
                        SparcInlineAsmReg::r13 => { 9usize }
                        SparcInlineAsmReg::r15 => { 10usize }
                        SparcInlineAsmReg::r16 => { 11usize }
                        SparcInlineAsmReg::r17 => { 12usize }
                        SparcInlineAsmReg::r18 => { 13usize }
                        SparcInlineAsmReg::r19 => { 14usize }
                        SparcInlineAsmReg::r20 => { 15usize }
                        SparcInlineAsmReg::r21 => { 16usize }
                        SparcInlineAsmReg::r22 => { 17usize }
                        SparcInlineAsmReg::r23 => { 18usize }
                        SparcInlineAsmReg::r24 => { 19usize }
                        SparcInlineAsmReg::r25 => { 20usize }
                        SparcInlineAsmReg::r26 => { 21usize }
                        SparcInlineAsmReg::r27 => { 22usize }
                        SparcInlineAsmReg::r28 => { 23usize }
                        SparcInlineAsmReg::r29 => { 24usize }
                        SparcInlineAsmReg::f0 => { 25usize }
                        SparcInlineAsmReg::f1 => { 26usize }
                        SparcInlineAsmReg::f2 => { 27usize }
                        SparcInlineAsmReg::f3 => { 28usize }
                        SparcInlineAsmReg::f4 => { 29usize }
                        SparcInlineAsmReg::f5 => { 30usize }
                        SparcInlineAsmReg::f6 => { 31usize }
                        SparcInlineAsmReg::f7 => { 32usize }
                        SparcInlineAsmReg::f8 => { 33usize }
                        SparcInlineAsmReg::f9 => { 34usize }
                        SparcInlineAsmReg::f10 => { 35usize }
                        SparcInlineAsmReg::f11 => { 36usize }
                        SparcInlineAsmReg::f12 => { 37usize }
                        SparcInlineAsmReg::f13 => { 38usize }
                        SparcInlineAsmReg::f14 => { 39usize }
                        SparcInlineAsmReg::f15 => { 40usize }
                        SparcInlineAsmReg::f16 => { 41usize }
                        SparcInlineAsmReg::f17 => { 42usize }
                        SparcInlineAsmReg::f18 => { 43usize }
                        SparcInlineAsmReg::f19 => { 44usize }
                        SparcInlineAsmReg::f20 => { 45usize }
                        SparcInlineAsmReg::f21 => { 46usize }
                        SparcInlineAsmReg::f22 => { 47usize }
                        SparcInlineAsmReg::f23 => { 48usize }
                        SparcInlineAsmReg::f24 => { 49usize }
                        SparcInlineAsmReg::f25 => { 50usize }
                        SparcInlineAsmReg::f26 => { 51usize }
                        SparcInlineAsmReg::f27 => { 52usize }
                        SparcInlineAsmReg::f28 => { 53usize }
                        SparcInlineAsmReg::f29 => { 54usize }
                        SparcInlineAsmReg::f30 => { 55usize }
                        SparcInlineAsmReg::f31 => { 56usize }
                        SparcInlineAsmReg::d0 => { 57usize }
                        SparcInlineAsmReg::d2 => { 58usize }
                        SparcInlineAsmReg::d4 => { 59usize }
                        SparcInlineAsmReg::d6 => { 60usize }
                        SparcInlineAsmReg::d8 => { 61usize }
                        SparcInlineAsmReg::d10 => { 62usize }
                        SparcInlineAsmReg::d12 => { 63usize }
                        SparcInlineAsmReg::d14 => { 64usize }
                        SparcInlineAsmReg::d16 => { 65usize }
                        SparcInlineAsmReg::d18 => { 66usize }
                        SparcInlineAsmReg::d20 => { 67usize }
                        SparcInlineAsmReg::d22 => { 68usize }
                        SparcInlineAsmReg::d24 => { 69usize }
                        SparcInlineAsmReg::d26 => { 70usize }
                        SparcInlineAsmReg::d28 => { 71usize }
                        SparcInlineAsmReg::d30 => { 72usize }
                        SparcInlineAsmReg::d32 => { 73usize }
                        SparcInlineAsmReg::d34 => { 74usize }
                        SparcInlineAsmReg::d36 => { 75usize }
                        SparcInlineAsmReg::d38 => { 76usize }
                        SparcInlineAsmReg::d40 => { 77usize }
                        SparcInlineAsmReg::d42 => { 78usize }
                        SparcInlineAsmReg::d44 => { 79usize }
                        SparcInlineAsmReg::d46 => { 80usize }
                        SparcInlineAsmReg::d48 => { 81usize }
                        SparcInlineAsmReg::d50 => { 82usize }
                        SparcInlineAsmReg::d52 => { 83usize }
                        SparcInlineAsmReg::d54 => { 84usize }
                        SparcInlineAsmReg::d56 => { 85usize }
                        SparcInlineAsmReg::d58 => { 86usize }
                        SparcInlineAsmReg::d60 => { 87usize }
                        SparcInlineAsmReg::d62 => { 88usize }
                        SparcInlineAsmReg::q0 => { 89usize }
                        SparcInlineAsmReg::q4 => { 90usize }
                        SparcInlineAsmReg::q8 => { 91usize }
                        SparcInlineAsmReg::q12 => { 92usize }
                        SparcInlineAsmReg::q16 => { 93usize }
                        SparcInlineAsmReg::q20 => { 94usize }
                        SparcInlineAsmReg::q24 => { 95usize }
                        SparcInlineAsmReg::q28 => { 96usize }
                        SparcInlineAsmReg::q32 => { 97usize }
                        SparcInlineAsmReg::q36 => { 98usize }
                        SparcInlineAsmReg::q40 => { 99usize }
                        SparcInlineAsmReg::q44 => { 100usize }
                        SparcInlineAsmReg::q48 => { 101usize }
                        SparcInlineAsmReg::q52 => { 102usize }
                        SparcInlineAsmReg::q56 => { 103usize }
                        SparcInlineAsmReg::q60 => { 104usize }
                        SparcInlineAsmReg::y => { 105usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
            }
        }
    };
const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for SparcInlineAsmReg {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { SparcInlineAsmReg::r2 }
                    1usize => { SparcInlineAsmReg::r3 }
                    2usize => { SparcInlineAsmReg::r4 }
                    3usize => { SparcInlineAsmReg::r5 }
                    4usize => { SparcInlineAsmReg::r8 }
                    5usize => { SparcInlineAsmReg::r9 }
                    6usize => { SparcInlineAsmReg::r10 }
                    7usize => { SparcInlineAsmReg::r11 }
                    8usize => { SparcInlineAsmReg::r12 }
                    9usize => { SparcInlineAsmReg::r13 }
                    10usize => { SparcInlineAsmReg::r15 }
                    11usize => { SparcInlineAsmReg::r16 }
                    12usize => { SparcInlineAsmReg::r17 }
                    13usize => { SparcInlineAsmReg::r18 }
                    14usize => { SparcInlineAsmReg::r19 }
                    15usize => { SparcInlineAsmReg::r20 }
                    16usize => { SparcInlineAsmReg::r21 }
                    17usize => { SparcInlineAsmReg::r22 }
                    18usize => { SparcInlineAsmReg::r23 }
                    19usize => { SparcInlineAsmReg::r24 }
                    20usize => { SparcInlineAsmReg::r25 }
                    21usize => { SparcInlineAsmReg::r26 }
                    22usize => { SparcInlineAsmReg::r27 }
                    23usize => { SparcInlineAsmReg::r28 }
                    24usize => { SparcInlineAsmReg::r29 }
                    25usize => { SparcInlineAsmReg::f0 }
                    26usize => { SparcInlineAsmReg::f1 }
                    27usize => { SparcInlineAsmReg::f2 }
                    28usize => { SparcInlineAsmReg::f3 }
                    29usize => { SparcInlineAsmReg::f4 }
                    30usize => { SparcInlineAsmReg::f5 }
                    31usize => { SparcInlineAsmReg::f6 }
                    32usize => { SparcInlineAsmReg::f7 }
                    33usize => { SparcInlineAsmReg::f8 }
                    34usize => { SparcInlineAsmReg::f9 }
                    35usize => { SparcInlineAsmReg::f10 }
                    36usize => { SparcInlineAsmReg::f11 }
                    37usize => { SparcInlineAsmReg::f12 }
                    38usize => { SparcInlineAsmReg::f13 }
                    39usize => { SparcInlineAsmReg::f14 }
                    40usize => { SparcInlineAsmReg::f15 }
                    41usize => { SparcInlineAsmReg::f16 }
                    42usize => { SparcInlineAsmReg::f17 }
                    43usize => { SparcInlineAsmReg::f18 }
                    44usize => { SparcInlineAsmReg::f19 }
                    45usize => { SparcInlineAsmReg::f20 }
                    46usize => { SparcInlineAsmReg::f21 }
                    47usize => { SparcInlineAsmReg::f22 }
                    48usize => { SparcInlineAsmReg::f23 }
                    49usize => { SparcInlineAsmReg::f24 }
                    50usize => { SparcInlineAsmReg::f25 }
                    51usize => { SparcInlineAsmReg::f26 }
                    52usize => { SparcInlineAsmReg::f27 }
                    53usize => { SparcInlineAsmReg::f28 }
                    54usize => { SparcInlineAsmReg::f29 }
                    55usize => { SparcInlineAsmReg::f30 }
                    56usize => { SparcInlineAsmReg::f31 }
                    57usize => { SparcInlineAsmReg::d0 }
                    58usize => { SparcInlineAsmReg::d2 }
                    59usize => { SparcInlineAsmReg::d4 }
                    60usize => { SparcInlineAsmReg::d6 }
                    61usize => { SparcInlineAsmReg::d8 }
                    62usize => { SparcInlineAsmReg::d10 }
                    63usize => { SparcInlineAsmReg::d12 }
                    64usize => { SparcInlineAsmReg::d14 }
                    65usize => { SparcInlineAsmReg::d16 }
                    66usize => { SparcInlineAsmReg::d18 }
                    67usize => { SparcInlineAsmReg::d20 }
                    68usize => { SparcInlineAsmReg::d22 }
                    69usize => { SparcInlineAsmReg::d24 }
                    70usize => { SparcInlineAsmReg::d26 }
                    71usize => { SparcInlineAsmReg::d28 }
                    72usize => { SparcInlineAsmReg::d30 }
                    73usize => { SparcInlineAsmReg::d32 }
                    74usize => { SparcInlineAsmReg::d34 }
                    75usize => { SparcInlineAsmReg::d36 }
                    76usize => { SparcInlineAsmReg::d38 }
                    77usize => { SparcInlineAsmReg::d40 }
                    78usize => { SparcInlineAsmReg::d42 }
                    79usize => { SparcInlineAsmReg::d44 }
                    80usize => { SparcInlineAsmReg::d46 }
                    81usize => { SparcInlineAsmReg::d48 }
                    82usize => { SparcInlineAsmReg::d50 }
                    83usize => { SparcInlineAsmReg::d52 }
                    84usize => { SparcInlineAsmReg::d54 }
                    85usize => { SparcInlineAsmReg::d56 }
                    86usize => { SparcInlineAsmReg::d58 }
                    87usize => { SparcInlineAsmReg::d60 }
                    88usize => { SparcInlineAsmReg::d62 }
                    89usize => { SparcInlineAsmReg::q0 }
                    90usize => { SparcInlineAsmReg::q4 }
                    91usize => { SparcInlineAsmReg::q8 }
                    92usize => { SparcInlineAsmReg::q12 }
                    93usize => { SparcInlineAsmReg::q16 }
                    94usize => { SparcInlineAsmReg::q20 }
                    95usize => { SparcInlineAsmReg::q24 }
                    96usize => { SparcInlineAsmReg::q28 }
                    97usize => { SparcInlineAsmReg::q32 }
                    98usize => { SparcInlineAsmReg::q36 }
                    99usize => { SparcInlineAsmReg::q40 }
                    100usize => { SparcInlineAsmReg::q44 }
                    101usize => { SparcInlineAsmReg::q48 }
                    102usize => { SparcInlineAsmReg::q52 }
                    103usize => { SparcInlineAsmReg::q56 }
                    104usize => { SparcInlineAsmReg::q60 }
                    105usize => { SparcInlineAsmReg::y }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `SparcInlineAsmReg`, expected 0..106, actual {0}",
                                n));
                    }
                }
            }
        }
    };
#[automatically_derived]
#[allow(unreachable_code)]
#[allow(non_camel_case_types)]
impl ::core::fmt::Debug for SparcInlineAsmReg {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                SparcInlineAsmReg::r2 => "r2",
                SparcInlineAsmReg::r3 => "r3",
                SparcInlineAsmReg::r4 => "r4",
                SparcInlineAsmReg::r5 => "r5",
                SparcInlineAsmReg::r8 => "r8",
                SparcInlineAsmReg::r9 => "r9",
                SparcInlineAsmReg::r10 => "r10",
                SparcInlineAsmReg::r11 => "r11",
                SparcInlineAsmReg::r12 => "r12",
                SparcInlineAsmReg::r13 => "r13",
                SparcInlineAsmReg::r15 => "r15",
                SparcInlineAsmReg::r16 => "r16",
                SparcInlineAsmReg::r17 => "r17",
                SparcInlineAsmReg::r18 => "r18",
                SparcInlineAsmReg::r19 => "r19",
                SparcInlineAsmReg::r20 => "r20",
                SparcInlineAsmReg::r21 => "r21",
                SparcInlineAsmReg::r22 => "r22",
                SparcInlineAsmReg::r23 => "r23",
                SparcInlineAsmReg::r24 => "r24",
                SparcInlineAsmReg::r25 => "r25",
                SparcInlineAsmReg::r26 => "r26",
                SparcInlineAsmReg::r27 => "r27",
                SparcInlineAsmReg::r28 => "r28",
                SparcInlineAsmReg::r29 => "r29",
                SparcInlineAsmReg::f0 => "f0",
                SparcInlineAsmReg::f1 => "f1",
                SparcInlineAsmReg::f2 => "f2",
                SparcInlineAsmReg::f3 => "f3",
                SparcInlineAsmReg::f4 => "f4",
                SparcInlineAsmReg::f5 => "f5",
                SparcInlineAsmReg::f6 => "f6",
                SparcInlineAsmReg::f7 => "f7",
                SparcInlineAsmReg::f8 => "f8",
                SparcInlineAsmReg::f9 => "f9",
                SparcInlineAsmReg::f10 => "f10",
                SparcInlineAsmReg::f11 => "f11",
                SparcInlineAsmReg::f12 => "f12",
                SparcInlineAsmReg::f13 => "f13",
                SparcInlineAsmReg::f14 => "f14",
                SparcInlineAsmReg::f15 => "f15",
                SparcInlineAsmReg::f16 => "f16",
                SparcInlineAsmReg::f17 => "f17",
                SparcInlineAsmReg::f18 => "f18",
                SparcInlineAsmReg::f19 => "f19",
                SparcInlineAsmReg::f20 => "f20",
                SparcInlineAsmReg::f21 => "f21",
                SparcInlineAsmReg::f22 => "f22",
                SparcInlineAsmReg::f23 => "f23",
                SparcInlineAsmReg::f24 => "f24",
                SparcInlineAsmReg::f25 => "f25",
                SparcInlineAsmReg::f26 => "f26",
                SparcInlineAsmReg::f27 => "f27",
                SparcInlineAsmReg::f28 => "f28",
                SparcInlineAsmReg::f29 => "f29",
                SparcInlineAsmReg::f30 => "f30",
                SparcInlineAsmReg::f31 => "f31",
                SparcInlineAsmReg::d0 => "d0",
                SparcInlineAsmReg::d2 => "d2",
                SparcInlineAsmReg::d4 => "d4",
                SparcInlineAsmReg::d6 => "d6",
                SparcInlineAsmReg::d8 => "d8",
                SparcInlineAsmReg::d10 => "d10",
                SparcInlineAsmReg::d12 => "d12",
                SparcInlineAsmReg::d14 => "d14",
                SparcInlineAsmReg::d16 => "d16",
                SparcInlineAsmReg::d18 => "d18",
                SparcInlineAsmReg::d20 => "d20",
                SparcInlineAsmReg::d22 => "d22",
                SparcInlineAsmReg::d24 => "d24",
                SparcInlineAsmReg::d26 => "d26",
                SparcInlineAsmReg::d28 => "d28",
                SparcInlineAsmReg::d30 => "d30",
                SparcInlineAsmReg::d32 => "d32",
                SparcInlineAsmReg::d34 => "d34",
                SparcInlineAsmReg::d36 => "d36",
                SparcInlineAsmReg::d38 => "d38",
                SparcInlineAsmReg::d40 => "d40",
                SparcInlineAsmReg::d42 => "d42",
                SparcInlineAsmReg::d44 => "d44",
                SparcInlineAsmReg::d46 => "d46",
                SparcInlineAsmReg::d48 => "d48",
                SparcInlineAsmReg::d50 => "d50",
                SparcInlineAsmReg::d52 => "d52",
                SparcInlineAsmReg::d54 => "d54",
                SparcInlineAsmReg::d56 => "d56",
                SparcInlineAsmReg::d58 => "d58",
                SparcInlineAsmReg::d60 => "d60",
                SparcInlineAsmReg::d62 => "d62",
                SparcInlineAsmReg::q0 => "q0",
                SparcInlineAsmReg::q4 => "q4",
                SparcInlineAsmReg::q8 => "q8",
                SparcInlineAsmReg::q12 => "q12",
                SparcInlineAsmReg::q16 => "q16",
                SparcInlineAsmReg::q20 => "q20",
                SparcInlineAsmReg::q24 => "q24",
                SparcInlineAsmReg::q28 => "q28",
                SparcInlineAsmReg::q32 => "q32",
                SparcInlineAsmReg::q36 => "q36",
                SparcInlineAsmReg::q40 => "q40",
                SparcInlineAsmReg::q44 => "q44",
                SparcInlineAsmReg::q48 => "q48",
                SparcInlineAsmReg::q52 => "q52",
                SparcInlineAsmReg::q56 => "q56",
                SparcInlineAsmReg::q60 => "q60",
                SparcInlineAsmReg::y => "y",
            })
    }
}
#[automatically_derived]
#[allow(unreachable_code)]
#[allow(non_camel_case_types)]
impl ::core::cmp::Eq for SparcInlineAsmReg {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {}
}
#[automatically_derived]
#[allow(unreachable_code)]
#[allow(non_camel_case_types)]
impl ::core::marker::StructuralPartialEq for SparcInlineAsmReg { }
#[automatically_derived]
#[allow(unreachable_code)]
#[allow(non_camel_case_types)]
impl ::core::cmp::PartialEq for SparcInlineAsmReg {
    #[inline]
    fn eq(&self, other: &SparcInlineAsmReg) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr
    }
}
#[automatically_derived]
#[allow(unreachable_code)]
#[allow(non_camel_case_types)]
impl ::core::cmp::PartialOrd for SparcInlineAsmReg {
    #[inline]
    fn partial_cmp(&self, other: &SparcInlineAsmReg)
        -> ::core::option::Option<::core::cmp::Ordering> {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        ::core::cmp::PartialOrd::partial_cmp(&__self_discr, &__arg1_discr)
    }
}
#[automatically_derived]
#[allow(unreachable_code)]
#[allow(non_camel_case_types)]
impl ::core::hash::Hash for SparcInlineAsmReg {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        ::core::hash::Hash::hash(&__self_discr, state)
    }
}
const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for
            SparcInlineAsmReg {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                ::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
                match *self {
                    SparcInlineAsmReg::r2 => {}
                    SparcInlineAsmReg::r3 => {}
                    SparcInlineAsmReg::r4 => {}
                    SparcInlineAsmReg::r5 => {}
                    SparcInlineAsmReg::r8 => {}
                    SparcInlineAsmReg::r9 => {}
                    SparcInlineAsmReg::r10 => {}
                    SparcInlineAsmReg::r11 => {}
                    SparcInlineAsmReg::r12 => {}
                    SparcInlineAsmReg::r13 => {}
                    SparcInlineAsmReg::r15 => {}
                    SparcInlineAsmReg::r16 => {}
                    SparcInlineAsmReg::r17 => {}
                    SparcInlineAsmReg::r18 => {}
                    SparcInlineAsmReg::r19 => {}
                    SparcInlineAsmReg::r20 => {}
                    SparcInlineAsmReg::r21 => {}
                    SparcInlineAsmReg::r22 => {}
                    SparcInlineAsmReg::r23 => {}
                    SparcInlineAsmReg::r24 => {}
                    SparcInlineAsmReg::r25 => {}
                    SparcInlineAsmReg::r26 => {}
                    SparcInlineAsmReg::r27 => {}
                    SparcInlineAsmReg::r28 => {}
                    SparcInlineAsmReg::r29 => {}
                    SparcInlineAsmReg::f0 => {}
                    SparcInlineAsmReg::f1 => {}
                    SparcInlineAsmReg::f2 => {}
                    SparcInlineAsmReg::f3 => {}
                    SparcInlineAsmReg::f4 => {}
                    SparcInlineAsmReg::f5 => {}
                    SparcInlineAsmReg::f6 => {}
                    SparcInlineAsmReg::f7 => {}
                    SparcInlineAsmReg::f8 => {}
                    SparcInlineAsmReg::f9 => {}
                    SparcInlineAsmReg::f10 => {}
                    SparcInlineAsmReg::f11 => {}
                    SparcInlineAsmReg::f12 => {}
                    SparcInlineAsmReg::f13 => {}
                    SparcInlineAsmReg::f14 => {}
                    SparcInlineAsmReg::f15 => {}
                    SparcInlineAsmReg::f16 => {}
                    SparcInlineAsmReg::f17 => {}
                    SparcInlineAsmReg::f18 => {}
                    SparcInlineAsmReg::f19 => {}
                    SparcInlineAsmReg::f20 => {}
                    SparcInlineAsmReg::f21 => {}
                    SparcInlineAsmReg::f22 => {}
                    SparcInlineAsmReg::f23 => {}
                    SparcInlineAsmReg::f24 => {}
                    SparcInlineAsmReg::f25 => {}
                    SparcInlineAsmReg::f26 => {}
                    SparcInlineAsmReg::f27 => {}
                    SparcInlineAsmReg::f28 => {}
                    SparcInlineAsmReg::f29 => {}
                    SparcInlineAsmReg::f30 => {}
                    SparcInlineAsmReg::f31 => {}
                    SparcInlineAsmReg::d0 => {}
                    SparcInlineAsmReg::d2 => {}
                    SparcInlineAsmReg::d4 => {}
                    SparcInlineAsmReg::d6 => {}
                    SparcInlineAsmReg::d8 => {}
                    SparcInlineAsmReg::d10 => {}
                    SparcInlineAsmReg::d12 => {}
                    SparcInlineAsmReg::d14 => {}
                    SparcInlineAsmReg::d16 => {}
                    SparcInlineAsmReg::d18 => {}
                    SparcInlineAsmReg::d20 => {}
                    SparcInlineAsmReg::d22 => {}
                    SparcInlineAsmReg::d24 => {}
                    SparcInlineAsmReg::d26 => {}
                    SparcInlineAsmReg::d28 => {}
                    SparcInlineAsmReg::d30 => {}
                    SparcInlineAsmReg::d32 => {}
                    SparcInlineAsmReg::d34 => {}
                    SparcInlineAsmReg::d36 => {}
                    SparcInlineAsmReg::d38 => {}
                    SparcInlineAsmReg::d40 => {}
                    SparcInlineAsmReg::d42 => {}
                    SparcInlineAsmReg::d44 => {}
                    SparcInlineAsmReg::d46 => {}
                    SparcInlineAsmReg::d48 => {}
                    SparcInlineAsmReg::d50 => {}
                    SparcInlineAsmReg::d52 => {}
                    SparcInlineAsmReg::d54 => {}
                    SparcInlineAsmReg::d56 => {}
                    SparcInlineAsmReg::d58 => {}
                    SparcInlineAsmReg::d60 => {}
                    SparcInlineAsmReg::d62 => {}
                    SparcInlineAsmReg::q0 => {}
                    SparcInlineAsmReg::q4 => {}
                    SparcInlineAsmReg::q8 => {}
                    SparcInlineAsmReg::q12 => {}
                    SparcInlineAsmReg::q16 => {}
                    SparcInlineAsmReg::q20 => {}
                    SparcInlineAsmReg::q24 => {}
                    SparcInlineAsmReg::q28 => {}
                    SparcInlineAsmReg::q32 => {}
                    SparcInlineAsmReg::q36 => {}
                    SparcInlineAsmReg::q40 => {}
                    SparcInlineAsmReg::q44 => {}
                    SparcInlineAsmReg::q48 => {}
                    SparcInlineAsmReg::q52 => {}
                    SparcInlineAsmReg::q56 => {}
                    SparcInlineAsmReg::q60 => {}
                    SparcInlineAsmReg::y => {}
                }
            }
        }
    };
impl SparcInlineAsmReg {
    pub fn name(self) -> &'static str {
        match self {
            Self::r2 => "r2",
            Self::r3 => "r3",
            Self::r4 => "r4",
            Self::r5 => "r5",
            Self::r8 => "r8",
            Self::r9 => "r9",
            Self::r10 => "r10",
            Self::r11 => "r11",
            Self::r12 => "r12",
            Self::r13 => "r13",
            Self::r15 => "r15",
            Self::r16 => "r16",
            Self::r17 => "r17",
            Self::r18 => "r18",
            Self::r19 => "r19",
            Self::r20 => "r20",
            Self::r21 => "r21",
            Self::r22 => "r22",
            Self::r23 => "r23",
            Self::r24 => "r24",
            Self::r25 => "r25",
            Self::r26 => "r26",
            Self::r27 => "r27",
            Self::r28 => "r28",
            Self::r29 => "r29",
            Self::f0 => "f0",
            Self::f1 => "f1",
            Self::f2 => "f2",
            Self::f3 => "f3",
            Self::f4 => "f4",
            Self::f5 => "f5",
            Self::f6 => "f6",
            Self::f7 => "f7",
            Self::f8 => "f8",
            Self::f9 => "f9",
            Self::f10 => "f10",
            Self::f11 => "f11",
            Self::f12 => "f12",
            Self::f13 => "f13",
            Self::f14 => "f14",
            Self::f15 => "f15",
            Self::f16 => "f16",
            Self::f17 => "f17",
            Self::f18 => "f18",
            Self::f19 => "f19",
            Self::f20 => "f20",
            Self::f21 => "f21",
            Self::f22 => "f22",
            Self::f23 => "f23",
            Self::f24 => "f24",
            Self::f25 => "f25",
            Self::f26 => "f26",
            Self::f27 => "f27",
            Self::f28 => "f28",
            Self::f29 => "f29",
            Self::f30 => "f30",
            Self::f31 => "f31",
            Self::d0 => "d0",
            Self::d2 => "d2",
            Self::d4 => "d4",
            Self::d6 => "d6",
            Self::d8 => "d8",
            Self::d10 => "d10",
            Self::d12 => "d12",
            Self::d14 => "d14",
            Self::d16 => "d16",
            Self::d18 => "d18",
            Self::d20 => "d20",
            Self::d22 => "d22",
            Self::d24 => "d24",
            Self::d26 => "d26",
            Self::d28 => "d28",
            Self::d30 => "d30",
            Self::d32 => "d32",
            Self::d34 => "d34",
            Self::d36 => "d36",
            Self::d38 => "d38",
            Self::d40 => "d40",
            Self::d42 => "d42",
            Self::d44 => "d44",
            Self::d46 => "d46",
            Self::d48 => "d48",
            Self::d50 => "d50",
            Self::d52 => "d52",
            Self::d54 => "d54",
            Self::d56 => "d56",
            Self::d58 => "d58",
            Self::d60 => "d60",
            Self::d62 => "d62",
            Self::q0 => "q0",
            Self::q4 => "q4",
            Self::q8 => "q8",
            Self::q12 => "q12",
            Self::q16 => "q16",
            Self::q20 => "q20",
            Self::q24 => "q24",
            Self::q28 => "q28",
            Self::q32 => "q32",
            Self::q36 => "q36",
            Self::q40 => "q40",
            Self::q44 => "q44",
            Self::q48 => "q48",
            Self::q52 => "q52",
            Self::q56 => "q56",
            Self::q60 => "q60",
            Self::y => "y",
        }
    }
    pub fn reg_class(self) -> SparcInlineAsmRegClass {
        match self {
            Self::r2 => SparcInlineAsmRegClass::reg,
            Self::r3 => SparcInlineAsmRegClass::reg,
            Self::r4 => SparcInlineAsmRegClass::reg,
            Self::r5 => SparcInlineAsmRegClass::reg,
            Self::r8 => SparcInlineAsmRegClass::reg,
            Self::r9 => SparcInlineAsmRegClass::reg,
            Self::r10 => SparcInlineAsmRegClass::reg,
            Self::r11 => SparcInlineAsmRegClass::reg,
            Self::r12 => SparcInlineAsmRegClass::reg,
            Self::r13 => SparcInlineAsmRegClass::reg,
            Self::r15 => SparcInlineAsmRegClass::reg,
            Self::r16 => SparcInlineAsmRegClass::reg,
            Self::r17 => SparcInlineAsmRegClass::reg,
            Self::r18 => SparcInlineAsmRegClass::reg,
            Self::r19 => SparcInlineAsmRegClass::reg,
            Self::r20 => SparcInlineAsmRegClass::reg,
            Self::r21 => SparcInlineAsmRegClass::reg,
            Self::r22 => SparcInlineAsmRegClass::reg,
            Self::r23 => SparcInlineAsmRegClass::reg,
            Self::r24 => SparcInlineAsmRegClass::reg,
            Self::r25 => SparcInlineAsmRegClass::reg,
            Self::r26 => SparcInlineAsmRegClass::reg,
            Self::r27 => SparcInlineAsmRegClass::reg,
            Self::r28 => SparcInlineAsmRegClass::reg,
            Self::r29 => SparcInlineAsmRegClass::reg,
            Self::f0 => SparcInlineAsmRegClass::freg,
            Self::f1 => SparcInlineAsmRegClass::freg,
            Self::f2 => SparcInlineAsmRegClass::freg,
            Self::f3 => SparcInlineAsmRegClass::freg,
            Self::f4 => SparcInlineAsmRegClass::freg,
            Self::f5 => SparcInlineAsmRegClass::freg,
            Self::f6 => SparcInlineAsmRegClass::freg,
            Self::f7 => SparcInlineAsmRegClass::freg,
            Self::f8 => SparcInlineAsmRegClass::freg,
            Self::f9 => SparcInlineAsmRegClass::freg,
            Self::f10 => SparcInlineAsmRegClass::freg,
            Self::f11 => SparcInlineAsmRegClass::freg,
            Self::f12 => SparcInlineAsmRegClass::freg,
            Self::f13 => SparcInlineAsmRegClass::freg,
            Self::f14 => SparcInlineAsmRegClass::freg,
            Self::f15 => SparcInlineAsmRegClass::freg,
            Self::f16 => SparcInlineAsmRegClass::freg,
            Self::f17 => SparcInlineAsmRegClass::freg,
            Self::f18 => SparcInlineAsmRegClass::freg,
            Self::f19 => SparcInlineAsmRegClass::freg,
            Self::f20 => SparcInlineAsmRegClass::freg,
            Self::f21 => SparcInlineAsmRegClass::freg,
            Self::f22 => SparcInlineAsmRegClass::freg,
            Self::f23 => SparcInlineAsmRegClass::freg,
            Self::f24 => SparcInlineAsmRegClass::freg,
            Self::f25 => SparcInlineAsmRegClass::freg,
            Self::f26 => SparcInlineAsmRegClass::freg,
            Self::f27 => SparcInlineAsmRegClass::freg,
            Self::f28 => SparcInlineAsmRegClass::freg,
            Self::f29 => SparcInlineAsmRegClass::freg,
            Self::f30 => SparcInlineAsmRegClass::freg,
            Self::f31 => SparcInlineAsmRegClass::freg,
            Self::d0 => SparcInlineAsmRegClass::dreg,
            Self::d2 => SparcInlineAsmRegClass::dreg,
            Self::d4 => SparcInlineAsmRegClass::dreg,
            Self::d6 => SparcInlineAsmRegClass::dreg,
            Self::d8 => SparcInlineAsmRegClass::dreg,
            Self::d10 => SparcInlineAsmRegClass::dreg,
            Self::d12 => SparcInlineAsmRegClass::dreg,
            Self::d14 => SparcInlineAsmRegClass::dreg,
            Self::d16 => SparcInlineAsmRegClass::dreg,
            Self::d18 => SparcInlineAsmRegClass::dreg,
            Self::d20 => SparcInlineAsmRegClass::dreg,
            Self::d22 => SparcInlineAsmRegClass::dreg,
            Self::d24 => SparcInlineAsmRegClass::dreg,
            Self::d26 => SparcInlineAsmRegClass::dreg,
            Self::d28 => SparcInlineAsmRegClass::dreg,
            Self::d30 => SparcInlineAsmRegClass::dreg,
            Self::d32 => SparcInlineAsmRegClass::dreg,
            Self::d34 => SparcInlineAsmRegClass::dreg,
            Self::d36 => SparcInlineAsmRegClass::dreg,
            Self::d38 => SparcInlineAsmRegClass::dreg,
            Self::d40 => SparcInlineAsmRegClass::dreg,
            Self::d42 => SparcInlineAsmRegClass::dreg,
            Self::d44 => SparcInlineAsmRegClass::dreg,
            Self::d46 => SparcInlineAsmRegClass::dreg,
            Self::d48 => SparcInlineAsmRegClass::dreg,
            Self::d50 => SparcInlineAsmRegClass::dreg,
            Self::d52 => SparcInlineAsmRegClass::dreg,
            Self::d54 => SparcInlineAsmRegClass::dreg,
            Self::d56 => SparcInlineAsmRegClass::dreg,
            Self::d58 => SparcInlineAsmRegClass::dreg,
            Self::d60 => SparcInlineAsmRegClass::dreg,
            Self::d62 => SparcInlineAsmRegClass::dreg,
            Self::q0 => SparcInlineAsmRegClass::qreg,
            Self::q4 => SparcInlineAsmRegClass::qreg,
            Self::q8 => SparcInlineAsmRegClass::qreg,
            Self::q12 => SparcInlineAsmRegClass::qreg,
            Self::q16 => SparcInlineAsmRegClass::qreg,
            Self::q20 => SparcInlineAsmRegClass::qreg,
            Self::q24 => SparcInlineAsmRegClass::qreg,
            Self::q28 => SparcInlineAsmRegClass::qreg,
            Self::q32 => SparcInlineAsmRegClass::qreg,
            Self::q36 => SparcInlineAsmRegClass::qreg,
            Self::q40 => SparcInlineAsmRegClass::qreg,
            Self::q44 => SparcInlineAsmRegClass::qreg,
            Self::q48 => SparcInlineAsmRegClass::qreg,
            Self::q52 => SparcInlineAsmRegClass::qreg,
            Self::q56 => SparcInlineAsmRegClass::qreg,
            Self::q60 => SparcInlineAsmRegClass::qreg,
            Self::y => SparcInlineAsmRegClass::yreg,
        }
    }
    pub fn parse(name: &str) -> Result<Self, &'static str> {
        match name {
            "g2" | "r2" => Ok(Self::r2),
            "g3" | "r3" => Ok(Self::r3),
            "g4" | "r4" => Ok(Self::r4),
            "g5" | "r5" => Ok(Self::r5),
            "o0" | "r8" => Ok(Self::r8),
            "o1" | "r9" => Ok(Self::r9),
            "o2" | "r10" => Ok(Self::r10),
            "o3" | "r11" => Ok(Self::r11),
            "o4" | "r12" => Ok(Self::r12),
            "o5" | "r13" => Ok(Self::r13),
            "o7" | "r15" => Ok(Self::r15),
            "l0" | "r16" => Ok(Self::r16),
            "l1" | "r17" => Ok(Self::r17),
            "l2" | "r18" => Ok(Self::r18),
            "l3" | "r19" => Ok(Self::r19),
            "l4" | "r20" => Ok(Self::r20),
            "l5" | "r21" => Ok(Self::r21),
            "l6" | "r22" => Ok(Self::r22),
            "l7" | "r23" => Ok(Self::r23),
            "i0" | "r24" => Ok(Self::r24),
            "i1" | "r25" => Ok(Self::r25),
            "i2" | "r26" => Ok(Self::r26),
            "i3" | "r27" => Ok(Self::r27),
            "i4" | "r28" => Ok(Self::r28),
            "i5" | "r29" => Ok(Self::r29),
            "f0" => Ok(Self::f0),
            "f1" => Ok(Self::f1),
            "f2" => Ok(Self::f2),
            "f3" => Ok(Self::f3),
            "f4" => Ok(Self::f4),
            "f5" => Ok(Self::f5),
            "f6" => Ok(Self::f6),
            "f7" => Ok(Self::f7),
            "f8" => Ok(Self::f8),
            "f9" => Ok(Self::f9),
            "f10" => Ok(Self::f10),
            "f11" => Ok(Self::f11),
            "f12" => Ok(Self::f12),
            "f13" => Ok(Self::f13),
            "f14" => Ok(Self::f14),
            "f15" => Ok(Self::f15),
            "f16" => Ok(Self::f16),
            "f17" => Ok(Self::f17),
            "f18" => Ok(Self::f18),
            "f19" => Ok(Self::f19),
            "f20" => Ok(Self::f20),
            "f21" => Ok(Self::f21),
            "f22" => Ok(Self::f22),
            "f23" => Ok(Self::f23),
            "f24" => Ok(Self::f24),
            "f25" => Ok(Self::f25),
            "f26" => Ok(Self::f26),
            "f27" => Ok(Self::f27),
            "f28" => Ok(Self::f28),
            "f29" => Ok(Self::f29),
            "f30" => Ok(Self::f30),
            "f31" => Ok(Self::f31),
            "d0" => Ok(Self::d0),
            "d2" => Ok(Self::d2),
            "d4" => Ok(Self::d4),
            "d6" => Ok(Self::d6),
            "d8" => Ok(Self::d8),
            "d10" => Ok(Self::d10),
            "d12" => Ok(Self::d12),
            "d14" => Ok(Self::d14),
            "d16" => Ok(Self::d16),
            "d18" => Ok(Self::d18),
            "d20" => Ok(Self::d20),
            "d22" => Ok(Self::d22),
            "d24" => Ok(Self::d24),
            "d26" => Ok(Self::d26),
            "d28" => Ok(Self::d28),
            "d30" => Ok(Self::d30),
            "d32" => Ok(Self::d32),
            "d34" => Ok(Self::d34),
            "d36" => Ok(Self::d36),
            "d38" => Ok(Self::d38),
            "d40" => Ok(Self::d40),
            "d42" => Ok(Self::d42),
            "d44" => Ok(Self::d44),
            "d46" => Ok(Self::d46),
            "d48" => Ok(Self::d48),
            "d50" => Ok(Self::d50),
            "d52" => Ok(Self::d52),
            "d54" => Ok(Self::d54),
            "d56" => Ok(Self::d56),
            "d58" => Ok(Self::d58),
            "d60" => Ok(Self::d60),
            "d62" => Ok(Self::d62),
            "q0" => Ok(Self::q0),
            "q4" => Ok(Self::q4),
            "q8" => Ok(Self::q8),
            "q12" => Ok(Self::q12),
            "q16" => Ok(Self::q16),
            "q20" => Ok(Self::q20),
            "q24" => Ok(Self::q24),
            "q28" => Ok(Self::q28),
            "q32" => Ok(Self::q32),
            "q36" => Ok(Self::q36),
            "q40" => Ok(Self::q40),
            "q44" => Ok(Self::q44),
            "q48" => Ok(Self::q48),
            "q52" => Ok(Self::q52),
            "q56" => Ok(Self::q56),
            "q60" => Ok(Self::q60),
            "y" => Ok(Self::y),
            "r0" | "g0" =>
                Err("g0 is always zero and cannot be used as an operand for inline asm"),
            "r1" | "g1" =>
                Err("reserved by LLVM and cannot be used as an operand for inline asm"),
            "r6" | "g6" | "r7" | "g7" =>
                Err("reserved for system and cannot be used as an operand for inline asm"),
            "sp" | "r14" | "o6" =>
                Err("the stack pointer cannot be used as an operand for inline asm"),
            "fp" | "r30" | "i6" =>
                Err("the frame pointer cannot be used as an operand for inline asm"),
            "r31" | "i7" =>
                Err("the return address register cannot be used as an operand for inline asm"),
            _ => Err("unknown register"),
        }
    }
    pub fn validate(self, _arch: super::InlineAsmArch,
        _reloc_model: crate::spec::RelocModel,
        _target_features: &rustc_data_structures::fx::FxIndexSet<Symbol>,
        _target: &crate::spec::Target, _is_clobber: bool)
        -> Result<(), &'static str> {
        match self {
            Self::r2 => { Ok(()) }
            Self::r3 => { Ok(()) }
            Self::r4 => { Ok(()) }
            Self::r5 => {
                reserved_g5(_arch, _reloc_model, _target_features, _target,
                        _is_clobber)?;
                Ok(())
            }
            Self::r8 => { Ok(()) }
            Self::r9 => { Ok(()) }
            Self::r10 => { Ok(()) }
            Self::r11 => { Ok(()) }
            Self::r12 => { Ok(()) }
            Self::r13 => { Ok(()) }
            Self::r15 => { Ok(()) }
            Self::r16 => { Ok(()) }
            Self::r17 => { Ok(()) }
            Self::r18 => { Ok(()) }
            Self::r19 => { Ok(()) }
            Self::r20 => { Ok(()) }
            Self::r21 => { Ok(()) }
            Self::r22 => { Ok(()) }
            Self::r23 => { Ok(()) }
            Self::r24 => { Ok(()) }
            Self::r25 => { Ok(()) }
            Self::r26 => { Ok(()) }
            Self::r27 => { Ok(()) }
            Self::r28 => { Ok(()) }
            Self::r29 => { Ok(()) }
            Self::f0 => { Ok(()) }
            Self::f1 => { Ok(()) }
            Self::f2 => { Ok(()) }
            Self::f3 => { Ok(()) }
            Self::f4 => { Ok(()) }
            Self::f5 => { Ok(()) }
            Self::f6 => { Ok(()) }
            Self::f7 => { Ok(()) }
            Self::f8 => { Ok(()) }
            Self::f9 => { Ok(()) }
            Self::f10 => { Ok(()) }
            Self::f11 => { Ok(()) }
            Self::f12 => { Ok(()) }
            Self::f13 => { Ok(()) }
            Self::f14 => { Ok(()) }
            Self::f15 => { Ok(()) }
            Self::f16 => { Ok(()) }
            Self::f17 => { Ok(()) }
            Self::f18 => { Ok(()) }
            Self::f19 => { Ok(()) }
            Self::f20 => { Ok(()) }
            Self::f21 => { Ok(()) }
            Self::f22 => { Ok(()) }
            Self::f23 => { Ok(()) }
            Self::f24 => { Ok(()) }
            Self::f25 => { Ok(()) }
            Self::f26 => { Ok(()) }
            Self::f27 => { Ok(()) }
            Self::f28 => { Ok(()) }
            Self::f29 => { Ok(()) }
            Self::f30 => { Ok(()) }
            Self::f31 => { Ok(()) }
            Self::d0 => { Ok(()) }
            Self::d2 => { Ok(()) }
            Self::d4 => { Ok(()) }
            Self::d6 => { Ok(()) }
            Self::d8 => { Ok(()) }
            Self::d10 => { Ok(()) }
            Self::d12 => { Ok(()) }
            Self::d14 => { Ok(()) }
            Self::d16 => { Ok(()) }
            Self::d18 => { Ok(()) }
            Self::d20 => { Ok(()) }
            Self::d22 => { Ok(()) }
            Self::d24 => { Ok(()) }
            Self::d26 => { Ok(()) }
            Self::d28 => { Ok(()) }
            Self::d30 => { Ok(()) }
            Self::d32 => {
                v9_only(_arch, _reloc_model, _target_features, _target,
                        _is_clobber)?;
                Ok(())
            }
            Self::d34 => {
                v9_only(_arch, _reloc_model, _target_features, _target,
                        _is_clobber)?;
                Ok(())
            }
            Self::d36 => {
                v9_only(_arch, _reloc_model, _target_features, _target,
                        _is_clobber)?;
                Ok(())
            }
            Self::d38 => {
                v9_only(_arch, _reloc_model, _target_features, _target,
                        _is_clobber)?;
                Ok(())
            }
            Self::d40 => {
                v9_only(_arch, _reloc_model, _target_features, _target,
                        _is_clobber)?;
                Ok(())
            }
            Self::d42 => {
                v9_only(_arch, _reloc_model, _target_features, _target,
                        _is_clobber)?;
                Ok(())
            }
            Self::d44 => {
                v9_only(_arch, _reloc_model, _target_features, _target,
                        _is_clobber)?;
                Ok(())
            }
            Self::d46 => {
                v9_only(_arch, _reloc_model, _target_features, _target,
                        _is_clobber)?;
                Ok(())
            }
            Self::d48 => {
                v9_only(_arch, _reloc_model, _target_features, _target,
                        _is_clobber)?;
                Ok(())
            }
            Self::d50 => {
                v9_only(_arch, _reloc_model, _target_features, _target,
                        _is_clobber)?;
                Ok(())
            }
            Self::d52 => {
                v9_only(_arch, _reloc_model, _target_features, _target,
                        _is_clobber)?;
                Ok(())
            }
            Self::d54 => {
                v9_only(_arch, _reloc_model, _target_features, _target,
                        _is_clobber)?;
                Ok(())
            }
            Self::d56 => {
                v9_only(_arch, _reloc_model, _target_features, _target,
                        _is_clobber)?;
                Ok(())
            }
            Self::d58 => {
                v9_only(_arch, _reloc_model, _target_features, _target,
                        _is_clobber)?;
                Ok(())
            }
            Self::d60 => {
                v9_only(_arch, _reloc_model, _target_features, _target,
                        _is_clobber)?;
                Ok(())
            }
            Self::d62 => {
                v9_only(_arch, _reloc_model, _target_features, _target,
                        _is_clobber)?;
                Ok(())
            }
            Self::q0 => { Ok(()) }
            Self::q4 => { Ok(()) }
            Self::q8 => { Ok(()) }
            Self::q12 => { Ok(()) }
            Self::q16 => { Ok(()) }
            Self::q20 => { Ok(()) }
            Self::q24 => { Ok(()) }
            Self::q28 => { Ok(()) }
            Self::q32 => {
                v9_only(_arch, _reloc_model, _target_features, _target,
                        _is_clobber)?;
                Ok(())
            }
            Self::q36 => {
                v9_only(_arch, _reloc_model, _target_features, _target,
                        _is_clobber)?;
                Ok(())
            }
            Self::q40 => {
                v9_only(_arch, _reloc_model, _target_features, _target,
                        _is_clobber)?;
                Ok(())
            }
            Self::q44 => {
                v9_only(_arch, _reloc_model, _target_features, _target,
                        _is_clobber)?;
                Ok(())
            }
            Self::q48 => {
                v9_only(_arch, _reloc_model, _target_features, _target,
                        _is_clobber)?;
                Ok(())
            }
            Self::q52 => {
                v9_only(_arch, _reloc_model, _target_features, _target,
                        _is_clobber)?;
                Ok(())
            }
            Self::q56 => {
                v9_only(_arch, _reloc_model, _target_features, _target,
                        _is_clobber)?;
                Ok(())
            }
            Self::q60 => {
                v9_only(_arch, _reloc_model, _target_features, _target,
                        _is_clobber)?;
                Ok(())
            }
            Self::y => { Ok(()) }
        }
    }
}
pub(super) fn fill_reg_map(_arch: super::InlineAsmArch,
    _reloc_model: crate::spec::RelocModel,
    _target_features: &rustc_data_structures::fx::FxIndexSet<Symbol>,
    _target: &crate::spec::Target,
    _map:
        &mut rustc_data_structures::fx::FxHashMap<super::InlineAsmRegClass,
        rustc_data_structures::fx::FxIndexSet<super::InlineAsmReg>>) {
    #[allow(unused_imports)]
    use super::{InlineAsmReg, InlineAsmRegClass};
    if true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::reg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::r2));
        }
    }
    if true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::reg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::r3));
        }
    }
    if true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::reg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::r4));
        }
    }
    if reserved_g5(_arch, _reloc_model, _target_features, _target,
                    false).is_ok() && true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::reg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::r5));
        }
    }
    if true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::reg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::r8));
        }
    }
    if true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::reg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::r9));
        }
    }
    if true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::reg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::r10));
        }
    }
    if true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::reg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::r11));
        }
    }
    if true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::reg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::r12));
        }
    }
    if true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::reg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::r13));
        }
    }
    if true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::reg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::r15));
        }
    }
    if true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::reg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::r16));
        }
    }
    if true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::reg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::r17));
        }
    }
    if true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::reg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::r18));
        }
    }
    if true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::reg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::r19));
        }
    }
    if true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::reg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::r20));
        }
    }
    if true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::reg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::r21));
        }
    }
    if true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::reg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::r22));
        }
    }
    if true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::reg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::r23));
        }
    }
    if true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::reg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::r24));
        }
    }
    if true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::reg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::r25));
        }
    }
    if true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::reg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::r26));
        }
    }
    if true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::reg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::r27));
        }
    }
    if true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::reg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::r28));
        }
    }
    if true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::reg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::r29));
        }
    }
    if true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::freg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::f0));
        }
    }
    if true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::freg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::f1));
        }
    }
    if true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::freg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::f2));
        }
    }
    if true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::freg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::f3));
        }
    }
    if true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::freg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::f4));
        }
    }
    if true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::freg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::f5));
        }
    }
    if true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::freg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::f6));
        }
    }
    if true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::freg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::f7));
        }
    }
    if true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::freg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::f8));
        }
    }
    if true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::freg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::f9));
        }
    }
    if true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::freg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::f10));
        }
    }
    if true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::freg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::f11));
        }
    }
    if true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::freg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::f12));
        }
    }
    if true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::freg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::f13));
        }
    }
    if true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::freg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::f14));
        }
    }
    if true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::freg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::f15));
        }
    }
    if true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::freg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::f16));
        }
    }
    if true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::freg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::f17));
        }
    }
    if true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::freg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::f18));
        }
    }
    if true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::freg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::f19));
        }
    }
    if true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::freg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::f20));
        }
    }
    if true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::freg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::f21));
        }
    }
    if true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::freg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::f22));
        }
    }
    if true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::freg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::f23));
        }
    }
    if true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::freg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::f24));
        }
    }
    if true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::freg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::f25));
        }
    }
    if true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::freg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::f26));
        }
    }
    if true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::freg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::f27));
        }
    }
    if true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::freg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::f28));
        }
    }
    if true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::freg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::f29));
        }
    }
    if true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::freg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::f30));
        }
    }
    if true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::freg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::f31));
        }
    }
    if true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::dreg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::d0));
        }
    }
    if true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::dreg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::d2));
        }
    }
    if true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::dreg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::d4));
        }
    }
    if true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::dreg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::d6));
        }
    }
    if true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::dreg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::d8));
        }
    }
    if true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::dreg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::d10));
        }
    }
    if true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::dreg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::d12));
        }
    }
    if true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::dreg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::d14));
        }
    }
    if true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::dreg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::d16));
        }
    }
    if true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::dreg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::d18));
        }
    }
    if true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::dreg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::d20));
        }
    }
    if true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::dreg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::d22));
        }
    }
    if true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::dreg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::d24));
        }
    }
    if true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::dreg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::d26));
        }
    }
    if true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::dreg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::d28));
        }
    }
    if true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::dreg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::d30));
        }
    }
    if v9_only(_arch, _reloc_model, _target_features, _target, false).is_ok()
            && true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::dreg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::d32));
        }
    }
    if v9_only(_arch, _reloc_model, _target_features, _target, false).is_ok()
            && true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::dreg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::d34));
        }
    }
    if v9_only(_arch, _reloc_model, _target_features, _target, false).is_ok()
            && true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::dreg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::d36));
        }
    }
    if v9_only(_arch, _reloc_model, _target_features, _target, false).is_ok()
            && true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::dreg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::d38));
        }
    }
    if v9_only(_arch, _reloc_model, _target_features, _target, false).is_ok()
            && true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::dreg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::d40));
        }
    }
    if v9_only(_arch, _reloc_model, _target_features, _target, false).is_ok()
            && true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::dreg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::d42));
        }
    }
    if v9_only(_arch, _reloc_model, _target_features, _target, false).is_ok()
            && true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::dreg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::d44));
        }
    }
    if v9_only(_arch, _reloc_model, _target_features, _target, false).is_ok()
            && true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::dreg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::d46));
        }
    }
    if v9_only(_arch, _reloc_model, _target_features, _target, false).is_ok()
            && true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::dreg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::d48));
        }
    }
    if v9_only(_arch, _reloc_model, _target_features, _target, false).is_ok()
            && true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::dreg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::d50));
        }
    }
    if v9_only(_arch, _reloc_model, _target_features, _target, false).is_ok()
            && true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::dreg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::d52));
        }
    }
    if v9_only(_arch, _reloc_model, _target_features, _target, false).is_ok()
            && true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::dreg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::d54));
        }
    }
    if v9_only(_arch, _reloc_model, _target_features, _target, false).is_ok()
            && true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::dreg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::d56));
        }
    }
    if v9_only(_arch, _reloc_model, _target_features, _target, false).is_ok()
            && true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::dreg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::d58));
        }
    }
    if v9_only(_arch, _reloc_model, _target_features, _target, false).is_ok()
            && true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::dreg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::d60));
        }
    }
    if v9_only(_arch, _reloc_model, _target_features, _target, false).is_ok()
            && true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::dreg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::d62));
        }
    }
    if true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::qreg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::q0));
        }
    }
    if true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::qreg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::q4));
        }
    }
    if true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::qreg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::q8));
        }
    }
    if true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::qreg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::q12));
        }
    }
    if true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::qreg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::q16));
        }
    }
    if true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::qreg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::q20));
        }
    }
    if true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::qreg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::q24));
        }
    }
    if true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::qreg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::q28));
        }
    }
    if v9_only(_arch, _reloc_model, _target_features, _target, false).is_ok()
            && true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::qreg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::q32));
        }
    }
    if v9_only(_arch, _reloc_model, _target_features, _target, false).is_ok()
            && true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::qreg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::q36));
        }
    }
    if v9_only(_arch, _reloc_model, _target_features, _target, false).is_ok()
            && true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::qreg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::q40));
        }
    }
    if v9_only(_arch, _reloc_model, _target_features, _target, false).is_ok()
            && true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::qreg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::q44));
        }
    }
    if v9_only(_arch, _reloc_model, _target_features, _target, false).is_ok()
            && true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::qreg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::q48));
        }
    }
    if v9_only(_arch, _reloc_model, _target_features, _target, false).is_ok()
            && true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::qreg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::q52));
        }
    }
    if v9_only(_arch, _reloc_model, _target_features, _target, false).is_ok()
            && true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::qreg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::q56));
        }
    }
    if v9_only(_arch, _reloc_model, _target_features, _target, false).is_ok()
            && true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::qreg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::q60));
        }
    }
    if true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Sparc(SparcInlineAsmRegClass::yreg))
            {
            set.insert(InlineAsmReg::Sparc(SparcInlineAsmReg::y));
        }
    }
}def_regs! {
102    Sparc SparcInlineAsmReg SparcInlineAsmRegClass {
103        // FIXME:
104        // - LLVM has reserve-{g,o,l,i}N feature to reserve each general-purpose registers.
105        // - g2-g4 are reserved for application (optional in both LLVM and GCC, and GCC has -mno-app-regs option to reserve them).
106        // There are currently no builtin targets that use them, but in the future they may need to
107        // be supported via options similar to AArch64's -Z fixed-x18.
108        r2: reg = ["r2", "g2"], // % reserved_g2
109        r3: reg = ["r3", "g3"], // % reserved_g3
110        r4: reg = ["r4", "g4"], // % reserved_g4
111        r5: reg = ["r5", "g5"] % reserved_g5,
112        r8: reg = ["r8", "o0"], // % reserved_o0
113        r9: reg = ["r9", "o1"], // % reserved_o1
114        r10: reg = ["r10", "o2"], // % reserved_o2
115        r11: reg = ["r11", "o3"], // % reserved_o3
116        r12: reg = ["r12", "o4"], // % reserved_o4
117        r13: reg = ["r13", "o5"], // % reserved_o5
118        r15: reg = ["r15", "o7"], // % reserved_o7
119        r16: reg = ["r16", "l0"], // % reserved_l0
120        r17: reg = ["r17", "l1"], // % reserved_l1
121        r18: reg = ["r18", "l2"], // % reserved_l2
122        r19: reg = ["r19", "l3"], // % reserved_l3
123        r20: reg = ["r20", "l4"], // % reserved_l4
124        r21: reg = ["r21", "l5"], // % reserved_l5
125        r22: reg = ["r22", "l6"], // % reserved_l6
126        r23: reg = ["r23", "l7"], // % reserved_l7
127        r24: reg = ["r24", "i0"], // % reserved_i0
128        r25: reg = ["r25", "i1"], // % reserved_i1
129        r26: reg = ["r26", "i2"], // % reserved_i2
130        r27: reg = ["r27", "i3"], // % reserved_i3
131        r28: reg = ["r28", "i4"], // % reserved_i4
132        r29: reg = ["r29", "i5"], // % reserved_i5
133        f0: freg = ["f0"],
134        f1: freg = ["f1"],
135        f2: freg = ["f2"],
136        f3: freg = ["f3"],
137        f4: freg = ["f4"],
138        f5: freg = ["f5"],
139        f6: freg = ["f6"],
140        f7: freg = ["f7"],
141        f8: freg = ["f8"],
142        f9: freg = ["f9"],
143        f10: freg = ["f10"],
144        f11: freg = ["f11"],
145        f12: freg = ["f12"],
146        f13: freg = ["f13"],
147        f14: freg = ["f14"],
148        f15: freg = ["f15"],
149        f16: freg = ["f16"],
150        f17: freg = ["f17"],
151        f18: freg = ["f18"],
152        f19: freg = ["f19"],
153        f20: freg = ["f20"],
154        f21: freg = ["f21"],
155        f22: freg = ["f22"],
156        f23: freg = ["f23"],
157        f24: freg = ["f24"],
158        f25: freg = ["f25"],
159        f26: freg = ["f26"],
160        f27: freg = ["f27"],
161        f28: freg = ["f28"],
162        f29: freg = ["f29"],
163        f30: freg = ["f30"],
164        f31: freg = ["f31"],
165        d0: dreg = ["d0"],
166        d2: dreg = ["d2"],
167        d4: dreg = ["d4"],
168        d6: dreg = ["d6"],
169        d8: dreg = ["d8"],
170        d10: dreg = ["d10"],
171        d12: dreg = ["d12"],
172        d14: dreg = ["d14"],
173        d16: dreg = ["d16"],
174        d18: dreg = ["d18"],
175        d20: dreg = ["d20"],
176        d22: dreg = ["d22"],
177        d24: dreg = ["d24"],
178        d26: dreg = ["d26"],
179        d28: dreg = ["d28"],
180        d30: dreg = ["d30"],
181        d32: dreg = ["d32"] % v9_only,
182        d34: dreg = ["d34"] % v9_only,
183        d36: dreg = ["d36"] % v9_only,
184        d38: dreg = ["d38"] % v9_only,
185        d40: dreg = ["d40"] % v9_only,
186        d42: dreg = ["d42"] % v9_only,
187        d44: dreg = ["d44"] % v9_only,
188        d46: dreg = ["d46"] % v9_only,
189        d48: dreg = ["d48"] % v9_only,
190        d50: dreg = ["d50"] % v9_only,
191        d52: dreg = ["d52"] % v9_only,
192        d54: dreg = ["d54"] % v9_only,
193        d56: dreg = ["d56"] % v9_only,
194        d58: dreg = ["d58"] % v9_only,
195        d60: dreg = ["d60"] % v9_only,
196        d62: dreg = ["d62"] % v9_only,
197        q0: qreg = ["q0"],
198        q4: qreg = ["q4"],
199        q8: qreg = ["q8"],
200        q12: qreg = ["q12"],
201        q16: qreg = ["q16"],
202        q20: qreg = ["q20"],
203        q24: qreg = ["q24"],
204        q28: qreg = ["q28"],
205        q32: qreg = ["q32"] % v9_only,
206        q36: qreg = ["q36"] % v9_only,
207        q40: qreg = ["q40"] % v9_only,
208        q44: qreg = ["q44"] % v9_only,
209        q48: qreg = ["q48"] % v9_only,
210        q52: qreg = ["q52"] % v9_only,
211        q56: qreg = ["q56"] % v9_only,
212        q60: qreg = ["q60"] % v9_only,
213        y: yreg = ["y"],
214        #error = ["r0", "g0"] =>
215            "g0 is always zero and cannot be used as an operand for inline asm",
216        // FIXME: %g1 is volatile in ABI, but used internally by LLVM.
217        // https://github.com/llvm/llvm-project/blob/llvmorg-19.1.0/llvm/lib/Target/Sparc/SparcRegisterInfo.cpp#L55-L56
218        // > FIXME: G1 reserved for now for large imm generation by frame code.
219        #error = ["r1", "g1"] =>
220            "reserved by LLVM and cannot be used as an operand for inline asm",
221        #error = ["r6", "g6", "r7", "g7"] =>
222            "reserved for system and cannot be used as an operand for inline asm",
223        #error = ["sp", "r14", "o6"] =>
224            "the stack pointer cannot be used as an operand for inline asm",
225        #error = ["fp", "r30", "i6"] =>
226            "the frame pointer cannot be used as an operand for inline asm",
227        #error = ["r31", "i7"] =>
228            "the return address register cannot be used as an operand for inline asm",
229    }
230}
231
232impl SparcInlineAsmReg {
233    pub fn emit(
234        self,
235        out: &mut dyn fmt::Write,
236        _arch: InlineAsmArch,
237        _modifier: Option<char>,
238    ) -> fmt::Result {
239        out.write_fmt(format_args!("%{0}", self.name()))write!(out, "%{}", self.name())
240    }
241
242    pub fn overlapping_regs(self, mut cb: impl FnMut(SparcInlineAsmReg)) {
243        cb(self);
244
245        macro_rules! reg_conflicts {
246            (
247                $(
248                    $q:ident : $d0:ident $d1:ident : $f0:ident $f1:ident $f2:ident $f3:ident
249                ),*;
250                $(
251                    $q_high:ident : $d0_high:ident $d1_high:ident
252                ),*;
253            ) => {
254                match self {
255                    $(
256                        Self::$q => {
257                            cb(Self::$d0);
258                            cb(Self::$d1);
259                            cb(Self::$f0);
260                            cb(Self::$f1);
261                            cb(Self::$f2);
262                            cb(Self::$f3);
263                        }
264                        Self::$d0 => {
265                            cb(Self::$q);
266                            cb(Self::$f0);
267                            cb(Self::$f1);
268                        }
269                        Self::$d1 => {
270                            cb(Self::$q);
271                            cb(Self::$f2);
272                            cb(Self::$f3);
273                        }
274                        Self::$f0 | Self::$f1 => {
275                            cb(Self::$q);
276                            cb(Self::$d0);
277                        }
278                        Self::$f2 | Self::$f3 => {
279                            cb(Self::$q);
280                            cb(Self::$d1);
281                        }
282                    )*
283                    $(
284                        Self::$q_high => {
285                            cb(Self::$d0_high);
286                            cb(Self::$d1_high);
287                        }
288                        Self::$d0_high | Self::$d1_high => {
289                            cb(Self::$q_high);
290                        }
291                    )*
292                    _ => {},
293                }
294            };
295        }
296
297        // SPARC's floating-point register file is interesting in that it can be
298        // viewed as 16 128-bit registers, 32 64-bit registers or 32 32-bit
299        // registers. Because these views overlap, the registers of different
300        // widths will conflict (e.g. d0 overlaps with f0 and f1, and q1
301        // overlaps with d2 and d3).
302        //
303        // See section 3.1.2 of The SPARC Architecture Manual: Version 9 for details.
304        match self {
    Self::q0 => {
        cb(Self::d0);
        cb(Self::d2);
        cb(Self::f0);
        cb(Self::f1);
        cb(Self::f2);
        cb(Self::f3);
    }
    Self::d0 => { cb(Self::q0); cb(Self::f0); cb(Self::f1); }
    Self::d2 => { cb(Self::q0); cb(Self::f2); cb(Self::f3); }
    Self::f0 | Self::f1 => { cb(Self::q0); cb(Self::d0); }
    Self::f2 | Self::f3 => { cb(Self::q0); cb(Self::d2); }
    Self::q4 => {
        cb(Self::d4);
        cb(Self::d6);
        cb(Self::f4);
        cb(Self::f5);
        cb(Self::f6);
        cb(Self::f7);
    }
    Self::d4 => { cb(Self::q4); cb(Self::f4); cb(Self::f5); }
    Self::d6 => { cb(Self::q4); cb(Self::f6); cb(Self::f7); }
    Self::f4 | Self::f5 => { cb(Self::q4); cb(Self::d4); }
    Self::f6 | Self::f7 => { cb(Self::q4); cb(Self::d6); }
    Self::q8 => {
        cb(Self::d8);
        cb(Self::d10);
        cb(Self::f8);
        cb(Self::f9);
        cb(Self::f10);
        cb(Self::f11);
    }
    Self::d8 => { cb(Self::q8); cb(Self::f8); cb(Self::f9); }
    Self::d10 => { cb(Self::q8); cb(Self::f10); cb(Self::f11); }
    Self::f8 | Self::f9 => { cb(Self::q8); cb(Self::d8); }
    Self::f10 | Self::f11 => { cb(Self::q8); cb(Self::d10); }
    Self::q12 => {
        cb(Self::d12);
        cb(Self::d14);
        cb(Self::f12);
        cb(Self::f13);
        cb(Self::f14);
        cb(Self::f15);
    }
    Self::d12 => { cb(Self::q12); cb(Self::f12); cb(Self::f13); }
    Self::d14 => { cb(Self::q12); cb(Self::f14); cb(Self::f15); }
    Self::f12 | Self::f13 => { cb(Self::q12); cb(Self::d12); }
    Self::f14 | Self::f15 => { cb(Self::q12); cb(Self::d14); }
    Self::q16 => {
        cb(Self::d16);
        cb(Self::d18);
        cb(Self::f16);
        cb(Self::f17);
        cb(Self::f18);
        cb(Self::f19);
    }
    Self::d16 => { cb(Self::q16); cb(Self::f16); cb(Self::f17); }
    Self::d18 => { cb(Self::q16); cb(Self::f18); cb(Self::f19); }
    Self::f16 | Self::f17 => { cb(Self::q16); cb(Self::d16); }
    Self::f18 | Self::f19 => { cb(Self::q16); cb(Self::d18); }
    Self::q20 => {
        cb(Self::d20);
        cb(Self::d22);
        cb(Self::f20);
        cb(Self::f21);
        cb(Self::f22);
        cb(Self::f23);
    }
    Self::d20 => { cb(Self::q20); cb(Self::f20); cb(Self::f21); }
    Self::d22 => { cb(Self::q20); cb(Self::f22); cb(Self::f23); }
    Self::f20 | Self::f21 => { cb(Self::q20); cb(Self::d20); }
    Self::f22 | Self::f23 => { cb(Self::q20); cb(Self::d22); }
    Self::q24 => {
        cb(Self::d24);
        cb(Self::d26);
        cb(Self::f24);
        cb(Self::f25);
        cb(Self::f26);
        cb(Self::f27);
    }
    Self::d24 => { cb(Self::q24); cb(Self::f24); cb(Self::f25); }
    Self::d26 => { cb(Self::q24); cb(Self::f26); cb(Self::f27); }
    Self::f24 | Self::f25 => { cb(Self::q24); cb(Self::d24); }
    Self::f26 | Self::f27 => { cb(Self::q24); cb(Self::d26); }
    Self::q28 => {
        cb(Self::d28);
        cb(Self::d30);
        cb(Self::f28);
        cb(Self::f29);
        cb(Self::f30);
        cb(Self::f31);
    }
    Self::d28 => { cb(Self::q28); cb(Self::f28); cb(Self::f29); }
    Self::d30 => { cb(Self::q28); cb(Self::f30); cb(Self::f31); }
    Self::f28 | Self::f29 => { cb(Self::q28); cb(Self::d28); }
    Self::f30 | Self::f31 => { cb(Self::q28); cb(Self::d30); }
    Self::q32 => { cb(Self::d32); cb(Self::d34); }
    Self::d32 | Self::d34 => { cb(Self::q32); }
    Self::q36 => { cb(Self::d36); cb(Self::d38); }
    Self::d36 | Self::d38 => { cb(Self::q36); }
    Self::q40 => { cb(Self::d40); cb(Self::d42); }
    Self::d40 | Self::d42 => { cb(Self::q40); }
    Self::q44 => { cb(Self::d44); cb(Self::d46); }
    Self::d44 | Self::d46 => { cb(Self::q44); }
    Self::q48 => { cb(Self::d48); cb(Self::d50); }
    Self::d48 | Self::d50 => { cb(Self::q48); }
    Self::q52 => { cb(Self::d52); cb(Self::d54); }
    Self::d52 | Self::d54 => { cb(Self::q52); }
    Self::q56 => { cb(Self::d56); cb(Self::d58); }
    Self::d56 | Self::d58 => { cb(Self::q56); }
    Self::q60 => { cb(Self::d60); cb(Self::d62); }
    Self::d60 | Self::d62 => { cb(Self::q60); }
    _ => {}
}reg_conflicts! {
305            q0 : d0 d2 : f0 f1 f2 f3,
306            q4 : d4 d6 : f4 f5 f6 f7,
307            q8 : d8 d10 : f8 f9 f10 f11,
308            q12 : d12 d14 : f12 f13 f14 f15,
309            q16 : d16 d18 : f16 f17 f18 f19,
310            q20 : d20 d22 : f20 f21 f22 f23,
311            q24 : d24 d26 : f24 f25 f26 f27,
312            q28 : d28 d30 : f28 f29 f30 f31;
313            q32 : d32 d34,
314            q36 : d36 d38,
315            q40 : d40 d42,
316            q44 : d44 d46,
317            q48 : d48 d50,
318            q52 : d52 d54,
319            q56 : d56 d58,
320            q60 : d60 d62;
321        }
322    }
323
324    pub fn dreg_number(self) -> Option<u32> {
325        if self >= Self::d0 && self <= Self::d62 {
326            Some((self as u32 - Self::d0 as u32) * 2)
327        } else {
328            None
329        }
330    }
331
332    pub fn qreg_number(self) -> Option<u32> {
333        if self >= Self::q0 && self <= Self::q60 {
334            Some((self as u32 - Self::q0 as u32) * 4)
335        } else {
336            None
337        }
338    }
339}