OSDN Git Service

* config/sparc/sol2-gld.h: Remove SPARC reference.
[pf3gnuchains/gcc-fork.git] / gcc / expr.c
1 /* Convert tree expression to rtl instructions, for GNU compiler.
2    Copyright (C) 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3    2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
4    Free Software Foundation, Inc.
5
6 This file is part of GCC.
7
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
11 version.
12
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16 for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3.  If not see
20 <http://www.gnu.org/licenses/>.  */
21
22 #include "config.h"
23 #include "system.h"
24 #include "coretypes.h"
25 #include "tm.h"
26 #include "machmode.h"
27 #include "real.h"
28 #include "rtl.h"
29 #include "tree.h"
30 #include "flags.h"
31 #include "regs.h"
32 #include "hard-reg-set.h"
33 #include "except.h"
34 #include "function.h"
35 #include "insn-config.h"
36 #include "insn-attr.h"
37 /* Include expr.h after insn-config.h so we get HAVE_conditional_move.  */
38 #include "expr.h"
39 #include "optabs.h"
40 #include "libfuncs.h"
41 #include "recog.h"
42 #include "reload.h"
43 #include "output.h"
44 #include "typeclass.h"
45 #include "toplev.h"
46 #include "ggc.h"
47 #include "langhooks.h"
48 #include "intl.h"
49 #include "tm_p.h"
50 #include "tree-iterator.h"
51 #include "tree-pass.h"
52 #include "tree-flow.h"
53 #include "target.h"
54 #include "timevar.h"
55 #include "df.h"
56 #include "diagnostic.h"
57 #include "ssaexpand.h"
58
59 /* Decide whether a function's arguments should be processed
60    from first to last or from last to first.
61
62    They should if the stack and args grow in opposite directions, but
63    only if we have push insns.  */
64
65 #ifdef PUSH_ROUNDING
66
67 #ifndef PUSH_ARGS_REVERSED
68 #if defined (STACK_GROWS_DOWNWARD) != defined (ARGS_GROW_DOWNWARD)
69 #define PUSH_ARGS_REVERSED      /* If it's last to first.  */
70 #endif
71 #endif
72
73 #endif
74
75 #ifndef STACK_PUSH_CODE
76 #ifdef STACK_GROWS_DOWNWARD
77 #define STACK_PUSH_CODE PRE_DEC
78 #else
79 #define STACK_PUSH_CODE PRE_INC
80 #endif
81 #endif
82
83
84 /* If this is nonzero, we do not bother generating VOLATILE
85    around volatile memory references, and we are willing to
86    output indirect addresses.  If cse is to follow, we reject
87    indirect addresses so a useful potential cse is generated;
88    if it is used only once, instruction combination will produce
89    the same indirect address eventually.  */
90 int cse_not_expected;
91
92 /* This structure is used by move_by_pieces to describe the move to
93    be performed.  */
94 struct move_by_pieces_d
95 {
96   rtx to;
97   rtx to_addr;
98   int autinc_to;
99   int explicit_inc_to;
100   rtx from;
101   rtx from_addr;
102   int autinc_from;
103   int explicit_inc_from;
104   unsigned HOST_WIDE_INT len;
105   HOST_WIDE_INT offset;
106   int reverse;
107 };
108
109 /* This structure is used by store_by_pieces to describe the clear to
110    be performed.  */
111
112 struct store_by_pieces_d
113 {
114   rtx to;
115   rtx to_addr;
116   int autinc_to;
117   int explicit_inc_to;
118   unsigned HOST_WIDE_INT len;
119   HOST_WIDE_INT offset;
120   rtx (*constfun) (void *, HOST_WIDE_INT, enum machine_mode);
121   void *constfundata;
122   int reverse;
123 };
124
125 static unsigned HOST_WIDE_INT move_by_pieces_ninsns (unsigned HOST_WIDE_INT,
126                                                      unsigned int,
127                                                      unsigned int);
128 static void move_by_pieces_1 (rtx (*) (rtx, ...), enum machine_mode,
129                               struct move_by_pieces_d *);
130 static bool block_move_libcall_safe_for_call_parm (void);
131 static bool emit_block_move_via_movmem (rtx, rtx, rtx, unsigned, unsigned, HOST_WIDE_INT);
132 static tree emit_block_move_libcall_fn (int);
133 static void emit_block_move_via_loop (rtx, rtx, rtx, unsigned);
134 static rtx clear_by_pieces_1 (void *, HOST_WIDE_INT, enum machine_mode);
135 static void clear_by_pieces (rtx, unsigned HOST_WIDE_INT, unsigned int);
136 static void store_by_pieces_1 (struct store_by_pieces_d *, unsigned int);
137 static void store_by_pieces_2 (rtx (*) (rtx, ...), enum machine_mode,
138                                struct store_by_pieces_d *);
139 static tree clear_storage_libcall_fn (int);
140 static rtx compress_float_constant (rtx, rtx);
141 static rtx get_subtarget (rtx);
142 static void store_constructor_field (rtx, unsigned HOST_WIDE_INT,
143                                      HOST_WIDE_INT, enum machine_mode,
144                                      tree, tree, int, alias_set_type);
145 static void store_constructor (tree, rtx, int, HOST_WIDE_INT);
146 static rtx store_field (rtx, HOST_WIDE_INT, HOST_WIDE_INT, enum machine_mode,
147                         tree, tree, alias_set_type, bool);
148
149 static unsigned HOST_WIDE_INT highest_pow2_factor_for_target (const_tree, const_tree);
150
151 static int is_aligning_offset (const_tree, const_tree);
152 static void expand_operands (tree, tree, rtx, rtx*, rtx*,
153                              enum expand_modifier);
154 static rtx reduce_to_bit_field_precision (rtx, rtx, tree);
155 static rtx do_store_flag (sepops, rtx, enum machine_mode);
156 #ifdef PUSH_ROUNDING
157 static void emit_single_push_insn (enum machine_mode, rtx, tree);
158 #endif
159 static void do_tablejump (rtx, enum machine_mode, rtx, rtx, rtx);
160 static rtx const_vector_from_tree (tree);
161 static void write_complex_part (rtx, rtx, bool);
162
163 /* Record for each mode whether we can move a register directly to or
164    from an object of that mode in memory.  If we can't, we won't try
165    to use that mode directly when accessing a field of that mode.  */
166
167 static char direct_load[NUM_MACHINE_MODES];
168 static char direct_store[NUM_MACHINE_MODES];
169
170 /* Record for each mode whether we can float-extend from memory.  */
171
172 static bool float_extend_from_mem[NUM_MACHINE_MODES][NUM_MACHINE_MODES];
173
174 /* This macro is used to determine whether move_by_pieces should be called
175    to perform a structure copy.  */
176 #ifndef MOVE_BY_PIECES_P
177 #define MOVE_BY_PIECES_P(SIZE, ALIGN) \
178   (move_by_pieces_ninsns (SIZE, ALIGN, MOVE_MAX_PIECES + 1) \
179    < (unsigned int) MOVE_RATIO (optimize_insn_for_speed_p ()))
180 #endif
181
182 /* This macro is used to determine whether clear_by_pieces should be
183    called to clear storage.  */
184 #ifndef CLEAR_BY_PIECES_P
185 #define CLEAR_BY_PIECES_P(SIZE, ALIGN) \
186   (move_by_pieces_ninsns (SIZE, ALIGN, STORE_MAX_PIECES + 1) \
187    < (unsigned int) CLEAR_RATIO (optimize_insn_for_speed_p ()))
188 #endif
189
190 /* This macro is used to determine whether store_by_pieces should be
191    called to "memset" storage with byte values other than zero.  */
192 #ifndef SET_BY_PIECES_P
193 #define SET_BY_PIECES_P(SIZE, ALIGN) \
194   (move_by_pieces_ninsns (SIZE, ALIGN, STORE_MAX_PIECES + 1) \
195    < (unsigned int) SET_RATIO (optimize_insn_for_speed_p ()))
196 #endif
197
198 /* This macro is used to determine whether store_by_pieces should be
199    called to "memcpy" storage when the source is a constant string.  */
200 #ifndef STORE_BY_PIECES_P
201 #define STORE_BY_PIECES_P(SIZE, ALIGN) \
202   (move_by_pieces_ninsns (SIZE, ALIGN, STORE_MAX_PIECES + 1) \
203    < (unsigned int) MOVE_RATIO (optimize_insn_for_speed_p ()))
204 #endif
205
206 /* This array records the insn_code of insns to perform block moves.  */
207 enum insn_code movmem_optab[NUM_MACHINE_MODES];
208
209 /* This array records the insn_code of insns to perform block sets.  */
210 enum insn_code setmem_optab[NUM_MACHINE_MODES];
211
212 /* These arrays record the insn_code of three different kinds of insns
213    to perform block compares.  */
214 enum insn_code cmpstr_optab[NUM_MACHINE_MODES];
215 enum insn_code cmpstrn_optab[NUM_MACHINE_MODES];
216 enum insn_code cmpmem_optab[NUM_MACHINE_MODES];
217
218 /* Synchronization primitives.  */
219 enum insn_code sync_add_optab[NUM_MACHINE_MODES];
220 enum insn_code sync_sub_optab[NUM_MACHINE_MODES];
221 enum insn_code sync_ior_optab[NUM_MACHINE_MODES];
222 enum insn_code sync_and_optab[NUM_MACHINE_MODES];
223 enum insn_code sync_xor_optab[NUM_MACHINE_MODES];
224 enum insn_code sync_nand_optab[NUM_MACHINE_MODES];
225 enum insn_code sync_old_add_optab[NUM_MACHINE_MODES];
226 enum insn_code sync_old_sub_optab[NUM_MACHINE_MODES];
227 enum insn_code sync_old_ior_optab[NUM_MACHINE_MODES];
228 enum insn_code sync_old_and_optab[NUM_MACHINE_MODES];
229 enum insn_code sync_old_xor_optab[NUM_MACHINE_MODES];
230 enum insn_code sync_old_nand_optab[NUM_MACHINE_MODES];
231 enum insn_code sync_new_add_optab[NUM_MACHINE_MODES];
232 enum insn_code sync_new_sub_optab[NUM_MACHINE_MODES];
233 enum insn_code sync_new_ior_optab[NUM_MACHINE_MODES];
234 enum insn_code sync_new_and_optab[NUM_MACHINE_MODES];
235 enum insn_code sync_new_xor_optab[NUM_MACHINE_MODES];
236 enum insn_code sync_new_nand_optab[NUM_MACHINE_MODES];
237 enum insn_code sync_compare_and_swap[NUM_MACHINE_MODES];
238 enum insn_code sync_lock_test_and_set[NUM_MACHINE_MODES];
239 enum insn_code sync_lock_release[NUM_MACHINE_MODES];
240
241 /* SLOW_UNALIGNED_ACCESS is nonzero if unaligned accesses are very slow.  */
242
243 #ifndef SLOW_UNALIGNED_ACCESS
244 #define SLOW_UNALIGNED_ACCESS(MODE, ALIGN) STRICT_ALIGNMENT
245 #endif
246 \f
247 /* This is run to set up which modes can be used
248    directly in memory and to initialize the block move optab.  It is run
249    at the beginning of compilation and when the target is reinitialized.  */
250
251 void
252 init_expr_target (void)
253 {
254   rtx insn, pat;
255   enum machine_mode mode;
256   int num_clobbers;
257   rtx mem, mem1;
258   rtx reg;
259
260   /* Try indexing by frame ptr and try by stack ptr.
261      It is known that on the Convex the stack ptr isn't a valid index.
262      With luck, one or the other is valid on any machine.  */
263   mem = gen_rtx_MEM (VOIDmode, stack_pointer_rtx);
264   mem1 = gen_rtx_MEM (VOIDmode, frame_pointer_rtx);
265
266   /* A scratch register we can modify in-place below to avoid
267      useless RTL allocations.  */
268   reg = gen_rtx_REG (VOIDmode, -1);
269
270   insn = rtx_alloc (INSN);
271   pat = gen_rtx_SET (VOIDmode, NULL_RTX, NULL_RTX);
272   PATTERN (insn) = pat;
273
274   for (mode = VOIDmode; (int) mode < NUM_MACHINE_MODES;
275        mode = (enum machine_mode) ((int) mode + 1))
276     {
277       int regno;
278
279       direct_load[(int) mode] = direct_store[(int) mode] = 0;
280       PUT_MODE (mem, mode);
281       PUT_MODE (mem1, mode);
282       PUT_MODE (reg, mode);
283
284       /* See if there is some register that can be used in this mode and
285          directly loaded or stored from memory.  */
286
287       if (mode != VOIDmode && mode != BLKmode)
288         for (regno = 0; regno < FIRST_PSEUDO_REGISTER
289              && (direct_load[(int) mode] == 0 || direct_store[(int) mode] == 0);
290              regno++)
291           {
292             if (! HARD_REGNO_MODE_OK (regno, mode))
293               continue;
294
295             SET_REGNO (reg, regno);
296
297             SET_SRC (pat) = mem;
298             SET_DEST (pat) = reg;
299             if (recog (pat, insn, &num_clobbers) >= 0)
300               direct_load[(int) mode] = 1;
301
302             SET_SRC (pat) = mem1;
303             SET_DEST (pat) = reg;
304             if (recog (pat, insn, &num_clobbers) >= 0)
305               direct_load[(int) mode] = 1;
306
307             SET_SRC (pat) = reg;
308             SET_DEST (pat) = mem;
309             if (recog (pat, insn, &num_clobbers) >= 0)
310               direct_store[(int) mode] = 1;
311
312             SET_SRC (pat) = reg;
313             SET_DEST (pat) = mem1;
314             if (recog (pat, insn, &num_clobbers) >= 0)
315               direct_store[(int) mode] = 1;
316           }
317     }
318
319   mem = gen_rtx_MEM (VOIDmode, gen_rtx_raw_REG (Pmode, 10000));
320
321   for (mode = GET_CLASS_NARROWEST_MODE (MODE_FLOAT); mode != VOIDmode;
322        mode = GET_MODE_WIDER_MODE (mode))
323     {
324       enum machine_mode srcmode;
325       for (srcmode = GET_CLASS_NARROWEST_MODE (MODE_FLOAT); srcmode != mode;
326            srcmode = GET_MODE_WIDER_MODE (srcmode))
327         {
328           enum insn_code ic;
329
330           ic = can_extend_p (mode, srcmode, 0);
331           if (ic == CODE_FOR_nothing)
332             continue;
333
334           PUT_MODE (mem, srcmode);
335
336           if ((*insn_data[ic].operand[1].predicate) (mem, srcmode))
337             float_extend_from_mem[mode][srcmode] = true;
338         }
339     }
340 }
341
342 /* This is run at the start of compiling a function.  */
343
344 void
345 init_expr (void)
346 {
347   memset (&crtl->expr, 0, sizeof (crtl->expr));
348 }
349 \f
350 /* Copy data from FROM to TO, where the machine modes are not the same.
351    Both modes may be integer, or both may be floating, or both may be
352    fixed-point.
353    UNSIGNEDP should be nonzero if FROM is an unsigned type.
354    This causes zero-extension instead of sign-extension.  */
355
356 void
357 convert_move (rtx to, rtx from, int unsignedp)
358 {
359   enum machine_mode to_mode = GET_MODE (to);
360   enum machine_mode from_mode = GET_MODE (from);
361   int to_real = SCALAR_FLOAT_MODE_P (to_mode);
362   int from_real = SCALAR_FLOAT_MODE_P (from_mode);
363   enum insn_code code;
364   rtx libcall;
365
366   /* rtx code for making an equivalent value.  */
367   enum rtx_code equiv_code = (unsignedp < 0 ? UNKNOWN
368                               : (unsignedp ? ZERO_EXTEND : SIGN_EXTEND));
369
370
371   gcc_assert (to_real == from_real);
372   gcc_assert (to_mode != BLKmode);
373   gcc_assert (from_mode != BLKmode);
374
375   /* If the source and destination are already the same, then there's
376      nothing to do.  */
377   if (to == from)
378     return;
379
380   /* If FROM is a SUBREG that indicates that we have already done at least
381      the required extension, strip it.  We don't handle such SUBREGs as
382      TO here.  */
383
384   if (GET_CODE (from) == SUBREG && SUBREG_PROMOTED_VAR_P (from)
385       && (GET_MODE_SIZE (GET_MODE (SUBREG_REG (from)))
386           >= GET_MODE_SIZE (to_mode))
387       && SUBREG_PROMOTED_UNSIGNED_P (from) == unsignedp)
388     from = gen_lowpart (to_mode, from), from_mode = to_mode;
389
390   gcc_assert (GET_CODE (to) != SUBREG || !SUBREG_PROMOTED_VAR_P (to));
391
392   if (to_mode == from_mode
393       || (from_mode == VOIDmode && CONSTANT_P (from)))
394     {
395       emit_move_insn (to, from);
396       return;
397     }
398
399   if (VECTOR_MODE_P (to_mode) || VECTOR_MODE_P (from_mode))
400     {
401       gcc_assert (GET_MODE_BITSIZE (from_mode) == GET_MODE_BITSIZE (to_mode));
402
403       if (VECTOR_MODE_P (to_mode))
404         from = simplify_gen_subreg (to_mode, from, GET_MODE (from), 0);
405       else
406         to = simplify_gen_subreg (from_mode, to, GET_MODE (to), 0);
407
408       emit_move_insn (to, from);
409       return;
410     }
411
412   if (GET_CODE (to) == CONCAT && GET_CODE (from) == CONCAT)
413     {
414       convert_move (XEXP (to, 0), XEXP (from, 0), unsignedp);
415       convert_move (XEXP (to, 1), XEXP (from, 1), unsignedp);
416       return;
417     }
418
419   if (to_real)
420     {
421       rtx value, insns;
422       convert_optab tab;
423
424       gcc_assert ((GET_MODE_PRECISION (from_mode)
425                    != GET_MODE_PRECISION (to_mode))
426                   || (DECIMAL_FLOAT_MODE_P (from_mode)
427                       != DECIMAL_FLOAT_MODE_P (to_mode)));
428
429       if (GET_MODE_PRECISION (from_mode) == GET_MODE_PRECISION (to_mode))
430         /* Conversion between decimal float and binary float, same size.  */
431         tab = DECIMAL_FLOAT_MODE_P (from_mode) ? trunc_optab : sext_optab;
432       else if (GET_MODE_PRECISION (from_mode) < GET_MODE_PRECISION (to_mode))
433         tab = sext_optab;
434       else
435         tab = trunc_optab;
436
437       /* Try converting directly if the insn is supported.  */
438
439       code = convert_optab_handler (tab, to_mode, from_mode)->insn_code;
440       if (code != CODE_FOR_nothing)
441         {
442           emit_unop_insn (code, to, from,
443                           tab == sext_optab ? FLOAT_EXTEND : FLOAT_TRUNCATE);
444           return;
445         }
446
447       /* Otherwise use a libcall.  */
448       libcall = convert_optab_libfunc (tab, to_mode, from_mode);
449
450       /* Is this conversion implemented yet?  */
451       gcc_assert (libcall);
452
453       start_sequence ();
454       value = emit_library_call_value (libcall, NULL_RTX, LCT_CONST, to_mode,
455                                        1, from, from_mode);
456       insns = get_insns ();
457       end_sequence ();
458       emit_libcall_block (insns, to, value,
459                           tab == trunc_optab ? gen_rtx_FLOAT_TRUNCATE (to_mode,
460                                                                        from)
461                           : gen_rtx_FLOAT_EXTEND (to_mode, from));
462       return;
463     }
464
465   /* Handle pointer conversion.  */                     /* SPEE 900220.  */
466   /* Targets are expected to provide conversion insns between PxImode and
467      xImode for all MODE_PARTIAL_INT modes they use, but no others.  */
468   if (GET_MODE_CLASS (to_mode) == MODE_PARTIAL_INT)
469     {
470       enum machine_mode full_mode
471         = smallest_mode_for_size (GET_MODE_BITSIZE (to_mode), MODE_INT);
472
473       gcc_assert (convert_optab_handler (trunc_optab, to_mode, full_mode)->insn_code
474                   != CODE_FOR_nothing);
475
476       if (full_mode != from_mode)
477         from = convert_to_mode (full_mode, from, unsignedp);
478       emit_unop_insn (convert_optab_handler (trunc_optab, to_mode, full_mode)->insn_code,
479                       to, from, UNKNOWN);
480       return;
481     }
482   if (GET_MODE_CLASS (from_mode) == MODE_PARTIAL_INT)
483     {
484       rtx new_from;
485       enum machine_mode full_mode
486         = smallest_mode_for_size (GET_MODE_BITSIZE (from_mode), MODE_INT);
487
488       gcc_assert (convert_optab_handler (sext_optab, full_mode, from_mode)->insn_code
489                   != CODE_FOR_nothing);
490
491       if (to_mode == full_mode)
492         {
493           emit_unop_insn (convert_optab_handler (sext_optab, full_mode, from_mode)->insn_code,
494                           to, from, UNKNOWN);
495           return;
496         }
497
498       new_from = gen_reg_rtx (full_mode);
499       emit_unop_insn (convert_optab_handler (sext_optab, full_mode, from_mode)->insn_code,
500                       new_from, from, UNKNOWN);
501
502       /* else proceed to integer conversions below.  */
503       from_mode = full_mode;
504       from = new_from;
505     }
506
507    /* Make sure both are fixed-point modes or both are not.  */
508    gcc_assert (ALL_SCALAR_FIXED_POINT_MODE_P (from_mode) ==
509                ALL_SCALAR_FIXED_POINT_MODE_P (to_mode));
510    if (ALL_SCALAR_FIXED_POINT_MODE_P (from_mode))
511     {
512       /* If we widen from_mode to to_mode and they are in the same class,
513          we won't saturate the result.
514          Otherwise, always saturate the result to play safe.  */
515       if (GET_MODE_CLASS (from_mode) == GET_MODE_CLASS (to_mode)
516           && GET_MODE_SIZE (from_mode) < GET_MODE_SIZE (to_mode))
517         expand_fixed_convert (to, from, 0, 0);
518       else
519         expand_fixed_convert (to, from, 0, 1);
520       return;
521     }
522
523   /* Now both modes are integers.  */
524
525   /* Handle expanding beyond a word.  */
526   if (GET_MODE_BITSIZE (from_mode) < GET_MODE_BITSIZE (to_mode)
527       && GET_MODE_BITSIZE (to_mode) > BITS_PER_WORD)
528     {
529       rtx insns;
530       rtx lowpart;
531       rtx fill_value;
532       rtx lowfrom;
533       int i;
534       enum machine_mode lowpart_mode;
535       int nwords = CEIL (GET_MODE_SIZE (to_mode), UNITS_PER_WORD);
536
537       /* Try converting directly if the insn is supported.  */
538       if ((code = can_extend_p (to_mode, from_mode, unsignedp))
539           != CODE_FOR_nothing)
540         {
541           /* If FROM is a SUBREG, put it into a register.  Do this
542              so that we always generate the same set of insns for
543              better cse'ing; if an intermediate assignment occurred,
544              we won't be doing the operation directly on the SUBREG.  */
545           if (optimize > 0 && GET_CODE (from) == SUBREG)
546             from = force_reg (from_mode, from);
547           emit_unop_insn (code, to, from, equiv_code);
548           return;
549         }
550       /* Next, try converting via full word.  */
551       else if (GET_MODE_BITSIZE (from_mode) < BITS_PER_WORD
552                && ((code = can_extend_p (to_mode, word_mode, unsignedp))
553                    != CODE_FOR_nothing))
554         {
555           rtx word_to = gen_reg_rtx (word_mode);
556           if (REG_P (to))
557             {
558               if (reg_overlap_mentioned_p (to, from))
559                 from = force_reg (from_mode, from);
560               emit_clobber (to);
561             }
562           convert_move (word_to, from, unsignedp);
563           emit_unop_insn (code, to, word_to, equiv_code);
564           return;
565         }
566
567       /* No special multiword conversion insn; do it by hand.  */
568       start_sequence ();
569
570       /* Since we will turn this into a no conflict block, we must ensure
571          that the source does not overlap the target.  */
572
573       if (reg_overlap_mentioned_p (to, from))
574         from = force_reg (from_mode, from);
575
576       /* Get a copy of FROM widened to a word, if necessary.  */
577       if (GET_MODE_BITSIZE (from_mode) < BITS_PER_WORD)
578         lowpart_mode = word_mode;
579       else
580         lowpart_mode = from_mode;
581
582       lowfrom = convert_to_mode (lowpart_mode, from, unsignedp);
583
584       lowpart = gen_lowpart (lowpart_mode, to);
585       emit_move_insn (lowpart, lowfrom);
586
587       /* Compute the value to put in each remaining word.  */
588       if (unsignedp)
589         fill_value = const0_rtx;
590       else
591         fill_value = emit_store_flag (gen_reg_rtx (word_mode),
592                                       LT, lowfrom, const0_rtx,
593                                       VOIDmode, 0, -1);
594
595       /* Fill the remaining words.  */
596       for (i = GET_MODE_SIZE (lowpart_mode) / UNITS_PER_WORD; i < nwords; i++)
597         {
598           int index = (WORDS_BIG_ENDIAN ? nwords - i - 1 : i);
599           rtx subword = operand_subword (to, index, 1, to_mode);
600
601           gcc_assert (subword);
602
603           if (fill_value != subword)
604             emit_move_insn (subword, fill_value);
605         }
606
607       insns = get_insns ();
608       end_sequence ();
609
610       emit_insn (insns);
611       return;
612     }
613
614   /* Truncating multi-word to a word or less.  */
615   if (GET_MODE_BITSIZE (from_mode) > BITS_PER_WORD
616       && GET_MODE_BITSIZE (to_mode) <= BITS_PER_WORD)
617     {
618       if (!((MEM_P (from)
619              && ! MEM_VOLATILE_P (from)
620              && direct_load[(int) to_mode]
621              && ! mode_dependent_address_p (XEXP (from, 0)))
622             || REG_P (from)
623             || GET_CODE (from) == SUBREG))
624         from = force_reg (from_mode, from);
625       convert_move (to, gen_lowpart (word_mode, from), 0);
626       return;
627     }
628
629   /* Now follow all the conversions between integers
630      no more than a word long.  */
631
632   /* For truncation, usually we can just refer to FROM in a narrower mode.  */
633   if (GET_MODE_BITSIZE (to_mode) < GET_MODE_BITSIZE (from_mode)
634       && TRULY_NOOP_TRUNCATION (GET_MODE_BITSIZE (to_mode),
635                                 GET_MODE_BITSIZE (from_mode)))
636     {
637       if (!((MEM_P (from)
638              && ! MEM_VOLATILE_P (from)
639              && direct_load[(int) to_mode]
640              && ! mode_dependent_address_p (XEXP (from, 0)))
641             || REG_P (from)
642             || GET_CODE (from) == SUBREG))
643         from = force_reg (from_mode, from);
644       if (REG_P (from) && REGNO (from) < FIRST_PSEUDO_REGISTER
645           && ! HARD_REGNO_MODE_OK (REGNO (from), to_mode))
646         from = copy_to_reg (from);
647       emit_move_insn (to, gen_lowpart (to_mode, from));
648       return;
649     }
650
651   /* Handle extension.  */
652   if (GET_MODE_BITSIZE (to_mode) > GET_MODE_BITSIZE (from_mode))
653     {
654       /* Convert directly if that works.  */
655       if ((code = can_extend_p (to_mode, from_mode, unsignedp))
656           != CODE_FOR_nothing)
657         {
658           emit_unop_insn (code, to, from, equiv_code);
659           return;
660         }
661       else
662         {
663           enum machine_mode intermediate;
664           rtx tmp;
665           tree shift_amount;
666
667           /* Search for a mode to convert via.  */
668           for (intermediate = from_mode; intermediate != VOIDmode;
669                intermediate = GET_MODE_WIDER_MODE (intermediate))
670             if (((can_extend_p (to_mode, intermediate, unsignedp)
671                   != CODE_FOR_nothing)
672                  || (GET_MODE_SIZE (to_mode) < GET_MODE_SIZE (intermediate)
673                      && TRULY_NOOP_TRUNCATION (GET_MODE_BITSIZE (to_mode),
674                                                GET_MODE_BITSIZE (intermediate))))
675                 && (can_extend_p (intermediate, from_mode, unsignedp)
676                     != CODE_FOR_nothing))
677               {
678                 convert_move (to, convert_to_mode (intermediate, from,
679                                                    unsignedp), unsignedp);
680                 return;
681               }
682
683           /* No suitable intermediate mode.
684              Generate what we need with shifts.  */
685           shift_amount = build_int_cst (NULL_TREE,
686                                         GET_MODE_BITSIZE (to_mode)
687                                         - GET_MODE_BITSIZE (from_mode));
688           from = gen_lowpart (to_mode, force_reg (from_mode, from));
689           tmp = expand_shift (LSHIFT_EXPR, to_mode, from, shift_amount,
690                               to, unsignedp);
691           tmp = expand_shift (RSHIFT_EXPR, to_mode, tmp, shift_amount,
692                               to, unsignedp);
693           if (tmp != to)
694             emit_move_insn (to, tmp);
695           return;
696         }
697     }
698
699   /* Support special truncate insns for certain modes.  */
700   if (convert_optab_handler (trunc_optab, to_mode, from_mode)->insn_code != CODE_FOR_nothing)
701     {
702       emit_unop_insn (convert_optab_handler (trunc_optab, to_mode, from_mode)->insn_code,
703                       to, from, UNKNOWN);
704       return;
705     }
706
707   /* Handle truncation of volatile memrefs, and so on;
708      the things that couldn't be truncated directly,
709      and for which there was no special instruction.
710
711      ??? Code above formerly short-circuited this, for most integer
712      mode pairs, with a force_reg in from_mode followed by a recursive
713      call to this routine.  Appears always to have been wrong.  */
714   if (GET_MODE_BITSIZE (to_mode) < GET_MODE_BITSIZE (from_mode))
715     {
716       rtx temp = force_reg (to_mode, gen_lowpart (to_mode, from));
717       emit_move_insn (to, temp);
718       return;
719     }
720
721   /* Mode combination is not recognized.  */
722   gcc_unreachable ();
723 }
724
725 /* Return an rtx for a value that would result
726    from converting X to mode MODE.
727    Both X and MODE may be floating, or both integer.
728    UNSIGNEDP is nonzero if X is an unsigned value.
729    This can be done by referring to a part of X in place
730    or by copying to a new temporary with conversion.  */
731
732 rtx
733 convert_to_mode (enum machine_mode mode, rtx x, int unsignedp)
734 {
735   return convert_modes (mode, VOIDmode, x, unsignedp);
736 }
737
738 /* Return an rtx for a value that would result
739    from converting X from mode OLDMODE to mode MODE.
740    Both modes may be floating, or both integer.
741    UNSIGNEDP is nonzero if X is an unsigned value.
742
743    This can be done by referring to a part of X in place
744    or by copying to a new temporary with conversion.
745
746    You can give VOIDmode for OLDMODE, if you are sure X has a nonvoid mode.  */
747
748 rtx
749 convert_modes (enum machine_mode mode, enum machine_mode oldmode, rtx x, int unsignedp)
750 {
751   rtx temp;
752
753   /* If FROM is a SUBREG that indicates that we have already done at least
754      the required extension, strip it.  */
755
756   if (GET_CODE (x) == SUBREG && SUBREG_PROMOTED_VAR_P (x)
757       && GET_MODE_SIZE (GET_MODE (SUBREG_REG (x))) >= GET_MODE_SIZE (mode)
758       && SUBREG_PROMOTED_UNSIGNED_P (x) == unsignedp)
759     x = gen_lowpart (mode, x);
760
761   if (GET_MODE (x) != VOIDmode)
762     oldmode = GET_MODE (x);
763
764   if (mode == oldmode)
765     return x;
766
767   /* There is one case that we must handle specially: If we are converting
768      a CONST_INT into a mode whose size is twice HOST_BITS_PER_WIDE_INT and
769      we are to interpret the constant as unsigned, gen_lowpart will do
770      the wrong if the constant appears negative.  What we want to do is
771      make the high-order word of the constant zero, not all ones.  */
772
773   if (unsignedp && GET_MODE_CLASS (mode) == MODE_INT
774       && GET_MODE_BITSIZE (mode) == 2 * HOST_BITS_PER_WIDE_INT
775       && CONST_INT_P (x) && INTVAL (x) < 0)
776     {
777       HOST_WIDE_INT val = INTVAL (x);
778
779       if (oldmode != VOIDmode
780           && HOST_BITS_PER_WIDE_INT > GET_MODE_BITSIZE (oldmode))
781         {
782           int width = GET_MODE_BITSIZE (oldmode);
783
784           /* We need to zero extend VAL.  */
785           val &= ((HOST_WIDE_INT) 1 << width) - 1;
786         }
787
788       return immed_double_const (val, (HOST_WIDE_INT) 0, mode);
789     }
790
791   /* We can do this with a gen_lowpart if both desired and current modes
792      are integer, and this is either a constant integer, a register, or a
793      non-volatile MEM.  Except for the constant case where MODE is no
794      wider than HOST_BITS_PER_WIDE_INT, we must be narrowing the operand.  */
795
796   if ((CONST_INT_P (x)
797        && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
798       || (GET_MODE_CLASS (mode) == MODE_INT
799           && GET_MODE_CLASS (oldmode) == MODE_INT
800           && (GET_CODE (x) == CONST_DOUBLE
801               || (GET_MODE_SIZE (mode) <= GET_MODE_SIZE (oldmode)
802                   && ((MEM_P (x) && ! MEM_VOLATILE_P (x)
803                        && direct_load[(int) mode])
804                       || (REG_P (x)
805                           && (! HARD_REGISTER_P (x)
806                               || HARD_REGNO_MODE_OK (REGNO (x), mode))
807                           && TRULY_NOOP_TRUNCATION (GET_MODE_BITSIZE (mode),
808                                                     GET_MODE_BITSIZE (GET_MODE (x)))))))))
809     {
810       /* ?? If we don't know OLDMODE, we have to assume here that
811          X does not need sign- or zero-extension.   This may not be
812          the case, but it's the best we can do.  */
813       if (CONST_INT_P (x) && oldmode != VOIDmode
814           && GET_MODE_SIZE (mode) > GET_MODE_SIZE (oldmode))
815         {
816           HOST_WIDE_INT val = INTVAL (x);
817           int width = GET_MODE_BITSIZE (oldmode);
818
819           /* We must sign or zero-extend in this case.  Start by
820              zero-extending, then sign extend if we need to.  */
821           val &= ((HOST_WIDE_INT) 1 << width) - 1;
822           if (! unsignedp
823               && (val & ((HOST_WIDE_INT) 1 << (width - 1))))
824             val |= (HOST_WIDE_INT) (-1) << width;
825
826           return gen_int_mode (val, mode);
827         }
828
829       return gen_lowpart (mode, x);
830     }
831
832   /* Converting from integer constant into mode is always equivalent to an
833      subreg operation.  */
834   if (VECTOR_MODE_P (mode) && GET_MODE (x) == VOIDmode)
835     {
836       gcc_assert (GET_MODE_BITSIZE (mode) == GET_MODE_BITSIZE (oldmode));
837       return simplify_gen_subreg (mode, x, oldmode, 0);
838     }
839
840   temp = gen_reg_rtx (mode);
841   convert_move (temp, x, unsignedp);
842   return temp;
843 }
844 \f
845 /* STORE_MAX_PIECES is the number of bytes at a time that we can
846    store efficiently.  Due to internal GCC limitations, this is
847    MOVE_MAX_PIECES limited by the number of bytes GCC can represent
848    for an immediate constant.  */
849
850 #define STORE_MAX_PIECES  MIN (MOVE_MAX_PIECES, 2 * sizeof (HOST_WIDE_INT))
851
852 /* Determine whether the LEN bytes can be moved by using several move
853    instructions.  Return nonzero if a call to move_by_pieces should
854    succeed.  */
855
856 int
857 can_move_by_pieces (unsigned HOST_WIDE_INT len,
858                     unsigned int align ATTRIBUTE_UNUSED)
859 {
860   return MOVE_BY_PIECES_P (len, align);
861 }
862
863 /* Generate several move instructions to copy LEN bytes from block FROM to
864    block TO.  (These are MEM rtx's with BLKmode).
865
866    If PUSH_ROUNDING is defined and TO is NULL, emit_single_push_insn is
867    used to push FROM to the stack.
868
869    ALIGN is maximum stack alignment we can assume.
870
871    If ENDP is 0 return to, if ENDP is 1 return memory at the end ala
872    mempcpy, and if ENDP is 2 return memory the end minus one byte ala
873    stpcpy.  */
874
875 rtx
876 move_by_pieces (rtx to, rtx from, unsigned HOST_WIDE_INT len,
877                 unsigned int align, int endp)
878 {
879   struct move_by_pieces_d data;
880   enum machine_mode to_addr_mode, from_addr_mode
881     = targetm.addr_space.address_mode (MEM_ADDR_SPACE (from));
882   rtx to_addr, from_addr = XEXP (from, 0);
883   unsigned int max_size = MOVE_MAX_PIECES + 1;
884   enum machine_mode mode = VOIDmode, tmode;
885   enum insn_code icode;
886
887   align = MIN (to ? MEM_ALIGN (to) : align, MEM_ALIGN (from));
888
889   data.offset = 0;
890   data.from_addr = from_addr;
891   if (to)
892     {
893       to_addr_mode = targetm.addr_space.address_mode (MEM_ADDR_SPACE (to));
894       to_addr = XEXP (to, 0);
895       data.to = to;
896       data.autinc_to
897         = (GET_CODE (to_addr) == PRE_INC || GET_CODE (to_addr) == PRE_DEC
898            || GET_CODE (to_addr) == POST_INC || GET_CODE (to_addr) == POST_DEC);
899       data.reverse
900         = (GET_CODE (to_addr) == PRE_DEC || GET_CODE (to_addr) == POST_DEC);
901     }
902   else
903     {
904       to_addr_mode = VOIDmode;
905       to_addr = NULL_RTX;
906       data.to = NULL_RTX;
907       data.autinc_to = 1;
908 #ifdef STACK_GROWS_DOWNWARD
909       data.reverse = 1;
910 #else
911       data.reverse = 0;
912 #endif
913     }
914   data.to_addr = to_addr;
915   data.from = from;
916   data.autinc_from
917     = (GET_CODE (from_addr) == PRE_INC || GET_CODE (from_addr) == PRE_DEC
918        || GET_CODE (from_addr) == POST_INC
919        || GET_CODE (from_addr) == POST_DEC);
920
921   data.explicit_inc_from = 0;
922   data.explicit_inc_to = 0;
923   if (data.reverse) data.offset = len;
924   data.len = len;
925
926   /* If copying requires more than two move insns,
927      copy addresses to registers (to make displacements shorter)
928      and use post-increment if available.  */
929   if (!(data.autinc_from && data.autinc_to)
930       && move_by_pieces_ninsns (len, align, max_size) > 2)
931     {
932       /* Find the mode of the largest move...  */
933       for (tmode = GET_CLASS_NARROWEST_MODE (MODE_INT);
934            tmode != VOIDmode; tmode = GET_MODE_WIDER_MODE (tmode))
935         if (GET_MODE_SIZE (tmode) < max_size)
936           mode = tmode;
937
938       if (USE_LOAD_PRE_DECREMENT (mode) && data.reverse && ! data.autinc_from)
939         {
940           data.from_addr = copy_to_mode_reg (from_addr_mode,
941                                              plus_constant (from_addr, len));
942           data.autinc_from = 1;
943           data.explicit_inc_from = -1;
944         }
945       if (USE_LOAD_POST_INCREMENT (mode) && ! data.autinc_from)
946         {
947           data.from_addr = copy_to_mode_reg (from_addr_mode, from_addr);
948           data.autinc_from = 1;
949           data.explicit_inc_from = 1;
950         }
951       if (!data.autinc_from && CONSTANT_P (from_addr))
952         data.from_addr = copy_to_mode_reg (from_addr_mode, from_addr);
953       if (USE_STORE_PRE_DECREMENT (mode) && data.reverse && ! data.autinc_to)
954         {
955           data.to_addr = copy_to_mode_reg (to_addr_mode,
956                                            plus_constant (to_addr, len));
957           data.autinc_to = 1;
958           data.explicit_inc_to = -1;
959         }
960       if (USE_STORE_POST_INCREMENT (mode) && ! data.reverse && ! data.autinc_to)
961         {
962           data.to_addr = copy_to_mode_reg (to_addr_mode, to_addr);
963           data.autinc_to = 1;
964           data.explicit_inc_to = 1;
965         }
966       if (!data.autinc_to && CONSTANT_P (to_addr))
967         data.to_addr = copy_to_mode_reg (to_addr_mode, to_addr);
968     }
969
970   tmode = mode_for_size (MOVE_MAX_PIECES * BITS_PER_UNIT, MODE_INT, 1);
971   if (align >= GET_MODE_ALIGNMENT (tmode))
972     align = GET_MODE_ALIGNMENT (tmode);
973   else
974     {
975       enum machine_mode xmode;
976
977       for (tmode = GET_CLASS_NARROWEST_MODE (MODE_INT), xmode = tmode;
978            tmode != VOIDmode;
979            xmode = tmode, tmode = GET_MODE_WIDER_MODE (tmode))
980         if (GET_MODE_SIZE (tmode) > MOVE_MAX_PIECES
981             || SLOW_UNALIGNED_ACCESS (tmode, align))
982           break;
983
984       align = MAX (align, GET_MODE_ALIGNMENT (xmode));
985     }
986
987   /* First move what we can in the largest integer mode, then go to
988      successively smaller modes.  */
989
990   while (max_size > 1)
991     {
992       for (tmode = GET_CLASS_NARROWEST_MODE (MODE_INT);
993            tmode != VOIDmode; tmode = GET_MODE_WIDER_MODE (tmode))
994         if (GET_MODE_SIZE (tmode) < max_size)
995           mode = tmode;
996
997       if (mode == VOIDmode)
998         break;
999
1000       icode = optab_handler (mov_optab, mode)->insn_code;
1001       if (icode != CODE_FOR_nothing && align >= GET_MODE_ALIGNMENT (mode))
1002         move_by_pieces_1 (GEN_FCN (icode), mode, &data);
1003
1004       max_size = GET_MODE_SIZE (mode);
1005     }
1006
1007   /* The code above should have handled everything.  */
1008   gcc_assert (!data.len);
1009
1010   if (endp)
1011     {
1012       rtx to1;
1013
1014       gcc_assert (!data.reverse);
1015       if (data.autinc_to)
1016         {
1017           if (endp == 2)
1018             {
1019               if (HAVE_POST_INCREMENT && data.explicit_inc_to > 0)
1020                 emit_insn (gen_add2_insn (data.to_addr, constm1_rtx));
1021               else
1022                 data.to_addr = copy_to_mode_reg (to_addr_mode,
1023                                                  plus_constant (data.to_addr,
1024                                                                 -1));
1025             }
1026           to1 = adjust_automodify_address (data.to, QImode, data.to_addr,
1027                                            data.offset);
1028         }
1029       else
1030         {
1031           if (endp == 2)
1032             --data.offset;
1033           to1 = adjust_address (data.to, QImode, data.offset);
1034         }
1035       return to1;
1036     }
1037   else
1038     return data.to;
1039 }
1040
1041 /* Return number of insns required to move L bytes by pieces.
1042    ALIGN (in bits) is maximum alignment we can assume.  */
1043
1044 static unsigned HOST_WIDE_INT
1045 move_by_pieces_ninsns (unsigned HOST_WIDE_INT l, unsigned int align,
1046                        unsigned int max_size)
1047 {
1048   unsigned HOST_WIDE_INT n_insns = 0;
1049   enum machine_mode tmode;
1050
1051   tmode = mode_for_size (MOVE_MAX_PIECES * BITS_PER_UNIT, MODE_INT, 1);
1052   if (align >= GET_MODE_ALIGNMENT (tmode))
1053     align = GET_MODE_ALIGNMENT (tmode);
1054   else
1055     {
1056       enum machine_mode tmode, xmode;
1057
1058       for (tmode = GET_CLASS_NARROWEST_MODE (MODE_INT), xmode = tmode;
1059            tmode != VOIDmode;
1060            xmode = tmode, tmode = GET_MODE_WIDER_MODE (tmode))
1061         if (GET_MODE_SIZE (tmode) > MOVE_MAX_PIECES
1062             || SLOW_UNALIGNED_ACCESS (tmode, align))
1063           break;
1064
1065       align = MAX (align, GET_MODE_ALIGNMENT (xmode));
1066     }
1067
1068   while (max_size > 1)
1069     {
1070       enum machine_mode mode = VOIDmode;
1071       enum insn_code icode;
1072
1073       for (tmode = GET_CLASS_NARROWEST_MODE (MODE_INT);
1074            tmode != VOIDmode; tmode = GET_MODE_WIDER_MODE (tmode))
1075         if (GET_MODE_SIZE (tmode) < max_size)
1076           mode = tmode;
1077
1078       if (mode == VOIDmode)
1079         break;
1080
1081       icode = optab_handler (mov_optab, mode)->insn_code;
1082       if (icode != CODE_FOR_nothing && align >= GET_MODE_ALIGNMENT (mode))
1083         n_insns += l / GET_MODE_SIZE (mode), l %= GET_MODE_SIZE (mode);
1084
1085       max_size = GET_MODE_SIZE (mode);
1086     }
1087
1088   gcc_assert (!l);
1089   return n_insns;
1090 }
1091
1092 /* Subroutine of move_by_pieces.  Move as many bytes as appropriate
1093    with move instructions for mode MODE.  GENFUN is the gen_... function
1094    to make a move insn for that mode.  DATA has all the other info.  */
1095
1096 static void
1097 move_by_pieces_1 (rtx (*genfun) (rtx, ...), enum machine_mode mode,
1098                   struct move_by_pieces_d *data)
1099 {
1100   unsigned int size = GET_MODE_SIZE (mode);
1101   rtx to1 = NULL_RTX, from1;
1102
1103   while (data->len >= size)
1104     {
1105       if (data->reverse)
1106         data->offset -= size;
1107
1108       if (data->to)
1109         {
1110           if (data->autinc_to)
1111             to1 = adjust_automodify_address (data->to, mode, data->to_addr,
1112                                              data->offset);
1113           else
1114             to1 = adjust_address (data->to, mode, data->offset);
1115         }
1116
1117       if (data->autinc_from)
1118         from1 = adjust_automodify_address (data->from, mode, data->from_addr,
1119                                            data->offset);
1120       else
1121         from1 = adjust_address (data->from, mode, data->offset);
1122
1123       if (HAVE_PRE_DECREMENT && data->explicit_inc_to < 0)
1124         emit_insn (gen_add2_insn (data->to_addr,
1125                                   GEN_INT (-(HOST_WIDE_INT)size)));
1126       if (HAVE_PRE_DECREMENT && data->explicit_inc_from < 0)
1127         emit_insn (gen_add2_insn (data->from_addr,
1128                                   GEN_INT (-(HOST_WIDE_INT)size)));
1129
1130       if (data->to)
1131         emit_insn ((*genfun) (to1, from1));
1132       else
1133         {
1134 #ifdef PUSH_ROUNDING
1135           emit_single_push_insn (mode, from1, NULL);
1136 #else
1137           gcc_unreachable ();
1138 #endif
1139         }
1140
1141       if (HAVE_POST_INCREMENT && data->explicit_inc_to > 0)
1142         emit_insn (gen_add2_insn (data->to_addr, GEN_INT (size)));
1143       if (HAVE_POST_INCREMENT && data->explicit_inc_from > 0)
1144         emit_insn (gen_add2_insn (data->from_addr, GEN_INT (size)));
1145
1146       if (! data->reverse)
1147         data->offset += size;
1148
1149       data->len -= size;
1150     }
1151 }
1152 \f
1153 /* Emit code to move a block Y to a block X.  This may be done with
1154    string-move instructions, with multiple scalar move instructions,
1155    or with a library call.
1156
1157    Both X and Y must be MEM rtx's (perhaps inside VOLATILE) with mode BLKmode.
1158    SIZE is an rtx that says how long they are.
1159    ALIGN is the maximum alignment we can assume they have.
1160    METHOD describes what kind of copy this is, and what mechanisms may be used.
1161
1162    Return the address of the new block, if memcpy is called and returns it,
1163    0 otherwise.  */
1164
1165 rtx
1166 emit_block_move_hints (rtx x, rtx y, rtx size, enum block_op_methods method,
1167                        unsigned int expected_align, HOST_WIDE_INT expected_size)
1168 {
1169   bool may_use_call;
1170   rtx retval = 0;
1171   unsigned int align;
1172
1173   switch (method)
1174     {
1175     case BLOCK_OP_NORMAL:
1176     case BLOCK_OP_TAILCALL:
1177       may_use_call = true;
1178       break;
1179
1180     case BLOCK_OP_CALL_PARM:
1181       may_use_call = block_move_libcall_safe_for_call_parm ();
1182
1183       /* Make inhibit_defer_pop nonzero around the library call
1184          to force it to pop the arguments right away.  */
1185       NO_DEFER_POP;
1186       break;
1187
1188     case BLOCK_OP_NO_LIBCALL:
1189       may_use_call = false;
1190       break;
1191
1192     default:
1193       gcc_unreachable ();
1194     }
1195
1196   align = MIN (MEM_ALIGN (x), MEM_ALIGN (y));
1197   gcc_assert (align >= BITS_PER_UNIT);
1198
1199   gcc_assert (MEM_P (x));
1200   gcc_assert (MEM_P (y));
1201   gcc_assert (size);
1202
1203   /* Make sure we've got BLKmode addresses; store_one_arg can decide that
1204      block copy is more efficient for other large modes, e.g. DCmode.  */
1205   x = adjust_address (x, BLKmode, 0);
1206   y = adjust_address (y, BLKmode, 0);
1207
1208   /* Set MEM_SIZE as appropriate for this block copy.  The main place this
1209      can be incorrect is coming from __builtin_memcpy.  */
1210   if (CONST_INT_P (size))
1211     {
1212       if (INTVAL (size) == 0)
1213         return 0;
1214
1215       x = shallow_copy_rtx (x);
1216       y = shallow_copy_rtx (y);
1217       set_mem_size (x, size);
1218       set_mem_size (y, size);
1219     }
1220
1221   if (CONST_INT_P (size) && MOVE_BY_PIECES_P (INTVAL (size), align))
1222     move_by_pieces (x, y, INTVAL (size), align, 0);
1223   else if (emit_block_move_via_movmem (x, y, size, align,
1224                                        expected_align, expected_size))
1225     ;
1226   else if (may_use_call
1227            && ADDR_SPACE_GENERIC_P (MEM_ADDR_SPACE (x))
1228            && ADDR_SPACE_GENERIC_P (MEM_ADDR_SPACE (y)))
1229     retval = emit_block_move_via_libcall (x, y, size,
1230                                           method == BLOCK_OP_TAILCALL);
1231   else
1232     emit_block_move_via_loop (x, y, size, align);
1233
1234   if (method == BLOCK_OP_CALL_PARM)
1235     OK_DEFER_POP;
1236
1237   return retval;
1238 }
1239
1240 rtx
1241 emit_block_move (rtx x, rtx y, rtx size, enum block_op_methods method)
1242 {
1243   return emit_block_move_hints (x, y, size, method, 0, -1);
1244 }
1245
1246 /* A subroutine of emit_block_move.  Returns true if calling the
1247    block move libcall will not clobber any parameters which may have
1248    already been placed on the stack.  */
1249
1250 static bool
1251 block_move_libcall_safe_for_call_parm (void)
1252 {
1253 #if defined (REG_PARM_STACK_SPACE)
1254   tree fn;
1255 #endif
1256
1257   /* If arguments are pushed on the stack, then they're safe.  */
1258   if (PUSH_ARGS)
1259     return true;
1260
1261   /* If registers go on the stack anyway, any argument is sure to clobber
1262      an outgoing argument.  */
1263 #if defined (REG_PARM_STACK_SPACE)
1264   fn = emit_block_move_libcall_fn (false);
1265   /* Avoid set but not used warning if *REG_PARM_STACK_SPACE doesn't
1266      depend on its argument.  */
1267   (void) fn;
1268   if (OUTGOING_REG_PARM_STACK_SPACE ((!fn ? NULL_TREE : TREE_TYPE (fn)))
1269       && REG_PARM_STACK_SPACE (fn) != 0)
1270     return false;
1271 #endif
1272
1273   /* If any argument goes in memory, then it might clobber an outgoing
1274      argument.  */
1275   {
1276     CUMULATIVE_ARGS args_so_far;
1277     tree fn, arg;
1278
1279     fn = emit_block_move_libcall_fn (false);
1280     INIT_CUMULATIVE_ARGS (args_so_far, TREE_TYPE (fn), NULL_RTX, 0, 3);
1281
1282     arg = TYPE_ARG_TYPES (TREE_TYPE (fn));
1283     for ( ; arg != void_list_node ; arg = TREE_CHAIN (arg))
1284       {
1285         enum machine_mode mode = TYPE_MODE (TREE_VALUE (arg));
1286         rtx tmp = FUNCTION_ARG (args_so_far, mode, NULL_TREE, 1);
1287         if (!tmp || !REG_P (tmp))
1288           return false;
1289         if (targetm.calls.arg_partial_bytes (&args_so_far, mode, NULL, 1))
1290           return false;
1291         FUNCTION_ARG_ADVANCE (args_so_far, mode, NULL_TREE, 1);
1292       }
1293   }
1294   return true;
1295 }
1296
1297 /* A subroutine of emit_block_move.  Expand a movmem pattern;
1298    return true if successful.  */
1299
1300 static bool
1301 emit_block_move_via_movmem (rtx x, rtx y, rtx size, unsigned int align,
1302                             unsigned int expected_align, HOST_WIDE_INT expected_size)
1303 {
1304   rtx opalign = GEN_INT (align / BITS_PER_UNIT);
1305   int save_volatile_ok = volatile_ok;
1306   enum machine_mode mode;
1307
1308   if (expected_align < align)
1309     expected_align = align;
1310
1311   /* Since this is a move insn, we don't care about volatility.  */
1312   volatile_ok = 1;
1313
1314   /* Try the most limited insn first, because there's no point
1315      including more than one in the machine description unless
1316      the more limited one has some advantage.  */
1317
1318   for (mode = GET_CLASS_NARROWEST_MODE (MODE_INT); mode != VOIDmode;
1319        mode = GET_MODE_WIDER_MODE (mode))
1320     {
1321       enum insn_code code = movmem_optab[(int) mode];
1322       insn_operand_predicate_fn pred;
1323
1324       if (code != CODE_FOR_nothing
1325           /* We don't need MODE to be narrower than BITS_PER_HOST_WIDE_INT
1326              here because if SIZE is less than the mode mask, as it is
1327              returned by the macro, it will definitely be less than the
1328              actual mode mask.  */
1329           && ((CONST_INT_P (size)
1330                && ((unsigned HOST_WIDE_INT) INTVAL (size)
1331                    <= (GET_MODE_MASK (mode) >> 1)))
1332               || GET_MODE_BITSIZE (mode) >= BITS_PER_WORD)
1333           && ((pred = insn_data[(int) code].operand[0].predicate) == 0
1334               || (*pred) (x, BLKmode))
1335           && ((pred = insn_data[(int) code].operand[1].predicate) == 0
1336               || (*pred) (y, BLKmode))
1337           && ((pred = insn_data[(int) code].operand[3].predicate) == 0
1338               || (*pred) (opalign, VOIDmode)))
1339         {
1340           rtx op2;
1341           rtx last = get_last_insn ();
1342           rtx pat;
1343
1344           op2 = convert_to_mode (mode, size, 1);
1345           pred = insn_data[(int) code].operand[2].predicate;
1346           if (pred != 0 && ! (*pred) (op2, mode))
1347             op2 = copy_to_mode_reg (mode, op2);
1348
1349           /* ??? When called via emit_block_move_for_call, it'd be
1350              nice if there were some way to inform the backend, so
1351              that it doesn't fail the expansion because it thinks
1352              emitting the libcall would be more efficient.  */
1353
1354           if (insn_data[(int) code].n_operands == 4)
1355             pat = GEN_FCN ((int) code) (x, y, op2, opalign);
1356           else
1357             pat = GEN_FCN ((int) code) (x, y, op2, opalign,
1358                                         GEN_INT (expected_align
1359                                                  / BITS_PER_UNIT),
1360                                         GEN_INT (expected_size));
1361           if (pat)
1362             {
1363               emit_insn (pat);
1364               volatile_ok = save_volatile_ok;
1365               return true;
1366             }
1367           else
1368             delete_insns_since (last);
1369         }
1370     }
1371
1372   volatile_ok = save_volatile_ok;
1373   return false;
1374 }
1375
1376 /* A subroutine of emit_block_move.  Expand a call to memcpy.
1377    Return the return value from memcpy, 0 otherwise.  */
1378
1379 rtx
1380 emit_block_move_via_libcall (rtx dst, rtx src, rtx size, bool tailcall)
1381 {
1382   rtx dst_addr, src_addr;
1383   tree call_expr, fn, src_tree, dst_tree, size_tree;
1384   enum machine_mode size_mode;
1385   rtx retval;
1386
1387   /* Emit code to copy the addresses of DST and SRC and SIZE into new
1388      pseudos.  We can then place those new pseudos into a VAR_DECL and
1389      use them later.  */
1390
1391   dst_addr = copy_to_mode_reg (Pmode, XEXP (dst, 0));
1392   src_addr = copy_to_mode_reg (Pmode, XEXP (src, 0));
1393
1394   dst_addr = convert_memory_address (ptr_mode, dst_addr);
1395   src_addr = convert_memory_address (ptr_mode, src_addr);
1396
1397   dst_tree = make_tree (ptr_type_node, dst_addr);
1398   src_tree = make_tree (ptr_type_node, src_addr);
1399
1400   size_mode = TYPE_MODE (sizetype);
1401
1402   size = convert_to_mode (size_mode, size, 1);
1403   size = copy_to_mode_reg (size_mode, size);
1404
1405   /* It is incorrect to use the libcall calling conventions to call
1406      memcpy in this context.  This could be a user call to memcpy and
1407      the user may wish to examine the return value from memcpy.  For
1408      targets where libcalls and normal calls have different conventions
1409      for returning pointers, we could end up generating incorrect code.  */
1410
1411   size_tree = make_tree (sizetype, size);
1412
1413   fn = emit_block_move_libcall_fn (true);
1414   call_expr = build_call_expr (fn, 3, dst_tree, src_tree, size_tree);
1415   CALL_EXPR_TAILCALL (call_expr) = tailcall;
1416
1417   retval = expand_normal (call_expr);
1418
1419   return retval;
1420 }
1421
1422 /* A subroutine of emit_block_move_via_libcall.  Create the tree node
1423    for the function we use for block copies.  The first time FOR_CALL
1424    is true, we call assemble_external.  */
1425
1426 static GTY(()) tree block_move_fn;
1427
1428 void
1429 init_block_move_fn (const char *asmspec)
1430 {
1431   if (!block_move_fn)
1432     {
1433       tree args, fn;
1434
1435       fn = get_identifier ("memcpy");
1436       args = build_function_type_list (ptr_type_node, ptr_type_node,
1437                                        const_ptr_type_node, sizetype,
1438                                        NULL_TREE);
1439
1440       fn = build_decl (UNKNOWN_LOCATION, FUNCTION_DECL, fn, args);
1441       DECL_EXTERNAL (fn) = 1;
1442       TREE_PUBLIC (fn) = 1;
1443       DECL_ARTIFICIAL (fn) = 1;
1444       TREE_NOTHROW (fn) = 1;
1445       DECL_VISIBILITY (fn) = VISIBILITY_DEFAULT;
1446       DECL_VISIBILITY_SPECIFIED (fn) = 1;
1447
1448       block_move_fn = fn;
1449     }
1450
1451   if (asmspec)
1452     set_user_assembler_name (block_move_fn, asmspec);
1453 }
1454
1455 static tree
1456 emit_block_move_libcall_fn (int for_call)
1457 {
1458   static bool emitted_extern;
1459
1460   if (!block_move_fn)
1461     init_block_move_fn (NULL);
1462
1463   if (for_call && !emitted_extern)
1464     {
1465       emitted_extern = true;
1466       make_decl_rtl (block_move_fn);
1467       assemble_external (block_move_fn);
1468     }
1469
1470   return block_move_fn;
1471 }
1472
1473 /* A subroutine of emit_block_move.  Copy the data via an explicit
1474    loop.  This is used only when libcalls are forbidden.  */
1475 /* ??? It'd be nice to copy in hunks larger than QImode.  */
1476
1477 static void
1478 emit_block_move_via_loop (rtx x, rtx y, rtx size,
1479                           unsigned int align ATTRIBUTE_UNUSED)
1480 {
1481   rtx cmp_label, top_label, iter, x_addr, y_addr, tmp;
1482   enum machine_mode x_addr_mode
1483     = targetm.addr_space.address_mode (MEM_ADDR_SPACE (x));
1484   enum machine_mode y_addr_mode
1485     = targetm.addr_space.address_mode (MEM_ADDR_SPACE (y));
1486   enum machine_mode iter_mode;
1487
1488   iter_mode = GET_MODE (size);
1489   if (iter_mode == VOIDmode)
1490     iter_mode = word_mode;
1491
1492   top_label = gen_label_rtx ();
1493   cmp_label = gen_label_rtx ();
1494   iter = gen_reg_rtx (iter_mode);
1495
1496   emit_move_insn (iter, const0_rtx);
1497
1498   x_addr = force_operand (XEXP (x, 0), NULL_RTX);
1499   y_addr = force_operand (XEXP (y, 0), NULL_RTX);
1500   do_pending_stack_adjust ();
1501
1502   emit_jump (cmp_label);
1503   emit_label (top_label);
1504
1505   tmp = convert_modes (x_addr_mode, iter_mode, iter, true);
1506   x_addr = gen_rtx_PLUS (x_addr_mode, x_addr, tmp);
1507
1508   if (x_addr_mode != y_addr_mode)
1509     tmp = convert_modes (y_addr_mode, iter_mode, iter, true);
1510   y_addr = gen_rtx_PLUS (y_addr_mode, y_addr, tmp);
1511
1512   x = change_address (x, QImode, x_addr);
1513   y = change_address (y, QImode, y_addr);
1514
1515   emit_move_insn (x, y);
1516
1517   tmp = expand_simple_binop (iter_mode, PLUS, iter, const1_rtx, iter,
1518                              true, OPTAB_LIB_WIDEN);
1519   if (tmp != iter)
1520     emit_move_insn (iter, tmp);
1521
1522   emit_label (cmp_label);
1523
1524   emit_cmp_and_jump_insns (iter, size, LT, NULL_RTX, iter_mode,
1525                            true, top_label);
1526 }
1527 \f
1528 /* Copy all or part of a value X into registers starting at REGNO.
1529    The number of registers to be filled is NREGS.  */
1530
1531 void
1532 move_block_to_reg (int regno, rtx x, int nregs, enum machine_mode mode)
1533 {
1534   int i;
1535 #ifdef HAVE_load_multiple
1536   rtx pat;
1537   rtx last;
1538 #endif
1539
1540   if (nregs == 0)
1541     return;
1542
1543   if (CONSTANT_P (x) && ! LEGITIMATE_CONSTANT_P (x))
1544     x = validize_mem (force_const_mem (mode, x));
1545
1546   /* See if the machine can do this with a load multiple insn.  */
1547 #ifdef HAVE_load_multiple
1548   if (HAVE_load_multiple)
1549     {
1550       last = get_last_insn ();
1551       pat = gen_load_multiple (gen_rtx_REG (word_mode, regno), x,
1552                                GEN_INT (nregs));
1553       if (pat)
1554         {
1555           emit_insn (pat);
1556           return;
1557         }
1558       else
1559         delete_insns_since (last);
1560     }
1561 #endif
1562
1563   for (i = 0; i < nregs; i++)
1564     emit_move_insn (gen_rtx_REG (word_mode, regno + i),
1565                     operand_subword_force (x, i, mode));
1566 }
1567
1568 /* Copy all or part of a BLKmode value X out of registers starting at REGNO.
1569    The number of registers to be filled is NREGS.  */
1570
1571 void
1572 move_block_from_reg (int regno, rtx x, int nregs)
1573 {
1574   int i;
1575
1576   if (nregs == 0)
1577     return;
1578
1579   /* See if the machine can do this with a store multiple insn.  */
1580 #ifdef HAVE_store_multiple
1581   if (HAVE_store_multiple)
1582     {
1583       rtx last = get_last_insn ();
1584       rtx pat = gen_store_multiple (x, gen_rtx_REG (word_mode, regno),
1585                                     GEN_INT (nregs));
1586       if (pat)
1587         {
1588           emit_insn (pat);
1589           return;
1590         }
1591       else
1592         delete_insns_since (last);
1593     }
1594 #endif
1595
1596   for (i = 0; i < nregs; i++)
1597     {
1598       rtx tem = operand_subword (x, i, 1, BLKmode);
1599
1600       gcc_assert (tem);
1601
1602       emit_move_insn (tem, gen_rtx_REG (word_mode, regno + i));
1603     }
1604 }
1605
1606 /* Generate a PARALLEL rtx for a new non-consecutive group of registers from
1607    ORIG, where ORIG is a non-consecutive group of registers represented by
1608    a PARALLEL.  The clone is identical to the original except in that the
1609    original set of registers is replaced by a new set of pseudo registers.
1610    The new set has the same modes as the original set.  */
1611
1612 rtx
1613 gen_group_rtx (rtx orig)
1614 {
1615   int i, length;
1616   rtx *tmps;
1617
1618   gcc_assert (GET_CODE (orig) == PARALLEL);
1619
1620   length = XVECLEN (orig, 0);
1621   tmps = XALLOCAVEC (rtx, length);
1622
1623   /* Skip a NULL entry in first slot.  */
1624   i = XEXP (XVECEXP (orig, 0, 0), 0) ? 0 : 1;
1625
1626   if (i)
1627     tmps[0] = 0;
1628
1629   for (; i < length; i++)
1630     {
1631       enum machine_mode mode = GET_MODE (XEXP (XVECEXP (orig, 0, i), 0));
1632       rtx offset = XEXP (XVECEXP (orig, 0, i), 1);
1633
1634       tmps[i] = gen_rtx_EXPR_LIST (VOIDmode, gen_reg_rtx (mode), offset);
1635     }
1636
1637   return gen_rtx_PARALLEL (GET_MODE (orig), gen_rtvec_v (length, tmps));
1638 }
1639
1640 /* A subroutine of emit_group_load.  Arguments as for emit_group_load,
1641    except that values are placed in TMPS[i], and must later be moved
1642    into corresponding XEXP (XVECEXP (DST, 0, i), 0) element.  */
1643
1644 static void
1645 emit_group_load_1 (rtx *tmps, rtx dst, rtx orig_src, tree type, int ssize)
1646 {
1647   rtx src;
1648   int start, i;
1649   enum machine_mode m = GET_MODE (orig_src);
1650
1651   gcc_assert (GET_CODE (dst) == PARALLEL);
1652
1653   if (m != VOIDmode
1654       && !SCALAR_INT_MODE_P (m)
1655       && !MEM_P (orig_src)
1656       && GET_CODE (orig_src) != CONCAT)
1657     {
1658       enum machine_mode imode = int_mode_for_mode (GET_MODE (orig_src));
1659       if (imode == BLKmode)
1660         src = assign_stack_temp (GET_MODE (orig_src), ssize, 0);
1661       else
1662         src = gen_reg_rtx (imode);
1663       if (imode != BLKmode)
1664         src = gen_lowpart (GET_MODE (orig_src), src);
1665       emit_move_insn (src, orig_src);
1666       /* ...and back again.  */
1667       if (imode != BLKmode)
1668         src = gen_lowpart (imode, src);
1669       emit_group_load_1 (tmps, dst, src, type, ssize);
1670       return;
1671     }
1672
1673   /* Check for a NULL entry, used to indicate that the parameter goes
1674      both on the stack and in registers.  */
1675   if (XEXP (XVECEXP (dst, 0, 0), 0))
1676     start = 0;
1677   else
1678     start = 1;
1679
1680   /* Process the pieces.  */
1681   for (i = start; i < XVECLEN (dst, 0); i++)
1682     {
1683       enum machine_mode mode = GET_MODE (XEXP (XVECEXP (dst, 0, i), 0));
1684       HOST_WIDE_INT bytepos = INTVAL (XEXP (XVECEXP (dst, 0, i), 1));
1685       unsigned int bytelen = GET_MODE_SIZE (mode);
1686       int shift = 0;
1687
1688       /* Handle trailing fragments that run over the size of the struct.  */
1689       if (ssize >= 0 && bytepos + (HOST_WIDE_INT) bytelen > ssize)
1690         {
1691           /* Arrange to shift the fragment to where it belongs.
1692              extract_bit_field loads to the lsb of the reg.  */
1693           if (
1694 #ifdef BLOCK_REG_PADDING
1695               BLOCK_REG_PADDING (GET_MODE (orig_src), type, i == start)
1696               == (BYTES_BIG_ENDIAN ? upward : downward)
1697 #else
1698               BYTES_BIG_ENDIAN
1699 #endif
1700               )
1701             shift = (bytelen - (ssize - bytepos)) * BITS_PER_UNIT;
1702           bytelen = ssize - bytepos;
1703           gcc_assert (bytelen > 0);
1704         }
1705
1706       /* If we won't be loading directly from memory, protect the real source
1707          from strange tricks we might play; but make sure that the source can
1708          be loaded directly into the destination.  */
1709       src = orig_src;
1710       if (!MEM_P (orig_src)
1711           && (!CONSTANT_P (orig_src)
1712               || (GET_MODE (orig_src) != mode
1713                   && GET_MODE (orig_src) != VOIDmode)))
1714         {
1715           if (GET_MODE (orig_src) == VOIDmode)
1716             src = gen_reg_rtx (mode);
1717           else
1718             src = gen_reg_rtx (GET_MODE (orig_src));
1719
1720           emit_move_insn (src, orig_src);
1721         }
1722
1723       /* Optimize the access just a bit.  */
1724       if (MEM_P (src)
1725           && (! SLOW_UNALIGNED_ACCESS (mode, MEM_ALIGN (src))
1726               || MEM_ALIGN (src) >= GET_MODE_ALIGNMENT (mode))
1727           && bytepos * BITS_PER_UNIT % GET_MODE_ALIGNMENT (mode) == 0
1728           && bytelen == GET_MODE_SIZE (mode))
1729         {
1730           tmps[i] = gen_reg_rtx (mode);
1731           emit_move_insn (tmps[i], adjust_address (src, mode, bytepos));
1732         }
1733       else if (COMPLEX_MODE_P (mode)
1734                && GET_MODE (src) == mode
1735                && bytelen == GET_MODE_SIZE (mode))
1736         /* Let emit_move_complex do the bulk of the work.  */
1737         tmps[i] = src;
1738       else if (GET_CODE (src) == CONCAT)
1739         {
1740           unsigned int slen = GET_MODE_SIZE (GET_MODE (src));
1741           unsigned int slen0 = GET_MODE_SIZE (GET_MODE (XEXP (src, 0)));
1742
1743           if ((bytepos == 0 && bytelen == slen0)
1744               || (bytepos != 0 && bytepos + bytelen <= slen))
1745             {
1746               /* The following assumes that the concatenated objects all
1747                  have the same size.  In this case, a simple calculation
1748                  can be used to determine the object and the bit field
1749                  to be extracted.  */
1750               tmps[i] = XEXP (src, bytepos / slen0);
1751               if (! CONSTANT_P (tmps[i])
1752                   && (!REG_P (tmps[i]) || GET_MODE (tmps[i]) != mode))
1753                 tmps[i] = extract_bit_field (tmps[i], bytelen * BITS_PER_UNIT,
1754                                              (bytepos % slen0) * BITS_PER_UNIT,
1755                                              1, NULL_RTX, mode, mode);
1756             }
1757           else
1758             {
1759               rtx mem;
1760
1761               gcc_assert (!bytepos);
1762               mem = assign_stack_temp (GET_MODE (src), slen, 0);
1763               emit_move_insn (mem, src);
1764               tmps[i] = extract_bit_field (mem, bytelen * BITS_PER_UNIT,
1765                                            0, 1, NULL_RTX, mode, mode);
1766             }
1767         }
1768       /* FIXME: A SIMD parallel will eventually lead to a subreg of a
1769          SIMD register, which is currently broken.  While we get GCC
1770          to emit proper RTL for these cases, let's dump to memory.  */
1771       else if (VECTOR_MODE_P (GET_MODE (dst))
1772                && REG_P (src))
1773         {
1774           int slen = GET_MODE_SIZE (GET_MODE (src));
1775           rtx mem;
1776
1777           mem = assign_stack_temp (GET_MODE (src), slen, 0);
1778           emit_move_insn (mem, src);
1779           tmps[i] = adjust_address (mem, mode, (int) bytepos);
1780         }
1781       else if (CONSTANT_P (src) && GET_MODE (dst) != BLKmode
1782                && XVECLEN (dst, 0) > 1)
1783         tmps[i] = simplify_gen_subreg (mode, src, GET_MODE(dst), bytepos);
1784       else if (CONSTANT_P (src))
1785         {
1786           HOST_WIDE_INT len = (HOST_WIDE_INT) bytelen;
1787
1788           if (len == ssize)
1789             tmps[i] = src;
1790           else
1791             {
1792               rtx first, second;
1793
1794               gcc_assert (2 * len == ssize);
1795               split_double (src, &first, &second);
1796               if (i)
1797                 tmps[i] = second;
1798               else
1799                 tmps[i] = first;
1800             }
1801         }
1802       else if (REG_P (src) && GET_MODE (src) == mode)
1803         tmps[i] = src;
1804       else
1805         tmps[i] = extract_bit_field (src, bytelen * BITS_PER_UNIT,
1806                                      bytepos * BITS_PER_UNIT, 1, NULL_RTX,
1807                                      mode, mode);
1808
1809       if (shift)
1810         tmps[i] = expand_shift (LSHIFT_EXPR, mode, tmps[i],
1811                                 build_int_cst (NULL_TREE, shift), tmps[i], 0);
1812     }
1813 }
1814
1815 /* Emit code to move a block SRC of type TYPE to a block DST,
1816    where DST is non-consecutive registers represented by a PARALLEL.
1817    SSIZE represents the total size of block ORIG_SRC in bytes, or -1
1818    if not known.  */
1819
1820 void
1821 emit_group_load (rtx dst, rtx src, tree type, int ssize)
1822 {
1823   rtx *tmps;
1824   int i;
1825
1826   tmps = XALLOCAVEC (rtx, XVECLEN (dst, 0));
1827   emit_group_load_1 (tmps, dst, src, type, ssize);
1828
1829   /* Copy the extracted pieces into the proper (probable) hard regs.  */
1830   for (i = 0; i < XVECLEN (dst, 0); i++)
1831     {
1832       rtx d = XEXP (XVECEXP (dst, 0, i), 0);
1833       if (d == NULL)
1834         continue;
1835       emit_move_insn (d, tmps[i]);
1836     }
1837 }
1838
1839 /* Similar, but load SRC into new pseudos in a format that looks like
1840    PARALLEL.  This can later be fed to emit_group_move to get things
1841    in the right place.  */
1842
1843 rtx
1844 emit_group_load_into_temps (rtx parallel, rtx src, tree type, int ssize)
1845 {
1846   rtvec vec;
1847   int i;
1848
1849   vec = rtvec_alloc (XVECLEN (parallel, 0));
1850   emit_group_load_1 (&RTVEC_ELT (vec, 0), parallel, src, type, ssize);
1851
1852   /* Convert the vector to look just like the original PARALLEL, except
1853      with the computed values.  */
1854   for (i = 0; i < XVECLEN (parallel, 0); i++)
1855     {
1856       rtx e = XVECEXP (parallel, 0, i);
1857       rtx d = XEXP (e, 0);
1858
1859       if (d)
1860         {
1861           d = force_reg (GET_MODE (d), RTVEC_ELT (vec, i));
1862           e = alloc_EXPR_LIST (REG_NOTE_KIND (e), d, XEXP (e, 1));
1863         }
1864       RTVEC_ELT (vec, i) = e;
1865     }
1866
1867   return gen_rtx_PARALLEL (GET_MODE (parallel), vec);
1868 }
1869
1870 /* Emit code to move a block SRC to block DST, where SRC and DST are
1871    non-consecutive groups of registers, each represented by a PARALLEL.  */
1872
1873 void
1874 emit_group_move (rtx dst, rtx src)
1875 {
1876   int i;
1877
1878   gcc_assert (GET_CODE (src) == PARALLEL
1879               && GET_CODE (dst) == PARALLEL
1880               && XVECLEN (src, 0) == XVECLEN (dst, 0));
1881
1882   /* Skip first entry if NULL.  */
1883   for (i = XEXP (XVECEXP (src, 0, 0), 0) ? 0 : 1; i < XVECLEN (src, 0); i++)
1884     emit_move_insn (XEXP (XVECEXP (dst, 0, i), 0),
1885                     XEXP (XVECEXP (src, 0, i), 0));
1886 }
1887
1888 /* Move a group of registers represented by a PARALLEL into pseudos.  */
1889
1890 rtx
1891 emit_group_move_into_temps (rtx src)
1892 {
1893   rtvec vec = rtvec_alloc (XVECLEN (src, 0));
1894   int i;
1895
1896   for (i = 0; i < XVECLEN (src, 0); i++)
1897     {
1898       rtx e = XVECEXP (src, 0, i);
1899       rtx d = XEXP (e, 0);
1900
1901       if (d)
1902         e = alloc_EXPR_LIST (REG_NOTE_KIND (e), copy_to_reg (d), XEXP (e, 1));
1903       RTVEC_ELT (vec, i) = e;
1904     }
1905
1906   return gen_rtx_PARALLEL (GET_MODE (src), vec);
1907 }
1908
1909 /* Emit code to move a block SRC to a block ORIG_DST of type TYPE,
1910    where SRC is non-consecutive registers represented by a PARALLEL.
1911    SSIZE represents the total size of block ORIG_DST, or -1 if not
1912    known.  */
1913
1914 void
1915 emit_group_store (rtx orig_dst, rtx src, tree type ATTRIBUTE_UNUSED, int ssize)
1916 {
1917   rtx *tmps, dst;
1918   int start, finish, i;
1919   enum machine_mode m = GET_MODE (orig_dst);
1920
1921   gcc_assert (GET_CODE (src) == PARALLEL);
1922
1923   if (!SCALAR_INT_MODE_P (m)
1924       && !MEM_P (orig_dst) && GET_CODE (orig_dst) != CONCAT)
1925     {
1926       enum machine_mode imode = int_mode_for_mode (GET_MODE (orig_dst));
1927       if (imode == BLKmode)
1928         dst = assign_stack_temp (GET_MODE (orig_dst), ssize, 0);
1929       else
1930         dst = gen_reg_rtx (imode);
1931       emit_group_store (dst, src, type, ssize);
1932       if (imode != BLKmode)
1933         dst = gen_lowpart (GET_MODE (orig_dst), dst);
1934       emit_move_insn (orig_dst, dst);
1935       return;
1936     }
1937
1938   /* Check for a NULL entry, used to indicate that the parameter goes
1939      both on the stack and in registers.  */
1940   if (XEXP (XVECEXP (src, 0, 0), 0))
1941     start = 0;
1942   else
1943     start = 1;
1944   finish = XVECLEN (src, 0);
1945
1946   tmps = XALLOCAVEC (rtx, finish);
1947
1948   /* Copy the (probable) hard regs into pseudos.  */
1949   for (i = start; i < finish; i++)
1950     {
1951       rtx reg = XEXP (XVECEXP (src, 0, i), 0);
1952       if (!REG_P (reg) || REGNO (reg) < FIRST_PSEUDO_REGISTER)
1953         {
1954           tmps[i] = gen_reg_rtx (GET_MODE (reg));
1955           emit_move_insn (tmps[i], reg);
1956         }
1957       else
1958         tmps[i] = reg;
1959     }
1960
1961   /* If we won't be storing directly into memory, protect the real destination
1962      from strange tricks we might play.  */
1963   dst = orig_dst;
1964   if (GET_CODE (dst) == PARALLEL)
1965     {
1966       rtx temp;
1967
1968       /* We can get a PARALLEL dst if there is a conditional expression in
1969          a return statement.  In that case, the dst and src are the same,
1970          so no action is necessary.  */
1971       if (rtx_equal_p (dst, src))
1972         return;
1973
1974       /* It is unclear if we can ever reach here, but we may as well handle
1975          it.  Allocate a temporary, and split this into a store/load to/from
1976          the temporary.  */
1977
1978       temp = assign_stack_temp (GET_MODE (dst), ssize, 0);
1979       emit_group_store (temp, src, type, ssize);
1980       emit_group_load (dst, temp, type, ssize);
1981       return;
1982     }
1983   else if (!MEM_P (dst) && GET_CODE (dst) != CONCAT)
1984     {
1985       enum machine_mode outer = GET_MODE (dst);
1986       enum machine_mode inner;
1987       HOST_WIDE_INT bytepos;
1988       bool done = false;
1989       rtx temp;
1990
1991       if (!REG_P (dst) || REGNO (dst) < FIRST_PSEUDO_REGISTER)
1992         dst = gen_reg_rtx (outer);
1993
1994       /* Make life a bit easier for combine.  */
1995       /* If the first element of the vector is the low part
1996          of the destination mode, use a paradoxical subreg to
1997          initialize the destination.  */
1998       if (start < finish)
1999         {
2000           inner = GET_MODE (tmps[start]);
2001           bytepos = subreg_lowpart_offset (inner, outer);
2002           if (INTVAL (XEXP (XVECEXP (src, 0, start), 1)) == bytepos)
2003             {
2004               temp = simplify_gen_subreg (outer, tmps[start],
2005                                           inner, 0);
2006               if (temp)
2007                 {
2008                   emit_move_insn (dst, temp);
2009                   done = true;
2010                   start++;
2011                 }
2012             }
2013         }
2014
2015       /* If the first element wasn't the low part, try the last.  */
2016       if (!done
2017           && start < finish - 1)
2018         {
2019           inner = GET_MODE (tmps[finish - 1]);
2020           bytepos = subreg_lowpart_offset (inner, outer);
2021           if (INTVAL (XEXP (XVECEXP (src, 0, finish - 1), 1)) == bytepos)
2022             {
2023               temp = simplify_gen_subreg (outer, tmps[finish - 1],
2024                                           inner, 0);
2025               if (temp)
2026                 {
2027                   emit_move_insn (dst, temp);
2028                   done = true;
2029                   finish--;
2030                 }
2031             }
2032         }
2033
2034       /* Otherwise, simply initialize the result to zero.  */
2035       if (!done)
2036         emit_move_insn (dst, CONST0_RTX (outer));
2037     }
2038
2039   /* Process the pieces.  */
2040   for (i = start; i < finish; i++)
2041     {
2042       HOST_WIDE_INT bytepos = INTVAL (XEXP (XVECEXP (src, 0, i), 1));
2043       enum machine_mode mode = GET_MODE (tmps[i]);
2044       unsigned int bytelen = GET_MODE_SIZE (mode);
2045       unsigned int adj_bytelen = bytelen;
2046       rtx dest = dst;
2047
2048       /* Handle trailing fragments that run over the size of the struct.  */
2049       if (ssize >= 0 && bytepos + (HOST_WIDE_INT) bytelen > ssize)
2050         adj_bytelen = ssize - bytepos;
2051
2052       if (GET_CODE (dst) == CONCAT)
2053         {
2054           if (bytepos + adj_bytelen
2055               <= GET_MODE_SIZE (GET_MODE (XEXP (dst, 0))))
2056             dest = XEXP (dst, 0);
2057           else if (bytepos >= GET_MODE_SIZE (GET_MODE (XEXP (dst, 0))))
2058             {
2059               bytepos -= GET_MODE_SIZE (GET_MODE (XEXP (dst, 0)));
2060               dest = XEXP (dst, 1);
2061             }
2062           else
2063             {
2064               enum machine_mode dest_mode = GET_MODE (dest);
2065               enum machine_mode tmp_mode = GET_MODE (tmps[i]);
2066
2067               gcc_assert (bytepos == 0 && XVECLEN (src, 0));
2068
2069               if (GET_MODE_ALIGNMENT (dest_mode)
2070                   >= GET_MODE_ALIGNMENT (tmp_mode))
2071                 {
2072                   dest = assign_stack_temp (dest_mode,
2073                                             GET_MODE_SIZE (dest_mode),
2074                                             0);
2075                   emit_move_insn (adjust_address (dest,
2076                                                   tmp_mode,
2077                                                   bytepos),
2078                                   tmps[i]);
2079                   dst = dest;
2080                 }
2081               else
2082                 {
2083                   dest = assign_stack_temp (tmp_mode,
2084                                             GET_MODE_SIZE (tmp_mode),
2085                                             0);
2086                   emit_move_insn (dest, tmps[i]);
2087                   dst = adjust_address (dest, dest_mode, bytepos);
2088                 }
2089               break;
2090             }
2091         }
2092
2093       if (ssize >= 0 && bytepos + (HOST_WIDE_INT) bytelen > ssize)
2094         {
2095           /* store_bit_field always takes its value from the lsb.
2096              Move the fragment to the lsb if it's not already there.  */
2097           if (
2098 #ifdef BLOCK_REG_PADDING
2099               BLOCK_REG_PADDING (GET_MODE (orig_dst), type, i == start)
2100               == (BYTES_BIG_ENDIAN ? upward : downward)
2101 #else
2102               BYTES_BIG_ENDIAN
2103 #endif
2104               )
2105             {
2106               int shift = (bytelen - (ssize - bytepos)) * BITS_PER_UNIT;
2107               tmps[i] = expand_shift (RSHIFT_EXPR, mode, tmps[i],
2108                                       build_int_cst (NULL_TREE, shift),
2109                                       tmps[i], 0);
2110             }
2111           bytelen = adj_bytelen;
2112         }
2113
2114       /* Optimize the access just a bit.  */
2115       if (MEM_P (dest)
2116           && (! SLOW_UNALIGNED_ACCESS (mode, MEM_ALIGN (dest))
2117               || MEM_ALIGN (dest) >= GET_MODE_ALIGNMENT (mode))
2118           && bytepos * BITS_PER_UNIT % GET_MODE_ALIGNMENT (mode) == 0
2119           && bytelen == GET_MODE_SIZE (mode))
2120         emit_move_insn (adjust_address (dest, mode, bytepos), tmps[i]);
2121       else
2122         store_bit_field (dest, bytelen * BITS_PER_UNIT, bytepos * BITS_PER_UNIT,
2123                          mode, tmps[i]);
2124     }
2125
2126   /* Copy from the pseudo into the (probable) hard reg.  */
2127   if (orig_dst != dst)
2128     emit_move_insn (orig_dst, dst);
2129 }
2130
2131 /* Generate code to copy a BLKmode object of TYPE out of a
2132    set of registers starting with SRCREG into TGTBLK.  If TGTBLK
2133    is null, a stack temporary is created.  TGTBLK is returned.
2134
2135    The purpose of this routine is to handle functions that return
2136    BLKmode structures in registers.  Some machines (the PA for example)
2137    want to return all small structures in registers regardless of the
2138    structure's alignment.  */
2139
2140 rtx
2141 copy_blkmode_from_reg (rtx tgtblk, rtx srcreg, tree type)
2142 {
2143   unsigned HOST_WIDE_INT bytes = int_size_in_bytes (type);
2144   rtx src = NULL, dst = NULL;
2145   unsigned HOST_WIDE_INT bitsize = MIN (TYPE_ALIGN (type), BITS_PER_WORD);
2146   unsigned HOST_WIDE_INT bitpos, xbitpos, padding_correction = 0;
2147   enum machine_mode copy_mode;
2148
2149   if (tgtblk == 0)
2150     {
2151       tgtblk = assign_temp (build_qualified_type (type,
2152                                                   (TYPE_QUALS (type)
2153                                                    | TYPE_QUAL_CONST)),
2154                             0, 1, 1);
2155       preserve_temp_slots (tgtblk);
2156     }
2157
2158   /* This code assumes srcreg is at least a full word.  If it isn't, copy it
2159      into a new pseudo which is a full word.  */
2160
2161   if (GET_MODE (srcreg) != BLKmode
2162       && GET_MODE_SIZE (GET_MODE (srcreg)) < UNITS_PER_WORD)
2163     srcreg = convert_to_mode (word_mode, srcreg, TYPE_UNSIGNED (type));
2164
2165   /* If the structure doesn't take up a whole number of words, see whether
2166      SRCREG is padded on the left or on the right.  If it's on the left,
2167      set PADDING_CORRECTION to the number of bits to skip.
2168
2169      In most ABIs, the structure will be returned at the least end of
2170      the register, which translates to right padding on little-endian
2171      targets and left padding on big-endian targets.  The opposite
2172      holds if the structure is returned at the most significant
2173      end of the register.  */
2174   if (bytes % UNITS_PER_WORD != 0
2175       && (targetm.calls.return_in_msb (type)
2176           ? !BYTES_BIG_ENDIAN
2177           : BYTES_BIG_ENDIAN))
2178     padding_correction
2179       = (BITS_PER_WORD - ((bytes % UNITS_PER_WORD) * BITS_PER_UNIT));
2180
2181   /* Copy the structure BITSIZE bits at a time.  If the target lives in
2182      memory, take care of not reading/writing past its end by selecting
2183      a copy mode suited to BITSIZE.  This should always be possible given
2184      how it is computed.
2185
2186      We could probably emit more efficient code for machines which do not use
2187      strict alignment, but it doesn't seem worth the effort at the current
2188      time.  */
2189
2190   copy_mode = word_mode;
2191   if (MEM_P (tgtblk))
2192     {
2193       enum machine_mode mem_mode = mode_for_size (bitsize, MODE_INT, 1);
2194       if (mem_mode != BLKmode)
2195         copy_mode = mem_mode;
2196     }
2197
2198   for (bitpos = 0, xbitpos = padding_correction;
2199        bitpos < bytes * BITS_PER_UNIT;
2200        bitpos += bitsize, xbitpos += bitsize)
2201     {
2202       /* We need a new source operand each time xbitpos is on a
2203          word boundary and when xbitpos == padding_correction
2204          (the first time through).  */
2205       if (xbitpos % BITS_PER_WORD == 0
2206           || xbitpos == padding_correction)
2207         src = operand_subword_force (srcreg, xbitpos / BITS_PER_WORD,
2208                                      GET_MODE (srcreg));
2209
2210       /* We need a new destination operand each time bitpos is on
2211          a word boundary.  */
2212       if (bitpos % BITS_PER_WORD == 0)
2213         dst = operand_subword (tgtblk, bitpos / BITS_PER_WORD, 1, BLKmode);
2214
2215       /* Use xbitpos for the source extraction (right justified) and
2216          bitpos for the destination store (left justified).  */
2217       store_bit_field (dst, bitsize, bitpos % BITS_PER_WORD, copy_mode,
2218                        extract_bit_field (src, bitsize,
2219                                           xbitpos % BITS_PER_WORD, 1,
2220                                           NULL_RTX, copy_mode, copy_mode));
2221     }
2222
2223   return tgtblk;
2224 }
2225
2226 /* Add a USE expression for REG to the (possibly empty) list pointed
2227    to by CALL_FUSAGE.  REG must denote a hard register.  */
2228
2229 void
2230 use_reg (rtx *call_fusage, rtx reg)
2231 {
2232   gcc_assert (REG_P (reg) && REGNO (reg) < FIRST_PSEUDO_REGISTER);
2233
2234   *call_fusage
2235     = gen_rtx_EXPR_LIST (VOIDmode,
2236                          gen_rtx_USE (VOIDmode, reg), *call_fusage);
2237 }
2238
2239 /* Add USE expressions to *CALL_FUSAGE for each of NREGS consecutive regs,
2240    starting at REGNO.  All of these registers must be hard registers.  */
2241
2242 void
2243 use_regs (rtx *call_fusage, int regno, int nregs)
2244 {
2245   int i;
2246
2247   gcc_assert (regno + nregs <= FIRST_PSEUDO_REGISTER);
2248
2249   for (i = 0; i < nregs; i++)
2250     use_reg (call_fusage, regno_reg_rtx[regno + i]);
2251 }
2252
2253 /* Add USE expressions to *CALL_FUSAGE for each REG contained in the
2254    PARALLEL REGS.  This is for calls that pass values in multiple
2255    non-contiguous locations.  The Irix 6 ABI has examples of this.  */
2256
2257 void
2258 use_group_regs (rtx *call_fusage, rtx regs)
2259 {
2260   int i;
2261
2262   for (i = 0; i < XVECLEN (regs, 0); i++)
2263     {
2264       rtx reg = XEXP (XVECEXP (regs, 0, i), 0);
2265
2266       /* A NULL entry means the parameter goes both on the stack and in
2267          registers.  This can also be a MEM for targets that pass values
2268          partially on the stack and partially in registers.  */
2269       if (reg != 0 && REG_P (reg))
2270         use_reg (call_fusage, reg);
2271     }
2272 }
2273
2274 /* Return the defining gimple statement for SSA_NAME NAME if it is an
2275    assigment and the code of the expresion on the RHS is CODE.  Return
2276    NULL otherwise.  */
2277
2278 static gimple
2279 get_def_for_expr (tree name, enum tree_code code)
2280 {
2281   gimple def_stmt;
2282
2283   if (TREE_CODE (name) != SSA_NAME)
2284     return NULL;
2285
2286   def_stmt = get_gimple_for_ssa_name (name);
2287   if (!def_stmt
2288       || gimple_assign_rhs_code (def_stmt) != code)
2289     return NULL;
2290
2291   return def_stmt;
2292 }
2293 \f
2294
2295 /* Determine whether the LEN bytes generated by CONSTFUN can be
2296    stored to memory using several move instructions.  CONSTFUNDATA is
2297    a pointer which will be passed as argument in every CONSTFUN call.
2298    ALIGN is maximum alignment we can assume.  MEMSETP is true if this is
2299    a memset operation and false if it's a copy of a constant string.
2300    Return nonzero if a call to store_by_pieces should succeed.  */
2301
2302 int
2303 can_store_by_pieces (unsigned HOST_WIDE_INT len,
2304                      rtx (*constfun) (void *, HOST_WIDE_INT, enum machine_mode),
2305                      void *constfundata, unsigned int align, bool memsetp)
2306 {
2307   unsigned HOST_WIDE_INT l;
2308   unsigned int max_size;
2309   HOST_WIDE_INT offset = 0;
2310   enum machine_mode mode, tmode;
2311   enum insn_code icode;
2312   int reverse;
2313   rtx cst;
2314
2315   if (len == 0)
2316     return 1;
2317
2318   if (! (memsetp
2319          ? SET_BY_PIECES_P (len, align)
2320          : STORE_BY_PIECES_P (len, align)))
2321     return 0;
2322
2323   tmode = mode_for_size (STORE_MAX_PIECES * BITS_PER_UNIT, MODE_INT, 1);
2324   if (align >= GET_MODE_ALIGNMENT (tmode))
2325     align = GET_MODE_ALIGNMENT (tmode);
2326   else
2327     {
2328       enum machine_mode xmode;
2329
2330       for (tmode = GET_CLASS_NARROWEST_MODE (MODE_INT), xmode = tmode;
2331            tmode != VOIDmode;
2332            xmode = tmode, tmode = GET_MODE_WIDER_MODE (tmode))
2333         if (GET_MODE_SIZE (tmode) > STORE_MAX_PIECES
2334             || SLOW_UNALIGNED_ACCESS (tmode, align))
2335           break;
2336
2337       align = MAX (align, GET_MODE_ALIGNMENT (xmode));
2338     }
2339
2340   /* We would first store what we can in the largest integer mode, then go to
2341      successively smaller modes.  */
2342
2343   for (reverse = 0;
2344        reverse <= (HAVE_PRE_DECREMENT || HAVE_POST_DECREMENT);
2345        reverse++)
2346     {
2347       l = len;
2348       mode = VOIDmode;
2349       max_size = STORE_MAX_PIECES + 1;
2350       while (max_size > 1)
2351         {
2352           for (tmode = GET_CLASS_NARROWEST_MODE (MODE_INT);
2353                tmode != VOIDmode; tmode = GET_MODE_WIDER_MODE (tmode))
2354             if (GET_MODE_SIZE (tmode) < max_size)
2355               mode = tmode;
2356
2357           if (mode == VOIDmode)
2358             break;
2359
2360           icode = optab_handler (mov_optab, mode)->insn_code;
2361           if (icode != CODE_FOR_nothing
2362               && align >= GET_MODE_ALIGNMENT (mode))
2363             {
2364               unsigned int size = GET_MODE_SIZE (mode);
2365
2366               while (l >= size)
2367                 {
2368                   if (reverse)
2369                     offset -= size;
2370
2371                   cst = (*constfun) (constfundata, offset, mode);
2372                   if (!LEGITIMATE_CONSTANT_P (cst))
2373                     return 0;
2374
2375                   if (!reverse)
2376                     offset += size;
2377
2378                   l -= size;
2379                 }
2380             }
2381
2382           max_size = GET_MODE_SIZE (mode);
2383         }
2384
2385       /* The code above should have handled everything.  */
2386       gcc_assert (!l);
2387     }
2388
2389   return 1;
2390 }
2391
2392 /* Generate several move instructions to store LEN bytes generated by
2393    CONSTFUN to block TO.  (A MEM rtx with BLKmode).  CONSTFUNDATA is a
2394    pointer which will be passed as argument in every CONSTFUN call.
2395    ALIGN is maximum alignment we can assume.  MEMSETP is true if this is
2396    a memset operation and false if it's a copy of a constant string.
2397    If ENDP is 0 return to, if ENDP is 1 return memory at the end ala
2398    mempcpy, and if ENDP is 2 return memory the end minus one byte ala
2399    stpcpy.  */
2400
2401 rtx
2402 store_by_pieces (rtx to, unsigned HOST_WIDE_INT len,
2403                  rtx (*constfun) (void *, HOST_WIDE_INT, enum machine_mode),
2404                  void *constfundata, unsigned int align, bool memsetp, int endp)
2405 {
2406   enum machine_mode to_addr_mode
2407     = targetm.addr_space.address_mode (MEM_ADDR_SPACE (to));
2408   struct store_by_pieces_d data;
2409
2410   if (len == 0)
2411     {
2412       gcc_assert (endp != 2);
2413       return to;
2414     }
2415
2416   gcc_assert (memsetp
2417               ? SET_BY_PIECES_P (len, align)
2418               : STORE_BY_PIECES_P (len, align));
2419   data.constfun = constfun;
2420   data.constfundata = constfundata;
2421   data.len = len;
2422   data.to = to;
2423   store_by_pieces_1 (&data, align);
2424   if (endp)
2425     {
2426       rtx to1;
2427
2428       gcc_assert (!data.reverse);
2429       if (data.autinc_to)
2430         {
2431           if (endp == 2)
2432             {
2433               if (HAVE_POST_INCREMENT && data.explicit_inc_to > 0)
2434                 emit_insn (gen_add2_insn (data.to_addr, constm1_rtx));
2435               else
2436                 data.to_addr = copy_to_mode_reg (to_addr_mode,
2437                                                  plus_constant (data.to_addr,
2438                                                                 -1));
2439             }
2440           to1 = adjust_automodify_address (data.to, QImode, data.to_addr,
2441                                            data.offset);
2442         }
2443       else
2444         {
2445           if (endp == 2)
2446             --data.offset;
2447           to1 = adjust_address (data.to, QImode, data.offset);
2448         }
2449       return to1;
2450     }
2451   else
2452     return data.to;
2453 }
2454
2455 /* Generate several move instructions to clear LEN bytes of block TO.  (A MEM
2456    rtx with BLKmode).  ALIGN is maximum alignment we can assume.  */
2457
2458 static void
2459 clear_by_pieces (rtx to, unsigned HOST_WIDE_INT len, unsigned int align)
2460 {
2461   struct store_by_pieces_d data;
2462
2463   if (len == 0)
2464     return;
2465
2466   data.constfun = clear_by_pieces_1;
2467   data.constfundata = NULL;
2468   data.len = len;
2469   data.to = to;
2470   store_by_pieces_1 (&data, align);
2471 }
2472
2473 /* Callback routine for clear_by_pieces.
2474    Return const0_rtx unconditionally.  */
2475
2476 static rtx
2477 clear_by_pieces_1 (void *data ATTRIBUTE_UNUSED,
2478                    HOST_WIDE_INT offset ATTRIBUTE_UNUSED,
2479                    enum machine_mode mode ATTRIBUTE_UNUSED)
2480 {
2481   return const0_rtx;
2482 }
2483
2484 /* Subroutine of clear_by_pieces and store_by_pieces.
2485    Generate several move instructions to store LEN bytes of block TO.  (A MEM
2486    rtx with BLKmode).  ALIGN is maximum alignment we can assume.  */
2487
2488 static void
2489 store_by_pieces_1 (struct store_by_pieces_d *data ATTRIBUTE_UNUSED,
2490                    unsigned int align ATTRIBUTE_UNUSED)
2491 {
2492   enum machine_mode to_addr_mode
2493     = targetm.addr_space.address_mode (MEM_ADDR_SPACE (data->to));
2494   rtx to_addr = XEXP (data->to, 0);
2495   unsigned int max_size = STORE_MAX_PIECES + 1;
2496   enum machine_mode mode = VOIDmode, tmode;
2497   enum insn_code icode;
2498
2499   data->offset = 0;
2500   data->to_addr = to_addr;
2501   data->autinc_to
2502     = (GET_CODE (to_addr) == PRE_INC || GET_CODE (to_addr) == PRE_DEC
2503        || GET_CODE (to_addr) == POST_INC || GET_CODE (to_addr) == POST_DEC);
2504
2505   data->explicit_inc_to = 0;
2506   data->reverse
2507     = (GET_CODE (to_addr) == PRE_DEC || GET_CODE (to_addr) == POST_DEC);
2508   if (data->reverse)
2509     data->offset = data->len;
2510
2511   /* If storing requires more than two move insns,
2512      copy addresses to registers (to make displacements shorter)
2513      and use post-increment if available.  */
2514   if (!data->autinc_to
2515       && move_by_pieces_ninsns (data->len, align, max_size) > 2)
2516     {
2517       /* Determine the main mode we'll be using.  */
2518       for (tmode = GET_CLASS_NARROWEST_MODE (MODE_INT);
2519            tmode != VOIDmode; tmode = GET_MODE_WIDER_MODE (tmode))
2520         if (GET_MODE_SIZE (tmode) < max_size)
2521           mode = tmode;
2522
2523       if (USE_STORE_PRE_DECREMENT (mode) && data->reverse && ! data->autinc_to)
2524         {
2525           data->to_addr = copy_to_mode_reg (to_addr_mode,
2526                                             plus_constant (to_addr, data->len));
2527           data->autinc_to = 1;
2528           data->explicit_inc_to = -1;
2529         }
2530
2531       if (USE_STORE_POST_INCREMENT (mode) && ! data->reverse
2532           && ! data->autinc_to)
2533         {
2534           data->to_addr = copy_to_mode_reg (to_addr_mode, to_addr);
2535           data->autinc_to = 1;
2536           data->explicit_inc_to = 1;
2537         }
2538
2539       if ( !data->autinc_to && CONSTANT_P (to_addr))
2540         data->to_addr = copy_to_mode_reg (to_addr_mode, to_addr);
2541     }
2542
2543   tmode = mode_for_size (STORE_MAX_PIECES * BITS_PER_UNIT, MODE_INT, 1);
2544   if (align >= GET_MODE_ALIGNMENT (tmode))
2545     align = GET_MODE_ALIGNMENT (tmode);
2546   else
2547     {
2548       enum machine_mode xmode;
2549
2550       for (tmode = GET_CLASS_NARROWEST_MODE (MODE_INT), xmode = tmode;
2551            tmode != VOIDmode;
2552            xmode = tmode, tmode = GET_MODE_WIDER_MODE (tmode))
2553         if (GET_MODE_SIZE (tmode) > STORE_MAX_PIECES
2554             || SLOW_UNALIGNED_ACCESS (tmode, align))
2555           break;
2556
2557       align = MAX (align, GET_MODE_ALIGNMENT (xmode));
2558     }
2559
2560   /* First store what we can in the largest integer mode, then go to
2561      successively smaller modes.  */
2562
2563   while (max_size > 1)
2564     {
2565       for (tmode = GET_CLASS_NARROWEST_MODE (MODE_INT);
2566            tmode != VOIDmode; tmode = GET_MODE_WIDER_MODE (tmode))
2567         if (GET_MODE_SIZE (tmode) < max_size)
2568           mode = tmode;
2569
2570       if (mode == VOIDmode)
2571         break;
2572
2573       icode = optab_handler (mov_optab, mode)->insn_code;
2574       if (icode != CODE_FOR_nothing && align >= GET_MODE_ALIGNMENT (mode))
2575         store_by_pieces_2 (GEN_FCN (icode), mode, data);
2576
2577       max_size = GET_MODE_SIZE (mode);
2578     }
2579
2580   /* The code above should have handled everything.  */
2581   gcc_assert (!data->len);
2582 }
2583
2584 /* Subroutine of store_by_pieces_1.  Store as many bytes as appropriate
2585    with move instructions for mode MODE.  GENFUN is the gen_... function
2586    to make a move insn for that mode.  DATA has all the other info.  */
2587
2588 static void
2589 store_by_pieces_2 (rtx (*genfun) (rtx, ...), enum machine_mode mode,
2590                    struct store_by_pieces_d *data)
2591 {
2592   unsigned int size = GET_MODE_SIZE (mode);
2593   rtx to1, cst;
2594
2595   while (data->len >= size)
2596     {
2597       if (data->reverse)
2598         data->offset -= size;
2599
2600       if (data->autinc_to)
2601         to1 = adjust_automodify_address (data->to, mode, data->to_addr,
2602                                          data->offset);
2603       else
2604         to1 = adjust_address (data->to, mode, data->offset);
2605
2606       if (HAVE_PRE_DECREMENT && data->explicit_inc_to < 0)
2607         emit_insn (gen_add2_insn (data->to_addr,
2608                                   GEN_INT (-(HOST_WIDE_INT) size)));
2609
2610       cst = (*data->constfun) (data->constfundata, data->offset, mode);
2611       emit_insn ((*genfun) (to1, cst));
2612
2613       if (HAVE_POST_INCREMENT && data->explicit_inc_to > 0)
2614         emit_insn (gen_add2_insn (data->to_addr, GEN_INT (size)));
2615
2616       if (! data->reverse)
2617         data->offset += size;
2618
2619       data->len -= size;
2620     }
2621 }
2622 \f
2623 /* Write zeros through the storage of OBJECT.  If OBJECT has BLKmode, SIZE is
2624    its length in bytes.  */
2625
2626 rtx
2627 clear_storage_hints (rtx object, rtx size, enum block_op_methods method,
2628                      unsigned int expected_align, HOST_WIDE_INT expected_size)
2629 {
2630   enum machine_mode mode = GET_MODE (object);
2631   unsigned int align;
2632
2633   gcc_assert (method == BLOCK_OP_NORMAL || method == BLOCK_OP_TAILCALL);
2634
2635   /* If OBJECT is not BLKmode and SIZE is the same size as its mode,
2636      just move a zero.  Otherwise, do this a piece at a time.  */
2637   if (mode != BLKmode
2638       && CONST_INT_P (size)
2639       && INTVAL (size) == (HOST_WIDE_INT) GET_MODE_SIZE (mode))
2640     {
2641       rtx zero = CONST0_RTX (mode);
2642       if (zero != NULL)
2643         {
2644           emit_move_insn (object, zero);
2645           return NULL;
2646         }
2647
2648       if (COMPLEX_MODE_P (mode))
2649         {
2650           zero = CONST0_RTX (GET_MODE_INNER (mode));
2651           if (zero != NULL)
2652             {
2653               write_complex_part (object, zero, 0);
2654               write_complex_part (object, zero, 1);
2655               return NULL;
2656             }
2657         }
2658     }
2659
2660   if (size == const0_rtx)
2661     return NULL;
2662
2663   align = MEM_ALIGN (object);
2664
2665   if (CONST_INT_P (size)
2666       && CLEAR_BY_PIECES_P (INTVAL (size), align))
2667     clear_by_pieces (object, INTVAL (size), align);
2668   else if (set_storage_via_setmem (object, size, const0_rtx, align,
2669                                    expected_align, expected_size))
2670     ;
2671   else if (ADDR_SPACE_GENERIC_P (MEM_ADDR_SPACE (object)))
2672     return set_storage_via_libcall (object, size, const0_rtx,
2673                                     method == BLOCK_OP_TAILCALL);
2674   else
2675     gcc_unreachable ();
2676
2677   return NULL;
2678 }
2679
2680 rtx
2681 clear_storage (rtx object, rtx size, enum block_op_methods method)
2682 {
2683   return clear_storage_hints (object, size, method, 0, -1);
2684 }
2685
2686
2687 /* A subroutine of clear_storage.  Expand a call to memset.
2688    Return the return value of memset, 0 otherwise.  */
2689
2690 rtx
2691 set_storage_via_libcall (rtx object, rtx size, rtx val, bool tailcall)
2692 {
2693   tree call_expr, fn, object_tree, size_tree, val_tree;
2694   enum machine_mode size_mode;
2695   rtx retval;
2696
2697   /* Emit code to copy OBJECT and SIZE into new pseudos.  We can then
2698      place those into new pseudos into a VAR_DECL and use them later.  */
2699
2700   object = copy_to_mode_reg (Pmode, XEXP (object, 0));
2701
2702   size_mode = TYPE_MODE (sizetype);
2703   size = convert_to_mode (size_mode, size, 1);
2704   size = copy_to_mode_reg (size_mode, size);
2705
2706   /* It is incorrect to use the libcall calling conventions to call
2707      memset in this context.  This could be a user call to memset and
2708      the user may wish to examine the return value from memset.  For
2709      targets where libcalls and normal calls have different conventions
2710      for returning pointers, we could end up generating incorrect code.  */
2711
2712   object_tree = make_tree (ptr_type_node, object);
2713   if (!CONST_INT_P (val))
2714     val = convert_to_mode (TYPE_MODE (integer_type_node), val, 1);
2715   size_tree = make_tree (sizetype, size);
2716   val_tree = make_tree (integer_type_node, val);
2717
2718   fn = clear_storage_libcall_fn (true);
2719   call_expr = build_call_expr (fn, 3, object_tree, val_tree, size_tree);
2720   CALL_EXPR_TAILCALL (call_expr) = tailcall;
2721
2722   retval = expand_normal (call_expr);
2723
2724   return retval;
2725 }
2726
2727 /* A subroutine of set_storage_via_libcall.  Create the tree node
2728    for the function we use for block clears.  The first time FOR_CALL
2729    is true, we call assemble_external.  */
2730
2731 tree block_clear_fn;
2732
2733 void
2734 init_block_clear_fn (const char *asmspec)
2735 {
2736   if (!block_clear_fn)
2737     {
2738       tree fn, args;
2739
2740       fn = get_identifier ("memset");
2741       args = build_function_type_list (ptr_type_node, ptr_type_node,
2742                                        integer_type_node, sizetype,
2743                                        NULL_TREE);
2744
2745       fn = build_decl (UNKNOWN_LOCATION, FUNCTION_DECL, fn, args);
2746       DECL_EXTERNAL (fn) = 1;
2747       TREE_PUBLIC (fn) = 1;
2748       DECL_ARTIFICIAL (fn) = 1;
2749       TREE_NOTHROW (fn) = 1;
2750       DECL_VISIBILITY (fn) = VISIBILITY_DEFAULT;
2751       DECL_VISIBILITY_SPECIFIED (fn) = 1;
2752
2753       block_clear_fn = fn;
2754     }
2755
2756   if (asmspec)
2757     set_user_assembler_name (block_clear_fn, asmspec);
2758 }
2759
2760 static tree
2761 clear_storage_libcall_fn (int for_call)
2762 {
2763   static bool emitted_extern;
2764
2765   if (!block_clear_fn)
2766     init_block_clear_fn (NULL);
2767
2768   if (for_call && !emitted_extern)
2769     {
2770       emitted_extern = true;
2771       make_decl_rtl (block_clear_fn);
2772       assemble_external (block_clear_fn);
2773     }
2774
2775   return block_clear_fn;
2776 }
2777 \f
2778 /* Expand a setmem pattern; return true if successful.  */
2779
2780 bool
2781 set_storage_via_setmem (rtx object, rtx size, rtx val, unsigned int align,
2782                         unsigned int expected_align, HOST_WIDE_INT expected_size)
2783 {
2784   /* Try the most limited insn first, because there's no point
2785      including more than one in the machine description unless
2786      the more limited one has some advantage.  */
2787
2788   rtx opalign = GEN_INT (align / BITS_PER_UNIT);
2789   enum machine_mode mode;
2790
2791   if (expected_align < align)
2792     expected_align = align;
2793
2794   for (mode = GET_CLASS_NARROWEST_MODE (MODE_INT); mode != VOIDmode;
2795        mode = GET_MODE_WIDER_MODE (mode))
2796     {
2797       enum insn_code code = setmem_optab[(int) mode];
2798       insn_operand_predicate_fn pred;
2799
2800       if (code != CODE_FOR_nothing
2801           /* We don't need MODE to be narrower than
2802              BITS_PER_HOST_WIDE_INT here because if SIZE is less than
2803              the mode mask, as it is returned by the macro, it will
2804              definitely be less than the actual mode mask.  */
2805           && ((CONST_INT_P (size)
2806                && ((unsigned HOST_WIDE_INT) INTVAL (size)
2807                    <= (GET_MODE_MASK (mode) >> 1)))
2808               || GET_MODE_BITSIZE (mode) >= BITS_PER_WORD)
2809           && ((pred = insn_data[(int) code].operand[0].predicate) == 0
2810               || (*pred) (object, BLKmode))
2811           && ((pred = insn_data[(int) code].operand[3].predicate) == 0
2812               || (*pred) (opalign, VOIDmode)))
2813         {
2814           rtx opsize, opchar;
2815           enum machine_mode char_mode;
2816           rtx last = get_last_insn ();
2817           rtx pat;
2818
2819           opsize = convert_to_mode (mode, size, 1);
2820           pred = insn_data[(int) code].operand[1].predicate;
2821           if (pred != 0 && ! (*pred) (opsize, mode))
2822             opsize = copy_to_mode_reg (mode, opsize);
2823
2824           opchar = val;
2825           char_mode = insn_data[(int) code].operand[2].mode;
2826           if (char_mode != VOIDmode)
2827             {
2828               opchar = convert_to_mode (char_mode, opchar, 1);
2829               pred = insn_data[(int) code].operand[2].predicate;
2830               if (pred != 0 && ! (*pred) (opchar, char_mode))
2831                 opchar = copy_to_mode_reg (char_mode, opchar);
2832             }
2833
2834           if (insn_data[(int) code].n_operands == 4)
2835             pat = GEN_FCN ((int) code) (object, opsize, opchar, opalign);
2836           else
2837             pat = GEN_FCN ((int) code) (object, opsize, opchar, opalign,
2838                                         GEN_INT (expected_align
2839                                                  / BITS_PER_UNIT),
2840                                         GEN_INT (expected_size));
2841           if (pat)
2842             {
2843               emit_insn (pat);
2844               return true;
2845             }
2846           else
2847             delete_insns_since (last);
2848         }
2849     }
2850
2851   return false;
2852 }
2853
2854 \f
2855 /* Write to one of the components of the complex value CPLX.  Write VAL to
2856    the real part if IMAG_P is false, and the imaginary part if its true.  */
2857
2858 static void
2859 write_complex_part (rtx cplx, rtx val, bool imag_p)
2860 {
2861   enum machine_mode cmode;
2862   enum machine_mode imode;
2863   unsigned ibitsize;
2864
2865   if (GET_CODE (cplx) == CONCAT)
2866     {
2867       emit_move_insn (XEXP (cplx, imag_p), val);
2868       return;
2869     }
2870
2871   cmode = GET_MODE (cplx);
2872   imode = GET_MODE_INNER (cmode);
2873   ibitsize = GET_MODE_BITSIZE (imode);
2874
2875   /* For MEMs simplify_gen_subreg may generate an invalid new address
2876      because, e.g., the original address is considered mode-dependent
2877      by the target, which restricts simplify_subreg from invoking
2878      adjust_address_nv.  Instead of preparing fallback support for an
2879      invalid address, we call adjust_address_nv directly.  */
2880   if (MEM_P (cplx))
2881     {
2882       emit_move_insn (adjust_address_nv (cplx, imode,
2883                                          imag_p ? GET_MODE_SIZE (imode) : 0),
2884                       val);
2885       return;
2886     }
2887
2888   /* If the sub-object is at least word sized, then we know that subregging
2889      will work.  This special case is important, since store_bit_field
2890      wants to operate on integer modes, and there's rarely an OImode to
2891      correspond to TCmode.  */
2892   if (ibitsize >= BITS_PER_WORD
2893       /* For hard regs we have exact predicates.  Assume we can split
2894          the original object if it spans an even number of hard regs.
2895          This special case is important for SCmode on 64-bit platforms
2896          where the natural size of floating-point regs is 32-bit.  */
2897       || (REG_P (cplx)
2898           && REGNO (cplx) < FIRST_PSEUDO_REGISTER
2899           && hard_regno_nregs[REGNO (cplx)][cmode] % 2 == 0))
2900     {
2901       rtx part = simplify_gen_subreg (imode, cplx, cmode,
2902                                       imag_p ? GET_MODE_SIZE (imode) : 0);
2903       if (part)
2904         {
2905           emit_move_insn (part, val);
2906           return;
2907         }
2908       else
2909         /* simplify_gen_subreg may fail for sub-word MEMs.  */
2910         gcc_assert (MEM_P (cplx) && ibitsize < BITS_PER_WORD);
2911     }
2912
2913   store_bit_field (cplx, ibitsize, imag_p ? ibitsize : 0, imode, val);
2914 }
2915
2916 /* Extract one of the components of the complex value CPLX.  Extract the
2917    real part if IMAG_P is false, and the imaginary part if it's true.  */
2918
2919 static rtx
2920 read_complex_part (rtx cplx, bool imag_p)
2921 {
2922   enum machine_mode cmode, imode;
2923   unsigned ibitsize;
2924
2925   if (GET_CODE (cplx) == CONCAT)
2926     return XEXP (cplx, imag_p);
2927
2928   cmode = GET_MODE (cplx);
2929   imode = GET_MODE_INNER (cmode);
2930   ibitsize = GET_MODE_BITSIZE (imode);
2931
2932   /* Special case reads from complex constants that got spilled to memory.  */
2933   if (MEM_P (cplx) && GET_CODE (XEXP (cplx, 0)) == SYMBOL_REF)
2934     {
2935       tree decl = SYMBOL_REF_DECL (XEXP (cplx, 0));
2936       if (decl && TREE_CODE (decl) == COMPLEX_CST)
2937         {
2938           tree part = imag_p ? TREE_IMAGPART (decl) : TREE_REALPART (decl);
2939           if (CONSTANT_CLASS_P (part))
2940             return expand_expr (part, NULL_RTX, imode, EXPAND_NORMAL);
2941         }
2942     }
2943
2944   /* For MEMs simplify_gen_subreg may generate an invalid new address
2945      because, e.g., the original address is considered mode-dependent
2946      by the target, which restricts simplify_subreg from invoking
2947      adjust_address_nv.  Instead of preparing fallback support for an
2948      invalid address, we call adjust_address_nv directly.  */
2949   if (MEM_P (cplx))
2950     return adjust_address_nv (cplx, imode,
2951                               imag_p ? GET_MODE_SIZE (imode) : 0);
2952
2953   /* If the sub-object is at least word sized, then we know that subregging
2954      will work.  This special case is important, since extract_bit_field
2955      wants to operate on integer modes, and there's rarely an OImode to
2956      correspond to TCmode.  */
2957   if (ibitsize >= BITS_PER_WORD
2958       /* For hard regs we have exact predicates.  Assume we can split
2959          the original object if it spans an even number of hard regs.
2960          This special case is important for SCmode on 64-bit platforms
2961          where the natural size of floating-point regs is 32-bit.  */
2962       || (REG_P (cplx)
2963           && REGNO (cplx) < FIRST_PSEUDO_REGISTER
2964           && hard_regno_nregs[REGNO (cplx)][cmode] % 2 == 0))
2965     {
2966       rtx ret = simplify_gen_subreg (imode, cplx, cmode,
2967                                      imag_p ? GET_MODE_SIZE (imode) : 0);
2968       if (ret)
2969         return ret;
2970       else
2971         /* simplify_gen_subreg may fail for sub-word MEMs.  */
2972         gcc_assert (MEM_P (cplx) && ibitsize < BITS_PER_WORD);
2973     }
2974
2975   return extract_bit_field (cplx, ibitsize, imag_p ? ibitsize : 0,
2976                             true, NULL_RTX, imode, imode);
2977 }
2978 \f
2979 /* A subroutine of emit_move_insn_1.  Yet another lowpart generator.
2980    NEW_MODE and OLD_MODE are the same size.  Return NULL if X cannot be
2981    represented in NEW_MODE.  If FORCE is true, this will never happen, as
2982    we'll force-create a SUBREG if needed.  */
2983
2984 static rtx
2985 emit_move_change_mode (enum machine_mode new_mode,
2986                        enum machine_mode old_mode, rtx x, bool force)
2987 {
2988   rtx ret;
2989
2990   if (push_operand (x, GET_MODE (x)))
2991     {
2992       ret = gen_rtx_MEM (new_mode, XEXP (x, 0));
2993       MEM_COPY_ATTRIBUTES (ret, x);
2994     }
2995   else if (MEM_P (x))
2996     {
2997       /* We don't have to worry about changing the address since the
2998          size in bytes is supposed to be the same.  */
2999       if (reload_in_progress)
3000         {
3001           /* Copy the MEM to change the mode and move any
3002              substitutions from the old MEM to the new one.  */
3003           ret = adjust_address_nv (x, new_mode, 0);
3004           copy_replacements (x, ret);
3005         }
3006       else
3007         ret = adjust_address (x, new_mode, 0);
3008     }
3009   else
3010     {
3011       /* Note that we do want simplify_subreg's behavior of validating
3012          that the new mode is ok for a hard register.  If we were to use
3013          simplify_gen_subreg, we would create the subreg, but would
3014          probably run into the target not being able to implement it.  */
3015       /* Except, of course, when FORCE is true, when this is exactly what
3016          we want.  Which is needed for CCmodes on some targets.  */
3017       if (force)
3018         ret = simplify_gen_subreg (new_mode, x, old_mode, 0);
3019       else
3020         ret = simplify_subreg (new_mode, x, old_mode, 0);
3021     }
3022
3023   return ret;
3024 }
3025
3026 /* A subroutine of emit_move_insn_1.  Generate a move from Y into X using
3027    an integer mode of the same size as MODE.  Returns the instruction
3028    emitted, or NULL if such a move could not be generated.  */
3029
3030 static rtx
3031 emit_move_via_integer (enum machine_mode mode, rtx x, rtx y, bool force)
3032 {
3033   enum machine_mode imode;
3034   enum insn_code code;
3035
3036   /* There must exist a mode of the exact size we require.  */
3037   imode = int_mode_for_mode (mode);
3038   if (imode == BLKmode)
3039     return NULL_RTX;
3040
3041   /* The target must support moves in this mode.  */
3042   code = optab_handler (mov_optab, imode)->insn_code;
3043   if (code == CODE_FOR_nothing)
3044     return NULL_RTX;
3045
3046   x = emit_move_change_mode (imode, mode, x, force);
3047   if (x == NULL_RTX)
3048     return NULL_RTX;
3049   y = emit_move_change_mode (imode, mode, y, force);
3050   if (y == NULL_RTX)
3051     return NULL_RTX;
3052   return emit_insn (GEN_FCN (code) (x, y));
3053 }
3054
3055 /* A subroutine of emit_move_insn_1.  X is a push_operand in MODE.
3056    Return an equivalent MEM that does not use an auto-increment.  */
3057
3058 static rtx
3059 emit_move_resolve_push (enum machine_mode mode, rtx x)
3060 {
3061   enum rtx_code code = GET_CODE (XEXP (x, 0));
3062   HOST_WIDE_INT adjust;
3063   rtx temp;
3064
3065   adjust = GET_MODE_SIZE (mode);
3066 #ifdef PUSH_ROUNDING
3067   adjust = PUSH_ROUNDING (adjust);
3068 #endif
3069   if (code == PRE_DEC || code == POST_DEC)
3070     adjust = -adjust;
3071   else if (code == PRE_MODIFY || code == POST_MODIFY)
3072     {
3073       rtx expr = XEXP (XEXP (x, 0), 1);
3074       HOST_WIDE_INT val;
3075
3076       gcc_assert (GET_CODE (expr) == PLUS || GET_CODE (expr) == MINUS);
3077       gcc_assert (CONST_INT_P (XEXP (expr, 1)));
3078       val = INTVAL (XEXP (expr, 1));
3079       if (GET_CODE (expr) == MINUS)
3080         val = -val;
3081       gcc_assert (adjust == val || adjust == -val);
3082       adjust = val;
3083     }
3084
3085   /* Do not use anti_adjust_stack, since we don't want to update
3086      stack_pointer_delta.  */
3087   temp = expand_simple_binop (Pmode, PLUS, stack_pointer_rtx,
3088                               GEN_INT (adjust), stack_pointer_rtx,
3089                               0, OPTAB_LIB_WIDEN);
3090   if (temp != stack_pointer_rtx)
3091     emit_move_insn (stack_pointer_rtx, temp);
3092
3093   switch (code)
3094     {
3095     case PRE_INC:
3096     case PRE_DEC:
3097     case PRE_MODIFY:
3098       temp = stack_pointer_rtx;
3099       break;
3100     case POST_INC:
3101     case POST_DEC:
3102     case POST_MODIFY:
3103       temp = plus_constant (stack_pointer_rtx, -adjust);
3104       break;
3105     default:
3106       gcc_unreachable ();
3107     }
3108
3109   return replace_equiv_address (x, temp);
3110 }
3111
3112 /* A subroutine of emit_move_complex.  Generate a move from Y into X.
3113    X is known to satisfy push_operand, and MODE is known to be complex.
3114    Returns the last instruction emitted.  */
3115
3116 rtx
3117 emit_move_complex_push (enum machine_mode mode, rtx x, rtx y)
3118 {
3119   enum machine_mode submode = GET_MODE_INNER (mode);
3120   bool imag_first;
3121
3122 #ifdef PUSH_ROUNDING
3123   unsigned int submodesize = GET_MODE_SIZE (submode);
3124
3125   /* In case we output to the stack, but the size is smaller than the
3126      machine can push exactly, we need to use move instructions.  */
3127   if (PUSH_ROUNDING (submodesize) != submodesize)
3128     {
3129       x = emit_move_resolve_push (mode, x);
3130       return emit_move_insn (x, y);
3131     }
3132 #endif
3133
3134   /* Note that the real part always precedes the imag part in memory
3135      regardless of machine's endianness.  */
3136   switch (GET_CODE (XEXP (x, 0)))
3137     {
3138     case PRE_DEC:
3139     case POST_DEC:
3140       imag_first = true;
3141       break;
3142     case PRE_INC:
3143     case POST_INC:
3144       imag_first = false;
3145       break;
3146     default:
3147       gcc_unreachable ();
3148     }
3149
3150   emit_move_insn (gen_rtx_MEM (submode, XEXP (x, 0)),
3151                   read_complex_part (y, imag_first));
3152   return emit_move_insn (gen_rtx_MEM (submode, XEXP (x, 0)),
3153                          read_complex_part (y, !imag_first));
3154 }
3155
3156 /* A subroutine of emit_move_complex.  Perform the move from Y to X
3157    via two moves of the parts.  Returns the last instruction emitted.  */
3158
3159 rtx
3160 emit_move_complex_parts (rtx x, rtx y)
3161 {
3162   /* Show the output dies here.  This is necessary for SUBREGs
3163      of pseudos since we cannot track their lifetimes correctly;
3164      hard regs shouldn't appear here except as return values.  */
3165   if (!reload_completed && !reload_in_progress
3166       && REG_P (x) && !reg_overlap_mentioned_p (x, y))
3167     emit_clobber (x);
3168
3169   write_complex_part (x, read_complex_part (y, false), false);
3170   write_complex_part (x, read_complex_part (y, true), true);
3171
3172   return get_last_insn ();
3173 }
3174
3175 /* A subroutine of emit_move_insn_1.  Generate a move from Y into X.
3176    MODE is known to be complex.  Returns the last instruction emitted.  */
3177
3178 static rtx
3179 emit_move_complex (enum machine_mode mode, rtx x, rtx y)
3180 {
3181   bool try_int;
3182
3183   /* Need to take special care for pushes, to maintain proper ordering
3184      of the data, and possibly extra padding.  */
3185   if (push_operand (x, mode))
3186     return emit_move_complex_push (mode, x, y);
3187
3188   /* See if we can coerce the target into moving both values at once.  */
3189
3190   /* Move floating point as parts.  */
3191   if (GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT
3192       && optab_handler (mov_optab, GET_MODE_INNER (mode))->insn_code != CODE_FOR_nothing)
3193     try_int = false;
3194   /* Not possible if the values are inherently not adjacent.  */
3195   else if (GET_CODE (x) == CONCAT || GET_CODE (y) == CONCAT)
3196     try_int = false;
3197   /* Is possible if both are registers (or subregs of registers).  */
3198   else if (register_operand (x, mode) && register_operand (y, mode))
3199     try_int = true;
3200   /* If one of the operands is a memory, and alignment constraints
3201      are friendly enough, we may be able to do combined memory operations.
3202      We do not attempt this if Y is a constant because that combination is
3203      usually better with the by-parts thing below.  */
3204   else if ((MEM_P (x) ? !CONSTANT_P (y) : MEM_P (y))
3205            && (!STRICT_ALIGNMENT
3206                || get_mode_alignment (mode) == BIGGEST_ALIGNMENT))
3207     try_int = true;
3208   else
3209     try_int = false;
3210
3211   if (try_int)
3212     {
3213       rtx ret;
3214
3215       /* For memory to memory moves, optimal behavior can be had with the
3216          existing block move logic.  */
3217       if (MEM_P (x) && MEM_P (y))
3218         {
3219           emit_block_move (x, y, GEN_INT (GET_MODE_SIZE (mode)),
3220                            BLOCK_OP_NO_LIBCALL);
3221           return get_last_insn ();
3222         }
3223
3224       ret = emit_move_via_integer (mode, x, y, true);
3225       if (ret)
3226         return ret;
3227     }
3228
3229   return emit_move_complex_parts (x, y);
3230 }
3231
3232 /* A subroutine of emit_move_insn_1.  Generate a move from Y into X.
3233    MODE is known to be MODE_CC.  Returns the last instruction emitted.  */
3234
3235 static rtx
3236 emit_move_ccmode (enum machine_mode mode, rtx x, rtx y)
3237 {
3238   rtx ret;
3239
3240   /* Assume all MODE_CC modes are equivalent; if we have movcc, use it.  */
3241   if (mode != CCmode)
3242     {
3243       enum insn_code code = optab_handler (mov_optab, CCmode)->insn_code;
3244       if (code != CODE_FOR_nothing)
3245         {
3246           x = emit_move_change_mode (CCmode, mode, x, true);
3247           y = emit_move_change_mode (CCmode, mode, y, true);
3248           return emit_insn (GEN_FCN (code) (x, y));
3249         }
3250     }
3251
3252   /* Otherwise, find the MODE_INT mode of the same width.  */
3253   ret = emit_move_via_integer (mode, x, y, false);
3254   gcc_assert (ret != NULL);
3255   return ret;
3256 }
3257
3258 /* Return true if word I of OP lies entirely in the
3259    undefined bits of a paradoxical subreg.  */
3260
3261 static bool
3262 undefined_operand_subword_p (const_rtx op, int i)
3263 {
3264   enum machine_mode innermode, innermostmode;
3265   int offset;
3266   if (GET_CODE (op) != SUBREG)
3267     return false;
3268   innermode = GET_MODE (op);
3269   innermostmode = GET_MODE (SUBREG_REG (op));
3270   offset = i * UNITS_PER_WORD + SUBREG_BYTE (op);
3271   /* The SUBREG_BYTE represents offset, as if the value were stored in
3272      memory, except for a paradoxical subreg where we define
3273      SUBREG_BYTE to be 0; undo this exception as in
3274      simplify_subreg.  */
3275   if (SUBREG_BYTE (op) == 0
3276       && GET_MODE_SIZE (innermostmode) < GET_MODE_SIZE (innermode))
3277     {
3278       int difference = (GET_MODE_SIZE (innermostmode) - GET_MODE_SIZE (innermode));
3279       if (WORDS_BIG_ENDIAN)
3280         offset += (difference / UNITS_PER_WORD) * UNITS_PER_WORD;
3281       if (BYTES_BIG_ENDIAN)
3282         offset += difference % UNITS_PER_WORD;
3283     }
3284   if (offset >= GET_MODE_SIZE (innermostmode)
3285       || offset <= -GET_MODE_SIZE (word_mode))
3286     return true;
3287   return false;
3288 }
3289
3290 /* A subroutine of emit_move_insn_1.  Generate a move from Y into X.
3291    MODE is any multi-word or full-word mode that lacks a move_insn
3292    pattern.  Note that you will get better code if you define such
3293    patterns, even if they must turn into multiple assembler instructions.  */
3294
3295 static rtx
3296 emit_move_multi_word (enum machine_mode mode, rtx x, rtx y)
3297 {
3298   rtx last_insn = 0;
3299   rtx seq, inner;
3300   bool need_clobber;
3301   int i;
3302
3303   gcc_assert (GET_MODE_SIZE (mode) >= UNITS_PER_WORD);
3304
3305   /* If X is a push on the stack, do the push now and replace
3306      X with a reference to the stack pointer.  */
3307   if (push_operand (x, mode))
3308     x = emit_move_resolve_push (mode, x);
3309
3310   /* If we are in reload, see if either operand is a MEM whose address
3311      is scheduled for replacement.  */
3312   if (reload_in_progress && MEM_P (x)
3313       && (inner = find_replacement (&XEXP (x, 0))) != XEXP (x, 0))
3314     x = replace_equiv_address_nv (x, inner);
3315   if (reload_in_progress && MEM_P (y)
3316       && (inner = find_replacement (&XEXP (y, 0))) != XEXP (y, 0))
3317     y = replace_equiv_address_nv (y, inner);
3318
3319   start_sequence ();
3320
3321   need_clobber = false;
3322   for (i = 0;
3323        i < (GET_MODE_SIZE (mode) + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD;
3324        i++)
3325     {
3326       rtx xpart = operand_subword (x, i, 1, mode);
3327       rtx ypart;
3328
3329       /* Do not generate code for a move if it would come entirely
3330          from the undefined bits of a paradoxical subreg.  */
3331       if (undefined_operand_subword_p (y, i))
3332         continue;
3333
3334       ypart = operand_subword (y, i, 1, mode);
3335
3336       /* If we can't get a part of Y, put Y into memory if it is a
3337          constant.  Otherwise, force it into a register.  Then we must
3338          be able to get a part of Y.  */
3339       if (ypart == 0 && CONSTANT_P (y))
3340         {
3341           y = use_anchored_address (force_const_mem (mode, y));
3342           ypart = operand_subword (y, i, 1, mode);
3343         }
3344       else if (ypart == 0)
3345         ypart = operand_subword_force (y, i, mode);
3346
3347       gcc_assert (xpart && ypart);
3348
3349       need_clobber |= (GET_CODE (xpart) == SUBREG);
3350
3351       last_insn = emit_move_insn (xpart, ypart);
3352     }
3353
3354   seq = get_insns ();
3355   end_sequence ();
3356
3357   /* Show the output dies here.  This is necessary for SUBREGs
3358      of pseudos since we cannot track their lifetimes correctly;
3359      hard regs shouldn't appear here except as return values.
3360      We never want to emit such a clobber after reload.  */
3361   if (x != y
3362       && ! (reload_in_progress || reload_completed)
3363       && need_clobber != 0)
3364     emit_clobber (x);
3365
3366   emit_insn (seq);
3367
3368   return last_insn;
3369 }
3370
3371 /* Low level part of emit_move_insn.
3372    Called just like emit_move_insn, but assumes X and Y
3373    are basically valid.  */
3374
3375 rtx
3376 emit_move_insn_1 (rtx x, rtx y)
3377 {
3378   enum machine_mode mode = GET_MODE (x);
3379   enum insn_code code;
3380
3381   gcc_assert ((unsigned int) mode < (unsigned int) MAX_MACHINE_MODE);
3382
3383   code = optab_handler (mov_optab, mode)->insn_code;
3384   if (code != CODE_FOR_nothing)
3385     return emit_insn (GEN_FCN (code) (x, y));
3386
3387   /* Expand complex moves by moving real part and imag part.  */
3388   if (COMPLEX_MODE_P (mode))
3389     return emit_move_complex (mode, x, y);
3390
3391   if (GET_MODE_CLASS (mode) == MODE_DECIMAL_FLOAT
3392       || ALL_FIXED_POINT_MODE_P (mode))
3393     {
3394       rtx result = emit_move_via_integer (mode, x, y, true);
3395
3396       /* If we can't find an integer mode, use multi words.  */
3397       if (result)
3398         return result;
3399       else
3400         return emit_move_multi_word (mode, x, y);
3401     }
3402
3403   if (GET_MODE_CLASS (mode) == MODE_CC)
3404     return emit_move_ccmode (mode, x, y);
3405
3406   /* Try using a move pattern for the corresponding integer mode.  This is
3407      only safe when simplify_subreg can convert MODE constants into integer
3408      constants.  At present, it can only do this reliably if the value
3409      fits within a HOST_WIDE_INT.  */
3410   if (!CONSTANT_P (y) || GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
3411     {
3412       rtx ret = emit_move_via_integer (mode, x, y, false);
3413       if (ret)
3414         return ret;
3415     }
3416
3417   return emit_move_multi_word (mode, x, y);
3418 }
3419
3420 /* Generate code to copy Y into X.
3421    Both Y and X must have the same mode, except that
3422    Y can be a constant with VOIDmode.
3423    This mode cannot be BLKmode; use emit_block_move for that.
3424
3425    Return the last instruction emitted.  */
3426
3427 rtx
3428 emit_move_insn (rtx x, rtx y)
3429 {
3430   enum machine_mode mode = GET_MODE (x);
3431   rtx y_cst = NULL_RTX;
3432   rtx last_insn, set;
3433
3434   gcc_assert (mode != BLKmode
3435               && (GET_MODE (y) == mode || GET_MODE (y) == VOIDmode));
3436
3437   if (CONSTANT_P (y))
3438     {
3439       if (optimize
3440           && SCALAR_FLOAT_MODE_P (GET_MODE (x))
3441           && (last_insn = compress_float_constant (x, y)))
3442         return last_insn;
3443
3444       y_cst = y;
3445
3446       if (!LEGITIMATE_CONSTANT_P (y))
3447         {
3448           y = force_const_mem (mode, y);
3449
3450           /* If the target's cannot_force_const_mem prevented the spill,
3451              assume that the target's move expanders will also take care
3452              of the non-legitimate constant.  */
3453           if (!y)
3454             y = y_cst;
3455           else
3456             y = use_anchored_address (y);
3457         }
3458     }
3459
3460   /* If X or Y are memory references, verify that their addresses are valid
3461      for the machine.  */
3462   if (MEM_P (x)
3463       && (! memory_address_addr_space_p (GET_MODE (x), XEXP (x, 0),
3464                                          MEM_ADDR_SPACE (x))
3465           && ! push_operand (x, GET_MODE (x))))
3466     x = validize_mem (x);
3467
3468   if (MEM_P (y)
3469       && ! memory_address_addr_space_p (GET_MODE (y), XEXP (y, 0),
3470                                         MEM_ADDR_SPACE (y)))
3471     y = validize_mem (y);
3472
3473   gcc_assert (mode != BLKmode);
3474
3475   last_insn = emit_move_insn_1 (x, y);
3476
3477   if (y_cst && REG_P (x)
3478       && (set = single_set (last_insn)) != NULL_RTX
3479       && SET_DEST (set) == x
3480       && ! rtx_equal_p (y_cst, SET_SRC (set)))
3481     set_unique_reg_note (last_insn, REG_EQUAL, y_cst);
3482
3483   return last_insn;
3484 }
3485
3486 /* If Y is representable exactly in a narrower mode, and the target can
3487    perform the extension directly from constant or memory, then emit the
3488    move as an extension.  */
3489
3490 static rtx
3491 compress_float_constant (rtx x, rtx y)
3492 {
3493   enum machine_mode dstmode = GET_MODE (x);
3494   enum machine_mode orig_srcmode = GET_MODE (y);
3495   enum machine_mode srcmode;
3496   REAL_VALUE_TYPE r;
3497   int oldcost, newcost;
3498   bool speed = optimize_insn_for_speed_p ();
3499
3500   REAL_VALUE_FROM_CONST_DOUBLE (r, y);
3501
3502   if (LEGITIMATE_CONSTANT_P (y))
3503     oldcost = rtx_cost (y, SET, speed);
3504   else
3505     oldcost = rtx_cost (force_const_mem (dstmode, y), SET, speed);
3506
3507   for (srcmode = GET_CLASS_NARROWEST_MODE (GET_MODE_CLASS (orig_srcmode));
3508        srcmode != orig_srcmode;
3509        srcmode = GET_MODE_WIDER_MODE (srcmode))
3510     {
3511       enum insn_code ic;
3512       rtx trunc_y, last_insn;
3513
3514       /* Skip if the target can't extend this way.  */
3515       ic = can_extend_p (dstmode, srcmode, 0);
3516       if (ic == CODE_FOR_nothing)
3517         continue;
3518
3519       /* Skip if the narrowed value isn't exact.  */
3520       if (! exact_real_truncate (srcmode, &r))
3521         continue;
3522
3523       trunc_y = CONST_DOUBLE_FROM_REAL_VALUE (r, srcmode);
3524
3525       if (LEGITIMATE_CONSTANT_P (trunc_y))
3526         {
3527           /* Skip if the target needs extra instructions to perform
3528              the extension.  */
3529           if (! (*insn_data[ic].operand[1].predicate) (trunc_y, srcmode))
3530             continue;
3531           /* This is valid, but may not be cheaper than the original. */
3532           newcost = rtx_cost (gen_rtx_FLOAT_EXTEND (dstmode, trunc_y), SET, speed);
3533           if (oldcost < newcost)
3534             continue;
3535         }
3536       else if (float_extend_from_mem[dstmode][srcmode])
3537         {
3538           trunc_y = force_const_mem (srcmode, trunc_y);
3539           /* This is valid, but may not be cheaper than the original. */
3540           newcost = rtx_cost (gen_rtx_FLOAT_EXTEND (dstmode, trunc_y), SET, speed);
3541           if (oldcost < newcost)
3542             continue;
3543           trunc_y = validize_mem (trunc_y);
3544         }
3545       else
3546         continue;
3547
3548       /* For CSE's benefit, force the compressed constant pool entry
3549          into a new pseudo.  This constant may be used in different modes,
3550          and if not, combine will put things back together for us.  */
3551       trunc_y = force_reg (srcmode, trunc_y);
3552       emit_unop_insn (ic, x, trunc_y, UNKNOWN);
3553       last_insn = get_last_insn ();
3554
3555       if (REG_P (x))
3556         set_unique_reg_note (last_insn, REG_EQUAL, y);
3557
3558       return last_insn;
3559     }
3560
3561   return NULL_RTX;
3562 }
3563 \f
3564 /* Pushing data onto the stack.  */
3565
3566 /* Push a block of length SIZE (perhaps variable)
3567    and return an rtx to address the beginning of the block.
3568    The value may be virtual_outgoing_args_rtx.
3569
3570    EXTRA is the number of bytes of padding to push in addition to SIZE.
3571    BELOW nonzero means this padding comes at low addresses;
3572    otherwise, the padding comes at high addresses.  */
3573
3574 rtx
3575 push_block (rtx size, int extra, int below)
3576 {
3577   rtx temp;
3578
3579   size = convert_modes (Pmode, ptr_mode, size, 1);
3580   if (CONSTANT_P (size))
3581     anti_adjust_stack (plus_constant (size, extra));
3582   else if (REG_P (size) && extra == 0)
3583     anti_adjust_stack (size);
3584   else
3585     {
3586       temp = copy_to_mode_reg (Pmode, size);
3587       if (extra != 0)
3588         temp = expand_binop (Pmode, add_optab, temp, GEN_INT (extra),
3589                              temp, 0, OPTAB_LIB_WIDEN);
3590       anti_adjust_stack (temp);
3591     }
3592
3593 #ifndef STACK_GROWS_DOWNWARD
3594   if (0)
3595 #else
3596   if (1)
3597 #endif
3598     {
3599       temp = virtual_outgoing_args_rtx;
3600       if (extra != 0 && below)
3601         temp = plus_constant (temp, extra);
3602     }
3603   else
3604     {
3605       if (CONST_INT_P (size))
3606         temp = plus_constant (virtual_outgoing_args_rtx,
3607                               -INTVAL (size) - (below ? 0 : extra));
3608       else if (extra != 0 && !below)
3609         temp = gen_rtx_PLUS (Pmode, virtual_outgoing_args_rtx,
3610                              negate_rtx (Pmode, plus_constant (size, extra)));
3611       else
3612         temp = gen_rtx_PLUS (Pmode, virtual_outgoing_args_rtx,
3613                              negate_rtx (Pmode, size));
3614     }
3615
3616   return memory_address (GET_CLASS_NARROWEST_MODE (MODE_INT), temp);
3617 }
3618
3619 #ifdef PUSH_ROUNDING
3620
3621 /* Emit single push insn.  */
3622
3623 static void
3624 emit_single_push_insn (enum machine_mode mode, rtx x, tree type)
3625 {
3626   rtx dest_addr;
3627   unsigned rounded_size = PUSH_ROUNDING (GET_MODE_SIZE (mode));
3628   rtx dest;
3629   enum insn_code icode;
3630   insn_operand_predicate_fn pred;
3631
3632   stack_pointer_delta += PUSH_ROUNDING (GET_MODE_SIZE (mode));
3633   /* If there is push pattern, use it.  Otherwise try old way of throwing
3634      MEM representing push operation to move expander.  */
3635   icode = optab_handler (push_optab, mode)->insn_code;
3636   if (icode != CODE_FOR_nothing)
3637     {
3638       if (((pred = insn_data[(int) icode].operand[0].predicate)
3639            && !((*pred) (x, mode))))
3640         x = force_reg (mode, x);
3641       emit_insn (GEN_FCN (icode) (x));
3642       return;
3643     }
3644   if (GET_MODE_SIZE (mode) == rounded_size)
3645     dest_addr = gen_rtx_fmt_e (STACK_PUSH_CODE, Pmode, stack_pointer_rtx);
3646   /* If we are to pad downward, adjust the stack pointer first and
3647      then store X into the stack location using an offset.  This is
3648      because emit_move_insn does not know how to pad; it does not have
3649      access to type.  */
3650   else if (FUNCTION_ARG_PADDING (mode, type) == downward)
3651     {
3652       unsigned padding_size = rounded_size - GET_MODE_SIZE (mode);
3653       HOST_WIDE_INT offset;
3654
3655       emit_move_insn (stack_pointer_rtx,
3656                       expand_binop (Pmode,
3657 #ifdef STACK_GROWS_DOWNWARD
3658                                     sub_optab,
3659 #else
3660                                     add_optab,
3661 #endif
3662                                     stack_pointer_rtx,
3663                                     GEN_INT (rounded_size),
3664                                     NULL_RTX, 0, OPTAB_LIB_WIDEN));
3665
3666       offset = (HOST_WIDE_INT) padding_size;
3667 #ifdef STACK_GROWS_DOWNWARD
3668       if (STACK_PUSH_CODE == POST_DEC)
3669         /* We have already decremented the stack pointer, so get the
3670            previous value.  */
3671         offset += (HOST_WIDE_INT) rounded_size;
3672 #else
3673       if (STACK_PUSH_CODE == POST_INC)
3674         /* We have already incremented the stack pointer, so get the
3675            previous value.  */
3676         offset -= (HOST_WIDE_INT) rounded_size;
3677 #endif
3678       dest_addr = gen_rtx_PLUS (Pmode, stack_pointer_rtx, GEN_INT (offset));
3679     }
3680   else
3681     {
3682 #ifdef STACK_GROWS_DOWNWARD
3683       /* ??? This seems wrong if STACK_PUSH_CODE == POST_DEC.  */
3684       dest_addr = gen_rtx_PLUS (Pmode, stack_pointer_rtx,
3685                                 GEN_INT (-(HOST_WIDE_INT) rounded_size));
3686 #else
3687       /* ??? This seems wrong if STACK_PUSH_CODE == POST_INC.  */
3688       dest_addr = gen_rtx_PLUS (Pmode, stack_pointer_rtx,
3689                                 GEN_INT (rounded_size));
3690 #endif
3691       dest_addr = gen_rtx_PRE_MODIFY (Pmode, stack_pointer_rtx, dest_addr);
3692     }
3693
3694   dest = gen_rtx_MEM (mode, dest_addr);
3695
3696   if (type != 0)
3697     {
3698       set_mem_attributes (dest, type, 1);
3699
3700       if (flag_optimize_sibling_calls)
3701         /* Function incoming arguments may overlap with sibling call
3702            outgoing arguments and we cannot allow reordering of reads
3703            from function arguments with stores to outgoing arguments
3704            of sibling calls.  */
3705         set_mem_alias_set (dest, 0);
3706     }
3707   emit_move_insn (dest, x);
3708 }
3709 #endif
3710
3711 /* Generate code to push X onto the stack, assuming it has mode MODE and
3712    type TYPE.
3713    MODE is redundant except when X is a CONST_INT (since they don't
3714    carry mode info).
3715    SIZE is an rtx for the size of data to be copied (in bytes),
3716    needed only if X is BLKmode.
3717
3718    ALIGN (in bits) is maximum alignment we can assume.
3719
3720    If PARTIAL and REG are both nonzero, then copy that many of the first
3721    bytes of X into registers starting with REG, and push the rest of X.
3722    The amount of space pushed is decreased by PARTIAL bytes.
3723    REG must be a hard register in this case.
3724    If REG is zero but PARTIAL is not, take any all others actions for an
3725    argument partially in registers, but do not actually load any
3726    registers.
3727
3728    EXTRA is the amount in bytes of extra space to leave next to this arg.
3729    This is ignored if an argument block has already been allocated.
3730
3731    On a machine that lacks real push insns, ARGS_ADDR is the address of
3732    the bottom of the argument block for this call.  We use indexing off there
3733    to store the arg.  On machines with push insns, ARGS_ADDR is 0 when a
3734    argument block has not been preallocated.
3735
3736    ARGS_SO_FAR is the size of args previously pushed for this call.
3737
3738    REG_PARM_STACK_SPACE is nonzero if functions require stack space
3739    for arguments passed in registers.  If nonzero, it will be the number
3740    of bytes required.  */
3741
3742 void
3743 emit_push_insn (rtx x, enum machine_mode mode, tree type, rtx size,
3744                 unsigned int align, int partial, rtx reg, int extra,
3745                 rtx args_addr, rtx args_so_far, int reg_parm_stack_space,
3746                 rtx alignment_pad)
3747 {
3748   rtx xinner;
3749   enum direction stack_direction
3750 #ifdef STACK_GROWS_DOWNWARD
3751     = downward;
3752 #else
3753     = upward;
3754 #endif
3755
3756   /* Decide where to pad the argument: `downward' for below,
3757      `upward' for above, or `none' for don't pad it.
3758      Default is below for small data on big-endian machines; else above.  */
3759   enum direction where_pad = FUNCTION_ARG_PADDING (mode, type);
3760
3761   /* Invert direction if stack is post-decrement.
3762      FIXME: why?  */
3763   if (STACK_PUSH_CODE == POST_DEC)
3764     if (where_pad != none)
3765       where_pad = (where_pad == downward ? upward : downward);
3766
3767   xinner = x;
3768
3769   if (mode == BLKmode
3770       || (STRICT_ALIGNMENT && align < GET_MODE_ALIGNMENT (mode)))
3771     {
3772       /* Copy a block into the stack, entirely or partially.  */
3773
3774       rtx temp;
3775       int used;
3776       int offset;
3777       int skip;
3778
3779       offset = partial % (PARM_BOUNDARY / BITS_PER_UNIT);
3780       used = partial - offset;
3781
3782       if (mode != BLKmode)
3783         {
3784           /* A value is to be stored in an insufficiently aligned
3785              stack slot; copy via a suitably aligned slot if
3786              necessary.  */
3787           size = GEN_INT (GET_MODE_SIZE (mode));
3788           if (!MEM_P (xinner))
3789             {
3790               temp = assign_temp (type, 0, 1, 1);
3791               emit_move_insn (temp, xinner);
3792               xinner = temp;
3793             }
3794         }
3795
3796       gcc_assert (size);
3797
3798       /* USED is now the # of bytes we need not copy to the stack
3799          because registers will take care of them.  */
3800
3801       if (partial != 0)
3802         xinner = adjust_address (xinner, BLKmode, used);
3803
3804       /* If the partial register-part of the arg counts in its stack size,
3805          skip the part of stack space corresponding to the registers.
3806          Otherwise, start copying to the beginning of the stack space,
3807          by setting SKIP to 0.  */
3808       skip = (reg_parm_stack_space == 0) ? 0 : used;
3809
3810 #ifdef PUSH_ROUNDING
3811       /* Do it with several push insns if that doesn't take lots of insns
3812          and if there is no difficulty with push insns that skip bytes
3813          on the stack for alignment purposes.  */
3814       if (args_addr == 0
3815           && PUSH_ARGS
3816           && CONST_INT_P (size)
3817           && skip == 0
3818           && MEM_ALIGN (xinner) >= align
3819           && (MOVE_BY_PIECES_P ((unsigned) INTVAL (size) - used, align))
3820           /* Here we avoid the case of a structure whose weak alignment
3821              forces many pushes of a small amount of data,
3822              and such small pushes do rounding that causes trouble.  */
3823           && ((! SLOW_UNALIGNED_ACCESS (word_mode, align))
3824               || align >= BIGGEST_ALIGNMENT
3825               || (PUSH_ROUNDING (align / BITS_PER_UNIT)
3826                   == (align / BITS_PER_UNIT)))
3827           && PUSH_ROUNDING (INTVAL (size)) == INTVAL (size))
3828         {
3829           /* Push padding now if padding above and stack grows down,
3830              or if padding below and stack grows up.
3831              But if space already allocated, this has already been done.  */
3832           if (extra && args_addr == 0
3833               && where_pad != none && where_pad != stack_direction)
3834             anti_adjust_stack (GEN_INT (extra));
3835
3836           move_by_pieces (NULL, xinner, INTVAL (size) - used, align, 0);
3837         }
3838       else
3839 #endif /* PUSH_ROUNDING  */
3840         {
3841           rtx target;
3842
3843           /* Otherwise make space on the stack and copy the data
3844              to the address of that space.  */
3845
3846           /* Deduct words put into registers from the size we must copy.  */
3847           if (partial != 0)
3848             {
3849               if (CONST_INT_P (size))
3850                 size = GEN_INT (INTVAL (size) - used);
3851               else
3852                 size = expand_binop (GET_MODE (size), sub_optab, size,
3853                                      GEN_INT (used), NULL_RTX, 0,
3854                                      OPTAB_LIB_WIDEN);
3855             }
3856
3857           /* Get the address of the stack space.
3858              In this case, we do not deal with EXTRA separately.
3859              A single stack adjust will do.  */
3860           if (! args_addr)
3861             {
3862               temp = push_block (size, extra, where_pad == downward);
3863               extra = 0;
3864             }
3865           else if (CONST_INT_P (args_so_far))
3866             temp = memory_address (BLKmode,
3867                                    plus_constant (args_addr,
3868                                                   skip + INTVAL (args_so_far)));
3869           else
3870             temp = memory_address (BLKmode,
3871                                    plus_constant (gen_rtx_PLUS (Pmode,
3872                                                                 args_addr,
3873                                                                 args_so_far),
3874                                                   skip));
3875
3876           if (!ACCUMULATE_OUTGOING_ARGS)
3877             {
3878               /* If the source is referenced relative to the stack pointer,
3879                  copy it to another register to stabilize it.  We do not need
3880                  to do this if we know that we won't be changing sp.  */
3881
3882               if (reg_mentioned_p (virtual_stack_dynamic_rtx, temp)
3883                   || reg_mentioned_p (virtual_outgoing_args_rtx, temp))
3884                 temp = copy_to_reg (temp);
3885             }
3886
3887           target = gen_rtx_MEM (BLKmode, temp);
3888
3889           /* We do *not* set_mem_attributes here, because incoming arguments
3890              may overlap with sibling call outgoing arguments and we cannot
3891              allow reordering of reads from function arguments with stores
3892              to outgoing arguments of sibling calls.  We do, however, want
3893              to record the alignment of the stack slot.  */
3894           /* ALIGN may well be better aligned than TYPE, e.g. due to
3895              PARM_BOUNDARY.  Assume the caller isn't lying.  */
3896           set_mem_align (target, align);
3897
3898           emit_block_move (target, xinner, size, BLOCK_OP_CALL_PARM);
3899         }
3900     }
3901   else if (partial > 0)
3902     {
3903       /* Scalar partly in registers.  */
3904
3905       int size = GET_MODE_SIZE (mode) / UNITS_PER_WORD;
3906       int i;
3907       int not_stack;
3908       /* # bytes of start of argument
3909          that we must make space for but need not store.  */
3910       int offset = partial % (PARM_BOUNDARY / BITS_PER_UNIT);
3911       int args_offset = INTVAL (args_so_far);
3912       int skip;
3913
3914       /* Push padding now if padding above and stack grows down,
3915          or if padding below and stack grows up.
3916          But if space already allocated, this has already been done.  */
3917       if (extra && args_addr == 0
3918           && where_pad != none && where_pad != stack_direction)
3919         anti_adjust_stack (GEN_INT (extra));
3920
3921       /* If we make space by pushing it, we might as well push
3922          the real data.  Otherwise, we can leave OFFSET nonzero
3923          and leave the space uninitialized.  */
3924       if (args_addr == 0)
3925         offset = 0;
3926
3927       /* Now NOT_STACK gets the number of words that we don't need to
3928          allocate on the stack.  Convert OFFSET to words too.  */
3929       not_stack = (partial - offset) / UNITS_PER_WORD;
3930       offset /= UNITS_PER_WORD;
3931
3932       /* If the partial register-part of the arg counts in its stack size,
3933          skip the part of stack space corresponding to the registers.
3934          Otherwise, start copying to the beginning of the stack space,
3935          by setting SKIP to 0.  */
3936       skip = (reg_parm_stack_space == 0) ? 0 : not_stack;
3937
3938       if (CONSTANT_P (x) && ! LEGITIMATE_CONSTANT_P (x))
3939         x = validize_mem (force_const_mem (mode, x));
3940
3941       /* If X is a hard register in a non-integer mode, copy it into a pseudo;
3942          SUBREGs of such registers are not allowed.  */
3943       if ((REG_P (x) && REGNO (x) < FIRST_PSEUDO_REGISTER
3944            && GET_MODE_CLASS (GET_MODE (x)) != MODE_INT))
3945         x = copy_to_reg (x);
3946
3947       /* Loop over all the words allocated on the stack for this arg.  */
3948       /* We can do it by words, because any scalar bigger than a word
3949          has a size a multiple of a word.  */
3950 #ifndef PUSH_ARGS_REVERSED
3951       for (i = not_stack; i < size; i++)
3952 #else
3953       for (i = size - 1; i >= not_stack; i--)
3954 #endif
3955         if (i >= not_stack + offset)
3956           emit_push_insn (operand_subword_force (x, i, mode),
3957                           word_mode, NULL_TREE, NULL_RTX, align, 0, NULL_RTX,
3958                           0, args_addr,
3959                           GEN_INT (args_offset + ((i - not_stack + skip)
3960                                                   * UNITS_PER_WORD)),
3961                           reg_parm_stack_space, alignment_pad);
3962     }
3963   else
3964     {
3965       rtx addr;
3966       rtx dest;
3967
3968       /* Push padding now if padding above and stack grows down,
3969          or if padding below and stack grows up.
3970          But if space already allocated, this has already been done.  */
3971       if (extra && args_addr == 0
3972           && where_pad != none && where_pad != stack_direction)
3973         anti_adjust_stack (GEN_INT (extra));
3974
3975 #ifdef PUSH_ROUNDING
3976       if (args_addr == 0 && PUSH_ARGS)
3977         emit_single_push_insn (mode, x, type);
3978       else
3979 #endif
3980         {
3981           if (CONST_INT_P (args_so_far))
3982             addr
3983               = memory_address (mode,
3984                                 plus_constant (args_addr,
3985                                                INTVAL (args_so_far)));
3986           else
3987             addr = memory_address (mode, gen_rtx_PLUS (Pmode, args_addr,
3988                                                        args_so_far));
3989           dest = gen_rtx_MEM (mode, addr);
3990
3991           /* We do *not* set_mem_attributes here, because incoming arguments
3992              may overlap with sibling call outgoing arguments and we cannot
3993              allow reordering of reads from function arguments with stores
3994              to outgoing arguments of sibling calls.  We do, however, want
3995              to record the alignment of the stack slot.  */
3996           /* ALIGN may well be better aligned than TYPE, e.g. due to
3997              PARM_BOUNDARY.  Assume the caller isn't lying.  */
3998           set_mem_align (dest, align);
3999
4000           emit_move_insn (dest, x);
4001         }
4002     }
4003
4004   /* If part should go in registers, copy that part
4005      into the appropriate registers.  Do this now, at the end,
4006      since mem-to-mem copies above may do function calls.  */
4007   if (partial > 0 && reg != 0)
4008     {
4009       /* Handle calls that pass values in multiple non-contiguous locations.
4010          The Irix 6 ABI has examples of this.  */
4011       if (GET_CODE (reg) == PARALLEL)
4012         emit_group_load (reg, x, type, -1);
4013       else
4014         {
4015           gcc_assert (partial % UNITS_PER_WORD == 0);
4016           move_block_to_reg (REGNO (reg), x, partial / UNITS_PER_WORD, mode);
4017         }
4018     }
4019
4020   if (extra && args_addr == 0 && where_pad == stack_direction)
4021     anti_adjust_stack (GEN_INT (extra));
4022
4023   if (alignment_pad && args_addr == 0)
4024     anti_adjust_stack (alignment_pad);
4025 }
4026 \f
4027 /* Return X if X can be used as a subtarget in a sequence of arithmetic
4028    operations.  */
4029
4030 static rtx
4031 get_subtarget (rtx x)
4032 {
4033   return (optimize
4034           || x == 0
4035            /* Only registers can be subtargets.  */
4036            || !REG_P (x)
4037            /* Don't use hard regs to avoid extending their life.  */
4038            || REGNO (x) < FIRST_PSEUDO_REGISTER
4039           ? 0 : x);
4040 }
4041
4042 /* A subroutine of expand_assignment.  Optimize FIELD op= VAL, where
4043    FIELD is a bitfield.  Returns true if the optimization was successful,
4044    and there's nothing else to do.  */
4045
4046 static bool
4047 optimize_bitfield_assignment_op (unsigned HOST_WIDE_INT bitsize,
4048                                  unsigned HOST_WIDE_INT bitpos,
4049                                  enum machine_mode mode1, rtx str_rtx,
4050                                  tree to, tree src)
4051 {
4052   enum machine_mode str_mode = GET_MODE (str_rtx);
4053   unsigned int str_bitsize = GET_MODE_BITSIZE (str_mode);
4054   tree op0, op1;
4055   rtx value, result;
4056   optab binop;
4057
4058   if (mode1 != VOIDmode
4059       || bitsize >= BITS_PER_WORD
4060       || str_bitsize > BITS_PER_WORD
4061       || TREE_SIDE_EFFECTS (to)
4062       || TREE_THIS_VOLATILE (to))
4063     return false;
4064
4065   STRIP_NOPS (src);
4066   if (!BINARY_CLASS_P (src)
4067       || TREE_CODE (TREE_TYPE (src)) != INTEGER_TYPE)
4068     return false;
4069
4070   op0 = TREE_OPERAND (src, 0);
4071   op1 = TREE_OPERAND (src, 1);
4072   STRIP_NOPS (op0);
4073
4074   if (!operand_equal_p (to, op0, 0))
4075     return false;
4076
4077   if (MEM_P (str_rtx))
4078     {
4079       unsigned HOST_WIDE_INT offset1;
4080
4081       if (str_bitsize == 0 || str_bitsize > BITS_PER_WORD)
4082         str_mode = word_mode;
4083       str_mode = get_best_mode (bitsize, bitpos,
4084                                 MEM_ALIGN (str_rtx), str_mode, 0);
4085       if (str_mode == VOIDmode)
4086         return false;
4087       str_bitsize = GET_MODE_BITSIZE (str_mode);
4088
4089       offset1 = bitpos;
4090       bitpos %= str_bitsize;
4091       offset1 = (offset1 - bitpos) / BITS_PER_UNIT;
4092       str_rtx = adjust_address (str_rtx, str_mode, offset1);
4093     }
4094   else if (!REG_P (str_rtx) && GET_CODE (str_rtx) != SUBREG)
4095     return false;
4096
4097   /* If the bit field covers the whole REG/MEM, store_field
4098      will likely generate better code.  */
4099   if (bitsize >= str_bitsize)
4100     return false;
4101
4102   /* We can't handle fields split across multiple entities.  */
4103   if (bitpos + bitsize > str_bitsize)
4104     return false;
4105
4106   if (BYTES_BIG_ENDIAN)
4107     bitpos = str_bitsize - bitpos - bitsize;
4108
4109   switch (TREE_CODE (src))
4110     {
4111     case PLUS_EXPR:
4112     case MINUS_EXPR:
4113       /* For now, just optimize the case of the topmost bitfield
4114          where we don't need to do any masking and also
4115          1 bit bitfields where xor can be used.
4116          We might win by one instruction for the other bitfields
4117          too if insv/extv instructions aren't used, so that
4118          can be added later.  */
4119       if (bitpos + bitsize != str_bitsize
4120           && (bitsize != 1 || TREE_CODE (op1) != INTEGER_CST))
4121         break;
4122
4123       value = expand_expr (op1, NULL_RTX, str_mode, EXPAND_NORMAL);
4124       value = convert_modes (str_mode,
4125                              TYPE_MODE (TREE_TYPE (op1)), value,
4126                              TYPE_UNSIGNED (TREE_TYPE (op1)));
4127
4128       /* We may be accessing data outside the field, which means
4129          we can alias adjacent data.  */
4130       if (MEM_P (str_rtx))
4131         {
4132           str_rtx = shallow_copy_rtx (str_rtx);
4133           set_mem_alias_set (str_rtx, 0);
4134           set_mem_expr (str_rtx, 0);
4135         }
4136
4137       binop = TREE_CODE (src) == PLUS_EXPR ? add_optab : sub_optab;
4138       if (bitsize == 1 && bitpos + bitsize != str_bitsize)
4139         {
4140           value = expand_and (str_mode, value, const1_rtx, NULL);
4141           binop = xor_optab;
4142         }
4143       value = expand_shift (LSHIFT_EXPR, str_mode, value,
4144                             build_int_cst (NULL_TREE, bitpos),
4145                             NULL_RTX, 1);
4146       result = expand_binop (str_mode, binop, str_rtx,
4147                              value, str_rtx, 1, OPTAB_WIDEN);
4148       if (result != str_rtx)
4149         emit_move_insn (str_rtx, result);
4150       return true;
4151
4152     case BIT_IOR_EXPR:
4153     case BIT_XOR_EXPR:
4154       if (TREE_CODE (op1) != INTEGER_CST)
4155         break;
4156       value = expand_expr (op1, NULL_RTX, GET_MODE (str_rtx), EXPAND_NORMAL);
4157       value = convert_modes (GET_MODE (str_rtx),
4158                              TYPE_MODE (TREE_TYPE (op1)), value,
4159                              TYPE_UNSIGNED (TREE_TYPE (op1)));
4160
4161       /* We may be accessing data outside the field, which means
4162          we can alias adjacent data.  */
4163       if (MEM_P (str_rtx))
4164         {
4165           str_rtx = shallow_copy_rtx (str_rtx);
4166           set_mem_alias_set (str_rtx, 0);
4167           set_mem_expr (str_rtx, 0);
4168         }
4169
4170       binop = TREE_CODE (src) == BIT_IOR_EXPR ? ior_optab : xor_optab;
4171       if (bitpos + bitsize != GET_MODE_BITSIZE (GET_MODE (str_rtx)))
4172         {
4173           rtx mask = GEN_INT (((unsigned HOST_WIDE_INT) 1 << bitsize)
4174                               - 1);
4175           value = expand_and (GET_MODE (str_rtx), value, mask,
4176                               NULL_RTX);
4177         }
4178       value = expand_shift (LSHIFT_EXPR, GET_MODE (str_rtx), value,
4179                             build_int_cst (NULL_TREE, bitpos),
4180                             NULL_RTX, 1);
4181       result = expand_binop (GET_MODE (str_rtx), binop, str_rtx,
4182                              value, str_rtx, 1, OPTAB_WIDEN);
4183       if (result != str_rtx)
4184         emit_move_insn (str_rtx, result);
4185       return true;
4186
4187     default:
4188       break;
4189     }
4190
4191   return false;
4192 }
4193
4194
4195 /* Expand an assignment that stores the value of FROM into TO.  If NONTEMPORAL
4196    is true, try generating a nontemporal store.  */
4197
4198 void
4199 expand_assignment (tree to, tree from, bool nontemporal)
4200 {
4201   rtx to_rtx = 0;
4202   rtx result;
4203
4204   /* Don't crash if the lhs of the assignment was erroneous.  */
4205   if (TREE_CODE (to) == ERROR_MARK)
4206     {
4207       result = expand_normal (from);
4208       return;
4209     }
4210
4211   /* Optimize away no-op moves without side-effects.  */
4212   if (operand_equal_p (to, from, 0))
4213     return;
4214
4215   /* Assignment of a structure component needs special treatment
4216      if the structure component's rtx is not simply a MEM.
4217      Assignment of an array element at a constant index, and assignment of
4218      an array element in an unaligned packed structure field, has the same
4219      problem.  */
4220   if (handled_component_p (to)
4221       || TREE_CODE (TREE_TYPE (to)) == ARRAY_TYPE)
4222     {
4223       enum machine_mode mode1;
4224       HOST_WIDE_INT bitsize, bitpos;
4225       tree offset;
4226       int unsignedp;
4227       int volatilep = 0;
4228       tree tem;
4229
4230       push_temp_slots ();
4231       tem = get_inner_reference (to, &bitsize, &bitpos, &offset, &mode1,
4232                                  &unsignedp, &volatilep, true);
4233
4234       /* If we are going to use store_bit_field and extract_bit_field,
4235          make sure to_rtx will be safe for multiple use.  */
4236
4237       to_rtx = expand_normal (tem);
4238
4239       if (offset != 0)
4240         {
4241           enum machine_mode address_mode;
4242           rtx offset_rtx;
4243
4244           if (!MEM_P (to_rtx))
4245             {
4246               /* We can get constant negative offsets into arrays with broken
4247                  user code.  Translate this to a trap instead of ICEing.  */
4248               gcc_assert (TREE_CODE (offset) == INTEGER_CST);
4249               expand_builtin_trap ();
4250               to_rtx = gen_rtx_MEM (BLKmode, const0_rtx);
4251             }
4252
4253           offset_rtx = expand_expr (offset, NULL_RTX, VOIDmode, EXPAND_SUM);
4254           address_mode
4255             = targetm.addr_space.address_mode (MEM_ADDR_SPACE (to_rtx));
4256           if (GET_MODE (offset_rtx) != address_mode)
4257             offset_rtx = convert_to_mode (address_mode, offset_rtx, 0);
4258
4259           /* A constant address in TO_RTX can have VOIDmode, we must not try
4260              to call force_reg for that case.  Avoid that case.  */
4261           if (MEM_P (to_rtx)
4262               && GET_MODE (to_rtx) == BLKmode
4263               && GET_MODE (XEXP (to_rtx, 0)) != VOIDmode
4264               && bitsize > 0
4265               && (bitpos % bitsize) == 0
4266               && (bitsize % GET_MODE_ALIGNMENT (mode1)) == 0
4267               && MEM_ALIGN (to_rtx) == GET_MODE_ALIGNMENT (mode1))
4268             {
4269               to_rtx = adjust_address (to_rtx, mode1, bitpos / BITS_PER_UNIT);
4270               bitpos = 0;
4271             }
4272
4273           to_rtx = offset_address (to_rtx, offset_rtx,
4274                                    highest_pow2_factor_for_target (to,
4275                                                                    offset));
4276         }
4277
4278       /* Handle expand_expr of a complex value returning a CONCAT.  */
4279       if (GET_CODE (to_rtx) == CONCAT)
4280         {
4281           if (COMPLEX_MODE_P (TYPE_MODE (TREE_TYPE (from))))
4282             {
4283               gcc_assert (bitpos == 0);
4284               result = store_expr (from, to_rtx, false, nontemporal);
4285             }
4286           else
4287             {
4288               gcc_assert (bitpos == 0 || bitpos == GET_MODE_BITSIZE (mode1));
4289               result = store_expr (from, XEXP (to_rtx, bitpos != 0), false,
4290                                    nontemporal);
4291             }
4292         }
4293       else
4294         {
4295           if (MEM_P (to_rtx))
4296             {
4297               /* If the field is at offset zero, we could have been given the
4298                  DECL_RTX of the parent struct.  Don't munge it.  */
4299               to_rtx = shallow_copy_rtx (to_rtx);
4300
4301               set_mem_attributes_minus_bitpos (to_rtx, to, 0, bitpos);
4302
4303               /* Deal with volatile and readonly fields.  The former is only
4304                  done for MEM.  Also set MEM_KEEP_ALIAS_SET_P if needed.  */
4305               if (volatilep)
4306                 MEM_VOLATILE_P (to_rtx) = 1;
4307               if (component_uses_parent_alias_set (to))
4308                 MEM_KEEP_ALIAS_SET_P (to_rtx) = 1;
4309             }
4310
4311           if (optimize_bitfield_assignment_op (bitsize, bitpos, mode1,
4312                                                to_rtx, to, from))
4313             result = NULL;
4314           else
4315             result = store_field (to_rtx, bitsize, bitpos, mode1, from,
4316                                   TREE_TYPE (tem), get_alias_set (to),
4317                                   nontemporal);
4318         }
4319
4320       if (result)
4321         preserve_temp_slots (result);
4322       free_temp_slots ();
4323       pop_temp_slots ();
4324       return;
4325     }
4326
4327    else if (TREE_CODE (to) == MISALIGNED_INDIRECT_REF)
4328      {
4329        addr_space_t as = ADDR_SPACE_GENERIC;
4330        enum machine_mode mode, op_mode1;
4331        enum insn_code icode;
4332        rtx reg, addr, mem, insn;
4333
4334        if (POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (to, 0))))
4335          as = TYPE_ADDR_SPACE (TREE_TYPE (TREE_TYPE (TREE_OPERAND (to, 0))));
4336
4337        reg = expand_expr (from, NULL_RTX, VOIDmode, EXPAND_NORMAL);
4338        reg = force_not_mem (reg);
4339
4340        mode = TYPE_MODE (TREE_TYPE (to));
4341        addr = expand_expr (TREE_OPERAND (to, 0), NULL_RTX, VOIDmode,
4342                          EXPAND_SUM);
4343        addr = memory_address_addr_space (mode, addr, as);
4344        mem = gen_rtx_MEM (mode, addr);
4345
4346        set_mem_attributes (mem, to, 0);
4347        set_mem_addr_space (mem, as);
4348
4349        icode = movmisalign_optab->handlers[mode].insn_code;
4350        gcc_assert (icode != CODE_FOR_nothing);
4351
4352        op_mode1 = insn_data[icode].operand[1].mode;
4353        if (! (*insn_data[icode].operand[1].predicate) (reg, op_mode1)
4354            && op_mode1 != VOIDmode)
4355          reg = copy_to_mode_reg (op_mode1, reg);
4356
4357       insn = GEN_FCN (icode) (mem, reg);
4358        emit_insn (insn);
4359        return;
4360      }
4361
4362   /* If the rhs is a function call and its value is not an aggregate,
4363      call the function before we start to compute the lhs.
4364      This is needed for correct code for cases such as
4365      val = setjmp (buf) on machines where reference to val
4366      requires loading up part of an address in a separate insn.
4367
4368      Don't do this if TO is a VAR_DECL or PARM_DECL whose DECL_RTL is REG
4369      since it might be a promoted variable where the zero- or sign- extension
4370      needs to be done.  Handling this in the normal way is safe because no
4371      computation is done before the call.  The same is true for SSA names.  */
4372   if (TREE_CODE (from) == CALL_EXPR && ! aggregate_value_p (from, from)
4373       && COMPLETE_TYPE_P (TREE_TYPE (from))
4374       && TREE_CODE (TYPE_SIZE (TREE_TYPE (from))) == INTEGER_CST
4375       && ! (((TREE_CODE (to) == VAR_DECL || TREE_CODE (to) == PARM_DECL)
4376              && REG_P (DECL_RTL (to)))
4377             || TREE_CODE (to) == SSA_NAME))
4378     {
4379       rtx value;
4380
4381       push_temp_slots ();
4382       value = expand_normal (from);
4383       if (to_rtx == 0)
4384         to_rtx = expand_expr (to, NULL_RTX, VOIDmode, EXPAND_WRITE);
4385
4386       /* Handle calls that return values in multiple non-contiguous locations.
4387          The Irix 6 ABI has examples of this.  */
4388       if (GET_CODE (to_rtx) == PARALLEL)
4389         emit_group_load (to_rtx, value, TREE_TYPE (from),
4390                          int_size_in_bytes (TREE_TYPE (from)));
4391       else if (GET_MODE (to_rtx) == BLKmode)
4392         emit_block_move (to_rtx, value, expr_size (from), BLOCK_OP_NORMAL);
4393       else
4394         {
4395           if (POINTER_TYPE_P (TREE_TYPE (to)))
4396             value = convert_memory_address_addr_space
4397                       (GET_MODE (to_rtx), value,
4398                        TYPE_ADDR_SPACE (TREE_TYPE (TREE_TYPE (to))));
4399
4400           emit_move_insn (to_rtx, value);
4401         }
4402       preserve_temp_slots (to_rtx);
4403       free_temp_slots ();
4404       pop_temp_slots ();
4405       return;
4406     }
4407
4408   /* Ordinary treatment.  Expand TO to get a REG or MEM rtx.
4409      Don't re-expand if it was expanded already (in COMPONENT_REF case).  */
4410
4411   if (to_rtx == 0)
4412     to_rtx = expand_expr (to, NULL_RTX, VOIDmode, EXPAND_WRITE);
4413
4414   /* Don't move directly into a return register.  */
4415   if (TREE_CODE (to) == RESULT_DECL
4416       && (REG_P (to_rtx) || GET_CODE (to_rtx) == PARALLEL))
4417     {
4418       rtx temp;
4419
4420       push_temp_slots ();
4421       temp = expand_expr (from, NULL_RTX, GET_MODE (to_rtx), EXPAND_NORMAL);
4422
4423       if (GET_CODE (to_rtx) == PARALLEL)
4424         emit_group_load (to_rtx, temp, TREE_TYPE (from),
4425                          int_size_in_bytes (TREE_TYPE (from)));
4426       else
4427         emit_move_insn (to_rtx, temp);
4428
4429       preserve_temp_slots (to_rtx);
4430       free_temp_slots ();
4431       pop_temp_slots ();
4432       return;
4433     }
4434
4435   /* In case we are returning the contents of an object which overlaps
4436      the place the value is being stored, use a safe function when copying
4437      a value through a pointer into a structure value return block.  */
4438   if (TREE_CODE (to) == RESULT_DECL
4439       && TREE_CODE (from) == INDIRECT_REF
4440       && ADDR_SPACE_GENERIC_P
4441            (TYPE_ADDR_SPACE (TREE_TYPE (TREE_TYPE (TREE_OPERAND (from, 0)))))
4442       && refs_may_alias_p (to, from)
4443       && cfun->returns_struct
4444       && !cfun->returns_pcc_struct)
4445     {
4446       rtx from_rtx, size;
4447
4448       push_temp_slots ();
4449       size = expr_size (from);
4450       from_rtx = expand_normal (from);
4451
4452       emit_library_call (memmove_libfunc, LCT_NORMAL,
4453                          VOIDmode, 3, XEXP (to_rtx, 0), Pmode,
4454                          XEXP (from_rtx, 0), Pmode,
4455                          convert_to_mode (TYPE_MODE (sizetype),
4456                                           size, TYPE_UNSIGNED (sizetype)),
4457                          TYPE_MODE (sizetype));
4458
4459       preserve_temp_slots (to_rtx);
4460       free_temp_slots ();
4461       pop_temp_slots ();
4462       return;
4463     }
4464
4465   /* Compute FROM and store the value in the rtx we got.  */
4466
4467   push_temp_slots ();
4468   result = store_expr (from, to_rtx, 0, nontemporal);
4469   preserve_temp_slots (result);
4470   free_temp_slots ();
4471   pop_temp_slots ();
4472   return;
4473 }
4474
4475 /* Emits nontemporal store insn that moves FROM to TO.  Returns true if this
4476    succeeded, false otherwise.  */
4477
4478 bool
4479 emit_storent_insn (rtx to, rtx from)
4480 {
4481   enum machine_mode mode = GET_MODE (to), imode;
4482   enum insn_code code = optab_handler (storent_optab, mode)->insn_code;
4483   rtx pattern;
4484
4485   if (code == CODE_FOR_nothing)
4486     return false;
4487
4488   imode = insn_data[code].operand[0].mode;
4489   if (!insn_data[code].operand[0].predicate (to, imode))
4490     return false;
4491
4492   imode = insn_data[code].operand[1].mode;
4493   if (!insn_data[code].operand[1].predicate (from, imode))
4494     {
4495       from = copy_to_mode_reg (imode, from);
4496       if (!insn_data[code].operand[1].predicate (from, imode))
4497         return false;
4498     }
4499
4500   pattern = GEN_FCN (code) (to, from);
4501   if (pattern == NULL_RTX)
4502     return false;
4503
4504   emit_insn (pattern);
4505   return true;
4506 }
4507
4508 /* Generate code for computing expression EXP,
4509    and storing the value into TARGET.
4510
4511    If the mode is BLKmode then we may return TARGET itself.
4512    It turns out that in BLKmode it doesn't cause a problem.
4513    because C has no operators that could combine two different
4514    assignments into the same BLKmode object with different values
4515    with no sequence point.  Will other languages need this to
4516    be more thorough?
4517
4518    If CALL_PARAM_P is nonzero, this is a store into a call param on the
4519    stack, and block moves may need to be treated specially.
4520
4521    If NONTEMPORAL is true, try using a nontemporal store instruction.  */
4522
4523 rtx
4524 store_expr (tree exp, rtx target, int call_param_p, bool nontemporal)
4525 {
4526   rtx temp;
4527   rtx alt_rtl = NULL_RTX;
4528   location_t loc = EXPR_LOCATION (exp);
4529
4530   if (VOID_TYPE_P (TREE_TYPE (exp)))
4531     {
4532       /* C++ can generate ?: expressions with a throw expression in one
4533          branch and an rvalue in the other. Here, we resolve attempts to
4534          store the throw expression's nonexistent result.  */
4535       gcc_assert (!call_param_p);
4536       expand_expr (exp, const0_rtx, VOIDmode, EXPAND_NORMAL);
4537       return NULL_RTX;
4538     }
4539   if (TREE_CODE (exp) == COMPOUND_EXPR)
4540     {
4541       /* Perform first part of compound expression, then assign from second
4542          part.  */
4543       expand_expr (TREE_OPERAND (exp, 0), const0_rtx, VOIDmode,
4544                    call_param_p ? EXPAND_STACK_PARM : EXPAND_NORMAL);
4545       return store_expr (TREE_OPERAND (exp, 1), target, call_param_p,
4546                          nontemporal);
4547     }
4548   else if (TREE_CODE (exp) == COND_EXPR && GET_MODE (target) == BLKmode)
4549     {
4550       /* For conditional expression, get safe form of the target.  Then
4551          test the condition, doing the appropriate assignment on either
4552          side.  This avoids the creation of unnecessary temporaries.
4553          For non-BLKmode, it is more efficient not to do this.  */
4554
4555       rtx lab1 = gen_label_rtx (), lab2 = gen_label_rtx ();
4556
4557       do_pending_stack_adjust ();
4558       NO_DEFER_POP;
4559       jumpifnot (TREE_OPERAND (exp, 0), lab1, -1);
4560       store_expr (TREE_OPERAND (exp, 1), target, call_param_p,
4561                   nontemporal);
4562       emit_jump_insn (gen_jump (lab2));
4563       emit_barrier ();
4564       emit_label (lab1);
4565       store_expr (TREE_OPERAND (exp, 2), target, call_param_p,
4566                   nontemporal);
4567       emit_label (lab2);
4568       OK_DEFER_POP;
4569
4570       return NULL_RTX;
4571     }
4572   else if (GET_CODE (target) == SUBREG && SUBREG_PROMOTED_VAR_P (target))
4573     /* If this is a scalar in a register that is stored in a wider mode
4574        than the declared mode, compute the result into its declared mode
4575        and then convert to the wider mode.  Our value is the computed
4576        expression.  */
4577     {
4578       rtx inner_target = 0;
4579
4580       /* We can do the conversion inside EXP, which will often result
4581          in some optimizations.  Do the conversion in two steps: first
4582          change the signedness, if needed, then the extend.  But don't
4583          do this if the type of EXP is a subtype of something else
4584          since then the conversion might involve more than just
4585          converting modes.  */
4586       if (INTEGRAL_TYPE_P (TREE_TYPE (exp))
4587           && TREE_TYPE (TREE_TYPE (exp)) == 0
4588           && GET_MODE_PRECISION (GET_MODE (target))
4589              == TYPE_PRECISION (TREE_TYPE (exp)))
4590         {
4591           if (TYPE_UNSIGNED (TREE_TYPE (exp))
4592               != SUBREG_PROMOTED_UNSIGNED_P (target))
4593             {
4594               /* Some types, e.g. Fortran's logical*4, won't have a signed
4595                  version, so use the mode instead.  */
4596               tree ntype
4597                 = (signed_or_unsigned_type_for
4598                    (SUBREG_PROMOTED_UNSIGNED_P (target), TREE_TYPE (exp)));
4599               if (ntype == NULL)
4600                 ntype = lang_hooks.types.type_for_mode
4601                   (TYPE_MODE (TREE_TYPE (exp)),
4602                    SUBREG_PROMOTED_UNSIGNED_P (target));
4603
4604               exp = fold_convert_loc (loc, ntype, exp);
4605             }
4606
4607           exp = fold_convert_loc (loc, lang_hooks.types.type_for_mode
4608                                   (GET_MODE (SUBREG_REG (target)),
4609                                    SUBREG_PROMOTED_UNSIGNED_P (target)),
4610                                   exp);
4611
4612           inner_target = SUBREG_REG (target);
4613         }
4614
4615       temp = expand_expr (exp, inner_target, VOIDmode,
4616                           call_param_p ? EXPAND_STACK_PARM : EXPAND_NORMAL);
4617
4618       /* If TEMP is a VOIDmode constant, use convert_modes to make
4619          sure that we properly convert it.  */
4620       if (CONSTANT_P (temp) && GET_MODE (temp) == VOIDmode)
4621         {
4622           temp = convert_modes (GET_MODE (target), TYPE_MODE (TREE_TYPE (exp)),
4623                                 temp, SUBREG_PROMOTED_UNSIGNED_P (target));
4624           temp = convert_modes (GET_MODE (SUBREG_REG (target)),
4625                                 GET_MODE (target), temp,
4626                                 SUBREG_PROMOTED_UNSIGNED_P (target));
4627         }
4628
4629       convert_move (SUBREG_REG (target), temp,
4630                     SUBREG_PROMOTED_UNSIGNED_P (target));
4631
4632       return NULL_RTX;
4633     }
4634   else if (TREE_CODE (exp) == STRING_CST
4635            && !nontemporal && !call_param_p
4636            && TREE_STRING_LENGTH (exp) > 0
4637            && TYPE_MODE (TREE_TYPE (exp)) == BLKmode)
4638     {
4639       /* Optimize initialization of an array with a STRING_CST.  */
4640       HOST_WIDE_INT exp_len, str_copy_len;
4641       rtx dest_mem;
4642
4643       exp_len = int_expr_size (exp);
4644       if (exp_len <= 0)
4645         goto normal_expr;
4646
4647       str_copy_len = strlen (TREE_STRING_POINTER (exp));
4648       if (str_copy_len < TREE_STRING_LENGTH (exp) - 1)
4649         goto normal_expr;
4650
4651       str_copy_len = TREE_STRING_LENGTH (exp);
4652       if ((STORE_MAX_PIECES & (STORE_MAX_PIECES - 1)) == 0)
4653         {
4654           str_copy_len += STORE_MAX_PIECES - 1;
4655           str_copy_len &= ~(STORE_MAX_PIECES - 1);
4656         }
4657       str_copy_len = MIN (str_copy_len, exp_len);
4658       if (!can_store_by_pieces (str_copy_len, builtin_strncpy_read_str,
4659                                 CONST_CAST(char *, TREE_STRING_POINTER (exp)),
4660                                 MEM_ALIGN (target), false))
4661         goto normal_expr;
4662
4663       dest_mem = target;
4664
4665       dest_mem = store_by_pieces (dest_mem,
4666                                   str_copy_len, builtin_strncpy_read_str,
4667                                   CONST_CAST(char *, TREE_STRING_POINTER (exp)),
4668                                   MEM_ALIGN (target), false,
4669                                   exp_len > str_copy_len ? 1 : 0);
4670       if (exp_len > str_copy_len)
4671         clear_storage (adjust_address (dest_mem, BLKmode, 0),
4672                        GEN_INT (exp_len - str_copy_len),
4673                        BLOCK_OP_NORMAL);
4674       return NULL_RTX;
4675     }
4676   else
4677     {
4678       rtx tmp_target;
4679
4680   normal_expr:
4681       /* If we want to use a nontemporal store, force the value to
4682          register first.  */
4683       tmp_target = nontemporal ? NULL_RTX : target;
4684       temp = expand_expr_real (exp, tmp_target, GET_MODE (target),
4685                                (call_param_p
4686                                 ? EXPAND_STACK_PARM : EXPAND_NORMAL),
4687                                &alt_rtl);
4688     }
4689
4690   /* If TEMP is a VOIDmode constant and the mode of the type of EXP is not
4691      the same as that of TARGET, adjust the constant.  This is needed, for
4692      example, in case it is a CONST_DOUBLE and we want only a word-sized
4693      value.  */
4694   if (CONSTANT_P (temp) && GET_MODE (temp) == VOIDmode
4695       && TREE_CODE (exp) != ERROR_MARK
4696       && GET_MODE (target) != TYPE_MODE (TREE_TYPE (exp)))
4697     temp = convert_modes (GET_MODE (target), TYPE_MODE (TREE_TYPE (exp)),
4698                           temp, TYPE_UNSIGNED (TREE_TYPE (exp)));
4699
4700   /* If value was not generated in the target, store it there.
4701      Convert the value to TARGET's type first if necessary and emit the
4702      pending incrementations that have been queued when expanding EXP.
4703      Note that we cannot emit the whole queue blindly because this will
4704      effectively disable the POST_INC optimization later.
4705
4706      If TEMP and TARGET compare equal according to rtx_equal_p, but
4707      one or both of them are volatile memory refs, we have to distinguish
4708      two cases:
4709      - expand_expr has used TARGET.  In this case, we must not generate
4710        another copy.  This can be detected by TARGET being equal according
4711        to == .
4712      - expand_expr has not used TARGET - that means that the source just
4713        happens to have the same RTX form.  Since temp will have been created
4714        by expand_expr, it will compare unequal according to == .
4715        We must generate a copy in this case, to reach the correct number
4716        of volatile memory references.  */
4717
4718   if ((! rtx_equal_p (temp, target)
4719        || (temp != target && (side_effects_p (temp)
4720                               || side_effects_p (target))))
4721       && TREE_CODE (exp) != ERROR_MARK
4722       /* If store_expr stores a DECL whose DECL_RTL(exp) == TARGET,
4723          but TARGET is not valid memory reference, TEMP will differ
4724          from TARGET although it is really the same location.  */
4725       && !(alt_rtl && rtx_equal_p (alt_rtl, target))
4726       /* If there's nothing to copy, don't bother.  Don't call
4727          expr_size unless necessary, because some front-ends (C++)
4728          expr_size-hook must not be given objects that are not
4729          supposed to be bit-copied or bit-initialized.  */
4730       && expr_size (exp) != const0_rtx)
4731     {
4732       if (GET_MODE (temp) != GET_MODE (target)
4733           && GET_MODE (temp) != VOIDmode)
4734         {
4735           int unsignedp = TYPE_UNSIGNED (TREE_TYPE (exp));
4736           if (GET_MODE (target) == BLKmode
4737                    || GET_MODE (temp) == BLKmode)
4738             emit_block_move (target, temp, expr_size (exp),
4739                              (call_param_p
4740                               ? BLOCK_OP_CALL_PARM
4741                               : BLOCK_OP_NORMAL));
4742           else
4743             convert_move (target, temp, unsignedp);
4744         }
4745
4746       else if (GET_MODE (temp) == BLKmode && TREE_CODE (exp) == STRING_CST)
4747         {
4748           /* Handle copying a string constant into an array.  The string
4749              constant may be shorter than the array.  So copy just the string's
4750              actual length, and clear the rest.  First get the size of the data
4751              type of the string, which is actually the size of the target.  */
4752           rtx size = expr_size (exp);
4753
4754           if (CONST_INT_P (size)
4755               && INTVAL (size) < TREE_STRING_LENGTH (exp))
4756             emit_block_move (target, temp, size,
4757                              (call_param_p
4758                               ? BLOCK_OP_CALL_PARM : BLOCK_OP_NORMAL));
4759           else
4760             {
4761               enum machine_mode pointer_mode
4762                 = targetm.addr_space.pointer_mode (MEM_ADDR_SPACE (target));
4763               enum machine_mode address_mode
4764                 = targetm.addr_space.address_mode (MEM_ADDR_SPACE (target));
4765
4766               /* Compute the size of the data to copy from the string.  */
4767               tree copy_size
4768                 = size_binop_loc (loc, MIN_EXPR,
4769                                   make_tree (sizetype, size),
4770                                   size_int (TREE_STRING_LENGTH (exp)));
4771               rtx copy_size_rtx
4772                 = expand_expr (copy_size, NULL_RTX, VOIDmode,
4773                                (call_param_p
4774                                 ? EXPAND_STACK_PARM : EXPAND_NORMAL));
4775               rtx label = 0;
4776
4777               /* Copy that much.  */
4778               copy_size_rtx = convert_to_mode (pointer_mode, copy_size_rtx,
4779                                                TYPE_UNSIGNED (sizetype));
4780               emit_block_move (target, temp, copy_size_rtx,
4781                                (call_param_p
4782                                 ? BLOCK_OP_CALL_PARM : BLOCK_OP_NORMAL));
4783
4784               /* Figure out how much is left in TARGET that we have to clear.
4785                  Do all calculations in pointer_mode.  */
4786               if (CONST_INT_P (copy_size_rtx))
4787                 {
4788                   size = plus_constant (size, -INTVAL (copy_size_rtx));
4789                   target = adjust_address (target, BLKmode,
4790                                            INTVAL (copy_size_rtx));
4791                 }
4792               else
4793                 {
4794                   size = expand_binop (TYPE_MODE (sizetype), sub_optab, size,
4795                                        copy_size_rtx, NULL_RTX, 0,
4796                                        OPTAB_LIB_WIDEN);
4797
4798                   if (GET_MODE (copy_size_rtx) != address_mode)
4799                     copy_size_rtx = convert_to_mode (address_mode,
4800                                                      copy_size_rtx,
4801                                                      TYPE_UNSIGNED (sizetype));
4802
4803                   target = offset_address (target, copy_size_rtx,
4804                                            highest_pow2_factor (copy_size));
4805                   label = gen_label_rtx ();
4806                   emit_cmp_and_jump_insns (size, const0_rtx, LT, NULL_RTX,
4807                                            GET_MODE (size), 0, label);
4808                 }
4809
4810               if (size != const0_rtx)
4811                 clear_storage (target, size, BLOCK_OP_NORMAL);
4812
4813               if (label)
4814                 emit_label (label);
4815             }
4816         }
4817       /* Handle calls that return values in multiple non-contiguous locations.
4818          The Irix 6 ABI has examples of this.  */
4819       else if (GET_CODE (target) == PARALLEL)
4820         emit_group_load (target, temp, TREE_TYPE (exp),
4821                          int_size_in_bytes (TREE_TYPE (exp)));
4822       else if (GET_MODE (temp) == BLKmode)
4823         emit_block_move (target, temp, expr_size (exp),
4824                          (call_param_p
4825                           ? BLOCK_OP_CALL_PARM : BLOCK_OP_NORMAL));
4826       else if (nontemporal
4827                && emit_storent_insn (target, temp))
4828         /* If we managed to emit a nontemporal store, there is nothing else to
4829            do.  */
4830         ;
4831       else
4832         {
4833           temp = force_operand (temp, target);
4834           if (temp != target)
4835             emit_move_insn (target, temp);
4836         }
4837     }
4838
4839   return NULL_RTX;
4840 }
4841 \f
4842 /* Helper for categorize_ctor_elements.  Identical interface.  */
4843
4844 static bool
4845 categorize_ctor_elements_1 (const_tree ctor, HOST_WIDE_INT *p_nz_elts,
4846                             HOST_WIDE_INT *p_elt_count,
4847                             bool *p_must_clear)
4848 {
4849   unsigned HOST_WIDE_INT idx;
4850   HOST_WIDE_INT nz_elts, elt_count;
4851   tree value, purpose;
4852
4853   /* Whether CTOR is a valid constant initializer, in accordance with what
4854      initializer_constant_valid_p does.  If inferred from the constructor
4855      elements, true until proven otherwise.  */
4856   bool const_from_elts_p = constructor_static_from_elts_p (ctor);
4857   bool const_p = const_from_elts_p ? true : TREE_STATIC (ctor);
4858
4859   nz_elts = 0;
4860   elt_count = 0;
4861
4862   FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (ctor), idx, purpose, value)
4863     {
4864       HOST_WIDE_INT mult;
4865
4866       mult = 1;
4867       if (TREE_CODE (purpose) == RANGE_EXPR)
4868         {
4869           tree lo_index = TREE_OPERAND (purpose, 0);
4870           tree hi_index = TREE_OPERAND (purpose, 1);
4871
4872           if (host_integerp (lo_index, 1) && host_integerp (hi_index, 1))
4873             mult = (tree_low_cst (hi_index, 1)
4874                     - tree_low_cst (lo_index, 1) + 1);
4875         }
4876
4877       switch (TREE_CODE (value))
4878         {
4879         case CONSTRUCTOR:
4880           {
4881             HOST_WIDE_INT nz = 0, ic = 0;
4882
4883             bool const_elt_p
4884               = categorize_ctor_elements_1 (value, &nz, &ic, p_must_clear);
4885
4886             nz_elts += mult * nz;
4887             elt_count += mult * ic;
4888
4889             if (const_from_elts_p && const_p)
4890               const_p = const_elt_p;
4891           }
4892           break;
4893
4894         case INTEGER_CST:
4895         case REAL_CST:
4896         case FIXED_CST:
4897           if (!initializer_zerop (value))
4898             nz_elts += mult;
4899           elt_count += mult;
4900           break;
4901
4902         case STRING_CST:
4903           nz_elts += mult * TREE_STRING_LENGTH (value);
4904           elt_count += mult * TREE_STRING_LENGTH (value);
4905           break;
4906
4907         case COMPLEX_CST:
4908           if (!initializer_zerop (TREE_REALPART (value)))
4909             nz_elts += mult;
4910           if (!initializer_zerop (TREE_IMAGPART (value)))
4911             nz_elts += mult;
4912           elt_count += mult;
4913           break;
4914
4915         case VECTOR_CST:
4916           {
4917             tree v;
4918             for (v = TREE_VECTOR_CST_ELTS (value); v; v = TREE_CHAIN (v))
4919               {
4920                 if (!initializer_zerop (TREE_VALUE (v)))
4921                   nz_elts += mult;
4922                 elt_count += mult;
4923               }
4924           }
4925           break;
4926
4927         default:
4928           nz_elts += mult;
4929           elt_count += mult;
4930
4931           if (const_from_elts_p && const_p)
4932             const_p = initializer_constant_valid_p (value, TREE_TYPE (value))
4933                       != NULL_TREE;
4934           break;
4935         }
4936     }
4937
4938   if (!*p_must_clear
4939       && (TREE_CODE (TREE_TYPE (ctor)) == UNION_TYPE
4940           || TREE_CODE (TREE_TYPE (ctor)) == QUAL_UNION_TYPE))
4941     {
4942       tree init_sub_type;
4943       bool clear_this = true;
4944
4945       if (!VEC_empty (constructor_elt, CONSTRUCTOR_ELTS (ctor)))
4946         {
4947           /* We don't expect more than one element of the union to be
4948              initialized.  Not sure what we should do otherwise... */
4949           gcc_assert (VEC_length (constructor_elt, CONSTRUCTOR_ELTS (ctor))
4950                       == 1);
4951
4952           init_sub_type = TREE_TYPE (VEC_index (constructor_elt,
4953                                                 CONSTRUCTOR_ELTS (ctor),
4954                                                 0)->value);
4955
4956           /* ??? We could look at each element of the union, and find the
4957              largest element.  Which would avoid comparing the size of the
4958              initialized element against any tail padding in the union.
4959              Doesn't seem worth the effort...  */
4960           if (simple_cst_equal (TYPE_SIZE (TREE_TYPE (ctor)),
4961                                 TYPE_SIZE (init_sub_type)) == 1)
4962             {
4963               /* And now we have to find out if the element itself is fully
4964                  constructed.  E.g. for union { struct { int a, b; } s; } u
4965                  = { .s = { .a = 1 } }.  */
4966               if (elt_count == count_type_elements (init_sub_type, false))
4967                 clear_this = false;
4968             }
4969         }
4970
4971       *p_must_clear = clear_this;
4972     }
4973
4974   *p_nz_elts += nz_elts;
4975   *p_elt_count += elt_count;
4976
4977   return const_p;
4978 }
4979
4980 /* Examine CTOR to discover:
4981    * how many scalar fields are set to nonzero values,
4982      and place it in *P_NZ_ELTS;
4983    * how many scalar fields in total are in CTOR,
4984      and place it in *P_ELT_COUNT.
4985    * if a type is a union, and the initializer from the constructor
4986      is not the largest element in the union, then set *p_must_clear.
4987
4988    Return whether or not CTOR is a valid static constant initializer, the same
4989    as "initializer_constant_valid_p (CTOR, TREE_TYPE (CTOR)) != 0".  */
4990
4991 bool
4992 categorize_ctor_elements (const_tree ctor, HOST_WIDE_INT *p_nz_elts,
4993                           HOST_WIDE_INT *p_elt_count,
4994                           bool *p_must_clear)
4995 {
4996   *p_nz_elts = 0;
4997   *p_elt_count = 0;
4998   *p_must_clear = false;
4999
5000   return
5001     categorize_ctor_elements_1 (ctor, p_nz_elts, p_elt_count, p_must_clear);
5002 }
5003
5004 /* Count the number of scalars in TYPE.  Return -1 on overflow or
5005    variable-sized.  If ALLOW_FLEXARR is true, don't count flexible
5006    array member at the end of the structure.  */
5007
5008 HOST_WIDE_INT
5009 count_type_elements (const_tree type, bool allow_flexarr)
5010 {
5011   const HOST_WIDE_INT max = ~((HOST_WIDE_INT)1 << (HOST_BITS_PER_WIDE_INT-1));
5012   switch (TREE_CODE (type))
5013     {
5014     case ARRAY_TYPE:
5015       {
5016         tree telts = array_type_nelts (type);
5017         if (telts && host_integerp (telts, 1))
5018           {
5019             HOST_WIDE_INT n = tree_low_cst (telts, 1) + 1;
5020             HOST_WIDE_INT m = count_type_elements (TREE_TYPE (type), false);
5021             if (n == 0)
5022               return 0;
5023             else if (max / n > m)
5024               return n * m;
5025           }
5026         return -1;
5027       }
5028
5029     case RECORD_TYPE:
5030       {
5031         HOST_WIDE_INT n = 0, t;
5032         tree f;
5033
5034         for (f = TYPE_FIELDS (type); f ; f = TREE_CHAIN (f))
5035           if (TREE_CODE (f) == FIELD_DECL)
5036             {
5037               t = count_type_elements (TREE_TYPE (f), false);
5038               if (t < 0)
5039                 {
5040                   /* Check for structures with flexible array member.  */
5041                   tree tf = TREE_TYPE (f);
5042                   if (allow_flexarr
5043                       && TREE_CHAIN (f) == NULL
5044                       && TREE_CODE (tf) == ARRAY_TYPE
5045                       && TYPE_DOMAIN (tf)
5046                       && TYPE_MIN_VALUE (TYPE_DOMAIN (tf))
5047                       && integer_zerop (TYPE_MIN_VALUE (TYPE_DOMAIN (tf)))
5048                       && !TYPE_MAX_VALUE (TYPE_DOMAIN (tf))
5049                       && int_size_in_bytes (type) >= 0)
5050                     break;
5051
5052                   return -1;
5053                 }
5054               n += t;
5055             }
5056
5057         return n;
5058       }
5059
5060     case UNION_TYPE:
5061     case QUAL_UNION_TYPE:
5062       return -1;
5063
5064     case COMPLEX_TYPE:
5065       return 2;
5066
5067     case VECTOR_TYPE:
5068       return TYPE_VECTOR_SUBPARTS (type);
5069
5070     case INTEGER_TYPE:
5071     case REAL_TYPE:
5072     case FIXED_POINT_TYPE:
5073     case ENUMERAL_TYPE:
5074     case BOOLEAN_TYPE:
5075     case POINTER_TYPE:
5076     case OFFSET_TYPE:
5077     case REFERENCE_TYPE:
5078       return 1;
5079
5080     case ERROR_MARK:
5081       return 0;
5082
5083     case VOID_TYPE:
5084     case METHOD_TYPE:
5085     case FUNCTION_TYPE:
5086     case LANG_TYPE:
5087     default:
5088       gcc_unreachable ();
5089     }
5090 }
5091
5092 /* Return 1 if EXP contains mostly (3/4)  zeros.  */
5093
5094 static int
5095 mostly_zeros_p (const_tree exp)
5096 {
5097   if (TREE_CODE (exp) == CONSTRUCTOR)
5098
5099     {
5100       HOST_WIDE_INT nz_elts, count, elts;
5101       bool must_clear;
5102
5103       categorize_ctor_elements (exp, &nz_elts, &count, &must_clear);
5104       if (must_clear)
5105         return 1;
5106
5107       elts = count_type_elements (TREE_TYPE (exp), false);
5108
5109       return nz_elts < elts / 4;
5110     }
5111
5112   return initializer_zerop (exp);
5113 }
5114
5115 /* Return 1 if EXP contains all zeros.  */
5116
5117 static int
5118 all_zeros_p (const_tree exp)
5119 {
5120   if (TREE_CODE (exp) == CONSTRUCTOR)
5121
5122     {
5123       HOST_WIDE_INT nz_elts, count;
5124       bool must_clear;
5125
5126       categorize_ctor_elements (exp, &nz_elts, &count, &must_clear);
5127       return nz_elts == 0;
5128     }
5129
5130   return initializer_zerop (exp);
5131 }
5132 \f
5133 /* Helper function for store_constructor.
5134    TARGET, BITSIZE, BITPOS, MODE, EXP are as for store_field.
5135    TYPE is the type of the CONSTRUCTOR, not the element type.
5136    CLEARED is as for store_constructor.
5137    ALIAS_SET is the alias set to use for any stores.
5138
5139    This provides a recursive shortcut back to store_constructor when it isn't
5140    necessary to go through store_field.  This is so that we can pass through
5141    the cleared field to let store_constructor know that we may not have to
5142    clear a substructure if the outer structure has already been cleared.  */
5143
5144 static void
5145 store_constructor_field (rtx target, unsigned HOST_WIDE_INT bitsize,
5146                          HOST_WIDE_INT bitpos, enum machine_mode mode,
5147                          tree exp, tree type, int cleared,
5148                          alias_set_type alias_set)
5149 {
5150   if (TREE_CODE (exp) == CONSTRUCTOR
5151       /* We can only call store_constructor recursively if the size and
5152          bit position are on a byte boundary.  */
5153       && bitpos % BITS_PER_UNIT == 0
5154       && (bitsize > 0 && bitsize % BITS_PER_UNIT == 0)
5155       /* If we have a nonzero bitpos for a register target, then we just
5156          let store_field do the bitfield handling.  This is unlikely to
5157          generate unnecessary clear instructions anyways.  */
5158       && (bitpos == 0 || MEM_P (target)))
5159     {
5160       if (MEM_P (target))
5161         target
5162           = adjust_address (target,
5163                             GET_MODE (target) == BLKmode
5164                             || 0 != (bitpos
5165                                      % GET_MODE_ALIGNMENT (GET_MODE (target)))
5166                             ? BLKmode : VOIDmode, bitpos / BITS_PER_UNIT);
5167
5168
5169       /* Update the alias set, if required.  */
5170       if (MEM_P (target) && ! MEM_KEEP_ALIAS_SET_P (target)
5171           && MEM_ALIAS_SET (target) != 0)
5172         {
5173           target = copy_rtx (target);
5174           set_mem_alias_set (target, alias_set);
5175         }
5176
5177       store_constructor (exp, target, cleared, bitsize / BITS_PER_UNIT);
5178     }
5179   else
5180     store_field (target, bitsize, bitpos, mode, exp, type, alias_set, false);
5181 }
5182
5183 /* Store the value of constructor EXP into the rtx TARGET.
5184    TARGET is either a REG or a MEM; we know it cannot conflict, since
5185    safe_from_p has been called.
5186    CLEARED is true if TARGET is known to have been zero'd.
5187    SIZE is the number of bytes of TARGET we are allowed to modify: this
5188    may not be the same as the size of EXP if we are assigning to a field
5189    which has been packed to exclude padding bits.  */
5190
5191 static void
5192 store_constructor (tree exp, rtx target, int cleared, HOST_WIDE_INT size)
5193 {
5194   tree type = TREE_TYPE (exp);
5195 #ifdef WORD_REGISTER_OPERATIONS
5196   HOST_WIDE_INT exp_size = int_size_in_bytes (type);
5197 #endif
5198
5199   switch (TREE_CODE (type))
5200     {
5201     case RECORD_TYPE:
5202     case UNION_TYPE:
5203     case QUAL_UNION_TYPE:
5204       {
5205         unsigned HOST_WIDE_INT idx;
5206         tree field, value;
5207
5208         /* If size is zero or the target is already cleared, do nothing.  */
5209         if (size == 0 || cleared)
5210           cleared = 1;
5211         /* We either clear the aggregate or indicate the value is dead.  */
5212         else if ((TREE_CODE (type) == UNION_TYPE
5213                   || TREE_CODE (type) == QUAL_UNION_TYPE)
5214                  && ! CONSTRUCTOR_ELTS (exp))
5215           /* If the constructor is empty, clear the union.  */
5216           {
5217             clear_storage (target, expr_size (exp), BLOCK_OP_NORMAL);
5218             cleared = 1;
5219           }
5220
5221         /* If we are building a static constructor into a register,
5222            set the initial value as zero so we can fold the value into
5223            a constant.  But if more than one register is involved,
5224            this probably loses.  */
5225         else if (REG_P (target) && TREE_STATIC (exp)
5226                  && GET_MODE_SIZE (GET_MODE (target)) <= UNITS_PER_WORD)
5227           {
5228             emit_move_insn (target, CONST0_RTX (GET_MODE (target)));
5229             cleared = 1;
5230           }
5231
5232         /* If the constructor has fewer fields than the structure or
5233            if we are initializing the structure to mostly zeros, clear
5234            the whole structure first.  Don't do this if TARGET is a
5235            register whose mode size isn't equal to SIZE since
5236            clear_storage can't handle this case.  */
5237         else if (size > 0
5238                  && (((int)VEC_length (constructor_elt, CONSTRUCTOR_ELTS (exp))
5239                       != fields_length (type))
5240                      || mostly_zeros_p (exp))
5241                  && (!REG_P (target)
5242                      || ((HOST_WIDE_INT) GET_MODE_SIZE (GET_MODE (target))
5243                          == size)))
5244           {
5245             clear_storage (target, GEN_INT (size), BLOCK_OP_NORMAL);
5246             cleared = 1;
5247           }
5248
5249         if (REG_P (target) && !cleared)
5250           emit_clobber (target);
5251
5252         /* Store each element of the constructor into the
5253            corresponding field of TARGET.  */
5254         FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (exp), idx, field, value)
5255           {
5256             enum machine_mode mode;
5257             HOST_WIDE_INT bitsize;
5258             HOST_WIDE_INT bitpos = 0;
5259             tree offset;
5260             rtx to_rtx = target;
5261
5262             /* Just ignore missing fields.  We cleared the whole
5263                structure, above, if any fields are missing.  */
5264             if (field == 0)
5265               continue;
5266
5267             if (cleared && initializer_zerop (value))
5268               continue;
5269
5270             if (host_integerp (DECL_SIZE (field), 1))
5271               bitsize = tree_low_cst (DECL_SIZE (field), 1);
5272             else
5273               bitsize = -1;
5274
5275             mode = DECL_MODE (field);
5276             if (DECL_BIT_FIELD (field))
5277               mode = VOIDmode;
5278
5279             offset = DECL_FIELD_OFFSET (field);
5280             if (host_integerp (offset, 0)
5281                 && host_integerp (bit_position (field), 0))
5282               {
5283                 bitpos = int_bit_position (field);
5284                 offset = 0;
5285               }
5286             else
5287               bitpos = tree_low_cst (DECL_FIELD_BIT_OFFSET (field), 0);
5288
5289             if (offset)
5290               {
5291                 enum machine_mode address_mode;
5292                 rtx offset_rtx;
5293
5294                 offset
5295                   = SUBSTITUTE_PLACEHOLDER_IN_EXPR (offset,
5296                                                     make_tree (TREE_TYPE (exp),
5297                                                                target));
5298
5299                 offset_rtx = expand_normal (offset);
5300                 gcc_assert (MEM_P (to_rtx));
5301
5302                 address_mode
5303                   = targetm.addr_space.address_mode (MEM_ADDR_SPACE (to_rtx));
5304                 if (GET_MODE (offset_rtx) != address_mode)
5305                   offset_rtx = convert_to_mode (address_mode, offset_rtx, 0);
5306
5307                 to_rtx = offset_address (to_rtx, offset_rtx,
5308                                          highest_pow2_factor (offset));
5309               }
5310
5311 #ifdef WORD_REGISTER_OPERATIONS
5312             /* If this initializes a field that is smaller than a
5313                word, at the start of a word, try to widen it to a full
5314                word.  This special case allows us to output C++ member
5315                function initializations in a form that the optimizers
5316                can understand.  */
5317             if (REG_P (target)
5318                 && bitsize < BITS_PER_WORD
5319                 && bitpos % BITS_PER_WORD == 0
5320                 && GET_MODE_CLASS (mode) == MODE_INT
5321                 && TREE_CODE (value) == INTEGER_CST
5322                 && exp_size >= 0
5323                 && bitpos + BITS_PER_WORD <= exp_size * BITS_PER_UNIT)
5324               {
5325                 tree type = TREE_TYPE (value);
5326
5327                 if (TYPE_PRECISION (type) < BITS_PER_WORD)
5328                   {
5329                     type = lang_hooks.types.type_for_size
5330                       (BITS_PER_WORD, TYPE_UNSIGNED (type));
5331                     value = fold_convert (type, value);
5332                   }
5333
5334                 if (BYTES_BIG_ENDIAN)
5335                   value
5336                    = fold_build2 (LSHIFT_EXPR, type, value,
5337                                    build_int_cst (type,
5338                                                   BITS_PER_WORD - bitsize));
5339                 bitsize = BITS_PER_WORD;
5340                 mode = word_mode;
5341               }
5342 #endif
5343
5344             if (MEM_P (to_rtx) && !MEM_KEEP_ALIAS_SET_P (to_rtx)
5345                 && DECL_NONADDRESSABLE_P (field))
5346               {
5347                 to_rtx = copy_rtx (to_rtx);
5348                 MEM_KEEP_ALIAS_SET_P (to_rtx) = 1;
5349               }
5350
5351             store_constructor_field (to_rtx, bitsize, bitpos, mode,
5352                                      value, type, cleared,
5353                                      get_alias_set (TREE_TYPE (field)));
5354           }
5355         break;
5356       }
5357     case ARRAY_TYPE:
5358       {
5359         tree value, index;
5360         unsigned HOST_WIDE_INT i;
5361         int need_to_clear;
5362         tree domain;
5363         tree elttype = TREE_TYPE (type);
5364         int const_bounds_p;
5365         HOST_WIDE_INT minelt = 0;
5366         HOST_WIDE_INT maxelt = 0;
5367
5368         domain = TYPE_DOMAIN (type);
5369         const_bounds_p = (TYPE_MIN_VALUE (domain)
5370                           && TYPE_MAX_VALUE (domain)
5371                           && host_integerp (TYPE_MIN_VALUE (domain), 0)
5372                           && host_integerp (TYPE_MAX_VALUE (domain), 0));
5373
5374         /* If we have constant bounds for the range of the type, get them.  */
5375         if (const_bounds_p)
5376           {
5377             minelt = tree_low_cst (TYPE_MIN_VALUE (domain), 0);
5378             maxelt = tree_low_cst (TYPE_MAX_VALUE (domain), 0);
5379           }
5380
5381         /* If the constructor has fewer elements than the array, clear
5382            the whole array first.  Similarly if this is static
5383            constructor of a non-BLKmode object.  */
5384         if (cleared)
5385           need_to_clear = 0;
5386         else if (REG_P (target) && TREE_STATIC (exp))
5387           need_to_clear = 1;
5388         else
5389           {
5390             unsigned HOST_WIDE_INT idx;
5391             tree index, value;
5392             HOST_WIDE_INT count = 0, zero_count = 0;
5393             need_to_clear = ! const_bounds_p;
5394
5395             /* This loop is a more accurate version of the loop in
5396                mostly_zeros_p (it handles RANGE_EXPR in an index).  It
5397                is also needed to check for missing elements.  */
5398             FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (exp), idx, index, value)
5399               {
5400                 HOST_WIDE_INT this_node_count;
5401
5402                 if (need_to_clear)
5403                   break;
5404
5405                 if (index != NULL_TREE && TREE_CODE (index) == RANGE_EXPR)
5406                   {
5407                     tree lo_index = TREE_OPERAND (index, 0);
5408                     tree hi_index = TREE_OPERAND (index, 1);
5409
5410                     if (! host_integerp (lo_index, 1)
5411                         || ! host_integerp (hi_index, 1))
5412                       {
5413                         need_to_clear = 1;
5414                         break;
5415                       }
5416
5417                     this_node_count = (tree_low_cst (hi_index, 1)
5418                                        - tree_low_cst (lo_index, 1) + 1);
5419                   }
5420                 else
5421                   this_node_count = 1;
5422
5423                 count += this_node_count;
5424                 if (mostly_zeros_p (value))
5425                   zero_count += this_node_count;
5426               }
5427
5428             /* Clear the entire array first if there are any missing
5429                elements, or if the incidence of zero elements is >=
5430                75%.  */
5431             if (! need_to_clear
5432                 && (count < maxelt - minelt + 1
5433                     || 4 * zero_count >= 3 * count))
5434               need_to_clear = 1;
5435           }
5436
5437         if (need_to_clear && size > 0)
5438           {
5439             if (REG_P (target))
5440               emit_move_insn (target,  CONST0_RTX (GET_MODE (target)));
5441             else
5442               clear_storage (target, GEN_INT (size), BLOCK_OP_NORMAL);
5443             cleared = 1;
5444           }
5445
5446         if (!cleared && REG_P (target))
5447           /* Inform later passes that the old value is dead.  */
5448           emit_clobber (target);
5449
5450         /* Store each element of the constructor into the
5451            corresponding element of TARGET, determined by counting the
5452            elements.  */
5453         FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (exp), i, index, value)
5454           {
5455             enum machine_mode mode;
5456             HOST_WIDE_INT bitsize;
5457             HOST_WIDE_INT bitpos;
5458             rtx xtarget = target;
5459
5460             if (cleared && initializer_zerop (value))
5461               continue;
5462
5463             mode = TYPE_MODE (elttype);
5464             if (mode == BLKmode)
5465               bitsize = (host_integerp (TYPE_SIZE (elttype), 1)
5466                          ? tree_low_cst (TYPE_SIZE (elttype), 1)
5467                          : -1);
5468             else
5469               bitsize = GET_MODE_BITSIZE (mode);
5470
5471             if (index != NULL_TREE && TREE_CODE (index) == RANGE_EXPR)
5472               {
5473                 tree lo_index = TREE_OPERAND (index, 0);
5474                 tree hi_index = TREE_OPERAND (index, 1);
5475                 rtx index_r, pos_rtx;
5476                 HOST_WIDE_INT lo, hi, count;
5477                 tree position;
5478
5479                 /* If the range is constant and "small", unroll the loop.  */
5480                 if (const_bounds_p
5481                     && host_integerp (lo_index, 0)
5482                     && host_integerp (hi_index, 0)
5483                     && (lo = tree_low_cst (lo_index, 0),
5484                         hi = tree_low_cst (hi_index, 0),
5485                         count = hi - lo + 1,
5486                         (!MEM_P (target)
5487                          || count <= 2
5488                          || (host_integerp (TYPE_SIZE (elttype), 1)
5489                              && (tree_low_cst (TYPE_SIZE (elttype), 1) * count
5490                                  <= 40 * 8)))))
5491                   {
5492                     lo -= minelt;  hi -= minelt;
5493                     for (; lo <= hi; lo++)
5494                       {
5495                         bitpos = lo * tree_low_cst (TYPE_SIZE (elttype), 0);
5496
5497                         if (MEM_P (target)
5498                             && !MEM_KEEP_ALIAS_SET_P (target)
5499                             && TREE_CODE (type) == ARRAY_TYPE
5500                             && TYPE_NONALIASED_COMPONENT (type))
5501                           {
5502                             target = copy_rtx (target);
5503                             MEM_KEEP_ALIAS_SET_P (target) = 1;
5504                           }
5505
5506                         store_constructor_field
5507                           (target, bitsize, bitpos, mode, value, type, cleared,
5508                            get_alias_set (elttype));
5509                       }
5510                   }
5511                 else
5512                   {
5513                     rtx loop_start = gen_label_rtx ();
5514                     rtx loop_end = gen_label_rtx ();
5515                     tree exit_cond;
5516
5517                     expand_normal (hi_index);
5518
5519                     index = build_decl (EXPR_LOCATION (exp),
5520                                         VAR_DECL, NULL_TREE, domain);
5521                     index_r = gen_reg_rtx (promote_decl_mode (index, NULL));
5522                     SET_DECL_RTL (index, index_r);
5523                     store_expr (lo_index, index_r, 0, false);
5524
5525                     /* Build the head of the loop.  */
5526                     do_pending_stack_adjust ();
5527                     emit_label (loop_start);
5528
5529                     /* Assign value to element index.  */
5530                     position =
5531                       fold_convert (ssizetype,
5532                                     fold_build2 (MINUS_EXPR,
5533                                                  TREE_TYPE (index),
5534                                                  index,
5535                                                  TYPE_MIN_VALUE (domain)));
5536
5537                     position =
5538                         size_binop (MULT_EXPR, position,
5539                                     fold_convert (ssizetype,
5540                                                   TYPE_SIZE_UNIT (elttype)));
5541
5542                     pos_rtx = expand_normal (position);
5543                     xtarget = offset_address (target, pos_rtx,
5544                                               highest_pow2_factor (position));
5545                     xtarget = adjust_address (xtarget, mode, 0);
5546                     if (TREE_CODE (value) == CONSTRUCTOR)
5547                       store_constructor (value, xtarget, cleared,
5548                                          bitsize / BITS_PER_UNIT);
5549                     else
5550                       store_expr (value, xtarget, 0, false);
5551
5552                     /* Generate a conditional jump to exit the loop.  */
5553                     exit_cond = build2 (LT_EXPR, integer_type_node,
5554                                         index, hi_index);
5555                     jumpif (exit_cond, loop_end, -1);
5556
5557                     /* Update the loop counter, and jump to the head of
5558                        the loop.  */
5559                     expand_assignment (index,
5560                                        build2 (PLUS_EXPR, TREE_TYPE (index),
5561                                                index, integer_one_node),
5562                                        false);
5563
5564                     emit_jump (loop_start);
5565
5566                     /* Build the end of the loop.  */
5567                     emit_label (loop_end);
5568                   }
5569               }
5570             else if ((index != 0 && ! host_integerp (index, 0))
5571                      || ! host_integerp (TYPE_SIZE (elttype), 1))
5572               {
5573                 tree position;
5574
5575                 if (index == 0)
5576                   index = ssize_int (1);
5577
5578                 if (minelt)
5579                   index = fold_convert (ssizetype,
5580                                         fold_build2 (MINUS_EXPR,
5581                                                      TREE_TYPE (index),
5582                                                      index,
5583                                                      TYPE_MIN_VALUE (domain)));
5584
5585                 position =
5586                   size_binop (MULT_EXPR, index,
5587                               fold_convert (ssizetype,
5588                                             TYPE_SIZE_UNIT (elttype)));
5589                 xtarget = offset_address (target,
5590                                           expand_normal (position),
5591                                           highest_pow2_factor (position));
5592                 xtarget = adjust_address (xtarget, mode, 0);
5593                 store_expr (value, xtarget, 0, false);
5594               }
5595             else
5596               {
5597                 if (index != 0)
5598                   bitpos = ((tree_low_cst (index, 0) - minelt)
5599                             * tree_low_cst (TYPE_SIZE (elttype), 1));
5600                 else
5601                   bitpos = (i * tree_low_cst (TYPE_SIZE (elttype), 1));
5602
5603                 if (MEM_P (target) && !MEM_KEEP_ALIAS_SET_P (target)
5604                     && TREE_CODE (type) == ARRAY_TYPE
5605                     && TYPE_NONALIASED_COMPONENT (type))
5606                   {
5607                     target = copy_rtx (target);
5608                     MEM_KEEP_ALIAS_SET_P (target) = 1;
5609                   }
5610                 store_constructor_field (target, bitsize, bitpos, mode, value,
5611                                          type, cleared, get_alias_set (elttype));
5612               }
5613           }
5614         break;
5615       }
5616
5617     case VECTOR_TYPE:
5618       {
5619         unsigned HOST_WIDE_INT idx;
5620         constructor_elt *ce;
5621         int i;
5622         int need_to_clear;
5623         int icode = 0;
5624         tree elttype = TREE_TYPE (type);
5625         int elt_size = tree_low_cst (TYPE_SIZE (elttype), 1);
5626         enum machine_mode eltmode = TYPE_MODE (elttype);
5627         HOST_WIDE_INT bitsize;
5628         HOST_WIDE_INT bitpos;
5629         rtvec vector = NULL;
5630         unsigned n_elts;
5631         alias_set_type alias;
5632
5633         gcc_assert (eltmode != BLKmode);
5634
5635         n_elts = TYPE_VECTOR_SUBPARTS (type);
5636         if (REG_P (target) && VECTOR_MODE_P (GET_MODE (target)))
5637           {
5638             enum machine_mode mode = GET_MODE (target);
5639
5640             icode = (int) optab_handler (vec_init_optab, mode)->insn_code;
5641             if (icode != CODE_FOR_nothing)
5642               {
5643                 unsigned int i;
5644
5645                 vector = rtvec_alloc (n_elts);
5646                 for (i = 0; i < n_elts; i++)
5647                   RTVEC_ELT (vector, i) = CONST0_RTX (GET_MODE_INNER (mode));
5648               }
5649           }
5650
5651         /* If the constructor has fewer elements than the vector,
5652            clear the whole array first.  Similarly if this is static
5653            constructor of a non-BLKmode object.  */
5654         if (cleared)
5655           need_to_clear = 0;
5656         else if (REG_P (target) && TREE_STATIC (exp))
5657           need_to_clear = 1;
5658         else
5659           {
5660             unsigned HOST_WIDE_INT count = 0, zero_count = 0;
5661             tree value;
5662
5663             FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (exp), idx, value)
5664               {
5665                 int n_elts_here = tree_low_cst
5666                   (int_const_binop (TRUNC_DIV_EXPR,
5667                                     TYPE_SIZE (TREE_TYPE (value)),
5668                                     TYPE_SIZE (elttype), 0), 1);
5669
5670                 count += n_elts_here;
5671                 if (mostly_zeros_p (value))
5672                   zero_count += n_elts_here;
5673               }
5674
5675             /* Clear the entire vector first if there are any missing elements,
5676                or if the incidence of zero elements is >= 75%.  */
5677             need_to_clear = (count < n_elts || 4 * zero_count >= 3 * count);
5678           }
5679
5680         if (need_to_clear && size > 0 && !vector)
5681           {
5682             if (REG_P (target))
5683               emit_move_insn (target, CONST0_RTX (GET_MODE (target)));
5684             else
5685               clear_storage (target, GEN_INT (size), BLOCK_OP_NORMAL);
5686             cleared = 1;
5687           }
5688
5689         /* Inform later passes that the old value is dead.  */
5690         if (!cleared && !vector && REG_P (target))
5691           emit_move_insn (target, CONST0_RTX (GET_MODE (target)));
5692
5693         if (MEM_P (target))
5694           alias = MEM_ALIAS_SET (target);
5695         else
5696           alias = get_alias_set (elttype);
5697
5698         /* Store each element of the constructor into the corresponding
5699            element of TARGET, determined by counting the elements.  */
5700         for (idx = 0, i = 0;
5701              VEC_iterate (constructor_elt, CONSTRUCTOR_ELTS (exp), idx, ce);
5702              idx++, i += bitsize / elt_size)
5703           {
5704             HOST_WIDE_INT eltpos;
5705             tree value = ce->value;
5706
5707             bitsize = tree_low_cst (TYPE_SIZE (TREE_TYPE (value)), 1);
5708             if (cleared && initializer_zerop (value))
5709               continue;
5710
5711             if (ce->index)
5712               eltpos = tree_low_cst (ce->index, 1);
5713             else
5714               eltpos = i;
5715
5716             if (vector)
5717               {
5718                 /* Vector CONSTRUCTORs should only be built from smaller
5719                    vectors in the case of BLKmode vectors.  */
5720                 gcc_assert (TREE_CODE (TREE_TYPE (value)) != VECTOR_TYPE);
5721                 RTVEC_ELT (vector, eltpos)
5722                   = expand_normal (value);
5723               }
5724             else
5725               {
5726                 enum machine_mode value_mode =
5727                   TREE_CODE (TREE_TYPE (value)) == VECTOR_TYPE
5728                   ? TYPE_MODE (TREE_TYPE (value))
5729                   : eltmode;
5730                 bitpos = eltpos * elt_size;
5731                 store_constructor_field (target, bitsize, bitpos,
5732                                          value_mode, value, type,
5733                                          cleared, alias);
5734               }
5735           }
5736
5737         if (vector)
5738           emit_insn (GEN_FCN (icode)
5739                      (target,
5740                       gen_rtx_PARALLEL (GET_MODE (target), vector)));
5741         break;
5742       }
5743
5744     default:
5745       gcc_unreachable ();
5746     }
5747 }
5748
5749 /* Store the value of EXP (an expression tree)
5750    into a subfield of TARGET which has mode MODE and occupies
5751    BITSIZE bits, starting BITPOS bits from the start of TARGET.
5752    If MODE is VOIDmode, it means that we are storing into a bit-field.
5753
5754    Always return const0_rtx unless we have something particular to
5755    return.
5756
5757    TYPE is the type of the underlying object,
5758
5759    ALIAS_SET is the alias set for the destination.  This value will
5760    (in general) be different from that for TARGET, since TARGET is a
5761    reference to the containing structure.
5762
5763    If NONTEMPORAL is true, try generating a nontemporal store.  */
5764
5765 static rtx
5766 store_field (rtx target, HOST_WIDE_INT bitsize, HOST_WIDE_INT bitpos,
5767              enum machine_mode mode, tree exp, tree type,
5768              alias_set_type alias_set, bool nontemporal)
5769 {
5770   if (TREE_CODE (exp) == ERROR_MARK)
5771     return const0_rtx;
5772
5773   /* If we have nothing to store, do nothing unless the expression has
5774      side-effects.  */
5775   if (bitsize == 0)
5776     return expand_expr (exp, const0_rtx, VOIDmode, EXPAND_NORMAL);
5777
5778   /* If we are storing into an unaligned field of an aligned union that is
5779      in a register, we may have the mode of TARGET being an integer mode but
5780      MODE == BLKmode.  In that case, get an aligned object whose size and
5781      alignment are the same as TARGET and store TARGET into it (we can avoid
5782      the store if the field being stored is the entire width of TARGET).  Then
5783      call ourselves recursively to store the field into a BLKmode version of
5784      that object.  Finally, load from the object into TARGET.  This is not
5785      very efficient in general, but should only be slightly more expensive
5786      than the otherwise-required unaligned accesses.  Perhaps this can be
5787      cleaned up later.  It's tempting to make OBJECT readonly, but it's set
5788      twice, once with emit_move_insn and once via store_field.  */
5789
5790   if (mode == BLKmode
5791       && (REG_P (target) || GET_CODE (target) == SUBREG))
5792     {
5793       rtx object = assign_temp (type, 0, 1, 1);
5794       rtx blk_object = adjust_address (object, BLKmode, 0);
5795
5796       if (bitsize != (HOST_WIDE_INT) GET_MODE_BITSIZE (GET_MODE (target)))
5797         emit_move_insn (object, target);
5798
5799       store_field (blk_object, bitsize, bitpos, mode, exp, type, alias_set,
5800                    nontemporal);
5801
5802       emit_move_insn (target, object);
5803
5804       /* We want to return the BLKmode version of the data.  */
5805       return blk_object;
5806     }
5807
5808   if (GET_CODE (target) == CONCAT)
5809     {
5810       /* We're storing into a struct containing a single __complex.  */
5811
5812       gcc_assert (!bitpos);
5813       return store_expr (exp, target, 0, nontemporal);
5814     }
5815
5816   /* If the structure is in a register or if the component
5817      is a bit field, we cannot use addressing to access it.
5818      Use bit-field techniques or SUBREG to store in it.  */
5819
5820   if (mode == VOIDmode
5821       || (mode != BLKmode && ! direct_store[(int) mode]
5822           && GET_MODE_CLASS (mode) != MODE_COMPLEX_INT
5823           && GET_MODE_CLASS (mode) != MODE_COMPLEX_FLOAT)
5824       || REG_P (target)
5825       || GET_CODE (target) == SUBREG
5826       /* If the field isn't aligned enough to store as an ordinary memref,
5827          store it as a bit field.  */
5828       || (mode != BLKmode
5829           && ((((MEM_ALIGN (target) < GET_MODE_ALIGNMENT (mode))
5830                 || bitpos % GET_MODE_ALIGNMENT (mode))
5831                && SLOW_UNALIGNED_ACCESS (mode, MEM_ALIGN (target)))
5832               || (bitpos % BITS_PER_UNIT != 0)))
5833       /* If the RHS and field are a constant size and the size of the
5834          RHS isn't the same size as the bitfield, we must use bitfield
5835          operations.  */
5836       || (bitsize >= 0
5837           && TREE_CODE (TYPE_SIZE (TREE_TYPE (exp))) == INTEGER_CST
5838           && compare_tree_int (TYPE_SIZE (TREE_TYPE (exp)), bitsize) != 0))
5839     {
5840       rtx temp;
5841       gimple nop_def;
5842
5843       /* If EXP is a NOP_EXPR of precision less than its mode, then that
5844          implies a mask operation.  If the precision is the same size as
5845          the field we're storing into, that mask is redundant.  This is
5846          particularly common with bit field assignments generated by the
5847          C front end.  */
5848       nop_def = get_def_for_expr (exp, NOP_EXPR);
5849       if (nop_def)
5850         {
5851           tree type = TREE_TYPE (exp);
5852           if (INTEGRAL_TYPE_P (type)
5853               && TYPE_PRECISION (type) < GET_MODE_BITSIZE (TYPE_MODE (type))
5854               && bitsize == TYPE_PRECISION (type))
5855             {
5856               tree op = gimple_assign_rhs1 (nop_def);
5857               type = TREE_TYPE (op);
5858               if (INTEGRAL_TYPE_P (type) && TYPE_PRECISION (type) >= bitsize)
5859                 exp = op;
5860             }
5861         }
5862
5863       temp = expand_normal (exp);
5864
5865       /* If BITSIZE is narrower than the size of the type of EXP
5866          we will be narrowing TEMP.  Normally, what's wanted are the
5867          low-order bits.  However, if EXP's type is a record and this is
5868          big-endian machine, we want the upper BITSIZE bits.  */
5869       if (BYTES_BIG_ENDIAN && GET_MODE_CLASS (GET_MODE (temp)) == MODE_INT
5870           && bitsize < (HOST_WIDE_INT) GET_MODE_BITSIZE (GET_MODE (temp))
5871           && TREE_CODE (TREE_TYPE (exp)) == RECORD_TYPE)
5872         temp = expand_shift (RSHIFT_EXPR, GET_MODE (temp), temp,
5873                              size_int (GET_MODE_BITSIZE (GET_MODE (temp))
5874                                        - bitsize),
5875                              NULL_RTX, 1);
5876
5877       /* Unless MODE is VOIDmode or BLKmode, convert TEMP to
5878          MODE.  */
5879       if (mode != VOIDmode && mode != BLKmode
5880           && mode != TYPE_MODE (TREE_TYPE (exp)))
5881         temp = convert_modes (mode, TYPE_MODE (TREE_TYPE (exp)), temp, 1);
5882
5883       /* If the modes of TEMP and TARGET are both BLKmode, both
5884          must be in memory and BITPOS must be aligned on a byte
5885          boundary.  If so, we simply do a block copy.  Likewise
5886          for a BLKmode-like TARGET.  */
5887       if (GET_MODE (temp) == BLKmode
5888           && (GET_MODE (target) == BLKmode
5889               || (MEM_P (target)
5890                   && GET_MODE_CLASS (GET_MODE (target)) == MODE_INT
5891                   && (bitpos % BITS_PER_UNIT) == 0
5892                   && (bitsize % BITS_PER_UNIT) == 0)))
5893         {
5894           gcc_assert (MEM_P (target) && MEM_P (temp)
5895                       && (bitpos % BITS_PER_UNIT) == 0);
5896
5897           target = adjust_address (target, VOIDmode, bitpos / BITS_PER_UNIT);
5898           emit_block_move (target, temp,
5899                            GEN_INT ((bitsize + BITS_PER_UNIT - 1)
5900                                     / BITS_PER_UNIT),
5901                            BLOCK_OP_NORMAL);
5902
5903           return const0_rtx;
5904         }
5905
5906       /* Store the value in the bitfield.  */
5907       store_bit_field (target, bitsize, bitpos, mode, temp);
5908
5909       return const0_rtx;
5910     }
5911   else
5912     {
5913       /* Now build a reference to just the desired component.  */
5914       rtx to_rtx = adjust_address (target, mode, bitpos / BITS_PER_UNIT);
5915
5916       if (to_rtx == target)
5917         to_rtx = copy_rtx (to_rtx);
5918
5919       MEM_SET_IN_STRUCT_P (to_rtx, 1);
5920       if (!MEM_KEEP_ALIAS_SET_P (to_rtx) && MEM_ALIAS_SET (to_rtx) != 0)
5921         set_mem_alias_set (to_rtx, alias_set);
5922
5923       return store_expr (exp, to_rtx, 0, nontemporal);
5924     }
5925 }
5926 \f
5927 /* Given an expression EXP that may be a COMPONENT_REF, a BIT_FIELD_REF,
5928    an ARRAY_REF, or an ARRAY_RANGE_REF, look for nested operations of these
5929    codes and find the ultimate containing object, which we return.
5930
5931    We set *PBITSIZE to the size in bits that we want, *PBITPOS to the
5932    bit position, and *PUNSIGNEDP to the signedness of the field.
5933    If the position of the field is variable, we store a tree
5934    giving the variable offset (in units) in *POFFSET.
5935    This offset is in addition to the bit position.
5936    If the position is not variable, we store 0 in *POFFSET.
5937
5938    If any of the extraction expressions is volatile,
5939    we store 1 in *PVOLATILEP.  Otherwise we don't change that.
5940
5941    If the field is a non-BLKmode bit-field, *PMODE is set to VOIDmode.
5942    Otherwise, it is a mode that can be used to access the field.
5943
5944    If the field describes a variable-sized object, *PMODE is set to
5945    BLKmode and *PBITSIZE is set to -1.  An access cannot be made in
5946    this case, but the address of the object can be found.
5947
5948    If KEEP_ALIGNING is true and the target is STRICT_ALIGNMENT, we don't
5949    look through nodes that serve as markers of a greater alignment than
5950    the one that can be deduced from the expression.  These nodes make it
5951    possible for front-ends to prevent temporaries from being created by
5952    the middle-end on alignment considerations.  For that purpose, the
5953    normal operating mode at high-level is to always pass FALSE so that
5954    the ultimate containing object is really returned; moreover, the
5955    associated predicate handled_component_p will always return TRUE
5956    on these nodes, thus indicating that they are essentially handled
5957    by get_inner_reference.  TRUE should only be passed when the caller
5958    is scanning the expression in order to build another representation
5959    and specifically knows how to handle these nodes; as such, this is
5960    the normal operating mode in the RTL expanders.  */
5961
5962 tree
5963 get_inner_reference (tree exp, HOST_WIDE_INT *pbitsize,
5964                      HOST_WIDE_INT *pbitpos, tree *poffset,
5965                      enum machine_mode *pmode, int *punsignedp,
5966                      int *pvolatilep, bool keep_aligning)
5967 {
5968   tree size_tree = 0;
5969   enum machine_mode mode = VOIDmode;
5970   bool blkmode_bitfield = false;
5971   tree offset = size_zero_node;
5972   tree bit_offset = bitsize_zero_node;
5973
5974   /* First get the mode, signedness, and size.  We do this from just the
5975      outermost expression.  */
5976   *pbitsize = -1;
5977   if (TREE_CODE (exp) == COMPONENT_REF)
5978     {
5979       tree field = TREE_OPERAND (exp, 1);
5980       size_tree = DECL_SIZE (field);
5981       if (!DECL_BIT_FIELD (field))
5982         mode = DECL_MODE (field);
5983       else if (DECL_MODE (field) == BLKmode)
5984         blkmode_bitfield = true;
5985
5986       *punsignedp = DECL_UNSIGNED (field);
5987     }
5988   else if (TREE_CODE (exp) == BIT_FIELD_REF)
5989     {
5990       size_tree = TREE_OPERAND (exp, 1);
5991       *punsignedp = (! INTEGRAL_TYPE_P (TREE_TYPE (exp))
5992                      || TYPE_UNSIGNED (TREE_TYPE (exp)));
5993
5994       /* For vector types, with the correct size of access, use the mode of
5995          inner type.  */
5996       if (TREE_CODE (TREE_TYPE (TREE_OPERAND (exp, 0))) == VECTOR_TYPE
5997           && TREE_TYPE (exp) == TREE_TYPE (TREE_TYPE (TREE_OPERAND (exp, 0)))
5998           && tree_int_cst_equal (size_tree, TYPE_SIZE (TREE_TYPE (exp))))
5999         mode = TYPE_MODE (TREE_TYPE (exp));
6000     }
6001   else
6002     {
6003       mode = TYPE_MODE (TREE_TYPE (exp));
6004       *punsignedp = TYPE_UNSIGNED (TREE_TYPE (exp));
6005
6006       if (mode == BLKmode)
6007         size_tree = TYPE_SIZE (TREE_TYPE (exp));
6008       else
6009         *pbitsize = GET_MODE_BITSIZE (mode);
6010     }
6011
6012   if (size_tree != 0)
6013     {
6014       if (! host_integerp (size_tree, 1))
6015         mode = BLKmode, *pbitsize = -1;
6016       else
6017         *pbitsize = tree_low_cst (size_tree, 1);
6018     }
6019
6020   /* Compute cumulative bit-offset for nested component-refs and array-refs,
6021      and find the ultimate containing object.  */
6022   while (1)
6023     {
6024       switch (TREE_CODE (exp))
6025         {
6026         case BIT_FIELD_REF:
6027           bit_offset = size_binop (PLUS_EXPR, bit_offset,
6028                                    TREE_OPERAND (exp, 2));
6029           break;
6030
6031         case COMPONENT_REF:
6032           {
6033             tree field = TREE_OPERAND (exp, 1);
6034             tree this_offset = component_ref_field_offset (exp);
6035
6036             /* If this field hasn't been filled in yet, don't go past it.
6037                This should only happen when folding expressions made during
6038                type construction.  */
6039             if (this_offset == 0)
6040               break;
6041
6042             offset = size_binop (PLUS_EXPR, offset, this_offset);
6043             bit_offset = size_binop (PLUS_EXPR, bit_offset,
6044                                      DECL_FIELD_BIT_OFFSET (field));
6045
6046             /* ??? Right now we don't do anything with DECL_OFFSET_ALIGN.  */
6047           }
6048           break;
6049
6050         case ARRAY_REF:
6051         case ARRAY_RANGE_REF:
6052           {
6053             tree index = TREE_OPERAND (exp, 1);
6054             tree low_bound = array_ref_low_bound (exp);
6055             tree unit_size = array_ref_element_size (exp);
6056
6057             /* We assume all arrays have sizes that are a multiple of a byte.
6058                First subtract the lower bound, if any, in the type of the
6059                index, then convert to sizetype and multiply by the size of
6060                the array element.  */
6061             if (! integer_zerop (low_bound))
6062               index = fold_build2 (MINUS_EXPR, TREE_TYPE (index),
6063                                    index, low_bound);
6064
6065             offset = size_binop (PLUS_EXPR, offset,
6066                                  size_binop (MULT_EXPR,
6067                                              fold_convert (sizetype, index),
6068                                              unit_size));
6069           }
6070           break;
6071
6072         case REALPART_EXPR:
6073           break;
6074
6075         case IMAGPART_EXPR:
6076           bit_offset = size_binop (PLUS_EXPR, bit_offset,
6077                                    bitsize_int (*pbitsize));
6078           break;
6079
6080         case VIEW_CONVERT_EXPR:
6081           if (keep_aligning && STRICT_ALIGNMENT
6082               && (TYPE_ALIGN (TREE_TYPE (exp))
6083                > TYPE_ALIGN (TREE_TYPE (TREE_OPERAND (exp, 0))))
6084               && (TYPE_ALIGN (TREE_TYPE (TREE_OPERAND (exp, 0)))
6085                   < BIGGEST_ALIGNMENT)
6086               && (TYPE_ALIGN_OK (TREE_TYPE (exp))
6087                   || TYPE_ALIGN_OK (TREE_TYPE (TREE_OPERAND (exp, 0)))))
6088             goto done;
6089           break;
6090
6091         default:
6092           goto done;
6093         }
6094
6095       /* If any reference in the chain is volatile, the effect is volatile.  */
6096       if (TREE_THIS_VOLATILE (exp))
6097         *pvolatilep = 1;
6098
6099       exp = TREE_OPERAND (exp, 0);
6100     }
6101  done:
6102
6103   /* If OFFSET is constant, see if we can return the whole thing as a
6104      constant bit position.  Make sure to handle overflow during
6105      this conversion.  */
6106   if (host_integerp (offset, 0))
6107     {
6108       double_int tem = double_int_mul (tree_to_double_int (offset),
6109                                        uhwi_to_double_int (BITS_PER_UNIT));
6110       tem = double_int_add (tem, tree_to_double_int (bit_offset));
6111       if (double_int_fits_in_shwi_p (tem))
6112         {
6113           *pbitpos = double_int_to_shwi (tem);
6114           *poffset = offset = NULL_TREE;
6115         }
6116     }
6117
6118   /* Otherwise, split it up.  */
6119   if (offset)
6120     {
6121       *pbitpos = tree_low_cst (bit_offset, 0);
6122       *poffset = offset;
6123     }
6124
6125   /* We can use BLKmode for a byte-aligned BLKmode bitfield.  */
6126   if (mode == VOIDmode
6127       && blkmode_bitfield
6128       && (*pbitpos % BITS_PER_UNIT) == 0
6129       && (*pbitsize % BITS_PER_UNIT) == 0)
6130     *pmode = BLKmode;
6131   else
6132     *pmode = mode;
6133
6134   return exp;
6135 }
6136
6137 /* Given an expression EXP that may be a COMPONENT_REF, an ARRAY_REF or an
6138    ARRAY_RANGE_REF, look for whether EXP or any nested component-refs within
6139    EXP is marked as PACKED.  */
6140
6141 bool
6142 contains_packed_reference (const_tree exp)
6143 {
6144   bool packed_p = false;
6145
6146   while (1)
6147     {
6148       switch (TREE_CODE (exp))
6149         {
6150         case COMPONENT_REF:
6151           {
6152             tree field = TREE_OPERAND (exp, 1);
6153             packed_p = DECL_PACKED (field)
6154                        || TYPE_PACKED (TREE_TYPE (field))
6155                        || TYPE_PACKED (TREE_TYPE (exp));
6156             if (packed_p)
6157               goto done;
6158           }
6159           break;
6160
6161         case BIT_FIELD_REF:
6162         case ARRAY_REF:
6163         case ARRAY_RANGE_REF:
6164         case REALPART_EXPR:
6165         case IMAGPART_EXPR:
6166         case VIEW_CONVERT_EXPR:
6167           break;
6168
6169         default:
6170           goto done;
6171         }
6172       exp = TREE_OPERAND (exp, 0);
6173     }
6174  done:
6175   return packed_p;
6176 }
6177
6178 /* Return a tree of sizetype representing the size, in bytes, of the element
6179    of EXP, an ARRAY_REF or an ARRAY_RANGE_REF.  */
6180
6181 tree
6182 array_ref_element_size (tree exp)
6183 {
6184   tree aligned_size = TREE_OPERAND (exp, 3);
6185   tree elmt_type = TREE_TYPE (TREE_TYPE (TREE_OPERAND (exp, 0)));
6186   location_t loc = EXPR_LOCATION (exp);
6187
6188   /* If a size was specified in the ARRAY_REF, it's the size measured
6189      in alignment units of the element type.  So multiply by that value.  */
6190   if (aligned_size)
6191     {
6192       /* ??? tree_ssa_useless_type_conversion will eliminate casts to
6193          sizetype from another type of the same width and signedness.  */
6194       if (TREE_TYPE (aligned_size) != sizetype)
6195         aligned_size = fold_convert_loc (loc, sizetype, aligned_size);
6196       return size_binop_loc (loc, MULT_EXPR, aligned_size,
6197                              size_int (TYPE_ALIGN_UNIT (elmt_type)));
6198     }
6199
6200   /* Otherwise, take the size from that of the element type.  Substitute
6201      any PLACEHOLDER_EXPR that we have.  */
6202   else
6203     return SUBSTITUTE_PLACEHOLDER_IN_EXPR (TYPE_SIZE_UNIT (elmt_type), exp);
6204 }
6205
6206 /* Return a tree representing the lower bound of the array mentioned in
6207    EXP, an ARRAY_REF or an ARRAY_RANGE_REF.  */
6208
6209 tree
6210 array_ref_low_bound (tree exp)
6211 {
6212   tree domain_type = TYPE_DOMAIN (TREE_TYPE (TREE_OPERAND (exp, 0)));
6213
6214   /* If a lower bound is specified in EXP, use it.  */
6215   if (TREE_OPERAND (exp, 2))
6216     return TREE_OPERAND (exp, 2);
6217
6218   /* Otherwise, if there is a domain type and it has a lower bound, use it,
6219      substituting for a PLACEHOLDER_EXPR as needed.  */
6220   if (domain_type && TYPE_MIN_VALUE (domain_type))
6221     return SUBSTITUTE_PLACEHOLDER_IN_EXPR (TYPE_MIN_VALUE (domain_type), exp);
6222
6223   /* Otherwise, return a zero of the appropriate type.  */
6224   return build_int_cst (TREE_TYPE (TREE_OPERAND (exp, 1)), 0);
6225 }
6226
6227 /* Return a tree representing the upper bound of the array mentioned in
6228    EXP, an ARRAY_REF or an ARRAY_RANGE_REF.  */
6229
6230 tree
6231 array_ref_up_bound (tree exp)
6232 {
6233   tree domain_type = TYPE_DOMAIN (TREE_TYPE (TREE_OPERAND (exp, 0)));
6234
6235   /* If there is a domain type and it has an upper bound, use it, substituting
6236      for a PLACEHOLDER_EXPR as needed.  */
6237   if (domain_type && TYPE_MAX_VALUE (domain_type))
6238     return SUBSTITUTE_PLACEHOLDER_IN_EXPR (TYPE_MAX_VALUE (domain_type), exp);
6239
6240   /* Otherwise fail.  */
6241   return NULL_TREE;
6242 }
6243
6244 /* Return a tree representing the offset, in bytes, of the field referenced
6245    by EXP.  This does not include any offset in DECL_FIELD_BIT_OFFSET.  */
6246
6247 tree
6248 component_ref_field_offset (tree exp)
6249 {
6250   tree aligned_offset = TREE_OPERAND (exp, 2);
6251   tree field = TREE_OPERAND (exp, 1);
6252   location_t loc = EXPR_LOCATION (exp);
6253
6254   /* If an offset was specified in the COMPONENT_REF, it's the offset measured
6255      in units of DECL_OFFSET_ALIGN / BITS_PER_UNIT.  So multiply by that
6256      value.  */
6257   if (aligned_offset)
6258     {
6259       /* ??? tree_ssa_useless_type_conversion will eliminate casts to
6260          sizetype from another type of the same width and signedness.  */
6261       if (TREE_TYPE (aligned_offset) != sizetype)
6262         aligned_offset = fold_convert_loc (loc, sizetype, aligned_offset);
6263       return size_binop_loc (loc, MULT_EXPR, aligned_offset,
6264                              size_int (DECL_OFFSET_ALIGN (field)
6265                                        / BITS_PER_UNIT));
6266     }
6267
6268   /* Otherwise, take the offset from that of the field.  Substitute
6269      any PLACEHOLDER_EXPR that we have.  */
6270   else
6271     return SUBSTITUTE_PLACEHOLDER_IN_EXPR (DECL_FIELD_OFFSET (field), exp);
6272 }
6273
6274 /* Alignment in bits the TARGET of an assignment may be assumed to have.  */
6275
6276 static unsigned HOST_WIDE_INT
6277 target_align (const_tree target)
6278 {
6279   /* We might have a chain of nested references with intermediate misaligning
6280      bitfields components, so need to recurse to find out.  */
6281
6282   unsigned HOST_WIDE_INT this_align, outer_align;
6283
6284   switch (TREE_CODE (target))
6285     {
6286     case BIT_FIELD_REF:
6287       return 1;
6288
6289     case COMPONENT_REF:
6290       this_align = DECL_ALIGN (TREE_OPERAND (target, 1));
6291       outer_align = target_align (TREE_OPERAND (target, 0));
6292       return MIN (this_align, outer_align);
6293
6294     case ARRAY_REF:
6295     case ARRAY_RANGE_REF:
6296       this_align = TYPE_ALIGN (TREE_TYPE (target));
6297       outer_align = target_align (TREE_OPERAND (target, 0));
6298       return MIN (this_align, outer_align);
6299
6300     CASE_CONVERT:
6301     case NON_LVALUE_EXPR:
6302     case VIEW_CONVERT_EXPR:
6303       this_align = TYPE_ALIGN (TREE_TYPE (target));
6304       outer_align = target_align (TREE_OPERAND (target, 0));
6305       return MAX (this_align, outer_align);
6306
6307     default:
6308       return TYPE_ALIGN (TREE_TYPE (target));
6309     }
6310 }
6311
6312 \f
6313 /* Given an rtx VALUE that may contain additions and multiplications, return
6314    an equivalent value that just refers to a register, memory, or constant.
6315    This is done by generating instructions to perform the arithmetic and
6316    returning a pseudo-register containing the value.
6317
6318    The returned value may be a REG, SUBREG, MEM or constant.  */
6319
6320 rtx
6321 force_operand (rtx value, rtx target)
6322 {
6323   rtx op1, op2;
6324   /* Use subtarget as the target for operand 0 of a binary operation.  */
6325   rtx subtarget = get_subtarget (target);
6326   enum rtx_code code = GET_CODE (value);
6327
6328   /* Check for subreg applied to an expression produced by loop optimizer.  */
6329   if (code == SUBREG
6330       && !REG_P (SUBREG_REG (value))
6331       && !MEM_P (SUBREG_REG (value)))
6332     {
6333       value
6334         = simplify_gen_subreg (GET_MODE (value),
6335                                force_reg (GET_MODE (SUBREG_REG (value)),
6336                                           force_operand (SUBREG_REG (value),
6337                                                          NULL_RTX)),
6338                                GET_MODE (SUBREG_REG (value)),
6339                                SUBREG_BYTE (value));
6340       code = GET_CODE (value);
6341     }
6342
6343   /* Check for a PIC address load.  */
6344   if ((code == PLUS || code == MINUS)
6345       && XEXP (value, 0) == pic_offset_table_rtx
6346       && (GET_CODE (XEXP (value, 1)) == SYMBOL_REF
6347           || GET_CODE (XEXP (value, 1)) == LABEL_REF
6348           || GET_CODE (XEXP (value, 1)) == CONST))
6349     {
6350       if (!subtarget)
6351         subtarget = gen_reg_rtx (GET_MODE (value));
6352       emit_move_insn (subtarget, value);
6353       return subtarget;
6354     }
6355
6356   if (ARITHMETIC_P (value))
6357     {
6358       op2 = XEXP (value, 1);
6359       if (!CONSTANT_P (op2) && !(REG_P (op2) && op2 != subtarget))
6360         subtarget = 0;
6361       if (code == MINUS && CONST_INT_P (op2))
6362         {
6363           code = PLUS;
6364           op2 = negate_rtx (GET_MODE (value), op2);
6365         }
6366
6367       /* Check for an addition with OP2 a constant integer and our first
6368          operand a PLUS of a virtual register and something else.  In that
6369          case, we want to emit the sum of the virtual register and the
6370          constant first and then add the other value.  This allows virtual
6371          register instantiation to simply modify the constant rather than
6372          creating another one around this addition.  */
6373       if (code == PLUS && CONST_INT_P (op2)
6374           && GET_CODE (XEXP (value, 0)) == PLUS
6375           && REG_P (XEXP (XEXP (value, 0), 0))
6376           && REGNO (XEXP (XEXP (value, 0), 0)) >= FIRST_VIRTUAL_REGISTER
6377           && REGNO (XEXP (XEXP (value, 0), 0)) <= LAST_VIRTUAL_REGISTER)
6378         {
6379           rtx temp = expand_simple_binop (GET_MODE (value), code,
6380                                           XEXP (XEXP (value, 0), 0), op2,
6381                                           subtarget, 0, OPTAB_LIB_WIDEN);
6382           return expand_simple_binop (GET_MODE (value), code, temp,
6383                                       force_operand (XEXP (XEXP (value,
6384                                                                  0), 1), 0),
6385                                       target, 0, OPTAB_LIB_WIDEN);
6386         }
6387
6388       op1 = force_operand (XEXP (value, 0), subtarget);
6389       op2 = force_operand (op2, NULL_RTX);
6390       switch (code)
6391         {
6392         case MULT:
6393           return expand_mult (GET_MODE (value), op1, op2, target, 1);
6394         case DIV:
6395           if (!INTEGRAL_MODE_P (GET_MODE (value)))
6396             return expand_simple_binop (GET_MODE (value), code, op1, op2,
6397                                         target, 1, OPTAB_LIB_WIDEN);
6398           else
6399             return expand_divmod (0,
6400                                   FLOAT_MODE_P (GET_MODE (value))
6401                                   ? RDIV_EXPR : TRUNC_DIV_EXPR,
6402                                   GET_MODE (value), op1, op2, target, 0);
6403         case MOD:
6404           return expand_divmod (1, TRUNC_MOD_EXPR, GET_MODE (value), op1, op2,
6405                                 target, 0);
6406         case UDIV:
6407           return expand_divmod (0, TRUNC_DIV_EXPR, GET_MODE (value), op1, op2,
6408                                 target, 1);
6409         case UMOD:
6410           return expand_divmod (1, TRUNC_MOD_EXPR, GET_MODE (value), op1, op2,
6411                                 target, 1);
6412         case ASHIFTRT:
6413           return expand_simple_binop (GET_MODE (value), code, op1, op2,
6414                                       target, 0, OPTAB_LIB_WIDEN);
6415         default:
6416           return expand_simple_binop (GET_MODE (value), code, op1, op2,
6417                                       target, 1, OPTAB_LIB_WIDEN);
6418         }
6419     }
6420   if (UNARY_P (value))
6421     {
6422       if (!target)
6423         target = gen_reg_rtx (GET_MODE (value));
6424       op1 = force_operand (XEXP (value, 0), NULL_RTX);
6425       switch (code)
6426         {
6427         case ZERO_EXTEND:
6428         case SIGN_EXTEND:
6429         case TRUNCATE:
6430         case FLOAT_EXTEND:
6431         case FLOAT_TRUNCATE:
6432           convert_move (target, op1, code == ZERO_EXTEND);
6433           return target;
6434
6435         case FIX:
6436         case UNSIGNED_FIX:
6437           expand_fix (target, op1, code == UNSIGNED_FIX);
6438           return target;
6439
6440         case FLOAT:
6441         case UNSIGNED_FLOAT:
6442           expand_float (target, op1, code == UNSIGNED_FLOAT);
6443           return target;
6444
6445         default:
6446           return expand_simple_unop (GET_MODE (value), code, op1, target, 0);
6447         }
6448     }
6449
6450 #ifdef INSN_SCHEDULING
6451   /* On machines that have insn scheduling, we want all memory reference to be
6452      explicit, so we need to deal with such paradoxical SUBREGs.  */
6453   if (GET_CODE (value) == SUBREG && MEM_P (SUBREG_REG (value))
6454       && (GET_MODE_SIZE (GET_MODE (value))
6455           > GET_MODE_SIZE (GET_MODE (SUBREG_REG (value)))))
6456     value
6457       = simplify_gen_subreg (GET_MODE (value),
6458                              force_reg (GET_MODE (SUBREG_REG (value)),
6459                                         force_operand (SUBREG_REG (value),
6460                                                        NULL_RTX)),
6461                              GET_MODE (SUBREG_REG (value)),
6462                              SUBREG_BYTE (value));
6463 #endif
6464
6465   return value;
6466 }
6467 \f
6468 /* Subroutine of expand_expr: return nonzero iff there is no way that
6469    EXP can reference X, which is being modified.  TOP_P is nonzero if this
6470    call is going to be used to determine whether we need a temporary
6471    for EXP, as opposed to a recursive call to this function.
6472
6473    It is always safe for this routine to return zero since it merely
6474    searches for optimization opportunities.  */
6475
6476 int
6477 safe_from_p (const_rtx x, tree exp, int top_p)
6478 {
6479   rtx exp_rtl = 0;
6480   int i, nops;
6481
6482   if (x == 0
6483       /* If EXP has varying size, we MUST use a target since we currently
6484          have no way of allocating temporaries of variable size
6485          (except for arrays that have TYPE_ARRAY_MAX_SIZE set).
6486          So we assume here that something at a higher level has prevented a
6487          clash.  This is somewhat bogus, but the best we can do.  Only
6488          do this when X is BLKmode and when we are at the top level.  */
6489       || (top_p && TREE_TYPE (exp) != 0 && COMPLETE_TYPE_P (TREE_TYPE (exp))
6490           && TREE_CODE (TYPE_SIZE (TREE_TYPE (exp))) != INTEGER_CST
6491           && (TREE_CODE (TREE_TYPE (exp)) != ARRAY_TYPE
6492               || TYPE_ARRAY_MAX_SIZE (TREE_TYPE (exp)) == NULL_TREE
6493               || TREE_CODE (TYPE_ARRAY_MAX_SIZE (TREE_TYPE (exp)))
6494               != INTEGER_CST)
6495           && GET_MODE (x) == BLKmode)
6496       /* If X is in the outgoing argument area, it is always safe.  */
6497       || (MEM_P (x)
6498           && (XEXP (x, 0) == virtual_outgoing_args_rtx
6499               || (GET_CODE (XEXP (x, 0)) == PLUS
6500                   && XEXP (XEXP (x, 0), 0) == virtual_outgoing_args_rtx))))
6501     return 1;
6502
6503   /* If this is a subreg of a hard register, declare it unsafe, otherwise,
6504      find the underlying pseudo.  */
6505   if (GET_CODE (x) == SUBREG)
6506     {
6507       x = SUBREG_REG (x);
6508       if (REG_P (x) && REGNO (x) < FIRST_PSEUDO_REGISTER)
6509         return 0;
6510     }
6511
6512   /* Now look at our tree code and possibly recurse.  */
6513   switch (TREE_CODE_CLASS (TREE_CODE (exp)))
6514     {
6515     case tcc_declaration:
6516       exp_rtl = DECL_RTL_IF_SET (exp);
6517       break;
6518
6519     case tcc_constant:
6520       return 1;
6521
6522     case tcc_exceptional:
6523       if (TREE_CODE (exp) == TREE_LIST)
6524         {
6525           while (1)
6526             {
6527               if (TREE_VALUE (exp) && !safe_from_p (x, TREE_VALUE (exp), 0))
6528                 return 0;
6529               exp = TREE_CHAIN (exp);
6530               if (!exp)
6531                 return 1;
6532               if (TREE_CODE (exp) != TREE_LIST)
6533                 return safe_from_p (x, exp, 0);
6534             }
6535         }
6536       else if (TREE_CODE (exp) == CONSTRUCTOR)
6537         {
6538           constructor_elt *ce;
6539           unsigned HOST_WIDE_INT idx;
6540
6541           for (idx = 0;
6542                VEC_iterate (constructor_elt, CONSTRUCTOR_ELTS (exp), idx, ce);
6543                idx++)
6544             if ((ce->index != NULL_TREE && !safe_from_p (x, ce->index, 0))
6545                 || !safe_from_p (x, ce->value, 0))
6546               return 0;
6547           return 1;
6548         }
6549       else if (TREE_CODE (exp) == ERROR_MARK)
6550         return 1;       /* An already-visited SAVE_EXPR? */
6551       else
6552         return 0;
6553
6554     case tcc_statement:
6555       /* The only case we look at here is the DECL_INITIAL inside a
6556          DECL_EXPR.  */
6557       return (TREE_CODE (exp) != DECL_EXPR
6558               || TREE_CODE (DECL_EXPR_DECL (exp)) != VAR_DECL
6559               || !DECL_INITIAL (DECL_EXPR_DECL (exp))
6560               || safe_from_p (x, DECL_INITIAL (DECL_EXPR_DECL (exp)), 0));
6561
6562     case tcc_binary:
6563     case tcc_comparison:
6564       if (!safe_from_p (x, TREE_OPERAND (exp, 1), 0))
6565         return 0;
6566       /* Fall through.  */
6567
6568     case tcc_unary:
6569       return safe_from_p (x, TREE_OPERAND (exp, 0), 0);
6570
6571     case tcc_expression:
6572     case tcc_reference:
6573     case tcc_vl_exp:
6574       /* Now do code-specific tests.  EXP_RTL is set to any rtx we find in
6575          the expression.  If it is set, we conflict iff we are that rtx or
6576          both are in memory.  Otherwise, we check all operands of the
6577          expression recursively.  */
6578
6579       switch (TREE_CODE (exp))
6580         {
6581         case ADDR_EXPR:
6582           /* If the operand is static or we are static, we can't conflict.
6583              Likewise if we don't conflict with the operand at all.  */
6584           if (staticp (TREE_OPERAND (exp, 0))
6585               || TREE_STATIC (exp)
6586               || safe_from_p (x, TREE_OPERAND (exp, 0), 0))
6587             return 1;
6588
6589           /* Otherwise, the only way this can conflict is if we are taking
6590              the address of a DECL a that address if part of X, which is
6591              very rare.  */
6592           exp = TREE_OPERAND (exp, 0);
6593           if (DECL_P (exp))
6594             {
6595               if (!DECL_RTL_SET_P (exp)
6596                   || !MEM_P (DECL_RTL (exp)))
6597                 return 0;
6598               else
6599                 exp_rtl = XEXP (DECL_RTL (exp), 0);
6600             }
6601           break;
6602
6603         case MISALIGNED_INDIRECT_REF:
6604         case ALIGN_INDIRECT_REF:
6605         case INDIRECT_REF:
6606           if (MEM_P (x)
6607               && alias_sets_conflict_p (MEM_ALIAS_SET (x),
6608                                         get_alias_set (exp)))
6609             return 0;
6610           break;
6611
6612         case CALL_EXPR:
6613           /* Assume that the call will clobber all hard registers and
6614              all of memory.  */
6615           if ((REG_P (x) && REGNO (x) < FIRST_PSEUDO_REGISTER)
6616               || MEM_P (x))
6617             return 0;
6618           break;
6619
6620         case WITH_CLEANUP_EXPR:
6621         case CLEANUP_POINT_EXPR:
6622           /* Lowered by gimplify.c.  */
6623           gcc_unreachable ();
6624
6625         case SAVE_EXPR:
6626           return safe_from_p (x, TREE_OPERAND (exp, 0), 0);
6627
6628         default:
6629           break;
6630         }
6631
6632       /* If we have an rtx, we do not need to scan our operands.  */
6633       if (exp_rtl)
6634         break;
6635
6636       nops = TREE_OPERAND_LENGTH (exp);
6637       for (i = 0; i < nops; i++)
6638         if (TREE_OPERAND (exp, i) != 0
6639             && ! safe_from_p (x, TREE_OPERAND (exp, i), 0))
6640           return 0;
6641
6642       break;
6643
6644     case tcc_type:
6645       /* Should never get a type here.  */
6646       gcc_unreachable ();
6647     }
6648
6649   /* If we have an rtl, find any enclosed object.  Then see if we conflict
6650      with it.  */
6651   if (exp_rtl)
6652     {
6653       if (GET_CODE (exp_rtl) == SUBREG)
6654         {
6655           exp_rtl = SUBREG_REG (exp_rtl);
6656           if (REG_P (exp_rtl)
6657               && REGNO (exp_rtl) < FIRST_PSEUDO_REGISTER)
6658             return 0;
6659         }
6660
6661       /* If the rtl is X, then it is not safe.  Otherwise, it is unless both
6662          are memory and they conflict.  */
6663       return ! (rtx_equal_p (x, exp_rtl)
6664                 || (MEM_P (x) && MEM_P (exp_rtl)
6665                     && true_dependence (exp_rtl, VOIDmode, x,
6666                                         rtx_addr_varies_p)));
6667     }
6668
6669   /* If we reach here, it is safe.  */
6670   return 1;
6671 }
6672
6673 \f
6674 /* Return the highest power of two that EXP is known to be a multiple of.
6675    This is used in updating alignment of MEMs in array references.  */
6676
6677 unsigned HOST_WIDE_INT
6678 highest_pow2_factor (const_tree exp)
6679 {
6680   unsigned HOST_WIDE_INT c0, c1;
6681
6682   switch (TREE_CODE (exp))
6683     {
6684     case INTEGER_CST:
6685       /* We can find the lowest bit that's a one.  If the low
6686          HOST_BITS_PER_WIDE_INT bits are zero, return BIGGEST_ALIGNMENT.
6687          We need to handle this case since we can find it in a COND_EXPR,
6688          a MIN_EXPR, or a MAX_EXPR.  If the constant overflows, we have an
6689          erroneous program, so return BIGGEST_ALIGNMENT to avoid any
6690          later ICE.  */
6691       if (TREE_OVERFLOW (exp))
6692         return BIGGEST_ALIGNMENT;
6693       else
6694         {
6695           /* Note: tree_low_cst is intentionally not used here,
6696              we don't care about the upper bits.  */
6697           c0 = TREE_INT_CST_LOW (exp);
6698           c0 &= -c0;
6699           return c0 ? c0 : BIGGEST_ALIGNMENT;
6700         }
6701       break;
6702
6703     case PLUS_EXPR:  case MINUS_EXPR:  case MIN_EXPR:  case MAX_EXPR:
6704       c0 = highest_pow2_factor (TREE_OPERAND (exp, 0));
6705       c1 = highest_pow2_factor (TREE_OPERAND (exp, 1));
6706       return MIN (c0, c1);
6707
6708     case MULT_EXPR:
6709       c0 = highest_pow2_factor (TREE_OPERAND (exp, 0));
6710       c1 = highest_pow2_factor (TREE_OPERAND (exp, 1));
6711       return c0 * c1;
6712
6713     case ROUND_DIV_EXPR:  case TRUNC_DIV_EXPR:  case FLOOR_DIV_EXPR:
6714     case CEIL_DIV_EXPR:
6715       if (integer_pow2p (TREE_OPERAND (exp, 1))
6716           && host_integerp (TREE_OPERAND (exp, 1), 1))
6717         {
6718           c0 = highest_pow2_factor (TREE_OPERAND (exp, 0));
6719           c1 = tree_low_cst (TREE_OPERAND (exp, 1), 1);
6720           return MAX (1, c0 / c1);
6721         }
6722       break;
6723
6724     case BIT_AND_EXPR:
6725       /* The highest power of two of a bit-and expression is the maximum of
6726          that of its operands.  We typically get here for a complex LHS and
6727          a constant negative power of two on the RHS to force an explicit
6728          alignment, so don't bother looking at the LHS.  */
6729       return highest_pow2_factor (TREE_OPERAND (exp, 1));
6730
6731     CASE_CONVERT:
6732     case SAVE_EXPR:
6733       return highest_pow2_factor (TREE_OPERAND (exp, 0));
6734
6735     case COMPOUND_EXPR:
6736       return highest_pow2_factor (TREE_OPERAND (exp, 1));
6737
6738     case COND_EXPR:
6739       c0 = highest_pow2_factor (TREE_OPERAND (exp, 1));
6740       c1 = highest_pow2_factor (TREE_OPERAND (exp, 2));
6741       return MIN (c0, c1);
6742
6743     default:
6744       break;
6745     }
6746
6747   return 1;
6748 }
6749
6750 /* Similar, except that the alignment requirements of TARGET are
6751    taken into account.  Assume it is at least as aligned as its
6752    type, unless it is a COMPONENT_REF in which case the layout of
6753    the structure gives the alignment.  */
6754
6755 static unsigned HOST_WIDE_INT
6756 highest_pow2_factor_for_target (const_tree target, const_tree exp)
6757 {
6758   unsigned HOST_WIDE_INT talign = target_align (target) / BITS_PER_UNIT;
6759   unsigned HOST_WIDE_INT factor = highest_pow2_factor (exp);
6760
6761   return MAX (factor, talign);
6762 }
6763 \f
6764 /* Return &VAR expression for emulated thread local VAR.  */
6765
6766 static tree
6767 emutls_var_address (tree var)
6768 {
6769   tree emuvar = emutls_decl (var);
6770   tree fn = built_in_decls [BUILT_IN_EMUTLS_GET_ADDRESS];
6771   tree arg = build_fold_addr_expr_with_type (emuvar, ptr_type_node);
6772   tree arglist = build_tree_list (NULL_TREE, arg);
6773   tree call = build_function_call_expr (UNKNOWN_LOCATION, fn, arglist);
6774   return fold_convert (build_pointer_type (TREE_TYPE (var)), call);
6775 }
6776 \f
6777
6778 /* Subroutine of expand_expr.  Expand the two operands of a binary
6779    expression EXP0 and EXP1 placing the results in OP0 and OP1.
6780    The value may be stored in TARGET if TARGET is nonzero.  The
6781    MODIFIER argument is as documented by expand_expr.  */
6782
6783 static void
6784 expand_operands (tree exp0, tree exp1, rtx target, rtx *op0, rtx *op1,
6785                  enum expand_modifier modifier)
6786 {
6787   if (! safe_from_p (target, exp1, 1))
6788     target = 0;
6789   if (operand_equal_p (exp0, exp1, 0))
6790     {
6791       *op0 = expand_expr (exp0, target, VOIDmode, modifier);
6792       *op1 = copy_rtx (*op0);
6793     }
6794   else
6795     {
6796       /* If we need to preserve evaluation order, copy exp0 into its own
6797          temporary variable so that it can't be clobbered by exp1.  */
6798       if (flag_evaluation_order && TREE_SIDE_EFFECTS (exp1))
6799         exp0 = save_expr (exp0);
6800       *op0 = expand_expr (exp0, target, VOIDmode, modifier);
6801       *op1 = expand_expr (exp1, NULL_RTX, VOIDmode, modifier);
6802     }
6803 }
6804
6805 \f
6806 /* Return a MEM that contains constant EXP.  DEFER is as for
6807    output_constant_def and MODIFIER is as for expand_expr.  */
6808
6809 static rtx
6810 expand_expr_constant (tree exp, int defer, enum expand_modifier modifier)
6811 {
6812   rtx mem;
6813
6814   mem = output_constant_def (exp, defer);
6815   if (modifier != EXPAND_INITIALIZER)
6816     mem = use_anchored_address (mem);
6817   return mem;
6818 }
6819
6820 /* A subroutine of expand_expr_addr_expr.  Evaluate the address of EXP.
6821    The TARGET, TMODE and MODIFIER arguments are as for expand_expr.  */
6822
6823 static rtx
6824 expand_expr_addr_expr_1 (tree exp, rtx target, enum machine_mode tmode,
6825                          enum expand_modifier modifier, addr_space_t as)
6826 {
6827   rtx result, subtarget;
6828   tree inner, offset;
6829   HOST_WIDE_INT bitsize, bitpos;
6830   int volatilep, unsignedp;
6831   enum machine_mode mode1;
6832
6833   /* If we are taking the address of a constant and are at the top level,
6834      we have to use output_constant_def since we can't call force_const_mem
6835      at top level.  */
6836   /* ??? This should be considered a front-end bug.  We should not be
6837      generating ADDR_EXPR of something that isn't an LVALUE.  The only
6838      exception here is STRING_CST.  */
6839   if (CONSTANT_CLASS_P (exp))
6840     return XEXP (expand_expr_constant (exp, 0, modifier), 0);
6841
6842   /* Everything must be something allowed by is_gimple_addressable.  */
6843   switch (TREE_CODE (exp))
6844     {
6845     case INDIRECT_REF:
6846       /* This case will happen via recursion for &a->b.  */
6847       return expand_expr (TREE_OPERAND (exp, 0), target, tmode, modifier);
6848
6849     case CONST_DECL:
6850       /* Expand the initializer like constants above.  */
6851       return XEXP (expand_expr_constant (DECL_INITIAL (exp), 0, modifier), 0);
6852
6853     case REALPART_EXPR:
6854       /* The real part of the complex number is always first, therefore
6855          the address is the same as the address of the parent object.  */
6856       offset = 0;
6857       bitpos = 0;
6858       inner = TREE_OPERAND (exp, 0);
6859       break;
6860
6861     case IMAGPART_EXPR:
6862       /* The imaginary part of the complex number is always second.
6863          The expression is therefore always offset by the size of the
6864          scalar type.  */
6865       offset = 0;
6866       bitpos = GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (exp)));
6867       inner = TREE_OPERAND (exp, 0);
6868       break;
6869
6870     case VAR_DECL:
6871       /* TLS emulation hook - replace __thread VAR's &VAR with
6872          __emutls_get_address (&_emutls.VAR).  */
6873       if (! targetm.have_tls
6874           && TREE_CODE (exp) == VAR_DECL
6875           && DECL_THREAD_LOCAL_P (exp))
6876         {
6877           exp = emutls_var_address (exp);
6878           return expand_expr (exp, target, tmode, modifier);
6879         }
6880       /* Fall through.  */
6881
6882     default:
6883       /* If the object is a DECL, then expand it for its rtl.  Don't bypass
6884          expand_expr, as that can have various side effects; LABEL_DECLs for
6885          example, may not have their DECL_RTL set yet.  Expand the rtl of
6886          CONSTRUCTORs too, which should yield a memory reference for the
6887          constructor's contents.  Assume language specific tree nodes can
6888          be expanded in some interesting way.  */
6889       gcc_assert (TREE_CODE (exp) < LAST_AND_UNUSED_TREE_CODE);
6890       if (DECL_P (exp)
6891           || TREE_CODE (exp) == CONSTRUCTOR
6892           || TREE_CODE (exp) == COMPOUND_LITERAL_EXPR)
6893         {
6894           result = expand_expr (exp, target, tmode,
6895                                 modifier == EXPAND_INITIALIZER
6896                                 ? EXPAND_INITIALIZER : EXPAND_CONST_ADDRESS);
6897
6898           /* If the DECL isn't in memory, then the DECL wasn't properly
6899              marked TREE_ADDRESSABLE, which will be either a front-end
6900              or a tree optimizer bug.  */
6901           gcc_assert (MEM_P (result));
6902           result = XEXP (result, 0);
6903
6904           /* ??? Is this needed anymore?  */
6905           if (DECL_P (exp) && !TREE_USED (exp) == 0)
6906             {
6907               assemble_external (exp);
6908               TREE_USED (exp) = 1;
6909             }
6910
6911           if (modifier != EXPAND_INITIALIZER
6912               && modifier != EXPAND_CONST_ADDRESS)
6913             result = force_operand (result, target);
6914           return result;
6915         }
6916
6917       /* Pass FALSE as the last argument to get_inner_reference although
6918          we are expanding to RTL.  The rationale is that we know how to
6919          handle "aligning nodes" here: we can just bypass them because
6920          they won't change the final object whose address will be returned
6921          (they actually exist only for that purpose).  */
6922       inner = get_inner_reference (exp, &bitsize, &bitpos, &offset,
6923                                    &mode1, &unsignedp, &volatilep, false);
6924       break;
6925     }
6926
6927   /* We must have made progress.  */
6928   gcc_assert (inner != exp);
6929
6930   subtarget = offset || bitpos ? NULL_RTX : target;
6931   /* For VIEW_CONVERT_EXPR, where the outer alignment is bigger than
6932      inner alignment, force the inner to be sufficiently aligned.  */
6933   if (CONSTANT_CLASS_P (inner)
6934       && TYPE_ALIGN (TREE_TYPE (inner)) < TYPE_ALIGN (TREE_TYPE (exp)))
6935     {
6936       inner = copy_node (inner);
6937       TREE_TYPE (inner) = copy_node (TREE_TYPE (inner));
6938       TYPE_ALIGN (TREE_TYPE (inner)) = TYPE_ALIGN (TREE_TYPE (exp));
6939       TYPE_USER_ALIGN (TREE_TYPE (inner)) = 1;
6940     }
6941   result = expand_expr_addr_expr_1 (inner, subtarget, tmode, modifier, as);
6942
6943   if (offset)
6944     {
6945       rtx tmp;
6946
6947       if (modifier != EXPAND_NORMAL)
6948         result = force_operand (result, NULL);
6949       tmp = expand_expr (offset, NULL_RTX, tmode,
6950                          modifier == EXPAND_INITIALIZER
6951                           ? EXPAND_INITIALIZER : EXPAND_NORMAL);
6952
6953       result = convert_memory_address_addr_space (tmode, result, as);
6954       tmp = convert_memory_address_addr_space (tmode, tmp, as);
6955
6956       if (modifier == EXPAND_SUM || modifier == EXPAND_INITIALIZER)
6957         result = gen_rtx_PLUS (tmode, result, tmp);
6958       else
6959         {
6960           subtarget = bitpos ? NULL_RTX : target;
6961           result = expand_simple_binop (tmode, PLUS, result, tmp, subtarget,
6962                                         1, OPTAB_LIB_WIDEN);
6963         }
6964     }
6965
6966   if (bitpos)
6967     {
6968       /* Someone beforehand should have rejected taking the address
6969          of such an object.  */
6970       gcc_assert ((bitpos % BITS_PER_UNIT) == 0);
6971
6972       result = plus_constant (result, bitpos / BITS_PER_UNIT);
6973       if (modifier < EXPAND_SUM)
6974         result = force_operand (result, target);
6975     }
6976
6977   return result;
6978 }
6979
6980 /* A subroutine of expand_expr.  Evaluate EXP, which is an ADDR_EXPR.
6981    The TARGET, TMODE and MODIFIER arguments are as for expand_expr.  */
6982
6983 static rtx
6984 expand_expr_addr_expr (tree exp, rtx target, enum machine_mode tmode,
6985                        enum expand_modifier modifier)
6986 {
6987   addr_space_t as = ADDR_SPACE_GENERIC;
6988   enum machine_mode address_mode = Pmode;
6989   enum machine_mode pointer_mode = ptr_mode;
6990   enum machine_mode rmode;
6991   rtx result;
6992
6993   /* Target mode of VOIDmode says "whatever's natural".  */
6994   if (tmode == VOIDmode)
6995     tmode = TYPE_MODE (TREE_TYPE (exp));
6996
6997   if (POINTER_TYPE_P (TREE_TYPE (exp)))
6998     {
6999       as = TYPE_ADDR_SPACE (TREE_TYPE (TREE_TYPE (exp)));
7000       address_mode = targetm.addr_space.address_mode (as);
7001       pointer_mode = targetm.addr_space.pointer_mode (as);
7002     }
7003
7004   /* We can get called with some Weird Things if the user does silliness
7005      like "(short) &a".  In that case, convert_memory_address won't do
7006      the right thing, so ignore the given target mode.  */
7007   if (tmode != address_mode && tmode != pointer_mode)
7008     tmode = address_mode;
7009
7010   result = expand_expr_addr_expr_1 (TREE_OPERAND (exp, 0), target,
7011                                     tmode, modifier, as);
7012
7013   /* Despite expand_expr claims concerning ignoring TMODE when not
7014      strictly convenient, stuff breaks if we don't honor it.  Note
7015      that combined with the above, we only do this for pointer modes.  */
7016   rmode = GET_MODE (result);
7017   if (rmode == VOIDmode)
7018     rmode = tmode;
7019   if (rmode != tmode)
7020     result = convert_memory_address_addr_space (tmode, result, as);
7021
7022   return result;
7023 }
7024
7025 /* Generate code for computing CONSTRUCTOR EXP.
7026    An rtx for the computed value is returned.  If AVOID_TEMP_MEM
7027    is TRUE, instead of creating a temporary variable in memory
7028    NULL is returned and the caller needs to handle it differently.  */
7029
7030 static rtx
7031 expand_constructor (tree exp, rtx target, enum expand_modifier modifier,
7032                     bool avoid_temp_mem)
7033 {
7034   tree type = TREE_TYPE (exp);
7035   enum machine_mode mode = TYPE_MODE (type);
7036
7037   /* Try to avoid creating a temporary at all.  This is possible
7038      if all of the initializer is zero.
7039      FIXME: try to handle all [0..255] initializers we can handle
7040      with memset.  */
7041   if (TREE_STATIC (exp)
7042       && !TREE_ADDRESSABLE (exp)
7043       && target != 0 && mode == BLKmode
7044       && all_zeros_p (exp))
7045     {
7046       clear_storage (target, expr_size (exp), BLOCK_OP_NORMAL);
7047       return target;
7048     }
7049
7050   /* All elts simple constants => refer to a constant in memory.  But
7051      if this is a non-BLKmode mode, let it store a field at a time
7052      since that should make a CONST_INT or CONST_DOUBLE when we
7053      fold.  Likewise, if we have a target we can use, it is best to
7054      store directly into the target unless the type is large enough
7055      that memcpy will be used.  If we are making an initializer and
7056      all operands are constant, put it in memory as well.
7057
7058      FIXME: Avoid trying to fill vector constructors piece-meal.
7059      Output them with output_constant_def below unless we're sure
7060      they're zeros.  This should go away when vector initializers
7061      are treated like VECTOR_CST instead of arrays.  */
7062   if ((TREE_STATIC (exp)
7063        && ((mode == BLKmode
7064             && ! (target != 0 && safe_from_p (target, exp, 1)))
7065                   || TREE_ADDRESSABLE (exp)
7066                   || (host_integerp (TYPE_SIZE_UNIT (type), 1)
7067                       && (! MOVE_BY_PIECES_P
7068                                      (tree_low_cst (TYPE_SIZE_UNIT (type), 1),
7069                                       TYPE_ALIGN (type)))
7070                       && ! mostly_zeros_p (exp))))
7071       || ((modifier == EXPAND_INITIALIZER || modifier == EXPAND_CONST_ADDRESS)
7072           && TREE_CONSTANT (exp)))
7073     {
7074       rtx constructor;
7075
7076       if (avoid_temp_mem)
7077         return NULL_RTX;
7078
7079       constructor = expand_expr_constant (exp, 1, modifier);
7080
7081       if (modifier != EXPAND_CONST_ADDRESS
7082           && modifier != EXPAND_INITIALIZER
7083           && modifier != EXPAND_SUM)
7084         constructor = validize_mem (constructor);
7085
7086       return constructor;
7087     }
7088
7089   /* Handle calls that pass values in multiple non-contiguous
7090      locations.  The Irix 6 ABI has examples of this.  */
7091   if (target == 0 || ! safe_from_p (target, exp, 1)
7092       || GET_CODE (target) == PARALLEL || modifier == EXPAND_STACK_PARM)
7093     {
7094       if (avoid_temp_mem)
7095         return NULL_RTX;
7096
7097       target
7098         = assign_temp (build_qualified_type (type, (TYPE_QUALS (type)
7099                                                     | (TREE_READONLY (exp)
7100                                                        * TYPE_QUAL_CONST))),
7101                        0, TREE_ADDRESSABLE (exp), 1);
7102     }
7103
7104   store_constructor (exp, target, 0, int_expr_size (exp));
7105   return target;
7106 }
7107
7108
7109 /* expand_expr: generate code for computing expression EXP.
7110    An rtx for the computed value is returned.  The value is never null.
7111    In the case of a void EXP, const0_rtx is returned.
7112
7113    The value may be stored in TARGET if TARGET is nonzero.
7114    TARGET is just a suggestion; callers must assume that
7115    the rtx returned may not be the same as TARGET.
7116
7117    If TARGET is CONST0_RTX, it means that the value will be ignored.
7118
7119    If TMODE is not VOIDmode, it suggests generating the
7120    result in mode TMODE.  But this is done only when convenient.
7121    Otherwise, TMODE is ignored and the value generated in its natural mode.
7122    TMODE is just a suggestion; callers must assume that
7123    the rtx returned may not have mode TMODE.
7124
7125    Note that TARGET may have neither TMODE nor MODE.  In that case, it
7126    probably will not be used.
7127
7128    If MODIFIER is EXPAND_SUM then when EXP is an addition
7129    we can return an rtx of the form (MULT (REG ...) (CONST_INT ...))
7130    or a nest of (PLUS ...) and (MINUS ...) where the terms are
7131    products as above, or REG or MEM, or constant.
7132    Ordinarily in such cases we would output mul or add instructions
7133    and then return a pseudo reg containing the sum.
7134
7135    EXPAND_INITIALIZER is much like EXPAND_SUM except that
7136    it also marks a label as absolutely required (it can't be dead).
7137    It also makes a ZERO_EXTEND or SIGN_EXTEND instead of emitting extend insns.
7138    This is used for outputting expressions used in initializers.
7139
7140    EXPAND_CONST_ADDRESS says that it is okay to return a MEM
7141    with a constant address even if that address is not normally legitimate.
7142    EXPAND_INITIALIZER and EXPAND_SUM also have this effect.
7143
7144    EXPAND_STACK_PARM is used when expanding to a TARGET on the stack for
7145    a call parameter.  Such targets require special care as we haven't yet
7146    marked TARGET so that it's safe from being trashed by libcalls.  We
7147    don't want to use TARGET for anything but the final result;
7148    Intermediate values must go elsewhere.   Additionally, calls to
7149    emit_block_move will be flagged with BLOCK_OP_CALL_PARM.
7150
7151    If EXP is a VAR_DECL whose DECL_RTL was a MEM with an invalid
7152    address, and ALT_RTL is non-NULL, then *ALT_RTL is set to the
7153    DECL_RTL of the VAR_DECL.  *ALT_RTL is also set if EXP is a
7154    COMPOUND_EXPR whose second argument is such a VAR_DECL, and so on
7155    recursively.  */
7156
7157 rtx
7158 expand_expr_real (tree exp, rtx target, enum machine_mode tmode,
7159                   enum expand_modifier modifier, rtx *alt_rtl)
7160 {
7161   rtx ret;
7162
7163   /* Handle ERROR_MARK before anybody tries to access its type.  */
7164   if (TREE_CODE (exp) == ERROR_MARK
7165       || (TREE_CODE (TREE_TYPE (exp)) == ERROR_MARK))
7166     {
7167       ret = CONST0_RTX (tmode);
7168       return ret ? ret : const0_rtx;
7169     }
7170
7171   /* If this is an expression of some kind and it has an associated line
7172      number, then emit the line number before expanding the expression.
7173
7174      We need to save and restore the file and line information so that
7175      errors discovered during expansion are emitted with the right
7176      information.  It would be better of the diagnostic routines
7177      used the file/line information embedded in the tree nodes rather
7178      than globals.  */
7179   if (cfun && EXPR_HAS_LOCATION (exp))
7180     {
7181       location_t saved_location = input_location;
7182       location_t saved_curr_loc = get_curr_insn_source_location ();
7183       tree saved_block = get_curr_insn_block ();
7184       input_location = EXPR_LOCATION (exp);
7185       set_curr_insn_source_location (input_location);
7186
7187       /* Record where the insns produced belong.  */
7188       set_curr_insn_block (TREE_BLOCK (exp));
7189
7190       ret = expand_expr_real_1 (exp, target, tmode, modifier, alt_rtl);
7191
7192       input_location = saved_location;
7193       set_curr_insn_block (saved_block);
7194       set_curr_insn_source_location (saved_curr_loc);
7195     }
7196   else
7197     {
7198       ret = expand_expr_real_1 (exp, target, tmode, modifier, alt_rtl);
7199     }
7200
7201   return ret;
7202 }
7203
7204 rtx
7205 expand_expr_real_2 (sepops ops, rtx target, enum machine_mode tmode,
7206                     enum expand_modifier modifier)
7207 {
7208   rtx op0, op1, op2, temp;
7209   tree type;
7210   int unsignedp;
7211   enum machine_mode mode;
7212   enum tree_code code = ops->code;
7213   optab this_optab;
7214   rtx subtarget, original_target;
7215   int ignore;
7216   tree subexp0, subexp1;
7217   bool reduce_bit_field;
7218   gimple subexp0_def, subexp1_def;
7219   tree top0, top1;
7220   location_t loc = ops->location;
7221   tree treeop0, treeop1;
7222 #define REDUCE_BIT_FIELD(expr)  (reduce_bit_field                         \
7223                                  ? reduce_to_bit_field_precision ((expr), \
7224                                                                   target, \
7225                                                                   type)   \
7226                                  : (expr))
7227
7228   type = ops->type;
7229   mode = TYPE_MODE (type);
7230   unsignedp = TYPE_UNSIGNED (type);
7231
7232   treeop0 = ops->op0;
7233   treeop1 = ops->op1;
7234
7235   /* We should be called only on simple (binary or unary) expressions,
7236      exactly those that are valid in gimple expressions that aren't
7237      GIMPLE_SINGLE_RHS (or invalid).  */
7238   gcc_assert (get_gimple_rhs_class (code) == GIMPLE_UNARY_RHS
7239               || get_gimple_rhs_class (code) == GIMPLE_BINARY_RHS);
7240
7241   ignore = (target == const0_rtx
7242             || ((CONVERT_EXPR_CODE_P (code)
7243                  || code == COND_EXPR || code == VIEW_CONVERT_EXPR)
7244                 && TREE_CODE (type) == VOID_TYPE));
7245
7246   /* We should be called only if we need the result.  */
7247   gcc_assert (!ignore);
7248
7249   /* An operation in what may be a bit-field type needs the
7250      result to be reduced to the precision of the bit-field type,
7251      which is narrower than that of the type's mode.  */
7252   reduce_bit_field = (TREE_CODE (type) == INTEGER_TYPE
7253                       && GET_MODE_PRECISION (mode) > TYPE_PRECISION (type));
7254
7255   if (reduce_bit_field && modifier == EXPAND_STACK_PARM)
7256     target = 0;
7257
7258   /* Use subtarget as the target for operand 0 of a binary operation.  */
7259   subtarget = get_subtarget (target);
7260   original_target = target;
7261
7262   switch (code)
7263     {
7264     case NON_LVALUE_EXPR:
7265     case PAREN_EXPR:
7266     CASE_CONVERT:
7267       if (treeop0 == error_mark_node)
7268         return const0_rtx;
7269
7270       if (TREE_CODE (type) == UNION_TYPE)
7271         {
7272           tree valtype = TREE_TYPE (treeop0);
7273
7274           /* If both input and output are BLKmode, this conversion isn't doing
7275              anything except possibly changing memory attribute.  */
7276           if (mode == BLKmode && TYPE_MODE (valtype) == BLKmode)
7277             {
7278               rtx result = expand_expr (treeop0, target, tmode,
7279                                         modifier);
7280
7281               result = copy_rtx (result);
7282               set_mem_attributes (result, type, 0);
7283               return result;
7284             }
7285
7286           if (target == 0)
7287             {
7288               if (TYPE_MODE (type) != BLKmode)
7289                 target = gen_reg_rtx (TYPE_MODE (type));
7290               else
7291                 target = assign_temp (type, 0, 1, 1);
7292             }
7293
7294           if (MEM_P (target))
7295             /* Store data into beginning of memory target.  */
7296             store_expr (treeop0,
7297                         adjust_address (target, TYPE_MODE (valtype), 0),
7298                         modifier == EXPAND_STACK_PARM,
7299                         false);
7300
7301           else
7302             {
7303               gcc_assert (REG_P (target));
7304
7305               /* Store this field into a union of the proper type.  */
7306               store_field (target,
7307                            MIN ((int_size_in_bytes (TREE_TYPE
7308                                                     (treeop0))
7309                                  * BITS_PER_UNIT),
7310                                 (HOST_WIDE_INT) GET_MODE_BITSIZE (mode)),
7311                            0, TYPE_MODE (valtype), treeop0,
7312                            type, 0, false);
7313             }
7314
7315           /* Return the entire union.  */
7316           return target;
7317         }
7318
7319       if (mode == TYPE_MODE (TREE_TYPE (treeop0)))
7320         {
7321           op0 = expand_expr (treeop0, target, VOIDmode,
7322                              modifier);
7323
7324           /* If the signedness of the conversion differs and OP0 is
7325              a promoted SUBREG, clear that indication since we now
7326              have to do the proper extension.  */
7327           if (TYPE_UNSIGNED (TREE_TYPE (treeop0)) != unsignedp
7328               && GET_CODE (op0) == SUBREG)
7329             SUBREG_PROMOTED_VAR_P (op0) = 0;
7330
7331           return REDUCE_BIT_FIELD (op0);
7332         }
7333
7334       op0 = expand_expr (treeop0, NULL_RTX, mode,
7335                          modifier == EXPAND_SUM ? EXPAND_NORMAL : modifier);
7336       if (GET_MODE (op0) == mode)
7337         ;
7338
7339       /* If OP0 is a constant, just convert it into the proper mode.  */
7340       else if (CONSTANT_P (op0))
7341         {
7342           tree inner_type = TREE_TYPE (treeop0);
7343           enum machine_mode inner_mode = TYPE_MODE (inner_type);
7344
7345           if (modifier == EXPAND_INITIALIZER)
7346             op0 = simplify_gen_subreg (mode, op0, inner_mode,
7347                                        subreg_lowpart_offset (mode,
7348                                                               inner_mode));
7349           else
7350             op0=  convert_modes (mode, inner_mode, op0,
7351                                  TYPE_UNSIGNED (inner_type));
7352         }
7353
7354       else if (modifier == EXPAND_INITIALIZER)
7355         op0 = gen_rtx_fmt_e (unsignedp ? ZERO_EXTEND : SIGN_EXTEND, mode, op0);
7356
7357       else if (target == 0)
7358         op0 = convert_to_mode (mode, op0,
7359                                TYPE_UNSIGNED (TREE_TYPE
7360                                               (treeop0)));
7361       else
7362         {
7363           convert_move (target, op0,
7364                         TYPE_UNSIGNED (TREE_TYPE (treeop0)));
7365           op0 = target;
7366         }
7367
7368       return REDUCE_BIT_FIELD (op0);
7369
7370     case ADDR_SPACE_CONVERT_EXPR:
7371       {
7372         tree treeop0_type = TREE_TYPE (treeop0);
7373         addr_space_t as_to;
7374         addr_space_t as_from;
7375
7376         gcc_assert (POINTER_TYPE_P (type));
7377         gcc_assert (POINTER_TYPE_P (treeop0_type));
7378
7379         as_to = TYPE_ADDR_SPACE (TREE_TYPE (type));
7380         as_from = TYPE_ADDR_SPACE (TREE_TYPE (treeop0_type));
7381
7382         /* Conversions between pointers to the same address space should
7383            have been implemented via CONVERT_EXPR / NOP_EXPR.  */
7384         gcc_assert (as_to != as_from);
7385
7386         /* Ask target code to handle conversion between pointers
7387            to overlapping address spaces.  */
7388         if (targetm.addr_space.subset_p (as_to, as_from)
7389             || targetm.addr_space.subset_p (as_from, as_to))
7390           {
7391             op0 = expand_expr (treeop0, NULL_RTX, VOIDmode, modifier);
7392             op0 = targetm.addr_space.convert (op0, treeop0_type, type);
7393             gcc_assert (op0);
7394             return op0;
7395           }
7396
7397         /* For disjoint address spaces, converting anything but
7398            a null pointer invokes undefined behaviour.  We simply
7399            always return a null pointer here.  */
7400         return CONST0_RTX (mode);
7401       }
7402
7403     case POINTER_PLUS_EXPR:
7404       /* Even though the sizetype mode and the pointer's mode can be different
7405          expand is able to handle this correctly and get the correct result out
7406          of the PLUS_EXPR code.  */
7407       /* Make sure to sign-extend the sizetype offset in a POINTER_PLUS_EXPR
7408          if sizetype precision is smaller than pointer precision.  */
7409       if (TYPE_PRECISION (sizetype) < TYPE_PRECISION (type))
7410         treeop1 = fold_convert_loc (loc, type,
7411                                     fold_convert_loc (loc, ssizetype,
7412                                                       treeop1));
7413     case PLUS_EXPR:
7414
7415       /* Check if this is a case for multiplication and addition.  */
7416       if ((TREE_CODE (type) == INTEGER_TYPE
7417            || TREE_CODE (type) == FIXED_POINT_TYPE)
7418           && (subexp0_def = get_def_for_expr (treeop0,
7419                                               MULT_EXPR)))
7420         {
7421           tree subsubexp0, subsubexp1;
7422           gimple subsubexp0_def, subsubexp1_def;
7423           enum tree_code this_code;
7424
7425           this_code = TREE_CODE (type) == INTEGER_TYPE ? NOP_EXPR
7426                                                        : FIXED_CONVERT_EXPR;
7427           subsubexp0 = gimple_assign_rhs1 (subexp0_def);
7428           subsubexp0_def = get_def_for_expr (subsubexp0, this_code);
7429           subsubexp1 = gimple_assign_rhs2 (subexp0_def);
7430           subsubexp1_def = get_def_for_expr (subsubexp1, this_code);
7431           if (subsubexp0_def && subsubexp1_def
7432               && (top0 = gimple_assign_rhs1 (subsubexp0_def))
7433               && (top1 = gimple_assign_rhs1 (subsubexp1_def))
7434               && (TYPE_PRECISION (TREE_TYPE (top0))
7435                   < TYPE_PRECISION (TREE_TYPE (subsubexp0)))
7436               && (TYPE_PRECISION (TREE_TYPE (top0))
7437                   == TYPE_PRECISION (TREE_TYPE (top1)))
7438               && (TYPE_UNSIGNED (TREE_TYPE (top0))
7439                   == TYPE_UNSIGNED (TREE_TYPE (top1))))
7440             {
7441               tree op0type = TREE_TYPE (top0);
7442               enum machine_mode innermode = TYPE_MODE (op0type);
7443               bool zextend_p = TYPE_UNSIGNED (op0type);
7444               bool sat_p = TYPE_SATURATING (TREE_TYPE (subsubexp0));
7445               if (sat_p == 0)
7446                 this_optab = zextend_p ? umadd_widen_optab : smadd_widen_optab;
7447               else
7448                 this_optab = zextend_p ? usmadd_widen_optab
7449                                        : ssmadd_widen_optab;
7450               if (mode == GET_MODE_2XWIDER_MODE (innermode)
7451                   && (optab_handler (this_optab, mode)->insn_code
7452                       != CODE_FOR_nothing))
7453                 {
7454                   expand_operands (top0, top1, NULL_RTX, &op0, &op1,
7455                                    EXPAND_NORMAL);
7456                   op2 = expand_expr (treeop1, subtarget,
7457                                      VOIDmode, EXPAND_NORMAL);
7458                   temp = expand_ternary_op (mode, this_optab, op0, op1, op2,
7459                                             target, unsignedp);
7460                   gcc_assert (temp);
7461                   return REDUCE_BIT_FIELD (temp);
7462                 }
7463             }
7464         }
7465
7466       /* If we are adding a constant, a VAR_DECL that is sp, fp, or ap, and
7467          something else, make sure we add the register to the constant and
7468          then to the other thing.  This case can occur during strength
7469          reduction and doing it this way will produce better code if the
7470          frame pointer or argument pointer is eliminated.
7471
7472          fold-const.c will ensure that the constant is always in the inner
7473          PLUS_EXPR, so the only case we need to do anything about is if
7474          sp, ap, or fp is our second argument, in which case we must swap
7475          the innermost first argument and our second argument.  */
7476
7477       if (TREE_CODE (treeop0) == PLUS_EXPR
7478           && TREE_CODE (TREE_OPERAND (treeop0, 1)) == INTEGER_CST
7479           && TREE_CODE (treeop1) == VAR_DECL
7480           && (DECL_RTL (treeop1) == frame_pointer_rtx
7481               || DECL_RTL (treeop1) == stack_pointer_rtx
7482               || DECL_RTL (treeop1) == arg_pointer_rtx))
7483         {
7484           tree t = treeop1;
7485
7486           treeop1 = TREE_OPERAND (treeop0, 0);
7487           TREE_OPERAND (treeop0, 0) = t;
7488         }
7489
7490       /* If the result is to be ptr_mode and we are adding an integer to
7491          something, we might be forming a constant.  So try to use
7492          plus_constant.  If it produces a sum and we can't accept it,
7493          use force_operand.  This allows P = &ARR[const] to generate
7494          efficient code on machines where a SYMBOL_REF is not a valid
7495          address.
7496
7497          If this is an EXPAND_SUM call, always return the sum.  */
7498       if (modifier == EXPAND_SUM || modifier == EXPAND_INITIALIZER
7499           || (mode == ptr_mode && (unsignedp || ! flag_trapv)))
7500         {
7501           if (modifier == EXPAND_STACK_PARM)
7502             target = 0;
7503           if (TREE_CODE (treeop0) == INTEGER_CST
7504               && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
7505               && TREE_CONSTANT (treeop1))
7506             {
7507               rtx constant_part;
7508
7509               op1 = expand_expr (treeop1, subtarget, VOIDmode,
7510                                  EXPAND_SUM);
7511               /* Use immed_double_const to ensure that the constant is
7512                  truncated according to the mode of OP1, then sign extended
7513                  to a HOST_WIDE_INT.  Using the constant directly can result
7514                  in non-canonical RTL in a 64x32 cross compile.  */
7515               constant_part
7516                 = immed_double_const (TREE_INT_CST_LOW (treeop0),
7517                                       (HOST_WIDE_INT) 0,
7518                                       TYPE_MODE (TREE_TYPE (treeop1)));
7519               op1 = plus_constant (op1, INTVAL (constant_part));
7520               if (modifier != EXPAND_SUM && modifier != EXPAND_INITIALIZER)
7521                 op1 = force_operand (op1, target);
7522               return REDUCE_BIT_FIELD (op1);
7523             }
7524
7525           else if (TREE_CODE (treeop1) == INTEGER_CST
7526                    && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
7527                    && TREE_CONSTANT (treeop0))
7528             {
7529               rtx constant_part;
7530
7531               op0 = expand_expr (treeop0, subtarget, VOIDmode,
7532                                  (modifier == EXPAND_INITIALIZER
7533                                  ? EXPAND_INITIALIZER : EXPAND_SUM));
7534               if (! CONSTANT_P (op0))
7535                 {
7536                   op1 = expand_expr (treeop1, NULL_RTX,
7537                                      VOIDmode, modifier);
7538                   /* Return a PLUS if modifier says it's OK.  */
7539                   if (modifier == EXPAND_SUM
7540                       || modifier == EXPAND_INITIALIZER)
7541                     return simplify_gen_binary (PLUS, mode, op0, op1);
7542                   goto binop2;
7543                 }
7544               /* Use immed_double_const to ensure that the constant is
7545                  truncated according to the mode of OP1, then sign extended
7546                  to a HOST_WIDE_INT.  Using the constant directly can result
7547                  in non-canonical RTL in a 64x32 cross compile.  */
7548               constant_part
7549                 = immed_double_const (TREE_INT_CST_LOW (treeop1),
7550                                       (HOST_WIDE_INT) 0,
7551                                       TYPE_MODE (TREE_TYPE (treeop0)));
7552               op0 = plus_constant (op0, INTVAL (constant_part));
7553               if (modifier != EXPAND_SUM && modifier != EXPAND_INITIALIZER)
7554                 op0 = force_operand (op0, target);
7555               return REDUCE_BIT_FIELD (op0);
7556             }
7557         }
7558
7559       /* No sense saving up arithmetic to be done
7560          if it's all in the wrong mode to form part of an address.
7561          And force_operand won't know whether to sign-extend or
7562          zero-extend.  */
7563       if ((modifier != EXPAND_SUM && modifier != EXPAND_INITIALIZER)
7564           || mode != ptr_mode)
7565         {
7566           expand_operands (treeop0, treeop1,
7567                            subtarget, &op0, &op1, EXPAND_NORMAL);
7568           if (op0 == const0_rtx)
7569             return op1;
7570           if (op1 == const0_rtx)
7571             return op0;
7572           goto binop2;
7573         }
7574
7575       expand_operands (treeop0, treeop1,
7576                        subtarget, &op0, &op1, modifier);
7577       return REDUCE_BIT_FIELD (simplify_gen_binary (PLUS, mode, op0, op1));
7578
7579     case MINUS_EXPR:
7580       /* Check if this is a case for multiplication and subtraction.  */
7581       if ((TREE_CODE (type) == INTEGER_TYPE
7582            || TREE_CODE (type) == FIXED_POINT_TYPE)
7583           && (subexp1_def = get_def_for_expr (treeop1,
7584                                               MULT_EXPR)))
7585         {
7586           tree subsubexp0, subsubexp1;
7587           gimple subsubexp0_def, subsubexp1_def;
7588           enum tree_code this_code;
7589
7590           this_code = TREE_CODE (type) == INTEGER_TYPE ? NOP_EXPR
7591                                                        : FIXED_CONVERT_EXPR;
7592           subsubexp0 = gimple_assign_rhs1 (subexp1_def);
7593           subsubexp0_def = get_def_for_expr (subsubexp0, this_code);
7594           subsubexp1 = gimple_assign_rhs2 (subexp1_def);
7595           subsubexp1_def = get_def_for_expr (subsubexp1, this_code);
7596           if (subsubexp0_def && subsubexp1_def
7597               && (top0 = gimple_assign_rhs1 (subsubexp0_def))
7598               && (top1 = gimple_assign_rhs1 (subsubexp1_def))
7599               && (TYPE_PRECISION (TREE_TYPE (top0))
7600                   < TYPE_PRECISION (TREE_TYPE (subsubexp0)))
7601               && (TYPE_PRECISION (TREE_TYPE (top0))
7602                   == TYPE_PRECISION (TREE_TYPE (top1)))
7603               && (TYPE_UNSIGNED (TREE_TYPE (top0))
7604                   == TYPE_UNSIGNED (TREE_TYPE (top1))))
7605             {
7606               tree op0type = TREE_TYPE (top0);
7607               enum machine_mode innermode = TYPE_MODE (op0type);
7608               bool zextend_p = TYPE_UNSIGNED (op0type);
7609               bool sat_p = TYPE_SATURATING (TREE_TYPE (subsubexp0));
7610               if (sat_p == 0)
7611                 this_optab = zextend_p ? umsub_widen_optab : smsub_widen_optab;
7612               else
7613                 this_optab = zextend_p ? usmsub_widen_optab
7614                                        : ssmsub_widen_optab;
7615               if (mode == GET_MODE_2XWIDER_MODE (innermode)
7616                   && (optab_handler (this_optab, mode)->insn_code
7617                       != CODE_FOR_nothing))
7618                 {
7619                   expand_operands (top0, top1, NULL_RTX, &op0, &op1,
7620                                    EXPAND_NORMAL);
7621                   op2 = expand_expr (treeop0, subtarget,
7622                                      VOIDmode, EXPAND_NORMAL);
7623                   temp = expand_ternary_op (mode, this_optab, op0, op1, op2,
7624                                             target, unsignedp);
7625                   gcc_assert (temp);
7626                   return REDUCE_BIT_FIELD (temp);
7627                 }
7628             }
7629         }
7630
7631       /* For initializers, we are allowed to return a MINUS of two
7632          symbolic constants.  Here we handle all cases when both operands
7633          are constant.  */
7634       /* Handle difference of two symbolic constants,
7635          for the sake of an initializer.  */
7636       if ((modifier == EXPAND_SUM || modifier == EXPAND_INITIALIZER)
7637           && really_constant_p (treeop0)
7638           && really_constant_p (treeop1))
7639         {
7640           expand_operands (treeop0, treeop1,
7641                            NULL_RTX, &op0, &op1, modifier);
7642
7643           /* If the last operand is a CONST_INT, use plus_constant of
7644              the negated constant.  Else make the MINUS.  */
7645           if (CONST_INT_P (op1))
7646             return REDUCE_BIT_FIELD (plus_constant (op0, - INTVAL (op1)));
7647           else
7648             return REDUCE_BIT_FIELD (gen_rtx_MINUS (mode, op0, op1));
7649         }
7650
7651       /* No sense saving up arithmetic to be done
7652          if it's all in the wrong mode to form part of an address.
7653          And force_operand won't know whether to sign-extend or
7654          zero-extend.  */
7655       if ((modifier != EXPAND_SUM && modifier != EXPAND_INITIALIZER)
7656           || mode != ptr_mode)
7657         goto binop;
7658
7659       expand_operands (treeop0, treeop1,
7660                        subtarget, &op0, &op1, modifier);
7661
7662       /* Convert A - const to A + (-const).  */
7663       if (CONST_INT_P (op1))
7664         {
7665           op1 = negate_rtx (mode, op1);
7666           return REDUCE_BIT_FIELD (simplify_gen_binary (PLUS, mode, op0, op1));
7667         }
7668
7669       goto binop2;
7670
7671     case MULT_EXPR:
7672       /* If this is a fixed-point operation, then we cannot use the code
7673          below because "expand_mult" doesn't support sat/no-sat fixed-point
7674          multiplications.   */
7675       if (ALL_FIXED_POINT_MODE_P (mode))
7676         goto binop;
7677
7678       /* If first operand is constant, swap them.
7679          Thus the following special case checks need only
7680          check the second operand.  */
7681       if (TREE_CODE (treeop0) == INTEGER_CST)
7682         {
7683           tree t1 = treeop0;
7684           treeop0 = treeop1;
7685           treeop1 = t1;
7686         }
7687
7688       /* Attempt to return something suitable for generating an
7689          indexed address, for machines that support that.  */
7690
7691       if (modifier == EXPAND_SUM && mode == ptr_mode
7692           && host_integerp (treeop1, 0))
7693         {
7694           tree exp1 = treeop1;
7695
7696           op0 = expand_expr (treeop0, subtarget, VOIDmode,
7697                              EXPAND_SUM);
7698
7699           if (!REG_P (op0))
7700             op0 = force_operand (op0, NULL_RTX);
7701           if (!REG_P (op0))
7702             op0 = copy_to_mode_reg (mode, op0);
7703
7704           return REDUCE_BIT_FIELD (gen_rtx_MULT (mode, op0,
7705                                gen_int_mode (tree_low_cst (exp1, 0),
7706                                              TYPE_MODE (TREE_TYPE (exp1)))));
7707         }
7708
7709       if (modifier == EXPAND_STACK_PARM)
7710         target = 0;
7711
7712       /* Check for multiplying things that have been extended
7713          from a narrower type.  If this machine supports multiplying
7714          in that narrower type with a result in the desired type,
7715          do it that way, and avoid the explicit type-conversion.  */
7716
7717       subexp0 = treeop0;
7718       subexp1 = treeop1;
7719       subexp0_def = get_def_for_expr (subexp0, NOP_EXPR);
7720       subexp1_def = get_def_for_expr (subexp1, NOP_EXPR);
7721       top0 = top1 = NULL_TREE;
7722
7723       /* First, check if we have a multiplication of one signed and one
7724          unsigned operand.  */
7725       if (subexp0_def
7726           && (top0 = gimple_assign_rhs1 (subexp0_def))
7727           && subexp1_def
7728           && (top1 = gimple_assign_rhs1 (subexp1_def))
7729           && TREE_CODE (type) == INTEGER_TYPE
7730           && (TYPE_PRECISION (TREE_TYPE (top0))
7731               < TYPE_PRECISION (TREE_TYPE (subexp0)))
7732           && (TYPE_PRECISION (TREE_TYPE (top0))
7733               == TYPE_PRECISION (TREE_TYPE (top1)))
7734           && (TYPE_UNSIGNED (TREE_TYPE (top0))
7735               != TYPE_UNSIGNED (TREE_TYPE (top1))))
7736         {
7737           enum machine_mode innermode
7738             = TYPE_MODE (TREE_TYPE (top0));
7739           this_optab = usmul_widen_optab;
7740           if (mode == GET_MODE_WIDER_MODE (innermode))
7741             {
7742               if (optab_handler (this_optab, mode)->insn_code != CODE_FOR_nothing)
7743                 {
7744                   if (TYPE_UNSIGNED (TREE_TYPE (top0)))
7745                     expand_operands (top0, top1, NULL_RTX, &op0, &op1,
7746                                      EXPAND_NORMAL);
7747                   else
7748                     expand_operands (top0, top1, NULL_RTX, &op1, &op0,
7749                                      EXPAND_NORMAL);
7750
7751                   goto binop3;
7752                 }
7753             }
7754         }
7755       /* Check for a multiplication with matching signedness.  If
7756          valid, TOP0 and TOP1 were set in the previous if
7757          condition.  */
7758       else if (top0
7759           && TREE_CODE (type) == INTEGER_TYPE
7760           && (TYPE_PRECISION (TREE_TYPE (top0))
7761               < TYPE_PRECISION (TREE_TYPE (subexp0)))
7762           && ((TREE_CODE (subexp1) == INTEGER_CST
7763                && int_fits_type_p (subexp1, TREE_TYPE (top0))
7764                /* Don't use a widening multiply if a shift will do.  */
7765                && ((GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (subexp1)))
7766                     > HOST_BITS_PER_WIDE_INT)
7767                    || exact_log2 (TREE_INT_CST_LOW (subexp1)) < 0))
7768               ||
7769               (top1
7770                && (TYPE_PRECISION (TREE_TYPE (top1))
7771                    == TYPE_PRECISION (TREE_TYPE (top0))
7772                /* If both operands are extended, they must either both
7773                   be zero-extended or both be sign-extended.  */
7774                && (TYPE_UNSIGNED (TREE_TYPE (top1))
7775                    == TYPE_UNSIGNED (TREE_TYPE (top0)))))))
7776         {
7777           tree op0type = TREE_TYPE (top0);
7778           enum machine_mode innermode = TYPE_MODE (op0type);
7779           bool zextend_p = TYPE_UNSIGNED (op0type);
7780           optab other_optab = zextend_p ? smul_widen_optab : umul_widen_optab;
7781           this_optab = zextend_p ? umul_widen_optab : smul_widen_optab;
7782
7783           if (mode == GET_MODE_2XWIDER_MODE (innermode))
7784             {
7785               if (optab_handler (this_optab, mode)->insn_code != CODE_FOR_nothing)
7786                 {
7787                   if (TREE_CODE (subexp1) == INTEGER_CST)
7788                     expand_operands (top0, subexp1, NULL_RTX, &op0, &op1,
7789                                      EXPAND_NORMAL);
7790                   else
7791                     expand_operands (top0, top1, NULL_RTX, &op0, &op1,
7792                                      EXPAND_NORMAL);
7793                   goto binop3;
7794                 }
7795               else if (optab_handler (other_optab, mode)->insn_code != CODE_FOR_nothing
7796                        && innermode == word_mode)
7797                 {
7798                   rtx htem, hipart;
7799                   op0 = expand_normal (top0);
7800                   if (TREE_CODE (subexp1) == INTEGER_CST)
7801                     op1 = convert_modes (innermode, mode,
7802                                          expand_normal (subexp1), unsignedp);
7803                   else
7804                     op1 = expand_normal (top1);
7805                   temp = expand_binop (mode, other_optab, op0, op1, target,
7806                                        unsignedp, OPTAB_LIB_WIDEN);
7807                   hipart = gen_highpart (innermode, temp);
7808                   htem = expand_mult_highpart_adjust (innermode, hipart,
7809                                                       op0, op1, hipart,
7810                                                       zextend_p);
7811                   if (htem != hipart)
7812                     emit_move_insn (hipart, htem);
7813                   return REDUCE_BIT_FIELD (temp);
7814                 }
7815             }
7816         }
7817       expand_operands (subexp0, subexp1, subtarget, &op0, &op1, EXPAND_NORMAL);
7818       return REDUCE_BIT_FIELD (expand_mult (mode, op0, op1, target, unsignedp));
7819
7820     case TRUNC_DIV_EXPR:
7821     case FLOOR_DIV_EXPR:
7822     case CEIL_DIV_EXPR:
7823     case ROUND_DIV_EXPR:
7824     case EXACT_DIV_EXPR:
7825       /* If this is a fixed-point operation, then we cannot use the code
7826          below because "expand_divmod" doesn't support sat/no-sat fixed-point
7827          divisions.   */
7828       if (ALL_FIXED_POINT_MODE_P (mode))
7829         goto binop;
7830
7831       if (modifier == EXPAND_STACK_PARM)
7832         target = 0;
7833       /* Possible optimization: compute the dividend with EXPAND_SUM
7834          then if the divisor is constant can optimize the case
7835          where some terms of the dividend have coeffs divisible by it.  */
7836       expand_operands (treeop0, treeop1,
7837                        subtarget, &op0, &op1, EXPAND_NORMAL);
7838       return expand_divmod (0, code, mode, op0, op1, target, unsignedp);
7839
7840     case RDIV_EXPR:
7841       goto binop;
7842
7843     case TRUNC_MOD_EXPR:
7844     case FLOOR_MOD_EXPR:
7845     case CEIL_MOD_EXPR:
7846     case ROUND_MOD_EXPR:
7847       if (modifier == EXPAND_STACK_PARM)
7848         target = 0;
7849       expand_operands (treeop0, treeop1,
7850                        subtarget, &op0, &op1, EXPAND_NORMAL);
7851       return expand_divmod (1, code, mode, op0, op1, target, unsignedp);
7852
7853     case FIXED_CONVERT_EXPR:
7854       op0 = expand_normal (treeop0);
7855       if (target == 0 || modifier == EXPAND_STACK_PARM)
7856         target = gen_reg_rtx (mode);
7857
7858       if ((TREE_CODE (TREE_TYPE (treeop0)) == INTEGER_TYPE
7859            && TYPE_UNSIGNED (TREE_TYPE (treeop0)))
7860           || (TREE_CODE (type) == INTEGER_TYPE && TYPE_UNSIGNED (type)))
7861         expand_fixed_convert (target, op0, 1, TYPE_SATURATING (type));
7862       else
7863         expand_fixed_convert (target, op0, 0, TYPE_SATURATING (type));
7864       return target;
7865
7866     case FIX_TRUNC_EXPR:
7867       op0 = expand_normal (treeop0);
7868       if (target == 0 || modifier == EXPAND_STACK_PARM)
7869         target = gen_reg_rtx (mode);
7870       expand_fix (target, op0, unsignedp);
7871       return target;
7872
7873     case FLOAT_EXPR:
7874       op0 = expand_normal (treeop0);
7875       if (target == 0 || modifier == EXPAND_STACK_PARM)
7876         target = gen_reg_rtx (mode);
7877       /* expand_float can't figure out what to do if FROM has VOIDmode.
7878          So give it the correct mode.  With -O, cse will optimize this.  */
7879       if (GET_MODE (op0) == VOIDmode)
7880         op0 = copy_to_mode_reg (TYPE_MODE (TREE_TYPE (treeop0)),
7881                                 op0);
7882       expand_float (target, op0,
7883                     TYPE_UNSIGNED (TREE_TYPE (treeop0)));
7884       return target;
7885
7886     case NEGATE_EXPR:
7887       op0 = expand_expr (treeop0, subtarget,
7888                          VOIDmode, EXPAND_NORMAL);
7889       if (modifier == EXPAND_STACK_PARM)
7890         target = 0;
7891       temp = expand_unop (mode,
7892                           optab_for_tree_code (NEGATE_EXPR, type,
7893                                                optab_default),
7894                           op0, target, 0);
7895       gcc_assert (temp);
7896       return REDUCE_BIT_FIELD (temp);
7897
7898     case ABS_EXPR:
7899       op0 = expand_expr (treeop0, subtarget,
7900                          VOIDmode, EXPAND_NORMAL);
7901       if (modifier == EXPAND_STACK_PARM)
7902         target = 0;
7903
7904       /* ABS_EXPR is not valid for complex arguments.  */
7905       gcc_assert (GET_MODE_CLASS (mode) != MODE_COMPLEX_INT
7906                   && GET_MODE_CLASS (mode) != MODE_COMPLEX_FLOAT);
7907
7908       /* Unsigned abs is simply the operand.  Testing here means we don't
7909          risk generating incorrect code below.  */
7910       if (TYPE_UNSIGNED (type))
7911         return op0;
7912
7913       return expand_abs (mode, op0, target, unsignedp,
7914                          safe_from_p (target, treeop0, 1));
7915
7916     case MAX_EXPR:
7917     case MIN_EXPR:
7918       target = original_target;
7919       if (target == 0
7920           || modifier == EXPAND_STACK_PARM
7921           || (MEM_P (target) && MEM_VOLATILE_P (target))
7922           || GET_MODE (target) != mode
7923           || (REG_P (target)
7924               && REGNO (target) < FIRST_PSEUDO_REGISTER))
7925         target = gen_reg_rtx (mode);
7926       expand_operands (treeop0, treeop1,
7927                        target, &op0, &op1, EXPAND_NORMAL);
7928
7929       /* First try to do it with a special MIN or MAX instruction.
7930          If that does not win, use a conditional jump to select the proper
7931          value.  */
7932       this_optab = optab_for_tree_code (code, type, optab_default);
7933       temp = expand_binop (mode, this_optab, op0, op1, target, unsignedp,
7934                            OPTAB_WIDEN);
7935       if (temp != 0)
7936         return temp;
7937
7938       /* At this point, a MEM target is no longer useful; we will get better
7939          code without it.  */
7940
7941       if (! REG_P (target))
7942         target = gen_reg_rtx (mode);
7943
7944       /* If op1 was placed in target, swap op0 and op1.  */
7945       if (target != op0 && target == op1)
7946         {
7947           temp = op0;
7948           op0 = op1;
7949           op1 = temp;
7950         }
7951
7952       /* We generate better code and avoid problems with op1 mentioning
7953          target by forcing op1 into a pseudo if it isn't a constant.  */
7954       if (! CONSTANT_P (op1))
7955         op1 = force_reg (mode, op1);
7956
7957       {
7958         enum rtx_code comparison_code;
7959         rtx cmpop1 = op1;
7960
7961         if (code == MAX_EXPR)
7962           comparison_code = unsignedp ? GEU : GE;
7963         else
7964           comparison_code = unsignedp ? LEU : LE;
7965
7966         /* Canonicalize to comparisons against 0.  */
7967         if (op1 == const1_rtx)
7968           {
7969             /* Converting (a >= 1 ? a : 1) into (a > 0 ? a : 1)
7970                or (a != 0 ? a : 1) for unsigned.
7971                For MIN we are safe converting (a <= 1 ? a : 1)
7972                into (a <= 0 ? a : 1)  */
7973             cmpop1 = const0_rtx;
7974             if (code == MAX_EXPR)
7975               comparison_code = unsignedp ? NE : GT;
7976           }
7977         if (op1 == constm1_rtx && !unsignedp)
7978           {
7979             /* Converting (a >= -1 ? a : -1) into (a >= 0 ? a : -1)
7980                and (a <= -1 ? a : -1) into (a < 0 ? a : -1) */
7981             cmpop1 = const0_rtx;
7982             if (code == MIN_EXPR)
7983               comparison_code = LT;
7984           }
7985 #ifdef HAVE_conditional_move
7986         /* Use a conditional move if possible.  */
7987         if (can_conditionally_move_p (mode))
7988           {
7989             rtx insn;
7990
7991             /* ??? Same problem as in expmed.c: emit_conditional_move
7992                forces a stack adjustment via compare_from_rtx, and we
7993                lose the stack adjustment if the sequence we are about
7994                to create is discarded.  */
7995             do_pending_stack_adjust ();
7996
7997             start_sequence ();
7998
7999             /* Try to emit the conditional move.  */
8000             insn = emit_conditional_move (target, comparison_code,
8001                                           op0, cmpop1, mode,
8002                                           op0, op1, mode,
8003                                           unsignedp);
8004
8005             /* If we could do the conditional move, emit the sequence,
8006                and return.  */
8007             if (insn)
8008               {
8009                 rtx seq = get_insns ();
8010                 end_sequence ();
8011                 emit_insn (seq);
8012                 return target;
8013               }
8014
8015             /* Otherwise discard the sequence and fall back to code with
8016                branches.  */
8017             end_sequence ();
8018           }
8019 #endif
8020         if (target != op0)
8021           emit_move_insn (target, op0);
8022
8023         temp = gen_label_rtx ();
8024         do_compare_rtx_and_jump (target, cmpop1, comparison_code,
8025                                  unsignedp, mode, NULL_RTX, NULL_RTX, temp,
8026                                  -1);
8027       }
8028       emit_move_insn (target, op1);
8029       emit_label (temp);
8030       return target;
8031
8032     case BIT_NOT_EXPR:
8033       op0 = expand_expr (treeop0, subtarget,
8034                          VOIDmode, EXPAND_NORMAL);
8035       if (modifier == EXPAND_STACK_PARM)
8036         target = 0;
8037       temp = expand_unop (mode, one_cmpl_optab, op0, target, 1);
8038       gcc_assert (temp);
8039       return temp;
8040
8041       /* ??? Can optimize bitwise operations with one arg constant.
8042          Can optimize (a bitwise1 n) bitwise2 (a bitwise3 b)
8043          and (a bitwise1 b) bitwise2 b (etc)
8044          but that is probably not worth while.  */
8045
8046       /* BIT_AND_EXPR is for bitwise anding.  TRUTH_AND_EXPR is for anding two
8047          boolean values when we want in all cases to compute both of them.  In
8048          general it is fastest to do TRUTH_AND_EXPR by computing both operands
8049          as actual zero-or-1 values and then bitwise anding.  In cases where
8050          there cannot be any side effects, better code would be made by
8051          treating TRUTH_AND_EXPR like TRUTH_ANDIF_EXPR; but the question is
8052          how to recognize those cases.  */
8053
8054     case TRUTH_AND_EXPR:
8055       code = BIT_AND_EXPR;
8056     case BIT_AND_EXPR:
8057       goto binop;
8058
8059     case TRUTH_OR_EXPR:
8060       code = BIT_IOR_EXPR;
8061     case BIT_IOR_EXPR:
8062       goto binop;
8063
8064     case TRUTH_XOR_EXPR:
8065       code = BIT_XOR_EXPR;
8066     case BIT_XOR_EXPR:
8067       goto binop;
8068
8069     case LROTATE_EXPR:
8070     case RROTATE_EXPR:
8071       gcc_assert (VECTOR_MODE_P (TYPE_MODE (type))
8072                   || (GET_MODE_PRECISION (TYPE_MODE (type))
8073                       == TYPE_PRECISION (type)));
8074       /* fall through */
8075
8076     case LSHIFT_EXPR:
8077     case RSHIFT_EXPR:
8078       /* If this is a fixed-point operation, then we cannot use the code
8079          below because "expand_shift" doesn't support sat/no-sat fixed-point
8080          shifts.   */
8081       if (ALL_FIXED_POINT_MODE_P (mode))
8082         goto binop;
8083
8084       if (! safe_from_p (subtarget, treeop1, 1))
8085         subtarget = 0;
8086       if (modifier == EXPAND_STACK_PARM)
8087         target = 0;
8088       op0 = expand_expr (treeop0, subtarget,
8089                          VOIDmode, EXPAND_NORMAL);
8090       temp = expand_shift (code, mode, op0, treeop1, target,
8091                            unsignedp);
8092       if (code == LSHIFT_EXPR)
8093         temp = REDUCE_BIT_FIELD (temp);
8094       return temp;
8095
8096       /* Could determine the answer when only additive constants differ.  Also,
8097          the addition of one can be handled by changing the condition.  */
8098     case LT_EXPR:
8099     case LE_EXPR:
8100     case GT_EXPR:
8101     case GE_EXPR:
8102     case EQ_EXPR:
8103     case NE_EXPR:
8104     case UNORDERED_EXPR:
8105     case ORDERED_EXPR:
8106     case UNLT_EXPR:
8107     case UNLE_EXPR:
8108     case UNGT_EXPR:
8109     case UNGE_EXPR:
8110     case UNEQ_EXPR:
8111     case LTGT_EXPR:
8112       temp = do_store_flag (ops,
8113                             modifier != EXPAND_STACK_PARM ? target : NULL_RTX,
8114                             tmode != VOIDmode ? tmode : mode);
8115       if (temp)
8116         return temp;
8117
8118       /* Use a compare and a jump for BLKmode comparisons, or for function
8119          type comparisons is HAVE_canonicalize_funcptr_for_compare.  */
8120
8121       if ((target == 0
8122            || modifier == EXPAND_STACK_PARM
8123            || ! safe_from_p (target, treeop0, 1)
8124            || ! safe_from_p (target, treeop1, 1)
8125            /* Make sure we don't have a hard reg (such as function's return
8126               value) live across basic blocks, if not optimizing.  */
8127            || (!optimize && REG_P (target)
8128                && REGNO (target) < FIRST_PSEUDO_REGISTER)))
8129         target = gen_reg_rtx (tmode != VOIDmode ? tmode : mode);
8130
8131       emit_move_insn (target, const0_rtx);
8132
8133       op1 = gen_label_rtx ();
8134       jumpifnot_1 (code, treeop0, treeop1, op1, -1);
8135
8136       emit_move_insn (target, const1_rtx);
8137
8138       emit_label (op1);
8139       return target;
8140
8141     case TRUTH_NOT_EXPR:
8142       if (modifier == EXPAND_STACK_PARM)
8143         target = 0;
8144       op0 = expand_expr (treeop0, target,
8145                          VOIDmode, EXPAND_NORMAL);
8146       /* The parser is careful to generate TRUTH_NOT_EXPR
8147          only with operands that are always zero or one.  */
8148       temp = expand_binop (mode, xor_optab, op0, const1_rtx,
8149                            target, 1, OPTAB_LIB_WIDEN);
8150       gcc_assert (temp);
8151       return temp;
8152
8153     case COMPLEX_EXPR:
8154       /* Get the rtx code of the operands.  */
8155       op0 = expand_normal (treeop0);
8156       op1 = expand_normal (treeop1);
8157
8158       if (!target)
8159         target = gen_reg_rtx (TYPE_MODE (type));
8160
8161       /* Move the real (op0) and imaginary (op1) parts to their location.  */
8162       write_complex_part (target, op0, false);
8163       write_complex_part (target, op1, true);
8164
8165       return target;
8166
8167     case WIDEN_SUM_EXPR:
8168       {
8169         tree oprnd0 = treeop0;
8170         tree oprnd1 = treeop1;
8171
8172         expand_operands (oprnd0, oprnd1, NULL_RTX, &op0, &op1, EXPAND_NORMAL);
8173         target = expand_widen_pattern_expr (ops, op0, NULL_RTX, op1,
8174                                             target, unsignedp);
8175         return target;
8176       }
8177
8178     case REDUC_MAX_EXPR:
8179     case REDUC_MIN_EXPR:
8180     case REDUC_PLUS_EXPR:
8181       {
8182         op0 = expand_normal (treeop0);
8183         this_optab = optab_for_tree_code (code, type, optab_default);
8184         temp = expand_unop (mode, this_optab, op0, target, unsignedp);
8185         gcc_assert (temp);
8186         return temp;
8187       }
8188
8189     case VEC_EXTRACT_EVEN_EXPR:
8190     case VEC_EXTRACT_ODD_EXPR:
8191       {
8192         expand_operands (treeop0,  treeop1,
8193                          NULL_RTX, &op0, &op1, EXPAND_NORMAL);
8194         this_optab = optab_for_tree_code (code, type, optab_default);
8195         temp = expand_binop (mode, this_optab, op0, op1, target, unsignedp,
8196                              OPTAB_WIDEN);
8197         gcc_assert (temp);
8198         return temp;
8199       }
8200
8201     case VEC_INTERLEAVE_HIGH_EXPR:
8202     case VEC_INTERLEAVE_LOW_EXPR:
8203       {
8204         expand_operands (treeop0,  treeop1,
8205                          NULL_RTX, &op0, &op1, EXPAND_NORMAL);
8206         this_optab = optab_for_tree_code (code, type, optab_default);
8207         temp = expand_binop (mode, this_optab, op0, op1, target, unsignedp,
8208                              OPTAB_WIDEN);
8209         gcc_assert (temp);
8210         return temp;
8211       }
8212
8213     case VEC_LSHIFT_EXPR:
8214     case VEC_RSHIFT_EXPR:
8215       {
8216         target = expand_vec_shift_expr (ops, target);
8217         return target;
8218       }
8219
8220     case VEC_UNPACK_HI_EXPR:
8221     case VEC_UNPACK_LO_EXPR:
8222       {
8223         op0 = expand_normal (treeop0);
8224         this_optab = optab_for_tree_code (code, type, optab_default);
8225         temp = expand_widen_pattern_expr (ops, op0, NULL_RTX, NULL_RTX,
8226                                           target, unsignedp);
8227         gcc_assert (temp);
8228         return temp;
8229       }
8230
8231     case VEC_UNPACK_FLOAT_HI_EXPR:
8232     case VEC_UNPACK_FLOAT_LO_EXPR:
8233       {
8234         op0 = expand_normal (treeop0);
8235         /* The signedness is determined from input operand.  */
8236         this_optab = optab_for_tree_code (code,
8237                                           TREE_TYPE (treeop0),
8238                                           optab_default);
8239         temp = expand_widen_pattern_expr
8240           (ops, op0, NULL_RTX, NULL_RTX,
8241            target, TYPE_UNSIGNED (TREE_TYPE (treeop0)));
8242
8243         gcc_assert (temp);
8244         return temp;
8245       }
8246
8247     case VEC_WIDEN_MULT_HI_EXPR:
8248     case VEC_WIDEN_MULT_LO_EXPR:
8249       {
8250         tree oprnd0 = treeop0;
8251         tree oprnd1 = treeop1;
8252
8253         expand_operands (oprnd0, oprnd1, NULL_RTX, &op0, &op1, EXPAND_NORMAL);
8254         target = expand_widen_pattern_expr (ops, op0, op1, NULL_RTX,
8255                                             target, unsignedp);
8256         gcc_assert (target);
8257         return target;
8258       }
8259
8260     case VEC_PACK_TRUNC_EXPR:
8261     case VEC_PACK_SAT_EXPR:
8262     case VEC_PACK_FIX_TRUNC_EXPR:
8263       mode = TYPE_MODE (TREE_TYPE (treeop0));
8264       goto binop;
8265
8266     default:
8267       gcc_unreachable ();
8268     }
8269
8270   /* Here to do an ordinary binary operator.  */
8271  binop:
8272   expand_operands (treeop0, treeop1,
8273                    subtarget, &op0, &op1, EXPAND_NORMAL);
8274  binop2:
8275   this_optab = optab_for_tree_code (code, type, optab_default);
8276  binop3:
8277   if (modifier == EXPAND_STACK_PARM)
8278     target = 0;
8279   temp = expand_binop (mode, this_optab, op0, op1, target,
8280                        unsignedp, OPTAB_LIB_WIDEN);
8281   gcc_assert (temp);
8282   return REDUCE_BIT_FIELD (temp);
8283 }
8284 #undef REDUCE_BIT_FIELD
8285
8286 rtx
8287 expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
8288                     enum expand_modifier modifier, rtx *alt_rtl)
8289 {
8290   rtx op0, op1, temp, decl_rtl;
8291   tree type;
8292   int unsignedp;
8293   enum machine_mode mode;
8294   enum tree_code code = TREE_CODE (exp);
8295   optab this_optab;
8296   rtx subtarget, original_target;
8297   int ignore;
8298   tree context;
8299   bool reduce_bit_field;
8300   location_t loc = EXPR_LOCATION (exp);
8301   struct separate_ops ops;
8302   tree treeop0, treeop1, treeop2;
8303
8304   type = TREE_TYPE (exp);
8305   mode = TYPE_MODE (type);
8306   unsignedp = TYPE_UNSIGNED (type);
8307
8308   treeop0 = treeop1 = treeop2 = NULL_TREE;
8309   if (!VL_EXP_CLASS_P (exp))
8310     switch (TREE_CODE_LENGTH (code))
8311       {
8312         default:
8313         case 3: treeop2 = TREE_OPERAND (exp, 2);
8314         case 2: treeop1 = TREE_OPERAND (exp, 1);
8315         case 1: treeop0 = TREE_OPERAND (exp, 0);
8316         case 0: break;
8317       }
8318   ops.code = code;
8319   ops.type = type;
8320   ops.op0 = treeop0;
8321   ops.op1 = treeop1;
8322   ops.op2 = treeop2;
8323   ops.location = loc;
8324
8325   ignore = (target == const0_rtx
8326             || ((CONVERT_EXPR_CODE_P (code)
8327                  || code == COND_EXPR || code == VIEW_CONVERT_EXPR)
8328                 && TREE_CODE (type) == VOID_TYPE));
8329
8330   /* An operation in what may be a bit-field type needs the
8331      result to be reduced to the precision of the bit-field type,
8332      which is narrower than that of the type's mode.  */
8333   reduce_bit_field = (!ignore
8334                       && TREE_CODE (type) == INTEGER_TYPE
8335                       && GET_MODE_PRECISION (mode) > TYPE_PRECISION (type));
8336
8337   /* If we are going to ignore this result, we need only do something
8338      if there is a side-effect somewhere in the expression.  If there
8339      is, short-circuit the most common cases here.  Note that we must
8340      not call expand_expr with anything but const0_rtx in case this
8341      is an initial expansion of a size that contains a PLACEHOLDER_EXPR.  */
8342
8343   if (ignore)
8344     {
8345       if (! TREE_SIDE_EFFECTS (exp))
8346         return const0_rtx;
8347
8348       /* Ensure we reference a volatile object even if value is ignored, but
8349          don't do this if all we are doing is taking its address.  */
8350       if (TREE_THIS_VOLATILE (exp)
8351           && TREE_CODE (exp) != FUNCTION_DECL
8352           && mode != VOIDmode && mode != BLKmode
8353           && modifier != EXPAND_CONST_ADDRESS)
8354         {
8355           temp = expand_expr (exp, NULL_RTX, VOIDmode, modifier);
8356           if (MEM_P (temp))
8357             temp = copy_to_reg (temp);
8358           return const0_rtx;
8359         }
8360
8361       if (TREE_CODE_CLASS (code) == tcc_unary
8362           || code == COMPONENT_REF || code == INDIRECT_REF)
8363         return expand_expr (treeop0, const0_rtx, VOIDmode,
8364                             modifier);
8365
8366       else if (TREE_CODE_CLASS (code) == tcc_binary
8367                || TREE_CODE_CLASS (code) == tcc_comparison
8368                || code == ARRAY_REF || code == ARRAY_RANGE_REF)
8369         {
8370           expand_expr (treeop0, const0_rtx, VOIDmode, modifier);
8371           expand_expr (treeop1, const0_rtx, VOIDmode, modifier);
8372           return const0_rtx;
8373         }
8374       else if (code == BIT_FIELD_REF)
8375         {
8376           expand_expr (treeop0, const0_rtx, VOIDmode, modifier);
8377           expand_expr (treeop1, const0_rtx, VOIDmode, modifier);
8378           expand_expr (treeop2, const0_rtx, VOIDmode, modifier);
8379           return const0_rtx;
8380         }
8381
8382       target = 0;
8383     }
8384
8385   if (reduce_bit_field && modifier == EXPAND_STACK_PARM)
8386     target = 0;
8387
8388   /* Use subtarget as the target for operand 0 of a binary operation.  */
8389   subtarget = get_subtarget (target);
8390   original_target = target;
8391
8392   switch (code)
8393     {
8394     case LABEL_DECL:
8395       {
8396         tree function = decl_function_context (exp);
8397
8398         temp = label_rtx (exp);
8399         temp = gen_rtx_LABEL_REF (Pmode, temp);
8400
8401         if (function != current_function_decl
8402             && function != 0)
8403           LABEL_REF_NONLOCAL_P (temp) = 1;
8404
8405         temp = gen_rtx_MEM (FUNCTION_MODE, temp);
8406         return temp;
8407       }
8408
8409     case SSA_NAME:
8410       /* ??? ivopts calls expander, without any preparation from
8411          out-of-ssa.  So fake instructions as if this was an access to the
8412          base variable.  This unnecessarily allocates a pseudo, see how we can
8413          reuse it, if partition base vars have it set already.  */
8414       if (!currently_expanding_to_rtl)
8415         return expand_expr_real_1 (SSA_NAME_VAR (exp), target, tmode, modifier, NULL);
8416       {
8417         gimple g = get_gimple_for_ssa_name (exp);
8418         if (g)
8419           return expand_expr_real (gimple_assign_rhs_to_tree (g), target,
8420                                    tmode, modifier, NULL);
8421       }
8422       decl_rtl = get_rtx_for_ssa_name (exp);
8423       exp = SSA_NAME_VAR (exp);
8424       goto expand_decl_rtl;
8425
8426     case PARM_DECL:
8427     case VAR_DECL:
8428       /* If a static var's type was incomplete when the decl was written,
8429          but the type is complete now, lay out the decl now.  */
8430       if (DECL_SIZE (exp) == 0
8431           && COMPLETE_OR_UNBOUND_ARRAY_TYPE_P (TREE_TYPE (exp))
8432           && (TREE_STATIC (exp) || DECL_EXTERNAL (exp)))
8433         layout_decl (exp, 0);
8434
8435       /* TLS emulation hook - replace __thread vars with
8436          *__emutls_get_address (&_emutls.var).  */
8437       if (! targetm.have_tls
8438           && TREE_CODE (exp) == VAR_DECL
8439           && DECL_THREAD_LOCAL_P (exp))
8440         {
8441           exp = build_fold_indirect_ref_loc (loc, emutls_var_address (exp));
8442           return expand_expr_real_1 (exp, target, tmode, modifier, NULL);
8443         }
8444
8445       /* ... fall through ...  */
8446
8447     case FUNCTION_DECL:
8448     case RESULT_DECL:
8449       decl_rtl = DECL_RTL (exp);
8450     expand_decl_rtl:
8451       gcc_assert (decl_rtl);
8452       decl_rtl = copy_rtx (decl_rtl);
8453
8454       /* Ensure variable marked as used even if it doesn't go through
8455          a parser.  If it hasn't be used yet, write out an external
8456          definition.  */
8457       if (! TREE_USED (exp))
8458         {
8459           assemble_external (exp);
8460           TREE_USED (exp) = 1;
8461         }
8462
8463       /* Show we haven't gotten RTL for this yet.  */
8464       temp = 0;
8465
8466       /* Variables inherited from containing functions should have
8467          been lowered by this point.  */
8468       context = decl_function_context (exp);
8469       gcc_assert (!context
8470                   || context == current_function_decl
8471                   || TREE_STATIC (exp)
8472                   /* ??? C++ creates functions that are not TREE_STATIC.  */
8473                   || TREE_CODE (exp) == FUNCTION_DECL);
8474
8475       /* This is the case of an array whose size is to be determined
8476          from its initializer, while the initializer is still being parsed.
8477          See expand_decl.  */
8478
8479       if (MEM_P (decl_rtl) && REG_P (XEXP (decl_rtl, 0)))
8480         temp = validize_mem (decl_rtl);
8481
8482       /* If DECL_RTL is memory, we are in the normal case and the
8483          address is not valid, get the address into a register.  */
8484
8485       else if (MEM_P (decl_rtl) && modifier != EXPAND_INITIALIZER)
8486         {
8487           if (alt_rtl)
8488             *alt_rtl = decl_rtl;
8489           decl_rtl = use_anchored_address (decl_rtl);
8490           if (modifier != EXPAND_CONST_ADDRESS
8491               && modifier != EXPAND_SUM
8492               && !memory_address_addr_space_p (DECL_MODE (exp),
8493                                                XEXP (decl_rtl, 0),
8494                                                MEM_ADDR_SPACE (decl_rtl)))
8495             temp = replace_equiv_address (decl_rtl,
8496                                           copy_rtx (XEXP (decl_rtl, 0)));
8497         }
8498
8499       /* If we got something, return it.  But first, set the alignment
8500          if the address is a register.  */
8501       if (temp != 0)
8502         {
8503           if (MEM_P (temp) && REG_P (XEXP (temp, 0)))
8504             mark_reg_pointer (XEXP (temp, 0), DECL_ALIGN (exp));
8505
8506           return temp;
8507         }
8508
8509       /* If the mode of DECL_RTL does not match that of the decl, it
8510          must be a promoted value.  We return a SUBREG of the wanted mode,
8511          but mark it so that we know that it was already extended.  */
8512
8513       if (REG_P (decl_rtl)
8514           && GET_MODE (decl_rtl) != DECL_MODE (exp))
8515         {
8516           enum machine_mode pmode;
8517
8518           /* Get the signedness used for this variable.  Ensure we get the
8519              same mode we got when the variable was declared.  */
8520           pmode = promote_decl_mode (exp, &unsignedp);
8521           gcc_assert (GET_MODE (decl_rtl) == pmode);
8522
8523           temp = gen_lowpart_SUBREG (mode, decl_rtl);
8524           SUBREG_PROMOTED_VAR_P (temp) = 1;
8525           SUBREG_PROMOTED_UNSIGNED_SET (temp, unsignedp);
8526           return temp;
8527         }
8528
8529       return decl_rtl;
8530
8531     case INTEGER_CST:
8532       temp = immed_double_const (TREE_INT_CST_LOW (exp),
8533                                  TREE_INT_CST_HIGH (exp), mode);
8534
8535       return temp;
8536
8537     case VECTOR_CST:
8538       {
8539         tree tmp = NULL_TREE;
8540         if (GET_MODE_CLASS (mode) == MODE_VECTOR_INT
8541             || GET_MODE_CLASS (mode) == MODE_VECTOR_FLOAT
8542             || GET_MODE_CLASS (mode) == MODE_VECTOR_FRACT
8543             || GET_MODE_CLASS (mode) == MODE_VECTOR_UFRACT
8544             || GET_MODE_CLASS (mode) == MODE_VECTOR_ACCUM
8545             || GET_MODE_CLASS (mode) == MODE_VECTOR_UACCUM)
8546           return const_vector_from_tree (exp);
8547         if (GET_MODE_CLASS (mode) == MODE_INT)
8548           {
8549             tree type_for_mode = lang_hooks.types.type_for_mode (mode, 1);
8550             if (type_for_mode)
8551               tmp = fold_unary_loc (loc, VIEW_CONVERT_EXPR, type_for_mode, exp);
8552           }
8553         if (!tmp)
8554           tmp = build_constructor_from_list (type,
8555                                              TREE_VECTOR_CST_ELTS (exp));
8556         return expand_expr (tmp, ignore ? const0_rtx : target,
8557                             tmode, modifier);
8558       }
8559
8560     case CONST_DECL:
8561       return expand_expr (DECL_INITIAL (exp), target, VOIDmode, modifier);
8562
8563     case REAL_CST:
8564       /* If optimized, generate immediate CONST_DOUBLE
8565          which will be turned into memory by reload if necessary.
8566
8567          We used to force a register so that loop.c could see it.  But
8568          this does not allow gen_* patterns to perform optimizations with
8569          the constants.  It also produces two insns in cases like "x = 1.0;".
8570          On most machines, floating-point constants are not permitted in
8571          many insns, so we'd end up copying it to a register in any case.
8572
8573          Now, we do the copying in expand_binop, if appropriate.  */
8574       return CONST_DOUBLE_FROM_REAL_VALUE (TREE_REAL_CST (exp),
8575                                            TYPE_MODE (TREE_TYPE (exp)));
8576
8577     case FIXED_CST:
8578       return CONST_FIXED_FROM_FIXED_VALUE (TREE_FIXED_CST (exp),
8579                                            TYPE_MODE (TREE_TYPE (exp)));
8580
8581     case COMPLEX_CST:
8582       /* Handle evaluating a complex constant in a CONCAT target.  */
8583       if (original_target && GET_CODE (original_target) == CONCAT)
8584         {
8585           enum machine_mode mode = TYPE_MODE (TREE_TYPE (TREE_TYPE (exp)));
8586           rtx rtarg, itarg;
8587
8588           rtarg = XEXP (original_target, 0);
8589           itarg = XEXP (original_target, 1);
8590
8591           /* Move the real and imaginary parts separately.  */
8592           op0 = expand_expr (TREE_REALPART (exp), rtarg, mode, EXPAND_NORMAL);
8593           op1 = expand_expr (TREE_IMAGPART (exp), itarg, mode, EXPAND_NORMAL);
8594
8595           if (op0 != rtarg)
8596             emit_move_insn (rtarg, op0);
8597           if (op1 != itarg)
8598             emit_move_insn (itarg, op1);
8599
8600           return original_target;
8601         }
8602
8603       /* ... fall through ...  */
8604
8605     case STRING_CST:
8606       temp = expand_expr_constant (exp, 1, modifier);
8607
8608       /* temp contains a constant address.
8609          On RISC machines where a constant address isn't valid,
8610          make some insns to get that address into a register.  */
8611       if (modifier != EXPAND_CONST_ADDRESS
8612           && modifier != EXPAND_INITIALIZER
8613           && modifier != EXPAND_SUM
8614           && ! memory_address_addr_space_p (mode, XEXP (temp, 0),
8615                                             MEM_ADDR_SPACE (temp)))
8616         return replace_equiv_address (temp,
8617                                       copy_rtx (XEXP (temp, 0)));
8618       return temp;
8619
8620     case SAVE_EXPR:
8621       {
8622         tree val = treeop0;
8623         rtx ret = expand_expr_real_1 (val, target, tmode, modifier, alt_rtl);
8624
8625         if (!SAVE_EXPR_RESOLVED_P (exp))
8626           {
8627             /* We can indeed still hit this case, typically via builtin
8628                expanders calling save_expr immediately before expanding
8629                something.  Assume this means that we only have to deal
8630                with non-BLKmode values.  */
8631             gcc_assert (GET_MODE (ret) != BLKmode);
8632
8633             val = build_decl (EXPR_LOCATION (exp),
8634                               VAR_DECL, NULL, TREE_TYPE (exp));
8635             DECL_ARTIFICIAL (val) = 1;
8636             DECL_IGNORED_P (val) = 1;
8637             treeop0 = val;
8638             TREE_OPERAND (exp, 0) = treeop0;
8639             SAVE_EXPR_RESOLVED_P (exp) = 1;
8640
8641             if (!CONSTANT_P (ret))
8642               ret = copy_to_reg (ret);
8643             SET_DECL_RTL (val, ret);
8644           }
8645
8646         return ret;
8647       }
8648
8649
8650     case CONSTRUCTOR:
8651       /* If we don't need the result, just ensure we evaluate any
8652          subexpressions.  */
8653       if (ignore)
8654         {
8655           unsigned HOST_WIDE_INT idx;
8656           tree value;
8657
8658           FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (exp), idx, value)
8659             expand_expr (value, const0_rtx, VOIDmode, EXPAND_NORMAL);
8660
8661           return const0_rtx;
8662         }
8663
8664       return expand_constructor (exp, target, modifier, false);
8665
8666     case MISALIGNED_INDIRECT_REF:
8667     case ALIGN_INDIRECT_REF:
8668     case INDIRECT_REF:
8669       {
8670         tree exp1 = treeop0;
8671         addr_space_t as = ADDR_SPACE_GENERIC;
8672         enum machine_mode address_mode = Pmode;
8673
8674         if (modifier != EXPAND_WRITE)
8675           {
8676             tree t;
8677
8678             t = fold_read_from_constant_string (exp);
8679             if (t)
8680               return expand_expr (t, target, tmode, modifier);
8681           }
8682
8683         if (POINTER_TYPE_P (TREE_TYPE (exp1)))
8684           {
8685             as = TYPE_ADDR_SPACE (TREE_TYPE (TREE_TYPE (exp1)));
8686             address_mode = targetm.addr_space.address_mode (as);
8687           }
8688
8689         op0 = expand_expr (exp1, NULL_RTX, VOIDmode, EXPAND_SUM);
8690         op0 = memory_address_addr_space (mode, op0, as);
8691
8692         if (code == ALIGN_INDIRECT_REF)
8693           {
8694             int align = TYPE_ALIGN_UNIT (type);
8695             op0 = gen_rtx_AND (address_mode, op0, GEN_INT (-align));
8696             op0 = memory_address_addr_space (mode, op0, as);
8697           }
8698
8699         temp = gen_rtx_MEM (mode, op0);
8700
8701         set_mem_attributes (temp, exp, 0);
8702         set_mem_addr_space (temp, as);
8703
8704         /* Resolve the misalignment now, so that we don't have to remember
8705            to resolve it later.  Of course, this only works for reads.  */
8706         if (code == MISALIGNED_INDIRECT_REF)
8707           {
8708             int icode;
8709             rtx reg, insn;
8710
8711             gcc_assert (modifier == EXPAND_NORMAL
8712                         || modifier == EXPAND_STACK_PARM);
8713
8714             /* The vectorizer should have already checked the mode.  */
8715             icode = optab_handler (movmisalign_optab, mode)->insn_code;
8716             gcc_assert (icode != CODE_FOR_nothing);
8717
8718             /* We've already validated the memory, and we're creating a
8719                new pseudo destination.  The predicates really can't fail.  */
8720             reg = gen_reg_rtx (mode);
8721
8722             /* Nor can the insn generator.  */
8723             insn = GEN_FCN (icode) (reg, temp);
8724             emit_insn (insn);
8725
8726             return reg;
8727           }
8728
8729         return temp;
8730       }
8731
8732     case TARGET_MEM_REF:
8733       {
8734         addr_space_t as = TYPE_ADDR_SPACE (TREE_TYPE (exp));
8735         struct mem_address addr;
8736         tree base;
8737
8738         get_address_description (exp, &addr);
8739         op0 = addr_for_mem_ref (&addr, as, true);
8740         op0 = memory_address_addr_space (mode, op0, as);
8741         temp = gen_rtx_MEM (mode, op0);
8742         set_mem_attributes (temp, TMR_ORIGINAL (exp), 0);
8743         set_mem_addr_space (temp, as);
8744         base = get_base_address (TMR_ORIGINAL (exp));
8745         if (INDIRECT_REF_P (base)
8746             && TMR_BASE (exp)
8747             && TREE_CODE (TMR_BASE (exp)) == SSA_NAME
8748             && POINTER_TYPE_P (TREE_TYPE (TMR_BASE (exp))))
8749           {
8750             set_mem_expr (temp, build1 (INDIRECT_REF,
8751                                         TREE_TYPE (exp), TMR_BASE (exp)));
8752             set_mem_offset (temp, NULL_RTX);
8753           }
8754       }
8755       return temp;
8756
8757     case ARRAY_REF:
8758
8759       {
8760         tree array = treeop0;
8761         tree index = treeop1;
8762
8763         /* Fold an expression like: "foo"[2].
8764            This is not done in fold so it won't happen inside &.
8765            Don't fold if this is for wide characters since it's too
8766            difficult to do correctly and this is a very rare case.  */
8767
8768         if (modifier != EXPAND_CONST_ADDRESS
8769             && modifier != EXPAND_INITIALIZER
8770             && modifier != EXPAND_MEMORY)
8771           {
8772             tree t = fold_read_from_constant_string (exp);
8773
8774             if (t)
8775               return expand_expr (t, target, tmode, modifier);
8776           }
8777
8778         /* If this is a constant index into a constant array,
8779            just get the value from the array.  Handle both the cases when
8780            we have an explicit constructor and when our operand is a variable
8781            that was declared const.  */
8782
8783         if (modifier != EXPAND_CONST_ADDRESS
8784             && modifier != EXPAND_INITIALIZER
8785             && modifier != EXPAND_MEMORY
8786             && TREE_CODE (array) == CONSTRUCTOR
8787             && ! TREE_SIDE_EFFECTS (array)
8788             && TREE_CODE (index) == INTEGER_CST)
8789           {
8790             unsigned HOST_WIDE_INT ix;
8791             tree field, value;
8792
8793             FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (array), ix,
8794                                       field, value)
8795               if (tree_int_cst_equal (field, index))
8796                 {
8797                   if (!TREE_SIDE_EFFECTS (value))
8798                     return expand_expr (fold (value), target, tmode, modifier);
8799                   break;
8800                 }
8801           }
8802
8803         else if (optimize >= 1
8804                  && modifier != EXPAND_CONST_ADDRESS
8805                  && modifier != EXPAND_INITIALIZER
8806                  && modifier != EXPAND_MEMORY
8807                  && TREE_READONLY (array) && ! TREE_SIDE_EFFECTS (array)
8808                  && TREE_CODE (array) == VAR_DECL && DECL_INITIAL (array)
8809                  && TREE_CODE (DECL_INITIAL (array)) != ERROR_MARK
8810                  && targetm.binds_local_p (array))
8811           {
8812             if (TREE_CODE (index) == INTEGER_CST)
8813               {
8814                 tree init = DECL_INITIAL (array);
8815
8816                 if (TREE_CODE (init) == CONSTRUCTOR)
8817                   {
8818                     unsigned HOST_WIDE_INT ix;
8819                     tree field, value;
8820
8821                     FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (init), ix,
8822                                               field, value)
8823                       if (tree_int_cst_equal (field, index))
8824                         {
8825                           if (TREE_SIDE_EFFECTS (value))
8826                             break;
8827
8828                           if (TREE_CODE (value) == CONSTRUCTOR)
8829                             {
8830                               /* If VALUE is a CONSTRUCTOR, this
8831                                  optimization is only useful if
8832                                  this doesn't store the CONSTRUCTOR
8833                                  into memory.  If it does, it is more
8834                                  efficient to just load the data from
8835                                  the array directly.  */
8836                               rtx ret = expand_constructor (value, target,
8837                                                             modifier, true);
8838                               if (ret == NULL_RTX)
8839                                 break;
8840                             }
8841
8842                           return expand_expr (fold (value), target, tmode,
8843                                               modifier);
8844                         }
8845                   }
8846                 else if(TREE_CODE (init) == STRING_CST)
8847                   {
8848                     tree index1 = index;
8849                     tree low_bound = array_ref_low_bound (exp);
8850                     index1 = fold_convert_loc (loc, sizetype,
8851                                                treeop1);
8852
8853                     /* Optimize the special-case of a zero lower bound.
8854
8855                        We convert the low_bound to sizetype to avoid some problems
8856                        with constant folding.  (E.g. suppose the lower bound is 1,
8857                        and its mode is QI.  Without the conversion,l (ARRAY
8858                        +(INDEX-(unsigned char)1)) becomes ((ARRAY+(-(unsigned char)1))
8859                        +INDEX), which becomes (ARRAY+255+INDEX).  Opps!)  */
8860
8861                     if (! integer_zerop (low_bound))
8862                       index1 = size_diffop_loc (loc, index1,
8863                                             fold_convert_loc (loc, sizetype,
8864                                                               low_bound));
8865
8866                     if (0 > compare_tree_int (index1,
8867                                               TREE_STRING_LENGTH (init)))
8868                       {
8869                         tree type = TREE_TYPE (TREE_TYPE (init));
8870                         enum machine_mode mode = TYPE_MODE (type);
8871
8872                         if (GET_MODE_CLASS (mode) == MODE_INT
8873                             && GET_MODE_SIZE (mode) == 1)
8874                           return gen_int_mode (TREE_STRING_POINTER (init)
8875                                                [TREE_INT_CST_LOW (index1)],
8876                                                mode);
8877                       }
8878                   }
8879               }
8880           }
8881       }
8882       goto normal_inner_ref;
8883
8884     case COMPONENT_REF:
8885       /* If the operand is a CONSTRUCTOR, we can just extract the
8886          appropriate field if it is present.  */
8887       if (TREE_CODE (treeop0) == CONSTRUCTOR)
8888         {
8889           unsigned HOST_WIDE_INT idx;
8890           tree field, value;
8891
8892           FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (treeop0),
8893                                     idx, field, value)
8894             if (field == treeop1
8895                 /* We can normally use the value of the field in the
8896                    CONSTRUCTOR.  However, if this is a bitfield in
8897                    an integral mode that we can fit in a HOST_WIDE_INT,
8898                    we must mask only the number of bits in the bitfield,
8899                    since this is done implicitly by the constructor.  If
8900                    the bitfield does not meet either of those conditions,
8901                    we can't do this optimization.  */
8902                 && (! DECL_BIT_FIELD (field)
8903                     || ((GET_MODE_CLASS (DECL_MODE (field)) == MODE_INT)
8904                         && (GET_MODE_BITSIZE (DECL_MODE (field))
8905                             <= HOST_BITS_PER_WIDE_INT))))
8906               {
8907                 if (DECL_BIT_FIELD (field)
8908                     && modifier == EXPAND_STACK_PARM)
8909                   target = 0;
8910                 op0 = expand_expr (value, target, tmode, modifier);
8911                 if (DECL_BIT_FIELD (field))
8912                   {
8913                     HOST_WIDE_INT bitsize = TREE_INT_CST_LOW (DECL_SIZE (field));
8914                     enum machine_mode imode = TYPE_MODE (TREE_TYPE (field));
8915
8916                     if (TYPE_UNSIGNED (TREE_TYPE (field)))
8917                       {
8918                         op1 = GEN_INT (((HOST_WIDE_INT) 1 << bitsize) - 1);
8919                         op0 = expand_and (imode, op0, op1, target);
8920                       }
8921                     else
8922                       {
8923                         tree count
8924                           = build_int_cst (NULL_TREE,
8925                                            GET_MODE_BITSIZE (imode) - bitsize);
8926
8927                         op0 = expand_shift (LSHIFT_EXPR, imode, op0, count,
8928                                             target, 0);
8929                         op0 = expand_shift (RSHIFT_EXPR, imode, op0, count,
8930                                             target, 0);
8931                       }
8932                   }
8933
8934                 return op0;
8935               }
8936         }
8937       goto normal_inner_ref;
8938
8939     case BIT_FIELD_REF:
8940     case ARRAY_RANGE_REF:
8941     normal_inner_ref:
8942       {
8943         enum machine_mode mode1, mode2;
8944         HOST_WIDE_INT bitsize, bitpos;
8945         tree offset;
8946         int volatilep = 0, must_force_mem;
8947         tree tem = get_inner_reference (exp, &bitsize, &bitpos, &offset,
8948                                         &mode1, &unsignedp, &volatilep, true);
8949         rtx orig_op0, memloc;
8950
8951         /* If we got back the original object, something is wrong.  Perhaps
8952            we are evaluating an expression too early.  In any event, don't
8953            infinitely recurse.  */
8954         gcc_assert (tem != exp);
8955
8956         /* If TEM's type is a union of variable size, pass TARGET to the inner
8957            computation, since it will need a temporary and TARGET is known
8958            to have to do.  This occurs in unchecked conversion in Ada.  */
8959         orig_op0 = op0
8960           = expand_expr (tem,
8961                          (TREE_CODE (TREE_TYPE (tem)) == UNION_TYPE
8962                           && (TREE_CODE (TYPE_SIZE (TREE_TYPE (tem)))
8963                               != INTEGER_CST)
8964                           && modifier != EXPAND_STACK_PARM
8965                           ? target : NULL_RTX),
8966                          VOIDmode,
8967                          (modifier == EXPAND_INITIALIZER
8968                           || modifier == EXPAND_CONST_ADDRESS
8969                           || modifier == EXPAND_STACK_PARM)
8970                          ? modifier : EXPAND_NORMAL);
8971
8972         mode2
8973           = CONSTANT_P (op0) ? TYPE_MODE (TREE_TYPE (tem)) : GET_MODE (op0);
8974
8975         /* If we have either an offset, a BLKmode result, or a reference
8976            outside the underlying object, we must force it to memory.
8977            Such a case can occur in Ada if we have unchecked conversion
8978            of an expression from a scalar type to an aggregate type or
8979            for an ARRAY_RANGE_REF whose type is BLKmode, or if we were
8980            passed a partially uninitialized object or a view-conversion
8981            to a larger size.  */
8982         must_force_mem = (offset
8983                           || mode1 == BLKmode
8984                           || bitpos + bitsize > GET_MODE_BITSIZE (mode2));
8985
8986         /* Handle CONCAT first.  */
8987         if (GET_CODE (op0) == CONCAT && !must_force_mem)
8988           {
8989             if (bitpos == 0
8990                 && bitsize == GET_MODE_BITSIZE (GET_MODE (op0)))
8991               return op0;
8992             if (bitpos == 0
8993                 && bitsize == GET_MODE_BITSIZE (GET_MODE (XEXP (op0, 0)))
8994                 && bitsize)
8995               {
8996                 op0 = XEXP (op0, 0);
8997                 mode2 = GET_MODE (op0);
8998               }
8999             else if (bitpos == GET_MODE_BITSIZE (GET_MODE (XEXP (op0, 0)))
9000                      && bitsize == GET_MODE_BITSIZE (GET_MODE (XEXP (op0, 1)))
9001                      && bitpos
9002                      && bitsize)
9003               {
9004                 op0 = XEXP (op0, 1);
9005                 bitpos = 0;
9006                 mode2 = GET_MODE (op0);
9007               }
9008             else
9009               /* Otherwise force into memory.  */
9010               must_force_mem = 1;
9011           }
9012
9013         /* If this is a constant, put it in a register if it is a legitimate
9014            constant and we don't need a memory reference.  */
9015         if (CONSTANT_P (op0)
9016             && mode2 != BLKmode
9017             && LEGITIMATE_CONSTANT_P (op0)
9018             && !must_force_mem)
9019           op0 = force_reg (mode2, op0);
9020
9021         /* Otherwise, if this is a constant, try to force it to the constant
9022            pool.  Note that back-ends, e.g. MIPS, may refuse to do so if it
9023            is a legitimate constant.  */
9024         else if (CONSTANT_P (op0) && (memloc = force_const_mem (mode2, op0)))
9025           op0 = validize_mem (memloc);
9026
9027         /* Otherwise, if this is a constant or the object is not in memory
9028            and need be, put it there.  */
9029         else if (CONSTANT_P (op0) || (!MEM_P (op0) && must_force_mem))
9030           {
9031             tree nt = build_qualified_type (TREE_TYPE (tem),
9032                                             (TYPE_QUALS (TREE_TYPE (tem))
9033                                              | TYPE_QUAL_CONST));
9034             memloc = assign_temp (nt, 1, 1, 1);
9035             emit_move_insn (memloc, op0);
9036             op0 = memloc;
9037           }
9038
9039         if (offset)
9040           {
9041             enum machine_mode address_mode;
9042             rtx offset_rtx = expand_expr (offset, NULL_RTX, VOIDmode,
9043                                           EXPAND_SUM);
9044
9045             gcc_assert (MEM_P (op0));
9046
9047             address_mode
9048               = targetm.addr_space.address_mode (MEM_ADDR_SPACE (op0));
9049             if (GET_MODE (offset_rtx) != address_mode)
9050               offset_rtx = convert_to_mode (address_mode, offset_rtx, 0);
9051
9052             if (GET_MODE (op0) == BLKmode
9053                 /* A constant address in OP0 can have VOIDmode, we must
9054                    not try to call force_reg in that case.  */
9055                 && GET_MODE (XEXP (op0, 0)) != VOIDmode
9056                 && bitsize != 0
9057                 && (bitpos % bitsize) == 0
9058                 && (bitsize % GET_MODE_ALIGNMENT (mode1)) == 0
9059                 && MEM_ALIGN (op0) == GET_MODE_ALIGNMENT (mode1))
9060               {
9061                 op0 = adjust_address (op0, mode1, bitpos / BITS_PER_UNIT);
9062                 bitpos = 0;
9063               }
9064
9065             op0 = offset_address (op0, offset_rtx,
9066                                   highest_pow2_factor (offset));
9067           }
9068
9069         /* If OFFSET is making OP0 more aligned than BIGGEST_ALIGNMENT,
9070            record its alignment as BIGGEST_ALIGNMENT.  */
9071         if (MEM_P (op0) && bitpos == 0 && offset != 0
9072             && is_aligning_offset (offset, tem))
9073           set_mem_align (op0, BIGGEST_ALIGNMENT);
9074
9075         /* Don't forget about volatility even if this is a bitfield.  */
9076         if (MEM_P (op0) && volatilep && ! MEM_VOLATILE_P (op0))
9077           {
9078             if (op0 == orig_op0)
9079               op0 = copy_rtx (op0);
9080
9081             MEM_VOLATILE_P (op0) = 1;
9082           }
9083
9084         /* In cases where an aligned union has an unaligned object
9085            as a field, we might be extracting a BLKmode value from
9086            an integer-mode (e.g., SImode) object.  Handle this case
9087            by doing the extract into an object as wide as the field
9088            (which we know to be the width of a basic mode), then
9089            storing into memory, and changing the mode to BLKmode.  */
9090         if (mode1 == VOIDmode
9091             || REG_P (op0) || GET_CODE (op0) == SUBREG
9092             || (mode1 != BLKmode && ! direct_load[(int) mode1]
9093                 && GET_MODE_CLASS (mode) != MODE_COMPLEX_INT
9094                 && GET_MODE_CLASS (mode) != MODE_COMPLEX_FLOAT
9095                 && modifier != EXPAND_CONST_ADDRESS
9096                 && modifier != EXPAND_INITIALIZER)
9097             /* If the field isn't aligned enough to fetch as a memref,
9098                fetch it as a bit field.  */
9099             || (mode1 != BLKmode
9100                 && (((TYPE_ALIGN (TREE_TYPE (tem)) < GET_MODE_ALIGNMENT (mode)
9101                       || (bitpos % GET_MODE_ALIGNMENT (mode) != 0)
9102                       || (MEM_P (op0)
9103                           && (MEM_ALIGN (op0) < GET_MODE_ALIGNMENT (mode1)
9104                               || (bitpos % GET_MODE_ALIGNMENT (mode1) != 0))))
9105                      && ((modifier == EXPAND_CONST_ADDRESS
9106                           || modifier == EXPAND_INITIALIZER)
9107                          ? STRICT_ALIGNMENT
9108                          : SLOW_UNALIGNED_ACCESS (mode1, MEM_ALIGN (op0))))
9109                     || (bitpos % BITS_PER_UNIT != 0)))
9110             /* If the type and the field are a constant size and the
9111                size of the type isn't the same size as the bitfield,
9112                we must use bitfield operations.  */
9113             || (bitsize >= 0
9114                 && TYPE_SIZE (TREE_TYPE (exp))
9115                 && TREE_CODE (TYPE_SIZE (TREE_TYPE (exp))) == INTEGER_CST
9116                 && 0 != compare_tree_int (TYPE_SIZE (TREE_TYPE (exp)),
9117                                           bitsize)))
9118           {
9119             enum machine_mode ext_mode = mode;
9120
9121             if (ext_mode == BLKmode
9122                 && ! (target != 0 && MEM_P (op0)
9123                       && MEM_P (target)
9124                       && bitpos % BITS_PER_UNIT == 0))
9125               ext_mode = mode_for_size (bitsize, MODE_INT, 1);
9126
9127             if (ext_mode == BLKmode)
9128               {
9129                 if (target == 0)
9130                   target = assign_temp (type, 0, 1, 1);
9131
9132                 if (bitsize == 0)
9133                   return target;
9134
9135                 /* In this case, BITPOS must start at a byte boundary and
9136                    TARGET, if specified, must be a MEM.  */
9137                 gcc_assert (MEM_P (op0)
9138                             && (!target || MEM_P (target))
9139                             && !(bitpos % BITS_PER_UNIT));
9140
9141                 emit_block_move (target,
9142                                  adjust_address (op0, VOIDmode,
9143                                                  bitpos / BITS_PER_UNIT),
9144                                  GEN_INT ((bitsize + BITS_PER_UNIT - 1)
9145                                           / BITS_PER_UNIT),
9146                                  (modifier == EXPAND_STACK_PARM
9147                                   ? BLOCK_OP_CALL_PARM : BLOCK_OP_NORMAL));
9148
9149                 return target;
9150               }
9151
9152             op0 = validize_mem (op0);
9153
9154             if (MEM_P (op0) && REG_P (XEXP (op0, 0)))
9155               mark_reg_pointer (XEXP (op0, 0), MEM_ALIGN (op0));
9156
9157             op0 = extract_bit_field (op0, bitsize, bitpos, unsignedp,
9158                                      (modifier == EXPAND_STACK_PARM
9159                                       ? NULL_RTX : target),
9160                                      ext_mode, ext_mode);
9161
9162             /* If the result is a record type and BITSIZE is narrower than
9163                the mode of OP0, an integral mode, and this is a big endian
9164                machine, we must put the field into the high-order bits.  */
9165             if (TREE_CODE (type) == RECORD_TYPE && BYTES_BIG_ENDIAN
9166                 && GET_MODE_CLASS (GET_MODE (op0)) == MODE_INT
9167                 && bitsize < (HOST_WIDE_INT) GET_MODE_BITSIZE (GET_MODE (op0)))
9168               op0 = expand_shift (LSHIFT_EXPR, GET_MODE (op0), op0,
9169                                   size_int (GET_MODE_BITSIZE (GET_MODE (op0))
9170                                             - bitsize),
9171                                   op0, 1);
9172
9173             /* If the result type is BLKmode, store the data into a temporary
9174                of the appropriate type, but with the mode corresponding to the
9175                mode for the data we have (op0's mode).  It's tempting to make
9176                this a constant type, since we know it's only being stored once,
9177                but that can cause problems if we are taking the address of this
9178                COMPONENT_REF because the MEM of any reference via that address
9179                will have flags corresponding to the type, which will not
9180                necessarily be constant.  */
9181             if (mode == BLKmode)
9182               {
9183                 HOST_WIDE_INT size = GET_MODE_BITSIZE (ext_mode);
9184                 rtx new_rtx;
9185
9186                 /* If the reference doesn't use the alias set of its type,
9187                    we cannot create the temporary using that type.  */
9188                 if (component_uses_parent_alias_set (exp))
9189                   {
9190                     new_rtx = assign_stack_local (ext_mode, size, 0);
9191                     set_mem_alias_set (new_rtx, get_alias_set (exp));
9192                   }
9193                 else
9194                   new_rtx = assign_stack_temp_for_type (ext_mode, size, 0, type);
9195
9196                 emit_move_insn (new_rtx, op0);
9197                 op0 = copy_rtx (new_rtx);
9198                 PUT_MODE (op0, BLKmode);
9199                 set_mem_attributes (op0, exp, 1);
9200               }
9201
9202             return op0;
9203           }
9204
9205         /* If the result is BLKmode, use that to access the object
9206            now as well.  */
9207         if (mode == BLKmode)
9208           mode1 = BLKmode;
9209
9210         /* Get a reference to just this component.  */
9211         if (modifier == EXPAND_CONST_ADDRESS
9212             || modifier == EXPAND_SUM || modifier == EXPAND_INITIALIZER)
9213           op0 = adjust_address_nv (op0, mode1, bitpos / BITS_PER_UNIT);
9214         else
9215           op0 = adjust_address (op0, mode1, bitpos / BITS_PER_UNIT);
9216
9217         if (op0 == orig_op0)
9218           op0 = copy_rtx (op0);
9219
9220         set_mem_attributes (op0, exp, 0);
9221         if (REG_P (XEXP (op0, 0)))
9222           mark_reg_pointer (XEXP (op0, 0), MEM_ALIGN (op0));
9223
9224         MEM_VOLATILE_P (op0) |= volatilep;
9225         if (mode == mode1 || mode1 == BLKmode || mode1 == tmode
9226             || modifier == EXPAND_CONST_ADDRESS
9227             || modifier == EXPAND_INITIALIZER)
9228           return op0;
9229         else if (target == 0)
9230           target = gen_reg_rtx (tmode != VOIDmode ? tmode : mode);
9231
9232         convert_move (target, op0, unsignedp);
9233         return target;
9234       }
9235
9236     case OBJ_TYPE_REF:
9237       return expand_expr (OBJ_TYPE_REF_EXPR (exp), target, tmode, modifier);
9238
9239     case CALL_EXPR:
9240       /* All valid uses of __builtin_va_arg_pack () are removed during
9241          inlining.  */
9242       if (CALL_EXPR_VA_ARG_PACK (exp))
9243         error ("%Kinvalid use of %<__builtin_va_arg_pack ()%>", exp);
9244       {
9245         tree fndecl = get_callee_fndecl (exp), attr;
9246
9247         if (fndecl
9248             && (attr = lookup_attribute ("error",
9249                                          DECL_ATTRIBUTES (fndecl))) != NULL)
9250           error ("%Kcall to %qs declared with attribute error: %s",
9251                  exp, identifier_to_locale (lang_hooks.decl_printable_name (fndecl, 1)),
9252                  TREE_STRING_POINTER (TREE_VALUE (TREE_VALUE (attr))));
9253         if (fndecl
9254             && (attr = lookup_attribute ("warning",
9255                                          DECL_ATTRIBUTES (fndecl))) != NULL)
9256           warning_at (tree_nonartificial_location (exp),
9257                       0, "%Kcall to %qs declared with attribute warning: %s",
9258                       exp, identifier_to_locale (lang_hooks.decl_printable_name (fndecl, 1)),
9259                       TREE_STRING_POINTER (TREE_VALUE (TREE_VALUE (attr))));
9260
9261         /* Check for a built-in function.  */
9262         if (fndecl && DECL_BUILT_IN (fndecl))
9263           {
9264             gcc_assert (DECL_BUILT_IN_CLASS (fndecl) != BUILT_IN_FRONTEND);
9265             return expand_builtin (exp, target, subtarget, tmode, ignore);
9266           }
9267       }
9268       return expand_call (exp, target, ignore);
9269
9270     case VIEW_CONVERT_EXPR:
9271       op0 = NULL_RTX;
9272
9273       /* If we are converting to BLKmode, try to avoid an intermediate
9274          temporary by fetching an inner memory reference.  */
9275       if (mode == BLKmode
9276           && TREE_CODE (TYPE_SIZE (TREE_TYPE (exp))) == INTEGER_CST
9277           && TYPE_MODE (TREE_TYPE (treeop0)) != BLKmode
9278           && handled_component_p (treeop0))
9279       {
9280         enum machine_mode mode1;
9281         HOST_WIDE_INT bitsize, bitpos;
9282         tree offset;
9283         int unsignedp;
9284         int volatilep = 0;
9285         tree tem
9286           = get_inner_reference (treeop0, &bitsize, &bitpos,
9287                                  &offset, &mode1, &unsignedp, &volatilep,
9288                                  true);
9289         rtx orig_op0;
9290
9291         /* ??? We should work harder and deal with non-zero offsets.  */
9292         if (!offset
9293             && (bitpos % BITS_PER_UNIT) == 0
9294             && bitsize >= 0
9295             && compare_tree_int (TYPE_SIZE (TREE_TYPE (exp)), bitsize) == 0)
9296           {
9297             /* See the normal_inner_ref case for the rationale.  */
9298             orig_op0
9299               = expand_expr (tem,
9300                              (TREE_CODE (TREE_TYPE (tem)) == UNION_TYPE
9301                               && (TREE_CODE (TYPE_SIZE (TREE_TYPE (tem)))
9302                                   != INTEGER_CST)
9303                               && modifier != EXPAND_STACK_PARM
9304                               ? target : NULL_RTX),
9305                              VOIDmode,
9306                              (modifier == EXPAND_INITIALIZER
9307                               || modifier == EXPAND_CONST_ADDRESS
9308                               || modifier == EXPAND_STACK_PARM)
9309                              ? modifier : EXPAND_NORMAL);
9310
9311             if (MEM_P (orig_op0))
9312               {
9313                 op0 = orig_op0;
9314
9315                 /* Get a reference to just this component.  */
9316                 if (modifier == EXPAND_CONST_ADDRESS
9317                     || modifier == EXPAND_SUM
9318                     || modifier == EXPAND_INITIALIZER)
9319                   op0 = adjust_address_nv (op0, mode, bitpos / BITS_PER_UNIT);
9320                 else
9321                   op0 = adjust_address (op0, mode, bitpos / BITS_PER_UNIT);
9322
9323                 if (op0 == orig_op0)
9324                   op0 = copy_rtx (op0);
9325
9326                 set_mem_attributes (op0, treeop0, 0);
9327                 if (REG_P (XEXP (op0, 0)))
9328                   mark_reg_pointer (XEXP (op0, 0), MEM_ALIGN (op0));
9329
9330                 MEM_VOLATILE_P (op0) |= volatilep;
9331               }
9332           }
9333       }
9334
9335       if (!op0)
9336         op0 = expand_expr (treeop0,
9337                            NULL_RTX, VOIDmode, modifier);
9338
9339       /* If the input and output modes are both the same, we are done.  */
9340       if (mode == GET_MODE (op0))
9341         ;
9342       /* If neither mode is BLKmode, and both modes are the same size
9343          then we can use gen_lowpart.  */
9344       else if (mode != BLKmode && GET_MODE (op0) != BLKmode
9345                && GET_MODE_SIZE (mode) == GET_MODE_SIZE (GET_MODE (op0))
9346                && !COMPLEX_MODE_P (GET_MODE (op0)))
9347         {
9348           if (GET_CODE (op0) == SUBREG)
9349             op0 = force_reg (GET_MODE (op0), op0);
9350           op0 = gen_lowpart (mode, op0);
9351         }
9352       /* If both modes are integral, then we can convert from one to the
9353          other.  */
9354       else if (SCALAR_INT_MODE_P (GET_MODE (op0)) && SCALAR_INT_MODE_P (mode))
9355         op0 = convert_modes (mode, GET_MODE (op0), op0,
9356                              TYPE_UNSIGNED (TREE_TYPE (treeop0)));
9357       /* As a last resort, spill op0 to memory, and reload it in a
9358          different mode.  */
9359       else if (!MEM_P (op0))
9360         {
9361           /* If the operand is not a MEM, force it into memory.  Since we
9362              are going to be changing the mode of the MEM, don't call
9363              force_const_mem for constants because we don't allow pool
9364              constants to change mode.  */
9365           tree inner_type = TREE_TYPE (treeop0);
9366
9367           gcc_assert (!TREE_ADDRESSABLE (exp));
9368
9369           if (target == 0 || GET_MODE (target) != TYPE_MODE (inner_type))
9370             target
9371               = assign_stack_temp_for_type
9372                 (TYPE_MODE (inner_type),
9373                  GET_MODE_SIZE (TYPE_MODE (inner_type)), 0, inner_type);
9374
9375           emit_move_insn (target, op0);
9376           op0 = target;
9377         }
9378
9379       /* At this point, OP0 is in the correct mode.  If the output type is
9380          such that the operand is known to be aligned, indicate that it is.
9381          Otherwise, we need only be concerned about alignment for non-BLKmode
9382          results.  */
9383       if (MEM_P (op0))
9384         {
9385           op0 = copy_rtx (op0);
9386
9387           if (TYPE_ALIGN_OK (type))
9388             set_mem_align (op0, MAX (MEM_ALIGN (op0), TYPE_ALIGN (type)));
9389           else if (STRICT_ALIGNMENT
9390                    && mode != BLKmode
9391                    && MEM_ALIGN (op0) < GET_MODE_ALIGNMENT (mode))
9392             {
9393               tree inner_type = TREE_TYPE (treeop0);
9394               HOST_WIDE_INT temp_size
9395                 = MAX (int_size_in_bytes (inner_type),
9396                        (HOST_WIDE_INT) GET_MODE_SIZE (mode));
9397               rtx new_rtx
9398                 = assign_stack_temp_for_type (mode, temp_size, 0, type);
9399               rtx new_with_op0_mode
9400                 = adjust_address (new_rtx, GET_MODE (op0), 0);
9401
9402               gcc_assert (!TREE_ADDRESSABLE (exp));
9403
9404               if (GET_MODE (op0) == BLKmode)
9405                 emit_block_move (new_with_op0_mode, op0,
9406                                  GEN_INT (GET_MODE_SIZE (mode)),
9407                                  (modifier == EXPAND_STACK_PARM
9408                                   ? BLOCK_OP_CALL_PARM : BLOCK_OP_NORMAL));
9409               else
9410                 emit_move_insn (new_with_op0_mode, op0);
9411
9412               op0 = new_rtx;
9413             }
9414
9415           op0 = adjust_address (op0, mode, 0);
9416         }
9417
9418       return op0;
9419
9420       /* Use a compare and a jump for BLKmode comparisons, or for function
9421          type comparisons is HAVE_canonicalize_funcptr_for_compare.  */
9422
9423       /* Although TRUTH_{AND,OR}IF_EXPR aren't present in GIMPLE, they
9424          are occassionally created by folding during expansion.  */
9425     case TRUTH_ANDIF_EXPR:
9426     case TRUTH_ORIF_EXPR:
9427       if (! ignore
9428           && (target == 0
9429               || modifier == EXPAND_STACK_PARM
9430               || ! safe_from_p (target, treeop0, 1)
9431               || ! safe_from_p (target, treeop1, 1)
9432               /* Make sure we don't have a hard reg (such as function's return
9433                  value) live across basic blocks, if not optimizing.  */
9434               || (!optimize && REG_P (target)
9435                   && REGNO (target) < FIRST_PSEUDO_REGISTER)))
9436         target = gen_reg_rtx (tmode != VOIDmode ? tmode : mode);
9437
9438       if (target)
9439         emit_move_insn (target, const0_rtx);
9440
9441       op1 = gen_label_rtx ();
9442       jumpifnot_1 (code, treeop0, treeop1, op1, -1);
9443
9444       if (target)
9445         emit_move_insn (target, const1_rtx);
9446
9447       emit_label (op1);
9448       return ignore ? const0_rtx : target;
9449
9450     case STATEMENT_LIST:
9451       {
9452         tree_stmt_iterator iter;
9453
9454         gcc_assert (ignore);
9455
9456         for (iter = tsi_start (exp); !tsi_end_p (iter); tsi_next (&iter))
9457           expand_expr (tsi_stmt (iter), const0_rtx, VOIDmode, modifier);
9458       }
9459       return const0_rtx;
9460
9461     case COND_EXPR:
9462       /* A COND_EXPR with its type being VOID_TYPE represents a
9463          conditional jump and is handled in
9464          expand_gimple_cond_expr.  */
9465       gcc_assert (!VOID_TYPE_P (type));
9466
9467         /* Note that COND_EXPRs whose type is a structure or union
9468          are required to be constructed to contain assignments of
9469          a temporary variable, so that we can evaluate them here
9470          for side effect only.  If type is void, we must do likewise.  */
9471
9472         gcc_assert (!TREE_ADDRESSABLE (type)
9473                     && !ignore
9474                     && TREE_TYPE (treeop1) != void_type_node
9475                     && TREE_TYPE (treeop2) != void_type_node);
9476
9477        /* If we are not to produce a result, we have no target.  Otherwise,
9478          if a target was specified use it; it will not be used as an
9479          intermediate target unless it is safe.  If no target, use a
9480          temporary.  */
9481
9482        if (modifier != EXPAND_STACK_PARM
9483           && original_target
9484           && safe_from_p (original_target, treeop0, 1)
9485           && GET_MODE (original_target) == mode
9486 #ifdef HAVE_conditional_move
9487           && (! can_conditionally_move_p (mode)
9488               || REG_P (original_target))
9489 #endif
9490           && !MEM_P (original_target))
9491         temp = original_target;
9492        else
9493         temp = assign_temp (type, 0, 0, 1);
9494
9495        do_pending_stack_adjust ();
9496        NO_DEFER_POP;
9497        op0 = gen_label_rtx ();
9498        op1 = gen_label_rtx ();
9499        jumpifnot (treeop0, op0, -1);
9500        store_expr (treeop1, temp,
9501                   modifier == EXPAND_STACK_PARM,
9502                   false);
9503
9504        emit_jump_insn (gen_jump (op1));
9505        emit_barrier ();
9506        emit_label (op0);
9507        store_expr (treeop2, temp,
9508                   modifier == EXPAND_STACK_PARM,
9509                   false);
9510
9511        emit_label (op1);
9512        OK_DEFER_POP;
9513        return temp;
9514
9515     case VEC_COND_EXPR:
9516       target = expand_vec_cond_expr (type, treeop0, treeop1, treeop2, target);
9517       return target;
9518
9519     case MODIFY_EXPR:
9520       {
9521         tree lhs = treeop0;
9522         tree rhs = treeop1;
9523         gcc_assert (ignore);
9524
9525         /* Check for |= or &= of a bitfield of size one into another bitfield
9526            of size 1.  In this case, (unless we need the result of the
9527            assignment) we can do this more efficiently with a
9528            test followed by an assignment, if necessary.
9529
9530            ??? At this point, we can't get a BIT_FIELD_REF here.  But if
9531            things change so we do, this code should be enhanced to
9532            support it.  */
9533         if (TREE_CODE (lhs) == COMPONENT_REF
9534             && (TREE_CODE (rhs) == BIT_IOR_EXPR
9535                 || TREE_CODE (rhs) == BIT_AND_EXPR)
9536             && TREE_OPERAND (rhs, 0) == lhs
9537             && TREE_CODE (TREE_OPERAND (rhs, 1)) == COMPONENT_REF
9538             && integer_onep (DECL_SIZE (TREE_OPERAND (lhs, 1)))
9539             && integer_onep (DECL_SIZE (TREE_OPERAND (TREE_OPERAND (rhs, 1), 1))))
9540           {
9541             rtx label = gen_label_rtx ();
9542             int value = TREE_CODE (rhs) == BIT_IOR_EXPR;
9543             do_jump (TREE_OPERAND (rhs, 1),
9544                      value ? label : 0,
9545                      value ? 0 : label, -1);
9546             expand_assignment (lhs, build_int_cst (TREE_TYPE (rhs), value),
9547                                MOVE_NONTEMPORAL (exp));
9548             do_pending_stack_adjust ();
9549             emit_label (label);
9550             return const0_rtx;
9551           }
9552
9553         expand_assignment (lhs, rhs, MOVE_NONTEMPORAL (exp));
9554         return const0_rtx;
9555       }
9556
9557     case ADDR_EXPR:
9558       return expand_expr_addr_expr (exp, target, tmode, modifier);
9559
9560     case REALPART_EXPR:
9561       op0 = expand_normal (treeop0);
9562       return read_complex_part (op0, false);
9563
9564     case IMAGPART_EXPR:
9565       op0 = expand_normal (treeop0);
9566       return read_complex_part (op0, true);
9567
9568     case RETURN_EXPR:
9569     case LABEL_EXPR:
9570     case GOTO_EXPR:
9571     case SWITCH_EXPR:
9572     case ASM_EXPR:
9573       /* Expanded in cfgexpand.c.  */
9574       gcc_unreachable ();
9575
9576     case TRY_CATCH_EXPR:
9577     case CATCH_EXPR:
9578     case EH_FILTER_EXPR:
9579     case TRY_FINALLY_EXPR:
9580       /* Lowered by tree-eh.c.  */
9581       gcc_unreachable ();
9582
9583     case WITH_CLEANUP_EXPR:
9584     case CLEANUP_POINT_EXPR:
9585     case TARGET_EXPR:
9586     case CASE_LABEL_EXPR:
9587     case VA_ARG_EXPR:
9588     case BIND_EXPR:
9589     case INIT_EXPR:
9590     case CONJ_EXPR:
9591     case COMPOUND_EXPR:
9592     case PREINCREMENT_EXPR:
9593     case PREDECREMENT_EXPR:
9594     case POSTINCREMENT_EXPR:
9595     case POSTDECREMENT_EXPR:
9596     case LOOP_EXPR:
9597     case EXIT_EXPR:
9598       /* Lowered by gimplify.c.  */
9599       gcc_unreachable ();
9600
9601     case FDESC_EXPR:
9602       /* Function descriptors are not valid except for as
9603          initialization constants, and should not be expanded.  */
9604       gcc_unreachable ();
9605
9606     case WITH_SIZE_EXPR:
9607       /* WITH_SIZE_EXPR expands to its first argument.  The caller should
9608          have pulled out the size to use in whatever context it needed.  */
9609       return expand_expr_real (treeop0, original_target, tmode,
9610                                modifier, alt_rtl);
9611
9612     case REALIGN_LOAD_EXPR:
9613       {
9614         tree oprnd0 = treeop0;
9615         tree oprnd1 = treeop1;
9616         tree oprnd2 = treeop2;
9617         rtx op2;
9618
9619         this_optab = optab_for_tree_code (code, type, optab_default);
9620         expand_operands (oprnd0, oprnd1, NULL_RTX, &op0, &op1, EXPAND_NORMAL);
9621         op2 = expand_normal (oprnd2);
9622         temp = expand_ternary_op (mode, this_optab, op0, op1, op2,
9623                                   target, unsignedp);
9624         gcc_assert (temp);
9625         return temp;
9626       }
9627
9628     case DOT_PROD_EXPR:
9629       {
9630         tree oprnd0 = treeop0;
9631         tree oprnd1 = treeop1;
9632         tree oprnd2 = treeop2;
9633         rtx op2;
9634
9635         expand_operands (oprnd0, oprnd1, NULL_RTX, &op0, &op1, EXPAND_NORMAL);
9636         op2 = expand_normal (oprnd2);
9637         target = expand_widen_pattern_expr (&ops, op0, op1, op2,
9638                                             target, unsignedp);
9639         return target;
9640       }
9641
9642     case COMPOUND_LITERAL_EXPR:
9643       {
9644         /* Initialize the anonymous variable declared in the compound
9645            literal, then return the variable.  */
9646         tree decl = COMPOUND_LITERAL_EXPR_DECL (exp);
9647
9648         /* Create RTL for this variable.  */
9649         if (!DECL_RTL_SET_P (decl))
9650           {
9651             if (DECL_HARD_REGISTER (decl))
9652               /* The user specified an assembler name for this variable.
9653                  Set that up now.  */
9654               rest_of_decl_compilation (decl, 0, 0);
9655             else
9656               expand_decl (decl);
9657           }
9658
9659         return expand_expr_real (decl, original_target, tmode,
9660                                  modifier, alt_rtl);
9661       }
9662
9663     default:
9664       return expand_expr_real_2 (&ops, target, tmode, modifier);
9665     }
9666 }
9667 \f
9668 /* Subroutine of above: reduce EXP to the precision of TYPE (in the
9669    signedness of TYPE), possibly returning the result in TARGET.  */
9670 static rtx
9671 reduce_to_bit_field_precision (rtx exp, rtx target, tree type)
9672 {
9673   HOST_WIDE_INT prec = TYPE_PRECISION (type);
9674   if (target && GET_MODE (target) != GET_MODE (exp))
9675     target = 0;
9676   /* For constant values, reduce using build_int_cst_type. */
9677   if (CONST_INT_P (exp))
9678     {
9679       HOST_WIDE_INT value = INTVAL (exp);
9680       tree t = build_int_cst_type (type, value);
9681       return expand_expr (t, target, VOIDmode, EXPAND_NORMAL);
9682     }
9683   else if (TYPE_UNSIGNED (type))
9684     {
9685       rtx mask;
9686       if (prec < HOST_BITS_PER_WIDE_INT)
9687         mask = immed_double_const (((unsigned HOST_WIDE_INT) 1 << prec) - 1, 0,
9688                                    GET_MODE (exp));
9689       else
9690         mask = immed_double_const ((unsigned HOST_WIDE_INT) -1,
9691                                    ((unsigned HOST_WIDE_INT) 1
9692                                     << (prec - HOST_BITS_PER_WIDE_INT)) - 1,
9693                                    GET_MODE (exp));
9694       return expand_and (GET_MODE (exp), exp, mask, target);
9695     }
9696   else
9697     {
9698       tree count = build_int_cst (NULL_TREE,
9699                                   GET_MODE_BITSIZE (GET_MODE (exp)) - prec);
9700       exp = expand_shift (LSHIFT_EXPR, GET_MODE (exp), exp, count, target, 0);
9701       return expand_shift (RSHIFT_EXPR, GET_MODE (exp), exp, count, target, 0);
9702     }
9703 }
9704 \f
9705 /* Subroutine of above: returns 1 if OFFSET corresponds to an offset that
9706    when applied to the address of EXP produces an address known to be
9707    aligned more than BIGGEST_ALIGNMENT.  */
9708
9709 static int
9710 is_aligning_offset (const_tree offset, const_tree exp)
9711 {
9712   /* Strip off any conversions.  */
9713   while (CONVERT_EXPR_P (offset))
9714     offset = TREE_OPERAND (offset, 0);
9715
9716   /* We must now have a BIT_AND_EXPR with a constant that is one less than
9717      power of 2 and which is larger than BIGGEST_ALIGNMENT.  */
9718   if (TREE_CODE (offset) != BIT_AND_EXPR
9719       || !host_integerp (TREE_OPERAND (offset, 1), 1)
9720       || compare_tree_int (TREE_OPERAND (offset, 1),
9721                            BIGGEST_ALIGNMENT / BITS_PER_UNIT) <= 0
9722       || !exact_log2 (tree_low_cst (TREE_OPERAND (offset, 1), 1) + 1) < 0)
9723     return 0;
9724
9725   /* Look at the first operand of BIT_AND_EXPR and strip any conversion.
9726      It must be NEGATE_EXPR.  Then strip any more conversions.  */
9727   offset = TREE_OPERAND (offset, 0);
9728   while (CONVERT_EXPR_P (offset))
9729     offset = TREE_OPERAND (offset, 0);
9730
9731   if (TREE_CODE (offset) != NEGATE_EXPR)
9732     return 0;
9733
9734   offset = TREE_OPERAND (offset, 0);
9735   while (CONVERT_EXPR_P (offset))
9736     offset = TREE_OPERAND (offset, 0);
9737
9738   /* This must now be the address of EXP.  */
9739   return TREE_CODE (offset) == ADDR_EXPR && TREE_OPERAND (offset, 0) == exp;
9740 }
9741 \f
9742 /* Return the tree node if an ARG corresponds to a string constant or zero
9743    if it doesn't.  If we return nonzero, set *PTR_OFFSET to the offset
9744    in bytes within the string that ARG is accessing.  The type of the
9745    offset will be `sizetype'.  */
9746
9747 tree
9748 string_constant (tree arg, tree *ptr_offset)
9749 {
9750   tree array, offset, lower_bound;
9751   STRIP_NOPS (arg);
9752
9753   if (TREE_CODE (arg) == ADDR_EXPR)
9754     {
9755       if (TREE_CODE (TREE_OPERAND (arg, 0)) == STRING_CST)
9756         {
9757           *ptr_offset = size_zero_node;
9758           return TREE_OPERAND (arg, 0);
9759         }
9760       else if (TREE_CODE (TREE_OPERAND (arg, 0)) == VAR_DECL)
9761         {
9762           array = TREE_OPERAND (arg, 0);
9763           offset = size_zero_node;
9764         }
9765       else if (TREE_CODE (TREE_OPERAND (arg, 0)) == ARRAY_REF)
9766         {
9767           array = TREE_OPERAND (TREE_OPERAND (arg, 0), 0);
9768           offset = TREE_OPERAND (TREE_OPERAND (arg, 0), 1);
9769           if (TREE_CODE (array) != STRING_CST
9770               && TREE_CODE (array) != VAR_DECL)
9771             return 0;
9772
9773           /* Check if the array has a nonzero lower bound.  */
9774           lower_bound = array_ref_low_bound (TREE_OPERAND (arg, 0));
9775           if (!integer_zerop (lower_bound))
9776             {
9777               /* If the offset and base aren't both constants, return 0.  */
9778               if (TREE_CODE (lower_bound) != INTEGER_CST)
9779                 return 0;
9780               if (TREE_CODE (offset) != INTEGER_CST)
9781                 return 0;
9782               /* Adjust offset by the lower bound.  */
9783               offset = size_diffop (fold_convert (sizetype, offset),
9784                                     fold_convert (sizetype, lower_bound));
9785             }
9786         }
9787       else
9788         return 0;
9789     }
9790   else if (TREE_CODE (arg) == PLUS_EXPR || TREE_CODE (arg) == POINTER_PLUS_EXPR)
9791     {
9792       tree arg0 = TREE_OPERAND (arg, 0);
9793       tree arg1 = TREE_OPERAND (arg, 1);
9794
9795       STRIP_NOPS (arg0);
9796       STRIP_NOPS (arg1);
9797
9798       if (TREE_CODE (arg0) == ADDR_EXPR
9799           && (TREE_CODE (TREE_OPERAND (arg0, 0)) == STRING_CST
9800               || TREE_CODE (TREE_OPERAND (arg0, 0)) == VAR_DECL))
9801         {
9802           array = TREE_OPERAND (arg0, 0);
9803           offset = arg1;
9804         }
9805       else if (TREE_CODE (arg1) == ADDR_EXPR
9806                && (TREE_CODE (TREE_OPERAND (arg1, 0)) == STRING_CST
9807                    || TREE_CODE (TREE_OPERAND (arg1, 0)) == VAR_DECL))
9808         {
9809           array = TREE_OPERAND (arg1, 0);
9810           offset = arg0;
9811         }
9812       else
9813         return 0;
9814     }
9815   else
9816     return 0;
9817
9818   if (TREE_CODE (array) == STRING_CST)
9819     {
9820       *ptr_offset = fold_convert (sizetype, offset);
9821       return array;
9822     }
9823   else if (TREE_CODE (array) == VAR_DECL)
9824     {
9825       int length;
9826
9827       /* Variables initialized to string literals can be handled too.  */
9828       if (DECL_INITIAL (array) == NULL_TREE
9829           || TREE_CODE (DECL_INITIAL (array)) != STRING_CST)
9830         return 0;
9831
9832       /* If they are read-only, non-volatile and bind locally.  */
9833       if (! TREE_READONLY (array)
9834           || TREE_SIDE_EFFECTS (array)
9835           || ! targetm.binds_local_p (array))
9836         return 0;
9837
9838       /* Avoid const char foo[4] = "abcde";  */
9839       if (DECL_SIZE_UNIT (array) == NULL_TREE
9840           || TREE_CODE (DECL_SIZE_UNIT (array)) != INTEGER_CST
9841           || (length = TREE_STRING_LENGTH (DECL_INITIAL (array))) <= 0
9842           || compare_tree_int (DECL_SIZE_UNIT (array), length) < 0)
9843         return 0;
9844
9845       /* If variable is bigger than the string literal, OFFSET must be constant
9846          and inside of the bounds of the string literal.  */
9847       offset = fold_convert (sizetype, offset);
9848       if (compare_tree_int (DECL_SIZE_UNIT (array), length) > 0
9849           && (! host_integerp (offset, 1)
9850               || compare_tree_int (offset, length) >= 0))
9851         return 0;
9852
9853       *ptr_offset = offset;
9854       return DECL_INITIAL (array);
9855     }
9856
9857   return 0;
9858 }
9859 \f
9860 /* Generate code to calculate OPS, and exploded expression
9861    using a store-flag instruction and return an rtx for the result.
9862    OPS reflects a comparison.
9863
9864    If TARGET is nonzero, store the result there if convenient.
9865
9866    Return zero if there is no suitable set-flag instruction
9867    available on this machine.
9868
9869    Once expand_expr has been called on the arguments of the comparison,
9870    we are committed to doing the store flag, since it is not safe to
9871    re-evaluate the expression.  We emit the store-flag insn by calling
9872    emit_store_flag, but only expand the arguments if we have a reason
9873    to believe that emit_store_flag will be successful.  If we think that
9874    it will, but it isn't, we have to simulate the store-flag with a
9875    set/jump/set sequence.  */
9876
9877 static rtx
9878 do_store_flag (sepops ops, rtx target, enum machine_mode mode)
9879 {
9880   enum rtx_code code;
9881   tree arg0, arg1, type;
9882   tree tem;
9883   enum machine_mode operand_mode;
9884   int unsignedp;
9885   rtx op0, op1;
9886   rtx subtarget = target;
9887   location_t loc = ops->location;
9888
9889   arg0 = ops->op0;
9890   arg1 = ops->op1;
9891
9892   /* Don't crash if the comparison was erroneous.  */
9893   if (arg0 == error_mark_node || arg1 == error_mark_node)
9894     return const0_rtx;
9895
9896   type = TREE_TYPE (arg0);
9897   operand_mode = TYPE_MODE (type);
9898   unsignedp = TYPE_UNSIGNED (type);
9899
9900   /* We won't bother with BLKmode store-flag operations because it would mean
9901      passing a lot of information to emit_store_flag.  */
9902   if (operand_mode == BLKmode)
9903     return 0;
9904
9905   /* We won't bother with store-flag operations involving function pointers
9906      when function pointers must be canonicalized before comparisons.  */
9907 #ifdef HAVE_canonicalize_funcptr_for_compare
9908   if (HAVE_canonicalize_funcptr_for_compare
9909       && ((TREE_CODE (TREE_TYPE (arg0)) == POINTER_TYPE
9910            && (TREE_CODE (TREE_TYPE (TREE_TYPE (arg0)))
9911                == FUNCTION_TYPE))
9912           || (TREE_CODE (TREE_TYPE (arg1)) == POINTER_TYPE
9913               && (TREE_CODE (TREE_TYPE (TREE_TYPE (arg1)))
9914                   == FUNCTION_TYPE))))
9915     return 0;
9916 #endif
9917
9918   STRIP_NOPS (arg0);
9919   STRIP_NOPS (arg1);
9920
9921   /* Get the rtx comparison code to use.  We know that EXP is a comparison
9922      operation of some type.  Some comparisons against 1 and -1 can be
9923      converted to comparisons with zero.  Do so here so that the tests
9924      below will be aware that we have a comparison with zero.   These
9925      tests will not catch constants in the first operand, but constants
9926      are rarely passed as the first operand.  */
9927
9928   switch (ops->code)
9929     {
9930     case EQ_EXPR:
9931       code = EQ;
9932       break;
9933     case NE_EXPR:
9934       code = NE;
9935       break;
9936     case LT_EXPR:
9937       if (integer_onep (arg1))
9938         arg1 = integer_zero_node, code = unsignedp ? LEU : LE;
9939       else
9940         code = unsignedp ? LTU : LT;
9941       break;
9942     case LE_EXPR:
9943       if (! unsignedp && integer_all_onesp (arg1))
9944         arg1 = integer_zero_node, code = LT;
9945       else
9946         code = unsignedp ? LEU : LE;
9947       break;
9948     case GT_EXPR:
9949       if (! unsignedp && integer_all_onesp (arg1))
9950         arg1 = integer_zero_node, code = GE;
9951       else
9952         code = unsignedp ? GTU : GT;
9953       break;
9954     case GE_EXPR:
9955       if (integer_onep (arg1))
9956         arg1 = integer_zero_node, code = unsignedp ? GTU : GT;
9957       else
9958         code = unsignedp ? GEU : GE;
9959       break;
9960
9961     case UNORDERED_EXPR:
9962       code = UNORDERED;
9963       break;
9964     case ORDERED_EXPR:
9965       code = ORDERED;
9966       break;
9967     case UNLT_EXPR:
9968       code = UNLT;
9969       break;
9970     case UNLE_EXPR:
9971       code = UNLE;
9972       break;
9973     case UNGT_EXPR:
9974       code = UNGT;
9975       break;
9976     case UNGE_EXPR:
9977       code = UNGE;
9978       break;
9979     case UNEQ_EXPR:
9980       code = UNEQ;
9981       break;
9982     case LTGT_EXPR:
9983       code = LTGT;
9984       break;
9985
9986     default:
9987       gcc_unreachable ();
9988     }
9989
9990   /* Put a constant second.  */
9991   if (TREE_CODE (arg0) == REAL_CST || TREE_CODE (arg0) == INTEGER_CST
9992       || TREE_CODE (arg0) == FIXED_CST)
9993     {
9994       tem = arg0; arg0 = arg1; arg1 = tem;
9995       code = swap_condition (code);
9996     }
9997
9998   /* If this is an equality or inequality test of a single bit, we can
9999      do this by shifting the bit being tested to the low-order bit and
10000      masking the result with the constant 1.  If the condition was EQ,
10001      we xor it with 1.  This does not require an scc insn and is faster
10002      than an scc insn even if we have it.
10003
10004      The code to make this transformation was moved into fold_single_bit_test,
10005      so we just call into the folder and expand its result.  */
10006
10007   if ((code == NE || code == EQ)
10008       && TREE_CODE (arg0) == BIT_AND_EXPR && integer_zerop (arg1)
10009       && integer_pow2p (TREE_OPERAND (arg0, 1)))
10010     {
10011       tree type = lang_hooks.types.type_for_mode (mode, unsignedp);
10012       return expand_expr (fold_single_bit_test (loc,
10013                                                 code == NE ? NE_EXPR : EQ_EXPR,
10014                                                 arg0, arg1, type),
10015                           target, VOIDmode, EXPAND_NORMAL);
10016     }
10017
10018   if (! get_subtarget (target)
10019       || GET_MODE (subtarget) != operand_mode)
10020     subtarget = 0;
10021
10022   expand_operands (arg0, arg1, subtarget, &op0, &op1, EXPAND_NORMAL);
10023
10024   if (target == 0)
10025     target = gen_reg_rtx (mode);
10026
10027   /* Try a cstore if possible.  */
10028   return emit_store_flag_force (target, code, op0, op1,
10029                                 operand_mode, unsignedp, 1);
10030 }
10031 \f
10032
10033 /* Stubs in case we haven't got a casesi insn.  */
10034 #ifndef HAVE_casesi
10035 # define HAVE_casesi 0
10036 # define gen_casesi(a, b, c, d, e) (0)
10037 # define CODE_FOR_casesi CODE_FOR_nothing
10038 #endif
10039
10040 /* Attempt to generate a casesi instruction.  Returns 1 if successful,
10041    0 otherwise (i.e. if there is no casesi instruction).  */
10042 int
10043 try_casesi (tree index_type, tree index_expr, tree minval, tree range,
10044             rtx table_label ATTRIBUTE_UNUSED, rtx default_label,
10045             rtx fallback_label ATTRIBUTE_UNUSED)
10046 {
10047   enum machine_mode index_mode = SImode;
10048   int index_bits = GET_MODE_BITSIZE (index_mode);
10049   rtx op1, op2, index;
10050   enum machine_mode op_mode;
10051
10052   if (! HAVE_casesi)
10053     return 0;
10054
10055   /* Convert the index to SImode.  */
10056   if (GET_MODE_BITSIZE (TYPE_MODE (index_type)) > GET_MODE_BITSIZE (index_mode))
10057     {
10058       enum machine_mode omode = TYPE_MODE (index_type);
10059       rtx rangertx = expand_normal (range);
10060
10061       /* We must handle the endpoints in the original mode.  */
10062       index_expr = build2 (MINUS_EXPR, index_type,
10063                            index_expr, minval);
10064       minval = integer_zero_node;
10065       index = expand_normal (index_expr);
10066       if (default_label)
10067         emit_cmp_and_jump_insns (rangertx, index, LTU, NULL_RTX,
10068                                  omode, 1, default_label);
10069       /* Now we can safely truncate.  */
10070       index = convert_to_mode (index_mode, index, 0);
10071     }
10072   else
10073     {
10074       if (TYPE_MODE (index_type) != index_mode)
10075         {
10076           index_type = lang_hooks.types.type_for_size (index_bits, 0);
10077           index_expr = fold_convert (index_type, index_expr);
10078         }
10079
10080       index = expand_normal (index_expr);
10081     }
10082
10083   do_pending_stack_adjust ();
10084
10085   op_mode = insn_data[(int) CODE_FOR_casesi].operand[0].mode;
10086   if (! (*insn_data[(int) CODE_FOR_casesi].operand[0].predicate)
10087       (index, op_mode))
10088     index = copy_to_mode_reg (op_mode, index);
10089
10090   op1 = expand_normal (minval);
10091
10092   op_mode = insn_data[(int) CODE_FOR_casesi].operand[1].mode;
10093   op1 = convert_modes (op_mode, TYPE_MODE (TREE_TYPE (minval)),
10094                        op1, TYPE_UNSIGNED (TREE_TYPE (minval)));
10095   if (! (*insn_data[(int) CODE_FOR_casesi].operand[1].predicate)
10096       (op1, op_mode))
10097     op1 = copy_to_mode_reg (op_mode, op1);
10098
10099   op2 = expand_normal (range);
10100
10101   op_mode = insn_data[(int) CODE_FOR_casesi].operand[2].mode;
10102   op2 = convert_modes (op_mode, TYPE_MODE (TREE_TYPE (range)),
10103                        op2, TYPE_UNSIGNED (TREE_TYPE (range)));
10104   if (! (*insn_data[(int) CODE_FOR_casesi].operand[2].predicate)
10105       (op2, op_mode))
10106     op2 = copy_to_mode_reg (op_mode, op2);
10107
10108   emit_jump_insn (gen_casesi (index, op1, op2,
10109                               table_label, !default_label
10110                                            ? fallback_label : default_label));
10111   return 1;
10112 }
10113
10114 /* Attempt to generate a tablejump instruction; same concept.  */
10115 #ifndef HAVE_tablejump
10116 #define HAVE_tablejump 0
10117 #define gen_tablejump(x, y) (0)
10118 #endif
10119
10120 /* Subroutine of the next function.
10121
10122    INDEX is the value being switched on, with the lowest value
10123    in the table already subtracted.
10124    MODE is its expected mode (needed if INDEX is constant).
10125    RANGE is the length of the jump table.
10126    TABLE_LABEL is a CODE_LABEL rtx for the table itself.
10127
10128    DEFAULT_LABEL is a CODE_LABEL rtx to jump to if the
10129    index value is out of range.  */
10130
10131 static void
10132 do_tablejump (rtx index, enum machine_mode mode, rtx range, rtx table_label,
10133               rtx default_label)
10134 {
10135   rtx temp, vector;
10136
10137   if (INTVAL (range) > cfun->cfg->max_jumptable_ents)
10138     cfun->cfg->max_jumptable_ents = INTVAL (range);
10139
10140   /* Do an unsigned comparison (in the proper mode) between the index
10141      expression and the value which represents the length of the range.
10142      Since we just finished subtracting the lower bound of the range
10143      from the index expression, this comparison allows us to simultaneously
10144      check that the original index expression value is both greater than
10145      or equal to the minimum value of the range and less than or equal to
10146      the maximum value of the range.  */
10147
10148   if (default_label)
10149     emit_cmp_and_jump_insns (index, range, GTU, NULL_RTX, mode, 1,
10150                              default_label);
10151
10152   /* If index is in range, it must fit in Pmode.
10153      Convert to Pmode so we can index with it.  */
10154   if (mode != Pmode)
10155     index = convert_to_mode (Pmode, index, 1);
10156
10157   /* Don't let a MEM slip through, because then INDEX that comes
10158      out of PIC_CASE_VECTOR_ADDRESS won't be a valid address,
10159      and break_out_memory_refs will go to work on it and mess it up.  */
10160 #ifdef PIC_CASE_VECTOR_ADDRESS
10161   if (flag_pic && !REG_P (index))
10162     index = copy_to_mode_reg (Pmode, index);
10163 #endif
10164
10165   /* ??? The only correct use of CASE_VECTOR_MODE is the one inside the
10166      GET_MODE_SIZE, because this indicates how large insns are.  The other
10167      uses should all be Pmode, because they are addresses.  This code
10168      could fail if addresses and insns are not the same size.  */
10169   index = gen_rtx_PLUS (Pmode,
10170                         gen_rtx_MULT (Pmode, index,
10171                                       GEN_INT (GET_MODE_SIZE (CASE_VECTOR_MODE))),
10172                         gen_rtx_LABEL_REF (Pmode, table_label));
10173 #ifdef PIC_CASE_VECTOR_ADDRESS
10174   if (flag_pic)
10175     index = PIC_CASE_VECTOR_ADDRESS (index);
10176   else
10177 #endif
10178     index = memory_address (CASE_VECTOR_MODE, index);
10179   temp = gen_reg_rtx (CASE_VECTOR_MODE);
10180   vector = gen_const_mem (CASE_VECTOR_MODE, index);
10181   convert_move (temp, vector, 0);
10182
10183   emit_jump_insn (gen_tablejump (temp, table_label));
10184
10185   /* If we are generating PIC code or if the table is PC-relative, the
10186      table and JUMP_INSN must be adjacent, so don't output a BARRIER.  */
10187   if (! CASE_VECTOR_PC_RELATIVE && ! flag_pic)
10188     emit_barrier ();
10189 }
10190
10191 int
10192 try_tablejump (tree index_type, tree index_expr, tree minval, tree range,
10193                rtx table_label, rtx default_label)
10194 {
10195   rtx index;
10196
10197   if (! HAVE_tablejump)
10198     return 0;
10199
10200   index_expr = fold_build2 (MINUS_EXPR, index_type,
10201                             fold_convert (index_type, index_expr),
10202                             fold_convert (index_type, minval));
10203   index = expand_normal (index_expr);
10204   do_pending_stack_adjust ();
10205
10206   do_tablejump (index, TYPE_MODE (index_type),
10207                 convert_modes (TYPE_MODE (index_type),
10208                                TYPE_MODE (TREE_TYPE (range)),
10209                                expand_normal (range),
10210                                TYPE_UNSIGNED (TREE_TYPE (range))),
10211                 table_label, default_label);
10212   return 1;
10213 }
10214
10215 /* Nonzero if the mode is a valid vector mode for this architecture.
10216    This returns nonzero even if there is no hardware support for the
10217    vector mode, but we can emulate with narrower modes.  */
10218
10219 int
10220 vector_mode_valid_p (enum machine_mode mode)
10221 {
10222   enum mode_class mclass = GET_MODE_CLASS (mode);
10223   enum machine_mode innermode;
10224
10225   /* Doh!  What's going on?  */
10226   if (mclass != MODE_VECTOR_INT
10227       && mclass != MODE_VECTOR_FLOAT
10228       && mclass != MODE_VECTOR_FRACT
10229       && mclass != MODE_VECTOR_UFRACT
10230       && mclass != MODE_VECTOR_ACCUM
10231       && mclass != MODE_VECTOR_UACCUM)
10232     return 0;
10233
10234   /* Hardware support.  Woo hoo!  */
10235   if (targetm.vector_mode_supported_p (mode))
10236     return 1;
10237
10238   innermode = GET_MODE_INNER (mode);
10239
10240   /* We should probably return 1 if requesting V4DI and we have no DI,
10241      but we have V2DI, but this is probably very unlikely.  */
10242
10243   /* If we have support for the inner mode, we can safely emulate it.
10244      We may not have V2DI, but me can emulate with a pair of DIs.  */
10245   return targetm.scalar_mode_supported_p (innermode);
10246 }
10247
10248 /* Return a CONST_VECTOR rtx for a VECTOR_CST tree.  */
10249 static rtx
10250 const_vector_from_tree (tree exp)
10251 {
10252   rtvec v;
10253   int units, i;
10254   tree link, elt;
10255   enum machine_mode inner, mode;
10256
10257   mode = TYPE_MODE (TREE_TYPE (exp));
10258
10259   if (initializer_zerop (exp))
10260     return CONST0_RTX (mode);
10261
10262   units = GET_MODE_NUNITS (mode);
10263   inner = GET_MODE_INNER (mode);
10264
10265   v = rtvec_alloc (units);
10266
10267   link = TREE_VECTOR_CST_ELTS (exp);
10268   for (i = 0; link; link = TREE_CHAIN (link), ++i)
10269     {
10270       elt = TREE_VALUE (link);
10271
10272       if (TREE_CODE (elt) == REAL_CST)
10273         RTVEC_ELT (v, i) = CONST_DOUBLE_FROM_REAL_VALUE (TREE_REAL_CST (elt),
10274                                                          inner);
10275       else if (TREE_CODE (elt) == FIXED_CST)
10276         RTVEC_ELT (v, i) = CONST_FIXED_FROM_FIXED_VALUE (TREE_FIXED_CST (elt),
10277                                                          inner);
10278       else
10279         RTVEC_ELT (v, i) = immed_double_const (TREE_INT_CST_LOW (elt),
10280                                                TREE_INT_CST_HIGH (elt),
10281                                                inner);
10282     }
10283
10284   /* Initialize remaining elements to 0.  */
10285   for (; i < units; ++i)
10286     RTVEC_ELT (v, i) = CONST0_RTX (inner);
10287
10288   return gen_rtx_CONST_VECTOR (mode, v);
10289 }
10290
10291
10292 /* Build a decl for a EH personality function named NAME. */
10293
10294 tree
10295 build_personality_function (const char *name)
10296 {
10297   tree decl, type;
10298
10299   type = build_function_type_list (integer_type_node, integer_type_node,
10300                                    long_long_unsigned_type_node,
10301                                    ptr_type_node, ptr_type_node, NULL_TREE);
10302   decl = build_decl (UNKNOWN_LOCATION, FUNCTION_DECL,
10303                      get_identifier (name), type);
10304   DECL_ARTIFICIAL (decl) = 1;
10305   DECL_EXTERNAL (decl) = 1;
10306   TREE_PUBLIC (decl) = 1;
10307
10308   /* Zap the nonsensical SYMBOL_REF_DECL for this.  What we're left with
10309      are the flags assigned by targetm.encode_section_info.  */
10310   SET_SYMBOL_REF_DECL (XEXP (DECL_RTL (decl), 0), NULL);
10311
10312   return decl;
10313 }
10314
10315 /* Extracts the personality function of DECL and returns the corresponding
10316    libfunc.  */
10317
10318 rtx
10319 get_personality_function (tree decl)
10320 {
10321   tree personality = DECL_FUNCTION_PERSONALITY (decl);
10322   enum eh_personality_kind pk;
10323
10324   pk = function_needs_eh_personality (DECL_STRUCT_FUNCTION (decl));
10325   if (pk == eh_personality_none)
10326     return NULL;
10327
10328   if (!personality
10329       && pk == eh_personality_any)
10330     personality = lang_hooks.eh_personality ();
10331
10332   if (pk == eh_personality_lang)
10333     gcc_assert (personality != NULL_TREE);
10334
10335   return XEXP (DECL_RTL (personality), 0);
10336 }
10337
10338 #include "gt-expr.h"