static float64 float64_ftsmul(float64 op1, uint64_t op2, float_status *stat) { float64 result = float64_mul(op1, op1, stat); if (!float64_is_any_nan(result)) { result = float64_set_sign(result, op2 & 1); } return result; }
uint32_t set_cc_nz_f64(float64 v) { if (float64_is_any_nan(v)) { return 3; } else if (float64_is_zero(v)) { return 0; } else if (float64_is_neg(v)) { return 1; } else { return 2; } }
/* test data class 64-bit */ uint32_t HELPER(tcdb)(CPUS390XState *env, uint32_t f1, uint64_t m2) { float64 v1 = env->fregs[f1].d; int neg = float64_is_neg(v1); uint32_t cc = 0; HELPER_LOG("%s: v1 0x%lx m2 0x%lx neg %d\n", __func__, v1, m2, neg); if ((float64_is_zero(v1) && (m2 & (1 << (11-neg)))) || (float64_is_infinity(v1) && (m2 & (1 << (5-neg)))) || (float64_is_any_nan(v1) && (m2 & (1 << (3-neg)))) || (float64_is_signaling_nan(v1) && (m2 & (1 << (1-neg))))) { cc = 1; } else if (m2 & (1 << (9-neg))) { /* assume normalized number */ cc = 1; } /* FIXME: denormalized? */ return cc; }