re PR target/17306 (function_vector attribute in H8300H/H8S)
authorJeff Law <law@redhat.com>
Fri, 6 Feb 2015 06:19:03 +0000 (23:19 -0700)
committerJeff Law <law@gcc.gnu.org>
Fri, 6 Feb 2015 06:19:03 +0000 (23:19 -0700)
PR target/17306
* config/h8300/constraints.md (U): Correctly dectect
"eightbit_data" memory addresses.
* config/h8300/h8300.c (eightbit_constant_address_p): Also
handle (const (plus (symbol_ref (x)))) where x is declared
as an 8-bit data memory address.
* config/h8300/h8300.md (call, call_value): Correctly detect
"funcvec" functions.

PR target/17306
* gcc.target/h8300/pr17306-1.c: New test.
* gcc.target/h8300/pr17306-2.c: New test.

From-SVN: r220472

gcc/ChangeLog
gcc/config/h8300/constraints.md
gcc/config/h8300/h8300.c
gcc/config/h8300/h8300.md
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/h8300/pr17306-1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/h8300/pr17306-2.c [new file with mode: 0644]

index 2bbfeb3fdd14dc4a9e0e909efb401722ed5304b5..4d84df7a1e0e502b9d5eb4b05a15156c7064a0f6 100644 (file)
@@ -1,5 +1,14 @@
 2015-02-05  Jeff Law  <law@redhat.com>
 
+       PR target/17306
+       * config/h8300/constraints.md (U): Correctly dectect
+       "eightbit_data" memory addresses.
+       * config/h8300/h8300.c (eightbit_constant_address_p): Also
+       handle (const (plus (symbol_ref (x)))) where x is declared
+       as an 8-bit data memory address.
+       * config/h8300/h8300.md (call, call_value): Correctly detect
+       "funcvec" functions.
+
        PR target/43264
        * config/h8300/h8300.c (get_shift_alg): Fix ASHIFTRT by
        24 to 28 bits for the H8/300.
index 15bfedb5a9a4a0663eaf335d9a691edadaf98585..9b509e720c9e723f68538f7636b27ebfc94ed4bb 100644 (file)
            (match_code "symbol_ref" "000")
            (match_code "const_int" "001")
            (ior (match_test "TARGET_H8300S")
-                (match_test "SYMBOL_REF_FLAG (XEXP (XEXP (XEXP (op, 0), 0), 0))")))
+                (match_test "(SYMBOL_REF_FLAGS (XEXP (XEXP (XEXP (op, 0), 0), 0)) & SYMBOL_FLAG_EIGHTBIT_DATA) != 0")))
        (and (match_code "mem")
            (match_test "h8300_eightbit_constant_address_p (XEXP (op, 0))"))
        (and (match_code "mem")
index 4bd4787fcdca46597b67918180a8d634ce1c812c..ea900525b6623ac8f07efaf573e0d3add11c8e97 100644 (file)
@@ -5637,6 +5637,12 @@ h8300_eightbit_constant_address_p (rtx x)
   if (GET_CODE (x) == SYMBOL_REF)
     return (SYMBOL_REF_FLAGS (x) & SYMBOL_FLAG_EIGHTBIT_DATA) != 0;
 
+  if (GET_CODE (x) == CONST
+      && GET_CODE (XEXP (x, 0)) == PLUS
+      && GET_CODE (XEXP (XEXP (x, 0), 0)) == SYMBOL_REF
+      && (SYMBOL_REF_FLAGS (XEXP (XEXP (x, 0), 0)) & SYMBOL_FLAG_EIGHTBIT_DATA) != 0)
+    return 1;
+
   if (GET_CODE (x) != CONST_INT)
     return 0;
 
index cec35300e21f7cea0517040e620d414e30bbf802..dfd082ce0df6dbd0cc3a27e7631083e80c90d86e 100644 (file)
   ""
 {
   if (GET_CODE (XEXP (operands[0], 0)) == SYMBOL_REF
-      && SYMBOL_REF_FLAG (XEXP (operands[0], 0)))
+      && (SYMBOL_REF_FLAGS (XEXP (operands[0], 0)) & SYMBOL_FLAG_FUNCVEC_FUNCTION))
     return "jsr\\t@%0:8";
   else
     return "jsr\\t%0";
   ""
 {
   if (GET_CODE (XEXP (operands[1], 0)) == SYMBOL_REF
-      && SYMBOL_REF_FLAG (XEXP (operands[1], 0)))
+      && (SYMBOL_REF_FLAGS (XEXP (operands[1], 0)) & SYMBOL_FLAG_FUNCVEC_FUNCTION))
     return "jsr\\t@%1:8";
   else
     return "jsr\\t%1";
index cf3a21e282ea9da738a1c515687dfa73f7a6545d..55715adca669e1e59bfd1a161b7aa8f170fd4228 100644 (file)
@@ -1,3 +1,9 @@
+2015-02-05  Jeff Law  <law@redhat.com>
+
+       PR target/17306
+       * gcc.target/h8300/pr17306-1.c: New test.
+       * gcc.target/h8300/pr17306-2.c: New test.
+
 2015-02-05  Tobias Burnus  <burnus@net-b.de>
 
        PR fortran/64943
diff --git a/gcc/testsuite/gcc.target/h8300/pr17306-1.c b/gcc/testsuite/gcc.target/h8300/pr17306-1.c
new file mode 100644 (file)
index 0000000..010492f
--- /dev/null
@@ -0,0 +1,14 @@
+/* { dg-do compile }  */
+/* { dg-options "-mh" }  */
+/* { dg-final { scan-assembler-times "@@" 1 } }  */
+
+
+void foo (void) __attribute__ ((function_vector));
+__attribute__((noinline)) void foo (void)
+{
+}
+
+void bar (void)
+{
+    foo();
+}
diff --git a/gcc/testsuite/gcc.target/h8300/pr17306-2.c b/gcc/testsuite/gcc.target/h8300/pr17306-2.c
new file mode 100644 (file)
index 0000000..a407c74
--- /dev/null
@@ -0,0 +1,23 @@
+/* { dg-do compile }  */
+/* { dg-options "-mh -O2 -w" }  */
+/* { dg-final { scan-assembler-times ":8" 2 } }  */
+
+
+struct x {
+  char x;
+  char y;
+};
+
+struct x __attribute__ ((eightbit_data)) foo;
+
+int bar ()
+{
+ if ((foo.y & 0x80) != 0)
+   oof ();
+}
+
+int com ()
+{
+ if ((foo.x & 0x80) != 0)
+   oof ();
+}