podman

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

31
package arm
32

33
import "github.com/twitchyliquid64/golang-asm/obj"
34

35
//go:generate go run ../stringer.go -i $GOFILE -o anames.go -p arm
36

37
const (
38
	NSNAME = 8
39
	NSYM   = 50
40
	NREG   = 16
41
)
42

43
/* -1 disables use of REGARG */
44
const (
45
	REGARG = -1
46
)
47

48
const (
49
	REG_R0 = obj.RBaseARM + iota // must be 16-aligned
50
	REG_R1
51
	REG_R2
52
	REG_R3
53
	REG_R4
54
	REG_R5
55
	REG_R6
56
	REG_R7
57
	REG_R8
58
	REG_R9
59
	REG_R10
60
	REG_R11
61
	REG_R12
62
	REG_R13
63
	REG_R14
64
	REG_R15
65

66
	REG_F0 // must be 16-aligned
67
	REG_F1
68
	REG_F2
69
	REG_F3
70
	REG_F4
71
	REG_F5
72
	REG_F6
73
	REG_F7
74
	REG_F8
75
	REG_F9
76
	REG_F10
77
	REG_F11
78
	REG_F12
79
	REG_F13
80
	REG_F14
81
	REG_F15
82

83
	REG_FPSR // must be 2-aligned
84
	REG_FPCR
85

86
	REG_CPSR // must be 2-aligned
87
	REG_SPSR
88

89
	REGRET = REG_R0
90
	/* compiler allocates R1 up as temps */
91
	/* compiler allocates register variables R3 up */
92
	/* compiler allocates external registers R10 down */
93
	REGEXT = REG_R10
94
	/* these two registers are declared in runtime.h */
95
	REGG = REGEXT - 0
96
	REGM = REGEXT - 1
97

98
	REGCTXT = REG_R7
99
	REGTMP  = REG_R11
100
	REGSP   = REG_R13
101
	REGLINK = REG_R14
102
	REGPC   = REG_R15
103

104
	NFREG = 16
105
	/* compiler allocates register variables F0 up */
106
	/* compiler allocates external registers F7 down */
107
	FREGRET = REG_F0
108
	FREGEXT = REG_F7
109
	FREGTMP = REG_F15
110
)
111

112
// http://infocenter.arm.com/help/topic/com.arm.doc.ihi0040b/IHI0040B_aadwarf.pdf
113
var ARMDWARFRegisters = map[int16]int16{}
114

115
func init() {
116
	// f assigns dwarfregisters[from:to] = (base):(step*(to-from)+base)
117
	f := func(from, to, base, step int16) {
118
		for r := int16(from); r <= to; r++ {
119
			ARMDWARFRegisters[r] = step*(r-from) + base
120
		}
121
	}
122
	f(REG_R0, REG_R15, 0, 1)
123
	f(REG_F0, REG_F15, 64, 2) // Use d0 through D15, aka S0, S2, ..., S30
124
}
125

126
// Special registers, after subtracting obj.RBaseARM, bit 9 indicates
127
// a special register and the low bits select the register.
128
const (
129
	REG_SPECIAL = obj.RBaseARM + 1<<9 + iota
130
	REG_MB_SY
131
	REG_MB_ST
132
	REG_MB_ISH
133
	REG_MB_ISHST
134
	REG_MB_NSH
135
	REG_MB_NSHST
136
	REG_MB_OSH
137
	REG_MB_OSHST
138

139
	MAXREG
140
)
141

142
const (
143
	C_NONE = iota
144
	C_REG
145
	C_REGREG
146
	C_REGREG2
147
	C_REGLIST
148
	C_SHIFT     /* register shift R>>x */
149
	C_SHIFTADDR /* memory address with shifted offset R>>x(R) */
150
	C_FREG
151
	C_PSR
152
	C_FCR
153
	C_SPR /* REG_MB_SY */
154

155
	C_RCON   /* 0xff rotated */
156
	C_NCON   /* ~RCON */
157
	C_RCON2A /* OR of two disjoint C_RCON constants */
158
	C_RCON2S /* subtraction of two disjoint C_RCON constants */
159
	C_SCON   /* 0xffff */
160
	C_LCON
161
	C_LCONADDR
162
	C_ZFCON
163
	C_SFCON
164
	C_LFCON
165

166
	C_RACON
167
	C_LACON
168

169
	C_SBRA
170
	C_LBRA
171

172
	C_HAUTO  /* halfword insn offset (-0xff to 0xff) */
173
	C_FAUTO  /* float insn offset (0 to 0x3fc, word aligned) */
174
	C_HFAUTO /* both H and F */
175
	C_SAUTO  /* -0xfff to 0xfff */
176
	C_LAUTO
177

178
	C_HOREG
179
	C_FOREG
180
	C_HFOREG
181
	C_SOREG
182
	C_ROREG
183
	C_SROREG /* both nil and R */
184
	C_LOREG
185

186
	C_PC
187
	C_SP
188
	C_HREG
189

190
	C_ADDR /* reference to relocatable address */
191

192
	// TLS "var" in local exec mode: will become a constant offset from
193
	// thread local base that is ultimately chosen by the program linker.
194
	C_TLS_LE
195

196
	// TLS "var" in initial exec mode: will become a memory address (chosen
197
	// by the program linker) that the dynamic linker will fill with the
198
	// offset from the thread local base.
199
	C_TLS_IE
200

201
	C_TEXTSIZE
202

203
	C_GOK
204

205
	C_NCLASS /* must be the last */
206
)
207

