1
2
3
4
5 package main
6
7 import "strings"
8
9
10
11
12
13
14
15
16
17 var regNamesPPC64 = []string{
18 "R0",
19 "SP",
20 "SB",
21 "R3",
22 "R4",
23 "R5",
24 "R6",
25 "R7",
26 "R8",
27 "R9",
28 "R10",
29 "R11",
30 "R12",
31 "R13",
32 "R14",
33 "R15",
34 "R16",
35 "R17",
36 "R18",
37 "R19",
38 "R20",
39 "R21",
40 "R22",
41 "R23",
42 "R24",
43 "R25",
44 "R26",
45 "R27",
46 "R28",
47 "R29",
48 "g",
49 "R31",
50
51 "F0",
52 "F1",
53 "F2",
54 "F3",
55 "F4",
56 "F5",
57 "F6",
58 "F7",
59 "F8",
60 "F9",
61 "F10",
62 "F11",
63 "F12",
64 "F13",
65 "F14",
66 "F15",
67 "F16",
68 "F17",
69 "F18",
70 "F19",
71 "F20",
72 "F21",
73 "F22",
74 "F23",
75 "F24",
76 "F25",
77 "F26",
78 "F27",
79 "F28",
80 "F29",
81 "F30",
82
83
84 "XER",
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100 }
101
102 func init() {
103
104 if len(regNamesPPC64) > 64 {
105 panic("too many registers")
106 }
107 num := map[string]int{}
108 for i, name := range regNamesPPC64 {
109 num[name] = i
110 }
111 buildReg := func(s string) regMask {
112 m := regMask(0)
113 for _, r := range strings.Split(s, " ") {
114 if n, ok := num[r]; ok {
115 m |= regMask(1) << uint(n)
116 continue
117 }
118 panic("register " + r + " not found")
119 }
120 return m
121 }
122
123 var (
124 gp = buildReg("R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R14 R15 R16 R17 R18 R19 R20 R21 R22 R23 R24 R25 R26 R27 R28 R29")
125 fp = buildReg("F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15 F16 F17 F18 F19 F20 F21 F22 F23 F24 F25 F26 F27 F28 F29 F30")
126 sp = buildReg("SP")
127 sb = buildReg("SB")
128 gr = buildReg("g")
129 xer = buildReg("XER")
130
131
132
133 tmp = buildReg("R31")
134 ctxt = buildReg("R11")
135 callptr = buildReg("R12")
136
137 gp01 = regInfo{inputs: nil, outputs: []regMask{gp}}
138 gp11 = regInfo{inputs: []regMask{gp | sp | sb}, outputs: []regMask{gp}}
139 xergp = regInfo{inputs: []regMask{xer}, outputs: []regMask{gp}, clobbers: xer}
140 gp11cxer = regInfo{inputs: []regMask{gp | sp | sb}, outputs: []regMask{gp}, clobbers: xer}
141 gp11xer = regInfo{inputs: []regMask{gp | sp | sb}, outputs: []regMask{gp, xer}}
142 gp1xer1xer = regInfo{inputs: []regMask{gp | sp | sb, xer}, outputs: []regMask{gp, xer}, clobbers: xer}
143 gp21 = regInfo{inputs: []regMask{gp | sp | sb, gp | sp | sb}, outputs: []regMask{gp}}
144 gp21a0 = regInfo{inputs: []regMask{gp, gp | sp | sb}, outputs: []regMask{gp}}
145 gp21cxer = regInfo{inputs: []regMask{gp | sp | sb, gp | sp | sb}, outputs: []regMask{gp}, clobbers: xer}
146 gp21xer = regInfo{inputs: []regMask{gp | sp | sb, gp | sp | sb}, outputs: []regMask{gp, xer}, clobbers: xer}
147 gp2xer1xer = regInfo{inputs: []regMask{gp | sp | sb, gp | sp | sb, xer}, outputs: []regMask{gp, xer}, clobbers: xer}
148 gp31 = regInfo{inputs: []regMask{gp | sp | sb, gp | sp | sb, gp | sp | sb}, outputs: []regMask{gp}}
149 gp1cr = regInfo{inputs: []regMask{gp | sp | sb}}
150 gp2cr = regInfo{inputs: []regMask{gp | sp | sb, gp | sp | sb}}
151 crgp = regInfo{inputs: nil, outputs: []regMask{gp}}
152 crgp11 = regInfo{inputs: []regMask{gp}, outputs: []regMask{gp}}
153 crgp21 = regInfo{inputs: []regMask{gp, gp}, outputs: []regMask{gp}}
154 gpload = regInfo{inputs: []regMask{gp | sp | sb}, outputs: []regMask{gp}}
155 gploadidx = regInfo{inputs: []regMask{gp | sp | sb, gp}, outputs: []regMask{gp}}
156 prefreg = regInfo{inputs: []regMask{gp | sp | sb}}
157 gpstore = regInfo{inputs: []regMask{gp | sp | sb, gp | sp | sb}}
158 gpstoreidx = regInfo{inputs: []regMask{gp | sp | sb, gp | sp | sb, gp | sp | sb}}
159 gpstorezero = regInfo{inputs: []regMask{gp | sp | sb}}
160 gpxchg = regInfo{inputs: []regMask{gp | sp | sb, gp}, outputs: []regMask{gp}}
161 gpcas = regInfo{inputs: []regMask{gp | sp | sb, gp, gp}, outputs: []regMask{gp}}
162 fp01 = regInfo{inputs: nil, outputs: []regMask{fp}}
163 fp11 = regInfo{inputs: []regMask{fp}, outputs: []regMask{fp}}
164 fpgp = regInfo{inputs: []regMask{fp}, outputs: []regMask{gp}}
165 gpfp = regInfo{inputs: []regMask{gp}, outputs: []regMask{fp}}
166 fp21 = regInfo{inputs: []regMask{fp, fp}, outputs: []regMask{fp}}
167 fp31 = regInfo{inputs: []regMask{fp, fp, fp}, outputs: []regMask{fp}}
168 fp2cr = regInfo{inputs: []regMask{fp, fp}}
169 fpload = regInfo{inputs: []regMask{gp | sp | sb}, outputs: []regMask{fp}}
170 fploadidx = regInfo{inputs: []regMask{gp | sp | sb, gp | sp | sb}, outputs: []regMask{fp}}
171 fpstore = regInfo{inputs: []regMask{gp | sp | sb, fp}}
172 fpstoreidx = regInfo{inputs: []regMask{gp | sp | sb, gp | sp | sb, fp}}
173 callerSave = regMask(gp | fp | gr | xer)
174 r3 = buildReg("R3")
175 r4 = buildReg("R4")
176 r5 = buildReg("R5")
177 r6 = buildReg("R6")
178 )
179 ops := []opData{
180 {name: "ADD", argLength: 2, reg: gp21, asm: "ADD", commutative: true},
181 {name: "ADDCC", argLength: 2, reg: gp21, asm: "ADDCC", commutative: true, typ: "(Int,Flags)"},
182 {name: "ADDconst", argLength: 1, reg: gp11, asm: "ADD", aux: "Int64"},
183 {name: "ADDCCconst", argLength: 1, reg: gp11cxer, asm: "ADDCCC", aux: "Int64", typ: "(Int,Flags)"},
184 {name: "FADD", argLength: 2, reg: fp21, asm: "FADD", commutative: true},
185 {name: "FADDS", argLength: 2, reg: fp21, asm: "FADDS", commutative: true},
186 {name: "SUB", argLength: 2, reg: gp21, asm: "SUB"},
187 {name: "SUBCC", argLength: 2, reg: gp21, asm: "SUBCC", typ: "(Int,Flags)"},
188 {name: "SUBFCconst", argLength: 1, reg: gp11cxer, asm: "SUBC", aux: "Int64"},
189 {name: "FSUB", argLength: 2, reg: fp21, asm: "FSUB"},
190 {name: "FSUBS", argLength: 2, reg: fp21, asm: "FSUBS"},
191
192
193 {name: "XSMINJDP", argLength: 2, reg: fp21, asm: "XSMINJDP"},
194 {name: "XSMAXJDP", argLength: 2, reg: fp21, asm: "XSMAXJDP"},
195
196 {name: "MULLD", argLength: 2, reg: gp21, asm: "MULLD", typ: "Int64", commutative: true},
197 {name: "MULLW", argLength: 2, reg: gp21, asm: "MULLW", typ: "Int32", commutative: true},
198 {name: "MULLDconst", argLength: 1, reg: gp11, asm: "MULLD", aux: "Int32", typ: "Int64"},
199 {name: "MULLWconst", argLength: 1, reg: gp11, asm: "MULLW", aux: "Int32", typ: "Int64"},
200 {name: "MADDLD", argLength: 3, reg: gp31, asm: "MADDLD", typ: "Int64"},
201
202 {name: "MULHD", argLength: 2, reg: gp21, asm: "MULHD", commutative: true},
203 {name: "MULHW", argLength: 2, reg: gp21, asm: "MULHW", commutative: true},
204 {name: "MULHDU", argLength: 2, reg: gp21, asm: "MULHDU", commutative: true},
205 {name: "MULHDUCC", argLength: 2, reg: gp21, asm: "MULHDUCC", commutative: true, typ: "(Int64,Flags)"},
206 {name: "MULHWU", argLength: 2, reg: gp21, asm: "MULHWU", commutative: true},
207
208 {name: "FMUL", argLength: 2, reg: fp21, asm: "FMUL", commutative: true},
209 {name: "FMULS", argLength: 2, reg: fp21, asm: "FMULS", commutative: true},
210
211 {name: "FMADD", argLength: 3, reg: fp31, asm: "FMADD"},
212 {name: "FMADDS", argLength: 3, reg: fp31, asm: "FMADDS"},
213 {name: "FMSUB", argLength: 3, reg: fp31, asm: "FMSUB"},
214 {name: "FMSUBS", argLength: 3, reg: fp31, asm: "FMSUBS"},
215
216 {name: "SRAD", argLength: 2, reg: gp21cxer, asm: "SRAD"},
217 {name: "SRAW", argLength: 2, reg: gp21cxer, asm: "SRAW"},
218 {name: "SRD", argLength: 2, reg: gp21, asm: "SRD"},
219 {name: "SRW", argLength: 2, reg: gp21, asm: "SRW"},
220 {name: "SLD", argLength: 2, reg: gp21, asm: "SLD"},
221 {name: "SLW", argLength: 2, reg: gp21, asm: "SLW"},
222
223 {name: "ROTL", argLength: 2, reg: gp21, asm: "ROTL"},
224 {name: "ROTLW", argLength: 2, reg: gp21, asm: "ROTLW"},
225
226
227 {name: "CLRLSLWI", argLength: 1, reg: gp11, asm: "CLRLSLWI", aux: "Int32"},
228 {name: "CLRLSLDI", argLength: 1, reg: gp11, asm: "CLRLSLDI", aux: "Int32"},
229
230
231 {name: "ADDC", argLength: 2, reg: gp21xer, asm: "ADDC", commutative: true, typ: "(UInt64, UInt64)"},
232 {name: "SUBC", argLength: 2, reg: gp21xer, asm: "SUBC", typ: "(UInt64, UInt64)"},
233 {name: "ADDCconst", argLength: 1, reg: gp11xer, asm: "ADDC", typ: "(UInt64, UInt64)", aux: "Int64"},
234 {name: "SUBCconst", argLength: 1, reg: gp11xer, asm: "SUBC", typ: "(UInt64, UInt64)", aux: "Int64"},
235 {name: "ADDE", argLength: 3, reg: gp2xer1xer, asm: "ADDE", typ: "(UInt64, UInt64)", commutative: true},
236 {name: "ADDZE", argLength: 2, reg: gp1xer1xer, asm: "ADDZE", typ: "(UInt64, UInt64)"},
237 {name: "SUBE", argLength: 3, reg: gp2xer1xer, asm: "SUBE", typ: "(UInt64, UInt64)"},
238 {name: "ADDZEzero", argLength: 1, reg: xergp, asm: "ADDZE", typ: "UInt64"},
239 {name: "SUBZEzero", argLength: 1, reg: xergp, asm: "SUBZE", typ: "UInt64"},
240
241 {name: "SRADconst", argLength: 1, reg: gp11cxer, asm: "SRAD", aux: "Int64"},
242 {name: "SRAWconst", argLength: 1, reg: gp11cxer, asm: "SRAW", aux: "Int64"},
243 {name: "SRDconst", argLength: 1, reg: gp11, asm: "SRD", aux: "Int64"},
244 {name: "SRWconst", argLength: 1, reg: gp11, asm: "SRW", aux: "Int64"},
245 {name: "SLDconst", argLength: 1, reg: gp11, asm: "SLD", aux: "Int64"},
246 {name: "SLWconst", argLength: 1, reg: gp11, asm: "SLW", aux: "Int64"},
247
248 {name: "ROTLconst", argLength: 1, reg: gp11, asm: "ROTL", aux: "Int64"},
249 {name: "ROTLWconst", argLength: 1, reg: gp11, asm: "ROTLW", aux: "Int64"},
250 {name: "EXTSWSLconst", argLength: 1, reg: gp11, asm: "EXTSWSLI", aux: "Int64"},
251
252 {name: "RLWINM", argLength: 1, reg: gp11, asm: "RLWNM", aux: "Int64"},
253 {name: "RLWNM", argLength: 2, reg: gp21, asm: "RLWNM", aux: "Int64"},
254 {name: "RLWMI", argLength: 2, reg: gp21a0, asm: "RLWMI", aux: "Int64", resultInArg0: true},
255 {name: "RLDICL", argLength: 1, reg: gp11, asm: "RLDICL", aux: "Int64"},
256 {name: "RLDICLCC", argLength: 1, reg: gp11, asm: "RLDICLCC", aux: "Int64", typ: "(Int, Flags)"},
257 {name: "RLDICR", argLength: 1, reg: gp11, asm: "RLDICR", aux: "Int64"},
258
259 {name: "CNTLZD", argLength: 1, reg: gp11, asm: "CNTLZD"},
260 {name: "CNTLZDCC", argLength: 1, reg: gp11, asm: "CNTLZDCC", typ: "(Int, Flags)"},
261 {name: "CNTLZW", argLength: 1, reg: gp11, asm: "CNTLZW"},
262
263 {name: "CNTTZD", argLength: 1, reg: gp11, asm: "CNTTZD"},
264 {name: "CNTTZW", argLength: 1, reg: gp11, asm: "CNTTZW"},
265
266 {name: "POPCNTD", argLength: 1, reg: gp11, asm: "POPCNTD"},
267 {name: "POPCNTW", argLength: 1, reg: gp11, asm: "POPCNTW"},
268 {name: "POPCNTB", argLength: 1, reg: gp11, asm: "POPCNTB"},
269
270 {name: "FDIV", argLength: 2, reg: fp21, asm: "FDIV"},
271 {name: "FDIVS", argLength: 2, reg: fp21, asm: "FDIVS"},
272
273 {name: "DIVD", argLength: 2, reg: gp21, asm: "DIVD", typ: "Int64"},
274 {name: "DIVW", argLength: 2, reg: gp21, asm: "DIVW", typ: "Int32"},
275 {name: "DIVDU", argLength: 2, reg: gp21, asm: "DIVDU", typ: "Int64"},
276 {name: "DIVWU", argLength: 2, reg: gp21, asm: "DIVWU", typ: "Int32"},
277
278 {name: "MODUD", argLength: 2, reg: gp21, asm: "MODUD", typ: "UInt64"},
279 {name: "MODSD", argLength: 2, reg: gp21, asm: "MODSD", typ: "Int64"},
280 {name: "MODUW", argLength: 2, reg: gp21, asm: "MODUW", typ: "UInt32"},
281 {name: "MODSW", argLength: 2, reg: gp21, asm: "MODSW", typ: "Int32"},
282
283
284
285 {name: "FCTIDZ", argLength: 1, reg: fp11, asm: "FCTIDZ", typ: "Float64"},
286 {name: "FCTIWZ", argLength: 1, reg: fp11, asm: "FCTIWZ", typ: "Float64"},
287 {name: "FCFID", argLength: 1, reg: fp11, asm: "FCFID", typ: "Float64"},
288 {name: "FCFIDS", argLength: 1, reg: fp11, asm: "FCFIDS", typ: "Float32"},
289 {name: "FRSP", argLength: 1, reg: fp11, asm: "FRSP", typ: "Float64"},
290
291
292
293
294
295
296
297 {name: "MFVSRD", argLength: 1, reg: fpgp, asm: "MFVSRD", typ: "Int64"},
298 {name: "MTVSRD", argLength: 1, reg: gpfp, asm: "MTVSRD", typ: "Float64"},
299
300 {name: "AND", argLength: 2, reg: gp21, asm: "AND", commutative: true},
301 {name: "ANDN", argLength: 2, reg: gp21, asm: "ANDN"},
302 {name: "ANDNCC", argLength: 2, reg: gp21, asm: "ANDNCC", typ: "(Int64,Flags)"},
303 {name: "ANDCC", argLength: 2, reg: gp21, asm: "ANDCC", commutative: true, typ: "(Int64,Flags)"},
304 {name: "OR", argLength: 2, reg: gp21, asm: "OR", commutative: true},
305 {name: "ORN", argLength: 2, reg: gp21, asm: "ORN"},
306 {name: "ORCC", argLength: 2, reg: gp21, asm: "ORCC", commutative: true, typ: "(Int,Flags)"},
307 {name: "NOR", argLength: 2, reg: gp21, asm: "NOR", commutative: true},
308 {name: "NORCC", argLength: 2, reg: gp21, asm: "NORCC", commutative: true, typ: "(Int,Flags)"},
309 {name: "XOR", argLength: 2, reg: gp21, asm: "XOR", typ: "Int64", commutative: true},
310 {name: "XORCC", argLength: 2, reg: gp21, asm: "XORCC", commutative: true, typ: "(Int,Flags)"},
311 {name: "EQV", argLength: 2, reg: gp21, asm: "EQV", typ: "Int64", commutative: true},
312 {name: "NEG", argLength: 1, reg: gp11, asm: "NEG"},
313 {name: "NEGCC", argLength: 1, reg: gp11, asm: "NEGCC", typ: "(Int,Flags)"},
314 {name: "BRD", argLength: 1, reg: gp11, asm: "BRD"},
315 {name: "BRW", argLength: 1, reg: gp11, asm: "BRW"},
316 {name: "BRH", argLength: 1, reg: gp11, asm: "BRH"},
317 {name: "FNEG", argLength: 1, reg: fp11, asm: "FNEG"},
318 {name: "FSQRT", argLength: 1, reg: fp11, asm: "FSQRT"},
319 {name: "FSQRTS", argLength: 1, reg: fp11, asm: "FSQRTS"},
320 {name: "FFLOOR", argLength: 1, reg: fp11, asm: "FRIM"},
321 {name: "FCEIL", argLength: 1, reg: fp11, asm: "FRIP"},
322 {name: "FTRUNC", argLength: 1, reg: fp11, asm: "FRIZ"},
323 {name: "FROUND", argLength: 1, reg: fp11, asm: "FRIN"},
324 {name: "FABS", argLength: 1, reg: fp11, asm: "FABS"},
325 {name: "FNABS", argLength: 1, reg: fp11, asm: "FNABS"},
326 {name: "FCPSGN", argLength: 2, reg: fp21, asm: "FCPSGN"},
327
328 {name: "ORconst", argLength: 1, reg: gp11, asm: "OR", aux: "Int64"},
329 {name: "XORconst", argLength: 1, reg: gp11, asm: "XOR", aux: "Int64"},
330 {name: "ANDCCconst", argLength: 1, reg: regInfo{inputs: []regMask{gp | sp | sb}, outputs: []regMask{gp}}, asm: "ANDCC", aux: "Int64", typ: "(Int,Flags)"},
331 {name: "ANDconst", argLength: 1, reg: regInfo{inputs: []regMask{gp | sp | sb}, outputs: []regMask{gp}}, clobberFlags: true, asm: "ANDCC", aux: "Int64", typ: "Int"},
332
333 {name: "MOVBreg", argLength: 1, reg: gp11, asm: "MOVB", typ: "Int64"},
334 {name: "MOVBZreg", argLength: 1, reg: gp11, asm: "MOVBZ", typ: "Int64"},
335 {name: "MOVHreg", argLength: 1, reg: gp11, asm: "MOVH", typ: "Int64"},
336 {name: "MOVHZreg", argLength: 1, reg: gp11, asm: "MOVHZ", typ: "Int64"},
337 {name: "MOVWreg", argLength: 1, reg: gp11, asm: "MOVW", typ: "Int64"},
338 {name: "MOVWZreg", argLength: 1, reg: gp11, asm: "MOVWZ", typ: "Int64"},
339
340
341 {name: "MOVBZload", argLength: 2, reg: gpload, asm: "MOVBZ", aux: "SymOff", typ: "UInt8", faultOnNilArg0: true, symEffect: "Read"},
342 {name: "MOVHload", argLength: 2, reg: gpload, asm: "MOVH", aux: "SymOff", typ: "Int16", faultOnNilArg0: true, symEffect: "Read"},
343 {name: "MOVHZload", argLength: 2, reg: gpload, asm: "MOVHZ", aux: "SymOff", typ: "UInt16", faultOnNilArg0: true, symEffect: "Read"},
344 {name: "MOVWload", argLength: 2, reg: gpload, asm: "MOVW", aux: "SymOff", typ: "Int32", faultOnNilArg0: true, symEffect: "Read"},
345 {name: "MOVWZload", argLength: 2, reg: gpload, asm: "MOVWZ", aux: "SymOff", typ: "UInt32", faultOnNilArg0: true, symEffect: "Read"},
346 {name: "MOVDload", argLength: 2, reg: gpload, asm: "MOVD", aux: "SymOff", typ: "Int64", faultOnNilArg0: true, symEffect: "Read"},
347
348
349
350
351 {name: "MOVDBRload", argLength: 2, reg: gpload, asm: "MOVDBR", typ: "UInt64", faultOnNilArg0: true},
352 {name: "MOVWBRload", argLength: 2, reg: gpload, asm: "MOVWBR", typ: "UInt32", faultOnNilArg0: true},
353 {name: "MOVHBRload", argLength: 2, reg: gpload, asm: "MOVHBR", typ: "UInt16", faultOnNilArg0: true},
354
355
356
357 {name: "MOVBZloadidx", argLength: 3, reg: gploadidx, asm: "MOVBZ", typ: "UInt8"},
358 {name: "MOVHloadidx", argLength: 3, reg: gploadidx, asm: "MOVH", typ: "Int16"},
359 {name: "MOVHZloadidx", argLength: 3, reg: gploadidx, asm: "MOVHZ", typ: "UInt16"},
360 {name: "MOVWloadidx", argLength: 3, reg: gploadidx, asm: "MOVW", typ: "Int32"},
361 {name: "MOVWZloadidx", argLength: 3, reg: gploadidx, asm: "MOVWZ", typ: "UInt32"},
362 {name: "MOVDloadidx", argLength: 3, reg: gploadidx, asm: "MOVD", typ: "Int64"},
363 {name: "MOVHBRloadidx", argLength: 3, reg: gploadidx, asm: "MOVHBR", typ: "Int16"},
364 {name: "MOVWBRloadidx", argLength: 3, reg: gploadidx, asm: "MOVWBR", typ: "Int32"},
365 {name: "MOVDBRloadidx", argLength: 3, reg: gploadidx, asm: "MOVDBR", typ: "Int64"},
366 {name: "FMOVDloadidx", argLength: 3, reg: fploadidx, asm: "FMOVD", typ: "Float64"},
367 {name: "FMOVSloadidx", argLength: 3, reg: fploadidx, asm: "FMOVS", typ: "Float32"},
368
369
370
371 {name: "DCBT", argLength: 2, aux: "Int64", reg: prefreg, asm: "DCBT", hasSideEffects: true},
372
373
374
375 {name: "MOVDBRstore", argLength: 3, reg: gpstore, asm: "MOVDBR", typ: "Mem", faultOnNilArg0: true},
376 {name: "MOVWBRstore", argLength: 3, reg: gpstore, asm: "MOVWBR", typ: "Mem", faultOnNilArg0: true},
377 {name: "MOVHBRstore", argLength: 3, reg: gpstore, asm: "MOVHBR", typ: "Mem", faultOnNilArg0: true},
378
379
380 {name: "FMOVDload", argLength: 2, reg: fpload, asm: "FMOVD", aux: "SymOff", typ: "Float64", faultOnNilArg0: true, symEffect: "Read"},
381 {name: "FMOVSload", argLength: 2, reg: fpload, asm: "FMOVS", aux: "SymOff", typ: "Float32", faultOnNilArg0: true, symEffect: "Read"},
382
383
384 {name: "MOVBstore", argLength: 3, reg: gpstore, asm: "MOVB", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"},
385 {name: "MOVHstore", argLength: 3, reg: gpstore, asm: "MOVH", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"},
386 {name: "MOVWstore", argLength: 3, reg: gpstore, asm: "MOVW", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"},
387 {name: "MOVDstore", argLength: 3, reg: gpstore, asm: "MOVD", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"},
388
389
390 {name: "FMOVDstore", argLength: 3, reg: fpstore, asm: "FMOVD", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"},
391 {name: "FMOVSstore", argLength: 3, reg: fpstore, asm: "FMOVS", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"},
392
393
394
395 {name: "MOVBstoreidx", argLength: 4, reg: gpstoreidx, asm: "MOVB", typ: "Mem"},
396 {name: "MOVHstoreidx", argLength: 4, reg: gpstoreidx, asm: "MOVH", typ: "Mem"},
397 {name: "MOVWstoreidx", argLength: 4, reg: gpstoreidx, asm: "MOVW", typ: "Mem"},
398 {name: "MOVDstoreidx", argLength: 4, reg: gpstoreidx, asm: "MOVD", typ: "Mem"},
399 {name: "FMOVDstoreidx", argLength: 4, reg: fpstoreidx, asm: "FMOVD", typ: "Mem"},
400 {name: "FMOVSstoreidx", argLength: 4, reg: fpstoreidx, asm: "FMOVS", typ: "Mem"},
401 {name: "MOVHBRstoreidx", argLength: 4, reg: gpstoreidx, asm: "MOVHBR", typ: "Mem"},
402 {name: "MOVWBRstoreidx", argLength: 4, reg: gpstoreidx, asm: "MOVWBR", typ: "Mem"},
403 {name: "MOVDBRstoreidx", argLength: 4, reg: gpstoreidx, asm: "MOVDBR", typ: "Mem"},
404
405
406 {name: "MOVBstorezero", argLength: 2, reg: gpstorezero, asm: "MOVB", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"},
407 {name: "MOVHstorezero", argLength: 2, reg: gpstorezero, asm: "MOVH", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"},
408 {name: "MOVWstorezero", argLength: 2, reg: gpstorezero, asm: "MOVW", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"},
409 {name: "MOVDstorezero", argLength: 2, reg: gpstorezero, asm: "MOVD", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"},
410
411 {name: "MOVDaddr", argLength: 1, reg: regInfo{inputs: []regMask{sp | sb | gp}, outputs: []regMask{gp}}, aux: "SymOff", asm: "MOVD", rematerializeable: true, symEffect: "Addr"},
412
413 {name: "MOVDconst", argLength: 0, reg: gp01, aux: "Int64", asm: "MOVD", typ: "Int64", rematerializeable: true},
414 {name: "FMOVDconst", argLength: 0, reg: fp01, aux: "Float64", asm: "FMOVD", rematerializeable: true},
415 {name: "FMOVSconst", argLength: 0, reg: fp01, aux: "Float32", asm: "FMOVS", rematerializeable: true},
416 {name: "FCMPU", argLength: 2, reg: fp2cr, asm: "FCMPU", typ: "Flags"},
417
418 {name: "CMP", argLength: 2, reg: gp2cr, asm: "CMP", typ: "Flags"},
419 {name: "CMPU", argLength: 2, reg: gp2cr, asm: "CMPU", typ: "Flags"},
420 {name: "CMPW", argLength: 2, reg: gp2cr, asm: "CMPW", typ: "Flags"},
421 {name: "CMPWU", argLength: 2, reg: gp2cr, asm: "CMPWU", typ: "Flags"},
422 {name: "CMPconst", argLength: 1, reg: gp1cr, asm: "CMP", aux: "Int64", typ: "Flags"},
423 {name: "CMPUconst", argLength: 1, reg: gp1cr, asm: "CMPU", aux: "Int64", typ: "Flags"},
424 {name: "CMPWconst", argLength: 1, reg: gp1cr, asm: "CMPW", aux: "Int32", typ: "Flags"},
425 {name: "CMPWUconst", argLength: 1, reg: gp1cr, asm: "CMPWU", aux: "Int32", typ: "Flags"},
426
427
428
429
430
431 {name: "ISEL", argLength: 3, reg: crgp21, asm: "ISEL", aux: "Int32", typ: "Int32"},
432 {name: "ISELZ", argLength: 2, reg: crgp11, asm: "ISEL", aux: "Int32"},
433
434
435 {name: "SETBC", argLength: 1, reg: crgp, asm: "SETBC", aux: "Int32", typ: "Int32"},
436
437 {name: "SETBCR", argLength: 1, reg: crgp, asm: "SETBCR", aux: "Int32", typ: "Int32"},
438
439
440 {name: "Equal", argLength: 1, reg: crgp},
441 {name: "NotEqual", argLength: 1, reg: crgp},
442 {name: "LessThan", argLength: 1, reg: crgp},
443 {name: "FLessThan", argLength: 1, reg: crgp},
444 {name: "LessEqual", argLength: 1, reg: crgp},
445 {name: "FLessEqual", argLength: 1, reg: crgp},
446 {name: "GreaterThan", argLength: 1, reg: crgp},
447 {name: "FGreaterThan", argLength: 1, reg: crgp},
448 {name: "GreaterEqual", argLength: 1, reg: crgp},
449 {name: "FGreaterEqual", argLength: 1, reg: crgp},
450
451
452
453
454 {name: "LoweredGetClosurePtr", reg: regInfo{outputs: []regMask{ctxt}}, zeroWidth: true},
455
456
457 {name: "LoweredGetCallerSP", argLength: 1, reg: gp01, rematerializeable: true},
458
459
460
461
462
463 {name: "LoweredGetCallerPC", reg: gp01, rematerializeable: true},
464
465
466 {name: "LoweredNilCheck", argLength: 2, reg: regInfo{inputs: []regMask{gp | sp | sb}, clobbers: tmp}, clobberFlags: true, nilCheck: true, faultOnNilArg0: true},
467
468 {name: "LoweredRound32F", argLength: 1, reg: fp11, resultInArg0: true, zeroWidth: true},
469 {name: "LoweredRound64F", argLength: 1, reg: fp11, resultInArg0: true, zeroWidth: true},
470
471 {name: "CALLstatic", argLength: -1, reg: regInfo{clobbers: callerSave}, aux: "CallOff", clobberFlags: true, call: true},
472 {name: "CALLtail", argLength: -1, reg: regInfo{clobbers: callerSave}, aux: "CallOff", clobberFlags: true, call: true, tailCall: true},
473 {name: "CALLclosure", argLength: -1, reg: regInfo{inputs: []regMask{callptr, ctxt, 0}, clobbers: callerSave}, aux: "CallOff", clobberFlags: true, call: true},
474 {name: "CALLinter", argLength: -1, reg: regInfo{inputs: []regMask{callptr}, clobbers: callerSave}, aux: "CallOff", clobberFlags: true, call: true},
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503 {
504 name: "LoweredZero",
505 aux: "Int64",
506 argLength: 2,
507 reg: regInfo{
508 inputs: []regMask{buildReg("R20")},
509 clobbers: buildReg("R20"),
510 },
511 clobberFlags: true,
512 typ: "Mem",
513 faultOnNilArg0: true,
514 unsafePoint: true,
515 },
516 {
517 name: "LoweredZeroShort",
518 aux: "Int64",
519 argLength: 2,
520 reg: regInfo{
521 inputs: []regMask{gp}},
522 typ: "Mem",
523 faultOnNilArg0: true,
524 unsafePoint: true,
525 },
526 {
527 name: "LoweredQuadZeroShort",
528 aux: "Int64",
529 argLength: 2,
530 reg: regInfo{
531 inputs: []regMask{gp},
532 },
533 typ: "Mem",
534 faultOnNilArg0: true,
535 unsafePoint: true,
536 },
537 {
538 name: "LoweredQuadZero",
539 aux: "Int64",
540 argLength: 2,
541 reg: regInfo{
542 inputs: []regMask{buildReg("R20")},
543 clobbers: buildReg("R20"),
544 },
545 clobberFlags: true,
546 typ: "Mem",
547 faultOnNilArg0: true,
548 unsafePoint: true,
549 },
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584 {
585 name: "LoweredMove",
586 aux: "Int64",
587 argLength: 3,
588 reg: regInfo{
589 inputs: []regMask{buildReg("R20"), buildReg("R21")},
590 clobbers: buildReg("R20 R21"),
591 },
592 clobberFlags: true,
593 typ: "Mem",
594 faultOnNilArg0: true,
595 faultOnNilArg1: true,
596 unsafePoint: true,
597 },
598 {
599 name: "LoweredMoveShort",
600 aux: "Int64",
601 argLength: 3,
602 reg: regInfo{
603 inputs: []regMask{gp, gp},
604 },
605 typ: "Mem",
606 faultOnNilArg0: true,
607 faultOnNilArg1: true,
608 unsafePoint: true,
609 },
610
611
612
613
614 {
615 name: "LoweredQuadMove",
616 aux: "Int64",
617 argLength: 3,
618 reg: regInfo{
619 inputs: []regMask{buildReg("R20"), buildReg("R21")},
620 clobbers: buildReg("R20 R21"),
621 },
622 clobberFlags: true,
623 typ: "Mem",
624 faultOnNilArg0: true,
625 faultOnNilArg1: true,
626 unsafePoint: true,
627 },
628
629 {
630 name: "LoweredQuadMoveShort",
631 aux: "Int64",
632 argLength: 3,
633 reg: regInfo{
634 inputs: []regMask{gp, gp},
635 },
636 typ: "Mem",
637 faultOnNilArg0: true,
638 faultOnNilArg1: true,
639 unsafePoint: true,
640 },
641
642 {name: "LoweredAtomicStore8", argLength: 3, reg: gpstore, typ: "Mem", aux: "Int64", faultOnNilArg0: true, hasSideEffects: true},
643 {name: "LoweredAtomicStore32", argLength: 3, reg: gpstore, typ: "Mem", aux: "Int64", faultOnNilArg0: true, hasSideEffects: true},
644 {name: "LoweredAtomicStore64", argLength: 3, reg: gpstore, typ: "Mem", aux: "Int64", faultOnNilArg0: true, hasSideEffects: true},
645
646 {name: "LoweredAtomicLoad8", argLength: 2, reg: gpload, typ: "UInt8", aux: "Int64", clobberFlags: true, faultOnNilArg0: true},
647 {name: "LoweredAtomicLoad32", argLength: 2, reg: gpload, typ: "UInt32", aux: "Int64", clobberFlags: true, faultOnNilArg0: true},
648 {name: "LoweredAtomicLoad64", argLength: 2, reg: gpload, typ: "Int64", aux: "Int64", clobberFlags: true, faultOnNilArg0: true},
649 {name: "LoweredAtomicLoadPtr", argLength: 2, reg: gpload, typ: "Int64", aux: "Int64", clobberFlags: true, faultOnNilArg0: true},
650
651
652
653
654
655
656
657
658 {name: "LoweredAtomicAdd32", argLength: 3, reg: gpxchg, resultNotInArgs: true, clobberFlags: true, faultOnNilArg0: true, hasSideEffects: true},
659 {name: "LoweredAtomicAdd64", argLength: 3, reg: gpxchg, resultNotInArgs: true, clobberFlags: true, faultOnNilArg0: true, hasSideEffects: true},
660
661
662
663
664
665
666
667
668 {name: "LoweredAtomicExchange8", argLength: 3, reg: gpxchg, resultNotInArgs: true, clobberFlags: true, faultOnNilArg0: true, hasSideEffects: true},
669 {name: "LoweredAtomicExchange32", argLength: 3, reg: gpxchg, resultNotInArgs: true, clobberFlags: true, faultOnNilArg0: true, hasSideEffects: true},
670 {name: "LoweredAtomicExchange64", argLength: 3, reg: gpxchg, resultNotInArgs: true, clobberFlags: true, faultOnNilArg0: true, hasSideEffects: true},
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688 {name: "LoweredAtomicCas64", argLength: 4, reg: gpcas, resultNotInArgs: true, aux: "Int64", clobberFlags: true, faultOnNilArg0: true, hasSideEffects: true},
689 {name: "LoweredAtomicCas32", argLength: 4, reg: gpcas, resultNotInArgs: true, aux: "Int64", clobberFlags: true, faultOnNilArg0: true, hasSideEffects: true},
690
691
692
693
694
695
696
697 {name: "LoweredAtomicAnd8", argLength: 3, reg: gpstore, asm: "AND", faultOnNilArg0: true, hasSideEffects: true},
698 {name: "LoweredAtomicAnd32", argLength: 3, reg: gpstore, asm: "AND", faultOnNilArg0: true, hasSideEffects: true},
699 {name: "LoweredAtomicOr8", argLength: 3, reg: gpstore, asm: "OR", faultOnNilArg0: true, hasSideEffects: true},
700 {name: "LoweredAtomicOr32", argLength: 3, reg: gpstore, asm: "OR", faultOnNilArg0: true, hasSideEffects: true},
701
702
703
704
705
706 {name: "LoweredWB", argLength: 1, reg: regInfo{clobbers: (callerSave &^ buildReg("R0 R3 R4 R5 R6 R7 R8 R9 R10 R14 R15 R16 R17 R20 R21 g")) | buildReg("R31"), outputs: []regMask{buildReg("R29")}}, clobberFlags: true, aux: "Int64"},
707
708 {name: "LoweredPubBarrier", argLength: 1, asm: "LWSYNC", hasSideEffects: true},
709
710
711
712 {name: "LoweredPanicBoundsA", argLength: 3, aux: "Int64", reg: regInfo{inputs: []regMask{r5, r6}}, typ: "Mem", call: true},
713 {name: "LoweredPanicBoundsB", argLength: 3, aux: "Int64", reg: regInfo{inputs: []regMask{r4, r5}}, typ: "Mem", call: true},
714 {name: "LoweredPanicBoundsC", argLength: 3, aux: "Int64", reg: regInfo{inputs: []regMask{r3, r4}}, typ: "Mem", call: true},
715
716
717
718
719
720
721 {name: "InvertFlags", argLength: 1},
722
723
724
725
726
727
728
729
730
731
732 {name: "FlagEQ"},
733 {name: "FlagLT"},
734 {name: "FlagGT"},
735 }
736
737 blocks := []blockData{
738 {name: "EQ", controls: 1},
739 {name: "NE", controls: 1},
740 {name: "LT", controls: 1},
741 {name: "LE", controls: 1},
742 {name: "GT", controls: 1},
743 {name: "GE", controls: 1},
744 {name: "FLT", controls: 1},
745 {name: "FLE", controls: 1},
746 {name: "FGT", controls: 1},
747 {name: "FGE", controls: 1},
748 }
749
750 archs = append(archs, arch{
751 name: "PPC64",
752 pkg: "cmd/internal/obj/ppc64",
753 genfile: "../../ppc64/ssa.go",
754 ops: ops,
755 blocks: blocks,
756 regnames: regNamesPPC64,
757 ParamIntRegNames: "R3 R4 R5 R6 R7 R8 R9 R10 R14 R15 R16 R17",
758 ParamFloatRegNames: "F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12",
759 gpregmask: gp,
760 fpregmask: fp,
761 specialregmask: xer,
762 framepointerreg: -1,
763 linkreg: -1,
764 })
765 }
766
View as plain text