Commit e65a3857 by David Edelsohn Committed by David Edelsohn

darwin.md (load_macho_picbase): Ignore operand 0.

        * config/rs6000/darwin.md (load_macho_picbase): Ignore operand 0.
        (load_macho_picbase_{si,di}): Convert to LR hard reg.
        (call_indirect_nonlocal_darwin64): Same.
        (call_nonlocal_darwin64): Same.
        (call_value_indirect_nonlocal_darwin64): Same.
        (call_value_nonlocal_darwin64): Same.
        (sibcall_nonlocal_darwin64): Same.
        (sibcall_value_nonlocal_darwin64): Same.
        (sibcall_symbolic_64): Same.
        (sibcall_value_symbolic_64): Same.
        * config/rs6000/rs6000.c (rs6000_legitimize_tls_address): Remove
        LR pseudo.
        (rs6000_emit_load_toc_table): Same.
        * config/rs6000/altivec.md (restore_world): Convert to LR hard reg.
        * config/rs6000/rs6000.md (mulh_call): Convert to LR hard reg.
        (mull_call): Same.
        (divss_call): Same.
        (divus_call): Same.
        (quoss_call): Same.
        (quous_call): Same.
        (load_toc_v4_pic_si): Same
        (load_toc_v4_PIC_1): Same.
        (load_toc_v4_PIC_1b): Same.
        (call_indirect_aix{32,64}): Same.
        (call_value_indirect_aix{32,64}): Same.
        (call): Same.
        (call_value): Same.
        (call_local{32,64}): Same.
        (call_value_local{32,64}): Same.
        (call_indirect_nonlocal_aix{32,64}): Same.
        (call_nonlocal_aix{32,64}): Same.
        (call_value_indirect_nonlocal_aix{32,64}): Same.
        (call_value_nonlocal_aix{32,64}): Same.
        (call_indirect_nonlocal_sysv<mode>): Same.
        (call_nonlocal_sysv<mode>): Same.
        (call_value_indirect_nonlocal_sysv<mode>): Same.
        (call_value_nonlocal_sysv<mode>): Same.
        (sibcall): Same.
        (sibcall_local{32,64}): Same.
        (sibcall_value_local{32,64}): Same.
        (sibcall_nonlocal_aix{32,64}): Same.
        (sibcall_value_nonlocal_aix{32,64}): Same.
        (sibcall_value_nonlocal_aix{32,64}): Same.
        (sibcall_nonlocal_sysv<mode>): Same.
        (sibcall_value): Same.
        (sibcall_value_nonlocal_sysv<mode>): Same.