208
const (
209
	AAND = obj.ABaseARM + obj.A_ARCHSPECIFIC + iota
210
	AEOR
211
	ASUB
212
	ARSB
213
	AADD
214
	AADC
215
	ASBC
216
	ARSC
217
	ATST
218
	ATEQ
219
	ACMP
220
	ACMN
221
	AORR
222
	ABIC
223

224
	AMVN
225

226
	/*
227
	 * Do not reorder or fragment the conditional branch
228
	 * opcodes, or the predication code will break
229
	 */
230
	ABEQ
231
	ABNE
232
	ABCS
233
	ABHS
234
	ABCC
235
	ABLO
236
	ABMI
237
	ABPL
238
	ABVS
239
	ABVC
240
	ABHI
241
	ABLS
242
	ABGE
243
	ABLT
244
	ABGT
245
	ABLE
246

247
	AMOVWD
248
	AMOVWF
249
	AMOVDW
250
	AMOVFW
251
	AMOVFD
252
	AMOVDF
253
	AMOVF
254
	AMOVD
255

256
	ACMPF
257
	ACMPD
258
	AADDF
259
	AADDD
260
	ASUBF
261
	ASUBD
262
	AMULF
263
	AMULD
264
	ANMULF
265
	ANMULD
266
	AMULAF
267
	AMULAD
268
	ANMULAF
269
	ANMULAD
270
	AMULSF
271
	AMULSD
272
	ANMULSF
273
	ANMULSD
274
	AFMULAF
275
	AFMULAD
276
	AFNMULAF
277
	AFNMULAD
278
	AFMULSF
279
	AFMULSD
280
	AFNMULSF
281
	AFNMULSD
282
	ADIVF
283
	ADIVD
284
	ASQRTF
285
	ASQRTD
286
	AABSF
287
	AABSD
288
	ANEGF
289
	ANEGD
290

291
	ASRL
292
	ASRA
293
	ASLL
294
	AMULU
295
	ADIVU
296
	AMUL
297
	AMMUL
298
	ADIV
299
	AMOD
300
	AMODU
301
	ADIVHW
302
	ADIVUHW
303

304
	AMOVB
305
	AMOVBS
306
	AMOVBU
307
	AMOVH
308
	AMOVHS
309
	AMOVHU
310
	AMOVW
311
	AMOVM
312
	ASWPBU
313
	ASWPW
314

315
	ARFE
316
	ASWI
317
	AMULA
318
	AMULS
319
	AMMULA
320
	AMMULS
321

322
	AWORD
323

324
	AMULL
325
	AMULAL
326
	AMULLU
327
	AMULALU
328

329
	ABX
330
	ABXRET
331
	ADWORD
332

333
	ALDREX
334
	ASTREX
335
	ALDREXD
336
	ASTREXD
337

338
	ADMB
339

340
	APLD
341

342
	ACLZ
343
	AREV
344
	AREV16
345
	AREVSH
346
	ARBIT
347

348
	AXTAB
349
	AXTAH
350
	AXTABU
351
	AXTAHU
352

353
	ABFX
354
	ABFXU
355
	ABFC
356
	ABFI
357

358
	AMULWT
359
	AMULWB
360
	AMULBB
361
	AMULAWT
362
	AMULAWB
363
	AMULABB
364

365
	AMRC // MRC/MCR
366

367
	ALAST
368

369
	// aliases
370
	AB  = obj.AJMP
371
	ABL = obj.ACALL
372
)
373

374
/* scond byte */
375
const (
376
	C_SCOND = (1 << 4) - 1
377
	C_SBIT  = 1 << 4
378
	C_PBIT  = 1 << 5
379
	C_WBIT  = 1 << 6
380
	C_FBIT  = 1 << 7 /* psr flags-only */
381
	C_UBIT  = 1 << 7 /* up bit, unsigned bit */
382

383
	// These constants are the ARM condition codes encodings,
384
	// XORed with 14 so that C_SCOND_NONE has value 0,
385
	// so that a zeroed Prog.scond means "always execute".
386
	C_SCOND_XOR = 14
387

388
	C_SCOND_EQ   = 0 ^ C_SCOND_XOR
389
	C_SCOND_NE   = 1 ^ C_SCOND_XOR
390
	C_SCOND_HS   = 2 ^ C_SCOND_XOR
391
	C_SCOND_LO   = 3 ^ C_SCOND_XOR
392
	C_SCOND_MI   = 4 ^ C_SCOND_XOR
393
	C_SCOND_PL   = 5 ^ C_SCOND_XOR
394
	C_SCOND_VS   = 6 ^ C_SCOND_XOR
395
	C_SCOND_VC   = 7 ^ C_SCOND_XOR
396
	C_SCOND_HI   = 8 ^ C_SCOND_XOR
397
	C_SCOND_LS   = 9 ^ C_SCOND_XOR
398
	C_SCOND_GE   = 10 ^ C_SCOND_XOR
399
	C_SCOND_LT   = 11 ^ C_SCOND_XOR
400
	C_SCOND_GT   = 12 ^ C_SCOND_XOR
401
	C_SCOND_LE   = 13 ^ C_SCOND_XOR
402
	C_SCOND_NONE = 14 ^ C_SCOND_XOR
403
	C_SCOND_NV   = 15 ^ C_SCOND_XOR
404

405
	/* D_SHIFT type */
406
	SHIFT_LL = 0 << 5
407
	SHIFT_LR = 1 << 5
408
	SHIFT_AR = 2 << 5
409
	SHIFT_RR = 3 << 5
410
)
411

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

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

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

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