rustc_target/asm/
msp430.rs

1use std::fmt;
2
3use rustc_span::Symbol;
4
5use super::{InlineAsmArch, InlineAsmType, ModifierInfo};
6
7#[allow(non_camel_case_types)]
pub enum Msp430InlineAsmRegClass { reg, }
#[automatically_derived]
#[allow(non_camel_case_types)]
impl ::core::marker::Copy for Msp430InlineAsmRegClass { }
#[automatically_derived]
#[doc(hidden)]
#[allow(non_camel_case_types)]
unsafe impl ::core::clone::TrivialClone for Msp430InlineAsmRegClass { }
#[automatically_derived]
#[allow(non_camel_case_types)]
impl ::core::clone::Clone for Msp430InlineAsmRegClass {
    #[inline]
    fn clone(&self) -> Msp430InlineAsmRegClass { *self }
}
const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for Msp430InlineAsmRegClass {
            fn encode(&self, __encoder: &mut __E) {
                match *self { Msp430InlineAsmRegClass::reg => {} }
            }
        }
    };
const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for Msp430InlineAsmRegClass {
            fn decode(__decoder: &mut __D) -> Self {
                Msp430InlineAsmRegClass::reg
            }
        }
    };
#[automatically_derived]
#[allow(non_camel_case_types)]
impl ::core::fmt::Debug for Msp430InlineAsmRegClass {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f, "reg")
    }
}
#[automatically_derived]
#[allow(non_camel_case_types)]
impl ::core::cmp::Eq for Msp430InlineAsmRegClass {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_receiver_is_total_eq(&self) -> () {}
}
#[automatically_derived]
#[allow(non_camel_case_types)]
impl ::core::marker::StructuralPartialEq for Msp430InlineAsmRegClass { }
#[automatically_derived]
#[allow(non_camel_case_types)]
impl ::core::cmp::PartialEq for Msp430InlineAsmRegClass {
    #[inline]
    fn eq(&self, other: &Msp430InlineAsmRegClass) -> bool { true }
}
#[automatically_derived]
#[allow(non_camel_case_types)]
impl ::core::cmp::PartialOrd for Msp430InlineAsmRegClass {
    #[inline]
    fn partial_cmp(&self, other: &Msp430InlineAsmRegClass)
        -> ::core::option::Option<::core::cmp::Ordering> {
        ::core::option::Option::Some(::core::cmp::Ordering::Equal)
    }
}
#[automatically_derived]
#[allow(non_camel_case_types)]
impl ::core::hash::Hash for Msp430InlineAsmRegClass {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) -> () {}
}
const _: () =
    {
        impl<__CTX> ::rustc_data_structures::stable_hasher::HashStable<__CTX>
            for Msp430InlineAsmRegClass where __CTX: crate::HashStableContext
            {
            #[inline]
            fn hash_stable(&self, __hcx: &mut __CTX,
                __hasher:
                    &mut ::rustc_data_structures::stable_hasher::StableHasher) {
                ::std::mem::discriminant(self).hash_stable(__hcx, __hasher);
                match *self { Msp430InlineAsmRegClass::reg => {} }
            }
        }
    };
impl Msp430InlineAsmRegClass {
    pub fn name(self) -> rustc_span::Symbol {
        match self { Self::reg => rustc_span::sym::reg, }
    }
    pub fn parse(name: rustc_span::Symbol)
        -> Result<Self, &'static [rustc_span::Symbol]> {
        match name {
            rustc_span::sym::reg => Ok(Self::reg),
            _ => Err(&[rustc_span::sym::reg]),
        }
    }
}
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::Msp430(Msp430InlineAsmRegClass::reg),
        FxIndexSet::default());
    map
}def_reg_class! {
8    Msp430 Msp430InlineAsmRegClass {
9        reg,
10    }
11}
12
13impl Msp430InlineAsmRegClass {
14    pub fn valid_modifiers(self, _arch: super::InlineAsmArch) -> &'static [char] {
15        &[]
16    }
17
18    pub fn suggest_class(self, _arch: InlineAsmArch, _ty: InlineAsmType) -> Option<Self> {
19        None
20    }
21
22    pub fn suggest_modifier(
23        self,
24        _arch: InlineAsmArch,
25        _ty: InlineAsmType,
26    ) -> Option<ModifierInfo> {
27        None
28    }
29
30    pub fn default_modifier(self, _arch: InlineAsmArch) -> Option<ModifierInfo> {
31        None
32    }
33
34    pub fn supported_types(
35        self,
36        arch: InlineAsmArch,
37    ) -> &'static [(InlineAsmType, Option<Symbol>)] {
38        match (self, arch) {
39            (Self::reg, _) => {
    use super::InlineAsmType::*;
    &[(I8, None), (I16, None)]
}types! { _: I8, I16; },
40        }
41    }
42}
43
44// The reserved registers are taken from:
45// https://github.com/llvm/llvm-project/blob/36cb29cbbe1b22dcd298ad65e1fabe899b7d7249/llvm/lib/Target/MSP430/MSP430RegisterInfo.cpp#L73.
46#[allow(unreachable_code)]
#[allow(non_camel_case_types)]
pub enum Msp430InlineAsmReg {
    r5,
    r6,
    r7,
    r8,
    r9,
    r10,
    r11,
    r12,
    r13,
    r14,
    r15,
}
#[automatically_derived]
#[allow(unreachable_code)]
#[allow(non_camel_case_types)]
impl ::core::marker::Copy for Msp430InlineAsmReg { }
#[automatically_derived]
#[doc(hidden)]
#[allow(unreachable_code)]
#[allow(non_camel_case_types)]
unsafe impl ::core::clone::TrivialClone for Msp430InlineAsmReg { }
#[automatically_derived]
#[allow(unreachable_code)]
#[allow(non_camel_case_types)]
impl ::core::clone::Clone for Msp430InlineAsmReg {
    #[inline]
    fn clone(&self) -> Msp430InlineAsmReg { *self }
}
const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for Msp430InlineAsmReg {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        Msp430InlineAsmReg::r5 => { 0usize }
                        Msp430InlineAsmReg::r6 => { 1usize }
                        Msp430InlineAsmReg::r7 => { 2usize }
                        Msp430InlineAsmReg::r8 => { 3usize }
                        Msp430InlineAsmReg::r9 => { 4usize }
                        Msp430InlineAsmReg::r10 => { 5usize }
                        Msp430InlineAsmReg::r11 => { 6usize }
                        Msp430InlineAsmReg::r12 => { 7usize }
                        Msp430InlineAsmReg::r13 => { 8usize }
                        Msp430InlineAsmReg::r14 => { 9usize }
                        Msp430InlineAsmReg::r15 => { 10usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    Msp430InlineAsmReg::r5 => {}
                    Msp430InlineAsmReg::r6 => {}
                    Msp430InlineAsmReg::r7 => {}
                    Msp430InlineAsmReg::r8 => {}
                    Msp430InlineAsmReg::r9 => {}
                    Msp430InlineAsmReg::r10 => {}
                    Msp430InlineAsmReg::r11 => {}
                    Msp430InlineAsmReg::r12 => {}
                    Msp430InlineAsmReg::r13 => {}
                    Msp430InlineAsmReg::r14 => {}
                    Msp430InlineAsmReg::r15 => {}
                }
            }
        }
    };
const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for Msp430InlineAsmReg {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { Msp430InlineAsmReg::r5 }
                    1usize => { Msp430InlineAsmReg::r6 }
                    2usize => { Msp430InlineAsmReg::r7 }
                    3usize => { Msp430InlineAsmReg::r8 }
                    4usize => { Msp430InlineAsmReg::r9 }
                    5usize => { Msp430InlineAsmReg::r10 }
                    6usize => { Msp430InlineAsmReg::r11 }
                    7usize => { Msp430InlineAsmReg::r12 }
                    8usize => { Msp430InlineAsmReg::r13 }
                    9usize => { Msp430InlineAsmReg::r14 }
                    10usize => { Msp430InlineAsmReg::r15 }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `Msp430InlineAsmReg`, expected 0..11, actual {0}",
                                n));
                    }
                }
            }
        }
    };