From-SVN: r123193
parent 3303be15
2007-03-25 David Edelsohn <edelsohn@gnu.org>
* config/rs6000/darwin.md (load_macho_picbase): Ignore operand 0.
(load_macho_picbase_{si,di}): Convert to LR hard reg.
(call_indirect_nonlocal_darwin64): Same.
(call_nonlocal_darwin64): Same.
(call_value_indirect_nonlocal_darwin64): Same.
(call_value_nonlocal_darwin64): Same.
(sibcall_nonlocal_darwin64): Same.
(sibcall_value_nonlocal_darwin64): Same.
(sibcall_symbolic_64): Same.
(sibcall_value_symbolic_64): Same.
* config/rs6000/rs6000.c (rs6000_legitimize_tls_address): Remove
LR pseudo.
(rs6000_emit_load_toc_table): Same.
* config/rs6000/altivec.md (restore_world): Convert to LR hard reg.
* config/rs6000/rs6000.md (mulh_call): Convert to LR hard reg.
(mull_call): Same.
(divss_call): Same.
(divus_call): Same.
(quoss_call): Same.
(quous_call): Same.
(load_toc_v4_pic_si): Same
(load_toc_v4_PIC_1): Same.
(load_toc_v4_PIC_1b): Same.
(call_indirect_aix{32,64}): Same.
(call_value_indirect_aix{32,64}): Same.
(call): Same.
(call_value): Same.
(call_local{32,64}): Same.
(call_value_local{32,64}): Same.
(call_indirect_nonlocal_aix{32,64}): Same.
(call_nonlocal_aix{32,64}): Same.
(call_value_indirect_nonlocal_aix{32,64}): Same.
(call_value_nonlocal_aix{32,64}): Same.
(call_indirect_nonlocal_sysv<mode>): Same.
(call_nonlocal_sysv<mode>): Same.
(call_value_indirect_nonlocal_sysv<mode>): Same.
(call_value_nonlocal_sysv<mode>): Same.
(sibcall): Same.
(sibcall_local{32,64}): Same.
(sibcall_value_local{32,64}): Same.
(sibcall_nonlocal_aix{32,64}): Same.
(sibcall_value_nonlocal_aix{32,64}): Same.
(sibcall_nonlocal_sysv<mode>): Same.
(sibcall_value): Same.
(sibcall_value_nonlocal_sysv<mode>): Same.
2007-03-24 Paul Brook <paul@codesourcery.com> 2007-03-24 Paul Brook <paul@codesourcery.com>
* config/arm/lib1funcs.asm (div0): Use ARM_FUNC_START and do_push. * config/arm/lib1funcs.asm (div0): Use ARM_FUNC_START and do_push.
......
...@@ -312,7 +312,7 @@ ...@@ -312,7 +312,7 @@
(define_insn "*restore_world" (define_insn "*restore_world"
[(match_parallel 0 "restore_world_operation" [(match_parallel 0 "restore_world_operation"
[(return) [(return)
(use (match_operand:SI 1 "register_operand" "l")) (use (reg:SI 65))
(use (match_operand:SI 2 "call_operand" "s")) (use (match_operand:SI 2 "call_operand" "s"))
(clobber (match_operand:SI 3 "gpc_reg_operand" "=r"))])] (clobber (match_operand:SI 3 "gpc_reg_operand" "=r"))])]
"TARGET_MACHO && (DEFAULT_ABI == ABI_DARWIN) && TARGET_32BIT" "TARGET_MACHO && (DEFAULT_ABI == ABI_DARWIN) && TARGET_32BIT"
......
...@@ -245,28 +245,28 @@ Boston, MA 02110-1301, USA. */ ...@@ -245,28 +245,28 @@ Boston, MA 02110-1301, USA. */
"(DEFAULT_ABI == ABI_DARWIN) && flag_pic" "(DEFAULT_ABI == ABI_DARWIN) && flag_pic"
{ {
if (TARGET_32BIT) if (TARGET_32BIT)
emit_insn (gen_load_macho_picbase_si (operands[0], operands[1])); emit_insn (gen_load_macho_picbase_si (operands[1]));
else else
emit_insn (gen_load_macho_picbase_di (operands[0], operands[1])); emit_insn (gen_load_macho_picbase_di (operands[1]));
DONE; DONE;
}) })
(define_insn "load_macho_picbase_si" (define_insn "load_macho_picbase_si"
[(set (match_operand:SI 0 "register_operand" "=l") [(set (reg:SI 65)
(unspec:SI [(match_operand:SI 1 "immediate_operand" "s") (unspec:SI [(match_operand:SI 0 "immediate_operand" "s")
(pc)] UNSPEC_LD_MPIC))] (pc)] UNSPEC_LD_MPIC))]
"(DEFAULT_ABI == ABI_DARWIN) && flag_pic" "(DEFAULT_ABI == ABI_DARWIN) && flag_pic"
"bcl 20,31,%1\\n%1:" "bcl 20,31,%0\\n%0:"
[(set_attr "type" "branch") [(set_attr "type" "branch")
(set_attr "length" "4")]) (set_attr "length" "4")])
(define_insn "load_macho_picbase_di" (define_insn "load_macho_picbase_di"
[(set (match_operand:DI 0 "register_operand" "=l") [(set (reg:DI 65)
(unspec:DI [(match_operand:DI 1 "immediate_operand" "s") (unspec:DI [(match_operand:DI 0 "immediate_operand" "s")
(pc)] UNSPEC_LD_MPIC))] (pc)] UNSPEC_LD_MPIC))]
"(DEFAULT_ABI == ABI_DARWIN) && flag_pic && TARGET_64BIT" "(DEFAULT_ABI == ABI_DARWIN) && flag_pic && TARGET_64BIT"
"bcl 20,31,%1\\n%1:" "bcl 20,31,%0\\n%0:"
[(set_attr "type" "branch") [(set_attr "type" "branch")
(set_attr "length" "4")]) (set_attr "length" "4")])
...@@ -312,7 +312,7 @@ Boston, MA 02110-1301, USA. */ ...@@ -312,7 +312,7 @@ Boston, MA 02110-1301, USA. */
[(call (mem:SI (match_operand:DI 0 "register_operand" "c,*l,c,*l")) [(call (mem:SI (match_operand:DI 0 "register_operand" "c,*l,c,*l"))
(match_operand 1 "" "g,g,g,g")) (match_operand 1 "" "g,g,g,g"))
(use (match_operand:SI 2 "immediate_operand" "O,O,n,n")) (use (match_operand:SI 2 "immediate_operand" "O,O,n,n"))
(clobber (match_scratch:SI 3 "=l,l,l,l"))] (clobber (reg:SI 65))]
"DEFAULT_ABI == ABI_DARWIN && TARGET_64BIT" "DEFAULT_ABI == ABI_DARWIN && TARGET_64BIT"
{ {
return "b%T0l"; return "b%T0l";
...@@ -324,7 +324,7 @@ Boston, MA 02110-1301, USA. */ ...@@ -324,7 +324,7 @@ Boston, MA 02110-1301, USA. */
[(call (mem:SI (match_operand:DI 0 "symbol_ref_operand" "s,s")) [(call (mem:SI (match_operand:DI 0 "symbol_ref_operand" "s,s"))
(match_operand 1 "" "g,g")) (match_operand 1 "" "g,g"))
(use (match_operand:SI 2 "immediate_operand" "O,n")) (use (match_operand:SI 2 "immediate_operand" "O,n"))
(clobber (match_scratch:SI 3 "=l,l"))] (clobber (reg:SI 65))]
"(DEFAULT_ABI == ABI_DARWIN) "(DEFAULT_ABI == ABI_DARWIN)
&& (INTVAL (operands[2]) & CALL_LONG) == 0" && (INTVAL (operands[2]) & CALL_LONG) == 0"
{ {
...@@ -342,7 +342,7 @@ Boston, MA 02110-1301, USA. */ ...@@ -342,7 +342,7 @@ Boston, MA 02110-1301, USA. */
(call (mem:SI (match_operand:DI 1 "register_operand" "c,*l,c,*l")) (call (mem:SI (match_operand:DI 1 "register_operand" "c,*l,c,*l"))
(match_operand 2 "" "g,g,g,g"))) (match_operand 2 "" "g,g,g,g")))
(use (match_operand:SI 3 "immediate_operand" "O,O,n,n")) (use (match_operand:SI 3 "immediate_operand" "O,O,n,n"))
(clobber (match_scratch:SI 4 "=l,l,l,l"))] (clobber (reg:SI 65))]
"DEFAULT_ABI == ABI_DARWIN" "DEFAULT_ABI == ABI_DARWIN"
{ {
return "b%T1l"; return "b%T1l";
...@@ -355,7 +355,7 @@ Boston, MA 02110-1301, USA. */ ...@@ -355,7 +355,7 @@ Boston, MA 02110-1301, USA. */
(call (mem:SI (match_operand:DI 1 "symbol_ref_operand" "s,s")) (call (mem:SI (match_operand:DI 1 "symbol_ref_operand" "s,s"))
(match_operand 2 "" "g,g"))) (match_operand 2 "" "g,g")))
(use (match_operand:SI 3 "immediate_operand" "O,n")) (use (match_operand:SI 3 "immediate_operand" "O,n"))
(clobber (match_scratch:SI 4 "=l,l"))] (clobber (reg:SI 65))]
"(DEFAULT_ABI == ABI_DARWIN) "(DEFAULT_ABI == ABI_DARWIN)
&& (INTVAL (operands[3]) & CALL_LONG) == 0" && (INTVAL (operands[3]) & CALL_LONG) == 0"
{ {
...@@ -372,7 +372,7 @@ Boston, MA 02110-1301, USA. */ ...@@ -372,7 +372,7 @@ Boston, MA 02110-1301, USA. */
[(call (mem:SI (match_operand:DI 0 "symbol_ref_operand" "s,s")) [(call (mem:SI (match_operand:DI 0 "symbol_ref_operand" "s,s"))
(match_operand 1 "" "")) (match_operand 1 "" ""))
(use (match_operand 2 "immediate_operand" "O,n")) (use (match_operand 2 "immediate_operand" "O,n"))
(use (match_operand:SI 3 "register_operand" "l,l")) (use (reg:SI 65))
(return)] (return)]
"(DEFAULT_ABI == ABI_DARWIN) "(DEFAULT_ABI == ABI_DARWIN)
&& (INTVAL (operands[2]) & CALL_LONG) == 0" && (INTVAL (operands[2]) & CALL_LONG) == 0"
...@@ -387,7 +387,7 @@ Boston, MA 02110-1301, USA. */ ...@@ -387,7 +387,7 @@ Boston, MA 02110-1301, USA. */
(call (mem:SI (match_operand:DI 1 "symbol_ref_operand" "s,s")) (call (mem:SI (match_operand:DI 1 "symbol_ref_operand" "s,s"))
(match_operand 2 "" ""))) (match_operand 2 "" "")))
(use (match_operand:SI 3 "immediate_operand" "O,n")) (use (match_operand:SI 3 "immediate_operand" "O,n"))
(use (match_operand:SI 4 "register_operand" "l,l")) (use (reg:SI 65))
(return)] (return)]
"(DEFAULT_ABI == ABI_DARWIN) "(DEFAULT_ABI == ABI_DARWIN)
&& (INTVAL (operands[3]) & CALL_LONG) == 0" && (INTVAL (operands[3]) & CALL_LONG) == 0"
...@@ -403,7 +403,7 @@ Boston, MA 02110-1301, USA. */ ...@@ -403,7 +403,7 @@ Boston, MA 02110-1301, USA. */
[(call (mem:SI (match_operand:DI 0 "call_operand" "s,c")) ; 64 [(call (mem:SI (match_operand:DI 0 "call_operand" "s,c")) ; 64
(match_operand 1 "" "")) (match_operand 1 "" ""))
(use (match_operand 2 "" "")) (use (match_operand 2 "" ""))
(use (match_operand:SI 3 "register_operand" "l,l")) (use (reg:SI 65))
(return)] (return)]
"TARGET_64BIT && DEFAULT_ABI == ABI_DARWIN" "TARGET_64BIT && DEFAULT_ABI == ABI_DARWIN"
"* "*
...@@ -423,7 +423,7 @@ Boston, MA 02110-1301, USA. */ ...@@ -423,7 +423,7 @@ Boston, MA 02110-1301, USA. */
(call (mem:SI (match_operand:DI 1 "call_operand" "s,c")) (call (mem:SI (match_operand:DI 1 "call_operand" "s,c"))
(match_operand 2 "" ""))) (match_operand 2 "" "")))
(use (match_operand:SI 3 "" "")) (use (match_operand:SI 3 "" ""))
(use (match_operand:SI 4 "register_operand" "l,l")) (use (reg:SI 65))
(return)] (return)]
"TARGET_64BIT && DEFAULT_ABI == ABI_DARWIN" "TARGET_64BIT && DEFAULT_ABI == ABI_DARWIN"
"* "*
......
...@@ -3444,17 +3444,17 @@ rs6000_legitimize_tls_address (rtx addr, enum tls_model model) ...@@ -3444,17 +3444,17 @@ rs6000_legitimize_tls_address (rtx addr, enum tls_model model)
rs6000_emit_move (got, gsym, Pmode); rs6000_emit_move (got, gsym, Pmode);
else else
{ {
rtx tempLR, tmp3, mem; rtx tmp3, mem;
rtx first, last; rtx first, last;
tempLR = gen_reg_rtx (Pmode);
tmp1 = gen_reg_rtx (Pmode); tmp1 = gen_reg_rtx (Pmode);
tmp2 = gen_reg_rtx (Pmode); tmp2 = gen_reg_rtx (Pmode);
tmp3 = gen_reg_rtx (Pmode); tmp3 = gen_reg_rtx (Pmode);
mem = gen_const_mem (Pmode, tmp1); mem = gen_const_mem (Pmode, tmp1);
first = emit_insn (gen_load_toc_v4_PIC_1b (tempLR, gsym)); first = emit_insn (gen_load_toc_v4_PIC_1b (gsym));
emit_move_insn (tmp1, tempLR); emit_move_insn (tmp1,
gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM));
emit_move_insn (tmp2, mem); emit_move_insn (tmp2, mem);
emit_insn (gen_addsi3 (tmp3, tmp1, tmp2)); emit_insn (gen_addsi3 (tmp3, tmp1, tmp2));
last = emit_move_insn (got, tmp3); last = emit_move_insn (got, tmp3);
...@@ -13988,7 +13988,7 @@ rs6000_emit_load_toc_table (int fromprolog) ...@@ -13988,7 +13988,7 @@ rs6000_emit_load_toc_table (int fromprolog)
if (TARGET_ELF && TARGET_SECURE_PLT && DEFAULT_ABI != ABI_AIX && flag_pic) if (TARGET_ELF && TARGET_SECURE_PLT && DEFAULT_ABI != ABI_AIX && flag_pic)
{ {
char buf[30]; char buf[30];
rtx lab, tmp1, tmp2, got, tempLR; rtx lab, tmp1, tmp2, got;
ASM_GENERATE_INTERNAL_LABEL (buf, "LCF", rs6000_pic_labelno); ASM_GENERATE_INTERNAL_LABEL (buf, "LCF", rs6000_pic_labelno);
lab = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf)); lab = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
...@@ -14002,13 +14002,11 @@ rs6000_emit_load_toc_table (int fromprolog) ...@@ -14002,13 +14002,11 @@ rs6000_emit_load_toc_table (int fromprolog)
tmp1 = gen_reg_rtx (Pmode); tmp1 = gen_reg_rtx (Pmode);
tmp2 = gen_reg_rtx (Pmode); tmp2 = gen_reg_rtx (Pmode);
} }
tempLR = (fromprolog insn = emit_insn (gen_load_toc_v4_PIC_1 (lab));
? gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM)
: gen_reg_rtx (Pmode));
insn = emit_insn (gen_load_toc_v4_PIC_1 (tempLR, lab));
if (fromprolog) if (fromprolog)
rs6000_maybe_dead (insn); rs6000_maybe_dead (insn);
insn = emit_move_insn (tmp1, tempLR); insn = emit_move_insn (tmp1,
gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM));
if (fromprolog) if (fromprolog)
rs6000_maybe_dead (insn); rs6000_maybe_dead (insn);
insn = emit_insn (gen_load_toc_v4_PIC_3b (tmp2, tmp1, got, lab)); insn = emit_insn (gen_load_toc_v4_PIC_3b (tmp2, tmp1, got, lab));
...@@ -14020,23 +14018,17 @@ rs6000_emit_load_toc_table (int fromprolog) ...@@ -14020,23 +14018,17 @@ rs6000_emit_load_toc_table (int fromprolog)
} }
else if (TARGET_ELF && DEFAULT_ABI == ABI_V4 && flag_pic == 1) else if (TARGET_ELF && DEFAULT_ABI == ABI_V4 && flag_pic == 1)
{ {
rtx tempLR = (fromprolog insn = emit_insn (gen_load_toc_v4_pic_si ());
? gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM)
: gen_reg_rtx (Pmode));
insn = emit_insn (gen_load_toc_v4_pic_si (tempLR));
if (fromprolog) if (fromprolog)
rs6000_maybe_dead (insn); rs6000_maybe_dead (insn);
insn = emit_move_insn (dest, tempLR); insn = emit_move_insn (dest,
gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM));
if (fromprolog) if (fromprolog)
rs6000_maybe_dead (insn); rs6000_maybe_dead (insn);
} }
else if (TARGET_ELF && DEFAULT_ABI != ABI_AIX && flag_pic == 2) else if (TARGET_ELF && DEFAULT_ABI != ABI_AIX && flag_pic == 2)
{ {
char buf[30]; char buf[30];
rtx tempLR = (fromprolog
? gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM)
: gen_reg_rtx (Pmode));
rtx temp0 = (fromprolog rtx temp0 = (fromprolog
? gen_rtx_REG (Pmode, 0) ? gen_rtx_REG (Pmode, 0)
: gen_reg_rtx (Pmode)); : gen_reg_rtx (Pmode));
...@@ -14051,9 +14043,10 @@ rs6000_emit_load_toc_table (int fromprolog) ...@@ -14051,9 +14043,10 @@ rs6000_emit_load_toc_table (int fromprolog)
ASM_GENERATE_INTERNAL_LABEL (buf, "LCL", rs6000_pic_labelno); ASM_GENERATE_INTERNAL_LABEL (buf, "LCL", rs6000_pic_labelno);
symL = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf)); symL = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
rs6000_maybe_dead (emit_insn (gen_load_toc_v4_PIC_1 (tempLR, rs6000_maybe_dead (emit_insn (gen_load_toc_v4_PIC_1 (symF)));
symF))); rs6000_maybe_dead (emit_move_insn (dest,
rs6000_maybe_dead (emit_move_insn (dest, tempLR)); gen_rtx_REG (Pmode,
LINK_REGISTER_REGNUM)));
rs6000_maybe_dead (emit_insn (gen_load_toc_v4_PIC_2 (temp0, dest, rs6000_maybe_dead (emit_insn (gen_load_toc_v4_PIC_2 (temp0, dest,
symL, symL,
symF))); symF)));
...@@ -14063,8 +14056,9 @@ rs6000_emit_load_toc_table (int fromprolog) ...@@ -14063,8 +14056,9 @@ rs6000_emit_load_toc_table (int fromprolog)
rtx tocsym; rtx tocsym;
tocsym = gen_rtx_SYMBOL_REF (Pmode, toc_label_name); tocsym = gen_rtx_SYMBOL_REF (Pmode, toc_label_name);
emit_insn (gen_load_toc_v4_PIC_1b (tempLR, tocsym)); emit_insn (gen_load_toc_v4_PIC_1b (tocsym));
emit_move_insn (dest, tempLR); emit_move_insn (dest,
gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM));
emit_move_insn (temp0, gen_rtx_MEM (Pmode, dest)); emit_move_insn (temp0, gen_rtx_MEM (Pmode, dest));
} }
insn = emit_insn (gen_addsi3 (dest, temp0, dest)); insn = emit_insn (gen_addsi3 (dest, temp0, dest));
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment