podman
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
30package mips31
32import (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*/
41const (42NSNAME = 843NSYM = 5044NREG = 32 /* number of general registers */45NFREG = 32 /* number of floating point registers */46NWREG = 32 /* number of MSA registers */47)
48
49const (50REG_R0 = obj.RBaseMIPS + iota // must be a multiple of 3251REG_R1
52REG_R2
53REG_R3
54REG_R4
55REG_R5
56REG_R6
57REG_R7
58REG_R8
59REG_R9
60REG_R10
61REG_R11
62REG_R12
63REG_R13
64REG_R14
65REG_R15
66REG_R16
67REG_R17
68REG_R18
69REG_R19
70REG_R20
71REG_R21
72REG_R22
73REG_R23
74REG_R24
75REG_R25
76REG_R26
77REG_R27
78REG_R28
79REG_R29
80REG_R30
81REG_R31
82
83REG_F0 // must be a multiple of 3284REG_F1
85REG_F2
86REG_F3
87REG_F4
88REG_F5
89REG_F6
90REG_F7
91REG_F8
92REG_F9
93REG_F10
94REG_F11
95REG_F12
96REG_F13
97REG_F14
98REG_F15
99REG_F16
100REG_F17
101REG_F18
102REG_F19
103REG_F20
104REG_F21
105REG_F22
106REG_F23
107REG_F24
108REG_F25
109REG_F26
110REG_F27
111REG_F28
112REG_F29
113REG_F30
114REG_F31
115
116// co-processor 0 control registers117REG_M0 // must be a multiple of 32118REG_M1
119REG_M2
120REG_M3
121REG_M4
122REG_M5
123REG_M6
124REG_M7
125REG_M8
126REG_M9
127REG_M10
128REG_M11
129REG_M12
130REG_M13
131REG_M14
132REG_M15
133REG_M16
134REG_M17
135REG_M18
136REG_M19
137REG_M20
138REG_M21
139REG_M22
140REG_M23
141REG_M24
142REG_M25
143REG_M26
144REG_M27
145REG_M28
146REG_M29
147REG_M30
148REG_M31
149
150// FPU control registers151REG_FCR0 // must be a multiple of 32152REG_FCR1
153REG_FCR2
154REG_FCR3
155REG_FCR4
156REG_FCR5
157REG_FCR6
158REG_FCR7
159REG_FCR8
160REG_FCR9
161REG_FCR10
162REG_FCR11
163REG_FCR12
164REG_FCR13
165REG_FCR14
166REG_FCR15
167REG_FCR16
168REG_FCR17
169REG_FCR18
170REG_FCR19
171REG_FCR20
172REG_FCR21
173REG_FCR22
174REG_FCR23
175REG_FCR24
176REG_FCR25
177REG_FCR26
178REG_FCR27
179REG_FCR28
180REG_FCR29
181REG_FCR30
182REG_FCR31
183
184// MSA registers185// The lower bits of W registers are alias to F registers186REG_W0 // must be a multiple of 32187REG_W1
188REG_W2
189REG_W3
190REG_W4
191REG_W5
192REG_W6
193REG_W7
194REG_W8
195REG_W9
196REG_W10
197REG_W11
198REG_W12
199REG_W13
200REG_W14
201REG_W15
202REG_W16
203REG_W17
204REG_W18
205REG_W19
206REG_W20
207REG_W21
208REG_W22
209REG_W23
210REG_W24
211REG_W25
212REG_W26
213REG_W27
214REG_W28
215REG_W29
216REG_W30
217REG_W31
218
219REG_HI
220REG_LO
221
222REG_LAST = REG_LO // the last defined register223
224REG_SPECIAL = REG_M0225
226REGZERO = REG_R0 /* set to zero */227REGSP = REG_R29228REGSB = REG_R28229REGLINK = REG_R31230REGRET = REG_R1231REGARG = -1 /* -1 disables passing the first argument in register */232REGRT1 = REG_R1 /* reserved for runtime, duffzero and duffcopy */233REGRT2 = REG_R2 /* reserved for runtime, duffcopy */234REGCTXT = REG_R22 /* context for closures */235REGG = REG_R30 /* G */236REGTMP = REG_R23 /* used by the linker */237FREGRET = REG_F0238)
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.
243var MIPSDWARFRegisters = map[int16]int16{}244
245func init() {246// f assigns dwarfregisters[from:to] = (base):(to-from+base)247f := func(from, to, base int16) {248for r := int16(from); r <= to; r++ {249MIPSDWARFRegisters[r] = (r - from) + base250}251}252f(REG_R0, REG_R31, 0)253f(REG_F0, REG_F31, 32) // For 32-bit MIPS, compiler only uses even numbered registers -- see cmd/compile/internal/ssa/gen/MIPSOps.go254MIPSDWARFRegisters[REG_HI] = 64255MIPSDWARFRegisters[REG_LO] = 65256// The lower bits of W registers are alias to F registers257f(REG_W0, REG_W31, 32)258}
259
260const (261BIG = 32766262)
263
264const (265/* mark flags */266FOLL = 1 << 0267LABEL = 1 << 1268LEAF = 1 << 2269SYNC = 1 << 3270BRANCH = 1 << 4271LOAD = 1 << 5272FCMP = 1 << 6273NOSCHED = 1 << 7274
275NSCHED = 20276)
277
278const (279C_NONE = iota280C_REG
281C_FREG
282C_FCREG
283C_MREG /* special processor register */284C_WREG /* MSA registers */285C_HI
286C_LO
287C_ZCON
288C_SCON /* 16 bit signed */289C_UCON /* 32 bit signed, low 16 bits 0 */290C_ADD0CON
291C_AND0CON
292C_ADDCON /* -0x8000 <= v < 0 */293C_ANDCON /* 0 < v <= 0xFFFF */294C_LCON /* other 32 */295C_DCON /* other 64 (could subdivide further) */296C_SACON /* $n(REG) where n <= int16 */297C_SECON
298C_LACON /* $n(REG) where int16 < n <= int32 */299C_LECON
300C_DACON /* $n(REG) where int32 < n */301C_STCON /* $tlsvar */302C_SBRA
303C_LBRA
304C_SAUTO
305C_LAUTO
306C_SEXT
307C_LEXT
308C_ZOREG
309C_SOREG
310C_LOREG
311C_GOK
312C_ADDR
313C_TLS
314C_TEXTSIZE
315
316C_NCLASS /* must be the last */317)
318
319const (320AABSD = obj.ABaseMIPS + obj.A_ARCHSPECIFIC + iota321AABSF
322AABSW
323AADD
324AADDD
325AADDF
326AADDU
327AADDW
328AAND
329ABEQ
330ABFPF
331ABFPT
332ABGEZ
333ABGEZAL
334ABGTZ
335ABLEZ
336ABLTZ
337ABLTZAL
338ABNE
339ABREAK
340ACLO
341ACLZ
342ACMOVF
343ACMOVN
344ACMOVT
345ACMOVZ
346ACMPEQD
347ACMPEQF
348ACMPGED
349ACMPGEF
350ACMPGTD
351ACMPGTF
352ADIV
353ADIVD
354ADIVF
355ADIVU
356ADIVW
357AGOK
358ALL
359ALLV
360ALUI
361AMADD
362AMOVB
363AMOVBU
364AMOVD
365AMOVDF
366AMOVDW
367AMOVF
368AMOVFD
369AMOVFW
370AMOVH
371AMOVHU
372AMOVW
373AMOVWD
374AMOVWF
375AMOVWL
376AMOVWR
377AMSUB
378AMUL
379AMULD
380AMULF
381AMULU
382AMULW
383ANEGD
384ANEGF
385ANEGW
386ANEGV
387ANOOP // hardware nop388ANOR
389AOR
390AREM
391AREMU
392ARFE
393ASC
394ASCV
395ASGT
396ASGTU
397ASLL
398ASQRTD
399ASQRTF
400ASRA
401ASRL
402ASUB
403ASUBD
404ASUBF
405ASUBU
406ASUBW
407ASYNC
408ASYSCALL
409ATEQ
410ATLBP
411ATLBR
412ATLBWI
413ATLBWR
414ATNE
415AWORD
416AXOR
417
418/* 64-bit */419AMOVV
420AMOVVL
421AMOVVR
422ASLLV
423ASRAV
424ASRLV
425ADIVV
426ADIVVU
427AREMV
428AREMVU
429AMULV
430AMULVU
431AADDV
432AADDVU
433ASUBV
434ASUBVU
435
436/* 64-bit FP */437ATRUNCFV
438ATRUNCDV
439ATRUNCFW
440ATRUNCDW
441AMOVWU
442AMOVFV
443AMOVDV
444AMOVVF
445AMOVVD
446
447/* MSA */448AVMOVB
449AVMOVH
450AVMOVW
451AVMOVD
452
453ALAST
454
455// aliases456AJMP = obj.AJMP457AJAL = obj.ACALL458ARET = obj.ARET459)
460
461func init() {462// The asm encoder generally assumes that the lowest 5 bits of the463// REG_XX constants match the machine instruction encoding, i.e.464// the lowest 5 bits is the register number.465// Check this here.466if REG_R0%32 != 0 {467panic("REG_R0 is not a multiple of 32")468}469if REG_F0%32 != 0 {470panic("REG_F0 is not a multiple of 32")471}472if REG_M0%32 != 0 {473panic("REG_M0 is not a multiple of 32")474}475if REG_FCR0%32 != 0 {476panic("REG_FCR0 is not a multiple of 32")477}478if REG_W0%32 != 0 {479panic("REG_W0 is not a multiple of 32")480}481}
482