1 //===- SparcInstrFormats.td - Sparc 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 class InstSP<dag outs, dag ins, string asmstr, list<dag> pattern> : Instruction { 11 field bits<32> Inst; 12 13 let Namespace = "SP"; 14 15 bits<2> op; 16 let Inst{31-30} = op; // Top two bits are the 'op' field 17 18 dag OutOperandList = outs; 19 dag InOperandList = ins; 20 let AsmString = asmstr; 21 let Pattern = pattern; 22 } 23 24 //===----------------------------------------------------------------------===// 25 // Format #2 instruction classes in the Sparc 26 //===----------------------------------------------------------------------===// 27 28 // Format 2 instructions 29 class F2<dag outs, dag ins, string asmstr, list<dag> pattern> 30 : InstSP<outs, ins, asmstr, pattern> { 31 bits<3> op2; 32 bits<22> imm22; 33 let op = 0; // op = 0 34 let Inst{24-22} = op2; 35 let Inst{21-0} = imm22; 36 } 37 38 // Specific F2 classes: SparcV8 manual, page 44 39 // 40 class F2_1<bits<3> op2Val, dag outs, dag ins, string asmstr, list<dag> pattern> 41 : F2<outs, ins, asmstr, pattern> { 42 bits<5> rd; 43 44 let op2 = op2Val; 45 46 let Inst{29-25} = rd; 47 } 48 49 class F2_2<bits<4> condVal, bits<3> op2Val, dag outs, dag ins, string asmstr, 50 list<dag> pattern> : F2<outs, ins, asmstr, pattern> { 51 bits<4> cond; 52 bit annul = 0; // currently unused 53 54 let cond = condVal; 55 let op2 = op2Val; 56 57 let Inst{29} = annul; 58 let Inst{28-25} = cond; 59 } 60 61 //===----------------------------------------------------------------------===// 62 // Format #3 instruction classes in the Sparc 63 //===----------------------------------------------------------------------===// 64 65 class F3<dag outs, dag ins, string asmstr, list<dag> pattern> 66 : InstSP<outs, ins, asmstr, pattern> { 67 bits<5> rd; 68 bits<6> op3; 69 bits<5> rs1; 70 let op{1} = 1; // Op = 2 or 3 71 let Inst{29-25} = rd; 72 let Inst{24-19} = op3; 73 let Inst{18-14} = rs1; 74 } 75 76 // Specific F3 classes: SparcV8 manual, page 44 77 // 78 class F3_1<bits<2> opVal, bits<6> op3val, dag outs, dag ins, 79 string asmstr, list<dag> pattern> : F3<outs, ins, asmstr, pattern> { 80 bits<8> asi = 0; // asi not currently used 81 bits<5> rs2; 82 83 let op = opVal; 84 let op3 = op3val; 85 86 let Inst{13} = 0; // i field = 0 87 let Inst{12-5} = asi; // address space identifier 88 let Inst{4-0} = rs2; 89 } 90 91 class F3_2<bits<2> opVal, bits<6> op3val, dag outs, dag ins, 92 string asmstr, list<dag> pattern> : F3<outs, ins, asmstr, pattern> { 93 bits<13> simm13; 94 95 let op = opVal; 96 let op3 = op3val; 97 98 let Inst{13} = 1; // i field = 1 99 let Inst{12-0} = simm13; 100 } 101 102 // floating-point 103 class F3_3<bits<2> opVal, bits<6> op3val, bits<9> opfval, dag outs, dag ins, 104 string asmstr, list<dag> pattern> : F3<outs, ins, asmstr, pattern> { 105 bits<5> rs2; 106 107 let op = opVal; 108 let op3 = op3val; 109 110 let Inst{13-5} = opfval; // fp opcode 111 let Inst{4-0} = rs2; 112 } 113 114 115