	2007-06-06  Joseph Myers  <joseph@codesourcery.com>

	gcc/
	* config/arm/arm.h (VALID_IWMMXT_REG_MODE): Allow SImode.
	(ARM_LEGITIMIZE_RELOAD_ADDRESS): Reduce range allowed for SImode
	offsets with iWMMXt.
	* config/arm/arm.c (arm_hard_regno_mode_ok): Update for change to
	VALID_IWMMXT_REG_MODE.

2010-07-26  Julian Brown  <julian@codesourcery.com>

	Merge from Sourcery G++ 4.4:

 	2007-07-05  Mark Shinwell  <shinwell@codesourcery.com>
 
 	gcc/

=== modified file 'gcc/config/arm/arm.c'
--- old/gcc/config/arm/arm.c	2010-08-05 12:06:40 +0000
+++ new/gcc/config/arm/arm.c	2010-08-05 14:33:31 +0000
@@ -16538,7 +16538,7 @@
 	return mode == SImode;
 
       if (IS_IWMMXT_REGNUM (regno))
-	return VALID_IWMMXT_REG_MODE (mode);
+	return VALID_IWMMXT_REG_MODE (mode) && mode != SImode;
     }
   
   /* We allow almost any value to be stored in the general registers.

=== modified file 'gcc/config/arm/arm.h'
--- old/gcc/config/arm/arm.h	2010-08-05 14:29:52 +0000
+++ new/gcc/config/arm/arm.h	2010-08-05 14:33:31 +0000
@@ -1077,7 +1077,7 @@
   (GET_MODE_CLASS (MODE1) == GET_MODE_CLASS (MODE2))
 
 #define VALID_IWMMXT_REG_MODE(MODE) \
- (arm_vector_mode_supported_p (MODE) || (MODE) == DImode)
+ (arm_vector_mode_supported_p (MODE) || (MODE) == DImode || (MODE) == SImode)
 
 /* Modes valid for Neon D registers.  */
 #define VALID_NEON_DREG_MODE(MODE) \
@@ -1364,6 +1364,9 @@
 	  else if (TARGET_MAVERICK && TARGET_HARD_FLOAT)		   \
 	    /* Need to be careful, -256 is not a valid offset.  */	   \
 	    low = val >= 0 ? (val & 0xff) : -((-val) & 0xff);		   \
+	  else if (TARGET_REALLY_IWMMXT && MODE == SImode)		   \
+	    /* Need to be careful, -1024 is not a valid offset.  */	   \
+	    low = val >= 0 ? (val & 0x3ff) : -((-val) & 0x3ff);		   \
 	  else if (MODE == SImode					   \
 		   || (MODE == SFmode && TARGET_SOFT_FLOAT)		   \
 		   || ((MODE == HImode || MODE == QImode) && ! arm_arch4)) \

