This is the first of 8 patches from reading through the diff with mainline. Some places had an off-by-one error on an index and some used "<= 0" instead of ">= 0".
I think we should use MAX_BITSIZE_MODE_ANY_MODE rather than MAX_BITSIZE_MODE_ANY_INT when handling floating-point modes. Two hunks contain unrelated formatting fixes too. Tested on x86_64-linux-gnu. OK to install? Thanks, Richard Index: gcc/c-family/c-ada-spec.c =================================================================== --- gcc/c-family/c-ada-spec.c 2014-04-22 20:31:10.632895953 +0100 +++ gcc/c-family/c-ada-spec.c 2014-04-22 20:31:24.880998602 +0100 @@ -2205,8 +2205,9 @@ dump_generic_ada_node (pretty_printer *b val = -val; } sprintf (pp_buffer (buffer)->digit_buffer, - "16#%" HOST_WIDE_INT_PRINT "x", val.elt (val.get_len () - 1)); - for (i = val.get_len () - 2; i <= 0; i--) + "16#%" HOST_WIDE_INT_PRINT "x", + val.elt (val.get_len () - 1)); + for (i = val.get_len () - 2; i >= 0; i--) sprintf (pp_buffer (buffer)->digit_buffer, HOST_WIDE_INT_PRINT_PADDED_HEX, val.elt (i)); pp_string (buffer, pp_buffer (buffer)->digit_buffer); Index: gcc/dbxout.c =================================================================== --- gcc/dbxout.c 2014-04-22 20:31:10.632895953 +0100 +++ gcc/dbxout.c 2014-04-22 20:31:24.881998608 +0100 @@ -720,7 +720,7 @@ stabstr_O (tree cst) } prec -= res_pres; - for (i = prec - 3; i <= 0; i = i - 3) + for (i = prec - 3; i >= 0; i = i - 3) { digit = wi::extract_uhwi (cst, i, 3); stabstr_C ('0' + digit); Index: gcc/dwarf2out.c =================================================================== --- gcc/dwarf2out.c 2014-04-22 20:31:10.632895953 +0100 +++ gcc/dwarf2out.c 2014-04-22 20:31:24.884998630 +0100 @@ -1847,7 +1847,7 @@ output_loc_operands (dw_loc_descr_ref lo int i; int len = get_full_len (*val2->v.val_wide); if (WORDS_BIG_ENDIAN) - for (i = len; i >= 0; --i) + for (i = len - 1; i >= 0; --i) dw2_asm_output_data (HOST_BITS_PER_WIDE_INT / HOST_BITS_PER_CHAR, val2->v.val_wide->elt (i), NULL); else @@ -2073,7 +2073,7 @@ output_loc_operands (dw_loc_descr_ref lo dw2_asm_output_data (1, len * l, NULL); if (WORDS_BIG_ENDIAN) - for (i = len; i >= 0; --i) + for (i = len - 1; i >= 0; --i) dw2_asm_output_data (l, val2->v.val_wide->elt (i), NULL); else for (i = 0; i < len; ++i) @@ -5398,11 +5398,11 @@ print_die (dw_die_ref die, FILE *outfile int i = a->dw_attr_val.v.val_wide->get_len (); fprintf (outfile, "constant ("); gcc_assert (i > 0); - if (a->dw_attr_val.v.val_wide->elt (i) == 0) + if (a->dw_attr_val.v.val_wide->elt (i - 1) == 0) fprintf (outfile, "0x"); fprintf (outfile, HOST_WIDE_INT_PRINT_HEX, a->dw_attr_val.v.val_wide->elt (--i)); - while (-- i >= 0) + while (--i >= 0) fprintf (outfile, HOST_WIDE_INT_PRINT_PADDED_HEX, a->dw_attr_val.v.val_wide->elt (i)); fprintf (outfile, ")"); @@ -8723,7 +8723,7 @@ output_die (dw_die_ref die) NULL); if (WORDS_BIG_ENDIAN) - for (i = len; i >= 0; --i) + for (i = len - 1; i >= 0; --i) { dw2_asm_output_data (l, a->dw_attr_val.v.val_wide->elt (i), name); Index: gcc/simplify-rtx.c =================================================================== --- gcc/simplify-rtx.c 2014-04-22 20:31:10.632895953 +0100 +++ gcc/simplify-rtx.c 2014-04-22 20:31:24.884998630 +0100 @@ -5395,7 +5395,7 @@ simplify_immed_subreg (enum machine_mode case MODE_DECIMAL_FLOAT: { REAL_VALUE_TYPE r; - long tmp[MAX_BITSIZE_MODE_ANY_INT / 32]; + long tmp[MAX_BITSIZE_MODE_ANY_MODE / 32]; /* real_from_target wants its input in words affected by FLOAT_WORDS_BIG_ENDIAN. However, we ignore this,