Patchwork [i386] : Simplify AND-extended address decomposition

login
register
mail settings
Submitter Uros Bizjak
Date Oct. 29, 2012, 4:47 p.m.
Message ID <CAFULd4ZT_sEaZtPDm0XtiScaHTmzEWtyp34n2rnG9gC9R61wQA@mail.gmail.com>
Download mbox | patch
Permalink /patch/195072/
State New
Headers show

Comments

Uros Bizjak - Oct. 29, 2012, 4:47 p.m.
Hello!

Since we use simplify_gen_subreg on address part, we can use it for
DImode subreg of SImode address as well. simplify_gen_subreg knows how
to strip subreg.

2012-10-29  Uros Bizjak  <ubizjak@gmail.com>

	* config/i386/i386.c (ix86_decompose_address): Use simplify_gen_subreg
	for all addresses, zero-extended with AND.

Tested on x86_64-pc-linux-gnu {,-m32}, committed to mainline SVN.

Uros.

Patch

Index: config/i386/i386.c
===================================================================
--- config/i386/i386.c	(revision 192933)
+++ config/i386/i386.c	(working copy)
@@ -11810,23 +11810,11 @@  ix86_decompose_address (rtx addr, struct ix86_addr
       else if (GET_CODE (addr) == AND
 	       && const_32bit_mask (XEXP (addr, 1), DImode))
 	{
-	  addr = XEXP (addr, 0);
+	  addr = simplify_gen_subreg (SImode, XEXP (addr, 0), DImode, 0);
+	  if (addr == NULL_RTX)
+	    return 0;
 
-	  /* Adjust SUBREGs.  */
-	  if (GET_CODE (addr) == SUBREG
-	      && GET_MODE (SUBREG_REG (addr)) == SImode)
-	    {
-	      addr = SUBREG_REG (addr);
-	      if (CONST_INT_P (addr))
-		return 0;
-	    }
-	  else if (GET_MODE (addr) == DImode)
-	    {
-	      addr = simplify_gen_subreg (SImode, addr, DImode, 0);
-	      if (addr == NULL_RTX)
-		return 0;
-	    }
-	  else if (GET_MODE (addr) != VOIDmode)
+	  if (CONST_INT_P (addr))
 	    return 0;
 	}
     }