OSDN Git Service

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