1 // cmd/9l/optab.c, cmd/9l/asmout.c from Vita Nuova.
3 // Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved.
4 // Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net)
5 // Portions Copyright © 1997-1999 Vita Nuova Limited
6 // Portions Copyright © 2000-2008 Vita Nuova Holdings Limited (www.vitanuova.com)
7 // Portions Copyright © 2004,2006 Bruce Ellis
8 // Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net)
9 // Revisions Copyright © 2000-2008 Lucent Technologies Inc. and others
10 // Portions Copyright © 2009 The Go Authors. All rights reserved.
12 // Permission is hereby granted, free of charge, to any person obtaining a copy
13 // of this software and associated documentation files (the "Software"), to deal
14 // in the Software without restriction, including without limitation the rights
15 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
16 // copies of the Software, and to permit persons to whom the Software is
17 // furnished to do so, subject to the following conditions:
19 // The above copyright notice and this permission notice shall be included in
20 // all copies or substantial portions of the Software.
22 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
23 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
24 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
25 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
26 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
27 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
42 // ctxt9 holds state while assembling a single function.
43 // Each function gets a fresh ctxt9.
44 // This allows for multiple functions to be safely concurrently assembled.
54 // Instruction layout.
58 funcAlignMask = funcAlign - 1
71 type_ int8 // cases in asmout below. E.g., 44 = st r,(ra+rb); 45 = ld (ra+rb), r
76 // This optab contains a list of opcodes with the operand
77 // combinations that are implemented. Not all opcodes are in this
78 // table, but are added later in buildop by calling opset for those
79 // opcodes which allow the same operand combinations as an opcode
80 // already in the table.
82 // The type field in the Optabl identifies the case in asmout where
83 // the instruction word is assembled.
85 {obj.ATEXT, C_LEXT, C_NONE, C_NONE, C_TEXTSIZE, 0, 0, 0},
86 {obj.ATEXT, C_LEXT, C_NONE, C_LCON, C_TEXTSIZE, 0, 0, 0},
87 {obj.ATEXT, C_ADDR, C_NONE, C_NONE, C_TEXTSIZE, 0, 0, 0},
88 {obj.ATEXT, C_ADDR, C_NONE, C_LCON, C_TEXTSIZE, 0, 0, 0},
90 {AMOVD, C_REG, C_NONE, C_NONE, C_REG, 1, 4, 0},
91 {AMOVB, C_REG, C_NONE, C_NONE, C_REG, 12, 4, 0},
92 {AMOVBZ, C_REG, C_NONE, C_NONE, C_REG, 13, 4, 0},
93 {AMOVW, C_REG, C_NONE, C_NONE, C_REG, 12, 4, 0},
94 {AMOVWZ, C_REG, C_NONE, C_NONE, C_REG, 13, 4, 0},
95 {AADD, C_REG, C_REG, C_NONE, C_REG, 2, 4, 0},
96 {AADD, C_REG, C_NONE, C_NONE, C_REG, 2, 4, 0},
97 {AADD, C_SCON, C_REG, C_NONE, C_REG, 4, 4, 0},
98 {AADD, C_SCON, C_NONE, C_NONE, C_REG, 4, 4, 0},
99 {AADD, C_ADDCON, C_REG, C_NONE, C_REG, 4, 4, 0},
100 {AADD, C_ADDCON, C_NONE, C_NONE, C_REG, 4, 4, 0},
101 {AADD, C_UCON, C_REG, C_NONE, C_REG, 20, 4, 0},
102 {AADD, C_UCON, C_NONE, C_NONE, C_REG, 20, 4, 0},
103 {AADD, C_ANDCON, C_REG, C_NONE, C_REG, 22, 8, 0},
104 {AADD, C_ANDCON, C_NONE, C_NONE, C_REG, 22, 8, 0},
105 {AADD, C_LCON, C_REG, C_NONE, C_REG, 22, 12, 0},
106 {AADD, C_LCON, C_NONE, C_NONE, C_REG, 22, 12, 0},
107 {AADDIS, C_ADDCON, C_REG, C_NONE, C_REG, 20, 4, 0},
108 {AADDIS, C_ADDCON, C_NONE, C_NONE, C_REG, 20, 4, 0},
109 {AADDC, C_REG, C_REG, C_NONE, C_REG, 2, 4, 0},
110 {AADDC, C_REG, C_NONE, C_NONE, C_REG, 2, 4, 0},
111 {AADDC, C_ADDCON, C_REG, C_NONE, C_REG, 4, 4, 0},
112 {AADDC, C_ADDCON, C_NONE, C_NONE, C_REG, 4, 4, 0},
113 {AADDC, C_LCON, C_REG, C_NONE, C_REG, 22, 12, 0},
114 {AADDC, C_LCON, C_NONE, C_NONE, C_REG, 22, 12, 0},
115 {AAND, C_REG, C_REG, C_NONE, C_REG, 6, 4, 0}, /* logical, no literal */
116 {AAND, C_REG, C_NONE, C_NONE, C_REG, 6, 4, 0},
117 {AANDCC, C_REG, C_REG, C_NONE, C_REG, 6, 4, 0},
118 {AANDCC, C_REG, C_NONE, C_NONE, C_REG, 6, 4, 0},
119 {AANDCC, C_ANDCON, C_NONE, C_NONE, C_REG, 58, 4, 0},
120 {AANDCC, C_ANDCON, C_REG, C_NONE, C_REG, 58, 4, 0},
121 {AANDCC, C_UCON, C_NONE, C_NONE, C_REG, 59, 4, 0},
122 {AANDCC, C_UCON, C_REG, C_NONE, C_REG, 59, 4, 0},
123 {AANDCC, C_ADDCON, C_NONE, C_NONE, C_REG, 23, 8, 0},
124 {AANDCC, C_ADDCON, C_REG, C_NONE, C_REG, 23, 8, 0},
125 {AANDCC, C_LCON, C_NONE, C_NONE, C_REG, 23, 12, 0},
126 {AANDCC, C_LCON, C_REG, C_NONE, C_REG, 23, 12, 0},
127 {AANDISCC, C_ANDCON, C_NONE, C_NONE, C_REG, 59, 4, 0},
128 {AANDISCC, C_ANDCON, C_REG, C_NONE, C_REG, 59, 4, 0},
129 {AMULLW, C_REG, C_REG, C_NONE, C_REG, 2, 4, 0},
130 {AMULLW, C_REG, C_NONE, C_NONE, C_REG, 2, 4, 0},
131 {AMULLW, C_ADDCON, C_REG, C_NONE, C_REG, 4, 4, 0},
132 {AMULLW, C_ADDCON, C_NONE, C_NONE, C_REG, 4, 4, 0},
133 {AMULLW, C_ANDCON, C_REG, C_NONE, C_REG, 4, 4, 0},
134 {AMULLW, C_ANDCON, C_NONE, C_NONE, C_REG, 4, 4, 0},
135 {AMULLW, C_LCON, C_REG, C_NONE, C_REG, 22, 12, 0},
136 {AMULLW, C_LCON, C_NONE, C_NONE, C_REG, 22, 12, 0},
137 {ASUBC, C_REG, C_REG, C_NONE, C_REG, 10, 4, 0},
138 {ASUBC, C_REG, C_NONE, C_NONE, C_REG, 10, 4, 0},
139 {ASUBC, C_REG, C_NONE, C_ADDCON, C_REG, 27, 4, 0},
140 {ASUBC, C_REG, C_NONE, C_LCON, C_REG, 28, 12, 0},
141 {AOR, C_REG, C_REG, C_NONE, C_REG, 6, 4, 0}, /* logical, literal not cc (or/xor) */
142 {AOR, C_REG, C_NONE, C_NONE, C_REG, 6, 4, 0},
143 {AOR, C_ANDCON, C_NONE, C_NONE, C_REG, 58, 4, 0},
144 {AOR, C_ANDCON, C_REG, C_NONE, C_REG, 58, 4, 0},
145 {AOR, C_UCON, C_NONE, C_NONE, C_REG, 59, 4, 0},
146 {AOR, C_UCON, C_REG, C_NONE, C_REG, 59, 4, 0},
147 {AOR, C_ADDCON, C_NONE, C_NONE, C_REG, 23, 8, 0},
148 {AOR, C_ADDCON, C_REG, C_NONE, C_REG, 23, 8, 0},
149 {AOR, C_LCON, C_NONE, C_NONE, C_REG, 23, 12, 0},
150 {AOR, C_LCON, C_REG, C_NONE, C_REG, 23, 12, 0},
151 {AORIS, C_ANDCON, C_NONE, C_NONE, C_REG, 59, 4, 0},
152 {AORIS, C_ANDCON, C_REG, C_NONE, C_REG, 59, 4, 0},
153 {ADIVW, C_REG, C_REG, C_NONE, C_REG, 2, 4, 0}, /* op r1[,r2],r3 */
154 {ADIVW, C_REG, C_NONE, C_NONE, C_REG, 2, 4, 0},
155 {ASUB, C_REG, C_REG, C_NONE, C_REG, 10, 4, 0}, /* op r2[,r1],r3 */
156 {ASUB, C_REG, C_NONE, C_NONE, C_REG, 10, 4, 0},
157 {ASLW, C_REG, C_NONE, C_NONE, C_REG, 6, 4, 0},
158 {ASLW, C_REG, C_REG, C_NONE, C_REG, 6, 4, 0},
159 {ASLD, C_REG, C_NONE, C_NONE, C_REG, 6, 4, 0},
160 {ASLD, C_REG, C_REG, C_NONE, C_REG, 6, 4, 0},
161 {ASLD, C_SCON, C_REG, C_NONE, C_REG, 25, 4, 0},
162 {ASLD, C_SCON, C_NONE, C_NONE, C_REG, 25, 4, 0},
163 {ASLW, C_SCON, C_REG, C_NONE, C_REG, 57, 4, 0},
164 {ASLW, C_SCON, C_NONE, C_NONE, C_REG, 57, 4, 0},
165 {ASRAW, C_REG, C_NONE, C_NONE, C_REG, 6, 4, 0},
166 {ASRAW, C_REG, C_REG, C_NONE, C_REG, 6, 4, 0},
167 {ASRAW, C_SCON, C_REG, C_NONE, C_REG, 56, 4, 0},
168 {ASRAW, C_SCON, C_NONE, C_NONE, C_REG, 56, 4, 0},
169 {ASRAD, C_REG, C_NONE, C_NONE, C_REG, 6, 4, 0},
170 {ASRAD, C_REG, C_REG, C_NONE, C_REG, 6, 4, 0},
171 {ASRAD, C_SCON, C_REG, C_NONE, C_REG, 56, 4, 0},
172 {ASRAD, C_SCON, C_NONE, C_NONE, C_REG, 56, 4, 0},
173 {ARLWMI, C_SCON, C_REG, C_LCON, C_REG, 62, 4, 0},
174 {ARLWMI, C_REG, C_REG, C_LCON, C_REG, 63, 4, 0},
175 {ARLDMI, C_SCON, C_REG, C_LCON, C_REG, 30, 4, 0},
176 {ARLDC, C_SCON, C_REG, C_LCON, C_REG, 29, 4, 0},
177 {ARLDCL, C_SCON, C_REG, C_LCON, C_REG, 29, 4, 0},
178 {ARLDCL, C_REG, C_REG, C_LCON, C_REG, 14, 4, 0},
179 {ARLDICL, C_REG, C_REG, C_LCON, C_REG, 14, 4, 0},
180 {ARLDICL, C_SCON, C_REG, C_LCON, C_REG, 14, 4, 0},
181 {ARLDCL, C_REG, C_NONE, C_LCON, C_REG, 14, 4, 0},
182 {AFADD, C_FREG, C_NONE, C_NONE, C_FREG, 2, 4, 0},
183 {AFADD, C_FREG, C_FREG, C_NONE, C_FREG, 2, 4, 0},
184 {AFABS, C_FREG, C_NONE, C_NONE, C_FREG, 33, 4, 0},
185 {AFABS, C_NONE, C_NONE, C_NONE, C_FREG, 33, 4, 0},
186 {AFMOVD, C_FREG, C_NONE, C_NONE, C_FREG, 33, 4, 0},
187 {AFMADD, C_FREG, C_FREG, C_FREG, C_FREG, 34, 4, 0},
188 {AFMUL, C_FREG, C_NONE, C_NONE, C_FREG, 32, 4, 0},
189 {AFMUL, C_FREG, C_FREG, C_NONE, C_FREG, 32, 4, 0},
191 /* store, short offset */
192 {AMOVD, C_REG, C_REG, C_NONE, C_ZOREG, 7, 4, REGZERO},
193 {AMOVW, C_REG, C_REG, C_NONE, C_ZOREG, 7, 4, REGZERO},
194 {AMOVWZ, C_REG, C_REG, C_NONE, C_ZOREG, 7, 4, REGZERO},
195 {AMOVBZ, C_REG, C_REG, C_NONE, C_ZOREG, 7, 4, REGZERO},
196 {AMOVBZU, C_REG, C_REG, C_NONE, C_ZOREG, 7, 4, REGZERO},
197 {AMOVB, C_REG, C_REG, C_NONE, C_ZOREG, 7, 4, REGZERO},
198 {AMOVBU, C_REG, C_REG, C_NONE, C_ZOREG, 7, 4, REGZERO},
199 {AMOVD, C_REG, C_NONE, C_NONE, C_SEXT, 7, 4, REGSB},
200 {AMOVW, C_REG, C_NONE, C_NONE, C_SEXT, 7, 4, REGSB},
201 {AMOVWZ, C_REG, C_NONE, C_NONE, C_SEXT, 7, 4, REGSB},
202 {AMOVBZ, C_REG, C_NONE, C_NONE, C_SEXT, 7, 4, REGSB},
203 {AMOVB, C_REG, C_NONE, C_NONE, C_SEXT, 7, 4, REGSB},
204 {AMOVD, C_REG, C_NONE, C_NONE, C_SAUTO, 7, 4, REGSP},
205 {AMOVW, C_REG, C_NONE, C_NONE, C_SAUTO, 7, 4, REGSP},
206 {AMOVWZ, C_REG, C_NONE, C_NONE, C_SAUTO, 7, 4, REGSP},
207 {AMOVBZ, C_REG, C_NONE, C_NONE, C_SAUTO, 7, 4, REGSP},
208 {AMOVB, C_REG, C_NONE, C_NONE, C_SAUTO, 7, 4, REGSP},
209 {AMOVD, C_REG, C_NONE, C_NONE, C_SOREG, 7, 4, REGZERO},
210 {AMOVW, C_REG, C_NONE, C_NONE, C_SOREG, 7, 4, REGZERO},
211 {AMOVWZ, C_REG, C_NONE, C_NONE, C_SOREG, 7, 4, REGZERO},
212 {AMOVBZ, C_REG, C_NONE, C_NONE, C_SOREG, 7, 4, REGZERO},
213 {AMOVBZU, C_REG, C_NONE, C_NONE, C_SOREG, 7, 4, REGZERO},
214 {AMOVB, C_REG, C_NONE, C_NONE, C_SOREG, 7, 4, REGZERO},
215 {AMOVBU, C_REG, C_NONE, C_NONE, C_SOREG, 7, 4, REGZERO},
217 /* load, short offset */
218 {AMOVD, C_ZOREG, C_REG, C_NONE, C_REG, 8, 4, REGZERO},
219 {AMOVW, C_ZOREG, C_REG, C_NONE, C_REG, 8, 4, REGZERO},
220 {AMOVWZ, C_ZOREG, C_REG, C_NONE, C_REG, 8, 4, REGZERO},
221 {AMOVBZ, C_ZOREG, C_REG, C_NONE, C_REG, 8, 4, REGZERO},
222 {AMOVBZU, C_ZOREG, C_REG, C_NONE, C_REG, 8, 4, REGZERO},
223 {AMOVB, C_ZOREG, C_REG, C_NONE, C_REG, 9, 8, REGZERO},
224 {AMOVBU, C_ZOREG, C_REG, C_NONE, C_REG, 9, 8, REGZERO},
225 {AMOVD, C_SEXT, C_NONE, C_NONE, C_REG, 8, 4, REGSB},
226 {AMOVW, C_SEXT, C_NONE, C_NONE, C_REG, 8, 4, REGSB},
227 {AMOVWZ, C_SEXT, C_NONE, C_NONE, C_REG, 8, 4, REGSB},
228 {AMOVBZ, C_SEXT, C_NONE, C_NONE, C_REG, 8, 4, REGSB},
229 {AMOVB, C_SEXT, C_NONE, C_NONE, C_REG, 9, 8, REGSB},
230 {AMOVD, C_SAUTO, C_NONE, C_NONE, C_REG, 8, 4, REGSP},
231 {AMOVW, C_SAUTO, C_NONE, C_NONE, C_REG, 8, 4, REGSP},
232 {AMOVWZ, C_SAUTO, C_NONE, C_NONE, C_REG, 8, 4, REGSP},
233 {AMOVBZ, C_SAUTO, C_NONE, C_NONE, C_REG, 8, 4, REGSP},
234 {AMOVB, C_SAUTO, C_NONE, C_NONE, C_REG, 9, 8, REGSP},
235 {AMOVD, C_SOREG, C_NONE, C_NONE, C_REG, 8, 4, REGZERO},
236 {AMOVW, C_SOREG, C_NONE, C_NONE, C_REG, 8, 4, REGZERO},
237 {AMOVWZ, C_SOREG, C_NONE, C_NONE, C_REG, 8, 4, REGZERO},
238 {AMOVBZ, C_SOREG, C_NONE, C_NONE, C_REG, 8, 4, REGZERO},
239 {AMOVBZU, C_SOREG, C_NONE, C_NONE, C_REG, 8, 4, REGZERO},
240 {AMOVB, C_SOREG, C_NONE, C_NONE, C_REG, 9, 8, REGZERO},
241 {AMOVBU, C_SOREG, C_NONE, C_NONE, C_REG, 9, 8, REGZERO},
243 /* store, long offset */
244 {AMOVD, C_REG, C_NONE, C_NONE, C_LEXT, 35, 8, REGSB},
245 {AMOVW, C_REG, C_NONE, C_NONE, C_LEXT, 35, 8, REGSB},
246 {AMOVWZ, C_REG, C_NONE, C_NONE, C_LEXT, 35, 8, REGSB},
247 {AMOVBZ, C_REG, C_NONE, C_NONE, C_LEXT, 35, 8, REGSB},
248 {AMOVB, C_REG, C_NONE, C_NONE, C_LEXT, 35, 8, REGSB},
249 {AMOVD, C_REG, C_NONE, C_NONE, C_LAUTO, 35, 8, REGSP},
250 {AMOVW, C_REG, C_NONE, C_NONE, C_LAUTO, 35, 8, REGSP},
251 {AMOVWZ, C_REG, C_NONE, C_NONE, C_LAUTO, 35, 8, REGSP},
252 {AMOVBZ, C_REG, C_NONE, C_NONE, C_LAUTO, 35, 8, REGSP},
253 {AMOVB, C_REG, C_NONE, C_NONE, C_LAUTO, 35, 8, REGSP},
254 {AMOVD, C_REG, C_NONE, C_NONE, C_LOREG, 35, 8, REGZERO},
255 {AMOVW, C_REG, C_NONE, C_NONE, C_LOREG, 35, 8, REGZERO},
256 {AMOVWZ, C_REG, C_NONE, C_NONE, C_LOREG, 35, 8, REGZERO},
257 {AMOVBZ, C_REG, C_NONE, C_NONE, C_LOREG, 35, 8, REGZERO},
258 {AMOVB, C_REG, C_NONE, C_NONE, C_LOREG, 35, 8, REGZERO},
259 {AMOVD, C_REG, C_NONE, C_NONE, C_ADDR, 74, 8, 0},
260 {AMOVW, C_REG, C_NONE, C_NONE, C_ADDR, 74, 8, 0},
261 {AMOVWZ, C_REG, C_NONE, C_NONE, C_ADDR, 74, 8, 0},
262 {AMOVBZ, C_REG, C_NONE, C_NONE, C_ADDR, 74, 8, 0},
263 {AMOVB, C_REG, C_NONE, C_NONE, C_ADDR, 74, 8, 0},
265 /* load, long offset */
266 {AMOVD, C_LEXT, C_NONE, C_NONE, C_REG, 36, 8, REGSB},
267 {AMOVW, C_LEXT, C_NONE, C_NONE, C_REG, 36, 8, REGSB},
268 {AMOVWZ, C_LEXT, C_NONE, C_NONE, C_REG, 36, 8, REGSB},
269 {AMOVBZ, C_LEXT, C_NONE, C_NONE, C_REG, 36, 8, REGSB},
270 {AMOVB, C_LEXT, C_NONE, C_NONE, C_REG, 37, 12, REGSB},
271 {AMOVD, C_LAUTO, C_NONE, C_NONE, C_REG, 36, 8, REGSP},
272 {AMOVW, C_LAUTO, C_NONE, C_NONE, C_REG, 36, 8, REGSP},
273 {AMOVWZ, C_LAUTO, C_NONE, C_NONE, C_REG, 36, 8, REGSP},
274 {AMOVBZ, C_LAUTO, C_NONE, C_NONE, C_REG, 36, 8, REGSP},
275 {AMOVB, C_LAUTO, C_NONE, C_NONE, C_REG, 37, 12, REGSP},
276 {AMOVD, C_LOREG, C_NONE, C_NONE, C_REG, 36, 8, REGZERO},
277 {AMOVW, C_LOREG, C_NONE, C_NONE, C_REG, 36, 8, REGZERO},
278 {AMOVWZ, C_LOREG, C_NONE, C_NONE, C_REG, 36, 8, REGZERO},
279 {AMOVBZ, C_LOREG, C_NONE, C_NONE, C_REG, 36, 8, REGZERO},
280 {AMOVB, C_LOREG, C_NONE, C_NONE, C_REG, 37, 12, REGZERO},
281 {AMOVD, C_ADDR, C_NONE, C_NONE, C_REG, 75, 8, 0},
282 {AMOVW, C_ADDR, C_NONE, C_NONE, C_REG, 75, 8, 0},
283 {AMOVWZ, C_ADDR, C_NONE, C_NONE, C_REG, 75, 8, 0},
284 {AMOVBZ, C_ADDR, C_NONE, C_NONE, C_REG, 75, 8, 0},
285 {AMOVB, C_ADDR, C_NONE, C_NONE, C_REG, 76, 12, 0},
287 {AMOVD, C_TLS_LE, C_NONE, C_NONE, C_REG, 79, 4, 0},
288 {AMOVD, C_TLS_IE, C_NONE, C_NONE, C_REG, 80, 8, 0},
290 {AMOVD, C_GOTADDR, C_NONE, C_NONE, C_REG, 81, 8, 0},
291 {AMOVD, C_TOCADDR, C_NONE, C_NONE, C_REG, 95, 8, 0},
294 {AMOVD, C_SECON, C_NONE, C_NONE, C_REG, 3, 4, REGSB},
295 {AMOVD, C_SACON, C_NONE, C_NONE, C_REG, 3, 4, REGSP},
296 {AMOVD, C_LECON, C_NONE, C_NONE, C_REG, 26, 8, REGSB},
297 {AMOVD, C_LACON, C_NONE, C_NONE, C_REG, 26, 8, REGSP},
298 {AMOVD, C_ADDCON, C_NONE, C_NONE, C_REG, 3, 4, REGZERO},
299 {AMOVD, C_ANDCON, C_NONE, C_NONE, C_REG, 3, 4, REGZERO},
300 {AMOVW, C_SECON, C_NONE, C_NONE, C_REG, 3, 4, REGSB}, /* TO DO: check */
301 {AMOVW, C_SACON, C_NONE, C_NONE, C_REG, 3, 4, REGSP},
302 {AMOVW, C_LECON, C_NONE, C_NONE, C_REG, 26, 8, REGSB},
303 {AMOVW, C_LACON, C_NONE, C_NONE, C_REG, 26, 8, REGSP},
304 {AMOVW, C_ADDCON, C_NONE, C_NONE, C_REG, 3, 4, REGZERO},
305 {AMOVW, C_ANDCON, C_NONE, C_NONE, C_REG, 3, 4, REGZERO},
306 {AMOVWZ, C_SECON, C_NONE, C_NONE, C_REG, 3, 4, REGSB}, /* TO DO: check */
307 {AMOVWZ, C_SACON, C_NONE, C_NONE, C_REG, 3, 4, REGSP},
308 {AMOVWZ, C_LECON, C_NONE, C_NONE, C_REG, 26, 8, REGSB},
309 {AMOVWZ, C_LACON, C_NONE, C_NONE, C_REG, 26, 8, REGSP},
310 {AMOVWZ, C_ADDCON, C_NONE, C_NONE, C_REG, 3, 4, REGZERO},
311 {AMOVWZ, C_ANDCON, C_NONE, C_NONE, C_REG, 3, 4, REGZERO},
313 /* load unsigned/long constants (TO DO: check) */
314 {AMOVD, C_UCON, C_NONE, C_NONE, C_REG, 3, 4, REGZERO},
315 {AMOVD, C_LCON, C_NONE, C_NONE, C_REG, 19, 8, 0},
316 {AMOVW, C_UCON, C_NONE, C_NONE, C_REG, 3, 4, REGZERO},
317 {AMOVW, C_LCON, C_NONE, C_NONE, C_REG, 19, 8, 0},
318 {AMOVWZ, C_UCON, C_NONE, C_NONE, C_REG, 3, 4, REGZERO},
319 {AMOVWZ, C_LCON, C_NONE, C_NONE, C_REG, 19, 8, 0},
320 {AMOVHBR, C_ZOREG, C_REG, C_NONE, C_REG, 45, 4, 0},
321 {AMOVHBR, C_ZOREG, C_NONE, C_NONE, C_REG, 45, 4, 0},
322 {AMOVHBR, C_REG, C_REG, C_NONE, C_ZOREG, 44, 4, 0},
323 {AMOVHBR, C_REG, C_NONE, C_NONE, C_ZOREG, 44, 4, 0},
324 {ASYSCALL, C_NONE, C_NONE, C_NONE, C_NONE, 5, 4, 0},
325 {ASYSCALL, C_REG, C_NONE, C_NONE, C_NONE, 77, 12, 0},
326 {ASYSCALL, C_SCON, C_NONE, C_NONE, C_NONE, 77, 12, 0},
327 {ABEQ, C_NONE, C_NONE, C_NONE, C_SBRA, 16, 4, 0},
328 {ABEQ, C_CREG, C_NONE, C_NONE, C_SBRA, 16, 4, 0},
329 {ABR, C_NONE, C_NONE, C_NONE, C_LBRA, 11, 4, 0},
330 {ABR, C_NONE, C_NONE, C_NONE, C_LBRAPIC, 11, 8, 0},
331 {ABC, C_SCON, C_REG, C_NONE, C_SBRA, 16, 4, 0},
332 {ABC, C_SCON, C_REG, C_NONE, C_LBRA, 17, 4, 0},
333 {ABR, C_NONE, C_NONE, C_NONE, C_LR, 18, 4, 0},
334 {ABR, C_NONE, C_NONE, C_NONE, C_CTR, 18, 4, 0},
335 {ABR, C_REG, C_NONE, C_NONE, C_CTR, 18, 4, 0},
336 {ABR, C_NONE, C_NONE, C_NONE, C_ZOREG, 15, 8, 0},
337 {ABC, C_NONE, C_REG, C_NONE, C_LR, 18, 4, 0},
338 {ABC, C_NONE, C_REG, C_NONE, C_CTR, 18, 4, 0},
339 {ABC, C_SCON, C_REG, C_NONE, C_LR, 18, 4, 0},
340 {ABC, C_SCON, C_REG, C_NONE, C_CTR, 18, 4, 0},
341 {ABC, C_NONE, C_NONE, C_NONE, C_ZOREG, 15, 8, 0},
342 {AFMOVD, C_SEXT, C_NONE, C_NONE, C_FREG, 8, 4, REGSB},
343 {AFMOVD, C_SAUTO, C_NONE, C_NONE, C_FREG, 8, 4, REGSP},
344 {AFMOVD, C_SOREG, C_NONE, C_NONE, C_FREG, 8, 4, REGZERO},
345 {AFMOVD, C_LEXT, C_NONE, C_NONE, C_FREG, 36, 8, REGSB},
346 {AFMOVD, C_LAUTO, C_NONE, C_NONE, C_FREG, 36, 8, REGSP},
347 {AFMOVD, C_LOREG, C_NONE, C_NONE, C_FREG, 36, 8, REGZERO},
348 {AFMOVD, C_ZCON, C_NONE, C_NONE, C_FREG, 24, 4, 0},
349 {AFMOVD, C_ADDCON, C_NONE, C_NONE, C_FREG, 24, 8, 0},
350 {AFMOVD, C_ADDR, C_NONE, C_NONE, C_FREG, 75, 8, 0},
351 {AFMOVD, C_FREG, C_NONE, C_NONE, C_SEXT, 7, 4, REGSB},
352 {AFMOVD, C_FREG, C_NONE, C_NONE, C_SAUTO, 7, 4, REGSP},
353 {AFMOVD, C_FREG, C_NONE, C_NONE, C_SOREG, 7, 4, REGZERO},
354 {AFMOVD, C_FREG, C_NONE, C_NONE, C_LEXT, 35, 8, REGSB},
355 {AFMOVD, C_FREG, C_NONE, C_NONE, C_LAUTO, 35, 8, REGSP},
356 {AFMOVD, C_FREG, C_NONE, C_NONE, C_LOREG, 35, 8, REGZERO},
357 {AFMOVD, C_FREG, C_NONE, C_NONE, C_ADDR, 74, 8, 0},
358 {AFMOVSX, C_ZOREG, C_REG, C_NONE, C_FREG, 45, 4, 0},
359 {AFMOVSX, C_ZOREG, C_NONE, C_NONE, C_FREG, 45, 4, 0},
360 {AFMOVSX, C_FREG, C_REG, C_NONE, C_ZOREG, 44, 4, 0},
361 {AFMOVSX, C_FREG, C_NONE, C_NONE, C_ZOREG, 44, 4, 0},
362 {AFMOVSZ, C_ZOREG, C_REG, C_NONE, C_FREG, 45, 4, 0},
363 {AFMOVSZ, C_ZOREG, C_NONE, C_NONE, C_FREG, 45, 4, 0},
364 {ASYNC, C_NONE, C_NONE, C_NONE, C_NONE, 46, 4, 0},
365 {AWORD, C_LCON, C_NONE, C_NONE, C_NONE, 40, 4, 0},
366 {ADWORD, C_LCON, C_NONE, C_NONE, C_NONE, 31, 8, 0},
367 {ADWORD, C_DCON, C_NONE, C_NONE, C_NONE, 31, 8, 0},
368 {AADDME, C_REG, C_NONE, C_NONE, C_REG, 47, 4, 0},
369 {AEXTSB, C_REG, C_NONE, C_NONE, C_REG, 48, 4, 0},
370 {AEXTSB, C_NONE, C_NONE, C_NONE, C_REG, 48, 4, 0},
371 {AISEL, C_LCON, C_REG, C_REG, C_REG, 84, 4, 0},
372 {AISEL, C_ZCON, C_REG, C_REG, C_REG, 84, 4, 0},
373 {ANEG, C_REG, C_NONE, C_NONE, C_REG, 47, 4, 0},
374 {ANEG, C_NONE, C_NONE, C_NONE, C_REG, 47, 4, 0},
375 {AREM, C_REG, C_NONE, C_NONE, C_REG, 50, 12, 0},
376 {AREM, C_REG, C_REG, C_NONE, C_REG, 50, 12, 0},
377 {AREMU, C_REG, C_NONE, C_NONE, C_REG, 50, 16, 0},
378 {AREMU, C_REG, C_REG, C_NONE, C_REG, 50, 16, 0},
379 {AREMD, C_REG, C_NONE, C_NONE, C_REG, 51, 12, 0},
380 {AREMD, C_REG, C_REG, C_NONE, C_REG, 51, 12, 0},
381 {AMTFSB0, C_SCON, C_NONE, C_NONE, C_NONE, 52, 4, 0},
382 {AMOVFL, C_FPSCR, C_NONE, C_NONE, C_FREG, 53, 4, 0},
383 {AMOVFL, C_FREG, C_NONE, C_NONE, C_FPSCR, 64, 4, 0},
384 {AMOVFL, C_FREG, C_NONE, C_LCON, C_FPSCR, 64, 4, 0},
385 {AMOVFL, C_LCON, C_NONE, C_NONE, C_FPSCR, 65, 4, 0},
386 {AMOVD, C_MSR, C_NONE, C_NONE, C_REG, 54, 4, 0}, /* mfmsr */
387 {AMOVD, C_REG, C_NONE, C_NONE, C_MSR, 54, 4, 0}, /* mtmsrd */
388 {AMOVWZ, C_REG, C_NONE, C_NONE, C_MSR, 54, 4, 0}, /* mtmsr */
390 /* Other ISA 2.05+ instructions */
391 {APOPCNTD, C_REG, C_NONE, C_NONE, C_REG, 93, 4, 0}, /* population count, x-form */
392 {ACMPB, C_REG, C_REG, C_NONE, C_REG, 92, 4, 0}, /* compare byte, x-form */
393 {ACMPEQB, C_REG, C_REG, C_NONE, C_CREG, 92, 4, 0}, /* compare equal byte, x-form, ISA 3.0 */
394 {ACMPEQB, C_REG, C_NONE, C_NONE, C_REG, 70, 4, 0},
395 {AFTDIV, C_FREG, C_FREG, C_NONE, C_SCON, 92, 4, 0}, /* floating test for sw divide, x-form */
396 {AFTSQRT, C_FREG, C_NONE, C_NONE, C_SCON, 93, 4, 0}, /* floating test for sw square root, x-form */
397 {ACOPY, C_REG, C_NONE, C_NONE, C_REG, 92, 4, 0}, /* copy/paste facility, x-form */
398 {ADARN, C_SCON, C_NONE, C_NONE, C_REG, 92, 4, 0}, /* deliver random number, x-form */
399 {ALDMX, C_SOREG, C_NONE, C_NONE, C_REG, 45, 4, 0}, /* load doubleword monitored, x-form */
400 {AMADDHD, C_REG, C_REG, C_REG, C_REG, 83, 4, 0}, /* multiply-add high/low doubleword, va-form */
401 {AADDEX, C_REG, C_REG, C_SCON, C_REG, 94, 4, 0}, /* add extended using alternate carry, z23-form */
402 {ACRAND, C_CREG, C_NONE, C_NONE, C_CREG, 2, 4, 0}, /* logical ops for condition registers xl-form */
404 /* Vector instructions */
407 {ALV, C_SOREG, C_NONE, C_NONE, C_VREG, 45, 4, 0}, /* vector load, x-form */
410 {ASTV, C_VREG, C_NONE, C_NONE, C_SOREG, 44, 4, 0}, /* vector store, x-form */
413 {AVAND, C_VREG, C_VREG, C_NONE, C_VREG, 82, 4, 0}, /* vector and, vx-form */
414 {AVOR, C_VREG, C_VREG, C_NONE, C_VREG, 82, 4, 0}, /* vector or, vx-form */
417 {AVADDUM, C_VREG, C_VREG, C_NONE, C_VREG, 82, 4, 0}, /* vector add unsigned modulo, vx-form */
418 {AVADDCU, C_VREG, C_VREG, C_NONE, C_VREG, 82, 4, 0}, /* vector add & write carry unsigned, vx-form */
419 {AVADDUS, C_VREG, C_VREG, C_NONE, C_VREG, 82, 4, 0}, /* vector add unsigned saturate, vx-form */
420 {AVADDSS, C_VREG, C_VREG, C_NONE, C_VREG, 82, 4, 0}, /* vector add signed saturate, vx-form */
421 {AVADDE, C_VREG, C_VREG, C_VREG, C_VREG, 83, 4, 0}, /* vector add extended, va-form */
423 /* Vector subtract */
424 {AVSUBUM, C_VREG, C_VREG, C_NONE, C_VREG, 82, 4, 0}, /* vector subtract unsigned modulo, vx-form */
425 {AVSUBCU, C_VREG, C_VREG, C_NONE, C_VREG, 82, 4, 0}, /* vector subtract & write carry unsigned, vx-form */
426 {AVSUBUS, C_VREG, C_VREG, C_NONE, C_VREG, 82, 4, 0}, /* vector subtract unsigned saturate, vx-form */
427 {AVSUBSS, C_VREG, C_VREG, C_NONE, C_VREG, 82, 4, 0}, /* vector subtract signed saturate, vx-form */
428 {AVSUBE, C_VREG, C_VREG, C_VREG, C_VREG, 83, 4, 0}, /* vector subtract extended, va-form */
430 /* Vector multiply */
431 {AVMULESB, C_VREG, C_VREG, C_NONE, C_VREG, 82, 4, 9}, /* vector multiply, vx-form */
432 {AVPMSUM, C_VREG, C_VREG, C_NONE, C_VREG, 82, 4, 0}, /* vector polynomial multiply & sum, vx-form */
433 {AVMSUMUDM, C_VREG, C_VREG, C_VREG, C_VREG, 83, 4, 0}, /* vector multiply-sum, va-form */
436 {AVR, C_VREG, C_VREG, C_NONE, C_VREG, 82, 4, 0}, /* vector rotate, vx-form */
439 {AVS, C_VREG, C_VREG, C_NONE, C_VREG, 82, 4, 0}, /* vector shift, vx-form */
440 {AVSA, C_VREG, C_VREG, C_NONE, C_VREG, 82, 4, 0}, /* vector shift algebraic, vx-form */
441 {AVSOI, C_ANDCON, C_VREG, C_VREG, C_VREG, 83, 4, 0}, /* vector shift by octet immediate, va-form */
444 {AVCLZ, C_VREG, C_NONE, C_NONE, C_VREG, 85, 4, 0}, /* vector count leading zeros, vx-form */
445 {AVPOPCNT, C_VREG, C_NONE, C_NONE, C_VREG, 85, 4, 0}, /* vector population count, vx-form */
448 {AVCMPEQ, C_VREG, C_VREG, C_NONE, C_VREG, 82, 4, 0}, /* vector compare equal, vc-form */
449 {AVCMPGT, C_VREG, C_VREG, C_NONE, C_VREG, 82, 4, 0}, /* vector compare greater than, vc-form */
450 {AVCMPNEZB, C_VREG, C_VREG, C_NONE, C_VREG, 82, 4, 0}, /* vector compare not equal, vx-form */
453 {AVMRGOW, C_VREG, C_VREG, C_NONE, C_VREG, 82, 4, 0}, /* vector merge odd word, vx-form */
456 {AVPERM, C_VREG, C_VREG, C_VREG, C_VREG, 83, 4, 0}, /* vector permute, va-form */
458 /* Vector bit permute */
459 {AVBPERMQ, C_VREG, C_VREG, C_NONE, C_VREG, 82, 4, 0}, /* vector bit permute, vx-form */
462 {AVSEL, C_VREG, C_VREG, C_VREG, C_VREG, 83, 4, 0}, /* vector select, va-form */
465 {AVSPLTB, C_SCON, C_VREG, C_NONE, C_VREG, 82, 4, 0}, /* vector splat, vx-form */
466 {AVSPLTB, C_ADDCON, C_VREG, C_NONE, C_VREG, 82, 4, 0},
467 {AVSPLTISB, C_SCON, C_NONE, C_NONE, C_VREG, 82, 4, 0}, /* vector splat immediate, vx-form */
468 {AVSPLTISB, C_ADDCON, C_NONE, C_NONE, C_VREG, 82, 4, 0},
471 {AVCIPH, C_VREG, C_VREG, C_NONE, C_VREG, 82, 4, 0}, /* vector AES cipher, vx-form */
472 {AVNCIPH, C_VREG, C_VREG, C_NONE, C_VREG, 82, 4, 0}, /* vector AES inverse cipher, vx-form */
473 {AVSBOX, C_VREG, C_NONE, C_NONE, C_VREG, 82, 4, 0}, /* vector AES subbytes, vx-form */
476 {AVSHASIGMA, C_ANDCON, C_VREG, C_ANDCON, C_VREG, 82, 4, 0}, /* vector SHA sigma, vx-form */
478 /* VSX vector load */
479 {ALXVD2X, C_SOREG, C_NONE, C_NONE, C_VSREG, 87, 4, 0}, /* vsx vector load, xx1-form */
480 {ALXV, C_SOREG, C_NONE, C_NONE, C_VSREG, 96, 4, 0}, /* vsx vector load, dq-form */
481 {ALXVL, C_REG, C_REG, C_NONE, C_VSREG, 98, 4, 0}, /* vsx vector load length */
483 /* VSX vector store */
484 {ASTXVD2X, C_VSREG, C_NONE, C_NONE, C_SOREG, 86, 4, 0}, /* vsx vector store, xx1-form */
485 {ASTXV, C_VSREG, C_NONE, C_NONE, C_SOREG, 97, 4, 0}, /* vsx vector store, dq-form */
486 {ASTXVL, C_VSREG, C_REG, C_NONE, C_REG, 99, 4, 0}, /* vsx vector store with length x-form */
488 /* VSX scalar load */
489 {ALXSDX, C_SOREG, C_NONE, C_NONE, C_VSREG, 87, 4, 0}, /* vsx scalar load, xx1-form */
491 /* VSX scalar store */
492 {ASTXSDX, C_VSREG, C_NONE, C_NONE, C_SOREG, 86, 4, 0}, /* vsx scalar store, xx1-form */
494 /* VSX scalar as integer load */
495 {ALXSIWAX, C_SOREG, C_NONE, C_NONE, C_VSREG, 87, 4, 0}, /* vsx scalar as integer load, xx1-form */
497 /* VSX scalar store as integer */
498 {ASTXSIWX, C_VSREG, C_NONE, C_NONE, C_SOREG, 86, 4, 0}, /* vsx scalar as integer store, xx1-form */
500 /* VSX move from VSR */
501 {AMFVSRD, C_VSREG, C_NONE, C_NONE, C_REG, 88, 4, 0}, /* vsx move from vsr, xx1-form */
502 {AMFVSRD, C_FREG, C_NONE, C_NONE, C_REG, 88, 4, 0},
503 {AMFVSRD, C_VREG, C_NONE, C_NONE, C_REG, 88, 4, 0},
505 /* VSX move to VSR */
506 {AMTVSRD, C_REG, C_NONE, C_NONE, C_VSREG, 88, 4, 0}, /* vsx move to vsr, xx1-form */
507 {AMTVSRD, C_REG, C_REG, C_NONE, C_VSREG, 88, 4, 0},
508 {AMTVSRD, C_REG, C_NONE, C_NONE, C_FREG, 88, 4, 0},
509 {AMTVSRD, C_REG, C_NONE, C_NONE, C_VREG, 88, 4, 0},
512 {AXXLAND, C_VSREG, C_VSREG, C_NONE, C_VSREG, 90, 4, 0}, /* vsx and, xx3-form */
513 {AXXLOR, C_VSREG, C_VSREG, C_NONE, C_VSREG, 90, 4, 0}, /* vsx or, xx3-form */
516 {AXXSEL, C_VSREG, C_VSREG, C_VSREG, C_VSREG, 91, 4, 0}, /* vsx select, xx4-form */
519 {AXXMRGHW, C_VSREG, C_VSREG, C_NONE, C_VSREG, 90, 4, 0}, /* vsx merge, xx3-form */
522 {AXXSPLTW, C_VSREG, C_NONE, C_SCON, C_VSREG, 89, 4, 0}, /* vsx splat, xx2-form */
523 {AXXSPLTIB, C_SCON, C_NONE, C_NONE, C_VSREG, 100, 4, 0}, /* vsx splat, xx2-form */
526 {AXXPERM, C_VSREG, C_VSREG, C_NONE, C_VSREG, 90, 4, 0}, /* vsx permute, xx3-form */
529 {AXXSLDWI, C_VSREG, C_VSREG, C_SCON, C_VSREG, 90, 4, 0}, /* vsx shift immediate, xx3-form */
531 /* VSX reverse bytes */
532 {AXXBRQ, C_VSREG, C_NONE, C_NONE, C_VSREG, 101, 4, 0}, /* vsx reverse bytes */
534 /* VSX scalar FP-FP conversion */
535 {AXSCVDPSP, C_VSREG, C_NONE, C_NONE, C_VSREG, 89, 4, 0}, /* vsx scalar fp-fp conversion, xx2-form */
537 /* VSX vector FP-FP conversion */
538 {AXVCVDPSP, C_VSREG, C_NONE, C_NONE, C_VSREG, 89, 4, 0}, /* vsx vector fp-fp conversion, xx2-form */
540 /* VSX scalar FP-integer conversion */
541 {AXSCVDPSXDS, C_VSREG, C_NONE, C_NONE, C_VSREG, 89, 4, 0}, /* vsx scalar fp-integer conversion, xx2-form */
543 /* VSX scalar integer-FP conversion */
544 {AXSCVSXDDP, C_VSREG, C_NONE, C_NONE, C_VSREG, 89, 4, 0}, /* vsx scalar integer-fp conversion, xx2-form */
546 /* VSX vector FP-integer conversion */
547 {AXVCVDPSXDS, C_VSREG, C_NONE, C_NONE, C_VSREG, 89, 4, 0}, /* vsx vector fp-integer conversion, xx2-form */
549 /* VSX vector integer-FP conversion */
550 {AXVCVSXDDP, C_VSREG, C_NONE, C_NONE, C_VSREG, 89, 4, 0}, /* vsx vector integer-fp conversion, xx2-form */
552 /* 64-bit special registers */
553 {AMOVD, C_REG, C_NONE, C_NONE, C_SPR, 66, 4, 0},
554 {AMOVD, C_REG, C_NONE, C_NONE, C_LR, 66, 4, 0},
555 {AMOVD, C_REG, C_NONE, C_NONE, C_CTR, 66, 4, 0},
556 {AMOVD, C_REG, C_NONE, C_NONE, C_XER, 66, 4, 0},
557 {AMOVD, C_SPR, C_NONE, C_NONE, C_REG, 66, 4, 0},
558 {AMOVD, C_LR, C_NONE, C_NONE, C_REG, 66, 4, 0},
559 {AMOVD, C_CTR, C_NONE, C_NONE, C_REG, 66, 4, 0},
560 {AMOVD, C_XER, C_NONE, C_NONE, C_REG, 66, 4, 0},
562 /* 32-bit special registers (gloss over sign-extension or not?) */
563 {AMOVW, C_REG, C_NONE, C_NONE, C_SPR, 66, 4, 0},
564 {AMOVW, C_REG, C_NONE, C_NONE, C_CTR, 66, 4, 0},
565 {AMOVW, C_REG, C_NONE, C_NONE, C_XER, 66, 4, 0},
566 {AMOVW, C_SPR, C_NONE, C_NONE, C_REG, 66, 4, 0},
567 {AMOVW, C_XER, C_NONE, C_NONE, C_REG, 66, 4, 0},
568 {AMOVWZ, C_REG, C_NONE, C_NONE, C_SPR, 66, 4, 0},
569 {AMOVWZ, C_REG, C_NONE, C_NONE, C_CTR, 66, 4, 0},
570 {AMOVWZ, C_REG, C_NONE, C_NONE, C_XER, 66, 4, 0},
571 {AMOVWZ, C_SPR, C_NONE, C_NONE, C_REG, 66, 4, 0},
572 {AMOVWZ, C_XER, C_NONE, C_NONE, C_REG, 66, 4, 0},
573 {AMOVFL, C_FPSCR, C_NONE, C_NONE, C_CREG, 73, 4, 0},
574 {AMOVFL, C_CREG, C_NONE, C_NONE, C_CREG, 67, 4, 0},
575 {AMOVW, C_CREG, C_NONE, C_NONE, C_REG, 68, 4, 0},
576 {AMOVWZ, C_CREG, C_NONE, C_NONE, C_REG, 68, 4, 0},
577 {AMOVFL, C_REG, C_NONE, C_NONE, C_LCON, 69, 4, 0},
578 {AMOVFL, C_REG, C_NONE, C_NONE, C_CREG, 69, 4, 0},
579 {AMOVW, C_REG, C_NONE, C_NONE, C_CREG, 69, 4, 0},
580 {AMOVWZ, C_REG, C_NONE, C_NONE, C_CREG, 69, 4, 0},
581 {ACMP, C_REG, C_NONE, C_NONE, C_REG, 70, 4, 0},
582 {ACMP, C_REG, C_REG, C_NONE, C_REG, 70, 4, 0},
583 {ACMP, C_REG, C_NONE, C_NONE, C_ADDCON, 71, 4, 0},
584 {ACMP, C_REG, C_REG, C_NONE, C_ADDCON, 71, 4, 0},
585 {ACMPU, C_REG, C_NONE, C_NONE, C_REG, 70, 4, 0},
586 {ACMPU, C_REG, C_REG, C_NONE, C_REG, 70, 4, 0},
587 {ACMPU, C_REG, C_NONE, C_NONE, C_ANDCON, 71, 4, 0},
588 {ACMPU, C_REG, C_REG, C_NONE, C_ANDCON, 71, 4, 0},
589 {AFCMPO, C_FREG, C_NONE, C_NONE, C_FREG, 70, 4, 0},
590 {AFCMPO, C_FREG, C_REG, C_NONE, C_FREG, 70, 4, 0},
591 {ATW, C_LCON, C_REG, C_NONE, C_REG, 60, 4, 0},
592 {ATW, C_LCON, C_REG, C_NONE, C_ADDCON, 61, 4, 0},
593 {ADCBF, C_ZOREG, C_NONE, C_NONE, C_NONE, 43, 4, 0},
594 {ADCBF, C_SOREG, C_NONE, C_NONE, C_NONE, 43, 4, 0},
595 {ADCBF, C_ZOREG, C_REG, C_NONE, C_SCON, 43, 4, 0},
596 {ADCBF, C_SOREG, C_NONE, C_NONE, C_SCON, 43, 4, 0},
597 {AECOWX, C_REG, C_REG, C_NONE, C_ZOREG, 44, 4, 0},
598 {AECIWX, C_ZOREG, C_REG, C_NONE, C_REG, 45, 4, 0},
599 {AECOWX, C_REG, C_NONE, C_NONE, C_ZOREG, 44, 4, 0},
600 {AECIWX, C_ZOREG, C_NONE, C_NONE, C_REG, 45, 4, 0},
601 {ALDAR, C_ZOREG, C_NONE, C_NONE, C_REG, 45, 4, 0},
602 {ALDAR, C_ZOREG, C_NONE, C_ANDCON, C_REG, 45, 4, 0},
603 {AEIEIO, C_NONE, C_NONE, C_NONE, C_NONE, 46, 4, 0},
604 {ATLBIE, C_REG, C_NONE, C_NONE, C_NONE, 49, 4, 0},
605 {ATLBIE, C_SCON, C_NONE, C_NONE, C_REG, 49, 4, 0},
606 {ASLBMFEE, C_REG, C_NONE, C_NONE, C_REG, 55, 4, 0},
607 {ASLBMTE, C_REG, C_NONE, C_NONE, C_REG, 55, 4, 0},
608 {ASTSW, C_REG, C_NONE, C_NONE, C_ZOREG, 44, 4, 0},
609 {ASTSW, C_REG, C_NONE, C_LCON, C_ZOREG, 41, 4, 0},
610 {ALSW, C_ZOREG, C_NONE, C_NONE, C_REG, 45, 4, 0},
611 {ALSW, C_ZOREG, C_NONE, C_LCON, C_REG, 42, 4, 0},
612 {obj.AUNDEF, C_NONE, C_NONE, C_NONE, C_NONE, 78, 4, 0},
613 {obj.APCDATA, C_LCON, C_NONE, C_NONE, C_LCON, 0, 0, 0},
614 {obj.AFUNCDATA, C_SCON, C_NONE, C_NONE, C_ADDR, 0, 0, 0},
615 {obj.ANOP, C_NONE, C_NONE, C_NONE, C_NONE, 0, 0, 0},
616 {obj.ANOP, C_LCON, C_NONE, C_NONE, C_NONE, 0, 0, 0}, // NOP operand variations added for #40689
617 {obj.ANOP, C_REG, C_NONE, C_NONE, C_NONE, 0, 0, 0}, // to preserve previous behavior
618 {obj.ANOP, C_FREG, C_NONE, C_NONE, C_NONE, 0, 0, 0},
619 {obj.ADUFFZERO, C_NONE, C_NONE, C_NONE, C_LBRA, 11, 4, 0}, // same as ABR/ABL
620 {obj.ADUFFCOPY, C_NONE, C_NONE, C_NONE, C_LBRA, 11, 4, 0}, // same as ABR/ABL
621 {obj.APCALIGN, C_LCON, C_NONE, C_NONE, C_NONE, 0, 0, 0}, // align code
623 {obj.AXXX, C_NONE, C_NONE, C_NONE, C_NONE, 0, 4, 0},
626 var oprange [ALAST & obj.AMask][]Optab
628 var xcmp [C_NCLASS][C_NCLASS]bool
630 // padding bytes to add to align code as requested
631 func addpad(pc, a int64, ctxt *obj.Link, cursym *obj.LSym) int {
632 // For 16 and 32 byte alignment, there is a tradeoff
633 // between aligning the code and adding too many NOPs.
640 // Align to 16 bytes if possible but add at
649 // Align to 32 bytes if possible but add at
659 // When 32 byte alignment is requested on Linux,
660 // promote the function's alignment to 32. On AIX
661 // the function alignment is not changed which might
662 // result in 16 byte alignment but that is still fine.
663 // TODO: alignment on AIX
664 if ctxt.Headtype != objabi.Haix && cursym.Func.Align < 32 {
665 cursym.Func.Align = 32
668 ctxt.Diag("Unexpected alignment: %d for PCALIGN directive\n", a)
673 func span9(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) {
674 p := cursym.Func.Text
675 if p == nil || p.Link == nil { // handle external functions and ELF section symbols
679 if oprange[AANDN&obj.AMask] == nil {
680 ctxt.Diag("ppc64 ops not initialized, call ppc64.buildop first")
683 c := ctxt9{ctxt: ctxt, newprog: newprog, cursym: cursym, autosize: int32(p.To.Offset)}
690 for p = p.Link; p != nil; p = p.Link {
695 if p.As == obj.APCALIGN {
696 a := c.vregoff(&p.From)
697 m = addpad(pc, a, ctxt, cursym)
699 if p.As != obj.ANOP && p.As != obj.AFUNCDATA && p.As != obj.APCDATA {
700 ctxt.Diag("zero-width instruction\n%v", p)
711 * if any procedure is large enough to
712 * generate a large SBRA branch, then
713 * generate extra passes putting branches
714 * around jmps to fix. this is rare.
723 for p = c.cursym.Func.Text.Link; p != nil; p = p.Link {
727 // very large conditional branches
728 if (o.type_ == 16 || o.type_ == 17) && p.To.Target() != nil {
729 otxt = p.To.Target().Pc - pc
730 if otxt < -(1<<15)+10 || otxt >= (1<<15)-10 {
735 q.To.Type = obj.TYPE_BRANCH
736 q.To.SetTarget(p.To.Target())
742 q.To.Type = obj.TYPE_BRANCH
743 q.To.SetTarget(q.Link.Link)
753 if p.As == obj.APCALIGN {
754 a := c.vregoff(&p.From)
755 m = addpad(pc, a, ctxt, cursym)
757 if p.As != obj.ANOP && p.As != obj.AFUNCDATA && p.As != obj.APCDATA {
758 ctxt.Diag("zero-width instruction\n%v", p)
770 if r := pc & funcAlignMask; r != 0 {
777 * lay out the code, emitting code and data relocations.
780 c.cursym.Grow(c.cursym.Size)
785 for p := c.cursym.Func.Text.Link; p != nil; p = p.Link {
788 if int(o.size) > 4*len(out) {
789 log.Fatalf("out array in span9 is too small, need at least %d for %v", o.size/4, p)
791 // asmout is not set up to add large amounts of padding
792 if o.type_ == 0 && p.As == obj.APCALIGN {
793 pad := LOP_RRR(OP_OR, REGZERO, REGZERO, REGZERO)
794 aln := c.vregoff(&p.From)
795 v := addpad(p.Pc, aln, c.ctxt, c.cursym)
797 // Same padding instruction for all
798 for i = 0; i < int32(v/4); i++ {
799 c.ctxt.Arch.ByteOrder.PutUint32(bp, pad)
804 c.asmout(p, o, out[:])
805 for i = 0; i < int32(o.size/4); i++ {
806 c.ctxt.Arch.ByteOrder.PutUint32(bp, out[i])
813 func isint32(v int64) bool {
814 return int64(int32(v)) == v
817 func isuint32(v uint64) bool {
818 return uint64(uint32(v)) == v
821 func (c *ctxt9) aclass(a *obj.Addr) int {
827 if REG_R0 <= a.Reg && a.Reg <= REG_R31 {
830 if REG_F0 <= a.Reg && a.Reg <= REG_F31 {
833 if REG_V0 <= a.Reg && a.Reg <= REG_V31 {
836 if REG_VS0 <= a.Reg && a.Reg <= REG_VS63 {
839 if REG_CR0 <= a.Reg && a.Reg <= REG_CR7 || a.Reg == REG_CR {
842 if REG_SPR0 <= a.Reg && a.Reg <= REG_SPR0+1023 {
857 if REG_DCR0 <= a.Reg && a.Reg <= REG_DCR0+1023 {
860 if a.Reg == REG_FPSCR {
863 if a.Reg == REG_MSR {
870 case obj.NAME_EXTERN,
875 c.instoffset = a.Offset
876 if a.Sym != nil { // use relocation
877 if a.Sym.Type == objabi.STLSBSS {
878 if c.ctxt.Flag_shared {
888 case obj.NAME_GOTREF:
891 case obj.NAME_TOCREF:
895 c.instoffset = int64(c.autosize) + a.Offset
896 if c.instoffset >= -BIG && c.instoffset < BIG {
902 c.instoffset = int64(c.autosize) + a.Offset + c.ctxt.FixedFrameSize()
903 if c.instoffset >= -BIG && c.instoffset < BIG {
909 c.instoffset = a.Offset
910 if c.instoffset == 0 {
913 if c.instoffset >= -BIG && c.instoffset < BIG {
921 case obj.TYPE_TEXTSIZE:
924 case obj.TYPE_FCONST:
925 // The only cases where FCONST will occur are with float64 +/- 0.
926 // All other float constants are generated in memory.
927 f64 := a.Val.(float64)
929 if math.Signbit(f64) {
934 log.Fatalf("Unexpected nonzero FCONST operand %v", a)
940 c.instoffset = a.Offset
942 if -BIG <= c.instoffset && c.instoffset <= BIG {
945 if isint32(c.instoffset) {
951 case obj.NAME_EXTERN,
958 c.instoffset = a.Offset
960 /* not sure why this barfs */
964 c.instoffset = int64(c.autosize) + a.Offset
965 if c.instoffset >= -BIG && c.instoffset < BIG {
971 c.instoffset = int64(c.autosize) + a.Offset + c.ctxt.FixedFrameSize()
972 if c.instoffset >= -BIG && c.instoffset < BIG {
981 if c.instoffset >= 0 {
982 if c.instoffset == 0 {
985 if c.instoffset <= 0x7fff {
988 if c.instoffset <= 0xffff {
991 if c.instoffset&0xffff == 0 && isuint32(uint64(c.instoffset)) { /* && (instoffset & (1<<31)) == 0) */
994 if isint32(c.instoffset) || isuint32(uint64(c.instoffset)) {
1000 if c.instoffset >= -0x8000 {
1003 if c.instoffset&0xffff == 0 && isint32(c.instoffset) {
1006 if isint32(c.instoffset) {
1011 case obj.TYPE_BRANCH:
1012 if a.Sym != nil && c.ctxt.Flag_dynlink {
1021 func prasm(p *obj.Prog) {
1022 fmt.Printf("%v\n", p)
1025 func (c *ctxt9) oplook(p *obj.Prog) *Optab {
1030 a1 = int(p.From.Class)
1032 a1 = c.aclass(&p.From) + 1
1033 p.From.Class = int8(a1)
1038 if p.GetFrom3() != nil {
1039 a3 = int(p.GetFrom3().Class)
1041 a3 = c.aclass(p.GetFrom3()) + 1
1042 p.GetFrom3().Class = int8(a3)
1047 a4 := int(p.To.Class)
1049 a4 = c.aclass(&p.To) + 1
1050 p.To.Class = int8(a4)
1056 if REG_R0 <= p.Reg && p.Reg <= REG_R31 {
1058 } else if REG_V0 <= p.Reg && p.Reg <= REG_V31 {
1060 } else if REG_VS0 <= p.Reg && p.Reg <= REG_VS63 {
1062 } else if REG_F0 <= p.Reg && p.Reg <= REG_F31 {
1067 // c.ctxt.Logf("oplook %v %d %d %d %d\n", p, a1, a2, a3, a4)
1068 ops := oprange[p.As&obj.AMask]
1072 for i := range ops {
1074 if int(op.a2) == a2 && c1[op.a1] && c3[op.a3] && c4[op.a4] {
1075 p.Optab = uint16(cap(optab) - cap(ops) + i + 1)
1080 c.ctxt.Diag("illegal combination %v %v %v %v %v", p.As, DRconv(a1), DRconv(a2), DRconv(a3), DRconv(a4))
1088 func cmp(a int, b int) bool {
1094 if b == C_ZCON || b == C_SCON || b == C_UCON || b == C_ADDCON || b == C_ANDCON {
1099 if b == C_ZCON || b == C_SCON {
1104 if b == C_ZCON || b == C_SCON {
1109 if b == C_LR || b == C_XER || b == C_CTR {
1145 return r0iszero != 0 /*TypeKind(100016)*/
1149 if b == C_ZOREG || b == C_SOREG {
1167 func (x ocmp) Len() int {
1171 func (x ocmp) Swap(i, j int) {
1172 x[i], x[j] = x[j], x[i]
1175 // Used when sorting the optab. Sorting is
1176 // done in a way so that the best choice of
1177 // opcode/operand combination is considered first.
1178 func (x ocmp) Less(i, j int) bool {
1181 n := int(p1.as) - int(p2.as)
1186 // Consider those that generate fewer
1187 // instructions first.
1188 n = int(p1.size) - int(p2.size)
1192 // operand order should match
1193 // better choices first
1194 n = int(p1.a1) - int(p2.a1)
1198 n = int(p1.a2) - int(p2.a2)
1202 n = int(p1.a3) - int(p2.a3)
1206 n = int(p1.a4) - int(p2.a4)
1213 // Add an entry to the opcode table for
1214 // a new opcode b0 with the same operand combinations
1216 func opset(a, b0 obj.As) {
1217 oprange[a&obj.AMask] = oprange[b0]
1220 // Build the opcode table
1221 func buildop(ctxt *obj.Link) {
1222 if oprange[AANDN&obj.AMask] != nil {
1223 // Already initialized; stop now.
1224 // This happens in the cmd/asm tests,
1225 // each of which re-initializes the arch.
1231 for i := 0; i < C_NCLASS; i++ {
1232 for n = 0; n < C_NCLASS; n++ {
1238 for n = 0; optab[n].as != obj.AXXX; n++ {
1240 sort.Sort(ocmp(optab[:n]))
1241 for i := 0; i < n; i++ {
1245 for optab[i].as == r {
1248 oprange[r0] = optab[start:i]
1253 ctxt.Diag("unknown op in build: %v", r)
1254 log.Fatalf("instruction missing from switch in asm9.go:buildop: %v", r)
1256 case ADCBF: /* unary indexed: op (b+a); op (b) */
1265 case AECOWX: /* indexed store: op s,(b+a); op s,(b) */
1271 case AREM: /* macro */
1280 case ADIVW: /* op Rb[,Ra],Rd */
1285 opset(AMULHWUCC, r0)
1287 opset(AMULLWVCC, r0)
1295 opset(ADIVWUVCC, r0)
1312 opset(AMULHDUCC, r0)
1315 opset(AMULLDVCC, r0)
1322 opset(ADIVDEUCC, r0)
1327 opset(ADIVDUVCC, r0)
1339 case APOPCNTD: /* popcntd, popcntw, popcntb, cnttzw, cnttzd */
1343 opset(ACNTTZWCC, r0)
1345 opset(ACNTTZDCC, r0)
1347 case ACOPY: /* copy, paste. */
1350 case AMADDHD: /* maddhd, maddhdu, maddld */
1354 case AMOVBZ: /* lbz, stz, rlwm(r/r), lhz, lha, stz, and x variants */
1358 case AMOVBZU: /* lbz[x]u, stb[x]u, lhz[x]u, lha[x]u, sth[u]x, ld[x]u, std[u]x */
1367 case ALV: /* lvebx, lvehx, lvewx, lvx, lvxl, lvsl, lvsr */
1376 case ASTV: /* stvebx, stvehx, stvewx, stvx, stvxl */
1383 case AVAND: /* vand, vandc, vnand */
1388 case AVMRGOW: /* vmrgew, vmrgow */
1391 case AVOR: /* vor, vorc, vxor, vnor, veqv */
1398 case AVADDUM: /* vaddubm, vadduhm, vadduwm, vaddudm, vadduqm */
1405 case AVADDCU: /* vaddcuq, vaddcuw */
1409 case AVADDUS: /* vaddubs, vadduhs, vadduws */
1414 case AVADDSS: /* vaddsbs, vaddshs, vaddsws */
1419 case AVADDE: /* vaddeuqm, vaddecuq */
1420 opset(AVADDEUQM, r0)
1421 opset(AVADDECUQ, r0)
1423 case AVSUBUM: /* vsububm, vsubuhm, vsubuwm, vsubudm, vsubuqm */
1430 case AVSUBCU: /* vsubcuq, vsubcuw */
1434 case AVSUBUS: /* vsububs, vsubuhs, vsubuws */
1439 case AVSUBSS: /* vsubsbs, vsubshs, vsubsws */
1444 case AVSUBE: /* vsubeuqm, vsubecuq */
1445 opset(AVSUBEUQM, r0)
1446 opset(AVSUBECUQ, r0)
1448 case AVMULESB: /* vmulesb, vmulosb, vmuleub, vmuloub, vmulosh, vmulouh, vmulesw, vmulosw, vmuleuw, vmulouw, vmuluwm */
1461 case AVPMSUM: /* vpmsumb, vpmsumh, vpmsumw, vpmsumd */
1467 case AVR: /* vrlb, vrlh, vrlw, vrld */
1473 case AVS: /* vs[l,r], vs[l,r]o, vs[l,r]b, vs[l,r]h, vs[l,r]w, vs[l,r]d */
1487 case AVSA: /* vsrab, vsrah, vsraw, vsrad */
1493 case AVSOI: /* vsldoi */
1496 case AVCLZ: /* vclzb, vclzh, vclzw, vclzd */
1502 case AVPOPCNT: /* vpopcntb, vpopcnth, vpopcntw, vpopcntd */
1503 opset(AVPOPCNTB, r0)
1504 opset(AVPOPCNTH, r0)
1505 opset(AVPOPCNTW, r0)
1506 opset(AVPOPCNTD, r0)
1508 case AVCMPEQ: /* vcmpequb[.], vcmpequh[.], vcmpequw[.], vcmpequd[.] */
1509 opset(AVCMPEQUB, r0)
1510 opset(AVCMPEQUBCC, r0)
1511 opset(AVCMPEQUH, r0)
1512 opset(AVCMPEQUHCC, r0)
1513 opset(AVCMPEQUW, r0)
1514 opset(AVCMPEQUWCC, r0)
1515 opset(AVCMPEQUD, r0)
1516 opset(AVCMPEQUDCC, r0)
1518 case AVCMPGT: /* vcmpgt[u,s]b[.], vcmpgt[u,s]h[.], vcmpgt[u,s]w[.], vcmpgt[u,s]d[.] */
1519 opset(AVCMPGTUB, r0)
1520 opset(AVCMPGTUBCC, r0)
1521 opset(AVCMPGTUH, r0)
1522 opset(AVCMPGTUHCC, r0)
1523 opset(AVCMPGTUW, r0)
1524 opset(AVCMPGTUWCC, r0)
1525 opset(AVCMPGTUD, r0)
1526 opset(AVCMPGTUDCC, r0)
1527 opset(AVCMPGTSB, r0)
1528 opset(AVCMPGTSBCC, r0)
1529 opset(AVCMPGTSH, r0)
1530 opset(AVCMPGTSHCC, r0)
1531 opset(AVCMPGTSW, r0)
1532 opset(AVCMPGTSWCC, r0)
1533 opset(AVCMPGTSD, r0)
1534 opset(AVCMPGTSDCC, r0)
1536 case AVCMPNEZB: /* vcmpnezb[.] */
1537 opset(AVCMPNEZBCC, r0)
1539 opset(AVCMPNEBCC, r0)
1541 opset(AVCMPNEHCC, r0)
1543 opset(AVCMPNEWCC, r0)
1545 case AVPERM: /* vperm */
1546 opset(AVPERMXOR, r0)
1549 case AVBPERMQ: /* vbpermq, vbpermd */
1552 case AVSEL: /* vsel */
1555 case AVSPLTB: /* vspltb, vsplth, vspltw */
1559 case AVSPLTISB: /* vspltisb, vspltish, vspltisw */
1560 opset(AVSPLTISH, r0)
1561 opset(AVSPLTISW, r0)
1563 case AVCIPH: /* vcipher, vcipherlast */
1565 opset(AVCIPHERLAST, r0)
1567 case AVNCIPH: /* vncipher, vncipherlast */
1568 opset(AVNCIPHER, r0)
1569 opset(AVNCIPHERLAST, r0)
1571 case AVSBOX: /* vsbox */
1574 case AVSHASIGMA: /* vshasigmaw, vshasigmad */
1575 opset(AVSHASIGMAW, r0)
1576 opset(AVSHASIGMAD, r0)
1578 case ALXVD2X: /* lxvd2x, lxvdsx, lxvw4x, lxvh8x, lxvb16x */
1584 case ALXV: /* lxv */
1587 case ALXVL: /* lxvl, lxvll, lxvx */
1591 case ASTXVD2X: /* stxvd2x, stxvdsx, stxvw4x, stxvh8x, stxvb16x */
1594 opset(ASTXVB16X, r0)
1596 case ASTXV: /* stxv */
1599 case ASTXVL: /* stxvl, stxvll, stvx */
1603 case ALXSDX: /* lxsdx */
1606 case ASTXSDX: /* stxsdx */
1609 case ALXSIWAX: /* lxsiwax, lxsiwzx */
1612 case ASTXSIWX: /* stxsiwx */
1615 case AMFVSRD: /* mfvsrd, mfvsrwz (and extended mnemonics), mfvsrld */
1621 case AMTVSRD: /* mtvsrd, mtvsrwa, mtvsrwz (and extended mnemonics), mtvsrdd, mtvsrws */
1629 case AXXLAND: /* xxland, xxlandc, xxleqv, xxlnand */
1634 case AXXLOR: /* xxlorc, xxlnor, xxlor, xxlxor */
1640 case AXXSEL: /* xxsel */
1643 case AXXMRGHW: /* xxmrghw, xxmrglw */
1646 case AXXSPLTW: /* xxspltw */
1649 case AXXSPLTIB: /* xxspltib */
1650 opset(AXXSPLTIB, r0)
1652 case AXXPERM: /* xxpermdi */
1655 case AXXSLDWI: /* xxsldwi */
1656 opset(AXXPERMDI, r0)
1659 case AXXBRQ: /* xxbrq, xxbrd, xxbrw, xxbrh */
1664 case AXSCVDPSP: /* xscvdpsp, xscvspdp, xscvdpspn, xscvspdpn */
1665 opset(AXSCVSPDP, r0)
1666 opset(AXSCVDPSPN, r0)
1667 opset(AXSCVSPDPN, r0)
1669 case AXVCVDPSP: /* xvcvdpsp, xvcvspdp */
1670 opset(AXVCVSPDP, r0)
1672 case AXSCVDPSXDS: /* xscvdpsxds, xscvdpsxws, xscvdpuxds, xscvdpuxws */
1673 opset(AXSCVDPSXWS, r0)
1674 opset(AXSCVDPUXDS, r0)
1675 opset(AXSCVDPUXWS, r0)
1677 case AXSCVSXDDP: /* xscvsxddp, xscvuxddp, xscvsxdsp, xscvuxdsp */
1678 opset(AXSCVUXDDP, r0)
1679 opset(AXSCVSXDSP, r0)
1680 opset(AXSCVUXDSP, r0)
1682 case AXVCVDPSXDS: /* xvcvdpsxds, xvcvdpsxws, xvcvdpuxds, xvcvdpuxws, xvcvspsxds, xvcvspsxws, xvcvspuxds, xvcvspuxws */
1683 opset(AXVCVDPSXDS, r0)
1684 opset(AXVCVDPSXWS, r0)
1685 opset(AXVCVDPUXDS, r0)
1686 opset(AXVCVDPUXWS, r0)
1687 opset(AXVCVSPSXDS, r0)
1688 opset(AXVCVSPSXWS, r0)
1689 opset(AXVCVSPUXDS, r0)
1690 opset(AXVCVSPUXWS, r0)
1692 case AXVCVSXDDP: /* xvcvsxddp, xvcvsxwdp, xvcvuxddp, xvcvuxwdp, xvcvsxdsp, xvcvsxwsp, xvcvuxdsp, xvcvuxwsp */
1693 opset(AXVCVSXWDP, r0)
1694 opset(AXVCVUXDDP, r0)
1695 opset(AXVCVUXWDP, r0)
1696 opset(AXVCVSXDSP, r0)
1697 opset(AXVCVSXWSP, r0)
1698 opset(AXVCVUXDSP, r0)
1699 opset(AXVCVUXWSP, r0)
1701 case AAND: /* logical op Rb,Rs,Ra; no literal */
1715 case AADDME: /* op Ra, Rd */
1719 opset(AADDMEVCC, r0)
1723 opset(AADDZEVCC, r0)
1727 opset(ASUBMEVCC, r0)
1731 opset(ASUBZEVCC, r0)
1751 case AEXTSB: /* op Rs, Ra */
1757 opset(ACNTLZWCC, r0)
1761 opset(ACNTLZDCC, r0)
1763 case AFABS: /* fop [s,]d */
1775 opset(AFCTIWZCC, r0)
1779 opset(AFCTIDZCC, r0)
1783 opset(AFCFIDUCC, r0)
1785 opset(AFCFIDSCC, r0)
1797 opset(AFRSQRTECC, r0)
1801 opset(AFSQRTSCC, r0)
1808 opset(AFCPSGNCC, r0)
1821 opset(AFMADDSCC, r0)
1825 opset(AFMSUBSCC, r0)
1827 opset(AFNMADDCC, r0)
1829 opset(AFNMADDSCC, r0)
1831 opset(AFNMSUBCC, r0)
1833 opset(AFNMSUBSCC, r0)
1849 opset(AMTFSB0CC, r0)
1851 opset(AMTFSB1CC, r0)
1853 case ANEG: /* op [Ra,] Rd */
1859 case AOR: /* or/xor Rb,Rs,Ra; ori/xori $uimm,Rs,R */
1862 case AORIS: /* oris/xoris $uimm,Rs,Ra */
1877 case ASRAW: /* sraw Rb,Rs,Ra; srawi sh,Rs,Ra */
1880 case ASRAD: /* sraw Rb,Rs,Ra; srawi sh,Rs,Ra */
1883 case ASUB: /* SUB Ra,Rb,Rd => subf Rd,ra,rb */
1907 opset(ACLRLSLWI, r0)
1912 opset(ARLDIMICC, r0)
1923 opset(ARLDICLCC, r0)
1925 opset(ARLDICRCC, r0)
1928 opset(ACLRLSLDI, r0)
1941 case ASYSCALL: /* just the op; flow of control */
1982 AANDCC, /* and. Rb,Rs,Ra; andi. $uimm,Rs,Ra */
1988 /* load/store/move word with sign extension; special 32-bit move; move 32-bit literals */
1989 AMOVWZ, /* load/store/move word with zero extension; move 32-bit literals */
1990 AMOVD, /* load/store/move 64-bit values, including 32-bit literals with/without sign-extension */
1991 AMOVB, /* macro: move byte with sign extension */
1992 AMOVBU, /* macro: move byte with sign extension & update */
1995 /* op $s[,r2],r3; op r1[,r2],r3; no cc/v */
1996 ASUBC, /* op r1,$s,r3; op r1[,r2],r3 */
2020 func OPVXX1(o uint32, xo uint32, oe uint32) uint32 {
2021 return o<<26 | xo<<1 | oe<<11
2024 func OPVXX2(o uint32, xo uint32, oe uint32) uint32 {
2025 return o<<26 | xo<<2 | oe<<11
2028 func OPVXX2VA(o uint32, xo uint32, oe uint32) uint32 {
2029 return o<<26 | xo<<2 | oe<<16
2032 func OPVXX3(o uint32, xo uint32, oe uint32) uint32 {
2033 return o<<26 | xo<<3 | oe<<11
2036 func OPVXX4(o uint32, xo uint32, oe uint32) uint32 {
2037 return o<<26 | xo<<4 | oe<<11
2040 func OPDQ(o uint32, xo uint32, oe uint32) uint32 {
2041 return o<<26 | xo | oe<<4
2044 func OPVX(o uint32, xo uint32, oe uint32, rc uint32) uint32 {
2045 return o<<26 | xo | oe<<11 | rc&1
2048 func OPVC(o uint32, xo uint32, oe uint32, rc uint32) uint32 {
2049 return o<<26 | xo | oe<<11 | (rc&1)<<10
2052 func OPVCC(o uint32, xo uint32, oe uint32, rc uint32) uint32 {
2053 return o<<26 | xo<<1 | oe<<10 | rc&1
2056 func OPCC(o uint32, xo uint32, rc uint32) uint32 {
2057 return OPVCC(o, xo, 0, rc)
2060 /* the order is dest, a/s, b/imm for both arithmetic and logical operations */
2061 func AOP_RRR(op uint32, d uint32, a uint32, b uint32) uint32 {
2062 return op | (d&31)<<21 | (a&31)<<16 | (b&31)<<11
2065 /* VX-form 2-register operands, r/none/r */
2066 func AOP_RR(op uint32, d uint32, a uint32) uint32 {
2067 return op | (d&31)<<21 | (a&31)<<11
2070 /* VA-form 4-register operands */
2071 func AOP_RRRR(op uint32, d uint32, a uint32, b uint32, c uint32) uint32 {
2072 return op | (d&31)<<21 | (a&31)<<16 | (b&31)<<11 | (c&31)<<6
2075 func AOP_IRR(op uint32, d uint32, a uint32, simm uint32) uint32 {
2076 return op | (d&31)<<21 | (a&31)<<16 | simm&0xFFFF
2079 /* VX-form 2-register + UIM operands */
2080 func AOP_VIRR(op uint32, d uint32, a uint32, simm uint32) uint32 {
2081 return op | (d&31)<<21 | (simm&0xFFFF)<<16 | (a&31)<<11
2084 /* VX-form 2-register + ST + SIX operands */
2085 func AOP_IIRR(op uint32, d uint32, a uint32, sbit uint32, simm uint32) uint32 {
2086 return op | (d&31)<<21 | (a&31)<<16 | (sbit&1)<<15 | (simm&0xF)<<11
2089 /* VA-form 3-register + SHB operands */
2090 func AOP_IRRR(op uint32, d uint32, a uint32, b uint32, simm uint32) uint32 {
2091 return op | (d&31)<<21 | (a&31)<<16 | (b&31)<<11 | (simm&0xF)<<6
2094 /* VX-form 1-register + SIM operands */
2095 func AOP_IR(op uint32, d uint32, simm uint32) uint32 {
2096 return op | (d&31)<<21 | (simm&31)<<16
2099 /* XX1-form 3-register operands, 1 VSR operand */
2100 func AOP_XX1(op uint32, d uint32, a uint32, b uint32) uint32 {
2101 /* For the XX-form encodings, we need the VSX register number to be exactly */
2102 /* between 0-63, so we can properly set the rightmost bits. */
2104 return op | (r&31)<<21 | (a&31)<<16 | (b&31)<<11 | (r&32)>>5
2107 /* XX2-form 3-register operands, 2 VSR operands */
2108 func AOP_XX2(op uint32, d uint32, a uint32, b uint32) uint32 {
2111 return op | (xt&31)<<21 | (a&3)<<16 | (xb&31)<<11 | (xb&32)>>4 | (xt&32)>>5
2114 /* XX3-form 3 VSR operands */
2115 func AOP_XX3(op uint32, d uint32, a uint32, b uint32) uint32 {
2119 return op | (xt&31)<<21 | (xa&31)<<16 | (xb&31)<<11 | (xa&32)>>3 | (xb&32)>>4 | (xt&32)>>5
2122 /* XX3-form 3 VSR operands + immediate */
2123 func AOP_XX3I(op uint32, d uint32, a uint32, b uint32, c uint32) uint32 {
2127 return op | (xt&31)<<21 | (xa&31)<<16 | (xb&31)<<11 | (c&3)<<8 | (xa&32)>>3 | (xb&32)>>4 | (xt&32)>>5
2130 /* XX4-form, 4 VSR operands */
2131 func AOP_XX4(op uint32, d uint32, a uint32, b uint32, c uint32) uint32 {
2136 return op | (xt&31)<<21 | (xa&31)<<16 | (xb&31)<<11 | (xc&31)<<6 | (xc&32)>>2 | (xa&32)>>3 | (xb&32)>>4 | (xt&32)>>5
2139 /* DQ-form, VSR register, register + offset operands */
2140 func AOP_DQ(op uint32, d uint32, a uint32, b uint32) uint32 {
2141 /* For the DQ-form encodings, we need the VSX register number to be exactly */
2142 /* between 0-63, so we can properly set the SX bit. */
2144 /* The EA for this instruction form is (RA) + DQ << 4, where DQ is a 12-bit signed integer. */
2145 /* In order to match the output of the GNU objdump (and make the usage in Go asm easier), the */
2146 /* instruction is called using the sign extended value (i.e. a valid offset would be -32752 or 32752, */
2147 /* not -2047 or 2047), so 'b' needs to be adjusted to the expected 12-bit DQ value. Bear in mind that */
2148 /* bits 0 to 3 in 'dq' need to be zero, otherwise this will generate an illegal instruction. */
2149 /* If in doubt how this instruction form is encoded, refer to ISA 3.0b, pages 492 and 507. */
2151 return op | (r&31)<<21 | (a&31)<<16 | (dq&4095)<<4 | (r&32)>>2
2154 /* Z23-form, 3-register operands + CY field */
2155 func AOP_Z23I(op uint32, d uint32, a uint32, b uint32, c uint32) uint32 {
2156 return op | (d&31)<<21 | (a&31)<<16 | (b&31)<<11 | (c&3)<<7
2159 /* X-form, 3-register operands + EH field */
2160 func AOP_RRRI(op uint32, d uint32, a uint32, b uint32, c uint32) uint32 {
2161 return op | (d&31)<<21 | (a&31)<<16 | (b&31)<<11 | (c & 1)
2164 func LOP_RRR(op uint32, a uint32, s uint32, b uint32) uint32 {
2165 return op | (s&31)<<21 | (a&31)<<16 | (b&31)<<11
2168 func LOP_IRR(op uint32, a uint32, s uint32, uimm uint32) uint32 {
2169 return op | (s&31)<<21 | (a&31)<<16 | uimm&0xFFFF
2172 func OP_BR(op uint32, li uint32, aa uint32) uint32 {
2173 return op | li&0x03FFFFFC | aa<<1
2176 func OP_BC(op uint32, bo uint32, bi uint32, bd uint32, aa uint32) uint32 {
2177 return op | (bo&0x1F)<<21 | (bi&0x1F)<<16 | bd&0xFFFC | aa<<1
2180 func OP_BCR(op uint32, bo uint32, bi uint32) uint32 {
2181 return op | (bo&0x1F)<<21 | (bi&0x1F)<<16
2184 func OP_RLW(op uint32, a uint32, s uint32, sh uint32, mb uint32, me uint32) uint32 {
2185 return op | (s&31)<<21 | (a&31)<<16 | (sh&31)<<11 | (mb&31)<<6 | (me&31)<<1
2188 func AOP_RLDIC(op uint32, a uint32, s uint32, sh uint32, m uint32) uint32 {
2189 return op | (s&31)<<21 | (a&31)<<16 | (sh&31)<<11 | ((sh&32)>>5)<<1 | (m&31)<<6 | ((m&32)>>5)<<5
2192 func AOP_ISEL(op uint32, t uint32, a uint32, b uint32, bc uint32) uint32 {
2193 return op | (t&31)<<21 | (a&31)<<16 | (b&31)<<11 | (bc&0x1F)<<6
2197 /* each rhs is OPVCC(_, _, _, _) */
2198 OP_ADD = 31<<26 | 266<<1 | 0<<10 | 0
2199 OP_ADDI = 14<<26 | 0<<1 | 0<<10 | 0
2200 OP_ADDIS = 15<<26 | 0<<1 | 0<<10 | 0
2201 OP_ANDI = 28<<26 | 0<<1 | 0<<10 | 0
2202 OP_EXTSB = 31<<26 | 954<<1 | 0<<10 | 0
2203 OP_EXTSH = 31<<26 | 922<<1 | 0<<10 | 0
2204 OP_EXTSW = 31<<26 | 986<<1 | 0<<10 | 0
2205 OP_ISEL = 31<<26 | 15<<1 | 0<<10 | 0
2206 OP_MCRF = 19<<26 | 0<<1 | 0<<10 | 0
2207 OP_MCRFS = 63<<26 | 64<<1 | 0<<10 | 0
2208 OP_MCRXR = 31<<26 | 512<<1 | 0<<10 | 0
2209 OP_MFCR = 31<<26 | 19<<1 | 0<<10 | 0
2210 OP_MFFS = 63<<26 | 583<<1 | 0<<10 | 0
2211 OP_MFMSR = 31<<26 | 83<<1 | 0<<10 | 0
2212 OP_MFSPR = 31<<26 | 339<<1 | 0<<10 | 0
2213 OP_MFSR = 31<<26 | 595<<1 | 0<<10 | 0
2214 OP_MFSRIN = 31<<26 | 659<<1 | 0<<10 | 0
2215 OP_MTCRF = 31<<26 | 144<<1 | 0<<10 | 0
2216 OP_MTFSF = 63<<26 | 711<<1 | 0<<10 | 0
2217 OP_MTFSFI = 63<<26 | 134<<1 | 0<<10 | 0
2218 OP_MTMSR = 31<<26 | 146<<1 | 0<<10 | 0
2219 OP_MTMSRD = 31<<26 | 178<<1 | 0<<10 | 0
2220 OP_MTSPR = 31<<26 | 467<<1 | 0<<10 | 0
2221 OP_MTSR = 31<<26 | 210<<1 | 0<<10 | 0
2222 OP_MTSRIN = 31<<26 | 242<<1 | 0<<10 | 0
2223 OP_MULLW = 31<<26 | 235<<1 | 0<<10 | 0
2224 OP_MULLD = 31<<26 | 233<<1 | 0<<10 | 0
2225 OP_OR = 31<<26 | 444<<1 | 0<<10 | 0
2226 OP_ORI = 24<<26 | 0<<1 | 0<<10 | 0
2227 OP_ORIS = 25<<26 | 0<<1 | 0<<10 | 0
2228 OP_RLWINM = 21<<26 | 0<<1 | 0<<10 | 0
2229 OP_RLWNM = 23<<26 | 0<<1 | 0<<10 | 0
2230 OP_SUBF = 31<<26 | 40<<1 | 0<<10 | 0
2231 OP_RLDIC = 30<<26 | 4<<1 | 0<<10 | 0
2232 OP_RLDICR = 30<<26 | 2<<1 | 0<<10 | 0
2233 OP_RLDICL = 30<<26 | 0<<1 | 0<<10 | 0
2234 OP_RLDCL = 30<<26 | 8<<1 | 0<<10 | 0
2237 func oclass(a *obj.Addr) int {
2238 return int(a.Class) - 1
2246 // This function determines when a non-indexed load or store is D or
2247 // DS form for use in finding the size of the offset field in the instruction.
2248 // The size is needed when setting the offset value in the instruction
2249 // and when generating relocation for that field.
2250 // DS form instructions include: ld, ldu, lwa, std, stdu. All other
2251 // loads and stores with an offset field are D form. This function should
2252 // only be called with the same opcodes as are handled by opstore and opload.
2253 func (c *ctxt9) opform(insn uint32) int {
2256 c.ctxt.Diag("bad insn in loadform: %x", insn)
2257 case OPVCC(58, 0, 0, 0), // ld
2258 OPVCC(58, 0, 0, 1), // ldu
2259 OPVCC(58, 0, 0, 0) | 1<<1, // lwa
2260 OPVCC(62, 0, 0, 0), // std
2261 OPVCC(62, 0, 0, 1): //stdu
2263 case OP_ADDI, // add
2264 OPVCC(32, 0, 0, 0), // lwz
2265 OPVCC(33, 0, 0, 0), // lwzu
2266 OPVCC(34, 0, 0, 0), // lbz
2267 OPVCC(35, 0, 0, 0), // lbzu
2268 OPVCC(40, 0, 0, 0), // lhz
2269 OPVCC(41, 0, 0, 0), // lhzu
2270 OPVCC(42, 0, 0, 0), // lha
2271 OPVCC(43, 0, 0, 0), // lhau
2272 OPVCC(46, 0, 0, 0), // lmw
2273 OPVCC(48, 0, 0, 0), // lfs
2274 OPVCC(49, 0, 0, 0), // lfsu
2275 OPVCC(50, 0, 0, 0), // lfd
2276 OPVCC(51, 0, 0, 0), // lfdu
2277 OPVCC(36, 0, 0, 0), // stw
2278 OPVCC(37, 0, 0, 0), // stwu
2279 OPVCC(38, 0, 0, 0), // stb
2280 OPVCC(39, 0, 0, 0), // stbu
2281 OPVCC(44, 0, 0, 0), // sth
2282 OPVCC(45, 0, 0, 0), // sthu
2283 OPVCC(47, 0, 0, 0), // stmw
2284 OPVCC(52, 0, 0, 0), // stfs
2285 OPVCC(53, 0, 0, 0), // stfsu
2286 OPVCC(54, 0, 0, 0), // stfd
2287 OPVCC(55, 0, 0, 0): // stfdu
2293 // Encode instructions and create relocation for accessing s+d according to the
2294 // instruction op with source or destination (as appropriate) register reg.
2295 func (c *ctxt9) symbolAccess(s *obj.LSym, d int64, reg int16, op uint32) (o1, o2 uint32) {
2296 if c.ctxt.Headtype == objabi.Haix {
2297 // Every symbol access must be made via a TOC anchor.
2298 c.ctxt.Diag("symbolAccess called for %s", s.Name)
2301 form := c.opform(op)
2302 if c.ctxt.Flag_shared {
2307 o1 = AOP_IRR(OP_ADDIS, REGTMP, base, 0)
2308 o2 = AOP_IRR(op, uint32(reg), REGTMP, 0)
2309 rel := obj.Addrel(c.cursym)
2310 rel.Off = int32(c.pc)
2314 if c.ctxt.Flag_shared {
2317 rel.Type = objabi.R_ADDRPOWER_TOCREL
2319 rel.Type = objabi.R_ADDRPOWER_TOCREL_DS
2325 rel.Type = objabi.R_ADDRPOWER
2327 rel.Type = objabi.R_ADDRPOWER_DS
2336 func getmask(m []byte, v uint32) bool {
2339 if v != ^uint32(0) && v&(1<<31) != 0 && v&1 != 0 { /* MB > ME */
2350 for i := 0; i < 32; i++ {
2351 if v&(1<<uint(31-i)) != 0 {
2356 if i >= 32 || v&(1<<uint(31-i)) == 0 {
2362 if v&(1<<uint(31-i)) != 0 {
2373 func (c *ctxt9) maskgen(p *obj.Prog, m []byte, v uint32) {
2375 c.ctxt.Diag("cannot generate mask #%x\n%v", v, p)
2380 * 64-bit masks (rldic etc)
2382 func getmask64(m []byte, v uint64) bool {
2385 for i := 0; i < 64; i++ {
2386 if v&(uint64(1)<<uint(63-i)) != 0 {
2391 if i >= 64 || v&(uint64(1)<<uint(63-i)) == 0 {
2397 if v&(uint64(1)<<uint(63-i)) != 0 {
2408 func (c *ctxt9) maskgen64(p *obj.Prog, m []byte, v uint64) {
2409 if !getmask64(m, v) {
2410 c.ctxt.Diag("cannot generate mask #%x\n%v", v, p)
2414 func loadu32(r int, d int64) uint32 {
2416 if isuint32(uint64(d)) {
2417 return LOP_IRR(OP_ORIS, uint32(r), REGZERO, uint32(v))
2419 return AOP_IRR(OP_ADDIS, uint32(r), REGZERO, uint32(v))
2422 func high16adjusted(d int32) uint16 {
2424 return uint16((d >> 16) + 1)
2426 return uint16(d >> 16)
2429 func (c *ctxt9) asmout(p *obj.Prog, o *Optab, out []uint32) {
2436 //print("%v => case %d\n", p, o->type);
2439 c.ctxt.Diag("unknown type %d", o.type_)
2442 case 0: /* pseudo ops */
2445 case 1: /* mov r1,r2 ==> OR Rs,Rs,Ra */
2446 if p.To.Reg == REGZERO && p.From.Type == obj.TYPE_CONST {
2447 v := c.regoff(&p.From)
2448 if r0iszero != 0 /*TypeKind(100016)*/ && v != 0 {
2450 c.ctxt.Diag("literal operation on R0\n%v", p)
2453 o1 = LOP_IRR(OP_ADDI, REGZERO, REGZERO, uint32(v))
2457 o1 = LOP_RRR(OP_OR, uint32(p.To.Reg), uint32(p.From.Reg), uint32(p.From.Reg))
2459 case 2: /* int/cr/fp op Rb,[Ra],Rd */
2465 o1 = AOP_RRR(c.oprrr(p.As), uint32(p.To.Reg), uint32(r), uint32(p.From.Reg))
2467 case 3: /* mov $soreg/addcon/andcon/ucon, r ==> addis/oris/addi/ori $i,reg',r */
2468 d := c.vregoff(&p.From)
2471 r := int(p.From.Reg)
2475 if r0iszero != 0 /*TypeKind(100016)*/ && p.To.Reg == 0 && (r != 0 || v != 0) {
2476 c.ctxt.Diag("literal operation on R0\n%v", p)
2481 log.Fatalf("invalid handling of %v", p)
2483 // For UCON operands the value is right shifted 16, using ADDIS if the
2484 // value should be signed, ORIS if unsigned.
2486 if r == REGZERO && isuint32(uint64(d)) {
2487 o1 = LOP_IRR(OP_ORIS, uint32(p.To.Reg), REGZERO, uint32(v))
2492 } else if int64(int16(d)) != d {
2493 // Operand is 16 bit value with sign bit set
2494 if o.a1 == C_ANDCON {
2495 // Needs unsigned 16 bit so use ORI
2496 if r == 0 || r == REGZERO {
2497 o1 = LOP_IRR(uint32(OP_ORI), uint32(p.To.Reg), uint32(0), uint32(v))
2500 // With ADDCON, needs signed 16 bit value, fall through to use ADDI
2501 } else if o.a1 != C_ADDCON {
2502 log.Fatalf("invalid handling of %v", p)
2506 o1 = AOP_IRR(uint32(a), uint32(p.To.Reg), uint32(r), uint32(v))
2508 case 4: /* add/mul $scon,[r1],r2 */
2509 v := c.regoff(&p.From)
2515 if r0iszero != 0 /*TypeKind(100016)*/ && p.To.Reg == 0 {
2516 c.ctxt.Diag("literal operation on R0\n%v", p)
2518 if int32(int16(v)) != v {
2519 log.Fatalf("mishandled instruction %v", p)
2521 o1 = AOP_IRR(c.opirr(p.As), uint32(p.To.Reg), uint32(r), uint32(v))
2523 case 5: /* syscall */
2526 case 6: /* logical op Rb,[Rs,]Ra; no literal */
2532 // AROTL and AROTLW are extended mnemonics, which map to RLDCL and RLWNM.
2535 o1 = AOP_RLDIC(OP_RLDCL, uint32(p.To.Reg), uint32(r), uint32(p.From.Reg), uint32(0))
2537 o1 = OP_RLW(OP_RLWNM, uint32(p.To.Reg), uint32(r), uint32(p.From.Reg), 0, 31)
2539 o1 = LOP_RRR(c.oprrr(p.As), uint32(p.To.Reg), uint32(r), uint32(p.From.Reg))
2542 case 7: /* mov r, soreg ==> stw o(r) */
2548 v := c.regoff(&p.To)
2549 if p.To.Type == obj.TYPE_MEM && p.To.Index != 0 {
2551 c.ctxt.Diag("illegal indexed instruction\n%v", p)
2553 if c.ctxt.Flag_shared && r == REG_R13 {
2554 rel := obj.Addrel(c.cursym)
2555 rel.Off = int32(c.pc)
2557 // This (and the matching part in the load case
2558 // below) are the only places in the ppc64 toolchain
2559 // that knows the name of the tls variable. Possibly
2560 // we could add some assembly syntax so that the name
2561 // of the variable does not have to be assumed.
2562 rel.Sym = c.ctxt.Lookup("runtime.tls_g")
2563 rel.Type = objabi.R_POWER_TLS
2565 o1 = AOP_RRR(c.opstorex(p.As), uint32(p.From.Reg), uint32(p.To.Index), uint32(r))
2567 if int32(int16(v)) != v {
2568 log.Fatalf("mishandled instruction %v", p)
2570 // Offsets in DS form stores must be a multiple of 4
2571 inst := c.opstore(p.As)
2572 if c.opform(inst) == DS_FORM && v&0x3 != 0 {
2573 log.Fatalf("invalid offset for DS form load/store %v", p)
2575 o1 = AOP_IRR(inst, uint32(p.From.Reg), uint32(r), uint32(v))
2578 case 8: /* mov soreg, r ==> lbz/lhz/lwz o(r) */
2579 r := int(p.From.Reg)
2584 v := c.regoff(&p.From)
2585 if p.From.Type == obj.TYPE_MEM && p.From.Index != 0 {
2587 c.ctxt.Diag("illegal indexed instruction\n%v", p)
2589 if c.ctxt.Flag_shared && r == REG_R13 {
2590 rel := obj.Addrel(c.cursym)
2591 rel.Off = int32(c.pc)
2593 rel.Sym = c.ctxt.Lookup("runtime.tls_g")
2594 rel.Type = objabi.R_POWER_TLS
2596 o1 = AOP_RRR(c.oploadx(p.As), uint32(p.To.Reg), uint32(p.From.Index), uint32(r))
2598 if int32(int16(v)) != v {
2599 log.Fatalf("mishandled instruction %v", p)
2601 // Offsets in DS form loads must be a multiple of 4
2602 inst := c.opload(p.As)
2603 if c.opform(inst) == DS_FORM && v&0x3 != 0 {
2604 log.Fatalf("invalid offset for DS form load/store %v", p)
2606 o1 = AOP_IRR(inst, uint32(p.To.Reg), uint32(r), uint32(v))
2609 case 9: /* movb soreg, r ==> lbz o(r),r2; extsb r2,r2 */
2610 r := int(p.From.Reg)
2615 v := c.regoff(&p.From)
2616 if p.From.Type == obj.TYPE_MEM && p.From.Index != 0 {
2618 c.ctxt.Diag("illegal indexed instruction\n%v", p)
2620 o1 = AOP_RRR(c.oploadx(p.As), uint32(p.To.Reg), uint32(p.From.Index), uint32(r))
2622 o1 = AOP_IRR(c.opload(p.As), uint32(p.To.Reg), uint32(r), uint32(v))
2624 o2 = LOP_RRR(OP_EXTSB, uint32(p.To.Reg), uint32(p.To.Reg), 0)
2626 case 10: /* sub Ra,[Rb],Rd => subf Rd,Ra,Rb */
2632 o1 = AOP_RRR(c.oprrr(p.As), uint32(p.To.Reg), uint32(p.From.Reg), uint32(r))
2634 case 11: /* br/bl lbra */
2637 if p.To.Target() != nil {
2638 v = int32(p.To.Target().Pc - p.Pc)
2640 c.ctxt.Diag("odd branch target address\n%v", p)
2644 if v < -(1<<25) || v >= 1<<24 {
2645 c.ctxt.Diag("branch too far\n%v", p)
2649 o1 = OP_BR(c.opirr(p.As), uint32(v), 0)
2650 if p.To.Sym != nil {
2651 rel := obj.Addrel(c.cursym)
2652 rel.Off = int32(c.pc)
2655 v += int32(p.To.Offset)
2657 c.ctxt.Diag("odd branch target address\n%v", p)
2662 rel.Type = objabi.R_CALLPOWER
2664 o2 = 0x60000000 // nop, sometimes overwritten by ld r2, 24(r1) when dynamic linking
2666 case 12: /* movb r,r (extsb); movw r,r (extsw) */
2667 if p.To.Reg == REGZERO && p.From.Type == obj.TYPE_CONST {
2668 v := c.regoff(&p.From)
2669 if r0iszero != 0 /*TypeKind(100016)*/ && v != 0 {
2670 c.ctxt.Diag("literal operation on R0\n%v", p)
2673 o1 = LOP_IRR(OP_ADDI, REGZERO, REGZERO, uint32(v))
2678 o1 = LOP_RRR(OP_EXTSW, uint32(p.To.Reg), uint32(p.From.Reg), 0)
2680 o1 = LOP_RRR(OP_EXTSB, uint32(p.To.Reg), uint32(p.From.Reg), 0)
2683 case 13: /* mov[bhw]z r,r; uses rlwinm not andi. to avoid changing CC */
2685 o1 = OP_RLW(OP_RLWINM, uint32(p.To.Reg), uint32(p.From.Reg), 0, 24, 31)
2686 } else if p.As == AMOVH {
2687 o1 = LOP_RRR(OP_EXTSH, uint32(p.To.Reg), uint32(p.From.Reg), 0)
2688 } else if p.As == AMOVHZ {
2689 o1 = OP_RLW(OP_RLWINM, uint32(p.To.Reg), uint32(p.From.Reg), 0, 16, 31)
2690 } else if p.As == AMOVWZ {
2691 o1 = OP_RLW(OP_RLDIC, uint32(p.To.Reg), uint32(p.From.Reg), 0, 0, 0) | 1<<5 /* MB=32 */
2693 c.ctxt.Diag("internal: bad mov[bhw]z\n%v", p)
2696 case 14: /* rldc[lr] Rb,Rs,$mask,Ra -- left, right give different masks */
2702 d := c.vregoff(p.GetFrom3())
2706 // These opcodes expect a mask operand that has to be converted into the
2707 // appropriate operand. The way these were defined, not all valid masks are possible.
2708 // Left here for compatibility in case they were used or generated.
2709 case ARLDCL, ARLDCLCC:
2711 c.maskgen64(p, mask[:], uint64(d))
2713 a = int(mask[0]) /* MB */
2715 c.ctxt.Diag("invalid mask for rotate: %x (end != bit 63)\n%v", uint64(d), p)
2717 o1 = LOP_RRR(c.oprrr(p.As), uint32(p.To.Reg), uint32(r), uint32(p.From.Reg))
2718 o1 |= (uint32(a) & 31) << 6
2720 o1 |= 1 << 5 /* mb[5] is top bit */
2723 case ARLDCR, ARLDCRCC:
2725 c.maskgen64(p, mask[:], uint64(d))
2727 a = int(mask[1]) /* ME */
2729 c.ctxt.Diag("invalid mask for rotate: %x %x (start != 0)\n%v", uint64(d), mask[0], p)
2731 o1 = LOP_RRR(c.oprrr(p.As), uint32(p.To.Reg), uint32(r), uint32(p.From.Reg))
2732 o1 |= (uint32(a) & 31) << 6
2734 o1 |= 1 << 5 /* mb[5] is top bit */
2737 // These opcodes use a shift count like the ppc64 asm, no mask conversion done
2738 case ARLDICR, ARLDICRCC:
2740 sh := c.regoff(&p.From)
2741 if me < 0 || me > 63 || sh > 63 {
2742 c.ctxt.Diag("Invalid me or sh for RLDICR: %x %x\n%v", int(d), sh)
2744 o1 = AOP_RLDIC(c.oprrr(p.As), uint32(p.To.Reg), uint32(r), uint32(sh), uint32(me))
2746 case ARLDICL, ARLDICLCC, ARLDIC, ARLDICCC:
2748 sh := c.regoff(&p.From)
2749 if mb < 0 || mb > 63 || sh > 63 {
2750 c.ctxt.Diag("Invalid mb or sh for RLDIC, RLDICL: %x %x\n%v", mb, sh)
2752 o1 = AOP_RLDIC(c.oprrr(p.As), uint32(p.To.Reg), uint32(r), uint32(sh), uint32(mb))
2755 // This is an extended mnemonic defined in the ISA section C.8.1
2756 // clrlsldi ra,rs,n,b --> rldic ra,rs,n,b-n
2757 // It maps onto RLDIC so is directly generated here based on the operands from
2760 n := c.regoff(&p.From)
2761 if n > int32(b) || b > 63 {
2762 c.ctxt.Diag("Invalid n or b for CLRLSLDI: %x %x\n%v", n, b)
2764 o1 = AOP_RLDIC(OP_RLDIC, uint32(p.To.Reg), uint32(r), uint32(n), uint32(b)-uint32(n))
2767 c.ctxt.Diag("unexpected op in rldc case\n%v", p)
2771 case 17, /* bc bo,bi,lbra (same for now) */
2772 16: /* bc bo,bi,sbra */
2777 if p.From.Type == obj.TYPE_CONST {
2778 a = int(c.regoff(&p.From))
2779 } else if p.From.Type == obj.TYPE_REG {
2781 c.ctxt.Diag("unexpected register setting for branch with CR: %d\n", r)
2783 // BI values for the CR
2802 c.ctxt.Diag("unrecognized register: expecting CR\n")
2806 if p.To.Target() != nil {
2807 v = int32(p.To.Target().Pc - p.Pc)
2810 c.ctxt.Diag("odd branch target address\n%v", p)
2814 if v < -(1<<16) || v >= 1<<15 {
2815 c.ctxt.Diag("branch too far\n%v", p)
2817 o1 = OP_BC(c.opirr(p.As), uint32(a), uint32(r), uint32(v), 0)
2819 case 15: /* br/bl (r) => mov r,lr; br/bl (lr) */
2821 if p.As == ABC || p.As == ABCL {
2822 v = c.regoff(&p.To) & 31
2824 v = 20 /* unconditional */
2826 o1 = AOP_RRR(OP_MTSPR, uint32(p.To.Reg), 0, 0) | (REG_LR&0x1f)<<16 | ((REG_LR>>5)&0x1f)<<11
2827 o2 = OPVCC(19, 16, 0, 0)
2828 if p.As == ABL || p.As == ABCL {
2831 o2 = OP_BCR(o2, uint32(v), uint32(p.To.Index))
2833 case 18: /* br/bl (lr/ctr); bc/bcl bo,bi,(lr/ctr) */
2835 if p.As == ABC || p.As == ABCL {
2836 v = c.regoff(&p.From) & 31
2838 v = 20 /* unconditional */
2844 switch oclass(&p.To) {
2846 o1 = OPVCC(19, 528, 0, 0)
2849 o1 = OPVCC(19, 16, 0, 0)
2852 c.ctxt.Diag("bad optab entry (18): %d\n%v", p.To.Class, p)
2856 if p.As == ABL || p.As == ABCL {
2859 o1 = OP_BCR(o1, uint32(v), uint32(r))
2861 case 19: /* mov $lcon,r ==> cau+or */
2862 d := c.vregoff(&p.From)
2864 if p.From.Sym == nil {
2865 o1 = loadu32(int(p.To.Reg), d)
2866 o2 = LOP_IRR(OP_ORI, uint32(p.To.Reg), uint32(p.To.Reg), uint32(int32(d)))
2868 o1, o2 = c.symbolAccess(p.From.Sym, d, p.To.Reg, OP_ADDI)
2871 case 20: /* add $ucon,,r | addis $addcon,r,r */
2872 v := c.regoff(&p.From)
2878 if p.As == AADD && (r0iszero == 0 /*TypeKind(100016)*/ && p.Reg == 0 || r0iszero != 0 /*TypeKind(100016)*/ && p.To.Reg == 0) {
2879 c.ctxt.Diag("literal operation on R0\n%v", p)
2882 o1 = AOP_IRR(c.opirr(p.As), uint32(p.To.Reg), uint32(r), uint32(v))
2884 o1 = AOP_IRR(c.opirr(AADDIS), uint32(p.To.Reg), uint32(r), uint32(v)>>16)
2887 case 22: /* add $lcon/$andcon,r1,r2 ==> oris+ori+add/ori+add */
2888 if p.To.Reg == REGTMP || p.Reg == REGTMP {
2889 c.ctxt.Diag("can't synthesize large constant\n%v", p)
2891 d := c.vregoff(&p.From)
2896 if p.From.Sym != nil {
2897 c.ctxt.Diag("%v is not supported", p)
2899 // If operand is ANDCON, generate 2 instructions using
2900 // ORI for unsigned value; with LCON 3 instructions.
2902 o1 = LOP_IRR(OP_ORI, REGTMP, REGZERO, uint32(int32(d)))
2903 o2 = AOP_RRR(c.oprrr(p.As), uint32(p.To.Reg), REGTMP, uint32(r))
2905 o1 = loadu32(REGTMP, d)
2906 o2 = LOP_IRR(OP_ORI, REGTMP, REGTMP, uint32(int32(d)))
2907 o3 = AOP_RRR(c.oprrr(p.As), uint32(p.To.Reg), REGTMP, uint32(r))
2910 case 23: /* and $lcon/$addcon,r1,r2 ==> oris+ori+and/addi+and */
2911 if p.To.Reg == REGTMP || p.Reg == REGTMP {
2912 c.ctxt.Diag("can't synthesize large constant\n%v", p)
2914 d := c.vregoff(&p.From)
2920 // With ADDCON operand, generate 2 instructions using ADDI for signed value,
2921 // with LCON operand generate 3 instructions.
2923 o1 = LOP_IRR(OP_ADDI, REGZERO, REGTMP, uint32(int32(d)))
2924 o2 = LOP_RRR(c.oprrr(p.As), uint32(p.To.Reg), REGTMP, uint32(r))
2926 o1 = loadu32(REGTMP, d)
2927 o2 = LOP_IRR(OP_ORI, REGTMP, REGTMP, uint32(int32(d)))
2928 o3 = LOP_RRR(c.oprrr(p.As), uint32(p.To.Reg), REGTMP, uint32(r))
2930 if p.From.Sym != nil {
2931 c.ctxt.Diag("%v is not supported", p)
2934 case 24: /* lfd fA,float64(0) -> xxlxor xsA,xsaA,xsaA + fneg for -0 */
2935 o1 = AOP_XX3I(c.oprrr(AXXLXOR), uint32(p.To.Reg), uint32(p.To.Reg), uint32(p.To.Reg), uint32(0))
2936 // This is needed for -0.
2938 o2 = AOP_RRR(c.oprrr(AFNEG), uint32(p.To.Reg), 0, uint32(p.To.Reg))
2942 /* sld[.] $sh,rS,rA -> rldicr[.] $sh,rS,mask(0,63-sh),rA; srd[.] -> rldicl */
2943 v := c.regoff(&p.From)
2969 c.ctxt.Diag("unexpected op in sldi case\n%v", p)
2974 o1 = AOP_RLDIC(op, uint32(p.To.Reg), uint32(r), uint32(v), uint32(a))
2975 if p.As == ASLDCC || p.As == ASRDCC {
2976 o1 |= 1 // Set the condition code bit
2979 case 26: /* mov $lsext/auto/oreg,,r2 ==> addis+addi */
2980 if p.To.Reg == REGTMP {
2981 c.ctxt.Diag("can't synthesize large constant\n%v", p)
2983 v := c.regoff(&p.From)
2984 r := int(p.From.Reg)
2988 o1 = AOP_IRR(OP_ADDIS, REGTMP, uint32(r), uint32(high16adjusted(v)))
2989 o2 = AOP_IRR(OP_ADDI, uint32(p.To.Reg), REGTMP, uint32(v))
2991 case 27: /* subc ra,$simm,rd => subfic rd,ra,$simm */
2992 v := c.regoff(p.GetFrom3())
2994 r := int(p.From.Reg)
2995 o1 = AOP_IRR(c.opirr(p.As), uint32(p.To.Reg), uint32(r), uint32(v))
2997 case 28: /* subc r1,$lcon,r2 ==> cau+or+subfc */
2998 if p.To.Reg == REGTMP || p.From.Reg == REGTMP {
2999 c.ctxt.Diag("can't synthesize large constant\n%v", p)
3001 v := c.regoff(p.GetFrom3())
3002 o1 = AOP_IRR(OP_ADDIS, REGTMP, REGZERO, uint32(v)>>16)
3003 o2 = LOP_IRR(OP_ORI, REGTMP, REGTMP, uint32(v))
3004 o3 = AOP_RRR(c.oprrr(p.As), uint32(p.To.Reg), uint32(p.From.Reg), REGTMP)
3005 if p.From.Sym != nil {
3006 c.ctxt.Diag("%v is not supported", p)
3009 case 29: /* rldic[lr]? $sh,s,$mask,a -- left, right, plain give different masks */
3010 v := c.regoff(&p.From)
3012 d := c.vregoff(p.GetFrom3())
3014 c.maskgen64(p, mask[:], uint64(d))
3017 case ARLDC, ARLDCCC:
3018 a = int(mask[0]) /* MB */
3019 if int32(mask[1]) != (63 - v) {
3020 c.ctxt.Diag("invalid mask for shift: %x %x (shift %d)\n%v", uint64(d), mask[1], v, p)
3023 case ARLDCL, ARLDCLCC:
3024 a = int(mask[0]) /* MB */
3026 c.ctxt.Diag("invalid mask for shift: %x %s (shift %d)\n%v", uint64(d), mask[1], v, p)
3029 case ARLDCR, ARLDCRCC:
3030 a = int(mask[1]) /* ME */
3032 c.ctxt.Diag("invalid mask for shift: %x %x (shift %d)\n%v", uint64(d), mask[0], v, p)
3036 c.ctxt.Diag("unexpected op in rldic case\n%v", p)
3040 o1 = AOP_RRR(c.opirr(p.As), uint32(p.Reg), uint32(p.To.Reg), (uint32(v) & 0x1F))
3041 o1 |= (uint32(a) & 31) << 6
3046 o1 |= 1 << 5 /* mb[5] is top bit */
3049 case 30: /* rldimi $sh,s,$mask,a */
3050 v := c.regoff(&p.From)
3052 d := c.vregoff(p.GetFrom3())
3054 // Original opcodes had mask operands which had to be converted to a shift count as expected by
3057 case ARLDMI, ARLDMICC:
3059 c.maskgen64(p, mask[:], uint64(d))
3060 if int32(mask[1]) != (63 - v) {
3061 c.ctxt.Diag("invalid mask for shift: %x %x (shift %d)\n%v", uint64(d), mask[1], v, p)
3063 o1 = AOP_RRR(c.opirr(p.As), uint32(p.Reg), uint32(p.To.Reg), (uint32(v) & 0x1F))
3064 o1 |= (uint32(mask[0]) & 31) << 6
3068 if mask[0]&0x20 != 0 {
3069 o1 |= 1 << 5 /* mb[5] is top bit */
3072 // Opcodes with shift count operands.
3073 case ARLDIMI, ARLDIMICC:
3074 o1 = AOP_RRR(c.opirr(p.As), uint32(p.Reg), uint32(p.To.Reg), (uint32(v) & 0x1F))
3075 o1 |= (uint32(d) & 31) << 6
3084 case 31: /* dword */
3085 d := c.vregoff(&p.From)
3087 if c.ctxt.Arch.ByteOrder == binary.BigEndian {
3088 o1 = uint32(d >> 32)
3092 o2 = uint32(d >> 32)
3095 if p.From.Sym != nil {
3096 rel := obj.Addrel(c.cursym)
3097 rel.Off = int32(c.pc)
3099 rel.Sym = p.From.Sym
3100 rel.Add = p.From.Offset
3101 rel.Type = objabi.R_ADDR
3106 case 32: /* fmul frc,fra,frd */
3112 o1 = AOP_RRR(c.oprrr(p.As), uint32(p.To.Reg), uint32(r), 0) | (uint32(p.From.Reg)&31)<<6
3114 case 33: /* fabs [frb,]frd; fmr. frb,frd */
3115 r := int(p.From.Reg)
3117 if oclass(&p.From) == C_NONE {
3120 o1 = AOP_RRR(c.oprrr(p.As), uint32(p.To.Reg), 0, uint32(r))
3122 case 34: /* FMADDx fra,frb,frc,frt (t=a*c±b) */
3123 o1 = AOP_RRR(c.oprrr(p.As), uint32(p.To.Reg), uint32(p.From.Reg), uint32(p.Reg)) | (uint32(p.GetFrom3().Reg)&31)<<6
3125 case 35: /* mov r,lext/lauto/loreg ==> cau $(v>>16),sb,r'; store o(r') */
3126 v := c.regoff(&p.To)
3132 // Offsets in DS form stores must be a multiple of 4
3133 inst := c.opstore(p.As)
3134 if c.opform(inst) == DS_FORM && v&0x3 != 0 {
3135 log.Fatalf("invalid offset for DS form load/store %v", p)
3137 o1 = AOP_IRR(OP_ADDIS, REGTMP, uint32(r), uint32(high16adjusted(v)))
3138 o2 = AOP_IRR(inst, uint32(p.From.Reg), REGTMP, uint32(v))
3140 case 36: /* mov bz/h/hz lext/lauto/lreg,r ==> lbz/lha/lhz etc */
3141 v := c.regoff(&p.From)
3143 r := int(p.From.Reg)
3147 o1 = AOP_IRR(OP_ADDIS, REGTMP, uint32(r), uint32(high16adjusted(v)))
3148 o2 = AOP_IRR(c.opload(p.As), uint32(p.To.Reg), REGTMP, uint32(v))
3150 case 37: /* movb lext/lauto/lreg,r ==> lbz o(reg),r; extsb r */
3151 v := c.regoff(&p.From)
3153 r := int(p.From.Reg)
3157 o1 = AOP_IRR(OP_ADDIS, REGTMP, uint32(r), uint32(high16adjusted(v)))
3158 o2 = AOP_IRR(c.opload(p.As), uint32(p.To.Reg), REGTMP, uint32(v))
3159 o3 = LOP_RRR(OP_EXTSB, uint32(p.To.Reg), uint32(p.To.Reg), 0)
3162 o1 = uint32(c.regoff(&p.From))
3164 case 41: /* stswi */
3165 o1 = AOP_RRR(c.opirr(p.As), uint32(p.From.Reg), uint32(p.To.Reg), 0) | (uint32(c.regoff(p.GetFrom3()))&0x7F)<<11
3168 o1 = AOP_RRR(c.opirr(p.As), uint32(p.To.Reg), uint32(p.From.Reg), 0) | (uint32(c.regoff(p.GetFrom3()))&0x7F)<<11
3170 case 43: /* data cache instructions: op (Ra+[Rb]), [th|l] */
3171 /* TH field for dcbt/dcbtst: */
3172 /* 0 = Block access - program will soon access EA. */
3173 /* 8-15 = Stream access - sequence of access (data stream). See section 4.3.2 of the ISA for details. */
3174 /* 16 = Block access - program will soon make a transient access to EA. */
3175 /* 17 = Block access - program will not access EA for a long time. */
3177 /* L field for dcbf: */
3178 /* 0 = invalidates the block containing EA in all processors. */
3179 /* 1 = same as 0, but with limited scope (i.e. block in the current processor will not be reused soon). */
3180 /* 3 = same as 1, but with even more limited scope (i.e. block in the current processor primary cache will not be reused soon). */
3181 if p.To.Type == obj.TYPE_NONE {
3182 o1 = AOP_RRR(c.oprrr(p.As), 0, uint32(p.From.Index), uint32(p.From.Reg))
3184 th := c.regoff(&p.To)
3185 o1 = AOP_RRR(c.oprrr(p.As), uint32(th), uint32(p.From.Index), uint32(p.From.Reg))
3188 case 44: /* indexed store */
3189 o1 = AOP_RRR(c.opstorex(p.As), uint32(p.From.Reg), uint32(p.To.Index), uint32(p.To.Reg))
3191 case 45: /* indexed load */
3193 /* The assembler accepts a 4-operand l*arx instruction. The fourth operand is an Exclusive Access Hint (EH) */
3194 /* The EH field can be used as a lock acquire/release hint as follows: */
3195 /* 0 = Atomic Update (fetch-and-operate or similar algorithm) */
3196 /* 1 = Exclusive Access (lock acquire and release) */
3197 case ALBAR, ALHAR, ALWAR, ALDAR:
3198 if p.From3Type() != obj.TYPE_NONE {
3199 eh := int(c.regoff(p.GetFrom3()))
3201 c.ctxt.Diag("illegal EH field\n%v", p)
3203 o1 = AOP_RRRI(c.oploadx(p.As), uint32(p.To.Reg), uint32(p.From.Index), uint32(p.From.Reg), uint32(eh))
3205 o1 = AOP_RRR(c.oploadx(p.As), uint32(p.To.Reg), uint32(p.From.Index), uint32(p.From.Reg))
3208 o1 = AOP_RRR(c.oploadx(p.As), uint32(p.To.Reg), uint32(p.From.Index), uint32(p.From.Reg))
3210 case 46: /* plain op */
3213 case 47: /* op Ra, Rd; also op [Ra,] Rd */
3214 r := int(p.From.Reg)
3219 o1 = AOP_RRR(c.oprrr(p.As), uint32(p.To.Reg), uint32(r), 0)
3221 case 48: /* op Rs, Ra */
3222 r := int(p.From.Reg)
3227 o1 = LOP_RRR(c.oprrr(p.As), uint32(p.To.Reg), uint32(r), 0)
3229 case 49: /* op Rb; op $n, Rb */
3230 if p.From.Type != obj.TYPE_REG { /* tlbie $L, rB */
3231 v := c.regoff(&p.From) & 1
3232 o1 = AOP_RRR(c.oprrr(p.As), 0, 0, uint32(p.To.Reg)) | uint32(v)<<21
3234 o1 = AOP_RRR(c.oprrr(p.As), 0, 0, uint32(p.From.Reg))
3237 case 50: /* rem[u] r1[,r2],r3 */
3244 t := v & (1<<10 | 1) /* OE|Rc */
3245 o1 = AOP_RRR(v&^t, REGTMP, uint32(r), uint32(p.From.Reg))
3246 o2 = AOP_RRR(OP_MULLW, REGTMP, REGTMP, uint32(p.From.Reg))
3247 o3 = AOP_RRR(OP_SUBF|t, uint32(p.To.Reg), REGTMP, uint32(r))
3251 /* Clear top 32 bits */
3252 o3 = OP_RLW(OP_RLDIC, REGTMP, REGTMP, 0, 0, 0) | 1<<5
3255 case 51: /* remd[u] r1[,r2],r3 */
3262 t := v & (1<<10 | 1) /* OE|Rc */
3263 o1 = AOP_RRR(v&^t, REGTMP, uint32(r), uint32(p.From.Reg))
3264 o2 = AOP_RRR(OP_MULLD, REGTMP, REGTMP, uint32(p.From.Reg))
3265 o3 = AOP_RRR(OP_SUBF|t, uint32(p.To.Reg), REGTMP, uint32(r))
3266 /* cases 50,51: removed; can be reused. */
3268 /* cases 50,51: removed; can be reused. */
3270 case 52: /* mtfsbNx cr(n) */
3271 v := c.regoff(&p.From) & 31
3273 o1 = AOP_RRR(c.oprrr(p.As), uint32(v), 0, 0)
3275 case 53: /* mffsX ,fr1 */
3276 o1 = AOP_RRR(OP_MFFS, uint32(p.To.Reg), 0, 0)
3278 case 54: /* mov msr,r1; mov r1, msr*/
3279 if oclass(&p.From) == C_REG {
3281 o1 = AOP_RRR(OP_MTMSRD, uint32(p.From.Reg), 0, 0)
3283 o1 = AOP_RRR(OP_MTMSR, uint32(p.From.Reg), 0, 0)
3286 o1 = AOP_RRR(OP_MFMSR, uint32(p.To.Reg), 0, 0)
3289 case 55: /* op Rb, Rd */
3290 o1 = AOP_RRR(c.oprrr(p.As), uint32(p.To.Reg), 0, uint32(p.From.Reg))
3292 case 56: /* sra $sh,[s,]a; srd $sh,[s,]a */
3293 v := c.regoff(&p.From)
3299 o1 = AOP_RRR(c.opirr(p.As), uint32(r), uint32(p.To.Reg), uint32(v)&31)
3300 if (p.As == ASRAD || p.As == ASRADCC) && (v&0x20 != 0) {
3301 o1 |= 1 << 1 /* mb[5] */
3304 case 57: /* slw $sh,[s,]a -> rlwinm ... */
3305 v := c.regoff(&p.From)
3313 * Let user (gs) shoot himself in the foot.
3314 * qc has already complained.
3317 ctxt->diag("illegal shift %ld\n%v", v, p);
3327 mask[0], mask[1] = 0, 31
3329 mask[0], mask[1] = uint8(v), 31
3332 mask[0], mask[1] = 0, uint8(31-v)
3334 o1 = OP_RLW(OP_RLWINM, uint32(p.To.Reg), uint32(r), uint32(v), uint32(mask[0]), uint32(mask[1]))
3335 if p.As == ASLWCC || p.As == ASRWCC {
3336 o1 |= 1 // set the condition code
3339 case 58: /* logical $andcon,[s],a */
3340 v := c.regoff(&p.From)
3346 o1 = LOP_IRR(c.opirr(p.As), uint32(p.To.Reg), uint32(r), uint32(v))
3348 case 59: /* or/xor/and $ucon,,r | oris/xoris/andis $addcon,r,r */
3349 v := c.regoff(&p.From)
3357 o1 = LOP_IRR(c.opirr(AORIS), uint32(p.To.Reg), uint32(r), uint32(v)>>16) /* oris, xoris, andis. */
3359 o1 = LOP_IRR(c.opirr(AXORIS), uint32(p.To.Reg), uint32(r), uint32(v)>>16)
3361 o1 = LOP_IRR(c.opirr(AANDISCC), uint32(p.To.Reg), uint32(r), uint32(v)>>16)
3363 o1 = LOP_IRR(c.opirr(p.As), uint32(p.To.Reg), uint32(r), uint32(v))
3366 case 60: /* tw to,a,b */
3367 r := int(c.regoff(&p.From) & 31)
3369 o1 = AOP_RRR(c.oprrr(p.As), uint32(r), uint32(p.Reg), uint32(p.To.Reg))
3371 case 61: /* tw to,a,$simm */
3372 r := int(c.regoff(&p.From) & 31)
3374 v := c.regoff(&p.To)
3375 o1 = AOP_IRR(c.opirr(p.As), uint32(r), uint32(p.Reg), uint32(v))
3377 case 62: /* rlwmi $sh,s,$mask,a */
3378 v := c.regoff(&p.From)
3381 b := c.regoff(p.GetFrom3())
3382 // This is an extended mnemonic described in the ISA C.8.2
3383 // clrlslwi ra,rs,n,b -> rlwinm ra,rs,n,b-n,31-n
3384 // It maps onto rlwinm which is directly generated here.
3385 if v < 0 || v > 32 || b > 32 {
3386 c.ctxt.Diag("Invalid n or b for CLRLSLWI: %x %x\n%v", v, b)
3388 o1 = OP_RLW(OP_RLWINM, uint32(p.To.Reg), uint32(p.Reg), uint32(v), uint32(b-v), uint32(31-v))
3391 c.maskgen(p, mask[:], uint32(c.regoff(p.GetFrom3())))
3392 o1 = AOP_RRR(c.opirr(p.As), uint32(p.Reg), uint32(p.To.Reg), uint32(v))
3393 o1 |= (uint32(mask[0])&31)<<6 | (uint32(mask[1])&31)<<1
3396 case 63: /* rlwmi b,s,$mask,a */
3397 v := c.regoff(&p.From)
3400 b := c.regoff(p.GetFrom3())
3401 if v > b || b > 32 {
3402 // Message will match operands from the ISA even though in the
3404 c.ctxt.Diag("Invalid n or b for CLRLSLWI: %x %x\n%v", v, b)
3406 // This is an extended mnemonic described in the ISA C.8.2
3407 // clrlslwi ra,rs,n,b -> rlwinm ra,rs,n,b-n,31-n
3408 // It generates the rlwinm directly here.
3409 o1 = OP_RLW(OP_RLWINM, uint32(p.To.Reg), uint32(p.Reg), uint32(v), uint32(b-v), uint32(31-v))
3412 c.maskgen(p, mask[:], uint32(c.regoff(p.GetFrom3())))
3413 o1 = AOP_RRR(c.opirr(p.As), uint32(p.Reg), uint32(p.To.Reg), uint32(v))
3414 o1 |= (uint32(mask[0])&31)<<6 | (uint32(mask[1])&31)<<1
3417 case 64: /* mtfsf fr[, $m] {,fpcsr} */
3419 if p.From3Type() != obj.TYPE_NONE {
3420 v = c.regoff(p.GetFrom3()) & 255
3424 o1 = OP_MTFSF | uint32(v)<<17 | uint32(p.From.Reg)<<11
3426 case 65: /* MOVFL $imm,FPSCR(n) => mtfsfi crfd,imm */
3428 c.ctxt.Diag("must specify FPSCR(n)\n%v", p)
3430 o1 = OP_MTFSFI | (uint32(p.To.Reg)&15)<<23 | (uint32(c.regoff(&p.From))&31)<<12
3432 case 66: /* mov spr,r1; mov r1,spr, also dcr */
3435 if REG_R0 <= p.From.Reg && p.From.Reg <= REG_R31 {
3438 if REG_DCR0 <= v && v <= REG_DCR0+1023 {
3439 o1 = OPVCC(31, 451, 0, 0) /* mtdcr */
3441 o1 = OPVCC(31, 467, 0, 0) /* mtspr */
3445 v = int32(p.From.Reg)
3446 if REG_DCR0 <= v && v <= REG_DCR0+1023 {
3447 o1 = OPVCC(31, 323, 0, 0) /* mfdcr */
3449 o1 = OPVCC(31, 339, 0, 0) /* mfspr */
3453 o1 = AOP_RRR(o1, uint32(r), 0, 0) | (uint32(v)&0x1f)<<16 | ((uint32(v)>>5)&0x1f)<<11
3455 case 67: /* mcrf crfD,crfS */
3456 if p.From.Type != obj.TYPE_REG || p.From.Reg < REG_CR0 || REG_CR7 < p.From.Reg || p.To.Type != obj.TYPE_REG || p.To.Reg < REG_CR0 || REG_CR7 < p.To.Reg {
3457 c.ctxt.Diag("illegal CR field number\n%v", p)
3459 o1 = AOP_RRR(OP_MCRF, ((uint32(p.To.Reg) & 7) << 2), ((uint32(p.From.Reg) & 7) << 2), 0)
3461 case 68: /* mfcr rD; mfocrf CRM,rD */
3462 if p.From.Type == obj.TYPE_REG && REG_CR0 <= p.From.Reg && p.From.Reg <= REG_CR7 {
3463 v := int32(1 << uint(7-(p.To.Reg&7))) /* CR(n) */
3464 o1 = AOP_RRR(OP_MFCR, uint32(p.To.Reg), 0, 0) | 1<<20 | uint32(v)<<12 /* new form, mfocrf */
3466 o1 = AOP_RRR(OP_MFCR, uint32(p.To.Reg), 0, 0) /* old form, whole register */
3469 case 69: /* mtcrf CRM,rS */
3471 if p.From3Type() != obj.TYPE_NONE {
3473 c.ctxt.Diag("can't use both mask and CR(n)\n%v", p)
3475 v = c.regoff(p.GetFrom3()) & 0xff
3480 v = 1 << uint(7-(p.To.Reg&7)) /* CR(n) */
3484 o1 = AOP_RRR(OP_MTCRF, uint32(p.From.Reg), 0, 0) | uint32(v)<<12
3486 case 70: /* [f]cmp r,r,cr*/
3491 r = (int(p.Reg) & 7) << 2
3493 o1 = AOP_RRR(c.oprrr(p.As), uint32(r), uint32(p.From.Reg), uint32(p.To.Reg))
3495 case 71: /* cmp[l] r,i,cr*/
3500 r = (int(p.Reg) & 7) << 2
3502 o1 = AOP_RRR(c.opirr(p.As), uint32(r), uint32(p.From.Reg), 0) | uint32(c.regoff(&p.To))&0xffff
3504 case 72: /* slbmte (Rb+Rs -> slb[Rb]) -> Rs, Rb */
3505 o1 = AOP_RRR(c.oprrr(p.As), uint32(p.From.Reg), 0, uint32(p.To.Reg))
3507 case 73: /* mcrfs crfD,crfS */
3508 if p.From.Type != obj.TYPE_REG || p.From.Reg != REG_FPSCR || p.To.Type != obj.TYPE_REG || p.To.Reg < REG_CR0 || REG_CR7 < p.To.Reg {
3509 c.ctxt.Diag("illegal FPSCR/CR field number\n%v", p)
3511 o1 = AOP_RRR(OP_MCRFS, ((uint32(p.To.Reg) & 7) << 2), ((0 & 7) << 2), 0)
3513 case 77: /* syscall $scon, syscall Rx */
3514 if p.From.Type == obj.TYPE_CONST {
3515 if p.From.Offset > BIG || p.From.Offset < -BIG {
3516 c.ctxt.Diag("illegal syscall, sysnum too large: %v", p)
3518 o1 = AOP_IRR(OP_ADDI, REGZERO, REGZERO, uint32(p.From.Offset))
3519 } else if p.From.Type == obj.TYPE_REG {
3520 o1 = LOP_RRR(OP_OR, REGZERO, uint32(p.From.Reg), uint32(p.From.Reg))
3522 c.ctxt.Diag("illegal syscall: %v", p)
3523 o1 = 0x7fe00008 // trap always
3527 o3 = AOP_RRR(c.oprrr(AXOR), REGZERO, REGZERO, REGZERO) // XOR R0, R0
3529 case 78: /* undef */
3530 o1 = 0 /* "An instruction consisting entirely of binary 0s is guaranteed
3531 always to be an illegal instruction." */
3533 /* relocation operations */
3535 v := c.vregoff(&p.To)
3536 // Offsets in DS form stores must be a multiple of 4
3537 inst := c.opstore(p.As)
3538 if c.opform(inst) == DS_FORM && v&0x3 != 0 {
3539 log.Fatalf("invalid offset for DS form load/store %v", p)
3541 o1, o2 = c.symbolAccess(p.To.Sym, v, p.From.Reg, inst)
3543 //if(dlm) reloc(&p->to, p->pc, 1);
3546 v := c.vregoff(&p.From)
3547 // Offsets in DS form loads must be a multiple of 4
3548 inst := c.opload(p.As)
3549 if c.opform(inst) == DS_FORM && v&0x3 != 0 {
3550 log.Fatalf("invalid offset for DS form load/store %v", p)
3552 o1, o2 = c.symbolAccess(p.From.Sym, v, p.To.Reg, inst)
3554 //if(dlm) reloc(&p->from, p->pc, 1);
3557 v := c.vregoff(&p.From)
3558 // Offsets in DS form loads must be a multiple of 4
3559 inst := c.opload(p.As)
3560 if c.opform(inst) == DS_FORM && v&0x3 != 0 {
3561 log.Fatalf("invalid offset for DS form load/store %v", p)
3563 o1, o2 = c.symbolAccess(p.From.Sym, v, p.To.Reg, inst)
3564 o3 = LOP_RRR(OP_EXTSB, uint32(p.To.Reg), uint32(p.To.Reg), 0)
3566 //if(dlm) reloc(&p->from, p->pc, 1);
3569 if p.From.Offset != 0 {
3570 c.ctxt.Diag("invalid offset against tls var %v", p)
3572 o1 = AOP_IRR(OP_ADDI, uint32(p.To.Reg), REGZERO, 0)
3573 rel := obj.Addrel(c.cursym)
3574 rel.Off = int32(c.pc)
3576 rel.Sym = p.From.Sym
3577 rel.Type = objabi.R_POWER_TLS_LE
3580 if p.From.Offset != 0 {
3581 c.ctxt.Diag("invalid offset against tls var %v", p)
3583 o1 = AOP_IRR(OP_ADDIS, uint32(p.To.Reg), REG_R2, 0)
3584 o2 = AOP_IRR(c.opload(AMOVD), uint32(p.To.Reg), uint32(p.To.Reg), 0)
3585 rel := obj.Addrel(c.cursym)
3586 rel.Off = int32(c.pc)
3588 rel.Sym = p.From.Sym
3589 rel.Type = objabi.R_POWER_TLS_IE
3592 v := c.vregoff(&p.To)
3594 c.ctxt.Diag("invalid offset against GOT slot %v", p)
3597 o1 = AOP_IRR(OP_ADDIS, uint32(p.To.Reg), REG_R2, 0)
3598 o2 = AOP_IRR(c.opload(AMOVD), uint32(p.To.Reg), uint32(p.To.Reg), 0)
3599 rel := obj.Addrel(c.cursym)
3600 rel.Off = int32(c.pc)
3602 rel.Sym = p.From.Sym
3603 rel.Type = objabi.R_ADDRPOWER_GOT
3604 case 82: /* vector instructions, VX-form and VC-form */
3605 if p.From.Type == obj.TYPE_REG {
3606 /* reg reg none OR reg reg reg */
3607 /* 3-register operand order: VRA, VRB, VRT */
3608 /* 2-register operand order: VRA, VRT */
3609 o1 = AOP_RRR(c.oprrr(p.As), uint32(p.To.Reg), uint32(p.From.Reg), uint32(p.Reg))
3610 } else if p.From3Type() == obj.TYPE_CONST {
3611 /* imm imm reg reg */
3612 /* operand order: SIX, VRA, ST, VRT */
3613 six := int(c.regoff(&p.From))
3614 st := int(c.regoff(p.GetFrom3()))
3615 o1 = AOP_IIRR(c.opiirr(p.As), uint32(p.To.Reg), uint32(p.Reg), uint32(st), uint32(six))
3616 } else if p.From3Type() == obj.TYPE_NONE && p.Reg != 0 {
3618 /* operand order: UIM, VRB, VRT */
3619 uim := int(c.regoff(&p.From))
3620 o1 = AOP_VIRR(c.opirr(p.As), uint32(p.To.Reg), uint32(p.Reg), uint32(uim))
3623 /* operand order: SIM, VRT */
3624 sim := int(c.regoff(&p.From))
3625 o1 = AOP_IR(c.opirr(p.As), uint32(p.To.Reg), uint32(sim))
3628 case 83: /* vector instructions, VA-form */
3629 if p.From.Type == obj.TYPE_REG {
3630 /* reg reg reg reg */
3631 /* 4-register operand order: VRA, VRB, VRC, VRT */
3632 o1 = AOP_RRRR(c.oprrr(p.As), uint32(p.To.Reg), uint32(p.From.Reg), uint32(p.Reg), uint32(p.GetFrom3().Reg))
3633 } else if p.From.Type == obj.TYPE_CONST {
3634 /* imm reg reg reg */
3635 /* operand order: SHB, VRA, VRB, VRT */
3636 shb := int(c.regoff(&p.From))
3637 o1 = AOP_IRRR(c.opirrr(p.As), uint32(p.To.Reg), uint32(p.Reg), uint32(p.GetFrom3().Reg), uint32(shb))
3640 case 84: // ISEL BC,RA,RB,RT -> isel rt,ra,rb,bc
3641 bc := c.vregoff(&p.From)
3643 // rt = To.Reg, ra = p.Reg, rb = p.From3.Reg
3644 o1 = AOP_ISEL(OP_ISEL, uint32(p.To.Reg), uint32(p.Reg), uint32(p.GetFrom3().Reg), uint32(bc))
3646 case 85: /* vector instructions, VX-form */
3648 /* 2-register operand order: VRB, VRT */
3649 o1 = AOP_RR(c.oprrr(p.As), uint32(p.To.Reg), uint32(p.From.Reg))
3651 case 86: /* VSX indexed store, XX1-form */
3653 /* 3-register operand order: XT, (RB)(RA*1) */
3654 o1 = AOP_XX1(c.opstorex(p.As), uint32(p.From.Reg), uint32(p.To.Index), uint32(p.To.Reg))
3656 case 87: /* VSX indexed load, XX1-form */
3658 /* 3-register operand order: (RB)(RA*1), XT */
3659 o1 = AOP_XX1(c.oploadx(p.As), uint32(p.To.Reg), uint32(p.From.Index), uint32(p.From.Reg))
3661 case 88: /* VSX instructions, XX1-form */
3662 /* reg reg none OR reg reg reg */
3663 /* 3-register operand order: RA, RB, XT */
3664 /* 2-register operand order: XS, RA or RA, XT */
3665 xt := int32(p.To.Reg)
3666 xs := int32(p.From.Reg)
3667 /* We need to treat the special case of extended mnemonics that may have a FREG/VREG as an argument */
3668 if REG_V0 <= xt && xt <= REG_V31 {
3669 /* Convert V0-V31 to VS32-VS63 */
3671 o1 = AOP_XX1(c.oprrr(p.As), uint32(xt), uint32(p.From.Reg), uint32(p.Reg))
3672 } else if REG_F0 <= xt && xt <= REG_F31 {
3673 /* Convert F0-F31 to VS0-VS31 */
3675 o1 = AOP_XX1(c.oprrr(p.As), uint32(xt), uint32(p.From.Reg), uint32(p.Reg))
3676 } else if REG_VS0 <= xt && xt <= REG_VS63 {
3677 o1 = AOP_XX1(c.oprrr(p.As), uint32(xt), uint32(p.From.Reg), uint32(p.Reg))
3678 } else if REG_V0 <= xs && xs <= REG_V31 {
3679 /* Likewise for XS */
3681 o1 = AOP_XX1(c.oprrr(p.As), uint32(xs), uint32(p.To.Reg), uint32(p.Reg))
3682 } else if REG_F0 <= xs && xs <= REG_F31 {
3684 o1 = AOP_XX1(c.oprrr(p.As), uint32(xs), uint32(p.To.Reg), uint32(p.Reg))
3685 } else if REG_VS0 <= xs && xs <= REG_VS63 {
3686 o1 = AOP_XX1(c.oprrr(p.As), uint32(xs), uint32(p.To.Reg), uint32(p.Reg))
3689 case 89: /* VSX instructions, XX2-form */
3690 /* reg none reg OR reg imm reg */
3691 /* 2-register operand order: XB, XT or XB, UIM, XT*/
3692 uim := int(c.regoff(p.GetFrom3()))
3693 o1 = AOP_XX2(c.oprrr(p.As), uint32(p.To.Reg), uint32(uim), uint32(p.From.Reg))
3695 case 90: /* VSX instructions, XX3-form */
3696 if p.From3Type() == obj.TYPE_NONE {
3698 /* 3-register operand order: XA, XB, XT */
3699 o1 = AOP_XX3(c.oprrr(p.As), uint32(p.To.Reg), uint32(p.From.Reg), uint32(p.Reg))
3700 } else if p.From3Type() == obj.TYPE_CONST {
3701 /* reg reg reg imm */
3702 /* operand order: XA, XB, DM, XT */
3703 dm := int(c.regoff(p.GetFrom3()))
3704 o1 = AOP_XX3I(c.oprrr(p.As), uint32(p.To.Reg), uint32(p.From.Reg), uint32(p.Reg), uint32(dm))
3707 case 91: /* VSX instructions, XX4-form */
3708 /* reg reg reg reg */
3709 /* 3-register operand order: XA, XB, XC, XT */
3710 o1 = AOP_XX4(c.oprrr(p.As), uint32(p.To.Reg), uint32(p.From.Reg), uint32(p.Reg), uint32(p.GetFrom3().Reg))
3712 case 92: /* X-form instructions, 3-operands */
3713 if p.To.Type == obj.TYPE_CONST {
3715 xf := int32(p.From.Reg)
3716 if REG_F0 <= xf && xf <= REG_F31 {
3717 /* operand order: FRA, FRB, BF */
3718 bf := int(c.regoff(&p.To)) << 2
3719 o1 = AOP_RRR(c.opirr(p.As), uint32(bf), uint32(p.From.Reg), uint32(p.Reg))
3721 /* operand order: RA, RB, L */
3722 l := int(c.regoff(&p.To))
3723 o1 = AOP_RRR(c.opirr(p.As), uint32(l), uint32(p.From.Reg), uint32(p.Reg))
3725 } else if p.From3Type() == obj.TYPE_CONST {
3727 /* operand order: RB, L, RA */
3728 l := int(c.regoff(p.GetFrom3()))
3729 o1 = AOP_RRR(c.opirr(p.As), uint32(l), uint32(p.To.Reg), uint32(p.From.Reg))
3730 } else if p.To.Type == obj.TYPE_REG {
3731 cr := int32(p.To.Reg)
3732 if REG_CR0 <= cr && cr <= REG_CR7 {
3734 /* operand order: RA, RB, BF */
3735 bf := (int(p.To.Reg) & 7) << 2
3736 o1 = AOP_RRR(c.opirr(p.As), uint32(bf), uint32(p.From.Reg), uint32(p.Reg))
3737 } else if p.From.Type == obj.TYPE_CONST {
3739 /* operand order: L, RT */
3740 l := int(c.regoff(&p.From))
3741 o1 = AOP_RRR(c.opirr(p.As), uint32(p.To.Reg), uint32(l), uint32(p.Reg))
3744 case ACOPY, APASTECC:
3745 o1 = AOP_RRR(c.opirr(p.As), uint32(1), uint32(p.From.Reg), uint32(p.To.Reg))
3748 /* operand order: RS, RB, RA */
3749 o1 = AOP_RRR(c.oprrr(p.As), uint32(p.From.Reg), uint32(p.To.Reg), uint32(p.Reg))
3754 case 93: /* X-form instructions, 2-operands */
3755 if p.To.Type == obj.TYPE_CONST {
3757 /* operand order: FRB, BF */
3758 bf := int(c.regoff(&p.To)) << 2
3759 o1 = AOP_RR(c.opirr(p.As), uint32(bf), uint32(p.From.Reg))
3760 } else if p.Reg == 0 {
3761 /* popcnt* r,r, X-form */
3762 /* operand order: RS, RA */
3763 o1 = AOP_RRR(c.oprrr(p.As), uint32(p.From.Reg), uint32(p.To.Reg), uint32(p.Reg))
3766 case 94: /* Z23-form instructions, 4-operands */
3767 /* reg reg reg imm */
3768 /* operand order: RA, RB, CY, RT */
3769 cy := int(c.regoff(p.GetFrom3()))
3770 o1 = AOP_Z23I(c.oprrr(p.As), uint32(p.To.Reg), uint32(p.From.Reg), uint32(p.Reg), uint32(cy))
3772 case 95: /* Retrieve TOC relative symbol */
3773 /* This code is for AIX only */
3774 v := c.vregoff(&p.From)
3776 c.ctxt.Diag("invalid offset against TOC slot %v", p)
3779 inst := c.opload(p.As)
3780 if c.opform(inst) != DS_FORM {
3781 c.ctxt.Diag("invalid form for a TOC access in %v", p)
3784 o1 = AOP_IRR(OP_ADDIS, uint32(p.To.Reg), REG_R2, 0)
3785 o2 = AOP_IRR(inst, uint32(p.To.Reg), uint32(p.To.Reg), 0)
3786 rel := obj.Addrel(c.cursym)
3787 rel.Off = int32(c.pc)
3789 rel.Sym = p.From.Sym
3790 rel.Type = objabi.R_ADDRPOWER_TOCREL_DS
3792 case 96: /* VSX load, DQ-form */
3794 /* operand order: (RA)(DQ), XT */
3795 dq := int16(c.regoff(&p.From))
3797 c.ctxt.Diag("invalid offset for DQ form load/store %v", dq)
3799 o1 = AOP_DQ(c.opload(p.As), uint32(p.To.Reg), uint32(p.From.Reg), uint32(dq))
3801 case 97: /* VSX store, DQ-form */
3803 /* operand order: XT, (RA)(DQ) */
3804 dq := int16(c.regoff(&p.To))
3806 c.ctxt.Diag("invalid offset for DQ form load/store %v", dq)
3808 o1 = AOP_DQ(c.opstore(p.As), uint32(p.From.Reg), uint32(p.To.Reg), uint32(dq))
3809 case 98: /* VSX indexed load or load with length (also left-justified), x-form */
3810 /* vsreg, reg, reg */
3811 o1 = AOP_XX1(c.opload(p.As), uint32(p.To.Reg), uint32(p.From.Reg), uint32(p.Reg))
3812 case 99: /* VSX store with length (also left-justified) x-form */
3813 /* reg, reg, vsreg */
3814 o1 = AOP_XX1(c.opstore(p.As), uint32(p.From.Reg), uint32(p.Reg), uint32(p.To.Reg))
3815 case 100: /* VSX X-form XXSPLTIB */
3816 if p.From.Type == obj.TYPE_CONST {
3818 uim := int(c.regoff(&p.From))
3820 /* Use AOP_XX1 form with 0 for one of the registers. */
3821 o1 = AOP_XX1(c.oprrr(p.As), uint32(p.To.Reg), uint32(0), uint32(uim))
3823 c.ctxt.Diag("invalid ops for %v", p.As)
3826 o1 = AOP_XX2(c.oprrr(p.As), uint32(p.To.Reg), uint32(0), uint32(p.From.Reg))
3836 func (c *ctxt9) vregoff(a *obj.Addr) int64 {
3844 func (c *ctxt9) regoff(a *obj.Addr) int32 {
3845 return int32(c.vregoff(a))
3848 func (c *ctxt9) oprrr(a obj.As) uint32 {
3851 return OPVCC(31, 266, 0, 0)
3853 return OPVCC(31, 266, 0, 1)
3855 return OPVCC(31, 266, 1, 0)
3857 return OPVCC(31, 266, 1, 1)
3859 return OPVCC(31, 10, 0, 0)
3861 return OPVCC(31, 10, 0, 1)
3863 return OPVCC(31, 10, 1, 0)
3865 return OPVCC(31, 10, 1, 1)
3867 return OPVCC(31, 138, 0, 0)
3869 return OPVCC(31, 138, 0, 1)
3871 return OPVCC(31, 138, 1, 0)
3873 return OPVCC(31, 138, 1, 1)
3875 return OPVCC(31, 234, 0, 0)
3877 return OPVCC(31, 234, 0, 1)
3879 return OPVCC(31, 234, 1, 0)
3881 return OPVCC(31, 234, 1, 1)
3883 return OPVCC(31, 202, 0, 0)
3885 return OPVCC(31, 202, 0, 1)
3887 return OPVCC(31, 202, 1, 0)
3889 return OPVCC(31, 202, 1, 1)
3891 return OPVCC(31, 170, 0, 0) /* addex - v3.0b */
3894 return OPVCC(31, 28, 0, 0)
3896 return OPVCC(31, 28, 0, 1)
3898 return OPVCC(31, 60, 0, 0)
3900 return OPVCC(31, 60, 0, 1)
3903 return OPVCC(31, 0, 0, 0) | 1<<21 /* L=1 */
3905 return OPVCC(31, 32, 0, 0) | 1<<21
3907 return OPVCC(31, 0, 0, 0) /* L=0 */
3909 return OPVCC(31, 32, 0, 0)
3911 return OPVCC(31, 508, 0, 0) /* cmpb - v2.05 */
3913 return OPVCC(31, 224, 0, 0) /* cmpeqb - v3.00 */
3916 return OPVCC(31, 26, 0, 0)
3918 return OPVCC(31, 26, 0, 1)
3920 return OPVCC(31, 58, 0, 0)
3922 return OPVCC(31, 58, 0, 1)
3925 return OPVCC(19, 257, 0, 0)
3927 return OPVCC(19, 129, 0, 0)
3929 return OPVCC(19, 289, 0, 0)
3931 return OPVCC(19, 225, 0, 0)
3933 return OPVCC(19, 33, 0, 0)
3935 return OPVCC(19, 449, 0, 0)
3937 return OPVCC(19, 417, 0, 0)
3939 return OPVCC(19, 193, 0, 0)
3942 return OPVCC(31, 86, 0, 0)
3944 return OPVCC(31, 470, 0, 0)
3946 return OPVCC(31, 54, 0, 0)
3948 return OPVCC(31, 278, 0, 0)
3950 return OPVCC(31, 246, 0, 0)
3952 return OPVCC(31, 1014, 0, 0)
3955 return OPVCC(31, 265, 0, 0) /* modud - v3.0 */
3957 return OPVCC(31, 267, 0, 0) /* moduw - v3.0 */
3959 return OPVCC(31, 777, 0, 0) /* modsd - v3.0 */
3961 return OPVCC(31, 779, 0, 0) /* modsw - v3.0 */
3964 return OPVCC(31, 491, 0, 0)
3967 return OPVCC(31, 491, 0, 1)
3970 return OPVCC(31, 491, 1, 0)
3973 return OPVCC(31, 491, 1, 1)
3976 return OPVCC(31, 459, 0, 0)
3979 return OPVCC(31, 459, 0, 1)
3982 return OPVCC(31, 459, 1, 0)
3985 return OPVCC(31, 459, 1, 1)
3988 return OPVCC(31, 489, 0, 0)
3991 return OPVCC(31, 489, 0, 1)
3994 return OPVCC(31, 425, 0, 0)
3997 return OPVCC(31, 425, 0, 1)
4000 return OPVCC(31, 393, 0, 0)
4003 return OPVCC(31, 393, 0, 1)
4006 return OPVCC(31, 489, 1, 0)
4009 return OPVCC(31, 489, 1, 1)
4011 case ADIVDU, AREMDU:
4012 return OPVCC(31, 457, 0, 0)
4015 return OPVCC(31, 457, 0, 1)
4018 return OPVCC(31, 457, 1, 0)
4021 return OPVCC(31, 457, 1, 1)
4024 return OPVCC(31, 854, 0, 0)
4027 return OPVCC(31, 284, 0, 0)
4029 return OPVCC(31, 284, 0, 1)
4032 return OPVCC(31, 954, 0, 0)
4034 return OPVCC(31, 954, 0, 1)
4036 return OPVCC(31, 922, 0, 0)
4038 return OPVCC(31, 922, 0, 1)
4040 return OPVCC(31, 986, 0, 0)
4042 return OPVCC(31, 986, 0, 1)
4045 return OPVCC(63, 264, 0, 0)
4047 return OPVCC(63, 264, 0, 1)
4049 return OPVCC(63, 21, 0, 0)
4051 return OPVCC(63, 21, 0, 1)
4053 return OPVCC(59, 21, 0, 0)
4055 return OPVCC(59, 21, 0, 1)
4057 return OPVCC(63, 32, 0, 0)
4059 return OPVCC(63, 0, 0, 0)
4061 return OPVCC(63, 846, 0, 0)
4063 return OPVCC(63, 846, 0, 1)
4065 return OPVCC(63, 974, 0, 0)
4067 return OPVCC(63, 974, 0, 1)
4069 return OPVCC(59, 846, 0, 0)
4071 return OPVCC(59, 846, 0, 1)
4073 return OPVCC(63, 14, 0, 0)
4075 return OPVCC(63, 14, 0, 1)
4077 return OPVCC(63, 15, 0, 0)
4079 return OPVCC(63, 15, 0, 1)
4081 return OPVCC(63, 814, 0, 0)
4083 return OPVCC(63, 814, 0, 1)
4085 return OPVCC(63, 815, 0, 0)
4087 return OPVCC(63, 815, 0, 1)
4089 return OPVCC(63, 18, 0, 0)
4091 return OPVCC(63, 18, 0, 1)
4093 return OPVCC(59, 18, 0, 0)
4095 return OPVCC(59, 18, 0, 1)
4097 return OPVCC(63, 29, 0, 0)
4099 return OPVCC(63, 29, 0, 1)
4101 return OPVCC(59, 29, 0, 0)
4103 return OPVCC(59, 29, 0, 1)
4105 case AFMOVS, AFMOVD:
4106 return OPVCC(63, 72, 0, 0) /* load */
4108 return OPVCC(63, 72, 0, 1)
4110 return OPVCC(63, 28, 0, 0)
4112 return OPVCC(63, 28, 0, 1)
4114 return OPVCC(59, 28, 0, 0)
4116 return OPVCC(59, 28, 0, 1)
4118 return OPVCC(63, 25, 0, 0)
4120 return OPVCC(63, 25, 0, 1)
4122 return OPVCC(59, 25, 0, 0)
4124 return OPVCC(59, 25, 0, 1)
4126 return OPVCC(63, 136, 0, 0)
4128 return OPVCC(63, 136, 0, 1)
4130 return OPVCC(63, 40, 0, 0)
4132 return OPVCC(63, 40, 0, 1)
4134 return OPVCC(63, 31, 0, 0)
4136 return OPVCC(63, 31, 0, 1)
4138 return OPVCC(59, 31, 0, 0)
4140 return OPVCC(59, 31, 0, 1)
4142 return OPVCC(63, 30, 0, 0)
4144 return OPVCC(63, 30, 0, 1)
4146 return OPVCC(59, 30, 0, 0)
4148 return OPVCC(59, 30, 0, 1)
4150 return OPVCC(63, 8, 0, 0)
4152 return OPVCC(63, 8, 0, 1)
4154 return OPVCC(59, 24, 0, 0)
4156 return OPVCC(59, 24, 0, 1)
4158 return OPVCC(63, 488, 0, 0)
4160 return OPVCC(63, 488, 0, 1)
4162 return OPVCC(63, 456, 0, 0)
4164 return OPVCC(63, 456, 0, 1)
4166 return OPVCC(63, 424, 0, 0)
4168 return OPVCC(63, 424, 0, 1)
4170 return OPVCC(63, 392, 0, 0)
4172 return OPVCC(63, 392, 0, 1)
4174 return OPVCC(63, 12, 0, 0)
4176 return OPVCC(63, 12, 0, 1)
4178 return OPVCC(63, 26, 0, 0)
4180 return OPVCC(63, 26, 0, 1)
4182 return OPVCC(63, 23, 0, 0)
4184 return OPVCC(63, 23, 0, 1)
4186 return OPVCC(63, 22, 0, 0)
4188 return OPVCC(63, 22, 0, 1)
4190 return OPVCC(59, 22, 0, 0)
4192 return OPVCC(59, 22, 0, 1)
4194 return OPVCC(63, 20, 0, 0)
4196 return OPVCC(63, 20, 0, 1)
4198 return OPVCC(59, 20, 0, 0)
4200 return OPVCC(59, 20, 0, 1)
4203 return OPVCC(31, 982, 0, 0)
4205 return OPVCC(19, 150, 0, 0)
4208 return OPVCC(63, 70, 0, 0)
4210 return OPVCC(63, 70, 0, 1)
4212 return OPVCC(63, 38, 0, 0)
4214 return OPVCC(63, 38, 0, 1)
4217 return OPVCC(31, 75, 0, 0)
4219 return OPVCC(31, 75, 0, 1)
4221 return OPVCC(31, 11, 0, 0)
4223 return OPVCC(31, 11, 0, 1)
4225 return OPVCC(31, 235, 0, 0)
4227 return OPVCC(31, 235, 0, 1)
4229 return OPVCC(31, 235, 1, 0)
4231 return OPVCC(31, 235, 1, 1)
4234 return OPVCC(31, 73, 0, 0)
4236 return OPVCC(31, 73, 0, 1)
4238 return OPVCC(31, 9, 0, 0)
4240 return OPVCC(31, 9, 0, 1)
4242 return OPVCC(31, 233, 0, 0)
4244 return OPVCC(31, 233, 0, 1)
4246 return OPVCC(31, 233, 1, 0)
4248 return OPVCC(31, 233, 1, 1)
4251 return OPVCC(31, 476, 0, 0)
4253 return OPVCC(31, 476, 0, 1)
4255 return OPVCC(31, 104, 0, 0)
4257 return OPVCC(31, 104, 0, 1)
4259 return OPVCC(31, 104, 1, 0)
4261 return OPVCC(31, 104, 1, 1)
4263 return OPVCC(31, 124, 0, 0)
4265 return OPVCC(31, 124, 0, 1)
4267 return OPVCC(31, 444, 0, 0)
4269 return OPVCC(31, 444, 0, 1)
4271 return OPVCC(31, 412, 0, 0)
4273 return OPVCC(31, 412, 0, 1)
4276 return OPVCC(31, 506, 0, 0) /* popcntd - v2.06 */
4278 return OPVCC(31, 378, 0, 0) /* popcntw - v2.06 */
4280 return OPVCC(31, 122, 0, 0) /* popcntb - v2.02 */
4282 return OPVCC(31, 538, 0, 0) /* cnttzw - v3.00 */
4284 return OPVCC(31, 538, 0, 1) /* cnttzw. - v3.00 */
4286 return OPVCC(31, 570, 0, 0) /* cnttzd - v3.00 */
4288 return OPVCC(31, 570, 0, 1) /* cnttzd. - v3.00 */
4291 return OPVCC(19, 50, 0, 0)
4293 return OPVCC(19, 51, 0, 0)
4295 return OPVCC(19, 18, 0, 0)
4297 return OPVCC(19, 274, 0, 0)
4300 return OPVCC(20, 0, 0, 0)
4302 return OPVCC(20, 0, 0, 1)
4304 return OPVCC(23, 0, 0, 0)
4306 return OPVCC(23, 0, 0, 1)
4309 return OPVCC(30, 8, 0, 0)
4311 return OPVCC(30, 0, 0, 1)
4314 return OPVCC(30, 9, 0, 0)
4316 return OPVCC(30, 9, 0, 1)
4319 return OPVCC(30, 0, 0, 0)
4321 return OPVCC(30, 0, 0, 1)
4323 return OPVCC(30, 0, 0, 0) | 2<<1 // rldicr
4325 return OPVCC(30, 0, 0, 1) | 2<<1 // rldicr.
4328 return OPVCC(30, 0, 0, 0) | 4<<1 // rldic
4330 return OPVCC(30, 0, 0, 1) | 4<<1 // rldic.
4333 return OPVCC(17, 1, 0, 0)
4336 return OPVCC(31, 24, 0, 0)
4338 return OPVCC(31, 24, 0, 1)
4340 return OPVCC(31, 27, 0, 0)
4342 return OPVCC(31, 27, 0, 1)
4345 return OPVCC(31, 792, 0, 0)
4347 return OPVCC(31, 792, 0, 1)
4349 return OPVCC(31, 794, 0, 0)
4351 return OPVCC(31, 794, 0, 1)
4354 return OPVCC(31, 536, 0, 0)
4356 return OPVCC(31, 536, 0, 1)
4358 return OPVCC(31, 539, 0, 0)
4360 return OPVCC(31, 539, 0, 1)
4363 return OPVCC(31, 40, 0, 0)
4365 return OPVCC(31, 40, 0, 1)
4367 return OPVCC(31, 40, 1, 0)
4369 return OPVCC(31, 40, 1, 1)
4371 return OPVCC(31, 8, 0, 0)
4373 return OPVCC(31, 8, 0, 1)
4375 return OPVCC(31, 8, 1, 0)
4377 return OPVCC(31, 8, 1, 1)
4379 return OPVCC(31, 136, 0, 0)
4381 return OPVCC(31, 136, 0, 1)
4383 return OPVCC(31, 136, 1, 0)
4385 return OPVCC(31, 136, 1, 1)
4387 return OPVCC(31, 232, 0, 0)
4389 return OPVCC(31, 232, 0, 1)
4391 return OPVCC(31, 232, 1, 0)
4393 return OPVCC(31, 232, 1, 1)
4395 return OPVCC(31, 200, 0, 0)
4397 return OPVCC(31, 200, 0, 1)
4399 return OPVCC(31, 200, 1, 0)
4401 return OPVCC(31, 200, 1, 1)
4404 return OPVCC(31, 598, 0, 0)
4406 return OPVCC(31, 598, 0, 0) | 1<<21
4409 return OPVCC(31, 598, 0, 0) | 2<<21
4412 return OPVCC(31, 306, 0, 0)
4414 return OPVCC(31, 274, 0, 0)
4416 return OPVCC(31, 566, 0, 0)
4418 return OPVCC(31, 498, 0, 0)
4420 return OPVCC(31, 434, 0, 0)
4422 return OPVCC(31, 915, 0, 0)
4424 return OPVCC(31, 851, 0, 0)
4426 return OPVCC(31, 402, 0, 0)
4429 return OPVCC(31, 4, 0, 0)
4431 return OPVCC(31, 68, 0, 0)
4433 /* Vector (VMX/Altivec) instructions */
4434 /* ISA 2.03 enables these for PPC970. For POWERx processors, these */
4435 /* are enabled starting at POWER6 (ISA 2.05). */
4437 return OPVX(4, 1028, 0, 0) /* vand - v2.03 */
4439 return OPVX(4, 1092, 0, 0) /* vandc - v2.03 */
4441 return OPVX(4, 1412, 0, 0) /* vnand - v2.07 */
4444 return OPVX(4, 1156, 0, 0) /* vor - v2.03 */
4446 return OPVX(4, 1348, 0, 0) /* vorc - v2.07 */
4448 return OPVX(4, 1284, 0, 0) /* vnor - v2.03 */
4450 return OPVX(4, 1220, 0, 0) /* vxor - v2.03 */
4452 return OPVX(4, 1668, 0, 0) /* veqv - v2.07 */
4455 return OPVX(4, 0, 0, 0) /* vaddubm - v2.03 */
4457 return OPVX(4, 64, 0, 0) /* vadduhm - v2.03 */
4459 return OPVX(4, 128, 0, 0) /* vadduwm - v2.03 */
4461 return OPVX(4, 192, 0, 0) /* vaddudm - v2.07 */
4463 return OPVX(4, 256, 0, 0) /* vadduqm - v2.07 */
4466 return OPVX(4, 320, 0, 0) /* vaddcuq - v2.07 */
4468 return OPVX(4, 384, 0, 0) /* vaddcuw - v2.03 */
4471 return OPVX(4, 512, 0, 0) /* vaddubs - v2.03 */
4473 return OPVX(4, 576, 0, 0) /* vadduhs - v2.03 */
4475 return OPVX(4, 640, 0, 0) /* vadduws - v2.03 */
4478 return OPVX(4, 768, 0, 0) /* vaddsbs - v2.03 */
4480 return OPVX(4, 832, 0, 0) /* vaddshs - v2.03 */
4482 return OPVX(4, 896, 0, 0) /* vaddsws - v2.03 */
4485 return OPVX(4, 60, 0, 0) /* vaddeuqm - v2.07 */
4487 return OPVX(4, 61, 0, 0) /* vaddecuq - v2.07 */
4490 return OPVX(4, 776, 0, 0) /* vmulesb - v2.03 */
4492 return OPVX(4, 264, 0, 0) /* vmulosb - v2.03 */
4494 return OPVX(4, 520, 0, 0) /* vmuleub - v2.03 */
4496 return OPVX(4, 8, 0, 0) /* vmuloub - v2.03 */
4498 return OPVX(4, 840, 0, 0) /* vmulesh - v2.03 */
4500 return OPVX(4, 328, 0, 0) /* vmulosh - v2.03 */
4502 return OPVX(4, 584, 0, 0) /* vmuleuh - v2.03 */
4504 return OPVX(4, 72, 0, 0) /* vmulouh - v2.03 */
4506 return OPVX(4, 904, 0, 0) /* vmulesw - v2.07 */
4508 return OPVX(4, 392, 0, 0) /* vmulosw - v2.07 */
4510 return OPVX(4, 648, 0, 0) /* vmuleuw - v2.07 */
4512 return OPVX(4, 136, 0, 0) /* vmulouw - v2.07 */
4514 return OPVX(4, 137, 0, 0) /* vmuluwm - v2.07 */
4517 return OPVX(4, 1032, 0, 0) /* vpmsumb - v2.07 */
4519 return OPVX(4, 1096, 0, 0) /* vpmsumh - v2.07 */
4521 return OPVX(4, 1160, 0, 0) /* vpmsumw - v2.07 */
4523 return OPVX(4, 1224, 0, 0) /* vpmsumd - v2.07 */
4526 return OPVX(4, 35, 0, 0) /* vmsumudm - v3.00b */
4529 return OPVX(4, 1024, 0, 0) /* vsububm - v2.03 */
4531 return OPVX(4, 1088, 0, 0) /* vsubuhm - v2.03 */
4533 return OPVX(4, 1152, 0, 0) /* vsubuwm - v2.03 */
4535 return OPVX(4, 1216, 0, 0) /* vsubudm - v2.07 */
4537 return OPVX(4, 1280, 0, 0) /* vsubuqm - v2.07 */
4540 return OPVX(4, 1344, 0, 0) /* vsubcuq - v2.07 */
4542 return OPVX(4, 1408, 0, 0) /* vsubcuw - v2.03 */
4545 return OPVX(4, 1536, 0, 0) /* vsububs - v2.03 */
4547 return OPVX(4, 1600, 0, 0) /* vsubuhs - v2.03 */
4549 return OPVX(4, 1664, 0, 0) /* vsubuws - v2.03 */
4552 return OPVX(4, 1792, 0, 0) /* vsubsbs - v2.03 */
4554 return OPVX(4, 1856, 0, 0) /* vsubshs - v2.03 */
4556 return OPVX(4, 1920, 0, 0) /* vsubsws - v2.03 */
4559 return OPVX(4, 62, 0, 0) /* vsubeuqm - v2.07 */
4561 return OPVX(4, 63, 0, 0) /* vsubecuq - v2.07 */
4564 return OPVX(4, 4, 0, 0) /* vrlb - v2.03 */
4566 return OPVX(4, 68, 0, 0) /* vrlh - v2.03 */
4568 return OPVX(4, 132, 0, 0) /* vrlw - v2.03 */
4570 return OPVX(4, 196, 0, 0) /* vrld - v2.07 */
4573 return OPVX(4, 1676, 0, 0) /* vmrgow - v2.07 */
4575 return OPVX(4, 1932, 0, 0) /* vmrgew - v2.07 */
4578 return OPVX(4, 260, 0, 0) /* vslh - v2.03 */
4580 return OPVX(4, 324, 0, 0) /* vslh - v2.03 */
4582 return OPVX(4, 388, 0, 0) /* vslw - v2.03 */
4584 return OPVX(4, 452, 0, 0) /* vsl - v2.03 */
4586 return OPVX(4, 1036, 0, 0) /* vsl - v2.03 */
4588 return OPVX(4, 516, 0, 0) /* vsrb - v2.03 */
4590 return OPVX(4, 580, 0, 0) /* vsrh - v2.03 */
4592 return OPVX(4, 644, 0, 0) /* vsrw - v2.03 */
4594 return OPVX(4, 708, 0, 0) /* vsr - v2.03 */
4596 return OPVX(4, 1100, 0, 0) /* vsro - v2.03 */
4598 return OPVX(4, 1476, 0, 0) /* vsld - v2.07 */
4600 return OPVX(4, 1732, 0, 0) /* vsrd - v2.07 */
4603 return OPVX(4, 772, 0, 0) /* vsrab - v2.03 */
4605 return OPVX(4, 836, 0, 0) /* vsrah - v2.03 */
4607 return OPVX(4, 900, 0, 0) /* vsraw - v2.03 */
4609 return OPVX(4, 964, 0, 0) /* vsrad - v2.07 */
4612 return OPVC(4, 1356, 0, 0) /* vbpermq - v2.07 */
4614 return OPVC(4, 1484, 0, 0) /* vbpermd - v3.00 */
4617 return OPVX(4, 1794, 0, 0) /* vclzb - v2.07 */
4619 return OPVX(4, 1858, 0, 0) /* vclzh - v2.07 */
4621 return OPVX(4, 1922, 0, 0) /* vclzw - v2.07 */
4623 return OPVX(4, 1986, 0, 0) /* vclzd - v2.07 */
4626 return OPVX(4, 1795, 0, 0) /* vpopcntb - v2.07 */
4628 return OPVX(4, 1859, 0, 0) /* vpopcnth - v2.07 */
4630 return OPVX(4, 1923, 0, 0) /* vpopcntw - v2.07 */
4632 return OPVX(4, 1987, 0, 0) /* vpopcntd - v2.07 */
4635 return OPVC(4, 6, 0, 0) /* vcmpequb - v2.03 */
4637 return OPVC(4, 6, 0, 1) /* vcmpequb. - v2.03 */
4639 return OPVC(4, 70, 0, 0) /* vcmpequh - v2.03 */
4641 return OPVC(4, 70, 0, 1) /* vcmpequh. - v2.03 */
4643 return OPVC(4, 134, 0, 0) /* vcmpequw - v2.03 */
4645 return OPVC(4, 134, 0, 1) /* vcmpequw. - v2.03 */
4647 return OPVC(4, 199, 0, 0) /* vcmpequd - v2.07 */
4649 return OPVC(4, 199, 0, 1) /* vcmpequd. - v2.07 */
4652 return OPVC(4, 518, 0, 0) /* vcmpgtub - v2.03 */
4654 return OPVC(4, 518, 0, 1) /* vcmpgtub. - v2.03 */
4656 return OPVC(4, 582, 0, 0) /* vcmpgtuh - v2.03 */
4658 return OPVC(4, 582, 0, 1) /* vcmpgtuh. - v2.03 */
4660 return OPVC(4, 646, 0, 0) /* vcmpgtuw - v2.03 */
4662 return OPVC(4, 646, 0, 1) /* vcmpgtuw. - v2.03 */
4664 return OPVC(4, 711, 0, 0) /* vcmpgtud - v2.07 */
4666 return OPVC(4, 711, 0, 1) /* vcmpgtud. v2.07 */
4668 return OPVC(4, 774, 0, 0) /* vcmpgtsb - v2.03 */
4670 return OPVC(4, 774, 0, 1) /* vcmpgtsb. - v2.03 */
4672 return OPVC(4, 838, 0, 0) /* vcmpgtsh - v2.03 */
4674 return OPVC(4, 838, 0, 1) /* vcmpgtsh. - v2.03 */
4676 return OPVC(4, 902, 0, 0) /* vcmpgtsw - v2.03 */
4678 return OPVC(4, 902, 0, 1) /* vcmpgtsw. - v2.03 */
4680 return OPVC(4, 967, 0, 0) /* vcmpgtsd - v2.07 */
4682 return OPVC(4, 967, 0, 1) /* vcmpgtsd. - v2.07 */
4685 return OPVC(4, 263, 0, 0) /* vcmpnezb - v3.00 */
4687 return OPVC(4, 263, 0, 1) /* vcmpnezb. - v3.00 */
4689 return OPVC(4, 7, 0, 0) /* vcmpneb - v3.00 */
4691 return OPVC(4, 7, 0, 1) /* vcmpneb. - v3.00 */
4693 return OPVC(4, 71, 0, 0) /* vcmpneh - v3.00 */
4695 return OPVC(4, 71, 0, 1) /* vcmpneh. - v3.00 */
4697 return OPVC(4, 135, 0, 0) /* vcmpnew - v3.00 */
4699 return OPVC(4, 135, 0, 1) /* vcmpnew. - v3.00 */
4702 return OPVX(4, 43, 0, 0) /* vperm - v2.03 */
4704 return OPVX(4, 45, 0, 0) /* vpermxor - v2.03 */
4706 return OPVX(4, 59, 0, 0) /* vpermr - v3.0 */
4709 return OPVX(4, 42, 0, 0) /* vsel - v2.03 */
4712 return OPVX(4, 1288, 0, 0) /* vcipher - v2.07 */
4714 return OPVX(4, 1289, 0, 0) /* vcipherlast - v2.07 */
4716 return OPVX(4, 1352, 0, 0) /* vncipher - v2.07 */
4718 return OPVX(4, 1353, 0, 0) /* vncipherlast - v2.07 */
4720 return OPVX(4, 1480, 0, 0) /* vsbox - v2.07 */
4721 /* End of vector instructions */
4723 /* Vector scalar (VSX) instructions */
4724 /* ISA 2.06 enables these for POWER7. */
4725 case AMFVSRD, AMFVRD, AMFFPRD:
4726 return OPVXX1(31, 51, 0) /* mfvsrd - v2.07 */
4728 return OPVXX1(31, 115, 0) /* mfvsrwz - v2.07 */
4730 return OPVXX1(31, 307, 0) /* mfvsrld - v3.00 */
4732 case AMTVSRD, AMTFPRD, AMTVRD:
4733 return OPVXX1(31, 179, 0) /* mtvsrd - v2.07 */
4735 return OPVXX1(31, 211, 0) /* mtvsrwa - v2.07 */
4737 return OPVXX1(31, 243, 0) /* mtvsrwz - v2.07 */
4739 return OPVXX1(31, 435, 0) /* mtvsrdd - v3.00 */
4741 return OPVXX1(31, 403, 0) /* mtvsrws - v3.00 */
4744 return OPVXX3(60, 130, 0) /* xxland - v2.06 */
4746 return OPVXX3(60, 138, 0) /* xxlandc - v2.06 */
4748 return OPVXX3(60, 186, 0) /* xxleqv - v2.07 */
4750 return OPVXX3(60, 178, 0) /* xxlnand - v2.07 */
4753 return OPVXX3(60, 170, 0) /* xxlorc - v2.07 */
4755 return OPVXX3(60, 162, 0) /* xxlnor - v2.06 */
4756 case AXXLOR, AXXLORQ:
4757 return OPVXX3(60, 146, 0) /* xxlor - v2.06 */
4759 return OPVXX3(60, 154, 0) /* xxlxor - v2.06 */
4762 return OPVXX4(60, 3, 0) /* xxsel - v2.06 */
4765 return OPVXX3(60, 18, 0) /* xxmrghw - v2.06 */
4767 return OPVXX3(60, 50, 0) /* xxmrglw - v2.06 */
4770 return OPVXX2(60, 164, 0) /* xxspltw - v2.06 */
4773 return OPVCC(60, 360, 0, 0) /* xxspltib - v3.0 */
4776 return OPVXX3(60, 26, 0) /* xxperm - v2.06 */
4778 return OPVXX3(60, 10, 0) /* xxpermdi - v2.06 */
4781 return OPVXX3(60, 2, 0) /* xxsldwi - v2.06 */
4784 return OPVXX2VA(60, 475, 31) /* xxbrq - v3.0 */
4786 return OPVXX2VA(60, 475, 23) /* xxbrd - v3.0 */
4788 return OPVXX2VA(60, 475, 15) /* xxbrw - v3.0 */
4790 return OPVXX2VA(60, 475, 7) /* xxbrh - v3.0 */
4793 return OPVXX2(60, 265, 0) /* xscvdpsp - v2.06 */
4795 return OPVXX2(60, 329, 0) /* xscvspdp - v2.06 */
4797 return OPVXX2(60, 267, 0) /* xscvdpspn - v2.07 */
4799 return OPVXX2(60, 331, 0) /* xscvspdpn - v2.07 */
4802 return OPVXX2(60, 393, 0) /* xvcvdpsp - v2.06 */
4804 return OPVXX2(60, 457, 0) /* xvcvspdp - v2.06 */
4807 return OPVXX2(60, 344, 0) /* xscvdpsxds - v2.06 */
4809 return OPVXX2(60, 88, 0) /* xscvdpsxws - v2.06 */
4811 return OPVXX2(60, 328, 0) /* xscvdpuxds - v2.06 */
4813 return OPVXX2(60, 72, 0) /* xscvdpuxws - v2.06 */
4816 return OPVXX2(60, 376, 0) /* xscvsxddp - v2.06 */
4818 return OPVXX2(60, 360, 0) /* xscvuxddp - v2.06 */
4820 return OPVXX2(60, 312, 0) /* xscvsxdsp - v2.06 */
4822 return OPVXX2(60, 296, 0) /* xscvuxdsp - v2.06 */
4825 return OPVXX2(60, 472, 0) /* xvcvdpsxds - v2.06 */
4827 return OPVXX2(60, 216, 0) /* xvcvdpsxws - v2.06 */
4829 return OPVXX2(60, 456, 0) /* xvcvdpuxds - v2.06 */
4831 return OPVXX2(60, 200, 0) /* xvcvdpuxws - v2.06 */
4833 return OPVXX2(60, 408, 0) /* xvcvspsxds - v2.07 */
4835 return OPVXX2(60, 152, 0) /* xvcvspsxws - v2.07 */
4837 return OPVXX2(60, 392, 0) /* xvcvspuxds - v2.07 */
4839 return OPVXX2(60, 136, 0) /* xvcvspuxws - v2.07 */
4842 return OPVXX2(60, 504, 0) /* xvcvsxddp - v2.06 */
4844 return OPVXX2(60, 248, 0) /* xvcvsxwdp - v2.06 */
4846 return OPVXX2(60, 488, 0) /* xvcvuxddp - v2.06 */
4848 return OPVXX2(60, 232, 0) /* xvcvuxwdp - v2.06 */
4850 return OPVXX2(60, 440, 0) /* xvcvsxdsp - v2.06 */
4852 return OPVXX2(60, 184, 0) /* xvcvsxwsp - v2.06 */
4854 return OPVXX2(60, 424, 0) /* xvcvuxdsp - v2.06 */
4856 return OPVXX2(60, 168, 0) /* xvcvuxwsp - v2.06 */
4857 /* End of VSX instructions */
4860 return OPVX(4, 48, 0, 0) /* maddhd - v3.00 */
4862 return OPVX(4, 49, 0, 0) /* maddhdu - v3.00 */
4864 return OPVX(4, 51, 0, 0) /* maddld - v3.00 */
4867 return OPVCC(31, 316, 0, 0)
4869 return OPVCC(31, 316, 0, 1)
4872 c.ctxt.Diag("bad r/r, r/r/r or r/r/r/r opcode %v", a)
4876 func (c *ctxt9) opirrr(a obj.As) uint32 {
4878 /* Vector (VMX/Altivec) instructions */
4879 /* ISA 2.03 enables these for PPC970. For POWERx processors, these */
4880 /* are enabled starting at POWER6 (ISA 2.05). */
4882 return OPVX(4, 44, 0, 0) /* vsldoi - v2.03 */
4885 c.ctxt.Diag("bad i/r/r/r opcode %v", a)
4889 func (c *ctxt9) opiirr(a obj.As) uint32 {
4891 /* Vector (VMX/Altivec) instructions */
4892 /* ISA 2.07 enables these for POWER8 and beyond. */
4894 return OPVX(4, 1666, 0, 0) /* vshasigmaw - v2.07 */
4896 return OPVX(4, 1730, 0, 0) /* vshasigmad - v2.07 */
4899 c.ctxt.Diag("bad i/i/r/r opcode %v", a)
4903 func (c *ctxt9) opirr(a obj.As) uint32 {
4906 return OPVCC(14, 0, 0, 0)
4908 return OPVCC(12, 0, 0, 0)
4910 return OPVCC(13, 0, 0, 0)
4912 return OPVCC(15, 0, 0, 0) /* ADDIS */
4915 return OPVCC(28, 0, 0, 0)
4917 return OPVCC(29, 0, 0, 0) /* ANDIS. */
4920 return OPVCC(18, 0, 0, 0)
4922 return OPVCC(18, 0, 0, 0) | 1
4924 return OPVCC(18, 0, 0, 0) | 1
4926 return OPVCC(18, 0, 0, 0) | 1
4928 return OPVCC(16, 0, 0, 0)
4930 return OPVCC(16, 0, 0, 0) | 1
4933 return AOP_RRR(16<<26, 12, 2, 0)
4935 return AOP_RRR(16<<26, 4, 0, 0)
4937 return AOP_RRR(16<<26, 12, 1, 0)
4939 return AOP_RRR(16<<26, 4, 1, 0)
4941 return AOP_RRR(16<<26, 12, 0, 0)
4943 return AOP_RRR(16<<26, 4, 2, 0)
4945 return AOP_RRR(16<<26, 4, 3, 0) // apparently unordered-clear
4947 return AOP_RRR(16<<26, 12, 3, 0) // apparently unordered-set
4950 return OPVCC(11, 0, 0, 0) | 1<<21 /* L=1 */
4952 return OPVCC(10, 0, 0, 0) | 1<<21
4954 return OPVCC(11, 0, 0, 0) /* L=0 */
4956 return OPVCC(10, 0, 0, 0)
4958 return OPVCC(31, 224, 0, 0) /* cmpeqb - v3.00 */
4961 return OPVCC(31, 597, 0, 0)
4964 return OPVCC(31, 774, 0, 0) /* copy - v3.00 */
4966 return OPVCC(31, 902, 0, 1) /* paste. - v3.00 */
4968 return OPVCC(31, 755, 0, 0) /* darn - v3.00 */
4971 return OPVCC(7, 0, 0, 0)
4974 return OPVCC(24, 0, 0, 0)
4976 return OPVCC(25, 0, 0, 0) /* ORIS */
4979 return OPVCC(20, 0, 0, 0) /* rlwimi */
4981 return OPVCC(20, 0, 0, 1)
4983 return OPVCC(30, 0, 0, 0) | 3<<2 /* rldimi */
4985 return OPVCC(30, 0, 0, 1) | 3<<2
4987 return OPVCC(30, 0, 0, 0) | 3<<2 /* rldimi */
4989 return OPVCC(30, 0, 0, 1) | 3<<2
4991 return OPVCC(21, 0, 0, 0) /* rlwinm */
4993 return OPVCC(21, 0, 0, 1)
4996 return OPVCC(30, 0, 0, 0) /* rldicl */
4998 return OPVCC(30, 0, 0, 1)
5000 return OPVCC(30, 1, 0, 0) /* rldicr */
5002 return OPVCC(30, 1, 0, 1)
5004 return OPVCC(30, 0, 0, 0) | 2<<2
5006 return OPVCC(30, 0, 0, 1) | 2<<2
5009 return OPVCC(31, 824, 0, 0)
5011 return OPVCC(31, 824, 0, 1)
5013 return OPVCC(31, (413 << 1), 0, 0)
5015 return OPVCC(31, (413 << 1), 0, 1)
5018 return OPVCC(31, 725, 0, 0)
5021 return OPVCC(8, 0, 0, 0)
5024 return OPVCC(3, 0, 0, 0)
5026 return OPVCC(2, 0, 0, 0)
5028 /* Vector (VMX/Altivec) instructions */
5029 /* ISA 2.03 enables these for PPC970. For POWERx processors, these */
5030 /* are enabled starting at POWER6 (ISA 2.05). */
5032 return OPVX(4, 524, 0, 0) /* vspltb - v2.03 */
5034 return OPVX(4, 588, 0, 0) /* vsplth - v2.03 */
5036 return OPVX(4, 652, 0, 0) /* vspltw - v2.03 */
5039 return OPVX(4, 780, 0, 0) /* vspltisb - v2.03 */
5041 return OPVX(4, 844, 0, 0) /* vspltish - v2.03 */
5043 return OPVX(4, 908, 0, 0) /* vspltisw - v2.03 */
5044 /* End of vector instructions */
5047 return OPVCC(63, 128, 0, 0) /* ftdiv - v2.06 */
5049 return OPVCC(63, 160, 0, 0) /* ftsqrt - v2.06 */
5052 return OPVCC(26, 0, 0, 0) /* XORIL */
5054 return OPVCC(27, 0, 0, 0) /* XORIS */
5057 c.ctxt.Diag("bad opcode i/r or i/r/r %v", a)
5064 func (c *ctxt9) opload(a obj.As) uint32 {
5067 return OPVCC(58, 0, 0, 0) /* ld */
5069 return OPVCC(58, 0, 0, 1) /* ldu */
5071 return OPVCC(32, 0, 0, 0) /* lwz */
5073 return OPVCC(33, 0, 0, 0) /* lwzu */
5075 return OPVCC(58, 0, 0, 0) | 1<<1 /* lwa */
5077 return OPDQ(61, 1, 0) /* lxv - ISA v3.0 */
5079 return OPVXX1(31, 269, 0) /* lxvl - ISA v3.0 */
5081 return OPVXX1(31, 301, 0) /* lxvll - ISA v3.0 */
5083 return OPVXX1(31, 268, 0) /* lxvx - ISA v3.0 */
5087 return OPVCC(34, 0, 0, 0)
5090 case AMOVBU, AMOVBZU:
5091 return OPVCC(35, 0, 0, 0)
5093 return OPVCC(50, 0, 0, 0)
5095 return OPVCC(51, 0, 0, 0)
5097 return OPVCC(48, 0, 0, 0)
5099 return OPVCC(49, 0, 0, 0)
5101 return OPVCC(42, 0, 0, 0)
5103 return OPVCC(43, 0, 0, 0)
5105 return OPVCC(40, 0, 0, 0)
5107 return OPVCC(41, 0, 0, 0)
5109 return OPVCC(46, 0, 0, 0) /* lmw */
5112 c.ctxt.Diag("bad load opcode %v", a)
5117 * indexed load a(b),d
5119 func (c *ctxt9) oploadx(a obj.As) uint32 {
5122 return OPVCC(31, 23, 0, 0) /* lwzx */
5124 return OPVCC(31, 55, 0, 0) /* lwzux */
5126 return OPVCC(31, 341, 0, 0) /* lwax */
5128 return OPVCC(31, 373, 0, 0) /* lwaux */
5131 return OPVCC(31, 87, 0, 0) /* lbzx */
5133 case AMOVBU, AMOVBZU:
5134 return OPVCC(31, 119, 0, 0) /* lbzux */
5136 return OPVCC(31, 599, 0, 0) /* lfdx */
5138 return OPVCC(31, 631, 0, 0) /* lfdux */
5140 return OPVCC(31, 535, 0, 0) /* lfsx */
5142 return OPVCC(31, 567, 0, 0) /* lfsux */
5144 return OPVCC(31, 855, 0, 0) /* lfiwax - power6, isa 2.05 */
5146 return OPVCC(31, 887, 0, 0) /* lfiwzx - power7, isa 2.06 */
5148 return OPVCC(31, 343, 0, 0) /* lhax */
5150 return OPVCC(31, 375, 0, 0) /* lhaux */
5152 return OPVCC(31, 790, 0, 0) /* lhbrx */
5154 return OPVCC(31, 534, 0, 0) /* lwbrx */
5156 return OPVCC(31, 532, 0, 0) /* ldbrx */
5158 return OPVCC(31, 279, 0, 0) /* lhzx */
5160 return OPVCC(31, 311, 0, 0) /* lhzux */
5162 return OPVCC(31, 310, 0, 0) /* eciwx */
5164 return OPVCC(31, 52, 0, 0) /* lbarx */
5166 return OPVCC(31, 116, 0, 0) /* lharx */
5168 return OPVCC(31, 20, 0, 0) /* lwarx */
5170 return OPVCC(31, 84, 0, 0) /* ldarx */
5172 return OPVCC(31, 533, 0, 0) /* lswx */
5174 return OPVCC(31, 21, 0, 0) /* ldx */
5176 return OPVCC(31, 53, 0, 0) /* ldux */
5178 return OPVCC(31, 309, 0, 0) /* ldmx */
5180 /* Vector (VMX/Altivec) instructions */
5182 return OPVCC(31, 7, 0, 0) /* lvebx - v2.03 */
5184 return OPVCC(31, 39, 0, 0) /* lvehx - v2.03 */
5186 return OPVCC(31, 71, 0, 0) /* lvewx - v2.03 */
5188 return OPVCC(31, 103, 0, 0) /* lvx - v2.03 */
5190 return OPVCC(31, 359, 0, 0) /* lvxl - v2.03 */
5192 return OPVCC(31, 6, 0, 0) /* lvsl - v2.03 */
5194 return OPVCC(31, 38, 0, 0) /* lvsr - v2.03 */
5195 /* End of vector instructions */
5197 /* Vector scalar (VSX) instructions */
5199 return OPVXX1(31, 268, 0) /* lxvx - ISA v3.0 */
5201 return OPVXX1(31, 844, 0) /* lxvd2x - v2.06 */
5203 return OPVXX1(31, 780, 0) /* lxvw4x - v2.06 */
5205 return OPVXX1(31, 812, 0) /* lxvh8x - v3.00 */
5207 return OPVXX1(31, 876, 0) /* lxvb16x - v3.00 */
5209 return OPVXX1(31, 332, 0) /* lxvdsx - v2.06 */
5211 return OPVXX1(31, 588, 0) /* lxsdx - v2.06 */
5213 return OPVXX1(31, 76, 0) /* lxsiwax - v2.07 */
5215 return OPVXX1(31, 12, 0) /* lxsiwzx - v2.07 */
5218 c.ctxt.Diag("bad loadx opcode %v", a)
5225 func (c *ctxt9) opstore(a obj.As) uint32 {
5228 return OPVCC(38, 0, 0, 0) /* stb */
5230 case AMOVBU, AMOVBZU:
5231 return OPVCC(39, 0, 0, 0) /* stbu */
5233 return OPVCC(54, 0, 0, 0) /* stfd */
5235 return OPVCC(55, 0, 0, 0) /* stfdu */
5237 return OPVCC(52, 0, 0, 0) /* stfs */
5239 return OPVCC(53, 0, 0, 0) /* stfsu */
5242 return OPVCC(44, 0, 0, 0) /* sth */
5244 case AMOVHZU, AMOVHU:
5245 return OPVCC(45, 0, 0, 0) /* sthu */
5247 return OPVCC(47, 0, 0, 0) /* stmw */
5249 return OPVCC(31, 725, 0, 0) /* stswi */
5252 return OPVCC(36, 0, 0, 0) /* stw */
5254 case AMOVWZU, AMOVWU:
5255 return OPVCC(37, 0, 0, 0) /* stwu */
5257 return OPVCC(62, 0, 0, 0) /* std */
5259 return OPVCC(62, 0, 0, 1) /* stdu */
5261 return OPDQ(61, 5, 0) /* stxv ISA 3.0 */
5263 return OPVXX1(31, 397, 0) /* stxvl ISA 3.0 */
5265 return OPVXX1(31, 429, 0) /* stxvll ISA 3.0 */
5267 return OPVXX1(31, 396, 0) /* stxvx - ISA v3.0 */
5271 c.ctxt.Diag("unknown store opcode %v", a)
5276 * indexed store s,a(b)
5278 func (c *ctxt9) opstorex(a obj.As) uint32 {
5281 return OPVCC(31, 215, 0, 0) /* stbx */
5283 case AMOVBU, AMOVBZU:
5284 return OPVCC(31, 247, 0, 0) /* stbux */
5286 return OPVCC(31, 727, 0, 0) /* stfdx */
5288 return OPVCC(31, 759, 0, 0) /* stfdux */
5290 return OPVCC(31, 663, 0, 0) /* stfsx */
5292 return OPVCC(31, 695, 0, 0) /* stfsux */
5294 return OPVCC(31, 983, 0, 0) /* stfiwx */
5297 return OPVCC(31, 407, 0, 0) /* sthx */
5299 return OPVCC(31, 918, 0, 0) /* sthbrx */
5301 case AMOVHZU, AMOVHU:
5302 return OPVCC(31, 439, 0, 0) /* sthux */
5305 return OPVCC(31, 151, 0, 0) /* stwx */
5307 case AMOVWZU, AMOVWU:
5308 return OPVCC(31, 183, 0, 0) /* stwux */
5310 return OPVCC(31, 661, 0, 0) /* stswx */
5312 return OPVCC(31, 662, 0, 0) /* stwbrx */
5314 return OPVCC(31, 660, 0, 0) /* stdbrx */
5316 return OPVCC(31, 694, 0, 1) /* stbcx. */
5318 return OPVCC(31, 726, 0, 1) /* sthcx. */
5320 return OPVCC(31, 150, 0, 1) /* stwcx. */
5322 return OPVCC(31, 214, 0, 1) /* stwdx. */
5324 return OPVCC(31, 438, 0, 0) /* ecowx */
5326 return OPVCC(31, 149, 0, 0) /* stdx */
5328 return OPVCC(31, 181, 0, 0) /* stdux */
5330 /* Vector (VMX/Altivec) instructions */
5332 return OPVCC(31, 135, 0, 0) /* stvebx - v2.03 */
5334 return OPVCC(31, 167, 0, 0) /* stvehx - v2.03 */
5336 return OPVCC(31, 199, 0, 0) /* stvewx - v2.03 */
5338 return OPVCC(31, 231, 0, 0) /* stvx - v2.03 */
5340 return OPVCC(31, 487, 0, 0) /* stvxl - v2.03 */
5341 /* End of vector instructions */
5343 /* Vector scalar (VSX) instructions */
5345 return OPVXX1(31, 396, 0) /* stxvx - v3.0 */
5347 return OPVXX1(31, 972, 0) /* stxvd2x - v2.06 */
5349 return OPVXX1(31, 908, 0) /* stxvw4x - v2.06 */
5351 return OPVXX1(31, 940, 0) /* stxvh8x - v3.0 */
5353 return OPVXX1(31, 1004, 0) /* stxvb16x - v3.0 */
5356 return OPVXX1(31, 716, 0) /* stxsdx - v2.06 */
5359 return OPVXX1(31, 140, 0) /* stxsiwx - v2.07 */
5361 /* End of vector scalar instructions */
5365 c.ctxt.Diag("unknown storex opcode %v", a)