2012-07-24 20:28:15 +02:00
|
|
|
/* Definitions for operation tables, or "optabs".
|
2017-01-01 13:07:43 +01:00
|
|
|
Copyright (C) 1987-2017 Free Software Foundation, Inc.
|
2012-07-24 20:28:15 +02:00
|
|
|
|
|
|
|
This file is part of GCC.
|
|
|
|
|
|
|
|
GCC is free software; you can redistribute it and/or modify it under
|
|
|
|
the terms of the GNU General Public License as published by the Free
|
|
|
|
Software Foundation; either version 3, or (at your option) any later
|
|
|
|
version.
|
|
|
|
|
|
|
|
GCC is distributed in the hope that it will be useful, but WITHOUT ANY
|
|
|
|
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
|
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
|
|
for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
|
|
along with GCC; see the file COPYING3. If not see
|
|
|
|
<http://www.gnu.org/licenses/>. */
|
|
|
|
|
Check for invalid FAILs
This patch makes it a compile-time error for an internal-fn optab
to FAIL. There are certainly other optabs and patterns besides these
that aren't allowed to fail, but this at least deals with the immediate
point of controversy.
Tested normally on x86_64-linux-gnu. Also tested by building one
configuration per cpu directory. arc-elf and pdp11 didn't build
for unrelated reasons, but I checked that insn-emit.o built for
both without error.
gcc/
* Makefile.in (GENSUPPORT_H): New macro.
(build/gensupport.o, build/read-rtl.o, build/genattr.o)
(build/genattr-common.o, build/genattrtab.o, build/genautomata.o)
(build/gencodes.o, build/genconditions.o, build/genconfig.o)
(build/genconstants.o, build/genextract.o, build/genflags.o)
(build/gentarget-def.o): Use it.
(build/genemit.o): Likewise. Depend on internal-fn.def.
* genopinit.c: Move block comment to optabs.def.
(optab_tag, optab_def): Move to gensupport.h
(pattern): Likewise, renaming to optab_pattern.
(match_pattern): Move to gensupport.c
(gen_insn): Use find_optab.
(patterns, pattern_cmp): Replace pattern with optab_pattern.
(main): Likewise. Use num_optabs.
* optabs.def: Add comment that was previously in genopinit.c.
* gensupport.h (optab_tag): Moved from genopinit.c
(optab_def): Likewise, expanding commentary.
(optab_pattern): Likewise, after renaming from pattern.
(optabs, num_optabs, find_optab): Declare.
* gensupport.c (optabs): Moved from genopinit.c.
(num_optabs): New variable.
(match_pattern): Moved from genopinit.c.
(find_optab): New function, extracted from genopinit.c:gen_insn.
* genemit.c (nofail_optabs): New variable.
(emit_c_code): New function.
(gen_expand): Check whether the instruction is an optab that isn't
allowed to fail. Call emit_c_code.
(gen_split): Call emit_c_code here too.
(main): Initialize nofail_optabs. Don't emit FAIL and DONE here.
From-SVN: r231160
2015-12-02 10:06:28 +01:00
|
|
|
/* The entries in optabs.def are categorized:
|
|
|
|
C: A "conversion" optab, which uses two modes; has libcall data.
|
|
|
|
N: A "normal" optab, which uses one mode; has libcall data.
|
|
|
|
D: A "direct" optab, which uses one mode; does not have libcall data.
|
|
|
|
V: An "oVerflow" optab. Like N, but does not record its code in
|
|
|
|
code_to_optab.
|
|
|
|
|
|
|
|
CX, NX, VX: An extra pattern entry for a conversion or normal optab.
|
|
|
|
|
|
|
|
These patterns may be present in the MD file with names that contain
|
|
|
|
the mode(s) used and the name of the operation. This array contains
|
|
|
|
a list of optabs that need to be initialized. Within each name,
|
|
|
|
$a and $b are used to match a short mode name (the part of the mode
|
|
|
|
name not including `mode' and converted to lower-case).
|
|
|
|
|
|
|
|
$I means that only full integer modes should be considered for the
|
|
|
|
next mode, and $F means that only float modes should be considered.
|
|
|
|
$P means that both full and partial integer modes should be considered.
|
|
|
|
$Q means that only fixed-point modes should be considered.
|
|
|
|
|
|
|
|
The pattern may be NULL if the optab exists only for the libcalls
|
|
|
|
that we plan to attach to it, and there are no named patterns in
|
|
|
|
the md files. */
|
2012-07-24 20:28:15 +02:00
|
|
|
|
|
|
|
/* The extension libcalls are used for float extension. */
|
|
|
|
OPTAB_CL(sext_optab, "extend$b$a2", SIGN_EXTEND, "extend", gen_extend_conv_libfunc)
|
|
|
|
OPTAB_CL(trunc_optab, "trunc$b$a2", TRUNCATE, "trunc", gen_trunc_conv_libfunc)
|
|
|
|
OPTAB_CL(zext_optab, "zero_extend$b$a2", ZERO_EXTEND, NULL, NULL)
|
|
|
|
|
|
|
|
OPTAB_CL(sfix_optab, "fix$F$b$I$a2", FIX, "fix", gen_fp_to_int_conv_libfunc)
|
|
|
|
OPTAB_CL(ufix_optab, "fixuns$F$b$a2", UNSIGNED_FIX, "fixuns", gen_fp_to_int_conv_libfunc)
|
|
|
|
OPTAB_CL(sfloat_optab, "float$I$b$F$a2", FLOAT, "float", gen_int_to_fp_conv_libfunc)
|
|
|
|
OPTAB_CL(ufloat_optab, "floatuns$I$b$F$a2", UNSIGNED_FLOAT, NULL, gen_ufloat_conv_libfunc)
|
|
|
|
|
|
|
|
OPTAB_CL(lrint_optab, "lrint$F$b$I$a2", UNKNOWN, "lrint", gen_int_to_fp_nondecimal_conv_libfunc)
|
|
|
|
OPTAB_CL(lround_optab, "lround$F$b$I$a2", UNKNOWN, "lround", gen_int_to_fp_nondecimal_conv_libfunc)
|
|
|
|
OPTAB_CL(lfloor_optab, "lfloor$F$b$I$a2", UNKNOWN, "lfloor", gen_int_to_fp_nondecimal_conv_libfunc)
|
|
|
|
OPTAB_CL(lceil_optab, "lceil$F$b$I$a2", UNKNOWN, "lceil", gen_int_to_fp_nondecimal_conv_libfunc)
|
|
|
|
|
|
|
|
/* Conversions for fixed-point modes and other modes. */
|
|
|
|
OPTAB_CL(fract_optab, "fract$b$a2", FRACT_CONVERT, "fract", gen_fract_conv_libfunc)
|
|
|
|
OPTAB_CL(fractuns_optab, "fractuns$I$b$Q$a2", UNSIGNED_FRACT_CONVERT, "fractuns", gen_fractuns_conv_libfunc)
|
|
|
|
OPTAB_CX(fractuns_optab, "fractuns$Q$b$I$a2")
|
|
|
|
OPTAB_CL(satfract_optab, "satfract$b$Q$a2", SAT_FRACT, "satfract", gen_satfract_conv_libfunc)
|
|
|
|
OPTAB_CL(satfractuns_optab, "satfractuns$I$b$Q$a2", UNSIGNED_SAT_FRACT, "satfractuns", gen_satfractuns_conv_libfunc)
|
|
|
|
|
|
|
|
OPTAB_CD(sfixtrunc_optab, "fix_trunc$F$b$I$a2")
|
|
|
|
OPTAB_CD(ufixtrunc_optab, "fixuns_trunc$F$b$I$a2")
|
|
|
|
|
|
|
|
/* Misc optabs that use two modes; model them as "conversions". */
|
|
|
|
OPTAB_CD(smul_widen_optab, "mul$b$a3")
|
|
|
|
OPTAB_CD(umul_widen_optab, "umul$b$a3")
|
|
|
|
OPTAB_CD(usmul_widen_optab, "usmul$b$a3")
|
|
|
|
OPTAB_CD(smadd_widen_optab, "madd$b$a4")
|
|
|
|
OPTAB_CD(umadd_widen_optab, "umadd$b$a4")
|
|
|
|
OPTAB_CD(ssmadd_widen_optab, "ssmadd$b$a4")
|
|
|
|
OPTAB_CD(usmadd_widen_optab, "usmadd$b$a4")
|
|
|
|
OPTAB_CD(smsub_widen_optab, "msub$b$a4")
|
|
|
|
OPTAB_CD(umsub_widen_optab, "umsub$b$a4")
|
|
|
|
OPTAB_CD(ssmsub_widen_optab, "ssmsub$b$a4")
|
|
|
|
OPTAB_CD(usmsub_widen_optab, "usmsub$a$b4")
|
|
|
|
OPTAB_CD(vec_load_lanes_optab, "vec_load_lanes$a$b")
|
|
|
|
OPTAB_CD(vec_store_lanes_optab, "vec_store_lanes$a$b")
|
|
|
|
OPTAB_CD(vcond_optab, "vcond$a$b")
|
|
|
|
OPTAB_CD(vcondu_optab, "vcondu$a$b")
|
re PR target/78102 (GCC refuses to generate PCMPEQQ instruction for SSE4.1)
PR target/78102
* optabs.def (vcondeq_optab, vec_cmpeq_optab): New optabs.
* optabs.c (expand_vec_cond_expr): For comparison codes
EQ_EXPR and NE_EXPR, attempt vcondeq_optab as fallback.
(expand_vec_cmp_expr): For comparison codes
EQ_EXPR and NE_EXPR, attempt vec_cmpeq_optab as fallback.
* optabs-tree.h (expand_vec_cmp_expr_p, expand_vec_cond_expr_p):
Add enum tree_code argument.
* optabs-query.h (get_vec_cmp_eq_icode, get_vcond_eq_icode): New
inline functions.
* optabs-tree.c (expand_vec_cmp_expr_p): Add CODE argument. For
CODE EQ_EXPR or NE_EXPR, attempt to use vec_cmpeq_optab as
fallback.
(expand_vec_cond_expr_p): Add CODE argument. For CODE EQ_EXPR or
NE_EXPR, attempt to use vcondeq_optab as fallback.
* tree-vect-generic.c (expand_vector_comparison,
expand_vector_divmod, expand_vector_condition): Adjust
expand_vec_cmp_expr_p and expand_vec_cond_expr_p callers.
* tree-vect-stmts.c (vectorizable_condition,
vectorizable_comparison): Likewise.
* tree-vect-patterns.c (vect_recog_mixed_size_cond_pattern,
check_bool_pattern, search_type_for_mask_1): Likewise.
* expr.c (do_store_flag): Likewise.
* doc/md.texi (@code{vec_cmpeq@var{m}@var{n}},
@code{vcondeq@var{m}@var{n}}): Document.
* config/i386/sse.md (vec_cmpeqv2div2di, vcondeq<VI8F_128:mode>v2di):
New expanders.
testsuite/
* gcc.target/i386/pr78102.c: New test.
From-SVN: r241525
2016-10-25 18:26:12 +02:00
|
|
|
OPTAB_CD(vcondeq_optab, "vcondeq$a$b")
|
2015-11-10 13:14:19 +01:00
|
|
|
OPTAB_CD(vcond_mask_optab, "vcond_mask_$a$b")
|
2015-11-10 12:57:34 +01:00
|
|
|
OPTAB_CD(vec_cmp_optab, "vec_cmp$a$b")
|
|
|
|
OPTAB_CD(vec_cmpu_optab, "vec_cmpu$a$b")
|
re PR target/78102 (GCC refuses to generate PCMPEQQ instruction for SSE4.1)
PR target/78102
* optabs.def (vcondeq_optab, vec_cmpeq_optab): New optabs.
* optabs.c (expand_vec_cond_expr): For comparison codes
EQ_EXPR and NE_EXPR, attempt vcondeq_optab as fallback.
(expand_vec_cmp_expr): For comparison codes
EQ_EXPR and NE_EXPR, attempt vec_cmpeq_optab as fallback.
* optabs-tree.h (expand_vec_cmp_expr_p, expand_vec_cond_expr_p):
Add enum tree_code argument.
* optabs-query.h (get_vec_cmp_eq_icode, get_vcond_eq_icode): New
inline functions.
* optabs-tree.c (expand_vec_cmp_expr_p): Add CODE argument. For
CODE EQ_EXPR or NE_EXPR, attempt to use vec_cmpeq_optab as
fallback.
(expand_vec_cond_expr_p): Add CODE argument. For CODE EQ_EXPR or
NE_EXPR, attempt to use vcondeq_optab as fallback.
* tree-vect-generic.c (expand_vector_comparison,
expand_vector_divmod, expand_vector_condition): Adjust
expand_vec_cmp_expr_p and expand_vec_cond_expr_p callers.
* tree-vect-stmts.c (vectorizable_condition,
vectorizable_comparison): Likewise.
* tree-vect-patterns.c (vect_recog_mixed_size_cond_pattern,
check_bool_pattern, search_type_for_mask_1): Likewise.
* expr.c (do_store_flag): Likewise.
* doc/md.texi (@code{vec_cmpeq@var{m}@var{n}},
@code{vcondeq@var{m}@var{n}}): Document.
* config/i386/sse.md (vec_cmpeqv2div2di, vcondeq<VI8F_128:mode>v2di):
New expanders.
testsuite/
* gcc.target/i386/pr78102.c: New test.
From-SVN: r241525
2016-10-25 18:26:12 +02:00
|
|
|
OPTAB_CD(vec_cmpeq_optab, "vec_cmpeq$a$b")
|
2015-11-10 13:06:05 +01:00
|
|
|
OPTAB_CD(maskload_optab, "maskload$a$b")
|
|
|
|
OPTAB_CD(maskstore_optab, "maskstore$a$b")
|
2012-07-24 20:28:15 +02:00
|
|
|
|
|
|
|
OPTAB_NL(add_optab, "add$P$a3", PLUS, "add", '3', gen_int_fp_fixed_libfunc)
|
|
|
|
OPTAB_NX(add_optab, "add$F$a3")
|
|
|
|
OPTAB_NX(add_optab, "add$Q$a3")
|
|
|
|
OPTAB_VL(addv_optab, "addv$I$a3", PLUS, "add", '3', gen_intv_fp_libfunc)
|
|
|
|
OPTAB_VX(addv_optab, "add$F$a3")
|
|
|
|
OPTAB_NL(ssadd_optab, "ssadd$Q$a3", SS_PLUS, "ssadd", '3', gen_signed_fixed_libfunc)
|
|
|
|
OPTAB_NL(usadd_optab, "usadd$Q$a3", US_PLUS, "usadd", '3', gen_unsigned_fixed_libfunc)
|
|
|
|
OPTAB_NL(sub_optab, "sub$P$a3", MINUS, "sub", '3', gen_int_fp_fixed_libfunc)
|
|
|
|
OPTAB_NX(sub_optab, "sub$F$a3")
|
|
|
|
OPTAB_NX(sub_optab, "sub$Q$a3")
|
|
|
|
OPTAB_VL(subv_optab, "subv$I$a3", MINUS, "sub", '3', gen_intv_fp_libfunc)
|
|
|
|
OPTAB_VX(subv_optab, "sub$F$a3")
|
|
|
|
OPTAB_NL(sssub_optab, "sssub$Q$a3", SS_MINUS, "sssub", '3', gen_signed_fixed_libfunc)
|
|
|
|
OPTAB_NL(ussub_optab, "ussub$Q$a3", US_MINUS, "ussub", '3', gen_unsigned_fixed_libfunc)
|
|
|
|
OPTAB_NL(smul_optab, "mul$Q$a3", MULT, "mul", '3', gen_int_fp_fixed_libfunc)
|
|
|
|
OPTAB_NX(smul_optab, "mul$P$a3")
|
|
|
|
OPTAB_NX(smul_optab, "mul$F$a3")
|
|
|
|
OPTAB_VL(smulv_optab, "mulv$I$a3", MULT, "mul", '3', gen_intv_fp_libfunc)
|
|
|
|
OPTAB_VX(smulv_optab, "mul$F$a3")
|
|
|
|
OPTAB_NL(ssmul_optab, "ssmul$Q$a3", SS_MULT, "ssmul", '3', gen_signed_fixed_libfunc)
|
|
|
|
OPTAB_NL(usmul_optab, "usmul$Q$a3", US_MULT, "usmul", '3', gen_unsigned_fixed_libfunc)
|
|
|
|
OPTAB_NL(sdiv_optab, "div$a3", DIV, "div", '3', gen_int_fp_signed_fixed_libfunc)
|
|
|
|
OPTAB_VL(sdivv_optab, "divv$I$a3", DIV, "divv", '3', gen_int_libfunc)
|
|
|
|
OPTAB_VX(sdivv_optab, "div$F$a3")
|
|
|
|
OPTAB_NL(ssdiv_optab, "ssdiv$Q$a3", SS_DIV, "ssdiv", '3', gen_signed_fixed_libfunc)
|
|
|
|
OPTAB_NL(udiv_optab, "udiv$I$a3", UDIV, "udiv", '3', gen_int_unsigned_fixed_libfunc)
|
|
|
|
OPTAB_NX(udiv_optab, "udiv$Q$a3")
|
|
|
|
OPTAB_NL(usdiv_optab, "usdiv$Q$a3", US_DIV, "usdiv", '3', gen_unsigned_fixed_libfunc)
|
2016-10-14 07:57:33 +02:00
|
|
|
OPTAB_NC(sdivmod_optab, "divmod$a4", UNKNOWN)
|
|
|
|
OPTAB_NC(udivmod_optab, "udivmod$a4", UNKNOWN)
|
2012-07-24 20:28:15 +02:00
|
|
|
OPTAB_NL(smod_optab, "mod$a3", MOD, "mod", '3', gen_int_libfunc)
|
|
|
|
OPTAB_NL(umod_optab, "umod$a3", UMOD, "umod", '3', gen_int_libfunc)
|
|
|
|
OPTAB_NL(ftrunc_optab, "ftrunc$F$a2", UNKNOWN, "ftrunc", '2', gen_fp_libfunc)
|
|
|
|
OPTAB_NL(and_optab, "and$a3", AND, "and", '3', gen_int_libfunc)
|
|
|
|
OPTAB_NL(ior_optab, "ior$a3", IOR, "ior", '3', gen_int_libfunc)
|
|
|
|
OPTAB_NL(xor_optab, "xor$a3", XOR, "xor", '3', gen_int_libfunc)
|
|
|
|
OPTAB_NL(ashl_optab, "ashl$a3", ASHIFT, "ashl", '3', gen_int_fixed_libfunc)
|
|
|
|
OPTAB_NL(ssashl_optab, "ssashl$Q$a3", SS_ASHIFT, "ssashl", '3', gen_signed_fixed_libfunc)
|
|
|
|
OPTAB_NL(usashl_optab, "usashl$Q$a3", US_ASHIFT, "usashl", '3', gen_unsigned_fixed_libfunc)
|
|
|
|
OPTAB_NL(ashr_optab, "ashr$a3", ASHIFTRT, "ashr", '3', gen_int_signed_fixed_libfunc)
|
|
|
|
OPTAB_NL(lshr_optab, "lshr$a3", LSHIFTRT, "lshr", '3', gen_int_unsigned_fixed_libfunc)
|
|
|
|
OPTAB_NC(rotl_optab, "rotl$a3", ROTATE)
|
|
|
|
OPTAB_NC(rotr_optab, "rotr$a3", ROTATERT)
|
|
|
|
OPTAB_VC(vashl_optab, "vashl$a3", ASHIFT)
|
|
|
|
OPTAB_VC(vashr_optab, "vashr$a3", ASHIFTRT)
|
|
|
|
OPTAB_VC(vlshr_optab, "vlshr$a3", LSHIFTRT)
|
|
|
|
OPTAB_VC(vrotl_optab, "vrotl$a3", ROTATE)
|
|
|
|
OPTAB_VC(vrotr_optab, "vrotr$a3", ROTATERT)
|
|
|
|
OPTAB_NL(smin_optab, "smin$a3", SMIN, "min", '3', gen_int_fp_libfunc)
|
|
|
|
OPTAB_NL(smax_optab, "smax$a3", SMAX, "max", '3', gen_int_fp_libfunc)
|
|
|
|
OPTAB_NL(umin_optab, "umin$I$a3", UMIN, "umin", '3', gen_int_libfunc)
|
|
|
|
OPTAB_NL(umax_optab, "umax$I$a3", UMAX, "umax", '3', gen_int_libfunc)
|
|
|
|
|
|
|
|
OPTAB_NL(neg_optab, "neg$P$a2", NEG, "neg", '2', gen_int_fp_fixed_libfunc)
|
|
|
|
OPTAB_NX(neg_optab, "neg$F$a2")
|
|
|
|
OPTAB_NX(neg_optab, "neg$Q$a2")
|
|
|
|
OPTAB_VL(negv_optab, "negv$I$a2", NEG, "neg", '2', gen_intv_fp_libfunc)
|
|
|
|
OPTAB_VX(negv_optab, "neg$F$a2")
|
|
|
|
OPTAB_NL(ssneg_optab, "ssneg$Q$a2", SS_NEG, "ssneg", '2', gen_signed_fixed_libfunc)
|
|
|
|
OPTAB_NL(usneg_optab, "usneg$Q$a2", US_NEG, "usneg", '2', gen_unsigned_fixed_libfunc)
|
|
|
|
OPTAB_NC(abs_optab, "abs$P$a2", ABS)
|
|
|
|
OPTAB_NX(abs_optab, "abs$F$a2")
|
|
|
|
OPTAB_VC(absv_optab, "absv$I$a2", ABS)
|
|
|
|
OPTAB_VX(absv_optab, "abs$F$a2")
|
|
|
|
OPTAB_NL(one_cmpl_optab, "one_cmpl$a2", NOT, "one_cmpl", '2', gen_int_libfunc)
|
|
|
|
OPTAB_NC(bswap_optab, "bswap$a2", BSWAP)
|
|
|
|
OPTAB_NL(ffs_optab, "ffs$a2", FFS, "ffs", '2', gen_int_libfunc)
|
|
|
|
OPTAB_NL(clz_optab, "clz$a2", CLZ, "clz", '2', gen_int_libfunc)
|
|
|
|
OPTAB_NL(ctz_optab, "ctz$a2", CTZ, "ctz", '2', gen_int_libfunc)
|
|
|
|
OPTAB_NL(clrsb_optab, "clrsb$a2", CLRSB, "clrsb", '2', gen_int_libfunc)
|
|
|
|
OPTAB_NL(popcount_optab, "popcount$a2", POPCOUNT, "popcount", '2', gen_int_libfunc)
|
|
|
|
OPTAB_NL(parity_optab, "parity$a2", PARITY, "parity", '2', gen_int_libfunc)
|
|
|
|
|
|
|
|
/* Comparison libcalls for integers MUST come in pairs, signed/unsigned. */
|
|
|
|
OPTAB_NL(cmp_optab, NULL, UNKNOWN, "cmp", '2', gen_int_fp_fixed_libfunc)
|
|
|
|
OPTAB_NL(ucmp_optab, NULL, UNKNOWN, "ucmp", '2', gen_int_libfunc)
|
|
|
|
|
|
|
|
/* EQ etc are floating point comparisons. */
|
|
|
|
OPTAB_NL(eq_optab, NULL, EQ, "eq", '2', gen_fp_libfunc)
|
|
|
|
OPTAB_NL(ne_optab, NULL, NE, "ne", '2', gen_fp_libfunc)
|
|
|
|
OPTAB_NL(gt_optab, NULL, GT, "gt", '2', gen_fp_libfunc)
|
|
|
|
OPTAB_NL(ge_optab, NULL, GE, "ge", '2', gen_fp_libfunc)
|
|
|
|
OPTAB_NL(lt_optab, NULL, LT, "lt", '2', gen_fp_libfunc)
|
|
|
|
OPTAB_NL(le_optab, NULL, LE, "le", '2', gen_fp_libfunc)
|
|
|
|
OPTAB_NL(unord_optab, NULL, UNORDERED, "unord", '2', gen_fp_libfunc)
|
|
|
|
|
|
|
|
OPTAB_NL(powi_optab, NULL, UNKNOWN, "powi", '2', gen_fp_libfunc)
|
|
|
|
|
|
|
|
/* These are all initialized individually, on a per-host basis. */
|
|
|
|
OPTAB_NC(sqrt_optab, "sqrt$a2", SQRT)
|
|
|
|
OPTAB_NC(sync_old_add_optab, "sync_old_add$I$a", UNKNOWN)
|
|
|
|
OPTAB_NC(sync_old_sub_optab, "sync_old_sub$I$a", UNKNOWN)
|
|
|
|
OPTAB_NC(sync_old_ior_optab, "sync_old_ior$I$a", UNKNOWN)
|
|
|
|
OPTAB_NC(sync_old_and_optab, "sync_old_and$I$a", UNKNOWN)
|
|
|
|
OPTAB_NC(sync_old_xor_optab, "sync_old_xor$I$a", UNKNOWN)
|
|
|
|
OPTAB_NC(sync_old_nand_optab, "sync_old_nand$I$a", UNKNOWN)
|
|
|
|
OPTAB_NC(sync_new_add_optab, "sync_new_add$I$a", UNKNOWN)
|
|
|
|
OPTAB_NC(sync_new_sub_optab, "sync_new_sub$I$a", UNKNOWN)
|
|
|
|
OPTAB_NC(sync_new_ior_optab, "sync_new_ior$I$a", UNKNOWN)
|
|
|
|
OPTAB_NC(sync_new_and_optab, "sync_new_and$I$a", UNKNOWN)
|
|
|
|
OPTAB_NC(sync_new_xor_optab, "sync_new_xor$I$a", UNKNOWN)
|
|
|
|
OPTAB_NC(sync_new_nand_optab, "sync_new_nand$I$a", UNKNOWN)
|
|
|
|
OPTAB_NC(sync_compare_and_swap_optab, "sync_compare_and_swap$I$a", UNKNOWN)
|
|
|
|
OPTAB_NC(sync_lock_test_and_set_optab, "sync_lock_test_and_set$I$a", UNKNOWN)
|
|
|
|
|
|
|
|
OPTAB_DC(mov_optab, "mov$a", SET)
|
|
|
|
OPTAB_DC(movstrict_optab, "movstrict$a", STRICT_LOW_PART)
|
|
|
|
OPTAB_D (movmisalign_optab, "movmisalign$a")
|
|
|
|
OPTAB_D (storent_optab, "storent$a")
|
gcc/
* doc/md.texi (extv@var{m}, extvmisalign@var{m}, extzv@var{m})
(extzvmisalign@var{m}, insv@var{m}, insvmisalign@var{m}): Document.
(insv, extv, extzv): Deprecate.
* optabs.def (insv_optab, extv_optab, extzv_optab)
(insvmisalign_optab, extvmisalign_optab, extzvmisalign_optab):
New optabs.
* optabs.c (get_optab_extraction_insn): New function.
(get_extraction_insn): Use it.
* config/mips/mips.md (extv): Split into...
(extvmisalign<mode>, extv<mode>): ...these new patterns. Rename
existing extv<mode> pattern to...
(*extv<mode>): ...this.
(extzv): Split into...
(extzvmisalign<mode>, extzv<mode>): ...these new patterns. Rename
existing extzv<mode> pattern to...
(*extzv<mode>): ...this.
(insv): Split into...
(insvmisalign<mode>, insv<mode>): ...these new patterns. Rename
existing insv<mode> pattern to...
(*insv<mode>): ...this. Use const_int_operand rather than
immediate_operand.
* config/mips/mips.c (mips_block_move_straight): Use set_mem_size
to set the size of BLKmode accesses.
(mips_get_unaligned_mem): Require OP0 to be a BLKmode memory,
turning it from an "rtx *" to an rtx.
(mips_expand_ext_as_unaligned_load): Simplify for new optab
interface. Update call to mips_get_unaligned_mem.
(mips_expand_ins_as_unaligned_store): Update call to
mips_get_unaligned_mem.
From-SVN: r193606
2012-11-18 18:34:06 +01:00
|
|
|
OPTAB_D (insv_optab, "insv$a")
|
|
|
|
OPTAB_D (extv_optab, "extv$a")
|
|
|
|
OPTAB_D (extzv_optab, "extzv$a")
|
|
|
|
OPTAB_D (insvmisalign_optab, "insvmisalign$a")
|
|
|
|
OPTAB_D (extvmisalign_optab, "extvmisalign$a")
|
|
|
|
OPTAB_D (extzvmisalign_optab, "extzvmisalign$a")
|
2012-07-24 20:28:15 +02:00
|
|
|
OPTAB_D (push_optab, "push$a1")
|
|
|
|
OPTAB_D (reload_in_optab, "reload_in$a")
|
|
|
|
OPTAB_D (reload_out_optab, "reload_out$a")
|
|
|
|
|
|
|
|
OPTAB_DC(cbranch_optab, "cbranch$a4", COMPARE)
|
|
|
|
OPTAB_D (addcc_optab, "add$acc")
|
2015-11-10 10:35:11 +01:00
|
|
|
OPTAB_D (negcc_optab, "neg$acc")
|
|
|
|
OPTAB_D (notcc_optab, "not$acc")
|
2012-07-24 20:28:15 +02:00
|
|
|
OPTAB_D (movcc_optab, "mov$acc")
|
|
|
|
OPTAB_D (cmov_optab, "cmov$a6")
|
|
|
|
OPTAB_D (cstore_optab, "cstore$a4")
|
|
|
|
OPTAB_D (ctrap_optab, "ctrap$a4")
|
2013-12-04 23:47:11 +01:00
|
|
|
OPTAB_D (addv4_optab, "addv$I$a4")
|
|
|
|
OPTAB_D (subv4_optab, "subv$I$a4")
|
|
|
|
OPTAB_D (mulv4_optab, "mulv$I$a4")
|
2015-11-23 16:55:58 +01:00
|
|
|
OPTAB_D (uaddv4_optab, "uaddv$I$a4")
|
|
|
|
OPTAB_D (usubv4_optab, "usubv$I$a4")
|
re PR c/59708 (clang-compatible checked arithmetic builtins)
PR c/59708
* builtin-attrs.def (ATTR_NOTHROW_TYPEGENERIC_LEAF): New attribute.
* builtins.c (fold_builtin_arith_overflow): New function.
(fold_builtin_3): Use it.
* builtins.def (BUILT_IN_ADD_OVERFLOW, BUILT_IN_SUB_OVERFLOW,
BUILT_IN_MUL_OVERFLOW, BUILT_IN_SADD_OVERFLOW, BUILT_IN_SADDL_OVERFLOW,
BUILT_IN_SADDLL_OVERFLOW, BUILT_IN_SSUB_OVERFLOW,
BUILT_IN_SSUBL_OVERFLOW, BUILT_IN_SSUBLL_OVERFLOW,
BUILT_IN_SMUL_OVERFLOW, BUILT_IN_SMULL_OVERFLOW,
BUILT_IN_SMULLL_OVERFLOW, BUILT_IN_UADDL_OVERFLOW,
BUILT_IN_UADDLL_OVERFLOW, BUILT_IN_USUB_OVERFLOW,
BUILT_IN_USUBL_OVERFLOW, BUILT_IN_USUBLL_OVERFLOW,
BUILT_IN_UMUL_OVERFLOW, BUILT_IN_UMULL_OVERFLOW,
BUILT_IN_UMULLL_OVERFLOW): New built-in functions.
* builtin-types.def (BT_PTR_UINT, BT_PTR_ULONG, BT_PTR_LONGLONG,
BT_FN_BOOL_INT_INT_INTPTR, BT_FN_BOOL_LONG_LONG_LONGPTR,
BT_FN_BOOL_LONGLONG_LONGLONG_LONGLONGPTR, BT_FN_BOOL_UINT_UINT_UINTPTR,
BT_FN_BOOL_ULONG_ULONG_ULONGPTR,
BT_FN_BOOL_ULONGLONG_ULONGLONG_ULONGLONGPTR, BT_FN_BOOL_VAR): New.
* expr.c (write_complex_part): Remove prototype, no longer static.
* expr.h (write_complex_part): New prototype.
* function.c (aggregate_value_p): For internal functions return 0.
* gimple-fold.c (arith_overflowed_p): New functions.
(gimple_fold_call): Fold {ADD,SUB,MUL}_OVERFLOW internal calls.
* gimple-fold.h (arith_overflowed_p): New prototype.
* tree-ssa-dce.c: Include tree-ssa-propagate.h and gimple-fold.h.
(find_non_realpart_uses, maybe_optimize_arith_overflow): New
functions.
(eliminate_unnecessary_stmts): Transform {ADD,SUB,MUL}_OVERFLOW
into COMPLEX_CST/COMPLEX_EXPR if IMAGPART_EXPR of the result is
never used.
* gimplify.c (gimplify_call_expr): Handle gimplification of
internal calls with lhs.
* internal-fn.c (get_range_pos_neg, get_min_precision,
expand_arith_overflow_result_store): New functions.
(ubsan_expand_si_overflow_addsub_check): Renamed to ...
(expand_addsub_overflow): ... this. Add LOC, LHS, ARG0, ARG1,
UNSR_P, UNS0_P, UNS1_P, IS_UBSAN arguments, remove STMT argument.
Handle ADD_OVERFLOW and SUB_OVERFLOW expansion.
(ubsan_expand_si_overflow_neg_check): Renamed to ...
(expand_neg_overflow): ... this. Add LOC, LHS, ARG1, IS_UBSAN
arguments, remove STMT argument. Handle SUB_OVERFLOW with
0 as first argument expansion.
(ubsan_expand_si_overflow_mul_check): Renamed to ...
(expand_mul_overflow): ... this. Add LOC, LHS, ARG0, ARG1,
UNSR_P, UNS0_P, UNS1_P, IS_UBSAN arguments, remove STMT argument.
Handle MUL_OVERFLOW expansion.
(expand_UBSAN_CHECK_ADD): Use expand_addsub_overflow, prepare
arguments for it.
(expand_UBSAN_CHECK_SUB): Use expand_addsub_overflow or
expand_neg_overflow, prepare arguments for it.
(expand_UBSAN_CHECK_MUL): Use expand_mul_overflow, prepare arguments
for it.
(expand_arith_overflow, expand_ADD_OVERFLOW, expand_SUB_OVERFLOW,
expand_MUL_OVERFLOW): New functions.
* internal-fn.def (ADD_OVERFLOW, SUB_OVERFLOW, MUL_OVERFLOW): New
internal functions.
* tree-vrp.c (check_for_binary_op_overflow): New function.
(extract_range_basic): Handle {REAL,IMAG}PART_EXPR if the operand
is SSA_NAME set by {ADD,SUB,MUL}_OVERFLOW internal functions.
(simplify_internal_call_using_ranges): Handle {ADD,SUB,MUL}_OVERFLOW
internal functions.
* optabs.def (umulv4_optab): New optab.
* config/i386/i386.md (umulv<mode>4, <u>mulvqi4): New define_expands.
(*umulv<mode>4, *<u>mulvqi4): New define_insns.
* doc/extend.texi (Integer Overflow Builtins): Document
__builtin_*_overflow.
c-family/
* c-common.c (check_builtin_function_arguments): Handle
BUILT_IN_{ADD,SUB,MUL}_OVERFLOW.
testsuite/
* c-c++-common/builtin-arith-overflow-1.c: New test.
* c-c++-common/torture/builtin-arith-overflow-10.c: New test.
* c-c++-common/torture/builtin-arith-overflow-11.c: New test.
* c-c++-common/torture/builtin-arith-overflow-12.c: New test.
* c-c++-common/torture/builtin-arith-overflow-12.h: New file.
* c-c++-common/torture/builtin-arith-overflow-13.c: New test.
* c-c++-common/torture/builtin-arith-overflow-14.c: New test.
* c-c++-common/torture/builtin-arith-overflow-15.c: New test.
* c-c++-common/torture/builtin-arith-overflow-16.c: New test.
* c-c++-common/torture/builtin-arith-overflow-17.c: New test.
* c-c++-common/torture/builtin-arith-overflow-18.c: New test.
* c-c++-common/torture/builtin-arith-overflow-1.c: New test.
* c-c++-common/torture/builtin-arith-overflow-1.h: New file.
* c-c++-common/torture/builtin-arith-overflow-2.c: New test.
* c-c++-common/torture/builtin-arith-overflow-3.c: New test.
* c-c++-common/torture/builtin-arith-overflow-4.c: New test.
* c-c++-common/torture/builtin-arith-overflow-5.c: New test.
* c-c++-common/torture/builtin-arith-overflow-6.c: New test.
* c-c++-common/torture/builtin-arith-overflow-7.c: New test.
* c-c++-common/torture/builtin-arith-overflow-8.c: New test.
* c-c++-common/torture/builtin-arith-overflow-9.c: New test.
* c-c++-common/torture/builtin-arith-overflow.h: New file.
* gcc.dg/builtin-arith-overflow-1.c: New test.
* gcc.dg/builtin-arith-overflow-2.c: New test.
From-SVN: r217415
2014-11-12 13:28:06 +01:00
|
|
|
OPTAB_D (umulv4_optab, "umulv$I$a4")
|
2013-12-04 23:47:11 +01:00
|
|
|
OPTAB_D (negv3_optab, "negv$I$a3")
|
2014-03-24 18:38:09 +01:00
|
|
|
OPTAB_D (addptr3_optab, "addptr$a3")
|
2012-07-24 20:28:15 +02:00
|
|
|
|
|
|
|
OPTAB_D (smul_highpart_optab, "smul$a3_highpart")
|
|
|
|
OPTAB_D (umul_highpart_optab, "umul$a3_highpart")
|
|
|
|
|
|
|
|
OPTAB_D (cmpmem_optab, "cmpmem$a")
|
|
|
|
OPTAB_D (cmpstr_optab, "cmpstr$a")
|
|
|
|
OPTAB_D (cmpstrn_optab, "cmpstrn$a")
|
|
|
|
OPTAB_D (movmem_optab, "movmem$a")
|
|
|
|
OPTAB_D (setmem_optab, "setmem$a")
|
|
|
|
OPTAB_D (strlen_optab, "strlen$a")
|
|
|
|
|
|
|
|
OPTAB_DC(fma_optab, "fma$a4", FMA)
|
|
|
|
OPTAB_D (fms_optab, "fms$a4")
|
|
|
|
OPTAB_D (fnma_optab, "fnma$a4")
|
|
|
|
OPTAB_D (fnms_optab, "fnms$a4")
|
|
|
|
|
|
|
|
OPTAB_D (rint_optab, "rint$a2")
|
|
|
|
OPTAB_D (round_optab, "round$a2")
|
|
|
|
OPTAB_D (floor_optab, "floor$a2")
|
|
|
|
OPTAB_D (ceil_optab, "ceil$a2")
|
|
|
|
OPTAB_D (btrunc_optab, "btrunc$a2")
|
|
|
|
OPTAB_D (nearbyint_optab, "nearbyint$a2")
|
|
|
|
|
|
|
|
OPTAB_D (acos_optab, "acos$a2")
|
|
|
|
OPTAB_D (asin_optab, "asin$a2")
|
|
|
|
OPTAB_D (atan2_optab, "atan2$a3")
|
|
|
|
OPTAB_D (atan_optab, "atan$a2")
|
|
|
|
OPTAB_D (copysign_optab, "copysign$F$a3")
|
|
|
|
OPTAB_D (cos_optab, "cos$a2")
|
|
|
|
OPTAB_D (exp10_optab, "exp10$a2")
|
|
|
|
OPTAB_D (exp2_optab, "exp2$a2")
|
|
|
|
OPTAB_D (exp_optab, "exp$a2")
|
|
|
|
OPTAB_D (expm1_optab, "expm1$a2")
|
|
|
|
OPTAB_D (fmod_optab, "fmod$a3")
|
|
|
|
OPTAB_D (ilogb_optab, "ilogb$a2")
|
|
|
|
OPTAB_D (isinf_optab, "isinf$a2")
|
|
|
|
OPTAB_D (ldexp_optab, "ldexp$a3")
|
|
|
|
OPTAB_D (log10_optab, "log10$a2")
|
|
|
|
OPTAB_D (log1p_optab, "log1p$a2")
|
|
|
|
OPTAB_D (log2_optab, "log2$a2")
|
|
|
|
OPTAB_D (log_optab, "log$a2")
|
|
|
|
OPTAB_D (logb_optab, "logb$a2")
|
|
|
|
OPTAB_D (pow_optab, "pow$a3")
|
|
|
|
OPTAB_D (remainder_optab, "remainder$a3")
|
Add an rsqrt_optab and IFN_RSQRT internal function
All current uses of builtin_reciprocal convert 1.0/sqrt into rsqrt.
This patch adds an rsqrt optab and associated internal function for
that instead. We can then pick up the vector forms of rsqrt automatically,
fixing an AArch64 regression from my internal_fn patches.
With that change, builtin_reciprocal only needs to handle target-specific
built-in functions. I've restricted the hook to those since, if we need
a reciprocal of another standard function later, I think there should be
a strong preference for adding a new optab and internal function for it,
rather than hiding the code in a backend.
Three targets implement builtin_reciprocal: aarch64, i386 and rs6000.
i386 and rs6000 already used the obvious rsqrt<mode>2 pattern names
for the instructions, so they pick up the new code automatically.
aarch64 needs a slight rename.
mn10300 is unusual in that its native operation is rsqrt, and
sqrt is approximated as 1.0/rsqrt. The port also uses rsqrt<mode>2
for the rsqrt pattern, so after the patch we now pick it up as a native
operation.
Two other ports define rsqrt patterns: sh and v850. AFAICT these
patterns aren't currently used, but I think the patch does what the
authors of the patterns would have expected. There's obviously some
risk of fallout though.
Tested on x86_64-linux-gnu, aarch64-linux-gnu, arm-linux-gnueabihf
(as a target without the hooks) and powerpc64-linux-gnu.
gcc/
* internal-fn.def (RSQRT): New function.
* optabs.def (rsqrt_optab): New optab.
* doc/md.texi (rsqrtM2): Document.
* target.def (builtin_reciprocal): Replace gcall argument with
a function decl. Restrict hook to machine functions.
* doc/tm.texi: Regenerate.
* targhooks.h (default_builtin_reciprocal): Update prototype.
* targhooks.c (default_builtin_reciprocal): Likewise.
* tree-ssa-math-opts.c: Include internal-fn.h.
(internal_fn_reciprocal): New function.
(pass_cse_reciprocals::execute): Call it, and build a call to an
internal function on success. Only call targetm.builtin_reciprocal
for machine functions.
* config/aarch64/aarch64-protos.h (aarch64_builtin_rsqrt): Remove
second argument.
* config/aarch64/aarch64-builtins.c (aarch64_expand_builtin_rsqrt):
Rename aarch64_rsqrt_<mode>2 to rsqrt<mode>2.
(aarch64_builtin_rsqrt): Remove md_fn argument and only handle
machine functions.
* config/aarch64/aarch64.c (use_rsqrt_p): New function.
(aarch64_builtin_reciprocal): Replace gcall argument with a
function decl. Use use_rsqrt_p. Remove optimize_size check.
Only handle machine functions. Update call to aarch64_builtin_rsqrt.
(aarch64_optab_supported_p): New function.
(TARGET_OPTAB_SUPPORTED_P): Define.
* config/aarch64/aarch64-simd.md (aarch64_rsqrt_<mode>2): Rename to...
(rsqrt<mode>2): ...this.
* config/i386/i386.c (use_rsqrt_p): New function.
(ix86_builtin_reciprocal): Replace gcall argument with a
function decl. Use use_rsqrt_p. Remove optimize_insn_for_size_p
check. Only handle machine functions.
(ix86_optab_supported_p): Handle rsqrt_optab.
* config/rs6000/rs6000.c (TARGET_OPTAB_SUPPORTED_P): Define.
(rs6000_builtin_reciprocal): Replace gcall argument with a
function decl. Remove optimize_insn_for_size_p check.
Only handle machine functions.
(rs6000_optab_supported_p): New function.
From-SVN: r231229
2015-12-03 15:31:55 +01:00
|
|
|
OPTAB_D (rsqrt_optab, "rsqrt$a2")
|
2012-07-24 20:28:15 +02:00
|
|
|
OPTAB_D (scalb_optab, "scalb$a3")
|
|
|
|
OPTAB_D (signbit_optab, "signbit$F$a2")
|
|
|
|
OPTAB_D (significand_optab, "significand$a2")
|
|
|
|
OPTAB_D (sin_optab, "sin$a2")
|
|
|
|
OPTAB_D (sincos_optab, "sincos$a3")
|
|
|
|
OPTAB_D (tan_optab, "tan$a2")
|
|
|
|
|
2015-11-25 18:12:28 +01:00
|
|
|
/* C99 implementations of fmax/fmin. */
|
|
|
|
OPTAB_D (fmax_optab, "fmax$a3")
|
|
|
|
OPTAB_D (fmin_optab, "fmin$a3")
|
|
|
|
|
Add new optabs for reducing vectors to scalars
PR tree-optimization/61114
* doc/md.texi (Standard Names): Add reduc_(plus,[us](min|max))|scal
optabs, and note in reduc_[us](plus|min|max) to prefer the former.
* expr.c (expand_expr_real_2): Use reduc_..._scal if available, fall
back to old reduc_... + BIT_FIELD_REF only if not.
* optabs.c (optab_for_tree_code): for REDUC_(MAX,MIN,PLUS)_EXPR,
return the reduce-to-scalar (reduc_..._scal) optab.
(scalar_reduc_to_vector): New.
* optabs.def (reduc_smax_scal_optab, reduc_smin_scal_optab,
reduc_plus_scal_optab, reduc_umax_scal_optab, reduc_umin_scal_optab):
New.
* optabs.h (scalar_reduc_to_vector): Declare.
* tree-vect-loop.c (vectorizable_reduction): Look for optabs reducing
to either scalar or vector.
From-SVN: r216737
2014-10-27 15:20:52 +01:00
|
|
|
/* Vector reduction to a scalar. */
|
|
|
|
OPTAB_D (reduc_smax_scal_optab, "reduc_smax_scal_$a")
|
|
|
|
OPTAB_D (reduc_smin_scal_optab, "reduc_smin_scal_$a")
|
|
|
|
OPTAB_D (reduc_plus_scal_optab, "reduc_plus_scal_$a")
|
|
|
|
OPTAB_D (reduc_umax_scal_optab, "reduc_umax_scal_$a")
|
|
|
|
OPTAB_D (reduc_umin_scal_optab, "reduc_umin_scal_$a")
|
|
|
|
|
2012-07-24 20:28:15 +02:00
|
|
|
OPTAB_D (sdot_prod_optab, "sdot_prod$I$a")
|
|
|
|
OPTAB_D (ssum_widen_optab, "widen_ssum$I$a3")
|
|
|
|
OPTAB_D (udot_prod_optab, "udot_prod$I$a")
|
|
|
|
OPTAB_D (usum_widen_optab, "widen_usum$I$a3")
|
2014-06-25 04:58:43 +02:00
|
|
|
OPTAB_D (usad_optab, "usad$I$a")
|
|
|
|
OPTAB_D (ssad_optab, "ssad$I$a")
|
2012-07-24 20:28:15 +02:00
|
|
|
OPTAB_D (vec_extract_optab, "vec_extract$a")
|
|
|
|
OPTAB_D (vec_init_optab, "vec_init$a")
|
|
|
|
OPTAB_D (vec_pack_sfix_trunc_optab, "vec_pack_sfix_trunc_$a")
|
|
|
|
OPTAB_D (vec_pack_ssat_optab, "vec_pack_ssat_$a")
|
|
|
|
OPTAB_D (vec_pack_trunc_optab, "vec_pack_trunc_$a")
|
|
|
|
OPTAB_D (vec_pack_ufix_trunc_optab, "vec_pack_ufix_trunc_$a")
|
|
|
|
OPTAB_D (vec_pack_usat_optab, "vec_pack_usat_$a")
|
|
|
|
OPTAB_D (vec_perm_const_optab, "vec_perm_const$a")
|
|
|
|
OPTAB_D (vec_perm_optab, "vec_perm$a")
|
|
|
|
OPTAB_D (vec_realign_load_optab, "vec_realign_load_$a")
|
|
|
|
OPTAB_D (vec_set_optab, "vec_set$a")
|
|
|
|
OPTAB_D (vec_shr_optab, "vec_shr_$a")
|
|
|
|
OPTAB_D (vec_unpacks_float_hi_optab, "vec_unpacks_float_hi_$a")
|
|
|
|
OPTAB_D (vec_unpacks_float_lo_optab, "vec_unpacks_float_lo_$a")
|
|
|
|
OPTAB_D (vec_unpacks_hi_optab, "vec_unpacks_hi_$a")
|
|
|
|
OPTAB_D (vec_unpacks_lo_optab, "vec_unpacks_lo_$a")
|
|
|
|
OPTAB_D (vec_unpacku_float_hi_optab, "vec_unpacku_float_hi_$a")
|
|
|
|
OPTAB_D (vec_unpacku_float_lo_optab, "vec_unpacku_float_lo_$a")
|
|
|
|
OPTAB_D (vec_unpacku_hi_optab, "vec_unpacku_hi_$a")
|
|
|
|
OPTAB_D (vec_unpacku_lo_optab, "vec_unpacku_lo_$a")
|
|
|
|
OPTAB_D (vec_widen_smult_even_optab, "vec_widen_smult_even_$a")
|
|
|
|
OPTAB_D (vec_widen_smult_hi_optab, "vec_widen_smult_hi_$a")
|
|
|
|
OPTAB_D (vec_widen_smult_lo_optab, "vec_widen_smult_lo_$a")
|
|
|
|
OPTAB_D (vec_widen_smult_odd_optab, "vec_widen_smult_odd_$a")
|
|
|
|
OPTAB_D (vec_widen_sshiftl_hi_optab, "vec_widen_sshiftl_hi_$a")
|
|
|
|
OPTAB_D (vec_widen_sshiftl_lo_optab, "vec_widen_sshiftl_lo_$a")
|
|
|
|
OPTAB_D (vec_widen_umult_even_optab, "vec_widen_umult_even_$a")
|
|
|
|
OPTAB_D (vec_widen_umult_hi_optab, "vec_widen_umult_hi_$a")
|
|
|
|
OPTAB_D (vec_widen_umult_lo_optab, "vec_widen_umult_lo_$a")
|
|
|
|
OPTAB_D (vec_widen_umult_odd_optab, "vec_widen_umult_odd_$a")
|
|
|
|
OPTAB_D (vec_widen_ushiftl_hi_optab, "vec_widen_ushiftl_hi_$a")
|
|
|
|
OPTAB_D (vec_widen_ushiftl_lo_optab, "vec_widen_ushiftl_lo_$a")
|
|
|
|
|
|
|
|
OPTAB_D (sync_add_optab, "sync_add$I$a")
|
|
|
|
OPTAB_D (sync_and_optab, "sync_and$I$a")
|
|
|
|
OPTAB_D (sync_ior_optab, "sync_ior$I$a")
|
|
|
|
OPTAB_D (sync_lock_release_optab, "sync_lock_release$I$a")
|
|
|
|
OPTAB_D (sync_nand_optab, "sync_nand$I$a")
|
|
|
|
OPTAB_D (sync_sub_optab, "sync_sub$I$a")
|
|
|
|
OPTAB_D (sync_xor_optab, "sync_xor$I$a")
|
|
|
|
|
|
|
|
OPTAB_D (atomic_add_fetch_optab, "atomic_add_fetch$I$a")
|
|
|
|
OPTAB_D (atomic_add_optab, "atomic_add$I$a")
|
|
|
|
OPTAB_D (atomic_and_fetch_optab, "atomic_and_fetch$I$a")
|
|
|
|
OPTAB_D (atomic_and_optab, "atomic_and$I$a")
|
re PR target/49244 (__sync or __atomic builtins will not emit 'lock bts/btr/btc')
PR target/49244
* tree-ssa-ccp.c: Include stor-layout.h and optabs-query.h.
(optimize_atomic_bit_test_and): New function.
(pass_fold_builtins::execute): Use it.
* optabs.def (atomic_bit_test_and_set_optab,
atomic_bit_test_and_complement_optab,
atomic_bit_test_and_reset_optab): New optabs.
* internal-fn.def (ATOMIC_BIT_TEST_AND_SET,
ATOMIC_BIT_TEST_AND_COMPLEMENT, ATOMIC_BIT_TEST_AND_RESET): New ifns.
* builtins.h (expand_ifn_atomic_bit_test_and): New prototype.
* builtins.c (expand_ifn_atomic_bit_test_and): New function.
* internal-fn.c (expand_ATOMIC_BIT_TEST_AND_SET,
expand_ATOMIC_BIT_TEST_AND_COMPLEMENT,
expand_ATOMIC_BIT_TEST_AND_RESET): New functions.
* doc/md.texi (atomic_bit_test_and_set@var{mode},
atomic_bit_test_and_complement@var{mode},
atomic_bit_test_and_reset@var{mode}): Document.
* config/i386/sync.md (atomic_bit_test_and_set<mode>,
atomic_bit_test_and_complement<mode>,
atomic_bit_test_and_reset<mode>): New expanders.
(atomic_bit_test_and_set<mode>_1,
atomic_bit_test_and_complement<mode>_1,
atomic_bit_test_and_reset<mode>_1): New insns.
* gcc.target/i386/pr49244-1.c: New test.
* gcc.target/i386/pr49244-2.c: New test.
From-SVN: r235813
2016-05-03 13:37:25 +02:00
|
|
|
OPTAB_D (atomic_bit_test_and_set_optab, "atomic_bit_test_and_set$I$a")
|
|
|
|
OPTAB_D (atomic_bit_test_and_complement_optab, "atomic_bit_test_and_complement$I$a")
|
|
|
|
OPTAB_D (atomic_bit_test_and_reset_optab, "atomic_bit_test_and_reset$I$a")
|
2012-07-24 20:28:15 +02:00
|
|
|
OPTAB_D (atomic_compare_and_swap_optab, "atomic_compare_and_swap$I$a")
|
|
|
|
OPTAB_D (atomic_exchange_optab, "atomic_exchange$I$a")
|
|
|
|
OPTAB_D (atomic_fetch_add_optab, "atomic_fetch_add$I$a")
|
|
|
|
OPTAB_D (atomic_fetch_and_optab, "atomic_fetch_and$I$a")
|
|
|
|
OPTAB_D (atomic_fetch_nand_optab, "atomic_fetch_nand$I$a")
|
|
|
|
OPTAB_D (atomic_fetch_or_optab, "atomic_fetch_or$I$a")
|
|
|
|
OPTAB_D (atomic_fetch_sub_optab, "atomic_fetch_sub$I$a")
|
|
|
|
OPTAB_D (atomic_fetch_xor_optab, "atomic_fetch_xor$I$a")
|
|
|
|
OPTAB_D (atomic_load_optab, "atomic_load$I$a")
|
|
|
|
OPTAB_D (atomic_nand_fetch_optab, "atomic_nand_fetch$I$a")
|
|
|
|
OPTAB_D (atomic_nand_optab, "atomic_nand$I$a")
|
|
|
|
OPTAB_D (atomic_or_fetch_optab, "atomic_or_fetch$I$a")
|
|
|
|
OPTAB_D (atomic_or_optab, "atomic_or$I$a")
|
|
|
|
OPTAB_D (atomic_store_optab, "atomic_store$I$a")
|
|
|
|
OPTAB_D (atomic_sub_fetch_optab, "atomic_sub_fetch$I$a")
|
|
|
|
OPTAB_D (atomic_sub_optab, "atomic_sub$I$a")
|
|
|
|
OPTAB_D (atomic_xor_fetch_optab, "atomic_xor_fetch$I$a")
|
|
|
|
OPTAB_D (atomic_xor_optab, "atomic_xor$I$a")
|
builtins.c (expand_builtin_thread_pointer): New.
2012-10-11 Chung-Lin Tang <cltang@codesourcery.com>
* builtins.c (expand_builtin_thread_pointer): New.
(expand_builtin_set_thread_pointer): New.
(expand_builtin): Add BUILT_IN_THREAD_POINTER,
BUILT_IN_SET_THREAD_POINTER expand cases.
* builtins.def (BUILT_IN_THREAD_POINTER):
New __builtin_thread_pointer builtin.
(BUILT_IN_SET_THREAD_POINTER):
New __builtin_set_thread_pointer builtin.
* optabs.def (get_thread_pointer,set_thread_pointer):
New standard names.
* doc/md.texi (Standard Names): Document get_thread_pointer and
set_thread_pointer patterns.
* config/alpha/alpha.md (get_thread_pointerdi): Rename from load_tp.
(set_thread_pointerdi): Rename from set_tp.
* config/alpha/alpha.c (alpha_legitimize_address_1): Change
gen_load_tp calls to gen_get_thread_pointerdi.
(alpha_builtin): Remove ALPHA_BUILTIN_THREAD_POINTER,
ALPHA_BUILTIN_SET_THREAD_POINTER.
(code_for_builtin): Remove CODE_FOR_load_tp, CODE_FOR_set_tp.
(alpha_init_builtins): Remove __builtin_thread_pointer,
__builtin_set_thread_pointer machine-specific builtins.
(alpha_expand_builtin_thread_pointer): Add hook function for
TARGET_EXPAND_BUILTIN_THREAD_POINTER.
(alpha_expand_builtin_set_thread_pointer): Add hook function for
TARGET_EXPAND_BUILTIN_SET_THREAD_POINTER.
(alpha_fold_builtin): Remove ALPHA_BUILTIN_THREAD_POINTER,
ALPHA_BUILTIN_SET_THREAD_POINTER cases.
* config/arm/arm.md (get_thread_pointersi): New pattern.
* config/arm/arm-protos.h (arm_load_tp): Add extern declaration.
* config/arm/arm.c (arm_load_tp): Remove static.
(arm_builtins): Remove ARM_BUILTIN_THREAD_POINTER.
(arm_init_tls_builtins): Remove function.
(arm_init_builtins): Remove call to arm_init_tls_builtins().
(arm_expand_builtin): Remove ARM_BUILTIN_THREAD_POINTER case.
* config/mips/mips.md (get_thread_pointer<mode>): New pattern.
* config/mips/mips-protos.h (mips_expand_thread_pointer):
Add extern declaration.
* config/mips/mips.c (mips_expand_thread_pointer):
Renamed from mips_get_tp.
(mips_get_tp): New stub calling mips_expand_thread_pointer.
* config/s390/s390.c (s390_builtin,code_for_builtin_64,
code_for_builtin_31,s390_init_builtins,s390_expand_builtin): Remove.
* config/s390/s390.md (get_tp_64,get_tp_31,set_tp_64,set_tp_31):
Remove.
(get_thread_pointer<mode>,set_thread_pointer<mode>):
New, adapted from removed patterns.
* config/xtensa/xtensa.md (get_thread_pointersi):
Renamed from load_tp.
(set_thread_pointersi): Renamed from set_tp.
* config/xtensa/xtensa.c (xtensa_legitimize_tls_address):
Change gen_load_tp calls to gen_get_thread_pointersi.
(xtensa_builtin): Remove XTENSA_BUILTIN_THREAD_POINTER and
XTENSA_BUILTIN_SET_THREAD_POINTER.
(xtensa_init_builtins): Remove __builtin_thread_pointer,
__builtin_set_thread_pointer machine-specific builtins.
(xtensa_fold_builtin): Remove XTENSA_BUILTIN_THREAD_POINTER,
XTENSA_BUILTIN_SET_THREAD_POINTER cases.
(xtensa_expand_builtin): Remove XTENSA_BUILTIN_THREAD_POINTER,
XTENSA_BUILTIN_SET_THREAD_POINTER cases.
From-SVN: r192364
2012-10-11 17:05:44 +02:00
|
|
|
|
|
|
|
OPTAB_D (get_thread_pointer_optab, "get_thread_pointer$I$a")
|
|
|
|
OPTAB_D (set_thread_pointer_optab, "set_thread_pointer$I$a")
|