OSDN Git Service

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