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