podman

Форк
0
644 строки · 11.1 Кб
1
//	Copyright © 1994-1999 Lucent Technologies Inc.  All rights reserved.
2
//	Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net)
3
//	Portions Copyright © 1997-1999 Vita Nuova Limited
4
//	Portions Copyright © 2000-2008 Vita Nuova Holdings Limited (www.vitanuova.com)
5
//	Portions Copyright © 2004,2006 Bruce Ellis
6
//	Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net)
7
//	Revisions Copyright © 2000-2008 Lucent Technologies Inc. and others
8
//	Portions Copyright © 2009 The Go Authors.  All rights reserved.
9
//	Portions Copyright © 2019 The Go Authors.  All rights reserved.
10
//
11
// Permission is hereby granted, free of charge, to any person obtaining a copy
12
// of this software and associated documentation files (the "Software"), to deal
13
// in the Software without restriction, including without limitation the rights
14
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
15
// copies of the Software, and to permit persons to whom the Software is
16
// furnished to do so, subject to the following conditions:
17
//
18
// The above copyright notice and this permission notice shall be included in
19
// all copies or substantial portions of the Software.
20
//
21
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
22
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
24
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
25
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
26
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
27
// THE SOFTWARE.
28

29
package riscv
30

31
import "github.com/twitchyliquid64/golang-asm/obj"
32

33
//go:generate go run ../stringer.go -i $GOFILE -o anames.go -p riscv
34

35
const (
36
	// Base register numberings.
37
	REG_X0 = obj.RBaseRISCV + iota
38
	REG_X1
39
	REG_X2
40
	REG_X3
41
	REG_X4
42
	REG_X5
43
	REG_X6
44
	REG_X7
45
	REG_X8
46
	REG_X9
47
	REG_X10
48
	REG_X11
49
	REG_X12
50
	REG_X13
51
	REG_X14
52
	REG_X15
53
	REG_X16
54
	REG_X17
55
	REG_X18
56
	REG_X19
57
	REG_X20
58
	REG_X21
59
	REG_X22
60
	REG_X23
61
	REG_X24
62
	REG_X25
63
	REG_X26
64
	REG_X27
65
	REG_X28
66
	REG_X29
67
	REG_X30
68
	REG_X31
69

70
	// FP register numberings.
71
	REG_F0
72
	REG_F1
73
	REG_F2
74
	REG_F3
75
	REG_F4
76
	REG_F5
77
	REG_F6
78
	REG_F7
79
	REG_F8
80
	REG_F9
81
	REG_F10
82
	REG_F11
83
	REG_F12
84
	REG_F13
85
	REG_F14
86
	REG_F15
87
	REG_F16
88
	REG_F17
89
	REG_F18
90
	REG_F19
91
	REG_F20
92
	REG_F21
93
	REG_F22
94
	REG_F23
95
	REG_F24
96
	REG_F25
97
	REG_F26
98
	REG_F27
99
	REG_F28
100
	REG_F29
101
	REG_F30
102
	REG_F31
103

104
	// This marks the end of the register numbering.
105
	REG_END
106

107
	// General registers reassigned to ABI names.
108
	REG_ZERO = REG_X0
109
	REG_RA   = REG_X1 // aka REG_LR
110
	REG_SP   = REG_X2
111
	REG_GP   = REG_X3 // aka REG_SB
112
	REG_TP   = REG_X4 // aka REG_G
113
	REG_T0   = REG_X5
114
	REG_T1   = REG_X6
115
	REG_T2   = REG_X7
116
	REG_S0   = REG_X8
117
	REG_S1   = REG_X9
118
	REG_A0   = REG_X10
119
	REG_A1   = REG_X11
120
	REG_A2   = REG_X12
121
	REG_A3   = REG_X13
122
	REG_A4   = REG_X14
123
	REG_A5   = REG_X15
124
	REG_A6   = REG_X16
125
	REG_A7   = REG_X17
126
	REG_S2   = REG_X18
127
	REG_S3   = REG_X19
128
	REG_S4   = REG_X20 // aka REG_CTXT
129
	REG_S5   = REG_X21
130
	REG_S6   = REG_X22
131
	REG_S7   = REG_X23
132
	REG_S8   = REG_X24
133
	REG_S9   = REG_X25
134
	REG_S10  = REG_X26
135
	REG_S11  = REG_X27
136
	REG_T3   = REG_X28
137
	REG_T4   = REG_X29
138
	REG_T5   = REG_X30
139
	REG_T6   = REG_X31 // aka REG_TMP
140

141
	// Go runtime register names.
142
	REG_G    = REG_TP // G pointer.
143
	REG_CTXT = REG_S4 // Context for closures.
144
	REG_LR   = REG_RA // Link register.
145
	REG_TMP  = REG_T6 // Reserved for assembler use.
146

147
	// ABI names for floating point registers.
148
	REG_FT0  = REG_F0
149
	REG_FT1  = REG_F1
150
	REG_FT2  = REG_F2
151
	REG_FT3  = REG_F3
152
	REG_FT4  = REG_F4
153
	REG_FT5  = REG_F5
154
	REG_FT6  = REG_F6
155
	REG_FT7  = REG_F7
156
	REG_FS0  = REG_F8
157
	REG_FS1  = REG_F9
158
	REG_FA0  = REG_F10
159
	REG_FA1  = REG_F11
160
	REG_FA2  = REG_F12
161
	REG_FA3  = REG_F13
162
	REG_FA4  = REG_F14
163
	REG_FA5  = REG_F15
164
	REG_FA6  = REG_F16
165
	REG_FA7  = REG_F17
166
	REG_FS2  = REG_F18
167
	REG_FS3  = REG_F19
168
	REG_FS4  = REG_F20
169
	REG_FS5  = REG_F21
170
	REG_FS6  = REG_F22
171
	REG_FS7  = REG_F23
172
	REG_FS8  = REG_F24
173
	REG_FS9  = REG_F25
174
	REG_FS10 = REG_F26
175
	REG_FS11 = REG_F27
176
	REG_FT8  = REG_F28
177
	REG_FT9  = REG_F29
178
	REG_FT10 = REG_F30
179
	REG_FT11 = REG_F31
180

181
	// Names generated by the SSA compiler.
182
	REGSP = REG_SP
183
	REGG  = REG_G
184
)
185

