xref: /netbsd-src/external/gpl3/gdb.old/dist/sim/m32r/sem.c (revision 8b657b0747480f8989760d71343d6dd33f8d4cf9)
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