2012-07-24 20:28:15 +02:00
|
|
|
/* Definitions for operation tables, or "optabs".
|
2015-01-05 13:33:28 +01:00
|
|
|
Copyright (C) 1987-2015 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/>. */
|
|
|
|
|
|
|
|
/* Entries here are categorized C, D, N, V. See genopinit.c for details
|
|
|
|
on the meaning of the categories and for the pattern dollar codes. */
|
|
|
|
|
|
|
|
/* 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")
|
|
|
|
|
|
|
|
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)
|
|
|
|
OPTAB_NL(sdivmod_optab, "divmod$a4", UNKNOWN, "divmod", '4', gen_int_libfunc)
|
|
|
|
OPTAB_NL(udivmod_optab, "udivmod$a4", UNKNOWN, "udivmod", '4', gen_int_libfunc)
|
|
|
|
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")
|
|
|
|
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")
|
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")
|
|
|
|
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")
|
|
|
|
|
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")
|
|
|
|
/* (Old) Vector reduction, returning a vector with the result in one lane. */
|
2012-07-24 20:28:15 +02:00
|
|
|
OPTAB_D (reduc_smax_optab, "reduc_smax_$a")
|
|
|
|
OPTAB_D (reduc_smin_optab, "reduc_smin_$a")
|
|
|
|
OPTAB_D (reduc_splus_optab, "reduc_splus_$a")
|
|
|
|
OPTAB_D (reduc_umax_optab, "reduc_umax_$a")
|
|
|
|
OPTAB_D (reduc_umin_optab, "reduc_umin_$a")
|
|
|
|
OPTAB_D (reduc_uplus_optab, "reduc_uplus_$a")
|
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
|
|
|
|
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")
|
tree-vectorizer.h (struct _loop_vec_info): Add scalar_loop field.
* tree-vectorizer.h (struct _loop_vec_info): Add scalar_loop field.
(LOOP_VINFO_SCALAR_LOOP): Define.
(slpeel_tree_duplicate_loop_to_edge_cfg): Add scalar_loop argument.
* config/i386/sse.md (maskload<mode>, maskstore<mode>): New expanders.
* tree-data-ref.c (get_references_in_stmt): Handle MASK_LOAD and
MASK_STORE.
* internal-fn.def (LOOP_VECTORIZED, MASK_LOAD, MASK_STORE): New
internal fns.
* tree-if-conv.c: Include expr.h, optabs.h, tree-ssa-loop-ivopts.h and
tree-ssa-address.h.
(release_bb_predicate): New function.
(free_bb_predicate): Use it.
(reset_bb_predicate): Likewise. Don't unallocate bb->aux
just to immediately allocate it again.
(add_to_predicate_list): Add loop argument. If basic blocks that
dominate loop->latch don't insert any predicate.
(add_to_dst_predicate_list): Adjust caller.
(if_convertible_phi_p): Add any_mask_load_store argument, if true,
handle it like flag_tree_loop_if_convert_stores.
(insert_gimplified_predicates): Likewise.
(ifcvt_can_use_mask_load_store): New function.
(if_convertible_gimple_assign_stmt_p): Add any_mask_load_store
argument, check if some conditional loads or stores can't be
converted into MASK_LOAD or MASK_STORE.
(if_convertible_stmt_p): Add any_mask_load_store argument,
pass it down to if_convertible_gimple_assign_stmt_p.
(predicate_bbs): Don't return bool, only check if the last stmt
of a basic block is GIMPLE_COND and handle that. Adjust
add_to_predicate_list caller.
(if_convertible_loop_p_1): Only call predicate_bbs if
flag_tree_loop_if_convert_stores and free_bb_predicate in that case
afterwards, check gimple_code of stmts here. Replace is_predicated
check with dominance check. Add any_mask_load_store argument,
pass it down to if_convertible_stmt_p and if_convertible_phi_p,
call if_convertible_phi_p only after all if_convertible_stmt_p
calls.
(if_convertible_loop_p): Add any_mask_load_store argument,
pass it down to if_convertible_loop_p_1.
(predicate_mem_writes): Emit MASK_LOAD and/or MASK_STORE calls.
(combine_blocks): Add any_mask_load_store argument, pass
it down to insert_gimplified_predicates and call predicate_mem_writes
if it is set. Call predicate_bbs.
(version_loop_for_if_conversion): New function.
(tree_if_conversion): Adjust if_convertible_loop_p and combine_blocks
calls. Return todo flags instead of bool, call
version_loop_for_if_conversion if if-conversion should be just
for the vectorized loops and nothing else.
(main_tree_if_conversion): Adjust caller. Don't call
tree_if_conversion for dont_vectorize loops if if-conversion
isn't explicitly enabled.
* tree-vect-data-refs.c (vect_check_gather): Handle
MASK_LOAD/MASK_STORE.
(vect_analyze_data_refs, vect_supportable_dr_alignment): Likewise.
* gimple.h (gimple_expr_type): Handle MASK_STORE.
* internal-fn.c (expand_LOOP_VECTORIZED, expand_MASK_LOAD,
expand_MASK_STORE): New functions.
* tree-vectorizer.c: Include tree-cfg.h and gimple-fold.h.
(vect_loop_vectorized_call, fold_loop_vectorized_call): New functions.
(vectorize_loops): Don't try to vectorize loops with
loop->dont_vectorize set. Set LOOP_VINFO_SCALAR_LOOP for if-converted
loops, fold LOOP_VECTORIZED internal call depending on if loop
has been vectorized or not.
* tree-vect-loop-manip.c (slpeel_duplicate_current_defs_from_edges):
New function.
(slpeel_tree_duplicate_loop_to_edge_cfg): Add scalar_loop argument.
If non-NULL, copy basic blocks from scalar_loop instead of loop, but
still to loop's entry or exit edge.
(slpeel_tree_peel_loop_to_edge): Add scalar_loop argument, pass it
down to slpeel_tree_duplicate_loop_to_edge_cfg.
(vect_do_peeling_for_loop_bound, vect_do_peeling_for_loop_alignment):
Adjust callers.
(vect_loop_versioning): If LOOP_VINFO_SCALAR_LOOP, perform loop
versioning from that loop instead of LOOP_VINFO_LOOP, move it to the
right place in the CFG afterwards.
* tree-vect-loop.c (vect_determine_vectorization_factor): Handle
MASK_STORE.
* cfgloop.h (struct loop): Add dont_vectorize field.
* tree-loop-distribution.c (copy_loop_before): Adjust
slpeel_tree_duplicate_loop_to_edge_cfg caller.
* optabs.def (maskload_optab, maskstore_optab): New optabs.
* passes.def: Add a note that pass_vectorize must immediately follow
pass_if_conversion.
* tree-predcom.c (split_data_refs_to_components): Give up if
DR_STMT is a call.
* tree-vect-stmts.c (vect_mark_relevant): Don't crash if lhs
is NULL.
(exist_non_indexing_operands_for_use_p): Handle MASK_LOAD
and MASK_STORE.
(vectorizable_mask_load_store): New function.
(vectorizable_call): Call it for MASK_LOAD or MASK_STORE.
(vect_transform_stmt): Handle MASK_STORE.
* tree-ssa-phiopt.c (cond_if_else_store_replacement): Ignore
DR_STMT where lhs is NULL.
* optabs.h (can_vec_perm_p): Fix up comment typo.
(can_vec_mask_load_store_p): New prototype.
* optabs.c (can_vec_mask_load_store_p): New function.
* gcc.dg/vect/vect-cond-11.c: New test.
* gcc.target/i386/vect-cond-1.c: New test.
* gcc.target/i386/avx2-gather-5.c: New test.
* gcc.target/i386/avx2-gather-6.c: New test.
* gcc.dg/vect/vect-mask-loadstore-1.c: New test.
* gcc.dg/vect/vect-mask-load-1.c: New test.
From-SVN: r205856
2013-12-10 12:46:01 +01:00
|
|
|
OPTAB_D (maskload_optab, "maskload$a")
|
|
|
|
OPTAB_D (maskstore_optab, "maskstore$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")
|
|
|
|
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")
|