|
| 1 | +use super::{InlineAsmArch, InlineAsmType}; |
| 2 | +use rustc_macros::HashStable_Generic; |
| 3 | +use std::fmt; |
| 4 | + |
| 5 | +def_reg_class! { |
| 6 | + Mips MipsInlineAsmRegClass { |
| 7 | + reg, |
| 8 | + freg, |
| 9 | + } |
| 10 | +} |
| 11 | + |
| 12 | +impl MipsInlineAsmRegClass { |
| 13 | + pub fn valid_modifiers(self, _arch: super::InlineAsmArch) -> &'static [char] { |
| 14 | + &[] |
| 15 | + } |
| 16 | + |
| 17 | + pub fn suggest_class(self, _arch: InlineAsmArch, _ty: InlineAsmType) -> Option<Self> { |
| 18 | + None |
| 19 | + } |
| 20 | + |
| 21 | + pub fn suggest_modifier( |
| 22 | + self, |
| 23 | + _arch: InlineAsmArch, |
| 24 | + _ty: InlineAsmType, |
| 25 | + ) -> Option<(char, &'static str)> { |
| 26 | + None |
| 27 | + } |
| 28 | + |
| 29 | + pub fn default_modifier(self, _arch: InlineAsmArch) -> Option<(char, &'static str)> { |
| 30 | + None |
| 31 | + } |
| 32 | + |
| 33 | + pub fn supported_types( |
| 34 | + self, |
| 35 | + _arch: InlineAsmArch, |
| 36 | + ) -> &'static [(InlineAsmType, Option<&'static str>)] { |
| 37 | + match self { |
| 38 | + Self::reg => types! { _: I8, I16, I32, F32; }, |
| 39 | + Self::freg => types! { _: F32; }, |
| 40 | + } |
| 41 | + } |
| 42 | +} |
| 43 | + |
| 44 | +// The reserved registers are somewhat taken from <https://git.io/JUR1k#L150>. |
| 45 | +def_regs! { |
| 46 | + Mips MipsInlineAsmReg MipsInlineAsmRegClass { |
| 47 | + v0: reg = ["$2", "$v0"], |
| 48 | + v1: reg = ["$3", "$v1"], |
| 49 | + a0: reg = ["$4", "$a0"], |
| 50 | + a1: reg = ["$5", "$a1"], |
| 51 | + a2: reg = ["$6", "$a2"], |
| 52 | + a3: reg = ["$7", "$a3"], |
| 53 | + // FIXME: Reserve $t0, $t1 if in mips16 mode. |
| 54 | + t0: reg = ["$8", "$t0"], |
| 55 | + t1: reg = ["$9", "$t1"], |
| 56 | + t2: reg = ["$10", "$t2"], |
| 57 | + t3: reg = ["$11", "$t3"], |
| 58 | + t4: reg = ["$12", "$t4"], |
| 59 | + t5: reg = ["$13", "$t5"], |
| 60 | + t6: reg = ["$14", "$t6"], |
| 61 | + t7: reg = ["$15", "$t7"], |
| 62 | + s0: reg = ["$16", "$s0"], |
| 63 | + s1: reg = ["$17", "$s1"], |
| 64 | + s2: reg = ["$18", "$s2"], |
| 65 | + s3: reg = ["$19", "$s3"], |
| 66 | + s4: reg = ["$20", "$s4"], |
| 67 | + s5: reg = ["$21", "$s5"], |
| 68 | + s6: reg = ["$22", "$s6"], |
| 69 | + s7: reg = ["$23", "$s7"], |
| 70 | + t8: reg = ["$24", "$t8"], |
| 71 | + t9: reg = ["$25", "$t9"], |
| 72 | + f0: freg = ["$f0"], |
| 73 | + f1: freg = ["$f1"], |
| 74 | + f2: freg = ["$f2"], |
| 75 | + f3: freg = ["$f3"], |
| 76 | + f4: freg = ["$f4"], |
| 77 | + f5: freg = ["$f5"], |
| 78 | + f6: freg = ["$f6"], |
| 79 | + f7: freg = ["$f7"], |
| 80 | + f8: freg = ["$f8"], |
| 81 | + f9: freg = ["$f9"], |
| 82 | + f10: freg = ["$f10"], |
| 83 | + f11: freg = ["$f11"], |
| 84 | + f12: freg = ["$f12"], |
| 85 | + f13: freg = ["$f13"], |
| 86 | + f14: freg = ["$f14"], |
| 87 | + f15: freg = ["$f15"], |
| 88 | + f16: freg = ["$f16"], |
| 89 | + f17: freg = ["$f17"], |
| 90 | + f18: freg = ["$f18"], |
| 91 | + f19: freg = ["$f19"], |
| 92 | + f20: freg = ["$f20"], |
| 93 | + f21: freg = ["$f21"], |
| 94 | + f22: freg = ["$f22"], |
| 95 | + f23: freg = ["$f23"], |
| 96 | + f24: freg = ["$f24"], |
| 97 | + f25: freg = ["$f25"], |
| 98 | + f26: freg = ["$f26"], |
| 99 | + f27: freg = ["$f27"], |
| 100 | + f28: freg = ["$f28"], |
| 101 | + f29: freg = ["$f29"], |
| 102 | + f30: freg = ["$f30"], |
| 103 | + f31: freg = ["$f31"], |
| 104 | + #error = ["$0", "$zero"] => |
| 105 | + "constant zero cannot be used as an operand for inline asm", |
| 106 | + #error = ["$1", "$at"] => |
| 107 | + "reserved for assembler (Assembler Temp)", |
| 108 | + #error = ["$26", "$k0"] => |
| 109 | + "OS-reserved register cannot be used as an operand for inline asm", |
| 110 | + #error = ["$27", "$k1"] => |
| 111 | + "OS-reserved register cannot be used as an operand for inline asm", |
| 112 | + #error = ["$28", "$gp"] => |
| 113 | + "the global pointer cannot be used as an operand for inline asm", |
| 114 | + #error = ["$29", "$sp"] => |
| 115 | + "the stack pointer cannot be used as an operand for inline asm", |
| 116 | + #error = ["$30", "$s8", "$fp"] => |
| 117 | + "the frame pointer cannot be used as an operand for inline asm", |
| 118 | + #error = ["$31", "$ra"] => |
| 119 | + "the return address register cannot be used as an operand for inline asm", |
| 120 | + } |
| 121 | +} |
| 122 | + |
| 123 | +impl MipsInlineAsmReg { |
| 124 | + pub fn emit( |
| 125 | + self, |
| 126 | + out: &mut dyn fmt::Write, |
| 127 | + _arch: InlineAsmArch, |
| 128 | + _modifier: Option<char>, |
| 129 | + ) -> fmt::Result { |
| 130 | + out.write_str(self.name()) |
| 131 | + } |
| 132 | +} |
0 commit comments