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