1
2
3
4
5
6
7
8 package main
9
10 import (
11 "fmt"
12 )
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 const (
28 riscv64REG_G = 27
29 riscv64REG_CTXT = 20
30 riscv64REG_LR = 1
31 riscv64REG_SP = 2
32 riscv64REG_GP = 3
33 riscv64REG_TP = 4
34 riscv64REG_TMP = 31
35 riscv64REG_ZERO = 0
36 )
37
38 func riscv64RegName(r int) string {
39 switch {
40 case r == riscv64REG_G:
41 return "g"
42 case r == riscv64REG_SP:
43 return "SP"
44 case 0 <= r && r <= 31:
45 return fmt.Sprintf("X%d", r)
46 case 32 <= r && r <= 63:
47 return fmt.Sprintf("F%d", r-32)
48 default:
49 panic(fmt.Sprintf("unknown register %d", r))
50 }
51 }
52
53 func init() {
54 var regNamesRISCV64 []string
55 var gpMask, fpMask, gpgMask, gpspMask, gpspsbMask, gpspsbgMask regMask
56 regNamed := make(map[string]regMask)
57
58
59
60
61
62 addreg := func(r int, name string) regMask {
63 mask := regMask(1) << uint(len(regNamesRISCV64))
64 if name == "" {
65 name = riscv64RegName(r)
66 }
67 regNamesRISCV64 = append(regNamesRISCV64, name)
68 regNamed[name] = mask
69 return mask
70 }
71
72
73 for r := 0; r <= 31; r++ {
74 if r == riscv64REG_LR {
75
76
77 continue
78 }
79
80 mask := addreg(r, "")
81
82
83 switch r {
84
85 case riscv64REG_ZERO, riscv64REG_GP, riscv64REG_TP, riscv64REG_TMP:
86 case riscv64REG_G:
87 gpgMask |= mask
88 gpspsbgMask |= mask
89 case riscv64REG_SP:
90 gpspMask |= mask
91 gpspsbMask |= mask
92 gpspsbgMask |= mask
93 default:
94 gpMask |= mask
95 gpgMask |= mask
96 gpspMask |= mask
97 gpspsbMask |= mask
98 gpspsbgMask |= mask
99 }
100 }
101
102
103 for r := 32; r <= 63; r++ {
104 mask := addreg(r, "")
105 fpMask |= mask
106 }
107
108
109 mask := addreg(-1, "SB")
110 gpspsbMask |= mask
111 gpspsbgMask |= mask
112
113 if len(regNamesRISCV64) > 64 {
114
115 panic("Too many RISCV64 registers")
116 }
117
118 regCtxt := regNamed["X20"]
119 callerSave := gpMask | fpMask | regNamed["g"]
120
121 var (
122 gpstore = regInfo{inputs: []regMask{gpspsbMask, gpspMask, 0}}
123 gpstore0 = regInfo{inputs: []regMask{gpspsbMask}}
124 gp01 = regInfo{outputs: []regMask{gpMask}}
125 gp11 = regInfo{inputs: []regMask{gpMask}, outputs: []regMask{gpMask}}
126 gp21 = regInfo{inputs: []regMask{gpMask, gpMask}, outputs: []regMask{gpMask}}
127 gp22 = regInfo{inputs: []regMask{gpMask, gpMask}, outputs: []regMask{gpMask, gpMask}}
128 gpload = regInfo{inputs: []regMask{gpspsbMask, 0}, outputs: []regMask{gpMask}}
129 gp11sb = regInfo{inputs: []regMask{gpspsbMask}, outputs: []regMask{gpMask}}
130 gpxchg = regInfo{inputs: []regMask{gpspsbgMask, gpgMask}, outputs: []regMask{gpMask}}
131 gpcas = regInfo{inputs: []regMask{gpspsbgMask, gpgMask, gpgMask}, outputs: []regMask{gpMask}}
132 gpatomic = regInfo{inputs: []regMask{gpspsbgMask, gpgMask}}
133
134 fp11 = regInfo{inputs: []regMask{fpMask}, outputs: []regMask{fpMask}}
135 fp21 = regInfo{inputs: []regMask{fpMask, fpMask}, outputs: []regMask{fpMask}}
136 fp31 = regInfo{inputs: []regMask{fpMask, fpMask, fpMask}, outputs: []regMask{fpMask}}
137 gpfp = regInfo{inputs: []regMask{gpMask}, outputs: []regMask{fpMask}}
138 fpgp = regInfo{inputs: []regMask{fpMask}, outputs: []regMask{gpMask}}
139 fpstore = regInfo{inputs: []regMask{gpspsbMask, fpMask, 0}}
140 fpload = regInfo{inputs: []regMask{gpspsbMask, 0}, outputs: []regMask{fpMask}}
141 fp2gp = regInfo{inputs: []regMask{fpMask, fpMask}, outputs: []regMask{gpMask}}
142
143 call = regInfo{clobbers: callerSave}
144 callClosure = regInfo{inputs: []regMask{gpspMask, regCtxt, 0}, clobbers: callerSave}
145 callInter = regInfo{inputs: []regMask{gpMask}, clobbers: callerSave}
146 )
147
148 RISCV64ops := []opData{
149 {name: "ADD", argLength: 2, reg: gp21, asm: "ADD", commutative: true},
150 {name: "ADDI", argLength: 1, reg: gp11sb, asm: "ADDI", aux: "Int64"},
151 {name: "ADDIW", argLength: 1, reg: gp11, asm: "ADDIW", aux: "Int64"},
152 {name: "NEG", argLength: 1, reg: gp11, asm: "NEG"},
153 {name: "NEGW", argLength: 1, reg: gp11, asm: "NEGW"},
154 {name: "SUB", argLength: 2, reg: gp21, asm: "SUB"},
155 {name: "SUBW", argLength: 2, reg: gp21, asm: "SUBW"},
156
157
158
159 {name: "MUL", argLength: 2, reg: gp21, asm: "MUL", commutative: true, typ: "Int64"},
160 {name: "MULW", argLength: 2, reg: gp21, asm: "MULW", commutative: true, typ: "Int32"},
161 {name: "MULH", argLength: 2, reg: gp21, asm: "MULH", commutative: true, typ: "Int64"},
162 {name: "MULHU", argLength: 2, reg: gp21, asm: "MULHU", commutative: true, typ: "UInt64"},
163 {name: "LoweredMuluhilo", argLength: 2, reg: gp22, resultNotInArgs: true},
164 {name: "LoweredMuluover", argLength: 2, reg: gp22, resultNotInArgs: true},
165
166 {name: "DIV", argLength: 2, reg: gp21, asm: "DIV", typ: "Int64"},
167 {name: "DIVU", argLength: 2, reg: gp21, asm: "DIVU", typ: "UInt64"},
168 {name: "DIVW", argLength: 2, reg: gp21, asm: "DIVW", typ: "Int32"},
169 {name: "DIVUW", argLength: 2, reg: gp21, asm: "DIVUW", typ: "UInt32"},
170 {name: "REM", argLength: 2, reg: gp21, asm: "REM", typ: "Int64"},
171 {name: "REMU", argLength: 2, reg: gp21, asm: "REMU", typ: "UInt64"},
172 {name: "REMW", argLength: 2, reg: gp21, asm: "REMW", typ: "Int32"},
173 {name: "REMUW", argLength: 2, reg: gp21, asm: "REMUW", typ: "UInt32"},
174
175 {name: "MOVaddr", argLength: 1, reg: gp11sb, asm: "MOV", aux: "SymOff", rematerializeable: true, symEffect: "RdWr"},
176
177
178 {name: "MOVDconst", reg: gp01, asm: "MOV", typ: "UInt64", aux: "Int64", rematerializeable: true},
179
180
181 {name: "MOVBload", argLength: 2, reg: gpload, asm: "MOVB", aux: "SymOff", typ: "Int8", faultOnNilArg0: true, symEffect: "Read"},
182 {name: "MOVHload", argLength: 2, reg: gpload, asm: "MOVH", aux: "SymOff", typ: "Int16", faultOnNilArg0: true, symEffect: "Read"},
183 {name: "MOVWload", argLength: 2, reg: gpload, asm: "MOVW", aux: "SymOff", typ: "Int32", faultOnNilArg0: true, symEffect: "Read"},
184 {name: "MOVDload", argLength: 2, reg: gpload, asm: "MOV", aux: "SymOff", typ: "Int64", faultOnNilArg0: true, symEffect: "Read"},
185 {name: "MOVBUload", argLength: 2, reg: gpload, asm: "MOVBU", aux: "SymOff", typ: "UInt8", faultOnNilArg0: true, symEffect: "Read"},
186 {name: "MOVHUload", argLength: 2, reg: gpload, asm: "MOVHU", aux: "SymOff", typ: "UInt16", faultOnNilArg0: true, symEffect: "Read"},
187 {name: "MOVWUload", argLength: 2, reg: gpload, asm: "MOVWU", aux: "SymOff", typ: "UInt32", faultOnNilArg0: true, symEffect: "Read"},
188
189
190 {name: "MOVBstore", argLength: 3, reg: gpstore, asm: "MOVB", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"},
191 {name: "MOVHstore", argLength: 3, reg: gpstore, asm: "MOVH", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"},
192 {name: "MOVWstore", argLength: 3, reg: gpstore, asm: "MOVW", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"},
193 {name: "MOVDstore", argLength: 3, reg: gpstore, asm: "MOV", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"},
194
195
196 {name: "MOVBstorezero", argLength: 2, reg: gpstore0, aux: "SymOff", asm: "MOVB", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"},
197 {name: "MOVHstorezero", argLength: 2, reg: gpstore0, aux: "SymOff", asm: "MOVH", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"},
198 {name: "MOVWstorezero", argLength: 2, reg: gpstore0, aux: "SymOff", asm: "MOVW", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"},
199 {name: "MOVDstorezero", argLength: 2, reg: gpstore0, aux: "SymOff", asm: "MOV", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"},
200
201
202 {name: "MOVBreg", argLength: 1, reg: gp11, asm: "MOVB"},
203 {name: "MOVHreg", argLength: 1, reg: gp11, asm: "MOVH"},
204 {name: "MOVWreg", argLength: 1, reg: gp11, asm: "MOVW"},
205 {name: "MOVDreg", argLength: 1, reg: gp11, asm: "MOV"},
206 {name: "MOVBUreg", argLength: 1, reg: gp11, asm: "MOVBU"},
207 {name: "MOVHUreg", argLength: 1, reg: gp11, asm: "MOVHU"},
208 {name: "MOVWUreg", argLength: 1, reg: gp11, asm: "MOVWU"},
209
210 {name: "MOVDnop", argLength: 1, reg: regInfo{inputs: []regMask{gpMask}, outputs: []regMask{gpMask}}, resultInArg0: true},
211
212
213 {name: "SLL", argLength: 2, reg: gp21, asm: "SLL"},
214 {name: "SRA", argLength: 2, reg: gp21, asm: "SRA"},
215 {name: "SRL", argLength: 2, reg: gp21, asm: "SRL"},
216 {name: "SLLI", argLength: 1, reg: gp11, asm: "SLLI", aux: "Int64"},
217 {name: "SRAI", argLength: 1, reg: gp11, asm: "SRAI", aux: "Int64"},
218 {name: "SRLI", argLength: 1, reg: gp11, asm: "SRLI", aux: "Int64"},
219
220
221 {name: "XOR", argLength: 2, reg: gp21, asm: "XOR", commutative: true},
222 {name: "XORI", argLength: 1, reg: gp11, asm: "XORI", aux: "Int64"},
223 {name: "OR", argLength: 2, reg: gp21, asm: "OR", commutative: true},
224 {name: "ORI", argLength: 1, reg: gp11, asm: "ORI", aux: "Int64"},
225 {name: "AND", argLength: 2, reg: gp21, asm: "AND", commutative: true},
226 {name: "ANDI", argLength: 1, reg: gp11, asm: "ANDI", aux: "Int64"},
227 {name: "NOT", argLength: 1, reg: gp11, asm: "NOT"},
228
229
230 {name: "SEQZ", argLength: 1, reg: gp11, asm: "SEQZ"},
231 {name: "SNEZ", argLength: 1, reg: gp11, asm: "SNEZ"},
232 {name: "SLT", argLength: 2, reg: gp21, asm: "SLT"},
233 {name: "SLTI", argLength: 1, reg: gp11, asm: "SLTI", aux: "Int64"},
234 {name: "SLTU", argLength: 2, reg: gp21, asm: "SLTU"},
235 {name: "SLTIU", argLength: 1, reg: gp11, asm: "SLTIU", aux: "Int64"},
236
237
238
239
240
241 {name: "MOVconvert", argLength: 2, reg: gp11, asm: "MOV"},
242
243
244 {name: "CALLstatic", argLength: 1, reg: call, aux: "CallOff", call: true},
245 {name: "CALLtail", argLength: 1, reg: call, aux: "CallOff", call: true, tailCall: true},
246 {name: "CALLclosure", argLength: 3, reg: callClosure, aux: "CallOff", call: true},
247 {name: "CALLinter", argLength: 2, reg: callInter, aux: "CallOff", call: true},
248
249
250
251
252
253
254
255 {
256 name: "DUFFZERO",
257 aux: "Int64",
258 argLength: 2,
259 reg: regInfo{
260 inputs: []regMask{regNamed["X10"]},
261 clobbers: regNamed["X1"] | regNamed["X10"],
262 },
263 typ: "Mem",
264 faultOnNilArg0: true,
265 },
266
267
268
269
270
271
272
273
274 {
275 name: "DUFFCOPY",
276 aux: "Int64",
277 argLength: 3,
278 reg: regInfo{
279 inputs: []regMask{regNamed["X11"], regNamed["X10"]},
280 clobbers: regNamed["X1"] | regNamed["X10"] | regNamed["X11"],
281 },
282 typ: "Mem",
283 faultOnNilArg0: true,
284 faultOnNilArg1: true,
285 },
286
287
288
289
290
291
292
293
294
295
296
297
298 {
299 name: "LoweredZero",
300 aux: "Int64",
301 argLength: 3,
302 reg: regInfo{
303 inputs: []regMask{regNamed["X5"], gpMask},
304 clobbers: regNamed["X5"],
305 },
306 typ: "Mem",
307 faultOnNilArg0: true,
308 },
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323 {
324 name: "LoweredMove",
325 aux: "Int64",
326 argLength: 4,
327 reg: regInfo{
328 inputs: []regMask{regNamed["X5"], regNamed["X6"], gpMask &^ regNamed["X7"]},
329 clobbers: regNamed["X5"] | regNamed["X6"] | regNamed["X7"],
330 },
331 typ: "Mem",
332 faultOnNilArg0: true,
333 faultOnNilArg1: true,
334 },
335
336
337
338
339 {name: "LoweredAtomicLoad8", argLength: 2, reg: gpload, faultOnNilArg0: true},
340 {name: "LoweredAtomicLoad32", argLength: 2, reg: gpload, faultOnNilArg0: true},
341 {name: "LoweredAtomicLoad64", argLength: 2, reg: gpload, faultOnNilArg0: true},
342
343
344
345 {name: "LoweredAtomicStore8", argLength: 3, reg: gpstore, faultOnNilArg0: true, hasSideEffects: true},
346 {name: "LoweredAtomicStore32", argLength: 3, reg: gpstore, faultOnNilArg0: true, hasSideEffects: true},
347 {name: "LoweredAtomicStore64", argLength: 3, reg: gpstore, faultOnNilArg0: true, hasSideEffects: true},
348
349
350
351 {name: "LoweredAtomicExchange32", argLength: 3, reg: gpxchg, resultNotInArgs: true, faultOnNilArg0: true, hasSideEffects: true},
352 {name: "LoweredAtomicExchange64", argLength: 3, reg: gpxchg, resultNotInArgs: true, faultOnNilArg0: true, hasSideEffects: true},
353
354
355
356 {name: "LoweredAtomicAdd32", argLength: 3, reg: gpxchg, resultNotInArgs: true, faultOnNilArg0: true, hasSideEffects: true, unsafePoint: true},
357 {name: "LoweredAtomicAdd64", argLength: 3, reg: gpxchg, resultNotInArgs: true, faultOnNilArg0: true, hasSideEffects: true, unsafePoint: true},
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373 {name: "LoweredAtomicCas32", argLength: 4, reg: gpcas, resultNotInArgs: true, faultOnNilArg0: true, hasSideEffects: true, unsafePoint: true},
374 {name: "LoweredAtomicCas64", argLength: 4, reg: gpcas, resultNotInArgs: true, faultOnNilArg0: true, hasSideEffects: true, unsafePoint: true},
375
376
377
378 {name: "LoweredAtomicAnd32", argLength: 3, reg: gpatomic, asm: "AMOANDW", faultOnNilArg0: true, hasSideEffects: true},
379 {name: "LoweredAtomicOr32", argLength: 3, reg: gpatomic, asm: "AMOORW", faultOnNilArg0: true, hasSideEffects: true},
380
381
382 {name: "LoweredNilCheck", argLength: 2, faultOnNilArg0: true, nilCheck: true, reg: regInfo{inputs: []regMask{gpspMask}}},
383 {name: "LoweredGetClosurePtr", reg: regInfo{outputs: []regMask{regCtxt}}},
384
385
386 {name: "LoweredGetCallerSP", reg: gp01, rematerializeable: true},
387
388
389
390
391
392 {name: "LoweredGetCallerPC", reg: gp01, rematerializeable: true},
393
394
395
396
397
398 {name: "LoweredWB", argLength: 3, reg: regInfo{inputs: []regMask{regNamed["X5"], regNamed["X6"]}, clobbers: (callerSave &^ (gpMask | regNamed["g"])) | regNamed["X1"]}, clobberFlags: true, aux: "Sym", symEffect: "None"},
399
400
401
402
403 {name: "LoweredPanicBoundsA", argLength: 3, aux: "Int64", reg: regInfo{inputs: []regMask{regNamed["X7"], regNamed["X28"]}}, typ: "Mem", call: true},
404 {name: "LoweredPanicBoundsB", argLength: 3, aux: "Int64", reg: regInfo{inputs: []regMask{regNamed["X6"], regNamed["X7"]}}, typ: "Mem", call: true},
405 {name: "LoweredPanicBoundsC", argLength: 3, aux: "Int64", reg: regInfo{inputs: []regMask{regNamed["X5"], regNamed["X6"]}}, typ: "Mem", call: true},
406
407
408 {name: "FADDS", argLength: 2, reg: fp21, asm: "FADDS", commutative: true, typ: "Float32"},
409 {name: "FSUBS", argLength: 2, reg: fp21, asm: "FSUBS", commutative: false, typ: "Float32"},
410 {name: "FMULS", argLength: 2, reg: fp21, asm: "FMULS", commutative: true, typ: "Float32"},
411 {name: "FDIVS", argLength: 2, reg: fp21, asm: "FDIVS", commutative: false, typ: "Float32"},
412 {name: "FSQRTS", argLength: 1, reg: fp11, asm: "FSQRTS", typ: "Float32"},
413 {name: "FNEGS", argLength: 1, reg: fp11, asm: "FNEGS", typ: "Float32"},
414 {name: "FMVSX", argLength: 1, reg: gpfp, asm: "FMVSX", typ: "Float32"},
415 {name: "FCVTSW", argLength: 1, reg: gpfp, asm: "FCVTSW", typ: "Float32"},
416 {name: "FCVTSL", argLength: 1, reg: gpfp, asm: "FCVTSL", typ: "Float32"},
417 {name: "FCVTWS", argLength: 1, reg: fpgp, asm: "FCVTWS", typ: "Int32"},
418 {name: "FCVTLS", argLength: 1, reg: fpgp, asm: "FCVTLS", typ: "Int64"},
419 {name: "FMOVWload", argLength: 2, reg: fpload, asm: "MOVF", aux: "SymOff", typ: "Float32", faultOnNilArg0: true, symEffect: "Read"},
420 {name: "FMOVWstore", argLength: 3, reg: fpstore, asm: "MOVF", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"},
421 {name: "FEQS", argLength: 2, reg: fp2gp, asm: "FEQS", commutative: true},
422 {name: "FNES", argLength: 2, reg: fp2gp, asm: "FNES", commutative: true},
423 {name: "FLTS", argLength: 2, reg: fp2gp, asm: "FLTS"},
424 {name: "FLES", argLength: 2, reg: fp2gp, asm: "FLES"},
425
426
427 {name: "FADDD", argLength: 2, reg: fp21, asm: "FADDD", commutative: true, typ: "Float64"},
428 {name: "FSUBD", argLength: 2, reg: fp21, asm: "FSUBD", commutative: false, typ: "Float64"},
429 {name: "FMULD", argLength: 2, reg: fp21, asm: "FMULD", commutative: true, typ: "Float64"},
430 {name: "FDIVD", argLength: 2, reg: fp21, asm: "FDIVD", commutative: false, typ: "Float64"},
431 {name: "FMADDD", argLength: 3, reg: fp31, asm: "FMADDD", commutative: true, typ: "Float64"},
432 {name: "FMSUBD", argLength: 3, reg: fp31, asm: "FMSUBD", commutative: true, typ: "Float64"},
433 {name: "FNMADDD", argLength: 3, reg: fp31, asm: "FNMADDD", commutative: true, typ: "Float64"},
434 {name: "FNMSUBD", argLength: 3, reg: fp31, asm: "FNMSUBD", commutative: true, typ: "Float64"},
435 {name: "FSQRTD", argLength: 1, reg: fp11, asm: "FSQRTD", typ: "Float64"},
436 {name: "FNEGD", argLength: 1, reg: fp11, asm: "FNEGD", typ: "Float64"},
437 {name: "FABSD", argLength: 1, reg: fp11, asm: "FABSD", typ: "Float64"},
438 {name: "FSGNJD", argLength: 2, reg: fp21, asm: "FSGNJD", typ: "Float64"},
439 {name: "FMVDX", argLength: 1, reg: gpfp, asm: "FMVDX", typ: "Float64"},
440 {name: "FCVTDW", argLength: 1, reg: gpfp, asm: "FCVTDW", typ: "Float64"},
441 {name: "FCVTDL", argLength: 1, reg: gpfp, asm: "FCVTDL", typ: "Float64"},
442 {name: "FCVTWD", argLength: 1, reg: fpgp, asm: "FCVTWD", typ: "Int32"},
443 {name: "FCVTLD", argLength: 1, reg: fpgp, asm: "FCVTLD", typ: "Int64"},
444 {name: "FCVTDS", argLength: 1, reg: fp11, asm: "FCVTDS", typ: "Float64"},
445 {name: "FCVTSD", argLength: 1, reg: fp11, asm: "FCVTSD", typ: "Float32"},
446 {name: "FMOVDload", argLength: 2, reg: fpload, asm: "MOVD", aux: "SymOff", typ: "Float64", faultOnNilArg0: true, symEffect: "Read"},
447 {name: "FMOVDstore", argLength: 3, reg: fpstore, asm: "MOVD", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"},
448 {name: "FEQD", argLength: 2, reg: fp2gp, asm: "FEQD", commutative: true},
449 {name: "FNED", argLength: 2, reg: fp2gp, asm: "FNED", commutative: true},
450 {name: "FLTD", argLength: 2, reg: fp2gp, asm: "FLTD"},
451 {name: "FLED", argLength: 2, reg: fp2gp, asm: "FLED"},
452 }
453
454 RISCV64blocks := []blockData{
455 {name: "BEQ", controls: 2},
456 {name: "BNE", controls: 2},
457 {name: "BLT", controls: 2},
458 {name: "BGE", controls: 2},
459 {name: "BLTU", controls: 2},
460 {name: "BGEU", controls: 2},
461
462 {name: "BEQZ", controls: 1},
463 {name: "BNEZ", controls: 1},
464 {name: "BLEZ", controls: 1},
465 {name: "BGEZ", controls: 1},
466 {name: "BLTZ", controls: 1},
467 {name: "BGTZ", controls: 1},
468 }
469
470 archs = append(archs, arch{
471 name: "RISCV64",
472 pkg: "cmd/internal/obj/riscv",
473 genfile: "../../riscv64/ssa.go",
474 ops: RISCV64ops,
475 blocks: RISCV64blocks,
476 regnames: regNamesRISCV64,
477 gpregmask: gpMask,
478 fpregmask: fpMask,
479 framepointerreg: -1,
480 })
481 }
482
View as plain text