212 lines
		
	
	
		
			7.1 KiB
		
	
	
	
		
			TableGen
		
	
	
	
			
		
		
	
	
			212 lines
		
	
	
		
			7.1 KiB
		
	
	
	
		
			TableGen
		
	
	
	
//===-- MSP430InstrFormats.td - MSP430 Instruction Formats -*- tablegen -*-===//
 | 
						|
//
 | 
						|
//                     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;
 | 
						|
}
 |