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