GCC Middle and Back End API Reference
expr.c File Reference

Data Structures

struct  move_by_pieces_d
struct  store_by_pieces_d

Functions

static void move_by_pieces_1 (insn_gen_fn, machine_mode, struct move_by_pieces_d *)
static bool block_move_libcall_safe_for_call_parm (void)
static bool emit_block_move_via_movmem (rtx, rtx, rtx, unsigned, unsigned, HOST_WIDE_INT)
static tree emit_block_move_libcall_fn (int)
static void emit_block_move_via_loop (rtx, rtx, rtx, unsigned)
static rtx clear_by_pieces_1 (void *, HOST_WIDE_INT, enum machine_mode)
static void clear_by_pieces (rtx, unsigned HOST_WIDE_INT, unsigned int)
static void store_by_pieces_1 (struct store_by_pieces_d *, unsigned int)
static void store_by_pieces_2 (insn_gen_fn, machine_mode, struct store_by_pieces_d *)
static tree clear_storage_libcall_fn (int)
static rtx compress_float_constant (rtx, rtx)
static rtx get_subtarget (rtx)
static void store_constructor_field (rtx, unsigned HOST_WIDE_INT, HOST_WIDE_INT, enum machine_mode, tree, int, alias_set_type)
static void store_constructor (tree, rtx, int, HOST_WIDE_INT)
static rtx store_field (rtx, HOST_WIDE_INT, HOST_WIDE_INT, unsigned HOST_WIDE_INT, unsigned HOST_WIDE_INT, enum machine_mode, tree, alias_set_type, bool)
static unsigned HOST_WIDE_INT highest_pow2_factor_for_target (const_tree, const_tree)
static int is_aligning_offset (const_tree, const_tree)
static void expand_operands (tree, tree, rtx, rtx *, rtx *, enum expand_modifier)
static rtx reduce_to_bit_field_precision (rtx, rtx, tree)
static rtx do_store_flag (sepops, rtx, enum machine_mode)
static void emit_single_push_insn (enum machine_mode, rtx, tree)
static void do_tablejump (rtx, enum machine_mode, rtx, rtx, rtx, int)
static rtx const_vector_from_tree (tree)
static void write_complex_part (rtx, rtx, bool)
void init_expr_target ()
void init_expr ()
void convert_move ()
rtx convert_to_mode ()
rtx convert_modes ()
static unsigned int alignment_for_piecewise_move ()
static enum machine_mode widest_int_mode_for_size ()
int can_move_by_pieces (unsigned HOST_WIDE_INT len, unsigned int align)
rtx move_by_pieces (rtx to, rtx from, unsigned HOST_WIDE_INT len, unsigned int align, int endp)
unsigned HOST_WIDE_INT move_by_pieces_ninsns (unsigned HOST_WIDE_INT l, unsigned int align, unsigned int max_size)
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)
rtx emit_block_move ()
static bool emit_block_move_via_movmem (rtx x, rtx y, rtx size, unsigned int align, unsigned int expected_align, HOST_WIDE_INT expected_size)
rtx emit_block_move_via_libcall ()
void init_block_move_fn ()
static tree emit_block_move_libcall_fn ()
static void emit_block_move_via_loop (rtx x, rtx y, rtx size, unsigned int align)
void move_block_to_reg ()
void move_block_from_reg ()
rtx gen_group_rtx ()
static void emit_group_load_1 ()
void emit_group_load ()
rtx emit_group_load_into_temps ()
void emit_group_move ()
rtx emit_group_move_into_temps ()
void emit_group_store ()
rtx maybe_emit_group_store ()
void copy_blkmode_from_reg ()
rtx copy_blkmode_to_reg ()
void use_reg_mode ()
void use_regs ()
void use_group_regs ()
static gimple get_def_for_expr ()
static gimple get_def_for_expr_class ()
int can_store_by_pieces (unsigned HOST_WIDE_INT len, rtx(*constfun)(void *, HOST_WIDE_INT, enum machine_mode), void *constfundata, unsigned int align, bool memsetp)
rtx store_by_pieces (rtx to, unsigned HOST_WIDE_INT len, rtx(*constfun)(void *, HOST_WIDE_INT, enum machine_mode), void *constfundata, unsigned int align, bool memsetp, int endp)
static void clear_by_pieces ()
rtx clear_storage_hints (rtx object, rtx size, enum block_op_methods method, unsigned int expected_align, HOST_WIDE_INT expected_size)
rtx clear_storage ()
rtx set_storage_via_libcall ()
void init_block_clear_fn ()
static tree clear_storage_libcall_fn ()
bool set_storage_via_setmem (rtx object, rtx size, rtx val, unsigned int align, unsigned int expected_align, HOST_WIDE_INT expected_size)
static void write_complex_part ()
static rtx read_complex_part ()
static rtx emit_move_change_mode (enum machine_mode new_mode, enum machine_mode old_mode, rtx x, bool force)
static rtx emit_move_via_integer ()
static rtx emit_move_resolve_push ()
rtx emit_move_complex_push ()
rtx emit_move_complex_parts ()
static rtx emit_move_complex ()
static rtx emit_move_ccmode ()
static bool undefined_operand_subword_p ()
static rtx emit_move_multi_word ()
rtx emit_move_insn_1 ()
rtx emit_move_insn ()
static rtx compress_float_constant ()
rtx push_block ()
static rtx mem_autoinc_base ()
HOST_WIDE_INT find_args_size_adjust ()
int fixup_args_size_notes ()
static void emit_single_push_insn_1 ()
static void emit_single_push_insn ()
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)
static rtx get_subtarget ()
static bool optimize_bitfield_assignment_op (unsigned HOST_WIDE_INT bitsize, unsigned HOST_WIDE_INT bitpos, unsigned HOST_WIDE_INT bitregion_start, unsigned HOST_WIDE_INT bitregion_end, enum machine_mode mode1, rtx str_rtx, tree to, tree src)
static void get_bit_range (unsigned HOST_WIDE_INT *bitstart, unsigned HOST_WIDE_INT *bitend, tree exp, HOST_WIDE_INT *bitpos, tree *offset)
static bool addr_expr_of_non_mem_decl_p_1 ()
static bool mem_ref_refers_to_non_mem_p ()
bool addr_expr_of_non_mem_decl_p ()
void expand_assignment ()
bool emit_storent_insn ()
rtx store_expr ()
static bool flexible_array_member_p ()
static HOST_WIDE_INT count_type_elements ()
static bool categorize_ctor_elements_1 (const_tree ctor, HOST_WIDE_INT *p_nz_elts, HOST_WIDE_INT *p_init_elts, bool *p_complete)
bool categorize_ctor_elements (const_tree ctor, HOST_WIDE_INT *p_nz_elts, HOST_WIDE_INT *p_init_elts, bool *p_complete)
bool complete_ctor_at_level_p (const_tree type, HOST_WIDE_INT num_elts, const_tree last_type)
static int mostly_zeros_p ()
static int all_zeros_p ()
static void store_constructor ()
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)
tree array_ref_element_size ()
tree array_ref_low_bound ()
bool array_at_struct_end_p ()
tree array_ref_up_bound ()
tree component_ref_field_offset ()
static unsigned HOST_WIDE_INT target_align ()
rtx force_operand ()
int safe_from_p ()
unsigned HOST_WIDE_INT highest_pow2_factor ()
static unsigned HOST_WIDE_INT highest_pow2_factor_for_target ()
static enum rtx_code convert_tree_comp_to_rtx ()
static rtx expand_expr_constant ()
static rtx expand_expr_addr_expr_1 (tree exp, rtx target, enum machine_mode tmode, enum expand_modifier modifier, addr_space_t as)
static rtx expand_expr_addr_expr (tree exp, rtx target, enum machine_mode tmode, enum expand_modifier modifier)
static rtx expand_constructor (tree exp, rtx target, enum expand_modifier modifier, bool avoid_temp_mem)
rtx expand_expr_real (tree exp, rtx target, enum machine_mode tmode, enum expand_modifier modifier, rtx *alt_rtl)
static rtx expand_cond_expr_using_cmove (tree treeop0, tree treeop1, tree treeop2)
rtx expand_expr_real_2 (sepops ops, rtx target, enum machine_mode tmode, enum expand_modifier modifier)
rtx expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode, enum expand_modifier modifier, rtx *alt_rtl)
static rtx reduce_to_bit_field_precision ()
static int is_aligning_offset ()
tree string_constant ()
static rtx do_store_flag ()
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)
int try_tablejump (tree index_type, tree index_expr, tree minval, tree range, rtx table_label, rtx default_label, int default_probability)
static rtx const_vector_from_tree ()
tree build_personality_function ()
rtx get_personality_function ()

