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