1 /* Simulator instruction semantics for or1k32bf. 2 3 THIS FILE IS MACHINE GENERATED WITH CGEN. 4 5 Copyright 1996-2019 Free Software Foundation, Inc. 6 7 This file is part of the GNU simulators. 8 9 This file is free software; you can redistribute it and/or modify 10 it under the terms of the GNU General Public License as published by 11 the Free Software Foundation; either version 3, or (at your option) 12 any later version. 13 14 It is distributed in the hope that it will be useful, but WITHOUT 15 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 16 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public 17 License for more details. 18 19 You should have received a copy of the GNU General Public License along 20 with this program; if not, write to the Free Software Foundation, Inc., 21 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. 22 23 */ 24 25 #ifdef DEFINE_LABELS 26 27 /* The labels have the case they have because the enum of insn types 28 is all uppercase and in the non-stdc case the insn symbol is built 29 into the enum name. */ 30 31 static struct { 32 int index; 33 void *label; 34 } labels[] = { 35 { OR1K32BF_INSN_X_INVALID, && case_sem_INSN_X_INVALID }, 36 { OR1K32BF_INSN_X_AFTER, && case_sem_INSN_X_AFTER }, 37 { OR1K32BF_INSN_X_BEFORE, && case_sem_INSN_X_BEFORE }, 38 { OR1K32BF_INSN_X_CTI_CHAIN, && case_sem_INSN_X_CTI_CHAIN }, 39 { OR1K32BF_INSN_X_CHAIN, && case_sem_INSN_X_CHAIN }, 40 { OR1K32BF_INSN_X_BEGIN, && case_sem_INSN_X_BEGIN }, 41 { OR1K32BF_INSN_L_J, && case_sem_INSN_L_J }, 42 { OR1K32BF_INSN_L_ADRP, && case_sem_INSN_L_ADRP }, 43 { OR1K32BF_INSN_L_JAL, && case_sem_INSN_L_JAL }, 44 { OR1K32BF_INSN_L_JR, && case_sem_INSN_L_JR }, 45 { OR1K32BF_INSN_L_JALR, && case_sem_INSN_L_JALR }, 46 { OR1K32BF_INSN_L_BNF, && case_sem_INSN_L_BNF }, 47 { OR1K32BF_INSN_L_BF, && case_sem_INSN_L_BF }, 48 { OR1K32BF_INSN_L_TRAP, && case_sem_INSN_L_TRAP }, 49 { OR1K32BF_INSN_L_SYS, && case_sem_INSN_L_SYS }, 50 { OR1K32BF_INSN_L_MSYNC, && case_sem_INSN_L_MSYNC }, 51 { OR1K32BF_INSN_L_PSYNC, && case_sem_INSN_L_PSYNC }, 52 { OR1K32BF_INSN_L_CSYNC, && case_sem_INSN_L_CSYNC }, 53 { OR1K32BF_INSN_L_RFE, && case_sem_INSN_L_RFE }, 54 { OR1K32BF_INSN_L_NOP_IMM, && case_sem_INSN_L_NOP_IMM }, 55 { OR1K32BF_INSN_L_MOVHI, && case_sem_INSN_L_MOVHI }, 56 { OR1K32BF_INSN_L_MACRC, && case_sem_INSN_L_MACRC }, 57 { OR1K32BF_INSN_L_MFSPR, && case_sem_INSN_L_MFSPR }, 58 { OR1K32BF_INSN_L_MTSPR, && case_sem_INSN_L_MTSPR }, 59 { OR1K32BF_INSN_L_LWZ, && case_sem_INSN_L_LWZ }, 60 { OR1K32BF_INSN_L_LWS, && case_sem_INSN_L_LWS }, 61 { OR1K32BF_INSN_L_LWA, && case_sem_INSN_L_LWA }, 62 { OR1K32BF_INSN_L_LBZ, && case_sem_INSN_L_LBZ }, 63 { OR1K32BF_INSN_L_LBS, && case_sem_INSN_L_LBS }, 64 { OR1K32BF_INSN_L_LHZ, && case_sem_INSN_L_LHZ }, 65 { OR1K32BF_INSN_L_LHS, && case_sem_INSN_L_LHS }, 66 { OR1K32BF_INSN_L_SW, && case_sem_INSN_L_SW }, 67 { OR1K32BF_INSN_L_SB, && case_sem_INSN_L_SB }, 68 { OR1K32BF_INSN_L_SH, && case_sem_INSN_L_SH }, 69 { OR1K32BF_INSN_L_SWA, && case_sem_INSN_L_SWA }, 70 { OR1K32BF_INSN_L_SLL, && case_sem_INSN_L_SLL }, 71 { OR1K32BF_INSN_L_SLLI, && case_sem_INSN_L_SLLI }, 72 { OR1K32BF_INSN_L_SRL, && case_sem_INSN_L_SRL }, 73 { OR1K32BF_INSN_L_SRLI, && case_sem_INSN_L_SRLI }, 74 { OR1K32BF_INSN_L_SRA, && case_sem_INSN_L_SRA }, 75 { OR1K32BF_INSN_L_SRAI, && case_sem_INSN_L_SRAI }, 76 { OR1K32BF_INSN_L_ROR, && case_sem_INSN_L_ROR }, 77 { OR1K32BF_INSN_L_RORI, && case_sem_INSN_L_RORI }, 78 { OR1K32BF_INSN_L_AND, && case_sem_INSN_L_AND }, 79 { OR1K32BF_INSN_L_OR, && case_sem_INSN_L_OR }, 80 { OR1K32BF_INSN_L_XOR, && case_sem_INSN_L_XOR }, 81 { OR1K32BF_INSN_L_ADD, && case_sem_INSN_L_ADD }, 82 { OR1K32BF_INSN_L_SUB, && case_sem_INSN_L_SUB }, 83 { OR1K32BF_INSN_L_ADDC, && case_sem_INSN_L_ADDC }, 84 { OR1K32BF_INSN_L_MUL, && case_sem_INSN_L_MUL }, 85 { OR1K32BF_INSN_L_MULD, && case_sem_INSN_L_MULD }, 86 { OR1K32BF_INSN_L_MULU, && case_sem_INSN_L_MULU }, 87 { OR1K32BF_INSN_L_MULDU, && case_sem_INSN_L_MULDU }, 88 { OR1K32BF_INSN_L_DIV, && case_sem_INSN_L_DIV }, 89 { OR1K32BF_INSN_L_DIVU, && case_sem_INSN_L_DIVU }, 90 { OR1K32BF_INSN_L_FF1, && case_sem_INSN_L_FF1 }, 91 { OR1K32BF_INSN_L_FL1, && case_sem_INSN_L_FL1 }, 92 { OR1K32BF_INSN_L_ANDI, && case_sem_INSN_L_ANDI }, 93 { OR1K32BF_INSN_L_ORI, && case_sem_INSN_L_ORI }, 94 { OR1K32BF_INSN_L_XORI, && case_sem_INSN_L_XORI }, 95 { OR1K32BF_INSN_L_ADDI, && case_sem_INSN_L_ADDI }, 96 { OR1K32BF_INSN_L_ADDIC, && case_sem_INSN_L_ADDIC }, 97 { OR1K32BF_INSN_L_MULI, && case_sem_INSN_L_MULI }, 98 { OR1K32BF_INSN_L_EXTHS, && case_sem_INSN_L_EXTHS }, 99 { OR1K32BF_INSN_L_EXTBS, && case_sem_INSN_L_EXTBS }, 100 { OR1K32BF_INSN_L_EXTHZ, && case_sem_INSN_L_EXTHZ }, 101 { OR1K32BF_INSN_L_EXTBZ, && case_sem_INSN_L_EXTBZ }, 102 { OR1K32BF_INSN_L_EXTWS, && case_sem_INSN_L_EXTWS }, 103 { OR1K32BF_INSN_L_EXTWZ, && case_sem_INSN_L_EXTWZ }, 104 { OR1K32BF_INSN_L_CMOV, && case_sem_INSN_L_CMOV }, 105 { OR1K32BF_INSN_L_SFGTS, && case_sem_INSN_L_SFGTS }, 106 { OR1K32BF_INSN_L_SFGTSI, && case_sem_INSN_L_SFGTSI }, 107 { OR1K32BF_INSN_L_SFGTU, && case_sem_INSN_L_SFGTU }, 108 { OR1K32BF_INSN_L_SFGTUI, && case_sem_INSN_L_SFGTUI }, 109 { OR1K32BF_INSN_L_SFGES, && case_sem_INSN_L_SFGES }, 110 { OR1K32BF_INSN_L_SFGESI, && case_sem_INSN_L_SFGESI }, 111 { OR1K32BF_INSN_L_SFGEU, && case_sem_INSN_L_SFGEU }, 112 { OR1K32BF_INSN_L_SFGEUI, && case_sem_INSN_L_SFGEUI }, 113 { OR1K32BF_INSN_L_SFLTS, && case_sem_INSN_L_SFLTS }, 114 { OR1K32BF_INSN_L_SFLTSI, && case_sem_INSN_L_SFLTSI }, 115 { OR1K32BF_INSN_L_SFLTU, && case_sem_INSN_L_SFLTU }, 116 { OR1K32BF_INSN_L_SFLTUI, && case_sem_INSN_L_SFLTUI }, 117 { OR1K32BF_INSN_L_SFLES, && case_sem_INSN_L_SFLES }, 118 { OR1K32BF_INSN_L_SFLESI, && case_sem_INSN_L_SFLESI }, 119 { OR1K32BF_INSN_L_SFLEU, && case_sem_INSN_L_SFLEU }, 120 { OR1K32BF_INSN_L_SFLEUI, && case_sem_INSN_L_SFLEUI }, 121 { OR1K32BF_INSN_L_SFEQ, && case_sem_INSN_L_SFEQ }, 122 { OR1K32BF_INSN_L_SFEQI, && case_sem_INSN_L_SFEQI }, 123 { OR1K32BF_INSN_L_SFNE, && case_sem_INSN_L_SFNE }, 124 { OR1K32BF_INSN_L_SFNEI, && case_sem_INSN_L_SFNEI }, 125 { OR1K32BF_INSN_L_MAC, && case_sem_INSN_L_MAC }, 126 { OR1K32BF_INSN_L_MACI, && case_sem_INSN_L_MACI }, 127 { OR1K32BF_INSN_L_MACU, && case_sem_INSN_L_MACU }, 128 { OR1K32BF_INSN_L_MSB, && case_sem_INSN_L_MSB }, 129 { OR1K32BF_INSN_L_MSBU, && case_sem_INSN_L_MSBU }, 130 { OR1K32BF_INSN_L_CUST1, && case_sem_INSN_L_CUST1 }, 131 { OR1K32BF_INSN_L_CUST2, && case_sem_INSN_L_CUST2 }, 132 { OR1K32BF_INSN_L_CUST3, && case_sem_INSN_L_CUST3 }, 133 { OR1K32BF_INSN_L_CUST4, && case_sem_INSN_L_CUST4 }, 134 { OR1K32BF_INSN_L_CUST5, && case_sem_INSN_L_CUST5 }, 135 { OR1K32BF_INSN_L_CUST6, && case_sem_INSN_L_CUST6 }, 136 { OR1K32BF_INSN_L_CUST7, && case_sem_INSN_L_CUST7 }, 137 { OR1K32BF_INSN_L_CUST8, && case_sem_INSN_L_CUST8 }, 138 { OR1K32BF_INSN_LF_ADD_S, && case_sem_INSN_LF_ADD_S }, 139 { OR1K32BF_INSN_LF_SUB_S, && case_sem_INSN_LF_SUB_S }, 140 { OR1K32BF_INSN_LF_MUL_S, && case_sem_INSN_LF_MUL_S }, 141 { OR1K32BF_INSN_LF_DIV_S, && case_sem_INSN_LF_DIV_S }, 142 { OR1K32BF_INSN_LF_REM_S, && case_sem_INSN_LF_REM_S }, 143 { OR1K32BF_INSN_LF_ITOF_S, && case_sem_INSN_LF_ITOF_S }, 144 { OR1K32BF_INSN_LF_FTOI_S, && case_sem_INSN_LF_FTOI_S }, 145 { OR1K32BF_INSN_LF_EQ_S, && case_sem_INSN_LF_EQ_S }, 146 { OR1K32BF_INSN_LF_NE_S, && case_sem_INSN_LF_NE_S }, 147 { OR1K32BF_INSN_LF_GE_S, && case_sem_INSN_LF_GE_S }, 148 { OR1K32BF_INSN_LF_GT_S, && case_sem_INSN_LF_GT_S }, 149 { OR1K32BF_INSN_LF_LT_S, && case_sem_INSN_LF_LT_S }, 150 { OR1K32BF_INSN_LF_LE_S, && case_sem_INSN_LF_LE_S }, 151 { OR1K32BF_INSN_LF_MADD_S, && case_sem_INSN_LF_MADD_S }, 152 { OR1K32BF_INSN_LF_CUST1_S, && case_sem_INSN_LF_CUST1_S }, 153 { 0, 0 } 154 }; 155 int i; 156 157 for (i = 0; labels[i].label != 0; ++i) 158 { 159 #if FAST_P 160 CPU_IDESC (current_cpu) [labels[i].index].sem_fast_lab = labels[i].label; 161 #else 162 CPU_IDESC (current_cpu) [labels[i].index].sem_full_lab = labels[i].label; 163 #endif 164 } 165 166 #undef DEFINE_LABELS 167 #endif /* DEFINE_LABELS */ 168 169 #ifdef DEFINE_SWITCH 170 171 /* If hyper-fast [well not unnecessarily slow] execution is selected, turn 172 off frills like tracing and profiling. */ 173 /* FIXME: A better way would be to have TRACE_RESULT check for something 174 that can cause it to be optimized out. Another way would be to emit 175 special handlers into the instruction "stream". */ 176 177 #if FAST_P 178 #undef CGEN_TRACE_RESULT 179 #define CGEN_TRACE_RESULT(cpu, abuf, name, type, val) 180 #endif 181 182 #undef GET_ATTR 183 #define GET_ATTR(cpu, num, attr) CGEN_ATTR_VALUE (NULL, abuf->idesc->attrs, CGEN_INSN_##attr) 184 185 { 186 187 #if WITH_SCACHE_PBB 188 189 /* Branch to next handler without going around main loop. */ 190 #define NEXT(vpc) goto * SEM_ARGBUF (vpc) -> semantic.sem_case 191 SWITCH (sem, SEM_ARGBUF (vpc) -> semantic.sem_case) 192 193 #else /* ! WITH_SCACHE_PBB */ 194 195 #define NEXT(vpc) BREAK (sem) 196 #ifdef __GNUC__ 197 #if FAST_P 198 SWITCH (sem, SEM_ARGBUF (sc) -> idesc->sem_fast_lab) 199 #else 200 SWITCH (sem, SEM_ARGBUF (sc) -> idesc->sem_full_lab) 201 #endif 202 #else 203 SWITCH (sem, SEM_ARGBUF (sc) -> idesc->num) 204 #endif 205 206 #endif /* ! WITH_SCACHE_PBB */ 207 208 { 209 210 CASE (sem, INSN_X_INVALID) : /* --invalid-- */ 211 { 212 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 213 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 214 #define FLD(f) abuf->fields.sfmt_empty.f 215 int UNUSED written = 0; 216 IADDR UNUSED pc = abuf->addr; 217 vpc = SEM_NEXT_VPC (sem_arg, pc, 0); 218 219 { 220 /* Update the recorded pc in the cpu state struct. 221 Only necessary for WITH_SCACHE case, but to avoid the 222 conditional compilation .... */ 223 SET_H_PC (pc); 224 /* Virtual insns have zero size. Overwrite vpc with address of next insn 225 using the default-insn-bitsize spec. When executing insns in parallel 226 we may want to queue the fault and continue execution. */ 227 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 228 vpc = sim_engine_invalid_insn (current_cpu, pc, vpc); 229 } 230 231 #undef FLD 232 } 233 NEXT (vpc); 234 235 CASE (sem, INSN_X_AFTER) : /* --after-- */ 236 { 237 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 238 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 239 #define FLD(f) abuf->fields.sfmt_empty.f 240 int UNUSED written = 0; 241 IADDR UNUSED pc = abuf->addr; 242 vpc = SEM_NEXT_VPC (sem_arg, pc, 0); 243 244 { 245 #if WITH_SCACHE_PBB_OR1K32BF 246 or1k32bf_pbb_after (current_cpu, sem_arg); 247 #endif 248 } 249 250 #undef FLD 251 } 252 NEXT (vpc); 253 254 CASE (sem, INSN_X_BEFORE) : /* --before-- */ 255 { 256 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 257 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 258 #define FLD(f) abuf->fields.sfmt_empty.f 259 int UNUSED written = 0; 260 IADDR UNUSED pc = abuf->addr; 261 vpc = SEM_NEXT_VPC (sem_arg, pc, 0); 262 263 { 264 #if WITH_SCACHE_PBB_OR1K32BF 265 or1k32bf_pbb_before (current_cpu, sem_arg); 266 #endif 267 } 268 269 #undef FLD 270 } 271 NEXT (vpc); 272 273 CASE (sem, INSN_X_CTI_CHAIN) : /* --cti-chain-- */ 274 { 275 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 276 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 277 #define FLD(f) abuf->fields.sfmt_empty.f 278 int UNUSED written = 0; 279 IADDR UNUSED pc = abuf->addr; 280 vpc = SEM_NEXT_VPC (sem_arg, pc, 0); 281 282 { 283 #if WITH_SCACHE_PBB_OR1K32BF 284 #ifdef DEFINE_SWITCH 285 vpc = or1k32bf_pbb_cti_chain (current_cpu, sem_arg, 286 pbb_br_type, pbb_br_npc); 287 BREAK (sem); 288 #else 289 /* FIXME: Allow provision of explicit ifmt spec in insn spec. */ 290 vpc = or1k32bf_pbb_cti_chain (current_cpu, sem_arg, 291 CPU_PBB_BR_TYPE (current_cpu), 292 CPU_PBB_BR_NPC (current_cpu)); 293 #endif 294 #endif 295 } 296 297 #undef FLD 298 } 299 NEXT (vpc); 300 301 CASE (sem, INSN_X_CHAIN) : /* --chain-- */ 302 { 303 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 304 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 305 #define FLD(f) abuf->fields.sfmt_empty.f 306 int UNUSED written = 0; 307 IADDR UNUSED pc = abuf->addr; 308 vpc = SEM_NEXT_VPC (sem_arg, pc, 0); 309 310 { 311 #if WITH_SCACHE_PBB_OR1K32BF 312 vpc = or1k32bf_pbb_chain (current_cpu, sem_arg); 313 #ifdef DEFINE_SWITCH 314 BREAK (sem); 315 #endif 316 #endif 317 } 318 319 #undef FLD 320 } 321 NEXT (vpc); 322 323 CASE (sem, INSN_X_BEGIN) : /* --begin-- */ 324 { 325 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 326 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 327 #define FLD(f) abuf->fields.sfmt_empty.f 328 int UNUSED written = 0; 329 IADDR UNUSED pc = abuf->addr; 330 vpc = SEM_NEXT_VPC (sem_arg, pc, 0); 331 332 { 333 #if WITH_SCACHE_PBB_OR1K32BF 334 #if defined DEFINE_SWITCH || defined FAST_P 335 /* In the switch case FAST_P is a constant, allowing several optimizations 336 in any called inline functions. */ 337 vpc = or1k32bf_pbb_begin (current_cpu, FAST_P); 338 #else 339 #if 0 /* cgen engine can't handle dynamic fast/full switching yet. */ 340 vpc = or1k32bf_pbb_begin (current_cpu, STATE_RUN_FAST_P (CPU_STATE (current_cpu))); 341 #else 342 vpc = or1k32bf_pbb_begin (current_cpu, 0); 343 #endif 344 #endif 345 #endif 346 } 347 348 #undef FLD 349 } 350 NEXT (vpc); 351 352 CASE (sem, INSN_L_J) : /* l.j ${disp26} */ 353 { 354 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 355 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 356 #define FLD(f) abuf->fields.sfmt_l_j.f 357 int UNUSED written = 0; 358 IADDR UNUSED pc = abuf->addr; 359 SEM_BRANCH_INIT 360 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 361 362 { 363 { 364 { 365 USI opval = FLD (i_disp26); 366 SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc); 367 CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval); 368 } 369 } 370 if (GET_H_SYS_CPUCFGR_ND ()) { 371 if (1) 372 SEM_SKIP_INSN (current_cpu, sem_arg, vpc); 373 } 374 } 375 376 SEM_BRANCH_FINI (vpc); 377 #undef FLD 378 } 379 NEXT (vpc); 380 381 CASE (sem, INSN_L_ADRP) : /* l.adrp $rD,${disp21} */ 382 { 383 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 384 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 385 #define FLD(f) abuf->fields.sfmt_l_adrp.f 386 int UNUSED written = 0; 387 IADDR UNUSED pc = abuf->addr; 388 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 389 390 { 391 USI opval = FLD (i_disp21); 392 SET_H_GPR (FLD (f_r1), opval); 393 CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval); 394 } 395 396 #undef FLD 397 } 398 NEXT (vpc); 399 400 CASE (sem, INSN_L_JAL) : /* l.jal ${disp26} */ 401 { 402 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 403 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 404 #define FLD(f) abuf->fields.sfmt_l_j.f 405 int UNUSED written = 0; 406 IADDR UNUSED pc = abuf->addr; 407 SEM_BRANCH_INIT 408 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 409 410 { 411 { 412 USI opval = ADDSI (pc, ((GET_H_SYS_CPUCFGR_ND ()) ? (4) : (8))); 413 SET_H_GPR (((UINT) 9), opval); 414 CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval); 415 } 416 { 417 { 418 { 419 USI opval = FLD (i_disp26); 420 SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc); 421 CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval); 422 } 423 } 424 if (GET_H_SYS_CPUCFGR_ND ()) { 425 if (1) 426 SEM_SKIP_INSN (current_cpu, sem_arg, vpc); 427 } 428 } 429 } 430 431 SEM_BRANCH_FINI (vpc); 432 #undef FLD 433 } 434 NEXT (vpc); 435 436 CASE (sem, INSN_L_JR) : /* l.jr $rB */ 437 { 438 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 439 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 440 #define FLD(f) abuf->fields.sfmt_l_sll.f 441 int UNUSED written = 0; 442 IADDR UNUSED pc = abuf->addr; 443 SEM_BRANCH_INIT 444 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 445 446 { 447 { 448 { 449 USI opval = GET_H_GPR (FLD (f_r3)); 450 SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc); 451 CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval); 452 } 453 } 454 if (GET_H_SYS_CPUCFGR_ND ()) { 455 if (1) 456 SEM_SKIP_INSN (current_cpu, sem_arg, vpc); 457 } 458 } 459 460 SEM_BRANCH_FINI (vpc); 461 #undef FLD 462 } 463 NEXT (vpc); 464 465 CASE (sem, INSN_L_JALR) : /* l.jalr $rB */ 466 { 467 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 468 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 469 #define FLD(f) abuf->fields.sfmt_l_sll.f 470 int UNUSED written = 0; 471 IADDR UNUSED pc = abuf->addr; 472 SEM_BRANCH_INIT 473 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 474 475 { 476 { 477 USI opval = ADDSI (pc, ((GET_H_SYS_CPUCFGR_ND ()) ? (4) : (8))); 478 SET_H_GPR (((UINT) 9), opval); 479 CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval); 480 } 481 { 482 { 483 { 484 USI opval = GET_H_GPR (FLD (f_r3)); 485 SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc); 486 CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval); 487 } 488 } 489 if (GET_H_SYS_CPUCFGR_ND ()) { 490 if (1) 491 SEM_SKIP_INSN (current_cpu, sem_arg, vpc); 492 } 493 } 494 } 495 496 SEM_BRANCH_FINI (vpc); 497 #undef FLD 498 } 499 NEXT (vpc); 500 501 CASE (sem, INSN_L_BNF) : /* l.bnf ${disp26} */ 502 { 503 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 504 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 505 #define FLD(f) abuf->fields.sfmt_l_j.f 506 int UNUSED written = 0; 507 IADDR UNUSED pc = abuf->addr; 508 SEM_BRANCH_INIT 509 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 510 511 { 512 if (NOTSI (GET_H_SYS_SR_F ())) { 513 { 514 { 515 USI opval = FLD (i_disp26); 516 SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc); 517 written |= (1 << 4); 518 CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval); 519 } 520 } 521 } else { 522 if (GET_H_SYS_CPUCFGR_ND ()) { 523 { 524 { 525 USI opval = ADDSI (pc, 4); 526 SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc); 527 written |= (1 << 4); 528 CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval); 529 } 530 } 531 } 532 } 533 if (GET_H_SYS_CPUCFGR_ND ()) { 534 if (1) 535 SEM_SKIP_INSN (current_cpu, sem_arg, vpc); 536 } 537 } 538 539 abuf->written = written; 540 SEM_BRANCH_FINI (vpc); 541 #undef FLD 542 } 543 NEXT (vpc); 544 545 CASE (sem, INSN_L_BF) : /* l.bf ${disp26} */ 546 { 547 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 548 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 549 #define FLD(f) abuf->fields.sfmt_l_j.f 550 int UNUSED written = 0; 551 IADDR UNUSED pc = abuf->addr; 552 SEM_BRANCH_INIT 553 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 554 555 { 556 if (GET_H_SYS_SR_F ()) { 557 { 558 { 559 USI opval = FLD (i_disp26); 560 SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc); 561 written |= (1 << 4); 562 CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval); 563 } 564 } 565 } else { 566 if (GET_H_SYS_CPUCFGR_ND ()) { 567 { 568 { 569 USI opval = ADDSI (pc, 4); 570 SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc); 571 written |= (1 << 4); 572 CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval); 573 } 574 } 575 } 576 } 577 if (GET_H_SYS_CPUCFGR_ND ()) { 578 if (1) 579 SEM_SKIP_INSN (current_cpu, sem_arg, vpc); 580 } 581 } 582 583 abuf->written = written; 584 SEM_BRANCH_FINI (vpc); 585 #undef FLD 586 } 587 NEXT (vpc); 588 589 CASE (sem, INSN_L_TRAP) : /* l.trap ${uimm16} */ 590 { 591 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 592 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 593 #define FLD(f) abuf->fields.sfmt_empty.f 594 int UNUSED written = 0; 595 IADDR UNUSED pc = abuf->addr; 596 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 597 598 or1k32bf_exception (current_cpu, pc, EXCEPT_TRAP); 599 600 #undef FLD 601 } 602 NEXT (vpc); 603 604 CASE (sem, INSN_L_SYS) : /* l.sys ${uimm16} */ 605 { 606 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 607 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 608 #define FLD(f) abuf->fields.sfmt_empty.f 609 int UNUSED written = 0; 610 IADDR UNUSED pc = abuf->addr; 611 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 612 613 or1k32bf_exception (current_cpu, pc, EXCEPT_SYSCALL); 614 615 #undef FLD 616 } 617 NEXT (vpc); 618 619 CASE (sem, INSN_L_MSYNC) : /* l.msync */ 620 { 621 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 622 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 623 #define FLD(f) abuf->fields.sfmt_empty.f 624 int UNUSED written = 0; 625 IADDR UNUSED pc = abuf->addr; 626 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 627 628 ((void) 0); /*nop*/ 629 630 #undef FLD 631 } 632 NEXT (vpc); 633 634 CASE (sem, INSN_L_PSYNC) : /* l.psync */ 635 { 636 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 637 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 638 #define FLD(f) abuf->fields.sfmt_empty.f 639 int UNUSED written = 0; 640 IADDR UNUSED pc = abuf->addr; 641 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 642 643 ((void) 0); /*nop*/ 644 645 #undef FLD 646 } 647 NEXT (vpc); 648 649 CASE (sem, INSN_L_CSYNC) : /* l.csync */ 650 { 651 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 652 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 653 #define FLD(f) abuf->fields.sfmt_empty.f 654 int UNUSED written = 0; 655 IADDR UNUSED pc = abuf->addr; 656 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 657 658 ((void) 0); /*nop*/ 659 660 #undef FLD 661 } 662 NEXT (vpc); 663 664 CASE (sem, INSN_L_RFE) : /* l.rfe */ 665 { 666 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 667 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 668 #define FLD(f) abuf->fields.sfmt_empty.f 669 int UNUSED written = 0; 670 IADDR UNUSED pc = abuf->addr; 671 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 672 673 or1k32bf_rfe (current_cpu); 674 675 #undef FLD 676 } 677 NEXT (vpc); 678 679 CASE (sem, INSN_L_NOP_IMM) : /* l.nop ${uimm16} */ 680 { 681 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 682 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 683 #define FLD(f) abuf->fields.sfmt_l_mfspr.f 684 int UNUSED written = 0; 685 IADDR UNUSED pc = abuf->addr; 686 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 687 688 or1k32bf_nop (current_cpu, ZEXTSISI (FLD (f_uimm16))); 689 690 #undef FLD 691 } 692 NEXT (vpc); 693 694 CASE (sem, INSN_L_MOVHI) : /* l.movhi $rD,$uimm16 */ 695 { 696 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 697 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 698 #define FLD(f) abuf->fields.sfmt_l_mfspr.f 699 int UNUSED written = 0; 700 IADDR UNUSED pc = abuf->addr; 701 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 702 703 { 704 USI opval = SLLSI (ZEXTSISI (FLD (f_uimm16)), 16); 705 SET_H_GPR (FLD (f_r1), opval); 706 CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval); 707 } 708 709 #undef FLD 710 } 711 NEXT (vpc); 712 713 CASE (sem, INSN_L_MACRC) : /* l.macrc $rD */ 714 { 715 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 716 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 717 #define FLD(f) abuf->fields.sfmt_l_adrp.f 718 int UNUSED written = 0; 719 IADDR UNUSED pc = abuf->addr; 720 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 721 722 { 723 { 724 USI opval = GET_H_MAC_MACLO (); 725 SET_H_GPR (FLD (f_r1), opval); 726 CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval); 727 } 728 { 729 USI opval = 0; 730 SET_H_MAC_MACLO (opval); 731 CGEN_TRACE_RESULT (current_cpu, abuf, "mac-maclo", 'x', opval); 732 } 733 { 734 USI opval = 0; 735 SET_H_MAC_MACHI (opval); 736 CGEN_TRACE_RESULT (current_cpu, abuf, "mac-machi", 'x', opval); 737 } 738 } 739 740 #undef FLD 741 } 742 NEXT (vpc); 743 744 CASE (sem, INSN_L_MFSPR) : /* l.mfspr $rD,$rA,${uimm16} */ 745 { 746 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 747 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 748 #define FLD(f) abuf->fields.sfmt_l_mfspr.f 749 int UNUSED written = 0; 750 IADDR UNUSED pc = abuf->addr; 751 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 752 753 { 754 USI opval = or1k32bf_mfspr (current_cpu, ORSI (GET_H_GPR (FLD (f_r2)), ZEXTSISI (FLD (f_uimm16)))); 755 SET_H_GPR (FLD (f_r1), opval); 756 CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval); 757 } 758 759 #undef FLD 760 } 761 NEXT (vpc); 762 763 CASE (sem, INSN_L_MTSPR) : /* l.mtspr $rA,$rB,${uimm16-split} */ 764 { 765 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 766 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 767 #define FLD(f) abuf->fields.sfmt_l_mtspr.f 768 int UNUSED written = 0; 769 IADDR UNUSED pc = abuf->addr; 770 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 771 772 or1k32bf_mtspr (current_cpu, ORSI (GET_H_GPR (FLD (f_r2)), ZEXTSISI (FLD (f_uimm16_split))), GET_H_GPR (FLD (f_r3))); 773 774 #undef FLD 775 } 776 NEXT (vpc); 777 778 CASE (sem, INSN_L_LWZ) : /* l.lwz $rD,${simm16}($rA) */ 779 { 780 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 781 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 782 #define FLD(f) abuf->fields.sfmt_l_lwz.f 783 int UNUSED written = 0; 784 IADDR UNUSED pc = abuf->addr; 785 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 786 787 { 788 USI opval = ZEXTSISI (GETMEMUSI (current_cpu, pc, or1k32bf_make_load_store_addr (current_cpu, GET_H_GPR (FLD (f_r2)), EXTSISI (FLD (f_simm16)), 4))); 789 SET_H_GPR (FLD (f_r1), opval); 790 CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval); 791 } 792 793 #undef FLD 794 } 795 NEXT (vpc); 796 797 CASE (sem, INSN_L_LWS) : /* l.lws $rD,${simm16}($rA) */ 798 { 799 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 800 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 801 #define FLD(f) abuf->fields.sfmt_l_lwz.f 802 int UNUSED written = 0; 803 IADDR UNUSED pc = abuf->addr; 804 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 805 806 { 807 SI opval = EXTSISI (GETMEMSI (current_cpu, pc, or1k32bf_make_load_store_addr (current_cpu, GET_H_GPR (FLD (f_r2)), EXTSISI (FLD (f_simm16)), 4))); 808 SET_H_GPR (FLD (f_r1), opval); 809 CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval); 810 } 811 812 #undef FLD 813 } 814 NEXT (vpc); 815 816 CASE (sem, INSN_L_LWA) : /* l.lwa $rD,${simm16}($rA) */ 817 { 818 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 819 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 820 #define FLD(f) abuf->fields.sfmt_l_lwz.f 821 int UNUSED written = 0; 822 IADDR UNUSED pc = abuf->addr; 823 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 824 825 { 826 { 827 USI opval = ZEXTSISI (GETMEMUSI (current_cpu, pc, or1k32bf_make_load_store_addr (current_cpu, GET_H_GPR (FLD (f_r2)), EXTSISI (FLD (f_simm16)), 4))); 828 SET_H_GPR (FLD (f_r1), opval); 829 CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval); 830 } 831 { 832 BI opval = 1; 833 CPU (h_atomic_reserve) = opval; 834 CGEN_TRACE_RESULT (current_cpu, abuf, "atomic-reserve", 'x', opval); 835 } 836 { 837 SI opval = or1k32bf_make_load_store_addr (current_cpu, GET_H_GPR (FLD (f_r2)), EXTSISI (FLD (f_simm16)), 4); 838 CPU (h_atomic_address) = opval; 839 CGEN_TRACE_RESULT (current_cpu, abuf, "atomic-address", 'x', opval); 840 } 841 } 842 843 #undef FLD 844 } 845 NEXT (vpc); 846 847 CASE (sem, INSN_L_LBZ) : /* l.lbz $rD,${simm16}($rA) */ 848 { 849 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 850 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 851 #define FLD(f) abuf->fields.sfmt_l_lwz.f 852 int UNUSED written = 0; 853 IADDR UNUSED pc = abuf->addr; 854 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 855 856 { 857 USI opval = ZEXTQISI (GETMEMUQI (current_cpu, pc, or1k32bf_make_load_store_addr (current_cpu, GET_H_GPR (FLD (f_r2)), EXTSISI (FLD (f_simm16)), 1))); 858 SET_H_GPR (FLD (f_r1), opval); 859 CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval); 860 } 861 862 #undef FLD 863 } 864 NEXT (vpc); 865 866 CASE (sem, INSN_L_LBS) : /* l.lbs $rD,${simm16}($rA) */ 867 { 868 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 869 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 870 #define FLD(f) abuf->fields.sfmt_l_lwz.f 871 int UNUSED written = 0; 872 IADDR UNUSED pc = abuf->addr; 873 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 874 875 { 876 SI opval = EXTQISI (GETMEMQI (current_cpu, pc, or1k32bf_make_load_store_addr (current_cpu, GET_H_GPR (FLD (f_r2)), EXTSISI (FLD (f_simm16)), 1))); 877 SET_H_GPR (FLD (f_r1), opval); 878 CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval); 879 } 880 881 #undef FLD 882 } 883 NEXT (vpc); 884 885 CASE (sem, INSN_L_LHZ) : /* l.lhz $rD,${simm16}($rA) */ 886 { 887 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 888 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 889 #define FLD(f) abuf->fields.sfmt_l_lwz.f 890 int UNUSED written = 0; 891 IADDR UNUSED pc = abuf->addr; 892 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 893 894 { 895 USI opval = ZEXTHISI (GETMEMUHI (current_cpu, pc, or1k32bf_make_load_store_addr (current_cpu, GET_H_GPR (FLD (f_r2)), EXTSISI (FLD (f_simm16)), 2))); 896 SET_H_GPR (FLD (f_r1), opval); 897 CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval); 898 } 899 900 #undef FLD 901 } 902 NEXT (vpc); 903 904 CASE (sem, INSN_L_LHS) : /* l.lhs $rD,${simm16}($rA) */ 905 { 906 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 907 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 908 #define FLD(f) abuf->fields.sfmt_l_lwz.f 909 int UNUSED written = 0; 910 IADDR UNUSED pc = abuf->addr; 911 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 912 913 { 914 SI opval = EXTHISI (GETMEMHI (current_cpu, pc, or1k32bf_make_load_store_addr (current_cpu, GET_H_GPR (FLD (f_r2)), EXTSISI (FLD (f_simm16)), 2))); 915 SET_H_GPR (FLD (f_r1), opval); 916 CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval); 917 } 918 919 #undef FLD 920 } 921 NEXT (vpc); 922 923 CASE (sem, INSN_L_SW) : /* l.sw ${simm16-split}($rA),$rB */ 924 { 925 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 926 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 927 #define FLD(f) abuf->fields.sfmt_l_sw.f 928 int UNUSED written = 0; 929 IADDR UNUSED pc = abuf->addr; 930 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 931 932 { 933 SI tmp_addr; 934 tmp_addr = or1k32bf_make_load_store_addr (current_cpu, GET_H_GPR (FLD (f_r2)), EXTSISI (FLD (f_simm16_split)), 4); 935 { 936 USI opval = TRUNCSISI (GET_H_GPR (FLD (f_r3))); 937 SETMEMUSI (current_cpu, pc, tmp_addr, opval); 938 CGEN_TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval); 939 } 940 if (EQSI (ANDSI (tmp_addr, 268435452), CPU (h_atomic_address))) { 941 { 942 BI opval = 0; 943 CPU (h_atomic_reserve) = opval; 944 written |= (1 << 4); 945 CGEN_TRACE_RESULT (current_cpu, abuf, "atomic-reserve", 'x', opval); 946 } 947 } 948 } 949 950 abuf->written = written; 951 #undef FLD 952 } 953 NEXT (vpc); 954 955 CASE (sem, INSN_L_SB) : /* l.sb ${simm16-split}($rA),$rB */ 956 { 957 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 958 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 959 #define FLD(f) abuf->fields.sfmt_l_sw.f 960 int UNUSED written = 0; 961 IADDR UNUSED pc = abuf->addr; 962 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 963 964 { 965 SI tmp_addr; 966 tmp_addr = or1k32bf_make_load_store_addr (current_cpu, GET_H_GPR (FLD (f_r2)), EXTSISI (FLD (f_simm16_split)), 1); 967 { 968 UQI opval = TRUNCSIQI (GET_H_GPR (FLD (f_r3))); 969 SETMEMUQI (current_cpu, pc, tmp_addr, opval); 970 CGEN_TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval); 971 } 972 if (EQSI (ANDSI (tmp_addr, 268435452), CPU (h_atomic_address))) { 973 { 974 BI opval = 0; 975 CPU (h_atomic_reserve) = opval; 976 written |= (1 << 4); 977 CGEN_TRACE_RESULT (current_cpu, abuf, "atomic-reserve", 'x', opval); 978 } 979 } 980 } 981 982 abuf->written = written; 983 #undef FLD 984 } 985 NEXT (vpc); 986 987 CASE (sem, INSN_L_SH) : /* l.sh ${simm16-split}($rA),$rB */ 988 { 989 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 990 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 991 #define FLD(f) abuf->fields.sfmt_l_sw.f 992 int UNUSED written = 0; 993 IADDR UNUSED pc = abuf->addr; 994 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 995 996 { 997 SI tmp_addr; 998 tmp_addr = or1k32bf_make_load_store_addr (current_cpu, GET_H_GPR (FLD (f_r2)), EXTSISI (FLD (f_simm16_split)), 2); 999 { 1000 UHI opval = TRUNCSIHI (GET_H_GPR (FLD (f_r3))); 1001 SETMEMUHI (current_cpu, pc, tmp_addr, opval); 1002 CGEN_TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval); 1003 } 1004 if (EQSI (ANDSI (tmp_addr, 268435452), CPU (h_atomic_address))) { 1005 { 1006 BI opval = 0; 1007 CPU (h_atomic_reserve) = opval; 1008 written |= (1 << 4); 1009 CGEN_TRACE_RESULT (current_cpu, abuf, "atomic-reserve", 'x', opval); 1010 } 1011 } 1012 } 1013 1014 abuf->written = written; 1015 #undef FLD 1016 } 1017 NEXT (vpc); 1018 1019 CASE (sem, INSN_L_SWA) : /* l.swa ${simm16-split}($rA),$rB */ 1020 { 1021 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1022 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1023 #define FLD(f) abuf->fields.sfmt_l_sw.f 1024 int UNUSED written = 0; 1025 IADDR UNUSED pc = abuf->addr; 1026 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 1027 1028 { 1029 SI tmp_addr; 1030 BI tmp_flag; 1031 tmp_addr = or1k32bf_make_load_store_addr (current_cpu, GET_H_GPR (FLD (f_r2)), EXTSISI (FLD (f_simm16_split)), 4); 1032 { 1033 USI opval = ANDBI (CPU (h_atomic_reserve), EQSI (tmp_addr, CPU (h_atomic_address))); 1034 SET_H_SYS_SR_F (opval); 1035 CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-f", 'x', opval); 1036 } 1037 if (GET_H_SYS_SR_F ()) { 1038 { 1039 USI opval = TRUNCSISI (GET_H_GPR (FLD (f_r3))); 1040 SETMEMUSI (current_cpu, pc, tmp_addr, opval); 1041 written |= (1 << 7); 1042 CGEN_TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval); 1043 } 1044 } 1045 { 1046 BI opval = 0; 1047 CPU (h_atomic_reserve) = opval; 1048 CGEN_TRACE_RESULT (current_cpu, abuf, "atomic-reserve", 'x', opval); 1049 } 1050 } 1051 1052 abuf->written = written; 1053 #undef FLD 1054 } 1055 NEXT (vpc); 1056 1057 CASE (sem, INSN_L_SLL) : /* l.sll $rD,$rA,$rB */ 1058 { 1059 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1060 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1061 #define FLD(f) abuf->fields.sfmt_l_sll.f 1062 int UNUSED written = 0; 1063 IADDR UNUSED pc = abuf->addr; 1064 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 1065 1066 { 1067 USI opval = SLLSI (GET_H_GPR (FLD (f_r2)), GET_H_GPR (FLD (f_r3))); 1068 SET_H_GPR (FLD (f_r1), opval); 1069 CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval); 1070 } 1071 1072 #undef FLD 1073 } 1074 NEXT (vpc); 1075 1076 CASE (sem, INSN_L_SLLI) : /* l.slli $rD,$rA,${uimm6} */ 1077 { 1078 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1079 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1080 #define FLD(f) abuf->fields.sfmt_l_slli.f 1081 int UNUSED written = 0; 1082 IADDR UNUSED pc = abuf->addr; 1083 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 1084 1085 { 1086 USI opval = SLLSI (GET_H_GPR (FLD (f_r2)), FLD (f_uimm6)); 1087 SET_H_GPR (FLD (f_r1), opval); 1088 CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval); 1089 } 1090 1091 #undef FLD 1092 } 1093 NEXT (vpc); 1094 1095 CASE (sem, INSN_L_SRL) : /* l.srl $rD,$rA,$rB */ 1096 { 1097 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1098 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1099 #define FLD(f) abuf->fields.sfmt_l_sll.f 1100 int UNUSED written = 0; 1101 IADDR UNUSED pc = abuf->addr; 1102 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 1103 1104 { 1105 USI opval = SRLSI (GET_H_GPR (FLD (f_r2)), GET_H_GPR (FLD (f_r3))); 1106 SET_H_GPR (FLD (f_r1), opval); 1107 CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval); 1108 } 1109 1110 #undef FLD 1111 } 1112 NEXT (vpc); 1113 1114 CASE (sem, INSN_L_SRLI) : /* l.srli $rD,$rA,${uimm6} */ 1115 { 1116 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1117 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1118 #define FLD(f) abuf->fields.sfmt_l_slli.f 1119 int UNUSED written = 0; 1120 IADDR UNUSED pc = abuf->addr; 1121 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 1122 1123 { 1124 USI opval = SRLSI (GET_H_GPR (FLD (f_r2)), FLD (f_uimm6)); 1125 SET_H_GPR (FLD (f_r1), opval); 1126 CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval); 1127 } 1128 1129 #undef FLD 1130 } 1131 NEXT (vpc); 1132 1133 CASE (sem, INSN_L_SRA) : /* l.sra $rD,$rA,$rB */ 1134 { 1135 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1136 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1137 #define FLD(f) abuf->fields.sfmt_l_sll.f 1138 int UNUSED written = 0; 1139 IADDR UNUSED pc = abuf->addr; 1140 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 1141 1142 { 1143 USI opval = SRASI (GET_H_GPR (FLD (f_r2)), GET_H_GPR (FLD (f_r3))); 1144 SET_H_GPR (FLD (f_r1), opval); 1145 CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval); 1146 } 1147 1148 #undef FLD 1149 } 1150 NEXT (vpc); 1151 1152 CASE (sem, INSN_L_SRAI) : /* l.srai $rD,$rA,${uimm6} */ 1153 { 1154 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1155 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1156 #define FLD(f) abuf->fields.sfmt_l_slli.f 1157 int UNUSED written = 0; 1158 IADDR UNUSED pc = abuf->addr; 1159 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 1160 1161 { 1162 USI opval = SRASI (GET_H_GPR (FLD (f_r2)), FLD (f_uimm6)); 1163 SET_H_GPR (FLD (f_r1), opval); 1164 CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval); 1165 } 1166 1167 #undef FLD 1168 } 1169 NEXT (vpc); 1170 1171 CASE (sem, INSN_L_ROR) : /* l.ror $rD,$rA,$rB */ 1172 { 1173 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1174 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1175 #define FLD(f) abuf->fields.sfmt_l_sll.f 1176 int UNUSED written = 0; 1177 IADDR UNUSED pc = abuf->addr; 1178 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 1179 1180 { 1181 USI opval = RORSI (GET_H_GPR (FLD (f_r2)), GET_H_GPR (FLD (f_r3))); 1182 SET_H_GPR (FLD (f_r1), opval); 1183 CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval); 1184 } 1185 1186 #undef FLD 1187 } 1188 NEXT (vpc); 1189 1190 CASE (sem, INSN_L_RORI) : /* l.rori $rD,$rA,${uimm6} */ 1191 { 1192 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1193 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1194 #define FLD(f) abuf->fields.sfmt_l_slli.f 1195 int UNUSED written = 0; 1196 IADDR UNUSED pc = abuf->addr; 1197 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 1198 1199 { 1200 USI opval = RORSI (GET_H_GPR (FLD (f_r2)), FLD (f_uimm6)); 1201 SET_H_GPR (FLD (f_r1), opval); 1202 CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval); 1203 } 1204 1205 #undef FLD 1206 } 1207 NEXT (vpc); 1208 1209 CASE (sem, INSN_L_AND) : /* l.and $rD,$rA,$rB */ 1210 { 1211 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1212 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1213 #define FLD(f) abuf->fields.sfmt_l_sll.f 1214 int UNUSED written = 0; 1215 IADDR UNUSED pc = abuf->addr; 1216 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 1217 1218 { 1219 USI opval = ANDSI (GET_H_GPR (FLD (f_r2)), GET_H_GPR (FLD (f_r3))); 1220 SET_H_GPR (FLD (f_r1), opval); 1221 CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval); 1222 } 1223 1224 #undef FLD 1225 } 1226 NEXT (vpc); 1227 1228 CASE (sem, INSN_L_OR) : /* l.or $rD,$rA,$rB */ 1229 { 1230 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1231 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1232 #define FLD(f) abuf->fields.sfmt_l_sll.f 1233 int UNUSED written = 0; 1234 IADDR UNUSED pc = abuf->addr; 1235 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 1236 1237 { 1238 USI opval = ORSI (GET_H_GPR (FLD (f_r2)), GET_H_GPR (FLD (f_r3))); 1239 SET_H_GPR (FLD (f_r1), opval); 1240 CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval); 1241 } 1242 1243 #undef FLD 1244 } 1245 NEXT (vpc); 1246 1247 CASE (sem, INSN_L_XOR) : /* l.xor $rD,$rA,$rB */ 1248 { 1249 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1250 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1251 #define FLD(f) abuf->fields.sfmt_l_sll.f 1252 int UNUSED written = 0; 1253 IADDR UNUSED pc = abuf->addr; 1254 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 1255 1256 { 1257 USI opval = XORSI (GET_H_GPR (FLD (f_r2)), GET_H_GPR (FLD (f_r3))); 1258 SET_H_GPR (FLD (f_r1), opval); 1259 CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval); 1260 } 1261 1262 #undef FLD 1263 } 1264 NEXT (vpc); 1265 1266 CASE (sem, INSN_L_ADD) : /* l.add $rD,$rA,$rB */ 1267 { 1268 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1269 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1270 #define FLD(f) abuf->fields.sfmt_l_sll.f 1271 int UNUSED written = 0; 1272 IADDR UNUSED pc = abuf->addr; 1273 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 1274 1275 { 1276 { 1277 { 1278 BI opval = ADDCFSI (GET_H_GPR (FLD (f_r2)), GET_H_GPR (FLD (f_r3)), 0); 1279 SET_H_SYS_SR_CY (opval); 1280 CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-cy", 'x', opval); 1281 } 1282 { 1283 BI opval = ADDOFSI (GET_H_GPR (FLD (f_r2)), GET_H_GPR (FLD (f_r3)), 0); 1284 SET_H_SYS_SR_OV (opval); 1285 CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-ov", 'x', opval); 1286 } 1287 { 1288 USI opval = ADDSI (GET_H_GPR (FLD (f_r2)), GET_H_GPR (FLD (f_r3))); 1289 SET_H_GPR (FLD (f_r1), opval); 1290 CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval); 1291 } 1292 } 1293 if (ANDIF (GET_H_SYS_SR_OV (), GET_H_SYS_SR_OVE ())) { 1294 or1k32bf_exception (current_cpu, pc, EXCEPT_RANGE); 1295 } 1296 } 1297 1298 #undef FLD 1299 } 1300 NEXT (vpc); 1301 1302 CASE (sem, INSN_L_SUB) : /* l.sub $rD,$rA,$rB */ 1303 { 1304 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1305 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1306 #define FLD(f) abuf->fields.sfmt_l_sll.f 1307 int UNUSED written = 0; 1308 IADDR UNUSED pc = abuf->addr; 1309 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 1310 1311 { 1312 { 1313 { 1314 BI opval = SUBCFSI (GET_H_GPR (FLD (f_r2)), GET_H_GPR (FLD (f_r3)), 0); 1315 SET_H_SYS_SR_CY (opval); 1316 CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-cy", 'x', opval); 1317 } 1318 { 1319 BI opval = SUBOFSI (GET_H_GPR (FLD (f_r2)), GET_H_GPR (FLD (f_r3)), 0); 1320 SET_H_SYS_SR_OV (opval); 1321 CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-ov", 'x', opval); 1322 } 1323 { 1324 USI opval = SUBSI (GET_H_GPR (FLD (f_r2)), GET_H_GPR (FLD (f_r3))); 1325 SET_H_GPR (FLD (f_r1), opval); 1326 CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval); 1327 } 1328 } 1329 if (ANDIF (GET_H_SYS_SR_OV (), GET_H_SYS_SR_OVE ())) { 1330 or1k32bf_exception (current_cpu, pc, EXCEPT_RANGE); 1331 } 1332 } 1333 1334 #undef FLD 1335 } 1336 NEXT (vpc); 1337 1338 CASE (sem, INSN_L_ADDC) : /* l.addc $rD,$rA,$rB */ 1339 { 1340 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1341 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1342 #define FLD(f) abuf->fields.sfmt_l_sll.f 1343 int UNUSED written = 0; 1344 IADDR UNUSED pc = abuf->addr; 1345 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 1346 1347 { 1348 { 1349 BI tmp_tmp_sys_sr_cy; 1350 tmp_tmp_sys_sr_cy = GET_H_SYS_SR_CY (); 1351 { 1352 BI opval = ADDCFSI (GET_H_GPR (FLD (f_r2)), GET_H_GPR (FLD (f_r3)), tmp_tmp_sys_sr_cy); 1353 SET_H_SYS_SR_CY (opval); 1354 CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-cy", 'x', opval); 1355 } 1356 { 1357 BI opval = ADDOFSI (GET_H_GPR (FLD (f_r2)), GET_H_GPR (FLD (f_r3)), tmp_tmp_sys_sr_cy); 1358 SET_H_SYS_SR_OV (opval); 1359 CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-ov", 'x', opval); 1360 } 1361 { 1362 USI opval = ADDCSI (GET_H_GPR (FLD (f_r2)), GET_H_GPR (FLD (f_r3)), tmp_tmp_sys_sr_cy); 1363 SET_H_GPR (FLD (f_r1), opval); 1364 CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval); 1365 } 1366 } 1367 if (ANDIF (GET_H_SYS_SR_OV (), GET_H_SYS_SR_OVE ())) { 1368 or1k32bf_exception (current_cpu, pc, EXCEPT_RANGE); 1369 } 1370 } 1371 1372 #undef FLD 1373 } 1374 NEXT (vpc); 1375 1376 CASE (sem, INSN_L_MUL) : /* l.mul $rD,$rA,$rB */ 1377 { 1378 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1379 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1380 #define FLD(f) abuf->fields.sfmt_l_sll.f 1381 int UNUSED written = 0; 1382 IADDR UNUSED pc = abuf->addr; 1383 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 1384 1385 { 1386 { 1387 { 1388 BI opval = MUL2OFSI (GET_H_GPR (FLD (f_r2)), GET_H_GPR (FLD (f_r3))); 1389 SET_H_SYS_SR_OV (opval); 1390 CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-ov", 'x', opval); 1391 } 1392 { 1393 USI opval = MULSI (GET_H_GPR (FLD (f_r2)), GET_H_GPR (FLD (f_r3))); 1394 SET_H_GPR (FLD (f_r1), opval); 1395 CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval); 1396 } 1397 } 1398 if (ANDIF (GET_H_SYS_SR_OV (), GET_H_SYS_SR_OVE ())) { 1399 or1k32bf_exception (current_cpu, pc, EXCEPT_RANGE); 1400 } 1401 } 1402 1403 #undef FLD 1404 } 1405 NEXT (vpc); 1406 1407 CASE (sem, INSN_L_MULD) : /* l.muld $rA,$rB */ 1408 { 1409 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1410 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1411 #define FLD(f) abuf->fields.sfmt_l_sll.f 1412 int UNUSED written = 0; 1413 IADDR UNUSED pc = abuf->addr; 1414 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 1415 1416 { 1417 DI tmp_result; 1418 tmp_result = MULDI (EXTSIDI (GET_H_GPR (FLD (f_r2))), EXTSIDI (GET_H_GPR (FLD (f_r3)))); 1419 { 1420 SI opval = SUBWORDDISI (tmp_result, 0); 1421 SET_H_MAC_MACHI (opval); 1422 CGEN_TRACE_RESULT (current_cpu, abuf, "mac-machi", 'x', opval); 1423 } 1424 { 1425 SI opval = SUBWORDDISI (tmp_result, 1); 1426 SET_H_MAC_MACLO (opval); 1427 CGEN_TRACE_RESULT (current_cpu, abuf, "mac-maclo", 'x', opval); 1428 } 1429 } 1430 1431 #undef FLD 1432 } 1433 NEXT (vpc); 1434 1435 CASE (sem, INSN_L_MULU) : /* l.mulu $rD,$rA,$rB */ 1436 { 1437 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1438 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1439 #define FLD(f) abuf->fields.sfmt_l_sll.f 1440 int UNUSED written = 0; 1441 IADDR UNUSED pc = abuf->addr; 1442 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 1443 1444 { 1445 { 1446 { 1447 BI opval = MUL1OFSI (GET_H_GPR (FLD (f_r2)), GET_H_GPR (FLD (f_r3))); 1448 SET_H_SYS_SR_CY (opval); 1449 CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-cy", 'x', opval); 1450 } 1451 { 1452 USI opval = MULSI (GET_H_GPR (FLD (f_r2)), GET_H_GPR (FLD (f_r3))); 1453 SET_H_GPR (FLD (f_r1), opval); 1454 CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval); 1455 } 1456 } 1457 if (ANDIF (GET_H_SYS_SR_CY (), GET_H_SYS_SR_OVE ())) { 1458 or1k32bf_exception (current_cpu, pc, EXCEPT_RANGE); 1459 } 1460 } 1461 1462 #undef FLD 1463 } 1464 NEXT (vpc); 1465 1466 CASE (sem, INSN_L_MULDU) : /* l.muldu $rA,$rB */ 1467 { 1468 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1469 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1470 #define FLD(f) abuf->fields.sfmt_l_sll.f 1471 int UNUSED written = 0; 1472 IADDR UNUSED pc = abuf->addr; 1473 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 1474 1475 { 1476 DI tmp_result; 1477 tmp_result = MULDI (ZEXTSIDI (GET_H_GPR (FLD (f_r2))), ZEXTSIDI (GET_H_GPR (FLD (f_r3)))); 1478 { 1479 SI opval = SUBWORDDISI (tmp_result, 0); 1480 SET_H_MAC_MACHI (opval); 1481 CGEN_TRACE_RESULT (current_cpu, abuf, "mac-machi", 'x', opval); 1482 } 1483 { 1484 SI opval = SUBWORDDISI (tmp_result, 1); 1485 SET_H_MAC_MACLO (opval); 1486 CGEN_TRACE_RESULT (current_cpu, abuf, "mac-maclo", 'x', opval); 1487 } 1488 } 1489 1490 #undef FLD 1491 } 1492 NEXT (vpc); 1493 1494 CASE (sem, INSN_L_DIV) : /* l.div $rD,$rA,$rB */ 1495 { 1496 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1497 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1498 #define FLD(f) abuf->fields.sfmt_l_sll.f 1499 int UNUSED written = 0; 1500 IADDR UNUSED pc = abuf->addr; 1501 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 1502 1503 if (NESI (GET_H_GPR (FLD (f_r3)), 0)) { 1504 { 1505 { 1506 BI opval = 0; 1507 SET_H_SYS_SR_OV (opval); 1508 written |= (1 << 5); 1509 CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-ov", 'x', opval); 1510 } 1511 { 1512 SI opval = DIVSI (GET_H_GPR (FLD (f_r2)), GET_H_GPR (FLD (f_r3))); 1513 SET_H_GPR (FLD (f_r1), opval); 1514 written |= (1 << 4); 1515 CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval); 1516 } 1517 } 1518 } else { 1519 { 1520 { 1521 BI opval = 1; 1522 SET_H_SYS_SR_OV (opval); 1523 written |= (1 << 5); 1524 CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-ov", 'x', opval); 1525 } 1526 if (GET_H_SYS_SR_OVE ()) { 1527 or1k32bf_exception (current_cpu, pc, EXCEPT_RANGE); 1528 } 1529 } 1530 } 1531 1532 abuf->written = written; 1533 #undef FLD 1534 } 1535 NEXT (vpc); 1536 1537 CASE (sem, INSN_L_DIVU) : /* l.divu $rD,$rA,$rB */ 1538 { 1539 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1540 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1541 #define FLD(f) abuf->fields.sfmt_l_sll.f 1542 int UNUSED written = 0; 1543 IADDR UNUSED pc = abuf->addr; 1544 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 1545 1546 if (NESI (GET_H_GPR (FLD (f_r3)), 0)) { 1547 { 1548 { 1549 BI opval = 0; 1550 SET_H_SYS_SR_CY (opval); 1551 written |= (1 << 5); 1552 CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-cy", 'x', opval); 1553 } 1554 { 1555 USI opval = UDIVSI (GET_H_GPR (FLD (f_r2)), GET_H_GPR (FLD (f_r3))); 1556 SET_H_GPR (FLD (f_r1), opval); 1557 written |= (1 << 4); 1558 CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval); 1559 } 1560 } 1561 } else { 1562 { 1563 { 1564 BI opval = 1; 1565 SET_H_SYS_SR_CY (opval); 1566 written |= (1 << 5); 1567 CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-cy", 'x', opval); 1568 } 1569 if (GET_H_SYS_SR_OVE ()) { 1570 or1k32bf_exception (current_cpu, pc, EXCEPT_RANGE); 1571 } 1572 } 1573 } 1574 1575 abuf->written = written; 1576 #undef FLD 1577 } 1578 NEXT (vpc); 1579 1580 CASE (sem, INSN_L_FF1) : /* l.ff1 $rD,$rA */ 1581 { 1582 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1583 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1584 #define FLD(f) abuf->fields.sfmt_l_slli.f 1585 int UNUSED written = 0; 1586 IADDR UNUSED pc = abuf->addr; 1587 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 1588 1589 { 1590 USI opval = or1k32bf_ff1 (current_cpu, GET_H_GPR (FLD (f_r2))); 1591 SET_H_GPR (FLD (f_r1), opval); 1592 CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval); 1593 } 1594 1595 #undef FLD 1596 } 1597 NEXT (vpc); 1598 1599 CASE (sem, INSN_L_FL1) : /* l.fl1 $rD,$rA */ 1600 { 1601 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1602 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1603 #define FLD(f) abuf->fields.sfmt_l_slli.f 1604 int UNUSED written = 0; 1605 IADDR UNUSED pc = abuf->addr; 1606 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 1607 1608 { 1609 USI opval = or1k32bf_fl1 (current_cpu, GET_H_GPR (FLD (f_r2))); 1610 SET_H_GPR (FLD (f_r1), opval); 1611 CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval); 1612 } 1613 1614 #undef FLD 1615 } 1616 NEXT (vpc); 1617 1618 CASE (sem, INSN_L_ANDI) : /* l.andi $rD,$rA,$uimm16 */ 1619 { 1620 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1621 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1622 #define FLD(f) abuf->fields.sfmt_l_mfspr.f 1623 int UNUSED written = 0; 1624 IADDR UNUSED pc = abuf->addr; 1625 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 1626 1627 { 1628 USI opval = ANDSI (GET_H_GPR (FLD (f_r2)), ZEXTSISI (FLD (f_uimm16))); 1629 SET_H_GPR (FLD (f_r1), opval); 1630 CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval); 1631 } 1632 1633 #undef FLD 1634 } 1635 NEXT (vpc); 1636 1637 CASE (sem, INSN_L_ORI) : /* l.ori $rD,$rA,$uimm16 */ 1638 { 1639 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1640 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1641 #define FLD(f) abuf->fields.sfmt_l_mfspr.f 1642 int UNUSED written = 0; 1643 IADDR UNUSED pc = abuf->addr; 1644 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 1645 1646 { 1647 USI opval = ORSI (GET_H_GPR (FLD (f_r2)), ZEXTSISI (FLD (f_uimm16))); 1648 SET_H_GPR (FLD (f_r1), opval); 1649 CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval); 1650 } 1651 1652 #undef FLD 1653 } 1654 NEXT (vpc); 1655 1656 CASE (sem, INSN_L_XORI) : /* l.xori $rD,$rA,$simm16 */ 1657 { 1658 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1659 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1660 #define FLD(f) abuf->fields.sfmt_l_lwz.f 1661 int UNUSED written = 0; 1662 IADDR UNUSED pc = abuf->addr; 1663 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 1664 1665 { 1666 USI opval = XORSI (GET_H_GPR (FLD (f_r2)), EXTSISI (FLD (f_simm16))); 1667 SET_H_GPR (FLD (f_r1), opval); 1668 CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval); 1669 } 1670 1671 #undef FLD 1672 } 1673 NEXT (vpc); 1674 1675 CASE (sem, INSN_L_ADDI) : /* l.addi $rD,$rA,$simm16 */ 1676 { 1677 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1678 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1679 #define FLD(f) abuf->fields.sfmt_l_lwz.f 1680 int UNUSED written = 0; 1681 IADDR UNUSED pc = abuf->addr; 1682 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 1683 1684 { 1685 { 1686 { 1687 BI opval = ADDCFSI (GET_H_GPR (FLD (f_r2)), EXTSISI (FLD (f_simm16)), 0); 1688 SET_H_SYS_SR_CY (opval); 1689 CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-cy", 'x', opval); 1690 } 1691 { 1692 BI opval = ADDOFSI (GET_H_GPR (FLD (f_r2)), EXTSISI (FLD (f_simm16)), 0); 1693 SET_H_SYS_SR_OV (opval); 1694 CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-ov", 'x', opval); 1695 } 1696 { 1697 USI opval = ADDSI (GET_H_GPR (FLD (f_r2)), EXTSISI (FLD (f_simm16))); 1698 SET_H_GPR (FLD (f_r1), opval); 1699 CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval); 1700 } 1701 } 1702 if (ANDIF (GET_H_SYS_SR_OV (), GET_H_SYS_SR_OVE ())) { 1703 or1k32bf_exception (current_cpu, pc, EXCEPT_RANGE); 1704 } 1705 } 1706 1707 #undef FLD 1708 } 1709 NEXT (vpc); 1710 1711 CASE (sem, INSN_L_ADDIC) : /* l.addic $rD,$rA,$simm16 */ 1712 { 1713 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1714 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1715 #define FLD(f) abuf->fields.sfmt_l_lwz.f 1716 int UNUSED written = 0; 1717 IADDR UNUSED pc = abuf->addr; 1718 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 1719 1720 { 1721 { 1722 BI tmp_tmp_sys_sr_cy; 1723 tmp_tmp_sys_sr_cy = GET_H_SYS_SR_CY (); 1724 { 1725 BI opval = ADDCFSI (GET_H_GPR (FLD (f_r2)), EXTSISI (FLD (f_simm16)), tmp_tmp_sys_sr_cy); 1726 SET_H_SYS_SR_CY (opval); 1727 CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-cy", 'x', opval); 1728 } 1729 { 1730 BI opval = ADDOFSI (GET_H_GPR (FLD (f_r2)), EXTSISI (FLD (f_simm16)), tmp_tmp_sys_sr_cy); 1731 SET_H_SYS_SR_OV (opval); 1732 CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-ov", 'x', opval); 1733 } 1734 { 1735 SI opval = ADDCSI (GET_H_GPR (FLD (f_r2)), EXTSISI (FLD (f_simm16)), tmp_tmp_sys_sr_cy); 1736 SET_H_GPR (FLD (f_r1), opval); 1737 CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval); 1738 } 1739 } 1740 if (ANDIF (GET_H_SYS_SR_OV (), GET_H_SYS_SR_OVE ())) { 1741 or1k32bf_exception (current_cpu, pc, EXCEPT_RANGE); 1742 } 1743 } 1744 1745 #undef FLD 1746 } 1747 NEXT (vpc); 1748 1749 CASE (sem, INSN_L_MULI) : /* l.muli $rD,$rA,$simm16 */ 1750 { 1751 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1752 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1753 #define FLD(f) abuf->fields.sfmt_l_lwz.f 1754 int UNUSED written = 0; 1755 IADDR UNUSED pc = abuf->addr; 1756 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 1757 1758 { 1759 { 1760 { 1761 USI opval = MUL2OFSI (GET_H_GPR (FLD (f_r2)), EXTSISI (FLD (f_simm16))); 1762 SET_H_SYS_SR_OV (opval); 1763 CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-ov", 'x', opval); 1764 } 1765 { 1766 USI opval = MULSI (GET_H_GPR (FLD (f_r2)), EXTSISI (FLD (f_simm16))); 1767 SET_H_GPR (FLD (f_r1), opval); 1768 CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval); 1769 } 1770 } 1771 if (ANDIF (GET_H_SYS_SR_OV (), GET_H_SYS_SR_OVE ())) { 1772 or1k32bf_exception (current_cpu, pc, EXCEPT_RANGE); 1773 } 1774 } 1775 1776 #undef FLD 1777 } 1778 NEXT (vpc); 1779 1780 CASE (sem, INSN_L_EXTHS) : /* l.exths $rD,$rA */ 1781 { 1782 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1783 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1784 #define FLD(f) abuf->fields.sfmt_l_slli.f 1785 int UNUSED written = 0; 1786 IADDR UNUSED pc = abuf->addr; 1787 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 1788 1789 { 1790 USI opval = EXTHISI (TRUNCSIHI (GET_H_GPR (FLD (f_r2)))); 1791 SET_H_GPR (FLD (f_r1), opval); 1792 CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval); 1793 } 1794 1795 #undef FLD 1796 } 1797 NEXT (vpc); 1798 1799 CASE (sem, INSN_L_EXTBS) : /* l.extbs $rD,$rA */ 1800 { 1801 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1802 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1803 #define FLD(f) abuf->fields.sfmt_l_slli.f 1804 int UNUSED written = 0; 1805 IADDR UNUSED pc = abuf->addr; 1806 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 1807 1808 { 1809 USI opval = EXTQISI (TRUNCSIQI (GET_H_GPR (FLD (f_r2)))); 1810 SET_H_GPR (FLD (f_r1), opval); 1811 CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval); 1812 } 1813 1814 #undef FLD 1815 } 1816 NEXT (vpc); 1817 1818 CASE (sem, INSN_L_EXTHZ) : /* l.exthz $rD,$rA */ 1819 { 1820 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1821 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1822 #define FLD(f) abuf->fields.sfmt_l_slli.f 1823 int UNUSED written = 0; 1824 IADDR UNUSED pc = abuf->addr; 1825 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 1826 1827 { 1828 USI opval = ZEXTHISI (TRUNCSIHI (GET_H_GPR (FLD (f_r2)))); 1829 SET_H_GPR (FLD (f_r1), opval); 1830 CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval); 1831 } 1832 1833 #undef FLD 1834 } 1835 NEXT (vpc); 1836 1837 CASE (sem, INSN_L_EXTBZ) : /* l.extbz $rD,$rA */ 1838 { 1839 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1840 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1841 #define FLD(f) abuf->fields.sfmt_l_slli.f 1842 int UNUSED written = 0; 1843 IADDR UNUSED pc = abuf->addr; 1844 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 1845 1846 { 1847 USI opval = ZEXTQISI (TRUNCSIQI (GET_H_GPR (FLD (f_r2)))); 1848 SET_H_GPR (FLD (f_r1), opval); 1849 CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval); 1850 } 1851 1852 #undef FLD 1853 } 1854 NEXT (vpc); 1855 1856 CASE (sem, INSN_L_EXTWS) : /* l.extws $rD,$rA */ 1857 { 1858 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1859 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1860 #define FLD(f) abuf->fields.sfmt_l_slli.f 1861 int UNUSED written = 0; 1862 IADDR UNUSED pc = abuf->addr; 1863 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 1864 1865 { 1866 USI opval = EXTSISI (TRUNCSISI (GET_H_GPR (FLD (f_r2)))); 1867 SET_H_GPR (FLD (f_r1), opval); 1868 CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval); 1869 } 1870 1871 #undef FLD 1872 } 1873 NEXT (vpc); 1874 1875 CASE (sem, INSN_L_EXTWZ) : /* l.extwz $rD,$rA */ 1876 { 1877 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1878 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1879 #define FLD(f) abuf->fields.sfmt_l_slli.f 1880 int UNUSED written = 0; 1881 IADDR UNUSED pc = abuf->addr; 1882 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 1883 1884 { 1885 USI opval = ZEXTSISI (TRUNCSISI (GET_H_GPR (FLD (f_r2)))); 1886 SET_H_GPR (FLD (f_r1), opval); 1887 CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval); 1888 } 1889 1890 #undef FLD 1891 } 1892 NEXT (vpc); 1893 1894 CASE (sem, INSN_L_CMOV) : /* l.cmov $rD,$rA,$rB */ 1895 { 1896 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1897 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1898 #define FLD(f) abuf->fields.sfmt_l_sll.f 1899 int UNUSED written = 0; 1900 IADDR UNUSED pc = abuf->addr; 1901 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 1902 1903 if (GET_H_SYS_SR_F ()) { 1904 { 1905 USI opval = GET_H_GPR (FLD (f_r2)); 1906 SET_H_GPR (FLD (f_r1), opval); 1907 written |= (1 << 3); 1908 CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval); 1909 } 1910 } else { 1911 { 1912 USI opval = GET_H_GPR (FLD (f_r3)); 1913 SET_H_GPR (FLD (f_r1), opval); 1914 written |= (1 << 3); 1915 CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval); 1916 } 1917 } 1918 1919 abuf->written = written; 1920 #undef FLD 1921 } 1922 NEXT (vpc); 1923 1924 CASE (sem, INSN_L_SFGTS) : /* l.sfgts $rA,$rB */ 1925 { 1926 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1927 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1928 #define FLD(f) abuf->fields.sfmt_l_sll.f 1929 int UNUSED written = 0; 1930 IADDR UNUSED pc = abuf->addr; 1931 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 1932 1933 { 1934 USI opval = GTSI (GET_H_GPR (FLD (f_r2)), GET_H_GPR (FLD (f_r3))); 1935 SET_H_SYS_SR_F (opval); 1936 CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-f", 'x', opval); 1937 } 1938 1939 #undef FLD 1940 } 1941 NEXT (vpc); 1942 1943 CASE (sem, INSN_L_SFGTSI) : /* l.sfgtsi $rA,$simm16 */ 1944 { 1945 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1946 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1947 #define FLD(f) abuf->fields.sfmt_l_lwz.f 1948 int UNUSED written = 0; 1949 IADDR UNUSED pc = abuf->addr; 1950 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 1951 1952 { 1953 USI opval = GTSI (GET_H_GPR (FLD (f_r2)), EXTSISI (FLD (f_simm16))); 1954 SET_H_SYS_SR_F (opval); 1955 CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-f", 'x', opval); 1956 } 1957 1958 #undef FLD 1959 } 1960 NEXT (vpc); 1961 1962 CASE (sem, INSN_L_SFGTU) : /* l.sfgtu $rA,$rB */ 1963 { 1964 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1965 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1966 #define FLD(f) abuf->fields.sfmt_l_sll.f 1967 int UNUSED written = 0; 1968 IADDR UNUSED pc = abuf->addr; 1969 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 1970 1971 { 1972 USI opval = GTUSI (GET_H_GPR (FLD (f_r2)), GET_H_GPR (FLD (f_r3))); 1973 SET_H_SYS_SR_F (opval); 1974 CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-f", 'x', opval); 1975 } 1976 1977 #undef FLD 1978 } 1979 NEXT (vpc); 1980 1981 CASE (sem, INSN_L_SFGTUI) : /* l.sfgtui $rA,$simm16 */ 1982 { 1983 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 1984 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 1985 #define FLD(f) abuf->fields.sfmt_l_lwz.f 1986 int UNUSED written = 0; 1987 IADDR UNUSED pc = abuf->addr; 1988 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 1989 1990 { 1991 USI opval = GTUSI (GET_H_GPR (FLD (f_r2)), EXTSISI (FLD (f_simm16))); 1992 SET_H_SYS_SR_F (opval); 1993 CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-f", 'x', opval); 1994 } 1995 1996 #undef FLD 1997 } 1998 NEXT (vpc); 1999 2000 CASE (sem, INSN_L_SFGES) : /* l.sfges $rA,$rB */ 2001 { 2002 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2003 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2004 #define FLD(f) abuf->fields.sfmt_l_sll.f 2005 int UNUSED written = 0; 2006 IADDR UNUSED pc = abuf->addr; 2007 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2008 2009 { 2010 USI opval = GESI (GET_H_GPR (FLD (f_r2)), GET_H_GPR (FLD (f_r3))); 2011 SET_H_SYS_SR_F (opval); 2012 CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-f", 'x', opval); 2013 } 2014 2015 #undef FLD 2016 } 2017 NEXT (vpc); 2018 2019 CASE (sem, INSN_L_SFGESI) : /* l.sfgesi $rA,$simm16 */ 2020 { 2021 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2022 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2023 #define FLD(f) abuf->fields.sfmt_l_lwz.f 2024 int UNUSED written = 0; 2025 IADDR UNUSED pc = abuf->addr; 2026 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2027 2028 { 2029 USI opval = GESI (GET_H_GPR (FLD (f_r2)), EXTSISI (FLD (f_simm16))); 2030 SET_H_SYS_SR_F (opval); 2031 CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-f", 'x', opval); 2032 } 2033 2034 #undef FLD 2035 } 2036 NEXT (vpc); 2037 2038 CASE (sem, INSN_L_SFGEU) : /* l.sfgeu $rA,$rB */ 2039 { 2040 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2041 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2042 #define FLD(f) abuf->fields.sfmt_l_sll.f 2043 int UNUSED written = 0; 2044 IADDR UNUSED pc = abuf->addr; 2045 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2046 2047 { 2048 USI opval = GEUSI (GET_H_GPR (FLD (f_r2)), GET_H_GPR (FLD (f_r3))); 2049 SET_H_SYS_SR_F (opval); 2050 CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-f", 'x', opval); 2051 } 2052 2053 #undef FLD 2054 } 2055 NEXT (vpc); 2056 2057 CASE (sem, INSN_L_SFGEUI) : /* l.sfgeui $rA,$simm16 */ 2058 { 2059 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2060 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2061 #define FLD(f) abuf->fields.sfmt_l_lwz.f 2062 int UNUSED written = 0; 2063 IADDR UNUSED pc = abuf->addr; 2064 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2065 2066 { 2067 USI opval = GEUSI (GET_H_GPR (FLD (f_r2)), EXTSISI (FLD (f_simm16))); 2068 SET_H_SYS_SR_F (opval); 2069 CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-f", 'x', opval); 2070 } 2071 2072 #undef FLD 2073 } 2074 NEXT (vpc); 2075 2076 CASE (sem, INSN_L_SFLTS) : /* l.sflts $rA,$rB */ 2077 { 2078 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2079 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2080 #define FLD(f) abuf->fields.sfmt_l_sll.f 2081 int UNUSED written = 0; 2082 IADDR UNUSED pc = abuf->addr; 2083 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2084 2085 { 2086 USI opval = LTSI (GET_H_GPR (FLD (f_r2)), GET_H_GPR (FLD (f_r3))); 2087 SET_H_SYS_SR_F (opval); 2088 CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-f", 'x', opval); 2089 } 2090 2091 #undef FLD 2092 } 2093 NEXT (vpc); 2094 2095 CASE (sem, INSN_L_SFLTSI) : /* l.sfltsi $rA,$simm16 */ 2096 { 2097 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2098 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2099 #define FLD(f) abuf->fields.sfmt_l_lwz.f 2100 int UNUSED written = 0; 2101 IADDR UNUSED pc = abuf->addr; 2102 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2103 2104 { 2105 USI opval = LTSI (GET_H_GPR (FLD (f_r2)), EXTSISI (FLD (f_simm16))); 2106 SET_H_SYS_SR_F (opval); 2107 CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-f", 'x', opval); 2108 } 2109 2110 #undef FLD 2111 } 2112 NEXT (vpc); 2113 2114 CASE (sem, INSN_L_SFLTU) : /* l.sfltu $rA,$rB */ 2115 { 2116 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2117 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2118 #define FLD(f) abuf->fields.sfmt_l_sll.f 2119 int UNUSED written = 0; 2120 IADDR UNUSED pc = abuf->addr; 2121 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2122 2123 { 2124 USI opval = LTUSI (GET_H_GPR (FLD (f_r2)), GET_H_GPR (FLD (f_r3))); 2125 SET_H_SYS_SR_F (opval); 2126 CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-f", 'x', opval); 2127 } 2128 2129 #undef FLD 2130 } 2131 NEXT (vpc); 2132 2133 CASE (sem, INSN_L_SFLTUI) : /* l.sfltui $rA,$simm16 */ 2134 { 2135 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2136 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2137 #define FLD(f) abuf->fields.sfmt_l_lwz.f 2138 int UNUSED written = 0; 2139 IADDR UNUSED pc = abuf->addr; 2140 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2141 2142 { 2143 USI opval = LTUSI (GET_H_GPR (FLD (f_r2)), EXTSISI (FLD (f_simm16))); 2144 SET_H_SYS_SR_F (opval); 2145 CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-f", 'x', opval); 2146 } 2147 2148 #undef FLD 2149 } 2150 NEXT (vpc); 2151 2152 CASE (sem, INSN_L_SFLES) : /* l.sfles $rA,$rB */ 2153 { 2154 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2155 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2156 #define FLD(f) abuf->fields.sfmt_l_sll.f 2157 int UNUSED written = 0; 2158 IADDR UNUSED pc = abuf->addr; 2159 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2160 2161 { 2162 USI opval = LESI (GET_H_GPR (FLD (f_r2)), GET_H_GPR (FLD (f_r3))); 2163 SET_H_SYS_SR_F (opval); 2164 CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-f", 'x', opval); 2165 } 2166 2167 #undef FLD 2168 } 2169 NEXT (vpc); 2170 2171 CASE (sem, INSN_L_SFLESI) : /* l.sflesi $rA,$simm16 */ 2172 { 2173 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2174 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2175 #define FLD(f) abuf->fields.sfmt_l_lwz.f 2176 int UNUSED written = 0; 2177 IADDR UNUSED pc = abuf->addr; 2178 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2179 2180 { 2181 USI opval = LESI (GET_H_GPR (FLD (f_r2)), EXTSISI (FLD (f_simm16))); 2182 SET_H_SYS_SR_F (opval); 2183 CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-f", 'x', opval); 2184 } 2185 2186 #undef FLD 2187 } 2188 NEXT (vpc); 2189 2190 CASE (sem, INSN_L_SFLEU) : /* l.sfleu $rA,$rB */ 2191 { 2192 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2193 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2194 #define FLD(f) abuf->fields.sfmt_l_sll.f 2195 int UNUSED written = 0; 2196 IADDR UNUSED pc = abuf->addr; 2197 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2198 2199 { 2200 USI opval = LEUSI (GET_H_GPR (FLD (f_r2)), GET_H_GPR (FLD (f_r3))); 2201 SET_H_SYS_SR_F (opval); 2202 CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-f", 'x', opval); 2203 } 2204 2205 #undef FLD 2206 } 2207 NEXT (vpc); 2208 2209 CASE (sem, INSN_L_SFLEUI) : /* l.sfleui $rA,$simm16 */ 2210 { 2211 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2212 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2213 #define FLD(f) abuf->fields.sfmt_l_lwz.f 2214 int UNUSED written = 0; 2215 IADDR UNUSED pc = abuf->addr; 2216 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2217 2218 { 2219 USI opval = LEUSI (GET_H_GPR (FLD (f_r2)), EXTSISI (FLD (f_simm16))); 2220 SET_H_SYS_SR_F (opval); 2221 CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-f", 'x', opval); 2222 } 2223 2224 #undef FLD 2225 } 2226 NEXT (vpc); 2227 2228 CASE (sem, INSN_L_SFEQ) : /* l.sfeq $rA,$rB */ 2229 { 2230 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2231 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2232 #define FLD(f) abuf->fields.sfmt_l_sll.f 2233 int UNUSED written = 0; 2234 IADDR UNUSED pc = abuf->addr; 2235 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2236 2237 { 2238 USI opval = EQSI (GET_H_GPR (FLD (f_r2)), GET_H_GPR (FLD (f_r3))); 2239 SET_H_SYS_SR_F (opval); 2240 CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-f", 'x', opval); 2241 } 2242 2243 #undef FLD 2244 } 2245 NEXT (vpc); 2246 2247 CASE (sem, INSN_L_SFEQI) : /* l.sfeqi $rA,$simm16 */ 2248 { 2249 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2250 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2251 #define FLD(f) abuf->fields.sfmt_l_lwz.f 2252 int UNUSED written = 0; 2253 IADDR UNUSED pc = abuf->addr; 2254 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2255 2256 { 2257 USI opval = EQSI (GET_H_GPR (FLD (f_r2)), EXTSISI (FLD (f_simm16))); 2258 SET_H_SYS_SR_F (opval); 2259 CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-f", 'x', opval); 2260 } 2261 2262 #undef FLD 2263 } 2264 NEXT (vpc); 2265 2266 CASE (sem, INSN_L_SFNE) : /* l.sfne $rA,$rB */ 2267 { 2268 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2269 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2270 #define FLD(f) abuf->fields.sfmt_l_sll.f 2271 int UNUSED written = 0; 2272 IADDR UNUSED pc = abuf->addr; 2273 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2274 2275 { 2276 USI opval = NESI (GET_H_GPR (FLD (f_r2)), GET_H_GPR (FLD (f_r3))); 2277 SET_H_SYS_SR_F (opval); 2278 CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-f", 'x', opval); 2279 } 2280 2281 #undef FLD 2282 } 2283 NEXT (vpc); 2284 2285 CASE (sem, INSN_L_SFNEI) : /* l.sfnei $rA,$simm16 */ 2286 { 2287 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2288 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2289 #define FLD(f) abuf->fields.sfmt_l_lwz.f 2290 int UNUSED written = 0; 2291 IADDR UNUSED pc = abuf->addr; 2292 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2293 2294 { 2295 USI opval = NESI (GET_H_GPR (FLD (f_r2)), EXTSISI (FLD (f_simm16))); 2296 SET_H_SYS_SR_F (opval); 2297 CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-f", 'x', opval); 2298 } 2299 2300 #undef FLD 2301 } 2302 NEXT (vpc); 2303 2304 CASE (sem, INSN_L_MAC) : /* l.mac $rA,$rB */ 2305 { 2306 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2307 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2308 #define FLD(f) abuf->fields.sfmt_l_sll.f 2309 int UNUSED written = 0; 2310 IADDR UNUSED pc = abuf->addr; 2311 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2312 2313 { 2314 { 2315 DI tmp_prod; 2316 DI tmp_mac; 2317 DI tmp_result; 2318 tmp_prod = MULDI (EXTSIDI (GET_H_GPR (FLD (f_r2))), EXTSIDI (GET_H_GPR (FLD (f_r3)))); 2319 tmp_mac = JOINSIDI (GET_H_MAC_MACHI (), GET_H_MAC_MACLO ()); 2320 tmp_result = ADDDI (tmp_prod, tmp_mac); 2321 { 2322 SI opval = SUBWORDDISI (tmp_result, 0); 2323 SET_H_MAC_MACHI (opval); 2324 CGEN_TRACE_RESULT (current_cpu, abuf, "mac-machi", 'x', opval); 2325 } 2326 { 2327 SI opval = SUBWORDDISI (tmp_result, 1); 2328 SET_H_MAC_MACLO (opval); 2329 CGEN_TRACE_RESULT (current_cpu, abuf, "mac-maclo", 'x', opval); 2330 } 2331 { 2332 BI opval = ADDOFDI (tmp_prod, tmp_mac, 0); 2333 SET_H_SYS_SR_OV (opval); 2334 CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-ov", 'x', opval); 2335 } 2336 } 2337 if (ANDIF (GET_H_SYS_SR_OV (), GET_H_SYS_SR_OVE ())) { 2338 or1k32bf_exception (current_cpu, pc, EXCEPT_RANGE); 2339 } 2340 } 2341 2342 #undef FLD 2343 } 2344 NEXT (vpc); 2345 2346 CASE (sem, INSN_L_MACI) : /* l.maci $rA,${simm16} */ 2347 { 2348 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2349 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2350 #define FLD(f) abuf->fields.sfmt_l_lwz.f 2351 int UNUSED written = 0; 2352 IADDR UNUSED pc = abuf->addr; 2353 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2354 2355 { 2356 { 2357 DI tmp_prod; 2358 DI tmp_mac; 2359 DI tmp_result; 2360 tmp_prod = MULDI (EXTSIDI (GET_H_GPR (FLD (f_r2))), EXTSIDI (FLD (f_simm16))); 2361 tmp_mac = JOINSIDI (GET_H_MAC_MACHI (), GET_H_MAC_MACLO ()); 2362 tmp_result = ADDDI (tmp_mac, tmp_prod); 2363 { 2364 SI opval = SUBWORDDISI (tmp_result, 0); 2365 SET_H_MAC_MACHI (opval); 2366 CGEN_TRACE_RESULT (current_cpu, abuf, "mac-machi", 'x', opval); 2367 } 2368 { 2369 SI opval = SUBWORDDISI (tmp_result, 1); 2370 SET_H_MAC_MACLO (opval); 2371 CGEN_TRACE_RESULT (current_cpu, abuf, "mac-maclo", 'x', opval); 2372 } 2373 { 2374 BI opval = ADDOFDI (tmp_prod, tmp_mac, 0); 2375 SET_H_SYS_SR_OV (opval); 2376 CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-ov", 'x', opval); 2377 } 2378 } 2379 if (ANDIF (GET_H_SYS_SR_OV (), GET_H_SYS_SR_OVE ())) { 2380 or1k32bf_exception (current_cpu, pc, EXCEPT_RANGE); 2381 } 2382 } 2383 2384 #undef FLD 2385 } 2386 NEXT (vpc); 2387 2388 CASE (sem, INSN_L_MACU) : /* l.macu $rA,$rB */ 2389 { 2390 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2391 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2392 #define FLD(f) abuf->fields.sfmt_l_sll.f 2393 int UNUSED written = 0; 2394 IADDR UNUSED pc = abuf->addr; 2395 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2396 2397 { 2398 { 2399 DI tmp_prod; 2400 DI tmp_mac; 2401 DI tmp_result; 2402 tmp_prod = MULDI (ZEXTSIDI (GET_H_GPR (FLD (f_r2))), ZEXTSIDI (GET_H_GPR (FLD (f_r3)))); 2403 tmp_mac = JOINSIDI (GET_H_MAC_MACHI (), GET_H_MAC_MACLO ()); 2404 tmp_result = ADDDI (tmp_prod, tmp_mac); 2405 { 2406 SI opval = SUBWORDDISI (tmp_result, 0); 2407 SET_H_MAC_MACHI (opval); 2408 CGEN_TRACE_RESULT (current_cpu, abuf, "mac-machi", 'x', opval); 2409 } 2410 { 2411 SI opval = SUBWORDDISI (tmp_result, 1); 2412 SET_H_MAC_MACLO (opval); 2413 CGEN_TRACE_RESULT (current_cpu, abuf, "mac-maclo", 'x', opval); 2414 } 2415 { 2416 BI opval = ADDCFDI (tmp_prod, tmp_mac, 0); 2417 SET_H_SYS_SR_CY (opval); 2418 CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-cy", 'x', opval); 2419 } 2420 } 2421 if (ANDIF (GET_H_SYS_SR_CY (), GET_H_SYS_SR_OVE ())) { 2422 or1k32bf_exception (current_cpu, pc, EXCEPT_RANGE); 2423 } 2424 } 2425 2426 #undef FLD 2427 } 2428 NEXT (vpc); 2429 2430 CASE (sem, INSN_L_MSB) : /* l.msb $rA,$rB */ 2431 { 2432 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2433 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2434 #define FLD(f) abuf->fields.sfmt_l_sll.f 2435 int UNUSED written = 0; 2436 IADDR UNUSED pc = abuf->addr; 2437 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2438 2439 { 2440 { 2441 DI tmp_prod; 2442 DI tmp_mac; 2443 DI tmp_result; 2444 tmp_prod = MULDI (EXTSIDI (GET_H_GPR (FLD (f_r2))), EXTSIDI (GET_H_GPR (FLD (f_r3)))); 2445 tmp_mac = JOINSIDI (GET_H_MAC_MACHI (), GET_H_MAC_MACLO ()); 2446 tmp_result = SUBDI (tmp_mac, tmp_prod); 2447 { 2448 SI opval = SUBWORDDISI (tmp_result, 0); 2449 SET_H_MAC_MACHI (opval); 2450 CGEN_TRACE_RESULT (current_cpu, abuf, "mac-machi", 'x', opval); 2451 } 2452 { 2453 SI opval = SUBWORDDISI (tmp_result, 1); 2454 SET_H_MAC_MACLO (opval); 2455 CGEN_TRACE_RESULT (current_cpu, abuf, "mac-maclo", 'x', opval); 2456 } 2457 { 2458 BI opval = SUBOFDI (tmp_mac, tmp_result, 0); 2459 SET_H_SYS_SR_OV (opval); 2460 CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-ov", 'x', opval); 2461 } 2462 } 2463 if (ANDIF (GET_H_SYS_SR_OV (), GET_H_SYS_SR_OVE ())) { 2464 or1k32bf_exception (current_cpu, pc, EXCEPT_RANGE); 2465 } 2466 } 2467 2468 #undef FLD 2469 } 2470 NEXT (vpc); 2471 2472 CASE (sem, INSN_L_MSBU) : /* l.msbu $rA,$rB */ 2473 { 2474 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2475 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2476 #define FLD(f) abuf->fields.sfmt_l_sll.f 2477 int UNUSED written = 0; 2478 IADDR UNUSED pc = abuf->addr; 2479 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2480 2481 { 2482 { 2483 DI tmp_prod; 2484 DI tmp_mac; 2485 DI tmp_result; 2486 tmp_prod = MULDI (ZEXTSIDI (GET_H_GPR (FLD (f_r2))), ZEXTSIDI (GET_H_GPR (FLD (f_r3)))); 2487 tmp_mac = JOINSIDI (GET_H_MAC_MACHI (), GET_H_MAC_MACLO ()); 2488 tmp_result = SUBDI (tmp_mac, tmp_prod); 2489 { 2490 SI opval = SUBWORDDISI (tmp_result, 0); 2491 SET_H_MAC_MACHI (opval); 2492 CGEN_TRACE_RESULT (current_cpu, abuf, "mac-machi", 'x', opval); 2493 } 2494 { 2495 SI opval = SUBWORDDISI (tmp_result, 1); 2496 SET_H_MAC_MACLO (opval); 2497 CGEN_TRACE_RESULT (current_cpu, abuf, "mac-maclo", 'x', opval); 2498 } 2499 { 2500 BI opval = SUBCFDI (tmp_mac, tmp_result, 0); 2501 SET_H_SYS_SR_CY (opval); 2502 CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-cy", 'x', opval); 2503 } 2504 } 2505 if (ANDIF (GET_H_SYS_SR_CY (), GET_H_SYS_SR_OVE ())) { 2506 or1k32bf_exception (current_cpu, pc, EXCEPT_RANGE); 2507 } 2508 } 2509 2510 #undef FLD 2511 } 2512 NEXT (vpc); 2513 2514 CASE (sem, INSN_L_CUST1) : /* l.cust1 */ 2515 { 2516 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2517 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2518 #define FLD(f) abuf->fields.sfmt_empty.f 2519 int UNUSED written = 0; 2520 IADDR UNUSED pc = abuf->addr; 2521 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2522 2523 ((void) 0); /*nop*/ 2524 2525 #undef FLD 2526 } 2527 NEXT (vpc); 2528 2529 CASE (sem, INSN_L_CUST2) : /* l.cust2 */ 2530 { 2531 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2532 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2533 #define FLD(f) abuf->fields.sfmt_empty.f 2534 int UNUSED written = 0; 2535 IADDR UNUSED pc = abuf->addr; 2536 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2537 2538 ((void) 0); /*nop*/ 2539 2540 #undef FLD 2541 } 2542 NEXT (vpc); 2543 2544 CASE (sem, INSN_L_CUST3) : /* l.cust3 */ 2545 { 2546 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2547 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2548 #define FLD(f) abuf->fields.sfmt_empty.f 2549 int UNUSED written = 0; 2550 IADDR UNUSED pc = abuf->addr; 2551 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2552 2553 ((void) 0); /*nop*/ 2554 2555 #undef FLD 2556 } 2557 NEXT (vpc); 2558 2559 CASE (sem, INSN_L_CUST4) : /* l.cust4 */ 2560 { 2561 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2562 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2563 #define FLD(f) abuf->fields.sfmt_empty.f 2564 int UNUSED written = 0; 2565 IADDR UNUSED pc = abuf->addr; 2566 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2567 2568 ((void) 0); /*nop*/ 2569 2570 #undef FLD 2571 } 2572 NEXT (vpc); 2573 2574 CASE (sem, INSN_L_CUST5) : /* l.cust5 */ 2575 { 2576 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2577 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2578 #define FLD(f) abuf->fields.sfmt_empty.f 2579 int UNUSED written = 0; 2580 IADDR UNUSED pc = abuf->addr; 2581 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2582 2583 ((void) 0); /*nop*/ 2584 2585 #undef FLD 2586 } 2587 NEXT (vpc); 2588 2589 CASE (sem, INSN_L_CUST6) : /* l.cust6 */ 2590 { 2591 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2592 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2593 #define FLD(f) abuf->fields.sfmt_empty.f 2594 int UNUSED written = 0; 2595 IADDR UNUSED pc = abuf->addr; 2596 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2597 2598 ((void) 0); /*nop*/ 2599 2600 #undef FLD 2601 } 2602 NEXT (vpc); 2603 2604 CASE (sem, INSN_L_CUST7) : /* l.cust7 */ 2605 { 2606 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2607 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2608 #define FLD(f) abuf->fields.sfmt_empty.f 2609 int UNUSED written = 0; 2610 IADDR UNUSED pc = abuf->addr; 2611 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2612 2613 ((void) 0); /*nop*/ 2614 2615 #undef FLD 2616 } 2617 NEXT (vpc); 2618 2619 CASE (sem, INSN_L_CUST8) : /* l.cust8 */ 2620 { 2621 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2622 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2623 #define FLD(f) abuf->fields.sfmt_empty.f 2624 int UNUSED written = 0; 2625 IADDR UNUSED pc = abuf->addr; 2626 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2627 2628 ((void) 0); /*nop*/ 2629 2630 #undef FLD 2631 } 2632 NEXT (vpc); 2633 2634 CASE (sem, INSN_LF_ADD_S) : /* lf.add.s $rDSF,$rASF,$rBSF */ 2635 { 2636 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2637 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2638 #define FLD(f) abuf->fields.sfmt_l_sll.f 2639 int UNUSED written = 0; 2640 IADDR UNUSED pc = abuf->addr; 2641 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2642 2643 { 2644 SF opval = CGEN_CPU_FPU (current_cpu)->ops->addsf (CGEN_CPU_FPU (current_cpu), GET_H_FSR (FLD (f_r2)), GET_H_FSR (FLD (f_r3))); 2645 SET_H_FSR (FLD (f_r1), opval); 2646 CGEN_TRACE_RESULT (current_cpu, abuf, "fsr", 'f', opval); 2647 } 2648 2649 #undef FLD 2650 } 2651 NEXT (vpc); 2652 2653 CASE (sem, INSN_LF_SUB_S) : /* lf.sub.s $rDSF,$rASF,$rBSF */ 2654 { 2655 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2656 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2657 #define FLD(f) abuf->fields.sfmt_l_sll.f 2658 int UNUSED written = 0; 2659 IADDR UNUSED pc = abuf->addr; 2660 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2661 2662 { 2663 SF opval = CGEN_CPU_FPU (current_cpu)->ops->subsf (CGEN_CPU_FPU (current_cpu), GET_H_FSR (FLD (f_r2)), GET_H_FSR (FLD (f_r3))); 2664 SET_H_FSR (FLD (f_r1), opval); 2665 CGEN_TRACE_RESULT (current_cpu, abuf, "fsr", 'f', opval); 2666 } 2667 2668 #undef FLD 2669 } 2670 NEXT (vpc); 2671 2672 CASE (sem, INSN_LF_MUL_S) : /* lf.mul.s $rDSF,$rASF,$rBSF */ 2673 { 2674 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2675 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2676 #define FLD(f) abuf->fields.sfmt_l_sll.f 2677 int UNUSED written = 0; 2678 IADDR UNUSED pc = abuf->addr; 2679 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2680 2681 { 2682 SF opval = CGEN_CPU_FPU (current_cpu)->ops->mulsf (CGEN_CPU_FPU (current_cpu), GET_H_FSR (FLD (f_r2)), GET_H_FSR (FLD (f_r3))); 2683 SET_H_FSR (FLD (f_r1), opval); 2684 CGEN_TRACE_RESULT (current_cpu, abuf, "fsr", 'f', opval); 2685 } 2686 2687 #undef FLD 2688 } 2689 NEXT (vpc); 2690 2691 CASE (sem, INSN_LF_DIV_S) : /* lf.div.s $rDSF,$rASF,$rBSF */ 2692 { 2693 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2694 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2695 #define FLD(f) abuf->fields.sfmt_l_sll.f 2696 int UNUSED written = 0; 2697 IADDR UNUSED pc = abuf->addr; 2698 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2699 2700 { 2701 SF opval = CGEN_CPU_FPU (current_cpu)->ops->divsf (CGEN_CPU_FPU (current_cpu), GET_H_FSR (FLD (f_r2)), GET_H_FSR (FLD (f_r3))); 2702 SET_H_FSR (FLD (f_r1), opval); 2703 CGEN_TRACE_RESULT (current_cpu, abuf, "fsr", 'f', opval); 2704 } 2705 2706 #undef FLD 2707 } 2708 NEXT (vpc); 2709 2710 CASE (sem, INSN_LF_REM_S) : /* lf.rem.s $rDSF,$rASF,$rBSF */ 2711 { 2712 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2713 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2714 #define FLD(f) abuf->fields.sfmt_l_sll.f 2715 int UNUSED written = 0; 2716 IADDR UNUSED pc = abuf->addr; 2717 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2718 2719 { 2720 SF opval = CGEN_CPU_FPU (current_cpu)->ops->remsf (CGEN_CPU_FPU (current_cpu), GET_H_FSR (FLD (f_r2)), GET_H_FSR (FLD (f_r3))); 2721 SET_H_FSR (FLD (f_r1), opval); 2722 CGEN_TRACE_RESULT (current_cpu, abuf, "fsr", 'f', opval); 2723 } 2724 2725 #undef FLD 2726 } 2727 NEXT (vpc); 2728 2729 CASE (sem, INSN_LF_ITOF_S) : /* lf.itof.s $rDSF,$rA */ 2730 { 2731 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2732 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2733 #define FLD(f) abuf->fields.sfmt_l_slli.f 2734 int UNUSED written = 0; 2735 IADDR UNUSED pc = abuf->addr; 2736 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2737 2738 { 2739 SF opval = CGEN_CPU_FPU (current_cpu)->ops->floatsisf (CGEN_CPU_FPU (current_cpu), (GET_H_SYS_FPCSR_RM () == 0) ? (1) : (GET_H_SYS_FPCSR_RM () == 1) ? (3) : (GET_H_SYS_FPCSR_RM () == 2) ? (4) : (5), TRUNCSISI (GET_H_GPR (FLD (f_r2)))); 2740 SET_H_FSR (FLD (f_r1), opval); 2741 CGEN_TRACE_RESULT (current_cpu, abuf, "fsr", 'f', opval); 2742 } 2743 2744 #undef FLD 2745 } 2746 NEXT (vpc); 2747 2748 CASE (sem, INSN_LF_FTOI_S) : /* lf.ftoi.s $rD,$rASF */ 2749 { 2750 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2751 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2752 #define FLD(f) abuf->fields.sfmt_l_slli.f 2753 int UNUSED written = 0; 2754 IADDR UNUSED pc = abuf->addr; 2755 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2756 2757 { 2758 SI opval = EXTSISI (CGEN_CPU_FPU (current_cpu)->ops->fixsfsi (CGEN_CPU_FPU (current_cpu), (GET_H_SYS_FPCSR_RM () == 0) ? (1) : (GET_H_SYS_FPCSR_RM () == 1) ? (3) : (GET_H_SYS_FPCSR_RM () == 2) ? (4) : (5), GET_H_FSR (FLD (f_r2)))); 2759 SET_H_GPR (FLD (f_r1), opval); 2760 CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval); 2761 } 2762 2763 #undef FLD 2764 } 2765 NEXT (vpc); 2766 2767 CASE (sem, INSN_LF_EQ_S) : /* lf.sfeq.s $rASF,$rBSF */ 2768 { 2769 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2770 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2771 #define FLD(f) abuf->fields.sfmt_l_sll.f 2772 int UNUSED written = 0; 2773 IADDR UNUSED pc = abuf->addr; 2774 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2775 2776 { 2777 BI opval = CGEN_CPU_FPU (current_cpu)->ops->eqsf (CGEN_CPU_FPU (current_cpu), GET_H_FSR (FLD (f_r2)), GET_H_FSR (FLD (f_r3))); 2778 SET_H_SYS_SR_F (opval); 2779 CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-f", 'x', opval); 2780 } 2781 2782 #undef FLD 2783 } 2784 NEXT (vpc); 2785 2786 CASE (sem, INSN_LF_NE_S) : /* lf.sfne.s $rASF,$rBSF */ 2787 { 2788 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2789 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2790 #define FLD(f) abuf->fields.sfmt_l_sll.f 2791 int UNUSED written = 0; 2792 IADDR UNUSED pc = abuf->addr; 2793 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2794 2795 { 2796 BI opval = CGEN_CPU_FPU (current_cpu)->ops->nesf (CGEN_CPU_FPU (current_cpu), GET_H_FSR (FLD (f_r2)), GET_H_FSR (FLD (f_r3))); 2797 SET_H_SYS_SR_F (opval); 2798 CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-f", 'x', opval); 2799 } 2800 2801 #undef FLD 2802 } 2803 NEXT (vpc); 2804 2805 CASE (sem, INSN_LF_GE_S) : /* lf.sfge.s $rASF,$rBSF */ 2806 { 2807 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2808 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2809 #define FLD(f) abuf->fields.sfmt_l_sll.f 2810 int UNUSED written = 0; 2811 IADDR UNUSED pc = abuf->addr; 2812 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2813 2814 { 2815 BI opval = CGEN_CPU_FPU (current_cpu)->ops->gesf (CGEN_CPU_FPU (current_cpu), GET_H_FSR (FLD (f_r2)), GET_H_FSR (FLD (f_r3))); 2816 SET_H_SYS_SR_F (opval); 2817 CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-f", 'x', opval); 2818 } 2819 2820 #undef FLD 2821 } 2822 NEXT (vpc); 2823 2824 CASE (sem, INSN_LF_GT_S) : /* lf.sfgt.s $rASF,$rBSF */ 2825 { 2826 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2827 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2828 #define FLD(f) abuf->fields.sfmt_l_sll.f 2829 int UNUSED written = 0; 2830 IADDR UNUSED pc = abuf->addr; 2831 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2832 2833 { 2834 BI opval = CGEN_CPU_FPU (current_cpu)->ops->gtsf (CGEN_CPU_FPU (current_cpu), GET_H_FSR (FLD (f_r2)), GET_H_FSR (FLD (f_r3))); 2835 SET_H_SYS_SR_F (opval); 2836 CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-f", 'x', opval); 2837 } 2838 2839 #undef FLD 2840 } 2841 NEXT (vpc); 2842 2843 CASE (sem, INSN_LF_LT_S) : /* lf.sflt.s $rASF,$rBSF */ 2844 { 2845 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2846 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2847 #define FLD(f) abuf->fields.sfmt_l_sll.f 2848 int UNUSED written = 0; 2849 IADDR UNUSED pc = abuf->addr; 2850 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2851 2852 { 2853 BI opval = CGEN_CPU_FPU (current_cpu)->ops->ltsf (CGEN_CPU_FPU (current_cpu), GET_H_FSR (FLD (f_r2)), GET_H_FSR (FLD (f_r3))); 2854 SET_H_SYS_SR_F (opval); 2855 CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-f", 'x', opval); 2856 } 2857 2858 #undef FLD 2859 } 2860 NEXT (vpc); 2861 2862 CASE (sem, INSN_LF_LE_S) : /* lf.sfle.s $rASF,$rBSF */ 2863 { 2864 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2865 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2866 #define FLD(f) abuf->fields.sfmt_l_sll.f 2867 int UNUSED written = 0; 2868 IADDR UNUSED pc = abuf->addr; 2869 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2870 2871 { 2872 BI opval = CGEN_CPU_FPU (current_cpu)->ops->lesf (CGEN_CPU_FPU (current_cpu), GET_H_FSR (FLD (f_r2)), GET_H_FSR (FLD (f_r3))); 2873 SET_H_SYS_SR_F (opval); 2874 CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-f", 'x', opval); 2875 } 2876 2877 #undef FLD 2878 } 2879 NEXT (vpc); 2880 2881 CASE (sem, INSN_LF_MADD_S) : /* lf.madd.s $rDSF,$rASF,$rBSF */ 2882 { 2883 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2884 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2885 #define FLD(f) abuf->fields.sfmt_l_sll.f 2886 int UNUSED written = 0; 2887 IADDR UNUSED pc = abuf->addr; 2888 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2889 2890 { 2891 SF opval = CGEN_CPU_FPU (current_cpu)->ops->addsf (CGEN_CPU_FPU (current_cpu), CGEN_CPU_FPU (current_cpu)->ops->mulsf (CGEN_CPU_FPU (current_cpu), GET_H_FSR (FLD (f_r2)), GET_H_FSR (FLD (f_r3))), GET_H_FSR (FLD (f_r1))); 2892 SET_H_FSR (FLD (f_r1), opval); 2893 CGEN_TRACE_RESULT (current_cpu, abuf, "fsr", 'f', opval); 2894 } 2895 2896 #undef FLD 2897 } 2898 NEXT (vpc); 2899 2900 CASE (sem, INSN_LF_CUST1_S) : /* lf.cust1.s $rASF,$rBSF */ 2901 { 2902 SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc); 2903 ARGBUF *abuf = SEM_ARGBUF (sem_arg); 2904 #define FLD(f) abuf->fields.sfmt_empty.f 2905 int UNUSED written = 0; 2906 IADDR UNUSED pc = abuf->addr; 2907 vpc = SEM_NEXT_VPC (sem_arg, pc, 4); 2908 2909 ((void) 0); /*nop*/ 2910 2911 #undef FLD 2912 } 2913 NEXT (vpc); 2914 2915 2916 } 2917 ENDSWITCH (sem) /* End of semantic switch. */ 2918 2919 /* At this point `vpc' contains the next insn to execute. */ 2920 } 2921 2922 #undef DEFINE_SWITCH 2923 #endif /* DEFINE_SWITCH */ 2924