OSDN Git Service

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