186
// https://github.com/riscv/riscv-elf-psabi-doc/blob/master/riscv-elf.md#dwarf-register-numbers
187
var RISCV64DWARFRegisters = map[int16]int16{
188
	// Integer Registers.
189
	REG_X0:  0,
190
	REG_X1:  1,
191
	REG_X2:  2,
192
	REG_X3:  3,
193
	REG_X4:  4,
194
	REG_X5:  5,
195
	REG_X6:  6,
196
	REG_X7:  7,
197
	REG_X8:  8,
198
	REG_X9:  9,
199
	REG_X10: 10,
200
	REG_X11: 11,
201
	REG_X12: 12,
202
	REG_X13: 13,
203
	REG_X14: 14,
204
	REG_X15: 15,
205
	REG_X16: 16,
206
	REG_X17: 17,
207
	REG_X18: 18,
208
	REG_X19: 19,
209
	REG_X20: 20,
210
	REG_X21: 21,
211
	REG_X22: 22,
212
	REG_X23: 23,
213
	REG_X24: 24,
214
	REG_X25: 25,
215
	REG_X26: 26,
216
	REG_X27: 27,
217
	REG_X28: 28,
218
	REG_X29: 29,
219
	REG_X30: 30,
220
	REG_X31: 31,
221

222
	// Floating-Point Registers.
223
	REG_F0:  32,
224
	REG_F1:  33,
225
	REG_F2:  34,
226
	REG_F3:  35,
227
	REG_F4:  36,
228
	REG_F5:  37,
229
	REG_F6:  38,
230
	REG_F7:  39,
231
	REG_F8:  40,
232
	REG_F9:  41,
233
	REG_F10: 42,
234
	REG_F11: 43,
235
	REG_F12: 44,
236
	REG_F13: 45,
237
	REG_F14: 46,
238
	REG_F15: 47,
239
	REG_F16: 48,
240
	REG_F17: 49,
241
	REG_F18: 50,
242
	REG_F19: 51,
243
	REG_F20: 52,
244
	REG_F21: 53,
245
	REG_F22: 54,
246
	REG_F23: 55,
247
	REG_F24: 56,
248
	REG_F25: 57,
249
	REG_F26: 58,
250
	REG_F27: 59,
251
	REG_F28: 60,
252
	REG_F29: 61,
253
	REG_F30: 62,
254
	REG_F31: 63,
255
}
256

