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", addrSinkArg0: true},
339 {name: "MOVHload", argLength: 2, reg: gpload, asm: "MOVH", aux: "SymOff", typ: "Int16", faultOnNilArg0: true, symEffect: "Read", addrSinkArg0: true},
340 {name: "MOVHZload", argLength: 2, reg: gpload, asm: "MOVHZ", aux: "SymOff", typ: "UInt16", faultOnNilArg0: true, symEffect: "Read", addrSinkArg0: true},
341 {name: "MOVWload", argLength: 2, reg: gpload, asm: "MOVW", aux: "SymOff", typ: "Int32", faultOnNilArg0: true, symEffect: "Read", addrSinkArg0: true},
342 {name: "MOVWZload", argLength: 2, reg: gpload, asm: "MOVWZ", aux: "SymOff", typ: "UInt32", faultOnNilArg0: true, symEffect: "Read", addrSinkArg0: true},
343 {name: "MOVDload", argLength: 2, reg: gpload, asm: "MOVD", aux: "SymOff", typ: "Int64", faultOnNilArg0: true, symEffect: "Read", addrSinkArg0: true},
344
345
346
347
348 {name: "MOVDBRload", argLength: 2, reg: gpload, asm: "MOVDBR", typ: "UInt64", faultOnNilArg0: true, addrSinkArg0: true},
349 {name: "MOVWBRload", argLength: 2, reg: gpload, asm: "MOVWBR", typ: "UInt32", faultOnNilArg0: true, addrSinkArg0: true},
350 {name: "MOVHBRload", argLength: 2, reg: gpload, asm: "MOVHBR", typ: "UInt16", faultOnNilArg0: true, addrSinkArg0: true},
351
352
353
354 {name: "MOVBZloadidx", argLength: 3, reg: gploadidx, asm: "MOVBZ", typ: "UInt8", addrSinkArg0: true, addrSinkArg1: true},
355 {name: "MOVHloadidx", argLength: 3, reg: gploadidx, asm: "MOVH", typ: "Int16", addrSinkArg0: true, addrSinkArg1: true},
356 {name: "MOVHZloadidx", argLength: 3, reg: gploadidx, asm: "MOVHZ", typ: "UInt16", addrSinkArg0: true, addrSinkArg1: true},
357 {name: "MOVWloadidx", argLength: 3, reg: gploadidx, asm: "MOVW", typ: "Int32", addrSinkArg0: true, addrSinkArg1: true},
358 {name: "MOVWZloadidx", argLength: 3, reg: gploadidx, asm: "MOVWZ", typ: "UInt32", addrSinkArg0: true, addrSinkArg1: true},
359 {name: "MOVDloadidx", argLength: 3, reg: gploadidx, asm: "MOVD", typ: "Int64", addrSinkArg0: true, addrSinkArg1: true},
360 {name: "MOVHBRloadidx", argLength: 3, reg: gploadidx, asm: "MOVHBR", typ: "Int16", addrSinkArg0: true, addrSinkArg1: true},
361 {name: "MOVWBRloadidx", argLength: 3, reg: gploadidx, asm: "MOVWBR", typ: "Int32", addrSinkArg0: true, addrSinkArg1: true},
362 {name: "MOVDBRloadidx", argLength: 3, reg: gploadidx, asm: "MOVDBR", typ: "Int64", addrSinkArg0: true, addrSinkArg1: true},
363 {name: "FMOVDloadidx", argLength: 3, reg: fploadidx, asm: "FMOVD", typ: "Float64", addrSinkArg0: true, addrSinkArg1: true},
364 {name: "FMOVSloadidx", argLength: 3, reg: fploadidx, asm: "FMOVS", typ: "Float32", addrSinkArg0: true, addrSinkArg1: true},
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, addrSinkArg0: true},
373 {name: "MOVWBRstore", argLength: 3, reg: gpstore, asm: "MOVWBR", typ: "Mem", faultOnNilArg0: true, addrSinkArg0: true},
374 {name: "MOVHBRstore", argLength: 3, reg: gpstore, asm: "MOVHBR", typ: "Mem", faultOnNilArg0: true, addrSinkArg0: true},
375
376
377 {name: "FMOVDload", argLength: 2, reg: fpload, asm: "FMOVD", aux: "SymOff", typ: "Float64", faultOnNilArg0: true, symEffect: "Read", addrSinkArg0: true},
378 {name: "FMOVSload", argLength: 2, reg: fpload, asm: "FMOVS", aux: "SymOff", typ: "Float32", faultOnNilArg0: true, symEffect: "Read", addrSinkArg0: true},
379
380
381 {name: "MOVBstore", argLength: 3, reg: gpstore, asm: "MOVB", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write", addrSinkArg0: true},
382 {name: "MOVHstore", argLength: 3, reg: gpstore, asm: "MOVH", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write", addrSinkArg0: true},
383 {name: "MOVWstore", argLength: 3, reg: gpstore, asm: "MOVW", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write", addrSinkArg0: true},
384 {name: "MOVDstore", argLength: 3, reg: gpstore, asm: "MOVD", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write", addrSinkArg0: true},
385
386
387 {name: "FMOVDstore", argLength: 3, reg: fpstore, asm: "FMOVD", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write", addrSinkArg0: true},
388 {name: "FMOVSstore", argLength: 3, reg: fpstore, asm: "FMOVS", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write", addrSinkArg0: true},
389
390
391
392 {name: "MOVBstoreidx", argLength: 4, reg: gpstoreidx, asm: "MOVB", typ: "Mem", addrSinkArg0: true, addrSinkArg1: true},
393 {name: "MOVHstoreidx", argLength: 4, reg: gpstoreidx, asm: "MOVH", typ: "Mem", addrSinkArg0: true, addrSinkArg1: true},
394 {name: "MOVWstoreidx", argLength: 4, reg: gpstoreidx, asm: "MOVW", typ: "Mem", addrSinkArg0: true, addrSinkArg1: true},
395 {name: "MOVDstoreidx", argLength: 4, reg: gpstoreidx, asm: "MOVD", typ: "Mem", addrSinkArg0: true, addrSinkArg1: true},
396 {name: "FMOVDstoreidx", argLength: 4, reg: fpstoreidx, asm: "FMOVD", typ: "Mem", addrSinkArg0: true, addrSinkArg1: true},
397 {name: "FMOVSstoreidx", argLength: 4, reg: fpstoreidx, asm: "FMOVS", typ: "Mem", addrSinkArg0: true, addrSinkArg1: true},
398 {name: "MOVHBRstoreidx", argLength: 4, reg: gpstoreidx, asm: "MOVHBR", typ: "Mem", addrSinkArg0: true, addrSinkArg1: true},
399 {name: "MOVWBRstoreidx", argLength: 4, reg: gpstoreidx, asm: "MOVWBR", typ: "Mem", addrSinkArg0: true, addrSinkArg1: true},
400 {name: "MOVDBRstoreidx", argLength: 4, reg: gpstoreidx, asm: "MOVDBR", typ: "Mem", addrSinkArg0: true, addrSinkArg1: true},
401
402
403 {name: "MOVBstorezero", argLength: 2, reg: gpstorezero, asm: "MOVB", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write", addrSinkArg0: true},
404 {name: "MOVHstorezero", argLength: 2, reg: gpstorezero, asm: "MOVH", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write", addrSinkArg0: true},
405 {name: "MOVWstorezero", argLength: 2, reg: gpstorezero, asm: "MOVW", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write", addrSinkArg0: true},
406 {name: "MOVDstorezero", argLength: 2, reg: gpstorezero, asm: "MOVD", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write", addrSinkArg0: true},
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: "CALLclosure", argLength: -1, reg: regInfo{inputs: []regMask{callptr, ctxt, 0}, clobbers: callerSave}, aux: "CallOff", clobberFlags: true, call: true},
471 {name: "CALLinter", argLength: -1, reg: regInfo{inputs: []regMask{callptr}, clobbers: callerSave}, aux: "CallOff", clobberFlags: true, call: true},
472
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 name: "LoweredZero",
502 aux: "Int64",
503 argLength: 2,
504 reg: regInfo{
505 inputs: []regMask{buildReg("R20")},
506 clobbers: buildReg("R20"),
507 },
508 clobberFlags: true,
509 typ: "Mem",
510 faultOnNilArg0: true,
511 unsafePoint: true,
512 addrSinkArg0: 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 addrSinkArg0: true,
524 },
525 {
526 name: "LoweredQuadZeroShort",
527 aux: "Int64",
528 argLength: 2,
529 reg: regInfo{
530 inputs: []regMask{gp},
531 },
532 typ: "Mem",
533 faultOnNilArg0: true,
534 unsafePoint: true,
535 addrSinkArg0: 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 addrSinkArg0: true,
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 {
586 name: "LoweredMove",
587 aux: "Int64",
588 argLength: 3,
589 reg: regInfo{
590 inputs: []regMask{buildReg("R20"), buildReg("R21")},
591 clobbers: buildReg("R20 R21"),
592 },
593 clobberFlags: true,
594 typ: "Mem",
595 faultOnNilArg0: true,
596 faultOnNilArg1: true,
597 unsafePoint: true,
598 addrSinkArg0: true,
599 addrSinkArg1: true,
600 },
601 {
602 name: "LoweredMoveShort",
603 aux: "Int64",
604 argLength: 3,
605 reg: regInfo{
606 inputs: []regMask{gp, gp},
607 },
608 typ: "Mem",
609 faultOnNilArg0: true,
610 faultOnNilArg1: true,
611 unsafePoint: true,
612 addrSinkArg0: true,
613 addrSinkArg1: true,
614 },
615
616
617
618
619 {
620 name: "LoweredQuadMove",
621 aux: "Int64",
622 argLength: 3,
623 reg: regInfo{
624 inputs: []regMask{buildReg("R20"), buildReg("R21")},
625 clobbers: buildReg("R20 R21"),
626 },
627 clobberFlags: true,
628 typ: "Mem",
629 faultOnNilArg0: true,
630 faultOnNilArg1: true,
631 unsafePoint: true,
632 addrSinkArg0: true,
633 addrSinkArg1: true,
634 },
635
636 {
637 name: "LoweredQuadMoveShort",
638 aux: "Int64",
639 argLength: 3,
640 reg: regInfo{
641 inputs: []regMask{gp, gp},
642 },
643 typ: "Mem",
644 faultOnNilArg0: true,
645 faultOnNilArg1: true,
646 unsafePoint: true,
647 addrSinkArg0: true,
648 addrSinkArg1: true,
649 },
650
651 {name: "LoweredAtomicStore8", argLength: 3, reg: gpstore, typ: "Mem", aux: "Int64", faultOnNilArg0: true, hasSideEffects: true},
652 {name: "LoweredAtomicStore32", argLength: 3, reg: gpstore, typ: "Mem", aux: "Int64", faultOnNilArg0: true, hasSideEffects: true},
653 {name: "LoweredAtomicStore64", argLength: 3, reg: gpstore, typ: "Mem", aux: "Int64", faultOnNilArg0: true, hasSideEffects: true},
654
655 {name: "LoweredAtomicLoad8", argLength: 2, reg: gpload, typ: "UInt8", aux: "Int64", clobberFlags: true, faultOnNilArg0: true},
656 {name: "LoweredAtomicLoad32", argLength: 2, reg: gpload, typ: "UInt32", aux: "Int64", clobberFlags: true, faultOnNilArg0: true},
657 {name: "LoweredAtomicLoad64", argLength: 2, reg: gpload, typ: "Int64", aux: "Int64", clobberFlags: true, faultOnNilArg0: true},
658 {name: "LoweredAtomicLoadPtr", argLength: 2, reg: gpload, typ: "Int64", aux: "Int64", clobberFlags: true, faultOnNilArg0: true},
659
660
661
662
663
664
665
666
667 {name: "LoweredAtomicAdd32", argLength: 3, reg: gpxchg, resultNotInArgs: true, clobberFlags: true, faultOnNilArg0: true, hasSideEffects: true},
668 {name: "LoweredAtomicAdd64", argLength: 3, reg: gpxchg, resultNotInArgs: true, clobberFlags: true, faultOnNilArg0: true, hasSideEffects: true},
669
670
671
672
673
674
675
676
677 {name: "LoweredAtomicExchange8", argLength: 3, reg: gpxchg, resultNotInArgs: true, clobberFlags: true, faultOnNilArg0: true, hasSideEffects: true},
678 {name: "LoweredAtomicExchange32", argLength: 3, reg: gpxchg, resultNotInArgs: true, clobberFlags: true, faultOnNilArg0: true, hasSideEffects: true},
679 {name: "LoweredAtomicExchange64", argLength: 3, reg: gpxchg, resultNotInArgs: true, clobberFlags: true, faultOnNilArg0: true, hasSideEffects: true},
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697 {name: "LoweredAtomicCas64", argLength: 4, reg: gpcas, resultNotInArgs: true, aux: "Int64", clobberFlags: true, faultOnNilArg0: true, hasSideEffects: true},
698 {name: "LoweredAtomicCas32", argLength: 4, reg: gpcas, resultNotInArgs: true, aux: "Int64", clobberFlags: true, faultOnNilArg0: true, hasSideEffects: true},
699
700
701
702
703
704
705
706 {name: "LoweredAtomicAnd8", argLength: 3, reg: gpstore, asm: "AND", faultOnNilArg0: true, hasSideEffects: true},
707 {name: "LoweredAtomicAnd32", argLength: 3, reg: gpstore, asm: "AND", faultOnNilArg0: true, hasSideEffects: true},
708 {name: "LoweredAtomicOr8", argLength: 3, reg: gpstore, asm: "OR", faultOnNilArg0: true, hasSideEffects: true},
709 {name: "LoweredAtomicOr32", argLength: 3, reg: gpstore, asm: "OR", faultOnNilArg0: true, hasSideEffects: true},
710
711
712
713
714
715 {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"},
716
717 {name: "LoweredPubBarrier", argLength: 1, asm: "LWSYNC", hasSideEffects: true},
718
719
720
721
722
723
724 {name: "LoweredPanicBoundsRR", argLength: 3, aux: "Int64", reg: regInfo{inputs: []regMask{first7, first7}}, typ: "Mem", call: true},
725 {name: "LoweredPanicBoundsRC", argLength: 2, aux: "PanicBoundsC", reg: regInfo{inputs: []regMask{first7}}, typ: "Mem", call: true},
726 {name: "LoweredPanicBoundsCR", argLength: 2, aux: "PanicBoundsC", reg: regInfo{inputs: []regMask{first7}}, typ: "Mem", call: true},
727 {name: "LoweredPanicBoundsCC", argLength: 1, aux: "PanicBoundsCC", reg: regInfo{}, typ: "Mem", call: true},
728
729
730
731
732
733
734 {name: "InvertFlags", argLength: 1},
735
736
737
738
739
740
741
742
743
744
745 {name: "FlagEQ"},
746 {name: "FlagLT"},
747 {name: "FlagGT"},
748 }
749
750 blocks := []blockData{
751 {name: "EQ", controls: 1},
752 {name: "NE", controls: 1},
753 {name: "LT", controls: 1},
754 {name: "LE", controls: 1},
755 {name: "GT", controls: 1},
756 {name: "GE", controls: 1},
757 {name: "FLT", controls: 1},
758 {name: "FLE", controls: 1},
759 {name: "FGT", controls: 1},
760 {name: "FGE", controls: 1},
761 }
762
763 archs = append(archs, arch{
764 name: "PPC64",
765 pkg: "cmd/internal/obj/ppc64",
766 genfile: "../../ppc64/ssa.go",
767 ops: ops,
768 blocks: blocks,
769 regnames: regNamesPPC64,
770 ParamIntRegNames: "R3 R4 R5 R6 R7 R8 R9 R10 R14 R15 R16 R17",
771 ParamFloatRegNames: "F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12",
772 gpregmask: gp,
773 fpregmask: fp,
774 specialregmask: xer,
775 framepointerreg: -1,
776 linkreg: -1,
777 })
778 }
779
View as plain text