Variables

int cse_not_expected
static tree block_move_fn
tree block_clear_fn

Function Documentation

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().

static bool addr_expr_of_non_mem_decl_p_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 unsigned int alignment_for_piecewise_move ( )
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 int all_zeros_p ( )
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_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 bool block_move_libcall_safe_for_call_parm ( )
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 bool categorize_ctor_elements_1 ( const_tree  ctor,
HOST_WIDE_INT p_nz_elts,
HOST_WIDE_INT p_init_elts,
bool *  p_complete 
)
static
static void clear_by_pieces ( rtx  ,
unsigned  HOST_WIDE_INT,
unsigned  int 
)
static

Referenced by clear_storage_hints().

static void clear_by_pieces ( )
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 rtx clear_by_pieces_1 ( void *  data,
HOST_WIDE_INT  offset,
enum machine_mode  mode 
)
static
Callback routine for clear_by_pieces.
   Return const0_rtx unconditionally.   

Referenced by clear_by_pieces().

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 tree clear_storage_libcall_fn ( int  )
static

Referenced by set_storage_via_libcall().

static tree clear_storage_libcall_fn ( )
static
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 ( )
static rtx compress_float_constant ( rtx  ,
rtx   
)
static

Referenced by emit_move_insn().

static rtx compress_float_constant ( )
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().

