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