"addis %0,%1,ha16(%2-%3)\n\taddi %0,%0,lo16(%2-%3)"
[(set_attr "length" "8")])
-(define_insn "*call_indirect_nonlocal_darwin64"
- [(call (mem:SI (match_operand:DI 0 "register_operand" "c,*l,c,*l"))
- (match_operand 1))
- (use (match_operand:SI 2 "immediate_operand" "O,O,n,n"))
- (clobber (reg:SI LR_REGNO))]
- "DEFAULT_ABI == ABI_DARWIN && TARGET_64BIT"
-{
- return "b%T0l";
-}
- [(set_attr "type" "jmpreg,jmpreg,jmpreg,jmpreg")
- (set_attr "length" "4,4,8,8")])
-
-(define_insn "*call_nonlocal_darwin64"
- [(call (mem:SI (match_operand:DI 0 "symbol_ref_operand" "s,s"))
- (match_operand 1))
- (use (match_operand:SI 2 "immediate_operand" "O,n"))
- (clobber (reg:SI LR_REGNO))]
- "(DEFAULT_ABI == ABI_DARWIN)
- && (INTVAL (operands[2]) & CALL_LONG) == 0"
-{
-#if TARGET_MACHO
- return output_call(insn, operands, 0, 2);
-#else
- gcc_unreachable ();
-#endif
-}
- [(set_attr "type" "branch,branch")
- (set_attr "length" "4,8")])
-
-(define_insn "*call_value_indirect_nonlocal_darwin64"
- [(set (match_operand 0 "" "")
- (call (mem:SI (match_operand:DI 1 "register_operand" "c,*l,c,*l"))
- (match_operand 2)))
- (use (match_operand:SI 3 "immediate_operand" "O,O,n,n"))
- (clobber (reg:SI LR_REGNO))]
- "DEFAULT_ABI == ABI_DARWIN"
-{
- return "b%T1l";
-}
- [(set_attr "type" "jmpreg,jmpreg,jmpreg,jmpreg")
- (set_attr "length" "4,4,8,8")])
-
-(define_insn "*call_value_nonlocal_darwin64"
- [(set (match_operand 0 "" "")
- (call (mem:SI (match_operand:DI 1 "symbol_ref_operand" "s,s"))
- (match_operand 2)))
- (use (match_operand:SI 3 "immediate_operand" "O,n"))
- (clobber (reg:SI LR_REGNO))]
- "(DEFAULT_ABI == ABI_DARWIN)
- && (INTVAL (operands[3]) & CALL_LONG) == 0"
-{
-#if TARGET_MACHO
- return output_call(insn, operands, 1, 3);
-#else
- gcc_unreachable ();
-#endif
-}
- [(set_attr "type" "branch,branch")
- (set_attr "length" "4,8")])
-
(define_expand "reload_macho_picbase"
[(set (reg:SI LR_REGNO)
(unspec [(match_operand 0 "")]
? "+32768" : ""));
static char str[32]; /* 2 spare */
- if (DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_ELFv2)
+ if (DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_ELFv2
+ || DEFAULT_ABI == ABI_DARWIN)
sprintf (str, "b%s %s%s%s", sibcall ? "" : "l", z, arg,
sibcall ? "" : "\n\tnop");
else if (DEFAULT_ABI == ABI_V4)
/* Handle longcall attributes. */
if ((INTVAL (cookie) & CALL_LONG) != 0
+ && DEFAULT_ABI != ABI_DARWIN /* Darwin does it's own thing. */
&& GET_CODE (func_desc) == SYMBOL_REF)
{
func = rs6000_longcall_ref (func_desc, tlsarg);
if (value != NULL_RTX)
call[0] = gen_rtx_SET (value, call[0]);
- unsigned int mask = CALL_V4_SET_FP_ARGS | CALL_V4_CLEAR_FP_ARGS;
- call[1] = gen_rtx_USE (VOIDmode, GEN_INT (INTVAL (cookie) & mask));
+ if (DEFAULT_ABI == ABI_DARWIN && TARGET_32BIT)
+ call[1] = gen_rtx_USE (VOIDmode, GEN_INT (INTVAL (cookie)));
+ else
+ {
+ unsigned int mask = CALL_V4_SET_FP_ARGS | CALL_V4_CLEAR_FP_ARGS;
+ call[1] = gen_rtx_USE (VOIDmode, GEN_INT (INTVAL (cookie) & mask));
+ }
call[2] = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (Pmode, LR_REGNO));
})
\f
;; Call and call_value insns
+;; For the purposes of expanding calls, Darwin is very similar to SYSV.
(define_expand "call"
[(parallel [(call (mem:SI (match_operand 0 "address_operand"))
(match_operand 1 ""))
operands[0] = XEXP (operands[0], 0);
if (DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_ELFv2)
- {
- rs6000_call_aix (NULL_RTX, operands[0], operands[1], operands[2]);
- DONE;
- }
-
- if (DEFAULT_ABI == ABI_V4)
- {
- rs6000_call_sysv (NULL_RTX, operands[0], operands[1], operands[2]);
- DONE;
- }
+ rs6000_call_aix (NULL_RTX, operands[0], operands[1], operands[2]);
+ else
+ rs6000_call_sysv (NULL_RTX, operands[0], operands[1], operands[2]);
- if (GET_CODE (operands[0]) != SYMBOL_REF)
- operands[0] = force_reg (Pmode, operands[0]);
+ DONE;
})
(define_expand "call_value"
operands[1] = XEXP (operands[1], 0);
if (DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_ELFv2)
- {
- rs6000_call_aix (operands[0], operands[1], operands[2], operands[3]);
- DONE;
- }
-
- if (DEFAULT_ABI == ABI_V4)
- {
- rs6000_call_sysv (operands[0], operands[1], operands[2], operands[3]);
- DONE;
- }
+ rs6000_call_aix (operands[0], operands[1], operands[2], operands[3]);
+ else
+ rs6000_call_sysv (operands[0], operands[1], operands[2], operands[3]);
- if (GET_CODE (operands[1]) != SYMBOL_REF)
- operands[1] = force_reg (Pmode, operands[1]);
+ DONE;
})
;; Call to function in current module. No TOC pointer reload needed.
[(call (mem:SI (match_operand:DI 0 "current_file_function_operand" "s,s"))
(match_operand 1))
(use (match_operand:SI 2 "immediate_operand" "O,n"))
- (clobber (reg:SI LR_REGNO))]
+ (clobber (reg:DI LR_REGNO))]
"TARGET_64BIT && (INTVAL (operands[2]) & CALL_LONG) == 0"
{
if (INTVAL (operands[2]) & CALL_V4_SET_FP_ARGS)
(call (mem:SI (match_operand:DI 1 "current_file_function_operand" "s,s"))
(match_operand 2)))
(use (match_operand:SI 3 "immediate_operand" "O,n"))
- (clobber (reg:SI LR_REGNO))]
+ (clobber (reg:DI LR_REGNO))]
"TARGET_64BIT && (INTVAL (operands[3]) & CALL_LONG) == 0"
{
if (INTVAL (operands[3]) & CALL_V4_SET_FP_ARGS)
[(call (mem:SI (match_operand:P 0 "indirect_call_operand" "c,*l,X"))
(match_operand 1))
(use (match_operand:SI 2 "immediate_operand" "n,n,n"))
- (clobber (reg:SI LR_REGNO))]
+ (clobber (reg:P LR_REGNO))]
"DEFAULT_ABI == ABI_V4
|| DEFAULT_ABI == ABI_DARWIN"
{
[(call (mem:SI (match_operand:P 0 "symbol_ref_operand" "s,s"))
(match_operand 1))
(use (match_operand:SI 2 "immediate_operand" "O,n"))
- (clobber (reg:SI LR_REGNO))]
+ (clobber (reg:P LR_REGNO))]
"(DEFAULT_ABI == ABI_DARWIN
|| (DEFAULT_ABI == ABI_V4
&& (INTVAL (operands[2]) & CALL_LONG) == 0))"
(match_operand 1))
(use (match_operand:SI 2 "immediate_operand" "O,n"))
(use (match_operand:SI 3 "register_operand" "r,r"))
- (clobber (reg:SI LR_REGNO))]
+ (clobber (reg:P LR_REGNO))]
"(DEFAULT_ABI == ABI_V4
&& TARGET_SECURE_PLT && flag_pic && !SYMBOL_REF_LOCAL_P (operands[0])
&& (INTVAL (operands[2]) & CALL_LONG) == 0)"
(call (mem:SI (match_operand:P 1 "indirect_call_operand" "c,*l,X"))
(match_operand 2)))
(use (match_operand:SI 3 "immediate_operand" "n,n,n"))
- (clobber (reg:SI LR_REGNO))]
+ (clobber (reg:P LR_REGNO))]
"DEFAULT_ABI == ABI_V4
|| DEFAULT_ABI == ABI_DARWIN"
{
(call (mem:SI (match_operand:P 1 "symbol_ref_operand" "s,s"))
(match_operand 2)))
(use (match_operand:SI 3 "immediate_operand" "O,n"))
- (clobber (reg:SI LR_REGNO))]
+ (clobber (reg:P LR_REGNO))]
"(DEFAULT_ABI == ABI_DARWIN
|| (DEFAULT_ABI == ABI_V4
&& (INTVAL (operands[3]) & CALL_LONG) == 0))"
(match_operand 2)))
(use (match_operand:SI 3 "immediate_operand" "O,n"))
(use (match_operand:SI 4 "register_operand" "r,r"))
- (clobber (reg:SI LR_REGNO))]
+ (clobber (reg:P LR_REGNO))]
"(DEFAULT_ABI == ABI_V4
&& TARGET_SECURE_PLT && flag_pic && !SYMBOL_REF_LOCAL_P (operands[1])
&& (INTVAL (operands[3]) & CALL_LONG) == 0)"
operands[0] = XEXP (operands[0], 0);
if (DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_ELFv2)
- {
- rs6000_sibcall_aix (NULL_RTX, operands[0], operands[1], operands[2]);
- DONE;
- }
+ rs6000_sibcall_aix (NULL_RTX, operands[0], operands[1], operands[2]);
+ else
+ rs6000_sibcall_sysv (NULL_RTX, operands[0], operands[1], operands[2]);
- if (DEFAULT_ABI == ABI_V4)
- {
- rs6000_sibcall_sysv (NULL_RTX, operands[0], operands[1], operands[2]);
- DONE;
- }
+ DONE;
})
(define_expand "sibcall_value"
operands[1] = XEXP (operands[1], 0);
if (DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_ELFv2)
- {
- rs6000_sibcall_aix (operands[0], operands[1], operands[2], operands[3]);
- DONE;
- }
+ rs6000_sibcall_aix (operands[0], operands[1], operands[2], operands[3]);
+ else
+ rs6000_sibcall_sysv (operands[0], operands[1], operands[2], operands[3]);
- if (DEFAULT_ABI == ABI_V4)
- {
- rs6000_sibcall_sysv (operands[0], operands[1], operands[2], operands[3]);
- DONE;
- }
+ DONE;
})
(define_insn "*sibcall_local32"