PR82045: Avoid passing machine modes through "..."

PR82045 is about a bootstrap failure on sparc-sun-solaris2.11.
The problem was that we were passing the new machine_mode wrapper
classes through "..."  to emit_library_call(_value), which then
read them back as ints instead.

The simplest fix seemed to be replace "..." with an array of
rtx_mode_ts, then provide wrappers for the common cases.  This
bulks out rtl.h a bit, but it does make things a bit more typesafe.

2017-09-04  Richard Sandiford  <richard.sandiford@linaro.org>

gcc/
	PR bootstrap/82045
	* rtl.h (emit_library_call_value_1): Declare.
	(emit_library_call): Replace declaration with a series of overloads.
	Remove the parameter count argument.
	(emit_library_call_value): Likewise.
	* calls.c (emit_library_call_value_1): Make global.  Replace varargs
	with an "rtx_mode_t *".
	(emit_library_call_value): Delete.
	(emit_library_call): Likewise.
	* asan.c (asan_emit_stack_protection): Update calls accordingly.
	(asan_emit_allocas_unpoison): Likewise.
	* builtins.c (expand_builtin_powi): Likewise.
	(expand_asan_emit_allocas_unpoison): Likewise.
	* cfgexpand.c (expand_main_function): Likewise.
	* config/aarch64/aarch64.c (aarch64_trampoline_init): Likewise.
	* config/aarch64/aarch64.h (PROFILE_HOOK): Likewise.
	* config/alpha/alpha.c (alpha_trampoline_init): Likewise.
	* config/arm/arm.c (arm_trampoline_init): Likewise.
	(arm_call_tls_get_addr): Likewise.
	(arm_expand_divmod_libfunc): Likewise.
	* config/bfin/bfin.md (umulsi3_highpart): Likewise.
	(smulsi3_highpart): Likewise.
	* config/c6x/c6x.c (c6x_initialize_trampoline): Likewise.
	(c6x_expand_compare): Likewise.
	(c6x_expand_movmem): Likewise.
	* config/frv/frv.c (frv_trampoline_init): Likewise.
	* config/i386/i386.c (ix86_trampoline_init): Likewise.
	(ix86_expand_divmod_libfunc): Likewise.
	* config/ia64/ia64.c (ia64_expand_tls_address): Likewise.
	(ia64_expand_compare): Likewise.
	(ia64_profile_hook): Likewise.
	* config/ia64/ia64.md (save_stack_nonlocal): Likewise.
	(nonlocal_goto): Likewise.
	(restore_stack_nonlocal): Likewise.
	* config/m32r/m32r.c (block_move_call): Likewise.
	(m32r_trampoline_init): Likewise.
	* config/m68k/linux.h (FINALIZE_TRAMPOLINE): Likewise.
	* config/m68k/m68k.c (m68k_call_tls_get_addr): Likewise.
	(m68k_call_m68k_read_tp): Likewise.
	* config/microblaze/microblaze.c (microblaze_call_tls_get_addr)
	(microblaze_expand_divide): Likewise.
	* config/mips/mips.h (mips_args): Likewise.
	* config/mips/sdemtk.h (mips_sync_icache): Likewise.
	(MIPS_ICACHE_SYNC): Likewise.
	* config/nios2/nios2.c (nios2_emit_expensive_div): Likewise.
	(nios2_trampoline_init): Likewise.
	* config/pa/pa.c (hppa_tls_call): Likewise.
	(pa_trampoline_init): Likewise.
	* config/pa/pa.md (canonicalize_funcptr_for_compare): Likewise.
	* config/powerpcspe/powerpcspe.c (rs6000_legitimize_tls_address)
	(expand_strn_compare): Likewise.
	(rs6000_generate_compare): Likewise.
	(rs6000_expand_float128_convert): Likewise.
	(output_profile_hook): Likewise.
	(rs6000_trampoline_init): Likewise.
	* config/powerpcspe/powerpcspe.md (neg<mode>2): Likewise.
	* config/riscv/riscv.h (PROFILE_HOOK): Likewise.
	* config/rs6000/rs6000-string.c (expand_strn_compare): Likewise.
	* config/rs6000/rs6000.c (rs6000_legitimize_tls_address): Likewise.
	(rs6000_generate_compare): Likewise.
	(rs6000_expand_float128_convert): Likewise.
	(output_profile_hook): Likewise.
	(rs6000_trampoline_init): Likewise.
	* config/rs6000/rs6000.md (neg<mode>2): Likewise.
	* config/sh/sh.c (sh_trampoline_init): Likewise.
	* config/sparc/sparc.c (emit_soft_tfmode_libcall): Likewise.
	(sparc_emit_float_lib_cmp): Likewise.
	(sparc32_initialize_trampoline): Likewise.
	(sparc64_initialize_trampoline): Likewise.
	(sparc_profile_hook): Likewise.
	* config/spu/spu.c (ea_load_store): Likewise.
	* config/spu/spu.md (floatunssidf2): Likewise.
	* config/tilegx/tilegx.c (tilegx_trampoline_init): Likewise.
	* config/tilepro/tilepro.c (tilepro_trampoline_init): Likewise.
	* config/visium/visium.c (expand_block_move_4): Likewise.
	(expand_block_move_2): Likewise.
	(expand_block_move_1): Likewise.
	(expand_block_set_4): Likewise.
	(expand_block_set_2): Likewise.
	(expand_block_set_1): Likewise.
	(visium_trampoline_init): Likewise.
	(visium_profile_hook): Likewise.
	* config/xtensa/xtensa.c (xtensa_expand_nonlocal_goto): Likewise.
	(xtensa_setup_frame_addresses): Likewise.
	(xtensa_trampoline_init): Likewise.
	* except.c (sjlj_emit_function_enter): Likewise.
	(sjlj_emit_function_exit): Likewise.
	* explow.c (allocate_dynamic_stack_space): Likewise.
	(probe_stack_range): Likewise.
	* expr.c (convert_mode_scalar): Likewise.
	* optabs.c (expand_binop): Likewise.
	(expand_twoval_binop_libfunc): Likewise.
	(expand_unop): Likewise.
	(prepare_cmp_insn): Likewise.
	(prepare_float_lib_cmp): Likewise.
	(expand_float): Likewise.
	(expand_fix): Likewise.
	(expand_fixed_convert): Likewise.
	(maybe_emit_sync_lock_test_and_set): Likewise.
	(expand_atomic_compare_and_swap): Likewise.
	(expand_mem_thread_fence): Likewise.
	(expand_atomic_fetch_op): Likewise.

From-SVN: r251637
This commit is contained in:
Richard Sandiford 2017-09-04 07:30:53 +00:00 committed by Richard Sandiford
parent 77701e2346
commit db69559bac
43 changed files with 387 additions and 199 deletions

View File

