Commit b6872a13 by Alan Modra Committed by Alan Modra

predicates.md (add_cint_operand): New.

gcc/
	* config/rs6000/predicates.md (add_cint_operand): New.
	(reg_or_add_cint_operand, small_toc_ref): Use add_cint_operand.
	* config/rs6000/rs6000.md (largetoc_high_plus): Restrict offset
	using add_cint_operand.
	(largetoc_high_plus_aix): Likewise.
gcc/testsuite/
	* gcc.target/powerpc/medium_offset.c: New.

From-SVN: r202417
parent 904e9dbb
2013-09-10 Alan Modra <amodra@gmail.com>
* config/rs6000/predicates.md (add_cint_operand): New.
(reg_or_add_cint_operand, small_toc_ref): Use add_cint_operand.
* config/rs6000/rs6000.md (largetoc_high_plus): Restrict offset
using add_cint_operand.
(largetoc_high_plus_aix): Likewise.
2013-09-09 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/58364
......
......@@ -376,12 +376,18 @@
(ior (match_code "const_int")
(match_operand 0 "gpc_reg_operand")))
;; Return 1 if op is a constant integer valid for addition with addis, addi.
(define_predicate "add_cint_operand"
(and (match_code "const_int")
(match_test "(unsigned HOST_WIDE_INT)
(INTVAL (op) + (mode == SImode ? 0x80000000 : 0x80008000))
< (unsigned HOST_WIDE_INT) 0x100000000ll")))
;; Return 1 if op is a constant integer valid for addition
;; or non-special register.
(define_predicate "reg_or_add_cint_operand"
(if_then_else (match_code "const_int")
(match_test "(unsigned HOST_WIDE_INT) (INTVAL (op) + 0x80008000)
< (unsigned HOST_WIDE_INT) 0x100000000ll")
(match_operand 0 "add_cint_operand")
(match_operand 0 "gpc_reg_operand")))
;; Return 1 if op is a constant integer valid for subtraction
......@@ -1697,7 +1703,7 @@
(define_predicate "small_toc_ref"
(match_code "unspec,plus")
{
if (GET_CODE (op) == PLUS && CONST_INT_P (XEXP (op, 1)))
if (GET_CODE (op) == PLUS && add_cint_operand (XEXP (op, 1), mode))
op = XEXP (op, 0);
return GET_CODE (op) == UNSPEC && XINT (op, 1) == UNSPEC_TOCREL;
......
......@@ -12207,7 +12207,7 @@
(unspec [(match_operand:DI 1 "" "")
(match_operand:DI 2 "gpc_reg_operand" "b")]
UNSPEC_TOCREL)
(match_operand 3 "const_int_operand" "n"))))]
(match_operand:DI 3 "add_cint_operand" "n"))))]
"TARGET_ELF && TARGET_CMODEL != CMODEL_SMALL"
"addis %0,%2,%1+%3@toc@ha")
......@@ -12218,7 +12218,7 @@
(unspec [(match_operand:P 1 "" "")
(match_operand:P 2 "gpc_reg_operand" "b")]
UNSPEC_TOCREL)
(match_operand 3 "const_int_operand" "n"))))]
(match_operand:P 3 "add_cint_operand" "n"))))]
"TARGET_XCOFF && TARGET_CMODEL != CMODEL_SMALL"
"addis %0,%1+%3@u(%2)")
......
2013-09-10 Alan Modra <amodra@gmail.com>
* gcc.target/powerpc/medium_offset.c: New.
2013-09-09 Jakub Jelinek <jakub@redhat.com>
PR c++/58325
......
/* { dg-do compile { target { powerpc*-*-* } } } */
/* { dg-require-effective-target lp64 } */
/* { dg-options "-O" } */
/* { dg-final { scan-assembler-not "\\+4611686018427387904" } } */
static int x;
unsigned long
foo (void)
{
return ((unsigned long) &x) - 0xc000000000000000;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment