xref: /netbsd-src/external/gpl3/gdb/dist/sim/m32r/sem.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 #define WANT_CPU m32rbf
264e98e3e1Schristos #define WANT_CPU_M32RBF
274e98e3e1Schristos 
284e98e3e1Schristos #include "sim-main.h"
294e98e3e1Schristos #include "cgen-mem.h"
304e98e3e1Schristos #include "cgen-ops.h"
314e98e3e1Schristos 
324e98e3e1Schristos #undef GET_ATTR
334e98e3e1Schristos #define GET_ATTR(cpu, num, attr) CGEN_ATTR_VALUE (NULL, abuf->idesc->attrs, CGEN_INSN_##attr)
344e98e3e1Schristos 
354e98e3e1Schristos /* This is used so that we can compile two copies of the semantic code,
364e98e3e1Schristos    one with full feature support and one without that runs fast(er).
374e98e3e1Schristos    FAST_P, when desired, is defined on the command line, -DFAST_P=1.  */
384e98e3e1Schristos #if FAST_P
394e98e3e1Schristos #define SEM_FN_NAME(cpu,fn) XCONCAT3 (cpu,_semf_,fn)
40212397c6Schristos #undef CGEN_TRACE_RESULT
41212397c6Schristos #define CGEN_TRACE_RESULT(cpu, abuf, name, type, val)
424e98e3e1Schristos #else
434e98e3e1Schristos #define SEM_FN_NAME(cpu,fn) XCONCAT3 (cpu,_sem_,fn)
444e98e3e1Schristos #endif
454e98e3e1Schristos 
464e98e3e1Schristos /* x-invalid: --invalid-- */
474e98e3e1Schristos 
484e98e3e1Schristos static SEM_PC
494e98e3e1Schristos SEM_FN_NAME (m32rbf,x_invalid) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
504e98e3e1Schristos {
514e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_empty.f
524e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
534e98e3e1Schristos   int UNUSED written = 0;
544e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
554e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
564e98e3e1Schristos 
574e98e3e1Schristos   {
584e98e3e1Schristos     /* Update the recorded pc in the cpu state struct.
594e98e3e1Schristos        Only necessary for WITH_SCACHE case, but to avoid the
604e98e3e1Schristos        conditional compilation ....  */
614e98e3e1Schristos     SET_H_PC (pc);
624e98e3e1Schristos     /* Virtual insns have zero size.  Overwrite vpc with address of next insn
634e98e3e1Schristos        using the default-insn-bitsize spec.  When executing insns in parallel
644e98e3e1Schristos        we may want to queue the fault and continue execution.  */
654e98e3e1Schristos     vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
664e98e3e1Schristos     vpc = sim_engine_invalid_insn (current_cpu, pc, vpc);
674e98e3e1Schristos   }
684e98e3e1Schristos 
694e98e3e1Schristos   return vpc;
704e98e3e1Schristos #undef FLD
714e98e3e1Schristos }
724e98e3e1Schristos 
734e98e3e1Schristos /* x-after: --after-- */
744e98e3e1Schristos 
754e98e3e1Schristos static SEM_PC
764e98e3e1Schristos SEM_FN_NAME (m32rbf,x_after) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
774e98e3e1Schristos {
784e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_empty.f
794e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
804e98e3e1Schristos   int UNUSED written = 0;
814e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
824e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
834e98e3e1Schristos 
844e98e3e1Schristos   {
854e98e3e1Schristos #if WITH_SCACHE_PBB_M32RBF
864e98e3e1Schristos     m32rbf_pbb_after (current_cpu, sem_arg);
874e98e3e1Schristos #endif
884e98e3e1Schristos   }
894e98e3e1Schristos 
904e98e3e1Schristos   return vpc;
914e98e3e1Schristos #undef FLD
924e98e3e1Schristos }
934e98e3e1Schristos 
944e98e3e1Schristos /* x-before: --before-- */
954e98e3e1Schristos 
964e98e3e1Schristos static SEM_PC
974e98e3e1Schristos SEM_FN_NAME (m32rbf,x_before) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
984e98e3e1Schristos {
994e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_empty.f
1004e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1014e98e3e1Schristos   int UNUSED written = 0;
1024e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
1034e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
1044e98e3e1Schristos 
1054e98e3e1Schristos   {
1064e98e3e1Schristos #if WITH_SCACHE_PBB_M32RBF
1074e98e3e1Schristos     m32rbf_pbb_before (current_cpu, sem_arg);
1084e98e3e1Schristos #endif
1094e98e3e1Schristos   }
1104e98e3e1Schristos 
1114e98e3e1Schristos   return vpc;
1124e98e3e1Schristos #undef FLD
1134e98e3e1Schristos }
1144e98e3e1Schristos 
1154e98e3e1Schristos /* x-cti-chain: --cti-chain-- */
1164e98e3e1Schristos 
1174e98e3e1Schristos static SEM_PC
1184e98e3e1Schristos SEM_FN_NAME (m32rbf,x_cti_chain) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1194e98e3e1Schristos {
1204e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_empty.f
1214e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1224e98e3e1Schristos   int UNUSED written = 0;
1234e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
1244e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
1254e98e3e1Schristos 
1264e98e3e1Schristos   {
1274e98e3e1Schristos #if WITH_SCACHE_PBB_M32RBF
1284e98e3e1Schristos #ifdef DEFINE_SWITCH
1294e98e3e1Schristos     vpc = m32rbf_pbb_cti_chain (current_cpu, sem_arg,
1304e98e3e1Schristos 			       pbb_br_type, pbb_br_npc);
1314e98e3e1Schristos     BREAK (sem);
1324e98e3e1Schristos #else
1334e98e3e1Schristos     /* FIXME: Allow provision of explicit ifmt spec in insn spec.  */
1344e98e3e1Schristos     vpc = m32rbf_pbb_cti_chain (current_cpu, sem_arg,
1354e98e3e1Schristos 			       CPU_PBB_BR_TYPE (current_cpu),
1364e98e3e1Schristos 			       CPU_PBB_BR_NPC (current_cpu));
1374e98e3e1Schristos #endif
1384e98e3e1Schristos #endif
1394e98e3e1Schristos   }
1404e98e3e1Schristos 
1414e98e3e1Schristos   return vpc;
1424e98e3e1Schristos #undef FLD
1434e98e3e1Schristos }
1444e98e3e1Schristos 
1454e98e3e1Schristos /* x-chain: --chain-- */
1464e98e3e1Schristos 
1474e98e3e1Schristos static SEM_PC
1484e98e3e1Schristos SEM_FN_NAME (m32rbf,x_chain) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1494e98e3e1Schristos {
1504e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_empty.f
1514e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1524e98e3e1Schristos   int UNUSED written = 0;
1534e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
1544e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
1554e98e3e1Schristos 
1564e98e3e1Schristos   {
1574e98e3e1Schristos #if WITH_SCACHE_PBB_M32RBF
1584e98e3e1Schristos     vpc = m32rbf_pbb_chain (current_cpu, sem_arg);
1594e98e3e1Schristos #ifdef DEFINE_SWITCH
1604e98e3e1Schristos     BREAK (sem);
1614e98e3e1Schristos #endif
1624e98e3e1Schristos #endif
1634e98e3e1Schristos   }
1644e98e3e1Schristos 
1654e98e3e1Schristos   return vpc;
1664e98e3e1Schristos #undef FLD
1674e98e3e1Schristos }
1684e98e3e1Schristos 
1694e98e3e1Schristos /* x-begin: --begin-- */
1704e98e3e1Schristos 
1714e98e3e1Schristos static SEM_PC
1724e98e3e1Schristos SEM_FN_NAME (m32rbf,x_begin) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1734e98e3e1Schristos {
1744e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_empty.f
1754e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1764e98e3e1Schristos   int UNUSED written = 0;
1774e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
1784e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
1794e98e3e1Schristos 
1804e98e3e1Schristos   {
1814e98e3e1Schristos #if WITH_SCACHE_PBB_M32RBF
1824e98e3e1Schristos #if defined DEFINE_SWITCH || defined FAST_P
1834e98e3e1Schristos     /* In the switch case FAST_P is a constant, allowing several optimizations
1844e98e3e1Schristos        in any called inline functions.  */
1854e98e3e1Schristos     vpc = m32rbf_pbb_begin (current_cpu, FAST_P);
1864e98e3e1Schristos #else
1874e98e3e1Schristos #if 0 /* cgen engine can't handle dynamic fast/full switching yet.  */
1884e98e3e1Schristos     vpc = m32rbf_pbb_begin (current_cpu, STATE_RUN_FAST_P (CPU_STATE (current_cpu)));
1894e98e3e1Schristos #else
1904e98e3e1Schristos     vpc = m32rbf_pbb_begin (current_cpu, 0);
1914e98e3e1Schristos #endif
1924e98e3e1Schristos #endif
1934e98e3e1Schristos #endif
1944e98e3e1Schristos   }
1954e98e3e1Schristos 
1964e98e3e1Schristos   return vpc;
1974e98e3e1Schristos #undef FLD
1984e98e3e1Schristos }
1994e98e3e1Schristos 
2004e98e3e1Schristos /* add: add $dr,$sr */
2014e98e3e1Schristos 
2024e98e3e1Schristos static SEM_PC
2034e98e3e1Schristos SEM_FN_NAME (m32rbf,add) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2044e98e3e1Schristos {
2054e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_add.f
2064e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2074e98e3e1Schristos   int UNUSED written = 0;
2084e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
2094e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2104e98e3e1Schristos 
2114e98e3e1Schristos   {
2124e98e3e1Schristos     SI opval = ADDSI (* FLD (i_dr), * FLD (i_sr));
2134e98e3e1Schristos     * FLD (i_dr) = opval;
214212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
2154e98e3e1Schristos   }
2164e98e3e1Schristos 
2174e98e3e1Schristos   return vpc;
2184e98e3e1Schristos #undef FLD
2194e98e3e1Schristos }
2204e98e3e1Schristos 
2214e98e3e1Schristos /* add3: add3 $dr,$sr,$hash$slo16 */
2224e98e3e1Schristos 
2234e98e3e1Schristos static SEM_PC
2244e98e3e1Schristos SEM_FN_NAME (m32rbf,add3) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2254e98e3e1Schristos {
2264e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_add3.f
2274e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2284e98e3e1Schristos   int UNUSED written = 0;
2294e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
2304e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2314e98e3e1Schristos 
2324e98e3e1Schristos   {
2334e98e3e1Schristos     SI opval = ADDSI (* FLD (i_sr), FLD (f_simm16));
2344e98e3e1Schristos     * FLD (i_dr) = opval;
235212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
2364e98e3e1Schristos   }
2374e98e3e1Schristos 
2384e98e3e1Schristos   return vpc;
2394e98e3e1Schristos #undef FLD
2404e98e3e1Schristos }
2414e98e3e1Schristos 
2424e98e3e1Schristos /* and: and $dr,$sr */
2434e98e3e1Schristos 
2444e98e3e1Schristos static SEM_PC
2454e98e3e1Schristos SEM_FN_NAME (m32rbf,and) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2464e98e3e1Schristos {
2474e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_add.f
2484e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2494e98e3e1Schristos   int UNUSED written = 0;
2504e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
2514e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2524e98e3e1Schristos 
2534e98e3e1Schristos   {
2544e98e3e1Schristos     SI opval = ANDSI (* FLD (i_dr), * FLD (i_sr));
2554e98e3e1Schristos     * FLD (i_dr) = opval;
256212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
2574e98e3e1Schristos   }
2584e98e3e1Schristos 
2594e98e3e1Schristos   return vpc;
2604e98e3e1Schristos #undef FLD
2614e98e3e1Schristos }
2624e98e3e1Schristos 
2634e98e3e1Schristos /* and3: and3 $dr,$sr,$uimm16 */
2644e98e3e1Schristos 
2654e98e3e1Schristos static SEM_PC
2664e98e3e1Schristos SEM_FN_NAME (m32rbf,and3) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2674e98e3e1Schristos {
2684e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_and3.f
2694e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2704e98e3e1Schristos   int UNUSED written = 0;
2714e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
2724e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2734e98e3e1Schristos 
2744e98e3e1Schristos   {
2754e98e3e1Schristos     SI opval = ANDSI (* FLD (i_sr), FLD (f_uimm16));
2764e98e3e1Schristos     * FLD (i_dr) = opval;
277212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
2784e98e3e1Schristos   }
2794e98e3e1Schristos 
2804e98e3e1Schristos   return vpc;
2814e98e3e1Schristos #undef FLD
2824e98e3e1Schristos }
2834e98e3e1Schristos 
2844e98e3e1Schristos /* or: or $dr,$sr */
2854e98e3e1Schristos 
2864e98e3e1Schristos static SEM_PC
2874e98e3e1Schristos SEM_FN_NAME (m32rbf,or) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2884e98e3e1Schristos {
2894e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_add.f
2904e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2914e98e3e1Schristos   int UNUSED written = 0;
2924e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
2934e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2944e98e3e1Schristos 
2954e98e3e1Schristos   {
2964e98e3e1Schristos     SI opval = ORSI (* FLD (i_dr), * FLD (i_sr));
2974e98e3e1Schristos     * FLD (i_dr) = opval;
298212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
2994e98e3e1Schristos   }
3004e98e3e1Schristos 
3014e98e3e1Schristos   return vpc;
3024e98e3e1Schristos #undef FLD
3034e98e3e1Schristos }
3044e98e3e1Schristos 
3054e98e3e1Schristos /* or3: or3 $dr,$sr,$hash$ulo16 */
3064e98e3e1Schristos 
3074e98e3e1Schristos static SEM_PC
3084e98e3e1Schristos SEM_FN_NAME (m32rbf,or3) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
3094e98e3e1Schristos {
3104e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_and3.f
3114e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3124e98e3e1Schristos   int UNUSED written = 0;
3134e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
3144e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
3154e98e3e1Schristos 
3164e98e3e1Schristos   {
3174e98e3e1Schristos     SI opval = ORSI (* FLD (i_sr), FLD (f_uimm16));
3184e98e3e1Schristos     * FLD (i_dr) = opval;
319212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
3204e98e3e1Schristos   }
3214e98e3e1Schristos 
3224e98e3e1Schristos   return vpc;
3234e98e3e1Schristos #undef FLD
3244e98e3e1Schristos }
3254e98e3e1Schristos 
3264e98e3e1Schristos /* xor: xor $dr,$sr */
3274e98e3e1Schristos 
3284e98e3e1Schristos static SEM_PC
3294e98e3e1Schristos SEM_FN_NAME (m32rbf,xor) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
3304e98e3e1Schristos {
3314e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_add.f
3324e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3334e98e3e1Schristos   int UNUSED written = 0;
3344e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
3354e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3364e98e3e1Schristos 
3374e98e3e1Schristos   {
3384e98e3e1Schristos     SI opval = XORSI (* FLD (i_dr), * FLD (i_sr));
3394e98e3e1Schristos     * FLD (i_dr) = opval;
340212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
3414e98e3e1Schristos   }
3424e98e3e1Schristos 
3434e98e3e1Schristos   return vpc;
3444e98e3e1Schristos #undef FLD
3454e98e3e1Schristos }
3464e98e3e1Schristos 
3474e98e3e1Schristos /* xor3: xor3 $dr,$sr,$uimm16 */
3484e98e3e1Schristos 
3494e98e3e1Schristos static SEM_PC
3504e98e3e1Schristos SEM_FN_NAME (m32rbf,xor3) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
3514e98e3e1Schristos {
3524e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_and3.f
3534e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3544e98e3e1Schristos   int UNUSED written = 0;
3554e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
3564e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
3574e98e3e1Schristos 
3584e98e3e1Schristos   {
3594e98e3e1Schristos     SI opval = XORSI (* FLD (i_sr), FLD (f_uimm16));
3604e98e3e1Schristos     * FLD (i_dr) = opval;
361212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
3624e98e3e1Schristos   }
3634e98e3e1Schristos 
3644e98e3e1Schristos   return vpc;
3654e98e3e1Schristos #undef FLD
3664e98e3e1Schristos }
3674e98e3e1Schristos 
3684e98e3e1Schristos /* addi: addi $dr,$simm8 */
3694e98e3e1Schristos 
3704e98e3e1Schristos static SEM_PC
3714e98e3e1Schristos SEM_FN_NAME (m32rbf,addi) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
3724e98e3e1Schristos {
3734e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_addi.f
3744e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3754e98e3e1Schristos   int UNUSED written = 0;
3764e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
3774e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3784e98e3e1Schristos 
3794e98e3e1Schristos   {
3804e98e3e1Schristos     SI opval = ADDSI (* FLD (i_dr), FLD (f_simm8));
3814e98e3e1Schristos     * FLD (i_dr) = opval;
382212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
3834e98e3e1Schristos   }
3844e98e3e1Schristos 
3854e98e3e1Schristos   return vpc;
3864e98e3e1Schristos #undef FLD
3874e98e3e1Schristos }
3884e98e3e1Schristos 
3894e98e3e1Schristos /* addv: addv $dr,$sr */
3904e98e3e1Schristos 
3914e98e3e1Schristos static SEM_PC
3924e98e3e1Schristos SEM_FN_NAME (m32rbf,addv) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
3934e98e3e1Schristos {
3944e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_add.f
3954e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3964e98e3e1Schristos   int UNUSED written = 0;
3974e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
3984e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3994e98e3e1Schristos 
4004e98e3e1Schristos {
4014e98e3e1Schristos   SI temp0;BI temp1;
4024e98e3e1Schristos   temp0 = ADDSI (* FLD (i_dr), * FLD (i_sr));
4034e98e3e1Schristos   temp1 = ADDOFSI (* FLD (i_dr), * FLD (i_sr), 0);
4044e98e3e1Schristos   {
4054e98e3e1Schristos     SI opval = temp0;
4064e98e3e1Schristos     * FLD (i_dr) = opval;
407212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
4084e98e3e1Schristos   }
4094e98e3e1Schristos   {
4104e98e3e1Schristos     BI opval = temp1;
4114e98e3e1Schristos     CPU (h_cond) = opval;
412212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
4134e98e3e1Schristos   }
4144e98e3e1Schristos }
4154e98e3e1Schristos 
4164e98e3e1Schristos   return vpc;
4174e98e3e1Schristos #undef FLD
4184e98e3e1Schristos }
4194e98e3e1Schristos 
4204e98e3e1Schristos /* addv3: addv3 $dr,$sr,$simm16 */
4214e98e3e1Schristos 
4224e98e3e1Schristos static SEM_PC
4234e98e3e1Schristos SEM_FN_NAME (m32rbf,addv3) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
4244e98e3e1Schristos {
4254e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_add3.f
4264e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4274e98e3e1Schristos   int UNUSED written = 0;
4284e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
4294e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
4304e98e3e1Schristos 
4314e98e3e1Schristos {
4324e98e3e1Schristos   SI temp0;BI temp1;
4334e98e3e1Schristos   temp0 = ADDSI (* FLD (i_sr), FLD (f_simm16));
4344e98e3e1Schristos   temp1 = ADDOFSI (* FLD (i_sr), FLD (f_simm16), 0);
4354e98e3e1Schristos   {
4364e98e3e1Schristos     SI opval = temp0;
4374e98e3e1Schristos     * FLD (i_dr) = opval;
438212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
4394e98e3e1Schristos   }
4404e98e3e1Schristos   {
4414e98e3e1Schristos     BI opval = temp1;
4424e98e3e1Schristos     CPU (h_cond) = opval;
443212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
4444e98e3e1Schristos   }
4454e98e3e1Schristos }
4464e98e3e1Schristos 
4474e98e3e1Schristos   return vpc;
4484e98e3e1Schristos #undef FLD
4494e98e3e1Schristos }
4504e98e3e1Schristos 
4514e98e3e1Schristos /* addx: addx $dr,$sr */
4524e98e3e1Schristos 
4534e98e3e1Schristos static SEM_PC
4544e98e3e1Schristos SEM_FN_NAME (m32rbf,addx) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
4554e98e3e1Schristos {
4564e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_add.f
4574e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4584e98e3e1Schristos   int UNUSED written = 0;
4594e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
4604e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
4614e98e3e1Schristos 
4624e98e3e1Schristos {
4634e98e3e1Schristos   SI temp0;BI temp1;
4644e98e3e1Schristos   temp0 = ADDCSI (* FLD (i_dr), * FLD (i_sr), CPU (h_cond));
4654e98e3e1Schristos   temp1 = ADDCFSI (* FLD (i_dr), * FLD (i_sr), CPU (h_cond));
4664e98e3e1Schristos   {
4674e98e3e1Schristos     SI opval = temp0;
4684e98e3e1Schristos     * FLD (i_dr) = opval;
469212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
4704e98e3e1Schristos   }
4714e98e3e1Schristos   {
4724e98e3e1Schristos     BI opval = temp1;
4734e98e3e1Schristos     CPU (h_cond) = opval;
474212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
4754e98e3e1Schristos   }
4764e98e3e1Schristos }
4774e98e3e1Schristos 
4784e98e3e1Schristos   return vpc;
4794e98e3e1Schristos #undef FLD
4804e98e3e1Schristos }
4814e98e3e1Schristos 
4824e98e3e1Schristos /* bc8: bc.s $disp8 */
4834e98e3e1Schristos 
4844e98e3e1Schristos static SEM_PC
4854e98e3e1Schristos SEM_FN_NAME (m32rbf,bc8) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
4864e98e3e1Schristos {
4874e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_bl8.f
4884e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4894e98e3e1Schristos   int UNUSED written = 0;
4904e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
4914e98e3e1Schristos   SEM_BRANCH_INIT
4924e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
4934e98e3e1Schristos 
4944e98e3e1Schristos if (CPU (h_cond)) {
4954e98e3e1Schristos   {
4964e98e3e1Schristos     USI opval = FLD (i_disp8);
4974e98e3e1Schristos     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
4984e98e3e1Schristos     written |= (1 << 2);
499212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
5004e98e3e1Schristos   }
5014e98e3e1Schristos }
5024e98e3e1Schristos 
5034e98e3e1Schristos   abuf->written = written;
5044e98e3e1Schristos   SEM_BRANCH_FINI (vpc);
5054e98e3e1Schristos   return vpc;
5064e98e3e1Schristos #undef FLD
5074e98e3e1Schristos }
5084e98e3e1Schristos 
5094e98e3e1Schristos /* bc24: bc.l $disp24 */
5104e98e3e1Schristos 
5114e98e3e1Schristos static SEM_PC
5124e98e3e1Schristos SEM_FN_NAME (m32rbf,bc24) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
5134e98e3e1Schristos {
5144e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_bl24.f
5154e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
5164e98e3e1Schristos   int UNUSED written = 0;
5174e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
5184e98e3e1Schristos   SEM_BRANCH_INIT
5194e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
5204e98e3e1Schristos 
5214e98e3e1Schristos if (CPU (h_cond)) {
5224e98e3e1Schristos   {
5234e98e3e1Schristos     USI opval = FLD (i_disp24);
5244e98e3e1Schristos     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
5254e98e3e1Schristos     written |= (1 << 2);
526212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
5274e98e3e1Schristos   }
5284e98e3e1Schristos }
5294e98e3e1Schristos 
5304e98e3e1Schristos   abuf->written = written;
5314e98e3e1Schristos   SEM_BRANCH_FINI (vpc);
5324e98e3e1Schristos   return vpc;
5334e98e3e1Schristos #undef FLD
5344e98e3e1Schristos }
5354e98e3e1Schristos 
5364e98e3e1Schristos /* beq: beq $src1,$src2,$disp16 */
5374e98e3e1Schristos 
5384e98e3e1Schristos static SEM_PC
5394e98e3e1Schristos SEM_FN_NAME (m32rbf,beq) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
5404e98e3e1Schristos {
5414e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_beq.f
5424e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
5434e98e3e1Schristos   int UNUSED written = 0;
5444e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
5454e98e3e1Schristos   SEM_BRANCH_INIT
5464e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
5474e98e3e1Schristos 
5484e98e3e1Schristos if (EQSI (* FLD (i_src1), * FLD (i_src2))) {
5494e98e3e1Schristos   {
5504e98e3e1Schristos     USI opval = FLD (i_disp16);
5514e98e3e1Schristos     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
5524e98e3e1Schristos     written |= (1 << 3);
553212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
5544e98e3e1Schristos   }
5554e98e3e1Schristos }
5564e98e3e1Schristos 
5574e98e3e1Schristos   abuf->written = written;
5584e98e3e1Schristos   SEM_BRANCH_FINI (vpc);
5594e98e3e1Schristos   return vpc;
5604e98e3e1Schristos #undef FLD
5614e98e3e1Schristos }
5624e98e3e1Schristos 
5634e98e3e1Schristos /* beqz: beqz $src2,$disp16 */
5644e98e3e1Schristos 
5654e98e3e1Schristos static SEM_PC
5664e98e3e1Schristos SEM_FN_NAME (m32rbf,beqz) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
5674e98e3e1Schristos {
5684e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_beq.f
5694e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
5704e98e3e1Schristos   int UNUSED written = 0;
5714e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
5724e98e3e1Schristos   SEM_BRANCH_INIT
5734e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
5744e98e3e1Schristos 
5754e98e3e1Schristos if (EQSI (* FLD (i_src2), 0)) {
5764e98e3e1Schristos   {
5774e98e3e1Schristos     USI opval = FLD (i_disp16);
5784e98e3e1Schristos     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
5794e98e3e1Schristos     written |= (1 << 2);
580212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
5814e98e3e1Schristos   }
5824e98e3e1Schristos }
5834e98e3e1Schristos 
5844e98e3e1Schristos   abuf->written = written;
5854e98e3e1Schristos   SEM_BRANCH_FINI (vpc);
5864e98e3e1Schristos   return vpc;
5874e98e3e1Schristos #undef FLD
5884e98e3e1Schristos }
5894e98e3e1Schristos 
5904e98e3e1Schristos /* bgez: bgez $src2,$disp16 */
5914e98e3e1Schristos 
5924e98e3e1Schristos static SEM_PC
5934e98e3e1Schristos SEM_FN_NAME (m32rbf,bgez) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
5944e98e3e1Schristos {
5954e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_beq.f
5964e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
5974e98e3e1Schristos   int UNUSED written = 0;
5984e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
5994e98e3e1Schristos   SEM_BRANCH_INIT
6004e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
6014e98e3e1Schristos 
6024e98e3e1Schristos if (GESI (* FLD (i_src2), 0)) {
6034e98e3e1Schristos   {
6044e98e3e1Schristos     USI opval = FLD (i_disp16);
6054e98e3e1Schristos     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
6064e98e3e1Schristos     written |= (1 << 2);
607212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
6084e98e3e1Schristos   }
6094e98e3e1Schristos }
6104e98e3e1Schristos 
6114e98e3e1Schristos   abuf->written = written;
6124e98e3e1Schristos   SEM_BRANCH_FINI (vpc);
6134e98e3e1Schristos   return vpc;
6144e98e3e1Schristos #undef FLD
6154e98e3e1Schristos }
6164e98e3e1Schristos 
6174e98e3e1Schristos /* bgtz: bgtz $src2,$disp16 */
6184e98e3e1Schristos 
6194e98e3e1Schristos static SEM_PC
6204e98e3e1Schristos SEM_FN_NAME (m32rbf,bgtz) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
6214e98e3e1Schristos {
6224e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_beq.f
6234e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
6244e98e3e1Schristos   int UNUSED written = 0;
6254e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
6264e98e3e1Schristos   SEM_BRANCH_INIT
6274e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
6284e98e3e1Schristos 
6294e98e3e1Schristos if (GTSI (* FLD (i_src2), 0)) {
6304e98e3e1Schristos   {
6314e98e3e1Schristos     USI opval = FLD (i_disp16);
6324e98e3e1Schristos     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
6334e98e3e1Schristos     written |= (1 << 2);
634212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
6354e98e3e1Schristos   }
6364e98e3e1Schristos }
6374e98e3e1Schristos 
6384e98e3e1Schristos   abuf->written = written;
6394e98e3e1Schristos   SEM_BRANCH_FINI (vpc);
6404e98e3e1Schristos   return vpc;
6414e98e3e1Schristos #undef FLD
6424e98e3e1Schristos }
6434e98e3e1Schristos 
6444e98e3e1Schristos /* blez: blez $src2,$disp16 */
6454e98e3e1Schristos 
6464e98e3e1Schristos static SEM_PC
6474e98e3e1Schristos SEM_FN_NAME (m32rbf,blez) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
6484e98e3e1Schristos {
6494e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_beq.f
6504e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
6514e98e3e1Schristos   int UNUSED written = 0;
6524e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
6534e98e3e1Schristos   SEM_BRANCH_INIT
6544e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
6554e98e3e1Schristos 
6564e98e3e1Schristos if (LESI (* FLD (i_src2), 0)) {
6574e98e3e1Schristos   {
6584e98e3e1Schristos     USI opval = FLD (i_disp16);
6594e98e3e1Schristos     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
6604e98e3e1Schristos     written |= (1 << 2);
661212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
6624e98e3e1Schristos   }
6634e98e3e1Schristos }
6644e98e3e1Schristos 
6654e98e3e1Schristos   abuf->written = written;
6664e98e3e1Schristos   SEM_BRANCH_FINI (vpc);
6674e98e3e1Schristos   return vpc;
6684e98e3e1Schristos #undef FLD
6694e98e3e1Schristos }
6704e98e3e1Schristos 
6714e98e3e1Schristos /* bltz: bltz $src2,$disp16 */
6724e98e3e1Schristos 
6734e98e3e1Schristos static SEM_PC
6744e98e3e1Schristos SEM_FN_NAME (m32rbf,bltz) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
6754e98e3e1Schristos {
6764e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_beq.f
6774e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
6784e98e3e1Schristos   int UNUSED written = 0;
6794e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
6804e98e3e1Schristos   SEM_BRANCH_INIT
6814e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
6824e98e3e1Schristos 
6834e98e3e1Schristos if (LTSI (* FLD (i_src2), 0)) {
6844e98e3e1Schristos   {
6854e98e3e1Schristos     USI opval = FLD (i_disp16);
6864e98e3e1Schristos     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
6874e98e3e1Schristos     written |= (1 << 2);
688212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
6894e98e3e1Schristos   }
6904e98e3e1Schristos }
6914e98e3e1Schristos 
6924e98e3e1Schristos   abuf->written = written;
6934e98e3e1Schristos   SEM_BRANCH_FINI (vpc);
6944e98e3e1Schristos   return vpc;
6954e98e3e1Schristos #undef FLD
6964e98e3e1Schristos }
6974e98e3e1Schristos 
6984e98e3e1Schristos /* bnez: bnez $src2,$disp16 */
6994e98e3e1Schristos 
7004e98e3e1Schristos static SEM_PC
7014e98e3e1Schristos SEM_FN_NAME (m32rbf,bnez) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
7024e98e3e1Schristos {
7034e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_beq.f
7044e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
7054e98e3e1Schristos   int UNUSED written = 0;
7064e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
7074e98e3e1Schristos   SEM_BRANCH_INIT
7084e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
7094e98e3e1Schristos 
7104e98e3e1Schristos if (NESI (* FLD (i_src2), 0)) {
7114e98e3e1Schristos   {
7124e98e3e1Schristos     USI opval = FLD (i_disp16);
7134e98e3e1Schristos     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
7144e98e3e1Schristos     written |= (1 << 2);
715212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
7164e98e3e1Schristos   }
7174e98e3e1Schristos }
7184e98e3e1Schristos 
7194e98e3e1Schristos   abuf->written = written;
7204e98e3e1Schristos   SEM_BRANCH_FINI (vpc);
7214e98e3e1Schristos   return vpc;
7224e98e3e1Schristos #undef FLD
7234e98e3e1Schristos }
7244e98e3e1Schristos 
7254e98e3e1Schristos /* bl8: bl.s $disp8 */
7264e98e3e1Schristos 
7274e98e3e1Schristos static SEM_PC
7284e98e3e1Schristos SEM_FN_NAME (m32rbf,bl8) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
7294e98e3e1Schristos {
7304e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_bl8.f
7314e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
7324e98e3e1Schristos   int UNUSED written = 0;
7334e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
7344e98e3e1Schristos   SEM_BRANCH_INIT
7354e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
7364e98e3e1Schristos 
7374e98e3e1Schristos {
7384e98e3e1Schristos   {
7394e98e3e1Schristos     SI opval = ADDSI (ANDSI (pc, -4), 4);
7404e98e3e1Schristos     CPU (h_gr[((UINT) 14)]) = opval;
741212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
7424e98e3e1Schristos   }
7434e98e3e1Schristos   {
7444e98e3e1Schristos     USI opval = FLD (i_disp8);
7454e98e3e1Schristos     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
746212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
7474e98e3e1Schristos   }
7484e98e3e1Schristos }
7494e98e3e1Schristos 
7504e98e3e1Schristos   SEM_BRANCH_FINI (vpc);
7514e98e3e1Schristos   return vpc;
7524e98e3e1Schristos #undef FLD
7534e98e3e1Schristos }
7544e98e3e1Schristos 
7554e98e3e1Schristos /* bl24: bl.l $disp24 */
7564e98e3e1Schristos 
7574e98e3e1Schristos static SEM_PC
7584e98e3e1Schristos SEM_FN_NAME (m32rbf,bl24) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
7594e98e3e1Schristos {
7604e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_bl24.f
7614e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
7624e98e3e1Schristos   int UNUSED written = 0;
7634e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
7644e98e3e1Schristos   SEM_BRANCH_INIT
7654e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
7664e98e3e1Schristos 
7674e98e3e1Schristos {
7684e98e3e1Schristos   {
7694e98e3e1Schristos     SI opval = ADDSI (pc, 4);
7704e98e3e1Schristos     CPU (h_gr[((UINT) 14)]) = opval;
771212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
7724e98e3e1Schristos   }
7734e98e3e1Schristos   {
7744e98e3e1Schristos     USI opval = FLD (i_disp24);
7754e98e3e1Schristos     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
776212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
7774e98e3e1Schristos   }
7784e98e3e1Schristos }
7794e98e3e1Schristos 
7804e98e3e1Schristos   SEM_BRANCH_FINI (vpc);
7814e98e3e1Schristos   return vpc;
7824e98e3e1Schristos #undef FLD
7834e98e3e1Schristos }
7844e98e3e1Schristos 
7854e98e3e1Schristos /* bnc8: bnc.s $disp8 */
7864e98e3e1Schristos 
7874e98e3e1Schristos static SEM_PC
7884e98e3e1Schristos SEM_FN_NAME (m32rbf,bnc8) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
7894e98e3e1Schristos {
7904e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_bl8.f
7914e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
7924e98e3e1Schristos   int UNUSED written = 0;
7934e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
7944e98e3e1Schristos   SEM_BRANCH_INIT
7954e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
7964e98e3e1Schristos 
7974e98e3e1Schristos if (NOTBI (CPU (h_cond))) {
7984e98e3e1Schristos   {
7994e98e3e1Schristos     USI opval = FLD (i_disp8);
8004e98e3e1Schristos     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
8014e98e3e1Schristos     written |= (1 << 2);
802212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
8034e98e3e1Schristos   }
8044e98e3e1Schristos }
8054e98e3e1Schristos 
8064e98e3e1Schristos   abuf->written = written;
8074e98e3e1Schristos   SEM_BRANCH_FINI (vpc);
8084e98e3e1Schristos   return vpc;
8094e98e3e1Schristos #undef FLD
8104e98e3e1Schristos }
8114e98e3e1Schristos 
8124e98e3e1Schristos /* bnc24: bnc.l $disp24 */
8134e98e3e1Schristos 
8144e98e3e1Schristos static SEM_PC
8154e98e3e1Schristos SEM_FN_NAME (m32rbf,bnc24) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
8164e98e3e1Schristos {
8174e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_bl24.f
8184e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
8194e98e3e1Schristos   int UNUSED written = 0;
8204e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
8214e98e3e1Schristos   SEM_BRANCH_INIT
8224e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
8234e98e3e1Schristos 
8244e98e3e1Schristos if (NOTBI (CPU (h_cond))) {
8254e98e3e1Schristos   {
8264e98e3e1Schristos     USI opval = FLD (i_disp24);
8274e98e3e1Schristos     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
8284e98e3e1Schristos     written |= (1 << 2);
829212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
8304e98e3e1Schristos   }
8314e98e3e1Schristos }
8324e98e3e1Schristos 
8334e98e3e1Schristos   abuf->written = written;
8344e98e3e1Schristos   SEM_BRANCH_FINI (vpc);
8354e98e3e1Schristos   return vpc;
8364e98e3e1Schristos #undef FLD
8374e98e3e1Schristos }
8384e98e3e1Schristos 
8394e98e3e1Schristos /* bne: bne $src1,$src2,$disp16 */
8404e98e3e1Schristos 
8414e98e3e1Schristos static SEM_PC
8424e98e3e1Schristos SEM_FN_NAME (m32rbf,bne) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
8434e98e3e1Schristos {
8444e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_beq.f
8454e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
8464e98e3e1Schristos   int UNUSED written = 0;
8474e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
8484e98e3e1Schristos   SEM_BRANCH_INIT
8494e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
8504e98e3e1Schristos 
8514e98e3e1Schristos if (NESI (* FLD (i_src1), * FLD (i_src2))) {
8524e98e3e1Schristos   {
8534e98e3e1Schristos     USI opval = FLD (i_disp16);
8544e98e3e1Schristos     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
8554e98e3e1Schristos     written |= (1 << 3);
856212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
8574e98e3e1Schristos   }
8584e98e3e1Schristos }
8594e98e3e1Schristos 
8604e98e3e1Schristos   abuf->written = written;
8614e98e3e1Schristos   SEM_BRANCH_FINI (vpc);
8624e98e3e1Schristos   return vpc;
8634e98e3e1Schristos #undef FLD
8644e98e3e1Schristos }
8654e98e3e1Schristos 
8664e98e3e1Schristos /* bra8: bra.s $disp8 */
8674e98e3e1Schristos 
8684e98e3e1Schristos static SEM_PC
8694e98e3e1Schristos SEM_FN_NAME (m32rbf,bra8) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
8704e98e3e1Schristos {
8714e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_bl8.f
8724e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
8734e98e3e1Schristos   int UNUSED written = 0;
8744e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
8754e98e3e1Schristos   SEM_BRANCH_INIT
8764e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
8774e98e3e1Schristos 
8784e98e3e1Schristos   {
8794e98e3e1Schristos     USI opval = FLD (i_disp8);
8804e98e3e1Schristos     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
881212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
8824e98e3e1Schristos   }
8834e98e3e1Schristos 
8844e98e3e1Schristos   SEM_BRANCH_FINI (vpc);
8854e98e3e1Schristos   return vpc;
8864e98e3e1Schristos #undef FLD
8874e98e3e1Schristos }
8884e98e3e1Schristos 
8894e98e3e1Schristos /* bra24: bra.l $disp24 */
8904e98e3e1Schristos 
8914e98e3e1Schristos static SEM_PC
8924e98e3e1Schristos SEM_FN_NAME (m32rbf,bra24) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
8934e98e3e1Schristos {
8944e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_bl24.f
8954e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
8964e98e3e1Schristos   int UNUSED written = 0;
8974e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
8984e98e3e1Schristos   SEM_BRANCH_INIT
8994e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
9004e98e3e1Schristos 
9014e98e3e1Schristos   {
9024e98e3e1Schristos     USI opval = FLD (i_disp24);
9034e98e3e1Schristos     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
904212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
9054e98e3e1Schristos   }
9064e98e3e1Schristos 
9074e98e3e1Schristos   SEM_BRANCH_FINI (vpc);
9084e98e3e1Schristos   return vpc;
9094e98e3e1Schristos #undef FLD
9104e98e3e1Schristos }
9114e98e3e1Schristos 
9124e98e3e1Schristos /* cmp: cmp $src1,$src2 */
9134e98e3e1Schristos 
9144e98e3e1Schristos static SEM_PC
9154e98e3e1Schristos SEM_FN_NAME (m32rbf,cmp) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
9164e98e3e1Schristos {
9174e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_st_plus.f
9184e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
9194e98e3e1Schristos   int UNUSED written = 0;
9204e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
9214e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
9224e98e3e1Schristos 
9234e98e3e1Schristos   {
9244e98e3e1Schristos     BI opval = LTSI (* FLD (i_src1), * FLD (i_src2));
9254e98e3e1Schristos     CPU (h_cond) = opval;
926212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
9274e98e3e1Schristos   }
9284e98e3e1Schristos 
9294e98e3e1Schristos   return vpc;
9304e98e3e1Schristos #undef FLD
9314e98e3e1Schristos }
9324e98e3e1Schristos 
9334e98e3e1Schristos /* cmpi: cmpi $src2,$simm16 */
9344e98e3e1Schristos 
9354e98e3e1Schristos static SEM_PC
9364e98e3e1Schristos SEM_FN_NAME (m32rbf,cmpi) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
9374e98e3e1Schristos {
9384e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_st_d.f
9394e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
9404e98e3e1Schristos   int UNUSED written = 0;
9414e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
9424e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
9434e98e3e1Schristos 
9444e98e3e1Schristos   {
9454e98e3e1Schristos     BI opval = LTSI (* FLD (i_src2), FLD (f_simm16));
9464e98e3e1Schristos     CPU (h_cond) = opval;
947212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
9484e98e3e1Schristos   }
9494e98e3e1Schristos 
9504e98e3e1Schristos   return vpc;
9514e98e3e1Schristos #undef FLD
9524e98e3e1Schristos }
9534e98e3e1Schristos 
9544e98e3e1Schristos /* cmpu: cmpu $src1,$src2 */
9554e98e3e1Schristos 
9564e98e3e1Schristos static SEM_PC
9574e98e3e1Schristos SEM_FN_NAME (m32rbf,cmpu) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
9584e98e3e1Schristos {
9594e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_st_plus.f
9604e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
9614e98e3e1Schristos   int UNUSED written = 0;
9624e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
9634e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
9644e98e3e1Schristos 
9654e98e3e1Schristos   {
9664e98e3e1Schristos     BI opval = LTUSI (* FLD (i_src1), * FLD (i_src2));
9674e98e3e1Schristos     CPU (h_cond) = opval;
968212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
9694e98e3e1Schristos   }
9704e98e3e1Schristos 
9714e98e3e1Schristos   return vpc;
9724e98e3e1Schristos #undef FLD
9734e98e3e1Schristos }
9744e98e3e1Schristos 
9754e98e3e1Schristos /* cmpui: cmpui $src2,$simm16 */
9764e98e3e1Schristos 
9774e98e3e1Schristos static SEM_PC
9784e98e3e1Schristos SEM_FN_NAME (m32rbf,cmpui) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
9794e98e3e1Schristos {
9804e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_st_d.f
9814e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
9824e98e3e1Schristos   int UNUSED written = 0;
9834e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
9844e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
9854e98e3e1Schristos 
9864e98e3e1Schristos   {
9874e98e3e1Schristos     BI opval = LTUSI (* FLD (i_src2), FLD (f_simm16));
9884e98e3e1Schristos     CPU (h_cond) = opval;
989212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
9904e98e3e1Schristos   }
9914e98e3e1Schristos 
9924e98e3e1Schristos   return vpc;
9934e98e3e1Schristos #undef FLD
9944e98e3e1Schristos }
9954e98e3e1Schristos 
9964e98e3e1Schristos /* div: div $dr,$sr */
9974e98e3e1Schristos 
9984e98e3e1Schristos static SEM_PC
9994e98e3e1Schristos SEM_FN_NAME (m32rbf,div) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
10004e98e3e1Schristos {
10014e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_add.f
10024e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
10034e98e3e1Schristos   int UNUSED written = 0;
10044e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
10054e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
10064e98e3e1Schristos 
10074e98e3e1Schristos if (NESI (* FLD (i_sr), 0)) {
10084e98e3e1Schristos   {
10094e98e3e1Schristos     SI opval = DIVSI (* FLD (i_dr), * FLD (i_sr));
10104e98e3e1Schristos     * FLD (i_dr) = opval;
10114e98e3e1Schristos     written |= (1 << 2);
1012212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
10134e98e3e1Schristos   }
10144e98e3e1Schristos }
10154e98e3e1Schristos 
10164e98e3e1Schristos   abuf->written = written;
10174e98e3e1Schristos   return vpc;
10184e98e3e1Schristos #undef FLD
10194e98e3e1Schristos }
10204e98e3e1Schristos 
10214e98e3e1Schristos /* divu: divu $dr,$sr */
10224e98e3e1Schristos 
10234e98e3e1Schristos static SEM_PC
10244e98e3e1Schristos SEM_FN_NAME (m32rbf,divu) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
10254e98e3e1Schristos {
10264e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_add.f
10274e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
10284e98e3e1Schristos   int UNUSED written = 0;
10294e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
10304e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
10314e98e3e1Schristos 
10324e98e3e1Schristos if (NESI (* FLD (i_sr), 0)) {
10334e98e3e1Schristos   {
10344e98e3e1Schristos     SI opval = UDIVSI (* FLD (i_dr), * FLD (i_sr));
10354e98e3e1Schristos     * FLD (i_dr) = opval;
10364e98e3e1Schristos     written |= (1 << 2);
1037212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
10384e98e3e1Schristos   }
10394e98e3e1Schristos }
10404e98e3e1Schristos 
10414e98e3e1Schristos   abuf->written = written;
10424e98e3e1Schristos   return vpc;
10434e98e3e1Schristos #undef FLD
10444e98e3e1Schristos }
10454e98e3e1Schristos 
10464e98e3e1Schristos /* rem: rem $dr,$sr */
10474e98e3e1Schristos 
10484e98e3e1Schristos static SEM_PC
10494e98e3e1Schristos SEM_FN_NAME (m32rbf,rem) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
10504e98e3e1Schristos {
10514e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_add.f
10524e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
10534e98e3e1Schristos   int UNUSED written = 0;
10544e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
10554e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
10564e98e3e1Schristos 
10574e98e3e1Schristos if (NESI (* FLD (i_sr), 0)) {
10584e98e3e1Schristos   {
10594e98e3e1Schristos     SI opval = MODSI (* FLD (i_dr), * FLD (i_sr));
10604e98e3e1Schristos     * FLD (i_dr) = opval;
10614e98e3e1Schristos     written |= (1 << 2);
1062212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
10634e98e3e1Schristos   }
10644e98e3e1Schristos }
10654e98e3e1Schristos 
10664e98e3e1Schristos   abuf->written = written;
10674e98e3e1Schristos   return vpc;
10684e98e3e1Schristos #undef FLD
10694e98e3e1Schristos }
10704e98e3e1Schristos 
10714e98e3e1Schristos /* remu: remu $dr,$sr */
10724e98e3e1Schristos 
10734e98e3e1Schristos static SEM_PC
10744e98e3e1Schristos SEM_FN_NAME (m32rbf,remu) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
10754e98e3e1Schristos {
10764e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_add.f
10774e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
10784e98e3e1Schristos   int UNUSED written = 0;
10794e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
10804e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
10814e98e3e1Schristos 
10824e98e3e1Schristos if (NESI (* FLD (i_sr), 0)) {
10834e98e3e1Schristos   {
10844e98e3e1Schristos     SI opval = UMODSI (* FLD (i_dr), * FLD (i_sr));
10854e98e3e1Schristos     * FLD (i_dr) = opval;
10864e98e3e1Schristos     written |= (1 << 2);
1087212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
10884e98e3e1Schristos   }
10894e98e3e1Schristos }
10904e98e3e1Schristos 
10914e98e3e1Schristos   abuf->written = written;
10924e98e3e1Schristos   return vpc;
10934e98e3e1Schristos #undef FLD
10944e98e3e1Schristos }
10954e98e3e1Schristos 
10964e98e3e1Schristos /* jl: jl $sr */
10974e98e3e1Schristos 
10984e98e3e1Schristos static SEM_PC
10994e98e3e1Schristos SEM_FN_NAME (m32rbf,jl) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
11004e98e3e1Schristos {
11014e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_jl.f
11024e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
11034e98e3e1Schristos   int UNUSED written = 0;
11044e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
11054e98e3e1Schristos   SEM_BRANCH_INIT
11064e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
11074e98e3e1Schristos 
11084e98e3e1Schristos {
11094e98e3e1Schristos   SI temp0;USI temp1;
11104e98e3e1Schristos   temp0 = ADDSI (ANDSI (pc, -4), 4);
11114e98e3e1Schristos   temp1 = ANDSI (* FLD (i_sr), -4);
11124e98e3e1Schristos   {
11134e98e3e1Schristos     SI opval = temp0;
11144e98e3e1Schristos     CPU (h_gr[((UINT) 14)]) = opval;
1115212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
11164e98e3e1Schristos   }
11174e98e3e1Schristos   {
11184e98e3e1Schristos     USI opval = temp1;
11194e98e3e1Schristos     SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
1120212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
11214e98e3e1Schristos   }
11224e98e3e1Schristos }
11234e98e3e1Schristos 
11244e98e3e1Schristos   SEM_BRANCH_FINI (vpc);
11254e98e3e1Schristos   return vpc;
11264e98e3e1Schristos #undef FLD
11274e98e3e1Schristos }
11284e98e3e1Schristos 
11294e98e3e1Schristos /* jmp: jmp $sr */
11304e98e3e1Schristos 
11314e98e3e1Schristos static SEM_PC
11324e98e3e1Schristos SEM_FN_NAME (m32rbf,jmp) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
11334e98e3e1Schristos {
11344e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_jl.f
11354e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
11364e98e3e1Schristos   int UNUSED written = 0;
11374e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
11384e98e3e1Schristos   SEM_BRANCH_INIT
11394e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
11404e98e3e1Schristos 
11414e98e3e1Schristos   {
11424e98e3e1Schristos     USI opval = ANDSI (* FLD (i_sr), -4);
11434e98e3e1Schristos     SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
1144212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
11454e98e3e1Schristos   }
11464e98e3e1Schristos 
11474e98e3e1Schristos   SEM_BRANCH_FINI (vpc);
11484e98e3e1Schristos   return vpc;
11494e98e3e1Schristos #undef FLD
11504e98e3e1Schristos }
11514e98e3e1Schristos 
11524e98e3e1Schristos /* ld: ld $dr,@$sr */
11534e98e3e1Schristos 
11544e98e3e1Schristos static SEM_PC
11554e98e3e1Schristos SEM_FN_NAME (m32rbf,ld) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
11564e98e3e1Schristos {
11574e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_ld_plus.f
11584e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
11594e98e3e1Schristos   int UNUSED written = 0;
11604e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
11614e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
11624e98e3e1Schristos 
11634e98e3e1Schristos   {
11644e98e3e1Schristos     SI opval = GETMEMSI (current_cpu, pc, * FLD (i_sr));
11654e98e3e1Schristos     * FLD (i_dr) = opval;
1166212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
11674e98e3e1Schristos   }
11684e98e3e1Schristos 
11694e98e3e1Schristos   return vpc;
11704e98e3e1Schristos #undef FLD
11714e98e3e1Schristos }
11724e98e3e1Schristos 
11734e98e3e1Schristos /* ld-d: ld $dr,@($slo16,$sr) */
11744e98e3e1Schristos 
11754e98e3e1Schristos static SEM_PC
11764e98e3e1Schristos SEM_FN_NAME (m32rbf,ld_d) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
11774e98e3e1Schristos {
11784e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_add3.f
11794e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
11804e98e3e1Schristos   int UNUSED written = 0;
11814e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
11824e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
11834e98e3e1Schristos 
11844e98e3e1Schristos   {
11854e98e3e1Schristos     SI opval = GETMEMSI (current_cpu, pc, ADDSI (* FLD (i_sr), FLD (f_simm16)));
11864e98e3e1Schristos     * FLD (i_dr) = opval;
1187212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
11884e98e3e1Schristos   }
11894e98e3e1Schristos 
11904e98e3e1Schristos   return vpc;
11914e98e3e1Schristos #undef FLD
11924e98e3e1Schristos }
11934e98e3e1Schristos 
11944e98e3e1Schristos /* ldb: ldb $dr,@$sr */
11954e98e3e1Schristos 
11964e98e3e1Schristos static SEM_PC
11974e98e3e1Schristos SEM_FN_NAME (m32rbf,ldb) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
11984e98e3e1Schristos {
11994e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_ld_plus.f
12004e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
12014e98e3e1Schristos   int UNUSED written = 0;
12024e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
12034e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
12044e98e3e1Schristos 
12054e98e3e1Schristos   {
12064e98e3e1Schristos     SI opval = EXTQISI (GETMEMQI (current_cpu, pc, * FLD (i_sr)));
12074e98e3e1Schristos     * FLD (i_dr) = opval;
1208212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
12094e98e3e1Schristos   }
12104e98e3e1Schristos 
12114e98e3e1Schristos   return vpc;
12124e98e3e1Schristos #undef FLD
12134e98e3e1Schristos }
12144e98e3e1Schristos 
12154e98e3e1Schristos /* ldb-d: ldb $dr,@($slo16,$sr) */
12164e98e3e1Schristos 
12174e98e3e1Schristos static SEM_PC
12184e98e3e1Schristos SEM_FN_NAME (m32rbf,ldb_d) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
12194e98e3e1Schristos {
12204e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_add3.f
12214e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
12224e98e3e1Schristos   int UNUSED written = 0;
12234e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
12244e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
12254e98e3e1Schristos 
12264e98e3e1Schristos   {
12274e98e3e1Schristos     SI opval = EXTQISI (GETMEMQI (current_cpu, pc, ADDSI (* FLD (i_sr), FLD (f_simm16))));
12284e98e3e1Schristos     * FLD (i_dr) = opval;
1229212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
12304e98e3e1Schristos   }
12314e98e3e1Schristos 
12324e98e3e1Schristos   return vpc;
12334e98e3e1Schristos #undef FLD
12344e98e3e1Schristos }
12354e98e3e1Schristos 
12364e98e3e1Schristos /* ldh: ldh $dr,@$sr */
12374e98e3e1Schristos 
12384e98e3e1Schristos static SEM_PC
12394e98e3e1Schristos SEM_FN_NAME (m32rbf,ldh) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
12404e98e3e1Schristos {
12414e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_ld_plus.f
12424e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
12434e98e3e1Schristos   int UNUSED written = 0;
12444e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
12454e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
12464e98e3e1Schristos 
12474e98e3e1Schristos   {
12484e98e3e1Schristos     SI opval = EXTHISI (GETMEMHI (current_cpu, pc, * FLD (i_sr)));
12494e98e3e1Schristos     * FLD (i_dr) = opval;
1250212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
12514e98e3e1Schristos   }
12524e98e3e1Schristos 
12534e98e3e1Schristos   return vpc;
12544e98e3e1Schristos #undef FLD
12554e98e3e1Schristos }
12564e98e3e1Schristos 
12574e98e3e1Schristos /* ldh-d: ldh $dr,@($slo16,$sr) */
12584e98e3e1Schristos 
12594e98e3e1Schristos static SEM_PC
12604e98e3e1Schristos SEM_FN_NAME (m32rbf,ldh_d) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
12614e98e3e1Schristos {
12624e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_add3.f
12634e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
12644e98e3e1Schristos   int UNUSED written = 0;
12654e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
12664e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
12674e98e3e1Schristos 
12684e98e3e1Schristos   {
12694e98e3e1Schristos     SI opval = EXTHISI (GETMEMHI (current_cpu, pc, ADDSI (* FLD (i_sr), FLD (f_simm16))));
12704e98e3e1Schristos     * FLD (i_dr) = opval;
1271212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
12724e98e3e1Schristos   }
12734e98e3e1Schristos 
12744e98e3e1Schristos   return vpc;
12754e98e3e1Schristos #undef FLD
12764e98e3e1Schristos }
12774e98e3e1Schristos 
12784e98e3e1Schristos /* ldub: ldub $dr,@$sr */
12794e98e3e1Schristos 
12804e98e3e1Schristos static SEM_PC
12814e98e3e1Schristos SEM_FN_NAME (m32rbf,ldub) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
12824e98e3e1Schristos {
12834e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_ld_plus.f
12844e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
12854e98e3e1Schristos   int UNUSED written = 0;
12864e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
12874e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
12884e98e3e1Schristos 
12894e98e3e1Schristos   {
12904e98e3e1Schristos     SI opval = ZEXTQISI (GETMEMQI (current_cpu, pc, * FLD (i_sr)));
12914e98e3e1Schristos     * FLD (i_dr) = opval;
1292212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
12934e98e3e1Schristos   }
12944e98e3e1Schristos 
12954e98e3e1Schristos   return vpc;
12964e98e3e1Schristos #undef FLD
12974e98e3e1Schristos }
12984e98e3e1Schristos 
12994e98e3e1Schristos /* ldub-d: ldub $dr,@($slo16,$sr) */
13004e98e3e1Schristos 
13014e98e3e1Schristos static SEM_PC
13024e98e3e1Schristos SEM_FN_NAME (m32rbf,ldub_d) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
13034e98e3e1Schristos {
13044e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_add3.f
13054e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
13064e98e3e1Schristos   int UNUSED written = 0;
13074e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
13084e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
13094e98e3e1Schristos 
13104e98e3e1Schristos   {
13114e98e3e1Schristos     SI opval = ZEXTQISI (GETMEMQI (current_cpu, pc, ADDSI (* FLD (i_sr), FLD (f_simm16))));
13124e98e3e1Schristos     * FLD (i_dr) = opval;
1313212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
13144e98e3e1Schristos   }
13154e98e3e1Schristos 
13164e98e3e1Schristos   return vpc;
13174e98e3e1Schristos #undef FLD
13184e98e3e1Schristos }
13194e98e3e1Schristos 
13204e98e3e1Schristos /* lduh: lduh $dr,@$sr */
13214e98e3e1Schristos 
13224e98e3e1Schristos static SEM_PC
13234e98e3e1Schristos SEM_FN_NAME (m32rbf,lduh) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
13244e98e3e1Schristos {
13254e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_ld_plus.f
13264e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
13274e98e3e1Schristos   int UNUSED written = 0;
13284e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
13294e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
13304e98e3e1Schristos 
13314e98e3e1Schristos   {
13324e98e3e1Schristos     SI opval = ZEXTHISI (GETMEMHI (current_cpu, pc, * FLD (i_sr)));
13334e98e3e1Schristos     * FLD (i_dr) = opval;
1334212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
13354e98e3e1Schristos   }
13364e98e3e1Schristos 
13374e98e3e1Schristos   return vpc;
13384e98e3e1Schristos #undef FLD
13394e98e3e1Schristos }
13404e98e3e1Schristos 
13414e98e3e1Schristos /* lduh-d: lduh $dr,@($slo16,$sr) */
13424e98e3e1Schristos 
13434e98e3e1Schristos static SEM_PC
13444e98e3e1Schristos SEM_FN_NAME (m32rbf,lduh_d) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
13454e98e3e1Schristos {
13464e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_add3.f
13474e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
13484e98e3e1Schristos   int UNUSED written = 0;
13494e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
13504e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
13514e98e3e1Schristos 
13524e98e3e1Schristos   {
13534e98e3e1Schristos     SI opval = ZEXTHISI (GETMEMHI (current_cpu, pc, ADDSI (* FLD (i_sr), FLD (f_simm16))));
13544e98e3e1Schristos     * FLD (i_dr) = opval;
1355212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
13564e98e3e1Schristos   }
13574e98e3e1Schristos 
13584e98e3e1Schristos   return vpc;
13594e98e3e1Schristos #undef FLD
13604e98e3e1Schristos }
13614e98e3e1Schristos 
13624e98e3e1Schristos /* ld-plus: ld $dr,@$sr+ */
13634e98e3e1Schristos 
13644e98e3e1Schristos static SEM_PC
13654e98e3e1Schristos SEM_FN_NAME (m32rbf,ld_plus) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
13664e98e3e1Schristos {
13674e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_ld_plus.f
13684e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
13694e98e3e1Schristos   int UNUSED written = 0;
13704e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
13714e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
13724e98e3e1Schristos 
13734e98e3e1Schristos {
13744e98e3e1Schristos   SI temp0;SI temp1;
13754e98e3e1Schristos   temp0 = GETMEMSI (current_cpu, pc, * FLD (i_sr));
13764e98e3e1Schristos   temp1 = ADDSI (* FLD (i_sr), 4);
13774e98e3e1Schristos   {
13784e98e3e1Schristos     SI opval = temp0;
13794e98e3e1Schristos     * FLD (i_dr) = opval;
1380212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
13814e98e3e1Schristos   }
13824e98e3e1Schristos   {
13834e98e3e1Schristos     SI opval = temp1;
13844e98e3e1Schristos     * FLD (i_sr) = opval;
1385212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
13864e98e3e1Schristos   }
13874e98e3e1Schristos }
13884e98e3e1Schristos 
13894e98e3e1Schristos   return vpc;
13904e98e3e1Schristos #undef FLD
13914e98e3e1Schristos }
13924e98e3e1Schristos 
13934e98e3e1Schristos /* ld24: ld24 $dr,$uimm24 */
13944e98e3e1Schristos 
13954e98e3e1Schristos static SEM_PC
13964e98e3e1Schristos SEM_FN_NAME (m32rbf,ld24) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
13974e98e3e1Schristos {
13984e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_ld24.f
13994e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
14004e98e3e1Schristos   int UNUSED written = 0;
14014e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
14024e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
14034e98e3e1Schristos 
14044e98e3e1Schristos   {
14054e98e3e1Schristos     SI opval = FLD (i_uimm24);
14064e98e3e1Schristos     * FLD (i_dr) = opval;
1407212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
14084e98e3e1Schristos   }
14094e98e3e1Schristos 
14104e98e3e1Schristos   return vpc;
14114e98e3e1Schristos #undef FLD
14124e98e3e1Schristos }
14134e98e3e1Schristos 
14144e98e3e1Schristos /* ldi8: ldi8 $dr,$simm8 */
14154e98e3e1Schristos 
14164e98e3e1Schristos static SEM_PC
14174e98e3e1Schristos SEM_FN_NAME (m32rbf,ldi8) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
14184e98e3e1Schristos {
14194e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_addi.f
14204e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
14214e98e3e1Schristos   int UNUSED written = 0;
14224e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
14234e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
14244e98e3e1Schristos 
14254e98e3e1Schristos   {
14264e98e3e1Schristos     SI opval = FLD (f_simm8);
14274e98e3e1Schristos     * FLD (i_dr) = opval;
1428212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
14294e98e3e1Schristos   }
14304e98e3e1Schristos 
14314e98e3e1Schristos   return vpc;
14324e98e3e1Schristos #undef FLD
14334e98e3e1Schristos }
14344e98e3e1Schristos 
14354e98e3e1Schristos /* ldi16: ldi16 $dr,$hash$slo16 */
14364e98e3e1Schristos 
14374e98e3e1Schristos static SEM_PC
14384e98e3e1Schristos SEM_FN_NAME (m32rbf,ldi16) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
14394e98e3e1Schristos {
14404e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_add3.f
14414e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
14424e98e3e1Schristos   int UNUSED written = 0;
14434e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
14444e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
14454e98e3e1Schristos 
14464e98e3e1Schristos   {
14474e98e3e1Schristos     SI opval = FLD (f_simm16);
14484e98e3e1Schristos     * FLD (i_dr) = opval;
1449212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
14504e98e3e1Schristos   }
14514e98e3e1Schristos 
14524e98e3e1Schristos   return vpc;
14534e98e3e1Schristos #undef FLD
14544e98e3e1Schristos }
14554e98e3e1Schristos 
14564e98e3e1Schristos /* lock: lock $dr,@$sr */
14574e98e3e1Schristos 
14584e98e3e1Schristos static SEM_PC
14594e98e3e1Schristos SEM_FN_NAME (m32rbf,lock) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
14604e98e3e1Schristos {
14614e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_ld_plus.f
14624e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
14634e98e3e1Schristos   int UNUSED written = 0;
14644e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
14654e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
14664e98e3e1Schristos 
14674e98e3e1Schristos {
14684e98e3e1Schristos   {
14694e98e3e1Schristos     BI opval = 1;
14704e98e3e1Schristos     CPU (h_lock) = opval;
1471212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "lock", 'x', opval);
14724e98e3e1Schristos   }
14734e98e3e1Schristos   {
14744e98e3e1Schristos     SI opval = GETMEMSI (current_cpu, pc, * FLD (i_sr));
14754e98e3e1Schristos     * FLD (i_dr) = opval;
1476212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
14774e98e3e1Schristos   }
14784e98e3e1Schristos }
14794e98e3e1Schristos 
14804e98e3e1Schristos   return vpc;
14814e98e3e1Schristos #undef FLD
14824e98e3e1Schristos }
14834e98e3e1Schristos 
14844e98e3e1Schristos /* machi: machi $src1,$src2 */
14854e98e3e1Schristos 
14864e98e3e1Schristos static SEM_PC
14874e98e3e1Schristos SEM_FN_NAME (m32rbf,machi) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
14884e98e3e1Schristos {
14894e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_st_plus.f
14904e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
14914e98e3e1Schristos   int UNUSED written = 0;
14924e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
14934e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
14944e98e3e1Schristos 
14954e98e3e1Schristos   {
14964e98e3e1Schristos     DI opval = SRADI (SLLDI (ADDDI (GET_H_ACCUM (), MULDI (EXTSIDI (ANDSI (* FLD (i_src1), 0xffff0000)), EXTHIDI (TRUNCSIHI (SRASI (* FLD (i_src2), 16))))), 8), 8);
14974e98e3e1Schristos     SET_H_ACCUM (opval);
1498212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "accum", 'D', opval);
14994e98e3e1Schristos   }
15004e98e3e1Schristos 
15014e98e3e1Schristos   return vpc;
15024e98e3e1Schristos #undef FLD
15034e98e3e1Schristos }
15044e98e3e1Schristos 
15054e98e3e1Schristos /* maclo: maclo $src1,$src2 */
15064e98e3e1Schristos 
15074e98e3e1Schristos static SEM_PC
15084e98e3e1Schristos SEM_FN_NAME (m32rbf,maclo) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
15094e98e3e1Schristos {
15104e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_st_plus.f
15114e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
15124e98e3e1Schristos   int UNUSED written = 0;
15134e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
15144e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
15154e98e3e1Schristos 
15164e98e3e1Schristos   {
15174e98e3e1Schristos     DI opval = SRADI (SLLDI (ADDDI (GET_H_ACCUM (), MULDI (EXTSIDI (SLLSI (* FLD (i_src1), 16)), EXTHIDI (TRUNCSIHI (* FLD (i_src2))))), 8), 8);
15184e98e3e1Schristos     SET_H_ACCUM (opval);
1519212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "accum", 'D', opval);
15204e98e3e1Schristos   }
15214e98e3e1Schristos 
15224e98e3e1Schristos   return vpc;
15234e98e3e1Schristos #undef FLD
15244e98e3e1Schristos }
15254e98e3e1Schristos 
15264e98e3e1Schristos /* macwhi: macwhi $src1,$src2 */
15274e98e3e1Schristos 
15284e98e3e1Schristos static SEM_PC
15294e98e3e1Schristos SEM_FN_NAME (m32rbf,macwhi) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
15304e98e3e1Schristos {
15314e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_st_plus.f
15324e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
15334e98e3e1Schristos   int UNUSED written = 0;
15344e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
15354e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
15364e98e3e1Schristos 
15374e98e3e1Schristos   {
15384e98e3e1Schristos     DI opval = SRADI (SLLDI (ADDDI (GET_H_ACCUM (), MULDI (EXTSIDI (* FLD (i_src1)), EXTHIDI (TRUNCSIHI (SRASI (* FLD (i_src2), 16))))), 8), 8);
15394e98e3e1Schristos     SET_H_ACCUM (opval);
1540212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "accum", 'D', opval);
15414e98e3e1Schristos   }
15424e98e3e1Schristos 
15434e98e3e1Schristos   return vpc;
15444e98e3e1Schristos #undef FLD
15454e98e3e1Schristos }
15464e98e3e1Schristos 
15474e98e3e1Schristos /* macwlo: macwlo $src1,$src2 */
15484e98e3e1Schristos 
15494e98e3e1Schristos static SEM_PC
15504e98e3e1Schristos SEM_FN_NAME (m32rbf,macwlo) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
15514e98e3e1Schristos {
15524e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_st_plus.f
15534e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
15544e98e3e1Schristos   int UNUSED written = 0;
15554e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
15564e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
15574e98e3e1Schristos 
15584e98e3e1Schristos   {
15594e98e3e1Schristos     DI opval = SRADI (SLLDI (ADDDI (GET_H_ACCUM (), MULDI (EXTSIDI (* FLD (i_src1)), EXTHIDI (TRUNCSIHI (* FLD (i_src2))))), 8), 8);
15604e98e3e1Schristos     SET_H_ACCUM (opval);
1561212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "accum", 'D', opval);
15624e98e3e1Schristos   }
15634e98e3e1Schristos 
15644e98e3e1Schristos   return vpc;
15654e98e3e1Schristos #undef FLD
15664e98e3e1Schristos }
15674e98e3e1Schristos 
15684e98e3e1Schristos /* mul: mul $dr,$sr */
15694e98e3e1Schristos 
15704e98e3e1Schristos static SEM_PC
15714e98e3e1Schristos SEM_FN_NAME (m32rbf,mul) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
15724e98e3e1Schristos {
15734e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_add.f
15744e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
15754e98e3e1Schristos   int UNUSED written = 0;
15764e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
15774e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
15784e98e3e1Schristos 
15794e98e3e1Schristos   {
15804e98e3e1Schristos     SI opval = MULSI (* FLD (i_dr), * FLD (i_sr));
15814e98e3e1Schristos     * FLD (i_dr) = opval;
1582212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
15834e98e3e1Schristos   }
15844e98e3e1Schristos 
15854e98e3e1Schristos   return vpc;
15864e98e3e1Schristos #undef FLD
15874e98e3e1Schristos }
15884e98e3e1Schristos 
15894e98e3e1Schristos /* mulhi: mulhi $src1,$src2 */
15904e98e3e1Schristos 
15914e98e3e1Schristos static SEM_PC
15924e98e3e1Schristos SEM_FN_NAME (m32rbf,mulhi) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
15934e98e3e1Schristos {
15944e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_st_plus.f
15954e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
15964e98e3e1Schristos   int UNUSED written = 0;
15974e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
15984e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
15994e98e3e1Schristos 
16004e98e3e1Schristos   {
16014e98e3e1Schristos     DI opval = SRADI (SLLDI (MULDI (EXTSIDI (ANDSI (* FLD (i_src1), 0xffff0000)), EXTHIDI (TRUNCSIHI (SRASI (* FLD (i_src2), 16)))), 16), 16);
16024e98e3e1Schristos     SET_H_ACCUM (opval);
1603212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "accum", 'D', opval);
16044e98e3e1Schristos   }
16054e98e3e1Schristos 
16064e98e3e1Schristos   return vpc;
16074e98e3e1Schristos #undef FLD
16084e98e3e1Schristos }
16094e98e3e1Schristos 
16104e98e3e1Schristos /* mullo: mullo $src1,$src2 */
16114e98e3e1Schristos 
16124e98e3e1Schristos static SEM_PC
16134e98e3e1Schristos SEM_FN_NAME (m32rbf,mullo) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
16144e98e3e1Schristos {
16154e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_st_plus.f
16164e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
16174e98e3e1Schristos   int UNUSED written = 0;
16184e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
16194e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
16204e98e3e1Schristos 
16214e98e3e1Schristos   {
16224e98e3e1Schristos     DI opval = SRADI (SLLDI (MULDI (EXTSIDI (SLLSI (* FLD (i_src1), 16)), EXTHIDI (TRUNCSIHI (* FLD (i_src2)))), 16), 16);
16234e98e3e1Schristos     SET_H_ACCUM (opval);
1624212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "accum", 'D', opval);
16254e98e3e1Schristos   }
16264e98e3e1Schristos 
16274e98e3e1Schristos   return vpc;
16284e98e3e1Schristos #undef FLD
16294e98e3e1Schristos }
16304e98e3e1Schristos 
16314e98e3e1Schristos /* mulwhi: mulwhi $src1,$src2 */
16324e98e3e1Schristos 
16334e98e3e1Schristos static SEM_PC
16344e98e3e1Schristos SEM_FN_NAME (m32rbf,mulwhi) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
16354e98e3e1Schristos {
16364e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_st_plus.f
16374e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
16384e98e3e1Schristos   int UNUSED written = 0;
16394e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
16404e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
16414e98e3e1Schristos 
16424e98e3e1Schristos   {
16434e98e3e1Schristos     DI opval = SRADI (SLLDI (MULDI (EXTSIDI (* FLD (i_src1)), EXTHIDI (TRUNCSIHI (SRASI (* FLD (i_src2), 16)))), 8), 8);
16444e98e3e1Schristos     SET_H_ACCUM (opval);
1645212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "accum", 'D', opval);
16464e98e3e1Schristos   }
16474e98e3e1Schristos 
16484e98e3e1Schristos   return vpc;
16494e98e3e1Schristos #undef FLD
16504e98e3e1Schristos }
16514e98e3e1Schristos 
16524e98e3e1Schristos /* mulwlo: mulwlo $src1,$src2 */
16534e98e3e1Schristos 
16544e98e3e1Schristos static SEM_PC
16554e98e3e1Schristos SEM_FN_NAME (m32rbf,mulwlo) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
16564e98e3e1Schristos {
16574e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_st_plus.f
16584e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
16594e98e3e1Schristos   int UNUSED written = 0;
16604e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
16614e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
16624e98e3e1Schristos 
16634e98e3e1Schristos   {
16644e98e3e1Schristos     DI opval = SRADI (SLLDI (MULDI (EXTSIDI (* FLD (i_src1)), EXTHIDI (TRUNCSIHI (* FLD (i_src2)))), 8), 8);
16654e98e3e1Schristos     SET_H_ACCUM (opval);
1666212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "accum", 'D', opval);
16674e98e3e1Schristos   }
16684e98e3e1Schristos 
16694e98e3e1Schristos   return vpc;
16704e98e3e1Schristos #undef FLD
16714e98e3e1Schristos }
16724e98e3e1Schristos 
16734e98e3e1Schristos /* mv: mv $dr,$sr */
16744e98e3e1Schristos 
16754e98e3e1Schristos static SEM_PC
16764e98e3e1Schristos SEM_FN_NAME (m32rbf,mv) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
16774e98e3e1Schristos {
16784e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_ld_plus.f
16794e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
16804e98e3e1Schristos   int UNUSED written = 0;
16814e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
16824e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
16834e98e3e1Schristos 
16844e98e3e1Schristos   {
16854e98e3e1Schristos     SI opval = * FLD (i_sr);
16864e98e3e1Schristos     * FLD (i_dr) = opval;
1687212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
16884e98e3e1Schristos   }
16894e98e3e1Schristos 
16904e98e3e1Schristos   return vpc;
16914e98e3e1Schristos #undef FLD
16924e98e3e1Schristos }
16934e98e3e1Schristos 
16944e98e3e1Schristos /* mvfachi: mvfachi $dr */
16954e98e3e1Schristos 
16964e98e3e1Schristos static SEM_PC
16974e98e3e1Schristos SEM_FN_NAME (m32rbf,mvfachi) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
16984e98e3e1Schristos {
16994e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_seth.f
17004e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
17014e98e3e1Schristos   int UNUSED written = 0;
17024e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
17034e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
17044e98e3e1Schristos 
17054e98e3e1Schristos   {
17064e98e3e1Schristos     SI opval = TRUNCDISI (SRADI (GET_H_ACCUM (), 32));
17074e98e3e1Schristos     * FLD (i_dr) = opval;
1708212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
17094e98e3e1Schristos   }
17104e98e3e1Schristos 
17114e98e3e1Schristos   return vpc;
17124e98e3e1Schristos #undef FLD
17134e98e3e1Schristos }
17144e98e3e1Schristos 
17154e98e3e1Schristos /* mvfaclo: mvfaclo $dr */
17164e98e3e1Schristos 
17174e98e3e1Schristos static SEM_PC
17184e98e3e1Schristos SEM_FN_NAME (m32rbf,mvfaclo) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
17194e98e3e1Schristos {
17204e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_seth.f
17214e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
17224e98e3e1Schristos   int UNUSED written = 0;
17234e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
17244e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
17254e98e3e1Schristos 
17264e98e3e1Schristos   {
17274e98e3e1Schristos     SI opval = TRUNCDISI (GET_H_ACCUM ());
17284e98e3e1Schristos     * FLD (i_dr) = opval;
1729212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
17304e98e3e1Schristos   }
17314e98e3e1Schristos 
17324e98e3e1Schristos   return vpc;
17334e98e3e1Schristos #undef FLD
17344e98e3e1Schristos }
17354e98e3e1Schristos 
17364e98e3e1Schristos /* mvfacmi: mvfacmi $dr */
17374e98e3e1Schristos 
17384e98e3e1Schristos static SEM_PC
17394e98e3e1Schristos SEM_FN_NAME (m32rbf,mvfacmi) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
17404e98e3e1Schristos {
17414e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_seth.f
17424e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
17434e98e3e1Schristos   int UNUSED written = 0;
17444e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
17454e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
17464e98e3e1Schristos 
17474e98e3e1Schristos   {
17484e98e3e1Schristos     SI opval = TRUNCDISI (SRADI (GET_H_ACCUM (), 16));
17494e98e3e1Schristos     * FLD (i_dr) = opval;
1750212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
17514e98e3e1Schristos   }
17524e98e3e1Schristos 
17534e98e3e1Schristos   return vpc;
17544e98e3e1Schristos #undef FLD
17554e98e3e1Schristos }
17564e98e3e1Schristos 
17574e98e3e1Schristos /* mvfc: mvfc $dr,$scr */
17584e98e3e1Schristos 
17594e98e3e1Schristos static SEM_PC
17604e98e3e1Schristos SEM_FN_NAME (m32rbf,mvfc) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
17614e98e3e1Schristos {
17624e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_ld_plus.f
17634e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
17644e98e3e1Schristos   int UNUSED written = 0;
17654e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
17664e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
17674e98e3e1Schristos 
17684e98e3e1Schristos   {
17694e98e3e1Schristos     SI opval = GET_H_CR (FLD (f_r2));
17704e98e3e1Schristos     * FLD (i_dr) = opval;
1771212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
17724e98e3e1Schristos   }
17734e98e3e1Schristos 
17744e98e3e1Schristos   return vpc;
17754e98e3e1Schristos #undef FLD
17764e98e3e1Schristos }
17774e98e3e1Schristos 
17784e98e3e1Schristos /* mvtachi: mvtachi $src1 */
17794e98e3e1Schristos 
17804e98e3e1Schristos static SEM_PC
17814e98e3e1Schristos SEM_FN_NAME (m32rbf,mvtachi) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
17824e98e3e1Schristos {
17834e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_st_plus.f
17844e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
17854e98e3e1Schristos   int UNUSED written = 0;
17864e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
17874e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
17884e98e3e1Schristos 
17894e98e3e1Schristos   {
17904e98e3e1Schristos     DI opval = ORDI (ANDDI (GET_H_ACCUM (), MAKEDI (0, 0xffffffff)), SLLDI (EXTSIDI (* FLD (i_src1)), 32));
17914e98e3e1Schristos     SET_H_ACCUM (opval);
1792212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "accum", 'D', opval);
17934e98e3e1Schristos   }
17944e98e3e1Schristos 
17954e98e3e1Schristos   return vpc;
17964e98e3e1Schristos #undef FLD
17974e98e3e1Schristos }
17984e98e3e1Schristos 
17994e98e3e1Schristos /* mvtaclo: mvtaclo $src1 */
18004e98e3e1Schristos 
18014e98e3e1Schristos static SEM_PC
18024e98e3e1Schristos SEM_FN_NAME (m32rbf,mvtaclo) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
18034e98e3e1Schristos {
18044e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_st_plus.f
18054e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
18064e98e3e1Schristos   int UNUSED written = 0;
18074e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
18084e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
18094e98e3e1Schristos 
18104e98e3e1Schristos   {
18114e98e3e1Schristos     DI opval = ORDI (ANDDI (GET_H_ACCUM (), MAKEDI (0xffffffff, 0)), ZEXTSIDI (* FLD (i_src1)));
18124e98e3e1Schristos     SET_H_ACCUM (opval);
1813212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "accum", 'D', opval);
18144e98e3e1Schristos   }
18154e98e3e1Schristos 
18164e98e3e1Schristos   return vpc;
18174e98e3e1Schristos #undef FLD
18184e98e3e1Schristos }
18194e98e3e1Schristos 
18204e98e3e1Schristos /* mvtc: mvtc $sr,$dcr */
18214e98e3e1Schristos 
18224e98e3e1Schristos static SEM_PC
18234e98e3e1Schristos SEM_FN_NAME (m32rbf,mvtc) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
18244e98e3e1Schristos {
18254e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_ld_plus.f
18264e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
18274e98e3e1Schristos   int UNUSED written = 0;
18284e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
18294e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
18304e98e3e1Schristos 
18314e98e3e1Schristos   {
18324e98e3e1Schristos     USI opval = * FLD (i_sr);
18334e98e3e1Schristos     SET_H_CR (FLD (f_r1), opval);
1834212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "cr", 'x', opval);
18354e98e3e1Schristos   }
18364e98e3e1Schristos 
18374e98e3e1Schristos   return vpc;
18384e98e3e1Schristos #undef FLD
18394e98e3e1Schristos }
18404e98e3e1Schristos 
18414e98e3e1Schristos /* neg: neg $dr,$sr */
18424e98e3e1Schristos 
18434e98e3e1Schristos static SEM_PC
18444e98e3e1Schristos SEM_FN_NAME (m32rbf,neg) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
18454e98e3e1Schristos {
18464e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_ld_plus.f
18474e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
18484e98e3e1Schristos   int UNUSED written = 0;
18494e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
18504e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
18514e98e3e1Schristos 
18524e98e3e1Schristos   {
18534e98e3e1Schristos     SI opval = NEGSI (* FLD (i_sr));
18544e98e3e1Schristos     * FLD (i_dr) = opval;
1855212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
18564e98e3e1Schristos   }
18574e98e3e1Schristos 
18584e98e3e1Schristos   return vpc;
18594e98e3e1Schristos #undef FLD
18604e98e3e1Schristos }
18614e98e3e1Schristos 
18624e98e3e1Schristos /* nop: nop */
18634e98e3e1Schristos 
18644e98e3e1Schristos static SEM_PC
18654e98e3e1Schristos SEM_FN_NAME (m32rbf,nop) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
18664e98e3e1Schristos {
18674e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_empty.f
18684e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
18694e98e3e1Schristos   int UNUSED written = 0;
18704e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
18714e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
18724e98e3e1Schristos 
18734e98e3e1Schristos PROFILE_COUNT_FILLNOPS (current_cpu, abuf->addr);
18744e98e3e1Schristos 
18754e98e3e1Schristos   return vpc;
18764e98e3e1Schristos #undef FLD
18774e98e3e1Schristos }
18784e98e3e1Schristos 
18794e98e3e1Schristos /* not: not $dr,$sr */
18804e98e3e1Schristos 
18814e98e3e1Schristos static SEM_PC
18824e98e3e1Schristos SEM_FN_NAME (m32rbf,not) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
18834e98e3e1Schristos {
18844e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_ld_plus.f
18854e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
18864e98e3e1Schristos   int UNUSED written = 0;
18874e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
18884e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
18894e98e3e1Schristos 
18904e98e3e1Schristos   {
18914e98e3e1Schristos     SI opval = INVSI (* FLD (i_sr));
18924e98e3e1Schristos     * FLD (i_dr) = opval;
1893212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
18944e98e3e1Schristos   }
18954e98e3e1Schristos 
18964e98e3e1Schristos   return vpc;
18974e98e3e1Schristos #undef FLD
18984e98e3e1Schristos }
18994e98e3e1Schristos 
19004e98e3e1Schristos /* rac: rac */
19014e98e3e1Schristos 
19024e98e3e1Schristos static SEM_PC
19034e98e3e1Schristos SEM_FN_NAME (m32rbf,rac) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
19044e98e3e1Schristos {
19054e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_empty.f
19064e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
19074e98e3e1Schristos   int UNUSED written = 0;
19084e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
19094e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
19104e98e3e1Schristos 
19114e98e3e1Schristos {
19124e98e3e1Schristos   DI tmp_tmp1;
19134e98e3e1Schristos   tmp_tmp1 = SLLDI (GET_H_ACCUM (), 1);
19144e98e3e1Schristos   tmp_tmp1 = ADDDI (tmp_tmp1, MAKEDI (0, 32768));
19154e98e3e1Schristos   {
19164e98e3e1Schristos     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)));
19174e98e3e1Schristos     SET_H_ACCUM (opval);
1918212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "accum", 'D', opval);
19194e98e3e1Schristos   }
19204e98e3e1Schristos }
19214e98e3e1Schristos 
19224e98e3e1Schristos   return vpc;
19234e98e3e1Schristos #undef FLD
19244e98e3e1Schristos }
19254e98e3e1Schristos 
19264e98e3e1Schristos /* rach: rach */
19274e98e3e1Schristos 
19284e98e3e1Schristos static SEM_PC
19294e98e3e1Schristos SEM_FN_NAME (m32rbf,rach) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
19304e98e3e1Schristos {
19314e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_empty.f
19324e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
19334e98e3e1Schristos   int UNUSED written = 0;
19344e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
19354e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
19364e98e3e1Schristos 
19374e98e3e1Schristos {
19384e98e3e1Schristos   DI tmp_tmp1;
19394e98e3e1Schristos   tmp_tmp1 = ANDDI (GET_H_ACCUM (), MAKEDI (16777215, 0xffffffff));
19404e98e3e1Schristos if (ANDIF (GEDI (tmp_tmp1, MAKEDI (16383, 0x80000000)), LEDI (tmp_tmp1, MAKEDI (8388607, 0xffffffff)))) {
19414e98e3e1Schristos   tmp_tmp1 = MAKEDI (16383, 0x80000000);
19424e98e3e1Schristos } else {
19434e98e3e1Schristos if (ANDIF (GEDI (tmp_tmp1, MAKEDI (8388608, 0)), LEDI (tmp_tmp1, MAKEDI (16760832, 0)))) {
19444e98e3e1Schristos   tmp_tmp1 = MAKEDI (16760832, 0);
19454e98e3e1Schristos } else {
19464e98e3e1Schristos   tmp_tmp1 = ANDDI (ADDDI (GET_H_ACCUM (), MAKEDI (0, 1073741824)), MAKEDI (0xffffffff, 0x80000000));
19474e98e3e1Schristos }
19484e98e3e1Schristos }
19494e98e3e1Schristos   tmp_tmp1 = SLLDI (tmp_tmp1, 1);
19504e98e3e1Schristos   {
19514e98e3e1Schristos     DI opval = SRADI (SLLDI (tmp_tmp1, 7), 7);
19524e98e3e1Schristos     SET_H_ACCUM (opval);
1953212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "accum", 'D', opval);
19544e98e3e1Schristos   }
19554e98e3e1Schristos }
19564e98e3e1Schristos 
19574e98e3e1Schristos   return vpc;
19584e98e3e1Schristos #undef FLD
19594e98e3e1Schristos }
19604e98e3e1Schristos 
19614e98e3e1Schristos /* rte: rte */
19624e98e3e1Schristos 
19634e98e3e1Schristos static SEM_PC
19644e98e3e1Schristos SEM_FN_NAME (m32rbf,rte) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
19654e98e3e1Schristos {
19664e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_empty.f
19674e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
19684e98e3e1Schristos   int UNUSED written = 0;
19694e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
19704e98e3e1Schristos   SEM_BRANCH_INIT
19714e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
19724e98e3e1Schristos 
19734e98e3e1Schristos {
19744e98e3e1Schristos   {
19754e98e3e1Schristos     USI opval = ANDSI (GET_H_CR (((UINT) 6)), -4);
19764e98e3e1Schristos     SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
1977212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
19784e98e3e1Schristos   }
19794e98e3e1Schristos   {
19804e98e3e1Schristos     USI opval = GET_H_CR (((UINT) 14));
19814e98e3e1Schristos     SET_H_CR (((UINT) 6), opval);
1982212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "cr", 'x', opval);
19834e98e3e1Schristos   }
19844e98e3e1Schristos   {
19854e98e3e1Schristos     UQI opval = CPU (h_bpsw);
19864e98e3e1Schristos     SET_H_PSW (opval);
1987212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "psw", 'x', opval);
19884e98e3e1Schristos   }
19894e98e3e1Schristos   {
19904e98e3e1Schristos     UQI opval = CPU (h_bbpsw);
19914e98e3e1Schristos     CPU (h_bpsw) = opval;
1992212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "bpsw", 'x', opval);
19934e98e3e1Schristos   }
19944e98e3e1Schristos }
19954e98e3e1Schristos 
19964e98e3e1Schristos   SEM_BRANCH_FINI (vpc);
19974e98e3e1Schristos   return vpc;
19984e98e3e1Schristos #undef FLD
19994e98e3e1Schristos }
20004e98e3e1Schristos 
20014e98e3e1Schristos /* seth: seth $dr,$hash$hi16 */
20024e98e3e1Schristos 
20034e98e3e1Schristos static SEM_PC
20044e98e3e1Schristos SEM_FN_NAME (m32rbf,seth) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
20054e98e3e1Schristos {
20064e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_seth.f
20074e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
20084e98e3e1Schristos   int UNUSED written = 0;
20094e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
20104e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
20114e98e3e1Schristos 
20124e98e3e1Schristos   {
20134e98e3e1Schristos     SI opval = SLLSI (FLD (f_hi16), 16);
20144e98e3e1Schristos     * FLD (i_dr) = opval;
2015212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
20164e98e3e1Schristos   }
20174e98e3e1Schristos 
20184e98e3e1Schristos   return vpc;
20194e98e3e1Schristos #undef FLD
20204e98e3e1Schristos }
20214e98e3e1Schristos 
20224e98e3e1Schristos /* sll: sll $dr,$sr */
20234e98e3e1Schristos 
20244e98e3e1Schristos static SEM_PC
20254e98e3e1Schristos SEM_FN_NAME (m32rbf,sll) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
20264e98e3e1Schristos {
20274e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_add.f
20284e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
20294e98e3e1Schristos   int UNUSED written = 0;
20304e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
20314e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
20324e98e3e1Schristos 
20334e98e3e1Schristos   {
20344e98e3e1Schristos     SI opval = SLLSI (* FLD (i_dr), ANDSI (* FLD (i_sr), 31));
20354e98e3e1Schristos     * FLD (i_dr) = opval;
2036212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
20374e98e3e1Schristos   }
20384e98e3e1Schristos 
20394e98e3e1Schristos   return vpc;
20404e98e3e1Schristos #undef FLD
20414e98e3e1Schristos }
20424e98e3e1Schristos 
20434e98e3e1Schristos /* sll3: sll3 $dr,$sr,$simm16 */
20444e98e3e1Schristos 
20454e98e3e1Schristos static SEM_PC
20464e98e3e1Schristos SEM_FN_NAME (m32rbf,sll3) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
20474e98e3e1Schristos {
20484e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_add3.f
20494e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
20504e98e3e1Schristos   int UNUSED written = 0;
20514e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
20524e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
20534e98e3e1Schristos 
20544e98e3e1Schristos   {
20554e98e3e1Schristos     SI opval = SLLSI (* FLD (i_sr), ANDSI (FLD (f_simm16), 31));
20564e98e3e1Schristos     * FLD (i_dr) = opval;
2057212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
20584e98e3e1Schristos   }
20594e98e3e1Schristos 
20604e98e3e1Schristos   return vpc;
20614e98e3e1Schristos #undef FLD
20624e98e3e1Schristos }
20634e98e3e1Schristos 
20644e98e3e1Schristos /* slli: slli $dr,$uimm5 */
20654e98e3e1Schristos 
20664e98e3e1Schristos static SEM_PC
20674e98e3e1Schristos SEM_FN_NAME (m32rbf,slli) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
20684e98e3e1Schristos {
20694e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_slli.f
20704e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
20714e98e3e1Schristos   int UNUSED written = 0;
20724e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
20734e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
20744e98e3e1Schristos 
20754e98e3e1Schristos   {
20764e98e3e1Schristos     SI opval = SLLSI (* FLD (i_dr), FLD (f_uimm5));
20774e98e3e1Schristos     * FLD (i_dr) = opval;
2078212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
20794e98e3e1Schristos   }
20804e98e3e1Schristos 
20814e98e3e1Schristos   return vpc;
20824e98e3e1Schristos #undef FLD
20834e98e3e1Schristos }
20844e98e3e1Schristos 
20854e98e3e1Schristos /* sra: sra $dr,$sr */
20864e98e3e1Schristos 
20874e98e3e1Schristos static SEM_PC
20884e98e3e1Schristos SEM_FN_NAME (m32rbf,sra) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
20894e98e3e1Schristos {
20904e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_add.f
20914e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
20924e98e3e1Schristos   int UNUSED written = 0;
20934e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
20944e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
20954e98e3e1Schristos 
20964e98e3e1Schristos   {
20974e98e3e1Schristos     SI opval = SRASI (* FLD (i_dr), ANDSI (* FLD (i_sr), 31));
20984e98e3e1Schristos     * FLD (i_dr) = opval;
2099212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
21004e98e3e1Schristos   }
21014e98e3e1Schristos 
21024e98e3e1Schristos   return vpc;
21034e98e3e1Schristos #undef FLD
21044e98e3e1Schristos }
21054e98e3e1Schristos 
21064e98e3e1Schristos /* sra3: sra3 $dr,$sr,$simm16 */
21074e98e3e1Schristos 
21084e98e3e1Schristos static SEM_PC
21094e98e3e1Schristos SEM_FN_NAME (m32rbf,sra3) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
21104e98e3e1Schristos {
21114e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_add3.f
21124e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
21134e98e3e1Schristos   int UNUSED written = 0;
21144e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
21154e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
21164e98e3e1Schristos 
21174e98e3e1Schristos   {
21184e98e3e1Schristos     SI opval = SRASI (* FLD (i_sr), ANDSI (FLD (f_simm16), 31));
21194e98e3e1Schristos     * FLD (i_dr) = opval;
2120212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
21214e98e3e1Schristos   }
21224e98e3e1Schristos 
21234e98e3e1Schristos   return vpc;
21244e98e3e1Schristos #undef FLD
21254e98e3e1Schristos }
21264e98e3e1Schristos 
21274e98e3e1Schristos /* srai: srai $dr,$uimm5 */
21284e98e3e1Schristos 
21294e98e3e1Schristos static SEM_PC
21304e98e3e1Schristos SEM_FN_NAME (m32rbf,srai) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
21314e98e3e1Schristos {
21324e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_slli.f
21334e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
21344e98e3e1Schristos   int UNUSED written = 0;
21354e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
21364e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
21374e98e3e1Schristos 
21384e98e3e1Schristos   {
21394e98e3e1Schristos     SI opval = SRASI (* FLD (i_dr), FLD (f_uimm5));
21404e98e3e1Schristos     * FLD (i_dr) = opval;
2141212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
21424e98e3e1Schristos   }
21434e98e3e1Schristos 
21444e98e3e1Schristos   return vpc;
21454e98e3e1Schristos #undef FLD
21464e98e3e1Schristos }
21474e98e3e1Schristos 
21484e98e3e1Schristos /* srl: srl $dr,$sr */
21494e98e3e1Schristos 
21504e98e3e1Schristos static SEM_PC
21514e98e3e1Schristos SEM_FN_NAME (m32rbf,srl) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
21524e98e3e1Schristos {
21534e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_add.f
21544e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
21554e98e3e1Schristos   int UNUSED written = 0;
21564e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
21574e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
21584e98e3e1Schristos 
21594e98e3e1Schristos   {
21604e98e3e1Schristos     SI opval = SRLSI (* FLD (i_dr), ANDSI (* FLD (i_sr), 31));
21614e98e3e1Schristos     * FLD (i_dr) = opval;
2162212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
21634e98e3e1Schristos   }
21644e98e3e1Schristos 
21654e98e3e1Schristos   return vpc;
21664e98e3e1Schristos #undef FLD
21674e98e3e1Schristos }
21684e98e3e1Schristos 
21694e98e3e1Schristos /* srl3: srl3 $dr,$sr,$simm16 */
21704e98e3e1Schristos 
21714e98e3e1Schristos static SEM_PC
21724e98e3e1Schristos SEM_FN_NAME (m32rbf,srl3) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
21734e98e3e1Schristos {
21744e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_add3.f
21754e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
21764e98e3e1Schristos   int UNUSED written = 0;
21774e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
21784e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
21794e98e3e1Schristos 
21804e98e3e1Schristos   {
21814e98e3e1Schristos     SI opval = SRLSI (* FLD (i_sr), ANDSI (FLD (f_simm16), 31));
21824e98e3e1Schristos     * FLD (i_dr) = opval;
2183212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
21844e98e3e1Schristos   }
21854e98e3e1Schristos 
21864e98e3e1Schristos   return vpc;
21874e98e3e1Schristos #undef FLD
21884e98e3e1Schristos }
21894e98e3e1Schristos 
21904e98e3e1Schristos /* srli: srli $dr,$uimm5 */
21914e98e3e1Schristos 
21924e98e3e1Schristos static SEM_PC
21934e98e3e1Schristos SEM_FN_NAME (m32rbf,srli) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
21944e98e3e1Schristos {
21954e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_slli.f
21964e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
21974e98e3e1Schristos   int UNUSED written = 0;
21984e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
21994e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
22004e98e3e1Schristos 
22014e98e3e1Schristos   {
22024e98e3e1Schristos     SI opval = SRLSI (* FLD (i_dr), FLD (f_uimm5));
22034e98e3e1Schristos     * FLD (i_dr) = opval;
2204212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
22054e98e3e1Schristos   }
22064e98e3e1Schristos 
22074e98e3e1Schristos   return vpc;
22084e98e3e1Schristos #undef FLD
22094e98e3e1Schristos }
22104e98e3e1Schristos 
22114e98e3e1Schristos /* st: st $src1,@$src2 */
22124e98e3e1Schristos 
22134e98e3e1Schristos static SEM_PC
22144e98e3e1Schristos SEM_FN_NAME (m32rbf,st) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
22154e98e3e1Schristos {
22164e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_st_plus.f
22174e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
22184e98e3e1Schristos   int UNUSED written = 0;
22194e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
22204e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
22214e98e3e1Schristos 
22224e98e3e1Schristos   {
22234e98e3e1Schristos     SI opval = * FLD (i_src1);
22244e98e3e1Schristos     SETMEMSI (current_cpu, pc, * FLD (i_src2), opval);
2225212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
22264e98e3e1Schristos   }
22274e98e3e1Schristos 
22284e98e3e1Schristos   return vpc;
22294e98e3e1Schristos #undef FLD
22304e98e3e1Schristos }
22314e98e3e1Schristos 
22324e98e3e1Schristos /* st-d: st $src1,@($slo16,$src2) */
22334e98e3e1Schristos 
22344e98e3e1Schristos static SEM_PC
22354e98e3e1Schristos SEM_FN_NAME (m32rbf,st_d) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
22364e98e3e1Schristos {
22374e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_st_d.f
22384e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
22394e98e3e1Schristos   int UNUSED written = 0;
22404e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
22414e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
22424e98e3e1Schristos 
22434e98e3e1Schristos   {
22444e98e3e1Schristos     SI opval = * FLD (i_src1);
22454e98e3e1Schristos     SETMEMSI (current_cpu, pc, ADDSI (* FLD (i_src2), FLD (f_simm16)), opval);
2246212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
22474e98e3e1Schristos   }
22484e98e3e1Schristos 
22494e98e3e1Schristos   return vpc;
22504e98e3e1Schristos #undef FLD
22514e98e3e1Schristos }
22524e98e3e1Schristos 
22534e98e3e1Schristos /* stb: stb $src1,@$src2 */
22544e98e3e1Schristos 
22554e98e3e1Schristos static SEM_PC
22564e98e3e1Schristos SEM_FN_NAME (m32rbf,stb) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
22574e98e3e1Schristos {
22584e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_st_plus.f
22594e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
22604e98e3e1Schristos   int UNUSED written = 0;
22614e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
22624e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
22634e98e3e1Schristos 
22644e98e3e1Schristos   {
22654e98e3e1Schristos     QI opval = * FLD (i_src1);
22664e98e3e1Schristos     SETMEMQI (current_cpu, pc, * FLD (i_src2), opval);
2267212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
22684e98e3e1Schristos   }
22694e98e3e1Schristos 
22704e98e3e1Schristos   return vpc;
22714e98e3e1Schristos #undef FLD
22724e98e3e1Schristos }
22734e98e3e1Schristos 
22744e98e3e1Schristos /* stb-d: stb $src1,@($slo16,$src2) */
22754e98e3e1Schristos 
22764e98e3e1Schristos static SEM_PC
22774e98e3e1Schristos SEM_FN_NAME (m32rbf,stb_d) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
22784e98e3e1Schristos {
22794e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_st_d.f
22804e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
22814e98e3e1Schristos   int UNUSED written = 0;
22824e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
22834e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
22844e98e3e1Schristos 
22854e98e3e1Schristos   {
22864e98e3e1Schristos     QI opval = * FLD (i_src1);
22874e98e3e1Schristos     SETMEMQI (current_cpu, pc, ADDSI (* FLD (i_src2), FLD (f_simm16)), opval);
2288212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
22894e98e3e1Schristos   }
22904e98e3e1Schristos 
22914e98e3e1Schristos   return vpc;
22924e98e3e1Schristos #undef FLD
22934e98e3e1Schristos }
22944e98e3e1Schristos 
22954e98e3e1Schristos /* sth: sth $src1,@$src2 */
22964e98e3e1Schristos 
22974e98e3e1Schristos static SEM_PC
22984e98e3e1Schristos SEM_FN_NAME (m32rbf,sth) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
22994e98e3e1Schristos {
23004e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_st_plus.f
23014e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
23024e98e3e1Schristos   int UNUSED written = 0;
23034e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
23044e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
23054e98e3e1Schristos 
23064e98e3e1Schristos   {
23074e98e3e1Schristos     HI opval = * FLD (i_src1);
23084e98e3e1Schristos     SETMEMHI (current_cpu, pc, * FLD (i_src2), opval);
2309212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
23104e98e3e1Schristos   }
23114e98e3e1Schristos 
23124e98e3e1Schristos   return vpc;
23134e98e3e1Schristos #undef FLD
23144e98e3e1Schristos }
23154e98e3e1Schristos 
23164e98e3e1Schristos /* sth-d: sth $src1,@($slo16,$src2) */
23174e98e3e1Schristos 
23184e98e3e1Schristos static SEM_PC
23194e98e3e1Schristos SEM_FN_NAME (m32rbf,sth_d) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
23204e98e3e1Schristos {
23214e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_st_d.f
23224e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
23234e98e3e1Schristos   int UNUSED written = 0;
23244e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
23254e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
23264e98e3e1Schristos 
23274e98e3e1Schristos   {
23284e98e3e1Schristos     HI opval = * FLD (i_src1);
23294e98e3e1Schristos     SETMEMHI (current_cpu, pc, ADDSI (* FLD (i_src2), FLD (f_simm16)), opval);
2330212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
23314e98e3e1Schristos   }
23324e98e3e1Schristos 
23334e98e3e1Schristos   return vpc;
23344e98e3e1Schristos #undef FLD
23354e98e3e1Schristos }
23364e98e3e1Schristos 
23374e98e3e1Schristos /* st-plus: st $src1,@+$src2 */
23384e98e3e1Schristos 
23394e98e3e1Schristos static SEM_PC
23404e98e3e1Schristos SEM_FN_NAME (m32rbf,st_plus) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
23414e98e3e1Schristos {
23424e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_st_plus.f
23434e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
23444e98e3e1Schristos   int UNUSED written = 0;
23454e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
23464e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
23474e98e3e1Schristos 
23484e98e3e1Schristos {
23494e98e3e1Schristos   SI tmp_new_src2;
23504e98e3e1Schristos   tmp_new_src2 = ADDSI (* FLD (i_src2), 4);
23514e98e3e1Schristos   {
23524e98e3e1Schristos     SI opval = * FLD (i_src1);
23534e98e3e1Schristos     SETMEMSI (current_cpu, pc, tmp_new_src2, opval);
2354212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
23554e98e3e1Schristos   }
23564e98e3e1Schristos   {
23574e98e3e1Schristos     SI opval = tmp_new_src2;
23584e98e3e1Schristos     * FLD (i_src2) = opval;
2359212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
23604e98e3e1Schristos   }
23614e98e3e1Schristos }
23624e98e3e1Schristos 
23634e98e3e1Schristos   return vpc;
23644e98e3e1Schristos #undef FLD
23654e98e3e1Schristos }
23664e98e3e1Schristos 
23674e98e3e1Schristos /* st-minus: st $src1,@-$src2 */
23684e98e3e1Schristos 
23694e98e3e1Schristos static SEM_PC
23704e98e3e1Schristos SEM_FN_NAME (m32rbf,st_minus) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
23714e98e3e1Schristos {
23724e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_st_plus.f
23734e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
23744e98e3e1Schristos   int UNUSED written = 0;
23754e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
23764e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
23774e98e3e1Schristos 
23784e98e3e1Schristos {
23794e98e3e1Schristos   SI tmp_new_src2;
23804e98e3e1Schristos   tmp_new_src2 = SUBSI (* FLD (i_src2), 4);
23814e98e3e1Schristos   {
23824e98e3e1Schristos     SI opval = * FLD (i_src1);
23834e98e3e1Schristos     SETMEMSI (current_cpu, pc, tmp_new_src2, opval);
2384212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
23854e98e3e1Schristos   }
23864e98e3e1Schristos   {
23874e98e3e1Schristos     SI opval = tmp_new_src2;
23884e98e3e1Schristos     * FLD (i_src2) = opval;
2389212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
23904e98e3e1Schristos   }
23914e98e3e1Schristos }
23924e98e3e1Schristos 
23934e98e3e1Schristos   return vpc;
23944e98e3e1Schristos #undef FLD
23954e98e3e1Schristos }
23964e98e3e1Schristos 
23974e98e3e1Schristos /* sub: sub $dr,$sr */
23984e98e3e1Schristos 
23994e98e3e1Schristos static SEM_PC
24004e98e3e1Schristos SEM_FN_NAME (m32rbf,sub) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
24014e98e3e1Schristos {
24024e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_add.f
24034e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
24044e98e3e1Schristos   int UNUSED written = 0;
24054e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
24064e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
24074e98e3e1Schristos 
24084e98e3e1Schristos   {
24094e98e3e1Schristos     SI opval = SUBSI (* FLD (i_dr), * FLD (i_sr));
24104e98e3e1Schristos     * FLD (i_dr) = opval;
2411212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
24124e98e3e1Schristos   }
24134e98e3e1Schristos 
24144e98e3e1Schristos   return vpc;
24154e98e3e1Schristos #undef FLD
24164e98e3e1Schristos }
24174e98e3e1Schristos 
24184e98e3e1Schristos /* subv: subv $dr,$sr */
24194e98e3e1Schristos 
24204e98e3e1Schristos static SEM_PC
24214e98e3e1Schristos SEM_FN_NAME (m32rbf,subv) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
24224e98e3e1Schristos {
24234e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_add.f
24244e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
24254e98e3e1Schristos   int UNUSED written = 0;
24264e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
24274e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
24284e98e3e1Schristos 
24294e98e3e1Schristos {
24304e98e3e1Schristos   SI temp0;BI temp1;
24314e98e3e1Schristos   temp0 = SUBSI (* FLD (i_dr), * FLD (i_sr));
24324e98e3e1Schristos   temp1 = SUBOFSI (* FLD (i_dr), * FLD (i_sr), 0);
24334e98e3e1Schristos   {
24344e98e3e1Schristos     SI opval = temp0;
24354e98e3e1Schristos     * FLD (i_dr) = opval;
2436212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
24374e98e3e1Schristos   }
24384e98e3e1Schristos   {
24394e98e3e1Schristos     BI opval = temp1;
24404e98e3e1Schristos     CPU (h_cond) = opval;
2441212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
24424e98e3e1Schristos   }
24434e98e3e1Schristos }
24444e98e3e1Schristos 
24454e98e3e1Schristos   return vpc;
24464e98e3e1Schristos #undef FLD
24474e98e3e1Schristos }
24484e98e3e1Schristos 
24494e98e3e1Schristos /* subx: subx $dr,$sr */
24504e98e3e1Schristos 
24514e98e3e1Schristos static SEM_PC
24524e98e3e1Schristos SEM_FN_NAME (m32rbf,subx) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
24534e98e3e1Schristos {
24544e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_add.f
24554e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
24564e98e3e1Schristos   int UNUSED written = 0;
24574e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
24584e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
24594e98e3e1Schristos 
24604e98e3e1Schristos {
24614e98e3e1Schristos   SI temp0;BI temp1;
24624e98e3e1Schristos   temp0 = SUBCSI (* FLD (i_dr), * FLD (i_sr), CPU (h_cond));
24634e98e3e1Schristos   temp1 = SUBCFSI (* FLD (i_dr), * FLD (i_sr), CPU (h_cond));
24644e98e3e1Schristos   {
24654e98e3e1Schristos     SI opval = temp0;
24664e98e3e1Schristos     * FLD (i_dr) = opval;
2467212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
24684e98e3e1Schristos   }
24694e98e3e1Schristos   {
24704e98e3e1Schristos     BI opval = temp1;
24714e98e3e1Schristos     CPU (h_cond) = opval;
2472212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
24734e98e3e1Schristos   }
24744e98e3e1Schristos }
24754e98e3e1Schristos 
24764e98e3e1Schristos   return vpc;
24774e98e3e1Schristos #undef FLD
24784e98e3e1Schristos }
24794e98e3e1Schristos 
24804e98e3e1Schristos /* trap: trap $uimm4 */
24814e98e3e1Schristos 
24824e98e3e1Schristos static SEM_PC
24834e98e3e1Schristos SEM_FN_NAME (m32rbf,trap) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
24844e98e3e1Schristos {
24854e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_trap.f
24864e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
24874e98e3e1Schristos   int UNUSED written = 0;
24884e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
24894e98e3e1Schristos   SEM_BRANCH_INIT
24904e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
24914e98e3e1Schristos 
24924e98e3e1Schristos {
24934e98e3e1Schristos   {
24944e98e3e1Schristos     USI opval = GET_H_CR (((UINT) 6));
24954e98e3e1Schristos     SET_H_CR (((UINT) 14), opval);
2496212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "cr", 'x', opval);
24974e98e3e1Schristos   }
24984e98e3e1Schristos   {
24994e98e3e1Schristos     USI opval = ADDSI (pc, 4);
25004e98e3e1Schristos     SET_H_CR (((UINT) 6), opval);
2501212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "cr", 'x', opval);
25024e98e3e1Schristos   }
25034e98e3e1Schristos   {
25044e98e3e1Schristos     UQI opval = CPU (h_bpsw);
25054e98e3e1Schristos     CPU (h_bbpsw) = opval;
2506212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "bbpsw", 'x', opval);
25074e98e3e1Schristos   }
25084e98e3e1Schristos   {
25094e98e3e1Schristos     UQI opval = GET_H_PSW ();
25104e98e3e1Schristos     CPU (h_bpsw) = opval;
2511212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "bpsw", 'x', opval);
25124e98e3e1Schristos   }
25134e98e3e1Schristos   {
25144e98e3e1Schristos     UQI opval = ANDQI (GET_H_PSW (), 128);
25154e98e3e1Schristos     SET_H_PSW (opval);
2516212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "psw", 'x', opval);
25174e98e3e1Schristos   }
25184e98e3e1Schristos   {
25194e98e3e1Schristos     SI opval = m32r_trap (current_cpu, pc, FLD (f_uimm4));
25204e98e3e1Schristos     SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
2521212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
25224e98e3e1Schristos   }
25234e98e3e1Schristos }
25244e98e3e1Schristos 
25254e98e3e1Schristos   SEM_BRANCH_FINI (vpc);
25264e98e3e1Schristos   return vpc;
25274e98e3e1Schristos #undef FLD
25284e98e3e1Schristos }
25294e98e3e1Schristos 
25304e98e3e1Schristos /* unlock: unlock $src1,@$src2 */
25314e98e3e1Schristos 
25324e98e3e1Schristos static SEM_PC
25334e98e3e1Schristos SEM_FN_NAME (m32rbf,unlock) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
25344e98e3e1Schristos {
25354e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_st_plus.f
25364e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
25374e98e3e1Schristos   int UNUSED written = 0;
25384e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
25394e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
25404e98e3e1Schristos 
25414e98e3e1Schristos {
25424e98e3e1Schristos if (CPU (h_lock)) {
25434e98e3e1Schristos   {
25444e98e3e1Schristos     SI opval = * FLD (i_src1);
25454e98e3e1Schristos     SETMEMSI (current_cpu, pc, * FLD (i_src2), opval);
25464e98e3e1Schristos     written |= (1 << 4);
2547212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
25484e98e3e1Schristos   }
25494e98e3e1Schristos }
25504e98e3e1Schristos   {
25514e98e3e1Schristos     BI opval = 0;
25524e98e3e1Schristos     CPU (h_lock) = opval;
2553212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "lock", 'x', opval);
25544e98e3e1Schristos   }
25554e98e3e1Schristos }
25564e98e3e1Schristos 
25574e98e3e1Schristos   abuf->written = written;
25584e98e3e1Schristos   return vpc;
25594e98e3e1Schristos #undef FLD
25604e98e3e1Schristos }
25614e98e3e1Schristos 
25624e98e3e1Schristos /* clrpsw: clrpsw $uimm8 */
25634e98e3e1Schristos 
25644e98e3e1Schristos static SEM_PC
25654e98e3e1Schristos SEM_FN_NAME (m32rbf,clrpsw) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
25664e98e3e1Schristos {
25674e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_clrpsw.f
25684e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
25694e98e3e1Schristos   int UNUSED written = 0;
25704e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
25714e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
25724e98e3e1Schristos 
25734e98e3e1Schristos   {
25744e98e3e1Schristos     USI opval = ANDSI (GET_H_CR (((UINT) 0)), ORSI (ZEXTQISI (INVQI (FLD (f_uimm8))), 65280));
25754e98e3e1Schristos     SET_H_CR (((UINT) 0), opval);
2576212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "cr", 'x', opval);
25774e98e3e1Schristos   }
25784e98e3e1Schristos 
25794e98e3e1Schristos   return vpc;
25804e98e3e1Schristos #undef FLD
25814e98e3e1Schristos }
25824e98e3e1Schristos 
25834e98e3e1Schristos /* setpsw: setpsw $uimm8 */
25844e98e3e1Schristos 
25854e98e3e1Schristos static SEM_PC
25864e98e3e1Schristos SEM_FN_NAME (m32rbf,setpsw) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
25874e98e3e1Schristos {
25884e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_clrpsw.f
25894e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
25904e98e3e1Schristos   int UNUSED written = 0;
25914e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
25924e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
25934e98e3e1Schristos 
25944e98e3e1Schristos   {
25954e98e3e1Schristos     USI opval = FLD (f_uimm8);
25964e98e3e1Schristos     SET_H_CR (((UINT) 0), opval);
2597212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "cr", 'x', opval);
25984e98e3e1Schristos   }
25994e98e3e1Schristos 
26004e98e3e1Schristos   return vpc;
26014e98e3e1Schristos #undef FLD
26024e98e3e1Schristos }
26034e98e3e1Schristos 
26044e98e3e1Schristos /* bset: bset $uimm3,@($slo16,$sr) */
26054e98e3e1Schristos 
26064e98e3e1Schristos static SEM_PC
26074e98e3e1Schristos SEM_FN_NAME (m32rbf,bset) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
26084e98e3e1Schristos {
26094e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_bset.f
26104e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
26114e98e3e1Schristos   int UNUSED written = 0;
26124e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
26134e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
26144e98e3e1Schristos 
26154e98e3e1Schristos   {
26164e98e3e1Schristos     QI opval = ORQI (GETMEMQI (current_cpu, pc, ADDSI (* FLD (i_sr), FLD (f_simm16))), SLLQI (1, SUBSI (7, FLD (f_uimm3))));
26174e98e3e1Schristos     SETMEMQI (current_cpu, pc, ADDSI (* FLD (i_sr), FLD (f_simm16)), opval);
2618212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
26194e98e3e1Schristos   }
26204e98e3e1Schristos 
26214e98e3e1Schristos   return vpc;
26224e98e3e1Schristos #undef FLD
26234e98e3e1Schristos }
26244e98e3e1Schristos 
26254e98e3e1Schristos /* bclr: bclr $uimm3,@($slo16,$sr) */
26264e98e3e1Schristos 
26274e98e3e1Schristos static SEM_PC
26284e98e3e1Schristos SEM_FN_NAME (m32rbf,bclr) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
26294e98e3e1Schristos {
26304e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_bset.f
26314e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
26324e98e3e1Schristos   int UNUSED written = 0;
26334e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
26344e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
26354e98e3e1Schristos 
26364e98e3e1Schristos   {
26374e98e3e1Schristos     QI opval = ANDQI (GETMEMQI (current_cpu, pc, ADDSI (* FLD (i_sr), FLD (f_simm16))), INVQI (SLLQI (1, SUBSI (7, FLD (f_uimm3)))));
26384e98e3e1Schristos     SETMEMQI (current_cpu, pc, ADDSI (* FLD (i_sr), FLD (f_simm16)), opval);
2639212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
26404e98e3e1Schristos   }
26414e98e3e1Schristos 
26424e98e3e1Schristos   return vpc;
26434e98e3e1Schristos #undef FLD
26444e98e3e1Schristos }
26454e98e3e1Schristos 
26464e98e3e1Schristos /* btst: btst $uimm3,$sr */
26474e98e3e1Schristos 
26484e98e3e1Schristos static SEM_PC
26494e98e3e1Schristos SEM_FN_NAME (m32rbf,btst) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
26504e98e3e1Schristos {
26514e98e3e1Schristos #define FLD(f) abuf->fields.sfmt_bset.f
26524e98e3e1Schristos   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
26534e98e3e1Schristos   int UNUSED written = 0;
26544e98e3e1Schristos   IADDR UNUSED pc = abuf->addr;
26554e98e3e1Schristos   SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
26564e98e3e1Schristos 
26574e98e3e1Schristos   {
26584e98e3e1Schristos     BI opval = ANDQI (SRLQI (* FLD (i_sr), SUBSI (7, FLD (f_uimm3))), 1);
26594e98e3e1Schristos     CPU (h_cond) = opval;
2660212397c6Schristos     CGEN_TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
26614e98e3e1Schristos   }
26624e98e3e1Schristos 
26634e98e3e1Schristos   return vpc;
26644e98e3e1Schristos #undef FLD
26654e98e3e1Schristos }
26664e98e3e1Schristos 
26674e98e3e1Schristos /* Table of all semantic fns.  */
26684e98e3e1Schristos 
26694e98e3e1Schristos static const struct sem_fn_desc sem_fns[] = {
26704e98e3e1Schristos   { M32RBF_INSN_X_INVALID, SEM_FN_NAME (m32rbf,x_invalid) },
26714e98e3e1Schristos   { M32RBF_INSN_X_AFTER, SEM_FN_NAME (m32rbf,x_after) },
26724e98e3e1Schristos   { M32RBF_INSN_X_BEFORE, SEM_FN_NAME (m32rbf,x_before) },
26734e98e3e1Schristos   { M32RBF_INSN_X_CTI_CHAIN, SEM_FN_NAME (m32rbf,x_cti_chain) },
26744e98e3e1Schristos   { M32RBF_INSN_X_CHAIN, SEM_FN_NAME (m32rbf,x_chain) },
26754e98e3e1Schristos   { M32RBF_INSN_X_BEGIN, SEM_FN_NAME (m32rbf,x_begin) },
26764e98e3e1Schristos   { M32RBF_INSN_ADD, SEM_FN_NAME (m32rbf,add) },
26774e98e3e1Schristos   { M32RBF_INSN_ADD3, SEM_FN_NAME (m32rbf,add3) },
26784e98e3e1Schristos   { M32RBF_INSN_AND, SEM_FN_NAME (m32rbf,and) },
26794e98e3e1Schristos   { M32RBF_INSN_AND3, SEM_FN_NAME (m32rbf,and3) },
26804e98e3e1Schristos   { M32RBF_INSN_OR, SEM_FN_NAME (m32rbf,or) },
26814e98e3e1Schristos   { M32RBF_INSN_OR3, SEM_FN_NAME (m32rbf,or3) },
26824e98e3e1Schristos   { M32RBF_INSN_XOR, SEM_FN_NAME (m32rbf,xor) },
26834e98e3e1Schristos   { M32RBF_INSN_XOR3, SEM_FN_NAME (m32rbf,xor3) },
26844e98e3e1Schristos   { M32RBF_INSN_ADDI, SEM_FN_NAME (m32rbf,addi) },
26854e98e3e1Schristos   { M32RBF_INSN_ADDV, SEM_FN_NAME (m32rbf,addv) },
26864e98e3e1Schristos   { M32RBF_INSN_ADDV3, SEM_FN_NAME (m32rbf,addv3) },
26874e98e3e1Schristos   { M32RBF_INSN_ADDX, SEM_FN_NAME (m32rbf,addx) },
26884e98e3e1Schristos   { M32RBF_INSN_BC8, SEM_FN_NAME (m32rbf,bc8) },
26894e98e3e1Schristos   { M32RBF_INSN_BC24, SEM_FN_NAME (m32rbf,bc24) },
26904e98e3e1Schristos   { M32RBF_INSN_BEQ, SEM_FN_NAME (m32rbf,beq) },
26914e98e3e1Schristos   { M32RBF_INSN_BEQZ, SEM_FN_NAME (m32rbf,beqz) },
26924e98e3e1Schristos   { M32RBF_INSN_BGEZ, SEM_FN_NAME (m32rbf,bgez) },
26934e98e3e1Schristos   { M32RBF_INSN_BGTZ, SEM_FN_NAME (m32rbf,bgtz) },
26944e98e3e1Schristos   { M32RBF_INSN_BLEZ, SEM_FN_NAME (m32rbf,blez) },
26954e98e3e1Schristos   { M32RBF_INSN_BLTZ, SEM_FN_NAME (m32rbf,bltz) },
26964e98e3e1Schristos   { M32RBF_INSN_BNEZ, SEM_FN_NAME (m32rbf,bnez) },
26974e98e3e1Schristos   { M32RBF_INSN_BL8, SEM_FN_NAME (m32rbf,bl8) },
26984e98e3e1Schristos   { M32RBF_INSN_BL24, SEM_FN_NAME (m32rbf,bl24) },
26994e98e3e1Schristos   { M32RBF_INSN_BNC8, SEM_FN_NAME (m32rbf,bnc8) },
27004e98e3e1Schristos   { M32RBF_INSN_BNC24, SEM_FN_NAME (m32rbf,bnc24) },
27014e98e3e1Schristos   { M32RBF_INSN_BNE, SEM_FN_NAME (m32rbf,bne) },
27024e98e3e1Schristos   { M32RBF_INSN_BRA8, SEM_FN_NAME (m32rbf,bra8) },
27034e98e3e1Schristos   { M32RBF_INSN_BRA24, SEM_FN_NAME (m32rbf,bra24) },
27044e98e3e1Schristos   { M32RBF_INSN_CMP, SEM_FN_NAME (m32rbf,cmp) },
27054e98e3e1Schristos   { M32RBF_INSN_CMPI, SEM_FN_NAME (m32rbf,cmpi) },
27064e98e3e1Schristos   { M32RBF_INSN_CMPU, SEM_FN_NAME (m32rbf,cmpu) },
27074e98e3e1Schristos   { M32RBF_INSN_CMPUI, SEM_FN_NAME (m32rbf,cmpui) },
27084e98e3e1Schristos   { M32RBF_INSN_DIV, SEM_FN_NAME (m32rbf,div) },
27094e98e3e1Schristos   { M32RBF_INSN_DIVU, SEM_FN_NAME (m32rbf,divu) },
27104e98e3e1Schristos   { M32RBF_INSN_REM, SEM_FN_NAME (m32rbf,rem) },
27114e98e3e1Schristos   { M32RBF_INSN_REMU, SEM_FN_NAME (m32rbf,remu) },
27124e98e3e1Schristos   { M32RBF_INSN_JL, SEM_FN_NAME (m32rbf,jl) },
27134e98e3e1Schristos   { M32RBF_INSN_JMP, SEM_FN_NAME (m32rbf,jmp) },
27144e98e3e1Schristos   { M32RBF_INSN_LD, SEM_FN_NAME (m32rbf,ld) },
27154e98e3e1Schristos   { M32RBF_INSN_LD_D, SEM_FN_NAME (m32rbf,ld_d) },
27164e98e3e1Schristos   { M32RBF_INSN_LDB, SEM_FN_NAME (m32rbf,ldb) },
27174e98e3e1Schristos   { M32RBF_INSN_LDB_D, SEM_FN_NAME (m32rbf,ldb_d) },
27184e98e3e1Schristos   { M32RBF_INSN_LDH, SEM_FN_NAME (m32rbf,ldh) },
27194e98e3e1Schristos   { M32RBF_INSN_LDH_D, SEM_FN_NAME (m32rbf,ldh_d) },
27204e98e3e1Schristos   { M32RBF_INSN_LDUB, SEM_FN_NAME (m32rbf,ldub) },
27214e98e3e1Schristos   { M32RBF_INSN_LDUB_D, SEM_FN_NAME (m32rbf,ldub_d) },
27224e98e3e1Schristos   { M32RBF_INSN_LDUH, SEM_FN_NAME (m32rbf,lduh) },
27234e98e3e1Schristos   { M32RBF_INSN_LDUH_D, SEM_FN_NAME (m32rbf,lduh_d) },
27244e98e3e1Schristos   { M32RBF_INSN_LD_PLUS, SEM_FN_NAME (m32rbf,ld_plus) },
27254e98e3e1Schristos   { M32RBF_INSN_LD24, SEM_FN_NAME (m32rbf,ld24) },
27264e98e3e1Schristos   { M32RBF_INSN_LDI8, SEM_FN_NAME (m32rbf,ldi8) },
27274e98e3e1Schristos   { M32RBF_INSN_LDI16, SEM_FN_NAME (m32rbf,ldi16) },
27284e98e3e1Schristos   { M32RBF_INSN_LOCK, SEM_FN_NAME (m32rbf,lock) },
27294e98e3e1Schristos   { M32RBF_INSN_MACHI, SEM_FN_NAME (m32rbf,machi) },
27304e98e3e1Schristos   { M32RBF_INSN_MACLO, SEM_FN_NAME (m32rbf,maclo) },
27314e98e3e1Schristos   { M32RBF_INSN_MACWHI, SEM_FN_NAME (m32rbf,macwhi) },
27324e98e3e1Schristos   { M32RBF_INSN_MACWLO, SEM_FN_NAME (m32rbf,macwlo) },
27334e98e3e1Schristos   { M32RBF_INSN_MUL, SEM_FN_NAME (m32rbf,mul) },
27344e98e3e1Schristos   { M32RBF_INSN_MULHI, SEM_FN_NAME (m32rbf,mulhi) },
27354e98e3e1Schristos   { M32RBF_INSN_MULLO, SEM_FN_NAME (m32rbf,mullo) },
27364e98e3e1Schristos   { M32RBF_INSN_MULWHI, SEM_FN_NAME (m32rbf,mulwhi) },
27374e98e3e1Schristos   { M32RBF_INSN_MULWLO, SEM_FN_NAME (m32rbf,mulwlo) },
27384e98e3e1Schristos   { M32RBF_INSN_MV, SEM_FN_NAME (m32rbf,mv) },
27394e98e3e1Schristos   { M32RBF_INSN_MVFACHI, SEM_FN_NAME (m32rbf,mvfachi) },
27404e98e3e1Schristos   { M32RBF_INSN_MVFACLO, SEM_FN_NAME (m32rbf,mvfaclo) },
27414e98e3e1Schristos   { M32RBF_INSN_MVFACMI, SEM_FN_NAME (m32rbf,mvfacmi) },
27424e98e3e1Schristos   { M32RBF_INSN_MVFC, SEM_FN_NAME (m32rbf,mvfc) },
27434e98e3e1Schristos   { M32RBF_INSN_MVTACHI, SEM_FN_NAME (m32rbf,mvtachi) },
27444e98e3e1Schristos   { M32RBF_INSN_MVTACLO, SEM_FN_NAME (m32rbf,mvtaclo) },
27454e98e3e1Schristos   { M32RBF_INSN_MVTC, SEM_FN_NAME (m32rbf,mvtc) },
27464e98e3e1Schristos   { M32RBF_INSN_NEG, SEM_FN_NAME (m32rbf,neg) },
27474e98e3e1Schristos   { M32RBF_INSN_NOP, SEM_FN_NAME (m32rbf,nop) },
27484e98e3e1Schristos   { M32RBF_INSN_NOT, SEM_FN_NAME (m32rbf,not) },
27494e98e3e1Schristos   { M32RBF_INSN_RAC, SEM_FN_NAME (m32rbf,rac) },
27504e98e3e1Schristos   { M32RBF_INSN_RACH, SEM_FN_NAME (m32rbf,rach) },
27514e98e3e1Schristos   { M32RBF_INSN_RTE, SEM_FN_NAME (m32rbf,rte) },
27524e98e3e1Schristos   { M32RBF_INSN_SETH, SEM_FN_NAME (m32rbf,seth) },
27534e98e3e1Schristos   { M32RBF_INSN_SLL, SEM_FN_NAME (m32rbf,sll) },
27544e98e3e1Schristos   { M32RBF_INSN_SLL3, SEM_FN_NAME (m32rbf,sll3) },
27554e98e3e1Schristos   { M32RBF_INSN_SLLI, SEM_FN_NAME (m32rbf,slli) },
27564e98e3e1Schristos   { M32RBF_INSN_SRA, SEM_FN_NAME (m32rbf,sra) },
27574e98e3e1Schristos   { M32RBF_INSN_SRA3, SEM_FN_NAME (m32rbf,sra3) },
27584e98e3e1Schristos   { M32RBF_INSN_SRAI, SEM_FN_NAME (m32rbf,srai) },
27594e98e3e1Schristos   { M32RBF_INSN_SRL, SEM_FN_NAME (m32rbf,srl) },
27604e98e3e1Schristos   { M32RBF_INSN_SRL3, SEM_FN_NAME (m32rbf,srl3) },
27614e98e3e1Schristos   { M32RBF_INSN_SRLI, SEM_FN_NAME (m32rbf,srli) },
27624e98e3e1Schristos   { M32RBF_INSN_ST, SEM_FN_NAME (m32rbf,st) },
27634e98e3e1Schristos   { M32RBF_INSN_ST_D, SEM_FN_NAME (m32rbf,st_d) },
27644e98e3e1Schristos   { M32RBF_INSN_STB, SEM_FN_NAME (m32rbf,stb) },
27654e98e3e1Schristos   { M32RBF_INSN_STB_D, SEM_FN_NAME (m32rbf,stb_d) },
27664e98e3e1Schristos   { M32RBF_INSN_STH, SEM_FN_NAME (m32rbf,sth) },
27674e98e3e1Schristos   { M32RBF_INSN_STH_D, SEM_FN_NAME (m32rbf,sth_d) },
27684e98e3e1Schristos   { M32RBF_INSN_ST_PLUS, SEM_FN_NAME (m32rbf,st_plus) },
27694e98e3e1Schristos   { M32RBF_INSN_ST_MINUS, SEM_FN_NAME (m32rbf,st_minus) },
27704e98e3e1Schristos   { M32RBF_INSN_SUB, SEM_FN_NAME (m32rbf,sub) },
27714e98e3e1Schristos   { M32RBF_INSN_SUBV, SEM_FN_NAME (m32rbf,subv) },
27724e98e3e1Schristos   { M32RBF_INSN_SUBX, SEM_FN_NAME (m32rbf,subx) },
27734e98e3e1Schristos   { M32RBF_INSN_TRAP, SEM_FN_NAME (m32rbf,trap) },
27744e98e3e1Schristos   { M32RBF_INSN_UNLOCK, SEM_FN_NAME (m32rbf,unlock) },
27754e98e3e1Schristos   { M32RBF_INSN_CLRPSW, SEM_FN_NAME (m32rbf,clrpsw) },
27764e98e3e1Schristos   { M32RBF_INSN_SETPSW, SEM_FN_NAME (m32rbf,setpsw) },
27774e98e3e1Schristos   { M32RBF_INSN_BSET, SEM_FN_NAME (m32rbf,bset) },
27784e98e3e1Schristos   { M32RBF_INSN_BCLR, SEM_FN_NAME (m32rbf,bclr) },
27794e98e3e1Schristos   { M32RBF_INSN_BTST, SEM_FN_NAME (m32rbf,btst) },
27804e98e3e1Schristos   { 0, 0 }
27814e98e3e1Schristos };
27824e98e3e1Schristos 
27834e98e3e1Schristos /* Add the semantic fns to IDESC_TABLE.  */
27844e98e3e1Schristos 
27854e98e3e1Schristos void
27864e98e3e1Schristos SEM_FN_NAME (m32rbf,init_idesc_table) (SIM_CPU *current_cpu)
27874e98e3e1Schristos {
27884e98e3e1Schristos   IDESC *idesc_table = CPU_IDESC (current_cpu);
27894e98e3e1Schristos   const struct sem_fn_desc *sf;
27904e98e3e1Schristos   int mach_num = MACH_NUM (CPU_MACH (current_cpu));
27914e98e3e1Schristos 
27924e98e3e1Schristos   for (sf = &sem_fns[0]; sf->fn != 0; ++sf)
27934e98e3e1Schristos     {
27944e98e3e1Schristos       const CGEN_INSN *insn = idesc_table[sf->index].idata;
27954e98e3e1Schristos       int valid_p = (CGEN_INSN_VIRTUAL_P (insn)
27964e98e3e1Schristos 		     || CGEN_INSN_MACH_HAS_P (insn, mach_num));
27974e98e3e1Schristos #if FAST_P
27984e98e3e1Schristos       if (valid_p)
27994e98e3e1Schristos 	idesc_table[sf->index].sem_fast = sf->fn;
28004e98e3e1Schristos       else
28014e98e3e1Schristos 	idesc_table[sf->index].sem_fast = SEM_FN_NAME (m32rbf,x_invalid);
28024e98e3e1Schristos #else
28034e98e3e1Schristos       if (valid_p)
28044e98e3e1Schristos 	idesc_table[sf->index].sem_full = sf->fn;
28054e98e3e1Schristos       else
28064e98e3e1Schristos 	idesc_table[sf->index].sem_full = SEM_FN_NAME (m32rbf,x_invalid);
28074e98e3e1Schristos #endif
28084e98e3e1Schristos     }
28094e98e3e1Schristos }
28104e98e3e1Schristos 
2811