public inbox for gcc@gcc.gnu.org
 help / color / mirror / Atom feed
* DImode speedup on i386
@ 1998-02-18  4:16 Bernd Schmidt
  1998-02-18 22:21 ` Richard Henderson
  1998-02-19  3:32 ` Jeffrey A Law
  0 siblings, 2 replies; 5+ messages in thread
From: Bernd Schmidt @ 1998-02-18  4:16 UTC (permalink / raw)
  To: egcs

The following patch improves performance of DImode operations on the i386.
For the chess program Crafty, which relies heavily upon those operations,
this patch improved the "nodes per second" count in the built-in benchmark
from 79558 to 93047. It also made the executable 12000 bytes smaller.

Bernd

	* i386/i386.c (ix86_logical_operator): New function.
	(split_di): When splitting a MEM, make sure the new MEMs have
	SImode.
	* i386/i386.md (xordi3, anddi3, iordi3): New patterns.
	Add a define_split to implement them.

Index: config/i386//i386.c
===================================================================
RCS file: /usr/local/cvs/gcc/gcc/config/i386/i386.c,v
retrieving revision 1.1.3.7
diff -c -p -r1.1.3.7 i386.c
*** i386.c	1998/02/16 19:05:44	1.1.3.7
--- i386.c	1998/02/17 10:06:33
*************** arithmetic_comparison_operator (op, mode
*** 1698,1703 ****
--- 1698,1712 ----
  
    return (code != GT && code != LE);
  }
+ 
+ int
+ ix86_logical_operator (op, mode)
+      register rtx op;
+      enum machine_mode mode;
+ {
+   return GET_CODE (op) == AND || GET_CODE (op) == IOR || GET_CODE (op) == XOR;
+ }
+ 
  \f
  /* Returns 1 if OP contains a symbol reference */
  
*************** split_di (operands, num, lo_half, hi_hal
*** 3697,3704 ****
  	split_double (operands[num], &lo_half[num], &hi_half[num]);
        else if (offsettable_memref_p (operands[num]))
  	{
! 	  lo_half[num] = operands[num];
! 	  hi_half[num] = adj_offsettable_operand (operands[num], 4);
  	}
        else
  	abort();
--- 3706,3713 ----
  	split_double (operands[num], &lo_half[num], &hi_half[num]);
        else if (offsettable_memref_p (operands[num]))
  	{
! 	  lo_half[num] = gen_rtx (MEM, SImode, XEXP (operands[num], 0));
! 	  hi_half[num] = gen_rtx (MEM, SImode, XEXP (adj_offsettable_operand (operands[num], 4), 0));
  	}
        else
  	abort();
Index: config/i386//i386.md
===================================================================
RCS file: /usr/local/cvs/gcc/gcc/config/i386/i386.md,v
retrieving revision 1.1.3.6
diff -c -p -r1.1.3.6 i386.md
*** i386.md	1998/02/16 19:05:47	1.1.3.6
--- i386.md	1998/02/17 10:06:33
*************** byte_xor_operation:
*** 4241,4246 ****
--- 4241,4346 ----
    ""
    "* return AS2 (xor%B0,%2,%0);")
  \f
