OSDN Git Service

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