X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FTarget%2FSparc%2FSparcInstrFormats.td;h=c5409bae26d171bec4c8c0277dc99f1e8b5b5781;hb=f39297678b212ab5ee7885474762fc8c3f6c370f;hp=4961d23063ebce615083509f2ca0e6ec3fa2790d;hpb=dc6938ac23f49c35ac551b6f5541e926a357de1b;p=oota-llvm.git diff --git a/lib/Target/Sparc/SparcInstrFormats.td b/lib/Target/Sparc/SparcInstrFormats.td index 4961d23063e..c5409bae26d 100644 --- a/lib/Target/Sparc/SparcInstrFormats.td +++ b/lib/Target/Sparc/SparcInstrFormats.td @@ -1,17 +1,38 @@ -//===- SparcV8InstrFormats.td - SparcV8 Instr Formats ------*- tablegen -*-===// -// +//===-- SparcInstrFormats.td - Sparc Instruction Formats ---*- tablegen -*-===// +// // The LLVM Compiler Infrastructure // -// This file was developed by the LLVM research group and is distributed under -// the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// //===----------------------------------------------------------------------===// +class InstSP pattern> + : Instruction { + field bits<32> Inst; + + let Namespace = "SP"; + let Size = 4; + + bits<2> op; + let Inst{31-30} = op; // Top two bits are the 'op' field + + dag OutOperandList = outs; + dag InOperandList = ins; + let AsmString = asmstr; + let Pattern = pattern; + + let DecoderNamespace = "Sparc"; + field bits<32> SoftFail = 0; +} + //===----------------------------------------------------------------------===// -// Format #2 instruction classes in the SparcV8 +// Format #2 instruction classes in the Sparc //===----------------------------------------------------------------------===// -class F2 : InstV8 { // Format 2 instructions +// Format 2 instructions +class F2 pattern> + : InstSP { bits<3> op2; bits<22> imm22; let op = 0; // op = 0 @@ -21,34 +42,53 @@ class F2 : InstV8 { // Format 2 instructions // Specific F2 classes: SparcV8 manual, page 44 // -class F2_1 op2Val, dag ops, string asmstr> : F2 { +class F2_1 op2Val, dag outs, dag ins, string asmstr, list pattern> + : F2 { bits<5> rd; - dag OperandList = ops; - let AsmString = asmstr; - let op2 = op2Val; let Inst{29-25} = rd; } -class F2_2 condVal, bits<3> op2Val, string name> : F2 { +class F2_2 op2Val, dag outs, dag ins, string asmstr, + list pattern> : F2 { bits<4> cond; bit annul = 0; // currently unused - let cond = condVal; let op2 = op2Val; - let Name = name; let Inst{29} = annul; let Inst{28-25} = cond; } +class F2_3 op2Val, bits<2> ccVal, dag outs, dag ins, string asmstr, + list pattern> + : InstSP { + bit annul; + bits<4> cond; + bit pred; + bits<19> imm19; + + let op = 0; // op = 0 + + bit annul = 0; // currently unused + let pred = 1; // default is predict taken + + let Inst{29} = annul; + let Inst{28-25} = cond; + let Inst{24-22} = op2Val; + let Inst{21-20} = ccVal; + let Inst{19} = pred; + let Inst{18-0} = imm19; +} + //===----------------------------------------------------------------------===// -// Format #3 instruction classes in the SparcV8 +// Format #3 instruction classes in the Sparc //===----------------------------------------------------------------------===// -class F3 : InstV8 { +class F3 pattern> + : InstSP { bits<5> rd; bits<6> op3; bits<5> rs1; @@ -60,13 +100,11 @@ class F3 : InstV8 { // Specific F3 classes: SparcV8 manual, page 44 // -class F3_1 opVal, bits<6> op3val, dag ops, string asmstr> : F3 { - bits<8> asi = 0; // asi not currently used in SparcV8 +class F3_1 opVal, bits<6> op3val, dag outs, dag ins, + string asmstr, list pattern> : F3 { + bits<8> asi = 0; // asi not currently used bits<5> rs2; - dag OperandList = ops; - let AsmString = asmstr; - let op = opVal; let op3 = op3val; @@ -75,12 +113,10 @@ class F3_1 opVal, bits<6> op3val, dag ops, string asmstr> : F3 { let Inst{4-0} = rs2; } -class F3_2 opVal, bits<6> op3val, dag ops, string asmstr> : F3 { +class F3_2 opVal, bits<6> op3val, dag outs, dag ins, + string asmstr, list pattern> : F3 { bits<13> simm13; - dag OperandList = ops; - let AsmString = asmstr; - let op = opVal; let op3 = op3val; @@ -89,16 +125,134 @@ class F3_2 opVal, bits<6> op3val, dag ops, string asmstr> : F3 { } // floating-point -class F3_3 opVal, bits<6> op3val, bits<9> opfval, dag ops, - string asmstr> : F3 { +class F3_3 opVal, bits<6> op3val, bits<9> opfval, dag outs, dag ins, + string asmstr, list pattern> : F3 { bits<5> rs2; - dag OperandList = ops; - let AsmString = asmstr; + let op = opVal; + let op3 = op3val; + + let Inst{13-5} = opfval; // fp opcode + let Inst{4-0} = rs2; +} + +// floating-point unary operations. +class F3_3u opVal, bits<6> op3val, bits<9> opfval, dag outs, dag ins, + string asmstr, list pattern> : F3 { + bits<5> rs2; + + let op = opVal; + let op3 = op3val; + let rs1 = 0; + + let Inst{13-5} = opfval; // fp opcode + let Inst{4-0} = rs2; +} + +// floating-point compares. +class F3_3c opVal, bits<6> op3val, bits<9> opfval, dag outs, dag ins, + string asmstr, list pattern> : F3 { + bits<5> rs2; let op = opVal; let op3 = op3val; + let rd = 0; let Inst{13-5} = opfval; // fp opcode let Inst{4-0} = rs2; } + +// Shift by register rs2. +class F3_Sr opVal, bits<6> op3val, bit xVal, dag outs, dag ins, + string asmstr, list pattern> : F3 { + bit x = xVal; // 1 for 64-bit shifts. + bits<5> rs2; + + let op = opVal; + let op3 = op3val; + + let Inst{13} = 0; // i field = 0 + let Inst{12} = x; // extended registers. + let Inst{4-0} = rs2; +} + +// Shift by immediate. +class F3_Si opVal, bits<6> op3val, bit xVal, dag outs, dag ins, + string asmstr, list pattern> : F3 { + bit x = xVal; // 1 for 64-bit shifts. + bits<6> shcnt; // shcnt32 / shcnt64. + + let op = opVal; + let op3 = op3val; + + let Inst{13} = 1; // i field = 1 + let Inst{12} = x; // extended registers. + let Inst{5-0} = shcnt; +} + +// Define rr and ri shift instructions with patterns. +multiclass F3_S Op3Val, bit XVal, SDNode OpNode, + ValueType VT, RegisterClass RC> { + def rr : F3_Sr<2, Op3Val, XVal, (outs RC:$rd), (ins RC:$rs1, IntRegs:$rs2), + !strconcat(OpcStr, " $rs1, $rs2, $rd"), + [(set VT:$rd, (OpNode VT:$rs1, i32:$rs2))]>; + def ri : F3_Si<2, Op3Val, XVal, (outs RC:$rd), (ins RC:$rs1, i32imm:$shcnt), + !strconcat(OpcStr, " $rs1, $shcnt, $rd"), + [(set VT:$rd, (OpNode VT:$rs1, (i32 imm:$shcnt)))]>; +} + +class F4 op3, dag outs, dag ins, string asmstr, list pattern> + : InstSP { + bits<5> rd; + + let op = 2; + let Inst{29-25} = rd; + let Inst{24-19} = op3; +} + + +class F4_1 op3, dag outs, dag ins, + string asmstr, list pattern> + : F4 { + + bits<3> cc; + bits<4> cond; + bits<5> rs2; + + let Inst{4-0} = rs2; + let Inst{11} = cc{0}; + let Inst{12} = cc{1}; + let Inst{13} = 0; + let Inst{17-14} = cond; + let Inst{18} = cc{2}; + +} + +class F4_2 op3, dag outs, dag ins, + string asmstr, list pattern> + : F4 { + bits<3> cc; + bits<4> cond; + bits<11> simm11; + + let Inst{10-0} = simm11; + let Inst{11} = cc{0}; + let Inst{12} = cc{1}; + let Inst{13} = 1; + let Inst{17-14} = cond; + let Inst{18} = cc{2}; +} + +class F4_3 op3, bits<6> opf_low, dag outs, dag ins, + string asmstr, list pattern> + : F4 { + bits<4> cond; + bits<3> opf_cc; + bits<5> rs2; + + let Inst{18} = 0; + let Inst{17-14} = cond; + let Inst{13-11} = opf_cc; + let Inst{10-5} = opf_low; + let Inst{4-0} = rs2; +}