+ ;; logical operations for DImode
+ 
+ (define_insn "anddi3"
+   [(set (match_operand:DI 0 "general_operand" "=&r,&ro,o,!&r,!o,!o")
+ 	(and:DI (match_operand:DI 1 "general_operand" "%0,0,0iF,or,riF,o")
+ 		(match_operand:DI 2 "general_operand" "o,riF,or,or,oriF,o")))
+    (clobber (match_scratch:SI 3 "=X,X,&r,X,&r,&r"))]
+   ""
+   "#")
+   
+ (define_insn "iordi3"
+   [(set (match_operand:DI 0 "general_operand" "=&r,&ro,o,!&r,!o,!o")
+ 	(ior:DI (match_operand:DI 1 "general_operand" "%0,0,0iF,or,riF,o")
+ 		(match_operand:DI 2 "general_operand" "o,riF,or,or,oriF,o")))
+    (clobber (match_scratch:SI 3 "=X,X,&r,X,&r,&r"))]
+   ""
+   "#")
+   
+ (define_insn "xordi3"
+   [(set (match_operand:DI 0 "general_operand" "=&r,&ro,o,!&r,!o,!o")
+ 	(xor:DI (match_operand:DI 1 "general_operand" "%0,0,0iF,or,riF,o")
+ 		(match_operand:DI 2 "general_operand" "o,riF,or,or,oriF,o")))
+    (clobber (match_scratch:SI 3 "=X,X,&r,X,&r,&r"))]
+   ""
+   "#")
+ 
+ (define_split
+   [(set (match_operand:DI 0 "general_operand" "=&r,&ro,o,!&r,!o,!o")
+ 	(match_operator:DI 4 "ix86_logical_operator"
+ 	  [(match_operand:DI 1 "general_operand" "%0,0,0iF,or,riF,o")
+ 	   (match_operand:DI 2 "general_operand" "o,riF,or,or,oriF,o")]))
+    (clobber (match_scratch:SI 3 "=X,X,&r,X,&r,&r"))]
+   "reload_completed"
+   [(const_int 0)]
+   "
+ {
+   rtx low[3], high[3], xops[7], temp;
+   rtx (*genfunc)() = (GET_CODE (operands[4]) == AND ? gen_andsi3
+ 		      : GET_CODE (operands[4]) == IOR ? gen_iorsi3
+ 		      : GET_CODE (operands[4]) == XOR ? gen_xorsi3
+ 		      : 0);
+ 
+   if (rtx_equal_p (operands[0], operands[2]))
+     {
+       temp = operands[1];
+       operands[1] = operands[2];
+       operands[2] = temp;
+     }
+ 
+   split_di (operands, 3, low, high);
+   if (!rtx_equal_p (operands[0], operands[1]))
+     {
+       xops[0] = high[0];
+       xops[1] = low[0];
+       xops[2] = high[1];
+       xops[3] = low[1];
+ 
+       if (GET_CODE (operands[0]) != MEM)
+ 	{
+ 	  emit_insn (gen_movsi (xops[1], xops[3]));
+ 	  emit_insn (gen_movsi (xops[0], xops[2]));
+ 	}
+       else
+ 	{
+ 	  xops[4] = high[2];
+ 	  xops[5] = low[2];
+ 	  xops[6] = operands[3];
+ 	  emit_insn (gen_movsi (xops[6], xops[3]));
+ 	  emit_insn ((*genfunc) (xops[6], xops[6], xops[5]));
+ 	  emit_insn (gen_movsi (xops[1], xops[6]));
+ 	  emit_insn (gen_movsi (xops[6], xops[2]));
+ 	  emit_insn ((*genfunc) (xops[6], xops[6], xops[4]));
+ 	  emit_insn (gen_movsi (xops[0], xops[6]));
+ 	  DONE;
+ 	}
+     }
+ 
+   if (GET_CODE (operands[3]) == REG && GET_CODE (operands[2]) != REG)
+     {
+       xops[0] = high[0];
+       xops[1] = low[0];
+       xops[2] = high[2];
+       xops[3] = low[2];
+       xops[4] = operands[3];
+ 
+       emit_insn (gen_movsi (xops[4], xops[3]));
+       emit_insn ((*genfunc) (xops[1], xops[1], xops[4]));
+       emit_insn (gen_movsi (xops[4], xops[2]));
+       emit_insn ((*genfunc) (xops[0], xops[0], xops[4]));
+     }
+ 
+   else
+     {
+       emit_insn ((*genfunc) (low[0], low[0], low[2]));
+       emit_insn ((*genfunc) (high[0], high[0], high[2]));
+     }
+ 
+   DONE;
+ }")
+ 
  ;;- negation instructions
  
  (define_insn "negdi2"

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: DImode speedup on i386
  1998-02-18  4:16 DImode speedup on i386 Bernd Schmidt
@ 1998-02-18 22:21 ` Richard Henderson
  1998-02-19  3:32 ` Jeffrey A Law
  1 sibling, 0 replies; 5+ messages in thread
From: Richard Henderson @ 1998-02-18 22:21 UTC (permalink / raw)
  To: Bernd Schmidt; +Cc: egcs

On Wed, Feb 18, 1998 at 11:33:23AM +0100, Bernd Schmidt wrote:
> ! 	  lo_half[num] = gen_rtx (MEM, SImode, XEXP (operands[num], 0));
> ! 	  hi_half[num] = gen_rtx (MEM, SImode, XEXP (adj_offsettable_operand (operands[num], 4), 0));

You should probably be using change_address here, to preserve
the /s, /v, and whatnot bits.


r~

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: DImode speedup on i386
  1998-02-18  4:16 DImode speedup on i386 Bernd Schmidt
  1998-02-18 22:21 ` Richard Henderson
@ 1998-02-19  3:32 ` Jeffrey A Law
  1998-02-20  8:47   ` Bernd Schmidt
  1 sibling, 1 reply; 5+ messages in thread
From: Jeffrey A Law @ 1998-02-19  3:32 UTC (permalink / raw)
  To: Bernd Schmidt; +Cc: egcs, scox

  In message < Pine.SOL.3.90.980218113225.12315H-100000@bond.informatik.rwth-aachen.de >you write:
  > 
  > The following patch improves performance of DImode operations on the i386.
  > For the chess program Crafty, which relies heavily upon those operations,
  > this patch improved the "nodes per second" count in the built-in benchmark
  > from 79558 to 93047. It also made the executable 12000 bytes smaller.
  > 
  > Bernd
  > 
  > 	* i386/i386.c (ix86_logical_operator): New function.
  > 	(split_di): When splitting a MEM, make sure the new MEMs have
  > 	SImode.
  > 	* i386/i386.md (xordi3, anddi3, iordi3): New patterns.
  > 	Add a define_split to implement them.
One general note -- you have to be *extremely* careful defining DImode
patterns on the x86 due to the bad interactions with register
reloading.

I would like Stan's opinion on these patches before they're installed
since he had the "pleasure" of dealing with the last round of
DImode problems on the x86.

jeff

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: DImode speedup on i386
  1998-02-19  3:32 ` Jeffrey A Law
@ 1998-02-20  8:47   ` Bernd Schmidt
  1998-02-22 19:58     ` Jeffrey A Law
  0 siblings, 1 reply; 5+ messages in thread
From: Bernd Schmidt @ 1998-02-20  8:47 UTC (permalink / raw)
  To: Jeffrey A Law; +Cc: egcs, scox

> One general note -- you have to be *extremely* careful defining DImode
> patterns on the x86 due to the bad interactions with register
> reloading.

When the patch was written, I simply used the constraints from the addi3/subdi3
patterns to avoid problems.
Since it's about a year old (I've tried a couple of times to get it into
gcc2, without success), it's quite possible that things have changed. I'll
check that and implement Richard Henderson's suggestion, and send an updated
patch.

Bernd

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: DImode speedup on i386
  1998-02-20  8:47   ` Bernd Schmidt
@ 1998-02-22 19:58     ` Jeffrey A Law
  0 siblings, 0 replies; 5+ messages in thread
From: Jeffrey A Law @ 1998-02-22 19:58 UTC (permalink / raw)
  To: Bernd Schmidt; +Cc: egcs, scox

  In message <Pine.SOL.3.90.980220113102.20928F-100000@clouseau.informatik.rwthhen.de>you write:
  > > One general note -- you have to be *extremely* careful defining DImode
  > > patterns on the x86 due to the bad interactions with register
  > > reloading.
  > 
  > When the patch was written, I simply used the constraints from
  > the addi3/subdi3 patterns to avoid problems.
  > Since it's about a year old (I've tried a couple of times to get it into
  > gcc2, without success), it's quite possible that things have changed. I'll
  > check that and implement Richard Henderson's suggestion, and send an updated
  > patch.
OK.  Yea, if you use the same constraints as the existing adddi3
and related patterns you *should* be OK.

Looking forward to the updated patch! :-)

jeff

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~1998-02-22 19:58 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
1998-02-18  4:16 DImode speedup on i386 Bernd Schmidt
1998-02-18 22:21 ` Richard Henderson
1998-02-19  3:32 ` Jeffrey A Law
1998-02-20  8:47   ` Bernd Schmidt
1998-02-22 19:58     ` Jeffrey A Law

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).