@ -1,3 +1,108 @@
2017-09-04 Richard Sandiford <richard.sandiford@linaro.org>
PR bootstrap/82045
* rtl.h (emit_library_call_value_1): Declare.
(emit_library_call): Replace declaration with a series of overloads.
Remove the parameter count argument.
(emit_library_call_value): Likewise.
* calls.c (emit_library_call_value_1): Make global. Replace varargs
with an "rtx_mode_t *".
(emit_library_call_value): Delete.
(emit_library_call): Likewise.
* asan.c (asan_emit_stack_protection): Update calls accordingly.
(asan_emit_allocas_unpoison): Likewise.
* builtins.c (expand_builtin_powi): Likewise.
(expand_asan_emit_allocas_unpoison): Likewise.
* cfgexpand.c (expand_main_function): Likewise.
* config/aarch64/aarch64.c (aarch64_trampoline_init): Likewise.
* config/aarch64/aarch64.h (PROFILE_HOOK): Likewise.
* config/alpha/alpha.c (alpha_trampoline_init): Likewise.
* config/arm/arm.c (arm_trampoline_init): Likewise.
(arm_call_tls_get_addr): Likewise.
(arm_expand_divmod_libfunc): Likewise.
* config/bfin/bfin.md (umulsi3_highpart): Likewise.
(smulsi3_highpart): Likewise.
* config/c6x/c6x.c (c6x_initialize_trampoline): Likewise.
(c6x_expand_compare): Likewise.
(c6x_expand_movmem): Likewise.
* config/frv/frv.c (frv_trampoline_init): Likewise.
* config/i386/i386.c (ix86_trampoline_init): Likewise.
(ix86_expand_divmod_libfunc): Likewise.
* config/ia64/ia64.c (ia64_expand_tls_address): Likewise.
(ia64_expand_compare): Likewise.
(ia64_profile_hook): Likewise.
* config/ia64/ia64.md (save_stack_nonlocal): Likewise.
(nonlocal_goto): Likewise.
(restore_stack_nonlocal): Likewise.
* config/m32r/m32r.c (block_move_call): Likewise.
(m32r_trampoline_init): Likewise.
* config/m68k/linux.h (FINALIZE_TRAMPOLINE): Likewise.
* config/m68k/m68k.c (m68k_call_tls_get_addr): Likewise.
(m68k_call_m68k_read_tp): Likewise.
* config/microblaze/microblaze.c (microblaze_call_tls_get_addr)
(microblaze_expand_divide): Likewise.
* config/mips/mips.h (mips_args): Likewise.
* config/mips/sdemtk.h (mips_sync_icache): Likewise.
(MIPS_ICACHE_SYNC): Likewise.
* config/nios2/nios2.c (nios2_emit_expensive_div): Likewise.
(nios2_trampoline_init): Likewise.
* config/pa/pa.c (hppa_tls_call): Likewise.
(pa_trampoline_init): Likewise.
* config/pa/pa.md (canonicalize_funcptr_for_compare): Likewise.
* config/powerpcspe/powerpcspe.c (rs6000_legitimize_tls_address)
(expand_strn_compare): Likewise.
(rs6000_generate_compare): Likewise.
(rs6000_expand_float128_convert): Likewise.
(output_profile_hook): Likewise.
(rs6000_trampoline_init): Likewise.
* config/powerpcspe/powerpcspe.md (neg<mode>2): Likewise.
* config/riscv/riscv.h (PROFILE_HOOK): Likewise.
* config/rs6000/rs6000-string.c (expand_strn_compare): Likewise.
* config/rs6000/rs6000.c (rs6000_legitimize_tls_address): Likewise.
(rs6000_generate_compare): Likewise.
(rs6000_expand_float128_convert): Likewise.
(output_profile_hook): Likewise.
(rs6000_trampoline_init): Likewise.
* config/rs6000/rs6000.md (neg<mode>2): Likewise.
* config/sh/sh.c (sh_trampoline_init): Likewise.
* config/sparc/sparc.c (emit_soft_tfmode_libcall): Likewise.
(sparc_emit_float_lib_cmp): Likewise.
(sparc32_initialize_trampoline): Likewise.
(sparc64_initialize_trampoline): Likewise.
(sparc_profile_hook): Likewise.
* config/spu/spu.c (ea_load_store): Likewise.
* config/spu/spu.md (floatunssidf2): Likewise.
* config/tilegx/tilegx.c (tilegx_trampoline_init): Likewise.
* config/tilepro/tilepro.c (tilepro_trampoline_init): Likewise.
* config/visium/visium.c (expand_block_move_4): Likewise.
(expand_block_move_2): Likewise.
(expand_block_move_1): Likewise.
(expand_block_set_4): Likewise.
(expand_block_set_2): Likewise.
(expand_block_set_1): Likewise.
(visium_trampoline_init): Likewise.
(visium_profile_hook): Likewise.
* config/xtensa/xtensa.c (xtensa_expand_nonlocal_goto): Likewise.
(xtensa_setup_frame_addresses): Likewise.
(xtensa_trampoline_init): Likewise.
* except.c (sjlj_emit_function_enter): Likewise.
(sjlj_emit_function_exit): Likewise.
* explow.c (allocate_dynamic_stack_space): Likewise.
(probe_stack_range): Likewise.
* expr.c (convert_mode_scalar): Likewise.
* optabs.c (expand_binop): Likewise.
(expand_twoval_binop_libfunc): Likewise.
(expand_unop): Likewise.
(prepare_cmp_insn): Likewise.
(prepare_float_lib_cmp): Likewise.
(expand_float): Likewise.
(expand_fix): Likewise.
(expand_fixed_convert): Likewise.
(maybe_emit_sync_lock_test_and_set): Likewise.
(expand_atomic_compare_and_swap): Likewise.
(expand_mem_thread_fence): Likewise.
(expand_atomic_fetch_op): Likewise.
2017-09-03 Gerald Pfeifer <gerald@pfeifer.com>
* doc/generic.texi (OpenACC): Adjust URL.

View File

@ -1347,7 +1347,7 @@ asan_emit_stack_protection (rtx base, rtx pbase, unsigned int alignb,
snprintf (buf, sizeof buf, "__asan_stack_malloc_%d",
use_after_return_class);
ret = init_one_libfunc (buf);
ret = emit_library_call_value (ret, NULL_RTX, LCT_NORMAL, ptr_mode, 1,
ret = emit_library_call_value (ret, NULL_RTX, LCT_NORMAL, ptr_mode,
GEN_INT (asan_frame_size
+ base_align_bias),
TYPE_MODE (pointer_sized_int_node));
@ -1477,7 +1477,7 @@ asan_emit_stack_protection (rtx base, rtx pbase, unsigned int alignb,
ret = init_one_libfunc (buf);
rtx addr = convert_memory_address (ptr_mode, base);
rtx orig_addr = convert_memory_address (ptr_mode, orig_base);
emit_library_call (ret, LCT_NORMAL, ptr_mode, 3, addr, ptr_mode,
emit_library_call (ret, LCT_NORMAL, ptr_mode, addr, ptr_mode,
GEN_INT (asan_frame_size + base_align_bias),
TYPE_MODE (pointer_sized_int_node),
orig_addr, ptr_mode);
@ -1573,8 +1573,8 @@ asan_emit_allocas_unpoison (rtx top, rtx bot, rtx_insn *before)
rtx ret = init_one_libfunc ("__asan_allocas_unpoison");
top = convert_memory_address (ptr_mode, top);
bot = convert_memory_address (ptr_mode, bot);
ret = emit_library_call_value (ret, NULL_RTX, LCT_NORMAL, ptr_mode, 2, top,
ptr_mode, bot, ptr_mode);
ret = emit_library_call_value (ret, NULL_RTX, LCT_NORMAL, ptr_mode,
top, ptr_mode, bot, ptr_mode);
do_pending_stack_adjust ();
rtx_insn *insns = get_insns ();

View File

@ -2768,7 +2768,7 @@ expand_builtin_powi (tree exp, rtx target)
op1 = convert_to_mode (mode2, op1, 0);
target = emit_library_call_value (optab_libfunc (powi_optab, mode),
target, LCT_CONST, mode, 2,
target, LCT_CONST, mode,
op0, mode, op1, mode2);
return target;
@ -4909,8 +4909,8 @@ expand_asan_emit_allocas_unpoison (tree exp)
rtx top = expand_expr (arg0, NULL_RTX, ptr_mode, EXPAND_NORMAL);
rtx bot = convert_memory_address (ptr_mode, virtual_stack_dynamic_rtx);
rtx ret = init_one_libfunc ("__asan_allocas_unpoison");
ret = emit_library_call_value (ret, NULL_RTX, LCT_NORMAL, ptr_mode, 2, top,
ptr_mode, bot, ptr_mode);
ret = emit_library_call_value (ret, NULL_RTX, LCT_NORMAL, ptr_mode,
top, ptr_mode, bot, ptr_mode);
return ret;
}

View File

@ -164,8 +164,6 @@ static void compute_argument_addresses (struct arg_data *, rtx, int);
static rtx rtx_for_function_call (tree, tree);
static void load_register_parameters (struct arg_data *, int, rtx *, int,
int, int *);
static rtx emit_library_call_value_1 (int, rtx, rtx, enum libcall_type,
machine_mode, int, va_list);
static int special_function_p (const_tree, int);
static int check_sibcall_argument_overlap_1 (rtx);
static int check_sibcall_argument_overlap (rtx_insn *, struct arg_data *, int);
@ -4364,14 +4362,21 @@ split_complex_types (tree types)
return types;
}
/* Output a library call to function FUN (a SYMBOL_REF rtx).
The RETVAL parameter specifies whether return value needs to be saved, other
parameters are documented in the emit_library_call function below. */
/* Output a library call to function ORGFUN (a SYMBOL_REF rtx)
for a value of mode OUTMODE,
with NARGS different arguments, passed as ARGS.
Store the return value if RETVAL is nonzero: store it in VALUE if
VALUE is nonnull, otherwise pick a convenient location. In either
case return the location of the stored value.
static rtx
FN_TYPE should be LCT_NORMAL for `normal' calls, LCT_CONST for
`const' calls, LCT_PURE for `pure' calls, or another LCT_ value for
other types of library calls. */
rtx
emit_library_call_value_1 (int retval, rtx orgfun, rtx value,
enum libcall_type fn_type,
machine_mode outmode, int nargs, va_list p)
machine_mode outmode, int nargs, rtx_mode_t *args)
{
/* Total size in bytes of all the stack-parms scanned so far. */
struct args_size args_size;
@ -4553,10 +4558,10 @@ emit_library_call_value_1 (int retval, rtx orgfun, rtx value,
count++;
}
for (; count < nargs; count++)
for (unsigned int i = 0; count < nargs; i++, count++)
{
rtx val = va_arg (p, rtx);
machine_mode mode = (machine_mode) va_arg (p, int);
rtx val = args[i].first;
machine_mode mode = args[i].second;
int unsigned_p = 0;
/* We cannot convert the arg value to the mode the library wants here;
@ -5128,51 +5133,6 @@ emit_library_call_value_1 (int retval, rtx orgfun, rtx value,
}
/* Output a library call to function FUN (a SYMBOL_REF rtx)
(emitting the queue unless NO_QUEUE is nonzero),
for a value of mode OUTMODE,
with NARGS different arguments, passed as alternating rtx values
and machine_modes to convert them to.
FN_TYPE should be LCT_NORMAL for `normal' calls, LCT_CONST for
`const' calls, LCT_PURE for `pure' calls, or other LCT_ value for
other types of library calls. */
void
emit_library_call (rtx orgfun, enum libcall_type fn_type,
machine_mode outmode, int nargs, ...)
{
va_list p;
va_start (p, nargs);
emit_library_call_value_1 (0, orgfun, NULL_RTX, fn_type, outmode, nargs, p);
va_end (p);
}
/* Like emit_library_call except that an extra argument, VALUE,
comes second and says where to store the result.
(If VALUE is zero, this function chooses a convenient way
to return the value.
This function returns an rtx for where the value is to be found.
If VALUE is nonzero, VALUE is returned. */
rtx
emit_library_call_value (rtx orgfun, rtx value,
enum libcall_type fn_type,
machine_mode outmode, int nargs, ...)
{
rtx result;
va_list p;
va_start (p, nargs);
result = emit_library_call_value_1 (1, orgfun, value, fn_type, outmode,
nargs, p);
va_end (p);
return result;
}
/* Store pointer bounds argument ARG into Bounds Table entry
associated with PARM. */

View File

@ -6079,7 +6079,7 @@ expand_main_function (void)
|| (!defined(HAS_INIT_SECTION) \
&& !defined(INIT_SECTION_ASM_OP) \
&& !defined(INIT_ARRAY_SECTION_ASM_OP)))
emit_library_call (init_one_libfunc (NAME__MAIN), LCT_NORMAL, VOIDmode, 0);
emit_library_call (init_one_libfunc (NAME__MAIN), LCT_NORMAL, VOIDmode);
#endif
}

View File

@ -5977,7 +5977,7 @@ aarch64_trampoline_init (rtx m_tramp, tree fndecl, rtx chain_value)
gen_clear_cache(). */
a_tramp = XEXP (m_tramp, 0);
emit_library_call (gen_rtx_SYMBOL_REF (Pmode, "__clear_cache"),
LCT_NORMAL, VOIDmode, 2, a_tramp, ptr_mode,
LCT_NORMAL, VOIDmode, a_tramp, ptr_mode,
plus_constant (ptr_mode, a_tramp, TRAMPOLINE_SIZE),
ptr_mode);
}

