]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
[ARM] Enable Purecode for ARMv8-M Baseline
authorPrakhar Bahuguna <prakhar.bahuguna@arm.com>
Thu, 4 May 2017 10:26:25 +0000 (10:26 +0000)
committerThomas Preud'homme <thopre01@gcc.gnu.org>
Thu, 4 May 2017 10:26:25 +0000 (10:26 +0000)
This patch adds support for purecode to ARMv8-M Baseline, in addition to
the existing support for ARMv7-M and ARMv8-M Mainline.

2017-05-04  Prakhar Bahuguna  <prakhar.bahuguna@arm.com>
            Andre Simoes Dias Vieira  <andre.simoesdiasvieira@arm.com>

    gcc/
    * config/arm/arm.md (movsi): Change TARGET_32BIT to TARGET_HAVE_MOVT.
    (movt splitter): Likewise.
    * config/arm/arm.c (arm_option_check_internal): Change arm_arch_thumb2
    to TARGET_HAVE_MOVT, and merge with -mslow-flash-data check.
    (const_ok_for_arm): Change else to else if (TARGET_THUMB2) and add else
    block for Thumb-1 with MOVT.
    (thumb2_legitimate_address_p): Move code block ...
    (can_avoid_literal_pool_for_label_p): ... into this new function.
    (thumb1_legitimate_address_p): Add check for TARGET_HAVE_MOVT and
    literal pool.
    (thumb_legitimate_constant_p): Add conditional on TARGET_HAVE_MOVT
    * doc/invoke.texi (-mpure-code): Change "ARMv7-M targets" for
    "M-profile targets with the MOVT instruction".

    gcc/testsuite/
    * gcc.target/arm/pure-code/pure-code.exp: Add conditional for
    check_effective_target_arm_thumb1_movt_ok.

Co-Authored-By: Andre Vieira <andre.simoesdiasvieira@arm.com>
From-SVN: r247585

gcc/ChangeLog
gcc/config/arm/arm.c
gcc/config/arm/arm.md
gcc/doc/invoke.texi
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/arm/pure-code/pure-code.exp

index c98e5affee5c85a69624a325a144d9aebdc96e34..67a97c84ca01bc155a76c4488883a05764672ba0 100644 (file)
@@ -1,3 +1,20 @@
+2017-05-04  Prakhar Bahuguna  <prakhar.bahuguna@arm.com>
+           Andre Simoes Dias Vieira  <andre.simoesdiasvieira@arm.com>
+
+       * config/arm/arm.md (movsi): Change TARGET_32BIT to TARGET_HAVE_MOVT.
+       (movt splitter): Likewise.
+       * config/arm/arm.c (arm_option_check_internal): Change arm_arch_thumb2
+       to TARGET_HAVE_MOVT, and merge with -mslow-flash-data check.
+       (const_ok_for_arm): Change else to else if (TARGET_THUMB2) and add else
+       block for Thumb-1 with MOVT.
+       (thumb2_legitimate_address_p): Move code block ...
+       (can_avoid_literal_pool_for_label_p): ... into this new function.
+       (thumb1_legitimate_address_p): Add check for TARGET_HAVE_MOVT and
+       literal pool.
+       (thumb_legitimate_constant_p): Add conditional on TARGET_HAVE_MOVT
+       * doc/invoke.texi (-mpure-code): Change "ARMv7-M targets" for
+       "M-profile targets with the MOVT instruction".
+
 2017-05-04  Prakhar Bahuguna  <prakhar.bahuguna@arm.com>
 
        * gcc/config/arm/arm-builtins.c (arm_init_builtins): Rename
index 839149134332bd4ba2ed506d765460661ba523fd..e0a7cabcb2ed603aedfb5762cef5a17aa3c28b01 100644 (file)
@@ -2833,16 +2833,16 @@ arm_option_check_internal (struct gcc_options *opts)
       flag_pic = 0;
     }
 
