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