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