|  | //===- MSP430InstrFormats.td - MSP430 Instruction Formats-----*- tblgen -*-===// | 
|  | // | 
|  | //                     The LLVM Compiler Infrastructure | 
|  | // | 
|  | // This file is distributed under the University of Illinois Open Source | 
|  | // License. See LICENSE.TXT for details. | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  |  | 
|  | //===----------------------------------------------------------------------===// | 
|  | //  Describe MSP430 instructions format here | 
|  | // | 
|  |  | 
|  | // Format specifies the encoding used by the instruction.  This is part of the | 
|  | // ad-hoc solution used to emit machine instruction encodings by our machine | 
|  | // code emitter. | 
|  | class Format<bits<2> val> { | 
|  | bits<2> Value = val; | 
|  | } | 
|  |  | 
|  | def PseudoFrm   : Format<0>; | 
|  | def SingleOpFrm : Format<1>; | 
|  | def DoubleOpFrm : Format<2>; | 
|  | def CondJumpFrm : Format<3>; | 
|  |  | 
|  | class SourceMode<bits<2> val> { | 
|  | bits<2> Value = val; | 
|  | } | 
|  |  | 
|  | def SrcReg      : SourceMode<0>; | 
|  | def SrcMem      : SourceMode<1>; | 
|  | def SrcIndReg   : SourceMode<2>; | 
|  | def SrcPostInc  : SourceMode<3>; | 
|  | def SrcImm      : SourceMode<3>; | 
|  |  | 
|  | class DestMode<bit val> { | 
|  | bit Value = val; | 
|  | } | 
|  |  | 
|  | def DstReg      : DestMode<0>; | 
|  | def DstMem      : DestMode<1>; | 
|  |  | 
|  | class SizeVal<bits<3> val> { | 
|  | bits<3> Value = val; | 
|  | } | 
|  |  | 
|  | def SizeUnknown : SizeVal<0>; // Unknown / unset size | 
|  | def SizeSpecial : SizeVal<1>; // Special instruction, e.g. pseudo | 
|  | def Size2Bytes  : SizeVal<2>; | 
|  | def Size4Bytes  : SizeVal<3>; | 
|  | def Size6Bytes  : SizeVal<4>; | 
|  |  | 
|  | // Generic MSP430 Format | 
|  | class MSP430Inst<dag outs, dag ins, SizeVal sz, Format f, | 
|  | string asmstr> : Instruction { | 
|  | field bits<16> Inst; | 
|  |  | 
|  | let Namespace = "MSP430"; | 
|  |  | 
|  | dag OutOperandList = outs; | 
|  | dag InOperandList  = ins; | 
|  |  | 
|  | Format Form = f; | 
|  | SizeVal Sz = sz; | 
|  |  | 
|  | // Define how we want to layout our TargetSpecific information field... This | 
|  | // should be kept up-to-date with the fields in the MSP430InstrInfo.h file. | 
|  | let TSFlags{1-0} = Form.Value; | 
|  | let TSFlags{4-2} = Sz.Value; | 
|  |  | 
|  | let AsmString   = asmstr; | 
|  | } | 
|  |  | 
|  | // FIXME: Create different classes for different addressing modes. | 
|  |  | 
|  | // MSP430 Double Operand (Format I) Instructions | 
|  | class IForm<bits<4> opcode, DestMode dest, bit bw, SourceMode src, SizeVal sz, | 
|  | dag outs, dag ins, string asmstr, list<dag> pattern> | 
|  | : MSP430Inst<outs, ins, sz, DoubleOpFrm, asmstr> { | 
|  | let Pattern = pattern; | 
|  |  | 
|  | DestMode ad = dest; | 
|  | SourceMode as = src; | 
|  |  | 
|  | let Inst{12-15} = opcode; | 
|  | let Inst{7}     = ad.Value; | 
|  | let Inst{6}     = bw; | 
|  | let Inst{4-5}   = as.Value; | 
|  | } | 
|  |  | 
|  | // 8 bit IForm instructions | 
|  | class IForm8<bits<4> opcode, DestMode dest, SourceMode src, SizeVal sz, | 
|  | dag outs, dag ins, string asmstr, list<dag> pattern> | 
|  | : IForm<opcode, dest, 1, src, sz, outs, ins, asmstr, pattern>; | 
|  |  | 
|  | class I8rr<bits<4> opcode, | 
|  | dag outs, dag ins, string asmstr, list<dag> pattern> | 
|  | : IForm8<opcode, DstReg, SrcReg, Size2Bytes, outs, ins, asmstr, pattern>; | 
|  |  | 
|  | class I8ri<bits<4> opcode, | 
|  | dag outs, dag ins, string asmstr, list<dag> pattern> | 
|  | : IForm8<opcode, DstReg, SrcImm, Size4Bytes, outs, ins, asmstr, pattern>; | 
|  |  | 
|  | class I8rm<bits<4> opcode, | 
|  | dag outs, dag ins, string asmstr, list<dag> pattern> | 
|  | : IForm8<opcode, DstReg, SrcMem, Size4Bytes, outs, ins, asmstr, pattern>; | 
|  |  | 
|  | class I8mr<bits<4> opcode, | 
|  | dag outs, dag ins, string asmstr, list<dag> pattern> | 
|  | : IForm8<opcode, DstMem, SrcReg, Size4Bytes, outs, ins, asmstr, pattern>; | 
|  |  | 
|  | class I8mi<bits<4> opcode, | 
|  | dag outs, dag ins, string asmstr, list<dag> pattern> | 
|  | : IForm8<opcode, DstMem, SrcImm, Size6Bytes, outs, ins, asmstr, pattern>; | 
|  |  | 
|  | class I8mm<bits<4> opcode, | 
|  | dag outs, dag ins, string asmstr, list<dag> pattern> | 
|  | : IForm8<opcode, DstMem, SrcMem, Size6Bytes, outs, ins, asmstr, pattern>; | 
|  |  | 
|  | // 16 bit IForm instructions | 
|  | class IForm16<bits<4> opcode, DestMode dest, SourceMode src, SizeVal sz, | 
|  | dag outs, dag ins, string asmstr, list<dag> pattern> | 
|  | : IForm<opcode, dest, 0, src, sz, outs, ins, asmstr, pattern>; | 
|  |  | 
|  | class I16rr<bits<4> opcode, | 
|  | dag outs, dag ins, string asmstr, list<dag> pattern> | 
|  | : IForm16<opcode, DstReg, SrcReg, Size2Bytes, outs, ins, asmstr, pattern>; | 
|  |  | 
|  | class I16ri<bits<4> opcode, | 
|  | dag outs, dag ins, string asmstr, list<dag> pattern> | 
|  | : IForm16<opcode, DstReg, SrcImm, Size4Bytes, outs, ins, asmstr, pattern>; | 
|  |  | 
|  | class I16rm<bits<4> opcode, | 
|  | dag outs, dag ins, string asmstr, list<dag> pattern> | 
|  | : IForm16<opcode, DstReg, SrcMem, Size4Bytes, outs, ins, asmstr, pattern>; | 
|  |  | 
|  | class I16mr<bits<4> opcode, | 
|  | dag outs, dag ins, string asmstr, list<dag> pattern> | 
|  | : IForm16<opcode, DstMem, SrcReg, Size4Bytes, outs, ins, asmstr, pattern>; | 
|  |  | 
|  | class I16mi<bits<4> opcode, | 
|  | dag outs, dag ins, string asmstr, list<dag> pattern> | 
|  | : IForm16<opcode, DstMem, SrcImm, Size6Bytes, outs, ins, asmstr, pattern>; | 
|  |  | 
|  | class I16mm<bits<4> opcode, | 
|  | dag outs, dag ins, string asmstr, list<dag> pattern> | 
|  | : IForm16<opcode, DstMem, SrcMem, Size6Bytes, outs, ins, asmstr, pattern>; | 
|  |  | 
|  | // MSP430 Single Operand (Format II) Instructions | 
|  | class IIForm<bits<9> opcode, bit bw, SourceMode src, SizeVal sz, | 
|  | dag outs, dag ins, string asmstr, list<dag> pattern> | 
|  | : MSP430Inst<outs, ins, sz, SingleOpFrm, asmstr> { | 
|  | let Pattern = pattern; | 
|  |  | 
|  | SourceMode as = src; | 
|  |  | 
|  | let Inst{7-15} = opcode; | 
|  | let Inst{6}    = bw; | 
|  | let Inst{4-5}  = as.Value; | 
|  | } | 
|  |  | 
|  | // 8 bit IIForm instructions | 
|  | class IIForm8<bits<9> opcode, SourceMode src, SizeVal sz, | 
|  | dag outs, dag ins, string asmstr, list<dag> pattern> | 
|  | : IIForm<opcode, 1, src, sz, outs, ins, asmstr, pattern>; | 
|  |  | 
|  | class II8r<bits<9> opcode, | 
|  | dag outs, dag ins, string asmstr, list<dag> pattern> | 
|  | : IIForm8<opcode, SrcReg, Size2Bytes, outs, ins, asmstr, pattern>; | 
|  |  | 
|  | class II8m<bits<9> opcode, | 
|  | dag outs, dag ins, string asmstr, list<dag> pattern> | 
|  | : IIForm8<opcode, SrcMem, Size4Bytes, outs, ins, asmstr, pattern>; | 
|  |  | 
|  | class II8i<bits<9> opcode, | 
|  | dag outs, dag ins, string asmstr, list<dag> pattern> | 
|  | : IIForm8<opcode, SrcImm, Size4Bytes, outs, ins, asmstr, pattern>; | 
|  |  | 
|  | // 16 bit IIForm instructions | 
|  | class IIForm16<bits<9> opcode, SourceMode src, SizeVal sz, | 
|  | dag outs, dag ins, string asmstr, list<dag> pattern> | 
|  | : IIForm<opcode, 0, src, sz, outs, ins, asmstr, pattern>; | 
|  |  | 
|  | class II16r<bits<9> opcode, | 
|  | dag outs, dag ins, string asmstr, list<dag> pattern> | 
|  | : IIForm16<opcode, SrcReg, Size2Bytes, outs, ins, asmstr, pattern>; | 
|  |  | 
|  | class II16m<bits<9> opcode, | 
|  | dag outs, dag ins, string asmstr, list<dag> pattern> | 
|  | : IIForm16<opcode, SrcMem, Size4Bytes, outs, ins, asmstr, pattern>; | 
|  |  | 
|  | class II16i<bits<9> opcode, | 
|  | dag outs, dag ins, string asmstr, list<dag> pattern> | 
|  | : IIForm16<opcode, SrcImm, Size4Bytes, outs, ins, asmstr, pattern>; | 
|  |  | 
|  | // MSP430 Conditional Jumps Instructions | 
|  | class CJForm<bits<3> opcode, bits<3> cond, | 
|  | dag outs, dag ins, string asmstr, list<dag> pattern> | 
|  | : MSP430Inst<outs, ins, Size2Bytes, CondJumpFrm, asmstr> { | 
|  | let Pattern = pattern; | 
|  |  | 
|  | let Inst{13-15} = opcode; | 
|  | let Inst{10-12} = cond; | 
|  | } | 
|  |  | 
|  | // Pseudo instructions | 
|  | class Pseudo<dag outs, dag ins, string asmstr, list<dag> pattern> | 
|  | : MSP430Inst<outs, ins, SizeSpecial, PseudoFrm, asmstr> { | 
|  | let Pattern = pattern; | 
|  | let Inst{15-0} = 0; | 
|  | } |