-  /* We only support -mslow-flash-data on armv7-m targets.  */
-  if (target_slow_flash_data
-      && ((!(arm_arch7 && !arm_arch_notm) && !arm_arch7em)
-         || (TARGET_THUMB1_P (flags) || flag_pic || TARGET_NEON)))
-    error ("-mslow-flash-data only supports non-pic code on armv7-m targets");
-
-  /* We only support pure-code on Thumb-2 M-profile targets.  */
-  if (target_pure_code
-      && (!arm_arch_thumb2 || arm_arch_notm || flag_pic || TARGET_NEON))
-    error ("-mpure-code only supports non-pic code on armv7-m targets");
+  /* We only support -mpure-code and -mslow-flash-data on M-profile targets
+     with MOVT.  */
+  if ((target_pure_code || target_slow_flash_data)
+      && (!TARGET_HAVE_MOVT || arm_arch_notm || flag_pic || TARGET_NEON))
+    {
+      const char *flag = (target_pure_code ? "-mpure-code" :
+                                            "-mslow-flash-data");
+      error ("%s only supports non-pic code on M-profile targets with the "
+            "MOVT instruction", flag);
+    }
 
 }
 
@@ -4077,7 +4077,7 @@ const_ok_for_arm (HOST_WIDE_INT i)
               || (i & ~0xfc000003) == 0))
        return TRUE;
     }
-  else
+  else if (TARGET_THUMB2)
     {
       HOST_WIDE_INT v;
 
@@ -4093,6 +4093,14 @@ const_ok_for_arm (HOST_WIDE_INT i)
       if (i == v)
        return TRUE;
     }
+  else if (TARGET_HAVE_MOVT)
+    {
+      /* Thumb-1 Targets with MOVT.  */
+      if (i > 0xffff)
+       return FALSE;
+      else
+       return TRUE;
+    }
 
   return FALSE;
 }
@@ -7736,6 +7744,32 @@ arm_legitimate_address_outer_p (machine_mode mode, rtx x, RTX_CODE outer,
   return 0;
 }
 
+/* Return true if we can avoid creating a constant pool entry for x.  */
+static bool
+can_avoid_literal_pool_for_label_p (rtx x)
+{
+  /* Normally we can assign constant values to target registers without
+     the help of constant pool.  But there are cases we have to use constant
+     pool like:
+     1) assign a label to register.
+     2) sign-extend a 8bit value to 32bit and then assign to register.
+
+     Constant pool access in format:
+     (set (reg r0) (mem (symbol_ref (".LC0"))))
+     will cause the use of literal pool (later in function arm_reorg).
+     So here we mark such format as an invalid format, then the compiler
+     will adjust it into:
+     (set (reg r0) (symbol_ref (".LC0")))
+     (set (reg r0) (mem (reg r0))).
+     No extra register is required, and (mem (reg r0)) won't cause the use
+     of literal pools.  */
+  if (arm_disable_literal_pool && GET_CODE (x) == SYMBOL_REF
+      && CONSTANT_POOL_ADDRESS_P (x))
+    return 1;
+  return 0;
+}
+
+
 /* Return nonzero if X is a valid Thumb-2 address operand.  */
 static int
 thumb2_legitimate_address_p (machine_mode mode, rtx x, int strict_p)
@@ -7799,23 +7833,7 @@ thumb2_legitimate_address_p (machine_mode mode, rtx x, int strict_p)
                  && thumb2_legitimate_index_p (mode, xop0, strict_p)));
     }
 
