1234353Sdim//===-- MSP430InstrFormats.td - MSP430 Instruction Formats -*- tablegen -*-===// 2193323Sed// 3193323Sed// The LLVM Compiler Infrastructure 4193323Sed// 5193323Sed// This file is distributed under the University of Illinois Open Source 6193323Sed// License. See LICENSE.TXT for details. 7193323Sed// 8193323Sed//===----------------------------------------------------------------------===// 9193323Sed 10193323Sed//===----------------------------------------------------------------------===// 11193323Sed// Describe MSP430 instructions format here 12193323Sed// 13193323Sed 14202878Srdivacky// Format specifies the encoding used by the instruction. This is part of the 15202878Srdivacky// ad-hoc solution used to emit machine instruction encodings by our machine 16202878Srdivacky// code emitter. 17202878Srdivackyclass Format<bits<2> val> { 18202878Srdivacky bits<2> Value = val; 19202878Srdivacky} 20202878Srdivacky 21202878Srdivackydef PseudoFrm : Format<0>; 22202878Srdivackydef SingleOpFrm : Format<1>; 23202878Srdivackydef DoubleOpFrm : Format<2>; 24202878Srdivackydef CondJumpFrm : Format<3>; 25202878Srdivacky 26202878Srdivackyclass SourceMode<bits<2> val> { 27202878Srdivacky bits<2> Value = val; 28202878Srdivacky} 29202878Srdivacky 30202878Srdivackydef SrcReg : SourceMode<0>; 31202878Srdivackydef SrcMem : SourceMode<1>; 32202878Srdivackydef SrcIndReg : SourceMode<2>; 33202878Srdivackydef SrcPostInc : SourceMode<3>; 34202878Srdivackydef SrcImm : SourceMode<3>; 35202878Srdivacky 36202878Srdivackyclass DestMode<bit val> { 37202878Srdivacky bit Value = val; 38202878Srdivacky} 39202878Srdivacky 40202878Srdivackydef DstReg : DestMode<0>; 41202878Srdivackydef DstMem : DestMode<1>; 42202878Srdivacky 43202878Srdivackyclass SizeVal<bits<3> val> { 44202878Srdivacky bits<3> Value = val; 45202878Srdivacky} 46202878Srdivacky 47202878Srdivackydef SizeUnknown : SizeVal<0>; // Unknown / unset size 48202878Srdivackydef SizeSpecial : SizeVal<1>; // Special instruction, e.g. pseudo 49202878Srdivackydef Size2Bytes : SizeVal<2>; 50202878Srdivackydef Size4Bytes : SizeVal<3>; 51202878Srdivackydef Size6Bytes : SizeVal<4>; 52202878Srdivacky 53193323Sed// Generic MSP430 Format 54202878Srdivackyclass MSP430Inst<dag outs, dag ins, SizeVal sz, Format f, 55202878Srdivacky string asmstr> : Instruction { 56193323Sed field bits<16> Inst; 57193323Sed 58193323Sed let Namespace = "MSP430"; 59193323Sed 60193323Sed dag OutOperandList = outs; 61193323Sed dag InOperandList = ins; 62193323Sed 63202878Srdivacky Format Form = f; 64202878Srdivacky SizeVal Sz = sz; 65202878Srdivacky 66206274Srdivacky // Define how we want to layout our TargetSpecific information field... This 67206274Srdivacky // should be kept up-to-date with the fields in the MSP430InstrInfo.h file. 68206274Srdivacky let TSFlags{1-0} = Form.Value; 69206274Srdivacky let TSFlags{4-2} = Sz.Value; 70206274Srdivacky 71193323Sed let AsmString = asmstr; 72193323Sed} 73193323Sed 74193323Sed// FIXME: Create different classes for different addressing modes. 75193323Sed 76193323Sed// MSP430 Double Operand (Format I) Instructions 77202878Srdivackyclass IForm<bits<4> opcode, DestMode dest, bit bw, SourceMode src, SizeVal sz, 78193323Sed dag outs, dag ins, string asmstr, list<dag> pattern> 79202878Srdivacky : MSP430Inst<outs, ins, sz, DoubleOpFrm, asmstr> { 80193323Sed let Pattern = pattern; 81202878Srdivacky 82202878Srdivacky DestMode ad = dest; 83202878Srdivacky SourceMode as = src; 84193323Sed 85193323Sed let Inst{12-15} = opcode; 86202878Srdivacky let Inst{7} = ad.Value; 87193323Sed let Inst{6} = bw; 88202878Srdivacky let Inst{4-5} = as.Value; 89193323Sed} 90193323Sed 91202878Srdivacky// 8 bit IForm instructions 92202878Srdivackyclass IForm8<bits<4> opcode, DestMode dest, SourceMode src, SizeVal sz, 93202878Srdivacky dag outs, dag ins, string asmstr, list<dag> pattern> 94202878Srdivacky : IForm<opcode, dest, 1, src, sz, outs, ins, asmstr, pattern>; 95202878Srdivacky 96202878Srdivackyclass I8rr<bits<4> opcode, 97202878Srdivacky dag outs, dag ins, string asmstr, list<dag> pattern> 98202878Srdivacky : IForm8<opcode, DstReg, SrcReg, Size2Bytes, outs, ins, asmstr, pattern>; 99202878Srdivacky 100202878Srdivackyclass I8ri<bits<4> opcode, 101202878Srdivacky dag outs, dag ins, string asmstr, list<dag> pattern> 102202878Srdivacky : IForm8<opcode, DstReg, SrcImm, Size4Bytes, outs, ins, asmstr, pattern>; 103202878Srdivacky 104202878Srdivackyclass I8rm<bits<4> opcode, 105202878Srdivacky dag outs, dag ins, string asmstr, list<dag> pattern> 106202878Srdivacky : IForm8<opcode, DstReg, SrcMem, Size4Bytes, outs, ins, asmstr, pattern>; 107202878Srdivacky 108202878Srdivackyclass I8mr<bits<4> opcode, 109202878Srdivacky dag outs, dag ins, string asmstr, list<dag> pattern> 110202878Srdivacky : IForm8<opcode, DstMem, SrcReg, Size4Bytes, outs, ins, asmstr, pattern>; 111202878Srdivacky 112202878Srdivackyclass I8mi<bits<4> opcode, 113202878Srdivacky dag outs, dag ins, string asmstr, list<dag> pattern> 114202878Srdivacky : IForm8<opcode, DstMem, SrcImm, Size6Bytes, outs, ins, asmstr, pattern>; 115202878Srdivacky 116202878Srdivackyclass I8mm<bits<4> opcode, 117202878Srdivacky dag outs, dag ins, string asmstr, list<dag> pattern> 118202878Srdivacky : IForm8<opcode, DstMem, SrcMem, Size6Bytes, outs, ins, asmstr, pattern>; 119202878Srdivacky 120202878Srdivacky// 16 bit IForm instructions 121202878Srdivackyclass IForm16<bits<4> opcode, DestMode dest, SourceMode src, SizeVal sz, 122202878Srdivacky dag outs, dag ins, string asmstr, list<dag> pattern> 123202878Srdivacky : IForm<opcode, dest, 0, src, sz, outs, ins, asmstr, pattern>; 124202878Srdivacky 125202878Srdivackyclass I16rr<bits<4> opcode, 126202878Srdivacky dag outs, dag ins, string asmstr, list<dag> pattern> 127202878Srdivacky : IForm16<opcode, DstReg, SrcReg, Size2Bytes, outs, ins, asmstr, pattern>; 128202878Srdivacky 129202878Srdivackyclass I16ri<bits<4> opcode, 130202878Srdivacky dag outs, dag ins, string asmstr, list<dag> pattern> 131202878Srdivacky : IForm16<opcode, DstReg, SrcImm, Size4Bytes, outs, ins, asmstr, pattern>; 132202878Srdivacky 133202878Srdivackyclass I16rm<bits<4> opcode, 134202878Srdivacky dag outs, dag ins, string asmstr, list<dag> pattern> 135202878Srdivacky : IForm16<opcode, DstReg, SrcMem, Size4Bytes, outs, ins, asmstr, pattern>; 136202878Srdivacky 137202878Srdivackyclass I16mr<bits<4> opcode, 138202878Srdivacky dag outs, dag ins, string asmstr, list<dag> pattern> 139202878Srdivacky : IForm16<opcode, DstMem, SrcReg, Size4Bytes, outs, ins, asmstr, pattern>; 140202878Srdivacky 141202878Srdivackyclass I16mi<bits<4> opcode, 142202878Srdivacky dag outs, dag ins, string asmstr, list<dag> pattern> 143202878Srdivacky : IForm16<opcode, DstMem, SrcImm, Size6Bytes, outs, ins, asmstr, pattern>; 144202878Srdivacky 145202878Srdivackyclass I16mm<bits<4> opcode, 146202878Srdivacky dag outs, dag ins, string asmstr, list<dag> pattern> 147202878Srdivacky : IForm16<opcode, DstMem, SrcMem, Size6Bytes, outs, ins, asmstr, pattern>; 148202878Srdivacky 149193323Sed// MSP430 Single Operand (Format II) Instructions 150202878Srdivackyclass IIForm<bits<9> opcode, bit bw, SourceMode src, SizeVal sz, 151193323Sed dag outs, dag ins, string asmstr, list<dag> pattern> 152202878Srdivacky : MSP430Inst<outs, ins, sz, SingleOpFrm, asmstr> { 153193323Sed let Pattern = pattern; 154193323Sed 155202878Srdivacky SourceMode as = src; 156202878Srdivacky 157193323Sed let Inst{7-15} = opcode; 158193323Sed let Inst{6} = bw; 159202878Srdivacky let Inst{4-5} = as.Value; 160193323Sed} 161193323Sed 162202878Srdivacky// 8 bit IIForm instructions 163202878Srdivackyclass IIForm8<bits<9> opcode, SourceMode src, SizeVal sz, 164202878Srdivacky dag outs, dag ins, string asmstr, list<dag> pattern> 165202878Srdivacky : IIForm<opcode, 1, src, sz, outs, ins, asmstr, pattern>; 166202878Srdivacky 167202878Srdivackyclass II8r<bits<9> opcode, 168202878Srdivacky dag outs, dag ins, string asmstr, list<dag> pattern> 169202878Srdivacky : IIForm8<opcode, SrcReg, Size2Bytes, outs, ins, asmstr, pattern>; 170202878Srdivacky 171202878Srdivackyclass II8m<bits<9> opcode, 172202878Srdivacky dag outs, dag ins, string asmstr, list<dag> pattern> 173202878Srdivacky : IIForm8<opcode, SrcMem, Size4Bytes, outs, ins, asmstr, pattern>; 174202878Srdivacky 175202878Srdivackyclass II8i<bits<9> opcode, 176202878Srdivacky dag outs, dag ins, string asmstr, list<dag> pattern> 177202878Srdivacky : IIForm8<opcode, SrcImm, Size4Bytes, outs, ins, asmstr, pattern>; 178202878Srdivacky 179202878Srdivacky// 16 bit IIForm instructions 180202878Srdivackyclass IIForm16<bits<9> opcode, SourceMode src, SizeVal sz, 181202878Srdivacky dag outs, dag ins, string asmstr, list<dag> pattern> 182202878Srdivacky : IIForm<opcode, 0, src, sz, outs, ins, asmstr, pattern>; 183202878Srdivacky 184202878Srdivackyclass II16r<bits<9> opcode, 185202878Srdivacky dag outs, dag ins, string asmstr, list<dag> pattern> 186202878Srdivacky : IIForm16<opcode, SrcReg, Size2Bytes, outs, ins, asmstr, pattern>; 187202878Srdivacky 188202878Srdivackyclass II16m<bits<9> opcode, 189202878Srdivacky dag outs, dag ins, string asmstr, list<dag> pattern> 190202878Srdivacky : IIForm16<opcode, SrcMem, Size4Bytes, outs, ins, asmstr, pattern>; 191202878Srdivacky 192202878Srdivackyclass II16i<bits<9> opcode, 193202878Srdivacky dag outs, dag ins, string asmstr, list<dag> pattern> 194202878Srdivacky : IIForm16<opcode, SrcImm, Size4Bytes, outs, ins, asmstr, pattern>; 195202878Srdivacky 196193323Sed// MSP430 Conditional Jumps Instructions 197202878Srdivackyclass CJForm<bits<3> opcode, bits<3> cond, 198193323Sed dag outs, dag ins, string asmstr, list<dag> pattern> 199202878Srdivacky : MSP430Inst<outs, ins, Size2Bytes, CondJumpFrm, asmstr> { 200193323Sed let Pattern = pattern; 201193323Sed 202193323Sed let Inst{13-15} = opcode; 203193323Sed let Inst{10-12} = cond; 204193323Sed} 205193323Sed 206193323Sed// Pseudo instructions 207193323Sedclass Pseudo<dag outs, dag ins, string asmstr, list<dag> pattern> 208202878Srdivacky : MSP430Inst<outs, ins, SizeSpecial, PseudoFrm, asmstr> { 209193323Sed let Pattern = pattern; 210193323Sed let Inst{15-0} = 0; 211193323Sed} 212