podman

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

30
package mips
31

32
import (
33
	"github.com/twitchyliquid64/golang-asm/obj"
34
)
35

36
//go:generate go run ../stringer.go -i $GOFILE -o anames.go -p mips
37

38
/*
39
 * mips 64
40
 */
41
const (
42
	NSNAME = 8
43
	NSYM   = 50
44
	NREG   = 32 /* number of general registers */
45
	NFREG  = 32 /* number of floating point registers */
46
	NWREG  = 32 /* number of MSA registers */
47
)
48

49
const (
50
	REG_R0 = obj.RBaseMIPS + iota // must be a multiple of 32
51
	REG_R1
52
	REG_R2
53
	REG_R3
54
	REG_R4
55
	REG_R5
56
	REG_R6
57
	REG_R7
58
	REG_R8
59
	REG_R9
60
	REG_R10
61
	REG_R11
62
	REG_R12
63
	REG_R13
64
	REG_R14
65
	REG_R15
66
	REG_R16
67
	REG_R17
68
	REG_R18
69
	REG_R19
70
	REG_R20
71
	REG_R21
72
	REG_R22
73
	REG_R23
74
	REG_R24
75
	REG_R25
76
	REG_R26
77
	REG_R27
78
	REG_R28
79
	REG_R29
80
	REG_R30
81
	REG_R31
82

83
	REG_F0 // must be a multiple of 32
84
	REG_F1
85
	REG_F2
86
	REG_F3
87
	REG_F4
88
	REG_F5
89
	REG_F6
90
	REG_F7
91
	REG_F8
92
	REG_F9
93
	REG_F10
94
	REG_F11
95
	REG_F12
96
	REG_F13
97
	REG_F14
98
	REG_F15
99
	REG_F16
100
	REG_F17
101
	REG_F18
102
	REG_F19
103
	REG_F20
104
	REG_F21
105
	REG_F22
106
	REG_F23
107
	REG_F24
108
	REG_F25
109
	REG_F26
110
	REG_F27
111
	REG_F28
112
	REG_F29
113
	REG_F30
114
	REG_F31
115

116
	// co-processor 0 control registers
117
	REG_M0 // must be a multiple of 32
118
	REG_M1
119
	REG_M2
120
	REG_M3
121
	REG_M4
122
	REG_M5
123
	REG_M6
124
	REG_M7
125
	REG_M8
126
	REG_M9
127
	REG_M10
128
	REG_M11
129
	REG_M12
130
	REG_M13
131
	REG_M14
132
	REG_M15
133
	REG_M16
134
	REG_M17
135
	REG_M18
136
	REG_M19
137
	REG_M20
138
	REG_M21
139
	REG_M22
140
	REG_M23
141
	REG_M24
142
	REG_M25
143
	REG_M26
144
	REG_M27
145
	REG_M28
146
	REG_M29
147
	REG_M30
148
	REG_M31
149

150
	// FPU control registers
151
	REG_FCR0 // must be a multiple of 32
152
	REG_FCR1
153
	REG_FCR2
154
	REG_FCR3
155
	REG_FCR4
156
	REG_FCR5
157
	REG_FCR6
158
	REG_FCR7
159
	REG_FCR8
160
	REG_FCR9
161
	REG_FCR10
162
	REG_FCR11
163
	REG_FCR12
164
	REG_FCR13
165
	REG_FCR14
166
	REG_FCR15
167
	REG_FCR16
168
	REG_FCR17
169
	REG_FCR18
170
	REG_FCR19
171
	REG_FCR20
172
	REG_FCR21
173
	REG_FCR22
174
	REG_FCR23
175
	REG_FCR24
176
	REG_FCR25
177
	REG_FCR26
178
	REG_FCR27
179
	REG_FCR28
180
	REG_FCR29
181
	REG_FCR30
182
	REG_FCR31
183

184
	// MSA registers
185
	// The lower bits of W registers are alias to F registers
186
	REG_W0 // must be a multiple of 32
187
	REG_W1
188
	REG_W2
189
	REG_W3
190
	REG_W4
191
	REG_W5
192
	REG_W6
193
	REG_W7
194
	REG_W8
195
	REG_W9
196
	REG_W10
197
	REG_W11
198
	REG_W12
199
	REG_W13
200
	REG_W14
201
	REG_W15
202
	REG_W16
203
	REG_W17
204
	REG_W18
205
	REG_W19
206
	REG_W20
207
	REG_W21
208
	REG_W22
209
	REG_W23
210
	REG_W24
211
	REG_W25
212
	REG_W26
213
	REG_W27
214
	REG_W28
215
	REG_W29
216
	REG_W30
217
	REG_W31
218

219
	REG_HI
220
	REG_LO
221

222
	REG_LAST = REG_LO // the last defined register
223

224
	REG_SPECIAL = REG_M0
225

226
	REGZERO = REG_R0 /* set to zero */
227
	REGSP   = REG_R29
228
	REGSB   = REG_R28
229
	REGLINK = REG_R31
230
	REGRET  = REG_R1
231
	REGARG  = -1      /* -1 disables passing the first argument in register */
232
	REGRT1  = REG_R1  /* reserved for runtime, duffzero and duffcopy */
233
	REGRT2  = REG_R2  /* reserved for runtime, duffcopy */
234
	REGCTXT = REG_R22 /* context for closures */
235
	REGG    = REG_R30 /* G */
236
	REGTMP  = REG_R23 /* used by the linker */
237
	FREGRET = REG_F0
238
)
239