View File

@ -857,7 +857,7 @@ typedef struct
rtx fun, lr; \
lr = get_hard_reg_initial_val (Pmode, LR_REGNUM); \
fun = gen_rtx_SYMBOL_REF (Pmode, MCOUNT_NAME); \
emit_library_call (fun, LCT_NORMAL, VOIDmode, 1, lr, Pmode); \
emit_library_call (fun, LCT_NORMAL, VOIDmode, lr, Pmode); \
}
/* All the work done in PROFILE_HOOK, but still required. */

View File

@ -5562,7 +5562,7 @@ alpha_trampoline_init (rtx m_tramp, tree fndecl, rtx chain_value)
emit_insn (gen_imb ());
#ifdef HAVE_ENABLE_EXECUTE_STACK
emit_library_call (init_one_libfunc ("__enable_execute_stack"),
LCT_NORMAL, VOIDmode, 1, XEXP (m_tramp, 0), Pmode);
LCT_NORMAL, VOIDmode, XEXP (m_tramp, 0), Pmode);
#endif
}
}

View File

@ -3888,7 +3888,7 @@ arm_trampoline_init (rtx m_tramp, tree fndecl, rtx chain_value)
a_tramp = XEXP (m_tramp, 0);
emit_library_call (gen_rtx_SYMBOL_REF (Pmode, "__clear_cache"),
LCT_NORMAL, VOIDmode, 2, a_tramp, Pmode,
LCT_NORMAL, VOIDmode, a_tramp, Pmode,
plus_constant (Pmode, a_tramp, TRAMPOLINE_SIZE), Pmode);
}
@ -8364,7 +8364,7 @@ arm_call_tls_get_addr (rtx x, rtx reg, rtx *valuep, int reloc)
*valuep = emit_library_call_value (get_tls_get_addr (), NULL_RTX,
LCT_PURE, /* LCT_CONST? */
Pmode, 1, reg, Pmode);
Pmode, reg, Pmode);
rtx_insn *insns = get_insns ();
end_sequence ();
@ -31101,7 +31101,7 @@ arm_expand_divmod_libfunc (rtx libfunc, machine_mode mode,
= smallest_int_mode_for_size (2 * GET_MODE_BITSIZE (mode));
rtx libval = emit_library_call_value (libfunc, NULL_RTX, LCT_CONST,
libval_mode, 2,
libval_mode,
op0, GET_MODE (op0),
op1, GET_MODE (op1));

View File

@ -1578,7 +1578,7 @@
emit_library_call_value (umulsi3_highpart_libfunc,
operands[0], LCT_NORMAL, SImode,
2, operands[1], SImode, operands[2], SImode);
operands[1], SImode, operands[2], SImode);
}
DONE;
})
@ -1628,7 +1628,7 @@
emit_library_call_value (smulsi3_highpart_libfunc,
operands[0], LCT_NORMAL, SImode,
2, operands[1], SImode, operands[2], SImode);
operands[1], SImode, operands[2], SImode);
}
DONE;
})

View File

@ -739,9 +739,8 @@ c6x_initialize_trampoline (rtx tramp, tree fndecl, rtx cxt)
#ifdef CLEAR_INSN_CACHE
tramp = XEXP (tramp, 0);
emit_library_call (gen_rtx_SYMBOL_REF (Pmode, "__gnu_clear_cache"),
LCT_NORMAL, VOIDmode, 2, tramp, Pmode,
plus_constant (Pmode, tramp, TRAMPOLINE_SIZE),
Pmode);
LCT_NORMAL, VOIDmode, tramp, Pmode,
plus_constant (Pmode, tramp, TRAMPOLINE_SIZE), Pmode);
#endif
}
@ -1592,7 +1591,7 @@ c6x_expand_compare (rtx comparison, machine_mode mode)
}
start_sequence ();
cmp = emit_library_call_value (libfunc, 0, LCT_CONST, SImode, 2,
cmp = emit_library_call_value (libfunc, 0, LCT_CONST, SImode,
op0, op_mode, op1, op_mode);
insns = get_insns ();
end_sequence ();
@ -1728,7 +1727,7 @@ c6x_expand_movmem (rtx dst, rtx src, rtx count_exp, rtx align_exp,
mark_addressable (src_expr);
if (dst_expr)
mark_addressable (dst_expr);
emit_library_call (fn, LCT_NORMAL, VOIDmode, 3,
emit_library_call (fn, LCT_NORMAL, VOIDmode,
dstreg, Pmode, srcreg, Pmode, count_exp, SImode);
return true;
}

View File

@ -6241,7 +6241,7 @@ frv_trampoline_init (rtx m_tramp, tree fndecl, rtx static_chain)
rtx sc_reg = force_reg (Pmode, static_chain);
emit_library_call (gen_rtx_SYMBOL_REF (SImode, "__trampoline_setup"),
LCT_NORMAL, VOIDmode, 4,
LCT_NORMAL, VOIDmode,
addr, Pmode,
GEN_INT (frv_trampoline_size ()), SImode,
fnaddr, Pmode,

View File

@ -31824,7 +31824,7 @@ ix86_trampoline_init (rtx m_tramp, tree fndecl, rtx chain_value)
if (CHECK_EXECUTE_STACK_ENABLED)
#endif
emit_library_call (gen_rtx_SYMBOL_REF (Pmode, "__enable_execute_stack"),
LCT_NORMAL, VOIDmode, 1, XEXP (m_tramp, 0), Pmode);
LCT_NORMAL, VOIDmode, XEXP (m_tramp, 0), Pmode);
#endif
}
@ -52432,10 +52432,10 @@ ix86_expand_divmod_libfunc (rtx libfunc, machine_mode mode,
rtx rem = assign_386_stack_local (mode, SLOT_TEMP);
rtx quot = emit_library_call_value (libfunc, NULL_RTX, LCT_NORMAL,
mode, 3,
op0, GET_MODE (op0),
op1, GET_MODE (op1),
XEXP (rem, 0), Pmode);
mode,
op0, GET_MODE (op0),
op1, GET_MODE (op1),
XEXP (rem, 0), Pmode);
*quot_p = quot;
*rem_p = rem;
}

View File

