1 1.1 christos /* Simulator instruction semantics for m32rbf. 2 1.1 christos 3 1.1 christos THIS FILE IS MACHINE GENERATED WITH CGEN. 4 1.1 christos 5 1.1.1.11 christos Copyright (C) 1996-2024 Free Software Foundation, Inc. 6 1.1 christos 7 1.1 christos This file is part of the GNU simulators. 8 1.1 christos 9 1.1 christos This file is free software; you can redistribute it and/or modify 10 1.1 christos it under the terms of the GNU General Public License as published by 11 1.1 christos the Free Software Foundation; either version 3, or (at your option) 12 1.1 christos any later version. 13 1.1 christos 14 1.1 christos It is distributed in the hope that it will be useful, but WITHOUT 15 1.1 christos ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 16 1.1 christos or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public 17 1.1 christos License for more details. 18 1.1 christos 19 1.1 christos You should have received a copy of the GNU General Public License along 20 1.1.1.11 christos with this program; if not, write to the Free Software Foundation, Inc., 21 1.1.1.11 christos 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. 22 1.1 christos 23 1.1 christos */ 24 1.1 christos 25 1.1 christos #ifdef DEFINE_LABELS 26 1.1 christos 27 1.1 christos /* The labels have the case they have because the enum of insn types 28 1.1 christos is all uppercase and in the non-stdc case the insn symbol is built 29 1.1 christos into the enum name. */ 30 1.1 christos 31 1.1 christos static struct { 32 1.1 christos int index; 33 1.1 christos void *label; 34 1.1 christos } labels[] = { 35 1.1 christos { M32RBF_INSN_X_INVALID, && case_sem_INSN_X_INVALID }, 36 1.1 christos { M32RBF_INSN_X_AFTER, && case_sem_INSN_X_AFTER }, 37 1.1 christos { M32RBF_INSN_X_BEFORE, && case_sem_INSN_X_BEFORE }, 38 1.1 christos { M32RBF_INSN_X_CTI_CHAIN, && case_sem_INSN_X_CTI_CHAIN }, 39 1.1 christos { M32RBF_INSN_X_CHAIN, && case_sem_INSN_X_CHAIN }, 40 1.1 christos { M32RBF_INSN_X_BEGIN, && case_sem_INSN_X_BEGIN }, 41 1.1 christos { M32RBF_INSN_ADD, && case_sem_INSN_ADD }, 42 1.1 christos { M32RBF_INSN_ADD3, && case_sem_INSN_ADD3 }, 43 1.1 christos { M32RBF_INSN_AND, && case_sem_INSN_AND }, 44 1.1 christos { M32RBF_INSN_AND3, && case_sem_INSN_AND3 }, 45 1.1 christos { M32RBF_INSN_OR, && case_sem_INSN_OR }, 46 1.1 christos { M32RBF_INSN_OR3, && case_sem_INSN_OR3 }, 47 1.1 christos { M32RBF_INSN_XOR, && case_sem_INSN_XOR }, 48 1.1 christos { M32RBF_INSN_XOR3, && case_sem_INSN_XOR3 }, 49 1.1 christos { M32RBF_INSN_ADDI, && case_sem_INSN_ADDI }, 50 1.1 christos { M32RBF_INSN_ADDV, && case_sem_INSN_ADDV }, 51 1.1 christos { M32RBF_INSN_ADDV3, && case_sem_INSN_ADDV3 }, 52 1.1 christos { M32RBF_INSN_ADDX, && case_sem_INSN_ADDX }, 53 1.1 christos { M32RBF_INSN_BC8, && case_sem_INSN_BC8 }, 54 1.1 christos { M32RBF_INSN_BC24, && case_sem_INSN_BC24 }, 55 1.1 christos { M32RBF_INSN_BEQ, && case_sem_INSN_BEQ }, 56 1.1 christos { M32RBF_INSN_BEQZ, && case_sem_INSN_BEQZ }, 57 1.1 christos { M32RBF_INSN_BGEZ, && case_sem_INSN_BGEZ }, 58 1.1 christos { M32RBF_INSN_BGTZ, && case_sem_INSN_BGTZ }, 59 1.1 christos { M32RBF_INSN_BLEZ, && case_sem_INSN_BLEZ }, 60 1.1 christos { M32RBF_INSN_BLTZ, && case_sem_INSN_BLTZ }, 61 1.1 christos { M32RBF_INSN_BNEZ, && case_sem_INSN_BNEZ }, 62 1.1 christos { M32RBF_INSN_BL8, && case_sem_INSN_BL8 }, 63 1.1 christos { M32RBF_INSN_BL24, && case_sem_INSN_BL24 }, 64 1.1 christos { M32RBF_INSN_BNC8, && case_sem_INSN_BNC8 }, 65 1.1 christos { M32RBF_INSN_BNC24, && case_sem_INSN_BNC24 }, 66 1.1 christos { M32RBF_INSN_BNE, && case_sem_INSN_BNE }, 67 1.1 christos { M32RBF_INSN_BRA8, && case_sem_INSN_BRA8 }, 68 1.1 christos { M32RBF_INSN_BRA24, && case_sem_INSN_BRA24 }, 69 1.1 christos { M32RBF_INSN_CMP, && case_sem_INSN_CMP }, 70 1.1 christos { M32RBF_INSN_CMPI, && case_sem_INSN_CMPI }, 71 1.1 christos { M32RBF_INSN_CMPU, && case_sem_INSN_CMPU }, 72 1.1 christos { M32RBF_INSN_CMPUI, && case_sem_INSN_CMPUI }, 73 1.1 christos { M32RBF_INSN_DIV, && case_sem_INSN_DIV }, 74 1.1 christos { M32RBF_INSN_DIVU, && case_sem_INSN_DIVU }, 75 1.1 christos { M32RBF_INSN_REM, && case_sem_INSN_REM }, 76 1.1 christos { M32RBF_INSN_REMU, && case_sem_INSN_REMU }, 77 1.1 christos { M32RBF_INSN_JL, && case_sem_INSN_JL }, 78 1.1 christos { M32RBF_INSN_JMP, && case_sem_INSN_JMP }, 79 1.1 christos { M32RBF_INSN_LD, && case_sem_INSN_LD }, 80 1.1 christos { M32RBF_INSN_LD_D, && case_sem_INSN_LD_D }, 81 1.1 christos { M32RBF_INSN_LDB, && case_sem_INSN_LDB }, 82 1.1 christos { M32RBF_INSN_LDB_D, && case_sem_INSN_LDB_D }, 83 1.1 christos { M32RBF_INSN_LDH, && case_sem_INSN_LDH }, 84 1.1 christos { M32RBF_INSN_LDH_D, && case_sem_INSN_LDH_D }, 85 1.1 christos { M32RBF_INSN_LDUB, && case_sem_INSN_LDUB }, 86 1.1 christos { M32RBF_INSN_LDUB_D, && case_sem_INSN_LDUB_D }, 87 1.1 christos { M32RBF_INSN_LDUH, && case_sem_INSN_LDUH }, 88 1.1 christos { M32RBF_INSN_LDUH_D, && case_sem_INSN_LDUH_D }, 89 1.1 christos { M32RBF_INSN_LD_PLUS, && case_sem_INSN_LD_PLUS }, 90 1.1 christos { M32RBF_INSN_LD24, && case_sem_INSN_LD24 }, 91 1.1 christos { M32RBF_INSN_LDI8, && case_sem_INSN_LDI8 }, 92 1.1 christos { M32RBF_INSN_LDI16, && case_sem_INSN_LDI16 }, 93 1.1 christos { M32RBF_INSN_LOCK, && case_sem_INSN_LOCK }, 94 1.1 christos { M32RBF_INSN_MACHI, && case_sem_INSN_MACHI }, 95 1.1 christos { M32RBF_INSN_MACLO, && case_sem_INSN_MACLO }, 96 1.1 christos { M32RBF_INSN_MACWHI, && case_sem_INSN_MACWHI }, 97 1.1 christos { M32RBF_INSN_MACWLO, && case_sem_INSN_MACWLO }, 98 1.1 christos { M32RBF_INSN_MUL, && case_sem_INSN_MUL }, 99 1.1 christos { M32RBF_INSN_MULHI, && case_sem_INSN_MULHI }, 100 1.1 christos { M32RBF_INSN_MULLO, && case_sem_INSN_MULLO }, 101 1.1 christos { M32RBF_INSN_MULWHI, && case_sem_INSN_MULWHI }, 102 1.1 christos { M32RBF_INSN_MULWLO, && case_sem_INSN_MULWLO }, 103 1.1 christos { M32RBF_INSN_MV, && case_sem_INSN_MV }, 104 1.1 christos { M32RBF_INSN_MVFACHI, && case_sem_INSN_MVFACHI }, 105 1.1 christos { M32RBF_INSN_MVFACLO, && case_sem_INSN_MVFACLO }, 106 1.1 christos { M32RBF_INSN_MVFACMI, && case_sem_INSN_MVFACMI }, 107 1.1 christos { M32RBF_INSN_MVFC, && case_sem_INSN_MVFC }, 108 1.1 christos { M32RBF_INSN_MVTACHI, && case_sem_INSN_MVTACHI }, 109 1.1 christos { M32RBF_INSN_MVTACLO, && case_sem_INSN_MVTACLO }, 110 1.1 christos { M32RBF_INSN_MVTC, && case_sem_INSN_MVTC }, 111 1.1 christos { M32RBF_INSN_NEG, && case_sem_INSN_NEG }, 112 1.1 christos { M32RBF_INSN_NOP, && case_sem_INSN_NOP }, 113 1.1 christos { M32RBF_INSN_NOT, && case_sem_INSN_NOT }, 114 1.1 christos { M32RBF_INSN_RAC, && case_sem_INSN_RAC }, 115 1.1 christos { M32RBF_INSN_RACH, && case_sem_INSN_RACH }, 116 1.1 christos { M32RBF_INSN_RTE, && case_sem_INSN_RTE }, 117 1.1 christos { M32RBF_INSN_SETH, && case_sem_INSN_SETH }, 118 1.1 christos { M32RBF_INSN_SLL, && case_sem_INSN_SLL }, 119 1.1 christos { M32RBF_INSN_SLL3, && case_sem_INSN_SLL3 }, 120 1.1 christos { M32RBF_INSN_SLLI, && case_sem_INSN_SLLI }, 121 1.1 christos { M32RBF_INSN_SRA, && case_sem_INSN_SRA }, 122 1.1 christos { M32RBF_INSN_SRA3, && case_sem_INSN_SRA3 }, 123 1.1 christos { M32RBF_INSN_SRAI, && case_sem_INSN_SRAI }, 124 1.1 christos { M32RBF_INSN_SRL, && case_sem_INSN_SRL }, 125 1.1 christos { M32RBF_INSN_SRL3, && case_sem_INSN_SRL3 }, 126 1.1 christos { M32RBF_INSN_SRLI, && case_sem_INSN_SRLI }, 127 1.1 christos { M32RBF_INSN_ST, && case_sem_INSN_ST }, 128 1.1 christos { M32RBF_INSN_ST_D, && case_sem_INSN_ST_D }, 129 1.1 christos { M32RBF_INSN_STB, && case_sem_INSN_STB }, 130 1.1 christos { M32RBF_INSN_STB_D, && case_sem_INSN_STB_D }, 131 1.1 christos { M32RBF_INSN_STH, && case_sem_INSN_STH }, 132 1.1 christos { M32RBF_INSN_STH_D, && case_sem_INSN_STH_D }, 133 1.1 christos { M32RBF_INSN_ST_PLUS, && case_sem_INSN_ST_PLUS }, 134 1.1 christos { M32RBF_INSN_ST_MINUS, && case_sem_INSN_ST_MINUS }, 135 1.1 christos { M32RBF_INSN_SUB, && case_sem_INSN_SUB }, 136 1.1 christos { M32RBF_INSN_SUBV, && case_sem_INSN_SUBV }, 137 1.1 christos { M32RBF_INSN_SUBX, && case_sem_INSN_SUBX }, 138 1.1 christos { M32RBF_INSN_TRAP, && case_sem_INSN_TRAP }, 139 1.1 christos { M32RBF_INSN_UNLOCK, && case_sem_INSN_UNLOCK }, 140 1.1 christos { M32RBF_INSN_CLRPSW, && case_sem_INSN_CLRPSW }, 141 1.1 christos { M32RBF_INSN_SETPSW, && case_sem_INSN_SETPSW }, 142 1.1 christos { M32RBF_INSN_BSET, && case_sem_INSN_BSET }, 143 1.1 christos { M32RBF_INSN_BCLR, && case_sem_INSN_BCLR }, 144 1.1 christos { M32RBF_INSN_BTST, && case_sem_INSN_BTST }, 145 1.1 christos { 0, 0 } 146 1.1 christos }; 147 1.1 christos int i; 148 1.1 christos 149 1.1 christos for (i = 0; labels[i].label != 0; ++i) 150 1.1 christos { 151 1.1 christos #if FAST_P 152 1.1 christos CPU_IDESC (current_cpu) [labels[i].index].sem_fast_lab = labels[i].label; 153 1.1 christos #else 154 1.1 christos CPU_IDESC (current_cpu) [labels[i].index].sem_full_lab = labels[i].label; 155 1.1 christos #endif 156 1.1 christos } 157 1.1 christos 158 1.1 christos #undef DEFINE_LABELS 159 1.1 christos #endif /* DEFINE_LABELS */ 160 1.1 christos 161 1.1 christos #ifdef DEFINE_SWITCH 162 1.1 christos 163 1.1 christos /* If hyper-fast [well not unnecessarily slow] execution is selected, turn 164 1.1 christos off frills like tracing and profiling. */ 165 1.1.1.5 christos /* FIXME: A better way would be to have CGEN_TRACE_RESULT check for something 166 1.1 christos that can cause it to be optimized out. Another way would be to emit 167 1.1 christos special handlers into the instruction "stream". */ 168 1.1 christos 169 1.1 christos #if FAST_P 170 1.1.1.5 christos #undef CGEN_TRACE_RESULT 171 1.1.1.5 christos #define CGEN_TRACE_RESULT(cpu, abuf, name, type, val) 172 1.1 christos #endif 173 1.1 christos 174 1.1 christos #undef GET_ATTR 175 1.1 christos #define GET_ATTR(cpu, num, attr) CGEN_ATTR_VALUE (NULL, abuf->idesc->attrs, CGEN_INSN_##attr) 176 1.1 christos 177 1.1 christos { 178 1.1 christos 179 1.1 christos #if WITH_SCACHE_PBB 180 1.1 christos 181 1.1 christos /* Branch to next handler without going around main loop. */ 182 1.1 christos #define NEXT(vpc) goto * SEM_ARGBUF (vpc) -> semantic.sem_case 183 1.1 christos SWITCH (sem, SEM_ARGBUF (vpc) -> semantic.sem_case) 184 1.1 christos 185 1.1 christos #else /* ! WITH_SCACHE_PBB */ 186 1.1 christos 187 1.1 christos #define NEXT(vpc) BREAK (sem) 188 1.1 christos #ifdef __GNUC__ 189 1.1 christos #if FAST_P 190 1.1 christos SWITCH (sem, SEM_ARGBUF (sc) -> idesc->sem_fast_lab) 191 1.1 christos #else 192 1.1 christos SWITCH (sem, SEM_ARGBUF (sc) -> idesc->sem_full_lab) 193 1.1 christos #endif 194 1.1 christos #else 195 1.1 christos SWITCH (sem, SEM_ARGBUF (sc) -> idesc->num) 196 1.1 christos #endif 197 1.1 christos 198 1.1 christos #endif /* ! WITH_SCACHE_PBB */ 199 1.1 christos 200 1.1 christos { 201 1.1 christos 202 1.1 christos CASE (sem, INSN_X_INVALID) : /* --invalid-- */ 203 1.1 christos { 204 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 205 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 206 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f 207 1.1 christos int UNUSED written = 0; 208 1.1 christos IADDR UNUSED pc = abuf->addr; 209 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0); 210 1.1 christos 211 1.1 christos { 212 1.1 christos /* Update the recorded pc in the cpu state struct. 213 1.1 christos Only necessary for WITH_SCACHE case, but to avoid the 214 1.1 christos conditional compilation .... */ 215 1.1 christos SET_H_PC (pc); 216 1.1 christos /* Virtual insns have zero size. Overwrite vpc with address of next insn 217 1.1 christos using the default-insn-bitsize spec. When executing insns in parallel 218 1.1 christos we may want to queue the fault and continue execution. */ 219 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 220 1.1 christos vpc = sim_engine_invalid_insn (current_cpu, pc, vpc); 221 1.1 christos } 222 1.1 christos 223 1.1 christos #undef FLD 224 1.1 christos } 225 1.1 christos NEXT (vpc); 226 1.1 christos 227 1.1 christos CASE (sem, INSN_X_AFTER) : /* --after-- */ 228 1.1 christos { 229 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 230 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 231 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f 232 1.1 christos int UNUSED written = 0; 233 1.1 christos IADDR UNUSED pc = abuf->addr; 234 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0); 235 1.1 christos 236 1.1 christos { 237 1.1 christos #if WITH_SCACHE_PBB_M32RBF 238 1.1 christos m32rbf_pbb_after (current_cpu, sem_arg); 239 1.1 christos #endif 240 1.1 christos } 241 1.1 christos 242 1.1 christos #undef FLD 243 1.1 christos } 244 1.1 christos NEXT (vpc); 245 1.1 christos 246 1.1 christos CASE (sem, INSN_X_BEFORE) : /* --before-- */ 247 1.1 christos { 248 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 249 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 250 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f 251 1.1 christos int UNUSED written = 0; 252 1.1 christos IADDR UNUSED pc = abuf->addr; 253 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0); 254 1.1 christos 255 1.1 christos { 256 1.1 christos #if WITH_SCACHE_PBB_M32RBF 257 1.1 christos m32rbf_pbb_before (current_cpu, sem_arg); 258 1.1 christos #endif 259 1.1 christos } 260 1.1 christos 261 1.1 christos #undef FLD 262 1.1 christos } 263 1.1 christos NEXT (vpc); 264 1.1 christos 265 1.1 christos CASE (sem, INSN_X_CTI_CHAIN) : /* --cti-chain-- */ 266 1.1 christos { 267 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 268 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 269 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f 270 1.1 christos int UNUSED written = 0; 271 1.1 christos IADDR UNUSED pc = abuf->addr; 272 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0); 273 1.1 christos 274 1.1 christos { 275 1.1 christos #if WITH_SCACHE_PBB_M32RBF 276 1.1 christos #ifdef DEFINE_SWITCH 277 1.1 christos vpc = m32rbf_pbb_cti_chain (current_cpu, sem_arg, 278 1.1 christos pbb_br_type, pbb_br_npc); 279 1.1 christos BREAK (sem); 280 1.1 christos #else 281 1.1 christos /* FIXME: Allow provision of explicit ifmt spec in insn spec. */ 282 1.1 christos vpc = m32rbf_pbb_cti_chain (current_cpu, sem_arg, 283 1.1 christos CPU_PBB_BR_TYPE (current_cpu), 284 1.1 christos CPU_PBB_BR_NPC (current_cpu)); 285 1.1 christos #endif 286 1.1 christos #endif 287 1.1 christos } 288 1.1 christos 289 1.1 christos #undef FLD 290 1.1 christos } 291 1.1 christos NEXT (vpc); 292 1.1 christos 293 1.1 christos CASE (sem, INSN_X_CHAIN) : /* --chain-- */ 294 1.1 christos { 295 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 296 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 297 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f 298 1.1 christos int UNUSED written = 0; 299 1.1 christos IADDR UNUSED pc = abuf->addr; 300 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0); 301 1.1 christos 302 1.1 christos { 303 1.1 christos #if WITH_SCACHE_PBB_M32RBF 304 1.1 christos vpc = m32rbf_pbb_chain (current_cpu, sem_arg); 305 1.1 christos #ifdef DEFINE_SWITCH 306 1.1 christos BREAK (sem); 307 1.1 christos #endif 308 1.1 christos #endif 309 1.1 christos } 310 1.1 christos 311 1.1 christos #undef FLD 312 1.1 christos } 313 1.1 christos NEXT (vpc); 314 1.1 christos 315 1.1 christos CASE (sem, INSN_X_BEGIN) : /* --begin-- */ 316 1.1 christos { 317 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 318 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 319 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f 320 1.1 christos int UNUSED written = 0; 321 1.1 christos IADDR UNUSED pc = abuf->addr; 322 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0); 323 1.1 christos 324 1.1 christos { 325 1.1 christos #if WITH_SCACHE_PBB_M32RBF 326 1.1 christos #if defined DEFINE_SWITCH || defined FAST_P 327 1.1 christos /* In the switch case FAST_P is a constant, allowing several optimizations 328 1.1 christos in any called inline functions. */ 329 1.1 christos vpc = m32rbf_pbb_begin (current_cpu, FAST_P); 330 1.1 christos #else 331 1.1 christos #if 0 /* cgen engine can't handle dynamic fast/full switching yet. */ 332 1.1 christos vpc = m32rbf_pbb_begin (current_cpu, STATE_RUN_FAST_P (CPU_STATE (current_cpu))); 333 1.1 christos #else 334 1.1 christos vpc = m32rbf_pbb_begin (current_cpu, 0); 335 1.1 christos #endif 336 1.1 christos #endif 337 1.1 christos #endif 338 1.1 christos } 339 1.1 christos 340 1.1 christos #undef FLD 341 1.1 christos } 342 1.1 christos NEXT (vpc); 343 1.1 christos 344 1.1 christos CASE (sem, INSN_ADD) : /* add $dr,$sr */ 345 1.1 christos { 346 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 347 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 348 1.1 christos #define FLD(f) abuf->fields.sfmt_add.f 349 1.1 christos int UNUSED written = 0; 350 1.1 christos IADDR UNUSED pc = abuf->addr; 351 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2); 352 1.1 christos 353 1.1 christos { 354 1.1 christos SI opval = ADDSI (* FLD (i_dr), * FLD (i_sr)); 355 1.1 christos * FLD (i_dr) = opval; 356 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 357 1.1 christos } 358 1.1 christos 359 1.1 christos #undef FLD 360 1.1 christos } 361 1.1 christos NEXT (vpc); 362 1.1 christos 363 1.1 christos CASE (sem, INSN_ADD3) : /* add3 $dr,$sr,$hash$slo16 */ 364 1.1 christos { 365 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 366 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 367 1.1 christos #define FLD(f) abuf->fields.sfmt_add3.f 368 1.1 christos int UNUSED written = 0; 369 1.1 christos IADDR UNUSED pc = abuf->addr; 370 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 371 1.1 christos 372 1.1 christos { 373 1.1 christos SI opval = ADDSI (* FLD (i_sr), FLD (f_simm16)); 374 1.1 christos * FLD (i_dr) = opval; 375 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 376 1.1 christos } 377 1.1 christos 378 1.1 christos #undef FLD 379 1.1 christos } 380 1.1 christos NEXT (vpc); 381 1.1 christos 382 1.1 christos CASE (sem, INSN_AND) : /* and $dr,$sr */ 383 1.1 christos { 384 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 385 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 386 1.1 christos #define FLD(f) abuf->fields.sfmt_add.f 387 1.1 christos int UNUSED written = 0; 388 1.1 christos IADDR UNUSED pc = abuf->addr; 389 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2); 390 1.1 christos 391 1.1 christos { 392 1.1 christos SI opval = ANDSI (* FLD (i_dr), * FLD (i_sr)); 393 1.1 christos * FLD (i_dr) = opval; 394 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 395 1.1 christos } 396 1.1 christos 397 1.1 christos #undef FLD 398 1.1 christos } 399 1.1 christos NEXT (vpc); 400 1.1 christos 401 1.1 christos CASE (sem, INSN_AND3) : /* and3 $dr,$sr,$uimm16 */ 402 1.1 christos { 403 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 404 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 405 1.1 christos #define FLD(f) abuf->fields.sfmt_and3.f 406 1.1 christos int UNUSED written = 0; 407 1.1 christos IADDR UNUSED pc = abuf->addr; 408 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 409 1.1 christos 410 1.1 christos { 411 1.1 christos SI opval = ANDSI (* FLD (i_sr), FLD (f_uimm16)); 412 1.1 christos * FLD (i_dr) = opval; 413 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 414 1.1 christos } 415 1.1 christos 416 1.1 christos #undef FLD 417 1.1 christos } 418 1.1 christos NEXT (vpc); 419 1.1 christos 420 1.1 christos CASE (sem, INSN_OR) : /* or $dr,$sr */ 421 1.1 christos { 422 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 423 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 424 1.1 christos #define FLD(f) abuf->fields.sfmt_add.f 425 1.1 christos int UNUSED written = 0; 426 1.1 christos IADDR UNUSED pc = abuf->addr; 427 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2); 428 1.1 christos 429 1.1 christos { 430 1.1 christos SI opval = ORSI (* FLD (i_dr), * FLD (i_sr)); 431 1.1 christos * FLD (i_dr) = opval; 432 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 433 1.1 christos } 434 1.1 christos 435 1.1 christos #undef FLD 436 1.1 christos } 437 1.1 christos NEXT (vpc); 438 1.1 christos 439 1.1 christos CASE (sem, INSN_OR3) : /* or3 $dr,$sr,$hash$ulo16 */ 440 1.1 christos { 441 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 442 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 443 1.1 christos #define FLD(f) abuf->fields.sfmt_and3.f 444 1.1 christos int UNUSED written = 0; 445 1.1 christos IADDR UNUSED pc = abuf->addr; 446 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 447 1.1 christos 448 1.1 christos { 449 1.1 christos SI opval = ORSI (* FLD (i_sr), FLD (f_uimm16)); 450 1.1 christos * FLD (i_dr) = opval; 451 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 452 1.1 christos } 453 1.1 christos 454 1.1 christos #undef FLD 455 1.1 christos } 456 1.1 christos NEXT (vpc); 457 1.1 christos 458 1.1 christos CASE (sem, INSN_XOR) : /* xor $dr,$sr */ 459 1.1 christos { 460 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 461 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 462 1.1 christos #define FLD(f) abuf->fields.sfmt_add.f 463 1.1 christos int UNUSED written = 0; 464 1.1 christos IADDR UNUSED pc = abuf->addr; 465 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2); 466 1.1 christos 467 1.1 christos { 468 1.1 christos SI opval = XORSI (* FLD (i_dr), * FLD (i_sr)); 469 1.1 christos * FLD (i_dr) = opval; 470 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 471 1.1 christos } 472 1.1 christos 473 1.1 christos #undef FLD 474 1.1 christos } 475 1.1 christos NEXT (vpc); 476 1.1 christos 477 1.1 christos CASE (sem, INSN_XOR3) : /* xor3 $dr,$sr,$uimm16 */ 478 1.1 christos { 479 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 480 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 481 1.1 christos #define FLD(f) abuf->fields.sfmt_and3.f 482 1.1 christos int UNUSED written = 0; 483 1.1 christos IADDR UNUSED pc = abuf->addr; 484 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 485 1.1 christos 486 1.1 christos { 487 1.1 christos SI opval = XORSI (* FLD (i_sr), FLD (f_uimm16)); 488 1.1 christos * FLD (i_dr) = opval; 489 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 490 1.1 christos } 491 1.1 christos 492 1.1 christos #undef FLD 493 1.1 christos } 494 1.1 christos NEXT (vpc); 495 1.1 christos 496 1.1 christos CASE (sem, INSN_ADDI) : /* addi $dr,$simm8 */ 497 1.1 christos { 498 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 499 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 500 1.1 christos #define FLD(f) abuf->fields.sfmt_addi.f 501 1.1 christos int UNUSED written = 0; 502 1.1 christos IADDR UNUSED pc = abuf->addr; 503 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2); 504 1.1 christos 505 1.1 christos { 506 1.1 christos SI opval = ADDSI (* FLD (i_dr), FLD (f_simm8)); 507 1.1 christos * FLD (i_dr) = opval; 508 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 509 1.1 christos } 510 1.1 christos 511 1.1 christos #undef FLD 512 1.1 christos } 513 1.1 christos NEXT (vpc); 514 1.1 christos 515 1.1 christos CASE (sem, INSN_ADDV) : /* addv $dr,$sr */ 516 1.1 christos { 517 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 518 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 519 1.1 christos #define FLD(f) abuf->fields.sfmt_add.f 520 1.1 christos int UNUSED written = 0; 521 1.1 christos IADDR UNUSED pc = abuf->addr; 522 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2); 523 1.1 christos 524 1.1 christos { 525 1.1 christos SI temp0;BI temp1; 526 1.1 christos temp0 = ADDSI (* FLD (i_dr), * FLD (i_sr)); 527 1.1 christos temp1 = ADDOFSI (* FLD (i_dr), * FLD (i_sr), 0); 528 1.1 christos { 529 1.1 christos SI opval = temp0; 530 1.1 christos * FLD (i_dr) = opval; 531 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 532 1.1 christos } 533 1.1 christos { 534 1.1 christos BI opval = temp1; 535 1.1 christos CPU (h_cond) = opval; 536 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval); 537 1.1 christos } 538 1.1 christos } 539 1.1 christos 540 1.1 christos #undef FLD 541 1.1 christos } 542 1.1 christos NEXT (vpc); 543 1.1 christos 544 1.1 christos CASE (sem, INSN_ADDV3) : /* addv3 $dr,$sr,$simm16 */ 545 1.1 christos { 546 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 547 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 548 1.1 christos #define FLD(f) abuf->fields.sfmt_add3.f 549 1.1 christos int UNUSED written = 0; 550 1.1 christos IADDR UNUSED pc = abuf->addr; 551 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 552 1.1 christos 553 1.1 christos { 554 1.1 christos SI temp0;BI temp1; 555 1.1 christos temp0 = ADDSI (* FLD (i_sr), FLD (f_simm16)); 556 1.1 christos temp1 = ADDOFSI (* FLD (i_sr), FLD (f_simm16), 0); 557 1.1 christos { 558 1.1 christos SI opval = temp0; 559 1.1 christos * FLD (i_dr) = opval; 560 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 561 1.1 christos } 562 1.1 christos { 563 1.1 christos BI opval = temp1; 564 1.1 christos CPU (h_cond) = opval; 565 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval); 566 1.1 christos } 567 1.1 christos } 568 1.1 christos 569 1.1 christos #undef FLD 570 1.1 christos } 571 1.1 christos NEXT (vpc); 572 1.1 christos 573 1.1 christos CASE (sem, INSN_ADDX) : /* addx $dr,$sr */ 574 1.1 christos { 575 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 576 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 577 1.1 christos #define FLD(f) abuf->fields.sfmt_add.f 578 1.1 christos int UNUSED written = 0; 579 1.1 christos IADDR UNUSED pc = abuf->addr; 580 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2); 581 1.1 christos 582 1.1 christos { 583 1.1 christos SI temp0;BI temp1; 584 1.1 christos temp0 = ADDCSI (* FLD (i_dr), * FLD (i_sr), CPU (h_cond)); 585 1.1 christos temp1 = ADDCFSI (* FLD (i_dr), * FLD (i_sr), CPU (h_cond)); 586 1.1 christos { 587 1.1 christos SI opval = temp0; 588 1.1 christos * FLD (i_dr) = opval; 589 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 590 1.1 christos } 591 1.1 christos { 592 1.1 christos BI opval = temp1; 593 1.1 christos CPU (h_cond) = opval; 594 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval); 595 1.1 christos } 596 1.1 christos } 597 1.1 christos 598 1.1 christos #undef FLD 599 1.1 christos } 600 1.1 christos NEXT (vpc); 601 1.1 christos 602 1.1 christos CASE (sem, INSN_BC8) : /* bc.s $disp8 */ 603 1.1 christos { 604 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 605 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 606 1.1 christos #define FLD(f) abuf->fields.sfmt_bl8.f 607 1.1 christos int UNUSED written = 0; 608 1.1 christos IADDR UNUSED pc = abuf->addr; 609 1.1 christos SEM_BRANCH_INIT 610 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2); 611 1.1 christos 612 1.1 christos if (CPU (h_cond)) { 613 1.1 christos { 614 1.1 christos USI opval = FLD (i_disp8); 615 1.1 christos SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc); 616 1.1 christos written |= (1 << 2); 617 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval); 618 1.1 christos } 619 1.1 christos } 620 1.1 christos 621 1.1 christos abuf->written = written; 622 1.1 christos SEM_BRANCH_FINI (vpc); 623 1.1 christos #undef FLD 624 1.1 christos } 625 1.1 christos NEXT (vpc); 626 1.1 christos 627 1.1 christos CASE (sem, INSN_BC24) : /* bc.l $disp24 */ 628 1.1 christos { 629 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 630 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 631 1.1 christos #define FLD(f) abuf->fields.sfmt_bl24.f 632 1.1 christos int UNUSED written = 0; 633 1.1 christos IADDR UNUSED pc = abuf->addr; 634 1.1 christos SEM_BRANCH_INIT 635 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 636 1.1 christos 637 1.1 christos if (CPU (h_cond)) { 638 1.1 christos { 639 1.1 christos USI opval = FLD (i_disp24); 640 1.1 christos SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc); 641 1.1 christos written |= (1 << 2); 642 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval); 643 1.1 christos } 644 1.1 christos } 645 1.1 christos 646 1.1 christos abuf->written = written; 647 1.1 christos SEM_BRANCH_FINI (vpc); 648 1.1 christos #undef FLD 649 1.1 christos } 650 1.1 christos NEXT (vpc); 651 1.1 christos 652 1.1 christos CASE (sem, INSN_BEQ) : /* beq $src1,$src2,$disp16 */ 653 1.1 christos { 654 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 655 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 656 1.1 christos #define FLD(f) abuf->fields.sfmt_beq.f 657 1.1 christos int UNUSED written = 0; 658 1.1 christos IADDR UNUSED pc = abuf->addr; 659 1.1 christos SEM_BRANCH_INIT 660 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 661 1.1 christos 662 1.1 christos if (EQSI (* FLD (i_src1), * FLD (i_src2))) { 663 1.1 christos { 664 1.1 christos USI opval = FLD (i_disp16); 665 1.1 christos SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc); 666 1.1 christos written |= (1 << 3); 667 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval); 668 1.1 christos } 669 1.1 christos } 670 1.1 christos 671 1.1 christos abuf->written = written; 672 1.1 christos SEM_BRANCH_FINI (vpc); 673 1.1 christos #undef FLD 674 1.1 christos } 675 1.1 christos NEXT (vpc); 676 1.1 christos 677 1.1 christos CASE (sem, INSN_BEQZ) : /* beqz $src2,$disp16 */ 678 1.1 christos { 679 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 680 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 681 1.1 christos #define FLD(f) abuf->fields.sfmt_beq.f 682 1.1 christos int UNUSED written = 0; 683 1.1 christos IADDR UNUSED pc = abuf->addr; 684 1.1 christos SEM_BRANCH_INIT 685 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 686 1.1 christos 687 1.1 christos if (EQSI (* FLD (i_src2), 0)) { 688 1.1 christos { 689 1.1 christos USI opval = FLD (i_disp16); 690 1.1 christos SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc); 691 1.1 christos written |= (1 << 2); 692 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval); 693 1.1 christos } 694 1.1 christos } 695 1.1 christos 696 1.1 christos abuf->written = written; 697 1.1 christos SEM_BRANCH_FINI (vpc); 698 1.1 christos #undef FLD 699 1.1 christos } 700 1.1 christos NEXT (vpc); 701 1.1 christos 702 1.1 christos CASE (sem, INSN_BGEZ) : /* bgez $src2,$disp16 */ 703 1.1 christos { 704 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 705 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 706 1.1 christos #define FLD(f) abuf->fields.sfmt_beq.f 707 1.1 christos int UNUSED written = 0; 708 1.1 christos IADDR UNUSED pc = abuf->addr; 709 1.1 christos SEM_BRANCH_INIT 710 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 711 1.1 christos 712 1.1 christos if (GESI (* FLD (i_src2), 0)) { 713 1.1 christos { 714 1.1 christos USI opval = FLD (i_disp16); 715 1.1 christos SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc); 716 1.1 christos written |= (1 << 2); 717 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval); 718 1.1 christos } 719 1.1 christos } 720 1.1 christos 721 1.1 christos abuf->written = written; 722 1.1 christos SEM_BRANCH_FINI (vpc); 723 1.1 christos #undef FLD 724 1.1 christos } 725 1.1 christos NEXT (vpc); 726 1.1 christos 727 1.1 christos CASE (sem, INSN_BGTZ) : /* bgtz $src2,$disp16 */ 728 1.1 christos { 729 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 730 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 731 1.1 christos #define FLD(f) abuf->fields.sfmt_beq.f 732 1.1 christos int UNUSED written = 0; 733 1.1 christos IADDR UNUSED pc = abuf->addr; 734 1.1 christos SEM_BRANCH_INIT 735 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 736 1.1 christos 737 1.1 christos if (GTSI (* FLD (i_src2), 0)) { 738 1.1 christos { 739 1.1 christos USI opval = FLD (i_disp16); 740 1.1 christos SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc); 741 1.1 christos written |= (1 << 2); 742 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval); 743 1.1 christos } 744 1.1 christos } 745 1.1 christos 746 1.1 christos abuf->written = written; 747 1.1 christos SEM_BRANCH_FINI (vpc); 748 1.1 christos #undef FLD 749 1.1 christos } 750 1.1 christos NEXT (vpc); 751 1.1 christos 752 1.1 christos CASE (sem, INSN_BLEZ) : /* blez $src2,$disp16 */ 753 1.1 christos { 754 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 755 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 756 1.1 christos #define FLD(f) abuf->fields.sfmt_beq.f 757 1.1 christos int UNUSED written = 0; 758 1.1 christos IADDR UNUSED pc = abuf->addr; 759 1.1 christos SEM_BRANCH_INIT 760 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 761 1.1 christos 762 1.1 christos if (LESI (* FLD (i_src2), 0)) { 763 1.1 christos { 764 1.1 christos USI opval = FLD (i_disp16); 765 1.1 christos SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc); 766 1.1 christos written |= (1 << 2); 767 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval); 768 1.1 christos } 769 1.1 christos } 770 1.1 christos 771 1.1 christos abuf->written = written; 772 1.1 christos SEM_BRANCH_FINI (vpc); 773 1.1 christos #undef FLD 774 1.1 christos } 775 1.1 christos NEXT (vpc); 776 1.1 christos 777 1.1 christos CASE (sem, INSN_BLTZ) : /* bltz $src2,$disp16 */ 778 1.1 christos { 779 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 780 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 781 1.1 christos #define FLD(f) abuf->fields.sfmt_beq.f 782 1.1 christos int UNUSED written = 0; 783 1.1 christos IADDR UNUSED pc = abuf->addr; 784 1.1 christos SEM_BRANCH_INIT 785 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 786 1.1 christos 787 1.1 christos if (LTSI (* FLD (i_src2), 0)) { 788 1.1 christos { 789 1.1 christos USI opval = FLD (i_disp16); 790 1.1 christos SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc); 791 1.1 christos written |= (1 << 2); 792 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval); 793 1.1 christos } 794 1.1 christos } 795 1.1 christos 796 1.1 christos abuf->written = written; 797 1.1 christos SEM_BRANCH_FINI (vpc); 798 1.1 christos #undef FLD 799 1.1 christos } 800 1.1 christos NEXT (vpc); 801 1.1 christos 802 1.1 christos CASE (sem, INSN_BNEZ) : /* bnez $src2,$disp16 */ 803 1.1 christos { 804 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 805 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 806 1.1 christos #define FLD(f) abuf->fields.sfmt_beq.f 807 1.1 christos int UNUSED written = 0; 808 1.1 christos IADDR UNUSED pc = abuf->addr; 809 1.1 christos SEM_BRANCH_INIT 810 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 811 1.1 christos 812 1.1 christos if (NESI (* FLD (i_src2), 0)) { 813 1.1 christos { 814 1.1 christos USI opval = FLD (i_disp16); 815 1.1 christos SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc); 816 1.1 christos written |= (1 << 2); 817 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval); 818 1.1 christos } 819 1.1 christos } 820 1.1 christos 821 1.1 christos abuf->written = written; 822 1.1 christos SEM_BRANCH_FINI (vpc); 823 1.1 christos #undef FLD 824 1.1 christos } 825 1.1 christos NEXT (vpc); 826 1.1 christos 827 1.1 christos CASE (sem, INSN_BL8) : /* bl.s $disp8 */ 828 1.1 christos { 829 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 830 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 831 1.1 christos #define FLD(f) abuf->fields.sfmt_bl8.f 832 1.1 christos int UNUSED written = 0; 833 1.1 christos IADDR UNUSED pc = abuf->addr; 834 1.1 christos SEM_BRANCH_INIT 835 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2); 836 1.1 christos 837 1.1 christos { 838 1.1 christos { 839 1.1 christos SI opval = ADDSI (ANDSI (pc, -4), 4); 840 1.1 christos CPU (h_gr[((UINT) 14)]) = opval; 841 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 842 1.1 christos } 843 1.1 christos { 844 1.1 christos USI opval = FLD (i_disp8); 845 1.1 christos SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc); 846 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval); 847 1.1 christos } 848 1.1 christos } 849 1.1 christos 850 1.1 christos SEM_BRANCH_FINI (vpc); 851 1.1 christos #undef FLD 852 1.1 christos } 853 1.1 christos NEXT (vpc); 854 1.1 christos 855 1.1 christos CASE (sem, INSN_BL24) : /* bl.l $disp24 */ 856 1.1 christos { 857 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 858 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 859 1.1 christos #define FLD(f) abuf->fields.sfmt_bl24.f 860 1.1 christos int UNUSED written = 0; 861 1.1 christos IADDR UNUSED pc = abuf->addr; 862 1.1 christos SEM_BRANCH_INIT 863 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 864 1.1 christos 865 1.1 christos { 866 1.1 christos { 867 1.1 christos SI opval = ADDSI (pc, 4); 868 1.1 christos CPU (h_gr[((UINT) 14)]) = opval; 869 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 870 1.1 christos } 871 1.1 christos { 872 1.1 christos USI opval = FLD (i_disp24); 873 1.1 christos SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc); 874 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval); 875 1.1 christos } 876 1.1 christos } 877 1.1 christos 878 1.1 christos SEM_BRANCH_FINI (vpc); 879 1.1 christos #undef FLD 880 1.1 christos } 881 1.1 christos NEXT (vpc); 882 1.1 christos 883 1.1 christos CASE (sem, INSN_BNC8) : /* bnc.s $disp8 */ 884 1.1 christos { 885 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 886 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 887 1.1 christos #define FLD(f) abuf->fields.sfmt_bl8.f 888 1.1 christos int UNUSED written = 0; 889 1.1 christos IADDR UNUSED pc = abuf->addr; 890 1.1 christos SEM_BRANCH_INIT 891 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2); 892 1.1 christos 893 1.1 christos if (NOTBI (CPU (h_cond))) { 894 1.1 christos { 895 1.1 christos USI opval = FLD (i_disp8); 896 1.1 christos SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc); 897 1.1 christos written |= (1 << 2); 898 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval); 899 1.1 christos } 900 1.1 christos } 901 1.1 christos 902 1.1 christos abuf->written = written; 903 1.1 christos SEM_BRANCH_FINI (vpc); 904 1.1 christos #undef FLD 905 1.1 christos } 906 1.1 christos NEXT (vpc); 907 1.1 christos 908 1.1 christos CASE (sem, INSN_BNC24) : /* bnc.l $disp24 */ 909 1.1 christos { 910 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 911 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 912 1.1 christos #define FLD(f) abuf->fields.sfmt_bl24.f 913 1.1 christos int UNUSED written = 0; 914 1.1 christos IADDR UNUSED pc = abuf->addr; 915 1.1 christos SEM_BRANCH_INIT 916 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 917 1.1 christos 918 1.1 christos if (NOTBI (CPU (h_cond))) { 919 1.1 christos { 920 1.1 christos USI opval = FLD (i_disp24); 921 1.1 christos SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc); 922 1.1 christos written |= (1 << 2); 923 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval); 924 1.1 christos } 925 1.1 christos } 926 1.1 christos 927 1.1 christos abuf->written = written; 928 1.1 christos SEM_BRANCH_FINI (vpc); 929 1.1 christos #undef FLD 930 1.1 christos } 931 1.1 christos NEXT (vpc); 932 1.1 christos 933 1.1 christos CASE (sem, INSN_BNE) : /* bne $src1,$src2,$disp16 */ 934 1.1 christos { 935 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 936 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 937 1.1 christos #define FLD(f) abuf->fields.sfmt_beq.f 938 1.1 christos int UNUSED written = 0; 939 1.1 christos IADDR UNUSED pc = abuf->addr; 940 1.1 christos SEM_BRANCH_INIT 941 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 942 1.1 christos 943 1.1 christos if (NESI (* FLD (i_src1), * FLD (i_src2))) { 944 1.1 christos { 945 1.1 christos USI opval = FLD (i_disp16); 946 1.1 christos SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc); 947 1.1 christos written |= (1 << 3); 948 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval); 949 1.1 christos } 950 1.1 christos } 951 1.1 christos 952 1.1 christos abuf->written = written; 953 1.1 christos SEM_BRANCH_FINI (vpc); 954 1.1 christos #undef FLD 955 1.1 christos } 956 1.1 christos NEXT (vpc); 957 1.1 christos 958 1.1 christos CASE (sem, INSN_BRA8) : /* bra.s $disp8 */ 959 1.1 christos { 960 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 961 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 962 1.1 christos #define FLD(f) abuf->fields.sfmt_bl8.f 963 1.1 christos int UNUSED written = 0; 964 1.1 christos IADDR UNUSED pc = abuf->addr; 965 1.1 christos SEM_BRANCH_INIT 966 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2); 967 1.1 christos 968 1.1 christos { 969 1.1 christos USI opval = FLD (i_disp8); 970 1.1 christos SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc); 971 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval); 972 1.1 christos } 973 1.1 christos 974 1.1 christos SEM_BRANCH_FINI (vpc); 975 1.1 christos #undef FLD 976 1.1 christos } 977 1.1 christos NEXT (vpc); 978 1.1 christos 979 1.1 christos CASE (sem, INSN_BRA24) : /* bra.l $disp24 */ 980 1.1 christos { 981 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 982 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 983 1.1 christos #define FLD(f) abuf->fields.sfmt_bl24.f 984 1.1 christos int UNUSED written = 0; 985 1.1 christos IADDR UNUSED pc = abuf->addr; 986 1.1 christos SEM_BRANCH_INIT 987 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 988 1.1 christos 989 1.1 christos { 990 1.1 christos USI opval = FLD (i_disp24); 991 1.1 christos SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc); 992 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval); 993 1.1 christos } 994 1.1 christos 995 1.1 christos SEM_BRANCH_FINI (vpc); 996 1.1 christos #undef FLD 997 1.1 christos } 998 1.1 christos NEXT (vpc); 999 1.1 christos 1000 1.1 christos CASE (sem, INSN_CMP) : /* cmp $src1,$src2 */ 1001 1.1 christos { 1002 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1003 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1004 1.1 christos #define FLD(f) abuf->fields.sfmt_st_plus.f 1005 1.1 christos int UNUSED written = 0; 1006 1.1 christos IADDR UNUSED pc = abuf->addr; 1007 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2); 1008 1.1 christos 1009 1.1 christos { 1010 1.1 christos BI opval = LTSI (* FLD (i_src1), * FLD (i_src2)); 1011 1.1 christos CPU (h_cond) = opval; 1012 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval); 1013 1.1 christos } 1014 1.1 christos 1015 1.1 christos #undef FLD 1016 1.1 christos } 1017 1.1 christos NEXT (vpc); 1018 1.1 christos 1019 1.1 christos CASE (sem, INSN_CMPI) : /* cmpi $src2,$simm16 */ 1020 1.1 christos { 1021 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1022 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1023 1.1 christos #define FLD(f) abuf->fields.sfmt_st_d.f 1024 1.1 christos int UNUSED written = 0; 1025 1.1 christos IADDR UNUSED pc = abuf->addr; 1026 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 1027 1.1 christos 1028 1.1 christos { 1029 1.1 christos BI opval = LTSI (* FLD (i_src2), FLD (f_simm16)); 1030 1.1 christos CPU (h_cond) = opval; 1031 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval); 1032 1.1 christos } 1033 1.1 christos 1034 1.1 christos #undef FLD 1035 1.1 christos } 1036 1.1 christos NEXT (vpc); 1037 1.1 christos 1038 1.1 christos CASE (sem, INSN_CMPU) : /* cmpu $src1,$src2 */ 1039 1.1 christos { 1040 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1041 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1042 1.1 christos #define FLD(f) abuf->fields.sfmt_st_plus.f 1043 1.1 christos int UNUSED written = 0; 1044 1.1 christos IADDR UNUSED pc = abuf->addr; 1045 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2); 1046 1.1 christos 1047 1.1 christos { 1048 1.1 christos BI opval = LTUSI (* FLD (i_src1), * FLD (i_src2)); 1049 1.1 christos CPU (h_cond) = opval; 1050 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval); 1051 1.1 christos } 1052 1.1 christos 1053 1.1 christos #undef FLD 1054 1.1 christos } 1055 1.1 christos NEXT (vpc); 1056 1.1 christos 1057 1.1 christos CASE (sem, INSN_CMPUI) : /* cmpui $src2,$simm16 */ 1058 1.1 christos { 1059 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1060 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1061 1.1 christos #define FLD(f) abuf->fields.sfmt_st_d.f 1062 1.1 christos int UNUSED written = 0; 1063 1.1 christos IADDR UNUSED pc = abuf->addr; 1064 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 1065 1.1 christos 1066 1.1 christos { 1067 1.1 christos BI opval = LTUSI (* FLD (i_src2), FLD (f_simm16)); 1068 1.1 christos CPU (h_cond) = opval; 1069 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval); 1070 1.1 christos } 1071 1.1 christos 1072 1.1 christos #undef FLD 1073 1.1 christos } 1074 1.1 christos NEXT (vpc); 1075 1.1 christos 1076 1.1 christos CASE (sem, INSN_DIV) : /* div $dr,$sr */ 1077 1.1 christos { 1078 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1079 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1080 1.1 christos #define FLD(f) abuf->fields.sfmt_add.f 1081 1.1 christos int UNUSED written = 0; 1082 1.1 christos IADDR UNUSED pc = abuf->addr; 1083 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 1084 1.1 christos 1085 1.1 christos if (NESI (* FLD (i_sr), 0)) { 1086 1.1 christos { 1087 1.1 christos SI opval = DIVSI (* FLD (i_dr), * FLD (i_sr)); 1088 1.1 christos * FLD (i_dr) = opval; 1089 1.1 christos written |= (1 << 2); 1090 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 1091 1.1 christos } 1092 1.1 christos } 1093 1.1 christos 1094 1.1 christos abuf->written = written; 1095 1.1 christos #undef FLD 1096 1.1 christos } 1097 1.1 christos NEXT (vpc); 1098 1.1 christos 1099 1.1 christos CASE (sem, INSN_DIVU) : /* divu $dr,$sr */ 1100 1.1 christos { 1101 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1102 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1103 1.1 christos #define FLD(f) abuf->fields.sfmt_add.f 1104 1.1 christos int UNUSED written = 0; 1105 1.1 christos IADDR UNUSED pc = abuf->addr; 1106 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 1107 1.1 christos 1108 1.1 christos if (NESI (* FLD (i_sr), 0)) { 1109 1.1 christos { 1110 1.1 christos SI opval = UDIVSI (* FLD (i_dr), * FLD (i_sr)); 1111 1.1 christos * FLD (i_dr) = opval; 1112 1.1 christos written |= (1 << 2); 1113 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 1114 1.1 christos } 1115 1.1 christos } 1116 1.1 christos 1117 1.1 christos abuf->written = written; 1118 1.1 christos #undef FLD 1119 1.1 christos } 1120 1.1 christos NEXT (vpc); 1121 1.1 christos 1122 1.1 christos CASE (sem, INSN_REM) : /* rem $dr,$sr */ 1123 1.1 christos { 1124 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1125 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1126 1.1 christos #define FLD(f) abuf->fields.sfmt_add.f 1127 1.1 christos int UNUSED written = 0; 1128 1.1 christos IADDR UNUSED pc = abuf->addr; 1129 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 1130 1.1 christos 1131 1.1 christos if (NESI (* FLD (i_sr), 0)) { 1132 1.1 christos { 1133 1.1 christos SI opval = MODSI (* FLD (i_dr), * FLD (i_sr)); 1134 1.1 christos * FLD (i_dr) = opval; 1135 1.1 christos written |= (1 << 2); 1136 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 1137 1.1 christos } 1138 1.1 christos } 1139 1.1 christos 1140 1.1 christos abuf->written = written; 1141 1.1 christos #undef FLD 1142 1.1 christos } 1143 1.1 christos NEXT (vpc); 1144 1.1 christos 1145 1.1 christos CASE (sem, INSN_REMU) : /* remu $dr,$sr */ 1146 1.1 christos { 1147 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1148 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1149 1.1 christos #define FLD(f) abuf->fields.sfmt_add.f 1150 1.1 christos int UNUSED written = 0; 1151 1.1 christos IADDR UNUSED pc = abuf->addr; 1152 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 1153 1.1 christos 1154 1.1 christos if (NESI (* FLD (i_sr), 0)) { 1155 1.1 christos { 1156 1.1 christos SI opval = UMODSI (* FLD (i_dr), * FLD (i_sr)); 1157 1.1 christos * FLD (i_dr) = opval; 1158 1.1 christos written |= (1 << 2); 1159 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 1160 1.1 christos } 1161 1.1 christos } 1162 1.1 christos 1163 1.1 christos abuf->written = written; 1164 1.1 christos #undef FLD 1165 1.1 christos } 1166 1.1 christos NEXT (vpc); 1167 1.1 christos 1168 1.1 christos CASE (sem, INSN_JL) : /* jl $sr */ 1169 1.1 christos { 1170 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1171 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1172 1.1 christos #define FLD(f) abuf->fields.sfmt_jl.f 1173 1.1 christos int UNUSED written = 0; 1174 1.1 christos IADDR UNUSED pc = abuf->addr; 1175 1.1 christos SEM_BRANCH_INIT 1176 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2); 1177 1.1 christos 1178 1.1 christos { 1179 1.1 christos SI temp0;USI temp1; 1180 1.1 christos temp0 = ADDSI (ANDSI (pc, -4), 4); 1181 1.1 christos temp1 = ANDSI (* FLD (i_sr), -4); 1182 1.1 christos { 1183 1.1 christos SI opval = temp0; 1184 1.1 christos CPU (h_gr[((UINT) 14)]) = opval; 1185 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 1186 1.1 christos } 1187 1.1 christos { 1188 1.1 christos USI opval = temp1; 1189 1.1 christos SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc); 1190 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval); 1191 1.1 christos } 1192 1.1 christos } 1193 1.1 christos 1194 1.1 christos SEM_BRANCH_FINI (vpc); 1195 1.1 christos #undef FLD 1196 1.1 christos } 1197 1.1 christos NEXT (vpc); 1198 1.1 christos 1199 1.1 christos CASE (sem, INSN_JMP) : /* jmp $sr */ 1200 1.1 christos { 1201 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1202 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1203 1.1 christos #define FLD(f) abuf->fields.sfmt_jl.f 1204 1.1 christos int UNUSED written = 0; 1205 1.1 christos IADDR UNUSED pc = abuf->addr; 1206 1.1 christos SEM_BRANCH_INIT 1207 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2); 1208 1.1 christos 1209 1.1 christos { 1210 1.1 christos USI opval = ANDSI (* FLD (i_sr), -4); 1211 1.1 christos SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc); 1212 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval); 1213 1.1 christos } 1214 1.1 christos 1215 1.1 christos SEM_BRANCH_FINI (vpc); 1216 1.1 christos #undef FLD 1217 1.1 christos } 1218 1.1 christos NEXT (vpc); 1219 1.1 christos 1220 1.1 christos CASE (sem, INSN_LD) : /* ld $dr,@$sr */ 1221 1.1 christos { 1222 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1223 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1224 1.1 christos #define FLD(f) abuf->fields.sfmt_ld_plus.f 1225 1.1 christos int UNUSED written = 0; 1226 1.1 christos IADDR UNUSED pc = abuf->addr; 1227 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2); 1228 1.1 christos 1229 1.1 christos { 1230 1.1 christos SI opval = GETMEMSI (current_cpu, pc, * FLD (i_sr)); 1231 1.1 christos * FLD (i_dr) = opval; 1232 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 1233 1.1 christos } 1234 1.1 christos 1235 1.1 christos #undef FLD 1236 1.1 christos } 1237 1.1 christos NEXT (vpc); 1238 1.1 christos 1239 1.1 christos CASE (sem, INSN_LD_D) : /* ld $dr,@($slo16,$sr) */ 1240 1.1 christos { 1241 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1242 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1243 1.1 christos #define FLD(f) abuf->fields.sfmt_add3.f 1244 1.1 christos int UNUSED written = 0; 1245 1.1 christos IADDR UNUSED pc = abuf->addr; 1246 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 1247 1.1 christos 1248 1.1 christos { 1249 1.1 christos SI opval = GETMEMSI (current_cpu, pc, ADDSI (* FLD (i_sr), FLD (f_simm16))); 1250 1.1 christos * FLD (i_dr) = opval; 1251 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 1252 1.1 christos } 1253 1.1 christos 1254 1.1 christos #undef FLD 1255 1.1 christos } 1256 1.1 christos NEXT (vpc); 1257 1.1 christos 1258 1.1 christos CASE (sem, INSN_LDB) : /* ldb $dr,@$sr */ 1259 1.1 christos { 1260 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1261 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1262 1.1 christos #define FLD(f) abuf->fields.sfmt_ld_plus.f 1263 1.1 christos int UNUSED written = 0; 1264 1.1 christos IADDR UNUSED pc = abuf->addr; 1265 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2); 1266 1.1 christos 1267 1.1 christos { 1268 1.1 christos SI opval = EXTQISI (GETMEMQI (current_cpu, pc, * FLD (i_sr))); 1269 1.1 christos * FLD (i_dr) = opval; 1270 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 1271 1.1 christos } 1272 1.1 christos 1273 1.1 christos #undef FLD 1274 1.1 christos } 1275 1.1 christos NEXT (vpc); 1276 1.1 christos 1277 1.1 christos CASE (sem, INSN_LDB_D) : /* ldb $dr,@($slo16,$sr) */ 1278 1.1 christos { 1279 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1280 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1281 1.1 christos #define FLD(f) abuf->fields.sfmt_add3.f 1282 1.1 christos int UNUSED written = 0; 1283 1.1 christos IADDR UNUSED pc = abuf->addr; 1284 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 1285 1.1 christos 1286 1.1 christos { 1287 1.1 christos SI opval = EXTQISI (GETMEMQI (current_cpu, pc, ADDSI (* FLD (i_sr), FLD (f_simm16)))); 1288 1.1 christos * FLD (i_dr) = opval; 1289 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 1290 1.1 christos } 1291 1.1 christos 1292 1.1 christos #undef FLD 1293 1.1 christos } 1294 1.1 christos NEXT (vpc); 1295 1.1 christos 1296 1.1 christos CASE (sem, INSN_LDH) : /* ldh $dr,@$sr */ 1297 1.1 christos { 1298 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1299 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1300 1.1 christos #define FLD(f) abuf->fields.sfmt_ld_plus.f 1301 1.1 christos int UNUSED written = 0; 1302 1.1 christos IADDR UNUSED pc = abuf->addr; 1303 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2); 1304 1.1 christos 1305 1.1 christos { 1306 1.1 christos SI opval = EXTHISI (GETMEMHI (current_cpu, pc, * FLD (i_sr))); 1307 1.1 christos * FLD (i_dr) = opval; 1308 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 1309 1.1 christos } 1310 1.1 christos 1311 1.1 christos #undef FLD 1312 1.1 christos } 1313 1.1 christos NEXT (vpc); 1314 1.1 christos 1315 1.1 christos CASE (sem, INSN_LDH_D) : /* ldh $dr,@($slo16,$sr) */ 1316 1.1 christos { 1317 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1318 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1319 1.1 christos #define FLD(f) abuf->fields.sfmt_add3.f 1320 1.1 christos int UNUSED written = 0; 1321 1.1 christos IADDR UNUSED pc = abuf->addr; 1322 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 1323 1.1 christos 1324 1.1 christos { 1325 1.1 christos SI opval = EXTHISI (GETMEMHI (current_cpu, pc, ADDSI (* FLD (i_sr), FLD (f_simm16)))); 1326 1.1 christos * FLD (i_dr) = opval; 1327 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 1328 1.1 christos } 1329 1.1 christos 1330 1.1 christos #undef FLD 1331 1.1 christos } 1332 1.1 christos NEXT (vpc); 1333 1.1 christos 1334 1.1 christos CASE (sem, INSN_LDUB) : /* ldub $dr,@$sr */ 1335 1.1 christos { 1336 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1337 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1338 1.1 christos #define FLD(f) abuf->fields.sfmt_ld_plus.f 1339 1.1 christos int UNUSED written = 0; 1340 1.1 christos IADDR UNUSED pc = abuf->addr; 1341 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2); 1342 1.1 christos 1343 1.1 christos { 1344 1.1 christos SI opval = ZEXTQISI (GETMEMQI (current_cpu, pc, * FLD (i_sr))); 1345 1.1 christos * FLD (i_dr) = opval; 1346 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 1347 1.1 christos } 1348 1.1 christos 1349 1.1 christos #undef FLD 1350 1.1 christos } 1351 1.1 christos NEXT (vpc); 1352 1.1 christos 1353 1.1 christos CASE (sem, INSN_LDUB_D) : /* ldub $dr,@($slo16,$sr) */ 1354 1.1 christos { 1355 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1356 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1357 1.1 christos #define FLD(f) abuf->fields.sfmt_add3.f 1358 1.1 christos int UNUSED written = 0; 1359 1.1 christos IADDR UNUSED pc = abuf->addr; 1360 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 1361 1.1 christos 1362 1.1 christos { 1363 1.1 christos SI opval = ZEXTQISI (GETMEMQI (current_cpu, pc, ADDSI (* FLD (i_sr), FLD (f_simm16)))); 1364 1.1 christos * FLD (i_dr) = opval; 1365 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 1366 1.1 christos } 1367 1.1 christos 1368 1.1 christos #undef FLD 1369 1.1 christos } 1370 1.1 christos NEXT (vpc); 1371 1.1 christos 1372 1.1 christos CASE (sem, INSN_LDUH) : /* lduh $dr,@$sr */ 1373 1.1 christos { 1374 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1375 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1376 1.1 christos #define FLD(f) abuf->fields.sfmt_ld_plus.f 1377 1.1 christos int UNUSED written = 0; 1378 1.1 christos IADDR UNUSED pc = abuf->addr; 1379 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2); 1380 1.1 christos 1381 1.1 christos { 1382 1.1 christos SI opval = ZEXTHISI (GETMEMHI (current_cpu, pc, * FLD (i_sr))); 1383 1.1 christos * FLD (i_dr) = opval; 1384 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 1385 1.1 christos } 1386 1.1 christos 1387 1.1 christos #undef FLD 1388 1.1 christos } 1389 1.1 christos NEXT (vpc); 1390 1.1 christos 1391 1.1 christos CASE (sem, INSN_LDUH_D) : /* lduh $dr,@($slo16,$sr) */ 1392 1.1 christos { 1393 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1394 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1395 1.1 christos #define FLD(f) abuf->fields.sfmt_add3.f 1396 1.1 christos int UNUSED written = 0; 1397 1.1 christos IADDR UNUSED pc = abuf->addr; 1398 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 1399 1.1 christos 1400 1.1 christos { 1401 1.1 christos SI opval = ZEXTHISI (GETMEMHI (current_cpu, pc, ADDSI (* FLD (i_sr), FLD (f_simm16)))); 1402 1.1 christos * FLD (i_dr) = opval; 1403 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 1404 1.1 christos } 1405 1.1 christos 1406 1.1 christos #undef FLD 1407 1.1 christos } 1408 1.1 christos NEXT (vpc); 1409 1.1 christos 1410 1.1 christos CASE (sem, INSN_LD_PLUS) : /* ld $dr,@$sr+ */ 1411 1.1 christos { 1412 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1413 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1414 1.1 christos #define FLD(f) abuf->fields.sfmt_ld_plus.f 1415 1.1 christos int UNUSED written = 0; 1416 1.1 christos IADDR UNUSED pc = abuf->addr; 1417 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2); 1418 1.1 christos 1419 1.1 christos { 1420 1.1 christos SI temp0;SI temp1; 1421 1.1 christos temp0 = GETMEMSI (current_cpu, pc, * FLD (i_sr)); 1422 1.1 christos temp1 = ADDSI (* FLD (i_sr), 4); 1423 1.1 christos { 1424 1.1 christos SI opval = temp0; 1425 1.1 christos * FLD (i_dr) = opval; 1426 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 1427 1.1 christos } 1428 1.1 christos { 1429 1.1 christos SI opval = temp1; 1430 1.1 christos * FLD (i_sr) = opval; 1431 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 1432 1.1 christos } 1433 1.1 christos } 1434 1.1 christos 1435 1.1 christos #undef FLD 1436 1.1 christos } 1437 1.1 christos NEXT (vpc); 1438 1.1 christos 1439 1.1 christos CASE (sem, INSN_LD24) : /* ld24 $dr,$uimm24 */ 1440 1.1 christos { 1441 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1442 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1443 1.1 christos #define FLD(f) abuf->fields.sfmt_ld24.f 1444 1.1 christos int UNUSED written = 0; 1445 1.1 christos IADDR UNUSED pc = abuf->addr; 1446 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 1447 1.1 christos 1448 1.1 christos { 1449 1.1 christos SI opval = FLD (i_uimm24); 1450 1.1 christos * FLD (i_dr) = opval; 1451 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 1452 1.1 christos } 1453 1.1 christos 1454 1.1 christos #undef FLD 1455 1.1 christos } 1456 1.1 christos NEXT (vpc); 1457 1.1 christos 1458 1.1 christos CASE (sem, INSN_LDI8) : /* ldi8 $dr,$simm8 */ 1459 1.1 christos { 1460 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1461 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1462 1.1 christos #define FLD(f) abuf->fields.sfmt_addi.f 1463 1.1 christos int UNUSED written = 0; 1464 1.1 christos IADDR UNUSED pc = abuf->addr; 1465 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2); 1466 1.1 christos 1467 1.1 christos { 1468 1.1 christos SI opval = FLD (f_simm8); 1469 1.1 christos * FLD (i_dr) = opval; 1470 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 1471 1.1 christos } 1472 1.1 christos 1473 1.1 christos #undef FLD 1474 1.1 christos } 1475 1.1 christos NEXT (vpc); 1476 1.1 christos 1477 1.1 christos CASE (sem, INSN_LDI16) : /* ldi16 $dr,$hash$slo16 */ 1478 1.1 christos { 1479 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1480 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1481 1.1 christos #define FLD(f) abuf->fields.sfmt_add3.f 1482 1.1 christos int UNUSED written = 0; 1483 1.1 christos IADDR UNUSED pc = abuf->addr; 1484 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 1485 1.1 christos 1486 1.1 christos { 1487 1.1 christos SI opval = FLD (f_simm16); 1488 1.1 christos * FLD (i_dr) = opval; 1489 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 1490 1.1 christos } 1491 1.1 christos 1492 1.1 christos #undef FLD 1493 1.1 christos } 1494 1.1 christos NEXT (vpc); 1495 1.1 christos 1496 1.1 christos CASE (sem, INSN_LOCK) : /* lock $dr,@$sr */ 1497 1.1 christos { 1498 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1499 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1500 1.1 christos #define FLD(f) abuf->fields.sfmt_ld_plus.f 1501 1.1 christos int UNUSED written = 0; 1502 1.1 christos IADDR UNUSED pc = abuf->addr; 1503 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2); 1504 1.1 christos 1505 1.1 christos { 1506 1.1 christos { 1507 1.1 christos BI opval = 1; 1508 1.1 christos CPU (h_lock) = opval; 1509 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "lock", 'x', opval); 1510 1.1 christos } 1511 1.1 christos { 1512 1.1 christos SI opval = GETMEMSI (current_cpu, pc, * FLD (i_sr)); 1513 1.1 christos * FLD (i_dr) = opval; 1514 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 1515 1.1 christos } 1516 1.1 christos } 1517 1.1 christos 1518 1.1 christos #undef FLD 1519 1.1 christos } 1520 1.1 christos NEXT (vpc); 1521 1.1 christos 1522 1.1 christos CASE (sem, INSN_MACHI) : /* machi $src1,$src2 */ 1523 1.1 christos { 1524 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1525 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1526 1.1 christos #define FLD(f) abuf->fields.sfmt_st_plus.f 1527 1.1 christos int UNUSED written = 0; 1528 1.1 christos IADDR UNUSED pc = abuf->addr; 1529 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2); 1530 1.1 christos 1531 1.1 christos { 1532 1.1 christos DI opval = SRADI (SLLDI (ADDDI (GET_H_ACCUM (), MULDI (EXTSIDI (ANDSI (* FLD (i_src1), 0xffff0000)), EXTHIDI (TRUNCSIHI (SRASI (* FLD (i_src2), 16))))), 8), 8); 1533 1.1 christos SET_H_ACCUM (opval); 1534 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "accum", 'D', opval); 1535 1.1 christos } 1536 1.1 christos 1537 1.1 christos #undef FLD 1538 1.1 christos } 1539 1.1 christos NEXT (vpc); 1540 1.1 christos 1541 1.1 christos CASE (sem, INSN_MACLO) : /* maclo $src1,$src2 */ 1542 1.1 christos { 1543 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1544 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1545 1.1 christos #define FLD(f) abuf->fields.sfmt_st_plus.f 1546 1.1 christos int UNUSED written = 0; 1547 1.1 christos IADDR UNUSED pc = abuf->addr; 1548 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2); 1549 1.1 christos 1550 1.1 christos { 1551 1.1 christos DI opval = SRADI (SLLDI (ADDDI (GET_H_ACCUM (), MULDI (EXTSIDI (SLLSI (* FLD (i_src1), 16)), EXTHIDI (TRUNCSIHI (* FLD (i_src2))))), 8), 8); 1552 1.1 christos SET_H_ACCUM (opval); 1553 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "accum", 'D', opval); 1554 1.1 christos } 1555 1.1 christos 1556 1.1 christos #undef FLD 1557 1.1 christos } 1558 1.1 christos NEXT (vpc); 1559 1.1 christos 1560 1.1 christos CASE (sem, INSN_MACWHI) : /* macwhi $src1,$src2 */ 1561 1.1 christos { 1562 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1563 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1564 1.1 christos #define FLD(f) abuf->fields.sfmt_st_plus.f 1565 1.1 christos int UNUSED written = 0; 1566 1.1 christos IADDR UNUSED pc = abuf->addr; 1567 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2); 1568 1.1 christos 1569 1.1 christos { 1570 1.1 christos DI opval = SRADI (SLLDI (ADDDI (GET_H_ACCUM (), MULDI (EXTSIDI (* FLD (i_src1)), EXTHIDI (TRUNCSIHI (SRASI (* FLD (i_src2), 16))))), 8), 8); 1571 1.1 christos SET_H_ACCUM (opval); 1572 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "accum", 'D', opval); 1573 1.1 christos } 1574 1.1 christos 1575 1.1 christos #undef FLD 1576 1.1 christos } 1577 1.1 christos NEXT (vpc); 1578 1.1 christos 1579 1.1 christos CASE (sem, INSN_MACWLO) : /* macwlo $src1,$src2 */ 1580 1.1 christos { 1581 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1582 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1583 1.1 christos #define FLD(f) abuf->fields.sfmt_st_plus.f 1584 1.1 christos int UNUSED written = 0; 1585 1.1 christos IADDR UNUSED pc = abuf->addr; 1586 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2); 1587 1.1 christos 1588 1.1 christos { 1589 1.1 christos DI opval = SRADI (SLLDI (ADDDI (GET_H_ACCUM (), MULDI (EXTSIDI (* FLD (i_src1)), EXTHIDI (TRUNCSIHI (* FLD (i_src2))))), 8), 8); 1590 1.1 christos SET_H_ACCUM (opval); 1591 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "accum", 'D', opval); 1592 1.1 christos } 1593 1.1 christos 1594 1.1 christos #undef FLD 1595 1.1 christos } 1596 1.1 christos NEXT (vpc); 1597 1.1 christos 1598 1.1 christos CASE (sem, INSN_MUL) : /* mul $dr,$sr */ 1599 1.1 christos { 1600 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1601 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1602 1.1 christos #define FLD(f) abuf->fields.sfmt_add.f 1603 1.1 christos int UNUSED written = 0; 1604 1.1 christos IADDR UNUSED pc = abuf->addr; 1605 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2); 1606 1.1 christos 1607 1.1 christos { 1608 1.1 christos SI opval = MULSI (* FLD (i_dr), * FLD (i_sr)); 1609 1.1 christos * FLD (i_dr) = opval; 1610 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 1611 1.1 christos } 1612 1.1 christos 1613 1.1 christos #undef FLD 1614 1.1 christos } 1615 1.1 christos NEXT (vpc); 1616 1.1 christos 1617 1.1 christos CASE (sem, INSN_MULHI) : /* mulhi $src1,$src2 */ 1618 1.1 christos { 1619 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1620 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1621 1.1 christos #define FLD(f) abuf->fields.sfmt_st_plus.f 1622 1.1 christos int UNUSED written = 0; 1623 1.1 christos IADDR UNUSED pc = abuf->addr; 1624 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2); 1625 1.1 christos 1626 1.1 christos { 1627 1.1 christos DI opval = SRADI (SLLDI (MULDI (EXTSIDI (ANDSI (* FLD (i_src1), 0xffff0000)), EXTHIDI (TRUNCSIHI (SRASI (* FLD (i_src2), 16)))), 16), 16); 1628 1.1 christos SET_H_ACCUM (opval); 1629 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "accum", 'D', opval); 1630 1.1 christos } 1631 1.1 christos 1632 1.1 christos #undef FLD 1633 1.1 christos } 1634 1.1 christos NEXT (vpc); 1635 1.1 christos 1636 1.1 christos CASE (sem, INSN_MULLO) : /* mullo $src1,$src2 */ 1637 1.1 christos { 1638 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1639 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1640 1.1 christos #define FLD(f) abuf->fields.sfmt_st_plus.f 1641 1.1 christos int UNUSED written = 0; 1642 1.1 christos IADDR UNUSED pc = abuf->addr; 1643 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2); 1644 1.1 christos 1645 1.1 christos { 1646 1.1 christos DI opval = SRADI (SLLDI (MULDI (EXTSIDI (SLLSI (* FLD (i_src1), 16)), EXTHIDI (TRUNCSIHI (* FLD (i_src2)))), 16), 16); 1647 1.1 christos SET_H_ACCUM (opval); 1648 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "accum", 'D', opval); 1649 1.1 christos } 1650 1.1 christos 1651 1.1 christos #undef FLD 1652 1.1 christos } 1653 1.1 christos NEXT (vpc); 1654 1.1 christos 1655 1.1 christos CASE (sem, INSN_MULWHI) : /* mulwhi $src1,$src2 */ 1656 1.1 christos { 1657 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1658 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1659 1.1 christos #define FLD(f) abuf->fields.sfmt_st_plus.f 1660 1.1 christos int UNUSED written = 0; 1661 1.1 christos IADDR UNUSED pc = abuf->addr; 1662 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2); 1663 1.1 christos 1664 1.1 christos { 1665 1.1 christos DI opval = SRADI (SLLDI (MULDI (EXTSIDI (* FLD (i_src1)), EXTHIDI (TRUNCSIHI (SRASI (* FLD (i_src2), 16)))), 8), 8); 1666 1.1 christos SET_H_ACCUM (opval); 1667 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "accum", 'D', opval); 1668 1.1 christos } 1669 1.1 christos 1670 1.1 christos #undef FLD 1671 1.1 christos } 1672 1.1 christos NEXT (vpc); 1673 1.1 christos 1674 1.1 christos CASE (sem, INSN_MULWLO) : /* mulwlo $src1,$src2 */ 1675 1.1 christos { 1676 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1677 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1678 1.1 christos #define FLD(f) abuf->fields.sfmt_st_plus.f 1679 1.1 christos int UNUSED written = 0; 1680 1.1 christos IADDR UNUSED pc = abuf->addr; 1681 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2); 1682 1.1 christos 1683 1.1 christos { 1684 1.1 christos DI opval = SRADI (SLLDI (MULDI (EXTSIDI (* FLD (i_src1)), EXTHIDI (TRUNCSIHI (* FLD (i_src2)))), 8), 8); 1685 1.1 christos SET_H_ACCUM (opval); 1686 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "accum", 'D', opval); 1687 1.1 christos } 1688 1.1 christos 1689 1.1 christos #undef FLD 1690 1.1 christos } 1691 1.1 christos NEXT (vpc); 1692 1.1 christos 1693 1.1 christos CASE (sem, INSN_MV) : /* mv $dr,$sr */ 1694 1.1 christos { 1695 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1696 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1697 1.1 christos #define FLD(f) abuf->fields.sfmt_ld_plus.f 1698 1.1 christos int UNUSED written = 0; 1699 1.1 christos IADDR UNUSED pc = abuf->addr; 1700 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2); 1701 1.1 christos 1702 1.1 christos { 1703 1.1 christos SI opval = * FLD (i_sr); 1704 1.1 christos * FLD (i_dr) = opval; 1705 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 1706 1.1 christos } 1707 1.1 christos 1708 1.1 christos #undef FLD 1709 1.1 christos } 1710 1.1 christos NEXT (vpc); 1711 1.1 christos 1712 1.1 christos CASE (sem, INSN_MVFACHI) : /* mvfachi $dr */ 1713 1.1 christos { 1714 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1715 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1716 1.1 christos #define FLD(f) abuf->fields.sfmt_seth.f 1717 1.1 christos int UNUSED written = 0; 1718 1.1 christos IADDR UNUSED pc = abuf->addr; 1719 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2); 1720 1.1 christos 1721 1.1 christos { 1722 1.1 christos SI opval = TRUNCDISI (SRADI (GET_H_ACCUM (), 32)); 1723 1.1 christos * FLD (i_dr) = opval; 1724 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 1725 1.1 christos } 1726 1.1 christos 1727 1.1 christos #undef FLD 1728 1.1 christos } 1729 1.1 christos NEXT (vpc); 1730 1.1 christos 1731 1.1 christos CASE (sem, INSN_MVFACLO) : /* mvfaclo $dr */ 1732 1.1 christos { 1733 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1734 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1735 1.1 christos #define FLD(f) abuf->fields.sfmt_seth.f 1736 1.1 christos int UNUSED written = 0; 1737 1.1 christos IADDR UNUSED pc = abuf->addr; 1738 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2); 1739 1.1 christos 1740 1.1 christos { 1741 1.1 christos SI opval = TRUNCDISI (GET_H_ACCUM ()); 1742 1.1 christos * FLD (i_dr) = opval; 1743 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 1744 1.1 christos } 1745 1.1 christos 1746 1.1 christos #undef FLD 1747 1.1 christos } 1748 1.1 christos NEXT (vpc); 1749 1.1 christos 1750 1.1 christos CASE (sem, INSN_MVFACMI) : /* mvfacmi $dr */ 1751 1.1 christos { 1752 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1753 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1754 1.1 christos #define FLD(f) abuf->fields.sfmt_seth.f 1755 1.1 christos int UNUSED written = 0; 1756 1.1 christos IADDR UNUSED pc = abuf->addr; 1757 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2); 1758 1.1 christos 1759 1.1 christos { 1760 1.1 christos SI opval = TRUNCDISI (SRADI (GET_H_ACCUM (), 16)); 1761 1.1 christos * FLD (i_dr) = opval; 1762 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 1763 1.1 christos } 1764 1.1 christos 1765 1.1 christos #undef FLD 1766 1.1 christos } 1767 1.1 christos NEXT (vpc); 1768 1.1 christos 1769 1.1 christos CASE (sem, INSN_MVFC) : /* mvfc $dr,$scr */ 1770 1.1 christos { 1771 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1772 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1773 1.1 christos #define FLD(f) abuf->fields.sfmt_ld_plus.f 1774 1.1 christos int UNUSED written = 0; 1775 1.1 christos IADDR UNUSED pc = abuf->addr; 1776 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2); 1777 1.1 christos 1778 1.1 christos { 1779 1.1 christos SI opval = GET_H_CR (FLD (f_r2)); 1780 1.1 christos * FLD (i_dr) = opval; 1781 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 1782 1.1 christos } 1783 1.1 christos 1784 1.1 christos #undef FLD 1785 1.1 christos } 1786 1.1 christos NEXT (vpc); 1787 1.1 christos 1788 1.1 christos CASE (sem, INSN_MVTACHI) : /* mvtachi $src1 */ 1789 1.1 christos { 1790 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1791 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1792 1.1 christos #define FLD(f) abuf->fields.sfmt_st_plus.f 1793 1.1 christos int UNUSED written = 0; 1794 1.1 christos IADDR UNUSED pc = abuf->addr; 1795 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2); 1796 1.1 christos 1797 1.1 christos { 1798 1.1 christos DI opval = ORDI (ANDDI (GET_H_ACCUM (), MAKEDI (0, 0xffffffff)), SLLDI (EXTSIDI (* FLD (i_src1)), 32)); 1799 1.1 christos SET_H_ACCUM (opval); 1800 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "accum", 'D', opval); 1801 1.1 christos } 1802 1.1 christos 1803 1.1 christos #undef FLD 1804 1.1 christos } 1805 1.1 christos NEXT (vpc); 1806 1.1 christos 1807 1.1 christos CASE (sem, INSN_MVTACLO) : /* mvtaclo $src1 */ 1808 1.1 christos { 1809 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1810 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1811 1.1 christos #define FLD(f) abuf->fields.sfmt_st_plus.f 1812 1.1 christos int UNUSED written = 0; 1813 1.1 christos IADDR UNUSED pc = abuf->addr; 1814 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2); 1815 1.1 christos 1816 1.1 christos { 1817 1.1 christos DI opval = ORDI (ANDDI (GET_H_ACCUM (), MAKEDI (0xffffffff, 0)), ZEXTSIDI (* FLD (i_src1))); 1818 1.1 christos SET_H_ACCUM (opval); 1819 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "accum", 'D', opval); 1820 1.1 christos } 1821 1.1 christos 1822 1.1 christos #undef FLD 1823 1.1 christos } 1824 1.1 christos NEXT (vpc); 1825 1.1 christos 1826 1.1 christos CASE (sem, INSN_MVTC) : /* mvtc $sr,$dcr */ 1827 1.1 christos { 1828 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1829 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1830 1.1 christos #define FLD(f) abuf->fields.sfmt_ld_plus.f 1831 1.1 christos int UNUSED written = 0; 1832 1.1 christos IADDR UNUSED pc = abuf->addr; 1833 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2); 1834 1.1 christos 1835 1.1 christos { 1836 1.1 christos USI opval = * FLD (i_sr); 1837 1.1 christos SET_H_CR (FLD (f_r1), opval); 1838 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "cr", 'x', opval); 1839 1.1 christos } 1840 1.1 christos 1841 1.1 christos #undef FLD 1842 1.1 christos } 1843 1.1 christos NEXT (vpc); 1844 1.1 christos 1845 1.1 christos CASE (sem, INSN_NEG) : /* neg $dr,$sr */ 1846 1.1 christos { 1847 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1848 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1849 1.1 christos #define FLD(f) abuf->fields.sfmt_ld_plus.f 1850 1.1 christos int UNUSED written = 0; 1851 1.1 christos IADDR UNUSED pc = abuf->addr; 1852 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2); 1853 1.1 christos 1854 1.1 christos { 1855 1.1 christos SI opval = NEGSI (* FLD (i_sr)); 1856 1.1 christos * FLD (i_dr) = opval; 1857 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 1858 1.1 christos } 1859 1.1 christos 1860 1.1 christos #undef FLD 1861 1.1 christos } 1862 1.1 christos NEXT (vpc); 1863 1.1 christos 1864 1.1 christos CASE (sem, INSN_NOP) : /* nop */ 1865 1.1 christos { 1866 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1867 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1868 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f 1869 1.1 christos int UNUSED written = 0; 1870 1.1 christos IADDR UNUSED pc = abuf->addr; 1871 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2); 1872 1.1 christos 1873 1.1 christos PROFILE_COUNT_FILLNOPS (current_cpu, abuf->addr); 1874 1.1 christos 1875 1.1 christos #undef FLD 1876 1.1 christos } 1877 1.1 christos NEXT (vpc); 1878 1.1 christos 1879 1.1 christos CASE (sem, INSN_NOT) : /* not $dr,$sr */ 1880 1.1 christos { 1881 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1882 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1883 1.1 christos #define FLD(f) abuf->fields.sfmt_ld_plus.f 1884 1.1 christos int UNUSED written = 0; 1885 1.1 christos IADDR UNUSED pc = abuf->addr; 1886 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2); 1887 1.1 christos 1888 1.1 christos { 1889 1.1 christos SI opval = INVSI (* FLD (i_sr)); 1890 1.1 christos * FLD (i_dr) = opval; 1891 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 1892 1.1 christos } 1893 1.1 christos 1894 1.1 christos #undef FLD 1895 1.1 christos } 1896 1.1 christos NEXT (vpc); 1897 1.1 christos 1898 1.1 christos CASE (sem, INSN_RAC) : /* rac */ 1899 1.1 christos { 1900 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1901 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1902 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f 1903 1.1 christos int UNUSED written = 0; 1904 1.1 christos IADDR UNUSED pc = abuf->addr; 1905 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2); 1906 1.1 christos 1907 1.1 christos { 1908 1.1 christos DI tmp_tmp1; 1909 1.1 christos tmp_tmp1 = SLLDI (GET_H_ACCUM (), 1); 1910 1.1 christos tmp_tmp1 = ADDDI (tmp_tmp1, MAKEDI (0, 32768)); 1911 1.1 christos { 1912 1.1 christos DI opval = (GTDI (tmp_tmp1, MAKEDI (32767, 0xffff0000))) ? (MAKEDI (32767, 0xffff0000)) : (LTDI (tmp_tmp1, MAKEDI (0xffff8000, 0))) ? (MAKEDI (0xffff8000, 0)) : (ANDDI (tmp_tmp1, MAKEDI (0xffffffff, 0xffff0000))); 1913 1.1 christos SET_H_ACCUM (opval); 1914 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "accum", 'D', opval); 1915 1.1 christos } 1916 1.1 christos } 1917 1.1 christos 1918 1.1 christos #undef FLD 1919 1.1 christos } 1920 1.1 christos NEXT (vpc); 1921 1.1 christos 1922 1.1 christos CASE (sem, INSN_RACH) : /* rach */ 1923 1.1 christos { 1924 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1925 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1926 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f 1927 1.1 christos int UNUSED written = 0; 1928 1.1 christos IADDR UNUSED pc = abuf->addr; 1929 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2); 1930 1.1 christos 1931 1.1 christos { 1932 1.1 christos DI tmp_tmp1; 1933 1.1 christos tmp_tmp1 = ANDDI (GET_H_ACCUM (), MAKEDI (16777215, 0xffffffff)); 1934 1.1 christos if (ANDIF (GEDI (tmp_tmp1, MAKEDI (16383, 0x80000000)), LEDI (tmp_tmp1, MAKEDI (8388607, 0xffffffff)))) { 1935 1.1 christos tmp_tmp1 = MAKEDI (16383, 0x80000000); 1936 1.1 christos } else { 1937 1.1 christos if (ANDIF (GEDI (tmp_tmp1, MAKEDI (8388608, 0)), LEDI (tmp_tmp1, MAKEDI (16760832, 0)))) { 1938 1.1 christos tmp_tmp1 = MAKEDI (16760832, 0); 1939 1.1 christos } else { 1940 1.1 christos tmp_tmp1 = ANDDI (ADDDI (GET_H_ACCUM (), MAKEDI (0, 1073741824)), MAKEDI (0xffffffff, 0x80000000)); 1941 1.1 christos } 1942 1.1 christos } 1943 1.1 christos tmp_tmp1 = SLLDI (tmp_tmp1, 1); 1944 1.1 christos { 1945 1.1 christos DI opval = SRADI (SLLDI (tmp_tmp1, 7), 7); 1946 1.1 christos SET_H_ACCUM (opval); 1947 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "accum", 'D', opval); 1948 1.1 christos } 1949 1.1 christos } 1950 1.1 christos 1951 1.1 christos #undef FLD 1952 1.1 christos } 1953 1.1 christos NEXT (vpc); 1954 1.1 christos 1955 1.1 christos CASE (sem, INSN_RTE) : /* rte */ 1956 1.1 christos { 1957 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1958 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1959 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f 1960 1.1 christos int UNUSED written = 0; 1961 1.1 christos IADDR UNUSED pc = abuf->addr; 1962 1.1 christos SEM_BRANCH_INIT 1963 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2); 1964 1.1 christos 1965 1.1 christos { 1966 1.1 christos { 1967 1.1 christos USI opval = ANDSI (GET_H_CR (((UINT) 6)), -4); 1968 1.1 christos SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc); 1969 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval); 1970 1.1 christos } 1971 1.1 christos { 1972 1.1 christos USI opval = GET_H_CR (((UINT) 14)); 1973 1.1 christos SET_H_CR (((UINT) 6), opval); 1974 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "cr", 'x', opval); 1975 1.1 christos } 1976 1.1 christos { 1977 1.1 christos UQI opval = CPU (h_bpsw); 1978 1.1 christos SET_H_PSW (opval); 1979 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "psw", 'x', opval); 1980 1.1 christos } 1981 1.1 christos { 1982 1.1 christos UQI opval = CPU (h_bbpsw); 1983 1.1 christos CPU (h_bpsw) = opval; 1984 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "bpsw", 'x', opval); 1985 1.1 christos } 1986 1.1 christos } 1987 1.1 christos 1988 1.1 christos SEM_BRANCH_FINI (vpc); 1989 1.1 christos #undef FLD 1990 1.1 christos } 1991 1.1 christos NEXT (vpc); 1992 1.1 christos 1993 1.1 christos CASE (sem, INSN_SETH) : /* seth $dr,$hash$hi16 */ 1994 1.1 christos { 1995 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1996 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1997 1.1 christos #define FLD(f) abuf->fields.sfmt_seth.f 1998 1.1 christos int UNUSED written = 0; 1999 1.1 christos IADDR UNUSED pc = abuf->addr; 2000 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2001 1.1 christos 2002 1.1 christos { 2003 1.1 christos SI opval = SLLSI (FLD (f_hi16), 16); 2004 1.1 christos * FLD (i_dr) = opval; 2005 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 2006 1.1 christos } 2007 1.1 christos 2008 1.1 christos #undef FLD 2009 1.1 christos } 2010 1.1 christos NEXT (vpc); 2011 1.1 christos 2012 1.1 christos CASE (sem, INSN_SLL) : /* sll $dr,$sr */ 2013 1.1 christos { 2014 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2015 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2016 1.1 christos #define FLD(f) abuf->fields.sfmt_add.f 2017 1.1 christos int UNUSED written = 0; 2018 1.1 christos IADDR UNUSED pc = abuf->addr; 2019 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2); 2020 1.1 christos 2021 1.1 christos { 2022 1.1 christos SI opval = SLLSI (* FLD (i_dr), ANDSI (* FLD (i_sr), 31)); 2023 1.1 christos * FLD (i_dr) = opval; 2024 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 2025 1.1 christos } 2026 1.1 christos 2027 1.1 christos #undef FLD 2028 1.1 christos } 2029 1.1 christos NEXT (vpc); 2030 1.1 christos 2031 1.1 christos CASE (sem, INSN_SLL3) : /* sll3 $dr,$sr,$simm16 */ 2032 1.1 christos { 2033 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2034 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2035 1.1 christos #define FLD(f) abuf->fields.sfmt_add3.f 2036 1.1 christos int UNUSED written = 0; 2037 1.1 christos IADDR UNUSED pc = abuf->addr; 2038 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2039 1.1 christos 2040 1.1 christos { 2041 1.1 christos SI opval = SLLSI (* FLD (i_sr), ANDSI (FLD (f_simm16), 31)); 2042 1.1 christos * FLD (i_dr) = opval; 2043 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 2044 1.1 christos } 2045 1.1 christos 2046 1.1 christos #undef FLD 2047 1.1 christos } 2048 1.1 christos NEXT (vpc); 2049 1.1 christos 2050 1.1 christos CASE (sem, INSN_SLLI) : /* slli $dr,$uimm5 */ 2051 1.1 christos { 2052 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2053 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2054 1.1 christos #define FLD(f) abuf->fields.sfmt_slli.f 2055 1.1 christos int UNUSED written = 0; 2056 1.1 christos IADDR UNUSED pc = abuf->addr; 2057 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2); 2058 1.1 christos 2059 1.1 christos { 2060 1.1 christos SI opval = SLLSI (* FLD (i_dr), FLD (f_uimm5)); 2061 1.1 christos * FLD (i_dr) = opval; 2062 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 2063 1.1 christos } 2064 1.1 christos 2065 1.1 christos #undef FLD 2066 1.1 christos } 2067 1.1 christos NEXT (vpc); 2068 1.1 christos 2069 1.1 christos CASE (sem, INSN_SRA) : /* sra $dr,$sr */ 2070 1.1 christos { 2071 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2072 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2073 1.1 christos #define FLD(f) abuf->fields.sfmt_add.f 2074 1.1 christos int UNUSED written = 0; 2075 1.1 christos IADDR UNUSED pc = abuf->addr; 2076 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2); 2077 1.1 christos 2078 1.1 christos { 2079 1.1 christos SI opval = SRASI (* FLD (i_dr), ANDSI (* FLD (i_sr), 31)); 2080 1.1 christos * FLD (i_dr) = opval; 2081 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 2082 1.1 christos } 2083 1.1 christos 2084 1.1 christos #undef FLD 2085 1.1 christos } 2086 1.1 christos NEXT (vpc); 2087 1.1 christos 2088 1.1 christos CASE (sem, INSN_SRA3) : /* sra3 $dr,$sr,$simm16 */ 2089 1.1 christos { 2090 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2091 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2092 1.1 christos #define FLD(f) abuf->fields.sfmt_add3.f 2093 1.1 christos int UNUSED written = 0; 2094 1.1 christos IADDR UNUSED pc = abuf->addr; 2095 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2096 1.1 christos 2097 1.1 christos { 2098 1.1 christos SI opval = SRASI (* FLD (i_sr), ANDSI (FLD (f_simm16), 31)); 2099 1.1 christos * FLD (i_dr) = opval; 2100 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 2101 1.1 christos } 2102 1.1 christos 2103 1.1 christos #undef FLD 2104 1.1 christos } 2105 1.1 christos NEXT (vpc); 2106 1.1 christos 2107 1.1 christos CASE (sem, INSN_SRAI) : /* srai $dr,$uimm5 */ 2108 1.1 christos { 2109 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2110 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2111 1.1 christos #define FLD(f) abuf->fields.sfmt_slli.f 2112 1.1 christos int UNUSED written = 0; 2113 1.1 christos IADDR UNUSED pc = abuf->addr; 2114 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2); 2115 1.1 christos 2116 1.1 christos { 2117 1.1 christos SI opval = SRASI (* FLD (i_dr), FLD (f_uimm5)); 2118 1.1 christos * FLD (i_dr) = opval; 2119 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 2120 1.1 christos } 2121 1.1 christos 2122 1.1 christos #undef FLD 2123 1.1 christos } 2124 1.1 christos NEXT (vpc); 2125 1.1 christos 2126 1.1 christos CASE (sem, INSN_SRL) : /* srl $dr,$sr */ 2127 1.1 christos { 2128 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2129 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2130 1.1 christos #define FLD(f) abuf->fields.sfmt_add.f 2131 1.1 christos int UNUSED written = 0; 2132 1.1 christos IADDR UNUSED pc = abuf->addr; 2133 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2); 2134 1.1 christos 2135 1.1 christos { 2136 1.1 christos SI opval = SRLSI (* FLD (i_dr), ANDSI (* FLD (i_sr), 31)); 2137 1.1 christos * FLD (i_dr) = opval; 2138 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 2139 1.1 christos } 2140 1.1 christos 2141 1.1 christos #undef FLD 2142 1.1 christos } 2143 1.1 christos NEXT (vpc); 2144 1.1 christos 2145 1.1 christos CASE (sem, INSN_SRL3) : /* srl3 $dr,$sr,$simm16 */ 2146 1.1 christos { 2147 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2148 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2149 1.1 christos #define FLD(f) abuf->fields.sfmt_add3.f 2150 1.1 christos int UNUSED written = 0; 2151 1.1 christos IADDR UNUSED pc = abuf->addr; 2152 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2153 1.1 christos 2154 1.1 christos { 2155 1.1 christos SI opval = SRLSI (* FLD (i_sr), ANDSI (FLD (f_simm16), 31)); 2156 1.1 christos * FLD (i_dr) = opval; 2157 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 2158 1.1 christos } 2159 1.1 christos 2160 1.1 christos #undef FLD 2161 1.1 christos } 2162 1.1 christos NEXT (vpc); 2163 1.1 christos 2164 1.1 christos CASE (sem, INSN_SRLI) : /* srli $dr,$uimm5 */ 2165 1.1 christos { 2166 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2167 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2168 1.1 christos #define FLD(f) abuf->fields.sfmt_slli.f 2169 1.1 christos int UNUSED written = 0; 2170 1.1 christos IADDR UNUSED pc = abuf->addr; 2171 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2); 2172 1.1 christos 2173 1.1 christos { 2174 1.1 christos SI opval = SRLSI (* FLD (i_dr), FLD (f_uimm5)); 2175 1.1 christos * FLD (i_dr) = opval; 2176 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 2177 1.1 christos } 2178 1.1 christos 2179 1.1 christos #undef FLD 2180 1.1 christos } 2181 1.1 christos NEXT (vpc); 2182 1.1 christos 2183 1.1 christos CASE (sem, INSN_ST) : /* st $src1,@$src2 */ 2184 1.1 christos { 2185 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2186 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2187 1.1 christos #define FLD(f) abuf->fields.sfmt_st_plus.f 2188 1.1 christos int UNUSED written = 0; 2189 1.1 christos IADDR UNUSED pc = abuf->addr; 2190 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2); 2191 1.1 christos 2192 1.1 christos { 2193 1.1 christos SI opval = * FLD (i_src1); 2194 1.1 christos SETMEMSI (current_cpu, pc, * FLD (i_src2), opval); 2195 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval); 2196 1.1 christos } 2197 1.1 christos 2198 1.1 christos #undef FLD 2199 1.1 christos } 2200 1.1 christos NEXT (vpc); 2201 1.1 christos 2202 1.1 christos CASE (sem, INSN_ST_D) : /* st $src1,@($slo16,$src2) */ 2203 1.1 christos { 2204 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2205 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2206 1.1 christos #define FLD(f) abuf->fields.sfmt_st_d.f 2207 1.1 christos int UNUSED written = 0; 2208 1.1 christos IADDR UNUSED pc = abuf->addr; 2209 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2210 1.1 christos 2211 1.1 christos { 2212 1.1 christos SI opval = * FLD (i_src1); 2213 1.1 christos SETMEMSI (current_cpu, pc, ADDSI (* FLD (i_src2), FLD (f_simm16)), opval); 2214 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval); 2215 1.1 christos } 2216 1.1 christos 2217 1.1 christos #undef FLD 2218 1.1 christos } 2219 1.1 christos NEXT (vpc); 2220 1.1 christos 2221 1.1 christos CASE (sem, INSN_STB) : /* stb $src1,@$src2 */ 2222 1.1 christos { 2223 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2224 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2225 1.1 christos #define FLD(f) abuf->fields.sfmt_st_plus.f 2226 1.1 christos int UNUSED written = 0; 2227 1.1 christos IADDR UNUSED pc = abuf->addr; 2228 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2); 2229 1.1 christos 2230 1.1 christos { 2231 1.1 christos QI opval = * FLD (i_src1); 2232 1.1 christos SETMEMQI (current_cpu, pc, * FLD (i_src2), opval); 2233 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval); 2234 1.1 christos } 2235 1.1 christos 2236 1.1 christos #undef FLD 2237 1.1 christos } 2238 1.1 christos NEXT (vpc); 2239 1.1 christos 2240 1.1 christos CASE (sem, INSN_STB_D) : /* stb $src1,@($slo16,$src2) */ 2241 1.1 christos { 2242 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2243 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2244 1.1 christos #define FLD(f) abuf->fields.sfmt_st_d.f 2245 1.1 christos int UNUSED written = 0; 2246 1.1 christos IADDR UNUSED pc = abuf->addr; 2247 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2248 1.1 christos 2249 1.1 christos { 2250 1.1 christos QI opval = * FLD (i_src1); 2251 1.1 christos SETMEMQI (current_cpu, pc, ADDSI (* FLD (i_src2), FLD (f_simm16)), opval); 2252 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval); 2253 1.1 christos } 2254 1.1 christos 2255 1.1 christos #undef FLD 2256 1.1 christos } 2257 1.1 christos NEXT (vpc); 2258 1.1 christos 2259 1.1 christos CASE (sem, INSN_STH) : /* sth $src1,@$src2 */ 2260 1.1 christos { 2261 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2262 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2263 1.1 christos #define FLD(f) abuf->fields.sfmt_st_plus.f 2264 1.1 christos int UNUSED written = 0; 2265 1.1 christos IADDR UNUSED pc = abuf->addr; 2266 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2); 2267 1.1 christos 2268 1.1 christos { 2269 1.1 christos HI opval = * FLD (i_src1); 2270 1.1 christos SETMEMHI (current_cpu, pc, * FLD (i_src2), opval); 2271 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval); 2272 1.1 christos } 2273 1.1 christos 2274 1.1 christos #undef FLD 2275 1.1 christos } 2276 1.1 christos NEXT (vpc); 2277 1.1 christos 2278 1.1 christos CASE (sem, INSN_STH_D) : /* sth $src1,@($slo16,$src2) */ 2279 1.1 christos { 2280 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2281 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2282 1.1 christos #define FLD(f) abuf->fields.sfmt_st_d.f 2283 1.1 christos int UNUSED written = 0; 2284 1.1 christos IADDR UNUSED pc = abuf->addr; 2285 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2286 1.1 christos 2287 1.1 christos { 2288 1.1 christos HI opval = * FLD (i_src1); 2289 1.1 christos SETMEMHI (current_cpu, pc, ADDSI (* FLD (i_src2), FLD (f_simm16)), opval); 2290 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval); 2291 1.1 christos } 2292 1.1 christos 2293 1.1 christos #undef FLD 2294 1.1 christos } 2295 1.1 christos NEXT (vpc); 2296 1.1 christos 2297 1.1 christos CASE (sem, INSN_ST_PLUS) : /* st $src1,@+$src2 */ 2298 1.1 christos { 2299 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2300 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2301 1.1 christos #define FLD(f) abuf->fields.sfmt_st_plus.f 2302 1.1 christos int UNUSED written = 0; 2303 1.1 christos IADDR UNUSED pc = abuf->addr; 2304 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2); 2305 1.1 christos 2306 1.1 christos { 2307 1.1 christos SI tmp_new_src2; 2308 1.1 christos tmp_new_src2 = ADDSI (* FLD (i_src2), 4); 2309 1.1 christos { 2310 1.1 christos SI opval = * FLD (i_src1); 2311 1.1 christos SETMEMSI (current_cpu, pc, tmp_new_src2, opval); 2312 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval); 2313 1.1 christos } 2314 1.1 christos { 2315 1.1 christos SI opval = tmp_new_src2; 2316 1.1 christos * FLD (i_src2) = opval; 2317 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 2318 1.1 christos } 2319 1.1 christos } 2320 1.1 christos 2321 1.1 christos #undef FLD 2322 1.1 christos } 2323 1.1 christos NEXT (vpc); 2324 1.1 christos 2325 1.1 christos CASE (sem, INSN_ST_MINUS) : /* st $src1,@-$src2 */ 2326 1.1 christos { 2327 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2328 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2329 1.1 christos #define FLD(f) abuf->fields.sfmt_st_plus.f 2330 1.1 christos int UNUSED written = 0; 2331 1.1 christos IADDR UNUSED pc = abuf->addr; 2332 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2); 2333 1.1 christos 2334 1.1 christos { 2335 1.1 christos SI tmp_new_src2; 2336 1.1 christos tmp_new_src2 = SUBSI (* FLD (i_src2), 4); 2337 1.1 christos { 2338 1.1 christos SI opval = * FLD (i_src1); 2339 1.1 christos SETMEMSI (current_cpu, pc, tmp_new_src2, opval); 2340 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval); 2341 1.1 christos } 2342 1.1 christos { 2343 1.1 christos SI opval = tmp_new_src2; 2344 1.1 christos * FLD (i_src2) = opval; 2345 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 2346 1.1 christos } 2347 1.1 christos } 2348 1.1 christos 2349 1.1 christos #undef FLD 2350 1.1 christos } 2351 1.1 christos NEXT (vpc); 2352 1.1 christos 2353 1.1 christos CASE (sem, INSN_SUB) : /* sub $dr,$sr */ 2354 1.1 christos { 2355 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2356 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2357 1.1 christos #define FLD(f) abuf->fields.sfmt_add.f 2358 1.1 christos int UNUSED written = 0; 2359 1.1 christos IADDR UNUSED pc = abuf->addr; 2360 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2); 2361 1.1 christos 2362 1.1 christos { 2363 1.1 christos SI opval = SUBSI (* FLD (i_dr), * FLD (i_sr)); 2364 1.1 christos * FLD (i_dr) = opval; 2365 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 2366 1.1 christos } 2367 1.1 christos 2368 1.1 christos #undef FLD 2369 1.1 christos } 2370 1.1 christos NEXT (vpc); 2371 1.1 christos 2372 1.1 christos CASE (sem, INSN_SUBV) : /* subv $dr,$sr */ 2373 1.1 christos { 2374 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2375 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2376 1.1 christos #define FLD(f) abuf->fields.sfmt_add.f 2377 1.1 christos int UNUSED written = 0; 2378 1.1 christos IADDR UNUSED pc = abuf->addr; 2379 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2); 2380 1.1 christos 2381 1.1 christos { 2382 1.1 christos SI temp0;BI temp1; 2383 1.1 christos temp0 = SUBSI (* FLD (i_dr), * FLD (i_sr)); 2384 1.1 christos temp1 = SUBOFSI (* FLD (i_dr), * FLD (i_sr), 0); 2385 1.1 christos { 2386 1.1 christos SI opval = temp0; 2387 1.1 christos * FLD (i_dr) = opval; 2388 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 2389 1.1 christos } 2390 1.1 christos { 2391 1.1 christos BI opval = temp1; 2392 1.1 christos CPU (h_cond) = opval; 2393 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval); 2394 1.1 christos } 2395 1.1 christos } 2396 1.1 christos 2397 1.1 christos #undef FLD 2398 1.1 christos } 2399 1.1 christos NEXT (vpc); 2400 1.1 christos 2401 1.1 christos CASE (sem, INSN_SUBX) : /* subx $dr,$sr */ 2402 1.1 christos { 2403 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2404 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2405 1.1 christos #define FLD(f) abuf->fields.sfmt_add.f 2406 1.1 christos int UNUSED written = 0; 2407 1.1 christos IADDR UNUSED pc = abuf->addr; 2408 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2); 2409 1.1 christos 2410 1.1 christos { 2411 1.1 christos SI temp0;BI temp1; 2412 1.1 christos temp0 = SUBCSI (* FLD (i_dr), * FLD (i_sr), CPU (h_cond)); 2413 1.1 christos temp1 = SUBCFSI (* FLD (i_dr), * FLD (i_sr), CPU (h_cond)); 2414 1.1 christos { 2415 1.1 christos SI opval = temp0; 2416 1.1 christos * FLD (i_dr) = opval; 2417 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval); 2418 1.1 christos } 2419 1.1 christos { 2420 1.1 christos BI opval = temp1; 2421 1.1 christos CPU (h_cond) = opval; 2422 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval); 2423 1.1 christos } 2424 1.1 christos } 2425 1.1 christos 2426 1.1 christos #undef FLD 2427 1.1 christos } 2428 1.1 christos NEXT (vpc); 2429 1.1 christos 2430 1.1 christos CASE (sem, INSN_TRAP) : /* trap $uimm4 */ 2431 1.1 christos { 2432 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2433 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2434 1.1 christos #define FLD(f) abuf->fields.sfmt_trap.f 2435 1.1 christos int UNUSED written = 0; 2436 1.1 christos IADDR UNUSED pc = abuf->addr; 2437 1.1 christos SEM_BRANCH_INIT 2438 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2); 2439 1.1 christos 2440 1.1 christos { 2441 1.1 christos { 2442 1.1 christos USI opval = GET_H_CR (((UINT) 6)); 2443 1.1 christos SET_H_CR (((UINT) 14), opval); 2444 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "cr", 'x', opval); 2445 1.1 christos } 2446 1.1 christos { 2447 1.1 christos USI opval = ADDSI (pc, 4); 2448 1.1 christos SET_H_CR (((UINT) 6), opval); 2449 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "cr", 'x', opval); 2450 1.1 christos } 2451 1.1 christos { 2452 1.1 christos UQI opval = CPU (h_bpsw); 2453 1.1 christos CPU (h_bbpsw) = opval; 2454 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "bbpsw", 'x', opval); 2455 1.1 christos } 2456 1.1 christos { 2457 1.1 christos UQI opval = GET_H_PSW (); 2458 1.1 christos CPU (h_bpsw) = opval; 2459 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "bpsw", 'x', opval); 2460 1.1 christos } 2461 1.1 christos { 2462 1.1 christos UQI opval = ANDQI (GET_H_PSW (), 128); 2463 1.1 christos SET_H_PSW (opval); 2464 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "psw", 'x', opval); 2465 1.1 christos } 2466 1.1 christos { 2467 1.1 christos SI opval = m32r_trap (current_cpu, pc, FLD (f_uimm4)); 2468 1.1 christos SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc); 2469 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval); 2470 1.1 christos } 2471 1.1 christos } 2472 1.1 christos 2473 1.1 christos SEM_BRANCH_FINI (vpc); 2474 1.1 christos #undef FLD 2475 1.1 christos } 2476 1.1 christos NEXT (vpc); 2477 1.1 christos 2478 1.1 christos CASE (sem, INSN_UNLOCK) : /* unlock $src1,@$src2 */ 2479 1.1 christos { 2480 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2481 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2482 1.1 christos #define FLD(f) abuf->fields.sfmt_st_plus.f 2483 1.1 christos int UNUSED written = 0; 2484 1.1 christos IADDR UNUSED pc = abuf->addr; 2485 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2); 2486 1.1 christos 2487 1.1 christos { 2488 1.1 christos if (CPU (h_lock)) { 2489 1.1 christos { 2490 1.1 christos SI opval = * FLD (i_src1); 2491 1.1 christos SETMEMSI (current_cpu, pc, * FLD (i_src2), opval); 2492 1.1 christos written |= (1 << 4); 2493 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval); 2494 1.1 christos } 2495 1.1 christos } 2496 1.1 christos { 2497 1.1 christos BI opval = 0; 2498 1.1 christos CPU (h_lock) = opval; 2499 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "lock", 'x', opval); 2500 1.1 christos } 2501 1.1 christos } 2502 1.1 christos 2503 1.1 christos abuf->written = written; 2504 1.1 christos #undef FLD 2505 1.1 christos } 2506 1.1 christos NEXT (vpc); 2507 1.1 christos 2508 1.1 christos CASE (sem, INSN_CLRPSW) : /* clrpsw $uimm8 */ 2509 1.1 christos { 2510 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2511 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2512 1.1 christos #define FLD(f) abuf->fields.sfmt_clrpsw.f 2513 1.1 christos int UNUSED written = 0; 2514 1.1 christos IADDR UNUSED pc = abuf->addr; 2515 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2); 2516 1.1 christos 2517 1.1 christos { 2518 1.1 christos USI opval = ANDSI (GET_H_CR (((UINT) 0)), ORSI (ZEXTQISI (INVQI (FLD (f_uimm8))), 65280)); 2519 1.1 christos SET_H_CR (((UINT) 0), opval); 2520 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "cr", 'x', opval); 2521 1.1 christos } 2522 1.1 christos 2523 1.1 christos #undef FLD 2524 1.1 christos } 2525 1.1 christos NEXT (vpc); 2526 1.1 christos 2527 1.1 christos CASE (sem, INSN_SETPSW) : /* setpsw $uimm8 */ 2528 1.1 christos { 2529 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2530 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2531 1.1 christos #define FLD(f) abuf->fields.sfmt_clrpsw.f 2532 1.1 christos int UNUSED written = 0; 2533 1.1 christos IADDR UNUSED pc = abuf->addr; 2534 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2); 2535 1.1 christos 2536 1.1 christos { 2537 1.1 christos USI opval = FLD (f_uimm8); 2538 1.1 christos SET_H_CR (((UINT) 0), opval); 2539 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "cr", 'x', opval); 2540 1.1 christos } 2541 1.1 christos 2542 1.1 christos #undef FLD 2543 1.1 christos } 2544 1.1 christos NEXT (vpc); 2545 1.1 christos 2546 1.1 christos CASE (sem, INSN_BSET) : /* bset $uimm3,@($slo16,$sr) */ 2547 1.1 christos { 2548 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2549 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2550 1.1 christos #define FLD(f) abuf->fields.sfmt_bset.f 2551 1.1 christos int UNUSED written = 0; 2552 1.1 christos IADDR UNUSED pc = abuf->addr; 2553 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2554 1.1 christos 2555 1.1 christos { 2556 1.1 christos QI opval = ORQI (GETMEMQI (current_cpu, pc, ADDSI (* FLD (i_sr), FLD (f_simm16))), SLLQI (1, SUBSI (7, FLD (f_uimm3)))); 2557 1.1 christos SETMEMQI (current_cpu, pc, ADDSI (* FLD (i_sr), FLD (f_simm16)), opval); 2558 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval); 2559 1.1 christos } 2560 1.1 christos 2561 1.1 christos #undef FLD 2562 1.1 christos } 2563 1.1 christos NEXT (vpc); 2564 1.1 christos 2565 1.1 christos CASE (sem, INSN_BCLR) : /* bclr $uimm3,@($slo16,$sr) */ 2566 1.1 christos { 2567 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2568 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2569 1.1 christos #define FLD(f) abuf->fields.sfmt_bset.f 2570 1.1 christos int UNUSED written = 0; 2571 1.1 christos IADDR UNUSED pc = abuf->addr; 2572 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2573 1.1 christos 2574 1.1 christos { 2575 1.1 christos QI opval = ANDQI (GETMEMQI (current_cpu, pc, ADDSI (* FLD (i_sr), FLD (f_simm16))), INVQI (SLLQI (1, SUBSI (7, FLD (f_uimm3))))); 2576 1.1 christos SETMEMQI (current_cpu, pc, ADDSI (* FLD (i_sr), FLD (f_simm16)), opval); 2577 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval); 2578 1.1 christos } 2579 1.1 christos 2580 1.1 christos #undef FLD 2581 1.1 christos } 2582 1.1 christos NEXT (vpc); 2583 1.1 christos 2584 1.1 christos CASE (sem, INSN_BTST) : /* btst $uimm3,$sr */ 2585 1.1 christos { 2586 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2587 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2588 1.1 christos #define FLD(f) abuf->fields.sfmt_bset.f 2589 1.1 christos int UNUSED written = 0; 2590 1.1 christos IADDR UNUSED pc = abuf->addr; 2591 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2); 2592 1.1 christos 2593 1.1 christos { 2594 1.1 christos BI opval = ANDQI (SRLQI (* FLD (i_sr), SUBSI (7, FLD (f_uimm3))), 1); 2595 1.1 christos CPU (h_cond) = opval; 2596 1.1.1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval); 2597 1.1 christos } 2598 1.1 christos 2599 1.1 christos #undef FLD 2600 1.1 christos } 2601 1.1 christos NEXT (vpc); 2602 1.1 christos 2603 1.1 christos 2604 1.1 christos } 2605 1.1 christos ENDSWITCH (sem) /* End of semantic switch. */ 2606 1.1 christos 2607 1.1 christos /* At this point `vpc' contains the next insn to execute. */ 2608 1.1 christos } 2609 1.1 christos 2610 1.1 christos #undef DEFINE_SWITCH 2611 1.1 christos #endif /* DEFINE_SWITCH */ 2612