podman

Форк
0
5367 строк · 147.5 Кб
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
	"github.com/twitchyliquid64/golang-asm/obj"
34
	"github.com/twitchyliquid64/golang-asm/objabi"
35
	"encoding/binary"
36
	"fmt"
37
	"log"
38
	"math"
39
	"sort"
40
)
41

42
// 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
}
5368

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.