GCC Middle and Back End API Reference
|
Data Structures | |
struct | move_by_pieces_d |
struct | store_by_pieces_d |
Variables | |
int | cse_not_expected |
static tree | block_move_fn |
tree | block_clear_fn |
bool addr_expr_of_non_mem_decl_p | ( | ) |
Return TRUE iff OP is an ADDR_EXPR of a DECL that's not addressable. This is very much like mem_ref_refers_to_non_mem_p, but instead of the MEM_REF, it takes its base, and it doesn't assume a DECL is in memory just because its RTL is not set yet.
References addr_expr_of_non_mem_decl_p_1().
Referenced by mf_xform_derefs_1().
|
inlinestatic |
Returns true if ADDR is an ADDR_EXPR of a DECL that does not reside in memory and has non-BLKmode. DECL_RTL must not be a MEM; if DECL_RTL was not set yet, return NORTL.
Referenced by addr_expr_of_non_mem_decl_p(), and mem_ref_refers_to_non_mem_p().
|
static |
Return the largest alignment we can use for doing a move (or store) of MAX_PIECES. ALIGN is the largest alignment we could use.
References mode_for_size().
Referenced by can_store_by_pieces(), move_by_pieces(), move_by_pieces_ninsns(), and store_by_pieces_1().
|
static |
Return 1 if EXP contains all zeros.
References categorize_ctor_elements(), HOST_WIDE_INT, and initializer_zerop().
Referenced by expand_constructor().
bool array_at_struct_end_p | ( | ) |
Returns true if REF is an array reference to an array at the end of a structure. If this is the case, the array may be allocated larger than its upper bound implies.
References handled_component_p().
Referenced by idx_infer_loop_bounds(), and pdr_add_data_dimensions().
tree array_ref_element_size | ( | ) |
Return a tree of sizetype representing the size, in bytes, of the element of EXP, an ARRAY_REF or an ARRAY_RANGE_REF.
References fold_convert_loc(), and size_binop_loc().
Referenced by copy_reference_ops_from_ref(), dump_generic_node(), fold_addr_of_array_ref_difference(), fold_const_aggregate_ref_1(), get_addr_base_and_unit_offset_1(), get_inner_reference(), get_ref_base_and_extent(), gimplify_compound_lval(), idx_analyze_ref(), idx_find_step(), idx_record_use(), set_mem_attributes_minus_bitpos(), strip_offset_1(), and try_move_mult_to_index().
tree array_ref_low_bound | ( | ) |
Return a tree representing the lower bound of the array mentioned in EXP, an ARRAY_REF or an ARRAY_RANGE_REF.
References build_int_cst().
Referenced by check_array_ref(), copy_reference_ops_from_ref(), dump_generic_node(), expand_expr_real_1(), expr_with_var_bounded_array_refs_p(), fold_const_aggregate_ref_1(), fold_read_from_constant_string(), get_addr_base_and_unit_offset_1(), get_inner_reference(), get_ref_base_and_extent(), gimplify_compound_lval(), idx_find_step(), idx_infer_loop_bounds(), idx_record_use(), in_array_bounds_p(), pdr_add_data_dimensions(), range_in_array_bounds_p(), set_mem_attributes_minus_bitpos(), and string_constant().
tree array_ref_up_bound | ( | ) |
Return a tree representing the upper bound of the array mentioned in EXP, an ARRAY_REF or an ARRAY_RANGE_REF.
Referenced by check_array_ref(), idx_infer_loop_bounds(), in_array_bounds_p(), pdr_add_data_dimensions(), and range_in_array_bounds_p().
|
static |
A subroutine of emit_block_move. Returns true if calling the block move libcall will not clobber any parameters which may have already been placed on the stack.
References emit_block_move_libcall_fn(), pack_cumulative_args(), and targetm.
Referenced by emit_block_move_hints().
tree build_personality_function | ( | ) |
Build a decl for a personality function given a language prefix.
References build_function_type_list(), get_identifier(), type(), UI_DWARF2, UI_NONE, UI_SEH, UI_SJLJ, and UI_TARGET.
Referenced by lhd_gcc_personality().
int can_move_by_pieces | ( | unsigned HOST_WIDE_INT | len, |
unsigned int | align | ||
) |
Determine whether the LEN bytes can be moved by using several move instructions. Return nonzero if a call to move_by_pieces should succeed.
References len.
Referenced by expand_builtin_mempcpy_args(), gimple_stringops_transform(), and gimplify_init_constructor().
int can_store_by_pieces | ( | unsigned HOST_WIDE_INT | len, |
rtx(*)(void *, HOST_WIDE_INT, enum machine_mode) | constfun, | ||
void * | constfundata, | ||
unsigned int | align, | ||
bool | memsetp | ||
) |
Determine whether the LEN bytes generated by CONSTFUN can be stored to memory using several move instructions. CONSTFUNDATA is a pointer which will be passed as argument in every CONSTFUN call. ALIGN is maximum alignment we can assume. MEMSETP is true if this is a memset operation and false if it's a copy of a constant string. Return nonzero if a call to store_by_pieces should succeed.
References alignment_for_piecewise_move(), HOST_WIDE_INT, len, offset, optab_handler(), targetm, and widest_int_mode_for_size().
Referenced by expand_builtin_memcpy(), expand_builtin_mempcpy_args(), expand_builtin_memset_args(), expand_builtin_strncpy(), gimple_stringops_transform(), simplify_builtin_call(), and store_expr().
bool categorize_ctor_elements | ( | const_tree | ctor, |
HOST_WIDE_INT * | p_nz_elts, | ||
HOST_WIDE_INT * | p_init_elts, | ||
bool * | p_complete | ||
) |
Examine CTOR to discover: * how many scalar fields are set to nonzero values, and place it in *P_NZ_ELTS; * how many scalar fields in total are in CTOR, and place it in *P_ELT_COUNT. * whether the constructor is complete -- in the sense that every meaningful byte is explicitly given a value -- and place it in *P_COMPLETE. Return whether or not CTOR is a valid static constant initializer, the same as "initializer_constant_valid_p (CTOR, TREE_TYPE (CTOR)) != 0".
References categorize_ctor_elements_1().
Referenced by all_zeros_p(), gimplify_init_constructor(), and mostly_zeros_p().
|
static |
Helper for categorize_ctor_elements. Identical interface.
References complete_ctor_at_level_p(), constructor_static_from_elts_p(), count_type_elements(), host_integerp(), HOST_WIDE_INT, initializer_constant_valid_p(), initializer_zerop(), mult, tree_low_cst(), and expand_operand::value.
Referenced by categorize_ctor_elements().
|
static |
Referenced by clear_storage_hints().
|
static |
Generate several move instructions to clear LEN bytes of block TO. (A MEM rtx with BLKmode). ALIGN is maximum alignment we can assume.
References clear_by_pieces_1(), store_by_pieces_d::constfun, store_by_pieces_d::constfundata, store_by_pieces_d::len, len, store_by_pieces_1(), and store_by_pieces_d::to.
|
static |
Callback routine for clear_by_pieces. Return const0_rtx unconditionally.
Referenced by clear_by_pieces().
rtx clear_storage | ( | ) |
References clear_storage_hints().
Referenced by asan_clear_shadow(), expand_constructor(), store_constructor(), and store_expr().
rtx clear_storage_hints | ( | rtx | object, |
rtx | size, | ||
enum block_op_methods | method, | ||
unsigned int | expected_align, | ||
HOST_WIDE_INT | expected_size | ||
) |
Write zeros through the storage of OBJECT. If OBJECT has BLKmode, SIZE is its length in bytes.
References BLOCK_OP_NORMAL, BLOCK_OP_TAILCALL, clear_by_pieces(), emit_move_insn(), HOST_WIDE_INT, set_storage_via_libcall(), set_storage_via_setmem(), and write_complex_part().
Referenced by clear_storage(), and expand_builtin_memset_args().
|
static |
Referenced by set_storage_via_libcall().
|
static |
References block_clear_fn, init_block_clear_fn(), and make_decl_rtl().
bool complete_ctor_at_level_p | ( | const_tree | type, |
HOST_WIDE_INT | num_elts, | ||
const_tree | last_type | ||
) |
TYPE is initialized by a constructor with NUM_ELTS elements, the last of which had type LAST_TYPE. Each element was itself a complete initializer, in the sense that every meaningful byte was explicitly given a value. Return true if the same is true for the constructor as a whole.
References count_type_elements(), and simple_cst_equal().
Referenced by categorize_ctor_elements_1().
tree component_ref_field_offset | ( | ) |
Return a tree representing the offset, in bytes, of the field referenced by EXP. This does not include any offset in DECL_FIELD_BIT_OFFSET.
References fold_convert_loc(), and size_binop_loc().
Referenced by adjust_offset_for_component_ref(), copy_reference_ops_from_ref(), dr_analyze_indices(), dump_generic_node(), get_addr_base_and_unit_offset_1(), get_inner_reference(), get_mem_align_offset(), get_ref_base_and_extent(), gimplify_compound_lval(), idx_find_step(), strip_offset_1(), and widen_memory_access().
Referenced by emit_move_insn().
|
static |
If Y is representable exactly in a narrower mode, and the target can perform the extension directly from constant or memory, then emit the move as an extension.
References can_extend_p(), emit_unop_insn(), exact_real_truncate(), force_const_mem(), force_reg(), get_last_insn(), insn_operand_matches(), optimize_insn_for_speed_p(), set_src_cost(), set_unique_reg_note(), targetm, and validize_mem().
Referenced by expand_expr_real_1().
|
static |
Return a CONST_VECTOR rtx for a VECTOR_CST tree.
References CONST_FIXED_FROM_FIXED_VALUE, gen_rtx_CONST_VECTOR(), immed_double_int_const(), initializer_zerop(), rtvec_alloc(), and tree_to_double_int().
rtx convert_modes | ( | ) |
Return an rtx for a value that would result from converting X from mode OLDMODE to mode MODE. Both modes may be floating, or both integer. UNSIGNEDP is nonzero if X is an unsigned value. This can be done by referring to a part of X in place or by copying to a new temporary with conversion. You can give VOIDmode for OLDMODE, if you are sure X has a nonvoid mode.
References convert_move(), double_int::from_uhwi(), gen_int_mode(), gen_reg_rtx(), HOST_BITS_PER_WIDE_INT, HOST_WIDE_INT, immed_double_int_const(), simplify_gen_subreg(), val_signbit_known_set_p(), and double_int::zext().
Referenced by avoid_expensive_constant(), convert_memory_address_addr_space(), convert_to_mode(), emit_block_move_via_loop(), emit_case_nodes(), emit_library_call_value_1(), emit_store_flag(), emit_store_flag_1(), expand_binop_directly(), expand_builtin_extend_pointer(), expand_cond_expr_using_cmove(), expand_divmod(), expand_expr_force_mode(), expand_expr_real_1(), expand_expr_real_2(), expand_gimple_stmt_1(), expand_twoval_binop(), expand_twoval_unop(), expand_value_return(), expand_widening_mult(), expmed_mult_highpart_optab(), extract_high_half(), extract_low_bits(), insert_value_copy_on_edge(), maybe_emit_compare_and_swap_exchange_loop(), maybe_legitimize_operand(), optimize_bitfield_assignment_op(), precompute_arguments(), precompute_register_parameters(), prepare_operand(), push_block(), store_expr(), store_field(), store_one_arg(), try_tablejump(), and widen_operand().
void convert_move | ( | ) |
Copy data from FROM to TO, where the machine modes are not the same. Both modes may be integer, or both may be floating, or both may be fixed-point. UNSIGNEDP should be nonzero if FROM is an unsigned type. This causes zero-extension instead of sign-extension.
References can_extend_p(), convert_optab_handler(), convert_optab_libfunc(), convert_to_mode(), copy_to_reg(), emit_clobber(), emit_insn(), emit_libcall_block(), emit_library_call_value(), emit_move_insn(), emit_store_flag(), emit_unop_insn(), end_sequence(), expand_fixed_convert(), expand_shift(), force_reg(), gen_reg_rtx(), get_insns(), LCT_CONST, mode_dependent_address_p(), operand_subword(), reg_overlap_mentioned_p(), simplify_gen_subreg(), smallest_mode_for_size(), start_sequence(), and word_mode.
Referenced by convert_modes(), do_tablejump(), doloop_modify(), emit_conditional_add(), emit_conditional_move(), emit_cstore(), emit_store_flag(), emit_store_flag_1(), expand_binop(), expand_builtin_memcmp(), expand_builtin_strcmp(), expand_builtin_strlen(), expand_builtin_strncmp(), expand_doubleword_clz(), expand_expr_real_1(), expand_expr_real_2(), expand_ffs(), expand_fix(), expand_float(), expand_function_end(), expand_gimple_stmt_1(), expand_sfix_optab(), expand_twoval_binop(), expand_twoval_unop(), expand_unop(), force_operand(), std_expand_builtin_va_start(), store_bit_field_using_insv(), and store_expr().
rtx convert_to_mode | ( | ) |
Return an rtx for a value that would result from converting X to mode MODE. Both X and MODE may be floating, or both integer. UNSIGNEDP is nonzero if X is an unsigned value. This can be done by referring to a part of X in place or by copying to a new temporary with conversion.
References convert_modes().
Referenced by allocate_dynamic_stack_space(), anti_adjust_stack_and_probe(), assign_parm_setup_block(), assign_parm_setup_reg(), assign_parm_setup_stack(), builtin_memset_gen_str(), convert_extracted_bit_field(), convert_move(), copy_blkmode_from_reg(), do_tablejump(), emit_block_move_via_libcall(), emit_case_decision_tree(), emit_partition_copy(), expand_assignment(), expand_binop(), expand_builtin_bswap(), expand_builtin_extract_return_addr(), expand_builtin_int_roundingfn_2(), expand_builtin_interclass_mathfn(), expand_builtin_memcmp(), expand_builtin_memset_args(), expand_builtin_powi(), expand_builtin_strcmp(), expand_builtin_strlen(), expand_builtin_strncmp(), expand_builtin_unop(), expand_expr_real_1(), expand_expr_real_2(), expand_fix(), expand_float(), expand_sfix_optab(), expand_widening_mult(), expmed_mult_highpart(), extract_fixed_bit_field(), maybe_legitimize_operand(), prepare_cmp_insn(), prepare_float_lib_cmp(), probe_stack_range(), set_storage_via_libcall(), sjlj_emit_dispatch_table(), store_constructor(), store_expr(), store_fixed_bit_field(), and try_casesi().
|
static |
Convert the tree comparison code TCODE to the rtl one where the signedness is UNSIGNEDP.
Referenced by expand_cond_expr_using_cmove().
void copy_blkmode_from_reg | ( | ) |
Copy a BLKmode object of TYPE out of a register SRCREG into TARGET. This is used on targets that return BLKmode values in registers.
References convert_to_mode(), emit_move_insn(), extract_bit_field(), HOST_WIDE_INT, int_size_in_bytes(), mode_for_size(), operand_subword(), operand_subword_force(), store_bit_field(), targetm, and word_mode.
Referenced by expand_assignment(), store_expr(), and store_field().
rtx copy_blkmode_to_reg | ( | ) |
Copy BLKmode value SRC into a register of mode MODE. Return the register if it contains any data, otherwise return null. This is used on targets that return BLKmode values in registers.
References emit_move_insn(), expand_normal(), extract_bit_field(), gen_reg_rtx(), HOST_WIDE_INT, int_size_in_bytes(), operand_subword(), operand_subword_force(), store_bit_field(), targetm, and word_mode.
Referenced by expand_assignment(), and expand_return().
|
static |
If FOR_CTOR_P, return the number of top-level elements that a constructor must have in order for it to completely initialize a value of type TYPE. Return -1 if the number isn't known. If !FOR_CTOR_P, return an estimate of the number of scalars in TYPE.
References array_type_nelts(), flexible_array_member_p(), host_integerp(), HOST_WIDE_INT, simple_cst_equal(), and tree_low_cst().
Referenced by categorize_ctor_elements_1(), and complete_ctor_at_level_p().
Referenced by expand_expr_real_2().
|
static |
Generate code to calculate OPS, and exploded expression using a store-flag instruction and return an rtx for the result. OPS reflects a comparison. If TARGET is nonzero, store the result there if convenient. Return zero if there is no suitable set-flag instruction available on this machine. Once expand_expr has been called on the arguments of the comparison, we are committed to doing the store flag, since it is not safe to re-evaluate the expression. We emit the store-flag insn by calling emit_store_flag, but only expand the arguments if we have a reason to believe that emit_store_flag will be successful. If we think that it will, but it isn't, we have to simulate the store-flag with a set/jump/set sequence.
References separate_ops::code, constant_boolean_node(), emit_store_flag_force(), expand_expr(), EXPAND_NORMAL, expand_operands(), expand_vec_cond_expr(), fold_single_bit_test(), gen_reg_rtx(), get_def_for_expr(), get_subtarget(), gimple_assign_rhs1(), gimple_assign_rhs2(), integer_all_onesp(), integer_onep(), integer_pow2p(), integer_zerop(), separate_ops::location, separate_ops::op0, separate_ops::op1, swap_condition(), separate_ops::type, type(), lang_hooks_for_types::type_for_mode, and lang_hooks::types.
|
static |
Subroutine of the next function. INDEX is the value being switched on, with the lowest value in the table already subtracted. MODE is its expected mode (needed if INDEX is constant). RANGE is the length of the jump table. TABLE_LABEL is a CODE_LABEL rtx for the table itself. DEFAULT_LABEL is a CODE_LABEL rtx to jump to if the index value is out of range. DEFAULT_PROBABILITY is the probability of jumping to the default label.
References function::cfg, cfun, convert_move(), convert_to_mode(), copy_to_mode_reg(), emit_barrier(), emit_cmp_and_jump_insns(), emit_jump_insn(), gen_const_mem(), gen_reg_rtx(), control_flow_graph::max_jumptable_ents, and vector.
Referenced by try_tablejump().
rtx emit_block_move | ( | ) |
References emit_block_move_hints().
Referenced by assign_parm_setup_block(), assign_parm_setup_stack(), emit_library_call_value_1(), emit_move_complex(), emit_partition_copy(), emit_push_insn(), expand_assignment(), expand_builtin_apply(), expand_builtin_va_copy(), expand_call(), expand_expr_real_1(), restore_fixed_argument_area(), save_fixed_argument_area(), store_expr(), store_field(), and store_one_arg().
rtx emit_block_move_hints | ( | rtx | x, |
rtx | y, | ||
rtx | size, | ||
enum block_op_methods | method, | ||
unsigned int | expected_align, | ||
HOST_WIDE_INT | expected_size | ||
) |
Emit code to move a block Y to a block X. This may be done with string-move instructions, with multiple scalar move instructions, or with a library call. Both X and Y must be MEM rtx's (perhaps inside VOLATILE) with mode BLKmode. SIZE is an rtx that says how long they are. ALIGN is the maximum alignment we can assume they have. METHOD describes what kind of copy this is, and what mechanisms may be used. Return the address of the new block, if memcpy is called and returns it, 0 otherwise.
References block_move_libcall_safe_for_call_parm(), BLOCK_OP_CALL_PARM, BLOCK_OP_NO_LIBCALL, BLOCK_OP_NORMAL, BLOCK_OP_TAILCALL, emit_block_move_via_libcall(), emit_block_move_via_loop(), emit_block_move_via_movmem(), mark_addressable(), move_by_pieces(), and set_mem_size().
Referenced by emit_block_move(), and expand_builtin_memcpy().
|
static |
Referenced by block_move_libcall_safe_for_call_parm(), and emit_block_move_via_libcall().
|
static |
References block_move_fn, init_block_move_fn(), and make_decl_rtl().
rtx emit_block_move_via_libcall | ( | ) |
A subroutine of emit_block_move. Expand a call to memcpy. Return the return value from memcpy, 0 otherwise.
References build_call_expr(), convert_to_mode(), copy_addr_to_reg(), copy_to_mode_reg(), emit_block_move_libcall_fn(), expand_normal(), make_tree(), and ptr_mode.
Referenced by emit_block_move_hints().
Referenced by emit_block_move_hints().
A subroutine of emit_block_move. Copy the data via an explicit loop. This is used only when libcalls are forbidden.
??? It'd be nice to copy in hunks larger than QImode.
References change_address(), convert_modes(), do_pending_stack_adjust(), emit_cmp_and_jump_insns(), emit_jump(), emit_label(), emit_move_insn(), expand_simple_binop(), force_operand(), gen_label_rtx(), gen_reg_rtx(), get_address_mode(), OPTAB_LIB_WIDEN, simplify_gen_binary(), and word_mode.
|
static |
Referenced by emit_block_move_hints().
|
static |
A subroutine of emit_block_move. Expand a movmem pattern; return true if successful.
References create_convert_operand_to(), create_fixed_operand(), create_integer_operand(), direct_optab_handler(), HOST_WIDE_INT, insn_data, maybe_expand_insn(), and volatile_ok.
void emit_group_load | ( | ) |
Emit code to move a block SRC of type TYPE to a block DST, where DST is non-consecutive registers represented by a PARALLEL. SSIZE represents the total size of block ORIG_SRC in bytes, or -1 if not known.
References emit_group_load_1(), and emit_move_insn().
Referenced by emit_group_store(), emit_library_call_value_1(), emit_push_insn(), expand_assignment(), expand_function_end(), expand_value_return(), and store_expr().
|
static |
A subroutine of emit_group_load. Arguments as for emit_group_load, except that values are placed in TMPS[i], and must later be moved into corresponding XEXP (XVECEXP (DST, 0, i), 0) element.
References assign_stack_temp(), downward, emit_move_insn(), expand_shift(), extract_bit_field(), first, gen_reg_rtx(), HOST_WIDE_INT, int_mode_for_mode(), len, shift, simplify_gen_subreg(), split_double(), and upward.
Referenced by emit_group_load(), and emit_group_load_into_temps().
rtx emit_group_load_into_temps | ( | ) |
Similar, but load SRC into new pseudos in a format that looks like PARALLEL. This can later be fed to emit_group_move to get things in the right place.
References alloc_EXPR_LIST(), emit_group_load_1(), force_reg(), and rtvec_alloc().
Referenced by precompute_register_parameters(), and store_one_arg().
void emit_group_move | ( | ) |
Emit code to move a block SRC to block DST, where SRC and DST are non-consecutive groups of registers, each represented by a PARALLEL.
References emit_move_insn().
Referenced by expand_assignment(), expand_call(), expand_function_end(), load_register_parameters(), and store_expr().
rtx emit_group_move_into_temps | ( | ) |
Move a group of registers represented by a PARALLEL into pseudos.
References alloc_EXPR_LIST(), copy_to_reg(), and rtvec_alloc().
Referenced by assign_parm_setup_block(), and expand_call().
void emit_group_store | ( | ) |
Emit code to move a block SRC to a block ORIG_DST of type TYPE, where SRC is non-consecutive registers represented by a PARALLEL. SSIZE represents the total size of block ORIG_DST, or -1 if not known.
References assign_stack_temp(), downward, emit_group_load(), emit_move_insn(), expand_shift(), gen_reg_rtx(), HOST_WIDE_INT, int_mode_for_mode(), rtx_equal_p(), shift, simplify_gen_subreg(), store_bit_field(), subreg_lowpart_offset(), and upward.
Referenced by assign_parm_adjust_entry_rtl(), assign_parm_remove_parallels(), assign_parm_setup_block(), emit_library_call_value_1(), expand_assignment(), expand_call(), maybe_emit_group_store(), store_expr(), and store_field().
|
static |
A subroutine of emit_move_insn_1. Generate a move from Y into X. MODE is known to be MODE_CC. Returns the last instruction emitted.
References emit_insn(), emit_move_change_mode(), emit_move_via_integer(), and optab_handler().
Referenced by emit_move_insn_1().
|
static |
A subroutine of emit_move_insn_1. Yet another lowpart generator. NEW_MODE and OLD_MODE are the same size. Return NULL if X cannot be represented in NEW_MODE. If FORCE is true, this will never happen, as we'll force-create a SUBREG if needed.
References copy_replacements(), gen_rtx_MEM(), push_operand(), reload_in_progress, simplify_gen_subreg(), and simplify_subreg().
Referenced by emit_move_ccmode(), and emit_move_via_integer().
|
static |
A subroutine of emit_move_insn_1. Generate a move from Y into X. MODE is known to be complex. Returns the last instruction emitted.
References BLOCK_OP_NO_LIBCALL, emit_block_move(), emit_move_complex_parts(), emit_move_complex_push(), emit_move_via_integer(), get_last_insn(), get_mode_alignment(), optab_handler(), push_operand(), and register_operand().
Referenced by emit_move_insn_1().
rtx emit_move_complex_parts | ( | ) |
A subroutine of emit_move_complex. Perform the move from Y to X via two moves of the parts. Returns the last instruction emitted.
References emit_clobber(), get_last_insn(), read_complex_part(), reg_overlap_mentioned_p(), reload_completed, reload_in_progress, and write_complex_part().
Referenced by emit_move_complex().
rtx emit_move_complex_push | ( | ) |
A subroutine of emit_move_complex. Generate a move from Y into X. X is known to satisfy push_operand, and MODE is known to be complex. Returns the last instruction emitted.
References emit_move_insn(), emit_move_resolve_push(), gen_rtx_MEM(), and read_complex_part().
Referenced by emit_move_complex().
rtx emit_move_insn | ( | ) |
Generate code to copy Y into X. Both Y and X must have the same mode, except that Y can be a constant with VOIDmode. This mode cannot be BLKmode; use emit_block_move for that. Return the last instruction emitted.
References compress_float_constant(), copy_rtx(), emit_move_insn_1(), force_const_mem(), memory_address_addr_space_p(), push_operand(), rtx_equal_p(), set_unique_reg_note(), targetm, use_anchored_address(), and validize_mem().
Referenced by adjust_stack_1(), allocate_dynamic_stack_space(), asan_clear_shadow(), asan_emit_stack_protection(), assign_parm_setup_block(), assign_parm_setup_reg(), assign_parm_setup_stack(), assign_parms_unsplit_complex(), avoid_likely_spilled_reg(), clear_storage_hints(), combine_var_copies_in_loop_exit(), convert_move(), copy_blkmode_from_reg(), copy_blkmode_to_reg(), copy_src_to_dest(), copy_to_mode_reg(), copy_to_reg(), copy_to_suggested_reg(), do_jump_by_parts_zero_rtx(), emit_block_move_via_loop(), emit_group_load(), emit_group_load_1(), emit_group_move(), emit_group_store(), emit_initial_value_sets(), emit_libcall_block_1(), emit_library_call_value_1(), emit_move_complex_push(), emit_move_list(), emit_move_multi_word(), emit_move_resolve_push(), emit_partition_copy(), emit_push_insn(), emit_single_push_insn_1(), emit_stack_probe(), emit_store_flag(), emit_store_flag_force(), expand_abs(), expand_absneg_bit(), expand_and(), expand_asm_operands(), expand_assignment(), expand_atomic_fetch_op(), expand_atomic_load(), expand_atomic_store(), expand_atomic_test_and_set(), expand_binop(), expand_builtin_apply(), expand_builtin_apply_args_1(), expand_builtin_atomic_clear(), expand_builtin_atomic_compare_exchange(), expand_builtin_eh_copy_values(), expand_builtin_eh_return(), expand_builtin_init_dwarf_reg_sizes(), expand_builtin_longjmp(), expand_builtin_nonlocal_goto(), expand_builtin_return(), expand_builtin_setjmp_receiver(), expand_builtin_setjmp_setup(), expand_builtin_sincos(), expand_builtin_stpcpy(), expand_builtin_strlen(), expand_call(), expand_compare_and_swap_loop(), expand_copysign_absneg(), expand_copysign_bit(), expand_dec(), expand_divmod(), expand_doubleword_bswap(), expand_doubleword_mult(), expand_dw2_landing_pad_for_region(), expand_eh_return(), expand_errno_check(), expand_expr_real_1(), expand_expr_real_2(), expand_fix(), expand_fixed_convert(), expand_float(), expand_function_end(), expand_function_start(), expand_gimple_stmt_1(), expand_inc(), expand_movstr(), expand_mult_const(), expand_smod_pow2(), expand_superword_shift(), expand_unop(), expand_value_return(), extract_bit_field_1(), find_shift_sequence(), fix_crossing_unconditional_branches(), force_expand_binop(), force_not_mem(), force_operand(), force_reg(), generate_prolog_epilog(), get_arg_pointer_save_area(), inherit_in_ebb(), inherit_reload_reg(), init_return_column_size(), init_set_costs(), initialize_uninitialized_regs(), insert_base_initialization(), insert_move_insn_before(), insert_value_copy_on_edge(), insert_var_expansion_initialization(), instantiate_virtual_regs_in_insn(), load_register_parameters(), lra_emit_add(), lra_emit_move(), make_safe_from(), match_asm_constraints_1(), maybe_emit_unop_insn(), move_block_from_reg(), move_block_to_reg(), noce_emit_cmove(), noce_emit_move_insn(), optimize_bitfield_assignment_op(), prepare_call_address(), process_insert_insn(), resolve_shift_zext(), resolve_simple_move(), restore_fixed_argument_area(), save_fixed_argument_area(), sjlj_emit_dispatch_table(), sjlj_emit_function_enter(), sjlj_mark_call_sites(), split_iv(), stack_protect_prologue(), store_bit_field_1(), store_bit_field_using_insv(), store_constructor(), store_expr(), store_fixed_bit_field(), store_one_arg(), store_unaligned_arguments_into_pseudos(), unroll_loop_runtime_iterations(), widen_bswap(), widen_operand(), and write_complex_part().
rtx emit_move_insn_1 | ( | ) |
Low level part of emit_move_insn. Called just like emit_move_insn, but assumes X and Y are basically valid.
References emit_insn(), emit_move_ccmode(), emit_move_complex(), emit_move_multi_word(), emit_move_via_integer(), HOST_BITS_PER_WIDE_INT, lra_in_progress, optab_handler(), and recog().
Referenced by emit_move_insn(), and gen_move_insn().
|
static |
A subroutine of emit_move_insn_1. Generate a move from Y into X. MODE is any multi-word or full-word mode that lacks a move_insn pattern. Note that you will get better code if you define such patterns, even if they must turn into multiple assembler instructions.
References emit_clobber(), emit_insn(), emit_move_insn(), emit_move_resolve_push(), end_sequence(), find_replacement(), force_const_mem(), get_insns(), operand_subword(), operand_subword_force(), push_operand(), reload_completed, reload_in_progress, replace_equiv_address_nv(), start_sequence(), undefined_operand_subword_p(), and use_anchored_address().
Referenced by emit_move_insn_1().
|
static |
A subroutine of emit_move_insn_1. X is a push_operand in MODE. Return an equivalent MEM that does not use an auto-increment.
References emit_move_insn(), expand_simple_binop(), HOST_WIDE_INT, OPTAB_LIB_WIDEN, plus_constant(), and replace_equiv_address().
Referenced by emit_move_complex_push(), and emit_move_multi_word().
|
static |
A subroutine of emit_move_insn_1. Generate a move from Y into X using an integer mode of the same size as MODE. Returns the instruction emitted, or NULL if such a move could not be generated.
References emit_insn(), emit_move_change_mode(), int_mode_for_mode(), and optab_handler().
Referenced by emit_move_ccmode(), emit_move_complex(), and emit_move_insn_1().
void emit_push_insn | ( | rtx | x, |
enum machine_mode | mode, | ||
tree | type, | ||
rtx | size, | ||
unsigned int | align, | ||
int | partial, | ||
rtx | reg, | ||
int | extra, | ||
rtx | args_addr, | ||
rtx | args_so_far, | ||
int | reg_parm_stack_space, | ||
rtx | alignment_pad | ||
) |
Generate code to push X onto the stack, assuming it has mode MODE and type TYPE. MODE is redundant except when X is a CONST_INT (since they don't carry mode info). SIZE is an rtx for the size of data to be copied (in bytes), needed only if X is BLKmode. ALIGN (in bits) is maximum alignment we can assume. If PARTIAL and REG are both nonzero, then copy that many of the first bytes of X into registers starting with REG, and push the rest of X. The amount of space pushed is decreased by PARTIAL bytes. REG must be a hard register in this case. If REG is zero but PARTIAL is not, take any all others actions for an argument partially in registers, but do not actually load any registers. EXTRA is the amount in bytes of extra space to leave next to this arg. This is ignored if an argument block has already been allocated. On a machine that lacks real push insns, ARGS_ADDR is the address of the bottom of the argument block for this call. We use indexing off there to store the arg. On machines with push insns, ARGS_ADDR is 0 when a argument block has not been preallocated. ARGS_SO_FAR is the size of args previously pushed for this call. REG_PARM_STACK_SPACE is nonzero if functions require stack space for arguments passed in registers. If nonzero, it will be the number of bytes required.
References anti_adjust_stack(), assign_temp(), BLOCK_OP_CALL_PARM, copy_to_reg(), downward, emit_block_move(), emit_group_load(), emit_move_insn(), emit_push_insn(), emit_single_push_insn(), expand_binop(), force_const_mem(), gen_rtx_MEM(), HOST_WIDE_INT, move_block_to_reg(), move_by_pieces(), none, offset, operand_subword_force(), OPTAB_LIB_WIDEN, plus_constant(), push_block(), reg_mentioned_p(), set_mem_align(), targetm, upward, validize_mem(), and word_mode.
Referenced by emit_library_call_value_1(), emit_push_insn(), and store_one_arg().
Referenced by emit_push_insn(), and move_by_pieces_1().
|
static |
Emit and annotate a single push insn.
References add_reg_note(), emit_single_push_insn_1(), fixup_args_size_notes(), get_last_insn(), and last.
|
static |
Emit single push insn.
References create_input_operand(), downward, emit_move_insn(), expand_binop(), gen_rtx_MEM(), HOST_WIDE_INT, maybe_expand_insn(), offset, optab_handler(), OPTAB_LIB_WIDEN, set_mem_alias_set(), and set_mem_attributes().
Referenced by emit_single_push_insn().
bool emit_storent_insn | ( | ) |
Emits nontemporal store insn that moves FROM to TO. Returns true if this succeeded, false otherwise.
References create_fixed_operand(), create_input_operand(), maybe_expand_insn(), and optab_handler().
Referenced by expand_gimple_stmt_1(), and store_expr().
void expand_assignment | ( | ) |
Expand an assignment that stores the value of FROM into TO. If NONTEMPORAL is true, try generating a nontemporal store.
References aggregate_value_p(), assign_stack_temp(), BLOCK_OP_NORMAL, cfun, convert_memory_address_addr_space(), convert_to_mode(), copy_blkmode_from_reg(), copy_blkmode_to_reg(), copy_rtx(), create_fixed_operand(), create_input_operand(), emit_block_move(), emit_group_load(), emit_group_move(), emit_group_store(), emit_library_call(), emit_move_insn(), expand_builtin_trap(), expand_expr(), expand_insn(), EXPAND_NORMAL, expand_normal(), EXPAND_SUM, EXPAND_WRITE, expr_size(), force_not_mem(), gen_reg_rtx(), gen_rtx_MEM(), get_address_mode(), get_alias_set(), get_bit_range(), get_inner_reference(), get_object_alignment(), handled_component_p(), highest_pow2_factor_for_target(), HOST_WIDE_INT, int_size_in_bytes(), LCT_NORMAL, mem_ref_refers_to_non_mem_p(), offset, offset_address(), operand_equal_p(), optab_handler(), optimize_bitfield_assignment_op(), pop_temp_slots(), preserve_temp_slots(), push_temp_slots(), read_complex_part(), refs_may_alias_p(), function::returns_pcc_struct, function::returns_struct, set_mem_attributes_minus_bitpos(), simplify_gen_subreg(), store_bit_field(), store_expr(), store_field(), expand_operand::value, and write_complex_part().
Referenced by assign_parm_setup_reg(), expand_asm_stmt(), expand_call_stmt(), expand_expr_real_1(), expand_gimple_stmt_1(), and store_constructor().
Try to expand the conditional expression which is represented by TREEOP0 ? TREEOP1 : TREEOP2 using conditonal moves. If succeseds return the rtl reg which repsents the result. Otherwise return NULL_RTL.
References assign_temp(), can_conditionally_move_p(), convert_modes(), convert_tree_comp_to_rtx(), emit_conditional_move(), emit_insn(), end_sequence(), EXPAND_NORMAL, expand_normal(), expand_operands(), get_def_for_expr_class(), get_insns(), gimple_assign_rhs1(), gimple_assign_rhs2(), gimple_assign_rhs_code(), promote_mode(), start_sequence(), and tcc_comparison.
Referenced by expand_expr_real_2().
|
static |
Generate code for computing CONSTRUCTOR EXP. An rtx for the computed value is returned. If AVOID_TEMP_MEM is TRUE, instead of creating a temporary variable in memory NULL is returned and the caller needs to handle it differently.
References all_zeros_p(), assign_temp(), BLOCK_OP_NORMAL, build_qualified_type(), clear_storage(), EXPAND_CONST_ADDRESS, expand_expr_constant(), EXPAND_INITIALIZER, EXPAND_STACK_PARM, EXPAND_SUM, expr_size(), host_integerp(), int_expr_size(), mostly_zeros_p(), safe_from_p(), store_constructor(), tree_low_cst(), TYPE_QUAL_CONST, and validize_mem().
Referenced by expand_expr_real_1().
|
static |
A subroutine of expand_expr. Evaluate EXP, which is an ADDR_EXPR. The TARGET, TMODE and MODIFIER arguments are as for expand_expr.
References convert_memory_address_addr_space(), expand_expr_addr_expr_1(), ptr_mode, and targetm.
Referenced by expand_expr_real_1().
|
static |
A subroutine of expand_expr_addr_expr. Evaluate the address of EXP. The TARGET, TMODE and MODIFIER arguments are as for expand_expr.
References convert_memory_address_addr_space(), copy_node(), error(), EXPAND_CONST_ADDRESS, expand_expr(), expand_expr_constant(), EXPAND_INITIALIZER, EXPAND_NORMAL, expand_simple_binop(), EXPAND_SUM, force_operand(), get_inner_reference(), HOST_WIDE_INT, integer_zerop(), offset, OPTAB_LIB_WIDEN, plus_constant(), simplify_gen_binary(), and targetm.
Referenced by expand_expr_addr_expr().
|
static |
Return a MEM that contains constant EXP. DEFER is as for output_constant_def and MODIFIER is as for expand_expr.
References EXPAND_INITIALIZER, output_constant_def(), and use_anchored_address().
Referenced by expand_constructor(), expand_expr_addr_expr_1(), and expand_expr_real_1().
rtx expand_expr_real | ( | tree | exp, |
rtx | target, | ||
enum machine_mode | tmode, | ||
enum expand_modifier | modifier, | ||
rtx * | alt_rtl | ||
) |
expand_expr: generate code for computing expression EXP. An rtx for the computed value is returned. The value is never null. In the case of a void EXP, const0_rtx is returned. The value may be stored in TARGET if TARGET is nonzero. TARGET is just a suggestion; callers must assume that the rtx returned may not be the same as TARGET. If TARGET is CONST0_RTX, it means that the value will be ignored. If TMODE is not VOIDmode, it suggests generating the result in mode TMODE. But this is done only when convenient. Otherwise, TMODE is ignored and the value generated in its natural mode. TMODE is just a suggestion; callers must assume that the rtx returned may not have mode TMODE. Note that TARGET may have neither TMODE nor MODE. In that case, it probably will not be used. If MODIFIER is EXPAND_SUM then when EXP is an addition we can return an rtx of the form (MULT (REG ...) (CONST_INT ...)) or a nest of (PLUS ...) and (MINUS ...) where the terms are products as above, or REG or MEM, or constant. Ordinarily in such cases we would output mul or add instructions and then return a pseudo reg containing the sum. EXPAND_INITIALIZER is much like EXPAND_SUM except that it also marks a label as absolutely required (it can't be dead). It also makes a ZERO_EXTEND or SIGN_EXTEND instead of emitting extend insns. This is used for outputting expressions used in initializers. EXPAND_CONST_ADDRESS says that it is okay to return a MEM with a constant address even if that address is not normally legitimate. EXPAND_INITIALIZER and EXPAND_SUM also have this effect. EXPAND_STACK_PARM is used when expanding to a TARGET on the stack for a call parameter. Such targets require special care as we haven't yet marked TARGET so that it's safe from being trashed by libcalls. We don't want to use TARGET for anything but the final result; Intermediate values must go elsewhere. Additionally, calls to emit_block_move will be flagged with BLOCK_OP_CALL_PARM. If EXP is a VAR_DECL whose DECL_RTL was a MEM with an invalid address, and ALT_RTL is non-NULL, then *ALT_RTL is set to the DECL_RTL of the VAR_DECL. *ALT_RTL is also set if EXP is a COMPOUND_EXPR whose second argument is such a VAR_DECL, and so on recursively.
References expand_expr_real_1().
Referenced by expand_expr(), expand_expr_real_1(), expand_normal(), and store_expr().
rtx expand_expr_real_1 | ( | tree | exp, |
rtx | target, | ||
enum machine_mode | tmode, | ||
enum expand_modifier | modifier, | ||
rtx * | alt_rtl | ||
) |
References add_to_hard_reg_set(), addr_for_mem_ref(), array_ref_low_bound(), assign_stack_temp(), assign_stack_temp_for_type(), assign_temp(), BLOCK_OP_CALL_PARM, BLOCK_OP_NORMAL, build_constructor(), build_int_cst(), build_qualified_type(), BUILT_IN_FRONTEND, separate_ops::code, compare_tree_int(), CONST_FIXED_FROM_FIXED_VALUE, const_vector_from_tree(), convert_modes(), convert_move(), convert_to_mode(), copy_rtx(), copy_to_reg(), count, create_fixed_operand(), create_output_operand(), ctor_for_folding(), curr_insn_location(), current_function_decl, currently_expanding_to_rtl, decl_function_context(), lang_hooks::decl_printable_name, do_jump(), do_pending_stack_adjust(), emit_block_move(), emit_insn(), emit_label(), emit_move_insn(), error(), exp(), expand_and(), expand_assignment(), expand_builtin(), expand_call(), EXPAND_CONST_ADDRESS, expand_constructor(), expand_expr(), expand_expr_addr_expr(), expand_expr_constant(), expand_expr_real(), expand_expr_real_1(), expand_expr_real_2(), EXPAND_INITIALIZER, expand_insn(), EXPAND_MEMORY, EXPAND_NORMAL, expand_normal(), expand_shift(), EXPAND_STACK_PARM, EXPAND_SUM, EXPAND_WRITE, extract_bit_field(), fold(), fold_convert_loc(), fold_read_from_constant_string(), fold_unary_loc(), force_const_mem(), force_reg(), g, gen_int_mode(), gen_label_rtx(), gen_lowpart_common(), gen_lowpart_SUBREG(), gen_raw_REG(), gen_reg_rtx(), gen_rtx_MEM(), get_address_description(), get_address_mode(), get_callee_fndecl(), get_def_for_expr(), get_gimple_for_ssa_name(), get_inner_reference(), get_object_alignment(), get_rtx_for_ssa_name(), get_subtarget(), gimple_assign_rhs1(), gimple_assign_rhs2(), gimple_assign_rhs_to_tree(), gimple_call_fntype(), gimple_call_internal_p(), gimple_location(), handled_component_p(), highest_pow2_factor(), HOST_BITS_PER_WIDE_INT, host_integerp(), HOST_WIDE_INT, identifier_to_locale(), immed_double_const(), immed_double_int_const(), int_size_in_bytes(), integer_onep(), integer_zerop(), is_aligning_offset(), label_rtx(), layout_decl(), separate_ops::location, lookup_attribute(), double_int::low, mark_reg_pointer(), mem_ref_offset(), mem_ref_refers_to_non_mem_p(), memory_address_addr_space(), memory_address_addr_space_p(), mode_for_size(), offset, offset_address(), separate_ops::op0, separate_ops::op1, separate_ops::op2, optab_handler(), promote_decl_mode(), promote_function_mode(), read_complex_part(), replace_equiv_address(), set_curr_insn_location(), set_mem_addr_space(), set_mem_align(), set_mem_attributes(), set_mem_size(), set_reg_attrs_for_decl_rtl(), simplify_gen_binary(), size_diffop_loc(), stmt_is_replaceable_p(), store_expr(), targetm, tcc_binary, tcc_comparison, tcc_unary, tree_int_cst_equal(), tree_nonartificial_location(), separate_ops::type, type(), lang_hooks_for_types::type_for_mode, TYPE_QUAL_CONST, lang_hooks::types, use_anchored_address(), validize_mem(), expand_operand::value, vec_alloc(), and warning_at().
Referenced by expand_call_stmt(), expand_expr_real(), and expand_expr_real_1().
rtx expand_expr_real_2 | ( | sepops | ops, |
rtx | target, | ||
enum machine_mode | tmode, | ||
enum expand_modifier | modifier | ||
) |
References assign_temp(), build_call_expr(), can_conditionally_move_p(), separate_ops::code, convert_modes(), convert_move(), convert_to_mode(), copy_rtx(), copy_to_mode_reg(), do_compare_rtx_and_jump(), do_pending_stack_adjust(), do_store_flag(), emit_barrier(), emit_conditional_move(), emit_insn(), emit_jump_insn(), emit_label(), emit_move_insn(), end_sequence(), expand_abs(), expand_binop(), expand_builtin(), expand_cond_expr_using_cmove(), expand_divmod(), expand_expr(), expand_fix(), expand_fixed_convert(), expand_float(), EXPAND_INITIALIZER, expand_mult(), expand_mult_highpart(), expand_mult_highpart_adjust(), EXPAND_NORMAL, expand_normal(), expand_operands(), EXPAND_STACK_PARM, EXPAND_SUM, expand_ternary_op(), expand_unop(), expand_variable_shift(), expand_vec_cond_expr(), expand_vec_perm(), expand_vec_shift_expr(), expand_widen_pattern_expr(), expand_widening_mult(), fold_convert_loc(), force_operand(), force_reg(), gen_highpart(), gen_int_mode(), gen_label_rtx(), gen_reg_rtx(), get_def_for_expr(), get_gimple_rhs_class(), get_insns(), get_subtarget(), gimple_assign_rhs1(), GIMPLE_BINARY_RHS, GIMPLE_TERNARY_RHS, GIMPLE_UNARY_RHS, HOST_BITS_PER_WIDE_INT, host_integerp(), HOST_WIDE_INT, immed_double_const(), immed_double_int_const(), int_fits_type_p(), int_size_in_bytes(), jumpifnot(), jumpifnot_1(), separate_ops::location, double_int::mask(), mathfn_built_in(), mode_for_vector(), negate_rtx(), separate_ops::op0, separate_ops::op1, separate_ops::op2, optab_default, optab_for_tree_code(), optab_handler(), OPTAB_LIB_WIDEN, OPTAB_WIDEN, plus_constant(), ptr_mode, really_constant_p(), reg_overlap_mentioned_p(), safe_from_p(), set_mem_attributes(), simplify_gen_binary(), simplify_gen_subreg(), simplify_subreg(), start_sequence(), store_expr(), store_field(), subreg_lowpart_offset(), targetm, tree_low_cst(), separate_ops::type, type(), word_mode, and write_complex_part().
Referenced by expand_expr_real_1(), and expand_gimple_stmt_1().
|
static |
Subroutine of expand_expr. Expand the two operands of a binary expression EXP0 and EXP1 placing the results in OP0 and OP1. The value may be stored in TARGET if TARGET is nonzero. The MODIFIER argument is as documented by expand_expr.
References copy_rtx(), expand_expr(), operand_equal_p(), safe_from_p(), and save_expr().
Referenced by do_store_flag(), expand_cond_expr_using_cmove(), and expand_expr_real_2().
HOST_WIDE_INT find_args_size_adjust | ( | ) |
A utility routine used here, in reload, and in try_split. The insns after PREV up to and including LAST are known to adjust the stack, with a final value of END_ARGS_SIZE. Iterate backward from LAST placing notes as appropriate. PREV may be NULL, indicating the entire insn sequence prior to LAST should be scanned. The set of allowed stack pointer modifications is small: (1) One or more auto-inc style memory references (aka pushes), (2) One or more addition/subtraction with the SP as destination, (3) A single move insn with the SP as destination, (4) A call_pop insn, (5) Noreturn call insns if !ACCUMULATE_OUTGOING_ARGS. Insns in the sequence that do not modify the SP are ignored, except for noreturn calls. The return value is the amount of adjustment that can be trivially verified, via immediate operand or auto-inc. If the adjustment cannot be trivially extracted, the return value is INT_MIN.
References HOST_WIDE_INT_MIN, mem_autoinc_base(), rtx_equal_p(), and SET.
Referenced by fixup_args_size_notes(), and old_insns_match_p().
int fixup_args_size_notes | ( | ) |
References add_reg_note(), find_args_size_adjust(), find_reg_note(), HOST_WIDE_INT, and HOST_WIDE_INT_MIN.
Referenced by distribute_notes(), emit_single_push_insn(), expand_builtin_apply(), expand_call(), expand_stack_restore(), peep2_attempt(), reload_as_needed(), and try_split().
|
static |
Return true if field F of structure TYPE is a flexible array.
References int_size_in_bytes(), and integer_zerop().
Referenced by count_type_elements().
rtx force_operand | ( | ) |
Given an rtx VALUE that may contain additions and multiplications, return an equivalent value that just refers to a register, memory, or constant. This is done by generating instructions to perform the arithmetic and returning a pseudo-register containing the value. The returned value may be a REG, SUBREG, MEM or constant.
References convert_move(), emit_move_insn(), expand_divmod(), expand_fix(), expand_float(), expand_mult(), expand_simple_binop(), expand_simple_unop(), force_reg(), gen_reg_rtx(), get_subtarget(), negate_rtx(), OPTAB_LIB_WIDEN, paradoxical_subreg_p(), simplify_gen_subreg(), and expand_operand::value.
Referenced by add_test(), allocate_dynamic_stack_space(), anti_adjust_stack_and_probe(), combine_var_copies_in_loop_exit(), compare_and_jump_seq(), copy_to_mode_reg(), copy_to_reg(), doloop_modify(), emit_block_move_via_loop(), emit_library_call_value_1(), expand_builtin_apply_args_1(), expand_builtin_memcpy(), expand_builtin_mempcpy_args(), expand_builtin_memset_args(), expand_builtin_setjmp_setup(), expand_builtin_stpcpy(), expand_builtin_strncpy(), expand_call(), expand_divmod(), expand_expr_addr_expr_1(), expand_expr_real_2(), expand_gimple_stmt_1(), expand_movstr(), expand_mult_const(), expand_mult_highpart_adjust(), expmed_mult_highpart(), force_reg(), insert_base_initialization(), instantiate_virtual_regs_in_insn(), memory_address_addr_space(), probe_stack_range(), round_push(), rtl_lv_add_condition_to_bb(), split_iv(), store_expr(), and unroll_loop_runtime_iterations().
rtx gen_group_rtx | ( | ) |
Generate a PARALLEL rtx for a new non-consecutive group of registers from ORIG, where ORIG is a non-consecutive group of registers represented by a PARALLEL. The clone is identical to the original except in that the original set of registers is replaced by a new set of pseudo registers. The new set has the same modes as the original set.
References gen_reg_rtx(), gen_rtvec_v(), and offset.
Referenced by expand_function_start().
|
static |
In the C++ memory model, consecutive bit fields in a structure are considered one memory location. Given a COMPONENT_REF EXP at position (BITPOS, OFFSET), this function returns the bit range of consecutive bits in which this COMPONENT_REF belongs. The values are returned in *BITSTART and *BITEND. *BITPOS and *OFFSET may be adjusted in the process. If the access does not need to be restricted, 0 is returned in both *BITSTART and *BITEND.
References get_inner_reference(), handled_component_p(), host_integerp(), HOST_WIDE_INT, and tree_low_cst().
Referenced by expand_assignment().
|
static |
Return the defining gimple statement for SSA_NAME NAME if it is an assigment and the code of the expresion on the RHS is CODE. Return NULL otherwise.
References get_gimple_for_ssa_name(), and gimple_assign_rhs_code().
Referenced by do_store_flag(), expand_expr_real_1(), expand_expr_real_2(), and store_field().
|
static |
Return the defining gimple statement for SSA_NAME NAME if it is an assigment and the class of the expresion on the RHS is CLASS. Return NULL otherwise.
References get_gimple_for_ssa_name(), and gimple_assign_rhs_code().
Referenced by expand_cond_expr_using_cmove().
tree get_inner_reference | ( | tree | exp, |
HOST_WIDE_INT * | pbitsize, | ||
HOST_WIDE_INT * | pbitpos, | ||
tree * | poffset, | ||
enum machine_mode * | pmode, | ||
int * | punsignedp, | ||
int * | pvolatilep, | ||
bool | keep_aligning | ||
) |
Given an expression EXP that may be a COMPONENT_REF, a BIT_FIELD_REF, an ARRAY_REF, or an ARRAY_RANGE_REF, look for nested operations of these codes and find the ultimate containing object, which we return. We set *PBITSIZE to the size in bits that we want, *PBITPOS to the bit position, and *PUNSIGNEDP to the signedness of the field. If the position of the field is variable, we store a tree giving the variable offset (in units) in *POFFSET. This offset is in addition to the bit position. If the position is not variable, we store 0 in *POFFSET. If any of the extraction expressions is volatile, we store 1 in *PVOLATILEP. Otherwise we don't change that. If the field is a non-BLKmode bit-field, *PMODE is set to VOIDmode. Otherwise, it is a mode that can be used to access the field. If the field describes a variable-sized object, *PMODE is set to BLKmode and *PBITSIZE is set to -1. An access cannot be made in this case, but the address of the object can be found. If KEEP_ALIGNING is true and the target is STRICT_ALIGNMENT, we don't look through nodes that serve as markers of a greater alignment than the one that can be deduced from the expression. These nodes make it possible for front-ends to prevent temporaries from being created by the middle-end on alignment considerations. For that purpose, the normal operating mode at high-level is to always pass FALSE so that the ultimate containing object is really returned; moreover, the associated predicate handled_component_p will always return TRUE on these nodes, thus indicating that they are essentially handled by get_inner_reference. TRUE should only be passed when the caller is scanning the expression in order to build another representation and specifically knows how to handle these nodes; as such, this is the normal operating mode in the RTL expanders.
References double_int::and_not(), array_ref_element_size(), array_ref_low_bound(), double_int::arshift(), component_ref_field_offset(), double_int_to_tree(), exact_log2(), exp(), double_int::fits_shwi(), double_int::from_uhwi(), host_integerp(), integer_zerop(), double_int::is_negative(), double_int::lshift(), double_int::mask(), mem_ref_offset(), offset, double_int::sext(), double_int::to_shwi(), tree_int_cst_equal(), tree_low_cst(), and tree_to_double_int().
Referenced by dbxout_expand_expr(), decode_field_reference(), delegitimize_mem_from_attrs(), dr_analyze_innermost(), expand_assignment(), expand_debug_expr(), expand_expr_addr_expr_1(), expand_expr_real_1(), fold_comparison(), fold_unary_loc(), fortran_common(), get_bit_range(), get_inner_reference_aff(), get_object_alignment_2(), instrument_derefs(), instrument_expr(), interpret_rhs_expr(), loc_list_for_address_of_addr_expr_of_indirect_ref(), loc_list_from_tree(), may_be_unaligned_p(), optimize_bit_field_compare(), slsr_process_ref(), split_address_cost(), split_address_to_core_and_offset(), split_constant_offset_1(), tree_to_aff_combination(), vect_analyze_data_refs(), and vect_check_gather().
rtx get_personality_function | ( | ) |
Extracts the personality function of DECL and returns the corresponding libfunc.
References lang_hooks::eh_personality, eh_personality_any, eh_personality_lang, eh_personality_none, and function_needs_eh_personality().
Referenced by dwarf2out_begin_prologue(), dwarf2out_do_cfi_startproc(), output_function_exception_table(), and sjlj_emit_function_enter().
Referenced by do_store_flag(), expand_expr_real_1(), expand_expr_real_2(), and force_operand().
|
static |
Return X if X can be used as a subtarget in a sequence of arithmetic operations.
unsigned HOST_WIDE_INT highest_pow2_factor | ( | ) |
Return the highest power of two that EXP is known to be a multiple of. This is used in updating alignment of MEMs in array references.
References host_integerp(), HOST_WIDE_INT, integer_pow2p(), and tree_low_cst().
Referenced by dr_analyze_innermost(), expand_expr_real_1(), highest_pow2_factor_for_target(), may_be_unaligned_p(), store_constructor(), store_expr(), and vect_analyze_data_refs().
|
static |
Referenced by expand_assignment().
|
static |
Similar, except that the alignment requirements of TARGET are taken into account. Assume it is at least as aligned as its type, unless it is a COMPONENT_REF in which case the layout of the structure gives the alignment.
References highest_pow2_factor(), HOST_WIDE_INT, and target_align().
void init_block_clear_fn | ( | ) |
References build_function_type_list(), get_identifier(), set_user_assembler_name(), and VISIBILITY_DEFAULT.
Referenced by clear_storage_libcall_fn(), and set_builtin_user_assembler_name().
void init_block_move_fn | ( | ) |
References ATTR_FLAG_BUILT_IN, build_function_type_list(), build_string(), decl_attributes(), get_identifier(), set_user_assembler_name(), and VISIBILITY_DEFAULT.
Referenced by emit_block_move_libcall_fn(), and set_builtin_user_assembler_name().
void init_expr | ( | void | ) |
This is run at the start of compiling a function.
References memset().
Referenced by get_initial_def_for_induction(), gimplify_target_expr(), prepare_function_start(), vect_is_simple_iv_evolution(), and vect_update_ivs_after_vectorizer().
void init_expr_target | ( | void | ) |
This is run to set up which modes can be used directly in memory and to initialize the block move optab. It is run at the beginning of compilation and when the target is reinitialized.
References can_extend_p(), gen_rtx_MEM(), gen_rtx_REG(), insn_operand_matches(), and recog().
Referenced by lang_dependent_init_target().
|
static |
Referenced by expand_expr_real_1().
|
static |
Subroutine of above: returns 1 if OFFSET corresponds to an offset that when applied to the address of EXP produces an address known to be aligned more than BIGGEST_ALIGNMENT.
References compare_tree_int(), exact_log2(), exp(), host_integerp(), and tree_low_cst().
rtx maybe_emit_group_store | ( | ) |
Return a form of X that does not use a PARALLEL. TYPE is the type of the value stored in X.
References emit_group_store(), gen_reg_rtx(), and int_size_in_bytes().
Referenced by expand_builtin_int_roundingfn(), and expand_builtin_int_roundingfn_2().
|
static |
A utility routine that returns the base of an auto-inc memory, or NULL.
References RTX_AUTOINC.
Referenced by find_args_size_adjust().
|
inlinestatic |
Returns true if the MEM_REF REF refers to an object that does not reside in memory and has non-BLKmode.
References addr_expr_of_non_mem_decl_p_1().
Referenced by expand_assignment(), and expand_expr_real_1().
|
static |
Return 1 if EXP contains mostly (3/4) zeros.
References categorize_ctor_elements(), HOST_WIDE_INT, and initializer_zerop().
Referenced by expand_constructor(), and store_constructor().
void move_block_from_reg | ( | ) |
Copy all or part of a BLKmode value X out of registers starting at REGNO. The number of registers to be filled is NREGS.
References delete_insns_since(), emit_insn(), emit_move_insn(), gen_rtx_REG(), get_last_insn(), last, operand_subword(), and word_mode.
Referenced by assign_parm_adjust_entry_rtl(), and assign_parm_setup_block().
void move_block_to_reg | ( | ) |
Copy all or part of a value X into registers starting at REGNO. The number of registers to be filled is NREGS.
References delete_insns_since(), emit_insn(), emit_move_insn(), force_const_mem(), gen_rtx_REG(), get_last_insn(), last, operand_subword_force(), targetm, validize_mem(), and word_mode.
Referenced by emit_push_insn(), and load_register_parameters().
rtx move_by_pieces | ( | rtx | to, |
rtx | from, | ||
unsigned HOST_WIDE_INT | len, | ||
unsigned int | align, | ||
int | endp | ||
) |
Generate several move instructions to copy LEN bytes from block FROM to block TO. (These are MEM rtx's with BLKmode). If PUSH_ROUNDING is defined and TO is NULL, emit_single_push_insn is used to push FROM to the stack. ALIGN is maximum stack alignment we can assume. If ENDP is 0 return to, if ENDP is 1 return memory at the end ala mempcpy, and if ENDP is 2 return memory the end minus one byte ala stpcpy.
References alignment_for_piecewise_move(), move_by_pieces_d::autinc_from, move_by_pieces_d::autinc_to, copy_to_mode_reg(), emit_insn(), move_by_pieces_d::explicit_inc_from, move_by_pieces_d::explicit_inc_to, move_by_pieces_d::from, move_by_pieces_d::from_addr, gen_add2_insn(), get_address_mode(), move_by_pieces_d::len, len, move_by_pieces_1(), move_by_pieces_ninsns(), move_by_pieces_d::offset, optab_handler(), plus_constant(), move_by_pieces_d::reverse, move_by_pieces_d::to, move_by_pieces_d::to_addr, and widest_int_mode_for_size().
Referenced by emit_block_move_hints(), emit_push_insn(), and expand_builtin_mempcpy_args().
|
static |
Subroutine of move_by_pieces. Move as many bytes as appropriate with move instructions for mode MODE. GENFUN is the gen_... function to make a move insn for that mode. DATA has all the other info.
References move_by_pieces_d::autinc_from, move_by_pieces_d::autinc_to, emit_insn(), emit_single_push_insn(), move_by_pieces_d::explicit_inc_from, move_by_pieces_d::explicit_inc_to, move_by_pieces_d::from, move_by_pieces_d::from_addr, gen_add2_insn(), HOST_WIDE_INT, move_by_pieces_d::len, move_by_pieces_d::offset, move_by_pieces_d::reverse, move_by_pieces_d::to, and move_by_pieces_d::to_addr.
Referenced by move_by_pieces().
unsigned HOST_WIDE_INT move_by_pieces_ninsns | ( | unsigned HOST_WIDE_INT | l, |
unsigned int | align, | ||
unsigned int | max_size | ||
) |
Return number of insns required to move L bytes by pieces. ALIGN (in bits) is maximum alignment we can assume.
References alignment_for_piecewise_move(), HOST_WIDE_INT, optab_handler(), and widest_int_mode_for_size().
Referenced by move_by_pieces(), and store_by_pieces_1().
|
static |
A subroutine of expand_assignment. Optimize FIELD op= VAL, where FIELD is a bitfield. Returns true if the optimization was successful, and there's nothing else to do.
References convert_modes(), emit_move_insn(), expand_and(), expand_binop(), expand_expr(), EXPAND_NORMAL, expand_shift(), get_best_mode(), get_gimple_for_ssa_name(), gimple_assign_rhs1(), gimple_assign_rhs2(), gimple_assign_rhs_code(), HOST_WIDE_INT, is_gimple_assign(), operand_equal_p(), OPTAB_WIDEN, set_mem_alias_set(), set_mem_expr(), tcc_binary, expand_operand::value, and word_mode.
Referenced by expand_assignment().
rtx push_block | ( | ) |
Pushing data onto the stack.
Push a block of length SIZE (perhaps variable) and return an rtx to address the beginning of the block. The value may be virtual_outgoing_args_rtx. EXTRA is the number of bytes of padding to push in addition to SIZE. BELOW nonzero means this padding comes at low addresses; otherwise, the padding comes at high addresses.
References anti_adjust_stack(), convert_modes(), copy_to_mode_reg(), expand_binop(), negate_rtx(), OPTAB_LIB_WIDEN, plus_constant(), and ptr_mode.
Referenced by emit_library_call_value_1(), emit_push_insn(), and expand_call().
|
static |
Extract one of the components of the complex value CPLX. Extract the real part if IMAG_P is false, and the imaginary part if it's true.
References expand_expr(), EXPAND_NORMAL, extract_bit_field(), and simplify_gen_subreg().
Referenced by emit_move_complex_parts(), emit_move_complex_push(), expand_assignment(), and expand_expr_real_1().
|
static |
Subroutine of above: reduce EXP to the precision of TYPE (in the signedness of TYPE), possibly returning the result in TARGET.
References build_int_cst_type(), count, expand_and(), expand_expr(), EXPAND_NORMAL, expand_shift(), HOST_WIDE_INT, immed_double_int_const(), double_int::mask(), and expand_operand::value.
int safe_from_p | ( | ) |
Subroutine of expand_expr: return nonzero iff there is no way that EXP can reference X, which is being modified. TOP_P is nonzero if this call is going to be used to determine whether we need a temporary for EXP, as opposed to a recursive call to this function. It is always safe for this routine to return zero since it merely searches for optimization opportunities.
References alias_sets_conflict_p(), get_alias_set(), HOST_WIDE_INT, constructor_elt_d::index, rtx_equal_p(), staticp(), tcc_binary, tcc_comparison, tcc_constant, tcc_declaration, tcc_exceptional, tcc_expression, tcc_reference, tcc_statement, tcc_type, tcc_unary, tcc_vl_exp, true_dependence(), and constructor_elt_d::value.
Referenced by expand_builtin_fabs(), expand_constructor(), expand_expr_real_2(), and expand_operands().
rtx set_storage_via_libcall | ( | ) |
A subroutine of clear_storage. Expand a call to memset. Return the return value of memset, 0 otherwise.
References build_call_expr(), clear_storage_libcall_fn(), convert_to_mode(), copy_addr_to_reg(), copy_to_mode_reg(), expand_normal(), and make_tree().
Referenced by clear_storage_hints().
bool set_storage_via_setmem | ( | rtx | object, |
rtx | size, | ||
rtx | val, | ||
unsigned int | align, | ||
unsigned int | expected_align, | ||
HOST_WIDE_INT | expected_size | ||
) |
Expand a setmem pattern; return true if successful.
References byte_mode, create_convert_operand_from(), create_convert_operand_to(), create_fixed_operand(), create_integer_operand(), direct_optab_handler(), HOST_WIDE_INT, insn_data, and maybe_expand_insn().
Referenced by clear_storage_hints(), and expand_builtin_memset_args().
rtx store_by_pieces | ( | rtx | to, |
unsigned HOST_WIDE_INT | len, | ||
rtx(*)(void *, HOST_WIDE_INT, enum machine_mode) | constfun, | ||
void * | constfundata, | ||
unsigned int | align, | ||
bool | memsetp, | ||
int | endp | ||
) |
Generate several move instructions to store LEN bytes generated by CONSTFUN to block TO. (A MEM rtx with BLKmode). CONSTFUNDATA is a pointer which will be passed as argument in every CONSTFUN call. ALIGN is maximum alignment we can assume. MEMSETP is true if this is a memset operation and false if it's a copy of a constant string. If ENDP is 0 return to, if ENDP is 1 return memory at the end ala mempcpy, and if ENDP is 2 return memory the end minus one byte ala stpcpy.
References store_by_pieces_d::autinc_to, store_by_pieces_d::constfun, store_by_pieces_d::constfundata, copy_to_mode_reg(), emit_insn(), store_by_pieces_d::explicit_inc_to, gen_add2_insn(), get_address_mode(), store_by_pieces_d::len, len, store_by_pieces_d::offset, plus_constant(), store_by_pieces_d::reverse, store_by_pieces_1(), store_by_pieces_d::to, and store_by_pieces_d::to_addr.
Referenced by expand_builtin_memcpy(), expand_builtin_mempcpy_args(), expand_builtin_memset_args(), expand_builtin_strncpy(), and store_expr().
|
static |
Subroutine of clear_by_pieces and store_by_pieces. Generate several move instructions to store LEN bytes of block TO. (A MEM rtx with BLKmode). ALIGN is maximum alignment we can assume.
References alignment_for_piecewise_move(), copy_to_mode_reg(), get_address_mode(), move_by_pieces_ninsns(), optab_handler(), plus_constant(), store_by_pieces_2(), store_by_pieces_d::to_addr, and widest_int_mode_for_size().
Referenced by clear_by_pieces(), and store_by_pieces().
|
static |
Subroutine of store_by_pieces_1. Store as many bytes as appropriate with move instructions for mode MODE. GENFUN is the gen_... function to make a move insn for that mode. DATA has all the other info.
References store_by_pieces_d::autinc_to, store_by_pieces_d::constfun, store_by_pieces_d::constfundata, emit_insn(), store_by_pieces_d::explicit_inc_to, gen_add2_insn(), HOST_WIDE_INT, store_by_pieces_d::len, store_by_pieces_d::offset, store_by_pieces_d::reverse, store_by_pieces_d::to, and store_by_pieces_d::to_addr.
Referenced by store_by_pieces_1().
|
static |
Referenced by expand_constructor(), store_constructor(), and store_constructor_field().
|
static |
Store the value of constructor EXP into the rtx TARGET. TARGET is either a REG or a MEM; we know it cannot conflict, since safe_from_p has been called. CLEARED is true if TARGET is known to have been zero'd. SIZE is the number of bytes of TARGET we are allowed to modify: this may not be the same as the size of EXP if we are assigning to a field which has been packed to exclude padding bits.
References bit_position(), BLOCK_OP_NORMAL, build_int_cst(), clear_storage(), convert_to_mode(), copy_rtx(), count, do_pending_stack_adjust(), emit_clobber(), emit_insn(), emit_jump(), emit_label(), emit_move_insn(), expand_assignment(), expand_normal(), expr_size(), fields_length(), gen_label_rtx(), gen_reg_rtx(), get_address_mode(), get_alias_set(), highest_pow2_factor(), host_integerp(), HOST_WIDE_INT, constructor_elt_d::index, initializer_zerop(), int_bit_position(), int_const_binop(), int_size_in_bytes(), jumpif(), make_tree(), mostly_zeros_p(), offset, offset_address(), optab_handler(), promote_decl_mode(), rtvec_alloc(), store_constructor(), store_constructor_field(), store_expr(), tree_low_cst(), lang_hooks_for_types::type_for_mode, lang_hooks::types, expand_operand::value, constructor_elt_d::value, vec_safe_iterate(), vec_safe_length(), vector, and word_mode.
|
static |
Helper function for store_constructor. TARGET, BITSIZE, BITPOS, MODE, EXP are as for store_field. CLEARED is as for store_constructor. ALIAS_SET is the alias set to use for any stores. This provides a recursive shortcut back to store_constructor when it isn't necessary to go through store_field. This is so that we can pass through the cleared field to let store_constructor know that we may not have to clear a substructure if the outer structure has already been cleared.
References copy_rtx(), set_mem_alias_set(), store_constructor(), and store_field().
Referenced by store_constructor().
rtx store_expr | ( | ) |
Generate code for computing expression EXP, and storing the value into TARGET. If the mode is BLKmode then we may return TARGET itself. It turns out that in BLKmode it doesn't cause a problem. because C has no operators that could combine two different assignments into the same BLKmode object with different values with no sequence point. Will other languages need this to be more thorough? If CALL_PARAM_P is nonzero, this is a store into a call param on the stack, and block moves may need to be treated specially. If NONTEMPORAL is true, try using a nontemporal store instruction.
References BLOCK_OP_CALL_PARM, BLOCK_OP_NORMAL, builtin_strncpy_read_str(), can_store_by_pieces(), clear_storage(), convert_modes(), convert_move(), convert_to_mode(), copy_blkmode_from_reg(), curr_insn_location(), do_pending_stack_adjust(), emit_barrier(), emit_block_move(), emit_cmp_and_jump_insns(), emit_group_load(), emit_group_move(), emit_group_store(), emit_jump_insn(), emit_label(), emit_move_insn(), emit_storent_insn(), exp(), expand_binop(), expand_expr(), expand_expr_real(), EXPAND_NORMAL, EXPAND_STACK_PARM, expr_size(), fold_convert_loc(), force_operand(), gen_label_rtx(), get_address_mode(), highest_pow2_factor(), HOST_WIDE_INT, int_expr_size(), int_size_in_bytes(), integer_zerop(), jumpifnot(), make_tree(), offset_address(), OPTAB_LIB_WIDEN, plus_constant(), rtx_equal_p(), side_effects_p(), signed_or_unsigned_type_for(), size_binop_loc(), store_bit_field(), store_by_pieces(), strlen(), targetm, lang_hooks_for_types::type_for_mode, and lang_hooks::types.
Referenced by expand_assignment(), expand_expr_real_1(), expand_expr_real_2(), initialize_argument_information(), insert_value_copy_on_edge(), store_constructor(), and store_field().
|
static |
Store the value of EXP (an expression tree) into a subfield of TARGET which has mode MODE and occupies BITSIZE bits, starting BITPOS bits from the start of TARGET. If MODE is VOIDmode, it means that we are storing into a bit-field. BITREGION_START is bitpos of the first bitfield in this region. BITREGION_END is the bitpos of the ending bitfield in this region. These two fields are 0, if the C++ memory model does not apply, or we are not interested in keeping track of bitfield regions. Always return const0_rtx unless we have something particular to return. ALIAS_SET is the alias set for the destination. This value will (in general) be different from that for TARGET, since TARGET is a reference to the containing structure. If NONTEMPORAL is true, try generating a nontemporal store.
References BLOCK_OP_NORMAL, compare_tree_int(), convert_modes(), copy_blkmode_from_reg(), copy_rtx(), emit_block_move(), emit_group_store(), expand_expr(), EXPAND_NORMAL, expand_normal(), expand_shift(), extract_bit_field(), gen_reg_rtx(), get_def_for_expr(), gimple_assign_rhs1(), HOST_WIDE_INT, int_size_in_bytes(), set_mem_alias_set(), smallest_mode_for_size(), store_bit_field(), and store_expr().
Referenced by expand_assignment(), expand_expr_real_2(), and store_constructor_field().
tree string_constant | ( | ) |
Return the tree node if an ARG corresponds to a string constant or zero if it doesn't. If we return nonzero, set *PTR_OFFSET to the offset in bytes within the string that ARG is accessing. The type of the offset will be `sizetype'.
References array_ref_low_bound(), compare_tree_int(), ctor_for_folding(), host_integerp(), integer_zerop(), and offset.
Referenced by c_getstr(), c_strlen(), fold_builtin_printf(), fold_read_from_constant_string(), get_stridx(), and simplify_builtin_call().
|
static |
Alignment in bits the TARGET of an assignment may be assumed to have.
References HOST_WIDE_INT.
Referenced by highest_pow2_factor_for_target().
int try_casesi | ( | tree | index_type, |
tree | index_expr, | ||
tree | minval, | ||
tree | range, | ||
rtx | table_label, | ||
rtx | default_label, | ||
rtx | fallback_label, | ||
int | default_probability | ||
) |
Attempt to generate a casesi instruction. Returns 1 if successful, 0 otherwise (i.e. if there is no casesi instruction). DEFAULT_PROBABILITY is the probability of jumping to the default label.
References convert_to_mode(), create_convert_operand_from_type(), create_fixed_operand(), create_input_operand(), do_pending_stack_adjust(), emit_cmp_and_jump_insns(), expand_jump_insn(), expand_normal(), lang_hooks_for_types::type_for_mode, and lang_hooks::types.
Referenced by emit_case_dispatch_table().
int try_tablejump | ( | tree | index_type, |
tree | index_expr, | ||
tree | minval, | ||
tree | range, | ||
rtx | table_label, | ||
rtx | default_label, | ||
int | default_probability | ||
) |
References convert_modes(), do_pending_stack_adjust(), do_tablejump(), and expand_normal().
Referenced by emit_case_dispatch_table().
|
static |
Return true if word I of OP lies entirely in the undefined bits of a paradoxical subreg.
References offset, and word_mode.
Referenced by emit_move_multi_word().
void use_group_regs | ( | ) |
Add USE expressions to *CALL_FUSAGE for each REG contained in the PARALLEL REGS. This is for calls that pass values in multiple non-contiguous locations. The Irix 6 ABI has examples of this.
References use_reg().
Referenced by emit_library_call_value_1(), and load_register_parameters().
void use_reg_mode | ( | ) |
Add a USE expression for REG to the (possibly empty) list pointed to by CALL_FUSAGE. REG must denote a hard register.
Referenced by load_register_parameters(), and use_reg().
void use_regs | ( | ) |
Add USE expressions to *CALL_FUSAGE for each of NREGS consecutive regs, starting at REGNO. All of these registers must be hard registers.
References regno_reg_rtx, and use_reg().
Referenced by emit_library_call_value_1(), and load_register_parameters().
|
static |
Return the widest integer mode no wider than SIZE. If no such mode can be found, return VOIDmode.
Referenced by can_store_by_pieces(), move_by_pieces(), move_by_pieces_ninsns(), and store_by_pieces_1().
Referenced by clear_storage_hints(), emit_move_complex_parts(), expand_assignment(), and expand_expr_real_2().
|
static |
Write to one of the components of the complex value CPLX. Write VAL to the real part if IMAG_P is false, and the imaginary part if its true.
References emit_move_insn(), simplify_gen_subreg(), and store_bit_field().
tree block_clear_fn |
A subroutine of set_storage_via_libcall. Create the tree node for the function we use for block clears.
Referenced by clear_storage_libcall_fn(), and scan_insn().
|
static |
A subroutine of emit_block_move_via_libcall. Create the tree node for the function we use for block copies.
Referenced by emit_block_move_libcall_fn().
int cse_not_expected |
If this is nonzero, we do not bother generating VOLATILE around volatile memory references, and we are willing to output indirect addresses. If cse is to follow, we reject indirect addresses so a useful potential cse is generated; if it is used only once, instruction combination will produce the same indirect address eventually.
Referenced by get_address_cost(), memory_address_addr_space(), noce_try_cmove_arith(), prepare_function_start(), rest_of_handle_cse(), rest_of_handle_cse2(), rest_of_handle_cse_after_global_opts(), and use_anchored_address().