, PowerPC, Patch #7, Split up SIGNED_34BIT and SIGNED_16BIT macros

Message ID 20190709234626.GA2886@ibm-toto.the-meissners.org
State New
Headers show
Series
  • , PowerPC, Patch #7, Split up SIGNED_34BIT and SIGNED_16BIT macros
Related show

Commit Message

Michael Meissner July 9, 2019, 11:46 p.m.
This patch splits up the macros SIGNED_16BIT_OFFSET_P and SIGNED_34BIT_OFFSET_P
into two separate macros as you asked for previously in private mail.  The main
macros:

	SIGNED_16BIT_OFFSET_P
	SIGNED_34BIT_OFFSET_P

only take one argument, and that is the offset that is being tested.  The new
macros:

	SIGNED_16BIT_OFFSET_EXTRA_P
	SIGNED_34BIT_OFFSET_EXTRA_P

Retain the two arguments that the current macros have.  It is useful when the
functions that are validating addresses that might be split (such as the two
doubles in __ibm128) to verify that all addresses in the range of offset to
offset + extra are valid 16 or 34-bit offsets.  I have changed the existing
uses of these macros.

I have bootstrapped the compiler on a little endian power8 machine and there
were no regressions in the test suite.  Can I check this change into the trunk?

2019-07-09  Michael Meissner  <meissner@linux.ibm.com>

	* config/rs6000/predicates.md (cint34_operand): Update
	SIGNED_34BIT_OFFSET_P call.
	(pcrel_address): Update SIGNED_34BIT_OFFSET_P call.
	(pcrel_external_address): Update SIGNED_34BIT_OFFSET_P call.
	* config/rs6000/rs6000.c (rs6000_prefixed_address): Update
	SIGNED_16BIT_OFFSET_P and SIGNED_34BIT_OFFSET_P calls.
	* config/rs6000/rs6000.h (SIGNED_16BIT_OFFSET_P): Remove EXTRA
	argument.
	(SIGNED_34BIT_OFFSET_P): Remove EXTRA argument.
	(SIGNED_16BIT_OFFSET_EXTRA_P): New macro, like
	SIGNED_16BIT_OFFSET_P with an EXTRA argument.
	(SIGNED_34BIT_OFFSET_EXTRA_P): New macro, like
	SIGNED_34BIT_OFFSET_P with an EXTRA argument.



-- 
Michael Meissner, IBM
IBM, M/S 2506R, 550 King Street, Littleton, MA 01460-6245, USA
email: meissner@linux.ibm.com, phone: +1 (978) 899-4797

Comments

Segher Boessenkool July 10, 2019, 6:29 p.m. | #1
On Tue, Jul 09, 2019 at 07:46:26PM -0400, Michael Meissner wrote:
> This patch splits up the macros SIGNED_16BIT_OFFSET_P and SIGNED_34BIT_OFFSET_P

> into two separate macros as you asked for previously in private mail.  The main

> macros:

> 

> 	SIGNED_16BIT_OFFSET_P

> 	SIGNED_34BIT_OFFSET_P

> 

> only take one argument, and that is the offset that is being tested.  The new

> macros:

> 

> 	SIGNED_16BIT_OFFSET_EXTRA_P

> 	SIGNED_34BIT_OFFSET_EXTRA_P

> 

> Retain the two arguments that the current macros have.  It is useful when the

> functions that are validating addresses that might be split (such as the two

> doubles in __ibm128) to verify that all addresses in the range of offset to

> offset + extra are valid 16 or 34-bit offsets.  I have changed the existing

> uses of these macros.


This is okay for trunk.  Thanks Mike.


Segher


> 	* config/rs6000/predicates.md (cint34_operand): Update

> 	SIGNED_34BIT_OFFSET_P call.

> 	(pcrel_address): Update SIGNED_34BIT_OFFSET_P call.

> 	(pcrel_external_address): Update SIGNED_34BIT_OFFSET_P call.

> 	* config/rs6000/rs6000.c (rs6000_prefixed_address): Update

> 	SIGNED_16BIT_OFFSET_P and SIGNED_34BIT_OFFSET_P calls.

> 	* config/rs6000/rs6000.h (SIGNED_16BIT_OFFSET_P): Remove EXTRA

> 	argument.

> 	(SIGNED_34BIT_OFFSET_P): Remove EXTRA argument.

> 	(SIGNED_16BIT_OFFSET_EXTRA_P): New macro, like

> 	SIGNED_16BIT_OFFSET_P with an EXTRA argument.

> 	(SIGNED_34BIT_OFFSET_EXTRA_P): New macro, like

> 	SIGNED_34BIT_OFFSET_P with an EXTRA argument.

Patch

