aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Henderson <rth@gcc.gnu.org>2001-10-10 23:56:22 -0700
committerRichard Henderson <rth@gcc.gnu.org>2001-10-10 23:56:22 -0700
commit592188a538c1993640b27f0788f382e282dddbb6 (patch)
tree82db26982a0b0147ca5d7befcd42024b07ea9cd3 /gcc
parent7f16eed442ca3fe62781be3711e4fcd514f91769 (diff)
downloadgcc-592188a538c1993640b27f0788f382e282dddbb6.zip
gcc-592188a538c1993640b27f0788f382e282dddbb6.tar.gz
gcc-592188a538c1993640b27f0788f382e282dddbb6.tar.bz2
i386.c (test splitter): Narrow tests vs paradoxical subregs.
* i386.c (test splitter): Narrow tests vs paradoxical subregs. (jcc splitters): Add two splitters to simplify compound compares that simplify_comparison can't handle. From-SVN: r46178
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog32
-rw-r--r--gcc/config/i386/i386.md60
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 <rth@redhat.com>
- * 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 <rth@redhat.com>
@@ -301,8 +305,8 @@ Wed Oct 10 00:41:29 EDT 2001 John Wehle (john@feith.com)
2001-10-08 Richard Henderson <rth@redhat.com>
- * 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 <ghazi@caip.rutgers.edu>
@@ -533,7 +537,7 @@ Sat Oct 6 07:42:39 2001 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
2001-10-06 Ulrich Weigand <uweigand@de.ibm.com>
- * 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 <jsm28@cam.ac.uk>
@@ -541,15 +545,15 @@ Sat Oct 6 07:42:39 2001 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
2001-10-05 Catherine Moore <clm@redhat.com>
- * 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 <neil@daikokuya.demon.co.uk>
@@ -1055,7 +1059,7 @@ Mon Oct 1 06:43:41 2001 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
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 <jh@suse.cz>
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.