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