static rtx const_vector_from_tree ( tree  )
static

Referenced by expand_expr_real_1().

static rtx const_vector_from_tree ( )
static
static enum rtx_code convert_tree_comp_to_rtx ( )
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 HOST_WIDE_INT count_type_elements ( )
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().

static rtx do_store_flag ( sepops  ,
rtx  ,
enum  machine_mode 
)
static

Referenced by expand_expr_real_2().

static rtx do_store_flag ( )
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 void do_tablejump ( rtx  index,
enum machine_mode  mode,
rtx  range,
rtx  table_label,
rtx  default_label,
int  default_probability 
)
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_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 tree emit_block_move_libcall_fn ( int  )
static
static tree emit_block_move_libcall_fn ( )
static
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().

static void emit_block_move_via_loop ( rtx  ,
rtx  ,
rtx  ,
unsigned   
)
static

Referenced by emit_block_move_hints().

static void emit_block_move_via_loop ( rtx  x,
rtx  y,
rtx  size,
unsigned int  align 
)
static
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 bool emit_block_move_via_movmem ( rtx  ,
rtx  ,
rtx  ,
unsigned  ,
unsigned  ,
HOST_WIDE_INT   
)
static

Referenced by emit_block_move_hints().

static bool emit_block_move_via_movmem ( rtx  x,
rtx  y,
rtx  size,
unsigned int  align,
unsigned int  expected_align,
HOST_WIDE_INT  expected_size 
)
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 void emit_group_load_1 ( )
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 rtx emit_move_ccmode ( )
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 rtx emit_move_change_mode ( enum machine_mode  new_mode,
enum machine_mode  old_mode,
rtx  x,
bool  force 
)
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 rtx emit_move_complex ( )
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 rtx emit_move_multi_word ( )
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 rtx emit_move_resolve_push ( )
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 rtx emit_move_via_integer ( )
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().

static void emit_single_push_insn ( enum  machine_mode,
rtx  ,
tree   
)
static

Referenced by emit_push_insn(), and move_by_pieces_1().

static void emit_single_push_insn ( )
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.

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().

