1
2
3
4
5 package riscv64asm
6
7 import (
8 "fmt"
9 "strings"
10 )
11
12
13 type Op uint16
14
15
16 func (op Op) String() string {
17 if op >= Op(len(opstr)) || opstr[op] == "" {
18 return fmt.Sprintf("Op(%d)", op)
19 }
20
21 return opstr[op]
22 }
23
24
25 type Arg interface {
26 String() string
27 }
28
29
30
31
32 type Args [6]Arg
33
34
35 type Inst struct {
36 Op Op
37 Enc uint32
38 Args Args
39 Len int
40 }
41
42 func (i Inst) String() string {
43 var args []string
44 for _, arg := range i.Args {
45 if arg == nil {
46 break
47 }
48 args = append(args, arg.String())
49 }
50
51 if len(args) == 0 {
52 return i.Op.String()
53 }
54 return i.Op.String() + " " + strings.Join(args, ",")
55 }
56
57
58
59 type Reg uint16
60
61 const (
62
63 X0 Reg = iota
64 X1
65 X2
66 X3
67 X4
68 X5
69 X6
70 X7
71 X8
72 X9
73 X10
74 X11
75 X12
76 X13
77 X14
78 X15
79 X16
80 X17
81 X18
82 X19
83 X20
84 X21
85 X22
86 X23
87 X24
88 X25
89 X26
90 X27
91 X28
92 X29
93 X30
94 X31
95
96
97 F0
98 F1
99 F2
100 F3
101 F4
102 F5
103 F6
104 F7
105 F8
106 F9
107 F10
108 F11
109 F12
110 F13
111 F14
112 F15
113 F16
114 F17
115 F18
116 F19
117 F20
118 F21
119 F22
120 F23
121 F24
122 F25
123 F26
124 F27
125 F28
126 F29
127 F30
128 F31
129
130
131 V0
132 V1
133 V2
134 V3
135 V4
136 V5
137 V6
138 V7
139 V8
140 V9
141 V10
142 V11
143 V12
144 V13
145 V14
146 V15
147 V16
148 V17
149 V18
150 V19
151 V20
152 V21
153 V22
154 V23
155 V24
156 V25
157 V26
158 V27
159 V28
160 V29
161 V30
162 V31
163 )
164
165 func (r Reg) String() string {
166 switch {
167 case r >= X0 && r <= X31:
168 return fmt.Sprintf("x%d", r)
169
170 case r >= F0 && r <= F31:
171 return fmt.Sprintf("f%d", r-F0)
172
173 case r >= V0 && r <= V31:
174 return fmt.Sprintf("v%d", r-V0)
175
176 default:
177 return fmt.Sprintf("Unknown(%d)", r)
178 }
179 }
180
181
182
183
184
185 type CSR uint16
186
187 const (
188
189 USTATUS CSR = 0x0000
190 FFLAGS CSR = 0x0001
191 FRM CSR = 0x0002
192 FCSR CSR = 0x0003
193 UIE CSR = 0x0004
194 UTVEC CSR = 0x0005
195 UTVT CSR = 0x0007
196 VSTART CSR = 0x0008
197 VXSAT CSR = 0x0009
198 VXRM CSR = 0x000a
199 VCSR CSR = 0x000f
200 USCRATCH CSR = 0x0040
201 UEPC CSR = 0x0041
202 UCAUSE CSR = 0x0042
203 UTVAL CSR = 0x0043
204 UIP CSR = 0x0044
205 UNXTI CSR = 0x0045
206 UINTSTATUS CSR = 0x0046
207 USCRATCHCSW CSR = 0x0048
208 USCRATCHCSWL CSR = 0x0049
209 SSTATUS CSR = 0x0100
210 SEDELEG CSR = 0x0102
211 SIDELEG CSR = 0x0103
212 SIE CSR = 0x0104
213 STVEC CSR = 0x0105
214 SCOUNTEREN CSR = 0x0106
215 STVT CSR = 0x0107
216 SSCRATCH CSR = 0x0140
217 SEPC CSR = 0x0141
218 SCAUSE CSR = 0x0142
219 STVAL CSR = 0x0143
220 SIP CSR = 0x0144
221 SNXTI CSR = 0x0145
222 SINTSTATUS CSR = 0x0146
223 SSCRATCHCSW CSR = 0x0148
224 SSCRATCHCSWL CSR = 0x0149
225 SATP CSR = 0x0180
226 VSSTATUS CSR = 0x0200
227 VSIE CSR = 0x0204
228 VSTVEC CSR = 0x0205
229 VSSCRATCH CSR = 0x0240
230 VSEPC CSR = 0x0241
231 VSCAUSE CSR = 0x0242
232 VSTVAL CSR = 0x0243
233 VSIP CSR = 0x0244
234 VSATP CSR = 0x0280
235 MSTATUS CSR = 0x0300
236 MISA CSR = 0x0301
237 MEDELEG CSR = 0x0302
238 MIDELEG CSR = 0x0303
239 MIE CSR = 0x0304
240 MTVEC CSR = 0x0305
241 MCOUNTEREN CSR = 0x0306
242 MTVT CSR = 0x0307
243 MSTATUSH CSR = 0x0310
244 MCOUNTINHIBIT CSR = 0x0320
245 MHPMEVENT3 CSR = 0x0323
246 MHPMEVENT4 CSR = 0x0324
247 MHPMEVENT5 CSR = 0x0325
248 MHPMEVENT6 CSR = 0x0326
249 MHPMEVENT7 CSR = 0x0327
250 MHPMEVENT8 CSR = 0x0328
251 MHPMEVENT9 CSR = 0x0329
252 MHPMEVENT10 CSR = 0x032a
253 MHPMEVENT11 CSR = 0x032b
254 MHPMEVENT12 CSR = 0x032c
255 MHPMEVENT13 CSR = 0x032d
256 MHPMEVENT14 CSR = 0x032e
257 MHPMEVENT15 CSR = 0x032f
258 MHPMEVENT16 CSR = 0x0330
259 MHPMEVENT17 CSR = 0x0331
260 MHPMEVENT18 CSR = 0x0332
261 MHPMEVENT19 CSR = 0x0333
262 MHPMEVENT20 CSR = 0x0334
263 MHPMEVENT21 CSR = 0x0335
264 MHPMEVENT22 CSR = 0x0336
265 MHPMEVENT23 CSR = 0x0337
266 MHPMEVENT24 CSR = 0x0338
267 MHPMEVENT25 CSR = 0x0339
268 MHPMEVENT26 CSR = 0x033a
269 MHPMEVENT27 CSR = 0x033b
270 MHPMEVENT28 CSR = 0x033c
271 MHPMEVENT29 CSR = 0x033d
272 MHPMEVENT30 CSR = 0x033e
273 MHPMEVENT31 CSR = 0x033f
274 MSCRATCH CSR = 0x0340
275 MEPC CSR = 0x0341
276 MCAUSE CSR = 0x0342
277 MTVAL CSR = 0x0343
278 MIP CSR = 0x0344
279 MNXTI CSR = 0x0345
280 MINTSTATUS CSR = 0x0346
281 MSCRATCHCSW CSR = 0x0348
282 MSCRATCHCSWL CSR = 0x0349
283 MTINST CSR = 0x034a
284 MTVAL2 CSR = 0x034b
285 PMPCFG0 CSR = 0x03a0
286 PMPCFG1 CSR = 0x03a1
287 PMPCFG2 CSR = 0x03a2
288 PMPCFG3 CSR = 0x03a3
289 PMPADDR0 CSR = 0x03b0
290 PMPADDR1 CSR = 0x03b1
291 PMPADDR2 CSR = 0x03b2
292 PMPADDR3 CSR = 0x03b3
293 PMPADDR4 CSR = 0x03b4
294 PMPADDR5 CSR = 0x03b5
295 PMPADDR6 CSR = 0x03b6
296 PMPADDR7 CSR = 0x03b7
297 PMPADDR8 CSR = 0x03b8
298 PMPADDR9 CSR = 0x03b9
299 PMPADDR10 CSR = 0x03ba
300 PMPADDR11 CSR = 0x03bb
301 PMPADDR12 CSR = 0x03bc
302 PMPADDR13 CSR = 0x03bd
303 PMPADDR14 CSR = 0x03be
304 PMPADDR15 CSR = 0x03bf
305 HSTATUS CSR = 0x0600
306 HEDELEG CSR = 0x0602
307 HIDELEG CSR = 0x0603
308 HIE CSR = 0x0604
309 HTIMEDELTA CSR = 0x0605
310 HCOUNTEREN CSR = 0x0606
311 HGEIE CSR = 0x0607
312 HTIMEDELTAH CSR = 0x0615
313 HTVAL CSR = 0x0643
314 HIP CSR = 0x0644
315 HVIP CSR = 0x0645
316 HTINST CSR = 0x064a
317 HGATP CSR = 0x0680
318 TSELECT CSR = 0x07a0
319 TDATA1 CSR = 0x07a1
320 TDATA2 CSR = 0x07a2
321 TDATA3 CSR = 0x07a3
322 TINFO CSR = 0x07a4
323 TCONTROL CSR = 0x07a5
324 MCONTEXT CSR = 0x07a8
325 MNOISE CSR = 0x07a9
326 SCONTEXT CSR = 0x07aa
327 DCSR CSR = 0x07b0
328 DPC CSR = 0x07b1
329 DSCRATCH0 CSR = 0x07b2
330 DSCRATCH1 CSR = 0x07b3
331 MCYCLE CSR = 0x0b00
332 MINSTRET CSR = 0x0b02
333 MHPMCOUNTER3 CSR = 0x0b03
334 MHPMCOUNTER4 CSR = 0x0b04
335 MHPMCOUNTER5 CSR = 0x0b05
336 MHPMCOUNTER6 CSR = 0x0b06
337 MHPMCOUNTER7 CSR = 0x0b07
338 MHPMCOUNTER8 CSR = 0x0b08
339 MHPMCOUNTER9 CSR = 0x0b09
340 MHPMCOUNTER10 CSR = 0x0b0a
341 MHPMCOUNTER11 CSR = 0x0b0b
342 MHPMCOUNTER12 CSR = 0x0b0c
343 MHPMCOUNTER13 CSR = 0x0b0d
344 MHPMCOUNTER14 CSR = 0x0b0e
345 MHPMCOUNTER15 CSR = 0x0b0f
346 MHPMCOUNTER16 CSR = 0x0b10
347 MHPMCOUNTER17 CSR = 0x0b11
348 MHPMCOUNTER18 CSR = 0x0b12
349 MHPMCOUNTER19 CSR = 0x0b13
350 MHPMCOUNTER20 CSR = 0x0b14
351 MHPMCOUNTER21 CSR = 0x0b15
352 MHPMCOUNTER22 CSR = 0x0b16
353 MHPMCOUNTER23 CSR = 0x0b17
354 MHPMCOUNTER24 CSR = 0x0b18
355 MHPMCOUNTER25 CSR = 0x0b19
356 MHPMCOUNTER26 CSR = 0x0b1a
357 MHPMCOUNTER27 CSR = 0x0b1b
358 MHPMCOUNTER28 CSR = 0x0b1c
359 MHPMCOUNTER29 CSR = 0x0b1d
360 MHPMCOUNTER30 CSR = 0x0b1e
361 MHPMCOUNTER31 CSR = 0x0b1f
362 MCYCLEH CSR = 0x0b80
363 MINSTRETH CSR = 0x0b82
364 MHPMCOUNTER3H CSR = 0x0b83
365 MHPMCOUNTER4H CSR = 0x0b84
366 MHPMCOUNTER5H CSR = 0x0b85
367 MHPMCOUNTER6H CSR = 0x0b86
368 MHPMCOUNTER7H CSR = 0x0b87
369 MHPMCOUNTER8H CSR = 0x0b88
370 MHPMCOUNTER9H CSR = 0x0b89
371 MHPMCOUNTER10H CSR = 0x0b8a
372 MHPMCOUNTER11H CSR = 0x0b8b
373 MHPMCOUNTER12H CSR = 0x0b8c
374 MHPMCOUNTER13H CSR = 0x0b8d
375 MHPMCOUNTER14H CSR = 0x0b8e
376 MHPMCOUNTER15H CSR = 0x0b8f
377 MHPMCOUNTER16H CSR = 0x0b90
378 MHPMCOUNTER17H CSR = 0x0b91
379 MHPMCOUNTER18H CSR = 0x0b92
380 MHPMCOUNTER19H CSR = 0x0b93
381 MHPMCOUNTER20H CSR = 0x0b94
382 MHPMCOUNTER21H CSR = 0x0b95
383 MHPMCOUNTER22H CSR = 0x0b96
384 MHPMCOUNTER23H CSR = 0x0b97
385 MHPMCOUNTER24H CSR = 0x0b98
386 MHPMCOUNTER25H CSR = 0x0b99
387 MHPMCOUNTER26H CSR = 0x0b9a
388 MHPMCOUNTER27H CSR = 0x0b9b
389 MHPMCOUNTER28H CSR = 0x0b9c
390 MHPMCOUNTER29H CSR = 0x0b9d
391 MHPMCOUNTER30H CSR = 0x0b9e
392 MHPMCOUNTER31H CSR = 0x0b9f
393 CYCLE CSR = 0x0c00
394 TIME CSR = 0x0c01
395 INSTRET CSR = 0x0c02
396 HPMCOUNTER3 CSR = 0x0c03
397 HPMCOUNTER4 CSR = 0x0c04
398 HPMCOUNTER5 CSR = 0x0c05
399 HPMCOUNTER6 CSR = 0x0c06
400 HPMCOUNTER7 CSR = 0x0c07
401 HPMCOUNTER8 CSR = 0x0c08
402 HPMCOUNTER9 CSR = 0x0c09
403 HPMCOUNTER10 CSR = 0x0c0a
404 HPMCOUNTER11 CSR = 0x0c0b
405 HPMCOUNTER12 CSR = 0x0c0c
406 HPMCOUNTER13 CSR = 0x0c0d
407 HPMCOUNTER14 CSR = 0x0c0e
408 HPMCOUNTER15 CSR = 0x0c0f
409 HPMCOUNTER16 CSR = 0x0c10
410 HPMCOUNTER17 CSR = 0x0c11
411 HPMCOUNTER18 CSR = 0x0c12
412 HPMCOUNTER19 CSR = 0x0c13
413 HPMCOUNTER20 CSR = 0x0c14
414 HPMCOUNTER21 CSR = 0x0c15
415 HPMCOUNTER22 CSR = 0x0c16
416 HPMCOUNTER23 CSR = 0x0c17
417 HPMCOUNTER24 CSR = 0x0c18
418 HPMCOUNTER25 CSR = 0x0c19
419 HPMCOUNTER26 CSR = 0x0c1a
420 HPMCOUNTER27 CSR = 0x0c1b
421 HPMCOUNTER28 CSR = 0x0c1c
422 HPMCOUNTER29 CSR = 0x0c1d
423 HPMCOUNTER30 CSR = 0x0c1e
424 HPMCOUNTER31 CSR = 0x0c1f
425 VL CSR = 0x0c20
426 VTYPE CSR = 0x0c21
427 VLENB CSR = 0x0c22
428 CYCLEH CSR = 0x0c80
429 TIMEH CSR = 0x0c81
430 INSTRETH CSR = 0x0c82
431 HPMCOUNTER3H CSR = 0x0c83
432 HPMCOUNTER4H CSR = 0x0c84
433 HPMCOUNTER5H CSR = 0x0c85
434 HPMCOUNTER6H CSR = 0x0c86
435 HPMCOUNTER7H CSR = 0x0c87
436 HPMCOUNTER8H CSR = 0x0c88
437 HPMCOUNTER9H CSR = 0x0c89
438 HPMCOUNTER10H CSR = 0x0c8a
439 HPMCOUNTER11H CSR = 0x0c8b
440 HPMCOUNTER12H CSR = 0x0c8c
441 HPMCOUNTER13H CSR = 0x0c8d
442 HPMCOUNTER14H CSR = 0x0c8e
443 HPMCOUNTER15H CSR = 0x0c8f
444 HPMCOUNTER16H CSR = 0x0c90
445 HPMCOUNTER17H CSR = 0x0c91
446 HPMCOUNTER18H CSR = 0x0c92
447 HPMCOUNTER19H CSR = 0x0c93
448 HPMCOUNTER20H CSR = 0x0c94
449 HPMCOUNTER21H CSR = 0x0c95
450 HPMCOUNTER22H CSR = 0x0c96
451 HPMCOUNTER23H CSR = 0x0c97
452 HPMCOUNTER24H CSR = 0x0c98
453 HPMCOUNTER25H CSR = 0x0c99
454 HPMCOUNTER26H CSR = 0x0c9a
455 HPMCOUNTER27H CSR = 0x0c9b
456 HPMCOUNTER28H CSR = 0x0c9c
457 HPMCOUNTER29H CSR = 0x0c9d
458 HPMCOUNTER30H CSR = 0x0c9e
459 HPMCOUNTER31H CSR = 0x0c9f
460 HGEIP CSR = 0x0e12
461 MVENDORID CSR = 0x0f11
462 MARCHID CSR = 0x0f12
463 MIMPID CSR = 0x0f13
464 MHARTID CSR = 0x0f14
465 MENTROPY CSR = 0x0f15
466 )
467
468
469 type Uimm struct {
470 Imm uint32
471 Decimal bool
472 }
473
474 func (ui Uimm) String() string {
475 if ui.Decimal {
476 return fmt.Sprintf("%d", ui.Imm)
477 }
478 return fmt.Sprintf("%#x", ui.Imm)
479 }
480
481
482 type Simm struct {
483 Imm int32
484 Decimal bool
485 Width uint8
486 }
487
488 func (si Simm) String() string {
489 if si.Decimal {
490 return fmt.Sprintf("%d", si.Imm)
491 }
492 return fmt.Sprintf("%#x", si.Imm)
493 }
494
495
496 type RegPtr struct {
497 reg Reg
498 }
499
500 func (regPtr RegPtr) String() string {
501 return fmt.Sprintf("(%s)", regPtr.reg)
502 }
503
504
505 type RegOffset struct {
506 OfsReg Reg
507 Ofs Simm
508 }
509
510 func (regofs RegOffset) String() string {
511 return fmt.Sprintf("%s(%s)", regofs.Ofs, regofs.OfsReg)
512 }
513
514
515 type MemOrder uint8
516
517 func (memOrder MemOrder) String() string {
518 var str string
519 if memOrder<<7>>7 == 1 {
520 str += "i"
521 }
522 if memOrder>>1<<7>>7 == 1 {
523 str += "o"
524 }
525 if memOrder>>2<<7>>7 == 1 {
526 str += "r"
527 }
528 if memOrder>>3<<7>>7 == 1 {
529 str += "w"
530 }
531 return str
532 }
533
534
535 type VType uint32
536
537 var vlmulName = []string{"M1", "M2", "M4", "M8", "", "MF8", "MF4", "MF2"}
538 var vsewName = []string{"E8", "E16", "E32", "E64", "", "", "", ""}
539 var vtaName = []string{"TU", "TA"}
540 var vmaName = []string{"MU", "MA"}
541
542 func (vtype VType) String() string {
543
544 vlmul := vtype & 0x7
545 vsew := (vtype >> 3) & 0x7
546 vta := (vtype >> 6) & 0x1
547 vma := (vtype >> 7) & 0x1
548
549 return fmt.Sprintf("%s, %s, %s, %s", vsewName[vsew], vlmulName[vlmul], vtaName[vta], vmaName[vma])
550 }
551
View as plain text