entered into RCS
From-SVN: r1476
This commit is contained in:
parent
373666321a
commit
c166a31116
@ -655,7 +655,7 @@ constrain_asm_operands (n_operands, operands, operand_constraints,
|
||||
/* Match any CONST_DOUBLE, but only if
|
||||
we can examine the bits of it reliably. */
|
||||
if ((HOST_FLOAT_FORMAT != TARGET_FLOAT_FORMAT
|
||||
|| HOST_BITS_PER_INT != BITS_PER_WORD)
|
||||
|| HOST_BITS_PER_WIDE_INT != BITS_PER_WORD)
|
||||
&& GET_CODE (op) != VOIDmode && ! flag_pretend_float)
|
||||
break;
|
||||
if (GET_CODE (op) == CONST_DOUBLE)
|
||||
@ -1160,7 +1160,7 @@ record_reg_life (insn, block, regstack)
|
||||
int n_inputs, n_outputs;
|
||||
char **constraints = (char **) alloca (n_operands * sizeof (char *));
|
||||
|
||||
decode_asm_operands (body, operands, 0, constraints, 0);
|
||||
decode_asm_operands (body, operands, NULL_PTR, constraints, NULL_PTR);
|
||||
get_asm_operand_lengths (body, n_operands, &n_inputs, &n_outputs);
|
||||
record_asm_reg_life (insn, regstack, operands, constraints,
|
||||
n_inputs, n_outputs);
|
||||
@ -2383,7 +2383,8 @@ subst_stack_regs (insn, regstack)
|
||||
char **constraints
|
||||
= (char **) alloca (n_operands * sizeof (char *));
|
||||
|
||||
decode_asm_operands (body, operands, operands_loc, constraints, 0);
|
||||
decode_asm_operands (body, operands, operands_loc,
|
||||
constraints, NULL_PTR);
|
||||
get_asm_operand_lengths (body, n_operands, &n_inputs, &n_outputs);
|
||||
subst_asm_stack_regs (insn, regstack, operands, operands_loc,
|
||||
constraints, n_inputs, n_outputs);
|
||||
@ -2391,7 +2392,7 @@ subst_stack_regs (insn, regstack)
|
||||
}
|
||||
|
||||
if (GET_CODE (PATTERN (insn)) == PARALLEL)
|
||||
for (i = 0; i < XVECLEN (PATTERN (insn) , 0); i++)
|
||||
for (i = 0; i < XVECLEN (PATTERN (insn), 0); i++)
|
||||
{
|
||||
if (stack_regs_mentioned_p (XVECEXP (PATTERN (insn), 0, i)))
|
||||
subst_stack_regs_pat (insn, regstack,
|
||||
|
53
gcc/rtl.c
53
gcc/rtl.c
@ -36,6 +36,10 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||
extern struct obstack *rtl_obstack;
|
||||
|
||||
extern long ftell();
|
||||
|
||||
#if HOST_BITS_PER_WIDE_INT != HOST_BITS_PER_INT
|
||||
extern long atol();
|
||||
#endif
|
||||
|
||||
/* Indexed by rtx code, gives number of operands for an rtx with that code.
|
||||
Does NOT include rtx header data (code and links).
|
||||
@ -136,6 +140,8 @@ char *rtx_format[] = {
|
||||
"i" an integer
|
||||
prints the integer
|
||||
"n" like "i", but prints entries from `note_insn_name'
|
||||
"w" an integer of width HOST_BITS_PER_WIDE_INT
|
||||
prints the integer
|
||||
"s" a pointer to a string
|
||||
prints the string
|
||||
"S" like "s", but optional:
|
||||
@ -282,6 +288,7 @@ copy_rtx (orig)
|
||||
XEXP (copy, i) = copy_rtx (XEXP (orig, i));
|
||||
break;
|
||||
|
||||
case '0':
|
||||
case 'u':
|
||||
XEXP (copy, i) = XEXP (orig, i);
|
||||
break;
|
||||
@ -297,9 +304,21 @@ copy_rtx (orig)
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
case 'w':
|
||||
XWINT (copy, i) = XWINT (orig, i);
|
||||
break;
|
||||
|
||||
case 'i':
|
||||
XINT (copy, i) = XINT (orig, i);
|
||||
break;
|
||||
|
||||
case 's':
|
||||
case 'S':
|
||||
XSTR (copy, i) = XSTR (orig, i);
|
||||
break;
|
||||
|
||||
default:
|
||||
abort ();
|
||||
}
|
||||
}
|
||||
return copy;
|
||||
@ -355,6 +374,7 @@ copy_most_rtx (orig, may_share)
|
||||
XEXP (copy, i) = copy_most_rtx (XEXP (orig, i), may_share);
|
||||
break;
|
||||
|
||||
case '0':
|
||||
case 'u':
|
||||
XEXP (copy, i) = XEXP (orig, i);
|
||||
break;
|
||||
@ -371,9 +391,22 @@ copy_most_rtx (orig, may_share)
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
case 'w':
|
||||
XWINT (copy, i) = XWINT (orig, i);
|
||||
break;
|
||||
|
||||
case 'n':
|
||||
case 'i':
|
||||
XINT (copy, i) = XINT (orig, i);
|
||||
break;
|
||||
|
||||
case 's':
|
||||
case 'S':
|
||||
XSTR (copy, i) = XSTR (orig, i);
|
||||
break;
|
||||
|
||||
default:
|
||||
abort ();
|
||||
}
|
||||
}
|
||||
return copy;
|
||||
@ -500,6 +533,7 @@ read_rtx (infile)
|
||||
rtx return_rtx;
|
||||
register int c;
|
||||
int tmp_int;
|
||||
HOST_WIDE_INT tmp_wide;
|
||||
|
||||
/* Linked list structure for making RTXs: */
|
||||
struct rtx_list
|
||||
@ -612,8 +646,7 @@ read_rtx (infile)
|
||||
}
|
||||
/* get vector length and allocate it */
|
||||
XVEC (return_rtx, i) = (list_counter
|
||||
? rtvec_alloc (list_counter)
|
||||
: (struct rtvec_def *) NULL);
|
||||
? rtvec_alloc (list_counter) : NULL_RTVEC);
|
||||
if (list_counter > 0)
|
||||
{
|
||||
next_rtx = list_rtx;
|
||||
@ -684,6 +717,16 @@ read_rtx (infile)
|
||||
}
|
||||
break;
|
||||
|
||||
case 'w':
|
||||
read_name (tmp_char, infile);
|
||||
#if HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_INT
|
||||
tmp_wide = atoi (tmp_char);
|
||||
#else
|
||||
tmp_wide = atol (tmp_char);
|
||||
#endif
|
||||
XWINT (return_rtx, i) = tmp_wide;
|
||||
break;
|
||||
|
||||
case 'i':
|
||||
case 'n':
|
||||
read_name (tmp_char, infile);
|
||||
@ -737,7 +780,7 @@ init_rtl ()
|
||||
/* Set the GET_RTX_FORMAT of CONST_DOUBLE to a string
|
||||
of as many `i's as we now have elements. */
|
||||
for (i = 0; i < rtx_length[(int) CONST_DOUBLE]; i++)
|
||||
*s++ = 'i';
|
||||
*s++ = 'w';
|
||||
*s++ = 0;
|
||||
}
|
||||
#endif
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* Analyze RTL for C-Compiler
|
||||
Copyright (C) 1987, 1988, 1991 Free Software Foundation, Inc.
|
||||
Copyright (C) 1987, 1988, 1991, 1992 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GNU CC.
|
||||
|
||||
@ -184,7 +184,7 @@ rtx_addr_varies_p (x)
|
||||
Only obvious integer terms are detected.
|
||||
This is used in cse.c with the `related_value' field.*/
|
||||
|
||||
int
|
||||
HOST_WIDE_INT
|
||||
get_integer_term (x)
|
||||
rtx x;
|
||||
{
|
||||
@ -561,7 +561,7 @@ find_last_value (x, pinsn, valid_to)
|
||||
if (GET_RTX_CLASS (GET_CODE (p)) == 'i')
|
||||
{
|
||||
rtx set = single_set (p);
|
||||
rtx note = find_reg_note (p, REG_EQUAL, 0);
|
||||
rtx note = find_reg_note (p, REG_EQUAL, NULL_RTX);
|
||||
|
||||
if (set && rtx_equal_p (x, SET_DEST (set)))
|
||||
{
|
||||
@ -735,7 +735,7 @@ reg_overlap_mentioned_p (x, in)
|
||||
endregno = regno + (regno < FIRST_PSEUDO_REGISTER
|
||||
? HARD_REGNO_NREGS (regno, GET_MODE (x)) : 1);
|
||||
|
||||
return refers_to_regno_p (regno, endregno, in, 0);
|
||||
return refers_to_regno_p (regno, endregno, in, NULL_PTR);
|
||||
}
|
||||
|
||||
/* Used for communications between the next few functions. */
|
||||
@ -886,6 +886,11 @@ rtx_equal_p (x, y)
|
||||
{
|
||||
switch (fmt[i])
|
||||
{
|
||||
case 'w':
|
||||
if (XWINT (x, i) != XWINT (y, i))
|
||||
return 0;
|
||||
break;
|
||||
|
||||
case 'n':
|
||||
case 'i':
|
||||
if (XINT (x, i) != XINT (y, i))
|
||||
|
@ -86,9 +86,9 @@ variable_size (size)
|
||||
}
|
||||
|
||||
if (immediate_size_expand)
|
||||
expand_expr (size, 0, VOIDmode, 0);
|
||||
expand_expr (size, NULL_PTR, VOIDmode, 0);
|
||||
else
|
||||
pending_sizes = tree_cons (0, size, pending_sizes);
|
||||
pending_sizes = tree_cons (NULL_TREE, size, pending_sizes);
|
||||
|
||||
return size;
|
||||
}
|
||||
@ -280,7 +280,7 @@ layout_record (rec)
|
||||
|
||||
if (TREE_STATIC (field))
|
||||
{
|
||||
pending_statics = tree_cons (NULL, field, pending_statics);
|
||||
pending_statics = tree_cons (NULL_TREE, field, pending_statics);
|
||||
continue;
|
||||
}
|
||||
/* Enumerators and enum types which are local to this class need not
|
||||
@ -873,14 +873,18 @@ make_signed_type (precision)
|
||||
/* Create the extreme values based on the number of bits. */
|
||||
|
||||
TYPE_MIN_VALUE (type)
|
||||
= build_int_2 ((precision-HOST_BITS_PER_INT > 0 ? 0 : (-1)<<(precision-1)),
|
||||
(-1)<<(precision-HOST_BITS_PER_INT-1 > 0
|
||||
? precision-HOST_BITS_PER_INT-1
|
||||
: 0));
|
||||
= build_int_2 ((precision - HOST_BITS_PER_WIDE_INT > 0
|
||||
? 0 : (HOST_WIDE_INT) (-1) << (precision - 1)),
|
||||
(((HOST_WIDE_INT) (-1)
|
||||
<< (precision - HOST_BITS_PER_WIDE_INT - 1 > 0
|
||||
? precision-HOST_BITS_PER_WIDE_INT - 1
|
||||
: 0))));
|
||||
TYPE_MAX_VALUE (type)
|
||||
= build_int_2 ((precision-HOST_BITS_PER_INT > 0 ? -1 : (1<<(precision-1))-1),
|
||||
(precision-HOST_BITS_PER_INT-1 > 0
|
||||
? (1<<(precision-HOST_BITS_PER_INT-1))-1
|
||||
= build_int_2 ((precision - HOST_BITS_PER_WIDE_INT > 0
|
||||
? -1 : ((HOST_WIDE_INT) 1 << (precision - 1)) - 1),
|
||||
(precision - HOST_BITS_PER_WIDE_INT - 1 > 0
|
||||
? (((HOST_WIDE_INT) 1
|
||||
<< (precision - HOST_BITS_PER_INT - 1)))-1
|
||||
: 0));
|
||||
|
||||
/* Give this type's extreme values this type as their type. */
|
||||
@ -937,10 +941,12 @@ fixup_unsigned_type (type)
|
||||
|
||||
TYPE_MIN_VALUE (type) = build_int_2 (0, 0);
|
||||
TYPE_MAX_VALUE (type)
|
||||
= build_int_2 (precision-HOST_BITS_PER_INT >= 0 ? -1 : (1<<precision)-1,
|
||||
precision-HOST_BITS_PER_INT > 0
|
||||
? ((unsigned) ~0
|
||||
>> (HOST_BITS_PER_INT - (precision - HOST_BITS_PER_INT)))
|
||||
= build_int_2 (precision - HOST_BITS_PER_WIDE_INT >= 0
|
||||
? -1 : ((HOST_WIDE_INT) 1<< precision) - 1,
|
||||
precision - HOST_BITS_PER_WIDE_INT > 0
|
||||
? ((unsigned HOST_WIDE_INT) ~0
|
||||
>> (HOST_BITS_PER_WIDE_INT
|
||||
- (precision - HOST_BITS_PER_WIDE_INT)))
|
||||
: 0);
|
||||
TREE_TYPE (TYPE_MIN_VALUE (type)) = type;
|
||||
TREE_TYPE (TYPE_MAX_VALUE (type)) = type;
|
||||
|
48
gcc/unroll.c
48
gcc/unroll.c
@ -783,15 +783,14 @@ unroll_loop (loop_end, insn_count, loop_start, end_insert_before,
|
||||
improperly shared rtl. */
|
||||
|
||||
diff = expand_binop (mode, sub_optab, copy_rtx (final_value),
|
||||
copy_rtx (initial_value), 0, 0,
|
||||
copy_rtx (initial_value), NULL_RTX, 0,
|
||||
OPTAB_LIB_WIDEN);
|
||||
|
||||
/* Now calculate (diff % (unroll * abs (increment))) by using an
|
||||
and instruction. */
|
||||
diff = expand_binop (GET_MODE (diff), and_optab, diff,
|
||||
gen_rtx (CONST_INT, VOIDmode,
|
||||
unroll_number * abs_inc - 1),
|
||||
0, 0, OPTAB_LIB_WIDEN);
|
||||
GEN_INT (unroll_number * abs_inc - 1),
|
||||
NULL_RTX, 0, OPTAB_LIB_WIDEN);
|
||||
|
||||
/* Now emit a sequence of branches to jump to the proper precond
|
||||
loop entry point. */
|
||||
@ -826,9 +825,8 @@ unroll_loop (loop_end, insn_count, loop_start, end_insert_before,
|
||||
else
|
||||
cmp_const = i;
|
||||
|
||||
emit_cmp_insn (diff, gen_rtx (CONST_INT, VOIDmode,
|
||||
abs_inc * cmp_const),
|
||||
EQ, 0, mode, 0, 0);
|
||||
emit_cmp_insn (diff, GEN_INT (abs_inc * cmp_const),
|
||||
EQ, NULL_RTX, mode, 0, 0);
|
||||
|
||||
if (i == 0)
|
||||
emit_jump_insn (gen_beq (labels[i]));
|
||||
@ -858,8 +856,8 @@ unroll_loop (loop_end, insn_count, loop_start, end_insert_before,
|
||||
else
|
||||
cmp_const = abs_inc * (unroll_number - 1) + 1;
|
||||
|
||||
emit_cmp_insn (diff, gen_rtx (CONST_INT, VOIDmode, cmp_const),
|
||||
EQ, 0, mode, 0, 0);
|
||||
emit_cmp_insn (diff, GEN_INT (cmp_const), EQ, NULL_RTX,
|
||||
mode, 0, 0);
|
||||
|
||||
if (neg_inc)
|
||||
emit_jump_insn (gen_ble (labels[0]));
|
||||
@ -1178,7 +1176,7 @@ precondition_loop_p (initial_value, final_value, increment, loop_start,
|
||||
{
|
||||
*initial_value = const0_rtx;
|
||||
*increment = const1_rtx;
|
||||
*final_value = gen_rtx (CONST_INT, VOIDmode, loop_n_iterations);
|
||||
*final_value = GEN_INT (loop_n_iterations);
|
||||
|
||||
if (loop_dump_stream)
|
||||
fprintf (loop_dump_stream,
|
||||
@ -1583,8 +1581,7 @@ copy_loop_body (copy_start, copy_end, map, exit_label, last_iteration,
|
||||
#endif
|
||||
|
||||
splittable_regs[regno]
|
||||
= gen_rtx (CONST_INT, VOIDmode,
|
||||
INTVAL (giv_inc)
|
||||
= GEN_INT (INTVAL (giv_inc)
|
||||
+ INTVAL (splittable_regs[regno]));
|
||||
giv_inc = splittable_regs[regno];
|
||||
|
||||
@ -2391,7 +2388,7 @@ find_splittable_givs (bl, unroll_type, loop_start, loop_end, increment,
|
||||
/* Check for the case where the pseudo is set by a shift/add
|
||||
sequence, in which case the first insn setting the pseudo
|
||||
is the first insn of the shift/add sequence. */
|
||||
&& (! (tem = find_reg_note (v->insn, REG_RETVAL, 0))
|
||||
&& (! (tem = find_reg_note (v->insn, REG_RETVAL, NULL_RTX))
|
||||
|| (regno_first_uid[REGNO (v->dest_reg)]
|
||||
!= INSN_UID (XEXP (tem, 0)))))
|
||||
/* Line above always fails if INSN was moved by loop opt. */
|
||||
@ -2785,8 +2782,7 @@ final_biv_value (bl, loop_start, loop_end)
|
||||
case it is needed later. */
|
||||
|
||||
tem = gen_reg_rtx (bl->biv->mode);
|
||||
emit_iv_add_mult (increment,
|
||||
gen_rtx (CONST_INT, VOIDmode, loop_n_iterations),
|
||||
emit_iv_add_mult (increment, GEN_INT (loop_n_iterations),
|
||||
bl->initial_value, tem, NEXT_INSN (loop_end));
|
||||
|
||||
if (loop_dump_stream)
|
||||
@ -2877,8 +2873,7 @@ final_giv_value (v, loop_start, loop_end)
|
||||
|
||||
/* Put the final biv value in tem. */
|
||||
tem = gen_reg_rtx (bl->biv->mode);
|
||||
emit_iv_add_mult (increment,
|
||||
gen_rtx (CONST_INT, VOIDmode, loop_n_iterations),
|
||||
emit_iv_add_mult (increment, GEN_INT (loop_n_iterations),
|
||||
bl->initial_value, tem, insert_before);
|
||||
|
||||
/* Subtract off extra increments as we find them. */
|
||||
@ -2904,7 +2899,7 @@ final_giv_value (v, loop_start, loop_end)
|
||||
|
||||
start_sequence ();
|
||||
tem = expand_binop (GET_MODE (tem), sub_optab, tem,
|
||||
XEXP (SET_SRC (pattern), 1), 0, 0,
|
||||
XEXP (SET_SRC (pattern), 1), NULL_RTX, 0,
|
||||
OPTAB_LIB_WIDEN);
|
||||
seq = gen_sequence ();
|
||||
end_sequence ();
|
||||
@ -2947,14 +2942,15 @@ final_giv_value (v, loop_start, loop_end)
|
||||
/* Calculate the number of loop iterations. Returns the exact number of loop
|
||||
iterations if it can be calculated, otherwise returns zero. */
|
||||
|
||||
unsigned long
|
||||
unsigned HOST_WIDE_INT
|
||||
loop_iterations (loop_start, loop_end)
|
||||
rtx loop_start, loop_end;
|
||||
{
|
||||
rtx comparison, comparison_value;
|
||||
rtx iteration_var, initial_value, increment, final_value;
|
||||
enum rtx_code comparison_code;
|
||||
int i, increment_dir;
|
||||
HOST_WIDE_INT i;
|
||||
int increment_dir;
|
||||
int unsigned_compare, compare_dir, final_larger;
|
||||
unsigned long tempu;
|
||||
rtx last_loop_insn;
|
||||
@ -3044,7 +3040,7 @@ loop_iterations (loop_start, loop_end)
|
||||
&& (set = single_set (insn))
|
||||
&& (SET_DEST (set) == comparison_value))
|
||||
{
|
||||
rtx note = find_reg_note (insn, REG_EQUAL, 0);
|
||||
rtx note = find_reg_note (insn, REG_EQUAL, NULL_RTX);
|
||||
|
||||
if (note && GET_CODE (XEXP (note, 0)) != EXPR_LIST)
|
||||
comparison_value = XEXP (note, 0);
|
||||
@ -3094,11 +3090,13 @@ loop_iterations (loop_start, loop_end)
|
||||
/* Final_larger is 1 if final larger, 0 if they are equal, otherwise -1. */
|
||||
if (unsigned_compare)
|
||||
final_larger
|
||||
= ((unsigned) INTVAL (final_value) > (unsigned) INTVAL (initial_value)) -
|
||||
((unsigned) INTVAL (final_value) < (unsigned) INTVAL (initial_value));
|
||||
= ((unsigned HOST_WIDE_INT) INTVAL (final_value)
|
||||
> (unsigned HOST_WIDE_INT) INTVAL (initial_value))
|
||||
- ((unsigned HOST_WIDE_INT) INTVAL (final_value)
|
||||
< (unsigned HOST_WIDE_INT) INTVAL (initial_value));
|
||||
else
|
||||
final_larger = (INTVAL (final_value) > INTVAL (initial_value)) -
|
||||
(INTVAL (final_value) < INTVAL (initial_value));
|
||||
final_larger = (INTVAL (final_value) > INTVAL (initial_value))
|
||||
- (INTVAL (final_value) < INTVAL (initial_value));
|
||||
|
||||
if (INTVAL (increment) > 0)
|
||||
increment_dir = 1;
|
||||
|
@ -359,7 +359,7 @@ xcoffout_block (block, depth, args)
|
||||
next_block_number++;
|
||||
|
||||
/* Output the subblocks. */
|
||||
xcoffout_block (BLOCK_SUBBLOCKS (block), depth + 1, 0);
|
||||
xcoffout_block (BLOCK_SUBBLOCKS (block), depth + 1, NULL_TREE);
|
||||
}
|
||||
block = BLOCK_CHAIN (block);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user