257
// Prog.Mark flags.
258
const (
259
	// NEED_PCREL_ITYPE_RELOC is set on AUIPC instructions to indicate that
260
	// it is the first instruction in an AUIPC + I-type pair that needs a
261
	// R_RISCV_PCREL_ITYPE relocation.
262
	NEED_PCREL_ITYPE_RELOC = 1 << 0
263

264
	// NEED_PCREL_STYPE_RELOC is set on AUIPC instructions to indicate that
265
	// it is the first instruction in an AUIPC + S-type pair that needs a
266
	// R_RISCV_PCREL_STYPE relocation.
267
	NEED_PCREL_STYPE_RELOC = 1 << 1
268
)
269

270
// RISC-V mnemonics, as defined in the "opcodes" and "opcodes-pseudo" files
271
// from:
272
//
273
//    https://github.com/riscv/riscv-opcodes
274
//
275
// As well as some pseudo-mnemonics (e.g. MOV) used only in the assembler.
276
//
277
// See also "The RISC-V Instruction Set Manual" at:
278
//
279
//    https://riscv.org/specifications/
280
//
281
// If you modify this table, you MUST run 'go generate' to regenerate anames.go!
282
const (
283
	// Unprivileged ISA (Document Version 20190608-Base-Ratified)
284

285
	// 2.4: Integer Computational Instructions
286
	AADDI = obj.ABaseRISCV + obj.A_ARCHSPECIFIC + iota
287
	ASLTI
288
	ASLTIU
289
	AANDI
290
	AORI
291
	AXORI
292
	ASLLI
293
	ASRLI
294
	ASRAI
295
	ALUI
296
	AAUIPC
297
	AADD
298
	ASLT
299
	ASLTU
300
	AAND
301
	AOR
302
	AXOR
303
	ASLL
304
	ASRL
305
	ASUB
306
	ASRA
307

308
	// The SLL/SRL/SRA instructions differ slightly between RV32 and RV64,
309
	// hence there are pseudo-opcodes for the RV32 specific versions.
310
	ASLLIRV32
311
	ASRLIRV32
312
	ASRAIRV32
313

314
	// 2.5: Control Transfer Instructions
315
	AJAL
316
	AJALR
317
	ABEQ
318
	ABNE
319
	ABLT
320
	ABLTU
321
	ABGE
322
	ABGEU
323

324
	// 2.6: Load and Store Instructions
325
	ALW
326
	ALWU
327
	ALH
328
	ALHU
329
	ALB
330
	ALBU
331
	ASW
332
	ASH
333
	ASB
334

335
	// 2.7: Memory Ordering Instructions
336
	AFENCE
337
	AFENCEI
338
	AFENCETSO
339

340
	// 5.2: Integer Computational Instructions (RV64I)
341
	AADDIW
342
	ASLLIW
343
	ASRLIW
344
	ASRAIW
345
	AADDW
346
	ASLLW
347
	ASRLW
348
	ASUBW
349
	ASRAW
350

351
	// 5.3: Load and Store Instructions (RV64I)
352
	ALD
353
	ASD
354

355
	// 7.1: Multiplication Operations
356
	AMUL
357
	AMULH
358
	AMULHU
359
	AMULHSU
360
	AMULW
361
	ADIV
362
	ADIVU
363
	AREM
364
	AREMU
365
	ADIVW
366
	ADIVUW
367
	AREMW
368
	AREMUW
369

370
	// 8.2: Load-Reserved/Store-Conditional Instructions
371
	ALRD
372
	ASCD
373
	ALRW
374
	ASCW
375

376
	// 8.3: Atomic Memory Operations
377
	AAMOSWAPD
378
	AAMOADDD
379
	AAMOANDD
380
	AAMOORD
381
	AAMOXORD
382
	AAMOMAXD
383
	AAMOMAXUD
384
	AAMOMIND
385
	AAMOMINUD
386
	AAMOSWAPW
387
	AAMOADDW
388
	AAMOANDW
389
	AAMOORW
390
	AAMOXORW
391
	AAMOMAXW
392
	AAMOMAXUW
393
	AAMOMINW
394
	AAMOMINUW
395

396
	// 10.1: Base Counters and Timers
397
	ARDCYCLE
398
	ARDCYCLEH
399
	ARDTIME
400
	ARDTIMEH
401
	ARDINSTRET
402
	ARDINSTRETH
403

404
	// 11.2: Floating-Point Control and Status Register
405
	AFRCSR
406
	AFSCSR
407
	AFRRM
408
	AFSRM
409
	AFRFLAGS
410
	AFSFLAGS
411
	AFSRMI
412
	AFSFLAGSI
413

414
	// 11.5: Single-Precision Load and Store Instructions
415
	AFLW
416
	AFSW
417

418
	// 11.6: Single-Precision Floating-Point Computational Instructions
419
	AFADDS
420
	AFSUBS
421
	AFMULS
422
	AFDIVS
423
	AFMINS
424
	AFMAXS
425
	AFSQRTS
426
	AFMADDS
427
	AFMSUBS
428
	AFNMADDS
429
	AFNMSUBS
430

431
	// 11.7: Single-Precision Floating-Point Conversion and Move Instructions
432
	AFCVTWS
433
	AFCVTLS
434
	AFCVTSW
435
	AFCVTSL
436
	AFCVTWUS
437
	AFCVTLUS
438
	AFCVTSWU
439
	AFCVTSLU
440
	AFSGNJS
441
	AFSGNJNS
442
	AFSGNJXS
443
	AFMVXS
444
	AFMVSX
445
	AFMVXW
446
	AFMVWX
447

448
	// 11.8: Single-Precision Floating-Point Compare Instructions
449
	AFEQS
450
	AFLTS
451
	AFLES
452

453
	// 11.9: Single-Precision Floating-Point Classify Instruction
454
	AFCLASSS
455

456
	// 12.3: Double-Precision Load and Store Instructions
457
	AFLD
458
	AFSD
459

460
	// 12.4: Double-Precision Floating-Point Computational Instructions
461
	AFADDD
462
	AFSUBD
463
	AFMULD
464
	AFDIVD
465
	AFMIND
466
	AFMAXD
467
	AFSQRTD
468
	AFMADDD
469
	AFMSUBD
470
	AFNMADDD
471
	AFNMSUBD
472

473
	// 12.5: Double-Precision Floating-Point Conversion and Move Instructions
474
	AFCVTWD
475
	AFCVTLD
476
	AFCVTDW
477
	AFCVTDL
478
	AFCVTWUD
479
	AFCVTLUD
480
	AFCVTDWU
481
	AFCVTDLU
482
	AFCVTSD
483
	AFCVTDS
484
	AFSGNJD
485
	AFSGNJND
486
	AFSGNJXD
487
	AFMVXD
488
	AFMVDX
489

490
	// 12.6: Double-Precision Floating-Point Compare Instructions
491
	AFEQD
492
	AFLTD
493
	AFLED
494

495
	// 12.7: Double-Precision Floating-Point Classify Instruction
496
	AFCLASSD
497

498
	// 13.1 Quad-Precision Load and Store Instructions
499
	AFLQ
500
	AFSQ
501

502
	// 13.2: Quad-Precision Computational Instructions
503
	AFADDQ
504
	AFSUBQ
505
	AFMULQ
506
	AFDIVQ
507
	AFMINQ
508
	AFMAXQ
509
	AFSQRTQ
510
	AFMADDQ
511
	AFMSUBQ
512
	AFNMADDQ
513
	AFNMSUBQ
514

515
	// 13.3 Quad-Precision Convert and Move Instructions
516
	AFCVTWQ
517
	AFCVTLQ
518
	AFCVTSQ
519
	AFCVTDQ
520
	AFCVTQW
521
	AFCVTQL
522
	AFCVTQS
523
	AFCVTQD
524
	AFCVTWUQ
525
	AFCVTLUQ
526
	AFCVTQWU
527
	AFCVTQLU
528
	AFSGNJQ
529
	AFSGNJNQ
530
	AFSGNJXQ
531
	AFMVXQ
532
	AFMVQX
533

534
	// 13.4 Quad-Precision Floating-Point Compare Instructions
535
	AFEQQ
536
	AFLEQ
537
	AFLTQ
538

539
	// 13.5 Quad-Precision Floating-Point Classify Instruction
540
	AFCLASSQ
541

542
	// Privileged ISA (Version 20190608-Priv-MSU-Ratified)
543

544
	// 3.1.9: Instructions to Access CSRs
545
	ACSRRW
546
	ACSRRS
547
	ACSRRC
548
	ACSRRWI
549
	ACSRRSI
550
	ACSRRCI
551

552
	// 3.2.1: Environment Call and Breakpoint
553
	AECALL
554
	ASCALL
555
	AEBREAK
556
	ASBREAK
557

558
	// 3.2.2: Trap-Return Instructions
559
	AMRET
560
	ASRET
561
	AURET
562
	ADRET
563

564
	// 3.2.3: Wait for Interrupt
565
	AWFI
566

567
	// 4.2.1: Supervisor Memory-Management Fence Instruction
568
	ASFENCEVMA
569

570
	// Hypervisor Memory-Management Instructions
571
	AHFENCEGVMA
572
	AHFENCEVVMA
573

574
	// The escape hatch. Inserts a single 32-bit word.
575
	AWORD
576

577
	// Pseudo-instructions.  These get translated by the assembler into other
578
	// instructions, based on their operands.
579
	ABEQZ
580
	ABGEZ
581
	ABGT
582
	ABGTU
583
	ABGTZ
584
	ABLE
585
	ABLEU
586
	ABLEZ
587
	ABLTZ
588
	ABNEZ
589
	AFNEGD
590
	AFNEGS
591
	AFNED
592
	AFNES
593
	AMOV
594
	AMOVB
595
	AMOVBU
596
	AMOVF
597
	AMOVD
598
	AMOVH
599
	AMOVHU
600
	AMOVW
601
	AMOVWU
602
	ANEG
603
	ANEGW
604
	ANOT
605
	ASEQZ
606
	ASNEZ
607

608
	// End marker
609
	ALAST
610
)
611

612
// All unary instructions which write to their arguments (as opposed to reading
613
// from them) go here. The assembly parser uses this information to populate
614
// its AST in a semantically reasonable way.
615
//
616
// Any instructions not listed here are assumed to either be non-unary or to read
617
// from its argument.
618
var unaryDst = map[obj.As]bool{
619
	ARDCYCLE:    true,
620
	ARDCYCLEH:   true,
621
	ARDTIME:     true,
622
	ARDTIMEH:    true,
623
	ARDINSTRET:  true,
624
	ARDINSTRETH: true,
625
}
626

627
// Instruction encoding masks.
628
const (
629
	// ITypeImmMask is a mask including only the immediate portion of
630
	// I-type instructions.
631
	ITypeImmMask = 0xfff00000
632

633
	// STypeImmMask is a mask including only the immediate portion of
634
	// S-type instructions.
635
	STypeImmMask = 0xfe000f80
636

637
	// UTypeImmMask is a mask including only the immediate portion of
638
	// U-type instructions.
639
	UTypeImmMask = 0xfffff000
640

641
	// UJTypeImmMask is a mask including only the immediate portion of
642
	// UJ-type instructions.
643
	UJTypeImmMask = UTypeImmMask
644
)
645

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.