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