root / target-s390x / translate.c @ 640239b2
History | View | Annotate | Download (162 kB)
1 | 10ec5117 | Alexander Graf | /*
|
---|---|---|---|
2 | 10ec5117 | Alexander Graf | * S/390 translation
|
3 | 10ec5117 | Alexander Graf | *
|
4 | 10ec5117 | Alexander Graf | * Copyright (c) 2009 Ulrich Hecht
|
5 | e023e832 | Alexander Graf | * Copyright (c) 2010 Alexander Graf
|
6 | 10ec5117 | Alexander Graf | *
|
7 | 10ec5117 | Alexander Graf | * This library is free software; you can redistribute it and/or
|
8 | 10ec5117 | Alexander Graf | * modify it under the terms of the GNU Lesser General Public
|
9 | 10ec5117 | Alexander Graf | * License as published by the Free Software Foundation; either
|
10 | 10ec5117 | Alexander Graf | * version 2 of the License, or (at your option) any later version.
|
11 | 10ec5117 | Alexander Graf | *
|
12 | 10ec5117 | Alexander Graf | * This library is distributed in the hope that it will be useful,
|
13 | 10ec5117 | Alexander Graf | * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
14 | 10ec5117 | Alexander Graf | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
15 | 10ec5117 | Alexander Graf | * Lesser General Public License for more details.
|
16 | 10ec5117 | Alexander Graf | *
|
17 | 10ec5117 | Alexander Graf | * You should have received a copy of the GNU Lesser General Public
|
18 | 70539e18 | Blue Swirl | * License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
19 | 10ec5117 | Alexander Graf | */
|
20 | e023e832 | Alexander Graf | #include <stdarg.h> |
21 | e023e832 | Alexander Graf | #include <stdlib.h> |
22 | e023e832 | Alexander Graf | #include <stdio.h> |
23 | e023e832 | Alexander Graf | #include <string.h> |
24 | e023e832 | Alexander Graf | #include <inttypes.h> |
25 | e023e832 | Alexander Graf | |
26 | e023e832 | Alexander Graf | /* #define DEBUG_ILLEGAL_INSTRUCTIONS */
|
27 | e023e832 | Alexander Graf | /* #define DEBUG_INLINE_BRANCHES */
|
28 | e023e832 | Alexander Graf | #define S390X_DEBUG_DISAS
|
29 | e023e832 | Alexander Graf | /* #define S390X_DEBUG_DISAS_VERBOSE */
|
30 | e023e832 | Alexander Graf | |
31 | e023e832 | Alexander Graf | #ifdef S390X_DEBUG_DISAS_VERBOSE
|
32 | e023e832 | Alexander Graf | # define LOG_DISAS(...) qemu_log(__VA_ARGS__)
|
33 | e023e832 | Alexander Graf | #else
|
34 | e023e832 | Alexander Graf | # define LOG_DISAS(...) do { } while (0) |
35 | e023e832 | Alexander Graf | #endif
|
36 | 10ec5117 | Alexander Graf | |
37 | 10ec5117 | Alexander Graf | #include "cpu.h" |
38 | 10ec5117 | Alexander Graf | #include "exec-all.h" |
39 | 10ec5117 | Alexander Graf | #include "disas.h" |
40 | 10ec5117 | Alexander Graf | #include "tcg-op.h" |
41 | 10ec5117 | Alexander Graf | #include "qemu-log.h" |
42 | 10ec5117 | Alexander Graf | |
43 | e023e832 | Alexander Graf | /* global register indexes */
|
44 | e023e832 | Alexander Graf | static TCGv_ptr cpu_env;
|
45 | e023e832 | Alexander Graf | |
46 | e023e832 | Alexander Graf | #include "gen-icount.h" |
47 | e023e832 | Alexander Graf | #include "helpers.h" |
48 | e023e832 | Alexander Graf | #define GEN_HELPER 1 |
49 | e023e832 | Alexander Graf | #include "helpers.h" |
50 | e023e832 | Alexander Graf | |
51 | e023e832 | Alexander Graf | typedef struct DisasContext DisasContext; |
52 | e023e832 | Alexander Graf | struct DisasContext {
|
53 | e023e832 | Alexander Graf | uint64_t pc; |
54 | e023e832 | Alexander Graf | int is_jmp;
|
55 | e023e832 | Alexander Graf | enum cc_op cc_op;
|
56 | e023e832 | Alexander Graf | struct TranslationBlock *tb;
|
57 | e023e832 | Alexander Graf | }; |
58 | e023e832 | Alexander Graf | |
59 | e023e832 | Alexander Graf | #define DISAS_EXCP 4 |
60 | e023e832 | Alexander Graf | |
61 | e023e832 | Alexander Graf | static void gen_op_calc_cc(DisasContext *s); |
62 | e023e832 | Alexander Graf | |
63 | e023e832 | Alexander Graf | #ifdef DEBUG_INLINE_BRANCHES
|
64 | e023e832 | Alexander Graf | static uint64_t inline_branch_hit[CC_OP_MAX];
|
65 | e023e832 | Alexander Graf | static uint64_t inline_branch_miss[CC_OP_MAX];
|
66 | e023e832 | Alexander Graf | #endif
|
67 | e023e832 | Alexander Graf | |
68 | e023e832 | Alexander Graf | static inline void debug_insn(uint64_t insn) |
69 | e023e832 | Alexander Graf | { |
70 | e023e832 | Alexander Graf | LOG_DISAS("insn: 0x%" PRIx64 "\n", insn); |
71 | e023e832 | Alexander Graf | } |
72 | e023e832 | Alexander Graf | |
73 | e023e832 | Alexander Graf | static inline uint64_t pc_to_link_info(DisasContext *s, uint64_t pc) |
74 | e023e832 | Alexander Graf | { |
75 | e023e832 | Alexander Graf | if (!(s->tb->flags & FLAG_MASK_64)) {
|
76 | e023e832 | Alexander Graf | if (s->tb->flags & FLAG_MASK_32) {
|
77 | e023e832 | Alexander Graf | return pc | 0x80000000; |
78 | e023e832 | Alexander Graf | } |
79 | e023e832 | Alexander Graf | } |
80 | e023e832 | Alexander Graf | return pc;
|
81 | e023e832 | Alexander Graf | } |
82 | e023e832 | Alexander Graf | |
83 | 9a78eead | Stefan Weil | void cpu_dump_state(CPUState *env, FILE *f, fprintf_function cpu_fprintf,
|
84 | 10ec5117 | Alexander Graf | int flags)
|
85 | 10ec5117 | Alexander Graf | { |
86 | 10ec5117 | Alexander Graf | int i;
|
87 | e023e832 | Alexander Graf | |
88 | 10ec5117 | Alexander Graf | for (i = 0; i < 16; i++) { |
89 | e023e832 | Alexander Graf | cpu_fprintf(f, "R%02d=%016" PRIx64, i, env->regs[i]);
|
90 | 10ec5117 | Alexander Graf | if ((i % 4) == 3) { |
91 | 10ec5117 | Alexander Graf | cpu_fprintf(f, "\n");
|
92 | 10ec5117 | Alexander Graf | } else {
|
93 | 10ec5117 | Alexander Graf | cpu_fprintf(f, " ");
|
94 | 10ec5117 | Alexander Graf | } |
95 | 10ec5117 | Alexander Graf | } |
96 | e023e832 | Alexander Graf | |
97 | 10ec5117 | Alexander Graf | for (i = 0; i < 16; i++) { |
98 | bcec36ea | Alexander Graf | cpu_fprintf(f, "F%02d=%016" PRIx64, i, *(uint64_t *)&env->fregs[i]);
|
99 | 10ec5117 | Alexander Graf | if ((i % 4) == 3) { |
100 | 10ec5117 | Alexander Graf | cpu_fprintf(f, "\n");
|
101 | 10ec5117 | Alexander Graf | } else {
|
102 | 10ec5117 | Alexander Graf | cpu_fprintf(f, " ");
|
103 | 10ec5117 | Alexander Graf | } |
104 | 10ec5117 | Alexander Graf | } |
105 | e023e832 | Alexander Graf | |
106 | e023e832 | Alexander Graf | cpu_fprintf(f, "\n");
|
107 | e023e832 | Alexander Graf | |
108 | e023e832 | Alexander Graf | #ifndef CONFIG_USER_ONLY
|
109 | e023e832 | Alexander Graf | for (i = 0; i < 16; i++) { |
110 | e023e832 | Alexander Graf | cpu_fprintf(f, "C%02d=%016" PRIx64, i, env->cregs[i]);
|
111 | e023e832 | Alexander Graf | if ((i % 4) == 3) { |
112 | e023e832 | Alexander Graf | cpu_fprintf(f, "\n");
|
113 | e023e832 | Alexander Graf | } else {
|
114 | e023e832 | Alexander Graf | cpu_fprintf(f, " ");
|
115 | e023e832 | Alexander Graf | } |
116 | e023e832 | Alexander Graf | } |
117 | e023e832 | Alexander Graf | #endif
|
118 | e023e832 | Alexander Graf | |
119 | e023e832 | Alexander Graf | cpu_fprintf(f, "\n");
|
120 | e023e832 | Alexander Graf | |
121 | e023e832 | Alexander Graf | if (env->cc_op > 3) { |
122 | e023e832 | Alexander Graf | cpu_fprintf(f, "PSW=mask %016" PRIx64 " addr %016" PRIx64 " cc %15s\n", |
123 | e023e832 | Alexander Graf | env->psw.mask, env->psw.addr, cc_name(env->cc_op)); |
124 | e023e832 | Alexander Graf | } else {
|
125 | e023e832 | Alexander Graf | cpu_fprintf(f, "PSW=mask %016" PRIx64 " addr %016" PRIx64 " cc %02x\n", |
126 | e023e832 | Alexander Graf | env->psw.mask, env->psw.addr, env->cc_op); |
127 | e023e832 | Alexander Graf | } |
128 | e023e832 | Alexander Graf | |
129 | e023e832 | Alexander Graf | #ifdef DEBUG_INLINE_BRANCHES
|
130 | e023e832 | Alexander Graf | for (i = 0; i < CC_OP_MAX; i++) { |
131 | e023e832 | Alexander Graf | cpu_fprintf(f, " %15s = %10ld\t%10ld\n", cc_name(i),
|
132 | e023e832 | Alexander Graf | inline_branch_miss[i], inline_branch_hit[i]); |
133 | e023e832 | Alexander Graf | } |
134 | e023e832 | Alexander Graf | #endif
|
135 | 10ec5117 | Alexander Graf | } |
136 | 10ec5117 | Alexander Graf | |
137 | e023e832 | Alexander Graf | static TCGv_i64 psw_addr;
|
138 | e023e832 | Alexander Graf | static TCGv_i64 psw_mask;
|
139 | e023e832 | Alexander Graf | |
140 | e023e832 | Alexander Graf | static TCGv_i32 cc_op;
|
141 | e023e832 | Alexander Graf | static TCGv_i64 cc_src;
|
142 | e023e832 | Alexander Graf | static TCGv_i64 cc_dst;
|
143 | e023e832 | Alexander Graf | static TCGv_i64 cc_vr;
|
144 | e023e832 | Alexander Graf | |
145 | e023e832 | Alexander Graf | static char cpu_reg_names[10*3 + 6*4]; |
146 | e023e832 | Alexander Graf | static TCGv_i64 regs[16]; |
147 | e023e832 | Alexander Graf | |
148 | e023e832 | Alexander Graf | static uint8_t gen_opc_cc_op[OPC_BUF_SIZE];
|
149 | e023e832 | Alexander Graf | |
150 | d5a43964 | Alexander Graf | void s390x_translate_init(void) |
151 | d5a43964 | Alexander Graf | { |
152 | e023e832 | Alexander Graf | int i;
|
153 | e023e832 | Alexander Graf | size_t cpu_reg_names_size = sizeof(cpu_reg_names);
|
154 | e023e832 | Alexander Graf | char *p;
|
155 | e023e832 | Alexander Graf | |
156 | e023e832 | Alexander Graf | cpu_env = tcg_global_reg_new_ptr(TCG_AREG0, "env");
|
157 | e023e832 | Alexander Graf | psw_addr = tcg_global_mem_new_i64(TCG_AREG0, offsetof(CPUState, psw.addr), |
158 | e023e832 | Alexander Graf | "psw_addr");
|
159 | e023e832 | Alexander Graf | psw_mask = tcg_global_mem_new_i64(TCG_AREG0, offsetof(CPUState, psw.mask), |
160 | e023e832 | Alexander Graf | "psw_mask");
|
161 | e023e832 | Alexander Graf | |
162 | e023e832 | Alexander Graf | cc_op = tcg_global_mem_new_i32(TCG_AREG0, offsetof(CPUState, cc_op), |
163 | e023e832 | Alexander Graf | "cc_op");
|
164 | e023e832 | Alexander Graf | cc_src = tcg_global_mem_new_i64(TCG_AREG0, offsetof(CPUState, cc_src), |
165 | e023e832 | Alexander Graf | "cc_src");
|
166 | e023e832 | Alexander Graf | cc_dst = tcg_global_mem_new_i64(TCG_AREG0, offsetof(CPUState, cc_dst), |
167 | e023e832 | Alexander Graf | "cc_dst");
|
168 | e023e832 | Alexander Graf | cc_vr = tcg_global_mem_new_i64(TCG_AREG0, offsetof(CPUState, cc_vr), |
169 | e023e832 | Alexander Graf | "cc_vr");
|
170 | e023e832 | Alexander Graf | |
171 | e023e832 | Alexander Graf | p = cpu_reg_names; |
172 | e023e832 | Alexander Graf | for (i = 0; i < 16; i++) { |
173 | e023e832 | Alexander Graf | snprintf(p, cpu_reg_names_size, "r%d", i);
|
174 | e023e832 | Alexander Graf | regs[i] = tcg_global_mem_new(TCG_AREG0, |
175 | e023e832 | Alexander Graf | offsetof(CPUState, regs[i]), p); |
176 | e023e832 | Alexander Graf | p += (i < 10) ? 3 : 4; |
177 | e023e832 | Alexander Graf | cpu_reg_names_size -= (i < 10) ? 3 : 4; |
178 | e023e832 | Alexander Graf | } |
179 | d5a43964 | Alexander Graf | } |
180 | d5a43964 | Alexander Graf | |
181 | e023e832 | Alexander Graf | static inline TCGv_i64 load_reg(int reg) |
182 | 10ec5117 | Alexander Graf | { |
183 | e023e832 | Alexander Graf | TCGv_i64 r = tcg_temp_new_i64(); |
184 | e023e832 | Alexander Graf | tcg_gen_mov_i64(r, regs[reg]); |
185 | e023e832 | Alexander Graf | return r;
|
186 | 10ec5117 | Alexander Graf | } |
187 | 10ec5117 | Alexander Graf | |
188 | e023e832 | Alexander Graf | static inline TCGv_i64 load_freg(int reg) |
189 | 10ec5117 | Alexander Graf | { |
190 | e023e832 | Alexander Graf | TCGv_i64 r = tcg_temp_new_i64(); |
191 | e023e832 | Alexander Graf | tcg_gen_ld_i64(r, cpu_env, offsetof(CPUState, fregs[reg].d)); |
192 | e023e832 | Alexander Graf | return r;
|
193 | 10ec5117 | Alexander Graf | } |
194 | 10ec5117 | Alexander Graf | |
195 | e023e832 | Alexander Graf | static inline TCGv_i32 load_freg32(int reg) |
196 | 10ec5117 | Alexander Graf | { |
197 | e023e832 | Alexander Graf | TCGv_i32 r = tcg_temp_new_i32(); |
198 | e023e832 | Alexander Graf | tcg_gen_ld_i32(r, cpu_env, offsetof(CPUState, fregs[reg].l.upper)); |
199 | e023e832 | Alexander Graf | return r;
|
200 | e023e832 | Alexander Graf | } |
201 | e023e832 | Alexander Graf | |
202 | e023e832 | Alexander Graf | static inline TCGv_i32 load_reg32(int reg) |
203 | e023e832 | Alexander Graf | { |
204 | e023e832 | Alexander Graf | TCGv_i32 r = tcg_temp_new_i32(); |
205 | e023e832 | Alexander Graf | tcg_gen_trunc_i64_i32(r, regs[reg]); |
206 | e023e832 | Alexander Graf | return r;
|
207 | e023e832 | Alexander Graf | } |
208 | e023e832 | Alexander Graf | |
209 | e023e832 | Alexander Graf | static inline TCGv_i64 load_reg32_i64(int reg) |
210 | e023e832 | Alexander Graf | { |
211 | e023e832 | Alexander Graf | TCGv_i64 r = tcg_temp_new_i64(); |
212 | e023e832 | Alexander Graf | tcg_gen_ext32s_i64(r, regs[reg]); |
213 | e023e832 | Alexander Graf | return r;
|
214 | e023e832 | Alexander Graf | } |
215 | e023e832 | Alexander Graf | |
216 | e023e832 | Alexander Graf | static inline void store_reg(int reg, TCGv_i64 v) |
217 | e023e832 | Alexander Graf | { |
218 | e023e832 | Alexander Graf | tcg_gen_mov_i64(regs[reg], v); |
219 | e023e832 | Alexander Graf | } |
220 | e023e832 | Alexander Graf | |
221 | e023e832 | Alexander Graf | static inline void store_freg(int reg, TCGv_i64 v) |
222 | e023e832 | Alexander Graf | { |
223 | e023e832 | Alexander Graf | tcg_gen_st_i64(v, cpu_env, offsetof(CPUState, fregs[reg].d)); |
224 | e023e832 | Alexander Graf | } |
225 | e023e832 | Alexander Graf | |
226 | e023e832 | Alexander Graf | static inline void store_reg32(int reg, TCGv_i32 v) |
227 | e023e832 | Alexander Graf | { |
228 | e023e832 | Alexander Graf | #if HOST_LONG_BITS == 32 |
229 | e023e832 | Alexander Graf | tcg_gen_mov_i32(TCGV_LOW(regs[reg]), v); |
230 | e023e832 | Alexander Graf | #else
|
231 | e023e832 | Alexander Graf | TCGv_i64 tmp = tcg_temp_new_i64(); |
232 | e023e832 | Alexander Graf | tcg_gen_extu_i32_i64(tmp, v); |
233 | e023e832 | Alexander Graf | /* 32 bit register writes keep the upper half */
|
234 | e023e832 | Alexander Graf | tcg_gen_deposit_i64(regs[reg], regs[reg], tmp, 0, 32); |
235 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
236 | e023e832 | Alexander Graf | #endif
|
237 | e023e832 | Alexander Graf | } |
238 | e023e832 | Alexander Graf | |
239 | e023e832 | Alexander Graf | static inline void store_reg32_i64(int reg, TCGv_i64 v) |
240 | e023e832 | Alexander Graf | { |
241 | e023e832 | Alexander Graf | /* 32 bit register writes keep the upper half */
|
242 | e023e832 | Alexander Graf | #if HOST_LONG_BITS == 32 |
243 | e023e832 | Alexander Graf | tcg_gen_mov_i32(TCGV_LOW(regs[reg]), TCGV_LOW(v)); |
244 | e023e832 | Alexander Graf | #else
|
245 | e023e832 | Alexander Graf | tcg_gen_deposit_i64(regs[reg], regs[reg], v, 0, 32); |
246 | e023e832 | Alexander Graf | #endif
|
247 | e023e832 | Alexander Graf | } |
248 | e023e832 | Alexander Graf | |
249 | e023e832 | Alexander Graf | static inline void store_reg16(int reg, TCGv_i32 v) |
250 | e023e832 | Alexander Graf | { |
251 | e023e832 | Alexander Graf | TCGv_i64 tmp = tcg_temp_new_i64(); |
252 | e023e832 | Alexander Graf | tcg_gen_extu_i32_i64(tmp, v); |
253 | e023e832 | Alexander Graf | /* 16 bit register writes keep the upper bytes */
|
254 | e023e832 | Alexander Graf | tcg_gen_deposit_i64(regs[reg], regs[reg], tmp, 0, 16); |
255 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
256 | e023e832 | Alexander Graf | } |
257 | e023e832 | Alexander Graf | |
258 | e023e832 | Alexander Graf | static inline void store_reg8(int reg, TCGv_i64 v) |
259 | e023e832 | Alexander Graf | { |
260 | e023e832 | Alexander Graf | /* 8 bit register writes keep the upper bytes */
|
261 | e023e832 | Alexander Graf | tcg_gen_deposit_i64(regs[reg], regs[reg], v, 0, 8); |
262 | e023e832 | Alexander Graf | } |
263 | e023e832 | Alexander Graf | |
264 | e023e832 | Alexander Graf | static inline void store_freg32(int reg, TCGv_i32 v) |
265 | e023e832 | Alexander Graf | { |
266 | e023e832 | Alexander Graf | tcg_gen_st_i32(v, cpu_env, offsetof(CPUState, fregs[reg].l.upper)); |
267 | e023e832 | Alexander Graf | } |
268 | e023e832 | Alexander Graf | |
269 | e023e832 | Alexander Graf | static inline void update_psw_addr(DisasContext *s) |
270 | e023e832 | Alexander Graf | { |
271 | e023e832 | Alexander Graf | /* psw.addr */
|
272 | e023e832 | Alexander Graf | tcg_gen_movi_i64(psw_addr, s->pc); |
273 | e023e832 | Alexander Graf | } |
274 | e023e832 | Alexander Graf | |
275 | e023e832 | Alexander Graf | static inline void potential_page_fault(DisasContext *s) |
276 | e023e832 | Alexander Graf | { |
277 | e023e832 | Alexander Graf | #ifndef CONFIG_USER_ONLY
|
278 | e023e832 | Alexander Graf | update_psw_addr(s); |
279 | e023e832 | Alexander Graf | gen_op_calc_cc(s); |
280 | e023e832 | Alexander Graf | #endif
|
281 | e023e832 | Alexander Graf | } |
282 | e023e832 | Alexander Graf | |
283 | e023e832 | Alexander Graf | static inline uint64_t ld_code2(uint64_t pc) |
284 | e023e832 | Alexander Graf | { |
285 | e023e832 | Alexander Graf | return (uint64_t)lduw_code(pc);
|
286 | e023e832 | Alexander Graf | } |
287 | e023e832 | Alexander Graf | |
288 | e023e832 | Alexander Graf | static inline uint64_t ld_code4(uint64_t pc) |
289 | e023e832 | Alexander Graf | { |
290 | e023e832 | Alexander Graf | return (uint64_t)ldl_code(pc);
|
291 | e023e832 | Alexander Graf | } |
292 | e023e832 | Alexander Graf | |
293 | e023e832 | Alexander Graf | static inline uint64_t ld_code6(uint64_t pc) |
294 | e023e832 | Alexander Graf | { |
295 | e023e832 | Alexander Graf | uint64_t opc; |
296 | e023e832 | Alexander Graf | opc = (uint64_t)lduw_code(pc) << 32;
|
297 | e023e832 | Alexander Graf | opc |= (uint64_t)(uint32_t)ldl_code(pc+2);
|
298 | e023e832 | Alexander Graf | return opc;
|
299 | e023e832 | Alexander Graf | } |
300 | e023e832 | Alexander Graf | |
301 | e023e832 | Alexander Graf | static inline int get_mem_index(DisasContext *s) |
302 | e023e832 | Alexander Graf | { |
303 | e023e832 | Alexander Graf | switch (s->tb->flags & FLAG_MASK_ASC) {
|
304 | e023e832 | Alexander Graf | case PSW_ASC_PRIMARY >> 32: |
305 | e023e832 | Alexander Graf | return 0; |
306 | e023e832 | Alexander Graf | case PSW_ASC_SECONDARY >> 32: |
307 | e023e832 | Alexander Graf | return 1; |
308 | e023e832 | Alexander Graf | case PSW_ASC_HOME >> 32: |
309 | e023e832 | Alexander Graf | return 2; |
310 | e023e832 | Alexander Graf | default:
|
311 | e023e832 | Alexander Graf | tcg_abort(); |
312 | e023e832 | Alexander Graf | break;
|
313 | e023e832 | Alexander Graf | } |
314 | e023e832 | Alexander Graf | } |
315 | e023e832 | Alexander Graf | |
316 | e023e832 | Alexander Graf | static inline void gen_debug(DisasContext *s) |
317 | e023e832 | Alexander Graf | { |
318 | e023e832 | Alexander Graf | TCGv_i32 tmp = tcg_const_i32(EXCP_DEBUG); |
319 | e023e832 | Alexander Graf | update_psw_addr(s); |
320 | e023e832 | Alexander Graf | gen_op_calc_cc(s); |
321 | e023e832 | Alexander Graf | gen_helper_exception(tmp); |
322 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp); |
323 | e023e832 | Alexander Graf | s->is_jmp = DISAS_EXCP; |
324 | e023e832 | Alexander Graf | } |
325 | e023e832 | Alexander Graf | |
326 | e023e832 | Alexander Graf | #ifdef CONFIG_USER_ONLY
|
327 | e023e832 | Alexander Graf | |
328 | e023e832 | Alexander Graf | static void gen_illegal_opcode(DisasContext *s, int ilc) |
329 | e023e832 | Alexander Graf | { |
330 | e023e832 | Alexander Graf | TCGv_i32 tmp = tcg_const_i32(EXCP_SPEC); |
331 | e023e832 | Alexander Graf | update_psw_addr(s); |
332 | e023e832 | Alexander Graf | gen_op_calc_cc(s); |
333 | e023e832 | Alexander Graf | gen_helper_exception(tmp); |
334 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp); |
335 | e023e832 | Alexander Graf | s->is_jmp = DISAS_EXCP; |
336 | e023e832 | Alexander Graf | } |
337 | e023e832 | Alexander Graf | |
338 | e023e832 | Alexander Graf | #else /* CONFIG_USER_ONLY */ |
339 | e023e832 | Alexander Graf | |
340 | e023e832 | Alexander Graf | static void debug_print_inst(DisasContext *s, int ilc) |
341 | e023e832 | Alexander Graf | { |
342 | e023e832 | Alexander Graf | #ifdef DEBUG_ILLEGAL_INSTRUCTIONS
|
343 | e023e832 | Alexander Graf | uint64_t inst = 0;
|
344 | e023e832 | Alexander Graf | |
345 | e023e832 | Alexander Graf | switch (ilc & 3) { |
346 | e023e832 | Alexander Graf | case 1: |
347 | e023e832 | Alexander Graf | inst = ld_code2(s->pc); |
348 | e023e832 | Alexander Graf | break;
|
349 | e023e832 | Alexander Graf | case 2: |
350 | e023e832 | Alexander Graf | inst = ld_code4(s->pc); |
351 | e023e832 | Alexander Graf | break;
|
352 | e023e832 | Alexander Graf | case 3: |
353 | e023e832 | Alexander Graf | inst = ld_code6(s->pc); |
354 | e023e832 | Alexander Graf | break;
|
355 | e023e832 | Alexander Graf | } |
356 | e023e832 | Alexander Graf | |
357 | e023e832 | Alexander Graf | fprintf(stderr, "Illegal instruction [%d at %016" PRIx64 "]: 0x%016" |
358 | e023e832 | Alexander Graf | PRIx64 "\n", ilc, s->pc, inst);
|
359 | e023e832 | Alexander Graf | #endif
|
360 | e023e832 | Alexander Graf | } |
361 | e023e832 | Alexander Graf | |
362 | e023e832 | Alexander Graf | static void gen_program_exception(DisasContext *s, int ilc, int code) |
363 | e023e832 | Alexander Graf | { |
364 | e023e832 | Alexander Graf | TCGv_i32 tmp; |
365 | e023e832 | Alexander Graf | |
366 | e023e832 | Alexander Graf | debug_print_inst(s, ilc); |
367 | e023e832 | Alexander Graf | |
368 | e023e832 | Alexander Graf | /* remember what pgm exeption this was */
|
369 | e023e832 | Alexander Graf | tmp = tcg_const_i32(code); |
370 | e023e832 | Alexander Graf | tcg_gen_st_i32(tmp, cpu_env, offsetof(CPUState, int_pgm_code)); |
371 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp); |
372 | e023e832 | Alexander Graf | |
373 | e023e832 | Alexander Graf | tmp = tcg_const_i32(ilc); |
374 | e023e832 | Alexander Graf | tcg_gen_st_i32(tmp, cpu_env, offsetof(CPUState, int_pgm_ilc)); |
375 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp); |
376 | e023e832 | Alexander Graf | |
377 | e023e832 | Alexander Graf | /* advance past instruction */
|
378 | e023e832 | Alexander Graf | s->pc += (ilc * 2);
|
379 | e023e832 | Alexander Graf | update_psw_addr(s); |
380 | e023e832 | Alexander Graf | |
381 | e023e832 | Alexander Graf | /* save off cc */
|
382 | e023e832 | Alexander Graf | gen_op_calc_cc(s); |
383 | e023e832 | Alexander Graf | |
384 | e023e832 | Alexander Graf | /* trigger exception */
|
385 | e023e832 | Alexander Graf | tmp = tcg_const_i32(EXCP_PGM); |
386 | e023e832 | Alexander Graf | gen_helper_exception(tmp); |
387 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp); |
388 | e023e832 | Alexander Graf | |
389 | e023e832 | Alexander Graf | /* end TB here */
|
390 | e023e832 | Alexander Graf | s->is_jmp = DISAS_EXCP; |
391 | e023e832 | Alexander Graf | } |
392 | e023e832 | Alexander Graf | |
393 | e023e832 | Alexander Graf | |
394 | e023e832 | Alexander Graf | static void gen_illegal_opcode(DisasContext *s, int ilc) |
395 | e023e832 | Alexander Graf | { |
396 | e023e832 | Alexander Graf | gen_program_exception(s, ilc, PGM_SPECIFICATION); |
397 | e023e832 | Alexander Graf | } |
398 | e023e832 | Alexander Graf | |
399 | e023e832 | Alexander Graf | static void gen_privileged_exception(DisasContext *s, int ilc) |
400 | e023e832 | Alexander Graf | { |
401 | e023e832 | Alexander Graf | gen_program_exception(s, ilc, PGM_PRIVILEGED); |
402 | e023e832 | Alexander Graf | } |
403 | e023e832 | Alexander Graf | |
404 | e023e832 | Alexander Graf | static void check_privileged(DisasContext *s, int ilc) |
405 | e023e832 | Alexander Graf | { |
406 | e023e832 | Alexander Graf | if (s->tb->flags & (PSW_MASK_PSTATE >> 32)) { |
407 | e023e832 | Alexander Graf | gen_privileged_exception(s, ilc); |
408 | e023e832 | Alexander Graf | } |
409 | e023e832 | Alexander Graf | } |
410 | e023e832 | Alexander Graf | |
411 | e023e832 | Alexander Graf | #endif /* CONFIG_USER_ONLY */ |
412 | e023e832 | Alexander Graf | |
413 | e023e832 | Alexander Graf | static TCGv_i64 get_address(DisasContext *s, int x2, int b2, int d2) |
414 | e023e832 | Alexander Graf | { |
415 | e023e832 | Alexander Graf | TCGv_i64 tmp; |
416 | e023e832 | Alexander Graf | |
417 | e023e832 | Alexander Graf | /* 31-bitify the immediate part; register contents are dealt with below */
|
418 | e023e832 | Alexander Graf | if (!(s->tb->flags & FLAG_MASK_64)) {
|
419 | e023e832 | Alexander Graf | d2 &= 0x7fffffffUL;
|
420 | e023e832 | Alexander Graf | } |
421 | e023e832 | Alexander Graf | |
422 | e023e832 | Alexander Graf | if (x2) {
|
423 | e023e832 | Alexander Graf | if (d2) {
|
424 | e023e832 | Alexander Graf | tmp = tcg_const_i64(d2); |
425 | e023e832 | Alexander Graf | tcg_gen_add_i64(tmp, tmp, regs[x2]); |
426 | e023e832 | Alexander Graf | } else {
|
427 | e023e832 | Alexander Graf | tmp = load_reg(x2); |
428 | e023e832 | Alexander Graf | } |
429 | e023e832 | Alexander Graf | if (b2) {
|
430 | e023e832 | Alexander Graf | tcg_gen_add_i64(tmp, tmp, regs[b2]); |
431 | e023e832 | Alexander Graf | } |
432 | e023e832 | Alexander Graf | } else if (b2) { |
433 | e023e832 | Alexander Graf | if (d2) {
|
434 | e023e832 | Alexander Graf | tmp = tcg_const_i64(d2); |
435 | e023e832 | Alexander Graf | tcg_gen_add_i64(tmp, tmp, regs[b2]); |
436 | e023e832 | Alexander Graf | } else {
|
437 | e023e832 | Alexander Graf | tmp = load_reg(b2); |
438 | e023e832 | Alexander Graf | } |
439 | e023e832 | Alexander Graf | } else {
|
440 | e023e832 | Alexander Graf | tmp = tcg_const_i64(d2); |
441 | e023e832 | Alexander Graf | } |
442 | e023e832 | Alexander Graf | |
443 | e023e832 | Alexander Graf | /* 31-bit mode mask if there are values loaded from registers */
|
444 | e023e832 | Alexander Graf | if (!(s->tb->flags & FLAG_MASK_64) && (x2 || b2)) {
|
445 | e023e832 | Alexander Graf | tcg_gen_andi_i64(tmp, tmp, 0x7fffffffUL);
|
446 | e023e832 | Alexander Graf | } |
447 | e023e832 | Alexander Graf | |
448 | e023e832 | Alexander Graf | return tmp;
|
449 | e023e832 | Alexander Graf | } |
450 | e023e832 | Alexander Graf | |
451 | e023e832 | Alexander Graf | static void gen_op_movi_cc(DisasContext *s, uint32_t val) |
452 | e023e832 | Alexander Graf | { |
453 | e023e832 | Alexander Graf | s->cc_op = CC_OP_CONST0 + val; |
454 | e023e832 | Alexander Graf | } |
455 | e023e832 | Alexander Graf | |
456 | e023e832 | Alexander Graf | static void gen_op_update1_cc_i64(DisasContext *s, enum cc_op op, TCGv_i64 dst) |
457 | e023e832 | Alexander Graf | { |
458 | e023e832 | Alexander Graf | tcg_gen_discard_i64(cc_src); |
459 | e023e832 | Alexander Graf | tcg_gen_mov_i64(cc_dst, dst); |
460 | e023e832 | Alexander Graf | tcg_gen_discard_i64(cc_vr); |
461 | e023e832 | Alexander Graf | s->cc_op = op; |
462 | e023e832 | Alexander Graf | } |
463 | e023e832 | Alexander Graf | |
464 | e023e832 | Alexander Graf | static void gen_op_update1_cc_i32(DisasContext *s, enum cc_op op, TCGv_i32 dst) |
465 | e023e832 | Alexander Graf | { |
466 | e023e832 | Alexander Graf | tcg_gen_discard_i64(cc_src); |
467 | e023e832 | Alexander Graf | tcg_gen_extu_i32_i64(cc_dst, dst); |
468 | e023e832 | Alexander Graf | tcg_gen_discard_i64(cc_vr); |
469 | e023e832 | Alexander Graf | s->cc_op = op; |
470 | e023e832 | Alexander Graf | } |
471 | e023e832 | Alexander Graf | |
472 | e023e832 | Alexander Graf | static void gen_op_update2_cc_i64(DisasContext *s, enum cc_op op, TCGv_i64 src, |
473 | e023e832 | Alexander Graf | TCGv_i64 dst) |
474 | e023e832 | Alexander Graf | { |
475 | e023e832 | Alexander Graf | tcg_gen_mov_i64(cc_src, src); |
476 | e023e832 | Alexander Graf | tcg_gen_mov_i64(cc_dst, dst); |
477 | e023e832 | Alexander Graf | tcg_gen_discard_i64(cc_vr); |
478 | e023e832 | Alexander Graf | s->cc_op = op; |
479 | e023e832 | Alexander Graf | } |
480 | e023e832 | Alexander Graf | |
481 | e023e832 | Alexander Graf | static void gen_op_update2_cc_i32(DisasContext *s, enum cc_op op, TCGv_i32 src, |
482 | e023e832 | Alexander Graf | TCGv_i32 dst) |
483 | e023e832 | Alexander Graf | { |
484 | e023e832 | Alexander Graf | tcg_gen_extu_i32_i64(cc_src, src); |
485 | e023e832 | Alexander Graf | tcg_gen_extu_i32_i64(cc_dst, dst); |
486 | e023e832 | Alexander Graf | tcg_gen_discard_i64(cc_vr); |
487 | e023e832 | Alexander Graf | s->cc_op = op; |
488 | e023e832 | Alexander Graf | } |
489 | e023e832 | Alexander Graf | |
490 | e023e832 | Alexander Graf | static void gen_op_update3_cc_i64(DisasContext *s, enum cc_op op, TCGv_i64 src, |
491 | e023e832 | Alexander Graf | TCGv_i64 dst, TCGv_i64 vr) |
492 | e023e832 | Alexander Graf | { |
493 | e023e832 | Alexander Graf | tcg_gen_mov_i64(cc_src, src); |
494 | e023e832 | Alexander Graf | tcg_gen_mov_i64(cc_dst, dst); |
495 | e023e832 | Alexander Graf | tcg_gen_mov_i64(cc_vr, vr); |
496 | e023e832 | Alexander Graf | s->cc_op = op; |
497 | e023e832 | Alexander Graf | } |
498 | e023e832 | Alexander Graf | |
499 | e023e832 | Alexander Graf | static void gen_op_update3_cc_i32(DisasContext *s, enum cc_op op, TCGv_i32 src, |
500 | e023e832 | Alexander Graf | TCGv_i32 dst, TCGv_i32 vr) |
501 | e023e832 | Alexander Graf | { |
502 | e023e832 | Alexander Graf | tcg_gen_extu_i32_i64(cc_src, src); |
503 | e023e832 | Alexander Graf | tcg_gen_extu_i32_i64(cc_dst, dst); |
504 | e023e832 | Alexander Graf | tcg_gen_extu_i32_i64(cc_vr, vr); |
505 | e023e832 | Alexander Graf | s->cc_op = op; |
506 | e023e832 | Alexander Graf | } |
507 | e023e832 | Alexander Graf | |
508 | e023e832 | Alexander Graf | static inline void set_cc_nz_u32(DisasContext *s, TCGv_i32 val) |
509 | e023e832 | Alexander Graf | { |
510 | e023e832 | Alexander Graf | gen_op_update1_cc_i32(s, CC_OP_NZ, val); |
511 | e023e832 | Alexander Graf | } |
512 | e023e832 | Alexander Graf | |
513 | e023e832 | Alexander Graf | static inline void set_cc_nz_u64(DisasContext *s, TCGv_i64 val) |
514 | e023e832 | Alexander Graf | { |
515 | e023e832 | Alexander Graf | gen_op_update1_cc_i64(s, CC_OP_NZ, val); |
516 | e023e832 | Alexander Graf | } |
517 | e023e832 | Alexander Graf | |
518 | e023e832 | Alexander Graf | static inline void cmp_32(DisasContext *s, TCGv_i32 v1, TCGv_i32 v2, |
519 | e023e832 | Alexander Graf | enum cc_op cond)
|
520 | e023e832 | Alexander Graf | { |
521 | e023e832 | Alexander Graf | gen_op_update2_cc_i32(s, cond, v1, v2); |
522 | e023e832 | Alexander Graf | } |
523 | e023e832 | Alexander Graf | |
524 | e023e832 | Alexander Graf | static inline void cmp_64(DisasContext *s, TCGv_i64 v1, TCGv_i64 v2, |
525 | e023e832 | Alexander Graf | enum cc_op cond)
|
526 | e023e832 | Alexander Graf | { |
527 | e023e832 | Alexander Graf | gen_op_update2_cc_i64(s, cond, v1, v2); |
528 | e023e832 | Alexander Graf | } |
529 | e023e832 | Alexander Graf | |
530 | e023e832 | Alexander Graf | static inline void cmp_s32(DisasContext *s, TCGv_i32 v1, TCGv_i32 v2) |
531 | e023e832 | Alexander Graf | { |
532 | e023e832 | Alexander Graf | cmp_32(s, v1, v2, CC_OP_LTGT_32); |
533 | e023e832 | Alexander Graf | } |
534 | e023e832 | Alexander Graf | |
535 | e023e832 | Alexander Graf | static inline void cmp_u32(DisasContext *s, TCGv_i32 v1, TCGv_i32 v2) |
536 | e023e832 | Alexander Graf | { |
537 | e023e832 | Alexander Graf | cmp_32(s, v1, v2, CC_OP_LTUGTU_32); |
538 | e023e832 | Alexander Graf | } |
539 | e023e832 | Alexander Graf | |
540 | e023e832 | Alexander Graf | static inline void cmp_s32c(DisasContext *s, TCGv_i32 v1, int32_t v2) |
541 | e023e832 | Alexander Graf | { |
542 | e023e832 | Alexander Graf | /* XXX optimize for the constant? put it in s? */
|
543 | e023e832 | Alexander Graf | TCGv_i32 tmp = tcg_const_i32(v2); |
544 | e023e832 | Alexander Graf | cmp_32(s, v1, tmp, CC_OP_LTGT_32); |
545 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp); |
546 | e023e832 | Alexander Graf | } |
547 | e023e832 | Alexander Graf | |
548 | e023e832 | Alexander Graf | static inline void cmp_u32c(DisasContext *s, TCGv_i32 v1, uint32_t v2) |
549 | e023e832 | Alexander Graf | { |
550 | e023e832 | Alexander Graf | TCGv_i32 tmp = tcg_const_i32(v2); |
551 | e023e832 | Alexander Graf | cmp_32(s, v1, tmp, CC_OP_LTUGTU_32); |
552 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp); |
553 | e023e832 | Alexander Graf | } |
554 | e023e832 | Alexander Graf | |
555 | e023e832 | Alexander Graf | static inline void cmp_s64(DisasContext *s, TCGv_i64 v1, TCGv_i64 v2) |
556 | e023e832 | Alexander Graf | { |
557 | e023e832 | Alexander Graf | cmp_64(s, v1, v2, CC_OP_LTGT_64); |
558 | e023e832 | Alexander Graf | } |
559 | e023e832 | Alexander Graf | |
560 | e023e832 | Alexander Graf | static inline void cmp_u64(DisasContext *s, TCGv_i64 v1, TCGv_i64 v2) |
561 | e023e832 | Alexander Graf | { |
562 | e023e832 | Alexander Graf | cmp_64(s, v1, v2, CC_OP_LTUGTU_64); |
563 | e023e832 | Alexander Graf | } |
564 | e023e832 | Alexander Graf | |
565 | e023e832 | Alexander Graf | static inline void cmp_s64c(DisasContext *s, TCGv_i64 v1, int64_t v2) |
566 | e023e832 | Alexander Graf | { |
567 | e023e832 | Alexander Graf | TCGv_i64 tmp = tcg_const_i64(v2); |
568 | e023e832 | Alexander Graf | cmp_s64(s, v1, tmp); |
569 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
570 | e023e832 | Alexander Graf | } |
571 | e023e832 | Alexander Graf | |
572 | e023e832 | Alexander Graf | static inline void cmp_u64c(DisasContext *s, TCGv_i64 v1, uint64_t v2) |
573 | e023e832 | Alexander Graf | { |
574 | e023e832 | Alexander Graf | TCGv_i64 tmp = tcg_const_i64(v2); |
575 | e023e832 | Alexander Graf | cmp_u64(s, v1, tmp); |
576 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
577 | e023e832 | Alexander Graf | } |
578 | e023e832 | Alexander Graf | |
579 | e023e832 | Alexander Graf | static inline void set_cc_s32(DisasContext *s, TCGv_i32 val) |
580 | e023e832 | Alexander Graf | { |
581 | e023e832 | Alexander Graf | gen_op_update1_cc_i32(s, CC_OP_LTGT0_32, val); |
582 | e023e832 | Alexander Graf | } |
583 | e023e832 | Alexander Graf | |
584 | e023e832 | Alexander Graf | static inline void set_cc_s64(DisasContext *s, TCGv_i64 val) |
585 | e023e832 | Alexander Graf | { |
586 | e023e832 | Alexander Graf | gen_op_update1_cc_i64(s, CC_OP_LTGT0_64, val); |
587 | e023e832 | Alexander Graf | } |
588 | e023e832 | Alexander Graf | |
589 | e023e832 | Alexander Graf | static void set_cc_add64(DisasContext *s, TCGv_i64 v1, TCGv_i64 v2, TCGv_i64 vr) |
590 | e023e832 | Alexander Graf | { |
591 | e023e832 | Alexander Graf | gen_op_update3_cc_i64(s, CC_OP_ADD_64, v1, v2, vr); |
592 | e023e832 | Alexander Graf | } |
593 | e023e832 | Alexander Graf | |
594 | e023e832 | Alexander Graf | static void set_cc_addu64(DisasContext *s, TCGv_i64 v1, TCGv_i64 v2, |
595 | e023e832 | Alexander Graf | TCGv_i64 vr) |
596 | e023e832 | Alexander Graf | { |
597 | e023e832 | Alexander Graf | gen_op_update3_cc_i64(s, CC_OP_ADDU_64, v1, v2, vr); |
598 | e023e832 | Alexander Graf | } |
599 | e023e832 | Alexander Graf | |
600 | e023e832 | Alexander Graf | static void set_cc_sub64(DisasContext *s, TCGv_i64 v1, TCGv_i64 v2, TCGv_i64 vr) |
601 | e023e832 | Alexander Graf | { |
602 | e023e832 | Alexander Graf | gen_op_update3_cc_i64(s, CC_OP_SUB_64, v1, v2, vr); |
603 | e023e832 | Alexander Graf | } |
604 | e023e832 | Alexander Graf | |
605 | e023e832 | Alexander Graf | static void set_cc_subu64(DisasContext *s, TCGv_i64 v1, TCGv_i64 v2, |
606 | e023e832 | Alexander Graf | TCGv_i64 vr) |
607 | e023e832 | Alexander Graf | { |
608 | e023e832 | Alexander Graf | gen_op_update3_cc_i64(s, CC_OP_SUBU_64, v1, v2, vr); |
609 | e023e832 | Alexander Graf | } |
610 | e023e832 | Alexander Graf | |
611 | e023e832 | Alexander Graf | static void set_cc_abs64(DisasContext *s, TCGv_i64 v1) |
612 | e023e832 | Alexander Graf | { |
613 | e023e832 | Alexander Graf | gen_op_update1_cc_i64(s, CC_OP_ABS_64, v1); |
614 | e023e832 | Alexander Graf | } |
615 | e023e832 | Alexander Graf | |
616 | e023e832 | Alexander Graf | static void set_cc_nabs64(DisasContext *s, TCGv_i64 v1) |
617 | e023e832 | Alexander Graf | { |
618 | e023e832 | Alexander Graf | gen_op_update1_cc_i64(s, CC_OP_NABS_64, v1); |
619 | e023e832 | Alexander Graf | } |
620 | e023e832 | Alexander Graf | |
621 | e023e832 | Alexander Graf | static void set_cc_add32(DisasContext *s, TCGv_i32 v1, TCGv_i32 v2, TCGv_i32 vr) |
622 | e023e832 | Alexander Graf | { |
623 | e023e832 | Alexander Graf | gen_op_update3_cc_i32(s, CC_OP_ADD_32, v1, v2, vr); |
624 | e023e832 | Alexander Graf | } |
625 | e023e832 | Alexander Graf | |
626 | e023e832 | Alexander Graf | static void set_cc_addu32(DisasContext *s, TCGv_i32 v1, TCGv_i32 v2, |
627 | e023e832 | Alexander Graf | TCGv_i32 vr) |
628 | e023e832 | Alexander Graf | { |
629 | e023e832 | Alexander Graf | gen_op_update3_cc_i32(s, CC_OP_ADDU_32, v1, v2, vr); |
630 | e023e832 | Alexander Graf | } |
631 | e023e832 | Alexander Graf | |
632 | e023e832 | Alexander Graf | static void set_cc_sub32(DisasContext *s, TCGv_i32 v1, TCGv_i32 v2, TCGv_i32 vr) |
633 | e023e832 | Alexander Graf | { |
634 | e023e832 | Alexander Graf | gen_op_update3_cc_i32(s, CC_OP_SUB_32, v1, v2, vr); |
635 | e023e832 | Alexander Graf | } |
636 | e023e832 | Alexander Graf | |
637 | e023e832 | Alexander Graf | static void set_cc_subu32(DisasContext *s, TCGv_i32 v1, TCGv_i32 v2, |
638 | e023e832 | Alexander Graf | TCGv_i32 vr) |
639 | e023e832 | Alexander Graf | { |
640 | e023e832 | Alexander Graf | gen_op_update3_cc_i32(s, CC_OP_SUBU_32, v1, v2, vr); |
641 | e023e832 | Alexander Graf | } |
642 | e023e832 | Alexander Graf | |
643 | e023e832 | Alexander Graf | static void set_cc_abs32(DisasContext *s, TCGv_i32 v1) |
644 | e023e832 | Alexander Graf | { |
645 | e023e832 | Alexander Graf | gen_op_update1_cc_i32(s, CC_OP_ABS_32, v1); |
646 | e023e832 | Alexander Graf | } |
647 | e023e832 | Alexander Graf | |
648 | e023e832 | Alexander Graf | static void set_cc_nabs32(DisasContext *s, TCGv_i32 v1) |
649 | e023e832 | Alexander Graf | { |
650 | e023e832 | Alexander Graf | gen_op_update1_cc_i32(s, CC_OP_NABS_32, v1); |
651 | e023e832 | Alexander Graf | } |
652 | e023e832 | Alexander Graf | |
653 | e023e832 | Alexander Graf | static void set_cc_comp32(DisasContext *s, TCGv_i32 v1) |
654 | e023e832 | Alexander Graf | { |
655 | e023e832 | Alexander Graf | gen_op_update1_cc_i32(s, CC_OP_COMP_32, v1); |
656 | e023e832 | Alexander Graf | } |
657 | e023e832 | Alexander Graf | |
658 | e023e832 | Alexander Graf | static void set_cc_comp64(DisasContext *s, TCGv_i64 v1) |
659 | e023e832 | Alexander Graf | { |
660 | e023e832 | Alexander Graf | gen_op_update1_cc_i64(s, CC_OP_COMP_64, v1); |
661 | e023e832 | Alexander Graf | } |
662 | e023e832 | Alexander Graf | |
663 | e023e832 | Alexander Graf | static void set_cc_icm(DisasContext *s, TCGv_i32 v1, TCGv_i32 v2) |
664 | e023e832 | Alexander Graf | { |
665 | e023e832 | Alexander Graf | gen_op_update2_cc_i32(s, CC_OP_ICM, v1, v2); |
666 | e023e832 | Alexander Graf | } |
667 | e023e832 | Alexander Graf | |
668 | e023e832 | Alexander Graf | static void set_cc_cmp_f32_i64(DisasContext *s, TCGv_i32 v1, TCGv_i64 v2) |
669 | e023e832 | Alexander Graf | { |
670 | e023e832 | Alexander Graf | tcg_gen_extu_i32_i64(cc_src, v1); |
671 | e023e832 | Alexander Graf | tcg_gen_mov_i64(cc_dst, v2); |
672 | e023e832 | Alexander Graf | tcg_gen_discard_i64(cc_vr); |
673 | e023e832 | Alexander Graf | s->cc_op = CC_OP_LTGT_F32; |
674 | e023e832 | Alexander Graf | } |
675 | e023e832 | Alexander Graf | |
676 | e023e832 | Alexander Graf | static void set_cc_nz_f32(DisasContext *s, TCGv_i32 v1) |
677 | e023e832 | Alexander Graf | { |
678 | e023e832 | Alexander Graf | gen_op_update1_cc_i32(s, CC_OP_NZ_F32, v1); |
679 | e023e832 | Alexander Graf | } |
680 | e023e832 | Alexander Graf | |
681 | e023e832 | Alexander Graf | static inline void set_cc_nz_f64(DisasContext *s, TCGv_i64 v1) |
682 | e023e832 | Alexander Graf | { |
683 | e023e832 | Alexander Graf | gen_op_update1_cc_i64(s, CC_OP_NZ_F64, v1); |
684 | e023e832 | Alexander Graf | } |
685 | e023e832 | Alexander Graf | |
686 | e023e832 | Alexander Graf | /* CC value is in env->cc_op */
|
687 | e023e832 | Alexander Graf | static inline void set_cc_static(DisasContext *s) |
688 | e023e832 | Alexander Graf | { |
689 | e023e832 | Alexander Graf | tcg_gen_discard_i64(cc_src); |
690 | e023e832 | Alexander Graf | tcg_gen_discard_i64(cc_dst); |
691 | e023e832 | Alexander Graf | tcg_gen_discard_i64(cc_vr); |
692 | e023e832 | Alexander Graf | s->cc_op = CC_OP_STATIC; |
693 | e023e832 | Alexander Graf | } |
694 | e023e832 | Alexander Graf | |
695 | e023e832 | Alexander Graf | static inline void gen_op_set_cc_op(DisasContext *s) |
696 | e023e832 | Alexander Graf | { |
697 | e023e832 | Alexander Graf | if (s->cc_op != CC_OP_DYNAMIC && s->cc_op != CC_OP_STATIC) {
|
698 | e023e832 | Alexander Graf | tcg_gen_movi_i32(cc_op, s->cc_op); |
699 | e023e832 | Alexander Graf | } |
700 | e023e832 | Alexander Graf | } |
701 | e023e832 | Alexander Graf | |
702 | e023e832 | Alexander Graf | static inline void gen_update_cc_op(DisasContext *s) |
703 | e023e832 | Alexander Graf | { |
704 | e023e832 | Alexander Graf | gen_op_set_cc_op(s); |
705 | e023e832 | Alexander Graf | } |
706 | e023e832 | Alexander Graf | |
707 | e023e832 | Alexander Graf | /* calculates cc into cc_op */
|
708 | e023e832 | Alexander Graf | static void gen_op_calc_cc(DisasContext *s) |
709 | e023e832 | Alexander Graf | { |
710 | e023e832 | Alexander Graf | TCGv_i32 local_cc_op = tcg_const_i32(s->cc_op); |
711 | e023e832 | Alexander Graf | TCGv_i64 dummy = tcg_const_i64(0);
|
712 | e023e832 | Alexander Graf | |
713 | e023e832 | Alexander Graf | switch (s->cc_op) {
|
714 | e023e832 | Alexander Graf | case CC_OP_CONST0:
|
715 | e023e832 | Alexander Graf | case CC_OP_CONST1:
|
716 | e023e832 | Alexander Graf | case CC_OP_CONST2:
|
717 | e023e832 | Alexander Graf | case CC_OP_CONST3:
|
718 | e023e832 | Alexander Graf | /* s->cc_op is the cc value */
|
719 | e023e832 | Alexander Graf | tcg_gen_movi_i32(cc_op, s->cc_op - CC_OP_CONST0); |
720 | e023e832 | Alexander Graf | break;
|
721 | e023e832 | Alexander Graf | case CC_OP_STATIC:
|
722 | e023e832 | Alexander Graf | /* env->cc_op already is the cc value */
|
723 | e023e832 | Alexander Graf | break;
|
724 | e023e832 | Alexander Graf | case CC_OP_NZ:
|
725 | e023e832 | Alexander Graf | case CC_OP_ABS_64:
|
726 | e023e832 | Alexander Graf | case CC_OP_NABS_64:
|
727 | e023e832 | Alexander Graf | case CC_OP_ABS_32:
|
728 | e023e832 | Alexander Graf | case CC_OP_NABS_32:
|
729 | e023e832 | Alexander Graf | case CC_OP_LTGT0_32:
|
730 | e023e832 | Alexander Graf | case CC_OP_LTGT0_64:
|
731 | e023e832 | Alexander Graf | case CC_OP_COMP_32:
|
732 | e023e832 | Alexander Graf | case CC_OP_COMP_64:
|
733 | e023e832 | Alexander Graf | case CC_OP_NZ_F32:
|
734 | e023e832 | Alexander Graf | case CC_OP_NZ_F64:
|
735 | e023e832 | Alexander Graf | /* 1 argument */
|
736 | e023e832 | Alexander Graf | gen_helper_calc_cc(cc_op, local_cc_op, dummy, cc_dst, dummy); |
737 | e023e832 | Alexander Graf | break;
|
738 | e023e832 | Alexander Graf | case CC_OP_ICM:
|
739 | e023e832 | Alexander Graf | case CC_OP_LTGT_32:
|
740 | e023e832 | Alexander Graf | case CC_OP_LTGT_64:
|
741 | e023e832 | Alexander Graf | case CC_OP_LTUGTU_32:
|
742 | e023e832 | Alexander Graf | case CC_OP_LTUGTU_64:
|
743 | e023e832 | Alexander Graf | case CC_OP_TM_32:
|
744 | e023e832 | Alexander Graf | case CC_OP_TM_64:
|
745 | e023e832 | Alexander Graf | case CC_OP_LTGT_F32:
|
746 | e023e832 | Alexander Graf | case CC_OP_LTGT_F64:
|
747 | e023e832 | Alexander Graf | case CC_OP_SLAG:
|
748 | e023e832 | Alexander Graf | /* 2 arguments */
|
749 | e023e832 | Alexander Graf | gen_helper_calc_cc(cc_op, local_cc_op, cc_src, cc_dst, dummy); |
750 | e023e832 | Alexander Graf | break;
|
751 | e023e832 | Alexander Graf | case CC_OP_ADD_64:
|
752 | e023e832 | Alexander Graf | case CC_OP_ADDU_64:
|
753 | e023e832 | Alexander Graf | case CC_OP_SUB_64:
|
754 | e023e832 | Alexander Graf | case CC_OP_SUBU_64:
|
755 | e023e832 | Alexander Graf | case CC_OP_ADD_32:
|
756 | e023e832 | Alexander Graf | case CC_OP_ADDU_32:
|
757 | e023e832 | Alexander Graf | case CC_OP_SUB_32:
|
758 | e023e832 | Alexander Graf | case CC_OP_SUBU_32:
|
759 | e023e832 | Alexander Graf | /* 3 arguments */
|
760 | e023e832 | Alexander Graf | gen_helper_calc_cc(cc_op, local_cc_op, cc_src, cc_dst, cc_vr); |
761 | e023e832 | Alexander Graf | break;
|
762 | e023e832 | Alexander Graf | case CC_OP_DYNAMIC:
|
763 | e023e832 | Alexander Graf | /* unknown operation - assume 3 arguments and cc_op in env */
|
764 | e023e832 | Alexander Graf | gen_helper_calc_cc(cc_op, cc_op, cc_src, cc_dst, cc_vr); |
765 | e023e832 | Alexander Graf | break;
|
766 | e023e832 | Alexander Graf | default:
|
767 | e023e832 | Alexander Graf | tcg_abort(); |
768 | e023e832 | Alexander Graf | } |
769 | e023e832 | Alexander Graf | |
770 | e023e832 | Alexander Graf | tcg_temp_free_i32(local_cc_op); |
771 | e023e832 | Alexander Graf | |
772 | e023e832 | Alexander Graf | /* We now have cc in cc_op as constant */
|
773 | e023e832 | Alexander Graf | set_cc_static(s); |
774 | e023e832 | Alexander Graf | } |
775 | e023e832 | Alexander Graf | |
776 | e023e832 | Alexander Graf | static inline void decode_rr(DisasContext *s, uint64_t insn, int *r1, int *r2) |
777 | e023e832 | Alexander Graf | { |
778 | e023e832 | Alexander Graf | debug_insn(insn); |
779 | e023e832 | Alexander Graf | |
780 | e023e832 | Alexander Graf | *r1 = (insn >> 4) & 0xf; |
781 | e023e832 | Alexander Graf | *r2 = insn & 0xf;
|
782 | e023e832 | Alexander Graf | } |
783 | e023e832 | Alexander Graf | |
784 | e023e832 | Alexander Graf | static inline TCGv_i64 decode_rx(DisasContext *s, uint64_t insn, int *r1, |
785 | e023e832 | Alexander Graf | int *x2, int *b2, int *d2) |
786 | e023e832 | Alexander Graf | { |
787 | e023e832 | Alexander Graf | debug_insn(insn); |
788 | e023e832 | Alexander Graf | |
789 | e023e832 | Alexander Graf | *r1 = (insn >> 20) & 0xf; |
790 | e023e832 | Alexander Graf | *x2 = (insn >> 16) & 0xf; |
791 | e023e832 | Alexander Graf | *b2 = (insn >> 12) & 0xf; |
792 | e023e832 | Alexander Graf | *d2 = insn & 0xfff;
|
793 | e023e832 | Alexander Graf | |
794 | e023e832 | Alexander Graf | return get_address(s, *x2, *b2, *d2);
|
795 | e023e832 | Alexander Graf | } |
796 | e023e832 | Alexander Graf | |
797 | e023e832 | Alexander Graf | static inline void decode_rs(DisasContext *s, uint64_t insn, int *r1, int *r3, |
798 | e023e832 | Alexander Graf | int *b2, int *d2) |
799 | e023e832 | Alexander Graf | { |
800 | e023e832 | Alexander Graf | debug_insn(insn); |
801 | e023e832 | Alexander Graf | |
802 | e023e832 | Alexander Graf | *r1 = (insn >> 20) & 0xf; |
803 | e023e832 | Alexander Graf | /* aka m3 */
|
804 | e023e832 | Alexander Graf | *r3 = (insn >> 16) & 0xf; |
805 | e023e832 | Alexander Graf | *b2 = (insn >> 12) & 0xf; |
806 | e023e832 | Alexander Graf | *d2 = insn & 0xfff;
|
807 | e023e832 | Alexander Graf | } |
808 | e023e832 | Alexander Graf | |
809 | e023e832 | Alexander Graf | static inline TCGv_i64 decode_si(DisasContext *s, uint64_t insn, int *i2, |
810 | e023e832 | Alexander Graf | int *b1, int *d1) |
811 | e023e832 | Alexander Graf | { |
812 | e023e832 | Alexander Graf | debug_insn(insn); |
813 | e023e832 | Alexander Graf | |
814 | e023e832 | Alexander Graf | *i2 = (insn >> 16) & 0xff; |
815 | e023e832 | Alexander Graf | *b1 = (insn >> 12) & 0xf; |
816 | e023e832 | Alexander Graf | *d1 = insn & 0xfff;
|
817 | e023e832 | Alexander Graf | |
818 | e023e832 | Alexander Graf | return get_address(s, 0, *b1, *d1); |
819 | e023e832 | Alexander Graf | } |
820 | e023e832 | Alexander Graf | |
821 | e023e832 | Alexander Graf | static inline void gen_goto_tb(DisasContext *s, int tb_num, target_ulong pc) |
822 | e023e832 | Alexander Graf | { |
823 | e023e832 | Alexander Graf | TranslationBlock *tb; |
824 | e023e832 | Alexander Graf | |
825 | e023e832 | Alexander Graf | gen_update_cc_op(s); |
826 | e023e832 | Alexander Graf | |
827 | e023e832 | Alexander Graf | tb = s->tb; |
828 | e023e832 | Alexander Graf | /* NOTE: we handle the case where the TB spans two pages here */
|
829 | e023e832 | Alexander Graf | if ((pc & TARGET_PAGE_MASK) == (tb->pc & TARGET_PAGE_MASK) ||
|
830 | e023e832 | Alexander Graf | (pc & TARGET_PAGE_MASK) == ((s->pc - 1) & TARGET_PAGE_MASK)) {
|
831 | e023e832 | Alexander Graf | /* jump to same page: we can use a direct jump */
|
832 | e023e832 | Alexander Graf | tcg_gen_goto_tb(tb_num); |
833 | e023e832 | Alexander Graf | tcg_gen_movi_i64(psw_addr, pc); |
834 | e023e832 | Alexander Graf | tcg_gen_exit_tb((long)tb + tb_num);
|
835 | e023e832 | Alexander Graf | } else {
|
836 | e023e832 | Alexander Graf | /* jump to another page: currently not optimized */
|
837 | e023e832 | Alexander Graf | tcg_gen_movi_i64(psw_addr, pc); |
838 | e023e832 | Alexander Graf | tcg_gen_exit_tb(0);
|
839 | e023e832 | Alexander Graf | } |
840 | e023e832 | Alexander Graf | } |
841 | e023e832 | Alexander Graf | |
842 | e023e832 | Alexander Graf | static inline void account_noninline_branch(DisasContext *s, int cc_op) |
843 | e023e832 | Alexander Graf | { |
844 | e023e832 | Alexander Graf | #ifdef DEBUG_INLINE_BRANCHES
|
845 | e023e832 | Alexander Graf | inline_branch_miss[cc_op]++; |
846 | e023e832 | Alexander Graf | #endif
|
847 | e023e832 | Alexander Graf | } |
848 | e023e832 | Alexander Graf | |
849 | e023e832 | Alexander Graf | static inline void account_inline_branch(DisasContext *s) |
850 | e023e832 | Alexander Graf | { |
851 | e023e832 | Alexander Graf | #ifdef DEBUG_INLINE_BRANCHES
|
852 | e023e832 | Alexander Graf | inline_branch_hit[s->cc_op]++; |
853 | e023e832 | Alexander Graf | #endif
|
854 | e023e832 | Alexander Graf | } |
855 | e023e832 | Alexander Graf | |
856 | e023e832 | Alexander Graf | static void gen_jcc(DisasContext *s, uint32_t mask, int skip) |
857 | e023e832 | Alexander Graf | { |
858 | e023e832 | Alexander Graf | TCGv_i32 tmp, tmp2, r; |
859 | e023e832 | Alexander Graf | TCGv_i64 tmp64; |
860 | e023e832 | Alexander Graf | int old_cc_op;
|
861 | e023e832 | Alexander Graf | |
862 | e023e832 | Alexander Graf | switch (s->cc_op) {
|
863 | e023e832 | Alexander Graf | case CC_OP_LTGT0_32:
|
864 | e023e832 | Alexander Graf | tmp = tcg_temp_new_i32(); |
865 | e023e832 | Alexander Graf | tcg_gen_trunc_i64_i32(tmp, cc_dst); |
866 | e023e832 | Alexander Graf | switch (mask) {
|
867 | e023e832 | Alexander Graf | case 0x8 | 0x4: /* dst <= 0 */ |
868 | e023e832 | Alexander Graf | tcg_gen_brcondi_i32(TCG_COND_GT, tmp, 0, skip);
|
869 | e023e832 | Alexander Graf | break;
|
870 | e023e832 | Alexander Graf | case 0x8 | 0x2: /* dst >= 0 */ |
871 | e023e832 | Alexander Graf | tcg_gen_brcondi_i32(TCG_COND_LT, tmp, 0, skip);
|
872 | e023e832 | Alexander Graf | break;
|
873 | e023e832 | Alexander Graf | case 0x8: /* dst == 0 */ |
874 | e023e832 | Alexander Graf | tcg_gen_brcondi_i32(TCG_COND_NE, tmp, 0, skip);
|
875 | e023e832 | Alexander Graf | break;
|
876 | e023e832 | Alexander Graf | case 0x7: /* dst != 0 */ |
877 | e023e832 | Alexander Graf | case 0x6: /* dst != 0 */ |
878 | e023e832 | Alexander Graf | tcg_gen_brcondi_i32(TCG_COND_EQ, tmp, 0, skip);
|
879 | e023e832 | Alexander Graf | break;
|
880 | e023e832 | Alexander Graf | case 0x4: /* dst < 0 */ |
881 | e023e832 | Alexander Graf | tcg_gen_brcondi_i32(TCG_COND_GE, tmp, 0, skip);
|
882 | e023e832 | Alexander Graf | break;
|
883 | e023e832 | Alexander Graf | case 0x2: /* dst > 0 */ |
884 | e023e832 | Alexander Graf | tcg_gen_brcondi_i32(TCG_COND_LE, tmp, 0, skip);
|
885 | e023e832 | Alexander Graf | break;
|
886 | e023e832 | Alexander Graf | default:
|
887 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp); |
888 | e023e832 | Alexander Graf | goto do_dynamic;
|
889 | e023e832 | Alexander Graf | } |
890 | e023e832 | Alexander Graf | account_inline_branch(s); |
891 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp); |
892 | e023e832 | Alexander Graf | break;
|
893 | e023e832 | Alexander Graf | case CC_OP_LTGT0_64:
|
894 | e023e832 | Alexander Graf | switch (mask) {
|
895 | e023e832 | Alexander Graf | case 0x8 | 0x4: /* dst <= 0 */ |
896 | e023e832 | Alexander Graf | tcg_gen_brcondi_i64(TCG_COND_GT, cc_dst, 0, skip);
|
897 | e023e832 | Alexander Graf | break;
|
898 | e023e832 | Alexander Graf | case 0x8 | 0x2: /* dst >= 0 */ |
899 | e023e832 | Alexander Graf | tcg_gen_brcondi_i64(TCG_COND_LT, cc_dst, 0, skip);
|
900 | e023e832 | Alexander Graf | break;
|
901 | e023e832 | Alexander Graf | case 0x8: /* dst == 0 */ |
902 | e023e832 | Alexander Graf | tcg_gen_brcondi_i64(TCG_COND_NE, cc_dst, 0, skip);
|
903 | e023e832 | Alexander Graf | break;
|
904 | e023e832 | Alexander Graf | case 0x7: /* dst != 0 */ |
905 | e023e832 | Alexander Graf | case 0x6: /* dst != 0 */ |
906 | e023e832 | Alexander Graf | tcg_gen_brcondi_i64(TCG_COND_EQ, cc_dst, 0, skip);
|
907 | e023e832 | Alexander Graf | break;
|
908 | e023e832 | Alexander Graf | case 0x4: /* dst < 0 */ |
909 | e023e832 | Alexander Graf | tcg_gen_brcondi_i64(TCG_COND_GE, cc_dst, 0, skip);
|
910 | e023e832 | Alexander Graf | break;
|
911 | e023e832 | Alexander Graf | case 0x2: /* dst > 0 */ |
912 | e023e832 | Alexander Graf | tcg_gen_brcondi_i64(TCG_COND_LE, cc_dst, 0, skip);
|
913 | e023e832 | Alexander Graf | break;
|
914 | e023e832 | Alexander Graf | default:
|
915 | e023e832 | Alexander Graf | goto do_dynamic;
|
916 | e023e832 | Alexander Graf | } |
917 | e023e832 | Alexander Graf | account_inline_branch(s); |
918 | e023e832 | Alexander Graf | break;
|
919 | e023e832 | Alexander Graf | case CC_OP_LTGT_32:
|
920 | e023e832 | Alexander Graf | tmp = tcg_temp_new_i32(); |
921 | e023e832 | Alexander Graf | tmp2 = tcg_temp_new_i32(); |
922 | e023e832 | Alexander Graf | tcg_gen_trunc_i64_i32(tmp, cc_src); |
923 | e023e832 | Alexander Graf | tcg_gen_trunc_i64_i32(tmp2, cc_dst); |
924 | e023e832 | Alexander Graf | switch (mask) {
|
925 | e023e832 | Alexander Graf | case 0x8 | 0x4: /* src <= dst */ |
926 | e023e832 | Alexander Graf | tcg_gen_brcond_i32(TCG_COND_GT, tmp, tmp2, skip); |
927 | e023e832 | Alexander Graf | break;
|
928 | e023e832 | Alexander Graf | case 0x8 | 0x2: /* src >= dst */ |
929 | e023e832 | Alexander Graf | tcg_gen_brcond_i32(TCG_COND_LT, tmp, tmp2, skip); |
930 | e023e832 | Alexander Graf | break;
|
931 | e023e832 | Alexander Graf | case 0x8: /* src == dst */ |
932 | e023e832 | Alexander Graf | tcg_gen_brcond_i32(TCG_COND_NE, tmp, tmp2, skip); |
933 | e023e832 | Alexander Graf | break;
|
934 | e023e832 | Alexander Graf | case 0x7: /* src != dst */ |
935 | e023e832 | Alexander Graf | case 0x6: /* src != dst */ |
936 | e023e832 | Alexander Graf | tcg_gen_brcond_i32(TCG_COND_EQ, tmp, tmp2, skip); |
937 | e023e832 | Alexander Graf | break;
|
938 | e023e832 | Alexander Graf | case 0x4: /* src < dst */ |
939 | e023e832 | Alexander Graf | tcg_gen_brcond_i32(TCG_COND_GE, tmp, tmp2, skip); |
940 | e023e832 | Alexander Graf | break;
|
941 | e023e832 | Alexander Graf | case 0x2: /* src > dst */ |
942 | e023e832 | Alexander Graf | tcg_gen_brcond_i32(TCG_COND_LE, tmp, tmp2, skip); |
943 | e023e832 | Alexander Graf | break;
|
944 | e023e832 | Alexander Graf | default:
|
945 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp); |
946 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp2); |
947 | e023e832 | Alexander Graf | goto do_dynamic;
|
948 | e023e832 | Alexander Graf | } |
949 | e023e832 | Alexander Graf | account_inline_branch(s); |
950 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp); |
951 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp2); |
952 | e023e832 | Alexander Graf | break;
|
953 | e023e832 | Alexander Graf | case CC_OP_LTGT_64:
|
954 | e023e832 | Alexander Graf | switch (mask) {
|
955 | e023e832 | Alexander Graf | case 0x8 | 0x4: /* src <= dst */ |
956 | e023e832 | Alexander Graf | tcg_gen_brcond_i64(TCG_COND_GT, cc_src, cc_dst, skip); |
957 | e023e832 | Alexander Graf | break;
|
958 | e023e832 | Alexander Graf | case 0x8 | 0x2: /* src >= dst */ |
959 | e023e832 | Alexander Graf | tcg_gen_brcond_i64(TCG_COND_LT, cc_src, cc_dst, skip); |
960 | e023e832 | Alexander Graf | break;
|
961 | e023e832 | Alexander Graf | case 0x8: /* src == dst */ |
962 | e023e832 | Alexander Graf | tcg_gen_brcond_i64(TCG_COND_NE, cc_src, cc_dst, skip); |
963 | e023e832 | Alexander Graf | break;
|
964 | e023e832 | Alexander Graf | case 0x7: /* src != dst */ |
965 | e023e832 | Alexander Graf | case 0x6: /* src != dst */ |
966 | e023e832 | Alexander Graf | tcg_gen_brcond_i64(TCG_COND_EQ, cc_src, cc_dst, skip); |
967 | e023e832 | Alexander Graf | break;
|
968 | e023e832 | Alexander Graf | case 0x4: /* src < dst */ |
969 | e023e832 | Alexander Graf | tcg_gen_brcond_i64(TCG_COND_GE, cc_src, cc_dst, skip); |
970 | e023e832 | Alexander Graf | break;
|
971 | e023e832 | Alexander Graf | case 0x2: /* src > dst */ |
972 | e023e832 | Alexander Graf | tcg_gen_brcond_i64(TCG_COND_LE, cc_src, cc_dst, skip); |
973 | e023e832 | Alexander Graf | break;
|
974 | e023e832 | Alexander Graf | default:
|
975 | e023e832 | Alexander Graf | goto do_dynamic;
|
976 | e023e832 | Alexander Graf | } |
977 | e023e832 | Alexander Graf | account_inline_branch(s); |
978 | e023e832 | Alexander Graf | break;
|
979 | e023e832 | Alexander Graf | case CC_OP_LTUGTU_32:
|
980 | e023e832 | Alexander Graf | tmp = tcg_temp_new_i32(); |
981 | e023e832 | Alexander Graf | tmp2 = tcg_temp_new_i32(); |
982 | e023e832 | Alexander Graf | tcg_gen_trunc_i64_i32(tmp, cc_src); |
983 | e023e832 | Alexander Graf | tcg_gen_trunc_i64_i32(tmp2, cc_dst); |
984 | e023e832 | Alexander Graf | switch (mask) {
|
985 | e023e832 | Alexander Graf | case 0x8 | 0x4: /* src <= dst */ |
986 | e023e832 | Alexander Graf | tcg_gen_brcond_i32(TCG_COND_GTU, tmp, tmp2, skip); |
987 | e023e832 | Alexander Graf | break;
|
988 | e023e832 | Alexander Graf | case 0x8 | 0x2: /* src >= dst */ |
989 | e023e832 | Alexander Graf | tcg_gen_brcond_i32(TCG_COND_LTU, tmp, tmp2, skip); |
990 | e023e832 | Alexander Graf | break;
|
991 | e023e832 | Alexander Graf | case 0x8: /* src == dst */ |
992 | e023e832 | Alexander Graf | tcg_gen_brcond_i32(TCG_COND_NE, tmp, tmp2, skip); |
993 | e023e832 | Alexander Graf | break;
|
994 | e023e832 | Alexander Graf | case 0x7: /* src != dst */ |
995 | e023e832 | Alexander Graf | case 0x6: /* src != dst */ |
996 | e023e832 | Alexander Graf | tcg_gen_brcond_i32(TCG_COND_EQ, tmp, tmp2, skip); |
997 | e023e832 | Alexander Graf | break;
|
998 | e023e832 | Alexander Graf | case 0x4: /* src < dst */ |
999 | e023e832 | Alexander Graf | tcg_gen_brcond_i32(TCG_COND_GEU, tmp, tmp2, skip); |
1000 | e023e832 | Alexander Graf | break;
|
1001 | e023e832 | Alexander Graf | case 0x2: /* src > dst */ |
1002 | e023e832 | Alexander Graf | tcg_gen_brcond_i32(TCG_COND_LEU, tmp, tmp2, skip); |
1003 | e023e832 | Alexander Graf | break;
|
1004 | e023e832 | Alexander Graf | default:
|
1005 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp); |
1006 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp2); |
1007 | e023e832 | Alexander Graf | goto do_dynamic;
|
1008 | e023e832 | Alexander Graf | } |
1009 | e023e832 | Alexander Graf | account_inline_branch(s); |
1010 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp); |
1011 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp2); |
1012 | e023e832 | Alexander Graf | break;
|
1013 | e023e832 | Alexander Graf | case CC_OP_LTUGTU_64:
|
1014 | e023e832 | Alexander Graf | switch (mask) {
|
1015 | e023e832 | Alexander Graf | case 0x8 | 0x4: /* src <= dst */ |
1016 | e023e832 | Alexander Graf | tcg_gen_brcond_i64(TCG_COND_GTU, cc_src, cc_dst, skip); |
1017 | e023e832 | Alexander Graf | break;
|
1018 | e023e832 | Alexander Graf | case 0x8 | 0x2: /* src >= dst */ |
1019 | e023e832 | Alexander Graf | tcg_gen_brcond_i64(TCG_COND_LTU, cc_src, cc_dst, skip); |
1020 | e023e832 | Alexander Graf | break;
|
1021 | e023e832 | Alexander Graf | case 0x8: /* src == dst */ |
1022 | e023e832 | Alexander Graf | tcg_gen_brcond_i64(TCG_COND_NE, cc_src, cc_dst, skip); |
1023 | e023e832 | Alexander Graf | break;
|
1024 | e023e832 | Alexander Graf | case 0x7: /* src != dst */ |
1025 | e023e832 | Alexander Graf | case 0x6: /* src != dst */ |
1026 | e023e832 | Alexander Graf | tcg_gen_brcond_i64(TCG_COND_EQ, cc_src, cc_dst, skip); |
1027 | e023e832 | Alexander Graf | break;
|
1028 | e023e832 | Alexander Graf | case 0x4: /* src < dst */ |
1029 | e023e832 | Alexander Graf | tcg_gen_brcond_i64(TCG_COND_GEU, cc_src, cc_dst, skip); |
1030 | e023e832 | Alexander Graf | break;
|
1031 | e023e832 | Alexander Graf | case 0x2: /* src > dst */ |
1032 | e023e832 | Alexander Graf | tcg_gen_brcond_i64(TCG_COND_LEU, cc_src, cc_dst, skip); |
1033 | e023e832 | Alexander Graf | break;
|
1034 | e023e832 | Alexander Graf | default:
|
1035 | e023e832 | Alexander Graf | goto do_dynamic;
|
1036 | e023e832 | Alexander Graf | } |
1037 | e023e832 | Alexander Graf | account_inline_branch(s); |
1038 | e023e832 | Alexander Graf | break;
|
1039 | e023e832 | Alexander Graf | case CC_OP_NZ:
|
1040 | e023e832 | Alexander Graf | switch (mask) {
|
1041 | e023e832 | Alexander Graf | /* dst == 0 || dst != 0 */
|
1042 | e023e832 | Alexander Graf | case 0x8 | 0x4: |
1043 | e023e832 | Alexander Graf | case 0x8 | 0x4 | 0x2: |
1044 | e023e832 | Alexander Graf | case 0x8 | 0x4 | 0x2 | 0x1: |
1045 | e023e832 | Alexander Graf | case 0x8 | 0x4 | 0x1: |
1046 | e023e832 | Alexander Graf | break;
|
1047 | e023e832 | Alexander Graf | /* dst == 0 */
|
1048 | e023e832 | Alexander Graf | case 0x8: |
1049 | e023e832 | Alexander Graf | case 0x8 | 0x2: |
1050 | e023e832 | Alexander Graf | case 0x8 | 0x2 | 0x1: |
1051 | e023e832 | Alexander Graf | case 0x8 | 0x1: |
1052 | e023e832 | Alexander Graf | tcg_gen_brcondi_i64(TCG_COND_NE, cc_dst, 0, skip);
|
1053 | e023e832 | Alexander Graf | break;
|
1054 | e023e832 | Alexander Graf | /* dst != 0 */
|
1055 | e023e832 | Alexander Graf | case 0x4: |
1056 | e023e832 | Alexander Graf | case 0x4 | 0x2: |
1057 | e023e832 | Alexander Graf | case 0x4 | 0x2 | 0x1: |
1058 | e023e832 | Alexander Graf | case 0x4 | 0x1: |
1059 | e023e832 | Alexander Graf | tcg_gen_brcondi_i64(TCG_COND_EQ, cc_dst, 0, skip);
|
1060 | e023e832 | Alexander Graf | break;
|
1061 | e023e832 | Alexander Graf | default:
|
1062 | e023e832 | Alexander Graf | goto do_dynamic;
|
1063 | e023e832 | Alexander Graf | } |
1064 | e023e832 | Alexander Graf | account_inline_branch(s); |
1065 | e023e832 | Alexander Graf | break;
|
1066 | e023e832 | Alexander Graf | case CC_OP_TM_32:
|
1067 | e023e832 | Alexander Graf | tmp = tcg_temp_new_i32(); |
1068 | e023e832 | Alexander Graf | tmp2 = tcg_temp_new_i32(); |
1069 | e023e832 | Alexander Graf | |
1070 | e023e832 | Alexander Graf | tcg_gen_trunc_i64_i32(tmp, cc_src); |
1071 | e023e832 | Alexander Graf | tcg_gen_trunc_i64_i32(tmp2, cc_dst); |
1072 | e023e832 | Alexander Graf | tcg_gen_and_i32(tmp, tmp, tmp2); |
1073 | e023e832 | Alexander Graf | switch (mask) {
|
1074 | e023e832 | Alexander Graf | case 0x8: /* val & mask == 0 */ |
1075 | e023e832 | Alexander Graf | tcg_gen_brcondi_i32(TCG_COND_NE, tmp, 0, skip);
|
1076 | e023e832 | Alexander Graf | break;
|
1077 | e023e832 | Alexander Graf | case 0x4 | 0x2 | 0x1: /* val & mask != 0 */ |
1078 | e023e832 | Alexander Graf | tcg_gen_brcondi_i32(TCG_COND_EQ, tmp, 0, skip);
|
1079 | e023e832 | Alexander Graf | break;
|
1080 | e023e832 | Alexander Graf | default:
|
1081 | e023e832 | Alexander Graf | goto do_dynamic;
|
1082 | e023e832 | Alexander Graf | } |
1083 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp); |
1084 | e023e832 | Alexander Graf | account_inline_branch(s); |
1085 | e023e832 | Alexander Graf | break;
|
1086 | e023e832 | Alexander Graf | case CC_OP_TM_64:
|
1087 | e023e832 | Alexander Graf | tmp64 = tcg_temp_new_i64(); |
1088 | e023e832 | Alexander Graf | |
1089 | e023e832 | Alexander Graf | tcg_gen_and_i64(tmp64, cc_src, cc_dst); |
1090 | e023e832 | Alexander Graf | switch (mask) {
|
1091 | e023e832 | Alexander Graf | case 0x8: /* val & mask == 0 */ |
1092 | e023e832 | Alexander Graf | tcg_gen_brcondi_i64(TCG_COND_NE, tmp64, 0, skip);
|
1093 | e023e832 | Alexander Graf | break;
|
1094 | e023e832 | Alexander Graf | case 0x4 | 0x2 | 0x1: /* val & mask != 0 */ |
1095 | e023e832 | Alexander Graf | tcg_gen_brcondi_i64(TCG_COND_EQ, tmp64, 0, skip);
|
1096 | e023e832 | Alexander Graf | break;
|
1097 | e023e832 | Alexander Graf | default:
|
1098 | e023e832 | Alexander Graf | goto do_dynamic;
|
1099 | e023e832 | Alexander Graf | } |
1100 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp64); |
1101 | e023e832 | Alexander Graf | account_inline_branch(s); |
1102 | e023e832 | Alexander Graf | break;
|
1103 | e023e832 | Alexander Graf | case CC_OP_ICM:
|
1104 | e023e832 | Alexander Graf | switch (mask) {
|
1105 | e023e832 | Alexander Graf | case 0x8: /* val == 0 */ |
1106 | e023e832 | Alexander Graf | tcg_gen_brcondi_i64(TCG_COND_NE, cc_dst, 0, skip);
|
1107 | e023e832 | Alexander Graf | break;
|
1108 | e023e832 | Alexander Graf | case 0x4 | 0x2 | 0x1: /* val != 0 */ |
1109 | e023e832 | Alexander Graf | case 0x4 | 0x2: /* val != 0 */ |
1110 | e023e832 | Alexander Graf | tcg_gen_brcondi_i64(TCG_COND_EQ, cc_dst, 0, skip);
|
1111 | e023e832 | Alexander Graf | break;
|
1112 | e023e832 | Alexander Graf | default:
|
1113 | e023e832 | Alexander Graf | goto do_dynamic;
|
1114 | e023e832 | Alexander Graf | } |
1115 | e023e832 | Alexander Graf | account_inline_branch(s); |
1116 | e023e832 | Alexander Graf | break;
|
1117 | e023e832 | Alexander Graf | case CC_OP_STATIC:
|
1118 | e023e832 | Alexander Graf | old_cc_op = s->cc_op; |
1119 | e023e832 | Alexander Graf | goto do_dynamic_nocccalc;
|
1120 | e023e832 | Alexander Graf | case CC_OP_DYNAMIC:
|
1121 | e023e832 | Alexander Graf | default:
|
1122 | e023e832 | Alexander Graf | do_dynamic:
|
1123 | e023e832 | Alexander Graf | old_cc_op = s->cc_op; |
1124 | e023e832 | Alexander Graf | /* calculate cc value */
|
1125 | e023e832 | Alexander Graf | gen_op_calc_cc(s); |
1126 | e023e832 | Alexander Graf | |
1127 | e023e832 | Alexander Graf | do_dynamic_nocccalc:
|
1128 | e023e832 | Alexander Graf | /* jump based on cc */
|
1129 | e023e832 | Alexander Graf | account_noninline_branch(s, old_cc_op); |
1130 | e023e832 | Alexander Graf | |
1131 | e023e832 | Alexander Graf | switch (mask) {
|
1132 | e023e832 | Alexander Graf | case 0x8 | 0x4 | 0x2 | 0x1: |
1133 | e023e832 | Alexander Graf | /* always true */
|
1134 | e023e832 | Alexander Graf | break;
|
1135 | e023e832 | Alexander Graf | case 0x8 | 0x4 | 0x2: /* cc != 3 */ |
1136 | e023e832 | Alexander Graf | tcg_gen_brcondi_i32(TCG_COND_EQ, cc_op, 3, skip);
|
1137 | e023e832 | Alexander Graf | break;
|
1138 | e023e832 | Alexander Graf | case 0x8 | 0x4 | 0x1: /* cc != 2 */ |
1139 | e023e832 | Alexander Graf | tcg_gen_brcondi_i32(TCG_COND_EQ, cc_op, 2, skip);
|
1140 | e023e832 | Alexander Graf | break;
|
1141 | e023e832 | Alexander Graf | case 0x8 | 0x2 | 0x1: /* cc != 1 */ |
1142 | e023e832 | Alexander Graf | tcg_gen_brcondi_i32(TCG_COND_EQ, cc_op, 1, skip);
|
1143 | e023e832 | Alexander Graf | break;
|
1144 | e023e832 | Alexander Graf | case 0x8 | 0x2: /* cc == 0 ||ย cc == 2 */ |
1145 | e023e832 | Alexander Graf | tmp = tcg_temp_new_i32(); |
1146 | e023e832 | Alexander Graf | tcg_gen_andi_i32(tmp, cc_op, 1);
|
1147 | e023e832 | Alexander Graf | tcg_gen_brcondi_i32(TCG_COND_NE, tmp, 0, skip);
|
1148 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp); |
1149 | e023e832 | Alexander Graf | break;
|
1150 | e023e832 | Alexander Graf | case 0x8 | 0x4: /* cc < 2 */ |
1151 | e023e832 | Alexander Graf | tcg_gen_brcondi_i32(TCG_COND_GEU, cc_op, 2, skip);
|
1152 | e023e832 | Alexander Graf | break;
|
1153 | e023e832 | Alexander Graf | case 0x8: /* cc == 0 */ |
1154 | e023e832 | Alexander Graf | tcg_gen_brcondi_i32(TCG_COND_NE, cc_op, 0, skip);
|
1155 | e023e832 | Alexander Graf | break;
|
1156 | e023e832 | Alexander Graf | case 0x4 | 0x2 | 0x1: /* cc != 0 */ |
1157 | e023e832 | Alexander Graf | tcg_gen_brcondi_i32(TCG_COND_EQ, cc_op, 0, skip);
|
1158 | e023e832 | Alexander Graf | break;
|
1159 | e023e832 | Alexander Graf | case 0x4 | 0x1: /* cc == 1 ||ย cc == 3 */ |
1160 | e023e832 | Alexander Graf | tmp = tcg_temp_new_i32(); |
1161 | e023e832 | Alexander Graf | tcg_gen_andi_i32(tmp, cc_op, 1);
|
1162 | e023e832 | Alexander Graf | tcg_gen_brcondi_i32(TCG_COND_EQ, tmp, 0, skip);
|
1163 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp); |
1164 | e023e832 | Alexander Graf | break;
|
1165 | e023e832 | Alexander Graf | case 0x4: /* cc == 1 */ |
1166 | e023e832 | Alexander Graf | tcg_gen_brcondi_i32(TCG_COND_NE, cc_op, 1, skip);
|
1167 | e023e832 | Alexander Graf | break;
|
1168 | e023e832 | Alexander Graf | case 0x2 | 0x1: /* cc > 1 */ |
1169 | e023e832 | Alexander Graf | tcg_gen_brcondi_i32(TCG_COND_LEU, cc_op, 1, skip);
|
1170 | e023e832 | Alexander Graf | break;
|
1171 | e023e832 | Alexander Graf | case 0x2: /* cc == 2 */ |
1172 | e023e832 | Alexander Graf | tcg_gen_brcondi_i32(TCG_COND_NE, cc_op, 2, skip);
|
1173 | e023e832 | Alexander Graf | break;
|
1174 | e023e832 | Alexander Graf | case 0x1: /* cc == 3 */ |
1175 | e023e832 | Alexander Graf | tcg_gen_brcondi_i32(TCG_COND_NE, cc_op, 3, skip);
|
1176 | e023e832 | Alexander Graf | break;
|
1177 | e023e832 | Alexander Graf | default: /* cc is masked by something else */ |
1178 | e023e832 | Alexander Graf | tmp = tcg_const_i32(3);
|
1179 | e023e832 | Alexander Graf | /* 3 - cc */
|
1180 | e023e832 | Alexander Graf | tcg_gen_sub_i32(tmp, tmp, cc_op); |
1181 | e023e832 | Alexander Graf | tmp2 = tcg_const_i32(1);
|
1182 | e023e832 | Alexander Graf | /* 1 << (3 - cc) */
|
1183 | e023e832 | Alexander Graf | tcg_gen_shl_i32(tmp2, tmp2, tmp); |
1184 | e023e832 | Alexander Graf | r = tcg_const_i32(mask); |
1185 | e023e832 | Alexander Graf | /* mask & (1 << (3 - cc)) */
|
1186 | e023e832 | Alexander Graf | tcg_gen_and_i32(r, r, tmp2); |
1187 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp); |
1188 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp2); |
1189 | e023e832 | Alexander Graf | |
1190 | e023e832 | Alexander Graf | tcg_gen_brcondi_i32(TCG_COND_EQ, r, 0, skip);
|
1191 | e023e832 | Alexander Graf | tcg_temp_free_i32(r); |
1192 | e023e832 | Alexander Graf | break;
|
1193 | e023e832 | Alexander Graf | } |
1194 | e023e832 | Alexander Graf | break;
|
1195 | e023e832 | Alexander Graf | } |
1196 | e023e832 | Alexander Graf | } |
1197 | e023e832 | Alexander Graf | |
1198 | e023e832 | Alexander Graf | static void gen_bcr(DisasContext *s, uint32_t mask, TCGv_i64 target, |
1199 | e023e832 | Alexander Graf | uint64_t offset) |
1200 | e023e832 | Alexander Graf | { |
1201 | e023e832 | Alexander Graf | int skip;
|
1202 | e023e832 | Alexander Graf | |
1203 | e023e832 | Alexander Graf | if (mask == 0xf) { |
1204 | e023e832 | Alexander Graf | /* unconditional */
|
1205 | e023e832 | Alexander Graf | tcg_gen_mov_i64(psw_addr, target); |
1206 | e023e832 | Alexander Graf | tcg_gen_exit_tb(0);
|
1207 | e023e832 | Alexander Graf | } else if (mask == 0) { |
1208 | e023e832 | Alexander Graf | /* ignore cc and never match */
|
1209 | e023e832 | Alexander Graf | gen_goto_tb(s, 0, offset + 2); |
1210 | e023e832 | Alexander Graf | } else {
|
1211 | e023e832 | Alexander Graf | TCGv_i64 new_addr = tcg_temp_local_new_i64(); |
1212 | e023e832 | Alexander Graf | |
1213 | e023e832 | Alexander Graf | tcg_gen_mov_i64(new_addr, target); |
1214 | e023e832 | Alexander Graf | skip = gen_new_label(); |
1215 | e023e832 | Alexander Graf | gen_jcc(s, mask, skip); |
1216 | e023e832 | Alexander Graf | tcg_gen_mov_i64(psw_addr, new_addr); |
1217 | e023e832 | Alexander Graf | tcg_temp_free_i64(new_addr); |
1218 | e023e832 | Alexander Graf | tcg_gen_exit_tb(0);
|
1219 | e023e832 | Alexander Graf | gen_set_label(skip); |
1220 | e023e832 | Alexander Graf | tcg_temp_free_i64(new_addr); |
1221 | e023e832 | Alexander Graf | gen_goto_tb(s, 1, offset + 2); |
1222 | e023e832 | Alexander Graf | } |
1223 | e023e832 | Alexander Graf | } |
1224 | e023e832 | Alexander Graf | |
1225 | e023e832 | Alexander Graf | static void gen_brc(uint32_t mask, DisasContext *s, int32_t offset) |
1226 | e023e832 | Alexander Graf | { |
1227 | e023e832 | Alexander Graf | int skip;
|
1228 | e023e832 | Alexander Graf | |
1229 | e023e832 | Alexander Graf | if (mask == 0xf) { |
1230 | e023e832 | Alexander Graf | /* unconditional */
|
1231 | e023e832 | Alexander Graf | gen_goto_tb(s, 0, s->pc + offset);
|
1232 | e023e832 | Alexander Graf | } else if (mask == 0) { |
1233 | e023e832 | Alexander Graf | /* ignore cc and never match */
|
1234 | e023e832 | Alexander Graf | gen_goto_tb(s, 0, s->pc + 4); |
1235 | e023e832 | Alexander Graf | } else {
|
1236 | e023e832 | Alexander Graf | skip = gen_new_label(); |
1237 | e023e832 | Alexander Graf | gen_jcc(s, mask, skip); |
1238 | e023e832 | Alexander Graf | gen_goto_tb(s, 0, s->pc + offset);
|
1239 | e023e832 | Alexander Graf | gen_set_label(skip); |
1240 | e023e832 | Alexander Graf | gen_goto_tb(s, 1, s->pc + 4); |
1241 | e023e832 | Alexander Graf | } |
1242 | e023e832 | Alexander Graf | s->is_jmp = DISAS_TB_JUMP; |
1243 | e023e832 | Alexander Graf | } |
1244 | e023e832 | Alexander Graf | |
1245 | e023e832 | Alexander Graf | static void gen_op_mvc(DisasContext *s, int l, TCGv_i64 s1, TCGv_i64 s2) |
1246 | e023e832 | Alexander Graf | { |
1247 | e023e832 | Alexander Graf | TCGv_i64 tmp, tmp2; |
1248 | e023e832 | Alexander Graf | int i;
|
1249 | e023e832 | Alexander Graf | int l_memset = gen_new_label();
|
1250 | e023e832 | Alexander Graf | int l_out = gen_new_label();
|
1251 | e023e832 | Alexander Graf | TCGv_i64 dest = tcg_temp_local_new_i64(); |
1252 | e023e832 | Alexander Graf | TCGv_i64 src = tcg_temp_local_new_i64(); |
1253 | e023e832 | Alexander Graf | TCGv_i32 vl; |
1254 | e023e832 | Alexander Graf | |
1255 | e023e832 | Alexander Graf | /* Find out if we should use the inline version of mvc */
|
1256 | e023e832 | Alexander Graf | switch (l) {
|
1257 | e023e832 | Alexander Graf | case 0: |
1258 | e023e832 | Alexander Graf | case 1: |
1259 | e023e832 | Alexander Graf | case 2: |
1260 | e023e832 | Alexander Graf | case 3: |
1261 | e023e832 | Alexander Graf | case 4: |
1262 | e023e832 | Alexander Graf | case 5: |
1263 | e023e832 | Alexander Graf | case 6: |
1264 | e023e832 | Alexander Graf | case 7: |
1265 | e023e832 | Alexander Graf | case 11: |
1266 | e023e832 | Alexander Graf | case 15: |
1267 | e023e832 | Alexander Graf | /* use inline */
|
1268 | e023e832 | Alexander Graf | break;
|
1269 | e023e832 | Alexander Graf | default:
|
1270 | e023e832 | Alexander Graf | /* Fall back to helper */
|
1271 | e023e832 | Alexander Graf | vl = tcg_const_i32(l); |
1272 | e023e832 | Alexander Graf | potential_page_fault(s); |
1273 | e023e832 | Alexander Graf | gen_helper_mvc(vl, s1, s2); |
1274 | e023e832 | Alexander Graf | tcg_temp_free_i32(vl); |
1275 | e023e832 | Alexander Graf | return;
|
1276 | e023e832 | Alexander Graf | } |
1277 | e023e832 | Alexander Graf | |
1278 | e023e832 | Alexander Graf | tcg_gen_mov_i64(dest, s1); |
1279 | e023e832 | Alexander Graf | tcg_gen_mov_i64(src, s2); |
1280 | e023e832 | Alexander Graf | |
1281 | e023e832 | Alexander Graf | if (!(s->tb->flags & FLAG_MASK_64)) {
|
1282 | e023e832 | Alexander Graf | /* XXX what if we overflow while moving? */
|
1283 | e023e832 | Alexander Graf | tcg_gen_andi_i64(dest, dest, 0x7fffffffUL);
|
1284 | e023e832 | Alexander Graf | tcg_gen_andi_i64(src, src, 0x7fffffffUL);
|
1285 | e023e832 | Alexander Graf | } |
1286 | e023e832 | Alexander Graf | |
1287 | e023e832 | Alexander Graf | tmp = tcg_temp_new_i64(); |
1288 | e023e832 | Alexander Graf | tcg_gen_addi_i64(tmp, src, 1);
|
1289 | e023e832 | Alexander Graf | tcg_gen_brcond_i64(TCG_COND_EQ, dest, tmp, l_memset); |
1290 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
1291 | e023e832 | Alexander Graf | |
1292 | e023e832 | Alexander Graf | switch (l) {
|
1293 | e023e832 | Alexander Graf | case 0: |
1294 | e023e832 | Alexander Graf | tmp = tcg_temp_new_i64(); |
1295 | e023e832 | Alexander Graf | |
1296 | e023e832 | Alexander Graf | tcg_gen_qemu_ld8u(tmp, src, get_mem_index(s)); |
1297 | e023e832 | Alexander Graf | tcg_gen_qemu_st8(tmp, dest, get_mem_index(s)); |
1298 | e023e832 | Alexander Graf | |
1299 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
1300 | e023e832 | Alexander Graf | break;
|
1301 | e023e832 | Alexander Graf | case 1: |
1302 | e023e832 | Alexander Graf | tmp = tcg_temp_new_i64(); |
1303 | e023e832 | Alexander Graf | |
1304 | e023e832 | Alexander Graf | tcg_gen_qemu_ld16u(tmp, src, get_mem_index(s)); |
1305 | e023e832 | Alexander Graf | tcg_gen_qemu_st16(tmp, dest, get_mem_index(s)); |
1306 | e023e832 | Alexander Graf | |
1307 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
1308 | e023e832 | Alexander Graf | break;
|
1309 | e023e832 | Alexander Graf | case 3: |
1310 | e023e832 | Alexander Graf | tmp = tcg_temp_new_i64(); |
1311 | e023e832 | Alexander Graf | |
1312 | e023e832 | Alexander Graf | tcg_gen_qemu_ld32u(tmp, src, get_mem_index(s)); |
1313 | e023e832 | Alexander Graf | tcg_gen_qemu_st32(tmp, dest, get_mem_index(s)); |
1314 | e023e832 | Alexander Graf | |
1315 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
1316 | e023e832 | Alexander Graf | break;
|
1317 | e023e832 | Alexander Graf | case 4: |
1318 | e023e832 | Alexander Graf | tmp = tcg_temp_new_i64(); |
1319 | e023e832 | Alexander Graf | tmp2 = tcg_temp_new_i64(); |
1320 | e023e832 | Alexander Graf | |
1321 | e023e832 | Alexander Graf | tcg_gen_qemu_ld32u(tmp, src, get_mem_index(s)); |
1322 | e023e832 | Alexander Graf | tcg_gen_addi_i64(src, src, 4);
|
1323 | e023e832 | Alexander Graf | tcg_gen_qemu_ld8u(tmp2, src, get_mem_index(s)); |
1324 | e023e832 | Alexander Graf | tcg_gen_qemu_st32(tmp, dest, get_mem_index(s)); |
1325 | e023e832 | Alexander Graf | tcg_gen_addi_i64(dest, dest, 4);
|
1326 | e023e832 | Alexander Graf | tcg_gen_qemu_st8(tmp2, dest, get_mem_index(s)); |
1327 | e023e832 | Alexander Graf | |
1328 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
1329 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
1330 | e023e832 | Alexander Graf | break;
|
1331 | e023e832 | Alexander Graf | case 7: |
1332 | e023e832 | Alexander Graf | tmp = tcg_temp_new_i64(); |
1333 | e023e832 | Alexander Graf | |
1334 | e023e832 | Alexander Graf | tcg_gen_qemu_ld64(tmp, src, get_mem_index(s)); |
1335 | e023e832 | Alexander Graf | tcg_gen_qemu_st64(tmp, dest, get_mem_index(s)); |
1336 | e023e832 | Alexander Graf | |
1337 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
1338 | e023e832 | Alexander Graf | break;
|
1339 | e023e832 | Alexander Graf | default:
|
1340 | e023e832 | Alexander Graf | /* The inline version can become too big for too uneven numbers, only
|
1341 | e023e832 | Alexander Graf | use it on known good lengths */
|
1342 | e023e832 | Alexander Graf | tmp = tcg_temp_new_i64(); |
1343 | e023e832 | Alexander Graf | tmp2 = tcg_const_i64(8);
|
1344 | e023e832 | Alexander Graf | for (i = 0; (i + 7) <= l; i += 8) { |
1345 | e023e832 | Alexander Graf | tcg_gen_qemu_ld64(tmp, src, get_mem_index(s)); |
1346 | e023e832 | Alexander Graf | tcg_gen_qemu_st64(tmp, dest, get_mem_index(s)); |
1347 | e023e832 | Alexander Graf | |
1348 | e023e832 | Alexander Graf | tcg_gen_add_i64(src, src, tmp2); |
1349 | e023e832 | Alexander Graf | tcg_gen_add_i64(dest, dest, tmp2); |
1350 | e023e832 | Alexander Graf | } |
1351 | e023e832 | Alexander Graf | |
1352 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
1353 | e023e832 | Alexander Graf | tmp2 = tcg_const_i64(1);
|
1354 | e023e832 | Alexander Graf | |
1355 | e023e832 | Alexander Graf | for (; i <= l; i++) {
|
1356 | e023e832 | Alexander Graf | tcg_gen_qemu_ld8u(tmp, src, get_mem_index(s)); |
1357 | e023e832 | Alexander Graf | tcg_gen_qemu_st8(tmp, dest, get_mem_index(s)); |
1358 | e023e832 | Alexander Graf | |
1359 | e023e832 | Alexander Graf | tcg_gen_add_i64(src, src, tmp2); |
1360 | e023e832 | Alexander Graf | tcg_gen_add_i64(dest, dest, tmp2); |
1361 | e023e832 | Alexander Graf | } |
1362 | e023e832 | Alexander Graf | |
1363 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
1364 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
1365 | e023e832 | Alexander Graf | break;
|
1366 | e023e832 | Alexander Graf | } |
1367 | e023e832 | Alexander Graf | |
1368 | e023e832 | Alexander Graf | tcg_gen_br(l_out); |
1369 | e023e832 | Alexander Graf | |
1370 | e023e832 | Alexander Graf | gen_set_label(l_memset); |
1371 | e023e832 | Alexander Graf | /* memset case (dest == (src + 1)) */
|
1372 | e023e832 | Alexander Graf | |
1373 | e023e832 | Alexander Graf | tmp = tcg_temp_new_i64(); |
1374 | e023e832 | Alexander Graf | tmp2 = tcg_temp_new_i64(); |
1375 | e023e832 | Alexander Graf | /* fill tmp with the byte */
|
1376 | e023e832 | Alexander Graf | tcg_gen_qemu_ld8u(tmp, src, get_mem_index(s)); |
1377 | e023e832 | Alexander Graf | tcg_gen_shli_i64(tmp2, tmp, 8);
|
1378 | e023e832 | Alexander Graf | tcg_gen_or_i64(tmp, tmp, tmp2); |
1379 | e023e832 | Alexander Graf | tcg_gen_shli_i64(tmp2, tmp, 16);
|
1380 | e023e832 | Alexander Graf | tcg_gen_or_i64(tmp, tmp, tmp2); |
1381 | e023e832 | Alexander Graf | tcg_gen_shli_i64(tmp2, tmp, 32);
|
1382 | e023e832 | Alexander Graf | tcg_gen_or_i64(tmp, tmp, tmp2); |
1383 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
1384 | e023e832 | Alexander Graf | |
1385 | e023e832 | Alexander Graf | tmp2 = tcg_const_i64(8);
|
1386 | e023e832 | Alexander Graf | |
1387 | e023e832 | Alexander Graf | for (i = 0; (i + 7) <= l; i += 8) { |
1388 | e023e832 | Alexander Graf | tcg_gen_qemu_st64(tmp, dest, get_mem_index(s)); |
1389 | e023e832 | Alexander Graf | tcg_gen_addi_i64(dest, dest, 8);
|
1390 | e023e832 | Alexander Graf | } |
1391 | e023e832 | Alexander Graf | |
1392 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
1393 | e023e832 | Alexander Graf | tmp2 = tcg_const_i64(1);
|
1394 | e023e832 | Alexander Graf | |
1395 | e023e832 | Alexander Graf | for (; i <= l; i++) {
|
1396 | e023e832 | Alexander Graf | tcg_gen_qemu_st8(tmp, dest, get_mem_index(s)); |
1397 | e023e832 | Alexander Graf | tcg_gen_addi_i64(dest, dest, 1);
|
1398 | e023e832 | Alexander Graf | } |
1399 | e023e832 | Alexander Graf | |
1400 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
1401 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
1402 | e023e832 | Alexander Graf | |
1403 | e023e832 | Alexander Graf | gen_set_label(l_out); |
1404 | e023e832 | Alexander Graf | |
1405 | e023e832 | Alexander Graf | tcg_temp_free(dest); |
1406 | e023e832 | Alexander Graf | tcg_temp_free(src); |
1407 | e023e832 | Alexander Graf | } |
1408 | e023e832 | Alexander Graf | |
1409 | e023e832 | Alexander Graf | static void gen_op_clc(DisasContext *s, int l, TCGv_i64 s1, TCGv_i64 s2) |
1410 | e023e832 | Alexander Graf | { |
1411 | e023e832 | Alexander Graf | TCGv_i64 tmp; |
1412 | e023e832 | Alexander Graf | TCGv_i64 tmp2; |
1413 | e023e832 | Alexander Graf | TCGv_i32 vl; |
1414 | e023e832 | Alexander Graf | |
1415 | e023e832 | Alexander Graf | /* check for simple 32bit or 64bit match */
|
1416 | e023e832 | Alexander Graf | switch (l) {
|
1417 | e023e832 | Alexander Graf | case 0: |
1418 | e023e832 | Alexander Graf | tmp = tcg_temp_new_i64(); |
1419 | e023e832 | Alexander Graf | tmp2 = tcg_temp_new_i64(); |
1420 | e023e832 | Alexander Graf | |
1421 | e023e832 | Alexander Graf | tcg_gen_qemu_ld8u(tmp, s1, get_mem_index(s)); |
1422 | e023e832 | Alexander Graf | tcg_gen_qemu_ld8u(tmp2, s2, get_mem_index(s)); |
1423 | e023e832 | Alexander Graf | cmp_u64(s, tmp, tmp2); |
1424 | e023e832 | Alexander Graf | |
1425 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
1426 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
1427 | e023e832 | Alexander Graf | return;
|
1428 | e023e832 | Alexander Graf | case 1: |
1429 | e023e832 | Alexander Graf | tmp = tcg_temp_new_i64(); |
1430 | e023e832 | Alexander Graf | tmp2 = tcg_temp_new_i64(); |
1431 | e023e832 | Alexander Graf | |
1432 | e023e832 | Alexander Graf | tcg_gen_qemu_ld16u(tmp, s1, get_mem_index(s)); |
1433 | e023e832 | Alexander Graf | tcg_gen_qemu_ld16u(tmp2, s2, get_mem_index(s)); |
1434 | e023e832 | Alexander Graf | cmp_u64(s, tmp, tmp2); |
1435 | e023e832 | Alexander Graf | |
1436 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
1437 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
1438 | e023e832 | Alexander Graf | return;
|
1439 | e023e832 | Alexander Graf | case 3: |
1440 | e023e832 | Alexander Graf | tmp = tcg_temp_new_i64(); |
1441 | e023e832 | Alexander Graf | tmp2 = tcg_temp_new_i64(); |
1442 | e023e832 | Alexander Graf | |
1443 | e023e832 | Alexander Graf | tcg_gen_qemu_ld32u(tmp, s1, get_mem_index(s)); |
1444 | e023e832 | Alexander Graf | tcg_gen_qemu_ld32u(tmp2, s2, get_mem_index(s)); |
1445 | e023e832 | Alexander Graf | cmp_u64(s, tmp, tmp2); |
1446 | e023e832 | Alexander Graf | |
1447 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
1448 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
1449 | e023e832 | Alexander Graf | return;
|
1450 | e023e832 | Alexander Graf | case 7: |
1451 | e023e832 | Alexander Graf | tmp = tcg_temp_new_i64(); |
1452 | e023e832 | Alexander Graf | tmp2 = tcg_temp_new_i64(); |
1453 | e023e832 | Alexander Graf | |
1454 | e023e832 | Alexander Graf | tcg_gen_qemu_ld64(tmp, s1, get_mem_index(s)); |
1455 | e023e832 | Alexander Graf | tcg_gen_qemu_ld64(tmp2, s2, get_mem_index(s)); |
1456 | e023e832 | Alexander Graf | cmp_u64(s, tmp, tmp2); |
1457 | e023e832 | Alexander Graf | |
1458 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
1459 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
1460 | e023e832 | Alexander Graf | return;
|
1461 | e023e832 | Alexander Graf | } |
1462 | e023e832 | Alexander Graf | |
1463 | e023e832 | Alexander Graf | potential_page_fault(s); |
1464 | e023e832 | Alexander Graf | vl = tcg_const_i32(l); |
1465 | e023e832 | Alexander Graf | gen_helper_clc(cc_op, vl, s1, s2); |
1466 | e023e832 | Alexander Graf | tcg_temp_free_i32(vl); |
1467 | e023e832 | Alexander Graf | set_cc_static(s); |
1468 | e023e832 | Alexander Graf | } |
1469 | e023e832 | Alexander Graf | |
1470 | e023e832 | Alexander Graf | static void disas_e3(DisasContext* s, int op, int r1, int x2, int b2, int d2) |
1471 | e023e832 | Alexander Graf | { |
1472 | e023e832 | Alexander Graf | TCGv_i64 addr, tmp, tmp2, tmp3, tmp4; |
1473 | e023e832 | Alexander Graf | TCGv_i32 tmp32_1, tmp32_2, tmp32_3; |
1474 | e023e832 | Alexander Graf | |
1475 | e023e832 | Alexander Graf | LOG_DISAS("disas_e3: op 0x%x r1 %d x2 %d b2 %d d2 %d\n",
|
1476 | e023e832 | Alexander Graf | op, r1, x2, b2, d2); |
1477 | e023e832 | Alexander Graf | addr = get_address(s, x2, b2, d2); |
1478 | e023e832 | Alexander Graf | switch (op) {
|
1479 | e023e832 | Alexander Graf | case 0x2: /* LTG R1,D2(X2,B2) [RXY] */ |
1480 | e023e832 | Alexander Graf | case 0x4: /* lg r1,d2(x2,b2) */ |
1481 | e023e832 | Alexander Graf | tcg_gen_qemu_ld64(regs[r1], addr, get_mem_index(s)); |
1482 | e023e832 | Alexander Graf | if (op == 0x2) { |
1483 | e023e832 | Alexander Graf | set_cc_s64(s, regs[r1]); |
1484 | e023e832 | Alexander Graf | } |
1485 | e023e832 | Alexander Graf | break;
|
1486 | e023e832 | Alexander Graf | case 0x12: /* LT R1,D2(X2,B2) [RXY] */ |
1487 | e023e832 | Alexander Graf | tmp2 = tcg_temp_new_i64(); |
1488 | e023e832 | Alexander Graf | tmp32_1 = tcg_temp_new_i32(); |
1489 | e023e832 | Alexander Graf | tcg_gen_qemu_ld32s(tmp2, addr, get_mem_index(s)); |
1490 | e023e832 | Alexander Graf | tcg_gen_trunc_i64_i32(tmp32_1, tmp2); |
1491 | e023e832 | Alexander Graf | store_reg32(r1, tmp32_1); |
1492 | e023e832 | Alexander Graf | set_cc_s32(s, tmp32_1); |
1493 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
1494 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
1495 | e023e832 | Alexander Graf | break;
|
1496 | e023e832 | Alexander Graf | case 0xc: /* MSG R1,D2(X2,B2) [RXY] */ |
1497 | e023e832 | Alexander Graf | case 0x1c: /* MSGF R1,D2(X2,B2) [RXY] */ |
1498 | e023e832 | Alexander Graf | tmp2 = tcg_temp_new_i64(); |
1499 | e023e832 | Alexander Graf | if (op == 0xc) { |
1500 | e023e832 | Alexander Graf | tcg_gen_qemu_ld64(tmp2, addr, get_mem_index(s)); |
1501 | e023e832 | Alexander Graf | } else {
|
1502 | e023e832 | Alexander Graf | tcg_gen_qemu_ld32s(tmp2, addr, get_mem_index(s)); |
1503 | e023e832 | Alexander Graf | } |
1504 | e023e832 | Alexander Graf | tcg_gen_mul_i64(regs[r1], regs[r1], tmp2); |
1505 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
1506 | e023e832 | Alexander Graf | break;
|
1507 | e023e832 | Alexander Graf | case 0xd: /* DSG R1,D2(X2,B2) [RXY] */ |
1508 | e023e832 | Alexander Graf | case 0x1d: /* DSGF R1,D2(X2,B2) [RXY] */ |
1509 | e023e832 | Alexander Graf | tmp2 = tcg_temp_new_i64(); |
1510 | e023e832 | Alexander Graf | if (op == 0x1d) { |
1511 | e023e832 | Alexander Graf | tcg_gen_qemu_ld32s(tmp2, addr, get_mem_index(s)); |
1512 | e023e832 | Alexander Graf | } else {
|
1513 | e023e832 | Alexander Graf | tcg_gen_qemu_ld64(tmp2, addr, get_mem_index(s)); |
1514 | e023e832 | Alexander Graf | } |
1515 | e023e832 | Alexander Graf | tmp4 = load_reg(r1 + 1);
|
1516 | e023e832 | Alexander Graf | tmp3 = tcg_temp_new_i64(); |
1517 | e023e832 | Alexander Graf | tcg_gen_div_i64(tmp3, tmp4, tmp2); |
1518 | e023e832 | Alexander Graf | store_reg(r1 + 1, tmp3);
|
1519 | e023e832 | Alexander Graf | tcg_gen_rem_i64(tmp3, tmp4, tmp2); |
1520 | e023e832 | Alexander Graf | store_reg(r1, tmp3); |
1521 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
1522 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp3); |
1523 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp4); |
1524 | e023e832 | Alexander Graf | break;
|
1525 | e023e832 | Alexander Graf | case 0x8: /* AG R1,D2(X2,B2) [RXY] */ |
1526 | e023e832 | Alexander Graf | case 0xa: /* ALG R1,D2(X2,B2) [RXY] */ |
1527 | e023e832 | Alexander Graf | case 0x18: /* AGF R1,D2(X2,B2) [RXY] */ |
1528 | e023e832 | Alexander Graf | case 0x1a: /* ALGF R1,D2(X2,B2) [RXY] */ |
1529 | e023e832 | Alexander Graf | if (op == 0x1a) { |
1530 | e023e832 | Alexander Graf | tmp2 = tcg_temp_new_i64(); |
1531 | e023e832 | Alexander Graf | tcg_gen_qemu_ld32u(tmp2, addr, get_mem_index(s)); |
1532 | e023e832 | Alexander Graf | } else if (op == 0x18) { |
1533 | e023e832 | Alexander Graf | tmp2 = tcg_temp_new_i64(); |
1534 | e023e832 | Alexander Graf | tcg_gen_qemu_ld32s(tmp2, addr, get_mem_index(s)); |
1535 | e023e832 | Alexander Graf | } else {
|
1536 | e023e832 | Alexander Graf | tmp2 = tcg_temp_new_i64(); |
1537 | e023e832 | Alexander Graf | tcg_gen_qemu_ld64(tmp2, addr, get_mem_index(s)); |
1538 | e023e832 | Alexander Graf | } |
1539 | e023e832 | Alexander Graf | tmp4 = load_reg(r1); |
1540 | e023e832 | Alexander Graf | tmp3 = tcg_temp_new_i64(); |
1541 | e023e832 | Alexander Graf | tcg_gen_add_i64(tmp3, tmp4, tmp2); |
1542 | e023e832 | Alexander Graf | store_reg(r1, tmp3); |
1543 | e023e832 | Alexander Graf | switch (op) {
|
1544 | e023e832 | Alexander Graf | case 0x8: |
1545 | e023e832 | Alexander Graf | case 0x18: |
1546 | e023e832 | Alexander Graf | set_cc_add64(s, tmp4, tmp2, tmp3); |
1547 | e023e832 | Alexander Graf | break;
|
1548 | e023e832 | Alexander Graf | case 0xa: |
1549 | e023e832 | Alexander Graf | case 0x1a: |
1550 | e023e832 | Alexander Graf | set_cc_addu64(s, tmp4, tmp2, tmp3); |
1551 | e023e832 | Alexander Graf | break;
|
1552 | e023e832 | Alexander Graf | default:
|
1553 | e023e832 | Alexander Graf | tcg_abort(); |
1554 | e023e832 | Alexander Graf | } |
1555 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
1556 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp3); |
1557 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp4); |
1558 | e023e832 | Alexander Graf | break;
|
1559 | e023e832 | Alexander Graf | case 0x9: /* SG R1,D2(X2,B2) [RXY] */ |
1560 | e023e832 | Alexander Graf | case 0xb: /* SLG R1,D2(X2,B2) [RXY] */ |
1561 | e023e832 | Alexander Graf | case 0x19: /* SGF R1,D2(X2,B2) [RXY] */ |
1562 | e023e832 | Alexander Graf | case 0x1b: /* SLGF R1,D2(X2,B2) [RXY] */ |
1563 | e023e832 | Alexander Graf | tmp2 = tcg_temp_new_i64(); |
1564 | e023e832 | Alexander Graf | if (op == 0x19) { |
1565 | e023e832 | Alexander Graf | tcg_gen_qemu_ld32s(tmp2, addr, get_mem_index(s)); |
1566 | e023e832 | Alexander Graf | } else if (op == 0x1b) { |
1567 | e023e832 | Alexander Graf | tcg_gen_qemu_ld32u(tmp2, addr, get_mem_index(s)); |
1568 | e023e832 | Alexander Graf | } else {
|
1569 | e023e832 | Alexander Graf | tcg_gen_qemu_ld64(tmp2, addr, get_mem_index(s)); |
1570 | e023e832 | Alexander Graf | } |
1571 | e023e832 | Alexander Graf | tmp4 = load_reg(r1); |
1572 | e023e832 | Alexander Graf | tmp3 = tcg_temp_new_i64(); |
1573 | e023e832 | Alexander Graf | tcg_gen_sub_i64(tmp3, tmp4, tmp2); |
1574 | e023e832 | Alexander Graf | store_reg(r1, tmp3); |
1575 | e023e832 | Alexander Graf | switch (op) {
|
1576 | e023e832 | Alexander Graf | case 0x9: |
1577 | e023e832 | Alexander Graf | case 0x19: |
1578 | e023e832 | Alexander Graf | set_cc_sub64(s, tmp4, tmp2, tmp3); |
1579 | e023e832 | Alexander Graf | break;
|
1580 | e023e832 | Alexander Graf | case 0xb: |
1581 | e023e832 | Alexander Graf | case 0x1b: |
1582 | e023e832 | Alexander Graf | set_cc_subu64(s, tmp4, tmp2, tmp3); |
1583 | e023e832 | Alexander Graf | break;
|
1584 | e023e832 | Alexander Graf | default:
|
1585 | e023e832 | Alexander Graf | tcg_abort(); |
1586 | e023e832 | Alexander Graf | } |
1587 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
1588 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp3); |
1589 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp4); |
1590 | e023e832 | Alexander Graf | break;
|
1591 | e023e832 | Alexander Graf | case 0xf: /* LRVG R1,D2(X2,B2) [RXE] */ |
1592 | e023e832 | Alexander Graf | tmp2 = tcg_temp_new_i64(); |
1593 | e023e832 | Alexander Graf | tcg_gen_qemu_ld64(tmp2, addr, get_mem_index(s)); |
1594 | e023e832 | Alexander Graf | tcg_gen_bswap64_i64(tmp2, tmp2); |
1595 | e023e832 | Alexander Graf | store_reg(r1, tmp2); |
1596 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
1597 | e023e832 | Alexander Graf | break;
|
1598 | e023e832 | Alexander Graf | case 0x14: /* LGF R1,D2(X2,B2) [RXY] */ |
1599 | e023e832 | Alexander Graf | case 0x16: /* LLGF R1,D2(X2,B2) [RXY] */ |
1600 | e023e832 | Alexander Graf | tmp2 = tcg_temp_new_i64(); |
1601 | e023e832 | Alexander Graf | tcg_gen_qemu_ld32u(tmp2, addr, get_mem_index(s)); |
1602 | e023e832 | Alexander Graf | if (op == 0x14) { |
1603 | e023e832 | Alexander Graf | tcg_gen_ext32s_i64(tmp2, tmp2); |
1604 | e023e832 | Alexander Graf | } |
1605 | e023e832 | Alexander Graf | store_reg(r1, tmp2); |
1606 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
1607 | e023e832 | Alexander Graf | break;
|
1608 | e023e832 | Alexander Graf | case 0x15: /* LGH R1,D2(X2,B2) [RXY] */ |
1609 | e023e832 | Alexander Graf | tmp2 = tcg_temp_new_i64(); |
1610 | e023e832 | Alexander Graf | tcg_gen_qemu_ld16s(tmp2, addr, get_mem_index(s)); |
1611 | e023e832 | Alexander Graf | store_reg(r1, tmp2); |
1612 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
1613 | e023e832 | Alexander Graf | break;
|
1614 | e023e832 | Alexander Graf | case 0x17: /* LLGT R1,D2(X2,B2) [RXY] */ |
1615 | e023e832 | Alexander Graf | tmp2 = tcg_temp_new_i64(); |
1616 | e023e832 | Alexander Graf | tcg_gen_qemu_ld32u(tmp2, addr, get_mem_index(s)); |
1617 | e023e832 | Alexander Graf | tcg_gen_andi_i64(tmp2, tmp2, 0x7fffffffULL);
|
1618 | e023e832 | Alexander Graf | store_reg(r1, tmp2); |
1619 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
1620 | e023e832 | Alexander Graf | break;
|
1621 | e023e832 | Alexander Graf | case 0x1e: /* LRV R1,D2(X2,B2) [RXY] */ |
1622 | e023e832 | Alexander Graf | tmp2 = tcg_temp_new_i64(); |
1623 | e023e832 | Alexander Graf | tmp32_1 = tcg_temp_new_i32(); |
1624 | e023e832 | Alexander Graf | tcg_gen_qemu_ld32u(tmp2, addr, get_mem_index(s)); |
1625 | e023e832 | Alexander Graf | tcg_gen_trunc_i64_i32(tmp32_1, tmp2); |
1626 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
1627 | e023e832 | Alexander Graf | tcg_gen_bswap32_i32(tmp32_1, tmp32_1); |
1628 | e023e832 | Alexander Graf | store_reg32(r1, tmp32_1); |
1629 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
1630 | e023e832 | Alexander Graf | break;
|
1631 | e023e832 | Alexander Graf | case 0x1f: /* LRVH R1,D2(X2,B2) [RXY] */ |
1632 | e023e832 | Alexander Graf | tmp2 = tcg_temp_new_i64(); |
1633 | e023e832 | Alexander Graf | tmp32_1 = tcg_temp_new_i32(); |
1634 | e023e832 | Alexander Graf | tcg_gen_qemu_ld16u(tmp2, addr, get_mem_index(s)); |
1635 | e023e832 | Alexander Graf | tcg_gen_trunc_i64_i32(tmp32_1, tmp2); |
1636 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
1637 | e023e832 | Alexander Graf | tcg_gen_bswap16_i32(tmp32_1, tmp32_1); |
1638 | e023e832 | Alexander Graf | store_reg16(r1, tmp32_1); |
1639 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
1640 | e023e832 | Alexander Graf | break;
|
1641 | e023e832 | Alexander Graf | case 0x20: /* CG R1,D2(X2,B2) [RXY] */ |
1642 | e023e832 | Alexander Graf | case 0x21: /* CLG R1,D2(X2,B2) */ |
1643 | e023e832 | Alexander Graf | case 0x30: /* CGF R1,D2(X2,B2) [RXY] */ |
1644 | e023e832 | Alexander Graf | case 0x31: /* CLGF R1,D2(X2,B2) [RXY] */ |
1645 | e023e832 | Alexander Graf | tmp2 = tcg_temp_new_i64(); |
1646 | e023e832 | Alexander Graf | switch (op) {
|
1647 | e023e832 | Alexander Graf | case 0x20: |
1648 | e023e832 | Alexander Graf | case 0x21: |
1649 | e023e832 | Alexander Graf | tcg_gen_qemu_ld64(tmp2, addr, get_mem_index(s)); |
1650 | e023e832 | Alexander Graf | break;
|
1651 | e023e832 | Alexander Graf | case 0x30: |
1652 | e023e832 | Alexander Graf | tcg_gen_qemu_ld32s(tmp2, addr, get_mem_index(s)); |
1653 | e023e832 | Alexander Graf | break;
|
1654 | e023e832 | Alexander Graf | case 0x31: |
1655 | e023e832 | Alexander Graf | tcg_gen_qemu_ld32u(tmp2, addr, get_mem_index(s)); |
1656 | e023e832 | Alexander Graf | break;
|
1657 | e023e832 | Alexander Graf | default:
|
1658 | e023e832 | Alexander Graf | tcg_abort(); |
1659 | e023e832 | Alexander Graf | } |
1660 | e023e832 | Alexander Graf | switch (op) {
|
1661 | e023e832 | Alexander Graf | case 0x20: |
1662 | e023e832 | Alexander Graf | case 0x30: |
1663 | e023e832 | Alexander Graf | cmp_s64(s, regs[r1], tmp2); |
1664 | e023e832 | Alexander Graf | break;
|
1665 | e023e832 | Alexander Graf | case 0x21: |
1666 | e023e832 | Alexander Graf | case 0x31: |
1667 | e023e832 | Alexander Graf | cmp_u64(s, regs[r1], tmp2); |
1668 | e023e832 | Alexander Graf | break;
|
1669 | e023e832 | Alexander Graf | default:
|
1670 | e023e832 | Alexander Graf | tcg_abort(); |
1671 | e023e832 | Alexander Graf | } |
1672 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
1673 | e023e832 | Alexander Graf | break;
|
1674 | e023e832 | Alexander Graf | case 0x24: /* stg r1, d2(x2,b2) */ |
1675 | e023e832 | Alexander Graf | tcg_gen_qemu_st64(regs[r1], addr, get_mem_index(s)); |
1676 | e023e832 | Alexander Graf | break;
|
1677 | e023e832 | Alexander Graf | case 0x3e: /* STRV R1,D2(X2,B2) [RXY] */ |
1678 | e023e832 | Alexander Graf | tmp32_1 = load_reg32(r1); |
1679 | e023e832 | Alexander Graf | tmp2 = tcg_temp_new_i64(); |
1680 | e023e832 | Alexander Graf | tcg_gen_bswap32_i32(tmp32_1, tmp32_1); |
1681 | e023e832 | Alexander Graf | tcg_gen_extu_i32_i64(tmp2, tmp32_1); |
1682 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
1683 | e023e832 | Alexander Graf | tcg_gen_qemu_st32(tmp2, addr, get_mem_index(s)); |
1684 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
1685 | e023e832 | Alexander Graf | break;
|
1686 | e023e832 | Alexander Graf | case 0x50: /* STY R1,D2(X2,B2) [RXY] */ |
1687 | e023e832 | Alexander Graf | tmp32_1 = load_reg32(r1); |
1688 | e023e832 | Alexander Graf | tmp2 = tcg_temp_new_i64(); |
1689 | e023e832 | Alexander Graf | tcg_gen_extu_i32_i64(tmp2, tmp32_1); |
1690 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
1691 | e023e832 | Alexander Graf | tcg_gen_qemu_st32(tmp2, addr, get_mem_index(s)); |
1692 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
1693 | e023e832 | Alexander Graf | break;
|
1694 | e023e832 | Alexander Graf | case 0x57: /* XY R1,D2(X2,B2) [RXY] */ |
1695 | e023e832 | Alexander Graf | tmp32_1 = load_reg32(r1); |
1696 | e023e832 | Alexander Graf | tmp32_2 = tcg_temp_new_i32(); |
1697 | e023e832 | Alexander Graf | tmp2 = tcg_temp_new_i64(); |
1698 | e023e832 | Alexander Graf | tcg_gen_qemu_ld32u(tmp2, addr, get_mem_index(s)); |
1699 | e023e832 | Alexander Graf | tcg_gen_trunc_i64_i32(tmp32_2, tmp2); |
1700 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
1701 | e023e832 | Alexander Graf | tcg_gen_xor_i32(tmp32_2, tmp32_1, tmp32_2); |
1702 | e023e832 | Alexander Graf | store_reg32(r1, tmp32_2); |
1703 | e023e832 | Alexander Graf | set_cc_nz_u32(s, tmp32_2); |
1704 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
1705 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_2); |
1706 | e023e832 | Alexander Graf | break;
|
1707 | e023e832 | Alexander Graf | case 0x58: /* LY R1,D2(X2,B2) [RXY] */ |
1708 | e023e832 | Alexander Graf | tmp3 = tcg_temp_new_i64(); |
1709 | e023e832 | Alexander Graf | tcg_gen_qemu_ld32u(tmp3, addr, get_mem_index(s)); |
1710 | e023e832 | Alexander Graf | store_reg32_i64(r1, tmp3); |
1711 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp3); |
1712 | e023e832 | Alexander Graf | break;
|
1713 | e023e832 | Alexander Graf | case 0x5a: /* AY R1,D2(X2,B2) [RXY] */ |
1714 | e023e832 | Alexander Graf | case 0x5b: /* SY R1,D2(X2,B2) [RXY] */ |
1715 | e023e832 | Alexander Graf | tmp32_1 = load_reg32(r1); |
1716 | e023e832 | Alexander Graf | tmp32_2 = tcg_temp_new_i32(); |
1717 | e023e832 | Alexander Graf | tmp32_3 = tcg_temp_new_i32(); |
1718 | e023e832 | Alexander Graf | tmp2 = tcg_temp_new_i64(); |
1719 | e023e832 | Alexander Graf | tcg_gen_qemu_ld32s(tmp2, addr, get_mem_index(s)); |
1720 | e023e832 | Alexander Graf | tcg_gen_trunc_i64_i32(tmp32_2, tmp2); |
1721 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
1722 | e023e832 | Alexander Graf | switch (op) {
|
1723 | e023e832 | Alexander Graf | case 0x5a: |
1724 | e023e832 | Alexander Graf | tcg_gen_add_i32(tmp32_3, tmp32_1, tmp32_2); |
1725 | e023e832 | Alexander Graf | break;
|
1726 | e023e832 | Alexander Graf | case 0x5b: |
1727 | e023e832 | Alexander Graf | tcg_gen_sub_i32(tmp32_3, tmp32_1, tmp32_2); |
1728 | e023e832 | Alexander Graf | break;
|
1729 | e023e832 | Alexander Graf | default:
|
1730 | e023e832 | Alexander Graf | tcg_abort(); |
1731 | e023e832 | Alexander Graf | } |
1732 | e023e832 | Alexander Graf | store_reg32(r1, tmp32_3); |
1733 | e023e832 | Alexander Graf | switch (op) {
|
1734 | e023e832 | Alexander Graf | case 0x5a: |
1735 | e023e832 | Alexander Graf | set_cc_add32(s, tmp32_1, tmp32_2, tmp32_3); |
1736 | e023e832 | Alexander Graf | break;
|
1737 | e023e832 | Alexander Graf | case 0x5b: |
1738 | e023e832 | Alexander Graf | set_cc_sub32(s, tmp32_1, tmp32_2, tmp32_3); |
1739 | e023e832 | Alexander Graf | break;
|
1740 | e023e832 | Alexander Graf | default:
|
1741 | e023e832 | Alexander Graf | tcg_abort(); |
1742 | e023e832 | Alexander Graf | } |
1743 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
1744 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_2); |
1745 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_3); |
1746 | e023e832 | Alexander Graf | break;
|
1747 | e023e832 | Alexander Graf | case 0x71: /* LAY R1,D2(X2,B2) [RXY] */ |
1748 | e023e832 | Alexander Graf | store_reg(r1, addr); |
1749 | e023e832 | Alexander Graf | break;
|
1750 | e023e832 | Alexander Graf | case 0x72: /* STCY R1,D2(X2,B2) [RXY] */ |
1751 | e023e832 | Alexander Graf | tmp32_1 = load_reg32(r1); |
1752 | e023e832 | Alexander Graf | tmp2 = tcg_temp_new_i64(); |
1753 | e023e832 | Alexander Graf | tcg_gen_ext_i32_i64(tmp2, tmp32_1); |
1754 | e023e832 | Alexander Graf | tcg_gen_qemu_st8(tmp2, addr, get_mem_index(s)); |
1755 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
1756 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
1757 | e023e832 | Alexander Graf | break;
|
1758 | e023e832 | Alexander Graf | case 0x73: /* ICY R1,D2(X2,B2) [RXY] */ |
1759 | e023e832 | Alexander Graf | tmp3 = tcg_temp_new_i64(); |
1760 | e023e832 | Alexander Graf | tcg_gen_qemu_ld8u(tmp3, addr, get_mem_index(s)); |
1761 | e023e832 | Alexander Graf | store_reg8(r1, tmp3); |
1762 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp3); |
1763 | e023e832 | Alexander Graf | break;
|
1764 | e023e832 | Alexander Graf | case 0x76: /* LB R1,D2(X2,B2) [RXY] */ |
1765 | e023e832 | Alexander Graf | case 0x77: /* LGB R1,D2(X2,B2) [RXY] */ |
1766 | e023e832 | Alexander Graf | tmp2 = tcg_temp_new_i64(); |
1767 | e023e832 | Alexander Graf | tcg_gen_qemu_ld8s(tmp2, addr, get_mem_index(s)); |
1768 | e023e832 | Alexander Graf | switch (op) {
|
1769 | e023e832 | Alexander Graf | case 0x76: |
1770 | e023e832 | Alexander Graf | tcg_gen_ext8s_i64(tmp2, tmp2); |
1771 | e023e832 | Alexander Graf | store_reg32_i64(r1, tmp2); |
1772 | e023e832 | Alexander Graf | break;
|
1773 | e023e832 | Alexander Graf | case 0x77: |
1774 | e023e832 | Alexander Graf | tcg_gen_ext8s_i64(tmp2, tmp2); |
1775 | e023e832 | Alexander Graf | store_reg(r1, tmp2); |
1776 | e023e832 | Alexander Graf | break;
|
1777 | e023e832 | Alexander Graf | default:
|
1778 | e023e832 | Alexander Graf | tcg_abort(); |
1779 | e023e832 | Alexander Graf | } |
1780 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
1781 | e023e832 | Alexander Graf | break;
|
1782 | e023e832 | Alexander Graf | case 0x78: /* LHY R1,D2(X2,B2) [RXY] */ |
1783 | e023e832 | Alexander Graf | tmp2 = tcg_temp_new_i64(); |
1784 | e023e832 | Alexander Graf | tcg_gen_qemu_ld16s(tmp2, addr, get_mem_index(s)); |
1785 | e023e832 | Alexander Graf | store_reg32_i64(r1, tmp2); |
1786 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
1787 | e023e832 | Alexander Graf | break;
|
1788 | e023e832 | Alexander Graf | case 0x80: /* NG R1,D2(X2,B2) [RXY] */ |
1789 | e023e832 | Alexander Graf | case 0x81: /* OG R1,D2(X2,B2) [RXY] */ |
1790 | e023e832 | Alexander Graf | case 0x82: /* XG R1,D2(X2,B2) [RXY] */ |
1791 | e023e832 | Alexander Graf | tmp3 = tcg_temp_new_i64(); |
1792 | e023e832 | Alexander Graf | tcg_gen_qemu_ld64(tmp3, addr, get_mem_index(s)); |
1793 | e023e832 | Alexander Graf | switch (op) {
|
1794 | e023e832 | Alexander Graf | case 0x80: |
1795 | e023e832 | Alexander Graf | tcg_gen_and_i64(regs[r1], regs[r1], tmp3); |
1796 | e023e832 | Alexander Graf | break;
|
1797 | e023e832 | Alexander Graf | case 0x81: |
1798 | e023e832 | Alexander Graf | tcg_gen_or_i64(regs[r1], regs[r1], tmp3); |
1799 | e023e832 | Alexander Graf | break;
|
1800 | e023e832 | Alexander Graf | case 0x82: |
1801 | e023e832 | Alexander Graf | tcg_gen_xor_i64(regs[r1], regs[r1], tmp3); |
1802 | e023e832 | Alexander Graf | break;
|
1803 | e023e832 | Alexander Graf | default:
|
1804 | e023e832 | Alexander Graf | tcg_abort(); |
1805 | e023e832 | Alexander Graf | } |
1806 | e023e832 | Alexander Graf | set_cc_nz_u64(s, regs[r1]); |
1807 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp3); |
1808 | e023e832 | Alexander Graf | break;
|
1809 | e023e832 | Alexander Graf | case 0x86: /* MLG R1,D2(X2,B2) [RXY] */ |
1810 | e023e832 | Alexander Graf | tmp2 = tcg_temp_new_i64(); |
1811 | e023e832 | Alexander Graf | tmp32_1 = tcg_const_i32(r1); |
1812 | e023e832 | Alexander Graf | tcg_gen_qemu_ld64(tmp2, addr, get_mem_index(s)); |
1813 | e023e832 | Alexander Graf | gen_helper_mlg(tmp32_1, tmp2); |
1814 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
1815 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
1816 | e023e832 | Alexander Graf | break;
|
1817 | e023e832 | Alexander Graf | case 0x87: /* DLG R1,D2(X2,B2) [RXY] */ |
1818 | e023e832 | Alexander Graf | tmp2 = tcg_temp_new_i64(); |
1819 | e023e832 | Alexander Graf | tmp32_1 = tcg_const_i32(r1); |
1820 | e023e832 | Alexander Graf | tcg_gen_qemu_ld64(tmp2, addr, get_mem_index(s)); |
1821 | e023e832 | Alexander Graf | gen_helper_dlg(tmp32_1, tmp2); |
1822 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
1823 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
1824 | e023e832 | Alexander Graf | break;
|
1825 | e023e832 | Alexander Graf | case 0x88: /* ALCG R1,D2(X2,B2) [RXY] */ |
1826 | e023e832 | Alexander Graf | tmp2 = tcg_temp_new_i64(); |
1827 | e023e832 | Alexander Graf | tmp3 = tcg_temp_new_i64(); |
1828 | e023e832 | Alexander Graf | tcg_gen_qemu_ld64(tmp2, addr, get_mem_index(s)); |
1829 | e023e832 | Alexander Graf | /* XXX possible optimization point */
|
1830 | e023e832 | Alexander Graf | gen_op_calc_cc(s); |
1831 | e023e832 | Alexander Graf | tcg_gen_extu_i32_i64(tmp3, cc_op); |
1832 | e023e832 | Alexander Graf | tcg_gen_shri_i64(tmp3, tmp3, 1);
|
1833 | e023e832 | Alexander Graf | tcg_gen_andi_i64(tmp3, tmp3, 1);
|
1834 | e023e832 | Alexander Graf | tcg_gen_add_i64(tmp3, tmp2, tmp3); |
1835 | e023e832 | Alexander Graf | tcg_gen_add_i64(tmp3, regs[r1], tmp3); |
1836 | e023e832 | Alexander Graf | store_reg(r1, tmp3); |
1837 | e023e832 | Alexander Graf | set_cc_addu64(s, regs[r1], tmp2, tmp3); |
1838 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
1839 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp3); |
1840 | e023e832 | Alexander Graf | break;
|
1841 | e023e832 | Alexander Graf | case 0x89: /* SLBG R1,D2(X2,B2) [RXY] */ |
1842 | e023e832 | Alexander Graf | tmp2 = tcg_temp_new_i64(); |
1843 | e023e832 | Alexander Graf | tmp32_1 = tcg_const_i32(r1); |
1844 | e023e832 | Alexander Graf | tcg_gen_qemu_ld64(tmp2, addr, get_mem_index(s)); |
1845 | e023e832 | Alexander Graf | /* XXX possible optimization point */
|
1846 | e023e832 | Alexander Graf | gen_op_calc_cc(s); |
1847 | e023e832 | Alexander Graf | gen_helper_slbg(cc_op, cc_op, tmp32_1, regs[r1], tmp2); |
1848 | e023e832 | Alexander Graf | set_cc_static(s); |
1849 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
1850 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
1851 | e023e832 | Alexander Graf | break;
|
1852 | e023e832 | Alexander Graf | case 0x90: /* LLGC R1,D2(X2,B2) [RXY] */ |
1853 | e023e832 | Alexander Graf | tcg_gen_qemu_ld8u(regs[r1], addr, get_mem_index(s)); |
1854 | e023e832 | Alexander Graf | break;
|
1855 | e023e832 | Alexander Graf | case 0x91: /* LLGH R1,D2(X2,B2) [RXY] */ |
1856 | e023e832 | Alexander Graf | tcg_gen_qemu_ld16u(regs[r1], addr, get_mem_index(s)); |
1857 | e023e832 | Alexander Graf | break;
|
1858 | e023e832 | Alexander Graf | case 0x94: /* LLC R1,D2(X2,B2) [RXY] */ |
1859 | e023e832 | Alexander Graf | tmp2 = tcg_temp_new_i64(); |
1860 | e023e832 | Alexander Graf | tcg_gen_qemu_ld8u(tmp2, addr, get_mem_index(s)); |
1861 | e023e832 | Alexander Graf | store_reg32_i64(r1, tmp2); |
1862 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
1863 | e023e832 | Alexander Graf | break;
|
1864 | e023e832 | Alexander Graf | case 0x95: /* LLH R1,D2(X2,B2) [RXY] */ |
1865 | e023e832 | Alexander Graf | tmp2 = tcg_temp_new_i64(); |
1866 | e023e832 | Alexander Graf | tcg_gen_qemu_ld16u(tmp2, addr, get_mem_index(s)); |
1867 | e023e832 | Alexander Graf | store_reg32_i64(r1, tmp2); |
1868 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
1869 | e023e832 | Alexander Graf | break;
|
1870 | e023e832 | Alexander Graf | case 0x96: /* ML R1,D2(X2,B2) [RXY] */ |
1871 | e023e832 | Alexander Graf | tmp2 = tcg_temp_new_i64(); |
1872 | e023e832 | Alexander Graf | tmp3 = load_reg((r1 + 1) & 15); |
1873 | e023e832 | Alexander Graf | tcg_gen_ext32u_i64(tmp3, tmp3); |
1874 | e023e832 | Alexander Graf | tcg_gen_qemu_ld32u(tmp2, addr, get_mem_index(s)); |
1875 | e023e832 | Alexander Graf | tcg_gen_mul_i64(tmp2, tmp2, tmp3); |
1876 | e023e832 | Alexander Graf | store_reg32_i64((r1 + 1) & 15, tmp2); |
1877 | e023e832 | Alexander Graf | tcg_gen_shri_i64(tmp2, tmp2, 32);
|
1878 | e023e832 | Alexander Graf | store_reg32_i64(r1, tmp2); |
1879 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
1880 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp3); |
1881 | e023e832 | Alexander Graf | break;
|
1882 | e023e832 | Alexander Graf | case 0x97: /* DL R1,D2(X2,B2) [RXY] */ |
1883 | e023e832 | Alexander Graf | /* reg(r1) = reg(r1, r1+1) % ld32(addr) */
|
1884 | e023e832 | Alexander Graf | /* reg(r1+1) = reg(r1, r1+1) / ld32(addr) */
|
1885 | e023e832 | Alexander Graf | tmp = load_reg(r1); |
1886 | e023e832 | Alexander Graf | tmp2 = tcg_temp_new_i64(); |
1887 | e023e832 | Alexander Graf | tcg_gen_qemu_ld32u(tmp2, addr, get_mem_index(s)); |
1888 | e023e832 | Alexander Graf | tmp3 = load_reg((r1 + 1) & 15); |
1889 | e023e832 | Alexander Graf | tcg_gen_ext32u_i64(tmp2, tmp2); |
1890 | e023e832 | Alexander Graf | tcg_gen_ext32u_i64(tmp3, tmp3); |
1891 | e023e832 | Alexander Graf | tcg_gen_shli_i64(tmp, tmp, 32);
|
1892 | e023e832 | Alexander Graf | tcg_gen_or_i64(tmp, tmp, tmp3); |
1893 | e023e832 | Alexander Graf | |
1894 | e023e832 | Alexander Graf | tcg_gen_rem_i64(tmp3, tmp, tmp2); |
1895 | e023e832 | Alexander Graf | tcg_gen_div_i64(tmp, tmp, tmp2); |
1896 | e023e832 | Alexander Graf | store_reg32_i64((r1 + 1) & 15, tmp); |
1897 | e023e832 | Alexander Graf | store_reg32_i64(r1, tmp3); |
1898 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
1899 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
1900 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp3); |
1901 | e023e832 | Alexander Graf | break;
|
1902 | e023e832 | Alexander Graf | case 0x98: /* ALC R1,D2(X2,B2) [RXY] */ |
1903 | e023e832 | Alexander Graf | tmp2 = tcg_temp_new_i64(); |
1904 | e023e832 | Alexander Graf | tmp32_1 = load_reg32(r1); |
1905 | e023e832 | Alexander Graf | tmp32_2 = tcg_temp_new_i32(); |
1906 | e023e832 | Alexander Graf | tmp32_3 = tcg_temp_new_i32(); |
1907 | e023e832 | Alexander Graf | tcg_gen_qemu_ld32u(tmp2, addr, get_mem_index(s)); |
1908 | e023e832 | Alexander Graf | tcg_gen_trunc_i64_i32(tmp32_2, tmp2); |
1909 | e023e832 | Alexander Graf | /* XXX possible optimization point */
|
1910 | e023e832 | Alexander Graf | gen_op_calc_cc(s); |
1911 | e023e832 | Alexander Graf | gen_helper_addc_u32(tmp32_3, cc_op, tmp32_1, tmp32_2); |
1912 | e023e832 | Alexander Graf | set_cc_addu32(s, tmp32_1, tmp32_2, tmp32_3); |
1913 | e023e832 | Alexander Graf | store_reg32(r1, tmp32_3); |
1914 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
1915 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
1916 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_2); |
1917 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_3); |
1918 | e023e832 | Alexander Graf | break;
|
1919 | e023e832 | Alexander Graf | case 0x99: /* SLB R1,D2(X2,B2) [RXY] */ |
1920 | e023e832 | Alexander Graf | tmp2 = tcg_temp_new_i64(); |
1921 | e023e832 | Alexander Graf | tmp32_1 = tcg_const_i32(r1); |
1922 | e023e832 | Alexander Graf | tmp32_2 = tcg_temp_new_i32(); |
1923 | e023e832 | Alexander Graf | tcg_gen_qemu_ld32u(tmp2, addr, get_mem_index(s)); |
1924 | e023e832 | Alexander Graf | tcg_gen_trunc_i64_i32(tmp32_2, tmp2); |
1925 | e023e832 | Alexander Graf | /* XXX possible optimization point */
|
1926 | e023e832 | Alexander Graf | gen_op_calc_cc(s); |
1927 | e023e832 | Alexander Graf | gen_helper_slb(cc_op, cc_op, tmp32_1, tmp32_2); |
1928 | e023e832 | Alexander Graf | set_cc_static(s); |
1929 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
1930 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
1931 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_2); |
1932 | e023e832 | Alexander Graf | break;
|
1933 | e023e832 | Alexander Graf | default:
|
1934 | e023e832 | Alexander Graf | LOG_DISAS("illegal e3 operation 0x%x\n", op);
|
1935 | e023e832 | Alexander Graf | gen_illegal_opcode(s, 3);
|
1936 | e023e832 | Alexander Graf | break;
|
1937 | e023e832 | Alexander Graf | } |
1938 | e023e832 | Alexander Graf | tcg_temp_free_i64(addr); |
1939 | e023e832 | Alexander Graf | } |
1940 | e023e832 | Alexander Graf | |
1941 | e023e832 | Alexander Graf | #ifndef CONFIG_USER_ONLY
|
1942 | e023e832 | Alexander Graf | static void disas_e5(DisasContext* s, uint64_t insn) |
1943 | e023e832 | Alexander Graf | { |
1944 | e023e832 | Alexander Graf | TCGv_i64 tmp, tmp2; |
1945 | e023e832 | Alexander Graf | int op = (insn >> 32) & 0xff; |
1946 | e023e832 | Alexander Graf | |
1947 | e023e832 | Alexander Graf | tmp = get_address(s, 0, (insn >> 28) & 0xf, (insn >> 16) & 0xfff); |
1948 | e023e832 | Alexander Graf | tmp2 = get_address(s, 0, (insn >> 12) & 0xf, insn & 0xfff); |
1949 | e023e832 | Alexander Graf | |
1950 | e023e832 | Alexander Graf | LOG_DISAS("disas_e5: insn %" PRIx64 "\n", insn); |
1951 | e023e832 | Alexander Graf | switch (op) {
|
1952 | e023e832 | Alexander Graf | case 0x01: /* TPROT D1(B1),D2(B2) [SSE] */ |
1953 | e023e832 | Alexander Graf | /* Test Protection */
|
1954 | e023e832 | Alexander Graf | potential_page_fault(s); |
1955 | e023e832 | Alexander Graf | gen_helper_tprot(cc_op, tmp, tmp2); |
1956 | e023e832 | Alexander Graf | set_cc_static(s); |
1957 | e023e832 | Alexander Graf | break;
|
1958 | e023e832 | Alexander Graf | default:
|
1959 | e023e832 | Alexander Graf | LOG_DISAS("illegal e5 operation 0x%x\n", op);
|
1960 | e023e832 | Alexander Graf | gen_illegal_opcode(s, 3);
|
1961 | e023e832 | Alexander Graf | break;
|
1962 | e023e832 | Alexander Graf | } |
1963 | e023e832 | Alexander Graf | |
1964 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
1965 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
1966 | e023e832 | Alexander Graf | } |
1967 | e023e832 | Alexander Graf | #endif
|
1968 | e023e832 | Alexander Graf | |
1969 | e023e832 | Alexander Graf | static void disas_eb(DisasContext *s, int op, int r1, int r3, int b2, int d2) |
1970 | e023e832 | Alexander Graf | { |
1971 | e023e832 | Alexander Graf | TCGv_i64 tmp, tmp2, tmp3, tmp4; |
1972 | e023e832 | Alexander Graf | TCGv_i32 tmp32_1, tmp32_2; |
1973 | e023e832 | Alexander Graf | int i, stm_len;
|
1974 | e023e832 | Alexander Graf | int ilc = 3; |
1975 | e023e832 | Alexander Graf | |
1976 | e023e832 | Alexander Graf | LOG_DISAS("disas_eb: op 0x%x r1 %d r3 %d b2 %d d2 0x%x\n",
|
1977 | e023e832 | Alexander Graf | op, r1, r3, b2, d2); |
1978 | e023e832 | Alexander Graf | switch (op) {
|
1979 | e023e832 | Alexander Graf | case 0xc: /* SRLG R1,R3,D2(B2) [RSY] */ |
1980 | e023e832 | Alexander Graf | case 0xd: /* SLLG R1,R3,D2(B2) [RSY] */ |
1981 | e023e832 | Alexander Graf | case 0xa: /* SRAG R1,R3,D2(B2) [RSY] */ |
1982 | e023e832 | Alexander Graf | case 0xb: /* SLAG R1,R3,D2(B2) [RSY] */ |
1983 | e023e832 | Alexander Graf | case 0x1c: /* RLLG R1,R3,D2(B2) [RSY] */ |
1984 | e023e832 | Alexander Graf | if (b2) {
|
1985 | e023e832 | Alexander Graf | tmp = get_address(s, 0, b2, d2);
|
1986 | e023e832 | Alexander Graf | tcg_gen_andi_i64(tmp, tmp, 0x3f);
|
1987 | e023e832 | Alexander Graf | } else {
|
1988 | e023e832 | Alexander Graf | tmp = tcg_const_i64(d2 & 0x3f);
|
1989 | e023e832 | Alexander Graf | } |
1990 | e023e832 | Alexander Graf | switch (op) {
|
1991 | e023e832 | Alexander Graf | case 0xc: |
1992 | e023e832 | Alexander Graf | tcg_gen_shr_i64(regs[r1], regs[r3], tmp); |
1993 | e023e832 | Alexander Graf | break;
|
1994 | e023e832 | Alexander Graf | case 0xd: |
1995 | e023e832 | Alexander Graf | tcg_gen_shl_i64(regs[r1], regs[r3], tmp); |
1996 | e023e832 | Alexander Graf | break;
|
1997 | e023e832 | Alexander Graf | case 0xa: |
1998 | e023e832 | Alexander Graf | tcg_gen_sar_i64(regs[r1], regs[r3], tmp); |
1999 | e023e832 | Alexander Graf | break;
|
2000 | e023e832 | Alexander Graf | case 0xb: |
2001 | e023e832 | Alexander Graf | tmp2 = tcg_temp_new_i64(); |
2002 | e023e832 | Alexander Graf | tmp3 = tcg_temp_new_i64(); |
2003 | e023e832 | Alexander Graf | gen_op_update2_cc_i64(s, CC_OP_SLAG, regs[r3], tmp); |
2004 | e023e832 | Alexander Graf | tcg_gen_shl_i64(tmp2, regs[r3], tmp); |
2005 | e023e832 | Alexander Graf | /* override sign bit with source sign */
|
2006 | e023e832 | Alexander Graf | tcg_gen_andi_i64(tmp2, tmp2, ~0x8000000000000000ULL);
|
2007 | e023e832 | Alexander Graf | tcg_gen_andi_i64(tmp3, regs[r3], 0x8000000000000000ULL);
|
2008 | e023e832 | Alexander Graf | tcg_gen_or_i64(regs[r1], tmp2, tmp3); |
2009 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
2010 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp3); |
2011 | e023e832 | Alexander Graf | break;
|
2012 | e023e832 | Alexander Graf | case 0x1c: |
2013 | e023e832 | Alexander Graf | tcg_gen_rotl_i64(regs[r1], regs[r3], tmp); |
2014 | e023e832 | Alexander Graf | break;
|
2015 | e023e832 | Alexander Graf | default:
|
2016 | e023e832 | Alexander Graf | tcg_abort(); |
2017 | e023e832 | Alexander Graf | break;
|
2018 | e023e832 | Alexander Graf | } |
2019 | e023e832 | Alexander Graf | if (op == 0xa) { |
2020 | e023e832 | Alexander Graf | set_cc_s64(s, regs[r1]); |
2021 | e023e832 | Alexander Graf | } |
2022 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
2023 | e023e832 | Alexander Graf | break;
|
2024 | e023e832 | Alexander Graf | case 0x1d: /* RLL R1,R3,D2(B2) [RSY] */ |
2025 | e023e832 | Alexander Graf | if (b2) {
|
2026 | e023e832 | Alexander Graf | tmp = get_address(s, 0, b2, d2);
|
2027 | e023e832 | Alexander Graf | tcg_gen_andi_i64(tmp, tmp, 0x3f);
|
2028 | e023e832 | Alexander Graf | } else {
|
2029 | e023e832 | Alexander Graf | tmp = tcg_const_i64(d2 & 0x3f);
|
2030 | e023e832 | Alexander Graf | } |
2031 | e023e832 | Alexander Graf | tmp32_1 = tcg_temp_new_i32(); |
2032 | e023e832 | Alexander Graf | tmp32_2 = load_reg32(r3); |
2033 | e023e832 | Alexander Graf | tcg_gen_trunc_i64_i32(tmp32_1, tmp); |
2034 | e023e832 | Alexander Graf | switch (op) {
|
2035 | e023e832 | Alexander Graf | case 0x1d: |
2036 | e023e832 | Alexander Graf | tcg_gen_rotl_i32(tmp32_1, tmp32_2, tmp32_1); |
2037 | e023e832 | Alexander Graf | break;
|
2038 | e023e832 | Alexander Graf | default:
|
2039 | e023e832 | Alexander Graf | tcg_abort(); |
2040 | e023e832 | Alexander Graf | break;
|
2041 | e023e832 | Alexander Graf | } |
2042 | e023e832 | Alexander Graf | store_reg32(r1, tmp32_1); |
2043 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
2044 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
2045 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_2); |
2046 | e023e832 | Alexander Graf | break;
|
2047 | e023e832 | Alexander Graf | case 0x4: /* LMG R1,R3,D2(B2) [RSE] */ |
2048 | e023e832 | Alexander Graf | case 0x24: /* STMG R1,R3,D2(B2) [RSE] */ |
2049 | e023e832 | Alexander Graf | stm_len = 8;
|
2050 | e023e832 | Alexander Graf | goto do_mh;
|
2051 | e023e832 | Alexander Graf | case 0x26: /* STMH R1,R3,D2(B2) [RSE] */ |
2052 | e023e832 | Alexander Graf | case 0x96: /* LMH R1,R3,D2(B2) [RSE] */ |
2053 | e023e832 | Alexander Graf | stm_len = 4;
|
2054 | e023e832 | Alexander Graf | do_mh:
|
2055 | e023e832 | Alexander Graf | /* Apparently, unrolling lmg/stmg of any size gains performance -
|
2056 | e023e832 | Alexander Graf | even for very long ones... */
|
2057 | e023e832 | Alexander Graf | tmp = get_address(s, 0, b2, d2);
|
2058 | e023e832 | Alexander Graf | tmp3 = tcg_const_i64(stm_len); |
2059 | be82ee2a | Stefan Weil | tmp4 = tcg_const_i64(op == 0x26 ? 32 : 4); |
2060 | e023e832 | Alexander Graf | for (i = r1;; i = (i + 1) % 16) { |
2061 | e023e832 | Alexander Graf | switch (op) {
|
2062 | e023e832 | Alexander Graf | case 0x4: |
2063 | e023e832 | Alexander Graf | tcg_gen_qemu_ld64(regs[i], tmp, get_mem_index(s)); |
2064 | e023e832 | Alexander Graf | break;
|
2065 | e023e832 | Alexander Graf | case 0x96: |
2066 | e023e832 | Alexander Graf | tmp2 = tcg_temp_new_i64(); |
2067 | e023e832 | Alexander Graf | #if HOST_LONG_BITS == 32 |
2068 | e023e832 | Alexander Graf | tcg_gen_qemu_ld32u(tmp2, tmp, get_mem_index(s)); |
2069 | e023e832 | Alexander Graf | tcg_gen_trunc_i64_i32(TCGV_HIGH(regs[i]), tmp2); |
2070 | e023e832 | Alexander Graf | #else
|
2071 | e023e832 | Alexander Graf | tcg_gen_qemu_ld32u(tmp2, tmp, get_mem_index(s)); |
2072 | be82ee2a | Stefan Weil | tcg_gen_shl_i64(tmp2, tmp2, tmp4); |
2073 | e023e832 | Alexander Graf | tcg_gen_ext32u_i64(regs[i], regs[i]); |
2074 | e023e832 | Alexander Graf | tcg_gen_or_i64(regs[i], regs[i], tmp2); |
2075 | e023e832 | Alexander Graf | #endif
|
2076 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
2077 | e023e832 | Alexander Graf | break;
|
2078 | e023e832 | Alexander Graf | case 0x24: |
2079 | e023e832 | Alexander Graf | tcg_gen_qemu_st64(regs[i], tmp, get_mem_index(s)); |
2080 | e023e832 | Alexander Graf | break;
|
2081 | e023e832 | Alexander Graf | case 0x26: |
2082 | e023e832 | Alexander Graf | tmp2 = tcg_temp_new_i64(); |
2083 | e023e832 | Alexander Graf | tcg_gen_shr_i64(tmp2, regs[i], tmp4); |
2084 | e023e832 | Alexander Graf | tcg_gen_qemu_st32(tmp2, tmp, get_mem_index(s)); |
2085 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
2086 | e023e832 | Alexander Graf | break;
|
2087 | e023e832 | Alexander Graf | default:
|
2088 | e023e832 | Alexander Graf | tcg_abort(); |
2089 | e023e832 | Alexander Graf | } |
2090 | e023e832 | Alexander Graf | if (i == r3) {
|
2091 | e023e832 | Alexander Graf | break;
|
2092 | e023e832 | Alexander Graf | } |
2093 | e023e832 | Alexander Graf | tcg_gen_add_i64(tmp, tmp, tmp3); |
2094 | e023e832 | Alexander Graf | } |
2095 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
2096 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp4); |
2097 | e023e832 | Alexander Graf | break;
|
2098 | e023e832 | Alexander Graf | case 0x2c: /* STCMH R1,M3,D2(B2) [RSY] */ |
2099 | e023e832 | Alexander Graf | tmp = get_address(s, 0, b2, d2);
|
2100 | e023e832 | Alexander Graf | tmp32_1 = tcg_const_i32(r1); |
2101 | e023e832 | Alexander Graf | tmp32_2 = tcg_const_i32(r3); |
2102 | e023e832 | Alexander Graf | potential_page_fault(s); |
2103 | e023e832 | Alexander Graf | gen_helper_stcmh(tmp32_1, tmp, tmp32_2); |
2104 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
2105 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
2106 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_2); |
2107 | e023e832 | Alexander Graf | break;
|
2108 | e023e832 | Alexander Graf | #ifndef CONFIG_USER_ONLY
|
2109 | e023e832 | Alexander Graf | case 0x2f: /* LCTLG R1,R3,D2(B2) [RSE] */ |
2110 | e023e832 | Alexander Graf | /* Load Control */
|
2111 | e023e832 | Alexander Graf | check_privileged(s, ilc); |
2112 | e023e832 | Alexander Graf | tmp = get_address(s, 0, b2, d2);
|
2113 | e023e832 | Alexander Graf | tmp32_1 = tcg_const_i32(r1); |
2114 | e023e832 | Alexander Graf | tmp32_2 = tcg_const_i32(r3); |
2115 | e023e832 | Alexander Graf | potential_page_fault(s); |
2116 | e023e832 | Alexander Graf | gen_helper_lctlg(tmp32_1, tmp, tmp32_2); |
2117 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
2118 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
2119 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_2); |
2120 | e023e832 | Alexander Graf | break;
|
2121 | e023e832 | Alexander Graf | case 0x25: /* STCTG R1,R3,D2(B2) [RSE] */ |
2122 | e023e832 | Alexander Graf | /* Store Control */
|
2123 | e023e832 | Alexander Graf | check_privileged(s, ilc); |
2124 | e023e832 | Alexander Graf | tmp = get_address(s, 0, b2, d2);
|
2125 | e023e832 | Alexander Graf | tmp32_1 = tcg_const_i32(r1); |
2126 | e023e832 | Alexander Graf | tmp32_2 = tcg_const_i32(r3); |
2127 | e023e832 | Alexander Graf | potential_page_fault(s); |
2128 | e023e832 | Alexander Graf | gen_helper_stctg(tmp32_1, tmp, tmp32_2); |
2129 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
2130 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
2131 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_2); |
2132 | e023e832 | Alexander Graf | break;
|
2133 | e023e832 | Alexander Graf | #endif
|
2134 | e023e832 | Alexander Graf | case 0x30: /* CSG R1,R3,D2(B2) [RSY] */ |
2135 | e023e832 | Alexander Graf | tmp = get_address(s, 0, b2, d2);
|
2136 | e023e832 | Alexander Graf | tmp32_1 = tcg_const_i32(r1); |
2137 | e023e832 | Alexander Graf | tmp32_2 = tcg_const_i32(r3); |
2138 | e023e832 | Alexander Graf | potential_page_fault(s); |
2139 | e023e832 | Alexander Graf | /* XXX rewrite in tcg */
|
2140 | e023e832 | Alexander Graf | gen_helper_csg(cc_op, tmp32_1, tmp, tmp32_2); |
2141 | e023e832 | Alexander Graf | set_cc_static(s); |
2142 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
2143 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
2144 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_2); |
2145 | e023e832 | Alexander Graf | break;
|
2146 | e023e832 | Alexander Graf | case 0x3e: /* CDSG R1,R3,D2(B2) [RSY] */ |
2147 | e023e832 | Alexander Graf | tmp = get_address(s, 0, b2, d2);
|
2148 | e023e832 | Alexander Graf | tmp32_1 = tcg_const_i32(r1); |
2149 | e023e832 | Alexander Graf | tmp32_2 = tcg_const_i32(r3); |
2150 | e023e832 | Alexander Graf | potential_page_fault(s); |
2151 | e023e832 | Alexander Graf | /* XXX rewrite in tcg */
|
2152 | e023e832 | Alexander Graf | gen_helper_cdsg(cc_op, tmp32_1, tmp, tmp32_2); |
2153 | e023e832 | Alexander Graf | set_cc_static(s); |
2154 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
2155 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
2156 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_2); |
2157 | e023e832 | Alexander Graf | break;
|
2158 | e023e832 | Alexander Graf | case 0x51: /* TMY D1(B1),I2 [SIY] */ |
2159 | e023e832 | Alexander Graf | tmp = get_address(s, 0, b2, d2); /* SIY -> this is the destination */ |
2160 | e023e832 | Alexander Graf | tmp2 = tcg_const_i64((r1 << 4) | r3);
|
2161 | e023e832 | Alexander Graf | tcg_gen_qemu_ld8u(tmp, tmp, get_mem_index(s)); |
2162 | e023e832 | Alexander Graf | /* yes, this is a 32 bit operation with 64 bit tcg registers, because
|
2163 | e023e832 | Alexander Graf | that incurs less conversions */
|
2164 | e023e832 | Alexander Graf | cmp_64(s, tmp, tmp2, CC_OP_TM_32); |
2165 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
2166 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
2167 | e023e832 | Alexander Graf | break;
|
2168 | e023e832 | Alexander Graf | case 0x52: /* MVIY D1(B1),I2 [SIY] */ |
2169 | e023e832 | Alexander Graf | tmp = get_address(s, 0, b2, d2); /* SIY -> this is the destination */ |
2170 | e023e832 | Alexander Graf | tmp2 = tcg_const_i64((r1 << 4) | r3);
|
2171 | e023e832 | Alexander Graf | tcg_gen_qemu_st8(tmp2, tmp, get_mem_index(s)); |
2172 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
2173 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
2174 | e023e832 | Alexander Graf | break;
|
2175 | e023e832 | Alexander Graf | case 0x55: /* CLIY D1(B1),I2 [SIY] */ |
2176 | e023e832 | Alexander Graf | tmp3 = get_address(s, 0, b2, d2); /* SIY -> this is the 1st operand */ |
2177 | e023e832 | Alexander Graf | tmp = tcg_temp_new_i64(); |
2178 | e023e832 | Alexander Graf | tmp32_1 = tcg_temp_new_i32(); |
2179 | e023e832 | Alexander Graf | tcg_gen_qemu_ld8u(tmp, tmp3, get_mem_index(s)); |
2180 | e023e832 | Alexander Graf | tcg_gen_trunc_i64_i32(tmp32_1, tmp); |
2181 | e023e832 | Alexander Graf | cmp_u32c(s, tmp32_1, (r1 << 4) | r3);
|
2182 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
2183 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp3); |
2184 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
2185 | e023e832 | Alexander Graf | break;
|
2186 | e023e832 | Alexander Graf | case 0x80: /* ICMH R1,M3,D2(B2) [RSY] */ |
2187 | e023e832 | Alexander Graf | tmp = get_address(s, 0, b2, d2);
|
2188 | e023e832 | Alexander Graf | tmp32_1 = tcg_const_i32(r1); |
2189 | e023e832 | Alexander Graf | tmp32_2 = tcg_const_i32(r3); |
2190 | e023e832 | Alexander Graf | potential_page_fault(s); |
2191 | e023e832 | Alexander Graf | /* XXX split CC calculation out */
|
2192 | e023e832 | Alexander Graf | gen_helper_icmh(cc_op, tmp32_1, tmp, tmp32_2); |
2193 | e023e832 | Alexander Graf | set_cc_static(s); |
2194 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
2195 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
2196 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_2); |
2197 | e023e832 | Alexander Graf | break;
|
2198 | e023e832 | Alexander Graf | default:
|
2199 | e023e832 | Alexander Graf | LOG_DISAS("illegal eb operation 0x%x\n", op);
|
2200 | e023e832 | Alexander Graf | gen_illegal_opcode(s, ilc); |
2201 | e023e832 | Alexander Graf | break;
|
2202 | e023e832 | Alexander Graf | } |
2203 | e023e832 | Alexander Graf | } |
2204 | e023e832 | Alexander Graf | |
2205 | e023e832 | Alexander Graf | static void disas_ed(DisasContext *s, int op, int r1, int x2, int b2, int d2, |
2206 | e023e832 | Alexander Graf | int r1b)
|
2207 | e023e832 | Alexander Graf | { |
2208 | e023e832 | Alexander Graf | TCGv_i32 tmp_r1, tmp32; |
2209 | e023e832 | Alexander Graf | TCGv_i64 addr, tmp; |
2210 | e023e832 | Alexander Graf | addr = get_address(s, x2, b2, d2); |
2211 | e023e832 | Alexander Graf | tmp_r1 = tcg_const_i32(r1); |
2212 | e023e832 | Alexander Graf | switch (op) {
|
2213 | e023e832 | Alexander Graf | case 0x5: /* LXDB R1,D2(X2,B2) [RXE] */ |
2214 | e023e832 | Alexander Graf | potential_page_fault(s); |
2215 | e023e832 | Alexander Graf | gen_helper_lxdb(tmp_r1, addr); |
2216 | e023e832 | Alexander Graf | break;
|
2217 | e023e832 | Alexander Graf | case 0x9: /* CEB R1,D2(X2,B2) [RXE] */ |
2218 | e023e832 | Alexander Graf | tmp = tcg_temp_new_i64(); |
2219 | e023e832 | Alexander Graf | tmp32 = load_freg32(r1); |
2220 | e023e832 | Alexander Graf | tcg_gen_qemu_ld32u(tmp, addr, get_mem_index(s)); |
2221 | e023e832 | Alexander Graf | set_cc_cmp_f32_i64(s, tmp32, tmp); |
2222 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
2223 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32); |
2224 | e023e832 | Alexander Graf | break;
|
2225 | e023e832 | Alexander Graf | case 0xa: /* AEB R1,D2(X2,B2) [RXE] */ |
2226 | e023e832 | Alexander Graf | tmp = tcg_temp_new_i64(); |
2227 | e023e832 | Alexander Graf | tmp32 = tcg_temp_new_i32(); |
2228 | e023e832 | Alexander Graf | tcg_gen_qemu_ld32u(tmp, addr, get_mem_index(s)); |
2229 | e023e832 | Alexander Graf | tcg_gen_trunc_i64_i32(tmp32, tmp); |
2230 | e023e832 | Alexander Graf | gen_helper_aeb(tmp_r1, tmp32); |
2231 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
2232 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32); |
2233 | e023e832 | Alexander Graf | |
2234 | e023e832 | Alexander Graf | tmp32 = load_freg32(r1); |
2235 | e023e832 | Alexander Graf | set_cc_nz_f32(s, tmp32); |
2236 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32); |
2237 | e023e832 | Alexander Graf | break;
|
2238 | e023e832 | Alexander Graf | case 0xb: /* SEB R1,D2(X2,B2) [RXE] */ |
2239 | e023e832 | Alexander Graf | tmp = tcg_temp_new_i64(); |
2240 | e023e832 | Alexander Graf | tmp32 = tcg_temp_new_i32(); |
2241 | e023e832 | Alexander Graf | tcg_gen_qemu_ld32u(tmp, addr, get_mem_index(s)); |
2242 | e023e832 | Alexander Graf | tcg_gen_trunc_i64_i32(tmp32, tmp); |
2243 | e023e832 | Alexander Graf | gen_helper_seb(tmp_r1, tmp32); |
2244 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
2245 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32); |
2246 | e023e832 | Alexander Graf | |
2247 | e023e832 | Alexander Graf | tmp32 = load_freg32(r1); |
2248 | e023e832 | Alexander Graf | set_cc_nz_f32(s, tmp32); |
2249 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32); |
2250 | e023e832 | Alexander Graf | break;
|
2251 | e023e832 | Alexander Graf | case 0xd: /* DEB R1,D2(X2,B2) [RXE] */ |
2252 | e023e832 | Alexander Graf | tmp = tcg_temp_new_i64(); |
2253 | e023e832 | Alexander Graf | tmp32 = tcg_temp_new_i32(); |
2254 | e023e832 | Alexander Graf | tcg_gen_qemu_ld32u(tmp, addr, get_mem_index(s)); |
2255 | e023e832 | Alexander Graf | tcg_gen_trunc_i64_i32(tmp32, tmp); |
2256 | e023e832 | Alexander Graf | gen_helper_deb(tmp_r1, tmp32); |
2257 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
2258 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32); |
2259 | e023e832 | Alexander Graf | break;
|
2260 | e023e832 | Alexander Graf | case 0x10: /* TCEB R1,D2(X2,B2) [RXE] */ |
2261 | e023e832 | Alexander Graf | potential_page_fault(s); |
2262 | e023e832 | Alexander Graf | gen_helper_tceb(cc_op, tmp_r1, addr); |
2263 | e023e832 | Alexander Graf | set_cc_static(s); |
2264 | e023e832 | Alexander Graf | break;
|
2265 | e023e832 | Alexander Graf | case 0x11: /* TCDB R1,D2(X2,B2) [RXE] */ |
2266 | e023e832 | Alexander Graf | potential_page_fault(s); |
2267 | e023e832 | Alexander Graf | gen_helper_tcdb(cc_op, tmp_r1, addr); |
2268 | e023e832 | Alexander Graf | set_cc_static(s); |
2269 | e023e832 | Alexander Graf | break;
|
2270 | e023e832 | Alexander Graf | case 0x12: /* TCXB R1,D2(X2,B2) [RXE] */ |
2271 | e023e832 | Alexander Graf | potential_page_fault(s); |
2272 | e023e832 | Alexander Graf | gen_helper_tcxb(cc_op, tmp_r1, addr); |
2273 | e023e832 | Alexander Graf | set_cc_static(s); |
2274 | e023e832 | Alexander Graf | break;
|
2275 | e023e832 | Alexander Graf | case 0x17: /* MEEB R1,D2(X2,B2) [RXE] */ |
2276 | e023e832 | Alexander Graf | tmp = tcg_temp_new_i64(); |
2277 | e023e832 | Alexander Graf | tmp32 = tcg_temp_new_i32(); |
2278 | e023e832 | Alexander Graf | tcg_gen_qemu_ld32u(tmp, addr, get_mem_index(s)); |
2279 | e023e832 | Alexander Graf | tcg_gen_trunc_i64_i32(tmp32, tmp); |
2280 | e023e832 | Alexander Graf | gen_helper_meeb(tmp_r1, tmp32); |
2281 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
2282 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32); |
2283 | e023e832 | Alexander Graf | break;
|
2284 | e023e832 | Alexander Graf | case 0x19: /* CDB R1,D2(X2,B2) [RXE] */ |
2285 | e023e832 | Alexander Graf | potential_page_fault(s); |
2286 | e023e832 | Alexander Graf | gen_helper_cdb(cc_op, tmp_r1, addr); |
2287 | e023e832 | Alexander Graf | set_cc_static(s); |
2288 | e023e832 | Alexander Graf | break;
|
2289 | e023e832 | Alexander Graf | case 0x1a: /* ADB R1,D2(X2,B2) [RXE] */ |
2290 | e023e832 | Alexander Graf | potential_page_fault(s); |
2291 | e023e832 | Alexander Graf | gen_helper_adb(cc_op, tmp_r1, addr); |
2292 | e023e832 | Alexander Graf | set_cc_static(s); |
2293 | e023e832 | Alexander Graf | break;
|
2294 | e023e832 | Alexander Graf | case 0x1b: /* SDB R1,D2(X2,B2) [RXE] */ |
2295 | e023e832 | Alexander Graf | potential_page_fault(s); |
2296 | e023e832 | Alexander Graf | gen_helper_sdb(cc_op, tmp_r1, addr); |
2297 | e023e832 | Alexander Graf | set_cc_static(s); |
2298 | e023e832 | Alexander Graf | break;
|
2299 | e023e832 | Alexander Graf | case 0x1c: /* MDB R1,D2(X2,B2) [RXE] */ |
2300 | e023e832 | Alexander Graf | potential_page_fault(s); |
2301 | e023e832 | Alexander Graf | gen_helper_mdb(tmp_r1, addr); |
2302 | e023e832 | Alexander Graf | break;
|
2303 | e023e832 | Alexander Graf | case 0x1d: /* DDB R1,D2(X2,B2) [RXE] */ |
2304 | e023e832 | Alexander Graf | potential_page_fault(s); |
2305 | e023e832 | Alexander Graf | gen_helper_ddb(tmp_r1, addr); |
2306 | e023e832 | Alexander Graf | break;
|
2307 | e023e832 | Alexander Graf | case 0x1e: /* MADB R1,R3,D2(X2,B2) [RXF] */ |
2308 | e023e832 | Alexander Graf | /* for RXF insns, r1 is R3 and r1b is R1 */
|
2309 | e023e832 | Alexander Graf | tmp32 = tcg_const_i32(r1b); |
2310 | e023e832 | Alexander Graf | potential_page_fault(s); |
2311 | e023e832 | Alexander Graf | gen_helper_madb(tmp32, addr, tmp_r1); |
2312 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32); |
2313 | e023e832 | Alexander Graf | break;
|
2314 | e023e832 | Alexander Graf | default:
|
2315 | e023e832 | Alexander Graf | LOG_DISAS("illegal ed operation 0x%x\n", op);
|
2316 | e023e832 | Alexander Graf | gen_illegal_opcode(s, 3);
|
2317 | e023e832 | Alexander Graf | return;
|
2318 | e023e832 | Alexander Graf | } |
2319 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp_r1); |
2320 | e023e832 | Alexander Graf | tcg_temp_free_i64(addr); |
2321 | e023e832 | Alexander Graf | } |
2322 | e023e832 | Alexander Graf | |
2323 | e023e832 | Alexander Graf | static void disas_a5(DisasContext *s, int op, int r1, int i2) |
2324 | e023e832 | Alexander Graf | { |
2325 | e023e832 | Alexander Graf | TCGv_i64 tmp, tmp2; |
2326 | e023e832 | Alexander Graf | TCGv_i32 tmp32; |
2327 | e023e832 | Alexander Graf | LOG_DISAS("disas_a5: op 0x%x r1 %d i2 0x%x\n", op, r1, i2);
|
2328 | e023e832 | Alexander Graf | switch (op) {
|
2329 | e023e832 | Alexander Graf | case 0x0: /* IIHH R1,I2 [RI] */ |
2330 | e023e832 | Alexander Graf | tmp = tcg_const_i64(i2); |
2331 | e023e832 | Alexander Graf | tcg_gen_deposit_i64(regs[r1], regs[r1], tmp, 48, 16); |
2332 | e023e832 | Alexander Graf | break;
|
2333 | e023e832 | Alexander Graf | case 0x1: /* IIHL R1,I2 [RI] */ |
2334 | e023e832 | Alexander Graf | tmp = tcg_const_i64(i2); |
2335 | e023e832 | Alexander Graf | tcg_gen_deposit_i64(regs[r1], regs[r1], tmp, 32, 16); |
2336 | e023e832 | Alexander Graf | break;
|
2337 | e023e832 | Alexander Graf | case 0x2: /* IILH R1,I2 [RI] */ |
2338 | e023e832 | Alexander Graf | tmp = tcg_const_i64(i2); |
2339 | e023e832 | Alexander Graf | tcg_gen_deposit_i64(regs[r1], regs[r1], tmp, 16, 16); |
2340 | e023e832 | Alexander Graf | break;
|
2341 | e023e832 | Alexander Graf | case 0x3: /* IILL R1,I2 [RI] */ |
2342 | e023e832 | Alexander Graf | tmp = tcg_const_i64(i2); |
2343 | e023e832 | Alexander Graf | tcg_gen_deposit_i64(regs[r1], regs[r1], tmp, 0, 16); |
2344 | e023e832 | Alexander Graf | break;
|
2345 | e023e832 | Alexander Graf | case 0x4: /* NIHH R1,I2 [RI] */ |
2346 | e023e832 | Alexander Graf | case 0x8: /* OIHH R1,I2 [RI] */ |
2347 | e023e832 | Alexander Graf | tmp = load_reg(r1); |
2348 | e023e832 | Alexander Graf | tmp32 = tcg_temp_new_i32(); |
2349 | e023e832 | Alexander Graf | switch (op) {
|
2350 | e023e832 | Alexander Graf | case 0x4: |
2351 | e023e832 | Alexander Graf | tmp2 = tcg_const_i64((((uint64_t)i2) << 48)
|
2352 | e023e832 | Alexander Graf | | 0x0000ffffffffffffULL);
|
2353 | e023e832 | Alexander Graf | tcg_gen_and_i64(tmp, tmp, tmp2); |
2354 | e023e832 | Alexander Graf | break;
|
2355 | e023e832 | Alexander Graf | case 0x8: |
2356 | e023e832 | Alexander Graf | tmp2 = tcg_const_i64(((uint64_t)i2) << 48);
|
2357 | e023e832 | Alexander Graf | tcg_gen_or_i64(tmp, tmp, tmp2); |
2358 | e023e832 | Alexander Graf | break;
|
2359 | e023e832 | Alexander Graf | default:
|
2360 | e023e832 | Alexander Graf | tcg_abort(); |
2361 | e023e832 | Alexander Graf | } |
2362 | e023e832 | Alexander Graf | store_reg(r1, tmp); |
2363 | e023e832 | Alexander Graf | tcg_gen_shri_i64(tmp2, tmp, 48);
|
2364 | e023e832 | Alexander Graf | tcg_gen_trunc_i64_i32(tmp32, tmp2); |
2365 | e023e832 | Alexander Graf | set_cc_nz_u32(s, tmp32); |
2366 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
2367 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32); |
2368 | e023e832 | Alexander Graf | break;
|
2369 | e023e832 | Alexander Graf | case 0x5: /* NIHL R1,I2 [RI] */ |
2370 | e023e832 | Alexander Graf | case 0x9: /* OIHL R1,I2 [RI] */ |
2371 | e023e832 | Alexander Graf | tmp = load_reg(r1); |
2372 | e023e832 | Alexander Graf | tmp32 = tcg_temp_new_i32(); |
2373 | e023e832 | Alexander Graf | switch (op) {
|
2374 | e023e832 | Alexander Graf | case 0x5: |
2375 | e023e832 | Alexander Graf | tmp2 = tcg_const_i64((((uint64_t)i2) << 32)
|
2376 | e023e832 | Alexander Graf | | 0xffff0000ffffffffULL);
|
2377 | e023e832 | Alexander Graf | tcg_gen_and_i64(tmp, tmp, tmp2); |
2378 | e023e832 | Alexander Graf | break;
|
2379 | e023e832 | Alexander Graf | case 0x9: |
2380 | e023e832 | Alexander Graf | tmp2 = tcg_const_i64(((uint64_t)i2) << 32);
|
2381 | e023e832 | Alexander Graf | tcg_gen_or_i64(tmp, tmp, tmp2); |
2382 | e023e832 | Alexander Graf | break;
|
2383 | e023e832 | Alexander Graf | default:
|
2384 | e023e832 | Alexander Graf | tcg_abort(); |
2385 | e023e832 | Alexander Graf | } |
2386 | e023e832 | Alexander Graf | store_reg(r1, tmp); |
2387 | e023e832 | Alexander Graf | tcg_gen_shri_i64(tmp2, tmp, 32);
|
2388 | e023e832 | Alexander Graf | tcg_gen_trunc_i64_i32(tmp32, tmp2); |
2389 | e023e832 | Alexander Graf | tcg_gen_andi_i32(tmp32, tmp32, 0xffff);
|
2390 | e023e832 | Alexander Graf | set_cc_nz_u32(s, tmp32); |
2391 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
2392 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32); |
2393 | e023e832 | Alexander Graf | break;
|
2394 | e023e832 | Alexander Graf | case 0x6: /* NILH R1,I2 [RI] */ |
2395 | e023e832 | Alexander Graf | case 0xa: /* OILH R1,I2 [RI] */ |
2396 | e023e832 | Alexander Graf | tmp = load_reg(r1); |
2397 | e023e832 | Alexander Graf | tmp32 = tcg_temp_new_i32(); |
2398 | e023e832 | Alexander Graf | switch (op) {
|
2399 | e023e832 | Alexander Graf | case 0x6: |
2400 | e023e832 | Alexander Graf | tmp2 = tcg_const_i64((((uint64_t)i2) << 16)
|
2401 | e023e832 | Alexander Graf | | 0xffffffff0000ffffULL);
|
2402 | e023e832 | Alexander Graf | tcg_gen_and_i64(tmp, tmp, tmp2); |
2403 | e023e832 | Alexander Graf | break;
|
2404 | e023e832 | Alexander Graf | case 0xa: |
2405 | e023e832 | Alexander Graf | tmp2 = tcg_const_i64(((uint64_t)i2) << 16);
|
2406 | e023e832 | Alexander Graf | tcg_gen_or_i64(tmp, tmp, tmp2); |
2407 | e023e832 | Alexander Graf | break;
|
2408 | e023e832 | Alexander Graf | default:
|
2409 | e023e832 | Alexander Graf | tcg_abort(); |
2410 | e023e832 | Alexander Graf | } |
2411 | e023e832 | Alexander Graf | store_reg(r1, tmp); |
2412 | e023e832 | Alexander Graf | tcg_gen_shri_i64(tmp, tmp, 16);
|
2413 | e023e832 | Alexander Graf | tcg_gen_trunc_i64_i32(tmp32, tmp); |
2414 | e023e832 | Alexander Graf | tcg_gen_andi_i32(tmp32, tmp32, 0xffff);
|
2415 | e023e832 | Alexander Graf | set_cc_nz_u32(s, tmp32); |
2416 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
2417 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32); |
2418 | e023e832 | Alexander Graf | break;
|
2419 | e023e832 | Alexander Graf | case 0x7: /* NILL R1,I2 [RI] */ |
2420 | e023e832 | Alexander Graf | case 0xb: /* OILL R1,I2 [RI] */ |
2421 | e023e832 | Alexander Graf | tmp = load_reg(r1); |
2422 | e023e832 | Alexander Graf | tmp32 = tcg_temp_new_i32(); |
2423 | e023e832 | Alexander Graf | switch (op) {
|
2424 | e023e832 | Alexander Graf | case 0x7: |
2425 | e023e832 | Alexander Graf | tmp2 = tcg_const_i64(i2 | 0xffffffffffff0000ULL);
|
2426 | e023e832 | Alexander Graf | tcg_gen_and_i64(tmp, tmp, tmp2); |
2427 | e023e832 | Alexander Graf | break;
|
2428 | e023e832 | Alexander Graf | case 0xb: |
2429 | e023e832 | Alexander Graf | tmp2 = tcg_const_i64(i2); |
2430 | e023e832 | Alexander Graf | tcg_gen_or_i64(tmp, tmp, tmp2); |
2431 | e023e832 | Alexander Graf | break;
|
2432 | e023e832 | Alexander Graf | default:
|
2433 | e023e832 | Alexander Graf | tcg_abort(); |
2434 | e023e832 | Alexander Graf | } |
2435 | e023e832 | Alexander Graf | store_reg(r1, tmp); |
2436 | e023e832 | Alexander Graf | tcg_gen_trunc_i64_i32(tmp32, tmp); |
2437 | e023e832 | Alexander Graf | tcg_gen_andi_i32(tmp32, tmp32, 0xffff);
|
2438 | e023e832 | Alexander Graf | set_cc_nz_u32(s, tmp32); /* signedness should not matter here */
|
2439 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
2440 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32); |
2441 | e023e832 | Alexander Graf | break;
|
2442 | e023e832 | Alexander Graf | case 0xc: /* LLIHH R1,I2 [RI] */ |
2443 | e023e832 | Alexander Graf | tmp = tcg_const_i64( ((uint64_t)i2) << 48 );
|
2444 | e023e832 | Alexander Graf | store_reg(r1, tmp); |
2445 | e023e832 | Alexander Graf | break;
|
2446 | e023e832 | Alexander Graf | case 0xd: /* LLIHL R1,I2 [RI] */ |
2447 | e023e832 | Alexander Graf | tmp = tcg_const_i64( ((uint64_t)i2) << 32 );
|
2448 | e023e832 | Alexander Graf | store_reg(r1, tmp); |
2449 | e023e832 | Alexander Graf | break;
|
2450 | e023e832 | Alexander Graf | case 0xe: /* LLILH R1,I2 [RI] */ |
2451 | e023e832 | Alexander Graf | tmp = tcg_const_i64( ((uint64_t)i2) << 16 );
|
2452 | e023e832 | Alexander Graf | store_reg(r1, tmp); |
2453 | e023e832 | Alexander Graf | break;
|
2454 | e023e832 | Alexander Graf | case 0xf: /* LLILL R1,I2 [RI] */ |
2455 | e023e832 | Alexander Graf | tmp = tcg_const_i64(i2); |
2456 | e023e832 | Alexander Graf | store_reg(r1, tmp); |
2457 | e023e832 | Alexander Graf | break;
|
2458 | e023e832 | Alexander Graf | default:
|
2459 | e023e832 | Alexander Graf | LOG_DISAS("illegal a5 operation 0x%x\n", op);
|
2460 | e023e832 | Alexander Graf | gen_illegal_opcode(s, 2);
|
2461 | e023e832 | Alexander Graf | return;
|
2462 | e023e832 | Alexander Graf | } |
2463 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
2464 | e023e832 | Alexander Graf | } |
2465 | e023e832 | Alexander Graf | |
2466 | e023e832 | Alexander Graf | static void disas_a7(DisasContext *s, int op, int r1, int i2) |
2467 | e023e832 | Alexander Graf | { |
2468 | e023e832 | Alexander Graf | TCGv_i64 tmp, tmp2; |
2469 | e023e832 | Alexander Graf | TCGv_i32 tmp32_1, tmp32_2, tmp32_3; |
2470 | e023e832 | Alexander Graf | int l1;
|
2471 | e023e832 | Alexander Graf | |
2472 | e023e832 | Alexander Graf | LOG_DISAS("disas_a7: op 0x%x r1 %d i2 0x%x\n", op, r1, i2);
|
2473 | e023e832 | Alexander Graf | switch (op) {
|
2474 | e023e832 | Alexander Graf | case 0x0: /* TMLH or TMH R1,I2 [RI] */ |
2475 | e023e832 | Alexander Graf | case 0x1: /* TMLL or TML R1,I2 [RI] */ |
2476 | e023e832 | Alexander Graf | case 0x2: /* TMHH R1,I2 [RI] */ |
2477 | e023e832 | Alexander Graf | case 0x3: /* TMHL R1,I2 [RI] */ |
2478 | e023e832 | Alexander Graf | tmp = load_reg(r1); |
2479 | e023e832 | Alexander Graf | tmp2 = tcg_const_i64((uint16_t)i2); |
2480 | e023e832 | Alexander Graf | switch (op) {
|
2481 | e023e832 | Alexander Graf | case 0x0: |
2482 | e023e832 | Alexander Graf | tcg_gen_shri_i64(tmp, tmp, 16);
|
2483 | e023e832 | Alexander Graf | break;
|
2484 | e023e832 | Alexander Graf | case 0x1: |
2485 | e023e832 | Alexander Graf | break;
|
2486 | e023e832 | Alexander Graf | case 0x2: |
2487 | e023e832 | Alexander Graf | tcg_gen_shri_i64(tmp, tmp, 48);
|
2488 | e023e832 | Alexander Graf | break;
|
2489 | e023e832 | Alexander Graf | case 0x3: |
2490 | e023e832 | Alexander Graf | tcg_gen_shri_i64(tmp, tmp, 32);
|
2491 | e023e832 | Alexander Graf | break;
|
2492 | e023e832 | Alexander Graf | } |
2493 | e023e832 | Alexander Graf | tcg_gen_andi_i64(tmp, tmp, 0xffff);
|
2494 | e023e832 | Alexander Graf | cmp_64(s, tmp, tmp2, CC_OP_TM_64); |
2495 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
2496 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
2497 | e023e832 | Alexander Graf | break;
|
2498 | e023e832 | Alexander Graf | case 0x4: /* brc m1, i2 */ |
2499 | e023e832 | Alexander Graf | gen_brc(r1, s, i2 * 2LL);
|
2500 | e023e832 | Alexander Graf | return;
|
2501 | e023e832 | Alexander Graf | case 0x5: /* BRAS R1,I2 [RI] */ |
2502 | e023e832 | Alexander Graf | tmp = tcg_const_i64(pc_to_link_info(s, s->pc + 4));
|
2503 | e023e832 | Alexander Graf | store_reg(r1, tmp); |
2504 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
2505 | e023e832 | Alexander Graf | gen_goto_tb(s, 0, s->pc + i2 * 2LL); |
2506 | e023e832 | Alexander Graf | s->is_jmp = DISAS_TB_JUMP; |
2507 | e023e832 | Alexander Graf | break;
|
2508 | e023e832 | Alexander Graf | case 0x6: /* BRCT R1,I2 [RI] */ |
2509 | e023e832 | Alexander Graf | tmp32_1 = load_reg32(r1); |
2510 | e023e832 | Alexander Graf | tcg_gen_subi_i32(tmp32_1, tmp32_1, 1);
|
2511 | e023e832 | Alexander Graf | store_reg32(r1, tmp32_1); |
2512 | e023e832 | Alexander Graf | gen_update_cc_op(s); |
2513 | e023e832 | Alexander Graf | l1 = gen_new_label(); |
2514 | e023e832 | Alexander Graf | tcg_gen_brcondi_i32(TCG_COND_EQ, tmp32_1, 0, l1);
|
2515 | e023e832 | Alexander Graf | gen_goto_tb(s, 0, s->pc + (i2 * 2LL)); |
2516 | e023e832 | Alexander Graf | gen_set_label(l1); |
2517 | e023e832 | Alexander Graf | gen_goto_tb(s, 1, s->pc + 4); |
2518 | e023e832 | Alexander Graf | s->is_jmp = DISAS_TB_JUMP; |
2519 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
2520 | e023e832 | Alexander Graf | break;
|
2521 | e023e832 | Alexander Graf | case 0x7: /* BRCTG R1,I2 [RI] */ |
2522 | e023e832 | Alexander Graf | tmp = load_reg(r1); |
2523 | e023e832 | Alexander Graf | tcg_gen_subi_i64(tmp, tmp, 1);
|
2524 | e023e832 | Alexander Graf | store_reg(r1, tmp); |
2525 | e023e832 | Alexander Graf | gen_update_cc_op(s); |
2526 | e023e832 | Alexander Graf | l1 = gen_new_label(); |
2527 | e023e832 | Alexander Graf | tcg_gen_brcondi_i64(TCG_COND_EQ, tmp, 0, l1);
|
2528 | e023e832 | Alexander Graf | gen_goto_tb(s, 0, s->pc + (i2 * 2LL)); |
2529 | e023e832 | Alexander Graf | gen_set_label(l1); |
2530 | e023e832 | Alexander Graf | gen_goto_tb(s, 1, s->pc + 4); |
2531 | e023e832 | Alexander Graf | s->is_jmp = DISAS_TB_JUMP; |
2532 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
2533 | e023e832 | Alexander Graf | break;
|
2534 | e023e832 | Alexander Graf | case 0x8: /* lhi r1, i2 */ |
2535 | e023e832 | Alexander Graf | tmp32_1 = tcg_const_i32(i2); |
2536 | e023e832 | Alexander Graf | store_reg32(r1, tmp32_1); |
2537 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
2538 | e023e832 | Alexander Graf | break;
|
2539 | e023e832 | Alexander Graf | case 0x9: /* lghi r1, i2 */ |
2540 | e023e832 | Alexander Graf | tmp = tcg_const_i64(i2); |
2541 | e023e832 | Alexander Graf | store_reg(r1, tmp); |
2542 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
2543 | e023e832 | Alexander Graf | break;
|
2544 | e023e832 | Alexander Graf | case 0xa: /* AHI R1,I2 [RI] */ |
2545 | e023e832 | Alexander Graf | tmp32_1 = load_reg32(r1); |
2546 | e023e832 | Alexander Graf | tmp32_2 = tcg_temp_new_i32(); |
2547 | e023e832 | Alexander Graf | tmp32_3 = tcg_const_i32(i2); |
2548 | e023e832 | Alexander Graf | |
2549 | e023e832 | Alexander Graf | if (i2 < 0) { |
2550 | e023e832 | Alexander Graf | tcg_gen_subi_i32(tmp32_2, tmp32_1, -i2); |
2551 | e023e832 | Alexander Graf | } else {
|
2552 | e023e832 | Alexander Graf | tcg_gen_add_i32(tmp32_2, tmp32_1, tmp32_3); |
2553 | e023e832 | Alexander Graf | } |
2554 | e023e832 | Alexander Graf | |
2555 | e023e832 | Alexander Graf | store_reg32(r1, tmp32_2); |
2556 | e023e832 | Alexander Graf | set_cc_add32(s, tmp32_1, tmp32_3, tmp32_2); |
2557 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
2558 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_2); |
2559 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_3); |
2560 | e023e832 | Alexander Graf | break;
|
2561 | e023e832 | Alexander Graf | case 0xb: /* aghi r1, i2 */ |
2562 | e023e832 | Alexander Graf | tmp = load_reg(r1); |
2563 | e023e832 | Alexander Graf | tmp2 = tcg_const_i64(i2); |
2564 | e023e832 | Alexander Graf | |
2565 | e023e832 | Alexander Graf | if (i2 < 0) { |
2566 | e023e832 | Alexander Graf | tcg_gen_subi_i64(regs[r1], tmp, -i2); |
2567 | e023e832 | Alexander Graf | } else {
|
2568 | e023e832 | Alexander Graf | tcg_gen_add_i64(regs[r1], tmp, tmp2); |
2569 | e023e832 | Alexander Graf | } |
2570 | e023e832 | Alexander Graf | set_cc_add64(s, tmp, tmp2, regs[r1]); |
2571 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
2572 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
2573 | e023e832 | Alexander Graf | break;
|
2574 | e023e832 | Alexander Graf | case 0xc: /* MHI R1,I2 [RI] */ |
2575 | e023e832 | Alexander Graf | tmp32_1 = load_reg32(r1); |
2576 | e023e832 | Alexander Graf | tcg_gen_muli_i32(tmp32_1, tmp32_1, i2); |
2577 | e023e832 | Alexander Graf | store_reg32(r1, tmp32_1); |
2578 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
2579 | e023e832 | Alexander Graf | break;
|
2580 | e023e832 | Alexander Graf | case 0xd: /* MGHI R1,I2 [RI] */ |
2581 | e023e832 | Alexander Graf | tmp = load_reg(r1); |
2582 | e023e832 | Alexander Graf | tcg_gen_muli_i64(tmp, tmp, i2); |
2583 | e023e832 | Alexander Graf | store_reg(r1, tmp); |
2584 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
2585 | e023e832 | Alexander Graf | break;
|
2586 | e023e832 | Alexander Graf | case 0xe: /* CHI R1,I2 [RI] */ |
2587 | e023e832 | Alexander Graf | tmp32_1 = load_reg32(r1); |
2588 | e023e832 | Alexander Graf | cmp_s32c(s, tmp32_1, i2); |
2589 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
2590 | e023e832 | Alexander Graf | break;
|
2591 | e023e832 | Alexander Graf | case 0xf: /* CGHI R1,I2 [RI] */ |
2592 | e023e832 | Alexander Graf | tmp = load_reg(r1); |
2593 | e023e832 | Alexander Graf | cmp_s64c(s, tmp, i2); |
2594 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
2595 | e023e832 | Alexander Graf | break;
|
2596 | e023e832 | Alexander Graf | default:
|
2597 | e023e832 | Alexander Graf | LOG_DISAS("illegal a7 operation 0x%x\n", op);
|
2598 | e023e832 | Alexander Graf | gen_illegal_opcode(s, 2);
|
2599 | e023e832 | Alexander Graf | return;
|
2600 | e023e832 | Alexander Graf | } |
2601 | e023e832 | Alexander Graf | } |
2602 | e023e832 | Alexander Graf | |
2603 | e023e832 | Alexander Graf | static void disas_b2(DisasContext *s, int op, uint32_t insn) |
2604 | e023e832 | Alexander Graf | { |
2605 | e023e832 | Alexander Graf | TCGv_i64 tmp, tmp2, tmp3; |
2606 | e023e832 | Alexander Graf | TCGv_i32 tmp32_1, tmp32_2, tmp32_3; |
2607 | e023e832 | Alexander Graf | int r1, r2;
|
2608 | e023e832 | Alexander Graf | int ilc = 2; |
2609 | e023e832 | Alexander Graf | #ifndef CONFIG_USER_ONLY
|
2610 | e023e832 | Alexander Graf | int r3, d2, b2;
|
2611 | e023e832 | Alexander Graf | #endif
|
2612 | e023e832 | Alexander Graf | |
2613 | e023e832 | Alexander Graf | r1 = (insn >> 4) & 0xf; |
2614 | e023e832 | Alexander Graf | r2 = insn & 0xf;
|
2615 | e023e832 | Alexander Graf | |
2616 | e023e832 | Alexander Graf | LOG_DISAS("disas_b2: op 0x%x r1 %d r2 %d\n", op, r1, r2);
|
2617 | e023e832 | Alexander Graf | |
2618 | e023e832 | Alexander Graf | switch (op) {
|
2619 | e023e832 | Alexander Graf | case 0x22: /* IPM R1 [RRE] */ |
2620 | e023e832 | Alexander Graf | tmp32_1 = tcg_const_i32(r1); |
2621 | e023e832 | Alexander Graf | gen_op_calc_cc(s); |
2622 | e023e832 | Alexander Graf | gen_helper_ipm(cc_op, tmp32_1); |
2623 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
2624 | e023e832 | Alexander Graf | break;
|
2625 | e023e832 | Alexander Graf | case 0x41: /* CKSM R1,R2 [RRE] */ |
2626 | e023e832 | Alexander Graf | tmp32_1 = tcg_const_i32(r1); |
2627 | e023e832 | Alexander Graf | tmp32_2 = tcg_const_i32(r2); |
2628 | e023e832 | Alexander Graf | potential_page_fault(s); |
2629 | e023e832 | Alexander Graf | gen_helper_cksm(tmp32_1, tmp32_2); |
2630 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
2631 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_2); |
2632 | e023e832 | Alexander Graf | gen_op_movi_cc(s, 0);
|
2633 | e023e832 | Alexander Graf | break;
|
2634 | e023e832 | Alexander Graf | case 0x4e: /* SAR R1,R2 [RRE] */ |
2635 | e023e832 | Alexander Graf | tmp32_1 = load_reg32(r2); |
2636 | e023e832 | Alexander Graf | tcg_gen_st_i32(tmp32_1, cpu_env, offsetof(CPUState, aregs[r1])); |
2637 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
2638 | e023e832 | Alexander Graf | break;
|
2639 | e023e832 | Alexander Graf | case 0x4f: /* EAR R1,R2 [RRE] */ |
2640 | e023e832 | Alexander Graf | tmp32_1 = tcg_temp_new_i32(); |
2641 | e023e832 | Alexander Graf | tcg_gen_ld_i32(tmp32_1, cpu_env, offsetof(CPUState, aregs[r2])); |
2642 | e023e832 | Alexander Graf | store_reg32(r1, tmp32_1); |
2643 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
2644 | e023e832 | Alexander Graf | break;
|
2645 | e023e832 | Alexander Graf | case 0x52: /* MSR R1,R2 [RRE] */ |
2646 | e023e832 | Alexander Graf | tmp32_1 = load_reg32(r1); |
2647 | e023e832 | Alexander Graf | tmp32_2 = load_reg32(r2); |
2648 | e023e832 | Alexander Graf | tcg_gen_mul_i32(tmp32_1, tmp32_1, tmp32_2); |
2649 | e023e832 | Alexander Graf | store_reg32(r1, tmp32_1); |
2650 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
2651 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_2); |
2652 | e023e832 | Alexander Graf | break;
|
2653 | e023e832 | Alexander Graf | case 0x54: /* MVPG R1,R2 [RRE] */ |
2654 | e023e832 | Alexander Graf | tmp = load_reg(0);
|
2655 | e023e832 | Alexander Graf | tmp2 = load_reg(r1); |
2656 | e023e832 | Alexander Graf | tmp3 = load_reg(r2); |
2657 | e023e832 | Alexander Graf | potential_page_fault(s); |
2658 | e023e832 | Alexander Graf | gen_helper_mvpg(tmp, tmp2, tmp3); |
2659 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
2660 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
2661 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp3); |
2662 | e023e832 | Alexander Graf | /* XXX check CCO bit and set CC accordingly */
|
2663 | e023e832 | Alexander Graf | gen_op_movi_cc(s, 0);
|
2664 | e023e832 | Alexander Graf | break;
|
2665 | e023e832 | Alexander Graf | case 0x55: /* MVST R1,R2 [RRE] */ |
2666 | e023e832 | Alexander Graf | tmp32_1 = load_reg32(0);
|
2667 | e023e832 | Alexander Graf | tmp32_2 = tcg_const_i32(r1); |
2668 | e023e832 | Alexander Graf | tmp32_3 = tcg_const_i32(r2); |
2669 | e023e832 | Alexander Graf | potential_page_fault(s); |
2670 | e023e832 | Alexander Graf | gen_helper_mvst(tmp32_1, tmp32_2, tmp32_3); |
2671 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
2672 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_2); |
2673 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_3); |
2674 | e023e832 | Alexander Graf | gen_op_movi_cc(s, 1);
|
2675 | e023e832 | Alexander Graf | break;
|
2676 | e023e832 | Alexander Graf | case 0x5d: /* CLST R1,R2 [RRE] */ |
2677 | e023e832 | Alexander Graf | tmp32_1 = load_reg32(0);
|
2678 | e023e832 | Alexander Graf | tmp32_2 = tcg_const_i32(r1); |
2679 | e023e832 | Alexander Graf | tmp32_3 = tcg_const_i32(r2); |
2680 | e023e832 | Alexander Graf | potential_page_fault(s); |
2681 | e023e832 | Alexander Graf | gen_helper_clst(cc_op, tmp32_1, tmp32_2, tmp32_3); |
2682 | e023e832 | Alexander Graf | set_cc_static(s); |
2683 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
2684 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_2); |
2685 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_3); |
2686 | e023e832 | Alexander Graf | break;
|
2687 | e023e832 | Alexander Graf | case 0x5e: /* SRST R1,R2 [RRE] */ |
2688 | e023e832 | Alexander Graf | tmp32_1 = load_reg32(0);
|
2689 | e023e832 | Alexander Graf | tmp32_2 = tcg_const_i32(r1); |
2690 | e023e832 | Alexander Graf | tmp32_3 = tcg_const_i32(r2); |
2691 | e023e832 | Alexander Graf | potential_page_fault(s); |
2692 | e023e832 | Alexander Graf | gen_helper_srst(cc_op, tmp32_1, tmp32_2, tmp32_3); |
2693 | e023e832 | Alexander Graf | set_cc_static(s); |
2694 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
2695 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_2); |
2696 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_3); |
2697 | e023e832 | Alexander Graf | break;
|
2698 | e023e832 | Alexander Graf | |
2699 | e023e832 | Alexander Graf | #ifndef CONFIG_USER_ONLY
|
2700 | e023e832 | Alexander Graf | case 0x02: /* STIDP D2(B2) [S] */ |
2701 | e023e832 | Alexander Graf | /* Store CPU ID */
|
2702 | e023e832 | Alexander Graf | check_privileged(s, ilc); |
2703 | e023e832 | Alexander Graf | decode_rs(s, insn, &r1, &r3, &b2, &d2); |
2704 | e023e832 | Alexander Graf | tmp = get_address(s, 0, b2, d2);
|
2705 | e023e832 | Alexander Graf | potential_page_fault(s); |
2706 | e023e832 | Alexander Graf | gen_helper_stidp(tmp); |
2707 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
2708 | e023e832 | Alexander Graf | break;
|
2709 | e023e832 | Alexander Graf | case 0x04: /* SCK D2(B2) [S] */ |
2710 | e023e832 | Alexander Graf | /* Set Clock */
|
2711 | e023e832 | Alexander Graf | check_privileged(s, ilc); |
2712 | e023e832 | Alexander Graf | decode_rs(s, insn, &r1, &r3, &b2, &d2); |
2713 | e023e832 | Alexander Graf | tmp = get_address(s, 0, b2, d2);
|
2714 | e023e832 | Alexander Graf | potential_page_fault(s); |
2715 | e023e832 | Alexander Graf | gen_helper_sck(cc_op, tmp); |
2716 | e023e832 | Alexander Graf | set_cc_static(s); |
2717 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
2718 | e023e832 | Alexander Graf | break;
|
2719 | e023e832 | Alexander Graf | case 0x05: /* STCK D2(B2) [S] */ |
2720 | e023e832 | Alexander Graf | /* Store Clock */
|
2721 | e023e832 | Alexander Graf | decode_rs(s, insn, &r1, &r3, &b2, &d2); |
2722 | e023e832 | Alexander Graf | tmp = get_address(s, 0, b2, d2);
|
2723 | e023e832 | Alexander Graf | potential_page_fault(s); |
2724 | e023e832 | Alexander Graf | gen_helper_stck(cc_op, tmp); |
2725 | e023e832 | Alexander Graf | set_cc_static(s); |
2726 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
2727 | e023e832 | Alexander Graf | break;
|
2728 | e023e832 | Alexander Graf | case 0x06: /* SCKC D2(B2) [S] */ |
2729 | e023e832 | Alexander Graf | /* Set Clock Comparator */
|
2730 | e023e832 | Alexander Graf | check_privileged(s, ilc); |
2731 | e023e832 | Alexander Graf | decode_rs(s, insn, &r1, &r3, &b2, &d2); |
2732 | e023e832 | Alexander Graf | tmp = get_address(s, 0, b2, d2);
|
2733 | e023e832 | Alexander Graf | potential_page_fault(s); |
2734 | e023e832 | Alexander Graf | gen_helper_sckc(tmp); |
2735 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
2736 | e023e832 | Alexander Graf | break;
|
2737 | e023e832 | Alexander Graf | case 0x07: /* STCKC D2(B2) [S] */ |
2738 | e023e832 | Alexander Graf | /* Store Clock Comparator */
|
2739 | e023e832 | Alexander Graf | check_privileged(s, ilc); |
2740 | e023e832 | Alexander Graf | decode_rs(s, insn, &r1, &r3, &b2, &d2); |
2741 | e023e832 | Alexander Graf | tmp = get_address(s, 0, b2, d2);
|
2742 | e023e832 | Alexander Graf | potential_page_fault(s); |
2743 | e023e832 | Alexander Graf | gen_helper_stckc(tmp); |
2744 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
2745 | e023e832 | Alexander Graf | break;
|
2746 | e023e832 | Alexander Graf | case 0x08: /* SPT D2(B2) [S] */ |
2747 | e023e832 | Alexander Graf | /* Set CPU Timer */
|
2748 | e023e832 | Alexander Graf | check_privileged(s, ilc); |
2749 | e023e832 | Alexander Graf | decode_rs(s, insn, &r1, &r3, &b2, &d2); |
2750 | e023e832 | Alexander Graf | tmp = get_address(s, 0, b2, d2);
|
2751 | e023e832 | Alexander Graf | potential_page_fault(s); |
2752 | e023e832 | Alexander Graf | gen_helper_spt(tmp); |
2753 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
2754 | e023e832 | Alexander Graf | break;
|
2755 | e023e832 | Alexander Graf | case 0x09: /* STPT D2(B2) [S] */ |
2756 | e023e832 | Alexander Graf | /* Store CPU Timer */
|
2757 | e023e832 | Alexander Graf | check_privileged(s, ilc); |
2758 | e023e832 | Alexander Graf | decode_rs(s, insn, &r1, &r3, &b2, &d2); |
2759 | e023e832 | Alexander Graf | tmp = get_address(s, 0, b2, d2);
|
2760 | e023e832 | Alexander Graf | potential_page_fault(s); |
2761 | e023e832 | Alexander Graf | gen_helper_stpt(tmp); |
2762 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
2763 | e023e832 | Alexander Graf | break;
|
2764 | e023e832 | Alexander Graf | case 0x0a: /* SPKA D2(B2) [S] */ |
2765 | e023e832 | Alexander Graf | /* Set PSW Key from Address */
|
2766 | e023e832 | Alexander Graf | check_privileged(s, ilc); |
2767 | e023e832 | Alexander Graf | decode_rs(s, insn, &r1, &r3, &b2, &d2); |
2768 | e023e832 | Alexander Graf | tmp = get_address(s, 0, b2, d2);
|
2769 | e023e832 | Alexander Graf | tmp2 = tcg_temp_new_i64(); |
2770 | e023e832 | Alexander Graf | tcg_gen_andi_i64(tmp2, psw_mask, ~PSW_MASK_KEY); |
2771 | e023e832 | Alexander Graf | tcg_gen_shli_i64(tmp, tmp, PSW_SHIFT_KEY - 4);
|
2772 | e023e832 | Alexander Graf | tcg_gen_or_i64(psw_mask, tmp2, tmp); |
2773 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
2774 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
2775 | e023e832 | Alexander Graf | break;
|
2776 | e023e832 | Alexander Graf | case 0x0d: /* PTLB [S] */ |
2777 | e023e832 | Alexander Graf | /* Purge TLB */
|
2778 | e023e832 | Alexander Graf | check_privileged(s, ilc); |
2779 | e023e832 | Alexander Graf | gen_helper_ptlb(); |
2780 | e023e832 | Alexander Graf | break;
|
2781 | e023e832 | Alexander Graf | case 0x10: /* SPX D2(B2) [S] */ |
2782 | e023e832 | Alexander Graf | /* Set Prefix Register */
|
2783 | e023e832 | Alexander Graf | check_privileged(s, ilc); |
2784 | e023e832 | Alexander Graf | decode_rs(s, insn, &r1, &r3, &b2, &d2); |
2785 | e023e832 | Alexander Graf | tmp = get_address(s, 0, b2, d2);
|
2786 | e023e832 | Alexander Graf | potential_page_fault(s); |
2787 | e023e832 | Alexander Graf | gen_helper_spx(tmp); |
2788 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
2789 | e023e832 | Alexander Graf | break;
|
2790 | e023e832 | Alexander Graf | case 0x11: /* STPX D2(B2) [S] */ |
2791 | e023e832 | Alexander Graf | /* Store Prefix */
|
2792 | e023e832 | Alexander Graf | check_privileged(s, ilc); |
2793 | e023e832 | Alexander Graf | decode_rs(s, insn, &r1, &r3, &b2, &d2); |
2794 | e023e832 | Alexander Graf | tmp = get_address(s, 0, b2, d2);
|
2795 | e023e832 | Alexander Graf | tmp2 = tcg_temp_new_i64(); |
2796 | e023e832 | Alexander Graf | tcg_gen_ld_i64(tmp2, cpu_env, offsetof(CPUState, psa)); |
2797 | e023e832 | Alexander Graf | tcg_gen_qemu_st32(tmp2, tmp, get_mem_index(s)); |
2798 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
2799 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
2800 | e023e832 | Alexander Graf | break;
|
2801 | e023e832 | Alexander Graf | case 0x12: /* STAP D2(B2) [S] */ |
2802 | e023e832 | Alexander Graf | /* Store CPU Address */
|
2803 | e023e832 | Alexander Graf | check_privileged(s, ilc); |
2804 | e023e832 | Alexander Graf | decode_rs(s, insn, &r1, &r3, &b2, &d2); |
2805 | e023e832 | Alexander Graf | tmp = get_address(s, 0, b2, d2);
|
2806 | e023e832 | Alexander Graf | tmp2 = tcg_temp_new_i64(); |
2807 | e023e832 | Alexander Graf | tmp32_1 = tcg_temp_new_i32(); |
2808 | e023e832 | Alexander Graf | tcg_gen_ld_i32(tmp32_1, cpu_env, offsetof(CPUState, cpu_num)); |
2809 | e023e832 | Alexander Graf | tcg_gen_extu_i32_i64(tmp2, tmp32_1); |
2810 | e023e832 | Alexander Graf | tcg_gen_qemu_st32(tmp2, tmp, get_mem_index(s)); |
2811 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
2812 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
2813 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
2814 | e023e832 | Alexander Graf | break;
|
2815 | e023e832 | Alexander Graf | case 0x21: /* IPTE R1,R2 [RRE] */ |
2816 | e023e832 | Alexander Graf | /* Invalidate PTE */
|
2817 | e023e832 | Alexander Graf | check_privileged(s, ilc); |
2818 | e023e832 | Alexander Graf | r1 = (insn >> 4) & 0xf; |
2819 | e023e832 | Alexander Graf | r2 = insn & 0xf;
|
2820 | e023e832 | Alexander Graf | tmp = load_reg(r1); |
2821 | e023e832 | Alexander Graf | tmp2 = load_reg(r2); |
2822 | e023e832 | Alexander Graf | gen_helper_ipte(tmp, tmp2); |
2823 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
2824 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
2825 | e023e832 | Alexander Graf | break;
|
2826 | e023e832 | Alexander Graf | case 0x29: /* ISKE R1,R2 [RRE] */ |
2827 | e023e832 | Alexander Graf | /* Insert Storage Key Extended */
|
2828 | e023e832 | Alexander Graf | check_privileged(s, ilc); |
2829 | e023e832 | Alexander Graf | r1 = (insn >> 4) & 0xf; |
2830 | e023e832 | Alexander Graf | r2 = insn & 0xf;
|
2831 | e023e832 | Alexander Graf | tmp = load_reg(r2); |
2832 | e023e832 | Alexander Graf | tmp2 = tcg_temp_new_i64(); |
2833 | e023e832 | Alexander Graf | gen_helper_iske(tmp2, tmp); |
2834 | e023e832 | Alexander Graf | store_reg(r1, tmp2); |
2835 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
2836 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
2837 | e023e832 | Alexander Graf | break;
|
2838 | e023e832 | Alexander Graf | case 0x2a: /* RRBE R1,R2 [RRE] */ |
2839 | e023e832 | Alexander Graf | /* Set Storage Key Extended */
|
2840 | e023e832 | Alexander Graf | check_privileged(s, ilc); |
2841 | e023e832 | Alexander Graf | r1 = (insn >> 4) & 0xf; |
2842 | e023e832 | Alexander Graf | r2 = insn & 0xf;
|
2843 | e023e832 | Alexander Graf | tmp32_1 = load_reg32(r1); |
2844 | e023e832 | Alexander Graf | tmp = load_reg(r2); |
2845 | e023e832 | Alexander Graf | gen_helper_rrbe(cc_op, tmp32_1, tmp); |
2846 | e023e832 | Alexander Graf | set_cc_static(s); |
2847 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
2848 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
2849 | e023e832 | Alexander Graf | break;
|
2850 | e023e832 | Alexander Graf | case 0x2b: /* SSKE R1,R2 [RRE] */ |
2851 | e023e832 | Alexander Graf | /* Set Storage Key Extended */
|
2852 | e023e832 | Alexander Graf | check_privileged(s, ilc); |
2853 | e023e832 | Alexander Graf | r1 = (insn >> 4) & 0xf; |
2854 | e023e832 | Alexander Graf | r2 = insn & 0xf;
|
2855 | e023e832 | Alexander Graf | tmp32_1 = load_reg32(r1); |
2856 | e023e832 | Alexander Graf | tmp = load_reg(r2); |
2857 | e023e832 | Alexander Graf | gen_helper_sske(tmp32_1, tmp); |
2858 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
2859 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
2860 | e023e832 | Alexander Graf | break;
|
2861 | e023e832 | Alexander Graf | case 0x34: /* STCH ? */ |
2862 | e023e832 | Alexander Graf | /* Store Subchannel */
|
2863 | e023e832 | Alexander Graf | check_privileged(s, ilc); |
2864 | e023e832 | Alexander Graf | gen_op_movi_cc(s, 3);
|
2865 | e023e832 | Alexander Graf | break;
|
2866 | e023e832 | Alexander Graf | case 0x46: /* STURA R1,R2 [RRE] */ |
2867 | e023e832 | Alexander Graf | /* Store Using Real Address */
|
2868 | e023e832 | Alexander Graf | check_privileged(s, ilc); |
2869 | e023e832 | Alexander Graf | r1 = (insn >> 4) & 0xf; |
2870 | e023e832 | Alexander Graf | r2 = insn & 0xf;
|
2871 | e023e832 | Alexander Graf | tmp32_1 = load_reg32(r1); |
2872 | e023e832 | Alexander Graf | tmp = load_reg(r2); |
2873 | e023e832 | Alexander Graf | potential_page_fault(s); |
2874 | e023e832 | Alexander Graf | gen_helper_stura(tmp, tmp32_1); |
2875 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
2876 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
2877 | e023e832 | Alexander Graf | break;
|
2878 | e023e832 | Alexander Graf | case 0x50: /* CSP R1,R2 [RRE] */ |
2879 | e023e832 | Alexander Graf | /* Compare And Swap And Purge */
|
2880 | e023e832 | Alexander Graf | check_privileged(s, ilc); |
2881 | e023e832 | Alexander Graf | r1 = (insn >> 4) & 0xf; |
2882 | e023e832 | Alexander Graf | r2 = insn & 0xf;
|
2883 | e023e832 | Alexander Graf | tmp32_1 = tcg_const_i32(r1); |
2884 | e023e832 | Alexander Graf | tmp32_2 = tcg_const_i32(r2); |
2885 | e023e832 | Alexander Graf | gen_helper_csp(cc_op, tmp32_1, tmp32_2); |
2886 | e023e832 | Alexander Graf | set_cc_static(s); |
2887 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
2888 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_2); |
2889 | e023e832 | Alexander Graf | break;
|
2890 | e023e832 | Alexander Graf | case 0x5f: /* CHSC ? */ |
2891 | e023e832 | Alexander Graf | /* Channel Subsystem Call */
|
2892 | e023e832 | Alexander Graf | check_privileged(s, ilc); |
2893 | e023e832 | Alexander Graf | gen_op_movi_cc(s, 3);
|
2894 | e023e832 | Alexander Graf | break;
|
2895 | e023e832 | Alexander Graf | case 0x78: /* STCKE D2(B2) [S] */ |
2896 | e023e832 | Alexander Graf | /* Store Clock Extended */
|
2897 | e023e832 | Alexander Graf | decode_rs(s, insn, &r1, &r3, &b2, &d2); |
2898 | e023e832 | Alexander Graf | tmp = get_address(s, 0, b2, d2);
|
2899 | e023e832 | Alexander Graf | potential_page_fault(s); |
2900 | e023e832 | Alexander Graf | gen_helper_stcke(cc_op, tmp); |
2901 | e023e832 | Alexander Graf | set_cc_static(s); |
2902 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
2903 | e023e832 | Alexander Graf | break;
|
2904 | e023e832 | Alexander Graf | case 0x79: /* SACF D2(B2) [S] */ |
2905 | e023e832 | Alexander Graf | /* Store Clock Extended */
|
2906 | e023e832 | Alexander Graf | check_privileged(s, ilc); |
2907 | e023e832 | Alexander Graf | decode_rs(s, insn, &r1, &r3, &b2, &d2); |
2908 | e023e832 | Alexander Graf | tmp = get_address(s, 0, b2, d2);
|
2909 | e023e832 | Alexander Graf | potential_page_fault(s); |
2910 | e023e832 | Alexander Graf | gen_helper_sacf(tmp); |
2911 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
2912 | e023e832 | Alexander Graf | /* addressing mode has changed, so end the block */
|
2913 | e023e832 | Alexander Graf | s->pc += ilc * 2;
|
2914 | e023e832 | Alexander Graf | update_psw_addr(s); |
2915 | e023e832 | Alexander Graf | s->is_jmp = DISAS_EXCP; |
2916 | e023e832 | Alexander Graf | break;
|
2917 | e023e832 | Alexander Graf | case 0x7d: /* STSI D2,(B2) [S] */ |
2918 | e023e832 | Alexander Graf | check_privileged(s, ilc); |
2919 | e023e832 | Alexander Graf | decode_rs(s, insn, &r1, &r3, &b2, &d2); |
2920 | e023e832 | Alexander Graf | tmp = get_address(s, 0, b2, d2);
|
2921 | e023e832 | Alexander Graf | tmp32_1 = load_reg32(0);
|
2922 | e023e832 | Alexander Graf | tmp32_2 = load_reg32(1);
|
2923 | e023e832 | Alexander Graf | potential_page_fault(s); |
2924 | e023e832 | Alexander Graf | gen_helper_stsi(cc_op, tmp, tmp32_1, tmp32_2); |
2925 | e023e832 | Alexander Graf | set_cc_static(s); |
2926 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
2927 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
2928 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_2); |
2929 | e023e832 | Alexander Graf | break;
|
2930 | e023e832 | Alexander Graf | case 0x9d: /* LFPC D2(B2) [S] */ |
2931 | e023e832 | Alexander Graf | decode_rs(s, insn, &r1, &r3, &b2, &d2); |
2932 | e023e832 | Alexander Graf | tmp = get_address(s, 0, b2, d2);
|
2933 | e023e832 | Alexander Graf | tmp2 = tcg_temp_new_i64(); |
2934 | e023e832 | Alexander Graf | tmp32_1 = tcg_temp_new_i32(); |
2935 | e023e832 | Alexander Graf | tcg_gen_qemu_ld32u(tmp2, tmp, get_mem_index(s)); |
2936 | e023e832 | Alexander Graf | tcg_gen_trunc_i64_i32(tmp32_1, tmp2); |
2937 | e023e832 | Alexander Graf | tcg_gen_st_i32(tmp32_1, cpu_env, offsetof(CPUState, fpc)); |
2938 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
2939 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
2940 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
2941 | e023e832 | Alexander Graf | break;
|
2942 | e023e832 | Alexander Graf | case 0xb1: /* STFL D2(B2) [S] */ |
2943 | e023e832 | Alexander Graf | /* Store Facility List (CPU features) at 200 */
|
2944 | e023e832 | Alexander Graf | check_privileged(s, ilc); |
2945 | e023e832 | Alexander Graf | tmp2 = tcg_const_i64(0xc0000000);
|
2946 | e023e832 | Alexander Graf | tmp = tcg_const_i64(200);
|
2947 | e023e832 | Alexander Graf | tcg_gen_qemu_st32(tmp2, tmp, get_mem_index(s)); |
2948 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
2949 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
2950 | e023e832 | Alexander Graf | break;
|
2951 | e023e832 | Alexander Graf | case 0xb2: /* LPSWE D2(B2) [S] */ |
2952 | e023e832 | Alexander Graf | /* Load PSW Extended */
|
2953 | e023e832 | Alexander Graf | check_privileged(s, ilc); |
2954 | e023e832 | Alexander Graf | decode_rs(s, insn, &r1, &r3, &b2, &d2); |
2955 | e023e832 | Alexander Graf | tmp = get_address(s, 0, b2, d2);
|
2956 | e023e832 | Alexander Graf | tmp2 = tcg_temp_new_i64(); |
2957 | e023e832 | Alexander Graf | tmp3 = tcg_temp_new_i64(); |
2958 | e023e832 | Alexander Graf | tcg_gen_qemu_ld64(tmp2, tmp, get_mem_index(s)); |
2959 | e023e832 | Alexander Graf | tcg_gen_addi_i64(tmp, tmp, 8);
|
2960 | e023e832 | Alexander Graf | tcg_gen_qemu_ld64(tmp3, tmp, get_mem_index(s)); |
2961 | e023e832 | Alexander Graf | gen_helper_load_psw(tmp2, tmp3); |
2962 | e023e832 | Alexander Graf | /* we need to keep cc_op intact */
|
2963 | e023e832 | Alexander Graf | s->is_jmp = DISAS_JUMP; |
2964 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
2965 | e023e832 | Alexander Graf | break;
|
2966 | e023e832 | Alexander Graf | case 0x20: /* SERVC R1,R2 [RRE] */ |
2967 | e023e832 | Alexander Graf | /* SCLP Service call (PV hypercall) */
|
2968 | e023e832 | Alexander Graf | check_privileged(s, ilc); |
2969 | e023e832 | Alexander Graf | potential_page_fault(s); |
2970 | e023e832 | Alexander Graf | tmp32_1 = load_reg32(r2); |
2971 | e023e832 | Alexander Graf | tmp = load_reg(r1); |
2972 | e023e832 | Alexander Graf | gen_helper_servc(cc_op, tmp32_1, tmp); |
2973 | e023e832 | Alexander Graf | set_cc_static(s); |
2974 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
2975 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
2976 | e023e832 | Alexander Graf | break;
|
2977 | e023e832 | Alexander Graf | #endif
|
2978 | e023e832 | Alexander Graf | default:
|
2979 | e023e832 | Alexander Graf | LOG_DISAS("illegal b2 operation 0x%x\n", op);
|
2980 | e023e832 | Alexander Graf | gen_illegal_opcode(s, ilc); |
2981 | e023e832 | Alexander Graf | break;
|
2982 | e023e832 | Alexander Graf | } |
2983 | e023e832 | Alexander Graf | } |
2984 | e023e832 | Alexander Graf | |
2985 | e023e832 | Alexander Graf | static void disas_b3(DisasContext *s, int op, int m3, int r1, int r2) |
2986 | e023e832 | Alexander Graf | { |
2987 | e023e832 | Alexander Graf | TCGv_i64 tmp; |
2988 | e023e832 | Alexander Graf | TCGv_i32 tmp32_1, tmp32_2, tmp32_3; |
2989 | e023e832 | Alexander Graf | LOG_DISAS("disas_b3: op 0x%x m3 0x%x r1 %d r2 %d\n", op, m3, r1, r2);
|
2990 | e023e832 | Alexander Graf | #define FP_HELPER(i) \
|
2991 | e023e832 | Alexander Graf | tmp32_1 = tcg_const_i32(r1); \ |
2992 | e023e832 | Alexander Graf | tmp32_2 = tcg_const_i32(r2); \ |
2993 | e023e832 | Alexander Graf | gen_helper_ ## i (tmp32_1, tmp32_2); \ |
2994 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); \ |
2995 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_2); |
2996 | e023e832 | Alexander Graf | |
2997 | e023e832 | Alexander Graf | #define FP_HELPER_CC(i) \
|
2998 | e023e832 | Alexander Graf | tmp32_1 = tcg_const_i32(r1); \ |
2999 | e023e832 | Alexander Graf | tmp32_2 = tcg_const_i32(r2); \ |
3000 | e023e832 | Alexander Graf | gen_helper_ ## i (cc_op, tmp32_1, tmp32_2); \ |
3001 | e023e832 | Alexander Graf | set_cc_static(s); \ |
3002 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); \ |
3003 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_2); |
3004 | e023e832 | Alexander Graf | |
3005 | e023e832 | Alexander Graf | switch (op) {
|
3006 | e023e832 | Alexander Graf | case 0x0: /* LPEBR R1,R2 [RRE] */ |
3007 | e023e832 | Alexander Graf | FP_HELPER_CC(lpebr); |
3008 | e023e832 | Alexander Graf | break;
|
3009 | e023e832 | Alexander Graf | case 0x2: /* LTEBR R1,R2 [RRE] */ |
3010 | e023e832 | Alexander Graf | FP_HELPER_CC(ltebr); |
3011 | e023e832 | Alexander Graf | break;
|
3012 | e023e832 | Alexander Graf | case 0x3: /* LCEBR R1,R2 [RRE] */ |
3013 | e023e832 | Alexander Graf | FP_HELPER_CC(lcebr); |
3014 | e023e832 | Alexander Graf | break;
|
3015 | e023e832 | Alexander Graf | case 0x4: /* LDEBR R1,R2 [RRE] */ |
3016 | e023e832 | Alexander Graf | FP_HELPER(ldebr); |
3017 | e023e832 | Alexander Graf | break;
|
3018 | e023e832 | Alexander Graf | case 0x5: /* LXDBR R1,R2 [RRE] */ |
3019 | e023e832 | Alexander Graf | FP_HELPER(lxdbr); |
3020 | e023e832 | Alexander Graf | break;
|
3021 | e023e832 | Alexander Graf | case 0x9: /* CEBR R1,R2 [RRE] */ |
3022 | e023e832 | Alexander Graf | FP_HELPER_CC(cebr); |
3023 | e023e832 | Alexander Graf | break;
|
3024 | e023e832 | Alexander Graf | case 0xa: /* AEBR R1,R2 [RRE] */ |
3025 | e023e832 | Alexander Graf | FP_HELPER_CC(aebr); |
3026 | e023e832 | Alexander Graf | break;
|
3027 | e023e832 | Alexander Graf | case 0xb: /* SEBR R1,R2 [RRE] */ |
3028 | e023e832 | Alexander Graf | FP_HELPER_CC(sebr); |
3029 | e023e832 | Alexander Graf | break;
|
3030 | e023e832 | Alexander Graf | case 0xd: /* DEBR R1,R2 [RRE] */ |
3031 | e023e832 | Alexander Graf | FP_HELPER(debr); |
3032 | e023e832 | Alexander Graf | break;
|
3033 | e023e832 | Alexander Graf | case 0x10: /* LPDBR R1,R2 [RRE] */ |
3034 | e023e832 | Alexander Graf | FP_HELPER_CC(lpdbr); |
3035 | e023e832 | Alexander Graf | break;
|
3036 | e023e832 | Alexander Graf | case 0x12: /* LTDBR R1,R2 [RRE] */ |
3037 | e023e832 | Alexander Graf | FP_HELPER_CC(ltdbr); |
3038 | e023e832 | Alexander Graf | break;
|
3039 | e023e832 | Alexander Graf | case 0x13: /* LCDBR R1,R2 [RRE] */ |
3040 | e023e832 | Alexander Graf | FP_HELPER_CC(lcdbr); |
3041 | e023e832 | Alexander Graf | break;
|
3042 | e023e832 | Alexander Graf | case 0x15: /* SQBDR R1,R2 [RRE] */ |
3043 | e023e832 | Alexander Graf | FP_HELPER(sqdbr); |
3044 | e023e832 | Alexander Graf | break;
|
3045 | e023e832 | Alexander Graf | case 0x17: /* MEEBR R1,R2 [RRE] */ |
3046 | e023e832 | Alexander Graf | FP_HELPER(meebr); |
3047 | e023e832 | Alexander Graf | break;
|
3048 | e023e832 | Alexander Graf | case 0x19: /* CDBR R1,R2 [RRE] */ |
3049 | e023e832 | Alexander Graf | FP_HELPER_CC(cdbr); |
3050 | e023e832 | Alexander Graf | break;
|
3051 | e023e832 | Alexander Graf | case 0x1a: /* ADBR R1,R2 [RRE] */ |
3052 | e023e832 | Alexander Graf | FP_HELPER_CC(adbr); |
3053 | e023e832 | Alexander Graf | break;
|
3054 | e023e832 | Alexander Graf | case 0x1b: /* SDBR R1,R2 [RRE] */ |
3055 | e023e832 | Alexander Graf | FP_HELPER_CC(sdbr); |
3056 | e023e832 | Alexander Graf | break;
|
3057 | e023e832 | Alexander Graf | case 0x1c: /* MDBR R1,R2 [RRE] */ |
3058 | e023e832 | Alexander Graf | FP_HELPER(mdbr); |
3059 | e023e832 | Alexander Graf | break;
|
3060 | e023e832 | Alexander Graf | case 0x1d: /* DDBR R1,R2 [RRE] */ |
3061 | e023e832 | Alexander Graf | FP_HELPER(ddbr); |
3062 | e023e832 | Alexander Graf | break;
|
3063 | e023e832 | Alexander Graf | case 0xe: /* MAEBR R1,R3,R2 [RRF] */ |
3064 | e023e832 | Alexander Graf | case 0x1e: /* MADBR R1,R3,R2 [RRF] */ |
3065 | e023e832 | Alexander Graf | case 0x1f: /* MSDBR R1,R3,R2 [RRF] */ |
3066 | e023e832 | Alexander Graf | /* for RRF insns, m3 is R1, r1 is R3, and r2 is R2 */
|
3067 | e023e832 | Alexander Graf | tmp32_1 = tcg_const_i32(m3); |
3068 | e023e832 | Alexander Graf | tmp32_2 = tcg_const_i32(r2); |
3069 | e023e832 | Alexander Graf | tmp32_3 = tcg_const_i32(r1); |
3070 | e023e832 | Alexander Graf | switch (op) {
|
3071 | e023e832 | Alexander Graf | case 0xe: |
3072 | e023e832 | Alexander Graf | gen_helper_maebr(tmp32_1, tmp32_3, tmp32_2); |
3073 | e023e832 | Alexander Graf | break;
|
3074 | e023e832 | Alexander Graf | case 0x1e: |
3075 | e023e832 | Alexander Graf | gen_helper_madbr(tmp32_1, tmp32_3, tmp32_2); |
3076 | e023e832 | Alexander Graf | break;
|
3077 | e023e832 | Alexander Graf | case 0x1f: |
3078 | e023e832 | Alexander Graf | gen_helper_msdbr(tmp32_1, tmp32_3, tmp32_2); |
3079 | e023e832 | Alexander Graf | break;
|
3080 | e023e832 | Alexander Graf | default:
|
3081 | e023e832 | Alexander Graf | tcg_abort(); |
3082 | e023e832 | Alexander Graf | } |
3083 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
3084 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_2); |
3085 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_3); |
3086 | e023e832 | Alexander Graf | break;
|
3087 | e023e832 | Alexander Graf | case 0x40: /* LPXBR R1,R2 [RRE] */ |
3088 | e023e832 | Alexander Graf | FP_HELPER_CC(lpxbr); |
3089 | e023e832 | Alexander Graf | break;
|
3090 | e023e832 | Alexander Graf | case 0x42: /* LTXBR R1,R2 [RRE] */ |
3091 | e023e832 | Alexander Graf | FP_HELPER_CC(ltxbr); |
3092 | e023e832 | Alexander Graf | break;
|
3093 | e023e832 | Alexander Graf | case 0x43: /* LCXBR R1,R2 [RRE] */ |
3094 | e023e832 | Alexander Graf | FP_HELPER_CC(lcxbr); |
3095 | e023e832 | Alexander Graf | break;
|
3096 | e023e832 | Alexander Graf | case 0x44: /* LEDBR R1,R2 [RRE] */ |
3097 | e023e832 | Alexander Graf | FP_HELPER(ledbr); |
3098 | e023e832 | Alexander Graf | break;
|
3099 | e023e832 | Alexander Graf | case 0x45: /* LDXBR R1,R2 [RRE] */ |
3100 | e023e832 | Alexander Graf | FP_HELPER(ldxbr); |
3101 | e023e832 | Alexander Graf | break;
|
3102 | e023e832 | Alexander Graf | case 0x46: /* LEXBR R1,R2 [RRE] */ |
3103 | e023e832 | Alexander Graf | FP_HELPER(lexbr); |
3104 | e023e832 | Alexander Graf | break;
|
3105 | e023e832 | Alexander Graf | case 0x49: /* CXBR R1,R2 [RRE] */ |
3106 | e023e832 | Alexander Graf | FP_HELPER_CC(cxbr); |
3107 | e023e832 | Alexander Graf | break;
|
3108 | e023e832 | Alexander Graf | case 0x4a: /* AXBR R1,R2 [RRE] */ |
3109 | e023e832 | Alexander Graf | FP_HELPER_CC(axbr); |
3110 | e023e832 | Alexander Graf | break;
|
3111 | e023e832 | Alexander Graf | case 0x4b: /* SXBR R1,R2 [RRE] */ |
3112 | e023e832 | Alexander Graf | FP_HELPER_CC(sxbr); |
3113 | e023e832 | Alexander Graf | break;
|
3114 | e023e832 | Alexander Graf | case 0x4c: /* MXBR R1,R2 [RRE] */ |
3115 | e023e832 | Alexander Graf | FP_HELPER(mxbr); |
3116 | e023e832 | Alexander Graf | break;
|
3117 | e023e832 | Alexander Graf | case 0x4d: /* DXBR R1,R2 [RRE] */ |
3118 | e023e832 | Alexander Graf | FP_HELPER(dxbr); |
3119 | e023e832 | Alexander Graf | break;
|
3120 | e023e832 | Alexander Graf | case 0x65: /* LXR R1,R2 [RRE] */ |
3121 | e023e832 | Alexander Graf | tmp = load_freg(r2); |
3122 | e023e832 | Alexander Graf | store_freg(r1, tmp); |
3123 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
3124 | e023e832 | Alexander Graf | tmp = load_freg(r2 + 2);
|
3125 | e023e832 | Alexander Graf | store_freg(r1 + 2, tmp);
|
3126 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
3127 | e023e832 | Alexander Graf | break;
|
3128 | e023e832 | Alexander Graf | case 0x74: /* LZER R1 [RRE] */ |
3129 | e023e832 | Alexander Graf | tmp32_1 = tcg_const_i32(r1); |
3130 | e023e832 | Alexander Graf | gen_helper_lzer(tmp32_1); |
3131 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
3132 | e023e832 | Alexander Graf | break;
|
3133 | e023e832 | Alexander Graf | case 0x75: /* LZDR R1 [RRE] */ |
3134 | e023e832 | Alexander Graf | tmp32_1 = tcg_const_i32(r1); |
3135 | e023e832 | Alexander Graf | gen_helper_lzdr(tmp32_1); |
3136 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
3137 | e023e832 | Alexander Graf | break;
|
3138 | e023e832 | Alexander Graf | case 0x76: /* LZXR R1 [RRE] */ |
3139 | e023e832 | Alexander Graf | tmp32_1 = tcg_const_i32(r1); |
3140 | e023e832 | Alexander Graf | gen_helper_lzxr(tmp32_1); |
3141 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
3142 | e023e832 | Alexander Graf | break;
|
3143 | e023e832 | Alexander Graf | case 0x84: /* SFPC R1 [RRE] */ |
3144 | e023e832 | Alexander Graf | tmp32_1 = load_reg32(r1); |
3145 | e023e832 | Alexander Graf | tcg_gen_st_i32(tmp32_1, cpu_env, offsetof(CPUState, fpc)); |
3146 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
3147 | e023e832 | Alexander Graf | break;
|
3148 | e023e832 | Alexander Graf | case 0x8c: /* EFPC R1 [RRE] */ |
3149 | e023e832 | Alexander Graf | tmp32_1 = tcg_temp_new_i32(); |
3150 | e023e832 | Alexander Graf | tcg_gen_ld_i32(tmp32_1, cpu_env, offsetof(CPUState, fpc)); |
3151 | e023e832 | Alexander Graf | store_reg32(r1, tmp32_1); |
3152 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
3153 | e023e832 | Alexander Graf | break;
|
3154 | e023e832 | Alexander Graf | case 0x94: /* CEFBR R1,R2 [RRE] */ |
3155 | e023e832 | Alexander Graf | case 0x95: /* CDFBR R1,R2 [RRE] */ |
3156 | e023e832 | Alexander Graf | case 0x96: /* CXFBR R1,R2 [RRE] */ |
3157 | e023e832 | Alexander Graf | tmp32_1 = tcg_const_i32(r1); |
3158 | e023e832 | Alexander Graf | tmp32_2 = load_reg32(r2); |
3159 | e023e832 | Alexander Graf | switch (op) {
|
3160 | e023e832 | Alexander Graf | case 0x94: |
3161 | e023e832 | Alexander Graf | gen_helper_cefbr(tmp32_1, tmp32_2); |
3162 | e023e832 | Alexander Graf | break;
|
3163 | e023e832 | Alexander Graf | case 0x95: |
3164 | e023e832 | Alexander Graf | gen_helper_cdfbr(tmp32_1, tmp32_2); |
3165 | e023e832 | Alexander Graf | break;
|
3166 | e023e832 | Alexander Graf | case 0x96: |
3167 | e023e832 | Alexander Graf | gen_helper_cxfbr(tmp32_1, tmp32_2); |
3168 | e023e832 | Alexander Graf | break;
|
3169 | e023e832 | Alexander Graf | default:
|
3170 | e023e832 | Alexander Graf | tcg_abort(); |
3171 | e023e832 | Alexander Graf | } |
3172 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
3173 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_2); |
3174 | e023e832 | Alexander Graf | break;
|
3175 | e023e832 | Alexander Graf | case 0x98: /* CFEBR R1,R2 [RRE] */ |
3176 | e023e832 | Alexander Graf | case 0x99: /* CFDBR R1,R2 [RRE] */ |
3177 | e023e832 | Alexander Graf | case 0x9a: /* CFXBR R1,R2 [RRE] */ |
3178 | e023e832 | Alexander Graf | tmp32_1 = tcg_const_i32(r1); |
3179 | e023e832 | Alexander Graf | tmp32_2 = tcg_const_i32(r2); |
3180 | e023e832 | Alexander Graf | tmp32_3 = tcg_const_i32(m3); |
3181 | e023e832 | Alexander Graf | switch (op) {
|
3182 | e023e832 | Alexander Graf | case 0x98: |
3183 | e023e832 | Alexander Graf | gen_helper_cfebr(cc_op, tmp32_1, tmp32_2, tmp32_3); |
3184 | e023e832 | Alexander Graf | break;
|
3185 | e023e832 | Alexander Graf | case 0x99: |
3186 | e023e832 | Alexander Graf | gen_helper_cfdbr(cc_op, tmp32_1, tmp32_2, tmp32_3); |
3187 | e023e832 | Alexander Graf | break;
|
3188 | e023e832 | Alexander Graf | case 0x9a: |
3189 | e023e832 | Alexander Graf | gen_helper_cfxbr(cc_op, tmp32_1, tmp32_2, tmp32_3); |
3190 | e023e832 | Alexander Graf | break;
|
3191 | e023e832 | Alexander Graf | default:
|
3192 | e023e832 | Alexander Graf | tcg_abort(); |
3193 | e023e832 | Alexander Graf | } |
3194 | e023e832 | Alexander Graf | set_cc_static(s); |
3195 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
3196 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_2); |
3197 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_3); |
3198 | e023e832 | Alexander Graf | break;
|
3199 | e023e832 | Alexander Graf | case 0xa4: /* CEGBR R1,R2 [RRE] */ |
3200 | e023e832 | Alexander Graf | case 0xa5: /* CDGBR R1,R2 [RRE] */ |
3201 | e023e832 | Alexander Graf | tmp32_1 = tcg_const_i32(r1); |
3202 | e023e832 | Alexander Graf | tmp = load_reg(r2); |
3203 | e023e832 | Alexander Graf | switch (op) {
|
3204 | e023e832 | Alexander Graf | case 0xa4: |
3205 | e023e832 | Alexander Graf | gen_helper_cegbr(tmp32_1, tmp); |
3206 | e023e832 | Alexander Graf | break;
|
3207 | e023e832 | Alexander Graf | case 0xa5: |
3208 | e023e832 | Alexander Graf | gen_helper_cdgbr(tmp32_1, tmp); |
3209 | e023e832 | Alexander Graf | break;
|
3210 | e023e832 | Alexander Graf | default:
|
3211 | e023e832 | Alexander Graf | tcg_abort(); |
3212 | e023e832 | Alexander Graf | } |
3213 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
3214 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
3215 | e023e832 | Alexander Graf | break;
|
3216 | e023e832 | Alexander Graf | case 0xa6: /* CXGBR R1,R2 [RRE] */ |
3217 | e023e832 | Alexander Graf | tmp32_1 = tcg_const_i32(r1); |
3218 | e023e832 | Alexander Graf | tmp = load_reg(r2); |
3219 | e023e832 | Alexander Graf | gen_helper_cxgbr(tmp32_1, tmp); |
3220 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
3221 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
3222 | e023e832 | Alexander Graf | break;
|
3223 | e023e832 | Alexander Graf | case 0xa8: /* CGEBR R1,R2 [RRE] */ |
3224 | e023e832 | Alexander Graf | tmp32_1 = tcg_const_i32(r1); |
3225 | e023e832 | Alexander Graf | tmp32_2 = tcg_const_i32(r2); |
3226 | e023e832 | Alexander Graf | tmp32_3 = tcg_const_i32(m3); |
3227 | e023e832 | Alexander Graf | gen_helper_cgebr(cc_op, tmp32_1, tmp32_2, tmp32_3); |
3228 | e023e832 | Alexander Graf | set_cc_static(s); |
3229 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
3230 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_2); |
3231 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_3); |
3232 | e023e832 | Alexander Graf | break;
|
3233 | e023e832 | Alexander Graf | case 0xa9: /* CGDBR R1,R2 [RRE] */ |
3234 | e023e832 | Alexander Graf | tmp32_1 = tcg_const_i32(r1); |
3235 | e023e832 | Alexander Graf | tmp32_2 = tcg_const_i32(r2); |
3236 | e023e832 | Alexander Graf | tmp32_3 = tcg_const_i32(m3); |
3237 | e023e832 | Alexander Graf | gen_helper_cgdbr(cc_op, tmp32_1, tmp32_2, tmp32_3); |
3238 | e023e832 | Alexander Graf | set_cc_static(s); |
3239 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
3240 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_2); |
3241 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_3); |
3242 | e023e832 | Alexander Graf | break;
|
3243 | e023e832 | Alexander Graf | case 0xaa: /* CGXBR R1,R2 [RRE] */ |
3244 | e023e832 | Alexander Graf | tmp32_1 = tcg_const_i32(r1); |
3245 | e023e832 | Alexander Graf | tmp32_2 = tcg_const_i32(r2); |
3246 | e023e832 | Alexander Graf | tmp32_3 = tcg_const_i32(m3); |
3247 | e023e832 | Alexander Graf | gen_helper_cgxbr(cc_op, tmp32_1, tmp32_2, tmp32_3); |
3248 | e023e832 | Alexander Graf | set_cc_static(s); |
3249 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
3250 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_2); |
3251 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_3); |
3252 | e023e832 | Alexander Graf | break;
|
3253 | e023e832 | Alexander Graf | default:
|
3254 | e023e832 | Alexander Graf | LOG_DISAS("illegal b3 operation 0x%x\n", op);
|
3255 | e023e832 | Alexander Graf | gen_illegal_opcode(s, 2);
|
3256 | e023e832 | Alexander Graf | break;
|
3257 | e023e832 | Alexander Graf | } |
3258 | e023e832 | Alexander Graf | |
3259 | e023e832 | Alexander Graf | #undef FP_HELPER_CC
|
3260 | e023e832 | Alexander Graf | #undef FP_HELPER
|
3261 | e023e832 | Alexander Graf | } |
3262 | e023e832 | Alexander Graf | |
3263 | e023e832 | Alexander Graf | static void disas_b9(DisasContext *s, int op, int r1, int r2) |
3264 | e023e832 | Alexander Graf | { |
3265 | e023e832 | Alexander Graf | TCGv_i64 tmp, tmp2, tmp3; |
3266 | e023e832 | Alexander Graf | TCGv_i32 tmp32_1, tmp32_2, tmp32_3; |
3267 | e023e832 | Alexander Graf | |
3268 | e023e832 | Alexander Graf | LOG_DISAS("disas_b9: op 0x%x r1 %d r2 %d\n", op, r1, r2);
|
3269 | e023e832 | Alexander Graf | switch (op) {
|
3270 | e023e832 | Alexander Graf | case 0x0: /* LPGR R1,R2 [RRE] */ |
3271 | e023e832 | Alexander Graf | case 0x1: /* LNGR R1,R2 [RRE] */ |
3272 | e023e832 | Alexander Graf | case 0x2: /* LTGR R1,R2 [RRE] */ |
3273 | e023e832 | Alexander Graf | case 0x3: /* LCGR R1,R2 [RRE] */ |
3274 | e023e832 | Alexander Graf | case 0x10: /* LPGFR R1,R2 [RRE] */ |
3275 | e023e832 | Alexander Graf | case 0x11: /* LNFGR R1,R2 [RRE] */ |
3276 | e023e832 | Alexander Graf | case 0x12: /* LTGFR R1,R2 [RRE] */ |
3277 | e023e832 | Alexander Graf | case 0x13: /* LCGFR R1,R2 [RRE] */ |
3278 | e023e832 | Alexander Graf | if (op & 0x10) { |
3279 | e023e832 | Alexander Graf | tmp = load_reg32_i64(r2); |
3280 | e023e832 | Alexander Graf | } else {
|
3281 | e023e832 | Alexander Graf | tmp = load_reg(r2); |
3282 | e023e832 | Alexander Graf | } |
3283 | e023e832 | Alexander Graf | switch (op & 0xf) { |
3284 | e023e832 | Alexander Graf | case 0x0: /* LP?GR */ |
3285 | e023e832 | Alexander Graf | set_cc_abs64(s, tmp); |
3286 | e023e832 | Alexander Graf | gen_helper_abs_i64(tmp, tmp); |
3287 | e023e832 | Alexander Graf | store_reg(r1, tmp); |
3288 | e023e832 | Alexander Graf | break;
|
3289 | e023e832 | Alexander Graf | case 0x1: /* LN?GR */ |
3290 | e023e832 | Alexander Graf | set_cc_nabs64(s, tmp); |
3291 | e023e832 | Alexander Graf | gen_helper_nabs_i64(tmp, tmp); |
3292 | e023e832 | Alexander Graf | store_reg(r1, tmp); |
3293 | e023e832 | Alexander Graf | break;
|
3294 | e023e832 | Alexander Graf | case 0x2: /* LT?GR */ |
3295 | e023e832 | Alexander Graf | if (r1 != r2) {
|
3296 | e023e832 | Alexander Graf | store_reg(r1, tmp); |
3297 | e023e832 | Alexander Graf | } |
3298 | e023e832 | Alexander Graf | set_cc_s64(s, tmp); |
3299 | e023e832 | Alexander Graf | break;
|
3300 | e023e832 | Alexander Graf | case 0x3: /* LC?GR */ |
3301 | e023e832 | Alexander Graf | tcg_gen_neg_i64(regs[r1], tmp); |
3302 | e023e832 | Alexander Graf | set_cc_comp64(s, regs[r1]); |
3303 | e023e832 | Alexander Graf | break;
|
3304 | e023e832 | Alexander Graf | } |
3305 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
3306 | e023e832 | Alexander Graf | break;
|
3307 | e023e832 | Alexander Graf | case 0x4: /* LGR R1,R2 [RRE] */ |
3308 | e023e832 | Alexander Graf | store_reg(r1, regs[r2]); |
3309 | e023e832 | Alexander Graf | break;
|
3310 | e023e832 | Alexander Graf | case 0x6: /* LGBR R1,R2 [RRE] */ |
3311 | e023e832 | Alexander Graf | tmp2 = load_reg(r2); |
3312 | e023e832 | Alexander Graf | tcg_gen_ext8s_i64(tmp2, tmp2); |
3313 | e023e832 | Alexander Graf | store_reg(r1, tmp2); |
3314 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
3315 | e023e832 | Alexander Graf | break;
|
3316 | e023e832 | Alexander Graf | case 0x8: /* AGR R1,R2 [RRE] */ |
3317 | e023e832 | Alexander Graf | case 0xa: /* ALGR R1,R2 [RRE] */ |
3318 | e023e832 | Alexander Graf | tmp = load_reg(r1); |
3319 | e023e832 | Alexander Graf | tmp2 = load_reg(r2); |
3320 | e023e832 | Alexander Graf | tmp3 = tcg_temp_new_i64(); |
3321 | e023e832 | Alexander Graf | tcg_gen_add_i64(tmp3, tmp, tmp2); |
3322 | e023e832 | Alexander Graf | store_reg(r1, tmp3); |
3323 | e023e832 | Alexander Graf | switch (op) {
|
3324 | e023e832 | Alexander Graf | case 0x8: |
3325 | e023e832 | Alexander Graf | set_cc_add64(s, tmp, tmp2, tmp3); |
3326 | e023e832 | Alexander Graf | break;
|
3327 | e023e832 | Alexander Graf | case 0xa: |
3328 | e023e832 | Alexander Graf | set_cc_addu64(s, tmp, tmp2, tmp3); |
3329 | e023e832 | Alexander Graf | break;
|
3330 | e023e832 | Alexander Graf | default:
|
3331 | e023e832 | Alexander Graf | tcg_abort(); |
3332 | e023e832 | Alexander Graf | } |
3333 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
3334 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
3335 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp3); |
3336 | e023e832 | Alexander Graf | break;
|
3337 | e023e832 | Alexander Graf | case 0x9: /* SGR R1,R2 [RRE] */ |
3338 | e023e832 | Alexander Graf | case 0xb: /* SLGR R1,R2 [RRE] */ |
3339 | e023e832 | Alexander Graf | case 0x1b: /* SLGFR R1,R2 [RRE] */ |
3340 | e023e832 | Alexander Graf | case 0x19: /* SGFR R1,R2 [RRE] */ |
3341 | e023e832 | Alexander Graf | tmp = load_reg(r1); |
3342 | e023e832 | Alexander Graf | switch (op) {
|
3343 | e023e832 | Alexander Graf | case 0x1b: |
3344 | e023e832 | Alexander Graf | tmp32_1 = load_reg32(r2); |
3345 | e023e832 | Alexander Graf | tmp2 = tcg_temp_new_i64(); |
3346 | e023e832 | Alexander Graf | tcg_gen_extu_i32_i64(tmp2, tmp32_1); |
3347 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
3348 | e023e832 | Alexander Graf | break;
|
3349 | e023e832 | Alexander Graf | case 0x19: |
3350 | e023e832 | Alexander Graf | tmp32_1 = load_reg32(r2); |
3351 | e023e832 | Alexander Graf | tmp2 = tcg_temp_new_i64(); |
3352 | e023e832 | Alexander Graf | tcg_gen_ext_i32_i64(tmp2, tmp32_1); |
3353 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
3354 | e023e832 | Alexander Graf | break;
|
3355 | e023e832 | Alexander Graf | default:
|
3356 | e023e832 | Alexander Graf | tmp2 = load_reg(r2); |
3357 | e023e832 | Alexander Graf | break;
|
3358 | e023e832 | Alexander Graf | } |
3359 | e023e832 | Alexander Graf | tmp3 = tcg_temp_new_i64(); |
3360 | e023e832 | Alexander Graf | tcg_gen_sub_i64(tmp3, tmp, tmp2); |
3361 | e023e832 | Alexander Graf | store_reg(r1, tmp3); |
3362 | e023e832 | Alexander Graf | switch (op) {
|
3363 | e023e832 | Alexander Graf | case 0x9: |
3364 | e023e832 | Alexander Graf | case 0x19: |
3365 | e023e832 | Alexander Graf | set_cc_sub64(s, tmp, tmp2, tmp3); |
3366 | e023e832 | Alexander Graf | break;
|
3367 | e023e832 | Alexander Graf | case 0xb: |
3368 | e023e832 | Alexander Graf | case 0x1b: |
3369 | e023e832 | Alexander Graf | set_cc_subu64(s, tmp, tmp2, tmp3); |
3370 | e023e832 | Alexander Graf | break;
|
3371 | e023e832 | Alexander Graf | default:
|
3372 | e023e832 | Alexander Graf | tcg_abort(); |
3373 | e023e832 | Alexander Graf | } |
3374 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
3375 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
3376 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp3); |
3377 | e023e832 | Alexander Graf | break;
|
3378 | e023e832 | Alexander Graf | case 0xc: /* MSGR R1,R2 [RRE] */ |
3379 | e023e832 | Alexander Graf | case 0x1c: /* MSGFR R1,R2 [RRE] */ |
3380 | e023e832 | Alexander Graf | tmp = load_reg(r1); |
3381 | e023e832 | Alexander Graf | tmp2 = load_reg(r2); |
3382 | e023e832 | Alexander Graf | if (op == 0x1c) { |
3383 | e023e832 | Alexander Graf | tcg_gen_ext32s_i64(tmp2, tmp2); |
3384 | e023e832 | Alexander Graf | } |
3385 | e023e832 | Alexander Graf | tcg_gen_mul_i64(tmp, tmp, tmp2); |
3386 | e023e832 | Alexander Graf | store_reg(r1, tmp); |
3387 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
3388 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
3389 | e023e832 | Alexander Graf | break;
|
3390 | e023e832 | Alexander Graf | case 0xd: /* DSGR R1,R2 [RRE] */ |
3391 | e023e832 | Alexander Graf | case 0x1d: /* DSGFR R1,R2 [RRE] */ |
3392 | e023e832 | Alexander Graf | tmp = load_reg(r1 + 1);
|
3393 | e023e832 | Alexander Graf | if (op == 0xd) { |
3394 | e023e832 | Alexander Graf | tmp2 = load_reg(r2); |
3395 | e023e832 | Alexander Graf | } else {
|
3396 | e023e832 | Alexander Graf | tmp32_1 = load_reg32(r2); |
3397 | e023e832 | Alexander Graf | tmp2 = tcg_temp_new_i64(); |
3398 | e023e832 | Alexander Graf | tcg_gen_ext_i32_i64(tmp2, tmp32_1); |
3399 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
3400 | e023e832 | Alexander Graf | } |
3401 | e023e832 | Alexander Graf | tmp3 = tcg_temp_new_i64(); |
3402 | e023e832 | Alexander Graf | tcg_gen_div_i64(tmp3, tmp, tmp2); |
3403 | e023e832 | Alexander Graf | store_reg(r1 + 1, tmp3);
|
3404 | e023e832 | Alexander Graf | tcg_gen_rem_i64(tmp3, tmp, tmp2); |
3405 | e023e832 | Alexander Graf | store_reg(r1, tmp3); |
3406 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
3407 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
3408 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp3); |
3409 | e023e832 | Alexander Graf | break;
|
3410 | e023e832 | Alexander Graf | case 0x14: /* LGFR R1,R2 [RRE] */ |
3411 | e023e832 | Alexander Graf | tmp32_1 = load_reg32(r2); |
3412 | e023e832 | Alexander Graf | tmp = tcg_temp_new_i64(); |
3413 | e023e832 | Alexander Graf | tcg_gen_ext_i32_i64(tmp, tmp32_1); |
3414 | e023e832 | Alexander Graf | store_reg(r1, tmp); |
3415 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
3416 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
3417 | e023e832 | Alexander Graf | break;
|
3418 | e023e832 | Alexander Graf | case 0x16: /* LLGFR R1,R2 [RRE] */ |
3419 | e023e832 | Alexander Graf | tmp32_1 = load_reg32(r2); |
3420 | e023e832 | Alexander Graf | tmp = tcg_temp_new_i64(); |
3421 | e023e832 | Alexander Graf | tcg_gen_extu_i32_i64(tmp, tmp32_1); |
3422 | e023e832 | Alexander Graf | store_reg(r1, tmp); |
3423 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
3424 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
3425 | e023e832 | Alexander Graf | break;
|
3426 | e023e832 | Alexander Graf | case 0x17: /* LLGTR R1,R2 [RRE] */ |
3427 | e023e832 | Alexander Graf | tmp32_1 = load_reg32(r2); |
3428 | e023e832 | Alexander Graf | tmp = tcg_temp_new_i64(); |
3429 | e023e832 | Alexander Graf | tcg_gen_andi_i32(tmp32_1, tmp32_1, 0x7fffffffUL);
|
3430 | e023e832 | Alexander Graf | tcg_gen_extu_i32_i64(tmp, tmp32_1); |
3431 | e023e832 | Alexander Graf | store_reg(r1, tmp); |
3432 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
3433 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
3434 | e023e832 | Alexander Graf | break;
|
3435 | e023e832 | Alexander Graf | case 0x18: /* AGFR R1,R2 [RRE] */ |
3436 | e023e832 | Alexander Graf | case 0x1a: /* ALGFR R1,R2 [RRE] */ |
3437 | e023e832 | Alexander Graf | tmp32_1 = load_reg32(r2); |
3438 | e023e832 | Alexander Graf | tmp2 = tcg_temp_new_i64(); |
3439 | e023e832 | Alexander Graf | if (op == 0x18) { |
3440 | e023e832 | Alexander Graf | tcg_gen_ext_i32_i64(tmp2, tmp32_1); |
3441 | e023e832 | Alexander Graf | } else {
|
3442 | e023e832 | Alexander Graf | tcg_gen_extu_i32_i64(tmp2, tmp32_1); |
3443 | e023e832 | Alexander Graf | } |
3444 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
3445 | e023e832 | Alexander Graf | tmp = load_reg(r1); |
3446 | e023e832 | Alexander Graf | tmp3 = tcg_temp_new_i64(); |
3447 | e023e832 | Alexander Graf | tcg_gen_add_i64(tmp3, tmp, tmp2); |
3448 | e023e832 | Alexander Graf | store_reg(r1, tmp3); |
3449 | e023e832 | Alexander Graf | if (op == 0x18) { |
3450 | e023e832 | Alexander Graf | set_cc_add64(s, tmp, tmp2, tmp3); |
3451 | e023e832 | Alexander Graf | } else {
|
3452 | e023e832 | Alexander Graf | set_cc_addu64(s, tmp, tmp2, tmp3); |
3453 | e023e832 | Alexander Graf | } |
3454 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
3455 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
3456 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp3); |
3457 | e023e832 | Alexander Graf | break;
|
3458 | e023e832 | Alexander Graf | case 0x1f: /* LRVR R1,R2 [RRE] */ |
3459 | e023e832 | Alexander Graf | tmp32_1 = load_reg32(r2); |
3460 | e023e832 | Alexander Graf | tcg_gen_bswap32_i32(tmp32_1, tmp32_1); |
3461 | e023e832 | Alexander Graf | store_reg32(r1, tmp32_1); |
3462 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
3463 | e023e832 | Alexander Graf | break;
|
3464 | e023e832 | Alexander Graf | case 0x20: /* CGR R1,R2 [RRE] */ |
3465 | e023e832 | Alexander Graf | case 0x30: /* CGFR R1,R2 [RRE] */ |
3466 | e023e832 | Alexander Graf | tmp2 = load_reg(r2); |
3467 | e023e832 | Alexander Graf | if (op == 0x30) { |
3468 | e023e832 | Alexander Graf | tcg_gen_ext32s_i64(tmp2, tmp2); |
3469 | e023e832 | Alexander Graf | } |
3470 | e023e832 | Alexander Graf | tmp = load_reg(r1); |
3471 | e023e832 | Alexander Graf | cmp_s64(s, tmp, tmp2); |
3472 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
3473 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
3474 | e023e832 | Alexander Graf | break;
|
3475 | e023e832 | Alexander Graf | case 0x21: /* CLGR R1,R2 [RRE] */ |
3476 | e023e832 | Alexander Graf | case 0x31: /* CLGFR R1,R2 [RRE] */ |
3477 | e023e832 | Alexander Graf | tmp2 = load_reg(r2); |
3478 | e023e832 | Alexander Graf | if (op == 0x31) { |
3479 | e023e832 | Alexander Graf | tcg_gen_ext32u_i64(tmp2, tmp2); |
3480 | e023e832 | Alexander Graf | } |
3481 | e023e832 | Alexander Graf | tmp = load_reg(r1); |
3482 | e023e832 | Alexander Graf | cmp_u64(s, tmp, tmp2); |
3483 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
3484 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
3485 | e023e832 | Alexander Graf | break;
|
3486 | e023e832 | Alexander Graf | case 0x26: /* LBR R1,R2 [RRE] */ |
3487 | e023e832 | Alexander Graf | tmp32_1 = load_reg32(r2); |
3488 | e023e832 | Alexander Graf | tcg_gen_ext8s_i32(tmp32_1, tmp32_1); |
3489 | e023e832 | Alexander Graf | store_reg32(r1, tmp32_1); |
3490 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
3491 | e023e832 | Alexander Graf | break;
|
3492 | e023e832 | Alexander Graf | case 0x27: /* LHR R1,R2 [RRE] */ |
3493 | e023e832 | Alexander Graf | tmp32_1 = load_reg32(r2); |
3494 | e023e832 | Alexander Graf | tcg_gen_ext16s_i32(tmp32_1, tmp32_1); |
3495 | e023e832 | Alexander Graf | store_reg32(r1, tmp32_1); |
3496 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
3497 | e023e832 | Alexander Graf | break;
|
3498 | e023e832 | Alexander Graf | case 0x80: /* NGR R1,R2 [RRE] */ |
3499 | e023e832 | Alexander Graf | case 0x81: /* OGR R1,R2 [RRE] */ |
3500 | e023e832 | Alexander Graf | case 0x82: /* XGR R1,R2 [RRE] */ |
3501 | e023e832 | Alexander Graf | tmp = load_reg(r1); |
3502 | e023e832 | Alexander Graf | tmp2 = load_reg(r2); |
3503 | e023e832 | Alexander Graf | switch (op) {
|
3504 | e023e832 | Alexander Graf | case 0x80: |
3505 | e023e832 | Alexander Graf | tcg_gen_and_i64(tmp, tmp, tmp2); |
3506 | e023e832 | Alexander Graf | break;
|
3507 | e023e832 | Alexander Graf | case 0x81: |
3508 | e023e832 | Alexander Graf | tcg_gen_or_i64(tmp, tmp, tmp2); |
3509 | e023e832 | Alexander Graf | break;
|
3510 | e023e832 | Alexander Graf | case 0x82: |
3511 | e023e832 | Alexander Graf | tcg_gen_xor_i64(tmp, tmp, tmp2); |
3512 | e023e832 | Alexander Graf | break;
|
3513 | e023e832 | Alexander Graf | default:
|
3514 | e023e832 | Alexander Graf | tcg_abort(); |
3515 | e023e832 | Alexander Graf | } |
3516 | e023e832 | Alexander Graf | store_reg(r1, tmp); |
3517 | e023e832 | Alexander Graf | set_cc_nz_u64(s, tmp); |
3518 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
3519 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
3520 | e023e832 | Alexander Graf | break;
|
3521 | e023e832 | Alexander Graf | case 0x83: /* FLOGR R1,R2 [RRE] */ |
3522 | e023e832 | Alexander Graf | tmp = load_reg(r2); |
3523 | e023e832 | Alexander Graf | tmp32_1 = tcg_const_i32(r1); |
3524 | e023e832 | Alexander Graf | gen_helper_flogr(cc_op, tmp32_1, tmp); |
3525 | e023e832 | Alexander Graf | set_cc_static(s); |
3526 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
3527 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
3528 | e023e832 | Alexander Graf | break;
|
3529 | e023e832 | Alexander Graf | case 0x84: /* LLGCR R1,R2 [RRE] */ |
3530 | e023e832 | Alexander Graf | tmp = load_reg(r2); |
3531 | e023e832 | Alexander Graf | tcg_gen_andi_i64(tmp, tmp, 0xff);
|
3532 | e023e832 | Alexander Graf | store_reg(r1, tmp); |
3533 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
3534 | e023e832 | Alexander Graf | break;
|
3535 | e023e832 | Alexander Graf | case 0x85: /* LLGHR R1,R2 [RRE] */ |
3536 | e023e832 | Alexander Graf | tmp = load_reg(r2); |
3537 | e023e832 | Alexander Graf | tcg_gen_andi_i64(tmp, tmp, 0xffff);
|
3538 | e023e832 | Alexander Graf | store_reg(r1, tmp); |
3539 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
3540 | e023e832 | Alexander Graf | break;
|
3541 | e023e832 | Alexander Graf | case 0x87: /* DLGR R1,R2 [RRE] */ |
3542 | e023e832 | Alexander Graf | tmp32_1 = tcg_const_i32(r1); |
3543 | e023e832 | Alexander Graf | tmp = load_reg(r2); |
3544 | e023e832 | Alexander Graf | gen_helper_dlg(tmp32_1, tmp); |
3545 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
3546 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
3547 | e023e832 | Alexander Graf | break;
|
3548 | e023e832 | Alexander Graf | case 0x88: /* ALCGR R1,R2 [RRE] */ |
3549 | e023e832 | Alexander Graf | tmp = load_reg(r1); |
3550 | e023e832 | Alexander Graf | tmp2 = load_reg(r2); |
3551 | e023e832 | Alexander Graf | tmp3 = tcg_temp_new_i64(); |
3552 | e023e832 | Alexander Graf | gen_op_calc_cc(s); |
3553 | e023e832 | Alexander Graf | tcg_gen_extu_i32_i64(tmp3, cc_op); |
3554 | e023e832 | Alexander Graf | tcg_gen_shri_i64(tmp3, tmp3, 1);
|
3555 | e023e832 | Alexander Graf | tcg_gen_andi_i64(tmp3, tmp3, 1);
|
3556 | e023e832 | Alexander Graf | tcg_gen_add_i64(tmp3, tmp2, tmp3); |
3557 | e023e832 | Alexander Graf | tcg_gen_add_i64(tmp3, tmp, tmp3); |
3558 | e023e832 | Alexander Graf | store_reg(r1, tmp3); |
3559 | e023e832 | Alexander Graf | set_cc_addu64(s, tmp, tmp2, tmp3); |
3560 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
3561 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
3562 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp3); |
3563 | e023e832 | Alexander Graf | break;
|
3564 | e023e832 | Alexander Graf | case 0x89: /* SLBGR R1,R2 [RRE] */ |
3565 | e023e832 | Alexander Graf | tmp = load_reg(r1); |
3566 | e023e832 | Alexander Graf | tmp2 = load_reg(r2); |
3567 | e023e832 | Alexander Graf | tmp32_1 = tcg_const_i32(r1); |
3568 | e023e832 | Alexander Graf | gen_op_calc_cc(s); |
3569 | e023e832 | Alexander Graf | gen_helper_slbg(cc_op, cc_op, tmp32_1, tmp, tmp2); |
3570 | e023e832 | Alexander Graf | set_cc_static(s); |
3571 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
3572 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
3573 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
3574 | e023e832 | Alexander Graf | break;
|
3575 | e023e832 | Alexander Graf | case 0x94: /* LLCR R1,R2 [RRE] */ |
3576 | e023e832 | Alexander Graf | tmp32_1 = load_reg32(r2); |
3577 | e023e832 | Alexander Graf | tcg_gen_andi_i32(tmp32_1, tmp32_1, 0xff);
|
3578 | e023e832 | Alexander Graf | store_reg32(r1, tmp32_1); |
3579 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
3580 | e023e832 | Alexander Graf | break;
|
3581 | e023e832 | Alexander Graf | case 0x95: /* LLHR R1,R2 [RRE] */ |
3582 | e023e832 | Alexander Graf | tmp32_1 = load_reg32(r2); |
3583 | e023e832 | Alexander Graf | tcg_gen_andi_i32(tmp32_1, tmp32_1, 0xffff);
|
3584 | e023e832 | Alexander Graf | store_reg32(r1, tmp32_1); |
3585 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
3586 | e023e832 | Alexander Graf | break;
|
3587 | e023e832 | Alexander Graf | case 0x96: /* MLR R1,R2 [RRE] */ |
3588 | e023e832 | Alexander Graf | /* reg(r1, r1+1) = reg(r1+1) * reg(r2) */
|
3589 | e023e832 | Alexander Graf | tmp2 = load_reg(r2); |
3590 | e023e832 | Alexander Graf | tmp3 = load_reg((r1 + 1) & 15); |
3591 | e023e832 | Alexander Graf | tcg_gen_ext32u_i64(tmp2, tmp2); |
3592 | e023e832 | Alexander Graf | tcg_gen_ext32u_i64(tmp3, tmp3); |
3593 | e023e832 | Alexander Graf | tcg_gen_mul_i64(tmp2, tmp2, tmp3); |
3594 | e023e832 | Alexander Graf | store_reg32_i64((r1 + 1) & 15, tmp2); |
3595 | e023e832 | Alexander Graf | tcg_gen_shri_i64(tmp2, tmp2, 32);
|
3596 | e023e832 | Alexander Graf | store_reg32_i64(r1, tmp2); |
3597 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
3598 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp3); |
3599 | e023e832 | Alexander Graf | break;
|
3600 | e023e832 | Alexander Graf | case 0x97: /* DLR R1,R2 [RRE] */ |
3601 | e023e832 | Alexander Graf | /* reg(r1) = reg(r1, r1+1) % reg(r2) */
|
3602 | e023e832 | Alexander Graf | /* reg(r1+1) = reg(r1, r1+1) / reg(r2) */
|
3603 | e023e832 | Alexander Graf | tmp = load_reg(r1); |
3604 | e023e832 | Alexander Graf | tmp2 = load_reg(r2); |
3605 | e023e832 | Alexander Graf | tmp3 = load_reg((r1 + 1) & 15); |
3606 | e023e832 | Alexander Graf | tcg_gen_ext32u_i64(tmp2, tmp2); |
3607 | e023e832 | Alexander Graf | tcg_gen_ext32u_i64(tmp3, tmp3); |
3608 | e023e832 | Alexander Graf | tcg_gen_shli_i64(tmp, tmp, 32);
|
3609 | e023e832 | Alexander Graf | tcg_gen_or_i64(tmp, tmp, tmp3); |
3610 | e023e832 | Alexander Graf | |
3611 | e023e832 | Alexander Graf | tcg_gen_rem_i64(tmp3, tmp, tmp2); |
3612 | e023e832 | Alexander Graf | tcg_gen_div_i64(tmp, tmp, tmp2); |
3613 | e023e832 | Alexander Graf | store_reg32_i64((r1 + 1) & 15, tmp); |
3614 | e023e832 | Alexander Graf | store_reg32_i64(r1, tmp3); |
3615 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
3616 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
3617 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp3); |
3618 | e023e832 | Alexander Graf | break;
|
3619 | e023e832 | Alexander Graf | case 0x98: /* ALCR R1,R2 [RRE] */ |
3620 | e023e832 | Alexander Graf | tmp32_1 = load_reg32(r1); |
3621 | e023e832 | Alexander Graf | tmp32_2 = load_reg32(r2); |
3622 | e023e832 | Alexander Graf | tmp32_3 = tcg_temp_new_i32(); |
3623 | e023e832 | Alexander Graf | /* XXX possible optimization point */
|
3624 | e023e832 | Alexander Graf | gen_op_calc_cc(s); |
3625 | e023e832 | Alexander Graf | gen_helper_addc_u32(tmp32_3, cc_op, tmp32_1, tmp32_2); |
3626 | e023e832 | Alexander Graf | set_cc_addu32(s, tmp32_1, tmp32_2, tmp32_3); |
3627 | e023e832 | Alexander Graf | store_reg32(r1, tmp32_3); |
3628 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
3629 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_2); |
3630 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_3); |
3631 | e023e832 | Alexander Graf | break;
|
3632 | e023e832 | Alexander Graf | case 0x99: /* SLBR R1,R2 [RRE] */ |
3633 | e023e832 | Alexander Graf | tmp32_1 = load_reg32(r2); |
3634 | e023e832 | Alexander Graf | tmp32_2 = tcg_const_i32(r1); |
3635 | e023e832 | Alexander Graf | gen_op_calc_cc(s); |
3636 | e023e832 | Alexander Graf | gen_helper_slb(cc_op, cc_op, tmp32_2, tmp32_1); |
3637 | e023e832 | Alexander Graf | set_cc_static(s); |
3638 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
3639 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_2); |
3640 | e023e832 | Alexander Graf | break;
|
3641 | e023e832 | Alexander Graf | default:
|
3642 | e023e832 | Alexander Graf | LOG_DISAS("illegal b9 operation 0x%x\n", op);
|
3643 | e023e832 | Alexander Graf | gen_illegal_opcode(s, 2);
|
3644 | e023e832 | Alexander Graf | break;
|
3645 | e023e832 | Alexander Graf | } |
3646 | e023e832 | Alexander Graf | } |
3647 | e023e832 | Alexander Graf | |
3648 | e023e832 | Alexander Graf | static void disas_c0(DisasContext *s, int op, int r1, int i2) |
3649 | e023e832 | Alexander Graf | { |
3650 | e023e832 | Alexander Graf | TCGv_i64 tmp; |
3651 | e023e832 | Alexander Graf | TCGv_i32 tmp32_1, tmp32_2; |
3652 | e023e832 | Alexander Graf | uint64_t target = s->pc + i2 * 2LL;
|
3653 | e023e832 | Alexander Graf | int l1;
|
3654 | e023e832 | Alexander Graf | |
3655 | e023e832 | Alexander Graf | LOG_DISAS("disas_c0: op 0x%x r1 %d i2 %d\n", op, r1, i2);
|
3656 | e023e832 | Alexander Graf | |
3657 | e023e832 | Alexander Graf | switch (op) {
|
3658 | e023e832 | Alexander Graf | case 0: /* larl r1, i2 */ |
3659 | e023e832 | Alexander Graf | tmp = tcg_const_i64(target); |
3660 | e023e832 | Alexander Graf | store_reg(r1, tmp); |
3661 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
3662 | e023e832 | Alexander Graf | break;
|
3663 | e023e832 | Alexander Graf | case 0x1: /* LGFI R1,I2 [RIL] */ |
3664 | e023e832 | Alexander Graf | tmp = tcg_const_i64((int64_t)i2); |
3665 | e023e832 | Alexander Graf | store_reg(r1, tmp); |
3666 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
3667 | e023e832 | Alexander Graf | break;
|
3668 | e023e832 | Alexander Graf | case 0x4: /* BRCL M1,I2 [RIL] */ |
3669 | e023e832 | Alexander Graf | /* m1 & (1 << (3 - cc)) */
|
3670 | e023e832 | Alexander Graf | tmp32_1 = tcg_const_i32(3);
|
3671 | e023e832 | Alexander Graf | tmp32_2 = tcg_const_i32(1);
|
3672 | e023e832 | Alexander Graf | gen_op_calc_cc(s); |
3673 | e023e832 | Alexander Graf | tcg_gen_sub_i32(tmp32_1, tmp32_1, cc_op); |
3674 | e023e832 | Alexander Graf | tcg_gen_shl_i32(tmp32_2, tmp32_2, tmp32_1); |
3675 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
3676 | e023e832 | Alexander Graf | tmp32_1 = tcg_const_i32(r1); /* m1 == r1 */
|
3677 | e023e832 | Alexander Graf | tcg_gen_and_i32(tmp32_1, tmp32_1, tmp32_2); |
3678 | e023e832 | Alexander Graf | l1 = gen_new_label(); |
3679 | e023e832 | Alexander Graf | tcg_gen_brcondi_i32(TCG_COND_EQ, tmp32_1, 0, l1);
|
3680 | e023e832 | Alexander Graf | gen_goto_tb(s, 0, target);
|
3681 | e023e832 | Alexander Graf | gen_set_label(l1); |
3682 | e023e832 | Alexander Graf | gen_goto_tb(s, 1, s->pc + 6); |
3683 | e023e832 | Alexander Graf | s->is_jmp = DISAS_TB_JUMP; |
3684 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
3685 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_2); |
3686 | e023e832 | Alexander Graf | break;
|
3687 | e023e832 | Alexander Graf | case 0x5: /* brasl r1, i2 */ |
3688 | e023e832 | Alexander Graf | tmp = tcg_const_i64(pc_to_link_info(s, s->pc + 6));
|
3689 | e023e832 | Alexander Graf | store_reg(r1, tmp); |
3690 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
3691 | e023e832 | Alexander Graf | gen_goto_tb(s, 0, target);
|
3692 | e023e832 | Alexander Graf | s->is_jmp = DISAS_TB_JUMP; |
3693 | e023e832 | Alexander Graf | break;
|
3694 | e023e832 | Alexander Graf | case 0x7: /* XILF R1,I2 [RIL] */ |
3695 | e023e832 | Alexander Graf | case 0xb: /* NILF R1,I2 [RIL] */ |
3696 | e023e832 | Alexander Graf | case 0xd: /* OILF R1,I2 [RIL] */ |
3697 | e023e832 | Alexander Graf | tmp32_1 = load_reg32(r1); |
3698 | e023e832 | Alexander Graf | switch (op) {
|
3699 | e023e832 | Alexander Graf | case 0x7: |
3700 | e023e832 | Alexander Graf | tcg_gen_xori_i32(tmp32_1, tmp32_1, (uint32_t)i2); |
3701 | e023e832 | Alexander Graf | break;
|
3702 | e023e832 | Alexander Graf | case 0xb: |
3703 | e023e832 | Alexander Graf | tcg_gen_andi_i32(tmp32_1, tmp32_1, (uint32_t)i2); |
3704 | e023e832 | Alexander Graf | break;
|
3705 | e023e832 | Alexander Graf | case 0xd: |
3706 | e023e832 | Alexander Graf | tcg_gen_ori_i32(tmp32_1, tmp32_1, (uint32_t)i2); |
3707 | e023e832 | Alexander Graf | break;
|
3708 | e023e832 | Alexander Graf | default:
|
3709 | e023e832 | Alexander Graf | tcg_abort(); |
3710 | e023e832 | Alexander Graf | } |
3711 | e023e832 | Alexander Graf | store_reg32(r1, tmp32_1); |
3712 | e023e832 | Alexander Graf | set_cc_nz_u32(s, tmp32_1); |
3713 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
3714 | e023e832 | Alexander Graf | break;
|
3715 | e023e832 | Alexander Graf | case 0x9: /* IILF R1,I2 [RIL] */ |
3716 | e023e832 | Alexander Graf | tmp32_1 = tcg_const_i32((uint32_t)i2); |
3717 | e023e832 | Alexander Graf | store_reg32(r1, tmp32_1); |
3718 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
3719 | e023e832 | Alexander Graf | break;
|
3720 | e023e832 | Alexander Graf | case 0xa: /* NIHF R1,I2 [RIL] */ |
3721 | e023e832 | Alexander Graf | tmp = load_reg(r1); |
3722 | e023e832 | Alexander Graf | tmp32_1 = tcg_temp_new_i32(); |
3723 | e023e832 | Alexander Graf | tcg_gen_andi_i64(tmp, tmp, (((uint64_t)((uint32_t)i2)) << 32)
|
3724 | e023e832 | Alexander Graf | | 0xffffffffULL);
|
3725 | e023e832 | Alexander Graf | store_reg(r1, tmp); |
3726 | e023e832 | Alexander Graf | tcg_gen_shri_i64(tmp, tmp, 32);
|
3727 | e023e832 | Alexander Graf | tcg_gen_trunc_i64_i32(tmp32_1, tmp); |
3728 | e023e832 | Alexander Graf | set_cc_nz_u32(s, tmp32_1); |
3729 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
3730 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
3731 | e023e832 | Alexander Graf | break;
|
3732 | e023e832 | Alexander Graf | case 0xe: /* LLIHF R1,I2 [RIL] */ |
3733 | e023e832 | Alexander Graf | tmp = tcg_const_i64(((uint64_t)(uint32_t)i2) << 32);
|
3734 | e023e832 | Alexander Graf | store_reg(r1, tmp); |
3735 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
3736 | e023e832 | Alexander Graf | break;
|
3737 | e023e832 | Alexander Graf | case 0xf: /* LLILF R1,I2 [RIL] */ |
3738 | e023e832 | Alexander Graf | tmp = tcg_const_i64((uint32_t)i2); |
3739 | e023e832 | Alexander Graf | store_reg(r1, tmp); |
3740 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
3741 | e023e832 | Alexander Graf | break;
|
3742 | e023e832 | Alexander Graf | default:
|
3743 | e023e832 | Alexander Graf | LOG_DISAS("illegal c0 operation 0x%x\n", op);
|
3744 | e023e832 | Alexander Graf | gen_illegal_opcode(s, 3);
|
3745 | e023e832 | Alexander Graf | break;
|
3746 | e023e832 | Alexander Graf | } |
3747 | e023e832 | Alexander Graf | } |
3748 | e023e832 | Alexander Graf | |
3749 | e023e832 | Alexander Graf | static void disas_c2(DisasContext *s, int op, int r1, int i2) |
3750 | e023e832 | Alexander Graf | { |
3751 | e023e832 | Alexander Graf | TCGv_i64 tmp, tmp2, tmp3; |
3752 | e023e832 | Alexander Graf | TCGv_i32 tmp32_1, tmp32_2, tmp32_3; |
3753 | e023e832 | Alexander Graf | |
3754 | e023e832 | Alexander Graf | switch (op) {
|
3755 | e023e832 | Alexander Graf | case 0x4: /* SLGFI R1,I2 [RIL] */ |
3756 | e023e832 | Alexander Graf | case 0xa: /* ALGFI R1,I2 [RIL] */ |
3757 | e023e832 | Alexander Graf | tmp = load_reg(r1); |
3758 | e023e832 | Alexander Graf | tmp2 = tcg_const_i64((uint64_t)(uint32_t)i2); |
3759 | e023e832 | Alexander Graf | tmp3 = tcg_temp_new_i64(); |
3760 | e023e832 | Alexander Graf | switch (op) {
|
3761 | e023e832 | Alexander Graf | case 0x4: |
3762 | e023e832 | Alexander Graf | tcg_gen_sub_i64(tmp3, tmp, tmp2); |
3763 | e023e832 | Alexander Graf | set_cc_subu64(s, tmp, tmp2, tmp3); |
3764 | e023e832 | Alexander Graf | break;
|
3765 | e023e832 | Alexander Graf | case 0xa: |
3766 | e023e832 | Alexander Graf | tcg_gen_add_i64(tmp3, tmp, tmp2); |
3767 | e023e832 | Alexander Graf | set_cc_addu64(s, tmp, tmp2, tmp3); |
3768 | e023e832 | Alexander Graf | break;
|
3769 | e023e832 | Alexander Graf | default:
|
3770 | e023e832 | Alexander Graf | tcg_abort(); |
3771 | e023e832 | Alexander Graf | } |
3772 | e023e832 | Alexander Graf | store_reg(r1, tmp3); |
3773 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
3774 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
3775 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp3); |
3776 | e023e832 | Alexander Graf | break;
|
3777 | e023e832 | Alexander Graf | case 0x5: /* SLFI R1,I2 [RIL] */ |
3778 | e023e832 | Alexander Graf | case 0xb: /* ALFI R1,I2 [RIL] */ |
3779 | e023e832 | Alexander Graf | tmp32_1 = load_reg32(r1); |
3780 | e023e832 | Alexander Graf | tmp32_2 = tcg_const_i32(i2); |
3781 | e023e832 | Alexander Graf | tmp32_3 = tcg_temp_new_i32(); |
3782 | e023e832 | Alexander Graf | switch (op) {
|
3783 | e023e832 | Alexander Graf | case 0x5: |
3784 | e023e832 | Alexander Graf | tcg_gen_sub_i32(tmp32_3, tmp32_1, tmp32_2); |
3785 | e023e832 | Alexander Graf | set_cc_subu32(s, tmp32_1, tmp32_2, tmp32_3); |
3786 | e023e832 | Alexander Graf | break;
|
3787 | e023e832 | Alexander Graf | case 0xb: |
3788 | e023e832 | Alexander Graf | tcg_gen_add_i32(tmp32_3, tmp32_1, tmp32_2); |
3789 | e023e832 | Alexander Graf | set_cc_addu32(s, tmp32_1, tmp32_2, tmp32_3); |
3790 | e023e832 | Alexander Graf | break;
|
3791 | e023e832 | Alexander Graf | default:
|
3792 | e023e832 | Alexander Graf | tcg_abort(); |
3793 | e023e832 | Alexander Graf | } |
3794 | e023e832 | Alexander Graf | store_reg32(r1, tmp32_3); |
3795 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
3796 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_2); |
3797 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_3); |
3798 | e023e832 | Alexander Graf | break;
|
3799 | e023e832 | Alexander Graf | case 0xc: /* CGFI R1,I2 [RIL] */ |
3800 | e023e832 | Alexander Graf | tmp = load_reg(r1); |
3801 | e023e832 | Alexander Graf | cmp_s64c(s, tmp, (int64_t)i2); |
3802 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
3803 | e023e832 | Alexander Graf | break;
|
3804 | e023e832 | Alexander Graf | case 0xe: /* CLGFI R1,I2 [RIL] */ |
3805 | e023e832 | Alexander Graf | tmp = load_reg(r1); |
3806 | e023e832 | Alexander Graf | cmp_u64c(s, tmp, (uint64_t)(uint32_t)i2); |
3807 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
3808 | e023e832 | Alexander Graf | break;
|
3809 | e023e832 | Alexander Graf | case 0xd: /* CFI R1,I2 [RIL] */ |
3810 | e023e832 | Alexander Graf | tmp32_1 = load_reg32(r1); |
3811 | e023e832 | Alexander Graf | cmp_s32c(s, tmp32_1, i2); |
3812 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
3813 | e023e832 | Alexander Graf | break;
|
3814 | e023e832 | Alexander Graf | case 0xf: /* CLFI R1,I2 [RIL] */ |
3815 | e023e832 | Alexander Graf | tmp32_1 = load_reg32(r1); |
3816 | e023e832 | Alexander Graf | cmp_u32c(s, tmp32_1, i2); |
3817 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
3818 | e023e832 | Alexander Graf | break;
|
3819 | e023e832 | Alexander Graf | default:
|
3820 | e023e832 | Alexander Graf | LOG_DISAS("illegal c2 operation 0x%x\n", op);
|
3821 | e023e832 | Alexander Graf | gen_illegal_opcode(s, 3);
|
3822 | e023e832 | Alexander Graf | break;
|
3823 | e023e832 | Alexander Graf | } |
3824 | e023e832 | Alexander Graf | } |
3825 | e023e832 | Alexander Graf | |
3826 | e023e832 | Alexander Graf | static void gen_and_or_xor_i32(int opc, TCGv_i32 tmp, TCGv_i32 tmp2) |
3827 | e023e832 | Alexander Graf | { |
3828 | e023e832 | Alexander Graf | switch (opc & 0xf) { |
3829 | e023e832 | Alexander Graf | case 0x4: |
3830 | e023e832 | Alexander Graf | tcg_gen_and_i32(tmp, tmp, tmp2); |
3831 | e023e832 | Alexander Graf | break;
|
3832 | e023e832 | Alexander Graf | case 0x6: |
3833 | e023e832 | Alexander Graf | tcg_gen_or_i32(tmp, tmp, tmp2); |
3834 | e023e832 | Alexander Graf | break;
|
3835 | e023e832 | Alexander Graf | case 0x7: |
3836 | e023e832 | Alexander Graf | tcg_gen_xor_i32(tmp, tmp, tmp2); |
3837 | e023e832 | Alexander Graf | break;
|
3838 | e023e832 | Alexander Graf | default:
|
3839 | e023e832 | Alexander Graf | tcg_abort(); |
3840 | e023e832 | Alexander Graf | } |
3841 | e023e832 | Alexander Graf | } |
3842 | e023e832 | Alexander Graf | |
3843 | e023e832 | Alexander Graf | static void disas_s390_insn(DisasContext *s) |
3844 | e023e832 | Alexander Graf | { |
3845 | e023e832 | Alexander Graf | TCGv_i64 tmp, tmp2, tmp3, tmp4; |
3846 | e023e832 | Alexander Graf | TCGv_i32 tmp32_1, tmp32_2, tmp32_3, tmp32_4; |
3847 | e023e832 | Alexander Graf | unsigned char opc; |
3848 | e023e832 | Alexander Graf | uint64_t insn; |
3849 | e023e832 | Alexander Graf | int op, r1, r2, r3, d1, d2, x2, b1, b2, i, i2, r1b;
|
3850 | e023e832 | Alexander Graf | TCGv_i32 vl; |
3851 | e023e832 | Alexander Graf | int ilc;
|
3852 | e023e832 | Alexander Graf | int l1;
|
3853 | e023e832 | Alexander Graf | |
3854 | e023e832 | Alexander Graf | opc = ldub_code(s->pc); |
3855 | e023e832 | Alexander Graf | LOG_DISAS("opc 0x%x\n", opc);
|
3856 | e023e832 | Alexander Graf | |
3857 | e023e832 | Alexander Graf | ilc = get_ilc(opc); |
3858 | e023e832 | Alexander Graf | |
3859 | e023e832 | Alexander Graf | switch (opc) {
|
3860 | e023e832 | Alexander Graf | #ifndef CONFIG_USER_ONLY
|
3861 | e023e832 | Alexander Graf | case 0x01: /* SAM */ |
3862 | e023e832 | Alexander Graf | insn = ld_code2(s->pc); |
3863 | e023e832 | Alexander Graf | /* set addressing mode, but we only do 64bit anyways */
|
3864 | e023e832 | Alexander Graf | break;
|
3865 | e023e832 | Alexander Graf | #endif
|
3866 | e023e832 | Alexander Graf | case 0x6: /* BCTR R1,R2 [RR] */ |
3867 | e023e832 | Alexander Graf | insn = ld_code2(s->pc); |
3868 | e023e832 | Alexander Graf | decode_rr(s, insn, &r1, &r2); |
3869 | e023e832 | Alexander Graf | tmp32_1 = load_reg32(r1); |
3870 | e023e832 | Alexander Graf | tcg_gen_subi_i32(tmp32_1, tmp32_1, 1);
|
3871 | e023e832 | Alexander Graf | store_reg32(r1, tmp32_1); |
3872 | e023e832 | Alexander Graf | |
3873 | e023e832 | Alexander Graf | if (r2) {
|
3874 | e023e832 | Alexander Graf | gen_update_cc_op(s); |
3875 | e023e832 | Alexander Graf | l1 = gen_new_label(); |
3876 | e023e832 | Alexander Graf | tcg_gen_brcondi_i32(TCG_COND_NE, tmp32_1, 0, l1);
|
3877 | e023e832 | Alexander Graf | |
3878 | e023e832 | Alexander Graf | /* not taking the branch, jump to after the instruction */
|
3879 | e023e832 | Alexander Graf | gen_goto_tb(s, 0, s->pc + 2); |
3880 | e023e832 | Alexander Graf | gen_set_label(l1); |
3881 | e023e832 | Alexander Graf | |
3882 | e023e832 | Alexander Graf | /* take the branch, move R2 into psw.addr */
|
3883 | e023e832 | Alexander Graf | tmp32_1 = load_reg32(r2); |
3884 | e023e832 | Alexander Graf | tmp = tcg_temp_new_i64(); |
3885 | e023e832 | Alexander Graf | tcg_gen_extu_i32_i64(tmp, tmp32_1); |
3886 | e023e832 | Alexander Graf | tcg_gen_mov_i64(psw_addr, tmp); |
3887 | e023e832 | Alexander Graf | s->is_jmp = DISAS_JUMP; |
3888 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
3889 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
3890 | e023e832 | Alexander Graf | } |
3891 | e023e832 | Alexander Graf | break;
|
3892 | e023e832 | Alexander Graf | case 0x7: /* BCR M1,R2 [RR] */ |
3893 | e023e832 | Alexander Graf | insn = ld_code2(s->pc); |
3894 | e023e832 | Alexander Graf | decode_rr(s, insn, &r1, &r2); |
3895 | e023e832 | Alexander Graf | if (r2) {
|
3896 | e023e832 | Alexander Graf | tmp = load_reg(r2); |
3897 | e023e832 | Alexander Graf | gen_bcr(s, r1, tmp, s->pc); |
3898 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
3899 | e023e832 | Alexander Graf | s->is_jmp = DISAS_TB_JUMP; |
3900 | e023e832 | Alexander Graf | } else {
|
3901 | e023e832 | Alexander Graf | /* XXX: "serialization and checkpoint-synchronization function"? */
|
3902 | e023e832 | Alexander Graf | } |
3903 | e023e832 | Alexander Graf | break;
|
3904 | e023e832 | Alexander Graf | case 0xa: /* SVC I [RR] */ |
3905 | e023e832 | Alexander Graf | insn = ld_code2(s->pc); |
3906 | e023e832 | Alexander Graf | debug_insn(insn); |
3907 | e023e832 | Alexander Graf | i = insn & 0xff;
|
3908 | e023e832 | Alexander Graf | update_psw_addr(s); |
3909 | e023e832 | Alexander Graf | gen_op_calc_cc(s); |
3910 | e023e832 | Alexander Graf | tmp32_1 = tcg_const_i32(i); |
3911 | e023e832 | Alexander Graf | tmp32_2 = tcg_const_i32(ilc * 2);
|
3912 | e023e832 | Alexander Graf | tmp32_3 = tcg_const_i32(EXCP_SVC); |
3913 | e023e832 | Alexander Graf | tcg_gen_st_i32(tmp32_1, cpu_env, offsetof(CPUState, int_svc_code)); |
3914 | e023e832 | Alexander Graf | tcg_gen_st_i32(tmp32_2, cpu_env, offsetof(CPUState, int_svc_ilc)); |
3915 | e023e832 | Alexander Graf | gen_helper_exception(tmp32_3); |
3916 | e023e832 | Alexander Graf | s->is_jmp = DISAS_EXCP; |
3917 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
3918 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_2); |
3919 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_3); |
3920 | e023e832 | Alexander Graf | break;
|
3921 | e023e832 | Alexander Graf | case 0xd: /* BASR R1,R2 [RR] */ |
3922 | e023e832 | Alexander Graf | insn = ld_code2(s->pc); |
3923 | e023e832 | Alexander Graf | decode_rr(s, insn, &r1, &r2); |
3924 | e023e832 | Alexander Graf | tmp = tcg_const_i64(pc_to_link_info(s, s->pc + 2));
|
3925 | e023e832 | Alexander Graf | store_reg(r1, tmp); |
3926 | e023e832 | Alexander Graf | if (r2) {
|
3927 | e023e832 | Alexander Graf | tmp2 = load_reg(r2); |
3928 | e023e832 | Alexander Graf | tcg_gen_mov_i64(psw_addr, tmp2); |
3929 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
3930 | e023e832 | Alexander Graf | s->is_jmp = DISAS_JUMP; |
3931 | e023e832 | Alexander Graf | } |
3932 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
3933 | e023e832 | Alexander Graf | break;
|
3934 | e023e832 | Alexander Graf | case 0xe: /* MVCL R1,R2 [RR] */ |
3935 | e023e832 | Alexander Graf | insn = ld_code2(s->pc); |
3936 | e023e832 | Alexander Graf | decode_rr(s, insn, &r1, &r2); |
3937 | e023e832 | Alexander Graf | tmp32_1 = tcg_const_i32(r1); |
3938 | e023e832 | Alexander Graf | tmp32_2 = tcg_const_i32(r2); |
3939 | e023e832 | Alexander Graf | potential_page_fault(s); |
3940 | e023e832 | Alexander Graf | gen_helper_mvcl(cc_op, tmp32_1, tmp32_2); |
3941 | e023e832 | Alexander Graf | set_cc_static(s); |
3942 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
3943 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_2); |
3944 | e023e832 | Alexander Graf | break;
|
3945 | e023e832 | Alexander Graf | case 0x10: /* LPR R1,R2 [RR] */ |
3946 | e023e832 | Alexander Graf | insn = ld_code2(s->pc); |
3947 | e023e832 | Alexander Graf | decode_rr(s, insn, &r1, &r2); |
3948 | e023e832 | Alexander Graf | tmp32_1 = load_reg32(r2); |
3949 | e023e832 | Alexander Graf | set_cc_abs32(s, tmp32_1); |
3950 | e023e832 | Alexander Graf | gen_helper_abs_i32(tmp32_1, tmp32_1); |
3951 | e023e832 | Alexander Graf | store_reg32(r1, tmp32_1); |
3952 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
3953 | e023e832 | Alexander Graf | break;
|
3954 | e023e832 | Alexander Graf | case 0x11: /* LNR R1,R2 [RR] */ |
3955 | e023e832 | Alexander Graf | insn = ld_code2(s->pc); |
3956 | e023e832 | Alexander Graf | decode_rr(s, insn, &r1, &r2); |
3957 | e023e832 | Alexander Graf | tmp32_1 = load_reg32(r2); |
3958 | e023e832 | Alexander Graf | set_cc_nabs32(s, tmp32_1); |
3959 | e023e832 | Alexander Graf | gen_helper_nabs_i32(tmp32_1, tmp32_1); |
3960 | e023e832 | Alexander Graf | store_reg32(r1, tmp32_1); |
3961 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
3962 | e023e832 | Alexander Graf | break;
|
3963 | e023e832 | Alexander Graf | case 0x12: /* LTR R1,R2 [RR] */ |
3964 | e023e832 | Alexander Graf | insn = ld_code2(s->pc); |
3965 | e023e832 | Alexander Graf | decode_rr(s, insn, &r1, &r2); |
3966 | e023e832 | Alexander Graf | tmp32_1 = load_reg32(r2); |
3967 | e023e832 | Alexander Graf | if (r1 != r2) {
|
3968 | e023e832 | Alexander Graf | store_reg32(r1, tmp32_1); |
3969 | e023e832 | Alexander Graf | } |
3970 | e023e832 | Alexander Graf | set_cc_s32(s, tmp32_1); |
3971 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
3972 | e023e832 | Alexander Graf | break;
|
3973 | e023e832 | Alexander Graf | case 0x13: /* LCR R1,R2 [RR] */ |
3974 | e023e832 | Alexander Graf | insn = ld_code2(s->pc); |
3975 | e023e832 | Alexander Graf | decode_rr(s, insn, &r1, &r2); |
3976 | e023e832 | Alexander Graf | tmp32_1 = load_reg32(r2); |
3977 | e023e832 | Alexander Graf | tcg_gen_neg_i32(tmp32_1, tmp32_1); |
3978 | e023e832 | Alexander Graf | store_reg32(r1, tmp32_1); |
3979 | e023e832 | Alexander Graf | set_cc_comp32(s, tmp32_1); |
3980 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
3981 | e023e832 | Alexander Graf | break;
|
3982 | e023e832 | Alexander Graf | case 0x14: /* NR R1,R2 [RR] */ |
3983 | e023e832 | Alexander Graf | case 0x16: /* OR R1,R2 [RR] */ |
3984 | e023e832 | Alexander Graf | case 0x17: /* XR R1,R2 [RR] */ |
3985 | e023e832 | Alexander Graf | insn = ld_code2(s->pc); |
3986 | e023e832 | Alexander Graf | decode_rr(s, insn, &r1, &r2); |
3987 | e023e832 | Alexander Graf | tmp32_2 = load_reg32(r2); |
3988 | e023e832 | Alexander Graf | tmp32_1 = load_reg32(r1); |
3989 | e023e832 | Alexander Graf | gen_and_or_xor_i32(opc, tmp32_1, tmp32_2); |
3990 | e023e832 | Alexander Graf | store_reg32(r1, tmp32_1); |
3991 | e023e832 | Alexander Graf | set_cc_nz_u32(s, tmp32_1); |
3992 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
3993 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_2); |
3994 | e023e832 | Alexander Graf | break;
|
3995 | e023e832 | Alexander Graf | case 0x18: /* LR R1,R2 [RR] */ |
3996 | e023e832 | Alexander Graf | insn = ld_code2(s->pc); |
3997 | e023e832 | Alexander Graf | decode_rr(s, insn, &r1, &r2); |
3998 | e023e832 | Alexander Graf | tmp32_1 = load_reg32(r2); |
3999 | e023e832 | Alexander Graf | store_reg32(r1, tmp32_1); |
4000 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
4001 | e023e832 | Alexander Graf | break;
|
4002 | e023e832 | Alexander Graf | case 0x15: /* CLR R1,R2 [RR] */ |
4003 | e023e832 | Alexander Graf | case 0x19: /* CR R1,R2 [RR] */ |
4004 | e023e832 | Alexander Graf | insn = ld_code2(s->pc); |
4005 | e023e832 | Alexander Graf | decode_rr(s, insn, &r1, &r2); |
4006 | e023e832 | Alexander Graf | tmp32_1 = load_reg32(r1); |
4007 | e023e832 | Alexander Graf | tmp32_2 = load_reg32(r2); |
4008 | e023e832 | Alexander Graf | if (opc == 0x15) { |
4009 | e023e832 | Alexander Graf | cmp_u32(s, tmp32_1, tmp32_2); |
4010 | e023e832 | Alexander Graf | } else {
|
4011 | e023e832 | Alexander Graf | cmp_s32(s, tmp32_1, tmp32_2); |
4012 | e023e832 | Alexander Graf | } |
4013 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
4014 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_2); |
4015 | e023e832 | Alexander Graf | break;
|
4016 | e023e832 | Alexander Graf | case 0x1a: /* AR R1,R2 [RR] */ |
4017 | e023e832 | Alexander Graf | case 0x1e: /* ALR R1,R2 [RR] */ |
4018 | e023e832 | Alexander Graf | insn = ld_code2(s->pc); |
4019 | e023e832 | Alexander Graf | decode_rr(s, insn, &r1, &r2); |
4020 | e023e832 | Alexander Graf | tmp32_1 = load_reg32(r1); |
4021 | e023e832 | Alexander Graf | tmp32_2 = load_reg32(r2); |
4022 | e023e832 | Alexander Graf | tmp32_3 = tcg_temp_new_i32(); |
4023 | e023e832 | Alexander Graf | tcg_gen_add_i32(tmp32_3, tmp32_1, tmp32_2); |
4024 | e023e832 | Alexander Graf | store_reg32(r1, tmp32_3); |
4025 | e023e832 | Alexander Graf | if (opc == 0x1a) { |
4026 | e023e832 | Alexander Graf | set_cc_add32(s, tmp32_1, tmp32_2, tmp32_3); |
4027 | e023e832 | Alexander Graf | } else {
|
4028 | e023e832 | Alexander Graf | set_cc_addu32(s, tmp32_1, tmp32_2, tmp32_3); |
4029 | e023e832 | Alexander Graf | } |
4030 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
4031 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_2); |
4032 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_3); |
4033 | e023e832 | Alexander Graf | break;
|
4034 | e023e832 | Alexander Graf | case 0x1b: /* SR R1,R2 [RR] */ |
4035 | e023e832 | Alexander Graf | case 0x1f: /* SLR R1,R2 [RR] */ |
4036 | e023e832 | Alexander Graf | insn = ld_code2(s->pc); |
4037 | e023e832 | Alexander Graf | decode_rr(s, insn, &r1, &r2); |
4038 | e023e832 | Alexander Graf | tmp32_1 = load_reg32(r1); |
4039 | e023e832 | Alexander Graf | tmp32_2 = load_reg32(r2); |
4040 | e023e832 | Alexander Graf | tmp32_3 = tcg_temp_new_i32(); |
4041 | e023e832 | Alexander Graf | tcg_gen_sub_i32(tmp32_3, tmp32_1, tmp32_2); |
4042 | e023e832 | Alexander Graf | store_reg32(r1, tmp32_3); |
4043 | e023e832 | Alexander Graf | if (opc == 0x1b) { |
4044 | e023e832 | Alexander Graf | set_cc_sub32(s, tmp32_1, tmp32_2, tmp32_3); |
4045 | e023e832 | Alexander Graf | } else {
|
4046 | e023e832 | Alexander Graf | set_cc_subu32(s, tmp32_1, tmp32_2, tmp32_3); |
4047 | e023e832 | Alexander Graf | } |
4048 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
4049 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_2); |
4050 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_3); |
4051 | e023e832 | Alexander Graf | break;
|
4052 | e023e832 | Alexander Graf | case 0x1c: /* MR R1,R2 [RR] */ |
4053 | e023e832 | Alexander Graf | /* reg(r1, r1+1) = reg(r1+1) * reg(r2) */
|
4054 | e023e832 | Alexander Graf | insn = ld_code2(s->pc); |
4055 | e023e832 | Alexander Graf | decode_rr(s, insn, &r1, &r2); |
4056 | e023e832 | Alexander Graf | tmp2 = load_reg(r2); |
4057 | e023e832 | Alexander Graf | tmp3 = load_reg((r1 + 1) & 15); |
4058 | e023e832 | Alexander Graf | tcg_gen_ext32s_i64(tmp2, tmp2); |
4059 | e023e832 | Alexander Graf | tcg_gen_ext32s_i64(tmp3, tmp3); |
4060 | e023e832 | Alexander Graf | tcg_gen_mul_i64(tmp2, tmp2, tmp3); |
4061 | e023e832 | Alexander Graf | store_reg32_i64((r1 + 1) & 15, tmp2); |
4062 | e023e832 | Alexander Graf | tcg_gen_shri_i64(tmp2, tmp2, 32);
|
4063 | e023e832 | Alexander Graf | store_reg32_i64(r1, tmp2); |
4064 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
4065 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp3); |
4066 | e023e832 | Alexander Graf | break;
|
4067 | e023e832 | Alexander Graf | case 0x1d: /* DR R1,R2 [RR] */ |
4068 | e023e832 | Alexander Graf | insn = ld_code2(s->pc); |
4069 | e023e832 | Alexander Graf | decode_rr(s, insn, &r1, &r2); |
4070 | e023e832 | Alexander Graf | tmp32_1 = load_reg32(r1); |
4071 | e023e832 | Alexander Graf | tmp32_2 = load_reg32(r1 + 1);
|
4072 | e023e832 | Alexander Graf | tmp32_3 = load_reg32(r2); |
4073 | e023e832 | Alexander Graf | |
4074 | e023e832 | Alexander Graf | tmp = tcg_temp_new_i64(); /* dividend */
|
4075 | e023e832 | Alexander Graf | tmp2 = tcg_temp_new_i64(); /* divisor */
|
4076 | e023e832 | Alexander Graf | tmp3 = tcg_temp_new_i64(); |
4077 | e023e832 | Alexander Graf | |
4078 | e023e832 | Alexander Graf | /* dividend is r(r1 << 32) | r(r1 + 1) */
|
4079 | e023e832 | Alexander Graf | tcg_gen_extu_i32_i64(tmp, tmp32_1); |
4080 | e023e832 | Alexander Graf | tcg_gen_extu_i32_i64(tmp2, tmp32_2); |
4081 | e023e832 | Alexander Graf | tcg_gen_shli_i64(tmp, tmp, 32);
|
4082 | e023e832 | Alexander Graf | tcg_gen_or_i64(tmp, tmp, tmp2); |
4083 | e023e832 | Alexander Graf | |
4084 | e023e832 | Alexander Graf | /* divisor is r(r2) */
|
4085 | e023e832 | Alexander Graf | tcg_gen_ext_i32_i64(tmp2, tmp32_3); |
4086 | e023e832 | Alexander Graf | |
4087 | e023e832 | Alexander Graf | tcg_gen_div_i64(tmp3, tmp, tmp2); |
4088 | e023e832 | Alexander Graf | tcg_gen_rem_i64(tmp, tmp, tmp2); |
4089 | e023e832 | Alexander Graf | |
4090 | e023e832 | Alexander Graf | tcg_gen_trunc_i64_i32(tmp32_1, tmp); |
4091 | e023e832 | Alexander Graf | tcg_gen_trunc_i64_i32(tmp32_2, tmp3); |
4092 | e023e832 | Alexander Graf | |
4093 | e023e832 | Alexander Graf | store_reg32(r1, tmp32_1); /* remainder */
|
4094 | e023e832 | Alexander Graf | store_reg32(r1 + 1, tmp32_2); /* quotient */ |
4095 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
4096 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_2); |
4097 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_3); |
4098 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
4099 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
4100 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp3); |
4101 | e023e832 | Alexander Graf | break;
|
4102 | e023e832 | Alexander Graf | case 0x28: /* LDR R1,R2 [RR] */ |
4103 | e023e832 | Alexander Graf | insn = ld_code2(s->pc); |
4104 | e023e832 | Alexander Graf | decode_rr(s, insn, &r1, &r2); |
4105 | e023e832 | Alexander Graf | tmp = load_freg(r2); |
4106 | e023e832 | Alexander Graf | store_freg(r1, tmp); |
4107 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
4108 | e023e832 | Alexander Graf | break;
|
4109 | e023e832 | Alexander Graf | case 0x38: /* LER R1,R2 [RR] */ |
4110 | e023e832 | Alexander Graf | insn = ld_code2(s->pc); |
4111 | e023e832 | Alexander Graf | decode_rr(s, insn, &r1, &r2); |
4112 | e023e832 | Alexander Graf | tmp32_1 = load_freg32(r2); |
4113 | e023e832 | Alexander Graf | store_freg32(r1, tmp32_1); |
4114 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
4115 | e023e832 | Alexander Graf | break;
|
4116 | e023e832 | Alexander Graf | case 0x40: /* STH R1,D2(X2,B2) [RX] */ |
4117 | e023e832 | Alexander Graf | insn = ld_code4(s->pc); |
4118 | e023e832 | Alexander Graf | tmp = decode_rx(s, insn, &r1, &x2, &b2, &d2); |
4119 | e023e832 | Alexander Graf | tmp2 = load_reg(r1); |
4120 | e023e832 | Alexander Graf | tcg_gen_qemu_st16(tmp2, tmp, get_mem_index(s)); |
4121 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
4122 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
4123 | e023e832 | Alexander Graf | break;
|
4124 | e023e832 | Alexander Graf | case 0x41: /* la */ |
4125 | e023e832 | Alexander Graf | insn = ld_code4(s->pc); |
4126 | e023e832 | Alexander Graf | tmp = decode_rx(s, insn, &r1, &x2, &b2, &d2); |
4127 | e023e832 | Alexander Graf | store_reg(r1, tmp); /* FIXME: 31/24-bit addressing */
|
4128 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
4129 | e023e832 | Alexander Graf | break;
|
4130 | e023e832 | Alexander Graf | case 0x42: /* STC R1,D2(X2,B2) [RX] */ |
4131 | e023e832 | Alexander Graf | insn = ld_code4(s->pc); |
4132 | e023e832 | Alexander Graf | tmp = decode_rx(s, insn, &r1, &x2, &b2, &d2); |
4133 | e023e832 | Alexander Graf | tmp2 = load_reg(r1); |
4134 | e023e832 | Alexander Graf | tcg_gen_qemu_st8(tmp2, tmp, get_mem_index(s)); |
4135 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
4136 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
4137 | e023e832 | Alexander Graf | break;
|
4138 | e023e832 | Alexander Graf | case 0x43: /* IC R1,D2(X2,B2) [RX] */ |
4139 | e023e832 | Alexander Graf | insn = ld_code4(s->pc); |
4140 | e023e832 | Alexander Graf | tmp = decode_rx(s, insn, &r1, &x2, &b2, &d2); |
4141 | e023e832 | Alexander Graf | tmp2 = tcg_temp_new_i64(); |
4142 | e023e832 | Alexander Graf | tcg_gen_qemu_ld8u(tmp2, tmp, get_mem_index(s)); |
4143 | e023e832 | Alexander Graf | store_reg8(r1, tmp2); |
4144 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
4145 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
4146 | e023e832 | Alexander Graf | break;
|
4147 | e023e832 | Alexander Graf | case 0x44: /* EX R1,D2(X2,B2) [RX] */ |
4148 | e023e832 | Alexander Graf | insn = ld_code4(s->pc); |
4149 | e023e832 | Alexander Graf | tmp = decode_rx(s, insn, &r1, &x2, &b2, &d2); |
4150 | e023e832 | Alexander Graf | tmp2 = load_reg(r1); |
4151 | e023e832 | Alexander Graf | tmp3 = tcg_const_i64(s->pc + 4);
|
4152 | e023e832 | Alexander Graf | update_psw_addr(s); |
4153 | e023e832 | Alexander Graf | gen_op_calc_cc(s); |
4154 | e023e832 | Alexander Graf | gen_helper_ex(cc_op, cc_op, tmp2, tmp, tmp3); |
4155 | e023e832 | Alexander Graf | set_cc_static(s); |
4156 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
4157 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
4158 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp3); |
4159 | e023e832 | Alexander Graf | break;
|
4160 | e023e832 | Alexander Graf | case 0x46: /* BCT R1,D2(X2,B2) [RX] */ |
4161 | e023e832 | Alexander Graf | insn = ld_code4(s->pc); |
4162 | e023e832 | Alexander Graf | tmp = decode_rx(s, insn, &r1, &x2, &b2, &d2); |
4163 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
4164 | e023e832 | Alexander Graf | |
4165 | e023e832 | Alexander Graf | tmp32_1 = load_reg32(r1); |
4166 | e023e832 | Alexander Graf | tcg_gen_subi_i32(tmp32_1, tmp32_1, 1);
|
4167 | e023e832 | Alexander Graf | store_reg32(r1, tmp32_1); |
4168 | e023e832 | Alexander Graf | |
4169 | e023e832 | Alexander Graf | gen_update_cc_op(s); |
4170 | e023e832 | Alexander Graf | l1 = gen_new_label(); |
4171 | e023e832 | Alexander Graf | tcg_gen_brcondi_i32(TCG_COND_NE, tmp32_1, 0, l1);
|
4172 | e023e832 | Alexander Graf | |
4173 | e023e832 | Alexander Graf | /* not taking the branch, jump to after the instruction */
|
4174 | e023e832 | Alexander Graf | gen_goto_tb(s, 0, s->pc + 4); |
4175 | e023e832 | Alexander Graf | gen_set_label(l1); |
4176 | e023e832 | Alexander Graf | |
4177 | e023e832 | Alexander Graf | /* take the branch, move R2 into psw.addr */
|
4178 | e023e832 | Alexander Graf | tmp = decode_rx(s, insn, &r1, &x2, &b2, &d2); |
4179 | e023e832 | Alexander Graf | tcg_gen_mov_i64(psw_addr, tmp); |
4180 | e023e832 | Alexander Graf | s->is_jmp = DISAS_JUMP; |
4181 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
4182 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
4183 | e023e832 | Alexander Graf | break;
|
4184 | e023e832 | Alexander Graf | case 0x47: /* BC M1,D2(X2,B2) [RX] */ |
4185 | e023e832 | Alexander Graf | insn = ld_code4(s->pc); |
4186 | e023e832 | Alexander Graf | tmp = decode_rx(s, insn, &r1, &x2, &b2, &d2); |
4187 | e023e832 | Alexander Graf | gen_bcr(s, r1, tmp, s->pc + 4);
|
4188 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
4189 | e023e832 | Alexander Graf | s->is_jmp = DISAS_TB_JUMP; |
4190 | e023e832 | Alexander Graf | break;
|
4191 | e023e832 | Alexander Graf | case 0x48: /* LH R1,D2(X2,B2) [RX] */ |
4192 | e023e832 | Alexander Graf | insn = ld_code4(s->pc); |
4193 | e023e832 | Alexander Graf | tmp = decode_rx(s, insn, &r1, &x2, &b2, &d2); |
4194 | e023e832 | Alexander Graf | tmp2 = tcg_temp_new_i64(); |
4195 | e023e832 | Alexander Graf | tcg_gen_qemu_ld16s(tmp2, tmp, get_mem_index(s)); |
4196 | e023e832 | Alexander Graf | store_reg32_i64(r1, tmp2); |
4197 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
4198 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
4199 | e023e832 | Alexander Graf | break;
|
4200 | e023e832 | Alexander Graf | case 0x49: /* CH R1,D2(X2,B2) [RX] */ |
4201 | e023e832 | Alexander Graf | insn = ld_code4(s->pc); |
4202 | e023e832 | Alexander Graf | tmp = decode_rx(s, insn, &r1, &x2, &b2, &d2); |
4203 | e023e832 | Alexander Graf | tmp32_1 = load_reg32(r1); |
4204 | e023e832 | Alexander Graf | tmp32_2 = tcg_temp_new_i32(); |
4205 | e023e832 | Alexander Graf | tmp2 = tcg_temp_new_i64(); |
4206 | e023e832 | Alexander Graf | tcg_gen_qemu_ld16s(tmp2, tmp, get_mem_index(s)); |
4207 | e023e832 | Alexander Graf | tcg_gen_trunc_i64_i32(tmp32_2, tmp2); |
4208 | e023e832 | Alexander Graf | cmp_s32(s, tmp32_1, tmp32_2); |
4209 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
4210 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_2); |
4211 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
4212 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
4213 | e023e832 | Alexander Graf | break;
|
4214 | e023e832 | Alexander Graf | case 0x4a: /* AH R1,D2(X2,B2) [RX] */ |
4215 | e023e832 | Alexander Graf | case 0x4b: /* SH R1,D2(X2,B2) [RX] */ |
4216 | e023e832 | Alexander Graf | case 0x4c: /* MH R1,D2(X2,B2) [RX] */ |
4217 | e023e832 | Alexander Graf | insn = ld_code4(s->pc); |
4218 | e023e832 | Alexander Graf | tmp = decode_rx(s, insn, &r1, &x2, &b2, &d2); |
4219 | e023e832 | Alexander Graf | tmp2 = tcg_temp_new_i64(); |
4220 | e023e832 | Alexander Graf | tmp32_1 = load_reg32(r1); |
4221 | e023e832 | Alexander Graf | tmp32_2 = tcg_temp_new_i32(); |
4222 | e023e832 | Alexander Graf | tmp32_3 = tcg_temp_new_i32(); |
4223 | e023e832 | Alexander Graf | |
4224 | e023e832 | Alexander Graf | tcg_gen_qemu_ld16s(tmp2, tmp, get_mem_index(s)); |
4225 | e023e832 | Alexander Graf | tcg_gen_trunc_i64_i32(tmp32_2, tmp2); |
4226 | e023e832 | Alexander Graf | switch (opc) {
|
4227 | e023e832 | Alexander Graf | case 0x4a: |
4228 | e023e832 | Alexander Graf | tcg_gen_add_i32(tmp32_3, tmp32_1, tmp32_2); |
4229 | e023e832 | Alexander Graf | set_cc_add32(s, tmp32_1, tmp32_2, tmp32_3); |
4230 | e023e832 | Alexander Graf | break;
|
4231 | e023e832 | Alexander Graf | case 0x4b: |
4232 | e023e832 | Alexander Graf | tcg_gen_sub_i32(tmp32_3, tmp32_1, tmp32_2); |
4233 | e023e832 | Alexander Graf | set_cc_sub32(s, tmp32_1, tmp32_2, tmp32_3); |
4234 | e023e832 | Alexander Graf | break;
|
4235 | e023e832 | Alexander Graf | case 0x4c: |
4236 | e023e832 | Alexander Graf | tcg_gen_mul_i32(tmp32_3, tmp32_1, tmp32_2); |
4237 | e023e832 | Alexander Graf | break;
|
4238 | e023e832 | Alexander Graf | default:
|
4239 | e023e832 | Alexander Graf | tcg_abort(); |
4240 | e023e832 | Alexander Graf | } |
4241 | e023e832 | Alexander Graf | store_reg32(r1, tmp32_3); |
4242 | e023e832 | Alexander Graf | |
4243 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
4244 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_2); |
4245 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_3); |
4246 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
4247 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
4248 | e023e832 | Alexander Graf | break;
|
4249 | e023e832 | Alexander Graf | case 0x4d: /* BAS R1,D2(X2,B2) [RX] */ |
4250 | e023e832 | Alexander Graf | insn = ld_code4(s->pc); |
4251 | e023e832 | Alexander Graf | tmp = decode_rx(s, insn, &r1, &x2, &b2, &d2); |
4252 | e023e832 | Alexander Graf | tmp2 = tcg_const_i64(pc_to_link_info(s, s->pc + 4));
|
4253 | e023e832 | Alexander Graf | store_reg(r1, tmp2); |
4254 | e023e832 | Alexander Graf | tcg_gen_mov_i64(psw_addr, tmp); |
4255 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
4256 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
4257 | e023e832 | Alexander Graf | s->is_jmp = DISAS_JUMP; |
4258 | e023e832 | Alexander Graf | break;
|
4259 | e023e832 | Alexander Graf | case 0x4e: /* CVD R1,D2(X2,B2) [RX] */ |
4260 | e023e832 | Alexander Graf | insn = ld_code4(s->pc); |
4261 | e023e832 | Alexander Graf | tmp = decode_rx(s, insn, &r1, &x2, &b2, &d2); |
4262 | e023e832 | Alexander Graf | tmp2 = tcg_temp_new_i64(); |
4263 | e023e832 | Alexander Graf | tmp32_1 = tcg_temp_new_i32(); |
4264 | e023e832 | Alexander Graf | tcg_gen_trunc_i64_i32(tmp32_1, regs[r1]); |
4265 | e023e832 | Alexander Graf | gen_helper_cvd(tmp2, tmp32_1); |
4266 | e023e832 | Alexander Graf | tcg_gen_qemu_st64(tmp2, tmp, get_mem_index(s)); |
4267 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
4268 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
4269 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
4270 | e023e832 | Alexander Graf | break;
|
4271 | e023e832 | Alexander Graf | case 0x50: /* st r1, d2(x2, b2) */ |
4272 | e023e832 | Alexander Graf | insn = ld_code4(s->pc); |
4273 | e023e832 | Alexander Graf | tmp = decode_rx(s, insn, &r1, &x2, &b2, &d2); |
4274 | e023e832 | Alexander Graf | tmp2 = load_reg(r1); |
4275 | e023e832 | Alexander Graf | tcg_gen_qemu_st32(tmp2, tmp, get_mem_index(s)); |
4276 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
4277 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
4278 | e023e832 | Alexander Graf | break;
|
4279 | e023e832 | Alexander Graf | case 0x55: /* CL R1,D2(X2,B2) [RX] */ |
4280 | e023e832 | Alexander Graf | insn = ld_code4(s->pc); |
4281 | e023e832 | Alexander Graf | tmp = decode_rx(s, insn, &r1, &x2, &b2, &d2); |
4282 | e023e832 | Alexander Graf | tmp2 = tcg_temp_new_i64(); |
4283 | e023e832 | Alexander Graf | tmp32_1 = tcg_temp_new_i32(); |
4284 | e023e832 | Alexander Graf | tmp32_2 = load_reg32(r1); |
4285 | e023e832 | Alexander Graf | tcg_gen_qemu_ld32u(tmp2, tmp, get_mem_index(s)); |
4286 | e023e832 | Alexander Graf | tcg_gen_trunc_i64_i32(tmp32_1, tmp2); |
4287 | e023e832 | Alexander Graf | cmp_u32(s, tmp32_2, tmp32_1); |
4288 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
4289 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
4290 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
4291 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_2); |
4292 | e023e832 | Alexander Graf | break;
|
4293 | e023e832 | Alexander Graf | case 0x54: /* N R1,D2(X2,B2) [RX] */ |
4294 | e023e832 | Alexander Graf | case 0x56: /* O R1,D2(X2,B2) [RX] */ |
4295 | e023e832 | Alexander Graf | case 0x57: /* X R1,D2(X2,B2) [RX] */ |
4296 | e023e832 | Alexander Graf | insn = ld_code4(s->pc); |
4297 | e023e832 | Alexander Graf | tmp = decode_rx(s, insn, &r1, &x2, &b2, &d2); |
4298 | e023e832 | Alexander Graf | tmp2 = tcg_temp_new_i64(); |
4299 | e023e832 | Alexander Graf | tmp32_1 = load_reg32(r1); |
4300 | e023e832 | Alexander Graf | tmp32_2 = tcg_temp_new_i32(); |
4301 | e023e832 | Alexander Graf | tcg_gen_qemu_ld32u(tmp2, tmp, get_mem_index(s)); |
4302 | e023e832 | Alexander Graf | tcg_gen_trunc_i64_i32(tmp32_2, tmp2); |
4303 | e023e832 | Alexander Graf | gen_and_or_xor_i32(opc, tmp32_1, tmp32_2); |
4304 | e023e832 | Alexander Graf | store_reg32(r1, tmp32_1); |
4305 | e023e832 | Alexander Graf | set_cc_nz_u32(s, tmp32_1); |
4306 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
4307 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
4308 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
4309 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_2); |
4310 | e023e832 | Alexander Graf | break;
|
4311 | e023e832 | Alexander Graf | case 0x58: /* l r1, d2(x2, b2) */ |
4312 | e023e832 | Alexander Graf | insn = ld_code4(s->pc); |
4313 | e023e832 | Alexander Graf | tmp = decode_rx(s, insn, &r1, &x2, &b2, &d2); |
4314 | e023e832 | Alexander Graf | tmp2 = tcg_temp_new_i64(); |
4315 | e023e832 | Alexander Graf | tmp32_1 = tcg_temp_new_i32(); |
4316 | e023e832 | Alexander Graf | tcg_gen_qemu_ld32u(tmp2, tmp, get_mem_index(s)); |
4317 | e023e832 | Alexander Graf | tcg_gen_trunc_i64_i32(tmp32_1, tmp2); |
4318 | e023e832 | Alexander Graf | store_reg32(r1, tmp32_1); |
4319 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
4320 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
4321 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
4322 | e023e832 | Alexander Graf | break;
|
4323 | e023e832 | Alexander Graf | case 0x59: /* C R1,D2(X2,B2) [RX] */ |
4324 | e023e832 | Alexander Graf | insn = ld_code4(s->pc); |
4325 | e023e832 | Alexander Graf | tmp = decode_rx(s, insn, &r1, &x2, &b2, &d2); |
4326 | e023e832 | Alexander Graf | tmp2 = tcg_temp_new_i64(); |
4327 | e023e832 | Alexander Graf | tmp32_1 = tcg_temp_new_i32(); |
4328 | e023e832 | Alexander Graf | tmp32_2 = load_reg32(r1); |
4329 | e023e832 | Alexander Graf | tcg_gen_qemu_ld32s(tmp2, tmp, get_mem_index(s)); |
4330 | e023e832 | Alexander Graf | tcg_gen_trunc_i64_i32(tmp32_1, tmp2); |
4331 | e023e832 | Alexander Graf | cmp_s32(s, tmp32_2, tmp32_1); |
4332 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
4333 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
4334 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
4335 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_2); |
4336 | e023e832 | Alexander Graf | break;
|
4337 | e023e832 | Alexander Graf | case 0x5a: /* A R1,D2(X2,B2) [RX] */ |
4338 | e023e832 | Alexander Graf | case 0x5b: /* S R1,D2(X2,B2) [RX] */ |
4339 | e023e832 | Alexander Graf | case 0x5e: /* AL R1,D2(X2,B2) [RX] */ |
4340 | e023e832 | Alexander Graf | case 0x5f: /* SL R1,D2(X2,B2) [RX] */ |
4341 | e023e832 | Alexander Graf | insn = ld_code4(s->pc); |
4342 | e023e832 | Alexander Graf | tmp = decode_rx(s, insn, &r1, &x2, &b2, &d2); |
4343 | e023e832 | Alexander Graf | tmp32_1 = load_reg32(r1); |
4344 | e023e832 | Alexander Graf | tmp32_2 = tcg_temp_new_i32(); |
4345 | e023e832 | Alexander Graf | tmp32_3 = tcg_temp_new_i32(); |
4346 | e023e832 | Alexander Graf | tcg_gen_qemu_ld32s(tmp, tmp, get_mem_index(s)); |
4347 | e023e832 | Alexander Graf | tcg_gen_trunc_i64_i32(tmp32_2, tmp); |
4348 | e023e832 | Alexander Graf | switch (opc) {
|
4349 | e023e832 | Alexander Graf | case 0x5a: |
4350 | e023e832 | Alexander Graf | case 0x5e: |
4351 | e023e832 | Alexander Graf | tcg_gen_add_i32(tmp32_3, tmp32_1, tmp32_2); |
4352 | e023e832 | Alexander Graf | break;
|
4353 | e023e832 | Alexander Graf | case 0x5b: |
4354 | e023e832 | Alexander Graf | case 0x5f: |
4355 | e023e832 | Alexander Graf | tcg_gen_sub_i32(tmp32_3, tmp32_1, tmp32_2); |
4356 | e023e832 | Alexander Graf | break;
|
4357 | e023e832 | Alexander Graf | default:
|
4358 | e023e832 | Alexander Graf | tcg_abort(); |
4359 | e023e832 | Alexander Graf | } |
4360 | e023e832 | Alexander Graf | store_reg32(r1, tmp32_3); |
4361 | e023e832 | Alexander Graf | switch (opc) {
|
4362 | e023e832 | Alexander Graf | case 0x5a: |
4363 | e023e832 | Alexander Graf | set_cc_add32(s, tmp32_1, tmp32_2, tmp32_3); |
4364 | e023e832 | Alexander Graf | break;
|
4365 | e023e832 | Alexander Graf | case 0x5e: |
4366 | e023e832 | Alexander Graf | set_cc_addu32(s, tmp32_1, tmp32_2, tmp32_3); |
4367 | e023e832 | Alexander Graf | break;
|
4368 | e023e832 | Alexander Graf | case 0x5b: |
4369 | e023e832 | Alexander Graf | set_cc_sub32(s, tmp32_1, tmp32_2, tmp32_3); |
4370 | e023e832 | Alexander Graf | break;
|
4371 | e023e832 | Alexander Graf | case 0x5f: |
4372 | e023e832 | Alexander Graf | set_cc_subu32(s, tmp32_1, tmp32_2, tmp32_3); |
4373 | e023e832 | Alexander Graf | break;
|
4374 | e023e832 | Alexander Graf | default:
|
4375 | e023e832 | Alexander Graf | tcg_abort(); |
4376 | e023e832 | Alexander Graf | } |
4377 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
4378 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
4379 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_2); |
4380 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_3); |
4381 | e023e832 | Alexander Graf | break;
|
4382 | e023e832 | Alexander Graf | case 0x5c: /* M R1,D2(X2,B2) [RX] */ |
4383 | e023e832 | Alexander Graf | /* reg(r1, r1+1) = reg(r1+1) * *(s32*)addr */
|
4384 | e023e832 | Alexander Graf | insn = ld_code4(s->pc); |
4385 | e023e832 | Alexander Graf | tmp = decode_rx(s, insn, &r1, &x2, &b2, &d2); |
4386 | e023e832 | Alexander Graf | tmp2 = tcg_temp_new_i64(); |
4387 | e023e832 | Alexander Graf | tcg_gen_qemu_ld32s(tmp2, tmp, get_mem_index(s)); |
4388 | e023e832 | Alexander Graf | tmp3 = load_reg((r1 + 1) & 15); |
4389 | e023e832 | Alexander Graf | tcg_gen_ext32s_i64(tmp2, tmp2); |
4390 | e023e832 | Alexander Graf | tcg_gen_ext32s_i64(tmp3, tmp3); |
4391 | e023e832 | Alexander Graf | tcg_gen_mul_i64(tmp2, tmp2, tmp3); |
4392 | e023e832 | Alexander Graf | store_reg32_i64((r1 + 1) & 15, tmp2); |
4393 | e023e832 | Alexander Graf | tcg_gen_shri_i64(tmp2, tmp2, 32);
|
4394 | e023e832 | Alexander Graf | store_reg32_i64(r1, tmp2); |
4395 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
4396 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
4397 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp3); |
4398 | e023e832 | Alexander Graf | break;
|
4399 | e023e832 | Alexander Graf | case 0x5d: /* D R1,D2(X2,B2) [RX] */ |
4400 | e023e832 | Alexander Graf | insn = ld_code4(s->pc); |
4401 | e023e832 | Alexander Graf | tmp3 = decode_rx(s, insn, &r1, &x2, &b2, &d2); |
4402 | e023e832 | Alexander Graf | tmp32_1 = load_reg32(r1); |
4403 | e023e832 | Alexander Graf | tmp32_2 = load_reg32(r1 + 1);
|
4404 | e023e832 | Alexander Graf | |
4405 | e023e832 | Alexander Graf | tmp = tcg_temp_new_i64(); |
4406 | e023e832 | Alexander Graf | tmp2 = tcg_temp_new_i64(); |
4407 | e023e832 | Alexander Graf | |
4408 | e023e832 | Alexander Graf | /* dividend is r(r1 << 32) | r(r1 + 1) */
|
4409 | e023e832 | Alexander Graf | tcg_gen_extu_i32_i64(tmp, tmp32_1); |
4410 | e023e832 | Alexander Graf | tcg_gen_extu_i32_i64(tmp2, tmp32_2); |
4411 | e023e832 | Alexander Graf | tcg_gen_shli_i64(tmp, tmp, 32);
|
4412 | e023e832 | Alexander Graf | tcg_gen_or_i64(tmp, tmp, tmp2); |
4413 | e023e832 | Alexander Graf | |
4414 | e023e832 | Alexander Graf | /* divisor is in memory */
|
4415 | e023e832 | Alexander Graf | tcg_gen_qemu_ld32s(tmp2, tmp3, get_mem_index(s)); |
4416 | e023e832 | Alexander Graf | |
4417 | e023e832 | Alexander Graf | /* XXX divisor == 0 -> FixP divide exception */
|
4418 | e023e832 | Alexander Graf | |
4419 | e023e832 | Alexander Graf | tcg_gen_div_i64(tmp3, tmp, tmp2); |
4420 | e023e832 | Alexander Graf | tcg_gen_rem_i64(tmp, tmp, tmp2); |
4421 | e023e832 | Alexander Graf | |
4422 | e023e832 | Alexander Graf | tcg_gen_trunc_i64_i32(tmp32_1, tmp); |
4423 | e023e832 | Alexander Graf | tcg_gen_trunc_i64_i32(tmp32_2, tmp3); |
4424 | e023e832 | Alexander Graf | |
4425 | e023e832 | Alexander Graf | store_reg32(r1, tmp32_1); /* remainder */
|
4426 | e023e832 | Alexander Graf | store_reg32(r1 + 1, tmp32_2); /* quotient */ |
4427 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
4428 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_2); |
4429 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
4430 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
4431 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp3); |
4432 | e023e832 | Alexander Graf | break;
|
4433 | e023e832 | Alexander Graf | case 0x60: /* STD R1,D2(X2,B2) [RX] */ |
4434 | e023e832 | Alexander Graf | insn = ld_code4(s->pc); |
4435 | e023e832 | Alexander Graf | tmp = decode_rx(s, insn, &r1, &x2, &b2, &d2); |
4436 | e023e832 | Alexander Graf | tmp2 = load_freg(r1); |
4437 | e023e832 | Alexander Graf | tcg_gen_qemu_st64(tmp2, tmp, get_mem_index(s)); |
4438 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
4439 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
4440 | e023e832 | Alexander Graf | break;
|
4441 | e023e832 | Alexander Graf | case 0x68: /* LD R1,D2(X2,B2) [RX] */ |
4442 | e023e832 | Alexander Graf | insn = ld_code4(s->pc); |
4443 | e023e832 | Alexander Graf | tmp = decode_rx(s, insn, &r1, &x2, &b2, &d2); |
4444 | e023e832 | Alexander Graf | tmp2 = tcg_temp_new_i64(); |
4445 | e023e832 | Alexander Graf | tcg_gen_qemu_ld64(tmp2, tmp, get_mem_index(s)); |
4446 | e023e832 | Alexander Graf | store_freg(r1, tmp2); |
4447 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
4448 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
4449 | e023e832 | Alexander Graf | break;
|
4450 | e023e832 | Alexander Graf | case 0x70: /* STE R1,D2(X2,B2) [RX] */ |
4451 | e023e832 | Alexander Graf | insn = ld_code4(s->pc); |
4452 | e023e832 | Alexander Graf | tmp = decode_rx(s, insn, &r1, &x2, &b2, &d2); |
4453 | e023e832 | Alexander Graf | tmp2 = tcg_temp_new_i64(); |
4454 | e023e832 | Alexander Graf | tmp32_1 = load_freg32(r1); |
4455 | e023e832 | Alexander Graf | tcg_gen_extu_i32_i64(tmp2, tmp32_1); |
4456 | e023e832 | Alexander Graf | tcg_gen_qemu_st32(tmp2, tmp, get_mem_index(s)); |
4457 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
4458 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
4459 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
4460 | e023e832 | Alexander Graf | break;
|
4461 | e023e832 | Alexander Graf | case 0x71: /* MS R1,D2(X2,B2) [RX] */ |
4462 | e023e832 | Alexander Graf | insn = ld_code4(s->pc); |
4463 | e023e832 | Alexander Graf | tmp = decode_rx(s, insn, &r1, &x2, &b2, &d2); |
4464 | e023e832 | Alexander Graf | tmp2 = tcg_temp_new_i64(); |
4465 | e023e832 | Alexander Graf | tmp32_1 = load_reg32(r1); |
4466 | e023e832 | Alexander Graf | tmp32_2 = tcg_temp_new_i32(); |
4467 | e023e832 | Alexander Graf | tcg_gen_qemu_ld32s(tmp2, tmp, get_mem_index(s)); |
4468 | e023e832 | Alexander Graf | tcg_gen_trunc_i64_i32(tmp32_2, tmp2); |
4469 | e023e832 | Alexander Graf | tcg_gen_mul_i32(tmp32_1, tmp32_1, tmp32_2); |
4470 | e023e832 | Alexander Graf | store_reg32(r1, tmp32_1); |
4471 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
4472 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
4473 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
4474 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_2); |
4475 | e023e832 | Alexander Graf | break;
|
4476 | e023e832 | Alexander Graf | case 0x78: /* LE R1,D2(X2,B2) [RX] */ |
4477 | e023e832 | Alexander Graf | insn = ld_code4(s->pc); |
4478 | e023e832 | Alexander Graf | tmp = decode_rx(s, insn, &r1, &x2, &b2, &d2); |
4479 | e023e832 | Alexander Graf | tmp2 = tcg_temp_new_i64(); |
4480 | e023e832 | Alexander Graf | tmp32_1 = tcg_temp_new_i32(); |
4481 | e023e832 | Alexander Graf | tcg_gen_qemu_ld32u(tmp2, tmp, get_mem_index(s)); |
4482 | e023e832 | Alexander Graf | tcg_gen_trunc_i64_i32(tmp32_1, tmp2); |
4483 | e023e832 | Alexander Graf | store_freg32(r1, tmp32_1); |
4484 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
4485 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
4486 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
4487 | e023e832 | Alexander Graf | break;
|
4488 | e023e832 | Alexander Graf | #ifndef CONFIG_USER_ONLY
|
4489 | e023e832 | Alexander Graf | case 0x80: /* SSM D2(B2) [S] */ |
4490 | e023e832 | Alexander Graf | /* Set System Mask */
|
4491 | e023e832 | Alexander Graf | check_privileged(s, ilc); |
4492 | e023e832 | Alexander Graf | insn = ld_code4(s->pc); |
4493 | e023e832 | Alexander Graf | decode_rs(s, insn, &r1, &r3, &b2, &d2); |
4494 | e023e832 | Alexander Graf | tmp = get_address(s, 0, b2, d2);
|
4495 | e023e832 | Alexander Graf | tmp2 = tcg_temp_new_i64(); |
4496 | e023e832 | Alexander Graf | tmp3 = tcg_temp_new_i64(); |
4497 | e023e832 | Alexander Graf | tcg_gen_andi_i64(tmp3, psw_mask, ~0xff00000000000000ULL);
|
4498 | e023e832 | Alexander Graf | tcg_gen_qemu_ld8u(tmp2, tmp, get_mem_index(s)); |
4499 | e023e832 | Alexander Graf | tcg_gen_shli_i64(tmp2, tmp2, 56);
|
4500 | e023e832 | Alexander Graf | tcg_gen_or_i64(psw_mask, tmp3, tmp2); |
4501 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
4502 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
4503 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp3); |
4504 | e023e832 | Alexander Graf | break;
|
4505 | e023e832 | Alexander Graf | case 0x82: /* LPSW D2(B2) [S] */ |
4506 | e023e832 | Alexander Graf | /* Load PSW */
|
4507 | e023e832 | Alexander Graf | check_privileged(s, ilc); |
4508 | e023e832 | Alexander Graf | insn = ld_code4(s->pc); |
4509 | e023e832 | Alexander Graf | decode_rs(s, insn, &r1, &r3, &b2, &d2); |
4510 | e023e832 | Alexander Graf | tmp = get_address(s, 0, b2, d2);
|
4511 | e023e832 | Alexander Graf | tmp2 = tcg_temp_new_i64(); |
4512 | e023e832 | Alexander Graf | tmp3 = tcg_temp_new_i64(); |
4513 | e023e832 | Alexander Graf | tcg_gen_qemu_ld32u(tmp2, tmp, get_mem_index(s)); |
4514 | e023e832 | Alexander Graf | tcg_gen_addi_i64(tmp, tmp, 4);
|
4515 | e023e832 | Alexander Graf | tcg_gen_qemu_ld32u(tmp3, tmp, get_mem_index(s)); |
4516 | e023e832 | Alexander Graf | gen_helper_load_psw(tmp2, tmp3); |
4517 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
4518 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
4519 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp3); |
4520 | e023e832 | Alexander Graf | /* we need to keep cc_op intact */
|
4521 | e023e832 | Alexander Graf | s->is_jmp = DISAS_JUMP; |
4522 | e023e832 | Alexander Graf | break;
|
4523 | e023e832 | Alexander Graf | case 0x83: /* DIAG R1,R3,D2 [RS] */ |
4524 | e023e832 | Alexander Graf | /* Diagnose call (KVM hypercall) */
|
4525 | e023e832 | Alexander Graf | check_privileged(s, ilc); |
4526 | e023e832 | Alexander Graf | potential_page_fault(s); |
4527 | e023e832 | Alexander Graf | insn = ld_code4(s->pc); |
4528 | e023e832 | Alexander Graf | decode_rs(s, insn, &r1, &r3, &b2, &d2); |
4529 | e023e832 | Alexander Graf | tmp32_1 = tcg_const_i32(insn & 0xfff);
|
4530 | e023e832 | Alexander Graf | tmp2 = load_reg(2);
|
4531 | e023e832 | Alexander Graf | tmp3 = load_reg(1);
|
4532 | e023e832 | Alexander Graf | gen_helper_diag(tmp2, tmp32_1, tmp2, tmp3); |
4533 | e023e832 | Alexander Graf | store_reg(2, tmp2);
|
4534 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
4535 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
4536 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp3); |
4537 | e023e832 | Alexander Graf | break;
|
4538 | e023e832 | Alexander Graf | #endif
|
4539 | e023e832 | Alexander Graf | case 0x88: /* SRL R1,D2(B2) [RS] */ |
4540 | e023e832 | Alexander Graf | case 0x89: /* SLL R1,D2(B2) [RS] */ |
4541 | e023e832 | Alexander Graf | case 0x8a: /* SRA R1,D2(B2) [RS] */ |
4542 | e023e832 | Alexander Graf | insn = ld_code4(s->pc); |
4543 | e023e832 | Alexander Graf | decode_rs(s, insn, &r1, &r3, &b2, &d2); |
4544 | e023e832 | Alexander Graf | tmp = get_address(s, 0, b2, d2);
|
4545 | e023e832 | Alexander Graf | tmp32_1 = load_reg32(r1); |
4546 | e023e832 | Alexander Graf | tmp32_2 = tcg_temp_new_i32(); |
4547 | e023e832 | Alexander Graf | tcg_gen_trunc_i64_i32(tmp32_2, tmp); |
4548 | e023e832 | Alexander Graf | tcg_gen_andi_i32(tmp32_2, tmp32_2, 0x3f);
|
4549 | e023e832 | Alexander Graf | switch (opc) {
|
4550 | e023e832 | Alexander Graf | case 0x88: |
4551 | e023e832 | Alexander Graf | tcg_gen_shr_i32(tmp32_1, tmp32_1, tmp32_2); |
4552 | e023e832 | Alexander Graf | break;
|
4553 | e023e832 | Alexander Graf | case 0x89: |
4554 | e023e832 | Alexander Graf | tcg_gen_shl_i32(tmp32_1, tmp32_1, tmp32_2); |
4555 | e023e832 | Alexander Graf | break;
|
4556 | e023e832 | Alexander Graf | case 0x8a: |
4557 | e023e832 | Alexander Graf | tcg_gen_sar_i32(tmp32_1, tmp32_1, tmp32_2); |
4558 | e023e832 | Alexander Graf | set_cc_s32(s, tmp32_1); |
4559 | e023e832 | Alexander Graf | break;
|
4560 | e023e832 | Alexander Graf | default:
|
4561 | e023e832 | Alexander Graf | tcg_abort(); |
4562 | e023e832 | Alexander Graf | } |
4563 | e023e832 | Alexander Graf | store_reg32(r1, tmp32_1); |
4564 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
4565 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
4566 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_2); |
4567 | e023e832 | Alexander Graf | break;
|
4568 | e023e832 | Alexander Graf | case 0x8c: /* SRDL R1,D2(B2) [RS] */ |
4569 | e023e832 | Alexander Graf | case 0x8d: /* SLDL R1,D2(B2) [RS] */ |
4570 | e023e832 | Alexander Graf | case 0x8e: /* SRDA R1,D2(B2) [RS] */ |
4571 | e023e832 | Alexander Graf | insn = ld_code4(s->pc); |
4572 | e023e832 | Alexander Graf | decode_rs(s, insn, &r1, &r3, &b2, &d2); |
4573 | e023e832 | Alexander Graf | tmp = get_address(s, 0, b2, d2); /* shift */ |
4574 | e023e832 | Alexander Graf | tmp2 = tcg_temp_new_i64(); |
4575 | e023e832 | Alexander Graf | tmp32_1 = load_reg32(r1); |
4576 | e023e832 | Alexander Graf | tmp32_2 = load_reg32(r1 + 1);
|
4577 | e023e832 | Alexander Graf | tcg_gen_concat_i32_i64(tmp2, tmp32_2, tmp32_1); /* operand */
|
4578 | e023e832 | Alexander Graf | switch (opc) {
|
4579 | e023e832 | Alexander Graf | case 0x8c: |
4580 | e023e832 | Alexander Graf | tcg_gen_shr_i64(tmp2, tmp2, tmp); |
4581 | e023e832 | Alexander Graf | break;
|
4582 | e023e832 | Alexander Graf | case 0x8d: |
4583 | e023e832 | Alexander Graf | tcg_gen_shl_i64(tmp2, tmp2, tmp); |
4584 | e023e832 | Alexander Graf | break;
|
4585 | e023e832 | Alexander Graf | case 0x8e: |
4586 | e023e832 | Alexander Graf | tcg_gen_sar_i64(tmp2, tmp2, tmp); |
4587 | e023e832 | Alexander Graf | set_cc_s64(s, tmp2); |
4588 | e023e832 | Alexander Graf | break;
|
4589 | e023e832 | Alexander Graf | } |
4590 | e023e832 | Alexander Graf | tcg_gen_shri_i64(tmp, tmp2, 32);
|
4591 | e023e832 | Alexander Graf | tcg_gen_trunc_i64_i32(tmp32_1, tmp); |
4592 | e023e832 | Alexander Graf | store_reg32(r1, tmp32_1); |
4593 | e023e832 | Alexander Graf | tcg_gen_trunc_i64_i32(tmp32_2, tmp2); |
4594 | e023e832 | Alexander Graf | store_reg32(r1 + 1, tmp32_2);
|
4595 | e023e832 | Alexander Graf | break;
|
4596 | e023e832 | Alexander Graf | case 0x98: /* LM R1,R3,D2(B2) [RS] */ |
4597 | e023e832 | Alexander Graf | case 0x90: /* STM R1,R3,D2(B2) [RS] */ |
4598 | e023e832 | Alexander Graf | insn = ld_code4(s->pc); |
4599 | e023e832 | Alexander Graf | decode_rs(s, insn, &r1, &r3, &b2, &d2); |
4600 | e023e832 | Alexander Graf | |
4601 | e023e832 | Alexander Graf | tmp = get_address(s, 0, b2, d2);
|
4602 | e023e832 | Alexander Graf | tmp2 = tcg_temp_new_i64(); |
4603 | e023e832 | Alexander Graf | tmp3 = tcg_const_i64(4);
|
4604 | e023e832 | Alexander Graf | tmp4 = tcg_const_i64(0xffffffff00000000ULL);
|
4605 | e023e832 | Alexander Graf | for (i = r1;; i = (i + 1) % 16) { |
4606 | e023e832 | Alexander Graf | if (opc == 0x98) { |
4607 | e023e832 | Alexander Graf | tcg_gen_qemu_ld32u(tmp2, tmp, get_mem_index(s)); |
4608 | e023e832 | Alexander Graf | tcg_gen_and_i64(regs[i], regs[i], tmp4); |
4609 | e023e832 | Alexander Graf | tcg_gen_or_i64(regs[i], regs[i], tmp2); |
4610 | e023e832 | Alexander Graf | } else {
|
4611 | e023e832 | Alexander Graf | tcg_gen_qemu_st32(regs[i], tmp, get_mem_index(s)); |
4612 | e023e832 | Alexander Graf | } |
4613 | e023e832 | Alexander Graf | if (i == r3) {
|
4614 | e023e832 | Alexander Graf | break;
|
4615 | e023e832 | Alexander Graf | } |
4616 | e023e832 | Alexander Graf | tcg_gen_add_i64(tmp, tmp, tmp3); |
4617 | e023e832 | Alexander Graf | } |
4618 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
4619 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp3); |
4620 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp4); |
4621 | e023e832 | Alexander Graf | break;
|
4622 | e023e832 | Alexander Graf | case 0x91: /* TM D1(B1),I2 [SI] */ |
4623 | e023e832 | Alexander Graf | insn = ld_code4(s->pc); |
4624 | e023e832 | Alexander Graf | tmp = decode_si(s, insn, &i2, &b1, &d1); |
4625 | e023e832 | Alexander Graf | tmp2 = tcg_const_i64(i2); |
4626 | e023e832 | Alexander Graf | tcg_gen_qemu_ld8u(tmp, tmp, get_mem_index(s)); |
4627 | e023e832 | Alexander Graf | cmp_64(s, tmp, tmp2, CC_OP_TM_32); |
4628 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
4629 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
4630 | e023e832 | Alexander Graf | break;
|
4631 | e023e832 | Alexander Graf | case 0x92: /* MVI D1(B1),I2 [SI] */ |
4632 | e023e832 | Alexander Graf | insn = ld_code4(s->pc); |
4633 | e023e832 | Alexander Graf | tmp = decode_si(s, insn, &i2, &b1, &d1); |
4634 | e023e832 | Alexander Graf | tmp2 = tcg_const_i64(i2); |
4635 | e023e832 | Alexander Graf | tcg_gen_qemu_st8(tmp2, tmp, get_mem_index(s)); |
4636 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
4637 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
4638 | e023e832 | Alexander Graf | break;
|
4639 | e023e832 | Alexander Graf | case 0x94: /* NI D1(B1),I2 [SI] */ |
4640 | e023e832 | Alexander Graf | case 0x96: /* OI D1(B1),I2 [SI] */ |
4641 | e023e832 | Alexander Graf | case 0x97: /* XI D1(B1),I2 [SI] */ |
4642 | e023e832 | Alexander Graf | insn = ld_code4(s->pc); |
4643 | e023e832 | Alexander Graf | tmp = decode_si(s, insn, &i2, &b1, &d1); |
4644 | e023e832 | Alexander Graf | tmp2 = tcg_temp_new_i64(); |
4645 | e023e832 | Alexander Graf | tcg_gen_qemu_ld8u(tmp2, tmp, get_mem_index(s)); |
4646 | e023e832 | Alexander Graf | switch (opc) {
|
4647 | e023e832 | Alexander Graf | case 0x94: |
4648 | e023e832 | Alexander Graf | tcg_gen_andi_i64(tmp2, tmp2, i2); |
4649 | e023e832 | Alexander Graf | break;
|
4650 | e023e832 | Alexander Graf | case 0x96: |
4651 | e023e832 | Alexander Graf | tcg_gen_ori_i64(tmp2, tmp2, i2); |
4652 | e023e832 | Alexander Graf | break;
|
4653 | e023e832 | Alexander Graf | case 0x97: |
4654 | e023e832 | Alexander Graf | tcg_gen_xori_i64(tmp2, tmp2, i2); |
4655 | e023e832 | Alexander Graf | break;
|
4656 | e023e832 | Alexander Graf | default:
|
4657 | e023e832 | Alexander Graf | tcg_abort(); |
4658 | e023e832 | Alexander Graf | } |
4659 | e023e832 | Alexander Graf | tcg_gen_qemu_st8(tmp2, tmp, get_mem_index(s)); |
4660 | e023e832 | Alexander Graf | set_cc_nz_u64(s, tmp2); |
4661 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
4662 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
4663 | e023e832 | Alexander Graf | break;
|
4664 | e023e832 | Alexander Graf | case 0x95: /* CLI D1(B1),I2 [SI] */ |
4665 | e023e832 | Alexander Graf | insn = ld_code4(s->pc); |
4666 | e023e832 | Alexander Graf | tmp = decode_si(s, insn, &i2, &b1, &d1); |
4667 | e023e832 | Alexander Graf | tmp2 = tcg_temp_new_i64(); |
4668 | e023e832 | Alexander Graf | tcg_gen_qemu_ld8u(tmp2, tmp, get_mem_index(s)); |
4669 | e023e832 | Alexander Graf | cmp_u64c(s, tmp2, i2); |
4670 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
4671 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
4672 | e023e832 | Alexander Graf | break;
|
4673 | e023e832 | Alexander Graf | case 0x9a: /* LAM R1,R3,D2(B2) [RS] */ |
4674 | e023e832 | Alexander Graf | insn = ld_code4(s->pc); |
4675 | e023e832 | Alexander Graf | decode_rs(s, insn, &r1, &r3, &b2, &d2); |
4676 | e023e832 | Alexander Graf | tmp = get_address(s, 0, b2, d2);
|
4677 | e023e832 | Alexander Graf | tmp32_1 = tcg_const_i32(r1); |
4678 | e023e832 | Alexander Graf | tmp32_2 = tcg_const_i32(r3); |
4679 | e023e832 | Alexander Graf | potential_page_fault(s); |
4680 | e023e832 | Alexander Graf | gen_helper_lam(tmp32_1, tmp, tmp32_2); |
4681 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
4682 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
4683 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_2); |
4684 | e023e832 | Alexander Graf | break;
|
4685 | e023e832 | Alexander Graf | case 0x9b: /* STAM R1,R3,D2(B2) [RS] */ |
4686 | e023e832 | Alexander Graf | insn = ld_code4(s->pc); |
4687 | e023e832 | Alexander Graf | decode_rs(s, insn, &r1, &r3, &b2, &d2); |
4688 | e023e832 | Alexander Graf | tmp = get_address(s, 0, b2, d2);
|
4689 | e023e832 | Alexander Graf | tmp32_1 = tcg_const_i32(r1); |
4690 | e023e832 | Alexander Graf | tmp32_2 = tcg_const_i32(r3); |
4691 | e023e832 | Alexander Graf | potential_page_fault(s); |
4692 | e023e832 | Alexander Graf | gen_helper_stam(tmp32_1, tmp, tmp32_2); |
4693 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
4694 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
4695 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_2); |
4696 | e023e832 | Alexander Graf | break;
|
4697 | e023e832 | Alexander Graf | case 0xa5: |
4698 | e023e832 | Alexander Graf | insn = ld_code4(s->pc); |
4699 | e023e832 | Alexander Graf | r1 = (insn >> 20) & 0xf; |
4700 | e023e832 | Alexander Graf | op = (insn >> 16) & 0xf; |
4701 | e023e832 | Alexander Graf | i2 = insn & 0xffff;
|
4702 | e023e832 | Alexander Graf | disas_a5(s, op, r1, i2); |
4703 | e023e832 | Alexander Graf | break;
|
4704 | e023e832 | Alexander Graf | case 0xa7: |
4705 | e023e832 | Alexander Graf | insn = ld_code4(s->pc); |
4706 | e023e832 | Alexander Graf | r1 = (insn >> 20) & 0xf; |
4707 | e023e832 | Alexander Graf | op = (insn >> 16) & 0xf; |
4708 | e023e832 | Alexander Graf | i2 = (short)insn;
|
4709 | e023e832 | Alexander Graf | disas_a7(s, op, r1, i2); |
4710 | e023e832 | Alexander Graf | break;
|
4711 | e023e832 | Alexander Graf | case 0xa8: /* MVCLE R1,R3,D2(B2) [RS] */ |
4712 | e023e832 | Alexander Graf | insn = ld_code4(s->pc); |
4713 | e023e832 | Alexander Graf | decode_rs(s, insn, &r1, &r3, &b2, &d2); |
4714 | e023e832 | Alexander Graf | tmp = get_address(s, 0, b2, d2);
|
4715 | e023e832 | Alexander Graf | tmp32_1 = tcg_const_i32(r1); |
4716 | e023e832 | Alexander Graf | tmp32_2 = tcg_const_i32(r3); |
4717 | e023e832 | Alexander Graf | potential_page_fault(s); |
4718 | e023e832 | Alexander Graf | gen_helper_mvcle(cc_op, tmp32_1, tmp, tmp32_2); |
4719 | e023e832 | Alexander Graf | set_cc_static(s); |
4720 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
4721 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
4722 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_2); |
4723 | e023e832 | Alexander Graf | break;
|
4724 | e023e832 | Alexander Graf | case 0xa9: /* CLCLE R1,R3,D2(B2) [RS] */ |
4725 | e023e832 | Alexander Graf | insn = ld_code4(s->pc); |
4726 | e023e832 | Alexander Graf | decode_rs(s, insn, &r1, &r3, &b2, &d2); |
4727 | e023e832 | Alexander Graf | tmp = get_address(s, 0, b2, d2);
|
4728 | e023e832 | Alexander Graf | tmp32_1 = tcg_const_i32(r1); |
4729 | e023e832 | Alexander Graf | tmp32_2 = tcg_const_i32(r3); |
4730 | e023e832 | Alexander Graf | potential_page_fault(s); |
4731 | e023e832 | Alexander Graf | gen_helper_clcle(cc_op, tmp32_1, tmp, tmp32_2); |
4732 | e023e832 | Alexander Graf | set_cc_static(s); |
4733 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
4734 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
4735 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_2); |
4736 | e023e832 | Alexander Graf | break;
|
4737 | e023e832 | Alexander Graf | #ifndef CONFIG_USER_ONLY
|
4738 | e023e832 | Alexander Graf | case 0xac: /* STNSM D1(B1),I2 [SI] */ |
4739 | e023e832 | Alexander Graf | case 0xad: /* STOSM D1(B1),I2 [SI] */ |
4740 | e023e832 | Alexander Graf | check_privileged(s, ilc); |
4741 | e023e832 | Alexander Graf | insn = ld_code4(s->pc); |
4742 | e023e832 | Alexander Graf | tmp = decode_si(s, insn, &i2, &b1, &d1); |
4743 | e023e832 | Alexander Graf | tmp2 = tcg_temp_new_i64(); |
4744 | e023e832 | Alexander Graf | tcg_gen_shri_i64(tmp2, psw_mask, 56);
|
4745 | e023e832 | Alexander Graf | tcg_gen_qemu_st8(tmp2, tmp, get_mem_index(s)); |
4746 | e023e832 | Alexander Graf | if (opc == 0xac) { |
4747 | e023e832 | Alexander Graf | tcg_gen_andi_i64(psw_mask, psw_mask, |
4748 | e023e832 | Alexander Graf | ((uint64_t)i2 << 56) | 0x00ffffffffffffffULL); |
4749 | e023e832 | Alexander Graf | } else {
|
4750 | e023e832 | Alexander Graf | tcg_gen_ori_i64(psw_mask, psw_mask, (uint64_t)i2 << 56);
|
4751 | e023e832 | Alexander Graf | } |
4752 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
4753 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
4754 | e023e832 | Alexander Graf | break;
|
4755 | e023e832 | Alexander Graf | case 0xae: /* SIGP R1,R3,D2(B2) [RS] */ |
4756 | e023e832 | Alexander Graf | check_privileged(s, ilc); |
4757 | e023e832 | Alexander Graf | insn = ld_code4(s->pc); |
4758 | e023e832 | Alexander Graf | decode_rs(s, insn, &r1, &r3, &b2, &d2); |
4759 | e023e832 | Alexander Graf | tmp = get_address(s, 0, b2, d2);
|
4760 | e023e832 | Alexander Graf | tmp2 = load_reg(r3); |
4761 | e023e832 | Alexander Graf | tmp32_1 = tcg_const_i32(r1); |
4762 | e023e832 | Alexander Graf | potential_page_fault(s); |
4763 | e023e832 | Alexander Graf | gen_helper_sigp(cc_op, tmp, tmp32_1, tmp2); |
4764 | e023e832 | Alexander Graf | set_cc_static(s); |
4765 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
4766 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
4767 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
4768 | e023e832 | Alexander Graf | break;
|
4769 | e023e832 | Alexander Graf | case 0xb1: /* LRA R1,D2(X2, B2) [RX] */ |
4770 | e023e832 | Alexander Graf | check_privileged(s, ilc); |
4771 | e023e832 | Alexander Graf | insn = ld_code4(s->pc); |
4772 | e023e832 | Alexander Graf | tmp = decode_rx(s, insn, &r1, &x2, &b2, &d2); |
4773 | e023e832 | Alexander Graf | tmp32_1 = tcg_const_i32(r1); |
4774 | e023e832 | Alexander Graf | potential_page_fault(s); |
4775 | e023e832 | Alexander Graf | gen_helper_lra(cc_op, tmp, tmp32_1); |
4776 | e023e832 | Alexander Graf | set_cc_static(s); |
4777 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
4778 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
4779 | e023e832 | Alexander Graf | break;
|
4780 | e023e832 | Alexander Graf | #endif
|
4781 | e023e832 | Alexander Graf | case 0xb2: |
4782 | e023e832 | Alexander Graf | insn = ld_code4(s->pc); |
4783 | e023e832 | Alexander Graf | op = (insn >> 16) & 0xff; |
4784 | e023e832 | Alexander Graf | switch (op) {
|
4785 | e023e832 | Alexander Graf | case 0x9c: /* STFPC D2(B2) [S] */ |
4786 | e023e832 | Alexander Graf | d2 = insn & 0xfff;
|
4787 | e023e832 | Alexander Graf | b2 = (insn >> 12) & 0xf; |
4788 | e023e832 | Alexander Graf | tmp32_1 = tcg_temp_new_i32(); |
4789 | e023e832 | Alexander Graf | tmp = tcg_temp_new_i64(); |
4790 | e023e832 | Alexander Graf | tmp2 = get_address(s, 0, b2, d2);
|
4791 | e023e832 | Alexander Graf | tcg_gen_ld_i32(tmp32_1, cpu_env, offsetof(CPUState, fpc)); |
4792 | e023e832 | Alexander Graf | tcg_gen_extu_i32_i64(tmp, tmp32_1); |
4793 | e023e832 | Alexander Graf | tcg_gen_qemu_st32(tmp, tmp2, get_mem_index(s)); |
4794 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
4795 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
4796 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
4797 | e023e832 | Alexander Graf | break;
|
4798 | e023e832 | Alexander Graf | default:
|
4799 | e023e832 | Alexander Graf | disas_b2(s, op, insn); |
4800 | e023e832 | Alexander Graf | break;
|
4801 | e023e832 | Alexander Graf | } |
4802 | e023e832 | Alexander Graf | break;
|
4803 | e023e832 | Alexander Graf | case 0xb3: |
4804 | e023e832 | Alexander Graf | insn = ld_code4(s->pc); |
4805 | e023e832 | Alexander Graf | op = (insn >> 16) & 0xff; |
4806 | e023e832 | Alexander Graf | r3 = (insn >> 12) & 0xf; /* aka m3 */ |
4807 | e023e832 | Alexander Graf | r1 = (insn >> 4) & 0xf; |
4808 | e023e832 | Alexander Graf | r2 = insn & 0xf;
|
4809 | e023e832 | Alexander Graf | disas_b3(s, op, r3, r1, r2); |
4810 | e023e832 | Alexander Graf | break;
|
4811 | e023e832 | Alexander Graf | #ifndef CONFIG_USER_ONLY
|
4812 | e023e832 | Alexander Graf | case 0xb6: /* STCTL R1,R3,D2(B2) [RS] */ |
4813 | e023e832 | Alexander Graf | /* Store Control */
|
4814 | e023e832 | Alexander Graf | check_privileged(s, ilc); |
4815 | e023e832 | Alexander Graf | insn = ld_code4(s->pc); |
4816 | e023e832 | Alexander Graf | decode_rs(s, insn, &r1, &r3, &b2, &d2); |
4817 | e023e832 | Alexander Graf | tmp = get_address(s, 0, b2, d2);
|
4818 | e023e832 | Alexander Graf | tmp32_1 = tcg_const_i32(r1); |
4819 | e023e832 | Alexander Graf | tmp32_2 = tcg_const_i32(r3); |
4820 | e023e832 | Alexander Graf | potential_page_fault(s); |
4821 | e023e832 | Alexander Graf | gen_helper_stctl(tmp32_1, tmp, tmp32_2); |
4822 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
4823 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
4824 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_2); |
4825 | e023e832 | Alexander Graf | break;
|
4826 | e023e832 | Alexander Graf | case 0xb7: /* LCTL R1,R3,D2(B2) [RS] */ |
4827 | e023e832 | Alexander Graf | /* Load Control */
|
4828 | e023e832 | Alexander Graf | check_privileged(s, ilc); |
4829 | e023e832 | Alexander Graf | insn = ld_code4(s->pc); |
4830 | e023e832 | Alexander Graf | decode_rs(s, insn, &r1, &r3, &b2, &d2); |
4831 | e023e832 | Alexander Graf | tmp = get_address(s, 0, b2, d2);
|
4832 | e023e832 | Alexander Graf | tmp32_1 = tcg_const_i32(r1); |
4833 | e023e832 | Alexander Graf | tmp32_2 = tcg_const_i32(r3); |
4834 | e023e832 | Alexander Graf | potential_page_fault(s); |
4835 | e023e832 | Alexander Graf | gen_helper_lctl(tmp32_1, tmp, tmp32_2); |
4836 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
4837 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
4838 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_2); |
4839 | e023e832 | Alexander Graf | break;
|
4840 | e023e832 | Alexander Graf | #endif
|
4841 | e023e832 | Alexander Graf | case 0xb9: |
4842 | e023e832 | Alexander Graf | insn = ld_code4(s->pc); |
4843 | e023e832 | Alexander Graf | r1 = (insn >> 4) & 0xf; |
4844 | e023e832 | Alexander Graf | r2 = insn & 0xf;
|
4845 | e023e832 | Alexander Graf | op = (insn >> 16) & 0xff; |
4846 | e023e832 | Alexander Graf | disas_b9(s, op, r1, r2); |
4847 | e023e832 | Alexander Graf | break;
|
4848 | e023e832 | Alexander Graf | case 0xba: /* CS R1,R3,D2(B2) [RS] */ |
4849 | e023e832 | Alexander Graf | insn = ld_code4(s->pc); |
4850 | e023e832 | Alexander Graf | decode_rs(s, insn, &r1, &r3, &b2, &d2); |
4851 | e023e832 | Alexander Graf | tmp = get_address(s, 0, b2, d2);
|
4852 | e023e832 | Alexander Graf | tmp32_1 = tcg_const_i32(r1); |
4853 | e023e832 | Alexander Graf | tmp32_2 = tcg_const_i32(r3); |
4854 | e023e832 | Alexander Graf | potential_page_fault(s); |
4855 | e023e832 | Alexander Graf | gen_helper_cs(cc_op, tmp32_1, tmp, tmp32_2); |
4856 | e023e832 | Alexander Graf | set_cc_static(s); |
4857 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
4858 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
4859 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_2); |
4860 | e023e832 | Alexander Graf | break;
|
4861 | e023e832 | Alexander Graf | case 0xbd: /* CLM R1,M3,D2(B2) [RS] */ |
4862 | e023e832 | Alexander Graf | insn = ld_code4(s->pc); |
4863 | e023e832 | Alexander Graf | decode_rs(s, insn, &r1, &r3, &b2, &d2); |
4864 | e023e832 | Alexander Graf | tmp = get_address(s, 0, b2, d2);
|
4865 | e023e832 | Alexander Graf | tmp32_1 = load_reg32(r1); |
4866 | e023e832 | Alexander Graf | tmp32_2 = tcg_const_i32(r3); |
4867 | e023e832 | Alexander Graf | potential_page_fault(s); |
4868 | e023e832 | Alexander Graf | gen_helper_clm(cc_op, tmp32_1, tmp32_2, tmp); |
4869 | e023e832 | Alexander Graf | set_cc_static(s); |
4870 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
4871 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
4872 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_2); |
4873 | e023e832 | Alexander Graf | break;
|
4874 | e023e832 | Alexander Graf | case 0xbe: /* STCM R1,M3,D2(B2) [RS] */ |
4875 | e023e832 | Alexander Graf | insn = ld_code4(s->pc); |
4876 | e023e832 | Alexander Graf | decode_rs(s, insn, &r1, &r3, &b2, &d2); |
4877 | e023e832 | Alexander Graf | tmp = get_address(s, 0, b2, d2);
|
4878 | e023e832 | Alexander Graf | tmp32_1 = load_reg32(r1); |
4879 | e023e832 | Alexander Graf | tmp32_2 = tcg_const_i32(r3); |
4880 | e023e832 | Alexander Graf | potential_page_fault(s); |
4881 | e023e832 | Alexander Graf | gen_helper_stcm(tmp32_1, tmp32_2, tmp); |
4882 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
4883 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
4884 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_2); |
4885 | e023e832 | Alexander Graf | break;
|
4886 | e023e832 | Alexander Graf | case 0xbf: /* ICM R1,M3,D2(B2) [RS] */ |
4887 | e023e832 | Alexander Graf | insn = ld_code4(s->pc); |
4888 | e023e832 | Alexander Graf | decode_rs(s, insn, &r1, &r3, &b2, &d2); |
4889 | e023e832 | Alexander Graf | if (r3 == 15) { |
4890 | e023e832 | Alexander Graf | /* effectively a 32-bit load */
|
4891 | e023e832 | Alexander Graf | tmp = get_address(s, 0, b2, d2);
|
4892 | e023e832 | Alexander Graf | tmp32_1 = tcg_temp_new_i32(); |
4893 | e023e832 | Alexander Graf | tmp32_2 = tcg_const_i32(r3); |
4894 | e023e832 | Alexander Graf | tcg_gen_qemu_ld32u(tmp, tmp, get_mem_index(s)); |
4895 | e023e832 | Alexander Graf | store_reg32_i64(r1, tmp); |
4896 | e023e832 | Alexander Graf | tcg_gen_trunc_i64_i32(tmp32_1, tmp); |
4897 | e023e832 | Alexander Graf | set_cc_icm(s, tmp32_2, tmp32_1); |
4898 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
4899 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
4900 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_2); |
4901 | e023e832 | Alexander Graf | } else if (r3) { |
4902 | e023e832 | Alexander Graf | uint32_t mask = 0x00ffffffUL;
|
4903 | e023e832 | Alexander Graf | uint32_t shift = 24;
|
4904 | e023e832 | Alexander Graf | int m3 = r3;
|
4905 | e023e832 | Alexander Graf | tmp = get_address(s, 0, b2, d2);
|
4906 | e023e832 | Alexander Graf | tmp2 = tcg_temp_new_i64(); |
4907 | e023e832 | Alexander Graf | tmp32_1 = load_reg32(r1); |
4908 | e023e832 | Alexander Graf | tmp32_2 = tcg_temp_new_i32(); |
4909 | e023e832 | Alexander Graf | tmp32_3 = tcg_const_i32(r3); |
4910 | e023e832 | Alexander Graf | tmp32_4 = tcg_const_i32(0);
|
4911 | e023e832 | Alexander Graf | while (m3) {
|
4912 | e023e832 | Alexander Graf | if (m3 & 8) { |
4913 | e023e832 | Alexander Graf | tcg_gen_qemu_ld8u(tmp2, tmp, get_mem_index(s)); |
4914 | e023e832 | Alexander Graf | tcg_gen_trunc_i64_i32(tmp32_2, tmp2); |
4915 | e023e832 | Alexander Graf | if (shift) {
|
4916 | e023e832 | Alexander Graf | tcg_gen_shli_i32(tmp32_2, tmp32_2, shift); |
4917 | e023e832 | Alexander Graf | } |
4918 | e023e832 | Alexander Graf | tcg_gen_andi_i32(tmp32_1, tmp32_1, mask); |
4919 | e023e832 | Alexander Graf | tcg_gen_or_i32(tmp32_1, tmp32_1, tmp32_2); |
4920 | e023e832 | Alexander Graf | tcg_gen_or_i32(tmp32_4, tmp32_4, tmp32_2); |
4921 | e023e832 | Alexander Graf | tcg_gen_addi_i64(tmp, tmp, 1);
|
4922 | e023e832 | Alexander Graf | } |
4923 | e023e832 | Alexander Graf | m3 = (m3 << 1) & 0xf; |
4924 | e023e832 | Alexander Graf | mask = (mask >> 8) | 0xff000000UL; |
4925 | e023e832 | Alexander Graf | shift -= 8;
|
4926 | e023e832 | Alexander Graf | } |
4927 | e023e832 | Alexander Graf | store_reg32(r1, tmp32_1); |
4928 | e023e832 | Alexander Graf | set_cc_icm(s, tmp32_3, tmp32_4); |
4929 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
4930 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
4931 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_1); |
4932 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_2); |
4933 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_3); |
4934 | e023e832 | Alexander Graf | tcg_temp_free_i32(tmp32_4); |
4935 | e023e832 | Alexander Graf | } else {
|
4936 | e023e832 | Alexander Graf | /* i.e. env->cc = 0 */
|
4937 | e023e832 | Alexander Graf | gen_op_movi_cc(s, 0);
|
4938 | e023e832 | Alexander Graf | } |
4939 | e023e832 | Alexander Graf | break;
|
4940 | e023e832 | Alexander Graf | case 0xc0: |
4941 | e023e832 | Alexander Graf | case 0xc2: |
4942 | e023e832 | Alexander Graf | insn = ld_code6(s->pc); |
4943 | e023e832 | Alexander Graf | r1 = (insn >> 36) & 0xf; |
4944 | e023e832 | Alexander Graf | op = (insn >> 32) & 0xf; |
4945 | e023e832 | Alexander Graf | i2 = (int)insn;
|
4946 | e023e832 | Alexander Graf | switch (opc) {
|
4947 | e023e832 | Alexander Graf | case 0xc0: |
4948 | e023e832 | Alexander Graf | disas_c0(s, op, r1, i2); |
4949 | e023e832 | Alexander Graf | break;
|
4950 | e023e832 | Alexander Graf | case 0xc2: |
4951 | e023e832 | Alexander Graf | disas_c2(s, op, r1, i2); |
4952 | e023e832 | Alexander Graf | break;
|
4953 | e023e832 | Alexander Graf | default:
|
4954 | e023e832 | Alexander Graf | tcg_abort(); |
4955 | e023e832 | Alexander Graf | } |
4956 | e023e832 | Alexander Graf | break;
|
4957 | e023e832 | Alexander Graf | case 0xd2: /* MVC D1(L,B1),D2(B2) [SS] */ |
4958 | e023e832 | Alexander Graf | case 0xd4: /* NC D1(L,B1),D2(B2) [SS] */ |
4959 | e023e832 | Alexander Graf | case 0xd5: /* CLC D1(L,B1),D2(B2) [SS] */ |
4960 | e023e832 | Alexander Graf | case 0xd6: /* OC D1(L,B1),D2(B2) [SS] */ |
4961 | e023e832 | Alexander Graf | case 0xd7: /* XC D1(L,B1),D2(B2) [SS] */ |
4962 | e023e832 | Alexander Graf | case 0xdc: /* TR D1(L,B1),D2(B2) [SS] */ |
4963 | e023e832 | Alexander Graf | case 0xf3: /* UNPK D1(L1,B1),D2(L2,B2) [SS] */ |
4964 | e023e832 | Alexander Graf | insn = ld_code6(s->pc); |
4965 | e023e832 | Alexander Graf | vl = tcg_const_i32((insn >> 32) & 0xff); |
4966 | e023e832 | Alexander Graf | b1 = (insn >> 28) & 0xf; |
4967 | e023e832 | Alexander Graf | b2 = (insn >> 12) & 0xf; |
4968 | e023e832 | Alexander Graf | d1 = (insn >> 16) & 0xfff; |
4969 | e023e832 | Alexander Graf | d2 = insn & 0xfff;
|
4970 | e023e832 | Alexander Graf | tmp = get_address(s, 0, b1, d1);
|
4971 | e023e832 | Alexander Graf | tmp2 = get_address(s, 0, b2, d2);
|
4972 | e023e832 | Alexander Graf | switch (opc) {
|
4973 | e023e832 | Alexander Graf | case 0xd2: |
4974 | e023e832 | Alexander Graf | gen_op_mvc(s, (insn >> 32) & 0xff, tmp, tmp2); |
4975 | e023e832 | Alexander Graf | break;
|
4976 | e023e832 | Alexander Graf | case 0xd4: |
4977 | e023e832 | Alexander Graf | potential_page_fault(s); |
4978 | e023e832 | Alexander Graf | gen_helper_nc(cc_op, vl, tmp, tmp2); |
4979 | e023e832 | Alexander Graf | set_cc_static(s); |
4980 | e023e832 | Alexander Graf | break;
|
4981 | e023e832 | Alexander Graf | case 0xd5: |
4982 | e023e832 | Alexander Graf | gen_op_clc(s, (insn >> 32) & 0xff, tmp, tmp2); |
4983 | e023e832 | Alexander Graf | break;
|
4984 | e023e832 | Alexander Graf | case 0xd6: |
4985 | e023e832 | Alexander Graf | potential_page_fault(s); |
4986 | e023e832 | Alexander Graf | gen_helper_oc(cc_op, vl, tmp, tmp2); |
4987 | e023e832 | Alexander Graf | set_cc_static(s); |
4988 | e023e832 | Alexander Graf | break;
|
4989 | e023e832 | Alexander Graf | case 0xd7: |
4990 | e023e832 | Alexander Graf | potential_page_fault(s); |
4991 | e023e832 | Alexander Graf | gen_helper_xc(cc_op, vl, tmp, tmp2); |
4992 | e023e832 | Alexander Graf | set_cc_static(s); |
4993 | e023e832 | Alexander Graf | break;
|
4994 | e023e832 | Alexander Graf | case 0xdc: |
4995 | e023e832 | Alexander Graf | potential_page_fault(s); |
4996 | e023e832 | Alexander Graf | gen_helper_tr(vl, tmp, tmp2); |
4997 | e023e832 | Alexander Graf | set_cc_static(s); |
4998 | e023e832 | Alexander Graf | break;
|
4999 | e023e832 | Alexander Graf | case 0xf3: |
5000 | e023e832 | Alexander Graf | potential_page_fault(s); |
5001 | e023e832 | Alexander Graf | gen_helper_unpk(vl, tmp, tmp2); |
5002 | e023e832 | Alexander Graf | break;
|
5003 | e023e832 | Alexander Graf | default:
|
5004 | e023e832 | Alexander Graf | tcg_abort(); |
5005 | e023e832 | Alexander Graf | } |
5006 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
5007 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
5008 | e023e832 | Alexander Graf | break;
|
5009 | e023e832 | Alexander Graf | #ifndef CONFIG_USER_ONLY
|
5010 | e023e832 | Alexander Graf | case 0xda: /* MVCP D1(R1,B1),D2(B2),R3 [SS] */ |
5011 | e023e832 | Alexander Graf | case 0xdb: /* MVCS D1(R1,B1),D2(B2),R3 [SS] */ |
5012 | e023e832 | Alexander Graf | check_privileged(s, ilc); |
5013 | e023e832 | Alexander Graf | potential_page_fault(s); |
5014 | e023e832 | Alexander Graf | insn = ld_code6(s->pc); |
5015 | e023e832 | Alexander Graf | r1 = (insn >> 36) & 0xf; |
5016 | e023e832 | Alexander Graf | r3 = (insn >> 32) & 0xf; |
5017 | e023e832 | Alexander Graf | b1 = (insn >> 28) & 0xf; |
5018 | e023e832 | Alexander Graf | d1 = (insn >> 16) & 0xfff; |
5019 | e023e832 | Alexander Graf | b2 = (insn >> 12) & 0xf; |
5020 | e023e832 | Alexander Graf | d2 = insn & 0xfff;
|
5021 | e023e832 | Alexander Graf | tmp = load_reg(r1); |
5022 | e023e832 | Alexander Graf | /* XXX key in r3 */
|
5023 | e023e832 | Alexander Graf | tmp2 = get_address(s, 0, b1, d1);
|
5024 | e023e832 | Alexander Graf | tmp3 = get_address(s, 0, b2, d2);
|
5025 | e023e832 | Alexander Graf | if (opc == 0xda) { |
5026 | e023e832 | Alexander Graf | gen_helper_mvcp(cc_op, tmp, tmp2, tmp3); |
5027 | e023e832 | Alexander Graf | } else {
|
5028 | e023e832 | Alexander Graf | gen_helper_mvcs(cc_op, tmp, tmp2, tmp3); |
5029 | e023e832 | Alexander Graf | } |
5030 | e023e832 | Alexander Graf | set_cc_static(s); |
5031 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp); |
5032 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp2); |
5033 | e023e832 | Alexander Graf | tcg_temp_free_i64(tmp3); |
5034 | e023e832 | Alexander Graf | break;
|
5035 | e023e832 | Alexander Graf | #endif
|
5036 | e023e832 | Alexander Graf | case 0xe3: |
5037 | e023e832 | Alexander Graf | insn = ld_code6(s->pc); |
5038 | e023e832 | Alexander Graf | debug_insn(insn); |
5039 | e023e832 | Alexander Graf | op = insn & 0xff;
|
5040 | e023e832 | Alexander Graf | r1 = (insn >> 36) & 0xf; |
5041 | e023e832 | Alexander Graf | x2 = (insn >> 32) & 0xf; |
5042 | e023e832 | Alexander Graf | b2 = (insn >> 28) & 0xf; |
5043 | e023e832 | Alexander Graf | d2 = ((int)((((insn >> 16) & 0xfff) |
5044 | e023e832 | Alexander Graf | | ((insn << 4) & 0xff000)) << 12)) >> 12; |
5045 | e023e832 | Alexander Graf | disas_e3(s, op, r1, x2, b2, d2 ); |
5046 | e023e832 | Alexander Graf | break;
|
5047 | e023e832 | Alexander Graf | #ifndef CONFIG_USER_ONLY
|
5048 | e023e832 | Alexander Graf | case 0xe5: |
5049 | e023e832 | Alexander Graf | /* Test Protection */
|
5050 | e023e832 | Alexander Graf | check_privileged(s, ilc); |
5051 | e023e832 | Alexander Graf | insn = ld_code6(s->pc); |
5052 | e023e832 | Alexander Graf | debug_insn(insn); |
5053 | e023e832 | Alexander Graf | disas_e5(s, insn); |
5054 | e023e832 | Alexander Graf | break;
|
5055 | e023e832 | Alexander Graf | #endif
|
5056 | e023e832 | Alexander Graf | case 0xeb: |
5057 | e023e832 | Alexander Graf | insn = ld_code6(s->pc); |
5058 | e023e832 | Alexander Graf | debug_insn(insn); |
5059 | e023e832 | Alexander Graf | op = insn & 0xff;
|
5060 | e023e832 | Alexander Graf | r1 = (insn >> 36) & 0xf; |
5061 | e023e832 | Alexander Graf | r3 = (insn >> 32) & 0xf; |
5062 | e023e832 | Alexander Graf | b2 = (insn >> 28) & 0xf; |
5063 | e023e832 | Alexander Graf | d2 = ((int)((((insn >> 16) & 0xfff) |
5064 | e023e832 | Alexander Graf | | ((insn << 4) & 0xff000)) << 12)) >> 12; |
5065 | e023e832 | Alexander Graf | disas_eb(s, op, r1, r3, b2, d2); |
5066 | e023e832 | Alexander Graf | break;
|
5067 | e023e832 | Alexander Graf | case 0xed: |
5068 | e023e832 | Alexander Graf | insn = ld_code6(s->pc); |
5069 | e023e832 | Alexander Graf | debug_insn(insn); |
5070 | e023e832 | Alexander Graf | op = insn & 0xff;
|
5071 | e023e832 | Alexander Graf | r1 = (insn >> 36) & 0xf; |
5072 | e023e832 | Alexander Graf | x2 = (insn >> 32) & 0xf; |
5073 | e023e832 | Alexander Graf | b2 = (insn >> 28) & 0xf; |
5074 | e023e832 | Alexander Graf | d2 = (short)((insn >> 16) & 0xfff); |
5075 | e023e832 | Alexander Graf | r1b = (insn >> 12) & 0xf; |
5076 | e023e832 | Alexander Graf | disas_ed(s, op, r1, x2, b2, d2, r1b); |
5077 | e023e832 | Alexander Graf | break;
|
5078 | e023e832 | Alexander Graf | default:
|
5079 | e023e832 | Alexander Graf | LOG_DISAS("unimplemented opcode 0x%x\n", opc);
|
5080 | e023e832 | Alexander Graf | gen_illegal_opcode(s, ilc); |
5081 | e023e832 | Alexander Graf | break;
|
5082 | e023e832 | Alexander Graf | } |
5083 | e023e832 | Alexander Graf | |
5084 | e023e832 | Alexander Graf | /* Instruction length is encoded in the opcode */
|
5085 | e023e832 | Alexander Graf | s->pc += (ilc * 2);
|
5086 | e023e832 | Alexander Graf | } |
5087 | e023e832 | Alexander Graf | |
5088 | e023e832 | Alexander Graf | static inline void gen_intermediate_code_internal(CPUState *env, |
5089 | e023e832 | Alexander Graf | TranslationBlock *tb, |
5090 | e023e832 | Alexander Graf | int search_pc)
|
5091 | e023e832 | Alexander Graf | { |
5092 | e023e832 | Alexander Graf | DisasContext dc; |
5093 | e023e832 | Alexander Graf | target_ulong pc_start; |
5094 | e023e832 | Alexander Graf | uint64_t next_page_start; |
5095 | e023e832 | Alexander Graf | uint16_t *gen_opc_end; |
5096 | e023e832 | Alexander Graf | int j, lj = -1; |
5097 | e023e832 | Alexander Graf | int num_insns, max_insns;
|
5098 | e023e832 | Alexander Graf | CPUBreakpoint *bp; |
5099 | e023e832 | Alexander Graf | |
5100 | e023e832 | Alexander Graf | pc_start = tb->pc; |
5101 | e023e832 | Alexander Graf | |
5102 | e023e832 | Alexander Graf | /* 31-bit mode */
|
5103 | e023e832 | Alexander Graf | if (!(tb->flags & FLAG_MASK_64)) {
|
5104 | e023e832 | Alexander Graf | pc_start &= 0x7fffffff;
|
5105 | e023e832 | Alexander Graf | } |
5106 | e023e832 | Alexander Graf | |
5107 | e023e832 | Alexander Graf | dc.pc = pc_start; |
5108 | e023e832 | Alexander Graf | dc.is_jmp = DISAS_NEXT; |
5109 | e023e832 | Alexander Graf | dc.tb = tb; |
5110 | e023e832 | Alexander Graf | dc.cc_op = CC_OP_DYNAMIC; |
5111 | e023e832 | Alexander Graf | |
5112 | e023e832 | Alexander Graf | gen_opc_end = gen_opc_buf + OPC_MAX_SIZE; |
5113 | e023e832 | Alexander Graf | |
5114 | e023e832 | Alexander Graf | next_page_start = (pc_start & TARGET_PAGE_MASK) + TARGET_PAGE_SIZE; |
5115 | e023e832 | Alexander Graf | |
5116 | e023e832 | Alexander Graf | num_insns = 0;
|
5117 | e023e832 | Alexander Graf | max_insns = tb->cflags & CF_COUNT_MASK; |
5118 | e023e832 | Alexander Graf | if (max_insns == 0) { |
5119 | e023e832 | Alexander Graf | max_insns = CF_COUNT_MASK; |
5120 | e023e832 | Alexander Graf | } |
5121 | e023e832 | Alexander Graf | |
5122 | e023e832 | Alexander Graf | gen_icount_start(); |
5123 | e023e832 | Alexander Graf | |
5124 | e023e832 | Alexander Graf | do {
|
5125 | e023e832 | Alexander Graf | if (unlikely(!QTAILQ_EMPTY(&env->breakpoints))) {
|
5126 | e023e832 | Alexander Graf | QTAILQ_FOREACH(bp, &env->breakpoints, entry) { |
5127 | e023e832 | Alexander Graf | if (bp->pc == dc.pc) {
|
5128 | e023e832 | Alexander Graf | gen_debug(&dc); |
5129 | e023e832 | Alexander Graf | break;
|
5130 | e023e832 | Alexander Graf | } |
5131 | e023e832 | Alexander Graf | } |
5132 | e023e832 | Alexander Graf | } |
5133 | e023e832 | Alexander Graf | if (search_pc) {
|
5134 | e023e832 | Alexander Graf | j = gen_opc_ptr - gen_opc_buf; |
5135 | e023e832 | Alexander Graf | if (lj < j) {
|
5136 | e023e832 | Alexander Graf | lj++; |
5137 | e023e832 | Alexander Graf | while (lj < j) {
|
5138 | e023e832 | Alexander Graf | gen_opc_instr_start[lj++] = 0;
|
5139 | e023e832 | Alexander Graf | } |
5140 | e023e832 | Alexander Graf | } |
5141 | e023e832 | Alexander Graf | gen_opc_pc[lj] = dc.pc; |
5142 | e023e832 | Alexander Graf | gen_opc_cc_op[lj] = dc.cc_op; |
5143 | e023e832 | Alexander Graf | gen_opc_instr_start[lj] = 1;
|
5144 | e023e832 | Alexander Graf | gen_opc_icount[lj] = num_insns; |
5145 | e023e832 | Alexander Graf | } |
5146 | e023e832 | Alexander Graf | if (num_insns + 1 == max_insns && (tb->cflags & CF_LAST_IO)) { |
5147 | e023e832 | Alexander Graf | gen_io_start(); |
5148 | e023e832 | Alexander Graf | } |
5149 | e023e832 | Alexander Graf | #if defined(S390X_DEBUG_DISAS_VERBOSE)
|
5150 | e023e832 | Alexander Graf | LOG_DISAS("pc " TARGET_FMT_lx "\n", |
5151 | e023e832 | Alexander Graf | dc.pc); |
5152 | e023e832 | Alexander Graf | #endif
|
5153 | e023e832 | Alexander Graf | disas_s390_insn(&dc); |
5154 | e023e832 | Alexander Graf | |
5155 | e023e832 | Alexander Graf | num_insns++; |
5156 | e023e832 | Alexander Graf | if (env->singlestep_enabled) {
|
5157 | e023e832 | Alexander Graf | gen_debug(&dc); |
5158 | e023e832 | Alexander Graf | } |
5159 | e023e832 | Alexander Graf | } while (!dc.is_jmp && gen_opc_ptr < gen_opc_end && dc.pc < next_page_start
|
5160 | e023e832 | Alexander Graf | && num_insns < max_insns && !env->singlestep_enabled |
5161 | e023e832 | Alexander Graf | && !singlestep); |
5162 | e023e832 | Alexander Graf | |
5163 | e023e832 | Alexander Graf | if (!dc.is_jmp) {
|
5164 | e023e832 | Alexander Graf | update_psw_addr(&dc); |
5165 | e023e832 | Alexander Graf | } |
5166 | e023e832 | Alexander Graf | |
5167 | e023e832 | Alexander Graf | if (singlestep && dc.cc_op != CC_OP_DYNAMIC) {
|
5168 | e023e832 | Alexander Graf | gen_op_calc_cc(&dc); |
5169 | e023e832 | Alexander Graf | } else {
|
5170 | e023e832 | Alexander Graf | /* next TB starts off with CC_OP_DYNAMIC, so make sure the cc op type
|
5171 | e023e832 | Alexander Graf | is in env */
|
5172 | e023e832 | Alexander Graf | gen_op_set_cc_op(&dc); |
5173 | e023e832 | Alexander Graf | } |
5174 | e023e832 | Alexander Graf | |
5175 | e023e832 | Alexander Graf | if (tb->cflags & CF_LAST_IO) {
|
5176 | e023e832 | Alexander Graf | gen_io_end(); |
5177 | e023e832 | Alexander Graf | } |
5178 | e023e832 | Alexander Graf | /* Generate the return instruction */
|
5179 | e023e832 | Alexander Graf | if (dc.is_jmp != DISAS_TB_JUMP) {
|
5180 | e023e832 | Alexander Graf | tcg_gen_exit_tb(0);
|
5181 | e023e832 | Alexander Graf | } |
5182 | e023e832 | Alexander Graf | gen_icount_end(tb, num_insns); |
5183 | e023e832 | Alexander Graf | *gen_opc_ptr = INDEX_op_end; |
5184 | e023e832 | Alexander Graf | if (search_pc) {
|
5185 | e023e832 | Alexander Graf | j = gen_opc_ptr - gen_opc_buf; |
5186 | e023e832 | Alexander Graf | lj++; |
5187 | e023e832 | Alexander Graf | while (lj <= j) {
|
5188 | e023e832 | Alexander Graf | gen_opc_instr_start[lj++] = 0;
|
5189 | e023e832 | Alexander Graf | } |
5190 | e023e832 | Alexander Graf | } else {
|
5191 | e023e832 | Alexander Graf | tb->size = dc.pc - pc_start; |
5192 | e023e832 | Alexander Graf | tb->icount = num_insns; |
5193 | e023e832 | Alexander Graf | } |
5194 | e023e832 | Alexander Graf | #if defined(S390X_DEBUG_DISAS)
|
5195 | e023e832 | Alexander Graf | log_cpu_state_mask(CPU_LOG_TB_CPU, env, 0);
|
5196 | e023e832 | Alexander Graf | if (qemu_loglevel_mask(CPU_LOG_TB_IN_ASM)) {
|
5197 | e023e832 | Alexander Graf | qemu_log("IN: %s\n", lookup_symbol(pc_start));
|
5198 | e023e832 | Alexander Graf | log_target_disas(pc_start, dc.pc - pc_start, 1);
|
5199 | e023e832 | Alexander Graf | qemu_log("\n");
|
5200 | e023e832 | Alexander Graf | } |
5201 | e023e832 | Alexander Graf | #endif
|
5202 | e023e832 | Alexander Graf | } |
5203 | e023e832 | Alexander Graf | |
5204 | e023e832 | Alexander Graf | void gen_intermediate_code (CPUState *env, struct TranslationBlock *tb) |
5205 | e023e832 | Alexander Graf | { |
5206 | e023e832 | Alexander Graf | gen_intermediate_code_internal(env, tb, 0);
|
5207 | e023e832 | Alexander Graf | } |
5208 | e023e832 | Alexander Graf | |
5209 | e023e832 | Alexander Graf | void gen_intermediate_code_pc (CPUState *env, struct TranslationBlock *tb) |
5210 | e023e832 | Alexander Graf | { |
5211 | e023e832 | Alexander Graf | gen_intermediate_code_internal(env, tb, 1);
|
5212 | e023e832 | Alexander Graf | } |
5213 | e023e832 | Alexander Graf | |
5214 | e023e832 | Alexander Graf | void restore_state_to_opc(CPUState *env, TranslationBlock *tb, int pc_pos) |
5215 | e023e832 | Alexander Graf | { |
5216 | e023e832 | Alexander Graf | int cc_op;
|
5217 | e023e832 | Alexander Graf | env->psw.addr = gen_opc_pc[pc_pos]; |
5218 | e023e832 | Alexander Graf | cc_op = gen_opc_cc_op[pc_pos]; |
5219 | e023e832 | Alexander Graf | if ((cc_op != CC_OP_DYNAMIC) && (cc_op != CC_OP_STATIC)) {
|
5220 | e023e832 | Alexander Graf | env->cc_op = cc_op; |
5221 | e023e832 | Alexander Graf | } |
5222 | 10ec5117 | Alexander Graf | } |