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