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