xref: /netbsd-src/external/gpl3/gdb/dist/sim/m32r/sem-switch.c (revision 05fa08567a80471fd0eb3843a238392874f2577c)
14e98e3e1Schristos /* Simulator instruction semantics for m32rbf.
24e98e3e1Schristos 
34e98e3e1Schristos THIS FILE IS MACHINE GENERATED WITH CGEN.
44e98e3e1Schristos 
5*05fa0856Schristos Copyright (C) 1996-2024 Free Software Foundation, Inc.
64e98e3e1Schristos 
74e98e3e1Schristos This file is part of the GNU simulators.
84e98e3e1Schristos 
94e98e3e1Schristos    This file is free software; you can redistribute it and/or modify
104e98e3e1Schristos    it under the terms of the GNU General Public License as published by
114e98e3e1Schristos    the Free Software Foundation; either version 3, or (at your option)
124e98e3e1Schristos    any later version.
134e98e3e1Schristos 
144e98e3e1Schristos    It is distributed in the hope that it will be useful, but WITHOUT
154e98e3e1Schristos    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
164e98e3e1Schristos    or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
174e98e3e1Schristos    License for more details.
184e98e3e1Schristos 
194e98e3e1Schristos    You should have received a copy of the GNU General Public License along
20*05fa0856Schristos    with this program; if not, write to the Free Software Foundation, Inc.,
21*05fa0856Schristos    51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
224e98e3e1Schristos 
234e98e3e1Schristos */
244e98e3e1Schristos 
254e98e3e1Schristos #ifdef DEFINE_LABELS
264e98e3e1Schristos 
274e98e3e1Schristos   /* The labels have the case they have because the enum of insn types
284e98e3e1Schristos      is all uppercase and in the non-stdc case the insn symbol is built
294e98e3e1Schristos      into the enum name.  */
304e98e3e1Schristos 
314e98e3e1Schristos   static struct {
324e98e3e1Schristos     int index;
334e98e3e1Schristos     void *label;
344e98e3e1Schristos   } labels[] = {
354e98e3e1Schristos     { M32RBF_INSN_X_INVALID, && case_sem_INSN_X_INVALID },
364e98e3e1Schristos     { M32RBF_INSN_X_AFTER, && case_sem_INSN_X_AFTER },
374e98e3e1Schristos     { M32RBF_INSN_X_BEFORE, && case_sem_INSN_X_BEFORE },
384e98e3e1Schristos     { M32RBF_INSN_X_CTI_CHAIN, && case_sem_INSN_X_CTI_CHAIN },
394e98e3e1Schristos     { M32RBF_INSN_X_CHAIN, && case_sem_INSN_X_CHAIN },
404e98e3e1Schristos     { M32RBF_INSN_X_BEGIN, && case_sem_INSN_X_BEGIN },
414e98e3e1Schristos     { M32RBF_INSN_ADD, && case_sem_INSN_ADD },
424e98e3e1Schristos     { M32RBF_INSN_ADD3, && case_sem_INSN_ADD3 },
434e98e3e1Schristos     { M32RBF_INSN_AND, && case_sem_INSN_AND },
444e98e3e1Schristos     { M32RBF_INSN_AND3, && case_sem_INSN_AND3 },
454e98e3e1Schristos     { M32RBF_INSN_OR, && case_sem_INSN_OR },
464e98e3e1Schristos     { M32RBF_INSN_OR3, && case_sem_INSN_OR3 },
474e98e3e1Schristos     { M32RBF_INSN_XOR, && case_sem_INSN_XOR },
484e98e3e1Schristos     { M32RBF_INSN_XOR3, && case_sem_INSN_XOR3 },
494e98e3e1Schristos     { M32RBF_INSN_ADDI, && case_sem_INSN_ADDI },
504e98e3e1Schristos     { M32RBF_INSN_ADDV, && case_sem_INSN_ADDV },
514e98e3e1Schristos     { M32RBF_INSN_ADDV3, && case_sem_INSN_ADDV3 },
524e98e3e1Schristos     { M32RBF_INSN_ADDX, && case_sem_INSN_ADDX },
534e98e3e1Schristos     { M32RBF_INSN_BC8, && case_sem_INSN_BC8 },
544e98e3e1Schristos     { M32RBF_INSN_BC24, && case_sem_INSN_BC24 },
554e98e3e1Schristos     { M32RBF_INSN_BEQ, && case_sem_INSN_BEQ },
564e98e3e1Schristos     { M32RBF_INSN_BEQZ, && case_sem_INSN_BEQZ },
574e98e3e1Schristos     { M32RBF_INSN_BGEZ, && case_sem_INSN_BGEZ },
584e98e3e1Schristos     { M32RBF_INSN_BGTZ, && case_sem_INSN_BGTZ },
594e98e3e1Schristos     { M32RBF_INSN_BLEZ, && case_sem_INSN_BLEZ },
604e98e3e1Schristos     { M32RBF_INSN_BLTZ, && case_sem_INSN_BLTZ },
614e98e3e1Schristos     { M32RBF_INSN_BNEZ, && case_sem_INSN_BNEZ },
624e98e3e1Schristos     { M32RBF_INSN_BL8, && case_sem_INSN_BL8 },
634e98e3e1Schristos     { M32RBF_INSN_BL24, && case_sem_INSN_BL24 },
644e98e3e1Schristos     { M32RBF_INSN_BNC8, && case_sem_INSN_BNC8 },
654e98e3e1Schristos     { M32RBF_INSN_BNC24, && case_sem_INSN_BNC24 },
664e98e3e1Schristos     { M32RBF_INSN_BNE, && case_sem_INSN_BNE },
674e98e3e1Schristos     { M32RBF_INSN_BRA8, && case_sem_INSN_BRA8 },
684e98e3e1Schristos     { M32RBF_INSN_BRA24, && case_sem_INSN_BRA24 },
694e98e3e1Schristos     { M32RBF_INSN_CMP, && case_sem_INSN_CMP },
704e98e3e1Schristos     { M32RBF_INSN_CMPI, && case_sem_INSN_CMPI },
714e98e3e1Schristos     { M32RBF_INSN_CMPU, && case_sem_INSN_CMPU },
724e98e3e1Schristos     { M32RBF_INSN_CMPUI, && case_sem_INSN_CMPUI },
734e98e3e1Schristos     { M32RBF_INSN_DIV, && case_sem_INSN_DIV },
744e98e3e1Schristos     { M32RBF_INSN_DIVU, && case_sem_INSN_DIVU },
754e98e3e1Schristos     { M32RBF_INSN_REM, && case_sem_INSN_REM },
764e98e3e1Schristos     { M32RBF_INSN_REMU, && case_sem_INSN_REMU },
774e98e3e1Schristos     { M32RBF_INSN_JL, && case_sem_INSN_JL },
784e98e3e1Schristos     { M32RBF_INSN_JMP, && case_sem_INSN_JMP },
794e98e3e1Schristos     { M32RBF_INSN_LD, && case_sem_INSN_LD },
804e98e3e1Schristos     { M32RBF_INSN_LD_D, && case_sem_INSN_LD_D },
814e98e3e1Schristos     { M32RBF_INSN_LDB, && case_sem_INSN_LDB },
824e98e3e1Schristos     { M32RBF_INSN_LDB_D, && case_sem_INSN_LDB_D },
834e98e3e1Schristos     { M32RBF_INSN_LDH, && case_sem_INSN_LDH },
844e98e3e1Schristos     { M32RBF_INSN_LDH_D, && case_sem_INSN_LDH_D },
854e98e3e1Schristos     { M32RBF_INSN_LDUB, && case_sem_INSN_LDUB },
864e98e3e1Schristos     { M32RBF_INSN_LDUB_D, && case_sem_INSN_LDUB_D },
874e98e3e1Schristos     { M32RBF_INSN_LDUH, && case_sem_INSN_LDUH },
884e98e3e1Schristos     { M32RBF_INSN_LDUH_D, && case_sem_INSN_LDUH_D },
894e98e3e1Schristos     { M32RBF_INSN_LD_PLUS, && case_sem_INSN_LD_PLUS },
904e98e3e1Schristos     { M32RBF_INSN_LD24, && case_sem_INSN_LD24 },
914e98e3e1Schristos     { M32RBF_INSN_LDI8, && case_sem_INSN_LDI8 },
924e98e3e1Schristos     { M32RBF_INSN_LDI16, && case_sem_INSN_LDI16 },
934e98e3e1Schristos     { M32RBF_INSN_LOCK, && case_sem_INSN_LOCK },
944e98e3e1Schristos     { M32RBF_INSN_MACHI, && case_sem_INSN_MACHI },
954e98e3e1Schristos     { M32RBF_INSN_MACLO, && case_sem_INSN_MACLO },
964e98e3e1Schristos     { M32RBF_INSN_MACWHI, && case_sem_INSN_MACWHI },
974e98e3e1Schristos     { M32RBF_INSN_MACWLO, && case_sem_INSN_MACWLO },
984e98e3e1Schristos     { M32RBF_INSN_MUL, && case_sem_INSN_MUL },
994e98e3e1Schristos     { M32RBF_INSN_MULHI, && case_sem_INSN_MULHI },
1004e98e3e1Schristos     { M32RBF_INSN_MULLO, && case_sem_INSN_MULLO },
1014e98e3e1Schristos     { M32RBF_INSN_MULWHI, && case_sem_INSN_MULWHI },
1024e98e3e1Schristos     { M32RBF_INSN_MULWLO, && case_sem_INSN_MULWLO },
1034e98e3e1Schristos     { M32RBF_INSN_MV, && case_sem_INSN_MV },
1044e98e3e1Schristos     { M32RBF_INSN_MVFACHI, && case_sem_INSN_MVFACHI },
1054e98e3e1Schristos     { M32RBF_INSN_MVFACLO, && case_sem_INSN_MVFACLO },
1064e98e3e1Schristos     { M32RBF_INSN_MVFACMI, && case_sem_INSN_MVFACMI },
1074e98e3e1Schristos     { M32RBF_INSN_MVFC, && case_sem_INSN_MVFC },
1084e98e3e1Schristos     { M32RBF_INSN_MVTACHI, && case_sem_INSN_MVTACHI },
1094e98e3e1Schristos     { M32RBF_INSN_MVTACLO, && case_sem_INSN_MVTACLO },
1104e98e3e1Schristos     { M32RBF_INSN_MVTC, && case_sem_INSN_MVTC },
1114e98e3e1Schristos     { M32RBF_INSN_NEG, && case_sem_INSN_NEG },
1124e98e3e1Schristos     { M32RBF_INSN_NOP, && case_sem_INSN_NOP },
1134e98e3e1Schristos     { M32RBF_INSN_NOT, && case_sem_INSN_NOT },
1144e98e3e1Schristos     { M32RBF_INSN_RAC, && case_sem_INSN_RAC },
1154e98e3e1Schristos     { M32RBF_INSN_RACH, && case_sem_INSN_RACH },
1164e98e3e1Schristos     { M32RBF_INSN_RTE, && case_sem_INSN_RTE },
1174e98e3e1Schristos     { M32RBF_INSN_SETH, && case_sem_INSN_SETH },
1184e98e3e1Schristos     { M32RBF_INSN_SLL, && case_sem_INSN_SLL },
1194e98e3e1Schristos     { M32RBF_INSN_SLL3, && case_sem_INSN_SLL3 },
1204e98e3e1Schristos     { M32RBF_INSN_SLLI, && case_sem_INSN_SLLI },
1214e98e3e1Schristos     { M32RBF_INSN_SRA, && case_sem_INSN_SRA },
1224e98e3e1Schristos     { M32RBF_INSN_SRA3, && case_sem_INSN_SRA3 },
1234e98e3e1Schristos     { M32RBF_INSN_SRAI, && case_sem_INSN_SRAI },
1244e98e3e1Schristos     { M32RBF_INSN_SRL, && case_sem_INSN_SRL },
1254e98e3e1Schristos     { M32RBF_INSN_SRL3, && case_sem_INSN_SRL3 },
1264e98e3e1Schristos     { M32RBF_INSN_SRLI, && case_sem_INSN_SRLI },
1274e98e3e1Schristos     { M32RBF_INSN_ST, && case_sem_INSN_ST },
1284e98e3e1Schristos     { M32RBF_INSN_ST_D, && case_sem_INSN_ST_D },
1294e98e3e1Schristos     { M32RBF_INSN_STB, && case_sem_INSN_STB },
1304e98e3e1Schristos     { M32RBF_INSN_STB_D, && case_sem_INSN_STB_D },
1314e98e3e1Schristos     { M32RBF_INSN_STH, && case_sem_INSN_STH },
1324e98e3e1Schristos     { M32RBF_INSN_STH_D, && case_sem_INSN_STH_D },
1334e98e3e1Schristos     { M32RBF_INSN_ST_PLUS, && case_sem_INSN_ST_PLUS },
1344e98e3e1Schristos     { M32RBF_INSN_ST_MINUS, && case_sem_INSN_ST_MINUS },
1354e98e3e1Schristos     { M32RBF_INSN_SUB, && case_sem_INSN_SUB },
1364e98e3e1Schristos     { M32RBF_INSN_SUBV, && case_sem_INSN_SUBV },
1374e98e3e1Schristos     { M32RBF_INSN_SUBX, && case_sem_INSN_SUBX },
1384e98e3e1Schristos     { M32RBF_INSN_TRAP, && case_sem_INSN_TRAP },
1394e98e3e1Schristos     { M32RBF_INSN_UNLOCK, && case_sem_INSN_UNLOCK },
1404e98e3e1Schristos     { M32RBF_INSN_CLRPSW, && case_sem_INSN_CLRPSW },
1414e98e3e1Schristos     { M32RBF_INSN_SETPSW, && case_sem_INSN_SETPSW },
1424e98e3e1Schristos     { M32RBF_INSN_BSET, && case_sem_INSN_BSET },
1434e98e3e1Schristos     { M32RBF_INSN_BCLR, && case_sem_INSN_BCLR },
1444e98e3e1Schristos     { M32RBF_INSN_BTST, && case_sem_INSN_BTST },
1454e98e3e1Schristos     { 0, 0 }
1464e98e3e1Schristos   };
1474e98e3e1Schristos   int i;
1484e98e3e1Schristos 
1494e98e3e1Schristos   for (i = 0; labels[i].label != 0; ++i)
1504e98e3e1Schristos     {
1514e98e3e1Schristos #if FAST_P
1524e98e3e1Schristos       CPU_IDESC (current_cpu) [labels[i].index].sem_fast_lab = labels[i].label;
1534e98e3e1Schristos #else
1544e98e3e1Schristos       CPU_IDESC (current_cpu) [labels[i].index].sem_full_lab = labels[i].label;
1554e98e3e1Schristos #endif
1564e98e3e1Schristos     }
1574e98e3e1Schristos 
1584e98e3e1Schristos #undef DEFINE_LABELS
1594e98e3e1Schristos #endif /* DEFINE_LABELS */
1604e98e3e1Schristos 
1614e98e3e1Schristos #ifdef DEFINE_SWITCH
1624e98e3e1Schristos 
1634e98e3e1Schristos /* If hyper-fast [well not unnecessarily slow] execution is selected, turn
1644e98e3e1Schristos    off frills like tracing and profiling.  */
165212397c6Schristos /* FIXME: A better way would be to have CGEN_TRACE_RESULT check for something
1664e98e3e1Schristos    that can cause it to be optimized out.  Another way would be to emit
1674e98e3e1Schristos    special handlers into the instruction "stream".  */
1684e98e3e1Schristos 
1694e98e3e1Schristos #if FAST_P
170212397c6Schristos #undef CGEN_TRACE_RESULT
171212397c6Schristos #define CGEN_TRACE_RESULT(cpu, abuf, name, type, val)
1724e98e3e1Schristos #endif
1734e98e3e1Schristos 
1744e98e3e1Schristos #undef GET_ATTR
1754e98e3e1Schristos #define GET_ATTR(cpu, num, attr) CGEN_ATTR_VALUE (NULL, abuf->idesc->attrs, CGEN_INSN_##attr)
1764e98e3e1Schristos 
1774e98e3e1Schristos {
1784e98e3e1Schristos 
1794e98e3e1Schristos #if WITH_SCACHE_PBB
1804e98e3e1Schristos 
1814e98e3e1Schristos /* Branch to next handler without going around main loop.  */
1824e98e3e1Schristos #define NEXT(vpc) goto * SEM_ARGBUF (vpc) -> semantic.sem_case
1834e98e3e1Schristos SWITCH (sem, SEM_ARGBUF (vpc) -> semantic.sem_case)
1844e98e3e1Schristos 
1854e98e3e1Schristos #else /* ! WITH_SCACHE_PBB */
1864e98e3e1Schristos 
1874e98e3e1Schristos #define NEXT(vpc) BREAK (sem)
1884e98e3e1Schristos #ifdef __GNUC__
1894e98e3e1Schristos #if FAST_P
1904e98e3e1Schristos   SWITCH (sem, SEM_ARGBUF (sc) -> idesc->sem_fast_lab)
1914e98e3e1Schristos #else
1924e98e3e1Schristos   SWITCH (sem, SEM_ARGBUF (sc) -> idesc->sem_full_lab)
1934e98e3e1Schristos #endif
1944e98e3e1Schristos #else
1954e98e3e1Schristos   SWITCH (sem, SEM_ARGBUF (sc) -> idesc->num)
1964e98e3e1Schristos #endif
1974e98e3e1Schristos 
1984e98e3e1Schristos #endif /* ! WITH_SCACHE_PBB */
1994e98e3e1Schristos 
2004e98e3e1Schristos     {
2014e98e3e1Schristos 
2024e98e3e1Schristos   CASE (sem, INSN_X_INVALID) : /* --invalid-- */
2034e98e3e1Schristos {
2044e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2054e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2064e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_empty.f
2074e98e3e1Schristos   int UNUSED written = 0;
2084e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
2094e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
2104e98e3e1Schristos 
2114e98e3e1Schristos   {
2124e98e3e1Schristos     /* Update the recorded pc in the cpu state struct.
2134e98e3e1Schristos        Only necessary for WITH_SCACHE case, but to avoid the
2144e98e3e1Schristos        conditional compilation ....  */
2154e98e3e1Schristos     SET_H_PC (pc);
2164e98e3e1Schristos     /* Virtual insns have zero size.  Overwrite vpc with address of next insn
2174e98e3e1Schristos        using the default-insn-bitsize spec.  When executing insns in parallel
2184e98e3e1Schristos        we may want to queue the fault and continue execution.  */
2194e98e3e1Schristos     vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2204e98e3e1Schristos     vpc = sim_engine_invalid_insn (current_cpu, pc, vpc);
2214e98e3e1Schristos   }
2224e98e3e1Schristos 
2234e98e3e1Schristos #undef FLD
2244e98e3e1Schristos }
2254e98e3e1Schristos   NEXT (vpc);
2264e98e3e1Schristos 
2274e98e3e1Schristos   CASE (sem, INSN_X_AFTER) : /* --after-- */
2284e98e3e1Schristos {
2294e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2304e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2314e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_empty.f
2324e98e3e1Schristos   int UNUSED written = 0;
2334e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
2344e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
2354e98e3e1Schristos 
2364e98e3e1Schristos   {
2374e98e3e1Schristos #if WITH_SCACHE_PBB_M32RBF
2384e98e3e1Schristos     m32rbf_pbb_after (current_cpu, sem_arg);
2394e98e3e1Schristos #endif
2404e98e3e1Schristos   }
2414e98e3e1Schristos 
2424e98e3e1Schristos #undef FLD
2434e98e3e1Schristos }
2444e98e3e1Schristos   NEXT (vpc);
2454e98e3e1Schristos 
2464e98e3e1Schristos   CASE (sem, INSN_X_BEFORE) : /* --before-- */
2474e98e3e1Schristos {
2484e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2494e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2504e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_empty.f
2514e98e3e1Schristos   int UNUSED written = 0;
2524e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
2534e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
2544e98e3e1Schristos 
2554e98e3e1Schristos   {
2564e98e3e1Schristos #if WITH_SCACHE_PBB_M32RBF
2574e98e3e1Schristos     m32rbf_pbb_before (current_cpu, sem_arg);
2584e98e3e1Schristos #endif
2594e98e3e1Schristos   }
2604e98e3e1Schristos 
2614e98e3e1Schristos #undef FLD
2624e98e3e1Schristos }
2634e98e3e1Schristos   NEXT (vpc);
2644e98e3e1Schristos 
2654e98e3e1Schristos   CASE (sem, INSN_X_CTI_CHAIN) : /* --cti-chain-- */
2664e98e3e1Schristos {
2674e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2684e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2694e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_empty.f
2704e98e3e1Schristos   int UNUSED written = 0;
2714e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
2724e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
2734e98e3e1Schristos 
2744e98e3e1Schristos   {
2754e98e3e1Schristos #if WITH_SCACHE_PBB_M32RBF
2764e98e3e1Schristos #ifdef DEFINE_SWITCH
2774e98e3e1Schristos     vpc = m32rbf_pbb_cti_chain (current_cpu, sem_arg,
2784e98e3e1Schristos 			       pbb_br_type, pbb_br_npc);
2794e98e3e1Schristos     BREAK (sem);
2804e98e3e1Schristos #else
2814e98e3e1Schristos     /* FIXME: Allow provision of explicit ifmt spec in insn spec.  */
2824e98e3e1Schristos     vpc = m32rbf_pbb_cti_chain (current_cpu, sem_arg,
2834e98e3e1Schristos 			       CPU_PBB_BR_TYPE (current_cpu),
2844e98e3e1Schristos 			       CPU_PBB_BR_NPC (current_cpu));
2854e98e3e1Schristos #endif
2864e98e3e1Schristos #endif
2874e98e3e1Schristos   }
2884e98e3e1Schristos 
2894e98e3e1Schristos #undef FLD
2904e98e3e1Schristos }
2914e98e3e1Schristos   NEXT (vpc);
2924e98e3e1Schristos 
2934e98e3e1Schristos   CASE (sem, INSN_X_CHAIN) : /* --chain-- */
2944e98e3e1Schristos {
2954e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2964e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2974e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_empty.f
2984e98e3e1Schristos   int UNUSED written = 0;
2994e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
3004e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
3014e98e3e1Schristos 
3024e98e3e1Schristos   {
3034e98e3e1Schristos #if WITH_SCACHE_PBB_M32RBF
3044e98e3e1Schristos     vpc = m32rbf_pbb_chain (current_cpu, sem_arg);
3054e98e3e1Schristos #ifdef DEFINE_SWITCH
3064e98e3e1Schristos     BREAK (sem);
3074e98e3e1Schristos #endif
3084e98e3e1Schristos #endif
3094e98e3e1Schristos   }
3104e98e3e1Schristos 
3114e98e3e1Schristos #undef FLD
3124e98e3e1Schristos }
3134e98e3e1Schristos   NEXT (vpc);
3144e98e3e1Schristos 
3154e98e3e1Schristos   CASE (sem, INSN_X_BEGIN) : /* --begin-- */
3164e98e3e1Schristos {
3174e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3184e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3194e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_empty.f
3204e98e3e1Schristos   int UNUSED written = 0;
3214e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
3224e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
3234e98e3e1Schristos 
3244e98e3e1Schristos   {
3254e98e3e1Schristos #if WITH_SCACHE_PBB_M32RBF
3264e98e3e1Schristos #if defined DEFINE_SWITCH || defined FAST_P
3274e98e3e1Schristos     /* In the switch case FAST_P is a constant, allowing several optimizations
3284e98e3e1Schristos        in any called inline functions.  */
3294e98e3e1Schristos     vpc = m32rbf_pbb_begin (current_cpu, FAST_P);
3304e98e3e1Schristos #else
3314e98e3e1Schristos #if 0 /* cgen engine can't handle dynamic fast/full switching yet.  */
3324e98e3e1Schristos     vpc = m32rbf_pbb_begin (current_cpu, STATE_RUN_FAST_P (CPU_STATE (current_cpu)));
3334e98e3e1Schristos #else
3344e98e3e1Schristos     vpc = m32rbf_pbb_begin (current_cpu, 0);
3354e98e3e1Schristos #endif
3364e98e3e1Schristos #endif
3374e98e3e1Schristos #endif
3384e98e3e1Schristos   }
3394e98e3e1Schristos 
3404e98e3e1Schristos #undef FLD
3414e98e3e1Schristos }
3424e98e3e1Schristos   NEXT (vpc);
3434e98e3e1Schristos 
3444e98e3e1Schristos   CASE (sem, INSN_ADD) : /* add $dr,$sr */
3454e98e3e1Schristos {
3464e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3474e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3484e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_add.f
3494e98e3e1Schristos   int UNUSED written = 0;
3504e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
3514e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3524e98e3e1Schristos 
3534e98e3e1Schristos   {
3544e98e3e1Schristos     SI opval = ADDSI (* FLD (i_dr), * FLD (i_sr));
3554e98e3e1Schristos     * FLD (i_dr) = opval;
356212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
3574e98e3e1Schristos   }
3584e98e3e1Schristos 
3594e98e3e1Schristos #undef FLD
3604e98e3e1Schristos }
3614e98e3e1Schristos   NEXT (vpc);
3624e98e3e1Schristos 
3634e98e3e1Schristos   CASE (sem, INSN_ADD3) : /* add3 $dr,$sr,$hash$slo16 */
3644e98e3e1Schristos {
3654e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3664e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3674e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_add3.f
3684e98e3e1Schristos   int UNUSED written = 0;
3694e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
3704e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
3714e98e3e1Schristos 
3724e98e3e1Schristos   {
3734e98e3e1Schristos     SI opval = ADDSI (* FLD (i_sr), FLD (f_simm16));
3744e98e3e1Schristos     * FLD (i_dr) = opval;
375212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
3764e98e3e1Schristos   }
3774e98e3e1Schristos 
3784e98e3e1Schristos #undef FLD
3794e98e3e1Schristos }
3804e98e3e1Schristos   NEXT (vpc);
3814e98e3e1Schristos 
3824e98e3e1Schristos   CASE (sem, INSN_AND) : /* and $dr,$sr */
3834e98e3e1Schristos {
3844e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3854e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3864e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_add.f
3874e98e3e1Schristos   int UNUSED written = 0;
3884e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
3894e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3904e98e3e1Schristos 
3914e98e3e1Schristos   {
3924e98e3e1Schristos     SI opval = ANDSI (* FLD (i_dr), * FLD (i_sr));
3934e98e3e1Schristos     * FLD (i_dr) = opval;
394212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
3954e98e3e1Schristos   }
3964e98e3e1Schristos 
3974e98e3e1Schristos #undef FLD
3984e98e3e1Schristos }
3994e98e3e1Schristos   NEXT (vpc);
4004e98e3e1Schristos 
4014e98e3e1Schristos   CASE (sem, INSN_AND3) : /* and3 $dr,$sr,$uimm16 */
4024e98e3e1Schristos {
4034e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4044e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4054e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_and3.f
4064e98e3e1Schristos   int UNUSED written = 0;
4074e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
4084e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
4094e98e3e1Schristos 
4104e98e3e1Schristos   {
4114e98e3e1Schristos     SI opval = ANDSI (* FLD (i_sr), FLD (f_uimm16));
4124e98e3e1Schristos     * FLD (i_dr) = opval;
413212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
4144e98e3e1Schristos   }
4154e98e3e1Schristos 
4164e98e3e1Schristos #undef FLD
4174e98e3e1Schristos }
4184e98e3e1Schristos   NEXT (vpc);
4194e98e3e1Schristos 
4204e98e3e1Schristos   CASE (sem, INSN_OR) : /* or $dr,$sr */
4214e98e3e1Schristos {
4224e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4234e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4244e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_add.f
4254e98e3e1Schristos   int UNUSED written = 0;
4264e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
4274e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
4284e98e3e1Schristos 
4294e98e3e1Schristos   {
4304e98e3e1Schristos     SI opval = ORSI (* FLD (i_dr), * FLD (i_sr));
4314e98e3e1Schristos     * FLD (i_dr) = opval;
432212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
4334e98e3e1Schristos   }
4344e98e3e1Schristos 
4354e98e3e1Schristos #undef FLD
4364e98e3e1Schristos }
4374e98e3e1Schristos   NEXT (vpc);
4384e98e3e1Schristos 
4394e98e3e1Schristos   CASE (sem, INSN_OR3) : /* or3 $dr,$sr,$hash$ulo16 */
4404e98e3e1Schristos {
4414e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4424e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4434e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_and3.f
4444e98e3e1Schristos   int UNUSED written = 0;
4454e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
4464e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
4474e98e3e1Schristos 
4484e98e3e1Schristos   {
4494e98e3e1Schristos     SI opval = ORSI (* FLD (i_sr), FLD (f_uimm16));
4504e98e3e1Schristos     * FLD (i_dr) = opval;
451212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
4524e98e3e1Schristos   }
4534e98e3e1Schristos 
4544e98e3e1Schristos #undef FLD
4554e98e3e1Schristos }
4564e98e3e1Schristos   NEXT (vpc);
4574e98e3e1Schristos 
4584e98e3e1Schristos   CASE (sem, INSN_XOR) : /* xor $dr,$sr */
4594e98e3e1Schristos {
4604e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4614e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4624e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_add.f
4634e98e3e1Schristos   int UNUSED written = 0;
4644e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
4654e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
4664e98e3e1Schristos 
4674e98e3e1Schristos   {
4684e98e3e1Schristos     SI opval = XORSI (* FLD (i_dr), * FLD (i_sr));
4694e98e3e1Schristos     * FLD (i_dr) = opval;
470212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
4714e98e3e1Schristos   }
4724e98e3e1Schristos 
4734e98e3e1Schristos #undef FLD
4744e98e3e1Schristos }
4754e98e3e1Schristos   NEXT (vpc);
4764e98e3e1Schristos 
4774e98e3e1Schristos   CASE (sem, INSN_XOR3) : /* xor3 $dr,$sr,$uimm16 */
4784e98e3e1Schristos {
4794e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4804e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4814e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_and3.f
4824e98e3e1Schristos   int UNUSED written = 0;
4834e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
4844e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
4854e98e3e1Schristos 
4864e98e3e1Schristos   {
4874e98e3e1Schristos     SI opval = XORSI (* FLD (i_sr), FLD (f_uimm16));
4884e98e3e1Schristos     * FLD (i_dr) = opval;
489212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
4904e98e3e1Schristos   }
4914e98e3e1Schristos 
4924e98e3e1Schristos #undef FLD
4934e98e3e1Schristos }
4944e98e3e1Schristos   NEXT (vpc);
4954e98e3e1Schristos 
4964e98e3e1Schristos   CASE (sem, INSN_ADDI) : /* addi $dr,$simm8 */
4974e98e3e1Schristos {
4984e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4994e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
5004e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_addi.f
5014e98e3e1Schristos   int UNUSED written = 0;
5024e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
5034e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
5044e98e3e1Schristos 
5054e98e3e1Schristos   {
5064e98e3e1Schristos     SI opval = ADDSI (* FLD (i_dr), FLD (f_simm8));
5074e98e3e1Schristos     * FLD (i_dr) = opval;
508212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
5094e98e3e1Schristos   }
5104e98e3e1Schristos 
5114e98e3e1Schristos #undef FLD
5124e98e3e1Schristos }
5134e98e3e1Schristos   NEXT (vpc);
5144e98e3e1Schristos 
5154e98e3e1Schristos   CASE (sem, INSN_ADDV) : /* addv $dr,$sr */
5164e98e3e1Schristos {
5174e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5184e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
5194e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_add.f
5204e98e3e1Schristos   int UNUSED written = 0;
5214e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
5224e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
5234e98e3e1Schristos 
5244e98e3e1Schristos {
5254e98e3e1Schristos   SI temp0;BI temp1;
5264e98e3e1Schristos   temp0 = ADDSI (* FLD (i_dr), * FLD (i_sr));
5274e98e3e1Schristos   temp1 = ADDOFSI (* FLD (i_dr), * FLD (i_sr), 0);
5284e98e3e1Schristos   {
5294e98e3e1Schristos     SI opval = temp0;
5304e98e3e1Schristos     * FLD (i_dr) = opval;
531212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
5324e98e3e1Schristos   }
5334e98e3e1Schristos   {
5344e98e3e1Schristos     BI opval = temp1;
5354e98e3e1Schristos     CPU (h_cond) = opval;
536212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
5374e98e3e1Schristos   }
5384e98e3e1Schristos }
5394e98e3e1Schristos 
5404e98e3e1Schristos #undef FLD
5414e98e3e1Schristos }
5424e98e3e1Schristos   NEXT (vpc);
5434e98e3e1Schristos 
5444e98e3e1Schristos   CASE (sem, INSN_ADDV3) : /* addv3 $dr,$sr,$simm16 */
5454e98e3e1Schristos {
5464e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5474e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
5484e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_add3.f
5494e98e3e1Schristos   int UNUSED written = 0;
5504e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
5514e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
5524e98e3e1Schristos 
5534e98e3e1Schristos {
5544e98e3e1Schristos   SI temp0;BI temp1;
5554e98e3e1Schristos   temp0 = ADDSI (* FLD (i_sr), FLD (f_simm16));
5564e98e3e1Schristos   temp1 = ADDOFSI (* FLD (i_sr), FLD (f_simm16), 0);
5574e98e3e1Schristos   {
5584e98e3e1Schristos     SI opval = temp0;
5594e98e3e1Schristos     * FLD (i_dr) = opval;
560212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
5614e98e3e1Schristos   }
5624e98e3e1Schristos   {
5634e98e3e1Schristos     BI opval = temp1;
5644e98e3e1Schristos     CPU (h_cond) = opval;
565212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
5664e98e3e1Schristos   }
5674e98e3e1Schristos }
5684e98e3e1Schristos 
5694e98e3e1Schristos #undef FLD
5704e98e3e1Schristos }
5714e98e3e1Schristos   NEXT (vpc);
5724e98e3e1Schristos 
5734e98e3e1Schristos   CASE (sem, INSN_ADDX) : /* addx $dr,$sr */
5744e98e3e1Schristos {
5754e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5764e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
5774e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_add.f
5784e98e3e1Schristos   int UNUSED written = 0;
5794e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
5804e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
5814e98e3e1Schristos 
5824e98e3e1Schristos {
5834e98e3e1Schristos   SI temp0;BI temp1;
5844e98e3e1Schristos   temp0 = ADDCSI (* FLD (i_dr), * FLD (i_sr), CPU (h_cond));
5854e98e3e1Schristos   temp1 = ADDCFSI (* FLD (i_dr), * FLD (i_sr), CPU (h_cond));
5864e98e3e1Schristos   {
5874e98e3e1Schristos     SI opval = temp0;
5884e98e3e1Schristos     * FLD (i_dr) = opval;
589212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
5904e98e3e1Schristos   }
5914e98e3e1Schristos   {
5924e98e3e1Schristos     BI opval = temp1;
5934e98e3e1Schristos     CPU (h_cond) = opval;
594212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
5954e98e3e1Schristos   }
5964e98e3e1Schristos }
5974e98e3e1Schristos 
5984e98e3e1Schristos #undef FLD
5994e98e3e1Schristos }
6004e98e3e1Schristos   NEXT (vpc);
6014e98e3e1Schristos 
6024e98e3e1Schristos   CASE (sem, INSN_BC8) : /* bc.s $disp8 */
6034e98e3e1Schristos {
6044e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
6054e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
6064e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_bl8.f
6074e98e3e1Schristos   int UNUSED written = 0;
6084e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
6094e98e3e1Schristos   SEM_BRANCH_INIT
6104e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
6114e98e3e1Schristos 
6124e98e3e1Schristos if (CPU (h_cond)) {
6134e98e3e1Schristos   {
6144e98e3e1Schristos     USI opval = FLD (i_disp8);
6154e98e3e1Schristos     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
6164e98e3e1Schristos     written |= (1 << 2);
617212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
6184e98e3e1Schristos   }
6194e98e3e1Schristos }
6204e98e3e1Schristos 
6214e98e3e1Schristos   abuf->written = written;
6224e98e3e1Schristos   SEM_BRANCH_FINI (vpc);
6234e98e3e1Schristos #undef FLD
6244e98e3e1Schristos }
6254e98e3e1Schristos   NEXT (vpc);
6264e98e3e1Schristos 
6274e98e3e1Schristos   CASE (sem, INSN_BC24) : /* bc.l $disp24 */
6284e98e3e1Schristos {
6294e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
6304e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
6314e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_bl24.f
6324e98e3e1Schristos   int UNUSED written = 0;
6334e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
6344e98e3e1Schristos   SEM_BRANCH_INIT
6354e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
6364e98e3e1Schristos 
6374e98e3e1Schristos if (CPU (h_cond)) {
6384e98e3e1Schristos   {
6394e98e3e1Schristos     USI opval = FLD (i_disp24);
6404e98e3e1Schristos     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
6414e98e3e1Schristos     written |= (1 << 2);
642212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
6434e98e3e1Schristos   }
6444e98e3e1Schristos }
6454e98e3e1Schristos 
6464e98e3e1Schristos   abuf->written = written;
6474e98e3e1Schristos   SEM_BRANCH_FINI (vpc);
6484e98e3e1Schristos #undef FLD
6494e98e3e1Schristos }
6504e98e3e1Schristos   NEXT (vpc);
6514e98e3e1Schristos 
6524e98e3e1Schristos   CASE (sem, INSN_BEQ) : /* beq $src1,$src2,$disp16 */
6534e98e3e1Schristos {
6544e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
6554e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
6564e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_beq.f
6574e98e3e1Schristos   int UNUSED written = 0;
6584e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
6594e98e3e1Schristos   SEM_BRANCH_INIT
6604e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
6614e98e3e1Schristos 
6624e98e3e1Schristos if (EQSI (* FLD (i_src1), * FLD (i_src2))) {
6634e98e3e1Schristos   {
6644e98e3e1Schristos     USI opval = FLD (i_disp16);
6654e98e3e1Schristos     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
6664e98e3e1Schristos     written |= (1 << 3);
667212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
6684e98e3e1Schristos   }
6694e98e3e1Schristos }
6704e98e3e1Schristos 
6714e98e3e1Schristos   abuf->written = written;
6724e98e3e1Schristos   SEM_BRANCH_FINI (vpc);
6734e98e3e1Schristos #undef FLD
6744e98e3e1Schristos }
6754e98e3e1Schristos   NEXT (vpc);
6764e98e3e1Schristos 
6774e98e3e1Schristos   CASE (sem, INSN_BEQZ) : /* beqz $src2,$disp16 */
6784e98e3e1Schristos {
6794e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
6804e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
6814e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_beq.f
6824e98e3e1Schristos   int UNUSED written = 0;
6834e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
6844e98e3e1Schristos   SEM_BRANCH_INIT
6854e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
6864e98e3e1Schristos 
6874e98e3e1Schristos if (EQSI (* FLD (i_src2), 0)) {
6884e98e3e1Schristos   {
6894e98e3e1Schristos     USI opval = FLD (i_disp16);
6904e98e3e1Schristos     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
6914e98e3e1Schristos     written |= (1 << 2);
692212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
6934e98e3e1Schristos   }
6944e98e3e1Schristos }
6954e98e3e1Schristos 
6964e98e3e1Schristos   abuf->written = written;
6974e98e3e1Schristos   SEM_BRANCH_FINI (vpc);
6984e98e3e1Schristos #undef FLD
6994e98e3e1Schristos }
7004e98e3e1Schristos   NEXT (vpc);
7014e98e3e1Schristos 
7024e98e3e1Schristos   CASE (sem, INSN_BGEZ) : /* bgez $src2,$disp16 */
7034e98e3e1Schristos {
7044e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
7054e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
7064e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_beq.f
7074e98e3e1Schristos   int UNUSED written = 0;
7084e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
7094e98e3e1Schristos   SEM_BRANCH_INIT
7104e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
7114e98e3e1Schristos 
7124e98e3e1Schristos if (GESI (* FLD (i_src2), 0)) {
7134e98e3e1Schristos   {
7144e98e3e1Schristos     USI opval = FLD (i_disp16);
7154e98e3e1Schristos     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
7164e98e3e1Schristos     written |= (1 << 2);
717212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
7184e98e3e1Schristos   }
7194e98e3e1Schristos }
7204e98e3e1Schristos 
7214e98e3e1Schristos   abuf->written = written;
7224e98e3e1Schristos   SEM_BRANCH_FINI (vpc);
7234e98e3e1Schristos #undef FLD
7244e98e3e1Schristos }
7254e98e3e1Schristos   NEXT (vpc);
7264e98e3e1Schristos 
7274e98e3e1Schristos   CASE (sem, INSN_BGTZ) : /* bgtz $src2,$disp16 */
7284e98e3e1Schristos {
7294e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
7304e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
7314e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_beq.f
7324e98e3e1Schristos   int UNUSED written = 0;
7334e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
7344e98e3e1Schristos   SEM_BRANCH_INIT
7354e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
7364e98e3e1Schristos 
7374e98e3e1Schristos if (GTSI (* FLD (i_src2), 0)) {
7384e98e3e1Schristos   {
7394e98e3e1Schristos     USI opval = FLD (i_disp16);
7404e98e3e1Schristos     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
7414e98e3e1Schristos     written |= (1 << 2);
742212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
7434e98e3e1Schristos   }
7444e98e3e1Schristos }
7454e98e3e1Schristos 
7464e98e3e1Schristos   abuf->written = written;
7474e98e3e1Schristos   SEM_BRANCH_FINI (vpc);
7484e98e3e1Schristos #undef FLD
7494e98e3e1Schristos }
7504e98e3e1Schristos   NEXT (vpc);
7514e98e3e1Schristos 
7524e98e3e1Schristos   CASE (sem, INSN_BLEZ) : /* blez $src2,$disp16 */
7534e98e3e1Schristos {
7544e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
7554e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
7564e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_beq.f
7574e98e3e1Schristos   int UNUSED written = 0;
7584e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
7594e98e3e1Schristos   SEM_BRANCH_INIT
7604e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
7614e98e3e1Schristos 
7624e98e3e1Schristos if (LESI (* FLD (i_src2), 0)) {
7634e98e3e1Schristos   {
7644e98e3e1Schristos     USI opval = FLD (i_disp16);
7654e98e3e1Schristos     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
7664e98e3e1Schristos     written |= (1 << 2);
767212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
7684e98e3e1Schristos   }
7694e98e3e1Schristos }
7704e98e3e1Schristos 
7714e98e3e1Schristos   abuf->written = written;
7724e98e3e1Schristos   SEM_BRANCH_FINI (vpc);
7734e98e3e1Schristos #undef FLD
7744e98e3e1Schristos }
7754e98e3e1Schristos   NEXT (vpc);
7764e98e3e1Schristos 
7774e98e3e1Schristos   CASE (sem, INSN_BLTZ) : /* bltz $src2,$disp16 */
7784e98e3e1Schristos {
7794e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
7804e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
7814e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_beq.f
7824e98e3e1Schristos   int UNUSED written = 0;
7834e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
7844e98e3e1Schristos   SEM_BRANCH_INIT
7854e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
7864e98e3e1Schristos 
7874e98e3e1Schristos if (LTSI (* FLD (i_src2), 0)) {
7884e98e3e1Schristos   {
7894e98e3e1Schristos     USI opval = FLD (i_disp16);
7904e98e3e1Schristos     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
7914e98e3e1Schristos     written |= (1 << 2);
792212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
7934e98e3e1Schristos   }
7944e98e3e1Schristos }
7954e98e3e1Schristos 
7964e98e3e1Schristos   abuf->written = written;
7974e98e3e1Schristos   SEM_BRANCH_FINI (vpc);
7984e98e3e1Schristos #undef FLD
7994e98e3e1Schristos }
8004e98e3e1Schristos   NEXT (vpc);
8014e98e3e1Schristos 
8024e98e3e1Schristos   CASE (sem, INSN_BNEZ) : /* bnez $src2,$disp16 */
8034e98e3e1Schristos {
8044e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
8054e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
8064e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_beq.f
8074e98e3e1Schristos   int UNUSED written = 0;
8084e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
8094e98e3e1Schristos   SEM_BRANCH_INIT
8104e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
8114e98e3e1Schristos 
8124e98e3e1Schristos if (NESI (* FLD (i_src2), 0)) {
8134e98e3e1Schristos   {
8144e98e3e1Schristos     USI opval = FLD (i_disp16);
8154e98e3e1Schristos     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
8164e98e3e1Schristos     written |= (1 << 2);
817212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
8184e98e3e1Schristos   }
8194e98e3e1Schristos }
8204e98e3e1Schristos 
8214e98e3e1Schristos   abuf->written = written;
8224e98e3e1Schristos   SEM_BRANCH_FINI (vpc);
8234e98e3e1Schristos #undef FLD
8244e98e3e1Schristos }
8254e98e3e1Schristos   NEXT (vpc);
8264e98e3e1Schristos 
8274e98e3e1Schristos   CASE (sem, INSN_BL8) : /* bl.s $disp8 */
8284e98e3e1Schristos {
8294e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
8304e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
8314e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_bl8.f
8324e98e3e1Schristos   int UNUSED written = 0;
8334e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
8344e98e3e1Schristos   SEM_BRANCH_INIT
8354e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
8364e98e3e1Schristos 
8374e98e3e1Schristos {
8384e98e3e1Schristos   {
8394e98e3e1Schristos     SI opval = ADDSI (ANDSI (pc, -4), 4);
8404e98e3e1Schristos     CPU (h_gr[((UINT) 14)]) = opval;
841212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
8424e98e3e1Schristos   }
8434e98e3e1Schristos   {
8444e98e3e1Schristos     USI opval = FLD (i_disp8);
8454e98e3e1Schristos     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
846212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
8474e98e3e1Schristos   }
8484e98e3e1Schristos }
8494e98e3e1Schristos 
8504e98e3e1Schristos   SEM_BRANCH_FINI (vpc);
8514e98e3e1Schristos #undef FLD
8524e98e3e1Schristos }
8534e98e3e1Schristos   NEXT (vpc);
8544e98e3e1Schristos 
8554e98e3e1Schristos   CASE (sem, INSN_BL24) : /* bl.l $disp24 */
8564e98e3e1Schristos {
8574e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
8584e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
8594e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_bl24.f
8604e98e3e1Schristos   int UNUSED written = 0;
8614e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
8624e98e3e1Schristos   SEM_BRANCH_INIT
8634e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
8644e98e3e1Schristos 
8654e98e3e1Schristos {
8664e98e3e1Schristos   {
8674e98e3e1Schristos     SI opval = ADDSI (pc, 4);
8684e98e3e1Schristos     CPU (h_gr[((UINT) 14)]) = opval;
869212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
8704e98e3e1Schristos   }
8714e98e3e1Schristos   {
8724e98e3e1Schristos     USI opval = FLD (i_disp24);
8734e98e3e1Schristos     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
874212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
8754e98e3e1Schristos   }
8764e98e3e1Schristos }
8774e98e3e1Schristos 
8784e98e3e1Schristos   SEM_BRANCH_FINI (vpc);
8794e98e3e1Schristos #undef FLD
8804e98e3e1Schristos }
8814e98e3e1Schristos   NEXT (vpc);
8824e98e3e1Schristos 
8834e98e3e1Schristos   CASE (sem, INSN_BNC8) : /* bnc.s $disp8 */
8844e98e3e1Schristos {
8854e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
8864e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
8874e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_bl8.f
8884e98e3e1Schristos   int UNUSED written = 0;
8894e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
8904e98e3e1Schristos   SEM_BRANCH_INIT
8914e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
8924e98e3e1Schristos 
8934e98e3e1Schristos if (NOTBI (CPU (h_cond))) {
8944e98e3e1Schristos   {
8954e98e3e1Schristos     USI opval = FLD (i_disp8);
8964e98e3e1Schristos     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
8974e98e3e1Schristos     written |= (1 << 2);
898212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
8994e98e3e1Schristos   }
9004e98e3e1Schristos }
9014e98e3e1Schristos 
9024e98e3e1Schristos   abuf->written = written;
9034e98e3e1Schristos   SEM_BRANCH_FINI (vpc);
9044e98e3e1Schristos #undef FLD
9054e98e3e1Schristos }
9064e98e3e1Schristos   NEXT (vpc);
9074e98e3e1Schristos 
9084e98e3e1Schristos   CASE (sem, INSN_BNC24) : /* bnc.l $disp24 */
9094e98e3e1Schristos {
9104e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
9114e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
9124e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_bl24.f
9134e98e3e1Schristos   int UNUSED written = 0;
9144e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
9154e98e3e1Schristos   SEM_BRANCH_INIT
9164e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
9174e98e3e1Schristos 
9184e98e3e1Schristos if (NOTBI (CPU (h_cond))) {
9194e98e3e1Schristos   {
9204e98e3e1Schristos     USI opval = FLD (i_disp24);
9214e98e3e1Schristos     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
9224e98e3e1Schristos     written |= (1 << 2);
923212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
9244e98e3e1Schristos   }
9254e98e3e1Schristos }
9264e98e3e1Schristos 
9274e98e3e1Schristos   abuf->written = written;
9284e98e3e1Schristos   SEM_BRANCH_FINI (vpc);
9294e98e3e1Schristos #undef FLD
9304e98e3e1Schristos }
9314e98e3e1Schristos   NEXT (vpc);
9324e98e3e1Schristos 
9334e98e3e1Schristos   CASE (sem, INSN_BNE) : /* bne $src1,$src2,$disp16 */
9344e98e3e1Schristos {
9354e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
9364e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
9374e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_beq.f
9384e98e3e1Schristos   int UNUSED written = 0;
9394e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
9404e98e3e1Schristos   SEM_BRANCH_INIT
9414e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
9424e98e3e1Schristos 
9434e98e3e1Schristos if (NESI (* FLD (i_src1), * FLD (i_src2))) {
9444e98e3e1Schristos   {
9454e98e3e1Schristos     USI opval = FLD (i_disp16);
9464e98e3e1Schristos     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
9474e98e3e1Schristos     written |= (1 << 3);
948212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
9494e98e3e1Schristos   }
9504e98e3e1Schristos }
9514e98e3e1Schristos 
9524e98e3e1Schristos   abuf->written = written;
9534e98e3e1Schristos   SEM_BRANCH_FINI (vpc);
9544e98e3e1Schristos #undef FLD
9554e98e3e1Schristos }
9564e98e3e1Schristos   NEXT (vpc);
9574e98e3e1Schristos 
9584e98e3e1Schristos   CASE (sem, INSN_BRA8) : /* bra.s $disp8 */
9594e98e3e1Schristos {
9604e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
9614e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
9624e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_bl8.f
9634e98e3e1Schristos   int UNUSED written = 0;
9644e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
9654e98e3e1Schristos   SEM_BRANCH_INIT
9664e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
9674e98e3e1Schristos 
9684e98e3e1Schristos   {
9694e98e3e1Schristos     USI opval = FLD (i_disp8);
9704e98e3e1Schristos     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
971212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
9724e98e3e1Schristos   }
9734e98e3e1Schristos 
9744e98e3e1Schristos   SEM_BRANCH_FINI (vpc);
9754e98e3e1Schristos #undef FLD
9764e98e3e1Schristos }
9774e98e3e1Schristos   NEXT (vpc);
9784e98e3e1Schristos 
9794e98e3e1Schristos   CASE (sem, INSN_BRA24) : /* bra.l $disp24 */
9804e98e3e1Schristos {
9814e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
9824e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
9834e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_bl24.f
9844e98e3e1Schristos   int UNUSED written = 0;
9854e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
9864e98e3e1Schristos   SEM_BRANCH_INIT
9874e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
9884e98e3e1Schristos 
9894e98e3e1Schristos   {
9904e98e3e1Schristos     USI opval = FLD (i_disp24);
9914e98e3e1Schristos     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
992212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
9934e98e3e1Schristos   }
9944e98e3e1Schristos 
9954e98e3e1Schristos   SEM_BRANCH_FINI (vpc);
9964e98e3e1Schristos #undef FLD
9974e98e3e1Schristos }
9984e98e3e1Schristos   NEXT (vpc);
9994e98e3e1Schristos 
10004e98e3e1Schristos   CASE (sem, INSN_CMP) : /* cmp $src1,$src2 */
10014e98e3e1Schristos {
10024e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
10034e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
10044e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_st_plus.f
10054e98e3e1Schristos   int UNUSED written = 0;
10064e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
10074e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
10084e98e3e1Schristos 
10094e98e3e1Schristos   {
10104e98e3e1Schristos     BI opval = LTSI (* FLD (i_src1), * FLD (i_src2));
10114e98e3e1Schristos     CPU (h_cond) = opval;
1012212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
10134e98e3e1Schristos   }
10144e98e3e1Schristos 
10154e98e3e1Schristos #undef FLD
10164e98e3e1Schristos }
10174e98e3e1Schristos   NEXT (vpc);
10184e98e3e1Schristos 
10194e98e3e1Schristos   CASE (sem, INSN_CMPI) : /* cmpi $src2,$simm16 */
10204e98e3e1Schristos {
10214e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
10224e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
10234e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_st_d.f
10244e98e3e1Schristos   int UNUSED written = 0;
10254e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
10264e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
10274e98e3e1Schristos 
10284e98e3e1Schristos   {
10294e98e3e1Schristos     BI opval = LTSI (* FLD (i_src2), FLD (f_simm16));
10304e98e3e1Schristos     CPU (h_cond) = opval;
1031212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
10324e98e3e1Schristos   }
10334e98e3e1Schristos 
10344e98e3e1Schristos #undef FLD
10354e98e3e1Schristos }
10364e98e3e1Schristos   NEXT (vpc);
10374e98e3e1Schristos 
10384e98e3e1Schristos   CASE (sem, INSN_CMPU) : /* cmpu $src1,$src2 */
10394e98e3e1Schristos {
10404e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
10414e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
10424e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_st_plus.f
10434e98e3e1Schristos   int UNUSED written = 0;
10444e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
10454e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
10464e98e3e1Schristos 
10474e98e3e1Schristos   {
10484e98e3e1Schristos     BI opval = LTUSI (* FLD (i_src1), * FLD (i_src2));
10494e98e3e1Schristos     CPU (h_cond) = opval;
1050212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
10514e98e3e1Schristos   }
10524e98e3e1Schristos 
10534e98e3e1Schristos #undef FLD
10544e98e3e1Schristos }
10554e98e3e1Schristos   NEXT (vpc);
10564e98e3e1Schristos 
10574e98e3e1Schristos   CASE (sem, INSN_CMPUI) : /* cmpui $src2,$simm16 */
10584e98e3e1Schristos {
10594e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
10604e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
10614e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_st_d.f
10624e98e3e1Schristos   int UNUSED written = 0;
10634e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
10644e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
10654e98e3e1Schristos 
10664e98e3e1Schristos   {
10674e98e3e1Schristos     BI opval = LTUSI (* FLD (i_src2), FLD (f_simm16));
10684e98e3e1Schristos     CPU (h_cond) = opval;
1069212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
10704e98e3e1Schristos   }
10714e98e3e1Schristos 
10724e98e3e1Schristos #undef FLD
10734e98e3e1Schristos }
10744e98e3e1Schristos   NEXT (vpc);
10754e98e3e1Schristos 
10764e98e3e1Schristos   CASE (sem, INSN_DIV) : /* div $dr,$sr */
10774e98e3e1Schristos {
10784e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
10794e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
10804e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_add.f
10814e98e3e1Schristos   int UNUSED written = 0;
10824e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
10834e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
10844e98e3e1Schristos 
10854e98e3e1Schristos if (NESI (* FLD (i_sr), 0)) {
10864e98e3e1Schristos   {
10874e98e3e1Schristos     SI opval = DIVSI (* FLD (i_dr), * FLD (i_sr));
10884e98e3e1Schristos     * FLD (i_dr) = opval;
10894e98e3e1Schristos     written |= (1 << 2);
1090212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
10914e98e3e1Schristos   }
10924e98e3e1Schristos }
10934e98e3e1Schristos 
10944e98e3e1Schristos   abuf->written = written;
10954e98e3e1Schristos #undef FLD
10964e98e3e1Schristos }
10974e98e3e1Schristos   NEXT (vpc);
10984e98e3e1Schristos 
10994e98e3e1Schristos   CASE (sem, INSN_DIVU) : /* divu $dr,$sr */
11004e98e3e1Schristos {
11014e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
11024e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
11034e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_add.f
11044e98e3e1Schristos   int UNUSED written = 0;
11054e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
11064e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
11074e98e3e1Schristos 
11084e98e3e1Schristos if (NESI (* FLD (i_sr), 0)) {
11094e98e3e1Schristos   {
11104e98e3e1Schristos     SI opval = UDIVSI (* FLD (i_dr), * FLD (i_sr));
11114e98e3e1Schristos     * FLD (i_dr) = opval;
11124e98e3e1Schristos     written |= (1 << 2);
1113212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
11144e98e3e1Schristos   }
11154e98e3e1Schristos }
11164e98e3e1Schristos 
11174e98e3e1Schristos   abuf->written = written;
11184e98e3e1Schristos #undef FLD
11194e98e3e1Schristos }
11204e98e3e1Schristos   NEXT (vpc);
11214e98e3e1Schristos 
11224e98e3e1Schristos   CASE (sem, INSN_REM) : /* rem $dr,$sr */
11234e98e3e1Schristos {
11244e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
11254e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
11264e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_add.f
11274e98e3e1Schristos   int UNUSED written = 0;
11284e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
11294e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
11304e98e3e1Schristos 
11314e98e3e1Schristos if (NESI (* FLD (i_sr), 0)) {
11324e98e3e1Schristos   {
11334e98e3e1Schristos     SI opval = MODSI (* FLD (i_dr), * FLD (i_sr));
11344e98e3e1Schristos     * FLD (i_dr) = opval;
11354e98e3e1Schristos     written |= (1 << 2);
1136212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
11374e98e3e1Schristos   }
11384e98e3e1Schristos }
11394e98e3e1Schristos 
11404e98e3e1Schristos   abuf->written = written;
11414e98e3e1Schristos #undef FLD
11424e98e3e1Schristos }
11434e98e3e1Schristos   NEXT (vpc);
11444e98e3e1Schristos 
11454e98e3e1Schristos   CASE (sem, INSN_REMU) : /* remu $dr,$sr */
11464e98e3e1Schristos {
11474e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
11484e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
11494e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_add.f
11504e98e3e1Schristos   int UNUSED written = 0;
11514e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
11524e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
11534e98e3e1Schristos 
11544e98e3e1Schristos if (NESI (* FLD (i_sr), 0)) {
11554e98e3e1Schristos   {
11564e98e3e1Schristos     SI opval = UMODSI (* FLD (i_dr), * FLD (i_sr));
11574e98e3e1Schristos     * FLD (i_dr) = opval;
11584e98e3e1Schristos     written |= (1 << 2);
1159212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
11604e98e3e1Schristos   }
11614e98e3e1Schristos }
11624e98e3e1Schristos 
11634e98e3e1Schristos   abuf->written = written;
11644e98e3e1Schristos #undef FLD
11654e98e3e1Schristos }
11664e98e3e1Schristos   NEXT (vpc);
11674e98e3e1Schristos 
11684e98e3e1Schristos   CASE (sem, INSN_JL) : /* jl $sr */
11694e98e3e1Schristos {
11704e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
11714e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
11724e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_jl.f
11734e98e3e1Schristos   int UNUSED written = 0;
11744e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
11754e98e3e1Schristos   SEM_BRANCH_INIT
11764e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
11774e98e3e1Schristos 
11784e98e3e1Schristos {
11794e98e3e1Schristos   SI temp0;USI temp1;
11804e98e3e1Schristos   temp0 = ADDSI (ANDSI (pc, -4), 4);
11814e98e3e1Schristos   temp1 = ANDSI (* FLD (i_sr), -4);
11824e98e3e1Schristos   {
11834e98e3e1Schristos     SI opval = temp0;
11844e98e3e1Schristos     CPU (h_gr[((UINT) 14)]) = opval;
1185212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
11864e98e3e1Schristos   }
11874e98e3e1Schristos   {
11884e98e3e1Schristos     USI opval = temp1;
11894e98e3e1Schristos     SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
1190212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
11914e98e3e1Schristos   }
11924e98e3e1Schristos }
11934e98e3e1Schristos 
11944e98e3e1Schristos   SEM_BRANCH_FINI (vpc);
11954e98e3e1Schristos #undef FLD
11964e98e3e1Schristos }
11974e98e3e1Schristos   NEXT (vpc);
11984e98e3e1Schristos 
11994e98e3e1Schristos   CASE (sem, INSN_JMP) : /* jmp $sr */
12004e98e3e1Schristos {
12014e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
12024e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
12034e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_jl.f
12044e98e3e1Schristos   int UNUSED written = 0;
12054e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
12064e98e3e1Schristos   SEM_BRANCH_INIT
12074e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
12084e98e3e1Schristos 
12094e98e3e1Schristos   {
12104e98e3e1Schristos     USI opval = ANDSI (* FLD (i_sr), -4);
12114e98e3e1Schristos     SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
1212212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
12134e98e3e1Schristos   }
12144e98e3e1Schristos 
12154e98e3e1Schristos   SEM_BRANCH_FINI (vpc);
12164e98e3e1Schristos #undef FLD
12174e98e3e1Schristos }
12184e98e3e1Schristos   NEXT (vpc);
12194e98e3e1Schristos 
12204e98e3e1Schristos   CASE (sem, INSN_LD) : /* ld $dr,@$sr */
12214e98e3e1Schristos {
12224e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
12234e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
12244e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_ld_plus.f
12254e98e3e1Schristos   int UNUSED written = 0;
12264e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
12274e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
12284e98e3e1Schristos 
12294e98e3e1Schristos   {
12304e98e3e1Schristos     SI opval = GETMEMSI (current_cpu, pc, * FLD (i_sr));
12314e98e3e1Schristos     * FLD (i_dr) = opval;
1232212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
12334e98e3e1Schristos   }
12344e98e3e1Schristos 
12354e98e3e1Schristos #undef FLD
12364e98e3e1Schristos }
12374e98e3e1Schristos   NEXT (vpc);
12384e98e3e1Schristos 
12394e98e3e1Schristos   CASE (sem, INSN_LD_D) : /* ld $dr,@($slo16,$sr) */
12404e98e3e1Schristos {
12414e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
12424e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
12434e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_add3.f
12444e98e3e1Schristos   int UNUSED written = 0;
12454e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
12464e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
12474e98e3e1Schristos 
12484e98e3e1Schristos   {
12494e98e3e1Schristos     SI opval = GETMEMSI (current_cpu, pc, ADDSI (* FLD (i_sr), FLD (f_simm16)));
12504e98e3e1Schristos     * FLD (i_dr) = opval;
1251212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
12524e98e3e1Schristos   }
12534e98e3e1Schristos 
12544e98e3e1Schristos #undef FLD
12554e98e3e1Schristos }
12564e98e3e1Schristos   NEXT (vpc);
12574e98e3e1Schristos 
12584e98e3e1Schristos   CASE (sem, INSN_LDB) : /* ldb $dr,@$sr */
12594e98e3e1Schristos {
12604e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
12614e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
12624e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_ld_plus.f
12634e98e3e1Schristos   int UNUSED written = 0;
12644e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
12654e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
12664e98e3e1Schristos 
12674e98e3e1Schristos   {
12684e98e3e1Schristos     SI opval = EXTQISI (GETMEMQI (current_cpu, pc, * FLD (i_sr)));
12694e98e3e1Schristos     * FLD (i_dr) = opval;
1270212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
12714e98e3e1Schristos   }
12724e98e3e1Schristos 
12734e98e3e1Schristos #undef FLD
12744e98e3e1Schristos }
12754e98e3e1Schristos   NEXT (vpc);
12764e98e3e1Schristos 
12774e98e3e1Schristos   CASE (sem, INSN_LDB_D) : /* ldb $dr,@($slo16,$sr) */
12784e98e3e1Schristos {
12794e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
12804e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
12814e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_add3.f
12824e98e3e1Schristos   int UNUSED written = 0;
12834e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
12844e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
12854e98e3e1Schristos 
12864e98e3e1Schristos   {
12874e98e3e1Schristos     SI opval = EXTQISI (GETMEMQI (current_cpu, pc, ADDSI (* FLD (i_sr), FLD (f_simm16))));
12884e98e3e1Schristos     * FLD (i_dr) = opval;
1289212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
12904e98e3e1Schristos   }
12914e98e3e1Schristos 
12924e98e3e1Schristos #undef FLD
12934e98e3e1Schristos }
12944e98e3e1Schristos   NEXT (vpc);
12954e98e3e1Schristos 
12964e98e3e1Schristos   CASE (sem, INSN_LDH) : /* ldh $dr,@$sr */
12974e98e3e1Schristos {
12984e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
12994e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
13004e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_ld_plus.f
13014e98e3e1Schristos   int UNUSED written = 0;
13024e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
13034e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
13044e98e3e1Schristos 
13054e98e3e1Schristos   {
13064e98e3e1Schristos     SI opval = EXTHISI (GETMEMHI (current_cpu, pc, * FLD (i_sr)));
13074e98e3e1Schristos     * FLD (i_dr) = opval;
1308212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
13094e98e3e1Schristos   }
13104e98e3e1Schristos 
13114e98e3e1Schristos #undef FLD
13124e98e3e1Schristos }
13134e98e3e1Schristos   NEXT (vpc);
13144e98e3e1Schristos 
13154e98e3e1Schristos   CASE (sem, INSN_LDH_D) : /* ldh $dr,@($slo16,$sr) */
13164e98e3e1Schristos {
13174e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
13184e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
13194e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_add3.f
13204e98e3e1Schristos   int UNUSED written = 0;
13214e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
13224e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
13234e98e3e1Schristos 
13244e98e3e1Schristos   {
13254e98e3e1Schristos     SI opval = EXTHISI (GETMEMHI (current_cpu, pc, ADDSI (* FLD (i_sr), FLD (f_simm16))));
13264e98e3e1Schristos     * FLD (i_dr) = opval;
1327212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
13284e98e3e1Schristos   }
13294e98e3e1Schristos 
13304e98e3e1Schristos #undef FLD
13314e98e3e1Schristos }
13324e98e3e1Schristos   NEXT (vpc);
13334e98e3e1Schristos 
13344e98e3e1Schristos   CASE (sem, INSN_LDUB) : /* ldub $dr,@$sr */
13354e98e3e1Schristos {
13364e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
13374e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
13384e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_ld_plus.f
13394e98e3e1Schristos   int UNUSED written = 0;
13404e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
13414e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
13424e98e3e1Schristos 
13434e98e3e1Schristos   {
13444e98e3e1Schristos     SI opval = ZEXTQISI (GETMEMQI (current_cpu, pc, * FLD (i_sr)));
13454e98e3e1Schristos     * FLD (i_dr) = opval;
1346212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
13474e98e3e1Schristos   }
13484e98e3e1Schristos 
13494e98e3e1Schristos #undef FLD
13504e98e3e1Schristos }
13514e98e3e1Schristos   NEXT (vpc);
13524e98e3e1Schristos 
13534e98e3e1Schristos   CASE (sem, INSN_LDUB_D) : /* ldub $dr,@($slo16,$sr) */
13544e98e3e1Schristos {
13554e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
13564e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
13574e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_add3.f
13584e98e3e1Schristos   int UNUSED written = 0;
13594e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
13604e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
13614e98e3e1Schristos 
13624e98e3e1Schristos   {
13634e98e3e1Schristos     SI opval = ZEXTQISI (GETMEMQI (current_cpu, pc, ADDSI (* FLD (i_sr), FLD (f_simm16))));
13644e98e3e1Schristos     * FLD (i_dr) = opval;
1365212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
13664e98e3e1Schristos   }
13674e98e3e1Schristos 
13684e98e3e1Schristos #undef FLD
13694e98e3e1Schristos }
13704e98e3e1Schristos   NEXT (vpc);
13714e98e3e1Schristos 
13724e98e3e1Schristos   CASE (sem, INSN_LDUH) : /* lduh $dr,@$sr */
13734e98e3e1Schristos {
13744e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
13754e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
13764e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_ld_plus.f
13774e98e3e1Schristos   int UNUSED written = 0;
13784e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
13794e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
13804e98e3e1Schristos 
13814e98e3e1Schristos   {
13824e98e3e1Schristos     SI opval = ZEXTHISI (GETMEMHI (current_cpu, pc, * FLD (i_sr)));
13834e98e3e1Schristos     * FLD (i_dr) = opval;
1384212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
13854e98e3e1Schristos   }
13864e98e3e1Schristos 
13874e98e3e1Schristos #undef FLD
13884e98e3e1Schristos }
13894e98e3e1Schristos   NEXT (vpc);
13904e98e3e1Schristos 
13914e98e3e1Schristos   CASE (sem, INSN_LDUH_D) : /* lduh $dr,@($slo16,$sr) */
13924e98e3e1Schristos {
13934e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
13944e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
13954e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_add3.f
13964e98e3e1Schristos   int UNUSED written = 0;
13974e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
13984e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
13994e98e3e1Schristos 
14004e98e3e1Schristos   {
14014e98e3e1Schristos     SI opval = ZEXTHISI (GETMEMHI (current_cpu, pc, ADDSI (* FLD (i_sr), FLD (f_simm16))));
14024e98e3e1Schristos     * FLD (i_dr) = opval;
1403212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
14044e98e3e1Schristos   }
14054e98e3e1Schristos 
14064e98e3e1Schristos #undef FLD
14074e98e3e1Schristos }
14084e98e3e1Schristos   NEXT (vpc);
14094e98e3e1Schristos 
14104e98e3e1Schristos   CASE (sem, INSN_LD_PLUS) : /* ld $dr,@$sr+ */
14114e98e3e1Schristos {
14124e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
14134e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
14144e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_ld_plus.f
14154e98e3e1Schristos   int UNUSED written = 0;
14164e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
14174e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
14184e98e3e1Schristos 
14194e98e3e1Schristos {
14204e98e3e1Schristos   SI temp0;SI temp1;
14214e98e3e1Schristos   temp0 = GETMEMSI (current_cpu, pc, * FLD (i_sr));
14224e98e3e1Schristos   temp1 = ADDSI (* FLD (i_sr), 4);
14234e98e3e1Schristos   {
14244e98e3e1Schristos     SI opval = temp0;
14254e98e3e1Schristos     * FLD (i_dr) = opval;
1426212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
14274e98e3e1Schristos   }
14284e98e3e1Schristos   {
14294e98e3e1Schristos     SI opval = temp1;
14304e98e3e1Schristos     * FLD (i_sr) = opval;
1431212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
14324e98e3e1Schristos   }
14334e98e3e1Schristos }
14344e98e3e1Schristos 
14354e98e3e1Schristos #undef FLD
14364e98e3e1Schristos }
14374e98e3e1Schristos   NEXT (vpc);
14384e98e3e1Schristos 
14394e98e3e1Schristos   CASE (sem, INSN_LD24) : /* ld24 $dr,$uimm24 */
14404e98e3e1Schristos {
14414e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
14424e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
14434e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_ld24.f
14444e98e3e1Schristos   int UNUSED written = 0;
14454e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
14464e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
14474e98e3e1Schristos 
14484e98e3e1Schristos   {
14494e98e3e1Schristos     SI opval = FLD (i_uimm24);
14504e98e3e1Schristos     * FLD (i_dr) = opval;
1451212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
14524e98e3e1Schristos   }
14534e98e3e1Schristos 
14544e98e3e1Schristos #undef FLD
14554e98e3e1Schristos }
14564e98e3e1Schristos   NEXT (vpc);
14574e98e3e1Schristos 
14584e98e3e1Schristos   CASE (sem, INSN_LDI8) : /* ldi8 $dr,$simm8 */
14594e98e3e1Schristos {
14604e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
14614e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
14624e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_addi.f
14634e98e3e1Schristos   int UNUSED written = 0;
14644e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
14654e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
14664e98e3e1Schristos 
14674e98e3e1Schristos   {
14684e98e3e1Schristos     SI opval = FLD (f_simm8);
14694e98e3e1Schristos     * FLD (i_dr) = opval;
1470212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
14714e98e3e1Schristos   }
14724e98e3e1Schristos 
14734e98e3e1Schristos #undef FLD
14744e98e3e1Schristos }
14754e98e3e1Schristos   NEXT (vpc);
14764e98e3e1Schristos 
14774e98e3e1Schristos   CASE (sem, INSN_LDI16) : /* ldi16 $dr,$hash$slo16 */
14784e98e3e1Schristos {
14794e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
14804e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
14814e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_add3.f
14824e98e3e1Schristos   int UNUSED written = 0;
14834e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
14844e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
14854e98e3e1Schristos 
14864e98e3e1Schristos   {
14874e98e3e1Schristos     SI opval = FLD (f_simm16);
14884e98e3e1Schristos     * FLD (i_dr) = opval;
1489212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
14904e98e3e1Schristos   }
14914e98e3e1Schristos 
14924e98e3e1Schristos #undef FLD
14934e98e3e1Schristos }
14944e98e3e1Schristos   NEXT (vpc);
14954e98e3e1Schristos 
14964e98e3e1Schristos   CASE (sem, INSN_LOCK) : /* lock $dr,@$sr */
14974e98e3e1Schristos {
14984e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
14994e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
15004e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_ld_plus.f
15014e98e3e1Schristos   int UNUSED written = 0;
15024e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
15034e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
15044e98e3e1Schristos 
15054e98e3e1Schristos {
15064e98e3e1Schristos   {
15074e98e3e1Schristos     BI opval = 1;
15084e98e3e1Schristos     CPU (h_lock) = opval;
1509212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "lock", 'x', opval);
15104e98e3e1Schristos   }
15114e98e3e1Schristos   {
15124e98e3e1Schristos     SI opval = GETMEMSI (current_cpu, pc, * FLD (i_sr));
15134e98e3e1Schristos     * FLD (i_dr) = opval;
1514212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
15154e98e3e1Schristos   }
15164e98e3e1Schristos }
15174e98e3e1Schristos 
15184e98e3e1Schristos #undef FLD
15194e98e3e1Schristos }
15204e98e3e1Schristos   NEXT (vpc);
15214e98e3e1Schristos 
15224e98e3e1Schristos   CASE (sem, INSN_MACHI) : /* machi $src1,$src2 */
15234e98e3e1Schristos {
15244e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
15254e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
15264e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_st_plus.f
15274e98e3e1Schristos   int UNUSED written = 0;
15284e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
15294e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
15304e98e3e1Schristos 
15314e98e3e1Schristos   {
15324e98e3e1Schristos     DI opval = SRADI (SLLDI (ADDDI (GET_H_ACCUM (), MULDI (EXTSIDI (ANDSI (* FLD (i_src1), 0xffff0000)), EXTHIDI (TRUNCSIHI (SRASI (* FLD (i_src2), 16))))), 8), 8);
15334e98e3e1Schristos     SET_H_ACCUM (opval);
1534212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "accum", 'D', opval);
15354e98e3e1Schristos   }
15364e98e3e1Schristos 
15374e98e3e1Schristos #undef FLD
15384e98e3e1Schristos }
15394e98e3e1Schristos   NEXT (vpc);
15404e98e3e1Schristos 
15414e98e3e1Schristos   CASE (sem, INSN_MACLO) : /* maclo $src1,$src2 */
15424e98e3e1Schristos {
15434e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
15444e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
15454e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_st_plus.f
15464e98e3e1Schristos   int UNUSED written = 0;
15474e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
15484e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
15494e98e3e1Schristos 
15504e98e3e1Schristos   {
15514e98e3e1Schristos     DI opval = SRADI (SLLDI (ADDDI (GET_H_ACCUM (), MULDI (EXTSIDI (SLLSI (* FLD (i_src1), 16)), EXTHIDI (TRUNCSIHI (* FLD (i_src2))))), 8), 8);
15524e98e3e1Schristos     SET_H_ACCUM (opval);
1553212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "accum", 'D', opval);
15544e98e3e1Schristos   }
15554e98e3e1Schristos 
15564e98e3e1Schristos #undef FLD
15574e98e3e1Schristos }
15584e98e3e1Schristos   NEXT (vpc);
15594e98e3e1Schristos 
15604e98e3e1Schristos   CASE (sem, INSN_MACWHI) : /* macwhi $src1,$src2 */
15614e98e3e1Schristos {
15624e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
15634e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
15644e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_st_plus.f
15654e98e3e1Schristos   int UNUSED written = 0;
15664e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
15674e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
15684e98e3e1Schristos 
15694e98e3e1Schristos   {
15704e98e3e1Schristos     DI opval = SRADI (SLLDI (ADDDI (GET_H_ACCUM (), MULDI (EXTSIDI (* FLD (i_src1)), EXTHIDI (TRUNCSIHI (SRASI (* FLD (i_src2), 16))))), 8), 8);
15714e98e3e1Schristos     SET_H_ACCUM (opval);
1572212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "accum", 'D', opval);
15734e98e3e1Schristos   }
15744e98e3e1Schristos 
15754e98e3e1Schristos #undef FLD
15764e98e3e1Schristos }
15774e98e3e1Schristos   NEXT (vpc);
15784e98e3e1Schristos 
15794e98e3e1Schristos   CASE (sem, INSN_MACWLO) : /* macwlo $src1,$src2 */
15804e98e3e1Schristos {
15814e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
15824e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
15834e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_st_plus.f
15844e98e3e1Schristos   int UNUSED written = 0;
15854e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
15864e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
15874e98e3e1Schristos 
15884e98e3e1Schristos   {
15894e98e3e1Schristos     DI opval = SRADI (SLLDI (ADDDI (GET_H_ACCUM (), MULDI (EXTSIDI (* FLD (i_src1)), EXTHIDI (TRUNCSIHI (* FLD (i_src2))))), 8), 8);
15904e98e3e1Schristos     SET_H_ACCUM (opval);
1591212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "accum", 'D', opval);
15924e98e3e1Schristos   }
15934e98e3e1Schristos 
15944e98e3e1Schristos #undef FLD
15954e98e3e1Schristos }
15964e98e3e1Schristos   NEXT (vpc);
15974e98e3e1Schristos 
15984e98e3e1Schristos   CASE (sem, INSN_MUL) : /* mul $dr,$sr */
15994e98e3e1Schristos {
16004e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
16014e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
16024e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_add.f
16034e98e3e1Schristos   int UNUSED written = 0;
16044e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
16054e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
16064e98e3e1Schristos 
16074e98e3e1Schristos   {
16084e98e3e1Schristos     SI opval = MULSI (* FLD (i_dr), * FLD (i_sr));
16094e98e3e1Schristos     * FLD (i_dr) = opval;
1610212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
16114e98e3e1Schristos   }
16124e98e3e1Schristos 
16134e98e3e1Schristos #undef FLD
16144e98e3e1Schristos }
16154e98e3e1Schristos   NEXT (vpc);
16164e98e3e1Schristos 
16174e98e3e1Schristos   CASE (sem, INSN_MULHI) : /* mulhi $src1,$src2 */
16184e98e3e1Schristos {
16194e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
16204e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
16214e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_st_plus.f
16224e98e3e1Schristos   int UNUSED written = 0;
16234e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
16244e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
16254e98e3e1Schristos 
16264e98e3e1Schristos   {
16274e98e3e1Schristos     DI opval = SRADI (SLLDI (MULDI (EXTSIDI (ANDSI (* FLD (i_src1), 0xffff0000)), EXTHIDI (TRUNCSIHI (SRASI (* FLD (i_src2), 16)))), 16), 16);
16284e98e3e1Schristos     SET_H_ACCUM (opval);
1629212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "accum", 'D', opval);
16304e98e3e1Schristos   }
16314e98e3e1Schristos 
16324e98e3e1Schristos #undef FLD
16334e98e3e1Schristos }
16344e98e3e1Schristos   NEXT (vpc);
16354e98e3e1Schristos 
16364e98e3e1Schristos   CASE (sem, INSN_MULLO) : /* mullo $src1,$src2 */
16374e98e3e1Schristos {
16384e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
16394e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
16404e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_st_plus.f
16414e98e3e1Schristos   int UNUSED written = 0;
16424e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
16434e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
16444e98e3e1Schristos 
16454e98e3e1Schristos   {
16464e98e3e1Schristos     DI opval = SRADI (SLLDI (MULDI (EXTSIDI (SLLSI (* FLD (i_src1), 16)), EXTHIDI (TRUNCSIHI (* FLD (i_src2)))), 16), 16);
16474e98e3e1Schristos     SET_H_ACCUM (opval);
1648212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "accum", 'D', opval);
16494e98e3e1Schristos   }
16504e98e3e1Schristos 
16514e98e3e1Schristos #undef FLD
16524e98e3e1Schristos }
16534e98e3e1Schristos   NEXT (vpc);
16544e98e3e1Schristos 
16554e98e3e1Schristos   CASE (sem, INSN_MULWHI) : /* mulwhi $src1,$src2 */
16564e98e3e1Schristos {
16574e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
16584e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
16594e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_st_plus.f
16604e98e3e1Schristos   int UNUSED written = 0;
16614e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
16624e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
16634e98e3e1Schristos 
16644e98e3e1Schristos   {
16654e98e3e1Schristos     DI opval = SRADI (SLLDI (MULDI (EXTSIDI (* FLD (i_src1)), EXTHIDI (TRUNCSIHI (SRASI (* FLD (i_src2), 16)))), 8), 8);
16664e98e3e1Schristos     SET_H_ACCUM (opval);
1667212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "accum", 'D', opval);
16684e98e3e1Schristos   }
16694e98e3e1Schristos 
16704e98e3e1Schristos #undef FLD
16714e98e3e1Schristos }
16724e98e3e1Schristos   NEXT (vpc);
16734e98e3e1Schristos 
16744e98e3e1Schristos   CASE (sem, INSN_MULWLO) : /* mulwlo $src1,$src2 */
16754e98e3e1Schristos {
16764e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
16774e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
16784e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_st_plus.f
16794e98e3e1Schristos   int UNUSED written = 0;
16804e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
16814e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
16824e98e3e1Schristos 
16834e98e3e1Schristos   {
16844e98e3e1Schristos     DI opval = SRADI (SLLDI (MULDI (EXTSIDI (* FLD (i_src1)), EXTHIDI (TRUNCSIHI (* FLD (i_src2)))), 8), 8);
16854e98e3e1Schristos     SET_H_ACCUM (opval);
1686212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "accum", 'D', opval);
16874e98e3e1Schristos   }
16884e98e3e1Schristos 
16894e98e3e1Schristos #undef FLD
16904e98e3e1Schristos }
16914e98e3e1Schristos   NEXT (vpc);
16924e98e3e1Schristos 
16934e98e3e1Schristos   CASE (sem, INSN_MV) : /* mv $dr,$sr */
16944e98e3e1Schristos {
16954e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
16964e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
16974e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_ld_plus.f
16984e98e3e1Schristos   int UNUSED written = 0;
16994e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
17004e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
17014e98e3e1Schristos 
17024e98e3e1Schristos   {
17034e98e3e1Schristos     SI opval = * FLD (i_sr);
17044e98e3e1Schristos     * FLD (i_dr) = opval;
1705212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
17064e98e3e1Schristos   }
17074e98e3e1Schristos 
17084e98e3e1Schristos #undef FLD
17094e98e3e1Schristos }
17104e98e3e1Schristos   NEXT (vpc);
17114e98e3e1Schristos 
17124e98e3e1Schristos   CASE (sem, INSN_MVFACHI) : /* mvfachi $dr */
17134e98e3e1Schristos {
17144e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
17154e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
17164e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_seth.f
17174e98e3e1Schristos   int UNUSED written = 0;
17184e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
17194e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
17204e98e3e1Schristos 
17214e98e3e1Schristos   {
17224e98e3e1Schristos     SI opval = TRUNCDISI (SRADI (GET_H_ACCUM (), 32));
17234e98e3e1Schristos     * FLD (i_dr) = opval;
1724212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
17254e98e3e1Schristos   }
17264e98e3e1Schristos 
17274e98e3e1Schristos #undef FLD
17284e98e3e1Schristos }
17294e98e3e1Schristos   NEXT (vpc);
17304e98e3e1Schristos 
17314e98e3e1Schristos   CASE (sem, INSN_MVFACLO) : /* mvfaclo $dr */
17324e98e3e1Schristos {
17334e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
17344e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
17354e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_seth.f
17364e98e3e1Schristos   int UNUSED written = 0;
17374e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
17384e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
17394e98e3e1Schristos 
17404e98e3e1Schristos   {
17414e98e3e1Schristos     SI opval = TRUNCDISI (GET_H_ACCUM ());
17424e98e3e1Schristos     * FLD (i_dr) = opval;
1743212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
17444e98e3e1Schristos   }
17454e98e3e1Schristos 
17464e98e3e1Schristos #undef FLD
17474e98e3e1Schristos }
17484e98e3e1Schristos   NEXT (vpc);
17494e98e3e1Schristos 
17504e98e3e1Schristos   CASE (sem, INSN_MVFACMI) : /* mvfacmi $dr */
17514e98e3e1Schristos {
17524e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
17534e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
17544e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_seth.f
17554e98e3e1Schristos   int UNUSED written = 0;
17564e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
17574e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
17584e98e3e1Schristos 
17594e98e3e1Schristos   {
17604e98e3e1Schristos     SI opval = TRUNCDISI (SRADI (GET_H_ACCUM (), 16));
17614e98e3e1Schristos     * FLD (i_dr) = opval;
1762212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
17634e98e3e1Schristos   }
17644e98e3e1Schristos 
17654e98e3e1Schristos #undef FLD
17664e98e3e1Schristos }
17674e98e3e1Schristos   NEXT (vpc);
17684e98e3e1Schristos 
17694e98e3e1Schristos   CASE (sem, INSN_MVFC) : /* mvfc $dr,$scr */
17704e98e3e1Schristos {
17714e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
17724e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
17734e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_ld_plus.f
17744e98e3e1Schristos   int UNUSED written = 0;
17754e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
17764e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
17774e98e3e1Schristos 
17784e98e3e1Schristos   {
17794e98e3e1Schristos     SI opval = GET_H_CR (FLD (f_r2));
17804e98e3e1Schristos     * FLD (i_dr) = opval;
1781212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
17824e98e3e1Schristos   }
17834e98e3e1Schristos 
17844e98e3e1Schristos #undef FLD
17854e98e3e1Schristos }
17864e98e3e1Schristos   NEXT (vpc);
17874e98e3e1Schristos 
17884e98e3e1Schristos   CASE (sem, INSN_MVTACHI) : /* mvtachi $src1 */
17894e98e3e1Schristos {
17904e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
17914e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
17924e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_st_plus.f
17934e98e3e1Schristos   int UNUSED written = 0;
17944e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
17954e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
17964e98e3e1Schristos 
17974e98e3e1Schristos   {
17984e98e3e1Schristos     DI opval = ORDI (ANDDI (GET_H_ACCUM (), MAKEDI (0, 0xffffffff)), SLLDI (EXTSIDI (* FLD (i_src1)), 32));
17994e98e3e1Schristos     SET_H_ACCUM (opval);
1800212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "accum", 'D', opval);
18014e98e3e1Schristos   }
18024e98e3e1Schristos 
18034e98e3e1Schristos #undef FLD
18044e98e3e1Schristos }
18054e98e3e1Schristos   NEXT (vpc);
18064e98e3e1Schristos 
18074e98e3e1Schristos   CASE (sem, INSN_MVTACLO) : /* mvtaclo $src1 */
18084e98e3e1Schristos {
18094e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
18104e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
18114e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_st_plus.f
18124e98e3e1Schristos   int UNUSED written = 0;
18134e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
18144e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
18154e98e3e1Schristos 
18164e98e3e1Schristos   {
18174e98e3e1Schristos     DI opval = ORDI (ANDDI (GET_H_ACCUM (), MAKEDI (0xffffffff, 0)), ZEXTSIDI (* FLD (i_src1)));
18184e98e3e1Schristos     SET_H_ACCUM (opval);
1819212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "accum", 'D', opval);
18204e98e3e1Schristos   }
18214e98e3e1Schristos 
18224e98e3e1Schristos #undef FLD
18234e98e3e1Schristos }
18244e98e3e1Schristos   NEXT (vpc);
18254e98e3e1Schristos 
18264e98e3e1Schristos   CASE (sem, INSN_MVTC) : /* mvtc $sr,$dcr */
18274e98e3e1Schristos {
18284e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
18294e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
18304e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_ld_plus.f
18314e98e3e1Schristos   int UNUSED written = 0;
18324e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
18334e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
18344e98e3e1Schristos 
18354e98e3e1Schristos   {
18364e98e3e1Schristos     USI opval = * FLD (i_sr);
18374e98e3e1Schristos     SET_H_CR (FLD (f_r1), opval);
1838212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "cr", 'x', opval);
18394e98e3e1Schristos   }
18404e98e3e1Schristos 
18414e98e3e1Schristos #undef FLD
18424e98e3e1Schristos }
18434e98e3e1Schristos   NEXT (vpc);
18444e98e3e1Schristos 
18454e98e3e1Schristos   CASE (sem, INSN_NEG) : /* neg $dr,$sr */
18464e98e3e1Schristos {
18474e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
18484e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
18494e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_ld_plus.f
18504e98e3e1Schristos   int UNUSED written = 0;
18514e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
18524e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
18534e98e3e1Schristos 
18544e98e3e1Schristos   {
18554e98e3e1Schristos     SI opval = NEGSI (* FLD (i_sr));
18564e98e3e1Schristos     * FLD (i_dr) = opval;
1857212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
18584e98e3e1Schristos   }
18594e98e3e1Schristos 
18604e98e3e1Schristos #undef FLD
18614e98e3e1Schristos }
18624e98e3e1Schristos   NEXT (vpc);
18634e98e3e1Schristos 
18644e98e3e1Schristos   CASE (sem, INSN_NOP) : /* nop */
18654e98e3e1Schristos {
18664e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
18674e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
18684e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_empty.f
18694e98e3e1Schristos   int UNUSED written = 0;
18704e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
18714e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
18724e98e3e1Schristos 
18734e98e3e1Schristos PROFILE_COUNT_FILLNOPS (current_cpu, abuf->addr);
18744e98e3e1Schristos 
18754e98e3e1Schristos #undef FLD
18764e98e3e1Schristos }
18774e98e3e1Schristos   NEXT (vpc);
18784e98e3e1Schristos 
18794e98e3e1Schristos   CASE (sem, INSN_NOT) : /* not $dr,$sr */
18804e98e3e1Schristos {
18814e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
18824e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
18834e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_ld_plus.f
18844e98e3e1Schristos   int UNUSED written = 0;
18854e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
18864e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
18874e98e3e1Schristos 
18884e98e3e1Schristos   {
18894e98e3e1Schristos     SI opval = INVSI (* FLD (i_sr));
18904e98e3e1Schristos     * FLD (i_dr) = opval;
1891212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
18924e98e3e1Schristos   }
18934e98e3e1Schristos 
18944e98e3e1Schristos #undef FLD
18954e98e3e1Schristos }
18964e98e3e1Schristos   NEXT (vpc);
18974e98e3e1Schristos 
18984e98e3e1Schristos   CASE (sem, INSN_RAC) : /* rac */
18994e98e3e1Schristos {
19004e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
19014e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
19024e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_empty.f
19034e98e3e1Schristos   int UNUSED written = 0;
19044e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
19054e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
19064e98e3e1Schristos 
19074e98e3e1Schristos {
19084e98e3e1Schristos   DI tmp_tmp1;
19094e98e3e1Schristos   tmp_tmp1 = SLLDI (GET_H_ACCUM (), 1);
19104e98e3e1Schristos   tmp_tmp1 = ADDDI (tmp_tmp1, MAKEDI (0, 32768));
19114e98e3e1Schristos   {
19124e98e3e1Schristos     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)));
19134e98e3e1Schristos     SET_H_ACCUM (opval);
1914212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "accum", 'D', opval);
19154e98e3e1Schristos   }
19164e98e3e1Schristos }
19174e98e3e1Schristos 
19184e98e3e1Schristos #undef FLD
19194e98e3e1Schristos }
19204e98e3e1Schristos   NEXT (vpc);
19214e98e3e1Schristos 
19224e98e3e1Schristos   CASE (sem, INSN_RACH) : /* rach */
19234e98e3e1Schristos {
19244e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
19254e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
19264e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_empty.f
19274e98e3e1Schristos   int UNUSED written = 0;
19284e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
19294e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
19304e98e3e1Schristos 
19314e98e3e1Schristos {
19324e98e3e1Schristos   DI tmp_tmp1;
19334e98e3e1Schristos   tmp_tmp1 = ANDDI (GET_H_ACCUM (), MAKEDI (16777215, 0xffffffff));
19344e98e3e1Schristos if (ANDIF (GEDI (tmp_tmp1, MAKEDI (16383, 0x80000000)), LEDI (tmp_tmp1, MAKEDI (8388607, 0xffffffff)))) {
19354e98e3e1Schristos   tmp_tmp1 = MAKEDI (16383, 0x80000000);
19364e98e3e1Schristos } else {
19374e98e3e1Schristos if (ANDIF (GEDI (tmp_tmp1, MAKEDI (8388608, 0)), LEDI (tmp_tmp1, MAKEDI (16760832, 0)))) {
19384e98e3e1Schristos   tmp_tmp1 = MAKEDI (16760832, 0);
19394e98e3e1Schristos } else {
19404e98e3e1Schristos   tmp_tmp1 = ANDDI (ADDDI (GET_H_ACCUM (), MAKEDI (0, 1073741824)), MAKEDI (0xffffffff, 0x80000000));
19414e98e3e1Schristos }
19424e98e3e1Schristos }
19434e98e3e1Schristos   tmp_tmp1 = SLLDI (tmp_tmp1, 1);
19444e98e3e1Schristos   {
19454e98e3e1Schristos     DI opval = SRADI (SLLDI (tmp_tmp1, 7), 7);
19464e98e3e1Schristos     SET_H_ACCUM (opval);
1947212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "accum", 'D', opval);
19484e98e3e1Schristos   }
19494e98e3e1Schristos }
19504e98e3e1Schristos 
19514e98e3e1Schristos #undef FLD
19524e98e3e1Schristos }
19534e98e3e1Schristos   NEXT (vpc);
19544e98e3e1Schristos 
19554e98e3e1Schristos   CASE (sem, INSN_RTE) : /* rte */
19564e98e3e1Schristos {
19574e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
19584e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
19594e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_empty.f
19604e98e3e1Schristos   int UNUSED written = 0;
19614e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
19624e98e3e1Schristos   SEM_BRANCH_INIT
19634e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
19644e98e3e1Schristos 
19654e98e3e1Schristos {
19664e98e3e1Schristos   {
19674e98e3e1Schristos     USI opval = ANDSI (GET_H_CR (((UINT) 6)), -4);
19684e98e3e1Schristos     SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
1969212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
19704e98e3e1Schristos   }
19714e98e3e1Schristos   {
19724e98e3e1Schristos     USI opval = GET_H_CR (((UINT) 14));
19734e98e3e1Schristos     SET_H_CR (((UINT) 6), opval);
1974212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "cr", 'x', opval);
19754e98e3e1Schristos   }
19764e98e3e1Schristos   {
19774e98e3e1Schristos     UQI opval = CPU (h_bpsw);
19784e98e3e1Schristos     SET_H_PSW (opval);
1979212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "psw", 'x', opval);
19804e98e3e1Schristos   }
19814e98e3e1Schristos   {
19824e98e3e1Schristos     UQI opval = CPU (h_bbpsw);
19834e98e3e1Schristos     CPU (h_bpsw) = opval;
1984212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "bpsw", 'x', opval);
19854e98e3e1Schristos   }
19864e98e3e1Schristos }
19874e98e3e1Schristos 
19884e98e3e1Schristos   SEM_BRANCH_FINI (vpc);
19894e98e3e1Schristos #undef FLD
19904e98e3e1Schristos }
19914e98e3e1Schristos   NEXT (vpc);
19924e98e3e1Schristos 
19934e98e3e1Schristos   CASE (sem, INSN_SETH) : /* seth $dr,$hash$hi16 */
19944e98e3e1Schristos {
19954e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
19964e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
19974e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_seth.f
19984e98e3e1Schristos   int UNUSED written = 0;
19994e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
20004e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
20014e98e3e1Schristos 
20024e98e3e1Schristos   {
20034e98e3e1Schristos     SI opval = SLLSI (FLD (f_hi16), 16);
20044e98e3e1Schristos     * FLD (i_dr) = opval;
2005212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
20064e98e3e1Schristos   }
20074e98e3e1Schristos 
20084e98e3e1Schristos #undef FLD
20094e98e3e1Schristos }
20104e98e3e1Schristos   NEXT (vpc);
20114e98e3e1Schristos 
20124e98e3e1Schristos   CASE (sem, INSN_SLL) : /* sll $dr,$sr */
20134e98e3e1Schristos {
20144e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
20154e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
20164e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_add.f
20174e98e3e1Schristos   int UNUSED written = 0;
20184e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
20194e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
20204e98e3e1Schristos 
20214e98e3e1Schristos   {
20224e98e3e1Schristos     SI opval = SLLSI (* FLD (i_dr), ANDSI (* FLD (i_sr), 31));
20234e98e3e1Schristos     * FLD (i_dr) = opval;
2024212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
20254e98e3e1Schristos   }
20264e98e3e1Schristos 
20274e98e3e1Schristos #undef FLD
20284e98e3e1Schristos }
20294e98e3e1Schristos   NEXT (vpc);
20304e98e3e1Schristos 
20314e98e3e1Schristos   CASE (sem, INSN_SLL3) : /* sll3 $dr,$sr,$simm16 */
20324e98e3e1Schristos {
20334e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
20344e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
20354e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_add3.f
20364e98e3e1Schristos   int UNUSED written = 0;
20374e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
20384e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
20394e98e3e1Schristos 
20404e98e3e1Schristos   {
20414e98e3e1Schristos     SI opval = SLLSI (* FLD (i_sr), ANDSI (FLD (f_simm16), 31));
20424e98e3e1Schristos     * FLD (i_dr) = opval;
2043212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
20444e98e3e1Schristos   }
20454e98e3e1Schristos 
20464e98e3e1Schristos #undef FLD
20474e98e3e1Schristos }
20484e98e3e1Schristos   NEXT (vpc);
20494e98e3e1Schristos 
20504e98e3e1Schristos   CASE (sem, INSN_SLLI) : /* slli $dr,$uimm5 */
20514e98e3e1Schristos {
20524e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
20534e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
20544e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_slli.f
20554e98e3e1Schristos   int UNUSED written = 0;
20564e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
20574e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
20584e98e3e1Schristos 
20594e98e3e1Schristos   {
20604e98e3e1Schristos     SI opval = SLLSI (* FLD (i_dr), FLD (f_uimm5));
20614e98e3e1Schristos     * FLD (i_dr) = opval;
2062212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
20634e98e3e1Schristos   }
20644e98e3e1Schristos 
20654e98e3e1Schristos #undef FLD
20664e98e3e1Schristos }
20674e98e3e1Schristos   NEXT (vpc);
20684e98e3e1Schristos 
20694e98e3e1Schristos   CASE (sem, INSN_SRA) : /* sra $dr,$sr */
20704e98e3e1Schristos {
20714e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
20724e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
20734e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_add.f
20744e98e3e1Schristos   int UNUSED written = 0;
20754e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
20764e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
20774e98e3e1Schristos 
20784e98e3e1Schristos   {
20794e98e3e1Schristos     SI opval = SRASI (* FLD (i_dr), ANDSI (* FLD (i_sr), 31));
20804e98e3e1Schristos     * FLD (i_dr) = opval;
2081212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
20824e98e3e1Schristos   }
20834e98e3e1Schristos 
20844e98e3e1Schristos #undef FLD
20854e98e3e1Schristos }
20864e98e3e1Schristos   NEXT (vpc);
20874e98e3e1Schristos 
20884e98e3e1Schristos   CASE (sem, INSN_SRA3) : /* sra3 $dr,$sr,$simm16 */
20894e98e3e1Schristos {
20904e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
20914e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
20924e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_add3.f
20934e98e3e1Schristos   int UNUSED written = 0;
20944e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
20954e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
20964e98e3e1Schristos 
20974e98e3e1Schristos   {
20984e98e3e1Schristos     SI opval = SRASI (* FLD (i_sr), ANDSI (FLD (f_simm16), 31));
20994e98e3e1Schristos     * FLD (i_dr) = opval;
2100212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
21014e98e3e1Schristos   }
21024e98e3e1Schristos 
21034e98e3e1Schristos #undef FLD
21044e98e3e1Schristos }
21054e98e3e1Schristos   NEXT (vpc);
21064e98e3e1Schristos 
21074e98e3e1Schristos   CASE (sem, INSN_SRAI) : /* srai $dr,$uimm5 */
21084e98e3e1Schristos {
21094e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
21104e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
21114e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_slli.f
21124e98e3e1Schristos   int UNUSED written = 0;
21134e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
21144e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
21154e98e3e1Schristos 
21164e98e3e1Schristos   {
21174e98e3e1Schristos     SI opval = SRASI (* FLD (i_dr), FLD (f_uimm5));
21184e98e3e1Schristos     * FLD (i_dr) = opval;
2119212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
21204e98e3e1Schristos   }
21214e98e3e1Schristos 
21224e98e3e1Schristos #undef FLD
21234e98e3e1Schristos }
21244e98e3e1Schristos   NEXT (vpc);
21254e98e3e1Schristos 
21264e98e3e1Schristos   CASE (sem, INSN_SRL) : /* srl $dr,$sr */
21274e98e3e1Schristos {
21284e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
21294e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
21304e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_add.f
21314e98e3e1Schristos   int UNUSED written = 0;
21324e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
21334e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
21344e98e3e1Schristos 
21354e98e3e1Schristos   {
21364e98e3e1Schristos     SI opval = SRLSI (* FLD (i_dr), ANDSI (* FLD (i_sr), 31));
21374e98e3e1Schristos     * FLD (i_dr) = opval;
2138212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
21394e98e3e1Schristos   }
21404e98e3e1Schristos 
21414e98e3e1Schristos #undef FLD
21424e98e3e1Schristos }
21434e98e3e1Schristos   NEXT (vpc);
21444e98e3e1Schristos 
21454e98e3e1Schristos   CASE (sem, INSN_SRL3) : /* srl3 $dr,$sr,$simm16 */
21464e98e3e1Schristos {
21474e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
21484e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
21494e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_add3.f
21504e98e3e1Schristos   int UNUSED written = 0;
21514e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
21524e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
21534e98e3e1Schristos 
21544e98e3e1Schristos   {
21554e98e3e1Schristos     SI opval = SRLSI (* FLD (i_sr), ANDSI (FLD (f_simm16), 31));
21564e98e3e1Schristos     * FLD (i_dr) = opval;
2157212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
21584e98e3e1Schristos   }
21594e98e3e1Schristos 
21604e98e3e1Schristos #undef FLD
21614e98e3e1Schristos }
21624e98e3e1Schristos   NEXT (vpc);
21634e98e3e1Schristos 
21644e98e3e1Schristos   CASE (sem, INSN_SRLI) : /* srli $dr,$uimm5 */
21654e98e3e1Schristos {
21664e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
21674e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
21684e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_slli.f
21694e98e3e1Schristos   int UNUSED written = 0;
21704e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
21714e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
21724e98e3e1Schristos 
21734e98e3e1Schristos   {
21744e98e3e1Schristos     SI opval = SRLSI (* FLD (i_dr), FLD (f_uimm5));
21754e98e3e1Schristos     * FLD (i_dr) = opval;
2176212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
21774e98e3e1Schristos   }
21784e98e3e1Schristos 
21794e98e3e1Schristos #undef FLD
21804e98e3e1Schristos }
21814e98e3e1Schristos   NEXT (vpc);
21824e98e3e1Schristos 
21834e98e3e1Schristos   CASE (sem, INSN_ST) : /* st $src1,@$src2 */
21844e98e3e1Schristos {
21854e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
21864e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
21874e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_st_plus.f
21884e98e3e1Schristos   int UNUSED written = 0;
21894e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
21904e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
21914e98e3e1Schristos 
21924e98e3e1Schristos   {
21934e98e3e1Schristos     SI opval = * FLD (i_src1);
21944e98e3e1Schristos     SETMEMSI (current_cpu, pc, * FLD (i_src2), opval);
2195212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
21964e98e3e1Schristos   }
21974e98e3e1Schristos 
21984e98e3e1Schristos #undef FLD
21994e98e3e1Schristos }
22004e98e3e1Schristos   NEXT (vpc);
22014e98e3e1Schristos 
22024e98e3e1Schristos   CASE (sem, INSN_ST_D) : /* st $src1,@($slo16,$src2) */
22034e98e3e1Schristos {
22044e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
22054e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
22064e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_st_d.f
22074e98e3e1Schristos   int UNUSED written = 0;
22084e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
22094e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
22104e98e3e1Schristos 
22114e98e3e1Schristos   {
22124e98e3e1Schristos     SI opval = * FLD (i_src1);
22134e98e3e1Schristos     SETMEMSI (current_cpu, pc, ADDSI (* FLD (i_src2), FLD (f_simm16)), opval);
2214212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
22154e98e3e1Schristos   }
22164e98e3e1Schristos 
22174e98e3e1Schristos #undef FLD
22184e98e3e1Schristos }
22194e98e3e1Schristos   NEXT (vpc);
22204e98e3e1Schristos 
22214e98e3e1Schristos   CASE (sem, INSN_STB) : /* stb $src1,@$src2 */
22224e98e3e1Schristos {
22234e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
22244e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
22254e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_st_plus.f
22264e98e3e1Schristos   int UNUSED written = 0;
22274e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
22284e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
22294e98e3e1Schristos 
22304e98e3e1Schristos   {
22314e98e3e1Schristos     QI opval = * FLD (i_src1);
22324e98e3e1Schristos     SETMEMQI (current_cpu, pc, * FLD (i_src2), opval);
2233212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
22344e98e3e1Schristos   }
22354e98e3e1Schristos 
22364e98e3e1Schristos #undef FLD
22374e98e3e1Schristos }
22384e98e3e1Schristos   NEXT (vpc);
22394e98e3e1Schristos 
22404e98e3e1Schristos   CASE (sem, INSN_STB_D) : /* stb $src1,@($slo16,$src2) */
22414e98e3e1Schristos {
22424e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
22434e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
22444e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_st_d.f
22454e98e3e1Schristos   int UNUSED written = 0;
22464e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
22474e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
22484e98e3e1Schristos 
22494e98e3e1Schristos   {
22504e98e3e1Schristos     QI opval = * FLD (i_src1);
22514e98e3e1Schristos     SETMEMQI (current_cpu, pc, ADDSI (* FLD (i_src2), FLD (f_simm16)), opval);
2252212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
22534e98e3e1Schristos   }
22544e98e3e1Schristos 
22554e98e3e1Schristos #undef FLD
22564e98e3e1Schristos }
22574e98e3e1Schristos   NEXT (vpc);
22584e98e3e1Schristos 
22594e98e3e1Schristos   CASE (sem, INSN_STH) : /* sth $src1,@$src2 */
22604e98e3e1Schristos {
22614e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
22624e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
22634e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_st_plus.f
22644e98e3e1Schristos   int UNUSED written = 0;
22654e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
22664e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
22674e98e3e1Schristos 
22684e98e3e1Schristos   {
22694e98e3e1Schristos     HI opval = * FLD (i_src1);
22704e98e3e1Schristos     SETMEMHI (current_cpu, pc, * FLD (i_src2), opval);
2271212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
22724e98e3e1Schristos   }
22734e98e3e1Schristos 
22744e98e3e1Schristos #undef FLD
22754e98e3e1Schristos }
22764e98e3e1Schristos   NEXT (vpc);
22774e98e3e1Schristos 
22784e98e3e1Schristos   CASE (sem, INSN_STH_D) : /* sth $src1,@($slo16,$src2) */
22794e98e3e1Schristos {
22804e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
22814e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
22824e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_st_d.f
22834e98e3e1Schristos   int UNUSED written = 0;
22844e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
22854e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
22864e98e3e1Schristos 
22874e98e3e1Schristos   {
22884e98e3e1Schristos     HI opval = * FLD (i_src1);
22894e98e3e1Schristos     SETMEMHI (current_cpu, pc, ADDSI (* FLD (i_src2), FLD (f_simm16)), opval);
2290212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
22914e98e3e1Schristos   }
22924e98e3e1Schristos 
22934e98e3e1Schristos #undef FLD
22944e98e3e1Schristos }
22954e98e3e1Schristos   NEXT (vpc);
22964e98e3e1Schristos 
22974e98e3e1Schristos   CASE (sem, INSN_ST_PLUS) : /* st $src1,@+$src2 */
22984e98e3e1Schristos {
22994e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
23004e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
23014e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_st_plus.f
23024e98e3e1Schristos   int UNUSED written = 0;
23034e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
23044e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
23054e98e3e1Schristos 
23064e98e3e1Schristos {
23074e98e3e1Schristos   SI tmp_new_src2;
23084e98e3e1Schristos   tmp_new_src2 = ADDSI (* FLD (i_src2), 4);
23094e98e3e1Schristos   {
23104e98e3e1Schristos     SI opval = * FLD (i_src1);
23114e98e3e1Schristos     SETMEMSI (current_cpu, pc, tmp_new_src2, opval);
2312212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
23134e98e3e1Schristos   }
23144e98e3e1Schristos   {
23154e98e3e1Schristos     SI opval = tmp_new_src2;
23164e98e3e1Schristos     * FLD (i_src2) = opval;
2317212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
23184e98e3e1Schristos   }
23194e98e3e1Schristos }
23204e98e3e1Schristos 
23214e98e3e1Schristos #undef FLD
23224e98e3e1Schristos }
23234e98e3e1Schristos   NEXT (vpc);
23244e98e3e1Schristos 
23254e98e3e1Schristos   CASE (sem, INSN_ST_MINUS) : /* st $src1,@-$src2 */
23264e98e3e1Schristos {
23274e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
23284e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
23294e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_st_plus.f
23304e98e3e1Schristos   int UNUSED written = 0;
23314e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
23324e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
23334e98e3e1Schristos 
23344e98e3e1Schristos {
23354e98e3e1Schristos   SI tmp_new_src2;
23364e98e3e1Schristos   tmp_new_src2 = SUBSI (* FLD (i_src2), 4);
23374e98e3e1Schristos   {
23384e98e3e1Schristos     SI opval = * FLD (i_src1);
23394e98e3e1Schristos     SETMEMSI (current_cpu, pc, tmp_new_src2, opval);
2340212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
23414e98e3e1Schristos   }
23424e98e3e1Schristos   {
23434e98e3e1Schristos     SI opval = tmp_new_src2;
23444e98e3e1Schristos     * FLD (i_src2) = opval;
2345212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
23464e98e3e1Schristos   }
23474e98e3e1Schristos }
23484e98e3e1Schristos 
23494e98e3e1Schristos #undef FLD
23504e98e3e1Schristos }
23514e98e3e1Schristos   NEXT (vpc);
23524e98e3e1Schristos 
23534e98e3e1Schristos   CASE (sem, INSN_SUB) : /* sub $dr,$sr */
23544e98e3e1Schristos {
23554e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
23564e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
23574e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_add.f
23584e98e3e1Schristos   int UNUSED written = 0;
23594e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
23604e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
23614e98e3e1Schristos 
23624e98e3e1Schristos   {
23634e98e3e1Schristos     SI opval = SUBSI (* FLD (i_dr), * FLD (i_sr));
23644e98e3e1Schristos     * FLD (i_dr) = opval;
2365212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
23664e98e3e1Schristos   }
23674e98e3e1Schristos 
23684e98e3e1Schristos #undef FLD
23694e98e3e1Schristos }
23704e98e3e1Schristos   NEXT (vpc);
23714e98e3e1Schristos 
23724e98e3e1Schristos   CASE (sem, INSN_SUBV) : /* subv $dr,$sr */
23734e98e3e1Schristos {
23744e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
23754e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
23764e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_add.f
23774e98e3e1Schristos   int UNUSED written = 0;
23784e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
23794e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
23804e98e3e1Schristos 
23814e98e3e1Schristos {
23824e98e3e1Schristos   SI temp0;BI temp1;
23834e98e3e1Schristos   temp0 = SUBSI (* FLD (i_dr), * FLD (i_sr));
23844e98e3e1Schristos   temp1 = SUBOFSI (* FLD (i_dr), * FLD (i_sr), 0);
23854e98e3e1Schristos   {
23864e98e3e1Schristos     SI opval = temp0;
23874e98e3e1Schristos     * FLD (i_dr) = opval;
2388212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
23894e98e3e1Schristos   }
23904e98e3e1Schristos   {
23914e98e3e1Schristos     BI opval = temp1;
23924e98e3e1Schristos     CPU (h_cond) = opval;
2393212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
23944e98e3e1Schristos   }
23954e98e3e1Schristos }
23964e98e3e1Schristos 
23974e98e3e1Schristos #undef FLD
23984e98e3e1Schristos }
23994e98e3e1Schristos   NEXT (vpc);
24004e98e3e1Schristos 
24014e98e3e1Schristos   CASE (sem, INSN_SUBX) : /* subx $dr,$sr */
24024e98e3e1Schristos {
24034e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
24044e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
24054e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_add.f
24064e98e3e1Schristos   int UNUSED written = 0;
24074e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
24084e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
24094e98e3e1Schristos 
24104e98e3e1Schristos {
24114e98e3e1Schristos   SI temp0;BI temp1;
24124e98e3e1Schristos   temp0 = SUBCSI (* FLD (i_dr), * FLD (i_sr), CPU (h_cond));
24134e98e3e1Schristos   temp1 = SUBCFSI (* FLD (i_dr), * FLD (i_sr), CPU (h_cond));
24144e98e3e1Schristos   {
24154e98e3e1Schristos     SI opval = temp0;
24164e98e3e1Schristos     * FLD (i_dr) = opval;
2417212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
24184e98e3e1Schristos   }
24194e98e3e1Schristos   {
24204e98e3e1Schristos     BI opval = temp1;
24214e98e3e1Schristos     CPU (h_cond) = opval;
2422212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
24234e98e3e1Schristos   }
24244e98e3e1Schristos }
24254e98e3e1Schristos 
24264e98e3e1Schristos #undef FLD
24274e98e3e1Schristos }
24284e98e3e1Schristos   NEXT (vpc);
24294e98e3e1Schristos 
24304e98e3e1Schristos   CASE (sem, INSN_TRAP) : /* trap $uimm4 */
24314e98e3e1Schristos {
24324e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
24334e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
24344e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_trap.f
24354e98e3e1Schristos   int UNUSED written = 0;
24364e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
24374e98e3e1Schristos   SEM_BRANCH_INIT
24384e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
24394e98e3e1Schristos 
24404e98e3e1Schristos {
24414e98e3e1Schristos   {
24424e98e3e1Schristos     USI opval = GET_H_CR (((UINT) 6));
24434e98e3e1Schristos     SET_H_CR (((UINT) 14), opval);
2444212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "cr", 'x', opval);
24454e98e3e1Schristos   }
24464e98e3e1Schristos   {
24474e98e3e1Schristos     USI opval = ADDSI (pc, 4);
24484e98e3e1Schristos     SET_H_CR (((UINT) 6), opval);
2449212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "cr", 'x', opval);
24504e98e3e1Schristos   }
24514e98e3e1Schristos   {
24524e98e3e1Schristos     UQI opval = CPU (h_bpsw);
24534e98e3e1Schristos     CPU (h_bbpsw) = opval;
2454212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "bbpsw", 'x', opval);
24554e98e3e1Schristos   }
24564e98e3e1Schristos   {
24574e98e3e1Schristos     UQI opval = GET_H_PSW ();
24584e98e3e1Schristos     CPU (h_bpsw) = opval;
2459212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "bpsw", 'x', opval);
24604e98e3e1Schristos   }
24614e98e3e1Schristos   {
24624e98e3e1Schristos     UQI opval = ANDQI (GET_H_PSW (), 128);
24634e98e3e1Schristos     SET_H_PSW (opval);
2464212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "psw", 'x', opval);
24654e98e3e1Schristos   }
24664e98e3e1Schristos   {
24674e98e3e1Schristos     SI opval = m32r_trap (current_cpu, pc, FLD (f_uimm4));
24684e98e3e1Schristos     SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
2469212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
24704e98e3e1Schristos   }
24714e98e3e1Schristos }
24724e98e3e1Schristos 
24734e98e3e1Schristos   SEM_BRANCH_FINI (vpc);
24744e98e3e1Schristos #undef FLD
24754e98e3e1Schristos }
24764e98e3e1Schristos   NEXT (vpc);
24774e98e3e1Schristos 
24784e98e3e1Schristos   CASE (sem, INSN_UNLOCK) : /* unlock $src1,@$src2 */
24794e98e3e1Schristos {
24804e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
24814e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
24824e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_st_plus.f
24834e98e3e1Schristos   int UNUSED written = 0;
24844e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
24854e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
24864e98e3e1Schristos 
24874e98e3e1Schristos {
24884e98e3e1Schristos if (CPU (h_lock)) {
24894e98e3e1Schristos   {
24904e98e3e1Schristos     SI opval = * FLD (i_src1);
24914e98e3e1Schristos     SETMEMSI (current_cpu, pc, * FLD (i_src2), opval);
24924e98e3e1Schristos     written |= (1 << 4);
2493212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
24944e98e3e1Schristos   }
24954e98e3e1Schristos }
24964e98e3e1Schristos   {
24974e98e3e1Schristos     BI opval = 0;
24984e98e3e1Schristos     CPU (h_lock) = opval;
2499212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "lock", 'x', opval);
25004e98e3e1Schristos   }
25014e98e3e1Schristos }
25024e98e3e1Schristos 
25034e98e3e1Schristos   abuf->written = written;
25044e98e3e1Schristos #undef FLD
25054e98e3e1Schristos }
25064e98e3e1Schristos   NEXT (vpc);
25074e98e3e1Schristos 
25084e98e3e1Schristos   CASE (sem, INSN_CLRPSW) : /* clrpsw $uimm8 */
25094e98e3e1Schristos {
25104e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
25114e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
25124e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_clrpsw.f
25134e98e3e1Schristos   int UNUSED written = 0;
25144e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
25154e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
25164e98e3e1Schristos 
25174e98e3e1Schristos   {
25184e98e3e1Schristos     USI opval = ANDSI (GET_H_CR (((UINT) 0)), ORSI (ZEXTQISI (INVQI (FLD (f_uimm8))), 65280));
25194e98e3e1Schristos     SET_H_CR (((UINT) 0), opval);
2520212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "cr", 'x', opval);
25214e98e3e1Schristos   }
25224e98e3e1Schristos 
25234e98e3e1Schristos #undef FLD
25244e98e3e1Schristos }
25254e98e3e1Schristos   NEXT (vpc);
25264e98e3e1Schristos 
25274e98e3e1Schristos   CASE (sem, INSN_SETPSW) : /* setpsw $uimm8 */
25284e98e3e1Schristos {
25294e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
25304e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
25314e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_clrpsw.f
25324e98e3e1Schristos   int UNUSED written = 0;
25334e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
25344e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
25354e98e3e1Schristos 
25364e98e3e1Schristos   {
25374e98e3e1Schristos     USI opval = FLD (f_uimm8);
25384e98e3e1Schristos     SET_H_CR (((UINT) 0), opval);
2539212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "cr", 'x', opval);
25404e98e3e1Schristos   }
25414e98e3e1Schristos 
25424e98e3e1Schristos #undef FLD
25434e98e3e1Schristos }
25444e98e3e1Schristos   NEXT (vpc);
25454e98e3e1Schristos 
25464e98e3e1Schristos   CASE (sem, INSN_BSET) : /* bset $uimm3,@($slo16,$sr) */
25474e98e3e1Schristos {
25484e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
25494e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
25504e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_bset.f
25514e98e3e1Schristos   int UNUSED written = 0;
25524e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
25534e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
25544e98e3e1Schristos 
25554e98e3e1Schristos   {
25564e98e3e1Schristos     QI opval = ORQI (GETMEMQI (current_cpu, pc, ADDSI (* FLD (i_sr), FLD (f_simm16))), SLLQI (1, SUBSI (7, FLD (f_uimm3))));
25574e98e3e1Schristos     SETMEMQI (current_cpu, pc, ADDSI (* FLD (i_sr), FLD (f_simm16)), opval);
2558212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
25594e98e3e1Schristos   }
25604e98e3e1Schristos 
25614e98e3e1Schristos #undef FLD
25624e98e3e1Schristos }
25634e98e3e1Schristos   NEXT (vpc);
25644e98e3e1Schristos 
25654e98e3e1Schristos   CASE (sem, INSN_BCLR) : /* bclr $uimm3,@($slo16,$sr) */
25664e98e3e1Schristos {
25674e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
25684e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
25694e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_bset.f
25704e98e3e1Schristos   int UNUSED written = 0;
25714e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
25724e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
25734e98e3e1Schristos 
25744e98e3e1Schristos   {
25754e98e3e1Schristos     QI opval = ANDQI (GETMEMQI (current_cpu, pc, ADDSI (* FLD (i_sr), FLD (f_simm16))), INVQI (SLLQI (1, SUBSI (7, FLD (f_uimm3)))));
25764e98e3e1Schristos     SETMEMQI (current_cpu, pc, ADDSI (* FLD (i_sr), FLD (f_simm16)), opval);
2577212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
25784e98e3e1Schristos   }
25794e98e3e1Schristos 
25804e98e3e1Schristos #undef FLD
25814e98e3e1Schristos }
25824e98e3e1Schristos   NEXT (vpc);
25834e98e3e1Schristos 
25844e98e3e1Schristos   CASE (sem, INSN_BTST) : /* btst $uimm3,$sr */
25854e98e3e1Schristos {
25864e98e3e1Schristos   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
25874e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
25884e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_bset.f
25894e98e3e1Schristos   int UNUSED written = 0;
25904e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
25914e98e3e1Schristos   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
25924e98e3e1Schristos 
25934e98e3e1Schristos   {
25944e98e3e1Schristos     BI opval = ANDQI (SRLQI (* FLD (i_sr), SUBSI (7, FLD (f_uimm3))), 1);
25954e98e3e1Schristos     CPU (h_cond) = opval;
2596212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
25974e98e3e1Schristos   }
25984e98e3e1Schristos 
25994e98e3e1Schristos #undef FLD
26004e98e3e1Schristos }
26014e98e3e1Schristos   NEXT (vpc);
26024e98e3e1Schristos 
26034e98e3e1Schristos 
26044e98e3e1Schristos     }
26054e98e3e1Schristos   ENDSWITCH (sem) /* End of semantic switch.  */
26064e98e3e1Schristos 
26074e98e3e1Schristos   /* At this point `vpc' contains the next insn to execute.  */
26084e98e3e1Schristos }
26094e98e3e1Schristos 
26104e98e3e1Schristos #undef DEFINE_SWITCH
26114e98e3e1Schristos #endif /* DEFINE_SWITCH */
2612