| //===- AlphaInstrFormats.td - Alpha Instruction Formats ----*- tablegen -*-===// | |
| // | |
| // The LLVM Compiler Infrastructure | |
| // | |
| // This file is distributed under the University of Illinois Open Source | |
| // License. See LICENSE.TXT for details. | |
| // | |
| //===----------------------------------------------------------------------===// | |
| // | |
| // | |
| //===----------------------------------------------------------------------===// | |
| //3.3: | |
| //Memory | |
| //Branch | |
| //Operate | |
| //Floating-point | |
| //PALcode | |
| def u8imm : Operand<i64>; | |
| def s14imm : Operand<i64>; | |
| def s16imm : Operand<i64>; | |
| def s21imm : Operand<i64>; | |
| def s64imm : Operand<i64>; | |
| def u64imm : Operand<i64>; | |
| //===----------------------------------------------------------------------===// | |
| // Instruction format superclass | |
| //===----------------------------------------------------------------------===// | |
| // Alpha instruction baseline | |
| class InstAlpha<bits<6> op, string asmstr, InstrItinClass itin> : Instruction { | |
| field bits<32> Inst; | |
| let Namespace = "Alpha"; | |
| let AsmString = asmstr; | |
| let Inst{31-26} = op; | |
| let Itinerary = itin; | |
| } | |
| //3.3.1 | |
| class MForm<bits<6> opcode, bit load, string asmstr, list<dag> pattern, InstrItinClass itin> | |
| : InstAlpha<opcode, asmstr, itin> { | |
| let Pattern = pattern; | |
| let canFoldAsLoad = load; | |
| let Defs = [R28]; //We may use this for frame index calculations, so reserve it here | |
| bits<5> Ra; | |
| bits<16> disp; | |
| bits<5> Rb; | |
| let Inst{25-21} = Ra; | |
| let Inst{20-16} = Rb; | |
| let Inst{15-0} = disp; | |
| } | |
| class MfcForm<bits<6> opcode, bits<16> fc, string asmstr, InstrItinClass itin> | |
| : InstAlpha<opcode, asmstr, itin> { | |
| bits<5> Ra; | |
| let OutOperandList = (outs GPRC:$RA); | |
| let InOperandList = (ins); | |
| let Inst{25-21} = Ra; | |
| let Inst{20-16} = 0; | |
| let Inst{15-0} = fc; | |
| } | |
| class MfcPForm<bits<6> opcode, bits<16> fc, string asmstr, InstrItinClass itin> | |
| : InstAlpha<opcode, asmstr, itin> { | |
| let OutOperandList = (outs); | |
| let InOperandList = (ins); | |
| let Inst{25-21} = 0; | |
| let Inst{20-16} = 0; | |
| let Inst{15-0} = fc; | |
| } | |
| class MbrForm<bits<6> opcode, bits<2> TB, dag OL, string asmstr, InstrItinClass itin> | |
| : InstAlpha<opcode, asmstr, itin> { | |
| bits<5> Ra; | |
| bits<5> Rb; | |
| bits<14> disp; | |
| let OutOperandList = (outs); | |
| let InOperandList = OL; | |
| let Inst{25-21} = Ra; | |
| let Inst{20-16} = Rb; | |
| let Inst{15-14} = TB; | |
| let Inst{13-0} = disp; | |
| } | |
| class MbrpForm<bits<6> opcode, bits<2> TB, dag OL, string asmstr, list<dag> pattern, InstrItinClass itin> | |
| : InstAlpha<opcode, asmstr, itin> { | |
| let Pattern=pattern; | |
| bits<5> Ra; | |
| bits<5> Rb; | |
| bits<14> disp; | |
| let OutOperandList = (outs); | |
| let InOperandList = OL; | |
| let Inst{25-21} = Ra; | |
| let Inst{20-16} = Rb; | |
| let Inst{15-14} = TB; | |
| let Inst{13-0} = disp; | |
| } | |
| //3.3.2 | |
| def target : Operand<OtherVT> {} | |
| let isBranch = 1, isTerminator = 1, hasCtrlDep = 1 in { | |
| class BFormN<bits<6> opcode, dag OL, string asmstr, InstrItinClass itin> | |
| : InstAlpha<opcode, asmstr, itin> { | |
| let OutOperandList = (outs); | |
| let InOperandList = OL; | |
| bits<64> Opc; //dummy | |
| bits<5> Ra; | |
| bits<21> disp; | |
| let Inst{25-21} = Ra; | |
| let Inst{20-0} = disp; | |
| } | |
| } | |
| let isBranch = 1, isTerminator = 1 in | |
| class BFormD<bits<6> opcode, string asmstr, list<dag> pattern, InstrItinClass itin> | |
| : InstAlpha<opcode, asmstr, itin> { | |
| let Pattern = pattern; | |
| let OutOperandList = (outs); | |
| let InOperandList = (ins target:$DISP); | |
| bits<5> Ra; | |
| bits<21> disp; | |
| let Inst{25-21} = Ra; | |
| let Inst{20-0} = disp; | |
| } | |
| //3.3.3 | |
| class OForm<bits<6> opcode, bits<7> fun, string asmstr, list<dag> pattern, InstrItinClass itin> | |
| : InstAlpha<opcode, asmstr, itin> { | |
| let Pattern = pattern; | |
| let OutOperandList = (outs GPRC:$RC); | |
| let InOperandList = (ins GPRC:$RA, GPRC:$RB); | |
| bits<5> Rc; | |
| bits<5> Ra; | |
| bits<5> Rb; | |
| bits<7> Function = fun; | |
| let Inst{25-21} = Ra; | |
| let Inst{20-16} = Rb; | |
| let Inst{15-13} = 0; | |
| let Inst{12} = 0; | |
| let Inst{11-5} = Function; | |
| let Inst{4-0} = Rc; | |
| } | |
| class OForm2<bits<6> opcode, bits<7> fun, string asmstr, list<dag> pattern, InstrItinClass itin> | |
| : InstAlpha<opcode, asmstr, itin> { | |
| let Pattern = pattern; | |
| let OutOperandList = (outs GPRC:$RC); | |
| let InOperandList = (ins GPRC:$RB); | |
| bits<5> Rc; | |
| bits<5> Rb; | |
| bits<7> Function = fun; | |
| let Inst{25-21} = 31; | |
| let Inst{20-16} = Rb; | |
| let Inst{15-13} = 0; | |
| let Inst{12} = 0; | |
| let Inst{11-5} = Function; | |
| let Inst{4-0} = Rc; | |
| } | |
| class OForm4<bits<6> opcode, bits<7> fun, string asmstr, list<dag> pattern, InstrItinClass itin> | |
| : InstAlpha<opcode, asmstr, itin> { | |
| let Pattern = pattern; | |
| let OutOperandList = (outs GPRC:$RDEST); | |
| let InOperandList = (ins GPRC:$RCOND, GPRC:$RTRUE, GPRC:$RFALSE); | |
| let Constraints = "$RFALSE = $RDEST"; | |
| let DisableEncoding = "$RFALSE"; | |
| bits<5> Rc; | |
| bits<5> Ra; | |
| bits<5> Rb; | |
| bits<7> Function = fun; | |
| // let Constraints = "$RFALSE = $RDEST"; | |
| let Inst{25-21} = Ra; | |
| let Inst{20-16} = Rb; | |
| let Inst{15-13} = 0; | |
| let Inst{12} = 0; | |
| let Inst{11-5} = Function; | |
| let Inst{4-0} = Rc; | |
| } | |
| class OFormL<bits<6> opcode, bits<7> fun, string asmstr, list<dag> pattern, InstrItinClass itin> | |
| : InstAlpha<opcode, asmstr, itin> { | |
| let Pattern = pattern; | |
| let OutOperandList = (outs GPRC:$RC); | |
| let InOperandList = (ins GPRC:$RA, u8imm:$L); | |
| bits<5> Rc; | |
| bits<5> Ra; | |
| bits<8> LIT; | |
| bits<7> Function = fun; | |
| let Inst{25-21} = Ra; | |
| let Inst{20-13} = LIT; | |
| let Inst{12} = 1; | |
| let Inst{11-5} = Function; | |
| let Inst{4-0} = Rc; | |
| } | |
| class OForm4L<bits<6> opcode, bits<7> fun, string asmstr, list<dag> pattern, InstrItinClass itin> | |
| : InstAlpha<opcode, asmstr, itin> { | |
| let Pattern = pattern; | |
| let OutOperandList = (outs GPRC:$RDEST); | |
| let InOperandList = (ins GPRC:$RCOND, s64imm:$RTRUE, GPRC:$RFALSE); | |
| let Constraints = "$RFALSE = $RDEST"; | |
| let DisableEncoding = "$RFALSE"; | |
| bits<5> Rc; | |
| bits<5> Ra; | |
| bits<8> LIT; | |
| bits<7> Function = fun; | |
| // let Constraints = "$RFALSE = $RDEST"; | |
| let Inst{25-21} = Ra; | |
| let Inst{20-13} = LIT; | |
| let Inst{12} = 1; | |
| let Inst{11-5} = Function; | |
| let Inst{4-0} = Rc; | |
| } | |
| //3.3.4 | |
| class FPForm<bits<6> opcode, bits<11> fun, string asmstr, list<dag> pattern, InstrItinClass itin> | |
| : InstAlpha<opcode, asmstr, itin> { | |
| let Pattern = pattern; | |
| bits<5> Fc; | |
| bits<5> Fa; | |
| bits<5> Fb; | |
| bits<11> Function = fun; | |
| let Inst{25-21} = Fa; | |
| let Inst{20-16} = Fb; | |
| let Inst{15-5} = Function; | |
| let Inst{4-0} = Fc; | |
| } | |
| //3.3.5 | |
| class PALForm<bits<6> opcode, dag OL, string asmstr, InstrItinClass itin> | |
| : InstAlpha<opcode, asmstr, itin> { | |
| let OutOperandList = (outs); | |
| let InOperandList = OL; | |
| bits<26> Function; | |
| let Inst{25-0} = Function; | |
| } | |
| // Pseudo instructions. | |
| class PseudoInstAlpha<dag OOL, dag IOL, string nm, list<dag> pattern, InstrItinClass itin> | |
| : InstAlpha<0, nm, itin> { | |
| let OutOperandList = OOL; | |
| let InOperandList = IOL; | |
| let Pattern = pattern; | |
| } |