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