Richard Kenner [Mon, 3 Aug 1992 01:35:35 +0000 (21:35 -0400)]
(reg_sign_bit_copies): New variable.
(combine_instructions): Initialize it.
(set_significant): Set it.
(try_combine): Set subst_low_cuid immediately before calling `subst' to
the INSN_CUID of the lowest insn involved in the call. Change XOR with
out-of-range constant to (not (xor ...)).
Call both split_insns and find_split_point; pass extra parm to
find_split_point.
Record I2DEST's value if I2 now sets it; similarly for I1DEST.
(find_split_point): Add new arg INSN.
If AND'ing with a large single-bit constant and we only care about
equality with zero, replace with bit extraction.
Make two shifts for ZERO_EXTRACTs unless very narrow.
(subst): Move RESTART label earlier.
If we have a simple operation applied to IF_THEN_ELSE, move the operation
inside the two arms.
(subst, case SUBREG): Use force_to_mode.
(subst, case NOT): Change (not (xor X C)) to (xor X ~C).
(subst, case NEG): Remove (neg (abs X)); redundant.
Convert (neg (xor A 1)) to (plus A -1) if A is known to be 0 or 1.
(subst, case IF_THEN_ELSE): Simplify if an arm contains a register being
tested by substiting the known value.
Put constant integer in last arm if can reverse comparison.
(subst, case SET): Use gen_lowpart_for_combine.
(subst, case AND): Make IF_THEN_ELSE when appropriate.
(subst, case IOR): (ior A C) can sometimes be just C.
(subst, case XOR): Go back and restart when canonicalizing.
(subst, case ABS): Use num_sign_bit_copies.
(make_extraction): Call force_to_mode.
(make_compound_operation): Look at optabs rather that explicitly checking
for operations and assuming we have SImode.
Handle (ashiftrt (OP (ashift foo C1) C3) C2).
(force_to_mode): Only change mode of arithmetic if optab says we have
operation in that mode.
Remove unneeded ASHIFTRT; add handling for IF_THEN_ELSE.
(significant_bits, case NEG): Call num_sign_bit_copies.
(significant_bits, case ABS, case [US]{MIN,MAX}, IF_THEN_ELSE): New.
(num_sign_bit_copies): New function.
(simplify_shift_const): Remove ASHIFTRT if value is known -1 or 0.
Use num_sign_bit_copies to simplify (ashiftrt (ashift ...) ...)
and (ashiftrt (neg ...) ...).
Remove now redundant case when VAROP is a PLUS.
(simplify_comparison): If A is known to be -1 or 0, A != -1 is A == 0.
Simplify unsigned tests that really check the sign bit.
(simplify_comparison, case ASHIFTRT): Convert to LSHIFTRT if equality
comparison with zero.
(get_last_value): Check if the desired register is set in the
insn before the one whose INSN_CUID is subst_low_cuid.
(ASM_OUTPUT_DWARF_STRING): redefinition was incorrect, and uneeded...
(ASM_OUTPUT_DWARF_STRING): redefinition was
incorrect, and uneeded; while Solaris as doesn't support .string, it
does support .asciz, and sparcv4.h takes care of including that definition.
But don't warn if function definition follows a declaration.
(pushdecl): Don't handle it here.
(grokparms): Don't warn about non-prototype decl in system header.
(ASM_OUTPUT_DOUBLE): Use REAL_VALUE_TO_TARGET_DOUBLE to convert.
(ASM_OUTPUT_FLOAT): Use REAL_VALUE_TO_TARGET_SINGLE to convert.
(ASM_OUTPUT_INT): Use ASM_LONG pseudo-op.
(ASM_OUTPUT_SHORT): Use ASM_SHORT pseudo-op.
(ASM_OUTPUT_CHAR): Use ASM_BYTE_OP pseudo-op.
(ASM_OUTPUT_BYTE): Use ASM_BYTE_OP pseudo-op.
Richard Stallman [Fri, 24 Jul 1992 21:13:11 +0000 (21:13 +0000)]
(is_tagged_type): New function added.
(member_attribute): Use it.
(type_ok_for_scope): Rewritten to eliminate serious bugs.
(output_type): Call `output_pending_types_for_scope' at the end of
struct/union types (which are themselves scopes in C++).
Richard Stallman [Thu, 23 Jul 1992 06:05:23 +0000 (06:05 +0000)]
(default_conversion): Use C_PROMOTING_INTEGER_TYPE_P to decide whether a type should promote.
(default_conversion): Use C_PROMOTING_INTEGER_TYPE_P
to decide whether a type should promote.
(self_promoting_args_p, self_promoting_type_p): Likewise.
Jeff Law [Wed, 22 Jul 1992 20:04:55 +0000 (14:04 -0600)]
(movdf+1): Use new 'T' and 'U' constraints to determine when an ldd or std will have a length of 1...
(movdf+1): Use new 'T' and 'U' constraints to
determine when an ldd or std will have a length of 1, and
therefore is eligible for use in some delay slots.
(uncond_branch): New attribute used for unconditional branches.
All unconditional branch patterns changed to use this attribute.
(define_delays and delay slot attributes): Do not allow
uncond_branch instructions in delay slots. Do not allow fpload or
fpstore operations in a conditional branch delay slot. Allow
fpload and fpstore in call, unconditional branch, and annuled
conditional branch delay slots.
Functions renamed from registers_ok_for_ldd and
memory_ok_for_ldd repectively. All callers changed.
(register_ok_for_ldd): New function to determine if a register
is a pseudo or the first register in a hard register pair.
(mem_aligned_8): No longer static. Return 0 instead of aborting
when presented with an rtx which is not a MEM.
(eligible_for_epilogue_delay): Use in_uncond_branch_delay since this
is an unconditional branch.