xtensa: fix TLS calls for call0 ABI
authorMax Filippov <jcmvbkbc@gmail.com>
Tue, 15 Sep 2015 19:24:26 +0000 (19:24 +0000)
committerMax Filippov <jcmvbkbc@gcc.gnu.org>
Tue, 15 Sep 2015 19:24:26 +0000 (19:24 +0000)
2015-09-15  Max Filippov  <jcmvbkbc@gmail.com>
gcc/
* 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: r227808

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

index 0ec14196929bf5ac67bc87b1cd4a9c34567ada31..bb317cf7fac16e8c9aaaf371c288df4587efc81a 100644 (file)
@@ -1,3 +1,10 @@
+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.
+
 2015-09-15  Eric Botcazou  <ebotcazou@adacore.com>
 
        * tree-eh.c (lower_try_finally_dup_block): Clear location information
index 1910061fdb5d6b4720751398cd2b0d6c081e9aaf..1e1ac6baebdc884c2de98184b53e8fcecbd11afc 100644 (file)
@@ -1874,23 +1874,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 3a3a9029a31cca8514f8d036e855b4d7e63d2c97..a4228da2bb448d39910edf93197a9c530ecf7e16 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")])