Revision 40cfacdd target-arm/translate.c
b/target-arm/translate.c | ||
---|---|---|
2723 | 2723 |
return 0; |
2724 | 2724 |
} |
2725 | 2725 |
|
2726 |
static int handle_vminmaxnm(uint32_t insn, uint32_t rd, uint32_t rn, |
|
2727 |
uint32_t rm, uint32_t dp) |
|
2728 |
{ |
|
2729 |
uint32_t vmin = extract32(insn, 6, 1); |
|
2730 |
TCGv_ptr fpst = get_fpstatus_ptr(0); |
|
2731 |
|
|
2732 |
if (dp) { |
|
2733 |
TCGv_i64 frn, frm, dest; |
|
2734 |
|
|
2735 |
frn = tcg_temp_new_i64(); |
|
2736 |
frm = tcg_temp_new_i64(); |
|
2737 |
dest = tcg_temp_new_i64(); |
|
2738 |
|
|
2739 |
tcg_gen_ld_f64(frn, cpu_env, vfp_reg_offset(dp, rn)); |
|
2740 |
tcg_gen_ld_f64(frm, cpu_env, vfp_reg_offset(dp, rm)); |
|
2741 |
if (vmin) { |
|
2742 |
gen_helper_vfp_minnmd(dest, frn, frm, fpst); |
|
2743 |
} else { |
|
2744 |
gen_helper_vfp_maxnmd(dest, frn, frm, fpst); |
|
2745 |
} |
|
2746 |
tcg_gen_st_f64(dest, cpu_env, vfp_reg_offset(dp, rd)); |
|
2747 |
tcg_temp_free_i64(frn); |
|
2748 |
tcg_temp_free_i64(frm); |
|
2749 |
tcg_temp_free_i64(dest); |
|
2750 |
} else { |
|
2751 |
TCGv_i32 frn, frm, dest; |
|
2752 |
|
|
2753 |
frn = tcg_temp_new_i32(); |
|
2754 |
frm = tcg_temp_new_i32(); |
|
2755 |
dest = tcg_temp_new_i32(); |
|
2756 |
|
|
2757 |
tcg_gen_ld_f32(frn, cpu_env, vfp_reg_offset(dp, rn)); |
|
2758 |
tcg_gen_ld_f32(frm, cpu_env, vfp_reg_offset(dp, rm)); |
|
2759 |
if (vmin) { |
|
2760 |
gen_helper_vfp_minnms(dest, frn, frm, fpst); |
|
2761 |
} else { |
|
2762 |
gen_helper_vfp_maxnms(dest, frn, frm, fpst); |
|
2763 |
} |
|
2764 |
tcg_gen_st_f32(dest, cpu_env, vfp_reg_offset(dp, rd)); |
|
2765 |
tcg_temp_free_i32(frn); |
|
2766 |
tcg_temp_free_i32(frm); |
|
2767 |
tcg_temp_free_i32(dest); |
|
2768 |
} |
|
2769 |
|
|
2770 |
tcg_temp_free_ptr(fpst); |
|
2771 |
return 0; |
|
2772 |
} |
|
2773 |
|
|
2726 | 2774 |
static int disas_vfp_v8_insn(CPUARMState *env, DisasContext *s, uint32_t insn) |
2727 | 2775 |
{ |
2728 | 2776 |
uint32_t rd, rn, rm, dp = extract32(insn, 8, 1); |
... | ... | |
2743 | 2791 |
|
2744 | 2792 |
if ((insn & 0x0f800e50) == 0x0e000a00) { |
2745 | 2793 |
return handle_vsel(insn, rd, rn, rm, dp); |
2794 |
} else if ((insn & 0x0fb00e10) == 0x0e800a00) { |
|
2795 |
return handle_vminmaxnm(insn, rd, rn, rm, dp); |
|
2746 | 2796 |
} |
2747 | 2797 |
return 1; |
2748 | 2798 |
} |
Also available in: Unified diff