Index: gcc/config/rs6000/predicates.md
===================================================================
--- gcc/config/rs6000/predicates.md	(revision 273255)
+++ gcc/config/rs6000/predicates.md	(working copy)
@@ -309,7 +309,7 @@  (define_predicate "cint34_operand"
   if (!TARGET_PREFIXED_ADDR)
     return 0;
 
-  return SIGNED_34BIT_OFFSET_P (INTVAL (op), 0);
+  return SIGNED_34BIT_OFFSET_P (INTVAL (op));
 })
 
 ;; Return 1 if op is a register that is not special.
@@ -1638,7 +1638,7 @@  (define_predicate "pcrel_address"
       rtx op0 = XEXP (op, 0);
       rtx op1 = XEXP (op, 1);
 
-      if (!CONST_INT_P (op1) || !SIGNED_34BIT_OFFSET_P (INTVAL (op1), 0))
+      if (!CONST_INT_P (op1) || !SIGNED_34BIT_OFFSET_P (INTVAL (op1)))
 	return false;
 
       op = op0;
@@ -1673,7 +1673,7 @@  (define_predicate "pcrel_external_addres
       rtx op0 = XEXP (op, 0);
       rtx op1 = XEXP (op, 1);
 
-      if (!CONST_INT_P (op1) || !SIGNED_34BIT_OFFSET_P (INTVAL (op1), 0))
+      if (!CONST_INT_P (op1) || !SIGNED_34BIT_OFFSET_P (INTVAL (op1)))
 	return false;
 
       op = op0;
Index: gcc/config/rs6000/rs6000.c
===================================================================
--- gcc/config/rs6000/rs6000.c	(revision 273313)
+++ gcc/config/rs6000/rs6000.c	(working copy)
@@ -21551,11 +21551,11 @@  rs6000_prefixed_address (rtx addr, machi
 	return false;
 
       HOST_WIDE_INT value = INTVAL (op1);
-      if (!SIGNED_34BIT_OFFSET_P (value, 0))
+      if (!SIGNED_34BIT_OFFSET_P (value))
 	return false;
 
       /* Offset larger than 16-bits?  */
-      if (!SIGNED_16BIT_OFFSET_P (value, 0))
+      if (!SIGNED_16BIT_OFFSET_P (value))
 	return true;
 
       /* DQ instruction (bottom 4 bits must be 0) for vectors.  */
Index: gcc/config/rs6000/rs6000.h
===================================================================
--- gcc/config/rs6000/rs6000.h	(revision 273255)
+++ gcc/config/rs6000/rs6000.h	(working copy)
@@ -2526,16 +2526,27 @@  typedef struct GTY(()) machine_function
 #pragma GCC poison TARGET_FLOAT128 OPTION_MASK_FLOAT128 MASK_FLOAT128
 #endif
 
-/* Whether a given VALUE is a valid 16- or 34-bit signed offset.  EXTRA is the
-   amount that we can't touch at the high end of the range (typically if the
-   address is split into smaller addresses, the extra covers the addresses
-   which might be generated when the insn is split).  */
-#define SIGNED_16BIT_OFFSET_P(VALUE, EXTRA)				\
-  IN_RANGE (VALUE,							\
+/* Whether a given VALUE is a valid 16 or 34-bit signed offset.  */
+#define SIGNED_16BIT_OFFSET_P(VALUE)					\
+  IN_RANGE ((VALUE),							\
+	    -(HOST_WIDE_INT_1 << 15),					\
+	    (HOST_WIDE_INT_1 << 15) - 1)
+
+#define SIGNED_34BIT_OFFSET_P(VALUE)					\
+  IN_RANGE ((VALUE),							\
+	    -(HOST_WIDE_INT_1 << 33),					\
+	    (HOST_WIDE_INT_1 << 33) - 1)
+
+/* Like SIGNED_16BIT_OFFSET_P and SIGNED_34BIT_OFFSET_P, but with an extra
+   argument that gives a length to validate a range of addresses, to allow for
+   splitting insns into several insns, each of which has an offsettable
+   address.  */
+#define SIGNED_16BIT_OFFSET_EXTRA_P(VALUE, EXTRA)			\
+  IN_RANGE ((VALUE),							\
 	    -(HOST_WIDE_INT_1 << 15),					\
 	    (HOST_WIDE_INT_1 << 15) - 1 - (EXTRA))
 
-#define SIGNED_34BIT_OFFSET_P(VALUE, EXTRA)				\
-  IN_RANGE (VALUE,							\
+#define SIGNED_34BIT_OFFSET_EXTRA_P(VALUE, EXTRA)			\
+  IN_RANGE ((VALUE),							\
 	    -(HOST_WIDE_INT_1 << 33),					\
 	    (HOST_WIDE_INT_1 << 33) - 1 - (EXTRA))