diff mbox

Fix e500 offset handling for TImode

Message ID alpine.DEB.2.20.1611232114460.9078@digraph.polyomino.org.uk
State New
Headers show

Commit Message

Joseph Myers Nov. 23, 2016, 9:16 p.m. UTC
Given my previous fix for a missing insn pattern for e500, building
glibc runs into an assembler error "Error: operand out of range (256
is not between 0 and 248)".  This comes from an insn:

(insn 115 1209 1210 (set (reg:DF 27 27 [orig:294 _129 ] [294])
        (subreg:DF (mem/c:TI (plus:SI (reg/f:SI 1 1)
                    (const_int 256 [0x100])) [14 %sfp+256 S16 A128]) 0)) 1909 {*frob_df_ti}
     (nil))

This patch adjusts the offset handling for TImode - and TDmode and
PTImode in case such subregs can arise for them - to be the same as
for TFmode, so that proper SPE offset checks are made in the
TARGET_E500_DOUBLE case.

This allows the glibc build to complete.  Testing shows 372 FAILs
across the gcc, g++ and libstdc++ testsuites; more cleanup is
certainly needed, but this gets to the point where the toolchain at
least builds so it's possible to compare test results when fixing
bugs.

2016-11-23  Joseph Myers  <joseph@codesourcery.com>

	* config/rs6000/rs6000.c (rs6000_legitimate_offset_address_p): For
	TARGET_E500_DOUBLE. handle TDmode, TImode and PTImode the same as
	TFmode, IFmode and KFmode.

Comments

Segher Boessenkool Nov. 23, 2016, 10:05 p.m. UTC | #1
On Wed, Nov 23, 2016 at 09:16:33PM +0000, Joseph Myers wrote:
> 2016-11-23  Joseph Myers  <joseph@codesourcery.com>
> 
> 	* config/rs6000/rs6000.c (rs6000_legitimate_offset_address_p): For
> 	TARGET_E500_DOUBLE. handle TDmode, TImode and PTImode the same as
> 	TFmode, IFmode and KFmode.

This is fine.  Thanks,


Segher
diff mbox

Patch

Index: gcc/config/rs6000/rs6000.c
===================================================================
--- gcc/config/rs6000/rs6000.c	(revision 242751)
+++ gcc/config/rs6000/rs6000.c	(working copy)
@@ -8443,14 +8443,13 @@  rs6000_legitimate_offset_address_p (machine_mode m
     case TFmode:
     case IFmode:
     case KFmode:
+    case TDmode:
+    case TImode:
+    case PTImode:
       if (TARGET_E500_DOUBLE)
 	return (SPE_CONST_OFFSET_OK (offset)
 		&& SPE_CONST_OFFSET_OK (offset + 8));
-      /* fall through */
 
-    case TDmode:
-    case TImode:
-    case PTImode:
       extra = 8;
       if (!worst_case)
 	break;