240
// https://llvm.org/svn/llvm-project/llvm/trunk/lib/Target/Mips/MipsRegisterInfo.td search for DwarfRegNum
241
// https://gcc.gnu.org/viewcvs/gcc/trunk/gcc/config/mips/mips.c?view=co&revision=258099&content-type=text%2Fplain search for mips_dwarf_regno
242
// For now, this is adequate for both 32 and 64 bit.
243
var MIPSDWARFRegisters = map[int16]int16{}
244

245
func init() {
246
	// f assigns dwarfregisters[from:to] = (base):(to-from+base)
247
	f := func(from, to, base int16) {
248
		for r := int16(from); r <= to; r++ {
249
			MIPSDWARFRegisters[r] = (r - from) + base
250
		}
251
	}
252
	f(REG_R0, REG_R31, 0)
253
	f(REG_F0, REG_F31, 32) // For 32-bit MIPS, compiler only uses even numbered registers --  see cmd/compile/internal/ssa/gen/MIPSOps.go
254
	MIPSDWARFRegisters[REG_HI] = 64
255
	MIPSDWARFRegisters[REG_LO] = 65
256
	// The lower bits of W registers are alias to F registers
257
	f(REG_W0, REG_W31, 32)
258
}
259

260
const (
261
	BIG = 32766
262
)
263

264
const (
265
	/* mark flags */
266
	FOLL    = 1 << 0
267
	LABEL   = 1 << 1
268
	LEAF    = 1 << 2
269
	SYNC    = 1 << 3
270
	BRANCH  = 1 << 4
271
	LOAD    = 1 << 5
272
	FCMP    = 1 << 6
273
	NOSCHED = 1 << 7
274

275
	NSCHED = 20
276
)
277

278
const (
279
	C_NONE = iota
280
	C_REG
281
	C_FREG
282
	C_FCREG
283
	C_MREG /* special processor register */
284
	C_WREG /* MSA registers */
285
	C_HI
286
	C_LO
287
	C_ZCON
288
	C_SCON /* 16 bit signed */
289
	C_UCON /* 32 bit signed, low 16 bits 0 */
290
	C_ADD0CON
291
	C_AND0CON
292
	C_ADDCON /* -0x8000 <= v < 0 */
293
	C_ANDCON /* 0 < v <= 0xFFFF */
294
	C_LCON   /* other 32 */
295
	C_DCON   /* other 64 (could subdivide further) */
296
	C_SACON  /* $n(REG) where n <= int16 */
297
	C_SECON
298
	C_LACON /* $n(REG) where int16 < n <= int32 */
299
	C_LECON
300
	C_DACON /* $n(REG) where int32 < n */
301
	C_STCON /* $tlsvar */
302
	C_SBRA
303
	C_LBRA
304
	C_SAUTO
305
	C_LAUTO
306
	C_SEXT
307
	C_LEXT
308
	C_ZOREG
309
	C_SOREG
310
	C_LOREG
311
	C_GOK
312
	C_ADDR
313
	C_TLS
314
	C_TEXTSIZE
315

316
	C_NCLASS /* must be the last */
317
)
318

