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.ADUFFZERO, C_NONE, C_NONE, C_NONE, C_LBRA, 11, 4, 0}, // same as ABR/ABL
617 {obj.ADUFFCOPY, C_NONE, C_NONE, C_NONE, C_LBRA, 11, 4, 0}, // same as ABR/ABL
618 {obj.APCALIGN, C_LCON, C_NONE, C_NONE, C_NONE, 0, 0, 0}, // align code
620 {obj.AXXX, C_NONE, C_NONE, C_NONE, C_NONE, 0, 4, 0},
623 var oprange [ALAST & obj.AMask][]Optab
625 var xcmp [C_NCLASS][C_NCLASS]bool
627 // padding bytes to add to align code as requested
628 func addpad(pc, a int64, ctxt *obj.Link, cursym *obj.LSym) int {
629 // For 16 and 32 byte alignment, there is a tradeoff
630 // between aligning the code and adding too many NOPs.
637 // Align to 16 bytes if possible but add at
646 // Align to 32 bytes if possible but add at
656 // When 32 byte alignment is requested on Linux,
657 // promote the function's alignment to 32. On AIX
658 // the function alignment is not changed which might
659 // result in 16 byte alignment but that is still fine.
660 // TODO: alignment on AIX
661 if ctxt.Headtype != objabi.Haix && cursym.Func.Align < 32 {
662 cursym.Func.Align = 32
665 ctxt.Diag("Unexpected alignment: %d for PCALIGN directive\n", a)
670 func span9(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) {
671 p := cursym.Func.Text
672 if p == nil || p.Link == nil { // handle external functions and ELF section symbols
676 if oprange[AANDN&obj.AMask] == nil {
677 ctxt.Diag("ppc64 ops not initialized, call ppc64.buildop first")
680 c := ctxt9{ctxt: ctxt, newprog: newprog, cursym: cursym, autosize: int32(p.To.Offset)}
687 for p = p.Link; p != nil; p = p.Link {
692 if p.As == obj.APCALIGN {
693 a := c.vregoff(&p.From)
694 m = addpad(pc, a, ctxt, cursym)
696 if p.As != obj.ANOP && p.As != obj.AFUNCDATA && p.As != obj.APCDATA {
697 ctxt.Diag("zero-width instruction\n%v", p)
708 * if any procedure is large enough to
709 * generate a large SBRA branch, then
710 * generate extra passes putting branches
711 * around jmps to fix. this is rare.
720 for p = c.cursym.Func.Text.Link; p != nil; p = p.Link {
724 // very large conditional branches
725 if (o.type_ == 16 || o.type_ == 17) && p.Pcond != nil {
726 otxt = p.Pcond.Pc - pc
727 if otxt < -(1<<15)+10 || otxt >= (1<<15)-10 {
732 q.To.Type = obj.TYPE_BRANCH
739 q.To.Type = obj.TYPE_BRANCH
740 q.Pcond = q.Link.Link
750 if p.As == obj.APCALIGN {
751 a := c.vregoff(&p.From)
752 m = addpad(pc, a, ctxt, cursym)
754 if p.As != obj.ANOP && p.As != obj.AFUNCDATA && p.As != obj.APCDATA {
755 ctxt.Diag("zero-width instruction\n%v", p)
767 if r := pc & funcAlignMask; r != 0 {
774 * lay out the code, emitting code and data relocations.
777 c.cursym.Grow(c.cursym.Size)
782 for p := c.cursym.Func.Text.Link; p != nil; p = p.Link {
785 if int(o.size) > 4*len(out) {
786 log.Fatalf("out array in span9 is too small, need at least %d for %v", o.size/4, p)
788 // asmout is not set up to add large amounts of padding
789 if o.type_ == 0 && p.As == obj.APCALIGN {
790 pad := LOP_RRR(OP_OR, REGZERO, REGZERO, REGZERO)
791 aln := c.vregoff(&p.From)
792 v := addpad(p.Pc, aln, c.ctxt, c.cursym)
794 // Same padding instruction for all
795 for i = 0; i < int32(v/4); i++ {
796 c.ctxt.Arch.ByteOrder.PutUint32(bp, pad)
801 c.asmout(p, o, out[:])
802 for i = 0; i < int32(o.size/4); i++ {
803 c.ctxt.Arch.ByteOrder.PutUint32(bp, out[i])
810 func isint32(v int64) bool {
811 return int64(int32(v)) == v
814 func isuint32(v uint64) bool {
815 return uint64(uint32(v)) == v
818 func (c *ctxt9) aclass(a *obj.Addr) int {
824 if REG_R0 <= a.Reg && a.Reg <= REG_R31 {
827 if REG_F0 <= a.Reg && a.Reg <= REG_F31 {
830 if REG_V0 <= a.Reg && a.Reg <= REG_V31 {
833 if REG_VS0 <= a.Reg && a.Reg <= REG_VS63 {
836 if REG_CR0 <= a.Reg && a.Reg <= REG_CR7 || a.Reg == REG_CR {
839 if REG_SPR0 <= a.Reg && a.Reg <= REG_SPR0+1023 {
854 if REG_DCR0 <= a.Reg && a.Reg <= REG_DCR0+1023 {
857 if a.Reg == REG_FPSCR {
860 if a.Reg == REG_MSR {
867 case obj.NAME_EXTERN,
872 c.instoffset = a.Offset
873 if a.Sym != nil { // use relocation
874 if a.Sym.Type == objabi.STLSBSS {
875 if c.ctxt.Flag_shared {
885 case obj.NAME_GOTREF:
888 case obj.NAME_TOCREF:
892 c.instoffset = int64(c.autosize) + a.Offset
893 if c.instoffset >= -BIG && c.instoffset < BIG {
899 c.instoffset = int64(c.autosize) + a.Offset + c.ctxt.FixedFrameSize()
900 if c.instoffset >= -BIG && c.instoffset < BIG {
906 c.instoffset = a.Offset
907 if c.instoffset == 0 {
910 if c.instoffset >= -BIG && c.instoffset < BIG {
918 case obj.TYPE_TEXTSIZE:
921 case obj.TYPE_FCONST:
922 // The only cases where FCONST will occur are with float64 +/- 0.
923 // All other float constants are generated in memory.
924 f64 := a.Val.(float64)
926 if math.Signbit(f64) {
931 log.Fatalf("Unexpected nonzero FCONST operand %v", a)
937 c.instoffset = a.Offset
939 if -BIG <= c.instoffset && c.instoffset <= BIG {
942 if isint32(c.instoffset) {
948 case obj.NAME_EXTERN,
955 c.instoffset = a.Offset
957 /* not sure why this barfs */
961 c.instoffset = int64(c.autosize) + a.Offset
962 if c.instoffset >= -BIG && c.instoffset < BIG {
968 c.instoffset = int64(c.autosize) + a.Offset + c.ctxt.FixedFrameSize()
969 if c.instoffset >= -BIG && c.instoffset < BIG {
978 if c.instoffset >= 0 {
979 if c.instoffset == 0 {
982 if c.instoffset <= 0x7fff {
985 if c.instoffset <= 0xffff {
988 if c.instoffset&0xffff == 0 && isuint32(uint64(c.instoffset)) { /* && (instoffset & (1<<31)) == 0) */
991 if isint32(c.instoffset) || isuint32(uint64(c.instoffset)) {
997 if c.instoffset >= -0x8000 {
1000 if c.instoffset&0xffff == 0 && isint32(c.instoffset) {
1003 if isint32(c.instoffset) {
1008 case obj.TYPE_BRANCH:
1009 if a.Sym != nil && c.ctxt.Flag_dynlink {
1018 func prasm(p *obj.Prog) {
1019 fmt.Printf("%v\n", p)
1022 func (c *ctxt9) oplook(p *obj.Prog) *Optab {
1027 a1 = int(p.From.Class)
1029 a1 = c.aclass(&p.From) + 1
1030 p.From.Class = int8(a1)
1035 if p.GetFrom3() != nil {
1036 a3 = int(p.GetFrom3().Class)
1038 a3 = c.aclass(p.GetFrom3()) + 1
1039 p.GetFrom3().Class = int8(a3)
1044 a4 := int(p.To.Class)
1046 a4 = c.aclass(&p.To) + 1
1047 p.To.Class = int8(a4)
1053 if REG_R0 <= p.Reg && p.Reg <= REG_R31 {
1055 } else if REG_V0 <= p.Reg && p.Reg <= REG_V31 {
1057 } else if REG_VS0 <= p.Reg && p.Reg <= REG_VS63 {
1059 } else if REG_F0 <= p.Reg && p.Reg <= REG_F31 {
1064 // c.ctxt.Logf("oplook %v %d %d %d %d\n", p, a1, a2, a3, a4)
1065 ops := oprange[p.As&obj.AMask]
1069 for i := range ops {
1071 if int(op.a2) == a2 && c1[op.a1] && c3[op.a3] && c4[op.a4] {
1072 p.Optab = uint16(cap(optab) - cap(ops) + i + 1)
1077 c.ctxt.Diag("illegal combination %v %v %v %v %v", p.As, DRconv(a1), DRconv(a2), DRconv(a3), DRconv(a4))
1085 func cmp(a int, b int) bool {
1091 if b == C_ZCON || b == C_SCON || b == C_UCON || b == C_ADDCON || b == C_ANDCON {
1096 if b == C_ZCON || b == C_SCON {
1101 if b == C_ZCON || b == C_SCON {
1106 if b == C_LR || b == C_XER || b == C_CTR {
1142 return r0iszero != 0 /*TypeKind(100016)*/
1146 if b == C_ZOREG || b == C_SOREG {
1164 func (x ocmp) Len() int {
1168 func (x ocmp) Swap(i, j int) {
1169 x[i], x[j] = x[j], x[i]
1172 // Used when sorting the optab. Sorting is
1173 // done in a way so that the best choice of
1174 // opcode/operand combination is considered first.
1175 func (x ocmp) Less(i, j int) bool {
1178 n := int(p1.as) - int(p2.as)
1183 // Consider those that generate fewer
1184 // instructions first.
1185 n = int(p1.size) - int(p2.size)
1189 // operand order should match
1190 // better choices first
1191 n = int(p1.a1) - int(p2.a1)
1195 n = int(p1.a2) - int(p2.a2)
1199 n = int(p1.a3) - int(p2.a3)
1203 n = int(p1.a4) - int(p2.a4)
1210 // Add an entry to the opcode table for
1211 // a new opcode b0 with the same operand combinations
1213 func opset(a, b0 obj.As) {
1214 oprange[a&obj.AMask] = oprange[b0]
1217 // Build the opcode table
1218 func buildop(ctxt *obj.Link) {
1219 if oprange[AANDN&obj.AMask] != nil {
1220 // Already initialized; stop now.
1221 // This happens in the cmd/asm tests,
1222 // each of which re-initializes the arch.
1228 for i := 0; i < C_NCLASS; i++ {
1229 for n = 0; n < C_NCLASS; n++ {
1235 for n = 0; optab[n].as != obj.AXXX; n++ {
1237 sort.Sort(ocmp(optab[:n]))
1238 for i := 0; i < n; i++ {
1242 for optab[i].as == r {
1245 oprange[r0] = optab[start:i]
1250 ctxt.Diag("unknown op in build: %v", r)
1251 log.Fatalf("instruction missing from switch in asm9.go:buildop: %v", r)
1253 case ADCBF: /* unary indexed: op (b+a); op (b) */
1262 case AECOWX: /* indexed store: op s,(b+a); op s,(b) */
1268 case AREM: /* macro */
1277 case ADIVW: /* op Rb[,Ra],Rd */
1282 opset(AMULHWUCC, r0)
1284 opset(AMULLWVCC, r0)
1292 opset(ADIVWUVCC, r0)
1309 opset(AMULHDUCC, r0)
1312 opset(AMULLDVCC, r0)
1319 opset(ADIVDEUCC, r0)
1324 opset(ADIVDUVCC, r0)
1336 case APOPCNTD: /* popcntd, popcntw, popcntb, cnttzw, cnttzd */
1340 opset(ACNTTZWCC, r0)
1342 opset(ACNTTZDCC, r0)
1344 case ACOPY: /* copy, paste. */
1347 case AMADDHD: /* maddhd, maddhdu, maddld */
1351 case AMOVBZ: /* lbz, stz, rlwm(r/r), lhz, lha, stz, and x variants */
1355 case AMOVBZU: /* lbz[x]u, stb[x]u, lhz[x]u, lha[x]u, sth[u]x, ld[x]u, std[u]x */
1364 case ALV: /* lvebx, lvehx, lvewx, lvx, lvxl, lvsl, lvsr */
1373 case ASTV: /* stvebx, stvehx, stvewx, stvx, stvxl */
1380 case AVAND: /* vand, vandc, vnand */
1385 case AVMRGOW: /* vmrgew, vmrgow */
1388 case AVOR: /* vor, vorc, vxor, vnor, veqv */
1395 case AVADDUM: /* vaddubm, vadduhm, vadduwm, vaddudm, vadduqm */
1402 case AVADDCU: /* vaddcuq, vaddcuw */
1406 case AVADDUS: /* vaddubs, vadduhs, vadduws */
1411 case AVADDSS: /* vaddsbs, vaddshs, vaddsws */
1416 case AVADDE: /* vaddeuqm, vaddecuq */
1417 opset(AVADDEUQM, r0)
1418 opset(AVADDECUQ, r0)
1420 case AVSUBUM: /* vsububm, vsubuhm, vsubuwm, vsubudm, vsubuqm */
1427 case AVSUBCU: /* vsubcuq, vsubcuw */
1431 case AVSUBUS: /* vsububs, vsubuhs, vsubuws */
1436 case AVSUBSS: /* vsubsbs, vsubshs, vsubsws */
1441 case AVSUBE: /* vsubeuqm, vsubecuq */
1442 opset(AVSUBEUQM, r0)
1443 opset(AVSUBECUQ, r0)
1445 case AVMULESB: /* vmulesb, vmulosb, vmuleub, vmuloub, vmulosh, vmulouh, vmulesw, vmulosw, vmuleuw, vmulouw, vmuluwm */
1458 case AVPMSUM: /* vpmsumb, vpmsumh, vpmsumw, vpmsumd */
1464 case AVR: /* vrlb, vrlh, vrlw, vrld */
1470 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 */
1484 case AVSA: /* vsrab, vsrah, vsraw, vsrad */
1490 case AVSOI: /* vsldoi */
1493 case AVCLZ: /* vclzb, vclzh, vclzw, vclzd */
1499 case AVPOPCNT: /* vpopcntb, vpopcnth, vpopcntw, vpopcntd */
1500 opset(AVPOPCNTB, r0)
1501 opset(AVPOPCNTH, r0)
1502 opset(AVPOPCNTW, r0)
1503 opset(AVPOPCNTD, r0)
1505 case AVCMPEQ: /* vcmpequb[.], vcmpequh[.], vcmpequw[.], vcmpequd[.] */
1506 opset(AVCMPEQUB, r0)
1507 opset(AVCMPEQUBCC, r0)
1508 opset(AVCMPEQUH, r0)
1509 opset(AVCMPEQUHCC, r0)
1510 opset(AVCMPEQUW, r0)
1511 opset(AVCMPEQUWCC, r0)
1512 opset(AVCMPEQUD, r0)
1513 opset(AVCMPEQUDCC, r0)
1515 case AVCMPGT: /* vcmpgt[u,s]b[.], vcmpgt[u,s]h[.], vcmpgt[u,s]w[.], vcmpgt[u,s]d[.] */
1516 opset(AVCMPGTUB, r0)
1517 opset(AVCMPGTUBCC, r0)
1518 opset(AVCMPGTUH, r0)
1519 opset(AVCMPGTUHCC, r0)
1520 opset(AVCMPGTUW, r0)
1521 opset(AVCMPGTUWCC, r0)
1522 opset(AVCMPGTUD, r0)
1523 opset(AVCMPGTUDCC, r0)
1524 opset(AVCMPGTSB, r0)
1525 opset(AVCMPGTSBCC, r0)
1526 opset(AVCMPGTSH, r0)
1527 opset(AVCMPGTSHCC, r0)
1528 opset(AVCMPGTSW, r0)
1529 opset(AVCMPGTSWCC, r0)
1530 opset(AVCMPGTSD, r0)
1531 opset(AVCMPGTSDCC, r0)
1533 case AVCMPNEZB: /* vcmpnezb[.] */
1534 opset(AVCMPNEZBCC, r0)
1536 opset(AVCMPNEBCC, r0)
1538 opset(AVCMPNEHCC, r0)
1540 opset(AVCMPNEWCC, r0)
1542 case AVPERM: /* vperm */
1543 opset(AVPERMXOR, r0)
1546 case AVBPERMQ: /* vbpermq, vbpermd */
1549 case AVSEL: /* vsel */
1552 case AVSPLTB: /* vspltb, vsplth, vspltw */
1556 case AVSPLTISB: /* vspltisb, vspltish, vspltisw */
1557 opset(AVSPLTISH, r0)
1558 opset(AVSPLTISW, r0)
1560 case AVCIPH: /* vcipher, vcipherlast */
1562 opset(AVCIPHERLAST, r0)
1564 case AVNCIPH: /* vncipher, vncipherlast */
1565 opset(AVNCIPHER, r0)
1566 opset(AVNCIPHERLAST, r0)
1568 case AVSBOX: /* vsbox */
1571 case AVSHASIGMA: /* vshasigmaw, vshasigmad */
1572 opset(AVSHASIGMAW, r0)
1573 opset(AVSHASIGMAD, r0)
1575 case ALXVD2X: /* lxvd2x, lxvdsx, lxvw4x, lxvh8x, lxvb16x */
1581 case ALXV: /* lxv */
1584 case ALXVL: /* lxvl */
1587 case ASTXVD2X: /* stxvd2x, stxvdsx, stxvw4x, stxvh8x, stxvb16x */
1590 opset(ASTXVB16X, r0)
1592 case ASTXV: /* stxv */
1595 case ASTXVL: /* stxvl, stxvll */
1598 case ALXSDX: /* lxsdx */
1601 case ASTXSDX: /* stxsdx */
1604 case ALXSIWAX: /* lxsiwax, lxsiwzx */
1607 case ASTXSIWX: /* stxsiwx */
1610 case AMFVSRD: /* mfvsrd, mfvsrwz (and extended mnemonics), mfvsrld */
1616 case AMTVSRD: /* mtvsrd, mtvsrwa, mtvsrwz (and extended mnemonics), mtvsrdd, mtvsrws */
1624 case AXXLAND: /* xxland, xxlandc, xxleqv, xxlnand */
1629 case AXXLOR: /* xxlorc, xxlnor, xxlor, xxlxor */
1635 case AXXSEL: /* xxsel */
1638 case AXXMRGHW: /* xxmrghw, xxmrglw */
1641 case AXXSPLTW: /* xxspltw */
1644 case AXXSPLTIB: /* xxspltib */
1645 opset(AXXSPLTIB, r0)
1647 case AXXPERM: /* xxpermdi */
1650 case AXXSLDWI: /* xxsldwi */
1651 opset(AXXPERMDI, r0)
1654 case AXXBRQ: /* xxbrq, xxbrd, xxbrw, xxbrh */
1659 case AXSCVDPSP: /* xscvdpsp, xscvspdp, xscvdpspn, xscvspdpn */
1660 opset(AXSCVSPDP, r0)
1661 opset(AXSCVDPSPN, r0)
1662 opset(AXSCVSPDPN, r0)
1664 case AXVCVDPSP: /* xvcvdpsp, xvcvspdp */
1665 opset(AXVCVSPDP, r0)
1667 case AXSCVDPSXDS: /* xscvdpsxds, xscvdpsxws, xscvdpuxds, xscvdpuxws */
1668 opset(AXSCVDPSXWS, r0)
1669 opset(AXSCVDPUXDS, r0)
1670 opset(AXSCVDPUXWS, r0)
1672 case AXSCVSXDDP: /* xscvsxddp, xscvuxddp, xscvsxdsp, xscvuxdsp */
1673 opset(AXSCVUXDDP, r0)
1674 opset(AXSCVSXDSP, r0)
1675 opset(AXSCVUXDSP, r0)
1677 case AXVCVDPSXDS: /* xvcvdpsxds, xvcvdpsxws, xvcvdpuxds, xvcvdpuxws, xvcvspsxds, xvcvspsxws, xvcvspuxds, xvcvspuxws */
1678 opset(AXVCVDPSXDS, r0)
1679 opset(AXVCVDPSXWS, r0)
1680 opset(AXVCVDPUXDS, r0)
1681 opset(AXVCVDPUXWS, r0)
1682 opset(AXVCVSPSXDS, r0)
1683 opset(AXVCVSPSXWS, r0)
1684 opset(AXVCVSPUXDS, r0)
1685 opset(AXVCVSPUXWS, r0)
1687 case AXVCVSXDDP: /* xvcvsxddp, xvcvsxwdp, xvcvuxddp, xvcvuxwdp, xvcvsxdsp, xvcvsxwsp, xvcvuxdsp, xvcvuxwsp */
1688 opset(AXVCVSXWDP, r0)
1689 opset(AXVCVUXDDP, r0)
1690 opset(AXVCVUXWDP, r0)
1691 opset(AXVCVSXDSP, r0)
1692 opset(AXVCVSXWSP, r0)
1693 opset(AXVCVUXDSP, r0)
1694 opset(AXVCVUXWSP, r0)
1696 case AAND: /* logical op Rb,Rs,Ra; no literal */
1710 case AADDME: /* op Ra, Rd */
1714 opset(AADDMEVCC, r0)
1718 opset(AADDZEVCC, r0)
1722 opset(ASUBMEVCC, r0)
1726 opset(ASUBZEVCC, r0)
1746 case AEXTSB: /* op Rs, Ra */
1752 opset(ACNTLZWCC, r0)
1756 opset(ACNTLZDCC, r0)
1758 case AFABS: /* fop [s,]d */
1770 opset(AFCTIWZCC, r0)
1774 opset(AFCTIDZCC, r0)
1778 opset(AFCFIDUCC, r0)
1780 opset(AFCFIDSCC, r0)
1792 opset(AFRSQRTECC, r0)
1796 opset(AFSQRTSCC, r0)
1803 opset(AFCPSGNCC, r0)
1816 opset(AFMADDSCC, r0)
1820 opset(AFMSUBSCC, r0)
1822 opset(AFNMADDCC, r0)
1824 opset(AFNMADDSCC, r0)
1826 opset(AFNMSUBCC, r0)
1828 opset(AFNMSUBSCC, r0)
1844 opset(AMTFSB0CC, r0)
1846 opset(AMTFSB1CC, r0)
1848 case ANEG: /* op [Ra,] Rd */
1854 case AOR: /* or/xor Rb,Rs,Ra; ori/xori $uimm,Rs,R */
1857 case AORIS: /* oris/xoris $uimm,Rs,Ra */
1872 case ASRAW: /* sraw Rb,Rs,Ra; srawi sh,Rs,Ra */
1875 case ASRAD: /* sraw Rb,Rs,Ra; srawi sh,Rs,Ra */
1878 case ASUB: /* SUB Ra,Rb,Rd => subf Rd,ra,rb */
1906 opset(ARLDIMICC, r0)
1917 opset(ARLDICLCC, r0)
1919 opset(ARLDICRCC, r0)
1932 case ASYSCALL: /* just the op; flow of control */
1973 AANDCC, /* and. Rb,Rs,Ra; andi. $uimm,Rs,Ra */
1979 /* load/store/move word with sign extension; special 32-bit move; move 32-bit literals */
1980 AMOVWZ, /* load/store/move word with zero extension; move 32-bit literals */
1981 AMOVD, /* load/store/move 64-bit values, including 32-bit literals with/without sign-extension */
1982 AMOVB, /* macro: move byte with sign extension */
1983 AMOVBU, /* macro: move byte with sign extension & update */
1986 /* op $s[,r2],r3; op r1[,r2],r3; no cc/v */
1987 ASUBC, /* op r1,$s,r3; op r1[,r2],r3 */
2011 func OPVXX1(o uint32, xo uint32, oe uint32) uint32 {
2012 return o<<26 | xo<<1 | oe<<11
2015 func OPVXX2(o uint32, xo uint32, oe uint32) uint32 {
2016 return o<<26 | xo<<2 | oe<<11
2019 func OPVXX2VA(o uint32, xo uint32, oe uint32) uint32 {
2020 return o<<26 | xo<<2 | oe<<16
2023 func OPVXX3(o uint32, xo uint32, oe uint32) uint32 {
2024 return o<<26 | xo<<3 | oe<<11
2027 func OPVXX4(o uint32, xo uint32, oe uint32) uint32 {
2028 return o<<26 | xo<<4 | oe<<11
2031 func OPDQ(o uint32, xo uint32, oe uint32) uint32 {
2032 return o<<26 | xo | oe<<4
2035 func OPVX(o uint32, xo uint32, oe uint32, rc uint32) uint32 {
2036 return o<<26 | xo | oe<<11 | rc&1
2039 func OPVC(o uint32, xo uint32, oe uint32, rc uint32) uint32 {
2040 return o<<26 | xo | oe<<11 | (rc&1)<<10
2043 func OPVCC(o uint32, xo uint32, oe uint32, rc uint32) uint32 {
2044 return o<<26 | xo<<1 | oe<<10 | rc&1
2047 func OPCC(o uint32, xo uint32, rc uint32) uint32 {
2048 return OPVCC(o, xo, 0, rc)
2051 /* the order is dest, a/s, b/imm for both arithmetic and logical operations */
2052 func AOP_RRR(op uint32, d uint32, a uint32, b uint32) uint32 {
2053 return op | (d&31)<<21 | (a&31)<<16 | (b&31)<<11
2056 /* VX-form 2-register operands, r/none/r */
2057 func AOP_RR(op uint32, d uint32, a uint32) uint32 {
2058 return op | (d&31)<<21 | (a&31)<<11
2061 /* VA-form 4-register operands */
2062 func AOP_RRRR(op uint32, d uint32, a uint32, b uint32, c uint32) uint32 {
2063 return op | (d&31)<<21 | (a&31)<<16 | (b&31)<<11 | (c&31)<<6
2066 func AOP_IRR(op uint32, d uint32, a uint32, simm uint32) uint32 {
2067 return op | (d&31)<<21 | (a&31)<<16 | simm&0xFFFF
2070 /* VX-form 2-register + UIM operands */
2071 func AOP_VIRR(op uint32, d uint32, a uint32, simm uint32) uint32 {
2072 return op | (d&31)<<21 | (simm&0xFFFF)<<16 | (a&31)<<11
2075 /* VX-form 2-register + ST + SIX operands */
2076 func AOP_IIRR(op uint32, d uint32, a uint32, sbit uint32, simm uint32) uint32 {
2077 return op | (d&31)<<21 | (a&31)<<16 | (sbit&1)<<15 | (simm&0xF)<<11
2080 /* VA-form 3-register + SHB operands */
2081 func AOP_IRRR(op uint32, d uint32, a uint32, b uint32, simm uint32) uint32 {
2082 return op | (d&31)<<21 | (a&31)<<16 | (b&31)<<11 | (simm&0xF)<<6
2085 /* VX-form 1-register + SIM operands */
2086 func AOP_IR(op uint32, d uint32, simm uint32) uint32 {
2087 return op | (d&31)<<21 | (simm&31)<<16
2090 /* XX1-form 3-register operands, 1 VSR operand */
2091 func AOP_XX1(op uint32, d uint32, a uint32, b uint32) uint32 {
2092 /* For the XX-form encodings, we need the VSX register number to be exactly */
2093 /* between 0-63, so we can properly set the rightmost bits. */
2095 return op | (r&31)<<21 | (a&31)<<16 | (b&31)<<11 | (r&32)>>5
2098 /* XX2-form 3-register operands, 2 VSR operands */
2099 func AOP_XX2(op uint32, d uint32, a uint32, b uint32) uint32 {
2102 return op | (xt&31)<<21 | (a&3)<<16 | (xb&31)<<11 | (xb&32)>>4 | (xt&32)>>5
2105 /* XX3-form 3 VSR operands */
2106 func AOP_XX3(op uint32, d uint32, a uint32, b uint32) uint32 {
2110 return op | (xt&31)<<21 | (xa&31)<<16 | (xb&31)<<11 | (xa&32)>>3 | (xb&32)>>4 | (xt&32)>>5
2113 /* XX3-form 3 VSR operands + immediate */
2114 func AOP_XX3I(op uint32, d uint32, a uint32, b uint32, c uint32) uint32 {
2118 return op | (xt&31)<<21 | (xa&31)<<16 | (xb&31)<<11 | (c&3)<<8 | (xa&32)>>3 | (xb&32)>>4 | (xt&32)>>5
2121 /* XX4-form, 4 VSR operands */
2122 func AOP_XX4(op uint32, d uint32, a uint32, b uint32, c uint32) uint32 {
2127 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
2130 /* DQ-form, VSR register, register + offset operands */
2131 func AOP_DQ(op uint32, d uint32, a uint32, b uint32) uint32 {
2132 /* For the DQ-form encodings, we need the VSX register number to be exactly */
2133 /* between 0-63, so we can properly set the SX bit. */
2135 /* The EA for this instruction form is (RA) + DQ << 4, where DQ is a 12-bit signed integer. */
2136 /* In order to match the output of the GNU objdump (and make the usage in Go asm easier), the */
2137 /* instruction is called using the sign extended value (i.e. a valid offset would be -32752 or 32752, */
2138 /* not -2047 or 2047), so 'b' needs to be adjusted to the expected 12-bit DQ value. Bear in mind that */
2139 /* bits 0 to 3 in 'dq' need to be zero, otherwise this will generate an illegal instruction. */
2140 /* If in doubt how this instruction form is encoded, refer to ISA 3.0b, pages 492 and 507. */
2142 return op | (r&31)<<21 | (a&31)<<16 | (dq&4095)<<4 | (r&32)>>2
2145 /* Z23-form, 3-register operands + CY field */
2146 func AOP_Z23I(op uint32, d uint32, a uint32, b uint32, c uint32) uint32 {
2147 return op | (d&31)<<21 | (a&31)<<16 | (b&31)<<11 | (c&3)<<7
2150 /* X-form, 3-register operands + EH field */
2151 func AOP_RRRI(op uint32, d uint32, a uint32, b uint32, c uint32) uint32 {
2152 return op | (d&31)<<21 | (a&31)<<16 | (b&31)<<11 | (c & 1)
2155 func LOP_RRR(op uint32, a uint32, s uint32, b uint32) uint32 {
2156 return op | (s&31)<<21 | (a&31)<<16 | (b&31)<<11
2159 func LOP_IRR(op uint32, a uint32, s uint32, uimm uint32) uint32 {
2160 return op | (s&31)<<21 | (a&31)<<16 | uimm&0xFFFF
2163 func OP_BR(op uint32, li uint32, aa uint32) uint32 {
2164 return op | li&0x03FFFFFC | aa<<1
2167 func OP_BC(op uint32, bo uint32, bi uint32, bd uint32, aa uint32) uint32 {
2168 return op | (bo&0x1F)<<21 | (bi&0x1F)<<16 | bd&0xFFFC | aa<<1
2171 func OP_BCR(op uint32, bo uint32, bi uint32) uint32 {
2172 return op | (bo&0x1F)<<21 | (bi&0x1F)<<16
2175 func OP_RLW(op uint32, a uint32, s uint32, sh uint32, mb uint32, me uint32) uint32 {
2176 return op | (s&31)<<21 | (a&31)<<16 | (sh&31)<<11 | (mb&31)<<6 | (me&31)<<1
2179 func AOP_RLDIC(op uint32, a uint32, s uint32, sh uint32, m uint32) uint32 {
2180 return op | (s&31)<<21 | (a&31)<<16 | (sh&31)<<11 | ((sh&32)>>5)<<1 | (m&31)<<6 | ((m&32)>>5)<<5
2183 func AOP_ISEL(op uint32, t uint32, a uint32, b uint32, bc uint32) uint32 {
2184 return op | (t&31)<<21 | (a&31)<<16 | (b&31)<<11 | (bc&0x1F)<<6
2188 /* each rhs is OPVCC(_, _, _, _) */
2189 OP_ADD = 31<<26 | 266<<1 | 0<<10 | 0
2190 OP_ADDI = 14<<26 | 0<<1 | 0<<10 | 0
2191 OP_ADDIS = 15<<26 | 0<<1 | 0<<10 | 0
2192 OP_ANDI = 28<<26 | 0<<1 | 0<<10 | 0
2193 OP_EXTSB = 31<<26 | 954<<1 | 0<<10 | 0
2194 OP_EXTSH = 31<<26 | 922<<1 | 0<<10 | 0
2195 OP_EXTSW = 31<<26 | 986<<1 | 0<<10 | 0
2196 OP_ISEL = 31<<26 | 15<<1 | 0<<10 | 0
2197 OP_MCRF = 19<<26 | 0<<1 | 0<<10 | 0
2198 OP_MCRFS = 63<<26 | 64<<1 | 0<<10 | 0
2199 OP_MCRXR = 31<<26 | 512<<1 | 0<<10 | 0
2200 OP_MFCR = 31<<26 | 19<<1 | 0<<10 | 0
2201 OP_MFFS = 63<<26 | 583<<1 | 0<<10 | 0
2202 OP_MFMSR = 31<<26 | 83<<1 | 0<<10 | 0
2203 OP_MFSPR = 31<<26 | 339<<1 | 0<<10 | 0
2204 OP_MFSR = 31<<26 | 595<<1 | 0<<10 | 0
2205 OP_MFSRIN = 31<<26 | 659<<1 | 0<<10 | 0
2206 OP_MTCRF = 31<<26 | 144<<1 | 0<<10 | 0
2207 OP_MTFSF = 63<<26 | 711<<1 | 0<<10 | 0
2208 OP_MTFSFI = 63<<26 | 134<<1 | 0<<10 | 0
2209 OP_MTMSR = 31<<26 | 146<<1 | 0<<10 | 0
2210 OP_MTMSRD = 31<<26 | 178<<1 | 0<<10 | 0
2211 OP_MTSPR = 31<<26 | 467<<1 | 0<<10 | 0
2212 OP_MTSR = 31<<26 | 210<<1 | 0<<10 | 0
2213 OP_MTSRIN = 31<<26 | 242<<1 | 0<<10 | 0
2214 OP_MULLW = 31<<26 | 235<<1 | 0<<10 | 0
2215 OP_MULLD = 31<<26 | 233<<1 | 0<<10 | 0
2216 OP_OR = 31<<26 | 444<<1 | 0<<10 | 0
2217 OP_ORI = 24<<26 | 0<<1 | 0<<10 | 0
2218 OP_ORIS = 25<<26 | 0<<1 | 0<<10 | 0
2219 OP_RLWINM = 21<<26 | 0<<1 | 0<<10 | 0
2220 OP_RLWNM = 23<<26 | 0<<1 | 0<<10 | 0
2221 OP_SUBF = 31<<26 | 40<<1 | 0<<10 | 0
2222 OP_RLDIC = 30<<26 | 4<<1 | 0<<10 | 0
2223 OP_RLDICR = 30<<26 | 2<<1 | 0<<10 | 0
2224 OP_RLDICL = 30<<26 | 0<<1 | 0<<10 | 0
2225 OP_RLDCL = 30<<26 | 8<<1 | 0<<10 | 0
2228 func oclass(a *obj.Addr) int {
2229 return int(a.Class) - 1
2237 // This function determines when a non-indexed load or store is D or
2238 // DS form for use in finding the size of the offset field in the instruction.
2239 // The size is needed when setting the offset value in the instruction
2240 // and when generating relocation for that field.
2241 // DS form instructions include: ld, ldu, lwa, std, stdu. All other
2242 // loads and stores with an offset field are D form. This function should
2243 // only be called with the same opcodes as are handled by opstore and opload.
2244 func (c *ctxt9) opform(insn uint32) int {
2247 c.ctxt.Diag("bad insn in loadform: %x", insn)
2248 case OPVCC(58, 0, 0, 0), // ld
2249 OPVCC(58, 0, 0, 1), // ldu
2250 OPVCC(58, 0, 0, 0) | 1<<1, // lwa
2251 OPVCC(62, 0, 0, 0), // std
2252 OPVCC(62, 0, 0, 1): //stdu
2254 case OP_ADDI, // add
2255 OPVCC(32, 0, 0, 0), // lwz
2256 OPVCC(33, 0, 0, 0), // lwzu
2257 OPVCC(34, 0, 0, 0), // lbz
2258 OPVCC(35, 0, 0, 0), // lbzu
2259 OPVCC(40, 0, 0, 0), // lhz
2260 OPVCC(41, 0, 0, 0), // lhzu
2261 OPVCC(42, 0, 0, 0), // lha
2262 OPVCC(43, 0, 0, 0), // lhau
2263 OPVCC(46, 0, 0, 0), // lmw
2264 OPVCC(48, 0, 0, 0), // lfs
2265 OPVCC(49, 0, 0, 0), // lfsu
2266 OPVCC(50, 0, 0, 0), // lfd
2267 OPVCC(51, 0, 0, 0), // lfdu
2268 OPVCC(36, 0, 0, 0), // stw
2269 OPVCC(37, 0, 0, 0), // stwu
2270 OPVCC(38, 0, 0, 0), // stb
2271 OPVCC(39, 0, 0, 0), // stbu
2272 OPVCC(44, 0, 0, 0), // sth
2273 OPVCC(45, 0, 0, 0), // sthu
2274 OPVCC(47, 0, 0, 0), // stmw
2275 OPVCC(52, 0, 0, 0), // stfs
2276 OPVCC(53, 0, 0, 0), // stfsu
2277 OPVCC(54, 0, 0, 0), // stfd
2278 OPVCC(55, 0, 0, 0): // stfdu
2284 // Encode instructions and create relocation for accessing s+d according to the
2285 // instruction op with source or destination (as appropriate) register reg.
2286 func (c *ctxt9) symbolAccess(s *obj.LSym, d int64, reg int16, op uint32) (o1, o2 uint32) {
2287 if c.ctxt.Headtype == objabi.Haix {
2288 // Every symbol access must be made via a TOC anchor.
2289 c.ctxt.Diag("symbolAccess called for %s", s.Name)
2292 form := c.opform(op)
2293 if c.ctxt.Flag_shared {
2298 o1 = AOP_IRR(OP_ADDIS, REGTMP, base, 0)
2299 o2 = AOP_IRR(op, uint32(reg), REGTMP, 0)
2300 rel := obj.Addrel(c.cursym)
2301 rel.Off = int32(c.pc)
2305 if c.ctxt.Flag_shared {
2308 rel.Type = objabi.R_ADDRPOWER_TOCREL
2310 rel.Type = objabi.R_ADDRPOWER_TOCREL_DS
2316 rel.Type = objabi.R_ADDRPOWER
2318 rel.Type = objabi.R_ADDRPOWER_DS
2327 func getmask(m []byte, v uint32) bool {
2330 if v != ^uint32(0) && v&(1<<31) != 0 && v&1 != 0 { /* MB > ME */
2341 for i := 0; i < 32; i++ {
2342 if v&(1<<uint(31-i)) != 0 {
2347 if i >= 32 || v&(1<<uint(31-i)) == 0 {
2353 if v&(1<<uint(31-i)) != 0 {
2364 func (c *ctxt9) maskgen(p *obj.Prog, m []byte, v uint32) {
2366 c.ctxt.Diag("cannot generate mask #%x\n%v", v, p)
2371 * 64-bit masks (rldic etc)
2373 func getmask64(m []byte, v uint64) bool {
2376 for i := 0; i < 64; i++ {
2377 if v&(uint64(1)<<uint(63-i)) != 0 {
2382 if i >= 64 || v&(uint64(1)<<uint(63-i)) == 0 {
2388 if v&(uint64(1)<<uint(63-i)) != 0 {
2399 func (c *ctxt9) maskgen64(p *obj.Prog, m []byte, v uint64) {
2400 if !getmask64(m, v) {
2401 c.ctxt.Diag("cannot generate mask #%x\n%v", v, p)
2405 func loadu32(r int, d int64) uint32 {
2407 if isuint32(uint64(d)) {
2408 return LOP_IRR(OP_ORIS, uint32(r), REGZERO, uint32(v))
2410 return AOP_IRR(OP_ADDIS, uint32(r), REGZERO, uint32(v))
2413 func high16adjusted(d int32) uint16 {
2415 return uint16((d >> 16) + 1)
2417 return uint16(d >> 16)
2420 func (c *ctxt9) asmout(p *obj.Prog, o *Optab, out []uint32) {
2427 //print("%v => case %d\n", p, o->type);
2430 c.ctxt.Diag("unknown type %d", o.type_)
2433 case 0: /* pseudo ops */
2436 case 1: /* mov r1,r2 ==> OR Rs,Rs,Ra */
2437 if p.To.Reg == REGZERO && p.From.Type == obj.TYPE_CONST {
2438 v := c.regoff(&p.From)
2439 if r0iszero != 0 /*TypeKind(100016)*/ && v != 0 {
2441 c.ctxt.Diag("literal operation on R0\n%v", p)
2444 o1 = LOP_IRR(OP_ADDI, REGZERO, REGZERO, uint32(v))
2448 o1 = LOP_RRR(OP_OR, uint32(p.To.Reg), uint32(p.From.Reg), uint32(p.From.Reg))
2450 case 2: /* int/cr/fp op Rb,[Ra],Rd */
2456 o1 = AOP_RRR(c.oprrr(p.As), uint32(p.To.Reg), uint32(r), uint32(p.From.Reg))
2458 case 3: /* mov $soreg/addcon/andcon/ucon, r ==> addis/oris/addi/ori $i,reg',r */
2459 d := c.vregoff(&p.From)
2462 r := int(p.From.Reg)
2466 if r0iszero != 0 /*TypeKind(100016)*/ && p.To.Reg == 0 && (r != 0 || v != 0) {
2467 c.ctxt.Diag("literal operation on R0\n%v", p)
2472 log.Fatalf("invalid handling of %v", p)
2474 // For UCON operands the value is right shifted 16, using ADDIS if the
2475 // value should be signed, ORIS if unsigned.
2477 if r == REGZERO && isuint32(uint64(d)) {
2478 o1 = LOP_IRR(OP_ORIS, uint32(p.To.Reg), REGZERO, uint32(v))
2483 } else if int64(int16(d)) != d {
2484 // Operand is 16 bit value with sign bit set
2485 if o.a1 == C_ANDCON {
2486 // Needs unsigned 16 bit so use ORI
2487 if r == 0 || r == REGZERO {
2488 o1 = LOP_IRR(uint32(OP_ORI), uint32(p.To.Reg), uint32(0), uint32(v))
2491 // With ADDCON, needs signed 16 bit value, fall through to use ADDI
2492 } else if o.a1 != C_ADDCON {
2493 log.Fatalf("invalid handling of %v", p)
2497 o1 = AOP_IRR(uint32(a), uint32(p.To.Reg), uint32(r), uint32(v))
2499 case 4: /* add/mul $scon,[r1],r2 */
2500 v := c.regoff(&p.From)
2506 if r0iszero != 0 /*TypeKind(100016)*/ && p.To.Reg == 0 {
2507 c.ctxt.Diag("literal operation on R0\n%v", p)
2509 if int32(int16(v)) != v {
2510 log.Fatalf("mishandled instruction %v", p)
2512 o1 = AOP_IRR(c.opirr(p.As), uint32(p.To.Reg), uint32(r), uint32(v))
2514 case 5: /* syscall */
2517 case 6: /* logical op Rb,[Rs,]Ra; no literal */
2523 // AROTL and AROTLW are extended mnemonics, which map to RLDCL and RLWNM.
2526 o1 = AOP_RLDIC(OP_RLDCL, uint32(p.To.Reg), uint32(r), uint32(p.From.Reg), uint32(0))
2528 o1 = OP_RLW(OP_RLWNM, uint32(p.To.Reg), uint32(r), uint32(p.From.Reg), 0, 31)
2530 o1 = LOP_RRR(c.oprrr(p.As), uint32(p.To.Reg), uint32(r), uint32(p.From.Reg))
2533 case 7: /* mov r, soreg ==> stw o(r) */
2539 v := c.regoff(&p.To)
2540 if p.To.Type == obj.TYPE_MEM && p.To.Index != 0 {
2542 c.ctxt.Diag("illegal indexed instruction\n%v", p)
2544 if c.ctxt.Flag_shared && r == REG_R13 {
2545 rel := obj.Addrel(c.cursym)
2546 rel.Off = int32(c.pc)
2548 // This (and the matching part in the load case
2549 // below) are the only places in the ppc64 toolchain
2550 // that knows the name of the tls variable. Possibly
2551 // we could add some assembly syntax so that the name
2552 // of the variable does not have to be assumed.
2553 rel.Sym = c.ctxt.Lookup("runtime.tls_g")
2554 rel.Type = objabi.R_POWER_TLS
2556 o1 = AOP_RRR(c.opstorex(p.As), uint32(p.From.Reg), uint32(p.To.Index), uint32(r))
2558 if int32(int16(v)) != v {
2559 log.Fatalf("mishandled instruction %v", p)
2561 // Offsets in DS form stores must be a multiple of 4
2562 inst := c.opstore(p.As)
2563 if c.opform(inst) == DS_FORM && v&0x3 != 0 {
2564 log.Fatalf("invalid offset for DS form load/store %v", p)
2566 o1 = AOP_IRR(inst, uint32(p.From.Reg), uint32(r), uint32(v))
2569 case 8: /* mov soreg, r ==> lbz/lhz/lwz o(r) */
2570 r := int(p.From.Reg)
2575 v := c.regoff(&p.From)
2576 if p.From.Type == obj.TYPE_MEM && p.From.Index != 0 {
2578 c.ctxt.Diag("illegal indexed instruction\n%v", p)
2580 if c.ctxt.Flag_shared && r == REG_R13 {
2581 rel := obj.Addrel(c.cursym)
2582 rel.Off = int32(c.pc)
2584 rel.Sym = c.ctxt.Lookup("runtime.tls_g")
2585 rel.Type = objabi.R_POWER_TLS
2587 o1 = AOP_RRR(c.oploadx(p.As), uint32(p.To.Reg), uint32(p.From.Index), uint32(r))
2589 if int32(int16(v)) != v {
2590 log.Fatalf("mishandled instruction %v", p)
2592 // Offsets in DS form loads must be a multiple of 4
2593 inst := c.opload(p.As)
2594 if c.opform(inst) == DS_FORM && v&0x3 != 0 {
2595 log.Fatalf("invalid offset for DS form load/store %v", p)
2597 o1 = AOP_IRR(inst, uint32(p.To.Reg), uint32(r), uint32(v))
2600 case 9: /* movb soreg, r ==> lbz o(r),r2; extsb r2,r2 */
2601 r := int(p.From.Reg)
2606 v := c.regoff(&p.From)
2607 if p.From.Type == obj.TYPE_MEM && p.From.Index != 0 {
2609 c.ctxt.Diag("illegal indexed instruction\n%v", p)
2611 o1 = AOP_RRR(c.oploadx(p.As), uint32(p.To.Reg), uint32(p.From.Index), uint32(r))
2613 o1 = AOP_IRR(c.opload(p.As), uint32(p.To.Reg), uint32(r), uint32(v))
2615 o2 = LOP_RRR(OP_EXTSB, uint32(p.To.Reg), uint32(p.To.Reg), 0)
2617 case 10: /* sub Ra,[Rb],Rd => subf Rd,Ra,Rb */
2623 o1 = AOP_RRR(c.oprrr(p.As), uint32(p.To.Reg), uint32(p.From.Reg), uint32(r))
2625 case 11: /* br/bl lbra */
2629 v = int32(p.Pcond.Pc - p.Pc)
2631 c.ctxt.Diag("odd branch target address\n%v", p)
2635 if v < -(1<<25) || v >= 1<<24 {
2636 c.ctxt.Diag("branch too far\n%v", p)
2640 o1 = OP_BR(c.opirr(p.As), uint32(v), 0)
2641 if p.To.Sym != nil {
2642 rel := obj.Addrel(c.cursym)
2643 rel.Off = int32(c.pc)
2646 v += int32(p.To.Offset)
2648 c.ctxt.Diag("odd branch target address\n%v", p)
2653 rel.Type = objabi.R_CALLPOWER
2655 o2 = 0x60000000 // nop, sometimes overwritten by ld r2, 24(r1) when dynamic linking
2657 case 12: /* movb r,r (extsb); movw r,r (extsw) */
2658 if p.To.Reg == REGZERO && p.From.Type == obj.TYPE_CONST {
2659 v := c.regoff(&p.From)
2660 if r0iszero != 0 /*TypeKind(100016)*/ && v != 0 {
2661 c.ctxt.Diag("literal operation on R0\n%v", p)
2664 o1 = LOP_IRR(OP_ADDI, REGZERO, REGZERO, uint32(v))
2669 o1 = LOP_RRR(OP_EXTSW, uint32(p.To.Reg), uint32(p.From.Reg), 0)
2671 o1 = LOP_RRR(OP_EXTSB, uint32(p.To.Reg), uint32(p.From.Reg), 0)
2674 case 13: /* mov[bhw]z r,r; uses rlwinm not andi. to avoid changing CC */
2676 o1 = OP_RLW(OP_RLWINM, uint32(p.To.Reg), uint32(p.From.Reg), 0, 24, 31)
2677 } else if p.As == AMOVH {
2678 o1 = LOP_RRR(OP_EXTSH, uint32(p.To.Reg), uint32(p.From.Reg), 0)
2679 } else if p.As == AMOVHZ {
2680 o1 = OP_RLW(OP_RLWINM, uint32(p.To.Reg), uint32(p.From.Reg), 0, 16, 31)
2681 } else if p.As == AMOVWZ {
2682 o1 = OP_RLW(OP_RLDIC, uint32(p.To.Reg), uint32(p.From.Reg), 0, 0, 0) | 1<<5 /* MB=32 */
2684 c.ctxt.Diag("internal: bad mov[bhw]z\n%v", p)
2687 case 14: /* rldc[lr] Rb,Rs,$mask,Ra -- left, right give different masks */
2693 d := c.vregoff(p.GetFrom3())
2697 // These opcodes expect a mask operand that has to be converted into the
2698 // appropriate operand. The way these were defined, not all valid masks are possible.
2699 // Left here for compatibility in case they were used or generated.
2700 case ARLDCL, ARLDCLCC:
2702 c.maskgen64(p, mask[:], uint64(d))
2704 a = int(mask[0]) /* MB */
2706 c.ctxt.Diag("invalid mask for rotate: %x (end != bit 63)\n%v", uint64(d), p)
2708 o1 = LOP_RRR(c.oprrr(p.As), uint32(p.To.Reg), uint32(r), uint32(p.From.Reg))
2709 o1 |= (uint32(a) & 31) << 6
2711 o1 |= 1 << 5 /* mb[5] is top bit */
2714 case ARLDCR, ARLDCRCC:
2716 c.maskgen64(p, mask[:], uint64(d))
2718 a = int(mask[1]) /* ME */
2720 c.ctxt.Diag("invalid mask for rotate: %x %x (start != 0)\n%v", uint64(d), mask[0], p)
2722 o1 = LOP_RRR(c.oprrr(p.As), uint32(p.To.Reg), uint32(r), uint32(p.From.Reg))
2723 o1 |= (uint32(a) & 31) << 6
2725 o1 |= 1 << 5 /* mb[5] is top bit */
2728 // These opcodes use a shift count like the ppc64 asm, no mask conversion done
2729 case ARLDICR, ARLDICRCC:
2731 sh := c.regoff(&p.From)
2732 o1 = AOP_RLDIC(c.oprrr(p.As), uint32(p.To.Reg), uint32(r), uint32(sh), uint32(me))
2734 case ARLDICL, ARLDICLCC:
2736 sh := c.regoff(&p.From)
2737 o1 = AOP_RLDIC(c.oprrr(p.As), uint32(p.To.Reg), uint32(r), uint32(sh), uint32(mb))
2740 c.ctxt.Diag("unexpected op in rldc case\n%v", p)
2744 case 17, /* bc bo,bi,lbra (same for now) */
2745 16: /* bc bo,bi,sbra */
2750 if p.From.Type == obj.TYPE_CONST {
2751 a = int(c.regoff(&p.From))
2752 } else if p.From.Type == obj.TYPE_REG {
2754 c.ctxt.Diag("unexpected register setting for branch with CR: %d\n", r)
2756 // BI values for the CR
2775 c.ctxt.Diag("unrecognized register: expecting CR\n")
2780 v = int32(p.Pcond.Pc - p.Pc)
2783 c.ctxt.Diag("odd branch target address\n%v", p)
2787 if v < -(1<<16) || v >= 1<<15 {
2788 c.ctxt.Diag("branch too far\n%v", p)
2790 o1 = OP_BC(c.opirr(p.As), uint32(a), uint32(r), uint32(v), 0)
2792 case 15: /* br/bl (r) => mov r,lr; br/bl (lr) */
2794 if p.As == ABC || p.As == ABCL {
2795 v = c.regoff(&p.To) & 31
2797 v = 20 /* unconditional */
2799 o1 = AOP_RRR(OP_MTSPR, uint32(p.To.Reg), 0, 0) | (REG_LR&0x1f)<<16 | ((REG_LR>>5)&0x1f)<<11
2800 o2 = OPVCC(19, 16, 0, 0)
2801 if p.As == ABL || p.As == ABCL {
2804 o2 = OP_BCR(o2, uint32(v), uint32(p.To.Index))
2806 case 18: /* br/bl (lr/ctr); bc/bcl bo,bi,(lr/ctr) */
2808 if p.As == ABC || p.As == ABCL {
2809 v = c.regoff(&p.From) & 31
2811 v = 20 /* unconditional */
2817 switch oclass(&p.To) {
2819 o1 = OPVCC(19, 528, 0, 0)
2822 o1 = OPVCC(19, 16, 0, 0)
2825 c.ctxt.Diag("bad optab entry (18): %d\n%v", p.To.Class, p)
2829 if p.As == ABL || p.As == ABCL {
2832 o1 = OP_BCR(o1, uint32(v), uint32(r))
2834 case 19: /* mov $lcon,r ==> cau+or */
2835 d := c.vregoff(&p.From)
2837 if p.From.Sym == nil {
2838 o1 = loadu32(int(p.To.Reg), d)
2839 o2 = LOP_IRR(OP_ORI, uint32(p.To.Reg), uint32(p.To.Reg), uint32(int32(d)))
2841 o1, o2 = c.symbolAccess(p.From.Sym, d, p.To.Reg, OP_ADDI)
2844 case 20: /* add $ucon,,r | addis $addcon,r,r */
2845 v := c.regoff(&p.From)
2851 if p.As == AADD && (r0iszero == 0 /*TypeKind(100016)*/ && p.Reg == 0 || r0iszero != 0 /*TypeKind(100016)*/ && p.To.Reg == 0) {
2852 c.ctxt.Diag("literal operation on R0\n%v", p)
2855 o1 = AOP_IRR(c.opirr(p.As), uint32(p.To.Reg), uint32(r), uint32(v))
2857 o1 = AOP_IRR(c.opirr(AADDIS), uint32(p.To.Reg), uint32(r), uint32(v)>>16)
2860 case 22: /* add $lcon/$andcon,r1,r2 ==> oris+ori+add/ori+add */
2861 if p.To.Reg == REGTMP || p.Reg == REGTMP {
2862 c.ctxt.Diag("can't synthesize large constant\n%v", p)
2864 d := c.vregoff(&p.From)
2869 if p.From.Sym != nil {
2870 c.ctxt.Diag("%v is not supported", p)
2872 // If operand is ANDCON, generate 2 instructions using
2873 // ORI for unsigned value; with LCON 3 instructions.
2875 o1 = LOP_IRR(OP_ORI, REGTMP, REGZERO, uint32(int32(d)))
2876 o2 = AOP_RRR(c.oprrr(p.As), uint32(p.To.Reg), REGTMP, uint32(r))
2878 o1 = loadu32(REGTMP, d)
2879 o2 = LOP_IRR(OP_ORI, REGTMP, REGTMP, uint32(int32(d)))
2880 o3 = AOP_RRR(c.oprrr(p.As), uint32(p.To.Reg), REGTMP, uint32(r))
2883 case 23: /* and $lcon/$addcon,r1,r2 ==> oris+ori+and/addi+and */
2884 if p.To.Reg == REGTMP || p.Reg == REGTMP {
2885 c.ctxt.Diag("can't synthesize large constant\n%v", p)
2887 d := c.vregoff(&p.From)
2893 // With ADDCON operand, generate 2 instructions using ADDI for signed value,
2894 // with LCON operand generate 3 instructions.
2896 o1 = LOP_IRR(OP_ADDI, REGZERO, REGTMP, uint32(int32(d)))
2897 o2 = LOP_RRR(c.oprrr(p.As), uint32(p.To.Reg), REGTMP, uint32(r))
2899 o1 = loadu32(REGTMP, d)
2900 o2 = LOP_IRR(OP_ORI, REGTMP, REGTMP, uint32(int32(d)))
2901 o3 = LOP_RRR(c.oprrr(p.As), uint32(p.To.Reg), REGTMP, uint32(r))
2903 if p.From.Sym != nil {
2904 c.ctxt.Diag("%v is not supported", p)
2907 case 24: /* lfd fA,float64(0) -> xxlxor xsA,xsaA,xsaA + fneg for -0 */
2908 o1 = AOP_XX3I(c.oprrr(AXXLXOR), uint32(p.To.Reg), uint32(p.To.Reg), uint32(p.To.Reg), uint32(0))
2909 // This is needed for -0.
2911 o2 = AOP_RRR(c.oprrr(AFNEG), uint32(p.To.Reg), 0, uint32(p.To.Reg))
2915 /* sld[.] $sh,rS,rA -> rldicr[.] $sh,rS,mask(0,63-sh),rA; srd[.] -> rldicl */
2916 v := c.regoff(&p.From)
2942 c.ctxt.Diag("unexpected op in sldi case\n%v", p)
2947 o1 = AOP_RLDIC(op, uint32(p.To.Reg), uint32(r), uint32(v), uint32(a))
2948 if p.As == ASLDCC || p.As == ASRDCC {
2949 o1 |= 1 // Set the condition code bit
2952 case 26: /* mov $lsext/auto/oreg,,r2 ==> addis+addi */
2953 if p.To.Reg == REGTMP {
2954 c.ctxt.Diag("can't synthesize large constant\n%v", p)
2956 v := c.regoff(&p.From)
2957 r := int(p.From.Reg)
2961 o1 = AOP_IRR(OP_ADDIS, REGTMP, uint32(r), uint32(high16adjusted(v)))
2962 o2 = AOP_IRR(OP_ADDI, uint32(p.To.Reg), REGTMP, uint32(v))
2964 case 27: /* subc ra,$simm,rd => subfic rd,ra,$simm */
2965 v := c.regoff(p.GetFrom3())
2967 r := int(p.From.Reg)
2968 o1 = AOP_IRR(c.opirr(p.As), uint32(p.To.Reg), uint32(r), uint32(v))
2970 case 28: /* subc r1,$lcon,r2 ==> cau+or+subfc */
2971 if p.To.Reg == REGTMP || p.From.Reg == REGTMP {
2972 c.ctxt.Diag("can't synthesize large constant\n%v", p)
2974 v := c.regoff(p.GetFrom3())
2975 o1 = AOP_IRR(OP_ADDIS, REGTMP, REGZERO, uint32(v)>>16)
2976 o2 = LOP_IRR(OP_ORI, REGTMP, REGTMP, uint32(v))
2977 o3 = AOP_RRR(c.oprrr(p.As), uint32(p.To.Reg), uint32(p.From.Reg), REGTMP)
2978 if p.From.Sym != nil {
2979 c.ctxt.Diag("%v is not supported", p)
2982 case 29: /* rldic[lr]? $sh,s,$mask,a -- left, right, plain give different masks */
2983 v := c.regoff(&p.From)
2985 d := c.vregoff(p.GetFrom3())
2987 c.maskgen64(p, mask[:], uint64(d))
2990 case ARLDC, ARLDCCC:
2991 a = int(mask[0]) /* MB */
2992 if int32(mask[1]) != (63 - v) {
2993 c.ctxt.Diag("invalid mask for shift: %x %x (shift %d)\n%v", uint64(d), mask[1], v, p)
2996 case ARLDCL, ARLDCLCC:
2997 a = int(mask[0]) /* MB */
2999 c.ctxt.Diag("invalid mask for shift: %x %s (shift %d)\n%v", uint64(d), mask[1], v, p)
3002 case ARLDCR, ARLDCRCC:
3003 a = int(mask[1]) /* ME */
3005 c.ctxt.Diag("invalid mask for shift: %x %x (shift %d)\n%v", uint64(d), mask[0], v, p)
3009 c.ctxt.Diag("unexpected op in rldic case\n%v", p)
3013 o1 = AOP_RRR(c.opirr(p.As), uint32(p.Reg), uint32(p.To.Reg), (uint32(v) & 0x1F))
3014 o1 |= (uint32(a) & 31) << 6
3019 o1 |= 1 << 5 /* mb[5] is top bit */
3022 case 30: /* rldimi $sh,s,$mask,a */
3023 v := c.regoff(&p.From)
3025 d := c.vregoff(p.GetFrom3())
3027 // Original opcodes had mask operands which had to be converted to a shift count as expected by
3030 case ARLDMI, ARLDMICC:
3032 c.maskgen64(p, mask[:], uint64(d))
3033 if int32(mask[1]) != (63 - v) {
3034 c.ctxt.Diag("invalid mask for shift: %x %x (shift %d)\n%v", uint64(d), mask[1], v, p)
3036 o1 = AOP_RRR(c.opirr(p.As), uint32(p.Reg), uint32(p.To.Reg), (uint32(v) & 0x1F))
3037 o1 |= (uint32(mask[0]) & 31) << 6
3041 if mask[0]&0x20 != 0 {
3042 o1 |= 1 << 5 /* mb[5] is top bit */
3045 // Opcodes with shift count operands.
3046 case ARLDIMI, ARLDIMICC:
3047 o1 = AOP_RRR(c.opirr(p.As), uint32(p.Reg), uint32(p.To.Reg), (uint32(v) & 0x1F))
3048 o1 |= (uint32(d) & 31) << 6
3057 case 31: /* dword */
3058 d := c.vregoff(&p.From)
3060 if c.ctxt.Arch.ByteOrder == binary.BigEndian {
3061 o1 = uint32(d >> 32)
3065 o2 = uint32(d >> 32)
3068 if p.From.Sym != nil {
3069 rel := obj.Addrel(c.cursym)
3070 rel.Off = int32(c.pc)
3072 rel.Sym = p.From.Sym
3073 rel.Add = p.From.Offset
3074 rel.Type = objabi.R_ADDR
3079 case 32: /* fmul frc,fra,frd */
3085 o1 = AOP_RRR(c.oprrr(p.As), uint32(p.To.Reg), uint32(r), 0) | (uint32(p.From.Reg)&31)<<6
3087 case 33: /* fabs [frb,]frd; fmr. frb,frd */
3088 r := int(p.From.Reg)
3090 if oclass(&p.From) == C_NONE {
3093 o1 = AOP_RRR(c.oprrr(p.As), uint32(p.To.Reg), 0, uint32(r))
3095 case 34: /* FMADDx fra,frb,frc,frt (t=a*c±b) */
3096 o1 = AOP_RRR(c.oprrr(p.As), uint32(p.To.Reg), uint32(p.From.Reg), uint32(p.Reg)) | (uint32(p.GetFrom3().Reg)&31)<<6
3098 case 35: /* mov r,lext/lauto/loreg ==> cau $(v>>16),sb,r'; store o(r') */
3099 v := c.regoff(&p.To)
3105 // Offsets in DS form stores must be a multiple of 4
3106 inst := c.opstore(p.As)
3107 if c.opform(inst) == DS_FORM && v&0x3 != 0 {
3108 log.Fatalf("invalid offset for DS form load/store %v", p)
3110 o1 = AOP_IRR(OP_ADDIS, REGTMP, uint32(r), uint32(high16adjusted(v)))
3111 o2 = AOP_IRR(inst, uint32(p.From.Reg), REGTMP, uint32(v))
3113 case 36: /* mov bz/h/hz lext/lauto/lreg,r ==> lbz/lha/lhz etc */
3114 v := c.regoff(&p.From)
3116 r := int(p.From.Reg)
3120 o1 = AOP_IRR(OP_ADDIS, REGTMP, uint32(r), uint32(high16adjusted(v)))
3121 o2 = AOP_IRR(c.opload(p.As), uint32(p.To.Reg), REGTMP, uint32(v))
3123 case 37: /* movb lext/lauto/lreg,r ==> lbz o(reg),r; extsb r */
3124 v := c.regoff(&p.From)
3126 r := int(p.From.Reg)
3130 o1 = AOP_IRR(OP_ADDIS, REGTMP, uint32(r), uint32(high16adjusted(v)))
3131 o2 = AOP_IRR(c.opload(p.As), uint32(p.To.Reg), REGTMP, uint32(v))
3132 o3 = LOP_RRR(OP_EXTSB, uint32(p.To.Reg), uint32(p.To.Reg), 0)
3135 o1 = uint32(c.regoff(&p.From))
3137 case 41: /* stswi */
3138 o1 = AOP_RRR(c.opirr(p.As), uint32(p.From.Reg), uint32(p.To.Reg), 0) | (uint32(c.regoff(p.GetFrom3()))&0x7F)<<11
3141 o1 = AOP_RRR(c.opirr(p.As), uint32(p.To.Reg), uint32(p.From.Reg), 0) | (uint32(c.regoff(p.GetFrom3()))&0x7F)<<11
3143 case 43: /* data cache instructions: op (Ra+[Rb]), [th|l] */
3144 /* TH field for dcbt/dcbtst: */
3145 /* 0 = Block access - program will soon access EA. */
3146 /* 8-15 = Stream access - sequence of access (data stream). See section 4.3.2 of the ISA for details. */
3147 /* 16 = Block access - program will soon make a transient access to EA. */
3148 /* 17 = Block access - program will not access EA for a long time. */
3150 /* L field for dcbf: */
3151 /* 0 = invalidates the block containing EA in all processors. */
3152 /* 1 = same as 0, but with limited scope (i.e. block in the current processor will not be reused soon). */
3153 /* 3 = same as 1, but with even more limited scope (i.e. block in the current processor primary cache will not be reused soon). */
3154 if p.To.Type == obj.TYPE_NONE {
3155 o1 = AOP_RRR(c.oprrr(p.As), 0, uint32(p.From.Index), uint32(p.From.Reg))
3157 th := c.regoff(&p.To)
3158 o1 = AOP_RRR(c.oprrr(p.As), uint32(th), uint32(p.From.Index), uint32(p.From.Reg))
3161 case 44: /* indexed store */
3162 o1 = AOP_RRR(c.opstorex(p.As), uint32(p.From.Reg), uint32(p.To.Index), uint32(p.To.Reg))
3164 case 45: /* indexed load */
3166 /* The assembler accepts a 4-operand l*arx instruction. The fourth operand is an Exclusive Access Hint (EH) */
3167 /* The EH field can be used as a lock acquire/release hint as follows: */
3168 /* 0 = Atomic Update (fetch-and-operate or similar algorithm) */
3169 /* 1 = Exclusive Access (lock acquire and release) */
3170 case ALBAR, ALHAR, ALWAR, ALDAR:
3171 if p.From3Type() != obj.TYPE_NONE {
3172 eh := int(c.regoff(p.GetFrom3()))
3174 c.ctxt.Diag("illegal EH field\n%v", p)
3176 o1 = AOP_RRRI(c.oploadx(p.As), uint32(p.To.Reg), uint32(p.From.Index), uint32(p.From.Reg), uint32(eh))
3178 o1 = AOP_RRR(c.oploadx(p.As), uint32(p.To.Reg), uint32(p.From.Index), uint32(p.From.Reg))
3181 o1 = AOP_RRR(c.oploadx(p.As), uint32(p.To.Reg), uint32(p.From.Index), uint32(p.From.Reg))
3183 case 46: /* plain op */
3186 case 47: /* op Ra, Rd; also op [Ra,] Rd */
3187 r := int(p.From.Reg)
3192 o1 = AOP_RRR(c.oprrr(p.As), uint32(p.To.Reg), uint32(r), 0)
3194 case 48: /* op Rs, Ra */
3195 r := int(p.From.Reg)
3200 o1 = LOP_RRR(c.oprrr(p.As), uint32(p.To.Reg), uint32(r), 0)
3202 case 49: /* op Rb; op $n, Rb */
3203 if p.From.Type != obj.TYPE_REG { /* tlbie $L, rB */
3204 v := c.regoff(&p.From) & 1
3205 o1 = AOP_RRR(c.oprrr(p.As), 0, 0, uint32(p.To.Reg)) | uint32(v)<<21
3207 o1 = AOP_RRR(c.oprrr(p.As), 0, 0, uint32(p.From.Reg))
3210 case 50: /* rem[u] r1[,r2],r3 */
3217 t := v & (1<<10 | 1) /* OE|Rc */
3218 o1 = AOP_RRR(v&^t, REGTMP, uint32(r), uint32(p.From.Reg))
3219 o2 = AOP_RRR(OP_MULLW, REGTMP, REGTMP, uint32(p.From.Reg))
3220 o3 = AOP_RRR(OP_SUBF|t, uint32(p.To.Reg), REGTMP, uint32(r))
3224 /* Clear top 32 bits */
3225 o3 = OP_RLW(OP_RLDIC, REGTMP, REGTMP, 0, 0, 0) | 1<<5
3228 case 51: /* remd[u] r1[,r2],r3 */
3235 t := v & (1<<10 | 1) /* OE|Rc */
3236 o1 = AOP_RRR(v&^t, REGTMP, uint32(r), uint32(p.From.Reg))
3237 o2 = AOP_RRR(OP_MULLD, REGTMP, REGTMP, uint32(p.From.Reg))
3238 o3 = AOP_RRR(OP_SUBF|t, uint32(p.To.Reg), REGTMP, uint32(r))
3239 /* cases 50,51: removed; can be reused. */
3241 /* cases 50,51: removed; can be reused. */
3243 case 52: /* mtfsbNx cr(n) */
3244 v := c.regoff(&p.From) & 31
3246 o1 = AOP_RRR(c.oprrr(p.As), uint32(v), 0, 0)
3248 case 53: /* mffsX ,fr1 */
3249 o1 = AOP_RRR(OP_MFFS, uint32(p.To.Reg), 0, 0)
3251 case 54: /* mov msr,r1; mov r1, msr*/
3252 if oclass(&p.From) == C_REG {
3254 o1 = AOP_RRR(OP_MTMSRD, uint32(p.From.Reg), 0, 0)
3256 o1 = AOP_RRR(OP_MTMSR, uint32(p.From.Reg), 0, 0)
3259 o1 = AOP_RRR(OP_MFMSR, uint32(p.To.Reg), 0, 0)
3262 case 55: /* op Rb, Rd */
3263 o1 = AOP_RRR(c.oprrr(p.As), uint32(p.To.Reg), 0, uint32(p.From.Reg))
3265 case 56: /* sra $sh,[s,]a; srd $sh,[s,]a */
3266 v := c.regoff(&p.From)
3272 o1 = AOP_RRR(c.opirr(p.As), uint32(r), uint32(p.To.Reg), uint32(v)&31)
3273 if (p.As == ASRAD || p.As == ASRADCC) && (v&0x20 != 0) {
3274 o1 |= 1 << 1 /* mb[5] */
3277 case 57: /* slw $sh,[s,]a -> rlwinm ... */
3278 v := c.regoff(&p.From)
3286 * Let user (gs) shoot himself in the foot.
3287 * qc has already complained.
3290 ctxt->diag("illegal shift %ld\n%v", v, p);
3300 mask[0], mask[1] = 0, 31
3302 mask[0], mask[1] = uint8(v), 31
3305 mask[0], mask[1] = 0, uint8(31-v)
3307 o1 = OP_RLW(OP_RLWINM, uint32(p.To.Reg), uint32(r), uint32(v), uint32(mask[0]), uint32(mask[1]))
3308 if p.As == ASLWCC || p.As == ASRWCC {
3309 o1 |= 1 // set the condition code
3312 case 58: /* logical $andcon,[s],a */
3313 v := c.regoff(&p.From)
3319 o1 = LOP_IRR(c.opirr(p.As), uint32(p.To.Reg), uint32(r), uint32(v))
3321 case 59: /* or/xor/and $ucon,,r | oris/xoris/andis $addcon,r,r */
3322 v := c.regoff(&p.From)
3330 o1 = LOP_IRR(c.opirr(AORIS), uint32(p.To.Reg), uint32(r), uint32(v)>>16) /* oris, xoris, andis. */
3332 o1 = LOP_IRR(c.opirr(AXORIS), uint32(p.To.Reg), uint32(r), uint32(v)>>16)
3334 o1 = LOP_IRR(c.opirr(AANDISCC), uint32(p.To.Reg), uint32(r), uint32(v)>>16)
3336 o1 = LOP_IRR(c.opirr(p.As), uint32(p.To.Reg), uint32(r), uint32(v))
3339 case 60: /* tw to,a,b */
3340 r := int(c.regoff(&p.From) & 31)
3342 o1 = AOP_RRR(c.oprrr(p.As), uint32(r), uint32(p.Reg), uint32(p.To.Reg))
3344 case 61: /* tw to,a,$simm */
3345 r := int(c.regoff(&p.From) & 31)
3347 v := c.regoff(&p.To)
3348 o1 = AOP_IRR(c.opirr(p.As), uint32(r), uint32(p.Reg), uint32(v))
3350 case 62: /* rlwmi $sh,s,$mask,a */
3351 v := c.regoff(&p.From)
3354 c.maskgen(p, mask[:], uint32(c.regoff(p.GetFrom3())))
3355 o1 = AOP_RRR(c.opirr(p.As), uint32(p.Reg), uint32(p.To.Reg), uint32(v))
3356 o1 |= (uint32(mask[0])&31)<<6 | (uint32(mask[1])&31)<<1
3358 case 63: /* rlwmi b,s,$mask,a */
3360 c.maskgen(p, mask[:], uint32(c.regoff(p.GetFrom3())))
3362 o1 = AOP_RRR(c.opirr(p.As), uint32(p.Reg), uint32(p.To.Reg), uint32(p.From.Reg))
3363 o1 |= (uint32(mask[0])&31)<<6 | (uint32(mask[1])&31)<<1
3365 case 64: /* mtfsf fr[, $m] {,fpcsr} */
3367 if p.From3Type() != obj.TYPE_NONE {
3368 v = c.regoff(p.GetFrom3()) & 255
3372 o1 = OP_MTFSF | uint32(v)<<17 | uint32(p.From.Reg)<<11
3374 case 65: /* MOVFL $imm,FPSCR(n) => mtfsfi crfd,imm */
3376 c.ctxt.Diag("must specify FPSCR(n)\n%v", p)
3378 o1 = OP_MTFSFI | (uint32(p.To.Reg)&15)<<23 | (uint32(c.regoff(&p.From))&31)<<12
3380 case 66: /* mov spr,r1; mov r1,spr, also dcr */
3383 if REG_R0 <= p.From.Reg && p.From.Reg <= REG_R31 {
3386 if REG_DCR0 <= v && v <= REG_DCR0+1023 {
3387 o1 = OPVCC(31, 451, 0, 0) /* mtdcr */
3389 o1 = OPVCC(31, 467, 0, 0) /* mtspr */
3393 v = int32(p.From.Reg)
3394 if REG_DCR0 <= v && v <= REG_DCR0+1023 {
3395 o1 = OPVCC(31, 323, 0, 0) /* mfdcr */
3397 o1 = OPVCC(31, 339, 0, 0) /* mfspr */
3401 o1 = AOP_RRR(o1, uint32(r), 0, 0) | (uint32(v)&0x1f)<<16 | ((uint32(v)>>5)&0x1f)<<11
3403 case 67: /* mcrf crfD,crfS */
3404 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 {
3405 c.ctxt.Diag("illegal CR field number\n%v", p)
3407 o1 = AOP_RRR(OP_MCRF, ((uint32(p.To.Reg) & 7) << 2), ((uint32(p.From.Reg) & 7) << 2), 0)
3409 case 68: /* mfcr rD; mfocrf CRM,rD */
3410 if p.From.Type == obj.TYPE_REG && REG_CR0 <= p.From.Reg && p.From.Reg <= REG_CR7 {
3411 v := int32(1 << uint(7-(p.To.Reg&7))) /* CR(n) */
3412 o1 = AOP_RRR(OP_MFCR, uint32(p.To.Reg), 0, 0) | 1<<20 | uint32(v)<<12 /* new form, mfocrf */
3414 o1 = AOP_RRR(OP_MFCR, uint32(p.To.Reg), 0, 0) /* old form, whole register */
3417 case 69: /* mtcrf CRM,rS */
3419 if p.From3Type() != obj.TYPE_NONE {
3421 c.ctxt.Diag("can't use both mask and CR(n)\n%v", p)
3423 v = c.regoff(p.GetFrom3()) & 0xff
3428 v = 1 << uint(7-(p.To.Reg&7)) /* CR(n) */
3432 o1 = AOP_RRR(OP_MTCRF, uint32(p.From.Reg), 0, 0) | uint32(v)<<12
3434 case 70: /* [f]cmp r,r,cr*/
3439 r = (int(p.Reg) & 7) << 2
3441 o1 = AOP_RRR(c.oprrr(p.As), uint32(r), uint32(p.From.Reg), uint32(p.To.Reg))
3443 case 71: /* cmp[l] r,i,cr*/
3448 r = (int(p.Reg) & 7) << 2
3450 o1 = AOP_RRR(c.opirr(p.As), uint32(r), uint32(p.From.Reg), 0) | uint32(c.regoff(&p.To))&0xffff
3452 case 72: /* slbmte (Rb+Rs -> slb[Rb]) -> Rs, Rb */
3453 o1 = AOP_RRR(c.oprrr(p.As), uint32(p.From.Reg), 0, uint32(p.To.Reg))
3455 case 73: /* mcrfs crfD,crfS */
3456 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 {
3457 c.ctxt.Diag("illegal FPSCR/CR field number\n%v", p)
3459 o1 = AOP_RRR(OP_MCRFS, ((uint32(p.To.Reg) & 7) << 2), ((0 & 7) << 2), 0)
3461 case 77: /* syscall $scon, syscall Rx */
3462 if p.From.Type == obj.TYPE_CONST {
3463 if p.From.Offset > BIG || p.From.Offset < -BIG {
3464 c.ctxt.Diag("illegal syscall, sysnum too large: %v", p)
3466 o1 = AOP_IRR(OP_ADDI, REGZERO, REGZERO, uint32(p.From.Offset))
3467 } else if p.From.Type == obj.TYPE_REG {
3468 o1 = LOP_RRR(OP_OR, REGZERO, uint32(p.From.Reg), uint32(p.From.Reg))
3470 c.ctxt.Diag("illegal syscall: %v", p)
3471 o1 = 0x7fe00008 // trap always
3475 o3 = AOP_RRR(c.oprrr(AXOR), REGZERO, REGZERO, REGZERO) // XOR R0, R0
3477 case 78: /* undef */
3478 o1 = 0 /* "An instruction consisting entirely of binary 0s is guaranteed
3479 always to be an illegal instruction." */
3481 /* relocation operations */
3483 v := c.vregoff(&p.To)
3484 // Offsets in DS form stores must be a multiple of 4
3485 inst := c.opstore(p.As)
3486 if c.opform(inst) == DS_FORM && v&0x3 != 0 {
3487 log.Fatalf("invalid offset for DS form load/store %v", p)
3489 o1, o2 = c.symbolAccess(p.To.Sym, v, p.From.Reg, inst)
3491 //if(dlm) reloc(&p->to, p->pc, 1);
3494 v := c.vregoff(&p.From)
3495 // Offsets in DS form loads must be a multiple of 4
3496 inst := c.opload(p.As)
3497 if c.opform(inst) == DS_FORM && v&0x3 != 0 {
3498 log.Fatalf("invalid offset for DS form load/store %v", p)
3500 o1, o2 = c.symbolAccess(p.From.Sym, v, p.To.Reg, inst)
3502 //if(dlm) reloc(&p->from, p->pc, 1);
3505 v := c.vregoff(&p.From)
3506 // Offsets in DS form loads must be a multiple of 4
3507 inst := c.opload(p.As)
3508 if c.opform(inst) == DS_FORM && v&0x3 != 0 {
3509 log.Fatalf("invalid offset for DS form load/store %v", p)
3511 o1, o2 = c.symbolAccess(p.From.Sym, v, p.To.Reg, inst)
3512 o3 = LOP_RRR(OP_EXTSB, uint32(p.To.Reg), uint32(p.To.Reg), 0)
3514 //if(dlm) reloc(&p->from, p->pc, 1);
3517 if p.From.Offset != 0 {
3518 c.ctxt.Diag("invalid offset against tls var %v", p)
3520 o1 = AOP_IRR(OP_ADDI, uint32(p.To.Reg), REGZERO, 0)
3521 rel := obj.Addrel(c.cursym)
3522 rel.Off = int32(c.pc)
3524 rel.Sym = p.From.Sym
3525 rel.Type = objabi.R_POWER_TLS_LE
3528 if p.From.Offset != 0 {
3529 c.ctxt.Diag("invalid offset against tls var %v", p)
3531 o1 = AOP_IRR(OP_ADDIS, uint32(p.To.Reg), REG_R2, 0)
3532 o2 = AOP_IRR(c.opload(AMOVD), uint32(p.To.Reg), uint32(p.To.Reg), 0)
3533 rel := obj.Addrel(c.cursym)
3534 rel.Off = int32(c.pc)
3536 rel.Sym = p.From.Sym
3537 rel.Type = objabi.R_POWER_TLS_IE
3540 v := c.vregoff(&p.To)
3542 c.ctxt.Diag("invalid offset against GOT slot %v", p)
3545 o1 = AOP_IRR(OP_ADDIS, uint32(p.To.Reg), REG_R2, 0)
3546 o2 = AOP_IRR(c.opload(AMOVD), uint32(p.To.Reg), uint32(p.To.Reg), 0)
3547 rel := obj.Addrel(c.cursym)
3548 rel.Off = int32(c.pc)
3550 rel.Sym = p.From.Sym
3551 rel.Type = objabi.R_ADDRPOWER_GOT
3552 case 82: /* vector instructions, VX-form and VC-form */
3553 if p.From.Type == obj.TYPE_REG {
3554 /* reg reg none OR reg reg reg */
3555 /* 3-register operand order: VRA, VRB, VRT */
3556 /* 2-register operand order: VRA, VRT */
3557 o1 = AOP_RRR(c.oprrr(p.As), uint32(p.To.Reg), uint32(p.From.Reg), uint32(p.Reg))
3558 } else if p.From3Type() == obj.TYPE_CONST {
3559 /* imm imm reg reg */
3560 /* operand order: SIX, VRA, ST, VRT */
3561 six := int(c.regoff(&p.From))
3562 st := int(c.regoff(p.GetFrom3()))
3563 o1 = AOP_IIRR(c.opiirr(p.As), uint32(p.To.Reg), uint32(p.Reg), uint32(st), uint32(six))
3564 } else if p.From3Type() == obj.TYPE_NONE && p.Reg != 0 {
3566 /* operand order: UIM, VRB, VRT */
3567 uim := int(c.regoff(&p.From))
3568 o1 = AOP_VIRR(c.opirr(p.As), uint32(p.To.Reg), uint32(p.Reg), uint32(uim))
3571 /* operand order: SIM, VRT */
3572 sim := int(c.regoff(&p.From))
3573 o1 = AOP_IR(c.opirr(p.As), uint32(p.To.Reg), uint32(sim))
3576 case 83: /* vector instructions, VA-form */
3577 if p.From.Type == obj.TYPE_REG {
3578 /* reg reg reg reg */
3579 /* 4-register operand order: VRA, VRB, VRC, VRT */
3580 o1 = AOP_RRRR(c.oprrr(p.As), uint32(p.To.Reg), uint32(p.From.Reg), uint32(p.Reg), uint32(p.GetFrom3().Reg))
3581 } else if p.From.Type == obj.TYPE_CONST {
3582 /* imm reg reg reg */
3583 /* operand order: SHB, VRA, VRB, VRT */
3584 shb := int(c.regoff(&p.From))
3585 o1 = AOP_IRRR(c.opirrr(p.As), uint32(p.To.Reg), uint32(p.Reg), uint32(p.GetFrom3().Reg), uint32(shb))
3588 case 84: // ISEL BC,RA,RB,RT -> isel rt,ra,rb,bc
3589 bc := c.vregoff(&p.From)
3591 // rt = To.Reg, ra = p.Reg, rb = p.From3.Reg
3592 o1 = AOP_ISEL(OP_ISEL, uint32(p.To.Reg), uint32(p.Reg), uint32(p.GetFrom3().Reg), uint32(bc))
3594 case 85: /* vector instructions, VX-form */
3596 /* 2-register operand order: VRB, VRT */
3597 o1 = AOP_RR(c.oprrr(p.As), uint32(p.To.Reg), uint32(p.From.Reg))
3599 case 86: /* VSX indexed store, XX1-form */
3601 /* 3-register operand order: XT, (RB)(RA*1) */
3602 o1 = AOP_XX1(c.opstorex(p.As), uint32(p.From.Reg), uint32(p.To.Index), uint32(p.To.Reg))
3604 case 87: /* VSX indexed load, XX1-form */
3606 /* 3-register operand order: (RB)(RA*1), XT */
3607 o1 = AOP_XX1(c.oploadx(p.As), uint32(p.To.Reg), uint32(p.From.Index), uint32(p.From.Reg))
3609 case 88: /* VSX instructions, XX1-form */
3610 /* reg reg none OR reg reg reg */
3611 /* 3-register operand order: RA, RB, XT */
3612 /* 2-register operand order: XS, RA or RA, XT */
3613 xt := int32(p.To.Reg)
3614 xs := int32(p.From.Reg)
3615 /* We need to treat the special case of extended mnemonics that may have a FREG/VREG as an argument */
3616 if REG_V0 <= xt && xt <= REG_V31 {
3617 /* Convert V0-V31 to VS32-VS63 */
3619 o1 = AOP_XX1(c.oprrr(p.As), uint32(xt), uint32(p.From.Reg), uint32(p.Reg))
3620 } else if REG_F0 <= xt && xt <= REG_F31 {
3621 /* Convert F0-F31 to VS0-VS31 */
3623 o1 = AOP_XX1(c.oprrr(p.As), uint32(xt), uint32(p.From.Reg), uint32(p.Reg))
3624 } else if REG_VS0 <= xt && xt <= REG_VS63 {
3625 o1 = AOP_XX1(c.oprrr(p.As), uint32(xt), uint32(p.From.Reg), uint32(p.Reg))
3626 } else if REG_V0 <= xs && xs <= REG_V31 {
3627 /* Likewise for XS */
3629 o1 = AOP_XX1(c.oprrr(p.As), uint32(xs), uint32(p.To.Reg), uint32(p.Reg))
3630 } else if REG_F0 <= xs && xs <= REG_F31 {
3632 o1 = AOP_XX1(c.oprrr(p.As), uint32(xs), uint32(p.To.Reg), uint32(p.Reg))
3633 } else if REG_VS0 <= xs && xs <= REG_VS63 {
3634 o1 = AOP_XX1(c.oprrr(p.As), uint32(xs), uint32(p.To.Reg), uint32(p.Reg))
3637 case 89: /* VSX instructions, XX2-form */
3638 /* reg none reg OR reg imm reg */
3639 /* 2-register operand order: XB, XT or XB, UIM, XT*/
3640 uim := int(c.regoff(p.GetFrom3()))
3641 o1 = AOP_XX2(c.oprrr(p.As), uint32(p.To.Reg), uint32(uim), uint32(p.From.Reg))
3643 case 90: /* VSX instructions, XX3-form */
3644 if p.From3Type() == obj.TYPE_NONE {
3646 /* 3-register operand order: XA, XB, XT */
3647 o1 = AOP_XX3(c.oprrr(p.As), uint32(p.To.Reg), uint32(p.From.Reg), uint32(p.Reg))
3648 } else if p.From3Type() == obj.TYPE_CONST {
3649 /* reg reg reg imm */
3650 /* operand order: XA, XB, DM, XT */
3651 dm := int(c.regoff(p.GetFrom3()))
3652 o1 = AOP_XX3I(c.oprrr(p.As), uint32(p.To.Reg), uint32(p.From.Reg), uint32(p.Reg), uint32(dm))
3655 case 91: /* VSX instructions, XX4-form */
3656 /* reg reg reg reg */
3657 /* 3-register operand order: XA, XB, XC, XT */
3658 o1 = AOP_XX4(c.oprrr(p.As), uint32(p.To.Reg), uint32(p.From.Reg), uint32(p.Reg), uint32(p.GetFrom3().Reg))
3660 case 92: /* X-form instructions, 3-operands */
3661 if p.To.Type == obj.TYPE_CONST {
3663 xf := int32(p.From.Reg)
3664 if REG_F0 <= xf && xf <= REG_F31 {
3665 /* operand order: FRA, FRB, BF */
3666 bf := int(c.regoff(&p.To)) << 2
3667 o1 = AOP_RRR(c.opirr(p.As), uint32(bf), uint32(p.From.Reg), uint32(p.Reg))
3669 /* operand order: RA, RB, L */
3670 l := int(c.regoff(&p.To))
3671 o1 = AOP_RRR(c.opirr(p.As), uint32(l), uint32(p.From.Reg), uint32(p.Reg))
3673 } else if p.From3Type() == obj.TYPE_CONST {
3675 /* operand order: RB, L, RA */
3676 l := int(c.regoff(p.GetFrom3()))
3677 o1 = AOP_RRR(c.opirr(p.As), uint32(l), uint32(p.To.Reg), uint32(p.From.Reg))
3678 } else if p.To.Type == obj.TYPE_REG {
3679 cr := int32(p.To.Reg)
3680 if REG_CR0 <= cr && cr <= REG_CR7 {
3682 /* operand order: RA, RB, BF */
3683 bf := (int(p.To.Reg) & 7) << 2
3684 o1 = AOP_RRR(c.opirr(p.As), uint32(bf), uint32(p.From.Reg), uint32(p.Reg))
3685 } else if p.From.Type == obj.TYPE_CONST {
3687 /* operand order: L, RT */
3688 l := int(c.regoff(&p.From))
3689 o1 = AOP_RRR(c.opirr(p.As), uint32(p.To.Reg), uint32(l), uint32(p.Reg))
3692 case ACOPY, APASTECC:
3693 o1 = AOP_RRR(c.opirr(p.As), uint32(1), uint32(p.From.Reg), uint32(p.To.Reg))
3696 /* operand order: RS, RB, RA */
3697 o1 = AOP_RRR(c.oprrr(p.As), uint32(p.From.Reg), uint32(p.To.Reg), uint32(p.Reg))
3702 case 93: /* X-form instructions, 2-operands */
3703 if p.To.Type == obj.TYPE_CONST {
3705 /* operand order: FRB, BF */
3706 bf := int(c.regoff(&p.To)) << 2
3707 o1 = AOP_RR(c.opirr(p.As), uint32(bf), uint32(p.From.Reg))
3708 } else if p.Reg == 0 {
3709 /* popcnt* r,r, X-form */
3710 /* operand order: RS, RA */
3711 o1 = AOP_RRR(c.oprrr(p.As), uint32(p.From.Reg), uint32(p.To.Reg), uint32(p.Reg))
3714 case 94: /* Z23-form instructions, 4-operands */
3715 /* reg reg reg imm */
3716 /* operand order: RA, RB, CY, RT */
3717 cy := int(c.regoff(p.GetFrom3()))
3718 o1 = AOP_Z23I(c.oprrr(p.As), uint32(p.To.Reg), uint32(p.From.Reg), uint32(p.Reg), uint32(cy))
3720 case 95: /* Retrieve TOC relative symbol */
3721 /* This code is for AIX only */
3722 v := c.vregoff(&p.From)
3724 c.ctxt.Diag("invalid offset against TOC slot %v", p)
3727 inst := c.opload(p.As)
3728 if c.opform(inst) != DS_FORM {
3729 c.ctxt.Diag("invalid form for a TOC access in %v", p)
3732 o1 = AOP_IRR(OP_ADDIS, uint32(p.To.Reg), REG_R2, 0)
3733 o2 = AOP_IRR(inst, uint32(p.To.Reg), uint32(p.To.Reg), 0)
3734 rel := obj.Addrel(c.cursym)
3735 rel.Off = int32(c.pc)
3737 rel.Sym = p.From.Sym
3738 rel.Type = objabi.R_ADDRPOWER_TOCREL_DS
3740 case 96: /* VSX load, DQ-form */
3742 /* operand order: (RA)(DQ), XT */
3743 dq := int16(c.regoff(&p.From))
3745 c.ctxt.Diag("invalid offset for DQ form load/store %v", dq)
3747 o1 = AOP_DQ(c.opload(p.As), uint32(p.To.Reg), uint32(p.From.Reg), uint32(dq))
3749 case 97: /* VSX store, DQ-form */
3751 /* operand order: XT, (RA)(DQ) */
3752 dq := int16(c.regoff(&p.To))
3754 c.ctxt.Diag("invalid offset for DQ form load/store %v", dq)
3756 o1 = AOP_DQ(c.opstore(p.As), uint32(p.From.Reg), uint32(p.To.Reg), uint32(dq))
3757 case 98: /* VSX indexed load or load with length (also left-justified), x-form */
3758 /* vsreg, reg, reg */
3759 o1 = AOP_XX1(c.opload(p.As), uint32(p.To.Reg), uint32(p.From.Reg), uint32(p.Reg))
3760 case 99: /* VSX store with length (also left-justified) x-form */
3761 /* reg, reg, vsreg */
3762 o1 = AOP_XX1(c.opstore(p.As), uint32(p.From.Reg), uint32(p.Reg), uint32(p.To.Reg))
3763 case 100: /* VSX X-form XXSPLTIB */
3764 if p.From.Type == obj.TYPE_CONST {
3766 uim := int(c.regoff(&p.From))
3768 /* Use AOP_XX1 form with 0 for one of the registers. */
3769 o1 = AOP_XX1(c.oprrr(p.As), uint32(p.To.Reg), uint32(0), uint32(uim))
3771 c.ctxt.Diag("invalid ops for %v", p.As)
3774 o1 = AOP_XX2(c.oprrr(p.As), uint32(p.To.Reg), uint32(0), uint32(p.From.Reg))
3784 func (c *ctxt9) vregoff(a *obj.Addr) int64 {
3792 func (c *ctxt9) regoff(a *obj.Addr) int32 {
3793 return int32(c.vregoff(a))
3796 func (c *ctxt9) oprrr(a obj.As) uint32 {
3799 return OPVCC(31, 266, 0, 0)
3801 return OPVCC(31, 266, 0, 1)
3803 return OPVCC(31, 266, 1, 0)
3805 return OPVCC(31, 266, 1, 1)
3807 return OPVCC(31, 10, 0, 0)
3809 return OPVCC(31, 10, 0, 1)
3811 return OPVCC(31, 10, 1, 0)
3813 return OPVCC(31, 10, 1, 1)
3815 return OPVCC(31, 138, 0, 0)
3817 return OPVCC(31, 138, 0, 1)
3819 return OPVCC(31, 138, 1, 0)
3821 return OPVCC(31, 138, 1, 1)
3823 return OPVCC(31, 234, 0, 0)
3825 return OPVCC(31, 234, 0, 1)
3827 return OPVCC(31, 234, 1, 0)
3829 return OPVCC(31, 234, 1, 1)
3831 return OPVCC(31, 202, 0, 0)
3833 return OPVCC(31, 202, 0, 1)
3835 return OPVCC(31, 202, 1, 0)
3837 return OPVCC(31, 202, 1, 1)
3839 return OPVCC(31, 170, 0, 0) /* addex - v3.0b */
3842 return OPVCC(31, 28, 0, 0)
3844 return OPVCC(31, 28, 0, 1)
3846 return OPVCC(31, 60, 0, 0)
3848 return OPVCC(31, 60, 0, 1)
3851 return OPVCC(31, 0, 0, 0) | 1<<21 /* L=1 */
3853 return OPVCC(31, 32, 0, 0) | 1<<21
3855 return OPVCC(31, 0, 0, 0) /* L=0 */
3857 return OPVCC(31, 32, 0, 0)
3859 return OPVCC(31, 508, 0, 0) /* cmpb - v2.05 */
3861 return OPVCC(31, 224, 0, 0) /* cmpeqb - v3.00 */
3864 return OPVCC(31, 26, 0, 0)
3866 return OPVCC(31, 26, 0, 1)
3868 return OPVCC(31, 58, 0, 0)
3870 return OPVCC(31, 58, 0, 1)
3873 return OPVCC(19, 257, 0, 0)
3875 return OPVCC(19, 129, 0, 0)
3877 return OPVCC(19, 289, 0, 0)
3879 return OPVCC(19, 225, 0, 0)
3881 return OPVCC(19, 33, 0, 0)
3883 return OPVCC(19, 449, 0, 0)
3885 return OPVCC(19, 417, 0, 0)
3887 return OPVCC(19, 193, 0, 0)
3890 return OPVCC(31, 86, 0, 0)
3892 return OPVCC(31, 470, 0, 0)
3894 return OPVCC(31, 54, 0, 0)
3896 return OPVCC(31, 278, 0, 0)
3898 return OPVCC(31, 246, 0, 0)
3900 return OPVCC(31, 1014, 0, 0)
3903 return OPVCC(31, 265, 0, 0) /* modud - v3.0 */
3905 return OPVCC(31, 267, 0, 0) /* moduw - v3.0 */
3907 return OPVCC(31, 777, 0, 0) /* modsd - v3.0 */
3909 return OPVCC(31, 779, 0, 0) /* modsw - v3.0 */
3912 return OPVCC(31, 491, 0, 0)
3915 return OPVCC(31, 491, 0, 1)
3918 return OPVCC(31, 491, 1, 0)
3921 return OPVCC(31, 491, 1, 1)
3924 return OPVCC(31, 459, 0, 0)
3927 return OPVCC(31, 459, 0, 1)
3930 return OPVCC(31, 459, 1, 0)
3933 return OPVCC(31, 459, 1, 1)
3936 return OPVCC(31, 489, 0, 0)
3939 return OPVCC(31, 489, 0, 1)
3942 return OPVCC(31, 425, 0, 0)
3945 return OPVCC(31, 425, 0, 1)
3948 return OPVCC(31, 393, 0, 0)
3951 return OPVCC(31, 393, 0, 1)
3954 return OPVCC(31, 489, 1, 0)
3957 return OPVCC(31, 489, 1, 1)
3959 case ADIVDU, AREMDU:
3960 return OPVCC(31, 457, 0, 0)
3963 return OPVCC(31, 457, 0, 1)
3966 return OPVCC(31, 457, 1, 0)
3969 return OPVCC(31, 457, 1, 1)
3972 return OPVCC(31, 854, 0, 0)
3975 return OPVCC(31, 284, 0, 0)
3977 return OPVCC(31, 284, 0, 1)
3980 return OPVCC(31, 954, 0, 0)
3982 return OPVCC(31, 954, 0, 1)
3984 return OPVCC(31, 922, 0, 0)
3986 return OPVCC(31, 922, 0, 1)
3988 return OPVCC(31, 986, 0, 0)
3990 return OPVCC(31, 986, 0, 1)
3993 return OPVCC(63, 264, 0, 0)
3995 return OPVCC(63, 264, 0, 1)
3997 return OPVCC(63, 21, 0, 0)
3999 return OPVCC(63, 21, 0, 1)
4001 return OPVCC(59, 21, 0, 0)
4003 return OPVCC(59, 21, 0, 1)
4005 return OPVCC(63, 32, 0, 0)
4007 return OPVCC(63, 0, 0, 0)
4009 return OPVCC(63, 846, 0, 0)
4011 return OPVCC(63, 846, 0, 1)
4013 return OPVCC(63, 974, 0, 0)
4015 return OPVCC(63, 974, 0, 1)
4017 return OPVCC(59, 846, 0, 0)
4019 return OPVCC(59, 846, 0, 1)
4021 return OPVCC(63, 14, 0, 0)
4023 return OPVCC(63, 14, 0, 1)
4025 return OPVCC(63, 15, 0, 0)
4027 return OPVCC(63, 15, 0, 1)
4029 return OPVCC(63, 814, 0, 0)
4031 return OPVCC(63, 814, 0, 1)
4033 return OPVCC(63, 815, 0, 0)
4035 return OPVCC(63, 815, 0, 1)
4037 return OPVCC(63, 18, 0, 0)
4039 return OPVCC(63, 18, 0, 1)
4041 return OPVCC(59, 18, 0, 0)
4043 return OPVCC(59, 18, 0, 1)
4045 return OPVCC(63, 29, 0, 0)
4047 return OPVCC(63, 29, 0, 1)
4049 return OPVCC(59, 29, 0, 0)
4051 return OPVCC(59, 29, 0, 1)
4053 case AFMOVS, AFMOVD:
4054 return OPVCC(63, 72, 0, 0) /* load */
4056 return OPVCC(63, 72, 0, 1)
4058 return OPVCC(63, 28, 0, 0)
4060 return OPVCC(63, 28, 0, 1)
4062 return OPVCC(59, 28, 0, 0)
4064 return OPVCC(59, 28, 0, 1)
4066 return OPVCC(63, 25, 0, 0)
4068 return OPVCC(63, 25, 0, 1)
4070 return OPVCC(59, 25, 0, 0)
4072 return OPVCC(59, 25, 0, 1)
4074 return OPVCC(63, 136, 0, 0)
4076 return OPVCC(63, 136, 0, 1)
4078 return OPVCC(63, 40, 0, 0)
4080 return OPVCC(63, 40, 0, 1)
4082 return OPVCC(63, 31, 0, 0)
4084 return OPVCC(63, 31, 0, 1)
4086 return OPVCC(59, 31, 0, 0)
4088 return OPVCC(59, 31, 0, 1)
4090 return OPVCC(63, 30, 0, 0)
4092 return OPVCC(63, 30, 0, 1)
4094 return OPVCC(59, 30, 0, 0)
4096 return OPVCC(59, 30, 0, 1)
4098 return OPVCC(63, 8, 0, 0)
4100 return OPVCC(63, 8, 0, 1)
4102 return OPVCC(59, 24, 0, 0)
4104 return OPVCC(59, 24, 0, 1)
4106 return OPVCC(63, 488, 0, 0)
4108 return OPVCC(63, 488, 0, 1)
4110 return OPVCC(63, 456, 0, 0)
4112 return OPVCC(63, 456, 0, 1)
4114 return OPVCC(63, 424, 0, 0)
4116 return OPVCC(63, 424, 0, 1)
4118 return OPVCC(63, 392, 0, 0)
4120 return OPVCC(63, 392, 0, 1)
4122 return OPVCC(63, 12, 0, 0)
4124 return OPVCC(63, 12, 0, 1)
4126 return OPVCC(63, 26, 0, 0)
4128 return OPVCC(63, 26, 0, 1)
4130 return OPVCC(63, 23, 0, 0)
4132 return OPVCC(63, 23, 0, 1)
4134 return OPVCC(63, 22, 0, 0)
4136 return OPVCC(63, 22, 0, 1)
4138 return OPVCC(59, 22, 0, 0)
4140 return OPVCC(59, 22, 0, 1)
4142 return OPVCC(63, 20, 0, 0)
4144 return OPVCC(63, 20, 0, 1)
4146 return OPVCC(59, 20, 0, 0)
4148 return OPVCC(59, 20, 0, 1)
4151 return OPVCC(31, 982, 0, 0)
4153 return OPVCC(19, 150, 0, 0)
4156 return OPVCC(63, 70, 0, 0)
4158 return OPVCC(63, 70, 0, 1)
4160 return OPVCC(63, 38, 0, 0)
4162 return OPVCC(63, 38, 0, 1)
4165 return OPVCC(31, 75, 0, 0)
4167 return OPVCC(31, 75, 0, 1)
4169 return OPVCC(31, 11, 0, 0)
4171 return OPVCC(31, 11, 0, 1)
4173 return OPVCC(31, 235, 0, 0)
4175 return OPVCC(31, 235, 0, 1)
4177 return OPVCC(31, 235, 1, 0)
4179 return OPVCC(31, 235, 1, 1)
4182 return OPVCC(31, 73, 0, 0)
4184 return OPVCC(31, 73, 0, 1)
4186 return OPVCC(31, 9, 0, 0)
4188 return OPVCC(31, 9, 0, 1)
4190 return OPVCC(31, 233, 0, 0)
4192 return OPVCC(31, 233, 0, 1)
4194 return OPVCC(31, 233, 1, 0)
4196 return OPVCC(31, 233, 1, 1)
4199 return OPVCC(31, 476, 0, 0)
4201 return OPVCC(31, 476, 0, 1)
4203 return OPVCC(31, 104, 0, 0)
4205 return OPVCC(31, 104, 0, 1)
4207 return OPVCC(31, 104, 1, 0)
4209 return OPVCC(31, 104, 1, 1)
4211 return OPVCC(31, 124, 0, 0)
4213 return OPVCC(31, 124, 0, 1)
4215 return OPVCC(31, 444, 0, 0)
4217 return OPVCC(31, 444, 0, 1)
4219 return OPVCC(31, 412, 0, 0)
4221 return OPVCC(31, 412, 0, 1)
4224 return OPVCC(31, 506, 0, 0) /* popcntd - v2.06 */
4226 return OPVCC(31, 378, 0, 0) /* popcntw - v2.06 */
4228 return OPVCC(31, 122, 0, 0) /* popcntb - v2.02 */
4230 return OPVCC(31, 538, 0, 0) /* cnttzw - v3.00 */
4232 return OPVCC(31, 538, 0, 1) /* cnttzw. - v3.00 */
4234 return OPVCC(31, 570, 0, 0) /* cnttzd - v3.00 */
4236 return OPVCC(31, 570, 0, 1) /* cnttzd. - v3.00 */
4239 return OPVCC(19, 50, 0, 0)
4241 return OPVCC(19, 51, 0, 0)
4243 return OPVCC(19, 18, 0, 0)
4245 return OPVCC(19, 274, 0, 0)
4248 return OPVCC(20, 0, 0, 0)
4250 return OPVCC(20, 0, 0, 1)
4252 return OPVCC(23, 0, 0, 0)
4254 return OPVCC(23, 0, 0, 1)
4257 return OPVCC(30, 8, 0, 0)
4259 return OPVCC(30, 0, 0, 1)
4262 return OPVCC(30, 9, 0, 0)
4264 return OPVCC(30, 9, 0, 1)
4267 return OPVCC(30, 0, 0, 0)
4269 return OPVCC(30, 0, 0, 1)
4271 return OPVCC(30, 0, 0, 0) | 2<<1 // rldicr
4273 return OPVCC(30, 0, 0, 1) | 2<<1 // rldicr.
4276 return OPVCC(17, 1, 0, 0)
4279 return OPVCC(31, 24, 0, 0)
4281 return OPVCC(31, 24, 0, 1)
4283 return OPVCC(31, 27, 0, 0)
4285 return OPVCC(31, 27, 0, 1)
4288 return OPVCC(31, 792, 0, 0)
4290 return OPVCC(31, 792, 0, 1)
4292 return OPVCC(31, 794, 0, 0)
4294 return OPVCC(31, 794, 0, 1)
4297 return OPVCC(31, 536, 0, 0)
4299 return OPVCC(31, 536, 0, 1)
4301 return OPVCC(31, 539, 0, 0)
4303 return OPVCC(31, 539, 0, 1)
4306 return OPVCC(31, 40, 0, 0)
4308 return OPVCC(31, 40, 0, 1)
4310 return OPVCC(31, 40, 1, 0)
4312 return OPVCC(31, 40, 1, 1)
4314 return OPVCC(31, 8, 0, 0)
4316 return OPVCC(31, 8, 0, 1)
4318 return OPVCC(31, 8, 1, 0)
4320 return OPVCC(31, 8, 1, 1)
4322 return OPVCC(31, 136, 0, 0)
4324 return OPVCC(31, 136, 0, 1)
4326 return OPVCC(31, 136, 1, 0)
4328 return OPVCC(31, 136, 1, 1)
4330 return OPVCC(31, 232, 0, 0)
4332 return OPVCC(31, 232, 0, 1)
4334 return OPVCC(31, 232, 1, 0)
4336 return OPVCC(31, 232, 1, 1)
4338 return OPVCC(31, 200, 0, 0)
4340 return OPVCC(31, 200, 0, 1)
4342 return OPVCC(31, 200, 1, 0)
4344 return OPVCC(31, 200, 1, 1)
4347 return OPVCC(31, 598, 0, 0)
4349 return OPVCC(31, 598, 0, 0) | 1<<21
4352 return OPVCC(31, 598, 0, 0) | 2<<21
4355 return OPVCC(31, 306, 0, 0)
4357 return OPVCC(31, 274, 0, 0)
4359 return OPVCC(31, 566, 0, 0)
4361 return OPVCC(31, 498, 0, 0)
4363 return OPVCC(31, 434, 0, 0)
4365 return OPVCC(31, 915, 0, 0)
4367 return OPVCC(31, 851, 0, 0)
4369 return OPVCC(31, 402, 0, 0)
4372 return OPVCC(31, 4, 0, 0)
4374 return OPVCC(31, 68, 0, 0)
4376 /* Vector (VMX/Altivec) instructions */
4377 /* ISA 2.03 enables these for PPC970. For POWERx processors, these */
4378 /* are enabled starting at POWER6 (ISA 2.05). */
4380 return OPVX(4, 1028, 0, 0) /* vand - v2.03 */
4382 return OPVX(4, 1092, 0, 0) /* vandc - v2.03 */
4384 return OPVX(4, 1412, 0, 0) /* vnand - v2.07 */
4387 return OPVX(4, 1156, 0, 0) /* vor - v2.03 */
4389 return OPVX(4, 1348, 0, 0) /* vorc - v2.07 */
4391 return OPVX(4, 1284, 0, 0) /* vnor - v2.03 */
4393 return OPVX(4, 1220, 0, 0) /* vxor - v2.03 */
4395 return OPVX(4, 1668, 0, 0) /* veqv - v2.07 */
4398 return OPVX(4, 0, 0, 0) /* vaddubm - v2.03 */
4400 return OPVX(4, 64, 0, 0) /* vadduhm - v2.03 */
4402 return OPVX(4, 128, 0, 0) /* vadduwm - v2.03 */
4404 return OPVX(4, 192, 0, 0) /* vaddudm - v2.07 */
4406 return OPVX(4, 256, 0, 0) /* vadduqm - v2.07 */
4409 return OPVX(4, 320, 0, 0) /* vaddcuq - v2.07 */
4411 return OPVX(4, 384, 0, 0) /* vaddcuw - v2.03 */
4414 return OPVX(4, 512, 0, 0) /* vaddubs - v2.03 */
4416 return OPVX(4, 576, 0, 0) /* vadduhs - v2.03 */
4418 return OPVX(4, 640, 0, 0) /* vadduws - v2.03 */
4421 return OPVX(4, 768, 0, 0) /* vaddsbs - v2.03 */
4423 return OPVX(4, 832, 0, 0) /* vaddshs - v2.03 */
4425 return OPVX(4, 896, 0, 0) /* vaddsws - v2.03 */
4428 return OPVX(4, 60, 0, 0) /* vaddeuqm - v2.07 */
4430 return OPVX(4, 61, 0, 0) /* vaddecuq - v2.07 */
4433 return OPVX(4, 776, 0, 0) /* vmulesb - v2.03 */
4435 return OPVX(4, 264, 0, 0) /* vmulosb - v2.03 */
4437 return OPVX(4, 520, 0, 0) /* vmuleub - v2.03 */
4439 return OPVX(4, 8, 0, 0) /* vmuloub - v2.03 */
4441 return OPVX(4, 840, 0, 0) /* vmulesh - v2.03 */
4443 return OPVX(4, 328, 0, 0) /* vmulosh - v2.03 */
4445 return OPVX(4, 584, 0, 0) /* vmuleuh - v2.03 */
4447 return OPVX(4, 72, 0, 0) /* vmulouh - v2.03 */
4449 return OPVX(4, 904, 0, 0) /* vmulesw - v2.07 */
4451 return OPVX(4, 392, 0, 0) /* vmulosw - v2.07 */
4453 return OPVX(4, 648, 0, 0) /* vmuleuw - v2.07 */
4455 return OPVX(4, 136, 0, 0) /* vmulouw - v2.07 */
4457 return OPVX(4, 137, 0, 0) /* vmuluwm - v2.07 */
4460 return OPVX(4, 1032, 0, 0) /* vpmsumb - v2.07 */
4462 return OPVX(4, 1096, 0, 0) /* vpmsumh - v2.07 */
4464 return OPVX(4, 1160, 0, 0) /* vpmsumw - v2.07 */
4466 return OPVX(4, 1224, 0, 0) /* vpmsumd - v2.07 */
4469 return OPVX(4, 35, 0, 0) /* vmsumudm - v3.00b */
4472 return OPVX(4, 1024, 0, 0) /* vsububm - v2.03 */
4474 return OPVX(4, 1088, 0, 0) /* vsubuhm - v2.03 */
4476 return OPVX(4, 1152, 0, 0) /* vsubuwm - v2.03 */
4478 return OPVX(4, 1216, 0, 0) /* vsubudm - v2.07 */
4480 return OPVX(4, 1280, 0, 0) /* vsubuqm - v2.07 */
4483 return OPVX(4, 1344, 0, 0) /* vsubcuq - v2.07 */
4485 return OPVX(4, 1408, 0, 0) /* vsubcuw - v2.03 */
4488 return OPVX(4, 1536, 0, 0) /* vsububs - v2.03 */
4490 return OPVX(4, 1600, 0, 0) /* vsubuhs - v2.03 */
4492 return OPVX(4, 1664, 0, 0) /* vsubuws - v2.03 */
4495 return OPVX(4, 1792, 0, 0) /* vsubsbs - v2.03 */
4497 return OPVX(4, 1856, 0, 0) /* vsubshs - v2.03 */
4499 return OPVX(4, 1920, 0, 0) /* vsubsws - v2.03 */
4502 return OPVX(4, 62, 0, 0) /* vsubeuqm - v2.07 */
4504 return OPVX(4, 63, 0, 0) /* vsubecuq - v2.07 */
4507 return OPVX(4, 4, 0, 0) /* vrlb - v2.03 */
4509 return OPVX(4, 68, 0, 0) /* vrlh - v2.03 */
4511 return OPVX(4, 132, 0, 0) /* vrlw - v2.03 */
4513 return OPVX(4, 196, 0, 0) /* vrld - v2.07 */
4516 return OPVX(4, 1676, 0, 0) /* vmrgow - v2.07 */
4518 return OPVX(4, 1932, 0, 0) /* vmrgew - v2.07 */
4521 return OPVX(4, 260, 0, 0) /* vslh - v2.03 */
4523 return OPVX(4, 324, 0, 0) /* vslh - v2.03 */
4525 return OPVX(4, 388, 0, 0) /* vslw - v2.03 */
4527 return OPVX(4, 452, 0, 0) /* vsl - v2.03 */
4529 return OPVX(4, 1036, 0, 0) /* vsl - v2.03 */
4531 return OPVX(4, 516, 0, 0) /* vsrb - v2.03 */
4533 return OPVX(4, 580, 0, 0) /* vsrh - v2.03 */
4535 return OPVX(4, 644, 0, 0) /* vsrw - v2.03 */
4537 return OPVX(4, 708, 0, 0) /* vsr - v2.03 */
4539 return OPVX(4, 1100, 0, 0) /* vsro - v2.03 */
4541 return OPVX(4, 1476, 0, 0) /* vsld - v2.07 */
4543 return OPVX(4, 1732, 0, 0) /* vsrd - v2.07 */
4546 return OPVX(4, 772, 0, 0) /* vsrab - v2.03 */
4548 return OPVX(4, 836, 0, 0) /* vsrah - v2.03 */
4550 return OPVX(4, 900, 0, 0) /* vsraw - v2.03 */
4552 return OPVX(4, 964, 0, 0) /* vsrad - v2.07 */
4555 return OPVC(4, 1356, 0, 0) /* vbpermq - v2.07 */
4557 return OPVC(4, 1484, 0, 0) /* vbpermd - v3.00 */
4560 return OPVX(4, 1794, 0, 0) /* vclzb - v2.07 */
4562 return OPVX(4, 1858, 0, 0) /* vclzh - v2.07 */
4564 return OPVX(4, 1922, 0, 0) /* vclzw - v2.07 */
4566 return OPVX(4, 1986, 0, 0) /* vclzd - v2.07 */
4569 return OPVX(4, 1795, 0, 0) /* vpopcntb - v2.07 */
4571 return OPVX(4, 1859, 0, 0) /* vpopcnth - v2.07 */
4573 return OPVX(4, 1923, 0, 0) /* vpopcntw - v2.07 */
4575 return OPVX(4, 1987, 0, 0) /* vpopcntd - v2.07 */
4578 return OPVC(4, 6, 0, 0) /* vcmpequb - v2.03 */
4580 return OPVC(4, 6, 0, 1) /* vcmpequb. - v2.03 */
4582 return OPVC(4, 70, 0, 0) /* vcmpequh - v2.03 */
4584 return OPVC(4, 70, 0, 1) /* vcmpequh. - v2.03 */
4586 return OPVC(4, 134, 0, 0) /* vcmpequw - v2.03 */
4588 return OPVC(4, 134, 0, 1) /* vcmpequw. - v2.03 */
4590 return OPVC(4, 199, 0, 0) /* vcmpequd - v2.07 */
4592 return OPVC(4, 199, 0, 1) /* vcmpequd. - v2.07 */
4595 return OPVC(4, 518, 0, 0) /* vcmpgtub - v2.03 */
4597 return OPVC(4, 518, 0, 1) /* vcmpgtub. - v2.03 */
4599 return OPVC(4, 582, 0, 0) /* vcmpgtuh - v2.03 */
4601 return OPVC(4, 582, 0, 1) /* vcmpgtuh. - v2.03 */
4603 return OPVC(4, 646, 0, 0) /* vcmpgtuw - v2.03 */
4605 return OPVC(4, 646, 0, 1) /* vcmpgtuw. - v2.03 */
4607 return OPVC(4, 711, 0, 0) /* vcmpgtud - v2.07 */
4609 return OPVC(4, 711, 0, 1) /* vcmpgtud. v2.07 */
4611 return OPVC(4, 774, 0, 0) /* vcmpgtsb - v2.03 */
4613 return OPVC(4, 774, 0, 1) /* vcmpgtsb. - v2.03 */
4615 return OPVC(4, 838, 0, 0) /* vcmpgtsh - v2.03 */
4617 return OPVC(4, 838, 0, 1) /* vcmpgtsh. - v2.03 */
4619 return OPVC(4, 902, 0, 0) /* vcmpgtsw - v2.03 */
4621 return OPVC(4, 902, 0, 1) /* vcmpgtsw. - v2.03 */
4623 return OPVC(4, 967, 0, 0) /* vcmpgtsd - v2.07 */
4625 return OPVC(4, 967, 0, 1) /* vcmpgtsd. - v2.07 */
4628 return OPVC(4, 263, 0, 0) /* vcmpnezb - v3.00 */
4630 return OPVC(4, 263, 0, 1) /* vcmpnezb. - v3.00 */
4632 return OPVC(4, 7, 0, 0) /* vcmpneb - v3.00 */
4634 return OPVC(4, 7, 0, 1) /* vcmpneb. - v3.00 */
4636 return OPVC(4, 71, 0, 0) /* vcmpneh - v3.00 */
4638 return OPVC(4, 71, 0, 1) /* vcmpneh. - v3.00 */
4640 return OPVC(4, 135, 0, 0) /* vcmpnew - v3.00 */
4642 return OPVC(4, 135, 0, 1) /* vcmpnew. - v3.00 */
4645 return OPVX(4, 43, 0, 0) /* vperm - v2.03 */
4647 return OPVX(4, 45, 0, 0) /* vpermxor - v2.03 */
4649 return OPVX(4, 59, 0, 0) /* vpermr - v3.0 */
4652 return OPVX(4, 42, 0, 0) /* vsel - v2.03 */
4655 return OPVX(4, 1288, 0, 0) /* vcipher - v2.07 */
4657 return OPVX(4, 1289, 0, 0) /* vcipherlast - v2.07 */
4659 return OPVX(4, 1352, 0, 0) /* vncipher - v2.07 */
4661 return OPVX(4, 1353, 0, 0) /* vncipherlast - v2.07 */
4663 return OPVX(4, 1480, 0, 0) /* vsbox - v2.07 */
4664 /* End of vector instructions */
4666 /* Vector scalar (VSX) instructions */
4667 /* ISA 2.06 enables these for POWER7. */
4668 case AMFVSRD, AMFVRD, AMFFPRD:
4669 return OPVXX1(31, 51, 0) /* mfvsrd - v2.07 */
4671 return OPVXX1(31, 115, 0) /* mfvsrwz - v2.07 */
4673 return OPVXX1(31, 307, 0) /* mfvsrld - v3.00 */
4675 case AMTVSRD, AMTFPRD, AMTVRD:
4676 return OPVXX1(31, 179, 0) /* mtvsrd - v2.07 */
4678 return OPVXX1(31, 211, 0) /* mtvsrwa - v2.07 */
4680 return OPVXX1(31, 243, 0) /* mtvsrwz - v2.07 */
4682 return OPVXX1(31, 435, 0) /* mtvsrdd - v3.00 */
4684 return OPVXX1(31, 403, 0) /* mtvsrws - v3.00 */
4687 return OPVXX3(60, 130, 0) /* xxland - v2.06 */
4689 return OPVXX3(60, 138, 0) /* xxlandc - v2.06 */
4691 return OPVXX3(60, 186, 0) /* xxleqv - v2.07 */
4693 return OPVXX3(60, 178, 0) /* xxlnand - v2.07 */
4696 return OPVXX3(60, 170, 0) /* xxlorc - v2.07 */
4698 return OPVXX3(60, 162, 0) /* xxlnor - v2.06 */
4699 case AXXLOR, AXXLORQ:
4700 return OPVXX3(60, 146, 0) /* xxlor - v2.06 */
4702 return OPVXX3(60, 154, 0) /* xxlxor - v2.06 */
4705 return OPVXX4(60, 3, 0) /* xxsel - v2.06 */
4708 return OPVXX3(60, 18, 0) /* xxmrghw - v2.06 */
4710 return OPVXX3(60, 50, 0) /* xxmrglw - v2.06 */
4713 return OPVXX2(60, 164, 0) /* xxspltw - v2.06 */
4716 return OPVCC(60, 360, 0, 0) /* xxspltib - v3.0 */
4719 return OPVXX3(60, 26, 0) /* xxperm - v2.06 */
4721 return OPVXX3(60, 10, 0) /* xxpermdi - v2.06 */
4724 return OPVXX3(60, 2, 0) /* xxsldwi - v2.06 */
4727 return OPVXX2VA(60, 475, 31) /* xxbrq - v3.0 */
4729 return OPVXX2VA(60, 475, 23) /* xxbrd - v3.0 */
4731 return OPVXX2VA(60, 475, 15) /* xxbrw - v3.0 */
4733 return OPVXX2VA(60, 475, 7) /* xxbrh - v3.0 */
4736 return OPVXX2(60, 265, 0) /* xscvdpsp - v2.06 */
4738 return OPVXX2(60, 329, 0) /* xscvspdp - v2.06 */
4740 return OPVXX2(60, 267, 0) /* xscvdpspn - v2.07 */
4742 return OPVXX2(60, 331, 0) /* xscvspdpn - v2.07 */
4745 return OPVXX2(60, 393, 0) /* xvcvdpsp - v2.06 */
4747 return OPVXX2(60, 457, 0) /* xvcvspdp - v2.06 */
4750 return OPVXX2(60, 344, 0) /* xscvdpsxds - v2.06 */
4752 return OPVXX2(60, 88, 0) /* xscvdpsxws - v2.06 */
4754 return OPVXX2(60, 328, 0) /* xscvdpuxds - v2.06 */
4756 return OPVXX2(60, 72, 0) /* xscvdpuxws - v2.06 */
4759 return OPVXX2(60, 376, 0) /* xscvsxddp - v2.06 */
4761 return OPVXX2(60, 360, 0) /* xscvuxddp - v2.06 */
4763 return OPVXX2(60, 312, 0) /* xscvsxdsp - v2.06 */
4765 return OPVXX2(60, 296, 0) /* xscvuxdsp - v2.06 */
4768 return OPVXX2(60, 472, 0) /* xvcvdpsxds - v2.06 */
4770 return OPVXX2(60, 216, 0) /* xvcvdpsxws - v2.06 */
4772 return OPVXX2(60, 456, 0) /* xvcvdpuxds - v2.06 */
4774 return OPVXX2(60, 200, 0) /* xvcvdpuxws - v2.06 */
4776 return OPVXX2(60, 408, 0) /* xvcvspsxds - v2.07 */
4778 return OPVXX2(60, 152, 0) /* xvcvspsxws - v2.07 */
4780 return OPVXX2(60, 392, 0) /* xvcvspuxds - v2.07 */
4782 return OPVXX2(60, 136, 0) /* xvcvspuxws - v2.07 */
4785 return OPVXX2(60, 504, 0) /* xvcvsxddp - v2.06 */
4787 return OPVXX2(60, 248, 0) /* xvcvsxwdp - v2.06 */
4789 return OPVXX2(60, 488, 0) /* xvcvuxddp - v2.06 */
4791 return OPVXX2(60, 232, 0) /* xvcvuxwdp - v2.06 */
4793 return OPVXX2(60, 440, 0) /* xvcvsxdsp - v2.06 */
4795 return OPVXX2(60, 184, 0) /* xvcvsxwsp - v2.06 */
4797 return OPVXX2(60, 424, 0) /* xvcvuxdsp - v2.06 */
4799 return OPVXX2(60, 168, 0) /* xvcvuxwsp - v2.06 */
4800 /* End of VSX instructions */
4803 return OPVX(4, 48, 0, 0) /* maddhd - v3.00 */
4805 return OPVX(4, 49, 0, 0) /* maddhdu - v3.00 */
4807 return OPVX(4, 51, 0, 0) /* maddld - v3.00 */
4810 return OPVCC(31, 316, 0, 0)
4812 return OPVCC(31, 316, 0, 1)
4815 c.ctxt.Diag("bad r/r, r/r/r or r/r/r/r opcode %v", a)
4819 func (c *ctxt9) opirrr(a obj.As) uint32 {
4821 /* Vector (VMX/Altivec) instructions */
4822 /* ISA 2.03 enables these for PPC970. For POWERx processors, these */
4823 /* are enabled starting at POWER6 (ISA 2.05). */
4825 return OPVX(4, 44, 0, 0) /* vsldoi - v2.03 */
4828 c.ctxt.Diag("bad i/r/r/r opcode %v", a)
4832 func (c *ctxt9) opiirr(a obj.As) uint32 {
4834 /* Vector (VMX/Altivec) instructions */
4835 /* ISA 2.07 enables these for POWER8 and beyond. */
4837 return OPVX(4, 1666, 0, 0) /* vshasigmaw - v2.07 */
4839 return OPVX(4, 1730, 0, 0) /* vshasigmad - v2.07 */
4842 c.ctxt.Diag("bad i/i/r/r opcode %v", a)
4846 func (c *ctxt9) opirr(a obj.As) uint32 {
4849 return OPVCC(14, 0, 0, 0)
4851 return OPVCC(12, 0, 0, 0)
4853 return OPVCC(13, 0, 0, 0)
4855 return OPVCC(15, 0, 0, 0) /* ADDIS */
4858 return OPVCC(28, 0, 0, 0)
4860 return OPVCC(29, 0, 0, 0) /* ANDIS. */
4863 return OPVCC(18, 0, 0, 0)
4865 return OPVCC(18, 0, 0, 0) | 1
4867 return OPVCC(18, 0, 0, 0) | 1
4869 return OPVCC(18, 0, 0, 0) | 1
4871 return OPVCC(16, 0, 0, 0)
4873 return OPVCC(16, 0, 0, 0) | 1
4876 return AOP_RRR(16<<26, 12, 2, 0)
4878 return AOP_RRR(16<<26, 4, 0, 0)
4880 return AOP_RRR(16<<26, 12, 1, 0)
4882 return AOP_RRR(16<<26, 4, 1, 0)
4884 return AOP_RRR(16<<26, 12, 0, 0)
4886 return AOP_RRR(16<<26, 4, 2, 0)
4888 return AOP_RRR(16<<26, 4, 3, 0) // apparently unordered-clear
4890 return AOP_RRR(16<<26, 12, 3, 0) // apparently unordered-set
4893 return OPVCC(11, 0, 0, 0) | 1<<21 /* L=1 */
4895 return OPVCC(10, 0, 0, 0) | 1<<21
4897 return OPVCC(11, 0, 0, 0) /* L=0 */
4899 return OPVCC(10, 0, 0, 0)
4901 return OPVCC(31, 224, 0, 0) /* cmpeqb - v3.00 */
4904 return OPVCC(31, 597, 0, 0)
4907 return OPVCC(31, 774, 0, 0) /* copy - v3.00 */
4909 return OPVCC(31, 902, 0, 1) /* paste. - v3.00 */
4911 return OPVCC(31, 755, 0, 0) /* darn - v3.00 */
4914 return OPVCC(7, 0, 0, 0)
4917 return OPVCC(24, 0, 0, 0)
4919 return OPVCC(25, 0, 0, 0) /* ORIS */
4922 return OPVCC(20, 0, 0, 0) /* rlwimi */
4924 return OPVCC(20, 0, 0, 1)
4926 return OPVCC(30, 0, 0, 0) | 3<<2 /* rldimi */
4928 return OPVCC(30, 0, 0, 1) | 3<<2
4930 return OPVCC(30, 0, 0, 0) | 3<<2 /* rldimi */
4932 return OPVCC(30, 0, 0, 1) | 3<<2
4934 return OPVCC(21, 0, 0, 0) /* rlwinm */
4936 return OPVCC(21, 0, 0, 1)
4939 return OPVCC(30, 0, 0, 0) /* rldicl */
4941 return OPVCC(30, 0, 0, 1)
4943 return OPVCC(30, 1, 0, 0) /* rldicr */
4945 return OPVCC(30, 1, 0, 1)
4947 return OPVCC(30, 0, 0, 0) | 2<<2
4949 return OPVCC(30, 0, 0, 1) | 2<<2
4952 return OPVCC(31, 824, 0, 0)
4954 return OPVCC(31, 824, 0, 1)
4956 return OPVCC(31, (413 << 1), 0, 0)
4958 return OPVCC(31, (413 << 1), 0, 1)
4961 return OPVCC(31, 725, 0, 0)
4964 return OPVCC(8, 0, 0, 0)
4967 return OPVCC(3, 0, 0, 0)
4969 return OPVCC(2, 0, 0, 0)
4971 /* Vector (VMX/Altivec) instructions */
4972 /* ISA 2.03 enables these for PPC970. For POWERx processors, these */
4973 /* are enabled starting at POWER6 (ISA 2.05). */
4975 return OPVX(4, 524, 0, 0) /* vspltb - v2.03 */
4977 return OPVX(4, 588, 0, 0) /* vsplth - v2.03 */
4979 return OPVX(4, 652, 0, 0) /* vspltw - v2.03 */
4982 return OPVX(4, 780, 0, 0) /* vspltisb - v2.03 */
4984 return OPVX(4, 844, 0, 0) /* vspltish - v2.03 */
4986 return OPVX(4, 908, 0, 0) /* vspltisw - v2.03 */
4987 /* End of vector instructions */
4990 return OPVCC(63, 128, 0, 0) /* ftdiv - v2.06 */
4992 return OPVCC(63, 160, 0, 0) /* ftsqrt - v2.06 */
4995 return OPVCC(26, 0, 0, 0) /* XORIL */
4997 return OPVCC(27, 0, 0, 0) /* XORIS */
5000 c.ctxt.Diag("bad opcode i/r or i/r/r %v", a)
5007 func (c *ctxt9) opload(a obj.As) uint32 {
5010 return OPVCC(58, 0, 0, 0) /* ld */
5012 return OPVCC(58, 0, 0, 1) /* ldu */
5014 return OPVCC(32, 0, 0, 0) /* lwz */
5016 return OPVCC(33, 0, 0, 0) /* lwzu */
5018 return OPVCC(58, 0, 0, 0) | 1<<1 /* lwa */
5020 return OPDQ(61, 1, 0) /* lxv - ISA v3.00 */
5022 return OPVXX1(31, 269, 0) /* lxvl - ISA v3.00 */
5024 return OPVXX1(31, 301, 0) /* lxvll - ISA v3.00 */
5028 return OPVCC(34, 0, 0, 0)
5031 case AMOVBU, AMOVBZU:
5032 return OPVCC(35, 0, 0, 0)
5034 return OPVCC(50, 0, 0, 0)
5036 return OPVCC(51, 0, 0, 0)
5038 return OPVCC(48, 0, 0, 0)
5040 return OPVCC(49, 0, 0, 0)
5042 return OPVCC(42, 0, 0, 0)
5044 return OPVCC(43, 0, 0, 0)
5046 return OPVCC(40, 0, 0, 0)
5048 return OPVCC(41, 0, 0, 0)
5050 return OPVCC(46, 0, 0, 0) /* lmw */
5053 c.ctxt.Diag("bad load opcode %v", a)
5058 * indexed load a(b),d
5060 func (c *ctxt9) oploadx(a obj.As) uint32 {
5063 return OPVCC(31, 23, 0, 0) /* lwzx */
5065 return OPVCC(31, 55, 0, 0) /* lwzux */
5067 return OPVCC(31, 341, 0, 0) /* lwax */
5069 return OPVCC(31, 373, 0, 0) /* lwaux */
5072 return OPVCC(31, 87, 0, 0) /* lbzx */
5074 case AMOVBU, AMOVBZU:
5075 return OPVCC(31, 119, 0, 0) /* lbzux */
5077 return OPVCC(31, 599, 0, 0) /* lfdx */
5079 return OPVCC(31, 631, 0, 0) /* lfdux */
5081 return OPVCC(31, 535, 0, 0) /* lfsx */
5083 return OPVCC(31, 567, 0, 0) /* lfsux */
5085 return OPVCC(31, 855, 0, 0) /* lfiwax - power6, isa 2.05 */
5087 return OPVCC(31, 887, 0, 0) /* lfiwzx - power7, isa 2.06 */
5089 return OPVCC(31, 343, 0, 0) /* lhax */
5091 return OPVCC(31, 375, 0, 0) /* lhaux */
5093 return OPVCC(31, 790, 0, 0) /* lhbrx */
5095 return OPVCC(31, 534, 0, 0) /* lwbrx */
5097 return OPVCC(31, 532, 0, 0) /* ldbrx */
5099 return OPVCC(31, 279, 0, 0) /* lhzx */
5101 return OPVCC(31, 311, 0, 0) /* lhzux */
5103 return OPVCC(31, 310, 0, 0) /* eciwx */
5105 return OPVCC(31, 52, 0, 0) /* lbarx */
5107 return OPVCC(31, 116, 0, 0) /* lharx */
5109 return OPVCC(31, 20, 0, 0) /* lwarx */
5111 return OPVCC(31, 84, 0, 0) /* ldarx */
5113 return OPVCC(31, 533, 0, 0) /* lswx */
5115 return OPVCC(31, 21, 0, 0) /* ldx */
5117 return OPVCC(31, 53, 0, 0) /* ldux */
5119 return OPVCC(31, 309, 0, 0) /* ldmx */
5121 /* Vector (VMX/Altivec) instructions */
5122 /* ISA 2.03 enables these for PPC970. For POWERx processors, these */
5123 /* are enabled starting at POWER6 (ISA 2.05). */
5125 return OPVCC(31, 7, 0, 0) /* lvebx - v2.03 */
5127 return OPVCC(31, 39, 0, 0) /* lvehx - v2.03 */
5129 return OPVCC(31, 71, 0, 0) /* lvewx - v2.03 */
5131 return OPVCC(31, 103, 0, 0) /* lvx - v2.03 */
5133 return OPVCC(31, 359, 0, 0) /* lvxl - v2.03 */
5135 return OPVCC(31, 6, 0, 0) /* lvsl - v2.03 */
5137 return OPVCC(31, 38, 0, 0) /* lvsr - v2.03 */
5138 /* End of vector instructions */
5140 /* Vector scalar (VSX) instructions */
5141 /* ISA 2.06 enables these for POWER7. */
5143 return OPVXX1(31, 844, 0) /* lxvd2x - v2.06 */
5145 return OPVXX1(31, 780, 0) /* lxvw4x - v2.06 */
5147 return OPVXX1(31, 812, 0) /* lxvh8x - v3.00 */
5149 return OPVXX1(31, 876, 0) /* lxvb16x - v3.00 */
5151 return OPVXX1(31, 332, 0) /* lxvdsx - v2.06 */
5153 return OPVXX1(31, 588, 0) /* lxsdx - v2.06 */
5155 return OPVXX1(31, 76, 0) /* lxsiwax - v2.07 */
5157 return OPVXX1(31, 12, 0) /* lxsiwzx - v2.07 */
5160 c.ctxt.Diag("bad loadx opcode %v", a)
5167 func (c *ctxt9) opstore(a obj.As) uint32 {
5170 return OPVCC(38, 0, 0, 0) /* stb */
5172 case AMOVBU, AMOVBZU:
5173 return OPVCC(39, 0, 0, 0) /* stbu */
5175 return OPVCC(54, 0, 0, 0) /* stfd */
5177 return OPVCC(55, 0, 0, 0) /* stfdu */
5179 return OPVCC(52, 0, 0, 0) /* stfs */
5181 return OPVCC(53, 0, 0, 0) /* stfsu */
5184 return OPVCC(44, 0, 0, 0) /* sth */
5186 case AMOVHZU, AMOVHU:
5187 return OPVCC(45, 0, 0, 0) /* sthu */
5189 return OPVCC(47, 0, 0, 0) /* stmw */
5191 return OPVCC(31, 725, 0, 0) /* stswi */
5194 return OPVCC(36, 0, 0, 0) /* stw */
5196 case AMOVWZU, AMOVWU:
5197 return OPVCC(37, 0, 0, 0) /* stwu */
5199 return OPVCC(62, 0, 0, 0) /* std */
5201 return OPVCC(62, 0, 0, 1) /* stdu */
5203 return OPDQ(61, 5, 0) /* stxv ISA 3.0 */
5205 return OPVXX1(31, 397, 0) /* stxvl ISA 3.0 */
5207 return OPVXX1(31, 429, 0) /* stxvll ISA 3.0 */
5211 c.ctxt.Diag("unknown store opcode %v", a)
5216 * indexed store s,a(b)
5218 func (c *ctxt9) opstorex(a obj.As) uint32 {
5221 return OPVCC(31, 215, 0, 0) /* stbx */
5223 case AMOVBU, AMOVBZU:
5224 return OPVCC(31, 247, 0, 0) /* stbux */
5226 return OPVCC(31, 727, 0, 0) /* stfdx */
5228 return OPVCC(31, 759, 0, 0) /* stfdux */
5230 return OPVCC(31, 663, 0, 0) /* stfsx */
5232 return OPVCC(31, 695, 0, 0) /* stfsux */
5234 return OPVCC(31, 983, 0, 0) /* stfiwx */
5237 return OPVCC(31, 407, 0, 0) /* sthx */
5239 return OPVCC(31, 918, 0, 0) /* sthbrx */
5241 case AMOVHZU, AMOVHU:
5242 return OPVCC(31, 439, 0, 0) /* sthux */
5245 return OPVCC(31, 151, 0, 0) /* stwx */
5247 case AMOVWZU, AMOVWU:
5248 return OPVCC(31, 183, 0, 0) /* stwux */
5250 return OPVCC(31, 661, 0, 0) /* stswx */
5252 return OPVCC(31, 662, 0, 0) /* stwbrx */
5254 return OPVCC(31, 660, 0, 0) /* stdbrx */
5256 return OPVCC(31, 694, 0, 1) /* stbcx. */
5258 return OPVCC(31, 726, 0, 1) /* sthcx. */
5260 return OPVCC(31, 150, 0, 1) /* stwcx. */
5262 return OPVCC(31, 214, 0, 1) /* stwdx. */
5264 return OPVCC(31, 438, 0, 0) /* ecowx */
5266 return OPVCC(31, 149, 0, 0) /* stdx */
5268 return OPVCC(31, 181, 0, 0) /* stdux */
5270 /* Vector (VMX/Altivec) instructions */
5271 /* ISA 2.03 enables these for PPC970. For POWERx processors, these */
5272 /* are enabled starting at POWER6 (ISA 2.05). */
5274 return OPVCC(31, 135, 0, 0) /* stvebx - v2.03 */
5276 return OPVCC(31, 167, 0, 0) /* stvehx - v2.03 */
5278 return OPVCC(31, 199, 0, 0) /* stvewx - v2.03 */
5280 return OPVCC(31, 231, 0, 0) /* stvx - v2.03 */
5282 return OPVCC(31, 487, 0, 0) /* stvxl - v2.03 */
5283 /* End of vector instructions */
5285 /* Vector scalar (VSX) instructions */
5286 /* ISA 2.06 enables these for POWER7. */
5288 return OPVXX1(31, 972, 0) /* stxvd2x - v2.06 */
5290 return OPVXX1(31, 908, 0) /* stxvw4x - v2.06 */
5292 return OPVXX1(31, 940, 0) /* stxvh8x - v3.00 */
5294 return OPVXX1(31, 1004, 0) /* stxvb16x - v3.00 */
5297 return OPVXX1(31, 716, 0) /* stxsdx - v2.06 */
5300 return OPVXX1(31, 140, 0) /* stxsiwx - v2.07 */
5302 /* End of vector scalar instructions */
5306 c.ctxt.Diag("unknown storex opcode %v", a)