-  /* Normally we can assign constant values to target registers without
-     the help of constant pool.  But there are cases we have to use constant
-     pool like:
-     1) assign a label to register.
-     2) sign-extend a 8bit value to 32bit and then assign to register.
-
-     Constant pool access in format:
-     (set (reg r0) (mem (symbol_ref (".LC0"))))
-     will cause the use of literal pool (later in function arm_reorg).
-     So here we mark such format as an invalid format, then the compiler
-     will adjust it into:
-     (set (reg r0) (symbol_ref (".LC0")))
-     (set (reg r0) (mem (reg r0))).
-     No extra register is required, and (mem (reg r0)) won't cause the use
-     of literal pools.  */
-  else if (arm_disable_literal_pool && code == SYMBOL_REF
-          && CONSTANT_POOL_ADDRESS_P (x))
+  else if (can_avoid_literal_pool_for_label_p (x))
     return 0;
 
   else if (GET_MODE_CLASS (mode) != MODE_FLOAT
@@ -8094,6 +8112,9 @@ thumb1_index_register_rtx_p (rtx x, int strict_p)
 int
 thumb1_legitimate_address_p (machine_mode mode, rtx x, int strict_p)
 {
+  if (TARGET_HAVE_MOVT && can_avoid_literal_pool_for_label_p (x))
+    return 0;
+
   /* ??? Not clear if this is right.  Experiment.  */
   if (GET_MODE_SIZE (mode) < 4
       && !(reload_in_progress || reload_completed)
@@ -8706,6 +8727,7 @@ thumb_legitimate_constant_p (machine_mode mode ATTRIBUTE_UNUSED, rtx x)
   return (CONST_INT_P (x)
          || CONST_DOUBLE_P (x)
          || CONSTANT_ADDRESS_P (x)
+         || (TARGET_HAVE_MOVT && GET_CODE (x) == SYMBOL_REF)
          || flag_pic);
 }
 
index 21cfe3a4c31372e022331e3fa90d0a9c5bc96c10..d50059b28ab057dc8b50fafd7dad660ec1830787 100644 (file)
   {
   rtx base, offset, tmp;
 
-  if (TARGET_32BIT)
+  if (TARGET_HAVE_MOVT)
     {
       /* Everything except mem = const or mem = mem can be done easily.  */
       if (MEM_P (operands[0]))
             }
         }
     }
-  else /* TARGET_THUMB1...  */
+  else /* Target doesn't have MOVT...  */
     {
       if (can_create_pseudo_p ())
         {
 (define_split
   [(set (match_operand:SI 0 "arm_general_register_operand" "")
        (match_operand:SI 1 "const_int_operand" ""))]
-  "TARGET_32BIT
+  "TARGET_HAVE_MOVT
   && (!(const_ok_for_arm (INTVAL (operands[1]))
         || const_ok_for_arm (~INTVAL (operands[1]))))"
   [(clobber (const_int 0))]
index 438e553b34097a4d5a0f101a3465a6789045e1f6..68a558e9992384dac1faae64e67ea6d2c080a53f 100644 (file)
@@ -15421,7 +15421,8 @@ by default.
 Do not allow constant data to be placed in code sections.
 Additionally, when compiling for ELF object format give all text sections the
 ELF processor-specific section attribute @code{SHF_ARM_PURECODE}.  This option
-is only available when generating non-pic code for ARMv7-M targets.
+is only available when generating non-pic code for M-profile targets with the
+MOVT instruction.
 
 @item -mcmse
 @opindex mcmse
index bdf64ce0d14b6f1ebc2ee8cd9c9f2b1c9c63208c..d3fc7396653d30f1c69d3d1e43b644c4ab447d15 100644 (file)
@@ -1,3 +1,9 @@
+2017-05-04  Prakhar Bahuguna  <prakhar.bahuguna@arm.com>
+           Andre Simoes Dias Vieira  <andre.simoesdiasvieira@arm.com>
+
+       * gcc.target/arm/pure-code/pure-code.exp: Add conditional for
+       check_effective_target_arm_thumb1_movt_ok.
+
 2017-05-04  Prakhar Bahuguna  <prakhar.bahuguna@arm.com>
 
        * gcc.target/arm/fpscr.c: New file.
index 6a5dc552bf3c75b7da9148dfcfc4cf3d1ceee622..a51092319265e1fb1cb33c7025e5e59b2d707707 100644 (file)
@@ -26,8 +26,9 @@ if ![info exists DEFAULT_CFLAGS] then {
 }
 
 # The -mpure-code option is only available for M-profile targets that support
-# thumb2.
-if {[check_effective_target_arm_thumb2_ok]
+# the MOVT instruction.
+if {([check_effective_target_arm_thumb2_ok]
+     || [check_effective_target_arm_thumb1_movt_ok])
     && [check_effective_target_arm_cortex_m]} then {
 # Initialize `dg'.
 dg-init