> Index: gcc/config/sparc/sparc.c > =================================================================== > --- gcc/config/sparc/sparc.c (revision 191083) > +++ gcc/config/sparc/sparc.c (working copy) > @@ -10113,33 +10113,27 @@ sparc_fold_builtin (tree fndecl, int n_a > && TREE_CODE (arg1) == VECTOR_CST > && TREE_CODE (arg2) == INTEGER_CST) > { > - int overflow = 0; > - unsigned HOST_WIDE_INT low = TREE_INT_CST_LOW (arg2); > - HOST_WIDE_INT high = TREE_INT_CST_HIGH (arg2); > + bool overflow = false; > + double_int di_arg2 = TREE_INT_CST (arg2); > unsigned i; > > for (i = 0; i < VECTOR_CST_NELTS (arg0); ++i) > { > - unsigned HOST_WIDE_INT > - low0 = TREE_INT_CST_LOW (VECTOR_CST_ELT (arg0, i)), > - low1 = TREE_INT_CST_LOW (VECTOR_CST_ELT (arg1, i)); > - HOST_WIDE_INT > - high0 = TREE_INT_CST_HIGH (VECTOR_CST_ELT (arg0, i)); > - HOST_WIDE_INT > - high1 = TREE_INT_CST_HIGH (VECTOR_CST_ELT (arg1, i)); > + double_int e0 = TREE_INT_CST (VECTOR_CST_ELT (arg0, i)); > + double_int e1 = TREE_INT_CST (VECTOR_CST_ELT (arg1, i)); > > - unsigned HOST_WIDE_INT l; > - HOST_WIDE_INT h; > + bool neg1_ovf, neg2_ovf, add1_ovf, add2_ovf; > > - overflow |= neg_double (low1, high1, &l, &h); > - overflow |= add_double (low0, high0, l, h, &l, &h); > - if (h < 0) > - overflow |= neg_double (l, h, &l, &h); > + double_int tmp = e1.neg_with_overflow (&neg1_ovf); > + tmp = e0.add_with_sign (tmp, false, &add1_ovf); > + if (tmp.is_negative ()) > + tmp = tmp.neg_with_overflow (&neg2_ovf); > > - overflow |= add_double (low, high, l, h, &low, &high); > + tmp = di_arg2.add_with_sign (tmp, false, &add2_ovf); > + overflow |= neg1_ovf | neg2_ovf | add1_ovf | add2_ovf; > } > > - gcc_assert (overflow == 0); > + gcc_assert (!overflow); > > return build_int_cst_wide (rtype, low, high); > }
This cannot build because of the references to low and high in the last line. As Richard said, building a cross cc1 is very easy. -- Eric Botcazou