1/* Simulator instruction semantics for m32r2f.
2
3THIS FILE IS MACHINE GENERATED WITH CGEN.
4
5Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
6
7This file is part of the GNU simulators.
8
9This program is free software; you can redistribute it and/or modify
10it under the terms of the GNU General Public License as published by
11the Free Software Foundation; either version 3 of the License, or
12(at your option) any later version.
13
14This program is distributed in the hope that it will be useful,
15but WITHOUT ANY WARRANTY; without even the implied warranty of
16MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17GNU General Public License for more details.
18
19You should have received a copy of the GNU General Public License
20along with this program.  If not, see <http://www.gnu.org/licenses/>.
21
22*/
23
24#ifdef DEFINE_LABELS
25
26  /* The labels have the case they have because the enum of insn types
27     is all uppercase and in the non-stdc case the insn symbol is built
28     into the enum name.  */
29
30  static struct {
31    int index;
32    void *label;
33  } labels[] = {
34    { M32R2F_INSN_X_INVALID, && case_sem_INSN_X_INVALID },
35    { M32R2F_INSN_X_AFTER, && case_sem_INSN_X_AFTER },
36    { M32R2F_INSN_X_BEFORE, && case_sem_INSN_X_BEFORE },
37    { M32R2F_INSN_X_CTI_CHAIN, && case_sem_INSN_X_CTI_CHAIN },
38    { M32R2F_INSN_X_CHAIN, && case_sem_INSN_X_CHAIN },
39    { M32R2F_INSN_X_BEGIN, && case_sem_INSN_X_BEGIN },
40    { M32R2F_INSN_ADD, && case_sem_INSN_ADD },
41    { M32R2F_INSN_ADD3, && case_sem_INSN_ADD3 },
42    { M32R2F_INSN_AND, && case_sem_INSN_AND },
43    { M32R2F_INSN_AND3, && case_sem_INSN_AND3 },
44    { M32R2F_INSN_OR, && case_sem_INSN_OR },
45    { M32R2F_INSN_OR3, && case_sem_INSN_OR3 },
46    { M32R2F_INSN_XOR, && case_sem_INSN_XOR },
47    { M32R2F_INSN_XOR3, && case_sem_INSN_XOR3 },
48    { M32R2F_INSN_ADDI, && case_sem_INSN_ADDI },
49    { M32R2F_INSN_ADDV, && case_sem_INSN_ADDV },
50    { M32R2F_INSN_ADDV3, && case_sem_INSN_ADDV3 },
51    { M32R2F_INSN_ADDX, && case_sem_INSN_ADDX },
52    { M32R2F_INSN_BC8, && case_sem_INSN_BC8 },
53    { M32R2F_INSN_BC24, && case_sem_INSN_BC24 },
54    { M32R2F_INSN_BEQ, && case_sem_INSN_BEQ },
55    { M32R2F_INSN_BEQZ, && case_sem_INSN_BEQZ },
56    { M32R2F_INSN_BGEZ, && case_sem_INSN_BGEZ },
57    { M32R2F_INSN_BGTZ, && case_sem_INSN_BGTZ },
58    { M32R2F_INSN_BLEZ, && case_sem_INSN_BLEZ },
59    { M32R2F_INSN_BLTZ, && case_sem_INSN_BLTZ },
60    { M32R2F_INSN_BNEZ, && case_sem_INSN_BNEZ },
61    { M32R2F_INSN_BL8, && case_sem_INSN_BL8 },
62    { M32R2F_INSN_BL24, && case_sem_INSN_BL24 },
63    { M32R2F_INSN_BCL8, && case_sem_INSN_BCL8 },
64    { M32R2F_INSN_BCL24, && case_sem_INSN_BCL24 },
65    { M32R2F_INSN_BNC8, && case_sem_INSN_BNC8 },
66    { M32R2F_INSN_BNC24, && case_sem_INSN_BNC24 },
67    { M32R2F_INSN_BNE, && case_sem_INSN_BNE },
68    { M32R2F_INSN_BRA8, && case_sem_INSN_BRA8 },
69    { M32R2F_INSN_BRA24, && case_sem_INSN_BRA24 },
70    { M32R2F_INSN_BNCL8, && case_sem_INSN_BNCL8 },
71    { M32R2F_INSN_BNCL24, && case_sem_INSN_BNCL24 },
72    { M32R2F_INSN_CMP, && case_sem_INSN_CMP },
73    { M32R2F_INSN_CMPI, && case_sem_INSN_CMPI },
74    { M32R2F_INSN_CMPU, && case_sem_INSN_CMPU },
75    { M32R2F_INSN_CMPUI, && case_sem_INSN_CMPUI },
76    { M32R2F_INSN_CMPEQ, && case_sem_INSN_CMPEQ },
77    { M32R2F_INSN_CMPZ, && case_sem_INSN_CMPZ },
78    { M32R2F_INSN_DIV, && case_sem_INSN_DIV },
79    { M32R2F_INSN_DIVU, && case_sem_INSN_DIVU },
80    { M32R2F_INSN_REM, && case_sem_INSN_REM },
81    { M32R2F_INSN_REMU, && case_sem_INSN_REMU },
82    { M32R2F_INSN_REMH, && case_sem_INSN_REMH },
83    { M32R2F_INSN_REMUH, && case_sem_INSN_REMUH },
84    { M32R2F_INSN_REMB, && case_sem_INSN_REMB },
85    { M32R2F_INSN_REMUB, && case_sem_INSN_REMUB },
86    { M32R2F_INSN_DIVUH, && case_sem_INSN_DIVUH },
87    { M32R2F_INSN_DIVB, && case_sem_INSN_DIVB },
88    { M32R2F_INSN_DIVUB, && case_sem_INSN_DIVUB },
89    { M32R2F_INSN_DIVH, && case_sem_INSN_DIVH },
90    { M32R2F_INSN_JC, && case_sem_INSN_JC },
91    { M32R2F_INSN_JNC, && case_sem_INSN_JNC },
92    { M32R2F_INSN_JL, && case_sem_INSN_JL },
93    { M32R2F_INSN_JMP, && case_sem_INSN_JMP },
94    { M32R2F_INSN_LD, && case_sem_INSN_LD },
95    { M32R2F_INSN_LD_D, && case_sem_INSN_LD_D },
96    { M32R2F_INSN_LDB, && case_sem_INSN_LDB },
97    { M32R2F_INSN_LDB_D, && case_sem_INSN_LDB_D },
98    { M32R2F_INSN_LDH, && case_sem_INSN_LDH },
99    { M32R2F_INSN_LDH_D, && case_sem_INSN_LDH_D },
100    { M32R2F_INSN_LDUB, && case_sem_INSN_LDUB },
101    { M32R2F_INSN_LDUB_D, && case_sem_INSN_LDUB_D },
102    { M32R2F_INSN_LDUH, && case_sem_INSN_LDUH },
103    { M32R2F_INSN_LDUH_D, && case_sem_INSN_LDUH_D },
104    { M32R2F_INSN_LD_PLUS, && case_sem_INSN_LD_PLUS },
105    { M32R2F_INSN_LD24, && case_sem_INSN_LD24 },
106    { M32R2F_INSN_LDI8, && case_sem_INSN_LDI8 },
107    { M32R2F_INSN_LDI16, && case_sem_INSN_LDI16 },
108    { M32R2F_INSN_LOCK, && case_sem_INSN_LOCK },
109    { M32R2F_INSN_MACHI_A, && case_sem_INSN_MACHI_A },
110    { M32R2F_INSN_MACLO_A, && case_sem_INSN_MACLO_A },
111    { M32R2F_INSN_MACWHI_A, && case_sem_INSN_MACWHI_A },
112    { M32R2F_INSN_MACWLO_A, && case_sem_INSN_MACWLO_A },
113    { M32R2F_INSN_MUL, && case_sem_INSN_MUL },
114    { M32R2F_INSN_MULHI_A, && case_sem_INSN_MULHI_A },
115    { M32R2F_INSN_MULLO_A, && case_sem_INSN_MULLO_A },
116    { M32R2F_INSN_MULWHI_A, && case_sem_INSN_MULWHI_A },
117    { M32R2F_INSN_MULWLO_A, && case_sem_INSN_MULWLO_A },
118    { M32R2F_INSN_MV, && case_sem_INSN_MV },
119    { M32R2F_INSN_MVFACHI_A, && case_sem_INSN_MVFACHI_A },
120    { M32R2F_INSN_MVFACLO_A, && case_sem_INSN_MVFACLO_A },
121    { M32R2F_INSN_MVFACMI_A, && case_sem_INSN_MVFACMI_A },
122    { M32R2F_INSN_MVFC, && case_sem_INSN_MVFC },
123    { M32R2F_INSN_MVTACHI_A, && case_sem_INSN_MVTACHI_A },
124    { M32R2F_INSN_MVTACLO_A, && case_sem_INSN_MVTACLO_A },
125    { M32R2F_INSN_MVTC, && case_sem_INSN_MVTC },
126    { M32R2F_INSN_NEG, && case_sem_INSN_NEG },
127    { M32R2F_INSN_NOP, && case_sem_INSN_NOP },
128    { M32R2F_INSN_NOT, && case_sem_INSN_NOT },
129    { M32R2F_INSN_RAC_DSI, && case_sem_INSN_RAC_DSI },
130    { M32R2F_INSN_RACH_DSI, && case_sem_INSN_RACH_DSI },
131    { M32R2F_INSN_RTE, && case_sem_INSN_RTE },
132    { M32R2F_INSN_SETH, && case_sem_INSN_SETH },
133    { M32R2F_INSN_SLL, && case_sem_INSN_SLL },
134    { M32R2F_INSN_SLL3, && case_sem_INSN_SLL3 },
135    { M32R2F_INSN_SLLI, && case_sem_INSN_SLLI },
136    { M32R2F_INSN_SRA, && case_sem_INSN_SRA },
137    { M32R2F_INSN_SRA3, && case_sem_INSN_SRA3 },
138    { M32R2F_INSN_SRAI, && case_sem_INSN_SRAI },
139    { M32R2F_INSN_SRL, && case_sem_INSN_SRL },
140    { M32R2F_INSN_SRL3, && case_sem_INSN_SRL3 },
141    { M32R2F_INSN_SRLI, && case_sem_INSN_SRLI },
142    { M32R2F_INSN_ST, && case_sem_INSN_ST },
143    { M32R2F_INSN_ST_D, && case_sem_INSN_ST_D },
144    { M32R2F_INSN_STB, && case_sem_INSN_STB },
145    { M32R2F_INSN_STB_D, && case_sem_INSN_STB_D },
146    { M32R2F_INSN_STH, && case_sem_INSN_STH },
147    { M32R2F_INSN_STH_D, && case_sem_INSN_STH_D },
148    { M32R2F_INSN_ST_PLUS, && case_sem_INSN_ST_PLUS },
149    { M32R2F_INSN_STH_PLUS, && case_sem_INSN_STH_PLUS },
150    { M32R2F_INSN_STB_PLUS, && case_sem_INSN_STB_PLUS },
151    { M32R2F_INSN_ST_MINUS, && case_sem_INSN_ST_MINUS },
152    { M32R2F_INSN_SUB, && case_sem_INSN_SUB },
153    { M32R2F_INSN_SUBV, && case_sem_INSN_SUBV },
154    { M32R2F_INSN_SUBX, && case_sem_INSN_SUBX },
155    { M32R2F_INSN_TRAP, && case_sem_INSN_TRAP },
156    { M32R2F_INSN_UNLOCK, && case_sem_INSN_UNLOCK },
157    { M32R2F_INSN_SATB, && case_sem_INSN_SATB },
158    { M32R2F_INSN_SATH, && case_sem_INSN_SATH },
159    { M32R2F_INSN_SAT, && case_sem_INSN_SAT },
160    { M32R2F_INSN_PCMPBZ, && case_sem_INSN_PCMPBZ },
161    { M32R2F_INSN_SADD, && case_sem_INSN_SADD },
162    { M32R2F_INSN_MACWU1, && case_sem_INSN_MACWU1 },
163    { M32R2F_INSN_MSBLO, && case_sem_INSN_MSBLO },
164    { M32R2F_INSN_MULWU1, && case_sem_INSN_MULWU1 },
165    { M32R2F_INSN_MACLH1, && case_sem_INSN_MACLH1 },
166    { M32R2F_INSN_SC, && case_sem_INSN_SC },
167    { M32R2F_INSN_SNC, && case_sem_INSN_SNC },
168    { M32R2F_INSN_CLRPSW, && case_sem_INSN_CLRPSW },
169    { M32R2F_INSN_SETPSW, && case_sem_INSN_SETPSW },
170    { M32R2F_INSN_BSET, && case_sem_INSN_BSET },
171    { M32R2F_INSN_BCLR, && case_sem_INSN_BCLR },
172    { M32R2F_INSN_BTST, && case_sem_INSN_BTST },
173    { M32R2F_INSN_PAR_ADD, && case_sem_INSN_PAR_ADD },
174    { M32R2F_INSN_WRITE_ADD, && case_sem_INSN_WRITE_ADD },
175    { M32R2F_INSN_PAR_AND, && case_sem_INSN_PAR_AND },
176    { M32R2F_INSN_WRITE_AND, && case_sem_INSN_WRITE_AND },
177    { M32R2F_INSN_PAR_OR, && case_sem_INSN_PAR_OR },
178    { M32R2F_INSN_WRITE_OR, && case_sem_INSN_WRITE_OR },
179    { M32R2F_INSN_PAR_XOR, && case_sem_INSN_PAR_XOR },
180    { M32R2F_INSN_WRITE_XOR, && case_sem_INSN_WRITE_XOR },
181    { M32R2F_INSN_PAR_ADDI, && case_sem_INSN_PAR_ADDI },
182    { M32R2F_INSN_WRITE_ADDI, && case_sem_INSN_WRITE_ADDI },
183    { M32R2F_INSN_PAR_ADDV, && case_sem_INSN_PAR_ADDV },
184    { M32R2F_INSN_WRITE_ADDV, && case_sem_INSN_WRITE_ADDV },
185    { M32R2F_INSN_PAR_ADDX, && case_sem_INSN_PAR_ADDX },
186    { M32R2F_INSN_WRITE_ADDX, && case_sem_INSN_WRITE_ADDX },
187    { M32R2F_INSN_PAR_BC8, && case_sem_INSN_PAR_BC8 },
188    { M32R2F_INSN_WRITE_BC8, && case_sem_INSN_WRITE_BC8 },
189    { M32R2F_INSN_PAR_BL8, && case_sem_INSN_PAR_BL8 },
190    { M32R2F_INSN_WRITE_BL8, && case_sem_INSN_WRITE_BL8 },
191    { M32R2F_INSN_PAR_BCL8, && case_sem_INSN_PAR_BCL8 },
192    { M32R2F_INSN_WRITE_BCL8, && case_sem_INSN_WRITE_BCL8 },
193    { M32R2F_INSN_PAR_BNC8, && case_sem_INSN_PAR_BNC8 },
194    { M32R2F_INSN_WRITE_BNC8, && case_sem_INSN_WRITE_BNC8 },
195    { M32R2F_INSN_PAR_BRA8, && case_sem_INSN_PAR_BRA8 },
196    { M32R2F_INSN_WRITE_BRA8, && case_sem_INSN_WRITE_BRA8 },
197    { M32R2F_INSN_PAR_BNCL8, && case_sem_INSN_PAR_BNCL8 },
198    { M32R2F_INSN_WRITE_BNCL8, && case_sem_INSN_WRITE_BNCL8 },
199    { M32R2F_INSN_PAR_CMP, && case_sem_INSN_PAR_CMP },
200    { M32R2F_INSN_WRITE_CMP, && case_sem_INSN_WRITE_CMP },
201    { M32R2F_INSN_PAR_CMPU, && case_sem_INSN_PAR_CMPU },
202    { M32R2F_INSN_WRITE_CMPU, && case_sem_INSN_WRITE_CMPU },
203    { M32R2F_INSN_PAR_CMPEQ, && case_sem_INSN_PAR_CMPEQ },
204    { M32R2F_INSN_WRITE_CMPEQ, && case_sem_INSN_WRITE_CMPEQ },
205    { M32R2F_INSN_PAR_CMPZ, && case_sem_INSN_PAR_CMPZ },
206    { M32R2F_INSN_WRITE_CMPZ, && case_sem_INSN_WRITE_CMPZ },
207    { M32R2F_INSN_PAR_JC, && case_sem_INSN_PAR_JC },
208    { M32R2F_INSN_WRITE_JC, && case_sem_INSN_WRITE_JC },
209    { M32R2F_INSN_PAR_JNC, && case_sem_INSN_PAR_JNC },
210    { M32R2F_INSN_WRITE_JNC, && case_sem_INSN_WRITE_JNC },
211    { M32R2F_INSN_PAR_JL, && case_sem_INSN_PAR_JL },
212    { M32R2F_INSN_WRITE_JL, && case_sem_INSN_WRITE_JL },
213    { M32R2F_INSN_PAR_JMP, && case_sem_INSN_PAR_JMP },
214    { M32R2F_INSN_WRITE_JMP, && case_sem_INSN_WRITE_JMP },
215    { M32R2F_INSN_PAR_LD, && case_sem_INSN_PAR_LD },
216    { M32R2F_INSN_WRITE_LD, && case_sem_INSN_WRITE_LD },
217    { M32R2F_INSN_PAR_LDB, && case_sem_INSN_PAR_LDB },
218    { M32R2F_INSN_WRITE_LDB, && case_sem_INSN_WRITE_LDB },
219    { M32R2F_INSN_PAR_LDH, && case_sem_INSN_PAR_LDH },
220    { M32R2F_INSN_WRITE_LDH, && case_sem_INSN_WRITE_LDH },
221    { M32R2F_INSN_PAR_LDUB, && case_sem_INSN_PAR_LDUB },
222    { M32R2F_INSN_WRITE_LDUB, && case_sem_INSN_WRITE_LDUB },
223    { M32R2F_INSN_PAR_LDUH, && case_sem_INSN_PAR_LDUH },
224    { M32R2F_INSN_WRITE_LDUH, && case_sem_INSN_WRITE_LDUH },
225    { M32R2F_INSN_PAR_LD_PLUS, && case_sem_INSN_PAR_LD_PLUS },
226    { M32R2F_INSN_WRITE_LD_PLUS, && case_sem_INSN_WRITE_LD_PLUS },
227    { M32R2F_INSN_PAR_LDI8, && case_sem_INSN_PAR_LDI8 },
228    { M32R2F_INSN_WRITE_LDI8, && case_sem_INSN_WRITE_LDI8 },
229    { M32R2F_INSN_PAR_LOCK, && case_sem_INSN_PAR_LOCK },
230    { M32R2F_INSN_WRITE_LOCK, && case_sem_INSN_WRITE_LOCK },
231    { M32R2F_INSN_PAR_MACHI_A, && case_sem_INSN_PAR_MACHI_A },
232    { M32R2F_INSN_WRITE_MACHI_A, && case_sem_INSN_WRITE_MACHI_A },
233    { M32R2F_INSN_PAR_MACLO_A, && case_sem_INSN_PAR_MACLO_A },
234    { M32R2F_INSN_WRITE_MACLO_A, && case_sem_INSN_WRITE_MACLO_A },
235    { M32R2F_INSN_PAR_MACWHI_A, && case_sem_INSN_PAR_MACWHI_A },
236    { M32R2F_INSN_WRITE_MACWHI_A, && case_sem_INSN_WRITE_MACWHI_A },
237    { M32R2F_INSN_PAR_MACWLO_A, && case_sem_INSN_PAR_MACWLO_A },
238    { M32R2F_INSN_WRITE_MACWLO_A, && case_sem_INSN_WRITE_MACWLO_A },
239    { M32R2F_INSN_PAR_MUL, && case_sem_INSN_PAR_MUL },
240    { M32R2F_INSN_WRITE_MUL, && case_sem_INSN_WRITE_MUL },
241    { M32R2F_INSN_PAR_MULHI_A, && case_sem_INSN_PAR_MULHI_A },
242    { M32R2F_INSN_WRITE_MULHI_A, && case_sem_INSN_WRITE_MULHI_A },
243    { M32R2F_INSN_PAR_MULLO_A, && case_sem_INSN_PAR_MULLO_A },
244    { M32R2F_INSN_WRITE_MULLO_A, && case_sem_INSN_WRITE_MULLO_A },
245    { M32R2F_INSN_PAR_MULWHI_A, && case_sem_INSN_PAR_MULWHI_A },
246    { M32R2F_INSN_WRITE_MULWHI_A, && case_sem_INSN_WRITE_MULWHI_A },
247    { M32R2F_INSN_PAR_MULWLO_A, && case_sem_INSN_PAR_MULWLO_A },
248    { M32R2F_INSN_WRITE_MULWLO_A, && case_sem_INSN_WRITE_MULWLO_A },
249    { M32R2F_INSN_PAR_MV, && case_sem_INSN_PAR_MV },
250    { M32R2F_INSN_WRITE_MV, && case_sem_INSN_WRITE_MV },
251    { M32R2F_INSN_PAR_MVFACHI_A, && case_sem_INSN_PAR_MVFACHI_A },
252    { M32R2F_INSN_WRITE_MVFACHI_A, && case_sem_INSN_WRITE_MVFACHI_A },
253    { M32R2F_INSN_PAR_MVFACLO_A, && case_sem_INSN_PAR_MVFACLO_A },
254    { M32R2F_INSN_WRITE_MVFACLO_A, && case_sem_INSN_WRITE_MVFACLO_A },
255    { M32R2F_INSN_PAR_MVFACMI_A, && case_sem_INSN_PAR_MVFACMI_A },
256    { M32R2F_INSN_WRITE_MVFACMI_A, && case_sem_INSN_WRITE_MVFACMI_A },
257    { M32R2F_INSN_PAR_MVFC, && case_sem_INSN_PAR_MVFC },
258    { M32R2F_INSN_WRITE_MVFC, && case_sem_INSN_WRITE_MVFC },
259    { M32R2F_INSN_PAR_MVTACHI_A, && case_sem_INSN_PAR_MVTACHI_A },
260    { M32R2F_INSN_WRITE_MVTACHI_A, && case_sem_INSN_WRITE_MVTACHI_A },
261    { M32R2F_INSN_PAR_MVTACLO_A, && case_sem_INSN_PAR_MVTACLO_A },
262    { M32R2F_INSN_WRITE_MVTACLO_A, && case_sem_INSN_WRITE_MVTACLO_A },
263    { M32R2F_INSN_PAR_MVTC, && case_sem_INSN_PAR_MVTC },
264    { M32R2F_INSN_WRITE_MVTC, && case_sem_INSN_WRITE_MVTC },
265    { M32R2F_INSN_PAR_NEG, && case_sem_INSN_PAR_NEG },
266    { M32R2F_INSN_WRITE_NEG, && case_sem_INSN_WRITE_NEG },
267    { M32R2F_INSN_PAR_NOP, && case_sem_INSN_PAR_NOP },
268    { M32R2F_INSN_WRITE_NOP, && case_sem_INSN_WRITE_NOP },
269    { M32R2F_INSN_PAR_NOT, && case_sem_INSN_PAR_NOT },
270    { M32R2F_INSN_WRITE_NOT, && case_sem_INSN_WRITE_NOT },
271    { M32R2F_INSN_PAR_RAC_DSI, && case_sem_INSN_PAR_RAC_DSI },
272    { M32R2F_INSN_WRITE_RAC_DSI, && case_sem_INSN_WRITE_RAC_DSI },
273    { M32R2F_INSN_PAR_RACH_DSI, && case_sem_INSN_PAR_RACH_DSI },
274    { M32R2F_INSN_WRITE_RACH_DSI, && case_sem_INSN_WRITE_RACH_DSI },
275    { M32R2F_INSN_PAR_RTE, && case_sem_INSN_PAR_RTE },
276    { M32R2F_INSN_WRITE_RTE, && case_sem_INSN_WRITE_RTE },
277    { M32R2F_INSN_PAR_SLL, && case_sem_INSN_PAR_SLL },
278    { M32R2F_INSN_WRITE_SLL, && case_sem_INSN_WRITE_SLL },
279    { M32R2F_INSN_PAR_SLLI, && case_sem_INSN_PAR_SLLI },
280    { M32R2F_INSN_WRITE_SLLI, && case_sem_INSN_WRITE_SLLI },
281    { M32R2F_INSN_PAR_SRA, && case_sem_INSN_PAR_SRA },
282    { M32R2F_INSN_WRITE_SRA, && case_sem_INSN_WRITE_SRA },
283    { M32R2F_INSN_PAR_SRAI, && case_sem_INSN_PAR_SRAI },
284    { M32R2F_INSN_WRITE_SRAI, && case_sem_INSN_WRITE_SRAI },
285    { M32R2F_INSN_PAR_SRL, && case_sem_INSN_PAR_SRL },
286    { M32R2F_INSN_WRITE_SRL, && case_sem_INSN_WRITE_SRL },
287    { M32R2F_INSN_PAR_SRLI, && case_sem_INSN_PAR_SRLI },
288    { M32R2F_INSN_WRITE_SRLI, && case_sem_INSN_WRITE_SRLI },
289    { M32R2F_INSN_PAR_ST, && case_sem_INSN_PAR_ST },
290    { M32R2F_INSN_WRITE_ST, && case_sem_INSN_WRITE_ST },
291    { M32R2F_INSN_PAR_STB, && case_sem_INSN_PAR_STB },
292    { M32R2F_INSN_WRITE_STB, && case_sem_INSN_WRITE_STB },
293    { M32R2F_INSN_PAR_STH, && case_sem_INSN_PAR_STH },
294    { M32R2F_INSN_WRITE_STH, && case_sem_INSN_WRITE_STH },
295    { M32R2F_INSN_PAR_ST_PLUS, && case_sem_INSN_PAR_ST_PLUS },
296    { M32R2F_INSN_WRITE_ST_PLUS, && case_sem_INSN_WRITE_ST_PLUS },
297    { M32R2F_INSN_PAR_STH_PLUS, && case_sem_INSN_PAR_STH_PLUS },
298    { M32R2F_INSN_WRITE_STH_PLUS, && case_sem_INSN_WRITE_STH_PLUS },
299    { M32R2F_INSN_PAR_STB_PLUS, && case_sem_INSN_PAR_STB_PLUS },
300    { M32R2F_INSN_WRITE_STB_PLUS, && case_sem_INSN_WRITE_STB_PLUS },
301    { M32R2F_INSN_PAR_ST_MINUS, && case_sem_INSN_PAR_ST_MINUS },
302    { M32R2F_INSN_WRITE_ST_MINUS, && case_sem_INSN_WRITE_ST_MINUS },
303    { M32R2F_INSN_PAR_SUB, && case_sem_INSN_PAR_SUB },
304    { M32R2F_INSN_WRITE_SUB, && case_sem_INSN_WRITE_SUB },
305    { M32R2F_INSN_PAR_SUBV, && case_sem_INSN_PAR_SUBV },
306    { M32R2F_INSN_WRITE_SUBV, && case_sem_INSN_WRITE_SUBV },
307    { M32R2F_INSN_PAR_SUBX, && case_sem_INSN_PAR_SUBX },
308    { M32R2F_INSN_WRITE_SUBX, && case_sem_INSN_WRITE_SUBX },
309    { M32R2F_INSN_PAR_TRAP, && case_sem_INSN_PAR_TRAP },
310    { M32R2F_INSN_WRITE_TRAP, && case_sem_INSN_WRITE_TRAP },
311    { M32R2F_INSN_PAR_UNLOCK, && case_sem_INSN_PAR_UNLOCK },
312    { M32R2F_INSN_WRITE_UNLOCK, && case_sem_INSN_WRITE_UNLOCK },
313    { M32R2F_INSN_PAR_PCMPBZ, && case_sem_INSN_PAR_PCMPBZ },
314    { M32R2F_INSN_WRITE_PCMPBZ, && case_sem_INSN_WRITE_PCMPBZ },
315    { M32R2F_INSN_PAR_SADD, && case_sem_INSN_PAR_SADD },
316    { M32R2F_INSN_WRITE_SADD, && case_sem_INSN_WRITE_SADD },
317    { M32R2F_INSN_PAR_MACWU1, && case_sem_INSN_PAR_MACWU1 },
318    { M32R2F_INSN_WRITE_MACWU1, && case_sem_INSN_WRITE_MACWU1 },
319    { M32R2F_INSN_PAR_MSBLO, && case_sem_INSN_PAR_MSBLO },
320    { M32R2F_INSN_WRITE_MSBLO, && case_sem_INSN_WRITE_MSBLO },
321    { M32R2F_INSN_PAR_MULWU1, && case_sem_INSN_PAR_MULWU1 },
322    { M32R2F_INSN_WRITE_MULWU1, && case_sem_INSN_WRITE_MULWU1 },
323    { M32R2F_INSN_PAR_MACLH1, && case_sem_INSN_PAR_MACLH1 },
324    { M32R2F_INSN_WRITE_MACLH1, && case_sem_INSN_WRITE_MACLH1 },
325    { M32R2F_INSN_PAR_SC, && case_sem_INSN_PAR_SC },
326    { M32R2F_INSN_WRITE_SC, && case_sem_INSN_WRITE_SC },
327    { M32R2F_INSN_PAR_SNC, && case_sem_INSN_PAR_SNC },
328    { M32R2F_INSN_WRITE_SNC, && case_sem_INSN_WRITE_SNC },
329    { M32R2F_INSN_PAR_CLRPSW, && case_sem_INSN_PAR_CLRPSW },
330    { M32R2F_INSN_WRITE_CLRPSW, && case_sem_INSN_WRITE_CLRPSW },
331    { M32R2F_INSN_PAR_SETPSW, && case_sem_INSN_PAR_SETPSW },
332    { M32R2F_INSN_WRITE_SETPSW, && case_sem_INSN_WRITE_SETPSW },
333    { M32R2F_INSN_PAR_BTST, && case_sem_INSN_PAR_BTST },
334    { M32R2F_INSN_WRITE_BTST, && case_sem_INSN_WRITE_BTST },
335    { 0, 0 }
336  };
337  int i;
338
339  for (i = 0; labels[i].label != 0; ++i)
340    {
341#if FAST_P
342      CPU_IDESC (current_cpu) [labels[i].index].sem_fast_lab = labels[i].label;
343#else
344      CPU_IDESC (current_cpu) [labels[i].index].sem_full_lab = labels[i].label;
345#endif
346    }
347
348#undef DEFINE_LABELS
349#endif /* DEFINE_LABELS */
350
351#ifdef DEFINE_SWITCH
352
353/* If hyper-fast [well not unnecessarily slow] execution is selected, turn
354   off frills like tracing and profiling.  */
355/* FIXME: A better way would be to have TRACE_RESULT check for something
356   that can cause it to be optimized out.  Another way would be to emit
357   special handlers into the instruction "stream".  */
358
359#if FAST_P
360#undef TRACE_RESULT
361#define TRACE_RESULT(cpu, abuf, name, type, val)
362#endif
363
364#undef GET_ATTR
365#if defined (__STDC__) || defined (ALMOST_STDC) || defined (HAVE_STRINGIZE)
366#define GET_ATTR(cpu, num, attr) CGEN_ATTR_VALUE (NULL, abuf->idesc->attrs, CGEN_INSN_##attr)
367#else
368#define GET_ATTR(cpu, num, attr) CGEN_ATTR_VALUE (NULL, abuf->idesc->attrs, CGEN_INSN_/**/attr)
369#endif
370
371{
372
373#if WITH_SCACHE_PBB
374
375/* Branch to next handler without going around main loop.  */
376#define NEXT(vpc) goto * SEM_ARGBUF (vpc) -> semantic.sem_case
377SWITCH (sem, SEM_ARGBUF (vpc) -> semantic.sem_case)
378
379#else /* ! WITH_SCACHE_PBB */
380
381#define NEXT(vpc) BREAK (sem)
382#ifdef __GNUC__
383#if FAST_P
384  SWITCH (sem, SEM_ARGBUF (sc) -> idesc->sem_fast_lab)
385#else
386  SWITCH (sem, SEM_ARGBUF (sc) -> idesc->sem_full_lab)
387#endif
388#else
389  SWITCH (sem, SEM_ARGBUF (sc) -> idesc->num)
390#endif
391
392#endif /* ! WITH_SCACHE_PBB */
393
394    {
395
396  CASE (sem, INSN_X_INVALID) : /* --invalid-- */
397{
398  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
399  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
400#define FLD(f) abuf->fields.fmt_empty.f
401  int UNUSED written = 0;
402  IADDR UNUSED pc = abuf->addr;
403  vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
404
405  {
406    /* Update the recorded pc in the cpu state struct.
407       Only necessary for WITH_SCACHE case, but to avoid the
408       conditional compilation ....  */
409    SET_H_PC (pc);
410    /* Virtual insns have zero size.  Overwrite vpc with address of next insn
411       using the default-insn-bitsize spec.  When executing insns in parallel
412       we may want to queue the fault and continue execution.  */
413    vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
414    vpc = sim_engine_invalid_insn (current_cpu, pc, vpc);
415  }
416
417#undef FLD
418}
419  NEXT (vpc);
420
421  CASE (sem, INSN_X_AFTER) : /* --after-- */
422{
423  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
424  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
425#define FLD(f) abuf->fields.fmt_empty.f
426  int UNUSED written = 0;
427  IADDR UNUSED pc = abuf->addr;
428  vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
429
430  {
431#if WITH_SCACHE_PBB_M32R2F
432    m32r2f_pbb_after (current_cpu, sem_arg);
433#endif
434  }
435
436#undef FLD
437}
438  NEXT (vpc);
439
440  CASE (sem, INSN_X_BEFORE) : /* --before-- */
441{
442  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
443  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
444#define FLD(f) abuf->fields.fmt_empty.f
445  int UNUSED written = 0;
446  IADDR UNUSED pc = abuf->addr;
447  vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
448
449  {
450#if WITH_SCACHE_PBB_M32R2F
451    m32r2f_pbb_before (current_cpu, sem_arg);
452#endif
453  }
454
455#undef FLD
456}
457  NEXT (vpc);
458
459  CASE (sem, INSN_X_CTI_CHAIN) : /* --cti-chain-- */
460{
461  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
462  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
463#define FLD(f) abuf->fields.fmt_empty.f
464  int UNUSED written = 0;
465  IADDR UNUSED pc = abuf->addr;
466  vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
467
468  {
469#if WITH_SCACHE_PBB_M32R2F
470#ifdef DEFINE_SWITCH
471    vpc = m32r2f_pbb_cti_chain (current_cpu, sem_arg,
472			       pbb_br_type, pbb_br_npc);
473    BREAK (sem);
474#else
475    /* FIXME: Allow provision of explicit ifmt spec in insn spec.  */
476    vpc = m32r2f_pbb_cti_chain (current_cpu, sem_arg,
477			       CPU_PBB_BR_TYPE (current_cpu),
478			       CPU_PBB_BR_NPC (current_cpu));
479#endif
480#endif
481  }
482
483#undef FLD
484}
485  NEXT (vpc);
486
487  CASE (sem, INSN_X_CHAIN) : /* --chain-- */
488{
489  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
490  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
491#define FLD(f) abuf->fields.fmt_empty.f
492  int UNUSED written = 0;
493  IADDR UNUSED pc = abuf->addr;
494  vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
495
496  {
497#if WITH_SCACHE_PBB_M32R2F
498    vpc = m32r2f_pbb_chain (current_cpu, sem_arg);
499#ifdef DEFINE_SWITCH
500    BREAK (sem);
501#endif
502#endif
503  }
504
505#undef FLD
506}
507  NEXT (vpc);
508
509  CASE (sem, INSN_X_BEGIN) : /* --begin-- */
510{
511  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
512  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
513#define FLD(f) abuf->fields.fmt_empty.f
514  int UNUSED written = 0;
515  IADDR UNUSED pc = abuf->addr;
516  vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
517
518  {
519#if WITH_SCACHE_PBB_M32R2F
520#if defined DEFINE_SWITCH || defined FAST_P
521    /* In the switch case FAST_P is a constant, allowing several optimizations
522       in any called inline functions.  */
523    vpc = m32r2f_pbb_begin (current_cpu, FAST_P);
524#else
525#if 0 /* cgen engine can't handle dynamic fast/full switching yet.  */
526    vpc = m32r2f_pbb_begin (current_cpu, STATE_RUN_FAST_P (CPU_STATE (current_cpu)));
527#else
528    vpc = m32r2f_pbb_begin (current_cpu, 0);
529#endif
530#endif
531#endif
532  }
533
534#undef FLD
535}
536  NEXT (vpc);
537
538  CASE (sem, INSN_ADD) : /* add $dr,$sr */
539{
540  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
541  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
542#define FLD(f) abuf->fields.sfmt_add.f
543  int UNUSED written = 0;
544  IADDR UNUSED pc = abuf->addr;
545  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
546
547  {
548    SI opval = ADDSI (* FLD (i_dr), * FLD (i_sr));
549    * FLD (i_dr) = opval;
550    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
551  }
552
553#undef FLD
554}
555  NEXT (vpc);
556
557  CASE (sem, INSN_ADD3) : /* add3 $dr,$sr,$hash$slo16 */
558{
559  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
560  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
561#define FLD(f) abuf->fields.sfmt_add3.f
562  int UNUSED written = 0;
563  IADDR UNUSED pc = abuf->addr;
564  vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
565
566  {
567    SI opval = ADDSI (* FLD (i_sr), FLD (f_simm16));
568    * FLD (i_dr) = opval;
569    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
570  }
571
572#undef FLD
573}
574  NEXT (vpc);
575
576  CASE (sem, INSN_AND) : /* and $dr,$sr */
577{
578  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
579  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
580#define FLD(f) abuf->fields.sfmt_add.f
581  int UNUSED written = 0;
582  IADDR UNUSED pc = abuf->addr;
583  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
584
585  {
586    SI opval = ANDSI (* FLD (i_dr), * FLD (i_sr));
587    * FLD (i_dr) = opval;
588    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
589  }
590
591#undef FLD
592}
593  NEXT (vpc);
594
595  CASE (sem, INSN_AND3) : /* and3 $dr,$sr,$uimm16 */
596{
597  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
598  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
599#define FLD(f) abuf->fields.sfmt_and3.f
600  int UNUSED written = 0;
601  IADDR UNUSED pc = abuf->addr;
602  vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
603
604  {
605    SI opval = ANDSI (* FLD (i_sr), FLD (f_uimm16));
606    * FLD (i_dr) = opval;
607    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
608  }
609
610#undef FLD
611}
612  NEXT (vpc);
613
614  CASE (sem, INSN_OR) : /* or $dr,$sr */
615{
616  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
617  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
618#define FLD(f) abuf->fields.sfmt_add.f
619  int UNUSED written = 0;
620  IADDR UNUSED pc = abuf->addr;
621  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
622
623  {
624    SI opval = ORSI (* FLD (i_dr), * FLD (i_sr));
625    * FLD (i_dr) = opval;
626    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
627  }
628
629#undef FLD
630}
631  NEXT (vpc);
632
633  CASE (sem, INSN_OR3) : /* or3 $dr,$sr,$hash$ulo16 */
634{
635  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
636  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
637#define FLD(f) abuf->fields.sfmt_and3.f
638  int UNUSED written = 0;
639  IADDR UNUSED pc = abuf->addr;
640  vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
641
642  {
643    SI opval = ORSI (* FLD (i_sr), FLD (f_uimm16));
644    * FLD (i_dr) = opval;
645    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
646  }
647
648#undef FLD
649}
650  NEXT (vpc);
651
652  CASE (sem, INSN_XOR) : /* xor $dr,$sr */
653{
654  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
655  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
656#define FLD(f) abuf->fields.sfmt_add.f
657  int UNUSED written = 0;
658  IADDR UNUSED pc = abuf->addr;
659  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
660
661  {
662    SI opval = XORSI (* FLD (i_dr), * FLD (i_sr));
663    * FLD (i_dr) = opval;
664    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
665  }
666
667#undef FLD
668}
669  NEXT (vpc);
670
671  CASE (sem, INSN_XOR3) : /* xor3 $dr,$sr,$uimm16 */
672{
673  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
674  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
675#define FLD(f) abuf->fields.sfmt_and3.f
676  int UNUSED written = 0;
677  IADDR UNUSED pc = abuf->addr;
678  vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
679
680  {
681    SI opval = XORSI (* FLD (i_sr), FLD (f_uimm16));
682    * FLD (i_dr) = opval;
683    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
684  }
685
686#undef FLD
687}
688  NEXT (vpc);
689
690  CASE (sem, INSN_ADDI) : /* addi $dr,$simm8 */
691{
692  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
693  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
694#define FLD(f) abuf->fields.sfmt_addi.f
695  int UNUSED written = 0;
696  IADDR UNUSED pc = abuf->addr;
697  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
698
699  {
700    SI opval = ADDSI (* FLD (i_dr), FLD (f_simm8));
701    * FLD (i_dr) = opval;
702    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
703  }
704
705#undef FLD
706}
707  NEXT (vpc);
708
709  CASE (sem, INSN_ADDV) : /* addv $dr,$sr */
710{
711  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
712  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
713#define FLD(f) abuf->fields.sfmt_add.f
714  int UNUSED written = 0;
715  IADDR UNUSED pc = abuf->addr;
716  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
717
718{
719  SI temp0;BI temp1;
720  temp0 = ADDSI (* FLD (i_dr), * FLD (i_sr));
721  temp1 = ADDOFSI (* FLD (i_dr), * FLD (i_sr), 0);
722  {
723    SI opval = temp0;
724    * FLD (i_dr) = opval;
725    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
726  }
727  {
728    BI opval = temp1;
729    CPU (h_cond) = opval;
730    TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
731  }
732}
733
734#undef FLD
735}
736  NEXT (vpc);
737
738  CASE (sem, INSN_ADDV3) : /* addv3 $dr,$sr,$simm16 */
739{
740  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
741  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
742#define FLD(f) abuf->fields.sfmt_add3.f
743  int UNUSED written = 0;
744  IADDR UNUSED pc = abuf->addr;
745  vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
746
747{
748  SI temp0;BI temp1;
749  temp0 = ADDSI (* FLD (i_sr), FLD (f_simm16));
750  temp1 = ADDOFSI (* FLD (i_sr), FLD (f_simm16), 0);
751  {
752    SI opval = temp0;
753    * FLD (i_dr) = opval;
754    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
755  }
756  {
757    BI opval = temp1;
758    CPU (h_cond) = opval;
759    TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
760  }
761}
762
763#undef FLD
764}
765  NEXT (vpc);
766
767  CASE (sem, INSN_ADDX) : /* addx $dr,$sr */
768{
769  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
770  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
771#define FLD(f) abuf->fields.sfmt_add.f
772  int UNUSED written = 0;
773  IADDR UNUSED pc = abuf->addr;
774  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
775
776{
777  SI temp0;BI temp1;
778  temp0 = ADDCSI (* FLD (i_dr), * FLD (i_sr), CPU (h_cond));
779  temp1 = ADDCFSI (* FLD (i_dr), * FLD (i_sr), CPU (h_cond));
780  {
781    SI opval = temp0;
782    * FLD (i_dr) = opval;
783    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
784  }
785  {
786    BI opval = temp1;
787    CPU (h_cond) = opval;
788    TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
789  }
790}
791
792#undef FLD
793}
794  NEXT (vpc);
795
796  CASE (sem, INSN_BC8) : /* bc.s $disp8 */
797{
798  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
799  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
800#define FLD(f) abuf->fields.sfmt_bl8.f
801  int UNUSED written = 0;
802  IADDR UNUSED pc = abuf->addr;
803  SEM_BRANCH_INIT
804  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
805
806if (CPU (h_cond)) {
807  {
808    USI opval = FLD (i_disp8);
809    SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
810    written |= (1 << 2);
811    TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
812  }
813}
814
815  abuf->written = written;
816  SEM_BRANCH_FINI (vpc);
817#undef FLD
818}
819  NEXT (vpc);
820
821  CASE (sem, INSN_BC24) : /* bc.l $disp24 */
822{
823  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
824  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
825#define FLD(f) abuf->fields.sfmt_bl24.f
826  int UNUSED written = 0;
827  IADDR UNUSED pc = abuf->addr;
828  SEM_BRANCH_INIT
829  vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
830
831if (CPU (h_cond)) {
832  {
833    USI opval = FLD (i_disp24);
834    SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
835    written |= (1 << 2);
836    TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
837  }
838}
839
840  abuf->written = written;
841  SEM_BRANCH_FINI (vpc);
842#undef FLD
843}
844  NEXT (vpc);
845
846  CASE (sem, INSN_BEQ) : /* beq $src1,$src2,$disp16 */
847{
848  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
849  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
850#define FLD(f) abuf->fields.sfmt_beq.f
851  int UNUSED written = 0;
852  IADDR UNUSED pc = abuf->addr;
853  SEM_BRANCH_INIT
854  vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
855
856if (EQSI (* FLD (i_src1), * FLD (i_src2))) {
857  {
858    USI opval = FLD (i_disp16);
859    SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
860    written |= (1 << 3);
861    TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
862  }
863}
864
865  abuf->written = written;
866  SEM_BRANCH_FINI (vpc);
867#undef FLD
868}
869  NEXT (vpc);
870
871  CASE (sem, INSN_BEQZ) : /* beqz $src2,$disp16 */
872{
873  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
874  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
875#define FLD(f) abuf->fields.sfmt_beq.f
876  int UNUSED written = 0;
877  IADDR UNUSED pc = abuf->addr;
878  SEM_BRANCH_INIT
879  vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
880
881if (EQSI (* FLD (i_src2), 0)) {
882  {
883    USI opval = FLD (i_disp16);
884    SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
885    written |= (1 << 2);
886    TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
887  }
888}
889
890  abuf->written = written;
891  SEM_BRANCH_FINI (vpc);
892#undef FLD
893}
894  NEXT (vpc);
895
896  CASE (sem, INSN_BGEZ) : /* bgez $src2,$disp16 */
897{
898  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
899  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
900#define FLD(f) abuf->fields.sfmt_beq.f
901  int UNUSED written = 0;
902  IADDR UNUSED pc = abuf->addr;
903  SEM_BRANCH_INIT
904  vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
905
906if (GESI (* FLD (i_src2), 0)) {
907  {
908    USI opval = FLD (i_disp16);
909    SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
910    written |= (1 << 2);
911    TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
912  }
913}
914
915  abuf->written = written;
916  SEM_BRANCH_FINI (vpc);
917#undef FLD
918}
919  NEXT (vpc);
920
921  CASE (sem, INSN_BGTZ) : /* bgtz $src2,$disp16 */
922{
923  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
924  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
925#define FLD(f) abuf->fields.sfmt_beq.f
926  int UNUSED written = 0;
927  IADDR UNUSED pc = abuf->addr;
928  SEM_BRANCH_INIT
929  vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
930
931if (GTSI (* FLD (i_src2), 0)) {
932  {
933    USI opval = FLD (i_disp16);
934    SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
935    written |= (1 << 2);
936    TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
937  }
938}
939
940  abuf->written = written;
941  SEM_BRANCH_FINI (vpc);
942#undef FLD
943}
944  NEXT (vpc);
945
946  CASE (sem, INSN_BLEZ) : /* blez $src2,$disp16 */
947{
948  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
949  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
950#define FLD(f) abuf->fields.sfmt_beq.f
951  int UNUSED written = 0;
952  IADDR UNUSED pc = abuf->addr;
953  SEM_BRANCH_INIT
954  vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
955
956if (LESI (* FLD (i_src2), 0)) {
957  {
958    USI opval = FLD (i_disp16);
959    SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
960    written |= (1 << 2);
961    TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
962  }
963}
964
965  abuf->written = written;
966  SEM_BRANCH_FINI (vpc);
967#undef FLD
968}
969  NEXT (vpc);
970
971  CASE (sem, INSN_BLTZ) : /* bltz $src2,$disp16 */
972{
973  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
974  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
975#define FLD(f) abuf->fields.sfmt_beq.f
976  int UNUSED written = 0;
977  IADDR UNUSED pc = abuf->addr;
978  SEM_BRANCH_INIT
979  vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
980
981if (LTSI (* FLD (i_src2), 0)) {
982  {
983    USI opval = FLD (i_disp16);
984    SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
985    written |= (1 << 2);
986    TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
987  }
988}
989
990  abuf->written = written;
991  SEM_BRANCH_FINI (vpc);
992#undef FLD
993}
994  NEXT (vpc);
995
996  CASE (sem, INSN_BNEZ) : /* bnez $src2,$disp16 */
997{
998  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
999  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1000#define FLD(f) abuf->fields.sfmt_beq.f
1001  int UNUSED written = 0;
1002  IADDR UNUSED pc = abuf->addr;
1003  SEM_BRANCH_INIT
1004  vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1005
1006if (NESI (* FLD (i_src2), 0)) {
1007  {
1008    USI opval = FLD (i_disp16);
1009    SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
1010    written |= (1 << 2);
1011    TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1012  }
1013}
1014
1015  abuf->written = written;
1016  SEM_BRANCH_FINI (vpc);
1017#undef FLD
1018}
1019  NEXT (vpc);
1020
1021  CASE (sem, INSN_BL8) : /* bl.s $disp8 */
1022{
1023  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1024  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1025#define FLD(f) abuf->fields.sfmt_bl8.f
1026  int UNUSED written = 0;
1027  IADDR UNUSED pc = abuf->addr;
1028  SEM_BRANCH_INIT
1029  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1030
1031{
1032  {
1033    SI opval = ADDSI (ANDSI (pc, -4), 4);
1034    CPU (h_gr[((UINT) 14)]) = opval;
1035    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1036  }
1037  {
1038    USI opval = FLD (i_disp8);
1039    SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
1040    TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1041  }
1042}
1043
1044  SEM_BRANCH_FINI (vpc);
1045#undef FLD
1046}
1047  NEXT (vpc);
1048
1049  CASE (sem, INSN_BL24) : /* bl.l $disp24 */
1050{
1051  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1052  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1053#define FLD(f) abuf->fields.sfmt_bl24.f
1054  int UNUSED written = 0;
1055  IADDR UNUSED pc = abuf->addr;
1056  SEM_BRANCH_INIT
1057  vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1058
1059{
1060  {
1061    SI opval = ADDSI (pc, 4);
1062    CPU (h_gr[((UINT) 14)]) = opval;
1063    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1064  }
1065  {
1066    USI opval = FLD (i_disp24);
1067    SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
1068    TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1069  }
1070}
1071
1072  SEM_BRANCH_FINI (vpc);
1073#undef FLD
1074}
1075  NEXT (vpc);
1076
1077  CASE (sem, INSN_BCL8) : /* bcl.s $disp8 */
1078{
1079  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1080  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1081#define FLD(f) abuf->fields.sfmt_bl8.f
1082  int UNUSED written = 0;
1083  IADDR UNUSED pc = abuf->addr;
1084  SEM_BRANCH_INIT
1085  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1086
1087if (CPU (h_cond)) {
1088{
1089  {
1090    SI opval = ADDSI (ANDSI (pc, -4), 4);
1091    CPU (h_gr[((UINT) 14)]) = opval;
1092    written |= (1 << 3);
1093    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1094  }
1095  {
1096    USI opval = FLD (i_disp8);
1097    SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
1098    written |= (1 << 4);
1099    TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1100  }
1101}
1102}
1103
1104  abuf->written = written;
1105  SEM_BRANCH_FINI (vpc);
1106#undef FLD
1107}
1108  NEXT (vpc);
1109
1110  CASE (sem, INSN_BCL24) : /* bcl.l $disp24 */
1111{
1112  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1113  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1114#define FLD(f) abuf->fields.sfmt_bl24.f
1115  int UNUSED written = 0;
1116  IADDR UNUSED pc = abuf->addr;
1117  SEM_BRANCH_INIT
1118  vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1119
1120if (CPU (h_cond)) {
1121{
1122  {
1123    SI opval = ADDSI (pc, 4);
1124    CPU (h_gr[((UINT) 14)]) = opval;
1125    written |= (1 << 3);
1126    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1127  }
1128  {
1129    USI opval = FLD (i_disp24);
1130    SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
1131    written |= (1 << 4);
1132    TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1133  }
1134}
1135}
1136
1137  abuf->written = written;
1138  SEM_BRANCH_FINI (vpc);
1139#undef FLD
1140}
1141  NEXT (vpc);
1142
1143  CASE (sem, INSN_BNC8) : /* bnc.s $disp8 */
1144{
1145  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1146  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1147#define FLD(f) abuf->fields.sfmt_bl8.f
1148  int UNUSED written = 0;
1149  IADDR UNUSED pc = abuf->addr;
1150  SEM_BRANCH_INIT
1151  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1152
1153if (NOTBI (CPU (h_cond))) {
1154  {
1155    USI opval = FLD (i_disp8);
1156    SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
1157    written |= (1 << 2);
1158    TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1159  }
1160}
1161
1162  abuf->written = written;
1163  SEM_BRANCH_FINI (vpc);
1164#undef FLD
1165}
1166  NEXT (vpc);
1167
1168  CASE (sem, INSN_BNC24) : /* bnc.l $disp24 */
1169{
1170  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1171  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1172#define FLD(f) abuf->fields.sfmt_bl24.f
1173  int UNUSED written = 0;
1174  IADDR UNUSED pc = abuf->addr;
1175  SEM_BRANCH_INIT
1176  vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1177
1178if (NOTBI (CPU (h_cond))) {
1179  {
1180    USI opval = FLD (i_disp24);
1181    SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
1182    written |= (1 << 2);
1183    TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1184  }
1185}
1186
1187  abuf->written = written;
1188  SEM_BRANCH_FINI (vpc);
1189#undef FLD
1190}
1191  NEXT (vpc);
1192
1193  CASE (sem, INSN_BNE) : /* bne $src1,$src2,$disp16 */
1194{
1195  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1196  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1197#define FLD(f) abuf->fields.sfmt_beq.f
1198  int UNUSED written = 0;
1199  IADDR UNUSED pc = abuf->addr;
1200  SEM_BRANCH_INIT
1201  vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1202
1203if (NESI (* FLD (i_src1), * FLD (i_src2))) {
1204  {
1205    USI opval = FLD (i_disp16);
1206    SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
1207    written |= (1 << 3);
1208    TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1209  }
1210}
1211
1212  abuf->written = written;
1213  SEM_BRANCH_FINI (vpc);
1214#undef FLD
1215}
1216  NEXT (vpc);
1217
1218  CASE (sem, INSN_BRA8) : /* bra.s $disp8 */
1219{
1220  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1221  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1222#define FLD(f) abuf->fields.sfmt_bl8.f
1223  int UNUSED written = 0;
1224  IADDR UNUSED pc = abuf->addr;
1225  SEM_BRANCH_INIT
1226  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1227
1228  {
1229    USI opval = FLD (i_disp8);
1230    SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
1231    TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1232  }
1233
1234  SEM_BRANCH_FINI (vpc);
1235#undef FLD
1236}
1237  NEXT (vpc);
1238
1239  CASE (sem, INSN_BRA24) : /* bra.l $disp24 */
1240{
1241  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1242  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1243#define FLD(f) abuf->fields.sfmt_bl24.f
1244  int UNUSED written = 0;
1245  IADDR UNUSED pc = abuf->addr;
1246  SEM_BRANCH_INIT
1247  vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1248
1249  {
1250    USI opval = FLD (i_disp24);
1251    SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
1252    TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1253  }
1254
1255  SEM_BRANCH_FINI (vpc);
1256#undef FLD
1257}
1258  NEXT (vpc);
1259
1260  CASE (sem, INSN_BNCL8) : /* bncl.s $disp8 */
1261{
1262  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1263  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1264#define FLD(f) abuf->fields.sfmt_bl8.f
1265  int UNUSED written = 0;
1266  IADDR UNUSED pc = abuf->addr;
1267  SEM_BRANCH_INIT
1268  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1269
1270if (NOTBI (CPU (h_cond))) {
1271{
1272  {
1273    SI opval = ADDSI (ANDSI (pc, -4), 4);
1274    CPU (h_gr[((UINT) 14)]) = opval;
1275    written |= (1 << 3);
1276    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1277  }
1278  {
1279    USI opval = FLD (i_disp8);
1280    SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
1281    written |= (1 << 4);
1282    TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1283  }
1284}
1285}
1286
1287  abuf->written = written;
1288  SEM_BRANCH_FINI (vpc);
1289#undef FLD
1290}
1291  NEXT (vpc);
1292
1293  CASE (sem, INSN_BNCL24) : /* bncl.l $disp24 */
1294{
1295  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1296  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1297#define FLD(f) abuf->fields.sfmt_bl24.f
1298  int UNUSED written = 0;
1299  IADDR UNUSED pc = abuf->addr;
1300  SEM_BRANCH_INIT
1301  vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1302
1303if (NOTBI (CPU (h_cond))) {
1304{
1305  {
1306    SI opval = ADDSI (pc, 4);
1307    CPU (h_gr[((UINT) 14)]) = opval;
1308    written |= (1 << 3);
1309    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1310  }
1311  {
1312    USI opval = FLD (i_disp24);
1313    SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
1314    written |= (1 << 4);
1315    TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1316  }
1317}
1318}
1319
1320  abuf->written = written;
1321  SEM_BRANCH_FINI (vpc);
1322#undef FLD
1323}
1324  NEXT (vpc);
1325
1326  CASE (sem, INSN_CMP) : /* cmp $src1,$src2 */
1327{
1328  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1329  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1330#define FLD(f) abuf->fields.sfmt_st_plus.f
1331  int UNUSED written = 0;
1332  IADDR UNUSED pc = abuf->addr;
1333  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1334
1335  {
1336    BI opval = LTSI (* FLD (i_src1), * FLD (i_src2));
1337    CPU (h_cond) = opval;
1338    TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
1339  }
1340
1341#undef FLD
1342}
1343  NEXT (vpc);
1344
1345  CASE (sem, INSN_CMPI) : /* cmpi $src2,$simm16 */
1346{
1347  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1348  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1349#define FLD(f) abuf->fields.sfmt_st_d.f
1350  int UNUSED written = 0;
1351  IADDR UNUSED pc = abuf->addr;
1352  vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1353
1354  {
1355    BI opval = LTSI (* FLD (i_src2), FLD (f_simm16));
1356    CPU (h_cond) = opval;
1357    TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
1358  }
1359
1360#undef FLD
1361}
1362  NEXT (vpc);
1363
1364  CASE (sem, INSN_CMPU) : /* cmpu $src1,$src2 */
1365{
1366  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1367  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1368#define FLD(f) abuf->fields.sfmt_st_plus.f
1369  int UNUSED written = 0;
1370  IADDR UNUSED pc = abuf->addr;
1371  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1372
1373  {
1374    BI opval = LTUSI (* FLD (i_src1), * FLD (i_src2));
1375    CPU (h_cond) = opval;
1376    TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
1377  }
1378
1379#undef FLD
1380}
1381  NEXT (vpc);
1382
1383  CASE (sem, INSN_CMPUI) : /* cmpui $src2,$simm16 */
1384{
1385  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1386  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1387#define FLD(f) abuf->fields.sfmt_st_d.f
1388  int UNUSED written = 0;
1389  IADDR UNUSED pc = abuf->addr;
1390  vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1391
1392  {
1393    BI opval = LTUSI (* FLD (i_src2), FLD (f_simm16));
1394    CPU (h_cond) = opval;
1395    TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
1396  }
1397
1398#undef FLD
1399}
1400  NEXT (vpc);
1401
1402  CASE (sem, INSN_CMPEQ) : /* cmpeq $src1,$src2 */
1403{
1404  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1405  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1406#define FLD(f) abuf->fields.sfmt_st_plus.f
1407  int UNUSED written = 0;
1408  IADDR UNUSED pc = abuf->addr;
1409  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1410
1411  {
1412    BI opval = EQSI (* FLD (i_src1), * FLD (i_src2));
1413    CPU (h_cond) = opval;
1414    TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
1415  }
1416
1417#undef FLD
1418}
1419  NEXT (vpc);
1420
1421  CASE (sem, INSN_CMPZ) : /* cmpz $src2 */
1422{
1423  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1424  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1425#define FLD(f) abuf->fields.sfmt_st_plus.f
1426  int UNUSED written = 0;
1427  IADDR UNUSED pc = abuf->addr;
1428  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1429
1430  {
1431    BI opval = EQSI (* FLD (i_src2), 0);
1432    CPU (h_cond) = opval;
1433    TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
1434  }
1435
1436#undef FLD
1437}
1438  NEXT (vpc);
1439
1440  CASE (sem, INSN_DIV) : /* div $dr,$sr */
1441{
1442  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1443  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1444#define FLD(f) abuf->fields.sfmt_add.f
1445  int UNUSED written = 0;
1446  IADDR UNUSED pc = abuf->addr;
1447  vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1448
1449if (NESI (* FLD (i_sr), 0)) {
1450  {
1451    SI opval = DIVSI (* FLD (i_dr), * FLD (i_sr));
1452    * FLD (i_dr) = opval;
1453    written |= (1 << 2);
1454    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1455  }
1456}
1457
1458  abuf->written = written;
1459#undef FLD
1460}
1461  NEXT (vpc);
1462
1463  CASE (sem, INSN_DIVU) : /* divu $dr,$sr */
1464{
1465  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1466  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1467#define FLD(f) abuf->fields.sfmt_add.f
1468  int UNUSED written = 0;
1469  IADDR UNUSED pc = abuf->addr;
1470  vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1471
1472if (NESI (* FLD (i_sr), 0)) {
1473  {
1474    SI opval = UDIVSI (* FLD (i_dr), * FLD (i_sr));
1475    * FLD (i_dr) = opval;
1476    written |= (1 << 2);
1477    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1478  }
1479}
1480
1481  abuf->written = written;
1482#undef FLD
1483}
1484  NEXT (vpc);
1485
1486  CASE (sem, INSN_REM) : /* rem $dr,$sr */
1487{
1488  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1489  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1490#define FLD(f) abuf->fields.sfmt_add.f
1491  int UNUSED written = 0;
1492  IADDR UNUSED pc = abuf->addr;
1493  vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1494
1495if (NESI (* FLD (i_sr), 0)) {
1496  {
1497    SI opval = MODSI (* FLD (i_dr), * FLD (i_sr));
1498    * FLD (i_dr) = opval;
1499    written |= (1 << 2);
1500    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1501  }
1502}
1503
1504  abuf->written = written;
1505#undef FLD
1506}
1507  NEXT (vpc);
1508
1509  CASE (sem, INSN_REMU) : /* remu $dr,$sr */
1510{
1511  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1512  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1513#define FLD(f) abuf->fields.sfmt_add.f
1514  int UNUSED written = 0;
1515  IADDR UNUSED pc = abuf->addr;
1516  vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1517
1518if (NESI (* FLD (i_sr), 0)) {
1519  {
1520    SI opval = UMODSI (* FLD (i_dr), * FLD (i_sr));
1521    * FLD (i_dr) = opval;
1522    written |= (1 << 2);
1523    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1524  }
1525}
1526
1527  abuf->written = written;
1528#undef FLD
1529}
1530  NEXT (vpc);
1531
1532  CASE (sem, INSN_REMH) : /* remh $dr,$sr */
1533{
1534  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1535  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1536#define FLD(f) abuf->fields.sfmt_add.f
1537  int UNUSED written = 0;
1538  IADDR UNUSED pc = abuf->addr;
1539  vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1540
1541if (NESI (* FLD (i_sr), 0)) {
1542  {
1543    SI opval = MODSI (EXTHISI (TRUNCSIHI (* FLD (i_dr))), * FLD (i_sr));
1544    * FLD (i_dr) = opval;
1545    written |= (1 << 2);
1546    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1547  }
1548}
1549
1550  abuf->written = written;
1551#undef FLD
1552}
1553  NEXT (vpc);
1554
1555  CASE (sem, INSN_REMUH) : /* remuh $dr,$sr */
1556{
1557  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1558  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1559#define FLD(f) abuf->fields.sfmt_add.f
1560  int UNUSED written = 0;
1561  IADDR UNUSED pc = abuf->addr;
1562  vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1563
1564if (NESI (* FLD (i_sr), 0)) {
1565  {
1566    SI opval = UMODSI (* FLD (i_dr), * FLD (i_sr));
1567    * FLD (i_dr) = opval;
1568    written |= (1 << 2);
1569    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1570  }
1571}
1572
1573  abuf->written = written;
1574#undef FLD
1575}
1576  NEXT (vpc);
1577
1578  CASE (sem, INSN_REMB) : /* remb $dr,$sr */
1579{
1580  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1581  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1582#define FLD(f) abuf->fields.sfmt_add.f
1583  int UNUSED written = 0;
1584  IADDR UNUSED pc = abuf->addr;
1585  vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1586
1587if (NESI (* FLD (i_sr), 0)) {
1588  {
1589    SI opval = MODSI (EXTBISI (TRUNCSIBI (* FLD (i_dr))), * FLD (i_sr));
1590    * FLD (i_dr) = opval;
1591    written |= (1 << 2);
1592    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1593  }
1594}
1595
1596  abuf->written = written;
1597#undef FLD
1598}
1599  NEXT (vpc);
1600
1601  CASE (sem, INSN_REMUB) : /* remub $dr,$sr */
1602{
1603  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1604  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1605#define FLD(f) abuf->fields.sfmt_add.f
1606  int UNUSED written = 0;
1607  IADDR UNUSED pc = abuf->addr;
1608  vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1609
1610if (NESI (* FLD (i_sr), 0)) {
1611  {
1612    SI opval = UMODSI (* FLD (i_dr), * FLD (i_sr));
1613    * FLD (i_dr) = opval;
1614    written |= (1 << 2);
1615    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1616  }
1617}
1618
1619  abuf->written = written;
1620#undef FLD
1621}
1622  NEXT (vpc);
1623
1624  CASE (sem, INSN_DIVUH) : /* divuh $dr,$sr */
1625{
1626  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1627  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1628#define FLD(f) abuf->fields.sfmt_add.f
1629  int UNUSED written = 0;
1630  IADDR UNUSED pc = abuf->addr;
1631  vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1632
1633if (NESI (* FLD (i_sr), 0)) {
1634  {
1635    SI opval = UDIVSI (* FLD (i_dr), * FLD (i_sr));
1636    * FLD (i_dr) = opval;
1637    written |= (1 << 2);
1638    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1639  }
1640}
1641
1642  abuf->written = written;
1643#undef FLD
1644}
1645  NEXT (vpc);
1646
1647  CASE (sem, INSN_DIVB) : /* divb $dr,$sr */
1648{
1649  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1650  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1651#define FLD(f) abuf->fields.sfmt_add.f
1652  int UNUSED written = 0;
1653  IADDR UNUSED pc = abuf->addr;
1654  vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1655
1656if (NESI (* FLD (i_sr), 0)) {
1657  {
1658    SI opval = DIVSI (EXTBISI (TRUNCSIBI (* FLD (i_dr))), * FLD (i_sr));
1659    * FLD (i_dr) = opval;
1660    written |= (1 << 2);
1661    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1662  }
1663}
1664
1665  abuf->written = written;
1666#undef FLD
1667}
1668  NEXT (vpc);
1669
1670  CASE (sem, INSN_DIVUB) : /* divub $dr,$sr */
1671{
1672  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1673  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1674#define FLD(f) abuf->fields.sfmt_add.f
1675  int UNUSED written = 0;
1676  IADDR UNUSED pc = abuf->addr;
1677  vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1678
1679if (NESI (* FLD (i_sr), 0)) {
1680  {
1681    SI opval = UDIVSI (* FLD (i_dr), * FLD (i_sr));
1682    * FLD (i_dr) = opval;
1683    written |= (1 << 2);
1684    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1685  }
1686}
1687
1688  abuf->written = written;
1689#undef FLD
1690}
1691  NEXT (vpc);
1692
1693  CASE (sem, INSN_DIVH) : /* divh $dr,$sr */
1694{
1695  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1696  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1697#define FLD(f) abuf->fields.sfmt_add.f
1698  int UNUSED written = 0;
1699  IADDR UNUSED pc = abuf->addr;
1700  vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1701
1702if (NESI (* FLD (i_sr), 0)) {
1703  {
1704    SI opval = DIVSI (EXTHISI (TRUNCSIHI (* FLD (i_dr))), * FLD (i_sr));
1705    * FLD (i_dr) = opval;
1706    written |= (1 << 2);
1707    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1708  }
1709}
1710
1711  abuf->written = written;
1712#undef FLD
1713}
1714  NEXT (vpc);
1715
1716  CASE (sem, INSN_JC) : /* jc $sr */
1717{
1718  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1719  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1720#define FLD(f) abuf->fields.sfmt_jl.f
1721  int UNUSED written = 0;
1722  IADDR UNUSED pc = abuf->addr;
1723  SEM_BRANCH_INIT
1724  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1725
1726if (CPU (h_cond)) {
1727  {
1728    USI opval = ANDSI (* FLD (i_sr), -4);
1729    SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
1730    written |= (1 << 2);
1731    TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1732  }
1733}
1734
1735  abuf->written = written;
1736  SEM_BRANCH_FINI (vpc);
1737#undef FLD
1738}
1739  NEXT (vpc);
1740
1741  CASE (sem, INSN_JNC) : /* jnc $sr */
1742{
1743  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1744  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1745#define FLD(f) abuf->fields.sfmt_jl.f
1746  int UNUSED written = 0;
1747  IADDR UNUSED pc = abuf->addr;
1748  SEM_BRANCH_INIT
1749  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1750
1751if (NOTBI (CPU (h_cond))) {
1752  {
1753    USI opval = ANDSI (* FLD (i_sr), -4);
1754    SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
1755    written |= (1 << 2);
1756    TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1757  }
1758}
1759
1760  abuf->written = written;
1761  SEM_BRANCH_FINI (vpc);
1762#undef FLD
1763}
1764  NEXT (vpc);
1765
1766  CASE (sem, INSN_JL) : /* jl $sr */
1767{
1768  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1769  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1770#define FLD(f) abuf->fields.sfmt_jl.f
1771  int UNUSED written = 0;
1772  IADDR UNUSED pc = abuf->addr;
1773  SEM_BRANCH_INIT
1774  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1775
1776{
1777  SI temp0;USI temp1;
1778  temp0 = ADDSI (ANDSI (pc, -4), 4);
1779  temp1 = ANDSI (* FLD (i_sr), -4);
1780  {
1781    SI opval = temp0;
1782    CPU (h_gr[((UINT) 14)]) = opval;
1783    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1784  }
1785  {
1786    USI opval = temp1;
1787    SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
1788    TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1789  }
1790}
1791
1792  SEM_BRANCH_FINI (vpc);
1793#undef FLD
1794}
1795  NEXT (vpc);
1796
1797  CASE (sem, INSN_JMP) : /* jmp $sr */
1798{
1799  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1800  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1801#define FLD(f) abuf->fields.sfmt_jl.f
1802  int UNUSED written = 0;
1803  IADDR UNUSED pc = abuf->addr;
1804  SEM_BRANCH_INIT
1805  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1806
1807  {
1808    USI opval = ANDSI (* FLD (i_sr), -4);
1809    SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
1810    TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1811  }
1812
1813  SEM_BRANCH_FINI (vpc);
1814#undef FLD
1815}
1816  NEXT (vpc);
1817
1818  CASE (sem, INSN_LD) : /* ld $dr,@$sr */
1819{
1820  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1821  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1822#define FLD(f) abuf->fields.sfmt_ld_plus.f
1823  int UNUSED written = 0;
1824  IADDR UNUSED pc = abuf->addr;
1825  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1826
1827  {
1828    SI opval = GETMEMSI (current_cpu, pc, * FLD (i_sr));
1829    * FLD (i_dr) = opval;
1830    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1831  }
1832
1833#undef FLD
1834}
1835  NEXT (vpc);
1836
1837  CASE (sem, INSN_LD_D) : /* ld $dr,@($slo16,$sr) */
1838{
1839  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1840  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1841#define FLD(f) abuf->fields.sfmt_add3.f
1842  int UNUSED written = 0;
1843  IADDR UNUSED pc = abuf->addr;
1844  vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1845
1846  {
1847    SI opval = GETMEMSI (current_cpu, pc, ADDSI (* FLD (i_sr), FLD (f_simm16)));
1848    * FLD (i_dr) = opval;
1849    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1850  }
1851
1852#undef FLD
1853}
1854  NEXT (vpc);
1855
1856  CASE (sem, INSN_LDB) : /* ldb $dr,@$sr */
1857{
1858  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1859  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1860#define FLD(f) abuf->fields.sfmt_ld_plus.f
1861  int UNUSED written = 0;
1862  IADDR UNUSED pc = abuf->addr;
1863  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1864
1865  {
1866    SI opval = EXTQISI (GETMEMQI (current_cpu, pc, * FLD (i_sr)));
1867    * FLD (i_dr) = opval;
1868    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1869  }
1870
1871#undef FLD
1872}
1873  NEXT (vpc);
1874
1875  CASE (sem, INSN_LDB_D) : /* ldb $dr,@($slo16,$sr) */
1876{
1877  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1878  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1879#define FLD(f) abuf->fields.sfmt_add3.f
1880  int UNUSED written = 0;
1881  IADDR UNUSED pc = abuf->addr;
1882  vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1883
1884  {
1885    SI opval = EXTQISI (GETMEMQI (current_cpu, pc, ADDSI (* FLD (i_sr), FLD (f_simm16))));
1886    * FLD (i_dr) = opval;
1887    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1888  }
1889
1890#undef FLD
1891}
1892  NEXT (vpc);
1893
1894  CASE (sem, INSN_LDH) : /* ldh $dr,@$sr */
1895{
1896  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1897  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1898#define FLD(f) abuf->fields.sfmt_ld_plus.f
1899  int UNUSED written = 0;
1900  IADDR UNUSED pc = abuf->addr;
1901  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1902
1903  {
1904    SI opval = EXTHISI (GETMEMHI (current_cpu, pc, * FLD (i_sr)));
1905    * FLD (i_dr) = opval;
1906    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1907  }
1908
1909#undef FLD
1910}
1911  NEXT (vpc);
1912
1913  CASE (sem, INSN_LDH_D) : /* ldh $dr,@($slo16,$sr) */
1914{
1915  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1916  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1917#define FLD(f) abuf->fields.sfmt_add3.f
1918  int UNUSED written = 0;
1919  IADDR UNUSED pc = abuf->addr;
1920  vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1921
1922  {
1923    SI opval = EXTHISI (GETMEMHI (current_cpu, pc, ADDSI (* FLD (i_sr), FLD (f_simm16))));
1924    * FLD (i_dr) = opval;
1925    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1926  }
1927
1928#undef FLD
1929}
1930  NEXT (vpc);
1931
1932  CASE (sem, INSN_LDUB) : /* ldub $dr,@$sr */
1933{
1934  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1935  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1936#define FLD(f) abuf->fields.sfmt_ld_plus.f
1937  int UNUSED written = 0;
1938  IADDR UNUSED pc = abuf->addr;
1939  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1940
1941  {
1942    SI opval = ZEXTQISI (GETMEMQI (current_cpu, pc, * FLD (i_sr)));
1943    * FLD (i_dr) = opval;
1944    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1945  }
1946
1947#undef FLD
1948}
1949  NEXT (vpc);
1950
1951  CASE (sem, INSN_LDUB_D) : /* ldub $dr,@($slo16,$sr) */
1952{
1953  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1954  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1955#define FLD(f) abuf->fields.sfmt_add3.f
1956  int UNUSED written = 0;
1957  IADDR UNUSED pc = abuf->addr;
1958  vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1959
1960  {
1961    SI opval = ZEXTQISI (GETMEMQI (current_cpu, pc, ADDSI (* FLD (i_sr), FLD (f_simm16))));
1962    * FLD (i_dr) = opval;
1963    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1964  }
1965
1966#undef FLD
1967}
1968  NEXT (vpc);
1969
1970  CASE (sem, INSN_LDUH) : /* lduh $dr,@$sr */
1971{
1972  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1973  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1974#define FLD(f) abuf->fields.sfmt_ld_plus.f
1975  int UNUSED written = 0;
1976  IADDR UNUSED pc = abuf->addr;
1977  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1978
1979  {
1980    SI opval = ZEXTHISI (GETMEMHI (current_cpu, pc, * FLD (i_sr)));
1981    * FLD (i_dr) = opval;
1982    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1983  }
1984
1985#undef FLD
1986}
1987  NEXT (vpc);
1988
1989  CASE (sem, INSN_LDUH_D) : /* lduh $dr,@($slo16,$sr) */
1990{
1991  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1992  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1993#define FLD(f) abuf->fields.sfmt_add3.f
1994  int UNUSED written = 0;
1995  IADDR UNUSED pc = abuf->addr;
1996  vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1997
1998  {
1999    SI opval = ZEXTHISI (GETMEMHI (current_cpu, pc, ADDSI (* FLD (i_sr), FLD (f_simm16))));
2000    * FLD (i_dr) = opval;
2001    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
2002  }
2003
2004#undef FLD
2005}
2006  NEXT (vpc);
2007
2008  CASE (sem, INSN_LD_PLUS) : /* ld $dr,@$sr+ */
2009{
2010  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2011  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2012#define FLD(f) abuf->fields.sfmt_ld_plus.f
2013  int UNUSED written = 0;
2014  IADDR UNUSED pc = abuf->addr;
2015  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2016
2017{
2018  SI temp0;SI temp1;
2019  temp0 = GETMEMSI (current_cpu, pc, * FLD (i_sr));
2020  temp1 = ADDSI (* FLD (i_sr), 4);
2021  {
2022    SI opval = temp0;
2023    * FLD (i_dr) = opval;
2024    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
2025  }
2026  {
2027    SI opval = temp1;
2028    * FLD (i_sr) = opval;
2029    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
2030  }
2031}
2032
2033#undef FLD
2034}
2035  NEXT (vpc);
2036
2037  CASE (sem, INSN_LD24) : /* ld24 $dr,$uimm24 */
2038{
2039  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2040  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2041#define FLD(f) abuf->fields.sfmt_ld24.f
2042  int UNUSED written = 0;
2043  IADDR UNUSED pc = abuf->addr;
2044  vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2045
2046  {
2047    SI opval = FLD (i_uimm24);
2048    * FLD (i_dr) = opval;
2049    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
2050  }
2051
2052#undef FLD
2053}
2054  NEXT (vpc);
2055
2056  CASE (sem, INSN_LDI8) : /* ldi8 $dr,$simm8 */
2057{
2058  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2059  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2060#define FLD(f) abuf->fields.sfmt_addi.f
2061  int UNUSED written = 0;
2062  IADDR UNUSED pc = abuf->addr;
2063  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2064
2065  {
2066    SI opval = FLD (f_simm8);
2067    * FLD (i_dr) = opval;
2068    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
2069  }
2070
2071#undef FLD
2072}
2073  NEXT (vpc);
2074
2075  CASE (sem, INSN_LDI16) : /* ldi16 $dr,$hash$slo16 */
2076{
2077  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2078  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2079#define FLD(f) abuf->fields.sfmt_add3.f
2080  int UNUSED written = 0;
2081  IADDR UNUSED pc = abuf->addr;
2082  vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2083
2084  {
2085    SI opval = FLD (f_simm16);
2086    * FLD (i_dr) = opval;
2087    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
2088  }
2089
2090#undef FLD
2091}
2092  NEXT (vpc);
2093
2094  CASE (sem, INSN_LOCK) : /* lock $dr,@$sr */
2095{
2096  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2097  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2098#define FLD(f) abuf->fields.sfmt_ld_plus.f
2099  int UNUSED written = 0;
2100  IADDR UNUSED pc = abuf->addr;
2101  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2102
2103{
2104  {
2105    BI opval = 1;
2106    CPU (h_lock) = opval;
2107    TRACE_RESULT (current_cpu, abuf, "lock", 'x', opval);
2108  }
2109  {
2110    SI opval = GETMEMSI (current_cpu, pc, * FLD (i_sr));
2111    * FLD (i_dr) = opval;
2112    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
2113  }
2114}
2115
2116#undef FLD
2117}
2118  NEXT (vpc);
2119
2120  CASE (sem, INSN_MACHI_A) : /* machi $src1,$src2,$acc */
2121{
2122  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2123  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2124#define FLD(f) abuf->fields.sfmt_machi_a.f
2125  int UNUSED written = 0;
2126  IADDR UNUSED pc = abuf->addr;
2127  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2128
2129  {
2130    DI opval = SRADI (SLLDI (ADDDI (GET_H_ACCUMS (FLD (f_acc)), MULDI (EXTSIDI (ANDSI (* FLD (i_src1), 0xffff0000)), EXTHIDI (TRUNCSIHI (SRASI (* FLD (i_src2), 16))))), 8), 8);
2131    SET_H_ACCUMS (FLD (f_acc), opval);
2132    TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
2133  }
2134
2135#undef FLD
2136}
2137  NEXT (vpc);
2138
2139  CASE (sem, INSN_MACLO_A) : /* maclo $src1,$src2,$acc */
2140{
2141  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2142  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2143#define FLD(f) abuf->fields.sfmt_machi_a.f
2144  int UNUSED written = 0;
2145  IADDR UNUSED pc = abuf->addr;
2146  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2147
2148  {
2149    DI opval = SRADI (SLLDI (ADDDI (GET_H_ACCUMS (FLD (f_acc)), MULDI (EXTSIDI (SLLSI (* FLD (i_src1), 16)), EXTHIDI (TRUNCSIHI (* FLD (i_src2))))), 8), 8);
2150    SET_H_ACCUMS (FLD (f_acc), opval);
2151    TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
2152  }
2153
2154#undef FLD
2155}
2156  NEXT (vpc);
2157
2158  CASE (sem, INSN_MACWHI_A) : /* macwhi $src1,$src2,$acc */
2159{
2160  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2161  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2162#define FLD(f) abuf->fields.sfmt_machi_a.f
2163  int UNUSED written = 0;
2164  IADDR UNUSED pc = abuf->addr;
2165  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2166
2167  {
2168    DI opval = ADDDI (GET_H_ACCUMS (FLD (f_acc)), MULDI (EXTSIDI (* FLD (i_src1)), EXTHIDI (TRUNCSIHI (SRASI (* FLD (i_src2), 16)))));
2169    SET_H_ACCUMS (FLD (f_acc), opval);
2170    TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
2171  }
2172
2173#undef FLD
2174}
2175  NEXT (vpc);
2176
2177  CASE (sem, INSN_MACWLO_A) : /* macwlo $src1,$src2,$acc */
2178{
2179  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2180  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2181#define FLD(f) abuf->fields.sfmt_machi_a.f
2182  int UNUSED written = 0;
2183  IADDR UNUSED pc = abuf->addr;
2184  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2185
2186  {
2187    DI opval = ADDDI (GET_H_ACCUMS (FLD (f_acc)), MULDI (EXTSIDI (* FLD (i_src1)), EXTHIDI (TRUNCSIHI (* FLD (i_src2)))));
2188    SET_H_ACCUMS (FLD (f_acc), opval);
2189    TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
2190  }
2191
2192#undef FLD
2193}
2194  NEXT (vpc);
2195
2196  CASE (sem, INSN_MUL) : /* mul $dr,$sr */
2197{
2198  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2199  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2200#define FLD(f) abuf->fields.sfmt_add.f
2201  int UNUSED written = 0;
2202  IADDR UNUSED pc = abuf->addr;
2203  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2204
2205  {
2206    SI opval = MULSI (* FLD (i_dr), * FLD (i_sr));
2207    * FLD (i_dr) = opval;
2208    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
2209  }
2210
2211#undef FLD
2212}
2213  NEXT (vpc);
2214
2215  CASE (sem, INSN_MULHI_A) : /* mulhi $src1,$src2,$acc */
2216{
2217  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2218  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2219#define FLD(f) abuf->fields.sfmt_machi_a.f
2220  int UNUSED written = 0;
2221  IADDR UNUSED pc = abuf->addr;
2222  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2223
2224  {
2225    DI opval = SRADI (SLLDI (MULDI (EXTSIDI (ANDSI (* FLD (i_src1), 0xffff0000)), EXTHIDI (TRUNCSIHI (SRASI (* FLD (i_src2), 16)))), 16), 16);
2226    SET_H_ACCUMS (FLD (f_acc), opval);
2227    TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
2228  }
2229
2230#undef FLD
2231}
2232  NEXT (vpc);
2233
2234  CASE (sem, INSN_MULLO_A) : /* mullo $src1,$src2,$acc */
2235{
2236  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2237  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2238#define FLD(f) abuf->fields.sfmt_machi_a.f
2239  int UNUSED written = 0;
2240  IADDR UNUSED pc = abuf->addr;
2241  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2242
2243  {
2244    DI opval = SRADI (SLLDI (MULDI (EXTSIDI (SLLSI (* FLD (i_src1), 16)), EXTHIDI (TRUNCSIHI (* FLD (i_src2)))), 16), 16);
2245    SET_H_ACCUMS (FLD (f_acc), opval);
2246    TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
2247  }
2248
2249#undef FLD
2250}
2251  NEXT (vpc);
2252
2253  CASE (sem, INSN_MULWHI_A) : /* mulwhi $src1,$src2,$acc */
2254{
2255  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2256  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2257#define FLD(f) abuf->fields.sfmt_machi_a.f
2258  int UNUSED written = 0;
2259  IADDR UNUSED pc = abuf->addr;
2260  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2261
2262  {
2263    DI opval = MULDI (EXTSIDI (* FLD (i_src1)), EXTHIDI (TRUNCSIHI (SRASI (* FLD (i_src2), 16))));
2264    SET_H_ACCUMS (FLD (f_acc), opval);
2265    TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
2266  }
2267
2268#undef FLD
2269}
2270  NEXT (vpc);
2271
2272  CASE (sem, INSN_MULWLO_A) : /* mulwlo $src1,$src2,$acc */
2273{
2274  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2275  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2276#define FLD(f) abuf->fields.sfmt_machi_a.f
2277  int UNUSED written = 0;
2278  IADDR UNUSED pc = abuf->addr;
2279  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2280
2281  {
2282    DI opval = MULDI (EXTSIDI (* FLD (i_src1)), EXTHIDI (TRUNCSIHI (* FLD (i_src2))));
2283    SET_H_ACCUMS (FLD (f_acc), opval);
2284    TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
2285  }
2286
2287#undef FLD
2288}
2289  NEXT (vpc);
2290
2291  CASE (sem, INSN_MV) : /* mv $dr,$sr */
2292{
2293  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2294  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2295#define FLD(f) abuf->fields.sfmt_ld_plus.f
2296  int UNUSED written = 0;
2297  IADDR UNUSED pc = abuf->addr;
2298  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2299
2300  {
2301    SI opval = * FLD (i_sr);
2302    * FLD (i_dr) = opval;
2303    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
2304  }
2305
2306#undef FLD
2307}
2308  NEXT (vpc);
2309
2310  CASE (sem, INSN_MVFACHI_A) : /* mvfachi $dr,$accs */
2311{
2312  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2313  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2314#define FLD(f) abuf->fields.sfmt_mvfachi_a.f
2315  int UNUSED written = 0;
2316  IADDR UNUSED pc = abuf->addr;
2317  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2318
2319  {
2320    SI opval = TRUNCDISI (SRADI (GET_H_ACCUMS (FLD (f_accs)), 32));
2321    * FLD (i_dr) = opval;
2322    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
2323  }
2324
2325#undef FLD
2326}
2327  NEXT (vpc);
2328
2329  CASE (sem, INSN_MVFACLO_A) : /* mvfaclo $dr,$accs */
2330{
2331  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2332  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2333#define FLD(f) abuf->fields.sfmt_mvfachi_a.f
2334  int UNUSED written = 0;
2335  IADDR UNUSED pc = abuf->addr;
2336  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2337
2338  {
2339    SI opval = TRUNCDISI (GET_H_ACCUMS (FLD (f_accs)));
2340    * FLD (i_dr) = opval;
2341    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
2342  }
2343
2344#undef FLD
2345}
2346  NEXT (vpc);
2347
2348  CASE (sem, INSN_MVFACMI_A) : /* mvfacmi $dr,$accs */
2349{
2350  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2351  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2352#define FLD(f) abuf->fields.sfmt_mvfachi_a.f
2353  int UNUSED written = 0;
2354  IADDR UNUSED pc = abuf->addr;
2355  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2356
2357  {
2358    SI opval = TRUNCDISI (SRADI (GET_H_ACCUMS (FLD (f_accs)), 16));
2359    * FLD (i_dr) = opval;
2360    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
2361  }
2362
2363#undef FLD
2364}
2365  NEXT (vpc);
2366
2367  CASE (sem, INSN_MVFC) : /* mvfc $dr,$scr */
2368{
2369  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2370  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2371#define FLD(f) abuf->fields.sfmt_ld_plus.f
2372  int UNUSED written = 0;
2373  IADDR UNUSED pc = abuf->addr;
2374  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2375
2376  {
2377    SI opval = GET_H_CR (FLD (f_r2));
2378    * FLD (i_dr) = opval;
2379    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
2380  }
2381
2382#undef FLD
2383}
2384  NEXT (vpc);
2385
2386  CASE (sem, INSN_MVTACHI_A) : /* mvtachi $src1,$accs */
2387{
2388  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2389  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2390#define FLD(f) abuf->fields.sfmt_mvtachi_a.f
2391  int UNUSED written = 0;
2392  IADDR UNUSED pc = abuf->addr;
2393  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2394
2395  {
2396    DI opval = ORDI (ANDDI (GET_H_ACCUMS (FLD (f_accs)), MAKEDI (0, 0xffffffff)), SLLDI (EXTSIDI (* FLD (i_src1)), 32));
2397    SET_H_ACCUMS (FLD (f_accs), opval);
2398    TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
2399  }
2400
2401#undef FLD
2402}
2403  NEXT (vpc);
2404
2405  CASE (sem, INSN_MVTACLO_A) : /* mvtaclo $src1,$accs */
2406{
2407  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2408  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2409#define FLD(f) abuf->fields.sfmt_mvtachi_a.f
2410  int UNUSED written = 0;
2411  IADDR UNUSED pc = abuf->addr;
2412  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2413
2414  {
2415    DI opval = ORDI (ANDDI (GET_H_ACCUMS (FLD (f_accs)), MAKEDI (0xffffffff, 0)), ZEXTSIDI (* FLD (i_src1)));
2416    SET_H_ACCUMS (FLD (f_accs), opval);
2417    TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
2418  }
2419
2420#undef FLD
2421}
2422  NEXT (vpc);
2423
2424  CASE (sem, INSN_MVTC) : /* mvtc $sr,$dcr */
2425{
2426  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2427  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2428#define FLD(f) abuf->fields.sfmt_ld_plus.f
2429  int UNUSED written = 0;
2430  IADDR UNUSED pc = abuf->addr;
2431  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2432
2433  {
2434    USI opval = * FLD (i_sr);
2435    SET_H_CR (FLD (f_r1), opval);
2436    TRACE_RESULT (current_cpu, abuf, "cr", 'x', opval);
2437  }
2438
2439#undef FLD
2440}
2441  NEXT (vpc);
2442
2443  CASE (sem, INSN_NEG) : /* neg $dr,$sr */
2444{
2445  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2446  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2447#define FLD(f) abuf->fields.sfmt_ld_plus.f
2448  int UNUSED written = 0;
2449  IADDR UNUSED pc = abuf->addr;
2450  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2451
2452  {
2453    SI opval = NEGSI (* FLD (i_sr));
2454    * FLD (i_dr) = opval;
2455    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
2456  }
2457
2458#undef FLD
2459}
2460  NEXT (vpc);
2461
2462  CASE (sem, INSN_NOP) : /* nop */
2463{
2464  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2465  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2466#define FLD(f) abuf->fields.fmt_empty.f
2467  int UNUSED written = 0;
2468  IADDR UNUSED pc = abuf->addr;
2469  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2470
2471PROFILE_COUNT_FILLNOPS (current_cpu, abuf->addr);
2472
2473#undef FLD
2474}
2475  NEXT (vpc);
2476
2477  CASE (sem, INSN_NOT) : /* not $dr,$sr */
2478{
2479  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2480  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2481#define FLD(f) abuf->fields.sfmt_ld_plus.f
2482  int UNUSED written = 0;
2483  IADDR UNUSED pc = abuf->addr;
2484  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2485
2486  {
2487    SI opval = INVSI (* FLD (i_sr));
2488    * FLD (i_dr) = opval;
2489    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
2490  }
2491
2492#undef FLD
2493}
2494  NEXT (vpc);
2495
2496  CASE (sem, INSN_RAC_DSI) : /* rac $accd,$accs,$imm1 */
2497{
2498  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2499  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2500#define FLD(f) abuf->fields.sfmt_rac_dsi.f
2501  int UNUSED written = 0;
2502  IADDR UNUSED pc = abuf->addr;
2503  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2504
2505{
2506  DI tmp_tmp1;
2507  tmp_tmp1 = SLLDI (GET_H_ACCUMS (FLD (f_accs)), FLD (f_imm1));
2508  tmp_tmp1 = ADDDI (tmp_tmp1, MAKEDI (0, 32768));
2509  {
2510    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)));
2511    SET_H_ACCUMS (FLD (f_accd), opval);
2512    TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
2513  }
2514}
2515
2516#undef FLD
2517}
2518  NEXT (vpc);
2519
2520  CASE (sem, INSN_RACH_DSI) : /* rach $accd,$accs,$imm1 */
2521{
2522  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2523  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2524#define FLD(f) abuf->fields.sfmt_rac_dsi.f
2525  int UNUSED written = 0;
2526  IADDR UNUSED pc = abuf->addr;
2527  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2528
2529{
2530  DI tmp_tmp1;
2531  tmp_tmp1 = SLLDI (GET_H_ACCUMS (FLD (f_accs)), FLD (f_imm1));
2532  tmp_tmp1 = ADDDI (tmp_tmp1, MAKEDI (0, 0x80000000));
2533  {
2534    DI opval = (GTDI (tmp_tmp1, MAKEDI (32767, 0))) ? (MAKEDI (32767, 0)) : (LTDI (tmp_tmp1, MAKEDI (0xffff8000, 0))) ? (MAKEDI (0xffff8000, 0)) : (ANDDI (tmp_tmp1, MAKEDI (0xffffffff, 0)));
2535    SET_H_ACCUMS (FLD (f_accd), opval);
2536    TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
2537  }
2538}
2539
2540#undef FLD
2541}
2542  NEXT (vpc);
2543
2544  CASE (sem, INSN_RTE) : /* rte */
2545{
2546  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2547  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2548#define FLD(f) abuf->fields.fmt_empty.f
2549  int UNUSED written = 0;
2550  IADDR UNUSED pc = abuf->addr;
2551  SEM_BRANCH_INIT
2552  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2553
2554{
2555  {
2556    USI opval = ANDSI (GET_H_CR (((UINT) 6)), -4);
2557    SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
2558    TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
2559  }
2560  {
2561    USI opval = GET_H_CR (((UINT) 14));
2562    SET_H_CR (((UINT) 6), opval);
2563    TRACE_RESULT (current_cpu, abuf, "cr", 'x', opval);
2564  }
2565  {
2566    UQI opval = CPU (h_bpsw);
2567    SET_H_PSW (opval);
2568    TRACE_RESULT (current_cpu, abuf, "psw", 'x', opval);
2569  }
2570  {
2571    UQI opval = CPU (h_bbpsw);
2572    CPU (h_bpsw) = opval;
2573    TRACE_RESULT (current_cpu, abuf, "bpsw", 'x', opval);
2574  }
2575}
2576
2577  SEM_BRANCH_FINI (vpc);
2578#undef FLD
2579}
2580  NEXT (vpc);
2581
2582  CASE (sem, INSN_SETH) : /* seth $dr,$hash$hi16 */
2583{
2584  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2585  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2586#define FLD(f) abuf->fields.sfmt_seth.f
2587  int UNUSED written = 0;
2588  IADDR UNUSED pc = abuf->addr;
2589  vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2590
2591  {
2592    SI opval = SLLSI (FLD (f_hi16), 16);
2593    * FLD (i_dr) = opval;
2594    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
2595  }
2596
2597#undef FLD
2598}
2599  NEXT (vpc);
2600
2601  CASE (sem, INSN_SLL) : /* sll $dr,$sr */
2602{
2603  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2604  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2605#define FLD(f) abuf->fields.sfmt_add.f
2606  int UNUSED written = 0;
2607  IADDR UNUSED pc = abuf->addr;
2608  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2609
2610  {
2611    SI opval = SLLSI (* FLD (i_dr), ANDSI (* FLD (i_sr), 31));
2612    * FLD (i_dr) = opval;
2613    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
2614  }
2615
2616#undef FLD
2617}
2618  NEXT (vpc);
2619
2620  CASE (sem, INSN_SLL3) : /* sll3 $dr,$sr,$simm16 */
2621{
2622  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2623  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2624#define FLD(f) abuf->fields.sfmt_add3.f
2625  int UNUSED written = 0;
2626  IADDR UNUSED pc = abuf->addr;
2627  vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2628
2629  {
2630    SI opval = SLLSI (* FLD (i_sr), ANDSI (FLD (f_simm16), 31));
2631    * FLD (i_dr) = opval;
2632    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
2633  }
2634
2635#undef FLD
2636}
2637  NEXT (vpc);
2638
2639  CASE (sem, INSN_SLLI) : /* slli $dr,$uimm5 */
2640{
2641  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2642  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2643#define FLD(f) abuf->fields.sfmt_slli.f
2644  int UNUSED written = 0;
2645  IADDR UNUSED pc = abuf->addr;
2646  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2647
2648  {
2649    SI opval = SLLSI (* FLD (i_dr), FLD (f_uimm5));
2650    * FLD (i_dr) = opval;
2651    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
2652  }
2653
2654#undef FLD
2655}
2656  NEXT (vpc);
2657
2658  CASE (sem, INSN_SRA) : /* sra $dr,$sr */
2659{
2660  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2661  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2662#define FLD(f) abuf->fields.sfmt_add.f
2663  int UNUSED written = 0;
2664  IADDR UNUSED pc = abuf->addr;
2665  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2666
2667  {
2668    SI opval = SRASI (* FLD (i_dr), ANDSI (* FLD (i_sr), 31));
2669    * FLD (i_dr) = opval;
2670    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
2671  }
2672
2673#undef FLD
2674}
2675  NEXT (vpc);
2676
2677  CASE (sem, INSN_SRA3) : /* sra3 $dr,$sr,$simm16 */
2678{
2679  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2680  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2681#define FLD(f) abuf->fields.sfmt_add3.f
2682  int UNUSED written = 0;
2683  IADDR UNUSED pc = abuf->addr;
2684  vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2685
2686  {
2687    SI opval = SRASI (* FLD (i_sr), ANDSI (FLD (f_simm16), 31));
2688    * FLD (i_dr) = opval;
2689    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
2690  }
2691
2692#undef FLD
2693}
2694  NEXT (vpc);
2695
2696  CASE (sem, INSN_SRAI) : /* srai $dr,$uimm5 */
2697{
2698  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2699  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2700#define FLD(f) abuf->fields.sfmt_slli.f
2701  int UNUSED written = 0;
2702  IADDR UNUSED pc = abuf->addr;
2703  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2704
2705  {
2706    SI opval = SRASI (* FLD (i_dr), FLD (f_uimm5));
2707    * FLD (i_dr) = opval;
2708    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
2709  }
2710
2711#undef FLD
2712}
2713  NEXT (vpc);
2714
2715  CASE (sem, INSN_SRL) : /* srl $dr,$sr */
2716{
2717  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2718  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2719#define FLD(f) abuf->fields.sfmt_add.f
2720  int UNUSED written = 0;
2721  IADDR UNUSED pc = abuf->addr;
2722  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2723
2724  {
2725    SI opval = SRLSI (* FLD (i_dr), ANDSI (* FLD (i_sr), 31));
2726    * FLD (i_dr) = opval;
2727    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
2728  }
2729
2730#undef FLD
2731}
2732  NEXT (vpc);
2733
2734  CASE (sem, INSN_SRL3) : /* srl3 $dr,$sr,$simm16 */
2735{
2736  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2737  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2738#define FLD(f) abuf->fields.sfmt_add3.f
2739  int UNUSED written = 0;
2740  IADDR UNUSED pc = abuf->addr;
2741  vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2742
2743  {
2744    SI opval = SRLSI (* FLD (i_sr), ANDSI (FLD (f_simm16), 31));
2745    * FLD (i_dr) = opval;
2746    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
2747  }
2748
2749#undef FLD
2750}
2751  NEXT (vpc);
2752
2753  CASE (sem, INSN_SRLI) : /* srli $dr,$uimm5 */
2754{
2755  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2756  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2757#define FLD(f) abuf->fields.sfmt_slli.f
2758  int UNUSED written = 0;
2759  IADDR UNUSED pc = abuf->addr;
2760  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2761
2762  {
2763    SI opval = SRLSI (* FLD (i_dr), FLD (f_uimm5));
2764    * FLD (i_dr) = opval;
2765    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
2766  }
2767
2768#undef FLD
2769}
2770  NEXT (vpc);
2771
2772  CASE (sem, INSN_ST) : /* st $src1,@$src2 */
2773{
2774  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2775  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2776#define FLD(f) abuf->fields.sfmt_st_plus.f
2777  int UNUSED written = 0;
2778  IADDR UNUSED pc = abuf->addr;
2779  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2780
2781  {
2782    SI opval = * FLD (i_src1);
2783    SETMEMSI (current_cpu, pc, * FLD (i_src2), opval);
2784    TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
2785  }
2786
2787#undef FLD
2788}
2789  NEXT (vpc);
2790
2791  CASE (sem, INSN_ST_D) : /* st $src1,@($slo16,$src2) */
2792{
2793  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2794  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2795#define FLD(f) abuf->fields.sfmt_st_d.f
2796  int UNUSED written = 0;
2797  IADDR UNUSED pc = abuf->addr;
2798  vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2799
2800  {
2801    SI opval = * FLD (i_src1);
2802    SETMEMSI (current_cpu, pc, ADDSI (* FLD (i_src2), FLD (f_simm16)), opval);
2803    TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
2804  }
2805
2806#undef FLD
2807}
2808  NEXT (vpc);
2809
2810  CASE (sem, INSN_STB) : /* stb $src1,@$src2 */
2811{
2812  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2813  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2814#define FLD(f) abuf->fields.sfmt_st_plus.f
2815  int UNUSED written = 0;
2816  IADDR UNUSED pc = abuf->addr;
2817  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2818
2819  {
2820    QI opval = * FLD (i_src1);
2821    SETMEMQI (current_cpu, pc, * FLD (i_src2), opval);
2822    TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
2823  }
2824
2825#undef FLD
2826}
2827  NEXT (vpc);
2828
2829  CASE (sem, INSN_STB_D) : /* stb $src1,@($slo16,$src2) */
2830{
2831  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2832  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2833#define FLD(f) abuf->fields.sfmt_st_d.f
2834  int UNUSED written = 0;
2835  IADDR UNUSED pc = abuf->addr;
2836  vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2837
2838  {
2839    QI opval = * FLD (i_src1);
2840    SETMEMQI (current_cpu, pc, ADDSI (* FLD (i_src2), FLD (f_simm16)), opval);
2841    TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
2842  }
2843
2844#undef FLD
2845}
2846  NEXT (vpc);
2847
2848  CASE (sem, INSN_STH) : /* sth $src1,@$src2 */
2849{
2850  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2851  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2852#define FLD(f) abuf->fields.sfmt_st_plus.f
2853  int UNUSED written = 0;
2854  IADDR UNUSED pc = abuf->addr;
2855  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2856
2857  {
2858    HI opval = * FLD (i_src1);
2859    SETMEMHI (current_cpu, pc, * FLD (i_src2), opval);
2860    TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
2861  }
2862
2863#undef FLD
2864}
2865  NEXT (vpc);
2866
2867  CASE (sem, INSN_STH_D) : /* sth $src1,@($slo16,$src2) */
2868{
2869  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2870  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2871#define FLD(f) abuf->fields.sfmt_st_d.f
2872  int UNUSED written = 0;
2873  IADDR UNUSED pc = abuf->addr;
2874  vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2875
2876  {
2877    HI opval = * FLD (i_src1);
2878    SETMEMHI (current_cpu, pc, ADDSI (* FLD (i_src2), FLD (f_simm16)), opval);
2879    TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
2880  }
2881
2882#undef FLD
2883}
2884  NEXT (vpc);
2885
2886  CASE (sem, INSN_ST_PLUS) : /* st $src1,@+$src2 */
2887{
2888  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2889  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2890#define FLD(f) abuf->fields.sfmt_st_plus.f
2891  int UNUSED written = 0;
2892  IADDR UNUSED pc = abuf->addr;
2893  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2894
2895{
2896  SI tmp_new_src2;
2897  tmp_new_src2 = ADDSI (* FLD (i_src2), 4);
2898  {
2899    SI opval = * FLD (i_src1);
2900    SETMEMSI (current_cpu, pc, tmp_new_src2, opval);
2901    TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
2902  }
2903  {
2904    SI opval = tmp_new_src2;
2905    * FLD (i_src2) = opval;
2906    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
2907  }
2908}
2909
2910#undef FLD
2911}
2912  NEXT (vpc);
2913
2914  CASE (sem, INSN_STH_PLUS) : /* sth $src1,@$src2+ */
2915{
2916  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2917  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2918#define FLD(f) abuf->fields.sfmt_st_plus.f
2919  int UNUSED written = 0;
2920  IADDR UNUSED pc = abuf->addr;
2921  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2922
2923{
2924  HI tmp_new_src2;
2925  {
2926    HI opval = * FLD (i_src1);
2927    SETMEMHI (current_cpu, pc, tmp_new_src2, opval);
2928    TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
2929  }
2930  tmp_new_src2 = ADDSI (* FLD (i_src2), 2);
2931  {
2932    SI opval = tmp_new_src2;
2933    * FLD (i_src2) = opval;
2934    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
2935  }
2936}
2937
2938#undef FLD
2939}
2940  NEXT (vpc);
2941
2942  CASE (sem, INSN_STB_PLUS) : /* stb $src1,@$src2+ */
2943{
2944  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2945  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2946#define FLD(f) abuf->fields.sfmt_st_plus.f
2947  int UNUSED written = 0;
2948  IADDR UNUSED pc = abuf->addr;
2949  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2950
2951{
2952  QI tmp_new_src2;
2953  {
2954    QI opval = * FLD (i_src1);
2955    SETMEMQI (current_cpu, pc, tmp_new_src2, opval);
2956    TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
2957  }
2958  tmp_new_src2 = ADDSI (* FLD (i_src2), 1);
2959  {
2960    SI opval = tmp_new_src2;
2961    * FLD (i_src2) = opval;
2962    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
2963  }
2964}
2965
2966#undef FLD
2967}
2968  NEXT (vpc);
2969
2970  CASE (sem, INSN_ST_MINUS) : /* st $src1,@-$src2 */
2971{
2972  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2973  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2974#define FLD(f) abuf->fields.sfmt_st_plus.f
2975  int UNUSED written = 0;
2976  IADDR UNUSED pc = abuf->addr;
2977  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2978
2979{
2980  SI tmp_new_src2;
2981  tmp_new_src2 = SUBSI (* FLD (i_src2), 4);
2982  {
2983    SI opval = * FLD (i_src1);
2984    SETMEMSI (current_cpu, pc, tmp_new_src2, opval);
2985    TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
2986  }
2987  {
2988    SI opval = tmp_new_src2;
2989    * FLD (i_src2) = opval;
2990    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
2991  }
2992}
2993
2994#undef FLD
2995}
2996  NEXT (vpc);
2997
2998  CASE (sem, INSN_SUB) : /* sub $dr,$sr */
2999{
3000  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3001  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3002#define FLD(f) abuf->fields.sfmt_add.f
3003  int UNUSED written = 0;
3004  IADDR UNUSED pc = abuf->addr;
3005  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3006
3007  {
3008    SI opval = SUBSI (* FLD (i_dr), * FLD (i_sr));
3009    * FLD (i_dr) = opval;
3010    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
3011  }
3012
3013#undef FLD
3014}
3015  NEXT (vpc);
3016
3017  CASE (sem, INSN_SUBV) : /* subv $dr,$sr */
3018{
3019  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3020  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3021#define FLD(f) abuf->fields.sfmt_add.f
3022  int UNUSED written = 0;
3023  IADDR UNUSED pc = abuf->addr;
3024  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3025
3026{
3027  SI temp0;BI temp1;
3028  temp0 = SUBSI (* FLD (i_dr), * FLD (i_sr));
3029  temp1 = SUBOFSI (* FLD (i_dr), * FLD (i_sr), 0);
3030  {
3031    SI opval = temp0;
3032    * FLD (i_dr) = opval;
3033    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
3034  }
3035  {
3036    BI opval = temp1;
3037    CPU (h_cond) = opval;
3038    TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
3039  }
3040}
3041
3042#undef FLD
3043}
3044  NEXT (vpc);
3045
3046  CASE (sem, INSN_SUBX) : /* subx $dr,$sr */
3047{
3048  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3049  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3050#define FLD(f) abuf->fields.sfmt_add.f
3051  int UNUSED written = 0;
3052  IADDR UNUSED pc = abuf->addr;
3053  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3054
3055{
3056  SI temp0;BI temp1;
3057  temp0 = SUBCSI (* FLD (i_dr), * FLD (i_sr), CPU (h_cond));
3058  temp1 = SUBCFSI (* FLD (i_dr), * FLD (i_sr), CPU (h_cond));
3059  {
3060    SI opval = temp0;
3061    * FLD (i_dr) = opval;
3062    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
3063  }
3064  {
3065    BI opval = temp1;
3066    CPU (h_cond) = opval;
3067    TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
3068  }
3069}
3070
3071#undef FLD
3072}
3073  NEXT (vpc);
3074
3075  CASE (sem, INSN_TRAP) : /* trap $uimm4 */
3076{
3077  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3078  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3079#define FLD(f) abuf->fields.sfmt_trap.f
3080  int UNUSED written = 0;
3081  IADDR UNUSED pc = abuf->addr;
3082  SEM_BRANCH_INIT
3083  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3084
3085{
3086  {
3087    USI opval = GET_H_CR (((UINT) 6));
3088    SET_H_CR (((UINT) 14), opval);
3089    TRACE_RESULT (current_cpu, abuf, "cr", 'x', opval);
3090  }
3091  {
3092    USI opval = ADDSI (pc, 4);
3093    SET_H_CR (((UINT) 6), opval);
3094    TRACE_RESULT (current_cpu, abuf, "cr", 'x', opval);
3095  }
3096  {
3097    UQI opval = CPU (h_bpsw);
3098    CPU (h_bbpsw) = opval;
3099    TRACE_RESULT (current_cpu, abuf, "bbpsw", 'x', opval);
3100  }
3101  {
3102    UQI opval = GET_H_PSW ();
3103    CPU (h_bpsw) = opval;
3104    TRACE_RESULT (current_cpu, abuf, "bpsw", 'x', opval);
3105  }
3106  {
3107    UQI opval = ANDQI (GET_H_PSW (), 128);
3108    SET_H_PSW (opval);
3109    TRACE_RESULT (current_cpu, abuf, "psw", 'x', opval);
3110  }
3111  {
3112    SI opval = m32r_trap (current_cpu, pc, FLD (f_uimm4));
3113    SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
3114    TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
3115  }
3116}
3117
3118  SEM_BRANCH_FINI (vpc);
3119#undef FLD
3120}
3121  NEXT (vpc);
3122
3123  CASE (sem, INSN_UNLOCK) : /* unlock $src1,@$src2 */
3124{
3125  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3126  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3127#define FLD(f) abuf->fields.sfmt_st_plus.f
3128  int UNUSED written = 0;
3129  IADDR UNUSED pc = abuf->addr;
3130  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3131
3132{
3133if (CPU (h_lock)) {
3134  {
3135    SI opval = * FLD (i_src1);
3136    SETMEMSI (current_cpu, pc, * FLD (i_src2), opval);
3137    written |= (1 << 4);
3138    TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
3139  }
3140}
3141  {
3142    BI opval = 0;
3143    CPU (h_lock) = opval;
3144    TRACE_RESULT (current_cpu, abuf, "lock", 'x', opval);
3145  }
3146}
3147
3148  abuf->written = written;
3149#undef FLD
3150}
3151  NEXT (vpc);
3152
3153  CASE (sem, INSN_SATB) : /* satb $dr,$sr */
3154{
3155  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3156  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3157#define FLD(f) abuf->fields.sfmt_ld_plus.f
3158  int UNUSED written = 0;
3159  IADDR UNUSED pc = abuf->addr;
3160  vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
3161
3162  {
3163    SI opval = (GESI (* FLD (i_sr), 127)) ? (127) : (LESI (* FLD (i_sr), -128)) ? (-128) : (* FLD (i_sr));
3164    * FLD (i_dr) = opval;
3165    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
3166  }
3167
3168#undef FLD
3169}
3170  NEXT (vpc);
3171
3172  CASE (sem, INSN_SATH) : /* sath $dr,$sr */
3173{
3174  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3175  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3176#define FLD(f) abuf->fields.sfmt_ld_plus.f
3177  int UNUSED written = 0;
3178  IADDR UNUSED pc = abuf->addr;
3179  vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
3180
3181  {
3182    SI opval = (GESI (* FLD (i_sr), 32767)) ? (32767) : (LESI (* FLD (i_sr), -32768)) ? (-32768) : (* FLD (i_sr));
3183    * FLD (i_dr) = opval;
3184    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
3185  }
3186
3187#undef FLD
3188}
3189  NEXT (vpc);
3190
3191  CASE (sem, INSN_SAT) : /* sat $dr,$sr */
3192{
3193  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3194  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3195#define FLD(f) abuf->fields.sfmt_ld_plus.f
3196  int UNUSED written = 0;
3197  IADDR UNUSED pc = abuf->addr;
3198  vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
3199
3200  {
3201    SI opval = ((CPU (h_cond)) ? (((LTSI (* FLD (i_sr), 0)) ? (2147483647) : (0x80000000))) : (* FLD (i_sr)));
3202    * FLD (i_dr) = opval;
3203    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
3204  }
3205
3206#undef FLD
3207}
3208  NEXT (vpc);
3209
3210  CASE (sem, INSN_PCMPBZ) : /* pcmpbz $src2 */
3211{
3212  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3213  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3214#define FLD(f) abuf->fields.sfmt_st_plus.f
3215  int UNUSED written = 0;
3216  IADDR UNUSED pc = abuf->addr;
3217  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3218
3219  {
3220    BI opval = (EQSI (ANDSI (* FLD (i_src2), 255), 0)) ? (1) : (EQSI (ANDSI (* FLD (i_src2), 65280), 0)) ? (1) : (EQSI (ANDSI (* FLD (i_src2), 16711680), 0)) ? (1) : (EQSI (ANDSI (* FLD (i_src2), 0xff000000), 0)) ? (1) : (0);
3221    CPU (h_cond) = opval;
3222    TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
3223  }
3224
3225#undef FLD
3226}
3227  NEXT (vpc);
3228
3229  CASE (sem, INSN_SADD) : /* sadd */
3230{
3231  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3232  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3233#define FLD(f) abuf->fields.fmt_empty.f
3234  int UNUSED written = 0;
3235  IADDR UNUSED pc = abuf->addr;
3236  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3237
3238  {
3239    DI opval = ADDDI (SRADI (GET_H_ACCUMS (((UINT) 1)), 16), GET_H_ACCUMS (((UINT) 0)));
3240    SET_H_ACCUMS (((UINT) 0), opval);
3241    TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
3242  }
3243
3244#undef FLD
3245}
3246  NEXT (vpc);
3247
3248  CASE (sem, INSN_MACWU1) : /* macwu1 $src1,$src2 */
3249{
3250  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3251  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3252#define FLD(f) abuf->fields.sfmt_st_plus.f
3253  int UNUSED written = 0;
3254  IADDR UNUSED pc = abuf->addr;
3255  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3256
3257  {
3258    DI opval = SRADI (SLLDI (ADDDI (GET_H_ACCUMS (((UINT) 1)), MULDI (EXTSIDI (* FLD (i_src1)), EXTSIDI (ANDSI (* FLD (i_src2), 65535)))), 8), 8);
3259    SET_H_ACCUMS (((UINT) 1), opval);
3260    TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
3261  }
3262
3263#undef FLD
3264}
3265  NEXT (vpc);
3266
3267  CASE (sem, INSN_MSBLO) : /* msblo $src1,$src2 */
3268{
3269  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3270  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3271#define FLD(f) abuf->fields.sfmt_st_plus.f
3272  int UNUSED written = 0;
3273  IADDR UNUSED pc = abuf->addr;
3274  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3275
3276  {
3277    DI opval = SRADI (SLLDI (SUBDI (GET_H_ACCUM (), SRADI (SLLDI (MULDI (EXTHIDI (TRUNCSIHI (* FLD (i_src1))), EXTHIDI (TRUNCSIHI (* FLD (i_src2)))), 32), 16)), 8), 8);
3278    SET_H_ACCUM (opval);
3279    TRACE_RESULT (current_cpu, abuf, "accum", 'D', opval);
3280  }
3281
3282#undef FLD
3283}
3284  NEXT (vpc);
3285
3286  CASE (sem, INSN_MULWU1) : /* mulwu1 $src1,$src2 */
3287{
3288  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3289  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3290#define FLD(f) abuf->fields.sfmt_st_plus.f
3291  int UNUSED written = 0;
3292  IADDR UNUSED pc = abuf->addr;
3293  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3294
3295  {
3296    DI opval = SRADI (SLLDI (MULDI (EXTSIDI (* FLD (i_src1)), EXTSIDI (ANDSI (* FLD (i_src2), 65535))), 16), 16);
3297    SET_H_ACCUMS (((UINT) 1), opval);
3298    TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
3299  }
3300
3301#undef FLD
3302}
3303  NEXT (vpc);
3304
3305  CASE (sem, INSN_MACLH1) : /* maclh1 $src1,$src2 */
3306{
3307  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3308  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3309#define FLD(f) abuf->fields.sfmt_st_plus.f
3310  int UNUSED written = 0;
3311  IADDR UNUSED pc = abuf->addr;
3312  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3313
3314  {
3315    DI opval = SRADI (SLLDI (ADDDI (GET_H_ACCUMS (((UINT) 1)), SLLDI (EXTSIDI (MULSI (EXTHISI (TRUNCSIHI (* FLD (i_src1))), SRASI (* FLD (i_src2), 16))), 16)), 8), 8);
3316    SET_H_ACCUMS (((UINT) 1), opval);
3317    TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
3318  }
3319
3320#undef FLD
3321}
3322  NEXT (vpc);
3323
3324  CASE (sem, INSN_SC) : /* sc */
3325{
3326  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3327  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3328#define FLD(f) abuf->fields.fmt_empty.f
3329  int UNUSED written = 0;
3330  IADDR UNUSED pc = abuf->addr;
3331  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3332
3333if (ZEXTBISI (CPU (h_cond)))
3334  SEM_SKIP_INSN (current_cpu, sem_arg, vpc);
3335
3336#undef FLD
3337}
3338  NEXT (vpc);
3339
3340  CASE (sem, INSN_SNC) : /* snc */
3341{
3342  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3343  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3344#define FLD(f) abuf->fields.fmt_empty.f
3345  int UNUSED written = 0;
3346  IADDR UNUSED pc = abuf->addr;
3347  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3348
3349if (ZEXTBISI (NOTBI (CPU (h_cond))))
3350  SEM_SKIP_INSN (current_cpu, sem_arg, vpc);
3351
3352#undef FLD
3353}
3354  NEXT (vpc);
3355
3356  CASE (sem, INSN_CLRPSW) : /* clrpsw $uimm8 */
3357{
3358  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3359  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3360#define FLD(f) abuf->fields.sfmt_clrpsw.f
3361  int UNUSED written = 0;
3362  IADDR UNUSED pc = abuf->addr;
3363  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3364
3365  {
3366    SI opval = ANDSI (GET_H_CR (((UINT) 0)), ORSI (INVBI (FLD (f_uimm8)), 65280));
3367    SET_H_CR (((UINT) 0), opval);
3368    TRACE_RESULT (current_cpu, abuf, "cr", 'x', opval);
3369  }
3370
3371#undef FLD
3372}
3373  NEXT (vpc);
3374
3375  CASE (sem, INSN_SETPSW) : /* setpsw $uimm8 */
3376{
3377  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3378  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3379#define FLD(f) abuf->fields.sfmt_clrpsw.f
3380  int UNUSED written = 0;
3381  IADDR UNUSED pc = abuf->addr;
3382  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3383
3384  {
3385    SI opval = FLD (f_uimm8);
3386    SET_H_CR (((UINT) 0), opval);
3387    TRACE_RESULT (current_cpu, abuf, "cr", 'x', opval);
3388  }
3389
3390#undef FLD
3391}
3392  NEXT (vpc);
3393
3394  CASE (sem, INSN_BSET) : /* bset $uimm3,@($slo16,$sr) */
3395{
3396  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3397  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3398#define FLD(f) abuf->fields.sfmt_bset.f
3399  int UNUSED written = 0;
3400  IADDR UNUSED pc = abuf->addr;
3401  vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
3402
3403  {
3404    QI opval = ORQI (GETMEMQI (current_cpu, pc, ADDSI (* FLD (i_sr), FLD (f_simm16))), SLLSI (1, SUBSI (7, FLD (f_uimm3))));
3405    SETMEMQI (current_cpu, pc, ADDSI (* FLD (i_sr), FLD (f_simm16)), opval);
3406    TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
3407  }
3408
3409#undef FLD
3410}
3411  NEXT (vpc);
3412
3413  CASE (sem, INSN_BCLR) : /* bclr $uimm3,@($slo16,$sr) */
3414{
3415  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3416  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3417#define FLD(f) abuf->fields.sfmt_bset.f
3418  int UNUSED written = 0;
3419  IADDR UNUSED pc = abuf->addr;
3420  vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
3421
3422  {
3423    QI opval = ANDQI (GETMEMQI (current_cpu, pc, ADDSI (* FLD (i_sr), FLD (f_simm16))), INVQI (SLLSI (1, SUBSI (7, FLD (f_uimm3)))));
3424    SETMEMQI (current_cpu, pc, ADDSI (* FLD (i_sr), FLD (f_simm16)), opval);
3425    TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
3426  }
3427
3428#undef FLD
3429}
3430  NEXT (vpc);
3431
3432  CASE (sem, INSN_BTST) : /* btst $uimm3,$sr */
3433{
3434  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3435  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3436#define FLD(f) abuf->fields.sfmt_bset.f
3437  int UNUSED written = 0;
3438  IADDR UNUSED pc = abuf->addr;
3439  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3440
3441  {
3442    BI opval = ANDQI (SRLSI (* FLD (i_sr), SUBSI (7, FLD (f_uimm3))), 1);
3443    CPU (h_cond) = opval;
3444    TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
3445  }
3446
3447#undef FLD
3448}
3449  NEXT (vpc);
3450
3451  CASE (sem, INSN_PAR_ADD) : /* add $dr,$sr */
3452{
3453  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3454  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3455#define FLD(f) abuf->fields.sfmt_add.f
3456#define OPRND(f) par_exec->operands.sfmt_add.f
3457  int UNUSED written = 0;
3458  IADDR UNUSED pc = abuf->addr;
3459  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3460
3461  {
3462    SI opval = ADDSI (* FLD (i_dr), * FLD (i_sr));
3463    OPRND (dr) = opval;
3464    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
3465  }
3466
3467#undef OPRND
3468#undef FLD
3469}
3470  NEXT (vpc);
3471
3472CASE (sem, INSN_WRITE_ADD) : /* add $dr,$sr */
3473  {
3474    SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3475    const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
3476#define FLD(f) abuf->fields.sfmt_add.f
3477#define OPRND(f) par_exec->operands.sfmt_add.f
3478    int UNUSED written = abuf->written;
3479    IADDR UNUSED pc = abuf->addr;
3480    vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
3481
3482  * FLD (i_dr) = OPRND (dr);
3483
3484#undef OPRND
3485#undef FLD
3486  }
3487  NEXT (vpc);
3488
3489  CASE (sem, INSN_PAR_AND) : /* and $dr,$sr */
3490{
3491  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3492  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3493#define FLD(f) abuf->fields.sfmt_add.f
3494#define OPRND(f) par_exec->operands.sfmt_add.f
3495  int UNUSED written = 0;
3496  IADDR UNUSED pc = abuf->addr;
3497  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3498
3499  {
3500    SI opval = ANDSI (* FLD (i_dr), * FLD (i_sr));
3501    OPRND (dr) = opval;
3502    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
3503  }
3504
3505#undef OPRND
3506#undef FLD
3507}
3508  NEXT (vpc);
3509
3510CASE (sem, INSN_WRITE_AND) : /* and $dr,$sr */
3511  {
3512    SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3513    const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
3514#define FLD(f) abuf->fields.sfmt_add.f
3515#define OPRND(f) par_exec->operands.sfmt_add.f
3516    int UNUSED written = abuf->written;
3517    IADDR UNUSED pc = abuf->addr;
3518    vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
3519
3520  * FLD (i_dr) = OPRND (dr);
3521
3522#undef OPRND
3523#undef FLD
3524  }
3525  NEXT (vpc);
3526
3527  CASE (sem, INSN_PAR_OR) : /* or $dr,$sr */
3528{
3529  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3530  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3531#define FLD(f) abuf->fields.sfmt_add.f
3532#define OPRND(f) par_exec->operands.sfmt_add.f
3533  int UNUSED written = 0;
3534  IADDR UNUSED pc = abuf->addr;
3535  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3536
3537  {
3538    SI opval = ORSI (* FLD (i_dr), * FLD (i_sr));
3539    OPRND (dr) = opval;
3540    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
3541  }
3542
3543#undef OPRND
3544#undef FLD
3545}
3546  NEXT (vpc);
3547
3548CASE (sem, INSN_WRITE_OR) : /* or $dr,$sr */
3549  {
3550    SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3551    const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
3552#define FLD(f) abuf->fields.sfmt_add.f
3553#define OPRND(f) par_exec->operands.sfmt_add.f
3554    int UNUSED written = abuf->written;
3555    IADDR UNUSED pc = abuf->addr;
3556    vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
3557
3558  * FLD (i_dr) = OPRND (dr);
3559
3560#undef OPRND
3561#undef FLD
3562  }
3563  NEXT (vpc);
3564
3565  CASE (sem, INSN_PAR_XOR) : /* xor $dr,$sr */
3566{
3567  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3568  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3569#define FLD(f) abuf->fields.sfmt_add.f
3570#define OPRND(f) par_exec->operands.sfmt_add.f
3571  int UNUSED written = 0;
3572  IADDR UNUSED pc = abuf->addr;
3573  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3574
3575  {
3576    SI opval = XORSI (* FLD (i_dr), * FLD (i_sr));
3577    OPRND (dr) = opval;
3578    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
3579  }
3580
3581#undef OPRND
3582#undef FLD
3583}
3584  NEXT (vpc);
3585
3586CASE (sem, INSN_WRITE_XOR) : /* xor $dr,$sr */
3587  {
3588    SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3589    const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
3590#define FLD(f) abuf->fields.sfmt_add.f
3591#define OPRND(f) par_exec->operands.sfmt_add.f
3592    int UNUSED written = abuf->written;
3593    IADDR UNUSED pc = abuf->addr;
3594    vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
3595
3596  * FLD (i_dr) = OPRND (dr);
3597
3598#undef OPRND
3599#undef FLD
3600  }
3601  NEXT (vpc);
3602
3603  CASE (sem, INSN_PAR_ADDI) : /* addi $dr,$simm8 */
3604{
3605  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3606  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3607#define FLD(f) abuf->fields.sfmt_addi.f
3608#define OPRND(f) par_exec->operands.sfmt_addi.f
3609  int UNUSED written = 0;
3610  IADDR UNUSED pc = abuf->addr;
3611  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3612
3613  {
3614    SI opval = ADDSI (* FLD (i_dr), FLD (f_simm8));
3615    OPRND (dr) = opval;
3616    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
3617  }
3618
3619#undef OPRND
3620#undef FLD
3621}
3622  NEXT (vpc);
3623
3624CASE (sem, INSN_WRITE_ADDI) : /* addi $dr,$simm8 */
3625  {
3626    SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3627    const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
3628#define FLD(f) abuf->fields.sfmt_addi.f
3629#define OPRND(f) par_exec->operands.sfmt_addi.f
3630    int UNUSED written = abuf->written;
3631    IADDR UNUSED pc = abuf->addr;
3632    vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
3633
3634  * FLD (i_dr) = OPRND (dr);
3635
3636#undef OPRND
3637#undef FLD
3638  }
3639  NEXT (vpc);
3640
3641  CASE (sem, INSN_PAR_ADDV) : /* addv $dr,$sr */
3642{
3643  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3644  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3645#define FLD(f) abuf->fields.sfmt_add.f
3646#define OPRND(f) par_exec->operands.sfmt_addv.f
3647  int UNUSED written = 0;
3648  IADDR UNUSED pc = abuf->addr;
3649  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3650
3651{
3652  SI temp0;BI temp1;
3653  temp0 = ADDSI (* FLD (i_dr), * FLD (i_sr));
3654  temp1 = ADDOFSI (* FLD (i_dr), * FLD (i_sr), 0);
3655  {
3656    SI opval = temp0;
3657    OPRND (dr) = opval;
3658    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
3659  }
3660  {
3661    BI opval = temp1;
3662    OPRND (condbit) = opval;
3663    TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
3664  }
3665}
3666
3667#undef OPRND
3668#undef FLD
3669}
3670  NEXT (vpc);
3671
3672CASE (sem, INSN_WRITE_ADDV) : /* addv $dr,$sr */
3673  {
3674    SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3675    const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
3676#define FLD(f) abuf->fields.sfmt_add.f
3677#define OPRND(f) par_exec->operands.sfmt_addv.f
3678    int UNUSED written = abuf->written;
3679    IADDR UNUSED pc = abuf->addr;
3680    vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
3681
3682  CPU (h_cond) = OPRND (condbit);
3683  * FLD (i_dr) = OPRND (dr);
3684
3685#undef OPRND
3686#undef FLD
3687  }
3688  NEXT (vpc);
3689
3690  CASE (sem, INSN_PAR_ADDX) : /* addx $dr,$sr */
3691{
3692  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3693  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3694#define FLD(f) abuf->fields.sfmt_add.f
3695#define OPRND(f) par_exec->operands.sfmt_addx.f
3696  int UNUSED written = 0;
3697  IADDR UNUSED pc = abuf->addr;
3698  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3699
3700{
3701  SI temp0;BI temp1;
3702  temp0 = ADDCSI (* FLD (i_dr), * FLD (i_sr), CPU (h_cond));
3703  temp1 = ADDCFSI (* FLD (i_dr), * FLD (i_sr), CPU (h_cond));
3704  {
3705    SI opval = temp0;
3706    OPRND (dr) = opval;
3707    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
3708  }
3709  {
3710    BI opval = temp1;
3711    OPRND (condbit) = opval;
3712    TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
3713  }
3714}
3715
3716#undef OPRND
3717#undef FLD
3718}
3719  NEXT (vpc);
3720
3721CASE (sem, INSN_WRITE_ADDX) : /* addx $dr,$sr */
3722  {
3723    SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3724    const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
3725#define FLD(f) abuf->fields.sfmt_add.f
3726#define OPRND(f) par_exec->operands.sfmt_addx.f
3727    int UNUSED written = abuf->written;
3728    IADDR UNUSED pc = abuf->addr;
3729    vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
3730
3731  CPU (h_cond) = OPRND (condbit);
3732  * FLD (i_dr) = OPRND (dr);
3733
3734#undef OPRND
3735#undef FLD
3736  }
3737  NEXT (vpc);
3738
3739  CASE (sem, INSN_PAR_BC8) : /* bc.s $disp8 */
3740{
3741  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3742  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3743#define FLD(f) abuf->fields.sfmt_bl8.f
3744#define OPRND(f) par_exec->operands.sfmt_bc8.f
3745  int UNUSED written = 0;
3746  IADDR UNUSED pc = abuf->addr;
3747  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3748
3749if (CPU (h_cond)) {
3750  {
3751    USI opval = FLD (i_disp8);
3752    OPRND (pc) = opval;
3753    written |= (1 << 2);
3754    TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
3755  }
3756}
3757
3758  abuf->written = written;
3759#undef OPRND
3760#undef FLD
3761}
3762  NEXT (vpc);
3763
3764CASE (sem, INSN_WRITE_BC8) : /* bc.s $disp8 */
3765  {
3766    SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3767    const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
3768#define FLD(f) abuf->fields.sfmt_bl8.f
3769#define OPRND(f) par_exec->operands.sfmt_bc8.f
3770    int UNUSED written = abuf->written;
3771    IADDR UNUSED pc = abuf->addr;
3772    SEM_BRANCH_INIT
3773    vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
3774
3775  if (written & (1 << 2))
3776    {
3777      SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, OPRND (pc), vpc);
3778    }
3779
3780  SEM_BRANCH_FINI (vpc);
3781#undef OPRND
3782#undef FLD
3783  }
3784  NEXT (vpc);
3785
3786  CASE (sem, INSN_PAR_BL8) : /* bl.s $disp8 */
3787{
3788  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3789  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3790#define FLD(f) abuf->fields.sfmt_bl8.f
3791#define OPRND(f) par_exec->operands.sfmt_bl8.f
3792  int UNUSED written = 0;
3793  IADDR UNUSED pc = abuf->addr;
3794  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3795
3796{
3797  {
3798    SI opval = ADDSI (ANDSI (pc, -4), 4);
3799    OPRND (h_gr_SI_14) = opval;
3800    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
3801  }
3802  {
3803    USI opval = FLD (i_disp8);
3804    OPRND (pc) = opval;
3805    TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
3806  }
3807}
3808
3809#undef OPRND
3810#undef FLD
3811}
3812  NEXT (vpc);
3813
3814CASE (sem, INSN_WRITE_BL8) : /* bl.s $disp8 */
3815  {
3816    SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3817    const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
3818#define FLD(f) abuf->fields.sfmt_bl8.f
3819#define OPRND(f) par_exec->operands.sfmt_bl8.f
3820    int UNUSED written = abuf->written;
3821    IADDR UNUSED pc = abuf->addr;
3822    SEM_BRANCH_INIT
3823    vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
3824
3825  CPU (h_gr[((UINT) 14)]) = OPRND (h_gr_SI_14);
3826  SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, OPRND (pc), vpc);
3827
3828  SEM_BRANCH_FINI (vpc);
3829#undef OPRND
3830#undef FLD
3831  }
3832  NEXT (vpc);
3833
3834  CASE (sem, INSN_PAR_BCL8) : /* bcl.s $disp8 */
3835{
3836  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3837  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3838#define FLD(f) abuf->fields.sfmt_bl8.f
3839#define OPRND(f) par_exec->operands.sfmt_bcl8.f
3840  int UNUSED written = 0;
3841  IADDR UNUSED pc = abuf->addr;
3842  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3843
3844if (CPU (h_cond)) {
3845{
3846  {
3847    SI opval = ADDSI (ANDSI (pc, -4), 4);
3848    OPRND (h_gr_SI_14) = opval;
3849    written |= (1 << 3);
3850    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
3851  }
3852  {
3853    USI opval = FLD (i_disp8);
3854    OPRND (pc) = opval;
3855    written |= (1 << 4);
3856    TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
3857  }
3858}
3859}
3860
3861  abuf->written = written;
3862#undef OPRND
3863#undef FLD
3864}
3865  NEXT (vpc);
3866
3867CASE (sem, INSN_WRITE_BCL8) : /* bcl.s $disp8 */
3868  {
3869    SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3870    const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
3871#define FLD(f) abuf->fields.sfmt_bl8.f
3872#define OPRND(f) par_exec->operands.sfmt_bcl8.f
3873    int UNUSED written = abuf->written;
3874    IADDR UNUSED pc = abuf->addr;
3875    SEM_BRANCH_INIT
3876    vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
3877
3878  if (written & (1 << 3))
3879    {
3880      CPU (h_gr[((UINT) 14)]) = OPRND (h_gr_SI_14);
3881    }
3882  if (written & (1 << 4))
3883    {
3884      SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, OPRND (pc), vpc);
3885    }
3886
3887  SEM_BRANCH_FINI (vpc);
3888#undef OPRND
3889#undef FLD
3890  }
3891  NEXT (vpc);
3892
3893  CASE (sem, INSN_PAR_BNC8) : /* bnc.s $disp8 */
3894{
3895  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3896  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3897#define FLD(f) abuf->fields.sfmt_bl8.f
3898#define OPRND(f) par_exec->operands.sfmt_bc8.f
3899  int UNUSED written = 0;
3900  IADDR UNUSED pc = abuf->addr;
3901  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3902
3903if (NOTBI (CPU (h_cond))) {
3904  {
3905    USI opval = FLD (i_disp8);
3906    OPRND (pc) = opval;
3907    written |= (1 << 2);
3908    TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
3909  }
3910}
3911
3912  abuf->written = written;
3913#undef OPRND
3914#undef FLD
3915}
3916  NEXT (vpc);
3917
3918CASE (sem, INSN_WRITE_BNC8) : /* bnc.s $disp8 */
3919  {
3920    SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3921    const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
3922#define FLD(f) abuf->fields.sfmt_bl8.f
3923#define OPRND(f) par_exec->operands.sfmt_bc8.f
3924    int UNUSED written = abuf->written;
3925    IADDR UNUSED pc = abuf->addr;
3926    SEM_BRANCH_INIT
3927    vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
3928
3929  if (written & (1 << 2))
3930    {
3931      SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, OPRND (pc), vpc);
3932    }
3933
3934  SEM_BRANCH_FINI (vpc);
3935#undef OPRND
3936#undef FLD
3937  }
3938  NEXT (vpc);
3939
3940  CASE (sem, INSN_PAR_BRA8) : /* bra.s $disp8 */
3941{
3942  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3943  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3944#define FLD(f) abuf->fields.sfmt_bl8.f
3945#define OPRND(f) par_exec->operands.sfmt_bra8.f
3946  int UNUSED written = 0;
3947  IADDR UNUSED pc = abuf->addr;
3948  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3949
3950  {
3951    USI opval = FLD (i_disp8);
3952    OPRND (pc) = opval;
3953    TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
3954  }
3955
3956#undef OPRND
3957#undef FLD
3958}
3959  NEXT (vpc);
3960
3961CASE (sem, INSN_WRITE_BRA8) : /* bra.s $disp8 */
3962  {
3963    SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3964    const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
3965#define FLD(f) abuf->fields.sfmt_bl8.f
3966#define OPRND(f) par_exec->operands.sfmt_bra8.f
3967    int UNUSED written = abuf->written;
3968    IADDR UNUSED pc = abuf->addr;
3969    SEM_BRANCH_INIT
3970    vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
3971
3972  SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, OPRND (pc), vpc);
3973
3974  SEM_BRANCH_FINI (vpc);
3975#undef OPRND
3976#undef FLD
3977  }
3978  NEXT (vpc);
3979
3980  CASE (sem, INSN_PAR_BNCL8) : /* bncl.s $disp8 */
3981{
3982  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3983  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3984#define FLD(f) abuf->fields.sfmt_bl8.f
3985#define OPRND(f) par_exec->operands.sfmt_bcl8.f
3986  int UNUSED written = 0;
3987  IADDR UNUSED pc = abuf->addr;
3988  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3989
3990if (NOTBI (CPU (h_cond))) {
3991{
3992  {
3993    SI opval = ADDSI (ANDSI (pc, -4), 4);
3994    OPRND (h_gr_SI_14) = opval;
3995    written |= (1 << 3);
3996    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
3997  }
3998  {
3999    USI opval = FLD (i_disp8);
4000    OPRND (pc) = opval;
4001    written |= (1 << 4);
4002    TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
4003  }
4004}
4005}
4006
4007  abuf->written = written;
4008#undef OPRND
4009#undef FLD
4010}
4011  NEXT (vpc);
4012
4013CASE (sem, INSN_WRITE_BNCL8) : /* bncl.s $disp8 */
4014  {
4015    SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4016    const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
4017#define FLD(f) abuf->fields.sfmt_bl8.f
4018#define OPRND(f) par_exec->operands.sfmt_bcl8.f
4019    int UNUSED written = abuf->written;
4020    IADDR UNUSED pc = abuf->addr;
4021    SEM_BRANCH_INIT
4022    vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
4023
4024  if (written & (1 << 3))
4025    {
4026      CPU (h_gr[((UINT) 14)]) = OPRND (h_gr_SI_14);
4027    }
4028  if (written & (1 << 4))
4029    {
4030      SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, OPRND (pc), vpc);
4031    }
4032
4033  SEM_BRANCH_FINI (vpc);
4034#undef OPRND
4035#undef FLD
4036  }
4037  NEXT (vpc);
4038
4039  CASE (sem, INSN_PAR_CMP) : /* cmp $src1,$src2 */
4040{
4041  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4042  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4043#define FLD(f) abuf->fields.sfmt_st_plus.f
4044#define OPRND(f) par_exec->operands.sfmt_cmp.f
4045  int UNUSED written = 0;
4046  IADDR UNUSED pc = abuf->addr;
4047  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
4048
4049  {
4050    BI opval = LTSI (* FLD (i_src1), * FLD (i_src2));
4051    OPRND (condbit) = opval;
4052    TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
4053  }
4054
4055#undef OPRND
4056#undef FLD
4057}
4058  NEXT (vpc);
4059
4060CASE (sem, INSN_WRITE_CMP) : /* cmp $src1,$src2 */
4061  {
4062    SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4063    const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
4064#define FLD(f) abuf->fields.sfmt_st_plus.f
4065#define OPRND(f) par_exec->operands.sfmt_cmp.f
4066    int UNUSED written = abuf->written;
4067    IADDR UNUSED pc = abuf->addr;
4068    vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
4069
4070  CPU (h_cond) = OPRND (condbit);
4071
4072#undef OPRND
4073#undef FLD
4074  }
4075  NEXT (vpc);
4076
4077  CASE (sem, INSN_PAR_CMPU) : /* cmpu $src1,$src2 */
4078{
4079  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4080  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4081#define FLD(f) abuf->fields.sfmt_st_plus.f
4082#define OPRND(f) par_exec->operands.sfmt_cmp.f
4083  int UNUSED written = 0;
4084  IADDR UNUSED pc = abuf->addr;
4085  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
4086
4087  {
4088    BI opval = LTUSI (* FLD (i_src1), * FLD (i_src2));
4089    OPRND (condbit) = opval;
4090    TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
4091  }
4092
4093#undef OPRND
4094#undef FLD
4095}
4096  NEXT (vpc);
4097
4098CASE (sem, INSN_WRITE_CMPU) : /* cmpu $src1,$src2 */
4099  {
4100    SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4101    const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
4102#define FLD(f) abuf->fields.sfmt_st_plus.f
4103#define OPRND(f) par_exec->operands.sfmt_cmp.f
4104    int UNUSED written = abuf->written;
4105    IADDR UNUSED pc = abuf->addr;
4106    vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
4107
4108  CPU (h_cond) = OPRND (condbit);
4109
4110#undef OPRND
4111#undef FLD
4112  }
4113  NEXT (vpc);
4114
4115  CASE (sem, INSN_PAR_CMPEQ) : /* cmpeq $src1,$src2 */
4116{
4117  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4118  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4119#define FLD(f) abuf->fields.sfmt_st_plus.f
4120#define OPRND(f) par_exec->operands.sfmt_cmp.f
4121  int UNUSED written = 0;
4122  IADDR UNUSED pc = abuf->addr;
4123  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
4124
4125  {
4126    BI opval = EQSI (* FLD (i_src1), * FLD (i_src2));
4127    OPRND (condbit) = opval;
4128    TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
4129  }
4130
4131#undef OPRND
4132#undef FLD
4133}
4134  NEXT (vpc);
4135
4136CASE (sem, INSN_WRITE_CMPEQ) : /* cmpeq $src1,$src2 */
4137  {
4138    SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4139    const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
4140#define FLD(f) abuf->fields.sfmt_st_plus.f
4141#define OPRND(f) par_exec->operands.sfmt_cmp.f
4142    int UNUSED written = abuf->written;
4143    IADDR UNUSED pc = abuf->addr;
4144    vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
4145
4146  CPU (h_cond) = OPRND (condbit);
4147
4148#undef OPRND
4149#undef FLD
4150  }
4151  NEXT (vpc);
4152
4153  CASE (sem, INSN_PAR_CMPZ) : /* cmpz $src2 */
4154{
4155  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4156  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4157#define FLD(f) abuf->fields.sfmt_st_plus.f
4158#define OPRND(f) par_exec->operands.sfmt_cmpz.f
4159  int UNUSED written = 0;
4160  IADDR UNUSED pc = abuf->addr;
4161  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
4162
4163  {
4164    BI opval = EQSI (* FLD (i_src2), 0);
4165    OPRND (condbit) = opval;
4166    TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
4167  }
4168
4169#undef OPRND
4170#undef FLD
4171}
4172  NEXT (vpc);
4173
4174CASE (sem, INSN_WRITE_CMPZ) : /* cmpz $src2 */
4175  {
4176    SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4177    const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
4178#define FLD(f) abuf->fields.sfmt_st_plus.f
4179#define OPRND(f) par_exec->operands.sfmt_cmpz.f
4180    int UNUSED written = abuf->written;
4181    IADDR UNUSED pc = abuf->addr;
4182    vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
4183
4184  CPU (h_cond) = OPRND (condbit);
4185
4186#undef OPRND
4187#undef FLD
4188  }
4189  NEXT (vpc);
4190
4191  CASE (sem, INSN_PAR_JC) : /* jc $sr */
4192{
4193  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4194  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4195#define FLD(f) abuf->fields.sfmt_jl.f
4196#define OPRND(f) par_exec->operands.sfmt_jc.f
4197  int UNUSED written = 0;
4198  IADDR UNUSED pc = abuf->addr;
4199  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
4200
4201if (CPU (h_cond)) {
4202  {
4203    USI opval = ANDSI (* FLD (i_sr), -4);
4204    OPRND (pc) = opval;
4205    written |= (1 << 2);
4206    TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
4207  }
4208}
4209
4210  abuf->written = written;
4211#undef OPRND
4212#undef FLD
4213}
4214  NEXT (vpc);
4215
4216CASE (sem, INSN_WRITE_JC) : /* jc $sr */
4217  {
4218    SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4219    const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
4220#define FLD(f) abuf->fields.sfmt_jl.f
4221#define OPRND(f) par_exec->operands.sfmt_jc.f
4222    int UNUSED written = abuf->written;
4223    IADDR UNUSED pc = abuf->addr;
4224    SEM_BRANCH_INIT
4225    vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
4226
4227  if (written & (1 << 2))
4228    {
4229      SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, OPRND (pc), vpc);
4230    }
4231
4232  SEM_BRANCH_FINI (vpc);
4233#undef OPRND
4234#undef FLD
4235  }
4236  NEXT (vpc);
4237
4238  CASE (sem, INSN_PAR_JNC) : /* jnc $sr */
4239{
4240  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4241  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4242#define FLD(f) abuf->fields.sfmt_jl.f
4243#define OPRND(f) par_exec->operands.sfmt_jc.f
4244  int UNUSED written = 0;
4245  IADDR UNUSED pc = abuf->addr;
4246  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
4247
4248if (NOTBI (CPU (h_cond))) {
4249  {
4250    USI opval = ANDSI (* FLD (i_sr), -4);
4251    OPRND (pc) = opval;
4252    written |= (1 << 2);
4253    TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
4254  }
4255}
4256
4257  abuf->written = written;
4258#undef OPRND
4259#undef FLD
4260}
4261  NEXT (vpc);
4262
4263CASE (sem, INSN_WRITE_JNC) : /* jnc $sr */
4264  {
4265    SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4266    const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
4267#define FLD(f) abuf->fields.sfmt_jl.f
4268#define OPRND(f) par_exec->operands.sfmt_jc.f
4269    int UNUSED written = abuf->written;
4270    IADDR UNUSED pc = abuf->addr;
4271    SEM_BRANCH_INIT
4272    vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
4273
4274  if (written & (1 << 2))
4275    {
4276      SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, OPRND (pc), vpc);
4277    }
4278
4279  SEM_BRANCH_FINI (vpc);
4280#undef OPRND
4281#undef FLD
4282  }
4283  NEXT (vpc);
4284
4285  CASE (sem, INSN_PAR_JL) : /* jl $sr */
4286{
4287  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4288  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4289#define FLD(f) abuf->fields.sfmt_jl.f
4290#define OPRND(f) par_exec->operands.sfmt_jl.f
4291  int UNUSED written = 0;
4292  IADDR UNUSED pc = abuf->addr;
4293  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
4294
4295{
4296  SI temp0;USI temp1;
4297  temp0 = ADDSI (ANDSI (pc, -4), 4);
4298  temp1 = ANDSI (* FLD (i_sr), -4);
4299  {
4300    SI opval = temp0;
4301    OPRND (h_gr_SI_14) = opval;
4302    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
4303  }
4304  {
4305    USI opval = temp1;
4306    OPRND (pc) = opval;
4307    TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
4308  }
4309}
4310
4311#undef OPRND
4312#undef FLD
4313}
4314  NEXT (vpc);
4315
4316CASE (sem, INSN_WRITE_JL) : /* jl $sr */
4317  {
4318    SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4319    const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
4320#define FLD(f) abuf->fields.sfmt_jl.f
4321#define OPRND(f) par_exec->operands.sfmt_jl.f
4322    int UNUSED written = abuf->written;
4323    IADDR UNUSED pc = abuf->addr;
4324    SEM_BRANCH_INIT
4325    vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
4326
4327  CPU (h_gr[((UINT) 14)]) = OPRND (h_gr_SI_14);
4328  SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, OPRND (pc), vpc);
4329
4330  SEM_BRANCH_FINI (vpc);
4331#undef OPRND
4332#undef FLD
4333  }
4334  NEXT (vpc);
4335
4336  CASE (sem, INSN_PAR_JMP) : /* jmp $sr */
4337{
4338  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4339  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4340#define FLD(f) abuf->fields.sfmt_jl.f
4341#define OPRND(f) par_exec->operands.sfmt_jmp.f
4342  int UNUSED written = 0;
4343  IADDR UNUSED pc = abuf->addr;
4344  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
4345
4346  {
4347    USI opval = ANDSI (* FLD (i_sr), -4);
4348    OPRND (pc) = opval;
4349    TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
4350  }
4351
4352#undef OPRND
4353#undef FLD
4354}
4355  NEXT (vpc);
4356
4357CASE (sem, INSN_WRITE_JMP) : /* jmp $sr */
4358  {
4359    SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4360    const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
4361#define FLD(f) abuf->fields.sfmt_jl.f
4362#define OPRND(f) par_exec->operands.sfmt_jmp.f
4363    int UNUSED written = abuf->written;
4364    IADDR UNUSED pc = abuf->addr;
4365    SEM_BRANCH_INIT
4366    vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
4367
4368  SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, OPRND (pc), vpc);
4369
4370  SEM_BRANCH_FINI (vpc);
4371#undef OPRND
4372#undef FLD
4373  }
4374  NEXT (vpc);
4375
4376  CASE (sem, INSN_PAR_LD) : /* ld $dr,@$sr */
4377{
4378  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4379  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4380#define FLD(f) abuf->fields.sfmt_ld_plus.f
4381#define OPRND(f) par_exec->operands.sfmt_ld.f
4382  int UNUSED written = 0;
4383  IADDR UNUSED pc = abuf->addr;
4384  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
4385
4386  {
4387    SI opval = GETMEMSI (current_cpu, pc, * FLD (i_sr));
4388    OPRND (dr) = opval;
4389    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
4390  }
4391
4392#undef OPRND
4393#undef FLD
4394}
4395  NEXT (vpc);
4396
4397CASE (sem, INSN_WRITE_LD) : /* ld $dr,@$sr */
4398  {
4399    SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4400    const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
4401#define FLD(f) abuf->fields.sfmt_ld_plus.f
4402#define OPRND(f) par_exec->operands.sfmt_ld.f
4403    int UNUSED written = abuf->written;
4404    IADDR UNUSED pc = abuf->addr;
4405    vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
4406
4407  * FLD (i_dr) = OPRND (dr);
4408
4409#undef OPRND
4410#undef FLD
4411  }
4412  NEXT (vpc);
4413
4414  CASE (sem, INSN_PAR_LDB) : /* ldb $dr,@$sr */
4415{
4416  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4417  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4418#define FLD(f) abuf->fields.sfmt_ld_plus.f
4419#define OPRND(f) par_exec->operands.sfmt_ldb.f
4420  int UNUSED written = 0;
4421  IADDR UNUSED pc = abuf->addr;
4422  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
4423
4424  {
4425    SI opval = EXTQISI (GETMEMQI (current_cpu, pc, * FLD (i_sr)));
4426    OPRND (dr) = opval;
4427    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
4428  }
4429
4430#undef OPRND
4431#undef FLD
4432}
4433  NEXT (vpc);
4434
4435CASE (sem, INSN_WRITE_LDB) : /* ldb $dr,@$sr */
4436  {
4437    SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4438    const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
4439#define FLD(f) abuf->fields.sfmt_ld_plus.f
4440#define OPRND(f) par_exec->operands.sfmt_ldb.f
4441    int UNUSED written = abuf->written;
4442    IADDR UNUSED pc = abuf->addr;
4443    vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
4444
4445  * FLD (i_dr) = OPRND (dr);
4446
4447#undef OPRND
4448#undef FLD
4449  }
4450  NEXT (vpc);
4451
4452  CASE (sem, INSN_PAR_LDH) : /* ldh $dr,@$sr */
4453{
4454  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4455  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4456#define FLD(f) abuf->fields.sfmt_ld_plus.f
4457#define OPRND(f) par_exec->operands.sfmt_ldh.f
4458  int UNUSED written = 0;
4459  IADDR UNUSED pc = abuf->addr;
4460  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
4461
4462  {
4463    SI opval = EXTHISI (GETMEMHI (current_cpu, pc, * FLD (i_sr)));
4464    OPRND (dr) = opval;
4465    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
4466  }
4467
4468#undef OPRND
4469#undef FLD
4470}
4471  NEXT (vpc);
4472
4473CASE (sem, INSN_WRITE_LDH) : /* ldh $dr,@$sr */
4474  {
4475    SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4476    const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
4477#define FLD(f) abuf->fields.sfmt_ld_plus.f
4478#define OPRND(f) par_exec->operands.sfmt_ldh.f
4479    int UNUSED written = abuf->written;
4480    IADDR UNUSED pc = abuf->addr;
4481    vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
4482
4483  * FLD (i_dr) = OPRND (dr);
4484
4485#undef OPRND
4486#undef FLD
4487  }
4488  NEXT (vpc);
4489
4490  CASE (sem, INSN_PAR_LDUB) : /* ldub $dr,@$sr */
4491{
4492  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4493  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4494#define FLD(f) abuf->fields.sfmt_ld_plus.f
4495#define OPRND(f) par_exec->operands.sfmt_ldb.f
4496  int UNUSED written = 0;
4497  IADDR UNUSED pc = abuf->addr;
4498  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
4499
4500  {
4501    SI opval = ZEXTQISI (GETMEMQI (current_cpu, pc, * FLD (i_sr)));
4502    OPRND (dr) = opval;
4503    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
4504  }
4505
4506#undef OPRND
4507#undef FLD
4508}
4509  NEXT (vpc);
4510
4511CASE (sem, INSN_WRITE_LDUB) : /* ldub $dr,@$sr */
4512  {
4513    SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4514    const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
4515#define FLD(f) abuf->fields.sfmt_ld_plus.f
4516#define OPRND(f) par_exec->operands.sfmt_ldb.f
4517    int UNUSED written = abuf->written;
4518    IADDR UNUSED pc = abuf->addr;
4519    vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
4520
4521  * FLD (i_dr) = OPRND (dr);
4522
4523#undef OPRND
4524#undef FLD
4525  }
4526  NEXT (vpc);
4527
4528  CASE (sem, INSN_PAR_LDUH) : /* lduh $dr,@$sr */
4529{
4530  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4531  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4532#define FLD(f) abuf->fields.sfmt_ld_plus.f
4533#define OPRND(f) par_exec->operands.sfmt_ldh.f
4534  int UNUSED written = 0;
4535  IADDR UNUSED pc = abuf->addr;
4536  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
4537
4538  {
4539    SI opval = ZEXTHISI (GETMEMHI (current_cpu, pc, * FLD (i_sr)));
4540    OPRND (dr) = opval;
4541    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
4542  }
4543
4544#undef OPRND
4545#undef FLD
4546}
4547  NEXT (vpc);
4548
4549CASE (sem, INSN_WRITE_LDUH) : /* lduh $dr,@$sr */
4550  {
4551    SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4552    const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
4553#define FLD(f) abuf->fields.sfmt_ld_plus.f
4554#define OPRND(f) par_exec->operands.sfmt_ldh.f
4555    int UNUSED written = abuf->written;
4556    IADDR UNUSED pc = abuf->addr;
4557    vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
4558
4559  * FLD (i_dr) = OPRND (dr);
4560
4561#undef OPRND
4562#undef FLD
4563  }
4564  NEXT (vpc);
4565
4566  CASE (sem, INSN_PAR_LD_PLUS) : /* ld $dr,@$sr+ */
4567{
4568  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4569  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4570#define FLD(f) abuf->fields.sfmt_ld_plus.f
4571#define OPRND(f) par_exec->operands.sfmt_ld_plus.f
4572  int UNUSED written = 0;
4573  IADDR UNUSED pc = abuf->addr;
4574  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
4575
4576{
4577  SI temp0;SI temp1;
4578  temp0 = GETMEMSI (current_cpu, pc, * FLD (i_sr));
4579  temp1 = ADDSI (* FLD (i_sr), 4);
4580  {
4581    SI opval = temp0;
4582    OPRND (dr) = opval;
4583    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
4584  }
4585  {
4586    SI opval = temp1;
4587    OPRND (sr) = opval;
4588    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
4589  }
4590}
4591
4592#undef OPRND
4593#undef FLD
4594}
4595  NEXT (vpc);
4596
4597CASE (sem, INSN_WRITE_LD_PLUS) : /* ld $dr,@$sr+ */
4598  {
4599    SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4600    const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
4601#define FLD(f) abuf->fields.sfmt_ld_plus.f
4602#define OPRND(f) par_exec->operands.sfmt_ld_plus.f
4603    int UNUSED written = abuf->written;
4604    IADDR UNUSED pc = abuf->addr;
4605    vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
4606
4607  * FLD (i_dr) = OPRND (dr);
4608  * FLD (i_sr) = OPRND (sr);
4609
4610#undef OPRND
4611#undef FLD
4612  }
4613  NEXT (vpc);
4614
4615  CASE (sem, INSN_PAR_LDI8) : /* ldi8 $dr,$simm8 */
4616{
4617  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4618  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4619#define FLD(f) abuf->fields.sfmt_addi.f
4620#define OPRND(f) par_exec->operands.sfmt_ldi8.f
4621  int UNUSED written = 0;
4622  IADDR UNUSED pc = abuf->addr;
4623  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
4624
4625  {
4626    SI opval = FLD (f_simm8);
4627    OPRND (dr) = opval;
4628    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
4629  }
4630
4631#undef OPRND
4632#undef FLD
4633}
4634  NEXT (vpc);
4635
4636CASE (sem, INSN_WRITE_LDI8) : /* ldi8 $dr,$simm8 */
4637  {
4638    SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4639    const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
4640#define FLD(f) abuf->fields.sfmt_addi.f
4641#define OPRND(f) par_exec->operands.sfmt_ldi8.f
4642    int UNUSED written = abuf->written;
4643    IADDR UNUSED pc = abuf->addr;
4644    vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
4645
4646  * FLD (i_dr) = OPRND (dr);
4647
4648#undef OPRND
4649#undef FLD
4650  }
4651  NEXT (vpc);
4652
4653  CASE (sem, INSN_PAR_LOCK) : /* lock $dr,@$sr */
4654{
4655  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4656  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4657#define FLD(f) abuf->fields.sfmt_ld_plus.f
4658#define OPRND(f) par_exec->operands.sfmt_lock.f
4659  int UNUSED written = 0;
4660  IADDR UNUSED pc = abuf->addr;
4661  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
4662
4663{
4664  {
4665    BI opval = 1;
4666    OPRND (h_lock_BI) = opval;
4667    TRACE_RESULT (current_cpu, abuf, "lock", 'x', opval);
4668  }
4669  {
4670    SI opval = GETMEMSI (current_cpu, pc, * FLD (i_sr));
4671    OPRND (dr) = opval;
4672    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
4673  }
4674}
4675
4676#undef OPRND
4677#undef FLD
4678}
4679  NEXT (vpc);
4680
4681CASE (sem, INSN_WRITE_LOCK) : /* lock $dr,@$sr */
4682  {
4683    SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4684    const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
4685#define FLD(f) abuf->fields.sfmt_ld_plus.f
4686#define OPRND(f) par_exec->operands.sfmt_lock.f
4687    int UNUSED written = abuf->written;
4688    IADDR UNUSED pc = abuf->addr;
4689    vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
4690
4691  * FLD (i_dr) = OPRND (dr);
4692  CPU (h_lock) = OPRND (h_lock_BI);
4693
4694#undef OPRND
4695#undef FLD
4696  }
4697  NEXT (vpc);
4698
4699  CASE (sem, INSN_PAR_MACHI_A) : /* machi $src1,$src2,$acc */
4700{
4701  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4702  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4703#define FLD(f) abuf->fields.sfmt_machi_a.f
4704#define OPRND(f) par_exec->operands.sfmt_machi_a.f
4705  int UNUSED written = 0;
4706  IADDR UNUSED pc = abuf->addr;
4707  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
4708
4709  {
4710    DI opval = SRADI (SLLDI (ADDDI (GET_H_ACCUMS (FLD (f_acc)), MULDI (EXTSIDI (ANDSI (* FLD (i_src1), 0xffff0000)), EXTHIDI (TRUNCSIHI (SRASI (* FLD (i_src2), 16))))), 8), 8);
4711    OPRND (acc) = opval;
4712    TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
4713  }
4714
4715#undef OPRND
4716#undef FLD
4717}
4718  NEXT (vpc);
4719
4720CASE (sem, INSN_WRITE_MACHI_A) : /* machi $src1,$src2,$acc */
4721  {
4722    SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4723    const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
4724#define FLD(f) abuf->fields.sfmt_machi_a.f
4725#define OPRND(f) par_exec->operands.sfmt_machi_a.f
4726    int UNUSED written = abuf->written;
4727    IADDR UNUSED pc = abuf->addr;
4728    vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
4729
4730  SET_H_ACCUMS (FLD (f_acc), OPRND (acc));
4731
4732#undef OPRND
4733#undef FLD
4734  }
4735  NEXT (vpc);
4736
4737  CASE (sem, INSN_PAR_MACLO_A) : /* maclo $src1,$src2,$acc */
4738{
4739  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4740  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4741#define FLD(f) abuf->fields.sfmt_machi_a.f
4742#define OPRND(f) par_exec->operands.sfmt_machi_a.f
4743  int UNUSED written = 0;
4744  IADDR UNUSED pc = abuf->addr;
4745  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
4746
4747  {
4748    DI opval = SRADI (SLLDI (ADDDI (GET_H_ACCUMS (FLD (f_acc)), MULDI (EXTSIDI (SLLSI (* FLD (i_src1), 16)), EXTHIDI (TRUNCSIHI (* FLD (i_src2))))), 8), 8);
4749    OPRND (acc) = opval;
4750    TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
4751  }
4752
4753#undef OPRND
4754#undef FLD
4755}
4756  NEXT (vpc);
4757
4758CASE (sem, INSN_WRITE_MACLO_A) : /* maclo $src1,$src2,$acc */
4759  {
4760    SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4761    const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
4762#define FLD(f) abuf->fields.sfmt_machi_a.f
4763#define OPRND(f) par_exec->operands.sfmt_machi_a.f
4764    int UNUSED written = abuf->written;
4765    IADDR UNUSED pc = abuf->addr;
4766    vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
4767
4768  SET_H_ACCUMS (FLD (f_acc), OPRND (acc));
4769
4770#undef OPRND
4771#undef FLD
4772  }
4773  NEXT (vpc);
4774
4775  CASE (sem, INSN_PAR_MACWHI_A) : /* macwhi $src1,$src2,$acc */
4776{
4777  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4778  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4779#define FLD(f) abuf->fields.sfmt_machi_a.f
4780#define OPRND(f) par_exec->operands.sfmt_machi_a.f
4781  int UNUSED written = 0;
4782  IADDR UNUSED pc = abuf->addr;
4783  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
4784
4785  {
4786    DI opval = ADDDI (GET_H_ACCUMS (FLD (f_acc)), MULDI (EXTSIDI (* FLD (i_src1)), EXTHIDI (TRUNCSIHI (SRASI (* FLD (i_src2), 16)))));
4787    OPRND (acc) = opval;
4788    TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
4789  }
4790
4791#undef OPRND
4792#undef FLD
4793}
4794  NEXT (vpc);
4795
4796CASE (sem, INSN_WRITE_MACWHI_A) : /* macwhi $src1,$src2,$acc */
4797  {
4798    SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4799    const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
4800#define FLD(f) abuf->fields.sfmt_machi_a.f
4801#define OPRND(f) par_exec->operands.sfmt_machi_a.f
4802    int UNUSED written = abuf->written;
4803    IADDR UNUSED pc = abuf->addr;
4804    vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
4805
4806  SET_H_ACCUMS (FLD (f_acc), OPRND (acc));
4807
4808#undef OPRND
4809#undef FLD
4810  }
4811  NEXT (vpc);
4812
4813  CASE (sem, INSN_PAR_MACWLO_A) : /* macwlo $src1,$src2,$acc */
4814{
4815  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4816  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4817#define FLD(f) abuf->fields.sfmt_machi_a.f
4818#define OPRND(f) par_exec->operands.sfmt_machi_a.f
4819  int UNUSED written = 0;
4820  IADDR UNUSED pc = abuf->addr;
4821  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
4822
4823  {
4824    DI opval = ADDDI (GET_H_ACCUMS (FLD (f_acc)), MULDI (EXTSIDI (* FLD (i_src1)), EXTHIDI (TRUNCSIHI (* FLD (i_src2)))));
4825    OPRND (acc) = opval;
4826    TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
4827  }
4828
4829#undef OPRND
4830#undef FLD
4831}
4832  NEXT (vpc);
4833
4834CASE (sem, INSN_WRITE_MACWLO_A) : /* macwlo $src1,$src2,$acc */
4835  {
4836    SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4837    const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
4838#define FLD(f) abuf->fields.sfmt_machi_a.f
4839#define OPRND(f) par_exec->operands.sfmt_machi_a.f
4840    int UNUSED written = abuf->written;
4841    IADDR UNUSED pc = abuf->addr;
4842    vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
4843
4844  SET_H_ACCUMS (FLD (f_acc), OPRND (acc));
4845
4846#undef OPRND
4847#undef FLD
4848  }
4849  NEXT (vpc);
4850
4851  CASE (sem, INSN_PAR_MUL) : /* mul $dr,$sr */
4852{
4853  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4854  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4855#define FLD(f) abuf->fields.sfmt_add.f
4856#define OPRND(f) par_exec->operands.sfmt_add.f
4857  int UNUSED written = 0;
4858  IADDR UNUSED pc = abuf->addr;
4859  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
4860
4861  {
4862    SI opval = MULSI (* FLD (i_dr), * FLD (i_sr));
4863    OPRND (dr) = opval;
4864    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
4865  }
4866
4867#undef OPRND
4868#undef FLD
4869}
4870  NEXT (vpc);
4871
4872CASE (sem, INSN_WRITE_MUL) : /* mul $dr,$sr */
4873  {
4874    SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4875    const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
4876#define FLD(f) abuf->fields.sfmt_add.f
4877#define OPRND(f) par_exec->operands.sfmt_add.f
4878    int UNUSED written = abuf->written;
4879    IADDR UNUSED pc = abuf->addr;
4880    vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
4881
4882  * FLD (i_dr) = OPRND (dr);
4883
4884#undef OPRND
4885#undef FLD
4886  }
4887  NEXT (vpc);
4888
4889  CASE (sem, INSN_PAR_MULHI_A) : /* mulhi $src1,$src2,$acc */
4890{
4891  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4892  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4893#define FLD(f) abuf->fields.sfmt_machi_a.f
4894#define OPRND(f) par_exec->operands.sfmt_mulhi_a.f
4895  int UNUSED written = 0;
4896  IADDR UNUSED pc = abuf->addr;
4897  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
4898
4899  {
4900    DI opval = SRADI (SLLDI (MULDI (EXTSIDI (ANDSI (* FLD (i_src1), 0xffff0000)), EXTHIDI (TRUNCSIHI (SRASI (* FLD (i_src2), 16)))), 16), 16);
4901    OPRND (acc) = opval;
4902    TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
4903  }
4904
4905#undef OPRND
4906#undef FLD
4907}
4908  NEXT (vpc);
4909
4910CASE (sem, INSN_WRITE_MULHI_A) : /* mulhi $src1,$src2,$acc */
4911  {
4912    SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4913    const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
4914#define FLD(f) abuf->fields.sfmt_machi_a.f
4915#define OPRND(f) par_exec->operands.sfmt_mulhi_a.f
4916    int UNUSED written = abuf->written;
4917    IADDR UNUSED pc = abuf->addr;
4918    vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
4919
4920  SET_H_ACCUMS (FLD (f_acc), OPRND (acc));
4921
4922#undef OPRND
4923#undef FLD
4924  }
4925  NEXT (vpc);
4926
4927  CASE (sem, INSN_PAR_MULLO_A) : /* mullo $src1,$src2,$acc */
4928{
4929  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4930  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4931#define FLD(f) abuf->fields.sfmt_machi_a.f
4932#define OPRND(f) par_exec->operands.sfmt_mulhi_a.f
4933  int UNUSED written = 0;
4934  IADDR UNUSED pc = abuf->addr;
4935  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
4936
4937  {
4938    DI opval = SRADI (SLLDI (MULDI (EXTSIDI (SLLSI (* FLD (i_src1), 16)), EXTHIDI (TRUNCSIHI (* FLD (i_src2)))), 16), 16);
4939    OPRND (acc) = opval;
4940    TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
4941  }
4942
4943#undef OPRND
4944#undef FLD
4945}
4946  NEXT (vpc);
4947
4948CASE (sem, INSN_WRITE_MULLO_A) : /* mullo $src1,$src2,$acc */
4949  {
4950    SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4951    const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
4952#define FLD(f) abuf->fields.sfmt_machi_a.f
4953#define OPRND(f) par_exec->operands.sfmt_mulhi_a.f
4954    int UNUSED written = abuf->written;
4955    IADDR UNUSED pc = abuf->addr;
4956    vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
4957
4958  SET_H_ACCUMS (FLD (f_acc), OPRND (acc));
4959
4960#undef OPRND
4961#undef FLD
4962  }
4963  NEXT (vpc);
4964
4965  CASE (sem, INSN_PAR_MULWHI_A) : /* mulwhi $src1,$src2,$acc */
4966{
4967  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4968  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4969#define FLD(f) abuf->fields.sfmt_machi_a.f
4970#define OPRND(f) par_exec->operands.sfmt_mulhi_a.f
4971  int UNUSED written = 0;
4972  IADDR UNUSED pc = abuf->addr;
4973  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
4974
4975  {
4976    DI opval = MULDI (EXTSIDI (* FLD (i_src1)), EXTHIDI (TRUNCSIHI (SRASI (* FLD (i_src2), 16))));
4977    OPRND (acc) = opval;
4978    TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
4979  }
4980
4981#undef OPRND
4982#undef FLD
4983}
4984  NEXT (vpc);
4985
4986CASE (sem, INSN_WRITE_MULWHI_A) : /* mulwhi $src1,$src2,$acc */
4987  {
4988    SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4989    const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
4990#define FLD(f) abuf->fields.sfmt_machi_a.f
4991#define OPRND(f) par_exec->operands.sfmt_mulhi_a.f
4992    int UNUSED written = abuf->written;
4993    IADDR UNUSED pc = abuf->addr;
4994    vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
4995
4996  SET_H_ACCUMS (FLD (f_acc), OPRND (acc));
4997
4998#undef OPRND
4999#undef FLD
5000  }
5001  NEXT (vpc);
5002
5003  CASE (sem, INSN_PAR_MULWLO_A) : /* mulwlo $src1,$src2,$acc */
5004{
5005  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5006  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
5007#define FLD(f) abuf->fields.sfmt_machi_a.f
5008#define OPRND(f) par_exec->operands.sfmt_mulhi_a.f
5009  int UNUSED written = 0;
5010  IADDR UNUSED pc = abuf->addr;
5011  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
5012
5013  {
5014    DI opval = MULDI (EXTSIDI (* FLD (i_src1)), EXTHIDI (TRUNCSIHI (* FLD (i_src2))));
5015    OPRND (acc) = opval;
5016    TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
5017  }
5018
5019#undef OPRND
5020#undef FLD
5021}
5022  NEXT (vpc);
5023
5024CASE (sem, INSN_WRITE_MULWLO_A) : /* mulwlo $src1,$src2,$acc */
5025  {
5026    SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5027    const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
5028#define FLD(f) abuf->fields.sfmt_machi_a.f
5029#define OPRND(f) par_exec->operands.sfmt_mulhi_a.f
5030    int UNUSED written = abuf->written;
5031    IADDR UNUSED pc = abuf->addr;
5032    vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
5033
5034  SET_H_ACCUMS (FLD (f_acc), OPRND (acc));
5035
5036#undef OPRND
5037#undef FLD
5038  }
5039  NEXT (vpc);
5040
5041  CASE (sem, INSN_PAR_MV) : /* mv $dr,$sr */
5042{
5043  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5044  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
5045#define FLD(f) abuf->fields.sfmt_ld_plus.f
5046#define OPRND(f) par_exec->operands.sfmt_mv.f
5047  int UNUSED written = 0;
5048  IADDR UNUSED pc = abuf->addr;
5049  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
5050
5051  {
5052    SI opval = * FLD (i_sr);
5053    OPRND (dr) = opval;
5054    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
5055  }
5056
5057#undef OPRND
5058#undef FLD
5059}
5060  NEXT (vpc);
5061
5062CASE (sem, INSN_WRITE_MV) : /* mv $dr,$sr */
5063  {
5064    SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5065    const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
5066#define FLD(f) abuf->fields.sfmt_ld_plus.f
5067#define OPRND(f) par_exec->operands.sfmt_mv.f
5068    int UNUSED written = abuf->written;
5069    IADDR UNUSED pc = abuf->addr;
5070    vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
5071
5072  * FLD (i_dr) = OPRND (dr);
5073
5074#undef OPRND
5075#undef FLD
5076  }
5077  NEXT (vpc);
5078
5079  CASE (sem, INSN_PAR_MVFACHI_A) : /* mvfachi $dr,$accs */
5080{
5081  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5082  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
5083#define FLD(f) abuf->fields.sfmt_mvfachi_a.f
5084#define OPRND(f) par_exec->operands.sfmt_mvfachi_a.f
5085  int UNUSED written = 0;
5086  IADDR UNUSED pc = abuf->addr;
5087  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
5088
5089  {
5090    SI opval = TRUNCDISI (SRADI (GET_H_ACCUMS (FLD (f_accs)), 32));
5091    OPRND (dr) = opval;
5092    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
5093  }
5094
5095#undef OPRND
5096#undef FLD
5097}
5098  NEXT (vpc);
5099
5100CASE (sem, INSN_WRITE_MVFACHI_A) : /* mvfachi $dr,$accs */
5101  {
5102    SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5103    const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
5104#define FLD(f) abuf->fields.sfmt_mvfachi_a.f
5105#define OPRND(f) par_exec->operands.sfmt_mvfachi_a.f
5106    int UNUSED written = abuf->written;
5107    IADDR UNUSED pc = abuf->addr;
5108    vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
5109
5110  * FLD (i_dr) = OPRND (dr);
5111
5112#undef OPRND
5113#undef FLD
5114  }
5115  NEXT (vpc);
5116
5117  CASE (sem, INSN_PAR_MVFACLO_A) : /* mvfaclo $dr,$accs */
5118{
5119  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5120  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
5121#define FLD(f) abuf->fields.sfmt_mvfachi_a.f
5122#define OPRND(f) par_exec->operands.sfmt_mvfachi_a.f
5123  int UNUSED written = 0;
5124  IADDR UNUSED pc = abuf->addr;
5125  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
5126
5127  {
5128    SI opval = TRUNCDISI (GET_H_ACCUMS (FLD (f_accs)));
5129    OPRND (dr) = opval;
5130    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
5131  }
5132
5133#undef OPRND
5134#undef FLD
5135}
5136  NEXT (vpc);
5137
5138CASE (sem, INSN_WRITE_MVFACLO_A) : /* mvfaclo $dr,$accs */
5139  {
5140    SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5141    const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
5142#define FLD(f) abuf->fields.sfmt_mvfachi_a.f
5143#define OPRND(f) par_exec->operands.sfmt_mvfachi_a.f
5144    int UNUSED written = abuf->written;
5145    IADDR UNUSED pc = abuf->addr;
5146    vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
5147
5148  * FLD (i_dr) = OPRND (dr);
5149
5150#undef OPRND
5151#undef FLD
5152  }
5153  NEXT (vpc);
5154
5155  CASE (sem, INSN_PAR_MVFACMI_A) : /* mvfacmi $dr,$accs */
5156{
5157  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5158  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
5159#define FLD(f) abuf->fields.sfmt_mvfachi_a.f
5160#define OPRND(f) par_exec->operands.sfmt_mvfachi_a.f
5161  int UNUSED written = 0;
5162  IADDR UNUSED pc = abuf->addr;
5163  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
5164
5165  {
5166    SI opval = TRUNCDISI (SRADI (GET_H_ACCUMS (FLD (f_accs)), 16));
5167    OPRND (dr) = opval;
5168    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
5169  }
5170
5171#undef OPRND
5172#undef FLD
5173}
5174  NEXT (vpc);
5175
5176CASE (sem, INSN_WRITE_MVFACMI_A) : /* mvfacmi $dr,$accs */
5177  {
5178    SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5179    const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
5180#define FLD(f) abuf->fields.sfmt_mvfachi_a.f
5181#define OPRND(f) par_exec->operands.sfmt_mvfachi_a.f
5182    int UNUSED written = abuf->written;
5183    IADDR UNUSED pc = abuf->addr;
5184    vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
5185
5186  * FLD (i_dr) = OPRND (dr);
5187
5188#undef OPRND
5189#undef FLD
5190  }
5191  NEXT (vpc);
5192
5193  CASE (sem, INSN_PAR_MVFC) : /* mvfc $dr,$scr */
5194{
5195  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5196  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
5197#define FLD(f) abuf->fields.sfmt_ld_plus.f
5198#define OPRND(f) par_exec->operands.sfmt_mvfc.f
5199  int UNUSED written = 0;
5200  IADDR UNUSED pc = abuf->addr;
5201  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
5202
5203  {
5204    SI opval = GET_H_CR (FLD (f_r2));
5205    OPRND (dr) = opval;
5206    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
5207  }
5208
5209#undef OPRND
5210#undef FLD
5211}
5212  NEXT (vpc);
5213
5214CASE (sem, INSN_WRITE_MVFC) : /* mvfc $dr,$scr */
5215  {
5216    SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5217    const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
5218#define FLD(f) abuf->fields.sfmt_ld_plus.f
5219#define OPRND(f) par_exec->operands.sfmt_mvfc.f
5220    int UNUSED written = abuf->written;
5221    IADDR UNUSED pc = abuf->addr;
5222    vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
5223
5224  * FLD (i_dr) = OPRND (dr);
5225
5226#undef OPRND
5227#undef FLD
5228  }
5229  NEXT (vpc);
5230
5231  CASE (sem, INSN_PAR_MVTACHI_A) : /* mvtachi $src1,$accs */
5232{
5233  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5234  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
5235#define FLD(f) abuf->fields.sfmt_mvtachi_a.f
5236#define OPRND(f) par_exec->operands.sfmt_mvtachi_a.f
5237  int UNUSED written = 0;
5238  IADDR UNUSED pc = abuf->addr;
5239  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
5240
5241  {
5242    DI opval = ORDI (ANDDI (GET_H_ACCUMS (FLD (f_accs)), MAKEDI (0, 0xffffffff)), SLLDI (EXTSIDI (* FLD (i_src1)), 32));
5243    OPRND (accs) = opval;
5244    TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
5245  }
5246
5247#undef OPRND
5248#undef FLD
5249}
5250  NEXT (vpc);
5251
5252CASE (sem, INSN_WRITE_MVTACHI_A) : /* mvtachi $src1,$accs */
5253  {
5254    SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5255    const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
5256#define FLD(f) abuf->fields.sfmt_mvtachi_a.f
5257#define OPRND(f) par_exec->operands.sfmt_mvtachi_a.f
5258    int UNUSED written = abuf->written;
5259    IADDR UNUSED pc = abuf->addr;
5260    vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
5261
5262  SET_H_ACCUMS (FLD (f_accs), OPRND (accs));
5263
5264#undef OPRND
5265#undef FLD
5266  }
5267  NEXT (vpc);
5268
5269  CASE (sem, INSN_PAR_MVTACLO_A) : /* mvtaclo $src1,$accs */
5270{
5271  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5272  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
5273#define FLD(f) abuf->fields.sfmt_mvtachi_a.f
5274#define OPRND(f) par_exec->operands.sfmt_mvtachi_a.f
5275  int UNUSED written = 0;
5276  IADDR UNUSED pc = abuf->addr;
5277  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
5278
5279  {
5280    DI opval = ORDI (ANDDI (GET_H_ACCUMS (FLD (f_accs)), MAKEDI (0xffffffff, 0)), ZEXTSIDI (* FLD (i_src1)));
5281    OPRND (accs) = opval;
5282    TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
5283  }
5284
5285#undef OPRND
5286#undef FLD
5287}
5288  NEXT (vpc);
5289
5290CASE (sem, INSN_WRITE_MVTACLO_A) : /* mvtaclo $src1,$accs */
5291  {
5292    SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5293    const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
5294#define FLD(f) abuf->fields.sfmt_mvtachi_a.f
5295#define OPRND(f) par_exec->operands.sfmt_mvtachi_a.f
5296    int UNUSED written = abuf->written;
5297    IADDR UNUSED pc = abuf->addr;
5298    vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
5299
5300  SET_H_ACCUMS (FLD (f_accs), OPRND (accs));
5301
5302#undef OPRND
5303#undef FLD
5304  }
5305  NEXT (vpc);
5306
5307  CASE (sem, INSN_PAR_MVTC) : /* mvtc $sr,$dcr */
5308{
5309  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5310  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
5311#define FLD(f) abuf->fields.sfmt_ld_plus.f
5312#define OPRND(f) par_exec->operands.sfmt_mvtc.f
5313  int UNUSED written = 0;
5314  IADDR UNUSED pc = abuf->addr;
5315  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
5316
5317  {
5318    USI opval = * FLD (i_sr);
5319    OPRND (dcr) = opval;
5320    TRACE_RESULT (current_cpu, abuf, "cr", 'x', opval);
5321  }
5322
5323#undef OPRND
5324#undef FLD
5325}
5326  NEXT (vpc);
5327
5328CASE (sem, INSN_WRITE_MVTC) : /* mvtc $sr,$dcr */
5329  {
5330    SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5331    const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
5332#define FLD(f) abuf->fields.sfmt_ld_plus.f
5333#define OPRND(f) par_exec->operands.sfmt_mvtc.f
5334    int UNUSED written = abuf->written;
5335    IADDR UNUSED pc = abuf->addr;
5336    vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
5337
5338  SET_H_CR (FLD (f_r1), OPRND (dcr));
5339
5340#undef OPRND
5341#undef FLD
5342  }
5343  NEXT (vpc);
5344
5345  CASE (sem, INSN_PAR_NEG) : /* neg $dr,$sr */
5346{
5347  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5348  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
5349#define FLD(f) abuf->fields.sfmt_ld_plus.f
5350#define OPRND(f) par_exec->operands.sfmt_mv.f
5351  int UNUSED written = 0;
5352  IADDR UNUSED pc = abuf->addr;
5353  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
5354
5355  {
5356    SI opval = NEGSI (* FLD (i_sr));
5357    OPRND (dr) = opval;
5358    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
5359  }
5360
5361#undef OPRND
5362#undef FLD
5363}
5364  NEXT (vpc);
5365
5366CASE (sem, INSN_WRITE_NEG) : /* neg $dr,$sr */
5367  {
5368    SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5369    const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
5370#define FLD(f) abuf->fields.sfmt_ld_plus.f
5371#define OPRND(f) par_exec->operands.sfmt_mv.f
5372    int UNUSED written = abuf->written;
5373    IADDR UNUSED pc = abuf->addr;
5374    vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
5375
5376  * FLD (i_dr) = OPRND (dr);
5377
5378#undef OPRND
5379#undef FLD
5380  }
5381  NEXT (vpc);
5382
5383  CASE (sem, INSN_PAR_NOP) : /* nop */
5384{
5385  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5386  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
5387#define FLD(f) abuf->fields.fmt_empty.f
5388#define OPRND(f) par_exec->operands.sfmt_nop.f
5389  int UNUSED written = 0;
5390  IADDR UNUSED pc = abuf->addr;
5391  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
5392
5393PROFILE_COUNT_FILLNOPS (current_cpu, abuf->addr);
5394
5395#undef OPRND
5396#undef FLD
5397}
5398  NEXT (vpc);
5399
5400CASE (sem, INSN_WRITE_NOP) : /* nop */
5401  {
5402    SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5403    const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
5404#define FLD(f) abuf->fields.fmt_empty.f
5405#define OPRND(f) par_exec->operands.sfmt_nop.f
5406    int UNUSED written = abuf->written;
5407    IADDR UNUSED pc = abuf->addr;
5408    vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
5409
5410
5411#undef OPRND
5412#undef FLD
5413  }
5414  NEXT (vpc);
5415
5416  CASE (sem, INSN_PAR_NOT) : /* not $dr,$sr */
5417{
5418  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5419  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
5420#define FLD(f) abuf->fields.sfmt_ld_plus.f
5421#define OPRND(f) par_exec->operands.sfmt_mv.f
5422  int UNUSED written = 0;
5423  IADDR UNUSED pc = abuf->addr;
5424  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
5425
5426  {
5427    SI opval = INVSI (* FLD (i_sr));
5428    OPRND (dr) = opval;
5429    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
5430  }
5431
5432#undef OPRND
5433#undef FLD
5434}
5435  NEXT (vpc);
5436
5437CASE (sem, INSN_WRITE_NOT) : /* not $dr,$sr */
5438  {
5439    SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5440    const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
5441#define FLD(f) abuf->fields.sfmt_ld_plus.f
5442#define OPRND(f) par_exec->operands.sfmt_mv.f
5443    int UNUSED written = abuf->written;
5444    IADDR UNUSED pc = abuf->addr;
5445    vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
5446
5447  * FLD (i_dr) = OPRND (dr);
5448
5449#undef OPRND
5450#undef FLD
5451  }
5452  NEXT (vpc);
5453
5454  CASE (sem, INSN_PAR_RAC_DSI) : /* rac $accd,$accs,$imm1 */
5455{
5456  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5457  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
5458#define FLD(f) abuf->fields.sfmt_rac_dsi.f
5459#define OPRND(f) par_exec->operands.sfmt_rac_dsi.f
5460  int UNUSED written = 0;
5461  IADDR UNUSED pc = abuf->addr;
5462  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
5463
5464{
5465  DI tmp_tmp1;
5466  tmp_tmp1 = SLLDI (GET_H_ACCUMS (FLD (f_accs)), FLD (f_imm1));
5467  tmp_tmp1 = ADDDI (tmp_tmp1, MAKEDI (0, 32768));
5468  {
5469    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)));
5470    OPRND (accd) = opval;
5471    TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
5472  }
5473}
5474
5475#undef OPRND
5476#undef FLD
5477}
5478  NEXT (vpc);
5479
5480CASE (sem, INSN_WRITE_RAC_DSI) : /* rac $accd,$accs,$imm1 */
5481  {
5482    SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5483    const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
5484#define FLD(f) abuf->fields.sfmt_rac_dsi.f
5485#define OPRND(f) par_exec->operands.sfmt_rac_dsi.f
5486    int UNUSED written = abuf->written;
5487    IADDR UNUSED pc = abuf->addr;
5488    vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
5489
5490  SET_H_ACCUMS (FLD (f_accd), OPRND (accd));
5491
5492#undef OPRND
5493#undef FLD
5494  }
5495  NEXT (vpc);
5496
5497  CASE (sem, INSN_PAR_RACH_DSI) : /* rach $accd,$accs,$imm1 */
5498{
5499  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5500  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
5501#define FLD(f) abuf->fields.sfmt_rac_dsi.f
5502#define OPRND(f) par_exec->operands.sfmt_rac_dsi.f
5503  int UNUSED written = 0;
5504  IADDR UNUSED pc = abuf->addr;
5505  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
5506
5507{
5508  DI tmp_tmp1;
5509  tmp_tmp1 = SLLDI (GET_H_ACCUMS (FLD (f_accs)), FLD (f_imm1));
5510  tmp_tmp1 = ADDDI (tmp_tmp1, MAKEDI (0, 0x80000000));
5511  {
5512    DI opval = (GTDI (tmp_tmp1, MAKEDI (32767, 0))) ? (MAKEDI (32767, 0)) : (LTDI (tmp_tmp1, MAKEDI (0xffff8000, 0))) ? (MAKEDI (0xffff8000, 0)) : (ANDDI (tmp_tmp1, MAKEDI (0xffffffff, 0)));
5513    OPRND (accd) = opval;
5514    TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
5515  }
5516}
5517
5518#undef OPRND
5519#undef FLD
5520}
5521  NEXT (vpc);
5522
5523CASE (sem, INSN_WRITE_RACH_DSI) : /* rach $accd,$accs,$imm1 */
5524  {
5525    SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5526    const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
5527#define FLD(f) abuf->fields.sfmt_rac_dsi.f
5528#define OPRND(f) par_exec->operands.sfmt_rac_dsi.f
5529    int UNUSED written = abuf->written;
5530    IADDR UNUSED pc = abuf->addr;
5531    vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
5532
5533  SET_H_ACCUMS (FLD (f_accd), OPRND (accd));
5534
5535#undef OPRND
5536#undef FLD
5537  }
5538  NEXT (vpc);
5539
5540  CASE (sem, INSN_PAR_RTE) : /* rte */
5541{
5542  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5543  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
5544#define FLD(f) abuf->fields.fmt_empty.f
5545#define OPRND(f) par_exec->operands.sfmt_rte.f
5546  int UNUSED written = 0;
5547  IADDR UNUSED pc = abuf->addr;
5548  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
5549
5550{
5551  {
5552    USI opval = ANDSI (GET_H_CR (((UINT) 6)), -4);
5553    OPRND (pc) = opval;
5554    TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
5555  }
5556  {
5557    USI opval = GET_H_CR (((UINT) 14));
5558    OPRND (h_cr_USI_6) = opval;
5559    TRACE_RESULT (current_cpu, abuf, "cr", 'x', opval);
5560  }
5561  {
5562    UQI opval = CPU (h_bpsw);
5563    OPRND (h_psw_UQI) = opval;
5564    TRACE_RESULT (current_cpu, abuf, "psw", 'x', opval);
5565  }
5566  {
5567    UQI opval = CPU (h_bbpsw);
5568    OPRND (h_bpsw_UQI) = opval;
5569    TRACE_RESULT (current_cpu, abuf, "bpsw", 'x', opval);
5570  }
5571}
5572
5573#undef OPRND
5574#undef FLD
5575}
5576  NEXT (vpc);
5577
5578CASE (sem, INSN_WRITE_RTE) : /* rte */
5579  {
5580    SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5581    const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
5582#define FLD(f) abuf->fields.fmt_empty.f
5583#define OPRND(f) par_exec->operands.sfmt_rte.f
5584    int UNUSED written = abuf->written;
5585    IADDR UNUSED pc = abuf->addr;
5586    SEM_BRANCH_INIT
5587    vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
5588
5589  CPU (h_bpsw) = OPRND (h_bpsw_UQI);
5590  SET_H_CR (((UINT) 6), OPRND (h_cr_USI_6));
5591  SET_H_PSW (OPRND (h_psw_UQI));
5592  SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, OPRND (pc), vpc);
5593
5594  SEM_BRANCH_FINI (vpc);
5595#undef OPRND
5596#undef FLD
5597  }
5598  NEXT (vpc);
5599
5600  CASE (sem, INSN_PAR_SLL) : /* sll $dr,$sr */
5601{
5602  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5603  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
5604#define FLD(f) abuf->fields.sfmt_add.f
5605#define OPRND(f) par_exec->operands.sfmt_add.f
5606  int UNUSED written = 0;
5607  IADDR UNUSED pc = abuf->addr;
5608  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
5609
5610  {
5611    SI opval = SLLSI (* FLD (i_dr), ANDSI (* FLD (i_sr), 31));
5612    OPRND (dr) = opval;
5613    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
5614  }
5615
5616#undef OPRND
5617#undef FLD
5618}
5619  NEXT (vpc);
5620
5621CASE (sem, INSN_WRITE_SLL) : /* sll $dr,$sr */
5622  {
5623    SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5624    const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
5625#define FLD(f) abuf->fields.sfmt_add.f
5626#define OPRND(f) par_exec->operands.sfmt_add.f
5627    int UNUSED written = abuf->written;
5628    IADDR UNUSED pc = abuf->addr;
5629    vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
5630
5631  * FLD (i_dr) = OPRND (dr);
5632
5633#undef OPRND
5634#undef FLD
5635  }
5636  NEXT (vpc);
5637
5638  CASE (sem, INSN_PAR_SLLI) : /* slli $dr,$uimm5 */
5639{
5640  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5641  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
5642#define FLD(f) abuf->fields.sfmt_slli.f
5643#define OPRND(f) par_exec->operands.sfmt_slli.f
5644  int UNUSED written = 0;
5645  IADDR UNUSED pc = abuf->addr;
5646  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
5647
5648  {
5649    SI opval = SLLSI (* FLD (i_dr), FLD (f_uimm5));
5650    OPRND (dr) = opval;
5651    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
5652  }
5653
5654#undef OPRND
5655#undef FLD
5656}
5657  NEXT (vpc);
5658
5659CASE (sem, INSN_WRITE_SLLI) : /* slli $dr,$uimm5 */
5660  {
5661    SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5662    const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
5663#define FLD(f) abuf->fields.sfmt_slli.f
5664#define OPRND(f) par_exec->operands.sfmt_slli.f
5665    int UNUSED written = abuf->written;
5666    IADDR UNUSED pc = abuf->addr;
5667    vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
5668
5669  * FLD (i_dr) = OPRND (dr);
5670
5671#undef OPRND
5672#undef FLD
5673  }
5674  NEXT (vpc);
5675
5676  CASE (sem, INSN_PAR_SRA) : /* sra $dr,$sr */
5677{
5678  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5679  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
5680#define FLD(f) abuf->fields.sfmt_add.f
5681#define OPRND(f) par_exec->operands.sfmt_add.f
5682  int UNUSED written = 0;
5683  IADDR UNUSED pc = abuf->addr;
5684  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
5685
5686  {
5687    SI opval = SRASI (* FLD (i_dr), ANDSI (* FLD (i_sr), 31));
5688    OPRND (dr) = opval;
5689    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
5690  }
5691
5692#undef OPRND
5693#undef FLD
5694}
5695  NEXT (vpc);
5696
5697CASE (sem, INSN_WRITE_SRA) : /* sra $dr,$sr */
5698  {
5699    SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5700    const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
5701#define FLD(f) abuf->fields.sfmt_add.f
5702#define OPRND(f) par_exec->operands.sfmt_add.f
5703    int UNUSED written = abuf->written;
5704    IADDR UNUSED pc = abuf->addr;
5705    vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
5706
5707  * FLD (i_dr) = OPRND (dr);
5708
5709#undef OPRND
5710#undef FLD
5711  }
5712  NEXT (vpc);
5713
5714  CASE (sem, INSN_PAR_SRAI) : /* srai $dr,$uimm5 */
5715{
5716  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5717  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
5718#define FLD(f) abuf->fields.sfmt_slli.f
5719#define OPRND(f) par_exec->operands.sfmt_slli.f
5720  int UNUSED written = 0;
5721  IADDR UNUSED pc = abuf->addr;
5722  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
5723
5724  {
5725    SI opval = SRASI (* FLD (i_dr), FLD (f_uimm5));
5726    OPRND (dr) = opval;
5727    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
5728  }
5729
5730#undef OPRND
5731#undef FLD
5732}
5733  NEXT (vpc);
5734
5735CASE (sem, INSN_WRITE_SRAI) : /* srai $dr,$uimm5 */
5736  {
5737    SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5738    const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
5739#define FLD(f) abuf->fields.sfmt_slli.f
5740#define OPRND(f) par_exec->operands.sfmt_slli.f
5741    int UNUSED written = abuf->written;
5742    IADDR UNUSED pc = abuf->addr;
5743    vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
5744
5745  * FLD (i_dr) = OPRND (dr);
5746
5747#undef OPRND
5748#undef FLD
5749  }
5750  NEXT (vpc);
5751
5752  CASE (sem, INSN_PAR_SRL) : /* srl $dr,$sr */
5753{
5754  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5755  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
5756#define FLD(f) abuf->fields.sfmt_add.f
5757#define OPRND(f) par_exec->operands.sfmt_add.f
5758  int UNUSED written = 0;
5759  IADDR UNUSED pc = abuf->addr;
5760  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
5761
5762  {
5763    SI opval = SRLSI (* FLD (i_dr), ANDSI (* FLD (i_sr), 31));
5764    OPRND (dr) = opval;
5765    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
5766  }
5767
5768#undef OPRND
5769#undef FLD
5770}
5771  NEXT (vpc);
5772
5773CASE (sem, INSN_WRITE_SRL) : /* srl $dr,$sr */
5774  {
5775    SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5776    const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
5777#define FLD(f) abuf->fields.sfmt_add.f
5778#define OPRND(f) par_exec->operands.sfmt_add.f
5779    int UNUSED written = abuf->written;
5780    IADDR UNUSED pc = abuf->addr;
5781    vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
5782
5783  * FLD (i_dr) = OPRND (dr);
5784
5785#undef OPRND
5786#undef FLD
5787  }
5788  NEXT (vpc);
5789
5790  CASE (sem, INSN_PAR_SRLI) : /* srli $dr,$uimm5 */
5791{
5792  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5793  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
5794#define FLD(f) abuf->fields.sfmt_slli.f
5795#define OPRND(f) par_exec->operands.sfmt_slli.f
5796  int UNUSED written = 0;
5797  IADDR UNUSED pc = abuf->addr;
5798  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
5799
5800  {
5801    SI opval = SRLSI (* FLD (i_dr), FLD (f_uimm5));
5802    OPRND (dr) = opval;
5803    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
5804  }
5805
5806#undef OPRND
5807#undef FLD
5808}
5809  NEXT (vpc);
5810
5811CASE (sem, INSN_WRITE_SRLI) : /* srli $dr,$uimm5 */
5812  {
5813    SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5814    const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
5815#define FLD(f) abuf->fields.sfmt_slli.f
5816#define OPRND(f) par_exec->operands.sfmt_slli.f
5817    int UNUSED written = abuf->written;
5818    IADDR UNUSED pc = abuf->addr;
5819    vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
5820
5821  * FLD (i_dr) = OPRND (dr);
5822
5823#undef OPRND
5824#undef FLD
5825  }
5826  NEXT (vpc);
5827
5828  CASE (sem, INSN_PAR_ST) : /* st $src1,@$src2 */
5829{
5830  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5831  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
5832#define FLD(f) abuf->fields.sfmt_st_plus.f
5833#define OPRND(f) par_exec->operands.sfmt_st.f
5834  int UNUSED written = 0;
5835  IADDR UNUSED pc = abuf->addr;
5836  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
5837
5838  {
5839    SI opval = * FLD (i_src1);
5840    OPRND (h_memory_SI_src2_idx) = * FLD (i_src2);
5841    OPRND (h_memory_SI_src2) = opval;
5842    TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
5843  }
5844
5845#undef OPRND
5846#undef FLD
5847}
5848  NEXT (vpc);
5849
5850CASE (sem, INSN_WRITE_ST) : /* st $src1,@$src2 */
5851  {
5852    SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5853    const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
5854#define FLD(f) abuf->fields.sfmt_st_plus.f
5855#define OPRND(f) par_exec->operands.sfmt_st.f
5856    int UNUSED written = abuf->written;
5857    IADDR UNUSED pc = abuf->addr;
5858    vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
5859
5860  SETMEMSI (current_cpu, pc, OPRND (h_memory_SI_src2_idx), OPRND (h_memory_SI_src2));
5861
5862#undef OPRND
5863#undef FLD
5864  }
5865  NEXT (vpc);
5866
5867  CASE (sem, INSN_PAR_STB) : /* stb $src1,@$src2 */
5868{
5869  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5870  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
5871#define FLD(f) abuf->fields.sfmt_st_plus.f
5872#define OPRND(f) par_exec->operands.sfmt_stb.f
5873  int UNUSED written = 0;
5874  IADDR UNUSED pc = abuf->addr;
5875  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
5876
5877  {
5878    QI opval = * FLD (i_src1);
5879    OPRND (h_memory_QI_src2_idx) = * FLD (i_src2);
5880    OPRND (h_memory_QI_src2) = opval;
5881    TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
5882  }
5883
5884#undef OPRND
5885#undef FLD
5886}
5887  NEXT (vpc);
5888
5889CASE (sem, INSN_WRITE_STB) : /* stb $src1,@$src2 */
5890  {
5891    SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5892    const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
5893#define FLD(f) abuf->fields.sfmt_st_plus.f
5894#define OPRND(f) par_exec->operands.sfmt_stb.f
5895    int UNUSED written = abuf->written;
5896    IADDR UNUSED pc = abuf->addr;
5897    vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
5898
5899  SETMEMQI (current_cpu, pc, OPRND (h_memory_QI_src2_idx), OPRND (h_memory_QI_src2));
5900
5901#undef OPRND
5902#undef FLD
5903  }
5904  NEXT (vpc);
5905
5906  CASE (sem, INSN_PAR_STH) : /* sth $src1,@$src2 */
5907{
5908  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5909  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
5910#define FLD(f) abuf->fields.sfmt_st_plus.f
5911#define OPRND(f) par_exec->operands.sfmt_sth.f
5912  int UNUSED written = 0;
5913  IADDR UNUSED pc = abuf->addr;
5914  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
5915
5916  {
5917    HI opval = * FLD (i_src1);
5918    OPRND (h_memory_HI_src2_idx) = * FLD (i_src2);
5919    OPRND (h_memory_HI_src2) = opval;
5920    TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
5921  }
5922
5923#undef OPRND
5924#undef FLD
5925}
5926  NEXT (vpc);
5927
5928CASE (sem, INSN_WRITE_STH) : /* sth $src1,@$src2 */
5929  {
5930    SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5931    const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
5932#define FLD(f) abuf->fields.sfmt_st_plus.f
5933#define OPRND(f) par_exec->operands.sfmt_sth.f
5934    int UNUSED written = abuf->written;
5935    IADDR UNUSED pc = abuf->addr;
5936    vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
5937
5938  SETMEMHI (current_cpu, pc, OPRND (h_memory_HI_src2_idx), OPRND (h_memory_HI_src2));
5939
5940#undef OPRND
5941#undef FLD
5942  }
5943  NEXT (vpc);
5944
5945  CASE (sem, INSN_PAR_ST_PLUS) : /* st $src1,@+$src2 */
5946{
5947  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5948  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
5949#define FLD(f) abuf->fields.sfmt_st_plus.f
5950#define OPRND(f) par_exec->operands.sfmt_st_plus.f
5951  int UNUSED written = 0;
5952  IADDR UNUSED pc = abuf->addr;
5953  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
5954
5955{
5956  SI tmp_new_src2;
5957  tmp_new_src2 = ADDSI (* FLD (i_src2), 4);
5958  {
5959    SI opval = * FLD (i_src1);
5960    OPRND (h_memory_SI_new_src2_idx) = tmp_new_src2;
5961    OPRND (h_memory_SI_new_src2) = opval;
5962    TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
5963  }
5964  {
5965    SI opval = tmp_new_src2;
5966    OPRND (src2) = opval;
5967    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
5968  }
5969}
5970
5971#undef OPRND
5972#undef FLD
5973}
5974  NEXT (vpc);
5975
5976CASE (sem, INSN_WRITE_ST_PLUS) : /* st $src1,@+$src2 */
5977  {
5978    SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5979    const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
5980#define FLD(f) abuf->fields.sfmt_st_plus.f
5981#define OPRND(f) par_exec->operands.sfmt_st_plus.f
5982    int UNUSED written = abuf->written;
5983    IADDR UNUSED pc = abuf->addr;
5984    vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
5985
5986  SETMEMSI (current_cpu, pc, OPRND (h_memory_SI_new_src2_idx), OPRND (h_memory_SI_new_src2));
5987  * FLD (i_src2) = OPRND (src2);
5988
5989#undef OPRND
5990#undef FLD
5991  }
5992  NEXT (vpc);
5993
5994  CASE (sem, INSN_PAR_STH_PLUS) : /* sth $src1,@$src2+ */
5995{
5996  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5997  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
5998#define FLD(f) abuf->fields.sfmt_st_plus.f
5999#define OPRND(f) par_exec->operands.sfmt_sth_plus.f
6000  int UNUSED written = 0;
6001  IADDR UNUSED pc = abuf->addr;
6002  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
6003
6004{
6005  HI tmp_new_src2;
6006  {
6007    HI opval = * FLD (i_src1);
6008    OPRND (h_memory_HI_new_src2_idx) = tmp_new_src2;
6009    OPRND (h_memory_HI_new_src2) = opval;
6010    TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
6011  }
6012  tmp_new_src2 = ADDSI (* FLD (i_src2), 2);
6013  {
6014    SI opval = tmp_new_src2;
6015    OPRND (src2) = opval;
6016    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
6017  }
6018}
6019
6020#undef OPRND
6021#undef FLD
6022}
6023  NEXT (vpc);
6024
6025CASE (sem, INSN_WRITE_STH_PLUS) : /* sth $src1,@$src2+ */
6026  {
6027    SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
6028    const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
6029#define FLD(f) abuf->fields.sfmt_st_plus.f
6030#define OPRND(f) par_exec->operands.sfmt_sth_plus.f
6031    int UNUSED written = abuf->written;
6032    IADDR UNUSED pc = abuf->addr;
6033    vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
6034
6035  SETMEMHI (current_cpu, pc, OPRND (h_memory_HI_new_src2_idx), OPRND (h_memory_HI_new_src2));
6036  * FLD (i_src2) = OPRND (src2);
6037
6038#undef OPRND
6039#undef FLD
6040  }
6041  NEXT (vpc);
6042
6043  CASE (sem, INSN_PAR_STB_PLUS) : /* stb $src1,@$src2+ */
6044{
6045  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
6046  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
6047#define FLD(f) abuf->fields.sfmt_st_plus.f
6048#define OPRND(f) par_exec->operands.sfmt_stb_plus.f
6049  int UNUSED written = 0;
6050  IADDR UNUSED pc = abuf->addr;
6051  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
6052
6053{
6054  QI tmp_new_src2;
6055  {
6056    QI opval = * FLD (i_src1);
6057    OPRND (h_memory_QI_new_src2_idx) = tmp_new_src2;
6058    OPRND (h_memory_QI_new_src2) = opval;
6059    TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
6060  }
6061  tmp_new_src2 = ADDSI (* FLD (i_src2), 1);
6062  {
6063    SI opval = tmp_new_src2;
6064    OPRND (src2) = opval;
6065    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
6066  }
6067}
6068
6069#undef OPRND
6070#undef FLD
6071}
6072  NEXT (vpc);
6073
6074CASE (sem, INSN_WRITE_STB_PLUS) : /* stb $src1,@$src2+ */
6075  {
6076    SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
6077    const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
6078#define FLD(f) abuf->fields.sfmt_st_plus.f
6079#define OPRND(f) par_exec->operands.sfmt_stb_plus.f
6080    int UNUSED written = abuf->written;
6081    IADDR UNUSED pc = abuf->addr;
6082    vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
6083
6084  SETMEMQI (current_cpu, pc, OPRND (h_memory_QI_new_src2_idx), OPRND (h_memory_QI_new_src2));
6085  * FLD (i_src2) = OPRND (src2);
6086
6087#undef OPRND
6088#undef FLD
6089  }
6090  NEXT (vpc);
6091
6092  CASE (sem, INSN_PAR_ST_MINUS) : /* st $src1,@-$src2 */
6093{
6094  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
6095  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
6096#define FLD(f) abuf->fields.sfmt_st_plus.f
6097#define OPRND(f) par_exec->operands.sfmt_st_plus.f
6098  int UNUSED written = 0;
6099  IADDR UNUSED pc = abuf->addr;
6100  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
6101
6102{
6103  SI tmp_new_src2;
6104  tmp_new_src2 = SUBSI (* FLD (i_src2), 4);
6105  {
6106    SI opval = * FLD (i_src1);
6107    OPRND (h_memory_SI_new_src2_idx) = tmp_new_src2;
6108    OPRND (h_memory_SI_new_src2) = opval;
6109    TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
6110  }
6111  {
6112    SI opval = tmp_new_src2;
6113    OPRND (src2) = opval;
6114    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
6115  }
6116}
6117
6118#undef OPRND
6119#undef FLD
6120}
6121  NEXT (vpc);
6122
6123CASE (sem, INSN_WRITE_ST_MINUS) : /* st $src1,@-$src2 */
6124  {
6125    SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
6126    const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
6127#define FLD(f) abuf->fields.sfmt_st_plus.f
6128#define OPRND(f) par_exec->operands.sfmt_st_plus.f
6129    int UNUSED written = abuf->written;
6130    IADDR UNUSED pc = abuf->addr;
6131    vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
6132
6133  SETMEMSI (current_cpu, pc, OPRND (h_memory_SI_new_src2_idx), OPRND (h_memory_SI_new_src2));
6134  * FLD (i_src2) = OPRND (src2);
6135
6136#undef OPRND
6137#undef FLD
6138  }
6139  NEXT (vpc);
6140
6141  CASE (sem, INSN_PAR_SUB) : /* sub $dr,$sr */
6142{
6143  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
6144  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
6145#define FLD(f) abuf->fields.sfmt_add.f
6146#define OPRND(f) par_exec->operands.sfmt_add.f
6147  int UNUSED written = 0;
6148  IADDR UNUSED pc = abuf->addr;
6149  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
6150
6151  {
6152    SI opval = SUBSI (* FLD (i_dr), * FLD (i_sr));
6153    OPRND (dr) = opval;
6154    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
6155  }
6156
6157#undef OPRND
6158#undef FLD
6159}
6160  NEXT (vpc);
6161
6162CASE (sem, INSN_WRITE_SUB) : /* sub $dr,$sr */
6163  {
6164    SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
6165    const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
6166#define FLD(f) abuf->fields.sfmt_add.f
6167#define OPRND(f) par_exec->operands.sfmt_add.f
6168    int UNUSED written = abuf->written;
6169    IADDR UNUSED pc = abuf->addr;
6170    vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
6171
6172  * FLD (i_dr) = OPRND (dr);
6173
6174#undef OPRND
6175#undef FLD
6176  }
6177  NEXT (vpc);
6178
6179  CASE (sem, INSN_PAR_SUBV) : /* subv $dr,$sr */
6180{
6181  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
6182  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
6183#define FLD(f) abuf->fields.sfmt_add.f
6184#define OPRND(f) par_exec->operands.sfmt_addv.f
6185  int UNUSED written = 0;
6186  IADDR UNUSED pc = abuf->addr;
6187  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
6188
6189{
6190  SI temp0;BI temp1;
6191  temp0 = SUBSI (* FLD (i_dr), * FLD (i_sr));
6192  temp1 = SUBOFSI (* FLD (i_dr), * FLD (i_sr), 0);
6193  {
6194    SI opval = temp0;
6195    OPRND (dr) = opval;
6196    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
6197  }
6198  {
6199    BI opval = temp1;
6200    OPRND (condbit) = opval;
6201    TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
6202  }
6203}
6204
6205#undef OPRND
6206#undef FLD
6207}
6208  NEXT (vpc);
6209
6210CASE (sem, INSN_WRITE_SUBV) : /* subv $dr,$sr */
6211  {
6212    SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
6213    const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
6214#define FLD(f) abuf->fields.sfmt_add.f
6215#define OPRND(f) par_exec->operands.sfmt_addv.f
6216    int UNUSED written = abuf->written;
6217    IADDR UNUSED pc = abuf->addr;
6218    vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
6219
6220  CPU (h_cond) = OPRND (condbit);
6221  * FLD (i_dr) = OPRND (dr);
6222
6223#undef OPRND
6224#undef FLD
6225  }
6226  NEXT (vpc);
6227
6228  CASE (sem, INSN_PAR_SUBX) : /* subx $dr,$sr */
6229{
6230  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
6231  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
6232#define FLD(f) abuf->fields.sfmt_add.f
6233#define OPRND(f) par_exec->operands.sfmt_addx.f
6234  int UNUSED written = 0;
6235  IADDR UNUSED pc = abuf->addr;
6236  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
6237
6238{
6239  SI temp0;BI temp1;
6240  temp0 = SUBCSI (* FLD (i_dr), * FLD (i_sr), CPU (h_cond));
6241  temp1 = SUBCFSI (* FLD (i_dr), * FLD (i_sr), CPU (h_cond));
6242  {
6243    SI opval = temp0;
6244    OPRND (dr) = opval;
6245    TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
6246  }
6247  {
6248    BI opval = temp1;
6249    OPRND (condbit) = opval;
6250    TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
6251  }
6252}
6253
6254#undef OPRND
6255#undef FLD
6256}
6257  NEXT (vpc);
6258
6259CASE (sem, INSN_WRITE_SUBX) : /* subx $dr,$sr */
6260  {
6261    SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
6262    const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
6263#define FLD(f) abuf->fields.sfmt_add.f
6264#define OPRND(f) par_exec->operands.sfmt_addx.f
6265    int UNUSED written = abuf->written;
6266    IADDR UNUSED pc = abuf->addr;
6267    vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
6268
6269  CPU (h_cond) = OPRND (condbit);
6270  * FLD (i_dr) = OPRND (dr);
6271
6272#undef OPRND
6273#undef FLD
6274  }
6275  NEXT (vpc);
6276
6277  CASE (sem, INSN_PAR_TRAP) : /* trap $uimm4 */
6278{
6279  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
6280  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
6281#define FLD(f) abuf->fields.sfmt_trap.f
6282#define OPRND(f) par_exec->operands.sfmt_trap.f
6283  int UNUSED written = 0;
6284  IADDR UNUSED pc = abuf->addr;
6285  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
6286
6287{
6288  {
6289    USI opval = GET_H_CR (((UINT) 6));
6290    OPRND (h_cr_USI_14) = opval;
6291    TRACE_RESULT (current_cpu, abuf, "cr", 'x', opval);
6292  }
6293  {
6294    USI opval = ADDSI (pc, 4);
6295    OPRND (h_cr_USI_6) = opval;
6296    TRACE_RESULT (current_cpu, abuf, "cr", 'x', opval);
6297  }
6298  {
6299    UQI opval = CPU (h_bpsw);
6300    OPRND (h_bbpsw_UQI) = opval;
6301    TRACE_RESULT (current_cpu, abuf, "bbpsw", 'x', opval);
6302  }
6303  {
6304    UQI opval = GET_H_PSW ();
6305    OPRND (h_bpsw_UQI) = opval;
6306    TRACE_RESULT (current_cpu, abuf, "bpsw", 'x', opval);
6307  }
6308  {
6309    UQI opval = ANDQI (GET_H_PSW (), 128);
6310    OPRND (h_psw_UQI) = opval;
6311    TRACE_RESULT (current_cpu, abuf, "psw", 'x', opval);
6312  }
6313  {
6314    SI opval = m32r_trap (current_cpu, pc, FLD (f_uimm4));
6315    OPRND (pc) = opval;
6316    TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
6317  }
6318}
6319
6320#undef OPRND
6321#undef FLD
6322}
6323  NEXT (vpc);
6324
6325CASE (sem, INSN_WRITE_TRAP) : /* trap $uimm4 */
6326  {
6327    SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
6328    const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
6329#define FLD(f) abuf->fields.sfmt_trap.f
6330#define OPRND(f) par_exec->operands.sfmt_trap.f
6331    int UNUSED written = abuf->written;
6332    IADDR UNUSED pc = abuf->addr;
6333    SEM_BRANCH_INIT
6334    vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
6335
6336  CPU (h_bbpsw) = OPRND (h_bbpsw_UQI);
6337  CPU (h_bpsw) = OPRND (h_bpsw_UQI);
6338  SET_H_CR (((UINT) 14), OPRND (h_cr_USI_14));
6339  SET_H_CR (((UINT) 6), OPRND (h_cr_USI_6));
6340  SET_H_PSW (OPRND (h_psw_UQI));
6341  SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, OPRND (pc), vpc);
6342
6343  SEM_BRANCH_FINI (vpc);
6344#undef OPRND
6345#undef FLD
6346  }
6347  NEXT (vpc);
6348
6349  CASE (sem, INSN_PAR_UNLOCK) : /* unlock $src1,@$src2 */
6350{
6351  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
6352  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
6353#define FLD(f) abuf->fields.sfmt_st_plus.f
6354#define OPRND(f) par_exec->operands.sfmt_unlock.f
6355  int UNUSED written = 0;
6356  IADDR UNUSED pc = abuf->addr;
6357  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
6358
6359{
6360if (CPU (h_lock)) {
6361  {
6362    SI opval = * FLD (i_src1);
6363    OPRND (h_memory_SI_src2_idx) = * FLD (i_src2);
6364    OPRND (h_memory_SI_src2) = opval;
6365    written |= (1 << 4);
6366    TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
6367  }
6368}
6369  {
6370    BI opval = 0;
6371    OPRND (h_lock_BI) = opval;
6372    TRACE_RESULT (current_cpu, abuf, "lock", 'x', opval);
6373  }
6374}
6375
6376  abuf->written = written;
6377#undef OPRND
6378#undef FLD
6379}
6380  NEXT (vpc);
6381
6382CASE (sem, INSN_WRITE_UNLOCK) : /* unlock $src1,@$src2 */
6383  {
6384    SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
6385    const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
6386#define FLD(f) abuf->fields.sfmt_st_plus.f
6387#define OPRND(f) par_exec->operands.sfmt_unlock.f
6388    int UNUSED written = abuf->written;
6389    IADDR UNUSED pc = abuf->addr;
6390    vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
6391
6392  CPU (h_lock) = OPRND (h_lock_BI);
6393  if (written & (1 << 4))
6394    {
6395      SETMEMSI (current_cpu, pc, OPRND (h_memory_SI_src2_idx), OPRND (h_memory_SI_src2));
6396    }
6397
6398#undef OPRND
6399#undef FLD
6400  }
6401  NEXT (vpc);
6402
6403  CASE (sem, INSN_PAR_PCMPBZ) : /* pcmpbz $src2 */
6404{
6405  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
6406  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
6407#define FLD(f) abuf->fields.sfmt_st_plus.f
6408#define OPRND(f) par_exec->operands.sfmt_cmpz.f
6409  int UNUSED written = 0;
6410  IADDR UNUSED pc = abuf->addr;
6411  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
6412
6413  {
6414    BI opval = (EQSI (ANDSI (* FLD (i_src2), 255), 0)) ? (1) : (EQSI (ANDSI (* FLD (i_src2), 65280), 0)) ? (1) : (EQSI (ANDSI (* FLD (i_src2), 16711680), 0)) ? (1) : (EQSI (ANDSI (* FLD (i_src2), 0xff000000), 0)) ? (1) : (0);
6415    OPRND (condbit) = opval;
6416    TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
6417  }
6418
6419#undef OPRND
6420#undef FLD
6421}
6422  NEXT (vpc);
6423
6424CASE (sem, INSN_WRITE_PCMPBZ) : /* pcmpbz $src2 */
6425  {
6426    SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
6427    const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
6428#define FLD(f) abuf->fields.sfmt_st_plus.f
6429#define OPRND(f) par_exec->operands.sfmt_cmpz.f
6430    int UNUSED written = abuf->written;
6431    IADDR UNUSED pc = abuf->addr;
6432    vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
6433
6434  CPU (h_cond) = OPRND (condbit);
6435
6436#undef OPRND
6437#undef FLD
6438  }
6439  NEXT (vpc);
6440
6441  CASE (sem, INSN_PAR_SADD) : /* sadd */
6442{
6443  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
6444  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
6445#define FLD(f) abuf->fields.fmt_empty.f
6446#define OPRND(f) par_exec->operands.sfmt_sadd.f
6447  int UNUSED written = 0;
6448  IADDR UNUSED pc = abuf->addr;
6449  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
6450
6451  {
6452    DI opval = ADDDI (SRADI (GET_H_ACCUMS (((UINT) 1)), 16), GET_H_ACCUMS (((UINT) 0)));
6453    OPRND (h_accums_DI_0) = opval;
6454    TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
6455  }
6456
6457#undef OPRND
6458#undef FLD
6459}
6460  NEXT (vpc);
6461
6462CASE (sem, INSN_WRITE_SADD) : /* sadd */
6463  {
6464    SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
6465    const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
6466#define FLD(f) abuf->fields.fmt_empty.f
6467#define OPRND(f) par_exec->operands.sfmt_sadd.f
6468    int UNUSED written = abuf->written;
6469    IADDR UNUSED pc = abuf->addr;
6470    vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
6471
6472  SET_H_ACCUMS (((UINT) 0), OPRND (h_accums_DI_0));
6473
6474#undef OPRND
6475#undef FLD
6476  }
6477  NEXT (vpc);
6478
6479  CASE (sem, INSN_PAR_MACWU1) : /* macwu1 $src1,$src2 */
6480{
6481  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
6482  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
6483#define FLD(f) abuf->fields.sfmt_st_plus.f
6484#define OPRND(f) par_exec->operands.sfmt_macwu1.f
6485  int UNUSED written = 0;
6486  IADDR UNUSED pc = abuf->addr;
6487  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
6488
6489  {
6490    DI opval = SRADI (SLLDI (ADDDI (GET_H_ACCUMS (((UINT) 1)), MULDI (EXTSIDI (* FLD (i_src1)), EXTSIDI (ANDSI (* FLD (i_src2), 65535)))), 8), 8);
6491    OPRND (h_accums_DI_1) = opval;
6492    TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
6493  }
6494
6495#undef OPRND
6496#undef FLD
6497}
6498  NEXT (vpc);
6499
6500CASE (sem, INSN_WRITE_MACWU1) : /* macwu1 $src1,$src2 */
6501  {
6502    SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
6503    const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
6504#define FLD(f) abuf->fields.sfmt_st_plus.f
6505#define OPRND(f) par_exec->operands.sfmt_macwu1.f
6506    int UNUSED written = abuf->written;
6507    IADDR UNUSED pc = abuf->addr;
6508    vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
6509
6510  SET_H_ACCUMS (((UINT) 1), OPRND (h_accums_DI_1));
6511
6512#undef OPRND
6513#undef FLD
6514  }
6515  NEXT (vpc);
6516
6517  CASE (sem, INSN_PAR_MSBLO) : /* msblo $src1,$src2 */
6518{
6519  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
6520  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
6521#define FLD(f) abuf->fields.sfmt_st_plus.f
6522#define OPRND(f) par_exec->operands.sfmt_msblo.f
6523  int UNUSED written = 0;
6524  IADDR UNUSED pc = abuf->addr;
6525  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
6526
6527  {
6528    DI opval = SRADI (SLLDI (SUBDI (GET_H_ACCUM (), SRADI (SLLDI (MULDI (EXTHIDI (TRUNCSIHI (* FLD (i_src1))), EXTHIDI (TRUNCSIHI (* FLD (i_src2)))), 32), 16)), 8), 8);
6529    OPRND (accum) = opval;
6530    TRACE_RESULT (current_cpu, abuf, "accum", 'D', opval);
6531  }
6532
6533#undef OPRND
6534#undef FLD
6535}
6536  NEXT (vpc);
6537
6538CASE (sem, INSN_WRITE_MSBLO) : /* msblo $src1,$src2 */
6539  {
6540    SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
6541    const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
6542#define FLD(f) abuf->fields.sfmt_st_plus.f
6543#define OPRND(f) par_exec->operands.sfmt_msblo.f
6544    int UNUSED written = abuf->written;
6545    IADDR UNUSED pc = abuf->addr;
6546    vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
6547
6548  SET_H_ACCUM (OPRND (accum));
6549
6550#undef OPRND
6551#undef FLD
6552  }
6553  NEXT (vpc);
6554
6555  CASE (sem, INSN_PAR_MULWU1) : /* mulwu1 $src1,$src2 */
6556{
6557  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
6558  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
6559#define FLD(f) abuf->fields.sfmt_st_plus.f
6560#define OPRND(f) par_exec->operands.sfmt_mulwu1.f
6561  int UNUSED written = 0;
6562  IADDR UNUSED pc = abuf->addr;
6563  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
6564
6565  {
6566    DI opval = SRADI (SLLDI (MULDI (EXTSIDI (* FLD (i_src1)), EXTSIDI (ANDSI (* FLD (i_src2), 65535))), 16), 16);
6567    OPRND (h_accums_DI_1) = opval;
6568    TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
6569  }
6570
6571#undef OPRND
6572#undef FLD
6573}
6574  NEXT (vpc);
6575
6576CASE (sem, INSN_WRITE_MULWU1) : /* mulwu1 $src1,$src2 */
6577  {
6578    SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
6579    const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
6580#define FLD(f) abuf->fields.sfmt_st_plus.f
6581#define OPRND(f) par_exec->operands.sfmt_mulwu1.f
6582    int UNUSED written = abuf->written;
6583    IADDR UNUSED pc = abuf->addr;
6584    vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
6585
6586  SET_H_ACCUMS (((UINT) 1), OPRND (h_accums_DI_1));
6587
6588#undef OPRND
6589#undef FLD
6590  }
6591  NEXT (vpc);
6592
6593  CASE (sem, INSN_PAR_MACLH1) : /* maclh1 $src1,$src2 */
6594{
6595  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
6596  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
6597#define FLD(f) abuf->fields.sfmt_st_plus.f
6598#define OPRND(f) par_exec->operands.sfmt_macwu1.f
6599  int UNUSED written = 0;
6600  IADDR UNUSED pc = abuf->addr;
6601  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
6602
6603  {
6604    DI opval = SRADI (SLLDI (ADDDI (GET_H_ACCUMS (((UINT) 1)), SLLDI (EXTSIDI (MULSI (EXTHISI (TRUNCSIHI (* FLD (i_src1))), SRASI (* FLD (i_src2), 16))), 16)), 8), 8);
6605    OPRND (h_accums_DI_1) = opval;
6606    TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
6607  }
6608
6609#undef OPRND
6610#undef FLD
6611}
6612  NEXT (vpc);
6613
6614CASE (sem, INSN_WRITE_MACLH1) : /* maclh1 $src1,$src2 */
6615  {
6616    SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
6617    const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
6618#define FLD(f) abuf->fields.sfmt_st_plus.f
6619#define OPRND(f) par_exec->operands.sfmt_macwu1.f
6620    int UNUSED written = abuf->written;
6621    IADDR UNUSED pc = abuf->addr;
6622    vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
6623
6624  SET_H_ACCUMS (((UINT) 1), OPRND (h_accums_DI_1));
6625
6626#undef OPRND
6627#undef FLD
6628  }
6629  NEXT (vpc);
6630
6631  CASE (sem, INSN_PAR_SC) : /* sc */
6632{
6633  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
6634  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
6635#define FLD(f) abuf->fields.fmt_empty.f
6636#define OPRND(f) par_exec->operands.sfmt_sc.f
6637  int UNUSED written = 0;
6638  IADDR UNUSED pc = abuf->addr;
6639  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
6640
6641if (ZEXTBISI (CPU (h_cond)))
6642  SEM_SKIP_INSN (current_cpu, sem_arg, vpc);
6643
6644#undef OPRND
6645#undef FLD
6646}
6647  NEXT (vpc);
6648
6649CASE (sem, INSN_WRITE_SC) : /* sc */
6650  {
6651    SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
6652    const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
6653#define FLD(f) abuf->fields.fmt_empty.f
6654#define OPRND(f) par_exec->operands.sfmt_sc.f
6655    int UNUSED written = abuf->written;
6656    IADDR UNUSED pc = abuf->addr;
6657    vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
6658
6659
6660#undef OPRND
6661#undef FLD
6662  }
6663  NEXT (vpc);
6664
6665  CASE (sem, INSN_PAR_SNC) : /* snc */
6666{
6667  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
6668  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
6669#define FLD(f) abuf->fields.fmt_empty.f
6670#define OPRND(f) par_exec->operands.sfmt_sc.f
6671  int UNUSED written = 0;
6672  IADDR UNUSED pc = abuf->addr;
6673  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
6674
6675if (ZEXTBISI (NOTBI (CPU (h_cond))))
6676  SEM_SKIP_INSN (current_cpu, sem_arg, vpc);
6677
6678#undef OPRND
6679#undef FLD
6680}
6681  NEXT (vpc);
6682
6683CASE (sem, INSN_WRITE_SNC) : /* snc */
6684  {
6685    SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
6686    const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
6687#define FLD(f) abuf->fields.fmt_empty.f
6688#define OPRND(f) par_exec->operands.sfmt_sc.f
6689    int UNUSED written = abuf->written;
6690    IADDR UNUSED pc = abuf->addr;
6691    vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
6692
6693
6694#undef OPRND
6695#undef FLD
6696  }
6697  NEXT (vpc);
6698
6699  CASE (sem, INSN_PAR_CLRPSW) : /* clrpsw $uimm8 */
6700{
6701  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
6702  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
6703#define FLD(f) abuf->fields.sfmt_clrpsw.f
6704#define OPRND(f) par_exec->operands.sfmt_clrpsw.f
6705  int UNUSED written = 0;
6706  IADDR UNUSED pc = abuf->addr;
6707  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
6708
6709  {
6710    SI opval = ANDSI (GET_H_CR (((UINT) 0)), ORSI (INVBI (FLD (f_uimm8)), 65280));
6711    OPRND (h_cr_USI_0) = opval;
6712    TRACE_RESULT (current_cpu, abuf, "cr", 'x', opval);
6713  }
6714
6715#undef OPRND
6716#undef FLD
6717}
6718  NEXT (vpc);
6719
6720CASE (sem, INSN_WRITE_CLRPSW) : /* clrpsw $uimm8 */
6721  {
6722    SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
6723    const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
6724#define FLD(f) abuf->fields.sfmt_clrpsw.f
6725#define OPRND(f) par_exec->operands.sfmt_clrpsw.f
6726    int UNUSED written = abuf->written;
6727    IADDR UNUSED pc = abuf->addr;
6728    vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
6729
6730  SET_H_CR (((UINT) 0), OPRND (h_cr_USI_0));
6731
6732#undef OPRND
6733#undef FLD
6734  }
6735  NEXT (vpc);
6736
6737  CASE (sem, INSN_PAR_SETPSW) : /* setpsw $uimm8 */
6738{
6739  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
6740  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
6741#define FLD(f) abuf->fields.sfmt_clrpsw.f
6742#define OPRND(f) par_exec->operands.sfmt_setpsw.f
6743  int UNUSED written = 0;
6744  IADDR UNUSED pc = abuf->addr;
6745  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
6746
6747  {
6748    SI opval = FLD (f_uimm8);
6749    OPRND (h_cr_USI_0) = opval;
6750    TRACE_RESULT (current_cpu, abuf, "cr", 'x', opval);
6751  }
6752
6753#undef OPRND
6754#undef FLD
6755}
6756  NEXT (vpc);
6757
6758CASE (sem, INSN_WRITE_SETPSW) : /* setpsw $uimm8 */
6759  {
6760    SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
6761    const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
6762#define FLD(f) abuf->fields.sfmt_clrpsw.f
6763#define OPRND(f) par_exec->operands.sfmt_setpsw.f
6764    int UNUSED written = abuf->written;
6765    IADDR UNUSED pc = abuf->addr;
6766    vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
6767
6768  SET_H_CR (((UINT) 0), OPRND (h_cr_USI_0));
6769
6770#undef OPRND
6771#undef FLD
6772  }
6773  NEXT (vpc);
6774
6775  CASE (sem, INSN_PAR_BTST) : /* btst $uimm3,$sr */
6776{
6777  SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
6778  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
6779#define FLD(f) abuf->fields.sfmt_bset.f
6780#define OPRND(f) par_exec->operands.sfmt_btst.f
6781  int UNUSED written = 0;
6782  IADDR UNUSED pc = abuf->addr;
6783  vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
6784
6785  {
6786    BI opval = ANDQI (SRLSI (* FLD (i_sr), SUBSI (7, FLD (f_uimm3))), 1);
6787    OPRND (condbit) = opval;
6788    TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
6789  }
6790
6791#undef OPRND
6792#undef FLD
6793}
6794  NEXT (vpc);
6795
6796CASE (sem, INSN_WRITE_BTST) : /* btst $uimm3,$sr */
6797  {
6798    SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
6799    const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
6800#define FLD(f) abuf->fields.sfmt_bset.f
6801#define OPRND(f) par_exec->operands.sfmt_btst.f
6802    int UNUSED written = abuf->written;
6803    IADDR UNUSED pc = abuf->addr;
6804    vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
6805
6806  CPU (h_cond) = OPRND (condbit);
6807
6808#undef OPRND
6809#undef FLD
6810  }
6811  NEXT (vpc);
6812
6813
6814    }
6815  ENDSWITCH (sem) /* End of semantic switch.  */
6816
6817  /* At this point `vpc' contains the next insn to execute.  */
6818}
6819
6820#undef DEFINE_SWITCH
6821#endif /* DEFINE_SWITCH */
6822