summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/sparc/sparcdefs.h
blob: 7fab760e06baa091fd02f054228d021f068aa1c5 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
// license:BSD-3-Clause
// copyright-holders:Ryan Holtz
//================================================================
//
//  mb86901defs.h - Helpful #defines for emulating the MB86901
//                  series of SPARC processor.
//
//================================================================

#pragma once

#ifndef __MB86901_DEFS_H__
#define __MB86901_DEFS_H__

#define PSR_CWP_MASK		0x0000001f
#define PSR_ET_SHIFT		5
#define PSR_ET_MASK			0x00000020
#define PSR_PS_SHIFT		6
#define PSR_PS_MASK			0x00000040
#define PSR_S_SHIFT			7
#define PSR_S_MASK			0x00000080
#define PSR_PIL_SHIFT		8
#define PSR_PIL_MASK		0x00000f00
#define PSR_EF_SHIFT		12
#define PSR_EF_MASK			0x00001000
#define PSR_EC_SHIFT		13
#define PSR_EC_MASK			0x00002000
#define PSR_ICC_SHIFT		20
#define PSR_RES_MASK		0x000fc000
#define PSR_ICC_MASK		0x00f00000
#define PSR_N_MASK			0x00800000
#define PSR_Z_MASK			0x00400000
#define PSR_V_MASK			0x00200000
#define PSR_C_MASK			0x00100000
#define PSR_VER_SHIFT		24
#define PSR_VER_MASK		0x0f000000
#define PSR_VER				0
#define PSR_IMPL_SHIFT		28
#define PSR_IMPL_MASK		0xf0000000
#define PSR_IMPL			0
#define PSR_ZERO_MASK		(PSR_IMPL_MASK | PSR_VER_MASK | PSR_RES_MASK)

#define ICC_N_SET			(m_psr & PSR_N_MASK)
#define ICC_N				(ICC_N_SET ? 1 : 0)
#define ICC_N_CLEAR			(!ICC_N_SET)
#define SET_ICC_N_FLAG		do { m_psr |= PSR_N_MASK; } while(0)
#define CLEAR_ICC_N_FLAG	do { m_psr &= ~PSR_N_MASK; } while(0)

#define ICC_Z_SET			(m_psr & PSR_Z_MASK)
#define ICC_Z				(ICC_Z_SET ? 1 : 0)
#define ICC_Z_CLEAR			(!ICC_Z_SET)
#define SET_ICC_Z_FLAG		do { m_psr |= PSR_Z_MASK; } while(0)
#define CLEAR_ICC_Z_FLAG	do { m_psr &= ~PSR_Z_MASK; } while(0)

#define ICC_V_SET			(m_psr & PSR_V_MASK)
#define ICC_V				(ICC_V_SET ? 1 : 0)
#define ICC_V_CLEAR			(!ICC_V_SET)
#define SET_ICC_V_FLAG		do { m_psr |= PSR_V_MASK; } while(0)
#define CLEAR_ICC_V_FLAG	do { m_psr &= ~PSR_V_MASK; } while(0)

#define ICC_C_SET			(m_psr & PSR_C_MASK)
#define ICC_C				(ICC_C_SET ? 1 : 0)
#define ICC_C_CLEAR			(!ICC_C_SET)
#define SET_ICC_C_FLAG		do { m_psr |= PSR_C_MASK; } while(0)
#define CLEAR_ICC_C_FLAG	do { m_psr &= ~PSR_C_MASK; } while(0)

#define CLEAR_ICC			do { m_psr &= ~PSR_ICC_MASK; } while(0)

#define TEST_ICC_NZ(x)		do { m_psr &= ~PSR_ICC_MASK; m_psr |= (x & 0x80000000) ? PSR_N_MASK : 0; m_psr |= (x == 0) ? PSR_Z_MASK : 0; } while (0)

