/* condition codes for unary FP ops */ uint32_t set_cc_nz_f32(float32 v) { if (float32_is_any_nan(v)) { return 3; } else if (float32_is_zero(v)) { return 0; } else if (float32_is_neg(v)) { return 1; } else { return 2; } }
uint32_t HELPER(ftoui)(float32 v, uint32_t rounding_mode, uint32_t scale) { float_status fp_status = {0}; float32 res; set_float_rounding_mode(rounding_mode, &fp_status); res = float32_scalbn(v, scale, &fp_status); if (float32_is_neg(v) && !float32_is_any_nan(v)) { return float32_to_int32(res, &fp_status); } else { return float32_to_uint32(res, &fp_status); } }
/* test data class 32-bit */ uint32_t HELPER(tceb)(CPUS390XState *env, uint32_t f1, uint64_t m2) { float32 v1 = env->fregs[f1].l.upper; int neg = float32_is_neg(v1); uint32_t cc = 0; HELPER_LOG("%s: v1 0x%lx m2 0x%lx neg %d\n", __func__, (long)v1, m2, neg); if ((float32_is_zero(v1) && (m2 & (1 << (11-neg)))) || (float32_is_infinity(v1) && (m2 & (1 << (5-neg)))) || (float32_is_any_nan(v1) && (m2 & (1 << (3-neg)))) || (float32_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; }