1 // license:BSD-3-Clause
2 // copyright-holders:Ryan Holtz
3 //================================================================
4 //
5 //  sparcdefs.h - Helpful #defines for emulating the MB86901
6 //                series of SPARC processor.
7 //
8 //================================================================
9 
10 #pragma once
11 
12 #ifndef CPU_SPARC_SPARC_DEFS_H
13 #define CPU_SPARC_SPARC_DEFS_H
14 
15 #define PSR_CWP_MASK        0x0000001f
16 #define PSR_ET_SHIFT        5
17 #define PSR_ET_MASK         0x00000020
18 #define PSR_PS_SHIFT        6
19 #define PSR_PS_MASK         0x00000040
20 #define PSR_S_SHIFT         7
21 #define PSR_S_MASK          0x00000080
22 #define PSR_PIL_SHIFT       8
23 #define PSR_PIL_MASK        0x00000f00
24 #define PSR_EF_SHIFT        12
25 #define PSR_EF_MASK         0x00001000
26 #define PSR_EC_SHIFT        13
27 #define PSR_EC_MASK         0x00002000
28 #define PSR_ICC_SHIFT       20
29 #define PSR_RES_MASK        0x000fc000
30 #define PSR_ICC_MASK        0x00f00000
31 #define PSR_N_MASK          0x00800000
32 #define PSR_N_SHIFT         23
33 #define PSR_Z_MASK          0x00400000
34 #define PSR_Z_SHIFT         22
35 #define PSR_V_MASK          0x00200000
36 #define PSR_V_SHIFT         21
37 #define PSR_C_MASK          0x00100000
38 #define PSR_C_SHIFT         20
39 #define PSR_VER_SHIFT       24
40 #define PSR_VER_MASK        0x0f000000
41 #define PSR_VER             0
42 #define PSR_IMPL_SHIFT      28
43 #define PSR_IMPL_MASK       0xf0000000
44 #define PSR_IMPL            0
45 #define PSR_ZERO_MASK       (PSR_IMPL_MASK | PSR_VER_MASK | PSR_RES_MASK)
46 
47 #define ICC_N_SET           (m_psr & PSR_N_MASK)
48 #define ICC_N               (ICC_N_SET >> PSR_N_SHIFT)
49 #define ICC_N_CLEAR         (!ICC_N_SET)
50 #define SET_ICC_N_FLAG      do { m_psr |= PSR_N_MASK; } while(0)
51 #define CLEAR_ICC_N_FLAG    do { m_psr &= ~PSR_N_MASK; } while(0)
52 
53 #define ICC_Z_SET           (m_psr & PSR_Z_MASK)
54 #define ICC_Z               (ICC_Z_SET >> PSR_Z_SHIFT)
55 #define ICC_Z_CLEAR         (!ICC_Z_SET)
56 #define SET_ICC_Z_FLAG      do { m_psr |= PSR_Z_MASK; } while(0)
57 #define CLEAR_ICC_Z_FLAG    do { m_psr &= ~PSR_Z_MASK; } while(0)
58 
59 #define ICC_V_SET           (m_psr & PSR_V_MASK)
60 #define ICC_V               (ICC_V_SET >> PSR_V_SHIFT)
61 #define ICC_V_CLEAR         (!ICC_V_SET)
62 #define SET_ICC_V_FLAG      do { m_psr |= PSR_V_MASK; } while(0)
63 #define CLEAR_ICC_V_FLAG    do { m_psr &= ~PSR_V_MASK; } while(0)
64 
65 #define ICC_C_SET           (m_psr & PSR_C_MASK)
66 #define ICC_C               (ICC_C_SET >> PSR_C_SHIFT)
67 #define ICC_C_CLEAR         (!ICC_C_SET)
68 #define SET_ICC_C_FLAG      do { m_psr |= PSR_C_MASK; } while(0)
69 #define CLEAR_ICC_C_FLAG    do { m_psr &= ~PSR_C_MASK; } while(0)
70 
71 #define CLEAR_ICC           do { m_psr &= ~PSR_ICC_MASK; } while(0)
72 
73 #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)
74 
75 #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)
76 #define MAKE_ICC            do { m_icc = (m_psr & PSR_ICC_MASK) >> PSR_ICC_SHIFT; } while(0)
77 
78 #define IS_SUPERVISOR       (m_psr & PSR_S_MASK)
79 #define IS_USER             (!IS_SUPERVISOR)
80 
81 #define TRAPS_ENABLED       (m_psr & PSR_ET_MASK)
82 #define TRAPS_DISABLED      (!TRAPS_ENABLED)
83 
84 #define PSR                 m_psr
85 #define WIM                 m_wim
86 #define TBR                 m_tbr
87 
88 #define OP_NS   (op & 0xc0000000)
89 
90 #define OP      (op >> 30)
91 #define OP2     ((op >> 22) & 7)
92 #define OP3     ((op >> 19) & 63)
93 #define OPF     ((op >> 5) & 0x1ff)
94 #define OPC     ((op >> 5) & 0x1ff)
95 #define OPFLOW  ((op >> 5) & 0x3f)
96 
97 #define DISP30  (int32_t(op << 2))
98 #define DISP22  (int32_t(op << 10) >> 8)
99 #define DISP19  (int32_t(op << 13) >> 11)
100 #define DISP16  (int32_t(((op << 10) & 0xc0000000) | ((op << 16) & 0x3fff0000)) >> 14)
101 #define IMM22   (op << 10)
102 #define CONST22 (op & 0x3fffff)
103 #define SIMM13  (int32_t(op << 19) >> 19)
104 #define SIMM11  (int32_t(op << 21) >> 21)
105 #define SIMM10  (int32_t(op << 22) >> 22)
106 #define SIMM8   (int32_t(op << 24) >> 24)
107 #define IMM7    (op & 0x7f)
108 #define SIMM7   (int32_t(op << 25) >> 25)
109 #define SHCNT32 (op & 31)
110 #define SHCNT64 (op & 63)
111 #define IAMODE  (op & 0x7)
112 #define USEIMM  (op & (1 << 13))
113 #define USEEXT  (op & (1 << 12))
114 
115 
116 #define COND    ((op >> 25) & 15)
117 #define RCOND   ((op >> 10) & 7)
118 #define MOVCOND ((op >> 14) & 15)
119 #define PRED    (op & (1 << 19))
120 #define ANNUL   (op & (1 << 29))
121 #define BRCC    ((op >> 20) & 3)
122 #define MOVCC   (((op >> 11) & 3) | ((op >> 16) & 4))
123 #define OPFCC   ((op >> 11) & 7)
124 #define TCCCC   ((op >> 11) & 3)
125 #define ASI     (uint8_t)(op >> 5)
126 #define MMASK   (op & 15)
127 #define CMASK   ((op >> 4) & 7)
128 
129 #define RD      ((op >> 25) & 31)
130 #define RD_D    ((op >> 25) & 30)
131 #define RDBITS  (op & 0x3e000000)
132 #define RS1     ((op >> 14) & 31)
133 #define RS1_D   ((op >> 14) & 30)
134 #define RS2     (op & 31)
135 #define RS2_D   (op & 30)
136 
137 #define FREG(x) m_fpr[(x)]
138 #define FDREG   m_fpr[RD]
139 #define FSR     m_fsr
140 
141 #define REG(x)  *m_regs[(x)]
142 #define RDREG   *m_regs[RD]
143 #define RS1REG  *m_regs[RS1]
144 #define RS2REG  *m_regs[RS2]
145 #define SET_RDREG(x)    do { if(RD) { RDREG = (x); } } while (0)
146 #define ADDRESS (USEIMM ? (RS1REG + SIMM13) : (RS1REG + RS2REG))
147 
148 #define PC      m_pc
149 #define nPC     m_npc
150 
151 #define Y       m_y
152 
153 #define MAE         m_mae
154 #define HOLD_BUS    m_hold_bus
155 
156 #define BIT31(x)    ((x) & 0x80000000)
157 
158 #define UPDATE_PC   true
159 #define PC_UPDATED  false
160 
161 #define OP_TYPE0    u32(0)
162 #define OP_CALL     u32(1)
163 #define OP_ALU      u32(2)
164 #define OP_LDST     u32(3)
165 
166 #define OP_TYPE0_NS (OP_TYPE0 << 30)
167 #define OP_CALL_NS  (OP_CALL << 30)
168 #define OP_ALU_NS   (OP_ALU << 30)
169 #define OP_LDST_NS  (OP_LDST << 30)
170 
171 #define OP2_UNIMP   0
172 #define OP2_BICC    2
173 #define OP2_SETHI   4
174 #define OP2_FBFCC   6
175 #define OP2_CBCCC   7
176 
177 #define OP3_ADD     0
178 #define OP3_AND     1
179 #define OP3_OR      2
180 #define OP3_XOR     3
181 #define OP3_SUB     4
182 #define OP3_ANDN    5
183 #define OP3_ORN     6
184 #define OP3_XNOR    7
185 #define OP3_ADDX    8
186 #define OP3_UMUL    10
187 #define OP3_SMUL    11
188 #define OP3_SUBX    12
189 #define OP3_UDIV    14
190 #define OP3_SDIV    15
191 #define OP3_ADDCC   16
192 #define OP3_ANDCC   17
193 #define OP3_ORCC    18
194 #define OP3_XORCC   19
195 #define OP3_SUBCC   20
196 #define OP3_ANDNCC  21
197 #define OP3_ORNCC   22
198 #define OP3_XNORCC  23
199 #define OP3_ADDXCC  24
200 #define OP3_UMULCC  26
201 #define OP3_SMULCC  27
202 #define OP3_SUBXCC  28
203 #define OP3_UDIVCC  30
204 #define OP3_SDIVCC  31
205 #define OP3_TADDCC  32
206 #define OP3_TSUBCC  33
207 #define OP3_TADDCCTV    34
208 #define OP3_TSUBCCTV    35
209 #define OP3_MULSCC  36
210 #define OP3_SLL     37
211 #define OP3_SRL     38
212 #define OP3_SRA     39
213 #define OP3_RDASR   40
214 #define OP3_RDPSR   41
215 #define OP3_RDWIM   42
216 #define OP3_RDTBR   43
217 #define OP3_WRASR   48
218 #define OP3_WRPSR   49
219 #define OP3_WRWIM   50
220 #define OP3_WRTBR   51
221 #define OP3_FPOP1   52
222 #define OP3_FPOP2   53
223 #define OP3_JMPL    56
224 #define OP3_RETT    57
225 #define OP3_TICC    58
226 #define OP3_IFLUSH  59
227 #define OP3_SAVE    60
228 #define OP3_RESTORE 61
229 
230 #define OP3_LD      0
231 #define OP3_LDUB    1
232 #define OP3_LDUH    2
233 #define OP3_LDD     3
234 #define OP3_ST      4
235 #define OP3_STB     5
236 #define OP3_STH     6
237 #define OP3_STD     7
238 #define OP3_LDSB    9
239 #define OP3_LDSH    10
240 #define OP3_LDSTUB  13
241 #define OP3_SWAP    15
242 #define OP3_LDA     16
243 #define OP3_LDUBA   17
244 #define OP3_LDUHA   18
245 #define OP3_LDDA    19
246 #define OP3_STA     20
247 #define OP3_STBA    21
248 #define OP3_STHA    22
249 #define OP3_STDA    23
250 #define OP3_LDSBA   25
251 #define OP3_LDSHA   26
252 #define OP3_LDSTUBA 29
253 #define OP3_SWAPA   31
254 #define OP3_LDFPR   32
255 #define OP3_LDFSR   33
256 #define OP3_LDDFPR  35
257 #define OP3_STFPR   36
258 #define OP3_STFSR   37
259 #define OP3_STDFQ   38
260 #define OP3_STDFPR  39
261 #define OP3_LDCPR   40
262 #define OP3_LDCSR   41
263 #define OP3_LDDCPR  43
264 #define OP3_STCPR   44
265 #define OP3_STCSR   45
266 #define OP3_STDCQ   46
267 #define OP3_STDCPR  47
268 #define OP3_CPOP1   54
269 #define OP3_CPOP2   55
270 
271 #define COND_BN     0
272 #define COND_BE     1
273 #define COND_BLE    2
274 #define COND_BL     3
275 #define COND_BLEU   4
276 #define COND_BCS    5
277 #define COND_BNEG   6
278 #define COND_BVS    7
279 #define COND_BA     8
280 #define COND_BNE    9
281 #define COND_BG     10
282 #define COND_BGE    11
283 #define COND_BGU    12
284 #define COND_BCC    13
285 #define COND_BPOS   14
286 #define COND_BVC    15
287 
288 #define LDD     (OP3 == OP3_LDD)
289 #define LD      (OP3 == OP3_LD)
290 #define LDSH    (OP3 == OP3_LDSH)
291 #define LDUH    (OP3 == OP3_LDUH)
292 #define LDSB    (OP3 == OP3_LDSB)
293 #define LDUB    (OP3 == OP3_LDUB)
294 #define LDDF    (OP3 == OP3_LDDFPR)
295 #define LDF     (OP3 == OP3_LDFPR)
296 #define LDFSR   (OP3 == OP3_LDFSR)
297 #define LDDC    (OP3 == OP3_LDDCPR)
298 #define LDC     (OP3 == OP3_LDCPR)
299 #define LDCSR   (OP3 == OP3_LDCSR)
300 #define LDDA    (OP3 == OP3_LDDA)
301 #define LDA     (OP3 == OP3_LDA)
302 #define LDSHA   (OP3 == OP3_LDSHA)
303 #define LDUHA   (OP3 == OP3_LDUHA)
304 #define LDSBA   (OP3 == OP3_LDSBA)
305 #define LDUBA   (OP3 == OP3_LDUBA)
306 
307 #define STD     (OP3 == OP3_STD)
308 #define ST      (OP3 == OP3_ST)
309 #define STH     (OP3 == OP3_STH)
310 #define STB     (OP3 == OP3_STB)
311 #define STDA    (OP3 == OP3_STDA)
312 #define STA     (OP3 == OP3_STA)
313 #define STHA    (OP3 == OP3_STHA)
314 #define STBA    (OP3 == OP3_STBA)
315 #define STF     (OP3 == OP3_STFPR)
316 #define STFSR   (OP3 == OP3_STFSR)
317 #define STDFQ   (OP3 == OP3_STDFQ)
318 #define STDF    (OP3 == OP3_STDFPR)
319 #define STC     (OP3 == OP3_STCPR)
320 #define STCSR   (OP3 == OP3_STCSR)
321 #define STDCQ   (OP3 == OP3_STDCQ)
322 #define STDC    (OP3 == OP3_STDCPR)
323 
324 #define JMPL    (OP3 == OP3_JMPL)
325 #define TICC    (OP3 == OP3_TICC)
326 #define RETT    (OP3 == OP3_RETT)
327 
328 #define SWAP    (OP3 == OP3_SWAP)
329 #define SWAPA   (OP3 == OP3_SWAPA)
330 
331 #define FPOP1   (OP3 == OP3_FPOP1)
332 #define FPOP2   (OP3 == OP3_FPOP2)
333 #define CPOP1   (OP3 == OP3_CPOP1)
334 #define CPOP2   (OP3 == OP3_CPOP2)
335 
336 #define LDSTUB  (OP3 == OP3_LDSTUB)
337 #define LDSTUBA (OP3 == OP3_LDSTUBA)
338 
339 #define ADD     (OP3 == OP3_ADD)
340 #define ADDX    (OP3 == OP3_ADDX)
341 #define ADDCC   (OP3 == OP3_ADDCC)
342 #define ADDXCC  (OP3 == OP3_ADDXCC)
343 
344 #define SUB     (OP3 == OP3_SUB)
345 #define SUBX    (OP3 == OP3_SUBX)
346 #define SUBCC   (OP3 == OP3_SUBCC)
347 #define SUBXCC  (OP3 == OP3_SUBXCC)
348 
349 #define TADDCCTV    (OP3 == OP3_TADDCCTV)
350 #define TSUBCCTV    (OP3 == OP3_TSUBCCTV)
351 
352 #define AND     (OP3 == OP3_AND)
353 #define OR      (OP3 == OP3_OR)
354 #define XOR     (OP3 == OP3_XOR)
355 #define ANDN    (OP3 == OP3_ANDN)
356 #define ORN     (OP3 == OP3_ORN)
357 #define XNOR    (OP3 == OP3_XNOR)
358 #define ANDCC   (OP3 == OP3_ANDCC)
359 #define ORCC    (OP3 == OP3_ORCC)
360 #define XORCC   (OP3 == OP3_XORCC)
361 #define ANDNCC  (OP3 == OP3_ANDNCC)
362 #define ORNCC   (OP3 == OP3_ORNCC)
363 #define XNORCC  (OP3 == OP3_XNORCC)
364 
365 #define SLL     (OP3 == OP3_SLL)
366 #define SRL     (OP3 == OP3_SRL)
367 #define SRA     (OP3 == OP3_SRA)
368 
369 #define RDASR   (OP3 == OP3_RDASR)
370 #define RDPSR   (OP3 == OP3_RDPSR)
371 #define RDWIM   (OP3 == OP3_RDWIM)
372 #define RDTBR   (OP3 == OP3_RDTBR)
373 
374 #define WRASR   (OP3 == OP3_WRASR)
375 #define WRPSR   (OP3 == OP3_WRPSR)
376 #define WRWIM   (OP3 == OP3_WRWIM)
377 #define WRTBR   (OP3 == OP3_WRTBR)
378 
379 #define SAVE    (OP3 == OP3_SAVE)
380 #define RESTORE (OP3 == OP3_RESTORE)
381 
382 #define UMUL    (OP3 == OP3_UMUL)
383 #define UMULCC  (OP3 == OP3_UMULCC)
384 #define SMUL    (OP3 == OP3_SMUL)
385 #define SMULCC  (OP3 == OP3_SMULCC)
386 
387 #define UDIV    (OP3 == OP3_UDIV)
388 #define UDIVCC  (OP3 == OP3_UDIVCC)
389 #define SDIV    (OP3 == OP3_SDIV)
390 #define SDIVCC  (OP3 == OP3_SDIVCC)
391 
392 #define FSR_CEXC_MASK       0x0000001f
393 #define FSR_CEXC_NXC        0x00000001
394 #define FSR_CEXC_DZC        0x00000002
395 #define FSR_CEXC_UFC        0x00000004
396 #define FSR_CEXC_OFC        0x00000008
397 #define FSR_CEXC_NVC        0x00000010
398 
399 #define FSR_AEXC_SHIFT      5
400 #define FSR_AEXC_MASK       0x000003e0
401 #define FSR_AEXC_NXA        0x00000020
402 #define FSR_AEXC_DZA        0x00000040
403 #define FSR_AEXC_UFA        0x00000080
404 #define FSR_AEXC_OFA        0x00000100
405 #define FSR_AEXC_NVA        0x00000200
406 
407 #define FSR_FCC_SHIFT       10
408 #define FSR_FCC_MASK        0x00000c00
409 #define FSR_FCC_EQ          0x00000000
410 #define FSR_FCC_LT          0x00000400
411 #define FSR_FCC_GT          0x00000800
412 #define FSR_FCC_UO          0x00000c00
413 
414 #define FSR_QNE             0x00002000
415 
416 #define FSR_FTT_MASK        0x0001c000
417 #define FSR_FTT_NONE        0x00000000
418 #define FSR_FTT_IEEE        0x00004000
419 #define FSR_FTT_UNFIN       0x00008000
420 #define FSR_FTT_UNIMP       0x0000c000
421 #define FSR_FTT_SEQ         0x00010000
422 
423 #define FSR_VER             0x00020000
424 
425 #define FSR_NS              0x00400000
426 
427 #define FSR_TEM_SHIFT       23
428 #define FSR_TEM_MASK        0x0f800000
429 #define FSR_TEM_NXM         0x00800000
430 #define FSR_TEM_DZM         0x01000000
431 #define FSR_TEM_UFM         0x02000000
432 #define FSR_TEM_OFM         0x04000000
433 #define FSR_TEM_NVM         0x08000000
434 
435 #define FSR_RD_SHIFT        30
436 #define FSR_RD_MASK         0xc0000000
437 #define FSR_RD_NEAR         0x00000000
438 #define FSR_RD_ZERO         0x40000000
439 #define FSR_RD_UP           0x80000000
440 #define FSR_RD_DOWN         0xc0000000
441 
442 #define FSR_RESV_MASK       0x30301000
443 
444 // FPop1
445 #define FPOP_FMOVS          0x001
446 #define FPOP_FNEGS          0x005
447 #define FPOP_FABSS          0x009
448 #define FPOP_FSQRTS         0x029
449 #define FPOP_FSQRTD         0x02a
450 #define FPOP_FSQRTX         0x02b
451 #define FPOP_FADDS          0x041
452 #define FPOP_FADDD          0x042
453 #define FPOP_FADDX          0x043
454 #define FPOP_FSUBS          0x045
455 #define FPOP_FSUBD          0x046
456 #define FPOP_FSUBX          0x047
457 #define FPOP_FMULS          0x049
458 #define FPOP_FMULD          0x04a
459 #define FPOP_FMULX          0x04b
460 #define FPOP_FDIVS          0x04d
461 #define FPOP_FDIVD          0x04e
462 #define FPOP_FDIVX          0x04f
463 #define FPOP_FITOS          0x0c4
464 #define FPOP_FDTOS          0x0c6
465 #define FPOP_FXTOS          0x0c7
466 #define FPOP_FITOD          0x0c8
467 #define FPOP_FSTOD          0x0c9
468 #define FPOP_FXTOD          0x0cb
469 #define FPOP_FITOX          0x0cc
470 #define FPOP_FSTOX          0x0cd
471 #define FPOP_FDTOX          0x0ce
472 #define FPOP_FSTOI          0x0d1
473 #define FPOP_FDTOI          0x0d2
474 #define FPOP_FXTOI          0x0d3
475 
476 // FPop2
477 #define FPOP_FCMPS          0x051
478 #define FPOP_FCMPD          0x052
479 #define FPOP_FCMPX          0x053
480 #define FPOP_FCMPES         0x055
481 #define FPOP_FCMPED         0x056
482 #define FPOP_FCMPEX         0x057
483 
484 #endif // CPU_SPARC_SPARC_DEFS_H
485