#define MAKE_PSR			do { m_psr = (m_impl << PSR_IMPL_SHIFT) | (m_ver << PSR_VER_SHIFT) | (m_icc << PSR_ICC_SHIFT) | (m_ec ? PSR_EC_MASK : 0) | (m_ef ? PSR_EF_MASK : 0) | (m_pil << PSR_PIL_SHIFT) | (m_s ? PSR_S_MASK : 0) | (m_ps ? PSR_PS_MASK : 0) | (m_et ? PSR_ET_MASK : 0) | m_cwp; } while(0)
#define BREAK_PSR			do { m_icc = (m_psr & PSR_ICC_MASK) >> PSR_ICC_SHIFT; m_ec = m_psr & PSR_EC_MASK; m_ef = m_psr & PSR_EF_MASK; m_pil = (m_psr & PSR_PIL_MASK) >> PSR_PIL_SHIFT; m_s = m_psr & PSR_S_MASK; m_ps = m_psr & PSR_PS_MASK; m_et = m_psr & PSR_ET_MASK; m_cwp = m_psr & PSR_CWP_MASK; } while(0)
#define MAKE_ICC			do { m_icc = (m_psr & PSR_ICC_MASK) >> PSR_ICC_SHIFT; } while(0)

#define CWP					m_cwp
#define S					m_s
#define PS					m_ps

#define IS_SUPERVISOR		(m_psr & PSR_S_MASK)
#define IS_USER				(!IS_SUPERVISOR)

#define TRAPS_ENABLED		(m_psr & PSR_ET_MASK)
#define TRAPS_DISABLED		(!TRAPS_ENABLED)

#define PSR					m_psr
#define WIM					m_wim
#define TBR					m_tbr

#define OP		(op >> 30) // gangnam style
#define OP2		((op >> 22) & 7)
#define OP3		((op >> 19) & 63)
#define OPF		((op >> 5) & 0x1ff)
#define OPC		((op >> 5) & 0x1ff)
#define OPFLOW	((op >> 5) & 0x3f)

#define DISP30	(INT32(op << 2))
#define DISP22	(INT32(op << 10) >> 8)
#define DISP19	(INT32(op << 13) >> 11)
#define DISP16	(INT32(((op << 10) & 0xc0000000) | ((op << 16) & 0x3fff0000)) >> 14)
#define IMM22	(op << 10)
#define CONST22 (op & 0x3fffff)
#define SIMM13	(INT32(op << 19) >> 19)
#define SIMM11	(INT32(op << 21) >> 21)
#define SIMM10	(INT32(op << 22) >> 22)
#define SIMM8	(INT32(op << 24) >> 24)
#define IMM7	(op & 0x7f)
#define SIMM7	(INT32(op << 25) >> 25)
#define SHCNT32	(op & 31)
#define SHCNT64 (op & 63)
#define IAMODE  (op & 0x7)
#define USEIMM	((op >> 13) & 1)
#define USEEXT	((op >> 12) & 1)


#define COND	((op >> 25) & 15)
#define RCOND	((op >> 10) & 7)
#define MOVCOND	((op >> 14) & 15)
#define PRED	((op >> 19) & 1)
#define ANNUL	((op >> 29) & 1)
#define BRCC	((op >> 20) & 3)
#define MOVCC	(((op >> 11) & 3) | ((op >> 16) & 4))
#define OPFCC	((op >> 11) & 7)
#define TCCCC	((op >> 11) & 3)
#define ASI		((op >> 5) & 255)
#define MMASK	(op & 15)
#define CMASK	((op >> 4) & 7)

#define RD		((op >> 25) & 31)
#define RS1		((op >> 14) & 31)
#define RS2		(op & 31)

#define FREG(x)	m_fpr[(x)]
#define FDREG	m_fpr[RD]
#define FSR		m_fsr

#define REG(x)	*m_regs[(x)]
#define RDREG	*m_regs[RD]
#define RS1REG	*m_regs[RS1]
#define RS2REG	*m_regs[RS2]
#define SET_RDREG(x)	do { if(RD) { RDREG = (x); } } while (0)
#define ADDRESS	(USEIMM ? (RS1REG + SIMM13) : (RS1REG + RS2REG))

#define PC		m_pc
#define nPC		m_npc

#define Y		m_y

#define ET		m_et
#define EF		m_ef
#define EC		m_ec
#define PIL		m_pil

#define MAE			m_mae
#define HOLD_BUS	m_hold_bus

#define BIT31(x)	((x) & 0x80000000)

#define UPDATE_PC	true
#define PC_UPDATED	false

#define OP_TYPE0	0
#define OP_CALL		1
#define OP_ALU		2
#define OP_LDST		3

#define OP2_UNIMP	0
#define OP2_BICC	2
#define OP2_SETHI	4
#define OP2_FBFCC	6
#define OP2_CBCCC	7

