From 135c2bd4086d5e4d5a4cc24f9a7dc5ee7184eaa1 Mon Sep 17 00:00:00 2001
From: Roger Sayle <roger@eyesopen.com>
Date: Thu, 27 Apr 2006 17:26:03 +0000
Subject: expmed.c (store_fixed_bit_field): If we're not optimizing for size...

	* expmed.c (store_fixed_bit_field): If we're not optimizing for
	size, force the intermediate into a new pseudo rather instead of
	performing both a bitwise AND and a bitwise IOR in memory.

From-SVN: r113318
---
 gcc/expmed.c | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

(limited to 'gcc/expmed.c')

diff --git a/gcc/expmed.c b/gcc/expmed.c
index 5a32366cc64..89ae78df7cd 100644
--- a/gcc/expmed.c
+++ b/gcc/expmed.c
@@ -924,7 +924,12 @@ store_fixed_bit_field (rtx op0, unsigned HOST_WIDE_INT offset,
 
   if (! all_one)
     {
-      temp = expand_binop (mode, and_optab, op0,
+      /* Don't try and keep the intermediate in memory, if we need to
+	 perform both a bit-wise AND and a bit-wise IOR (except when
+	 we're optimizing for size).  */
+      if (MEM_P (subtarget) && !all_zero && !optimize_size)
+	subtarget = force_reg (mode, subtarget);
+      temp = expand_binop (mode, and_optab, subtarget,
 			   mask_rtx (mode, bitpos, bitsize, 1),
 			   subtarget, 1, OPTAB_LIB_WIDEN);
       subtarget = temp;
-- 
cgit v1.2.1