1/* Simulator instruction semantics for iq2000bf. 2 3THIS FILE IS MACHINE GENERATED WITH CGEN. 4 5Copyright 1996-2010 Free Software Foundation, Inc. 6 7This file is part of the GNU simulators. 8 9 This file is free software; you can redistribute it and/or modify 10 it under the terms of the GNU General Public License as published by 11 the Free Software Foundation; either version 3, or (at your option) 12 any later version. 13 14 It is distributed in the hope that it will be useful, but WITHOUT 15 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 16 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public 17 License for more details. 18 19 You should have received a copy of the GNU General Public License along 20 with this program; if not, write to the Free Software Foundation, Inc., 21 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. 22 23*/ 24 25#ifdef DEFINE_LABELS 26 27 /* The labels have the case they have because the enum of insn types 28 is all uppercase and in the non-stdc case the insn symbol is built 29 into the enum name. */ 30 31 static struct { 32 int index; 33 void *label; 34 } labels[] = { 35 { IQ2000BF_INSN_X_INVALID, && case_sem_INSN_X_INVALID }, 36 { IQ2000BF_INSN_X_AFTER, && case_sem_INSN_X_AFTER }, 37 { IQ2000BF_INSN_X_BEFORE, && case_sem_INSN_X_BEFORE }, 38 { IQ2000BF_INSN_X_CTI_CHAIN, && case_sem_INSN_X_CTI_CHAIN }, 39 { IQ2000BF_INSN_X_CHAIN, && case_sem_INSN_X_CHAIN }, 40 { IQ2000BF_INSN_X_BEGIN, && case_sem_INSN_X_BEGIN }, 41 { IQ2000BF_INSN_ADD, && case_sem_INSN_ADD }, 42 { IQ2000BF_INSN_ADDI, && case_sem_INSN_ADDI }, 43 { IQ2000BF_INSN_ADDIU, && case_sem_INSN_ADDIU }, 44 { IQ2000BF_INSN_ADDU, && case_sem_INSN_ADDU }, 45 { IQ2000BF_INSN_ADO16, && case_sem_INSN_ADO16 }, 46 { IQ2000BF_INSN_AND, && case_sem_INSN_AND }, 47 { IQ2000BF_INSN_ANDI, && case_sem_INSN_ANDI }, 48 { IQ2000BF_INSN_ANDOI, && case_sem_INSN_ANDOI }, 49 { IQ2000BF_INSN_NOR, && case_sem_INSN_NOR }, 50 { IQ2000BF_INSN_OR, && case_sem_INSN_OR }, 51 { IQ2000BF_INSN_ORI, && case_sem_INSN_ORI }, 52 { IQ2000BF_INSN_RAM, && case_sem_INSN_RAM }, 53 { IQ2000BF_INSN_SLL, && case_sem_INSN_SLL }, 54 { IQ2000BF_INSN_SLLV, && case_sem_INSN_SLLV }, 55 { IQ2000BF_INSN_SLMV, && case_sem_INSN_SLMV }, 56 { IQ2000BF_INSN_SLT, && case_sem_INSN_SLT }, 57 { IQ2000BF_INSN_SLTI, && case_sem_INSN_SLTI }, 58 { IQ2000BF_INSN_SLTIU, && case_sem_INSN_SLTIU }, 59 { IQ2000BF_INSN_SLTU, && case_sem_INSN_SLTU }, 60 { IQ2000BF_INSN_SRA, && case_sem_INSN_SRA }, 61 { IQ2000BF_INSN_SRAV, && case_sem_INSN_SRAV }, 62 { IQ2000BF_INSN_SRL, && case_sem_INSN_SRL }, 63 { IQ2000BF_INSN_SRLV, && case_sem_INSN_SRLV }, 64 { IQ2000BF_INSN_SRMV, && case_sem_INSN_SRMV }, 65 { IQ2000BF_INSN_SUB, && case_sem_INSN_SUB }, 66 { IQ2000BF_INSN_SUBU, && case_sem_INSN_SUBU }, 67 { IQ2000BF_INSN_XOR, && case_sem_INSN_XOR }, 68 { IQ2000BF_INSN_XORI, && case_sem_INSN_XORI }, 69 { IQ2000BF_INSN_BBI, && case_sem_INSN_BBI }, 70 { IQ2000BF_INSN_BBIN, && case_sem_INSN_BBIN }, 71 { IQ2000BF_INSN_BBV, && case_sem_INSN_BBV }, 72 { IQ2000BF_INSN_BBVN, && case_sem_INSN_BBVN }, 73 { IQ2000BF_INSN_BEQ, && case_sem_INSN_BEQ }, 74 { IQ2000BF_INSN_BEQL, && case_sem_INSN_BEQL }, 75 { IQ2000BF_INSN_BGEZ, && case_sem_INSN_BGEZ }, 76 { IQ2000BF_INSN_BGEZAL, && case_sem_INSN_BGEZAL }, 77 { IQ2000BF_INSN_BGEZALL, && case_sem_INSN_BGEZALL }, 78 { IQ2000BF_INSN_BGEZL, && case_sem_INSN_BGEZL }, 79 { IQ2000BF_INSN_BLTZ, && case_sem_INSN_BLTZ }, 80 { IQ2000BF_INSN_BLTZL, && case_sem_INSN_BLTZL }, 81 { IQ2000BF_INSN_BLTZAL, && case_sem_INSN_BLTZAL }, 82 { IQ2000BF_INSN_BLTZALL, && case_sem_INSN_BLTZALL }, 83 { IQ2000BF_INSN_BMB0, && case_sem_INSN_BMB0 }, 84 { IQ2000BF_INSN_BMB1, && case_sem_INSN_BMB1 }, 85 { IQ2000BF_INSN_BMB2, && case_sem_INSN_BMB2 }, 86 { IQ2000BF_INSN_BMB3, && case_sem_INSN_BMB3 }, 87 { IQ2000BF_INSN_BNE, && case_sem_INSN_BNE }, 88 { IQ2000BF_INSN_BNEL, && case_sem_INSN_BNEL }, 89 { IQ2000BF_INSN_JALR, && case_sem_INSN_JALR }, 90 { IQ2000BF_INSN_JR, && case_sem_INSN_JR }, 91 { IQ2000BF_INSN_LB, && case_sem_INSN_LB }, 92 { IQ2000BF_INSN_LBU, && case_sem_INSN_LBU }, 93 { IQ2000BF_INSN_LH, && case_sem_INSN_LH }, 94 { IQ2000BF_INSN_LHU, && case_sem_INSN_LHU }, 95 { IQ2000BF_INSN_LUI, && case_sem_INSN_LUI }, 96 { IQ2000BF_INSN_LW, && case_sem_INSN_LW }, 97 { IQ2000BF_INSN_SB, && case_sem_INSN_SB }, 98 { IQ2000BF_INSN_SH, && case_sem_INSN_SH }, 99 { IQ2000BF_INSN_SW, && case_sem_INSN_SW }, 100 { IQ2000BF_INSN_BREAK, && case_sem_INSN_BREAK }, 101 { IQ2000BF_INSN_SYSCALL, && case_sem_INSN_SYSCALL }, 102 { IQ2000BF_INSN_ANDOUI, && case_sem_INSN_ANDOUI }, 103 { IQ2000BF_INSN_ORUI, && case_sem_INSN_ORUI }, 104 { IQ2000BF_INSN_BGTZ, && case_sem_INSN_BGTZ }, 105 { IQ2000BF_INSN_BGTZL, && case_sem_INSN_BGTZL }, 106 { IQ2000BF_INSN_BLEZ, && case_sem_INSN_BLEZ }, 107 { IQ2000BF_INSN_BLEZL, && case_sem_INSN_BLEZL }, 108 { IQ2000BF_INSN_MRGB, && case_sem_INSN_MRGB }, 109 { IQ2000BF_INSN_BCTXT, && case_sem_INSN_BCTXT }, 110 { IQ2000BF_INSN_BC0F, && case_sem_INSN_BC0F }, 111 { IQ2000BF_INSN_BC0FL, && case_sem_INSN_BC0FL }, 112 { IQ2000BF_INSN_BC3F, && case_sem_INSN_BC3F }, 113 { IQ2000BF_INSN_BC3FL, && case_sem_INSN_BC3FL }, 114 { IQ2000BF_INSN_BC0T, && case_sem_INSN_BC0T }, 115 { IQ2000BF_INSN_BC0TL, && case_sem_INSN_BC0TL }, 116 { IQ2000BF_INSN_BC3T, && case_sem_INSN_BC3T }, 117 { IQ2000BF_INSN_BC3TL, && case_sem_INSN_BC3TL }, 118 { IQ2000BF_INSN_CFC0, && case_sem_INSN_CFC0 }, 119 { IQ2000BF_INSN_CFC1, && case_sem_INSN_CFC1 }, 120 { IQ2000BF_INSN_CFC2, && case_sem_INSN_CFC2 }, 121 { IQ2000BF_INSN_CFC3, && case_sem_INSN_CFC3 }, 122 { IQ2000BF_INSN_CHKHDR, && case_sem_INSN_CHKHDR }, 123 { IQ2000BF_INSN_CTC0, && case_sem_INSN_CTC0 }, 124 { IQ2000BF_INSN_CTC1, && case_sem_INSN_CTC1 }, 125 { IQ2000BF_INSN_CTC2, && case_sem_INSN_CTC2 }, 126 { IQ2000BF_INSN_CTC3, && case_sem_INSN_CTC3 }, 127 { IQ2000BF_INSN_JCR, && case_sem_INSN_JCR }, 128 { IQ2000BF_INSN_LUC32, && case_sem_INSN_LUC32 }, 129 { IQ2000BF_INSN_LUC32L, && case_sem_INSN_LUC32L }, 130 { IQ2000BF_INSN_LUC64, && case_sem_INSN_LUC64 }, 131 { IQ2000BF_INSN_LUC64L, && case_sem_INSN_LUC64L }, 132 { IQ2000BF_INSN_LUK, && case_sem_INSN_LUK }, 133 { IQ2000BF_INSN_LULCK, && case_sem_INSN_LULCK }, 134 { IQ2000BF_INSN_LUM32, && case_sem_INSN_LUM32 }, 135 { IQ2000BF_INSN_LUM32L, && case_sem_INSN_LUM32L }, 136 { IQ2000BF_INSN_LUM64, && case_sem_INSN_LUM64 }, 137 { IQ2000BF_INSN_LUM64L, && case_sem_INSN_LUM64L }, 138 { IQ2000BF_INSN_LUR, && case_sem_INSN_LUR }, 139 { IQ2000BF_INSN_LURL, && case_sem_INSN_LURL }, 140 { IQ2000BF_INSN_LUULCK, && case_sem_INSN_LUULCK }, 141 { IQ2000BF_INSN_MFC0, && case_sem_INSN_MFC0 }, 142 { IQ2000BF_INSN_MFC1, && case_sem_INSN_MFC1 }, 143 { IQ2000BF_INSN_MFC2, && case_sem_INSN_MFC2 }, 144 { IQ2000BF_INSN_MFC3, && case_sem_INSN_MFC3 }, 145 { IQ2000BF_INSN_MTC0, && case_sem_INSN_MTC0 }, 146 { IQ2000BF_INSN_MTC1, && case_sem_INSN_MTC1 }, 147 { IQ2000BF_INSN_MTC2, && case_sem_INSN_MTC2 }, 148 { IQ2000BF_INSN_MTC3, && case_sem_INSN_MTC3 }, 149 { IQ2000BF_INSN_PKRL, && case_sem_INSN_PKRL }, 150 { IQ2000BF_INSN_PKRLR1, && case_sem_INSN_PKRLR1 }, 151 { IQ2000BF_INSN_PKRLR30, && case_sem_INSN_PKRLR30 }, 152 { IQ2000BF_INSN_RB, && case_sem_INSN_RB }, 153 { IQ2000BF_INSN_RBR1, && case_sem_INSN_RBR1 }, 154 { IQ2000BF_INSN_RBR30, && case_sem_INSN_RBR30 }, 155 { IQ2000BF_INSN_RFE, && case_sem_INSN_RFE }, 156 { IQ2000BF_INSN_RX, && case_sem_INSN_RX }, 157 { IQ2000BF_INSN_RXR1, && case_sem_INSN_RXR1 }, 158 { IQ2000BF_INSN_RXR30, && case_sem_INSN_RXR30 }, 159 { IQ2000BF_INSN_SLEEP, && case_sem_INSN_SLEEP }, 160 { IQ2000BF_INSN_SRRD, && case_sem_INSN_SRRD }, 161 { IQ2000BF_INSN_SRRDL, && case_sem_INSN_SRRDL }, 162 { IQ2000BF_INSN_SRULCK, && case_sem_INSN_SRULCK }, 163 { IQ2000BF_INSN_SRWR, && case_sem_INSN_SRWR }, 164 { IQ2000BF_INSN_SRWRU, && case_sem_INSN_SRWRU }, 165 { IQ2000BF_INSN_TRAPQFL, && case_sem_INSN_TRAPQFL }, 166 { IQ2000BF_INSN_TRAPQNE, && case_sem_INSN_TRAPQNE }, 167 { IQ2000BF_INSN_TRAPREL, && case_sem_INSN_TRAPREL }, 168 { IQ2000BF_INSN_WB, && case_sem_INSN_WB }, 169 { IQ2000BF_INSN_WBU, && case_sem_INSN_WBU }, 170 { IQ2000BF_INSN_WBR1, && case_sem_INSN_WBR1 }, 171 { IQ2000BF_INSN_WBR1U, && case_sem_INSN_WBR1U }, 172 { IQ2000BF_INSN_WBR30, && case_sem_INSN_WBR30 }, 173 { IQ2000BF_INSN_WBR30U, && case_sem_INSN_WBR30U }, 174 { IQ2000BF_INSN_WX, && case_sem_INSN_WX }, 175 { IQ2000BF_INSN_WXU, && case_sem_INSN_WXU }, 176 { IQ2000BF_INSN_WXR1, && case_sem_INSN_WXR1 }, 177 { IQ2000BF_INSN_WXR1U, && case_sem_INSN_WXR1U }, 178 { IQ2000BF_INSN_WXR30, && case_sem_INSN_WXR30 }, 179 { IQ2000BF_INSN_WXR30U, && case_sem_INSN_WXR30U }, 180 { IQ2000BF_INSN_LDW, && case_sem_INSN_LDW }, 181 { IQ2000BF_INSN_SDW, && case_sem_INSN_SDW }, 182 { IQ2000BF_INSN_J, && case_sem_INSN_J }, 183 { IQ2000BF_INSN_JAL, && case_sem_INSN_JAL }, 184 { IQ2000BF_INSN_BMB, && case_sem_INSN_BMB }, 185 { 0, 0 } 186 }; 187 int i; 188 189 for (i = 0; labels[i].label != 0; ++i) 190 { 191#if FAST_P 192 CPU_IDESC (current_cpu) [labels[i].index].sem_fast_lab = labels[i].label; 193#else 194 CPU_IDESC (current_cpu) [labels[i].index].sem_full_lab = labels[i].label; 195#endif 196 } 197 198#undef DEFINE_LABELS 199#endif /* DEFINE_LABELS */ 200 201#ifdef DEFINE_SWITCH 202 203/* If hyper-fast [well not unnecessarily slow] execution is selected, turn 204 off frills like tracing and profiling. */ 205/* FIXME: A better way would be to have TRACE_RESULT check for something 206 that can cause it to be optimized out. Another way would be to emit 207 special handlers into the instruction "stream". */ 208 209#if FAST_P 210#undef TRACE_RESULT 211#define TRACE_RESULT(cpu, abuf, name, type, val) 212#endif 213 214#undef GET_ATTR 215#define GET_ATTR(cpu, num, attr) CGEN_ATTR_VALUE (NULL, abuf->idesc->attrs, CGEN_INSN_##attr) 216 217{ 218 219#if WITH_SCACHE_PBB 220 221/* Branch to next handler without going around main loop. */ 222#define NEXT(vpc) goto * SEM_ARGBUF (vpc) -> semantic.sem_case 223SWITCH (sem, SEM_ARGBUF (vpc) -> semantic.sem_case) 224 225#else /* ! WITH_SCACHE_PBB */ 226 227#define NEXT(vpc) BREAK (sem) 228#ifdef __GNUC__ 229#if FAST_P 230 SWITCH (sem, SEM_ARGBUF (sc) -> idesc->sem_fast_lab) 231#else 232 SWITCH (sem, SEM_ARGBUF (sc) -> idesc->sem_full_lab) 233#endif 234#else 235 SWITCH (sem, SEM_ARGBUF (sc) -> idesc->num) 236#endif 237 238#endif /* ! WITH_SCACHE_PBB */ 239 240 { 241 242 CASE (sem, INSN_X_INVALID) : /* --invalid-- */ 243{ 244 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 245 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 246#define FLD(f) abuf->fields.sfmt_empty.f 247 int UNUSED written = 0; 248 IADDR UNUSED pc = abuf->addr; 249 vpc = SEM_NEXT_VPC (sem_arg, pc, 0); 250 251 { 252 /* Update the recorded pc in the cpu state struct. 253 Only necessary for WITH_SCACHE case, but to avoid the 254 conditional compilation .... */ 255 SET_H_PC (pc); 256 /* Virtual insns have zero size. Overwrite vpc with address of next insn 257 using the default-insn-bitsize spec. When executing insns in parallel 258 we may want to queue the fault and continue execution. */ 259 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 260 vpc = sim_engine_invalid_insn (current_cpu, pc, vpc); 261 } 262 263#undef FLD 264} 265 NEXT (vpc); 266 267 CASE (sem, INSN_X_AFTER) : /* --after-- */ 268{ 269 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 270 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 271#define FLD(f) abuf->fields.sfmt_empty.f 272 int UNUSED written = 0; 273 IADDR UNUSED pc = abuf->addr; 274 vpc = SEM_NEXT_VPC (sem_arg, pc, 0); 275 276 { 277#if WITH_SCACHE_PBB_IQ2000BF 278 iq2000bf_pbb_after (current_cpu, sem_arg); 279#endif 280 } 281 282#undef FLD 283} 284 NEXT (vpc); 285 286 CASE (sem, INSN_X_BEFORE) : /* --before-- */ 287{ 288 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 289 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 290#define FLD(f) abuf->fields.sfmt_empty.f 291 int UNUSED written = 0; 292 IADDR UNUSED pc = abuf->addr; 293 vpc = SEM_NEXT_VPC (sem_arg, pc, 0); 294 295 { 296#if WITH_SCACHE_PBB_IQ2000BF 297 iq2000bf_pbb_before (current_cpu, sem_arg); 298#endif 299 } 300 301#undef FLD 302} 303 NEXT (vpc); 304 305 CASE (sem, INSN_X_CTI_CHAIN) : /* --cti-chain-- */ 306{ 307 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 308 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 309#define FLD(f) abuf->fields.sfmt_empty.f 310 int UNUSED written = 0; 311 IADDR UNUSED pc = abuf->addr; 312 vpc = SEM_NEXT_VPC (sem_arg, pc, 0); 313 314 { 315#if WITH_SCACHE_PBB_IQ2000BF 316#ifdef DEFINE_SWITCH 317 vpc = iq2000bf_pbb_cti_chain (current_cpu, sem_arg, 318 pbb_br_type, pbb_br_npc); 319 BREAK (sem); 320#else 321 /* FIXME: Allow provision of explicit ifmt spec in insn spec. */ 322 vpc = iq2000bf_pbb_cti_chain (current_cpu, sem_arg, 323 CPU_PBB_BR_TYPE (current_cpu), 324 CPU_PBB_BR_NPC (current_cpu)); 325#endif 326#endif 327 } 328 329#undef FLD 330} 331 NEXT (vpc); 332 333 CASE (sem, INSN_X_CHAIN) : /* --chain-- */ 334{ 335 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 336 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 337#define FLD(f) abuf->fields.sfmt_empty.f 338 int UNUSED written = 0; 339 IADDR UNUSED pc = abuf->addr; 340 vpc = SEM_NEXT_VPC (sem_arg, pc, 0); 341 342 { 343#if WITH_SCACHE_PBB_IQ2000BF 344 vpc = iq2000bf_pbb_chain (current_cpu, sem_arg); 345#ifdef DEFINE_SWITCH 346 BREAK (sem); 347#endif 348#endif 349 } 350 351#undef FLD 352} 353 NEXT (vpc); 354 355 CASE (sem, INSN_X_BEGIN) : /* --begin-- */ 356{ 357 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 358 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 359#define FLD(f) abuf->fields.sfmt_empty.f 360 int UNUSED written = 0; 361 IADDR UNUSED pc = abuf->addr; 362 vpc = SEM_NEXT_VPC (sem_arg, pc, 0); 363 364 { 365#if WITH_SCACHE_PBB_IQ2000BF 366#if defined DEFINE_SWITCH || defined FAST_P 367 /* In the switch case FAST_P is a constant, allowing several optimizations 368 in any called inline functions. */ 369 vpc = iq2000bf_pbb_begin (current_cpu, FAST_P); 370#else 371#if 0 /* cgen engine can't handle dynamic fast/full switching yet. */ 372 vpc = iq2000bf_pbb_begin (current_cpu, STATE_RUN_FAST_P (CPU_STATE (current_cpu))); 373#else 374 vpc = iq2000bf_pbb_begin (current_cpu, 0); 375#endif 376#endif 377#endif 378 } 379 380#undef FLD 381} 382 NEXT (vpc); 383 384 CASE (sem, INSN_ADD) : /* add $rd,$rs,$rt */ 385{ 386 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 387 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 388#define FLD(f) abuf->fields.sfmt_mrgb.f 389 int UNUSED written = 0; 390 IADDR UNUSED pc = abuf->addr; 391 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 392 393 { 394 SI opval = ADDSI (GET_H_GR (FLD (f_rs)), GET_H_GR (FLD (f_rt))); 395 SET_H_GR (FLD (f_rd), opval); 396 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 397 } 398 399#undef FLD 400} 401 NEXT (vpc); 402 403 CASE (sem, INSN_ADDI) : /* addi $rt,$rs,$lo16 */ 404{ 405 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 406 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 407#define FLD(f) abuf->fields.sfmt_addi.f 408 int UNUSED written = 0; 409 IADDR UNUSED pc = abuf->addr; 410 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 411 412 { 413 SI opval = ADDSI (GET_H_GR (FLD (f_rs)), EXTHISI (TRUNCSIHI (FLD (f_imm)))); 414 SET_H_GR (FLD (f_rt), opval); 415 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 416 } 417 418#undef FLD 419} 420 NEXT (vpc); 421 422 CASE (sem, INSN_ADDIU) : /* addiu $rt,$rs,$lo16 */ 423{ 424 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 425 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 426#define FLD(f) abuf->fields.sfmt_addi.f 427 int UNUSED written = 0; 428 IADDR UNUSED pc = abuf->addr; 429 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 430 431 { 432 SI opval = ADDSI (GET_H_GR (FLD (f_rs)), EXTHISI (TRUNCSIHI (FLD (f_imm)))); 433 SET_H_GR (FLD (f_rt), opval); 434 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 435 } 436 437#undef FLD 438} 439 NEXT (vpc); 440 441 CASE (sem, INSN_ADDU) : /* addu $rd,$rs,$rt */ 442{ 443 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 444 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 445#define FLD(f) abuf->fields.sfmt_mrgb.f 446 int UNUSED written = 0; 447 IADDR UNUSED pc = abuf->addr; 448 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 449 450 { 451 SI opval = ADDSI (GET_H_GR (FLD (f_rs)), GET_H_GR (FLD (f_rt))); 452 SET_H_GR (FLD (f_rd), opval); 453 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 454 } 455 456#undef FLD 457} 458 NEXT (vpc); 459 460 CASE (sem, INSN_ADO16) : /* ado16 $rd,$rs,$rt */ 461{ 462 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 463 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 464#define FLD(f) abuf->fields.sfmt_mrgb.f 465 int UNUSED written = 0; 466 IADDR UNUSED pc = abuf->addr; 467 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 468 469{ 470 HI tmp_high; 471 HI tmp_low; 472 tmp_low = ADDHI (ANDHI (GET_H_GR (FLD (f_rs)), 65535), ANDHI (GET_H_GR (FLD (f_rt)), 65535)); 473 tmp_high = ADDHI (SRLSI (GET_H_GR (FLD (f_rs)), 16), SRLSI (GET_H_GR (FLD (f_rt)), 16)); 474 { 475 SI opval = ORSI (SLLSI (tmp_high, 16), tmp_low); 476 SET_H_GR (FLD (f_rd), opval); 477 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 478 } 479} 480 481#undef FLD 482} 483 NEXT (vpc); 484 485 CASE (sem, INSN_AND) : /* and $rd,$rs,$rt */ 486{ 487 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 488 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 489#define FLD(f) abuf->fields.sfmt_mrgb.f 490 int UNUSED written = 0; 491 IADDR UNUSED pc = abuf->addr; 492 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 493 494 { 495 SI opval = ANDSI (GET_H_GR (FLD (f_rs)), GET_H_GR (FLD (f_rt))); 496 SET_H_GR (FLD (f_rd), opval); 497 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 498 } 499 500#undef FLD 501} 502 NEXT (vpc); 503 504 CASE (sem, INSN_ANDI) : /* andi $rt,$rs,$lo16 */ 505{ 506 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 507 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 508#define FLD(f) abuf->fields.sfmt_addi.f 509 int UNUSED written = 0; 510 IADDR UNUSED pc = abuf->addr; 511 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 512 513 { 514 SI opval = ANDSI (GET_H_GR (FLD (f_rs)), ZEXTSISI (FLD (f_imm))); 515 SET_H_GR (FLD (f_rt), opval); 516 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 517 } 518 519#undef FLD 520} 521 NEXT (vpc); 522 523 CASE (sem, INSN_ANDOI) : /* andoi $rt,$rs,$lo16 */ 524{ 525 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 526 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 527#define FLD(f) abuf->fields.sfmt_addi.f 528 int UNUSED written = 0; 529 IADDR UNUSED pc = abuf->addr; 530 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 531 532 { 533 SI opval = ANDSI (GET_H_GR (FLD (f_rs)), ORSI (0xffff0000, EXTHISI (TRUNCSIHI (FLD (f_imm))))); 534 SET_H_GR (FLD (f_rt), opval); 535 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 536 } 537 538#undef FLD 539} 540 NEXT (vpc); 541 542 CASE (sem, INSN_NOR) : /* nor $rd,$rs,$rt */ 543{ 544 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 545 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 546#define FLD(f) abuf->fields.sfmt_mrgb.f 547 int UNUSED written = 0; 548 IADDR UNUSED pc = abuf->addr; 549 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 550 551 { 552 SI opval = INVSI (ORSI (GET_H_GR (FLD (f_rs)), GET_H_GR (FLD (f_rt)))); 553 SET_H_GR (FLD (f_rd), opval); 554 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 555 } 556 557#undef FLD 558} 559 NEXT (vpc); 560 561 CASE (sem, INSN_OR) : /* or $rd,$rs,$rt */ 562{ 563 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 564 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 565#define FLD(f) abuf->fields.sfmt_mrgb.f 566 int UNUSED written = 0; 567 IADDR UNUSED pc = abuf->addr; 568 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 569 570 { 571 SI opval = ORSI (GET_H_GR (FLD (f_rs)), GET_H_GR (FLD (f_rt))); 572 SET_H_GR (FLD (f_rd), opval); 573 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 574 } 575 576#undef FLD 577} 578 NEXT (vpc); 579 580 CASE (sem, INSN_ORI) : /* ori $rt,$rs,$lo16 */ 581{ 582 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 583 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 584#define FLD(f) abuf->fields.sfmt_addi.f 585 int UNUSED written = 0; 586 IADDR UNUSED pc = abuf->addr; 587 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 588 589 { 590 SI opval = ORSI (GET_H_GR (FLD (f_rs)), ZEXTSISI (FLD (f_imm))); 591 SET_H_GR (FLD (f_rt), opval); 592 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 593 } 594 595#undef FLD 596} 597 NEXT (vpc); 598 599 CASE (sem, INSN_RAM) : /* ram $rd,$rt,$shamt,$maskl,$maskr */ 600{ 601 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 602 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 603#define FLD(f) abuf->fields.sfmt_ram.f 604 int UNUSED written = 0; 605 IADDR UNUSED pc = abuf->addr; 606 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 607 608{ 609 { 610 SI opval = RORSI (GET_H_GR (FLD (f_rt)), FLD (f_shamt)); 611 SET_H_GR (FLD (f_rd), opval); 612 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 613 } 614 { 615 SI opval = ANDSI (GET_H_GR (FLD (f_rd)), SRLSI (0xffffffff, FLD (f_maskl))); 616 SET_H_GR (FLD (f_rd), opval); 617 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 618 } 619 { 620 SI opval = ANDSI (GET_H_GR (FLD (f_rd)), SLLSI (0xffffffff, FLD (f_rs))); 621 SET_H_GR (FLD (f_rd), opval); 622 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 623 } 624} 625 626#undef FLD 627} 628 NEXT (vpc); 629 630 CASE (sem, INSN_SLL) : /* sll $rd,$rt,$shamt */ 631{ 632 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 633 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 634#define FLD(f) abuf->fields.sfmt_ram.f 635 int UNUSED written = 0; 636 IADDR UNUSED pc = abuf->addr; 637 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 638 639 { 640 SI opval = SLLSI (GET_H_GR (FLD (f_rt)), FLD (f_shamt)); 641 SET_H_GR (FLD (f_rd), opval); 642 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 643 } 644 645#undef FLD 646} 647 NEXT (vpc); 648 649 CASE (sem, INSN_SLLV) : /* sllv $rd,$rt,$rs */ 650{ 651 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 652 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 653#define FLD(f) abuf->fields.sfmt_mrgb.f 654 int UNUSED written = 0; 655 IADDR UNUSED pc = abuf->addr; 656 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 657 658 { 659 SI opval = SLLSI (GET_H_GR (FLD (f_rt)), ANDSI (GET_H_GR (FLD (f_rs)), 31)); 660 SET_H_GR (FLD (f_rd), opval); 661 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 662 } 663 664#undef FLD 665} 666 NEXT (vpc); 667 668 CASE (sem, INSN_SLMV) : /* slmv $rd,$rt,$rs,$shamt */ 669{ 670 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 671 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 672#define FLD(f) abuf->fields.sfmt_ram.f 673 int UNUSED written = 0; 674 IADDR UNUSED pc = abuf->addr; 675 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 676 677 { 678 SI opval = ANDSI (SLLSI (GET_H_GR (FLD (f_rt)), FLD (f_shamt)), SRLSI (0xffffffff, GET_H_GR (FLD (f_rs)))); 679 SET_H_GR (FLD (f_rd), opval); 680 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 681 } 682 683#undef FLD 684} 685 NEXT (vpc); 686 687 CASE (sem, INSN_SLT) : /* slt $rd,$rs,$rt */ 688{ 689 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 690 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 691#define FLD(f) abuf->fields.sfmt_mrgb.f 692 int UNUSED written = 0; 693 IADDR UNUSED pc = abuf->addr; 694 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 695 696if (LTSI (GET_H_GR (FLD (f_rs)), GET_H_GR (FLD (f_rt)))) { 697 { 698 SI opval = 1; 699 SET_H_GR (FLD (f_rd), opval); 700 written |= (1 << 2); 701 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 702 } 703} else { 704 { 705 SI opval = 0; 706 SET_H_GR (FLD (f_rd), opval); 707 written |= (1 << 2); 708 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 709 } 710} 711 712 abuf->written = written; 713#undef FLD 714} 715 NEXT (vpc); 716 717 CASE (sem, INSN_SLTI) : /* slti $rt,$rs,$imm */ 718{ 719 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 720 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 721#define FLD(f) abuf->fields.sfmt_addi.f 722 int UNUSED written = 0; 723 IADDR UNUSED pc = abuf->addr; 724 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 725 726if (LTSI (GET_H_GR (FLD (f_rs)), EXTHISI (TRUNCSIHI (FLD (f_imm))))) { 727 { 728 SI opval = 1; 729 SET_H_GR (FLD (f_rt), opval); 730 written |= (1 << 2); 731 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 732 } 733} else { 734 { 735 SI opval = 0; 736 SET_H_GR (FLD (f_rt), opval); 737 written |= (1 << 2); 738 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 739 } 740} 741 742 abuf->written = written; 743#undef FLD 744} 745 NEXT (vpc); 746 747 CASE (sem, INSN_SLTIU) : /* sltiu $rt,$rs,$imm */ 748{ 749 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 750 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 751#define FLD(f) abuf->fields.sfmt_addi.f 752 int UNUSED written = 0; 753 IADDR UNUSED pc = abuf->addr; 754 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 755 756if (LTUSI (GET_H_GR (FLD (f_rs)), EXTHISI (TRUNCSIHI (FLD (f_imm))))) { 757 { 758 SI opval = 1; 759 SET_H_GR (FLD (f_rt), opval); 760 written |= (1 << 2); 761 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 762 } 763} else { 764 { 765 SI opval = 0; 766 SET_H_GR (FLD (f_rt), opval); 767 written |= (1 << 2); 768 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 769 } 770} 771 772 abuf->written = written; 773#undef FLD 774} 775 NEXT (vpc); 776 777 CASE (sem, INSN_SLTU) : /* sltu $rd,$rs,$rt */ 778{ 779 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 780 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 781#define FLD(f) abuf->fields.sfmt_mrgb.f 782 int UNUSED written = 0; 783 IADDR UNUSED pc = abuf->addr; 784 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 785 786if (LTUSI (GET_H_GR (FLD (f_rs)), GET_H_GR (FLD (f_rt)))) { 787 { 788 SI opval = 1; 789 SET_H_GR (FLD (f_rd), opval); 790 written |= (1 << 2); 791 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 792 } 793} else { 794 { 795 SI opval = 0; 796 SET_H_GR (FLD (f_rd), opval); 797 written |= (1 << 2); 798 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 799 } 800} 801 802 abuf->written = written; 803#undef FLD 804} 805 NEXT (vpc); 806 807 CASE (sem, INSN_SRA) : /* sra $rd,$rt,$shamt */ 808{ 809 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 810 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 811#define FLD(f) abuf->fields.sfmt_ram.f 812 int UNUSED written = 0; 813 IADDR UNUSED pc = abuf->addr; 814 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 815 816 { 817 SI opval = SRASI (GET_H_GR (FLD (f_rt)), FLD (f_shamt)); 818 SET_H_GR (FLD (f_rd), opval); 819 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 820 } 821 822#undef FLD 823} 824 NEXT (vpc); 825 826 CASE (sem, INSN_SRAV) : /* srav $rd,$rt,$rs */ 827{ 828 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 829 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 830#define FLD(f) abuf->fields.sfmt_mrgb.f 831 int UNUSED written = 0; 832 IADDR UNUSED pc = abuf->addr; 833 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 834 835 { 836 SI opval = SRASI (GET_H_GR (FLD (f_rt)), ANDSI (GET_H_GR (FLD (f_rs)), 31)); 837 SET_H_GR (FLD (f_rd), opval); 838 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 839 } 840 841#undef FLD 842} 843 NEXT (vpc); 844 845 CASE (sem, INSN_SRL) : /* srl $rd,$rt,$shamt */ 846{ 847 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 848 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 849#define FLD(f) abuf->fields.sfmt_ram.f 850 int UNUSED written = 0; 851 IADDR UNUSED pc = abuf->addr; 852 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 853 854 { 855 SI opval = SRLSI (GET_H_GR (FLD (f_rt)), FLD (f_shamt)); 856 SET_H_GR (FLD (f_rd), opval); 857 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 858 } 859 860#undef FLD 861} 862 NEXT (vpc); 863 864 CASE (sem, INSN_SRLV) : /* srlv $rd,$rt,$rs */ 865{ 866 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 867 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 868#define FLD(f) abuf->fields.sfmt_mrgb.f 869 int UNUSED written = 0; 870 IADDR UNUSED pc = abuf->addr; 871 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 872 873 { 874 SI opval = SRLSI (GET_H_GR (FLD (f_rt)), ANDSI (GET_H_GR (FLD (f_rs)), 31)); 875 SET_H_GR (FLD (f_rd), opval); 876 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 877 } 878 879#undef FLD 880} 881 NEXT (vpc); 882 883 CASE (sem, INSN_SRMV) : /* srmv $rd,$rt,$rs,$shamt */ 884{ 885 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 886 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 887#define FLD(f) abuf->fields.sfmt_ram.f 888 int UNUSED written = 0; 889 IADDR UNUSED pc = abuf->addr; 890 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 891 892 { 893 SI opval = ANDSI (SRLSI (GET_H_GR (FLD (f_rt)), FLD (f_shamt)), SLLSI (0xffffffff, GET_H_GR (FLD (f_rs)))); 894 SET_H_GR (FLD (f_rd), opval); 895 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 896 } 897 898#undef FLD 899} 900 NEXT (vpc); 901 902 CASE (sem, INSN_SUB) : /* sub $rd,$rs,$rt */ 903{ 904 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 905 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 906#define FLD(f) abuf->fields.sfmt_mrgb.f 907 int UNUSED written = 0; 908 IADDR UNUSED pc = abuf->addr; 909 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 910 911 { 912 SI opval = SUBSI (GET_H_GR (FLD (f_rs)), GET_H_GR (FLD (f_rt))); 913 SET_H_GR (FLD (f_rd), opval); 914 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 915 } 916 917#undef FLD 918} 919 NEXT (vpc); 920 921 CASE (sem, INSN_SUBU) : /* subu $rd,$rs,$rt */ 922{ 923 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 924 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 925#define FLD(f) abuf->fields.sfmt_mrgb.f 926 int UNUSED written = 0; 927 IADDR UNUSED pc = abuf->addr; 928 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 929 930 { 931 SI opval = SUBSI (GET_H_GR (FLD (f_rs)), GET_H_GR (FLD (f_rt))); 932 SET_H_GR (FLD (f_rd), opval); 933 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 934 } 935 936#undef FLD 937} 938 NEXT (vpc); 939 940 CASE (sem, INSN_XOR) : /* xor $rd,$rs,$rt */ 941{ 942 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 943 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 944#define FLD(f) abuf->fields.sfmt_mrgb.f 945 int UNUSED written = 0; 946 IADDR UNUSED pc = abuf->addr; 947 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 948 949 { 950 SI opval = XORSI (GET_H_GR (FLD (f_rs)), GET_H_GR (FLD (f_rt))); 951 SET_H_GR (FLD (f_rd), opval); 952 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 953 } 954 955#undef FLD 956} 957 NEXT (vpc); 958 959 CASE (sem, INSN_XORI) : /* xori $rt,$rs,$lo16 */ 960{ 961 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 962 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 963#define FLD(f) abuf->fields.sfmt_addi.f 964 int UNUSED written = 0; 965 IADDR UNUSED pc = abuf->addr; 966 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 967 968 { 969 SI opval = XORSI (GET_H_GR (FLD (f_rs)), ZEXTSISI (FLD (f_imm))); 970 SET_H_GR (FLD (f_rt), opval); 971 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 972 } 973 974#undef FLD 975} 976 NEXT (vpc); 977 978 CASE (sem, INSN_BBI) : /* bbi $rs($bitnum),$offset */ 979{ 980 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 981 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 982#define FLD(f) abuf->fields.sfmt_bbi.f 983 int UNUSED written = 0; 984 IADDR UNUSED pc = abuf->addr; 985 SEM_BRANCH_INIT 986 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 987 988if (ANDSI (GET_H_GR (FLD (f_rs)), SLLSI (1, FLD (f_rt)))) { 989{ 990 { 991 USI opval = FLD (i_offset); 992 SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc); 993 written |= (1 << 3); 994 TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval); 995 } 996} 997} 998 999 abuf->written = written; 1000 SEM_BRANCH_FINI (vpc); 1001#undef FLD 1002} 1003 NEXT (vpc); 1004 1005 CASE (sem, INSN_BBIN) : /* bbin $rs($bitnum),$offset */ 1006{ 1007 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1008 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1009#define FLD(f) abuf->fields.sfmt_bbi.f 1010 int UNUSED written = 0; 1011 IADDR UNUSED pc = abuf->addr; 1012 SEM_BRANCH_INIT 1013 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 1014 1015if (NOTSI (ANDSI (GET_H_GR (FLD (f_rs)), SLLSI (1, FLD (f_rt))))) { 1016{ 1017 { 1018 USI opval = FLD (i_offset); 1019 SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc); 1020 written |= (1 << 3); 1021 TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval); 1022 } 1023} 1024} 1025 1026 abuf->written = written; 1027 SEM_BRANCH_FINI (vpc); 1028#undef FLD 1029} 1030 NEXT (vpc); 1031 1032 CASE (sem, INSN_BBV) : /* bbv $rs,$rt,$offset */ 1033{ 1034 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1035 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1036#define FLD(f) abuf->fields.sfmt_bbi.f 1037 int UNUSED written = 0; 1038 IADDR UNUSED pc = abuf->addr; 1039 SEM_BRANCH_INIT 1040 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 1041 1042if (ANDSI (GET_H_GR (FLD (f_rs)), SLLSI (1, ANDSI (GET_H_GR (FLD (f_rt)), 31)))) { 1043{ 1044 { 1045 USI opval = FLD (i_offset); 1046 SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc); 1047 written |= (1 << 3); 1048 TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval); 1049 } 1050} 1051} 1052 1053 abuf->written = written; 1054 SEM_BRANCH_FINI (vpc); 1055#undef FLD 1056} 1057 NEXT (vpc); 1058 1059 CASE (sem, INSN_BBVN) : /* bbvn $rs,$rt,$offset */ 1060{ 1061 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1062 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1063#define FLD(f) abuf->fields.sfmt_bbi.f 1064 int UNUSED written = 0; 1065 IADDR UNUSED pc = abuf->addr; 1066 SEM_BRANCH_INIT 1067 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 1068 1069if (NOTSI (ANDSI (GET_H_GR (FLD (f_rs)), SLLSI (1, ANDSI (GET_H_GR (FLD (f_rt)), 31))))) { 1070{ 1071 { 1072 USI opval = FLD (i_offset); 1073 SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc); 1074 written |= (1 << 3); 1075 TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval); 1076 } 1077} 1078} 1079 1080 abuf->written = written; 1081 SEM_BRANCH_FINI (vpc); 1082#undef FLD 1083} 1084 NEXT (vpc); 1085 1086 CASE (sem, INSN_BEQ) : /* beq $rs,$rt,$offset */ 1087{ 1088 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1089 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1090#define FLD(f) abuf->fields.sfmt_bbi.f 1091 int UNUSED written = 0; 1092 IADDR UNUSED pc = abuf->addr; 1093 SEM_BRANCH_INIT 1094 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 1095 1096if (EQSI (GET_H_GR (FLD (f_rs)), GET_H_GR (FLD (f_rt)))) { 1097{ 1098 { 1099 USI opval = FLD (i_offset); 1100 SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc); 1101 written |= (1 << 3); 1102 TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval); 1103 } 1104} 1105} 1106 1107 abuf->written = written; 1108 SEM_BRANCH_FINI (vpc); 1109#undef FLD 1110} 1111 NEXT (vpc); 1112 1113 CASE (sem, INSN_BEQL) : /* beql $rs,$rt,$offset */ 1114{ 1115 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1116 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1117#define FLD(f) abuf->fields.sfmt_bbi.f 1118 int UNUSED written = 0; 1119 IADDR UNUSED pc = abuf->addr; 1120 SEM_BRANCH_INIT 1121 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 1122 1123if (EQSI (GET_H_GR (FLD (f_rs)), GET_H_GR (FLD (f_rt)))) { 1124{ 1125 { 1126 USI opval = FLD (i_offset); 1127 SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc); 1128 written |= (1 << 3); 1129 TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval); 1130 } 1131} 1132} else { 1133if (1) 1134 SEM_SKIP_INSN (current_cpu, sem_arg, vpc); 1135} 1136 1137 abuf->written = written; 1138 SEM_BRANCH_FINI (vpc); 1139#undef FLD 1140} 1141 NEXT (vpc); 1142 1143 CASE (sem, INSN_BGEZ) : /* bgez $rs,$offset */ 1144{ 1145 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1146 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1147#define FLD(f) abuf->fields.sfmt_bbi.f 1148 int UNUSED written = 0; 1149 IADDR UNUSED pc = abuf->addr; 1150 SEM_BRANCH_INIT 1151 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 1152 1153if (GESI (GET_H_GR (FLD (f_rs)), 0)) { 1154{ 1155 { 1156 USI opval = FLD (i_offset); 1157 SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc); 1158 written |= (1 << 2); 1159 TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval); 1160 } 1161} 1162} 1163 1164 abuf->written = written; 1165 SEM_BRANCH_FINI (vpc); 1166#undef FLD 1167} 1168 NEXT (vpc); 1169 1170 CASE (sem, INSN_BGEZAL) : /* bgezal $rs,$offset */ 1171{ 1172 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1173 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1174#define FLD(f) abuf->fields.sfmt_bbi.f 1175 int UNUSED written = 0; 1176 IADDR UNUSED pc = abuf->addr; 1177 SEM_BRANCH_INIT 1178 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 1179 1180if (GESI (GET_H_GR (FLD (f_rs)), 0)) { 1181{ 1182 { 1183 SI opval = ADDSI (pc, 8); 1184 SET_H_GR (((UINT) 31), opval); 1185 written |= (1 << 3); 1186 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 1187 } 1188{ 1189 { 1190 USI opval = FLD (i_offset); 1191 SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc); 1192 written |= (1 << 4); 1193 TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval); 1194 } 1195} 1196} 1197} 1198 1199 abuf->written = written; 1200 SEM_BRANCH_FINI (vpc); 1201#undef FLD 1202} 1203 NEXT (vpc); 1204 1205 CASE (sem, INSN_BGEZALL) : /* bgezall $rs,$offset */ 1206{ 1207 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1208 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1209#define FLD(f) abuf->fields.sfmt_bbi.f 1210 int UNUSED written = 0; 1211 IADDR UNUSED pc = abuf->addr; 1212 SEM_BRANCH_INIT 1213 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 1214 1215if (GESI (GET_H_GR (FLD (f_rs)), 0)) { 1216{ 1217 { 1218 SI opval = ADDSI (pc, 8); 1219 SET_H_GR (((UINT) 31), opval); 1220 written |= (1 << 3); 1221 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 1222 } 1223{ 1224 { 1225 USI opval = FLD (i_offset); 1226 SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc); 1227 written |= (1 << 4); 1228 TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval); 1229 } 1230} 1231} 1232} else { 1233if (1) 1234 SEM_SKIP_INSN (current_cpu, sem_arg, vpc); 1235} 1236 1237 abuf->written = written; 1238 SEM_BRANCH_FINI (vpc); 1239#undef FLD 1240} 1241 NEXT (vpc); 1242 1243 CASE (sem, INSN_BGEZL) : /* bgezl $rs,$offset */ 1244{ 1245 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1246 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1247#define FLD(f) abuf->fields.sfmt_bbi.f 1248 int UNUSED written = 0; 1249 IADDR UNUSED pc = abuf->addr; 1250 SEM_BRANCH_INIT 1251 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 1252 1253if (GESI (GET_H_GR (FLD (f_rs)), 0)) { 1254{ 1255 { 1256 USI opval = FLD (i_offset); 1257 SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc); 1258 written |= (1 << 2); 1259 TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval); 1260 } 1261} 1262} else { 1263if (1) 1264 SEM_SKIP_INSN (current_cpu, sem_arg, vpc); 1265} 1266 1267 abuf->written = written; 1268 SEM_BRANCH_FINI (vpc); 1269#undef FLD 1270} 1271 NEXT (vpc); 1272 1273 CASE (sem, INSN_BLTZ) : /* bltz $rs,$offset */ 1274{ 1275 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1276 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1277#define FLD(f) abuf->fields.sfmt_bbi.f 1278 int UNUSED written = 0; 1279 IADDR UNUSED pc = abuf->addr; 1280 SEM_BRANCH_INIT 1281 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 1282 1283if (LTSI (GET_H_GR (FLD (f_rs)), 0)) { 1284{ 1285 { 1286 USI opval = FLD (i_offset); 1287 SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc); 1288 written |= (1 << 2); 1289 TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval); 1290 } 1291} 1292} 1293 1294 abuf->written = written; 1295 SEM_BRANCH_FINI (vpc); 1296#undef FLD 1297} 1298 NEXT (vpc); 1299 1300 CASE (sem, INSN_BLTZL) : /* bltzl $rs,$offset */ 1301{ 1302 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1303 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1304#define FLD(f) abuf->fields.sfmt_bbi.f 1305 int UNUSED written = 0; 1306 IADDR UNUSED pc = abuf->addr; 1307 SEM_BRANCH_INIT 1308 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 1309 1310if (LTSI (GET_H_GR (FLD (f_rs)), 0)) { 1311{ 1312 { 1313 USI opval = FLD (i_offset); 1314 SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc); 1315 written |= (1 << 2); 1316 TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval); 1317 } 1318} 1319} else { 1320if (1) 1321 SEM_SKIP_INSN (current_cpu, sem_arg, vpc); 1322} 1323 1324 abuf->written = written; 1325 SEM_BRANCH_FINI (vpc); 1326#undef FLD 1327} 1328 NEXT (vpc); 1329 1330 CASE (sem, INSN_BLTZAL) : /* bltzal $rs,$offset */ 1331{ 1332 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1333 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1334#define FLD(f) abuf->fields.sfmt_bbi.f 1335 int UNUSED written = 0; 1336 IADDR UNUSED pc = abuf->addr; 1337 SEM_BRANCH_INIT 1338 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 1339 1340if (LTSI (GET_H_GR (FLD (f_rs)), 0)) { 1341{ 1342 { 1343 SI opval = ADDSI (pc, 8); 1344 SET_H_GR (((UINT) 31), opval); 1345 written |= (1 << 3); 1346 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 1347 } 1348{ 1349 { 1350 USI opval = FLD (i_offset); 1351 SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc); 1352 written |= (1 << 4); 1353 TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval); 1354 } 1355} 1356} 1357} 1358 1359 abuf->written = written; 1360 SEM_BRANCH_FINI (vpc); 1361#undef FLD 1362} 1363 NEXT (vpc); 1364 1365 CASE (sem, INSN_BLTZALL) : /* bltzall $rs,$offset */ 1366{ 1367 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1368 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1369#define FLD(f) abuf->fields.sfmt_bbi.f 1370 int UNUSED written = 0; 1371 IADDR UNUSED pc = abuf->addr; 1372 SEM_BRANCH_INIT 1373 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 1374 1375if (LTSI (GET_H_GR (FLD (f_rs)), 0)) { 1376{ 1377 { 1378 SI opval = ADDSI (pc, 8); 1379 SET_H_GR (((UINT) 31), opval); 1380 written |= (1 << 3); 1381 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 1382 } 1383{ 1384 { 1385 USI opval = FLD (i_offset); 1386 SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc); 1387 written |= (1 << 4); 1388 TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval); 1389 } 1390} 1391} 1392} else { 1393if (1) 1394 SEM_SKIP_INSN (current_cpu, sem_arg, vpc); 1395} 1396 1397 abuf->written = written; 1398 SEM_BRANCH_FINI (vpc); 1399#undef FLD 1400} 1401 NEXT (vpc); 1402 1403 CASE (sem, INSN_BMB0) : /* bmb0 $rs,$rt,$offset */ 1404{ 1405 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1406 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1407#define FLD(f) abuf->fields.sfmt_bbi.f 1408 int UNUSED written = 0; 1409 IADDR UNUSED pc = abuf->addr; 1410 SEM_BRANCH_INIT 1411 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 1412 1413if (EQSI (ANDSI (GET_H_GR (FLD (f_rs)), 255), ANDSI (GET_H_GR (FLD (f_rt)), 255))) { 1414{ 1415 { 1416 USI opval = FLD (i_offset); 1417 SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc); 1418 written |= (1 << 3); 1419 TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval); 1420 } 1421} 1422} 1423 1424 abuf->written = written; 1425 SEM_BRANCH_FINI (vpc); 1426#undef FLD 1427} 1428 NEXT (vpc); 1429 1430 CASE (sem, INSN_BMB1) : /* bmb1 $rs,$rt,$offset */ 1431{ 1432 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1433 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1434#define FLD(f) abuf->fields.sfmt_bbi.f 1435 int UNUSED written = 0; 1436 IADDR UNUSED pc = abuf->addr; 1437 SEM_BRANCH_INIT 1438 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 1439 1440if (EQSI (ANDSI (GET_H_GR (FLD (f_rs)), 65280), ANDSI (GET_H_GR (FLD (f_rt)), 65280))) { 1441{ 1442 { 1443 USI opval = FLD (i_offset); 1444 SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc); 1445 written |= (1 << 3); 1446 TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval); 1447 } 1448} 1449} 1450 1451 abuf->written = written; 1452 SEM_BRANCH_FINI (vpc); 1453#undef FLD 1454} 1455 NEXT (vpc); 1456 1457 CASE (sem, INSN_BMB2) : /* bmb2 $rs,$rt,$offset */ 1458{ 1459 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1460 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1461#define FLD(f) abuf->fields.sfmt_bbi.f 1462 int UNUSED written = 0; 1463 IADDR UNUSED pc = abuf->addr; 1464 SEM_BRANCH_INIT 1465 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 1466 1467if (EQSI (ANDSI (GET_H_GR (FLD (f_rs)), 16711680), ANDSI (GET_H_GR (FLD (f_rt)), 16711680))) { 1468{ 1469 { 1470 USI opval = FLD (i_offset); 1471 SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc); 1472 written |= (1 << 3); 1473 TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval); 1474 } 1475} 1476} 1477 1478 abuf->written = written; 1479 SEM_BRANCH_FINI (vpc); 1480#undef FLD 1481} 1482 NEXT (vpc); 1483 1484 CASE (sem, INSN_BMB3) : /* bmb3 $rs,$rt,$offset */ 1485{ 1486 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1487 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1488#define FLD(f) abuf->fields.sfmt_bbi.f 1489 int UNUSED written = 0; 1490 IADDR UNUSED pc = abuf->addr; 1491 SEM_BRANCH_INIT 1492 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 1493 1494if (EQSI (ANDSI (GET_H_GR (FLD (f_rs)), 0xff000000), ANDSI (GET_H_GR (FLD (f_rt)), 0xff000000))) { 1495{ 1496 { 1497 USI opval = FLD (i_offset); 1498 SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc); 1499 written |= (1 << 3); 1500 TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval); 1501 } 1502} 1503} 1504 1505 abuf->written = written; 1506 SEM_BRANCH_FINI (vpc); 1507#undef FLD 1508} 1509 NEXT (vpc); 1510 1511 CASE (sem, INSN_BNE) : /* bne $rs,$rt,$offset */ 1512{ 1513 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1514 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1515#define FLD(f) abuf->fields.sfmt_bbi.f 1516 int UNUSED written = 0; 1517 IADDR UNUSED pc = abuf->addr; 1518 SEM_BRANCH_INIT 1519 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 1520 1521if (NESI (GET_H_GR (FLD (f_rs)), GET_H_GR (FLD (f_rt)))) { 1522{ 1523 { 1524 USI opval = FLD (i_offset); 1525 SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc); 1526 written |= (1 << 3); 1527 TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval); 1528 } 1529} 1530} 1531 1532 abuf->written = written; 1533 SEM_BRANCH_FINI (vpc); 1534#undef FLD 1535} 1536 NEXT (vpc); 1537 1538 CASE (sem, INSN_BNEL) : /* bnel $rs,$rt,$offset */ 1539{ 1540 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1541 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1542#define FLD(f) abuf->fields.sfmt_bbi.f 1543 int UNUSED written = 0; 1544 IADDR UNUSED pc = abuf->addr; 1545 SEM_BRANCH_INIT 1546 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 1547 1548if (NESI (GET_H_GR (FLD (f_rs)), GET_H_GR (FLD (f_rt)))) { 1549{ 1550 { 1551 USI opval = FLD (i_offset); 1552 SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc); 1553 written |= (1 << 3); 1554 TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval); 1555 } 1556} 1557} else { 1558if (1) 1559 SEM_SKIP_INSN (current_cpu, sem_arg, vpc); 1560} 1561 1562 abuf->written = written; 1563 SEM_BRANCH_FINI (vpc); 1564#undef FLD 1565} 1566 NEXT (vpc); 1567 1568 CASE (sem, INSN_JALR) : /* jalr $rd,$rs */ 1569{ 1570 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1571 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1572#define FLD(f) abuf->fields.sfmt_mrgb.f 1573 int UNUSED written = 0; 1574 IADDR UNUSED pc = abuf->addr; 1575 SEM_BRANCH_INIT 1576 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 1577 1578{ 1579{ 1580 { 1581 SI opval = ADDSI (pc, 8); 1582 SET_H_GR (FLD (f_rd), opval); 1583 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 1584 } 1585 { 1586 USI opval = GET_H_GR (FLD (f_rs)); 1587 SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc); 1588 TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval); 1589 } 1590} 1591} 1592 1593 SEM_BRANCH_FINI (vpc); 1594#undef FLD 1595} 1596 NEXT (vpc); 1597 1598 CASE (sem, INSN_JR) : /* jr $rs */ 1599{ 1600 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1601 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1602#define FLD(f) abuf->fields.sfmt_bbi.f 1603 int UNUSED written = 0; 1604 IADDR UNUSED pc = abuf->addr; 1605 SEM_BRANCH_INIT 1606 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 1607 1608{ 1609 { 1610 USI opval = GET_H_GR (FLD (f_rs)); 1611 SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc); 1612 TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval); 1613 } 1614} 1615 1616 SEM_BRANCH_FINI (vpc); 1617#undef FLD 1618} 1619 NEXT (vpc); 1620 1621 CASE (sem, INSN_LB) : /* lb $rt,$lo16($base) */ 1622{ 1623 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1624 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1625#define FLD(f) abuf->fields.sfmt_addi.f 1626 int UNUSED written = 0; 1627 IADDR UNUSED pc = abuf->addr; 1628 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 1629 1630 { 1631 SI opval = EXTQISI (GETMEMQI (current_cpu, pc, ADDSI (GET_H_GR (FLD (f_rs)), EXTHISI (TRUNCSIHI (FLD (f_imm)))))); 1632 SET_H_GR (FLD (f_rt), opval); 1633 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 1634 } 1635 1636#undef FLD 1637} 1638 NEXT (vpc); 1639 1640 CASE (sem, INSN_LBU) : /* lbu $rt,$lo16($base) */ 1641{ 1642 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1643 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1644#define FLD(f) abuf->fields.sfmt_addi.f 1645 int UNUSED written = 0; 1646 IADDR UNUSED pc = abuf->addr; 1647 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 1648 1649 { 1650 SI opval = ZEXTQISI (GETMEMQI (current_cpu, pc, ADDSI (GET_H_GR (FLD (f_rs)), EXTHISI (TRUNCSIHI (FLD (f_imm)))))); 1651 SET_H_GR (FLD (f_rt), opval); 1652 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 1653 } 1654 1655#undef FLD 1656} 1657 NEXT (vpc); 1658 1659 CASE (sem, INSN_LH) : /* lh $rt,$lo16($base) */ 1660{ 1661 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1662 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1663#define FLD(f) abuf->fields.sfmt_addi.f 1664 int UNUSED written = 0; 1665 IADDR UNUSED pc = abuf->addr; 1666 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 1667 1668 { 1669 SI opval = EXTHISI (GETMEMHI (current_cpu, pc, ADDSI (GET_H_GR (FLD (f_rs)), EXTHISI (TRUNCSIHI (FLD (f_imm)))))); 1670 SET_H_GR (FLD (f_rt), opval); 1671 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 1672 } 1673 1674#undef FLD 1675} 1676 NEXT (vpc); 1677 1678 CASE (sem, INSN_LHU) : /* lhu $rt,$lo16($base) */ 1679{ 1680 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1681 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1682#define FLD(f) abuf->fields.sfmt_addi.f 1683 int UNUSED written = 0; 1684 IADDR UNUSED pc = abuf->addr; 1685 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 1686 1687 { 1688 SI opval = ZEXTHISI (GETMEMHI (current_cpu, pc, ADDSI (GET_H_GR (FLD (f_rs)), EXTHISI (TRUNCSIHI (FLD (f_imm)))))); 1689 SET_H_GR (FLD (f_rt), opval); 1690 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 1691 } 1692 1693#undef FLD 1694} 1695 NEXT (vpc); 1696 1697 CASE (sem, INSN_LUI) : /* lui $rt,$hi16 */ 1698{ 1699 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1700 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1701#define FLD(f) abuf->fields.sfmt_addi.f 1702 int UNUSED written = 0; 1703 IADDR UNUSED pc = abuf->addr; 1704 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 1705 1706 { 1707 SI opval = SLLSI (FLD (f_imm), 16); 1708 SET_H_GR (FLD (f_rt), opval); 1709 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 1710 } 1711 1712#undef FLD 1713} 1714 NEXT (vpc); 1715 1716 CASE (sem, INSN_LW) : /* lw $rt,$lo16($base) */ 1717{ 1718 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1719 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1720#define FLD(f) abuf->fields.sfmt_addi.f 1721 int UNUSED written = 0; 1722 IADDR UNUSED pc = abuf->addr; 1723 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 1724 1725 { 1726 SI opval = GETMEMSI (current_cpu, pc, ADDSI (GET_H_GR (FLD (f_rs)), EXTHISI (TRUNCSIHI (FLD (f_imm))))); 1727 SET_H_GR (FLD (f_rt), opval); 1728 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 1729 } 1730 1731#undef FLD 1732} 1733 NEXT (vpc); 1734 1735 CASE (sem, INSN_SB) : /* sb $rt,$lo16($base) */ 1736{ 1737 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1738 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1739#define FLD(f) abuf->fields.sfmt_addi.f 1740 int UNUSED written = 0; 1741 IADDR UNUSED pc = abuf->addr; 1742 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 1743 1744 { 1745 QI opval = ANDQI (GET_H_GR (FLD (f_rt)), 255); 1746 SETMEMQI (current_cpu, pc, ADDSI (GET_H_GR (FLD (f_rs)), EXTHISI (TRUNCSIHI (FLD (f_imm)))), opval); 1747 TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval); 1748 } 1749 1750#undef FLD 1751} 1752 NEXT (vpc); 1753 1754 CASE (sem, INSN_SH) : /* sh $rt,$lo16($base) */ 1755{ 1756 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1757 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1758#define FLD(f) abuf->fields.sfmt_addi.f 1759 int UNUSED written = 0; 1760 IADDR UNUSED pc = abuf->addr; 1761 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 1762 1763 { 1764 HI opval = ANDHI (GET_H_GR (FLD (f_rt)), 65535); 1765 SETMEMHI (current_cpu, pc, ADDSI (GET_H_GR (FLD (f_rs)), EXTHISI (TRUNCSIHI (FLD (f_imm)))), opval); 1766 TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval); 1767 } 1768 1769#undef FLD 1770} 1771 NEXT (vpc); 1772 1773 CASE (sem, INSN_SW) : /* sw $rt,$lo16($base) */ 1774{ 1775 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1776 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1777#define FLD(f) abuf->fields.sfmt_addi.f 1778 int UNUSED written = 0; 1779 IADDR UNUSED pc = abuf->addr; 1780 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 1781 1782 { 1783 SI opval = GET_H_GR (FLD (f_rt)); 1784 SETMEMSI (current_cpu, pc, ADDSI (GET_H_GR (FLD (f_rs)), EXTHISI (TRUNCSIHI (FLD (f_imm)))), opval); 1785 TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval); 1786 } 1787 1788#undef FLD 1789} 1790 NEXT (vpc); 1791 1792 CASE (sem, INSN_BREAK) : /* break */ 1793{ 1794 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1795 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1796#define FLD(f) abuf->fields.sfmt_empty.f 1797 int UNUSED written = 0; 1798 IADDR UNUSED pc = abuf->addr; 1799 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 1800 1801do_break (current_cpu, pc); 1802 1803#undef FLD 1804} 1805 NEXT (vpc); 1806 1807 CASE (sem, INSN_SYSCALL) : /* syscall */ 1808{ 1809 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1810 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1811#define FLD(f) abuf->fields.sfmt_empty.f 1812 int UNUSED written = 0; 1813 IADDR UNUSED pc = abuf->addr; 1814 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 1815 1816do_syscall (current_cpu); 1817 1818#undef FLD 1819} 1820 NEXT (vpc); 1821 1822 CASE (sem, INSN_ANDOUI) : /* andoui $rt,$rs,$hi16 */ 1823{ 1824 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1825 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1826#define FLD(f) abuf->fields.sfmt_addi.f 1827 int UNUSED written = 0; 1828 IADDR UNUSED pc = abuf->addr; 1829 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 1830 1831 { 1832 SI opval = ANDSI (GET_H_GR (FLD (f_rs)), ORSI (SLLSI (FLD (f_imm), 16), 65535)); 1833 SET_H_GR (FLD (f_rt), opval); 1834 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 1835 } 1836 1837#undef FLD 1838} 1839 NEXT (vpc); 1840 1841 CASE (sem, INSN_ORUI) : /* orui $rt,$rs,$hi16 */ 1842{ 1843 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1844 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1845#define FLD(f) abuf->fields.sfmt_addi.f 1846 int UNUSED written = 0; 1847 IADDR UNUSED pc = abuf->addr; 1848 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 1849 1850 { 1851 SI opval = ORSI (GET_H_GR (FLD (f_rs)), SLLSI (FLD (f_imm), 16)); 1852 SET_H_GR (FLD (f_rt), opval); 1853 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 1854 } 1855 1856#undef FLD 1857} 1858 NEXT (vpc); 1859 1860 CASE (sem, INSN_BGTZ) : /* bgtz $rs,$offset */ 1861{ 1862 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1863 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1864#define FLD(f) abuf->fields.sfmt_bbi.f 1865 int UNUSED written = 0; 1866 IADDR UNUSED pc = abuf->addr; 1867 SEM_BRANCH_INIT 1868 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 1869 1870if (GTSI (GET_H_GR (FLD (f_rs)), 0)) { 1871{ 1872 { 1873 USI opval = FLD (i_offset); 1874 SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc); 1875 written |= (1 << 2); 1876 TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval); 1877 } 1878} 1879} 1880 1881 abuf->written = written; 1882 SEM_BRANCH_FINI (vpc); 1883#undef FLD 1884} 1885 NEXT (vpc); 1886 1887 CASE (sem, INSN_BGTZL) : /* bgtzl $rs,$offset */ 1888{ 1889 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1890 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1891#define FLD(f) abuf->fields.sfmt_bbi.f 1892 int UNUSED written = 0; 1893 IADDR UNUSED pc = abuf->addr; 1894 SEM_BRANCH_INIT 1895 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 1896 1897if (GTSI (GET_H_GR (FLD (f_rs)), 0)) { 1898{ 1899 { 1900 USI opval = FLD (i_offset); 1901 SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc); 1902 written |= (1 << 2); 1903 TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval); 1904 } 1905} 1906} else { 1907if (1) 1908 SEM_SKIP_INSN (current_cpu, sem_arg, vpc); 1909} 1910 1911 abuf->written = written; 1912 SEM_BRANCH_FINI (vpc); 1913#undef FLD 1914} 1915 NEXT (vpc); 1916 1917 CASE (sem, INSN_BLEZ) : /* blez $rs,$offset */ 1918{ 1919 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1920 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1921#define FLD(f) abuf->fields.sfmt_bbi.f 1922 int UNUSED written = 0; 1923 IADDR UNUSED pc = abuf->addr; 1924 SEM_BRANCH_INIT 1925 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 1926 1927if (LESI (GET_H_GR (FLD (f_rs)), 0)) { 1928{ 1929 { 1930 USI opval = FLD (i_offset); 1931 SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc); 1932 written |= (1 << 2); 1933 TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval); 1934 } 1935} 1936} 1937 1938 abuf->written = written; 1939 SEM_BRANCH_FINI (vpc); 1940#undef FLD 1941} 1942 NEXT (vpc); 1943 1944 CASE (sem, INSN_BLEZL) : /* blezl $rs,$offset */ 1945{ 1946 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1947 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1948#define FLD(f) abuf->fields.sfmt_bbi.f 1949 int UNUSED written = 0; 1950 IADDR UNUSED pc = abuf->addr; 1951 SEM_BRANCH_INIT 1952 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 1953 1954if (LESI (GET_H_GR (FLD (f_rs)), 0)) { 1955{ 1956 { 1957 USI opval = FLD (i_offset); 1958 SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc); 1959 written |= (1 << 2); 1960 TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval); 1961 } 1962} 1963} else { 1964if (1) 1965 SEM_SKIP_INSN (current_cpu, sem_arg, vpc); 1966} 1967 1968 abuf->written = written; 1969 SEM_BRANCH_FINI (vpc); 1970#undef FLD 1971} 1972 NEXT (vpc); 1973 1974 CASE (sem, INSN_MRGB) : /* mrgb $rd,$rs,$rt,$mask */ 1975{ 1976 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1977 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1978#define FLD(f) abuf->fields.sfmt_mrgb.f 1979 int UNUSED written = 0; 1980 IADDR UNUSED pc = abuf->addr; 1981 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 1982 1983{ 1984 SI tmp_temp; 1985if (NOTSI (ANDSI (FLD (f_mask), SLLSI (1, 0)))) { 1986 tmp_temp = ANDSI (GET_H_GR (FLD (f_rs)), 255); 1987} else { 1988 tmp_temp = ANDSI (GET_H_GR (FLD (f_rt)), 255); 1989} 1990if (NOTSI (ANDSI (FLD (f_mask), SLLSI (1, 1)))) { 1991 tmp_temp = ORSI (tmp_temp, ANDSI (GET_H_GR (FLD (f_rs)), 65280)); 1992} else { 1993 tmp_temp = ORSI (tmp_temp, ANDSI (GET_H_GR (FLD (f_rt)), 65280)); 1994} 1995if (NOTSI (ANDSI (FLD (f_mask), SLLSI (1, 2)))) { 1996 tmp_temp = ORSI (tmp_temp, ANDSI (GET_H_GR (FLD (f_rs)), 16711680)); 1997} else { 1998 tmp_temp = ORSI (tmp_temp, ANDSI (GET_H_GR (FLD (f_rt)), 16711680)); 1999} 2000if (NOTSI (ANDSI (FLD (f_mask), SLLSI (1, 3)))) { 2001 tmp_temp = ORSI (tmp_temp, ANDSI (GET_H_GR (FLD (f_rs)), 0xff000000)); 2002} else { 2003 tmp_temp = ORSI (tmp_temp, ANDSI (GET_H_GR (FLD (f_rt)), 0xff000000)); 2004} 2005 { 2006 SI opval = tmp_temp; 2007 SET_H_GR (FLD (f_rd), opval); 2008 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 2009 } 2010} 2011 2012#undef FLD 2013} 2014 NEXT (vpc); 2015 2016 CASE (sem, INSN_BCTXT) : /* bctxt $rs,$offset */ 2017{ 2018 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2019 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2020#define FLD(f) abuf->fields.sfmt_empty.f 2021 int UNUSED written = 0; 2022 IADDR UNUSED pc = abuf->addr; 2023 SEM_BRANCH_INIT 2024 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2025 2026((void) 0); /*nop*/ 2027 2028 SEM_BRANCH_FINI (vpc); 2029#undef FLD 2030} 2031 NEXT (vpc); 2032 2033 CASE (sem, INSN_BC0F) : /* bc0f $offset */ 2034{ 2035 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2036 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2037#define FLD(f) abuf->fields.sfmt_empty.f 2038 int UNUSED written = 0; 2039 IADDR UNUSED pc = abuf->addr; 2040 SEM_BRANCH_INIT 2041 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2042 2043((void) 0); /*nop*/ 2044 2045 SEM_BRANCH_FINI (vpc); 2046#undef FLD 2047} 2048 NEXT (vpc); 2049 2050 CASE (sem, INSN_BC0FL) : /* bc0fl $offset */ 2051{ 2052 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2053 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2054#define FLD(f) abuf->fields.sfmt_empty.f 2055 int UNUSED written = 0; 2056 IADDR UNUSED pc = abuf->addr; 2057 SEM_BRANCH_INIT 2058 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2059 2060((void) 0); /*nop*/ 2061 2062 SEM_BRANCH_FINI (vpc); 2063#undef FLD 2064} 2065 NEXT (vpc); 2066 2067 CASE (sem, INSN_BC3F) : /* bc3f $offset */ 2068{ 2069 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2070 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2071#define FLD(f) abuf->fields.sfmt_empty.f 2072 int UNUSED written = 0; 2073 IADDR UNUSED pc = abuf->addr; 2074 SEM_BRANCH_INIT 2075 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2076 2077((void) 0); /*nop*/ 2078 2079 SEM_BRANCH_FINI (vpc); 2080#undef FLD 2081} 2082 NEXT (vpc); 2083 2084 CASE (sem, INSN_BC3FL) : /* bc3fl $offset */ 2085{ 2086 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2087 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2088#define FLD(f) abuf->fields.sfmt_empty.f 2089 int UNUSED written = 0; 2090 IADDR UNUSED pc = abuf->addr; 2091 SEM_BRANCH_INIT 2092 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2093 2094((void) 0); /*nop*/ 2095 2096 SEM_BRANCH_FINI (vpc); 2097#undef FLD 2098} 2099 NEXT (vpc); 2100 2101 CASE (sem, INSN_BC0T) : /* bc0t $offset */ 2102{ 2103 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2104 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2105#define FLD(f) abuf->fields.sfmt_empty.f 2106 int UNUSED written = 0; 2107 IADDR UNUSED pc = abuf->addr; 2108 SEM_BRANCH_INIT 2109 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2110 2111((void) 0); /*nop*/ 2112 2113 SEM_BRANCH_FINI (vpc); 2114#undef FLD 2115} 2116 NEXT (vpc); 2117 2118 CASE (sem, INSN_BC0TL) : /* bc0tl $offset */ 2119{ 2120 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2121 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2122#define FLD(f) abuf->fields.sfmt_empty.f 2123 int UNUSED written = 0; 2124 IADDR UNUSED pc = abuf->addr; 2125 SEM_BRANCH_INIT 2126 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2127 2128((void) 0); /*nop*/ 2129 2130 SEM_BRANCH_FINI (vpc); 2131#undef FLD 2132} 2133 NEXT (vpc); 2134 2135 CASE (sem, INSN_BC3T) : /* bc3t $offset */ 2136{ 2137 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2138 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2139#define FLD(f) abuf->fields.sfmt_empty.f 2140 int UNUSED written = 0; 2141 IADDR UNUSED pc = abuf->addr; 2142 SEM_BRANCH_INIT 2143 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2144 2145((void) 0); /*nop*/ 2146 2147 SEM_BRANCH_FINI (vpc); 2148#undef FLD 2149} 2150 NEXT (vpc); 2151 2152 CASE (sem, INSN_BC3TL) : /* bc3tl $offset */ 2153{ 2154 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2155 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2156#define FLD(f) abuf->fields.sfmt_empty.f 2157 int UNUSED written = 0; 2158 IADDR UNUSED pc = abuf->addr; 2159 SEM_BRANCH_INIT 2160 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2161 2162((void) 0); /*nop*/ 2163 2164 SEM_BRANCH_FINI (vpc); 2165#undef FLD 2166} 2167 NEXT (vpc); 2168 2169 CASE (sem, INSN_CFC0) : /* cfc0 $rt,$rd */ 2170{ 2171 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2172 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2173#define FLD(f) abuf->fields.sfmt_empty.f 2174 int UNUSED written = 0; 2175 IADDR UNUSED pc = abuf->addr; 2176 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2177 2178((void) 0); /*nop*/ 2179 2180#undef FLD 2181} 2182 NEXT (vpc); 2183 2184 CASE (sem, INSN_CFC1) : /* cfc1 $rt,$rd */ 2185{ 2186 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2187 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2188#define FLD(f) abuf->fields.sfmt_empty.f 2189 int UNUSED written = 0; 2190 IADDR UNUSED pc = abuf->addr; 2191 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2192 2193((void) 0); /*nop*/ 2194 2195#undef FLD 2196} 2197 NEXT (vpc); 2198 2199 CASE (sem, INSN_CFC2) : /* cfc2 $rt,$rd */ 2200{ 2201 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2202 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2203#define FLD(f) abuf->fields.sfmt_empty.f 2204 int UNUSED written = 0; 2205 IADDR UNUSED pc = abuf->addr; 2206 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2207 2208((void) 0); /*nop*/ 2209 2210#undef FLD 2211} 2212 NEXT (vpc); 2213 2214 CASE (sem, INSN_CFC3) : /* cfc3 $rt,$rd */ 2215{ 2216 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2217 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2218#define FLD(f) abuf->fields.sfmt_empty.f 2219 int UNUSED written = 0; 2220 IADDR UNUSED pc = abuf->addr; 2221 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2222 2223((void) 0); /*nop*/ 2224 2225#undef FLD 2226} 2227 NEXT (vpc); 2228 2229 CASE (sem, INSN_CHKHDR) : /* chkhdr $rd,$rt */ 2230{ 2231 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2232 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2233#define FLD(f) abuf->fields.sfmt_empty.f 2234 int UNUSED written = 0; 2235 IADDR UNUSED pc = abuf->addr; 2236 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2237 2238((void) 0); /*nop*/ 2239 2240#undef FLD 2241} 2242 NEXT (vpc); 2243 2244 CASE (sem, INSN_CTC0) : /* ctc0 $rt,$rd */ 2245{ 2246 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2247 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2248#define FLD(f) abuf->fields.sfmt_empty.f 2249 int UNUSED written = 0; 2250 IADDR UNUSED pc = abuf->addr; 2251 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2252 2253((void) 0); /*nop*/ 2254 2255#undef FLD 2256} 2257 NEXT (vpc); 2258 2259 CASE (sem, INSN_CTC1) : /* ctc1 $rt,$rd */ 2260{ 2261 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2262 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2263#define FLD(f) abuf->fields.sfmt_empty.f 2264 int UNUSED written = 0; 2265 IADDR UNUSED pc = abuf->addr; 2266 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2267 2268((void) 0); /*nop*/ 2269 2270#undef FLD 2271} 2272 NEXT (vpc); 2273 2274 CASE (sem, INSN_CTC2) : /* ctc2 $rt,$rd */ 2275{ 2276 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2277 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2278#define FLD(f) abuf->fields.sfmt_empty.f 2279 int UNUSED written = 0; 2280 IADDR UNUSED pc = abuf->addr; 2281 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2282 2283((void) 0); /*nop*/ 2284 2285#undef FLD 2286} 2287 NEXT (vpc); 2288 2289 CASE (sem, INSN_CTC3) : /* ctc3 $rt,$rd */ 2290{ 2291 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2292 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2293#define FLD(f) abuf->fields.sfmt_empty.f 2294 int UNUSED written = 0; 2295 IADDR UNUSED pc = abuf->addr; 2296 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2297 2298((void) 0); /*nop*/ 2299 2300#undef FLD 2301} 2302 NEXT (vpc); 2303 2304 CASE (sem, INSN_JCR) : /* jcr $rs */ 2305{ 2306 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2307 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2308#define FLD(f) abuf->fields.sfmt_empty.f 2309 int UNUSED written = 0; 2310 IADDR UNUSED pc = abuf->addr; 2311 SEM_BRANCH_INIT 2312 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2313 2314((void) 0); /*nop*/ 2315 2316 SEM_BRANCH_FINI (vpc); 2317#undef FLD 2318} 2319 NEXT (vpc); 2320 2321 CASE (sem, INSN_LUC32) : /* luc32 $rt,$rd */ 2322{ 2323 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2324 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2325#define FLD(f) abuf->fields.sfmt_empty.f 2326 int UNUSED written = 0; 2327 IADDR UNUSED pc = abuf->addr; 2328 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2329 2330((void) 0); /*nop*/ 2331 2332#undef FLD 2333} 2334 NEXT (vpc); 2335 2336 CASE (sem, INSN_LUC32L) : /* luc32l $rt,$rd */ 2337{ 2338 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2339 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2340#define FLD(f) abuf->fields.sfmt_empty.f 2341 int UNUSED written = 0; 2342 IADDR UNUSED pc = abuf->addr; 2343 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2344 2345((void) 0); /*nop*/ 2346 2347#undef FLD 2348} 2349 NEXT (vpc); 2350 2351 CASE (sem, INSN_LUC64) : /* luc64 $rt,$rd */ 2352{ 2353 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2354 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2355#define FLD(f) abuf->fields.sfmt_empty.f 2356 int UNUSED written = 0; 2357 IADDR UNUSED pc = abuf->addr; 2358 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2359 2360((void) 0); /*nop*/ 2361 2362#undef FLD 2363} 2364 NEXT (vpc); 2365 2366 CASE (sem, INSN_LUC64L) : /* luc64l $rt,$rd */ 2367{ 2368 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2369 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2370#define FLD(f) abuf->fields.sfmt_empty.f 2371 int UNUSED written = 0; 2372 IADDR UNUSED pc = abuf->addr; 2373 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2374 2375((void) 0); /*nop*/ 2376 2377#undef FLD 2378} 2379 NEXT (vpc); 2380 2381 CASE (sem, INSN_LUK) : /* luk $rt,$rd */ 2382{ 2383 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2384 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2385#define FLD(f) abuf->fields.sfmt_empty.f 2386 int UNUSED written = 0; 2387 IADDR UNUSED pc = abuf->addr; 2388 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2389 2390((void) 0); /*nop*/ 2391 2392#undef FLD 2393} 2394 NEXT (vpc); 2395 2396 CASE (sem, INSN_LULCK) : /* lulck $rt */ 2397{ 2398 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2399 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2400#define FLD(f) abuf->fields.sfmt_empty.f 2401 int UNUSED written = 0; 2402 IADDR UNUSED pc = abuf->addr; 2403 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2404 2405((void) 0); /*nop*/ 2406 2407#undef FLD 2408} 2409 NEXT (vpc); 2410 2411 CASE (sem, INSN_LUM32) : /* lum32 $rt,$rd */ 2412{ 2413 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2414 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2415#define FLD(f) abuf->fields.sfmt_empty.f 2416 int UNUSED written = 0; 2417 IADDR UNUSED pc = abuf->addr; 2418 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2419 2420((void) 0); /*nop*/ 2421 2422#undef FLD 2423} 2424 NEXT (vpc); 2425 2426 CASE (sem, INSN_LUM32L) : /* lum32l $rt,$rd */ 2427{ 2428 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2429 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2430#define FLD(f) abuf->fields.sfmt_empty.f 2431 int UNUSED written = 0; 2432 IADDR UNUSED pc = abuf->addr; 2433 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2434 2435((void) 0); /*nop*/ 2436 2437#undef FLD 2438} 2439 NEXT (vpc); 2440 2441 CASE (sem, INSN_LUM64) : /* lum64 $rt,$rd */ 2442{ 2443 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2444 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2445#define FLD(f) abuf->fields.sfmt_empty.f 2446 int UNUSED written = 0; 2447 IADDR UNUSED pc = abuf->addr; 2448 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2449 2450((void) 0); /*nop*/ 2451 2452#undef FLD 2453} 2454 NEXT (vpc); 2455 2456 CASE (sem, INSN_LUM64L) : /* lum64l $rt,$rd */ 2457{ 2458 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2459 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2460#define FLD(f) abuf->fields.sfmt_empty.f 2461 int UNUSED written = 0; 2462 IADDR UNUSED pc = abuf->addr; 2463 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2464 2465((void) 0); /*nop*/ 2466 2467#undef FLD 2468} 2469 NEXT (vpc); 2470 2471 CASE (sem, INSN_LUR) : /* lur $rt,$rd */ 2472{ 2473 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2474 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2475#define FLD(f) abuf->fields.sfmt_empty.f 2476 int UNUSED written = 0; 2477 IADDR UNUSED pc = abuf->addr; 2478 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2479 2480((void) 0); /*nop*/ 2481 2482#undef FLD 2483} 2484 NEXT (vpc); 2485 2486 CASE (sem, INSN_LURL) : /* lurl $rt,$rd */ 2487{ 2488 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2489 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2490#define FLD(f) abuf->fields.sfmt_empty.f 2491 int UNUSED written = 0; 2492 IADDR UNUSED pc = abuf->addr; 2493 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2494 2495((void) 0); /*nop*/ 2496 2497#undef FLD 2498} 2499 NEXT (vpc); 2500 2501 CASE (sem, INSN_LUULCK) : /* luulck $rt */ 2502{ 2503 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2504 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2505#define FLD(f) abuf->fields.sfmt_empty.f 2506 int UNUSED written = 0; 2507 IADDR UNUSED pc = abuf->addr; 2508 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2509 2510((void) 0); /*nop*/ 2511 2512#undef FLD 2513} 2514 NEXT (vpc); 2515 2516 CASE (sem, INSN_MFC0) : /* mfc0 $rt,$rd */ 2517{ 2518 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2519 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2520#define FLD(f) abuf->fields.sfmt_empty.f 2521 int UNUSED written = 0; 2522 IADDR UNUSED pc = abuf->addr; 2523 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2524 2525((void) 0); /*nop*/ 2526 2527#undef FLD 2528} 2529 NEXT (vpc); 2530 2531 CASE (sem, INSN_MFC1) : /* mfc1 $rt,$rd */ 2532{ 2533 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2534 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2535#define FLD(f) abuf->fields.sfmt_empty.f 2536 int UNUSED written = 0; 2537 IADDR UNUSED pc = abuf->addr; 2538 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2539 2540((void) 0); /*nop*/ 2541 2542#undef FLD 2543} 2544 NEXT (vpc); 2545 2546 CASE (sem, INSN_MFC2) : /* mfc2 $rt,$rd */ 2547{ 2548 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2549 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2550#define FLD(f) abuf->fields.sfmt_empty.f 2551 int UNUSED written = 0; 2552 IADDR UNUSED pc = abuf->addr; 2553 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2554 2555((void) 0); /*nop*/ 2556 2557#undef FLD 2558} 2559 NEXT (vpc); 2560 2561 CASE (sem, INSN_MFC3) : /* mfc3 $rt,$rd */ 2562{ 2563 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2564 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2565#define FLD(f) abuf->fields.sfmt_empty.f 2566 int UNUSED written = 0; 2567 IADDR UNUSED pc = abuf->addr; 2568 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2569 2570((void) 0); /*nop*/ 2571 2572#undef FLD 2573} 2574 NEXT (vpc); 2575 2576 CASE (sem, INSN_MTC0) : /* mtc0 $rt,$rd */ 2577{ 2578 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2579 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2580#define FLD(f) abuf->fields.sfmt_empty.f 2581 int UNUSED written = 0; 2582 IADDR UNUSED pc = abuf->addr; 2583 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2584 2585((void) 0); /*nop*/ 2586 2587#undef FLD 2588} 2589 NEXT (vpc); 2590 2591 CASE (sem, INSN_MTC1) : /* mtc1 $rt,$rd */ 2592{ 2593 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2594 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2595#define FLD(f) abuf->fields.sfmt_empty.f 2596 int UNUSED written = 0; 2597 IADDR UNUSED pc = abuf->addr; 2598 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2599 2600((void) 0); /*nop*/ 2601 2602#undef FLD 2603} 2604 NEXT (vpc); 2605 2606 CASE (sem, INSN_MTC2) : /* mtc2 $rt,$rd */ 2607{ 2608 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2609 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2610#define FLD(f) abuf->fields.sfmt_empty.f 2611 int UNUSED written = 0; 2612 IADDR UNUSED pc = abuf->addr; 2613 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2614 2615((void) 0); /*nop*/ 2616 2617#undef FLD 2618} 2619 NEXT (vpc); 2620 2621 CASE (sem, INSN_MTC3) : /* mtc3 $rt,$rd */ 2622{ 2623 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2624 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2625#define FLD(f) abuf->fields.sfmt_empty.f 2626 int UNUSED written = 0; 2627 IADDR UNUSED pc = abuf->addr; 2628 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2629 2630((void) 0); /*nop*/ 2631 2632#undef FLD 2633} 2634 NEXT (vpc); 2635 2636 CASE (sem, INSN_PKRL) : /* pkrl $rd,$rt */ 2637{ 2638 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2639 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2640#define FLD(f) abuf->fields.sfmt_empty.f 2641 int UNUSED written = 0; 2642 IADDR UNUSED pc = abuf->addr; 2643 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2644 2645((void) 0); /*nop*/ 2646 2647#undef FLD 2648} 2649 NEXT (vpc); 2650 2651 CASE (sem, INSN_PKRLR1) : /* pkrlr1 $rt,$_index,$count */ 2652{ 2653 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2654 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2655#define FLD(f) abuf->fields.sfmt_empty.f 2656 int UNUSED written = 0; 2657 IADDR UNUSED pc = abuf->addr; 2658 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2659 2660((void) 0); /*nop*/ 2661 2662#undef FLD 2663} 2664 NEXT (vpc); 2665 2666 CASE (sem, INSN_PKRLR30) : /* pkrlr30 $rt,$_index,$count */ 2667{ 2668 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2669 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2670#define FLD(f) abuf->fields.sfmt_empty.f 2671 int UNUSED written = 0; 2672 IADDR UNUSED pc = abuf->addr; 2673 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2674 2675((void) 0); /*nop*/ 2676 2677#undef FLD 2678} 2679 NEXT (vpc); 2680 2681 CASE (sem, INSN_RB) : /* rb $rd,$rt */ 2682{ 2683 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2684 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2685#define FLD(f) abuf->fields.sfmt_empty.f 2686 int UNUSED written = 0; 2687 IADDR UNUSED pc = abuf->addr; 2688 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2689 2690((void) 0); /*nop*/ 2691 2692#undef FLD 2693} 2694 NEXT (vpc); 2695 2696 CASE (sem, INSN_RBR1) : /* rbr1 $rt,$_index,$count */ 2697{ 2698 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2699 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2700#define FLD(f) abuf->fields.sfmt_empty.f 2701 int UNUSED written = 0; 2702 IADDR UNUSED pc = abuf->addr; 2703 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2704 2705((void) 0); /*nop*/ 2706 2707#undef FLD 2708} 2709 NEXT (vpc); 2710 2711 CASE (sem, INSN_RBR30) : /* rbr30 $rt,$_index,$count */ 2712{ 2713 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2714 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2715#define FLD(f) abuf->fields.sfmt_empty.f 2716 int UNUSED written = 0; 2717 IADDR UNUSED pc = abuf->addr; 2718 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2719 2720((void) 0); /*nop*/ 2721 2722#undef FLD 2723} 2724 NEXT (vpc); 2725 2726 CASE (sem, INSN_RFE) : /* rfe */ 2727{ 2728 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2729 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2730#define FLD(f) abuf->fields.sfmt_empty.f 2731 int UNUSED written = 0; 2732 IADDR UNUSED pc = abuf->addr; 2733 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2734 2735((void) 0); /*nop*/ 2736 2737#undef FLD 2738} 2739 NEXT (vpc); 2740 2741 CASE (sem, INSN_RX) : /* rx $rd,$rt */ 2742{ 2743 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2744 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2745#define FLD(f) abuf->fields.sfmt_empty.f 2746 int UNUSED written = 0; 2747 IADDR UNUSED pc = abuf->addr; 2748 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2749 2750((void) 0); /*nop*/ 2751 2752#undef FLD 2753} 2754 NEXT (vpc); 2755 2756 CASE (sem, INSN_RXR1) : /* rxr1 $rt,$_index,$count */ 2757{ 2758 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2759 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2760#define FLD(f) abuf->fields.sfmt_empty.f 2761 int UNUSED written = 0; 2762 IADDR UNUSED pc = abuf->addr; 2763 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2764 2765((void) 0); /*nop*/ 2766 2767#undef FLD 2768} 2769 NEXT (vpc); 2770 2771 CASE (sem, INSN_RXR30) : /* rxr30 $rt,$_index,$count */ 2772{ 2773 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2774 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2775#define FLD(f) abuf->fields.sfmt_empty.f 2776 int UNUSED written = 0; 2777 IADDR UNUSED pc = abuf->addr; 2778 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2779 2780((void) 0); /*nop*/ 2781 2782#undef FLD 2783} 2784 NEXT (vpc); 2785 2786 CASE (sem, INSN_SLEEP) : /* sleep */ 2787{ 2788 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2789 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2790#define FLD(f) abuf->fields.sfmt_empty.f 2791 int UNUSED written = 0; 2792 IADDR UNUSED pc = abuf->addr; 2793 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2794 2795((void) 0); /*nop*/ 2796 2797#undef FLD 2798} 2799 NEXT (vpc); 2800 2801 CASE (sem, INSN_SRRD) : /* srrd $rt */ 2802{ 2803 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2804 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2805#define FLD(f) abuf->fields.sfmt_empty.f 2806 int UNUSED written = 0; 2807 IADDR UNUSED pc = abuf->addr; 2808 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2809 2810((void) 0); /*nop*/ 2811 2812#undef FLD 2813} 2814 NEXT (vpc); 2815 2816 CASE (sem, INSN_SRRDL) : /* srrdl $rt */ 2817{ 2818 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2819 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2820#define FLD(f) abuf->fields.sfmt_empty.f 2821 int UNUSED written = 0; 2822 IADDR UNUSED pc = abuf->addr; 2823 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2824 2825((void) 0); /*nop*/ 2826 2827#undef FLD 2828} 2829 NEXT (vpc); 2830 2831 CASE (sem, INSN_SRULCK) : /* srulck $rt */ 2832{ 2833 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2834 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2835#define FLD(f) abuf->fields.sfmt_empty.f 2836 int UNUSED written = 0; 2837 IADDR UNUSED pc = abuf->addr; 2838 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2839 2840((void) 0); /*nop*/ 2841 2842#undef FLD 2843} 2844 NEXT (vpc); 2845 2846 CASE (sem, INSN_SRWR) : /* srwr $rt,$rd */ 2847{ 2848 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2849 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2850#define FLD(f) abuf->fields.sfmt_empty.f 2851 int UNUSED written = 0; 2852 IADDR UNUSED pc = abuf->addr; 2853 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2854 2855((void) 0); /*nop*/ 2856 2857#undef FLD 2858} 2859 NEXT (vpc); 2860 2861 CASE (sem, INSN_SRWRU) : /* srwru $rt,$rd */ 2862{ 2863 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2864 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2865#define FLD(f) abuf->fields.sfmt_empty.f 2866 int UNUSED written = 0; 2867 IADDR UNUSED pc = abuf->addr; 2868 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2869 2870((void) 0); /*nop*/ 2871 2872#undef FLD 2873} 2874 NEXT (vpc); 2875 2876 CASE (sem, INSN_TRAPQFL) : /* trapqfl */ 2877{ 2878 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2879 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2880#define FLD(f) abuf->fields.sfmt_empty.f 2881 int UNUSED written = 0; 2882 IADDR UNUSED pc = abuf->addr; 2883 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2884 2885((void) 0); /*nop*/ 2886 2887#undef FLD 2888} 2889 NEXT (vpc); 2890 2891 CASE (sem, INSN_TRAPQNE) : /* trapqne */ 2892{ 2893 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2894 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2895#define FLD(f) abuf->fields.sfmt_empty.f 2896 int UNUSED written = 0; 2897 IADDR UNUSED pc = abuf->addr; 2898 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2899 2900((void) 0); /*nop*/ 2901 2902#undef FLD 2903} 2904 NEXT (vpc); 2905 2906 CASE (sem, INSN_TRAPREL) : /* traprel $rt */ 2907{ 2908 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2909 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2910#define FLD(f) abuf->fields.sfmt_empty.f 2911 int UNUSED written = 0; 2912 IADDR UNUSED pc = abuf->addr; 2913 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2914 2915((void) 0); /*nop*/ 2916 2917#undef FLD 2918} 2919 NEXT (vpc); 2920 2921 CASE (sem, INSN_WB) : /* wb $rd,$rt */ 2922{ 2923 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2924 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2925#define FLD(f) abuf->fields.sfmt_empty.f 2926 int UNUSED written = 0; 2927 IADDR UNUSED pc = abuf->addr; 2928 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2929 2930((void) 0); /*nop*/ 2931 2932#undef FLD 2933} 2934 NEXT (vpc); 2935 2936 CASE (sem, INSN_WBU) : /* wbu $rd,$rt */ 2937{ 2938 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2939 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2940#define FLD(f) abuf->fields.sfmt_empty.f 2941 int UNUSED written = 0; 2942 IADDR UNUSED pc = abuf->addr; 2943 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2944 2945((void) 0); /*nop*/ 2946 2947#undef FLD 2948} 2949 NEXT (vpc); 2950 2951 CASE (sem, INSN_WBR1) : /* wbr1 $rt,$_index,$count */ 2952{ 2953 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2954 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2955#define FLD(f) abuf->fields.sfmt_empty.f 2956 int UNUSED written = 0; 2957 IADDR UNUSED pc = abuf->addr; 2958 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2959 2960((void) 0); /*nop*/ 2961 2962#undef FLD 2963} 2964 NEXT (vpc); 2965 2966 CASE (sem, INSN_WBR1U) : /* wbr1u $rt,$_index,$count */ 2967{ 2968 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2969 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2970#define FLD(f) abuf->fields.sfmt_empty.f 2971 int UNUSED written = 0; 2972 IADDR UNUSED pc = abuf->addr; 2973 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2974 2975((void) 0); /*nop*/ 2976 2977#undef FLD 2978} 2979 NEXT (vpc); 2980 2981 CASE (sem, INSN_WBR30) : /* wbr30 $rt,$_index,$count */ 2982{ 2983 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2984 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2985#define FLD(f) abuf->fields.sfmt_empty.f 2986 int UNUSED written = 0; 2987 IADDR UNUSED pc = abuf->addr; 2988 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2989 2990((void) 0); /*nop*/ 2991 2992#undef FLD 2993} 2994 NEXT (vpc); 2995 2996 CASE (sem, INSN_WBR30U) : /* wbr30u $rt,$_index,$count */ 2997{ 2998 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2999 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 3000#define FLD(f) abuf->fields.sfmt_empty.f 3001 int UNUSED written = 0; 3002 IADDR UNUSED pc = abuf->addr; 3003 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 3004 3005((void) 0); /*nop*/ 3006 3007#undef FLD 3008} 3009 NEXT (vpc); 3010 3011 CASE (sem, INSN_WX) : /* wx $rd,$rt */ 3012{ 3013 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 3014 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 3015#define FLD(f) abuf->fields.sfmt_empty.f 3016 int UNUSED written = 0; 3017 IADDR UNUSED pc = abuf->addr; 3018 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 3019 3020((void) 0); /*nop*/ 3021 3022#undef FLD 3023} 3024 NEXT (vpc); 3025 3026 CASE (sem, INSN_WXU) : /* wxu $rd,$rt */ 3027{ 3028 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 3029 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 3030#define FLD(f) abuf->fields.sfmt_empty.f 3031 int UNUSED written = 0; 3032 IADDR UNUSED pc = abuf->addr; 3033 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 3034 3035((void) 0); /*nop*/ 3036 3037#undef FLD 3038} 3039 NEXT (vpc); 3040 3041 CASE (sem, INSN_WXR1) : /* wxr1 $rt,$_index,$count */ 3042{ 3043 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 3044 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 3045#define FLD(f) abuf->fields.sfmt_empty.f 3046 int UNUSED written = 0; 3047 IADDR UNUSED pc = abuf->addr; 3048 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 3049 3050((void) 0); /*nop*/ 3051 3052#undef FLD 3053} 3054 NEXT (vpc); 3055 3056 CASE (sem, INSN_WXR1U) : /* wxr1u $rt,$_index,$count */ 3057{ 3058 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 3059 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 3060#define FLD(f) abuf->fields.sfmt_empty.f 3061 int UNUSED written = 0; 3062 IADDR UNUSED pc = abuf->addr; 3063 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 3064 3065((void) 0); /*nop*/ 3066 3067#undef FLD 3068} 3069 NEXT (vpc); 3070 3071 CASE (sem, INSN_WXR30) : /* wxr30 $rt,$_index,$count */ 3072{ 3073 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 3074 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 3075#define FLD(f) abuf->fields.sfmt_empty.f 3076 int UNUSED written = 0; 3077 IADDR UNUSED pc = abuf->addr; 3078 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 3079 3080((void) 0); /*nop*/ 3081 3082#undef FLD 3083} 3084 NEXT (vpc); 3085 3086 CASE (sem, INSN_WXR30U) : /* wxr30u $rt,$_index,$count */ 3087{ 3088 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 3089 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 3090#define FLD(f) abuf->fields.sfmt_empty.f 3091 int UNUSED written = 0; 3092 IADDR UNUSED pc = abuf->addr; 3093 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 3094 3095((void) 0); /*nop*/ 3096 3097#undef FLD 3098} 3099 NEXT (vpc); 3100 3101 CASE (sem, INSN_LDW) : /* ldw $rt,$lo16($base) */ 3102{ 3103 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 3104 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 3105#define FLD(f) abuf->fields.sfmt_addi.f 3106 int UNUSED written = 0; 3107 IADDR UNUSED pc = abuf->addr; 3108 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 3109 3110{ 3111 SI tmp_addr; 3112 tmp_addr = ANDSI (ADDSI (GET_H_GR (FLD (f_rs)), FLD (f_imm)), INVSI (3)); 3113 { 3114 SI opval = GETMEMSI (current_cpu, pc, tmp_addr); 3115 SET_H_GR (ADDSI (FLD (f_rt), 1), opval); 3116 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 3117 } 3118 { 3119 SI opval = GETMEMSI (current_cpu, pc, ADDSI (tmp_addr, 4)); 3120 SET_H_GR (FLD (f_rt), opval); 3121 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 3122 } 3123} 3124 3125#undef FLD 3126} 3127 NEXT (vpc); 3128 3129 CASE (sem, INSN_SDW) : /* sdw $rt,$lo16($base) */ 3130{ 3131 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 3132 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 3133#define FLD(f) abuf->fields.sfmt_addi.f 3134 int UNUSED written = 0; 3135 IADDR UNUSED pc = abuf->addr; 3136 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 3137 3138{ 3139 SI tmp_addr; 3140 tmp_addr = ANDSI (ADDSI (GET_H_GR (FLD (f_rs)), FLD (f_imm)), INVSI (3)); 3141 { 3142 SI opval = GET_H_GR (FLD (f_rt)); 3143 SETMEMSI (current_cpu, pc, ADDSI (tmp_addr, 4), opval); 3144 TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval); 3145 } 3146 { 3147 SI opval = GET_H_GR (ADDSI (FLD (f_rt), 1)); 3148 SETMEMSI (current_cpu, pc, tmp_addr, opval); 3149 TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval); 3150 } 3151} 3152 3153#undef FLD 3154} 3155 NEXT (vpc); 3156 3157 CASE (sem, INSN_J) : /* j $jmptarg */ 3158{ 3159 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 3160 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 3161#define FLD(f) abuf->fields.sfmt_j.f 3162 int UNUSED written = 0; 3163 IADDR UNUSED pc = abuf->addr; 3164 SEM_BRANCH_INIT 3165 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 3166 3167{ 3168 { 3169 USI opval = FLD (i_jmptarg); 3170 SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc); 3171 TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval); 3172 } 3173} 3174 3175 SEM_BRANCH_FINI (vpc); 3176#undef FLD 3177} 3178 NEXT (vpc); 3179 3180 CASE (sem, INSN_JAL) : /* jal $jmptarg */ 3181{ 3182 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 3183 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 3184#define FLD(f) abuf->fields.sfmt_j.f 3185 int UNUSED written = 0; 3186 IADDR UNUSED pc = abuf->addr; 3187 SEM_BRANCH_INIT 3188 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 3189 3190{ 3191{ 3192 { 3193 SI opval = ADDSI (pc, 8); 3194 SET_H_GR (((UINT) 31), opval); 3195 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 3196 } 3197 { 3198 USI opval = FLD (i_jmptarg); 3199 SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc); 3200 TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval); 3201 } 3202} 3203} 3204 3205 SEM_BRANCH_FINI (vpc); 3206#undef FLD 3207} 3208 NEXT (vpc); 3209 3210 CASE (sem, INSN_BMB) : /* bmb $rs,$rt,$offset */ 3211{ 3212 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 3213 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 3214#define FLD(f) abuf->fields.sfmt_bbi.f 3215 int UNUSED written = 0; 3216 IADDR UNUSED pc = abuf->addr; 3217 SEM_BRANCH_INIT 3218 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 3219 3220{ 3221 BI tmp_branch_; 3222 tmp_branch_ = 0; 3223if (EQSI (ANDSI (GET_H_GR (FLD (f_rs)), 255), ANDSI (GET_H_GR (FLD (f_rt)), 255))) { 3224 tmp_branch_ = 1; 3225} 3226if (EQSI (ANDSI (GET_H_GR (FLD (f_rs)), 65280), ANDSI (GET_H_GR (FLD (f_rt)), 65280))) { 3227 tmp_branch_ = 1; 3228} 3229if (EQSI (ANDSI (GET_H_GR (FLD (f_rs)), 16711680), ANDSI (GET_H_GR (FLD (f_rt)), 16711680))) { 3230 tmp_branch_ = 1; 3231} 3232if (EQSI (ANDSI (GET_H_GR (FLD (f_rs)), 0xff000000), ANDSI (GET_H_GR (FLD (f_rt)), 0xff000000))) { 3233 tmp_branch_ = 1; 3234} 3235if (tmp_branch_) { 3236{ 3237 { 3238 USI opval = FLD (i_offset); 3239 SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc); 3240 written |= (1 << 3); 3241 TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval); 3242 } 3243} 3244} 3245} 3246 3247 abuf->written = written; 3248 SEM_BRANCH_FINI (vpc); 3249#undef FLD 3250} 3251 NEXT (vpc); 3252 3253 3254 } 3255 ENDSWITCH (sem) /* End of semantic switch. */ 3256 3257 /* At this point `vpc' contains the next insn to execute. */ 3258} 3259 3260#undef DEFINE_SWITCH 3261#endif /* DEFINE_SWITCH */ 3262