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