summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/sparc/sparcdefs.h
blob: c59282ffa85ccf561c8deeadf6480fcebf0f4450 (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__