319
const (
320
	AABSD = obj.ABaseMIPS + obj.A_ARCHSPECIFIC + iota
321
	AABSF
322
	AABSW
323
	AADD
324
	AADDD
325
	AADDF
326
	AADDU
327
	AADDW
328
	AAND
329
	ABEQ
330
	ABFPF
331
	ABFPT
332
	ABGEZ
333
	ABGEZAL
334
	ABGTZ
335
	ABLEZ
336
	ABLTZ
337
	ABLTZAL
338
	ABNE
339
	ABREAK
340
	ACLO
341
	ACLZ
342
	ACMOVF
343
	ACMOVN
344
	ACMOVT
345
	ACMOVZ
346
	ACMPEQD
347
	ACMPEQF
348
	ACMPGED
349
	ACMPGEF
350
	ACMPGTD
351
	ACMPGTF
352
	ADIV
353
	ADIVD
354
	ADIVF
355
	ADIVU
356
	ADIVW
357
	AGOK
358
	ALL
359
	ALLV
360
	ALUI
361
	AMADD
362
	AMOVB
363
	AMOVBU
364
	AMOVD
365
	AMOVDF
366
	AMOVDW
367
	AMOVF
368
	AMOVFD
369
	AMOVFW
370
	AMOVH
371
	AMOVHU
372
	AMOVW
373
	AMOVWD
374
	AMOVWF
375
	AMOVWL
376
	AMOVWR
377
	AMSUB
378
	AMUL
379
	AMULD
380
	AMULF
381
	AMULU
382
	AMULW
383
	ANEGD
384
	ANEGF
385
	ANEGW
386
	ANEGV
387
	ANOOP // hardware nop
388
	ANOR
389
	AOR
390
	AREM
391
	AREMU
392
	ARFE
393
	ASC
394
	ASCV
395
	ASGT
396
	ASGTU
397
	ASLL
398
	ASQRTD
399
	ASQRTF
400
	ASRA
401
	ASRL
402
	ASUB
403
	ASUBD
404
	ASUBF
405
	ASUBU
406
	ASUBW
407
	ASYNC
408
	ASYSCALL
409
	ATEQ
410
	ATLBP
411
	ATLBR
412
	ATLBWI
413
	ATLBWR
414
	ATNE
415
	AWORD
416
	AXOR
417

418
	/* 64-bit */
419
	AMOVV
420
	AMOVVL
421
	AMOVVR
422
	ASLLV
423
	ASRAV
424
	ASRLV
425
	ADIVV
426
	ADIVVU
427
	AREMV
428
	AREMVU
429
	AMULV
430
	AMULVU
431
	AADDV
432
	AADDVU
433
	ASUBV
434
	ASUBVU
435

436
	/* 64-bit FP */
437
	ATRUNCFV
438
	ATRUNCDV
439
	ATRUNCFW
440
	ATRUNCDW
441
	AMOVWU
442
	AMOVFV
443
	AMOVDV
444
	AMOVVF
445
	AMOVVD
446

447
	/* MSA */
448
	AVMOVB
449
	AVMOVH
450
	AVMOVW
451
	AVMOVD
452

453
	ALAST
454

455
	// aliases
456
	AJMP = obj.AJMP
457
	AJAL = obj.ACALL
458
	ARET = obj.ARET
459
)
460

461
func init() {
462
	// The asm encoder generally assumes that the lowest 5 bits of the
463
	// REG_XX constants match the machine instruction encoding, i.e.
464
	// the lowest 5 bits is the register number.
465
	// Check this here.
466
	if REG_R0%32 != 0 {
467
		panic("REG_R0 is not a multiple of 32")
468
	}
469
	if REG_F0%32 != 0 {
470
		panic("REG_F0 is not a multiple of 32")
471
	}
472
	if REG_M0%32 != 0 {
473
		panic("REG_M0 is not a multiple of 32")
474
	}
475
	if REG_FCR0%32 != 0 {
476
		panic("REG_FCR0 is not a multiple of 32")
477
	}
478
	if REG_W0%32 != 0 {
479
		panic("REG_W0 is not a multiple of 32")
480
	}
481
}
482

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

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

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

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