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