From d0cf8d386017196fb866c5bccab1640e0f9f876d Mon Sep 17 00:00:00 2001 From: rth Date: Thu, 11 Oct 2001 06:56:22 +0000 Subject: [PATCH] * i386.c (test splitter): Narrow tests vs paradoxical subregs. (jcc splitters): Add two splitters to simplify compound compares that simplify_comparison can't handle. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@46178 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 32 ++++++++++++++------------ gcc/config/i386/i386.md | 60 ++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 77 insertions(+), 15 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 90ff4bc..5e491e99 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,6 +1,10 @@ 2001-10-10 Richard Henderson - * combine.c (try_combine): Handle a SEQUENCE of one insn. + * combine.c (try_combine): Handle a SEQUENCE of one insn. + + * i386.c (test splitter): Narrow tests vs paradoxical subregs. + (jcc splitters): Add two splitters to simplify compound compares + that simplify_comparison can't handle. 2001-10-10 Richard Henderson @@ -301,8 +305,8 @@ Wed Oct 10 00:41:29 EDT 2001 John Wehle (john@feith.com) 2001-10-08 Richard Henderson - * i386.md (movsi_xor): Export. - (setcc peep2): Use it when available; add an alternative to + * i386.md (movsi_xor): Export. + (setcc peep2): Use it when available; add an alternative to match zero_extendhisi2_and. 2001-10-08 Kaveh R. Ghazi @@ -533,7 +537,7 @@ Sat Oct 6 07:42:39 2001 Richard Kenner 2001-10-06 Ulrich Weigand - * config/s390/s390.c (s390_va_arg): Use set_mem_alias_set. + * config/s390/s390.c (s390_va_arg): Use set_mem_alias_set. 2001-10-05 Joseph S. Myers @@ -541,15 +545,15 @@ Sat Oct 6 07:42:39 2001 Richard Kenner 2001-10-05 Catherine Moore - * config/stormy16/stormy-abi: Document abi changes. - * config/stormy16/stormy16.h (REG_ALLOC_ORDER): Redefine. - (ICALL_REGS): New register class. - (NUM_ARGUMENT_REGISTERS): Now 6. - (DEFAULT_PCC_STRUCT_RETURN): Don't try to return structs - in registers. - (REG_CLASS_FROM_LETTER): Map 'z' to ICALL_REGS. - * config/stormy16.md (call_internal, call_value_internal, - indirect_jump): Use new 'z' constraint. + * config/stormy16/stormy-abi: Document abi changes. + * config/stormy16/stormy16.h (REG_ALLOC_ORDER): Redefine. + (ICALL_REGS): New register class. + (NUM_ARGUMENT_REGISTERS): Now 6. + (DEFAULT_PCC_STRUCT_RETURN): Don't try to return structs + in registers. + (REG_CLASS_FROM_LETTER): Map 'z' to ICALL_REGS. + * config/stormy16.md (call_internal, call_value_internal, + indirect_jump): Use new 'z' constraint. 2001-10-05 Neil Booth @@ -1055,7 +1059,7 @@ Mon Oct 1 06:43:41 2001 Richard Kenner storehps builtins. * doc/extend.texi (Vector Extensions): New node. * doc/invoke.texi (Machine Dependent Options): Add documentation for - i386 -mmmx, -msse, -m3dnow. + i386 -mmmx, -msse, -m3dnow. Sat Sep 29 15:08:16 CEST 2001 Jan Hubicka diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md index 63fefc8..10c1b35 100644 --- a/gcc/config/i386/i386.md +++ b/gcc/config/i386/i386.md @@ -8125,7 +8125,7 @@ HOST_WIDE_INT len = INTVAL (operands[1]); HOST_WIDE_INT pos = INTVAL (operands[2]); HOST_WIDE_INT mask; - enum machine_mode mode; + enum machine_mode mode, submode; mode = GET_MODE (operands[0]); if (GET_CODE (operands[0]) == MEM) @@ -8138,6 +8138,15 @@ operands[0] = adjust_address (operands[0], mode, 0); } } + else if (GET_CODE (operands[0]) == SUBREG + && (submode = GET_MODE (SUBREG_REG (operands[0])), + GET_MODE_BITSIZE (mode) > GET_MODE_BITSIZE (submode)) + && pos + len <= GET_MODE_BITSIZE (submode)) + { + /* Narrow a paradoxical subreg to prevent partial register stalls. */ + mode = submode; + operands[0] = SUBREG_REG (operands[0]); + } else if (mode == HImode && pos + len <= 8) { /* Small HImode tests can be converted to QImode. */ @@ -12745,6 +12754,55 @@ (const_int 0) (const_int 1)))]) +;; In general it is not safe to assume too much about CCmode registers, +;; so simplify-rtx stops when it sees a second one. Under certain +;; conditions this is safe on x86, so help combine not create +;; +;; seta %al +;; testb %al, %al +;; je Lfoo + +(define_split + [(set (pc) + (if_then_else (ne (match_operator 0 "ix86_comparison_operator" + [(reg 17) (const_int 0)]) + (const_int 0)) + (label_ref (match_operand 1 "" "")) + (pc)))] + "" + [(set (pc) + (if_then_else (match_dup 0) + (label_ref (match_dup 1)) + (pc)))] +{ + PUT_MODE (operands[0], VOIDmode); +}) + +(define_split + [(set (pc) + (if_then_else (eq (match_operator 0 "ix86_comparison_operator" + [(reg 17) (const_int 0)]) + (const_int 0)) + (label_ref (match_operand 1 "" "")) + (pc)))] + "" + [(set (pc) + (if_then_else (match_dup 0) + (label_ref (match_dup 1)) + (pc)))] +{ + rtx new_op0 = copy_rtx (operands[0]); + operands[0] = new_op0; + PUT_MODE (new_op0, VOIDmode); + PUT_CODE (new_op0, REVERSE_CONDITION (GET_CODE (new_op0), + GET_MODE (XEXP (new_op0, 0)))); + + /* Make sure that (a) the CCmode we have for the flags is strong + enough for the reversed compare or (b) we have a valid FP compare. */ + if (! ix86_comparison_operator (new_op0, VOIDmode)) + FAIL; +}) + ;; Define combination compare-and-branch fp compare instructions to use ;; during early optimization. Splitting the operation apart early makes ;; for bad code when we want to reverse the operation. -- 2.7.4