Commit 8911f5019c06693dbca07901bc97423f82a4bcc4
1 parent
e429073d
Fix i32/i64/TL mismatches
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4100 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
149 additions
and
148 deletions
target-sparc/translate.c
... | ... | @@ -52,7 +52,7 @@ static TCGv cpu_psr, cpu_fsr, cpu_pc, cpu_npc, cpu_gregs[8]; |
52 | 52 | static TCGv cpu_xcc; |
53 | 53 | #endif |
54 | 54 | /* local register indexes (only used inside old micro ops) */ |
55 | -static TCGv cpu_tmp0; | |
55 | +static TCGv cpu_tmp0, cpu_tmp32, cpu_tmp64; | |
56 | 56 | |
57 | 57 | typedef struct DisasContext { |
58 | 58 | target_ulong pc; /* current Program Counter: integer or DYNAMIC_PC */ |
... | ... | @@ -117,81 +117,81 @@ static void disas_sparc_insn(DisasContext * dc); |
117 | 117 | /* floating point registers moves */ |
118 | 118 | static void gen_op_load_fpr_FT0(unsigned int src) |
119 | 119 | { |
120 | - tcg_gen_ld_i32(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, fpr[src])); | |
121 | - tcg_gen_st_i32(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, ft0)); | |
120 | + tcg_gen_ld_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, fpr[src])); | |
121 | + tcg_gen_st_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, ft0)); | |
122 | 122 | } |
123 | 123 | |
124 | 124 | static void gen_op_load_fpr_FT1(unsigned int src) |
125 | 125 | { |
126 | - tcg_gen_ld_i32(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, fpr[src])); | |
127 | - tcg_gen_st_i32(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, ft1)); | |
126 | + tcg_gen_ld_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, fpr[src])); | |
127 | + tcg_gen_st_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, ft1)); | |
128 | 128 | } |
129 | 129 | |
130 | 130 | static void gen_op_store_FT0_fpr(unsigned int dst) |
131 | 131 | { |
132 | - tcg_gen_ld_i32(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, ft0)); | |
133 | - tcg_gen_st_i32(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, fpr[dst])); | |
132 | + tcg_gen_ld_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, ft0)); | |
133 | + tcg_gen_st_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, fpr[dst])); | |
134 | 134 | } |
135 | 135 | |
136 | 136 | static void gen_op_load_fpr_DT0(unsigned int src) |
137 | 137 | { |
138 | - tcg_gen_ld_i32(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, fpr[src])); | |
139 | - tcg_gen_st_i32(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, dt0) + offsetof(CPU_DoubleU, l.upper)); | |
140 | - tcg_gen_ld_i32(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, fpr[src + 1])); | |
141 | - tcg_gen_st_i32(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, dt0) + offsetof(CPU_DoubleU, l.lower)); | |
138 | + tcg_gen_ld_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, fpr[src])); | |
139 | + tcg_gen_st_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, dt0) + offsetof(CPU_DoubleU, l.upper)); | |
140 | + tcg_gen_ld_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, fpr[src + 1])); | |
141 | + tcg_gen_st_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, dt0) + offsetof(CPU_DoubleU, l.lower)); | |
142 | 142 | } |
143 | 143 | |
144 | 144 | static void gen_op_load_fpr_DT1(unsigned int src) |
145 | 145 | { |
146 | - tcg_gen_ld_i32(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, fpr[src])); | |
147 | - tcg_gen_st_i32(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, dt1) + offsetof(CPU_DoubleU, l.upper)); | |
148 | - tcg_gen_ld_i32(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, fpr[src + 1])); | |
149 | - tcg_gen_st_i32(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, dt1) + offsetof(CPU_DoubleU, l.lower)); | |
146 | + tcg_gen_ld_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, fpr[src])); | |
147 | + tcg_gen_st_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, dt1) + offsetof(CPU_DoubleU, l.upper)); | |
148 | + tcg_gen_ld_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, fpr[src + 1])); | |
149 | + tcg_gen_st_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, dt1) + offsetof(CPU_DoubleU, l.lower)); | |
150 | 150 | } |
151 | 151 | |
152 | 152 | static void gen_op_store_DT0_fpr(unsigned int dst) |
153 | 153 | { |
154 | - tcg_gen_ld_i32(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, dt0) + offsetof(CPU_DoubleU, l.upper)); | |
155 | - tcg_gen_st_i32(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, fpr[dst])); | |
156 | - tcg_gen_ld_i32(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, dt0) + offsetof(CPU_DoubleU, l.lower)); | |
157 | - tcg_gen_st_i32(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, fpr[dst + 1])); | |
154 | + tcg_gen_ld_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, dt0) + offsetof(CPU_DoubleU, l.upper)); | |
155 | + tcg_gen_st_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, fpr[dst])); | |
156 | + tcg_gen_ld_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, dt0) + offsetof(CPU_DoubleU, l.lower)); | |
157 | + tcg_gen_st_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, fpr[dst + 1])); | |
158 | 158 | } |
159 | 159 | |
160 | 160 | #ifdef CONFIG_USER_ONLY |
161 | 161 | static void gen_op_load_fpr_QT0(unsigned int src) |
162 | 162 | { |
163 | - tcg_gen_ld_i32(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, fpr[src])); | |
164 | - tcg_gen_st_i32(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, qt0) + offsetof(CPU_QuadU, l.upmost)); | |
165 | - tcg_gen_ld_i32(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, fpr[src + 1])); | |
166 | - tcg_gen_st_i32(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, qt0) + offsetof(CPU_QuadU, l.upper)); | |
167 | - tcg_gen_ld_i32(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, fpr[src + 2])); | |
168 | - tcg_gen_st_i32(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, qt0) + offsetof(CPU_QuadU, l.lower)); | |
169 | - tcg_gen_ld_i32(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, fpr[src + 3])); | |
170 | - tcg_gen_st_i32(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, qt0) + offsetof(CPU_QuadU, l.lowest)); | |
163 | + tcg_gen_ld_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, fpr[src])); | |
164 | + tcg_gen_st_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, qt0) + offsetof(CPU_QuadU, l.upmost)); | |
165 | + tcg_gen_ld_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, fpr[src + 1])); | |
166 | + tcg_gen_st_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, qt0) + offsetof(CPU_QuadU, l.upper)); | |
167 | + tcg_gen_ld_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, fpr[src + 2])); | |
168 | + tcg_gen_st_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, qt0) + offsetof(CPU_QuadU, l.lower)); | |
169 | + tcg_gen_ld_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, fpr[src + 3])); | |
170 | + tcg_gen_st_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, qt0) + offsetof(CPU_QuadU, l.lowest)); | |
171 | 171 | } |
172 | 172 | |
173 | 173 | static void gen_op_load_fpr_QT1(unsigned int src) |
174 | 174 | { |
175 | - tcg_gen_ld_i32(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, fpr[src])); | |
176 | - tcg_gen_st_i32(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, qt1) + offsetof(CPU_QuadU, l.upmost)); | |
177 | - tcg_gen_ld_i32(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, fpr[src + 1])); | |
178 | - tcg_gen_st_i32(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, qt1) + offsetof(CPU_QuadU, l.upper)); | |
179 | - tcg_gen_ld_i32(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, fpr[src + 2])); | |
180 | - tcg_gen_st_i32(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, qt1) + offsetof(CPU_QuadU, l.lower)); | |
181 | - tcg_gen_ld_i32(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, fpr[src + 3])); | |
182 | - tcg_gen_st_i32(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, qt1) + offsetof(CPU_QuadU, l.lowest)); | |
175 | + tcg_gen_ld_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, fpr[src])); | |
176 | + tcg_gen_st_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, qt1) + offsetof(CPU_QuadU, l.upmost)); | |
177 | + tcg_gen_ld_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, fpr[src + 1])); | |
178 | + tcg_gen_st_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, qt1) + offsetof(CPU_QuadU, l.upper)); | |
179 | + tcg_gen_ld_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, fpr[src + 2])); | |
180 | + tcg_gen_st_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, qt1) + offsetof(CPU_QuadU, l.lower)); | |
181 | + tcg_gen_ld_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, fpr[src + 3])); | |
182 | + tcg_gen_st_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, qt1) + offsetof(CPU_QuadU, l.lowest)); | |
183 | 183 | } |
184 | 184 | |
185 | 185 | static void gen_op_store_QT0_fpr(unsigned int dst) |
186 | 186 | { |
187 | - tcg_gen_ld_i32(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, qt0) + offsetof(CPU_QuadU, l.upmost)); | |
188 | - tcg_gen_st_i32(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, fpr[dst])); | |
189 | - tcg_gen_ld_i32(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, qt0) + offsetof(CPU_QuadU, l.upper)); | |
190 | - tcg_gen_st_i32(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, fpr[dst + 1])); | |
191 | - tcg_gen_ld_i32(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, qt0) + offsetof(CPU_QuadU, l.lower)); | |
192 | - tcg_gen_st_i32(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, fpr[dst + 2])); | |
193 | - tcg_gen_ld_i32(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, qt0) + offsetof(CPU_QuadU, l.lowest)); | |
194 | - tcg_gen_st_i32(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, fpr[dst + 3])); | |
187 | + tcg_gen_ld_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, qt0) + offsetof(CPU_QuadU, l.upmost)); | |
188 | + tcg_gen_st_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, fpr[dst])); | |
189 | + tcg_gen_ld_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, qt0) + offsetof(CPU_QuadU, l.upper)); | |
190 | + tcg_gen_st_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, fpr[dst + 1])); | |
191 | + tcg_gen_ld_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, qt0) + offsetof(CPU_QuadU, l.lower)); | |
192 | + tcg_gen_st_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, fpr[dst + 2])); | |
193 | + tcg_gen_ld_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, qt0) + offsetof(CPU_QuadU, l.lowest)); | |
194 | + tcg_gen_st_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, fpr[dst + 3])); | |
195 | 195 | } |
196 | 196 | #endif |
197 | 197 | |
... | ... | @@ -233,7 +233,7 @@ OP_LD_TABLE(lddf); |
233 | 233 | #endif |
234 | 234 | |
235 | 235 | #ifdef TARGET_ABI32 |
236 | -#define ABI32_MASK(addr) tcg_gen_andi_i64(addr, addr, 0xffffffffULL); | |
236 | +#define ABI32_MASK(addr) tcg_gen_andi_tl(addr, addr, 0xffffffffULL); | |
237 | 237 | #else |
238 | 238 | #define ABI32_MASK(addr) |
239 | 239 | #endif |
... | ... | @@ -294,12 +294,14 @@ static inline void gen_movl_T1_reg(int reg) |
294 | 294 | |
295 | 295 | static inline void gen_op_movl_T0_env(size_t offset) |
296 | 296 | { |
297 | - tcg_gen_ld_i32(cpu_T[0], cpu_env, offset); | |
297 | + tcg_gen_ld_i32(cpu_tmp32, cpu_env, offset); | |
298 | + tcg_gen_ext_i32_tl(cpu_T[0], cpu_tmp32); | |
298 | 299 | } |
299 | 300 | |
300 | 301 | static inline void gen_op_movl_env_T0(size_t offset) |
301 | 302 | { |
302 | - tcg_gen_st_i32(cpu_T[0], cpu_env, offset); | |
303 | + tcg_gen_trunc_tl_i32(cpu_tmp32, cpu_T[0]); | |
304 | + tcg_gen_st_i32(cpu_tmp32, cpu_env, offset); | |
303 | 305 | } |
304 | 306 | |
305 | 307 | static inline void gen_op_movtl_T0_env(size_t offset) |
... | ... | @@ -361,32 +363,36 @@ static inline void gen_goto_tb(DisasContext *s, int tb_num, |
361 | 363 | // XXX suboptimal |
362 | 364 | static inline void gen_mov_reg_N(TCGv reg, TCGv src) |
363 | 365 | { |
364 | - tcg_gen_shri_i32(reg, src, 23); | |
366 | + tcg_gen_extu_i32_tl(reg, src); | |
367 | + tcg_gen_shri_tl(reg, reg, 23); | |
365 | 368 | tcg_gen_andi_tl(reg, reg, 0x1); |
366 | 369 | } |
367 | 370 | |
368 | 371 | static inline void gen_mov_reg_Z(TCGv reg, TCGv src) |
369 | 372 | { |
370 | - tcg_gen_shri_i32(reg, src, 22); | |
373 | + tcg_gen_extu_i32_tl(reg, src); | |
374 | + tcg_gen_shri_tl(reg, reg, 22); | |
371 | 375 | tcg_gen_andi_tl(reg, reg, 0x1); |
372 | 376 | } |
373 | 377 | |
374 | 378 | static inline void gen_mov_reg_V(TCGv reg, TCGv src) |
375 | 379 | { |
376 | - tcg_gen_shri_i32(reg, src, 21); | |
380 | + tcg_gen_extu_i32_tl(reg, src); | |
381 | + tcg_gen_shri_tl(reg, reg, 21); | |
377 | 382 | tcg_gen_andi_tl(reg, reg, 0x1); |
378 | 383 | } |
379 | 384 | |
380 | 385 | static inline void gen_mov_reg_C(TCGv reg, TCGv src) |
381 | 386 | { |
382 | - tcg_gen_shri_i32(reg, src, 20); | |
387 | + tcg_gen_extu_i32_tl(reg, src); | |
388 | + tcg_gen_shri_tl(reg, reg, 20); | |
383 | 389 | tcg_gen_andi_tl(reg, reg, 0x1); |
384 | 390 | } |
385 | 391 | |
386 | 392 | static inline void gen_op_exception(int exception) |
387 | 393 | { |
388 | - tcg_gen_movi_i32(cpu_tmp0, exception); | |
389 | - tcg_gen_helper_0_1(raise_exception, cpu_tmp0); | |
394 | + tcg_gen_movi_i32(cpu_tmp32, exception); | |
395 | + tcg_gen_helper_0_1(raise_exception, cpu_tmp32); | |
390 | 396 | } |
391 | 397 | |
392 | 398 | static inline void gen_cc_clear(void) |
... | ... | @@ -405,14 +411,18 @@ static inline void gen_cc_clear(void) |
405 | 411 | */ |
406 | 412 | static inline void gen_cc_NZ(TCGv dst) |
407 | 413 | { |
414 | + TCGv r_temp; | |
408 | 415 | int l1, l2; |
409 | 416 | |
410 | 417 | l1 = gen_new_label(); |
411 | 418 | l2 = gen_new_label(); |
412 | - tcg_gen_brcond_i32(TCG_COND_NE, dst, tcg_const_i32(0), l1); | |
419 | + r_temp = tcg_temp_new(TCG_TYPE_TL); | |
420 | + tcg_gen_andi_tl(r_temp, dst, 0xffffffffULL); | |
421 | + tcg_gen_brcond_tl(TCG_COND_NE, r_temp, tcg_const_tl(0), l1); | |
413 | 422 | tcg_gen_ori_i32(cpu_psr, cpu_psr, PSR_ZERO); |
414 | 423 | gen_set_label(l1); |
415 | - tcg_gen_brcond_i32(TCG_COND_GE, dst, tcg_const_i32(0), l2); | |
424 | + tcg_gen_andi_tl(r_temp, dst, 0xffffffffULL); | |
425 | + tcg_gen_brcond_tl(TCG_COND_GE, r_temp, tcg_const_tl(0), l2); | |
416 | 426 | tcg_gen_ori_i32(cpu_psr, cpu_psr, PSR_NEG); |
417 | 427 | gen_set_label(l2); |
418 | 428 | #ifdef TARGET_SPARC64 |
... | ... | @@ -437,10 +447,13 @@ static inline void gen_cc_NZ(TCGv dst) |
437 | 447 | */ |
438 | 448 | static inline void gen_cc_C_add(TCGv dst, TCGv src1) |
439 | 449 | { |
450 | + TCGv r_temp; | |
440 | 451 | int l1; |
441 | 452 | |
442 | 453 | l1 = gen_new_label(); |
443 | - tcg_gen_brcond_i32(TCG_COND_GEU, dst, src1, l1); | |
454 | + r_temp = tcg_temp_new(TCG_TYPE_TL); | |
455 | + tcg_gen_andi_tl(r_temp, dst, 0xffffffffULL); | |
456 | + tcg_gen_brcond_tl(TCG_COND_GEU, dst, src1, l1); | |
444 | 457 | tcg_gen_ori_i32(cpu_psr, cpu_psr, PSR_CARRY); |
445 | 458 | gen_set_label(l1); |
446 | 459 | #ifdef TARGET_SPARC64 |
... | ... | @@ -472,7 +485,7 @@ static inline void gen_cc_V_add(TCGv dst, TCGv src1, TCGv src2) |
472 | 485 | tcg_gen_xor_tl(cpu_tmp0, src1, dst); |
473 | 486 | tcg_gen_and_tl(r_temp, r_temp, cpu_tmp0); |
474 | 487 | tcg_gen_andi_tl(r_temp, r_temp, (1 << 31)); |
475 | - tcg_gen_brcond_i32(TCG_COND_EQ, r_temp, tcg_const_i32(0), l1); | |
488 | + tcg_gen_brcond_tl(TCG_COND_EQ, r_temp, tcg_const_tl(0), l1); | |
476 | 489 | tcg_gen_ori_i32(cpu_psr, cpu_psr, PSR_OVF); |
477 | 490 | gen_set_label(l1); |
478 | 491 | #ifdef TARGET_SPARC64 |
... | ... | @@ -506,7 +519,7 @@ static inline void gen_add_tv(TCGv dst, TCGv src1, TCGv src2) |
506 | 519 | tcg_gen_xor_tl(cpu_tmp0, src1, dst); |
507 | 520 | tcg_gen_and_tl(r_temp, r_temp, cpu_tmp0); |
508 | 521 | tcg_gen_andi_tl(r_temp, r_temp, (1 << 31)); |
509 | - tcg_gen_brcond_i32(TCG_COND_EQ, r_temp, tcg_const_i32(0), l1); | |
522 | + tcg_gen_brcond_tl(TCG_COND_EQ, r_temp, tcg_const_tl(0), l1); | |
510 | 523 | gen_op_exception(TT_TOVF); |
511 | 524 | gen_set_label(l1); |
512 | 525 | #ifdef TARGET_SPARC64 |
... | ... | @@ -602,10 +615,15 @@ static inline void gen_op_tadd_T1_T0_ccTV(void) |
602 | 615 | */ |
603 | 616 | static inline void gen_cc_C_sub(TCGv src1, TCGv src2) |
604 | 617 | { |
618 | + TCGv r_temp1, r_temp2; | |
605 | 619 | int l1; |
606 | 620 | |
607 | 621 | l1 = gen_new_label(); |
608 | - tcg_gen_brcond_i32(TCG_COND_GEU, src1, src2, l1); | |
622 | + r_temp1 = tcg_temp_new(TCG_TYPE_TL); | |
623 | + r_temp2 = tcg_temp_new(TCG_TYPE_TL); | |
624 | + tcg_gen_andi_tl(r_temp1, src1, 0xffffffffULL); | |
625 | + tcg_gen_andi_tl(r_temp2, src2, 0xffffffffULL); | |
626 | + tcg_gen_brcond_tl(TCG_COND_GEU, r_temp1, r_temp2, l1); | |
609 | 627 | tcg_gen_ori_i32(cpu_psr, cpu_psr, PSR_CARRY); |
610 | 628 | gen_set_label(l1); |
611 | 629 | #ifdef TARGET_SPARC64 |
... | ... | @@ -636,7 +654,7 @@ static inline void gen_cc_V_sub(TCGv dst, TCGv src1, TCGv src2) |
636 | 654 | tcg_gen_xor_tl(cpu_tmp0, src1, dst); |
637 | 655 | tcg_gen_and_tl(r_temp, r_temp, cpu_tmp0); |
638 | 656 | tcg_gen_andi_tl(r_temp, r_temp, (1 << 31)); |
639 | - tcg_gen_brcond_i32(TCG_COND_EQ, r_temp, tcg_const_i32(0), l1); | |
657 | + tcg_gen_brcond_tl(TCG_COND_EQ, r_temp, tcg_const_tl(0), l1); | |
640 | 658 | tcg_gen_ori_i32(cpu_psr, cpu_psr, PSR_OVF); |
641 | 659 | gen_set_label(l1); |
642 | 660 | #ifdef TARGET_SPARC64 |
... | ... | @@ -668,7 +686,7 @@ static inline void gen_sub_tv(TCGv dst, TCGv src1, TCGv src2) |
668 | 686 | tcg_gen_xor_tl(cpu_tmp0, src1, dst); |
669 | 687 | tcg_gen_and_tl(r_temp, r_temp, cpu_tmp0); |
670 | 688 | tcg_gen_andi_tl(r_temp, r_temp, (1 << 31)); |
671 | - tcg_gen_brcond_i32(TCG_COND_EQ, r_temp, tcg_const_i32(0), l1); | |
689 | + tcg_gen_brcond_tl(TCG_COND_EQ, r_temp, tcg_const_tl(0), l1); | |
672 | 690 | gen_op_exception(TT_TOVF); |
673 | 691 | gen_set_label(l1); |
674 | 692 | #ifdef TARGET_SPARC64 |
... | ... | @@ -746,9 +764,10 @@ static inline void gen_op_mulscc_T1_T0(void) |
746 | 764 | if (!(env->y & 1)) |
747 | 765 | T1 = 0; |
748 | 766 | */ |
749 | - tcg_gen_ld_i32(r_temp, cpu_env, offsetof(CPUSPARCState, y)); | |
750 | - tcg_gen_andi_i32(r_temp, r_temp, 0x1); | |
751 | - tcg_gen_brcond_i32(TCG_COND_EQ, r_temp, tcg_const_tl(0), l1); | |
767 | + tcg_gen_ld_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, y)); | |
768 | + tcg_gen_extu_i32_tl(r_temp, cpu_tmp32); | |
769 | + tcg_gen_andi_tl(r_temp, r_temp, 0x1); | |
770 | + tcg_gen_brcond_tl(TCG_COND_EQ, r_temp, tcg_const_tl(0), l1); | |
752 | 771 | tcg_gen_mov_tl(cpu_cc_src2, cpu_T[1]); |
753 | 772 | tcg_gen_br(l2); |
754 | 773 | gen_set_label(l1); |
... | ... | @@ -757,11 +776,11 @@ static inline void gen_op_mulscc_T1_T0(void) |
757 | 776 | |
758 | 777 | // b2 = T0 & 1; |
759 | 778 | // env->y = (b2 << 31) | (env->y >> 1); |
760 | - tcg_gen_shli_i32(r_temp, cpu_T[0], 31); | |
761 | - tcg_gen_ld_i32(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, y)); | |
762 | - tcg_gen_shri_i32(cpu_tmp0, cpu_tmp0, 1); | |
763 | - tcg_gen_or_i32(cpu_tmp0, cpu_tmp0, r_temp); | |
764 | - tcg_gen_st_i32(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, y)); | |
779 | + tcg_gen_shli_tl(r_temp, cpu_T[0], 31); | |
780 | + tcg_gen_ld_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, y)); | |
781 | + tcg_gen_shri_i32(cpu_tmp32, cpu_tmp32, 1); | |
782 | + tcg_gen_or_i32(cpu_tmp32, cpu_tmp32, r_temp); | |
783 | + tcg_gen_st_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, y)); | |
765 | 784 | |
766 | 785 | // b1 = N ^ V; |
767 | 786 | gen_mov_reg_N(cpu_tmp0, cpu_psr); |
... | ... | @@ -791,8 +810,8 @@ static inline void gen_op_umul_T1_T0(void) |
791 | 810 | r_temp = tcg_temp_new(TCG_TYPE_I64); |
792 | 811 | r_temp2 = tcg_temp_new(TCG_TYPE_I64); |
793 | 812 | |
794 | - tcg_gen_extu_i32_i64(r_temp, cpu_T[1]); | |
795 | - tcg_gen_extu_i32_i64(r_temp2, cpu_T[0]); | |
813 | + tcg_gen_extu_tl_i64(r_temp, cpu_T[1]); | |
814 | + tcg_gen_extu_tl_i64(r_temp2, cpu_T[0]); | |
796 | 815 | tcg_gen_mul_i64(r_temp2, r_temp, r_temp2); |
797 | 816 | |
798 | 817 | tcg_gen_shri_i64(r_temp, r_temp2, 32); |
... | ... | @@ -801,7 +820,7 @@ static inline void gen_op_umul_T1_T0(void) |
801 | 820 | #ifdef TARGET_SPARC64 |
802 | 821 | tcg_gen_mov_i64(cpu_T[0], r_temp2); |
803 | 822 | #else |
804 | - tcg_gen_trunc_i64_i32(cpu_T[0], r_temp2); | |
823 | + tcg_gen_trunc_i64_tl(cpu_T[0], r_temp2); | |
805 | 824 | #endif |
806 | 825 | |
807 | 826 | tcg_gen_discard_i64(r_temp); |
... | ... | @@ -815,8 +834,8 @@ static inline void gen_op_smul_T1_T0(void) |
815 | 834 | r_temp = tcg_temp_new(TCG_TYPE_I64); |
816 | 835 | r_temp2 = tcg_temp_new(TCG_TYPE_I64); |
817 | 836 | |
818 | - tcg_gen_ext_i32_i64(r_temp, cpu_T[1]); | |
819 | - tcg_gen_ext_i32_i64(r_temp2, cpu_T[0]); | |
837 | + tcg_gen_ext_tl_i64(r_temp, cpu_T[1]); | |
838 | + tcg_gen_ext_tl_i64(r_temp2, cpu_T[0]); | |
820 | 839 | tcg_gen_mul_i64(r_temp2, r_temp, r_temp2); |
821 | 840 | |
822 | 841 | tcg_gen_shri_i64(r_temp, r_temp2, 32); |
... | ... | @@ -825,7 +844,7 @@ static inline void gen_op_smul_T1_T0(void) |
825 | 844 | #ifdef TARGET_SPARC64 |
826 | 845 | tcg_gen_mov_i64(cpu_T[0], r_temp2); |
827 | 846 | #else |
828 | - tcg_gen_trunc_i64_i32(cpu_T[0], r_temp2); | |
847 | + tcg_gen_trunc_i64_tl(cpu_T[0], r_temp2); | |
829 | 848 | #endif |
830 | 849 | |
831 | 850 | tcg_gen_discard_i64(r_temp); |
... | ... | @@ -843,12 +862,12 @@ static inline void gen_op_sdiv_T1_T0(void) |
843 | 862 | } |
844 | 863 | |
845 | 864 | #ifdef TARGET_SPARC64 |
846 | -static inline void gen_trap_ifdivzero_i64(TCGv divisor) | |
865 | +static inline void gen_trap_ifdivzero_tl(TCGv divisor) | |
847 | 866 | { |
848 | 867 | int l1; |
849 | 868 | |
850 | 869 | l1 = gen_new_label(); |
851 | - tcg_gen_brcond_i64(TCG_COND_NE, divisor, tcg_const_tl(0), l1); | |
870 | + tcg_gen_brcond_tl(TCG_COND_NE, divisor, tcg_const_tl(0), l1); | |
852 | 871 | gen_op_exception(TT_DIV_ZERO); |
853 | 872 | gen_set_label(l1); |
854 | 873 | } |
... | ... | @@ -859,9 +878,9 @@ static inline void gen_op_sdivx_T1_T0(void) |
859 | 878 | |
860 | 879 | l1 = gen_new_label(); |
861 | 880 | l2 = gen_new_label(); |
862 | - gen_trap_ifdivzero_i64(cpu_T[1]); | |
863 | - tcg_gen_brcond_i64(TCG_COND_NE, cpu_T[0], tcg_const_i64(INT64_MIN), l1); | |
864 | - tcg_gen_brcond_i64(TCG_COND_NE, cpu_T[1], tcg_const_i64(-1), l1); | |
881 | + gen_trap_ifdivzero_tl(cpu_T[1]); | |
882 | + tcg_gen_brcond_tl(TCG_COND_NE, cpu_T[0], tcg_const_tl(INT64_MIN), l1); | |
883 | + tcg_gen_brcond_tl(TCG_COND_NE, cpu_T[1], tcg_const_tl(-1), l1); | |
865 | 884 | tcg_gen_movi_i64(cpu_T[0], INT64_MIN); |
866 | 885 | tcg_gen_br(l2); |
867 | 886 | gen_set_label(l1); |
... | ... | @@ -1018,14 +1037,16 @@ static inline void gen_op_eval_bvc(TCGv dst, TCGv src) |
1018 | 1037 | static inline void gen_mov_reg_FCC0(TCGv reg, TCGv src, |
1019 | 1038 | unsigned int fcc_offset) |
1020 | 1039 | { |
1021 | - tcg_gen_shri_i32(reg, src, 10 + fcc_offset); | |
1040 | + tcg_gen_extu_i32_tl(reg, src); | |
1041 | + tcg_gen_shri_tl(reg, reg, 10 + fcc_offset); | |
1022 | 1042 | tcg_gen_andi_tl(reg, reg, 0x1); |
1023 | 1043 | } |
1024 | 1044 | |
1025 | 1045 | static inline void gen_mov_reg_FCC1(TCGv reg, TCGv src, |
1026 | 1046 | unsigned int fcc_offset) |
1027 | 1047 | { |
1028 | - tcg_gen_shri_i32(reg, src, 11 + fcc_offset); | |
1048 | + tcg_gen_extu_i32_tl(reg, src); | |
1049 | + tcg_gen_shri_tl(reg, reg, 11 + fcc_offset); | |
1029 | 1050 | tcg_gen_andi_tl(reg, reg, 0x1); |
1030 | 1051 | } |
1031 | 1052 | |
... | ... | @@ -1753,41 +1774,37 @@ static inline void gen_swap_asi(int insn) |
1753 | 1774 | tcg_const_i32(4), tcg_const_i32(0)); |
1754 | 1775 | tcg_gen_helper_0_4(helper_st_asi, cpu_T[0], r_temp, r_asi, |
1755 | 1776 | tcg_const_i32(4)); |
1756 | - tcg_gen_mov_i32(cpu_T[1], r_temp); | |
1777 | + tcg_gen_extu_i32_tl(cpu_T[1], r_temp); | |
1757 | 1778 | tcg_gen_discard_i32(r_asi); |
1758 | 1779 | tcg_gen_discard_i32(r_temp); |
1759 | 1780 | } |
1760 | 1781 | |
1761 | 1782 | static inline void gen_ldda_asi(int insn) |
1762 | 1783 | { |
1763 | - TCGv r_dword, r_asi; | |
1784 | + TCGv r_asi; | |
1764 | 1785 | |
1765 | - r_dword = tcg_temp_new(TCG_TYPE_I64); | |
1766 | 1786 | r_asi = gen_get_asi(insn, cpu_T[0]); |
1767 | - tcg_gen_helper_1_4(helper_ld_asi, r_dword, cpu_T[0], r_asi, | |
1787 | + tcg_gen_helper_1_4(helper_ld_asi, cpu_tmp64, cpu_T[0], r_asi, | |
1768 | 1788 | tcg_const_i32(8), tcg_const_i32(0)); |
1769 | - tcg_gen_trunc_i64_i32(cpu_T[0], r_dword); | |
1770 | - tcg_gen_shri_i64(r_dword, r_dword, 32); | |
1771 | - tcg_gen_trunc_i64_i32(cpu_T[1], r_dword); | |
1789 | + tcg_gen_andi_i64(cpu_T[0], cpu_tmp64, 0xffffffffULL); | |
1790 | + tcg_gen_shri_i64(cpu_tmp64, cpu_tmp64, 32); | |
1791 | + tcg_gen_andi_i64(cpu_T[1], cpu_tmp64, 0xffffffffULL); | |
1772 | 1792 | tcg_gen_discard_i32(r_asi); |
1773 | - tcg_gen_discard_i64(r_dword); | |
1774 | 1793 | } |
1775 | 1794 | |
1776 | 1795 | static inline void gen_stda_asi(int insn, int rd) |
1777 | 1796 | { |
1778 | - TCGv r_dword, r_temp, r_asi; | |
1797 | + TCGv r_temp, r_asi; | |
1779 | 1798 | |
1780 | - r_dword = tcg_temp_new(TCG_TYPE_I64); | |
1781 | 1799 | r_temp = tcg_temp_new(TCG_TYPE_I32); |
1782 | 1800 | gen_movl_reg_TN(rd + 1, r_temp); |
1783 | - tcg_gen_helper_1_2(helper_pack64, r_dword, cpu_T[1], | |
1801 | + tcg_gen_helper_1_2(helper_pack64, cpu_tmp64, cpu_T[1], | |
1784 | 1802 | r_temp); |
1785 | 1803 | r_asi = gen_get_asi(insn, cpu_T[0]); |
1786 | - tcg_gen_helper_0_4(helper_st_asi, cpu_T[0], r_dword, r_asi, | |
1804 | + tcg_gen_helper_0_4(helper_st_asi, cpu_T[0], cpu_tmp64, r_asi, | |
1787 | 1805 | tcg_const_i32(8)); |
1788 | 1806 | tcg_gen_discard_i32(r_asi); |
1789 | 1807 | tcg_gen_discard_i32(r_temp); |
1790 | - tcg_gen_discard_i64(r_dword); | |
1791 | 1808 | } |
1792 | 1809 | |
1793 | 1810 | static inline void gen_cas_asi(int insn, int rd) |
... | ... | @@ -1805,15 +1822,13 @@ static inline void gen_cas_asi(int insn, int rd) |
1805 | 1822 | |
1806 | 1823 | static inline void gen_casx_asi(int insn, int rd) |
1807 | 1824 | { |
1808 | - TCGv r_val1, r_asi; | |
1825 | + TCGv r_asi; | |
1809 | 1826 | |
1810 | - r_val1 = tcg_temp_new(TCG_TYPE_I64); | |
1811 | - gen_movl_reg_TN(rd, r_val1); | |
1827 | + gen_movl_reg_TN(rd, cpu_tmp64); | |
1812 | 1828 | r_asi = gen_get_asi(insn, cpu_T[0]); |
1813 | - tcg_gen_helper_1_4(helper_casx_asi, cpu_T[1], cpu_T[0], r_val1, cpu_T[1], | |
1829 | + tcg_gen_helper_1_4(helper_casx_asi, cpu_T[1], cpu_T[0], cpu_tmp64, cpu_T[1], | |
1814 | 1830 | r_asi); |
1815 | 1831 | tcg_gen_discard_i32(r_asi); |
1816 | - tcg_gen_discard_i32(r_val1); | |
1817 | 1832 | } |
1818 | 1833 | |
1819 | 1834 | #elif !defined(CONFIG_USER_ONLY) |
... | ... | @@ -1821,27 +1836,21 @@ static inline void gen_casx_asi(int insn, int rd) |
1821 | 1836 | static inline void gen_ld_asi(int insn, int size, int sign) |
1822 | 1837 | { |
1823 | 1838 | int asi; |
1824 | - TCGv r_dword; | |
1825 | 1839 | |
1826 | - r_dword = tcg_temp_new(TCG_TYPE_I64); | |
1827 | 1840 | asi = GET_FIELD(insn, 19, 26); |
1828 | - tcg_gen_helper_1_4(helper_ld_asi, r_dword, cpu_T[0], tcg_const_i32(asi), | |
1841 | + tcg_gen_helper_1_4(helper_ld_asi, cpu_tmp64, cpu_T[0], tcg_const_i32(asi), | |
1829 | 1842 | tcg_const_i32(size), tcg_const_i32(sign)); |
1830 | - tcg_gen_trunc_i64_i32(cpu_T[1], r_dword); | |
1831 | - tcg_gen_discard_i64(r_dword); | |
1843 | + tcg_gen_trunc_i64_tl(cpu_T[1], cpu_tmp64); | |
1832 | 1844 | } |
1833 | 1845 | |
1834 | 1846 | static inline void gen_st_asi(int insn, int size) |
1835 | 1847 | { |
1836 | 1848 | int asi; |
1837 | - TCGv r_dword; | |
1838 | 1849 | |
1839 | - r_dword = tcg_temp_new(TCG_TYPE_I64); | |
1840 | - tcg_gen_extu_i32_i64(r_dword, cpu_T[1]); | |
1850 | + tcg_gen_extu_tl_i64(cpu_tmp64, cpu_T[1]); | |
1841 | 1851 | asi = GET_FIELD(insn, 19, 26); |
1842 | - tcg_gen_helper_0_4(helper_st_asi, cpu_T[0], r_dword, tcg_const_i32(asi), | |
1852 | + tcg_gen_helper_0_4(helper_st_asi, cpu_T[0], cpu_tmp64, tcg_const_i32(asi), | |
1843 | 1853 | tcg_const_i32(size)); |
1844 | - tcg_gen_discard_i64(r_dword); | |
1845 | 1854 | } |
1846 | 1855 | |
1847 | 1856 | static inline void gen_swap_asi(int insn) |
... | ... | @@ -1855,38 +1864,33 @@ static inline void gen_swap_asi(int insn) |
1855 | 1864 | tcg_const_i32(4), tcg_const_i32(0)); |
1856 | 1865 | tcg_gen_helper_0_4(helper_st_asi, cpu_T[0], cpu_T[1], tcg_const_i32(asi), |
1857 | 1866 | tcg_const_i32(4)); |
1858 | - tcg_gen_mov_i32(cpu_T[1], r_temp); | |
1867 | + tcg_gen_extu_i32_tl(cpu_T[1], r_temp); | |
1859 | 1868 | tcg_gen_discard_i32(r_temp); |
1860 | 1869 | } |
1861 | 1870 | |
1862 | 1871 | static inline void gen_ldda_asi(int insn) |
1863 | 1872 | { |
1864 | 1873 | int asi; |
1865 | - TCGv r_dword; | |
1866 | 1874 | |
1867 | - r_dword = tcg_temp_new(TCG_TYPE_I64); | |
1868 | 1875 | asi = GET_FIELD(insn, 19, 26); |
1869 | - tcg_gen_helper_1_4(helper_ld_asi, r_dword, cpu_T[0], tcg_const_i32(asi), | |
1876 | + tcg_gen_helper_1_4(helper_ld_asi, cpu_tmp64, cpu_T[0], tcg_const_i32(asi), | |
1870 | 1877 | tcg_const_i32(8), tcg_const_i32(0)); |
1871 | - tcg_gen_trunc_i64_i32(cpu_T[0], r_dword); | |
1872 | - tcg_gen_shri_i64(r_dword, r_dword, 32); | |
1873 | - tcg_gen_trunc_i64_i32(cpu_T[1], r_dword); | |
1874 | - tcg_gen_discard_i64(r_dword); | |
1878 | + tcg_gen_trunc_i64_tl(cpu_T[0], cpu_tmp64); | |
1879 | + tcg_gen_shri_i64(cpu_tmp64, cpu_tmp64, 32); | |
1880 | + tcg_gen_trunc_i64_tl(cpu_T[1], cpu_tmp64); | |
1875 | 1881 | } |
1876 | 1882 | |
1877 | 1883 | static inline void gen_stda_asi(int insn, int rd) |
1878 | 1884 | { |
1879 | 1885 | int asi; |
1880 | - TCGv r_dword, r_temp; | |
1886 | + TCGv r_temp; | |
1881 | 1887 | |
1882 | - r_dword = tcg_temp_new(TCG_TYPE_I64); | |
1883 | 1888 | r_temp = tcg_temp_new(TCG_TYPE_I32); |
1884 | 1889 | gen_movl_reg_TN(rd + 1, r_temp); |
1885 | - tcg_gen_helper_1_2(helper_pack64, r_dword, cpu_T[1], r_temp); | |
1890 | + tcg_gen_helper_1_2(helper_pack64, cpu_tmp64, cpu_T[1], r_temp); | |
1886 | 1891 | asi = GET_FIELD(insn, 19, 26); |
1887 | - tcg_gen_helper_0_4(helper_st_asi, cpu_T[0], r_dword, tcg_const_i32(asi), | |
1892 | + tcg_gen_helper_0_4(helper_st_asi, cpu_T[0], cpu_tmp64, tcg_const_i32(asi), | |
1888 | 1893 | tcg_const_i32(8)); |
1889 | - tcg_gen_discard_i64(r_dword); | |
1890 | 1894 | } |
1891 | 1895 | #endif |
1892 | 1896 | |
... | ... | @@ -1898,7 +1902,7 @@ static inline void gen_ldstub_asi(int insn) |
1898 | 1902 | gen_ld_asi(insn, 1, 0); |
1899 | 1903 | |
1900 | 1904 | asi = GET_FIELD(insn, 19, 26); |
1901 | - tcg_gen_helper_0_4(helper_st_asi, cpu_T[0], tcg_const_i64(0xff), | |
1905 | + tcg_gen_helper_0_4(helper_st_asi, cpu_T[0], tcg_const_i64(0xffULL), | |
1902 | 1906 | tcg_const_i32(asi), tcg_const_i32(1)); |
1903 | 1907 | } |
1904 | 1908 | #endif |
... | ... | @@ -3090,7 +3094,7 @@ static void disas_sparc_insn(DisasContext * dc) |
3090 | 3094 | break; |
3091 | 3095 | #ifdef TARGET_SPARC64 |
3092 | 3096 | case 0xd: /* V9 udivx */ |
3093 | - gen_trap_ifdivzero_i64(cpu_T[1]); | |
3097 | + gen_trap_ifdivzero_tl(cpu_T[1]); | |
3094 | 3098 | tcg_gen_divu_i64(cpu_T[0], cpu_T[0], cpu_T[1]); |
3095 | 3099 | break; |
3096 | 3100 | #endif |
... | ... | @@ -3134,18 +3138,18 @@ static void disas_sparc_insn(DisasContext * dc) |
3134 | 3138 | break; |
3135 | 3139 | #ifndef TARGET_SPARC64 |
3136 | 3140 | case 0x25: /* sll */ |
3137 | - tcg_gen_andi_i32(cpu_T[1], cpu_T[1], 0x1f); | |
3138 | - tcg_gen_shl_i32(cpu_T[0], cpu_T[0], cpu_T[1]); | |
3141 | + tcg_gen_andi_tl(cpu_T[1], cpu_T[1], 0x1f); | |
3142 | + tcg_gen_shl_tl(cpu_T[0], cpu_T[0], cpu_T[1]); | |
3139 | 3143 | gen_movl_T0_reg(rd); |
3140 | 3144 | break; |
3141 | 3145 | case 0x26: /* srl */ |
3142 | - tcg_gen_andi_i32(cpu_T[1], cpu_T[1], 0x1f); | |
3143 | - tcg_gen_shr_i32(cpu_T[0], cpu_T[0], cpu_T[1]); | |
3146 | + tcg_gen_andi_tl(cpu_T[1], cpu_T[1], 0x1f); | |
3147 | + tcg_gen_shr_tl(cpu_T[0], cpu_T[0], cpu_T[1]); | |
3144 | 3148 | gen_movl_T0_reg(rd); |
3145 | 3149 | break; |
3146 | 3150 | case 0x27: /* sra */ |
3147 | - tcg_gen_andi_i32(cpu_T[1], cpu_T[1], 0x1f); | |
3148 | - tcg_gen_sar_i32(cpu_T[0], cpu_T[0], cpu_T[1]); | |
3151 | + tcg_gen_andi_tl(cpu_T[1], cpu_T[1], 0x1f); | |
3152 | + tcg_gen_sar_tl(cpu_T[0], cpu_T[0], cpu_T[1]); | |
3149 | 3153 | gen_movl_T0_reg(rd); |
3150 | 3154 | break; |
3151 | 3155 | #endif |
... | ... | @@ -3407,7 +3411,7 @@ static void disas_sparc_insn(DisasContext * dc) |
3407 | 3411 | goto illegal_insn; |
3408 | 3412 | } |
3409 | 3413 | #else |
3410 | - tcg_gen_andi_i32(cpu_T[0], cpu_T[0], ((1 << NWINDOWS) - 1)); | |
3414 | + tcg_gen_andi_tl(cpu_T[0], cpu_T[0], ((1 << NWINDOWS) - 1)); | |
3411 | 3415 | gen_op_movl_env_T0(offsetof(CPUSPARCState, wim)); |
3412 | 3416 | #endif |
3413 | 3417 | } |
... | ... | @@ -4115,17 +4119,15 @@ static void disas_sparc_insn(DisasContext * dc) |
4115 | 4119 | if (rd & 1) |
4116 | 4120 | goto illegal_insn; |
4117 | 4121 | else { |
4118 | - TCGv r_dword; | |
4119 | - | |
4120 | - r_dword = tcg_temp_new(TCG_TYPE_I64); | |
4121 | 4122 | gen_op_check_align_T0_7(); |
4122 | 4123 | ABI32_MASK(cpu_T[0]); |
4123 | - tcg_gen_qemu_ld64(r_dword, cpu_T[0], dc->mem_idx); | |
4124 | - tcg_gen_trunc_i64_i32(cpu_T[0], r_dword); | |
4124 | + tcg_gen_qemu_ld64(cpu_tmp64, cpu_T[0], dc->mem_idx); | |
4125 | + tcg_gen_trunc_i64_tl(cpu_T[0], cpu_tmp64); | |
4126 | + tcg_gen_andi_tl(cpu_T[0], cpu_T[0], 0xffffffffULL); | |
4125 | 4127 | gen_movl_T0_reg(rd + 1); |
4126 | - tcg_gen_shri_i64(r_dword, r_dword, 32); | |
4127 | - tcg_gen_trunc_i64_i32(cpu_T[1], r_dword); | |
4128 | - tcg_gen_discard_i64(r_dword); | |
4128 | + tcg_gen_shri_i64(cpu_tmp64, cpu_tmp64, 32); | |
4129 | + tcg_gen_trunc_i64_tl(cpu_T[1], cpu_tmp64); | |
4130 | + tcg_gen_andi_tl(cpu_T[1], cpu_T[1], 0xffffffffULL); | |
4129 | 4131 | } |
4130 | 4132 | break; |
4131 | 4133 | case 0x9: /* load signed byte */ |
... | ... | @@ -4138,18 +4140,17 @@ static void disas_sparc_insn(DisasContext * dc) |
4138 | 4140 | tcg_gen_qemu_ld16s(cpu_T[1], cpu_T[0], dc->mem_idx); |
4139 | 4141 | break; |
4140 | 4142 | case 0xd: /* ldstub -- XXX: should be atomically */ |
4141 | - tcg_gen_movi_i32(cpu_tmp0, 0xff); | |
4142 | 4143 | ABI32_MASK(cpu_T[0]); |
4143 | 4144 | tcg_gen_qemu_ld8s(cpu_T[1], cpu_T[0], dc->mem_idx); |
4144 | - tcg_gen_qemu_st8(cpu_tmp0, cpu_T[0], dc->mem_idx); | |
4145 | + tcg_gen_qemu_st8(tcg_const_tl(0xff), cpu_T[0], dc->mem_idx); | |
4145 | 4146 | break; |
4146 | 4147 | case 0x0f: /* swap register with memory. Also atomically */ |
4147 | 4148 | gen_op_check_align_T0_3(); |
4148 | 4149 | gen_movl_reg_T1(rd); |
4149 | 4150 | ABI32_MASK(cpu_T[0]); |
4150 | - tcg_gen_qemu_ld32u(cpu_tmp0, cpu_T[0], dc->mem_idx); | |
4151 | + tcg_gen_qemu_ld32u(cpu_tmp32, cpu_T[0], dc->mem_idx); | |
4151 | 4152 | tcg_gen_qemu_st32(cpu_T[1], cpu_T[0], dc->mem_idx); |
4152 | - tcg_gen_mov_i32(cpu_T[1], cpu_tmp0); | |
4153 | + tcg_gen_extu_i32_tl(cpu_T[1], cpu_tmp32); | |
4153 | 4154 | break; |
4154 | 4155 | #if !defined(CONFIG_USER_ONLY) || defined(TARGET_SPARC64) |
4155 | 4156 | case 0x10: /* load word alternate */ |
... | ... | @@ -4342,16 +4343,14 @@ static void disas_sparc_insn(DisasContext * dc) |
4342 | 4343 | goto illegal_insn; |
4343 | 4344 | #ifndef __i386__ |
4344 | 4345 | else { |
4345 | - TCGv r_dword, r_low; | |
4346 | + TCGv r_low; | |
4346 | 4347 | |
4347 | 4348 | gen_op_check_align_T0_7(); |
4348 | - r_dword = tcg_temp_new(TCG_TYPE_I64); | |
4349 | 4349 | r_low = tcg_temp_new(TCG_TYPE_I32); |
4350 | 4350 | gen_movl_reg_TN(rd + 1, r_low); |
4351 | - tcg_gen_helper_1_2(helper_pack64, r_dword, cpu_T[1], | |
4351 | + tcg_gen_helper_1_2(helper_pack64, cpu_tmp64, cpu_T[1], | |
4352 | 4352 | r_low); |
4353 | - tcg_gen_qemu_st64(r_dword, cpu_T[0], dc->mem_idx); | |
4354 | - tcg_gen_discard_i64(r_dword); | |
4353 | + tcg_gen_qemu_st64(cpu_tmp64, cpu_T[0], dc->mem_idx); | |
4355 | 4354 | } |
4356 | 4355 | #else /* __i386__ */ |
4357 | 4356 | gen_op_check_align_T0_7(); |
... | ... | @@ -4584,6 +4583,8 @@ static inline int gen_intermediate_code_internal(TranslationBlock * tb, |
4584 | 4583 | gen_opc_end = gen_opc_buf + OPC_MAX_SIZE; |
4585 | 4584 | |
4586 | 4585 | cpu_tmp0 = tcg_temp_new(TCG_TYPE_TL); |
4586 | + cpu_tmp32 = tcg_temp_new(TCG_TYPE_I32); | |
4587 | + cpu_tmp64 = tcg_temp_new(TCG_TYPE_I64); | |
4587 | 4588 | |
4588 | 4589 | do { |
4589 | 4590 | if (env->nb_breakpoints > 0) { | ... | ... |