aboutsummaryrefslogtreecommitdiffstats
path: root/lib/Target/SparcV9/SparcV9_F4.td
blob: 39b5d9ef49466201cfc530883659ec030461bd53 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
//===- Sparc.td - Target Description for Sparc V9 Target --------*- C++ -*-===//
// vim:ft=cpp
//===----------------------------------------------------------------------===//

//----------------------- F4 classes -----------------------------------------

// F4 - Common superclass of all F4 instructions.  All instructions have an op3
// field.
class F4 : InstV9 {
  bits<6> op3;
  set Inst{24-19} = op3;
}

// F4_rs1 - Common class of instructions that use an rs1 field
class F4_rs1 : F4 {
  bits<5> rs1;
  set Inst{18-14} = rs1;
}

// F4_rs1rs2 - Common class of instructions that have rs1 and rs2 fields
class F4_rs1rs2 : F4_rs1 {
  bits<5> rs2;
  set Inst{4-0} = rs2;
}

// F4_rs1rs2rd - Common class of instructions that have 3 register operands
class F4_rs1rs2rd : F4_rs1rs2 {
  bits<5> rd;
  set Inst{29-25} = rd;
}

// F4_rs1rs2rd - Common class of instructions that have 2 reg and 1 imm operand
class F4_rs1simm11rd : F4_rs1 {
  bits<11> simm11;
  bits<5>  rd;

  set Inst{10-0}  = simm11;
  set Inst{29-25} = rd;
}

// F4_cc - Common class of instructions that have a cond field
class F4_cond : F4 {
  bits<4> cond;
  set Inst{17-14} = cond;
}

// F4_cc - Common class of instructions that have cc register as first operand
class F4_condcc : F4_cond {
  bits<3> cc;
  set Inst{18} = cc{2};
  set Inst{12} = cc{1};
  set Inst{11} = cc{0};
}

// Actual F4 instruction classes
//
class F4_1<bits<2> opVal, bits<6> op3Val, string name> : F4_rs1rs2rd {
  bits<2> cc;

  set op = opVal;
  set op3 = op3Val;
  set Name = name;
  set Inst{13} = 0; // i bit
  set Inst{12-11} = cc;
  set Inst{10-5} = 0; // don't care
}

class F4_2<bits<2> opVal, bits<6> op3Val, string name> : F4_rs1simm11rd {
  bits<2> cc;

  set op = opVal;
  set op3 = op3Val;
  set Name = name;
  set Inst{13} = 1; // i bit
  set Inst{12-11} = cc;
}

class F4_3<bits<2> opVal, bits<6> op3Val, bits<4> condVal,
           string name> : F4_condcc {
  bits<5> rs2;
  bits<5> rd;

  set op = opVal;
  set op3 = op3Val;
  set cond = condVal;
  set Name = name;
  set Inst{29-25} = rd;
  set Inst{13} = 0; // i bit
  set Inst{10-5} = 0; // don't care
  set Inst{4-0} = rs2;
}

class F4_4<bits<2> opVal, bits<6> op3Val, bits<4> condVal,
           string name> : F4_condcc {
  bits<11> sim11;
  bits<5>  rd;

  set op   = opVal;
  set op3  = op3Val;
  set cond = condVal;
  set Name = name;
  set Inst{29-25} = rd;
  set Inst{13} = 1; // i bit
  set Inst{10-0} = sim11;
}  
  
// FIXME: class F4_5

class F4_6<bits<2> opVal, bits<6> op3Val, bits<3> rcondVal,
           bits<5> opf_lowVal, string name> : F4_rs1rs2rd {
  set op  = opVal;
  set op3 = op3Val;
  set Name = name;
  set Inst{13} = 0;
  set Inst{12-10} = rcondVal;
  set Inst{9-5} = opf_lowVal;
}

class F4_7<bits<2> opVal, bits<6> op3Val, bits<4> condVal,
           bits<6> opf_lowVal, string name> : F4_cond {
  bits<3> cc;
  bits<5> rs2;
  bits<5> rd;

  set op   = opVal;
  set op3  = op3Val;
  set cond = condVal;
  set Name = name;
  set Inst{29-25} = rd;
  set Inst{18}    = 0;
  set Inst{13-11} = cc;
  set Inst{10-5}  = opf_lowVal;
  set Inst{4-0}   = rs2;
}

// FIXME: F4 classes 8-9