OSDN Git Service

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