1//===-- MSP430InstrFormats.td - MSP430 Instruction Formats -*- tablegen -*-===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9 10//===----------------------------------------------------------------------===// 11// Describe MSP430 instructions format here 12// 13 14// Format specifies the encoding used by the instruction. This is part of the 15// ad-hoc solution used to emit machine instruction encodings by our machine 16// code emitter. 17class Format<bits<2> val> { 18 bits<2> Value = val; 19} 20 21def PseudoFrm : Format<0>; 22def SingleOpFrm : Format<1>; 23def DoubleOpFrm : Format<2>; 24def CondJumpFrm : Format<3>; 25 26class SourceMode<bits<2> val> { 27 bits<2> Value = val; 28} 29 30def SrcReg : SourceMode<0>; 31def SrcMem : SourceMode<1>; 32def SrcIndReg : SourceMode<2>; 33def SrcPostInc : SourceMode<3>; 34def SrcImm : SourceMode<3>; 35 36class DestMode<bit val> { 37 bit Value = val; 38} 39 40def DstReg : DestMode<0>; 41def DstMem : DestMode<1>; 42 43class SizeVal<bits<3> val> { 44 bits<3> Value = val; 45} 46 47def SizeUnknown : SizeVal<0>; // Unknown / unset size 48def SizeSpecial : SizeVal<1>; // Special instruction, e.g. pseudo 49def Size2Bytes : SizeVal<2>; 50def Size4Bytes : SizeVal<3>; 51def Size6Bytes : SizeVal<4>; 52 53// Generic MSP430 Format 54class MSP430Inst<dag outs, dag ins, SizeVal sz, Format f, 55 string asmstr> : Instruction { 56 field bits<16> Inst; 57 58 let Namespace = "MSP430"; 59 60 dag OutOperandList = outs; 61 dag InOperandList = ins; 62 63 Format Form = f; 64 SizeVal Sz = sz; 65 66 // Define how we want to layout our TargetSpecific information field... This 67 // should be kept up-to-date with the fields in the MSP430InstrInfo.h file. 68 let TSFlags{1-0} = Form.Value; 69 let TSFlags{4-2} = Sz.Value; 70 71 let AsmString = asmstr; 72} 73 74// FIXME: Create different classes for different addressing modes. 75 76// MSP430 Double Operand (Format I) Instructions 77class IForm<bits<4> opcode, DestMode dest, bit bw, SourceMode src, SizeVal sz, 78 dag outs, dag ins, string asmstr, list<dag> pattern> 79 : MSP430Inst<outs, ins, sz, DoubleOpFrm, asmstr> { 80 let Pattern = pattern; 81 82 DestMode ad = dest; 83 SourceMode as = src; 84 85 let Inst{12-15} = opcode; 86 let Inst{7} = ad.Value; 87 let Inst{6} = bw; 88 let Inst{4-5} = as.Value; 89} 90 91// 8 bit IForm instructions 92class IForm8<bits<4> opcode, DestMode dest, SourceMode src, SizeVal sz, 93 dag outs, dag ins, string asmstr, list<dag> pattern> 94 : IForm<opcode, dest, 1, src, sz, outs, ins, asmstr, pattern>; 95 96class I8rr<bits<4> opcode, 97 dag outs, dag ins, string asmstr, list<dag> pattern> 98 : IForm8<opcode, DstReg, SrcReg, Size2Bytes, outs, ins, asmstr, pattern>; 99 100class I8ri<bits<4> opcode, 101 dag outs, dag ins, string asmstr, list<dag> pattern> 102 : IForm8<opcode, DstReg, SrcImm, Size4Bytes, outs, ins, asmstr, pattern>; 103 104class I8rm<bits<4> opcode, 105 dag outs, dag ins, string asmstr, list<dag> pattern> 106 : IForm8<opcode, DstReg, SrcMem, Size4Bytes, outs, ins, asmstr, pattern>; 107 108class I8mr<bits<4> opcode, 109 dag outs, dag ins, string asmstr, list<dag> pattern> 110 : IForm8<opcode, DstMem, SrcReg, Size4Bytes, outs, ins, asmstr, pattern>; 111 112class I8mi<bits<4> opcode, 113 dag outs, dag ins, string asmstr, list<dag> pattern> 114 : IForm8<opcode, DstMem, SrcImm, Size6Bytes, outs, ins, asmstr, pattern>; 115 116class I8mm<bits<4> opcode, 117 dag outs, dag ins, string asmstr, list<dag> pattern> 118 : IForm8<opcode, DstMem, SrcMem, Size6Bytes, outs, ins, asmstr, pattern>; 119 120// 16 bit IForm instructions 121class IForm16<bits<4> opcode, DestMode dest, SourceMode src, SizeVal sz, 122 dag outs, dag ins, string asmstr, list<dag> pattern> 123 : IForm<opcode, dest, 0, src, sz, outs, ins, asmstr, pattern>; 124 125class I16rr<bits<4> opcode, 126 dag outs, dag ins, string asmstr, list<dag> pattern> 127 : IForm16<opcode, DstReg, SrcReg, Size2Bytes, outs, ins, asmstr, pattern>; 128 129class I16ri<bits<4> opcode, 130 dag outs, dag ins, string asmstr, list<dag> pattern> 131 : IForm16<opcode, DstReg, SrcImm, Size4Bytes, outs, ins, asmstr, pattern>; 132 133class I16rm<bits<4> opcode, 134 dag outs, dag ins, string asmstr, list<dag> pattern> 135 : IForm16<opcode, DstReg, SrcMem, Size4Bytes, outs, ins, asmstr, pattern>; 136 137class I16mr<bits<4> opcode, 138 dag outs, dag ins, string asmstr, list<dag> pattern> 139 : IForm16<opcode, DstMem, SrcReg, Size4Bytes, outs, ins, asmstr, pattern>; 140 141class I16mi<bits<4> opcode, 142 dag outs, dag ins, string asmstr, list<dag> pattern> 143 : IForm16<opcode, DstMem, SrcImm, Size6Bytes, outs, ins, asmstr, pattern>; 144 145class I16mm<bits<4> opcode, 146 dag outs, dag ins, string asmstr, list<dag> pattern> 147 : IForm16<opcode, DstMem, SrcMem, Size6Bytes, outs, ins, asmstr, pattern>; 148 149// MSP430 Single Operand (Format II) Instructions 150class IIForm<bits<9> opcode, bit bw, SourceMode src, SizeVal sz, 151 dag outs, dag ins, string asmstr, list<dag> pattern> 152 : MSP430Inst<outs, ins, sz, SingleOpFrm, asmstr> { 153 let Pattern = pattern; 154 155 SourceMode as = src; 156 157 let Inst{7-15} = opcode; 158 let Inst{6} = bw; 159 let Inst{4-5} = as.Value; 160} 161 162// 8 bit IIForm instructions 163class IIForm8<bits<9> opcode, SourceMode src, SizeVal sz, 164 dag outs, dag ins, string asmstr, list<dag> pattern> 165 : IIForm<opcode, 1, src, sz, outs, ins, asmstr, pattern>; 166 167class II8r<bits<9> opcode, 168 dag outs, dag ins, string asmstr, list<dag> pattern> 169 : IIForm8<opcode, SrcReg, Size2Bytes, outs, ins, asmstr, pattern>; 170 171class II8m<bits<9> opcode, 172 dag outs, dag ins, string asmstr, list<dag> pattern> 173 : IIForm8<opcode, SrcMem, Size4Bytes, outs, ins, asmstr, pattern>; 174 175class II8i<bits<9> opcode, 176 dag outs, dag ins, string asmstr, list<dag> pattern> 177 : IIForm8<opcode, SrcImm, Size4Bytes, outs, ins, asmstr, pattern>; 178 179// 16 bit IIForm instructions 180class IIForm16<bits<9> opcode, SourceMode src, SizeVal sz, 181 dag outs, dag ins, string asmstr, list<dag> pattern> 182 : IIForm<opcode, 0, src, sz, outs, ins, asmstr, pattern>; 183 184class II16r<bits<9> opcode, 185 dag outs, dag ins, string asmstr, list<dag> pattern> 186 : IIForm16<opcode, SrcReg, Size2Bytes, outs, ins, asmstr, pattern>; 187 188class II16m<bits<9> opcode, 189 dag outs, dag ins, string asmstr, list<dag> pattern> 190 : IIForm16<opcode, SrcMem, Size4Bytes, outs, ins, asmstr, pattern>; 191 192class II16i<bits<9> opcode, 193 dag outs, dag ins, string asmstr, list<dag> pattern> 194 : IIForm16<opcode, SrcImm, Size4Bytes, outs, ins, asmstr, pattern>; 195 196// MSP430 Conditional Jumps Instructions 197class CJForm<bits<3> opcode, bits<3> cond, 198 dag outs, dag ins, string asmstr, list<dag> pattern> 199 : MSP430Inst<outs, ins, Size2Bytes, CondJumpFrm, asmstr> { 200 let Pattern = pattern; 201 202 let Inst{13-15} = opcode; 203 let Inst{10-12} = cond; 204} 205 206// Pseudo instructions 207class Pseudo<dag outs, dag ins, string asmstr, list<dag> pattern> 208 : MSP430Inst<outs, ins, SizeSpecial, PseudoFrm, asmstr> { 209 let Pattern = pattern; 210 let Inst{15-0} = 0; 211} 212