sem-switch.c revision 1.9.2.1 1 1.1 christos /* Simulator instruction semantics for iq2000bf.
2 1.1 christos
3 1.1 christos THIS FILE IS MACHINE GENERATED WITH CGEN.
4 1.1 christos
5 1.9.2.1 perseant Copyright 1996-2023 Free Software Foundation, Inc.
6 1.1 christos
7 1.1 christos This file is part of the GNU simulators.
8 1.1 christos
9 1.1 christos This file is free software; you can redistribute it and/or modify
10 1.1 christos it under the terms of the GNU General Public License as published by
11 1.1 christos the Free Software Foundation; either version 3, or (at your option)
12 1.1 christos any later version.
13 1.1 christos
14 1.1 christos It is distributed in the hope that it will be useful, but WITHOUT
15 1.1 christos ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
16 1.1 christos or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
17 1.1 christos License for more details.
18 1.1 christos
19 1.1 christos You should have received a copy of the GNU General Public License along
20 1.1 christos with this program; if not, see <http://www.gnu.org/licenses/>.
21 1.1 christos
22 1.1 christos */
23 1.1 christos
24 1.1 christos #ifdef DEFINE_LABELS
25 1.1 christos
26 1.1 christos /* The labels have the case they have because the enum of insn types
27 1.1 christos is all uppercase and in the non-stdc case the insn symbol is built
28 1.1 christos into the enum name. */
29 1.1 christos
30 1.1 christos static struct {
31 1.1 christos int index;
32 1.1 christos void *label;
33 1.1 christos } labels[] = {
34 1.1 christos { IQ2000BF_INSN_X_INVALID, && case_sem_INSN_X_INVALID },
35 1.1 christos { IQ2000BF_INSN_X_AFTER, && case_sem_INSN_X_AFTER },
36 1.1 christos { IQ2000BF_INSN_X_BEFORE, && case_sem_INSN_X_BEFORE },
37 1.1 christos { IQ2000BF_INSN_X_CTI_CHAIN, && case_sem_INSN_X_CTI_CHAIN },
38 1.1 christos { IQ2000BF_INSN_X_CHAIN, && case_sem_INSN_X_CHAIN },
39 1.1 christos { IQ2000BF_INSN_X_BEGIN, && case_sem_INSN_X_BEGIN },
40 1.1 christos { IQ2000BF_INSN_ADD, && case_sem_INSN_ADD },
41 1.1 christos { IQ2000BF_INSN_ADDI, && case_sem_INSN_ADDI },
42 1.1 christos { IQ2000BF_INSN_ADDIU, && case_sem_INSN_ADDIU },
43 1.1 christos { IQ2000BF_INSN_ADDU, && case_sem_INSN_ADDU },
44 1.1 christos { IQ2000BF_INSN_ADO16, && case_sem_INSN_ADO16 },
45 1.1 christos { IQ2000BF_INSN_AND, && case_sem_INSN_AND },
46 1.1 christos { IQ2000BF_INSN_ANDI, && case_sem_INSN_ANDI },
47 1.1 christos { IQ2000BF_INSN_ANDOI, && case_sem_INSN_ANDOI },
48 1.1 christos { IQ2000BF_INSN_NOR, && case_sem_INSN_NOR },
49 1.1 christos { IQ2000BF_INSN_OR, && case_sem_INSN_OR },
50 1.1 christos { IQ2000BF_INSN_ORI, && case_sem_INSN_ORI },
51 1.1 christos { IQ2000BF_INSN_RAM, && case_sem_INSN_RAM },
52 1.1 christos { IQ2000BF_INSN_SLL, && case_sem_INSN_SLL },
53 1.1 christos { IQ2000BF_INSN_SLLV, && case_sem_INSN_SLLV },
54 1.1 christos { IQ2000BF_INSN_SLMV, && case_sem_INSN_SLMV },
55 1.1 christos { IQ2000BF_INSN_SLT, && case_sem_INSN_SLT },
56 1.1 christos { IQ2000BF_INSN_SLTI, && case_sem_INSN_SLTI },
57 1.1 christos { IQ2000BF_INSN_SLTIU, && case_sem_INSN_SLTIU },
58 1.1 christos { IQ2000BF_INSN_SLTU, && case_sem_INSN_SLTU },
59 1.1 christos { IQ2000BF_INSN_SRA, && case_sem_INSN_SRA },
60 1.1 christos { IQ2000BF_INSN_SRAV, && case_sem_INSN_SRAV },
61 1.1 christos { IQ2000BF_INSN_SRL, && case_sem_INSN_SRL },
62 1.1 christos { IQ2000BF_INSN_SRLV, && case_sem_INSN_SRLV },
63 1.1 christos { IQ2000BF_INSN_SRMV, && case_sem_INSN_SRMV },
64 1.1 christos { IQ2000BF_INSN_SUB, && case_sem_INSN_SUB },
65 1.1 christos { IQ2000BF_INSN_SUBU, && case_sem_INSN_SUBU },
66 1.1 christos { IQ2000BF_INSN_XOR, && case_sem_INSN_XOR },
67 1.1 christos { IQ2000BF_INSN_XORI, && case_sem_INSN_XORI },
68 1.1 christos { IQ2000BF_INSN_BBI, && case_sem_INSN_BBI },
69 1.1 christos { IQ2000BF_INSN_BBIN, && case_sem_INSN_BBIN },
70 1.1 christos { IQ2000BF_INSN_BBV, && case_sem_INSN_BBV },
71 1.1 christos { IQ2000BF_INSN_BBVN, && case_sem_INSN_BBVN },
72 1.1 christos { IQ2000BF_INSN_BEQ, && case_sem_INSN_BEQ },
73 1.1 christos { IQ2000BF_INSN_BEQL, && case_sem_INSN_BEQL },
74 1.1 christos { IQ2000BF_INSN_BGEZ, && case_sem_INSN_BGEZ },
75 1.1 christos { IQ2000BF_INSN_BGEZAL, && case_sem_INSN_BGEZAL },
76 1.1 christos { IQ2000BF_INSN_BGEZALL, && case_sem_INSN_BGEZALL },
77 1.1 christos { IQ2000BF_INSN_BGEZL, && case_sem_INSN_BGEZL },
78 1.1 christos { IQ2000BF_INSN_BLTZ, && case_sem_INSN_BLTZ },
79 1.1 christos { IQ2000BF_INSN_BLTZL, && case_sem_INSN_BLTZL },
80 1.1 christos { IQ2000BF_INSN_BLTZAL, && case_sem_INSN_BLTZAL },
81 1.1 christos { IQ2000BF_INSN_BLTZALL, && case_sem_INSN_BLTZALL },
82 1.1 christos { IQ2000BF_INSN_BMB0, && case_sem_INSN_BMB0 },
83 1.1 christos { IQ2000BF_INSN_BMB1, && case_sem_INSN_BMB1 },
84 1.1 christos { IQ2000BF_INSN_BMB2, && case_sem_INSN_BMB2 },
85 1.1 christos { IQ2000BF_INSN_BMB3, && case_sem_INSN_BMB3 },
86 1.1 christos { IQ2000BF_INSN_BNE, && case_sem_INSN_BNE },
87 1.1 christos { IQ2000BF_INSN_BNEL, && case_sem_INSN_BNEL },
88 1.1 christos { IQ2000BF_INSN_JALR, && case_sem_INSN_JALR },
89 1.1 christos { IQ2000BF_INSN_JR, && case_sem_INSN_JR },
90 1.1 christos { IQ2000BF_INSN_LB, && case_sem_INSN_LB },
91 1.1 christos { IQ2000BF_INSN_LBU, && case_sem_INSN_LBU },
92 1.1 christos { IQ2000BF_INSN_LH, && case_sem_INSN_LH },
93 1.1 christos { IQ2000BF_INSN_LHU, && case_sem_INSN_LHU },
94 1.1 christos { IQ2000BF_INSN_LUI, && case_sem_INSN_LUI },
95 1.1 christos { IQ2000BF_INSN_LW, && case_sem_INSN_LW },
96 1.1 christos { IQ2000BF_INSN_SB, && case_sem_INSN_SB },
97 1.1 christos { IQ2000BF_INSN_SH, && case_sem_INSN_SH },
98 1.1 christos { IQ2000BF_INSN_SW, && case_sem_INSN_SW },
99 1.1 christos { IQ2000BF_INSN_BREAK, && case_sem_INSN_BREAK },
100 1.1 christos { IQ2000BF_INSN_SYSCALL, && case_sem_INSN_SYSCALL },
101 1.1 christos { IQ2000BF_INSN_ANDOUI, && case_sem_INSN_ANDOUI },
102 1.1 christos { IQ2000BF_INSN_ORUI, && case_sem_INSN_ORUI },
103 1.1 christos { IQ2000BF_INSN_BGTZ, && case_sem_INSN_BGTZ },
104 1.1 christos { IQ2000BF_INSN_BGTZL, && case_sem_INSN_BGTZL },
105 1.1 christos { IQ2000BF_INSN_BLEZ, && case_sem_INSN_BLEZ },
106 1.1 christos { IQ2000BF_INSN_BLEZL, && case_sem_INSN_BLEZL },
107 1.1 christos { IQ2000BF_INSN_MRGB, && case_sem_INSN_MRGB },
108 1.1 christos { IQ2000BF_INSN_BCTXT, && case_sem_INSN_BCTXT },
109 1.1 christos { IQ2000BF_INSN_BC0F, && case_sem_INSN_BC0F },
110 1.1 christos { IQ2000BF_INSN_BC0FL, && case_sem_INSN_BC0FL },
111 1.1 christos { IQ2000BF_INSN_BC3F, && case_sem_INSN_BC3F },
112 1.1 christos { IQ2000BF_INSN_BC3FL, && case_sem_INSN_BC3FL },
113 1.1 christos { IQ2000BF_INSN_BC0T, && case_sem_INSN_BC0T },
114 1.1 christos { IQ2000BF_INSN_BC0TL, && case_sem_INSN_BC0TL },
115 1.1 christos { IQ2000BF_INSN_BC3T, && case_sem_INSN_BC3T },
116 1.1 christos { IQ2000BF_INSN_BC3TL, && case_sem_INSN_BC3TL },
117 1.1 christos { IQ2000BF_INSN_CFC0, && case_sem_INSN_CFC0 },
118 1.1 christos { IQ2000BF_INSN_CFC1, && case_sem_INSN_CFC1 },
119 1.1 christos { IQ2000BF_INSN_CFC2, && case_sem_INSN_CFC2 },
120 1.1 christos { IQ2000BF_INSN_CFC3, && case_sem_INSN_CFC3 },
121 1.1 christos { IQ2000BF_INSN_CHKHDR, && case_sem_INSN_CHKHDR },
122 1.1 christos { IQ2000BF_INSN_CTC0, && case_sem_INSN_CTC0 },
123 1.1 christos { IQ2000BF_INSN_CTC1, && case_sem_INSN_CTC1 },
124 1.1 christos { IQ2000BF_INSN_CTC2, && case_sem_INSN_CTC2 },
125 1.1 christos { IQ2000BF_INSN_CTC3, && case_sem_INSN_CTC3 },
126 1.1 christos { IQ2000BF_INSN_JCR, && case_sem_INSN_JCR },
127 1.1 christos { IQ2000BF_INSN_LUC32, && case_sem_INSN_LUC32 },
128 1.1 christos { IQ2000BF_INSN_LUC32L, && case_sem_INSN_LUC32L },
129 1.1 christos { IQ2000BF_INSN_LUC64, && case_sem_INSN_LUC64 },
130 1.1 christos { IQ2000BF_INSN_LUC64L, && case_sem_INSN_LUC64L },
131 1.1 christos { IQ2000BF_INSN_LUK, && case_sem_INSN_LUK },
132 1.1 christos { IQ2000BF_INSN_LULCK, && case_sem_INSN_LULCK },
133 1.1 christos { IQ2000BF_INSN_LUM32, && case_sem_INSN_LUM32 },
134 1.1 christos { IQ2000BF_INSN_LUM32L, && case_sem_INSN_LUM32L },
135 1.1 christos { IQ2000BF_INSN_LUM64, && case_sem_INSN_LUM64 },
136 1.1 christos { IQ2000BF_INSN_LUM64L, && case_sem_INSN_LUM64L },
137 1.1 christos { IQ2000BF_INSN_LUR, && case_sem_INSN_LUR },
138 1.1 christos { IQ2000BF_INSN_LURL, && case_sem_INSN_LURL },
139 1.1 christos { IQ2000BF_INSN_LUULCK, && case_sem_INSN_LUULCK },
140 1.1 christos { IQ2000BF_INSN_MFC0, && case_sem_INSN_MFC0 },
141 1.1 christos { IQ2000BF_INSN_MFC1, && case_sem_INSN_MFC1 },
142 1.1 christos { IQ2000BF_INSN_MFC2, && case_sem_INSN_MFC2 },
143 1.1 christos { IQ2000BF_INSN_MFC3, && case_sem_INSN_MFC3 },
144 1.1 christos { IQ2000BF_INSN_MTC0, && case_sem_INSN_MTC0 },
145 1.1 christos { IQ2000BF_INSN_MTC1, && case_sem_INSN_MTC1 },
146 1.1 christos { IQ2000BF_INSN_MTC2, && case_sem_INSN_MTC2 },
147 1.1 christos { IQ2000BF_INSN_MTC3, && case_sem_INSN_MTC3 },
148 1.1 christos { IQ2000BF_INSN_PKRL, && case_sem_INSN_PKRL },
149 1.1 christos { IQ2000BF_INSN_PKRLR1, && case_sem_INSN_PKRLR1 },
150 1.1 christos { IQ2000BF_INSN_PKRLR30, && case_sem_INSN_PKRLR30 },
151 1.1 christos { IQ2000BF_INSN_RB, && case_sem_INSN_RB },
152 1.1 christos { IQ2000BF_INSN_RBR1, && case_sem_INSN_RBR1 },
153 1.1 christos { IQ2000BF_INSN_RBR30, && case_sem_INSN_RBR30 },
154 1.1 christos { IQ2000BF_INSN_RFE, && case_sem_INSN_RFE },
155 1.1 christos { IQ2000BF_INSN_RX, && case_sem_INSN_RX },
156 1.1 christos { IQ2000BF_INSN_RXR1, && case_sem_INSN_RXR1 },
157 1.1 christos { IQ2000BF_INSN_RXR30, && case_sem_INSN_RXR30 },
158 1.1 christos { IQ2000BF_INSN_SLEEP, && case_sem_INSN_SLEEP },
159 1.1 christos { IQ2000BF_INSN_SRRD, && case_sem_INSN_SRRD },
160 1.1 christos { IQ2000BF_INSN_SRRDL, && case_sem_INSN_SRRDL },
161 1.1 christos { IQ2000BF_INSN_SRULCK, && case_sem_INSN_SRULCK },
162 1.1 christos { IQ2000BF_INSN_SRWR, && case_sem_INSN_SRWR },
163 1.1 christos { IQ2000BF_INSN_SRWRU, && case_sem_INSN_SRWRU },
164 1.1 christos { IQ2000BF_INSN_TRAPQFL, && case_sem_INSN_TRAPQFL },
165 1.1 christos { IQ2000BF_INSN_TRAPQNE, && case_sem_INSN_TRAPQNE },
166 1.1 christos { IQ2000BF_INSN_TRAPREL, && case_sem_INSN_TRAPREL },
167 1.1 christos { IQ2000BF_INSN_WB, && case_sem_INSN_WB },
168 1.1 christos { IQ2000BF_INSN_WBU, && case_sem_INSN_WBU },
169 1.1 christos { IQ2000BF_INSN_WBR1, && case_sem_INSN_WBR1 },
170 1.1 christos { IQ2000BF_INSN_WBR1U, && case_sem_INSN_WBR1U },
171 1.1 christos { IQ2000BF_INSN_WBR30, && case_sem_INSN_WBR30 },
172 1.1 christos { IQ2000BF_INSN_WBR30U, && case_sem_INSN_WBR30U },
173 1.1 christos { IQ2000BF_INSN_WX, && case_sem_INSN_WX },
174 1.1 christos { IQ2000BF_INSN_WXU, && case_sem_INSN_WXU },
175 1.1 christos { IQ2000BF_INSN_WXR1, && case_sem_INSN_WXR1 },
176 1.1 christos { IQ2000BF_INSN_WXR1U, && case_sem_INSN_WXR1U },
177 1.1 christos { IQ2000BF_INSN_WXR30, && case_sem_INSN_WXR30 },
178 1.1 christos { IQ2000BF_INSN_WXR30U, && case_sem_INSN_WXR30U },
179 1.1 christos { IQ2000BF_INSN_LDW, && case_sem_INSN_LDW },
180 1.1 christos { IQ2000BF_INSN_SDW, && case_sem_INSN_SDW },
181 1.1 christos { IQ2000BF_INSN_J, && case_sem_INSN_J },
182 1.1 christos { IQ2000BF_INSN_JAL, && case_sem_INSN_JAL },
183 1.1 christos { IQ2000BF_INSN_BMB, && case_sem_INSN_BMB },
184 1.1 christos { 0, 0 }
185 1.1 christos };
186 1.1 christos int i;
187 1.1 christos
188 1.1 christos for (i = 0; labels[i].label != 0; ++i)
189 1.1 christos {
190 1.1 christos #if FAST_P
191 1.1 christos CPU_IDESC (current_cpu) [labels[i].index].sem_fast_lab = labels[i].label;
192 1.1 christos #else
193 1.1 christos CPU_IDESC (current_cpu) [labels[i].index].sem_full_lab = labels[i].label;
194 1.1 christos #endif
195 1.1 christos }
196 1.1 christos
197 1.1 christos #undef DEFINE_LABELS
198 1.1 christos #endif /* DEFINE_LABELS */
199 1.1 christos
200 1.1 christos #ifdef DEFINE_SWITCH
201 1.1 christos
202 1.1 christos /* If hyper-fast [well not unnecessarily slow] execution is selected, turn
203 1.1 christos off frills like tracing and profiling. */
204 1.5 christos /* FIXME: A better way would be to have CGEN_TRACE_RESULT check for something
205 1.1 christos that can cause it to be optimized out. Another way would be to emit
206 1.1 christos special handlers into the instruction "stream". */
207 1.1 christos
208 1.1 christos #if FAST_P
209 1.5 christos #undef CGEN_TRACE_RESULT
210 1.5 christos #define CGEN_TRACE_RESULT(cpu, abuf, name, type, val)
211 1.1 christos #endif
212 1.1 christos
213 1.1 christos #undef GET_ATTR
214 1.1 christos #define GET_ATTR(cpu, num, attr) CGEN_ATTR_VALUE (NULL, abuf->idesc->attrs, CGEN_INSN_##attr)
215 1.1 christos
216 1.1 christos {
217 1.1 christos
218 1.1 christos #if WITH_SCACHE_PBB
219 1.1 christos
220 1.1 christos /* Branch to next handler without going around main loop. */
221 1.1 christos #define NEXT(vpc) goto * SEM_ARGBUF (vpc) -> semantic.sem_case
222 1.1 christos SWITCH (sem, SEM_ARGBUF (vpc) -> semantic.sem_case)
223 1.1 christos
224 1.1 christos #else /* ! WITH_SCACHE_PBB */
225 1.1 christos
226 1.1 christos #define NEXT(vpc) BREAK (sem)
227 1.1 christos #ifdef __GNUC__
228 1.1 christos #if FAST_P
229 1.1 christos SWITCH (sem, SEM_ARGBUF (sc) -> idesc->sem_fast_lab)
230 1.1 christos #else
231 1.1 christos SWITCH (sem, SEM_ARGBUF (sc) -> idesc->sem_full_lab)
232 1.1 christos #endif
233 1.1 christos #else
234 1.1 christos SWITCH (sem, SEM_ARGBUF (sc) -> idesc->num)
235 1.1 christos #endif
236 1.1 christos
237 1.1 christos #endif /* ! WITH_SCACHE_PBB */
238 1.1 christos
239 1.1 christos {
240 1.1 christos
241 1.1 christos CASE (sem, INSN_X_INVALID) : /* --invalid-- */
242 1.1 christos {
243 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
244 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
245 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
246 1.1 christos int UNUSED written = 0;
247 1.1 christos IADDR UNUSED pc = abuf->addr;
248 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
249 1.1 christos
250 1.1 christos {
251 1.1 christos /* Update the recorded pc in the cpu state struct.
252 1.1 christos Only necessary for WITH_SCACHE case, but to avoid the
253 1.1 christos conditional compilation .... */
254 1.1 christos SET_H_PC (pc);
255 1.1 christos /* Virtual insns have zero size. Overwrite vpc with address of next insn
256 1.1 christos using the default-insn-bitsize spec. When executing insns in parallel
257 1.1 christos we may want to queue the fault and continue execution. */
258 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
259 1.1 christos vpc = sim_engine_invalid_insn (current_cpu, pc, vpc);
260 1.1 christos }
261 1.1 christos
262 1.1 christos #undef FLD
263 1.1 christos }
264 1.1 christos NEXT (vpc);
265 1.1 christos
266 1.1 christos CASE (sem, INSN_X_AFTER) : /* --after-- */
267 1.1 christos {
268 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
269 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
270 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
271 1.1 christos int UNUSED written = 0;
272 1.1 christos IADDR UNUSED pc = abuf->addr;
273 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
274 1.1 christos
275 1.1 christos {
276 1.1 christos #if WITH_SCACHE_PBB_IQ2000BF
277 1.1 christos iq2000bf_pbb_after (current_cpu, sem_arg);
278 1.1 christos #endif
279 1.1 christos }
280 1.1 christos
281 1.1 christos #undef FLD
282 1.1 christos }
283 1.1 christos NEXT (vpc);
284 1.1 christos
285 1.1 christos CASE (sem, INSN_X_BEFORE) : /* --before-- */
286 1.1 christos {
287 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
288 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
289 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
290 1.1 christos int UNUSED written = 0;
291 1.1 christos IADDR UNUSED pc = abuf->addr;
292 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
293 1.1 christos
294 1.1 christos {
295 1.1 christos #if WITH_SCACHE_PBB_IQ2000BF
296 1.1 christos iq2000bf_pbb_before (current_cpu, sem_arg);
297 1.1 christos #endif
298 1.1 christos }
299 1.1 christos
300 1.1 christos #undef FLD
301 1.1 christos }
302 1.1 christos NEXT (vpc);
303 1.1 christos
304 1.1 christos CASE (sem, INSN_X_CTI_CHAIN) : /* --cti-chain-- */
305 1.1 christos {
306 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
307 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
308 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
309 1.1 christos int UNUSED written = 0;
310 1.1 christos IADDR UNUSED pc = abuf->addr;
311 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
312 1.1 christos
313 1.1 christos {
314 1.1 christos #if WITH_SCACHE_PBB_IQ2000BF
315 1.1 christos #ifdef DEFINE_SWITCH
316 1.1 christos vpc = iq2000bf_pbb_cti_chain (current_cpu, sem_arg,
317 1.1 christos pbb_br_type, pbb_br_npc);
318 1.1 christos BREAK (sem);
319 1.1 christos #else
320 1.1 christos /* FIXME: Allow provision of explicit ifmt spec in insn spec. */
321 1.1 christos vpc = iq2000bf_pbb_cti_chain (current_cpu, sem_arg,
322 1.1 christos CPU_PBB_BR_TYPE (current_cpu),
323 1.1 christos CPU_PBB_BR_NPC (current_cpu));
324 1.1 christos #endif
325 1.1 christos #endif
326 1.1 christos }
327 1.1 christos
328 1.1 christos #undef FLD
329 1.1 christos }
330 1.1 christos NEXT (vpc);
331 1.1 christos
332 1.1 christos CASE (sem, INSN_X_CHAIN) : /* --chain-- */
333 1.1 christos {
334 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
335 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
336 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
337 1.1 christos int UNUSED written = 0;
338 1.1 christos IADDR UNUSED pc = abuf->addr;
339 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
340 1.1 christos
341 1.1 christos {
342 1.1 christos #if WITH_SCACHE_PBB_IQ2000BF
343 1.1 christos vpc = iq2000bf_pbb_chain (current_cpu, sem_arg);
344 1.1 christos #ifdef DEFINE_SWITCH
345 1.1 christos BREAK (sem);
346 1.1 christos #endif
347 1.1 christos #endif
348 1.1 christos }
349 1.1 christos
350 1.1 christos #undef FLD
351 1.1 christos }
352 1.1 christos NEXT (vpc);
353 1.1 christos
354 1.1 christos CASE (sem, INSN_X_BEGIN) : /* --begin-- */
355 1.1 christos {
356 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
357 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
358 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
359 1.1 christos int UNUSED written = 0;
360 1.1 christos IADDR UNUSED pc = abuf->addr;
361 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
362 1.1 christos
363 1.1 christos {
364 1.1 christos #if WITH_SCACHE_PBB_IQ2000BF
365 1.1 christos #if defined DEFINE_SWITCH || defined FAST_P
366 1.1 christos /* In the switch case FAST_P is a constant, allowing several optimizations
367 1.1 christos in any called inline functions. */
368 1.1 christos vpc = iq2000bf_pbb_begin (current_cpu, FAST_P);
369 1.1 christos #else
370 1.1 christos #if 0 /* cgen engine can't handle dynamic fast/full switching yet. */
371 1.1 christos vpc = iq2000bf_pbb_begin (current_cpu, STATE_RUN_FAST_P (CPU_STATE (current_cpu)));
372 1.1 christos #else
373 1.1 christos vpc = iq2000bf_pbb_begin (current_cpu, 0);
374 1.1 christos #endif
375 1.1 christos #endif
376 1.1 christos #endif
377 1.1 christos }
378 1.1 christos
379 1.1 christos #undef FLD
380 1.1 christos }
381 1.1 christos NEXT (vpc);
382 1.1 christos
383 1.1 christos CASE (sem, INSN_ADD) : /* add $rd,$rs,$rt */
384 1.1 christos {
385 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
386 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
387 1.1 christos #define FLD(f) abuf->fields.sfmt_mrgb.f
388 1.1 christos int UNUSED written = 0;
389 1.1 christos IADDR UNUSED pc = abuf->addr;
390 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
391 1.1 christos
392 1.1 christos {
393 1.1 christos SI opval = ADDSI (GET_H_GR (FLD (f_rs)), GET_H_GR (FLD (f_rt)));
394 1.1 christos SET_H_GR (FLD (f_rd), opval);
395 1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
396 1.1 christos }
397 1.1 christos
398 1.1 christos #undef FLD
399 1.1 christos }
400 1.1 christos NEXT (vpc);
401 1.1 christos
402 1.1 christos CASE (sem, INSN_ADDI) : /* addi $rt,$rs,$lo16 */
403 1.1 christos {
404 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
405 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
406 1.1 christos #define FLD(f) abuf->fields.sfmt_addi.f
407 1.1 christos int UNUSED written = 0;
408 1.1 christos IADDR UNUSED pc = abuf->addr;
409 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
410 1.1 christos
411 1.1 christos {
412 1.1 christos SI opval = ADDSI (GET_H_GR (FLD (f_rs)), EXTHISI (TRUNCSIHI (FLD (f_imm))));
413 1.1 christos SET_H_GR (FLD (f_rt), opval);
414 1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
415 1.1 christos }
416 1.1 christos
417 1.1 christos #undef FLD
418 1.1 christos }
419 1.1 christos NEXT (vpc);
420 1.1 christos
421 1.1 christos CASE (sem, INSN_ADDIU) : /* addiu $rt,$rs,$lo16 */
422 1.1 christos {
423 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
424 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
425 1.1 christos #define FLD(f) abuf->fields.sfmt_addi.f
426 1.1 christos int UNUSED written = 0;
427 1.1 christos IADDR UNUSED pc = abuf->addr;
428 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
429 1.1 christos
430 1.1 christos {
431 1.1 christos SI opval = ADDSI (GET_H_GR (FLD (f_rs)), EXTHISI (TRUNCSIHI (FLD (f_imm))));
432 1.1 christos SET_H_GR (FLD (f_rt), opval);
433 1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
434 1.1 christos }
435 1.1 christos
436 1.1 christos #undef FLD
437 1.1 christos }
438 1.1 christos NEXT (vpc);
439 1.1 christos
440 1.1 christos CASE (sem, INSN_ADDU) : /* addu $rd,$rs,$rt */
441 1.1 christos {
442 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
443 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
444 1.1 christos #define FLD(f) abuf->fields.sfmt_mrgb.f
445 1.1 christos int UNUSED written = 0;
446 1.1 christos IADDR UNUSED pc = abuf->addr;
447 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
448 1.1 christos
449 1.1 christos {
450 1.1 christos SI opval = ADDSI (GET_H_GR (FLD (f_rs)), GET_H_GR (FLD (f_rt)));
451 1.1 christos SET_H_GR (FLD (f_rd), opval);
452 1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
453 1.1 christos }
454 1.1 christos
455 1.1 christos #undef FLD
456 1.1 christos }
457 1.1 christos NEXT (vpc);
458 1.1 christos
459 1.1 christos CASE (sem, INSN_ADO16) : /* ado16 $rd,$rs,$rt */
460 1.1 christos {
461 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
462 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
463 1.1 christos #define FLD(f) abuf->fields.sfmt_mrgb.f
464 1.1 christos int UNUSED written = 0;
465 1.1 christos IADDR UNUSED pc = abuf->addr;
466 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
467 1.1 christos
468 1.1 christos {
469 1.1 christos HI tmp_high;
470 1.1 christos HI tmp_low;
471 1.1 christos tmp_low = ADDHI (ANDHI (GET_H_GR (FLD (f_rs)), 65535), ANDHI (GET_H_GR (FLD (f_rt)), 65535));
472 1.1 christos tmp_high = ADDHI (SRLSI (GET_H_GR (FLD (f_rs)), 16), SRLSI (GET_H_GR (FLD (f_rt)), 16));
473 1.1 christos {
474 1.1 christos SI opval = ORSI (SLLSI (tmp_high, 16), tmp_low);
475 1.1 christos SET_H_GR (FLD (f_rd), opval);
476 1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
477 1.1 christos }
478 1.1 christos }
479 1.1 christos
480 1.1 christos #undef FLD
481 1.1 christos }
482 1.1 christos NEXT (vpc);
483 1.1 christos
484 1.1 christos CASE (sem, INSN_AND) : /* and $rd,$rs,$rt */
485 1.1 christos {
486 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
487 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
488 1.1 christos #define FLD(f) abuf->fields.sfmt_mrgb.f
489 1.1 christos int UNUSED written = 0;
490 1.1 christos IADDR UNUSED pc = abuf->addr;
491 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
492 1.1 christos
493 1.1 christos {
494 1.1 christos SI opval = ANDSI (GET_H_GR (FLD (f_rs)), GET_H_GR (FLD (f_rt)));
495 1.1 christos SET_H_GR (FLD (f_rd), opval);
496 1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
497 1.1 christos }
498 1.1 christos
499 1.1 christos #undef FLD
500 1.1 christos }
501 1.1 christos NEXT (vpc);
502 1.1 christos
503 1.1 christos CASE (sem, INSN_ANDI) : /* andi $rt,$rs,$lo16 */
504 1.1 christos {
505 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
506 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
507 1.1 christos #define FLD(f) abuf->fields.sfmt_addi.f
508 1.1 christos int UNUSED written = 0;
509 1.1 christos IADDR UNUSED pc = abuf->addr;
510 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
511 1.1 christos
512 1.1 christos {
513 1.1 christos SI opval = ANDSI (GET_H_GR (FLD (f_rs)), ZEXTSISI (FLD (f_imm)));
514 1.1 christos SET_H_GR (FLD (f_rt), opval);
515 1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
516 1.1 christos }
517 1.1 christos
518 1.1 christos #undef FLD
519 1.1 christos }
520 1.1 christos NEXT (vpc);
521 1.1 christos
522 1.1 christos CASE (sem, INSN_ANDOI) : /* andoi $rt,$rs,$lo16 */
523 1.1 christos {
524 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
525 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
526 1.1 christos #define FLD(f) abuf->fields.sfmt_addi.f
527 1.1 christos int UNUSED written = 0;
528 1.1 christos IADDR UNUSED pc = abuf->addr;
529 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
530 1.1 christos
531 1.1 christos {
532 1.1 christos SI opval = ANDSI (GET_H_GR (FLD (f_rs)), ORSI (0xffff0000, EXTHISI (TRUNCSIHI (FLD (f_imm)))));
533 1.1 christos SET_H_GR (FLD (f_rt), opval);
534 1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
535 1.1 christos }
536 1.1 christos
537 1.1 christos #undef FLD
538 1.1 christos }
539 1.1 christos NEXT (vpc);
540 1.1 christos
541 1.1 christos CASE (sem, INSN_NOR) : /* nor $rd,$rs,$rt */
542 1.1 christos {
543 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
544 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
545 1.1 christos #define FLD(f) abuf->fields.sfmt_mrgb.f
546 1.1 christos int UNUSED written = 0;
547 1.1 christos IADDR UNUSED pc = abuf->addr;
548 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
549 1.1 christos
550 1.1 christos {
551 1.1 christos SI opval = INVSI (ORSI (GET_H_GR (FLD (f_rs)), GET_H_GR (FLD (f_rt))));
552 1.1 christos SET_H_GR (FLD (f_rd), opval);
553 1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
554 1.1 christos }
555 1.1 christos
556 1.1 christos #undef FLD
557 1.1 christos }
558 1.1 christos NEXT (vpc);
559 1.1 christos
560 1.1 christos CASE (sem, INSN_OR) : /* or $rd,$rs,$rt */
561 1.1 christos {
562 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
563 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
564 1.1 christos #define FLD(f) abuf->fields.sfmt_mrgb.f
565 1.1 christos int UNUSED written = 0;
566 1.1 christos IADDR UNUSED pc = abuf->addr;
567 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
568 1.1 christos
569 1.1 christos {
570 1.1 christos SI opval = ORSI (GET_H_GR (FLD (f_rs)), GET_H_GR (FLD (f_rt)));
571 1.1 christos SET_H_GR (FLD (f_rd), opval);
572 1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
573 1.1 christos }
574 1.1 christos
575 1.1 christos #undef FLD
576 1.1 christos }
577 1.1 christos NEXT (vpc);
578 1.1 christos
579 1.1 christos CASE (sem, INSN_ORI) : /* ori $rt,$rs,$lo16 */
580 1.1 christos {
581 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
582 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
583 1.1 christos #define FLD(f) abuf->fields.sfmt_addi.f
584 1.1 christos int UNUSED written = 0;
585 1.1 christos IADDR UNUSED pc = abuf->addr;
586 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
587 1.1 christos
588 1.1 christos {
589 1.1 christos SI opval = ORSI (GET_H_GR (FLD (f_rs)), ZEXTSISI (FLD (f_imm)));
590 1.1 christos SET_H_GR (FLD (f_rt), opval);
591 1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
592 1.1 christos }
593 1.1 christos
594 1.1 christos #undef FLD
595 1.1 christos }
596 1.1 christos NEXT (vpc);
597 1.1 christos
598 1.1 christos CASE (sem, INSN_RAM) : /* ram $rd,$rt,$shamt,$maskl,$maskr */
599 1.1 christos {
600 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
601 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
602 1.1 christos #define FLD(f) abuf->fields.sfmt_ram.f
603 1.1 christos int UNUSED written = 0;
604 1.1 christos IADDR UNUSED pc = abuf->addr;
605 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
606 1.1 christos
607 1.1 christos {
608 1.1 christos {
609 1.1 christos SI opval = RORSI (GET_H_GR (FLD (f_rt)), FLD (f_shamt));
610 1.1 christos SET_H_GR (FLD (f_rd), opval);
611 1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
612 1.1 christos }
613 1.1 christos {
614 1.1 christos SI opval = ANDSI (GET_H_GR (FLD (f_rd)), SRLSI (0xffffffff, FLD (f_maskl)));
615 1.1 christos SET_H_GR (FLD (f_rd), opval);
616 1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
617 1.1 christos }
618 1.1 christos {
619 1.1 christos SI opval = ANDSI (GET_H_GR (FLD (f_rd)), SLLSI (0xffffffff, FLD (f_rs)));
620 1.1 christos SET_H_GR (FLD (f_rd), opval);
621 1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
622 1.1 christos }
623 1.1 christos }
624 1.1 christos
625 1.1 christos #undef FLD
626 1.1 christos }
627 1.1 christos NEXT (vpc);
628 1.1 christos
629 1.1 christos CASE (sem, INSN_SLL) : /* sll $rd,$rt,$shamt */
630 1.1 christos {
631 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
632 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
633 1.1 christos #define FLD(f) abuf->fields.sfmt_ram.f
634 1.1 christos int UNUSED written = 0;
635 1.1 christos IADDR UNUSED pc = abuf->addr;
636 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
637 1.1 christos
638 1.1 christos {
639 1.1 christos SI opval = SLLSI (GET_H_GR (FLD (f_rt)), FLD (f_shamt));
640 1.1 christos SET_H_GR (FLD (f_rd), opval);
641 1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
642 1.1 christos }
643 1.1 christos
644 1.1 christos #undef FLD
645 1.1 christos }
646 1.1 christos NEXT (vpc);
647 1.1 christos
648 1.1 christos CASE (sem, INSN_SLLV) : /* sllv $rd,$rt,$rs */
649 1.1 christos {
650 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
651 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
652 1.1 christos #define FLD(f) abuf->fields.sfmt_mrgb.f
653 1.1 christos int UNUSED written = 0;
654 1.1 christos IADDR UNUSED pc = abuf->addr;
655 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
656 1.1 christos
657 1.1 christos {
658 1.1 christos SI opval = SLLSI (GET_H_GR (FLD (f_rt)), ANDSI (GET_H_GR (FLD (f_rs)), 31));
659 1.1 christos SET_H_GR (FLD (f_rd), opval);
660 1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
661 1.1 christos }
662 1.1 christos
663 1.1 christos #undef FLD
664 1.1 christos }
665 1.1 christos NEXT (vpc);
666 1.1 christos
667 1.1 christos CASE (sem, INSN_SLMV) : /* slmv $rd,$rt,$rs,$shamt */
668 1.1 christos {
669 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
670 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
671 1.1 christos #define FLD(f) abuf->fields.sfmt_ram.f
672 1.1 christos int UNUSED written = 0;
673 1.1 christos IADDR UNUSED pc = abuf->addr;
674 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
675 1.1 christos
676 1.1 christos {
677 1.1 christos SI opval = ANDSI (SLLSI (GET_H_GR (FLD (f_rt)), FLD (f_shamt)), SRLSI (0xffffffff, GET_H_GR (FLD (f_rs))));
678 1.1 christos SET_H_GR (FLD (f_rd), opval);
679 1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
680 1.1 christos }
681 1.1 christos
682 1.1 christos #undef FLD
683 1.1 christos }
684 1.1 christos NEXT (vpc);
685 1.1 christos
686 1.1 christos CASE (sem, INSN_SLT) : /* slt $rd,$rs,$rt */
687 1.1 christos {
688 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
689 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
690 1.1 christos #define FLD(f) abuf->fields.sfmt_mrgb.f
691 1.1 christos int UNUSED written = 0;
692 1.1 christos IADDR UNUSED pc = abuf->addr;
693 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
694 1.1 christos
695 1.1 christos if (LTSI (GET_H_GR (FLD (f_rs)), GET_H_GR (FLD (f_rt)))) {
696 1.1 christos {
697 1.1 christos SI opval = 1;
698 1.1 christos SET_H_GR (FLD (f_rd), opval);
699 1.1 christos written |= (1 << 2);
700 1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
701 1.1 christos }
702 1.1 christos } else {
703 1.1 christos {
704 1.1 christos SI opval = 0;
705 1.1 christos SET_H_GR (FLD (f_rd), opval);
706 1.1 christos written |= (1 << 2);
707 1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
708 1.1 christos }
709 1.1 christos }
710 1.1 christos
711 1.1 christos abuf->written = written;
712 1.1 christos #undef FLD
713 1.1 christos }
714 1.1 christos NEXT (vpc);
715 1.1 christos
716 1.1 christos CASE (sem, INSN_SLTI) : /* slti $rt,$rs,$imm */
717 1.1 christos {
718 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
719 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
720 1.1 christos #define FLD(f) abuf->fields.sfmt_addi.f
721 1.1 christos int UNUSED written = 0;
722 1.1 christos IADDR UNUSED pc = abuf->addr;
723 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
724 1.1 christos
725 1.1 christos if (LTSI (GET_H_GR (FLD (f_rs)), EXTHISI (TRUNCSIHI (FLD (f_imm))))) {
726 1.1 christos {
727 1.1 christos SI opval = 1;
728 1.1 christos SET_H_GR (FLD (f_rt), opval);
729 1.1 christos written |= (1 << 2);
730 1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
731 1.1 christos }
732 1.1 christos } else {
733 1.1 christos {
734 1.1 christos SI opval = 0;
735 1.1 christos SET_H_GR (FLD (f_rt), opval);
736 1.1 christos written |= (1 << 2);
737 1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
738 1.1 christos }
739 1.1 christos }
740 1.1 christos
741 1.1 christos abuf->written = written;
742 1.1 christos #undef FLD
743 1.1 christos }
744 1.1 christos NEXT (vpc);
745 1.1 christos
746 1.1 christos CASE (sem, INSN_SLTIU) : /* sltiu $rt,$rs,$imm */
747 1.1 christos {
748 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
749 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
750 1.1 christos #define FLD(f) abuf->fields.sfmt_addi.f
751 1.1 christos int UNUSED written = 0;
752 1.1 christos IADDR UNUSED pc = abuf->addr;
753 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
754 1.1 christos
755 1.1 christos if (LTUSI (GET_H_GR (FLD (f_rs)), EXTHISI (TRUNCSIHI (FLD (f_imm))))) {
756 1.1 christos {
757 1.1 christos SI opval = 1;
758 1.1 christos SET_H_GR (FLD (f_rt), opval);
759 1.1 christos written |= (1 << 2);
760 1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
761 1.1 christos }
762 1.1 christos } else {
763 1.1 christos {
764 1.1 christos SI opval = 0;
765 1.1 christos SET_H_GR (FLD (f_rt), opval);
766 1.1 christos written |= (1 << 2);
767 1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
768 1.1 christos }
769 1.1 christos }
770 1.1 christos
771 1.1 christos abuf->written = written;
772 1.1 christos #undef FLD
773 1.1 christos }
774 1.1 christos NEXT (vpc);
775 1.1 christos
776 1.1 christos CASE (sem, INSN_SLTU) : /* sltu $rd,$rs,$rt */
777 1.1 christos {
778 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
779 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
780 1.1 christos #define FLD(f) abuf->fields.sfmt_mrgb.f
781 1.1 christos int UNUSED written = 0;
782 1.1 christos IADDR UNUSED pc = abuf->addr;
783 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
784 1.1 christos
785 1.1 christos if (LTUSI (GET_H_GR (FLD (f_rs)), GET_H_GR (FLD (f_rt)))) {
786 1.1 christos {
787 1.1 christos SI opval = 1;
788 1.1 christos SET_H_GR (FLD (f_rd), opval);
789 1.1 christos written |= (1 << 2);
790 1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
791 1.1 christos }
792 1.1 christos } else {
793 1.1 christos {
794 1.1 christos SI opval = 0;
795 1.1 christos SET_H_GR (FLD (f_rd), opval);
796 1.1 christos written |= (1 << 2);
797 1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
798 1.1 christos }
799 1.1 christos }
800 1.1 christos
801 1.1 christos abuf->written = written;
802 1.1 christos #undef FLD
803 1.1 christos }
804 1.1 christos NEXT (vpc);
805 1.1 christos
806 1.1 christos CASE (sem, INSN_SRA) : /* sra $rd,$rt,$shamt */
807 1.1 christos {
808 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
809 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
810 1.1 christos #define FLD(f) abuf->fields.sfmt_ram.f
811 1.1 christos int UNUSED written = 0;
812 1.1 christos IADDR UNUSED pc = abuf->addr;
813 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
814 1.1 christos
815 1.1 christos {
816 1.1 christos SI opval = SRASI (GET_H_GR (FLD (f_rt)), FLD (f_shamt));
817 1.1 christos SET_H_GR (FLD (f_rd), opval);
818 1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
819 1.1 christos }
820 1.1 christos
821 1.1 christos #undef FLD
822 1.1 christos }
823 1.1 christos NEXT (vpc);
824 1.1 christos
825 1.1 christos CASE (sem, INSN_SRAV) : /* srav $rd,$rt,$rs */
826 1.1 christos {
827 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
828 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
829 1.1 christos #define FLD(f) abuf->fields.sfmt_mrgb.f
830 1.1 christos int UNUSED written = 0;
831 1.1 christos IADDR UNUSED pc = abuf->addr;
832 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
833 1.1 christos
834 1.1 christos {
835 1.1 christos SI opval = SRASI (GET_H_GR (FLD (f_rt)), ANDSI (GET_H_GR (FLD (f_rs)), 31));
836 1.1 christos SET_H_GR (FLD (f_rd), opval);
837 1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
838 1.1 christos }
839 1.1 christos
840 1.1 christos #undef FLD
841 1.1 christos }
842 1.1 christos NEXT (vpc);
843 1.1 christos
844 1.1 christos CASE (sem, INSN_SRL) : /* srl $rd,$rt,$shamt */
845 1.1 christos {
846 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
847 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
848 1.1 christos #define FLD(f) abuf->fields.sfmt_ram.f
849 1.1 christos int UNUSED written = 0;
850 1.1 christos IADDR UNUSED pc = abuf->addr;
851 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
852 1.1 christos
853 1.1 christos {
854 1.1 christos SI opval = SRLSI (GET_H_GR (FLD (f_rt)), FLD (f_shamt));
855 1.1 christos SET_H_GR (FLD (f_rd), opval);
856 1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
857 1.1 christos }
858 1.1 christos
859 1.1 christos #undef FLD
860 1.1 christos }
861 1.1 christos NEXT (vpc);
862 1.1 christos
863 1.1 christos CASE (sem, INSN_SRLV) : /* srlv $rd,$rt,$rs */
864 1.1 christos {
865 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
866 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
867 1.1 christos #define FLD(f) abuf->fields.sfmt_mrgb.f
868 1.1 christos int UNUSED written = 0;
869 1.1 christos IADDR UNUSED pc = abuf->addr;
870 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
871 1.1 christos
872 1.1 christos {
873 1.1 christos SI opval = SRLSI (GET_H_GR (FLD (f_rt)), ANDSI (GET_H_GR (FLD (f_rs)), 31));
874 1.1 christos SET_H_GR (FLD (f_rd), opval);
875 1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
876 1.1 christos }
877 1.1 christos
878 1.1 christos #undef FLD
879 1.1 christos }
880 1.1 christos NEXT (vpc);
881 1.1 christos
882 1.1 christos CASE (sem, INSN_SRMV) : /* srmv $rd,$rt,$rs,$shamt */
883 1.1 christos {
884 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
885 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
886 1.1 christos #define FLD(f) abuf->fields.sfmt_ram.f
887 1.1 christos int UNUSED written = 0;
888 1.1 christos IADDR UNUSED pc = abuf->addr;
889 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
890 1.1 christos
891 1.1 christos {
892 1.1 christos SI opval = ANDSI (SRLSI (GET_H_GR (FLD (f_rt)), FLD (f_shamt)), SLLSI (0xffffffff, GET_H_GR (FLD (f_rs))));
893 1.1 christos SET_H_GR (FLD (f_rd), opval);
894 1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
895 1.1 christos }
896 1.1 christos
897 1.1 christos #undef FLD
898 1.1 christos }
899 1.1 christos NEXT (vpc);
900 1.1 christos
901 1.1 christos CASE (sem, INSN_SUB) : /* sub $rd,$rs,$rt */
902 1.1 christos {
903 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
904 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
905 1.1 christos #define FLD(f) abuf->fields.sfmt_mrgb.f
906 1.1 christos int UNUSED written = 0;
907 1.1 christos IADDR UNUSED pc = abuf->addr;
908 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
909 1.1 christos
910 1.1 christos {
911 1.1 christos SI opval = SUBSI (GET_H_GR (FLD (f_rs)), GET_H_GR (FLD (f_rt)));
912 1.1 christos SET_H_GR (FLD (f_rd), opval);
913 1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
914 1.1 christos }
915 1.1 christos
916 1.1 christos #undef FLD
917 1.1 christos }
918 1.1 christos NEXT (vpc);
919 1.1 christos
920 1.1 christos CASE (sem, INSN_SUBU) : /* subu $rd,$rs,$rt */
921 1.1 christos {
922 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
923 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
924 1.1 christos #define FLD(f) abuf->fields.sfmt_mrgb.f
925 1.1 christos int UNUSED written = 0;
926 1.1 christos IADDR UNUSED pc = abuf->addr;
927 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
928 1.1 christos
929 1.1 christos {
930 1.1 christos SI opval = SUBSI (GET_H_GR (FLD (f_rs)), GET_H_GR (FLD (f_rt)));
931 1.1 christos SET_H_GR (FLD (f_rd), opval);
932 1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
933 1.1 christos }
934 1.1 christos
935 1.1 christos #undef FLD
936 1.1 christos }
937 1.1 christos NEXT (vpc);
938 1.1 christos
939 1.1 christos CASE (sem, INSN_XOR) : /* xor $rd,$rs,$rt */
940 1.1 christos {
941 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
942 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
943 1.1 christos #define FLD(f) abuf->fields.sfmt_mrgb.f
944 1.1 christos int UNUSED written = 0;
945 1.1 christos IADDR UNUSED pc = abuf->addr;
946 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
947 1.1 christos
948 1.1 christos {
949 1.1 christos SI opval = XORSI (GET_H_GR (FLD (f_rs)), GET_H_GR (FLD (f_rt)));
950 1.1 christos SET_H_GR (FLD (f_rd), opval);
951 1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
952 1.1 christos }
953 1.1 christos
954 1.1 christos #undef FLD
955 1.1 christos }
956 1.1 christos NEXT (vpc);
957 1.1 christos
958 1.1 christos CASE (sem, INSN_XORI) : /* xori $rt,$rs,$lo16 */
959 1.1 christos {
960 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
961 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
962 1.1 christos #define FLD(f) abuf->fields.sfmt_addi.f
963 1.1 christos int UNUSED written = 0;
964 1.1 christos IADDR UNUSED pc = abuf->addr;
965 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
966 1.1 christos
967 1.1 christos {
968 1.1 christos SI opval = XORSI (GET_H_GR (FLD (f_rs)), ZEXTSISI (FLD (f_imm)));
969 1.1 christos SET_H_GR (FLD (f_rt), opval);
970 1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
971 1.1 christos }
972 1.1 christos
973 1.1 christos #undef FLD
974 1.1 christos }
975 1.1 christos NEXT (vpc);
976 1.1 christos
977 1.1 christos CASE (sem, INSN_BBI) : /* bbi $rs($bitnum),$offset */
978 1.1 christos {
979 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
980 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
981 1.1 christos #define FLD(f) abuf->fields.sfmt_bbi.f
982 1.1 christos int UNUSED written = 0;
983 1.1 christos IADDR UNUSED pc = abuf->addr;
984 1.1 christos SEM_BRANCH_INIT
985 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
986 1.1 christos
987 1.1 christos if (ANDSI (GET_H_GR (FLD (f_rs)), SLLSI (1, FLD (f_rt)))) {
988 1.1 christos {
989 1.1 christos {
990 1.1 christos USI opval = FLD (i_offset);
991 1.1 christos SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
992 1.1 christos written |= (1 << 3);
993 1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
994 1.1 christos }
995 1.1 christos }
996 1.1 christos }
997 1.1 christos
998 1.1 christos abuf->written = written;
999 1.1 christos SEM_BRANCH_FINI (vpc);
1000 1.1 christos #undef FLD
1001 1.1 christos }
1002 1.1 christos NEXT (vpc);
1003 1.1 christos
1004 1.1 christos CASE (sem, INSN_BBIN) : /* bbin $rs($bitnum),$offset */
1005 1.1 christos {
1006 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1007 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1008 1.1 christos #define FLD(f) abuf->fields.sfmt_bbi.f
1009 1.1 christos int UNUSED written = 0;
1010 1.1 christos IADDR UNUSED pc = abuf->addr;
1011 1.1 christos SEM_BRANCH_INIT
1012 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1013 1.1 christos
1014 1.1 christos if (NOTSI (ANDSI (GET_H_GR (FLD (f_rs)), SLLSI (1, FLD (f_rt))))) {
1015 1.1 christos {
1016 1.1 christos {
1017 1.1 christos USI opval = FLD (i_offset);
1018 1.1 christos SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
1019 1.1 christos written |= (1 << 3);
1020 1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1021 1.1 christos }
1022 1.1 christos }
1023 1.1 christos }
1024 1.1 christos
1025 1.1 christos abuf->written = written;
1026 1.1 christos SEM_BRANCH_FINI (vpc);
1027 1.1 christos #undef FLD
1028 1.1 christos }
1029 1.1 christos NEXT (vpc);
1030 1.1 christos
1031 1.1 christos CASE (sem, INSN_BBV) : /* bbv $rs,$rt,$offset */
1032 1.1 christos {
1033 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1034 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1035 1.1 christos #define FLD(f) abuf->fields.sfmt_bbi.f
1036 1.1 christos int UNUSED written = 0;
1037 1.1 christos IADDR UNUSED pc = abuf->addr;
1038 1.1 christos SEM_BRANCH_INIT
1039 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1040 1.1 christos
1041 1.1 christos if (ANDSI (GET_H_GR (FLD (f_rs)), SLLSI (1, ANDSI (GET_H_GR (FLD (f_rt)), 31)))) {
1042 1.1 christos {
1043 1.1 christos {
1044 1.1 christos USI opval = FLD (i_offset);
1045 1.1 christos SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
1046 1.1 christos written |= (1 << 3);
1047 1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1048 1.1 christos }
1049 1.1 christos }
1050 1.1 christos }
1051 1.1 christos
1052 1.1 christos abuf->written = written;
1053 1.1 christos SEM_BRANCH_FINI (vpc);
1054 1.1 christos #undef FLD
1055 1.1 christos }
1056 1.1 christos NEXT (vpc);
1057 1.1 christos
1058 1.1 christos CASE (sem, INSN_BBVN) : /* bbvn $rs,$rt,$offset */
1059 1.1 christos {
1060 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1061 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1062 1.1 christos #define FLD(f) abuf->fields.sfmt_bbi.f
1063 1.1 christos int UNUSED written = 0;
1064 1.1 christos IADDR UNUSED pc = abuf->addr;
1065 1.1 christos SEM_BRANCH_INIT
1066 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1067 1.1 christos
1068 1.1 christos if (NOTSI (ANDSI (GET_H_GR (FLD (f_rs)), SLLSI (1, ANDSI (GET_H_GR (FLD (f_rt)), 31))))) {
1069 1.1 christos {
1070 1.1 christos {
1071 1.1 christos USI opval = FLD (i_offset);
1072 1.1 christos SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
1073 1.1 christos written |= (1 << 3);
1074 1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1075 1.1 christos }
1076 1.1 christos }
1077 1.1 christos }
1078 1.1 christos
1079 1.1 christos abuf->written = written;
1080 1.1 christos SEM_BRANCH_FINI (vpc);
1081 1.1 christos #undef FLD
1082 1.1 christos }
1083 1.1 christos NEXT (vpc);
1084 1.1 christos
1085 1.1 christos CASE (sem, INSN_BEQ) : /* beq $rs,$rt,$offset */
1086 1.1 christos {
1087 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1088 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1089 1.1 christos #define FLD(f) abuf->fields.sfmt_bbi.f
1090 1.1 christos int UNUSED written = 0;
1091 1.1 christos IADDR UNUSED pc = abuf->addr;
1092 1.1 christos SEM_BRANCH_INIT
1093 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1094 1.1 christos
1095 1.1 christos if (EQSI (GET_H_GR (FLD (f_rs)), GET_H_GR (FLD (f_rt)))) {
1096 1.1 christos {
1097 1.1 christos {
1098 1.1 christos USI opval = FLD (i_offset);
1099 1.1 christos SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
1100 1.1 christos written |= (1 << 3);
1101 1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1102 1.1 christos }
1103 1.1 christos }
1104 1.1 christos }
1105 1.1 christos
1106 1.1 christos abuf->written = written;
1107 1.1 christos SEM_BRANCH_FINI (vpc);
1108 1.1 christos #undef FLD
1109 1.1 christos }
1110 1.1 christos NEXT (vpc);
1111 1.1 christos
1112 1.1 christos CASE (sem, INSN_BEQL) : /* beql $rs,$rt,$offset */
1113 1.1 christos {
1114 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1115 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1116 1.1 christos #define FLD(f) abuf->fields.sfmt_bbi.f
1117 1.1 christos int UNUSED written = 0;
1118 1.1 christos IADDR UNUSED pc = abuf->addr;
1119 1.1 christos SEM_BRANCH_INIT
1120 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1121 1.1 christos
1122 1.1 christos if (EQSI (GET_H_GR (FLD (f_rs)), GET_H_GR (FLD (f_rt)))) {
1123 1.1 christos {
1124 1.1 christos {
1125 1.1 christos USI opval = FLD (i_offset);
1126 1.1 christos SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
1127 1.1 christos written |= (1 << 3);
1128 1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1129 1.1 christos }
1130 1.1 christos }
1131 1.1 christos } else {
1132 1.1 christos if (1)
1133 1.1 christos SEM_SKIP_INSN (current_cpu, sem_arg, vpc);
1134 1.1 christos }
1135 1.1 christos
1136 1.1 christos abuf->written = written;
1137 1.1 christos SEM_BRANCH_FINI (vpc);
1138 1.1 christos #undef FLD
1139 1.1 christos }
1140 1.1 christos NEXT (vpc);
1141 1.1 christos
1142 1.1 christos CASE (sem, INSN_BGEZ) : /* bgez $rs,$offset */
1143 1.1 christos {
1144 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1145 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1146 1.1 christos #define FLD(f) abuf->fields.sfmt_bbi.f
1147 1.1 christos int UNUSED written = 0;
1148 1.1 christos IADDR UNUSED pc = abuf->addr;
1149 1.1 christos SEM_BRANCH_INIT
1150 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1151 1.1 christos
1152 1.1 christos if (GESI (GET_H_GR (FLD (f_rs)), 0)) {
1153 1.1 christos {
1154 1.1 christos {
1155 1.1 christos USI opval = FLD (i_offset);
1156 1.1 christos SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
1157 1.1 christos written |= (1 << 2);
1158 1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1159 1.1 christos }
1160 1.1 christos }
1161 1.1 christos }
1162 1.1 christos
1163 1.1 christos abuf->written = written;
1164 1.1 christos SEM_BRANCH_FINI (vpc);
1165 1.1 christos #undef FLD
1166 1.1 christos }
1167 1.1 christos NEXT (vpc);
1168 1.1 christos
1169 1.1 christos CASE (sem, INSN_BGEZAL) : /* bgezal $rs,$offset */
1170 1.1 christos {
1171 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1172 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1173 1.1 christos #define FLD(f) abuf->fields.sfmt_bbi.f
1174 1.1 christos int UNUSED written = 0;
1175 1.1 christos IADDR UNUSED pc = abuf->addr;
1176 1.1 christos SEM_BRANCH_INIT
1177 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1178 1.1 christos
1179 1.1 christos if (GESI (GET_H_GR (FLD (f_rs)), 0)) {
1180 1.1 christos {
1181 1.1 christos {
1182 1.1 christos SI opval = ADDSI (pc, 8);
1183 1.1 christos SET_H_GR (((UINT) 31), opval);
1184 1.1 christos written |= (1 << 3);
1185 1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1186 1.1 christos }
1187 1.1 christos {
1188 1.1 christos {
1189 1.1 christos USI opval = FLD (i_offset);
1190 1.1 christos SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
1191 1.1 christos written |= (1 << 4);
1192 1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1193 1.1 christos }
1194 1.1 christos }
1195 1.1 christos }
1196 1.1 christos }
1197 1.1 christos
1198 1.1 christos abuf->written = written;
1199 1.1 christos SEM_BRANCH_FINI (vpc);
1200 1.1 christos #undef FLD
1201 1.1 christos }
1202 1.1 christos NEXT (vpc);
1203 1.1 christos
1204 1.1 christos CASE (sem, INSN_BGEZALL) : /* bgezall $rs,$offset */
1205 1.1 christos {
1206 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1207 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1208 1.1 christos #define FLD(f) abuf->fields.sfmt_bbi.f
1209 1.1 christos int UNUSED written = 0;
1210 1.1 christos IADDR UNUSED pc = abuf->addr;
1211 1.1 christos SEM_BRANCH_INIT
1212 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1213 1.1 christos
1214 1.1 christos if (GESI (GET_H_GR (FLD (f_rs)), 0)) {
1215 1.1 christos {
1216 1.1 christos {
1217 1.1 christos SI opval = ADDSI (pc, 8);
1218 1.1 christos SET_H_GR (((UINT) 31), opval);
1219 1.1 christos written |= (1 << 3);
1220 1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1221 1.1 christos }
1222 1.1 christos {
1223 1.1 christos {
1224 1.1 christos USI opval = FLD (i_offset);
1225 1.1 christos SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
1226 1.1 christos written |= (1 << 4);
1227 1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1228 1.1 christos }
1229 1.1 christos }
1230 1.1 christos }
1231 1.1 christos } else {
1232 1.1 christos if (1)
1233 1.1 christos SEM_SKIP_INSN (current_cpu, sem_arg, vpc);
1234 1.1 christos }
1235 1.1 christos
1236 1.1 christos abuf->written = written;
1237 1.1 christos SEM_BRANCH_FINI (vpc);
1238 1.1 christos #undef FLD
1239 1.1 christos }
1240 1.1 christos NEXT (vpc);
1241 1.1 christos
1242 1.1 christos CASE (sem, INSN_BGEZL) : /* bgezl $rs,$offset */
1243 1.1 christos {
1244 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1245 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1246 1.1 christos #define FLD(f) abuf->fields.sfmt_bbi.f
1247 1.1 christos int UNUSED written = 0;
1248 1.1 christos IADDR UNUSED pc = abuf->addr;
1249 1.1 christos SEM_BRANCH_INIT
1250 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1251 1.1 christos
1252 1.1 christos if (GESI (GET_H_GR (FLD (f_rs)), 0)) {
1253 1.1 christos {
1254 1.1 christos {
1255 1.1 christos USI opval = FLD (i_offset);
1256 1.1 christos SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
1257 1.1 christos written |= (1 << 2);
1258 1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1259 1.1 christos }
1260 1.1 christos }
1261 1.1 christos } else {
1262 1.1 christos if (1)
1263 1.1 christos SEM_SKIP_INSN (current_cpu, sem_arg, vpc);
1264 1.1 christos }
1265 1.1 christos
1266 1.1 christos abuf->written = written;
1267 1.1 christos SEM_BRANCH_FINI (vpc);
1268 1.1 christos #undef FLD
1269 1.1 christos }
1270 1.1 christos NEXT (vpc);
1271 1.1 christos
1272 1.1 christos CASE (sem, INSN_BLTZ) : /* bltz $rs,$offset */
1273 1.1 christos {
1274 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1275 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1276 1.1 christos #define FLD(f) abuf->fields.sfmt_bbi.f
1277 1.1 christos int UNUSED written = 0;
1278 1.1 christos IADDR UNUSED pc = abuf->addr;
1279 1.1 christos SEM_BRANCH_INIT
1280 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1281 1.1 christos
1282 1.1 christos if (LTSI (GET_H_GR (FLD (f_rs)), 0)) {
1283 1.1 christos {
1284 1.1 christos {
1285 1.1 christos USI opval = FLD (i_offset);
1286 1.1 christos SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
1287 1.1 christos written |= (1 << 2);
1288 1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1289 1.1 christos }
1290 1.1 christos }
1291 1.1 christos }
1292 1.1 christos
1293 1.1 christos abuf->written = written;
1294 1.1 christos SEM_BRANCH_FINI (vpc);
1295 1.1 christos #undef FLD
1296 1.1 christos }
1297 1.1 christos NEXT (vpc);
1298 1.1 christos
1299 1.1 christos CASE (sem, INSN_BLTZL) : /* bltzl $rs,$offset */
1300 1.1 christos {
1301 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1302 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1303 1.1 christos #define FLD(f) abuf->fields.sfmt_bbi.f
1304 1.1 christos int UNUSED written = 0;
1305 1.1 christos IADDR UNUSED pc = abuf->addr;
1306 1.1 christos SEM_BRANCH_INIT
1307 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1308 1.1 christos
1309 1.1 christos if (LTSI (GET_H_GR (FLD (f_rs)), 0)) {
1310 1.1 christos {
1311 1.1 christos {
1312 1.1 christos USI opval = FLD (i_offset);
1313 1.1 christos SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
1314 1.1 christos written |= (1 << 2);
1315 1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1316 1.1 christos }
1317 1.1 christos }
1318 1.1 christos } else {
1319 1.1 christos if (1)
1320 1.1 christos SEM_SKIP_INSN (current_cpu, sem_arg, vpc);
1321 1.1 christos }
1322 1.1 christos
1323 1.1 christos abuf->written = written;
1324 1.1 christos SEM_BRANCH_FINI (vpc);
1325 1.1 christos #undef FLD
1326 1.1 christos }
1327 1.1 christos NEXT (vpc);
1328 1.1 christos
1329 1.1 christos CASE (sem, INSN_BLTZAL) : /* bltzal $rs,$offset */
1330 1.1 christos {
1331 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1332 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1333 1.1 christos #define FLD(f) abuf->fields.sfmt_bbi.f
1334 1.1 christos int UNUSED written = 0;
1335 1.1 christos IADDR UNUSED pc = abuf->addr;
1336 1.1 christos SEM_BRANCH_INIT
1337 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1338 1.1 christos
1339 1.1 christos if (LTSI (GET_H_GR (FLD (f_rs)), 0)) {
1340 1.1 christos {
1341 1.1 christos {
1342 1.1 christos SI opval = ADDSI (pc, 8);
1343 1.1 christos SET_H_GR (((UINT) 31), opval);
1344 1.1 christos written |= (1 << 3);
1345 1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1346 1.1 christos }
1347 1.1 christos {
1348 1.1 christos {
1349 1.1 christos USI opval = FLD (i_offset);
1350 1.1 christos SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
1351 1.1 christos written |= (1 << 4);
1352 1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1353 1.1 christos }
1354 1.1 christos }
1355 1.1 christos }
1356 1.1 christos }
1357 1.1 christos
1358 1.1 christos abuf->written = written;
1359 1.1 christos SEM_BRANCH_FINI (vpc);
1360 1.1 christos #undef FLD
1361 1.1 christos }
1362 1.1 christos NEXT (vpc);
1363 1.1 christos
1364 1.1 christos CASE (sem, INSN_BLTZALL) : /* bltzall $rs,$offset */
1365 1.1 christos {
1366 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1367 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1368 1.1 christos #define FLD(f) abuf->fields.sfmt_bbi.f
1369 1.1 christos int UNUSED written = 0;
1370 1.1 christos IADDR UNUSED pc = abuf->addr;
1371 1.1 christos SEM_BRANCH_INIT
1372 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1373 1.1 christos
1374 1.1 christos if (LTSI (GET_H_GR (FLD (f_rs)), 0)) {
1375 1.1 christos {
1376 1.1 christos {
1377 1.1 christos SI opval = ADDSI (pc, 8);
1378 1.1 christos SET_H_GR (((UINT) 31), opval);
1379 1.1 christos written |= (1 << 3);
1380 1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1381 1.1 christos }
1382 1.1 christos {
1383 1.1 christos {
1384 1.1 christos USI opval = FLD (i_offset);
1385 1.1 christos SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
1386 1.1 christos written |= (1 << 4);
1387 1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1388 1.1 christos }
1389 1.1 christos }
1390 1.1 christos }
1391 1.1 christos } else {
1392 1.1 christos if (1)
1393 1.1 christos SEM_SKIP_INSN (current_cpu, sem_arg, vpc);
1394 1.1 christos }
1395 1.1 christos
1396 1.1 christos abuf->written = written;
1397 1.1 christos SEM_BRANCH_FINI (vpc);
1398 1.1 christos #undef FLD
1399 1.1 christos }
1400 1.1 christos NEXT (vpc);
1401 1.1 christos
1402 1.1 christos CASE (sem, INSN_BMB0) : /* bmb0 $rs,$rt,$offset */
1403 1.1 christos {
1404 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1405 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1406 1.1 christos #define FLD(f) abuf->fields.sfmt_bbi.f
1407 1.1 christos int UNUSED written = 0;
1408 1.1 christos IADDR UNUSED pc = abuf->addr;
1409 1.1 christos SEM_BRANCH_INIT
1410 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1411 1.1 christos
1412 1.1 christos if (EQSI (ANDSI (GET_H_GR (FLD (f_rs)), 255), ANDSI (GET_H_GR (FLD (f_rt)), 255))) {
1413 1.1 christos {
1414 1.1 christos {
1415 1.1 christos USI opval = FLD (i_offset);
1416 1.1 christos SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
1417 1.1 christos written |= (1 << 3);
1418 1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1419 1.1 christos }
1420 1.1 christos }
1421 1.1 christos }
1422 1.1 christos
1423 1.1 christos abuf->written = written;
1424 1.1 christos SEM_BRANCH_FINI (vpc);
1425 1.1 christos #undef FLD
1426 1.1 christos }
1427 1.1 christos NEXT (vpc);
1428 1.1 christos
1429 1.1 christos CASE (sem, INSN_BMB1) : /* bmb1 $rs,$rt,$offset */
1430 1.1 christos {
1431 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1432 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1433 1.1 christos #define FLD(f) abuf->fields.sfmt_bbi.f
1434 1.1 christos int UNUSED written = 0;
1435 1.1 christos IADDR UNUSED pc = abuf->addr;
1436 1.1 christos SEM_BRANCH_INIT
1437 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1438 1.1 christos
1439 1.1 christos if (EQSI (ANDSI (GET_H_GR (FLD (f_rs)), 65280), ANDSI (GET_H_GR (FLD (f_rt)), 65280))) {
1440 1.1 christos {
1441 1.1 christos {
1442 1.1 christos USI opval = FLD (i_offset);
1443 1.1 christos SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
1444 1.1 christos written |= (1 << 3);
1445 1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1446 1.1 christos }
1447 1.1 christos }
1448 1.1 christos }
1449 1.1 christos
1450 1.1 christos abuf->written = written;
1451 1.1 christos SEM_BRANCH_FINI (vpc);
1452 1.1 christos #undef FLD
1453 1.1 christos }
1454 1.1 christos NEXT (vpc);
1455 1.1 christos
1456 1.1 christos CASE (sem, INSN_BMB2) : /* bmb2 $rs,$rt,$offset */
1457 1.1 christos {
1458 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1459 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1460 1.1 christos #define FLD(f) abuf->fields.sfmt_bbi.f
1461 1.1 christos int UNUSED written = 0;
1462 1.1 christos IADDR UNUSED pc = abuf->addr;
1463 1.1 christos SEM_BRANCH_INIT
1464 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1465 1.1 christos
1466 1.1 christos if (EQSI (ANDSI (GET_H_GR (FLD (f_rs)), 16711680), ANDSI (GET_H_GR (FLD (f_rt)), 16711680))) {
1467 1.1 christos {
1468 1.1 christos {
1469 1.1 christos USI opval = FLD (i_offset);
1470 1.1 christos SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
1471 1.1 christos written |= (1 << 3);
1472 1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1473 1.1 christos }
1474 1.1 christos }
1475 1.1 christos }
1476 1.1 christos
1477 1.1 christos abuf->written = written;
1478 1.1 christos SEM_BRANCH_FINI (vpc);
1479 1.1 christos #undef FLD
1480 1.1 christos }
1481 1.1 christos NEXT (vpc);
1482 1.1 christos
1483 1.1 christos CASE (sem, INSN_BMB3) : /* bmb3 $rs,$rt,$offset */
1484 1.1 christos {
1485 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1486 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1487 1.1 christos #define FLD(f) abuf->fields.sfmt_bbi.f
1488 1.1 christos int UNUSED written = 0;
1489 1.1 christos IADDR UNUSED pc = abuf->addr;
1490 1.1 christos SEM_BRANCH_INIT
1491 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1492 1.1 christos
1493 1.1 christos if (EQSI (ANDSI (GET_H_GR (FLD (f_rs)), 0xff000000), ANDSI (GET_H_GR (FLD (f_rt)), 0xff000000))) {
1494 1.1 christos {
1495 1.1 christos {
1496 1.1 christos USI opval = FLD (i_offset);
1497 1.1 christos SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
1498 1.1 christos written |= (1 << 3);
1499 1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1500 1.1 christos }
1501 1.1 christos }
1502 1.1 christos }
1503 1.1 christos
1504 1.1 christos abuf->written = written;
1505 1.1 christos SEM_BRANCH_FINI (vpc);
1506 1.1 christos #undef FLD
1507 1.1 christos }
1508 1.1 christos NEXT (vpc);
1509 1.1 christos
1510 1.1 christos CASE (sem, INSN_BNE) : /* bne $rs,$rt,$offset */
1511 1.1 christos {
1512 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1513 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1514 1.1 christos #define FLD(f) abuf->fields.sfmt_bbi.f
1515 1.1 christos int UNUSED written = 0;
1516 1.1 christos IADDR UNUSED pc = abuf->addr;
1517 1.1 christos SEM_BRANCH_INIT
1518 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1519 1.1 christos
1520 1.1 christos if (NESI (GET_H_GR (FLD (f_rs)), GET_H_GR (FLD (f_rt)))) {
1521 1.1 christos {
1522 1.1 christos {
1523 1.1 christos USI opval = FLD (i_offset);
1524 1.1 christos SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
1525 1.1 christos written |= (1 << 3);
1526 1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1527 1.1 christos }
1528 1.1 christos }
1529 1.1 christos }
1530 1.1 christos
1531 1.1 christos abuf->written = written;
1532 1.1 christos SEM_BRANCH_FINI (vpc);
1533 1.1 christos #undef FLD
1534 1.1 christos }
1535 1.1 christos NEXT (vpc);
1536 1.1 christos
1537 1.1 christos CASE (sem, INSN_BNEL) : /* bnel $rs,$rt,$offset */
1538 1.1 christos {
1539 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1540 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1541 1.1 christos #define FLD(f) abuf->fields.sfmt_bbi.f
1542 1.1 christos int UNUSED written = 0;
1543 1.1 christos IADDR UNUSED pc = abuf->addr;
1544 1.1 christos SEM_BRANCH_INIT
1545 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1546 1.1 christos
1547 1.1 christos if (NESI (GET_H_GR (FLD (f_rs)), GET_H_GR (FLD (f_rt)))) {
1548 1.1 christos {
1549 1.1 christos {
1550 1.1 christos USI opval = FLD (i_offset);
1551 1.1 christos SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
1552 1.1 christos written |= (1 << 3);
1553 1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1554 1.1 christos }
1555 1.1 christos }
1556 1.1 christos } else {
1557 1.1 christos if (1)
1558 1.1 christos SEM_SKIP_INSN (current_cpu, sem_arg, vpc);
1559 1.1 christos }
1560 1.1 christos
1561 1.1 christos abuf->written = written;
1562 1.1 christos SEM_BRANCH_FINI (vpc);
1563 1.1 christos #undef FLD
1564 1.1 christos }
1565 1.1 christos NEXT (vpc);
1566 1.1 christos
1567 1.1 christos CASE (sem, INSN_JALR) : /* jalr $rd,$rs */
1568 1.1 christos {
1569 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1570 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1571 1.1 christos #define FLD(f) abuf->fields.sfmt_mrgb.f
1572 1.1 christos int UNUSED written = 0;
1573 1.1 christos IADDR UNUSED pc = abuf->addr;
1574 1.1 christos SEM_BRANCH_INIT
1575 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1576 1.1 christos
1577 1.1 christos {
1578 1.1 christos {
1579 1.1 christos {
1580 1.1 christos SI opval = ADDSI (pc, 8);
1581 1.1 christos SET_H_GR (FLD (f_rd), opval);
1582 1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1583 1.1 christos }
1584 1.1 christos {
1585 1.1 christos USI opval = GET_H_GR (FLD (f_rs));
1586 1.1 christos SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
1587 1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1588 1.1 christos }
1589 1.1 christos }
1590 1.1 christos }
1591 1.1 christos
1592 1.1 christos SEM_BRANCH_FINI (vpc);
1593 1.1 christos #undef FLD
1594 1.1 christos }
1595 1.1 christos NEXT (vpc);
1596 1.1 christos
1597 1.1 christos CASE (sem, INSN_JR) : /* jr $rs */
1598 1.1 christos {
1599 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1600 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1601 1.1 christos #define FLD(f) abuf->fields.sfmt_bbi.f
1602 1.1 christos int UNUSED written = 0;
1603 1.1 christos IADDR UNUSED pc = abuf->addr;
1604 1.1 christos SEM_BRANCH_INIT
1605 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1606 1.1 christos
1607 1.1 christos {
1608 1.1 christos {
1609 1.1 christos USI opval = GET_H_GR (FLD (f_rs));
1610 1.1 christos SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
1611 1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1612 1.1 christos }
1613 1.1 christos }
1614 1.1 christos
1615 1.1 christos SEM_BRANCH_FINI (vpc);
1616 1.1 christos #undef FLD
1617 1.1 christos }
1618 1.1 christos NEXT (vpc);
1619 1.1 christos
1620 1.1 christos CASE (sem, INSN_LB) : /* lb $rt,$lo16($base) */
1621 1.1 christos {
1622 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1623 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1624 1.1 christos #define FLD(f) abuf->fields.sfmt_addi.f
1625 1.1 christos int UNUSED written = 0;
1626 1.1 christos IADDR UNUSED pc = abuf->addr;
1627 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1628 1.1 christos
1629 1.1 christos {
1630 1.1 christos SI opval = EXTQISI (GETMEMQI (current_cpu, pc, ADDSI (GET_H_GR (FLD (f_rs)), EXTHISI (TRUNCSIHI (FLD (f_imm))))));
1631 1.1 christos SET_H_GR (FLD (f_rt), opval);
1632 1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1633 1.1 christos }
1634 1.1 christos
1635 1.1 christos #undef FLD
1636 1.1 christos }
1637 1.1 christos NEXT (vpc);
1638 1.1 christos
1639 1.1 christos CASE (sem, INSN_LBU) : /* lbu $rt,$lo16($base) */
1640 1.1 christos {
1641 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1642 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1643 1.1 christos #define FLD(f) abuf->fields.sfmt_addi.f
1644 1.1 christos int UNUSED written = 0;
1645 1.1 christos IADDR UNUSED pc = abuf->addr;
1646 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1647 1.1 christos
1648 1.1 christos {
1649 1.1 christos SI opval = ZEXTQISI (GETMEMQI (current_cpu, pc, ADDSI (GET_H_GR (FLD (f_rs)), EXTHISI (TRUNCSIHI (FLD (f_imm))))));
1650 1.1 christos SET_H_GR (FLD (f_rt), opval);
1651 1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1652 1.1 christos }
1653 1.1 christos
1654 1.1 christos #undef FLD
1655 1.1 christos }
1656 1.1 christos NEXT (vpc);
1657 1.1 christos
1658 1.1 christos CASE (sem, INSN_LH) : /* lh $rt,$lo16($base) */
1659 1.1 christos {
1660 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1661 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1662 1.1 christos #define FLD(f) abuf->fields.sfmt_addi.f
1663 1.1 christos int UNUSED written = 0;
1664 1.1 christos IADDR UNUSED pc = abuf->addr;
1665 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1666 1.1 christos
1667 1.1 christos {
1668 1.1 christos SI opval = EXTHISI (GETMEMHI (current_cpu, pc, ADDSI (GET_H_GR (FLD (f_rs)), EXTHISI (TRUNCSIHI (FLD (f_imm))))));
1669 1.1 christos SET_H_GR (FLD (f_rt), opval);
1670 1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1671 1.1 christos }
1672 1.1 christos
1673 1.1 christos #undef FLD
1674 1.1 christos }
1675 1.1 christos NEXT (vpc);
1676 1.1 christos
1677 1.1 christos CASE (sem, INSN_LHU) : /* lhu $rt,$lo16($base) */
1678 1.1 christos {
1679 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1680 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1681 1.1 christos #define FLD(f) abuf->fields.sfmt_addi.f
1682 1.1 christos int UNUSED written = 0;
1683 1.1 christos IADDR UNUSED pc = abuf->addr;
1684 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1685 1.1 christos
1686 1.1 christos {
1687 1.1 christos SI opval = ZEXTHISI (GETMEMHI (current_cpu, pc, ADDSI (GET_H_GR (FLD (f_rs)), EXTHISI (TRUNCSIHI (FLD (f_imm))))));
1688 1.1 christos SET_H_GR (FLD (f_rt), opval);
1689 1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1690 1.1 christos }
1691 1.1 christos
1692 1.1 christos #undef FLD
1693 1.1 christos }
1694 1.1 christos NEXT (vpc);
1695 1.1 christos
1696 1.1 christos CASE (sem, INSN_LUI) : /* lui $rt,$hi16 */
1697 1.1 christos {
1698 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1699 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1700 1.1 christos #define FLD(f) abuf->fields.sfmt_addi.f
1701 1.1 christos int UNUSED written = 0;
1702 1.1 christos IADDR UNUSED pc = abuf->addr;
1703 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1704 1.1 christos
1705 1.1 christos {
1706 1.1 christos SI opval = SLLSI (FLD (f_imm), 16);
1707 1.1 christos SET_H_GR (FLD (f_rt), opval);
1708 1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1709 1.1 christos }
1710 1.1 christos
1711 1.1 christos #undef FLD
1712 1.1 christos }
1713 1.1 christos NEXT (vpc);
1714 1.1 christos
1715 1.1 christos CASE (sem, INSN_LW) : /* lw $rt,$lo16($base) */
1716 1.1 christos {
1717 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1718 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1719 1.1 christos #define FLD(f) abuf->fields.sfmt_addi.f
1720 1.1 christos int UNUSED written = 0;
1721 1.1 christos IADDR UNUSED pc = abuf->addr;
1722 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1723 1.1 christos
1724 1.1 christos {
1725 1.1 christos SI opval = GETMEMSI (current_cpu, pc, ADDSI (GET_H_GR (FLD (f_rs)), EXTHISI (TRUNCSIHI (FLD (f_imm)))));
1726 1.1 christos SET_H_GR (FLD (f_rt), opval);
1727 1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1728 1.1 christos }
1729 1.1 christos
1730 1.1 christos #undef FLD
1731 1.1 christos }
1732 1.1 christos NEXT (vpc);
1733 1.1 christos
1734 1.1 christos CASE (sem, INSN_SB) : /* sb $rt,$lo16($base) */
1735 1.1 christos {
1736 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1737 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1738 1.1 christos #define FLD(f) abuf->fields.sfmt_addi.f
1739 1.1 christos int UNUSED written = 0;
1740 1.1 christos IADDR UNUSED pc = abuf->addr;
1741 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1742 1.1 christos
1743 1.1 christos {
1744 1.1 christos QI opval = ANDQI (GET_H_GR (FLD (f_rt)), 255);
1745 1.1 christos SETMEMQI (current_cpu, pc, ADDSI (GET_H_GR (FLD (f_rs)), EXTHISI (TRUNCSIHI (FLD (f_imm)))), opval);
1746 1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
1747 1.1 christos }
1748 1.1 christos
1749 1.1 christos #undef FLD
1750 1.1 christos }
1751 1.1 christos NEXT (vpc);
1752 1.1 christos
1753 1.1 christos CASE (sem, INSN_SH) : /* sh $rt,$lo16($base) */
1754 1.1 christos {
1755 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1756 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1757 1.1 christos #define FLD(f) abuf->fields.sfmt_addi.f
1758 1.1 christos int UNUSED written = 0;
1759 1.1 christos IADDR UNUSED pc = abuf->addr;
1760 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1761 1.1 christos
1762 1.1 christos {
1763 1.1 christos HI opval = ANDHI (GET_H_GR (FLD (f_rt)), 65535);
1764 1.1 christos SETMEMHI (current_cpu, pc, ADDSI (GET_H_GR (FLD (f_rs)), EXTHISI (TRUNCSIHI (FLD (f_imm)))), opval);
1765 1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
1766 1.1 christos }
1767 1.1 christos
1768 1.1 christos #undef FLD
1769 1.1 christos }
1770 1.1 christos NEXT (vpc);
1771 1.1 christos
1772 1.1 christos CASE (sem, INSN_SW) : /* sw $rt,$lo16($base) */
1773 1.1 christos {
1774 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1775 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1776 1.1 christos #define FLD(f) abuf->fields.sfmt_addi.f
1777 1.1 christos int UNUSED written = 0;
1778 1.1 christos IADDR UNUSED pc = abuf->addr;
1779 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1780 1.1 christos
1781 1.1 christos {
1782 1.1 christos SI opval = GET_H_GR (FLD (f_rt));
1783 1.1 christos SETMEMSI (current_cpu, pc, ADDSI (GET_H_GR (FLD (f_rs)), EXTHISI (TRUNCSIHI (FLD (f_imm)))), opval);
1784 1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
1785 1.1 christos }
1786 1.1 christos
1787 1.1 christos #undef FLD
1788 1.1 christos }
1789 1.1 christos NEXT (vpc);
1790 1.1 christos
1791 1.1 christos CASE (sem, INSN_BREAK) : /* break */
1792 1.1 christos {
1793 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1794 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1795 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
1796 1.1 christos int UNUSED written = 0;
1797 1.1 christos IADDR UNUSED pc = abuf->addr;
1798 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1799 1.1 christos
1800 1.1 christos do_break (current_cpu, pc);
1801 1.1 christos
1802 1.1 christos #undef FLD
1803 1.1 christos }
1804 1.1 christos NEXT (vpc);
1805 1.1 christos
1806 1.1 christos CASE (sem, INSN_SYSCALL) : /* syscall */
1807 1.1 christos {
1808 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1809 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1810 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
1811 1.1 christos int UNUSED written = 0;
1812 1.9.2.1 perseant IADDR pc = abuf->addr;
1813 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1814 1.1 christos
1815 1.9.2.1 perseant do_syscall (current_cpu, pc);
1816 1.1 christos
1817 1.1 christos #undef FLD
1818 1.1 christos }
1819 1.1 christos NEXT (vpc);
1820 1.1 christos
1821 1.1 christos CASE (sem, INSN_ANDOUI) : /* andoui $rt,$rs,$hi16 */
1822 1.1 christos {
1823 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1824 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1825 1.1 christos #define FLD(f) abuf->fields.sfmt_addi.f
1826 1.1 christos int UNUSED written = 0;
1827 1.1 christos IADDR UNUSED pc = abuf->addr;
1828 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1829 1.1 christos
1830 1.1 christos {
1831 1.1 christos SI opval = ANDSI (GET_H_GR (FLD (f_rs)), ORSI (SLLSI (FLD (f_imm), 16), 65535));
1832 1.1 christos SET_H_GR (FLD (f_rt), opval);
1833 1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1834 1.1 christos }
1835 1.1 christos
1836 1.1 christos #undef FLD
1837 1.1 christos }
1838 1.1 christos NEXT (vpc);
1839 1.1 christos
1840 1.1 christos CASE (sem, INSN_ORUI) : /* orui $rt,$rs,$hi16 */
1841 1.1 christos {
1842 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1843 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1844 1.1 christos #define FLD(f) abuf->fields.sfmt_addi.f
1845 1.1 christos int UNUSED written = 0;
1846 1.1 christos IADDR UNUSED pc = abuf->addr;
1847 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1848 1.1 christos
1849 1.1 christos {
1850 1.1 christos SI opval = ORSI (GET_H_GR (FLD (f_rs)), SLLSI (FLD (f_imm), 16));
1851 1.1 christos SET_H_GR (FLD (f_rt), opval);
1852 1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1853 1.1 christos }
1854 1.1 christos
1855 1.1 christos #undef FLD
1856 1.1 christos }
1857 1.1 christos NEXT (vpc);
1858 1.1 christos
1859 1.1 christos CASE (sem, INSN_BGTZ) : /* bgtz $rs,$offset */
1860 1.1 christos {
1861 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1862 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1863 1.1 christos #define FLD(f) abuf->fields.sfmt_bbi.f
1864 1.1 christos int UNUSED written = 0;
1865 1.1 christos IADDR UNUSED pc = abuf->addr;
1866 1.1 christos SEM_BRANCH_INIT
1867 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1868 1.1 christos
1869 1.1 christos if (GTSI (GET_H_GR (FLD (f_rs)), 0)) {
1870 1.1 christos {
1871 1.1 christos {
1872 1.1 christos USI opval = FLD (i_offset);
1873 1.1 christos SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
1874 1.1 christos written |= (1 << 2);
1875 1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1876 1.1 christos }
1877 1.1 christos }
1878 1.1 christos }
1879 1.1 christos
1880 1.1 christos abuf->written = written;
1881 1.1 christos SEM_BRANCH_FINI (vpc);
1882 1.1 christos #undef FLD
1883 1.1 christos }
1884 1.1 christos NEXT (vpc);
1885 1.1 christos
1886 1.1 christos CASE (sem, INSN_BGTZL) : /* bgtzl $rs,$offset */
1887 1.1 christos {
1888 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1889 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1890 1.1 christos #define FLD(f) abuf->fields.sfmt_bbi.f
1891 1.1 christos int UNUSED written = 0;
1892 1.1 christos IADDR UNUSED pc = abuf->addr;
1893 1.1 christos SEM_BRANCH_INIT
1894 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1895 1.1 christos
1896 1.1 christos if (GTSI (GET_H_GR (FLD (f_rs)), 0)) {
1897 1.1 christos {
1898 1.1 christos {
1899 1.1 christos USI opval = FLD (i_offset);
1900 1.1 christos SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
1901 1.1 christos written |= (1 << 2);
1902 1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1903 1.1 christos }
1904 1.1 christos }
1905 1.1 christos } else {
1906 1.1 christos if (1)
1907 1.1 christos SEM_SKIP_INSN (current_cpu, sem_arg, vpc);
1908 1.1 christos }
1909 1.1 christos
1910 1.1 christos abuf->written = written;
1911 1.1 christos SEM_BRANCH_FINI (vpc);
1912 1.1 christos #undef FLD
1913 1.1 christos }
1914 1.1 christos NEXT (vpc);
1915 1.1 christos
1916 1.1 christos CASE (sem, INSN_BLEZ) : /* blez $rs,$offset */
1917 1.1 christos {
1918 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1919 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1920 1.1 christos #define FLD(f) abuf->fields.sfmt_bbi.f
1921 1.1 christos int UNUSED written = 0;
1922 1.1 christos IADDR UNUSED pc = abuf->addr;
1923 1.1 christos SEM_BRANCH_INIT
1924 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1925 1.1 christos
1926 1.1 christos if (LESI (GET_H_GR (FLD (f_rs)), 0)) {
1927 1.1 christos {
1928 1.1 christos {
1929 1.1 christos USI opval = FLD (i_offset);
1930 1.1 christos SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
1931 1.1 christos written |= (1 << 2);
1932 1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1933 1.1 christos }
1934 1.1 christos }
1935 1.1 christos }
1936 1.1 christos
1937 1.1 christos abuf->written = written;
1938 1.1 christos SEM_BRANCH_FINI (vpc);
1939 1.1 christos #undef FLD
1940 1.1 christos }
1941 1.1 christos NEXT (vpc);
1942 1.1 christos
1943 1.1 christos CASE (sem, INSN_BLEZL) : /* blezl $rs,$offset */
1944 1.1 christos {
1945 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1946 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1947 1.1 christos #define FLD(f) abuf->fields.sfmt_bbi.f
1948 1.1 christos int UNUSED written = 0;
1949 1.1 christos IADDR UNUSED pc = abuf->addr;
1950 1.1 christos SEM_BRANCH_INIT
1951 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1952 1.1 christos
1953 1.1 christos if (LESI (GET_H_GR (FLD (f_rs)), 0)) {
1954 1.1 christos {
1955 1.1 christos {
1956 1.1 christos USI opval = FLD (i_offset);
1957 1.1 christos SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
1958 1.1 christos written |= (1 << 2);
1959 1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1960 1.1 christos }
1961 1.1 christos }
1962 1.1 christos } else {
1963 1.1 christos if (1)
1964 1.1 christos SEM_SKIP_INSN (current_cpu, sem_arg, vpc);
1965 1.1 christos }
1966 1.1 christos
1967 1.1 christos abuf->written = written;
1968 1.1 christos SEM_BRANCH_FINI (vpc);
1969 1.1 christos #undef FLD
1970 1.1 christos }
1971 1.1 christos NEXT (vpc);
1972 1.1 christos
1973 1.1 christos CASE (sem, INSN_MRGB) : /* mrgb $rd,$rs,$rt,$mask */
1974 1.1 christos {
1975 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1976 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1977 1.1 christos #define FLD(f) abuf->fields.sfmt_mrgb.f
1978 1.1 christos int UNUSED written = 0;
1979 1.1 christos IADDR UNUSED pc = abuf->addr;
1980 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1981 1.1 christos
1982 1.1 christos {
1983 1.1 christos SI tmp_temp;
1984 1.1 christos if (NOTSI (ANDSI (FLD (f_mask), SLLSI (1, 0)))) {
1985 1.1 christos tmp_temp = ANDSI (GET_H_GR (FLD (f_rs)), 255);
1986 1.1 christos } else {
1987 1.1 christos tmp_temp = ANDSI (GET_H_GR (FLD (f_rt)), 255);
1988 1.1 christos }
1989 1.1 christos if (NOTSI (ANDSI (FLD (f_mask), SLLSI (1, 1)))) {
1990 1.1 christos tmp_temp = ORSI (tmp_temp, ANDSI (GET_H_GR (FLD (f_rs)), 65280));
1991 1.1 christos } else {
1992 1.1 christos tmp_temp = ORSI (tmp_temp, ANDSI (GET_H_GR (FLD (f_rt)), 65280));
1993 1.1 christos }
1994 1.1 christos if (NOTSI (ANDSI (FLD (f_mask), SLLSI (1, 2)))) {
1995 1.1 christos tmp_temp = ORSI (tmp_temp, ANDSI (GET_H_GR (FLD (f_rs)), 16711680));
1996 1.1 christos } else {
1997 1.1 christos tmp_temp = ORSI (tmp_temp, ANDSI (GET_H_GR (FLD (f_rt)), 16711680));
1998 1.1 christos }
1999 1.1 christos if (NOTSI (ANDSI (FLD (f_mask), SLLSI (1, 3)))) {
2000 1.1 christos tmp_temp = ORSI (tmp_temp, ANDSI (GET_H_GR (FLD (f_rs)), 0xff000000));
2001 1.1 christos } else {
2002 1.1 christos tmp_temp = ORSI (tmp_temp, ANDSI (GET_H_GR (FLD (f_rt)), 0xff000000));
2003 1.1 christos }
2004 1.1 christos {
2005 1.1 christos SI opval = tmp_temp;
2006 1.1 christos SET_H_GR (FLD (f_rd), opval);
2007 1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
2008 1.1 christos }
2009 1.1 christos }
2010 1.1 christos
2011 1.1 christos #undef FLD
2012 1.1 christos }
2013 1.1 christos NEXT (vpc);
2014 1.1 christos
2015 1.1 christos CASE (sem, INSN_BCTXT) : /* bctxt $rs,$offset */
2016 1.1 christos {
2017 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2018 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2019 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
2020 1.1 christos int UNUSED written = 0;
2021 1.1 christos IADDR UNUSED pc = abuf->addr;
2022 1.1 christos SEM_BRANCH_INIT
2023 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2024 1.1 christos
2025 1.1 christos ((void) 0); /*nop*/
2026 1.1 christos
2027 1.1 christos SEM_BRANCH_FINI (vpc);
2028 1.1 christos #undef FLD
2029 1.1 christos }
2030 1.1 christos NEXT (vpc);
2031 1.1 christos
2032 1.1 christos CASE (sem, INSN_BC0F) : /* bc0f $offset */
2033 1.1 christos {
2034 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2035 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2036 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
2037 1.1 christos int UNUSED written = 0;
2038 1.1 christos IADDR UNUSED pc = abuf->addr;
2039 1.1 christos SEM_BRANCH_INIT
2040 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2041 1.1 christos
2042 1.1 christos ((void) 0); /*nop*/
2043 1.1 christos
2044 1.1 christos SEM_BRANCH_FINI (vpc);
2045 1.1 christos #undef FLD
2046 1.1 christos }
2047 1.1 christos NEXT (vpc);
2048 1.1 christos
2049 1.1 christos CASE (sem, INSN_BC0FL) : /* bc0fl $offset */
2050 1.1 christos {
2051 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2052 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2053 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
2054 1.1 christos int UNUSED written = 0;
2055 1.1 christos IADDR UNUSED pc = abuf->addr;
2056 1.1 christos SEM_BRANCH_INIT
2057 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2058 1.1 christos
2059 1.1 christos ((void) 0); /*nop*/
2060 1.1 christos
2061 1.1 christos SEM_BRANCH_FINI (vpc);
2062 1.1 christos #undef FLD
2063 1.1 christos }
2064 1.1 christos NEXT (vpc);
2065 1.1 christos
2066 1.1 christos CASE (sem, INSN_BC3F) : /* bc3f $offset */
2067 1.1 christos {
2068 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2069 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2070 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
2071 1.1 christos int UNUSED written = 0;
2072 1.1 christos IADDR UNUSED pc = abuf->addr;
2073 1.1 christos SEM_BRANCH_INIT
2074 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2075 1.1 christos
2076 1.1 christos ((void) 0); /*nop*/
2077 1.1 christos
2078 1.1 christos SEM_BRANCH_FINI (vpc);
2079 1.1 christos #undef FLD
2080 1.1 christos }
2081 1.1 christos NEXT (vpc);
2082 1.1 christos
2083 1.1 christos CASE (sem, INSN_BC3FL) : /* bc3fl $offset */
2084 1.1 christos {
2085 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2086 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2087 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
2088 1.1 christos int UNUSED written = 0;
2089 1.1 christos IADDR UNUSED pc = abuf->addr;
2090 1.1 christos SEM_BRANCH_INIT
2091 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2092 1.1 christos
2093 1.1 christos ((void) 0); /*nop*/
2094 1.1 christos
2095 1.1 christos SEM_BRANCH_FINI (vpc);
2096 1.1 christos #undef FLD
2097 1.1 christos }
2098 1.1 christos NEXT (vpc);
2099 1.1 christos
2100 1.1 christos CASE (sem, INSN_BC0T) : /* bc0t $offset */
2101 1.1 christos {
2102 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2103 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2104 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
2105 1.1 christos int UNUSED written = 0;
2106 1.1 christos IADDR UNUSED pc = abuf->addr;
2107 1.1 christos SEM_BRANCH_INIT
2108 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2109 1.1 christos
2110 1.1 christos ((void) 0); /*nop*/
2111 1.1 christos
2112 1.1 christos SEM_BRANCH_FINI (vpc);
2113 1.1 christos #undef FLD
2114 1.1 christos }
2115 1.1 christos NEXT (vpc);
2116 1.1 christos
2117 1.1 christos CASE (sem, INSN_BC0TL) : /* bc0tl $offset */
2118 1.1 christos {
2119 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2120 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2121 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
2122 1.1 christos int UNUSED written = 0;
2123 1.1 christos IADDR UNUSED pc = abuf->addr;
2124 1.1 christos SEM_BRANCH_INIT
2125 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2126 1.1 christos
2127 1.1 christos ((void) 0); /*nop*/
2128 1.1 christos
2129 1.1 christos SEM_BRANCH_FINI (vpc);
2130 1.1 christos #undef FLD
2131 1.1 christos }
2132 1.1 christos NEXT (vpc);
2133 1.1 christos
2134 1.1 christos CASE (sem, INSN_BC3T) : /* bc3t $offset */
2135 1.1 christos {
2136 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2137 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2138 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
2139 1.1 christos int UNUSED written = 0;
2140 1.1 christos IADDR UNUSED pc = abuf->addr;
2141 1.1 christos SEM_BRANCH_INIT
2142 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2143 1.1 christos
2144 1.1 christos ((void) 0); /*nop*/
2145 1.1 christos
2146 1.1 christos SEM_BRANCH_FINI (vpc);
2147 1.1 christos #undef FLD
2148 1.1 christos }
2149 1.1 christos NEXT (vpc);
2150 1.1 christos
2151 1.1 christos CASE (sem, INSN_BC3TL) : /* bc3tl $offset */
2152 1.1 christos {
2153 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2154 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2155 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
2156 1.1 christos int UNUSED written = 0;
2157 1.1 christos IADDR UNUSED pc = abuf->addr;
2158 1.1 christos SEM_BRANCH_INIT
2159 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2160 1.1 christos
2161 1.1 christos ((void) 0); /*nop*/
2162 1.1 christos
2163 1.1 christos SEM_BRANCH_FINI (vpc);
2164 1.1 christos #undef FLD
2165 1.1 christos }
2166 1.1 christos NEXT (vpc);
2167 1.1 christos
2168 1.1 christos CASE (sem, INSN_CFC0) : /* cfc0 $rt,$rd */
2169 1.1 christos {
2170 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2171 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2172 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
2173 1.1 christos int UNUSED written = 0;
2174 1.1 christos IADDR UNUSED pc = abuf->addr;
2175 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2176 1.1 christos
2177 1.1 christos ((void) 0); /*nop*/
2178 1.1 christos
2179 1.1 christos #undef FLD
2180 1.1 christos }
2181 1.1 christos NEXT (vpc);
2182 1.1 christos
2183 1.1 christos CASE (sem, INSN_CFC1) : /* cfc1 $rt,$rd */
2184 1.1 christos {
2185 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2186 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2187 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
2188 1.1 christos int UNUSED written = 0;
2189 1.1 christos IADDR UNUSED pc = abuf->addr;
2190 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2191 1.1 christos
2192 1.1 christos ((void) 0); /*nop*/
2193 1.1 christos
2194 1.1 christos #undef FLD
2195 1.1 christos }
2196 1.1 christos NEXT (vpc);
2197 1.1 christos
2198 1.1 christos CASE (sem, INSN_CFC2) : /* cfc2 $rt,$rd */
2199 1.1 christos {
2200 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2201 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2202 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
2203 1.1 christos int UNUSED written = 0;
2204 1.1 christos IADDR UNUSED pc = abuf->addr;
2205 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2206 1.1 christos
2207 1.1 christos ((void) 0); /*nop*/
2208 1.1 christos
2209 1.1 christos #undef FLD
2210 1.1 christos }
2211 1.1 christos NEXT (vpc);
2212 1.1 christos
2213 1.1 christos CASE (sem, INSN_CFC3) : /* cfc3 $rt,$rd */
2214 1.1 christos {
2215 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2216 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2217 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
2218 1.1 christos int UNUSED written = 0;
2219 1.1 christos IADDR UNUSED pc = abuf->addr;
2220 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2221 1.1 christos
2222 1.1 christos ((void) 0); /*nop*/
2223 1.1 christos
2224 1.1 christos #undef FLD
2225 1.1 christos }
2226 1.1 christos NEXT (vpc);
2227 1.1 christos
2228 1.1 christos CASE (sem, INSN_CHKHDR) : /* chkhdr $rd,$rt */
2229 1.1 christos {
2230 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2231 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2232 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
2233 1.1 christos int UNUSED written = 0;
2234 1.1 christos IADDR UNUSED pc = abuf->addr;
2235 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2236 1.1 christos
2237 1.1 christos ((void) 0); /*nop*/
2238 1.1 christos
2239 1.1 christos #undef FLD
2240 1.1 christos }
2241 1.1 christos NEXT (vpc);
2242 1.1 christos
2243 1.1 christos CASE (sem, INSN_CTC0) : /* ctc0 $rt,$rd */
2244 1.1 christos {
2245 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2246 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2247 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
2248 1.1 christos int UNUSED written = 0;
2249 1.1 christos IADDR UNUSED pc = abuf->addr;
2250 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2251 1.1 christos
2252 1.1 christos ((void) 0); /*nop*/
2253 1.1 christos
2254 1.1 christos #undef FLD
2255 1.1 christos }
2256 1.1 christos NEXT (vpc);
2257 1.1 christos
2258 1.1 christos CASE (sem, INSN_CTC1) : /* ctc1 $rt,$rd */
2259 1.1 christos {
2260 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2261 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2262 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
2263 1.1 christos int UNUSED written = 0;
2264 1.1 christos IADDR UNUSED pc = abuf->addr;
2265 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2266 1.1 christos
2267 1.1 christos ((void) 0); /*nop*/
2268 1.1 christos
2269 1.1 christos #undef FLD
2270 1.1 christos }
2271 1.1 christos NEXT (vpc);
2272 1.1 christos
2273 1.1 christos CASE (sem, INSN_CTC2) : /* ctc2 $rt,$rd */
2274 1.1 christos {
2275 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2276 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2277 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
2278 1.1 christos int UNUSED written = 0;
2279 1.1 christos IADDR UNUSED pc = abuf->addr;
2280 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2281 1.1 christos
2282 1.1 christos ((void) 0); /*nop*/
2283 1.1 christos
2284 1.1 christos #undef FLD
2285 1.1 christos }
2286 1.1 christos NEXT (vpc);
2287 1.1 christos
2288 1.1 christos CASE (sem, INSN_CTC3) : /* ctc3 $rt,$rd */
2289 1.1 christos {
2290 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2291 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2292 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
2293 1.1 christos int UNUSED written = 0;
2294 1.1 christos IADDR UNUSED pc = abuf->addr;
2295 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2296 1.1 christos
2297 1.1 christos ((void) 0); /*nop*/
2298 1.1 christos
2299 1.1 christos #undef FLD
2300 1.1 christos }
2301 1.1 christos NEXT (vpc);
2302 1.1 christos
2303 1.1 christos CASE (sem, INSN_JCR) : /* jcr $rs */
2304 1.1 christos {
2305 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2306 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2307 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
2308 1.1 christos int UNUSED written = 0;
2309 1.1 christos IADDR UNUSED pc = abuf->addr;
2310 1.1 christos SEM_BRANCH_INIT
2311 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2312 1.1 christos
2313 1.1 christos ((void) 0); /*nop*/
2314 1.1 christos
2315 1.1 christos SEM_BRANCH_FINI (vpc);
2316 1.1 christos #undef FLD
2317 1.1 christos }
2318 1.1 christos NEXT (vpc);
2319 1.1 christos
2320 1.1 christos CASE (sem, INSN_LUC32) : /* luc32 $rt,$rd */
2321 1.1 christos {
2322 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2323 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2324 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
2325 1.1 christos int UNUSED written = 0;
2326 1.1 christos IADDR UNUSED pc = abuf->addr;
2327 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2328 1.1 christos
2329 1.1 christos ((void) 0); /*nop*/
2330 1.1 christos
2331 1.1 christos #undef FLD
2332 1.1 christos }
2333 1.1 christos NEXT (vpc);
2334 1.1 christos
2335 1.1 christos CASE (sem, INSN_LUC32L) : /* luc32l $rt,$rd */
2336 1.1 christos {
2337 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2338 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2339 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
2340 1.1 christos int UNUSED written = 0;
2341 1.1 christos IADDR UNUSED pc = abuf->addr;
2342 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2343 1.1 christos
2344 1.1 christos ((void) 0); /*nop*/
2345 1.1 christos
2346 1.1 christos #undef FLD
2347 1.1 christos }
2348 1.1 christos NEXT (vpc);
2349 1.1 christos
2350 1.1 christos CASE (sem, INSN_LUC64) : /* luc64 $rt,$rd */
2351 1.1 christos {
2352 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2353 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2354 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
2355 1.1 christos int UNUSED written = 0;
2356 1.1 christos IADDR UNUSED pc = abuf->addr;
2357 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2358 1.1 christos
2359 1.1 christos ((void) 0); /*nop*/
2360 1.1 christos
2361 1.1 christos #undef FLD
2362 1.1 christos }
2363 1.1 christos NEXT (vpc);
2364 1.1 christos
2365 1.1 christos CASE (sem, INSN_LUC64L) : /* luc64l $rt,$rd */
2366 1.1 christos {
2367 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2368 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2369 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
2370 1.1 christos int UNUSED written = 0;
2371 1.1 christos IADDR UNUSED pc = abuf->addr;
2372 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2373 1.1 christos
2374 1.1 christos ((void) 0); /*nop*/
2375 1.1 christos
2376 1.1 christos #undef FLD
2377 1.1 christos }
2378 1.1 christos NEXT (vpc);
2379 1.1 christos
2380 1.1 christos CASE (sem, INSN_LUK) : /* luk $rt,$rd */
2381 1.1 christos {
2382 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2383 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2384 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
2385 1.1 christos int UNUSED written = 0;
2386 1.1 christos IADDR UNUSED pc = abuf->addr;
2387 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2388 1.1 christos
2389 1.1 christos ((void) 0); /*nop*/
2390 1.1 christos
2391 1.1 christos #undef FLD
2392 1.1 christos }
2393 1.1 christos NEXT (vpc);
2394 1.1 christos
2395 1.1 christos CASE (sem, INSN_LULCK) : /* lulck $rt */
2396 1.1 christos {
2397 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2398 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2399 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
2400 1.1 christos int UNUSED written = 0;
2401 1.1 christos IADDR UNUSED pc = abuf->addr;
2402 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2403 1.1 christos
2404 1.1 christos ((void) 0); /*nop*/
2405 1.1 christos
2406 1.1 christos #undef FLD
2407 1.1 christos }
2408 1.1 christos NEXT (vpc);
2409 1.1 christos
2410 1.1 christos CASE (sem, INSN_LUM32) : /* lum32 $rt,$rd */
2411 1.1 christos {
2412 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2413 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2414 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
2415 1.1 christos int UNUSED written = 0;
2416 1.1 christos IADDR UNUSED pc = abuf->addr;
2417 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2418 1.1 christos
2419 1.1 christos ((void) 0); /*nop*/
2420 1.1 christos
2421 1.1 christos #undef FLD
2422 1.1 christos }
2423 1.1 christos NEXT (vpc);
2424 1.1 christos
2425 1.1 christos CASE (sem, INSN_LUM32L) : /* lum32l $rt,$rd */
2426 1.1 christos {
2427 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2428 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2429 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
2430 1.1 christos int UNUSED written = 0;
2431 1.1 christos IADDR UNUSED pc = abuf->addr;
2432 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2433 1.1 christos
2434 1.1 christos ((void) 0); /*nop*/
2435 1.1 christos
2436 1.1 christos #undef FLD
2437 1.1 christos }
2438 1.1 christos NEXT (vpc);
2439 1.1 christos
2440 1.1 christos CASE (sem, INSN_LUM64) : /* lum64 $rt,$rd */
2441 1.1 christos {
2442 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2443 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2444 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
2445 1.1 christos int UNUSED written = 0;
2446 1.1 christos IADDR UNUSED pc = abuf->addr;
2447 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2448 1.1 christos
2449 1.1 christos ((void) 0); /*nop*/
2450 1.1 christos
2451 1.1 christos #undef FLD
2452 1.1 christos }
2453 1.1 christos NEXT (vpc);
2454 1.1 christos
2455 1.1 christos CASE (sem, INSN_LUM64L) : /* lum64l $rt,$rd */
2456 1.1 christos {
2457 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2458 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2459 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
2460 1.1 christos int UNUSED written = 0;
2461 1.1 christos IADDR UNUSED pc = abuf->addr;
2462 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2463 1.1 christos
2464 1.1 christos ((void) 0); /*nop*/
2465 1.1 christos
2466 1.1 christos #undef FLD
2467 1.1 christos }
2468 1.1 christos NEXT (vpc);
2469 1.1 christos
2470 1.1 christos CASE (sem, INSN_LUR) : /* lur $rt,$rd */
2471 1.1 christos {
2472 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2473 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2474 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
2475 1.1 christos int UNUSED written = 0;
2476 1.1 christos IADDR UNUSED pc = abuf->addr;
2477 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2478 1.1 christos
2479 1.1 christos ((void) 0); /*nop*/
2480 1.1 christos
2481 1.1 christos #undef FLD
2482 1.1 christos }
2483 1.1 christos NEXT (vpc);
2484 1.1 christos
2485 1.1 christos CASE (sem, INSN_LURL) : /* lurl $rt,$rd */
2486 1.1 christos {
2487 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2488 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2489 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
2490 1.1 christos int UNUSED written = 0;
2491 1.1 christos IADDR UNUSED pc = abuf->addr;
2492 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2493 1.1 christos
2494 1.1 christos ((void) 0); /*nop*/
2495 1.1 christos
2496 1.1 christos #undef FLD
2497 1.1 christos }
2498 1.1 christos NEXT (vpc);
2499 1.1 christos
2500 1.1 christos CASE (sem, INSN_LUULCK) : /* luulck $rt */
2501 1.1 christos {
2502 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2503 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2504 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
2505 1.1 christos int UNUSED written = 0;
2506 1.1 christos IADDR UNUSED pc = abuf->addr;
2507 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2508 1.1 christos
2509 1.1 christos ((void) 0); /*nop*/
2510 1.1 christos
2511 1.1 christos #undef FLD
2512 1.1 christos }
2513 1.1 christos NEXT (vpc);
2514 1.1 christos
2515 1.1 christos CASE (sem, INSN_MFC0) : /* mfc0 $rt,$rd */
2516 1.1 christos {
2517 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2518 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2519 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
2520 1.1 christos int UNUSED written = 0;
2521 1.1 christos IADDR UNUSED pc = abuf->addr;
2522 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2523 1.1 christos
2524 1.1 christos ((void) 0); /*nop*/
2525 1.1 christos
2526 1.1 christos #undef FLD
2527 1.1 christos }
2528 1.1 christos NEXT (vpc);
2529 1.1 christos
2530 1.1 christos CASE (sem, INSN_MFC1) : /* mfc1 $rt,$rd */
2531 1.1 christos {
2532 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2533 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2534 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
2535 1.1 christos int UNUSED written = 0;
2536 1.1 christos IADDR UNUSED pc = abuf->addr;
2537 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2538 1.1 christos
2539 1.1 christos ((void) 0); /*nop*/
2540 1.1 christos
2541 1.1 christos #undef FLD
2542 1.1 christos }
2543 1.1 christos NEXT (vpc);
2544 1.1 christos
2545 1.1 christos CASE (sem, INSN_MFC2) : /* mfc2 $rt,$rd */
2546 1.1 christos {
2547 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2548 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2549 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
2550 1.1 christos int UNUSED written = 0;
2551 1.1 christos IADDR UNUSED pc = abuf->addr;
2552 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2553 1.1 christos
2554 1.1 christos ((void) 0); /*nop*/
2555 1.1 christos
2556 1.1 christos #undef FLD
2557 1.1 christos }
2558 1.1 christos NEXT (vpc);
2559 1.1 christos
2560 1.1 christos CASE (sem, INSN_MFC3) : /* mfc3 $rt,$rd */
2561 1.1 christos {
2562 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2563 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2564 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
2565 1.1 christos int UNUSED written = 0;
2566 1.1 christos IADDR UNUSED pc = abuf->addr;
2567 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2568 1.1 christos
2569 1.1 christos ((void) 0); /*nop*/
2570 1.1 christos
2571 1.1 christos #undef FLD
2572 1.1 christos }
2573 1.1 christos NEXT (vpc);
2574 1.1 christos
2575 1.1 christos CASE (sem, INSN_MTC0) : /* mtc0 $rt,$rd */
2576 1.1 christos {
2577 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2578 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2579 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
2580 1.1 christos int UNUSED written = 0;
2581 1.1 christos IADDR UNUSED pc = abuf->addr;
2582 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2583 1.1 christos
2584 1.1 christos ((void) 0); /*nop*/
2585 1.1 christos
2586 1.1 christos #undef FLD
2587 1.1 christos }
2588 1.1 christos NEXT (vpc);
2589 1.1 christos
2590 1.1 christos CASE (sem, INSN_MTC1) : /* mtc1 $rt,$rd */
2591 1.1 christos {
2592 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2593 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2594 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
2595 1.1 christos int UNUSED written = 0;
2596 1.1 christos IADDR UNUSED pc = abuf->addr;
2597 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2598 1.1 christos
2599 1.1 christos ((void) 0); /*nop*/
2600 1.1 christos
2601 1.1 christos #undef FLD
2602 1.1 christos }
2603 1.1 christos NEXT (vpc);
2604 1.1 christos
2605 1.1 christos CASE (sem, INSN_MTC2) : /* mtc2 $rt,$rd */
2606 1.1 christos {
2607 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2608 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2609 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
2610 1.1 christos int UNUSED written = 0;
2611 1.1 christos IADDR UNUSED pc = abuf->addr;
2612 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2613 1.1 christos
2614 1.1 christos ((void) 0); /*nop*/
2615 1.1 christos
2616 1.1 christos #undef FLD
2617 1.1 christos }
2618 1.1 christos NEXT (vpc);
2619 1.1 christos
2620 1.1 christos CASE (sem, INSN_MTC3) : /* mtc3 $rt,$rd */
2621 1.1 christos {
2622 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2623 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2624 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
2625 1.1 christos int UNUSED written = 0;
2626 1.1 christos IADDR UNUSED pc = abuf->addr;
2627 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2628 1.1 christos
2629 1.1 christos ((void) 0); /*nop*/
2630 1.1 christos
2631 1.1 christos #undef FLD
2632 1.1 christos }
2633 1.1 christos NEXT (vpc);
2634 1.1 christos
2635 1.1 christos CASE (sem, INSN_PKRL) : /* pkrl $rd,$rt */
2636 1.1 christos {
2637 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2638 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2639 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
2640 1.1 christos int UNUSED written = 0;
2641 1.1 christos IADDR UNUSED pc = abuf->addr;
2642 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2643 1.1 christos
2644 1.1 christos ((void) 0); /*nop*/
2645 1.1 christos
2646 1.1 christos #undef FLD
2647 1.1 christos }
2648 1.1 christos NEXT (vpc);
2649 1.1 christos
2650 1.1 christos CASE (sem, INSN_PKRLR1) : /* pkrlr1 $rt,$_index,$count */
2651 1.1 christos {
2652 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2653 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2654 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
2655 1.1 christos int UNUSED written = 0;
2656 1.1 christos IADDR UNUSED pc = abuf->addr;
2657 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2658 1.1 christos
2659 1.1 christos ((void) 0); /*nop*/
2660 1.1 christos
2661 1.1 christos #undef FLD
2662 1.1 christos }
2663 1.1 christos NEXT (vpc);
2664 1.1 christos
2665 1.1 christos CASE (sem, INSN_PKRLR30) : /* pkrlr30 $rt,$_index,$count */
2666 1.1 christos {
2667 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2668 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2669 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
2670 1.1 christos int UNUSED written = 0;
2671 1.1 christos IADDR UNUSED pc = abuf->addr;
2672 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2673 1.1 christos
2674 1.1 christos ((void) 0); /*nop*/
2675 1.1 christos
2676 1.1 christos #undef FLD
2677 1.1 christos }
2678 1.1 christos NEXT (vpc);
2679 1.1 christos
2680 1.1 christos CASE (sem, INSN_RB) : /* rb $rd,$rt */
2681 1.1 christos {
2682 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2683 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2684 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
2685 1.1 christos int UNUSED written = 0;
2686 1.1 christos IADDR UNUSED pc = abuf->addr;
2687 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2688 1.1 christos
2689 1.1 christos ((void) 0); /*nop*/
2690 1.1 christos
2691 1.1 christos #undef FLD
2692 1.1 christos }
2693 1.1 christos NEXT (vpc);
2694 1.1 christos
2695 1.1 christos CASE (sem, INSN_RBR1) : /* rbr1 $rt,$_index,$count */
2696 1.1 christos {
2697 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2698 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2699 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
2700 1.1 christos int UNUSED written = 0;
2701 1.1 christos IADDR UNUSED pc = abuf->addr;
2702 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2703 1.1 christos
2704 1.1 christos ((void) 0); /*nop*/
2705 1.1 christos
2706 1.1 christos #undef FLD
2707 1.1 christos }
2708 1.1 christos NEXT (vpc);
2709 1.1 christos
2710 1.1 christos CASE (sem, INSN_RBR30) : /* rbr30 $rt,$_index,$count */
2711 1.1 christos {
2712 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2713 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2714 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
2715 1.1 christos int UNUSED written = 0;
2716 1.1 christos IADDR UNUSED pc = abuf->addr;
2717 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2718 1.1 christos
2719 1.1 christos ((void) 0); /*nop*/
2720 1.1 christos
2721 1.1 christos #undef FLD
2722 1.1 christos }
2723 1.1 christos NEXT (vpc);
2724 1.1 christos
2725 1.1 christos CASE (sem, INSN_RFE) : /* rfe */
2726 1.1 christos {
2727 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2728 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2729 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
2730 1.1 christos int UNUSED written = 0;
2731 1.1 christos IADDR UNUSED pc = abuf->addr;
2732 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2733 1.1 christos
2734 1.1 christos ((void) 0); /*nop*/
2735 1.1 christos
2736 1.1 christos #undef FLD
2737 1.1 christos }
2738 1.1 christos NEXT (vpc);
2739 1.1 christos
2740 1.1 christos CASE (sem, INSN_RX) : /* rx $rd,$rt */
2741 1.1 christos {
2742 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2743 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2744 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
2745 1.1 christos int UNUSED written = 0;
2746 1.1 christos IADDR UNUSED pc = abuf->addr;
2747 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2748 1.1 christos
2749 1.1 christos ((void) 0); /*nop*/
2750 1.1 christos
2751 1.1 christos #undef FLD
2752 1.1 christos }
2753 1.1 christos NEXT (vpc);
2754 1.1 christos
2755 1.1 christos CASE (sem, INSN_RXR1) : /* rxr1 $rt,$_index,$count */
2756 1.1 christos {
2757 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2758 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2759 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
2760 1.1 christos int UNUSED written = 0;
2761 1.1 christos IADDR UNUSED pc = abuf->addr;
2762 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2763 1.1 christos
2764 1.1 christos ((void) 0); /*nop*/
2765 1.1 christos
2766 1.1 christos #undef FLD
2767 1.1 christos }
2768 1.1 christos NEXT (vpc);
2769 1.1 christos
2770 1.1 christos CASE (sem, INSN_RXR30) : /* rxr30 $rt,$_index,$count */
2771 1.1 christos {
2772 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2773 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2774 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
2775 1.1 christos int UNUSED written = 0;
2776 1.1 christos IADDR UNUSED pc = abuf->addr;
2777 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2778 1.1 christos
2779 1.1 christos ((void) 0); /*nop*/
2780 1.1 christos
2781 1.1 christos #undef FLD
2782 1.1 christos }
2783 1.1 christos NEXT (vpc);
2784 1.1 christos
2785 1.1 christos CASE (sem, INSN_SLEEP) : /* sleep */
2786 1.1 christos {
2787 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2788 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2789 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
2790 1.1 christos int UNUSED written = 0;
2791 1.1 christos IADDR UNUSED pc = abuf->addr;
2792 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2793 1.1 christos
2794 1.1 christos ((void) 0); /*nop*/
2795 1.1 christos
2796 1.1 christos #undef FLD
2797 1.1 christos }
2798 1.1 christos NEXT (vpc);
2799 1.1 christos
2800 1.1 christos CASE (sem, INSN_SRRD) : /* srrd $rt */
2801 1.1 christos {
2802 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2803 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2804 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
2805 1.1 christos int UNUSED written = 0;
2806 1.1 christos IADDR UNUSED pc = abuf->addr;
2807 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2808 1.1 christos
2809 1.1 christos ((void) 0); /*nop*/
2810 1.1 christos
2811 1.1 christos #undef FLD
2812 1.1 christos }
2813 1.1 christos NEXT (vpc);
2814 1.1 christos
2815 1.1 christos CASE (sem, INSN_SRRDL) : /* srrdl $rt */
2816 1.1 christos {
2817 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2818 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2819 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
2820 1.1 christos int UNUSED written = 0;
2821 1.1 christos IADDR UNUSED pc = abuf->addr;
2822 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2823 1.1 christos
2824 1.1 christos ((void) 0); /*nop*/
2825 1.1 christos
2826 1.1 christos #undef FLD
2827 1.1 christos }
2828 1.1 christos NEXT (vpc);
2829 1.1 christos
2830 1.1 christos CASE (sem, INSN_SRULCK) : /* srulck $rt */
2831 1.1 christos {
2832 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2833 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2834 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
2835 1.1 christos int UNUSED written = 0;
2836 1.1 christos IADDR UNUSED pc = abuf->addr;
2837 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2838 1.1 christos
2839 1.1 christos ((void) 0); /*nop*/
2840 1.1 christos
2841 1.1 christos #undef FLD
2842 1.1 christos }
2843 1.1 christos NEXT (vpc);
2844 1.1 christos
2845 1.1 christos CASE (sem, INSN_SRWR) : /* srwr $rt,$rd */
2846 1.1 christos {
2847 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2848 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2849 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
2850 1.1 christos int UNUSED written = 0;
2851 1.1 christos IADDR UNUSED pc = abuf->addr;
2852 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2853 1.1 christos
2854 1.1 christos ((void) 0); /*nop*/
2855 1.1 christos
2856 1.1 christos #undef FLD
2857 1.1 christos }
2858 1.1 christos NEXT (vpc);
2859 1.1 christos
2860 1.1 christos CASE (sem, INSN_SRWRU) : /* srwru $rt,$rd */
2861 1.1 christos {
2862 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2863 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2864 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
2865 1.1 christos int UNUSED written = 0;
2866 1.1 christos IADDR UNUSED pc = abuf->addr;
2867 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2868 1.1 christos
2869 1.1 christos ((void) 0); /*nop*/
2870 1.1 christos
2871 1.1 christos #undef FLD
2872 1.1 christos }
2873 1.1 christos NEXT (vpc);
2874 1.1 christos
2875 1.1 christos CASE (sem, INSN_TRAPQFL) : /* trapqfl */
2876 1.1 christos {
2877 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2878 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2879 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
2880 1.1 christos int UNUSED written = 0;
2881 1.1 christos IADDR UNUSED pc = abuf->addr;
2882 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2883 1.1 christos
2884 1.1 christos ((void) 0); /*nop*/
2885 1.1 christos
2886 1.1 christos #undef FLD
2887 1.1 christos }
2888 1.1 christos NEXT (vpc);
2889 1.1 christos
2890 1.1 christos CASE (sem, INSN_TRAPQNE) : /* trapqne */
2891 1.1 christos {
2892 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2893 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2894 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
2895 1.1 christos int UNUSED written = 0;
2896 1.1 christos IADDR UNUSED pc = abuf->addr;
2897 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2898 1.1 christos
2899 1.1 christos ((void) 0); /*nop*/
2900 1.1 christos
2901 1.1 christos #undef FLD
2902 1.1 christos }
2903 1.1 christos NEXT (vpc);
2904 1.1 christos
2905 1.1 christos CASE (sem, INSN_TRAPREL) : /* traprel $rt */
2906 1.1 christos {
2907 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2908 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2909 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
2910 1.1 christos int UNUSED written = 0;
2911 1.1 christos IADDR UNUSED pc = abuf->addr;
2912 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2913 1.1 christos
2914 1.1 christos ((void) 0); /*nop*/
2915 1.1 christos
2916 1.1 christos #undef FLD
2917 1.1 christos }
2918 1.1 christos NEXT (vpc);
2919 1.1 christos
2920 1.1 christos CASE (sem, INSN_WB) : /* wb $rd,$rt */
2921 1.1 christos {
2922 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2923 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2924 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
2925 1.1 christos int UNUSED written = 0;
2926 1.1 christos IADDR UNUSED pc = abuf->addr;
2927 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2928 1.1 christos
2929 1.1 christos ((void) 0); /*nop*/
2930 1.1 christos
2931 1.1 christos #undef FLD
2932 1.1 christos }
2933 1.1 christos NEXT (vpc);
2934 1.1 christos
2935 1.1 christos CASE (sem, INSN_WBU) : /* wbu $rd,$rt */
2936 1.1 christos {
2937 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2938 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2939 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
2940 1.1 christos int UNUSED written = 0;
2941 1.1 christos IADDR UNUSED pc = abuf->addr;
2942 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2943 1.1 christos
2944 1.1 christos ((void) 0); /*nop*/
2945 1.1 christos
2946 1.1 christos #undef FLD
2947 1.1 christos }
2948 1.1 christos NEXT (vpc);
2949 1.1 christos
2950 1.1 christos CASE (sem, INSN_WBR1) : /* wbr1 $rt,$_index,$count */
2951 1.1 christos {
2952 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2953 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2954 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
2955 1.1 christos int UNUSED written = 0;
2956 1.1 christos IADDR UNUSED pc = abuf->addr;
2957 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2958 1.1 christos
2959 1.1 christos ((void) 0); /*nop*/
2960 1.1 christos
2961 1.1 christos #undef FLD
2962 1.1 christos }
2963 1.1 christos NEXT (vpc);
2964 1.1 christos
2965 1.1 christos CASE (sem, INSN_WBR1U) : /* wbr1u $rt,$_index,$count */
2966 1.1 christos {
2967 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2968 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2969 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
2970 1.1 christos int UNUSED written = 0;
2971 1.1 christos IADDR UNUSED pc = abuf->addr;
2972 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2973 1.1 christos
2974 1.1 christos ((void) 0); /*nop*/
2975 1.1 christos
2976 1.1 christos #undef FLD
2977 1.1 christos }
2978 1.1 christos NEXT (vpc);
2979 1.1 christos
2980 1.1 christos CASE (sem, INSN_WBR30) : /* wbr30 $rt,$_index,$count */
2981 1.1 christos {
2982 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2983 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2984 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
2985 1.1 christos int UNUSED written = 0;
2986 1.1 christos IADDR UNUSED pc = abuf->addr;
2987 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2988 1.1 christos
2989 1.1 christos ((void) 0); /*nop*/
2990 1.1 christos
2991 1.1 christos #undef FLD
2992 1.1 christos }
2993 1.1 christos NEXT (vpc);
2994 1.1 christos
2995 1.1 christos CASE (sem, INSN_WBR30U) : /* wbr30u $rt,$_index,$count */
2996 1.1 christos {
2997 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2998 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2999 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
3000 1.1 christos int UNUSED written = 0;
3001 1.1 christos IADDR UNUSED pc = abuf->addr;
3002 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
3003 1.1 christos
3004 1.1 christos ((void) 0); /*nop*/
3005 1.1 christos
3006 1.1 christos #undef FLD
3007 1.1 christos }
3008 1.1 christos NEXT (vpc);
3009 1.1 christos
3010 1.1 christos CASE (sem, INSN_WX) : /* wx $rd,$rt */
3011 1.1 christos {
3012 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3013 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3014 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
3015 1.1 christos int UNUSED written = 0;
3016 1.1 christos IADDR UNUSED pc = abuf->addr;
3017 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
3018 1.1 christos
3019 1.1 christos ((void) 0); /*nop*/
3020 1.1 christos
3021 1.1 christos #undef FLD
3022 1.1 christos }
3023 1.1 christos NEXT (vpc);
3024 1.1 christos
3025 1.1 christos CASE (sem, INSN_WXU) : /* wxu $rd,$rt */
3026 1.1 christos {
3027 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3028 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3029 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
3030 1.1 christos int UNUSED written = 0;
3031 1.1 christos IADDR UNUSED pc = abuf->addr;
3032 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
3033 1.1 christos
3034 1.1 christos ((void) 0); /*nop*/
3035 1.1 christos
3036 1.1 christos #undef FLD
3037 1.1 christos }
3038 1.1 christos NEXT (vpc);
3039 1.1 christos
3040 1.1 christos CASE (sem, INSN_WXR1) : /* wxr1 $rt,$_index,$count */
3041 1.1 christos {
3042 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3043 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3044 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
3045 1.1 christos int UNUSED written = 0;
3046 1.1 christos IADDR UNUSED pc = abuf->addr;
3047 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
3048 1.1 christos
3049 1.1 christos ((void) 0); /*nop*/
3050 1.1 christos
3051 1.1 christos #undef FLD
3052 1.1 christos }
3053 1.1 christos NEXT (vpc);
3054 1.1 christos
3055 1.1 christos CASE (sem, INSN_WXR1U) : /* wxr1u $rt,$_index,$count */
3056 1.1 christos {
3057 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3058 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3059 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
3060 1.1 christos int UNUSED written = 0;
3061 1.1 christos IADDR UNUSED pc = abuf->addr;
3062 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
3063 1.1 christos
3064 1.1 christos ((void) 0); /*nop*/
3065 1.1 christos
3066 1.1 christos #undef FLD
3067 1.1 christos }
3068 1.1 christos NEXT (vpc);
3069 1.1 christos
3070 1.1 christos CASE (sem, INSN_WXR30) : /* wxr30 $rt,$_index,$count */
3071 1.1 christos {
3072 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3073 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3074 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
3075 1.1 christos int UNUSED written = 0;
3076 1.1 christos IADDR UNUSED pc = abuf->addr;
3077 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
3078 1.1 christos
3079 1.1 christos ((void) 0); /*nop*/
3080 1.1 christos
3081 1.1 christos #undef FLD
3082 1.1 christos }
3083 1.1 christos NEXT (vpc);
3084 1.1 christos
3085 1.1 christos CASE (sem, INSN_WXR30U) : /* wxr30u $rt,$_index,$count */
3086 1.1 christos {
3087 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3088 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3089 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
3090 1.1 christos int UNUSED written = 0;
3091 1.1 christos IADDR UNUSED pc = abuf->addr;
3092 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
3093 1.1 christos
3094 1.1 christos ((void) 0); /*nop*/
3095 1.1 christos
3096 1.1 christos #undef FLD
3097 1.1 christos }
3098 1.1 christos NEXT (vpc);
3099 1.1 christos
3100 1.1 christos CASE (sem, INSN_LDW) : /* ldw $rt,$lo16($base) */
3101 1.1 christos {
3102 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3103 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3104 1.1 christos #define FLD(f) abuf->fields.sfmt_addi.f
3105 1.1 christos int UNUSED written = 0;
3106 1.1 christos IADDR UNUSED pc = abuf->addr;
3107 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
3108 1.1 christos
3109 1.1 christos {
3110 1.1 christos SI tmp_addr;
3111 1.1 christos tmp_addr = ANDSI (ADDSI (GET_H_GR (FLD (f_rs)), FLD (f_imm)), INVSI (3));
3112 1.1 christos {
3113 1.1 christos SI opval = GETMEMSI (current_cpu, pc, tmp_addr);
3114 1.1 christos SET_H_GR (ADDSI (FLD (f_rt), 1), opval);
3115 1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
3116 1.1 christos }
3117 1.1 christos {
3118 1.1 christos SI opval = GETMEMSI (current_cpu, pc, ADDSI (tmp_addr, 4));
3119 1.1 christos SET_H_GR (FLD (f_rt), opval);
3120 1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
3121 1.1 christos }
3122 1.1 christos }
3123 1.1 christos
3124 1.1 christos #undef FLD
3125 1.1 christos }
3126 1.1 christos NEXT (vpc);
3127 1.1 christos
3128 1.1 christos CASE (sem, INSN_SDW) : /* sdw $rt,$lo16($base) */
3129 1.1 christos {
3130 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3131 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3132 1.1 christos #define FLD(f) abuf->fields.sfmt_addi.f
3133 1.1 christos int UNUSED written = 0;
3134 1.1 christos IADDR UNUSED pc = abuf->addr;
3135 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
3136 1.1 christos
3137 1.1 christos {
3138 1.1 christos SI tmp_addr;
3139 1.1 christos tmp_addr = ANDSI (ADDSI (GET_H_GR (FLD (f_rs)), FLD (f_imm)), INVSI (3));
3140 1.1 christos {
3141 1.1 christos SI opval = GET_H_GR (FLD (f_rt));
3142 1.1 christos SETMEMSI (current_cpu, pc, ADDSI (tmp_addr, 4), opval);
3143 1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
3144 1.1 christos }
3145 1.1 christos {
3146 1.1 christos SI opval = GET_H_GR (ADDSI (FLD (f_rt), 1));
3147 1.1 christos SETMEMSI (current_cpu, pc, tmp_addr, opval);
3148 1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
3149 1.1 christos }
3150 1.1 christos }
3151 1.1 christos
3152 1.1 christos #undef FLD
3153 1.1 christos }
3154 1.1 christos NEXT (vpc);
3155 1.1 christos
3156 1.1 christos CASE (sem, INSN_J) : /* j $jmptarg */
3157 1.1 christos {
3158 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3159 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3160 1.1 christos #define FLD(f) abuf->fields.sfmt_j.f
3161 1.1 christos int UNUSED written = 0;
3162 1.1 christos IADDR UNUSED pc = abuf->addr;
3163 1.1 christos SEM_BRANCH_INIT
3164 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
3165 1.1 christos
3166 1.1 christos {
3167 1.1 christos {
3168 1.1 christos USI opval = FLD (i_jmptarg);
3169 1.1 christos SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
3170 1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
3171 1.1 christos }
3172 1.1 christos }
3173 1.1 christos
3174 1.1 christos SEM_BRANCH_FINI (vpc);
3175 1.1 christos #undef FLD
3176 1.1 christos }
3177 1.1 christos NEXT (vpc);
3178 1.1 christos
3179 1.1 christos CASE (sem, INSN_JAL) : /* jal $jmptarg */
3180 1.1 christos {
3181 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3182 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3183 1.1 christos #define FLD(f) abuf->fields.sfmt_j.f
3184 1.1 christos int UNUSED written = 0;
3185 1.1 christos IADDR UNUSED pc = abuf->addr;
3186 1.1 christos SEM_BRANCH_INIT
3187 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
3188 1.1 christos
3189 1.1 christos {
3190 1.1 christos {
3191 1.1 christos {
3192 1.1 christos SI opval = ADDSI (pc, 8);
3193 1.1 christos SET_H_GR (((UINT) 31), opval);
3194 1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
3195 1.1 christos }
3196 1.1 christos {
3197 1.1 christos USI opval = FLD (i_jmptarg);
3198 1.1 christos SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
3199 1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
3200 1.1 christos }
3201 1.1 christos }
3202 1.1 christos }
3203 1.1 christos
3204 1.1 christos SEM_BRANCH_FINI (vpc);
3205 1.1 christos #undef FLD
3206 1.1 christos }
3207 1.1 christos NEXT (vpc);
3208 1.1 christos
3209 1.1 christos CASE (sem, INSN_BMB) : /* bmb $rs,$rt,$offset */
3210 1.1 christos {
3211 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3212 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3213 1.1 christos #define FLD(f) abuf->fields.sfmt_bbi.f
3214 1.1 christos int UNUSED written = 0;
3215 1.1 christos IADDR UNUSED pc = abuf->addr;
3216 1.1 christos SEM_BRANCH_INIT
3217 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
3218 1.1 christos
3219 1.1 christos {
3220 1.1 christos BI tmp_branch_;
3221 1.1 christos tmp_branch_ = 0;
3222 1.1 christos if (EQSI (ANDSI (GET_H_GR (FLD (f_rs)), 255), ANDSI (GET_H_GR (FLD (f_rt)), 255))) {
3223 1.1 christos tmp_branch_ = 1;
3224 1.1 christos }
3225 1.1 christos if (EQSI (ANDSI (GET_H_GR (FLD (f_rs)), 65280), ANDSI (GET_H_GR (FLD (f_rt)), 65280))) {
3226 1.1 christos tmp_branch_ = 1;
3227 1.1 christos }
3228 1.1 christos if (EQSI (ANDSI (GET_H_GR (FLD (f_rs)), 16711680), ANDSI (GET_H_GR (FLD (f_rt)), 16711680))) {
3229 1.1 christos tmp_branch_ = 1;
3230 1.1 christos }
3231 1.1 christos if (EQSI (ANDSI (GET_H_GR (FLD (f_rs)), 0xff000000), ANDSI (GET_H_GR (FLD (f_rt)), 0xff000000))) {
3232 1.1 christos tmp_branch_ = 1;
3233 1.1 christos }
3234 1.1 christos if (tmp_branch_) {
3235 1.1 christos {
3236 1.1 christos {
3237 1.1 christos USI opval = FLD (i_offset);
3238 1.1 christos SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
3239 1.1 christos written |= (1 << 3);
3240 1.5 christos CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
3241 1.1 christos }
3242 1.1 christos }
3243 1.1 christos }
3244 1.1 christos }
3245 1.1 christos
3246 1.1 christos abuf->written = written;
3247 1.1 christos SEM_BRANCH_FINI (vpc);
3248 1.1 christos #undef FLD
3249 1.1 christos }
3250 1.1 christos NEXT (vpc);
3251 1.1 christos
3252 1.1 christos
3253 1.1 christos }
3254 1.1 christos ENDSWITCH (sem) /* End of semantic switch. */
3255 1.1 christos
3256 1.1 christos /* At this point `vpc' contains the next insn to execute. */
3257 1.1 christos }
3258 1.1 christos
3259 1.1 christos #undef DEFINE_SWITCH
3260 1.1 christos #endif /* DEFINE_SWITCH */
3261