OSDN Git Service

* config/i386/i386.c (legitimate_tls_address)
authoraoliva <aoliva@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 17 Jun 2006 17:07:42 +0000 (17:07 +0000)
committeraoliva <aoliva@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 17 Jun 2006 17:07:42 +0000 (17:07 +0000)
<TARGET_GNU2_TLS>: Add tp after DTPOFF.
* config/i386/i386.md (*tls_dynamic_gnu2_combine_32): Adjust.
(*tls_dynamic_gnu2_combine_64): Likewise.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@114741 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/i386/i386.c
gcc/config/i386/i386.md

index 5ced5be..3cc56cc 100644 (file)
@@ -1,3 +1,10 @@
+2006-06-17  Alexandre Oliva  <aoliva@redhat.com>
+
+       * config/i386/i386.c (legitimate_tls_address)
+       <TARGET_GNU2_TLS>: Add tp after DTPOFF.
+       * config/i386/i386.md (*tls_dynamic_gnu2_combine_32): Adjust.
+       (*tls_dynamic_gnu2_combine_64): Likewise.
+
 2006-06-16  Richard Guenther  <rguenther@suse.de>
 
        PR middle-end/27116
index 7903cb2..4bea5fe 100644 (file)
@@ -6750,15 +6750,22 @@ legitimize_tls_address (rtx x, enum tls_model model, int for_mov)
        {
          rtx x = ix86_tls_module_base ();
 
-         base = force_reg (Pmode, gen_rtx_PLUS (Pmode, tp, base));
-
-         set_unique_reg_note (get_last_insn (), REG_EQUIV, x);
+         set_unique_reg_note (get_last_insn (), REG_EQUIV,
+                              gen_rtx_MINUS (Pmode, x, tp));
        }
 
       off = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, x), UNSPEC_DTPOFF);
       off = gen_rtx_CONST (Pmode, off);
 
       dest = force_reg (Pmode, gen_rtx_PLUS (Pmode, base, off));
+
+      if (TARGET_GNU2_TLS)
+       {
+         dest = force_reg (Pmode, gen_rtx_PLUS (Pmode, dest, tp));
+
+         set_unique_reg_note (get_last_insn (), REG_EQUIV, x);
+       }
+
       break;
 
     case TLS_MODEL_INITIAL_EXEC:
index 8380561..80c352c 100644 (file)
 (define_insn_and_split "*tls_dynamic_gnu2_combine_32"
   [(set (match_operand:SI 0 "register_operand" "=&a")
        (plus:SI
-        (plus:SI (match_operand:SI 3 "tp_or_register_operand" "ir")
-                 (unspec:SI [(match_operand:SI 4 "tls_modbase_operand" "")
-                             (match_operand:SI 5 "" "")
-                             (match_operand:SI 2 "register_operand" "b")
-                             (reg:SI SP_REG)]
-                            UNSPEC_TLSDESC))
+        (unspec:SI [(match_operand:SI 3 "tls_modbase_operand" "")
+                    (match_operand:SI 4 "" "")
+                    (match_operand:SI 2 "register_operand" "b")
+                    (reg:SI SP_REG)]
+                   UNSPEC_TLSDESC)
         (const:SI (unspec:SI
                    [(match_operand:SI 1 "tls_symbolic_operand" "")]
                    UNSPEC_DTPOFF))))
   "!TARGET_64BIT && TARGET_GNU2_TLS"
   "#"
   ""
-  [(parallel
-    [(set (match_dup 0)
-         (plus:SI (match_dup 3)
-                  (match_dup 5)))
-     (clobber (reg:CC FLAGS_REG))])]
+  [(set (match_dup 0) (match_dup 5))]
 {
   operands[5] = no_new_pseudos ? operands[0] : gen_reg_rtx (Pmode);
   emit_insn (gen_tls_dynamic_gnu2_32 (operands[5], operands[1], operands[2]));
 (define_insn_and_split "*tls_dynamic_gnu2_combine_64"
   [(set (match_operand:DI 0 "register_operand" "=&a")
        (plus:DI
-        (plus:DI (match_operand:DI 2 "tp_or_register_operand" "ir")
-                 (unspec:DI [(match_operand:DI 3 "tls_modbase_operand" "")
-                             (match_operand:DI 4 "" "")
-                             (reg:DI SP_REG)]
-                             UNSPEC_TLSDESC))
+        (unspec:DI [(match_operand:DI 2 "tls_modbase_operand" "")
+                    (match_operand:DI 3 "" "")
+                    (reg:DI SP_REG)]
+                   UNSPEC_TLSDESC)
         (const:DI (unspec:DI
                    [(match_operand:DI 1 "tls_symbolic_operand" "")]
                    UNSPEC_DTPOFF))))
   "TARGET_64BIT && TARGET_GNU2_TLS"
   "#"
   ""
-  [(parallel
-    [(set (match_dup 0)
-         (plus:DI (match_dup 2)
-                  (match_dup 4)))
-     (clobber (reg:CC FLAGS_REG))])]
+  [(set (match_dup 0) (match_dup 4))]
 {
   operands[4] = no_new_pseudos ? operands[0] : gen_reg_rtx (Pmode);
   emit_insn (gen_tls_dynamic_gnu2_64 (operands[4], operands[1]));