static rtx expand_cond_expr_using_cmove ( tree  treeop0,
tree  treeop1,
tree  treeop2 
)
static
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 rtx expand_constructor ( tree  exp,
rtx  target,
enum expand_modifier  modifier,
bool  avoid_temp_mem 
)
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 rtx expand_expr_addr_expr ( tree  exp,
rtx  target,
enum machine_mode  tmode,
enum expand_modifier  modifier 
)
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 rtx expand_expr_addr_expr_1 ( tree  exp,
rtx  target,
enum machine_mode  tmode,
enum expand_modifier  modifier,
addr_space_t  as 
)
static
static rtx expand_expr_constant ( )
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 void expand_operands ( tree  exp0,
tree  exp1,
rtx  target,
rtx op0,
rtx op1,
enum expand_modifier  modifier 
)
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().

static bool flexible_array_member_p ( )
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 void get_bit_range ( unsigned HOST_WIDE_INT bitstart,
unsigned HOST_WIDE_INT bitend,
tree  exp,
HOST_WIDE_INT bitpos,
tree offset 
)
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 gimple get_def_for_expr ( )
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 gimple get_def_for_expr_class ( )
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 ( )
static rtx get_subtarget ( rtx  )
static
static rtx get_subtarget ( )
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 unsigned HOST_WIDE_INT highest_pow2_factor_for_target ( const_tree  ,
const_tree   
)
static

Referenced by expand_assignment().

static unsigned HOST_WIDE_INT highest_pow2_factor_for_target ( )
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_expr ( void  )
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 int is_aligning_offset ( const_tree  ,
const_tree   
)
static

Referenced by expand_expr_real_1().

static int is_aligning_offset ( )
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 rtx mem_autoinc_base ( )
static
A utility routine that returns the base of an auto-inc memory, or NULL.   

References RTX_AUTOINC.

Referenced by find_args_size_adjust().

static bool mem_ref_refers_to_non_mem_p ( )
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 int mostly_zeros_p ( )
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 void move_by_pieces_1 ( insn_gen_fn  genfun,
machine_mode  mode,
struct move_by_pieces_d data 
)
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 bool optimize_bitfield_assignment_op ( unsigned HOST_WIDE_INT  bitsize,
unsigned HOST_WIDE_INT  bitpos,
unsigned HOST_WIDE_INT  bitregion_start,
unsigned HOST_WIDE_INT  bitregion_end,
enum machine_mode  mode1,
rtx  str_rtx,
tree  to,
tree  src 
)
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 rtx read_complex_part ( )
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 rtx reduce_to_bit_field_precision ( rtx  ,
rtx  ,
tree   
)
static
static rtx reduce_to_bit_field_precision ( )
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 
)
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 void store_by_pieces_1 ( struct store_by_pieces_d data,
unsigned int  align 
)
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 void store_by_pieces_2 ( insn_gen_fn  genfun,
machine_mode  mode,
struct store_by_pieces_d data 
)
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 void store_constructor ( tree  ,
rtx  ,
int  ,
HOST_WIDE_INT   
)
static
static void store_constructor ( )
static
static void store_constructor_field ( rtx  target,
unsigned HOST_WIDE_INT  bitsize,
HOST_WIDE_INT  bitpos,
enum machine_mode  mode,
tree  exp,
int  cleared,
alias_set_type  alias_set 
)
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 rtx store_field ( rtx  target,
HOST_WIDE_INT  bitsize,
HOST_WIDE_INT  bitpos,
unsigned HOST_WIDE_INT  bitregion_start,
unsigned HOST_WIDE_INT  bitregion_end,
enum machine_mode  mode,
tree  exp,
alias_set_type  alias_set,
bool  nontemporal 
)
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 unsigned HOST_WIDE_INT target_align ( )
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 
)
static bool undefined_operand_subword_p ( )
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 enum machine_mode widest_int_mode_for_size ( )
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().

static void write_complex_part ( rtx  ,
rtx  ,
bool   
)
static
static void write_complex_part ( )
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().


Variable Documentation

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().

tree block_move_fn
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().