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