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 package ppc64
31
32 import (
33 "github.com/twitchyliquid64/golang-asm/obj"
34 "github.com/twitchyliquid64/golang-asm/objabi"
35 "encoding/binary"
36 "fmt"
37 "log"
38 "math"
39 "sort"
40 )
41
42
43
44
45 type ctxt9 struct {
46 ctxt *obj.Link
47 newprog obj.ProgAlloc
48 cursym *obj.LSym
49 autosize int32
50 instoffset int64
51 pc int64
52 }
53
54
55
56 const (
57 funcAlign = 16
58 funcAlignMask = funcAlign - 1
59 )
60
61 const (
62 r0iszero = 1
63 )
64
65 type Optab struct {
66 as obj.As
67 a1 uint8
68 a2 uint8
69 a3 uint8
70 a4 uint8
71 type_ int8
72 size int8
73 param int16
74 }
75
76
77
78
79
80
81
82
83
84 var optab = []Optab{
85 {obj.ATEXT, C_LEXT, C_NONE, C_NONE, C_TEXTSIZE, 0, 0, 0},
86 {obj.ATEXT, C_LEXT, C_NONE, C_LCON, C_TEXTSIZE, 0, 0, 0},
87 {obj.ATEXT, C_ADDR, C_NONE, C_NONE, C_TEXTSIZE, 0, 0, 0},
88 {obj.ATEXT, C_ADDR, C_NONE, C_LCON, C_TEXTSIZE, 0, 0, 0},
89
90 {AMOVD, C_REG, C_NONE, C_NONE, C_REG, 1, 4, 0},
91 {AMOVB, C_REG, C_NONE, C_NONE, C_REG, 12, 4, 0},
92 {AMOVBZ, C_REG, C_NONE, C_NONE, C_REG, 13, 4, 0},
93 {AMOVW, C_REG, C_NONE, C_NONE, C_REG, 12, 4, 0},
94 {AMOVWZ, C_REG, C_NONE, C_NONE, C_REG, 13, 4, 0},
95 {AADD, C_REG, C_REG, C_NONE, C_REG, 2, 4, 0},
96 {AADD, C_REG, C_NONE, C_NONE, C_REG, 2, 4, 0},
97 {AADD, C_SCON, C_REG, C_NONE, C_REG, 4, 4, 0},
98 {AADD, C_SCON, C_NONE, C_NONE, C_REG, 4, 4, 0},
99 {AADD, C_ADDCON, C_REG, C_NONE, C_REG, 4, 4, 0},
100 {AADD, C_ADDCON, C_NONE, C_NONE, C_REG, 4, 4, 0},
101 {AADD, C_UCON, C_REG, C_NONE, C_REG, 20, 4, 0},
102 {AADD, C_UCON, C_NONE, C_NONE, C_REG, 20, 4, 0},
103 {AADD, C_ANDCON, C_REG, C_NONE, C_REG, 22, 8, 0},
104 {AADD, C_ANDCON, C_NONE, C_NONE, C_REG, 22, 8, 0},
105 {AADD, C_LCON, C_REG, C_NONE, C_REG, 22, 12, 0},
106 {AADD, C_LCON, C_NONE, C_NONE, C_REG, 22, 12, 0},
107 {AADDIS, C_ADDCON, C_REG, C_NONE, C_REG, 20, 4, 0},
108 {AADDIS, C_ADDCON, C_NONE, C_NONE, C_REG, 20, 4, 0},
109 {AADDC, C_REG, C_REG, C_NONE, C_REG, 2, 4, 0},
110 {AADDC, C_REG, C_NONE, C_NONE, C_REG, 2, 4, 0},
111 {AADDC, C_ADDCON, C_REG, C_NONE, C_REG, 4, 4, 0},
112 {AADDC, C_ADDCON, C_NONE, C_NONE, C_REG, 4, 4, 0},
113 {AADDC, C_LCON, C_REG, C_NONE, C_REG, 22, 12, 0},
114 {AADDC, C_LCON, C_NONE, C_NONE, C_REG, 22, 12, 0},
115 {AAND, C_REG, C_REG, C_NONE, C_REG, 6, 4, 0},
116 {AAND, C_REG, C_NONE, C_NONE, C_REG, 6, 4, 0},
117 {AANDCC, C_REG, C_REG, C_NONE, C_REG, 6, 4, 0},
118 {AANDCC, C_REG, C_NONE, C_NONE, C_REG, 6, 4, 0},
119 {AANDCC, C_ANDCON, C_NONE, C_NONE, C_REG, 58, 4, 0},
120 {AANDCC, C_ANDCON, C_REG, C_NONE, C_REG, 58, 4, 0},
121 {AANDCC, C_UCON, C_NONE, C_NONE, C_REG, 59, 4, 0},
122 {AANDCC, C_UCON, C_REG, C_NONE, C_REG, 59, 4, 0},
123 {AANDCC, C_ADDCON, C_NONE, C_NONE, C_REG, 23, 8, 0},
124 {AANDCC, C_ADDCON, C_REG, C_NONE, C_REG, 23, 8, 0},
125 {AANDCC, C_LCON, C_NONE, C_NONE, C_REG, 23, 12, 0},
126 {AANDCC, C_LCON, C_REG, C_NONE, C_REG, 23, 12, 0},
127 {AANDISCC, C_ANDCON, C_NONE, C_NONE, C_REG, 59, 4, 0},
128 {AANDISCC, C_ANDCON, C_REG, C_NONE, C_REG, 59, 4, 0},
129 {AMULLW, C_REG, C_REG, C_NONE, C_REG, 2, 4, 0},
130 {AMULLW, C_REG, C_NONE, C_NONE, C_REG, 2, 4, 0},
131 {AMULLW, C_ADDCON, C_REG, C_NONE, C_REG, 4, 4, 0},
132 {AMULLW, C_ADDCON, C_NONE, C_NONE, C_REG, 4, 4, 0},
133 {AMULLW, C_ANDCON, C_REG, C_NONE, C_REG, 4, 4, 0},
134 {AMULLW, C_ANDCON, C_NONE, C_NONE, C_REG, 4, 4, 0},
135 {AMULLW, C_LCON, C_REG, C_NONE, C_REG, 22, 12, 0},
136 {AMULLW, C_LCON, C_NONE, C_NONE, C_REG, 22, 12, 0},
137 {ASUBC, C_REG, C_REG, C_NONE, C_REG, 10, 4, 0},
138 {ASUBC, C_REG, C_NONE, C_NONE, C_REG, 10, 4, 0},
139 {ASUBC, C_REG, C_NONE, C_ADDCON, C_REG, 27, 4, 0},
140 {ASUBC, C_REG, C_NONE, C_LCON, C_REG, 28, 12, 0},
141 {AOR, C_REG, C_REG, C_NONE, C_REG, 6, 4, 0},
142 {AOR, C_REG, C_NONE, C_NONE, C_REG, 6, 4, 0},
143 {AOR, C_ANDCON, C_NONE, C_NONE, C_REG, 58, 4, 0},
144 {AOR, C_ANDCON, C_REG, C_NONE, C_REG, 58, 4, 0},
145 {AOR, C_UCON, C_NONE, C_NONE, C_REG, 59, 4, 0},
146 {AOR, C_UCON, C_REG, C_NONE, C_REG, 59, 4, 0},
147 {AOR, C_ADDCON, C_NONE, C_NONE, C_REG, 23, 8, 0},
148 {AOR, C_ADDCON, C_REG, C_NONE, C_REG, 23, 8, 0},
149 {AOR, C_LCON, C_NONE, C_NONE, C_REG, 23, 12, 0},
150 {AOR, C_LCON, C_REG, C_NONE, C_REG, 23, 12, 0},
151 {AORIS, C_ANDCON, C_NONE, C_NONE, C_REG, 59, 4, 0},
152 {AORIS, C_ANDCON, C_REG, C_NONE, C_REG, 59, 4, 0},
153 {ADIVW, C_REG, C_REG, C_NONE, C_REG, 2, 4, 0},
154 {ADIVW, C_REG, C_NONE, C_NONE, C_REG, 2, 4, 0},
155 {ASUB, C_REG, C_REG, C_NONE, C_REG, 10, 4, 0},
156 {ASUB, C_REG, C_NONE, C_NONE, C_REG, 10, 4, 0},
157 {ASLW, C_REG, C_NONE, C_NONE, C_REG, 6, 4, 0},
158 {ASLW, C_REG, C_REG, C_NONE, C_REG, 6, 4, 0},
159 {ASLD, C_REG, C_NONE, C_NONE, C_REG, 6, 4, 0},
160 {ASLD, C_REG, C_REG, C_NONE, C_REG, 6, 4, 0},
161 {ASLD, C_SCON, C_REG, C_NONE, C_REG, 25, 4, 0},
162 {ASLD, C_SCON, C_NONE, C_NONE, C_REG, 25, 4, 0},
163 {ASLW, C_SCON, C_REG, C_NONE, C_REG, 57, 4, 0},
164 {ASLW, C_SCON, C_NONE, C_NONE, C_REG, 57, 4, 0},
165 {ASRAW, C_REG, C_NONE, C_NONE, C_REG, 6, 4, 0},
166 {ASRAW, C_REG, C_REG, C_NONE, C_REG, 6, 4, 0},
167 {ASRAW, C_SCON, C_REG, C_NONE, C_REG, 56, 4, 0},
168 {ASRAW, C_SCON, C_NONE, C_NONE, C_REG, 56, 4, 0},
169 {ASRAD, C_REG, C_NONE, C_NONE, C_REG, 6, 4, 0},
170 {ASRAD, C_REG, C_REG, C_NONE, C_REG, 6, 4, 0},
171 {ASRAD, C_SCON, C_REG, C_NONE, C_REG, 56, 4, 0},
172 {ASRAD, C_SCON, C_NONE, C_NONE, C_REG, 56, 4, 0},
173 {ARLWMI, C_SCON, C_REG, C_LCON, C_REG, 62, 4, 0},
174 {ARLWMI, C_REG, C_REG, C_LCON, C_REG, 63, 4, 0},
175 {ARLDMI, C_SCON, C_REG, C_LCON, C_REG, 30, 4, 0},
176 {ARLDC, C_SCON, C_REG, C_LCON, C_REG, 29, 4, 0},
177 {ARLDCL, C_SCON, C_REG, C_LCON, C_REG, 29, 4, 0},
178 {ARLDCL, C_REG, C_REG, C_LCON, C_REG, 14, 4, 0},
179 {ARLDICL, C_REG, C_REG, C_LCON, C_REG, 14, 4, 0},
180 {ARLDICL, C_SCON, C_REG, C_LCON, C_REG, 14, 4, 0},
181 {ARLDCL, C_REG, C_NONE, C_LCON, C_REG, 14, 4, 0},
182 {AFADD, C_FREG, C_NONE, C_NONE, C_FREG, 2, 4, 0},
183 {AFADD, C_FREG, C_FREG, C_NONE, C_FREG, 2, 4, 0},
184 {AFABS, C_FREG, C_NONE, C_NONE, C_FREG, 33, 4, 0},
185 {AFABS, C_NONE, C_NONE, C_NONE, C_FREG, 33, 4, 0},
186 {AFMOVD, C_FREG, C_NONE, C_NONE, C_FREG, 33, 4, 0},
187 {AFMADD, C_FREG, C_FREG, C_FREG, C_FREG, 34, 4, 0},
188 {AFMUL, C_FREG, C_NONE, C_NONE, C_FREG, 32, 4, 0},
189 {AFMUL, C_FREG, C_FREG, C_NONE, C_FREG, 32, 4, 0},
190
191
192 {AMOVD, C_REG, C_REG, C_NONE, C_ZOREG, 7, 4, REGZERO},
193 {AMOVW, C_REG, C_REG, C_NONE, C_ZOREG, 7, 4, REGZERO},
194 {AMOVWZ, C_REG, C_REG, C_NONE, C_ZOREG, 7, 4, REGZERO},
195 {AMOVBZ, C_REG, C_REG, C_NONE, C_ZOREG, 7, 4, REGZERO},
196 {AMOVBZU, C_REG, C_REG, C_NONE, C_ZOREG, 7, 4, REGZERO},
197 {AMOVB, C_REG, C_REG, C_NONE, C_ZOREG, 7, 4, REGZERO},
198 {AMOVBU, C_REG, C_REG, C_NONE, C_ZOREG, 7, 4, REGZERO},
199 {AMOVD, C_REG, C_NONE, C_NONE, C_SEXT, 7, 4, REGSB},
200 {AMOVW, C_REG, C_NONE, C_NONE, C_SEXT, 7, 4, REGSB},
201 {AMOVWZ, C_REG, C_NONE, C_NONE, C_SEXT, 7, 4, REGSB},
202 {AMOVBZ, C_REG, C_NONE, C_NONE, C_SEXT, 7, 4, REGSB},
203 {AMOVB, C_REG, C_NONE, C_NONE, C_SEXT, 7, 4, REGSB},
204 {AMOVD, C_REG, C_NONE, C_NONE, C_SAUTO, 7, 4, REGSP},
205 {AMOVW, C_REG, C_NONE, C_NONE, C_SAUTO, 7, 4, REGSP},
206 {AMOVWZ, C_REG, C_NONE, C_NONE, C_SAUTO, 7, 4, REGSP},
207 {AMOVBZ, C_REG, C_NONE, C_NONE, C_SAUTO, 7, 4, REGSP},
208 {AMOVB, C_REG, C_NONE, C_NONE, C_SAUTO, 7, 4, REGSP},
209 {AMOVD, C_REG, C_NONE, C_NONE, C_SOREG, 7, 4, REGZERO},
210 {AMOVW, C_REG, C_NONE, C_NONE, C_SOREG, 7, 4, REGZERO},
211 {AMOVWZ, C_REG, C_NONE, C_NONE, C_SOREG, 7, 4, REGZERO},
212 {AMOVBZ, C_REG, C_NONE, C_NONE, C_SOREG, 7, 4, REGZERO},
213 {AMOVBZU, C_REG, C_NONE, C_NONE, C_SOREG, 7, 4, REGZERO},
214 {AMOVB, C_REG, C_NONE, C_NONE, C_SOREG, 7, 4, REGZERO},
215 {AMOVBU, C_REG, C_NONE, C_NONE, C_SOREG, 7, 4, REGZERO},
216
217
218 {AMOVD, C_ZOREG, C_REG, C_NONE, C_REG, 8, 4, REGZERO},
219 {AMOVW, C_ZOREG, C_REG, C_NONE, C_REG, 8, 4, REGZERO},
220 {AMOVWZ, C_ZOREG, C_REG, C_NONE, C_REG, 8, 4, REGZERO},
221 {AMOVBZ, C_ZOREG, C_REG, C_NONE, C_REG, 8, 4, REGZERO},
222 {AMOVBZU, C_ZOREG, C_REG, C_NONE, C_REG, 8, 4, REGZERO},
223 {AMOVB, C_ZOREG, C_REG, C_NONE, C_REG, 9, 8, REGZERO},
224 {AMOVBU, C_ZOREG, C_REG, C_NONE, C_REG, 9, 8, REGZERO},
225 {AMOVD, C_SEXT, C_NONE, C_NONE, C_REG, 8, 4, REGSB},
226 {AMOVW, C_SEXT, C_NONE, C_NONE, C_REG, 8, 4, REGSB},
227 {AMOVWZ, C_SEXT, C_NONE, C_NONE, C_REG, 8, 4, REGSB},
228 {AMOVBZ, C_SEXT, C_NONE, C_NONE, C_REG, 8, 4, REGSB},
229 {AMOVB, C_SEXT, C_NONE, C_NONE, C_REG, 9, 8, REGSB},
230 {AMOVD, C_SAUTO, C_NONE, C_NONE, C_REG, 8, 4, REGSP},
231 {AMOVW, C_SAUTO, C_NONE, C_NONE, C_REG, 8, 4, REGSP},
232 {AMOVWZ, C_SAUTO, C_NONE, C_NONE, C_REG, 8, 4, REGSP},
233 {AMOVBZ, C_SAUTO, C_NONE, C_NONE, C_REG, 8, 4, REGSP},
234 {AMOVB, C_SAUTO, C_NONE, C_NONE, C_REG, 9, 8, REGSP},
235 {AMOVD, C_SOREG, C_NONE, C_NONE, C_REG, 8, 4, REGZERO},
236 {AMOVW, C_SOREG, C_NONE, C_NONE, C_REG, 8, 4, REGZERO},
237 {AMOVWZ, C_SOREG, C_NONE, C_NONE, C_REG, 8, 4, REGZERO},
238 {AMOVBZ, C_SOREG, C_NONE, C_NONE, C_REG, 8, 4, REGZERO},
239 {AMOVBZU, C_SOREG, C_NONE, C_NONE, C_REG, 8, 4, REGZERO},
240 {AMOVB, C_SOREG, C_NONE, C_NONE, C_REG, 9, 8, REGZERO},
241 {AMOVBU, C_SOREG, C_NONE, C_NONE, C_REG, 9, 8, REGZERO},
242
243
244 {AMOVD, C_REG, C_NONE, C_NONE, C_LEXT, 35, 8, REGSB},
245 {AMOVW, C_REG, C_NONE, C_NONE, C_LEXT, 35, 8, REGSB},
246 {AMOVWZ, C_REG, C_NONE, C_NONE, C_LEXT, 35, 8, REGSB},
247 {AMOVBZ, C_REG, C_NONE, C_NONE, C_LEXT, 35, 8, REGSB},
248 {AMOVB, C_REG, C_NONE, C_NONE, C_LEXT, 35, 8, REGSB},
249 {AMOVD, C_REG, C_NONE, C_NONE, C_LAUTO, 35, 8, REGSP},
250 {AMOVW, C_REG, C_NONE, C_NONE, C_LAUTO, 35, 8, REGSP},
251 {AMOVWZ, C_REG, C_NONE, C_NONE, C_LAUTO, 35, 8, REGSP},
252 {AMOVBZ, C_REG, C_NONE, C_NONE, C_LAUTO, 35, 8, REGSP},
253 {AMOVB, C_REG, C_NONE, C_NONE, C_LAUTO, 35, 8, REGSP},
254 {AMOVD, C_REG, C_NONE, C_NONE, C_LOREG, 35, 8, REGZERO},
255 {AMOVW, C_REG, C_NONE, C_NONE, C_LOREG, 35, 8, REGZERO},
256 {AMOVWZ, C_REG, C_NONE, C_NONE, C_LOREG, 35, 8, REGZERO},
257 {AMOVBZ, C_REG, C_NONE, C_NONE, C_LOREG, 35, 8, REGZERO},
258 {AMOVB, C_REG, C_NONE, C_NONE, C_LOREG, 35, 8, REGZERO},
259 {AMOVD, C_REG, C_NONE, C_NONE, C_ADDR, 74, 8, 0},
260 {AMOVW, C_REG, C_NONE, C_NONE, C_ADDR, 74, 8, 0},
261 {AMOVWZ, C_REG, C_NONE, C_NONE, C_ADDR, 74, 8, 0},
262 {AMOVBZ, C_REG, C_NONE, C_NONE, C_ADDR, 74, 8, 0},
263 {AMOVB, C_REG, C_NONE, C_NONE, C_ADDR, 74, 8, 0},
264
265
266 {AMOVD, C_LEXT, C_NONE, C_NONE, C_REG, 36, 8, REGSB},
267 {AMOVW, C_LEXT, C_NONE, C_NONE, C_REG, 36, 8, REGSB},
268 {AMOVWZ, C_LEXT, C_NONE, C_NONE, C_REG, 36, 8, REGSB},
269 {AMOVBZ, C_LEXT, C_NONE, C_NONE, C_REG, 36, 8, REGSB},
270 {AMOVB, C_LEXT, C_NONE, C_NONE, C_REG, 37, 12, REGSB},
271 {AMOVD, C_LAUTO, C_NONE, C_NONE, C_REG, 36, 8, REGSP},
272 {AMOVW, C_LAUTO, C_NONE, C_NONE, C_REG, 36, 8, REGSP},
273 {AMOVWZ, C_LAUTO, C_NONE, C_NONE, C_REG, 36, 8, REGSP},
274 {AMOVBZ, C_LAUTO, C_NONE, C_NONE, C_REG, 36, 8, REGSP},
275 {AMOVB, C_LAUTO, C_NONE, C_NONE, C_REG, 37, 12, REGSP},
276 {AMOVD, C_LOREG, C_NONE, C_NONE, C_REG, 36, 8, REGZERO},
277 {AMOVW, C_LOREG, C_NONE, C_NONE, C_REG, 36, 8, REGZERO},
278 {AMOVWZ, C_LOREG, C_NONE, C_NONE, C_REG, 36, 8, REGZERO},
279 {AMOVBZ, C_LOREG, C_NONE, C_NONE, C_REG, 36, 8, REGZERO},
280 {AMOVB, C_LOREG, C_NONE, C_NONE, C_REG, 37, 12, REGZERO},
281 {AMOVD, C_ADDR, C_NONE, C_NONE, C_REG, 75, 8, 0},
282 {AMOVW, C_ADDR, C_NONE, C_NONE, C_REG, 75, 8, 0},
283 {AMOVWZ, C_ADDR, C_NONE, C_NONE, C_REG, 75, 8, 0},
284 {AMOVBZ, C_ADDR, C_NONE, C_NONE, C_REG, 75, 8, 0},
285 {AMOVB, C_ADDR, C_NONE, C_NONE, C_REG, 76, 12, 0},
286
287 {AMOVD, C_TLS_LE, C_NONE, C_NONE, C_REG, 79, 4, 0},
288 {AMOVD, C_TLS_IE, C_NONE, C_NONE, C_REG, 80, 8, 0},
289
290 {AMOVD, C_GOTADDR, C_NONE, C_NONE, C_REG, 81, 8, 0},
291 {AMOVD, C_TOCADDR, C_NONE, C_NONE, C_REG, 95, 8, 0},
292
293
294 {AMOVD, C_SECON, C_NONE, C_NONE, C_REG, 3, 4, REGSB},
295 {AMOVD, C_SACON, C_NONE, C_NONE, C_REG, 3, 4, REGSP},
296 {AMOVD, C_LECON, C_NONE, C_NONE, C_REG, 26, 8, REGSB},
297 {AMOVD, C_LACON, C_NONE, C_NONE, C_REG, 26, 8, REGSP},
298 {AMOVD, C_ADDCON, C_NONE, C_NONE, C_REG, 3, 4, REGZERO},
299 {AMOVD, C_ANDCON, C_NONE, C_NONE, C_REG, 3, 4, REGZERO},
300 {AMOVW, C_SECON, C_NONE, C_NONE, C_REG, 3, 4, REGSB},
301 {AMOVW, C_SACON, C_NONE, C_NONE, C_REG, 3, 4, REGSP},
302 {AMOVW, C_LECON, C_NONE, C_NONE, C_REG, 26, 8, REGSB},
303 {AMOVW, C_LACON, C_NONE, C_NONE, C_REG, 26, 8, REGSP},
304 {AMOVW, C_ADDCON, C_NONE, C_NONE, C_REG, 3, 4, REGZERO},
305 {AMOVW, C_ANDCON, C_NONE, C_NONE, C_REG, 3, 4, REGZERO},
306 {AMOVWZ, C_SECON, C_NONE, C_NONE, C_REG, 3, 4, REGSB},
307 {AMOVWZ, C_SACON, C_NONE, C_NONE, C_REG, 3, 4, REGSP},
308 {AMOVWZ, C_LECON, C_NONE, C_NONE, C_REG, 26, 8, REGSB},
309 {AMOVWZ, C_LACON, C_NONE, C_NONE, C_REG, 26, 8, REGSP},
310 {AMOVWZ, C_ADDCON, C_NONE, C_NONE, C_REG, 3, 4, REGZERO},
311 {AMOVWZ, C_ANDCON, C_NONE, C_NONE, C_REG, 3, 4, REGZERO},
312
313
314 {AMOVD, C_UCON, C_NONE, C_NONE, C_REG, 3, 4, REGZERO},
315 {AMOVD, C_LCON, C_NONE, C_NONE, C_REG, 19, 8, 0},
316 {AMOVW, C_UCON, C_NONE, C_NONE, C_REG, 3, 4, REGZERO},
317 {AMOVW, C_LCON, C_NONE, C_NONE, C_REG, 19, 8, 0},
318 {AMOVWZ, C_UCON, C_NONE, C_NONE, C_REG, 3, 4, REGZERO},
319 {AMOVWZ, C_LCON, C_NONE, C_NONE, C_REG, 19, 8, 0},
320 {AMOVHBR, C_ZOREG, C_REG, C_NONE, C_REG, 45, 4, 0},
321 {AMOVHBR, C_ZOREG, C_NONE, C_NONE, C_REG, 45, 4, 0},
322 {AMOVHBR, C_REG, C_REG, C_NONE, C_ZOREG, 44, 4, 0},
323 {AMOVHBR, C_REG, C_NONE, C_NONE, C_ZOREG, 44, 4, 0},
324 {ASYSCALL, C_NONE, C_NONE, C_NONE, C_NONE, 5, 4, 0},
325 {ASYSCALL, C_REG, C_NONE, C_NONE, C_NONE, 77, 12, 0},
326 {ASYSCALL, C_SCON, C_NONE, C_NONE, C_NONE, 77, 12, 0},
327 {ABEQ, C_NONE, C_NONE, C_NONE, C_SBRA, 16, 4, 0},
328 {ABEQ, C_CREG, C_NONE, C_NONE, C_SBRA, 16, 4, 0},
329 {ABR, C_NONE, C_NONE, C_NONE, C_LBRA, 11, 4, 0},
330 {ABR, C_NONE, C_NONE, C_NONE, C_LBRAPIC, 11, 8, 0},
331 {ABC, C_SCON, C_REG, C_NONE, C_SBRA, 16, 4, 0},
332 {ABC, C_SCON, C_REG, C_NONE, C_LBRA, 17, 4, 0},
333 {ABR, C_NONE, C_NONE, C_NONE, C_LR, 18, 4, 0},
334 {ABR, C_NONE, C_NONE, C_NONE, C_CTR, 18, 4, 0},
335 {ABR, C_REG, C_NONE, C_NONE, C_CTR, 18, 4, 0},
336 {ABR, C_NONE, C_NONE, C_NONE, C_ZOREG, 15, 8, 0},
337 {ABC, C_NONE, C_REG, C_NONE, C_LR, 18, 4, 0},
338 {ABC, C_NONE, C_REG, C_NONE, C_CTR, 18, 4, 0},
339 {ABC, C_SCON, C_REG, C_NONE, C_LR, 18, 4, 0},
340 {ABC, C_SCON, C_REG, C_NONE, C_CTR, 18, 4, 0},
341 {ABC, C_NONE, C_NONE, C_NONE, C_ZOREG, 15, 8, 0},
342 {AFMOVD, C_SEXT, C_NONE, C_NONE, C_FREG, 8, 4, REGSB},
343 {AFMOVD, C_SAUTO, C_NONE, C_NONE, C_FREG, 8, 4, REGSP},
344 {AFMOVD, C_SOREG, C_NONE, C_NONE, C_FREG, 8, 4, REGZERO},
345 {AFMOVD, C_LEXT, C_NONE, C_NONE, C_FREG, 36, 8, REGSB},
346 {AFMOVD, C_LAUTO, C_NONE, C_NONE, C_FREG, 36, 8, REGSP},
347 {AFMOVD, C_LOREG, C_NONE, C_NONE, C_FREG, 36, 8, REGZERO},
348 {AFMOVD, C_ZCON, C_NONE, C_NONE, C_FREG, 24, 4, 0},
349 {AFMOVD, C_ADDCON, C_NONE, C_NONE, C_FREG, 24, 8, 0},
350 {AFMOVD, C_ADDR, C_NONE, C_NONE, C_FREG, 75, 8, 0},
351 {AFMOVD, C_FREG, C_NONE, C_NONE, C_SEXT, 7, 4, REGSB},
352 {AFMOVD, C_FREG, C_NONE, C_NONE, C_SAUTO, 7, 4, REGSP},
353 {AFMOVD, C_FREG, C_NONE, C_NONE, C_SOREG, 7, 4, REGZERO},
354 {AFMOVD, C_FREG, C_NONE, C_NONE, C_LEXT, 35, 8, REGSB},
355 {AFMOVD, C_FREG, C_NONE, C_NONE, C_LAUTO, 35, 8, REGSP},
356 {AFMOVD, C_FREG, C_NONE, C_NONE, C_LOREG, 35, 8, REGZERO},
357 {AFMOVD, C_FREG, C_NONE, C_NONE, C_ADDR, 74, 8, 0},
358 {AFMOVSX, C_ZOREG, C_REG, C_NONE, C_FREG, 45, 4, 0},
359 {AFMOVSX, C_ZOREG, C_NONE, C_NONE, C_FREG, 45, 4, 0},
360 {AFMOVSX, C_FREG, C_REG, C_NONE, C_ZOREG, 44, 4, 0},
361 {AFMOVSX, C_FREG, C_NONE, C_NONE, C_ZOREG, 44, 4, 0},
362 {AFMOVSZ, C_ZOREG, C_REG, C_NONE, C_FREG, 45, 4, 0},
363 {AFMOVSZ, C_ZOREG, C_NONE, C_NONE, C_FREG, 45, 4, 0},
364 {ASYNC, C_NONE, C_NONE, C_NONE, C_NONE, 46, 4, 0},
365 {AWORD, C_LCON, C_NONE, C_NONE, C_NONE, 40, 4, 0},
366 {ADWORD, C_LCON, C_NONE, C_NONE, C_NONE, 31, 8, 0},
367 {ADWORD, C_DCON, C_NONE, C_NONE, C_NONE, 31, 8, 0},
368 {AADDME, C_REG, C_NONE, C_NONE, C_REG, 47, 4, 0},
369 {AEXTSB, C_REG, C_NONE, C_NONE, C_REG, 48, 4, 0},
370 {AEXTSB, C_NONE, C_NONE, C_NONE, C_REG, 48, 4, 0},
371 {AISEL, C_LCON, C_REG, C_REG, C_REG, 84, 4, 0},
372 {AISEL, C_ZCON, C_REG, C_REG, C_REG, 84, 4, 0},
373 {ANEG, C_REG, C_NONE, C_NONE, C_REG, 47, 4, 0},
374 {ANEG, C_NONE, C_NONE, C_NONE, C_REG, 47, 4, 0},
375 {AREM, C_REG, C_NONE, C_NONE, C_REG, 50, 12, 0},
376 {AREM, C_REG, C_REG, C_NONE, C_REG, 50, 12, 0},
377 {AREMU, C_REG, C_NONE, C_NONE, C_REG, 50, 16, 0},
378 {AREMU, C_REG, C_REG, C_NONE, C_REG, 50, 16, 0},
379 {AREMD, C_REG, C_NONE, C_NONE, C_REG, 51, 12, 0},
380 {AREMD, C_REG, C_REG, C_NONE, C_REG, 51, 12, 0},
381 {AMTFSB0, C_SCON, C_NONE, C_NONE, C_NONE, 52, 4, 0},
382 {AMOVFL, C_FPSCR, C_NONE, C_NONE, C_FREG, 53, 4, 0},
383 {AMOVFL, C_FREG, C_NONE, C_NONE, C_FPSCR, 64, 4, 0},
384 {AMOVFL, C_FREG, C_NONE, C_LCON, C_FPSCR, 64, 4, 0},
385 {AMOVFL, C_LCON, C_NONE, C_NONE, C_FPSCR, 65, 4, 0},
386 {AMOVD, C_MSR, C_NONE, C_NONE, C_REG, 54, 4, 0},
387 {AMOVD, C_REG, C_NONE, C_NONE, C_MSR, 54, 4, 0},
388 {AMOVWZ, C_REG, C_NONE, C_NONE, C_MSR, 54, 4, 0},
389
390
391 {APOPCNTD, C_REG, C_NONE, C_NONE, C_REG, 93, 4, 0},
392 {ACMPB, C_REG, C_REG, C_NONE, C_REG, 92, 4, 0},
393 {ACMPEQB, C_REG, C_REG, C_NONE, C_CREG, 92, 4, 0},
394 {ACMPEQB, C_REG, C_NONE, C_NONE, C_REG, 70, 4, 0},
395 {AFTDIV, C_FREG, C_FREG, C_NONE, C_SCON, 92, 4, 0},
396 {AFTSQRT, C_FREG, C_NONE, C_NONE, C_SCON, 93, 4, 0},
397 {ACOPY, C_REG, C_NONE, C_NONE, C_REG, 92, 4, 0},
398 {ADARN, C_SCON, C_NONE, C_NONE, C_REG, 92, 4, 0},
399 {ALDMX, C_SOREG, C_NONE, C_NONE, C_REG, 45, 4, 0},
400 {AMADDHD, C_REG, C_REG, C_REG, C_REG, 83, 4, 0},
401 {AADDEX, C_REG, C_REG, C_SCON, C_REG, 94, 4, 0},
402 {ACRAND, C_CREG, C_NONE, C_NONE, C_CREG, 2, 4, 0},
403
404
405
406
407 {ALV, C_SOREG, C_NONE, C_NONE, C_VREG, 45, 4, 0},
408
409
410 {ASTV, C_VREG, C_NONE, C_NONE, C_SOREG, 44, 4, 0},
411
412
413 {AVAND, C_VREG, C_VREG, C_NONE, C_VREG, 82, 4, 0},
414 {AVOR, C_VREG, C_VREG, C_NONE, C_VREG, 82, 4, 0},
415
416
417 {AVADDUM, C_VREG, C_VREG, C_NONE, C_VREG, 82, 4, 0},
418 {AVADDCU, C_VREG, C_VREG, C_NONE, C_VREG, 82, 4, 0},
419 {AVADDUS, C_VREG, C_VREG, C_NONE, C_VREG, 82, 4, 0},
420 {AVADDSS, C_VREG, C_VREG, C_NONE, C_VREG, 82, 4, 0},
421 {AVADDE, C_VREG, C_VREG, C_VREG, C_VREG, 83, 4, 0},
422
423
424 {AVSUBUM, C_VREG, C_VREG, C_NONE, C_VREG, 82, 4, 0},
425 {AVSUBCU, C_VREG, C_VREG, C_NONE, C_VREG, 82, 4, 0},
426 {AVSUBUS, C_VREG, C_VREG, C_NONE, C_VREG, 82, 4, 0},
427 {AVSUBSS, C_VREG, C_VREG, C_NONE, C_VREG, 82, 4, 0},
428 {AVSUBE, C_VREG, C_VREG, C_VREG, C_VREG, 83, 4, 0},
429
430
431 {AVMULESB, C_VREG, C_VREG, C_NONE, C_VREG, 82, 4, 9},
432 {AVPMSUM, C_VREG, C_VREG, C_NONE, C_VREG, 82, 4, 0},
433 {AVMSUMUDM, C_VREG, C_VREG, C_VREG, C_VREG, 83, 4, 0},
434
435
436 {AVR, C_VREG, C_VREG, C_NONE, C_VREG, 82, 4, 0},
437
438
439 {AVS, C_VREG, C_VREG, C_NONE, C_VREG, 82, 4, 0},
440 {AVSA, C_VREG, C_VREG, C_NONE, C_VREG, 82, 4, 0},
441 {AVSOI, C_ANDCON, C_VREG, C_VREG, C_VREG, 83, 4, 0},
442
443
444 {AVCLZ, C_VREG, C_NONE, C_NONE, C_VREG, 85, 4, 0},
445 {AVPOPCNT, C_VREG, C_NONE, C_NONE, C_VREG, 85, 4, 0},
446
447
448 {AVCMPEQ, C_VREG, C_VREG, C_NONE, C_VREG, 82, 4, 0},
449 {AVCMPGT, C_VREG, C_VREG, C_NONE, C_VREG, 82, 4, 0},
450 {AVCMPNEZB, C_VREG, C_VREG, C_NONE, C_VREG, 82, 4, 0},
451
452
453 {AVMRGOW, C_VREG, C_VREG, C_NONE, C_VREG, 82, 4, 0},
454
455
456 {AVPERM, C_VREG, C_VREG, C_VREG, C_VREG, 83, 4, 0},
457
458
459 {AVBPERMQ, C_VREG, C_VREG, C_NONE, C_VREG, 82, 4, 0},
460
461
462 {AVSEL, C_VREG, C_VREG, C_VREG, C_VREG, 83, 4, 0},
463
464
465 {AVSPLTB, C_SCON, C_VREG, C_NONE, C_VREG, 82, 4, 0},
466 {AVSPLTB, C_ADDCON, C_VREG, C_NONE, C_VREG, 82, 4, 0},
467 {AVSPLTISB, C_SCON, C_NONE, C_NONE, C_VREG, 82, 4, 0},
468 {AVSPLTISB, C_ADDCON, C_NONE, C_NONE, C_VREG, 82, 4, 0},
469
470
471 {AVCIPH, C_VREG, C_VREG, C_NONE, C_VREG, 82, 4, 0},
472 {AVNCIPH, C_VREG, C_VREG, C_NONE, C_VREG, 82, 4, 0},
473 {AVSBOX, C_VREG, C_NONE, C_NONE, C_VREG, 82, 4, 0},
474
475
476 {AVSHASIGMA, C_ANDCON, C_VREG, C_ANDCON, C_VREG, 82, 4, 0},
477
478
479 {ALXVD2X, C_SOREG, C_NONE, C_NONE, C_VSREG, 87, 4, 0},
480 {ALXV, C_SOREG, C_NONE, C_NONE, C_VSREG, 96, 4, 0},
481 {ALXVL, C_REG, C_REG, C_NONE, C_VSREG, 98, 4, 0},
482
483
484 {ASTXVD2X, C_VSREG, C_NONE, C_NONE, C_SOREG, 86, 4, 0},
485 {ASTXV, C_VSREG, C_NONE, C_NONE, C_SOREG, 97, 4, 0},
486 {ASTXVL, C_VSREG, C_REG, C_NONE, C_REG, 99, 4, 0},
487
488
489 {ALXSDX, C_SOREG, C_NONE, C_NONE, C_VSREG, 87, 4, 0},
490
491
492 {ASTXSDX, C_VSREG, C_NONE, C_NONE, C_SOREG, 86, 4, 0},
493
494
495 {ALXSIWAX, C_SOREG, C_NONE, C_NONE, C_VSREG, 87, 4, 0},
496
497
498 {ASTXSIWX, C_VSREG, C_NONE, C_NONE, C_SOREG, 86, 4, 0},
499
500
501 {AMFVSRD, C_VSREG, C_NONE, C_NONE, C_REG, 88, 4, 0},
502 {AMFVSRD, C_FREG, C_NONE, C_NONE, C_REG, 88, 4, 0},
503 {AMFVSRD, C_VREG, C_NONE, C_NONE, C_REG, 88, 4, 0},
504
505
506 {AMTVSRD, C_REG, C_NONE, C_NONE, C_VSREG, 88, 4, 0},
507 {AMTVSRD, C_REG, C_REG, C_NONE, C_VSREG, 88, 4, 0},
508 {AMTVSRD, C_REG, C_NONE, C_NONE, C_FREG, 88, 4, 0},
509 {AMTVSRD, C_REG, C_NONE, C_NONE, C_VREG, 88, 4, 0},
510
511
512 {AXXLAND, C_VSREG, C_VSREG, C_NONE, C_VSREG, 90, 4, 0},
513 {AXXLOR, C_VSREG, C_VSREG, C_NONE, C_VSREG, 90, 4, 0},
514
515
516 {AXXSEL, C_VSREG, C_VSREG, C_VSREG, C_VSREG, 91, 4, 0},
517
518
519 {AXXMRGHW, C_VSREG, C_VSREG, C_NONE, C_VSREG, 90, 4, 0},
520
521
522 {AXXSPLTW, C_VSREG, C_NONE, C_SCON, C_VSREG, 89, 4, 0},
523 {AXXSPLTIB, C_SCON, C_NONE, C_NONE, C_VSREG, 100, 4, 0},
524
525
526 {AXXPERM, C_VSREG, C_VSREG, C_NONE, C_VSREG, 90, 4, 0},
527
528
529 {AXXSLDWI, C_VSREG, C_VSREG, C_SCON, C_VSREG, 90, 4, 0},
530
531
532 {AXXBRQ, C_VSREG, C_NONE, C_NONE, C_VSREG, 101, 4, 0},
533
534
535 {AXSCVDPSP, C_VSREG, C_NONE, C_NONE, C_VSREG, 89, 4, 0},
536
537
538 {AXVCVDPSP, C_VSREG, C_NONE, C_NONE, C_VSREG, 89, 4, 0},
539
540
541 {AXSCVDPSXDS, C_VSREG, C_NONE, C_NONE, C_VSREG, 89, 4, 0},
542
543
544 {AXSCVSXDDP, C_VSREG, C_NONE, C_NONE, C_VSREG, 89, 4, 0},
545
546
547 {AXVCVDPSXDS, C_VSREG, C_NONE, C_NONE, C_VSREG, 89, 4, 0},
548
549
550 {AXVCVSXDDP, C_VSREG, C_NONE, C_NONE, C_VSREG, 89, 4, 0},
551
552
553 {AMOVD, C_REG, C_NONE, C_NONE, C_SPR, 66, 4, 0},
554 {AMOVD, C_REG, C_NONE, C_NONE, C_LR, 66, 4, 0},
555 {AMOVD, C_REG, C_NONE, C_NONE, C_CTR, 66, 4, 0},
556 {AMOVD, C_REG, C_NONE, C_NONE, C_XER, 66, 4, 0},
557 {AMOVD, C_SPR, C_NONE, C_NONE, C_REG, 66, 4, 0},
558 {AMOVD, C_LR, C_NONE, C_NONE, C_REG, 66, 4, 0},
559 {AMOVD, C_CTR, C_NONE, C_NONE, C_REG, 66, 4, 0},
560 {AMOVD, C_XER, C_NONE, C_NONE, C_REG, 66, 4, 0},
561
562
563 {AMOVW, C_REG, C_NONE, C_NONE, C_SPR, 66, 4, 0},
564 {AMOVW, C_REG, C_NONE, C_NONE, C_CTR, 66, 4, 0},
565 {AMOVW, C_REG, C_NONE, C_NONE, C_XER, 66, 4, 0},
566 {AMOVW, C_SPR, C_NONE, C_NONE, C_REG, 66, 4, 0},
567 {AMOVW, C_XER, C_NONE, C_NONE, C_REG, 66, 4, 0},
568 {AMOVWZ, C_REG, C_NONE, C_NONE, C_SPR, 66, 4, 0},
569 {AMOVWZ, C_REG, C_NONE, C_NONE, C_CTR, 66, 4, 0},
570 {AMOVWZ, C_REG, C_NONE, C_NONE, C_XER, 66, 4, 0},
571 {AMOVWZ, C_SPR, C_NONE, C_NONE, C_REG, 66, 4, 0},
572 {AMOVWZ, C_XER, C_NONE, C_NONE, C_REG, 66, 4, 0},
573 {AMOVFL, C_FPSCR, C_NONE, C_NONE, C_CREG, 73, 4, 0},
574 {AMOVFL, C_CREG, C_NONE, C_NONE, C_CREG, 67, 4, 0},
575 {AMOVW, C_CREG, C_NONE, C_NONE, C_REG, 68, 4, 0},
576 {AMOVWZ, C_CREG, C_NONE, C_NONE, C_REG, 68, 4, 0},
577 {AMOVFL, C_REG, C_NONE, C_NONE, C_LCON, 69, 4, 0},
578 {AMOVFL, C_REG, C_NONE, C_NONE, C_CREG, 69, 4, 0},
579 {AMOVW, C_REG, C_NONE, C_NONE, C_CREG, 69, 4, 0},
580 {AMOVWZ, C_REG, C_NONE, C_NONE, C_CREG, 69, 4, 0},
581 {ACMP, C_REG, C_NONE, C_NONE, C_REG, 70, 4, 0},
582 {ACMP, C_REG, C_REG, C_NONE, C_REG, 70, 4, 0},
583 {ACMP, C_REG, C_NONE, C_NONE, C_ADDCON, 71, 4, 0},
584 {ACMP, C_REG, C_REG, C_NONE, C_ADDCON, 71, 4, 0},
585 {ACMPU, C_REG, C_NONE, C_NONE, C_REG, 70, 4, 0},
586 {ACMPU, C_REG, C_REG, C_NONE, C_REG, 70, 4, 0},
587 {ACMPU, C_REG, C_NONE, C_NONE, C_ANDCON, 71, 4, 0},
588 {ACMPU, C_REG, C_REG, C_NONE, C_ANDCON, 71, 4, 0},
589 {AFCMPO, C_FREG, C_NONE, C_NONE, C_FREG, 70, 4, 0},
590 {AFCMPO, C_FREG, C_REG, C_NONE, C_FREG, 70, 4, 0},
591 {ATW, C_LCON, C_REG, C_NONE, C_REG, 60, 4, 0},
592 {ATW, C_LCON, C_REG, C_NONE, C_ADDCON, 61, 4, 0},
593 {ADCBF, C_ZOREG, C_NONE, C_NONE, C_NONE, 43, 4, 0},
594 {ADCBF, C_SOREG, C_NONE, C_NONE, C_NONE, 43, 4, 0},
595 {ADCBF, C_ZOREG, C_REG, C_NONE, C_SCON, 43, 4, 0},
596 {ADCBF, C_SOREG, C_NONE, C_NONE, C_SCON, 43, 4, 0},
597 {AECOWX, C_REG, C_REG, C_NONE, C_ZOREG, 44, 4, 0},
598 {AECIWX, C_ZOREG, C_REG, C_NONE, C_REG, 45, 4, 0},
599 {AECOWX, C_REG, C_NONE, C_NONE, C_ZOREG, 44, 4, 0},
600 {AECIWX, C_ZOREG, C_NONE, C_NONE, C_REG, 45, 4, 0},
601 {ALDAR, C_ZOREG, C_NONE, C_NONE, C_REG, 45, 4, 0},
602 {ALDAR, C_ZOREG, C_NONE, C_ANDCON, C_REG, 45, 4, 0},
603 {AEIEIO, C_NONE, C_NONE, C_NONE, C_NONE, 46, 4, 0},
604 {ATLBIE, C_REG, C_NONE, C_NONE, C_NONE, 49, 4, 0},
605 {ATLBIE, C_SCON, C_NONE, C_NONE, C_REG, 49, 4, 0},
606 {ASLBMFEE, C_REG, C_NONE, C_NONE, C_REG, 55, 4, 0},
607 {ASLBMTE, C_REG, C_NONE, C_NONE, C_REG, 55, 4, 0},
608 {ASTSW, C_REG, C_NONE, C_NONE, C_ZOREG, 44, 4, 0},
609 {ASTSW, C_REG, C_NONE, C_LCON, C_ZOREG, 41, 4, 0},
610 {ALSW, C_ZOREG, C_NONE, C_NONE, C_REG, 45, 4, 0},
611 {ALSW, C_ZOREG, C_NONE, C_LCON, C_REG, 42, 4, 0},
612 {obj.AUNDEF, C_NONE, C_NONE, C_NONE, C_NONE, 78, 4, 0},
613 {obj.APCDATA, C_LCON, C_NONE, C_NONE, C_LCON, 0, 0, 0},
614 {obj.AFUNCDATA, C_SCON, C_NONE, C_NONE, C_ADDR, 0, 0, 0},
615 {obj.ANOP, C_NONE, C_NONE, C_NONE, C_NONE, 0, 0, 0},
616 {obj.ANOP, C_LCON, C_NONE, C_NONE, C_NONE, 0, 0, 0},
617 {obj.ANOP, C_REG, C_NONE, C_NONE, C_NONE, 0, 0, 0},
618 {obj.ANOP, C_FREG, C_NONE, C_NONE, C_NONE, 0, 0, 0},
619 {obj.ADUFFZERO, C_NONE, C_NONE, C_NONE, C_LBRA, 11, 4, 0},
620 {obj.ADUFFCOPY, C_NONE, C_NONE, C_NONE, C_LBRA, 11, 4, 0},
621 {obj.APCALIGN, C_LCON, C_NONE, C_NONE, C_NONE, 0, 0, 0},
622
623 {obj.AXXX, C_NONE, C_NONE, C_NONE, C_NONE, 0, 4, 0},
624 }
625
626 var oprange [ALAST & obj.AMask][]Optab
627
628 var xcmp [C_NCLASS][C_NCLASS]bool
629
630
631 func addpad(pc, a int64, ctxt *obj.Link, cursym *obj.LSym) int {
632
633
634 switch a {
635 case 8:
636 if pc&7 != 0 {
637 return 4
638 }
639 case 16:
640
641
642 switch pc & 15 {
643 case 4, 12:
644 return 4
645 case 8:
646 return 8
647 }
648 case 32:
649
650
651 switch pc & 31 {
652 case 4, 20:
653 return 12
654 case 8, 24:
655 return 8
656 case 12, 28:
657 return 4
658 }
659
660
661
662
663
664 if ctxt.Headtype != objabi.Haix && cursym.Func.Align < 32 {
665 cursym.Func.Align = 32
666 }
667 default:
668 ctxt.Diag("Unexpected alignment: %d for PCALIGN directive\n", a)
669 }
670 return 0
671 }
672
673 func span9(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) {
674 p := cursym.Func.Text
675 if p == nil || p.Link == nil {
676 return
677 }
678
679 if oprange[AANDN&obj.AMask] == nil {
680 ctxt.Diag("ppc64 ops not initialized, call ppc64.buildop first")
681 }
682
683 c := ctxt9{ctxt: ctxt, newprog: newprog, cursym: cursym, autosize: int32(p.To.Offset)}
684
685 pc := int64(0)
686 p.Pc = pc
687
688 var m int
689 var o *Optab
690 for p = p.Link; p != nil; p = p.Link {
691 p.Pc = pc
692 o = c.oplook(p)
693 m = int(o.size)
694 if m == 0 {
695 if p.As == obj.APCALIGN {
696 a := c.vregoff(&p.From)
697 m = addpad(pc, a, ctxt, cursym)
698 } else {
699 if p.As != obj.ANOP && p.As != obj.AFUNCDATA && p.As != obj.APCDATA {
700 ctxt.Diag("zero-width instruction\n%v", p)
701 }
702 continue
703 }
704 }
705 pc += int64(m)
706 }
707
708 c.cursym.Size = pc
709
710
716 bflag := 1
717
718 var otxt int64
719 var q *obj.Prog
720 for bflag != 0 {
721 bflag = 0
722 pc = 0
723 for p = c.cursym.Func.Text.Link; p != nil; p = p.Link {
724 p.Pc = pc
725 o = c.oplook(p)
726
727
728 if (o.type_ == 16 || o.type_ == 17) && p.To.Target() != nil {
729 otxt = p.To.Target().Pc - pc
730 if otxt < -(1<<15)+10 || otxt >= (1<<15)-10 {
731 q = c.newprog()
732 q.Link = p.Link
733 p.Link = q
734 q.As = ABR
735 q.To.Type = obj.TYPE_BRANCH
736 q.To.SetTarget(p.To.Target())
737 p.To.SetTarget(q)
738 q = c.newprog()
739 q.Link = p.Link
740 p.Link = q
741 q.As = ABR
742 q.To.Type = obj.TYPE_BRANCH
743 q.To.SetTarget(q.Link.Link)
744
745
746
747 bflag = 1
748 }
749 }
750
751 m = int(o.size)
752 if m == 0 {
753 if p.As == obj.APCALIGN {
754 a := c.vregoff(&p.From)
755 m = addpad(pc, a, ctxt, cursym)
756 } else {
757 if p.As != obj.ANOP && p.As != obj.AFUNCDATA && p.As != obj.APCDATA {
758 ctxt.Diag("zero-width instruction\n%v", p)
759 }
760 continue
761 }
762 }
763
764 pc += int64(m)
765 }
766
767 c.cursym.Size = pc
768 }
769
770 if r := pc & funcAlignMask; r != 0 {
771 pc += funcAlign - r
772 }
773
774 c.cursym.Size = pc
775
776
779
780 c.cursym.Grow(c.cursym.Size)
781
782 bp := c.cursym.P
783 var i int32
784 var out [6]uint32
785 for p := c.cursym.Func.Text.Link; p != nil; p = p.Link {
786 c.pc = p.Pc
787 o = c.oplook(p)
788 if int(o.size) > 4*len(out) {
789 log.Fatalf("out array in span9 is too small, need at least %d for %v", o.size/4, p)
790 }
791
792 if o.type_ == 0 && p.As == obj.APCALIGN {
793 pad := LOP_RRR(OP_OR, REGZERO, REGZERO, REGZERO)
794 aln := c.vregoff(&p.From)
795 v := addpad(p.Pc, aln, c.ctxt, c.cursym)
796 if v > 0 {
797
798 for i = 0; i < int32(v/4); i++ {
799 c.ctxt.Arch.ByteOrder.PutUint32(bp, pad)
800 bp = bp[4:]
801 }
802 }
803 } else {
804 c.asmout(p, o, out[:])
805 for i = 0; i < int32(o.size/4); i++ {
806 c.ctxt.Arch.ByteOrder.PutUint32(bp, out[i])
807 bp = bp[4:]
808 }
809 }
810 }
811 }
812
813 func isint32(v int64) bool {
814 return int64(int32(v)) == v
815 }
816
817 func isuint32(v uint64) bool {
818 return uint64(uint32(v)) == v
819 }
820
821 func (c *ctxt9) aclass(a *obj.Addr) int {
822 switch a.Type {
823 case obj.TYPE_NONE:
824 return C_NONE
825
826 case obj.TYPE_REG:
827 if REG_R0 <= a.Reg && a.Reg <= REG_R31 {
828 return C_REG
829 }
830 if REG_F0 <= a.Reg && a.Reg <= REG_F31 {
831 return C_FREG
832 }
833 if REG_V0 <= a.Reg && a.Reg <= REG_V31 {
834 return C_VREG
835 }
836 if REG_VS0 <= a.Reg && a.Reg <= REG_VS63 {
837 return C_VSREG
838 }
839 if REG_CR0 <= a.Reg && a.Reg <= REG_CR7 || a.Reg == REG_CR {
840 return C_CREG
841 }
842 if REG_SPR0 <= a.Reg && a.Reg <= REG_SPR0+1023 {
843 switch a.Reg {
844 case REG_LR:
845 return C_LR
846
847 case REG_XER:
848 return C_XER
849
850 case REG_CTR:
851 return C_CTR
852 }
853
854 return C_SPR
855 }
856
857 if REG_DCR0 <= a.Reg && a.Reg <= REG_DCR0+1023 {
858 return C_SPR
859 }
860 if a.Reg == REG_FPSCR {
861 return C_FPSCR
862 }
863 if a.Reg == REG_MSR {
864 return C_MSR
865 }
866 return C_GOK
867
868 case obj.TYPE_MEM:
869 switch a.Name {
870 case obj.NAME_EXTERN,
871 obj.NAME_STATIC:
872 if a.Sym == nil {
873 break
874 }
875 c.instoffset = a.Offset
876 if a.Sym != nil {
877 if a.Sym.Type == objabi.STLSBSS {
878 if c.ctxt.Flag_shared {
879 return C_TLS_IE
880 } else {
881 return C_TLS_LE
882 }
883 }
884 return C_ADDR
885 }
886 return C_LEXT
887
888 case obj.NAME_GOTREF:
889 return C_GOTADDR
890
891 case obj.NAME_TOCREF:
892 return C_TOCADDR
893
894 case obj.NAME_AUTO:
895 c.instoffset = int64(c.autosize) + a.Offset
896 if c.instoffset >= -BIG && c.instoffset < BIG {
897 return C_SAUTO
898 }
899 return C_LAUTO
900
901 case obj.NAME_PARAM:
902 c.instoffset = int64(c.autosize) + a.Offset + c.ctxt.FixedFrameSize()
903 if c.instoffset >= -BIG && c.instoffset < BIG {
904 return C_SAUTO
905 }
906 return C_LAUTO
907
908 case obj.NAME_NONE:
909 c.instoffset = a.Offset
910 if c.instoffset == 0 {
911 return C_ZOREG
912 }
913 if c.instoffset >= -BIG && c.instoffset < BIG {
914 return C_SOREG
915 }
916 return C_LOREG
917 }
918
919 return C_GOK
920
921 case obj.TYPE_TEXTSIZE:
922 return C_TEXTSIZE
923
924 case obj.TYPE_FCONST:
925
926
927 f64 := a.Val.(float64)
928 if f64 == 0 {
929 if math.Signbit(f64) {
930 return C_ADDCON
931 }
932 return C_ZCON
933 }
934 log.Fatalf("Unexpected nonzero FCONST operand %v", a)
935
936 case obj.TYPE_CONST,
937 obj.TYPE_ADDR:
938 switch a.Name {
939 case obj.NAME_NONE:
940 c.instoffset = a.Offset
941 if a.Reg != 0 {
942 if -BIG <= c.instoffset && c.instoffset <= BIG {
943 return C_SACON
944 }
945 if isint32(c.instoffset) {
946 return C_LACON
947 }
948 return C_DACON
949 }
950
951 case obj.NAME_EXTERN,
952 obj.NAME_STATIC:
953 s := a.Sym
954 if s == nil {
955 return C_GOK
956 }
957
958 c.instoffset = a.Offset
959
960
961 return C_LCON
962
963 case obj.NAME_AUTO:
964 c.instoffset = int64(c.autosize) + a.Offset
965 if c.instoffset >= -BIG && c.instoffset < BIG {
966 return C_SACON
967 }
968 return C_LACON
969
970 case obj.NAME_PARAM:
971 c.instoffset = int64(c.autosize) + a.Offset + c.ctxt.FixedFrameSize()
972 if c.instoffset >= -BIG && c.instoffset < BIG {
973 return C_SACON
974 }
975 return C_LACON
976
977 default:
978 return C_GOK
979 }
980
981 if c.instoffset >= 0 {
982 if c.instoffset == 0 {
983 return C_ZCON
984 }
985 if c.instoffset <= 0x7fff {
986 return C_SCON
987 }
988 if c.instoffset <= 0xffff {
989 return C_ANDCON
990 }
991 if c.instoffset&0xffff == 0 && isuint32(uint64(c.instoffset)) {
992 return C_UCON
993 }
994 if isint32(c.instoffset) || isuint32(uint64(c.instoffset)) {
995 return C_LCON
996 }
997 return C_DCON
998 }
999
1000 if c.instoffset >= -0x8000 {
1001 return C_ADDCON
1002 }
1003 if c.instoffset&0xffff == 0 && isint32(c.instoffset) {
1004 return C_UCON
1005 }
1006 if isint32(c.instoffset) {
1007 return C_LCON
1008 }
1009 return C_DCON
1010
1011 case obj.TYPE_BRANCH:
1012 if a.Sym != nil && c.ctxt.Flag_dynlink {
1013 return C_LBRAPIC
1014 }
1015 return C_SBRA
1016 }
1017
1018 return C_GOK
1019 }
1020
1021 func prasm(p *obj.Prog) {
1022 fmt.Printf("%v\n", p)
1023 }
1024
1025 func (c *ctxt9) oplook(p *obj.Prog) *Optab {
1026 a1 := int(p.Optab)
1027 if a1 != 0 {
1028 return &optab[a1-1]
1029 }
1030 a1 = int(p.From.Class)
1031 if a1 == 0 {
1032 a1 = c.aclass(&p.From) + 1
1033 p.From.Class = int8(a1)
1034 }
1035
1036 a1--
1037 a3 := C_NONE + 1
1038 if p.GetFrom3() != nil {
1039 a3 = int(p.GetFrom3().Class)
1040 if a3 == 0 {
1041 a3 = c.aclass(p.GetFrom3()) + 1
1042 p.GetFrom3().Class = int8(a3)
1043 }
1044 }
1045
1046 a3--
1047 a4 := int(p.To.Class)
1048 if a4 == 0 {
1049 a4 = c.aclass(&p.To) + 1
1050 p.To.Class = int8(a4)
1051 }
1052
1053 a4--
1054 a2 := C_NONE
1055 if p.Reg != 0 {
1056 if REG_R0 <= p.Reg && p.Reg <= REG_R31 {
1057 a2 = C_REG
1058 } else if REG_V0 <= p.Reg && p.Reg <= REG_V31 {
1059 a2 = C_VREG
1060 } else if REG_VS0 <= p.Reg && p.Reg <= REG_VS63 {
1061 a2 = C_VSREG
1062 } else if REG_F0 <= p.Reg && p.Reg <= REG_F31 {
1063 a2 = C_FREG
1064 }
1065 }
1066
1067
1068 ops := oprange[p.As&obj.AMask]
1069 c1 := &xcmp[a1]
1070 c3 := &xcmp[a3]
1071 c4 := &xcmp[a4]
1072 for i := range ops {
1073 op := &ops[i]
1074 if int(op.a2) == a2 && c1[op.a1] && c3[op.a3] && c4[op.a4] {
1075 p.Optab = uint16(cap(optab) - cap(ops) + i + 1)
1076 return op
1077 }
1078 }
1079
1080 c.ctxt.Diag("illegal combination %v %v %v %v %v", p.As, DRconv(a1), DRconv(a2), DRconv(a3), DRconv(a4))
1081 prasm(p)
1082 if ops == nil {
1083 ops = optab
1084 }
1085 return &ops[0]
1086 }
1087
1088 func cmp(a int, b int) bool {
1089 if a == b {
1090 return true
1091 }
1092 switch a {
1093 case C_LCON:
1094 if b == C_ZCON || b == C_SCON || b == C_UCON || b == C_ADDCON || b == C_ANDCON {
1095 return true
1096 }
1097
1098 case C_ADDCON:
1099 if b == C_ZCON || b == C_SCON {
1100 return true
1101 }
1102
1103 case C_ANDCON:
1104 if b == C_ZCON || b == C_SCON {
1105 return true
1106 }
1107
1108 case C_SPR:
1109 if b == C_LR || b == C_XER || b == C_CTR {
1110 return true
1111 }
1112
1113 case C_UCON:
1114 if b == C_ZCON {
1115 return true
1116 }
1117
1118 case C_SCON:
1119 if b == C_ZCON {
1120 return true
1121 }
1122
1123 case C_LACON:
1124 if b == C_SACON {
1125 return true
1126 }
1127
1128 case C_LBRA:
1129 if b == C_SBRA {
1130 return true
1131 }
1132
1133 case C_LEXT:
1134 if b == C_SEXT {
1135 return true
1136 }
1137
1138 case C_LAUTO:
1139 if b == C_SAUTO {
1140 return true
1141 }
1142
1143 case C_REG:
1144 if b == C_ZCON {
1145 return r0iszero != 0
1146 }
1147
1148 case C_LOREG:
1149 if b == C_ZOREG || b == C_SOREG {
1150 return true
1151 }
1152
1153 case C_SOREG:
1154 if b == C_ZOREG {
1155 return true
1156 }
1157
1158 case C_ANY:
1159 return true
1160 }
1161
1162 return false
1163 }
1164
1165 type ocmp []Optab
1166
1167 func (x ocmp) Len() int {
1168 return len(x)
1169 }
1170
1171 func (x ocmp) Swap(i, j int) {
1172 x[i], x[j] = x[j], x[i]
1173 }
1174
1175
1176
1177
1178 func (x ocmp) Less(i, j int) bool {
1179 p1 := &x[i]
1180 p2 := &x[j]
1181 n := int(p1.as) - int(p2.as)
1182
1183 if n != 0 {
1184 return n < 0
1185 }
1186
1187
1188 n = int(p1.size) - int(p2.size)
1189 if n != 0 {
1190 return n < 0
1191 }
1192
1193
1194 n = int(p1.a1) - int(p2.a1)
1195 if n != 0 {
1196 return n < 0
1197 }
1198 n = int(p1.a2) - int(p2.a2)
1199 if n != 0 {
1200 return n < 0
1201 }
1202 n = int(p1.a3) - int(p2.a3)
1203 if n != 0 {
1204 return n < 0
1205 }
1206 n = int(p1.a4) - int(p2.a4)
1207 if n != 0 {
1208 return n < 0
1209 }
1210 return false
1211 }
1212
1213
1214
1215
1216 func opset(a, b0 obj.As) {
1217 oprange[a&obj.AMask] = oprange[b0]
1218 }
1219
1220
1221 func buildop(ctxt *obj.Link) {
1222 if oprange[AANDN&obj.AMask] != nil {
1223
1224
1225
1226 return
1227 }
1228
1229 var n int
1230
1231 for i := 0; i < C_NCLASS; i++ {
1232 for n = 0; n < C_NCLASS; n++ {
1233 if cmp(n, i) {
1234 xcmp[i][n] = true
1235 }
1236 }
1237 }
1238 for n = 0; optab[n].as != obj.AXXX; n++ {
1239 }
1240 sort.Sort(ocmp(optab[:n]))
1241 for i := 0; i < n; i++ {
1242 r := optab[i].as
1243 r0 := r & obj.AMask
1244 start := i
1245 for optab[i].as == r {
1246 i++
1247 }
1248 oprange[r0] = optab[start:i]
1249 i--
1250
1251 switch r {
1252 default:
1253 ctxt.Diag("unknown op in build: %v", r)
1254 log.Fatalf("instruction missing from switch in asm9.go:buildop: %v", r)
1255
1256 case ADCBF:
1257 opset(ADCBI, r0)
1258
1259 opset(ADCBST, r0)
1260 opset(ADCBT, r0)
1261 opset(ADCBTST, r0)
1262 opset(ADCBZ, r0)
1263 opset(AICBI, r0)
1264
1265 case AECOWX:
1266 opset(ASTWCCC, r0)
1267 opset(ASTHCCC, r0)
1268 opset(ASTBCCC, r0)
1269 opset(ASTDCCC, r0)
1270
1271 case AREM:
1272 opset(AREM, r0)
1273
1274 case AREMU:
1275 opset(AREMU, r0)
1276
1277 case AREMD:
1278 opset(AREMDU, r0)
1279
1280 case ADIVW:
1281 opset(AMULHW, r0)
1282
1283 opset(AMULHWCC, r0)
1284 opset(AMULHWU, r0)
1285 opset(AMULHWUCC, r0)
1286 opset(AMULLWCC, r0)
1287 opset(AMULLWVCC, r0)
1288 opset(AMULLWV, r0)
1289 opset(ADIVWCC, r0)
1290 opset(ADIVWV, r0)
1291 opset(ADIVWVCC, r0)
1292 opset(ADIVWU, r0)
1293 opset(ADIVWUCC, r0)
1294 opset(ADIVWUV, r0)
1295 opset(ADIVWUVCC, r0)
1296 opset(AMODUD, r0)
1297 opset(AMODUW, r0)
1298 opset(AMODSD, r0)
1299 opset(AMODSW, r0)
1300 opset(AADDCC, r0)
1301 opset(AADDCV, r0)
1302 opset(AADDCVCC, r0)
1303 opset(AADDV, r0)
1304 opset(AADDVCC, r0)
1305 opset(AADDE, r0)
1306 opset(AADDECC, r0)
1307 opset(AADDEV, r0)
1308 opset(AADDEVCC, r0)
1309 opset(AMULHD, r0)
1310 opset(AMULHDCC, r0)
1311 opset(AMULHDU, r0)
1312 opset(AMULHDUCC, r0)
1313 opset(AMULLD, r0)
1314 opset(AMULLDCC, r0)
1315 opset(AMULLDVCC, r0)
1316 opset(AMULLDV, r0)
1317 opset(ADIVD, r0)
1318 opset(ADIVDCC, r0)
1319 opset(ADIVDE, r0)
1320 opset(ADIVDEU, r0)
1321 opset(ADIVDECC, r0)
1322 opset(ADIVDEUCC, r0)
1323 opset(ADIVDVCC, r0)
1324 opset(ADIVDV, r0)
1325 opset(ADIVDU, r0)
1326 opset(ADIVDUV, r0)
1327 opset(ADIVDUVCC, r0)
1328 opset(ADIVDUCC, r0)
1329
1330 case ACRAND:
1331 opset(ACRANDN, r0)
1332 opset(ACREQV, r0)
1333 opset(ACRNAND, r0)
1334 opset(ACRNOR, r0)
1335 opset(ACROR, r0)
1336 opset(ACRORN, r0)
1337 opset(ACRXOR, r0)
1338
1339 case APOPCNTD:
1340 opset(APOPCNTW, r0)
1341 opset(APOPCNTB, r0)
1342 opset(ACNTTZW, r0)
1343 opset(ACNTTZWCC, r0)
1344 opset(ACNTTZD, r0)
1345 opset(ACNTTZDCC, r0)
1346
1347 case ACOPY:
1348 opset(APASTECC, r0)
1349
1350 case AMADDHD:
1351 opset(AMADDHDU, r0)
1352 opset(AMADDLD, r0)
1353
1354 case AMOVBZ:
1355 opset(AMOVH, r0)
1356 opset(AMOVHZ, r0)
1357
1358 case AMOVBZU:
1359 opset(AMOVHU, r0)
1360
1361 opset(AMOVHZU, r0)
1362 opset(AMOVWU, r0)
1363 opset(AMOVWZU, r0)
1364 opset(AMOVDU, r0)
1365 opset(AMOVMW, r0)
1366
1367 case ALV:
1368 opset(ALVEBX, r0)
1369 opset(ALVEHX, r0)
1370 opset(ALVEWX, r0)
1371 opset(ALVX, r0)
1372 opset(ALVXL, r0)
1373 opset(ALVSL, r0)
1374 opset(ALVSR, r0)
1375
1376 case ASTV:
1377 opset(ASTVEBX, r0)
1378 opset(ASTVEHX, r0)
1379 opset(ASTVEWX, r0)
1380 opset(ASTVX, r0)
1381 opset(ASTVXL, r0)
1382
1383 case AVAND:
1384 opset(AVAND, r0)
1385 opset(AVANDC, r0)
1386 opset(AVNAND, r0)
1387
1388 case AVMRGOW:
1389 opset(AVMRGEW, r0)
1390
1391 case AVOR:
1392 opset(AVOR, r0)
1393 opset(AVORC, r0)
1394 opset(AVXOR, r0)
1395 opset(AVNOR, r0)
1396 opset(AVEQV, r0)
1397
1398 case AVADDUM:
1399 opset(AVADDUBM, r0)
1400 opset(AVADDUHM, r0)
1401 opset(AVADDUWM, r0)
1402 opset(AVADDUDM, r0)
1403 opset(AVADDUQM, r0)
1404
1405 case AVADDCU:
1406 opset(AVADDCUQ, r0)
1407 opset(AVADDCUW, r0)
1408
1409 case AVADDUS:
1410 opset(AVADDUBS, r0)
1411 opset(AVADDUHS, r0)
1412 opset(AVADDUWS, r0)
1413
1414 case AVADDSS:
1415 opset(AVADDSBS, r0)
1416 opset(AVADDSHS, r0)
1417 opset(AVADDSWS, r0)
1418
1419 case AVADDE:
1420 opset(AVADDEUQM, r0)
1421 opset(AVADDECUQ, r0)
1422
1423 case AVSUBUM:
1424 opset(AVSUBUBM, r0)
1425 opset(AVSUBUHM, r0)
1426 opset(AVSUBUWM, r0)
1427 opset(AVSUBUDM, r0)
1428 opset(AVSUBUQM, r0)
1429
1430 case AVSUBCU:
1431 opset(AVSUBCUQ, r0)
1432 opset(AVSUBCUW, r0)
1433
1434 case AVSUBUS:
1435 opset(AVSUBUBS, r0)
1436 opset(AVSUBUHS, r0)
1437 opset(AVSUBUWS, r0)
1438
1439 case AVSUBSS:
1440 opset(AVSUBSBS, r0)
1441 opset(AVSUBSHS, r0)
1442 opset(AVSUBSWS, r0)
1443
1444 case AVSUBE:
1445 opset(AVSUBEUQM, r0)
1446 opset(AVSUBECUQ, r0)
1447
1448 case AVMULESB:
1449 opset(AVMULOSB, r0)
1450 opset(AVMULEUB, r0)
1451 opset(AVMULOUB, r0)
1452 opset(AVMULESH, r0)
1453 opset(AVMULOSH, r0)
1454 opset(AVMULEUH, r0)
1455 opset(AVMULOUH, r0)
1456 opset(AVMULESW, r0)
1457 opset(AVMULOSW, r0)
1458 opset(AVMULEUW, r0)
1459 opset(AVMULOUW, r0)
1460 opset(AVMULUWM, r0)
1461 case AVPMSUM:
1462 opset(AVPMSUMB, r0)
1463 opset(AVPMSUMH, r0)
1464 opset(AVPMSUMW, r0)
1465 opset(AVPMSUMD, r0)
1466
1467 case AVR:
1468 opset(AVRLB, r0)
1469 opset(AVRLH, r0)
1470 opset(AVRLW, r0)
1471 opset(AVRLD, r0)
1472
1473 case AVS:
1474 opset(AVSLB, r0)
1475 opset(AVSLH, r0)
1476 opset(AVSLW, r0)
1477 opset(AVSL, r0)
1478 opset(AVSLO, r0)
1479 opset(AVSRB, r0)
1480 opset(AVSRH, r0)
1481 opset(AVSRW, r0)
1482 opset(AVSR, r0)
1483 opset(AVSRO, r0)
1484 opset(AVSLD, r0)
1485 opset(AVSRD, r0)
1486
1487 case AVSA:
1488 opset(AVSRAB, r0)
1489 opset(AVSRAH, r0)
1490 opset(AVSRAW, r0)
1491 opset(AVSRAD, r0)
1492
1493 case AVSOI:
1494 opset(AVSLDOI, r0)
1495
1496 case AVCLZ:
1497 opset(AVCLZB, r0)
1498 opset(AVCLZH, r0)
1499 opset(AVCLZW, r0)
1500 opset(AVCLZD, r0)
1501
1502 case AVPOPCNT:
1503 opset(AVPOPCNTB, r0)
1504 opset(AVPOPCNTH, r0)
1505 opset(AVPOPCNTW, r0)
1506 opset(AVPOPCNTD, r0)
1507
1508 case AVCMPEQ:
1509 opset(AVCMPEQUB, r0)
1510 opset(AVCMPEQUBCC, r0)
1511 opset(AVCMPEQUH, r0)
1512 opset(AVCMPEQUHCC, r0)
1513 opset(AVCMPEQUW, r0)
1514 opset(AVCMPEQUWCC, r0)
1515 opset(AVCMPEQUD, r0)
1516 opset(AVCMPEQUDCC, r0)
1517
1518 case AVCMPGT:
1519 opset(AVCMPGTUB, r0)
1520 opset(AVCMPGTUBCC, r0)
1521 opset(AVCMPGTUH, r0)
1522 opset(AVCMPGTUHCC, r0)
1523 opset(AVCMPGTUW, r0)
1524 opset(AVCMPGTUWCC, r0)
1525 opset(AVCMPGTUD, r0)
1526 opset(AVCMPGTUDCC, r0)
1527 opset(AVCMPGTSB, r0)
1528 opset(AVCMPGTSBCC, r0)
1529 opset(AVCMPGTSH, r0)
1530 opset(AVCMPGTSHCC, r0)
1531 opset(AVCMPGTSW, r0)
1532 opset(AVCMPGTSWCC, r0)
1533 opset(AVCMPGTSD, r0)
1534 opset(AVCMPGTSDCC, r0)
1535
1536 case AVCMPNEZB:
1537 opset(AVCMPNEZBCC, r0)
1538 opset(AVCMPNEB, r0)
1539 opset(AVCMPNEBCC, r0)
1540 opset(AVCMPNEH, r0)
1541 opset(AVCMPNEHCC, r0)
1542 opset(AVCMPNEW, r0)
1543 opset(AVCMPNEWCC, r0)
1544
1545 case AVPERM:
1546 opset(AVPERMXOR, r0)
1547 opset(AVPERMR, r0)
1548
1549 case AVBPERMQ:
1550 opset(AVBPERMD, r0)
1551
1552 case AVSEL:
1553 opset(AVSEL, r0)
1554
1555 case AVSPLTB:
1556 opset(AVSPLTH, r0)
1557 opset(AVSPLTW, r0)
1558
1559 case AVSPLTISB:
1560 opset(AVSPLTISH, r0)
1561 opset(AVSPLTISW, r0)
1562
1563 case AVCIPH:
1564 opset(AVCIPHER, r0)
1565 opset(AVCIPHERLAST, r0)
1566
1567 case AVNCIPH:
1568 opset(AVNCIPHER, r0)
1569 opset(AVNCIPHERLAST, r0)
1570
1571 case AVSBOX:
1572 opset(AVSBOX, r0)
1573
1574 case AVSHASIGMA:
1575 opset(AVSHASIGMAW, r0)
1576 opset(AVSHASIGMAD, r0)
1577
1578 case ALXVD2X:
1579 opset(ALXVDSX, r0)
1580 opset(ALXVW4X, r0)
1581 opset(ALXVH8X, r0)
1582 opset(ALXVB16X, r0)
1583
1584 case ALXV:
1585 opset(ALXV, r0)
1586
1587 case ALXVL:
1588 opset(ALXVLL, r0)
1589 opset(ALXVX, r0)
1590
1591 case ASTXVD2X:
1592 opset(ASTXVW4X, r0)
1593 opset(ASTXVH8X, r0)
1594 opset(ASTXVB16X, r0)
1595
1596 case ASTXV:
1597 opset(ASTXV, r0)
1598
1599 case ASTXVL:
1600 opset(ASTXVLL, r0)
1601 opset(ASTXVX, r0)
1602
1603 case ALXSDX:
1604 opset(ALXSDX, r0)
1605
1606 case ASTXSDX:
1607 opset(ASTXSDX, r0)
1608
1609 case ALXSIWAX:
1610 opset(ALXSIWZX, r0)
1611
1612 case ASTXSIWX:
1613 opset(ASTXSIWX, r0)
1614
1615 case AMFVSRD:
1616 opset(AMFFPRD, r0)
1617 opset(AMFVRD, r0)
1618 opset(AMFVSRWZ, r0)
1619 opset(AMFVSRLD, r0)
1620
1621 case AMTVSRD:
1622 opset(AMTFPRD, r0)
1623 opset(AMTVRD, r0)
1624 opset(AMTVSRWA, r0)
1625 opset(AMTVSRWZ, r0)
1626 opset(AMTVSRDD, r0)
1627 opset(AMTVSRWS, r0)
1628
1629 case AXXLAND:
1630 opset(AXXLANDC, r0)
1631 opset(AXXLEQV, r0)
1632 opset(AXXLNAND, r0)
1633
1634 case AXXLOR:
1635 opset(AXXLORC, r0)
1636 opset(AXXLNOR, r0)
1637 opset(AXXLORQ, r0)
1638 opset(AXXLXOR, r0)
1639
1640 case AXXSEL:
1641 opset(AXXSEL, r0)
1642
1643 case AXXMRGHW:
1644 opset(AXXMRGLW, r0)
1645
1646 case AXXSPLTW:
1647 opset(AXXSPLTW, r0)
1648
1649 case AXXSPLTIB:
1650 opset(AXXSPLTIB, r0)
1651
1652 case AXXPERM:
1653 opset(AXXPERM, r0)
1654
1655 case AXXSLDWI:
1656 opset(AXXPERMDI, r0)
1657 opset(AXXSLDWI, r0)
1658
1659 case AXXBRQ:
1660 opset(AXXBRD, r0)
1661 opset(AXXBRW, r0)
1662 opset(AXXBRH, r0)
1663
1664 case AXSCVDPSP:
1665 opset(AXSCVSPDP, r0)
1666 opset(AXSCVDPSPN, r0)
1667 opset(AXSCVSPDPN, r0)
1668
1669 case AXVCVDPSP:
1670 opset(AXVCVSPDP, r0)
1671
1672 case AXSCVDPSXDS:
1673 opset(AXSCVDPSXWS, r0)
1674 opset(AXSCVDPUXDS, r0)
1675 opset(AXSCVDPUXWS, r0)
1676
1677 case AXSCVSXDDP:
1678 opset(AXSCVUXDDP, r0)
1679 opset(AXSCVSXDSP, r0)
1680 opset(AXSCVUXDSP, r0)
1681
1682 case AXVCVDPSXDS:
1683 opset(AXVCVDPSXDS, r0)
1684 opset(AXVCVDPSXWS, r0)
1685 opset(AXVCVDPUXDS, r0)
1686 opset(AXVCVDPUXWS, r0)
1687 opset(AXVCVSPSXDS, r0)
1688 opset(AXVCVSPSXWS, r0)
1689 opset(AXVCVSPUXDS, r0)
1690 opset(AXVCVSPUXWS, r0)
1691
1692 case AXVCVSXDDP:
1693 opset(AXVCVSXWDP, r0)
1694 opset(AXVCVUXDDP, r0)
1695 opset(AXVCVUXWDP, r0)
1696 opset(AXVCVSXDSP, r0)
1697 opset(AXVCVSXWSP, r0)
1698 opset(AXVCVUXDSP, r0)
1699 opset(AXVCVUXWSP, r0)
1700
1701 case AAND:
1702 opset(AANDN, r0)
1703 opset(AANDNCC, r0)
1704 opset(AEQV, r0)
1705 opset(AEQVCC, r0)
1706 opset(ANAND, r0)
1707 opset(ANANDCC, r0)
1708 opset(ANOR, r0)
1709 opset(ANORCC, r0)
1710 opset(AORCC, r0)
1711 opset(AORN, r0)
1712 opset(AORNCC, r0)
1713 opset(AXORCC, r0)
1714
1715 case AADDME:
1716 opset(AADDMECC, r0)
1717
1718 opset(AADDMEV, r0)
1719 opset(AADDMEVCC, r0)
1720 opset(AADDZE, r0)
1721 opset(AADDZECC, r0)
1722 opset(AADDZEV, r0)
1723 opset(AADDZEVCC, r0)
1724 opset(ASUBME, r0)
1725 opset(ASUBMECC, r0)
1726 opset(ASUBMEV, r0)
1727 opset(ASUBMEVCC, r0)
1728 opset(ASUBZE, r0)
1729 opset(ASUBZECC, r0)
1730 opset(ASUBZEV, r0)
1731 opset(ASUBZEVCC, r0)
1732
1733 case AADDC:
1734 opset(AADDCCC, r0)
1735
1736 case ABEQ:
1737 opset(ABGE, r0)
1738 opset(ABGT, r0)
1739 opset(ABLE, r0)
1740 opset(ABLT, r0)
1741 opset(ABNE, r0)
1742 opset(ABVC, r0)
1743 opset(ABVS, r0)
1744
1745 case ABR:
1746 opset(ABL, r0)
1747
1748 case ABC:
1749 opset(ABCL, r0)
1750
1751 case AEXTSB:
1752 opset(AEXTSBCC, r0)
1753
1754 opset(AEXTSH, r0)
1755 opset(AEXTSHCC, r0)
1756 opset(ACNTLZW, r0)
1757 opset(ACNTLZWCC, r0)
1758 opset(ACNTLZD, r0)
1759 opset(AEXTSW, r0)
1760 opset(AEXTSWCC, r0)
1761 opset(ACNTLZDCC, r0)
1762
1763 case AFABS:
1764 opset(AFABSCC, r0)
1765
1766 opset(AFNABS, r0)
1767 opset(AFNABSCC, r0)
1768 opset(AFNEG, r0)
1769 opset(AFNEGCC, r0)
1770 opset(AFRSP, r0)
1771 opset(AFRSPCC, r0)
1772 opset(AFCTIW, r0)
1773 opset(AFCTIWCC, r0)
1774 opset(AFCTIWZ, r0)
1775 opset(AFCTIWZCC, r0)
1776 opset(AFCTID, r0)
1777 opset(AFCTIDCC, r0)
1778 opset(AFCTIDZ, r0)
1779 opset(AFCTIDZCC, r0)
1780 opset(AFCFID, r0)
1781 opset(AFCFIDCC, r0)
1782 opset(AFCFIDU, r0)
1783 opset(AFCFIDUCC, r0)
1784 opset(AFCFIDS, r0)
1785 opset(AFCFIDSCC, r0)
1786 opset(AFRES, r0)
1787 opset(AFRESCC, r0)
1788 opset(AFRIM, r0)
1789 opset(AFRIMCC, r0)
1790 opset(AFRIP, r0)
1791 opset(AFRIPCC, r0)
1792 opset(AFRIZ, r0)
1793 opset(AFRIZCC, r0)
1794 opset(AFRIN, r0)
1795 opset(AFRINCC, r0)
1796 opset(AFRSQRTE, r0)
1797 opset(AFRSQRTECC, r0)
1798 opset(AFSQRT, r0)
1799 opset(AFSQRTCC, r0)
1800 opset(AFSQRTS, r0)
1801 opset(AFSQRTSCC, r0)
1802
1803 case AFADD:
1804 opset(AFADDS, r0)
1805 opset(AFADDCC, r0)
1806 opset(AFADDSCC, r0)
1807 opset(AFCPSGN, r0)
1808 opset(AFCPSGNCC, r0)
1809 opset(AFDIV, r0)
1810 opset(AFDIVS, r0)
1811 opset(AFDIVCC, r0)
1812 opset(AFDIVSCC, r0)
1813 opset(AFSUB, r0)
1814 opset(AFSUBS, r0)
1815 opset(AFSUBCC, r0)
1816 opset(AFSUBSCC, r0)
1817
1818 case AFMADD:
1819 opset(AFMADDCC, r0)
1820 opset(AFMADDS, r0)
1821 opset(AFMADDSCC, r0)
1822 opset(AFMSUB, r0)
1823 opset(AFMSUBCC, r0)
1824 opset(AFMSUBS, r0)
1825 opset(AFMSUBSCC, r0)
1826 opset(AFNMADD, r0)
1827 opset(AFNMADDCC, r0)
1828 opset(AFNMADDS, r0)
1829 opset(AFNMADDSCC, r0)
1830 opset(AFNMSUB, r0)
1831 opset(AFNMSUBCC, r0)
1832 opset(AFNMSUBS, r0)
1833 opset(AFNMSUBSCC, r0)
1834 opset(AFSEL, r0)
1835 opset(AFSELCC, r0)
1836
1837 case AFMUL:
1838 opset(AFMULS, r0)
1839 opset(AFMULCC, r0)
1840 opset(AFMULSCC, r0)
1841
1842 case AFCMPO:
1843 opset(AFCMPU, r0)
1844
1845 case AISEL:
1846 opset(AISEL, r0)
1847
1848 case AMTFSB0:
1849 opset(AMTFSB0CC, r0)
1850 opset(AMTFSB1, r0)
1851 opset(AMTFSB1CC, r0)
1852
1853 case ANEG:
1854 opset(ANEGCC, r0)
1855
1856 opset(ANEGV, r0)
1857 opset(ANEGVCC, r0)
1858
1859 case AOR:
1860 opset(AXOR, r0)
1861
1862 case AORIS:
1863 opset(AXORIS, r0)
1864
1865 case ASLW:
1866 opset(ASLWCC, r0)
1867 opset(ASRW, r0)
1868 opset(ASRWCC, r0)
1869 opset(AROTLW, r0)
1870
1871 case ASLD:
1872 opset(ASLDCC, r0)
1873 opset(ASRD, r0)
1874 opset(ASRDCC, r0)
1875 opset(AROTL, r0)
1876
1877 case ASRAW:
1878 opset(ASRAWCC, r0)
1879
1880 case ASRAD:
1881 opset(ASRADCC, r0)
1882
1883 case ASUB:
1884 opset(ASUB, r0)
1885
1886 opset(ASUBCC, r0)
1887 opset(ASUBV, r0)
1888 opset(ASUBVCC, r0)
1889 opset(ASUBCCC, r0)
1890 opset(ASUBCV, r0)
1891 opset(ASUBCVCC, r0)
1892 opset(ASUBE, r0)
1893 opset(ASUBECC, r0)
1894 opset(ASUBEV, r0)
1895 opset(ASUBEVCC, r0)
1896
1897 case ASYNC:
1898 opset(AISYNC, r0)
1899 opset(ALWSYNC, r0)
1900 opset(APTESYNC, r0)
1901 opset(ATLBSYNC, r0)
1902
1903 case ARLWMI:
1904 opset(ARLWMICC, r0)
1905 opset(ARLWNM, r0)
1906 opset(ARLWNMCC, r0)
1907 opset(ACLRLSLWI, r0)
1908
1909 case ARLDMI:
1910 opset(ARLDMICC, r0)
1911 opset(ARLDIMI, r0)
1912 opset(ARLDIMICC, r0)
1913
1914 case ARLDC:
1915 opset(ARLDCCC, r0)
1916
1917 case ARLDCL:
1918 opset(ARLDCR, r0)
1919 opset(ARLDCLCC, r0)
1920 opset(ARLDCRCC, r0)
1921
1922 case ARLDICL:
1923 opset(ARLDICLCC, r0)
1924 opset(ARLDICR, r0)
1925 opset(ARLDICRCC, r0)
1926 opset(ARLDIC, r0)
1927 opset(ARLDICCC, r0)
1928 opset(ACLRLSLDI, r0)
1929
1930 case AFMOVD:
1931 opset(AFMOVDCC, r0)
1932 opset(AFMOVDU, r0)
1933 opset(AFMOVS, r0)
1934 opset(AFMOVSU, r0)
1935
1936 case ALDAR:
1937 opset(ALBAR, r0)
1938 opset(ALHAR, r0)
1939 opset(ALWAR, r0)
1940
1941 case ASYSCALL:
1942 opset(ARFI, r0)
1943
1944 opset(ARFCI, r0)
1945 opset(ARFID, r0)
1946 opset(AHRFID, r0)
1947
1948 case AMOVHBR:
1949 opset(AMOVWBR, r0)
1950 opset(AMOVDBR, r0)
1951
1952 case ASLBMFEE:
1953 opset(ASLBMFEV, r0)
1954
1955 case ATW:
1956 opset(ATD, r0)
1957
1958 case ATLBIE:
1959 opset(ASLBIE, r0)
1960 opset(ATLBIEL, r0)
1961
1962 case AEIEIO:
1963 opset(ASLBIA, r0)
1964
1965 case ACMP:
1966 opset(ACMPW, r0)
1967
1968 case ACMPU:
1969 opset(ACMPWU, r0)
1970
1971 case ACMPB:
1972 opset(ACMPB, r0)
1973
1974 case AFTDIV:
1975 opset(AFTDIV, r0)
1976
1977 case AFTSQRT:
1978 opset(AFTSQRT, r0)
1979
1980 case AADD,
1981 AADDIS,
1982 AANDCC,
1983 AANDISCC,
1984 AFMOVSX,
1985 AFMOVSZ,
1986 ALSW,
1987 AMOVW,
1988
1989 AMOVWZ,
1990 AMOVD,
1991 AMOVB,
1992 AMOVBU,
1993 AMOVFL,
1994 AMULLW,
1995
1996 ASUBC,
1997 ASTSW,
1998 ASLBMTE,
1999 AWORD,
2000 ADWORD,
2001 ADARN,
2002 ALDMX,
2003 AVMSUMUDM,
2004 AADDEX,
2005 ACMPEQB,
2006 AECIWX,
2007 obj.ANOP,
2008 obj.ATEXT,
2009 obj.AUNDEF,
2010 obj.AFUNCDATA,
2011 obj.APCALIGN,
2012 obj.APCDATA,
2013 obj.ADUFFZERO,
2014 obj.ADUFFCOPY:
2015 break
2016 }
2017 }
2018 }
2019
2020 func OPVXX1(o uint32, xo uint32, oe uint32) uint32 {
2021 return o<<26 | xo<<1 | oe<<11
2022 }
2023
2024 func OPVXX2(o uint32, xo uint32, oe uint32) uint32 {
2025 return o<<26 | xo<<2 | oe<<11
2026 }
2027
2028 func OPVXX2VA(o uint32, xo uint32, oe uint32) uint32 {
2029 return o<<26 | xo<<2 | oe<<16
2030 }
2031
2032 func OPVXX3(o uint32, xo uint32, oe uint32) uint32 {
2033 return o<<26 | xo<<3 | oe<<11
2034 }
2035
2036 func OPVXX4(o uint32, xo uint32, oe uint32) uint32 {
2037 return o<<26 | xo<<4 | oe<<11
2038 }
2039
2040 func OPDQ(o uint32, xo uint32, oe uint32) uint32 {
2041 return o<<26 | xo | oe<<4
2042 }
2043
2044 func OPVX(o uint32, xo uint32, oe uint32, rc uint32) uint32 {
2045 return o<<26 | xo | oe<<11 | rc&1
2046 }
2047
2048 func OPVC(o uint32, xo uint32, oe uint32, rc uint32) uint32 {
2049 return o<<26 | xo | oe<<11 | (rc&1)<<10
2050 }
2051
2052 func OPVCC(o uint32, xo uint32, oe uint32, rc uint32) uint32 {
2053 return o<<26 | xo<<1 | oe<<10 | rc&1
2054 }
2055
2056 func OPCC(o uint32, xo uint32, rc uint32) uint32 {
2057 return OPVCC(o, xo, 0, rc)
2058 }
2059
2060
2061 func AOP_RRR(op uint32, d uint32, a uint32, b uint32) uint32 {
2062 return op | (d&31)<<21 | (a&31)<<16 | (b&31)<<11
2063 }
2064
2065
2066 func AOP_RR(op uint32, d uint32, a uint32) uint32 {
2067 return op | (d&31)<<21 | (a&31)<<11
2068 }
2069
2070
2071 func AOP_RRRR(op uint32, d uint32, a uint32, b uint32, c uint32) uint32 {
2072 return op | (d&31)<<21 | (a&31)<<16 | (b&31)<<11 | (c&31)<<6
2073 }
2074
2075 func AOP_IRR(op uint32, d uint32, a uint32, simm uint32) uint32 {
2076 return op | (d&31)<<21 | (a&31)<<16 | simm&0xFFFF
2077 }
2078
2079
2080 func AOP_VIRR(op uint32, d uint32, a uint32, simm uint32) uint32 {
2081 return op | (d&31)<<21 | (simm&0xFFFF)<<16 | (a&31)<<11
2082 }
2083
2084
2085 func AOP_IIRR(op uint32, d uint32, a uint32, sbit uint32, simm uint32) uint32 {
2086 return op | (d&31)<<21 | (a&31)<<16 | (sbit&1)<<15 | (simm&0xF)<<11
2087 }
2088
2089
2090 func AOP_IRRR(op uint32, d uint32, a uint32, b uint32, simm uint32) uint32 {
2091 return op | (d&31)<<21 | (a&31)<<16 | (b&31)<<11 | (simm&0xF)<<6
2092 }
2093
2094
2095 func AOP_IR(op uint32, d uint32, simm uint32) uint32 {
2096 return op | (d&31)<<21 | (simm&31)<<16
2097 }
2098
2099
2100 func AOP_XX1(op uint32, d uint32, a uint32, b uint32) uint32 {
2101
2102
2103 r := d - REG_VS0
2104 return op | (r&31)<<21 | (a&31)<<16 | (b&31)<<11 | (r&32)>>5
2105 }
2106
2107
2108 func AOP_XX2(op uint32, d uint32, a uint32, b uint32) uint32 {
2109 xt := d - REG_VS0
2110 xb := b - REG_VS0
2111 return op | (xt&31)<<21 | (a&3)<<16 | (xb&31)<<11 | (xb&32)>>4 | (xt&32)>>5
2112 }
2113
2114
2115 func AOP_XX3(op uint32, d uint32, a uint32, b uint32) uint32 {
2116 xt := d - REG_VS0
2117 xa := a - REG_VS0
2118 xb := b - REG_VS0
2119 return op | (xt&31)<<21 | (xa&31)<<16 | (xb&31)<<11 | (xa&32)>>3 | (xb&32)>>4 | (xt&32)>>5
2120 }
2121
2122
2123 func AOP_XX3I(op uint32, d uint32, a uint32, b uint32, c uint32) uint32 {
2124 xt := d - REG_VS0
2125 xa := a - REG_VS0
2126 xb := b - REG_VS0
2127 return op | (xt&31)<<21 | (xa&31)<<16 | (xb&31)<<11 | (c&3)<<8 | (xa&32)>>3 | (xb&32)>>4 | (xt&32)>>5
2128 }
2129
2130
2131 func AOP_XX4(op uint32, d uint32, a uint32, b uint32, c uint32) uint32 {
2132 xt := d - REG_VS0
2133 xa := a - REG_VS0
2134 xb := b - REG_VS0
2135 xc := c - REG_VS0
2136 return op | (xt&31)<<21 | (xa&31)<<16 | (xb&31)<<11 | (xc&31)<<6 | (xc&32)>>2 | (xa&32)>>3 | (xb&32)>>4 | (xt&32)>>5
2137 }
2138
2139
2140 func AOP_DQ(op uint32, d uint32, a uint32, b uint32) uint32 {
2141
2142
2143 r := d - REG_VS0
2144
2145
2146
2147
2148
2149
2150 dq := b >> 4
2151 return op | (r&31)<<21 | (a&31)<<16 | (dq&4095)<<4 | (r&32)>>2
2152 }
2153
2154
2155 func AOP_Z23I(op uint32, d uint32, a uint32, b uint32, c uint32) uint32 {
2156 return op | (d&31)<<21 | (a&31)<<16 | (b&31)<<11 | (c&3)<<7
2157 }
2158
2159
2160 func AOP_RRRI(op uint32, d uint32, a uint32, b uint32, c uint32) uint32 {
2161 return op | (d&31)<<21 | (a&31)<<16 | (b&31)<<11 | (c & 1)
2162 }
2163
2164 func LOP_RRR(op uint32, a uint32, s uint32, b uint32) uint32 {
2165 return op | (s&31)<<21 | (a&31)<<16 | (b&31)<<11
2166 }
2167
2168 func LOP_IRR(op uint32, a uint32, s uint32, uimm uint32) uint32 {
2169 return op | (s&31)<<21 | (a&31)<<16 | uimm&0xFFFF
2170 }
2171
2172 func OP_BR(op uint32, li uint32, aa uint32) uint32 {
2173 return op | li&0x03FFFFFC | aa<<1
2174 }
2175
2176 func OP_BC(op uint32, bo uint32, bi uint32, bd uint32, aa uint32) uint32 {
2177 return op | (bo&0x1F)<<21 | (bi&0x1F)<<16 | bd&0xFFFC | aa<<1
2178 }
2179
2180 func OP_BCR(op uint32, bo uint32, bi uint32) uint32 {
2181 return op | (bo&0x1F)<<21 | (bi&0x1F)<<16
2182 }
2183
2184 func OP_RLW(op uint32, a uint32, s uint32, sh uint32, mb uint32, me uint32) uint32 {
2185 return op | (s&31)<<21 | (a&31)<<16 | (sh&31)<<11 | (mb&31)<<6 | (me&31)<<1
2186 }
2187
2188 func AOP_RLDIC(op uint32, a uint32, s uint32, sh uint32, m uint32) uint32 {
2189 return op | (s&31)<<21 | (a&31)<<16 | (sh&31)<<11 | ((sh&32)>>5)<<1 | (m&31)<<6 | ((m&32)>>5)<<5
2190 }
2191
2192 func AOP_ISEL(op uint32, t uint32, a uint32, b uint32, bc uint32) uint32 {
2193 return op | (t&31)<<21 | (a&31)<<16 | (b&31)<<11 | (bc&0x1F)<<6
2194 }
2195
2196 const (
2197
2198 OP_ADD = 31<<26 | 266<<1 | 0<<10 | 0
2199 OP_ADDI = 14<<26 | 0<<1 | 0<<10 | 0
2200 OP_ADDIS = 15<<26 | 0<<1 | 0<<10 | 0
2201 OP_ANDI = 28<<26 | 0<<1 | 0<<10 | 0
2202 OP_EXTSB = 31<<26 | 954<<1 | 0<<10 | 0
2203 OP_EXTSH = 31<<26 | 922<<1 | 0<<10 | 0
2204 OP_EXTSW = 31<<26 | 986<<1 | 0<<10 | 0
2205 OP_ISEL = 31<<26 | 15<<1 | 0<<10 | 0
2206 OP_MCRF = 19<<26 | 0<<1 | 0<<10 | 0
2207 OP_MCRFS = 63<<26 | 64<<1 | 0<<10 | 0
2208 OP_MCRXR = 31<<26 | 512<<1 | 0<<10 | 0
2209 OP_MFCR = 31<<26 | 19<<1 | 0<<10 | 0
2210 OP_MFFS = 63<<26 | 583<<1 | 0<<10 | 0
2211 OP_MFMSR = 31<<26 | 83<<1 | 0<<10 | 0
2212 OP_MFSPR = 31<<26 | 339<<1 | 0<<10 | 0
2213 OP_MFSR = 31<<26 | 595<<1 | 0<<10 | 0
2214 OP_MFSRIN = 31<<26 | 659<<1 | 0<<10 | 0
2215 OP_MTCRF = 31<<26 | 144<<1 | 0<<10 | 0
2216 OP_MTFSF = 63<<26 | 711<<1 | 0<<10 | 0
2217 OP_MTFSFI = 63<<26 | 134<<1 | 0<<10 | 0
2218 OP_MTMSR = 31<<26 | 146<<1 | 0<<10 | 0
2219 OP_MTMSRD = 31<<26 | 178<<1 | 0<<10 | 0
2220 OP_MTSPR = 31<<26 | 467<<1 | 0<<10 | 0
2221 OP_MTSR = 31<<26 | 210<<1 | 0<<10 | 0
2222 OP_MTSRIN = 31<<26 | 242<<1 | 0<<10 | 0
2223 OP_MULLW = 31<<26 | 235<<1 | 0<<10 | 0
2224 OP_MULLD = 31<<26 | 233<<1 | 0<<10 | 0
2225 OP_OR = 31<<26 | 444<<1 | 0<<10 | 0
2226 OP_ORI = 24<<26 | 0<<1 | 0<<10 | 0
2227 OP_ORIS = 25<<26 | 0<<1 | 0<<10 | 0
2228 OP_RLWINM = 21<<26 | 0<<1 | 0<<10 | 0
2229 OP_RLWNM = 23<<26 | 0<<1 | 0<<10 | 0
2230 OP_SUBF = 31<<26 | 40<<1 | 0<<10 | 0
2231 OP_RLDIC = 30<<26 | 4<<1 | 0<<10 | 0
2232 OP_RLDICR = 30<<26 | 2<<1 | 0<<10 | 0
2233 OP_RLDICL = 30<<26 | 0<<1 | 0<<10 | 0
2234 OP_RLDCL = 30<<26 | 8<<1 | 0<<10 | 0
2235 )
2236
2237 func oclass(a *obj.Addr) int {
2238 return int(a.Class) - 1
2239 }
2240
2241 const (
2242 D_FORM = iota
2243 DS_FORM
2244 )
2245
2246
2247
2248
2249
2250
2251
2252
2253 func (c *ctxt9) opform(insn uint32) int {
2254 switch insn {
2255 default:
2256 c.ctxt.Diag("bad insn in loadform: %x", insn)
2257 case OPVCC(58, 0, 0, 0),
2258 OPVCC(58, 0, 0, 1),
2259 OPVCC(58, 0, 0, 0) | 1<<1,
2260 OPVCC(62, 0, 0, 0),
2261 OPVCC(62, 0, 0, 1):
2262 return DS_FORM
2263 case OP_ADDI,
2264 OPVCC(32, 0, 0, 0),
2265 OPVCC(33, 0, 0, 0),
2266 OPVCC(34, 0, 0, 0),
2267 OPVCC(35, 0, 0, 0),
2268 OPVCC(40, 0, 0, 0),
2269 OPVCC(41, 0, 0, 0),
2270 OPVCC(42, 0, 0, 0),
2271 OPVCC(43, 0, 0, 0),
2272 OPVCC(46, 0, 0, 0),
2273 OPVCC(48, 0, 0, 0),
2274 OPVCC(49, 0, 0, 0),
2275 OPVCC(50, 0, 0, 0),
2276 OPVCC(51, 0, 0, 0),
2277 OPVCC(36, 0, 0, 0),
2278 OPVCC(37, 0, 0, 0),
2279 OPVCC(38, 0, 0, 0),
2280 OPVCC(39, 0, 0, 0),
2281 OPVCC(44, 0, 0, 0),
2282 OPVCC(45, 0, 0, 0),
2283 OPVCC(47, 0, 0, 0),
2284 OPVCC(52, 0, 0, 0),
2285 OPVCC(53, 0, 0, 0),
2286 OPVCC(54, 0, 0, 0),
2287 OPVCC(55, 0, 0, 0):
2288 return D_FORM
2289 }
2290 return 0
2291 }
2292
2293
2294
2295 func (c *ctxt9) symbolAccess(s *obj.LSym, d int64, reg int16, op uint32) (o1, o2 uint32) {
2296 if c.ctxt.Headtype == objabi.Haix {
2297
2298 c.ctxt.Diag("symbolAccess called for %s", s.Name)
2299 }
2300 var base uint32
2301 form := c.opform(op)
2302 if c.ctxt.Flag_shared {
2303 base = REG_R2
2304 } else {
2305 base = REG_R0
2306 }
2307 o1 = AOP_IRR(OP_ADDIS, REGTMP, base, 0)
2308 o2 = AOP_IRR(op, uint32(reg), REGTMP, 0)
2309 rel := obj.Addrel(c.cursym)
2310 rel.Off = int32(c.pc)
2311 rel.Siz = 8
2312 rel.Sym = s
2313 rel.Add = d
2314 if c.ctxt.Flag_shared {
2315 switch form {
2316 case D_FORM:
2317 rel.Type = objabi.R_ADDRPOWER_TOCREL
2318 case DS_FORM:
2319 rel.Type = objabi.R_ADDRPOWER_TOCREL_DS
2320 }
2321
2322 } else {
2323 switch form {
2324 case D_FORM:
2325 rel.Type = objabi.R_ADDRPOWER
2326 case DS_FORM:
2327 rel.Type = objabi.R_ADDRPOWER_DS
2328 }
2329 }
2330 return
2331 }
2332
2333
2336 func getmask(m []byte, v uint32) bool {
2337 m[1] = 0
2338 m[0] = m[1]
2339 if v != ^uint32(0) && v&(1<<31) != 0 && v&1 != 0 {
2340 if getmask(m, ^v) {
2341 i := int(m[0])
2342 m[0] = m[1] + 1
2343 m[1] = byte(i - 1)
2344 return true
2345 }
2346
2347 return false
2348 }
2349
2350 for i := 0; i < 32; i++ {
2351 if v&(1<<uint(31-i)) != 0 {
2352 m[0] = byte(i)
2353 for {
2354 m[1] = byte(i)
2355 i++
2356 if i >= 32 || v&(1<<uint(31-i)) == 0 {
2357 break
2358 }
2359 }
2360
2361 for ; i < 32; i++ {
2362 if v&(1<<uint(31-i)) != 0 {
2363 return false
2364 }
2365 }
2366 return true
2367 }
2368 }
2369
2370 return false
2371 }
2372
2373 func (c *ctxt9) maskgen(p *obj.Prog, m []byte, v uint32) {
2374 if !getmask(m, v) {
2375 c.ctxt.Diag("cannot generate mask #%x\n%v", v, p)
2376 }
2377 }
2378
2379
2382 func getmask64(m []byte, v uint64) bool {
2383 m[1] = 0
2384 m[0] = m[1]
2385 for i := 0; i < 64; i++ {
2386 if v&(uint64(1)<<uint(63-i)) != 0 {
2387 m[0] = byte(i)
2388 for {
2389 m[1] = byte(i)
2390 i++
2391 if i >= 64 || v&(uint64(1)<<uint(63-i)) == 0 {
2392 break
2393 }
2394 }
2395
2396 for ; i < 64; i++ {
2397 if v&(uint64(1)<<uint(63-i)) != 0 {
2398 return false
2399 }
2400 }
2401 return true
2402 }
2403 }
2404
2405 return false
2406 }
2407
2408 func (c *ctxt9) maskgen64(p *obj.Prog, m []byte, v uint64) {
2409 if !getmask64(m, v) {
2410 c.ctxt.Diag("cannot generate mask #%x\n%v", v, p)
2411 }
2412 }
2413
2414 func loadu32(r int, d int64) uint32 {
2415 v := int32(d >> 16)
2416 if isuint32(uint64(d)) {
2417 return LOP_IRR(OP_ORIS, uint32(r), REGZERO, uint32(v))
2418 }
2419 return AOP_IRR(OP_ADDIS, uint32(r), REGZERO, uint32(v))
2420 }
2421
2422 func high16adjusted(d int32) uint16 {
2423 if d&0x8000 != 0 {
2424 return uint16((d >> 16) + 1)
2425 }
2426 return uint16(d >> 16)
2427 }
2428
2429 func (c *ctxt9) asmout(p *obj.Prog, o *Optab, out []uint32) {
2430 o1 := uint32(0)
2431 o2 := uint32(0)
2432 o3 := uint32(0)
2433 o4 := uint32(0)
2434 o5 := uint32(0)
2435
2436
2437 switch o.type_ {
2438 default:
2439 c.ctxt.Diag("unknown type %d", o.type_)
2440 prasm(p)
2441
2442 case 0:
2443 break
2444
2445 case 1:
2446 if p.To.Reg == REGZERO && p.From.Type == obj.TYPE_CONST {
2447 v := c.regoff(&p.From)
2448 if r0iszero != 0 && v != 0 {
2449
2450 c.ctxt.Diag("literal operation on R0\n%v", p)
2451 }
2452
2453 o1 = LOP_IRR(OP_ADDI, REGZERO, REGZERO, uint32(v))
2454 break
2455 }
2456
2457 o1 = LOP_RRR(OP_OR, uint32(p.To.Reg), uint32(p.From.Reg), uint32(p.From.Reg))
2458
2459 case 2:
2460 r := int(p.Reg)
2461
2462 if r == 0 {
2463 r = int(p.To.Reg)
2464 }
2465 o1 = AOP_RRR(c.oprrr(p.As), uint32(p.To.Reg), uint32(r), uint32(p.From.Reg))
2466
2467 case 3:
2468 d := c.vregoff(&p.From)
2469
2470 v := int32(d)
2471 r := int(p.From.Reg)
2472 if r == 0 {
2473 r = int(o.param)
2474 }
2475 if r0iszero != 0 && p.To.Reg == 0 && (r != 0 || v != 0) {
2476 c.ctxt.Diag("literal operation on R0\n%v", p)
2477 }
2478 a := OP_ADDI
2479 if o.a1 == C_UCON {
2480 if d&0xffff != 0 {
2481 log.Fatalf("invalid handling of %v", p)
2482 }
2483
2484
2485 v >>= 16
2486 if r == REGZERO && isuint32(uint64(d)) {
2487 o1 = LOP_IRR(OP_ORIS, uint32(p.To.Reg), REGZERO, uint32(v))
2488 break
2489 }
2490
2491 a = OP_ADDIS
2492 } else if int64(int16(d)) != d {
2493
2494 if o.a1 == C_ANDCON {
2495
2496 if r == 0 || r == REGZERO {
2497 o1 = LOP_IRR(uint32(OP_ORI), uint32(p.To.Reg), uint32(0), uint32(v))
2498 break
2499 }
2500
2501 } else if o.a1 != C_ADDCON {
2502 log.Fatalf("invalid handling of %v", p)
2503 }
2504 }
2505
2506 o1 = AOP_IRR(uint32(a), uint32(p.To.Reg), uint32(r), uint32(v))
2507
2508 case 4:
2509 v := c.regoff(&p.From)
2510
2511 r := int(p.Reg)
2512 if r == 0 {
2513 r = int(p.To.Reg)
2514 }
2515 if r0iszero != 0 && p.To.Reg == 0 {
2516 c.ctxt.Diag("literal operation on R0\n%v", p)
2517 }
2518 if int32(int16(v)) != v {
2519 log.Fatalf("mishandled instruction %v", p)
2520 }
2521 o1 = AOP_IRR(c.opirr(p.As), uint32(p.To.Reg), uint32(r), uint32(v))
2522
2523 case 5:
2524 o1 = c.oprrr(p.As)
2525
2526 case 6:
2527 r := int(p.Reg)
2528
2529 if r == 0 {
2530 r = int(p.To.Reg)
2531 }
2532
2533 switch p.As {
2534 case AROTL:
2535 o1 = AOP_RLDIC(OP_RLDCL, uint32(p.To.Reg), uint32(r), uint32(p.From.Reg), uint32(0))
2536 case AROTLW:
2537 o1 = OP_RLW(OP_RLWNM, uint32(p.To.Reg), uint32(r), uint32(p.From.Reg), 0, 31)
2538 default:
2539 o1 = LOP_RRR(c.oprrr(p.As), uint32(p.To.Reg), uint32(r), uint32(p.From.Reg))
2540 }
2541
2542 case 7:
2543 r := int(p.To.Reg)
2544
2545 if r == 0 {
2546 r = int(o.param)
2547 }
2548 v := c.regoff(&p.To)
2549 if p.To.Type == obj.TYPE_MEM && p.To.Index != 0 {
2550 if v != 0 {
2551 c.ctxt.Diag("illegal indexed instruction\n%v", p)
2552 }
2553 if c.ctxt.Flag_shared && r == REG_R13 {
2554 rel := obj.Addrel(c.cursym)
2555 rel.Off = int32(c.pc)
2556 rel.Siz = 4
2557
2558
2559
2560
2561
2562 rel.Sym = c.ctxt.Lookup("runtime.tls_g")
2563 rel.Type = objabi.R_POWER_TLS
2564 }
2565 o1 = AOP_RRR(c.opstorex(p.As), uint32(p.From.Reg), uint32(p.To.Index), uint32(r))
2566 } else {
2567 if int32(int16(v)) != v {
2568 log.Fatalf("mishandled instruction %v", p)
2569 }
2570
2571 inst := c.opstore(p.As)
2572 if c.opform(inst) == DS_FORM && v&0x3 != 0 {
2573 log.Fatalf("invalid offset for DS form load/store %v", p)
2574 }
2575 o1 = AOP_IRR(inst, uint32(p.From.Reg), uint32(r), uint32(v))
2576 }
2577
2578 case 8:
2579 r := int(p.From.Reg)
2580
2581 if r == 0 {
2582 r = int(o.param)
2583 }
2584 v := c.regoff(&p.From)
2585 if p.From.Type == obj.TYPE_MEM && p.From.Index != 0 {
2586 if v != 0 {
2587 c.ctxt.Diag("illegal indexed instruction\n%v", p)
2588 }
2589 if c.ctxt.Flag_shared && r == REG_R13 {
2590 rel := obj.Addrel(c.cursym)
2591 rel.Off = int32(c.pc)
2592 rel.Siz = 4
2593 rel.Sym = c.ctxt.Lookup("runtime.tls_g")
2594 rel.Type = objabi.R_POWER_TLS
2595 }
2596 o1 = AOP_RRR(c.oploadx(p.As), uint32(p.To.Reg), uint32(p.From.Index), uint32(r))
2597 } else {
2598 if int32(int16(v)) != v {
2599 log.Fatalf("mishandled instruction %v", p)
2600 }
2601
2602 inst := c.opload(p.As)
2603 if c.opform(inst) == DS_FORM && v&0x3 != 0 {
2604 log.Fatalf("invalid offset for DS form load/store %v", p)
2605 }
2606 o1 = AOP_IRR(inst, uint32(p.To.Reg), uint32(r), uint32(v))
2607 }
2608
2609 case 9:
2610 r := int(p.From.Reg)
2611
2612 if r == 0 {
2613 r = int(o.param)
2614 }
2615 v := c.regoff(&p.From)
2616 if p.From.Type == obj.TYPE_MEM && p.From.Index != 0 {
2617 if v != 0 {
2618 c.ctxt.Diag("illegal indexed instruction\n%v", p)
2619 }
2620 o1 = AOP_RRR(c.oploadx(p.As), uint32(p.To.Reg), uint32(p.From.Index), uint32(r))
2621 } else {
2622 o1 = AOP_IRR(c.opload(p.As), uint32(p.To.Reg), uint32(r), uint32(v))
2623 }
2624 o2 = LOP_RRR(OP_EXTSB, uint32(p.To.Reg), uint32(p.To.Reg), 0)
2625
2626 case 10:
2627 r := int(p.Reg)
2628
2629 if r == 0 {
2630 r = int(p.To.Reg)
2631 }
2632 o1 = AOP_RRR(c.oprrr(p.As), uint32(p.To.Reg), uint32(p.From.Reg), uint32(r))
2633
2634 case 11:
2635 v := int32(0)
2636
2637 if p.To.Target() != nil {
2638 v = int32(p.To.Target().Pc - p.Pc)
2639 if v&03 != 0 {
2640 c.ctxt.Diag("odd branch target address\n%v", p)
2641 v &^= 03
2642 }
2643
2644 if v < -(1<<25) || v >= 1<<24 {
2645 c.ctxt.Diag("branch too far\n%v", p)
2646 }
2647 }
2648
2649 o1 = OP_BR(c.opirr(p.As), uint32(v), 0)
2650 if p.To.Sym != nil {
2651 rel := obj.Addrel(c.cursym)
2652 rel.Off = int32(c.pc)
2653 rel.Siz = 4
2654 rel.Sym = p.To.Sym
2655 v += int32(p.To.Offset)
2656 if v&03 != 0 {
2657 c.ctxt.Diag("odd branch target address\n%v", p)
2658 v &^= 03
2659 }
2660
2661 rel.Add = int64(v)
2662 rel.Type = objabi.R_CALLPOWER
2663 }
2664 o2 = 0x60000000
2665
2666 case 12:
2667 if p.To.Reg == REGZERO && p.From.Type == obj.TYPE_CONST {
2668 v := c.regoff(&p.From)
2669 if r0iszero != 0 && v != 0 {
2670 c.ctxt.Diag("literal operation on R0\n%v", p)
2671 }
2672
2673 o1 = LOP_IRR(OP_ADDI, REGZERO, REGZERO, uint32(v))
2674 break
2675 }
2676
2677 if p.As == AMOVW {
2678 o1 = LOP_RRR(OP_EXTSW, uint32(p.To.Reg), uint32(p.From.Reg), 0)
2679 } else {
2680 o1 = LOP_RRR(OP_EXTSB, uint32(p.To.Reg), uint32(p.From.Reg), 0)
2681 }
2682
2683 case 13:
2684 if p.As == AMOVBZ {
2685 o1 = OP_RLW(OP_RLWINM, uint32(p.To.Reg), uint32(p.From.Reg), 0, 24, 31)
2686 } else if p.As == AMOVH {
2687 o1 = LOP_RRR(OP_EXTSH, uint32(p.To.Reg), uint32(p.From.Reg), 0)
2688 } else if p.As == AMOVHZ {
2689 o1 = OP_RLW(OP_RLWINM, uint32(p.To.Reg), uint32(p.From.Reg), 0, 16, 31)
2690 } else if p.As == AMOVWZ {
2691 o1 = OP_RLW(OP_RLDIC, uint32(p.To.Reg), uint32(p.From.Reg), 0, 0, 0) | 1<<5
2692 } else {
2693 c.ctxt.Diag("internal: bad mov[bhw]z\n%v", p)
2694 }
2695
2696 case 14:
2697 r := int(p.Reg)
2698
2699 if r == 0 {
2700 r = int(p.To.Reg)
2701 }
2702 d := c.vregoff(p.GetFrom3())
2703 var a int
2704 switch p.As {
2705
2706
2707
2708
2709 case ARLDCL, ARLDCLCC:
2710 var mask [2]uint8
2711 c.maskgen64(p, mask[:], uint64(d))
2712
2713 a = int(mask[0])
2714 if mask[1] != 63 {
2715 c.ctxt.Diag("invalid mask for rotate: %x (end != bit 63)\n%v", uint64(d), p)
2716 }
2717 o1 = LOP_RRR(c.oprrr(p.As), uint32(p.To.Reg), uint32(r), uint32(p.From.Reg))
2718 o1 |= (uint32(a) & 31) << 6
2719 if a&0x20 != 0 {
2720 o1 |= 1 << 5
2721 }
2722
2723 case ARLDCR, ARLDCRCC:
2724 var mask [2]uint8
2725 c.maskgen64(p, mask[:], uint64(d))
2726
2727 a = int(mask[1])
2728 if mask[0] != 0 {
2729 c.ctxt.Diag("invalid mask for rotate: %x %x (start != 0)\n%v", uint64(d), mask[0], p)
2730 }
2731 o1 = LOP_RRR(c.oprrr(p.As), uint32(p.To.Reg), uint32(r), uint32(p.From.Reg))
2732 o1 |= (uint32(a) & 31) << 6
2733 if a&0x20 != 0 {
2734 o1 |= 1 << 5
2735 }
2736
2737
2738 case ARLDICR, ARLDICRCC:
2739 me := int(d)
2740 sh := c.regoff(&p.From)
2741 if me < 0 || me > 63 || sh > 63 {
2742 c.ctxt.Diag("Invalid me or sh for RLDICR: %x %x\n%v", int(d), sh)
2743 }
2744 o1 = AOP_RLDIC(c.oprrr(p.As), uint32(p.To.Reg), uint32(r), uint32(sh), uint32(me))
2745
2746 case ARLDICL, ARLDICLCC, ARLDIC, ARLDICCC:
2747 mb := int(d)
2748 sh := c.regoff(&p.From)
2749 if mb < 0 || mb > 63 || sh > 63 {
2750 c.ctxt.Diag("Invalid mb or sh for RLDIC, RLDICL: %x %x\n%v", mb, sh)
2751 }
2752 o1 = AOP_RLDIC(c.oprrr(p.As), uint32(p.To.Reg), uint32(r), uint32(sh), uint32(mb))
2753
2754 case ACLRLSLDI:
2755
2756
2757
2758
2759 b := int(d)
2760 n := c.regoff(&p.From)
2761 if n > int32(b) || b > 63 {
2762 c.ctxt.Diag("Invalid n or b for CLRLSLDI: %x %x\n%v", n, b)
2763 }
2764 o1 = AOP_RLDIC(OP_RLDIC, uint32(p.To.Reg), uint32(r), uint32(n), uint32(b)-uint32(n))
2765
2766 default:
2767 c.ctxt.Diag("unexpected op in rldc case\n%v", p)
2768 a = 0
2769 }
2770
2771 case 17,
2772 16:
2773 a := 0
2774
2775 r := int(p.Reg)
2776
2777 if p.From.Type == obj.TYPE_CONST {
2778 a = int(c.regoff(&p.From))
2779 } else if p.From.Type == obj.TYPE_REG {
2780 if r != 0 {
2781 c.ctxt.Diag("unexpected register setting for branch with CR: %d\n", r)
2782 }
2783
2784 switch p.From.Reg {
2785 case REG_CR0:
2786 r = BI_CR0
2787 case REG_CR1:
2788 r = BI_CR1
2789 case REG_CR2:
2790 r = BI_CR2
2791 case REG_CR3:
2792 r = BI_CR3
2793 case REG_CR4:
2794 r = BI_CR4
2795 case REG_CR5:
2796 r = BI_CR5
2797 case REG_CR6:
2798 r = BI_CR6
2799 case REG_CR7:
2800 r = BI_CR7
2801 default:
2802 c.ctxt.Diag("unrecognized register: expecting CR\n")
2803 }
2804 }
2805 v := int32(0)
2806 if p.To.Target() != nil {
2807 v = int32(p.To.Target().Pc - p.Pc)
2808 }
2809 if v&03 != 0 {
2810 c.ctxt.Diag("odd branch target address\n%v", p)
2811 v &^= 03
2812 }
2813
2814 if v < -(1<<16) || v >= 1<<15 {
2815 c.ctxt.Diag("branch too far\n%v", p)
2816 }
2817 o1 = OP_BC(c.opirr(p.As), uint32(a), uint32(r), uint32(v), 0)
2818
2819 case 15:
2820 var v int32
2821 if p.As == ABC || p.As == ABCL {
2822 v = c.regoff(&p.To) & 31
2823 } else {
2824 v = 20
2825 }
2826 o1 = AOP_RRR(OP_MTSPR, uint32(p.To.Reg), 0, 0) | (REG_LR&0x1f)<<16 | ((REG_LR>>5)&0x1f)<<11
2827 o2 = OPVCC(19, 16, 0, 0)
2828 if p.As == ABL || p.As == ABCL {
2829 o2 |= 1
2830 }
2831 o2 = OP_BCR(o2, uint32(v), uint32(p.To.Index))
2832
2833 case 18:
2834 var v int32
2835 if p.As == ABC || p.As == ABCL {
2836 v = c.regoff(&p.From) & 31
2837 } else {
2838 v = 20
2839 }
2840 r := int(p.Reg)
2841 if r == 0 {
2842 r = 0
2843 }
2844 switch oclass(&p.To) {
2845 case C_CTR:
2846 o1 = OPVCC(19, 528, 0, 0)
2847
2848 case C_LR:
2849 o1 = OPVCC(19, 16, 0, 0)
2850
2851 default:
2852 c.ctxt.Diag("bad optab entry (18): %d\n%v", p.To.Class, p)
2853 v = 0
2854 }
2855
2856 if p.As == ABL || p.As == ABCL {
2857 o1 |= 1
2858 }
2859 o1 = OP_BCR(o1, uint32(v), uint32(r))
2860
2861 case 19:
2862 d := c.vregoff(&p.From)
2863
2864 if p.From.Sym == nil {
2865 o1 = loadu32(int(p.To.Reg), d)
2866 o2 = LOP_IRR(OP_ORI, uint32(p.To.Reg), uint32(p.To.Reg), uint32(int32(d)))
2867 } else {
2868 o1, o2 = c.symbolAccess(p.From.Sym, d, p.To.Reg, OP_ADDI)
2869 }
2870
2871 case 20:
2872 v := c.regoff(&p.From)
2873
2874 r := int(p.Reg)
2875 if r == 0 {
2876 r = int(p.To.Reg)
2877 }
2878 if p.As == AADD && (r0iszero == 0 && p.Reg == 0 || r0iszero != 0 && p.To.Reg == 0) {
2879 c.ctxt.Diag("literal operation on R0\n%v", p)
2880 }
2881 if p.As == AADDIS {
2882 o1 = AOP_IRR(c.opirr(p.As), uint32(p.To.Reg), uint32(r), uint32(v))
2883 } else {
2884 o1 = AOP_IRR(c.opirr(AADDIS), uint32(p.To.Reg), uint32(r), uint32(v)>>16)
2885 }
2886
2887 case 22:
2888 if p.To.Reg == REGTMP || p.Reg == REGTMP {
2889 c.ctxt.Diag("can't synthesize large constant\n%v", p)
2890 }
2891 d := c.vregoff(&p.From)
2892 r := int(p.Reg)
2893 if r == 0 {
2894 r = int(p.To.Reg)
2895 }
2896 if p.From.Sym != nil {
2897 c.ctxt.Diag("%v is not supported", p)
2898 }
2899
2900
2901 if o.size == 8 {
2902 o1 = LOP_IRR(OP_ORI, REGTMP, REGZERO, uint32(int32(d)))
2903 o2 = AOP_RRR(c.oprrr(p.As), uint32(p.To.Reg), REGTMP, uint32(r))
2904 } else {
2905 o1 = loadu32(REGTMP, d)
2906 o2 = LOP_IRR(OP_ORI, REGTMP, REGTMP, uint32(int32(d)))
2907 o3 = AOP_RRR(c.oprrr(p.As), uint32(p.To.Reg), REGTMP, uint32(r))
2908 }
2909
2910 case 23:
2911 if p.To.Reg == REGTMP || p.Reg == REGTMP {
2912 c.ctxt.Diag("can't synthesize large constant\n%v", p)
2913 }
2914 d := c.vregoff(&p.From)
2915 r := int(p.Reg)
2916 if r == 0 {
2917 r = int(p.To.Reg)
2918 }
2919
2920
2921
2922 if o.size == 8 {
2923 o1 = LOP_IRR(OP_ADDI, REGZERO, REGTMP, uint32(int32(d)))
2924 o2 = LOP_RRR(c.oprrr(p.As), uint32(p.To.Reg), REGTMP, uint32(r))
2925 } else {
2926 o1 = loadu32(REGTMP, d)
2927 o2 = LOP_IRR(OP_ORI, REGTMP, REGTMP, uint32(int32(d)))
2928 o3 = LOP_RRR(c.oprrr(p.As), uint32(p.To.Reg), REGTMP, uint32(r))
2929 }
2930 if p.From.Sym != nil {
2931 c.ctxt.Diag("%v is not supported", p)
2932 }
2933
2934 case 24:
2935 o1 = AOP_XX3I(c.oprrr(AXXLXOR), uint32(p.To.Reg), uint32(p.To.Reg), uint32(p.To.Reg), uint32(0))
2936
2937 if o.size == 8 {
2938 o2 = AOP_RRR(c.oprrr(AFNEG), uint32(p.To.Reg), 0, uint32(p.To.Reg))
2939 }
2940
2941 case 25:
2942
2943 v := c.regoff(&p.From)
2944
2945 if v < 0 {
2946 v = 0
2947 } else if v > 63 {
2948 v = 63
2949 }
2950 r := int(p.Reg)
2951 if r == 0 {
2952 r = int(p.To.Reg)
2953 }
2954 var a int
2955 op := uint32(0)
2956 switch p.As {
2957 case ASLD, ASLDCC:
2958 a = int(63 - v)
2959 op = OP_RLDICR
2960
2961 case ASRD, ASRDCC:
2962 a = int(v)
2963 v = 64 - v
2964 op = OP_RLDICL
2965 case AROTL:
2966 a = int(0)
2967 op = OP_RLDICL
2968 default:
2969 c.ctxt.Diag("unexpected op in sldi case\n%v", p)
2970 a = 0
2971 o1 = 0
2972 }
2973
2974 o1 = AOP_RLDIC(op, uint32(p.To.Reg), uint32(r), uint32(v), uint32(a))
2975 if p.As == ASLDCC || p.As == ASRDCC {
2976 o1 |= 1
2977 }
2978
2979 case 26:
2980 if p.To.Reg == REGTMP {
2981 c.ctxt.Diag("can't synthesize large constant\n%v", p)
2982 }
2983 v := c.regoff(&p.From)
2984 r := int(p.From.Reg)
2985 if r == 0 {
2986 r = int(o.param)
2987 }
2988 o1 = AOP_IRR(OP_ADDIS, REGTMP, uint32(r), uint32(high16adjusted(v)))
2989 o2 = AOP_IRR(OP_ADDI, uint32(p.To.Reg), REGTMP, uint32(v))
2990
2991 case 27:
2992 v := c.regoff(p.GetFrom3())
2993
2994 r := int(p.From.Reg)
2995 o1 = AOP_IRR(c.opirr(p.As), uint32(p.To.Reg), uint32(r), uint32(v))
2996
2997 case 28:
2998 if p.To.Reg == REGTMP || p.From.Reg == REGTMP {
2999 c.ctxt.Diag("can't synthesize large constant\n%v", p)
3000 }
3001 v := c.regoff(p.GetFrom3())
3002 o1 = AOP_IRR(OP_ADDIS, REGTMP, REGZERO, uint32(v)>>16)
3003 o2 = LOP_IRR(OP_ORI, REGTMP, REGTMP, uint32(v))
3004 o3 = AOP_RRR(c.oprrr(p.As), uint32(p.To.Reg), uint32(p.From.Reg), REGTMP)
3005 if p.From.Sym != nil {
3006 c.ctxt.Diag("%v is not supported", p)
3007 }
3008
3009 case 29:
3010 v := c.regoff(&p.From)
3011
3012 d := c.vregoff(p.GetFrom3())
3013 var mask [2]uint8
3014 c.maskgen64(p, mask[:], uint64(d))
3015 var a int
3016 switch p.As {
3017 case ARLDC, ARLDCCC:
3018 a = int(mask[0])
3019 if int32(mask[1]) != (63 - v) {
3020 c.ctxt.Diag("invalid mask for shift: %x %x (shift %d)\n%v", uint64(d), mask[1], v, p)
3021 }
3022
3023 case ARLDCL, ARLDCLCC:
3024 a = int(mask[0])
3025 if mask[1] != 63 {
3026 c.ctxt.Diag("invalid mask for shift: %x %s (shift %d)\n%v", uint64(d), mask[1], v, p)
3027 }
3028
3029 case ARLDCR, ARLDCRCC:
3030 a = int(mask[1])
3031 if mask[0] != 0 {
3032 c.ctxt.Diag("invalid mask for shift: %x %x (shift %d)\n%v", uint64(d), mask[0], v, p)
3033 }
3034
3035 default:
3036 c.ctxt.Diag("unexpected op in rldic case\n%v", p)
3037 a = 0
3038 }
3039
3040 o1 = AOP_RRR(c.opirr(p.As), uint32(p.Reg), uint32(p.To.Reg), (uint32(v) & 0x1F))
3041 o1 |= (uint32(a) & 31) << 6
3042 if v&0x20 != 0 {
3043 o1 |= 1 << 1
3044 }
3045 if a&0x20 != 0 {
3046 o1 |= 1 << 5
3047 }
3048
3049 case 30:
3050 v := c.regoff(&p.From)
3051
3052 d := c.vregoff(p.GetFrom3())
3053
3054
3055
3056 switch p.As {
3057 case ARLDMI, ARLDMICC:
3058 var mask [2]uint8
3059 c.maskgen64(p, mask[:], uint64(d))
3060 if int32(mask[1]) != (63 - v) {
3061 c.ctxt.Diag("invalid mask for shift: %x %x (shift %d)\n%v", uint64(d), mask[1], v, p)
3062 }
3063 o1 = AOP_RRR(c.opirr(p.As), uint32(p.Reg), uint32(p.To.Reg), (uint32(v) & 0x1F))
3064 o1 |= (uint32(mask[0]) & 31) << 6
3065 if v&0x20 != 0 {
3066 o1 |= 1 << 1
3067 }
3068 if mask[0]&0x20 != 0 {
3069 o1 |= 1 << 5
3070 }
3071
3072
3073 case ARLDIMI, ARLDIMICC:
3074 o1 = AOP_RRR(c.opirr(p.As), uint32(p.Reg), uint32(p.To.Reg), (uint32(v) & 0x1F))
3075 o1 |= (uint32(d) & 31) << 6
3076 if d&0x20 != 0 {
3077 o1 |= 1 << 5
3078 }
3079 if v&0x20 != 0 {
3080 o1 |= 1 << 1
3081 }
3082 }
3083
3084 case 31:
3085 d := c.vregoff(&p.From)
3086
3087 if c.ctxt.Arch.ByteOrder == binary.BigEndian {
3088 o1 = uint32(d >> 32)
3089 o2 = uint32(d)
3090 } else {
3091 o1 = uint32(d)
3092 o2 = uint32(d >> 32)
3093 }
3094
3095 if p.From.Sym != nil {
3096 rel := obj.Addrel(c.cursym)
3097 rel.Off = int32(c.pc)
3098 rel.Siz = 8
3099 rel.Sym = p.From.Sym
3100 rel.Add = p.From.Offset
3101 rel.Type = objabi.R_ADDR
3102 o2 = 0
3103 o1 = o2
3104 }
3105
3106 case 32:
3107 r := int(p.Reg)
3108
3109 if r == 0 {
3110 r = int(p.To.Reg)
3111 }
3112 o1 = AOP_RRR(c.oprrr(p.As), uint32(p.To.Reg), uint32(r), 0) | (uint32(p.From.Reg)&31)<<6
3113
3114 case 33:
3115 r := int(p.From.Reg)
3116
3117 if oclass(&p.From) == C_NONE {
3118 r = int(p.To.Reg)
3119 }
3120 o1 = AOP_RRR(c.oprrr(p.As), uint32(p.To.Reg), 0, uint32(r))
3121
3122 case 34:
3123 o1 = AOP_RRR(c.oprrr(p.As), uint32(p.To.Reg), uint32(p.From.Reg), uint32(p.Reg)) | (uint32(p.GetFrom3().Reg)&31)<<6
3124
3125 case 35:
3126 v := c.regoff(&p.To)
3127
3128 r := int(p.To.Reg)
3129 if r == 0 {
3130 r = int(o.param)
3131 }
3132
3133 inst := c.opstore(p.As)
3134 if c.opform(inst) == DS_FORM && v&0x3 != 0 {
3135 log.Fatalf("invalid offset for DS form load/store %v", p)
3136 }
3137 o1 = AOP_IRR(OP_ADDIS, REGTMP, uint32(r), uint32(high16adjusted(v)))
3138 o2 = AOP_IRR(inst, uint32(p.From.Reg), REGTMP, uint32(v))
3139
3140 case 36:
3141 v := c.regoff(&p.From)
3142
3143 r := int(p.From.Reg)
3144 if r == 0 {
3145 r = int(o.param)
3146 }
3147 o1 = AOP_IRR(OP_ADDIS, REGTMP, uint32(r), uint32(high16adjusted(v)))
3148 o2 = AOP_IRR(c.opload(p.As), uint32(p.To.Reg), REGTMP, uint32(v))
3149
3150 case 37:
3151 v := c.regoff(&p.From)
3152
3153 r := int(p.From.Reg)
3154 if r == 0 {
3155 r = int(o.param)
3156 }
3157 o1 = AOP_IRR(OP_ADDIS, REGTMP, uint32(r), uint32(high16adjusted(v)))
3158 o2 = AOP_IRR(c.opload(p.As), uint32(p.To.Reg), REGTMP, uint32(v))
3159 o3 = LOP_RRR(OP_EXTSB, uint32(p.To.Reg), uint32(p.To.Reg), 0)
3160
3161 case 40:
3162 o1 = uint32(c.regoff(&p.From))
3163
3164 case 41:
3165 o1 = AOP_RRR(c.opirr(p.As), uint32(p.From.Reg), uint32(p.To.Reg), 0) | (uint32(c.regoff(p.GetFrom3()))&0x7F)<<11
3166
3167 case 42:
3168 o1 = AOP_RRR(c.opirr(p.As), uint32(p.To.Reg), uint32(p.From.Reg), 0) | (uint32(c.regoff(p.GetFrom3()))&0x7F)<<11
3169
3170 case 43:
3171
3172
3173
3174
3175
3176
3177
3178
3179
3180
3181 if p.To.Type == obj.TYPE_NONE {
3182 o1 = AOP_RRR(c.oprrr(p.As), 0, uint32(p.From.Index), uint32(p.From.Reg))
3183 } else {
3184 th := c.regoff(&p.To)
3185 o1 = AOP_RRR(c.oprrr(p.As), uint32(th), uint32(p.From.Index), uint32(p.From.Reg))
3186 }
3187
3188 case 44:
3189 o1 = AOP_RRR(c.opstorex(p.As), uint32(p.From.Reg), uint32(p.To.Index), uint32(p.To.Reg))
3190
3191 case 45:
3192 switch p.As {
3193
3194
3195
3196
3197 case ALBAR, ALHAR, ALWAR, ALDAR:
3198 if p.From3Type() != obj.TYPE_NONE {
3199 eh := int(c.regoff(p.GetFrom3()))
3200 if eh > 1 {
3201 c.ctxt.Diag("illegal EH field\n%v", p)
3202 }
3203 o1 = AOP_RRRI(c.oploadx(p.As), uint32(p.To.Reg), uint32(p.From.Index), uint32(p.From.Reg), uint32(eh))
3204 } else {
3205 o1 = AOP_RRR(c.oploadx(p.As), uint32(p.To.Reg), uint32(p.From.Index), uint32(p.From.Reg))
3206 }
3207 default:
3208 o1 = AOP_RRR(c.oploadx(p.As), uint32(p.To.Reg), uint32(p.From.Index), uint32(p.From.Reg))
3209 }
3210 case 46:
3211 o1 = c.oprrr(p.As)
3212
3213 case 47:
3214 r := int(p.From.Reg)
3215
3216 if r == 0 {
3217 r = int(p.To.Reg)
3218 }
3219 o1 = AOP_RRR(c.oprrr(p.As), uint32(p.To.Reg), uint32(r), 0)
3220
3221 case 48:
3222 r := int(p.From.Reg)
3223
3224 if r == 0 {
3225 r = int(p.To.Reg)
3226 }
3227 o1 = LOP_RRR(c.oprrr(p.As), uint32(p.To.Reg), uint32(r), 0)
3228
3229 case 49:
3230 if p.From.Type != obj.TYPE_REG {
3231 v := c.regoff(&p.From) & 1
3232 o1 = AOP_RRR(c.oprrr(p.As), 0, 0, uint32(p.To.Reg)) | uint32(v)<<21
3233 } else {
3234 o1 = AOP_RRR(c.oprrr(p.As), 0, 0, uint32(p.From.Reg))
3235 }
3236
3237 case 50:
3238 r := int(p.Reg)
3239
3240 if r == 0 {
3241 r = int(p.To.Reg)
3242 }
3243 v := c.oprrr(p.As)
3244 t := v & (1<<10 | 1)
3245 o1 = AOP_RRR(v&^t, REGTMP, uint32(r), uint32(p.From.Reg))
3246 o2 = AOP_RRR(OP_MULLW, REGTMP, REGTMP, uint32(p.From.Reg))
3247 o3 = AOP_RRR(OP_SUBF|t, uint32(p.To.Reg), REGTMP, uint32(r))
3248 if p.As == AREMU {
3249 o4 = o3
3250
3251
3252 o3 = OP_RLW(OP_RLDIC, REGTMP, REGTMP, 0, 0, 0) | 1<<5
3253 }
3254
3255 case 51:
3256 r := int(p.Reg)
3257
3258 if r == 0 {
3259 r = int(p.To.Reg)
3260 }
3261 v := c.oprrr(p.As)
3262 t := v & (1<<10 | 1)
3263 o1 = AOP_RRR(v&^t, REGTMP, uint32(r), uint32(p.From.Reg))
3264 o2 = AOP_RRR(OP_MULLD, REGTMP, REGTMP, uint32(p.From.Reg))
3265 o3 = AOP_RRR(OP_SUBF|t, uint32(p.To.Reg), REGTMP, uint32(r))
3266
3267
3268
3269
3270 case 52:
3271 v := c.regoff(&p.From) & 31
3272
3273 o1 = AOP_RRR(c.oprrr(p.As), uint32(v), 0, 0)
3274
3275 case 53:
3276 o1 = AOP_RRR(OP_MFFS, uint32(p.To.Reg), 0, 0)
3277
3278 case 54:
3279 if oclass(&p.From) == C_REG {
3280 if p.As == AMOVD {
3281 o1 = AOP_RRR(OP_MTMSRD, uint32(p.From.Reg), 0, 0)
3282 } else {
3283 o1 = AOP_RRR(OP_MTMSR, uint32(p.From.Reg), 0, 0)
3284 }
3285 } else {
3286 o1 = AOP_RRR(OP_MFMSR, uint32(p.To.Reg), 0, 0)
3287 }
3288
3289 case 55:
3290 o1 = AOP_RRR(c.oprrr(p.As), uint32(p.To.Reg), 0, uint32(p.From.Reg))
3291
3292 case 56:
3293 v := c.regoff(&p.From)
3294
3295 r := int(p.Reg)
3296 if r == 0 {
3297 r = int(p.To.Reg)
3298 }
3299 o1 = AOP_RRR(c.opirr(p.As), uint32(r), uint32(p.To.Reg), uint32(v)&31)
3300 if (p.As == ASRAD || p.As == ASRADCC) && (v&0x20 != 0) {
3301 o1 |= 1 << 1
3302 }
3303
3304 case 57:
3305 v := c.regoff(&p.From)
3306
3307 r := int(p.Reg)
3308 if r == 0 {
3309 r = int(p.To.Reg)
3310 }
3311
3312
3319 if v < 0 {
3320 v = 0
3321 } else if v > 32 {
3322 v = 32
3323 }
3324 var mask [2]uint8
3325 switch p.As {
3326 case AROTLW:
3327 mask[0], mask[1] = 0, 31
3328 case ASRW, ASRWCC:
3329 mask[0], mask[1] = uint8(v), 31
3330 v = 32 - v
3331 default:
3332 mask[0], mask[1] = 0, uint8(31-v)
3333 }
3334 o1 = OP_RLW(OP_RLWINM, uint32(p.To.Reg), uint32(r), uint32(v), uint32(mask[0]), uint32(mask[1]))
3335 if p.As == ASLWCC || p.As == ASRWCC {
3336 o1 |= 1
3337 }
3338
3339 case 58:
3340 v := c.regoff(&p.From)
3341
3342 r := int(p.Reg)
3343 if r == 0 {
3344 r = int(p.To.Reg)
3345 }
3346 o1 = LOP_IRR(c.opirr(p.As), uint32(p.To.Reg), uint32(r), uint32(v))
3347
3348 case 59:
3349 v := c.regoff(&p.From)
3350
3351 r := int(p.Reg)
3352 if r == 0 {
3353 r = int(p.To.Reg)
3354 }
3355 switch p.As {
3356 case AOR:
3357 o1 = LOP_IRR(c.opirr(AORIS), uint32(p.To.Reg), uint32(r), uint32(v)>>16)
3358 case AXOR:
3359 o1 = LOP_IRR(c.opirr(AXORIS), uint32(p.To.Reg), uint32(r), uint32(v)>>16)
3360 case AANDCC:
3361 o1 = LOP_IRR(c.opirr(AANDISCC), uint32(p.To.Reg), uint32(r), uint32(v)>>16)
3362 default:
3363 o1 = LOP_IRR(c.opirr(p.As), uint32(p.To.Reg), uint32(r), uint32(v))
3364 }
3365
3366 case 60:
3367 r := int(c.regoff(&p.From) & 31)
3368
3369 o1 = AOP_RRR(c.oprrr(p.As), uint32(r), uint32(p.Reg), uint32(p.To.Reg))
3370
3371 case 61:
3372 r := int(c.regoff(&p.From) & 31)
3373
3374 v := c.regoff(&p.To)
3375 o1 = AOP_IRR(c.opirr(p.As), uint32(r), uint32(p.Reg), uint32(v))
3376
3377 case 62:
3378 v := c.regoff(&p.From)
3379 switch p.As {
3380 case ACLRLSLWI:
3381 b := c.regoff(p.GetFrom3())
3382
3383
3384
3385 if v < 0 || v > 32 || b > 32 {
3386 c.ctxt.Diag("Invalid n or b for CLRLSLWI: %x %x\n%v", v, b)
3387 }
3388 o1 = OP_RLW(OP_RLWINM, uint32(p.To.Reg), uint32(p.Reg), uint32(v), uint32(b-v), uint32(31-v))
3389 default:
3390 var mask [2]uint8
3391 c.maskgen(p, mask[:], uint32(c.regoff(p.GetFrom3())))
3392 o1 = AOP_RRR(c.opirr(p.As), uint32(p.Reg), uint32(p.To.Reg), uint32(v))
3393 o1 |= (uint32(mask[0])&31)<<6 | (uint32(mask[1])&31)<<1
3394 }
3395
3396 case 63:
3397 v := c.regoff(&p.From)
3398 switch p.As {
3399 case ACLRLSLWI:
3400 b := c.regoff(p.GetFrom3())
3401 if v > b || b > 32 {
3402
3403
3404 c.ctxt.Diag("Invalid n or b for CLRLSLWI: %x %x\n%v", v, b)
3405 }
3406
3407
3408
3409 o1 = OP_RLW(OP_RLWINM, uint32(p.To.Reg), uint32(p.Reg), uint32(v), uint32(b-v), uint32(31-v))
3410 default:
3411 var mask [2]uint8
3412 c.maskgen(p, mask[:], uint32(c.regoff(p.GetFrom3())))
3413 o1 = AOP_RRR(c.opirr(p.As), uint32(p.Reg), uint32(p.To.Reg), uint32(v))
3414 o1 |= (uint32(mask[0])&31)<<6 | (uint32(mask[1])&31)<<1
3415 }
3416
3417 case 64:
3418 var v int32
3419 if p.From3Type() != obj.TYPE_NONE {
3420 v = c.regoff(p.GetFrom3()) & 255
3421 } else {
3422 v = 255
3423 }
3424 o1 = OP_MTFSF | uint32(v)<<17 | uint32(p.From.Reg)<<11
3425
3426 case 65:
3427 if p.To.Reg == 0 {
3428 c.ctxt.Diag("must specify FPSCR(n)\n%v", p)
3429 }
3430 o1 = OP_MTFSFI | (uint32(p.To.Reg)&15)<<23 | (uint32(c.regoff(&p.From))&31)<<12
3431
3432 case 66:
3433 var r int
3434 var v int32
3435 if REG_R0 <= p.From.Reg && p.From.Reg <= REG_R31 {
3436 r = int(p.From.Reg)
3437 v = int32(p.To.Reg)
3438 if REG_DCR0 <= v && v <= REG_DCR0+1023 {
3439 o1 = OPVCC(31, 451, 0, 0)
3440 } else {
3441 o1 = OPVCC(31, 467, 0, 0)
3442 }
3443 } else {
3444 r = int(p.To.Reg)
3445 v = int32(p.From.Reg)
3446 if REG_DCR0 <= v && v <= REG_DCR0+1023 {
3447 o1 = OPVCC(31, 323, 0, 0)
3448 } else {
3449 o1 = OPVCC(31, 339, 0, 0)
3450 }
3451 }
3452
3453 o1 = AOP_RRR(o1, uint32(r), 0, 0) | (uint32(v)&0x1f)<<16 | ((uint32(v)>>5)&0x1f)<<11
3454
3455 case 67:
3456 if p.From.Type != obj.TYPE_REG || p.From.Reg < REG_CR0 || REG_CR7 < p.From.Reg || p.To.Type != obj.TYPE_REG || p.To.Reg < REG_CR0 || REG_CR7 < p.To.Reg {
3457 c.ctxt.Diag("illegal CR field number\n%v", p)
3458 }
3459 o1 = AOP_RRR(OP_MCRF, ((uint32(p.To.Reg) & 7) << 2), ((uint32(p.From.Reg) & 7) << 2), 0)
3460
3461 case 68:
3462 if p.From.Type == obj.TYPE_REG && REG_CR0 <= p.From.Reg && p.From.Reg <= REG_CR7 {
3463 v := int32(1 << uint(7-(p.To.Reg&7)))
3464 o1 = AOP_RRR(OP_MFCR, uint32(p.To.Reg), 0, 0) | 1<<20 | uint32(v)<<12
3465 } else {
3466 o1 = AOP_RRR(OP_MFCR, uint32(p.To.Reg), 0, 0)
3467 }
3468
3469 case 69:
3470 var v int32
3471 if p.From3Type() != obj.TYPE_NONE {
3472 if p.To.Reg != 0 {
3473 c.ctxt.Diag("can't use both mask and CR(n)\n%v", p)
3474 }
3475 v = c.regoff(p.GetFrom3()) & 0xff
3476 } else {
3477 if p.To.Reg == 0 {
3478 v = 0xff
3479 } else {
3480 v = 1 << uint(7-(p.To.Reg&7))
3481 }
3482 }
3483
3484 o1 = AOP_RRR(OP_MTCRF, uint32(p.From.Reg), 0, 0) | uint32(v)<<12
3485
3486 case 70:
3487 var r int
3488 if p.Reg == 0 {
3489 r = 0
3490 } else {
3491 r = (int(p.Reg) & 7) << 2
3492 }
3493 o1 = AOP_RRR(c.oprrr(p.As), uint32(r), uint32(p.From.Reg), uint32(p.To.Reg))
3494
3495 case 71:
3496 var r int
3497 if p.Reg == 0 {
3498 r = 0
3499 } else {
3500 r = (int(p.Reg) & 7) << 2
3501 }
3502 o1 = AOP_RRR(c.opirr(p.As), uint32(r), uint32(p.From.Reg), 0) | uint32(c.regoff(&p.To))&0xffff
3503
3504 case 72:
3505 o1 = AOP_RRR(c.oprrr(p.As), uint32(p.From.Reg), 0, uint32(p.To.Reg))
3506
3507 case 73:
3508 if p.From.Type != obj.TYPE_REG || p.From.Reg != REG_FPSCR || p.To.Type != obj.TYPE_REG || p.To.Reg < REG_CR0 || REG_CR7 < p.To.Reg {
3509 c.ctxt.Diag("illegal FPSCR/CR field number\n%v", p)
3510 }
3511 o1 = AOP_RRR(OP_MCRFS, ((uint32(p.To.Reg) & 7) << 2), ((0 & 7) << 2), 0)
3512
3513 case 77:
3514 if p.From.Type == obj.TYPE_CONST {
3515 if p.From.Offset > BIG || p.From.Offset < -BIG {
3516 c.ctxt.Diag("illegal syscall, sysnum too large: %v", p)
3517 }
3518 o1 = AOP_IRR(OP_ADDI, REGZERO, REGZERO, uint32(p.From.Offset))
3519 } else if p.From.Type == obj.TYPE_REG {
3520 o1 = LOP_RRR(OP_OR, REGZERO, uint32(p.From.Reg), uint32(p.From.Reg))
3521 } else {
3522 c.ctxt.Diag("illegal syscall: %v", p)
3523 o1 = 0x7fe00008
3524 }
3525
3526 o2 = c.oprrr(p.As)
3527 o3 = AOP_RRR(c.oprrr(AXOR), REGZERO, REGZERO, REGZERO)
3528
3529 case 78:
3530 o1 = 0
3532
3533
3534 case 74:
3535 v := c.vregoff(&p.To)
3536
3537 inst := c.opstore(p.As)
3538 if c.opform(inst) == DS_FORM && v&0x3 != 0 {
3539 log.Fatalf("invalid offset for DS form load/store %v", p)
3540 }
3541 o1, o2 = c.symbolAccess(p.To.Sym, v, p.From.Reg, inst)
3542
3543
3544
3545 case 75:
3546 v := c.vregoff(&p.From)
3547
3548 inst := c.opload(p.As)
3549 if c.opform(inst) == DS_FORM && v&0x3 != 0 {
3550 log.Fatalf("invalid offset for DS form load/store %v", p)
3551 }
3552 o1, o2 = c.symbolAccess(p.From.Sym, v, p.To.Reg, inst)
3553
3554
3555
3556 case 76:
3557 v := c.vregoff(&p.From)
3558
3559 inst := c.opload(p.As)
3560 if c.opform(inst) == DS_FORM && v&0x3 != 0 {
3561 log.Fatalf("invalid offset for DS form load/store %v", p)
3562 }
3563 o1, o2 = c.symbolAccess(p.From.Sym, v, p.To.Reg, inst)
3564 o3 = LOP_RRR(OP_EXTSB, uint32(p.To.Reg), uint32(p.To.Reg), 0)
3565
3566
3567
3568 case 79:
3569 if p.From.Offset != 0 {
3570 c.ctxt.Diag("invalid offset against tls var %v", p)
3571 }
3572 o1 = AOP_IRR(OP_ADDI, uint32(p.To.Reg), REGZERO, 0)
3573 rel := obj.Addrel(c.cursym)
3574 rel.Off = int32(c.pc)
3575 rel.Siz = 4
3576 rel.Sym = p.From.Sym
3577 rel.Type = objabi.R_POWER_TLS_LE
3578
3579 case 80:
3580 if p.From.Offset != 0 {
3581 c.ctxt.Diag("invalid offset against tls var %v", p)
3582 }
3583 o1 = AOP_IRR(OP_ADDIS, uint32(p.To.Reg), REG_R2, 0)
3584 o2 = AOP_IRR(c.opload(AMOVD), uint32(p.To.Reg), uint32(p.To.Reg), 0)
3585 rel := obj.Addrel(c.cursym)
3586 rel.Off = int32(c.pc)
3587 rel.Siz = 8
3588 rel.Sym = p.From.Sym
3589 rel.Type = objabi.R_POWER_TLS_IE
3590
3591 case 81:
3592 v := c.vregoff(&p.To)
3593 if v != 0 {
3594 c.ctxt.Diag("invalid offset against GOT slot %v", p)
3595 }
3596
3597 o1 = AOP_IRR(OP_ADDIS, uint32(p.To.Reg), REG_R2, 0)
3598 o2 = AOP_IRR(c.opload(AMOVD), uint32(p.To.Reg), uint32(p.To.Reg), 0)
3599 rel := obj.Addrel(c.cursym)
3600 rel.Off = int32(c.pc)
3601 rel.Siz = 8
3602 rel.Sym = p.From.Sym
3603 rel.Type = objabi.R_ADDRPOWER_GOT
3604 case 82:
3605 if p.From.Type == obj.TYPE_REG {
3606
3607
3608
3609 o1 = AOP_RRR(c.oprrr(p.As), uint32(p.To.Reg), uint32(p.From.Reg), uint32(p.Reg))
3610 } else if p.From3Type() == obj.TYPE_CONST {
3611
3612
3613 six := int(c.regoff(&p.From))
3614 st := int(c.regoff(p.GetFrom3()))
3615 o1 = AOP_IIRR(c.opiirr(p.As), uint32(p.To.Reg), uint32(p.Reg), uint32(st), uint32(six))
3616 } else if p.From3Type() == obj.TYPE_NONE && p.Reg != 0 {
3617
3618
3619 uim := int(c.regoff(&p.From))
3620 o1 = AOP_VIRR(c.opirr(p.As), uint32(p.To.Reg), uint32(p.Reg), uint32(uim))
3621 } else {
3622
3623
3624 sim := int(c.regoff(&p.From))
3625 o1 = AOP_IR(c.opirr(p.As), uint32(p.To.Reg), uint32(sim))
3626 }
3627
3628 case 83:
3629 if p.From.Type == obj.TYPE_REG {
3630
3631
3632 o1 = AOP_RRRR(c.oprrr(p.As), uint32(p.To.Reg), uint32(p.From.Reg), uint32(p.Reg), uint32(p.GetFrom3().Reg))
3633 } else if p.From.Type == obj.TYPE_CONST {
3634
3635
3636 shb := int(c.regoff(&p.From))
3637 o1 = AOP_IRRR(c.opirrr(p.As), uint32(p.To.Reg), uint32(p.Reg), uint32(p.GetFrom3().Reg), uint32(shb))
3638 }
3639
3640 case 84:
3641 bc := c.vregoff(&p.From)
3642
3643
3644 o1 = AOP_ISEL(OP_ISEL, uint32(p.To.Reg), uint32(p.Reg), uint32(p.GetFrom3().Reg), uint32(bc))
3645
3646 case 85:
3647
3648
3649 o1 = AOP_RR(c.oprrr(p.As), uint32(p.To.Reg), uint32(p.From.Reg))
3650
3651 case 86:
3652
3653
3654 o1 = AOP_XX1(c.opstorex(p.As), uint32(p.From.Reg), uint32(p.To.Index), uint32(p.To.Reg))
3655
3656 case 87:
3657
3658
3659 o1 = AOP_XX1(c.oploadx(p.As), uint32(p.To.Reg), uint32(p.From.Index), uint32(p.From.Reg))
3660
3661 case 88:
3662
3663
3664
3665 xt := int32(p.To.Reg)
3666 xs := int32(p.From.Reg)
3667
3668 if REG_V0 <= xt && xt <= REG_V31 {
3669
3670 xt = xt + 64
3671 o1 = AOP_XX1(c.oprrr(p.As), uint32(xt), uint32(p.From.Reg), uint32(p.Reg))
3672 } else if REG_F0 <= xt && xt <= REG_F31 {
3673
3674 xt = xt + 64
3675 o1 = AOP_XX1(c.oprrr(p.As), uint32(xt), uint32(p.From.Reg), uint32(p.Reg))
3676 } else if REG_VS0 <= xt && xt <= REG_VS63 {
3677 o1 = AOP_XX1(c.oprrr(p.As), uint32(xt), uint32(p.From.Reg), uint32(p.Reg))
3678 } else if REG_V0 <= xs && xs <= REG_V31 {
3679
3680 xs = xs + 64
3681 o1 = AOP_XX1(c.oprrr(p.As), uint32(xs), uint32(p.To.Reg), uint32(p.Reg))
3682 } else if REG_F0 <= xs && xs <= REG_F31 {
3683 xs = xs + 64
3684 o1 = AOP_XX1(c.oprrr(p.As), uint32(xs), uint32(p.To.Reg), uint32(p.Reg))
3685 } else if REG_VS0 <= xs && xs <= REG_VS63 {
3686 o1 = AOP_XX1(c.oprrr(p.As), uint32(xs), uint32(p.To.Reg), uint32(p.Reg))
3687 }
3688
3689 case 89:
3690
3691
3692 uim := int(c.regoff(p.GetFrom3()))
3693 o1 = AOP_XX2(c.oprrr(p.As), uint32(p.To.Reg), uint32(uim), uint32(p.From.Reg))
3694
3695 case 90:
3696 if p.From3Type() == obj.TYPE_NONE {
3697
3698
3699 o1 = AOP_XX3(c.oprrr(p.As), uint32(p.To.Reg), uint32(p.From.Reg), uint32(p.Reg))
3700 } else if p.From3Type() == obj.TYPE_CONST {
3701
3702
3703 dm := int(c.regoff(p.GetFrom3()))
3704 o1 = AOP_XX3I(c.oprrr(p.As), uint32(p.To.Reg), uint32(p.From.Reg), uint32(p.Reg), uint32(dm))
3705 }
3706
3707 case 91:
3708
3709
3710 o1 = AOP_XX4(c.oprrr(p.As), uint32(p.To.Reg), uint32(p.From.Reg), uint32(p.Reg), uint32(p.GetFrom3().Reg))
3711
3712 case 92:
3713 if p.To.Type == obj.TYPE_CONST {
3714
3715 xf := int32(p.From.Reg)
3716 if REG_F0 <= xf && xf <= REG_F31 {
3717
3718 bf := int(c.regoff(&p.To)) << 2
3719 o1 = AOP_RRR(c.opirr(p.As), uint32(bf), uint32(p.From.Reg), uint32(p.Reg))
3720 } else {
3721
3722 l := int(c.regoff(&p.To))
3723 o1 = AOP_RRR(c.opirr(p.As), uint32(l), uint32(p.From.Reg), uint32(p.Reg))
3724 }
3725 } else if p.From3Type() == obj.TYPE_CONST {
3726
3727
3728 l := int(c.regoff(p.GetFrom3()))
3729 o1 = AOP_RRR(c.opirr(p.As), uint32(l), uint32(p.To.Reg), uint32(p.From.Reg))
3730 } else if p.To.Type == obj.TYPE_REG {
3731 cr := int32(p.To.Reg)
3732 if REG_CR0 <= cr && cr <= REG_CR7 {
3733
3734
3735 bf := (int(p.To.Reg) & 7) << 2
3736 o1 = AOP_RRR(c.opirr(p.As), uint32(bf), uint32(p.From.Reg), uint32(p.Reg))
3737 } else if p.From.Type == obj.TYPE_CONST {
3738
3739
3740 l := int(c.regoff(&p.From))
3741 o1 = AOP_RRR(c.opirr(p.As), uint32(p.To.Reg), uint32(l), uint32(p.Reg))
3742 } else {
3743 switch p.As {
3744 case ACOPY, APASTECC:
3745 o1 = AOP_RRR(c.opirr(p.As), uint32(1), uint32(p.From.Reg), uint32(p.To.Reg))
3746 default:
3747
3748
3749 o1 = AOP_RRR(c.oprrr(p.As), uint32(p.From.Reg), uint32(p.To.Reg), uint32(p.Reg))
3750 }
3751 }
3752 }
3753
3754 case 93:
3755 if p.To.Type == obj.TYPE_CONST {
3756
3757
3758 bf := int(c.regoff(&p.To)) << 2
3759 o1 = AOP_RR(c.opirr(p.As), uint32(bf), uint32(p.From.Reg))
3760 } else if p.Reg == 0 {
3761
3762
3763 o1 = AOP_RRR(c.oprrr(p.As), uint32(p.From.Reg), uint32(p.To.Reg), uint32(p.Reg))
3764 }
3765
3766 case 94:
3767
3768
3769 cy := int(c.regoff(p.GetFrom3()))
3770 o1 = AOP_Z23I(c.oprrr(p.As), uint32(p.To.Reg), uint32(p.From.Reg), uint32(p.Reg), uint32(cy))
3771
3772 case 95:
3773
3774 v := c.vregoff(&p.From)
3775 if v != 0 {
3776 c.ctxt.Diag("invalid offset against TOC slot %v", p)
3777 }
3778
3779 inst := c.opload(p.As)
3780 if c.opform(inst) != DS_FORM {
3781 c.ctxt.Diag("invalid form for a TOC access in %v", p)
3782 }
3783
3784 o1 = AOP_IRR(OP_ADDIS, uint32(p.To.Reg), REG_R2, 0)
3785 o2 = AOP_IRR(inst, uint32(p.To.Reg), uint32(p.To.Reg), 0)
3786 rel := obj.Addrel(c.cursym)
3787 rel.Off = int32(c.pc)
3788 rel.Siz = 8
3789 rel.Sym = p.From.Sym
3790 rel.Type = objabi.R_ADDRPOWER_TOCREL_DS
3791
3792 case 96:
3793
3794
3795 dq := int16(c.regoff(&p.From))
3796 if (dq & 15) != 0 {
3797 c.ctxt.Diag("invalid offset for DQ form load/store %v", dq)
3798 }
3799 o1 = AOP_DQ(c.opload(p.As), uint32(p.To.Reg), uint32(p.From.Reg), uint32(dq))
3800
3801 case 97:
3802
3803
3804 dq := int16(c.regoff(&p.To))
3805 if (dq & 15) != 0 {
3806 c.ctxt.Diag("invalid offset for DQ form load/store %v", dq)
3807 }
3808 o1 = AOP_DQ(c.opstore(p.As), uint32(p.From.Reg), uint32(p.To.Reg), uint32(dq))
3809 case 98:
3810
3811 o1 = AOP_XX1(c.opload(p.As), uint32(p.To.Reg), uint32(p.From.Reg), uint32(p.Reg))
3812 case 99:
3813
3814 o1 = AOP_XX1(c.opstore(p.As), uint32(p.From.Reg), uint32(p.Reg), uint32(p.To.Reg))
3815 case 100:
3816 if p.From.Type == obj.TYPE_CONST {
3817
3818 uim := int(c.regoff(&p.From))
3819
3820
3821 o1 = AOP_XX1(c.oprrr(p.As), uint32(p.To.Reg), uint32(0), uint32(uim))
3822 } else {
3823 c.ctxt.Diag("invalid ops for %v", p.As)
3824 }
3825 case 101:
3826 o1 = AOP_XX2(c.oprrr(p.As), uint32(p.To.Reg), uint32(0), uint32(p.From.Reg))
3827 }
3828
3829 out[0] = o1
3830 out[1] = o2
3831 out[2] = o3
3832 out[3] = o4
3833 out[4] = o5
3834 }
3835
3836 func (c *ctxt9) vregoff(a *obj.Addr) int64 {
3837 c.instoffset = 0
3838 if a != nil {
3839 c.aclass(a)
3840 }
3841 return c.instoffset
3842 }
3843
3844 func (c *ctxt9) regoff(a *obj.Addr) int32 {
3845 return int32(c.vregoff(a))
3846 }
3847
3848 func (c *ctxt9) oprrr(a obj.As) uint32 {
3849 switch a {
3850 case AADD:
3851 return OPVCC(31, 266, 0, 0)
3852 case AADDCC:
3853 return OPVCC(31, 266, 0, 1)
3854 case AADDV:
3855 return OPVCC(31, 266, 1, 0)
3856 case AADDVCC:
3857 return OPVCC(31, 266, 1, 1)
3858 case AADDC:
3859 return OPVCC(31, 10, 0, 0)
3860 case AADDCCC:
3861 return OPVCC(31, 10, 0, 1)
3862 case AADDCV:
3863 return OPVCC(31, 10, 1, 0)
3864 case AADDCVCC:
3865 return OPVCC(31, 10, 1, 1)
3866 case AADDE:
3867 return OPVCC(31, 138, 0, 0)
3868 case AADDECC:
3869 return OPVCC(31, 138, 0, 1)
3870 case AADDEV:
3871 return OPVCC(31, 138, 1, 0)
3872 case AADDEVCC:
3873 return OPVCC(31, 138, 1, 1)
3874 case AADDME:
3875 return OPVCC(31, 234, 0, 0)
3876 case AADDMECC:
3877 return OPVCC(31, 234, 0, 1)
3878 case AADDMEV:
3879 return OPVCC(31, 234, 1, 0)
3880 case AADDMEVCC:
3881 return OPVCC(31, 234, 1, 1)
3882 case AADDZE:
3883 return OPVCC(31, 202, 0, 0)
3884 case AADDZECC:
3885 return OPVCC(31, 202, 0, 1)
3886 case AADDZEV:
3887 return OPVCC(31, 202, 1, 0)
3888 case AADDZEVCC:
3889 return OPVCC(31, 202, 1, 1)
3890 case AADDEX:
3891 return OPVCC(31, 170, 0, 0)
3892
3893 case AAND:
3894 return OPVCC(31, 28, 0, 0)
3895 case AANDCC:
3896 return OPVCC(31, 28, 0, 1)
3897 case AANDN:
3898 return OPVCC(31, 60, 0, 0)
3899 case AANDNCC:
3900 return OPVCC(31, 60, 0, 1)
3901
3902 case ACMP:
3903 return OPVCC(31, 0, 0, 0) | 1<<21
3904 case ACMPU:
3905 return OPVCC(31, 32, 0, 0) | 1<<21
3906 case ACMPW:
3907 return OPVCC(31, 0, 0, 0)
3908 case ACMPWU:
3909 return OPVCC(31, 32, 0, 0)
3910 case ACMPB:
3911 return OPVCC(31, 508, 0, 0)
3912 case ACMPEQB:
3913 return OPVCC(31, 224, 0, 0)
3914
3915 case ACNTLZW:
3916 return OPVCC(31, 26, 0, 0)
3917 case ACNTLZWCC:
3918 return OPVCC(31, 26, 0, 1)
3919 case ACNTLZD:
3920 return OPVCC(31, 58, 0, 0)
3921 case ACNTLZDCC:
3922 return OPVCC(31, 58, 0, 1)
3923
3924 case ACRAND:
3925 return OPVCC(19, 257, 0, 0)
3926 case ACRANDN:
3927 return OPVCC(19, 129, 0, 0)
3928 case ACREQV:
3929 return OPVCC(19, 289, 0, 0)
3930 case ACRNAND:
3931 return OPVCC(19, 225, 0, 0)
3932 case ACRNOR:
3933 return OPVCC(19, 33, 0, 0)
3934 case ACROR:
3935 return OPVCC(19, 449, 0, 0)
3936 case ACRORN:
3937 return OPVCC(19, 417, 0, 0)
3938 case ACRXOR:
3939 return OPVCC(19, 193, 0, 0)
3940
3941 case ADCBF:
3942 return OPVCC(31, 86, 0, 0)
3943 case ADCBI:
3944 return OPVCC(31, 470, 0, 0)
3945 case ADCBST:
3946 return OPVCC(31, 54, 0, 0)
3947 case ADCBT:
3948 return OPVCC(31, 278, 0, 0)
3949 case ADCBTST:
3950 return OPVCC(31, 246, 0, 0)
3951 case ADCBZ:
3952 return OPVCC(31, 1014, 0, 0)
3953
3954 case AMODUD:
3955 return OPVCC(31, 265, 0, 0)
3956 case AMODUW:
3957 return OPVCC(31, 267, 0, 0)
3958 case AMODSD:
3959 return OPVCC(31, 777, 0, 0)
3960 case AMODSW:
3961 return OPVCC(31, 779, 0, 0)
3962
3963 case ADIVW, AREM:
3964 return OPVCC(31, 491, 0, 0)
3965
3966 case ADIVWCC:
3967 return OPVCC(31, 491, 0, 1)
3968
3969 case ADIVWV:
3970 return OPVCC(31, 491, 1, 0)
3971
3972 case ADIVWVCC:
3973 return OPVCC(31, 491, 1, 1)
3974
3975 case ADIVWU, AREMU:
3976 return OPVCC(31, 459, 0, 0)
3977
3978 case ADIVWUCC:
3979 return OPVCC(31, 459, 0, 1)
3980
3981 case ADIVWUV:
3982 return OPVCC(31, 459, 1, 0)
3983
3984 case ADIVWUVCC:
3985 return OPVCC(31, 459, 1, 1)
3986
3987 case ADIVD, AREMD:
3988 return OPVCC(31, 489, 0, 0)
3989
3990 case ADIVDCC:
3991 return OPVCC(31, 489, 0, 1)
3992
3993 case ADIVDE:
3994 return OPVCC(31, 425, 0, 0)
3995
3996 case ADIVDECC:
3997 return OPVCC(31, 425, 0, 1)
3998
3999 case ADIVDEU:
4000 return OPVCC(31, 393, 0, 0)
4001
4002 case ADIVDEUCC:
4003 return OPVCC(31, 393, 0, 1)
4004
4005 case ADIVDV:
4006 return OPVCC(31, 489, 1, 0)
4007
4008 case ADIVDVCC:
4009 return OPVCC(31, 489, 1, 1)
4010
4011 case ADIVDU, AREMDU:
4012 return OPVCC(31, 457, 0, 0)
4013
4014 case ADIVDUCC:
4015 return OPVCC(31, 457, 0, 1)
4016
4017 case ADIVDUV:
4018 return OPVCC(31, 457, 1, 0)
4019
4020 case ADIVDUVCC:
4021 return OPVCC(31, 457, 1, 1)
4022
4023 case AEIEIO:
4024 return OPVCC(31, 854, 0, 0)
4025
4026 case AEQV:
4027 return OPVCC(31, 284, 0, 0)
4028 case AEQVCC:
4029 return OPVCC(31, 284, 0, 1)
4030
4031 case AEXTSB:
4032 return OPVCC(31, 954, 0, 0)
4033 case AEXTSBCC:
4034 return OPVCC(31, 954, 0, 1)
4035 case AEXTSH:
4036 return OPVCC(31, 922, 0, 0)
4037 case AEXTSHCC:
4038 return OPVCC(31, 922, 0, 1)
4039 case AEXTSW:
4040 return OPVCC(31, 986, 0, 0)
4041 case AEXTSWCC:
4042 return OPVCC(31, 986, 0, 1)
4043
4044 case AFABS:
4045 return OPVCC(63, 264, 0, 0)
4046 case AFABSCC:
4047 return OPVCC(63, 264, 0, 1)
4048 case AFADD:
4049 return OPVCC(63, 21, 0, 0)
4050 case AFADDCC:
4051 return OPVCC(63, 21, 0, 1)
4052 case AFADDS:
4053 return OPVCC(59, 21, 0, 0)
4054 case AFADDSCC:
4055 return OPVCC(59, 21, 0, 1)
4056 case AFCMPO:
4057 return OPVCC(63, 32, 0, 0)
4058 case AFCMPU:
4059 return OPVCC(63, 0, 0, 0)
4060 case AFCFID:
4061 return OPVCC(63, 846, 0, 0)
4062 case AFCFIDCC:
4063 return OPVCC(63, 846, 0, 1)
4064 case AFCFIDU:
4065 return OPVCC(63, 974, 0, 0)
4066 case AFCFIDUCC:
4067 return OPVCC(63, 974, 0, 1)
4068 case AFCFIDS:
4069 return OPVCC(59, 846, 0, 0)
4070 case AFCFIDSCC:
4071 return OPVCC(59, 846, 0, 1)
4072 case AFCTIW:
4073 return OPVCC(63, 14, 0, 0)
4074 case AFCTIWCC:
4075 return OPVCC(63, 14, 0, 1)
4076 case AFCTIWZ:
4077 return OPVCC(63, 15, 0, 0)
4078 case AFCTIWZCC:
4079 return OPVCC(63, 15, 0, 1)
4080 case AFCTID:
4081 return OPVCC(63, 814, 0, 0)
4082 case AFCTIDCC:
4083 return OPVCC(63, 814, 0, 1)
4084 case AFCTIDZ:
4085 return OPVCC(63, 815, 0, 0)
4086 case AFCTIDZCC:
4087 return OPVCC(63, 815, 0, 1)
4088 case AFDIV:
4089 return OPVCC(63, 18, 0, 0)
4090 case AFDIVCC:
4091 return OPVCC(63, 18, 0, 1)
4092 case AFDIVS:
4093 return OPVCC(59, 18, 0, 0)
4094 case AFDIVSCC:
4095 return OPVCC(59, 18, 0, 1)
4096 case AFMADD:
4097 return OPVCC(63, 29, 0, 0)
4098 case AFMADDCC:
4099 return OPVCC(63, 29, 0, 1)
4100 case AFMADDS:
4101 return OPVCC(59, 29, 0, 0)
4102 case AFMADDSCC:
4103 return OPVCC(59, 29, 0, 1)
4104
4105 case AFMOVS, AFMOVD:
4106 return OPVCC(63, 72, 0, 0)
4107 case AFMOVDCC:
4108 return OPVCC(63, 72, 0, 1)
4109 case AFMSUB:
4110 return OPVCC(63, 28, 0, 0)
4111 case AFMSUBCC:
4112 return OPVCC(63, 28, 0, 1)
4113 case AFMSUBS:
4114 return OPVCC(59, 28, 0, 0)
4115 case AFMSUBSCC:
4116 return OPVCC(59, 28, 0, 1)
4117 case AFMUL:
4118 return OPVCC(63, 25, 0, 0)
4119 case AFMULCC:
4120 return OPVCC(63, 25, 0, 1)
4121 case AFMULS:
4122 return OPVCC(59, 25, 0, 0)
4123 case AFMULSCC:
4124 return OPVCC(59, 25, 0, 1)
4125 case AFNABS:
4126 return OPVCC(63, 136, 0, 0)
4127 case AFNABSCC:
4128 return OPVCC(63, 136, 0, 1)
4129 case AFNEG:
4130 return OPVCC(63, 40, 0, 0)
4131 case AFNEGCC:
4132 return OPVCC(63, 40, 0, 1)
4133 case AFNMADD:
4134 return OPVCC(63, 31, 0, 0)
4135 case AFNMADDCC:
4136 return OPVCC(63, 31, 0, 1)
4137 case AFNMADDS:
4138 return OPVCC(59, 31, 0, 0)
4139 case AFNMADDSCC:
4140 return OPVCC(59, 31, 0, 1)
4141 case AFNMSUB:
4142 return OPVCC(63, 30, 0, 0)
4143 case AFNMSUBCC:
4144 return OPVCC(63, 30, 0, 1)
4145 case AFNMSUBS:
4146 return OPVCC(59, 30, 0, 0)
4147 case AFNMSUBSCC:
4148 return OPVCC(59, 30, 0, 1)
4149 case AFCPSGN:
4150 return OPVCC(63, 8, 0, 0)
4151 case AFCPSGNCC:
4152 return OPVCC(63, 8, 0, 1)
4153 case AFRES:
4154 return OPVCC(59, 24, 0, 0)
4155 case AFRESCC:
4156 return OPVCC(59, 24, 0, 1)
4157 case AFRIM:
4158 return OPVCC(63, 488, 0, 0)
4159 case AFRIMCC:
4160 return OPVCC(63, 488, 0, 1)
4161 case AFRIP:
4162 return OPVCC(63, 456, 0, 0)
4163 case AFRIPCC:
4164 return OPVCC(63, 456, 0, 1)
4165 case AFRIZ:
4166 return OPVCC(63, 424, 0, 0)
4167 case AFRIZCC:
4168 return OPVCC(63, 424, 0, 1)
4169 case AFRIN:
4170 return OPVCC(63, 392, 0, 0)
4171 case AFRINCC:
4172 return OPVCC(63, 392, 0, 1)
4173 case AFRSP:
4174 return OPVCC(63, 12, 0, 0)
4175 case AFRSPCC:
4176 return OPVCC(63, 12, 0, 1)
4177 case AFRSQRTE:
4178 return OPVCC(63, 26, 0, 0)
4179 case AFRSQRTECC:
4180 return OPVCC(63, 26, 0, 1)
4181 case AFSEL:
4182 return OPVCC(63, 23, 0, 0)
4183 case AFSELCC:
4184 return OPVCC(63, 23, 0, 1)
4185 case AFSQRT:
4186 return OPVCC(63, 22, 0, 0)
4187 case AFSQRTCC:
4188 return OPVCC(63, 22, 0, 1)
4189 case AFSQRTS:
4190 return OPVCC(59, 22, 0, 0)
4191 case AFSQRTSCC:
4192 return OPVCC(59, 22, 0, 1)
4193 case AFSUB:
4194 return OPVCC(63, 20, 0, 0)
4195 case AFSUBCC:
4196 return OPVCC(63, 20, 0, 1)
4197 case AFSUBS:
4198 return OPVCC(59, 20, 0, 0)
4199 case AFSUBSCC:
4200 return OPVCC(59, 20, 0, 1)
4201
4202 case AICBI:
4203 return OPVCC(31, 982, 0, 0)
4204 case AISYNC:
4205 return OPVCC(19, 150, 0, 0)
4206
4207 case AMTFSB0:
4208 return OPVCC(63, 70, 0, 0)
4209 case AMTFSB0CC:
4210 return OPVCC(63, 70, 0, 1)
4211 case AMTFSB1:
4212 return OPVCC(63, 38, 0, 0)
4213 case AMTFSB1CC:
4214 return OPVCC(63, 38, 0, 1)
4215
4216 case AMULHW:
4217 return OPVCC(31, 75, 0, 0)
4218 case AMULHWCC:
4219 return OPVCC(31, 75, 0, 1)
4220 case AMULHWU:
4221 return OPVCC(31, 11, 0, 0)
4222 case AMULHWUCC:
4223 return OPVCC(31, 11, 0, 1)
4224 case AMULLW:
4225 return OPVCC(31, 235, 0, 0)
4226 case AMULLWCC:
4227 return OPVCC(31, 235, 0, 1)
4228 case AMULLWV:
4229 return OPVCC(31, 235, 1, 0)
4230 case AMULLWVCC:
4231 return OPVCC(31, 235, 1, 1)
4232
4233 case AMULHD:
4234 return OPVCC(31, 73, 0, 0)
4235 case AMULHDCC:
4236 return OPVCC(31, 73, 0, 1)
4237 case AMULHDU:
4238 return OPVCC(31, 9, 0, 0)
4239 case AMULHDUCC:
4240 return OPVCC(31, 9, 0, 1)
4241 case AMULLD:
4242 return OPVCC(31, 233, 0, 0)
4243 case AMULLDCC:
4244 return OPVCC(31, 233, 0, 1)
4245 case AMULLDV:
4246 return OPVCC(31, 233, 1, 0)
4247 case AMULLDVCC:
4248 return OPVCC(31, 233, 1, 1)
4249
4250 case ANAND:
4251 return OPVCC(31, 476, 0, 0)
4252 case ANANDCC:
4253 return OPVCC(31, 476, 0, 1)
4254 case ANEG:
4255 return OPVCC(31, 104, 0, 0)
4256 case ANEGCC:
4257 return OPVCC(31, 104, 0, 1)
4258 case ANEGV:
4259 return OPVCC(31, 104, 1, 0)
4260 case ANEGVCC:
4261 return OPVCC(31, 104, 1, 1)
4262 case ANOR:
4263 return OPVCC(31, 124, 0, 0)
4264 case ANORCC:
4265 return OPVCC(31, 124, 0, 1)
4266 case AOR:
4267 return OPVCC(31, 444, 0, 0)
4268 case AORCC:
4269 return OPVCC(31, 444, 0, 1)
4270 case AORN:
4271 return OPVCC(31, 412, 0, 0)
4272 case AORNCC:
4273 return OPVCC(31, 412, 0, 1)
4274
4275 case APOPCNTD:
4276 return OPVCC(31, 506, 0, 0)
4277 case APOPCNTW:
4278 return OPVCC(31, 378, 0, 0)
4279 case APOPCNTB:
4280 return OPVCC(31, 122, 0, 0)
4281 case ACNTTZW:
4282 return OPVCC(31, 538, 0, 0)
4283 case ACNTTZWCC:
4284 return OPVCC(31, 538, 0, 1)
4285 case ACNTTZD:
4286 return OPVCC(31, 570, 0, 0)
4287 case ACNTTZDCC:
4288 return OPVCC(31, 570, 0, 1)
4289
4290 case ARFI:
4291 return OPVCC(19, 50, 0, 0)
4292 case ARFCI:
4293 return OPVCC(19, 51, 0, 0)
4294 case ARFID:
4295 return OPVCC(19, 18, 0, 0)
4296 case AHRFID:
4297 return OPVCC(19, 274, 0, 0)
4298
4299 case ARLWMI:
4300 return OPVCC(20, 0, 0, 0)
4301 case ARLWMICC:
4302 return OPVCC(20, 0, 0, 1)
4303 case ARLWNM:
4304 return OPVCC(23, 0, 0, 0)
4305 case ARLWNMCC:
4306 return OPVCC(23, 0, 0, 1)
4307
4308 case ARLDCL:
4309 return OPVCC(30, 8, 0, 0)
4310 case ARLDCLCC:
4311 return OPVCC(30, 0, 0, 1)
4312
4313 case ARLDCR:
4314 return OPVCC(30, 9, 0, 0)
4315 case ARLDCRCC:
4316 return OPVCC(30, 9, 0, 1)
4317
4318 case ARLDICL:
4319 return OPVCC(30, 0, 0, 0)
4320 case ARLDICLCC:
4321 return OPVCC(30, 0, 0, 1)
4322 case ARLDICR:
4323 return OPVCC(30, 0, 0, 0) | 2<<1
4324 case ARLDICRCC:
4325 return OPVCC(30, 0, 0, 1) | 2<<1
4326
4327 case ARLDIC:
4328 return OPVCC(30, 0, 0, 0) | 4<<1
4329 case ARLDICCC:
4330 return OPVCC(30, 0, 0, 1) | 4<<1
4331
4332 case ASYSCALL:
4333 return OPVCC(17, 1, 0, 0)
4334
4335 case ASLW:
4336 return OPVCC(31, 24, 0, 0)
4337 case ASLWCC:
4338 return OPVCC(31, 24, 0, 1)
4339 case ASLD:
4340 return OPVCC(31, 27, 0, 0)
4341 case ASLDCC:
4342 return OPVCC(31, 27, 0, 1)
4343
4344 case ASRAW:
4345 return OPVCC(31, 792, 0, 0)
4346 case ASRAWCC:
4347 return OPVCC(31, 792, 0, 1)
4348 case ASRAD:
4349 return OPVCC(31, 794, 0, 0)
4350 case ASRADCC:
4351 return OPVCC(31, 794, 0, 1)
4352
4353 case ASRW:
4354 return OPVCC(31, 536, 0, 0)
4355 case ASRWCC:
4356 return OPVCC(31, 536, 0, 1)
4357 case ASRD:
4358 return OPVCC(31, 539, 0, 0)
4359 case ASRDCC:
4360 return OPVCC(31, 539, 0, 1)
4361
4362 case ASUB:
4363 return OPVCC(31, 40, 0, 0)
4364 case ASUBCC:
4365 return OPVCC(31, 40, 0, 1)
4366 case ASUBV:
4367 return OPVCC(31, 40, 1, 0)
4368 case ASUBVCC:
4369 return OPVCC(31, 40, 1, 1)
4370 case ASUBC:
4371 return OPVCC(31, 8, 0, 0)
4372 case ASUBCCC:
4373 return OPVCC(31, 8, 0, 1)
4374 case ASUBCV:
4375 return OPVCC(31, 8, 1, 0)
4376 case ASUBCVCC:
4377 return OPVCC(31, 8, 1, 1)
4378 case ASUBE:
4379 return OPVCC(31, 136, 0, 0)
4380 case ASUBECC:
4381 return OPVCC(31, 136, 0, 1)
4382 case ASUBEV:
4383 return OPVCC(31, 136, 1, 0)
4384 case ASUBEVCC:
4385 return OPVCC(31, 136, 1, 1)
4386 case ASUBME:
4387 return OPVCC(31, 232, 0, 0)
4388 case ASUBMECC:
4389 return OPVCC(31, 232, 0, 1)
4390 case ASUBMEV:
4391 return OPVCC(31, 232, 1, 0)
4392 case ASUBMEVCC:
4393 return OPVCC(31, 232, 1, 1)
4394 case ASUBZE:
4395 return OPVCC(31, 200, 0, 0)
4396 case ASUBZECC:
4397 return OPVCC(31, 200, 0, 1)
4398 case ASUBZEV:
4399 return OPVCC(31, 200, 1, 0)
4400 case ASUBZEVCC:
4401 return OPVCC(31, 200, 1, 1)
4402
4403 case ASYNC:
4404 return OPVCC(31, 598, 0, 0)
4405 case ALWSYNC:
4406 return OPVCC(31, 598, 0, 0) | 1<<21
4407
4408 case APTESYNC:
4409 return OPVCC(31, 598, 0, 0) | 2<<21
4410
4411 case ATLBIE:
4412 return OPVCC(31, 306, 0, 0)
4413 case ATLBIEL:
4414 return OPVCC(31, 274, 0, 0)
4415 case ATLBSYNC:
4416 return OPVCC(31, 566, 0, 0)
4417 case ASLBIA:
4418 return OPVCC(31, 498, 0, 0)
4419 case ASLBIE:
4420 return OPVCC(31, 434, 0, 0)
4421 case ASLBMFEE:
4422 return OPVCC(31, 915, 0, 0)
4423 case ASLBMFEV:
4424 return OPVCC(31, 851, 0, 0)
4425 case ASLBMTE:
4426 return OPVCC(31, 402, 0, 0)
4427
4428 case ATW:
4429 return OPVCC(31, 4, 0, 0)
4430 case ATD:
4431 return OPVCC(31, 68, 0, 0)
4432
4433
4434
4435
4436 case AVAND:
4437 return OPVX(4, 1028, 0, 0)
4438 case AVANDC:
4439 return OPVX(4, 1092, 0, 0)
4440 case AVNAND:
4441 return OPVX(4, 1412, 0, 0)
4442
4443 case AVOR:
4444 return OPVX(4, 1156, 0, 0)
4445 case AVORC:
4446 return OPVX(4, 1348, 0, 0)
4447 case AVNOR:
4448 return OPVX(4, 1284, 0, 0)
4449 case AVXOR:
4450 return OPVX(4, 1220, 0, 0)
4451 case AVEQV:
4452 return OPVX(4, 1668, 0, 0)
4453
4454 case AVADDUBM:
4455 return OPVX(4, 0, 0, 0)
4456 case AVADDUHM:
4457 return OPVX(4, 64, 0, 0)
4458 case AVADDUWM:
4459 return OPVX(4, 128, 0, 0)
4460 case AVADDUDM:
4461 return OPVX(4, 192, 0, 0)
4462 case AVADDUQM:
4463 return OPVX(4, 256, 0, 0)
4464
4465 case AVADDCUQ:
4466 return OPVX(4, 320, 0, 0)
4467 case AVADDCUW:
4468 return OPVX(4, 384, 0, 0)
4469
4470 case AVADDUBS:
4471 return OPVX(4, 512, 0, 0)
4472 case AVADDUHS:
4473 return OPVX(4, 576, 0, 0)
4474 case AVADDUWS:
4475 return OPVX(4, 640, 0, 0)
4476
4477 case AVADDSBS:
4478 return OPVX(4, 768, 0, 0)
4479 case AVADDSHS:
4480 return OPVX(4, 832, 0, 0)
4481 case AVADDSWS:
4482 return OPVX(4, 896, 0, 0)
4483
4484 case AVADDEUQM:
4485 return OPVX(4, 60, 0, 0)
4486 case AVADDECUQ:
4487 return OPVX(4, 61, 0, 0)
4488
4489 case AVMULESB:
4490 return OPVX(4, 776, 0, 0)
4491 case AVMULOSB:
4492 return OPVX(4, 264, 0, 0)
4493 case AVMULEUB:
4494 return OPVX(4, 520, 0, 0)
4495 case AVMULOUB:
4496 return OPVX(4, 8, 0, 0)
4497 case AVMULESH:
4498 return OPVX(4, 840, 0, 0)
4499 case AVMULOSH:
4500 return OPVX(4, 328, 0, 0)
4501 case AVMULEUH:
4502 return OPVX(4, 584, 0, 0)
4503 case AVMULOUH:
4504 return OPVX(4, 72, 0, 0)
4505 case AVMULESW:
4506 return OPVX(4, 904, 0, 0)
4507 case AVMULOSW:
4508 return OPVX(4, 392, 0, 0)
4509 case AVMULEUW:
4510 return OPVX(4, 648, 0, 0)
4511 case AVMULOUW:
4512 return OPVX(4, 136, 0, 0)
4513 case AVMULUWM:
4514 return OPVX(4, 137, 0, 0)
4515
4516 case AVPMSUMB:
4517 return OPVX(4, 1032, 0, 0)
4518 case AVPMSUMH:
4519 return OPVX(4, 1096, 0, 0)
4520 case AVPMSUMW:
4521 return OPVX(4, 1160, 0, 0)
4522 case AVPMSUMD:
4523 return OPVX(4, 1224, 0, 0)
4524
4525 case AVMSUMUDM:
4526 return OPVX(4, 35, 0, 0)
4527
4528 case AVSUBUBM:
4529 return OPVX(4, 1024, 0, 0)
4530 case AVSUBUHM:
4531 return OPVX(4, 1088, 0, 0)
4532 case AVSUBUWM:
4533 return OPVX(4, 1152, 0, 0)
4534 case AVSUBUDM:
4535 return OPVX(4, 1216, 0, 0)
4536 case AVSUBUQM:
4537 return OPVX(4, 1280, 0, 0)
4538
4539 case AVSUBCUQ:
4540 return OPVX(4, 1344, 0, 0)
4541 case AVSUBCUW:
4542 return OPVX(4, 1408, 0, 0)
4543
4544 case AVSUBUBS:
4545 return OPVX(4, 1536, 0, 0)
4546 case AVSUBUHS:
4547 return OPVX(4, 1600, 0, 0)
4548 case AVSUBUWS:
4549 return OPVX(4, 1664, 0, 0)
4550
4551 case AVSUBSBS:
4552 return OPVX(4, 1792, 0, 0)
4553 case AVSUBSHS:
4554 return OPVX(4, 1856, 0, 0)
4555 case AVSUBSWS:
4556 return OPVX(4, 1920, 0, 0)
4557
4558 case AVSUBEUQM:
4559 return OPVX(4, 62, 0, 0)
4560 case AVSUBECUQ:
4561 return OPVX(4, 63, 0, 0)
4562
4563 case AVRLB:
4564 return OPVX(4, 4, 0, 0)
4565 case AVRLH:
4566 return OPVX(4, 68, 0, 0)
4567 case AVRLW:
4568 return OPVX(4, 132, 0, 0)
4569 case AVRLD:
4570 return OPVX(4, 196, 0, 0)
4571
4572 case AVMRGOW:
4573 return OPVX(4, 1676, 0, 0)
4574 case AVMRGEW:
4575 return OPVX(4, 1932, 0, 0)
4576
4577 case AVSLB:
4578 return OPVX(4, 260, 0, 0)
4579 case AVSLH:
4580 return OPVX(4, 324, 0, 0)
4581 case AVSLW:
4582 return OPVX(4, 388, 0, 0)
4583 case AVSL:
4584 return OPVX(4, 452, 0, 0)
4585 case AVSLO:
4586 return OPVX(4, 1036, 0, 0)
4587 case AVSRB:
4588 return OPVX(4, 516, 0, 0)
4589 case AVSRH:
4590 return OPVX(4, 580, 0, 0)
4591 case AVSRW:
4592 return OPVX(4, 644, 0, 0)
4593 case AVSR:
4594 return OPVX(4, 708, 0, 0)
4595 case AVSRO:
4596 return OPVX(4, 1100, 0, 0)
4597 case AVSLD:
4598 return OPVX(4, 1476, 0, 0)
4599 case AVSRD:
4600 return OPVX(4, 1732, 0, 0)
4601
4602 case AVSRAB:
4603 return OPVX(4, 772, 0, 0)
4604 case AVSRAH:
4605 return OPVX(4, 836, 0, 0)
4606 case AVSRAW:
4607 return OPVX(4, 900, 0, 0)
4608 case AVSRAD:
4609 return OPVX(4, 964, 0, 0)
4610
4611 case AVBPERMQ:
4612 return OPVC(4, 1356, 0, 0)
4613 case AVBPERMD:
4614 return OPVC(4, 1484, 0, 0)
4615
4616 case AVCLZB:
4617 return OPVX(4, 1794, 0, 0)
4618 case AVCLZH:
4619 return OPVX(4, 1858, 0, 0)
4620 case AVCLZW:
4621 return OPVX(4, 1922, 0, 0)
4622 case AVCLZD:
4623 return OPVX(4, 1986, 0, 0)
4624
4625 case AVPOPCNTB:
4626 return OPVX(4, 1795, 0, 0)
4627 case AVPOPCNTH:
4628 return OPVX(4, 1859, 0, 0)
4629 case AVPOPCNTW:
4630 return OPVX(4, 1923, 0, 0)
4631 case AVPOPCNTD:
4632 return OPVX(4, 1987, 0, 0)
4633
4634 case AVCMPEQUB:
4635 return OPVC(4, 6, 0, 0)
4636 case AVCMPEQUBCC:
4637 return OPVC(4, 6, 0, 1)
4638 case AVCMPEQUH:
4639 return OPVC(4, 70, 0, 0)
4640 case AVCMPEQUHCC:
4641 return OPVC(4, 70, 0, 1)
4642 case AVCMPEQUW:
4643 return OPVC(4, 134, 0, 0)
4644 case AVCMPEQUWCC:
4645 return OPVC(4, 134, 0, 1)
4646 case AVCMPEQUD:
4647 return OPVC(4, 199, 0, 0)
4648 case AVCMPEQUDCC:
4649 return OPVC(4, 199, 0, 1)
4650
4651 case AVCMPGTUB:
4652 return OPVC(4, 518, 0, 0)
4653 case AVCMPGTUBCC:
4654 return OPVC(4, 518, 0, 1)
4655 case AVCMPGTUH:
4656 return OPVC(4, 582, 0, 0)
4657 case AVCMPGTUHCC:
4658 return OPVC(4, 582, 0, 1)
4659 case AVCMPGTUW:
4660 return OPVC(4, 646, 0, 0)
4661 case AVCMPGTUWCC:
4662 return OPVC(4, 646, 0, 1)
4663 case AVCMPGTUD:
4664 return OPVC(4, 711, 0, 0)
4665 case AVCMPGTUDCC:
4666 return OPVC(4, 711, 0, 1)
4667 case AVCMPGTSB:
4668 return OPVC(4, 774, 0, 0)
4669 case AVCMPGTSBCC:
4670 return OPVC(4, 774, 0, 1)
4671 case AVCMPGTSH:
4672 return OPVC(4, 838, 0, 0)
4673 case AVCMPGTSHCC:
4674 return OPVC(4, 838, 0, 1)
4675 case AVCMPGTSW:
4676 return OPVC(4, 902, 0, 0)
4677 case AVCMPGTSWCC:
4678 return OPVC(4, 902, 0, 1)
4679 case AVCMPGTSD:
4680 return OPVC(4, 967, 0, 0)
4681 case AVCMPGTSDCC:
4682 return OPVC(4, 967, 0, 1)
4683
4684 case AVCMPNEZB:
4685 return OPVC(4, 263, 0, 0)
4686 case AVCMPNEZBCC:
4687 return OPVC(4, 263, 0, 1)
4688 case AVCMPNEB:
4689 return OPVC(4, 7, 0, 0)
4690 case AVCMPNEBCC:
4691 return OPVC(4, 7, 0, 1)
4692 case AVCMPNEH:
4693 return OPVC(4, 71, 0, 0)
4694 case AVCMPNEHCC:
4695 return OPVC(4, 71, 0, 1)
4696 case AVCMPNEW:
4697 return OPVC(4, 135, 0, 0)
4698 case AVCMPNEWCC:
4699 return OPVC(4, 135, 0, 1)
4700
4701 case AVPERM:
4702 return OPVX(4, 43, 0, 0)
4703 case AVPERMXOR:
4704 return OPVX(4, 45, 0, 0)
4705 case AVPERMR:
4706 return OPVX(4, 59, 0, 0)
4707
4708 case AVSEL:
4709 return OPVX(4, 42, 0, 0)
4710
4711 case AVCIPHER:
4712 return OPVX(4, 1288, 0, 0)
4713 case AVCIPHERLAST:
4714 return OPVX(4, 1289, 0, 0)
4715 case AVNCIPHER:
4716 return OPVX(4, 1352, 0, 0)
4717 case AVNCIPHERLAST:
4718 return OPVX(4, 1353, 0, 0)
4719 case AVSBOX:
4720 return OPVX(4, 1480, 0, 0)
4721
4722
4723
4724
4725 case AMFVSRD, AMFVRD, AMFFPRD:
4726 return OPVXX1(31, 51, 0)
4727 case AMFVSRWZ:
4728 return OPVXX1(31, 115, 0)
4729 case AMFVSRLD:
4730 return OPVXX1(31, 307, 0)
4731
4732 case AMTVSRD, AMTFPRD, AMTVRD:
4733 return OPVXX1(31, 179, 0)
4734 case AMTVSRWA:
4735 return OPVXX1(31, 211, 0)
4736 case AMTVSRWZ:
4737 return OPVXX1(31, 243, 0)
4738 case AMTVSRDD:
4739 return OPVXX1(31, 435, 0)
4740 case AMTVSRWS:
4741 return OPVXX1(31, 403, 0)
4742
4743 case AXXLAND:
4744 return OPVXX3(60, 130, 0)
4745 case AXXLANDC:
4746 return OPVXX3(60, 138, 0)
4747 case AXXLEQV:
4748 return OPVXX3(60, 186, 0)
4749 case AXXLNAND:
4750 return OPVXX3(60, 178, 0)
4751
4752 case AXXLORC:
4753 return OPVXX3(60, 170, 0)
4754 case AXXLNOR:
4755 return OPVXX3(60, 162, 0)
4756 case AXXLOR, AXXLORQ:
4757 return OPVXX3(60, 146, 0)
4758 case AXXLXOR:
4759 return OPVXX3(60, 154, 0)
4760
4761 case AXXSEL:
4762 return OPVXX4(60, 3, 0)
4763
4764 case AXXMRGHW:
4765 return OPVXX3(60, 18, 0)
4766 case AXXMRGLW:
4767 return OPVXX3(60, 50, 0)
4768
4769 case AXXSPLTW:
4770 return OPVXX2(60, 164, 0)
4771
4772 case AXXSPLTIB:
4773 return OPVCC(60, 360, 0, 0)
4774
4775 case AXXPERM:
4776 return OPVXX3(60, 26, 0)
4777 case AXXPERMDI:
4778 return OPVXX3(60, 10, 0)
4779
4780 case AXXSLDWI:
4781 return OPVXX3(60, 2, 0)
4782
4783 case AXXBRQ:
4784 return OPVXX2VA(60, 475, 31)
4785 case AXXBRD:
4786 return OPVXX2VA(60, 475, 23)
4787 case AXXBRW:
4788 return OPVXX2VA(60, 475, 15)
4789 case AXXBRH:
4790 return OPVXX2VA(60, 475, 7)
4791
4792 case AXSCVDPSP:
4793 return OPVXX2(60, 265, 0)
4794 case AXSCVSPDP:
4795 return OPVXX2(60, 329, 0)
4796 case AXSCVDPSPN:
4797 return OPVXX2(60, 267, 0)
4798 case AXSCVSPDPN:
4799 return OPVXX2(60, 331, 0)
4800
4801 case AXVCVDPSP:
4802 return OPVXX2(60, 393, 0)
4803 case AXVCVSPDP:
4804 return OPVXX2(60, 457, 0)
4805
4806 case AXSCVDPSXDS:
4807 return OPVXX2(60, 344, 0)
4808 case AXSCVDPSXWS:
4809 return OPVXX2(60, 88, 0)
4810 case AXSCVDPUXDS:
4811 return OPVXX2(60, 328, 0)
4812 case AXSCVDPUXWS:
4813 return OPVXX2(60, 72, 0)
4814
4815 case AXSCVSXDDP:
4816 return OPVXX2(60, 376, 0)
4817 case AXSCVUXDDP:
4818 return OPVXX2(60, 360, 0)
4819 case AXSCVSXDSP:
4820 return OPVXX2(60, 312, 0)
4821 case AXSCVUXDSP:
4822 return OPVXX2(60, 296, 0)
4823
4824 case AXVCVDPSXDS:
4825 return OPVXX2(60, 472, 0)
4826 case AXVCVDPSXWS:
4827 return OPVXX2(60, 216, 0)
4828 case AXVCVDPUXDS:
4829 return OPVXX2(60, 456, 0)
4830 case AXVCVDPUXWS:
4831 return OPVXX2(60, 200, 0)
4832 case AXVCVSPSXDS:
4833 return OPVXX2(60, 408, 0)
4834 case AXVCVSPSXWS:
4835 return OPVXX2(60, 152, 0)
4836 case AXVCVSPUXDS:
4837 return OPVXX2(60, 392, 0)
4838 case AXVCVSPUXWS:
4839 return OPVXX2(60, 136, 0)
4840
4841 case AXVCVSXDDP:
4842 return OPVXX2(60, 504, 0)
4843 case AXVCVSXWDP:
4844 return OPVXX2(60, 248, 0)
4845 case AXVCVUXDDP:
4846 return OPVXX2(60, 488, 0)
4847 case AXVCVUXWDP:
4848 return OPVXX2(60, 232, 0)
4849 case AXVCVSXDSP:
4850 return OPVXX2(60, 440, 0)
4851 case AXVCVSXWSP:
4852 return OPVXX2(60, 184, 0)
4853 case AXVCVUXDSP:
4854 return OPVXX2(60, 424, 0)
4855 case AXVCVUXWSP:
4856 return OPVXX2(60, 168, 0)
4857
4858
4859 case AMADDHD:
4860 return OPVX(4, 48, 0, 0)
4861 case AMADDHDU:
4862 return OPVX(4, 49, 0, 0)
4863 case AMADDLD:
4864 return OPVX(4, 51, 0, 0)
4865
4866 case AXOR:
4867 return OPVCC(31, 316, 0, 0)
4868 case AXORCC:
4869 return OPVCC(31, 316, 0, 1)
4870 }
4871
4872 c.ctxt.Diag("bad r/r, r/r/r or r/r/r/r opcode %v", a)
4873 return 0
4874 }
4875
4876 func (c *ctxt9) opirrr(a obj.As) uint32 {
4877 switch a {
4878
4879
4880
4881 case AVSLDOI:
4882 return OPVX(4, 44, 0, 0)
4883 }
4884
4885 c.ctxt.Diag("bad i/r/r/r opcode %v", a)
4886 return 0
4887 }
4888
4889 func (c *ctxt9) opiirr(a obj.As) uint32 {
4890 switch a {
4891
4892
4893 case AVSHASIGMAW:
4894 return OPVX(4, 1666, 0, 0)
4895 case AVSHASIGMAD:
4896 return OPVX(4, 1730, 0, 0)
4897 }
4898
4899 c.ctxt.Diag("bad i/i/r/r opcode %v", a)
4900 return 0
4901 }
4902
4903 func (c *ctxt9) opirr(a obj.As) uint32 {
4904 switch a {
4905 case AADD:
4906 return OPVCC(14, 0, 0, 0)
4907 case AADDC:
4908 return OPVCC(12, 0, 0, 0)
4909 case AADDCCC:
4910 return OPVCC(13, 0, 0, 0)
4911 case AADDIS:
4912 return OPVCC(15, 0, 0, 0)
4913
4914 case AANDCC:
4915 return OPVCC(28, 0, 0, 0)
4916 case AANDISCC:
4917 return OPVCC(29, 0, 0, 0)
4918
4919 case ABR:
4920 return OPVCC(18, 0, 0, 0)
4921 case ABL:
4922 return OPVCC(18, 0, 0, 0) | 1
4923 case obj.ADUFFZERO:
4924 return OPVCC(18, 0, 0, 0) | 1
4925 case obj.ADUFFCOPY:
4926 return OPVCC(18, 0, 0, 0) | 1
4927 case ABC:
4928 return OPVCC(16, 0, 0, 0)
4929 case ABCL:
4930 return OPVCC(16, 0, 0, 0) | 1
4931
4932 case ABEQ:
4933 return AOP_RRR(16<<26, 12, 2, 0)
4934 case ABGE:
4935 return AOP_RRR(16<<26, 4, 0, 0)
4936 case ABGT:
4937 return AOP_RRR(16<<26, 12, 1, 0)
4938 case ABLE:
4939 return AOP_RRR(16<<26, 4, 1, 0)
4940 case ABLT:
4941 return AOP_RRR(16<<26, 12, 0, 0)
4942 case ABNE:
4943 return AOP_RRR(16<<26, 4, 2, 0)
4944 case ABVC:
4945 return AOP_RRR(16<<26, 4, 3, 0)
4946 case ABVS:
4947 return AOP_RRR(16<<26, 12, 3, 0)
4948
4949 case ACMP:
4950 return OPVCC(11, 0, 0, 0) | 1<<21
4951 case ACMPU:
4952 return OPVCC(10, 0, 0, 0) | 1<<21
4953 case ACMPW:
4954 return OPVCC(11, 0, 0, 0)
4955 case ACMPWU:
4956 return OPVCC(10, 0, 0, 0)
4957 case ACMPEQB:
4958 return OPVCC(31, 224, 0, 0)
4959
4960 case ALSW:
4961 return OPVCC(31, 597, 0, 0)
4962
4963 case ACOPY:
4964 return OPVCC(31, 774, 0, 0)
4965 case APASTECC:
4966 return OPVCC(31, 902, 0, 1)
4967 case ADARN:
4968 return OPVCC(31, 755, 0, 0)
4969
4970 case AMULLW:
4971 return OPVCC(7, 0, 0, 0)
4972
4973 case AOR:
4974 return OPVCC(24, 0, 0, 0)
4975 case AORIS:
4976 return OPVCC(25, 0, 0, 0)
4977
4978 case ARLWMI:
4979 return OPVCC(20, 0, 0, 0)
4980 case ARLWMICC:
4981 return OPVCC(20, 0, 0, 1)
4982 case ARLDMI:
4983 return OPVCC(30, 0, 0, 0) | 3<<2
4984 case ARLDMICC:
4985 return OPVCC(30, 0, 0, 1) | 3<<2
4986 case ARLDIMI:
4987 return OPVCC(30, 0, 0, 0) | 3<<2
4988 case ARLDIMICC:
4989 return OPVCC(30, 0, 0, 1) | 3<<2
4990 case ARLWNM:
4991 return OPVCC(21, 0, 0, 0)
4992 case ARLWNMCC:
4993 return OPVCC(21, 0, 0, 1)
4994
4995 case ARLDCL:
4996 return OPVCC(30, 0, 0, 0)
4997 case ARLDCLCC:
4998 return OPVCC(30, 0, 0, 1)
4999 case ARLDCR:
5000 return OPVCC(30, 1, 0, 0)
5001 case ARLDCRCC:
5002 return OPVCC(30, 1, 0, 1)
5003 case ARLDC:
5004 return OPVCC(30, 0, 0, 0) | 2<<2
5005 case ARLDCCC:
5006 return OPVCC(30, 0, 0, 1) | 2<<2
5007
5008 case ASRAW:
5009 return OPVCC(31, 824, 0, 0)
5010 case ASRAWCC:
5011 return OPVCC(31, 824, 0, 1)
5012 case ASRAD:
5013 return OPVCC(31, (413 << 1), 0, 0)
5014 case ASRADCC:
5015 return OPVCC(31, (413 << 1), 0, 1)
5016
5017 case ASTSW:
5018 return OPVCC(31, 725, 0, 0)
5019
5020 case ASUBC:
5021 return OPVCC(8, 0, 0, 0)
5022
5023 case ATW:
5024 return OPVCC(3, 0, 0, 0)
5025 case ATD:
5026 return OPVCC(2, 0, 0, 0)
5027
5028
5029
5030
5031 case AVSPLTB:
5032 return OPVX(4, 524, 0, 0)
5033 case AVSPLTH:
5034 return OPVX(4, 588, 0, 0)
5035 case AVSPLTW:
5036 return OPVX(4, 652, 0, 0)
5037
5038 case AVSPLTISB:
5039 return OPVX(4, 780, 0, 0)
5040 case AVSPLTISH:
5041 return OPVX(4, 844, 0, 0)
5042 case AVSPLTISW:
5043 return OPVX(4, 908, 0, 0)
5044
5045
5046 case AFTDIV:
5047 return OPVCC(63, 128, 0, 0)
5048 case AFTSQRT:
5049 return OPVCC(63, 160, 0, 0)
5050
5051 case AXOR:
5052 return OPVCC(26, 0, 0, 0)
5053 case AXORIS:
5054 return OPVCC(27, 0, 0, 0)
5055 }
5056
5057 c.ctxt.Diag("bad opcode i/r or i/r/r %v", a)
5058 return 0
5059 }
5060
5061
5064 func (c *ctxt9) opload(a obj.As) uint32 {
5065 switch a {
5066 case AMOVD:
5067 return OPVCC(58, 0, 0, 0)
5068 case AMOVDU:
5069 return OPVCC(58, 0, 0, 1)
5070 case AMOVWZ:
5071 return OPVCC(32, 0, 0, 0)
5072 case AMOVWZU:
5073 return OPVCC(33, 0, 0, 0)
5074 case AMOVW:
5075 return OPVCC(58, 0, 0, 0) | 1<<1
5076 case ALXV:
5077 return OPDQ(61, 1, 0)
5078 case ALXVL:
5079 return OPVXX1(31, 269, 0)
5080 case ALXVLL:
5081 return OPVXX1(31, 301, 0)
5082 case ALXVX:
5083 return OPVXX1(31, 268, 0)
5084
5085
5086 case AMOVB, AMOVBZ:
5087 return OPVCC(34, 0, 0, 0)
5088
5089
5090 case AMOVBU, AMOVBZU:
5091 return OPVCC(35, 0, 0, 0)
5092 case AFMOVD:
5093 return OPVCC(50, 0, 0, 0)
5094 case AFMOVDU:
5095 return OPVCC(51, 0, 0, 0)
5096 case AFMOVS:
5097 return OPVCC(48, 0, 0, 0)
5098 case AFMOVSU:
5099 return OPVCC(49, 0, 0, 0)
5100 case AMOVH:
5101 return OPVCC(42, 0, 0, 0)
5102 case AMOVHU:
5103 return OPVCC(43, 0, 0, 0)
5104 case AMOVHZ:
5105 return OPVCC(40, 0, 0, 0)
5106 case AMOVHZU:
5107 return OPVCC(41, 0, 0, 0)
5108 case AMOVMW:
5109 return OPVCC(46, 0, 0, 0)
5110 }
5111
5112 c.ctxt.Diag("bad load opcode %v", a)
5113 return 0
5114 }
5115
5116
5119 func (c *ctxt9) oploadx(a obj.As) uint32 {
5120 switch a {
5121 case AMOVWZ:
5122 return OPVCC(31, 23, 0, 0)
5123 case AMOVWZU:
5124 return OPVCC(31, 55, 0, 0)
5125 case AMOVW:
5126 return OPVCC(31, 341, 0, 0)
5127 case AMOVWU:
5128 return OPVCC(31, 373, 0, 0)
5129
5130 case AMOVB, AMOVBZ:
5131 return OPVCC(31, 87, 0, 0)
5132
5133 case AMOVBU, AMOVBZU:
5134 return OPVCC(31, 119, 0, 0)
5135 case AFMOVD:
5136 return OPVCC(31, 599, 0, 0)
5137 case AFMOVDU:
5138 return OPVCC(31, 631, 0, 0)
5139 case AFMOVS:
5140 return OPVCC(31, 535, 0, 0)
5141 case AFMOVSU:
5142 return OPVCC(31, 567, 0, 0)
5143 case AFMOVSX:
5144 return OPVCC(31, 855, 0, 0)
5145 case AFMOVSZ:
5146 return OPVCC(31, 887, 0, 0)
5147 case AMOVH:
5148 return OPVCC(31, 343, 0, 0)
5149 case AMOVHU:
5150 return OPVCC(31, 375, 0, 0)
5151 case AMOVHBR:
5152 return OPVCC(31, 790, 0, 0)
5153 case AMOVWBR:
5154 return OPVCC(31, 534, 0, 0)
5155 case AMOVDBR:
5156 return OPVCC(31, 532, 0, 0)
5157 case AMOVHZ:
5158 return OPVCC(31, 279, 0, 0)
5159 case AMOVHZU:
5160 return OPVCC(31, 311, 0, 0)
5161 case AECIWX:
5162 return OPVCC(31, 310, 0, 0)
5163 case ALBAR:
5164 return OPVCC(31, 52, 0, 0)
5165 case ALHAR:
5166 return OPVCC(31, 116, 0, 0)
5167 case ALWAR:
5168 return OPVCC(31, 20, 0, 0)
5169 case ALDAR:
5170 return OPVCC(31, 84, 0, 0)
5171 case ALSW:
5172 return OPVCC(31, 533, 0, 0)
5173 case AMOVD:
5174 return OPVCC(31, 21, 0, 0)
5175 case AMOVDU:
5176 return OPVCC(31, 53, 0, 0)
5177 case ALDMX:
5178 return OPVCC(31, 309, 0, 0)
5179
5180
5181 case ALVEBX:
5182 return OPVCC(31, 7, 0, 0)
5183 case ALVEHX:
5184 return OPVCC(31, 39, 0, 0)
5185 case ALVEWX:
5186 return OPVCC(31, 71, 0, 0)
5187 case ALVX:
5188 return OPVCC(31, 103, 0, 0)
5189 case ALVXL:
5190 return OPVCC(31, 359, 0, 0)
5191 case ALVSL:
5192 return OPVCC(31, 6, 0, 0)
5193 case ALVSR:
5194 return OPVCC(31, 38, 0, 0)
5195
5196
5197
5198 case ALXVX:
5199 return OPVXX1(31, 268, 0)
5200 case ALXVD2X:
5201 return OPVXX1(31, 844, 0)
5202 case ALXVW4X:
5203 return OPVXX1(31, 780, 0)
5204 case ALXVH8X:
5205 return OPVXX1(31, 812, 0)
5206 case ALXVB16X:
5207 return OPVXX1(31, 876, 0)
5208 case ALXVDSX:
5209 return OPVXX1(31, 332, 0)
5210 case ALXSDX:
5211 return OPVXX1(31, 588, 0)
5212 case ALXSIWAX:
5213 return OPVXX1(31, 76, 0)
5214 case ALXSIWZX:
5215 return OPVXX1(31, 12, 0)
5216 }
5217
5218 c.ctxt.Diag("bad loadx opcode %v", a)
5219 return 0
5220 }
5221
5222
5225 func (c *ctxt9) opstore(a obj.As) uint32 {
5226 switch a {
5227 case AMOVB, AMOVBZ:
5228 return OPVCC(38, 0, 0, 0)
5229
5230 case AMOVBU, AMOVBZU:
5231 return OPVCC(39, 0, 0, 0)
5232 case AFMOVD:
5233 return OPVCC(54, 0, 0, 0)
5234 case AFMOVDU:
5235 return OPVCC(55, 0, 0, 0)
5236 case AFMOVS:
5237 return OPVCC(52, 0, 0, 0)
5238 case AFMOVSU:
5239 return OPVCC(53, 0, 0, 0)
5240
5241 case AMOVHZ, AMOVH:
5242 return OPVCC(44, 0, 0, 0)
5243
5244 case AMOVHZU, AMOVHU:
5245 return OPVCC(45, 0, 0, 0)
5246 case AMOVMW:
5247 return OPVCC(47, 0, 0, 0)
5248 case ASTSW:
5249 return OPVCC(31, 725, 0, 0)
5250
5251 case AMOVWZ, AMOVW:
5252 return OPVCC(36, 0, 0, 0)
5253
5254 case AMOVWZU, AMOVWU:
5255 return OPVCC(37, 0, 0, 0)
5256 case AMOVD:
5257 return OPVCC(62, 0, 0, 0)
5258 case AMOVDU:
5259 return OPVCC(62, 0, 0, 1)
5260 case ASTXV:
5261 return OPDQ(61, 5, 0)
5262 case ASTXVL:
5263 return OPVXX1(31, 397, 0)
5264 case ASTXVLL:
5265 return OPVXX1(31, 429, 0)
5266 case ASTXVX:
5267 return OPVXX1(31, 396, 0)
5268
5269 }
5270
5271 c.ctxt.Diag("unknown store opcode %v", a)
5272 return 0
5273 }
5274
5275
5278 func (c *ctxt9) opstorex(a obj.As) uint32 {
5279 switch a {
5280 case AMOVB, AMOVBZ:
5281 return OPVCC(31, 215, 0, 0)
5282
5283 case AMOVBU, AMOVBZU:
5284 return OPVCC(31, 247, 0, 0)
5285 case AFMOVD:
5286 return OPVCC(31, 727, 0, 0)
5287 case AFMOVDU:
5288 return OPVCC(31, 759, 0, 0)
5289 case AFMOVS:
5290 return OPVCC(31, 663, 0, 0)
5291 case AFMOVSU:
5292 return OPVCC(31, 695, 0, 0)
5293 case AFMOVSX:
5294 return OPVCC(31, 983, 0, 0)
5295
5296 case AMOVHZ, AMOVH:
5297 return OPVCC(31, 407, 0, 0)
5298 case AMOVHBR:
5299 return OPVCC(31, 918, 0, 0)
5300
5301 case AMOVHZU, AMOVHU:
5302 return OPVCC(31, 439, 0, 0)
5303
5304 case AMOVWZ, AMOVW:
5305 return OPVCC(31, 151, 0, 0)
5306
5307 case AMOVWZU, AMOVWU:
5308 return OPVCC(31, 183, 0, 0)
5309 case ASTSW:
5310 return OPVCC(31, 661, 0, 0)
5311 case AMOVWBR:
5312 return OPVCC(31, 662, 0, 0)
5313 case AMOVDBR:
5314 return OPVCC(31, 660, 0, 0)
5315 case ASTBCCC:
5316 return OPVCC(31, 694, 0, 1)
5317 case ASTHCCC:
5318 return OPVCC(31, 726, 0, 1)
5319 case ASTWCCC:
5320 return OPVCC(31, 150, 0, 1)
5321 case ASTDCCC:
5322 return OPVCC(31, 214, 0, 1)
5323 case AECOWX:
5324 return OPVCC(31, 438, 0, 0)
5325 case AMOVD:
5326 return OPVCC(31, 149, 0, 0)
5327 case AMOVDU:
5328 return OPVCC(31, 181, 0, 0)
5329
5330
5331 case ASTVEBX:
5332 return OPVCC(31, 135, 0, 0)
5333 case ASTVEHX:
5334 return OPVCC(31, 167, 0, 0)
5335 case ASTVEWX:
5336 return OPVCC(31, 199, 0, 0)
5337 case ASTVX:
5338 return OPVCC(31, 231, 0, 0)
5339 case ASTVXL:
5340 return OPVCC(31, 487, 0, 0)
5341
5342
5343
5344 case ASTXVX:
5345 return OPVXX1(31, 396, 0)
5346 case ASTXVD2X:
5347 return OPVXX1(31, 972, 0)
5348 case ASTXVW4X:
5349 return OPVXX1(31, 908, 0)
5350 case ASTXVH8X:
5351 return OPVXX1(31, 940, 0)
5352 case ASTXVB16X:
5353 return OPVXX1(31, 1004, 0)
5354
5355 case ASTXSDX:
5356 return OPVXX1(31, 716, 0)
5357
5358 case ASTXSIWX:
5359 return OPVXX1(31, 140, 0)
5360
5361
5362
5363 }
5364
5365 c.ctxt.Diag("unknown storex opcode %v", a)
5366 return 0
5367 }
5368
View as plain text