]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
arm.c (require_pic_register): Handle high pic base register for thumb-1.
authorTerry Guo <terry.guo@arm.com>
Tue, 26 Nov 2013 11:58:37 +0000 (11:58 +0000)
committerXuepeng Guo <xguo@gcc.gnu.org>
Tue, 26 Nov 2013 11:58:37 +0000 (11:58 +0000)
gcc/ChangeLog
2013-11-26  Terry Guo  <terry.guo@arm.com>

* config/arm/arm.c (require_pic_register): Handle high pic base
register for thumb-1.
(arm_load_pic_register): Also initialize high pic base register.
* doc/invoke.texi: Update documentation for option -mpic-register.

gcc/testsuite/ChangeLog
2013-11-26  Terry Guo  <terry.guo@arm.com>

* gcc.target/arm/thumb1-pic-high-reg.c: New case.
* gcc.target/arm/thumb1-pic-single-base.c: New case.

From-SVN: r205391

gcc/ChangeLog
gcc/config/arm/arm.c
gcc/doc/invoke.texi
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/arm/thumb1-pic-high-reg.c [new file with mode: 0644]
gcc/testsuite/gcc.target/arm/thumb1-pic-single-base.c [new file with mode: 0644]

index 5e25b2534daaa0b66a083e49769c9abac31e86a8..7974b5798f0ab6e323adc6833c3147c6906ee470 100644 (file)
@@ -1,3 +1,10 @@
+2013-11-26  Terry Guo  <terry.guo@arm.com>
+
+       * config/arm/arm.c (require_pic_register): Handle high pic base
+       register for thumb-1.
+       (arm_load_pic_register): Also initialize high pic base register.
+       * doc/invoke.texi: Update documentation for option -mpic-register.
+
 2013-11-26  Oleg Endo  <olegendo@gcc.gnu.org>
 
        PR target/58314
index dc3dbdb1164e1b70ae106f75e96c6bea7e74dcac..4af6c05949f255001fd042af8132747d3bfd3b6f 100644 (file)
@@ -5917,7 +5917,8 @@ require_pic_register (void)
   if (!crtl->uses_pic_offset_table)
     {
       gcc_assert (can_create_pseudo_p ());
-      if (arm_pic_register != INVALID_REGNUM)
+      if (arm_pic_register != INVALID_REGNUM
+         && !(TARGET_THUMB1 && arm_pic_register > LAST_LO_REGNUM))
        {
          if (!cfun->machine->pic_reg)
            cfun->machine->pic_reg = gen_rtx_REG (Pmode, arm_pic_register);
@@ -5943,7 +5944,12 @@ require_pic_register (void)
              crtl->uses_pic_offset_table = 1;
              start_sequence ();
 
-             arm_load_pic_register (0UL);
+             if (TARGET_THUMB1 && arm_pic_register != INVALID_REGNUM
+                 && arm_pic_register > LAST_LO_REGNUM)
+               emit_move_insn (cfun->machine->pic_reg,
+                               gen_rtx_REG (Pmode, arm_pic_register));
+             else
+               arm_load_pic_register (0UL);
 
              seq = get_insns ();
              end_sequence ();
@@ -6202,6 +6208,14 @@ arm_load_pic_register (unsigned long saved_regs ATTRIBUTE_UNUSED)
              emit_insn (gen_movsi (pic_offset_table_rtx, pic_tmp));
              emit_insn (gen_pic_add_dot_plus_four (pic_reg, pic_reg, labelno));
            }
+         else if (arm_pic_register != INVALID_REGNUM
+                  && arm_pic_register > LAST_LO_REGNUM
+                  && REGNO (pic_reg) <= LAST_LO_REGNUM)
+           {
+             emit_insn (gen_pic_load_addr_unified (pic_reg, pic_rtx, labelno));
+             emit_move_insn (gen_rtx_REG (Pmode, arm_pic_register), pic_reg);
+             emit_use (gen_rtx_REG (Pmode, arm_pic_register));
+           }
          else
            emit_insn (gen_pic_load_addr_unified (pic_reg, pic_rtx, labelno));
        }
index 501d080ee9fa1e5392716b12d10d65209a1adba5..466eee0a91c3078997f0d5b4c16014e738123fbd 100644 (file)
@@ -12216,8 +12216,11 @@ before execution begins.
 
 @item -mpic-register=@var{reg}
 @opindex mpic-register
-Specify the register to be used for PIC addressing.  The default is R10
-unless stack-checking is enabled, when R9 is used.
+Specify the register to be used for PIC addressing.
+For standard PIC base case, the default will be any suitable register
+determined by compiler.  For single PIC base case, the default is
+@samp{R9} if target is EABI based or stack-checking is enabled,
+otherwise the default is @samp{R10}.
 
 @item -mpic-data-is-text-relative
 @opindex mpic-data-is-text-relative
index 6639f05d542fecf2a90ff4fbf0bf1786c76ba71a..2ae530032a1c90778071b60c665caed995cc4cbf 100644 (file)
@@ -1,3 +1,8 @@
+2013-11-26  Terry Guo  <terry.guo@arm.com>
+
+       * gcc.target/arm/thumb1-pic-high-reg.c: New case.
+       * gcc.target/arm/thumb1-pic-single-base.c: New case.
+
 2013-11-26  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR c++/58700
diff --git a/gcc/testsuite/gcc.target/arm/thumb1-pic-high-reg.c b/gcc/testsuite/gcc.target/arm/thumb1-pic-high-reg.c
new file mode 100644 (file)
index 0000000..df269fc
--- /dev/null
@@ -0,0 +1,11 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target arm_thumb1_ok } */
+/* { dg-options "-mthumb -fpic -mpic-register=9" } */
+
+int g_test;
+
+int
+foo (int par)
+{
+    g_test = par;
+}
diff --git a/gcc/testsuite/gcc.target/arm/thumb1-pic-single-base.c b/gcc/testsuite/gcc.target/arm/thumb1-pic-single-base.c
new file mode 100644 (file)
index 0000000..6e9b257
--- /dev/null
@@ -0,0 +1,11 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target arm_thumb1_ok } */
+/* { dg-options "-mthumb -fpic -msingle-pic-base" } */
+
+int g_test;
+
+int
+foo (int par)
+{
+    g_test = par;
+}