OSDN Git Service

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