/* convert 64-bit float to 64-bit int */ uint32_t HELPER(cgdbr)(CPUS390XState *env, uint32_t r1, uint32_t f2, uint32_t m3) { float64 v2 = env->fregs[f2].d; set_round_mode(env, m3); env->regs[r1] = float64_to_int64(v2, &env->fpu_status); return set_cc_nz_f64(v2); }
/* absolute value of 64-bit float */ uint32_t HELPER(lpdbr)(CPUS390XState *env, uint32_t f1, uint32_t f2) { float64 v1; float64 v2 = env->fregs[f2].d; v1 = float64_abs(v2); env->fregs[f1].d = v1; return set_cc_nz_f64(v1); }
/* 64-bit FP subtraction RM */ uint32_t HELPER(sdb)(CPUS390XState *env, uint32_t f1, uint64_t a2) { float64 v1 = env->fregs[f1].d; CPU_DoubleU v2; v2.ll = cpu_ldq_data(env, a2); env->fregs[f1].d = v1 = float64_sub(v1, v2.d, &env->fpu_status); return set_cc_nz_f64(v1); }
/* 64-bit FP subtraction RR */ uint32_t HELPER(sdbr)(CPUS390XState *env, uint32_t f1, uint32_t f2) { env->fregs[f1].d = float64_sub(env->fregs[f1].d, env->fregs[f2].d, &env->fpu_status); HELPER_LOG("%s: subtracting 0x%ld resulting in 0x%ld in f%d\n", __func__, env->fregs[f2].d, env->fregs[f1].d, f1); return set_cc_nz_f64(env->fregs[f1].d); }
/* 64-bit FP addition RM */ uint32_t HELPER(adb)(CPUS390XState *env, uint32_t f1, uint64_t a2) { float64 v1 = env->fregs[f1].d; CPU_DoubleU v2; v2.ll = cpu_ldq_data(env, a2); HELPER_LOG("%s: adding 0x%lx from f%d and 0x%lx\n", __func__, v1, f1, v2.d); env->fregs[f1].d = v1 = float64_add(v1, v2.d, &env->fpu_status); return set_cc_nz_f64(v1); }
/* load complement of 64-bit float */ uint32_t HELPER(lcdbr)(CPUS390XState *env, uint32_t f1, uint32_t f2) { env->fregs[f1].d = float64_chs(env->fregs[f2].d); return set_cc_nz_f64(env->fregs[f1].d); }
/* load and test 64-bit float */ uint32_t HELPER(ltdbr)(CPUS390XState *env, uint32_t f1, uint32_t f2) { env->fregs[f1].d = env->fregs[f2].d; return set_cc_nz_f64(env->fregs[f1].d); }
static uint32_t do_calc_cc(CPUS390XState *env, uint32_t cc_op, uint64_t src, uint64_t dst, uint64_t vr) { S390CPU *cpu = s390_env_get_cpu(env); uint32_t r = 0; switch (cc_op) { case CC_OP_CONST0: case CC_OP_CONST1: case CC_OP_CONST2: case CC_OP_CONST3: /* cc_op value _is_ cc */ r = cc_op; break; case CC_OP_LTGT0_32: r = cc_calc_ltgt0_32(dst); break; case CC_OP_LTGT0_64: r = cc_calc_ltgt0_64(dst); break; case CC_OP_LTGT_32: r = cc_calc_ltgt_32(src, dst); break; case CC_OP_LTGT_64: r = cc_calc_ltgt_64(src, dst); break; case CC_OP_LTUGTU_32: r = cc_calc_ltugtu_32(src, dst); break; case CC_OP_LTUGTU_64: r = cc_calc_ltugtu_64(src, dst); break; case CC_OP_TM_32: r = cc_calc_tm_32(src, dst); break; case CC_OP_TM_64: r = cc_calc_tm_64(src, dst); break; case CC_OP_NZ: r = cc_calc_nz(dst); break; case CC_OP_ADD_64: r = cc_calc_add_64(src, dst, vr); break; case CC_OP_ADDU_64: r = cc_calc_addu_64(src, dst, vr); break; case CC_OP_ADDC_64: r = cc_calc_addc_64(src, dst, vr); break; case CC_OP_SUB_64: r = cc_calc_sub_64(src, dst, vr); break; case CC_OP_SUBU_64: r = cc_calc_subu_64(src, dst, vr); break; case CC_OP_SUBB_64: r = cc_calc_subb_64(src, dst, vr); break; case CC_OP_ABS_64: r = cc_calc_abs_64(dst); break; case CC_OP_NABS_64: r = cc_calc_nabs_64(dst); break; case CC_OP_COMP_64: r = cc_calc_comp_64(dst); break; case CC_OP_ADD_32: r = cc_calc_add_32(src, dst, vr); break; case CC_OP_ADDU_32: r = cc_calc_addu_32(src, dst, vr); break; case CC_OP_ADDC_32: r = cc_calc_addc_32(src, dst, vr); break; case CC_OP_SUB_32: r = cc_calc_sub_32(src, dst, vr); break; case CC_OP_SUBU_32: r = cc_calc_subu_32(src, dst, vr); break; case CC_OP_SUBB_32: r = cc_calc_subb_32(src, dst, vr); break; case CC_OP_ABS_32: r = cc_calc_abs_32(dst); break; case CC_OP_NABS_32: r = cc_calc_nabs_32(dst); break; case CC_OP_COMP_32: r = cc_calc_comp_32(dst); break; case CC_OP_ICM: r = cc_calc_icm(src, dst); break; case CC_OP_SLA_32: r = cc_calc_sla_32(src, dst); break; case CC_OP_SLA_64: r = cc_calc_sla_64(src, dst); break; case CC_OP_FLOGR: r = cc_calc_flogr(dst); break; case CC_OP_NZ_F32: r = set_cc_nz_f32(dst); break; case CC_OP_NZ_F64: r = set_cc_nz_f64(dst); break; case CC_OP_NZ_F128: r = set_cc_nz_f128(make_float128(src, dst)); break; default: cpu_abort(CPU(cpu), "Unknown CC operation: %s\n", cc_name(cc_op)); } HELPER_LOG("%s: %15s 0x%016lx 0x%016lx 0x%016lx = %d\n", __func__, cc_name(cc_op), src, dst, vr, r); return r; }