@ -1202,8 +1202,8 @@ ia64_expand_tls_address (enum tls_model tls_kind, rtx op0, rtx op1,
emit_insn (gen_load_dtprel (tga_op2, op1));
tga_ret = emit_library_call_value (gen_tls_get_addr (), NULL_RTX,
LCT_CONST, Pmode, 2, tga_op1,
Pmode, tga_op2, Pmode);
LCT_CONST, Pmode,
tga_op1, Pmode, tga_op2, Pmode);
insns = get_insns ();
end_sequence ();
@ -1226,8 +1226,8 @@ ia64_expand_tls_address (enum tls_model tls_kind, rtx op0, rtx op1,
tga_op2 = const0_rtx;
tga_ret = emit_library_call_value (gen_tls_get_addr (), NULL_RTX,
LCT_CONST, Pmode, 2, tga_op1,
Pmode, tga_op2, Pmode);
LCT_CONST, Pmode,
tga_op1, Pmode, tga_op2, Pmode);
insns = get_insns ();
end_sequence ();
@ -1836,7 +1836,7 @@ ia64_expand_compare (rtx *expr, rtx *op0, rtx *op1)
start_sequence ();
ret = emit_library_call_value (cmptf_libfunc, 0, LCT_CONST, DImode, 3,
ret = emit_library_call_value (cmptf_libfunc, 0, LCT_CONST, DImode,
*op0, TFmode, *op1, TFmode,
GEN_INT (magic), DImode);
cmp = gen_reg_rtx (BImode);
@ -11101,7 +11101,7 @@ ia64_profile_hook (int labelno)
ip = gen_reg_rtx (Pmode);
emit_insn (gen_ip_value (ip));
emit_library_call (gen_mcount_func_rtx (), LCT_NORMAL,
VOIDmode, 3,
VOIDmode,
gen_rtx_REG (Pmode, BR_REG (0)), Pmode,
ip, Pmode,
label, Pmode);

View File

@ -5056,7 +5056,7 @@
{
emit_library_call (gen_rtx_SYMBOL_REF (Pmode,
\"__ia64_save_stack_nonlocal\"),
LCT_NORMAL, VOIDmode, 2, XEXP (operands[0], 0), Pmode,
LCT_NORMAL, VOIDmode, XEXP (operands[0], 0), Pmode,
operands[1], Pmode);
DONE;
})
@ -5069,7 +5069,7 @@
""
{
emit_library_call (gen_rtx_SYMBOL_REF (Pmode, \"__ia64_nonlocal_goto\"),
LCT_NORETURN, VOIDmode, 3,
LCT_NORETURN, VOIDmode,
operands[1], Pmode,
copy_to_reg (XEXP (operands[2], 0)), Pmode,
operands[3], Pmode);
@ -5134,7 +5134,7 @@
{
emit_library_call (gen_rtx_SYMBOL_REF (Pmode,
"__ia64_restore_stack_nonlocal"),
LCT_NORMAL, VOIDmode, 1,
LCT_NORMAL, VOIDmode,
copy_to_reg (XEXP (operands[1], 0)), Pmode);
DONE;
})

View File

@ -2493,7 +2493,7 @@ block_move_call (rtx dest_reg, rtx src_reg, rtx bytes_rtx)
bytes_rtx = convert_to_mode (Pmode, bytes_rtx, 1);
emit_library_call (m32r_function_symbol ("memcpy"), LCT_NORMAL,
VOIDmode, 3, dest_reg, Pmode, src_reg, Pmode,
VOIDmode, dest_reg, Pmode, src_reg, Pmode,
convert_to_mode (TYPE_MODE (sizetype), bytes_rtx,
TYPE_UNSIGNED (sizetype)),
TYPE_MODE (sizetype));
@ -2796,7 +2796,7 @@ m32r_trampoline_init (rtx m_tramp, tree fndecl, rtx chain_value)
gen_int_mode (m32r_cache_flush_trap, SImode)));
else if (m32r_cache_flush_func && m32r_cache_flush_func[0])
emit_library_call (m32r_function_symbol (m32r_cache_flush_func),
LCT_NORMAL, VOIDmode, 3, XEXP (m_tramp, 0), Pmode,
LCT_NORMAL, VOIDmode, XEXP (m_tramp, 0), Pmode,
gen_int_mode (TRAMPOLINE_SIZE, SImode), SImode,
GEN_INT (3), SImode);
}

View File

@ -192,8 +192,8 @@ along with GCC; see the file COPYING3. If not see
#undef FINALIZE_TRAMPOLINE
#define FINALIZE_TRAMPOLINE(TRAMP) \
emit_library_call (gen_rtx_SYMBOL_REF (Pmode, "__clear_cache"), \
LCT_NORMAL, VOIDmode, 2, TRAMP, Pmode, \
plus_constant (Pmode, TRAMP, TRAMPOLINE_SIZE), \
LCT_NORMAL, VOIDmode, TRAMP, Pmode, \
plus_constant (Pmode, TRAMP, TRAMPOLINE_SIZE), \
Pmode);
/* Clear the instruction cache from `beg' to `end'. This makes an

View File

@ -2540,7 +2540,7 @@ m68k_call_tls_get_addr (rtx x, rtx eqv, enum m68k_reloc reloc)
m68k_libcall_value_in_a0_p = true;
a0 = emit_library_call_value (m68k_get_tls_get_addr (), NULL_RTX, LCT_PURE,
Pmode, 1, x, Pmode);
Pmode, x, Pmode);
m68k_libcall_value_in_a0_p = false;
insns = get_insns ();
@ -2589,7 +2589,7 @@ m68k_call_m68k_read_tp (void)
/* Emit the call sequence. */
m68k_libcall_value_in_a0_p = true;
a0 = emit_library_call_value (m68k_get_m68k_read_tp (), NULL_RTX, LCT_PURE,
Pmode, 0);
Pmode);
m68k_libcall_value_in_a0_p = false;
insns = get_insns ();
end_sequence ();

View File

@ -585,7 +585,7 @@ microblaze_call_tls_get_addr (rtx x, rtx reg, rtx *valuep, int reloc)
*valuep = emit_library_call_value (get_tls_get_addr (), NULL_RTX,
LCT_PURE, /* LCT_CONST? */
Pmode, 1, reg, Pmode);
Pmode, reg, Pmode);
insns = get_insns ();
end_sequence ();
@ -3560,10 +3560,10 @@ microblaze_expand_divide (rtx operands[])
emit_label (div_label);
ret = emit_library_call_value (gen_rtx_SYMBOL_REF (Pmode, "__divsi3"),
operands[0], LCT_NORMAL,
GET_MODE (operands[0]), 2, operands[1],
GET_MODE (operands[1]), operands[2],
GET_MODE (operands[2]));
operands[0], LCT_NORMAL,
GET_MODE (operands[0]),
operands[1], GET_MODE (operands[1]),
operands[2], GET_MODE (operands[2]));
if (ret != operands[0])
emit_move_insn (operands[0], ret);

View File

@ -2603,7 +2603,7 @@ typedef struct mips_args {
/* Flush both caches. We need to flush the data cache in case \
the system has a write-back cache. */ \
emit_library_call (gen_rtx_SYMBOL_REF (Pmode, mips_cache_flush_func), \
LCT_NORMAL, VOIDmode, 3, ADDR, Pmode, SIZE, Pmode, \
LCT_NORMAL, VOIDmode, ADDR, Pmode, SIZE, Pmode, \
GEN_INT (3), TYPE_MODE (integer_type_node))

View File

@ -70,7 +70,7 @@ extern void mips_sync_icache (void *beg, unsigned long len);
#undef MIPS_ICACHE_SYNC
#define MIPS_ICACHE_SYNC(ADDR, SIZE) \
emit_library_call (gen_rtx_SYMBOL_REF (Pmode, mips_cache_flush_func), \
LCT_NORMAL, VOIDmode, 2, ADDR, Pmode, \
LCT_NORMAL, VOIDmode, ADDR, Pmode, \
SIZE, TYPE_MODE (sizetype))
/* This version of _mcount does not pop 2 words from the stack. */

View File

@ -1734,7 +1734,7 @@ nios2_emit_expensive_div (rtx *operands, machine_mode mode)
start_sequence ();
final_result = emit_library_call_value (libfunc, NULL_RTX,
LCT_CONST, SImode, 2,
LCT_CONST, SImode,
operands[1], SImode,
operands[2], SImode);
@ -3025,7 +3025,7 @@ nios2_trampoline_init (rtx m_tramp, tree fndecl, rtx cxt)
rtx addr = force_reg (Pmode, XEXP (m_tramp, 0));
emit_library_call (gen_rtx_SYMBOL_REF (Pmode, "__trampoline_setup"),
LCT_NORMAL, VOIDmode, 3, addr, Pmode, fnaddr, Pmode,
LCT_NORMAL, VOIDmode, addr, Pmode, fnaddr, Pmode,
ctx_reg, Pmode);
}

View File

@ -906,7 +906,7 @@ hppa_tls_call (rtx arg)
ret = gen_reg_rtx (Pmode);
emit_library_call_value (gen_tls_get_addr (), ret,
LCT_CONST, Pmode, 1, arg, Pmode);
LCT_CONST, Pmode, arg, Pmode);
return ret;
}
@ -10192,7 +10192,7 @@ pa_trampoline_init (rtx m_tramp, tree fndecl, rtx chain_value)
#ifdef HAVE_ENABLE_EXECUTE_STACK
 emit_library_call (gen_rtx_SYMBOL_REF (Pmode, "__enable_execute_stack"),
     LCT_NORMAL, VOIDmode, 1, XEXP (m_tramp, 0), Pmode);
LCT_NORMAL, VOIDmode, XEXP (m_tramp, 0), Pmode);
#endif
}

View File

@ -9637,7 +9637,7 @@ add,l %2,%3,%3\;bv,n %%r0(%3)"
emit_library_call_value (canonicalize_funcptr_for_compare_libfunc,
operands[0], LCT_NORMAL, Pmode,
1, operands[1], Pmode);
operands[1], Pmode);
DONE;
}

View File

