]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
xtensa: fix TLS calls for call0 ABI
authorMax Filippov <jcmvbkbc@gmail.com>
Tue, 30 May 2017 23:37:42 +0000 (23:37 +0000)
committerMax Filippov <jcmvbkbc@gcc.gnu.org>
Tue, 30 May 2017 23:37:42 +0000 (23:37 +0000)
2017-05-30  Max Filippov  <jcmvbkbc@gmail.com>
gcc/
Backport from mainline
2015-09-15  Max Filippov  <jcmvbkbc@gmail.com>

* config/xtensa/xtensa.c (xtensa_call_tls_desc): Use a10 or a2
to pass TLS call argument, according to current ABI.
* config/xtensa/xtensa.md (tls_call pattern): Use callx8 or
callx0 for TLS call, according to current ABI.

From-SVN: r248704

gcc/ChangeLog
gcc/config/xtensa/xtensa.c
gcc/config/xtensa/xtensa.md

index f556b18e2bdab1d2728d0eacbdd76ae856f016d4..4e53b9fd6565572c0e3ca79ff4400fa91a59f985 100644 (file)
@@ -1,3 +1,13 @@
+2017-05-30  Max Filippov  <jcmvbkbc@gmail.com>
+
+       Backport from mainline
+       2015-09-15  Max Filippov  <jcmvbkbc@gmail.com>
+
+       * config/xtensa/xtensa.c (xtensa_call_tls_desc): Use a10 or a2
+       to pass TLS call argument, according to current ABI.
+       * config/xtensa/xtensa.md (tls_call pattern): Use callx8 or
+       callx0 for TLS call, according to current ABI.
+
 2017-05-30  Jakub Jelinek  <jakub@redhat.com>
 
        Backported from mainline
index eb039bac56a2eaa5e83a0d3dbd5ce2a71dfba185..0aa6a0a817521ab73bb8aaed62eeb874d1c6a11b 100644 (file)
@@ -1891,23 +1891,23 @@ xtensa_tls_module_base (void)
 static rtx_insn *
 xtensa_call_tls_desc (rtx sym, rtx *retp)
 {
-  rtx fn, arg, a10;
+  rtx fn, arg, a_io;
   rtx_insn *call_insn, *insns;
 
   start_sequence ();
   fn = gen_reg_rtx (Pmode);
   arg = gen_reg_rtx (Pmode);
-  a10 = gen_rtx_REG (Pmode, 10);
+  a_io = gen_rtx_REG (Pmode, WINDOW_SIZE + 2);
 
   emit_insn (gen_tls_func (fn, sym));
   emit_insn (gen_tls_arg (arg, sym));
-  emit_move_insn (a10, arg);
-  call_insn = emit_call_insn (gen_tls_call (a10, fn, sym, const1_rtx));
-  use_reg (&CALL_INSN_FUNCTION_USAGE (call_insn), a10);
+  emit_move_insn (a_io, arg);
+  call_insn = emit_call_insn (gen_tls_call (a_io, fn, sym, const1_rtx));
+  use_reg (&CALL_INSN_FUNCTION_USAGE (call_insn), a_io);
   insns = get_insns ();
   end_sequence ();
 
-  *retp = a10;
+  *retp = a_io;
   return insns;
 }
 
index 6d84384c950266a65be15786b4ba7bd9c7d73b65..e3c517d0e8f8017405aff6f120ad25160c173afd 100644 (file)
                                  UNSPEC_TLS_CALL))
              (match_operand 3 "" "i")))]
   "TARGET_THREADPTR && HAVE_AS_TLS"
-  "callx8.tls %1, %2@TLSCALL"
+{
+  if (TARGET_WINDOWED_ABI)
+    return "callx8.tls %1, %2@TLSCALL";
+  else
+    return "callx0.tls %1, %2@TLSCALL";
+}
   [(set_attr "type"    "call")
    (set_attr "mode"    "none")
    (set_attr "length"  "3")])