From: Alan Modra Date: Mon, 9 Sep 2013 23:40:34 +0000 (+0930) Subject: predicates.md (add_cint_operand): New. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=b6872a13898d89eb0d52a2d306ae754d677b7819;p=gcc.git 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index dd9a3e0cbc1..42d1dc7249c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2013-09-10 Alan Modra + + * 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 PR tree-optimization/58364 diff --git a/gcc/config/rs6000/predicates.md b/gcc/config/rs6000/predicates.md index 7338e764c5c..b5bff044779 100644 --- a/gcc/config/rs6000/predicates.md +++ b/gcc/config/rs6000/predicates.md @@ -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; diff --git a/gcc/config/rs6000/rs6000.md b/gcc/config/rs6000/rs6000.md index 3880f9175a2..0757d4de5ad 100644 --- a/gcc/config/rs6000/rs6000.md +++ b/gcc/config/rs6000/rs6000.md @@ -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)") diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 7da14443bb5..61d1469f1a8 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2013-09-10 Alan Modra + + * gcc.target/powerpc/medium_offset.c: New. + 2013-09-09 Jakub Jelinek PR c++/58325 diff --git a/gcc/testsuite/gcc.target/powerpc/medium_offset.c b/gcc/testsuite/gcc.target/powerpc/medium_offset.c new file mode 100644 index 00000000000..f29eba08c38 --- /dev/null +++ b/gcc/testsuite/gcc.target/powerpc/medium_offset.c @@ -0,0 +1,12 @@ +/* { 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; +}