@ -9694,7 +9694,7 @@ rs6000_legitimize_tls_address (rtx addr, enum tls_model model)
{
tga = rs6000_tls_get_addr ();
emit_library_call_value (tga, dest, LCT_CONST, Pmode,
1, const0_rtx, Pmode);
const0_rtx, Pmode);
r3 = gen_rtx_REG (Pmode, 3);
if (DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_ELFv2)
@ -9719,7 +9719,7 @@ rs6000_legitimize_tls_address (rtx addr, enum tls_model model)
tga = rs6000_tls_get_addr ();
tmp1 = gen_reg_rtx (Pmode);
emit_library_call_value (tga, tmp1, LCT_CONST, Pmode,
1, const0_rtx, Pmode);
const0_rtx, Pmode);
r3 = gen_rtx_REG (Pmode, 3);
if (DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_ELFv2)
@ -20417,7 +20417,7 @@ expand_strn_compare (rtx operands[], int no_length)
{
tree fun = builtin_decl_explicit (BUILT_IN_STRCMP);
emit_library_call_value (XEXP (DECL_RTL (fun), 0),
target, LCT_NORMAL, GET_MODE (target), 2,
target, LCT_NORMAL, GET_MODE (target),
force_reg (Pmode, XEXP (src1, 0)), Pmode,
force_reg (Pmode, XEXP (src2, 0)), Pmode);
}
@ -20436,7 +20436,7 @@ expand_strn_compare (rtx operands[], int no_length)
tree fun = builtin_decl_explicit (BUILT_IN_STRNCMP);
emit_library_call_value (XEXP (DECL_RTL (fun), 0),
target, LCT_NORMAL, GET_MODE (target), 3,
target, LCT_NORMAL, GET_MODE (target),
force_reg (Pmode, XEXP (src1, 0)), Pmode,
force_reg (Pmode, XEXP (src2, 0)), Pmode,
len_rtx, GET_MODE (len_rtx));
@ -20683,7 +20683,7 @@ expand_strn_compare (rtx operands[], int no_length)
{
tree fun = builtin_decl_explicit (BUILT_IN_STRCMP);
emit_library_call_value (XEXP (DECL_RTL (fun), 0),
target, LCT_NORMAL, GET_MODE (target), 2,
target, LCT_NORMAL, GET_MODE (target),
force_reg (Pmode, XEXP (src1, 0)), Pmode,
force_reg (Pmode, XEXP (src2, 0)), Pmode);
}
@ -20698,7 +20698,7 @@ expand_strn_compare (rtx operands[], int no_length)
emit_move_insn (len_rtx, GEN_INT (bytes - compare_length));
tree fun = builtin_decl_explicit (BUILT_IN_STRNCMP);
emit_library_call_value (XEXP (DECL_RTL (fun), 0),
target, LCT_NORMAL, GET_MODE (target), 3,
target, LCT_NORMAL, GET_MODE (target),
force_reg (Pmode, XEXP (src1, 0)), Pmode,
force_reg (Pmode, XEXP (src2, 0)), Pmode,
len_rtx, GET_MODE (len_rtx));
@ -24720,7 +24720,7 @@ rs6000_generate_compare (rtx cmp, machine_mode mode)
if (!check_nan)
dest = emit_library_call_value (libfunc, NULL_RTX, LCT_CONST,
SImode, 2, op0, mode, op1, mode);
SImode, op0, mode, op1, mode);
/* The library signals an exception for signalling NaNs, so we need to
handle isgreater, etc. by first checking isordered. */
@ -24736,8 +24736,7 @@ rs6000_generate_compare (rtx cmp, machine_mode mode)
/* Test for either value being a NaN. */
gcc_assert (unord_func);
unord_dest = emit_library_call_value (unord_func, NULL_RTX, LCT_CONST,
SImode, 2, op0, mode, op1,
mode);
SImode, op0, mode, op1, mode);
/* Set value (0) if either value is a NaN, and jump to the join
label. */
@ -24756,8 +24755,7 @@ rs6000_generate_compare (rtx cmp, machine_mode mode)
/* Do the normal comparison, knowing that the values are not
NaNs. */
normal_dest = emit_library_call_value (libfunc, NULL_RTX, LCT_CONST,
SImode, 2, op0, mode, op1,
mode);
SImode, op0, mode, op1, mode);
emit_insn (gen_cstoresi4 (dest,
gen_rtx_fmt_ee (code, SImode, normal_dest,
@ -25121,8 +25119,8 @@ rs6000_expand_float128_convert (rtx dest, rtx src, bool unsigned_p)
libfunc = convert_optab_libfunc (cvt, dest_mode, src_mode);
gcc_assert (libfunc != NULL_RTX);
dest2 = emit_library_call_value (libfunc, dest, LCT_CONST, dest_mode, 1, src,
src_mode);
dest2 = emit_library_call_value (libfunc, dest, LCT_CONST, dest_mode,
src, src_mode);
gcc_assert (dest2 != NULL_RTX);
if (!rtx_equal_p (dest, dest2))
@ -33083,7 +33081,7 @@ output_profile_hook (int labelno ATTRIBUTE_UNUSED)
#endif
if (NO_PROFILE_COUNTERS)
emit_library_call (init_one_libfunc (RS6000_MCOUNT),
LCT_NORMAL, VOIDmode, 0);
LCT_NORMAL, VOIDmode);
else
{
char buf[30];
@ -33095,7 +33093,7 @@ output_profile_hook (int labelno ATTRIBUTE_UNUSED)
fun = gen_rtx_SYMBOL_REF (Pmode, label_name);
emit_library_call (init_one_libfunc (RS6000_MCOUNT),
LCT_NORMAL, VOIDmode, 1, fun, Pmode);
LCT_NORMAL, VOIDmode, fun, Pmode);
}
}
else if (DEFAULT_ABI == ABI_DARWIN)
@ -33114,7 +33112,7 @@ output_profile_hook (int labelno ATTRIBUTE_UNUSED)
caller_addr_regno = 0;
#endif
emit_library_call (gen_rtx_SYMBOL_REF (Pmode, mcount_name),
LCT_NORMAL, VOIDmode, 1,
LCT_NORMAL, VOIDmode,
gen_rtx_REG (Pmode, caller_addr_regno), Pmode);
}
}
@ -35464,7 +35462,7 @@ rs6000_trampoline_init (rtx m_tramp, tree fndecl, rtx cxt)
case ABI_DARWIN:
case ABI_V4:
emit_library_call (gen_rtx_SYMBOL_REF (Pmode, "__trampoline_setup"),
LCT_NORMAL, VOIDmode, 4,
LCT_NORMAL, VOIDmode,
addr, Pmode,
GEN_INT (rs6000_trampoline_size ()), SImode,
fnaddr, Pmode,

View File

@ -7997,7 +7997,7 @@
{
rtx libfunc = optab_libfunc (neg_optab, <MODE>mode);
rtx target = emit_library_call_value (libfunc, operands[0], LCT_CONST,
<MODE>mode, 1,
<MODE>mode,
operands[1], <MODE>mode);
if (target && !rtx_equal_p (target, operands[0]))

View File

@ -340,7 +340,7 @@ along with GCC; see the file COPYING3. If not see
rtx fun, ra; \
ra = get_hard_reg_initial_val (Pmode, RETURN_ADDR_REGNUM); \
fun = gen_rtx_SYMBOL_REF (Pmode, MCOUNT_NAME); \
emit_library_call (fun, LCT_NORMAL, VOIDmode, 1, ra, Pmode); \
emit_library_call (fun, LCT_NORMAL, VOIDmode, ra, Pmode); \
}
/* All the work done in PROFILE_HOOK, but still required. */

View File

@ -843,7 +843,7 @@ expand_strn_compare (rtx operands[], int no_length)
{
tree fun = builtin_decl_explicit (BUILT_IN_STRCMP);
emit_library_call_value (XEXP (DECL_RTL (fun), 0),
target, LCT_NORMAL, GET_MODE (target), 2,
target, LCT_NORMAL, GET_MODE (target),
force_reg (Pmode, XEXP (src1, 0)), Pmode,
force_reg (Pmode, XEXP (src2, 0)), Pmode);
}
@ -862,7 +862,7 @@ expand_strn_compare (rtx operands[], int no_length)
tree fun = builtin_decl_explicit (BUILT_IN_STRNCMP);
emit_library_call_value (XEXP (DECL_RTL (fun), 0),
target, LCT_NORMAL, GET_MODE (target), 3,
target, LCT_NORMAL, GET_MODE (target),
force_reg (Pmode, XEXP (src1, 0)), Pmode,
force_reg (Pmode, XEXP (src2, 0)), Pmode,
len_rtx, GET_MODE (len_rtx));
@ -1109,7 +1109,7 @@ expand_strn_compare (rtx operands[], int no_length)
{
tree fun = builtin_decl_explicit (BUILT_IN_STRCMP);
emit_library_call_value (XEXP (DECL_RTL (fun), 0),
target, LCT_NORMAL, GET_MODE (target), 2,
target, LCT_NORMAL, GET_MODE (target),
force_reg (Pmode, XEXP (src1, 0)), Pmode,
force_reg (Pmode, XEXP (src2, 0)), Pmode);
}
@ -1124,7 +1124,7 @@ expand_strn_compare (rtx operands[], int no_length)
emit_move_insn (len_rtx, GEN_INT (bytes - compare_length));
tree fun = builtin_decl_explicit (BUILT_IN_STRNCMP);
emit_library_call_value (XEXP (DECL_RTL (fun), 0),
target, LCT_NORMAL, GET_MODE (target), 3,
target, LCT_NORMAL, GET_MODE (target),
force_reg (Pmode, XEXP (src1, 0)), Pmode,
force_reg (Pmode, XEXP (src2, 0)), Pmode,
len_rtx, GET_MODE (len_rtx));

View File

@ -9233,7 +9233,7 @@ rs6000_legitimize_tls_address (rtx addr, enum tls_model model)
{
tga = rs6000_tls_get_addr ();
emit_library_call_value (tga, dest, LCT_CONST, Pmode,
1, const0_rtx, Pmode);
const0_rtx, Pmode);
r3 = gen_rtx_REG (Pmode, 3);
if (DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_ELFv2)
@ -9258,7 +9258,7 @@ rs6000_legitimize_tls_address (rtx addr, enum tls_model model)
tga = rs6000_tls_get_addr ();
tmp1 = gen_reg_rtx (Pmode);
emit_library_call_value (tga, tmp1, LCT_CONST, Pmode,
1, const0_rtx, Pmode);
const0_rtx, Pmode);
r3 = gen_rtx_REG (Pmode, 3);
if (DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_ELFv2)
@ -21887,7 +21887,7 @@ rs6000_generate_compare (rtx cmp, machine_mode mode)
if (!check_nan)
dest = emit_library_call_value (libfunc, NULL_RTX, LCT_CONST,
SImode, 2, op0, mode, op1, mode);
SImode, op0, mode, op1, mode);
/* The library signals an exception for signalling NaNs, so we need to
handle isgreater, etc. by first checking isordered. */
@ -21903,8 +21903,7 @@ rs6000_generate_compare (rtx cmp, machine_mode mode)
/* Test for either value being a NaN. */
gcc_assert (unord_func);
unord_dest = emit_library_call_value (unord_func, NULL_RTX, LCT_CONST,
SImode, 2, op0, mode, op1,
mode);
SImode, op0, mode, op1, mode);
/* Set value (0) if either value is a NaN, and jump to the join
label. */
@ -21923,8 +21922,7 @@ rs6000_generate_compare (rtx cmp, machine_mode mode)
/* Do the normal comparison, knowing that the values are not
NaNs. */
normal_dest = emit_library_call_value (libfunc, NULL_RTX, LCT_CONST,
SImode, 2, op0, mode, op1,
mode);
SImode, op0, mode, op1, mode);
emit_insn (gen_cstoresi4 (dest,
gen_rtx_fmt_ee (code, SImode, normal_dest,
@ -22287,8 +22285,8 @@ rs6000_expand_float128_convert (rtx dest, rtx src, bool unsigned_p)
libfunc = convert_optab_libfunc (cvt, dest_mode, src_mode);
gcc_assert (libfunc != NULL_RTX);
dest2 = emit_library_call_value (libfunc, dest, LCT_CONST, dest_mode, 1, src,
src_mode);
dest2 = emit_library_call_value (libfunc, dest, LCT_CONST, dest_mode,
src, src_mode);
gcc_assert (dest2 != NULL_RTX);
if (!rtx_equal_p (dest, dest2))
@ -29928,7 +29926,7 @@ output_profile_hook (int labelno ATTRIBUTE_UNUSED)
#endif
if (NO_PROFILE_COUNTERS)
emit_library_call (init_one_libfunc (RS6000_MCOUNT),
LCT_NORMAL, VOIDmode, 0);
LCT_NORMAL, VOIDmode);
else
{
char buf[30];
@ -29940,7 +29938,7 @@ output_profile_hook (int labelno ATTRIBUTE_UNUSED)
fun = gen_rtx_SYMBOL_REF (Pmode, label_name);
emit_library_call (init_one_libfunc (RS6000_MCOUNT),
LCT_NORMAL, VOIDmode, 1, fun, Pmode);
LCT_NORMAL, VOIDmode, fun, Pmode);
}
}
else if (DEFAULT_ABI == ABI_DARWIN)
@ -29959,7 +29957,7 @@ output_profile_hook (int labelno ATTRIBUTE_UNUSED)
caller_addr_regno = 0;
#endif
emit_library_call (gen_rtx_SYMBOL_REF (Pmode, mcount_name),
LCT_NORMAL, VOIDmode, 1,
LCT_NORMAL, VOIDmode,
gen_rtx_REG (Pmode, caller_addr_regno), Pmode);
}
}
@ -32309,7 +32307,7 @@ rs6000_trampoline_init (rtx m_tramp, tree fndecl, rtx cxt)
case ABI_DARWIN:
case ABI_V4:
emit_library_call (gen_rtx_SYMBOL_REF (Pmode, "__trampoline_setup"),
LCT_NORMAL, VOIDmode, 4,
LCT_NORMAL, VOIDmode,
addr, Pmode,
GEN_INT (rs6000_trampoline_size ()), SImode,
fnaddr, Pmode,

View File

@ -7886,7 +7886,7 @@
{
rtx libfunc = optab_libfunc (neg_optab, <MODE>mode);
rtx target = emit_library_call_value (libfunc, operands[0], LCT_CONST,
<MODE>mode, 1,
<MODE>mode,
operands[1], <MODE>mode);
if (target && !rtx_equal_p (target, operands[0]))

View File

@ -10090,7 +10090,7 @@ sh_trampoline_init (rtx tramp_mem, tree fndecl, rtx cxt)
|| (!(TARGET_SH4A || TARGET_SH4_300) && TARGET_USERMODE))
emit_library_call (function_symbol (NULL, "__ic_invalidate",
FUNCTION_ORDINARY).sym,
LCT_NORMAL, VOIDmode, 1, tramp, SImode);
LCT_NORMAL, VOIDmode, tramp, SImode);
else
emit_insn (gen_ic_invalidate_line (tramp));
}

