rustc_target/asm/
m68k.rs

1use std::fmt;
2
3use rustc_span::Symbol;
4
5use super::{InlineAsmArch, InlineAsmType, ModifierInfo};
6
7def_reg_class! {
8    M68k M68kInlineAsmRegClass {
9        reg,
10        reg_addr,
11        reg_data,
12    }
13}
14
15impl M68kInlineAsmRegClass {
16    pub fn valid_modifiers(self, _arch: super::InlineAsmArch) -> &'static [char] {
17        &[]
18    }
19
20    pub fn suggest_class(self, _arch: InlineAsmArch, _ty: InlineAsmType) -> Option<Self> {
21        None
22    }
23
24    pub fn suggest_modifier(
25        self,
26        _arch: InlineAsmArch,
27        _ty: InlineAsmType,
28    ) -> Option<ModifierInfo> {
29        None
30    }
31
32    pub fn default_modifier(self, _arch: InlineAsmArch) -> Option<ModifierInfo> {
33        None
34    }
35
36    pub fn supported_types(
37        self,
38        _arch: InlineAsmArch,
39    ) -> &'static [(InlineAsmType, Option<Symbol>)] {
40        match self {
41            Self::reg => types! { _: I16, I32; },
42            Self::reg_data => types! { _: I8, I16, I32; },
43            Self::reg_addr => types! { _: I16, I32; },
44        }
45    }
46}
47
48def_regs! {
49    M68k M68kInlineAsmReg M68kInlineAsmRegClass {
50        d0: reg, reg_data = ["d0"],
51        d1: reg, reg_data = ["d1"],
52        d2: reg, reg_data = ["d2"],
53        d3: reg, reg_data = ["d3"],
54        d4: reg, reg_data = ["d4"],
55        d5: reg, reg_data = ["d5"],
56        d6: reg, reg_data = ["d6"],
57        d7: reg, reg_data = ["d7"],
58        a0: reg, reg_addr = ["a0"],
59        a1: reg, reg_addr = ["a1"],
60        a2: reg, reg_addr = ["a2"],
61        a3: reg, reg_addr = ["a3"],
62        #error = ["a4"] =>
63            "a4 is used internally by LLVM and cannot be used as an operand for inline asm",
64        #error = ["a5", "bp"] =>
65            "a5 is used internally by LLVM and cannot be used as an operand for inline asm",
66        #error = ["a6", "fp"] =>
67            "a6 is used internally by LLVM and cannot be used as an operand for inline asm",
68        #error = ["a7", "sp", "usp", "ssp", "isp"] =>
69            "the stack pointer cannot be used as an operand for inline asm",
70    }
71}
72
73impl M68kInlineAsmReg {
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}