Revision b89e94af
b/target-sparc/translate.c | ||
---|---|---|
2496 | 2496 |
gen_helper_check_ieee_exceptions(); |
2497 | 2497 |
tcg_gen_mov_i32(cpu_fpr[rd], cpu_tmp32); |
2498 | 2498 |
break; |
2499 |
case 0x42: |
|
2499 |
case 0x42: /* faddd */
|
|
2500 | 2500 |
gen_op_load_fpr_DT0(DFPREG(rs1)); |
2501 | 2501 |
gen_op_load_fpr_DT1(DFPREG(rs2)); |
2502 | 2502 |
gen_clear_float_exceptions(); |
... | ... | |
2520 | 2520 |
gen_helper_check_ieee_exceptions(); |
2521 | 2521 |
tcg_gen_mov_i32(cpu_fpr[rd], cpu_tmp32); |
2522 | 2522 |
break; |
2523 |
case 0x46: |
|
2523 |
case 0x46: /* fsubd */
|
|
2524 | 2524 |
gen_op_load_fpr_DT0(DFPREG(rs1)); |
2525 | 2525 |
gen_op_load_fpr_DT1(DFPREG(rs2)); |
2526 | 2526 |
gen_clear_float_exceptions(); |
... | ... | |
2571 | 2571 |
gen_helper_check_ieee_exceptions(); |
2572 | 2572 |
tcg_gen_mov_i32(cpu_fpr[rd], cpu_tmp32); |
2573 | 2573 |
break; |
2574 |
case 0x4e: |
|
2574 |
case 0x4e: /* fdivd */
|
|
2575 | 2575 |
gen_op_load_fpr_DT0(DFPREG(rs1)); |
2576 | 2576 |
gen_op_load_fpr_DT1(DFPREG(rs2)); |
2577 | 2577 |
gen_clear_float_exceptions(); |
... | ... | |
3136 | 3136 |
cpu_src1 = get_src1(insn, cpu_src1); |
3137 | 3137 |
cpu_src2 = get_src2(insn, cpu_src2); |
3138 | 3138 |
switch (xop & ~0x10) { |
3139 |
case 0x0: |
|
3139 |
case 0x0: /* add */
|
|
3140 | 3140 |
if (IS_IMM) { |
3141 | 3141 |
simm = GET_FIELDs(insn, 19, 31); |
3142 | 3142 |
if (xop & 0x10) { |
... | ... | |
3152 | 3152 |
} |
3153 | 3153 |
} |
3154 | 3154 |
break; |
3155 |
case 0x1: |
|
3155 |
case 0x1: /* and */
|
|
3156 | 3156 |
if (IS_IMM) { |
3157 | 3157 |
simm = GET_FIELDs(insn, 19, 31); |
3158 | 3158 |
tcg_gen_andi_tl(cpu_dst, cpu_src1, simm); |
... | ... | |
3163 | 3163 |
gen_op_logic_cc(cpu_dst); |
3164 | 3164 |
} |
3165 | 3165 |
break; |
3166 |
case 0x2: |
|
3166 |
case 0x2: /* or */
|
|
3167 | 3167 |
if (IS_IMM) { |
3168 | 3168 |
simm = GET_FIELDs(insn, 19, 31); |
3169 | 3169 |
tcg_gen_ori_tl(cpu_dst, cpu_src1, simm); |
... | ... | |
3173 | 3173 |
if (xop & 0x10) |
3174 | 3174 |
gen_op_logic_cc(cpu_dst); |
3175 | 3175 |
break; |
3176 |
case 0x3: |
|
3176 |
case 0x3: /* xor */
|
|
3177 | 3177 |
if (IS_IMM) { |
3178 | 3178 |
simm = GET_FIELDs(insn, 19, 31); |
3179 | 3179 |
tcg_gen_xori_tl(cpu_dst, cpu_src1, simm); |
... | ... | |
3183 | 3183 |
if (xop & 0x10) |
3184 | 3184 |
gen_op_logic_cc(cpu_dst); |
3185 | 3185 |
break; |
3186 |
case 0x4: |
|
3186 |
case 0x4: /* sub */
|
|
3187 | 3187 |
if (IS_IMM) { |
3188 | 3188 |
simm = GET_FIELDs(insn, 19, 31); |
3189 | 3189 |
if (xop & 0x10) { |
... | ... | |
3199 | 3199 |
} |
3200 | 3200 |
} |
3201 | 3201 |
break; |
3202 |
case 0x5: |
|
3202 |
case 0x5: /* andn */
|
|
3203 | 3203 |
if (IS_IMM) { |
3204 | 3204 |
simm = GET_FIELDs(insn, 19, 31); |
3205 | 3205 |
tcg_gen_andi_tl(cpu_dst, cpu_src1, ~simm); |
... | ... | |
3209 | 3209 |
if (xop & 0x10) |
3210 | 3210 |
gen_op_logic_cc(cpu_dst); |
3211 | 3211 |
break; |
3212 |
case 0x6: |
|
3212 |
case 0x6: /* orn */
|
|
3213 | 3213 |
if (IS_IMM) { |
3214 | 3214 |
simm = GET_FIELDs(insn, 19, 31); |
3215 | 3215 |
tcg_gen_ori_tl(cpu_dst, cpu_src1, ~simm); |
... | ... | |
3219 | 3219 |
if (xop & 0x10) |
3220 | 3220 |
gen_op_logic_cc(cpu_dst); |
3221 | 3221 |
break; |
3222 |
case 0x7: |
|
3222 |
case 0x7: /* xorn */
|
|
3223 | 3223 |
if (IS_IMM) { |
3224 | 3224 |
simm = GET_FIELDs(insn, 19, 31); |
3225 | 3225 |
tcg_gen_xori_tl(cpu_dst, cpu_src1, ~simm); |
... | ... | |
3230 | 3230 |
if (xop & 0x10) |
3231 | 3231 |
gen_op_logic_cc(cpu_dst); |
3232 | 3232 |
break; |
3233 |
case 0x8: |
|
3233 |
case 0x8: /* addx, V9 addc */
|
|
3234 | 3234 |
if (IS_IMM) { |
3235 | 3235 |
simm = GET_FIELDs(insn, 19, 31); |
3236 | 3236 |
if (xop & 0x10) |
... | ... | |
3260 | 3260 |
} |
3261 | 3261 |
break; |
3262 | 3262 |
#endif |
3263 |
case 0xa: |
|
3263 |
case 0xa: /* umul */
|
|
3264 | 3264 |
CHECK_IU_FEATURE(dc, MUL); |
3265 | 3265 |
gen_op_umul(cpu_dst, cpu_src1, cpu_src2); |
3266 | 3266 |
if (xop & 0x10) |
3267 | 3267 |
gen_op_logic_cc(cpu_dst); |
3268 | 3268 |
break; |
3269 |
case 0xb: |
|
3269 |
case 0xb: /* smul */
|
|
3270 | 3270 |
CHECK_IU_FEATURE(dc, MUL); |
3271 | 3271 |
gen_op_smul(cpu_dst, cpu_src1, cpu_src2); |
3272 | 3272 |
if (xop & 0x10) |
3273 | 3273 |
gen_op_logic_cc(cpu_dst); |
3274 | 3274 |
break; |
3275 |
case 0xc: |
|
3275 |
case 0xc: /* subx, V9 subc */
|
|
3276 | 3276 |
if (IS_IMM) { |
3277 | 3277 |
simm = GET_FIELDs(insn, 19, 31); |
3278 | 3278 |
if (xop & 0x10) { |
... | ... | |
3300 | 3300 |
tcg_gen_divu_i64(cpu_dst, cpu_cc_src, cpu_cc_src2); |
3301 | 3301 |
break; |
3302 | 3302 |
#endif |
3303 |
case 0xe: |
|
3303 |
case 0xe: /* udiv */
|
|
3304 | 3304 |
CHECK_IU_FEATURE(dc, DIV); |
3305 | 3305 |
gen_helper_udiv(cpu_dst, cpu_src1, cpu_src2); |
3306 | 3306 |
if (xop & 0x10) |
3307 | 3307 |
gen_op_div_cc(cpu_dst); |
3308 | 3308 |
break; |
3309 |
case 0xf: |
|
3309 |
case 0xf: /* sdiv */
|
|
3310 | 3310 |
CHECK_IU_FEATURE(dc, DIV); |
3311 | 3311 |
gen_helper_sdiv(cpu_dst, cpu_src1, cpu_src2); |
3312 | 3312 |
if (xop & 0x10) |
... | ... | |
4385 | 4385 |
(xop > 0x17 && xop <= 0x1d ) || |
4386 | 4386 |
(xop > 0x2c && xop <= 0x33) || xop == 0x1f || xop == 0x3d) { |
4387 | 4387 |
switch (xop) { |
4388 |
case 0x0: /* load unsigned word */ |
|
4388 |
case 0x0: /* ld, V9 lduw, load unsigned word */
|
|
4389 | 4389 |
gen_address_mask(dc, cpu_addr); |
4390 | 4390 |
tcg_gen_qemu_ld32u(cpu_val, cpu_addr, dc->mem_idx); |
4391 | 4391 |
break; |
4392 |
case 0x1: /* load unsigned byte */ |
|
4392 |
case 0x1: /* ldub, load unsigned byte */
|
|
4393 | 4393 |
gen_address_mask(dc, cpu_addr); |
4394 | 4394 |
tcg_gen_qemu_ld8u(cpu_val, cpu_addr, dc->mem_idx); |
4395 | 4395 |
break; |
4396 |
case 0x2: /* load unsigned halfword */ |
|
4396 |
case 0x2: /* lduh, load unsigned halfword */
|
|
4397 | 4397 |
gen_address_mask(dc, cpu_addr); |
4398 | 4398 |
tcg_gen_qemu_ld16u(cpu_val, cpu_addr, dc->mem_idx); |
4399 | 4399 |
break; |
4400 |
case 0x3: /* load double word */ |
|
4400 |
case 0x3: /* ldd, load double word */
|
|
4401 | 4401 |
if (rd & 1) |
4402 | 4402 |
goto illegal_insn; |
4403 | 4403 |
else { |
... | ... | |
4417 | 4417 |
tcg_gen_andi_tl(cpu_val, cpu_val, 0xffffffffULL); |
4418 | 4418 |
} |
4419 | 4419 |
break; |
4420 |
case 0x9: /* load signed byte */ |
|
4420 |
case 0x9: /* ldsb, load signed byte */
|
|
4421 | 4421 |
gen_address_mask(dc, cpu_addr); |
4422 | 4422 |
tcg_gen_qemu_ld8s(cpu_val, cpu_addr, dc->mem_idx); |
4423 | 4423 |
break; |
4424 |
case 0xa: /* load signed halfword */ |
|
4424 |
case 0xa: /* ldsh, load signed halfword */
|
|
4425 | 4425 |
gen_address_mask(dc, cpu_addr); |
4426 | 4426 |
tcg_gen_qemu_ld16s(cpu_val, cpu_addr, dc->mem_idx); |
4427 | 4427 |
break; |
... | ... | |
4436 | 4436 |
tcg_temp_free(r_const); |
4437 | 4437 |
} |
4438 | 4438 |
break; |
4439 |
case 0x0f: /* swap register with memory. Also |
|
4439 |
case 0x0f: /* swap, swap register with memory. Also
|
|
4440 | 4440 |
atomically */ |
4441 | 4441 |
CHECK_IU_FEATURE(dc, SWAP); |
4442 | 4442 |
gen_movl_reg_TN(rd, cpu_val); |
... | ... | |
4446 | 4446 |
tcg_gen_mov_tl(cpu_val, cpu_tmp0); |
4447 | 4447 |
break; |
4448 | 4448 |
#if !defined(CONFIG_USER_ONLY) || defined(TARGET_SPARC64) |
4449 |
case 0x10: /* load word alternate */ |
|
4449 |
case 0x10: /* lda, V9 lduwa, load word alternate */
|
|
4450 | 4450 |
#ifndef TARGET_SPARC64 |
4451 | 4451 |
if (IS_IMM) |
4452 | 4452 |
goto illegal_insn; |
... | ... | |
4456 | 4456 |
save_state(dc, cpu_cond); |
4457 | 4457 |
gen_ld_asi(cpu_val, cpu_addr, insn, 4, 0); |
4458 | 4458 |
break; |
4459 |
case 0x11: /* load unsigned byte alternate */ |
|
4459 |
case 0x11: /* lduba, load unsigned byte alternate */
|
|
4460 | 4460 |
#ifndef TARGET_SPARC64 |
4461 | 4461 |
if (IS_IMM) |
4462 | 4462 |
goto illegal_insn; |
... | ... | |
4466 | 4466 |
save_state(dc, cpu_cond); |
4467 | 4467 |
gen_ld_asi(cpu_val, cpu_addr, insn, 1, 0); |
4468 | 4468 |
break; |
4469 |
case 0x12: /* load unsigned halfword alternate */ |
|
4469 |
case 0x12: /* lduha, load unsigned halfword alternate */
|
|
4470 | 4470 |
#ifndef TARGET_SPARC64 |
4471 | 4471 |
if (IS_IMM) |
4472 | 4472 |
goto illegal_insn; |
... | ... | |
4476 | 4476 |
save_state(dc, cpu_cond); |
4477 | 4477 |
gen_ld_asi(cpu_val, cpu_addr, insn, 2, 0); |
4478 | 4478 |
break; |
4479 |
case 0x13: /* load double word alternate */ |
|
4479 |
case 0x13: /* ldda, load double word alternate */
|
|
4480 | 4480 |
#ifndef TARGET_SPARC64 |
4481 | 4481 |
if (IS_IMM) |
4482 | 4482 |
goto illegal_insn; |
... | ... | |
4488 | 4488 |
save_state(dc, cpu_cond); |
4489 | 4489 |
gen_ldda_asi(cpu_val, cpu_addr, insn, rd); |
4490 | 4490 |
goto skip_move; |
4491 |
case 0x19: /* load signed byte alternate */ |
|
4491 |
case 0x19: /* ldsba, load signed byte alternate */
|
|
4492 | 4492 |
#ifndef TARGET_SPARC64 |
4493 | 4493 |
if (IS_IMM) |
4494 | 4494 |
goto illegal_insn; |
... | ... | |
4498 | 4498 |
save_state(dc, cpu_cond); |
4499 | 4499 |
gen_ld_asi(cpu_val, cpu_addr, insn, 1, 1); |
4500 | 4500 |
break; |
4501 |
case 0x1a: /* load signed halfword alternate */ |
|
4501 |
case 0x1a: /* ldsha, load signed halfword alternate */
|
|
4502 | 4502 |
#ifndef TARGET_SPARC64 |
4503 | 4503 |
if (IS_IMM) |
4504 | 4504 |
goto illegal_insn; |
... | ... | |
4518 | 4518 |
save_state(dc, cpu_cond); |
4519 | 4519 |
gen_ldstub_asi(cpu_val, cpu_addr, insn); |
4520 | 4520 |
break; |
4521 |
case 0x1f: /* swap reg with alt. memory. Also |
|
4521 |
case 0x1f: /* swapa, swap reg with alt. memory. Also
|
|
4522 | 4522 |
atomically */ |
4523 | 4523 |
CHECK_IU_FEATURE(dc, SWAP); |
4524 | 4524 |
#ifndef TARGET_SPARC64 |
... | ... | |
4586 | 4586 |
goto jmp_insn; |
4587 | 4587 |
save_state(dc, cpu_cond); |
4588 | 4588 |
switch (xop) { |
4589 |
case 0x20: /* load fpreg */ |
|
4589 |
case 0x20: /* ldf, load fpreg */
|
|
4590 | 4590 |
gen_address_mask(dc, cpu_addr); |
4591 | 4591 |
tcg_gen_qemu_ld32u(cpu_tmp0, cpu_addr, dc->mem_idx); |
4592 | 4592 |
tcg_gen_trunc_tl_i32(cpu_fpr[rd], cpu_tmp0); |
... | ... | |
4605 | 4605 |
} |
4606 | 4606 |
#endif |
4607 | 4607 |
break; |
4608 |
case 0x22: /* load quad fpreg */ |
|
4608 |
case 0x22: /* ldqf, load quad fpreg */
|
|
4609 | 4609 |
{ |
4610 | 4610 |
TCGv_i32 r_const; |
4611 | 4611 |
|
... | ... | |
4616 | 4616 |
gen_op_store_QT0_fpr(QFPREG(rd)); |
4617 | 4617 |
} |
4618 | 4618 |
break; |
4619 |
case 0x23: /* load double fpreg */ |
|
4619 |
case 0x23: /* lddf, load double fpreg */
|
|
4620 | 4620 |
{ |
4621 | 4621 |
TCGv_i32 r_const; |
4622 | 4622 |
|
... | ... | |
4633 | 4633 |
xop == 0xe || xop == 0x1e) { |
4634 | 4634 |
gen_movl_reg_TN(rd, cpu_val); |
4635 | 4635 |
switch (xop) { |
4636 |
case 0x4: /* store word */ |
|
4636 |
case 0x4: /* st, store word */
|
|
4637 | 4637 |
gen_address_mask(dc, cpu_addr); |
4638 | 4638 |
tcg_gen_qemu_st32(cpu_val, cpu_addr, dc->mem_idx); |
4639 | 4639 |
break; |
4640 |
case 0x5: /* store byte */ |
|
4640 |
case 0x5: /* stb, store byte */
|
|
4641 | 4641 |
gen_address_mask(dc, cpu_addr); |
4642 | 4642 |
tcg_gen_qemu_st8(cpu_val, cpu_addr, dc->mem_idx); |
4643 | 4643 |
break; |
4644 |
case 0x6: /* store halfword */ |
|
4644 |
case 0x6: /* sth, store halfword */
|
|
4645 | 4645 |
gen_address_mask(dc, cpu_addr); |
4646 | 4646 |
tcg_gen_qemu_st16(cpu_val, cpu_addr, dc->mem_idx); |
4647 | 4647 |
break; |
4648 |
case 0x7: /* store double word */ |
|
4648 |
case 0x7: /* std, store double word */
|
|
4649 | 4649 |
if (rd & 1) |
4650 | 4650 |
goto illegal_insn; |
4651 | 4651 |
else { |
... | ... | |
4662 | 4662 |
} |
4663 | 4663 |
break; |
4664 | 4664 |
#if !defined(CONFIG_USER_ONLY) || defined(TARGET_SPARC64) |
4665 |
case 0x14: /* store word alternate */ |
|
4665 |
case 0x14: /* sta, V9 stwa, store word alternate */
|
|
4666 | 4666 |
#ifndef TARGET_SPARC64 |
4667 | 4667 |
if (IS_IMM) |
4668 | 4668 |
goto illegal_insn; |
... | ... | |
4672 | 4672 |
save_state(dc, cpu_cond); |
4673 | 4673 |
gen_st_asi(cpu_val, cpu_addr, insn, 4); |
4674 | 4674 |
break; |
4675 |
case 0x15: /* store byte alternate */ |
|
4675 |
case 0x15: /* stba, store byte alternate */
|
|
4676 | 4676 |
#ifndef TARGET_SPARC64 |
4677 | 4677 |
if (IS_IMM) |
4678 | 4678 |
goto illegal_insn; |
... | ... | |
4682 | 4682 |
save_state(dc, cpu_cond); |
4683 | 4683 |
gen_st_asi(cpu_val, cpu_addr, insn, 1); |
4684 | 4684 |
break; |
4685 |
case 0x16: /* store halfword alternate */ |
|
4685 |
case 0x16: /* stha, store halfword alternate */
|
|
4686 | 4686 |
#ifndef TARGET_SPARC64 |
4687 | 4687 |
if (IS_IMM) |
4688 | 4688 |
goto illegal_insn; |
... | ... | |
4692 | 4692 |
save_state(dc, cpu_cond); |
4693 | 4693 |
gen_st_asi(cpu_val, cpu_addr, insn, 2); |
4694 | 4694 |
break; |
4695 |
case 0x17: /* store double word alternate */ |
|
4695 |
case 0x17: /* stda, store double word alternate */
|
|
4696 | 4696 |
#ifndef TARGET_SPARC64 |
4697 | 4697 |
if (IS_IMM) |
4698 | 4698 |
goto illegal_insn; |
... | ... | |
4725 | 4725 |
goto jmp_insn; |
4726 | 4726 |
save_state(dc, cpu_cond); |
4727 | 4727 |
switch (xop) { |
4728 |
case 0x24: /* store fpreg */ |
|
4728 |
case 0x24: /* stf, store fpreg */
|
|
4729 | 4729 |
gen_address_mask(dc, cpu_addr); |
4730 | 4730 |
tcg_gen_ext_i32_tl(cpu_tmp0, cpu_fpr[rd]); |
4731 | 4731 |
tcg_gen_qemu_st32(cpu_tmp0, cpu_addr, dc->mem_idx); |
... | ... | |
4768 | 4768 |
goto nfq_insn; |
4769 | 4769 |
#endif |
4770 | 4770 |
#endif |
4771 |
case 0x27: /* store double fpreg */ |
|
4771 |
case 0x27: /* stdf, store double fpreg */
|
|
4772 | 4772 |
{ |
4773 | 4773 |
TCGv_i32 r_const; |
4774 | 4774 |
|
Also available in: Unified diff