View File

@ -3399,11 +3399,11 @@ emit_soft_tfmode_libcall (const char *func_name, int nargs, rtx *operands)
if (GET_MODE (operands[0]) == TFmode)
{
if (nargs == 2)
emit_library_call (func_sym, LCT_NORMAL, VOIDmode, 2,
emit_library_call (func_sym, LCT_NORMAL, VOIDmode,
arg[0], GET_MODE (arg[0]),
arg[1], GET_MODE (arg[1]));
else
emit_library_call (func_sym, LCT_NORMAL, VOIDmode, 3,
emit_library_call (func_sym, LCT_NORMAL, VOIDmode,
arg[0], GET_MODE (arg[0]),
arg[1], GET_MODE (arg[1]),
arg[2], GET_MODE (arg[2]));
@ -3418,7 +3418,7 @@ emit_soft_tfmode_libcall (const char *func_name, int nargs, rtx *operands)
gcc_assert (nargs == 2);
ret = emit_library_call_value (func_sym, operands[0], LCT_NORMAL,
GET_MODE (operands[0]), 1,
GET_MODE (operands[0]),
arg[1], GET_MODE (arg[1]));
if (ret != operands[0])
@ -8131,7 +8131,7 @@ sparc_emit_float_lib_cmp (rtx x, rtx y, enum rtx_code comparison)
libfunc = gen_rtx_SYMBOL_REF (Pmode, qpfunc);
emit_library_call (libfunc, LCT_NORMAL,
DImode, 2,
DImode,
XEXP (slot0, 0), Pmode,
XEXP (slot1, 0), Pmode);
mode = DImode;
@ -8140,7 +8140,7 @@ sparc_emit_float_lib_cmp (rtx x, rtx y, enum rtx_code comparison)
{
libfunc = gen_rtx_SYMBOL_REF (Pmode, qpfunc);
emit_library_call (libfunc, LCT_NORMAL,
SImode, 2,
SImode,
x, TFmode, y, TFmode);
mode = SImode;
}
@ -9632,7 +9632,7 @@ sparc32_initialize_trampoline (rtx m_tramp, rtx fnaddr, rtx cxt)
the stack address is accessible. */
#ifdef HAVE_ENABLE_EXECUTE_STACK
emit_library_call (gen_rtx_SYMBOL_REF (Pmode, "__enable_execute_stack"),
LCT_NORMAL, VOIDmode, 1, XEXP (m_tramp, 0), Pmode);
LCT_NORMAL, VOIDmode, XEXP (m_tramp, 0), Pmode);
#endif
}
@ -9679,7 +9679,7 @@ sparc64_initialize_trampoline (rtx m_tramp, rtx fnaddr, rtx cxt)
the stack address is accessible. */
#ifdef HAVE_ENABLE_EXECUTE_STACK
emit_library_call (gen_rtx_SYMBOL_REF (Pmode, "__enable_execute_stack"),
LCT_NORMAL, VOIDmode, 1, XEXP (m_tramp, 0), Pmode);
LCT_NORMAL, VOIDmode, XEXP (m_tramp, 0), Pmode);
#endif
}
@ -10183,13 +10183,13 @@ sparc_profile_hook (int labelno)
fun = gen_rtx_SYMBOL_REF (Pmode, MCOUNT_FUNCTION);
if (NO_PROFILE_COUNTERS)
{
emit_library_call (fun, LCT_NORMAL, VOIDmode, 0);
emit_library_call (fun, LCT_NORMAL, VOIDmode);
}
else
{
ASM_GENERATE_INTERNAL_LABEL (buf, "LP", labelno);
lab = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
emit_library_call (fun, LCT_NORMAL, VOIDmode, 1, lab, Pmode);
emit_library_call (fun, LCT_NORMAL, VOIDmode, lab, Pmode);
}
}

View File

@ -4201,14 +4201,14 @@ ea_load_store (rtx mem, bool is_store, rtx ea_addr, rtx data_addr)
if (!cache_fetch_dirty)
cache_fetch_dirty = init_one_libfunc ("__cache_fetch_dirty");
emit_library_call_value (cache_fetch_dirty, data_addr, LCT_NORMAL, Pmode,
2, ea_addr, EAmode, ndirty, SImode);
ea_addr, EAmode, ndirty, SImode);
}
else
{
if (!cache_fetch)
cache_fetch = init_one_libfunc ("__cache_fetch");
emit_library_call_value (cache_fetch, data_addr, LCT_NORMAL, Pmode,
1, ea_addr, EAmode);
ea_addr, EAmode);
}
}

View File

@ -864,9 +864,10 @@
{
start_sequence ();
value =
emit_library_call_value (convert_optab_libfunc (ufloat_optab,
DFmode, SImode),
NULL_RTX, LCT_NORMAL, DFmode, 1, operands[1], SImode);
emit_library_call_value (convert_optab_libfunc (ufloat_optab,
DFmode, SImode),
NULL_RTX, LCT_NORMAL, DFmode,
operands[1], SImode);
rtx_insn *insns = get_insns ();
end_sequence ();
emit_libcall_block (insns, operands[0], value,
@ -959,7 +960,8 @@
value =
emit_library_call_value (convert_optab_libfunc (ufloat_optab,
DFmode, DImode),
NULL_RTX, LCT_NORMAL, DFmode, 1, operands[1], DImode);
NULL_RTX, LCT_NORMAL, DFmode,
operands[1], DImode);
rtx_insn *insns = get_insns ();
end_sequence ();
emit_libcall_block (insns, operands[0], value,

View File

@ -5063,7 +5063,7 @@ tilegx_trampoline_init (rtx m_tramp, tree fndecl, rtx static_chain)
TRAMPOLINE_SIZE));
emit_library_call (gen_rtx_SYMBOL_REF (Pmode, "__clear_cache"),
LCT_NORMAL, VOIDmode, 2, begin_addr, Pmode,
LCT_NORMAL, VOIDmode, begin_addr, Pmode,
end_addr, Pmode);
}

