mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-03-20 23:11:21 +08:00
* libfuncs.h
(LTI_eqhf2, LTI_nehf2, LTI_gthf2, LTI_gehf2, LTI_lthf2) (LTI_lehf2, LTI_unordhf2, LTI_eqsf2, LTI_nesf2, LTI_gtsf2) (LTI_gesf2, LTI_ltsf2, LTI_lesf2, LTI_unordsf2, LTI_eqdf2) (LTI_nedf2, LTI_gtdf2, LTI_gedf2, LTI_ltdf2, LTI_ledf2) (LTI_unorddf2, LTI_eqxf2, LTI_nexf2, LTI_gtxf2, LTI_gexf2) (LTI_ltxf2, LTI_lexf2, LTI_unordxf2, LTI_eqtf2, LTI_netf2) (LTI_gttf2, LTI_getf2, LTI_lttf2, LTI_letf2, LTI_unordtf2) (eqhf2_libfunc, nehf2_libfunc, gthf2_libfunc, gehf2_libfunc) (lthf2_libfunc, lehf2_libfunc, unordhf2_libfunc, eqsf2_libfunc) (nesf2_libfunc, gtsf2_libfunc, gesf2_libfunc, ltsf2_libfunc) (lesf2_libfunc, unordsf2_libfunc eqdf2_libfunc, nedf2_libfunc) (gtdf2_libfunc, gedf2_libfunc, ltdf2_libfunc, ledf2_libfunc) (unorddf2_libfunc eqxf2_libfunc, nexf2_libfunc, gtxf2_libfunc) (gexf2_libfunc, ltxf2_libfunc, lexf2_libfunc, unordxf2_libfunc (eqtf2_libfunc, netf2_libfunc, gttf2_libfunc, getf2_libfunc) (lttf2_libfunc, letf2_libfunc, unordtf2_libfunc): Delete. * optabs.h (OTI_eq, OTI_ne, OTI_gt, OTI_ge, OTI_lt, OTI_le) (OTI_unord, eq_optab, ne_optab, gt_optab, ge_optab, lt_optab) (le_optab, unord_optab): New. * optabs.c (prepare_float_lib_cmp): Rewrite. Get the libfuncs from the code_to_optab table, not a giant switch; use swap_condition; do widening only if a comparison function that we can call exists in a wider mode, not if a cmp_optab insn or libfunc exists in a wider mode; call protect_from_queue exactly once on each operand. (init_optabs): Initialize the new optabs, not the deleted libfuncs. * config/gofast.h, config/ia64/ia64.c, config/mips/mips.c * config/pa/pa.c, config/rs6000/rs6000.c, config/sparc/sparc.c: Set floating point comparison libfuncs using set_optab_libfunc on the appropriate optab. * config/ia64/ia64.c (ia64_hpux_init_libfuncs): Fix typo. * config/rs6000/rs6000.c (rs6000_init_libfuncs): Correct ABI selector conditionals. From-SVN: r72101
This commit is contained in:
parent
ce59b97aee
commit
c903456103
@ -1,3 +1,44 @@
|
||||
2003-10-04 Zack Weinberg <zack@codesourcery.com>
|
||||
|
||||
* libfuncs.h
|
||||
(LTI_eqhf2, LTI_nehf2, LTI_gthf2, LTI_gehf2, LTI_lthf2)
|
||||
(LTI_lehf2, LTI_unordhf2, LTI_eqsf2, LTI_nesf2, LTI_gtsf2)
|
||||
(LTI_gesf2, LTI_ltsf2, LTI_lesf2, LTI_unordsf2, LTI_eqdf2)
|
||||
(LTI_nedf2, LTI_gtdf2, LTI_gedf2, LTI_ltdf2, LTI_ledf2)
|
||||
(LTI_unorddf2, LTI_eqxf2, LTI_nexf2, LTI_gtxf2, LTI_gexf2)
|
||||
(LTI_ltxf2, LTI_lexf2, LTI_unordxf2, LTI_eqtf2, LTI_netf2)
|
||||
(LTI_gttf2, LTI_getf2, LTI_lttf2, LTI_letf2, LTI_unordtf2)
|
||||
(eqhf2_libfunc, nehf2_libfunc, gthf2_libfunc, gehf2_libfunc)
|
||||
(lthf2_libfunc, lehf2_libfunc, unordhf2_libfunc, eqsf2_libfunc)
|
||||
(nesf2_libfunc, gtsf2_libfunc, gesf2_libfunc, ltsf2_libfunc)
|
||||
(lesf2_libfunc, unordsf2_libfunc eqdf2_libfunc, nedf2_libfunc)
|
||||
(gtdf2_libfunc, gedf2_libfunc, ltdf2_libfunc, ledf2_libfunc)
|
||||
(unorddf2_libfunc eqxf2_libfunc, nexf2_libfunc, gtxf2_libfunc)
|
||||
(gexf2_libfunc, ltxf2_libfunc, lexf2_libfunc, unordxf2_libfunc
|
||||
(eqtf2_libfunc, netf2_libfunc, gttf2_libfunc, getf2_libfunc)
|
||||
(lttf2_libfunc, letf2_libfunc, unordtf2_libfunc):
|
||||
Delete.
|
||||
* optabs.h (OTI_eq, OTI_ne, OTI_gt, OTI_ge, OTI_lt, OTI_le)
|
||||
(OTI_unord, eq_optab, ne_optab, gt_optab, ge_optab, lt_optab)
|
||||
(le_optab, unord_optab): New.
|
||||
|
||||
* optabs.c (prepare_float_lib_cmp): Rewrite. Get the libfuncs
|
||||
from the code_to_optab table, not a giant switch; use
|
||||
swap_condition; do widening only if a comparison function that
|
||||
we can call exists in a wider mode, not if a cmp_optab insn or
|
||||
libfunc exists in a wider mode; call protect_from_queue
|
||||
exactly once on each operand.
|
||||
(init_optabs): Initialize the new optabs, not the deleted libfuncs.
|
||||
|
||||
* config/gofast.h, config/ia64/ia64.c, config/mips/mips.c
|
||||
* config/pa/pa.c, config/rs6000/rs6000.c, config/sparc/sparc.c:
|
||||
Set floating point comparison libfuncs using set_optab_libfunc
|
||||
on the appropriate optab.
|
||||
|
||||
* config/ia64/ia64.c (ia64_hpux_init_libfuncs): Fix typo.
|
||||
* config/rs6000/rs6000.c (rs6000_init_libfuncs): Correct ABI
|
||||
selector conditionals.
|
||||
|
||||
2003-10-04 Stephane Carrez <stcarrez@nerim.fr>
|
||||
|
||||
* config/m68hc11/t-m68hc11-gas (MULTILIB_MATCHES): m68hcs12 is
|
||||
@ -33,9 +74,9 @@
|
||||
|
||||
2003-10-03 Robert Bowdidge <bowdidge@apple.com>
|
||||
|
||||
* ggc-page.c (ggc_pch_write_object): Replace fseek() with fwrite() in
|
||||
PCH generation, avoiding too-frequent flushes when writing to NFS
|
||||
file system.
|
||||
* ggc-page.c (ggc_pch_write_object): Replace fseek() with fwrite() in
|
||||
PCH generation, avoiding too-frequent flushes when writing to NFS
|
||||
file system.
|
||||
|
||||
2003-10-03 Ziemowit Laski <zlaski@apple.com>
|
||||
|
||||
@ -82,7 +123,7 @@
|
||||
* config/mips/mips.md ("type" attr): Add new "prefetchx" value,
|
||||
update comments.
|
||||
(prefetch_indexed_di, prefetch_indexed_si): New insns.
|
||||
|
||||
|
||||
2003-10-03 Jeff Sturm <jsturm@one-point.com>
|
||||
Roger Sayle <roger@eyesopen.com>
|
||||
|
||||
@ -123,7 +164,7 @@
|
||||
operand's constraint letter to 'I'.
|
||||
(prefetch_di_address): Likewise.
|
||||
(prefetch_si, prefetch_di): Set third operand to const0_rtx.
|
||||
|
||||
|
||||
2003-10-02 Zack Weinberg <zack@codesourcery.com>
|
||||
|
||||
* system.h: Poison macros obsoleted by earlier patch.
|
||||
|
@ -52,19 +52,19 @@ gofast_maybe_init_libfuncs (void)
|
||||
libfuncs, we use our own functions, since GOFAST doesn't supply
|
||||
them. */
|
||||
|
||||
eqsf2_libfunc = init_one_libfunc ("fpcmp");
|
||||
nesf2_libfunc = init_one_libfunc ("fpcmp");
|
||||
gtsf2_libfunc = NULL_RTX;
|
||||
gesf2_libfunc = NULL_RTX;
|
||||
ltsf2_libfunc = init_one_libfunc ("fpcmp");
|
||||
lesf2_libfunc = init_one_libfunc ("fpcmp");
|
||||
set_optab_libfunc (eq_optab, SFmode, "fpcmp");
|
||||
set_optab_libfunc (ne_optab, SFmode, "fpcmp");
|
||||
set_optab_libfunc (gt_optab, SFmode, 0);
|
||||
set_optab_libfunc (ge_optab, SFmode, 0);
|
||||
set_optab_libfunc (lt_optab, SFmode, "fpcmp");
|
||||
set_optab_libfunc (le_optab, SFmode, "fpcmp");
|
||||
|
||||
eqdf2_libfunc = init_one_libfunc ("dpcmp");
|
||||
nedf2_libfunc = init_one_libfunc ("dpcmp");
|
||||
gtdf2_libfunc = NULL_RTX;
|
||||
gedf2_libfunc = NULL_RTX;
|
||||
ltdf2_libfunc = init_one_libfunc ("dpcmp");
|
||||
ledf2_libfunc = init_one_libfunc ("dpcmp");
|
||||
set_optab_libfunc (eq_optab, DFmode, "dpcmp");
|
||||
set_optab_libfunc (ne_optab, DFmode, "dpcmp");
|
||||
set_optab_libfunc (gt_optab, DFmode, 0);
|
||||
set_optab_libfunc (ge_optab, DFmode, 0);
|
||||
set_optab_libfunc (lt_optab, DFmode, "dpcmp");
|
||||
set_optab_libfunc (le_optab, DFmode, "dpcmp");
|
||||
|
||||
extendsfdf2_libfunc = init_one_libfunc ("fptodp");
|
||||
truncdfsf2_libfunc = init_one_libfunc ("dptofp");
|
||||
|
@ -8313,13 +8313,20 @@ ia64_hpux_init_libfuncs (void)
|
||||
{
|
||||
set_optab_libfunc (add_optab, TFmode, "_U_Qfadd");
|
||||
set_optab_libfunc (sub_optab, TFmode, "_U_Qfsub");
|
||||
set_optab_libfunc (smul_optab, TFmode, "_Q_Qfmpy");
|
||||
set_optab_libfunc (smul_optab, TFmode, "_U_Qfmpy");
|
||||
set_optab_libfunc (sdiv_optab, TFmode, "_U_Qfdiv");
|
||||
set_optab_libfunc (smin_optab, TFmode, "_U_Qfmin");
|
||||
set_optab_libfunc (smax_optab, TFmode, "_U_Qfmax");
|
||||
set_optab_libfunc (abs_optab, TFmode, "_U_Qfabs");
|
||||
set_optab_libfunc (neg_optab, TFmode, "_U_Qfneg");
|
||||
|
||||
set_optab_libfunc (eq_optab, TFmode, "_U_Qfeq");
|
||||
set_optab_libfunc (ne_optab, TFmode, "_U_Qfne");
|
||||
set_optab_libfunc (gt_optab, TFmode, "_U_Qfgt");
|
||||
set_optab_libfunc (ge_optab, TFmode, "_U_Qfge");
|
||||
set_optab_libfunc (lt_optab, TFmode, "_U_Qflt");
|
||||
set_optab_libfunc (le_optab, TFmode, "_U_Qfle");
|
||||
|
||||
extendsftf2_libfunc = init_one_libfunc ("_U_Qfcnvff_sgl_to_quad");
|
||||
extenddftf2_libfunc = init_one_libfunc ("_U_Qfcnvff_dbl_to_quad");
|
||||
trunctfsf2_libfunc = init_one_libfunc ("_U_Qfcnvff_quad_to_sgl");
|
||||
@ -8330,12 +8337,6 @@ ia64_hpux_init_libfuncs (void)
|
||||
fixtfdi_libfunc = init_one_libfunc ("_U_Qfcnvfxt_quad_to_dbl");
|
||||
fixunstfsi_libfunc = init_one_libfunc ("_U_Qfcnvfxut_quad_to_sgl");
|
||||
fixunstfdi_libfunc = init_one_libfunc ("_U_Qfcnvfxut_quad_to_dbl");
|
||||
eqtf2_libfunc = init_one_libfunc ("_U_Qfeq");
|
||||
netf2_libfunc = init_one_libfunc ("_U_Qfne");
|
||||
gttf2_libfunc = init_one_libfunc ("_U_Qfgt");
|
||||
getf2_libfunc = init_one_libfunc ("_U_Qfge");
|
||||
lttf2_libfunc = init_one_libfunc ("_U_Qflt");
|
||||
letf2_libfunc = init_one_libfunc ("_U_Qfle");
|
||||
}
|
||||
|
||||
/* Switch to the section to which we should output X. The only thing
|
||||
|
@ -9015,12 +9015,12 @@ mips_init_libfuncs (void)
|
||||
set_optab_libfunc (smul_optab, SFmode, "__mips16_mulsf3");
|
||||
set_optab_libfunc (sdiv_optab, SFmode, "__mips16_divsf3");
|
||||
|
||||
eqsf2_libfunc = init_one_libfunc ("__mips16_eqsf2");
|
||||
nesf2_libfunc = init_one_libfunc ("__mips16_nesf2");
|
||||
gtsf2_libfunc = init_one_libfunc ("__mips16_gtsf2");
|
||||
gesf2_libfunc = init_one_libfunc ("__mips16_gesf2");
|
||||
ltsf2_libfunc = init_one_libfunc ("__mips16_ltsf2");
|
||||
lesf2_libfunc = init_one_libfunc ("__mips16_lesf2");
|
||||
set_optab_libfunc (eq_optab, SFmode, "__mips16_eqsf2");
|
||||
set_optab_libfunc (ne_optab, SFmode, "__mips16_nesf2");
|
||||
set_optab_libfunc (gt_optab, SFmode, "__mips16_gtsf2");
|
||||
set_optab_libfunc (ge_optab, SFmode, "__mips16_gesf2");
|
||||
set_optab_libfunc (lt_optab, SFmode, "__mips16_ltsf2");
|
||||
set_optab_libfunc (le_optab, SFmode, "__mips16_lesf2");
|
||||
|
||||
floatsisf_libfunc = init_one_libfunc ("__mips16_floatsisf");
|
||||
fixsfsi_libfunc = init_one_libfunc ("__mips16_fixsfsi");
|
||||
@ -9032,12 +9032,12 @@ mips_init_libfuncs (void)
|
||||
set_optab_libfunc (smul_optab, DFmode, "__mips16_muldf3");
|
||||
set_optab_libfunc (sdiv_optab, DFmode, "__mips16_divdf3");
|
||||
|
||||
eqdf2_libfunc = init_one_libfunc ("__mips16_eqdf2");
|
||||
nedf2_libfunc = init_one_libfunc ("__mips16_nedf2");
|
||||
gtdf2_libfunc = init_one_libfunc ("__mips16_gtdf2");
|
||||
gedf2_libfunc = init_one_libfunc ("__mips16_gedf2");
|
||||
ltdf2_libfunc = init_one_libfunc ("__mips16_ltdf2");
|
||||
ledf2_libfunc = init_one_libfunc ("__mips16_ledf2");
|
||||
set_optab_libfunc (eq_optab, DFmode, "__mips16_eqdf2");
|
||||
set_optab_libfunc (ne_optab, DFmode, "__mips16_nedf2");
|
||||
set_optab_libfunc (gt_optab, DFmode, "__mips16_gtdf2");
|
||||
set_optab_libfunc (ge_optab, DFmode, "__mips16_gedf2");
|
||||
set_optab_libfunc (lt_optab, DFmode, "__mips16_ltdf2");
|
||||
set_optab_libfunc (le_optab, DFmode, "__mips16_ledf2");
|
||||
|
||||
floatsidf_libfunc = init_one_libfunc ("__mips16_floatsidf");
|
||||
fixdfsi_libfunc = init_one_libfunc ("__mips16_fixdfsi");
|
||||
|
@ -4973,12 +4973,12 @@ pa_hpux_init_libfuncs (void)
|
||||
set_optab_libfunc (abs_optab, TFmode, "_U_Qfabs");
|
||||
set_optab_libfunc (neg_optab, TFmode, "_U_Qfneg");
|
||||
|
||||
eqtf2_libfunc = init_one_libfunc ("_U_Qfeq");
|
||||
netf2_libfunc = init_one_libfunc ("_U_Qfne");
|
||||
gttf2_libfunc = init_one_libfunc ("_U_Qfgt");
|
||||
getf2_libfunc = init_one_libfunc ("_U_Qfge");
|
||||
lttf2_libfunc = init_one_libfunc ("_U_Qflt");
|
||||
letf2_libfunc = init_one_libfunc ("_U_Qfle");
|
||||
set_optab_libfunc (eq_optab, TFmode, "_U_Qfeq");
|
||||
set_optab_libfunc (ne_optab, TFmode, "_U_Qfne");
|
||||
set_optab_libfunc (gt_optab, TFmode, "_U_Qfgt");
|
||||
set_optab_libfunc (ge_optab, TFmode, "_U_Qfge");
|
||||
set_optab_libfunc (lt_optab, TFmode, "_U_Qflt");
|
||||
set_optab_libfunc (le_optab, TFmode, "_U_Qfle");
|
||||
|
||||
extendsftf2_libfunc = init_one_libfunc ("_U_Qfcnvff_sgl_to_quad");
|
||||
extenddftf2_libfunc = init_one_libfunc ("_U_Qfcnvff_dbl_to_quad");
|
||||
|
@ -6779,25 +6779,24 @@ rs6000_init_libfuncs (void)
|
||||
if (!TARGET_HARD_FLOAT)
|
||||
return;
|
||||
|
||||
if (TARGET_AIX)
|
||||
if (DEFAULT_ABI != ABI_V4)
|
||||
{
|
||||
/* Optabs entries for the int->float routines and quad FP
|
||||
operations using the standard AIX names. */
|
||||
if (! TARGET_POWER2 && ! TARGET_POWERPC)
|
||||
if (TARGET_XCOFF && ! TARGET_POWER2 && ! TARGET_POWERPC)
|
||||
{
|
||||
/* AIX library routines for float->int conversion. */
|
||||
fixdfsi_libfunc = init_one_libfunc ("__itrunc");
|
||||
fixunsdfsi_libfunc = init_one_libfunc ("__uitrunc");
|
||||
}
|
||||
|
||||
/* Standard AIX/Darwin/64-bit SVR4 quad floating point routines. */
|
||||
set_optab_libfunc (add_optab, TFmode, "_xlqadd");
|
||||
set_optab_libfunc (sub_optab, TFmode, "_xlqsub");
|
||||
set_optab_libfunc (smul_optab, TFmode, "_xlqmul");
|
||||
set_optab_libfunc (sdiv_optab, TFmode, "_xlqdiv");
|
||||
}
|
||||
else if (TARGET_ELF)
|
||||
else
|
||||
{
|
||||
/* Define library calls for quad FP operations. These are all
|
||||
part of the PowerPC 32bit ABI. */
|
||||
/* 32-bit SVR4 quad floating point routines. */
|
||||
|
||||
set_optab_libfunc (add_optab, TFmode, "_q_add");
|
||||
set_optab_libfunc (sub_optab, TFmode, "_q_sub");
|
||||
@ -6807,12 +6806,13 @@ rs6000_init_libfuncs (void)
|
||||
if (TARGET_PPC_GPOPT || TARGET_POWER2)
|
||||
set_optab_libfunc (sqrt_optab, TFmode, "_q_sqrt");
|
||||
|
||||
eqtf2_libfunc = init_one_libfunc ("_q_feq");
|
||||
netf2_libfunc = init_one_libfunc ("_q_fne");
|
||||
gttf2_libfunc = init_one_libfunc ("_q_fgt");
|
||||
getf2_libfunc = init_one_libfunc ("_q_fge");
|
||||
lttf2_libfunc = init_one_libfunc ("_q_flt");
|
||||
letf2_libfunc = init_one_libfunc ("_q_fle");
|
||||
set_optab_libfunc (eq_optab, TFmode, "_q_feq");
|
||||
set_optab_libfunc (ne_optab, TFmode, "_q_fne");
|
||||
set_optab_libfunc (gt_optab, TFmode, "_q_fgt");
|
||||
set_optab_libfunc (ge_optab, TFmode, "_q_fge");
|
||||
set_optab_libfunc (lt_optab, TFmode, "_q_flt");
|
||||
set_optab_libfunc (le_optab, TFmode, "_q_fle");
|
||||
|
||||
trunctfsf2_libfunc = init_one_libfunc ("_q_qtos");
|
||||
trunctfdf2_libfunc = init_one_libfunc ("_q_qtod");
|
||||
extendsftf2_libfunc = init_one_libfunc ("_q_stoq");
|
||||
|
@ -8424,12 +8424,12 @@ sparc_init_libfuncs (void)
|
||||
if (TARGET_FPU)
|
||||
set_optab_libfunc (sqrt_optab, TFmode, "_Q_sqrt");
|
||||
|
||||
eqtf2_libfunc = init_one_libfunc ("_Q_feq");
|
||||
netf2_libfunc = init_one_libfunc ("_Q_fne");
|
||||
gttf2_libfunc = init_one_libfunc ("_Q_fgt");
|
||||
getf2_libfunc = init_one_libfunc ("_Q_fge");
|
||||
lttf2_libfunc = init_one_libfunc ("_Q_flt");
|
||||
letf2_libfunc = init_one_libfunc ("_Q_fle");
|
||||
set_optab_libfunc (eq_optab, TFmode, "_Q_feq");
|
||||
set_optab_libfunc (ne_optab, TFmode, "_Q_fne");
|
||||
set_optab_libfunc (gt_optab, TFmode, "_Q_fgt");
|
||||
set_optab_libfunc (ge_optab, TFmode, "_Q_fge");
|
||||
set_optab_libfunc (lt_optab, TFmode, "_Q_flt");
|
||||
set_optab_libfunc (le_optab, TFmode, "_Q_fle");
|
||||
|
||||
trunctfsf2_libfunc = init_one_libfunc ("_Q_qtos");
|
||||
trunctfdf2_libfunc = init_one_libfunc ("_Q_qtod");
|
||||
|
@ -53,46 +53,6 @@ enum libfunc_index
|
||||
LTI_unwind_sjlj_register,
|
||||
LTI_unwind_sjlj_unregister,
|
||||
|
||||
LTI_eqhf2,
|
||||
LTI_nehf2,
|
||||
LTI_gthf2,
|
||||
LTI_gehf2,
|
||||
LTI_lthf2,
|
||||
LTI_lehf2,
|
||||
LTI_unordhf2,
|
||||
|
||||
LTI_eqsf2,
|
||||
LTI_nesf2,
|
||||
LTI_gtsf2,
|
||||
LTI_gesf2,
|
||||
LTI_ltsf2,
|
||||
LTI_lesf2,
|
||||
LTI_unordsf2,
|
||||
|
||||
LTI_eqdf2,
|
||||
LTI_nedf2,
|
||||
LTI_gtdf2,
|
||||
LTI_gedf2,
|
||||
LTI_ltdf2,
|
||||
LTI_ledf2,
|
||||
LTI_unorddf2,
|
||||
|
||||
LTI_eqxf2,
|
||||
LTI_nexf2,
|
||||
LTI_gtxf2,
|
||||
LTI_gexf2,
|
||||
LTI_ltxf2,
|
||||
LTI_lexf2,
|
||||
LTI_unordxf2,
|
||||
|
||||
LTI_eqtf2,
|
||||
LTI_netf2,
|
||||
LTI_gttf2,
|
||||
LTI_getf2,
|
||||
LTI_lttf2,
|
||||
LTI_letf2,
|
||||
LTI_unordtf2,
|
||||
|
||||
LTI_floatsisf,
|
||||
LTI_floatdisf,
|
||||
LTI_floattisf,
|
||||
@ -185,46 +145,6 @@ extern GTY(()) rtx libfunc_table[LTI_MAX];
|
||||
#define unwind_sjlj_unregister_libfunc \
|
||||
(libfunc_table[LTI_unwind_sjlj_unregister])
|
||||
|
||||
#define eqhf2_libfunc (libfunc_table[LTI_eqhf2])
|
||||
#define nehf2_libfunc (libfunc_table[LTI_nehf2])
|
||||
#define gthf2_libfunc (libfunc_table[LTI_gthf2])
|
||||
#define gehf2_libfunc (libfunc_table[LTI_gehf2])
|
||||
#define lthf2_libfunc (libfunc_table[LTI_lthf2])
|
||||
#define lehf2_libfunc (libfunc_table[LTI_lehf2])
|
||||
#define unordhf2_libfunc (libfunc_table[LTI_unordhf2])
|
||||
|
||||
#define eqsf2_libfunc (libfunc_table[LTI_eqsf2])
|
||||
#define nesf2_libfunc (libfunc_table[LTI_nesf2])
|
||||
#define gtsf2_libfunc (libfunc_table[LTI_gtsf2])
|
||||
#define gesf2_libfunc (libfunc_table[LTI_gesf2])
|
||||
#define ltsf2_libfunc (libfunc_table[LTI_ltsf2])
|
||||
#define lesf2_libfunc (libfunc_table[LTI_lesf2])
|
||||
#define unordsf2_libfunc (libfunc_table[LTI_unordsf2])
|
||||
|
||||
#define eqdf2_libfunc (libfunc_table[LTI_eqdf2])
|
||||
#define nedf2_libfunc (libfunc_table[LTI_nedf2])
|
||||
#define gtdf2_libfunc (libfunc_table[LTI_gtdf2])
|
||||
#define gedf2_libfunc (libfunc_table[LTI_gedf2])
|
||||
#define ltdf2_libfunc (libfunc_table[LTI_ltdf2])
|
||||
#define ledf2_libfunc (libfunc_table[LTI_ledf2])
|
||||
#define unorddf2_libfunc (libfunc_table[LTI_unorddf2])
|
||||
|
||||
#define eqxf2_libfunc (libfunc_table[LTI_eqxf2])
|
||||
#define nexf2_libfunc (libfunc_table[LTI_nexf2])
|
||||
#define gtxf2_libfunc (libfunc_table[LTI_gtxf2])
|
||||
#define gexf2_libfunc (libfunc_table[LTI_gexf2])
|
||||
#define ltxf2_libfunc (libfunc_table[LTI_ltxf2])
|
||||
#define lexf2_libfunc (libfunc_table[LTI_lexf2])
|
||||
#define unordxf2_libfunc (libfunc_table[LTI_unordxf2])
|
||||
|
||||
#define eqtf2_libfunc (libfunc_table[LTI_eqtf2])
|
||||
#define netf2_libfunc (libfunc_table[LTI_netf2])
|
||||
#define gttf2_libfunc (libfunc_table[LTI_gttf2])
|
||||
#define getf2_libfunc (libfunc_table[LTI_getf2])
|
||||
#define lttf2_libfunc (libfunc_table[LTI_lttf2])
|
||||
#define letf2_libfunc (libfunc_table[LTI_letf2])
|
||||
#define unordtf2_libfunc (libfunc_table[LTI_unordtf2])
|
||||
|
||||
#define floatsisf_libfunc (libfunc_table[LTI_floatsisf])
|
||||
#define floatdisf_libfunc (libfunc_table[LTI_floatdisf])
|
||||
#define floattisf_libfunc (libfunc_table[LTI_floattisf])
|
||||
|
397
gcc/optabs.c
397
gcc/optabs.c
@ -3872,336 +3872,47 @@ prepare_float_lib_cmp (rtx *px, rtx *py, enum rtx_code *pcomparison,
|
||||
enum machine_mode *pmode, int *punsignedp)
|
||||
{
|
||||
enum rtx_code comparison = *pcomparison;
|
||||
rtx tmp;
|
||||
rtx x = *px = protect_from_queue (*px, 0);
|
||||
rtx y = *py = protect_from_queue (*py, 0);
|
||||
enum machine_mode mode = GET_MODE (x);
|
||||
enum rtx_code swapped = swap_condition (comparison);
|
||||
rtx x = protect_from_queue (*px, 0);
|
||||
rtx y = protect_from_queue (*py, 0);
|
||||
enum machine_mode orig_mode = GET_MODE (x);
|
||||
enum machine_mode mode;
|
||||
rtx libfunc = 0;
|
||||
rtx result;
|
||||
|
||||
if (mode == HFmode)
|
||||
switch (comparison)
|
||||
{
|
||||
case EQ:
|
||||
libfunc = eqhf2_libfunc;
|
||||
break;
|
||||
|
||||
case NE:
|
||||
libfunc = nehf2_libfunc;
|
||||
break;
|
||||
|
||||
case GT:
|
||||
libfunc = gthf2_libfunc;
|
||||
if (libfunc == NULL_RTX)
|
||||
{
|
||||
tmp = x; x = y; y = tmp;
|
||||
*pcomparison = LT;
|
||||
libfunc = lthf2_libfunc;
|
||||
}
|
||||
break;
|
||||
|
||||
case GE:
|
||||
libfunc = gehf2_libfunc;
|
||||
if (libfunc == NULL_RTX)
|
||||
{
|
||||
tmp = x; x = y; y = tmp;
|
||||
*pcomparison = LE;
|
||||
libfunc = lehf2_libfunc;
|
||||
}
|
||||
break;
|
||||
|
||||
case LT:
|
||||
libfunc = lthf2_libfunc;
|
||||
if (libfunc == NULL_RTX)
|
||||
{
|
||||
tmp = x; x = y; y = tmp;
|
||||
*pcomparison = GT;
|
||||
libfunc = gthf2_libfunc;
|
||||
}
|
||||
break;
|
||||
|
||||
case LE:
|
||||
libfunc = lehf2_libfunc;
|
||||
if (libfunc == NULL_RTX)
|
||||
{
|
||||
tmp = x; x = y; y = tmp;
|
||||
*pcomparison = GE;
|
||||
libfunc = gehf2_libfunc;
|
||||
}
|
||||
break;
|
||||
|
||||
case UNORDERED:
|
||||
libfunc = unordhf2_libfunc;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
else if (mode == SFmode)
|
||||
switch (comparison)
|
||||
{
|
||||
case EQ:
|
||||
libfunc = eqsf2_libfunc;
|
||||
break;
|
||||
|
||||
case NE:
|
||||
libfunc = nesf2_libfunc;
|
||||
break;
|
||||
|
||||
case GT:
|
||||
libfunc = gtsf2_libfunc;
|
||||
if (libfunc == NULL_RTX)
|
||||
{
|
||||
tmp = x; x = y; y = tmp;
|
||||
*pcomparison = LT;
|
||||
libfunc = ltsf2_libfunc;
|
||||
}
|
||||
break;
|
||||
|
||||
case GE:
|
||||
libfunc = gesf2_libfunc;
|
||||
if (libfunc == NULL_RTX)
|
||||
{
|
||||
tmp = x; x = y; y = tmp;
|
||||
*pcomparison = LE;
|
||||
libfunc = lesf2_libfunc;
|
||||
}
|
||||
break;
|
||||
|
||||
case LT:
|
||||
libfunc = ltsf2_libfunc;
|
||||
if (libfunc == NULL_RTX)
|
||||
{
|
||||
tmp = x; x = y; y = tmp;
|
||||
*pcomparison = GT;
|
||||
libfunc = gtsf2_libfunc;
|
||||
}
|
||||
break;
|
||||
|
||||
case LE:
|
||||
libfunc = lesf2_libfunc;
|
||||
if (libfunc == NULL_RTX)
|
||||
{
|
||||
tmp = x; x = y; y = tmp;
|
||||
*pcomparison = GE;
|
||||
libfunc = gesf2_libfunc;
|
||||
}
|
||||
break;
|
||||
|
||||
case UNORDERED:
|
||||
libfunc = unordsf2_libfunc;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
else if (mode == DFmode)
|
||||
switch (comparison)
|
||||
{
|
||||
case EQ:
|
||||
libfunc = eqdf2_libfunc;
|
||||
break;
|
||||
|
||||
case NE:
|
||||
libfunc = nedf2_libfunc;
|
||||
break;
|
||||
|
||||
case GT:
|
||||
libfunc = gtdf2_libfunc;
|
||||
if (libfunc == NULL_RTX)
|
||||
{
|
||||
tmp = x; x = y; y = tmp;
|
||||
*pcomparison = LT;
|
||||
libfunc = ltdf2_libfunc;
|
||||
}
|
||||
break;
|
||||
|
||||
case GE:
|
||||
libfunc = gedf2_libfunc;
|
||||
if (libfunc == NULL_RTX)
|
||||
{
|
||||
tmp = x; x = y; y = tmp;
|
||||
*pcomparison = LE;
|
||||
libfunc = ledf2_libfunc;
|
||||
}
|
||||
break;
|
||||
|
||||
case LT:
|
||||
libfunc = ltdf2_libfunc;
|
||||
if (libfunc == NULL_RTX)
|
||||
{
|
||||
tmp = x; x = y; y = tmp;
|
||||
*pcomparison = GT;
|
||||
libfunc = gtdf2_libfunc;
|
||||
}
|
||||
break;
|
||||
|
||||
case LE:
|
||||
libfunc = ledf2_libfunc;
|
||||
if (libfunc == NULL_RTX)
|
||||
{
|
||||
tmp = x; x = y; y = tmp;
|
||||
*pcomparison = GE;
|
||||
libfunc = gedf2_libfunc;
|
||||
}
|
||||
break;
|
||||
|
||||
case UNORDERED:
|
||||
libfunc = unorddf2_libfunc;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
else if (mode == XFmode)
|
||||
switch (comparison)
|
||||
{
|
||||
case EQ:
|
||||
libfunc = eqxf2_libfunc;
|
||||
break;
|
||||
|
||||
case NE:
|
||||
libfunc = nexf2_libfunc;
|
||||
break;
|
||||
|
||||
case GT:
|
||||
libfunc = gtxf2_libfunc;
|
||||
if (libfunc == NULL_RTX)
|
||||
{
|
||||
tmp = x; x = y; y = tmp;
|
||||
*pcomparison = LT;
|
||||
libfunc = ltxf2_libfunc;
|
||||
}
|
||||
break;
|
||||
|
||||
case GE:
|
||||
libfunc = gexf2_libfunc;
|
||||
if (libfunc == NULL_RTX)
|
||||
{
|
||||
tmp = x; x = y; y = tmp;
|
||||
*pcomparison = LE;
|
||||
libfunc = lexf2_libfunc;
|
||||
}
|
||||
break;
|
||||
|
||||
case LT:
|
||||
libfunc = ltxf2_libfunc;
|
||||
if (libfunc == NULL_RTX)
|
||||
{
|
||||
tmp = x; x = y; y = tmp;
|
||||
*pcomparison = GT;
|
||||
libfunc = gtxf2_libfunc;
|
||||
}
|
||||
break;
|
||||
|
||||
case LE:
|
||||
libfunc = lexf2_libfunc;
|
||||
if (libfunc == NULL_RTX)
|
||||
{
|
||||
tmp = x; x = y; y = tmp;
|
||||
*pcomparison = GE;
|
||||
libfunc = gexf2_libfunc;
|
||||
}
|
||||
break;
|
||||
|
||||
case UNORDERED:
|
||||
libfunc = unordxf2_libfunc;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
else if (mode == TFmode)
|
||||
switch (comparison)
|
||||
{
|
||||
case EQ:
|
||||
libfunc = eqtf2_libfunc;
|
||||
break;
|
||||
|
||||
case NE:
|
||||
libfunc = netf2_libfunc;
|
||||
break;
|
||||
|
||||
case GT:
|
||||
libfunc = gttf2_libfunc;
|
||||
if (libfunc == NULL_RTX)
|
||||
{
|
||||
tmp = x; x = y; y = tmp;
|
||||
*pcomparison = LT;
|
||||
libfunc = lttf2_libfunc;
|
||||
}
|
||||
break;
|
||||
|
||||
case GE:
|
||||
libfunc = getf2_libfunc;
|
||||
if (libfunc == NULL_RTX)
|
||||
{
|
||||
tmp = x; x = y; y = tmp;
|
||||
*pcomparison = LE;
|
||||
libfunc = letf2_libfunc;
|
||||
}
|
||||
break;
|
||||
|
||||
case LT:
|
||||
libfunc = lttf2_libfunc;
|
||||
if (libfunc == NULL_RTX)
|
||||
{
|
||||
tmp = x; x = y; y = tmp;
|
||||
*pcomparison = GT;
|
||||
libfunc = gttf2_libfunc;
|
||||
}
|
||||
break;
|
||||
|
||||
case LE:
|
||||
libfunc = letf2_libfunc;
|
||||
if (libfunc == NULL_RTX)
|
||||
{
|
||||
tmp = x; x = y; y = tmp;
|
||||
*pcomparison = GE;
|
||||
libfunc = getf2_libfunc;
|
||||
}
|
||||
break;
|
||||
|
||||
case UNORDERED:
|
||||
libfunc = unordtf2_libfunc;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
else
|
||||
for (mode = orig_mode; mode != VOIDmode; mode = GET_MODE_WIDER_MODE (mode))
|
||||
{
|
||||
enum machine_mode wider_mode;
|
||||
if ((libfunc = code_to_optab[comparison]->handlers[mode].libfunc))
|
||||
break;
|
||||
|
||||
for (wider_mode = GET_MODE_WIDER_MODE (mode); wider_mode != VOIDmode;
|
||||
wider_mode = GET_MODE_WIDER_MODE (wider_mode))
|
||||
if ((libfunc = code_to_optab[swapped]->handlers[mode].libfunc))
|
||||
{
|
||||
if ((cmp_optab->handlers[(int) wider_mode].insn_code
|
||||
!= CODE_FOR_nothing)
|
||||
|| (cmp_optab->handlers[(int) wider_mode].libfunc != 0))
|
||||
{
|
||||
x = protect_from_queue (x, 0);
|
||||
y = protect_from_queue (y, 0);
|
||||
*px = convert_to_mode (wider_mode, x, 0);
|
||||
*py = convert_to_mode (wider_mode, y, 0);
|
||||
prepare_float_lib_cmp (px, py, pcomparison, pmode, punsignedp);
|
||||
return;
|
||||
}
|
||||
rtx tmp;
|
||||
tmp = x; x = y; y = tmp;
|
||||
comparison = swapped;
|
||||
break;
|
||||
}
|
||||
abort ();
|
||||
}
|
||||
|
||||
if (libfunc == 0)
|
||||
if (mode == VOIDmode)
|
||||
abort ();
|
||||
|
||||
if (mode != orig_mode)
|
||||
{
|
||||
x = convert_to_mode (mode, x, 0);
|
||||
y = convert_to_mode (mode, y, 0);
|
||||
}
|
||||
|
||||
if (comparison == UNORDERED
|
||||
|| FLOAT_LIB_COMPARE_RETURNS_BOOL (mode, comparison))
|
||||
comparison = NE;
|
||||
|
||||
result = emit_library_call_value (libfunc, NULL_RTX, LCT_CONST_MAKE_BLOCK,
|
||||
word_mode, 2, x, mode, y, mode);
|
||||
*px = result;
|
||||
*py = const0_rtx;
|
||||
*pmode = word_mode;
|
||||
if (comparison == UNORDERED
|
||||
|| FLOAT_LIB_COMPARE_RETURNS_BOOL (mode, comparison))
|
||||
*pcomparison = NE;
|
||||
*pcomparison = comparison;
|
||||
*punsignedp = 0;
|
||||
}
|
||||
|
||||
@ -5430,6 +5141,15 @@ init_optabs (void)
|
||||
|
||||
ucmp_optab = init_optab (UNKNOWN);
|
||||
tst_optab = init_optab (UNKNOWN);
|
||||
|
||||
eq_optab = init_optab (EQ);
|
||||
ne_optab = init_optab (NE);
|
||||
gt_optab = init_optab (GT);
|
||||
ge_optab = init_optab (GE);
|
||||
lt_optab = init_optab (LT);
|
||||
le_optab = init_optab (LE);
|
||||
unord_optab = init_optab (UNORDERED);
|
||||
|
||||
neg_optab = init_optab (NEG);
|
||||
negv_optab = init_optabv (NEG);
|
||||
abs_optab = init_optab (ABS);
|
||||
@ -5530,6 +5250,15 @@ init_optabs (void)
|
||||
init_integral_libfuncs (ucmp_optab, "ucmp", '2');
|
||||
init_floating_libfuncs (cmp_optab, "cmp", '2');
|
||||
|
||||
/* EQ etc are floating point only. */
|
||||
init_floating_libfuncs (eq_optab, "eq", '2');
|
||||
init_floating_libfuncs (ne_optab, "ne", '2');
|
||||
init_floating_libfuncs (gt_optab, "gt", '2');
|
||||
init_floating_libfuncs (ge_optab, "ge", '2');
|
||||
init_floating_libfuncs (lt_optab, "lt", '2');
|
||||
init_floating_libfuncs (le_optab, "le", '2');
|
||||
init_floating_libfuncs (unord_optab, "unord", '2');
|
||||
|
||||
/* Use cabs for DC complex abs, since systems generally have cabs.
|
||||
Don't define any libcall for SCmode, so that cabs will be used. */
|
||||
abs_optab->handlers[(int) DCmode].libfunc
|
||||
@ -5575,46 +5304,6 @@ init_optabs (void)
|
||||
unwind_sjlj_unregister_libfunc
|
||||
= init_one_libfunc ("_Unwind_SjLj_Unregister");
|
||||
|
||||
eqhf2_libfunc = init_one_libfunc ("__eqhf2");
|
||||
nehf2_libfunc = init_one_libfunc ("__nehf2");
|
||||
gthf2_libfunc = init_one_libfunc ("__gthf2");
|
||||
gehf2_libfunc = init_one_libfunc ("__gehf2");
|
||||
lthf2_libfunc = init_one_libfunc ("__lthf2");
|
||||
lehf2_libfunc = init_one_libfunc ("__lehf2");
|
||||
unordhf2_libfunc = init_one_libfunc ("__unordhf2");
|
||||
|
||||
eqsf2_libfunc = init_one_libfunc ("__eqsf2");
|
||||
nesf2_libfunc = init_one_libfunc ("__nesf2");
|
||||
gtsf2_libfunc = init_one_libfunc ("__gtsf2");
|
||||
gesf2_libfunc = init_one_libfunc ("__gesf2");
|
||||
ltsf2_libfunc = init_one_libfunc ("__ltsf2");
|
||||
lesf2_libfunc = init_one_libfunc ("__lesf2");
|
||||
unordsf2_libfunc = init_one_libfunc ("__unordsf2");
|
||||
|
||||
eqdf2_libfunc = init_one_libfunc ("__eqdf2");
|
||||
nedf2_libfunc = init_one_libfunc ("__nedf2");
|
||||
gtdf2_libfunc = init_one_libfunc ("__gtdf2");
|
||||
gedf2_libfunc = init_one_libfunc ("__gedf2");
|
||||
ltdf2_libfunc = init_one_libfunc ("__ltdf2");
|
||||
ledf2_libfunc = init_one_libfunc ("__ledf2");
|
||||
unorddf2_libfunc = init_one_libfunc ("__unorddf2");
|
||||
|
||||
eqxf2_libfunc = init_one_libfunc ("__eqxf2");
|
||||
nexf2_libfunc = init_one_libfunc ("__nexf2");
|
||||
gtxf2_libfunc = init_one_libfunc ("__gtxf2");
|
||||
gexf2_libfunc = init_one_libfunc ("__gexf2");
|
||||
ltxf2_libfunc = init_one_libfunc ("__ltxf2");
|
||||
lexf2_libfunc = init_one_libfunc ("__lexf2");
|
||||
unordxf2_libfunc = init_one_libfunc ("__unordxf2");
|
||||
|
||||
eqtf2_libfunc = init_one_libfunc ("__eqtf2");
|
||||
netf2_libfunc = init_one_libfunc ("__netf2");
|
||||
gttf2_libfunc = init_one_libfunc ("__gttf2");
|
||||
getf2_libfunc = init_one_libfunc ("__getf2");
|
||||
lttf2_libfunc = init_one_libfunc ("__lttf2");
|
||||
letf2_libfunc = init_one_libfunc ("__letf2");
|
||||
unordtf2_libfunc = init_one_libfunc ("__unordtf2");
|
||||
|
||||
floatsisf_libfunc = init_one_libfunc ("__floatsisf");
|
||||
floatdisf_libfunc = init_one_libfunc ("__floatdisf");
|
||||
floattisf_libfunc = init_one_libfunc ("__floattisf");
|
||||
|
17
gcc/optabs.h
17
gcc/optabs.h
@ -161,6 +161,15 @@ enum optab_index
|
||||
/* tst insn; compare one operand against 0 */
|
||||
OTI_tst,
|
||||
|
||||
/* Floating point comparison optabs - used primarily for libfuncs */
|
||||
OTI_eq,
|
||||
OTI_ne,
|
||||
OTI_gt,
|
||||
OTI_ge,
|
||||
OTI_lt,
|
||||
OTI_le,
|
||||
OTI_unord,
|
||||
|
||||
/* String length */
|
||||
OTI_strlen,
|
||||
|
||||
@ -243,6 +252,14 @@ extern GTY(()) optab optab_table[OTI_MAX];
|
||||
#define ucmp_optab (optab_table[OTI_ucmp])
|
||||
#define tst_optab (optab_table[OTI_tst])
|
||||
|
||||
#define eq_optab (optab_table[OTI_eq])
|
||||
#define ne_optab (optab_table[OTI_ne])
|
||||
#define gt_optab (optab_table[OTI_gt])
|
||||
#define ge_optab (optab_table[OTI_ge])
|
||||
#define lt_optab (optab_table[OTI_lt])
|
||||
#define le_optab (optab_table[OTI_le])
|
||||
#define unord_optab (optab_table[OTI_unord])
|
||||
|
||||
#define strlen_optab (optab_table[OTI_strlen])
|
||||
|
||||
#define cbranch_optab (optab_table[OTI_cbranch])
|
||||
|
Loading…
x
Reference in New Issue
Block a user