aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAlexandre Oliva <aoliva@redhat.com>2006-06-17 17:07:42 +0000
committerAlexandre Oliva <aoliva@gcc.gnu.org>2006-06-17 17:07:42 +0000
commit31ebc801bcc956140e1750193f99959457698238 (patch)
tree691b186465bbf8d7583f3c613e4c77998ad1ba49 /gcc
parent4dc3fbb0eb1e89262e6f49e0ee80381d94db5494 (diff)
downloadgcc-31ebc801bcc956140e1750193f99959457698238.zip
gcc-31ebc801bcc956140e1750193f99959457698238.tar.gz
gcc-31ebc801bcc956140e1750193f99959457698238.tar.bz2
i386.c (legitimate_tls_address): Add tp after DTPOFF.
* 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. From-SVN: r114741
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/config/i386/i386.c13
-rw-r--r--gcc/config/i386/i386.md32
3 files changed, 28 insertions, 24 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 5ced5be..3cc56cc 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index 7903cb2..4bea5fe 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -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:
diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
index 8380561..80c352c 100644
--- a/gcc/config/i386/i386.md
+++ b/gcc/config/i386/i386.md
@@ -14434,12 +14434,11 @@
(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))))
@@ -14447,11 +14446,7 @@
"!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]));
@@ -14499,11 +14494,10 @@
(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))))
@@ -14511,11 +14505,7 @@
"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]));