#define OP3_ADD		0
#define OP3_AND		1
#define OP3_OR		2
#define OP3_XOR		3
#define OP3_SUB		4
#define OP3_ANDN	5
#define OP3_ORN		6
#define OP3_XNOR	7
#define OP3_ADDX	8
#define OP3_UMUL	10
#define OP3_SMUL	11
#define OP3_SUBX	12
#define OP3_UDIV	14
#define OP3_SDIV	15
#define OP3_ADDCC	16
#define OP3_ANDCC	17
#define OP3_ORCC	18
#define OP3_XORCC	19
#define OP3_SUBCC	20
#define OP3_ANDNCC	21
#define OP3_ORNCC	22
#define OP3_XNORCC	23
#define OP3_ADDXCC	24
#define OP3_UMULCC	26
#define OP3_SMULCC	27
#define OP3_SUBXCC	28
#define OP3_UDIVCC	30
#define OP3_SDIVCC	31
#define OP3_TADDCC	32
#define OP3_TSUBCC	33
#define OP3_TADDCCTV	34
#define OP3_TSUBCCTV	35
#define OP3_MULSCC	36
#define OP3_SLL		37
#define OP3_SRL		38
#define OP3_SRA		39
#define OP3_RDASR	40
#define OP3_RDPSR	41
#define OP3_RDWIM	42
#define OP3_RDTBR	43
#define OP3_WRASR	48
#define OP3_WRPSR	49
#define OP3_WRWIM	50
#define OP3_WRTBR	51
#define OP3_FPOP1	52
#define OP3_FPOP2	53
#define OP3_JMPL	56
#define OP3_RETT	57
#define OP3_TICC	58
#define OP3_SAVE	60
#define OP3_RESTORE	61

#define OP3_LD		0
#define OP3_LDUB	1
#define OP3_LDUH	2
#define OP3_LDD		3
#define OP3_ST		4
#define OP3_STB		5
#define OP3_STH		6
#define OP3_STD		7
#define OP3_LDSB	9
#define OP3_LDSH	10
#define OP3_LDSTUB	13
#define OP3_SWAP	15
#define OP3_LDA		16
#define OP3_LDUBA	17
#define OP3_LDUHA	18
#define OP3_LDDA	19
#define OP3_STA		20
#define OP3_STBA	21
#define OP3_STHA	22
#define OP3_STDA	23
#define OP3_LDSBA	25
#define OP3_LDSHA	26
#define OP3_LDSTUBA	29
#define OP3_SWAPA	31
#define OP3_LDFPR	32
#define OP3_LDFSR	33
#define OP3_LDDFPR	35
#define OP3_STFPR	36
#define OP3_STFSR	37
#define OP3_STDFQ	38
#define OP3_STDFPR	39
#define OP3_LDCPR	40
#define OP3_LDCSR	41
#define OP3_LDDCPR	43
#define OP3_STCPR	44
#define OP3_STCSR	45
#define OP3_STDCQ	46
#define OP3_STDCPR	47
#define OP3_CPOP1	54
#define OP3_CPOP2	55

#define COND_BN		0
#define COND_BE		1
#define COND_BLE	2
#define COND_BL		3
#define COND_BLEU	4
#define COND_BCS	5
#define COND_BNEG	6
#define COND_BVS	7
#define COND_BA		8
#define COND_BNE	9
#define COND_BG		10
#define COND_BGE	11
#define COND_BGU	12
#define COND_BCC	13
#define COND_BPOS	14
#define COND_BVC	15

#define LDD		(OP3 == OP3_LDD)
#define LD		(OP3 == OP3_LD)
#define LDSH	(OP3 == OP3_LDSH)
#define LDUH	(OP3 == OP3_LDUH)
#define LDSB	(OP3 == OP3_LDSB)
#define LDUB	(OP3 == OP3_LDUB)
#define LDDF	(OP3 == OP3_LDDFPR)
#define LDF		(OP3 == OP3_LDFPR)
#define LDFSR	(OP3 == OP3_LDFSR)
#define LDDC	(OP3 == OP3_LDDCPR)
#define LDC		(OP3 == OP3_LDCPR)
#define LDCSR	(OP3 == OP3_LDCSR)
#define LDDA	(OP3 == OP3_LDDA)
#define LDA		(OP3 == OP3_LDA)
#define LDSHA	(OP3 == OP3_LDSHA)
#define LDUHA	(OP3 == OP3_LDUHA)
#define LDSBA	(OP3 == OP3_LDSBA)
#define LDUBA	(OP3 == OP3_LDUBA)

