"TARGET_ELF && TARGET_CMODEL != CMODEL_SMALL"
"{cal %0,%2@l(%1)|addi %0,%1,%2@l}")
\f
-;; A function pointer under AIX is a pointer to a data area whose first word
-;; contains the actual address of the function, whose second word contains a
-;; pointer to its TOC, and whose third word contains a value to place in the
-;; static chain register (r11). Note that if we load the static chain, our
-;; "trampoline" need not have any executable code.
-
-(define_expand "call_indirect_aix32"
- [(set (match_dup 2)
- (mem:SI (match_operand:SI 0 "gpc_reg_operand" "")))
- (set (match_dup 3)
- (reg:SI 2))
- (set (reg:SI 11)
- (mem:SI (plus:SI (match_dup 0)
- (const_int 8))))
- (parallel [(call (mem:SI (match_dup 2))
- (match_operand 1 "" ""))
- (use (match_dup 4))
- (set (reg:SI 2) (match_dup 3))
- (use (reg:SI 11))
- (clobber (reg:SI LR_REGNO))])]
- "TARGET_32BIT"
- "
-{
- operands[2] = gen_reg_rtx (SImode);
- operands[3] = gen_rtx_MEM (SImode,
- gen_rtx_PLUS (SImode, stack_pointer_rtx,
- GEN_INT (20)));
-
- operands[4] = gen_rtx_MEM (SImode,
- gen_rtx_PLUS (SImode, operands[0],
- GEN_INT (4)));
-
- /* Make sure the compiler does not optimize away the store of the TOC. */
- MEM_VOLATILE_P (operands[3]) = 1;
-}")
-
-(define_expand "call_indirect_aix64"
- [(set (match_dup 2)
- (mem:DI (match_operand:DI 0 "gpc_reg_operand" "")))
- (set (match_dup 3)
- (reg:DI 2))
- (set (reg:DI 11)
- (mem:DI (plus:DI (match_dup 0)
- (const_int 16))))
- (parallel [(call (mem:SI (match_dup 2))
- (match_operand 1 "" ""))
- (use (match_dup 4))
- (set (reg:DI 2) (match_dup 3))
- (use (reg:DI 11))
- (clobber (reg:DI LR_REGNO))])]
- "TARGET_64BIT"
- "
-{
- operands[2] = gen_reg_rtx (DImode);
- operands[3] = gen_rtx_MEM (DImode,
- gen_rtx_PLUS (DImode, stack_pointer_rtx,
- GEN_INT (40)));
-
- operands[4] = gen_rtx_MEM (DImode,
- gen_rtx_PLUS (DImode, operands[0],
- GEN_INT (8)));
-
- /* Make sure the compiler does not optimize away the store of the TOC. */
- MEM_VOLATILE_P (operands[3]) = 1;
-}")
-
-(define_expand "call_value_indirect_aix32"
- [(set (match_dup 3)
- (mem:SI (match_operand:SI 1 "gpc_reg_operand" "")))
- (set (match_dup 4)
- (reg:SI 2))
- (set (reg:SI 11)
- (mem:SI (plus:SI (match_dup 1)
- (const_int 8))))
- (parallel [(set (match_operand 0 "" "")
- (call (mem:SI (match_dup 3))
- (match_operand 2 "" "")))
- (use (match_dup 5))
- (set (reg:SI 2) (match_dup 4))
- (use (reg:SI 11))
- (clobber (reg:SI LR_REGNO))])]
- "TARGET_32BIT"
- "
-{
- operands[3] = gen_reg_rtx (SImode);
- operands[4] = gen_rtx_MEM (SImode,
- gen_rtx_PLUS (SImode, stack_pointer_rtx,
- GEN_INT (20)));
-
- operands[5] = gen_rtx_MEM (SImode,
- gen_rtx_PLUS (SImode, operands[1],
- GEN_INT (4)));
-
- /* Make sure the compiler does not optimize away the store of the TOC. */
- MEM_VOLATILE_P (operands[4]) = 1;
-}")
-
-(define_expand "call_value_indirect_aix64"
- [(set (match_dup 3)
- (mem:DI (match_operand:DI 1 "gpc_reg_operand" "")))
- (set (match_dup 4)
- (reg:DI 2))
- (set (reg:DI 11)
- (mem:DI (plus:DI (match_dup 1)
- (const_int 16))))
- (parallel [(set (match_operand 0 "" "")
- (call (mem:SI (match_dup 3))
- (match_operand 2 "" "")))
- (use (match_dup 5))
- (set (reg:DI 2) (match_dup 4))
- (use (reg:DI 11))
- (clobber (reg:DI LR_REGNO))])]
- "TARGET_64BIT"
- "
-{
- operands[3] = gen_reg_rtx (DImode);
- operands[4] = gen_rtx_MEM (DImode,
- gen_rtx_PLUS (DImode, stack_pointer_rtx,
- GEN_INT (40)));
-
- operands[5] = gen_rtx_MEM (DImode,
- gen_rtx_PLUS (DImode, operands[1],
- GEN_INT (8)));
-
- /* Make sure the compiler does not optimize away the store of the TOC. */
- MEM_VOLATILE_P (operands[4]) = 1;
-}")
-
-;; Now the definitions for the call and call_value insns
+;; Call and call_value insns
(define_expand "call"
[(parallel [(call (mem:SI (match_operand 0 "address_operand" ""))
(match_operand 1 "" ""))