View File

@ -4472,7 +4472,7 @@ tilepro_trampoline_init (rtx m_tramp, tree fndecl, rtx static_chain)
TRAMPOLINE_SIZE));
emit_library_call (gen_rtx_SYMBOL_REF (Pmode, "__clear_cache"),
LCT_NORMAL, VOIDmode, 2, begin_addr, Pmode,
LCT_NORMAL, VOIDmode, begin_addr, Pmode,
end_addr, Pmode);
}

View File

@ -2380,7 +2380,7 @@ expand_block_move_4 (rtx dst, rtx dst_reg, rtx src, rtx src_reg, rtx bytes_rtx)
emit_insn (insn);
}
else
emit_library_call (long_int_memcpy_libfunc, LCT_NORMAL, VOIDmode, 3,
emit_library_call (long_int_memcpy_libfunc, LCT_NORMAL, VOIDmode,
dst_reg, Pmode,
src_reg, Pmode,
convert_to_mode (TYPE_MODE (sizetype),
@ -2416,7 +2416,7 @@ expand_block_move_2 (rtx dst, rtx dst_reg, rtx src, rtx src_reg, rtx bytes_rtx)
unsigned HOST_WIDE_INT bytes = UINTVAL (bytes_rtx);
unsigned int rem = bytes % 2;
emit_library_call (wrd_memcpy_libfunc, LCT_NORMAL, VOIDmode, 3,
emit_library_call (wrd_memcpy_libfunc, LCT_NORMAL, VOIDmode,
dst_reg, Pmode,
src_reg, Pmode,
convert_to_mode (TYPE_MODE (sizetype),
@ -2440,7 +2440,7 @@ expand_block_move_2 (rtx dst, rtx dst_reg, rtx src, rtx src_reg, rtx bytes_rtx)
static void
expand_block_move_1 (rtx dst_reg, rtx src_reg, rtx bytes_rtx)
{
emit_library_call (byt_memcpy_libfunc, LCT_NORMAL, VOIDmode, 3,
emit_library_call (byt_memcpy_libfunc, LCT_NORMAL, VOIDmode,
dst_reg, Pmode,
src_reg, Pmode,
convert_to_mode (TYPE_MODE (sizetype),
@ -2459,7 +2459,7 @@ expand_block_set_4 (rtx dst, rtx dst_reg, rtx value_rtx, rtx bytes_rtx)
unsigned int rem = bytes % 4;
value_rtx = convert_to_mode (Pmode, value_rtx, 1);
emit_library_call (long_int_memset_libfunc, LCT_NORMAL, VOIDmode, 3,
emit_library_call (long_int_memset_libfunc, LCT_NORMAL, VOIDmode,
dst_reg, Pmode,
value_rtx, Pmode,
convert_to_mode (TYPE_MODE (sizetype),
@ -2505,7 +2505,7 @@ expand_block_set_2 (rtx dst, rtx dst_reg, rtx value_rtx, rtx bytes_rtx)
unsigned int rem = bytes % 2;
value_rtx = convert_to_mode (Pmode, value_rtx, 1);
emit_library_call (wrd_memset_libfunc, LCT_NORMAL, VOIDmode, 3,
emit_library_call (wrd_memset_libfunc, LCT_NORMAL, VOIDmode,
dst_reg, Pmode,
value_rtx, Pmode,
convert_to_mode (TYPE_MODE (sizetype),
@ -2529,7 +2529,7 @@ static void
expand_block_set_1 (rtx dst_reg, rtx value_rtx, rtx bytes_rtx)
{
value_rtx = convert_to_mode (Pmode, value_rtx, 1);
emit_library_call (byt_memset_libfunc, LCT_NORMAL, VOIDmode, 3,
emit_library_call (byt_memset_libfunc, LCT_NORMAL, VOIDmode,
dst_reg, Pmode,
value_rtx, Pmode,
convert_to_mode (TYPE_MODE (sizetype),
@ -2681,7 +2681,7 @@ visium_trampoline_init (rtx m_tramp, tree fndecl, rtx static_chain)
GEN_INT (0xffff), NULL_RTX),
0x04940000));
emit_library_call (set_trampoline_parity_libfunc, LCT_NORMAL, VOIDmode, 1,
emit_library_call (set_trampoline_parity_libfunc, LCT_NORMAL, VOIDmode,
addr, SImode);
}
@ -2721,7 +2721,7 @@ visium_profile_hook (void)
{
visium_frame_needed = true;
emit_library_call (gen_rtx_SYMBOL_REF (Pmode, "mcount"), LCT_NORMAL,
VOIDmode, 0);
VOIDmode);
}
/* A C expression whose value is RTL representing the address in a stack frame

View File

@ -1343,7 +1343,7 @@ xtensa_expand_nonlocal_goto (rtx *operands)
containing_fp = force_reg (Pmode, containing_fp);
emit_library_call (gen_rtx_SYMBOL_REF (Pmode, "__xtensa_nonlocal_goto"),
LCT_NORMAL, VOIDmode, 2,
LCT_NORMAL, VOIDmode,
containing_fp, Pmode,
goto_handler, Pmode);
}
@ -1623,7 +1623,7 @@ xtensa_setup_frame_addresses (void)
if (TARGET_WINDOWED_ABI)
emit_library_call
(gen_rtx_SYMBOL_REF (Pmode, "__xtensa_libgcc_window_spill"),
LCT_NORMAL, VOIDmode, 0);
LCT_NORMAL, VOIDmode);
}
@ -4045,7 +4045,7 @@ xtensa_trampoline_init (rtx m_tramp, tree fndecl, rtx chain)
emit_move_insn (adjust_address (m_tramp, SImode, chain_off), chain);
emit_move_insn (adjust_address (m_tramp, SImode, func_off), func);
emit_library_call (gen_rtx_SYMBOL_REF (Pmode, "__xtensa_sync_caches"),
LCT_NORMAL, VOIDmode, 1, XEXP (m_tramp, 0), Pmode);
LCT_NORMAL, VOIDmode, XEXP (m_tramp, 0), Pmode);
}
/* Implement TARGET_LEGITIMATE_CONSTANT_P. */

View File

@ -1190,7 +1190,7 @@ sjlj_emit_function_enter (rtx_code_label *dispatch_label)
}
emit_library_call (unwind_sjlj_register_libfunc, LCT_NORMAL, VOIDmode,
1, XEXP (fc, 0), Pmode);
XEXP (fc, 0), Pmode);
seq = get_insns ();
end_sequence ();
@ -1232,7 +1232,7 @@ sjlj_emit_function_exit (void)
start_sequence ();
emit_library_call (unwind_sjlj_unregister_libfunc, LCT_NORMAL, VOIDmode,
1, XEXP (crtl->eh.sjlj_fc, 0), Pmode);
XEXP (crtl->eh.sjlj_fc, 0), Pmode);
seq = get_insns ();
end_sequence ();

View File

@ -1408,7 +1408,7 @@ allocate_dynamic_stack_space (rtx size, unsigned size_align,
func = init_one_libfunc ("__morestack_allocate_stack_space");
space = emit_library_call_value (func, target, LCT_NORMAL, Pmode,
1, ask, Pmode);
ask, Pmode);
if (available_label == NULL_RTX)
return space;
@ -1621,8 +1621,8 @@ probe_stack_range (HOST_WIDE_INT first, rtx size)
stack_pointer_rtx,
plus_constant (Pmode,
size, first)));
emit_library_call (stack_check_libfunc, LCT_THROW, VOIDmode, 1, addr,
Pmode);
emit_library_call (stack_check_libfunc, LCT_THROW, VOIDmode,
addr, Pmode);
}
/* Next see if we have an insn to check the stack. */

View File

@ -327,7 +327,7 @@ convert_mode_scalar (rtx to, rtx from, int unsignedp)
start_sequence ();
value = emit_library_call_value (libcall, NULL_RTX, LCT_CONST, to_mode,
1, from, from_mode);
from, from_mode);
insns = get_insns ();
end_sequence ();
emit_libcall_block (insns, to, value,

View File

@ -1759,7 +1759,7 @@ expand_binop (machine_mode mode, optab binoptab, rtx op0, rtx op1,
/* Pass 1 for NO_QUEUE so we don't lose any increments
if the libcall is cse'd or moved. */
value = emit_library_call_value (libfunc,
NULL_RTX, LCT_CONST, mode, 2,
NULL_RTX, LCT_CONST, mode,
op0, mode, op1x, op1_mode);
insns = get_insns ();
@ -2092,7 +2092,7 @@ expand_twoval_binop_libfunc (optab binoptab, rtx op0, rtx op1,
libval_mode = smallest_int_mode_for_size (2 * GET_MODE_BITSIZE (mode));
start_sequence ();
libval = emit_library_call_value (libfunc, NULL_RTX, LCT_CONST,
libval_mode, 2,
libval_mode,
op0, mode,
op1, mode);
/* Get the part of VAL containing the value that we want. */
@ -2966,7 +2966,7 @@ expand_unop (machine_mode mode, optab unoptab, rtx op0, rtx target,
/* Pass 1 for NO_QUEUE so we don't lose any increments
if the libcall is cse'd or moved. */
value = emit_library_call_value (libfunc, NULL_RTX, LCT_CONST, outmode,
1, op0, mode);
op0, mode);
insns = get_insns ();
end_sequence ();
@ -3917,7 +3917,7 @@ prepare_cmp_insn (rtx x, rtx y, enum rtx_code comparison, rtx size,
ret_mode = targetm.libgcc_cmp_return_mode ();
result = emit_library_call_value (libfunc, NULL_RTX, LCT_CONST,
ret_mode, 2, x, mode, y, mode);
ret_mode, x, mode, y, mode);
/* There are two kinds of comparison routines. Biased routines
return 0/1/2, and unbiased routines return -1/0/1. Other parts
@ -4171,7 +4171,7 @@ prepare_float_lib_cmp (rtx x, rtx y, enum rtx_code comparison,
start_sequence ();
value = emit_library_call_value (libfunc, NULL_RTX, LCT_CONST,
cmp_mode, 2, x, mode, y, mode);
cmp_mode, x, mode, y, mode);
insns = get_insns ();
end_sequence ();
@ -4811,8 +4811,7 @@ expand_float (rtx to, rtx from, int unsignedp)
start_sequence ();
value = emit_library_call_value (libfunc, NULL_RTX, LCT_CONST,
GET_MODE (to), 1, from,
GET_MODE (from));
GET_MODE (to), from, GET_MODE (from));
insns = get_insns ();
end_sequence ();
@ -5004,8 +5003,7 @@ expand_fix (rtx to, rtx from, int unsignedp)
start_sequence ();
value = emit_library_call_value (libfunc, NULL_RTX, LCT_CONST,
GET_MODE (to), 1, from,
GET_MODE (from));
GET_MODE (to), from, GET_MODE (from));
insns = get_insns ();
end_sequence ();
@ -5097,7 +5095,7 @@ expand_fixed_convert (rtx to, rtx from, int uintp, int satp)
start_sequence ();
value = emit_library_call_value (libfunc, NULL_RTX, LCT_CONST, to_mode,
1, from, from_mode);
from, from_mode);
insns = get_insns ();
end_sequence ();
@ -5944,7 +5942,7 @@ maybe_emit_sync_lock_test_and_set (rtx target, rtx mem, rtx val,
addr = convert_memory_address (ptr_mode, XEXP (mem, 0));
return emit_library_call_value (libfunc, NULL_RTX, LCT_NORMAL,
mode, 2, addr, ptr_mode,
mode, addr, ptr_mode,
val, mode);
}
}
@ -6252,7 +6250,7 @@ expand_atomic_compare_and_swap (rtx *ptarget_bool, rtx *ptarget_oval,
{
rtx addr = convert_memory_address (ptr_mode, XEXP (mem, 0));
rtx target = emit_library_call_value (libfunc, NULL_RTX, LCT_NORMAL,
mode, 3, addr, ptr_mode,
mode, addr, ptr_mode,
expected, mode, desired, mode);
emit_move_insn (target_oval, target);
@ -6313,7 +6311,7 @@ expand_mem_thread_fence (enum memmodel model)
else if (targetm.have_memory_barrier ())
emit_insn (targetm.gen_memory_barrier ());
else if (synchronize_libfunc != NULL_RTX)
emit_library_call (synchronize_libfunc, LCT_NORMAL, VOIDmode, 0);
emit_library_call (synchronize_libfunc, LCT_NORMAL, VOIDmode);
else
expand_asm_memory_barrier ();
}
@ -6813,7 +6811,7 @@ expand_atomic_fetch_op (rtx target, rtx mem, rtx val, enum rtx_code code,
{
rtx addr = convert_memory_address (ptr_mode, XEXP (mem, 0));
result = emit_library_call_value (libfunc, NULL, LCT_NORMAL, mode,
2, addr, ptr_mode, val, mode);
addr, ptr_mode, val, mode);
if (!unused_result && fixup)
result = expand_simple_binop (mode, code, result, val, target,

136
gcc/rtl.h
View File

@ -3773,10 +3773,138 @@ enum libcall_type
LCT_RETURNS_TWICE = 5
};
extern void emit_library_call (rtx, enum libcall_type, machine_mode, int,
...);
extern rtx emit_library_call_value (rtx, rtx, enum libcall_type,
machine_mode, int, ...);
extern rtx emit_library_call_value_1 (int, rtx, rtx, enum libcall_type,
machine_mode, int, rtx_mode_t *);
/* Output a library call and discard the returned value. FUN is the
address of the function, as a SYMBOL_REF rtx, and OUTMODE is the mode
of the (discarded) return value. FN_TYPE is LCT_NORMAL for `normal'
calls, LCT_CONST for `const' calls, LCT_PURE for `pure' calls, or
another LCT_ value for other types of library calls.
There are different overloads of this function for different numbers
of arguments. In each case the argument value is followed by its mode. */
inline void
emit_library_call (rtx fun, libcall_type fn_type, machine_mode outmode)
{
emit_library_call_value_1 (0, fun, NULL_RTX, fn_type, outmode, 0, NULL);
}
inline void
emit_library_call (rtx fun, libcall_type fn_type, machine_mode outmode,
rtx arg1, machine_mode arg1_mode)
{
rtx_mode_t args[] = { rtx_mode_t (arg1, arg1_mode) };
emit_library_call_value_1 (0, fun, NULL_RTX, fn_type, outmode, 1, args);
}
inline void
emit_library_call (rtx fun, libcall_type fn_type, machine_mode outmode,
rtx arg1, machine_mode arg1_mode,
rtx arg2, machine_mode arg2_mode)
{
rtx_mode_t args[] = {
rtx_mode_t (arg1, arg1_mode),
rtx_mode_t (arg2, arg2_mode)
};
emit_library_call_value_1 (0, fun, NULL_RTX, fn_type, outmode, 2, args);
}
inline void
emit_library_call (rtx fun, libcall_type fn_type, machine_mode outmode,
rtx arg1, machine_mode arg1_mode,
rtx arg2, machine_mode arg2_mode,
rtx arg3, machine_mode arg3_mode)
{
rtx_mode_t args[] = {
rtx_mode_t (arg1, arg1_mode),
rtx_mode_t (arg2, arg2_mode),
rtx_mode_t (arg3, arg3_mode)
};
emit_library_call_value_1 (0, fun, NULL_RTX, fn_type, outmode, 3, args);
}
inline void
emit_library_call (rtx fun, libcall_type fn_type, machine_mode outmode,
rtx arg1, machine_mode arg1_mode,
rtx arg2, machine_mode arg2_mode,
rtx arg3, machine_mode arg3_mode,
rtx arg4, machine_mode arg4_mode)
{
rtx_mode_t args[] = {
rtx_mode_t (arg1, arg1_mode),
rtx_mode_t (arg2, arg2_mode),
rtx_mode_t (arg3, arg3_mode),
rtx_mode_t (arg4, arg4_mode)
};
emit_library_call_value_1 (0, fun, NULL_RTX, fn_type, outmode, 4, args);
}
/* Like emit_library_call, but return the value produced by the call.
Use VALUE to store the result if it is nonnull, otherwise pick a
convenient location. */
inline rtx
emit_library_call_value (rtx fun, rtx value, libcall_type fn_type,
machine_mode outmode)
{
return emit_library_call_value_1 (1, fun, value, fn_type, outmode, 0, NULL);
}
inline rtx
emit_library_call_value (rtx fun, rtx value, libcall_type fn_type,
machine_mode outmode,
rtx arg1, machine_mode arg1_mode)
{
rtx_mode_t args[] = { rtx_mode_t (arg1, arg1_mode) };
return emit_library_call_value_1 (1, fun, value, fn_type, outmode, 1, args);
}
inline rtx
emit_library_call_value (rtx fun, rtx value, libcall_type fn_type,
machine_mode outmode,
rtx arg1, machine_mode arg1_mode,
rtx arg2, machine_mode arg2_mode)
{
rtx_mode_t args[] = {
rtx_mode_t (arg1, arg1_mode),
rtx_mode_t (arg2, arg2_mode)
};
return emit_library_call_value_1 (1, fun, value, fn_type, outmode, 2, args);
}
inline rtx
emit_library_call_value (rtx fun, rtx value, libcall_type fn_type,
machine_mode outmode,
rtx arg1, machine_mode arg1_mode,
rtx arg2, machine_mode arg2_mode,
rtx arg3, machine_mode arg3_mode)
{
rtx_mode_t args[] = {
rtx_mode_t (arg1, arg1_mode),
rtx_mode_t (arg2, arg2_mode),
rtx_mode_t (arg3, arg3_mode)
};
return emit_library_call_value_1 (1, fun, value, fn_type, outmode, 3, args);
}
inline rtx
emit_library_call_value (rtx fun, rtx value, libcall_type fn_type,
machine_mode outmode,
rtx arg1, machine_mode arg1_mode,
rtx arg2, machine_mode arg2_mode,
rtx arg3, machine_mode arg3_mode,
rtx arg4, machine_mode arg4_mode)
{
rtx_mode_t args[] = {
rtx_mode_t (arg1, arg1_mode),
rtx_mode_t (arg2, arg2_mode),
rtx_mode_t (arg3, arg3_mode),
rtx_mode_t (arg4, arg4_mode)
};
return emit_library_call_value_1 (1, fun, value, fn_type, outmode, 4, args);
}
/* In varasm.c */
extern void init_varasm_once (void);