|
#define | DEF_INTERNAL_FN(CODE, FLAGS, FNSPEC) |
|
#define | DEF_INTERNAL_OPTAB_FN(NAME, FLAGS, OPTAB, TYPE) |
|
#define | DEF_INTERNAL_SIGNED_OPTAB_FN(NAME, FLAGS, SELECTOR, SIGNED_OPTAB, UNSIGNED_OPTAB, TYPE) |
|
#define | DEF_INTERNAL_FLT_FN(NAME, FLAGS, OPTAB, TYPE) |
|
#define | DEF_INTERNAL_FLT_FLOATN_FN(NAME, FLAGS, OPTAB, TYPE) |
|
#define | DEF_INTERNAL_INT_FN(NAME, FLAGS, OPTAB, TYPE) |
|
#define | DEF_INTERNAL_INT_EXT_FN(NAME, FLAGS, OPTAB, TYPE) |
|
#define | DEF_INTERNAL_WIDENING_OPTAB_FN(NAME, FLAGS, SELECTOR, SOPTAB, UOPTAB, TYPE) |
|
#define | DEF_INTERNAL_COND_FN(NAME, FLAGS, OPTAB, TYPE) |
|
#define | DEF_INTERNAL_SIGNED_COND_FN(NAME, FLAGS, SELECTOR, SIGNED_OPTAB, UNSIGNED_OPTAB, TYPE) |
|
#define | DEF_INTERNAL_FN(CODE, FLAGS, FNSPEC) |
|
#define | DEF_INTERNAL_OPTAB_FN(NAME, FLAGS, OPTAB, TYPE) |
|
#define | DEF_INTERNAL_SIGNED_OPTAB_FN(NAME, FLAGS, SELECTOR, SIGNED_OPTAB, UNSIGNED_OPTAB, TYPE) |
|
#define | DEF_INTERNAL_FLT_FN(NAME, FLAGS, OPTAB, TYPE) |
|
#define | DEF_INTERNAL_FLT_FLOATN_FN(NAME, FLAGS, OPTAB, TYPE) |
|
#define | DEF_INTERNAL_INT_FN(NAME, FLAGS, OPTAB, TYPE) |
|
#define | DEF_INTERNAL_INT_EXT_FN(NAME, FLAGS, OPTAB, TYPE) |
|
#define | DEF_INTERNAL_WIDENING_OPTAB_FN(NAME, FLAGS, SELECTOR, SOPTAB, UOPTAB, TYPE) |
|
#define | DEF_INTERNAL_COND_FN(NAME, FLAGS, OPTAB, TYPE) |
|
#define | DEF_INTERNAL_SIGNED_COND_FN(NAME, FLAGS, SELECTOR, SIGNED_OPTAB, UNSIGNED_OPTAB, TYPE) |
|
#define | DEF_INTERNAL_FN(NAME, FLAGS, TYPE) |
|
#define | DEF_INTERNAL_WIDENING_OPTAB_FN(NAME, F, S, SO, UO, T) |
|
#define | DEF_INTERNAL_OPTAB_FN(NAME, FLAGS, OPTAB, TYPE) |
|
#define | DEF_INTERNAL_SIGNED_OPTAB_FN(NAME, FLAGS, SELECTOR, SIGNED_OPTAB, UNSIGNED_OPTAB, TYPE) |
|
#define | DEF_INTERNAL_FLT_FN(NAME, FLAGS, OPTAB, TYPE) |
|
#define | DEF_INTERNAL_FLT_FLOATN_FN(NAME, FLAGS, OPTAB, TYPE) |
|
#define | DEF_INTERNAL_INT_FN(NAME, FLAGS, OPTAB, TYPE) |
|
#define | DEF_INTERNAL_INT_EXT_FN(NAME, FLAGS, OPTAB, TYPE) |
|
#define | DEF_INTERNAL_COND_FN(NAME, FLAGS, OPTAB, TYPE) |
|
#define | DEF_INTERNAL_SIGNED_COND_FN(NAME, FLAGS, SELECTOR, SIGNED_OPTAB, UNSIGNED_OPTAB, TYPE) |
|
#define | DEF_INTERNAL_FN(NAME, FLAGS, TYPE) |
|
#define | DEF_INTERNAL_WIDENING_OPTAB_FN(NAME, F, S, SO, UO, T) |
|
#define | DEF_INTERNAL_OPTAB_FN(NAME, FLAGS, OPTAB, TYPE) |
|
#define | DEF_INTERNAL_SIGNED_OPTAB_FN(NAME, FLAGS, SELECTOR, SIGNED_OPTAB, UNSIGNED_OPTAB, TYPE) |
|
#define | DEF_INTERNAL_FLT_FN(NAME, FLAGS, OPTAB, TYPE) |
|
#define | DEF_INTERNAL_FLT_FLOATN_FN(NAME, FLAGS, OPTAB, TYPE) |
|
#define | DEF_INTERNAL_INT_FN(NAME, FLAGS, OPTAB, TYPE) |
|
#define | DEF_INTERNAL_INT_EXT_FN(NAME, FLAGS, OPTAB, TYPE) |
|
#define | DEF_INTERNAL_COND_FN(NAME, FLAGS, OPTAB, TYPE) |
|
#define | DEF_INTERNAL_SIGNED_COND_FN(NAME, FLAGS, SELECTOR, SIGNED_OPTAB, UNSIGNED_OPTAB, TYPE) |
|
#define | DEF_INTERNAL_FN(CODE, FLAGS, FNSPEC) |
|
#define | DEF_INTERNAL_OPTAB_FN(NAME, FLAGS, OPTAB, TYPE) |
|
#define | DEF_INTERNAL_SIGNED_OPTAB_FN(NAME, FLAGS, SELECTOR, SIGNED_OPTAB, UNSIGNED_OPTAB, TYPE) |
|
#define | DEF_INTERNAL_FLT_FN(NAME, FLAGS, OPTAB, TYPE) |
|
#define | DEF_INTERNAL_FLT_FLOATN_FN(NAME, FLAGS, OPTAB, TYPE) |
|
#define | DEF_INTERNAL_INT_FN(NAME, FLAGS, OPTAB, TYPE) |
|
#define | DEF_INTERNAL_INT_EXT_FN(NAME, FLAGS, OPTAB, TYPE) |
|
#define | DEF_INTERNAL_WIDENING_OPTAB_FN(NAME, FLAGS, SELECTOR, SOPTAB, UOPTAB, TYPE) |
|
#define | DEF_INTERNAL_COND_FN(NAME, FLAGS, OPTAB, TYPE) |
|
#define | DEF_INTERNAL_SIGNED_COND_FN(NAME, FLAGS, SELECTOR, SIGNED_OPTAB, UNSIGNED_OPTAB, TYPE) |
|
#define | not_direct { -2, -2, false } |
|
#define | mask_load_direct { -1, 2, false } |
|
#define | load_lanes_direct { -1, -1, false } |
|
#define | mask_load_lanes_direct { -1, -1, false } |
|
#define | gather_load_direct { 3, 1, false } |
|
#define | len_load_direct { -1, -1, false } |
|
#define | mask_len_load_direct { -1, 4, false } |
|
#define | mask_store_direct { 3, 2, false } |
|
#define | store_lanes_direct { 0, 0, false } |
|
#define | mask_store_lanes_direct { 0, 0, false } |
|
#define | vec_cond_mask_direct { 1, 0, false } |
|
#define | vec_cond_mask_len_direct { 1, 1, false } |
|
#define | vec_cond_direct { 2, 0, false } |
|
#define | scatter_store_direct { 3, 1, false } |
|
#define | len_store_direct { 3, 3, false } |
|
#define | mask_len_store_direct { 4, 5, false } |
|
#define | vec_set_direct { 3, 3, false } |
|
#define | vec_extract_direct { 0, -1, false } |
|
#define | unary_direct { 0, 0, true } |
|
#define | unary_convert_direct { -1, 0, true } |
|
#define | binary_direct { 0, 0, true } |
|
#define | ternary_direct { 0, 0, true } |
|
#define | cond_unary_direct { 1, 1, true } |
|
#define | cond_binary_direct { 1, 1, true } |
|
#define | cond_ternary_direct { 1, 1, true } |
|
#define | cond_len_unary_direct { 1, 1, true } |
|
#define | cond_len_binary_direct { 1, 1, true } |
|
#define | cond_len_ternary_direct { 1, 1, true } |
|
#define | while_direct { 0, 2, false } |
|
#define | fold_extract_direct { 2, 2, false } |
|
#define | fold_len_extract_direct { 2, 2, false } |
|
#define | fold_left_direct { 1, 1, false } |
|
#define | mask_fold_left_direct { 1, 1, false } |
|
#define | mask_len_fold_left_direct { 1, 1, false } |
|
#define | check_ptrs_direct { 0, 0, false } |
|
#define | DEF_INTERNAL_FN(CODE, FLAGS, FNSPEC) |
|
#define | DEF_INTERNAL_OPTAB_FN(CODE, FLAGS, OPTAB, TYPE) |
|
#define | DEF_INTERNAL_SIGNED_OPTAB_FN(CODE, FLAGS, SELECTOR, SIGNED_OPTAB, UNSIGNED_OPTAB, TYPE) |
|
#define | DEF_INTERNAL_FLT_FN(NAME, FLAGS, OPTAB, TYPE) |
|
#define | DEF_INTERNAL_FLT_FLOATN_FN(NAME, FLAGS, OPTAB, TYPE) |
|
#define | DEF_INTERNAL_INT_FN(NAME, FLAGS, OPTAB, TYPE) |
|
#define | DEF_INTERNAL_INT_EXT_FN(NAME, FLAGS, OPTAB, TYPE) |
|
#define | DEF_INTERNAL_WIDENING_OPTAB_FN(NAME, FLAGS, SELECTOR, SOPTAB, UOPTAB, TYPE) |
|
#define | DEF_INTERNAL_COND_FN(NAME, FLAGS, OPTAB, TYPE) |
|
#define | DEF_INTERNAL_SIGNED_COND_FN(NAME, FLAGS, SELECTOR, SIGNED_OPTAB, UNSIGNED_OPTAB, TYPE) |
|
#define | expand_mask_load_optab_fn expand_partial_load_optab_fn |
|
#define | expand_mask_load_lanes_optab_fn expand_mask_load_optab_fn |
|
#define | expand_len_load_optab_fn expand_partial_load_optab_fn |
|
#define | expand_mask_len_load_optab_fn expand_partial_load_optab_fn |
|
#define | expand_mask_store_optab_fn expand_partial_store_optab_fn |
|
#define | expand_mask_store_lanes_optab_fn expand_mask_store_optab_fn |
|
#define | expand_len_store_optab_fn expand_partial_store_optab_fn |
|
#define | expand_mask_len_store_optab_fn expand_partial_store_optab_fn |
|
#define | INIT_PATTERN_VALUE 0xFE |
|
#define | expand_unary_optab_fn(FN, STMT, OPTAB) |
|
#define | expand_binary_optab_fn(FN, STMT, OPTAB) |
|
#define | expand_ternary_optab_fn(FN, STMT, OPTAB) |
|
#define | expand_cond_unary_optab_fn(FN, STMT, OPTAB) |
|
#define | expand_cond_binary_optab_fn(FN, STMT, OPTAB) |
|
#define | expand_cond_ternary_optab_fn(FN, STMT, OPTAB) |
|
#define | expand_cond_len_unary_optab_fn(FN, STMT, OPTAB) |
|
#define | expand_cond_len_binary_optab_fn(FN, STMT, OPTAB) |
|
#define | expand_cond_len_ternary_optab_fn(FN, STMT, OPTAB) |
|
#define | expand_fold_extract_optab_fn(FN, STMT, OPTAB) |
|
#define | expand_fold_len_extract_optab_fn(FN, STMT, OPTAB) |
|
#define | expand_fold_left_optab_fn(FN, STMT, OPTAB) |
|
#define | expand_mask_fold_left_optab_fn(FN, STMT, OPTAB) |
|
#define | expand_mask_len_fold_left_optab_fn(FN, STMT, OPTAB) |
|
#define | expand_check_ptrs_optab_fn(FN, STMT, OPTAB) |
|
#define | expand_unary_convert_optab_fn(FN, STMT, OPTAB) |
|
#define | expand_vec_extract_optab_fn(FN, STMT, OPTAB) |
|
#define | direct_unary_optab_supported_p direct_optab_supported_p |
|
#define | direct_unary_convert_optab_supported_p convert_optab_supported_p |
|
#define | direct_binary_optab_supported_p direct_optab_supported_p |
|
#define | direct_ternary_optab_supported_p direct_optab_supported_p |
|
#define | direct_cond_unary_optab_supported_p direct_optab_supported_p |
|
#define | direct_cond_binary_optab_supported_p direct_optab_supported_p |
|
#define | direct_cond_ternary_optab_supported_p direct_optab_supported_p |
|
#define | direct_cond_len_unary_optab_supported_p direct_optab_supported_p |
|
#define | direct_cond_len_binary_optab_supported_p direct_optab_supported_p |
|
#define | direct_cond_len_ternary_optab_supported_p direct_optab_supported_p |
|
#define | direct_mask_load_optab_supported_p convert_optab_supported_p |
|
#define | direct_load_lanes_optab_supported_p multi_vector_optab_supported_p |
|
#define | direct_mask_load_lanes_optab_supported_p multi_vector_optab_supported_p |
|
#define | direct_gather_load_optab_supported_p convert_optab_supported_p |
|
#define | direct_len_load_optab_supported_p direct_optab_supported_p |
|
#define | direct_mask_len_load_optab_supported_p convert_optab_supported_p |
|
#define | direct_mask_store_optab_supported_p convert_optab_supported_p |
|
#define | direct_store_lanes_optab_supported_p multi_vector_optab_supported_p |
|
#define | direct_mask_store_lanes_optab_supported_p multi_vector_optab_supported_p |
|
#define | direct_vec_cond_mask_optab_supported_p convert_optab_supported_p |
|
#define | direct_vec_cond_optab_supported_p convert_optab_supported_p |
|
#define | direct_scatter_store_optab_supported_p convert_optab_supported_p |
|
#define | direct_len_store_optab_supported_p direct_optab_supported_p |
|
#define | direct_mask_len_store_optab_supported_p convert_optab_supported_p |
|
#define | direct_while_optab_supported_p convert_optab_supported_p |
|
#define | direct_fold_extract_optab_supported_p direct_optab_supported_p |
|
#define | direct_fold_len_extract_optab_supported_p direct_optab_supported_p |
|
#define | direct_fold_left_optab_supported_p direct_optab_supported_p |
|
#define | direct_mask_fold_left_optab_supported_p direct_optab_supported_p |
|
#define | direct_mask_len_fold_left_optab_supported_p direct_optab_supported_p |
|
#define | direct_check_ptrs_optab_supported_p direct_optab_supported_p |
|
#define | direct_vec_set_optab_supported_p direct_optab_supported_p |
|
#define | direct_vec_extract_optab_supported_p convert_optab_supported_p |
|
#define | DEF_INTERNAL_FN(CODE, FLAGS, FNSPEC) |
|
#define | DEF_INTERNAL_OPTAB_FN(CODE, FLAGS, OPTAB, TYPE) |
|
#define | DEF_INTERNAL_SIGNED_OPTAB_FN(CODE, FLAGS, SELECTOR, SIGNED_OPTAB, UNSIGNED_OPTAB, TYPE) |
|
#define | DEF_INTERNAL_FLT_FN(NAME, FLAGS, OPTAB, TYPE) |
|
#define | DEF_INTERNAL_FLT_FLOATN_FN(NAME, FLAGS, OPTAB, TYPE) |
|
#define | DEF_INTERNAL_INT_FN(NAME, FLAGS, OPTAB, TYPE) |
|
#define | DEF_INTERNAL_INT_EXT_FN(NAME, FLAGS, OPTAB, TYPE) |
|
#define | DEF_INTERNAL_WIDENING_OPTAB_FN(NAME, FLAGS, SELECTOR, SOPTAB, UOPTAB, TYPE) |
|
#define | DEF_INTERNAL_COND_FN(NAME, FLAGS, OPTAB, TYPE) |
|
#define | DEF_INTERNAL_SIGNED_COND_FN(NAME, FLAGS, SELECTOR, SIGNED_OPTAB, UNSIGNED_OPTAB, TYPE) |
|
#define | DEF_INTERNAL_FN(CODE, FLAGS, FNSPEC) |
|
#define | DEF_INTERNAL_OPTAB_FN(CODE, FLAGS, OPTAB, TYPE) |
|
#define | DEF_INTERNAL_SIGNED_OPTAB_FN(NAME, FLAGS, SELECTOR, SIGNED_OPTAB, UNSIGNED_OPTAB, TYPE) |
|
#define | DEF_INTERNAL_FLT_FN(NAME, FLAGS, OPTAB, TYPE) |
|
#define | DEF_INTERNAL_FLT_FLOATN_FN(NAME, FLAGS, OPTAB, TYPE) |
|
#define | DEF_INTERNAL_INT_FN(NAME, FLAGS, OPTAB, TYPE) |
|
#define | DEF_INTERNAL_INT_EXT_FN(NAME, FLAGS, OPTAB, TYPE) |
|
#define | DEF_INTERNAL_WIDENING_OPTAB_FN(NAME, FLAGS, SELECTOR, SOPTAB, UOPTAB, TYPE) |
|
#define | DEF_INTERNAL_COND_FN(NAME, FLAGS, OPTAB, TYPE) |
|
#define | DEF_INTERNAL_SIGNED_COND_FN(NAME, FLAGS, SELECTOR, SIGNED_OPTAB, UNSIGNED_OPTAB, TYPE) |
|
#define | DEF_INTERNAL_FN(CODE, FLAGS, FNSPEC) |
|
#define | DEF_INTERNAL_OPTAB_FN(CODE, FLAGS, OPTAB, TYPE) |
|
#define | DEF_INTERNAL_SIGNED_OPTAB_FN(CODE, FLAGS, SELECTOR, SIGNED_OPTAB, UNSIGNED_OPTAB, TYPE) |
|
#define | DEF_INTERNAL_FLT_FN(NAME, FLAGS, OPTAB, TYPE) |
|
#define | DEF_INTERNAL_FLT_FLOATN_FN(NAME, FLAGS, OPTAB, TYPE) |
|
#define | DEF_INTERNAL_INT_FN(NAME, FLAGS, OPTAB, TYPE) |
|
#define | DEF_INTERNAL_INT_EXT_FN(NAME, FLAGS, OPTAB, TYPE) |
|
#define | DEF_INTERNAL_WIDENING_OPTAB_FN(NAME, FLAGS, SELECTOR, SOPTAB, UOPTAB, TYPE) |
|
#define | DEF_INTERNAL_COND_FN(NAME, FLAGS, OPTAB, TYPE) |
|
#define | DEF_INTERNAL_SIGNED_COND_FN(NAME, FLAGS, SELECTOR, SIGNED_OPTAB, UNSIGNED_OPTAB, TYPE) |
|
#define | DEF_INTERNAL_WIDENING_OPTAB_FN(NAME, F, S, SO, UO, T) |
|
#define | DEF_INTERNAL_FN(CODE, FLAGS, FNSPEC) |
|
#define | DEF_INTERNAL_OPTAB_FN(NAME, FLAGS, OPTAB, TYPE) |
|
#define | DEF_INTERNAL_SIGNED_OPTAB_FN(NAME, FLAGS, SELECTOR, SIGNED_OPTAB, UNSIGNED_OPTAB, TYPE) |
|
#define | DEF_INTERNAL_FLT_FN(NAME, FLAGS, OPTAB, TYPE) |
|
#define | DEF_INTERNAL_FLT_FLOATN_FN(NAME, FLAGS, OPTAB, TYPE) |
|
#define | DEF_INTERNAL_INT_FN(NAME, FLAGS, OPTAB, TYPE) |
|
#define | DEF_INTERNAL_INT_EXT_FN(NAME, FLAGS, OPTAB, TYPE) |
|
#define | DEF_INTERNAL_COND_FN(NAME, FLAGS, OPTAB, TYPE) |
|
#define | DEF_INTERNAL_SIGNED_COND_FN(NAME, FLAGS, SELECTOR, SIGNED_OPTAB, UNSIGNED_OPTAB, TYPE) |
|
#define | DEF_INTERNAL_OPTAB_FN(CODE, FLAGS, OPTAB, TYPE) |
|
#define | DEF_INTERNAL_INT_EXT_FN(CODE, FLAGS, OPTAB, TYPE) |
|
#define | DEF_INTERNAL_SIGNED_OPTAB_FN(CODE, FLAGS, SELECTOR, SIGNED_OPTAB, UNSIGNED_OPTAB, TYPE) |
|
#define | DEF_INTERNAL_FN(CODE, FLAGS, FNSPEC) |
|
#define | DEF_INTERNAL_FLT_FN(NAME, FLAGS, OPTAB, TYPE) |
|
#define | DEF_INTERNAL_FLT_FLOATN_FN(NAME, FLAGS, OPTAB, TYPE) |
|
#define | DEF_INTERNAL_INT_FN(NAME, FLAGS, OPTAB, TYPE) |
|
#define | DEF_INTERNAL_WIDENING_OPTAB_FN(NAME, FLAGS, SELECTOR, SOPTAB, UOPTAB, TYPE) |
|
#define | DEF_INTERNAL_COND_FN(NAME, FLAGS, OPTAB, TYPE) |
|
#define | DEF_INTERNAL_SIGNED_COND_FN(NAME, FLAGS, SELECTOR, SIGNED_OPTAB, UNSIGNED_OPTAB, TYPE) |
|
#define | FOR_EACH_CODE_MAPPING(T) |
|
#define | CASE(CODE, IFN) |
|
#define | CASE(CODE, IFN) |
|
#define | CASE(CODE, IFN) |
|
#define | FOR_EACH_COND_FN_PAIR(T) |
|
#define | CASE(NAME) |
|
#define | DEF_INTERNAL_COND_FN(NAME, ...) |
|
#define | DEF_INTERNAL_SIGNED_COND_FN(NAME, ...) |
|
#define | DEF_INTERNAL_FN(CODE, FLAGS, FNSPEC) |
|
#define | DEF_INTERNAL_OPTAB_FN(NAME, FLAGS, OPTAB, TYPE) |
|
#define | DEF_INTERNAL_SIGNED_OPTAB_FN(NAME, FLAGS, SELECTOR, SIGNED_OPTAB, UNSIGNED_OPTAB, TYPE) |
|
#define | DEF_INTERNAL_FLT_FN(NAME, FLAGS, OPTAB, TYPE) |
|
#define | DEF_INTERNAL_FLT_FLOATN_FN(NAME, FLAGS, OPTAB, TYPE) |
|
#define | DEF_INTERNAL_INT_FN(NAME, FLAGS, OPTAB, TYPE) |
|
#define | DEF_INTERNAL_INT_EXT_FN(NAME, FLAGS, OPTAB, TYPE) |
|
#define | DEF_INTERNAL_WIDENING_OPTAB_FN(NAME, FLAGS, SELECTOR, SOPTAB, UOPTAB, TYPE) |
|
#define | CASE(NAME) |
|
|
internal_fn | lookup_internal_fn (const char *name) |
|
void | lookup_hilo_internal_fn (internal_fn ifn, internal_fn *lo, internal_fn *hi) |
|
void | lookup_evenodd_internal_fn (internal_fn ifn, internal_fn *even, internal_fn *odd) |
|
void | init_internal_fns () |
|
static void | create_call_lhs_operand (expand_operand *op, rtx lhs_rtx, machine_mode mode) |
|
static void | assign_call_lhs (tree lhs, rtx lhs_rtx, expand_operand *op) |
|
static void | expand_fn_using_insn (gcall *stmt, insn_code icode, unsigned int noutputs, unsigned int ninputs) |
|
static enum insn_code | get_multi_vector_move (tree array_type, convert_optab optab) |
|
static unsigned int | add_mask_and_len_args (expand_operand *ops, unsigned int opno, gcall *stmt) |
|
static void | expand_load_lanes_optab_fn (internal_fn, gcall *stmt, convert_optab optab) |
|
static void | expand_store_lanes_optab_fn (internal_fn, gcall *stmt, convert_optab optab) |
|
static void | expand_ANNOTATE (internal_fn, gcall *) |
|
static void | expand_GOMP_USE_SIMT (internal_fn, gcall *) |
|
static void | expand_GOMP_SIMT_ENTER (internal_fn, gcall *) |
|
static void | expand_GOMP_SIMT_ENTER_ALLOC (internal_fn, gcall *stmt) |
|
static void | expand_GOMP_SIMT_EXIT (internal_fn, gcall *stmt) |
|
static void | expand_GOMP_SIMT_LANE (internal_fn, gcall *stmt) |
|
static void | expand_GOMP_SIMT_VF (internal_fn, gcall *) |
|
static void | expand_GOMP_TARGET_REV (internal_fn, gcall *) |
|
static void | expand_GOMP_SIMT_LAST_LANE (internal_fn, gcall *stmt) |
|
static void | expand_GOMP_SIMT_ORDERED_PRED (internal_fn, gcall *stmt) |
|
static void | expand_GOMP_SIMT_VOTE_ANY (internal_fn, gcall *stmt) |
|
static void | expand_GOMP_SIMT_XCHG_BFLY (internal_fn, gcall *stmt) |
|
static void | expand_GOMP_SIMT_XCHG_IDX (internal_fn, gcall *stmt) |
|
static void | expand_GOMP_SIMD_LANE (internal_fn, gcall *) |
|
static void | expand_GOMP_SIMD_VF (internal_fn, gcall *) |
|
static void | expand_GOMP_SIMD_LAST_LANE (internal_fn, gcall *) |
|
static void | expand_GOMP_SIMD_ORDERED_START (internal_fn, gcall *) |
|
static void | expand_GOMP_SIMD_ORDERED_END (internal_fn, gcall *) |
|
static void | expand_UBSAN_NULL (internal_fn, gcall *) |
|
static void | expand_UBSAN_BOUNDS (internal_fn, gcall *) |
|
static void | expand_UBSAN_VPTR (internal_fn, gcall *) |
|
static void | expand_UBSAN_PTR (internal_fn, gcall *) |
|
static void | expand_UBSAN_OBJECT_SIZE (internal_fn, gcall *) |
|
static void | expand_HWASAN_CHECK (internal_fn, gcall *) |
|
static void | expand_HWASAN_ALLOCA_UNPOISON (internal_fn, gcall *gc) |
|
static void | expand_HWASAN_CHOOSE_TAG (internal_fn, gcall *gc) |
|
static void | expand_HWASAN_MARK (internal_fn, gcall *gc) |
|
static void | expand_HWASAN_SET_TAG (internal_fn, gcall *gc) |
|
static void | expand_ASAN_CHECK (internal_fn, gcall *) |
|
static void | expand_ASAN_MARK (internal_fn, gcall *) |
|
static void | expand_ASAN_POISON (internal_fn, gcall *) |
|
static void | expand_ASAN_POISON_USE (internal_fn, gcall *) |
|
static void | expand_TSAN_FUNC_EXIT (internal_fn, gcall *) |
|
static void | expand_FALLTHROUGH (internal_fn, gcall *call) |
|
static int | get_min_precision (tree arg, signop sign) |
|
static void | expand_arith_set_overflow (tree lhs, rtx target) |
|
static void | expand_arith_overflow_result_store (tree lhs, rtx target, scalar_int_mode mode, rtx res) |
|
static void | expand_ubsan_result_store (tree lhs, rtx target, scalar_int_mode mode, rtx res, rtx_code_label *do_error) |
|
void | expand_addsub_overflow (location_t loc, tree_code code, tree lhs, tree arg0, tree arg1, bool unsr_p, bool uns0_p, bool uns1_p, bool is_ubsan, tree *datap) |
|
static void | expand_neg_overflow (location_t loc, tree lhs, tree arg1, bool is_ubsan, tree *datap) |
|
static bool | can_widen_mult_without_libcall (scalar_int_mode wmode, scalar_int_mode mode, rtx op0, rtx op1, bool uns) |
|
static void | expand_mul_overflow (location_t loc, tree lhs, tree arg0, tree arg1, bool unsr_p, bool uns0_p, bool uns1_p, bool is_ubsan, tree *datap) |
|
static void | expand_vector_ubsan_overflow (location_t loc, enum tree_code code, tree lhs, tree arg0, tree arg1) |
|
static void | expand_UBSAN_CHECK_ADD (internal_fn, gcall *stmt) |
|
static void | expand_UBSAN_CHECK_SUB (internal_fn, gcall *stmt) |
|
static void | expand_UBSAN_CHECK_MUL (internal_fn, gcall *stmt) |
|
static void | expand_arith_overflow (enum tree_code code, gimple *stmt) |
|
static void | expand_ADD_OVERFLOW (internal_fn, gcall *stmt) |
|
static void | expand_SUB_OVERFLOW (internal_fn, gcall *stmt) |
|
static void | expand_MUL_OVERFLOW (internal_fn, gcall *stmt) |
|
static void | expand_UADDC (internal_fn ifn, gcall *stmt) |
|
static void | expand_USUBC (internal_fn ifn, gcall *stmt) |
|
static void | expand_LOOP_VECTORIZED (internal_fn, gcall *) |
|
static void | expand_LOOP_DIST_ALIAS (internal_fn, gcall *) |
|
static tree | expand_call_mem_ref (tree type, gcall *stmt, int index) |
|
static void | expand_partial_load_optab_fn (internal_fn ifn, gcall *stmt, convert_optab optab) |
|
static void | expand_partial_store_optab_fn (internal_fn ifn, gcall *stmt, convert_optab optab) |
|
static void | expand_vec_cond_optab_fn (internal_fn, gcall *stmt, convert_optab optab) |
|
static void | expand_vec_cond_mask_optab_fn (internal_fn, gcall *stmt, convert_optab optab) |
|
static void | expand_vec_set_optab_fn (internal_fn, gcall *stmt, convert_optab optab) |
|
static void | expand_ABNORMAL_DISPATCHER (internal_fn, gcall *) |
|
static void | expand_BUILTIN_EXPECT (internal_fn, gcall *stmt) |
|
static void | expand_VA_ARG (internal_fn, gcall *) |
|
static void | expand_VEC_CONVERT (internal_fn, gcall *) |
|
void | expand_RAWMEMCHR (internal_fn, gcall *stmt) |
|
static void | expand_UNIQUE (internal_fn, gcall *stmt) |
|
static void | expand_DEFERRED_INIT (internal_fn, gcall *stmt) |
|
static void | expand_ACCESS_WITH_SIZE (internal_fn, gcall *stmt) |
|
static void | expand_GOACC_DIM_SIZE (internal_fn, gcall *stmt) |
|
static void | expand_GOACC_DIM_POS (internal_fn, gcall *stmt) |
|
static void | expand_GOACC_LOOP (internal_fn, gcall *) |
|
static void | expand_GOACC_REDUCTION (internal_fn, gcall *) |
|
static void | expand_GOACC_TILE (internal_fn, gcall *) |
|
static void | expand_SET_EDOM (internal_fn, gcall *) |
|
static void | expand_ATOMIC_BIT_TEST_AND_SET (internal_fn, gcall *call) |
|
static void | expand_ATOMIC_BIT_TEST_AND_COMPLEMENT (internal_fn, gcall *call) |
|
static void | expand_ATOMIC_BIT_TEST_AND_RESET (internal_fn, gcall *call) |
|
static void | expand_ATOMIC_COMPARE_EXCHANGE (internal_fn, gcall *call) |
|
static void | expand_ATOMIC_ADD_FETCH_CMP_0 (internal_fn, gcall *call) |
|
static void | expand_ATOMIC_SUB_FETCH_CMP_0 (internal_fn, gcall *call) |
|
static void | expand_ATOMIC_AND_FETCH_CMP_0 (internal_fn, gcall *call) |
|
static void | expand_ATOMIC_OR_FETCH_CMP_0 (internal_fn, gcall *call) |
|
static void | expand_ATOMIC_XOR_FETCH_CMP_0 (internal_fn, gcall *call) |
|
static void | expand_LAUNDER (internal_fn, gcall *call) |
|
static void | expand_scatter_store_optab_fn (internal_fn, gcall *stmt, direct_optab optab) |
|
static void | expand_gather_load_optab_fn (internal_fn, gcall *stmt, direct_optab optab) |
|
static bool | contains_call_div_mod (rtx_insn *insn) |
|
static void | expand_DIVMOD (internal_fn, gcall *call_stmt) |
|
static void | expand_NOP (internal_fn, gcall *) |
|
static void | expand_CO_FRAME (internal_fn, gcall *) |
|
static void | expand_CO_YIELD (internal_fn, gcall *) |
|
static void | expand_CO_SUSPN (internal_fn, gcall *) |
|
static void | expand_CO_ACTOR (internal_fn, gcall *) |
|
static void | expand_direct_optab_fn (internal_fn fn, gcall *stmt, direct_optab optab, unsigned int nargs) |
|
static void | expand_while_optab_fn (internal_fn, gcall *stmt, convert_optab optab) |
|
static void | expand_convert_optab_fn (internal_fn fn, gcall *stmt, convert_optab optab, unsigned int nargs) |
|
tree_pair | direct_internal_fn_types (internal_fn fn, tree return_type, tree *args) |
|
tree_pair | direct_internal_fn_types (internal_fn fn, gcall *call) |
|
static bool | direct_optab_supported_p (direct_optab optab, tree_pair types, optimization_type opt_type) |
|
static bool | convert_optab_supported_p (convert_optab optab, tree_pair types, optimization_type opt_type) |
|
static bool | multi_vector_optab_supported_p (convert_optab optab, tree_pair types, optimization_type opt_type) |
|
optab | direct_internal_fn_optab (internal_fn fn, tree_pair types) |
|
static optab | direct_internal_fn_optab (internal_fn fn) |
|
static bool | type_strictly_matches_mode_p (const_tree type) |
|
static bool | type_pair_strictly_matches_mode_p (tree_pair type_pair) |
|
bool | direct_internal_fn_supported_p (internal_fn fn, tree_pair types, optimization_type opt_type) |
|
bool | direct_internal_fn_supported_p (internal_fn fn, tree type, optimization_type opt_type) |
|
bool | direct_internal_fn_supported_p (gcall *stmt, optimization_type opt_type) |
|
bool | commutative_binary_fn_p (internal_fn fn) |
|
bool | commutative_ternary_fn_p (internal_fn fn) |
|
bool | associative_binary_fn_p (internal_fn fn) |
|
int | first_commutative_argument (internal_fn fn) |
|
bool | widening_fn_p (code_helper code) |
|
bool | set_edom_supported_p (void) |
|
internal_fn | get_conditional_internal_fn (tree_code code) |
|
tree_code | conditional_internal_fn_code (internal_fn ifn) |
|
internal_fn | get_conditional_len_internal_fn (tree_code code) |
|
internal_fn | get_conditional_internal_fn (internal_fn fn) |
|
internal_fn | get_len_internal_fn (internal_fn fn) |
|
internal_fn | get_unconditional_internal_fn (internal_fn ifn) |
|
bool | can_interpret_as_conditional_op_p (gimple *stmt, tree *cond_out, tree_code *code_out, tree(&ops)[3], tree *else_out, tree *len, tree *bias) |
|
bool | internal_load_fn_p (internal_fn fn) |
|
bool | internal_store_fn_p (internal_fn fn) |
|
bool | internal_gather_scatter_fn_p (internal_fn fn) |
|
int | internal_fn_len_index (internal_fn fn) |
|
int | internal_fn_else_index (internal_fn fn) |
|
int | internal_fn_mask_index (internal_fn fn) |
|
int | internal_fn_stored_value_index (internal_fn fn) |
|
bool | internal_gather_scatter_fn_supported_p (internal_fn ifn, tree vector_type, tree memory_element_type, tree offset_vector_type, int scale) |
|
bool | internal_check_ptrs_fn_supported_p (internal_fn ifn, tree type, poly_uint64 length, unsigned int align) |
|
signed char | internal_len_load_store_bias (internal_fn ifn, machine_mode mode) |
|
void | expand_internal_call (internal_fn fn, gcall *stmt) |
|
void | expand_internal_call (gcall *stmt) |
|
bool | vectorized_internal_fn_supported_p (internal_fn ifn, tree type) |
|
void | expand_SHUFFLEVECTOR (internal_fn, gcall *) |
|
void | expand_PHI (internal_fn, gcall *) |
|
void | expand_SPACESHIP (internal_fn, gcall *stmt) |
|
void | expand_ASSUME (internal_fn, gcall *) |
|
void | expand_MASK_CALL (internal_fn, gcall *) |
|
void | expand_MULBITINT (internal_fn, gcall *stmt) |
|
void | expand_DIVMODBITINT (internal_fn, gcall *stmt) |
|
void | expand_FLOATTOBITINT (internal_fn, gcall *stmt) |
|
void | expand_BITINTTOFLOAT (internal_fn, gcall *stmt) |
|
static bool | expand_bitquery (internal_fn fn, gcall *stmt) |
|
void | expand_CLRSB (internal_fn fn, gcall *stmt) |
|
void | expand_CLZ (internal_fn fn, gcall *stmt) |
|
void | expand_CTZ (internal_fn fn, gcall *stmt) |
|
void | expand_FFS (internal_fn fn, gcall *stmt) |
|
void | expand_PARITY (internal_fn fn, gcall *stmt) |
|
void | expand_POPCOUNT (internal_fn fn, gcall *stmt) |
|
Return the optab used by internal function FN.
Internal functions.
Copyright (C) 2011-2024 Free Software Foundation, Inc.
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/>.
This file specifies a list of internal "functions". These functions
differ from built-in functions in that they have no linkage and cannot
be called directly by the user. They represent operations that are only
synthesised by GCC itself.
Internal functions are used instead of tree codes if the operation
and its operands are more naturally represented as a GIMPLE_CALL
than a GIMPLE_ASSIGN.
Each entry in this file has one of the forms:
DEF_INTERNAL_FN (NAME, FLAGS, FNSPEC)
DEF_INTERNAL_OPTAB_FN (NAME, FLAGS, OPTAB, TYPE)
DEF_INTERNAL_SIGNED_OPTAB_FN (NAME, FLAGS, SELECTOR, SIGNED_OPTAB,
UNSIGNED_OPTAB, TYPE)
DEF_INTERNAL_FLT_FN (NAME, FLAGS, OPTAB, TYPE)
DEF_INTERNAL_FLT_FLOATN_FN (NAME, FLAGS, OPTAB, TYPE)
DEF_INTERNAL_INT_FN (NAME, FLAGS, OPTAB, TYPE)
DEF_INTERNAL_INT_EXT_FN (NAME, FLAGS, OPTAB, TYPE)
DEF_INTERNAL_COND_FN (NAME, FLAGS, OPTAB, TYPE)
DEF_INTERNAL_SIGNED_COND_FN (NAME, FLAGS, OPTAB, TYPE)
DEF_INTERNAL_WIDENING_OPTAB_FN (NAME, FLAGS, SELECTOR, SOPTAB, UOPTAB,
TYPE)
where NAME is the name of the function, FLAGS is a set of
ECF_* flags and FNSPEC is a string describing functions fnspec.
DEF_INTERNAL_OPTAB_FN defines an internal function that maps to a
direct optab. The function should only be called with a given
set of types if the associated optab is available for the modes
of those types. OPTAB says what optab to use (without the trailing
"_optab") and TYPE categorizes the optab based on its inputs and
outputs. The possible types of optab are:
- mask_load: currently just maskload
- load_lanes: currently just vec_load_lanes
- mask_load_lanes: currently just vec_mask_load_lanes
- mask_len_load_lanes: currently just vec_mask_len_load_lanes
- gather_load: used for {mask_,mask_len_,}gather_load
- len_load: currently just len_load
- mask_len_load: currently just mask_len_load
- mask_store: currently just maskstore
- store_lanes: currently just vec_store_lanes
- mask_store_lanes: currently just vec_mask_store_lanes
- mask_len_store_lanes: currently just vec_mask_len_store_lanes
- scatter_store: used for {mask_,mask_len_,}scatter_store
- len_store: currently just len_store
- mask_len_store: currently just mask_len_store
- unary: a normal unary optab, such as vec_reverse_<mode>
- binary: a normal binary optab, such as vec_interleave_lo_<mode>
- ternary: a normal ternary optab, such as fma<mode>4
- unary_convert: a single-input conversion optab, such as
lround<srcmode><dstmode>2.
- cond_binary: a conditional binary optab, such as cond_add<mode>
- cond_unary: a conditional unary optab, such as cond_neg<mode>
- cond_ternary: a conditional ternary optab, such as cond_fma_rev<mode>
- fold_left: for scalar = FN (scalar, vector), keyed off the vector mode
- check_ptrs: used for check_{raw,war}_ptrs
- cond_len_unary: a conditional unary optab, such as cond_len_neg<mode>
- cond_len_binary: a conditional binary optab, such as cond_len_add<mode>
- cond_len_ternary: a conditional ternary optab, such as
cond_len_fma_rev<mode>
DEF_INTERNAL_SIGNED_OPTAB_FN defines an internal function that
maps to one of two optabs, depending on the signedness of an input.
SIGNED_OPTAB and UNSIGNED_OPTAB are the optabs for signed and
unsigned inputs respectively, both without the trailing "_optab".
SELECTOR says which type in the tree_pair determines the signedness.
DEF_INTERNAL_FLT_FN is like DEF_INTERNAL_OPTAB_FN, but in addition,
the function implements the computational part of a built-in math
function BUILT_IN_<NAME>{F,,L}. Unlike some built-in functions,
these internal functions never set errno.
DEF_INTERNAL_INT_FN is like DEF_INTERNAL_OPTAB_FN, but in addition
says that the function extends the C-level BUILT_IN_<NAME>{,L,LL,IMAX}
group of functions to any integral mode (including vector modes).
DEF_INTERNAL_INT_EXT_FN is like DEF_INTERNAL_INT_FN, except that it
has expand_##NAME defined in internal-fn.cc to override the
DEF_INTERNAL_INT_FN expansion behavior.
DEF_INTERNAL_WIDENING_OPTAB_FN is a wrapper that defines five internal
functions with DEF_INTERNAL_SIGNED_OPTAB_FN:
- one that describes a widening operation with the same number of elements
in the output and input vectors,
- two that describe a pair of high-low widening operations where the output
vectors each have half the number of elements of the input vectors,
corresponding to the result of the widening operation on the top half and
bottom half, these have the suffixes _HI and _LO,
- and two that describe a pair of even-odd widening operations where the
output vectors each have half the number of elements of the input vectors,
corresponding to the result of the widening operation on the even and odd
elements, these have the suffixes _EVEN and _ODD.
These five internal functions will require two optabs each, a SIGNED_OPTAB
and an UNSIGNED_OTPAB.
DEF_INTERNAL_COND_FN is a wrapper that defines 2 internal functions with
DEF_INTERNAL_OPTAB_FN:
- One is COND_* operations that are predicated by mask only. Such operations
make sense for both vectors and scalars.
- The other is COND_LEN_* operations that are predicated by mask and len
both. Such operations only make sense for vectors.
DEF_INTERNAL_SIGNED_COND_FN is like DEF_INTERNAL_COND_FN but defines intenal
functions with DEF_INTERNAL_SIGNED_OPTAB_FN.
Each entry must have a corresponding expander of the form:
void expand_NAME (gimple_call stmt)
where STMT is the statement that performs the call. These are generated
automatically for optab functions and call out to a function or macro
called expand_<TYPE>_optab_fn.
Extract the last active element from a vector.
Same, but return the first argument if no elements are active.
Unary math functions.
Floating-point to integer conversions.
??? Here we preserve the I/L/LL prefix convention from the
corresponding built-in functions, rather than make the internal
functions polymorphic in both the argument and the return types.
Perhaps an alternative would be to pass a zero of the required
return type as a second parameter.
FP rounding.
Binary math functions.
FP scales.
Ternary math functions.
Unary integer ops.
An unduplicable, uncombinable function. Generally used to preserve
a CFG property in the face of jump threading, tail merging or
other such optimizations. The first argument distinguishes
between uses. See internal-fn.h for usage.
A function to represent an artifical initialization to an uninitialized
automatic variable.
A function to associate the access size and access mode information
with the corresponding reference to an object. It only reads from the
2nd argument.
DIM_SIZE and DIM_POS return the size of a particular compute
dimension and the executing thread's position within that
dimension. DIM_POS is pure (and not const) so that it isn't
thought to clobber memory and can be gcse'd within a single
parallel region, but not across FORK/JOIN boundaries. They take a
single INTEGER_CST argument. This might be overly conservative.
OpenACC looping abstraction. See internal-fn.h for usage.
OpenACC reduction abstraction. See internal-fn.h for usage.
Openacc tile abstraction. Describes the spans of the element loop.
GOACC_TILE (num-loops, loop-no, tile-arg, tile-mask, element-mask).
Set errno to EDOM, if GCC knows how to do that directly for the
current target.
Atomic functions. These don't have ECF_NOTHROW because for
-fnon-call-exceptions they can throw, otherwise we set
gimple_call_nothrow_p on it.
To implement [[fallthrough]]. If the TREE_NOTHROW or GF_CALL_NOTHROW flag
is set on the call (normally redundant with ECF_NOTHROW), it marks
[[fallthrough]] at the end of C++ loop body.
To implement __builtin_launder.
Divmod function.
For coroutines.
A NOP function with arbitrary arguments and return value.
Temporary vehicle for __builtin_shufflevector.
<=> optimization.
[[assume (cond)]].
For if-conversion of inbranch SIMD clones.
_BitInt support.
Bitwise functions.
References gcc_unreachable.
Return the optab used by internal function FN.
Internal functions.
Copyright (C) 2011-2024 Free Software Foundation, Inc.
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/>.
This file specifies a list of internal "functions". These functions
differ from built-in functions in that they have no linkage and cannot
be called directly by the user. They represent operations that are only
synthesised by GCC itself.
Internal functions are used instead of tree codes if the operation
and its operands are more naturally represented as a GIMPLE_CALL
than a GIMPLE_ASSIGN.
Each entry in this file has one of the forms:
DEF_INTERNAL_FN (NAME, FLAGS, FNSPEC)
DEF_INTERNAL_OPTAB_FN (NAME, FLAGS, OPTAB, TYPE)
DEF_INTERNAL_SIGNED_OPTAB_FN (NAME, FLAGS, SELECTOR, SIGNED_OPTAB,
UNSIGNED_OPTAB, TYPE)
DEF_INTERNAL_FLT_FN (NAME, FLAGS, OPTAB, TYPE)
DEF_INTERNAL_FLT_FLOATN_FN (NAME, FLAGS, OPTAB, TYPE)
DEF_INTERNAL_INT_FN (NAME, FLAGS, OPTAB, TYPE)
DEF_INTERNAL_INT_EXT_FN (NAME, FLAGS, OPTAB, TYPE)
DEF_INTERNAL_COND_FN (NAME, FLAGS, OPTAB, TYPE)
DEF_INTERNAL_SIGNED_COND_FN (NAME, FLAGS, OPTAB, TYPE)
DEF_INTERNAL_WIDENING_OPTAB_FN (NAME, FLAGS, SELECTOR, SOPTAB, UOPTAB,
TYPE)
where NAME is the name of the function, FLAGS is a set of
ECF_* flags and FNSPEC is a string describing functions fnspec.
DEF_INTERNAL_OPTAB_FN defines an internal function that maps to a
direct optab. The function should only be called with a given
set of types if the associated optab is available for the modes
of those types. OPTAB says what optab to use (without the trailing
"_optab") and TYPE categorizes the optab based on its inputs and
outputs. The possible types of optab are:
- mask_load: currently just maskload
- load_lanes: currently just vec_load_lanes
- mask_load_lanes: currently just vec_mask_load_lanes
- mask_len_load_lanes: currently just vec_mask_len_load_lanes
- gather_load: used for {mask_,mask_len_,}gather_load
- len_load: currently just len_load
- mask_len_load: currently just mask_len_load
- mask_store: currently just maskstore
- store_lanes: currently just vec_store_lanes
- mask_store_lanes: currently just vec_mask_store_lanes
- mask_len_store_lanes: currently just vec_mask_len_store_lanes
- scatter_store: used for {mask_,mask_len_,}scatter_store
- len_store: currently just len_store
- mask_len_store: currently just mask_len_store
- unary: a normal unary optab, such as vec_reverse_<mode>
- binary: a normal binary optab, such as vec_interleave_lo_<mode>
- ternary: a normal ternary optab, such as fma<mode>4
- unary_convert: a single-input conversion optab, such as
lround<srcmode><dstmode>2.
- cond_binary: a conditional binary optab, such as cond_add<mode>
- cond_unary: a conditional unary optab, such as cond_neg<mode>
- cond_ternary: a conditional ternary optab, such as cond_fma_rev<mode>
- fold_left: for scalar = FN (scalar, vector), keyed off the vector mode
- check_ptrs: used for check_{raw,war}_ptrs
- cond_len_unary: a conditional unary optab, such as cond_len_neg<mode>
- cond_len_binary: a conditional binary optab, such as cond_len_add<mode>
- cond_len_ternary: a conditional ternary optab, such as
cond_len_fma_rev<mode>
DEF_INTERNAL_SIGNED_OPTAB_FN defines an internal function that
maps to one of two optabs, depending on the signedness of an input.
SIGNED_OPTAB and UNSIGNED_OPTAB are the optabs for signed and
unsigned inputs respectively, both without the trailing "_optab".
SELECTOR says which type in the tree_pair determines the signedness.
DEF_INTERNAL_FLT_FN is like DEF_INTERNAL_OPTAB_FN, but in addition,
the function implements the computational part of a built-in math
function BUILT_IN_<NAME>{F,,L}. Unlike some built-in functions,
these internal functions never set errno.
DEF_INTERNAL_INT_FN is like DEF_INTERNAL_OPTAB_FN, but in addition
says that the function extends the C-level BUILT_IN_<NAME>{,L,LL,IMAX}
group of functions to any integral mode (including vector modes).
DEF_INTERNAL_INT_EXT_FN is like DEF_INTERNAL_INT_FN, except that it
has expand_##NAME defined in internal-fn.cc to override the
DEF_INTERNAL_INT_FN expansion behavior.
DEF_INTERNAL_WIDENING_OPTAB_FN is a wrapper that defines five internal
functions with DEF_INTERNAL_SIGNED_OPTAB_FN:
- one that describes a widening operation with the same number of elements
in the output and input vectors,
- two that describe a pair of high-low widening operations where the output
vectors each have half the number of elements of the input vectors,
corresponding to the result of the widening operation on the top half and
bottom half, these have the suffixes _HI and _LO,
- and two that describe a pair of even-odd widening operations where the
output vectors each have half the number of elements of the input vectors,
corresponding to the result of the widening operation on the even and odd
elements, these have the suffixes _EVEN and _ODD.
These five internal functions will require two optabs each, a SIGNED_OPTAB
and an UNSIGNED_OTPAB.
DEF_INTERNAL_COND_FN is a wrapper that defines 2 internal functions with
DEF_INTERNAL_OPTAB_FN:
- One is COND_* operations that are predicated by mask only. Such operations
make sense for both vectors and scalars.
- The other is COND_LEN_* operations that are predicated by mask and len
both. Such operations only make sense for vectors.
DEF_INTERNAL_SIGNED_COND_FN is like DEF_INTERNAL_COND_FN but defines intenal
functions with DEF_INTERNAL_SIGNED_OPTAB_FN.
Each entry must have a corresponding expander of the form:
void expand_NAME (gimple_call stmt)
where STMT is the statement that performs the call. These are generated
automatically for optab functions and call out to a function or macro
called expand_<TYPE>_optab_fn.
Extract the last active element from a vector.
Same, but return the first argument if no elements are active.
Unary math functions.
Floating-point to integer conversions.
??? Here we preserve the I/L/LL prefix convention from the
corresponding built-in functions, rather than make the internal
functions polymorphic in both the argument and the return types.
Perhaps an alternative would be to pass a zero of the required
return type as a second parameter.
FP rounding.
Binary math functions.
FP scales.
Ternary math functions.
Unary integer ops.
An unduplicable, uncombinable function. Generally used to preserve
a CFG property in the face of jump threading, tail merging or
other such optimizations. The first argument distinguishes
between uses. See internal-fn.h for usage.
A function to represent an artifical initialization to an uninitialized
automatic variable.
A function to associate the access size and access mode information
with the corresponding reference to an object. It only reads from the
2nd argument.
DIM_SIZE and DIM_POS return the size of a particular compute
dimension and the executing thread's position within that
dimension. DIM_POS is pure (and not const) so that it isn't
thought to clobber memory and can be gcse'd within a single
parallel region, but not across FORK/JOIN boundaries. They take a
single INTEGER_CST argument. This might be overly conservative.
OpenACC looping abstraction. See internal-fn.h for usage.
OpenACC reduction abstraction. See internal-fn.h for usage.
Openacc tile abstraction. Describes the spans of the element loop.
GOACC_TILE (num-loops, loop-no, tile-arg, tile-mask, element-mask).
Set errno to EDOM, if GCC knows how to do that directly for the
current target.
Atomic functions. These don't have ECF_NOTHROW because for
-fnon-call-exceptions they can throw, otherwise we set
gimple_call_nothrow_p on it.
To implement [[fallthrough]]. If the TREE_NOTHROW or GF_CALL_NOTHROW flag
is set on the call (normally redundant with ECF_NOTHROW), it marks
[[fallthrough]] at the end of C++ loop body.
To implement __builtin_launder.
Divmod function.
For coroutines.
A NOP function with arbitrary arguments and return value.
Temporary vehicle for __builtin_shufflevector.
<=> optimization.
[[assume (cond)]].
For if-conversion of inbranch SIMD clones.
_BitInt support.
Bitwise functions.
References gcc_unreachable.
Referenced by internal_check_ptrs_fn_supported_p(), internal_gather_scatter_fn_supported_p(), internal_len_load_store_bias(), and supportable_widening_operation().
Return true if FN is supported for the types in TYPES when the
optimization type is OPT_TYPE. The types are those associated with
the "type0" and "type1" fields of FN's direct_internal_fn_info
structure.
Internal functions.
Copyright (C) 2011-2024 Free Software Foundation, Inc.
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/>.
This file specifies a list of internal "functions". These functions
differ from built-in functions in that they have no linkage and cannot
be called directly by the user. They represent operations that are only
synthesised by GCC itself.
Internal functions are used instead of tree codes if the operation
and its operands are more naturally represented as a GIMPLE_CALL
than a GIMPLE_ASSIGN.
Each entry in this file has one of the forms:
DEF_INTERNAL_FN (NAME, FLAGS, FNSPEC)
DEF_INTERNAL_OPTAB_FN (NAME, FLAGS, OPTAB, TYPE)
DEF_INTERNAL_SIGNED_OPTAB_FN (NAME, FLAGS, SELECTOR, SIGNED_OPTAB,
UNSIGNED_OPTAB, TYPE)
DEF_INTERNAL_FLT_FN (NAME, FLAGS, OPTAB, TYPE)
DEF_INTERNAL_FLT_FLOATN_FN (NAME, FLAGS, OPTAB, TYPE)
DEF_INTERNAL_INT_FN (NAME, FLAGS, OPTAB, TYPE)
DEF_INTERNAL_INT_EXT_FN (NAME, FLAGS, OPTAB, TYPE)
DEF_INTERNAL_COND_FN (NAME, FLAGS, OPTAB, TYPE)
DEF_INTERNAL_SIGNED_COND_FN (NAME, FLAGS, OPTAB, TYPE)
DEF_INTERNAL_WIDENING_OPTAB_FN (NAME, FLAGS, SELECTOR, SOPTAB, UOPTAB,
TYPE)
where NAME is the name of the function, FLAGS is a set of
ECF_* flags and FNSPEC is a string describing functions fnspec.
DEF_INTERNAL_OPTAB_FN defines an internal function that maps to a
direct optab. The function should only be called with a given
set of types if the associated optab is available for the modes
of those types. OPTAB says what optab to use (without the trailing
"_optab") and TYPE categorizes the optab based on its inputs and
outputs. The possible types of optab are:
- mask_load: currently just maskload
- load_lanes: currently just vec_load_lanes
- mask_load_lanes: currently just vec_mask_load_lanes
- mask_len_load_lanes: currently just vec_mask_len_load_lanes
- gather_load: used for {mask_,mask_len_,}gather_load
- len_load: currently just len_load
- mask_len_load: currently just mask_len_load
- mask_store: currently just maskstore
- store_lanes: currently just vec_store_lanes
- mask_store_lanes: currently just vec_mask_store_lanes
- mask_len_store_lanes: currently just vec_mask_len_store_lanes
- scatter_store: used for {mask_,mask_len_,}scatter_store
- len_store: currently just len_store
- mask_len_store: currently just mask_len_store
- unary: a normal unary optab, such as vec_reverse_<mode>
- binary: a normal binary optab, such as vec_interleave_lo_<mode>
- ternary: a normal ternary optab, such as fma<mode>4
- unary_convert: a single-input conversion optab, such as
lround<srcmode><dstmode>2.
- cond_binary: a conditional binary optab, such as cond_add<mode>
- cond_unary: a conditional unary optab, such as cond_neg<mode>
- cond_ternary: a conditional ternary optab, such as cond_fma_rev<mode>
- fold_left: for scalar = FN (scalar, vector), keyed off the vector mode
- check_ptrs: used for check_{raw,war}_ptrs
- cond_len_unary: a conditional unary optab, such as cond_len_neg<mode>
- cond_len_binary: a conditional binary optab, such as cond_len_add<mode>
- cond_len_ternary: a conditional ternary optab, such as
cond_len_fma_rev<mode>
DEF_INTERNAL_SIGNED_OPTAB_FN defines an internal function that
maps to one of two optabs, depending on the signedness of an input.
SIGNED_OPTAB and UNSIGNED_OPTAB are the optabs for signed and
unsigned inputs respectively, both without the trailing "_optab".
SELECTOR says which type in the tree_pair determines the signedness.
DEF_INTERNAL_FLT_FN is like DEF_INTERNAL_OPTAB_FN, but in addition,
the function implements the computational part of a built-in math
function BUILT_IN_<NAME>{F,,L}. Unlike some built-in functions,
these internal functions never set errno.
DEF_INTERNAL_INT_FN is like DEF_INTERNAL_OPTAB_FN, but in addition
says that the function extends the C-level BUILT_IN_<NAME>{,L,LL,IMAX}
group of functions to any integral mode (including vector modes).
DEF_INTERNAL_INT_EXT_FN is like DEF_INTERNAL_INT_FN, except that it
has expand_##NAME defined in internal-fn.cc to override the
DEF_INTERNAL_INT_FN expansion behavior.
DEF_INTERNAL_WIDENING_OPTAB_FN is a wrapper that defines five internal
functions with DEF_INTERNAL_SIGNED_OPTAB_FN:
- one that describes a widening operation with the same number of elements
in the output and input vectors,
- two that describe a pair of high-low widening operations where the output
vectors each have half the number of elements of the input vectors,
corresponding to the result of the widening operation on the top half and
bottom half, these have the suffixes _HI and _LO,
- and two that describe a pair of even-odd widening operations where the
output vectors each have half the number of elements of the input vectors,
corresponding to the result of the widening operation on the even and odd
elements, these have the suffixes _EVEN and _ODD.
These five internal functions will require two optabs each, a SIGNED_OPTAB
and an UNSIGNED_OTPAB.
DEF_INTERNAL_COND_FN is a wrapper that defines 2 internal functions with
DEF_INTERNAL_OPTAB_FN:
- One is COND_* operations that are predicated by mask only. Such operations
make sense for both vectors and scalars.
- The other is COND_LEN_* operations that are predicated by mask and len
both. Such operations only make sense for vectors.
DEF_INTERNAL_SIGNED_COND_FN is like DEF_INTERNAL_COND_FN but defines intenal
functions with DEF_INTERNAL_SIGNED_OPTAB_FN.
Each entry must have a corresponding expander of the form:
void expand_NAME (gimple_call stmt)
where STMT is the statement that performs the call. These are generated
automatically for optab functions and call out to a function or macro
called expand_<TYPE>_optab_fn.
Extract the last active element from a vector.
Same, but return the first argument if no elements are active.
Unary math functions.
Floating-point to integer conversions.
??? Here we preserve the I/L/LL prefix convention from the
corresponding built-in functions, rather than make the internal
functions polymorphic in both the argument and the return types.
Perhaps an alternative would be to pass a zero of the required
return type as a second parameter.
FP rounding.
Binary math functions.
FP scales.
Ternary math functions.
Unary integer ops.
An unduplicable, uncombinable function. Generally used to preserve
a CFG property in the face of jump threading, tail merging or
other such optimizations. The first argument distinguishes
between uses. See internal-fn.h for usage.
A function to represent an artifical initialization to an uninitialized
automatic variable.
A function to associate the access size and access mode information
with the corresponding reference to an object. It only reads from the
2nd argument.
DIM_SIZE and DIM_POS return the size of a particular compute
dimension and the executing thread's position within that
dimension. DIM_POS is pure (and not const) so that it isn't
thought to clobber memory and can be gcse'd within a single
parallel region, but not across FORK/JOIN boundaries. They take a
single INTEGER_CST argument. This might be overly conservative.
OpenACC looping abstraction. See internal-fn.h for usage.
OpenACC reduction abstraction. See internal-fn.h for usage.
Openacc tile abstraction. Describes the spans of the element loop.
GOACC_TILE (num-loops, loop-no, tile-arg, tile-mask, element-mask).
Set errno to EDOM, if GCC knows how to do that directly for the
current target.
Atomic functions. These don't have ECF_NOTHROW because for
-fnon-call-exceptions they can throw, otherwise we set
gimple_call_nothrow_p on it.
To implement [[fallthrough]]. If the TREE_NOTHROW or GF_CALL_NOTHROW flag
is set on the call (normally redundant with ECF_NOTHROW), it marks
[[fallthrough]] at the end of C++ loop body.
To implement __builtin_launder.
Divmod function.
For coroutines.
A NOP function with arbitrary arguments and return value.
Temporary vehicle for __builtin_shufflevector.
<=> optimization.
[[assume (cond)]].
For if-conversion of inbranch SIMD clones.
_BitInt support.
Bitwise functions.
References gcc_unreachable, and type_pair_strictly_matches_mode_p().
Referenced by build_call_internal(), build_cltz_expr(), build_popcount_expr(), build_saturation_binary_arith_call(), build_saturation_binary_arith_call(), can_log2(), can_produce_all_loop_masks_p(), cond_removal_in_builtin_zero_pattern(), convert_mult_to_fma(), direct_internal_fn_supported_p(), direct_internal_fn_supported_p(), direct_internal_fn_supported_p(), directly_supported_p(), directly_supported_p(), fold_builtin_bit_query(), get_masked_reduction_fn(), gimple_expand_vec_cond_expr(), internal_fn_reciprocal(), match_single_bit_test(), match_unsigned_saturation_trunc(), maybe_build_call_expr_loc(), optimize_count_trailing_zeroes(), reassociate_bb(), replacement_internal_fn(), try_vectorize_loop_1(), use_mask_by_cond_expr_p(), vect_analyze_loop_2(), vect_gen_while(), vect_pattern_validate_optab(), vect_recog_abd_pattern(), vect_recog_average_pattern(), vect_recog_build_binary_gimple_stmt(), vect_recog_ctz_ffs_pattern(), vect_recog_divmod_pattern(), vect_recog_mulhs_pattern(), vect_recog_popcount_clz_ctz_ffs_pattern(), vect_recog_pow_pattern(), vect_recog_sat_sub_pattern_transform(), vect_recog_sat_trunc_pattern(), vect_reduction_update_partial_vector_usage(), vectorizable_bb_reduc_epilogue(), vectorizable_call(), vectorizable_condition(), vectorizable_early_exit(), vectorizable_internal_function(), vectorizable_live_operation(), vectorizable_operation(), vectorizable_reduction(), and vectorized_internal_fn_supported_p().
If there exists an internal function like IFN that operates on vectors,
but with additional length and bias parameters, return the internal_fn
for that function, otherwise return IFN_LAST.
Internal functions.
Copyright (C) 2011-2024 Free Software Foundation, Inc.
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/>.
This file specifies a list of internal "functions". These functions
differ from built-in functions in that they have no linkage and cannot
be called directly by the user. They represent operations that are only
synthesised by GCC itself.
Internal functions are used instead of tree codes if the operation
and its operands are more naturally represented as a GIMPLE_CALL
than a GIMPLE_ASSIGN.
Each entry in this file has one of the forms:
DEF_INTERNAL_FN (NAME, FLAGS, FNSPEC)
DEF_INTERNAL_OPTAB_FN (NAME, FLAGS, OPTAB, TYPE)
DEF_INTERNAL_SIGNED_OPTAB_FN (NAME, FLAGS, SELECTOR, SIGNED_OPTAB,
UNSIGNED_OPTAB, TYPE)
DEF_INTERNAL_FLT_FN (NAME, FLAGS, OPTAB, TYPE)
DEF_INTERNAL_FLT_FLOATN_FN (NAME, FLAGS, OPTAB, TYPE)
DEF_INTERNAL_INT_FN (NAME, FLAGS, OPTAB, TYPE)
DEF_INTERNAL_INT_EXT_FN (NAME, FLAGS, OPTAB, TYPE)
DEF_INTERNAL_COND_FN (NAME, FLAGS, OPTAB, TYPE)
DEF_INTERNAL_SIGNED_COND_FN (NAME, FLAGS, OPTAB, TYPE)
DEF_INTERNAL_WIDENING_OPTAB_FN (NAME, FLAGS, SELECTOR, SOPTAB, UOPTAB,
TYPE)
where NAME is the name of the function, FLAGS is a set of
ECF_* flags and FNSPEC is a string describing functions fnspec.
DEF_INTERNAL_OPTAB_FN defines an internal function that maps to a
direct optab. The function should only be called with a given
set of types if the associated optab is available for the modes
of those types. OPTAB says what optab to use (without the trailing
"_optab") and TYPE categorizes the optab based on its inputs and
outputs. The possible types of optab are:
- mask_load: currently just maskload
- load_lanes: currently just vec_load_lanes
- mask_load_lanes: currently just vec_mask_load_lanes
- mask_len_load_lanes: currently just vec_mask_len_load_lanes
- gather_load: used for {mask_,mask_len_,}gather_load
- len_load: currently just len_load
- mask_len_load: currently just mask_len_load
- mask_store: currently just maskstore
- store_lanes: currently just vec_store_lanes
- mask_store_lanes: currently just vec_mask_store_lanes
- mask_len_store_lanes: currently just vec_mask_len_store_lanes
- scatter_store: used for {mask_,mask_len_,}scatter_store
- len_store: currently just len_store
- mask_len_store: currently just mask_len_store
- unary: a normal unary optab, such as vec_reverse_<mode>
- binary: a normal binary optab, such as vec_interleave_lo_<mode>
- ternary: a normal ternary optab, such as fma<mode>4
- unary_convert: a single-input conversion optab, such as
lround<srcmode><dstmode>2.
- cond_binary: a conditional binary optab, such as cond_add<mode>
- cond_unary: a conditional unary optab, such as cond_neg<mode>
- cond_ternary: a conditional ternary optab, such as cond_fma_rev<mode>
- fold_left: for scalar = FN (scalar, vector), keyed off the vector mode
- check_ptrs: used for check_{raw,war}_ptrs
- cond_len_unary: a conditional unary optab, such as cond_len_neg<mode>
- cond_len_binary: a conditional binary optab, such as cond_len_add<mode>
- cond_len_ternary: a conditional ternary optab, such as
cond_len_fma_rev<mode>
DEF_INTERNAL_SIGNED_OPTAB_FN defines an internal function that
maps to one of two optabs, depending on the signedness of an input.
SIGNED_OPTAB and UNSIGNED_OPTAB are the optabs for signed and
unsigned inputs respectively, both without the trailing "_optab".
SELECTOR says which type in the tree_pair determines the signedness.
DEF_INTERNAL_FLT_FN is like DEF_INTERNAL_OPTAB_FN, but in addition,
the function implements the computational part of a built-in math
function BUILT_IN_<NAME>{F,,L}. Unlike some built-in functions,
these internal functions never set errno.
DEF_INTERNAL_INT_FN is like DEF_INTERNAL_OPTAB_FN, but in addition
says that the function extends the C-level BUILT_IN_<NAME>{,L,LL,IMAX}
group of functions to any integral mode (including vector modes).
DEF_INTERNAL_INT_EXT_FN is like DEF_INTERNAL_INT_FN, except that it
has expand_##NAME defined in internal-fn.cc to override the
DEF_INTERNAL_INT_FN expansion behavior.
DEF_INTERNAL_WIDENING_OPTAB_FN is a wrapper that defines five internal
functions with DEF_INTERNAL_SIGNED_OPTAB_FN:
- one that describes a widening operation with the same number of elements
in the output and input vectors,
- two that describe a pair of high-low widening operations where the output
vectors each have half the number of elements of the input vectors,
corresponding to the result of the widening operation on the top half and
bottom half, these have the suffixes _HI and _LO,
- and two that describe a pair of even-odd widening operations where the
output vectors each have half the number of elements of the input vectors,
corresponding to the result of the widening operation on the even and odd
elements, these have the suffixes _EVEN and _ODD.
These five internal functions will require two optabs each, a SIGNED_OPTAB
and an UNSIGNED_OTPAB.
DEF_INTERNAL_COND_FN is a wrapper that defines 2 internal functions with
DEF_INTERNAL_OPTAB_FN:
- One is COND_* operations that are predicated by mask only. Such operations
make sense for both vectors and scalars.
- The other is COND_LEN_* operations that are predicated by mask and len
both. Such operations only make sense for vectors.
DEF_INTERNAL_SIGNED_COND_FN is like DEF_INTERNAL_COND_FN but defines intenal
functions with DEF_INTERNAL_SIGNED_OPTAB_FN.
Each entry must have a corresponding expander of the form:
void expand_NAME (gimple_call stmt)
where STMT is the statement that performs the call. These are generated
automatically for optab functions and call out to a function or macro
called expand_<TYPE>_optab_fn.
Extract the last active element from a vector.
Same, but return the first argument if no elements are active.
Unary math functions.
Floating-point to integer conversions.
??? Here we preserve the I/L/LL prefix convention from the
corresponding built-in functions, rather than make the internal
functions polymorphic in both the argument and the return types.
Perhaps an alternative would be to pass a zero of the required
return type as a second parameter.
FP rounding.
Binary math functions.
FP scales.
Ternary math functions.
Unary integer ops.
An unduplicable, uncombinable function. Generally used to preserve
a CFG property in the face of jump threading, tail merging or
other such optimizations. The first argument distinguishes
between uses. See internal-fn.h for usage.
A function to represent an artifical initialization to an uninitialized
automatic variable.
A function to associate the access size and access mode information
with the corresponding reference to an object. It only reads from the
2nd argument.
DIM_SIZE and DIM_POS return the size of a particular compute
dimension and the executing thread's position within that
dimension. DIM_POS is pure (and not const) so that it isn't
thought to clobber memory and can be gcse'd within a single
parallel region, but not across FORK/JOIN boundaries. They take a
single INTEGER_CST argument. This might be overly conservative.
OpenACC looping abstraction. See internal-fn.h for usage.
OpenACC reduction abstraction. See internal-fn.h for usage.
Openacc tile abstraction. Describes the spans of the element loop.
GOACC_TILE (num-loops, loop-no, tile-arg, tile-mask, element-mask).
Set errno to EDOM, if GCC knows how to do that directly for the
current target.
Atomic functions. These don't have ECF_NOTHROW because for
-fnon-call-exceptions they can throw, otherwise we set
gimple_call_nothrow_p on it.
To implement [[fallthrough]]. If the TREE_NOTHROW or GF_CALL_NOTHROW flag
is set on the call (normally redundant with ECF_NOTHROW), it marks
[[fallthrough]] at the end of C++ loop body.
To implement __builtin_launder.
Divmod function.
For coroutines.
A NOP function with arbitrary arguments and return value.
Temporary vehicle for __builtin_shufflevector.
<=> optimization.
[[assume (cond)]].
For if-conversion of inbranch SIMD clones.
_BitInt support.
Bitwise functions.
Referenced by convert_conditional_op(), and vectorizable_call().
void init_internal_fns |
( |
| ) |
|
Initialize internal function tables.
Internal functions.
Copyright (C) 2011-2024 Free Software Foundation, Inc.
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/>.
This file specifies a list of internal "functions". These functions
differ from built-in functions in that they have no linkage and cannot
be called directly by the user. They represent operations that are only
synthesised by GCC itself.
Internal functions are used instead of tree codes if the operation
and its operands are more naturally represented as a GIMPLE_CALL
than a GIMPLE_ASSIGN.
Each entry in this file has one of the forms:
DEF_INTERNAL_FN (NAME, FLAGS, FNSPEC)
DEF_INTERNAL_OPTAB_FN (NAME, FLAGS, OPTAB, TYPE)
DEF_INTERNAL_SIGNED_OPTAB_FN (NAME, FLAGS, SELECTOR, SIGNED_OPTAB,
UNSIGNED_OPTAB, TYPE)
DEF_INTERNAL_FLT_FN (NAME, FLAGS, OPTAB, TYPE)
DEF_INTERNAL_FLT_FLOATN_FN (NAME, FLAGS, OPTAB, TYPE)
DEF_INTERNAL_INT_FN (NAME, FLAGS, OPTAB, TYPE)
DEF_INTERNAL_INT_EXT_FN (NAME, FLAGS, OPTAB, TYPE)
DEF_INTERNAL_COND_FN (NAME, FLAGS, OPTAB, TYPE)
DEF_INTERNAL_SIGNED_COND_FN (NAME, FLAGS, OPTAB, TYPE)
DEF_INTERNAL_WIDENING_OPTAB_FN (NAME, FLAGS, SELECTOR, SOPTAB, UOPTAB,
TYPE)
where NAME is the name of the function, FLAGS is a set of
ECF_* flags and FNSPEC is a string describing functions fnspec.
DEF_INTERNAL_OPTAB_FN defines an internal function that maps to a
direct optab. The function should only be called with a given
set of types if the associated optab is available for the modes
of those types. OPTAB says what optab to use (without the trailing
"_optab") and TYPE categorizes the optab based on its inputs and
outputs. The possible types of optab are:
- mask_load: currently just maskload
- load_lanes: currently just vec_load_lanes
- mask_load_lanes: currently just vec_mask_load_lanes
- mask_len_load_lanes: currently just vec_mask_len_load_lanes
- gather_load: used for {mask_,mask_len_,}gather_load
- len_load: currently just len_load
- mask_len_load: currently just mask_len_load
- mask_store: currently just maskstore
- store_lanes: currently just vec_store_lanes
- mask_store_lanes: currently just vec_mask_store_lanes
- mask_len_store_lanes: currently just vec_mask_len_store_lanes
- scatter_store: used for {mask_,mask_len_,}scatter_store
- len_store: currently just len_store
- mask_len_store: currently just mask_len_store
- unary: a normal unary optab, such as vec_reverse_<mode>
- binary: a normal binary optab, such as vec_interleave_lo_<mode>
- ternary: a normal ternary optab, such as fma<mode>4
- unary_convert: a single-input conversion optab, such as
lround<srcmode><dstmode>2.
- cond_binary: a conditional binary optab, such as cond_add<mode>
- cond_unary: a conditional unary optab, such as cond_neg<mode>
- cond_ternary: a conditional ternary optab, such as cond_fma_rev<mode>
- fold_left: for scalar = FN (scalar, vector), keyed off the vector mode
- check_ptrs: used for check_{raw,war}_ptrs
- cond_len_unary: a conditional unary optab, such as cond_len_neg<mode>
- cond_len_binary: a conditional binary optab, such as cond_len_add<mode>
- cond_len_ternary: a conditional ternary optab, such as
cond_len_fma_rev<mode>
DEF_INTERNAL_SIGNED_OPTAB_FN defines an internal function that
maps to one of two optabs, depending on the signedness of an input.
SIGNED_OPTAB and UNSIGNED_OPTAB are the optabs for signed and
unsigned inputs respectively, both without the trailing "_optab".
SELECTOR says which type in the tree_pair determines the signedness.
DEF_INTERNAL_FLT_FN is like DEF_INTERNAL_OPTAB_FN, but in addition,
the function implements the computational part of a built-in math
function BUILT_IN_<NAME>{F,,L}. Unlike some built-in functions,
these internal functions never set errno.
DEF_INTERNAL_INT_FN is like DEF_INTERNAL_OPTAB_FN, but in addition
says that the function extends the C-level BUILT_IN_<NAME>{,L,LL,IMAX}
group of functions to any integral mode (including vector modes).
DEF_INTERNAL_INT_EXT_FN is like DEF_INTERNAL_INT_FN, except that it
has expand_##NAME defined in internal-fn.cc to override the
DEF_INTERNAL_INT_FN expansion behavior.
DEF_INTERNAL_WIDENING_OPTAB_FN is a wrapper that defines five internal
functions with DEF_INTERNAL_SIGNED_OPTAB_FN:
- one that describes a widening operation with the same number of elements
in the output and input vectors,
- two that describe a pair of high-low widening operations where the output
vectors each have half the number of elements of the input vectors,
corresponding to the result of the widening operation on the top half and
bottom half, these have the suffixes _HI and _LO,
- and two that describe a pair of even-odd widening operations where the
output vectors each have half the number of elements of the input vectors,
corresponding to the result of the widening operation on the even and odd
elements, these have the suffixes _EVEN and _ODD.
These five internal functions will require two optabs each, a SIGNED_OPTAB
and an UNSIGNED_OTPAB.
DEF_INTERNAL_COND_FN is a wrapper that defines 2 internal functions with
DEF_INTERNAL_OPTAB_FN:
- One is COND_* operations that are predicated by mask only. Such operations
make sense for both vectors and scalars.
- The other is COND_LEN_* operations that are predicated by mask and len
both. Such operations only make sense for vectors.
DEF_INTERNAL_SIGNED_COND_FN is like DEF_INTERNAL_COND_FN but defines intenal
functions with DEF_INTERNAL_SIGNED_OPTAB_FN.
Each entry must have a corresponding expander of the form:
void expand_NAME (gimple_call stmt)
where STMT is the statement that performs the call. These are generated
automatically for optab functions and call out to a function or macro
called expand_<TYPE>_optab_fn.
Extract the last active element from a vector.
Same, but return the first argument if no elements are active.
Unary math functions.
Floating-point to integer conversions.
??? Here we preserve the I/L/LL prefix convention from the
corresponding built-in functions, rather than make the internal
functions polymorphic in both the argument and the return types.
Perhaps an alternative would be to pass a zero of the required
return type as a second parameter.
FP rounding.
Binary math functions.
FP scales.
Ternary math functions.
Unary integer ops.
An unduplicable, uncombinable function. Generally used to preserve
a CFG property in the face of jump threading, tail merging or
other such optimizations. The first argument distinguishes
between uses. See internal-fn.h for usage.
A function to represent an artifical initialization to an uninitialized
automatic variable.
A function to associate the access size and access mode information
with the corresponding reference to an object. It only reads from the
2nd argument.
DIM_SIZE and DIM_POS return the size of a particular compute
dimension and the executing thread's position within that
dimension. DIM_POS is pure (and not const) so that it isn't
thought to clobber memory and can be gcse'd within a single
parallel region, but not across FORK/JOIN boundaries. They take a
single INTEGER_CST argument. This might be overly conservative.
OpenACC looping abstraction. See internal-fn.h for usage.
OpenACC reduction abstraction. See internal-fn.h for usage.
Openacc tile abstraction. Describes the spans of the element loop.
GOACC_TILE (num-loops, loop-no, tile-arg, tile-mask, element-mask).
Set errno to EDOM, if GCC knows how to do that directly for the
current target.
Atomic functions. These don't have ECF_NOTHROW because for
-fnon-call-exceptions they can throw, otherwise we set
gimple_call_nothrow_p on it.
To implement [[fallthrough]]. If the TREE_NOTHROW or GF_CALL_NOTHROW flag
is set on the call (normally redundant with ECF_NOTHROW), it marks
[[fallthrough]] at the end of C++ loop body.
To implement __builtin_launder.
Divmod function.
For coroutines.
A NOP function with arbitrary arguments and return value.
Temporary vehicle for __builtin_shufflevector.
<=> optimization.
[[assume (cond)]].
For if-conversion of inbranch SIMD clones.
_BitInt support.
Bitwise functions.
References internal_fn_fnspec_array.
Referenced by build_common_builtin_nodes().
Given an internal_fn IFN that is a widening function, return its
corresponding _EVEN and _ODD internal_fns in *EVEN and *ODD.
Internal functions.
Copyright (C) 2011-2024 Free Software Foundation, Inc.
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/>.
This file specifies a list of internal "functions". These functions
differ from built-in functions in that they have no linkage and cannot
be called directly by the user. They represent operations that are only
synthesised by GCC itself.
Internal functions are used instead of tree codes if the operation
and its operands are more naturally represented as a GIMPLE_CALL
than a GIMPLE_ASSIGN.
Each entry in this file has one of the forms:
DEF_INTERNAL_FN (NAME, FLAGS, FNSPEC)
DEF_INTERNAL_OPTAB_FN (NAME, FLAGS, OPTAB, TYPE)
DEF_INTERNAL_SIGNED_OPTAB_FN (NAME, FLAGS, SELECTOR, SIGNED_OPTAB,
UNSIGNED_OPTAB, TYPE)
DEF_INTERNAL_FLT_FN (NAME, FLAGS, OPTAB, TYPE)
DEF_INTERNAL_FLT_FLOATN_FN (NAME, FLAGS, OPTAB, TYPE)
DEF_INTERNAL_INT_FN (NAME, FLAGS, OPTAB, TYPE)
DEF_INTERNAL_INT_EXT_FN (NAME, FLAGS, OPTAB, TYPE)
DEF_INTERNAL_COND_FN (NAME, FLAGS, OPTAB, TYPE)
DEF_INTERNAL_SIGNED_COND_FN (NAME, FLAGS, OPTAB, TYPE)
DEF_INTERNAL_WIDENING_OPTAB_FN (NAME, FLAGS, SELECTOR, SOPTAB, UOPTAB,
TYPE)
where NAME is the name of the function, FLAGS is a set of
ECF_* flags and FNSPEC is a string describing functions fnspec.
DEF_INTERNAL_OPTAB_FN defines an internal function that maps to a
direct optab. The function should only be called with a given
set of types if the associated optab is available for the modes
of those types. OPTAB says what optab to use (without the trailing
"_optab") and TYPE categorizes the optab based on its inputs and
outputs. The possible types of optab are:
- mask_load: currently just maskload
- load_lanes: currently just vec_load_lanes
- mask_load_lanes: currently just vec_mask_load_lanes
- mask_len_load_lanes: currently just vec_mask_len_load_lanes
- gather_load: used for {mask_,mask_len_,}gather_load
- len_load: currently just len_load
- mask_len_load: currently just mask_len_load
- mask_store: currently just maskstore
- store_lanes: currently just vec_store_lanes
- mask_store_lanes: currently just vec_mask_store_lanes
- mask_len_store_lanes: currently just vec_mask_len_store_lanes
- scatter_store: used for {mask_,mask_len_,}scatter_store
- len_store: currently just len_store
- mask_len_store: currently just mask_len_store
- unary: a normal unary optab, such as vec_reverse_<mode>
- binary: a normal binary optab, such as vec_interleave_lo_<mode>
- ternary: a normal ternary optab, such as fma<mode>4
- unary_convert: a single-input conversion optab, such as
lround<srcmode><dstmode>2.
- cond_binary: a conditional binary optab, such as cond_add<mode>
- cond_unary: a conditional unary optab, such as cond_neg<mode>
- cond_ternary: a conditional ternary optab, such as cond_fma_rev<mode>
- fold_left: for scalar = FN (scalar, vector), keyed off the vector mode
- check_ptrs: used for check_{raw,war}_ptrs
- cond_len_unary: a conditional unary optab, such as cond_len_neg<mode>
- cond_len_binary: a conditional binary optab, such as cond_len_add<mode>
- cond_len_ternary: a conditional ternary optab, such as
cond_len_fma_rev<mode>
DEF_INTERNAL_SIGNED_OPTAB_FN defines an internal function that
maps to one of two optabs, depending on the signedness of an input.
SIGNED_OPTAB and UNSIGNED_OPTAB are the optabs for signed and
unsigned inputs respectively, both without the trailing "_optab".
SELECTOR says which type in the tree_pair determines the signedness.
DEF_INTERNAL_FLT_FN is like DEF_INTERNAL_OPTAB_FN, but in addition,
the function implements the computational part of a built-in math
function BUILT_IN_<NAME>{F,,L}. Unlike some built-in functions,
these internal functions never set errno.
DEF_INTERNAL_INT_FN is like DEF_INTERNAL_OPTAB_FN, but in addition
says that the function extends the C-level BUILT_IN_<NAME>{,L,LL,IMAX}
group of functions to any integral mode (including vector modes).
DEF_INTERNAL_INT_EXT_FN is like DEF_INTERNAL_INT_FN, except that it
has expand_##NAME defined in internal-fn.cc to override the
DEF_INTERNAL_INT_FN expansion behavior.
DEF_INTERNAL_WIDENING_OPTAB_FN is a wrapper that defines five internal
functions with DEF_INTERNAL_SIGNED_OPTAB_FN:
- one that describes a widening operation with the same number of elements
in the output and input vectors,
- two that describe a pair of high-low widening operations where the output
vectors each have half the number of elements of the input vectors,
corresponding to the result of the widening operation on the top half and
bottom half, these have the suffixes _HI and _LO,
- and two that describe a pair of even-odd widening operations where the
output vectors each have half the number of elements of the input vectors,
corresponding to the result of the widening operation on the even and odd
elements, these have the suffixes _EVEN and _ODD.
These five internal functions will require two optabs each, a SIGNED_OPTAB
and an UNSIGNED_OTPAB.
DEF_INTERNAL_COND_FN is a wrapper that defines 2 internal functions with
DEF_INTERNAL_OPTAB_FN:
- One is COND_* operations that are predicated by mask only. Such operations
make sense for both vectors and scalars.
- The other is COND_LEN_* operations that are predicated by mask and len
both. Such operations only make sense for vectors.
DEF_INTERNAL_SIGNED_COND_FN is like DEF_INTERNAL_COND_FN but defines intenal
functions with DEF_INTERNAL_SIGNED_OPTAB_FN.
Each entry must have a corresponding expander of the form:
void expand_NAME (gimple_call stmt)
where STMT is the statement that performs the call. These are generated
automatically for optab functions and call out to a function or macro
called expand_<TYPE>_optab_fn.
Extract the last active element from a vector.
Same, but return the first argument if no elements are active.
Unary math functions.
Floating-point to integer conversions.
??? Here we preserve the I/L/LL prefix convention from the
corresponding built-in functions, rather than make the internal
functions polymorphic in both the argument and the return types.
Perhaps an alternative would be to pass a zero of the required
return type as a second parameter.
FP rounding.
Binary math functions.
FP scales.
Ternary math functions.
Unary integer ops.
An unduplicable, uncombinable function. Generally used to preserve
a CFG property in the face of jump threading, tail merging or
other such optimizations. The first argument distinguishes
between uses. See internal-fn.h for usage.
A function to represent an artifical initialization to an uninitialized
automatic variable.
A function to associate the access size and access mode information
with the corresponding reference to an object. It only reads from the
2nd argument.
DIM_SIZE and DIM_POS return the size of a particular compute
dimension and the executing thread's position within that
dimension. DIM_POS is pure (and not const) so that it isn't
thought to clobber memory and can be gcse'd within a single
parallel region, but not across FORK/JOIN boundaries. They take a
single INTEGER_CST argument. This might be overly conservative.
OpenACC looping abstraction. See internal-fn.h for usage.
OpenACC reduction abstraction. See internal-fn.h for usage.
Openacc tile abstraction. Describes the spans of the element loop.
GOACC_TILE (num-loops, loop-no, tile-arg, tile-mask, element-mask).
Set errno to EDOM, if GCC knows how to do that directly for the
current target.
Atomic functions. These don't have ECF_NOTHROW because for
-fnon-call-exceptions they can throw, otherwise we set
gimple_call_nothrow_p on it.
To implement [[fallthrough]]. If the TREE_NOTHROW or GF_CALL_NOTHROW flag
is set on the call (normally redundant with ECF_NOTHROW), it marks
[[fallthrough]] at the end of C++ loop body.
To implement __builtin_launder.
Divmod function.
For coroutines.
A NOP function with arbitrary arguments and return value.
Temporary vehicle for __builtin_shufflevector.
<=> optimization.
[[assume (cond)]].
For if-conversion of inbranch SIMD clones.
_BitInt support.
Bitwise functions.
References gcc_assert, gcc_unreachable, and widening_fn_p().
Referenced by supportable_widening_operation().
Geven an internal_fn IFN that is a widening function, return its
corresponding LO and HI internal_fns.
Internal functions.
Copyright (C) 2011-2024 Free Software Foundation, Inc.
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/>.
This file specifies a list of internal "functions". These functions
differ from built-in functions in that they have no linkage and cannot
be called directly by the user. They represent operations that are only
synthesised by GCC itself.
Internal functions are used instead of tree codes if the operation
and its operands are more naturally represented as a GIMPLE_CALL
than a GIMPLE_ASSIGN.
Each entry in this file has one of the forms:
DEF_INTERNAL_FN (NAME, FLAGS, FNSPEC)
DEF_INTERNAL_OPTAB_FN (NAME, FLAGS, OPTAB, TYPE)
DEF_INTERNAL_SIGNED_OPTAB_FN (NAME, FLAGS, SELECTOR, SIGNED_OPTAB,
UNSIGNED_OPTAB, TYPE)
DEF_INTERNAL_FLT_FN (NAME, FLAGS, OPTAB, TYPE)
DEF_INTERNAL_FLT_FLOATN_FN (NAME, FLAGS, OPTAB, TYPE)
DEF_INTERNAL_INT_FN (NAME, FLAGS, OPTAB, TYPE)
DEF_INTERNAL_INT_EXT_FN (NAME, FLAGS, OPTAB, TYPE)
DEF_INTERNAL_COND_FN (NAME, FLAGS, OPTAB, TYPE)
DEF_INTERNAL_SIGNED_COND_FN (NAME, FLAGS, OPTAB, TYPE)
DEF_INTERNAL_WIDENING_OPTAB_FN (NAME, FLAGS, SELECTOR, SOPTAB, UOPTAB,
TYPE)
where NAME is the name of the function, FLAGS is a set of
ECF_* flags and FNSPEC is a string describing functions fnspec.
DEF_INTERNAL_OPTAB_FN defines an internal function that maps to a
direct optab. The function should only be called with a given
set of types if the associated optab is available for the modes
of those types. OPTAB says what optab to use (without the trailing
"_optab") and TYPE categorizes the optab based on its inputs and
outputs. The possible types of optab are:
- mask_load: currently just maskload
- load_lanes: currently just vec_load_lanes
- mask_load_lanes: currently just vec_mask_load_lanes
- mask_len_load_lanes: currently just vec_mask_len_load_lanes
- gather_load: used for {mask_,mask_len_,}gather_load
- len_load: currently just len_load
- mask_len_load: currently just mask_len_load
- mask_store: currently just maskstore
- store_lanes: currently just vec_store_lanes
- mask_store_lanes: currently just vec_mask_store_lanes
- mask_len_store_lanes: currently just vec_mask_len_store_lanes
- scatter_store: used for {mask_,mask_len_,}scatter_store
- len_store: currently just len_store
- mask_len_store: currently just mask_len_store
- unary: a normal unary optab, such as vec_reverse_<mode>
- binary: a normal binary optab, such as vec_interleave_lo_<mode>
- ternary: a normal ternary optab, such as fma<mode>4
- unary_convert: a single-input conversion optab, such as
lround<srcmode><dstmode>2.
- cond_binary: a conditional binary optab, such as cond_add<mode>
- cond_unary: a conditional unary optab, such as cond_neg<mode>
- cond_ternary: a conditional ternary optab, such as cond_fma_rev<mode>
- fold_left: for scalar = FN (scalar, vector), keyed off the vector mode
- check_ptrs: used for check_{raw,war}_ptrs
- cond_len_unary: a conditional unary optab, such as cond_len_neg<mode>
- cond_len_binary: a conditional binary optab, such as cond_len_add<mode>
- cond_len_ternary: a conditional ternary optab, such as
cond_len_fma_rev<mode>
DEF_INTERNAL_SIGNED_OPTAB_FN defines an internal function that
maps to one of two optabs, depending on the signedness of an input.
SIGNED_OPTAB and UNSIGNED_OPTAB are the optabs for signed and
unsigned inputs respectively, both without the trailing "_optab".
SELECTOR says which type in the tree_pair determines the signedness.
DEF_INTERNAL_FLT_FN is like DEF_INTERNAL_OPTAB_FN, but in addition,
the function implements the computational part of a built-in math
function BUILT_IN_<NAME>{F,,L}. Unlike some built-in functions,
these internal functions never set errno.
DEF_INTERNAL_INT_FN is like DEF_INTERNAL_OPTAB_FN, but in addition
says that the function extends the C-level BUILT_IN_<NAME>{,L,LL,IMAX}
group of functions to any integral mode (including vector modes).
DEF_INTERNAL_INT_EXT_FN is like DEF_INTERNAL_INT_FN, except that it
has expand_##NAME defined in internal-fn.cc to override the
DEF_INTERNAL_INT_FN expansion behavior.
DEF_INTERNAL_WIDENING_OPTAB_FN is a wrapper that defines five internal
functions with DEF_INTERNAL_SIGNED_OPTAB_FN:
- one that describes a widening operation with the same number of elements
in the output and input vectors,
- two that describe a pair of high-low widening operations where the output
vectors each have half the number of elements of the input vectors,
corresponding to the result of the widening operation on the top half and
bottom half, these have the suffixes _HI and _LO,
- and two that describe a pair of even-odd widening operations where the
output vectors each have half the number of elements of the input vectors,
corresponding to the result of the widening operation on the even and odd
elements, these have the suffixes _EVEN and _ODD.
These five internal functions will require two optabs each, a SIGNED_OPTAB
and an UNSIGNED_OTPAB.
DEF_INTERNAL_COND_FN is a wrapper that defines 2 internal functions with
DEF_INTERNAL_OPTAB_FN:
- One is COND_* operations that are predicated by mask only. Such operations
make sense for both vectors and scalars.
- The other is COND_LEN_* operations that are predicated by mask and len
both. Such operations only make sense for vectors.
DEF_INTERNAL_SIGNED_COND_FN is like DEF_INTERNAL_COND_FN but defines intenal
functions with DEF_INTERNAL_SIGNED_OPTAB_FN.
Each entry must have a corresponding expander of the form:
void expand_NAME (gimple_call stmt)
where STMT is the statement that performs the call. These are generated
automatically for optab functions and call out to a function or macro
called expand_<TYPE>_optab_fn.
Extract the last active element from a vector.
Same, but return the first argument if no elements are active.
Unary math functions.
Floating-point to integer conversions.
??? Here we preserve the I/L/LL prefix convention from the
corresponding built-in functions, rather than make the internal
functions polymorphic in both the argument and the return types.
Perhaps an alternative would be to pass a zero of the required
return type as a second parameter.
FP rounding.
Binary math functions.
FP scales.
Ternary math functions.
Unary integer ops.
An unduplicable, uncombinable function. Generally used to preserve
a CFG property in the face of jump threading, tail merging or
other such optimizations. The first argument distinguishes
between uses. See internal-fn.h for usage.
A function to represent an artifical initialization to an uninitialized
automatic variable.
A function to associate the access size and access mode information
with the corresponding reference to an object. It only reads from the
2nd argument.
DIM_SIZE and DIM_POS return the size of a particular compute
dimension and the executing thread's position within that
dimension. DIM_POS is pure (and not const) so that it isn't
thought to clobber memory and can be gcse'd within a single
parallel region, but not across FORK/JOIN boundaries. They take a
single INTEGER_CST argument. This might be overly conservative.
OpenACC looping abstraction. See internal-fn.h for usage.
OpenACC reduction abstraction. See internal-fn.h for usage.
Openacc tile abstraction. Describes the spans of the element loop.
GOACC_TILE (num-loops, loop-no, tile-arg, tile-mask, element-mask).
Set errno to EDOM, if GCC knows how to do that directly for the
current target.
Atomic functions. These don't have ECF_NOTHROW because for
-fnon-call-exceptions they can throw, otherwise we set
gimple_call_nothrow_p on it.
To implement [[fallthrough]]. If the TREE_NOTHROW or GF_CALL_NOTHROW flag
is set on the call (normally redundant with ECF_NOTHROW), it marks
[[fallthrough]] at the end of C++ loop body.
To implement __builtin_launder.
Divmod function.
For coroutines.
A NOP function with arbitrary arguments and return value.
Temporary vehicle for __builtin_shufflevector.
<=> optimization.
[[assume (cond)]].
For if-conversion of inbranch SIMD clones.
_BitInt support.
Bitwise functions.
References gcc_assert, gcc_unreachable, and widening_fn_p().
Referenced by supportable_widening_operation().
Return true if this CODE describes an internal_fn that returns a vector with
elements twice as wide as the element size of the input vectors.
Internal functions.
Copyright (C) 2011-2024 Free Software Foundation, Inc.
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/>.
This file specifies a list of internal "functions". These functions
differ from built-in functions in that they have no linkage and cannot
be called directly by the user. They represent operations that are only
synthesised by GCC itself.
Internal functions are used instead of tree codes if the operation
and its operands are more naturally represented as a GIMPLE_CALL
than a GIMPLE_ASSIGN.
Each entry in this file has one of the forms:
DEF_INTERNAL_FN (NAME, FLAGS, FNSPEC)
DEF_INTERNAL_OPTAB_FN (NAME, FLAGS, OPTAB, TYPE)
DEF_INTERNAL_SIGNED_OPTAB_FN (NAME, FLAGS, SELECTOR, SIGNED_OPTAB,
UNSIGNED_OPTAB, TYPE)
DEF_INTERNAL_FLT_FN (NAME, FLAGS, OPTAB, TYPE)
DEF_INTERNAL_FLT_FLOATN_FN (NAME, FLAGS, OPTAB, TYPE)
DEF_INTERNAL_INT_FN (NAME, FLAGS, OPTAB, TYPE)
DEF_INTERNAL_INT_EXT_FN (NAME, FLAGS, OPTAB, TYPE)
DEF_INTERNAL_COND_FN (NAME, FLAGS, OPTAB, TYPE)
DEF_INTERNAL_SIGNED_COND_FN (NAME, FLAGS, OPTAB, TYPE)
DEF_INTERNAL_WIDENING_OPTAB_FN (NAME, FLAGS, SELECTOR, SOPTAB, UOPTAB,
TYPE)
where NAME is the name of the function, FLAGS is a set of
ECF_* flags and FNSPEC is a string describing functions fnspec.
DEF_INTERNAL_OPTAB_FN defines an internal function that maps to a
direct optab. The function should only be called with a given
set of types if the associated optab is available for the modes
of those types. OPTAB says what optab to use (without the trailing
"_optab") and TYPE categorizes the optab based on its inputs and
outputs. The possible types of optab are:
- mask_load: currently just maskload
- load_lanes: currently just vec_load_lanes
- mask_load_lanes: currently just vec_mask_load_lanes
- mask_len_load_lanes: currently just vec_mask_len_load_lanes
- gather_load: used for {mask_,mask_len_,}gather_load
- len_load: currently just len_load
- mask_len_load: currently just mask_len_load
- mask_store: currently just maskstore
- store_lanes: currently just vec_store_lanes
- mask_store_lanes: currently just vec_mask_store_lanes
- mask_len_store_lanes: currently just vec_mask_len_store_lanes
- scatter_store: used for {mask_,mask_len_,}scatter_store
- len_store: currently just len_store
- mask_len_store: currently just mask_len_store
- unary: a normal unary optab, such as vec_reverse_<mode>
- binary: a normal binary optab, such as vec_interleave_lo_<mode>
- ternary: a normal ternary optab, such as fma<mode>4
- unary_convert: a single-input conversion optab, such as
lround<srcmode><dstmode>2.
- cond_binary: a conditional binary optab, such as cond_add<mode>
- cond_unary: a conditional unary optab, such as cond_neg<mode>
- cond_ternary: a conditional ternary optab, such as cond_fma_rev<mode>
- fold_left: for scalar = FN (scalar, vector), keyed off the vector mode
- check_ptrs: used for check_{raw,war}_ptrs
- cond_len_unary: a conditional unary optab, such as cond_len_neg<mode>
- cond_len_binary: a conditional binary optab, such as cond_len_add<mode>
- cond_len_ternary: a conditional ternary optab, such as
cond_len_fma_rev<mode>
DEF_INTERNAL_SIGNED_OPTAB_FN defines an internal function that
maps to one of two optabs, depending on the signedness of an input.
SIGNED_OPTAB and UNSIGNED_OPTAB are the optabs for signed and
unsigned inputs respectively, both without the trailing "_optab".
SELECTOR says which type in the tree_pair determines the signedness.
DEF_INTERNAL_FLT_FN is like DEF_INTERNAL_OPTAB_FN, but in addition,
the function implements the computational part of a built-in math
function BUILT_IN_<NAME>{F,,L}. Unlike some built-in functions,
these internal functions never set errno.
DEF_INTERNAL_INT_FN is like DEF_INTERNAL_OPTAB_FN, but in addition
says that the function extends the C-level BUILT_IN_<NAME>{,L,LL,IMAX}
group of functions to any integral mode (including vector modes).
DEF_INTERNAL_INT_EXT_FN is like DEF_INTERNAL_INT_FN, except that it
has expand_##NAME defined in internal-fn.cc to override the
DEF_INTERNAL_INT_FN expansion behavior.
DEF_INTERNAL_WIDENING_OPTAB_FN is a wrapper that defines five internal
functions with DEF_INTERNAL_SIGNED_OPTAB_FN:
- one that describes a widening operation with the same number of elements
in the output and input vectors,
- two that describe a pair of high-low widening operations where the output
vectors each have half the number of elements of the input vectors,
corresponding to the result of the widening operation on the top half and
bottom half, these have the suffixes _HI and _LO,
- and two that describe a pair of even-odd widening operations where the
output vectors each have half the number of elements of the input vectors,
corresponding to the result of the widening operation on the even and odd
elements, these have the suffixes _EVEN and _ODD.
These five internal functions will require two optabs each, a SIGNED_OPTAB
and an UNSIGNED_OTPAB.
DEF_INTERNAL_COND_FN is a wrapper that defines 2 internal functions with
DEF_INTERNAL_OPTAB_FN:
- One is COND_* operations that are predicated by mask only. Such operations
make sense for both vectors and scalars.
- The other is COND_LEN_* operations that are predicated by mask and len
both. Such operations only make sense for vectors.
DEF_INTERNAL_SIGNED_COND_FN is like DEF_INTERNAL_COND_FN but defines intenal
functions with DEF_INTERNAL_SIGNED_OPTAB_FN.
Each entry must have a corresponding expander of the form:
void expand_NAME (gimple_call stmt)
where STMT is the statement that performs the call. These are generated
automatically for optab functions and call out to a function or macro
called expand_<TYPE>_optab_fn.
Extract the last active element from a vector.
Same, but return the first argument if no elements are active.
Unary math functions.
Floating-point to integer conversions.
??? Here we preserve the I/L/LL prefix convention from the
corresponding built-in functions, rather than make the internal
functions polymorphic in both the argument and the return types.
Perhaps an alternative would be to pass a zero of the required
return type as a second parameter.
FP rounding.
Binary math functions.
FP scales.
Ternary math functions.
Unary integer ops.
An unduplicable, uncombinable function. Generally used to preserve
a CFG property in the face of jump threading, tail merging or
other such optimizations. The first argument distinguishes
between uses. See internal-fn.h for usage.
A function to represent an artifical initialization to an uninitialized
automatic variable.
A function to associate the access size and access mode information
with the corresponding reference to an object. It only reads from the
2nd argument.
DIM_SIZE and DIM_POS return the size of a particular compute
dimension and the executing thread's position within that
dimension. DIM_POS is pure (and not const) so that it isn't
thought to clobber memory and can be gcse'd within a single
parallel region, but not across FORK/JOIN boundaries. They take a
single INTEGER_CST argument. This might be overly conservative.
OpenACC looping abstraction. See internal-fn.h for usage.
OpenACC reduction abstraction. See internal-fn.h for usage.
Openacc tile abstraction. Describes the spans of the element loop.
GOACC_TILE (num-loops, loop-no, tile-arg, tile-mask, element-mask).
Set errno to EDOM, if GCC knows how to do that directly for the
current target.
Atomic functions. These don't have ECF_NOTHROW because for
-fnon-call-exceptions they can throw, otherwise we set
gimple_call_nothrow_p on it.
To implement [[fallthrough]]. If the TREE_NOTHROW or GF_CALL_NOTHROW flag
is set on the call (normally redundant with ECF_NOTHROW), it marks
[[fallthrough]] at the end of C++ loop body.
To implement __builtin_launder.
Divmod function.
For coroutines.
A NOP function with arbitrary arguments and return value.
Temporary vehicle for __builtin_shufflevector.
<=> optimization.
[[assume (cond)]].
For if-conversion of inbranch SIMD clones.
_BitInt support.
Bitwise functions.
References as_internal_fn(), separate_ops::code, and internal_fn_p().
Referenced by lookup_evenodd_internal_fn(), lookup_hilo_internal_fn(), supportable_widening_operation(), and vectorizable_conversion().