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 first7 = buildReg("R3 R4 R5 R6 R7 R8 R9")
175 )
176 ops := []opData{
177 {name: "ADD", argLength: 2, reg: gp21, asm: "ADD", commutative: true},
178 {name: "ADDCC", argLength: 2, reg: gp21, asm: "ADDCC", commutative: true, typ: "(Int,Flags)"},
179 {name: "ADDconst", argLength: 1, reg: gp11, asm: "ADD", aux: "Int64"},
180 {name: "ADDCCconst", argLength: 1, reg: gp11cxer, asm: "ADDCCC", aux: "Int64", typ: "(Int,Flags)"},
181 {name: "FADD", argLength: 2, reg: fp21, asm: "FADD", commutative: true},
182 {name: "FADDS", argLength: 2, reg: fp21, asm: "FADDS", commutative: true},
183 {name: "SUB", argLength: 2, reg: gp21, asm: "SUB"},
184 {name: "SUBCC", argLength: 2, reg: gp21, asm: "SUBCC", typ: "(Int,Flags)"},
185 {name: "SUBFCconst", argLength: 1, reg: gp11cxer, asm: "SUBC", aux: "Int64"},
186 {name: "FSUB", argLength: 2, reg: fp21, asm: "FSUB"},
187 {name: "FSUBS", argLength: 2, reg: fp21, asm: "FSUBS"},
188
189
190 {name: "XSMINJDP", argLength: 2, reg: fp21, asm: "XSMINJDP"},
191 {name: "XSMAXJDP", argLength: 2, reg: fp21, asm: "XSMAXJDP"},
192
193 {name: "MULLD", argLength: 2, reg: gp21, asm: "MULLD", typ: "Int64", commutative: true},
194 {name: "MULLW", argLength: 2, reg: gp21, asm: "MULLW", typ: "Int32", commutative: true},
195 {name: "MULLDconst", argLength: 1, reg: gp11, asm: "MULLD", aux: "Int32", typ: "Int64"},
196 {name: "MULLWconst", argLength: 1, reg: gp11, asm: "MULLW", aux: "Int32", typ: "Int64"},
197 {name: "MADDLD", argLength: 3, reg: gp31, asm: "MADDLD", typ: "Int64"},
198
199 {name: "MULHD", argLength: 2, reg: gp21, asm: "MULHD", commutative: true},
200 {name: "MULHW", argLength: 2, reg: gp21, asm: "MULHW", commutative: true},
201 {name: "MULHDU", argLength: 2, reg: gp21, asm: "MULHDU", commutative: true},
202 {name: "MULHDUCC", argLength: 2, reg: gp21, asm: "MULHDUCC", commutative: true, typ: "(Int64,Flags)"},
203 {name: "MULHWU", argLength: 2, reg: gp21, asm: "MULHWU", commutative: true},
204
205 {name: "FMUL", argLength: 2, reg: fp21, asm: "FMUL", commutative: true},
206 {name: "FMULS", argLength: 2, reg: fp21, asm: "FMULS", commutative: true},
207
208 {name: "FMADD", argLength: 3, reg: fp31, asm: "FMADD"},
209 {name: "FMADDS", argLength: 3, reg: fp31, asm: "FMADDS"},
210 {name: "FMSUB", argLength: 3, reg: fp31, asm: "FMSUB"},
211 {name: "FMSUBS", argLength: 3, reg: fp31, asm: "FMSUBS"},
212
213 {name: "SRAD", argLength: 2, reg: gp21cxer, asm: "SRAD"},
214 {name: "SRAW", argLength: 2, reg: gp21cxer, asm: "SRAW"},
215 {name: "SRD", argLength: 2, reg: gp21, asm: "SRD"},
216 {name: "SRW", argLength: 2, reg: gp21, asm: "SRW"},
217 {name: "SLD", argLength: 2, reg: gp21, asm: "SLD"},
218 {name: "SLW", argLength: 2, reg: gp21, asm: "SLW"},
219
220 {name: "ROTL", argLength: 2, reg: gp21, asm: "ROTL"},
221 {name: "ROTLW", argLength: 2, reg: gp21, asm: "ROTLW"},
222
223
224 {name: "CLRLSLWI", argLength: 1, reg: gp11, asm: "CLRLSLWI", aux: "Int32"},
225 {name: "CLRLSLDI", argLength: 1, reg: gp11, asm: "CLRLSLDI", aux: "Int32"},
226
227
228 {name: "ADDC", argLength: 2, reg: gp21xer, asm: "ADDC", commutative: true, typ: "(UInt64, UInt64)"},
229 {name: "SUBC", argLength: 2, reg: gp21xer, asm: "SUBC", typ: "(UInt64, UInt64)"},
230 {name: "ADDCconst", argLength: 1, reg: gp11xer, asm: "ADDC", typ: "(UInt64, UInt64)", aux: "Int64"},
231 {name: "SUBCconst", argLength: 1, reg: gp11xer, asm: "SUBC", typ: "(UInt64, UInt64)", aux: "Int64"},
232 {name: "ADDE", argLength: 3, reg: gp2xer1xer, asm: "ADDE", typ: "(UInt64, UInt64)", commutative: true},
233 {name: "ADDZE", argLength: 2, reg: gp1xer1xer, asm: "ADDZE", typ: "(UInt64, UInt64)"},
234 {name: "SUBE", argLength: 3, reg: gp2xer1xer, asm: "SUBE", typ: "(UInt64, UInt64)"},
235 {name: "ADDZEzero", argLength: 1, reg: xergp, asm: "ADDZE", typ: "UInt64"},
236 {name: "SUBZEzero", argLength: 1, reg: xergp, asm: "SUBZE", typ: "UInt64"},
237
238 {name: "SRADconst", argLength: 1, reg: gp11cxer, asm: "SRAD", aux: "Int64"},
239 {name: "SRAWconst", argLength: 1, reg: gp11cxer, asm: "SRAW", aux: "Int64"},
240 {name: "SRDconst", argLength: 1, reg: gp11, asm: "SRD", aux: "Int64"},
241 {name: "SRWconst", argLength: 1, reg: gp11, asm: "SRW", aux: "Int64"},
242 {name: "SLDconst", argLength: 1, reg: gp11, asm: "SLD", aux: "Int64"},
243 {name: "SLWconst", argLength: 1, reg: gp11, asm: "SLW", aux: "Int64"},
244
245 {name: "ROTLconst", argLength: 1, reg: gp11, asm: "ROTL", aux: "Int64"},
246 {name: "ROTLWconst", argLength: 1, reg: gp11, asm: "ROTLW", aux: "Int64"},
247 {name: "EXTSWSLconst", argLength: 1, reg: gp11, asm: "EXTSWSLI", aux: "Int64"},
248
249 {name: "RLWINM", argLength: 1, reg: gp11, asm: "RLWNM", aux: "Int64"},
250 {name: "RLWNM", argLength: 2, reg: gp21, asm: "RLWNM", aux: "Int64"},
251 {name: "RLWMI", argLength: 2, reg: gp21a0, asm: "RLWMI", aux: "Int64", resultInArg0: true},
252 {name: "RLDICL", argLength: 1, reg: gp11, asm: "RLDICL", aux: "Int64"},
253 {name: "RLDICLCC", argLength: 1, reg: gp11, asm: "RLDICLCC", aux: "Int64", typ: "(Int, Flags)"},
254 {name: "RLDICR", argLength: 1, reg: gp11, asm: "RLDICR", aux: "Int64"},
255
256 {name: "CNTLZD", argLength: 1, reg: gp11, asm: "CNTLZD"},
257 {name: "CNTLZDCC", argLength: 1, reg: gp11, asm: "CNTLZDCC", typ: "(Int, Flags)"},
258 {name: "CNTLZW", argLength: 1, reg: gp11, asm: "CNTLZW"},
259
260 {name: "CNTTZD", argLength: 1, reg: gp11, asm: "CNTTZD"},
261 {name: "CNTTZW", argLength: 1, reg: gp11, asm: "CNTTZW"},
262
263 {name: "POPCNTD", argLength: 1, reg: gp11, asm: "POPCNTD"},
264 {name: "POPCNTW", argLength: 1, reg: gp11, asm: "POPCNTW"},
265 {name: "POPCNTB", argLength: 1, reg: gp11, asm: "POPCNTB"},
266
267 {name: "FDIV", argLength: 2, reg: fp21, asm: "FDIV"},
268 {name: "FDIVS", argLength: 2, reg: fp21, asm: "FDIVS"},
269
270 {name: "DIVD", argLength: 2, reg: gp21, asm: "DIVD", typ: "Int64"},
271 {name: "DIVW", argLength: 2, reg: gp21, asm: "DIVW", typ: "Int32"},
272 {name: "DIVDU", argLength: 2, reg: gp21, asm: "DIVDU", typ: "Int64"},
273 {name: "DIVWU", argLength: 2, reg: gp21, asm: "DIVWU", typ: "Int32"},
274
275 {name: "MODUD", argLength: 2, reg: gp21, asm: "MODUD", typ: "UInt64"},
276 {name: "MODSD", argLength: 2, reg: gp21, asm: "MODSD", typ: "Int64"},
277 {name: "MODUW", argLength: 2, reg: gp21, asm: "MODUW", typ: "UInt32"},
278 {name: "MODSW", argLength: 2, reg: gp21, asm: "MODSW", typ: "Int32"},
279
280
281
282 {name: "FCTIDZ", argLength: 1, reg: fp11, asm: "FCTIDZ", typ: "Float64"},
283 {name: "FCTIWZ", argLength: 1, reg: fp11, asm: "FCTIWZ", typ: "Float64"},
284 {name: "FCFID", argLength: 1, reg: fp11, asm: "FCFID", typ: "Float64"},
285 {name: "FCFIDS", argLength: 1, reg: fp11, asm: "FCFIDS", typ: "Float32"},
286 {name: "FRSP", argLength: 1, reg: fp11, asm: "FRSP", typ: "Float64"},
287
288
289
290
291
292
293
294 {name: "MFVSRD", argLength: 1, reg: fpgp, asm: "MFVSRD", typ: "Int64"},
295 {name: "MTVSRD", argLength: 1, reg: gpfp, asm: "MTVSRD", typ: "Float64"},
296
297 {name: "AND", argLength: 2, reg: gp21, asm: "AND", commutative: true},
298 {name: "ANDN", argLength: 2, reg: gp21, asm: "ANDN"},
299 {name: "ANDNCC", argLength: 2, reg: gp21, asm: "ANDNCC", typ: "(Int64,Flags)"},
300 {name: "ANDCC", argLength: 2, reg: gp21, asm: "ANDCC", commutative: true, typ: "(Int64,Flags)"},
301 {name: "OR", argLength: 2, reg: gp21, asm: "OR", commutative: true},
302 {name: "ORN", argLength: 2, reg: gp21, asm: "ORN"},
303 {name: "ORCC", argLength: 2, reg: gp21, asm: "ORCC", commutative: true, typ: "(Int,Flags)"},
304 {name: "NOR", argLength: 2, reg: gp21, asm: "NOR", commutative: true},
305 {name: "NORCC", argLength: 2, reg: gp21, asm: "NORCC", commutative: true, typ: "(Int,Flags)"},
306 {name: "XOR", argLength: 2, reg: gp21, asm: "XOR", typ: "Int64", commutative: true},
307 {name: "XORCC", argLength: 2, reg: gp21, asm: "XORCC", commutative: true, typ: "(Int,Flags)"},
308 {name: "EQV", argLength: 2, reg: gp21, asm: "EQV", typ: "Int64", commutative: true},
309 {name: "NEG", argLength: 1, reg: gp11, asm: "NEG"},
310 {name: "NEGCC", argLength: 1, reg: gp11, asm: "NEGCC", typ: "(Int,Flags)"},
311 {name: "BRD", argLength: 1, reg: gp11, asm: "BRD"},
312 {name: "BRW", argLength: 1, reg: gp11, asm: "BRW"},
313 {name: "BRH", argLength: 1, reg: gp11, asm: "BRH"},
314 {name: "FNEG", argLength: 1, reg: fp11, asm: "FNEG"},
315 {name: "FSQRT", argLength: 1, reg: fp11, asm: "FSQRT"},
316 {name: "FSQRTS", argLength: 1, reg: fp11, asm: "FSQRTS"},
317 {name: "FFLOOR", argLength: 1, reg: fp11, asm: "FRIM"},
318 {name: "FCEIL", argLength: 1, reg: fp11, asm: "FRIP"},
319 {name: "FTRUNC", argLength: 1, reg: fp11, asm: "FRIZ"},
320 {name: "FROUND", argLength: 1, reg: fp11, asm: "FRIN"},
321 {name: "FABS", argLength: 1, reg: fp11, asm: "FABS"},
322 {name: "FNABS", argLength: 1, reg: fp11, asm: "FNABS"},
323 {name: "FCPSGN", argLength: 2, reg: fp21, asm: "FCPSGN"},
324
325 {name: "ORconst", argLength: 1, reg: gp11, asm: "OR", aux: "Int64"},
326 {name: "XORconst", argLength: 1, reg: gp11, asm: "XOR", aux: "Int64"},
327 {name: "ANDCCconst", argLength: 1, reg: regInfo{inputs: []regMask{gp | sp | sb}, outputs: []regMask{gp}}, asm: "ANDCC", aux: "Int64", typ: "(Int,Flags)"},
328 {name: "ANDconst", argLength: 1, reg: regInfo{inputs: []regMask{gp | sp | sb}, outputs: []regMask{gp}}, clobberFlags: true, asm: "ANDCC", aux: "Int64", typ: "Int"},
329
330 {name: "MOVBreg", argLength: 1, reg: gp11, asm: "MOVB", typ: "Int64"},
331 {name: "MOVBZreg", argLength: 1, reg: gp11, asm: "MOVBZ", typ: "Int64"},
332 {name: "MOVHreg", argLength: 1, reg: gp11, asm: "MOVH", typ: "Int64"},
333 {name: "MOVHZreg", argLength: 1, reg: gp11, asm: "MOVHZ", typ: "Int64"},
334 {name: "MOVWreg", argLength: 1, reg: gp11, asm: "MOVW", typ: "Int64"},
335 {name: "MOVWZreg", argLength: 1, reg: gp11, asm: "MOVWZ", typ: "Int64"},
336
337
338 {name: "MOVBZload", argLength: 2, reg: gpload, asm: "MOVBZ", aux: "SymOff", typ: "UInt8", faultOnNilArg0: true, symEffect: "Read"},
339 {name: "MOVHload", argLength: 2, reg: gpload, asm: "MOVH", aux: "SymOff", typ: "Int16", faultOnNilArg0: true, symEffect: "Read"},
340 {name: "MOVHZload", argLength: 2, reg: gpload, asm: "MOVHZ", aux: "SymOff", typ: "UInt16", faultOnNilArg0: true, symEffect: "Read"},
341 {name: "MOVWload", argLength: 2, reg: gpload, asm: "MOVW", aux: "SymOff", typ: "Int32", faultOnNilArg0: true, symEffect: "Read"},
342 {name: "MOVWZload", argLength: 2, reg: gpload, asm: "MOVWZ", aux: "SymOff", typ: "UInt32", faultOnNilArg0: true, symEffect: "Read"},
343 {name: "MOVDload", argLength: 2, reg: gpload, asm: "MOVD", aux: "SymOff", typ: "Int64", faultOnNilArg0: true, symEffect: "Read"},
344
345
346
347
348 {name: "MOVDBRload", argLength: 2, reg: gpload, asm: "MOVDBR", typ: "UInt64", faultOnNilArg0: true},
349 {name: "MOVWBRload", argLength: 2, reg: gpload, asm: "MOVWBR", typ: "UInt32", faultOnNilArg0: true},
350 {name: "MOVHBRload", argLength: 2, reg: gpload, asm: "MOVHBR", typ: "UInt16", faultOnNilArg0: true},
351
352
353
354 {name: "MOVBZloadidx", argLength: 3, reg: gploadidx, asm: "MOVBZ", typ: "UInt8"},
355 {name: "MOVHloadidx", argLength: 3, reg: gploadidx, asm: "MOVH", typ: "Int16"},
356 {name: "MOVHZloadidx", argLength: 3, reg: gploadidx, asm: "MOVHZ", typ: "UInt16"},
357 {name: "MOVWloadidx", argLength: 3, reg: gploadidx, asm: "MOVW", typ: "Int32"},
358 {name: "MOVWZloadidx", argLength: 3, reg: gploadidx, asm: "MOVWZ", typ: "UInt32"},
359 {name: "MOVDloadidx", argLength: 3, reg: gploadidx, asm: "MOVD", typ: "Int64"},
360 {name: "MOVHBRloadidx", argLength: 3, reg: gploadidx, asm: "MOVHBR", typ: "Int16"},
361 {name: "MOVWBRloadidx", argLength: 3, reg: gploadidx, asm: "MOVWBR", typ: "Int32"},
362 {name: "MOVDBRloadidx", argLength: 3, reg: gploadidx, asm: "MOVDBR", typ: "Int64"},
363 {name: "FMOVDloadidx", argLength: 3, reg: fploadidx, asm: "FMOVD", typ: "Float64"},
364 {name: "FMOVSloadidx", argLength: 3, reg: fploadidx, asm: "FMOVS", typ: "Float32"},
365
366
367
368 {name: "DCBT", argLength: 2, aux: "Int64", reg: prefreg, asm: "DCBT", hasSideEffects: true},
369
370
371
372 {name: "MOVDBRstore", argLength: 3, reg: gpstore, asm: "MOVDBR", typ: "Mem", faultOnNilArg0: true},
373 {name: "MOVWBRstore", argLength: 3, reg: gpstore, asm: "MOVWBR", typ: "Mem", faultOnNilArg0: true},
374 {name: "MOVHBRstore", argLength: 3, reg: gpstore, asm: "MOVHBR", typ: "Mem", faultOnNilArg0: true},
375
376
377 {name: "FMOVDload", argLength: 2, reg: fpload, asm: "FMOVD", aux: "SymOff", typ: "Float64", faultOnNilArg0: true, symEffect: "Read"},
378 {name: "FMOVSload", argLength: 2, reg: fpload, asm: "FMOVS", aux: "SymOff", typ: "Float32", faultOnNilArg0: true, symEffect: "Read"},
379
380
381 {name: "MOVBstore", argLength: 3, reg: gpstore, asm: "MOVB", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"},
382 {name: "MOVHstore", argLength: 3, reg: gpstore, asm: "MOVH", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"},
383 {name: "MOVWstore", argLength: 3, reg: gpstore, asm: "MOVW", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"},
384 {name: "MOVDstore", argLength: 3, reg: gpstore, asm: "MOVD", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"},
385
386
387 {name: "FMOVDstore", argLength: 3, reg: fpstore, asm: "FMOVD", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"},
388 {name: "FMOVSstore", argLength: 3, reg: fpstore, asm: "FMOVS", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"},
389
390
391
392 {name: "MOVBstoreidx", argLength: 4, reg: gpstoreidx, asm: "MOVB", typ: "Mem"},
393 {name: "MOVHstoreidx", argLength: 4, reg: gpstoreidx, asm: "MOVH", typ: "Mem"},
394 {name: "MOVWstoreidx", argLength: 4, reg: gpstoreidx, asm: "MOVW", typ: "Mem"},
395 {name: "MOVDstoreidx", argLength: 4, reg: gpstoreidx, asm: "MOVD", typ: "Mem"},
396 {name: "FMOVDstoreidx", argLength: 4, reg: fpstoreidx, asm: "FMOVD", typ: "Mem"},
397 {name: "FMOVSstoreidx", argLength: 4, reg: fpstoreidx, asm: "FMOVS", typ: "Mem"},
398 {name: "MOVHBRstoreidx", argLength: 4, reg: gpstoreidx, asm: "MOVHBR", typ: "Mem"},
399 {name: "MOVWBRstoreidx", argLength: 4, reg: gpstoreidx, asm: "MOVWBR", typ: "Mem"},
400 {name: "MOVDBRstoreidx", argLength: 4, reg: gpstoreidx, asm: "MOVDBR", typ: "Mem"},
401
402
403 {name: "MOVBstorezero", argLength: 2, reg: gpstorezero, asm: "MOVB", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"},
404 {name: "MOVHstorezero", argLength: 2, reg: gpstorezero, asm: "MOVH", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"},
405 {name: "MOVWstorezero", argLength: 2, reg: gpstorezero, asm: "MOVW", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"},
406 {name: "MOVDstorezero", argLength: 2, reg: gpstorezero, asm: "MOVD", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"},
407
408 {name: "MOVDaddr", argLength: 1, reg: regInfo{inputs: []regMask{sp | sb | gp}, outputs: []regMask{gp}}, aux: "SymOff", asm: "MOVD", rematerializeable: true, symEffect: "Addr"},
409
410 {name: "MOVDconst", argLength: 0, reg: gp01, aux: "Int64", asm: "MOVD", typ: "Int64", rematerializeable: true},
411 {name: "FMOVDconst", argLength: 0, reg: fp01, aux: "Float64", asm: "FMOVD", rematerializeable: true},
412 {name: "FMOVSconst", argLength: 0, reg: fp01, aux: "Float32", asm: "FMOVS", rematerializeable: true},
413 {name: "FCMPU", argLength: 2, reg: fp2cr, asm: "FCMPU", typ: "Flags"},
414
415 {name: "CMP", argLength: 2, reg: gp2cr, asm: "CMP", typ: "Flags"},
416 {name: "CMPU", argLength: 2, reg: gp2cr, asm: "CMPU", typ: "Flags"},
417 {name: "CMPW", argLength: 2, reg: gp2cr, asm: "CMPW", typ: "Flags"},
418 {name: "CMPWU", argLength: 2, reg: gp2cr, asm: "CMPWU", typ: "Flags"},
419 {name: "CMPconst", argLength: 1, reg: gp1cr, asm: "CMP", aux: "Int64", typ: "Flags"},
420 {name: "CMPUconst", argLength: 1, reg: gp1cr, asm: "CMPU", aux: "Int64", typ: "Flags"},
421 {name: "CMPWconst", argLength: 1, reg: gp1cr, asm: "CMPW", aux: "Int32", typ: "Flags"},
422 {name: "CMPWUconst", argLength: 1, reg: gp1cr, asm: "CMPWU", aux: "Int32", typ: "Flags"},
423
424
425
426
427
428 {name: "ISEL", argLength: 3, reg: crgp21, asm: "ISEL", aux: "Int32", typ: "Int32"},
429 {name: "ISELZ", argLength: 2, reg: crgp11, asm: "ISEL", aux: "Int32"},
430
431
432 {name: "SETBC", argLength: 1, reg: crgp, asm: "SETBC", aux: "Int32", typ: "Int32"},
433
434 {name: "SETBCR", argLength: 1, reg: crgp, asm: "SETBCR", aux: "Int32", typ: "Int32"},
435
436
437 {name: "Equal", argLength: 1, reg: crgp},
438 {name: "NotEqual", argLength: 1, reg: crgp},
439 {name: "LessThan", argLength: 1, reg: crgp},
440 {name: "FLessThan", argLength: 1, reg: crgp},
441 {name: "LessEqual", argLength: 1, reg: crgp},
442 {name: "FLessEqual", argLength: 1, reg: crgp},
443 {name: "GreaterThan", argLength: 1, reg: crgp},
444 {name: "FGreaterThan", argLength: 1, reg: crgp},
445 {name: "GreaterEqual", argLength: 1, reg: crgp},
446 {name: "FGreaterEqual", argLength: 1, reg: crgp},
447
448
449
450
451 {name: "LoweredGetClosurePtr", reg: regInfo{outputs: []regMask{ctxt}}, zeroWidth: true},
452
453
454 {name: "LoweredGetCallerSP", argLength: 1, reg: gp01, rematerializeable: true},
455
456
457
458
459
460 {name: "LoweredGetCallerPC", reg: gp01, rematerializeable: true},
461
462
463 {name: "LoweredNilCheck", argLength: 2, reg: regInfo{inputs: []regMask{gp | sp | sb}, clobbers: tmp}, clobberFlags: true, nilCheck: true, faultOnNilArg0: true},
464
465 {name: "LoweredRound32F", argLength: 1, reg: fp11, resultInArg0: true, zeroWidth: true},
466 {name: "LoweredRound64F", argLength: 1, reg: fp11, resultInArg0: true, zeroWidth: true},
467
468 {name: "CALLstatic", argLength: -1, reg: regInfo{clobbers: callerSave}, aux: "CallOff", clobberFlags: true, call: true},
469 {name: "CALLtail", argLength: -1, reg: regInfo{clobbers: callerSave}, aux: "CallOff", clobberFlags: true, call: true, tailCall: true},
470 {name: "CALLtailinter", argLength: -1, reg: regInfo{inputs: []regMask{callptr}, clobbers: callerSave}, aux: "CallOff", clobberFlags: true, call: true, tailCall: true},
471 {name: "CALLclosure", argLength: -1, reg: regInfo{inputs: []regMask{callptr, ctxt, 0}, clobbers: callerSave}, aux: "CallOff", clobberFlags: true, call: true},
472 {name: "CALLinter", argLength: -1, reg: regInfo{inputs: []regMask{callptr}, clobbers: callerSave}, aux: "CallOff", clobberFlags: true, call: true},
473
474
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 name: "LoweredZero",
503 aux: "Int64",
504 argLength: 2,
505 reg: regInfo{
506 inputs: []regMask{buildReg("R20")},
507 clobbers: buildReg("R20"),
508 },
509 clobberFlags: true,
510 typ: "Mem",
511 faultOnNilArg0: true,
512 unsafePoint: true,
513 },
514 {
515 name: "LoweredZeroShort",
516 aux: "Int64",
517 argLength: 2,
518 reg: regInfo{
519 inputs: []regMask{gp}},
520 typ: "Mem",
521 faultOnNilArg0: true,
522 unsafePoint: true,
523 },
524 {
525 name: "LoweredQuadZeroShort",
526 aux: "Int64",
527 argLength: 2,
528 reg: regInfo{
529 inputs: []regMask{gp},
530 },
531 typ: "Mem",
532 faultOnNilArg0: true,
533 unsafePoint: true,
534 },
535 {
536 name: "LoweredQuadZero",
537 aux: "Int64",
538 argLength: 2,
539 reg: regInfo{
540 inputs: []regMask{buildReg("R20")},
541 clobbers: buildReg("R20"),
542 },
543 clobberFlags: true,
544 typ: "Mem",
545 faultOnNilArg0: true,
546 unsafePoint: true,
547 },
548
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 name: "LoweredMove",
584 aux: "Int64",
585 argLength: 3,
586 reg: regInfo{
587 inputs: []regMask{buildReg("R20"), buildReg("R21")},
588 clobbers: buildReg("R20 R21"),
589 },
590 clobberFlags: true,
591 typ: "Mem",
592 faultOnNilArg0: true,
593 faultOnNilArg1: true,
594 unsafePoint: true,
595 },
596 {
597 name: "LoweredMoveShort",
598 aux: "Int64",
599 argLength: 3,
600 reg: regInfo{
601 inputs: []regMask{gp, gp},
602 },
603 typ: "Mem",
604 faultOnNilArg0: true,
605 faultOnNilArg1: true,
606 unsafePoint: true,
607 },
608
609
610
611
612 {
613 name: "LoweredQuadMove",
614 aux: "Int64",
615 argLength: 3,
616 reg: regInfo{
617 inputs: []regMask{buildReg("R20"), buildReg("R21")},
618 clobbers: buildReg("R20 R21"),
619 },
620 clobberFlags: true,
621 typ: "Mem",
622 faultOnNilArg0: true,
623 faultOnNilArg1: true,
624 unsafePoint: true,
625 },
626
627 {
628 name: "LoweredQuadMoveShort",
629 aux: "Int64",
630 argLength: 3,
631 reg: regInfo{
632 inputs: []regMask{gp, gp},
633 },
634 typ: "Mem",
635 faultOnNilArg0: true,
636 faultOnNilArg1: true,
637 unsafePoint: true,
638 },
639
640 {name: "LoweredAtomicStore8", argLength: 3, reg: gpstore, typ: "Mem", aux: "Int64", faultOnNilArg0: true, hasSideEffects: true},
641 {name: "LoweredAtomicStore32", argLength: 3, reg: gpstore, typ: "Mem", aux: "Int64", faultOnNilArg0: true, hasSideEffects: true},
642 {name: "LoweredAtomicStore64", argLength: 3, reg: gpstore, typ: "Mem", aux: "Int64", faultOnNilArg0: true, hasSideEffects: true},
643
644 {name: "LoweredAtomicLoad8", argLength: 2, reg: gpload, typ: "UInt8", aux: "Int64", clobberFlags: true, faultOnNilArg0: true},
645 {name: "LoweredAtomicLoad32", argLength: 2, reg: gpload, typ: "UInt32", aux: "Int64", clobberFlags: true, faultOnNilArg0: true},
646 {name: "LoweredAtomicLoad64", argLength: 2, reg: gpload, typ: "Int64", aux: "Int64", clobberFlags: true, faultOnNilArg0: true},
647 {name: "LoweredAtomicLoadPtr", argLength: 2, reg: gpload, typ: "Int64", aux: "Int64", clobberFlags: true, faultOnNilArg0: true},
648
649
650
651
652
653
654
655
656 {name: "LoweredAtomicAdd32", argLength: 3, reg: gpxchg, resultNotInArgs: true, clobberFlags: true, faultOnNilArg0: true, hasSideEffects: true},
657 {name: "LoweredAtomicAdd64", argLength: 3, reg: gpxchg, resultNotInArgs: true, clobberFlags: true, faultOnNilArg0: true, hasSideEffects: true},
658
659
660
661
662
663
664
665
666 {name: "LoweredAtomicExchange8", argLength: 3, reg: gpxchg, resultNotInArgs: true, clobberFlags: true, faultOnNilArg0: true, hasSideEffects: true},
667 {name: "LoweredAtomicExchange32", argLength: 3, reg: gpxchg, resultNotInArgs: true, clobberFlags: true, faultOnNilArg0: true, hasSideEffects: true},
668 {name: "LoweredAtomicExchange64", argLength: 3, reg: gpxchg, resultNotInArgs: true, clobberFlags: true, faultOnNilArg0: true, hasSideEffects: true},
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686 {name: "LoweredAtomicCas64", argLength: 4, reg: gpcas, resultNotInArgs: true, aux: "Int64", clobberFlags: true, faultOnNilArg0: true, hasSideEffects: true},
687 {name: "LoweredAtomicCas32", argLength: 4, reg: gpcas, resultNotInArgs: true, aux: "Int64", clobberFlags: true, faultOnNilArg0: true, hasSideEffects: true},
688
689
690
691
692
693
694
695 {name: "LoweredAtomicAnd8", argLength: 3, reg: gpstore, asm: "AND", faultOnNilArg0: true, hasSideEffects: true},
696 {name: "LoweredAtomicAnd32", argLength: 3, reg: gpstore, asm: "AND", faultOnNilArg0: true, hasSideEffects: true},
697 {name: "LoweredAtomicOr8", argLength: 3, reg: gpstore, asm: "OR", faultOnNilArg0: true, hasSideEffects: true},
698 {name: "LoweredAtomicOr32", argLength: 3, reg: gpstore, asm: "OR", faultOnNilArg0: true, hasSideEffects: true},
699
700
701
702
703
704 {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"},
705
706 {name: "LoweredPubBarrier", argLength: 1, asm: "LWSYNC", hasSideEffects: true},
707
708
709
710
711
712
713 {name: "LoweredPanicBoundsRR", argLength: 3, aux: "Int64", reg: regInfo{inputs: []regMask{first7, first7}}, typ: "Mem", call: true},
714 {name: "LoweredPanicBoundsRC", argLength: 2, aux: "PanicBoundsC", reg: regInfo{inputs: []regMask{first7}}, typ: "Mem", call: true},
715 {name: "LoweredPanicBoundsCR", argLength: 2, aux: "PanicBoundsC", reg: regInfo{inputs: []regMask{first7}}, typ: "Mem", call: true},
716 {name: "LoweredPanicBoundsCC", argLength: 1, aux: "PanicBoundsCC", reg: regInfo{}, typ: "Mem", call: true},
717
718
719
720
721
722
723 {name: "InvertFlags", argLength: 1},
724
725
726
727
728
729
730
731
732
733
734 {name: "FlagEQ"},
735 {name: "FlagLT"},
736 {name: "FlagGT"},
737 }
738
739 blocks := []blockData{
740 {name: "EQ", controls: 1},
741 {name: "NE", controls: 1},
742 {name: "LT", controls: 1},
743 {name: "LE", controls: 1},
744 {name: "GT", controls: 1},
745 {name: "GE", controls: 1},
746 {name: "FLT", controls: 1},
747 {name: "FLE", controls: 1},
748 {name: "FGT", controls: 1},
749 {name: "FGE", controls: 1},
750 }
751
752 archs = append(archs, arch{
753 name: "PPC64",
754 pkg: "cmd/internal/obj/ppc64",
755 genfile: "../../ppc64/ssa.go",
756 ops: ops,
757 blocks: blocks,
758 regnames: regNamesPPC64,
759 ParamIntRegNames: "R3 R4 R5 R6 R7 R8 R9 R10 R14 R15 R16 R17",
760 ParamFloatRegNames: "F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12",
761 gpregmask: gp,
762 fpregmask: fp,
763 specialregmask: xer,
764 framepointerreg: -1,
765 linkreg: -1,
766 })
767 }
768
View as plain text