SparcInstrFormats.td revision e33a3ff942d33edfb619867c84b1d4589d3a582d
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===- SparcV8InstrFormats.td - SparcV8 Instr Formats ------*- tablegen -*-===//
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                     The LLVM Compiler Infrastructure
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file was developed by the LLVM research group and is distributed under
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the University of Illinois Open Source License. See LICENSE.TXT for details.
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===//
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===//
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Format #2 instruction classes in the SparcV8
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===//
13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class F2 : InstV8 {                   // Format 2 instructions
15effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  bits<3>  op2;
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bits<22> imm22;
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  let op          = 0;    // op = 0
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  let Inst{24-22} = op2;
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  let Inst{21-0}  = imm22;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Specific F2 classes: SparcV8 manual, page 44
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class F2_1<bits<3> op2Val, dag ops, string asmstr> : F2 {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bits<5>  rd;
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  dag OperandList = ops;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  let AsmString   = asmstr;
295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  let op2         = op2Val;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  let Inst{29-25} = rd;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class F2_2<bits<4> condVal, bits<3> op2Val, dag ops, string asmstr> : F2 {
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bits<4>   cond;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bit       annul = 0;     // currently unused
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dag OperandList = ops;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  let AsmString   = asmstr;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  let cond        = condVal;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  let op2         = op2Val;
445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  let Inst{29}    = annul;
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  let Inst{28-25} = cond;
475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci//===----------------------------------------------------------------------===//
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Format #3 instruction classes in the SparcV8
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)//===----------------------------------------------------------------------===//
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class F3 : InstV8 {
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bits<5> rd;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bits<6> op3;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bits<5> rs1;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  let op{1} = 1;   // Op = 2 or 3
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  let Inst{29-25} = rd;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  let Inst{24-19} = op3;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  let Inst{18-14} = rs1;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Specific F3 classes: SparcV8 manual, page 44
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class F3_1<bits<2> opVal, bits<6> op3val, dag ops,
665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)           string asmstr, list<dag> pattern> : F3 {
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bits<8> asi = 0; // asi not currently used in SparcV8
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bits<5> rs2;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  dag OperandList = ops;
715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  let AsmString   = asmstr;
725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  let Pattern = pattern;
735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  let op         = opVal;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  let op3        = op3val;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  let Inst{13}   = 0;     // i field = 0
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  let Inst{12-5} = asi;   // address space identifier
79  let Inst{4-0}  = rs2;
80}
81
82class F3_2<bits<2> opVal, bits<6> op3val, dag ops, 
83           string asmstr, list<dag> pattern> : F3 {
84  bits<13> simm13;
85
86  dag OperandList = ops;
87  let AsmString   = asmstr;
88  let Pattern = pattern;
89
90  let op         = opVal;
91  let op3        = op3val;
92
93  let Inst{13}   = 1;     // i field = 1
94  let Inst{12-0} = simm13;
95}
96
97// floating-point
98class F3_3<bits<2> opVal, bits<6> op3val, bits<9> opfval, dag ops,
99           string asmstr> : F3 {
100  bits<5> rs2;
101
102  dag OperandList = ops;
103  let AsmString   = asmstr;
104
105  let op         = opVal;
106  let op3        = op3val;
107
108  let Inst{13-5} = opfval;   // fp opcode
109  let Inst{4-0}  = rs2;
110}
111