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