|
| 1 | +use super::{InlineAsmArch, InlineAsmType}; |
| 2 | +use rustc_macros::HashStable_Generic; |
| 3 | +use rustc_span::Symbol; |
| 4 | +use std::fmt; |
| 5 | + |
| 6 | +def_reg_class! { |
| 7 | + CSKY CSKYInlineAsmRegClass { |
| 8 | + reg, |
| 9 | + freg, |
| 10 | + } |
| 11 | +} |
| 12 | + |
| 13 | +impl CSKYInlineAsmRegClass { |
| 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<(char, &'static str)> { |
| 27 | + None |
| 28 | + } |
| 29 | + |
| 30 | + pub fn default_modifier(self, _arch: InlineAsmArch) -> Option<(char, &'static str)> { |
| 31 | + None |
| 32 | + } |
| 33 | + |
| 34 | + pub fn supported_types( |
| 35 | + self, |
| 36 | + _arch: InlineAsmArch, |
| 37 | + ) -> &'static [(InlineAsmType, Option<Symbol>)] { |
| 38 | + match self { |
| 39 | + Self::reg => types! { _: I8, I16, I32, I64, F32, F64; }, |
| 40 | + Self::freg => types! { _: F32, F64; }, |
| 41 | + } |
| 42 | + } |
| 43 | +} |
| 44 | + |
| 45 | +// The reserved registers are taken from <https://github.com/llvm/llvm-project/blob/main/llvm/lib/Target/CSKY/CSKYRegisterInfo.cpp#79> |
| 46 | +def_regs! { |
| 47 | + CSKY CSKYInlineAsmReg CSKYInlineAsmRegClass { |
| 48 | + r0: reg = ["r0","a0"], |
| 49 | + r1: reg = ["r1","a1"], |
| 50 | + r2: reg = ["r2","a2"], |
| 51 | + r3: reg = ["r3","a3"], |
| 52 | + r4: reg = ["r4","l0"], |
| 53 | + r5: reg = ["r5","l1"], |
| 54 | + r6: reg = ["r6","l2"], |
| 55 | + // r7: reg = ["r7","l3"], |
| 56 | + // r8: reg = ["r8","l4"], |
| 57 | + // r9: reg = ["r9","l5"], |
| 58 | + // r10: reg = ["r10","l6"], |
| 59 | + // r11: reg = ["r11","l7"], |
| 60 | + // r12: reg = ["r12","t0"], |
| 61 | + // r13: reg = ["r13","t1"], |
| 62 | + // r14: reg = ["r14","sp"], |
| 63 | + // r15: reg = ["r15","lr"], |
| 64 | + // r16: reg = ["r16","l8"], |
| 65 | + // r17: reg = ["r17","l9"], |
| 66 | + // r18: reg = ["r18","t2"], |
| 67 | + // r19: reg = ["r19","t3"], |
| 68 | + // r20: reg = ["r20","t4"], |
| 69 | + // r21: reg = ["r21","t5"], |
| 70 | + // r22: reg = ["r22","t6"], |
| 71 | + // r23: reg = ["r23","t7", "fp"], |
| 72 | + // r24: reg = ["r24","t8", "sop"], |
| 73 | + // r25: reg = ["r25","tp", "bsp"], |
| 74 | + // r26: reg = ["r26"], |
| 75 | + // r27: reg = ["r27"], |
| 76 | + // r28: reg = ["r28","gb", "rgb", "rdb"], |
| 77 | + // r29: reg = ["r29","tb", "rtb"], |
| 78 | + // r30: reg = ["r30","svbr"], |
| 79 | + // r31: reg = ["r31","tls"], |
| 80 | + f0: freg = ["fr0","vr0"], |
| 81 | + f1: freg = ["fr1","vr1"], |
| 82 | + f2: freg = ["fr2","vr2"], |
| 83 | + f3: freg = ["fr3","vr3"], |
| 84 | + f4: freg = ["fr4","vr4"], |
| 85 | + f5: freg = ["fr5","vr5"], |
| 86 | + f6: freg = ["fr6","vr6"], |
| 87 | + f7: freg = ["fr7","vr7"], |
| 88 | + f8: freg = ["fr8","vr8"], |
| 89 | + f9: freg = ["fr9","vr9"], |
| 90 | + f10: freg = ["fr10","vr10"], |
| 91 | + f11: freg = ["fr11","vr11"], |
| 92 | + f12: freg = ["fr12","vr12"], |
| 93 | + f13: freg = ["fr13","vr13"], |
| 94 | + f14: freg = ["fr14","vr14"], |
| 95 | + f15: freg = ["fr15","vr15"], |
| 96 | + f16: freg = ["fr16","vr16"], |
| 97 | + f17: freg = ["fr17","vr17"], |
| 98 | + f18: freg = ["fr18","vr18"], |
| 99 | + f19: freg = ["fr19","vr19"], |
| 100 | + f20: freg = ["fr20","vr20"], |
| 101 | + f21: freg = ["fr21","vr21"], |
| 102 | + f22: freg = ["fr22","vr22"], |
| 103 | + f23: freg = ["fr23","vr23"], |
| 104 | + f24: freg = ["fr24","vr24"], |
| 105 | + f25: freg = ["fr25","vr25"], |
| 106 | + f26: freg = ["fr26","vr26"], |
| 107 | + f27: freg = ["fr27","vr27"], |
| 108 | + f28: freg = ["fr28","vr28"], |
| 109 | + f29: freg = ["fr29","vr29"], |
| 110 | + f30: freg = ["fr30","vr30"], |
| 111 | + f31: freg = ["fr31","vr31"], |
| 112 | + #error = ["r7", "l3"] => |
| 113 | + "the base pointer cannot be used as an operand for inline asm", |
| 114 | + #error = ["r8","l4"] => |
| 115 | + "the frame pointer cannot be used as an operand for inline asm", |
| 116 | + #error = ["r14","sp"] => |
| 117 | + "the stack pointer cannot be used as an operand for inline asm", |
| 118 | + #error = ["r15","lr"] => |
| 119 | + "the link register cannot be used as an operand for inline asm", |
| 120 | + #error = ["r31","tls"] => |
| 121 | + "reserver for tls", |
| 122 | + #error = ["r28", "gb", "rgb", "rdb"] => |
| 123 | + "the global pointer cannot be used as an operand for inline asm", |
| 124 | + #error = ["r9","l5", "r10","l6", "r11","l7", "r12","t0", "r13","t1"] => |
| 125 | + "reserved (no E2)", |
| 126 | + #error = ["r16","l8", "r17","l9", "r18","t2", "r19","t3", "r20","t4", "r21","t5", "r22","t6", "r23","t7", "fp", "r24","t8", "sop", "r25","tp", "bsp"] => |
| 127 | + "reserved (no HighRegisters)", |
| 128 | + #error = ["r26","r27","r29","tb", "rtb", "r30","svbr"] => |
| 129 | + "reserved by the ABI", |
| 130 | + } |
| 131 | +} |
| 132 | + |
| 133 | +impl CSKYInlineAsmReg { |
| 134 | + pub fn emit( |
| 135 | + self, |
| 136 | + out: &mut dyn fmt::Write, |
| 137 | + _arch: InlineAsmArch, |
| 138 | + _modifier: Option<char>, |
| 139 | + ) -> fmt::Result { |
| 140 | + out.write_str(self.name()) |
| 141 | + } |
| 142 | +} |
0 commit comments