OSDN Git Service

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