OSDN Git Service

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