static bool fixed_saturate1 (machine_mode mode, double_int a, double_int *f, bool sat_p) { bool overflow_p = false; bool unsigned_p = UNSIGNED_FIXED_POINT_MODE_P (mode); int i_f_bits = GET_MODE_IBIT (mode) + GET_MODE_FBIT (mode); if (unsigned_p) /* Unsigned type. */ { double_int max; max.low = -1; max.high = -1; max = max.zext (i_f_bits); if (a.ugt (max)) { if (sat_p) *f = max; else overflow_p = true; } } else /* Signed type. */ { double_int max, min; max.high = -1; max.low = -1; max = max.zext (i_f_bits); min.high = 0; min.low = 1; min = min.alshift (i_f_bits, HOST_BITS_PER_DOUBLE_INT); min = min.sext (1 + i_f_bits); if (a.sgt (max)) { if (sat_p) *f = max; else overflow_p = true; } else if (a.slt (min)) { if (sat_p) *f = min; else overflow_p = true; } } return overflow_p; }
static bool fixed_saturate2 (machine_mode mode, double_int a_high, double_int a_low, double_int *f, bool sat_p) { bool overflow_p = false; bool unsigned_p = UNSIGNED_FIXED_POINT_MODE_P (mode); int i_f_bits = GET_MODE_IBIT (mode) + GET_MODE_FBIT (mode); if (unsigned_p) /* Unsigned type. */ { double_int max_r, max_s; max_r.high = 0; max_r.low = 0; max_s.high = -1; max_s.low = -1; max_s = max_s.zext (i_f_bits); if (a_high.ugt (max_r) || (a_high == max_r && a_low.ugt (max_s))) { if (sat_p) *f = max_s; else overflow_p = true; } } else /* Signed type. */ { double_int max_r, max_s, min_r, min_s; max_r.high = 0; max_r.low = 0; max_s.high = -1; max_s.low = -1; max_s = max_s.zext (i_f_bits); min_r.high = -1; min_r.low = -1; min_s.high = 0; min_s.low = 1; min_s = min_s.alshift (i_f_bits, HOST_BITS_PER_DOUBLE_INT); min_s = min_s.sext (1 + i_f_bits); if (a_high.sgt (max_r) || (a_high == max_r && a_low.ugt (max_s))) { if (sat_p) *f = max_s; else overflow_p = true; } else if (a_high.slt (min_r) || (a_high == min_r && a_low.ult (min_s))) { if (sat_p) *f = min_s; else overflow_p = true; } } return overflow_p; }