diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5ced5be717d..3cc56cc1d65 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2006-06-17 Alexandre Oliva + + * config/i386/i386.c (legitimate_tls_address) + : 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 PR middle-end/27116 diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 7903cb2bfdd..4bea5fe1738 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 8380561b58d..80c352c81d6 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]));