sem-switch.c revision 1.1 1 1.1 christos /* Simulator instruction semantics for or1k32bf.
2 1.1 christos
3 1.1 christos THIS FILE IS MACHINE GENERATED WITH CGEN.
4 1.1 christos
5 1.1 christos Copyright 1996-2019 Free Software Foundation, Inc.
6 1.1 christos
7 1.1 christos This file is part of the GNU simulators.
8 1.1 christos
9 1.1 christos This file is free software; you can redistribute it and/or modify
10 1.1 christos it under the terms of the GNU General Public License as published by
11 1.1 christos the Free Software Foundation; either version 3, or (at your option)
12 1.1 christos any later version.
13 1.1 christos
14 1.1 christos It is distributed in the hope that it will be useful, but WITHOUT
15 1.1 christos ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
16 1.1 christos or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
17 1.1 christos License for more details.
18 1.1 christos
19 1.1 christos You should have received a copy of the GNU General Public License along
20 1.1 christos with this program; if not, write to the Free Software Foundation, Inc.,
21 1.1 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 { OR1K32BF_INSN_X_INVALID, && case_sem_INSN_X_INVALID },
36 1.1 christos { OR1K32BF_INSN_X_AFTER, && case_sem_INSN_X_AFTER },
37 1.1 christos { OR1K32BF_INSN_X_BEFORE, && case_sem_INSN_X_BEFORE },
38 1.1 christos { OR1K32BF_INSN_X_CTI_CHAIN, && case_sem_INSN_X_CTI_CHAIN },
39 1.1 christos { OR1K32BF_INSN_X_CHAIN, && case_sem_INSN_X_CHAIN },
40 1.1 christos { OR1K32BF_INSN_X_BEGIN, && case_sem_INSN_X_BEGIN },
41 1.1 christos { OR1K32BF_INSN_L_J, && case_sem_INSN_L_J },
42 1.1 christos { OR1K32BF_INSN_L_ADRP, && case_sem_INSN_L_ADRP },
43 1.1 christos { OR1K32BF_INSN_L_JAL, && case_sem_INSN_L_JAL },
44 1.1 christos { OR1K32BF_INSN_L_JR, && case_sem_INSN_L_JR },
45 1.1 christos { OR1K32BF_INSN_L_JALR, && case_sem_INSN_L_JALR },
46 1.1 christos { OR1K32BF_INSN_L_BNF, && case_sem_INSN_L_BNF },
47 1.1 christos { OR1K32BF_INSN_L_BF, && case_sem_INSN_L_BF },
48 1.1 christos { OR1K32BF_INSN_L_TRAP, && case_sem_INSN_L_TRAP },
49 1.1 christos { OR1K32BF_INSN_L_SYS, && case_sem_INSN_L_SYS },
50 1.1 christos { OR1K32BF_INSN_L_MSYNC, && case_sem_INSN_L_MSYNC },
51 1.1 christos { OR1K32BF_INSN_L_PSYNC, && case_sem_INSN_L_PSYNC },
52 1.1 christos { OR1K32BF_INSN_L_CSYNC, && case_sem_INSN_L_CSYNC },
53 1.1 christos { OR1K32BF_INSN_L_RFE, && case_sem_INSN_L_RFE },
54 1.1 christos { OR1K32BF_INSN_L_NOP_IMM, && case_sem_INSN_L_NOP_IMM },
55 1.1 christos { OR1K32BF_INSN_L_MOVHI, && case_sem_INSN_L_MOVHI },
56 1.1 christos { OR1K32BF_INSN_L_MACRC, && case_sem_INSN_L_MACRC },
57 1.1 christos { OR1K32BF_INSN_L_MFSPR, && case_sem_INSN_L_MFSPR },
58 1.1 christos { OR1K32BF_INSN_L_MTSPR, && case_sem_INSN_L_MTSPR },
59 1.1 christos { OR1K32BF_INSN_L_LWZ, && case_sem_INSN_L_LWZ },
60 1.1 christos { OR1K32BF_INSN_L_LWS, && case_sem_INSN_L_LWS },
61 1.1 christos { OR1K32BF_INSN_L_LWA, && case_sem_INSN_L_LWA },
62 1.1 christos { OR1K32BF_INSN_L_LBZ, && case_sem_INSN_L_LBZ },
63 1.1 christos { OR1K32BF_INSN_L_LBS, && case_sem_INSN_L_LBS },
64 1.1 christos { OR1K32BF_INSN_L_LHZ, && case_sem_INSN_L_LHZ },
65 1.1 christos { OR1K32BF_INSN_L_LHS, && case_sem_INSN_L_LHS },
66 1.1 christos { OR1K32BF_INSN_L_SW, && case_sem_INSN_L_SW },
67 1.1 christos { OR1K32BF_INSN_L_SB, && case_sem_INSN_L_SB },
68 1.1 christos { OR1K32BF_INSN_L_SH, && case_sem_INSN_L_SH },
69 1.1 christos { OR1K32BF_INSN_L_SWA, && case_sem_INSN_L_SWA },
70 1.1 christos { OR1K32BF_INSN_L_SLL, && case_sem_INSN_L_SLL },
71 1.1 christos { OR1K32BF_INSN_L_SLLI, && case_sem_INSN_L_SLLI },
72 1.1 christos { OR1K32BF_INSN_L_SRL, && case_sem_INSN_L_SRL },
73 1.1 christos { OR1K32BF_INSN_L_SRLI, && case_sem_INSN_L_SRLI },
74 1.1 christos { OR1K32BF_INSN_L_SRA, && case_sem_INSN_L_SRA },
75 1.1 christos { OR1K32BF_INSN_L_SRAI, && case_sem_INSN_L_SRAI },
76 1.1 christos { OR1K32BF_INSN_L_ROR, && case_sem_INSN_L_ROR },
77 1.1 christos { OR1K32BF_INSN_L_RORI, && case_sem_INSN_L_RORI },
78 1.1 christos { OR1K32BF_INSN_L_AND, && case_sem_INSN_L_AND },
79 1.1 christos { OR1K32BF_INSN_L_OR, && case_sem_INSN_L_OR },
80 1.1 christos { OR1K32BF_INSN_L_XOR, && case_sem_INSN_L_XOR },
81 1.1 christos { OR1K32BF_INSN_L_ADD, && case_sem_INSN_L_ADD },
82 1.1 christos { OR1K32BF_INSN_L_SUB, && case_sem_INSN_L_SUB },
83 1.1 christos { OR1K32BF_INSN_L_ADDC, && case_sem_INSN_L_ADDC },
84 1.1 christos { OR1K32BF_INSN_L_MUL, && case_sem_INSN_L_MUL },
85 1.1 christos { OR1K32BF_INSN_L_MULD, && case_sem_INSN_L_MULD },
86 1.1 christos { OR1K32BF_INSN_L_MULU, && case_sem_INSN_L_MULU },
87 1.1 christos { OR1K32BF_INSN_L_MULDU, && case_sem_INSN_L_MULDU },
88 1.1 christos { OR1K32BF_INSN_L_DIV, && case_sem_INSN_L_DIV },
89 1.1 christos { OR1K32BF_INSN_L_DIVU, && case_sem_INSN_L_DIVU },
90 1.1 christos { OR1K32BF_INSN_L_FF1, && case_sem_INSN_L_FF1 },
91 1.1 christos { OR1K32BF_INSN_L_FL1, && case_sem_INSN_L_FL1 },
92 1.1 christos { OR1K32BF_INSN_L_ANDI, && case_sem_INSN_L_ANDI },
93 1.1 christos { OR1K32BF_INSN_L_ORI, && case_sem_INSN_L_ORI },
94 1.1 christos { OR1K32BF_INSN_L_XORI, && case_sem_INSN_L_XORI },
95 1.1 christos { OR1K32BF_INSN_L_ADDI, && case_sem_INSN_L_ADDI },
96 1.1 christos { OR1K32BF_INSN_L_ADDIC, && case_sem_INSN_L_ADDIC },
97 1.1 christos { OR1K32BF_INSN_L_MULI, && case_sem_INSN_L_MULI },
98 1.1 christos { OR1K32BF_INSN_L_EXTHS, && case_sem_INSN_L_EXTHS },
99 1.1 christos { OR1K32BF_INSN_L_EXTBS, && case_sem_INSN_L_EXTBS },
100 1.1 christos { OR1K32BF_INSN_L_EXTHZ, && case_sem_INSN_L_EXTHZ },
101 1.1 christos { OR1K32BF_INSN_L_EXTBZ, && case_sem_INSN_L_EXTBZ },
102 1.1 christos { OR1K32BF_INSN_L_EXTWS, && case_sem_INSN_L_EXTWS },
103 1.1 christos { OR1K32BF_INSN_L_EXTWZ, && case_sem_INSN_L_EXTWZ },
104 1.1 christos { OR1K32BF_INSN_L_CMOV, && case_sem_INSN_L_CMOV },
105 1.1 christos { OR1K32BF_INSN_L_SFGTS, && case_sem_INSN_L_SFGTS },
106 1.1 christos { OR1K32BF_INSN_L_SFGTSI, && case_sem_INSN_L_SFGTSI },
107 1.1 christos { OR1K32BF_INSN_L_SFGTU, && case_sem_INSN_L_SFGTU },
108 1.1 christos { OR1K32BF_INSN_L_SFGTUI, && case_sem_INSN_L_SFGTUI },
109 1.1 christos { OR1K32BF_INSN_L_SFGES, && case_sem_INSN_L_SFGES },
110 1.1 christos { OR1K32BF_INSN_L_SFGESI, && case_sem_INSN_L_SFGESI },
111 1.1 christos { OR1K32BF_INSN_L_SFGEU, && case_sem_INSN_L_SFGEU },
112 1.1 christos { OR1K32BF_INSN_L_SFGEUI, && case_sem_INSN_L_SFGEUI },
113 1.1 christos { OR1K32BF_INSN_L_SFLTS, && case_sem_INSN_L_SFLTS },
114 1.1 christos { OR1K32BF_INSN_L_SFLTSI, && case_sem_INSN_L_SFLTSI },
115 1.1 christos { OR1K32BF_INSN_L_SFLTU, && case_sem_INSN_L_SFLTU },
116 1.1 christos { OR1K32BF_INSN_L_SFLTUI, && case_sem_INSN_L_SFLTUI },
117 1.1 christos { OR1K32BF_INSN_L_SFLES, && case_sem_INSN_L_SFLES },
118 1.1 christos { OR1K32BF_INSN_L_SFLESI, && case_sem_INSN_L_SFLESI },
119 1.1 christos { OR1K32BF_INSN_L_SFLEU, && case_sem_INSN_L_SFLEU },
120 1.1 christos { OR1K32BF_INSN_L_SFLEUI, && case_sem_INSN_L_SFLEUI },
121 1.1 christos { OR1K32BF_INSN_L_SFEQ, && case_sem_INSN_L_SFEQ },
122 1.1 christos { OR1K32BF_INSN_L_SFEQI, && case_sem_INSN_L_SFEQI },
123 1.1 christos { OR1K32BF_INSN_L_SFNE, && case_sem_INSN_L_SFNE },
124 1.1 christos { OR1K32BF_INSN_L_SFNEI, && case_sem_INSN_L_SFNEI },
125 1.1 christos { OR1K32BF_INSN_L_MAC, && case_sem_INSN_L_MAC },
126 1.1 christos { OR1K32BF_INSN_L_MACI, && case_sem_INSN_L_MACI },
127 1.1 christos { OR1K32BF_INSN_L_MACU, && case_sem_INSN_L_MACU },
128 1.1 christos { OR1K32BF_INSN_L_MSB, && case_sem_INSN_L_MSB },
129 1.1 christos { OR1K32BF_INSN_L_MSBU, && case_sem_INSN_L_MSBU },
130 1.1 christos { OR1K32BF_INSN_L_CUST1, && case_sem_INSN_L_CUST1 },
131 1.1 christos { OR1K32BF_INSN_L_CUST2, && case_sem_INSN_L_CUST2 },
132 1.1 christos { OR1K32BF_INSN_L_CUST3, && case_sem_INSN_L_CUST3 },
133 1.1 christos { OR1K32BF_INSN_L_CUST4, && case_sem_INSN_L_CUST4 },
134 1.1 christos { OR1K32BF_INSN_L_CUST5, && case_sem_INSN_L_CUST5 },
135 1.1 christos { OR1K32BF_INSN_L_CUST6, && case_sem_INSN_L_CUST6 },
136 1.1 christos { OR1K32BF_INSN_L_CUST7, && case_sem_INSN_L_CUST7 },
137 1.1 christos { OR1K32BF_INSN_L_CUST8, && case_sem_INSN_L_CUST8 },
138 1.1 christos { OR1K32BF_INSN_LF_ADD_S, && case_sem_INSN_LF_ADD_S },
139 1.1 christos { OR1K32BF_INSN_LF_SUB_S, && case_sem_INSN_LF_SUB_S },
140 1.1 christos { OR1K32BF_INSN_LF_MUL_S, && case_sem_INSN_LF_MUL_S },
141 1.1 christos { OR1K32BF_INSN_LF_DIV_S, && case_sem_INSN_LF_DIV_S },
142 1.1 christos { OR1K32BF_INSN_LF_REM_S, && case_sem_INSN_LF_REM_S },
143 1.1 christos { OR1K32BF_INSN_LF_ITOF_S, && case_sem_INSN_LF_ITOF_S },
144 1.1 christos { OR1K32BF_INSN_LF_FTOI_S, && case_sem_INSN_LF_FTOI_S },
145 1.1 christos { OR1K32BF_INSN_LF_EQ_S, && case_sem_INSN_LF_EQ_S },
146 1.1 christos { OR1K32BF_INSN_LF_NE_S, && case_sem_INSN_LF_NE_S },
147 1.1 christos { OR1K32BF_INSN_LF_GE_S, && case_sem_INSN_LF_GE_S },
148 1.1 christos { OR1K32BF_INSN_LF_GT_S, && case_sem_INSN_LF_GT_S },
149 1.1 christos { OR1K32BF_INSN_LF_LT_S, && case_sem_INSN_LF_LT_S },
150 1.1 christos { OR1K32BF_INSN_LF_LE_S, && case_sem_INSN_LF_LE_S },
151 1.1 christos { OR1K32BF_INSN_LF_MADD_S, && case_sem_INSN_LF_MADD_S },
152 1.1 christos { OR1K32BF_INSN_LF_CUST1_S, && case_sem_INSN_LF_CUST1_S },
153 1.1 christos { 0, 0 }
154 1.1 christos };
155 1.1 christos int i;
156 1.1 christos
157 1.1 christos for (i = 0; labels[i].label != 0; ++i)
158 1.1 christos {
159 1.1 christos #if FAST_P
160 1.1 christos CPU_IDESC (current_cpu) [labels[i].index].sem_fast_lab = labels[i].label;
161 1.1 christos #else
162 1.1 christos CPU_IDESC (current_cpu) [labels[i].index].sem_full_lab = labels[i].label;
163 1.1 christos #endif
164 1.1 christos }
165 1.1 christos
166 1.1 christos #undef DEFINE_LABELS
167 1.1 christos #endif /* DEFINE_LABELS */
168 1.1 christos
169 1.1 christos #ifdef DEFINE_SWITCH
170 1.1 christos
171 1.1 christos /* If hyper-fast [well not unnecessarily slow] execution is selected, turn
172 1.1 christos off frills like tracing and profiling. */
173 1.1 christos /* FIXME: A better way would be to have TRACE_RESULT check for something
174 1.1 christos that can cause it to be optimized out. Another way would be to emit
175 1.1 christos special handlers into the instruction "stream". */
176 1.1 christos
177 1.1 christos #if FAST_P
178 1.1 christos #undef CGEN_TRACE_RESULT
179 1.1 christos #define CGEN_TRACE_RESULT(cpu, abuf, name, type, val)
180 1.1 christos #endif
181 1.1 christos
182 1.1 christos #undef GET_ATTR
183 1.1 christos #define GET_ATTR(cpu, num, attr) CGEN_ATTR_VALUE (NULL, abuf->idesc->attrs, CGEN_INSN_##attr)
184 1.1 christos
185 1.1 christos {
186 1.1 christos
187 1.1 christos #if WITH_SCACHE_PBB
188 1.1 christos
189 1.1 christos /* Branch to next handler without going around main loop. */
190 1.1 christos #define NEXT(vpc) goto * SEM_ARGBUF (vpc) -> semantic.sem_case
191 1.1 christos SWITCH (sem, SEM_ARGBUF (vpc) -> semantic.sem_case)
192 1.1 christos
193 1.1 christos #else /* ! WITH_SCACHE_PBB */
194 1.1 christos
195 1.1 christos #define NEXT(vpc) BREAK (sem)
196 1.1 christos #ifdef __GNUC__
197 1.1 christos #if FAST_P
198 1.1 christos SWITCH (sem, SEM_ARGBUF (sc) -> idesc->sem_fast_lab)
199 1.1 christos #else
200 1.1 christos SWITCH (sem, SEM_ARGBUF (sc) -> idesc->sem_full_lab)
201 1.1 christos #endif
202 1.1 christos #else
203 1.1 christos SWITCH (sem, SEM_ARGBUF (sc) -> idesc->num)
204 1.1 christos #endif
205 1.1 christos
206 1.1 christos #endif /* ! WITH_SCACHE_PBB */
207 1.1 christos
208 1.1 christos {
209 1.1 christos
210 1.1 christos CASE (sem, INSN_X_INVALID) : /* --invalid-- */
211 1.1 christos {
212 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
213 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
214 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
215 1.1 christos int UNUSED written = 0;
216 1.1 christos IADDR UNUSED pc = abuf->addr;
217 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
218 1.1 christos
219 1.1 christos {
220 1.1 christos /* Update the recorded pc in the cpu state struct.
221 1.1 christos Only necessary for WITH_SCACHE case, but to avoid the
222 1.1 christos conditional compilation .... */
223 1.1 christos SET_H_PC (pc);
224 1.1 christos /* Virtual insns have zero size. Overwrite vpc with address of next insn
225 1.1 christos using the default-insn-bitsize spec. When executing insns in parallel
226 1.1 christos we may want to queue the fault and continue execution. */
227 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
228 1.1 christos vpc = sim_engine_invalid_insn (current_cpu, pc, vpc);
229 1.1 christos }
230 1.1 christos
231 1.1 christos #undef FLD
232 1.1 christos }
233 1.1 christos NEXT (vpc);
234 1.1 christos
235 1.1 christos CASE (sem, INSN_X_AFTER) : /* --after-- */
236 1.1 christos {
237 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
238 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
239 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
240 1.1 christos int UNUSED written = 0;
241 1.1 christos IADDR UNUSED pc = abuf->addr;
242 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
243 1.1 christos
244 1.1 christos {
245 1.1 christos #if WITH_SCACHE_PBB_OR1K32BF
246 1.1 christos or1k32bf_pbb_after (current_cpu, sem_arg);
247 1.1 christos #endif
248 1.1 christos }
249 1.1 christos
250 1.1 christos #undef FLD
251 1.1 christos }
252 1.1 christos NEXT (vpc);
253 1.1 christos
254 1.1 christos CASE (sem, INSN_X_BEFORE) : /* --before-- */
255 1.1 christos {
256 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
257 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
258 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
259 1.1 christos int UNUSED written = 0;
260 1.1 christos IADDR UNUSED pc = abuf->addr;
261 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
262 1.1 christos
263 1.1 christos {
264 1.1 christos #if WITH_SCACHE_PBB_OR1K32BF
265 1.1 christos or1k32bf_pbb_before (current_cpu, sem_arg);
266 1.1 christos #endif
267 1.1 christos }
268 1.1 christos
269 1.1 christos #undef FLD
270 1.1 christos }
271 1.1 christos NEXT (vpc);
272 1.1 christos
273 1.1 christos CASE (sem, INSN_X_CTI_CHAIN) : /* --cti-chain-- */
274 1.1 christos {
275 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
276 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
277 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
278 1.1 christos int UNUSED written = 0;
279 1.1 christos IADDR UNUSED pc = abuf->addr;
280 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
281 1.1 christos
282 1.1 christos {
283 1.1 christos #if WITH_SCACHE_PBB_OR1K32BF
284 1.1 christos #ifdef DEFINE_SWITCH
285 1.1 christos vpc = or1k32bf_pbb_cti_chain (current_cpu, sem_arg,
286 1.1 christos pbb_br_type, pbb_br_npc);
287 1.1 christos BREAK (sem);
288 1.1 christos #else
289 1.1 christos /* FIXME: Allow provision of explicit ifmt spec in insn spec. */
290 1.1 christos vpc = or1k32bf_pbb_cti_chain (current_cpu, sem_arg,
291 1.1 christos CPU_PBB_BR_TYPE (current_cpu),
292 1.1 christos CPU_PBB_BR_NPC (current_cpu));
293 1.1 christos #endif
294 1.1 christos #endif
295 1.1 christos }
296 1.1 christos
297 1.1 christos #undef FLD
298 1.1 christos }
299 1.1 christos NEXT (vpc);
300 1.1 christos
301 1.1 christos CASE (sem, INSN_X_CHAIN) : /* --chain-- */
302 1.1 christos {
303 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
304 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
305 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
306 1.1 christos int UNUSED written = 0;
307 1.1 christos IADDR UNUSED pc = abuf->addr;
308 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
309 1.1 christos
310 1.1 christos {
311 1.1 christos #if WITH_SCACHE_PBB_OR1K32BF
312 1.1 christos vpc = or1k32bf_pbb_chain (current_cpu, sem_arg);
313 1.1 christos #ifdef DEFINE_SWITCH
314 1.1 christos BREAK (sem);
315 1.1 christos #endif
316 1.1 christos #endif
317 1.1 christos }
318 1.1 christos
319 1.1 christos #undef FLD
320 1.1 christos }
321 1.1 christos NEXT (vpc);
322 1.1 christos
323 1.1 christos CASE (sem, INSN_X_BEGIN) : /* --begin-- */
324 1.1 christos {
325 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
326 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
327 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
328 1.1 christos int UNUSED written = 0;
329 1.1 christos IADDR UNUSED pc = abuf->addr;
330 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
331 1.1 christos
332 1.1 christos {
333 1.1 christos #if WITH_SCACHE_PBB_OR1K32BF
334 1.1 christos #if defined DEFINE_SWITCH || defined FAST_P
335 1.1 christos /* In the switch case FAST_P is a constant, allowing several optimizations
336 1.1 christos in any called inline functions. */
337 1.1 christos vpc = or1k32bf_pbb_begin (current_cpu, FAST_P);
338 1.1 christos #else
339 1.1 christos #if 0 /* cgen engine can't handle dynamic fast/full switching yet. */
340 1.1 christos vpc = or1k32bf_pbb_begin (current_cpu, STATE_RUN_FAST_P (CPU_STATE (current_cpu)));
341 1.1 christos #else
342 1.1 christos vpc = or1k32bf_pbb_begin (current_cpu, 0);
343 1.1 christos #endif
344 1.1 christos #endif
345 1.1 christos #endif
346 1.1 christos }
347 1.1 christos
348 1.1 christos #undef FLD
349 1.1 christos }
350 1.1 christos NEXT (vpc);
351 1.1 christos
352 1.1 christos CASE (sem, INSN_L_J) : /* l.j ${disp26} */
353 1.1 christos {
354 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
355 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
356 1.1 christos #define FLD(f) abuf->fields.sfmt_l_j.f
357 1.1 christos int UNUSED written = 0;
358 1.1 christos IADDR UNUSED pc = abuf->addr;
359 1.1 christos SEM_BRANCH_INIT
360 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
361 1.1 christos
362 1.1 christos {
363 1.1 christos {
364 1.1 christos {
365 1.1 christos USI opval = FLD (i_disp26);
366 1.1 christos SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
367 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
368 1.1 christos }
369 1.1 christos }
370 1.1 christos if (GET_H_SYS_CPUCFGR_ND ()) {
371 1.1 christos if (1)
372 1.1 christos SEM_SKIP_INSN (current_cpu, sem_arg, vpc);
373 1.1 christos }
374 1.1 christos }
375 1.1 christos
376 1.1 christos SEM_BRANCH_FINI (vpc);
377 1.1 christos #undef FLD
378 1.1 christos }
379 1.1 christos NEXT (vpc);
380 1.1 christos
381 1.1 christos CASE (sem, INSN_L_ADRP) : /* l.adrp $rD,${disp21} */
382 1.1 christos {
383 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
384 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
385 1.1 christos #define FLD(f) abuf->fields.sfmt_l_adrp.f
386 1.1 christos int UNUSED written = 0;
387 1.1 christos IADDR UNUSED pc = abuf->addr;
388 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
389 1.1 christos
390 1.1 christos {
391 1.1 christos USI opval = FLD (i_disp21);
392 1.1 christos SET_H_GPR (FLD (f_r1), opval);
393 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval);
394 1.1 christos }
395 1.1 christos
396 1.1 christos #undef FLD
397 1.1 christos }
398 1.1 christos NEXT (vpc);
399 1.1 christos
400 1.1 christos CASE (sem, INSN_L_JAL) : /* l.jal ${disp26} */
401 1.1 christos {
402 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
403 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
404 1.1 christos #define FLD(f) abuf->fields.sfmt_l_j.f
405 1.1 christos int UNUSED written = 0;
406 1.1 christos IADDR UNUSED pc = abuf->addr;
407 1.1 christos SEM_BRANCH_INIT
408 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
409 1.1 christos
410 1.1 christos {
411 1.1 christos {
412 1.1 christos USI opval = ADDSI (pc, ((GET_H_SYS_CPUCFGR_ND ()) ? (4) : (8)));
413 1.1 christos SET_H_GPR (((UINT) 9), opval);
414 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval);
415 1.1 christos }
416 1.1 christos {
417 1.1 christos {
418 1.1 christos {
419 1.1 christos USI opval = FLD (i_disp26);
420 1.1 christos SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
421 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
422 1.1 christos }
423 1.1 christos }
424 1.1 christos if (GET_H_SYS_CPUCFGR_ND ()) {
425 1.1 christos if (1)
426 1.1 christos SEM_SKIP_INSN (current_cpu, sem_arg, vpc);
427 1.1 christos }
428 1.1 christos }
429 1.1 christos }
430 1.1 christos
431 1.1 christos SEM_BRANCH_FINI (vpc);
432 1.1 christos #undef FLD
433 1.1 christos }
434 1.1 christos NEXT (vpc);
435 1.1 christos
436 1.1 christos CASE (sem, INSN_L_JR) : /* l.jr $rB */
437 1.1 christos {
438 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
439 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
440 1.1 christos #define FLD(f) abuf->fields.sfmt_l_sll.f
441 1.1 christos int UNUSED written = 0;
442 1.1 christos IADDR UNUSED pc = abuf->addr;
443 1.1 christos SEM_BRANCH_INIT
444 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
445 1.1 christos
446 1.1 christos {
447 1.1 christos {
448 1.1 christos {
449 1.1 christos USI opval = GET_H_GPR (FLD (f_r3));
450 1.1 christos SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
451 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
452 1.1 christos }
453 1.1 christos }
454 1.1 christos if (GET_H_SYS_CPUCFGR_ND ()) {
455 1.1 christos if (1)
456 1.1 christos SEM_SKIP_INSN (current_cpu, sem_arg, vpc);
457 1.1 christos }
458 1.1 christos }
459 1.1 christos
460 1.1 christos SEM_BRANCH_FINI (vpc);
461 1.1 christos #undef FLD
462 1.1 christos }
463 1.1 christos NEXT (vpc);
464 1.1 christos
465 1.1 christos CASE (sem, INSN_L_JALR) : /* l.jalr $rB */
466 1.1 christos {
467 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
468 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
469 1.1 christos #define FLD(f) abuf->fields.sfmt_l_sll.f
470 1.1 christos int UNUSED written = 0;
471 1.1 christos IADDR UNUSED pc = abuf->addr;
472 1.1 christos SEM_BRANCH_INIT
473 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
474 1.1 christos
475 1.1 christos {
476 1.1 christos {
477 1.1 christos USI opval = ADDSI (pc, ((GET_H_SYS_CPUCFGR_ND ()) ? (4) : (8)));
478 1.1 christos SET_H_GPR (((UINT) 9), opval);
479 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval);
480 1.1 christos }
481 1.1 christos {
482 1.1 christos {
483 1.1 christos {
484 1.1 christos USI opval = GET_H_GPR (FLD (f_r3));
485 1.1 christos SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
486 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
487 1.1 christos }
488 1.1 christos }
489 1.1 christos if (GET_H_SYS_CPUCFGR_ND ()) {
490 1.1 christos if (1)
491 1.1 christos SEM_SKIP_INSN (current_cpu, sem_arg, vpc);
492 1.1 christos }
493 1.1 christos }
494 1.1 christos }
495 1.1 christos
496 1.1 christos SEM_BRANCH_FINI (vpc);
497 1.1 christos #undef FLD
498 1.1 christos }
499 1.1 christos NEXT (vpc);
500 1.1 christos
501 1.1 christos CASE (sem, INSN_L_BNF) : /* l.bnf ${disp26} */
502 1.1 christos {
503 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
504 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
505 1.1 christos #define FLD(f) abuf->fields.sfmt_l_j.f
506 1.1 christos int UNUSED written = 0;
507 1.1 christos IADDR UNUSED pc = abuf->addr;
508 1.1 christos SEM_BRANCH_INIT
509 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
510 1.1 christos
511 1.1 christos {
512 1.1 christos if (NOTSI (GET_H_SYS_SR_F ())) {
513 1.1 christos {
514 1.1 christos {
515 1.1 christos USI opval = FLD (i_disp26);
516 1.1 christos SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
517 1.1 christos written |= (1 << 4);
518 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
519 1.1 christos }
520 1.1 christos }
521 1.1 christos } else {
522 1.1 christos if (GET_H_SYS_CPUCFGR_ND ()) {
523 1.1 christos {
524 1.1 christos {
525 1.1 christos USI opval = ADDSI (pc, 4);
526 1.1 christos SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
527 1.1 christos written |= (1 << 4);
528 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
529 1.1 christos }
530 1.1 christos }
531 1.1 christos }
532 1.1 christos }
533 1.1 christos if (GET_H_SYS_CPUCFGR_ND ()) {
534 1.1 christos if (1)
535 1.1 christos SEM_SKIP_INSN (current_cpu, sem_arg, vpc);
536 1.1 christos }
537 1.1 christos }
538 1.1 christos
539 1.1 christos abuf->written = written;
540 1.1 christos SEM_BRANCH_FINI (vpc);
541 1.1 christos #undef FLD
542 1.1 christos }
543 1.1 christos NEXT (vpc);
544 1.1 christos
545 1.1 christos CASE (sem, INSN_L_BF) : /* l.bf ${disp26} */
546 1.1 christos {
547 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
548 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
549 1.1 christos #define FLD(f) abuf->fields.sfmt_l_j.f
550 1.1 christos int UNUSED written = 0;
551 1.1 christos IADDR UNUSED pc = abuf->addr;
552 1.1 christos SEM_BRANCH_INIT
553 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
554 1.1 christos
555 1.1 christos {
556 1.1 christos if (GET_H_SYS_SR_F ()) {
557 1.1 christos {
558 1.1 christos {
559 1.1 christos USI opval = FLD (i_disp26);
560 1.1 christos SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
561 1.1 christos written |= (1 << 4);
562 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
563 1.1 christos }
564 1.1 christos }
565 1.1 christos } else {
566 1.1 christos if (GET_H_SYS_CPUCFGR_ND ()) {
567 1.1 christos {
568 1.1 christos {
569 1.1 christos USI opval = ADDSI (pc, 4);
570 1.1 christos SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
571 1.1 christos written |= (1 << 4);
572 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
573 1.1 christos }
574 1.1 christos }
575 1.1 christos }
576 1.1 christos }
577 1.1 christos if (GET_H_SYS_CPUCFGR_ND ()) {
578 1.1 christos if (1)
579 1.1 christos SEM_SKIP_INSN (current_cpu, sem_arg, vpc);
580 1.1 christos }
581 1.1 christos }
582 1.1 christos
583 1.1 christos abuf->written = written;
584 1.1 christos SEM_BRANCH_FINI (vpc);
585 1.1 christos #undef FLD
586 1.1 christos }
587 1.1 christos NEXT (vpc);
588 1.1 christos
589 1.1 christos CASE (sem, INSN_L_TRAP) : /* l.trap ${uimm16} */
590 1.1 christos {
591 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
592 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
593 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
594 1.1 christos int UNUSED written = 0;
595 1.1 christos IADDR UNUSED pc = abuf->addr;
596 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
597 1.1 christos
598 1.1 christos or1k32bf_exception (current_cpu, pc, EXCEPT_TRAP);
599 1.1 christos
600 1.1 christos #undef FLD
601 1.1 christos }
602 1.1 christos NEXT (vpc);
603 1.1 christos
604 1.1 christos CASE (sem, INSN_L_SYS) : /* l.sys ${uimm16} */
605 1.1 christos {
606 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
607 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
608 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
609 1.1 christos int UNUSED written = 0;
610 1.1 christos IADDR UNUSED pc = abuf->addr;
611 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
612 1.1 christos
613 1.1 christos or1k32bf_exception (current_cpu, pc, EXCEPT_SYSCALL);
614 1.1 christos
615 1.1 christos #undef FLD
616 1.1 christos }
617 1.1 christos NEXT (vpc);
618 1.1 christos
619 1.1 christos CASE (sem, INSN_L_MSYNC) : /* l.msync */
620 1.1 christos {
621 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
622 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
623 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
624 1.1 christos int UNUSED written = 0;
625 1.1 christos IADDR UNUSED pc = abuf->addr;
626 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
627 1.1 christos
628 1.1 christos ((void) 0); /*nop*/
629 1.1 christos
630 1.1 christos #undef FLD
631 1.1 christos }
632 1.1 christos NEXT (vpc);
633 1.1 christos
634 1.1 christos CASE (sem, INSN_L_PSYNC) : /* l.psync */
635 1.1 christos {
636 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
637 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
638 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
639 1.1 christos int UNUSED written = 0;
640 1.1 christos IADDR UNUSED pc = abuf->addr;
641 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
642 1.1 christos
643 1.1 christos ((void) 0); /*nop*/
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_L_CSYNC) : /* l.csync */
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_empty.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 ((void) 0); /*nop*/
659 1.1 christos
660 1.1 christos #undef FLD
661 1.1 christos }
662 1.1 christos NEXT (vpc);
663 1.1 christos
664 1.1 christos CASE (sem, INSN_L_RFE) : /* l.rfe */
665 1.1 christos {
666 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
667 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
668 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
669 1.1 christos int UNUSED written = 0;
670 1.1 christos IADDR UNUSED pc = abuf->addr;
671 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
672 1.1 christos
673 1.1 christos or1k32bf_rfe (current_cpu);
674 1.1 christos
675 1.1 christos #undef FLD
676 1.1 christos }
677 1.1 christos NEXT (vpc);
678 1.1 christos
679 1.1 christos CASE (sem, INSN_L_NOP_IMM) : /* l.nop ${uimm16} */
680 1.1 christos {
681 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
682 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
683 1.1 christos #define FLD(f) abuf->fields.sfmt_l_mfspr.f
684 1.1 christos int UNUSED written = 0;
685 1.1 christos IADDR UNUSED pc = abuf->addr;
686 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
687 1.1 christos
688 1.1 christos or1k32bf_nop (current_cpu, ZEXTSISI (FLD (f_uimm16)));
689 1.1 christos
690 1.1 christos #undef FLD
691 1.1 christos }
692 1.1 christos NEXT (vpc);
693 1.1 christos
694 1.1 christos CASE (sem, INSN_L_MOVHI) : /* l.movhi $rD,$uimm16 */
695 1.1 christos {
696 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
697 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
698 1.1 christos #define FLD(f) abuf->fields.sfmt_l_mfspr.f
699 1.1 christos int UNUSED written = 0;
700 1.1 christos IADDR UNUSED pc = abuf->addr;
701 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
702 1.1 christos
703 1.1 christos {
704 1.1 christos USI opval = SLLSI (ZEXTSISI (FLD (f_uimm16)), 16);
705 1.1 christos SET_H_GPR (FLD (f_r1), opval);
706 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval);
707 1.1 christos }
708 1.1 christos
709 1.1 christos #undef FLD
710 1.1 christos }
711 1.1 christos NEXT (vpc);
712 1.1 christos
713 1.1 christos CASE (sem, INSN_L_MACRC) : /* l.macrc $rD */
714 1.1 christos {
715 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
716 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
717 1.1 christos #define FLD(f) abuf->fields.sfmt_l_adrp.f
718 1.1 christos int UNUSED written = 0;
719 1.1 christos IADDR UNUSED pc = abuf->addr;
720 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
721 1.1 christos
722 1.1 christos {
723 1.1 christos {
724 1.1 christos USI opval = GET_H_MAC_MACLO ();
725 1.1 christos SET_H_GPR (FLD (f_r1), opval);
726 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval);
727 1.1 christos }
728 1.1 christos {
729 1.1 christos USI opval = 0;
730 1.1 christos SET_H_MAC_MACLO (opval);
731 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "mac-maclo", 'x', opval);
732 1.1 christos }
733 1.1 christos {
734 1.1 christos USI opval = 0;
735 1.1 christos SET_H_MAC_MACHI (opval);
736 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "mac-machi", 'x', opval);
737 1.1 christos }
738 1.1 christos }
739 1.1 christos
740 1.1 christos #undef FLD
741 1.1 christos }
742 1.1 christos NEXT (vpc);
743 1.1 christos
744 1.1 christos CASE (sem, INSN_L_MFSPR) : /* l.mfspr $rD,$rA,${uimm16} */
745 1.1 christos {
746 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
747 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
748 1.1 christos #define FLD(f) abuf->fields.sfmt_l_mfspr.f
749 1.1 christos int UNUSED written = 0;
750 1.1 christos IADDR UNUSED pc = abuf->addr;
751 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
752 1.1 christos
753 1.1 christos {
754 1.1 christos USI opval = or1k32bf_mfspr (current_cpu, ORSI (GET_H_GPR (FLD (f_r2)), ZEXTSISI (FLD (f_uimm16))));
755 1.1 christos SET_H_GPR (FLD (f_r1), opval);
756 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval);
757 1.1 christos }
758 1.1 christos
759 1.1 christos #undef FLD
760 1.1 christos }
761 1.1 christos NEXT (vpc);
762 1.1 christos
763 1.1 christos CASE (sem, INSN_L_MTSPR) : /* l.mtspr $rA,$rB,${uimm16-split} */
764 1.1 christos {
765 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
766 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
767 1.1 christos #define FLD(f) abuf->fields.sfmt_l_mtspr.f
768 1.1 christos int UNUSED written = 0;
769 1.1 christos IADDR UNUSED pc = abuf->addr;
770 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
771 1.1 christos
772 1.1 christos or1k32bf_mtspr (current_cpu, ORSI (GET_H_GPR (FLD (f_r2)), ZEXTSISI (FLD (f_uimm16_split))), GET_H_GPR (FLD (f_r3)));
773 1.1 christos
774 1.1 christos #undef FLD
775 1.1 christos }
776 1.1 christos NEXT (vpc);
777 1.1 christos
778 1.1 christos CASE (sem, INSN_L_LWZ) : /* l.lwz $rD,${simm16}($rA) */
779 1.1 christos {
780 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
781 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
782 1.1 christos #define FLD(f) abuf->fields.sfmt_l_lwz.f
783 1.1 christos int UNUSED written = 0;
784 1.1 christos IADDR UNUSED pc = abuf->addr;
785 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
786 1.1 christos
787 1.1 christos {
788 1.1 christos USI opval = ZEXTSISI (GETMEMUSI (current_cpu, pc, or1k32bf_make_load_store_addr (current_cpu, GET_H_GPR (FLD (f_r2)), EXTSISI (FLD (f_simm16)), 4)));
789 1.1 christos SET_H_GPR (FLD (f_r1), opval);
790 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval);
791 1.1 christos }
792 1.1 christos
793 1.1 christos #undef FLD
794 1.1 christos }
795 1.1 christos NEXT (vpc);
796 1.1 christos
797 1.1 christos CASE (sem, INSN_L_LWS) : /* l.lws $rD,${simm16}($rA) */
798 1.1 christos {
799 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
800 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
801 1.1 christos #define FLD(f) abuf->fields.sfmt_l_lwz.f
802 1.1 christos int UNUSED written = 0;
803 1.1 christos IADDR UNUSED pc = abuf->addr;
804 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
805 1.1 christos
806 1.1 christos {
807 1.1 christos SI opval = EXTSISI (GETMEMSI (current_cpu, pc, or1k32bf_make_load_store_addr (current_cpu, GET_H_GPR (FLD (f_r2)), EXTSISI (FLD (f_simm16)), 4)));
808 1.1 christos SET_H_GPR (FLD (f_r1), opval);
809 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval);
810 1.1 christos }
811 1.1 christos
812 1.1 christos #undef FLD
813 1.1 christos }
814 1.1 christos NEXT (vpc);
815 1.1 christos
816 1.1 christos CASE (sem, INSN_L_LWA) : /* l.lwa $rD,${simm16}($rA) */
817 1.1 christos {
818 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
819 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
820 1.1 christos #define FLD(f) abuf->fields.sfmt_l_lwz.f
821 1.1 christos int UNUSED written = 0;
822 1.1 christos IADDR UNUSED pc = abuf->addr;
823 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
824 1.1 christos
825 1.1 christos {
826 1.1 christos {
827 1.1 christos USI opval = ZEXTSISI (GETMEMUSI (current_cpu, pc, or1k32bf_make_load_store_addr (current_cpu, GET_H_GPR (FLD (f_r2)), EXTSISI (FLD (f_simm16)), 4)));
828 1.1 christos SET_H_GPR (FLD (f_r1), opval);
829 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval);
830 1.1 christos }
831 1.1 christos {
832 1.1 christos BI opval = 1;
833 1.1 christos CPU (h_atomic_reserve) = opval;
834 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "atomic-reserve", 'x', opval);
835 1.1 christos }
836 1.1 christos {
837 1.1 christos SI opval = or1k32bf_make_load_store_addr (current_cpu, GET_H_GPR (FLD (f_r2)), EXTSISI (FLD (f_simm16)), 4);
838 1.1 christos CPU (h_atomic_address) = opval;
839 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "atomic-address", 'x', opval);
840 1.1 christos }
841 1.1 christos }
842 1.1 christos
843 1.1 christos #undef FLD
844 1.1 christos }
845 1.1 christos NEXT (vpc);
846 1.1 christos
847 1.1 christos CASE (sem, INSN_L_LBZ) : /* l.lbz $rD,${simm16}($rA) */
848 1.1 christos {
849 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
850 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
851 1.1 christos #define FLD(f) abuf->fields.sfmt_l_lwz.f
852 1.1 christos int UNUSED written = 0;
853 1.1 christos IADDR UNUSED pc = abuf->addr;
854 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
855 1.1 christos
856 1.1 christos {
857 1.1 christos USI opval = ZEXTQISI (GETMEMUQI (current_cpu, pc, or1k32bf_make_load_store_addr (current_cpu, GET_H_GPR (FLD (f_r2)), EXTSISI (FLD (f_simm16)), 1)));
858 1.1 christos SET_H_GPR (FLD (f_r1), opval);
859 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval);
860 1.1 christos }
861 1.1 christos
862 1.1 christos #undef FLD
863 1.1 christos }
864 1.1 christos NEXT (vpc);
865 1.1 christos
866 1.1 christos CASE (sem, INSN_L_LBS) : /* l.lbs $rD,${simm16}($rA) */
867 1.1 christos {
868 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
869 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
870 1.1 christos #define FLD(f) abuf->fields.sfmt_l_lwz.f
871 1.1 christos int UNUSED written = 0;
872 1.1 christos IADDR UNUSED pc = abuf->addr;
873 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
874 1.1 christos
875 1.1 christos {
876 1.1 christos SI opval = EXTQISI (GETMEMQI (current_cpu, pc, or1k32bf_make_load_store_addr (current_cpu, GET_H_GPR (FLD (f_r2)), EXTSISI (FLD (f_simm16)), 1)));
877 1.1 christos SET_H_GPR (FLD (f_r1), opval);
878 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval);
879 1.1 christos }
880 1.1 christos
881 1.1 christos #undef FLD
882 1.1 christos }
883 1.1 christos NEXT (vpc);
884 1.1 christos
885 1.1 christos CASE (sem, INSN_L_LHZ) : /* l.lhz $rD,${simm16}($rA) */
886 1.1 christos {
887 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
888 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
889 1.1 christos #define FLD(f) abuf->fields.sfmt_l_lwz.f
890 1.1 christos int UNUSED written = 0;
891 1.1 christos IADDR UNUSED pc = abuf->addr;
892 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
893 1.1 christos
894 1.1 christos {
895 1.1 christos USI opval = ZEXTHISI (GETMEMUHI (current_cpu, pc, or1k32bf_make_load_store_addr (current_cpu, GET_H_GPR (FLD (f_r2)), EXTSISI (FLD (f_simm16)), 2)));
896 1.1 christos SET_H_GPR (FLD (f_r1), opval);
897 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval);
898 1.1 christos }
899 1.1 christos
900 1.1 christos #undef FLD
901 1.1 christos }
902 1.1 christos NEXT (vpc);
903 1.1 christos
904 1.1 christos CASE (sem, INSN_L_LHS) : /* l.lhs $rD,${simm16}($rA) */
905 1.1 christos {
906 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
907 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
908 1.1 christos #define FLD(f) abuf->fields.sfmt_l_lwz.f
909 1.1 christos int UNUSED written = 0;
910 1.1 christos IADDR UNUSED pc = abuf->addr;
911 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
912 1.1 christos
913 1.1 christos {
914 1.1 christos SI opval = EXTHISI (GETMEMHI (current_cpu, pc, or1k32bf_make_load_store_addr (current_cpu, GET_H_GPR (FLD (f_r2)), EXTSISI (FLD (f_simm16)), 2)));
915 1.1 christos SET_H_GPR (FLD (f_r1), opval);
916 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval);
917 1.1 christos }
918 1.1 christos
919 1.1 christos #undef FLD
920 1.1 christos }
921 1.1 christos NEXT (vpc);
922 1.1 christos
923 1.1 christos CASE (sem, INSN_L_SW) : /* l.sw ${simm16-split}($rA),$rB */
924 1.1 christos {
925 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
926 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
927 1.1 christos #define FLD(f) abuf->fields.sfmt_l_sw.f
928 1.1 christos int UNUSED written = 0;
929 1.1 christos IADDR UNUSED pc = abuf->addr;
930 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
931 1.1 christos
932 1.1 christos {
933 1.1 christos SI tmp_addr;
934 1.1 christos tmp_addr = or1k32bf_make_load_store_addr (current_cpu, GET_H_GPR (FLD (f_r2)), EXTSISI (FLD (f_simm16_split)), 4);
935 1.1 christos {
936 1.1 christos USI opval = TRUNCSISI (GET_H_GPR (FLD (f_r3)));
937 1.1 christos SETMEMUSI (current_cpu, pc, tmp_addr, opval);
938 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
939 1.1 christos }
940 1.1 christos if (EQSI (ANDSI (tmp_addr, 268435452), CPU (h_atomic_address))) {
941 1.1 christos {
942 1.1 christos BI opval = 0;
943 1.1 christos CPU (h_atomic_reserve) = opval;
944 1.1 christos written |= (1 << 4);
945 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "atomic-reserve", 'x', opval);
946 1.1 christos }
947 1.1 christos }
948 1.1 christos }
949 1.1 christos
950 1.1 christos abuf->written = written;
951 1.1 christos #undef FLD
952 1.1 christos }
953 1.1 christos NEXT (vpc);
954 1.1 christos
955 1.1 christos CASE (sem, INSN_L_SB) : /* l.sb ${simm16-split}($rA),$rB */
956 1.1 christos {
957 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
958 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
959 1.1 christos #define FLD(f) abuf->fields.sfmt_l_sw.f
960 1.1 christos int UNUSED written = 0;
961 1.1 christos IADDR UNUSED pc = abuf->addr;
962 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
963 1.1 christos
964 1.1 christos {
965 1.1 christos SI tmp_addr;
966 1.1 christos tmp_addr = or1k32bf_make_load_store_addr (current_cpu, GET_H_GPR (FLD (f_r2)), EXTSISI (FLD (f_simm16_split)), 1);
967 1.1 christos {
968 1.1 christos UQI opval = TRUNCSIQI (GET_H_GPR (FLD (f_r3)));
969 1.1 christos SETMEMUQI (current_cpu, pc, tmp_addr, opval);
970 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
971 1.1 christos }
972 1.1 christos if (EQSI (ANDSI (tmp_addr, 268435452), CPU (h_atomic_address))) {
973 1.1 christos {
974 1.1 christos BI opval = 0;
975 1.1 christos CPU (h_atomic_reserve) = opval;
976 1.1 christos written |= (1 << 4);
977 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "atomic-reserve", 'x', opval);
978 1.1 christos }
979 1.1 christos }
980 1.1 christos }
981 1.1 christos
982 1.1 christos abuf->written = written;
983 1.1 christos #undef FLD
984 1.1 christos }
985 1.1 christos NEXT (vpc);
986 1.1 christos
987 1.1 christos CASE (sem, INSN_L_SH) : /* l.sh ${simm16-split}($rA),$rB */
988 1.1 christos {
989 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
990 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
991 1.1 christos #define FLD(f) abuf->fields.sfmt_l_sw.f
992 1.1 christos int UNUSED written = 0;
993 1.1 christos IADDR UNUSED pc = abuf->addr;
994 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
995 1.1 christos
996 1.1 christos {
997 1.1 christos SI tmp_addr;
998 1.1 christos tmp_addr = or1k32bf_make_load_store_addr (current_cpu, GET_H_GPR (FLD (f_r2)), EXTSISI (FLD (f_simm16_split)), 2);
999 1.1 christos {
1000 1.1 christos UHI opval = TRUNCSIHI (GET_H_GPR (FLD (f_r3)));
1001 1.1 christos SETMEMUHI (current_cpu, pc, tmp_addr, opval);
1002 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
1003 1.1 christos }
1004 1.1 christos if (EQSI (ANDSI (tmp_addr, 268435452), CPU (h_atomic_address))) {
1005 1.1 christos {
1006 1.1 christos BI opval = 0;
1007 1.1 christos CPU (h_atomic_reserve) = opval;
1008 1.1 christos written |= (1 << 4);
1009 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "atomic-reserve", 'x', opval);
1010 1.1 christos }
1011 1.1 christos }
1012 1.1 christos }
1013 1.1 christos
1014 1.1 christos abuf->written = written;
1015 1.1 christos #undef FLD
1016 1.1 christos }
1017 1.1 christos NEXT (vpc);
1018 1.1 christos
1019 1.1 christos CASE (sem, INSN_L_SWA) : /* l.swa ${simm16-split}($rA),$rB */
1020 1.1 christos {
1021 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1022 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1023 1.1 christos #define FLD(f) abuf->fields.sfmt_l_sw.f
1024 1.1 christos int UNUSED written = 0;
1025 1.1 christos IADDR UNUSED pc = abuf->addr;
1026 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1027 1.1 christos
1028 1.1 christos {
1029 1.1 christos SI tmp_addr;
1030 1.1 christos BI tmp_flag;
1031 1.1 christos tmp_addr = or1k32bf_make_load_store_addr (current_cpu, GET_H_GPR (FLD (f_r2)), EXTSISI (FLD (f_simm16_split)), 4);
1032 1.1 christos {
1033 1.1 christos USI opval = ANDBI (CPU (h_atomic_reserve), EQSI (tmp_addr, CPU (h_atomic_address)));
1034 1.1 christos SET_H_SYS_SR_F (opval);
1035 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-f", 'x', opval);
1036 1.1 christos }
1037 1.1 christos if (GET_H_SYS_SR_F ()) {
1038 1.1 christos {
1039 1.1 christos USI opval = TRUNCSISI (GET_H_GPR (FLD (f_r3)));
1040 1.1 christos SETMEMUSI (current_cpu, pc, tmp_addr, opval);
1041 1.1 christos written |= (1 << 7);
1042 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
1043 1.1 christos }
1044 1.1 christos }
1045 1.1 christos {
1046 1.1 christos BI opval = 0;
1047 1.1 christos CPU (h_atomic_reserve) = opval;
1048 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "atomic-reserve", 'x', opval);
1049 1.1 christos }
1050 1.1 christos }
1051 1.1 christos
1052 1.1 christos abuf->written = written;
1053 1.1 christos #undef FLD
1054 1.1 christos }
1055 1.1 christos NEXT (vpc);
1056 1.1 christos
1057 1.1 christos CASE (sem, INSN_L_SLL) : /* l.sll $rD,$rA,$rB */
1058 1.1 christos {
1059 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1060 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1061 1.1 christos #define FLD(f) abuf->fields.sfmt_l_sll.f
1062 1.1 christos int UNUSED written = 0;
1063 1.1 christos IADDR UNUSED pc = abuf->addr;
1064 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1065 1.1 christos
1066 1.1 christos {
1067 1.1 christos USI opval = SLLSI (GET_H_GPR (FLD (f_r2)), GET_H_GPR (FLD (f_r3)));
1068 1.1 christos SET_H_GPR (FLD (f_r1), opval);
1069 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval);
1070 1.1 christos }
1071 1.1 christos
1072 1.1 christos #undef FLD
1073 1.1 christos }
1074 1.1 christos NEXT (vpc);
1075 1.1 christos
1076 1.1 christos CASE (sem, INSN_L_SLLI) : /* l.slli $rD,$rA,${uimm6} */
1077 1.1 christos {
1078 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1079 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1080 1.1 christos #define FLD(f) abuf->fields.sfmt_l_slli.f
1081 1.1 christos int UNUSED written = 0;
1082 1.1 christos IADDR UNUSED pc = abuf->addr;
1083 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1084 1.1 christos
1085 1.1 christos {
1086 1.1 christos USI opval = SLLSI (GET_H_GPR (FLD (f_r2)), FLD (f_uimm6));
1087 1.1 christos SET_H_GPR (FLD (f_r1), opval);
1088 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval);
1089 1.1 christos }
1090 1.1 christos
1091 1.1 christos #undef FLD
1092 1.1 christos }
1093 1.1 christos NEXT (vpc);
1094 1.1 christos
1095 1.1 christos CASE (sem, INSN_L_SRL) : /* l.srl $rD,$rA,$rB */
1096 1.1 christos {
1097 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1098 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1099 1.1 christos #define FLD(f) abuf->fields.sfmt_l_sll.f
1100 1.1 christos int UNUSED written = 0;
1101 1.1 christos IADDR UNUSED pc = abuf->addr;
1102 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1103 1.1 christos
1104 1.1 christos {
1105 1.1 christos USI opval = SRLSI (GET_H_GPR (FLD (f_r2)), GET_H_GPR (FLD (f_r3)));
1106 1.1 christos SET_H_GPR (FLD (f_r1), opval);
1107 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval);
1108 1.1 christos }
1109 1.1 christos
1110 1.1 christos #undef FLD
1111 1.1 christos }
1112 1.1 christos NEXT (vpc);
1113 1.1 christos
1114 1.1 christos CASE (sem, INSN_L_SRLI) : /* l.srli $rD,$rA,${uimm6} */
1115 1.1 christos {
1116 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1117 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1118 1.1 christos #define FLD(f) abuf->fields.sfmt_l_slli.f
1119 1.1 christos int UNUSED written = 0;
1120 1.1 christos IADDR UNUSED pc = abuf->addr;
1121 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1122 1.1 christos
1123 1.1 christos {
1124 1.1 christos USI opval = SRLSI (GET_H_GPR (FLD (f_r2)), FLD (f_uimm6));
1125 1.1 christos SET_H_GPR (FLD (f_r1), opval);
1126 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval);
1127 1.1 christos }
1128 1.1 christos
1129 1.1 christos #undef FLD
1130 1.1 christos }
1131 1.1 christos NEXT (vpc);
1132 1.1 christos
1133 1.1 christos CASE (sem, INSN_L_SRA) : /* l.sra $rD,$rA,$rB */
1134 1.1 christos {
1135 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1136 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1137 1.1 christos #define FLD(f) abuf->fields.sfmt_l_sll.f
1138 1.1 christos int UNUSED written = 0;
1139 1.1 christos IADDR UNUSED pc = abuf->addr;
1140 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1141 1.1 christos
1142 1.1 christos {
1143 1.1 christos USI opval = SRASI (GET_H_GPR (FLD (f_r2)), GET_H_GPR (FLD (f_r3)));
1144 1.1 christos SET_H_GPR (FLD (f_r1), opval);
1145 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval);
1146 1.1 christos }
1147 1.1 christos
1148 1.1 christos #undef FLD
1149 1.1 christos }
1150 1.1 christos NEXT (vpc);
1151 1.1 christos
1152 1.1 christos CASE (sem, INSN_L_SRAI) : /* l.srai $rD,$rA,${uimm6} */
1153 1.1 christos {
1154 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1155 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1156 1.1 christos #define FLD(f) abuf->fields.sfmt_l_slli.f
1157 1.1 christos int UNUSED written = 0;
1158 1.1 christos IADDR UNUSED pc = abuf->addr;
1159 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1160 1.1 christos
1161 1.1 christos {
1162 1.1 christos USI opval = SRASI (GET_H_GPR (FLD (f_r2)), FLD (f_uimm6));
1163 1.1 christos SET_H_GPR (FLD (f_r1), opval);
1164 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval);
1165 1.1 christos }
1166 1.1 christos
1167 1.1 christos #undef FLD
1168 1.1 christos }
1169 1.1 christos NEXT (vpc);
1170 1.1 christos
1171 1.1 christos CASE (sem, INSN_L_ROR) : /* l.ror $rD,$rA,$rB */
1172 1.1 christos {
1173 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1174 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1175 1.1 christos #define FLD(f) abuf->fields.sfmt_l_sll.f
1176 1.1 christos int UNUSED written = 0;
1177 1.1 christos IADDR UNUSED pc = abuf->addr;
1178 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1179 1.1 christos
1180 1.1 christos {
1181 1.1 christos USI opval = RORSI (GET_H_GPR (FLD (f_r2)), GET_H_GPR (FLD (f_r3)));
1182 1.1 christos SET_H_GPR (FLD (f_r1), opval);
1183 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval);
1184 1.1 christos }
1185 1.1 christos
1186 1.1 christos #undef FLD
1187 1.1 christos }
1188 1.1 christos NEXT (vpc);
1189 1.1 christos
1190 1.1 christos CASE (sem, INSN_L_RORI) : /* l.rori $rD,$rA,${uimm6} */
1191 1.1 christos {
1192 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1193 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1194 1.1 christos #define FLD(f) abuf->fields.sfmt_l_slli.f
1195 1.1 christos int UNUSED written = 0;
1196 1.1 christos IADDR UNUSED pc = abuf->addr;
1197 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1198 1.1 christos
1199 1.1 christos {
1200 1.1 christos USI opval = RORSI (GET_H_GPR (FLD (f_r2)), FLD (f_uimm6));
1201 1.1 christos SET_H_GPR (FLD (f_r1), opval);
1202 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval);
1203 1.1 christos }
1204 1.1 christos
1205 1.1 christos #undef FLD
1206 1.1 christos }
1207 1.1 christos NEXT (vpc);
1208 1.1 christos
1209 1.1 christos CASE (sem, INSN_L_AND) : /* l.and $rD,$rA,$rB */
1210 1.1 christos {
1211 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1212 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1213 1.1 christos #define FLD(f) abuf->fields.sfmt_l_sll.f
1214 1.1 christos int UNUSED written = 0;
1215 1.1 christos IADDR UNUSED pc = abuf->addr;
1216 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1217 1.1 christos
1218 1.1 christos {
1219 1.1 christos USI opval = ANDSI (GET_H_GPR (FLD (f_r2)), GET_H_GPR (FLD (f_r3)));
1220 1.1 christos SET_H_GPR (FLD (f_r1), opval);
1221 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval);
1222 1.1 christos }
1223 1.1 christos
1224 1.1 christos #undef FLD
1225 1.1 christos }
1226 1.1 christos NEXT (vpc);
1227 1.1 christos
1228 1.1 christos CASE (sem, INSN_L_OR) : /* l.or $rD,$rA,$rB */
1229 1.1 christos {
1230 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1231 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1232 1.1 christos #define FLD(f) abuf->fields.sfmt_l_sll.f
1233 1.1 christos int UNUSED written = 0;
1234 1.1 christos IADDR UNUSED pc = abuf->addr;
1235 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1236 1.1 christos
1237 1.1 christos {
1238 1.1 christos USI opval = ORSI (GET_H_GPR (FLD (f_r2)), GET_H_GPR (FLD (f_r3)));
1239 1.1 christos SET_H_GPR (FLD (f_r1), opval);
1240 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval);
1241 1.1 christos }
1242 1.1 christos
1243 1.1 christos #undef FLD
1244 1.1 christos }
1245 1.1 christos NEXT (vpc);
1246 1.1 christos
1247 1.1 christos CASE (sem, INSN_L_XOR) : /* l.xor $rD,$rA,$rB */
1248 1.1 christos {
1249 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1250 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1251 1.1 christos #define FLD(f) abuf->fields.sfmt_l_sll.f
1252 1.1 christos int UNUSED written = 0;
1253 1.1 christos IADDR UNUSED pc = abuf->addr;
1254 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1255 1.1 christos
1256 1.1 christos {
1257 1.1 christos USI opval = XORSI (GET_H_GPR (FLD (f_r2)), GET_H_GPR (FLD (f_r3)));
1258 1.1 christos SET_H_GPR (FLD (f_r1), opval);
1259 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval);
1260 1.1 christos }
1261 1.1 christos
1262 1.1 christos #undef FLD
1263 1.1 christos }
1264 1.1 christos NEXT (vpc);
1265 1.1 christos
1266 1.1 christos CASE (sem, INSN_L_ADD) : /* l.add $rD,$rA,$rB */
1267 1.1 christos {
1268 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1269 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1270 1.1 christos #define FLD(f) abuf->fields.sfmt_l_sll.f
1271 1.1 christos int UNUSED written = 0;
1272 1.1 christos IADDR UNUSED pc = abuf->addr;
1273 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1274 1.1 christos
1275 1.1 christos {
1276 1.1 christos {
1277 1.1 christos {
1278 1.1 christos BI opval = ADDCFSI (GET_H_GPR (FLD (f_r2)), GET_H_GPR (FLD (f_r3)), 0);
1279 1.1 christos SET_H_SYS_SR_CY (opval);
1280 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-cy", 'x', opval);
1281 1.1 christos }
1282 1.1 christos {
1283 1.1 christos BI opval = ADDOFSI (GET_H_GPR (FLD (f_r2)), GET_H_GPR (FLD (f_r3)), 0);
1284 1.1 christos SET_H_SYS_SR_OV (opval);
1285 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-ov", 'x', opval);
1286 1.1 christos }
1287 1.1 christos {
1288 1.1 christos USI opval = ADDSI (GET_H_GPR (FLD (f_r2)), GET_H_GPR (FLD (f_r3)));
1289 1.1 christos SET_H_GPR (FLD (f_r1), opval);
1290 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval);
1291 1.1 christos }
1292 1.1 christos }
1293 1.1 christos if (ANDIF (GET_H_SYS_SR_OV (), GET_H_SYS_SR_OVE ())) {
1294 1.1 christos or1k32bf_exception (current_cpu, pc, EXCEPT_RANGE);
1295 1.1 christos }
1296 1.1 christos }
1297 1.1 christos
1298 1.1 christos #undef FLD
1299 1.1 christos }
1300 1.1 christos NEXT (vpc);
1301 1.1 christos
1302 1.1 christos CASE (sem, INSN_L_SUB) : /* l.sub $rD,$rA,$rB */
1303 1.1 christos {
1304 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1305 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1306 1.1 christos #define FLD(f) abuf->fields.sfmt_l_sll.f
1307 1.1 christos int UNUSED written = 0;
1308 1.1 christos IADDR UNUSED pc = abuf->addr;
1309 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1310 1.1 christos
1311 1.1 christos {
1312 1.1 christos {
1313 1.1 christos {
1314 1.1 christos BI opval = SUBCFSI (GET_H_GPR (FLD (f_r2)), GET_H_GPR (FLD (f_r3)), 0);
1315 1.1 christos SET_H_SYS_SR_CY (opval);
1316 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-cy", 'x', opval);
1317 1.1 christos }
1318 1.1 christos {
1319 1.1 christos BI opval = SUBOFSI (GET_H_GPR (FLD (f_r2)), GET_H_GPR (FLD (f_r3)), 0);
1320 1.1 christos SET_H_SYS_SR_OV (opval);
1321 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-ov", 'x', opval);
1322 1.1 christos }
1323 1.1 christos {
1324 1.1 christos USI opval = SUBSI (GET_H_GPR (FLD (f_r2)), GET_H_GPR (FLD (f_r3)));
1325 1.1 christos SET_H_GPR (FLD (f_r1), opval);
1326 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval);
1327 1.1 christos }
1328 1.1 christos }
1329 1.1 christos if (ANDIF (GET_H_SYS_SR_OV (), GET_H_SYS_SR_OVE ())) {
1330 1.1 christos or1k32bf_exception (current_cpu, pc, EXCEPT_RANGE);
1331 1.1 christos }
1332 1.1 christos }
1333 1.1 christos
1334 1.1 christos #undef FLD
1335 1.1 christos }
1336 1.1 christos NEXT (vpc);
1337 1.1 christos
1338 1.1 christos CASE (sem, INSN_L_ADDC) : /* l.addc $rD,$rA,$rB */
1339 1.1 christos {
1340 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1341 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1342 1.1 christos #define FLD(f) abuf->fields.sfmt_l_sll.f
1343 1.1 christos int UNUSED written = 0;
1344 1.1 christos IADDR UNUSED pc = abuf->addr;
1345 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1346 1.1 christos
1347 1.1 christos {
1348 1.1 christos {
1349 1.1 christos BI tmp_tmp_sys_sr_cy;
1350 1.1 christos tmp_tmp_sys_sr_cy = GET_H_SYS_SR_CY ();
1351 1.1 christos {
1352 1.1 christos BI opval = ADDCFSI (GET_H_GPR (FLD (f_r2)), GET_H_GPR (FLD (f_r3)), tmp_tmp_sys_sr_cy);
1353 1.1 christos SET_H_SYS_SR_CY (opval);
1354 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-cy", 'x', opval);
1355 1.1 christos }
1356 1.1 christos {
1357 1.1 christos BI opval = ADDOFSI (GET_H_GPR (FLD (f_r2)), GET_H_GPR (FLD (f_r3)), tmp_tmp_sys_sr_cy);
1358 1.1 christos SET_H_SYS_SR_OV (opval);
1359 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-ov", 'x', opval);
1360 1.1 christos }
1361 1.1 christos {
1362 1.1 christos USI opval = ADDCSI (GET_H_GPR (FLD (f_r2)), GET_H_GPR (FLD (f_r3)), tmp_tmp_sys_sr_cy);
1363 1.1 christos SET_H_GPR (FLD (f_r1), opval);
1364 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval);
1365 1.1 christos }
1366 1.1 christos }
1367 1.1 christos if (ANDIF (GET_H_SYS_SR_OV (), GET_H_SYS_SR_OVE ())) {
1368 1.1 christos or1k32bf_exception (current_cpu, pc, EXCEPT_RANGE);
1369 1.1 christos }
1370 1.1 christos }
1371 1.1 christos
1372 1.1 christos #undef FLD
1373 1.1 christos }
1374 1.1 christos NEXT (vpc);
1375 1.1 christos
1376 1.1 christos CASE (sem, INSN_L_MUL) : /* l.mul $rD,$rA,$rB */
1377 1.1 christos {
1378 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1379 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1380 1.1 christos #define FLD(f) abuf->fields.sfmt_l_sll.f
1381 1.1 christos int UNUSED written = 0;
1382 1.1 christos IADDR UNUSED pc = abuf->addr;
1383 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1384 1.1 christos
1385 1.1 christos {
1386 1.1 christos {
1387 1.1 christos {
1388 1.1 christos BI opval = MUL2OFSI (GET_H_GPR (FLD (f_r2)), GET_H_GPR (FLD (f_r3)));
1389 1.1 christos SET_H_SYS_SR_OV (opval);
1390 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-ov", 'x', opval);
1391 1.1 christos }
1392 1.1 christos {
1393 1.1 christos USI opval = MULSI (GET_H_GPR (FLD (f_r2)), GET_H_GPR (FLD (f_r3)));
1394 1.1 christos SET_H_GPR (FLD (f_r1), opval);
1395 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval);
1396 1.1 christos }
1397 1.1 christos }
1398 1.1 christos if (ANDIF (GET_H_SYS_SR_OV (), GET_H_SYS_SR_OVE ())) {
1399 1.1 christos or1k32bf_exception (current_cpu, pc, EXCEPT_RANGE);
1400 1.1 christos }
1401 1.1 christos }
1402 1.1 christos
1403 1.1 christos #undef FLD
1404 1.1 christos }
1405 1.1 christos NEXT (vpc);
1406 1.1 christos
1407 1.1 christos CASE (sem, INSN_L_MULD) : /* l.muld $rA,$rB */
1408 1.1 christos {
1409 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1410 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1411 1.1 christos #define FLD(f) abuf->fields.sfmt_l_sll.f
1412 1.1 christos int UNUSED written = 0;
1413 1.1 christos IADDR UNUSED pc = abuf->addr;
1414 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1415 1.1 christos
1416 1.1 christos {
1417 1.1 christos DI tmp_result;
1418 1.1 christos tmp_result = MULDI (EXTSIDI (GET_H_GPR (FLD (f_r2))), EXTSIDI (GET_H_GPR (FLD (f_r3))));
1419 1.1 christos {
1420 1.1 christos SI opval = SUBWORDDISI (tmp_result, 0);
1421 1.1 christos SET_H_MAC_MACHI (opval);
1422 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "mac-machi", 'x', opval);
1423 1.1 christos }
1424 1.1 christos {
1425 1.1 christos SI opval = SUBWORDDISI (tmp_result, 1);
1426 1.1 christos SET_H_MAC_MACLO (opval);
1427 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "mac-maclo", 'x', opval);
1428 1.1 christos }
1429 1.1 christos }
1430 1.1 christos
1431 1.1 christos #undef FLD
1432 1.1 christos }
1433 1.1 christos NEXT (vpc);
1434 1.1 christos
1435 1.1 christos CASE (sem, INSN_L_MULU) : /* l.mulu $rD,$rA,$rB */
1436 1.1 christos {
1437 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1438 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1439 1.1 christos #define FLD(f) abuf->fields.sfmt_l_sll.f
1440 1.1 christos int UNUSED written = 0;
1441 1.1 christos IADDR UNUSED pc = abuf->addr;
1442 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1443 1.1 christos
1444 1.1 christos {
1445 1.1 christos {
1446 1.1 christos {
1447 1.1 christos BI opval = MUL1OFSI (GET_H_GPR (FLD (f_r2)), GET_H_GPR (FLD (f_r3)));
1448 1.1 christos SET_H_SYS_SR_CY (opval);
1449 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-cy", 'x', opval);
1450 1.1 christos }
1451 1.1 christos {
1452 1.1 christos USI opval = MULSI (GET_H_GPR (FLD (f_r2)), GET_H_GPR (FLD (f_r3)));
1453 1.1 christos SET_H_GPR (FLD (f_r1), opval);
1454 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval);
1455 1.1 christos }
1456 1.1 christos }
1457 1.1 christos if (ANDIF (GET_H_SYS_SR_CY (), GET_H_SYS_SR_OVE ())) {
1458 1.1 christos or1k32bf_exception (current_cpu, pc, EXCEPT_RANGE);
1459 1.1 christos }
1460 1.1 christos }
1461 1.1 christos
1462 1.1 christos #undef FLD
1463 1.1 christos }
1464 1.1 christos NEXT (vpc);
1465 1.1 christos
1466 1.1 christos CASE (sem, INSN_L_MULDU) : /* l.muldu $rA,$rB */
1467 1.1 christos {
1468 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1469 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1470 1.1 christos #define FLD(f) abuf->fields.sfmt_l_sll.f
1471 1.1 christos int UNUSED written = 0;
1472 1.1 christos IADDR UNUSED pc = abuf->addr;
1473 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1474 1.1 christos
1475 1.1 christos {
1476 1.1 christos DI tmp_result;
1477 1.1 christos tmp_result = MULDI (ZEXTSIDI (GET_H_GPR (FLD (f_r2))), ZEXTSIDI (GET_H_GPR (FLD (f_r3))));
1478 1.1 christos {
1479 1.1 christos SI opval = SUBWORDDISI (tmp_result, 0);
1480 1.1 christos SET_H_MAC_MACHI (opval);
1481 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "mac-machi", 'x', opval);
1482 1.1 christos }
1483 1.1 christos {
1484 1.1 christos SI opval = SUBWORDDISI (tmp_result, 1);
1485 1.1 christos SET_H_MAC_MACLO (opval);
1486 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "mac-maclo", 'x', opval);
1487 1.1 christos }
1488 1.1 christos }
1489 1.1 christos
1490 1.1 christos #undef FLD
1491 1.1 christos }
1492 1.1 christos NEXT (vpc);
1493 1.1 christos
1494 1.1 christos CASE (sem, INSN_L_DIV) : /* l.div $rD,$rA,$rB */
1495 1.1 christos {
1496 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1497 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1498 1.1 christos #define FLD(f) abuf->fields.sfmt_l_sll.f
1499 1.1 christos int UNUSED written = 0;
1500 1.1 christos IADDR UNUSED pc = abuf->addr;
1501 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1502 1.1 christos
1503 1.1 christos if (NESI (GET_H_GPR (FLD (f_r3)), 0)) {
1504 1.1 christos {
1505 1.1 christos {
1506 1.1 christos BI opval = 0;
1507 1.1 christos SET_H_SYS_SR_OV (opval);
1508 1.1 christos written |= (1 << 5);
1509 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-ov", 'x', opval);
1510 1.1 christos }
1511 1.1 christos {
1512 1.1 christos SI opval = DIVSI (GET_H_GPR (FLD (f_r2)), GET_H_GPR (FLD (f_r3)));
1513 1.1 christos SET_H_GPR (FLD (f_r1), opval);
1514 1.1 christos written |= (1 << 4);
1515 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval);
1516 1.1 christos }
1517 1.1 christos }
1518 1.1 christos } else {
1519 1.1 christos {
1520 1.1 christos {
1521 1.1 christos BI opval = 1;
1522 1.1 christos SET_H_SYS_SR_OV (opval);
1523 1.1 christos written |= (1 << 5);
1524 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-ov", 'x', opval);
1525 1.1 christos }
1526 1.1 christos if (GET_H_SYS_SR_OVE ()) {
1527 1.1 christos or1k32bf_exception (current_cpu, pc, EXCEPT_RANGE);
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 #undef FLD
1534 1.1 christos }
1535 1.1 christos NEXT (vpc);
1536 1.1 christos
1537 1.1 christos CASE (sem, INSN_L_DIVU) : /* l.divu $rD,$rA,$rB */
1538 1.1 christos {
1539 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1540 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1541 1.1 christos #define FLD(f) abuf->fields.sfmt_l_sll.f
1542 1.1 christos int UNUSED written = 0;
1543 1.1 christos IADDR UNUSED pc = abuf->addr;
1544 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1545 1.1 christos
1546 1.1 christos if (NESI (GET_H_GPR (FLD (f_r3)), 0)) {
1547 1.1 christos {
1548 1.1 christos {
1549 1.1 christos BI opval = 0;
1550 1.1 christos SET_H_SYS_SR_CY (opval);
1551 1.1 christos written |= (1 << 5);
1552 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-cy", 'x', opval);
1553 1.1 christos }
1554 1.1 christos {
1555 1.1 christos USI opval = UDIVSI (GET_H_GPR (FLD (f_r2)), GET_H_GPR (FLD (f_r3)));
1556 1.1 christos SET_H_GPR (FLD (f_r1), opval);
1557 1.1 christos written |= (1 << 4);
1558 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval);
1559 1.1 christos }
1560 1.1 christos }
1561 1.1 christos } else {
1562 1.1 christos {
1563 1.1 christos {
1564 1.1 christos BI opval = 1;
1565 1.1 christos SET_H_SYS_SR_CY (opval);
1566 1.1 christos written |= (1 << 5);
1567 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-cy", 'x', opval);
1568 1.1 christos }
1569 1.1 christos if (GET_H_SYS_SR_OVE ()) {
1570 1.1 christos or1k32bf_exception (current_cpu, pc, EXCEPT_RANGE);
1571 1.1 christos }
1572 1.1 christos }
1573 1.1 christos }
1574 1.1 christos
1575 1.1 christos abuf->written = written;
1576 1.1 christos #undef FLD
1577 1.1 christos }
1578 1.1 christos NEXT (vpc);
1579 1.1 christos
1580 1.1 christos CASE (sem, INSN_L_FF1) : /* l.ff1 $rD,$rA */
1581 1.1 christos {
1582 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1583 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1584 1.1 christos #define FLD(f) abuf->fields.sfmt_l_slli.f
1585 1.1 christos int UNUSED written = 0;
1586 1.1 christos IADDR UNUSED pc = abuf->addr;
1587 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1588 1.1 christos
1589 1.1 christos {
1590 1.1 christos USI opval = or1k32bf_ff1 (current_cpu, GET_H_GPR (FLD (f_r2)));
1591 1.1 christos SET_H_GPR (FLD (f_r1), opval);
1592 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval);
1593 1.1 christos }
1594 1.1 christos
1595 1.1 christos #undef FLD
1596 1.1 christos }
1597 1.1 christos NEXT (vpc);
1598 1.1 christos
1599 1.1 christos CASE (sem, INSN_L_FL1) : /* l.fl1 $rD,$rA */
1600 1.1 christos {
1601 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1602 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1603 1.1 christos #define FLD(f) abuf->fields.sfmt_l_slli.f
1604 1.1 christos int UNUSED written = 0;
1605 1.1 christos IADDR UNUSED pc = abuf->addr;
1606 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1607 1.1 christos
1608 1.1 christos {
1609 1.1 christos USI opval = or1k32bf_fl1 (current_cpu, GET_H_GPR (FLD (f_r2)));
1610 1.1 christos SET_H_GPR (FLD (f_r1), opval);
1611 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval);
1612 1.1 christos }
1613 1.1 christos
1614 1.1 christos #undef FLD
1615 1.1 christos }
1616 1.1 christos NEXT (vpc);
1617 1.1 christos
1618 1.1 christos CASE (sem, INSN_L_ANDI) : /* l.andi $rD,$rA,$uimm16 */
1619 1.1 christos {
1620 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1621 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1622 1.1 christos #define FLD(f) abuf->fields.sfmt_l_mfspr.f
1623 1.1 christos int UNUSED written = 0;
1624 1.1 christos IADDR UNUSED pc = abuf->addr;
1625 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1626 1.1 christos
1627 1.1 christos {
1628 1.1 christos USI opval = ANDSI (GET_H_GPR (FLD (f_r2)), ZEXTSISI (FLD (f_uimm16)));
1629 1.1 christos SET_H_GPR (FLD (f_r1), opval);
1630 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval);
1631 1.1 christos }
1632 1.1 christos
1633 1.1 christos #undef FLD
1634 1.1 christos }
1635 1.1 christos NEXT (vpc);
1636 1.1 christos
1637 1.1 christos CASE (sem, INSN_L_ORI) : /* l.ori $rD,$rA,$uimm16 */
1638 1.1 christos {
1639 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1640 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1641 1.1 christos #define FLD(f) abuf->fields.sfmt_l_mfspr.f
1642 1.1 christos int UNUSED written = 0;
1643 1.1 christos IADDR UNUSED pc = abuf->addr;
1644 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1645 1.1 christos
1646 1.1 christos {
1647 1.1 christos USI opval = ORSI (GET_H_GPR (FLD (f_r2)), ZEXTSISI (FLD (f_uimm16)));
1648 1.1 christos SET_H_GPR (FLD (f_r1), opval);
1649 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval);
1650 1.1 christos }
1651 1.1 christos
1652 1.1 christos #undef FLD
1653 1.1 christos }
1654 1.1 christos NEXT (vpc);
1655 1.1 christos
1656 1.1 christos CASE (sem, INSN_L_XORI) : /* l.xori $rD,$rA,$simm16 */
1657 1.1 christos {
1658 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1659 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1660 1.1 christos #define FLD(f) abuf->fields.sfmt_l_lwz.f
1661 1.1 christos int UNUSED written = 0;
1662 1.1 christos IADDR UNUSED pc = abuf->addr;
1663 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1664 1.1 christos
1665 1.1 christos {
1666 1.1 christos USI opval = XORSI (GET_H_GPR (FLD (f_r2)), EXTSISI (FLD (f_simm16)));
1667 1.1 christos SET_H_GPR (FLD (f_r1), opval);
1668 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval);
1669 1.1 christos }
1670 1.1 christos
1671 1.1 christos #undef FLD
1672 1.1 christos }
1673 1.1 christos NEXT (vpc);
1674 1.1 christos
1675 1.1 christos CASE (sem, INSN_L_ADDI) : /* l.addi $rD,$rA,$simm16 */
1676 1.1 christos {
1677 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1678 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1679 1.1 christos #define FLD(f) abuf->fields.sfmt_l_lwz.f
1680 1.1 christos int UNUSED written = 0;
1681 1.1 christos IADDR UNUSED pc = abuf->addr;
1682 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1683 1.1 christos
1684 1.1 christos {
1685 1.1 christos {
1686 1.1 christos {
1687 1.1 christos BI opval = ADDCFSI (GET_H_GPR (FLD (f_r2)), EXTSISI (FLD (f_simm16)), 0);
1688 1.1 christos SET_H_SYS_SR_CY (opval);
1689 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-cy", 'x', opval);
1690 1.1 christos }
1691 1.1 christos {
1692 1.1 christos BI opval = ADDOFSI (GET_H_GPR (FLD (f_r2)), EXTSISI (FLD (f_simm16)), 0);
1693 1.1 christos SET_H_SYS_SR_OV (opval);
1694 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-ov", 'x', opval);
1695 1.1 christos }
1696 1.1 christos {
1697 1.1 christos USI opval = ADDSI (GET_H_GPR (FLD (f_r2)), EXTSISI (FLD (f_simm16)));
1698 1.1 christos SET_H_GPR (FLD (f_r1), opval);
1699 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval);
1700 1.1 christos }
1701 1.1 christos }
1702 1.1 christos if (ANDIF (GET_H_SYS_SR_OV (), GET_H_SYS_SR_OVE ())) {
1703 1.1 christos or1k32bf_exception (current_cpu, pc, EXCEPT_RANGE);
1704 1.1 christos }
1705 1.1 christos }
1706 1.1 christos
1707 1.1 christos #undef FLD
1708 1.1 christos }
1709 1.1 christos NEXT (vpc);
1710 1.1 christos
1711 1.1 christos CASE (sem, INSN_L_ADDIC) : /* l.addic $rD,$rA,$simm16 */
1712 1.1 christos {
1713 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1714 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1715 1.1 christos #define FLD(f) abuf->fields.sfmt_l_lwz.f
1716 1.1 christos int UNUSED written = 0;
1717 1.1 christos IADDR UNUSED pc = abuf->addr;
1718 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1719 1.1 christos
1720 1.1 christos {
1721 1.1 christos {
1722 1.1 christos BI tmp_tmp_sys_sr_cy;
1723 1.1 christos tmp_tmp_sys_sr_cy = GET_H_SYS_SR_CY ();
1724 1.1 christos {
1725 1.1 christos BI opval = ADDCFSI (GET_H_GPR (FLD (f_r2)), EXTSISI (FLD (f_simm16)), tmp_tmp_sys_sr_cy);
1726 1.1 christos SET_H_SYS_SR_CY (opval);
1727 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-cy", 'x', opval);
1728 1.1 christos }
1729 1.1 christos {
1730 1.1 christos BI opval = ADDOFSI (GET_H_GPR (FLD (f_r2)), EXTSISI (FLD (f_simm16)), tmp_tmp_sys_sr_cy);
1731 1.1 christos SET_H_SYS_SR_OV (opval);
1732 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-ov", 'x', opval);
1733 1.1 christos }
1734 1.1 christos {
1735 1.1 christos SI opval = ADDCSI (GET_H_GPR (FLD (f_r2)), EXTSISI (FLD (f_simm16)), tmp_tmp_sys_sr_cy);
1736 1.1 christos SET_H_GPR (FLD (f_r1), opval);
1737 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval);
1738 1.1 christos }
1739 1.1 christos }
1740 1.1 christos if (ANDIF (GET_H_SYS_SR_OV (), GET_H_SYS_SR_OVE ())) {
1741 1.1 christos or1k32bf_exception (current_cpu, pc, EXCEPT_RANGE);
1742 1.1 christos }
1743 1.1 christos }
1744 1.1 christos
1745 1.1 christos #undef FLD
1746 1.1 christos }
1747 1.1 christos NEXT (vpc);
1748 1.1 christos
1749 1.1 christos CASE (sem, INSN_L_MULI) : /* l.muli $rD,$rA,$simm16 */
1750 1.1 christos {
1751 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1752 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1753 1.1 christos #define FLD(f) abuf->fields.sfmt_l_lwz.f
1754 1.1 christos int UNUSED written = 0;
1755 1.1 christos IADDR UNUSED pc = abuf->addr;
1756 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1757 1.1 christos
1758 1.1 christos {
1759 1.1 christos {
1760 1.1 christos {
1761 1.1 christos USI opval = MUL2OFSI (GET_H_GPR (FLD (f_r2)), EXTSISI (FLD (f_simm16)));
1762 1.1 christos SET_H_SYS_SR_OV (opval);
1763 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-ov", 'x', opval);
1764 1.1 christos }
1765 1.1 christos {
1766 1.1 christos USI opval = MULSI (GET_H_GPR (FLD (f_r2)), EXTSISI (FLD (f_simm16)));
1767 1.1 christos SET_H_GPR (FLD (f_r1), opval);
1768 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval);
1769 1.1 christos }
1770 1.1 christos }
1771 1.1 christos if (ANDIF (GET_H_SYS_SR_OV (), GET_H_SYS_SR_OVE ())) {
1772 1.1 christos or1k32bf_exception (current_cpu, pc, EXCEPT_RANGE);
1773 1.1 christos }
1774 1.1 christos }
1775 1.1 christos
1776 1.1 christos #undef FLD
1777 1.1 christos }
1778 1.1 christos NEXT (vpc);
1779 1.1 christos
1780 1.1 christos CASE (sem, INSN_L_EXTHS) : /* l.exths $rD,$rA */
1781 1.1 christos {
1782 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1783 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1784 1.1 christos #define FLD(f) abuf->fields.sfmt_l_slli.f
1785 1.1 christos int UNUSED written = 0;
1786 1.1 christos IADDR UNUSED pc = abuf->addr;
1787 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1788 1.1 christos
1789 1.1 christos {
1790 1.1 christos USI opval = EXTHISI (TRUNCSIHI (GET_H_GPR (FLD (f_r2))));
1791 1.1 christos SET_H_GPR (FLD (f_r1), opval);
1792 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval);
1793 1.1 christos }
1794 1.1 christos
1795 1.1 christos #undef FLD
1796 1.1 christos }
1797 1.1 christos NEXT (vpc);
1798 1.1 christos
1799 1.1 christos CASE (sem, INSN_L_EXTBS) : /* l.extbs $rD,$rA */
1800 1.1 christos {
1801 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1802 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1803 1.1 christos #define FLD(f) abuf->fields.sfmt_l_slli.f
1804 1.1 christos int UNUSED written = 0;
1805 1.1 christos IADDR UNUSED pc = abuf->addr;
1806 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1807 1.1 christos
1808 1.1 christos {
1809 1.1 christos USI opval = EXTQISI (TRUNCSIQI (GET_H_GPR (FLD (f_r2))));
1810 1.1 christos SET_H_GPR (FLD (f_r1), opval);
1811 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval);
1812 1.1 christos }
1813 1.1 christos
1814 1.1 christos #undef FLD
1815 1.1 christos }
1816 1.1 christos NEXT (vpc);
1817 1.1 christos
1818 1.1 christos CASE (sem, INSN_L_EXTHZ) : /* l.exthz $rD,$rA */
1819 1.1 christos {
1820 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1821 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1822 1.1 christos #define FLD(f) abuf->fields.sfmt_l_slli.f
1823 1.1 christos int UNUSED written = 0;
1824 1.1 christos IADDR UNUSED pc = abuf->addr;
1825 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1826 1.1 christos
1827 1.1 christos {
1828 1.1 christos USI opval = ZEXTHISI (TRUNCSIHI (GET_H_GPR (FLD (f_r2))));
1829 1.1 christos SET_H_GPR (FLD (f_r1), opval);
1830 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval);
1831 1.1 christos }
1832 1.1 christos
1833 1.1 christos #undef FLD
1834 1.1 christos }
1835 1.1 christos NEXT (vpc);
1836 1.1 christos
1837 1.1 christos CASE (sem, INSN_L_EXTBZ) : /* l.extbz $rD,$rA */
1838 1.1 christos {
1839 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1840 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1841 1.1 christos #define FLD(f) abuf->fields.sfmt_l_slli.f
1842 1.1 christos int UNUSED written = 0;
1843 1.1 christos IADDR UNUSED pc = abuf->addr;
1844 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1845 1.1 christos
1846 1.1 christos {
1847 1.1 christos USI opval = ZEXTQISI (TRUNCSIQI (GET_H_GPR (FLD (f_r2))));
1848 1.1 christos SET_H_GPR (FLD (f_r1), opval);
1849 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval);
1850 1.1 christos }
1851 1.1 christos
1852 1.1 christos #undef FLD
1853 1.1 christos }
1854 1.1 christos NEXT (vpc);
1855 1.1 christos
1856 1.1 christos CASE (sem, INSN_L_EXTWS) : /* l.extws $rD,$rA */
1857 1.1 christos {
1858 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1859 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1860 1.1 christos #define FLD(f) abuf->fields.sfmt_l_slli.f
1861 1.1 christos int UNUSED written = 0;
1862 1.1 christos IADDR UNUSED pc = abuf->addr;
1863 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1864 1.1 christos
1865 1.1 christos {
1866 1.1 christos USI opval = EXTSISI (TRUNCSISI (GET_H_GPR (FLD (f_r2))));
1867 1.1 christos SET_H_GPR (FLD (f_r1), opval);
1868 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval);
1869 1.1 christos }
1870 1.1 christos
1871 1.1 christos #undef FLD
1872 1.1 christos }
1873 1.1 christos NEXT (vpc);
1874 1.1 christos
1875 1.1 christos CASE (sem, INSN_L_EXTWZ) : /* l.extwz $rD,$rA */
1876 1.1 christos {
1877 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1878 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1879 1.1 christos #define FLD(f) abuf->fields.sfmt_l_slli.f
1880 1.1 christos int UNUSED written = 0;
1881 1.1 christos IADDR UNUSED pc = abuf->addr;
1882 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1883 1.1 christos
1884 1.1 christos {
1885 1.1 christos USI opval = ZEXTSISI (TRUNCSISI (GET_H_GPR (FLD (f_r2))));
1886 1.1 christos SET_H_GPR (FLD (f_r1), opval);
1887 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval);
1888 1.1 christos }
1889 1.1 christos
1890 1.1 christos #undef FLD
1891 1.1 christos }
1892 1.1 christos NEXT (vpc);
1893 1.1 christos
1894 1.1 christos CASE (sem, INSN_L_CMOV) : /* l.cmov $rD,$rA,$rB */
1895 1.1 christos {
1896 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1897 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1898 1.1 christos #define FLD(f) abuf->fields.sfmt_l_sll.f
1899 1.1 christos int UNUSED written = 0;
1900 1.1 christos IADDR UNUSED pc = abuf->addr;
1901 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1902 1.1 christos
1903 1.1 christos if (GET_H_SYS_SR_F ()) {
1904 1.1 christos {
1905 1.1 christos USI opval = GET_H_GPR (FLD (f_r2));
1906 1.1 christos SET_H_GPR (FLD (f_r1), opval);
1907 1.1 christos written |= (1 << 3);
1908 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval);
1909 1.1 christos }
1910 1.1 christos } else {
1911 1.1 christos {
1912 1.1 christos USI opval = GET_H_GPR (FLD (f_r3));
1913 1.1 christos SET_H_GPR (FLD (f_r1), opval);
1914 1.1 christos written |= (1 << 3);
1915 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval);
1916 1.1 christos }
1917 1.1 christos }
1918 1.1 christos
1919 1.1 christos abuf->written = written;
1920 1.1 christos #undef FLD
1921 1.1 christos }
1922 1.1 christos NEXT (vpc);
1923 1.1 christos
1924 1.1 christos CASE (sem, INSN_L_SFGTS) : /* l.sfgts $rA,$rB */
1925 1.1 christos {
1926 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1927 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1928 1.1 christos #define FLD(f) abuf->fields.sfmt_l_sll.f
1929 1.1 christos int UNUSED written = 0;
1930 1.1 christos IADDR UNUSED pc = abuf->addr;
1931 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1932 1.1 christos
1933 1.1 christos {
1934 1.1 christos USI opval = GTSI (GET_H_GPR (FLD (f_r2)), GET_H_GPR (FLD (f_r3)));
1935 1.1 christos SET_H_SYS_SR_F (opval);
1936 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-f", 'x', opval);
1937 1.1 christos }
1938 1.1 christos
1939 1.1 christos #undef FLD
1940 1.1 christos }
1941 1.1 christos NEXT (vpc);
1942 1.1 christos
1943 1.1 christos CASE (sem, INSN_L_SFGTSI) : /* l.sfgtsi $rA,$simm16 */
1944 1.1 christos {
1945 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1946 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1947 1.1 christos #define FLD(f) abuf->fields.sfmt_l_lwz.f
1948 1.1 christos int UNUSED written = 0;
1949 1.1 christos IADDR UNUSED pc = abuf->addr;
1950 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1951 1.1 christos
1952 1.1 christos {
1953 1.1 christos USI opval = GTSI (GET_H_GPR (FLD (f_r2)), EXTSISI (FLD (f_simm16)));
1954 1.1 christos SET_H_SYS_SR_F (opval);
1955 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-f", 'x', opval);
1956 1.1 christos }
1957 1.1 christos
1958 1.1 christos #undef FLD
1959 1.1 christos }
1960 1.1 christos NEXT (vpc);
1961 1.1 christos
1962 1.1 christos CASE (sem, INSN_L_SFGTU) : /* l.sfgtu $rA,$rB */
1963 1.1 christos {
1964 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1965 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1966 1.1 christos #define FLD(f) abuf->fields.sfmt_l_sll.f
1967 1.1 christos int UNUSED written = 0;
1968 1.1 christos IADDR UNUSED pc = abuf->addr;
1969 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1970 1.1 christos
1971 1.1 christos {
1972 1.1 christos USI opval = GTUSI (GET_H_GPR (FLD (f_r2)), GET_H_GPR (FLD (f_r3)));
1973 1.1 christos SET_H_SYS_SR_F (opval);
1974 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-f", 'x', opval);
1975 1.1 christos }
1976 1.1 christos
1977 1.1 christos #undef FLD
1978 1.1 christos }
1979 1.1 christos NEXT (vpc);
1980 1.1 christos
1981 1.1 christos CASE (sem, INSN_L_SFGTUI) : /* l.sfgtui $rA,$simm16 */
1982 1.1 christos {
1983 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1984 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1985 1.1 christos #define FLD(f) abuf->fields.sfmt_l_lwz.f
1986 1.1 christos int UNUSED written = 0;
1987 1.1 christos IADDR UNUSED pc = abuf->addr;
1988 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1989 1.1 christos
1990 1.1 christos {
1991 1.1 christos USI opval = GTUSI (GET_H_GPR (FLD (f_r2)), EXTSISI (FLD (f_simm16)));
1992 1.1 christos SET_H_SYS_SR_F (opval);
1993 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-f", 'x', opval);
1994 1.1 christos }
1995 1.1 christos
1996 1.1 christos #undef FLD
1997 1.1 christos }
1998 1.1 christos NEXT (vpc);
1999 1.1 christos
2000 1.1 christos CASE (sem, INSN_L_SFGES) : /* l.sfges $rA,$rB */
2001 1.1 christos {
2002 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2003 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2004 1.1 christos #define FLD(f) abuf->fields.sfmt_l_sll.f
2005 1.1 christos int UNUSED written = 0;
2006 1.1 christos IADDR UNUSED pc = abuf->addr;
2007 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2008 1.1 christos
2009 1.1 christos {
2010 1.1 christos USI opval = GESI (GET_H_GPR (FLD (f_r2)), GET_H_GPR (FLD (f_r3)));
2011 1.1 christos SET_H_SYS_SR_F (opval);
2012 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-f", 'x', opval);
2013 1.1 christos }
2014 1.1 christos
2015 1.1 christos #undef FLD
2016 1.1 christos }
2017 1.1 christos NEXT (vpc);
2018 1.1 christos
2019 1.1 christos CASE (sem, INSN_L_SFGESI) : /* l.sfgesi $rA,$simm16 */
2020 1.1 christos {
2021 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2022 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2023 1.1 christos #define FLD(f) abuf->fields.sfmt_l_lwz.f
2024 1.1 christos int UNUSED written = 0;
2025 1.1 christos IADDR UNUSED pc = abuf->addr;
2026 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2027 1.1 christos
2028 1.1 christos {
2029 1.1 christos USI opval = GESI (GET_H_GPR (FLD (f_r2)), EXTSISI (FLD (f_simm16)));
2030 1.1 christos SET_H_SYS_SR_F (opval);
2031 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-f", 'x', opval);
2032 1.1 christos }
2033 1.1 christos
2034 1.1 christos #undef FLD
2035 1.1 christos }
2036 1.1 christos NEXT (vpc);
2037 1.1 christos
2038 1.1 christos CASE (sem, INSN_L_SFGEU) : /* l.sfgeu $rA,$rB */
2039 1.1 christos {
2040 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2041 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2042 1.1 christos #define FLD(f) abuf->fields.sfmt_l_sll.f
2043 1.1 christos int UNUSED written = 0;
2044 1.1 christos IADDR UNUSED pc = abuf->addr;
2045 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2046 1.1 christos
2047 1.1 christos {
2048 1.1 christos USI opval = GEUSI (GET_H_GPR (FLD (f_r2)), GET_H_GPR (FLD (f_r3)));
2049 1.1 christos SET_H_SYS_SR_F (opval);
2050 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-f", 'x', opval);
2051 1.1 christos }
2052 1.1 christos
2053 1.1 christos #undef FLD
2054 1.1 christos }
2055 1.1 christos NEXT (vpc);
2056 1.1 christos
2057 1.1 christos CASE (sem, INSN_L_SFGEUI) : /* l.sfgeui $rA,$simm16 */
2058 1.1 christos {
2059 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2060 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2061 1.1 christos #define FLD(f) abuf->fields.sfmt_l_lwz.f
2062 1.1 christos int UNUSED written = 0;
2063 1.1 christos IADDR UNUSED pc = abuf->addr;
2064 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2065 1.1 christos
2066 1.1 christos {
2067 1.1 christos USI opval = GEUSI (GET_H_GPR (FLD (f_r2)), EXTSISI (FLD (f_simm16)));
2068 1.1 christos SET_H_SYS_SR_F (opval);
2069 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-f", 'x', opval);
2070 1.1 christos }
2071 1.1 christos
2072 1.1 christos #undef FLD
2073 1.1 christos }
2074 1.1 christos NEXT (vpc);
2075 1.1 christos
2076 1.1 christos CASE (sem, INSN_L_SFLTS) : /* l.sflts $rA,$rB */
2077 1.1 christos {
2078 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2079 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2080 1.1 christos #define FLD(f) abuf->fields.sfmt_l_sll.f
2081 1.1 christos int UNUSED written = 0;
2082 1.1 christos IADDR UNUSED pc = abuf->addr;
2083 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2084 1.1 christos
2085 1.1 christos {
2086 1.1 christos USI opval = LTSI (GET_H_GPR (FLD (f_r2)), GET_H_GPR (FLD (f_r3)));
2087 1.1 christos SET_H_SYS_SR_F (opval);
2088 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-f", 'x', opval);
2089 1.1 christos }
2090 1.1 christos
2091 1.1 christos #undef FLD
2092 1.1 christos }
2093 1.1 christos NEXT (vpc);
2094 1.1 christos
2095 1.1 christos CASE (sem, INSN_L_SFLTSI) : /* l.sfltsi $rA,$simm16 */
2096 1.1 christos {
2097 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2098 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2099 1.1 christos #define FLD(f) abuf->fields.sfmt_l_lwz.f
2100 1.1 christos int UNUSED written = 0;
2101 1.1 christos IADDR UNUSED pc = abuf->addr;
2102 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2103 1.1 christos
2104 1.1 christos {
2105 1.1 christos USI opval = LTSI (GET_H_GPR (FLD (f_r2)), EXTSISI (FLD (f_simm16)));
2106 1.1 christos SET_H_SYS_SR_F (opval);
2107 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-f", 'x', opval);
2108 1.1 christos }
2109 1.1 christos
2110 1.1 christos #undef FLD
2111 1.1 christos }
2112 1.1 christos NEXT (vpc);
2113 1.1 christos
2114 1.1 christos CASE (sem, INSN_L_SFLTU) : /* l.sfltu $rA,$rB */
2115 1.1 christos {
2116 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2117 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2118 1.1 christos #define FLD(f) abuf->fields.sfmt_l_sll.f
2119 1.1 christos int UNUSED written = 0;
2120 1.1 christos IADDR UNUSED pc = abuf->addr;
2121 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2122 1.1 christos
2123 1.1 christos {
2124 1.1 christos USI opval = LTUSI (GET_H_GPR (FLD (f_r2)), GET_H_GPR (FLD (f_r3)));
2125 1.1 christos SET_H_SYS_SR_F (opval);
2126 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-f", 'x', opval);
2127 1.1 christos }
2128 1.1 christos
2129 1.1 christos #undef FLD
2130 1.1 christos }
2131 1.1 christos NEXT (vpc);
2132 1.1 christos
2133 1.1 christos CASE (sem, INSN_L_SFLTUI) : /* l.sfltui $rA,$simm16 */
2134 1.1 christos {
2135 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2136 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2137 1.1 christos #define FLD(f) abuf->fields.sfmt_l_lwz.f
2138 1.1 christos int UNUSED written = 0;
2139 1.1 christos IADDR UNUSED pc = abuf->addr;
2140 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2141 1.1 christos
2142 1.1 christos {
2143 1.1 christos USI opval = LTUSI (GET_H_GPR (FLD (f_r2)), EXTSISI (FLD (f_simm16)));
2144 1.1 christos SET_H_SYS_SR_F (opval);
2145 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-f", 'x', opval);
2146 1.1 christos }
2147 1.1 christos
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_L_SFLES) : /* l.sfles $rA,$rB */
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_l_sll.f
2157 1.1 christos int UNUSED written = 0;
2158 1.1 christos IADDR UNUSED pc = abuf->addr;
2159 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2160 1.1 christos
2161 1.1 christos {
2162 1.1 christos USI opval = LESI (GET_H_GPR (FLD (f_r2)), GET_H_GPR (FLD (f_r3)));
2163 1.1 christos SET_H_SYS_SR_F (opval);
2164 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-f", 'x', opval);
2165 1.1 christos }
2166 1.1 christos
2167 1.1 christos #undef FLD
2168 1.1 christos }
2169 1.1 christos NEXT (vpc);
2170 1.1 christos
2171 1.1 christos CASE (sem, INSN_L_SFLESI) : /* l.sflesi $rA,$simm16 */
2172 1.1 christos {
2173 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2174 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2175 1.1 christos #define FLD(f) abuf->fields.sfmt_l_lwz.f
2176 1.1 christos int UNUSED written = 0;
2177 1.1 christos IADDR UNUSED pc = abuf->addr;
2178 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2179 1.1 christos
2180 1.1 christos {
2181 1.1 christos USI opval = LESI (GET_H_GPR (FLD (f_r2)), EXTSISI (FLD (f_simm16)));
2182 1.1 christos SET_H_SYS_SR_F (opval);
2183 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-f", 'x', opval);
2184 1.1 christos }
2185 1.1 christos
2186 1.1 christos #undef FLD
2187 1.1 christos }
2188 1.1 christos NEXT (vpc);
2189 1.1 christos
2190 1.1 christos CASE (sem, INSN_L_SFLEU) : /* l.sfleu $rA,$rB */
2191 1.1 christos {
2192 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2193 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2194 1.1 christos #define FLD(f) abuf->fields.sfmt_l_sll.f
2195 1.1 christos int UNUSED written = 0;
2196 1.1 christos IADDR UNUSED pc = abuf->addr;
2197 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2198 1.1 christos
2199 1.1 christos {
2200 1.1 christos USI opval = LEUSI (GET_H_GPR (FLD (f_r2)), GET_H_GPR (FLD (f_r3)));
2201 1.1 christos SET_H_SYS_SR_F (opval);
2202 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-f", 'x', opval);
2203 1.1 christos }
2204 1.1 christos
2205 1.1 christos #undef FLD
2206 1.1 christos }
2207 1.1 christos NEXT (vpc);
2208 1.1 christos
2209 1.1 christos CASE (sem, INSN_L_SFLEUI) : /* l.sfleui $rA,$simm16 */
2210 1.1 christos {
2211 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2212 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2213 1.1 christos #define FLD(f) abuf->fields.sfmt_l_lwz.f
2214 1.1 christos int UNUSED written = 0;
2215 1.1 christos IADDR UNUSED pc = abuf->addr;
2216 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2217 1.1 christos
2218 1.1 christos {
2219 1.1 christos USI opval = LEUSI (GET_H_GPR (FLD (f_r2)), EXTSISI (FLD (f_simm16)));
2220 1.1 christos SET_H_SYS_SR_F (opval);
2221 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-f", 'x', opval);
2222 1.1 christos }
2223 1.1 christos
2224 1.1 christos #undef FLD
2225 1.1 christos }
2226 1.1 christos NEXT (vpc);
2227 1.1 christos
2228 1.1 christos CASE (sem, INSN_L_SFEQ) : /* l.sfeq $rA,$rB */
2229 1.1 christos {
2230 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2231 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2232 1.1 christos #define FLD(f) abuf->fields.sfmt_l_sll.f
2233 1.1 christos int UNUSED written = 0;
2234 1.1 christos IADDR UNUSED pc = abuf->addr;
2235 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2236 1.1 christos
2237 1.1 christos {
2238 1.1 christos USI opval = EQSI (GET_H_GPR (FLD (f_r2)), GET_H_GPR (FLD (f_r3)));
2239 1.1 christos SET_H_SYS_SR_F (opval);
2240 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-f", 'x', opval);
2241 1.1 christos }
2242 1.1 christos
2243 1.1 christos #undef FLD
2244 1.1 christos }
2245 1.1 christos NEXT (vpc);
2246 1.1 christos
2247 1.1 christos CASE (sem, INSN_L_SFEQI) : /* l.sfeqi $rA,$simm16 */
2248 1.1 christos {
2249 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2250 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2251 1.1 christos #define FLD(f) abuf->fields.sfmt_l_lwz.f
2252 1.1 christos int UNUSED written = 0;
2253 1.1 christos IADDR UNUSED pc = abuf->addr;
2254 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2255 1.1 christos
2256 1.1 christos {
2257 1.1 christos USI opval = EQSI (GET_H_GPR (FLD (f_r2)), EXTSISI (FLD (f_simm16)));
2258 1.1 christos SET_H_SYS_SR_F (opval);
2259 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-f", 'x', opval);
2260 1.1 christos }
2261 1.1 christos
2262 1.1 christos #undef FLD
2263 1.1 christos }
2264 1.1 christos NEXT (vpc);
2265 1.1 christos
2266 1.1 christos CASE (sem, INSN_L_SFNE) : /* l.sfne $rA,$rB */
2267 1.1 christos {
2268 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2269 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2270 1.1 christos #define FLD(f) abuf->fields.sfmt_l_sll.f
2271 1.1 christos int UNUSED written = 0;
2272 1.1 christos IADDR UNUSED pc = abuf->addr;
2273 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2274 1.1 christos
2275 1.1 christos {
2276 1.1 christos USI opval = NESI (GET_H_GPR (FLD (f_r2)), GET_H_GPR (FLD (f_r3)));
2277 1.1 christos SET_H_SYS_SR_F (opval);
2278 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-f", 'x', opval);
2279 1.1 christos }
2280 1.1 christos
2281 1.1 christos #undef FLD
2282 1.1 christos }
2283 1.1 christos NEXT (vpc);
2284 1.1 christos
2285 1.1 christos CASE (sem, INSN_L_SFNEI) : /* l.sfnei $rA,$simm16 */
2286 1.1 christos {
2287 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2288 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2289 1.1 christos #define FLD(f) abuf->fields.sfmt_l_lwz.f
2290 1.1 christos int UNUSED written = 0;
2291 1.1 christos IADDR UNUSED pc = abuf->addr;
2292 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2293 1.1 christos
2294 1.1 christos {
2295 1.1 christos USI opval = NESI (GET_H_GPR (FLD (f_r2)), EXTSISI (FLD (f_simm16)));
2296 1.1 christos SET_H_SYS_SR_F (opval);
2297 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-f", 'x', opval);
2298 1.1 christos }
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_L_MAC) : /* l.mac $rA,$rB */
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_l_sll.f
2309 1.1 christos int UNUSED written = 0;
2310 1.1 christos IADDR UNUSED pc = abuf->addr;
2311 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2312 1.1 christos
2313 1.1 christos {
2314 1.1 christos {
2315 1.1 christos DI tmp_prod;
2316 1.1 christos DI tmp_mac;
2317 1.1 christos DI tmp_result;
2318 1.1 christos tmp_prod = MULDI (EXTSIDI (GET_H_GPR (FLD (f_r2))), EXTSIDI (GET_H_GPR (FLD (f_r3))));
2319 1.1 christos tmp_mac = JOINSIDI (GET_H_MAC_MACHI (), GET_H_MAC_MACLO ());
2320 1.1 christos tmp_result = ADDDI (tmp_prod, tmp_mac);
2321 1.1 christos {
2322 1.1 christos SI opval = SUBWORDDISI (tmp_result, 0);
2323 1.1 christos SET_H_MAC_MACHI (opval);
2324 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "mac-machi", 'x', opval);
2325 1.1 christos }
2326 1.1 christos {
2327 1.1 christos SI opval = SUBWORDDISI (tmp_result, 1);
2328 1.1 christos SET_H_MAC_MACLO (opval);
2329 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "mac-maclo", 'x', opval);
2330 1.1 christos }
2331 1.1 christos {
2332 1.1 christos BI opval = ADDOFDI (tmp_prod, tmp_mac, 0);
2333 1.1 christos SET_H_SYS_SR_OV (opval);
2334 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-ov", 'x', opval);
2335 1.1 christos }
2336 1.1 christos }
2337 1.1 christos if (ANDIF (GET_H_SYS_SR_OV (), GET_H_SYS_SR_OVE ())) {
2338 1.1 christos or1k32bf_exception (current_cpu, pc, EXCEPT_RANGE);
2339 1.1 christos }
2340 1.1 christos }
2341 1.1 christos
2342 1.1 christos #undef FLD
2343 1.1 christos }
2344 1.1 christos NEXT (vpc);
2345 1.1 christos
2346 1.1 christos CASE (sem, INSN_L_MACI) : /* l.maci $rA,${simm16} */
2347 1.1 christos {
2348 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2349 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2350 1.1 christos #define FLD(f) abuf->fields.sfmt_l_lwz.f
2351 1.1 christos int UNUSED written = 0;
2352 1.1 christos IADDR UNUSED pc = abuf->addr;
2353 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2354 1.1 christos
2355 1.1 christos {
2356 1.1 christos {
2357 1.1 christos DI tmp_prod;
2358 1.1 christos DI tmp_mac;
2359 1.1 christos DI tmp_result;
2360 1.1 christos tmp_prod = MULDI (EXTSIDI (GET_H_GPR (FLD (f_r2))), EXTSIDI (FLD (f_simm16)));
2361 1.1 christos tmp_mac = JOINSIDI (GET_H_MAC_MACHI (), GET_H_MAC_MACLO ());
2362 1.1 christos tmp_result = ADDDI (tmp_mac, tmp_prod);
2363 1.1 christos {
2364 1.1 christos SI opval = SUBWORDDISI (tmp_result, 0);
2365 1.1 christos SET_H_MAC_MACHI (opval);
2366 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "mac-machi", 'x', opval);
2367 1.1 christos }
2368 1.1 christos {
2369 1.1 christos SI opval = SUBWORDDISI (tmp_result, 1);
2370 1.1 christos SET_H_MAC_MACLO (opval);
2371 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "mac-maclo", 'x', opval);
2372 1.1 christos }
2373 1.1 christos {
2374 1.1 christos BI opval = ADDOFDI (tmp_prod, tmp_mac, 0);
2375 1.1 christos SET_H_SYS_SR_OV (opval);
2376 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-ov", 'x', opval);
2377 1.1 christos }
2378 1.1 christos }
2379 1.1 christos if (ANDIF (GET_H_SYS_SR_OV (), GET_H_SYS_SR_OVE ())) {
2380 1.1 christos or1k32bf_exception (current_cpu, pc, EXCEPT_RANGE);
2381 1.1 christos }
2382 1.1 christos }
2383 1.1 christos
2384 1.1 christos #undef FLD
2385 1.1 christos }
2386 1.1 christos NEXT (vpc);
2387 1.1 christos
2388 1.1 christos CASE (sem, INSN_L_MACU) : /* l.macu $rA,$rB */
2389 1.1 christos {
2390 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2391 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2392 1.1 christos #define FLD(f) abuf->fields.sfmt_l_sll.f
2393 1.1 christos int UNUSED written = 0;
2394 1.1 christos IADDR UNUSED pc = abuf->addr;
2395 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2396 1.1 christos
2397 1.1 christos {
2398 1.1 christos {
2399 1.1 christos DI tmp_prod;
2400 1.1 christos DI tmp_mac;
2401 1.1 christos DI tmp_result;
2402 1.1 christos tmp_prod = MULDI (ZEXTSIDI (GET_H_GPR (FLD (f_r2))), ZEXTSIDI (GET_H_GPR (FLD (f_r3))));
2403 1.1 christos tmp_mac = JOINSIDI (GET_H_MAC_MACHI (), GET_H_MAC_MACLO ());
2404 1.1 christos tmp_result = ADDDI (tmp_prod, tmp_mac);
2405 1.1 christos {
2406 1.1 christos SI opval = SUBWORDDISI (tmp_result, 0);
2407 1.1 christos SET_H_MAC_MACHI (opval);
2408 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "mac-machi", 'x', opval);
2409 1.1 christos }
2410 1.1 christos {
2411 1.1 christos SI opval = SUBWORDDISI (tmp_result, 1);
2412 1.1 christos SET_H_MAC_MACLO (opval);
2413 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "mac-maclo", 'x', opval);
2414 1.1 christos }
2415 1.1 christos {
2416 1.1 christos BI opval = ADDCFDI (tmp_prod, tmp_mac, 0);
2417 1.1 christos SET_H_SYS_SR_CY (opval);
2418 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-cy", 'x', opval);
2419 1.1 christos }
2420 1.1 christos }
2421 1.1 christos if (ANDIF (GET_H_SYS_SR_CY (), GET_H_SYS_SR_OVE ())) {
2422 1.1 christos or1k32bf_exception (current_cpu, pc, EXCEPT_RANGE);
2423 1.1 christos }
2424 1.1 christos }
2425 1.1 christos
2426 1.1 christos #undef FLD
2427 1.1 christos }
2428 1.1 christos NEXT (vpc);
2429 1.1 christos
2430 1.1 christos CASE (sem, INSN_L_MSB) : /* l.msb $rA,$rB */
2431 1.1 christos {
2432 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2433 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2434 1.1 christos #define FLD(f) abuf->fields.sfmt_l_sll.f
2435 1.1 christos int UNUSED written = 0;
2436 1.1 christos IADDR UNUSED pc = abuf->addr;
2437 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2438 1.1 christos
2439 1.1 christos {
2440 1.1 christos {
2441 1.1 christos DI tmp_prod;
2442 1.1 christos DI tmp_mac;
2443 1.1 christos DI tmp_result;
2444 1.1 christos tmp_prod = MULDI (EXTSIDI (GET_H_GPR (FLD (f_r2))), EXTSIDI (GET_H_GPR (FLD (f_r3))));
2445 1.1 christos tmp_mac = JOINSIDI (GET_H_MAC_MACHI (), GET_H_MAC_MACLO ());
2446 1.1 christos tmp_result = SUBDI (tmp_mac, tmp_prod);
2447 1.1 christos {
2448 1.1 christos SI opval = SUBWORDDISI (tmp_result, 0);
2449 1.1 christos SET_H_MAC_MACHI (opval);
2450 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "mac-machi", 'x', opval);
2451 1.1 christos }
2452 1.1 christos {
2453 1.1 christos SI opval = SUBWORDDISI (tmp_result, 1);
2454 1.1 christos SET_H_MAC_MACLO (opval);
2455 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "mac-maclo", 'x', opval);
2456 1.1 christos }
2457 1.1 christos {
2458 1.1 christos BI opval = SUBOFDI (tmp_mac, tmp_result, 0);
2459 1.1 christos SET_H_SYS_SR_OV (opval);
2460 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-ov", 'x', opval);
2461 1.1 christos }
2462 1.1 christos }
2463 1.1 christos if (ANDIF (GET_H_SYS_SR_OV (), GET_H_SYS_SR_OVE ())) {
2464 1.1 christos or1k32bf_exception (current_cpu, pc, EXCEPT_RANGE);
2465 1.1 christos }
2466 1.1 christos }
2467 1.1 christos
2468 1.1 christos #undef FLD
2469 1.1 christos }
2470 1.1 christos NEXT (vpc);
2471 1.1 christos
2472 1.1 christos CASE (sem, INSN_L_MSBU) : /* l.msbu $rA,$rB */
2473 1.1 christos {
2474 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2475 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2476 1.1 christos #define FLD(f) abuf->fields.sfmt_l_sll.f
2477 1.1 christos int UNUSED written = 0;
2478 1.1 christos IADDR UNUSED pc = abuf->addr;
2479 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2480 1.1 christos
2481 1.1 christos {
2482 1.1 christos {
2483 1.1 christos DI tmp_prod;
2484 1.1 christos DI tmp_mac;
2485 1.1 christos DI tmp_result;
2486 1.1 christos tmp_prod = MULDI (ZEXTSIDI (GET_H_GPR (FLD (f_r2))), ZEXTSIDI (GET_H_GPR (FLD (f_r3))));
2487 1.1 christos tmp_mac = JOINSIDI (GET_H_MAC_MACHI (), GET_H_MAC_MACLO ());
2488 1.1 christos tmp_result = SUBDI (tmp_mac, tmp_prod);
2489 1.1 christos {
2490 1.1 christos SI opval = SUBWORDDISI (tmp_result, 0);
2491 1.1 christos SET_H_MAC_MACHI (opval);
2492 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "mac-machi", 'x', opval);
2493 1.1 christos }
2494 1.1 christos {
2495 1.1 christos SI opval = SUBWORDDISI (tmp_result, 1);
2496 1.1 christos SET_H_MAC_MACLO (opval);
2497 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "mac-maclo", 'x', opval);
2498 1.1 christos }
2499 1.1 christos {
2500 1.1 christos BI opval = SUBCFDI (tmp_mac, tmp_result, 0);
2501 1.1 christos SET_H_SYS_SR_CY (opval);
2502 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-cy", 'x', opval);
2503 1.1 christos }
2504 1.1 christos }
2505 1.1 christos if (ANDIF (GET_H_SYS_SR_CY (), GET_H_SYS_SR_OVE ())) {
2506 1.1 christos or1k32bf_exception (current_cpu, pc, EXCEPT_RANGE);
2507 1.1 christos }
2508 1.1 christos }
2509 1.1 christos
2510 1.1 christos #undef FLD
2511 1.1 christos }
2512 1.1 christos NEXT (vpc);
2513 1.1 christos
2514 1.1 christos CASE (sem, INSN_L_CUST1) : /* l.cust1 */
2515 1.1 christos {
2516 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2517 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2518 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
2519 1.1 christos int UNUSED written = 0;
2520 1.1 christos IADDR UNUSED pc = abuf->addr;
2521 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2522 1.1 christos
2523 1.1 christos ((void) 0); /*nop*/
2524 1.1 christos
2525 1.1 christos #undef FLD
2526 1.1 christos }
2527 1.1 christos NEXT (vpc);
2528 1.1 christos
2529 1.1 christos CASE (sem, INSN_L_CUST2) : /* l.cust2 */
2530 1.1 christos {
2531 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2532 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2533 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
2534 1.1 christos int UNUSED written = 0;
2535 1.1 christos IADDR UNUSED pc = abuf->addr;
2536 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2537 1.1 christos
2538 1.1 christos ((void) 0); /*nop*/
2539 1.1 christos
2540 1.1 christos #undef FLD
2541 1.1 christos }
2542 1.1 christos NEXT (vpc);
2543 1.1 christos
2544 1.1 christos CASE (sem, INSN_L_CUST3) : /* l.cust3 */
2545 1.1 christos {
2546 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2547 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2548 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
2549 1.1 christos int UNUSED written = 0;
2550 1.1 christos IADDR UNUSED pc = abuf->addr;
2551 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2552 1.1 christos
2553 1.1 christos ((void) 0); /*nop*/
2554 1.1 christos
2555 1.1 christos #undef FLD
2556 1.1 christos }
2557 1.1 christos NEXT (vpc);
2558 1.1 christos
2559 1.1 christos CASE (sem, INSN_L_CUST4) : /* l.cust4 */
2560 1.1 christos {
2561 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2562 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2563 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
2564 1.1 christos int UNUSED written = 0;
2565 1.1 christos IADDR UNUSED pc = abuf->addr;
2566 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2567 1.1 christos
2568 1.1 christos ((void) 0); /*nop*/
2569 1.1 christos
2570 1.1 christos #undef FLD
2571 1.1 christos }
2572 1.1 christos NEXT (vpc);
2573 1.1 christos
2574 1.1 christos CASE (sem, INSN_L_CUST5) : /* l.cust5 */
2575 1.1 christos {
2576 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2577 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2578 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
2579 1.1 christos int UNUSED written = 0;
2580 1.1 christos IADDR UNUSED pc = abuf->addr;
2581 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2582 1.1 christos
2583 1.1 christos ((void) 0); /*nop*/
2584 1.1 christos
2585 1.1 christos #undef FLD
2586 1.1 christos }
2587 1.1 christos NEXT (vpc);
2588 1.1 christos
2589 1.1 christos CASE (sem, INSN_L_CUST6) : /* l.cust6 */
2590 1.1 christos {
2591 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2592 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2593 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
2594 1.1 christos int UNUSED written = 0;
2595 1.1 christos IADDR UNUSED pc = abuf->addr;
2596 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2597 1.1 christos
2598 1.1 christos ((void) 0); /*nop*/
2599 1.1 christos
2600 1.1 christos #undef FLD
2601 1.1 christos }
2602 1.1 christos NEXT (vpc);
2603 1.1 christos
2604 1.1 christos CASE (sem, INSN_L_CUST7) : /* l.cust7 */
2605 1.1 christos {
2606 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2607 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2608 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
2609 1.1 christos int UNUSED written = 0;
2610 1.1 christos IADDR UNUSED pc = abuf->addr;
2611 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2612 1.1 christos
2613 1.1 christos ((void) 0); /*nop*/
2614 1.1 christos
2615 1.1 christos #undef FLD
2616 1.1 christos }
2617 1.1 christos NEXT (vpc);
2618 1.1 christos
2619 1.1 christos CASE (sem, INSN_L_CUST8) : /* l.cust8 */
2620 1.1 christos {
2621 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2622 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2623 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
2624 1.1 christos int UNUSED written = 0;
2625 1.1 christos IADDR UNUSED pc = abuf->addr;
2626 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2627 1.1 christos
2628 1.1 christos ((void) 0); /*nop*/
2629 1.1 christos
2630 1.1 christos #undef FLD
2631 1.1 christos }
2632 1.1 christos NEXT (vpc);
2633 1.1 christos
2634 1.1 christos CASE (sem, INSN_LF_ADD_S) : /* lf.add.s $rDSF,$rASF,$rBSF */
2635 1.1 christos {
2636 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2637 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2638 1.1 christos #define FLD(f) abuf->fields.sfmt_l_sll.f
2639 1.1 christos int UNUSED written = 0;
2640 1.1 christos IADDR UNUSED pc = abuf->addr;
2641 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2642 1.1 christos
2643 1.1 christos {
2644 1.1 christos SF opval = CGEN_CPU_FPU (current_cpu)->ops->addsf (CGEN_CPU_FPU (current_cpu), GET_H_FSR (FLD (f_r2)), GET_H_FSR (FLD (f_r3)));
2645 1.1 christos SET_H_FSR (FLD (f_r1), opval);
2646 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "fsr", 'f', opval);
2647 1.1 christos }
2648 1.1 christos
2649 1.1 christos #undef FLD
2650 1.1 christos }
2651 1.1 christos NEXT (vpc);
2652 1.1 christos
2653 1.1 christos CASE (sem, INSN_LF_SUB_S) : /* lf.sub.s $rDSF,$rASF,$rBSF */
2654 1.1 christos {
2655 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2656 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2657 1.1 christos #define FLD(f) abuf->fields.sfmt_l_sll.f
2658 1.1 christos int UNUSED written = 0;
2659 1.1 christos IADDR UNUSED pc = abuf->addr;
2660 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2661 1.1 christos
2662 1.1 christos {
2663 1.1 christos SF opval = CGEN_CPU_FPU (current_cpu)->ops->subsf (CGEN_CPU_FPU (current_cpu), GET_H_FSR (FLD (f_r2)), GET_H_FSR (FLD (f_r3)));
2664 1.1 christos SET_H_FSR (FLD (f_r1), opval);
2665 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "fsr", 'f', opval);
2666 1.1 christos }
2667 1.1 christos
2668 1.1 christos #undef FLD
2669 1.1 christos }
2670 1.1 christos NEXT (vpc);
2671 1.1 christos
2672 1.1 christos CASE (sem, INSN_LF_MUL_S) : /* lf.mul.s $rDSF,$rASF,$rBSF */
2673 1.1 christos {
2674 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2675 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2676 1.1 christos #define FLD(f) abuf->fields.sfmt_l_sll.f
2677 1.1 christos int UNUSED written = 0;
2678 1.1 christos IADDR UNUSED pc = abuf->addr;
2679 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2680 1.1 christos
2681 1.1 christos {
2682 1.1 christos SF opval = CGEN_CPU_FPU (current_cpu)->ops->mulsf (CGEN_CPU_FPU (current_cpu), GET_H_FSR (FLD (f_r2)), GET_H_FSR (FLD (f_r3)));
2683 1.1 christos SET_H_FSR (FLD (f_r1), opval);
2684 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "fsr", 'f', opval);
2685 1.1 christos }
2686 1.1 christos
2687 1.1 christos #undef FLD
2688 1.1 christos }
2689 1.1 christos NEXT (vpc);
2690 1.1 christos
2691 1.1 christos CASE (sem, INSN_LF_DIV_S) : /* lf.div.s $rDSF,$rASF,$rBSF */
2692 1.1 christos {
2693 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2694 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2695 1.1 christos #define FLD(f) abuf->fields.sfmt_l_sll.f
2696 1.1 christos int UNUSED written = 0;
2697 1.1 christos IADDR UNUSED pc = abuf->addr;
2698 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2699 1.1 christos
2700 1.1 christos {
2701 1.1 christos SF opval = CGEN_CPU_FPU (current_cpu)->ops->divsf (CGEN_CPU_FPU (current_cpu), GET_H_FSR (FLD (f_r2)), GET_H_FSR (FLD (f_r3)));
2702 1.1 christos SET_H_FSR (FLD (f_r1), opval);
2703 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "fsr", 'f', opval);
2704 1.1 christos }
2705 1.1 christos
2706 1.1 christos #undef FLD
2707 1.1 christos }
2708 1.1 christos NEXT (vpc);
2709 1.1 christos
2710 1.1 christos CASE (sem, INSN_LF_REM_S) : /* lf.rem.s $rDSF,$rASF,$rBSF */
2711 1.1 christos {
2712 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2713 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2714 1.1 christos #define FLD(f) abuf->fields.sfmt_l_sll.f
2715 1.1 christos int UNUSED written = 0;
2716 1.1 christos IADDR UNUSED pc = abuf->addr;
2717 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2718 1.1 christos
2719 1.1 christos {
2720 1.1 christos SF opval = CGEN_CPU_FPU (current_cpu)->ops->remsf (CGEN_CPU_FPU (current_cpu), GET_H_FSR (FLD (f_r2)), GET_H_FSR (FLD (f_r3)));
2721 1.1 christos SET_H_FSR (FLD (f_r1), opval);
2722 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "fsr", 'f', opval);
2723 1.1 christos }
2724 1.1 christos
2725 1.1 christos #undef FLD
2726 1.1 christos }
2727 1.1 christos NEXT (vpc);
2728 1.1 christos
2729 1.1 christos CASE (sem, INSN_LF_ITOF_S) : /* lf.itof.s $rDSF,$rA */
2730 1.1 christos {
2731 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2732 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2733 1.1 christos #define FLD(f) abuf->fields.sfmt_l_slli.f
2734 1.1 christos int UNUSED written = 0;
2735 1.1 christos IADDR UNUSED pc = abuf->addr;
2736 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2737 1.1 christos
2738 1.1 christos {
2739 1.1 christos SF opval = CGEN_CPU_FPU (current_cpu)->ops->floatsisf (CGEN_CPU_FPU (current_cpu), (GET_H_SYS_FPCSR_RM () == 0) ? (1) : (GET_H_SYS_FPCSR_RM () == 1) ? (3) : (GET_H_SYS_FPCSR_RM () == 2) ? (4) : (5), TRUNCSISI (GET_H_GPR (FLD (f_r2))));
2740 1.1 christos SET_H_FSR (FLD (f_r1), opval);
2741 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "fsr", 'f', opval);
2742 1.1 christos }
2743 1.1 christos
2744 1.1 christos #undef FLD
2745 1.1 christos }
2746 1.1 christos NEXT (vpc);
2747 1.1 christos
2748 1.1 christos CASE (sem, INSN_LF_FTOI_S) : /* lf.ftoi.s $rD,$rASF */
2749 1.1 christos {
2750 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2751 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2752 1.1 christos #define FLD(f) abuf->fields.sfmt_l_slli.f
2753 1.1 christos int UNUSED written = 0;
2754 1.1 christos IADDR UNUSED pc = abuf->addr;
2755 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2756 1.1 christos
2757 1.1 christos {
2758 1.1 christos SI opval = EXTSISI (CGEN_CPU_FPU (current_cpu)->ops->fixsfsi (CGEN_CPU_FPU (current_cpu), (GET_H_SYS_FPCSR_RM () == 0) ? (1) : (GET_H_SYS_FPCSR_RM () == 1) ? (3) : (GET_H_SYS_FPCSR_RM () == 2) ? (4) : (5), GET_H_FSR (FLD (f_r2))));
2759 1.1 christos SET_H_GPR (FLD (f_r1), opval);
2760 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "gpr", 'x', opval);
2761 1.1 christos }
2762 1.1 christos
2763 1.1 christos #undef FLD
2764 1.1 christos }
2765 1.1 christos NEXT (vpc);
2766 1.1 christos
2767 1.1 christos CASE (sem, INSN_LF_EQ_S) : /* lf.sfeq.s $rASF,$rBSF */
2768 1.1 christos {
2769 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2770 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2771 1.1 christos #define FLD(f) abuf->fields.sfmt_l_sll.f
2772 1.1 christos int UNUSED written = 0;
2773 1.1 christos IADDR UNUSED pc = abuf->addr;
2774 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2775 1.1 christos
2776 1.1 christos {
2777 1.1 christos BI opval = CGEN_CPU_FPU (current_cpu)->ops->eqsf (CGEN_CPU_FPU (current_cpu), GET_H_FSR (FLD (f_r2)), GET_H_FSR (FLD (f_r3)));
2778 1.1 christos SET_H_SYS_SR_F (opval);
2779 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-f", 'x', opval);
2780 1.1 christos }
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_LF_NE_S) : /* lf.sfne.s $rASF,$rBSF */
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_l_sll.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 {
2796 1.1 christos BI opval = CGEN_CPU_FPU (current_cpu)->ops->nesf (CGEN_CPU_FPU (current_cpu), GET_H_FSR (FLD (f_r2)), GET_H_FSR (FLD (f_r3)));
2797 1.1 christos SET_H_SYS_SR_F (opval);
2798 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-f", 'x', opval);
2799 1.1 christos }
2800 1.1 christos
2801 1.1 christos #undef FLD
2802 1.1 christos }
2803 1.1 christos NEXT (vpc);
2804 1.1 christos
2805 1.1 christos CASE (sem, INSN_LF_GE_S) : /* lf.sfge.s $rASF,$rBSF */
2806 1.1 christos {
2807 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2808 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2809 1.1 christos #define FLD(f) abuf->fields.sfmt_l_sll.f
2810 1.1 christos int UNUSED written = 0;
2811 1.1 christos IADDR UNUSED pc = abuf->addr;
2812 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2813 1.1 christos
2814 1.1 christos {
2815 1.1 christos BI opval = CGEN_CPU_FPU (current_cpu)->ops->gesf (CGEN_CPU_FPU (current_cpu), GET_H_FSR (FLD (f_r2)), GET_H_FSR (FLD (f_r3)));
2816 1.1 christos SET_H_SYS_SR_F (opval);
2817 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-f", 'x', opval);
2818 1.1 christos }
2819 1.1 christos
2820 1.1 christos #undef FLD
2821 1.1 christos }
2822 1.1 christos NEXT (vpc);
2823 1.1 christos
2824 1.1 christos CASE (sem, INSN_LF_GT_S) : /* lf.sfgt.s $rASF,$rBSF */
2825 1.1 christos {
2826 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2827 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2828 1.1 christos #define FLD(f) abuf->fields.sfmt_l_sll.f
2829 1.1 christos int UNUSED written = 0;
2830 1.1 christos IADDR UNUSED pc = abuf->addr;
2831 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2832 1.1 christos
2833 1.1 christos {
2834 1.1 christos BI opval = CGEN_CPU_FPU (current_cpu)->ops->gtsf (CGEN_CPU_FPU (current_cpu), GET_H_FSR (FLD (f_r2)), GET_H_FSR (FLD (f_r3)));
2835 1.1 christos SET_H_SYS_SR_F (opval);
2836 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-f", 'x', opval);
2837 1.1 christos }
2838 1.1 christos
2839 1.1 christos #undef FLD
2840 1.1 christos }
2841 1.1 christos NEXT (vpc);
2842 1.1 christos
2843 1.1 christos CASE (sem, INSN_LF_LT_S) : /* lf.sflt.s $rASF,$rBSF */
2844 1.1 christos {
2845 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2846 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2847 1.1 christos #define FLD(f) abuf->fields.sfmt_l_sll.f
2848 1.1 christos int UNUSED written = 0;
2849 1.1 christos IADDR UNUSED pc = abuf->addr;
2850 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2851 1.1 christos
2852 1.1 christos {
2853 1.1 christos BI opval = CGEN_CPU_FPU (current_cpu)->ops->ltsf (CGEN_CPU_FPU (current_cpu), GET_H_FSR (FLD (f_r2)), GET_H_FSR (FLD (f_r3)));
2854 1.1 christos SET_H_SYS_SR_F (opval);
2855 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-f", 'x', opval);
2856 1.1 christos }
2857 1.1 christos
2858 1.1 christos #undef FLD
2859 1.1 christos }
2860 1.1 christos NEXT (vpc);
2861 1.1 christos
2862 1.1 christos CASE (sem, INSN_LF_LE_S) : /* lf.sfle.s $rASF,$rBSF */
2863 1.1 christos {
2864 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2865 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2866 1.1 christos #define FLD(f) abuf->fields.sfmt_l_sll.f
2867 1.1 christos int UNUSED written = 0;
2868 1.1 christos IADDR UNUSED pc = abuf->addr;
2869 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2870 1.1 christos
2871 1.1 christos {
2872 1.1 christos BI opval = CGEN_CPU_FPU (current_cpu)->ops->lesf (CGEN_CPU_FPU (current_cpu), GET_H_FSR (FLD (f_r2)), GET_H_FSR (FLD (f_r3)));
2873 1.1 christos SET_H_SYS_SR_F (opval);
2874 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "sys-sr-f", 'x', opval);
2875 1.1 christos }
2876 1.1 christos
2877 1.1 christos #undef FLD
2878 1.1 christos }
2879 1.1 christos NEXT (vpc);
2880 1.1 christos
2881 1.1 christos CASE (sem, INSN_LF_MADD_S) : /* lf.madd.s $rDSF,$rASF,$rBSF */
2882 1.1 christos {
2883 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2884 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2885 1.1 christos #define FLD(f) abuf->fields.sfmt_l_sll.f
2886 1.1 christos int UNUSED written = 0;
2887 1.1 christos IADDR UNUSED pc = abuf->addr;
2888 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2889 1.1 christos
2890 1.1 christos {
2891 1.1 christos SF opval = CGEN_CPU_FPU (current_cpu)->ops->addsf (CGEN_CPU_FPU (current_cpu), CGEN_CPU_FPU (current_cpu)->ops->mulsf (CGEN_CPU_FPU (current_cpu), GET_H_FSR (FLD (f_r2)), GET_H_FSR (FLD (f_r3))), GET_H_FSR (FLD (f_r1)));
2892 1.1 christos SET_H_FSR (FLD (f_r1), opval);
2893 1.1 christos CGEN_TRACE_RESULT (current_cpu, abuf, "fsr", 'f', opval);
2894 1.1 christos }
2895 1.1 christos
2896 1.1 christos #undef FLD
2897 1.1 christos }
2898 1.1 christos NEXT (vpc);
2899 1.1 christos
2900 1.1 christos CASE (sem, INSN_LF_CUST1_S) : /* lf.cust1.s $rASF,$rBSF */
2901 1.1 christos {
2902 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2903 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2904 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
2905 1.1 christos int UNUSED written = 0;
2906 1.1 christos IADDR UNUSED pc = abuf->addr;
2907 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2908 1.1 christos
2909 1.1 christos ((void) 0); /*nop*/
2910 1.1 christos
2911 1.1 christos #undef FLD
2912 1.1 christos }
2913 1.1 christos NEXT (vpc);
2914 1.1 christos
2915 1.1 christos
2916 1.1 christos }
2917 1.1 christos ENDSWITCH (sem) /* End of semantic switch. */
2918 1.1 christos
2919 1.1 christos /* At this point `vpc' contains the next insn to execute. */
2920 1.1 christos }
2921 1.1 christos
2922 1.1 christos #undef DEFINE_SWITCH
2923 1.1 christos #endif /* DEFINE_SWITCH */
2924