OSDN Git Service

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