OSDN Git Service

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