#[automatically_derived]
#[allow(unreachable_code)]
#[allow(non_camel_case_types)]
impl ::core::fmt::Debug for Msp430InlineAsmReg {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                Msp430InlineAsmReg::r5 => "r5",
                Msp430InlineAsmReg::r6 => "r6",
                Msp430InlineAsmReg::r7 => "r7",
                Msp430InlineAsmReg::r8 => "r8",
                Msp430InlineAsmReg::r9 => "r9",
                Msp430InlineAsmReg::r10 => "r10",
                Msp430InlineAsmReg::r11 => "r11",
                Msp430InlineAsmReg::r12 => "r12",
                Msp430InlineAsmReg::r13 => "r13",
                Msp430InlineAsmReg::r14 => "r14",
                Msp430InlineAsmReg::r15 => "r15",
            })
    }
}
#[automatically_derived]
#[allow(unreachable_code)]
#[allow(non_camel_case_types)]
impl ::core::cmp::Eq for Msp430InlineAsmReg {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_receiver_is_total_eq(&self) -> () {}
}
#[automatically_derived]
#[allow(unreachable_code)]
#[allow(non_camel_case_types)]
impl ::core::marker::StructuralPartialEq for Msp430InlineAsmReg { }
#[automatically_derived]
#[allow(unreachable_code)]
#[allow(non_camel_case_types)]
impl ::core::cmp::PartialEq for Msp430InlineAsmReg {
    #[inline]
    fn eq(&self, other: &Msp430InlineAsmReg) -> 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 Msp430InlineAsmReg {
    #[inline]
    fn partial_cmp(&self, other: &Msp430InlineAsmReg)
        -> ::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 Msp430InlineAsmReg {
    #[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<__CTX> ::rustc_data_structures::stable_hasher::HashStable<__CTX>
            for Msp430InlineAsmReg where __CTX: crate::HashStableContext {
            #[inline]
            fn hash_stable(&self, __hcx: &mut __CTX,
                __hasher:
                    &mut ::rustc_data_structures::stable_hasher::StableHasher) {
                ::std::mem::discriminant(self).hash_stable(__hcx, __hasher);
                match *self {
                    Msp430InlineAsmReg::r5 => {}
                    Msp430InlineAsmReg::r6 => {}
                    Msp430InlineAsmReg::r7 => {}
                    Msp430InlineAsmReg::r8 => {}
                    Msp430InlineAsmReg::r9 => {}
                    Msp430InlineAsmReg::r10 => {}
                    Msp430InlineAsmReg::r11 => {}
                    Msp430InlineAsmReg::r12 => {}
                    Msp430InlineAsmReg::r13 => {}
                    Msp430InlineAsmReg::r14 => {}
                    Msp430InlineAsmReg::r15 => {}
                }
            }
        }
    };
impl Msp430InlineAsmReg {
    pub fn name(self) -> &'static str {
        match self {
            Self::r5 => "r5",
            Self::r6 => "r6",
            Self::r7 => "r7",
            Self::r8 => "r8",
            Self::r9 => "r9",
            Self::r10 => "r10",
            Self::r11 => "r11",
            Self::r12 => "r12",
            Self::r13 => "r13",
            Self::r14 => "r14",
            Self::r15 => "r15",
        }
    }
    pub fn reg_class(self) -> Msp430InlineAsmRegClass {
        match self {
            Self::r5 => Msp430InlineAsmRegClass::reg,
            Self::r6 => Msp430InlineAsmRegClass::reg,
            Self::r7 => Msp430InlineAsmRegClass::reg,
            Self::r8 => Msp430InlineAsmRegClass::reg,
            Self::r9 => Msp430InlineAsmRegClass::reg,
            Self::r10 => Msp430InlineAsmRegClass::reg,
            Self::r11 => Msp430InlineAsmRegClass::reg,
            Self::r12 => Msp430InlineAsmRegClass::reg,
            Self::r13 => Msp430InlineAsmRegClass::reg,
            Self::r14 => Msp430InlineAsmRegClass::reg,
            Self::r15 => Msp430InlineAsmRegClass::reg,
        }
    }
    pub fn parse(name: &str) -> Result<Self, &'static str> {
        match name {
            "r5" => Ok(Self::r5),
            "r6" => Ok(Self::r6),
            "r7" => Ok(Self::r7),
            "r8" => Ok(Self::r8),
            "r9" => Ok(Self::r9),
            "r10" => Ok(Self::r10),
            "r11" => Ok(Self::r11),
            "r12" => Ok(Self::r12),
            "r13" => Ok(Self::r13),
            "r14" => Ok(Self::r14),
            "r15" => Ok(Self::r15),
            "r0" | "pc" =>
                Err("the program counter cannot be used as an operand for inline asm"),
            "r1" | "sp" =>
                Err("the stack pointer cannot be used as an operand for inline asm"),
            "r2" | "sr" =>
                Err("the status register cannot be used as an operand for inline asm"),
            "r3" | "cg" =>
                Err("the constant generator cannot be used as an operand for inline asm"),
            "r4" | "fp" =>
                Err("the frame pointer 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::r5 => { Ok(()) }
            Self::r6 => { Ok(()) }
            Self::r7 => { Ok(()) }
            Self::r8 => { Ok(()) }
            Self::r9 => { Ok(()) }
            Self::r10 => { Ok(()) }
            Self::r11 => { Ok(()) }
            Self::r12 => { Ok(()) }
            Self::r13 => { Ok(()) }
            Self::r14 => { Ok(()) }
            Self::r15 => { 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::Msp430(Msp430InlineAsmRegClass::reg))
            {
            set.insert(InlineAsmReg::Msp430(Msp430InlineAsmReg::r5));
        }
    }
    if true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Msp430(Msp430InlineAsmRegClass::reg))
            {
            set.insert(InlineAsmReg::Msp430(Msp430InlineAsmReg::r6));
        }
    }
    if true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Msp430(Msp430InlineAsmRegClass::reg))
            {
            set.insert(InlineAsmReg::Msp430(Msp430InlineAsmReg::r7));
        }
    }
    if true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Msp430(Msp430InlineAsmRegClass::reg))
            {
            set.insert(InlineAsmReg::Msp430(Msp430InlineAsmReg::r8));
        }
    }
    if true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Msp430(Msp430InlineAsmRegClass::reg))
            {
            set.insert(InlineAsmReg::Msp430(Msp430InlineAsmReg::r9));
        }
    }
    if true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Msp430(Msp430InlineAsmRegClass::reg))
            {
            set.insert(InlineAsmReg::Msp430(Msp430InlineAsmReg::r10));
        }
    }
    if true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Msp430(Msp430InlineAsmRegClass::reg))
            {
            set.insert(InlineAsmReg::Msp430(Msp430InlineAsmReg::r11));
        }
    }
    if true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Msp430(Msp430InlineAsmRegClass::reg))
            {
            set.insert(InlineAsmReg::Msp430(Msp430InlineAsmReg::r12));
        }
    }
    if true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Msp430(Msp430InlineAsmRegClass::reg))
            {
            set.insert(InlineAsmReg::Msp430(Msp430InlineAsmReg::r13));
        }
    }
    if true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Msp430(Msp430InlineAsmRegClass::reg))
            {
            set.insert(InlineAsmReg::Msp430(Msp430InlineAsmReg::r14));
        }
    }
    if true {
        if let Some(set) =
                _map.get_mut(&InlineAsmRegClass::Msp430(Msp430InlineAsmRegClass::reg))
            {
            set.insert(InlineAsmReg::Msp430(Msp430InlineAsmReg::r15));
        }
    }
}def_regs! {
47    Msp430 Msp430InlineAsmReg Msp430InlineAsmRegClass {
48        r5: reg = ["r5"],
49        r6: reg = ["r6"],
50        r7: reg = ["r7"],
51        r8: reg = ["r8"],
52        r9: reg = ["r9"],
53        r10: reg = ["r10"],
54        r11: reg = ["r11"],
55        r12: reg = ["r12"],
56        r13: reg = ["r13"],
57        r14: reg = ["r14"],
58        r15: reg = ["r15"],
59
60        #error = ["r0", "pc"] =>
61            "the program counter cannot be used as an operand for inline asm",
62        #error = ["r1", "sp"] =>
63            "the stack pointer cannot be used as an operand for inline asm",
64        #error = ["r2", "sr"] =>
65            "the status register cannot be used as an operand for inline asm",
66        #error = ["r3", "cg"] =>
67            "the constant generator cannot be used as an operand for inline asm",
68        #error = ["r4", "fp"] =>
69            "the frame pointer cannot be used as an operand for inline asm",
70    }
71}
72
73impl Msp430InlineAsmReg {
74    pub fn emit(
75        self,
76        out: &mut dyn fmt::Write,
77        _arch: InlineAsmArch,
78        _modifier: Option<char>,
79    ) -> fmt::Result {
80        out.write_str(self.name())
81    }
82}