Source file src/cmd/compile/internal/ssa/gen/PPC64Ops.go
1
2
3
4
5
6
7 package main
8
9 import "strings"
10
11
12
13
14
15
16
17
18
19 var regNamesPPC64 = []string{
20 "R0",
21 "SP",
22 "SB",
23 "R3",
24 "R4",
25 "R5",
26 "R6",
27 "R7",
28 "R8",
29 "R9",
30 "R10",
31 "R11",
32 "R12",
33 "R13",
34 "R14",
35 "R15",
36 "R16",
37 "R17",
38 "R18",
39 "R19",
40 "R20",
41 "R21",
42 "R22",
43 "R23",
44 "R24",
45 "R25",
46 "R26",
47 "R27",
48 "R28",
49 "R29",
50 "g",
51 "R31",
52
53 "F0",
54 "F1",
55 "F2",
56 "F3",
57 "F4",
58 "F5",
59 "F6",
60 "F7",
61 "F8",
62 "F9",
63 "F10",
64 "F11",
65 "F12",
66 "F13",
67 "F14",
68 "F15",
69 "F16",
70 "F17",
71 "F18",
72 "F19",
73 "F20",
74 "F21",
75 "F22",
76 "F23",
77 "F24",
78 "F25",
79 "F26",
80 "F27",
81 "F28",
82 "F29",
83 "F30",
84 "F31",
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99 }
100
101 func init() {
102
103 if len(regNamesPPC64) > 64 {
104 panic("too many registers")
105 }
106 num := map[string]int{}
107 for i, name := range regNamesPPC64 {
108 num[name] = i
109 }
110 buildReg := func(s string) regMask {
111 m := regMask(0)
112 for _, r := range strings.Split(s, " ") {
113 if n, ok := num[r]; ok {
114 m |= regMask(1) << uint(n)
115 continue
116 }
117 panic("register " + r + " not found")
118 }
119 return m
120 }
121
122 var (
123 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")
124 fp = buildReg("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")
125 sp = buildReg("SP")
126 sb = buildReg("SB")
127 gr = buildReg("g")
128
129
130
131 tmp = buildReg("R31")
132 ctxt = buildReg("R11")
133 callptr = buildReg("R12")
134
135 gp01 = regInfo{inputs: nil, outputs: []regMask{gp}}
136 gp11 = regInfo{inputs: []regMask{gp | sp | sb}, outputs: []regMask{gp}}
137 gp21 = regInfo{inputs: []regMask{gp | sp | sb, gp | sp | sb}, outputs: []regMask{gp}}
138 gp22 = regInfo{inputs: []regMask{gp | sp | sb, gp | sp | sb}, outputs: []regMask{gp, gp}}
139 gp32 = regInfo{inputs: []regMask{gp | sp | sb, gp | sp | sb, gp | sp | sb}, outputs: []regMask{gp, gp}}
140 gp1cr = regInfo{inputs: []regMask{gp | sp | sb}}
141 gp2cr = regInfo{inputs: []regMask{gp | sp | sb, gp | sp | sb}}
142 crgp = regInfo{inputs: nil, outputs: []regMask{gp}}
143 gpload = regInfo{inputs: []regMask{gp | sp | sb}, outputs: []regMask{gp}}
144 gploadidx = regInfo{inputs: []regMask{gp | sp | sb, gp}, outputs: []regMask{gp}}
145 gpstore = regInfo{inputs: []regMask{gp | sp | sb, gp | sp | sb}}
146 gpstoreidx = regInfo{inputs: []regMask{gp | sp | sb, gp | sp | sb, gp | sp | sb}}
147 gpstorezero = regInfo{inputs: []regMask{gp | sp | sb}}
148 gpxchg = regInfo{inputs: []regMask{gp | sp | sb, gp}, outputs: []regMask{gp}}
149 gpcas = regInfo{inputs: []regMask{gp | sp | sb, gp, gp}, outputs: []regMask{gp}}
150 fp01 = regInfo{inputs: nil, outputs: []regMask{fp}}
151 fp11 = regInfo{inputs: []regMask{fp}, outputs: []regMask{fp}}
152 fpgp = regInfo{inputs: []regMask{fp}, outputs: []regMask{gp}}
153 gpfp = regInfo{inputs: []regMask{gp}, outputs: []regMask{fp}}
154 fp21 = regInfo{inputs: []regMask{fp, fp}, outputs: []regMask{fp}}
155 fp31 = regInfo{inputs: []regMask{fp, fp, fp}, outputs: []regMask{fp}}
156 fp2cr = regInfo{inputs: []regMask{fp, fp}}
157 fpload = regInfo{inputs: []regMask{gp | sp | sb}, outputs: []regMask{fp}}
158 fploadidx = regInfo{inputs: []regMask{gp | sp | sb, gp | sp | sb}, outputs: []regMask{fp}}
159 fpstore = regInfo{inputs: []regMask{gp | sp | sb, fp}}
160 fpstoreidx = regInfo{inputs: []regMask{gp | sp | sb, gp | sp | sb, fp}}
161 callerSave = regMask(gp | fp | gr)
162 r3 = buildReg("R3")
163 r4 = buildReg("R4")
164 r5 = buildReg("R5")
165 r6 = buildReg("R6")
166 )
167 ops := []opData{
168 {name: "ADD", argLength: 2, reg: gp21, asm: "ADD", commutative: true},
169 {name: "ADDconst", argLength: 1, reg: gp11, asm: "ADD", aux: "Int64"},
170 {name: "FADD", argLength: 2, reg: fp21, asm: "FADD", commutative: true},
171 {name: "FADDS", argLength: 2, reg: fp21, asm: "FADDS", commutative: true},
172 {name: "SUB", argLength: 2, reg: gp21, asm: "SUB"},
173 {name: "FSUB", argLength: 2, reg: fp21, asm: "FSUB"},
174 {name: "FSUBS", argLength: 2, reg: fp21, asm: "FSUBS"},
175
176 {name: "MULLD", argLength: 2, reg: gp21, asm: "MULLD", typ: "Int64", commutative: true},
177 {name: "MULLW", argLength: 2, reg: gp21, asm: "MULLW", typ: "Int32", commutative: true},
178
179 {name: "MULHD", argLength: 2, reg: gp21, asm: "MULHD", commutative: true},
180 {name: "MULHW", argLength: 2, reg: gp21, asm: "MULHW", commutative: true},
181 {name: "MULHDU", argLength: 2, reg: gp21, asm: "MULHDU", commutative: true},
182 {name: "MULHWU", argLength: 2, reg: gp21, asm: "MULHWU", commutative: true},
183 {name: "LoweredMuluhilo", argLength: 2, reg: gp22, resultNotInArgs: true},
184
185 {name: "FMUL", argLength: 2, reg: fp21, asm: "FMUL", commutative: true},
186 {name: "FMULS", argLength: 2, reg: fp21, asm: "FMULS", commutative: true},
187
188 {name: "FMADD", argLength: 3, reg: fp31, asm: "FMADD"},
189 {name: "FMADDS", argLength: 3, reg: fp31, asm: "FMADDS"},
190 {name: "FMSUB", argLength: 3, reg: fp31, asm: "FMSUB"},
191 {name: "FMSUBS", argLength: 3, reg: fp31, asm: "FMSUBS"},
192
193 {name: "SRAD", argLength: 2, reg: gp21, asm: "SRAD"},
194 {name: "SRAW", argLength: 2, reg: gp21, asm: "SRAW"},
195 {name: "SRD", argLength: 2, reg: gp21, asm: "SRD"},
196 {name: "SRW", argLength: 2, reg: gp21, asm: "SRW"},
197 {name: "SLD", argLength: 2, reg: gp21, asm: "SLD"},
198 {name: "SLW", argLength: 2, reg: gp21, asm: "SLW"},
199
200 {name: "ROTL", argLength: 2, reg: gp21, asm: "ROTL"},
201 {name: "ROTLW", argLength: 2, reg: gp21, asm: "ROTLW"},
202
203 {name: "LoweredAdd64Carry", argLength: 3, reg: gp32, resultNotInArgs: true},
204 {name: "ADDconstForCarry", argLength: 1, reg: regInfo{inputs: []regMask{gp | sp | sb}, clobbers: tmp}, aux: "Int16", asm: "ADDC", typ: "Flags"},
205 {name: "MaskIfNotCarry", argLength: 1, reg: crgp, asm: "ADDME", typ: "Int64"},
206
207 {name: "SRADconst", argLength: 1, reg: gp11, asm: "SRAD", aux: "Int64"},
208 {name: "SRAWconst", argLength: 1, reg: gp11, asm: "SRAW", aux: "Int64"},
209 {name: "SRDconst", argLength: 1, reg: gp11, asm: "SRD", aux: "Int64"},
210 {name: "SRWconst", argLength: 1, reg: gp11, asm: "SRW", aux: "Int64"},
211 {name: "SLDconst", argLength: 1, reg: gp11, asm: "SLD", aux: "Int64"},
212 {name: "SLWconst", argLength: 1, reg: gp11, asm: "SLW", aux: "Int64"},
213
214 {name: "ROTLconst", argLength: 1, reg: gp11, asm: "ROTL", aux: "Int64"},
215 {name: "ROTLWconst", argLength: 1, reg: gp11, asm: "ROTLW", aux: "Int64"},
216
217 {name: "CNTLZD", argLength: 1, reg: gp11, asm: "CNTLZD", clobberFlags: true},
218 {name: "CNTLZW", argLength: 1, reg: gp11, asm: "CNTLZW", clobberFlags: true},
219
220 {name: "CNTTZD", argLength: 1, reg: gp11, asm: "CNTTZD"},
221 {name: "CNTTZW", argLength: 1, reg: gp11, asm: "CNTTZW"},
222
223 {name: "POPCNTD", argLength: 1, reg: gp11, asm: "POPCNTD"},
224 {name: "POPCNTW", argLength: 1, reg: gp11, asm: "POPCNTW"},
225 {name: "POPCNTB", argLength: 1, reg: gp11, asm: "POPCNTB"},
226
227 {name: "FDIV", argLength: 2, reg: fp21, asm: "FDIV"},
228 {name: "FDIVS", argLength: 2, reg: fp21, asm: "FDIVS"},
229
230 {name: "DIVD", argLength: 2, reg: gp21, asm: "DIVD", typ: "Int64"},
231 {name: "DIVW", argLength: 2, reg: gp21, asm: "DIVW", typ: "Int32"},
232 {name: "DIVDU", argLength: 2, reg: gp21, asm: "DIVDU", typ: "Int64"},
233 {name: "DIVWU", argLength: 2, reg: gp21, asm: "DIVWU", typ: "Int32"},
234
235
236
237
238 {name: "FCTIDZ", argLength: 1, reg: fp11, asm: "FCTIDZ", typ: "Float64"},
239 {name: "FCTIWZ", argLength: 1, reg: fp11, asm: "FCTIWZ", typ: "Float64"},
240 {name: "FCFID", argLength: 1, reg: fp11, asm: "FCFID", typ: "Float64"},
241 {name: "FCFIDS", argLength: 1, reg: fp11, asm: "FCFIDS", typ: "Float32"},
242 {name: "FRSP", argLength: 1, reg: fp11, asm: "FRSP", typ: "Float64"},
243
244
245
246
247
248
249
250 {name: "MFVSRD", argLength: 1, reg: fpgp, asm: "MFVSRD", typ: "Int64"},
251 {name: "MTVSRD", argLength: 1, reg: gpfp, asm: "MTVSRD", typ: "Float64"},
252
253 {name: "AND", argLength: 2, reg: gp21, asm: "AND", commutative: true},
254 {name: "ANDN", argLength: 2, reg: gp21, asm: "ANDN"},
255 {name: "ANDCC", argLength: 2, reg: gp21, asm: "ANDCC", commutative: true, typ: "Flags"},
256 {name: "OR", argLength: 2, reg: gp21, asm: "OR", commutative: true},
257 {name: "ORN", argLength: 2, reg: gp21, asm: "ORN"},
258 {name: "ORCC", argLength: 2, reg: gp21, asm: "ORCC", commutative: true, typ: "Flags"},
259 {name: "NOR", argLength: 2, reg: gp21, asm: "NOR", commutative: true},
260 {name: "XOR", argLength: 2, reg: gp21, asm: "XOR", typ: "Int64", commutative: true},
261 {name: "XORCC", argLength: 2, reg: gp21, asm: "XORCC", commutative: true, typ: "Flags"},
262 {name: "EQV", argLength: 2, reg: gp21, asm: "EQV", typ: "Int64", commutative: true},
263 {name: "NEG", argLength: 1, reg: gp11, asm: "NEG"},
264 {name: "FNEG", argLength: 1, reg: fp11, asm: "FNEG"},
265 {name: "FSQRT", argLength: 1, reg: fp11, asm: "FSQRT"},
266 {name: "FSQRTS", argLength: 1, reg: fp11, asm: "FSQRTS"},
267 {name: "FFLOOR", argLength: 1, reg: fp11, asm: "FRIM"},
268 {name: "FCEIL", argLength: 1, reg: fp11, asm: "FRIP"},
269 {name: "FTRUNC", argLength: 1, reg: fp11, asm: "FRIZ"},
270 {name: "FROUND", argLength: 1, reg: fp11, asm: "FRIN"},
271 {name: "FABS", argLength: 1, reg: fp11, asm: "FABS"},
272 {name: "FNABS", argLength: 1, reg: fp11, asm: "FNABS"},
273 {name: "FCPSGN", argLength: 2, reg: fp21, asm: "FCPSGN"},
274
275 {name: "ORconst", argLength: 1, reg: gp11, asm: "OR", aux: "Int64"},
276 {name: "XORconst", argLength: 1, reg: gp11, asm: "XOR", aux: "Int64"},
277 {name: "ANDconst", argLength: 1, reg: regInfo{inputs: []regMask{gp | sp | sb}, outputs: []regMask{gp}}, asm: "ANDCC", aux: "Int64", clobberFlags: true},
278 {name: "ANDCCconst", argLength: 1, reg: regInfo{inputs: []regMask{gp | sp | sb}}, asm: "ANDCC", aux: "Int64", typ: "Flags"},
279
280 {name: "MOVBreg", argLength: 1, reg: gp11, asm: "MOVB", typ: "Int64"},
281 {name: "MOVBZreg", argLength: 1, reg: gp11, asm: "MOVBZ", typ: "Int64"},
282 {name: "MOVHreg", argLength: 1, reg: gp11, asm: "MOVH", typ: "Int64"},
283 {name: "MOVHZreg", argLength: 1, reg: gp11, asm: "MOVHZ", typ: "Int64"},
284 {name: "MOVWreg", argLength: 1, reg: gp11, asm: "MOVW", typ: "Int64"},
285 {name: "MOVWZreg", argLength: 1, reg: gp11, asm: "MOVWZ", typ: "Int64"},
286
287
288 {name: "MOVBZload", argLength: 2, reg: gpload, asm: "MOVBZ", aux: "SymOff", typ: "UInt8", faultOnNilArg0: true, symEffect: "Read"},
289 {name: "MOVHload", argLength: 2, reg: gpload, asm: "MOVH", aux: "SymOff", typ: "Int16", faultOnNilArg0: true, symEffect: "Read"},
290 {name: "MOVHZload", argLength: 2, reg: gpload, asm: "MOVHZ", aux: "SymOff", typ: "UInt16", faultOnNilArg0: true, symEffect: "Read"},
291 {name: "MOVWload", argLength: 2, reg: gpload, asm: "MOVW", aux: "SymOff", typ: "Int32", faultOnNilArg0: true, symEffect: "Read"},
292 {name: "MOVWZload", argLength: 2, reg: gpload, asm: "MOVWZ", aux: "SymOff", typ: "UInt32", faultOnNilArg0: true, symEffect: "Read"},
293 {name: "MOVDload", argLength: 2, reg: gpload, asm: "MOVD", aux: "SymOff", typ: "Int64", faultOnNilArg0: true, symEffect: "Read"},
294
295
296
297
298 {name: "MOVDBRload", argLength: 2, reg: gpload, asm: "MOVDBR", aux: "SymOff", typ: "Int64", faultOnNilArg0: true, symEffect: "Read"},
299 {name: "MOVWBRload", argLength: 2, reg: gpload, asm: "MOVWBR", aux: "SymOff", typ: "Int32", faultOnNilArg0: true, symEffect: "Read"},
300 {name: "MOVHBRload", argLength: 2, reg: gpload, asm: "MOVHBR", aux: "SymOff", typ: "Int16", faultOnNilArg0: true, symEffect: "Read"},
301
302
303 {name: "MOVBZloadidx", argLength: 3, reg: gploadidx, asm: "MOVBZ", aux: "SymOff", typ: "UInt8", faultOnNilArg0: true, symEffect: "Read"},
304 {name: "MOVHloadidx", argLength: 3, reg: gploadidx, asm: "MOVH", aux: "SymOff", typ: "Int16", faultOnNilArg0: true, symEffect: "Read"},
305 {name: "MOVHZloadidx", argLength: 3, reg: gploadidx, asm: "MOVHZ", aux: "SymOff", typ: "UInt16", faultOnNilArg0: true, symEffect: "Read"},
306 {name: "MOVWloadidx", argLength: 3, reg: gploadidx, asm: "MOVW", aux: "SymOff", typ: "Int32", faultOnNilArg0: true, symEffect: "Read"},
307 {name: "MOVWZloadidx", argLength: 3, reg: gploadidx, asm: "MOVWZ", aux: "SymOff", typ: "UInt32", faultOnNilArg0: true, symEffect: "Read"},
308 {name: "MOVDloadidx", argLength: 3, reg: gploadidx, asm: "MOVD", aux: "SymOff", typ: "Int64", faultOnNilArg0: true, symEffect: "Read"},
309 {name: "MOVHBRloadidx", argLength: 3, reg: gploadidx, asm: "MOVHBR", aux: "SymOff", typ: "Int16", faultOnNilArg0: true, symEffect: "Read"},
310 {name: "MOVWBRloadidx", argLength: 3, reg: gploadidx, asm: "MOVWBR", aux: "SymOff", typ: "Int32", faultOnNilArg0: true, symEffect: "Read"},
311 {name: "MOVDBRloadidx", argLength: 3, reg: gploadidx, asm: "MOVDBR", aux: "SymOff", typ: "Int64", faultOnNilArg0: true, symEffect: "Read"},
312 {name: "FMOVDloadidx", argLength: 3, reg: fploadidx, asm: "FMOVD", aux: "SymOff", typ: "Float64", faultOnNilArg0: true, symEffect: "Read"},
313 {name: "FMOVSloadidx", argLength: 3, reg: fploadidx, asm: "FMOVS", aux: "SymOff", typ: "Float32", faultOnNilArg0: true, symEffect: "Read"},
314
315
316
317 {name: "MOVDBRstore", argLength: 3, reg: gpstore, asm: "MOVDBR", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"},
318 {name: "MOVWBRstore", argLength: 3, reg: gpstore, asm: "MOVWBR", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"},
319 {name: "MOVHBRstore", argLength: 3, reg: gpstore, asm: "MOVHBR", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"},
320
321
322 {name: "FMOVDload", argLength: 2, reg: fpload, asm: "FMOVD", aux: "SymOff", typ: "Float64", faultOnNilArg0: true, symEffect: "Read"},
323 {name: "FMOVSload", argLength: 2, reg: fpload, asm: "FMOVS", aux: "SymOff", typ: "Float32", faultOnNilArg0: true, symEffect: "Read"},
324
325
326 {name: "MOVBstore", argLength: 3, reg: gpstore, asm: "MOVB", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"},
327 {name: "MOVHstore", argLength: 3, reg: gpstore, asm: "MOVH", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"},
328 {name: "MOVWstore", argLength: 3, reg: gpstore, asm: "MOVW", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"},
329 {name: "MOVDstore", argLength: 3, reg: gpstore, asm: "MOVD", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"},
330
331
332 {name: "FMOVDstore", argLength: 3, reg: fpstore, asm: "FMOVD", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"},
333 {name: "FMOVSstore", argLength: 3, reg: fpstore, asm: "FMOVS", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"},
334
335
336 {name: "MOVBstoreidx", argLength: 4, reg: gpstoreidx, asm: "MOVB", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"},
337 {name: "MOVHstoreidx", argLength: 4, reg: gpstoreidx, asm: "MOVH", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"},
338 {name: "MOVWstoreidx", argLength: 4, reg: gpstoreidx, asm: "MOVW", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"},
339 {name: "MOVDstoreidx", argLength: 4, reg: gpstoreidx, asm: "MOVD", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"},
340 {name: "FMOVDstoreidx", argLength: 4, reg: fpstoreidx, asm: "FMOVD", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"},
341 {name: "FMOVSstoreidx", argLength: 4, reg: fpstoreidx, asm: "FMOVS", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"},
342 {name: "MOVHBRstoreidx", argLength: 4, reg: gpstoreidx, asm: "MOVHBR", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"},
343 {name: "MOVWBRstoreidx", argLength: 4, reg: gpstoreidx, asm: "MOVWBR", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"},
344 {name: "MOVDBRstoreidx", argLength: 4, reg: gpstoreidx, asm: "MOVDBR", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"},
345
346
347 {name: "MOVBstorezero", argLength: 2, reg: gpstorezero, asm: "MOVB", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"},
348 {name: "MOVHstorezero", argLength: 2, reg: gpstorezero, asm: "MOVH", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"},
349 {name: "MOVWstorezero", argLength: 2, reg: gpstorezero, asm: "MOVW", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"},
350 {name: "MOVDstorezero", argLength: 2, reg: gpstorezero, asm: "MOVD", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"},
351
352 {name: "MOVDaddr", argLength: 1, reg: regInfo{inputs: []regMask{sp | sb | gp}, outputs: []regMask{gp}}, aux: "SymOff", asm: "MOVD", rematerializeable: true, symEffect: "Addr"},
353
354 {name: "MOVDconst", argLength: 0, reg: gp01, aux: "Int64", asm: "MOVD", typ: "Int64", rematerializeable: true},
355 {name: "FMOVDconst", argLength: 0, reg: fp01, aux: "Float64", asm: "FMOVD", rematerializeable: true},
356 {name: "FMOVSconst", argLength: 0, reg: fp01, aux: "Float32", asm: "FMOVS", rematerializeable: true},
357 {name: "FCMPU", argLength: 2, reg: fp2cr, asm: "FCMPU", typ: "Flags"},
358
359 {name: "CMP", argLength: 2, reg: gp2cr, asm: "CMP", typ: "Flags"},
360 {name: "CMPU", argLength: 2, reg: gp2cr, asm: "CMPU", typ: "Flags"},
361 {name: "CMPW", argLength: 2, reg: gp2cr, asm: "CMPW", typ: "Flags"},
362 {name: "CMPWU", argLength: 2, reg: gp2cr, asm: "CMPWU", typ: "Flags"},
363 {name: "CMPconst", argLength: 1, reg: gp1cr, asm: "CMP", aux: "Int64", typ: "Flags"},
364 {name: "CMPUconst", argLength: 1, reg: gp1cr, asm: "CMPU", aux: "Int64", typ: "Flags"},
365 {name: "CMPWconst", argLength: 1, reg: gp1cr, asm: "CMPW", aux: "Int32", typ: "Flags"},
366 {name: "CMPWUconst", argLength: 1, reg: gp1cr, asm: "CMPWU", aux: "Int32", typ: "Flags"},
367
368
369 {name: "Equal", argLength: 1, reg: crgp},
370 {name: "NotEqual", argLength: 1, reg: crgp},
371 {name: "LessThan", argLength: 1, reg: crgp},
372 {name: "FLessThan", argLength: 1, reg: crgp},
373 {name: "LessEqual", argLength: 1, reg: crgp},
374 {name: "FLessEqual", argLength: 1, reg: crgp},
375 {name: "GreaterThan", argLength: 1, reg: crgp},
376 {name: "FGreaterThan", argLength: 1, reg: crgp},
377 {name: "GreaterEqual", argLength: 1, reg: crgp},
378 {name: "FGreaterEqual", argLength: 1, reg: crgp},
379
380
381
382
383 {name: "LoweredGetClosurePtr", reg: regInfo{outputs: []regMask{ctxt}}, zeroWidth: true},
384
385
386 {name: "LoweredGetCallerSP", reg: gp01, rematerializeable: true},
387
388
389
390
391
392 {name: "LoweredGetCallerPC", reg: gp01, rematerializeable: true},
393
394
395 {name: "LoweredNilCheck", argLength: 2, reg: regInfo{inputs: []regMask{gp | sp | sb}, clobbers: tmp}, clobberFlags: true, nilCheck: true, faultOnNilArg0: true},
396
397 {name: "LoweredRound32F", argLength: 1, reg: fp11, resultInArg0: true, zeroWidth: true},
398 {name: "LoweredRound64F", argLength: 1, reg: fp11, resultInArg0: true, zeroWidth: true},
399
400 {name: "CALLstatic", argLength: 1, reg: regInfo{clobbers: callerSave}, aux: "SymOff", clobberFlags: true, call: true, symEffect: "None"},
401 {name: "CALLclosure", argLength: 3, reg: regInfo{inputs: []regMask{callptr, ctxt, 0}, clobbers: callerSave}, aux: "Int64", clobberFlags: true, call: true},
402 {name: "CALLinter", argLength: 2, reg: regInfo{inputs: []regMask{callptr}, clobbers: callerSave}, aux: "Int64", clobberFlags: true, call: true},
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431 {
432 name: "LoweredZero",
433 aux: "Int64",
434 argLength: 2,
435 reg: regInfo{
436 inputs: []regMask{buildReg("R3")},
437 clobbers: buildReg("R3"),
438 },
439 clobberFlags: true,
440 typ: "Mem",
441 faultOnNilArg0: true,
442 },
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471 {
472 name: "LoweredMove",
473 aux: "Int64",
474 argLength: 3,
475 reg: regInfo{
476 inputs: []regMask{buildReg("R3"), buildReg("R4")},
477 clobbers: buildReg("R3 R4 R7 R8 R9 R10"),
478 },
479 clobberFlags: true,
480 typ: "Mem",
481 faultOnNilArg0: true,
482 faultOnNilArg1: true,
483 },
484
485 {name: "LoweredAtomicStore32", argLength: 3, reg: gpstore, typ: "Mem", aux: "Int64", faultOnNilArg0: true, hasSideEffects: true},
486 {name: "LoweredAtomicStore64", argLength: 3, reg: gpstore, typ: "Mem", aux: "Int64", faultOnNilArg0: true, hasSideEffects: true},
487
488 {name: "LoweredAtomicLoad8", argLength: 2, reg: gpload, typ: "UInt8", aux: "Int64", clobberFlags: true, faultOnNilArg0: true},
489 {name: "LoweredAtomicLoad32", argLength: 2, reg: gpload, typ: "UInt32", aux: "Int64", clobberFlags: true, faultOnNilArg0: true},
490 {name: "LoweredAtomicLoad64", argLength: 2, reg: gpload, typ: "Int64", aux: "Int64", clobberFlags: true, faultOnNilArg0: true},
491 {name: "LoweredAtomicLoadPtr", argLength: 2, reg: gpload, typ: "Int64", aux: "Int64", clobberFlags: true, faultOnNilArg0: true},
492
493
494
495
496
497
498
499
500
501
502 {name: "LoweredAtomicAdd32", argLength: 3, reg: gpxchg, resultNotInArgs: true, clobberFlags: true, faultOnNilArg0: true, hasSideEffects: true},
503 {name: "LoweredAtomicAdd64", argLength: 3, reg: gpxchg, resultNotInArgs: true, clobberFlags: true, faultOnNilArg0: true, hasSideEffects: true},
504
505
506
507
508
509
510
511
512
513 {name: "LoweredAtomicExchange32", argLength: 3, reg: gpxchg, resultNotInArgs: true, clobberFlags: true, faultOnNilArg0: true, hasSideEffects: true},
514 {name: "LoweredAtomicExchange64", argLength: 3, reg: gpxchg, resultNotInArgs: true, clobberFlags: true, faultOnNilArg0: true, hasSideEffects: true},
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532 {name: "LoweredAtomicCas64", argLength: 4, reg: gpcas, resultNotInArgs: true, aux: "Int64", clobberFlags: true, faultOnNilArg0: true, hasSideEffects: true},
533 {name: "LoweredAtomicCas32", argLength: 4, reg: gpcas, resultNotInArgs: true, aux: "Int64", clobberFlags: true, faultOnNilArg0: true, hasSideEffects: true},
534
535
536
537
538
539
540
541
542 {name: "LoweredAtomicAnd8", argLength: 3, reg: gpstore, asm: "AND", faultOnNilArg0: true, hasSideEffects: true},
543 {name: "LoweredAtomicOr8", argLength: 3, reg: gpstore, asm: "OR", faultOnNilArg0: true, hasSideEffects: true},
544
545
546
547
548 {name: "LoweredWB", argLength: 3, reg: regInfo{inputs: []regMask{buildReg("R20"), buildReg("R21")}, clobbers: (callerSave &^ buildReg("R0 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R14 R15 R20 R21 g")) | buildReg("R31")}, clobberFlags: true, aux: "Sym", symEffect: "None"},
549
550
551
552
553 {name: "LoweredPanicBoundsA", argLength: 3, aux: "Int64", reg: regInfo{inputs: []regMask{r5, r6}}, typ: "Mem"},
554 {name: "LoweredPanicBoundsB", argLength: 3, aux: "Int64", reg: regInfo{inputs: []regMask{r4, r5}}, typ: "Mem"},
555 {name: "LoweredPanicBoundsC", argLength: 3, aux: "Int64", reg: regInfo{inputs: []regMask{r3, r4}}, typ: "Mem"},
556
557
558
559
560
561
562 {name: "InvertFlags", argLength: 1},
563
564
565
566
567
568
569
570
571
572
573 {name: "FlagEQ"},
574 {name: "FlagLT"},
575 {name: "FlagGT"},
576
577 }
578
579 blocks := []blockData{
580 {name: "EQ"},
581 {name: "NE"},
582 {name: "LT"},
583 {name: "LE"},
584 {name: "GT"},
585 {name: "GE"},
586 {name: "FLT"},
587 {name: "FLE"},
588 {name: "FGT"},
589 {name: "FGE"},
590 }
591
592 archs = append(archs, arch{
593 name: "PPC64",
594 pkg: "cmd/internal/obj/ppc64",
595 genfile: "../../ppc64/ssa.go",
596 ops: ops,
597 blocks: blocks,
598 regnames: regNamesPPC64,
599 gpregmask: gp,
600 fpregmask: fp,
601 framepointerreg: int8(num["SP"]),
602 linkreg: -1,
603 })
604 }
605
View as plain text