#define STD		(OP3 == OP3_STD)
#define ST		(OP3 == OP3_ST)
#define STH		(OP3 == OP3_STH)
#define STB		(OP3 == OP3_STB)
#define STDA	(OP3 == OP3_STDA)
#define STA		(OP3 == OP3_STA)
#define STHA	(OP3 == OP3_STHA)
#define STBA	(OP3 == OP3_STBA)
#define STF		(OP3 == OP3_STFPR)
#define STFSR	(OP3 == OP3_STFSR)
#define STDFQ	(OP3 == OP3_STDFQ)
#define STDF	(OP3 == OP3_STDFPR)
#define STC		(OP3 == OP3_STCPR)
#define STCSR	(OP3 == OP3_STCSR)
#define STDCQ	(OP3 == OP3_STDCQ)
#define STDC	(OP3 == OP3_STDCPR)

#define JMPL	(OP3 == OP3_JMPL)
#define TICC	(OP3 == OP3_TICC)
#define RETT	(OP3 == OP3_RETT)

#define SWAP	(OP3 == OP3_SWAP)
#define SWAPA	(OP3 == OP3_SWAPA)

#define FPOP1	(OP3 == OP3_FPOP1)
#define FPOP2	(OP3 == OP3_FPOP2)
#define CPOP1	(OP3 == OP3_CPOP1)
#define CPOP2	(OP3 == OP3_CPOP2)

#define LDSTUB	(OP3 == OP3_LDSTUB)
#define LDSTUBA	(OP3 == OP3_LDSTUBA)

#define ADD		(OP3 == OP3_ADD)
#define ADDX	(OP3 == OP3_ADDX)
#define ADDCC	(OP3 == OP3_ADDCC)
#define ADDXCC	(OP3 == OP3_ADDXCC)

#define SUB		(OP3 == OP3_SUB)
#define SUBX	(OP3 == OP3_SUBX)
#define SUBCC	(OP3 == OP3_SUBCC)
#define SUBXCC	(OP3 == OP3_SUBXCC)

#define TADDCCTV	(OP3 == OP3_TADDCCTV)
#define TSUBCCTV	(OP3 == OP3_TSUBCCTV)

#define AND		(OP3 == OP3_AND)
#define OR		(OP3 == OP3_OR)
#define XOR		(OP3 == OP3_XOR)
#define ANDN	(OP3 == OP3_ANDN)
#define ORN		(OP3 == OP3_ORN)
#define XNOR	(OP3 == OP3_XNOR)
#define ANDCC	(OP3 == OP3_ANDCC)
#define ORCC	(OP3 == OP3_ORCC)
#define XORCC	(OP3 == OP3_XORCC)
#define ANDNCC	(OP3 == OP3_ANDNCC)
#define ORNCC	(OP3 == OP3_ORNCC)
#define XNORCC	(OP3 == OP3_XNORCC)

#define SLL		(OP3 == OP3_SLL)
#define SRL		(OP3 == OP3_SRL)
#define SRA		(OP3 == OP3_SRA)

#define RDASR	(OP3 == OP3_RDASR)
#define RDPSR	(OP3 == OP3_RDPSR)
#define RDWIM	(OP3 == OP3_RDWIM)
#define RDTBR	(OP3 == OP3_RDTBR)

#define WRASR	(OP3 == OP3_WRASR)
#define WRPSR	(OP3 == OP3_WRPSR)
#define WRWIM	(OP3 == OP3_WRWIM)
#define WRTBR	(OP3 == OP3_WRTBR)

#define SAVE	(OP3 == OP3_SAVE)
#define RESTORE	(OP3 == OP3_RESTORE)

#define UMUL	(OP3 == OP3_UMUL)
#define UMULCC	(OP3 == OP3_UMULCC)
#define SMUL	(OP3 == OP3_SMUL)
#define SMULCC	(OP3 == OP3_SMULCC)

#define UDIV	(OP3 == OP3_UDIV)
#define UDIVCC	(OP3 == OP3_UDIVCC)
#define SDIV	(OP3 == OP3_SDIV)
#define SDIVCC	(OP3 == OP3_SDIVCC)

#endif // __MB86901_DEFS_H__