1
2
3
4
5 package main
6
7 import (
8 "fmt"
9 )
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 const (
25 riscv64REG_G = 27
26 riscv64REG_CTXT = 26
27 riscv64REG_LR = 1
28 riscv64REG_SP = 2
29 riscv64REG_GP = 3
30 riscv64REG_TP = 4
31 riscv64REG_TMP = 31
32 riscv64REG_ZERO = 0
33 )
34
35 func riscv64RegName(r int) string {
36 switch {
37 case r == riscv64REG_G:
38 return "g"
39 case r == riscv64REG_SP:
40 return "SP"
41 case 0 <= r && r <= 31:
42 return fmt.Sprintf("X%d", r)
43 case 32 <= r && r <= 63:
44 return fmt.Sprintf("F%d", r-32)
45 default:
46 panic(fmt.Sprintf("unknown register %d", r))
47 }
48 }
49
50 func init() {
51 var regNamesRISCV64 []string
52 var gpMask, fpMask, gpgMask, gpspMask, gpspsbMask, gpspsbgMask, first16Mask regMask
53 regNamed := make(map[string]regMask)
54
55
56
57
58
59 addreg := func(r int, name string) regMask {
60 mask := regMaskAt(uint(len(regNamesRISCV64)))
61 if name == "" {
62 name = riscv64RegName(r)
63 }
64 regNamesRISCV64 = append(regNamesRISCV64, name)
65 regNamed[name] = mask
66 return mask
67 }
68
69
70 for r := 0; r <= 31; r++ {
71 if r == riscv64REG_LR {
72
73
74 continue
75 }
76
77 mask := addreg(r, "")
78
79
80 switch r {
81
82 case riscv64REG_ZERO, riscv64REG_GP, riscv64REG_TP, riscv64REG_TMP:
83 case riscv64REG_G:
84 gpgMask = gpgMask.union(mask)
85 gpspsbgMask = gpspsbgMask.union(mask)
86 case riscv64REG_SP:
87 gpspMask = gpspMask.union(mask)
88 gpspsbMask = gpspsbMask.union(mask)
89 gpspsbgMask = gpspsbgMask.union(mask)
90 default:
91 gpMask = gpMask.union(mask)
92 gpgMask = gpgMask.union(mask)
93 gpspMask = gpspMask.union(mask)
94 gpspsbMask = gpspsbMask.union(mask)
95 gpspsbgMask = gpspsbgMask.union(mask)
96 if r >= 5 && r < 5+16 {
97 first16Mask = first16Mask.union(mask)
98 }
99 }
100 }
101
102
103 for r := 32; r <= 63; r++ {
104 mask := addreg(r, "")
105 fpMask = fpMask.union(mask)
106 }
107
108
109 mask := addreg(-1, "SB")
110 gpspsbMask = gpspsbMask.union(mask)
111 gpspsbgMask = gpspsbgMask.union(mask)
112
113 if len(regNamesRISCV64) > 64 {
114
115 panic("Too many RISCV64 registers")
116 }
117
118 regCtxt := regNamed["X26"]
119 callerSave := gpMask.union(fpMask).union(regNamed["g"])
120 r5toR6 := regNamed["X5"].union(regNamed["X6"])
121 regX5 := regNamed["X5"]
122
123 var (
124 gpstore = regInfo{inputs: []regMask{gpspsbMask, gpspMask, regMask{}}}
125 gpstore0 = regInfo{inputs: []regMask{gpspsbMask}}
126 gp01 = regInfo{outputs: []regMask{gpMask}}
127 gp11 = regInfo{inputs: []regMask{gpMask}, outputs: []regMask{gpMask}}
128 gp21 = regInfo{inputs: []regMask{gpMask, gpMask}, outputs: []regMask{gpMask}}
129 gp22 = regInfo{inputs: []regMask{gpMask, gpMask}, outputs: []regMask{gpMask, gpMask}}
130 gpload = regInfo{inputs: []regMask{gpspsbMask, regMask{}}, outputs: []regMask{gpMask}}
131 gp11sb = regInfo{inputs: []regMask{gpspsbMask}, outputs: []regMask{gpMask}}
132 gpxchg = regInfo{inputs: []regMask{gpspsbgMask, gpgMask}, outputs: []regMask{gpMask}}
133 gpcas = regInfo{inputs: []regMask{gpspsbgMask, gpgMask, gpgMask}, outputs: []regMask{gpMask}}
134 gpatomic = regInfo{inputs: []regMask{gpspsbgMask, gpgMask}}
135
136 fp01 = regInfo{outputs: []regMask{fpMask}}
137 fp11 = regInfo{inputs: []regMask{fpMask}, outputs: []regMask{fpMask}}
138 fp21 = regInfo{inputs: []regMask{fpMask, fpMask}, outputs: []regMask{fpMask}}
139 fp31 = regInfo{inputs: []regMask{fpMask, fpMask, fpMask}, outputs: []regMask{fpMask}}
140 gpfp = regInfo{inputs: []regMask{gpMask}, outputs: []regMask{fpMask}}
141 fpgp = regInfo{inputs: []regMask{fpMask}, outputs: []regMask{gpMask}}
142 fpstore = regInfo{inputs: []regMask{gpspsbMask, fpMask, regMask{}}}
143 fpload = regInfo{inputs: []regMask{gpspsbMask, regMask{}}, outputs: []regMask{fpMask}}
144 fp2gp = regInfo{inputs: []regMask{fpMask, fpMask}, outputs: []regMask{gpMask}}
145
146 call = regInfo{clobbers: callerSave}
147
148
149
150
151 callClosure = regInfo{inputs: []regMask{gpspMask.minus(regX5), regCtxt, regMask{}}, clobbers: callerSave}
152 callInter = regInfo{inputs: []regMask{gpMask.minus(regX5)}, clobbers: callerSave}
153 )
154
155 RISCV64ops := []opData{
156 {name: "ADD", argLength: 2, reg: gp21, asm: "ADD", commutative: true, earlyOk: true},
157 {name: "ADDI", argLength: 1, reg: gp11sb, asm: "ADDI", aux: "Int64", earlyOk: true},
158 {name: "ADDIW", argLength: 1, reg: gp11, asm: "ADDIW", aux: "Int64", earlyOk: true},
159 {name: "NEG", argLength: 1, reg: gp11, asm: "NEG", earlyOk: true},
160 {name: "NEGW", argLength: 1, reg: gp11, asm: "NEGW", earlyOk: true},
161 {name: "SUB", argLength: 2, reg: gp21, asm: "SUB", earlyOk: true},
162 {name: "SUBW", argLength: 2, reg: gp21, asm: "SUBW", earlyOk: true},
163
164
165
166 {name: "MUL", argLength: 2, reg: gp21, asm: "MUL", commutative: true, typ: "Int64", earlyOk: true},
167 {name: "MULW", argLength: 2, reg: gp21, asm: "MULW", commutative: true, typ: "Int32", earlyOk: true},
168 {name: "MULH", argLength: 2, reg: gp21, asm: "MULH", commutative: true, typ: "Int64", earlyOk: true},
169 {name: "MULHU", argLength: 2, reg: gp21, asm: "MULHU", commutative: true, typ: "UInt64", earlyOk: true},
170 {name: "LoweredMuluhilo", argLength: 2, reg: gp22, resultNotInArgs: true, earlyOk: true},
171 {name: "LoweredMuluover", argLength: 2, reg: gp22, resultNotInArgs: true, earlyOk: true},
172
173 {name: "DIV", argLength: 2, reg: gp21, asm: "DIV", typ: "Int64", earlyOk: true},
174 {name: "DIVU", argLength: 2, reg: gp21, asm: "DIVU", typ: "UInt64", earlyOk: true},
175 {name: "DIVW", argLength: 2, reg: gp21, asm: "DIVW", typ: "Int32", earlyOk: true},
176 {name: "DIVUW", argLength: 2, reg: gp21, asm: "DIVUW", typ: "UInt32", earlyOk: true},
177 {name: "REM", argLength: 2, reg: gp21, asm: "REM", typ: "Int64", earlyOk: true},
178 {name: "REMU", argLength: 2, reg: gp21, asm: "REMU", typ: "UInt64", earlyOk: true},
179 {name: "REMW", argLength: 2, reg: gp21, asm: "REMW", typ: "Int32", earlyOk: true},
180 {name: "REMUW", argLength: 2, reg: gp21, asm: "REMUW", typ: "UInt32", earlyOk: true},
181
182 {name: "MOVaddr", argLength: 1, reg: gp11sb, asm: "MOV", aux: "SymOff", rematerializeable: true, symEffect: "Addr", earlyOk: true},
183
184
185 {name: "MOVDconst", reg: gp01, asm: "MOV", typ: "UInt64", aux: "Int64", rematerializeable: true, earlyOk: true},
186 {name: "FMOVDconst", reg: fp01, asm: "MOVD", typ: "Float64", aux: "Float64", rematerializeable: true, earlyOk: true},
187 {name: "FMOVFconst", reg: fp01, asm: "MOVF", typ: "Float32", aux: "Float32", rematerializeable: true, earlyOk: true},
188
189
190 {name: "MOVBload", argLength: 2, reg: gpload, asm: "MOVB", aux: "SymOff", typ: "Int8", faultOnNilArg0: true, symEffect: "Read", addrSinkArg0: true},
191 {name: "MOVHload", argLength: 2, reg: gpload, asm: "MOVH", aux: "SymOff", typ: "Int16", faultOnNilArg0: true, symEffect: "Read", addrSinkArg0: true},
192 {name: "MOVWload", argLength: 2, reg: gpload, asm: "MOVW", aux: "SymOff", typ: "Int32", faultOnNilArg0: true, symEffect: "Read", addrSinkArg0: true},
193 {name: "MOVDload", argLength: 2, reg: gpload, asm: "MOV", aux: "SymOff", typ: "Int64", faultOnNilArg0: true, symEffect: "Read", addrSinkArg0: true},
194 {name: "MOVBUload", argLength: 2, reg: gpload, asm: "MOVBU", aux: "SymOff", typ: "UInt8", faultOnNilArg0: true, symEffect: "Read", addrSinkArg0: true},
195 {name: "MOVHUload", argLength: 2, reg: gpload, asm: "MOVHU", aux: "SymOff", typ: "UInt16", faultOnNilArg0: true, symEffect: "Read", addrSinkArg0: true},
196 {name: "MOVWUload", argLength: 2, reg: gpload, asm: "MOVWU", aux: "SymOff", typ: "UInt32", faultOnNilArg0: true, symEffect: "Read", addrSinkArg0: true},
197
198
199 {name: "MOVBstore", argLength: 3, reg: gpstore, asm: "MOVB", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write", addrSinkArg0: true},
200 {name: "MOVHstore", argLength: 3, reg: gpstore, asm: "MOVH", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write", addrSinkArg0: true},
201 {name: "MOVWstore", argLength: 3, reg: gpstore, asm: "MOVW", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write", addrSinkArg0: true},
202 {name: "MOVDstore", argLength: 3, reg: gpstore, asm: "MOV", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write", addrSinkArg0: true},
203
204
205 {name: "MOVBstorezero", argLength: 2, reg: gpstore0, aux: "SymOff", asm: "MOVB", typ: "Mem", faultOnNilArg0: true, symEffect: "Write", addrSinkArg0: true},
206 {name: "MOVHstorezero", argLength: 2, reg: gpstore0, aux: "SymOff", asm: "MOVH", typ: "Mem", faultOnNilArg0: true, symEffect: "Write", addrSinkArg0: true},
207 {name: "MOVWstorezero", argLength: 2, reg: gpstore0, aux: "SymOff", asm: "MOVW", typ: "Mem", faultOnNilArg0: true, symEffect: "Write", addrSinkArg0: true},
208 {name: "MOVDstorezero", argLength: 2, reg: gpstore0, aux: "SymOff", asm: "MOV", typ: "Mem", faultOnNilArg0: true, symEffect: "Write", addrSinkArg0: true},
209
210
211 {name: "MOVBreg", argLength: 1, reg: gp11, asm: "MOVB", earlyOk: true},
212 {name: "MOVHreg", argLength: 1, reg: gp11, asm: "MOVH", earlyOk: true},
213 {name: "MOVWreg", argLength: 1, reg: gp11, asm: "MOVW", earlyOk: true},
214 {name: "MOVDreg", argLength: 1, reg: gp11, asm: "MOV", earlyOk: true},
215 {name: "MOVBUreg", argLength: 1, reg: gp11, asm: "MOVBU", earlyOk: true},
216 {name: "MOVHUreg", argLength: 1, reg: gp11, asm: "MOVHU", earlyOk: true},
217 {name: "MOVWUreg", argLength: 1, reg: gp11, asm: "MOVWU", earlyOk: true},
218
219 {name: "MOVDnop", argLength: 1, reg: regInfo{inputs: []regMask{gpMask}, outputs: []regMask{gpMask}}, resultInArg0: true, earlyOk: true},
220
221
222 {name: "SLL", argLength: 2, reg: gp21, asm: "SLL", earlyOk: true},
223 {name: "SLLW", argLength: 2, reg: gp21, asm: "SLLW", earlyOk: true},
224 {name: "SRA", argLength: 2, reg: gp21, asm: "SRA", earlyOk: true},
225 {name: "SRAW", argLength: 2, reg: gp21, asm: "SRAW", earlyOk: true},
226 {name: "SRL", argLength: 2, reg: gp21, asm: "SRL", earlyOk: true},
227 {name: "SRLW", argLength: 2, reg: gp21, asm: "SRLW", earlyOk: true},
228 {name: "SLLI", argLength: 1, reg: gp11, asm: "SLLI", aux: "Int64", earlyOk: true},
229 {name: "SLLIW", argLength: 1, reg: gp11, asm: "SLLIW", aux: "Int64", earlyOk: true},
230 {name: "SRAI", argLength: 1, reg: gp11, asm: "SRAI", aux: "Int64", earlyOk: true},
231 {name: "SRAIW", argLength: 1, reg: gp11, asm: "SRAIW", aux: "Int64", earlyOk: true},
232 {name: "SRLI", argLength: 1, reg: gp11, asm: "SRLI", aux: "Int64", earlyOk: true},
233 {name: "SRLIW", argLength: 1, reg: gp11, asm: "SRLIW", aux: "Int64", earlyOk: true},
234
235
236 {name: "SH1ADD", argLength: 2, reg: gp21, asm: "SH1ADD", earlyOk: true},
237 {name: "SH2ADD", argLength: 2, reg: gp21, asm: "SH2ADD", earlyOk: true},
238 {name: "SH3ADD", argLength: 2, reg: gp21, asm: "SH3ADD", earlyOk: true},
239
240
241
242 {name: "AND", argLength: 2, reg: gp21, asm: "AND", commutative: true, earlyOk: true},
243 {name: "ANDN", argLength: 2, reg: gp21, asm: "ANDN", earlyOk: true},
244 {name: "ANDI", argLength: 1, reg: gp11, asm: "ANDI", aux: "Int64", earlyOk: true},
245 {name: "CLZ", argLength: 1, reg: gp11, asm: "CLZ", earlyOk: true},
246 {name: "CLZW", argLength: 1, reg: gp11, asm: "CLZW", earlyOk: true},
247 {name: "CPOP", argLength: 1, reg: gp11, asm: "CPOP"},
248 {name: "CPOPW", argLength: 1, reg: gp11, asm: "CPOPW"},
249 {name: "CTZ", argLength: 1, reg: gp11, asm: "CTZ", earlyOk: true},
250 {name: "CTZW", argLength: 1, reg: gp11, asm: "CTZW", earlyOk: true},
251 {name: "NOT", argLength: 1, reg: gp11, asm: "NOT", earlyOk: true},
252 {name: "OR", argLength: 2, reg: gp21, asm: "OR", commutative: true, earlyOk: true},
253 {name: "ORN", argLength: 2, reg: gp21, asm: "ORN", earlyOk: true},
254 {name: "ORI", argLength: 1, reg: gp11, asm: "ORI", aux: "Int64", earlyOk: true},
255 {name: "REV8", argLength: 1, reg: gp11, asm: "REV8", earlyOk: true},
256 {name: "ROL", argLength: 2, reg: gp21, asm: "ROL", earlyOk: true},
257 {name: "ROLW", argLength: 2, reg: gp21, asm: "ROLW", earlyOk: true},
258 {name: "ROR", argLength: 2, reg: gp21, asm: "ROR", earlyOk: true},
259 {name: "RORI", argLength: 1, reg: gp11, asm: "RORI", aux: "Int64", earlyOk: true},
260 {name: "RORIW", argLength: 1, reg: gp11, asm: "RORIW", aux: "Int64", earlyOk: true},
261 {name: "RORW", argLength: 2, reg: gp21, asm: "RORW", earlyOk: true},
262 {name: "XNOR", argLength: 2, reg: gp21, asm: "XNOR", commutative: true, earlyOk: true},
263 {name: "XOR", argLength: 2, reg: gp21, asm: "XOR", commutative: true, earlyOk: true},
264 {name: "XORI", argLength: 1, reg: gp11, asm: "XORI", aux: "Int64", earlyOk: true},
265
266
267 {name: "MIN", argLength: 2, reg: gp21, asm: "MIN", commutative: true, earlyOk: true},
268 {name: "MAX", argLength: 2, reg: gp21, asm: "MAX", commutative: true, earlyOk: true},
269 {name: "MINU", argLength: 2, reg: gp21, asm: "MINU", commutative: true, earlyOk: true},
270 {name: "MAXU", argLength: 2, reg: gp21, asm: "MAXU", commutative: true, earlyOk: true},
271
272
273 {name: "SEQZ", argLength: 1, reg: gp11, asm: "SEQZ", earlyOk: true},
274 {name: "SNEZ", argLength: 1, reg: gp11, asm: "SNEZ", earlyOk: true},
275 {name: "SLT", argLength: 2, reg: gp21, asm: "SLT", earlyOk: true},
276 {name: "SLTI", argLength: 1, reg: gp11, asm: "SLTI", aux: "Int64", earlyOk: true},
277 {name: "SLTU", argLength: 2, reg: gp21, asm: "SLTU", earlyOk: true},
278 {name: "SLTIU", argLength: 1, reg: gp11, asm: "SLTIU", aux: "Int64", earlyOk: true},
279
280
281 {name: "LoweredRound32F", argLength: 1, reg: fp11, resultInArg0: true, earlyOk: true},
282 {name: "LoweredRound64F", argLength: 1, reg: fp11, resultInArg0: true, earlyOk: true},
283
284
285 {name: "CALLstatic", argLength: -1, reg: call, aux: "CallOff", call: true},
286 {name: "CALLtail", argLength: -1, reg: call, aux: "CallOff", call: true, tailCall: true},
287 {name: "CALLtailinter", argLength: -1, reg: callInter, aux: "CallOff", call: true, tailCall: true},
288 {name: "CALLclosure", argLength: -1, reg: callClosure, aux: "CallOff", call: true},
289 {name: "CALLinter", argLength: -1, reg: callInter, aux: "CallOff", call: true},
290
291
292
293
294
295
296
297
298
299
300 {
301 name: "LoweredZero",
302 aux: "SizeAndAlign",
303 typ: "Mem",
304 argLength: 2,
305 faultOnNilArg0: true,
306 addrSinkArg0: true,
307 reg: regInfo{
308 inputs: []regMask{gpMask},
309 },
310 },
311
312
313
314
315
316
317 {
318 name: "LoweredZeroLoop",
319 aux: "SizeAndAlign",
320 typ: "Mem",
321 argLength: 2,
322 needIntTemp: true,
323 faultOnNilArg0: true,
324 addrSinkArg0: true,
325 reg: regInfo{
326 inputs: []regMask{gpMask},
327 clobbersArg0: true,
328 },
329 },
330
331
332
333
334
335
336
337
338
339
340 {
341 name: "LoweredMove",
342 aux: "SizeAndAlign",
343 argLength: 3,
344 reg: regInfo{
345 inputs: []regMask{gpMask.minus(regNamed["X5"]), gpMask.minus(regNamed["X5"])},
346 clobbers: regNamed["X5"],
347 },
348 faultOnNilArg0: true,
349 faultOnNilArg1: true,
350 addrSinkArg0: true,
351 addrSinkArg1: true,
352 },
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369 {
370 name: "LoweredMoveLoop",
371 aux: "SizeAndAlign",
372 argLength: 3,
373 reg: regInfo{
374 inputs: []regMask{gpMask.minus(r5toR6), gpMask.minus(r5toR6)},
375 clobbers: r5toR6,
376 clobbersArg0: true,
377 clobbersArg1: true,
378 },
379 faultOnNilArg0: true,
380 faultOnNilArg1: true,
381 addrSinkArg0: true,
382 addrSinkArg1: true,
383 },
384
385
386
387
388 {name: "LoweredAtomicLoad8", argLength: 2, reg: gpload, faultOnNilArg0: true},
389 {name: "LoweredAtomicLoad32", argLength: 2, reg: gpload, faultOnNilArg0: true},
390 {name: "LoweredAtomicLoad64", argLength: 2, reg: gpload, faultOnNilArg0: true},
391
392
393
394 {name: "LoweredAtomicStore8", argLength: 3, reg: gpstore, faultOnNilArg0: true, hasSideEffects: true},
395 {name: "LoweredAtomicStore32", argLength: 3, reg: gpstore, faultOnNilArg0: true, hasSideEffects: true},
396 {name: "LoweredAtomicStore64", argLength: 3, reg: gpstore, faultOnNilArg0: true, hasSideEffects: true},
397
398
399
400 {name: "LoweredAtomicExchange32", argLength: 3, reg: gpxchg, resultNotInArgs: true, faultOnNilArg0: true, hasSideEffects: true},
401 {name: "LoweredAtomicExchange64", argLength: 3, reg: gpxchg, resultNotInArgs: true, faultOnNilArg0: true, hasSideEffects: true},
402
403
404
405 {name: "LoweredAtomicAdd32", argLength: 3, reg: gpxchg, resultNotInArgs: true, faultOnNilArg0: true, hasSideEffects: true, unsafePoint: true},
406 {name: "LoweredAtomicAdd64", argLength: 3, reg: gpxchg, resultNotInArgs: true, faultOnNilArg0: true, hasSideEffects: true, unsafePoint: true},
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422 {name: "LoweredAtomicCas32", argLength: 4, reg: gpcas, resultNotInArgs: true, faultOnNilArg0: true, hasSideEffects: true, unsafePoint: true},
423 {name: "LoweredAtomicCas64", argLength: 4, reg: gpcas, resultNotInArgs: true, faultOnNilArg0: true, hasSideEffects: true, unsafePoint: true},
424
425
426
427 {name: "LoweredAtomicAnd32", argLength: 3, reg: gpatomic, asm: "AMOANDW", faultOnNilArg0: true, hasSideEffects: true},
428 {name: "LoweredAtomicOr32", argLength: 3, reg: gpatomic, asm: "AMOORW", faultOnNilArg0: true, hasSideEffects: true},
429
430
431 {name: "LoweredNilCheck", argLength: 2, faultOnNilArg0: true, nilCheck: true, reg: regInfo{inputs: []regMask{gpspMask}}},
432 {name: "LoweredGetClosurePtr", reg: regInfo{outputs: []regMask{regCtxt}}},
433
434
435 {name: "LoweredGetCallerSP", argLength: 1, reg: gp01, rematerializeable: true},
436
437
438
439
440
441 {name: "LoweredGetCallerPC", reg: gp01, rematerializeable: true},
442
443
444
445
446
447
448 {name: "LoweredWB", argLength: 1, reg: regInfo{clobbers: callerSave.minus(gpMask.union(regNamed["g"])).union(regNamed["X1"]), outputs: []regMask{regNamed["X24"]}}, clobberFlags: true, aux: "Int64"},
449
450
451 {name: "LoweredPubBarrier", argLength: 1, asm: "FENCE", hasSideEffects: true},
452
453
454
455
456
457
458 {name: "LoweredPanicBoundsRR", argLength: 3, aux: "Int64", reg: regInfo{inputs: []regMask{first16Mask, first16Mask}}, typ: "Mem", call: true},
459 {name: "LoweredPanicBoundsRC", argLength: 2, aux: "PanicBoundsC", reg: regInfo{inputs: []regMask{first16Mask}}, typ: "Mem", call: true},
460 {name: "LoweredPanicBoundsCR", argLength: 2, aux: "PanicBoundsC", reg: regInfo{inputs: []regMask{first16Mask}}, typ: "Mem", call: true},
461 {name: "LoweredPanicBoundsCC", argLength: 1, aux: "PanicBoundsCC", reg: regInfo{}, typ: "Mem", call: true},
462
463
464 {name: "FADDS", argLength: 2, reg: fp21, asm: "FADDS", commutative: true, typ: "Float32", earlyOk: true},
465 {name: "FSUBS", argLength: 2, reg: fp21, asm: "FSUBS", commutative: false, typ: "Float32", earlyOk: true},
466 {name: "FMULS", argLength: 2, reg: fp21, asm: "FMULS", commutative: true, typ: "Float32", earlyOk: true},
467 {name: "FDIVS", argLength: 2, reg: fp21, asm: "FDIVS", commutative: false, typ: "Float32", earlyOk: true},
468 {name: "FMADDS", argLength: 3, reg: fp31, asm: "FMADDS", commutative: true, typ: "Float32", earlyOk: true},
469 {name: "FMSUBS", argLength: 3, reg: fp31, asm: "FMSUBS", commutative: true, typ: "Float32", earlyOk: true},
470 {name: "FNMADDS", argLength: 3, reg: fp31, asm: "FNMADDS", commutative: true, typ: "Float32", earlyOk: true},
471 {name: "FNMSUBS", argLength: 3, reg: fp31, asm: "FNMSUBS", commutative: true, typ: "Float32", earlyOk: true},
472 {name: "FSQRTS", argLength: 1, reg: fp11, asm: "FSQRTS", typ: "Float32", earlyOk: true},
473 {name: "FABSS", argLength: 1, reg: fp11, asm: "FABSS", typ: "Float32", earlyOk: true},
474 {name: "FNEGS", argLength: 1, reg: fp11, asm: "FNEGS", typ: "Float32", earlyOk: true},
475 {name: "FMVSX", argLength: 1, reg: gpfp, asm: "FMVSX", typ: "Float32", earlyOk: true},
476 {name: "FMVXS", argLength: 1, reg: fpgp, asm: "FMVXS", typ: "Int32", earlyOk: true},
477 {name: "FCVTSW", argLength: 1, reg: gpfp, asm: "FCVTSW", typ: "Float32", earlyOk: true},
478 {name: "FCVTSL", argLength: 1, reg: gpfp, asm: "FCVTSL", typ: "Float32", earlyOk: true},
479 {name: "FCVTWS", argLength: 1, reg: fpgp, asm: "FCVTWS", typ: "Int32", earlyOk: true},
480 {name: "FCVTLS", argLength: 1, reg: fpgp, asm: "FCVTLS", typ: "Int64", earlyOk: true},
481 {name: "FMOVWload", argLength: 2, reg: fpload, asm: "MOVF", aux: "SymOff", typ: "Float32", faultOnNilArg0: true, symEffect: "Read", addrSinkArg0: true},
482 {name: "FMOVWstore", argLength: 3, reg: fpstore, asm: "MOVF", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write", addrSinkArg0: true},
483 {name: "FEQS", argLength: 2, reg: fp2gp, asm: "FEQS", commutative: true, earlyOk: true},
484 {name: "FNES", argLength: 2, reg: fp2gp, asm: "FNES", commutative: true, earlyOk: true},
485 {name: "FLTS", argLength: 2, reg: fp2gp, asm: "FLTS", earlyOk: true},
486 {name: "FLES", argLength: 2, reg: fp2gp, asm: "FLES", earlyOk: true},
487 {name: "LoweredFMAXS", argLength: 2, reg: fp21, resultNotInArgs: true, asm: "FMAXS", commutative: true, typ: "Float32", earlyOk: true},
488 {name: "LoweredFMINS", argLength: 2, reg: fp21, resultNotInArgs: true, asm: "FMINS", commutative: true, typ: "Float32", earlyOk: true},
489
490
491 {name: "FADDD", argLength: 2, reg: fp21, asm: "FADDD", commutative: true, typ: "Float64", earlyOk: true},
492 {name: "FSUBD", argLength: 2, reg: fp21, asm: "FSUBD", commutative: false, typ: "Float64", earlyOk: true},
493 {name: "FMULD", argLength: 2, reg: fp21, asm: "FMULD", commutative: true, typ: "Float64", earlyOk: true},
494 {name: "FDIVD", argLength: 2, reg: fp21, asm: "FDIVD", commutative: false, typ: "Float64", earlyOk: true},
495 {name: "FMADDD", argLength: 3, reg: fp31, asm: "FMADDD", commutative: true, typ: "Float64", earlyOk: true},
496 {name: "FMSUBD", argLength: 3, reg: fp31, asm: "FMSUBD", commutative: true, typ: "Float64", earlyOk: true},
497 {name: "FNMADDD", argLength: 3, reg: fp31, asm: "FNMADDD", commutative: true, typ: "Float64", earlyOk: true},
498 {name: "FNMSUBD", argLength: 3, reg: fp31, asm: "FNMSUBD", commutative: true, typ: "Float64", earlyOk: true},
499 {name: "FSQRTD", argLength: 1, reg: fp11, asm: "FSQRTD", typ: "Float64", earlyOk: true},
500 {name: "FNEGD", argLength: 1, reg: fp11, asm: "FNEGD", typ: "Float64", earlyOk: true},
501 {name: "FABSD", argLength: 1, reg: fp11, asm: "FABSD", typ: "Float64", earlyOk: true},
502 {name: "FSGNJD", argLength: 2, reg: fp21, asm: "FSGNJD", typ: "Float64", earlyOk: true},
503 {name: "FMVDX", argLength: 1, reg: gpfp, asm: "FMVDX", typ: "Float64", earlyOk: true},
504 {name: "FMVXD", argLength: 1, reg: fpgp, asm: "FMVXD", typ: "Int64", earlyOk: true},
505 {name: "FCVTDW", argLength: 1, reg: gpfp, asm: "FCVTDW", typ: "Float64", earlyOk: true},
506 {name: "FCVTDL", argLength: 1, reg: gpfp, asm: "FCVTDL", typ: "Float64", earlyOk: true},
507 {name: "FCVTWD", argLength: 1, reg: fpgp, asm: "FCVTWD", typ: "Int32", earlyOk: true},
508 {name: "FCVTLD", argLength: 1, reg: fpgp, asm: "FCVTLD", typ: "Int64", earlyOk: true},
509 {name: "FCVTDS", argLength: 1, reg: fp11, asm: "FCVTDS", typ: "Float64", earlyOk: true},
510 {name: "FCVTSD", argLength: 1, reg: fp11, asm: "FCVTSD", typ: "Float32", earlyOk: true},
511 {name: "FMOVDload", argLength: 2, reg: fpload, asm: "MOVD", aux: "SymOff", typ: "Float64", faultOnNilArg0: true, symEffect: "Read"},
512 {name: "FMOVDstore", argLength: 3, reg: fpstore, asm: "MOVD", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"},
513 {name: "FEQD", argLength: 2, reg: fp2gp, asm: "FEQD", commutative: true, earlyOk: true},
514 {name: "FNED", argLength: 2, reg: fp2gp, asm: "FNED", commutative: true, earlyOk: true},
515 {name: "FLTD", argLength: 2, reg: fp2gp, asm: "FLTD", earlyOk: true},
516 {name: "FLED", argLength: 2, reg: fp2gp, asm: "FLED", earlyOk: true},
517 {name: "LoweredFMIND", argLength: 2, reg: fp21, resultNotInArgs: true, asm: "FMIND", commutative: true, typ: "Float64", earlyOk: true},
518 {name: "LoweredFMAXD", argLength: 2, reg: fp21, resultNotInArgs: true, asm: "FMAXD", commutative: true, typ: "Float64", earlyOk: true},
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538 {name: "FCLASSS", argLength: 1, reg: fpgp, asm: "FCLASSS", typ: "Int64", earlyOk: true},
539 {name: "FCLASSD", argLength: 1, reg: fpgp, asm: "FCLASSD", typ: "Int64", earlyOk: true},
540
541
542 {name: "CZEROEQZ", argLength: 2, reg: gp21, asm: "CZEROEQZ"},
543 {name: "CZERONEZ", argLength: 2, reg: gp21, asm: "CZERONEZ"},
544 }
545
546 RISCV64blocks := []blockData{
547 {name: "BEQ", controls: 2},
548 {name: "BNE", controls: 2},
549 {name: "BLT", controls: 2},
550 {name: "BGE", controls: 2},
551 {name: "BLTU", controls: 2},
552 {name: "BGEU", controls: 2},
553
554 {name: "BEQZ", controls: 1},
555 {name: "BNEZ", controls: 1},
556 {name: "BLEZ", controls: 1},
557 {name: "BGEZ", controls: 1},
558 {name: "BLTZ", controls: 1},
559 {name: "BGTZ", controls: 1},
560 }
561
562 archs = append(archs, arch{
563 name: "RISCV64",
564 pkg: "cmd/internal/obj/riscv",
565 genfile: "../../riscv64/ssa.go",
566 ops: RISCV64ops,
567 blocks: RISCV64blocks,
568 regnames: regNamesRISCV64,
569 gpregmask: gpMask,
570 fpregmask: fpMask,
571 framepointerreg: -1,
572
573 ParamIntRegNames: "X10 X11 X12 X13 X14 X15 X16 X17 X8 X9 X18 X19 X20 X21 X22 X23",
574
575 ParamFloatRegNames: "F10 F11 F12 F13 F14 F15 F16 F17 F8 F9 F18 F19 F20 F21 F22 F23",
576 })
577 }
578
View as plain text