OSDN Git Service

PR rtl-optimization/40900
[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 the bitfield is volatile, we want to access it in the
4233          field's mode, not the computed mode.  */
4234       if (volatilep
4235           && GET_CODE (to_rtx) == MEM
4236           && flag_strict_volatile_bitfields > 0)
4237         to_rtx = adjust_address (to_rtx, mode1, 0);
4238  
4239       if (offset != 0)
4240         {
4241           enum machine_mode address_mode;
4242           rtx offset_rtx;
4243
4244           if (!MEM_P (to_rtx))
4245             {
4246               /* We can get constant negative offsets into arrays with broken
4247                  user code.  Translate this to a trap instead of ICEing.  */
4248               gcc_assert (TREE_CODE (offset) == INTEGER_CST);
4249               expand_builtin_trap ();
4250               to_rtx = gen_rtx_MEM (BLKmode, const0_rtx);
4251             }
4252
4253           offset_rtx = expand_expr (offset, NULL_RTX, VOIDmode, EXPAND_SUM);
4254           address_mode
4255             = targetm.addr_space.address_mode (MEM_ADDR_SPACE (to_rtx));
4256           if (GET_MODE (offset_rtx) != address_mode)
4257             offset_rtx = convert_to_mode (address_mode, offset_rtx, 0);
4258
4259           /* A constant address in TO_RTX can have VOIDmode, we must not try
4260              to call force_reg for that case.  Avoid that case.  */
4261           if (MEM_P (to_rtx)
4262               && GET_MODE (to_rtx) == BLKmode
4263               && GET_MODE (XEXP (to_rtx, 0)) != VOIDmode
4264               && bitsize > 0
4265               && (bitpos % bitsize) == 0
4266               && (bitsize % GET_MODE_ALIGNMENT (mode1)) == 0
4267               && MEM_ALIGN (to_rtx) == GET_MODE_ALIGNMENT (mode1))
4268             {
4269               to_rtx = adjust_address (to_rtx, mode1, bitpos / BITS_PER_UNIT);
4270               bitpos = 0;
4271             }
4272
4273           to_rtx = offset_address (to_rtx, offset_rtx,
4274                                    highest_pow2_factor_for_target (to,
4275                                                                    offset));
4276         }
4277
4278       /* No action is needed if the target is not a memory and the field
4279          lies completely outside that target.  This can occur if the source
4280          code contains an out-of-bounds access to a small array.  */
4281       if (!MEM_P (to_rtx)
4282           && GET_MODE (to_rtx) != BLKmode
4283           && (unsigned HOST_WIDE_INT) bitpos
4284              >= GET_MODE_BITSIZE (GET_MODE (to_rtx)))
4285         {
4286           expand_normal (from);
4287           result = NULL;
4288         }
4289       /* Handle expand_expr of a complex value returning a CONCAT.  */
4290       else if (GET_CODE (to_rtx) == CONCAT)
4291         {
4292           if (COMPLEX_MODE_P (TYPE_MODE (TREE_TYPE (from))))
4293             {
4294               gcc_assert (bitpos == 0);
4295               result = store_expr (from, to_rtx, false, nontemporal);
4296             }
4297           else
4298             {
4299               gcc_assert (bitpos == 0 || bitpos == GET_MODE_BITSIZE (mode1));
4300               result = store_expr (from, XEXP (to_rtx, bitpos != 0), false,
4301                                    nontemporal);
4302             }
4303         }
4304       else
4305         {
4306           if (MEM_P (to_rtx))
4307             {
4308               /* If the field is at offset zero, we could have been given the
4309                  DECL_RTX of the parent struct.  Don't munge it.  */
4310               to_rtx = shallow_copy_rtx (to_rtx);
4311
4312               set_mem_attributes_minus_bitpos (to_rtx, to, 0, bitpos);
4313
4314               /* Deal with volatile and readonly fields.  The former is only
4315                  done for MEM.  Also set MEM_KEEP_ALIAS_SET_P if needed.  */
4316               if (volatilep)
4317                 MEM_VOLATILE_P (to_rtx) = 1;
4318               if (component_uses_parent_alias_set (to))
4319                 MEM_KEEP_ALIAS_SET_P (to_rtx) = 1;
4320             }
4321
4322           if (optimize_bitfield_assignment_op (bitsize, bitpos, mode1,
4323                                                to_rtx, to, from))
4324             result = NULL;
4325           else
4326             result = store_field (to_rtx, bitsize, bitpos, mode1, from,
4327                                   TREE_TYPE (tem), get_alias_set (to),
4328                                   nontemporal);
4329         }
4330
4331       if (result)
4332         preserve_temp_slots (result);
4333       free_temp_slots ();
4334       pop_temp_slots ();
4335       return;
4336     }
4337
4338    else if (TREE_CODE (to) == MISALIGNED_INDIRECT_REF)
4339      {
4340        addr_space_t as = ADDR_SPACE_GENERIC;
4341        enum machine_mode mode, op_mode1;
4342        enum insn_code icode;
4343        rtx reg, addr, mem, insn;
4344
4345        if (POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (to, 0))))
4346          as = TYPE_ADDR_SPACE (TREE_TYPE (TREE_TYPE (TREE_OPERAND (to, 0))));
4347
4348        reg = expand_expr (from, NULL_RTX, VOIDmode, EXPAND_NORMAL);
4349        reg = force_not_mem (reg);
4350
4351        mode = TYPE_MODE (TREE_TYPE (to));
4352        addr = expand_expr (TREE_OPERAND (to, 0), NULL_RTX, VOIDmode,
4353                          EXPAND_SUM);
4354        addr = memory_address_addr_space (mode, addr, as);
4355        mem = gen_rtx_MEM (mode, addr);
4356
4357        set_mem_attributes (mem, to, 0);
4358        set_mem_addr_space (mem, as);
4359
4360        icode = movmisalign_optab->handlers[mode].insn_code;
4361        gcc_assert (icode != CODE_FOR_nothing);
4362
4363        op_mode1 = insn_data[icode].operand[1].mode;
4364        if (! (*insn_data[icode].operand[1].predicate) (reg, op_mode1)
4365            && op_mode1 != VOIDmode)
4366          reg = copy_to_mode_reg (op_mode1, reg);
4367
4368       insn = GEN_FCN (icode) (mem, reg);
4369        emit_insn (insn);
4370        return;
4371      }
4372
4373   /* If the rhs is a function call and its value is not an aggregate,
4374      call the function before we start to compute the lhs.
4375      This is needed for correct code for cases such as
4376      val = setjmp (buf) on machines where reference to val
4377      requires loading up part of an address in a separate insn.
4378
4379      Don't do this if TO is a VAR_DECL or PARM_DECL whose DECL_RTL is REG
4380      since it might be a promoted variable where the zero- or sign- extension
4381      needs to be done.  Handling this in the normal way is safe because no
4382      computation is done before the call.  The same is true for SSA names.  */
4383   if (TREE_CODE (from) == CALL_EXPR && ! aggregate_value_p (from, from)
4384       && COMPLETE_TYPE_P (TREE_TYPE (from))
4385       && TREE_CODE (TYPE_SIZE (TREE_TYPE (from))) == INTEGER_CST
4386       && ! (((TREE_CODE (to) == VAR_DECL || TREE_CODE (to) == PARM_DECL)
4387              && REG_P (DECL_RTL (to)))
4388             || TREE_CODE (to) == SSA_NAME))
4389     {
4390       rtx value;
4391
4392       push_temp_slots ();
4393       value = expand_normal (from);
4394       if (to_rtx == 0)
4395         to_rtx = expand_expr (to, NULL_RTX, VOIDmode, EXPAND_WRITE);
4396
4397       /* Handle calls that return values in multiple non-contiguous locations.
4398          The Irix 6 ABI has examples of this.  */
4399       if (GET_CODE (to_rtx) == PARALLEL)
4400         emit_group_load (to_rtx, value, TREE_TYPE (from),
4401                          int_size_in_bytes (TREE_TYPE (from)));
4402       else if (GET_MODE (to_rtx) == BLKmode)
4403         emit_block_move (to_rtx, value, expr_size (from), BLOCK_OP_NORMAL);
4404       else
4405         {
4406           if (POINTER_TYPE_P (TREE_TYPE (to)))
4407             value = convert_memory_address_addr_space
4408                       (GET_MODE (to_rtx), value,
4409                        TYPE_ADDR_SPACE (TREE_TYPE (TREE_TYPE (to))));
4410
4411           emit_move_insn (to_rtx, value);
4412         }
4413       preserve_temp_slots (to_rtx);
4414       free_temp_slots ();
4415       pop_temp_slots ();
4416       return;
4417     }
4418
4419   /* Ordinary treatment.  Expand TO to get a REG or MEM rtx.
4420      Don't re-expand if it was expanded already (in COMPONENT_REF case).  */
4421
4422   if (to_rtx == 0)
4423     to_rtx = expand_expr (to, NULL_RTX, VOIDmode, EXPAND_WRITE);
4424
4425   /* Don't move directly into a return register.  */
4426   if (TREE_CODE (to) == RESULT_DECL
4427       && (REG_P (to_rtx) || GET_CODE (to_rtx) == PARALLEL))
4428     {
4429       rtx temp;
4430
4431       push_temp_slots ();
4432       temp = expand_expr (from, NULL_RTX, GET_MODE (to_rtx), EXPAND_NORMAL);
4433
4434       if (GET_CODE (to_rtx) == PARALLEL)
4435         emit_group_load (to_rtx, temp, TREE_TYPE (from),
4436                          int_size_in_bytes (TREE_TYPE (from)));
4437       else
4438         emit_move_insn (to_rtx, temp);
4439
4440       preserve_temp_slots (to_rtx);
4441       free_temp_slots ();
4442       pop_temp_slots ();
4443       return;
4444     }
4445
4446   /* In case we are returning the contents of an object which overlaps
4447      the place the value is being stored, use a safe function when copying
4448      a value through a pointer into a structure value return block.  */
4449   if (TREE_CODE (to) == RESULT_DECL
4450       && TREE_CODE (from) == INDIRECT_REF
4451       && ADDR_SPACE_GENERIC_P
4452            (TYPE_ADDR_SPACE (TREE_TYPE (TREE_TYPE (TREE_OPERAND (from, 0)))))
4453       && refs_may_alias_p (to, from)
4454       && cfun->returns_struct
4455       && !cfun->returns_pcc_struct)
4456     {
4457       rtx from_rtx, size;
4458
4459       push_temp_slots ();
4460       size = expr_size (from);
4461       from_rtx = expand_normal (from);
4462
4463       emit_library_call (memmove_libfunc, LCT_NORMAL,
4464                          VOIDmode, 3, XEXP (to_rtx, 0), Pmode,
4465                          XEXP (from_rtx, 0), Pmode,
4466                          convert_to_mode (TYPE_MODE (sizetype),
4467                                           size, TYPE_UNSIGNED (sizetype)),
4468                          TYPE_MODE (sizetype));
4469
4470       preserve_temp_slots (to_rtx);
4471       free_temp_slots ();
4472       pop_temp_slots ();
4473       return;
4474     }
4475
4476   /* Compute FROM and store the value in the rtx we got.  */
4477
4478   push_temp_slots ();
4479   result = store_expr (from, to_rtx, 0, nontemporal);
4480   preserve_temp_slots (result);
4481   free_temp_slots ();
4482   pop_temp_slots ();
4483   return;
4484 }
4485
4486 /* Emits nontemporal store insn that moves FROM to TO.  Returns true if this
4487    succeeded, false otherwise.  */
4488
4489 bool
4490 emit_storent_insn (rtx to, rtx from)
4491 {
4492   enum machine_mode mode = GET_MODE (to), imode;
4493   enum insn_code code = optab_handler (storent_optab, mode)->insn_code;
4494   rtx pattern;
4495
4496   if (code == CODE_FOR_nothing)
4497     return false;
4498
4499   imode = insn_data[code].operand[0].mode;
4500   if (!insn_data[code].operand[0].predicate (to, imode))
4501     return false;
4502
4503   imode = insn_data[code].operand[1].mode;
4504   if (!insn_data[code].operand[1].predicate (from, imode))
4505     {
4506       from = copy_to_mode_reg (imode, from);
4507       if (!insn_data[code].operand[1].predicate (from, imode))
4508         return false;
4509     }
4510
4511   pattern = GEN_FCN (code) (to, from);
4512   if (pattern == NULL_RTX)
4513     return false;
4514
4515   emit_insn (pattern);
4516   return true;
4517 }
4518
4519 /* Generate code for computing expression EXP,
4520    and storing the value into TARGET.
4521
4522    If the mode is BLKmode then we may return TARGET itself.
4523    It turns out that in BLKmode it doesn't cause a problem.
4524    because C has no operators that could combine two different
4525    assignments into the same BLKmode object with different values
4526    with no sequence point.  Will other languages need this to
4527    be more thorough?
4528
4529    If CALL_PARAM_P is nonzero, this is a store into a call param on the
4530    stack, and block moves may need to be treated specially.
4531
4532    If NONTEMPORAL is true, try using a nontemporal store instruction.  */
4533
4534 rtx
4535 store_expr (tree exp, rtx target, int call_param_p, bool nontemporal)
4536 {
4537   rtx temp;
4538   rtx alt_rtl = NULL_RTX;
4539   location_t loc = EXPR_LOCATION (exp);
4540
4541   if (VOID_TYPE_P (TREE_TYPE (exp)))
4542     {
4543       /* C++ can generate ?: expressions with a throw expression in one
4544          branch and an rvalue in the other. Here, we resolve attempts to
4545          store the throw expression's nonexistent result.  */
4546       gcc_assert (!call_param_p);
4547       expand_expr (exp, const0_rtx, VOIDmode, EXPAND_NORMAL);
4548       return NULL_RTX;
4549     }
4550   if (TREE_CODE (exp) == COMPOUND_EXPR)
4551     {
4552       /* Perform first part of compound expression, then assign from second
4553          part.  */
4554       expand_expr (TREE_OPERAND (exp, 0), const0_rtx, VOIDmode,
4555                    call_param_p ? EXPAND_STACK_PARM : EXPAND_NORMAL);
4556       return store_expr (TREE_OPERAND (exp, 1), target, call_param_p,
4557                          nontemporal);
4558     }
4559   else if (TREE_CODE (exp) == COND_EXPR && GET_MODE (target) == BLKmode)
4560     {
4561       /* For conditional expression, get safe form of the target.  Then
4562          test the condition, doing the appropriate assignment on either
4563          side.  This avoids the creation of unnecessary temporaries.
4564          For non-BLKmode, it is more efficient not to do this.  */
4565
4566       rtx lab1 = gen_label_rtx (), lab2 = gen_label_rtx ();
4567
4568       do_pending_stack_adjust ();
4569       NO_DEFER_POP;
4570       jumpifnot (TREE_OPERAND (exp, 0), lab1, -1);
4571       store_expr (TREE_OPERAND (exp, 1), target, call_param_p,
4572                   nontemporal);
4573       emit_jump_insn (gen_jump (lab2));
4574       emit_barrier ();
4575       emit_label (lab1);
4576       store_expr (TREE_OPERAND (exp, 2), target, call_param_p,
4577                   nontemporal);
4578       emit_label (lab2);
4579       OK_DEFER_POP;
4580
4581       return NULL_RTX;
4582     }
4583   else if (GET_CODE (target) == SUBREG && SUBREG_PROMOTED_VAR_P (target))
4584     /* If this is a scalar in a register that is stored in a wider mode
4585        than the declared mode, compute the result into its declared mode
4586        and then convert to the wider mode.  Our value is the computed
4587        expression.  */
4588     {
4589       rtx inner_target = 0;
4590
4591       /* We can do the conversion inside EXP, which will often result
4592          in some optimizations.  Do the conversion in two steps: first
4593          change the signedness, if needed, then the extend.  But don't
4594          do this if the type of EXP is a subtype of something else
4595          since then the conversion might involve more than just
4596          converting modes.  */
4597       if (INTEGRAL_TYPE_P (TREE_TYPE (exp))
4598           && TREE_TYPE (TREE_TYPE (exp)) == 0
4599           && GET_MODE_PRECISION (GET_MODE (target))
4600              == TYPE_PRECISION (TREE_TYPE (exp)))
4601         {
4602           if (TYPE_UNSIGNED (TREE_TYPE (exp))
4603               != SUBREG_PROMOTED_UNSIGNED_P (target))
4604             {
4605               /* Some types, e.g. Fortran's logical*4, won't have a signed
4606                  version, so use the mode instead.  */
4607               tree ntype
4608                 = (signed_or_unsigned_type_for
4609                    (SUBREG_PROMOTED_UNSIGNED_P (target), TREE_TYPE (exp)));
4610               if (ntype == NULL)
4611                 ntype = lang_hooks.types.type_for_mode
4612                   (TYPE_MODE (TREE_TYPE (exp)),
4613                    SUBREG_PROMOTED_UNSIGNED_P (target));
4614
4615               exp = fold_convert_loc (loc, ntype, exp);
4616             }
4617
4618           exp = fold_convert_loc (loc, lang_hooks.types.type_for_mode
4619                                   (GET_MODE (SUBREG_REG (target)),
4620                                    SUBREG_PROMOTED_UNSIGNED_P (target)),
4621                                   exp);
4622
4623           inner_target = SUBREG_REG (target);
4624         }
4625
4626       temp = expand_expr (exp, inner_target, VOIDmode,
4627                           call_param_p ? EXPAND_STACK_PARM : EXPAND_NORMAL);
4628
4629       /* If TEMP is a VOIDmode constant, use convert_modes to make
4630          sure that we properly convert it.  */
4631       if (CONSTANT_P (temp) && GET_MODE (temp) == VOIDmode)
4632         {
4633           temp = convert_modes (GET_MODE (target), TYPE_MODE (TREE_TYPE (exp)),
4634                                 temp, SUBREG_PROMOTED_UNSIGNED_P (target));
4635           temp = convert_modes (GET_MODE (SUBREG_REG (target)),
4636                                 GET_MODE (target), temp,
4637                                 SUBREG_PROMOTED_UNSIGNED_P (target));
4638         }
4639
4640       convert_move (SUBREG_REG (target), temp,
4641                     SUBREG_PROMOTED_UNSIGNED_P (target));
4642
4643       return NULL_RTX;
4644     }
4645   else if (TREE_CODE (exp) == STRING_CST
4646            && !nontemporal && !call_param_p
4647            && TREE_STRING_LENGTH (exp) > 0
4648            && TYPE_MODE (TREE_TYPE (exp)) == BLKmode)
4649     {
4650       /* Optimize initialization of an array with a STRING_CST.  */
4651       HOST_WIDE_INT exp_len, str_copy_len;
4652       rtx dest_mem;
4653
4654       exp_len = int_expr_size (exp);
4655       if (exp_len <= 0)
4656         goto normal_expr;
4657
4658       str_copy_len = strlen (TREE_STRING_POINTER (exp));
4659       if (str_copy_len < TREE_STRING_LENGTH (exp) - 1)
4660         goto normal_expr;
4661
4662       str_copy_len = TREE_STRING_LENGTH (exp);
4663       if ((STORE_MAX_PIECES & (STORE_MAX_PIECES - 1)) == 0)
4664         {
4665           str_copy_len += STORE_MAX_PIECES - 1;
4666           str_copy_len &= ~(STORE_MAX_PIECES - 1);
4667         }
4668       str_copy_len = MIN (str_copy_len, exp_len);
4669       if (!can_store_by_pieces (str_copy_len, builtin_strncpy_read_str,
4670                                 CONST_CAST(char *, TREE_STRING_POINTER (exp)),
4671                                 MEM_ALIGN (target), false))
4672         goto normal_expr;
4673
4674       dest_mem = target;
4675
4676       dest_mem = store_by_pieces (dest_mem,
4677                                   str_copy_len, builtin_strncpy_read_str,
4678                                   CONST_CAST(char *, TREE_STRING_POINTER (exp)),
4679                                   MEM_ALIGN (target), false,
4680                                   exp_len > str_copy_len ? 1 : 0);
4681       if (exp_len > str_copy_len)
4682         clear_storage (adjust_address (dest_mem, BLKmode, 0),
4683                        GEN_INT (exp_len - str_copy_len),
4684                        BLOCK_OP_NORMAL);
4685       return NULL_RTX;
4686     }
4687   else
4688     {
4689       rtx tmp_target;
4690
4691   normal_expr:
4692       /* If we want to use a nontemporal store, force the value to
4693          register first.  */
4694       tmp_target = nontemporal ? NULL_RTX : target;
4695       temp = expand_expr_real (exp, tmp_target, GET_MODE (target),
4696                                (call_param_p
4697                                 ? EXPAND_STACK_PARM : EXPAND_NORMAL),
4698                                &alt_rtl);
4699     }
4700
4701   /* If TEMP is a VOIDmode constant and the mode of the type of EXP is not
4702      the same as that of TARGET, adjust the constant.  This is needed, for
4703      example, in case it is a CONST_DOUBLE and we want only a word-sized
4704      value.  */
4705   if (CONSTANT_P (temp) && GET_MODE (temp) == VOIDmode
4706       && TREE_CODE (exp) != ERROR_MARK
4707       && GET_MODE (target) != TYPE_MODE (TREE_TYPE (exp)))
4708     temp = convert_modes (GET_MODE (target), TYPE_MODE (TREE_TYPE (exp)),
4709                           temp, TYPE_UNSIGNED (TREE_TYPE (exp)));
4710
4711   /* If value was not generated in the target, store it there.
4712      Convert the value to TARGET's type first if necessary and emit the
4713      pending incrementations that have been queued when expanding EXP.
4714      Note that we cannot emit the whole queue blindly because this will
4715      effectively disable the POST_INC optimization later.
4716
4717      If TEMP and TARGET compare equal according to rtx_equal_p, but
4718      one or both of them are volatile memory refs, we have to distinguish
4719      two cases:
4720      - expand_expr has used TARGET.  In this case, we must not generate
4721        another copy.  This can be detected by TARGET being equal according
4722        to == .
4723      - expand_expr has not used TARGET - that means that the source just
4724        happens to have the same RTX form.  Since temp will have been created
4725        by expand_expr, it will compare unequal according to == .
4726        We must generate a copy in this case, to reach the correct number
4727        of volatile memory references.  */
4728
4729   if ((! rtx_equal_p (temp, target)
4730        || (temp != target && (side_effects_p (temp)
4731                               || side_effects_p (target))))
4732       && TREE_CODE (exp) != ERROR_MARK
4733       /* If store_expr stores a DECL whose DECL_RTL(exp) == TARGET,
4734          but TARGET is not valid memory reference, TEMP will differ
4735          from TARGET although it is really the same location.  */
4736       && !(alt_rtl && rtx_equal_p (alt_rtl, target))
4737       /* If there's nothing to copy, don't bother.  Don't call
4738          expr_size unless necessary, because some front-ends (C++)
4739          expr_size-hook must not be given objects that are not
4740          supposed to be bit-copied or bit-initialized.  */
4741       && expr_size (exp) != const0_rtx)
4742     {
4743       if (GET_MODE (temp) != GET_MODE (target)
4744           && GET_MODE (temp) != VOIDmode)
4745         {
4746           int unsignedp = TYPE_UNSIGNED (TREE_TYPE (exp));
4747           if (GET_MODE (target) == BLKmode
4748                    || GET_MODE (temp) == BLKmode)
4749             emit_block_move (target, temp, expr_size (exp),
4750                              (call_param_p
4751                               ? BLOCK_OP_CALL_PARM
4752                               : BLOCK_OP_NORMAL));
4753           else
4754             convert_move (target, temp, unsignedp);
4755         }
4756
4757       else if (GET_MODE (temp) == BLKmode && TREE_CODE (exp) == STRING_CST)
4758         {
4759           /* Handle copying a string constant into an array.  The string
4760              constant may be shorter than the array.  So copy just the string's
4761              actual length, and clear the rest.  First get the size of the data
4762              type of the string, which is actually the size of the target.  */
4763           rtx size = expr_size (exp);
4764
4765           if (CONST_INT_P (size)
4766               && INTVAL (size) < TREE_STRING_LENGTH (exp))
4767             emit_block_move (target, temp, size,
4768                              (call_param_p
4769                               ? BLOCK_OP_CALL_PARM : BLOCK_OP_NORMAL));
4770           else
4771             {
4772               enum machine_mode pointer_mode
4773                 = targetm.addr_space.pointer_mode (MEM_ADDR_SPACE (target));
4774               enum machine_mode address_mode
4775                 = targetm.addr_space.address_mode (MEM_ADDR_SPACE (target));
4776
4777               /* Compute the size of the data to copy from the string.  */
4778               tree copy_size
4779                 = size_binop_loc (loc, MIN_EXPR,
4780                                   make_tree (sizetype, size),
4781                                   size_int (TREE_STRING_LENGTH (exp)));
4782               rtx copy_size_rtx
4783                 = expand_expr (copy_size, NULL_RTX, VOIDmode,
4784                                (call_param_p
4785                                 ? EXPAND_STACK_PARM : EXPAND_NORMAL));
4786               rtx label = 0;
4787
4788               /* Copy that much.  */
4789               copy_size_rtx = convert_to_mode (pointer_mode, copy_size_rtx,
4790                                                TYPE_UNSIGNED (sizetype));
4791               emit_block_move (target, temp, copy_size_rtx,
4792                                (call_param_p
4793                                 ? BLOCK_OP_CALL_PARM : BLOCK_OP_NORMAL));
4794
4795               /* Figure out how much is left in TARGET that we have to clear.
4796                  Do all calculations in pointer_mode.  */
4797               if (CONST_INT_P (copy_size_rtx))
4798                 {
4799                   size = plus_constant (size, -INTVAL (copy_size_rtx));
4800                   target = adjust_address (target, BLKmode,
4801                                            INTVAL (copy_size_rtx));
4802                 }
4803               else
4804                 {
4805                   size = expand_binop (TYPE_MODE (sizetype), sub_optab, size,
4806                                        copy_size_rtx, NULL_RTX, 0,
4807                                        OPTAB_LIB_WIDEN);
4808
4809                   if (GET_MODE (copy_size_rtx) != address_mode)
4810                     copy_size_rtx = convert_to_mode (address_mode,
4811                                                      copy_size_rtx,
4812                                                      TYPE_UNSIGNED (sizetype));
4813
4814                   target = offset_address (target, copy_size_rtx,
4815                                            highest_pow2_factor (copy_size));
4816                   label = gen_label_rtx ();
4817                   emit_cmp_and_jump_insns (size, const0_rtx, LT, NULL_RTX,
4818                                            GET_MODE (size), 0, label);
4819                 }
4820
4821               if (size != const0_rtx)
4822                 clear_storage (target, size, BLOCK_OP_NORMAL);
4823
4824               if (label)
4825                 emit_label (label);
4826             }
4827         }
4828       /* Handle calls that return values in multiple non-contiguous locations.
4829          The Irix 6 ABI has examples of this.  */
4830       else if (GET_CODE (target) == PARALLEL)
4831         emit_group_load (target, temp, TREE_TYPE (exp),
4832                          int_size_in_bytes (TREE_TYPE (exp)));
4833       else if (GET_MODE (temp) == BLKmode)
4834         emit_block_move (target, temp, expr_size (exp),
4835                          (call_param_p
4836                           ? BLOCK_OP_CALL_PARM : BLOCK_OP_NORMAL));
4837       else if (nontemporal
4838                && emit_storent_insn (target, temp))
4839         /* If we managed to emit a nontemporal store, there is nothing else to
4840            do.  */
4841         ;
4842       else
4843         {
4844           temp = force_operand (temp, target);
4845           if (temp != target)
4846             emit_move_insn (target, temp);
4847         }
4848     }
4849
4850   return NULL_RTX;
4851 }
4852 \f
4853 /* Helper for categorize_ctor_elements.  Identical interface.  */
4854
4855 static bool
4856 categorize_ctor_elements_1 (const_tree ctor, HOST_WIDE_INT *p_nz_elts,
4857                             HOST_WIDE_INT *p_elt_count,
4858                             bool *p_must_clear)
4859 {
4860   unsigned HOST_WIDE_INT idx;
4861   HOST_WIDE_INT nz_elts, elt_count;
4862   tree value, purpose;
4863
4864   /* Whether CTOR is a valid constant initializer, in accordance with what
4865      initializer_constant_valid_p does.  If inferred from the constructor
4866      elements, true until proven otherwise.  */
4867   bool const_from_elts_p = constructor_static_from_elts_p (ctor);
4868   bool const_p = const_from_elts_p ? true : TREE_STATIC (ctor);
4869
4870   nz_elts = 0;
4871   elt_count = 0;
4872
4873   FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (ctor), idx, purpose, value)
4874     {
4875       HOST_WIDE_INT mult = 1;
4876
4877       if (TREE_CODE (purpose) == RANGE_EXPR)
4878         {
4879           tree lo_index = TREE_OPERAND (purpose, 0);
4880           tree hi_index = TREE_OPERAND (purpose, 1);
4881
4882           if (host_integerp (lo_index, 1) && host_integerp (hi_index, 1))
4883             mult = (tree_low_cst (hi_index, 1)
4884                     - tree_low_cst (lo_index, 1) + 1);
4885         }
4886
4887       switch (TREE_CODE (value))
4888         {
4889         case CONSTRUCTOR:
4890           {
4891             HOST_WIDE_INT nz = 0, ic = 0;
4892
4893             bool const_elt_p
4894               = categorize_ctor_elements_1 (value, &nz, &ic, p_must_clear);
4895
4896             nz_elts += mult * nz;
4897             elt_count += mult * ic;
4898
4899             if (const_from_elts_p && const_p)
4900               const_p = const_elt_p;
4901           }
4902           break;
4903
4904         case INTEGER_CST:
4905         case REAL_CST:
4906         case FIXED_CST:
4907           if (!initializer_zerop (value))
4908             nz_elts += mult;
4909           elt_count += mult;
4910           break;
4911
4912         case STRING_CST:
4913           nz_elts += mult * TREE_STRING_LENGTH (value);
4914           elt_count += mult * TREE_STRING_LENGTH (value);
4915           break;
4916
4917         case COMPLEX_CST:
4918           if (!initializer_zerop (TREE_REALPART (value)))
4919             nz_elts += mult;
4920           if (!initializer_zerop (TREE_IMAGPART (value)))
4921             nz_elts += mult;
4922           elt_count += mult;
4923           break;
4924
4925         case VECTOR_CST:
4926           {
4927             tree v;
4928             for (v = TREE_VECTOR_CST_ELTS (value); v; v = TREE_CHAIN (v))
4929               {
4930                 if (!initializer_zerop (TREE_VALUE (v)))
4931                   nz_elts += mult;
4932                 elt_count += mult;
4933               }
4934           }
4935           break;
4936
4937         default:
4938           {
4939             HOST_WIDE_INT tc = count_type_elements (TREE_TYPE (value), true);
4940             if (tc < 1)
4941               tc = 1;
4942             nz_elts += mult * tc;
4943             elt_count += mult * tc;
4944
4945             if (const_from_elts_p && const_p)
4946               const_p = initializer_constant_valid_p (value, TREE_TYPE (value))
4947                         != NULL_TREE;
4948           }
4949           break;
4950         }
4951     }
4952
4953   if (!*p_must_clear
4954       && (TREE_CODE (TREE_TYPE (ctor)) == UNION_TYPE
4955           || TREE_CODE (TREE_TYPE (ctor)) == QUAL_UNION_TYPE))
4956     {
4957       tree init_sub_type;
4958       bool clear_this = true;
4959
4960       if (!VEC_empty (constructor_elt, CONSTRUCTOR_ELTS (ctor)))
4961         {
4962           /* We don't expect more than one element of the union to be
4963              initialized.  Not sure what we should do otherwise... */
4964           gcc_assert (VEC_length (constructor_elt, CONSTRUCTOR_ELTS (ctor))
4965                       == 1);
4966
4967           init_sub_type = TREE_TYPE (VEC_index (constructor_elt,
4968                                                 CONSTRUCTOR_ELTS (ctor),
4969                                                 0)->value);
4970
4971           /* ??? We could look at each element of the union, and find the
4972              largest element.  Which would avoid comparing the size of the
4973              initialized element against any tail padding in the union.
4974              Doesn't seem worth the effort...  */
4975           if (simple_cst_equal (TYPE_SIZE (TREE_TYPE (ctor)),
4976                                 TYPE_SIZE (init_sub_type)) == 1)
4977             {
4978               /* And now we have to find out if the element itself is fully
4979                  constructed.  E.g. for union { struct { int a, b; } s; } u
4980                  = { .s = { .a = 1 } }.  */
4981               if (elt_count == count_type_elements (init_sub_type, false))
4982                 clear_this = false;
4983             }
4984         }
4985
4986       *p_must_clear = clear_this;
4987     }
4988
4989   *p_nz_elts += nz_elts;
4990   *p_elt_count += elt_count;
4991
4992   return const_p;
4993 }
4994
4995 /* Examine CTOR to discover:
4996    * how many scalar fields are set to nonzero values,
4997      and place it in *P_NZ_ELTS;
4998    * how many scalar fields in total are in CTOR,
4999      and place it in *P_ELT_COUNT.
5000    * if a type is a union, and the initializer from the constructor
5001      is not the largest element in the union, then set *p_must_clear.
5002
5003    Return whether or not CTOR is a valid static constant initializer, the same
5004    as "initializer_constant_valid_p (CTOR, TREE_TYPE (CTOR)) != 0".  */
5005
5006 bool
5007 categorize_ctor_elements (const_tree ctor, HOST_WIDE_INT *p_nz_elts,
5008                           HOST_WIDE_INT *p_elt_count,
5009                           bool *p_must_clear)
5010 {
5011   *p_nz_elts = 0;
5012   *p_elt_count = 0;
5013   *p_must_clear = false;
5014
5015   return
5016     categorize_ctor_elements_1 (ctor, p_nz_elts, p_elt_count, p_must_clear);
5017 }
5018
5019 /* Count the number of scalars in TYPE.  Return -1 on overflow or
5020    variable-sized.  If ALLOW_FLEXARR is true, don't count flexible
5021    array member at the end of the structure.  */
5022
5023 HOST_WIDE_INT
5024 count_type_elements (const_tree type, bool allow_flexarr)
5025 {
5026   const HOST_WIDE_INT max = ~((HOST_WIDE_INT)1 << (HOST_BITS_PER_WIDE_INT-1));
5027   switch (TREE_CODE (type))
5028     {
5029     case ARRAY_TYPE:
5030       {
5031         tree telts = array_type_nelts (type);
5032         if (telts && host_integerp (telts, 1))
5033           {
5034             HOST_WIDE_INT n = tree_low_cst (telts, 1) + 1;
5035             HOST_WIDE_INT m = count_type_elements (TREE_TYPE (type), false);
5036             if (n == 0)
5037               return 0;
5038             else if (max / n > m)
5039               return n * m;
5040           }
5041         return -1;
5042       }
5043
5044     case RECORD_TYPE:
5045       {
5046         HOST_WIDE_INT n = 0, t;
5047         tree f;
5048
5049         for (f = TYPE_FIELDS (type); f ; f = TREE_CHAIN (f))
5050           if (TREE_CODE (f) == FIELD_DECL)
5051             {
5052               t = count_type_elements (TREE_TYPE (f), false);
5053               if (t < 0)
5054                 {
5055                   /* Check for structures with flexible array member.  */
5056                   tree tf = TREE_TYPE (f);
5057                   if (allow_flexarr
5058                       && TREE_CHAIN (f) == NULL
5059                       && TREE_CODE (tf) == ARRAY_TYPE
5060                       && TYPE_DOMAIN (tf)
5061                       && TYPE_MIN_VALUE (TYPE_DOMAIN (tf))
5062                       && integer_zerop (TYPE_MIN_VALUE (TYPE_DOMAIN (tf)))
5063                       && !TYPE_MAX_VALUE (TYPE_DOMAIN (tf))
5064                       && int_size_in_bytes (type) >= 0)
5065                     break;
5066
5067                   return -1;
5068                 }
5069               n += t;
5070             }
5071
5072         return n;
5073       }
5074
5075     case UNION_TYPE:
5076     case QUAL_UNION_TYPE:
5077       return -1;
5078
5079     case COMPLEX_TYPE:
5080       return 2;
5081
5082     case VECTOR_TYPE:
5083       return TYPE_VECTOR_SUBPARTS (type);
5084
5085     case INTEGER_TYPE:
5086     case REAL_TYPE:
5087     case FIXED_POINT_TYPE:
5088     case ENUMERAL_TYPE:
5089     case BOOLEAN_TYPE:
5090     case POINTER_TYPE:
5091     case OFFSET_TYPE:
5092     case REFERENCE_TYPE:
5093       return 1;
5094
5095     case ERROR_MARK:
5096       return 0;
5097
5098     case VOID_TYPE:
5099     case METHOD_TYPE:
5100     case FUNCTION_TYPE:
5101     case LANG_TYPE:
5102     default:
5103       gcc_unreachable ();
5104     }
5105 }
5106
5107 /* Return 1 if EXP contains mostly (3/4)  zeros.  */
5108
5109 static int
5110 mostly_zeros_p (const_tree exp)
5111 {
5112   if (TREE_CODE (exp) == CONSTRUCTOR)
5113
5114     {
5115       HOST_WIDE_INT nz_elts, count, elts;
5116       bool must_clear;
5117
5118       categorize_ctor_elements (exp, &nz_elts, &count, &must_clear);
5119       if (must_clear)
5120         return 1;
5121
5122       elts = count_type_elements (TREE_TYPE (exp), false);
5123
5124       return nz_elts < elts / 4;
5125     }
5126
5127   return initializer_zerop (exp);
5128 }
5129
5130 /* Return 1 if EXP contains all zeros.  */
5131
5132 static int
5133 all_zeros_p (const_tree exp)
5134 {
5135   if (TREE_CODE (exp) == CONSTRUCTOR)
5136
5137     {
5138       HOST_WIDE_INT nz_elts, count;
5139       bool must_clear;
5140
5141       categorize_ctor_elements (exp, &nz_elts, &count, &must_clear);
5142       return nz_elts == 0;
5143     }
5144
5145   return initializer_zerop (exp);
5146 }
5147 \f
5148 /* Helper function for store_constructor.
5149    TARGET, BITSIZE, BITPOS, MODE, EXP are as for store_field.
5150    TYPE is the type of the CONSTRUCTOR, not the element type.
5151    CLEARED is as for store_constructor.
5152    ALIAS_SET is the alias set to use for any stores.
5153
5154    This provides a recursive shortcut back to store_constructor when it isn't
5155    necessary to go through store_field.  This is so that we can pass through
5156    the cleared field to let store_constructor know that we may not have to
5157    clear a substructure if the outer structure has already been cleared.  */
5158
5159 static void
5160 store_constructor_field (rtx target, unsigned HOST_WIDE_INT bitsize,
5161                          HOST_WIDE_INT bitpos, enum machine_mode mode,
5162                          tree exp, tree type, int cleared,
5163                          alias_set_type alias_set)
5164 {
5165   if (TREE_CODE (exp) == CONSTRUCTOR
5166       /* We can only call store_constructor recursively if the size and
5167          bit position are on a byte boundary.  */
5168       && bitpos % BITS_PER_UNIT == 0
5169       && (bitsize > 0 && bitsize % BITS_PER_UNIT == 0)
5170       /* If we have a nonzero bitpos for a register target, then we just
5171          let store_field do the bitfield handling.  This is unlikely to
5172          generate unnecessary clear instructions anyways.  */
5173       && (bitpos == 0 || MEM_P (target)))
5174     {
5175       if (MEM_P (target))
5176         target
5177           = adjust_address (target,
5178                             GET_MODE (target) == BLKmode
5179                             || 0 != (bitpos
5180                                      % GET_MODE_ALIGNMENT (GET_MODE (target)))
5181                             ? BLKmode : VOIDmode, bitpos / BITS_PER_UNIT);
5182
5183
5184       /* Update the alias set, if required.  */
5185       if (MEM_P (target) && ! MEM_KEEP_ALIAS_SET_P (target)
5186           && MEM_ALIAS_SET (target) != 0)
5187         {
5188           target = copy_rtx (target);
5189           set_mem_alias_set (target, alias_set);
5190         }
5191
5192       store_constructor (exp, target, cleared, bitsize / BITS_PER_UNIT);
5193     }
5194   else
5195     store_field (target, bitsize, bitpos, mode, exp, type, alias_set, false);
5196 }
5197
5198 /* Store the value of constructor EXP into the rtx TARGET.
5199    TARGET is either a REG or a MEM; we know it cannot conflict, since
5200    safe_from_p has been called.
5201    CLEARED is true if TARGET is known to have been zero'd.
5202    SIZE is the number of bytes of TARGET we are allowed to modify: this
5203    may not be the same as the size of EXP if we are assigning to a field
5204    which has been packed to exclude padding bits.  */
5205
5206 static void
5207 store_constructor (tree exp, rtx target, int cleared, HOST_WIDE_INT size)
5208 {
5209   tree type = TREE_TYPE (exp);
5210 #ifdef WORD_REGISTER_OPERATIONS
5211   HOST_WIDE_INT exp_size = int_size_in_bytes (type);
5212 #endif
5213
5214   switch (TREE_CODE (type))
5215     {
5216     case RECORD_TYPE:
5217     case UNION_TYPE:
5218     case QUAL_UNION_TYPE:
5219       {
5220         unsigned HOST_WIDE_INT idx;
5221         tree field, value;
5222
5223         /* If size is zero or the target is already cleared, do nothing.  */
5224         if (size == 0 || cleared)
5225           cleared = 1;
5226         /* We either clear the aggregate or indicate the value is dead.  */
5227         else if ((TREE_CODE (type) == UNION_TYPE
5228                   || TREE_CODE (type) == QUAL_UNION_TYPE)
5229                  && ! CONSTRUCTOR_ELTS (exp))
5230           /* If the constructor is empty, clear the union.  */
5231           {
5232             clear_storage (target, expr_size (exp), BLOCK_OP_NORMAL);
5233             cleared = 1;
5234           }
5235
5236         /* If we are building a static constructor into a register,
5237            set the initial value as zero so we can fold the value into
5238            a constant.  But if more than one register is involved,
5239            this probably loses.  */
5240         else if (REG_P (target) && TREE_STATIC (exp)
5241                  && GET_MODE_SIZE (GET_MODE (target)) <= UNITS_PER_WORD)
5242           {
5243             emit_move_insn (target, CONST0_RTX (GET_MODE (target)));
5244             cleared = 1;
5245           }
5246
5247         /* If the constructor has fewer fields than the structure or
5248            if we are initializing the structure to mostly zeros, clear
5249            the whole structure first.  Don't do this if TARGET is a
5250            register whose mode size isn't equal to SIZE since
5251            clear_storage can't handle this case.  */
5252         else if (size > 0
5253                  && (((int)VEC_length (constructor_elt, CONSTRUCTOR_ELTS (exp))
5254                       != fields_length (type))
5255                      || mostly_zeros_p (exp))
5256                  && (!REG_P (target)
5257                      || ((HOST_WIDE_INT) GET_MODE_SIZE (GET_MODE (target))
5258                          == size)))
5259           {
5260             clear_storage (target, GEN_INT (size), BLOCK_OP_NORMAL);
5261             cleared = 1;
5262           }
5263
5264         if (REG_P (target) && !cleared)
5265           emit_clobber (target);
5266
5267         /* Store each element of the constructor into the
5268            corresponding field of TARGET.  */
5269         FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (exp), idx, field, value)
5270           {
5271             enum machine_mode mode;
5272             HOST_WIDE_INT bitsize;
5273             HOST_WIDE_INT bitpos = 0;
5274             tree offset;
5275             rtx to_rtx = target;
5276
5277             /* Just ignore missing fields.  We cleared the whole
5278                structure, above, if any fields are missing.  */
5279             if (field == 0)
5280               continue;
5281
5282             if (cleared && initializer_zerop (value))
5283               continue;
5284
5285             if (host_integerp (DECL_SIZE (field), 1))
5286               bitsize = tree_low_cst (DECL_SIZE (field), 1);
5287             else
5288               bitsize = -1;
5289
5290             mode = DECL_MODE (field);
5291             if (DECL_BIT_FIELD (field))
5292               mode = VOIDmode;
5293
5294             offset = DECL_FIELD_OFFSET (field);
5295             if (host_integerp (offset, 0)
5296                 && host_integerp (bit_position (field), 0))
5297               {
5298                 bitpos = int_bit_position (field);
5299                 offset = 0;
5300               }
5301             else
5302               bitpos = tree_low_cst (DECL_FIELD_BIT_OFFSET (field), 0);
5303
5304             if (offset)
5305               {
5306                 enum machine_mode address_mode;
5307                 rtx offset_rtx;
5308
5309                 offset
5310                   = SUBSTITUTE_PLACEHOLDER_IN_EXPR (offset,
5311                                                     make_tree (TREE_TYPE (exp),
5312                                                                target));
5313
5314                 offset_rtx = expand_normal (offset);
5315                 gcc_assert (MEM_P (to_rtx));
5316
5317                 address_mode
5318                   = targetm.addr_space.address_mode (MEM_ADDR_SPACE (to_rtx));
5319                 if (GET_MODE (offset_rtx) != address_mode)
5320                   offset_rtx = convert_to_mode (address_mode, offset_rtx, 0);
5321
5322                 to_rtx = offset_address (to_rtx, offset_rtx,
5323                                          highest_pow2_factor (offset));
5324               }
5325
5326 #ifdef WORD_REGISTER_OPERATIONS
5327             /* If this initializes a field that is smaller than a
5328                word, at the start of a word, try to widen it to a full
5329                word.  This special case allows us to output C++ member
5330                function initializations in a form that the optimizers
5331                can understand.  */
5332             if (REG_P (target)
5333                 && bitsize < BITS_PER_WORD
5334                 && bitpos % BITS_PER_WORD == 0
5335                 && GET_MODE_CLASS (mode) == MODE_INT
5336                 && TREE_CODE (value) == INTEGER_CST
5337                 && exp_size >= 0
5338                 && bitpos + BITS_PER_WORD <= exp_size * BITS_PER_UNIT)
5339               {
5340                 tree type = TREE_TYPE (value);
5341
5342                 if (TYPE_PRECISION (type) < BITS_PER_WORD)
5343                   {
5344                     type = lang_hooks.types.type_for_size
5345                       (BITS_PER_WORD, TYPE_UNSIGNED (type));
5346                     value = fold_convert (type, value);
5347                   }
5348
5349                 if (BYTES_BIG_ENDIAN)
5350                   value
5351                    = fold_build2 (LSHIFT_EXPR, type, value,
5352                                    build_int_cst (type,
5353                                                   BITS_PER_WORD - bitsize));
5354                 bitsize = BITS_PER_WORD;
5355                 mode = word_mode;
5356               }
5357 #endif
5358
5359             if (MEM_P (to_rtx) && !MEM_KEEP_ALIAS_SET_P (to_rtx)
5360                 && DECL_NONADDRESSABLE_P (field))
5361               {
5362                 to_rtx = copy_rtx (to_rtx);
5363                 MEM_KEEP_ALIAS_SET_P (to_rtx) = 1;
5364               }
5365
5366             store_constructor_field (to_rtx, bitsize, bitpos, mode,
5367                                      value, type, cleared,
5368                                      get_alias_set (TREE_TYPE (field)));
5369           }
5370         break;
5371       }
5372     case ARRAY_TYPE:
5373       {
5374         tree value, index;
5375         unsigned HOST_WIDE_INT i;
5376         int need_to_clear;
5377         tree domain;
5378         tree elttype = TREE_TYPE (type);
5379         int const_bounds_p;
5380         HOST_WIDE_INT minelt = 0;
5381         HOST_WIDE_INT maxelt = 0;
5382
5383         domain = TYPE_DOMAIN (type);
5384         const_bounds_p = (TYPE_MIN_VALUE (domain)
5385                           && TYPE_MAX_VALUE (domain)
5386                           && host_integerp (TYPE_MIN_VALUE (domain), 0)
5387                           && host_integerp (TYPE_MAX_VALUE (domain), 0));
5388
5389         /* If we have constant bounds for the range of the type, get them.  */
5390         if (const_bounds_p)
5391           {
5392             minelt = tree_low_cst (TYPE_MIN_VALUE (domain), 0);
5393             maxelt = tree_low_cst (TYPE_MAX_VALUE (domain), 0);
5394           }
5395
5396         /* If the constructor has fewer elements than the array, clear
5397            the whole array first.  Similarly if this is static
5398            constructor of a non-BLKmode object.  */
5399         if (cleared)
5400           need_to_clear = 0;
5401         else if (REG_P (target) && TREE_STATIC (exp))
5402           need_to_clear = 1;
5403         else
5404           {
5405             unsigned HOST_WIDE_INT idx;
5406             tree index, value;
5407             HOST_WIDE_INT count = 0, zero_count = 0;
5408             need_to_clear = ! const_bounds_p;
5409
5410             /* This loop is a more accurate version of the loop in
5411                mostly_zeros_p (it handles RANGE_EXPR in an index).  It
5412                is also needed to check for missing elements.  */
5413             FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (exp), idx, index, value)
5414               {
5415                 HOST_WIDE_INT this_node_count;
5416
5417                 if (need_to_clear)
5418                   break;
5419
5420                 if (index != NULL_TREE && TREE_CODE (index) == RANGE_EXPR)
5421                   {
5422                     tree lo_index = TREE_OPERAND (index, 0);
5423                     tree hi_index = TREE_OPERAND (index, 1);
5424
5425                     if (! host_integerp (lo_index, 1)
5426                         || ! host_integerp (hi_index, 1))
5427                       {
5428                         need_to_clear = 1;
5429                         break;
5430                       }
5431
5432                     this_node_count = (tree_low_cst (hi_index, 1)
5433                                        - tree_low_cst (lo_index, 1) + 1);
5434                   }
5435                 else
5436                   this_node_count = 1;
5437
5438                 count += this_node_count;
5439                 if (mostly_zeros_p (value))
5440                   zero_count += this_node_count;
5441               }
5442
5443             /* Clear the entire array first if there are any missing
5444                elements, or if the incidence of zero elements is >=
5445                75%.  */
5446             if (! need_to_clear
5447                 && (count < maxelt - minelt + 1
5448                     || 4 * zero_count >= 3 * count))
5449               need_to_clear = 1;
5450           }
5451
5452         if (need_to_clear && size > 0)
5453           {
5454             if (REG_P (target))
5455               emit_move_insn (target,  CONST0_RTX (GET_MODE (target)));
5456             else
5457               clear_storage (target, GEN_INT (size), BLOCK_OP_NORMAL);
5458             cleared = 1;
5459           }
5460
5461         if (!cleared && REG_P (target))
5462           /* Inform later passes that the old value is dead.  */
5463           emit_clobber (target);
5464
5465         /* Store each element of the constructor into the
5466            corresponding element of TARGET, determined by counting the
5467            elements.  */
5468         FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (exp), i, index, value)
5469           {
5470             enum machine_mode mode;
5471             HOST_WIDE_INT bitsize;
5472             HOST_WIDE_INT bitpos;
5473             rtx xtarget = target;
5474
5475             if (cleared && initializer_zerop (value))
5476               continue;
5477
5478             mode = TYPE_MODE (elttype);
5479             if (mode == BLKmode)
5480               bitsize = (host_integerp (TYPE_SIZE (elttype), 1)
5481                          ? tree_low_cst (TYPE_SIZE (elttype), 1)
5482                          : -1);
5483             else
5484               bitsize = GET_MODE_BITSIZE (mode);
5485
5486             if (index != NULL_TREE && TREE_CODE (index) == RANGE_EXPR)
5487               {
5488                 tree lo_index = TREE_OPERAND (index, 0);
5489                 tree hi_index = TREE_OPERAND (index, 1);
5490                 rtx index_r, pos_rtx;
5491                 HOST_WIDE_INT lo, hi, count;
5492                 tree position;
5493
5494                 /* If the range is constant and "small", unroll the loop.  */
5495                 if (const_bounds_p
5496                     && host_integerp (lo_index, 0)
5497                     && host_integerp (hi_index, 0)
5498                     && (lo = tree_low_cst (lo_index, 0),
5499                         hi = tree_low_cst (hi_index, 0),
5500                         count = hi - lo + 1,
5501                         (!MEM_P (target)
5502                          || count <= 2
5503                          || (host_integerp (TYPE_SIZE (elttype), 1)
5504                              && (tree_low_cst (TYPE_SIZE (elttype), 1) * count
5505                                  <= 40 * 8)))))
5506                   {
5507                     lo -= minelt;  hi -= minelt;
5508                     for (; lo <= hi; lo++)
5509                       {
5510                         bitpos = lo * tree_low_cst (TYPE_SIZE (elttype), 0);
5511
5512                         if (MEM_P (target)
5513                             && !MEM_KEEP_ALIAS_SET_P (target)
5514                             && TREE_CODE (type) == ARRAY_TYPE
5515                             && TYPE_NONALIASED_COMPONENT (type))
5516                           {
5517                             target = copy_rtx (target);
5518                             MEM_KEEP_ALIAS_SET_P (target) = 1;
5519                           }
5520
5521                         store_constructor_field
5522                           (target, bitsize, bitpos, mode, value, type, cleared,
5523                            get_alias_set (elttype));
5524                       }
5525                   }
5526                 else
5527                   {
5528                     rtx loop_start = gen_label_rtx ();
5529                     rtx loop_end = gen_label_rtx ();
5530                     tree exit_cond;
5531
5532                     expand_normal (hi_index);
5533
5534                     index = build_decl (EXPR_LOCATION (exp),
5535                                         VAR_DECL, NULL_TREE, domain);
5536                     index_r = gen_reg_rtx (promote_decl_mode (index, NULL));
5537                     SET_DECL_RTL (index, index_r);
5538                     store_expr (lo_index, index_r, 0, false);
5539
5540                     /* Build the head of the loop.  */
5541                     do_pending_stack_adjust ();
5542                     emit_label (loop_start);
5543
5544                     /* Assign value to element index.  */
5545                     position =
5546                       fold_convert (ssizetype,
5547                                     fold_build2 (MINUS_EXPR,
5548                                                  TREE_TYPE (index),
5549                                                  index,
5550                                                  TYPE_MIN_VALUE (domain)));
5551
5552                     position =
5553                         size_binop (MULT_EXPR, position,
5554                                     fold_convert (ssizetype,
5555                                                   TYPE_SIZE_UNIT (elttype)));
5556
5557                     pos_rtx = expand_normal (position);
5558                     xtarget = offset_address (target, pos_rtx,
5559                                               highest_pow2_factor (position));
5560                     xtarget = adjust_address (xtarget, mode, 0);
5561                     if (TREE_CODE (value) == CONSTRUCTOR)
5562                       store_constructor (value, xtarget, cleared,
5563                                          bitsize / BITS_PER_UNIT);
5564                     else
5565                       store_expr (value, xtarget, 0, false);
5566
5567                     /* Generate a conditional jump to exit the loop.  */
5568                     exit_cond = build2 (LT_EXPR, integer_type_node,
5569                                         index, hi_index);
5570                     jumpif (exit_cond, loop_end, -1);
5571
5572                     /* Update the loop counter, and jump to the head of
5573                        the loop.  */
5574                     expand_assignment (index,
5575                                        build2 (PLUS_EXPR, TREE_TYPE (index),
5576                                                index, integer_one_node),
5577                                        false);
5578
5579                     emit_jump (loop_start);
5580
5581                     /* Build the end of the loop.  */
5582                     emit_label (loop_end);
5583                   }
5584               }
5585             else if ((index != 0 && ! host_integerp (index, 0))
5586                      || ! host_integerp (TYPE_SIZE (elttype), 1))
5587               {
5588                 tree position;
5589
5590                 if (index == 0)
5591                   index = ssize_int (1);
5592
5593                 if (minelt)
5594                   index = fold_convert (ssizetype,
5595                                         fold_build2 (MINUS_EXPR,
5596                                                      TREE_TYPE (index),
5597                                                      index,
5598                                                      TYPE_MIN_VALUE (domain)));
5599
5600                 position =
5601                   size_binop (MULT_EXPR, index,
5602                               fold_convert (ssizetype,
5603                                             TYPE_SIZE_UNIT (elttype)));
5604                 xtarget = offset_address (target,
5605                                           expand_normal (position),
5606                                           highest_pow2_factor (position));
5607                 xtarget = adjust_address (xtarget, mode, 0);
5608                 store_expr (value, xtarget, 0, false);
5609               }
5610             else
5611               {
5612                 if (index != 0)
5613                   bitpos = ((tree_low_cst (index, 0) - minelt)
5614                             * tree_low_cst (TYPE_SIZE (elttype), 1));
5615                 else
5616                   bitpos = (i * tree_low_cst (TYPE_SIZE (elttype), 1));
5617
5618                 if (MEM_P (target) && !MEM_KEEP_ALIAS_SET_P (target)
5619                     && TREE_CODE (type) == ARRAY_TYPE
5620                     && TYPE_NONALIASED_COMPONENT (type))
5621                   {
5622                     target = copy_rtx (target);
5623                     MEM_KEEP_ALIAS_SET_P (target) = 1;
5624                   }
5625                 store_constructor_field (target, bitsize, bitpos, mode, value,
5626                                          type, cleared, get_alias_set (elttype));
5627               }
5628           }
5629         break;
5630       }
5631
5632     case VECTOR_TYPE:
5633       {
5634         unsigned HOST_WIDE_INT idx;
5635         constructor_elt *ce;
5636         int i;
5637         int need_to_clear;
5638         int icode = 0;
5639         tree elttype = TREE_TYPE (type);
5640         int elt_size = tree_low_cst (TYPE_SIZE (elttype), 1);
5641         enum machine_mode eltmode = TYPE_MODE (elttype);
5642         HOST_WIDE_INT bitsize;
5643         HOST_WIDE_INT bitpos;
5644         rtvec vector = NULL;
5645         unsigned n_elts;
5646         alias_set_type alias;
5647
5648         gcc_assert (eltmode != BLKmode);
5649
5650         n_elts = TYPE_VECTOR_SUBPARTS (type);
5651         if (REG_P (target) && VECTOR_MODE_P (GET_MODE (target)))
5652           {
5653             enum machine_mode mode = GET_MODE (target);
5654
5655             icode = (int) optab_handler (vec_init_optab, mode)->insn_code;
5656             if (icode != CODE_FOR_nothing)
5657               {
5658                 unsigned int i;
5659
5660                 vector = rtvec_alloc (n_elts);
5661                 for (i = 0; i < n_elts; i++)
5662                   RTVEC_ELT (vector, i) = CONST0_RTX (GET_MODE_INNER (mode));
5663               }
5664           }
5665
5666         /* If the constructor has fewer elements than the vector,
5667            clear the whole array first.  Similarly if this is static
5668            constructor of a non-BLKmode object.  */
5669         if (cleared)
5670           need_to_clear = 0;
5671         else if (REG_P (target) && TREE_STATIC (exp))
5672           need_to_clear = 1;
5673         else
5674           {
5675             unsigned HOST_WIDE_INT count = 0, zero_count = 0;
5676             tree value;
5677
5678             FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (exp), idx, value)
5679               {
5680                 int n_elts_here = tree_low_cst
5681                   (int_const_binop (TRUNC_DIV_EXPR,
5682                                     TYPE_SIZE (TREE_TYPE (value)),
5683                                     TYPE_SIZE (elttype), 0), 1);
5684
5685                 count += n_elts_here;
5686                 if (mostly_zeros_p (value))
5687                   zero_count += n_elts_here;
5688               }
5689
5690             /* Clear the entire vector first if there are any missing elements,
5691                or if the incidence of zero elements is >= 75%.  */
5692             need_to_clear = (count < n_elts || 4 * zero_count >= 3 * count);
5693           }
5694
5695         if (need_to_clear && size > 0 && !vector)
5696           {
5697             if (REG_P (target))
5698               emit_move_insn (target, CONST0_RTX (GET_MODE (target)));
5699             else
5700               clear_storage (target, GEN_INT (size), BLOCK_OP_NORMAL);
5701             cleared = 1;
5702           }
5703
5704         /* Inform later passes that the old value is dead.  */
5705         if (!cleared && !vector && REG_P (target))
5706           emit_move_insn (target, CONST0_RTX (GET_MODE (target)));
5707
5708         if (MEM_P (target))
5709           alias = MEM_ALIAS_SET (target);
5710         else
5711           alias = get_alias_set (elttype);
5712
5713         /* Store each element of the constructor into the corresponding
5714            element of TARGET, determined by counting the elements.  */
5715         for (idx = 0, i = 0;
5716              VEC_iterate (constructor_elt, CONSTRUCTOR_ELTS (exp), idx, ce);
5717              idx++, i += bitsize / elt_size)
5718           {
5719             HOST_WIDE_INT eltpos;
5720             tree value = ce->value;
5721
5722             bitsize = tree_low_cst (TYPE_SIZE (TREE_TYPE (value)), 1);
5723             if (cleared && initializer_zerop (value))
5724               continue;
5725
5726             if (ce->index)
5727               eltpos = tree_low_cst (ce->index, 1);
5728             else
5729               eltpos = i;
5730
5731             if (vector)
5732               {
5733                 /* Vector CONSTRUCTORs should only be built from smaller
5734                    vectors in the case of BLKmode vectors.  */
5735                 gcc_assert (TREE_CODE (TREE_TYPE (value)) != VECTOR_TYPE);
5736                 RTVEC_ELT (vector, eltpos)
5737                   = expand_normal (value);
5738               }
5739             else
5740               {
5741                 enum machine_mode value_mode =
5742                   TREE_CODE (TREE_TYPE (value)) == VECTOR_TYPE
5743                   ? TYPE_MODE (TREE_TYPE (value))
5744                   : eltmode;
5745                 bitpos = eltpos * elt_size;
5746                 store_constructor_field (target, bitsize, bitpos,
5747                                          value_mode, value, type,
5748                                          cleared, alias);
5749               }
5750           }
5751
5752         if (vector)
5753           emit_insn (GEN_FCN (icode)
5754                      (target,
5755                       gen_rtx_PARALLEL (GET_MODE (target), vector)));
5756         break;
5757       }
5758
5759     default:
5760       gcc_unreachable ();
5761     }
5762 }
5763
5764 /* Store the value of EXP (an expression tree)
5765    into a subfield of TARGET which has mode MODE and occupies
5766    BITSIZE bits, starting BITPOS bits from the start of TARGET.
5767    If MODE is VOIDmode, it means that we are storing into a bit-field.
5768
5769    Always return const0_rtx unless we have something particular to
5770    return.
5771
5772    TYPE is the type of the underlying object,
5773
5774    ALIAS_SET is the alias set for the destination.  This value will
5775    (in general) be different from that for TARGET, since TARGET is a
5776    reference to the containing structure.
5777
5778    If NONTEMPORAL is true, try generating a nontemporal store.  */
5779
5780 static rtx
5781 store_field (rtx target, HOST_WIDE_INT bitsize, HOST_WIDE_INT bitpos,
5782              enum machine_mode mode, tree exp, tree type,
5783              alias_set_type alias_set, bool nontemporal)
5784 {
5785   if (TREE_CODE (exp) == ERROR_MARK)
5786     return const0_rtx;
5787
5788   /* If we have nothing to store, do nothing unless the expression has
5789      side-effects.  */
5790   if (bitsize == 0)
5791     return expand_expr (exp, const0_rtx, VOIDmode, EXPAND_NORMAL);
5792
5793   /* If we are storing into an unaligned field of an aligned union that is
5794      in a register, we may have the mode of TARGET being an integer mode but
5795      MODE == BLKmode.  In that case, get an aligned object whose size and
5796      alignment are the same as TARGET and store TARGET into it (we can avoid
5797      the store if the field being stored is the entire width of TARGET).  Then
5798      call ourselves recursively to store the field into a BLKmode version of
5799      that object.  Finally, load from the object into TARGET.  This is not
5800      very efficient in general, but should only be slightly more expensive
5801      than the otherwise-required unaligned accesses.  Perhaps this can be
5802      cleaned up later.  It's tempting to make OBJECT readonly, but it's set
5803      twice, once with emit_move_insn and once via store_field.  */
5804
5805   if (mode == BLKmode
5806       && (REG_P (target) || GET_CODE (target) == SUBREG))
5807     {
5808       rtx object = assign_temp (type, 0, 1, 1);
5809       rtx blk_object = adjust_address (object, BLKmode, 0);
5810
5811       if (bitsize != (HOST_WIDE_INT) GET_MODE_BITSIZE (GET_MODE (target)))
5812         emit_move_insn (object, target);
5813
5814       store_field (blk_object, bitsize, bitpos, mode, exp, type, alias_set,
5815                    nontemporal);
5816
5817       emit_move_insn (target, object);
5818
5819       /* We want to return the BLKmode version of the data.  */
5820       return blk_object;
5821     }
5822
5823   if (GET_CODE (target) == CONCAT)
5824     {
5825       /* We're storing into a struct containing a single __complex.  */
5826
5827       gcc_assert (!bitpos);
5828       return store_expr (exp, target, 0, nontemporal);
5829     }
5830
5831   /* If the structure is in a register or if the component
5832      is a bit field, we cannot use addressing to access it.
5833      Use bit-field techniques or SUBREG to store in it.  */
5834
5835   if (mode == VOIDmode
5836       || (mode != BLKmode && ! direct_store[(int) mode]
5837           && GET_MODE_CLASS (mode) != MODE_COMPLEX_INT
5838           && GET_MODE_CLASS (mode) != MODE_COMPLEX_FLOAT)
5839       || REG_P (target)
5840       || GET_CODE (target) == SUBREG
5841       /* If the field isn't aligned enough to store as an ordinary memref,
5842          store it as a bit field.  */
5843       || (mode != BLKmode
5844           && ((((MEM_ALIGN (target) < GET_MODE_ALIGNMENT (mode))
5845                 || bitpos % GET_MODE_ALIGNMENT (mode))
5846                && SLOW_UNALIGNED_ACCESS (mode, MEM_ALIGN (target)))
5847               || (bitpos % BITS_PER_UNIT != 0)))
5848       /* If the RHS and field are a constant size and the size of the
5849          RHS isn't the same size as the bitfield, we must use bitfield
5850          operations.  */
5851       || (bitsize >= 0
5852           && TREE_CODE (TYPE_SIZE (TREE_TYPE (exp))) == INTEGER_CST
5853           && compare_tree_int (TYPE_SIZE (TREE_TYPE (exp)), bitsize) != 0))
5854     {
5855       rtx temp;
5856       gimple nop_def;
5857
5858       /* If EXP is a NOP_EXPR of precision less than its mode, then that
5859          implies a mask operation.  If the precision is the same size as
5860          the field we're storing into, that mask is redundant.  This is
5861          particularly common with bit field assignments generated by the
5862          C front end.  */
5863       nop_def = get_def_for_expr (exp, NOP_EXPR);
5864       if (nop_def)
5865         {
5866           tree type = TREE_TYPE (exp);
5867           if (INTEGRAL_TYPE_P (type)
5868               && TYPE_PRECISION (type) < GET_MODE_BITSIZE (TYPE_MODE (type))
5869               && bitsize == TYPE_PRECISION (type))
5870             {
5871               tree op = gimple_assign_rhs1 (nop_def);
5872               type = TREE_TYPE (op);
5873               if (INTEGRAL_TYPE_P (type) && TYPE_PRECISION (type) >= bitsize)
5874                 exp = op;
5875             }
5876         }
5877
5878       temp = expand_normal (exp);
5879
5880       /* If BITSIZE is narrower than the size of the type of EXP
5881          we will be narrowing TEMP.  Normally, what's wanted are the
5882          low-order bits.  However, if EXP's type is a record and this is
5883          big-endian machine, we want the upper BITSIZE bits.  */
5884       if (BYTES_BIG_ENDIAN && GET_MODE_CLASS (GET_MODE (temp)) == MODE_INT
5885           && bitsize < (HOST_WIDE_INT) GET_MODE_BITSIZE (GET_MODE (temp))
5886           && TREE_CODE (TREE_TYPE (exp)) == RECORD_TYPE)
5887         temp = expand_shift (RSHIFT_EXPR, GET_MODE (temp), temp,
5888                              size_int (GET_MODE_BITSIZE (GET_MODE (temp))
5889                                        - bitsize),
5890                              NULL_RTX, 1);
5891
5892       /* Unless MODE is VOIDmode or BLKmode, convert TEMP to
5893          MODE.  */
5894       if (mode != VOIDmode && mode != BLKmode
5895           && mode != TYPE_MODE (TREE_TYPE (exp)))
5896         temp = convert_modes (mode, TYPE_MODE (TREE_TYPE (exp)), temp, 1);
5897
5898       /* If the modes of TEMP and TARGET are both BLKmode, both
5899          must be in memory and BITPOS must be aligned on a byte
5900          boundary.  If so, we simply do a block copy.  Likewise
5901          for a BLKmode-like TARGET.  */
5902       if (GET_MODE (temp) == BLKmode
5903           && (GET_MODE (target) == BLKmode
5904               || (MEM_P (target)
5905                   && GET_MODE_CLASS (GET_MODE (target)) == MODE_INT
5906                   && (bitpos % BITS_PER_UNIT) == 0
5907                   && (bitsize % BITS_PER_UNIT) == 0)))
5908         {
5909           gcc_assert (MEM_P (target) && MEM_P (temp)
5910                       && (bitpos % BITS_PER_UNIT) == 0);
5911
5912           target = adjust_address (target, VOIDmode, bitpos / BITS_PER_UNIT);
5913           emit_block_move (target, temp,
5914                            GEN_INT ((bitsize + BITS_PER_UNIT - 1)
5915                                     / BITS_PER_UNIT),
5916                            BLOCK_OP_NORMAL);
5917
5918           return const0_rtx;
5919         }
5920
5921       /* Store the value in the bitfield.  */
5922       store_bit_field (target, bitsize, bitpos, mode, temp);
5923
5924       return const0_rtx;
5925     }
5926   else
5927     {
5928       /* Now build a reference to just the desired component.  */
5929       rtx to_rtx = adjust_address (target, mode, bitpos / BITS_PER_UNIT);
5930
5931       if (to_rtx == target)
5932         to_rtx = copy_rtx (to_rtx);
5933
5934       MEM_SET_IN_STRUCT_P (to_rtx, 1);
5935       if (!MEM_KEEP_ALIAS_SET_P (to_rtx) && MEM_ALIAS_SET (to_rtx) != 0)
5936         set_mem_alias_set (to_rtx, alias_set);
5937
5938       return store_expr (exp, to_rtx, 0, nontemporal);
5939     }
5940 }
5941 \f
5942 /* Given an expression EXP that may be a COMPONENT_REF, a BIT_FIELD_REF,
5943    an ARRAY_REF, or an ARRAY_RANGE_REF, look for nested operations of these
5944    codes and find the ultimate containing object, which we return.
5945
5946    We set *PBITSIZE to the size in bits that we want, *PBITPOS to the
5947    bit position, and *PUNSIGNEDP to the signedness of the field.
5948    If the position of the field is variable, we store a tree
5949    giving the variable offset (in units) in *POFFSET.
5950    This offset is in addition to the bit position.
5951    If the position is not variable, we store 0 in *POFFSET.
5952
5953    If any of the extraction expressions is volatile,
5954    we store 1 in *PVOLATILEP.  Otherwise we don't change that.
5955
5956    If the field is a non-BLKmode bit-field, *PMODE is set to VOIDmode.
5957    Otherwise, it is a mode that can be used to access the field.
5958
5959    If the field describes a variable-sized object, *PMODE is set to
5960    BLKmode and *PBITSIZE is set to -1.  An access cannot be made in
5961    this case, but the address of the object can be found.
5962
5963    If KEEP_ALIGNING is true and the target is STRICT_ALIGNMENT, we don't
5964    look through nodes that serve as markers of a greater alignment than
5965    the one that can be deduced from the expression.  These nodes make it
5966    possible for front-ends to prevent temporaries from being created by
5967    the middle-end on alignment considerations.  For that purpose, the
5968    normal operating mode at high-level is to always pass FALSE so that
5969    the ultimate containing object is really returned; moreover, the
5970    associated predicate handled_component_p will always return TRUE
5971    on these nodes, thus indicating that they are essentially handled
5972    by get_inner_reference.  TRUE should only be passed when the caller
5973    is scanning the expression in order to build another representation
5974    and specifically knows how to handle these nodes; as such, this is
5975    the normal operating mode in the RTL expanders.  */
5976
5977 tree
5978 get_inner_reference (tree exp, HOST_WIDE_INT *pbitsize,
5979                      HOST_WIDE_INT *pbitpos, tree *poffset,
5980                      enum machine_mode *pmode, int *punsignedp,
5981                      int *pvolatilep, bool keep_aligning)
5982 {
5983   tree size_tree = 0;
5984   enum machine_mode mode = VOIDmode;
5985   bool blkmode_bitfield = false;
5986   tree offset = size_zero_node;
5987   double_int bit_offset = double_int_zero;
5988
5989   /* First get the mode, signedness, and size.  We do this from just the
5990      outermost expression.  */
5991   *pbitsize = -1;
5992   if (TREE_CODE (exp) == COMPONENT_REF)
5993     {
5994       tree field = TREE_OPERAND (exp, 1);
5995       size_tree = DECL_SIZE (field);
5996       if (!DECL_BIT_FIELD (field))
5997         mode = DECL_MODE (field);
5998       else if (DECL_MODE (field) == BLKmode)
5999         blkmode_bitfield = true;
6000       else if (TREE_THIS_VOLATILE (exp)
6001                && flag_strict_volatile_bitfields > 0)
6002         /* Volatile bitfields should be accessed in the mode of the
6003              field's type, not the mode computed based on the bit
6004              size.  */
6005         mode = TYPE_MODE (DECL_BIT_FIELD_TYPE (field));
6006
6007       *punsignedp = DECL_UNSIGNED (field);
6008     }
6009   else if (TREE_CODE (exp) == BIT_FIELD_REF)
6010     {
6011       size_tree = TREE_OPERAND (exp, 1);
6012       *punsignedp = (! INTEGRAL_TYPE_P (TREE_TYPE (exp))
6013                      || TYPE_UNSIGNED (TREE_TYPE (exp)));
6014
6015       /* For vector types, with the correct size of access, use the mode of
6016          inner type.  */
6017       if (TREE_CODE (TREE_TYPE (TREE_OPERAND (exp, 0))) == VECTOR_TYPE
6018           && TREE_TYPE (exp) == TREE_TYPE (TREE_TYPE (TREE_OPERAND (exp, 0)))
6019           && tree_int_cst_equal (size_tree, TYPE_SIZE (TREE_TYPE (exp))))
6020         mode = TYPE_MODE (TREE_TYPE (exp));
6021     }
6022   else
6023     {
6024       mode = TYPE_MODE (TREE_TYPE (exp));
6025       *punsignedp = TYPE_UNSIGNED (TREE_TYPE (exp));
6026
6027       if (mode == BLKmode)
6028         size_tree = TYPE_SIZE (TREE_TYPE (exp));
6029       else
6030         *pbitsize = GET_MODE_BITSIZE (mode);
6031     }
6032
6033   if (size_tree != 0)
6034     {
6035       if (! host_integerp (size_tree, 1))
6036         mode = BLKmode, *pbitsize = -1;
6037       else
6038         *pbitsize = tree_low_cst (size_tree, 1);
6039     }
6040
6041   /* Compute cumulative bit-offset for nested component-refs and array-refs,
6042      and find the ultimate containing object.  */
6043   while (1)
6044     {
6045       switch (TREE_CODE (exp))
6046         {
6047         case BIT_FIELD_REF:
6048           bit_offset
6049             = double_int_add (bit_offset,
6050                               tree_to_double_int (TREE_OPERAND (exp, 2)));
6051           break;
6052
6053         case COMPONENT_REF:
6054           {
6055             tree field = TREE_OPERAND (exp, 1);
6056             tree this_offset = component_ref_field_offset (exp);
6057
6058             /* If this field hasn't been filled in yet, don't go past it.
6059                This should only happen when folding expressions made during
6060                type construction.  */
6061             if (this_offset == 0)
6062               break;
6063
6064             offset = size_binop (PLUS_EXPR, offset, this_offset);
6065             bit_offset = double_int_add (bit_offset,
6066                                          tree_to_double_int
6067                                            (DECL_FIELD_BIT_OFFSET (field)));
6068
6069             /* ??? Right now we don't do anything with DECL_OFFSET_ALIGN.  */
6070           }
6071           break;
6072
6073         case ARRAY_REF:
6074         case ARRAY_RANGE_REF:
6075           {
6076             tree index = TREE_OPERAND (exp, 1);
6077             tree low_bound = array_ref_low_bound (exp);
6078             tree unit_size = array_ref_element_size (exp);
6079
6080             /* We assume all arrays have sizes that are a multiple of a byte.
6081                First subtract the lower bound, if any, in the type of the
6082                index, then convert to sizetype and multiply by the size of
6083                the array element.  */
6084             if (! integer_zerop (low_bound))
6085               index = fold_build2 (MINUS_EXPR, TREE_TYPE (index),
6086                                    index, low_bound);
6087
6088             offset = size_binop (PLUS_EXPR, offset,
6089                                  size_binop (MULT_EXPR,
6090                                              fold_convert (sizetype, index),
6091                                              unit_size));
6092           }
6093           break;
6094
6095         case REALPART_EXPR:
6096           break;
6097
6098         case IMAGPART_EXPR:
6099           bit_offset = double_int_add (bit_offset,
6100                                        uhwi_to_double_int (*pbitsize));
6101           break;
6102
6103         case VIEW_CONVERT_EXPR:
6104           if (keep_aligning && STRICT_ALIGNMENT
6105               && (TYPE_ALIGN (TREE_TYPE (exp))
6106                > TYPE_ALIGN (TREE_TYPE (TREE_OPERAND (exp, 0))))
6107               && (TYPE_ALIGN (TREE_TYPE (TREE_OPERAND (exp, 0)))
6108                   < BIGGEST_ALIGNMENT)
6109               && (TYPE_ALIGN_OK (TREE_TYPE (exp))
6110                   || TYPE_ALIGN_OK (TREE_TYPE (TREE_OPERAND (exp, 0)))))
6111             goto done;
6112           break;
6113
6114         default:
6115           goto done;
6116         }
6117
6118       /* If any reference in the chain is volatile, the effect is volatile.  */
6119       if (TREE_THIS_VOLATILE (exp))
6120         *pvolatilep = 1;
6121
6122       exp = TREE_OPERAND (exp, 0);
6123     }
6124  done:
6125
6126   /* If OFFSET is constant, see if we can return the whole thing as a
6127      constant bit position.  Make sure to handle overflow during
6128      this conversion.  */
6129   if (host_integerp (offset, 0))
6130     {
6131       double_int tem = double_int_lshift (tree_to_double_int (offset),
6132                                           BITS_PER_UNIT == 8
6133                                           ? 3 : exact_log2 (BITS_PER_UNIT),
6134                                           HOST_BITS_PER_DOUBLE_INT, true);
6135       tem = double_int_add (tem, bit_offset);
6136       if (double_int_fits_in_shwi_p (tem))
6137         {
6138           *pbitpos = double_int_to_shwi (tem);
6139           *poffset = offset = NULL_TREE;
6140         }
6141     }
6142
6143   /* Otherwise, split it up.  */
6144   if (offset)
6145     {
6146       *pbitpos = double_int_to_shwi (bit_offset);
6147       *poffset = offset;
6148     }
6149
6150   /* We can use BLKmode for a byte-aligned BLKmode bitfield.  */
6151   if (mode == VOIDmode
6152       && blkmode_bitfield
6153       && (*pbitpos % BITS_PER_UNIT) == 0
6154       && (*pbitsize % BITS_PER_UNIT) == 0)
6155     *pmode = BLKmode;
6156   else
6157     *pmode = mode;
6158
6159   return exp;
6160 }
6161
6162 /* Given an expression EXP that may be a COMPONENT_REF, an ARRAY_REF or an
6163    ARRAY_RANGE_REF, look for whether EXP or any nested component-refs within
6164    EXP is marked as PACKED.  */
6165
6166 bool
6167 contains_packed_reference (const_tree exp)
6168 {
6169   bool packed_p = false;
6170
6171   while (1)
6172     {
6173       switch (TREE_CODE (exp))
6174         {
6175         case COMPONENT_REF:
6176           {
6177             tree field = TREE_OPERAND (exp, 1);
6178             packed_p = DECL_PACKED (field)
6179                        || TYPE_PACKED (TREE_TYPE (field))
6180                        || TYPE_PACKED (TREE_TYPE (exp));
6181             if (packed_p)
6182               goto done;
6183           }
6184           break;
6185
6186         case BIT_FIELD_REF:
6187         case ARRAY_REF:
6188         case ARRAY_RANGE_REF:
6189         case REALPART_EXPR:
6190         case IMAGPART_EXPR:
6191         case VIEW_CONVERT_EXPR:
6192           break;
6193
6194         default:
6195           goto done;
6196         }
6197       exp = TREE_OPERAND (exp, 0);
6198     }
6199  done:
6200   return packed_p;
6201 }
6202
6203 /* Return a tree of sizetype representing the size, in bytes, of the element
6204    of EXP, an ARRAY_REF or an ARRAY_RANGE_REF.  */
6205
6206 tree
6207 array_ref_element_size (tree exp)
6208 {
6209   tree aligned_size = TREE_OPERAND (exp, 3);
6210   tree elmt_type = TREE_TYPE (TREE_TYPE (TREE_OPERAND (exp, 0)));
6211   location_t loc = EXPR_LOCATION (exp);
6212
6213   /* If a size was specified in the ARRAY_REF, it's the size measured
6214      in alignment units of the element type.  So multiply by that value.  */
6215   if (aligned_size)
6216     {
6217       /* ??? tree_ssa_useless_type_conversion will eliminate casts to
6218          sizetype from another type of the same width and signedness.  */
6219       if (TREE_TYPE (aligned_size) != sizetype)
6220         aligned_size = fold_convert_loc (loc, sizetype, aligned_size);
6221       return size_binop_loc (loc, MULT_EXPR, aligned_size,
6222                              size_int (TYPE_ALIGN_UNIT (elmt_type)));
6223     }
6224
6225   /* Otherwise, take the size from that of the element type.  Substitute
6226      any PLACEHOLDER_EXPR that we have.  */
6227   else
6228     return SUBSTITUTE_PLACEHOLDER_IN_EXPR (TYPE_SIZE_UNIT (elmt_type), exp);
6229 }
6230
6231 /* Return a tree representing the lower bound of the array mentioned in
6232    EXP, an ARRAY_REF or an ARRAY_RANGE_REF.  */
6233
6234 tree
6235 array_ref_low_bound (tree exp)
6236 {
6237   tree domain_type = TYPE_DOMAIN (TREE_TYPE (TREE_OPERAND (exp, 0)));
6238
6239   /* If a lower bound is specified in EXP, use it.  */
6240   if (TREE_OPERAND (exp, 2))
6241     return TREE_OPERAND (exp, 2);
6242
6243   /* Otherwise, if there is a domain type and it has a lower bound, use it,
6244      substituting for a PLACEHOLDER_EXPR as needed.  */
6245   if (domain_type && TYPE_MIN_VALUE (domain_type))
6246     return SUBSTITUTE_PLACEHOLDER_IN_EXPR (TYPE_MIN_VALUE (domain_type), exp);
6247
6248   /* Otherwise, return a zero of the appropriate type.  */
6249   return build_int_cst (TREE_TYPE (TREE_OPERAND (exp, 1)), 0);
6250 }
6251
6252 /* Return a tree representing the upper bound of the array mentioned in
6253    EXP, an ARRAY_REF or an ARRAY_RANGE_REF.  */
6254
6255 tree
6256 array_ref_up_bound (tree exp)
6257 {
6258   tree domain_type = TYPE_DOMAIN (TREE_TYPE (TREE_OPERAND (exp, 0)));
6259
6260   /* If there is a domain type and it has an upper bound, use it, substituting
6261      for a PLACEHOLDER_EXPR as needed.  */
6262   if (domain_type && TYPE_MAX_VALUE (domain_type))
6263     return SUBSTITUTE_PLACEHOLDER_IN_EXPR (TYPE_MAX_VALUE (domain_type), exp);
6264
6265   /* Otherwise fail.  */
6266   return NULL_TREE;
6267 }
6268
6269 /* Return a tree representing the offset, in bytes, of the field referenced
6270    by EXP.  This does not include any offset in DECL_FIELD_BIT_OFFSET.  */
6271
6272 tree
6273 component_ref_field_offset (tree exp)
6274 {
6275   tree aligned_offset = TREE_OPERAND (exp, 2);
6276   tree field = TREE_OPERAND (exp, 1);
6277   location_t loc = EXPR_LOCATION (exp);
6278
6279   /* If an offset was specified in the COMPONENT_REF, it's the offset measured
6280      in units of DECL_OFFSET_ALIGN / BITS_PER_UNIT.  So multiply by that
6281      value.  */
6282   if (aligned_offset)
6283     {
6284       /* ??? tree_ssa_useless_type_conversion will eliminate casts to
6285          sizetype from another type of the same width and signedness.  */
6286       if (TREE_TYPE (aligned_offset) != sizetype)
6287         aligned_offset = fold_convert_loc (loc, sizetype, aligned_offset);
6288       return size_binop_loc (loc, MULT_EXPR, aligned_offset,
6289                              size_int (DECL_OFFSET_ALIGN (field)
6290                                        / BITS_PER_UNIT));
6291     }
6292
6293   /* Otherwise, take the offset from that of the field.  Substitute
6294      any PLACEHOLDER_EXPR that we have.  */
6295   else
6296     return SUBSTITUTE_PLACEHOLDER_IN_EXPR (DECL_FIELD_OFFSET (field), exp);
6297 }
6298
6299 /* Alignment in bits the TARGET of an assignment may be assumed to have.  */
6300
6301 static unsigned HOST_WIDE_INT
6302 target_align (const_tree target)
6303 {
6304   /* We might have a chain of nested references with intermediate misaligning
6305      bitfields components, so need to recurse to find out.  */
6306
6307   unsigned HOST_WIDE_INT this_align, outer_align;
6308
6309   switch (TREE_CODE (target))
6310     {
6311     case BIT_FIELD_REF:
6312       return 1;
6313
6314     case COMPONENT_REF:
6315       this_align = DECL_ALIGN (TREE_OPERAND (target, 1));
6316       outer_align = target_align (TREE_OPERAND (target, 0));
6317       return MIN (this_align, outer_align);
6318
6319     case ARRAY_REF:
6320     case ARRAY_RANGE_REF:
6321       this_align = TYPE_ALIGN (TREE_TYPE (target));
6322       outer_align = target_align (TREE_OPERAND (target, 0));
6323       return MIN (this_align, outer_align);
6324
6325     CASE_CONVERT:
6326     case NON_LVALUE_EXPR:
6327     case VIEW_CONVERT_EXPR:
6328       this_align = TYPE_ALIGN (TREE_TYPE (target));
6329       outer_align = target_align (TREE_OPERAND (target, 0));
6330       return MAX (this_align, outer_align);
6331
6332     default:
6333       return TYPE_ALIGN (TREE_TYPE (target));
6334     }
6335 }
6336
6337 \f
6338 /* Given an rtx VALUE that may contain additions and multiplications, return
6339    an equivalent value that just refers to a register, memory, or constant.
6340    This is done by generating instructions to perform the arithmetic and
6341    returning a pseudo-register containing the value.
6342
6343    The returned value may be a REG, SUBREG, MEM or constant.  */
6344
6345 rtx
6346 force_operand (rtx value, rtx target)
6347 {
6348   rtx op1, op2;
6349   /* Use subtarget as the target for operand 0 of a binary operation.  */
6350   rtx subtarget = get_subtarget (target);
6351   enum rtx_code code = GET_CODE (value);
6352
6353   /* Check for subreg applied to an expression produced by loop optimizer.  */
6354   if (code == SUBREG
6355       && !REG_P (SUBREG_REG (value))
6356       && !MEM_P (SUBREG_REG (value)))
6357     {
6358       value
6359         = simplify_gen_subreg (GET_MODE (value),
6360                                force_reg (GET_MODE (SUBREG_REG (value)),
6361                                           force_operand (SUBREG_REG (value),
6362                                                          NULL_RTX)),
6363                                GET_MODE (SUBREG_REG (value)),
6364                                SUBREG_BYTE (value));
6365       code = GET_CODE (value);
6366     }
6367
6368   /* Check for a PIC address load.  */
6369   if ((code == PLUS || code == MINUS)
6370       && XEXP (value, 0) == pic_offset_table_rtx
6371       && (GET_CODE (XEXP (value, 1)) == SYMBOL_REF
6372           || GET_CODE (XEXP (value, 1)) == LABEL_REF
6373           || GET_CODE (XEXP (value, 1)) == CONST))
6374     {
6375       if (!subtarget)
6376         subtarget = gen_reg_rtx (GET_MODE (value));
6377       emit_move_insn (subtarget, value);
6378       return subtarget;
6379     }
6380
6381   if (ARITHMETIC_P (value))
6382     {
6383       op2 = XEXP (value, 1);
6384       if (!CONSTANT_P (op2) && !(REG_P (op2) && op2 != subtarget))
6385         subtarget = 0;
6386       if (code == MINUS && CONST_INT_P (op2))
6387         {
6388           code = PLUS;
6389           op2 = negate_rtx (GET_MODE (value), op2);
6390         }
6391
6392       /* Check for an addition with OP2 a constant integer and our first
6393          operand a PLUS of a virtual register and something else.  In that
6394          case, we want to emit the sum of the virtual register and the
6395          constant first and then add the other value.  This allows virtual
6396          register instantiation to simply modify the constant rather than
6397          creating another one around this addition.  */
6398       if (code == PLUS && CONST_INT_P (op2)
6399           && GET_CODE (XEXP (value, 0)) == PLUS
6400           && REG_P (XEXP (XEXP (value, 0), 0))
6401           && REGNO (XEXP (XEXP (value, 0), 0)) >= FIRST_VIRTUAL_REGISTER
6402           && REGNO (XEXP (XEXP (value, 0), 0)) <= LAST_VIRTUAL_REGISTER)
6403         {
6404           rtx temp = expand_simple_binop (GET_MODE (value), code,
6405                                           XEXP (XEXP (value, 0), 0), op2,
6406                                           subtarget, 0, OPTAB_LIB_WIDEN);
6407           return expand_simple_binop (GET_MODE (value), code, temp,
6408                                       force_operand (XEXP (XEXP (value,
6409                                                                  0), 1), 0),
6410                                       target, 0, OPTAB_LIB_WIDEN);
6411         }
6412
6413       op1 = force_operand (XEXP (value, 0), subtarget);
6414       op2 = force_operand (op2, NULL_RTX);
6415       switch (code)
6416         {
6417         case MULT:
6418           return expand_mult (GET_MODE (value), op1, op2, target, 1);
6419         case DIV:
6420           if (!INTEGRAL_MODE_P (GET_MODE (value)))
6421             return expand_simple_binop (GET_MODE (value), code, op1, op2,
6422                                         target, 1, OPTAB_LIB_WIDEN);
6423           else
6424             return expand_divmod (0,
6425                                   FLOAT_MODE_P (GET_MODE (value))
6426                                   ? RDIV_EXPR : TRUNC_DIV_EXPR,
6427                                   GET_MODE (value), op1, op2, target, 0);
6428         case MOD:
6429           return expand_divmod (1, TRUNC_MOD_EXPR, GET_MODE (value), op1, op2,
6430                                 target, 0);
6431         case UDIV:
6432           return expand_divmod (0, TRUNC_DIV_EXPR, GET_MODE (value), op1, op2,
6433                                 target, 1);
6434         case UMOD:
6435           return expand_divmod (1, TRUNC_MOD_EXPR, GET_MODE (value), op1, op2,
6436                                 target, 1);
6437         case ASHIFTRT:
6438           return expand_simple_binop (GET_MODE (value), code, op1, op2,
6439                                       target, 0, OPTAB_LIB_WIDEN);
6440         default:
6441           return expand_simple_binop (GET_MODE (value), code, op1, op2,
6442                                       target, 1, OPTAB_LIB_WIDEN);
6443         }
6444     }
6445   if (UNARY_P (value))
6446     {
6447       if (!target)
6448         target = gen_reg_rtx (GET_MODE (value));
6449       op1 = force_operand (XEXP (value, 0), NULL_RTX);
6450       switch (code)
6451         {
6452         case ZERO_EXTEND:
6453         case SIGN_EXTEND:
6454         case TRUNCATE:
6455         case FLOAT_EXTEND:
6456         case FLOAT_TRUNCATE:
6457           convert_move (target, op1, code == ZERO_EXTEND);
6458           return target;
6459
6460         case FIX:
6461         case UNSIGNED_FIX:
6462           expand_fix (target, op1, code == UNSIGNED_FIX);
6463           return target;
6464
6465         case FLOAT:
6466         case UNSIGNED_FLOAT:
6467           expand_float (target, op1, code == UNSIGNED_FLOAT);
6468           return target;
6469
6470         default:
6471           return expand_simple_unop (GET_MODE (value), code, op1, target, 0);
6472         }
6473     }
6474
6475 #ifdef INSN_SCHEDULING
6476   /* On machines that have insn scheduling, we want all memory reference to be
6477      explicit, so we need to deal with such paradoxical SUBREGs.  */
6478   if (GET_CODE (value) == SUBREG && MEM_P (SUBREG_REG (value))
6479       && (GET_MODE_SIZE (GET_MODE (value))
6480           > GET_MODE_SIZE (GET_MODE (SUBREG_REG (value)))))
6481     value
6482       = simplify_gen_subreg (GET_MODE (value),
6483                              force_reg (GET_MODE (SUBREG_REG (value)),
6484                                         force_operand (SUBREG_REG (value),
6485                                                        NULL_RTX)),
6486                              GET_MODE (SUBREG_REG (value)),
6487                              SUBREG_BYTE (value));
6488 #endif
6489
6490   return value;
6491 }
6492 \f
6493 /* Subroutine of expand_expr: return nonzero iff there is no way that
6494    EXP can reference X, which is being modified.  TOP_P is nonzero if this
6495    call is going to be used to determine whether we need a temporary
6496    for EXP, as opposed to a recursive call to this function.
6497
6498    It is always safe for this routine to return zero since it merely
6499    searches for optimization opportunities.  */
6500
6501 int
6502 safe_from_p (const_rtx x, tree exp, int top_p)
6503 {
6504   rtx exp_rtl = 0;
6505   int i, nops;
6506
6507   if (x == 0
6508       /* If EXP has varying size, we MUST use a target since we currently
6509          have no way of allocating temporaries of variable size
6510          (except for arrays that have TYPE_ARRAY_MAX_SIZE set).
6511          So we assume here that something at a higher level has prevented a
6512          clash.  This is somewhat bogus, but the best we can do.  Only
6513          do this when X is BLKmode and when we are at the top level.  */
6514       || (top_p && TREE_TYPE (exp) != 0 && COMPLETE_TYPE_P (TREE_TYPE (exp))
6515           && TREE_CODE (TYPE_SIZE (TREE_TYPE (exp))) != INTEGER_CST
6516           && (TREE_CODE (TREE_TYPE (exp)) != ARRAY_TYPE
6517               || TYPE_ARRAY_MAX_SIZE (TREE_TYPE (exp)) == NULL_TREE
6518               || TREE_CODE (TYPE_ARRAY_MAX_SIZE (TREE_TYPE (exp)))
6519               != INTEGER_CST)
6520           && GET_MODE (x) == BLKmode)
6521       /* If X is in the outgoing argument area, it is always safe.  */
6522       || (MEM_P (x)
6523           && (XEXP (x, 0) == virtual_outgoing_args_rtx
6524               || (GET_CODE (XEXP (x, 0)) == PLUS
6525                   && XEXP (XEXP (x, 0), 0) == virtual_outgoing_args_rtx))))
6526     return 1;
6527
6528   /* If this is a subreg of a hard register, declare it unsafe, otherwise,
6529      find the underlying pseudo.  */
6530   if (GET_CODE (x) == SUBREG)
6531     {
6532       x = SUBREG_REG (x);
6533       if (REG_P (x) && REGNO (x) < FIRST_PSEUDO_REGISTER)
6534         return 0;
6535     }
6536
6537   /* Now look at our tree code and possibly recurse.  */
6538   switch (TREE_CODE_CLASS (TREE_CODE (exp)))
6539     {
6540     case tcc_declaration:
6541       exp_rtl = DECL_RTL_IF_SET (exp);
6542       break;
6543
6544     case tcc_constant:
6545       return 1;
6546
6547     case tcc_exceptional:
6548       if (TREE_CODE (exp) == TREE_LIST)
6549         {
6550           while (1)
6551             {
6552               if (TREE_VALUE (exp) && !safe_from_p (x, TREE_VALUE (exp), 0))
6553                 return 0;
6554               exp = TREE_CHAIN (exp);
6555               if (!exp)
6556                 return 1;
6557               if (TREE_CODE (exp) != TREE_LIST)
6558                 return safe_from_p (x, exp, 0);
6559             }
6560         }
6561       else if (TREE_CODE (exp) == CONSTRUCTOR)
6562         {
6563           constructor_elt *ce;
6564           unsigned HOST_WIDE_INT idx;
6565
6566           for (idx = 0;
6567                VEC_iterate (constructor_elt, CONSTRUCTOR_ELTS (exp), idx, ce);
6568                idx++)
6569             if ((ce->index != NULL_TREE && !safe_from_p (x, ce->index, 0))
6570                 || !safe_from_p (x, ce->value, 0))
6571               return 0;
6572           return 1;
6573         }
6574       else if (TREE_CODE (exp) == ERROR_MARK)
6575         return 1;       /* An already-visited SAVE_EXPR? */
6576       else
6577         return 0;
6578
6579     case tcc_statement:
6580       /* The only case we look at here is the DECL_INITIAL inside a
6581          DECL_EXPR.  */
6582       return (TREE_CODE (exp) != DECL_EXPR
6583               || TREE_CODE (DECL_EXPR_DECL (exp)) != VAR_DECL
6584               || !DECL_INITIAL (DECL_EXPR_DECL (exp))
6585               || safe_from_p (x, DECL_INITIAL (DECL_EXPR_DECL (exp)), 0));
6586
6587     case tcc_binary:
6588     case tcc_comparison:
6589       if (!safe_from_p (x, TREE_OPERAND (exp, 1), 0))
6590         return 0;
6591       /* Fall through.  */
6592
6593     case tcc_unary:
6594       return safe_from_p (x, TREE_OPERAND (exp, 0), 0);
6595
6596     case tcc_expression:
6597     case tcc_reference:
6598     case tcc_vl_exp:
6599       /* Now do code-specific tests.  EXP_RTL is set to any rtx we find in
6600          the expression.  If it is set, we conflict iff we are that rtx or
6601          both are in memory.  Otherwise, we check all operands of the
6602          expression recursively.  */
6603
6604       switch (TREE_CODE (exp))
6605         {
6606         case ADDR_EXPR:
6607           /* If the operand is static or we are static, we can't conflict.
6608              Likewise if we don't conflict with the operand at all.  */
6609           if (staticp (TREE_OPERAND (exp, 0))
6610               || TREE_STATIC (exp)
6611               || safe_from_p (x, TREE_OPERAND (exp, 0), 0))
6612             return 1;
6613
6614           /* Otherwise, the only way this can conflict is if we are taking
6615              the address of a DECL a that address if part of X, which is
6616              very rare.  */
6617           exp = TREE_OPERAND (exp, 0);
6618           if (DECL_P (exp))
6619             {
6620               if (!DECL_RTL_SET_P (exp)
6621                   || !MEM_P (DECL_RTL (exp)))
6622                 return 0;
6623               else
6624                 exp_rtl = XEXP (DECL_RTL (exp), 0);
6625             }
6626           break;
6627
6628         case MISALIGNED_INDIRECT_REF:
6629         case ALIGN_INDIRECT_REF:
6630         case INDIRECT_REF:
6631           if (MEM_P (x)
6632               && alias_sets_conflict_p (MEM_ALIAS_SET (x),
6633                                         get_alias_set (exp)))
6634             return 0;
6635           break;
6636
6637         case CALL_EXPR:
6638           /* Assume that the call will clobber all hard registers and
6639              all of memory.  */
6640           if ((REG_P (x) && REGNO (x) < FIRST_PSEUDO_REGISTER)
6641               || MEM_P (x))
6642             return 0;
6643           break;
6644
6645         case WITH_CLEANUP_EXPR:
6646         case CLEANUP_POINT_EXPR:
6647           /* Lowered by gimplify.c.  */
6648           gcc_unreachable ();
6649
6650         case SAVE_EXPR:
6651           return safe_from_p (x, TREE_OPERAND (exp, 0), 0);
6652
6653         default:
6654           break;
6655         }
6656
6657       /* If we have an rtx, we do not need to scan our operands.  */
6658       if (exp_rtl)
6659         break;
6660
6661       nops = TREE_OPERAND_LENGTH (exp);
6662       for (i = 0; i < nops; i++)
6663         if (TREE_OPERAND (exp, i) != 0
6664             && ! safe_from_p (x, TREE_OPERAND (exp, i), 0))
6665           return 0;
6666
6667       break;
6668
6669     case tcc_type:
6670       /* Should never get a type here.  */
6671       gcc_unreachable ();
6672     }
6673
6674   /* If we have an rtl, find any enclosed object.  Then see if we conflict
6675      with it.  */
6676   if (exp_rtl)
6677     {
6678       if (GET_CODE (exp_rtl) == SUBREG)
6679         {
6680           exp_rtl = SUBREG_REG (exp_rtl);
6681           if (REG_P (exp_rtl)
6682               && REGNO (exp_rtl) < FIRST_PSEUDO_REGISTER)
6683             return 0;
6684         }
6685
6686       /* If the rtl is X, then it is not safe.  Otherwise, it is unless both
6687          are memory and they conflict.  */
6688       return ! (rtx_equal_p (x, exp_rtl)
6689                 || (MEM_P (x) && MEM_P (exp_rtl)
6690                     && true_dependence (exp_rtl, VOIDmode, x,
6691                                         rtx_addr_varies_p)));
6692     }
6693
6694   /* If we reach here, it is safe.  */
6695   return 1;
6696 }
6697
6698 \f
6699 /* Return the highest power of two that EXP is known to be a multiple of.
6700    This is used in updating alignment of MEMs in array references.  */
6701
6702 unsigned HOST_WIDE_INT
6703 highest_pow2_factor (const_tree exp)
6704 {
6705   unsigned HOST_WIDE_INT c0, c1;
6706
6707   switch (TREE_CODE (exp))
6708     {
6709     case INTEGER_CST:
6710       /* We can find the lowest bit that's a one.  If the low
6711          HOST_BITS_PER_WIDE_INT bits are zero, return BIGGEST_ALIGNMENT.
6712          We need to handle this case since we can find it in a COND_EXPR,
6713          a MIN_EXPR, or a MAX_EXPR.  If the constant overflows, we have an
6714          erroneous program, so return BIGGEST_ALIGNMENT to avoid any
6715          later ICE.  */
6716       if (TREE_OVERFLOW (exp))
6717         return BIGGEST_ALIGNMENT;
6718       else
6719         {
6720           /* Note: tree_low_cst is intentionally not used here,
6721              we don't care about the upper bits.  */
6722           c0 = TREE_INT_CST_LOW (exp);
6723           c0 &= -c0;
6724           return c0 ? c0 : BIGGEST_ALIGNMENT;
6725         }
6726       break;
6727
6728     case PLUS_EXPR:  case MINUS_EXPR:  case MIN_EXPR:  case MAX_EXPR:
6729       c0 = highest_pow2_factor (TREE_OPERAND (exp, 0));
6730       c1 = highest_pow2_factor (TREE_OPERAND (exp, 1));
6731       return MIN (c0, c1);
6732
6733     case MULT_EXPR:
6734       c0 = highest_pow2_factor (TREE_OPERAND (exp, 0));
6735       c1 = highest_pow2_factor (TREE_OPERAND (exp, 1));
6736       return c0 * c1;
6737
6738     case ROUND_DIV_EXPR:  case TRUNC_DIV_EXPR:  case FLOOR_DIV_EXPR:
6739     case CEIL_DIV_EXPR:
6740       if (integer_pow2p (TREE_OPERAND (exp, 1))
6741           && host_integerp (TREE_OPERAND (exp, 1), 1))
6742         {
6743           c0 = highest_pow2_factor (TREE_OPERAND (exp, 0));
6744           c1 = tree_low_cst (TREE_OPERAND (exp, 1), 1);
6745           return MAX (1, c0 / c1);
6746         }
6747       break;
6748
6749     case BIT_AND_EXPR:
6750       /* The highest power of two of a bit-and expression is the maximum of
6751          that of its operands.  We typically get here for a complex LHS and
6752          a constant negative power of two on the RHS to force an explicit
6753          alignment, so don't bother looking at the LHS.  */
6754       return highest_pow2_factor (TREE_OPERAND (exp, 1));
6755
6756     CASE_CONVERT:
6757     case SAVE_EXPR:
6758       return highest_pow2_factor (TREE_OPERAND (exp, 0));
6759
6760     case COMPOUND_EXPR:
6761       return highest_pow2_factor (TREE_OPERAND (exp, 1));
6762
6763     case COND_EXPR:
6764       c0 = highest_pow2_factor (TREE_OPERAND (exp, 1));
6765       c1 = highest_pow2_factor (TREE_OPERAND (exp, 2));
6766       return MIN (c0, c1);
6767
6768     default:
6769       break;
6770     }
6771
6772   return 1;
6773 }
6774
6775 /* Similar, except that the alignment requirements of TARGET are
6776    taken into account.  Assume it is at least as aligned as its
6777    type, unless it is a COMPONENT_REF in which case the layout of
6778    the structure gives the alignment.  */
6779
6780 static unsigned HOST_WIDE_INT
6781 highest_pow2_factor_for_target (const_tree target, const_tree exp)
6782 {
6783   unsigned HOST_WIDE_INT talign = target_align (target) / BITS_PER_UNIT;
6784   unsigned HOST_WIDE_INT factor = highest_pow2_factor (exp);
6785
6786   return MAX (factor, talign);
6787 }
6788 \f
6789 /* Return &VAR expression for emulated thread local VAR.  */
6790
6791 static tree
6792 emutls_var_address (tree var)
6793 {
6794   tree emuvar = emutls_decl (var);
6795   tree fn = built_in_decls [BUILT_IN_EMUTLS_GET_ADDRESS];
6796   tree arg = build_fold_addr_expr_with_type (emuvar, ptr_type_node);
6797   tree arglist = build_tree_list (NULL_TREE, arg);
6798   tree call = build_function_call_expr (UNKNOWN_LOCATION, fn, arglist);
6799   return fold_convert (build_pointer_type (TREE_TYPE (var)), call);
6800 }
6801 \f
6802
6803 /* Subroutine of expand_expr.  Expand the two operands of a binary
6804    expression EXP0 and EXP1 placing the results in OP0 and OP1.
6805    The value may be stored in TARGET if TARGET is nonzero.  The
6806    MODIFIER argument is as documented by expand_expr.  */
6807
6808 static void
6809 expand_operands (tree exp0, tree exp1, rtx target, rtx *op0, rtx *op1,
6810                  enum expand_modifier modifier)
6811 {
6812   if (! safe_from_p (target, exp1, 1))
6813     target = 0;
6814   if (operand_equal_p (exp0, exp1, 0))
6815     {
6816       *op0 = expand_expr (exp0, target, VOIDmode, modifier);
6817       *op1 = copy_rtx (*op0);
6818     }
6819   else
6820     {
6821       /* If we need to preserve evaluation order, copy exp0 into its own
6822          temporary variable so that it can't be clobbered by exp1.  */
6823       if (flag_evaluation_order && TREE_SIDE_EFFECTS (exp1))
6824         exp0 = save_expr (exp0);
6825       *op0 = expand_expr (exp0, target, VOIDmode, modifier);
6826       *op1 = expand_expr (exp1, NULL_RTX, VOIDmode, modifier);
6827     }
6828 }
6829
6830 \f
6831 /* Return a MEM that contains constant EXP.  DEFER is as for
6832    output_constant_def and MODIFIER is as for expand_expr.  */
6833
6834 static rtx
6835 expand_expr_constant (tree exp, int defer, enum expand_modifier modifier)
6836 {
6837   rtx mem;
6838
6839   mem = output_constant_def (exp, defer);
6840   if (modifier != EXPAND_INITIALIZER)
6841     mem = use_anchored_address (mem);
6842   return mem;
6843 }
6844
6845 /* A subroutine of expand_expr_addr_expr.  Evaluate the address of EXP.
6846    The TARGET, TMODE and MODIFIER arguments are as for expand_expr.  */
6847
6848 static rtx
6849 expand_expr_addr_expr_1 (tree exp, rtx target, enum machine_mode tmode,
6850                          enum expand_modifier modifier, addr_space_t as)
6851 {
6852   rtx result, subtarget;
6853   tree inner, offset;
6854   HOST_WIDE_INT bitsize, bitpos;
6855   int volatilep, unsignedp;
6856   enum machine_mode mode1;
6857
6858   /* If we are taking the address of a constant and are at the top level,
6859      we have to use output_constant_def since we can't call force_const_mem
6860      at top level.  */
6861   /* ??? This should be considered a front-end bug.  We should not be
6862      generating ADDR_EXPR of something that isn't an LVALUE.  The only
6863      exception here is STRING_CST.  */
6864   if (CONSTANT_CLASS_P (exp))
6865     return XEXP (expand_expr_constant (exp, 0, modifier), 0);
6866
6867   /* Everything must be something allowed by is_gimple_addressable.  */
6868   switch (TREE_CODE (exp))
6869     {
6870     case INDIRECT_REF:
6871       /* This case will happen via recursion for &a->b.  */
6872       return expand_expr (TREE_OPERAND (exp, 0), target, tmode, modifier);
6873
6874     case CONST_DECL:
6875       /* Expand the initializer like constants above.  */
6876       return XEXP (expand_expr_constant (DECL_INITIAL (exp), 0, modifier), 0);
6877
6878     case REALPART_EXPR:
6879       /* The real part of the complex number is always first, therefore
6880          the address is the same as the address of the parent object.  */
6881       offset = 0;
6882       bitpos = 0;
6883       inner = TREE_OPERAND (exp, 0);
6884       break;
6885
6886     case IMAGPART_EXPR:
6887       /* The imaginary part of the complex number is always second.
6888          The expression is therefore always offset by the size of the
6889          scalar type.  */
6890       offset = 0;
6891       bitpos = GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (exp)));
6892       inner = TREE_OPERAND (exp, 0);
6893       break;
6894
6895     case VAR_DECL:
6896       /* TLS emulation hook - replace __thread VAR's &VAR with
6897          __emutls_get_address (&_emutls.VAR).  */
6898       if (! targetm.have_tls
6899           && TREE_CODE (exp) == VAR_DECL
6900           && DECL_THREAD_LOCAL_P (exp))
6901         {
6902           exp = emutls_var_address (exp);
6903           return expand_expr (exp, target, tmode, modifier);
6904         }
6905       /* Fall through.  */
6906
6907     default:
6908       /* If the object is a DECL, then expand it for its rtl.  Don't bypass
6909          expand_expr, as that can have various side effects; LABEL_DECLs for
6910          example, may not have their DECL_RTL set yet.  Expand the rtl of
6911          CONSTRUCTORs too, which should yield a memory reference for the
6912          constructor's contents.  Assume language specific tree nodes can
6913          be expanded in some interesting way.  */
6914       gcc_assert (TREE_CODE (exp) < LAST_AND_UNUSED_TREE_CODE);
6915       if (DECL_P (exp)
6916           || TREE_CODE (exp) == CONSTRUCTOR
6917           || TREE_CODE (exp) == COMPOUND_LITERAL_EXPR)
6918         {
6919           result = expand_expr (exp, target, tmode,
6920                                 modifier == EXPAND_INITIALIZER
6921                                 ? EXPAND_INITIALIZER : EXPAND_CONST_ADDRESS);
6922
6923           /* If the DECL isn't in memory, then the DECL wasn't properly
6924              marked TREE_ADDRESSABLE, which will be either a front-end
6925              or a tree optimizer bug.  */
6926           gcc_assert (MEM_P (result));
6927           result = XEXP (result, 0);
6928
6929           /* ??? Is this needed anymore?  */
6930           if (DECL_P (exp) && !TREE_USED (exp) == 0)
6931             {
6932               assemble_external (exp);
6933               TREE_USED (exp) = 1;
6934             }
6935
6936           if (modifier != EXPAND_INITIALIZER
6937               && modifier != EXPAND_CONST_ADDRESS)
6938             result = force_operand (result, target);
6939           return result;
6940         }
6941
6942       /* Pass FALSE as the last argument to get_inner_reference although
6943          we are expanding to RTL.  The rationale is that we know how to
6944          handle "aligning nodes" here: we can just bypass them because
6945          they won't change the final object whose address will be returned
6946          (they actually exist only for that purpose).  */
6947       inner = get_inner_reference (exp, &bitsize, &bitpos, &offset,
6948                                    &mode1, &unsignedp, &volatilep, false);
6949       break;
6950     }
6951
6952   /* We must have made progress.  */
6953   gcc_assert (inner != exp);
6954
6955   subtarget = offset || bitpos ? NULL_RTX : target;
6956   /* For VIEW_CONVERT_EXPR, where the outer alignment is bigger than
6957      inner alignment, force the inner to be sufficiently aligned.  */
6958   if (CONSTANT_CLASS_P (inner)
6959       && TYPE_ALIGN (TREE_TYPE (inner)) < TYPE_ALIGN (TREE_TYPE (exp)))
6960     {
6961       inner = copy_node (inner);
6962       TREE_TYPE (inner) = copy_node (TREE_TYPE (inner));
6963       TYPE_ALIGN (TREE_TYPE (inner)) = TYPE_ALIGN (TREE_TYPE (exp));
6964       TYPE_USER_ALIGN (TREE_TYPE (inner)) = 1;
6965     }
6966   result = expand_expr_addr_expr_1 (inner, subtarget, tmode, modifier, as);
6967
6968   if (offset)
6969     {
6970       rtx tmp;
6971
6972       if (modifier != EXPAND_NORMAL)
6973         result = force_operand (result, NULL);
6974       tmp = expand_expr (offset, NULL_RTX, tmode,
6975                          modifier == EXPAND_INITIALIZER
6976                           ? EXPAND_INITIALIZER : EXPAND_NORMAL);
6977
6978       result = convert_memory_address_addr_space (tmode, result, as);
6979       tmp = convert_memory_address_addr_space (tmode, tmp, as);
6980
6981       if (modifier == EXPAND_SUM || modifier == EXPAND_INITIALIZER)
6982         result = gen_rtx_PLUS (tmode, result, tmp);
6983       else
6984         {
6985           subtarget = bitpos ? NULL_RTX : target;
6986           result = expand_simple_binop (tmode, PLUS, result, tmp, subtarget,
6987                                         1, OPTAB_LIB_WIDEN);
6988         }
6989     }
6990
6991   if (bitpos)
6992     {
6993       /* Someone beforehand should have rejected taking the address
6994          of such an object.  */
6995       gcc_assert ((bitpos % BITS_PER_UNIT) == 0);
6996
6997       result = plus_constant (result, bitpos / BITS_PER_UNIT);
6998       if (modifier < EXPAND_SUM)
6999         result = force_operand (result, target);
7000     }
7001
7002   return result;
7003 }
7004
7005 /* A subroutine of expand_expr.  Evaluate EXP, which is an ADDR_EXPR.
7006    The TARGET, TMODE and MODIFIER arguments are as for expand_expr.  */
7007
7008 static rtx
7009 expand_expr_addr_expr (tree exp, rtx target, enum machine_mode tmode,
7010                        enum expand_modifier modifier)
7011 {
7012   addr_space_t as = ADDR_SPACE_GENERIC;
7013   enum machine_mode address_mode = Pmode;
7014   enum machine_mode pointer_mode = ptr_mode;
7015   enum machine_mode rmode;
7016   rtx result;
7017
7018   /* Target mode of VOIDmode says "whatever's natural".  */
7019   if (tmode == VOIDmode)
7020     tmode = TYPE_MODE (TREE_TYPE (exp));
7021
7022   if (POINTER_TYPE_P (TREE_TYPE (exp)))
7023     {
7024       as = TYPE_ADDR_SPACE (TREE_TYPE (TREE_TYPE (exp)));
7025       address_mode = targetm.addr_space.address_mode (as);
7026       pointer_mode = targetm.addr_space.pointer_mode (as);
7027     }
7028
7029   /* We can get called with some Weird Things if the user does silliness
7030      like "(short) &a".  In that case, convert_memory_address won't do
7031      the right thing, so ignore the given target mode.  */
7032   if (tmode != address_mode && tmode != pointer_mode)
7033     tmode = address_mode;
7034
7035   result = expand_expr_addr_expr_1 (TREE_OPERAND (exp, 0), target,
7036                                     tmode, modifier, as);
7037
7038   /* Despite expand_expr claims concerning ignoring TMODE when not
7039      strictly convenient, stuff breaks if we don't honor it.  Note
7040      that combined with the above, we only do this for pointer modes.  */
7041   rmode = GET_MODE (result);
7042   if (rmode == VOIDmode)
7043     rmode = tmode;
7044   if (rmode != tmode)
7045     result = convert_memory_address_addr_space (tmode, result, as);
7046
7047   return result;
7048 }
7049
7050 /* Generate code for computing CONSTRUCTOR EXP.
7051    An rtx for the computed value is returned.  If AVOID_TEMP_MEM
7052    is TRUE, instead of creating a temporary variable in memory
7053    NULL is returned and the caller needs to handle it differently.  */
7054
7055 static rtx
7056 expand_constructor (tree exp, rtx target, enum expand_modifier modifier,
7057                     bool avoid_temp_mem)
7058 {
7059   tree type = TREE_TYPE (exp);
7060   enum machine_mode mode = TYPE_MODE (type);
7061
7062   /* Try to avoid creating a temporary at all.  This is possible
7063      if all of the initializer is zero.
7064      FIXME: try to handle all [0..255] initializers we can handle
7065      with memset.  */
7066   if (TREE_STATIC (exp)
7067       && !TREE_ADDRESSABLE (exp)
7068       && target != 0 && mode == BLKmode
7069       && all_zeros_p (exp))
7070     {
7071       clear_storage (target, expr_size (exp), BLOCK_OP_NORMAL);
7072       return target;
7073     }
7074
7075   /* All elts simple constants => refer to a constant in memory.  But
7076      if this is a non-BLKmode mode, let it store a field at a time
7077      since that should make a CONST_INT or CONST_DOUBLE when we
7078      fold.  Likewise, if we have a target we can use, it is best to
7079      store directly into the target unless the type is large enough
7080      that memcpy will be used.  If we are making an initializer and
7081      all operands are constant, put it in memory as well.
7082
7083      FIXME: Avoid trying to fill vector constructors piece-meal.
7084      Output them with output_constant_def below unless we're sure
7085      they're zeros.  This should go away when vector initializers
7086      are treated like VECTOR_CST instead of arrays.  */
7087   if ((TREE_STATIC (exp)
7088        && ((mode == BLKmode
7089             && ! (target != 0 && safe_from_p (target, exp, 1)))
7090                   || TREE_ADDRESSABLE (exp)
7091                   || (host_integerp (TYPE_SIZE_UNIT (type), 1)
7092                       && (! MOVE_BY_PIECES_P
7093                                      (tree_low_cst (TYPE_SIZE_UNIT (type), 1),
7094                                       TYPE_ALIGN (type)))
7095                       && ! mostly_zeros_p (exp))))
7096       || ((modifier == EXPAND_INITIALIZER || modifier == EXPAND_CONST_ADDRESS)
7097           && TREE_CONSTANT (exp)))
7098     {
7099       rtx constructor;
7100
7101       if (avoid_temp_mem)
7102         return NULL_RTX;
7103
7104       constructor = expand_expr_constant (exp, 1, modifier);
7105
7106       if (modifier != EXPAND_CONST_ADDRESS
7107           && modifier != EXPAND_INITIALIZER
7108           && modifier != EXPAND_SUM)
7109         constructor = validize_mem (constructor);
7110
7111       return constructor;
7112     }
7113
7114   /* Handle calls that pass values in multiple non-contiguous
7115      locations.  The Irix 6 ABI has examples of this.  */
7116   if (target == 0 || ! safe_from_p (target, exp, 1)
7117       || GET_CODE (target) == PARALLEL || modifier == EXPAND_STACK_PARM)
7118     {
7119       if (avoid_temp_mem)
7120         return NULL_RTX;
7121
7122       target
7123         = assign_temp (build_qualified_type (type, (TYPE_QUALS (type)
7124                                                     | (TREE_READONLY (exp)
7125                                                        * TYPE_QUAL_CONST))),
7126                        0, TREE_ADDRESSABLE (exp), 1);
7127     }
7128
7129   store_constructor (exp, target, 0, int_expr_size (exp));
7130   return target;
7131 }
7132
7133
7134 /* expand_expr: generate code for computing expression EXP.
7135    An rtx for the computed value is returned.  The value is never null.
7136    In the case of a void EXP, const0_rtx is returned.
7137
7138    The value may be stored in TARGET if TARGET is nonzero.
7139    TARGET is just a suggestion; callers must assume that
7140    the rtx returned may not be the same as TARGET.
7141
7142    If TARGET is CONST0_RTX, it means that the value will be ignored.
7143
7144    If TMODE is not VOIDmode, it suggests generating the
7145    result in mode TMODE.  But this is done only when convenient.
7146    Otherwise, TMODE is ignored and the value generated in its natural mode.
7147    TMODE is just a suggestion; callers must assume that
7148    the rtx returned may not have mode TMODE.
7149
7150    Note that TARGET may have neither TMODE nor MODE.  In that case, it
7151    probably will not be used.
7152
7153    If MODIFIER is EXPAND_SUM then when EXP is an addition
7154    we can return an rtx of the form (MULT (REG ...) (CONST_INT ...))
7155    or a nest of (PLUS ...) and (MINUS ...) where the terms are
7156    products as above, or REG or MEM, or constant.
7157    Ordinarily in such cases we would output mul or add instructions
7158    and then return a pseudo reg containing the sum.
7159
7160    EXPAND_INITIALIZER is much like EXPAND_SUM except that
7161    it also marks a label as absolutely required (it can't be dead).
7162    It also makes a ZERO_EXTEND or SIGN_EXTEND instead of emitting extend insns.
7163    This is used for outputting expressions used in initializers.
7164
7165    EXPAND_CONST_ADDRESS says that it is okay to return a MEM
7166    with a constant address even if that address is not normally legitimate.
7167    EXPAND_INITIALIZER and EXPAND_SUM also have this effect.
7168
7169    EXPAND_STACK_PARM is used when expanding to a TARGET on the stack for
7170    a call parameter.  Such targets require special care as we haven't yet
7171    marked TARGET so that it's safe from being trashed by libcalls.  We
7172    don't want to use TARGET for anything but the final result;
7173    Intermediate values must go elsewhere.   Additionally, calls to
7174    emit_block_move will be flagged with BLOCK_OP_CALL_PARM.
7175
7176    If EXP is a VAR_DECL whose DECL_RTL was a MEM with an invalid
7177    address, and ALT_RTL is non-NULL, then *ALT_RTL is set to the
7178    DECL_RTL of the VAR_DECL.  *ALT_RTL is also set if EXP is a
7179    COMPOUND_EXPR whose second argument is such a VAR_DECL, and so on
7180    recursively.  */
7181
7182 rtx
7183 expand_expr_real (tree exp, rtx target, enum machine_mode tmode,
7184                   enum expand_modifier modifier, rtx *alt_rtl)
7185 {
7186   rtx ret;
7187
7188   /* Handle ERROR_MARK before anybody tries to access its type.  */
7189   if (TREE_CODE (exp) == ERROR_MARK
7190       || (TREE_CODE (TREE_TYPE (exp)) == ERROR_MARK))
7191     {
7192       ret = CONST0_RTX (tmode);
7193       return ret ? ret : const0_rtx;
7194     }
7195
7196   /* If this is an expression of some kind and it has an associated line
7197      number, then emit the line number before expanding the expression.
7198
7199      We need to save and restore the file and line information so that
7200      errors discovered during expansion are emitted with the right
7201      information.  It would be better of the diagnostic routines
7202      used the file/line information embedded in the tree nodes rather
7203      than globals.  */
7204   if (cfun && EXPR_HAS_LOCATION (exp))
7205     {
7206       location_t saved_location = input_location;
7207       location_t saved_curr_loc = get_curr_insn_source_location ();
7208       tree saved_block = get_curr_insn_block ();
7209       input_location = EXPR_LOCATION (exp);
7210       set_curr_insn_source_location (input_location);
7211
7212       /* Record where the insns produced belong.  */
7213       set_curr_insn_block (TREE_BLOCK (exp));
7214
7215       ret = expand_expr_real_1 (exp, target, tmode, modifier, alt_rtl);
7216
7217       input_location = saved_location;
7218       set_curr_insn_block (saved_block);
7219       set_curr_insn_source_location (saved_curr_loc);
7220     }
7221   else
7222     {
7223       ret = expand_expr_real_1 (exp, target, tmode, modifier, alt_rtl);
7224     }
7225
7226   return ret;
7227 }
7228
7229 rtx
7230 expand_expr_real_2 (sepops ops, rtx target, enum machine_mode tmode,
7231                     enum expand_modifier modifier)
7232 {
7233   rtx op0, op1, op2, temp;
7234   tree type;
7235   int unsignedp;
7236   enum machine_mode mode;
7237   enum tree_code code = ops->code;
7238   optab this_optab;
7239   rtx subtarget, original_target;
7240   int ignore;
7241   bool reduce_bit_field;
7242   gimple subexp0_def, subexp1_def;
7243   tree top0, top1;
7244   location_t loc = ops->location;
7245   tree treeop0, treeop1;
7246 #define REDUCE_BIT_FIELD(expr)  (reduce_bit_field                         \
7247                                  ? reduce_to_bit_field_precision ((expr), \
7248                                                                   target, \
7249                                                                   type)   \
7250                                  : (expr))
7251
7252   type = ops->type;
7253   mode = TYPE_MODE (type);
7254   unsignedp = TYPE_UNSIGNED (type);
7255
7256   treeop0 = ops->op0;
7257   treeop1 = ops->op1;
7258
7259   /* We should be called only on simple (binary or unary) expressions,
7260      exactly those that are valid in gimple expressions that aren't
7261      GIMPLE_SINGLE_RHS (or invalid).  */
7262   gcc_assert (get_gimple_rhs_class (code) == GIMPLE_UNARY_RHS
7263               || get_gimple_rhs_class (code) == GIMPLE_BINARY_RHS);
7264
7265   ignore = (target == const0_rtx
7266             || ((CONVERT_EXPR_CODE_P (code)
7267                  || code == COND_EXPR || code == VIEW_CONVERT_EXPR)
7268                 && TREE_CODE (type) == VOID_TYPE));
7269
7270   /* We should be called only if we need the result.  */
7271   gcc_assert (!ignore);
7272
7273   /* An operation in what may be a bit-field type needs the
7274      result to be reduced to the precision of the bit-field type,
7275      which is narrower than that of the type's mode.  */
7276   reduce_bit_field = (TREE_CODE (type) == INTEGER_TYPE
7277                       && GET_MODE_PRECISION (mode) > TYPE_PRECISION (type));
7278
7279   if (reduce_bit_field && modifier == EXPAND_STACK_PARM)
7280     target = 0;
7281
7282   /* Use subtarget as the target for operand 0 of a binary operation.  */
7283   subtarget = get_subtarget (target);
7284   original_target = target;
7285
7286   switch (code)
7287     {
7288     case NON_LVALUE_EXPR:
7289     case PAREN_EXPR:
7290     CASE_CONVERT:
7291       if (treeop0 == error_mark_node)
7292         return const0_rtx;
7293
7294       if (TREE_CODE (type) == UNION_TYPE)
7295         {
7296           tree valtype = TREE_TYPE (treeop0);
7297
7298           /* If both input and output are BLKmode, this conversion isn't doing
7299              anything except possibly changing memory attribute.  */
7300           if (mode == BLKmode && TYPE_MODE (valtype) == BLKmode)
7301             {
7302               rtx result = expand_expr (treeop0, target, tmode,
7303                                         modifier);
7304
7305               result = copy_rtx (result);
7306               set_mem_attributes (result, type, 0);
7307               return result;
7308             }
7309
7310           if (target == 0)
7311             {
7312               if (TYPE_MODE (type) != BLKmode)
7313                 target = gen_reg_rtx (TYPE_MODE (type));
7314               else
7315                 target = assign_temp (type, 0, 1, 1);
7316             }
7317
7318           if (MEM_P (target))
7319             /* Store data into beginning of memory target.  */
7320             store_expr (treeop0,
7321                         adjust_address (target, TYPE_MODE (valtype), 0),
7322                         modifier == EXPAND_STACK_PARM,
7323                         false);
7324
7325           else
7326             {
7327               gcc_assert (REG_P (target));
7328
7329               /* Store this field into a union of the proper type.  */
7330               store_field (target,
7331                            MIN ((int_size_in_bytes (TREE_TYPE
7332                                                     (treeop0))
7333                                  * BITS_PER_UNIT),
7334                                 (HOST_WIDE_INT) GET_MODE_BITSIZE (mode)),
7335                            0, TYPE_MODE (valtype), treeop0,
7336                            type, 0, false);
7337             }
7338
7339           /* Return the entire union.  */
7340           return target;
7341         }
7342
7343       if (mode == TYPE_MODE (TREE_TYPE (treeop0)))
7344         {
7345           op0 = expand_expr (treeop0, target, VOIDmode,
7346                              modifier);
7347
7348           /* If the signedness of the conversion differs and OP0 is
7349              a promoted SUBREG, clear that indication since we now
7350              have to do the proper extension.  */
7351           if (TYPE_UNSIGNED (TREE_TYPE (treeop0)) != unsignedp
7352               && GET_CODE (op0) == SUBREG)
7353             SUBREG_PROMOTED_VAR_P (op0) = 0;
7354
7355           return REDUCE_BIT_FIELD (op0);
7356         }
7357
7358       op0 = expand_expr (treeop0, NULL_RTX, mode,
7359                          modifier == EXPAND_SUM ? EXPAND_NORMAL : modifier);
7360       if (GET_MODE (op0) == mode)
7361         ;
7362
7363       /* If OP0 is a constant, just convert it into the proper mode.  */
7364       else if (CONSTANT_P (op0))
7365         {
7366           tree inner_type = TREE_TYPE (treeop0);
7367           enum machine_mode inner_mode = TYPE_MODE (inner_type);
7368
7369           if (modifier == EXPAND_INITIALIZER)
7370             op0 = simplify_gen_subreg (mode, op0, inner_mode,
7371                                        subreg_lowpart_offset (mode,
7372                                                               inner_mode));
7373           else
7374             op0=  convert_modes (mode, inner_mode, op0,
7375                                  TYPE_UNSIGNED (inner_type));
7376         }
7377
7378       else if (modifier == EXPAND_INITIALIZER)
7379         op0 = gen_rtx_fmt_e (unsignedp ? ZERO_EXTEND : SIGN_EXTEND, mode, op0);
7380
7381       else if (target == 0)
7382         op0 = convert_to_mode (mode, op0,
7383                                TYPE_UNSIGNED (TREE_TYPE
7384                                               (treeop0)));
7385       else
7386         {
7387           convert_move (target, op0,
7388                         TYPE_UNSIGNED (TREE_TYPE (treeop0)));
7389           op0 = target;
7390         }
7391
7392       return REDUCE_BIT_FIELD (op0);
7393
7394     case ADDR_SPACE_CONVERT_EXPR:
7395       {
7396         tree treeop0_type = TREE_TYPE (treeop0);
7397         addr_space_t as_to;
7398         addr_space_t as_from;
7399
7400         gcc_assert (POINTER_TYPE_P (type));
7401         gcc_assert (POINTER_TYPE_P (treeop0_type));
7402
7403         as_to = TYPE_ADDR_SPACE (TREE_TYPE (type));
7404         as_from = TYPE_ADDR_SPACE (TREE_TYPE (treeop0_type));
7405
7406         /* Conversions between pointers to the same address space should
7407            have been implemented via CONVERT_EXPR / NOP_EXPR.  */
7408         gcc_assert (as_to != as_from);
7409
7410         /* Ask target code to handle conversion between pointers
7411            to overlapping address spaces.  */
7412         if (targetm.addr_space.subset_p (as_to, as_from)
7413             || targetm.addr_space.subset_p (as_from, as_to))
7414           {
7415             op0 = expand_expr (treeop0, NULL_RTX, VOIDmode, modifier);
7416             op0 = targetm.addr_space.convert (op0, treeop0_type, type);
7417             gcc_assert (op0);
7418             return op0;
7419           }
7420
7421         /* For disjoint address spaces, converting anything but
7422            a null pointer invokes undefined behaviour.  We simply
7423            always return a null pointer here.  */
7424         return CONST0_RTX (mode);
7425       }
7426
7427     case POINTER_PLUS_EXPR:
7428       /* Even though the sizetype mode and the pointer's mode can be different
7429          expand is able to handle this correctly and get the correct result out
7430          of the PLUS_EXPR code.  */
7431       /* Make sure to sign-extend the sizetype offset in a POINTER_PLUS_EXPR
7432          if sizetype precision is smaller than pointer precision.  */
7433       if (TYPE_PRECISION (sizetype) < TYPE_PRECISION (type))
7434         treeop1 = fold_convert_loc (loc, type,
7435                                     fold_convert_loc (loc, ssizetype,
7436                                                       treeop1));
7437     case PLUS_EXPR:
7438
7439       /* Check if this is a case for multiplication and addition.  */
7440       if ((TREE_CODE (type) == INTEGER_TYPE
7441            || TREE_CODE (type) == FIXED_POINT_TYPE)
7442           && (subexp0_def = get_def_for_expr (treeop0,
7443                                               MULT_EXPR)))
7444         {
7445           tree subsubexp0, subsubexp1;
7446           gimple subsubexp0_def, subsubexp1_def;
7447           enum tree_code this_code;
7448
7449           this_code = TREE_CODE (type) == INTEGER_TYPE ? NOP_EXPR
7450                                                        : FIXED_CONVERT_EXPR;
7451           subsubexp0 = gimple_assign_rhs1 (subexp0_def);
7452           subsubexp0_def = get_def_for_expr (subsubexp0, this_code);
7453           subsubexp1 = gimple_assign_rhs2 (subexp0_def);
7454           subsubexp1_def = get_def_for_expr (subsubexp1, this_code);
7455           if (subsubexp0_def && subsubexp1_def
7456               && (top0 = gimple_assign_rhs1 (subsubexp0_def))
7457               && (top1 = gimple_assign_rhs1 (subsubexp1_def))
7458               && (TYPE_PRECISION (TREE_TYPE (top0))
7459                   < TYPE_PRECISION (TREE_TYPE (subsubexp0)))
7460               && (TYPE_PRECISION (TREE_TYPE (top0))
7461                   == TYPE_PRECISION (TREE_TYPE (top1)))
7462               && (TYPE_UNSIGNED (TREE_TYPE (top0))
7463                   == TYPE_UNSIGNED (TREE_TYPE (top1))))
7464             {
7465               tree op0type = TREE_TYPE (top0);
7466               enum machine_mode innermode = TYPE_MODE (op0type);
7467               bool zextend_p = TYPE_UNSIGNED (op0type);
7468               bool sat_p = TYPE_SATURATING (TREE_TYPE (subsubexp0));
7469               if (sat_p == 0)
7470                 this_optab = zextend_p ? umadd_widen_optab : smadd_widen_optab;
7471               else
7472                 this_optab = zextend_p ? usmadd_widen_optab
7473                                        : ssmadd_widen_optab;
7474               if (mode == GET_MODE_2XWIDER_MODE (innermode)
7475                   && (optab_handler (this_optab, mode)->insn_code
7476                       != CODE_FOR_nothing))
7477                 {
7478                   expand_operands (top0, top1, NULL_RTX, &op0, &op1,
7479                                    EXPAND_NORMAL);
7480                   op2 = expand_expr (treeop1, subtarget,
7481                                      VOIDmode, EXPAND_NORMAL);
7482                   temp = expand_ternary_op (mode, this_optab, op0, op1, op2,
7483                                             target, unsignedp);
7484                   gcc_assert (temp);
7485                   return REDUCE_BIT_FIELD (temp);
7486                 }
7487             }
7488         }
7489
7490       /* If we are adding a constant, a VAR_DECL that is sp, fp, or ap, and
7491          something else, make sure we add the register to the constant and
7492          then to the other thing.  This case can occur during strength
7493          reduction and doing it this way will produce better code if the
7494          frame pointer or argument pointer is eliminated.
7495
7496          fold-const.c will ensure that the constant is always in the inner
7497          PLUS_EXPR, so the only case we need to do anything about is if
7498          sp, ap, or fp is our second argument, in which case we must swap
7499          the innermost first argument and our second argument.  */
7500
7501       if (TREE_CODE (treeop0) == PLUS_EXPR
7502           && TREE_CODE (TREE_OPERAND (treeop0, 1)) == INTEGER_CST
7503           && TREE_CODE (treeop1) == VAR_DECL
7504           && (DECL_RTL (treeop1) == frame_pointer_rtx
7505               || DECL_RTL (treeop1) == stack_pointer_rtx
7506               || DECL_RTL (treeop1) == arg_pointer_rtx))
7507         {
7508           tree t = treeop1;
7509
7510           treeop1 = TREE_OPERAND (treeop0, 0);
7511           TREE_OPERAND (treeop0, 0) = t;
7512         }
7513
7514       /* If the result is to be ptr_mode and we are adding an integer to
7515          something, we might be forming a constant.  So try to use
7516          plus_constant.  If it produces a sum and we can't accept it,
7517          use force_operand.  This allows P = &ARR[const] to generate
7518          efficient code on machines where a SYMBOL_REF is not a valid
7519          address.
7520
7521          If this is an EXPAND_SUM call, always return the sum.  */
7522       if (modifier == EXPAND_SUM || modifier == EXPAND_INITIALIZER
7523           || (mode == ptr_mode && (unsignedp || ! flag_trapv)))
7524         {
7525           if (modifier == EXPAND_STACK_PARM)
7526             target = 0;
7527           if (TREE_CODE (treeop0) == INTEGER_CST
7528               && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
7529               && TREE_CONSTANT (treeop1))
7530             {
7531               rtx constant_part;
7532
7533               op1 = expand_expr (treeop1, subtarget, VOIDmode,
7534                                  EXPAND_SUM);
7535               /* Use immed_double_const to ensure that the constant is
7536                  truncated according to the mode of OP1, then sign extended
7537                  to a HOST_WIDE_INT.  Using the constant directly can result
7538                  in non-canonical RTL in a 64x32 cross compile.  */
7539               constant_part
7540                 = immed_double_const (TREE_INT_CST_LOW (treeop0),
7541                                       (HOST_WIDE_INT) 0,
7542                                       TYPE_MODE (TREE_TYPE (treeop1)));
7543               op1 = plus_constant (op1, INTVAL (constant_part));
7544               if (modifier != EXPAND_SUM && modifier != EXPAND_INITIALIZER)
7545                 op1 = force_operand (op1, target);
7546               return REDUCE_BIT_FIELD (op1);
7547             }
7548
7549           else if (TREE_CODE (treeop1) == INTEGER_CST
7550                    && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
7551                    && TREE_CONSTANT (treeop0))
7552             {
7553               rtx constant_part;
7554
7555               op0 = expand_expr (treeop0, subtarget, VOIDmode,
7556                                  (modifier == EXPAND_INITIALIZER
7557                                  ? EXPAND_INITIALIZER : EXPAND_SUM));
7558               if (! CONSTANT_P (op0))
7559                 {
7560                   op1 = expand_expr (treeop1, NULL_RTX,
7561                                      VOIDmode, modifier);
7562                   /* Return a PLUS if modifier says it's OK.  */
7563                   if (modifier == EXPAND_SUM
7564                       || modifier == EXPAND_INITIALIZER)
7565                     return simplify_gen_binary (PLUS, mode, op0, op1);
7566                   goto binop2;
7567                 }
7568               /* Use immed_double_const to ensure that the constant is
7569                  truncated according to the mode of OP1, then sign extended
7570                  to a HOST_WIDE_INT.  Using the constant directly can result
7571                  in non-canonical RTL in a 64x32 cross compile.  */
7572               constant_part
7573                 = immed_double_const (TREE_INT_CST_LOW (treeop1),
7574                                       (HOST_WIDE_INT) 0,
7575                                       TYPE_MODE (TREE_TYPE (treeop0)));
7576               op0 = plus_constant (op0, INTVAL (constant_part));
7577               if (modifier != EXPAND_SUM && modifier != EXPAND_INITIALIZER)
7578                 op0 = force_operand (op0, target);
7579               return REDUCE_BIT_FIELD (op0);
7580             }
7581         }
7582
7583       /* No sense saving up arithmetic to be done
7584          if it's all in the wrong mode to form part of an address.
7585          And force_operand won't know whether to sign-extend or
7586          zero-extend.  */
7587       if ((modifier != EXPAND_SUM && modifier != EXPAND_INITIALIZER)
7588           || mode != ptr_mode)
7589         {
7590           expand_operands (treeop0, treeop1,
7591                            subtarget, &op0, &op1, EXPAND_NORMAL);
7592           if (op0 == const0_rtx)
7593             return op1;
7594           if (op1 == const0_rtx)
7595             return op0;
7596           goto binop2;
7597         }
7598
7599       expand_operands (treeop0, treeop1,
7600                        subtarget, &op0, &op1, modifier);
7601       return REDUCE_BIT_FIELD (simplify_gen_binary (PLUS, mode, op0, op1));
7602
7603     case MINUS_EXPR:
7604       /* Check if this is a case for multiplication and subtraction.  */
7605       if ((TREE_CODE (type) == INTEGER_TYPE
7606            || TREE_CODE (type) == FIXED_POINT_TYPE)
7607           && (subexp1_def = get_def_for_expr (treeop1,
7608                                               MULT_EXPR)))
7609         {
7610           tree subsubexp0, subsubexp1;
7611           gimple subsubexp0_def, subsubexp1_def;
7612           enum tree_code this_code;
7613
7614           this_code = TREE_CODE (type) == INTEGER_TYPE ? NOP_EXPR
7615                                                        : FIXED_CONVERT_EXPR;
7616           subsubexp0 = gimple_assign_rhs1 (subexp1_def);
7617           subsubexp0_def = get_def_for_expr (subsubexp0, this_code);
7618           subsubexp1 = gimple_assign_rhs2 (subexp1_def);
7619           subsubexp1_def = get_def_for_expr (subsubexp1, this_code);
7620           if (subsubexp0_def && subsubexp1_def
7621               && (top0 = gimple_assign_rhs1 (subsubexp0_def))
7622               && (top1 = gimple_assign_rhs1 (subsubexp1_def))
7623               && (TYPE_PRECISION (TREE_TYPE (top0))
7624                   < TYPE_PRECISION (TREE_TYPE (subsubexp0)))
7625               && (TYPE_PRECISION (TREE_TYPE (top0))
7626                   == TYPE_PRECISION (TREE_TYPE (top1)))
7627               && (TYPE_UNSIGNED (TREE_TYPE (top0))
7628                   == TYPE_UNSIGNED (TREE_TYPE (top1))))
7629             {
7630               tree op0type = TREE_TYPE (top0);
7631               enum machine_mode innermode = TYPE_MODE (op0type);
7632               bool zextend_p = TYPE_UNSIGNED (op0type);
7633               bool sat_p = TYPE_SATURATING (TREE_TYPE (subsubexp0));
7634               if (sat_p == 0)
7635                 this_optab = zextend_p ? umsub_widen_optab : smsub_widen_optab;
7636               else
7637                 this_optab = zextend_p ? usmsub_widen_optab
7638                                        : ssmsub_widen_optab;
7639               if (mode == GET_MODE_2XWIDER_MODE (innermode)
7640                   && (optab_handler (this_optab, mode)->insn_code
7641                       != CODE_FOR_nothing))
7642                 {
7643                   expand_operands (top0, top1, NULL_RTX, &op0, &op1,
7644                                    EXPAND_NORMAL);
7645                   op2 = expand_expr (treeop0, subtarget,
7646                                      VOIDmode, EXPAND_NORMAL);
7647                   temp = expand_ternary_op (mode, this_optab, op0, op1, op2,
7648                                             target, unsignedp);
7649                   gcc_assert (temp);
7650                   return REDUCE_BIT_FIELD (temp);
7651                 }
7652             }
7653         }
7654
7655       /* For initializers, we are allowed to return a MINUS of two
7656          symbolic constants.  Here we handle all cases when both operands
7657          are constant.  */
7658       /* Handle difference of two symbolic constants,
7659          for the sake of an initializer.  */
7660       if ((modifier == EXPAND_SUM || modifier == EXPAND_INITIALIZER)
7661           && really_constant_p (treeop0)
7662           && really_constant_p (treeop1))
7663         {
7664           expand_operands (treeop0, treeop1,
7665                            NULL_RTX, &op0, &op1, modifier);
7666
7667           /* If the last operand is a CONST_INT, use plus_constant of
7668              the negated constant.  Else make the MINUS.  */
7669           if (CONST_INT_P (op1))
7670             return REDUCE_BIT_FIELD (plus_constant (op0, - INTVAL (op1)));
7671           else
7672             return REDUCE_BIT_FIELD (gen_rtx_MINUS (mode, op0, op1));
7673         }
7674
7675       /* No sense saving up arithmetic to be done
7676          if it's all in the wrong mode to form part of an address.
7677          And force_operand won't know whether to sign-extend or
7678          zero-extend.  */
7679       if ((modifier != EXPAND_SUM && modifier != EXPAND_INITIALIZER)
7680           || mode != ptr_mode)
7681         goto binop;
7682
7683       expand_operands (treeop0, treeop1,
7684                        subtarget, &op0, &op1, modifier);
7685
7686       /* Convert A - const to A + (-const).  */
7687       if (CONST_INT_P (op1))
7688         {
7689           op1 = negate_rtx (mode, op1);
7690           return REDUCE_BIT_FIELD (simplify_gen_binary (PLUS, mode, op0, op1));
7691         }
7692
7693       goto binop2;
7694
7695     case WIDEN_MULT_EXPR:
7696       /* If first operand is constant, swap them.
7697          Thus the following special case checks need only
7698          check the second operand.  */
7699       if (TREE_CODE (treeop0) == INTEGER_CST)
7700         {
7701           tree t1 = treeop0;
7702           treeop0 = treeop1;
7703           treeop1 = t1;
7704         }
7705
7706       /* First, check if we have a multiplication of one signed and one
7707          unsigned operand.  */
7708       if (TREE_CODE (treeop1) != INTEGER_CST
7709           && (TYPE_UNSIGNED (TREE_TYPE (treeop0))
7710               != TYPE_UNSIGNED (TREE_TYPE (treeop1))))
7711         {
7712           enum machine_mode innermode = TYPE_MODE (TREE_TYPE (treeop0));
7713           this_optab = usmul_widen_optab;
7714           if (mode == GET_MODE_2XWIDER_MODE (innermode))
7715             {
7716               if (optab_handler (this_optab, mode)->insn_code != CODE_FOR_nothing)
7717                 {
7718                   if (TYPE_UNSIGNED (TREE_TYPE (treeop0)))
7719                     expand_operands (treeop0, treeop1, subtarget, &op0, &op1,
7720                                      EXPAND_NORMAL);
7721                   else
7722                     expand_operands (treeop0, treeop1, subtarget, &op1, &op0,
7723                                      EXPAND_NORMAL);
7724                   goto binop3;
7725                 }
7726             }
7727         }
7728       /* Check for a multiplication with matching signedness.  */
7729       else if ((TREE_CODE (treeop1) == INTEGER_CST
7730                 && int_fits_type_p (treeop1, TREE_TYPE (treeop0)))
7731                || (TYPE_UNSIGNED (TREE_TYPE (treeop1))
7732                    == TYPE_UNSIGNED (TREE_TYPE (treeop0))))
7733         {
7734           tree op0type = TREE_TYPE (treeop0);
7735           enum machine_mode innermode = TYPE_MODE (op0type);
7736           bool zextend_p = TYPE_UNSIGNED (op0type);
7737           optab other_optab = zextend_p ? smul_widen_optab : umul_widen_optab;
7738           this_optab = zextend_p ? umul_widen_optab : smul_widen_optab;
7739
7740           if (mode == GET_MODE_2XWIDER_MODE (innermode))
7741             {
7742               if (optab_handler (this_optab, mode)->insn_code != CODE_FOR_nothing)
7743                 {
7744                   expand_operands (treeop0, treeop1, NULL_RTX, &op0, &op1,
7745                                    EXPAND_NORMAL);
7746                   temp = expand_widening_mult (mode, op0, op1, target,
7747                                                unsignedp, this_optab);
7748                   return REDUCE_BIT_FIELD (temp);
7749                 }
7750               if (optab_handler (other_optab, mode)->insn_code != CODE_FOR_nothing
7751                   && innermode == word_mode)
7752                 {
7753                   rtx htem, hipart;
7754                   op0 = expand_normal (treeop0);
7755                   if (TREE_CODE (treeop1) == INTEGER_CST)
7756                     op1 = convert_modes (innermode, mode,
7757                                          expand_normal (treeop1), unsignedp);
7758                   else
7759                     op1 = expand_normal (treeop1);
7760                   temp = expand_binop (mode, other_optab, op0, op1, target,
7761                                        unsignedp, OPTAB_LIB_WIDEN);
7762                   hipart = gen_highpart (innermode, temp);
7763                   htem = expand_mult_highpart_adjust (innermode, hipart,
7764                                                       op0, op1, hipart,
7765                                                       zextend_p);
7766                   if (htem != hipart)
7767                     emit_move_insn (hipart, htem);
7768                   return REDUCE_BIT_FIELD (temp);
7769                 }
7770             }
7771         }
7772       treeop0 = fold_build1 (CONVERT_EXPR, type, treeop0);
7773       treeop1 = fold_build1 (CONVERT_EXPR, type, treeop1);
7774       expand_operands (treeop0, treeop1, subtarget, &op0, &op1, EXPAND_NORMAL);
7775       return REDUCE_BIT_FIELD (expand_mult (mode, op0, op1, target, unsignedp));
7776
7777     case MULT_EXPR:
7778       /* If this is a fixed-point operation, then we cannot use the code
7779          below because "expand_mult" doesn't support sat/no-sat fixed-point
7780          multiplications.   */
7781       if (ALL_FIXED_POINT_MODE_P (mode))
7782         goto binop;
7783
7784       /* If first operand is constant, swap them.
7785          Thus the following special case checks need only
7786          check the second operand.  */
7787       if (TREE_CODE (treeop0) == INTEGER_CST)
7788         {
7789           tree t1 = treeop0;
7790           treeop0 = treeop1;
7791           treeop1 = t1;
7792         }
7793
7794       /* Attempt to return something suitable for generating an
7795          indexed address, for machines that support that.  */
7796
7797       if (modifier == EXPAND_SUM && mode == ptr_mode
7798           && host_integerp (treeop1, 0))
7799         {
7800           tree exp1 = treeop1;
7801
7802           op0 = expand_expr (treeop0, subtarget, VOIDmode,
7803                              EXPAND_SUM);
7804
7805           if (!REG_P (op0))
7806             op0 = force_operand (op0, NULL_RTX);
7807           if (!REG_P (op0))
7808             op0 = copy_to_mode_reg (mode, op0);
7809
7810           return REDUCE_BIT_FIELD (gen_rtx_MULT (mode, op0,
7811                                gen_int_mode (tree_low_cst (exp1, 0),
7812                                              TYPE_MODE (TREE_TYPE (exp1)))));
7813         }
7814
7815       if (modifier == EXPAND_STACK_PARM)
7816         target = 0;
7817
7818       expand_operands (treeop0, treeop1, subtarget, &op0, &op1, EXPAND_NORMAL);
7819       return REDUCE_BIT_FIELD (expand_mult (mode, op0, op1, target, unsignedp));
7820
7821     case TRUNC_DIV_EXPR:
7822     case FLOOR_DIV_EXPR:
7823     case CEIL_DIV_EXPR:
7824     case ROUND_DIV_EXPR:
7825     case EXACT_DIV_EXPR:
7826       /* If this is a fixed-point operation, then we cannot use the code
7827          below because "expand_divmod" doesn't support sat/no-sat fixed-point
7828          divisions.   */
7829       if (ALL_FIXED_POINT_MODE_P (mode))
7830         goto binop;
7831
7832       if (modifier == EXPAND_STACK_PARM)
7833         target = 0;
7834       /* Possible optimization: compute the dividend with EXPAND_SUM
7835          then if the divisor is constant can optimize the case
7836          where some terms of the dividend have coeffs divisible by it.  */
7837       expand_operands (treeop0, treeop1,
7838                        subtarget, &op0, &op1, EXPAND_NORMAL);
7839       return expand_divmod (0, code, mode, op0, op1, target, unsignedp);
7840
7841     case RDIV_EXPR:
7842       goto binop;
7843
7844     case TRUNC_MOD_EXPR:
7845     case FLOOR_MOD_EXPR:
7846     case CEIL_MOD_EXPR:
7847     case ROUND_MOD_EXPR:
7848       if (modifier == EXPAND_STACK_PARM)
7849         target = 0;
7850       expand_operands (treeop0, treeop1,
7851                        subtarget, &op0, &op1, EXPAND_NORMAL);
7852       return expand_divmod (1, code, mode, op0, op1, target, unsignedp);
7853
7854     case FIXED_CONVERT_EXPR:
7855       op0 = expand_normal (treeop0);
7856       if (target == 0 || modifier == EXPAND_STACK_PARM)
7857         target = gen_reg_rtx (mode);
7858
7859       if ((TREE_CODE (TREE_TYPE (treeop0)) == INTEGER_TYPE
7860            && TYPE_UNSIGNED (TREE_TYPE (treeop0)))
7861           || (TREE_CODE (type) == INTEGER_TYPE && TYPE_UNSIGNED (type)))
7862         expand_fixed_convert (target, op0, 1, TYPE_SATURATING (type));
7863       else
7864         expand_fixed_convert (target, op0, 0, TYPE_SATURATING (type));
7865       return target;
7866
7867     case FIX_TRUNC_EXPR:
7868       op0 = expand_normal (treeop0);
7869       if (target == 0 || modifier == EXPAND_STACK_PARM)
7870         target = gen_reg_rtx (mode);
7871       expand_fix (target, op0, unsignedp);
7872       return target;
7873
7874     case FLOAT_EXPR:
7875       op0 = expand_normal (treeop0);
7876       if (target == 0 || modifier == EXPAND_STACK_PARM)
7877         target = gen_reg_rtx (mode);
7878       /* expand_float can't figure out what to do if FROM has VOIDmode.
7879          So give it the correct mode.  With -O, cse will optimize this.  */
7880       if (GET_MODE (op0) == VOIDmode)
7881         op0 = copy_to_mode_reg (TYPE_MODE (TREE_TYPE (treeop0)),
7882                                 op0);
7883       expand_float (target, op0,
7884                     TYPE_UNSIGNED (TREE_TYPE (treeop0)));
7885       return target;
7886
7887     case NEGATE_EXPR:
7888       op0 = expand_expr (treeop0, subtarget,
7889                          VOIDmode, EXPAND_NORMAL);
7890       if (modifier == EXPAND_STACK_PARM)
7891         target = 0;
7892       temp = expand_unop (mode,
7893                           optab_for_tree_code (NEGATE_EXPR, type,
7894                                                optab_default),
7895                           op0, target, 0);
7896       gcc_assert (temp);
7897       return REDUCE_BIT_FIELD (temp);
7898
7899     case ABS_EXPR:
7900       op0 = expand_expr (treeop0, subtarget,
7901                          VOIDmode, EXPAND_NORMAL);
7902       if (modifier == EXPAND_STACK_PARM)
7903         target = 0;
7904
7905       /* ABS_EXPR is not valid for complex arguments.  */
7906       gcc_assert (GET_MODE_CLASS (mode) != MODE_COMPLEX_INT
7907                   && GET_MODE_CLASS (mode) != MODE_COMPLEX_FLOAT);
7908
7909       /* Unsigned abs is simply the operand.  Testing here means we don't
7910          risk generating incorrect code below.  */
7911       if (TYPE_UNSIGNED (type))
7912         return op0;
7913
7914       return expand_abs (mode, op0, target, unsignedp,
7915                          safe_from_p (target, treeop0, 1));
7916
7917     case MAX_EXPR:
7918     case MIN_EXPR:
7919       target = original_target;
7920       if (target == 0
7921           || modifier == EXPAND_STACK_PARM
7922           || (MEM_P (target) && MEM_VOLATILE_P (target))
7923           || GET_MODE (target) != mode
7924           || (REG_P (target)
7925               && REGNO (target) < FIRST_PSEUDO_REGISTER))
7926         target = gen_reg_rtx (mode);
7927       expand_operands (treeop0, treeop1,
7928                        target, &op0, &op1, EXPAND_NORMAL);
7929
7930       /* First try to do it with a special MIN or MAX instruction.
7931          If that does not win, use a conditional jump to select the proper
7932          value.  */
7933       this_optab = optab_for_tree_code (code, type, optab_default);
7934       temp = expand_binop (mode, this_optab, op0, op1, target, unsignedp,
7935                            OPTAB_WIDEN);
7936       if (temp != 0)
7937         return temp;
7938
7939       /* At this point, a MEM target is no longer useful; we will get better
7940          code without it.  */
7941
7942       if (! REG_P (target))
7943         target = gen_reg_rtx (mode);
7944
7945       /* If op1 was placed in target, swap op0 and op1.  */
7946       if (target != op0 && target == op1)
7947         {
7948           temp = op0;
7949           op0 = op1;
7950           op1 = temp;
7951         }
7952
7953       /* We generate better code and avoid problems with op1 mentioning
7954          target by forcing op1 into a pseudo if it isn't a constant.  */
7955       if (! CONSTANT_P (op1))
7956         op1 = force_reg (mode, op1);
7957
7958       {
7959         enum rtx_code comparison_code;
7960         rtx cmpop1 = op1;
7961
7962         if (code == MAX_EXPR)
7963           comparison_code = unsignedp ? GEU : GE;
7964         else
7965           comparison_code = unsignedp ? LEU : LE;
7966
7967         /* Canonicalize to comparisons against 0.  */
7968         if (op1 == const1_rtx)
7969           {
7970             /* Converting (a >= 1 ? a : 1) into (a > 0 ? a : 1)
7971                or (a != 0 ? a : 1) for unsigned.
7972                For MIN we are safe converting (a <= 1 ? a : 1)
7973                into (a <= 0 ? a : 1)  */
7974             cmpop1 = const0_rtx;
7975             if (code == MAX_EXPR)
7976               comparison_code = unsignedp ? NE : GT;
7977           }
7978         if (op1 == constm1_rtx && !unsignedp)
7979           {
7980             /* Converting (a >= -1 ? a : -1) into (a >= 0 ? a : -1)
7981                and (a <= -1 ? a : -1) into (a < 0 ? a : -1) */
7982             cmpop1 = const0_rtx;
7983             if (code == MIN_EXPR)
7984               comparison_code = LT;
7985           }
7986 #ifdef HAVE_conditional_move
7987         /* Use a conditional move if possible.  */
7988         if (can_conditionally_move_p (mode))
7989           {
7990             rtx insn;
7991
7992             /* ??? Same problem as in expmed.c: emit_conditional_move
7993                forces a stack adjustment via compare_from_rtx, and we
7994                lose the stack adjustment if the sequence we are about
7995                to create is discarded.  */
7996             do_pending_stack_adjust ();
7997
7998             start_sequence ();
7999
8000             /* Try to emit the conditional move.  */
8001             insn = emit_conditional_move (target, comparison_code,
8002                                           op0, cmpop1, mode,
8003                                           op0, op1, mode,
8004                                           unsignedp);
8005
8006             /* If we could do the conditional move, emit the sequence,
8007                and return.  */
8008             if (insn)
8009               {
8010                 rtx seq = get_insns ();
8011                 end_sequence ();
8012                 emit_insn (seq);
8013                 return target;
8014               }
8015
8016             /* Otherwise discard the sequence and fall back to code with
8017                branches.  */
8018             end_sequence ();
8019           }
8020 #endif
8021         if (target != op0)
8022           emit_move_insn (target, op0);
8023
8024         temp = gen_label_rtx ();
8025         do_compare_rtx_and_jump (target, cmpop1, comparison_code,
8026                                  unsignedp, mode, NULL_RTX, NULL_RTX, temp,
8027                                  -1);
8028       }
8029       emit_move_insn (target, op1);
8030       emit_label (temp);
8031       return target;
8032
8033     case BIT_NOT_EXPR:
8034       op0 = expand_expr (treeop0, subtarget,
8035                          VOIDmode, EXPAND_NORMAL);
8036       if (modifier == EXPAND_STACK_PARM)
8037         target = 0;
8038       temp = expand_unop (mode, one_cmpl_optab, op0, target, 1);
8039       gcc_assert (temp);
8040       return temp;
8041
8042       /* ??? Can optimize bitwise operations with one arg constant.
8043          Can optimize (a bitwise1 n) bitwise2 (a bitwise3 b)
8044          and (a bitwise1 b) bitwise2 b (etc)
8045          but that is probably not worth while.  */
8046
8047       /* BIT_AND_EXPR is for bitwise anding.  TRUTH_AND_EXPR is for anding two
8048          boolean values when we want in all cases to compute both of them.  In
8049          general it is fastest to do TRUTH_AND_EXPR by computing both operands
8050          as actual zero-or-1 values and then bitwise anding.  In cases where
8051          there cannot be any side effects, better code would be made by
8052          treating TRUTH_AND_EXPR like TRUTH_ANDIF_EXPR; but the question is
8053          how to recognize those cases.  */
8054
8055     case TRUTH_AND_EXPR:
8056       code = BIT_AND_EXPR;
8057     case BIT_AND_EXPR:
8058       goto binop;
8059
8060     case TRUTH_OR_EXPR:
8061       code = BIT_IOR_EXPR;
8062     case BIT_IOR_EXPR:
8063       goto binop;
8064
8065     case TRUTH_XOR_EXPR:
8066       code = BIT_XOR_EXPR;
8067     case BIT_XOR_EXPR:
8068       goto binop;
8069
8070     case LROTATE_EXPR:
8071     case RROTATE_EXPR:
8072       gcc_assert (VECTOR_MODE_P (TYPE_MODE (type))
8073                   || (GET_MODE_PRECISION (TYPE_MODE (type))
8074                       == TYPE_PRECISION (type)));
8075       /* fall through */
8076
8077     case LSHIFT_EXPR:
8078     case RSHIFT_EXPR:
8079       /* If this is a fixed-point operation, then we cannot use the code
8080          below because "expand_shift" doesn't support sat/no-sat fixed-point
8081          shifts.   */
8082       if (ALL_FIXED_POINT_MODE_P (mode))
8083         goto binop;
8084
8085       if (! safe_from_p (subtarget, treeop1, 1))
8086         subtarget = 0;
8087       if (modifier == EXPAND_STACK_PARM)
8088         target = 0;
8089       op0 = expand_expr (treeop0, subtarget,
8090                          VOIDmode, EXPAND_NORMAL);
8091       temp = expand_shift (code, mode, op0, treeop1, target,
8092                            unsignedp);
8093       if (code == LSHIFT_EXPR)
8094         temp = REDUCE_BIT_FIELD (temp);
8095       return temp;
8096
8097       /* Could determine the answer when only additive constants differ.  Also,
8098          the addition of one can be handled by changing the condition.  */
8099     case LT_EXPR:
8100     case LE_EXPR:
8101     case GT_EXPR:
8102     case GE_EXPR:
8103     case EQ_EXPR:
8104     case NE_EXPR:
8105     case UNORDERED_EXPR:
8106     case ORDERED_EXPR:
8107     case UNLT_EXPR:
8108     case UNLE_EXPR:
8109     case UNGT_EXPR:
8110     case UNGE_EXPR:
8111     case UNEQ_EXPR:
8112     case LTGT_EXPR:
8113       temp = do_store_flag (ops,
8114                             modifier != EXPAND_STACK_PARM ? target : NULL_RTX,
8115                             tmode != VOIDmode ? tmode : mode);
8116       if (temp)
8117         return temp;
8118
8119       /* Use a compare and a jump for BLKmode comparisons, or for function
8120          type comparisons is HAVE_canonicalize_funcptr_for_compare.  */
8121
8122       if ((target == 0
8123            || modifier == EXPAND_STACK_PARM
8124            || ! safe_from_p (target, treeop0, 1)
8125            || ! safe_from_p (target, treeop1, 1)
8126            /* Make sure we don't have a hard reg (such as function's return
8127               value) live across basic blocks, if not optimizing.  */
8128            || (!optimize && REG_P (target)
8129                && REGNO (target) < FIRST_PSEUDO_REGISTER)))
8130         target = gen_reg_rtx (tmode != VOIDmode ? tmode : mode);
8131
8132       emit_move_insn (target, const0_rtx);
8133
8134       op1 = gen_label_rtx ();
8135       jumpifnot_1 (code, treeop0, treeop1, op1, -1);
8136
8137       emit_move_insn (target, const1_rtx);
8138
8139       emit_label (op1);
8140       return target;
8141
8142     case TRUTH_NOT_EXPR:
8143       if (modifier == EXPAND_STACK_PARM)
8144         target = 0;
8145       op0 = expand_expr (treeop0, target,
8146                          VOIDmode, EXPAND_NORMAL);
8147       /* The parser is careful to generate TRUTH_NOT_EXPR
8148          only with operands that are always zero or one.  */
8149       temp = expand_binop (mode, xor_optab, op0, const1_rtx,
8150                            target, 1, OPTAB_LIB_WIDEN);
8151       gcc_assert (temp);
8152       return temp;
8153
8154     case COMPLEX_EXPR:
8155       /* Get the rtx code of the operands.  */
8156       op0 = expand_normal (treeop0);
8157       op1 = expand_normal (treeop1);
8158
8159       if (!target)
8160         target = gen_reg_rtx (TYPE_MODE (type));
8161
8162       /* Move the real (op0) and imaginary (op1) parts to their location.  */
8163       write_complex_part (target, op0, false);
8164       write_complex_part (target, op1, true);
8165
8166       return target;
8167
8168     case WIDEN_SUM_EXPR:
8169       {
8170         tree oprnd0 = treeop0;
8171         tree oprnd1 = treeop1;
8172
8173         expand_operands (oprnd0, oprnd1, NULL_RTX, &op0, &op1, EXPAND_NORMAL);
8174         target = expand_widen_pattern_expr (ops, op0, NULL_RTX, op1,
8175                                             target, unsignedp);
8176         return target;
8177       }
8178
8179     case REDUC_MAX_EXPR:
8180     case REDUC_MIN_EXPR:
8181     case REDUC_PLUS_EXPR:
8182       {
8183         op0 = expand_normal (treeop0);
8184         this_optab = optab_for_tree_code (code, type, optab_default);
8185         temp = expand_unop (mode, this_optab, op0, target, unsignedp);
8186         gcc_assert (temp);
8187         return temp;
8188       }
8189
8190     case VEC_EXTRACT_EVEN_EXPR:
8191     case VEC_EXTRACT_ODD_EXPR:
8192       {
8193         expand_operands (treeop0,  treeop1,
8194                          NULL_RTX, &op0, &op1, EXPAND_NORMAL);
8195         this_optab = optab_for_tree_code (code, type, optab_default);
8196         temp = expand_binop (mode, this_optab, op0, op1, target, unsignedp,
8197                              OPTAB_WIDEN);
8198         gcc_assert (temp);
8199         return temp;
8200       }
8201
8202     case VEC_INTERLEAVE_HIGH_EXPR:
8203     case VEC_INTERLEAVE_LOW_EXPR:
8204       {
8205         expand_operands (treeop0,  treeop1,
8206                          NULL_RTX, &op0, &op1, EXPAND_NORMAL);
8207         this_optab = optab_for_tree_code (code, type, optab_default);
8208         temp = expand_binop (mode, this_optab, op0, op1, target, unsignedp,
8209                              OPTAB_WIDEN);
8210         gcc_assert (temp);
8211         return temp;
8212       }
8213
8214     case VEC_LSHIFT_EXPR:
8215     case VEC_RSHIFT_EXPR:
8216       {
8217         target = expand_vec_shift_expr (ops, target);
8218         return target;
8219       }
8220
8221     case VEC_UNPACK_HI_EXPR:
8222     case VEC_UNPACK_LO_EXPR:
8223       {
8224         op0 = expand_normal (treeop0);
8225         this_optab = optab_for_tree_code (code, type, optab_default);
8226         temp = expand_widen_pattern_expr (ops, op0, NULL_RTX, NULL_RTX,
8227                                           target, unsignedp);
8228         gcc_assert (temp);
8229         return temp;
8230       }
8231
8232     case VEC_UNPACK_FLOAT_HI_EXPR:
8233     case VEC_UNPACK_FLOAT_LO_EXPR:
8234       {
8235         op0 = expand_normal (treeop0);
8236         /* The signedness is determined from input operand.  */
8237         this_optab = optab_for_tree_code (code,
8238                                           TREE_TYPE (treeop0),
8239                                           optab_default);
8240         temp = expand_widen_pattern_expr
8241           (ops, op0, NULL_RTX, NULL_RTX,
8242            target, TYPE_UNSIGNED (TREE_TYPE (treeop0)));
8243
8244         gcc_assert (temp);
8245         return temp;
8246       }
8247
8248     case VEC_WIDEN_MULT_HI_EXPR:
8249     case VEC_WIDEN_MULT_LO_EXPR:
8250       {
8251         tree oprnd0 = treeop0;
8252         tree oprnd1 = treeop1;
8253
8254         expand_operands (oprnd0, oprnd1, NULL_RTX, &op0, &op1, EXPAND_NORMAL);
8255         target = expand_widen_pattern_expr (ops, op0, op1, NULL_RTX,
8256                                             target, unsignedp);
8257         gcc_assert (target);
8258         return target;
8259       }
8260
8261     case VEC_PACK_TRUNC_EXPR:
8262     case VEC_PACK_SAT_EXPR:
8263     case VEC_PACK_FIX_TRUNC_EXPR:
8264       mode = TYPE_MODE (TREE_TYPE (treeop0));
8265       goto binop;
8266
8267     default:
8268       gcc_unreachable ();
8269     }
8270
8271   /* Here to do an ordinary binary operator.  */
8272  binop:
8273   expand_operands (treeop0, treeop1,
8274                    subtarget, &op0, &op1, EXPAND_NORMAL);
8275  binop2:
8276   this_optab = optab_for_tree_code (code, type, optab_default);
8277  binop3:
8278   if (modifier == EXPAND_STACK_PARM)
8279     target = 0;
8280   temp = expand_binop (mode, this_optab, op0, op1, target,
8281                        unsignedp, OPTAB_LIB_WIDEN);
8282   gcc_assert (temp);
8283   return REDUCE_BIT_FIELD (temp);
8284 }
8285 #undef REDUCE_BIT_FIELD
8286
8287 rtx
8288 expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
8289                     enum expand_modifier modifier, rtx *alt_rtl)
8290 {
8291   rtx op0, op1, temp, decl_rtl;
8292   tree type;
8293   int unsignedp;
8294   enum machine_mode mode;
8295   enum tree_code code = TREE_CODE (exp);
8296   optab this_optab;
8297   rtx subtarget, original_target;
8298   int ignore;
8299   tree context;
8300   bool reduce_bit_field;
8301   location_t loc = EXPR_LOCATION (exp);
8302   struct separate_ops ops;
8303   tree treeop0, treeop1, treeop2;
8304   tree ssa_name = NULL_TREE;
8305   gimple g;
8306
8307   type = TREE_TYPE (exp);
8308   mode = TYPE_MODE (type);
8309   unsignedp = TYPE_UNSIGNED (type);
8310
8311   treeop0 = treeop1 = treeop2 = NULL_TREE;
8312   if (!VL_EXP_CLASS_P (exp))
8313     switch (TREE_CODE_LENGTH (code))
8314       {
8315         default:
8316         case 3: treeop2 = TREE_OPERAND (exp, 2);
8317         case 2: treeop1 = TREE_OPERAND (exp, 1);
8318         case 1: treeop0 = TREE_OPERAND (exp, 0);
8319         case 0: break;
8320       }
8321   ops.code = code;
8322   ops.type = type;
8323   ops.op0 = treeop0;
8324   ops.op1 = treeop1;
8325   ops.op2 = treeop2;
8326   ops.location = loc;
8327
8328   ignore = (target == const0_rtx
8329             || ((CONVERT_EXPR_CODE_P (code)
8330                  || code == COND_EXPR || code == VIEW_CONVERT_EXPR)
8331                 && TREE_CODE (type) == VOID_TYPE));
8332
8333   /* An operation in what may be a bit-field type needs the
8334      result to be reduced to the precision of the bit-field type,
8335      which is narrower than that of the type's mode.  */
8336   reduce_bit_field = (!ignore
8337                       && TREE_CODE (type) == INTEGER_TYPE
8338                       && GET_MODE_PRECISION (mode) > TYPE_PRECISION (type));
8339
8340   /* If we are going to ignore this result, we need only do something
8341      if there is a side-effect somewhere in the expression.  If there
8342      is, short-circuit the most common cases here.  Note that we must
8343      not call expand_expr with anything but const0_rtx in case this
8344      is an initial expansion of a size that contains a PLACEHOLDER_EXPR.  */
8345
8346   if (ignore)
8347     {
8348       if (! TREE_SIDE_EFFECTS (exp))
8349         return const0_rtx;
8350
8351       /* Ensure we reference a volatile object even if value is ignored, but
8352          don't do this if all we are doing is taking its address.  */
8353       if (TREE_THIS_VOLATILE (exp)
8354           && TREE_CODE (exp) != FUNCTION_DECL
8355           && mode != VOIDmode && mode != BLKmode
8356           && modifier != EXPAND_CONST_ADDRESS)
8357         {
8358           temp = expand_expr (exp, NULL_RTX, VOIDmode, modifier);
8359           if (MEM_P (temp))
8360             temp = copy_to_reg (temp);
8361           return const0_rtx;
8362         }
8363
8364       if (TREE_CODE_CLASS (code) == tcc_unary
8365           || code == COMPONENT_REF || code == INDIRECT_REF)
8366         return expand_expr (treeop0, const0_rtx, VOIDmode,
8367                             modifier);
8368
8369       else if (TREE_CODE_CLASS (code) == tcc_binary
8370                || TREE_CODE_CLASS (code) == tcc_comparison
8371                || code == ARRAY_REF || code == ARRAY_RANGE_REF)
8372         {
8373           expand_expr (treeop0, const0_rtx, VOIDmode, modifier);
8374           expand_expr (treeop1, const0_rtx, VOIDmode, modifier);
8375           return const0_rtx;
8376         }
8377       else if (code == BIT_FIELD_REF)
8378         {
8379           expand_expr (treeop0, const0_rtx, VOIDmode, modifier);
8380           expand_expr (treeop1, const0_rtx, VOIDmode, modifier);
8381           expand_expr (treeop2, const0_rtx, VOIDmode, modifier);
8382           return const0_rtx;
8383         }
8384
8385       target = 0;
8386     }
8387
8388   if (reduce_bit_field && modifier == EXPAND_STACK_PARM)
8389     target = 0;
8390
8391   /* Use subtarget as the target for operand 0 of a binary operation.  */
8392   subtarget = get_subtarget (target);
8393   original_target = target;
8394
8395   switch (code)
8396     {
8397     case LABEL_DECL:
8398       {
8399         tree function = decl_function_context (exp);
8400
8401         temp = label_rtx (exp);
8402         temp = gen_rtx_LABEL_REF (Pmode, temp);
8403
8404         if (function != current_function_decl
8405             && function != 0)
8406           LABEL_REF_NONLOCAL_P (temp) = 1;
8407
8408         temp = gen_rtx_MEM (FUNCTION_MODE, temp);
8409         return temp;
8410       }
8411
8412     case SSA_NAME:
8413       /* ??? ivopts calls expander, without any preparation from
8414          out-of-ssa.  So fake instructions as if this was an access to the
8415          base variable.  This unnecessarily allocates a pseudo, see how we can
8416          reuse it, if partition base vars have it set already.  */
8417       if (!currently_expanding_to_rtl)
8418         return expand_expr_real_1 (SSA_NAME_VAR (exp), target, tmode, modifier,
8419                                    NULL);
8420
8421       g = get_gimple_for_ssa_name (exp);
8422       if (g)
8423         return expand_expr_real (gimple_assign_rhs_to_tree (g), target, tmode,
8424                                  modifier, NULL);
8425
8426       ssa_name = exp;
8427       decl_rtl = get_rtx_for_ssa_name (ssa_name);
8428       exp = SSA_NAME_VAR (ssa_name);
8429       goto expand_decl_rtl;
8430
8431     case PARM_DECL:
8432     case VAR_DECL:
8433       /* If a static var's type was incomplete when the decl was written,
8434          but the type is complete now, lay out the decl now.  */
8435       if (DECL_SIZE (exp) == 0
8436           && COMPLETE_OR_UNBOUND_ARRAY_TYPE_P (TREE_TYPE (exp))
8437           && (TREE_STATIC (exp) || DECL_EXTERNAL (exp)))
8438         layout_decl (exp, 0);
8439
8440       /* TLS emulation hook - replace __thread vars with
8441          *__emutls_get_address (&_emutls.var).  */
8442       if (! targetm.have_tls
8443           && TREE_CODE (exp) == VAR_DECL
8444           && DECL_THREAD_LOCAL_P (exp))
8445         {
8446           exp = build_fold_indirect_ref_loc (loc, emutls_var_address (exp));
8447           return expand_expr_real_1 (exp, target, tmode, modifier, NULL);
8448         }
8449
8450       /* ... fall through ...  */
8451
8452     case FUNCTION_DECL:
8453     case RESULT_DECL:
8454       decl_rtl = DECL_RTL (exp);
8455     expand_decl_rtl:
8456       gcc_assert (decl_rtl);
8457       decl_rtl = copy_rtx (decl_rtl);
8458       /* Record writes to register variables.  */
8459       if (modifier == EXPAND_WRITE && REG_P (decl_rtl)
8460           && REGNO (decl_rtl) < FIRST_PSEUDO_REGISTER)
8461         {
8462             int i = REGNO (decl_rtl);
8463             int nregs = hard_regno_nregs[i][GET_MODE (decl_rtl)];
8464             while (nregs)
8465               {
8466                 SET_HARD_REG_BIT (crtl->asm_clobbers, i);
8467                 i++;
8468                 nregs--;
8469               }
8470         }
8471
8472       /* Ensure variable marked as used even if it doesn't go through
8473          a parser.  If it hasn't be used yet, write out an external
8474          definition.  */
8475       if (! TREE_USED (exp))
8476         {
8477           assemble_external (exp);
8478           TREE_USED (exp) = 1;
8479         }
8480
8481       /* Show we haven't gotten RTL for this yet.  */
8482       temp = 0;
8483
8484       /* Variables inherited from containing functions should have
8485          been lowered by this point.  */
8486       context = decl_function_context (exp);
8487       gcc_assert (!context
8488                   || context == current_function_decl
8489                   || TREE_STATIC (exp)
8490                   /* ??? C++ creates functions that are not TREE_STATIC.  */
8491                   || TREE_CODE (exp) == FUNCTION_DECL);
8492
8493       /* This is the case of an array whose size is to be determined
8494          from its initializer, while the initializer is still being parsed.
8495          See expand_decl.  */
8496
8497       if (MEM_P (decl_rtl) && REG_P (XEXP (decl_rtl, 0)))
8498         temp = validize_mem (decl_rtl);
8499
8500       /* If DECL_RTL is memory, we are in the normal case and the
8501          address is not valid, get the address into a register.  */
8502
8503       else if (MEM_P (decl_rtl) && modifier != EXPAND_INITIALIZER)
8504         {
8505           if (alt_rtl)
8506             *alt_rtl = decl_rtl;
8507           decl_rtl = use_anchored_address (decl_rtl);
8508           if (modifier != EXPAND_CONST_ADDRESS
8509               && modifier != EXPAND_SUM
8510               && !memory_address_addr_space_p (DECL_MODE (exp),
8511                                                XEXP (decl_rtl, 0),
8512                                                MEM_ADDR_SPACE (decl_rtl)))
8513             temp = replace_equiv_address (decl_rtl,
8514                                           copy_rtx (XEXP (decl_rtl, 0)));
8515         }
8516
8517       /* If we got something, return it.  But first, set the alignment
8518          if the address is a register.  */
8519       if (temp != 0)
8520         {
8521           if (MEM_P (temp) && REG_P (XEXP (temp, 0)))
8522             mark_reg_pointer (XEXP (temp, 0), DECL_ALIGN (exp));
8523
8524           return temp;
8525         }
8526
8527       /* If the mode of DECL_RTL does not match that of the decl, it
8528          must be a promoted value.  We return a SUBREG of the wanted mode,
8529          but mark it so that we know that it was already extended.  */
8530       if (REG_P (decl_rtl) && GET_MODE (decl_rtl) != DECL_MODE (exp))
8531         {
8532           enum machine_mode pmode;
8533
8534           /* Get the signedness to be used for this variable.  Ensure we get
8535              the same mode we got when the variable was declared.  */
8536           if (code == SSA_NAME
8537               && (g = SSA_NAME_DEF_STMT (ssa_name))
8538               && gimple_code (g) == GIMPLE_CALL)
8539             pmode = promote_function_mode (type, mode, &unsignedp,
8540                                            TREE_TYPE
8541                                            (TREE_TYPE (gimple_call_fn (g))),
8542                                            2);
8543           else
8544             pmode = promote_decl_mode (exp, &unsignedp);
8545           gcc_assert (GET_MODE (decl_rtl) == pmode);
8546
8547           temp = gen_lowpart_SUBREG (mode, decl_rtl);
8548           SUBREG_PROMOTED_VAR_P (temp) = 1;
8549           SUBREG_PROMOTED_UNSIGNED_SET (temp, unsignedp);
8550           return temp;
8551         }
8552
8553       return decl_rtl;
8554
8555     case INTEGER_CST:
8556       temp = immed_double_const (TREE_INT_CST_LOW (exp),
8557                                  TREE_INT_CST_HIGH (exp), mode);
8558
8559       return temp;
8560
8561     case VECTOR_CST:
8562       {
8563         tree tmp = NULL_TREE;
8564         if (GET_MODE_CLASS (mode) == MODE_VECTOR_INT
8565             || GET_MODE_CLASS (mode) == MODE_VECTOR_FLOAT
8566             || GET_MODE_CLASS (mode) == MODE_VECTOR_FRACT
8567             || GET_MODE_CLASS (mode) == MODE_VECTOR_UFRACT
8568             || GET_MODE_CLASS (mode) == MODE_VECTOR_ACCUM
8569             || GET_MODE_CLASS (mode) == MODE_VECTOR_UACCUM)
8570           return const_vector_from_tree (exp);
8571         if (GET_MODE_CLASS (mode) == MODE_INT)
8572           {
8573             tree type_for_mode = lang_hooks.types.type_for_mode (mode, 1);
8574             if (type_for_mode)
8575               tmp = fold_unary_loc (loc, VIEW_CONVERT_EXPR, type_for_mode, exp);
8576           }
8577         if (!tmp)
8578           tmp = build_constructor_from_list (type,
8579                                              TREE_VECTOR_CST_ELTS (exp));
8580         return expand_expr (tmp, ignore ? const0_rtx : target,
8581                             tmode, modifier);
8582       }
8583
8584     case CONST_DECL:
8585       return expand_expr (DECL_INITIAL (exp), target, VOIDmode, modifier);
8586
8587     case REAL_CST:
8588       /* If optimized, generate immediate CONST_DOUBLE
8589          which will be turned into memory by reload if necessary.
8590
8591          We used to force a register so that loop.c could see it.  But
8592          this does not allow gen_* patterns to perform optimizations with
8593          the constants.  It also produces two insns in cases like "x = 1.0;".
8594          On most machines, floating-point constants are not permitted in
8595          many insns, so we'd end up copying it to a register in any case.
8596
8597          Now, we do the copying in expand_binop, if appropriate.  */
8598       return CONST_DOUBLE_FROM_REAL_VALUE (TREE_REAL_CST (exp),
8599                                            TYPE_MODE (TREE_TYPE (exp)));
8600
8601     case FIXED_CST:
8602       return CONST_FIXED_FROM_FIXED_VALUE (TREE_FIXED_CST (exp),
8603                                            TYPE_MODE (TREE_TYPE (exp)));
8604
8605     case COMPLEX_CST:
8606       /* Handle evaluating a complex constant in a CONCAT target.  */
8607       if (original_target && GET_CODE (original_target) == CONCAT)
8608         {
8609           enum machine_mode mode = TYPE_MODE (TREE_TYPE (TREE_TYPE (exp)));
8610           rtx rtarg, itarg;
8611
8612           rtarg = XEXP (original_target, 0);
8613           itarg = XEXP (original_target, 1);
8614
8615           /* Move the real and imaginary parts separately.  */
8616           op0 = expand_expr (TREE_REALPART (exp), rtarg, mode, EXPAND_NORMAL);
8617           op1 = expand_expr (TREE_IMAGPART (exp), itarg, mode, EXPAND_NORMAL);
8618
8619           if (op0 != rtarg)
8620             emit_move_insn (rtarg, op0);
8621           if (op1 != itarg)
8622             emit_move_insn (itarg, op1);
8623
8624           return original_target;
8625         }
8626
8627       /* ... fall through ...  */
8628
8629     case STRING_CST:
8630       temp = expand_expr_constant (exp, 1, modifier);
8631
8632       /* temp contains a constant address.
8633          On RISC machines where a constant address isn't valid,
8634          make some insns to get that address into a register.  */
8635       if (modifier != EXPAND_CONST_ADDRESS
8636           && modifier != EXPAND_INITIALIZER
8637           && modifier != EXPAND_SUM
8638           && ! memory_address_addr_space_p (mode, XEXP (temp, 0),
8639                                             MEM_ADDR_SPACE (temp)))
8640         return replace_equiv_address (temp,
8641                                       copy_rtx (XEXP (temp, 0)));
8642       return temp;
8643
8644     case SAVE_EXPR:
8645       {
8646         tree val = treeop0;
8647         rtx ret = expand_expr_real_1 (val, target, tmode, modifier, alt_rtl);
8648
8649         if (!SAVE_EXPR_RESOLVED_P (exp))
8650           {
8651             /* We can indeed still hit this case, typically via builtin
8652                expanders calling save_expr immediately before expanding
8653                something.  Assume this means that we only have to deal
8654                with non-BLKmode values.  */
8655             gcc_assert (GET_MODE (ret) != BLKmode);
8656
8657             val = build_decl (EXPR_LOCATION (exp),
8658                               VAR_DECL, NULL, TREE_TYPE (exp));
8659             DECL_ARTIFICIAL (val) = 1;
8660             DECL_IGNORED_P (val) = 1;
8661             treeop0 = val;
8662             TREE_OPERAND (exp, 0) = treeop0;
8663             SAVE_EXPR_RESOLVED_P (exp) = 1;
8664
8665             if (!CONSTANT_P (ret))
8666               ret = copy_to_reg (ret);
8667             SET_DECL_RTL (val, ret);
8668           }
8669
8670         return ret;
8671       }
8672
8673
8674     case CONSTRUCTOR:
8675       /* If we don't need the result, just ensure we evaluate any
8676          subexpressions.  */
8677       if (ignore)
8678         {
8679           unsigned HOST_WIDE_INT idx;
8680           tree value;
8681
8682           FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (exp), idx, value)
8683             expand_expr (value, const0_rtx, VOIDmode, EXPAND_NORMAL);
8684
8685           return const0_rtx;
8686         }
8687
8688       return expand_constructor (exp, target, modifier, false);
8689
8690     case MISALIGNED_INDIRECT_REF:
8691     case ALIGN_INDIRECT_REF:
8692     case INDIRECT_REF:
8693       {
8694         tree exp1 = treeop0;
8695         addr_space_t as = ADDR_SPACE_GENERIC;
8696         enum machine_mode address_mode = Pmode;
8697
8698         if (modifier != EXPAND_WRITE)
8699           {
8700             tree t;
8701
8702             t = fold_read_from_constant_string (exp);
8703             if (t)
8704               return expand_expr (t, target, tmode, modifier);
8705           }
8706
8707         if (POINTER_TYPE_P (TREE_TYPE (exp1)))
8708           {
8709             as = TYPE_ADDR_SPACE (TREE_TYPE (TREE_TYPE (exp1)));
8710             address_mode = targetm.addr_space.address_mode (as);
8711           }
8712
8713         op0 = expand_expr (exp1, NULL_RTX, VOIDmode, EXPAND_SUM);
8714         op0 = memory_address_addr_space (mode, op0, as);
8715
8716         if (code == ALIGN_INDIRECT_REF)
8717           {
8718             int align = TYPE_ALIGN_UNIT (type);
8719             op0 = gen_rtx_AND (address_mode, op0, GEN_INT (-align));
8720             op0 = memory_address_addr_space (mode, op0, as);
8721           }
8722
8723         temp = gen_rtx_MEM (mode, op0);
8724
8725         set_mem_attributes (temp, exp, 0);
8726         set_mem_addr_space (temp, as);
8727
8728         /* Resolve the misalignment now, so that we don't have to remember
8729            to resolve it later.  Of course, this only works for reads.  */
8730         if (code == MISALIGNED_INDIRECT_REF)
8731           {
8732             int icode;
8733             rtx reg, insn;
8734
8735             gcc_assert (modifier == EXPAND_NORMAL
8736                         || modifier == EXPAND_STACK_PARM);
8737
8738             /* The vectorizer should have already checked the mode.  */
8739             icode = optab_handler (movmisalign_optab, mode)->insn_code;
8740             gcc_assert (icode != CODE_FOR_nothing);
8741
8742             /* We've already validated the memory, and we're creating a
8743                new pseudo destination.  The predicates really can't fail.  */
8744             reg = gen_reg_rtx (mode);
8745
8746             /* Nor can the insn generator.  */
8747             insn = GEN_FCN (icode) (reg, temp);
8748             emit_insn (insn);
8749
8750             return reg;
8751           }
8752
8753         return temp;
8754       }
8755
8756     case TARGET_MEM_REF:
8757       {
8758         addr_space_t as = TYPE_ADDR_SPACE (TREE_TYPE (exp));
8759         struct mem_address addr;
8760         tree base;
8761
8762         get_address_description (exp, &addr);
8763         op0 = addr_for_mem_ref (&addr, as, true);
8764         op0 = memory_address_addr_space (mode, op0, as);
8765         temp = gen_rtx_MEM (mode, op0);
8766         set_mem_attributes (temp, TMR_ORIGINAL (exp), 0);
8767         set_mem_addr_space (temp, as);
8768         base = get_base_address (TMR_ORIGINAL (exp));
8769         if (INDIRECT_REF_P (base)
8770             && TMR_BASE (exp)
8771             && TREE_CODE (TMR_BASE (exp)) == SSA_NAME
8772             && POINTER_TYPE_P (TREE_TYPE (TMR_BASE (exp))))
8773           {
8774             set_mem_expr (temp, build1 (INDIRECT_REF,
8775                                         TREE_TYPE (exp), TMR_BASE (exp)));
8776             set_mem_offset (temp, NULL_RTX);
8777           }
8778       }
8779       return temp;
8780
8781     case ARRAY_REF:
8782
8783       {
8784         tree array = treeop0;
8785         tree index = treeop1;
8786
8787         /* Fold an expression like: "foo"[2].
8788            This is not done in fold so it won't happen inside &.
8789            Don't fold if this is for wide characters since it's too
8790            difficult to do correctly and this is a very rare case.  */
8791
8792         if (modifier != EXPAND_CONST_ADDRESS
8793             && modifier != EXPAND_INITIALIZER
8794             && modifier != EXPAND_MEMORY)
8795           {
8796             tree t = fold_read_from_constant_string (exp);
8797
8798             if (t)
8799               return expand_expr (t, target, tmode, modifier);
8800           }
8801
8802         /* If this is a constant index into a constant array,
8803            just get the value from the array.  Handle both the cases when
8804            we have an explicit constructor and when our operand is a variable
8805            that was declared const.  */
8806
8807         if (modifier != EXPAND_CONST_ADDRESS
8808             && modifier != EXPAND_INITIALIZER
8809             && modifier != EXPAND_MEMORY
8810             && TREE_CODE (array) == CONSTRUCTOR
8811             && ! TREE_SIDE_EFFECTS (array)
8812             && TREE_CODE (index) == INTEGER_CST)
8813           {
8814             unsigned HOST_WIDE_INT ix;
8815             tree field, value;
8816
8817             FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (array), ix,
8818                                       field, value)
8819               if (tree_int_cst_equal (field, index))
8820                 {
8821                   if (!TREE_SIDE_EFFECTS (value))
8822                     return expand_expr (fold (value), target, tmode, modifier);
8823                   break;
8824                 }
8825           }
8826
8827         else if (optimize >= 1
8828                  && modifier != EXPAND_CONST_ADDRESS
8829                  && modifier != EXPAND_INITIALIZER
8830                  && modifier != EXPAND_MEMORY
8831                  && TREE_READONLY (array) && ! TREE_SIDE_EFFECTS (array)
8832                  && TREE_CODE (array) == VAR_DECL && DECL_INITIAL (array)
8833                  && TREE_CODE (DECL_INITIAL (array)) != ERROR_MARK
8834                  && targetm.binds_local_p (array))
8835           {
8836             if (TREE_CODE (index) == INTEGER_CST)
8837               {
8838                 tree init = DECL_INITIAL (array);
8839
8840                 if (TREE_CODE (init) == CONSTRUCTOR)
8841                   {
8842                     unsigned HOST_WIDE_INT ix;
8843                     tree field, value;
8844
8845                     FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (init), ix,
8846                                               field, value)
8847                       if (tree_int_cst_equal (field, index))
8848                         {
8849                           if (TREE_SIDE_EFFECTS (value))
8850                             break;
8851
8852                           if (TREE_CODE (value) == CONSTRUCTOR)
8853                             {
8854                               /* If VALUE is a CONSTRUCTOR, this
8855                                  optimization is only useful if
8856                                  this doesn't store the CONSTRUCTOR
8857                                  into memory.  If it does, it is more
8858                                  efficient to just load the data from
8859                                  the array directly.  */
8860                               rtx ret = expand_constructor (value, target,
8861                                                             modifier, true);
8862                               if (ret == NULL_RTX)
8863                                 break;
8864                             }
8865
8866                           return expand_expr (fold (value), target, tmode,
8867                                               modifier);
8868                         }
8869                   }
8870                 else if(TREE_CODE (init) == STRING_CST)
8871                   {
8872                     tree index1 = index;
8873                     tree low_bound = array_ref_low_bound (exp);
8874                     index1 = fold_convert_loc (loc, sizetype,
8875                                                treeop1);
8876
8877                     /* Optimize the special-case of a zero lower bound.
8878
8879                        We convert the low_bound to sizetype to avoid some problems
8880                        with constant folding.  (E.g. suppose the lower bound is 1,
8881                        and its mode is QI.  Without the conversion,l (ARRAY
8882                        +(INDEX-(unsigned char)1)) becomes ((ARRAY+(-(unsigned char)1))
8883                        +INDEX), which becomes (ARRAY+255+INDEX).  Opps!)  */
8884
8885                     if (! integer_zerop (low_bound))
8886                       index1 = size_diffop_loc (loc, index1,
8887                                             fold_convert_loc (loc, sizetype,
8888                                                               low_bound));
8889
8890                     if (0 > compare_tree_int (index1,
8891                                               TREE_STRING_LENGTH (init)))
8892                       {
8893                         tree type = TREE_TYPE (TREE_TYPE (init));
8894                         enum machine_mode mode = TYPE_MODE (type);
8895
8896                         if (GET_MODE_CLASS (mode) == MODE_INT
8897                             && GET_MODE_SIZE (mode) == 1)
8898                           return gen_int_mode (TREE_STRING_POINTER (init)
8899                                                [TREE_INT_CST_LOW (index1)],
8900                                                mode);
8901                       }
8902                   }
8903               }
8904           }
8905       }
8906       goto normal_inner_ref;
8907
8908     case COMPONENT_REF:
8909       /* If the operand is a CONSTRUCTOR, we can just extract the
8910          appropriate field if it is present.  */
8911       if (TREE_CODE (treeop0) == CONSTRUCTOR)
8912         {
8913           unsigned HOST_WIDE_INT idx;
8914           tree field, value;
8915
8916           FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (treeop0),
8917                                     idx, field, value)
8918             if (field == treeop1
8919                 /* We can normally use the value of the field in the
8920                    CONSTRUCTOR.  However, if this is a bitfield in
8921                    an integral mode that we can fit in a HOST_WIDE_INT,
8922                    we must mask only the number of bits in the bitfield,
8923                    since this is done implicitly by the constructor.  If
8924                    the bitfield does not meet either of those conditions,
8925                    we can't do this optimization.  */
8926                 && (! DECL_BIT_FIELD (field)
8927                     || ((GET_MODE_CLASS (DECL_MODE (field)) == MODE_INT)
8928                         && (GET_MODE_BITSIZE (DECL_MODE (field))
8929                             <= HOST_BITS_PER_WIDE_INT))))
8930               {
8931                 if (DECL_BIT_FIELD (field)
8932                     && modifier == EXPAND_STACK_PARM)
8933                   target = 0;
8934                 op0 = expand_expr (value, target, tmode, modifier);
8935                 if (DECL_BIT_FIELD (field))
8936                   {
8937                     HOST_WIDE_INT bitsize = TREE_INT_CST_LOW (DECL_SIZE (field));
8938                     enum machine_mode imode = TYPE_MODE (TREE_TYPE (field));
8939
8940                     if (TYPE_UNSIGNED (TREE_TYPE (field)))
8941                       {
8942                         op1 = GEN_INT (((HOST_WIDE_INT) 1 << bitsize) - 1);
8943                         op0 = expand_and (imode, op0, op1, target);
8944                       }
8945                     else
8946                       {
8947                         tree count
8948                           = build_int_cst (NULL_TREE,
8949                                            GET_MODE_BITSIZE (imode) - bitsize);
8950
8951                         op0 = expand_shift (LSHIFT_EXPR, imode, op0, count,
8952                                             target, 0);
8953                         op0 = expand_shift (RSHIFT_EXPR, imode, op0, count,
8954                                             target, 0);
8955                       }
8956                   }
8957
8958                 return op0;
8959               }
8960         }
8961       goto normal_inner_ref;
8962
8963     case BIT_FIELD_REF:
8964     case ARRAY_RANGE_REF:
8965     normal_inner_ref:
8966       {
8967         enum machine_mode mode1, mode2;
8968         HOST_WIDE_INT bitsize, bitpos;
8969         tree offset;
8970         int volatilep = 0, must_force_mem;
8971         tree tem = get_inner_reference (exp, &bitsize, &bitpos, &offset,
8972                                         &mode1, &unsignedp, &volatilep, true);
8973         rtx orig_op0, memloc;
8974
8975         /* If we got back the original object, something is wrong.  Perhaps
8976            we are evaluating an expression too early.  In any event, don't
8977            infinitely recurse.  */
8978         gcc_assert (tem != exp);
8979
8980         /* If TEM's type is a union of variable size, pass TARGET to the inner
8981            computation, since it will need a temporary and TARGET is known
8982            to have to do.  This occurs in unchecked conversion in Ada.  */
8983         orig_op0 = op0
8984           = expand_expr (tem,
8985                          (TREE_CODE (TREE_TYPE (tem)) == UNION_TYPE
8986                           && (TREE_CODE (TYPE_SIZE (TREE_TYPE (tem)))
8987                               != INTEGER_CST)
8988                           && modifier != EXPAND_STACK_PARM
8989                           ? target : NULL_RTX),
8990                          VOIDmode,
8991                          (modifier == EXPAND_INITIALIZER
8992                           || modifier == EXPAND_CONST_ADDRESS
8993                           || modifier == EXPAND_STACK_PARM)
8994                          ? modifier : EXPAND_NORMAL);
8995
8996
8997         /* If the bitfield is volatile, we want to access it in the
8998            field's mode, not the computed mode.  */
8999         if (volatilep
9000             && GET_CODE (op0) == MEM
9001             && flag_strict_volatile_bitfields > 0)
9002           op0 = adjust_address (op0, mode1, 0);
9003
9004         mode2
9005           = CONSTANT_P (op0) ? TYPE_MODE (TREE_TYPE (tem)) : GET_MODE (op0);
9006
9007         /* If we have either an offset, a BLKmode result, or a reference
9008            outside the underlying object, we must force it to memory.
9009            Such a case can occur in Ada if we have unchecked conversion
9010            of an expression from a scalar type to an aggregate type or
9011            for an ARRAY_RANGE_REF whose type is BLKmode, or if we were
9012            passed a partially uninitialized object or a view-conversion
9013            to a larger size.  */
9014         must_force_mem = (offset
9015                           || mode1 == BLKmode
9016                           || bitpos + bitsize > GET_MODE_BITSIZE (mode2));
9017
9018         /* Handle CONCAT first.  */
9019         if (GET_CODE (op0) == CONCAT && !must_force_mem)
9020           {
9021             if (bitpos == 0
9022                 && bitsize == GET_MODE_BITSIZE (GET_MODE (op0)))
9023               return op0;
9024             if (bitpos == 0
9025                 && bitsize == GET_MODE_BITSIZE (GET_MODE (XEXP (op0, 0)))
9026                 && bitsize)
9027               {
9028                 op0 = XEXP (op0, 0);
9029                 mode2 = GET_MODE (op0);
9030               }
9031             else if (bitpos == GET_MODE_BITSIZE (GET_MODE (XEXP (op0, 0)))
9032                      && bitsize == GET_MODE_BITSIZE (GET_MODE (XEXP (op0, 1)))
9033                      && bitpos
9034                      && bitsize)
9035               {
9036                 op0 = XEXP (op0, 1);
9037                 bitpos = 0;
9038                 mode2 = GET_MODE (op0);
9039               }
9040             else
9041               /* Otherwise force into memory.  */
9042               must_force_mem = 1;
9043           }
9044
9045         /* If this is a constant, put it in a register if it is a legitimate
9046            constant and we don't need a memory reference.  */
9047         if (CONSTANT_P (op0)
9048             && mode2 != BLKmode
9049             && LEGITIMATE_CONSTANT_P (op0)
9050             && !must_force_mem)
9051           op0 = force_reg (mode2, op0);
9052
9053         /* Otherwise, if this is a constant, try to force it to the constant
9054            pool.  Note that back-ends, e.g. MIPS, may refuse to do so if it
9055            is a legitimate constant.  */
9056         else if (CONSTANT_P (op0) && (memloc = force_const_mem (mode2, op0)))
9057           op0 = validize_mem (memloc);
9058
9059         /* Otherwise, if this is a constant or the object is not in memory
9060            and need be, put it there.  */
9061         else if (CONSTANT_P (op0) || (!MEM_P (op0) && must_force_mem))
9062           {
9063             tree nt = build_qualified_type (TREE_TYPE (tem),
9064                                             (TYPE_QUALS (TREE_TYPE (tem))
9065                                              | TYPE_QUAL_CONST));
9066             memloc = assign_temp (nt, 1, 1, 1);
9067             emit_move_insn (memloc, op0);
9068             op0 = memloc;
9069           }
9070
9071         if (offset)
9072           {
9073             enum machine_mode address_mode;
9074             rtx offset_rtx = expand_expr (offset, NULL_RTX, VOIDmode,
9075                                           EXPAND_SUM);
9076
9077             gcc_assert (MEM_P (op0));
9078
9079             address_mode
9080               = targetm.addr_space.address_mode (MEM_ADDR_SPACE (op0));
9081             if (GET_MODE (offset_rtx) != address_mode)
9082               offset_rtx = convert_to_mode (address_mode, offset_rtx, 0);
9083
9084             if (GET_MODE (op0) == BLKmode
9085                 /* A constant address in OP0 can have VOIDmode, we must
9086                    not try to call force_reg in that case.  */
9087                 && GET_MODE (XEXP (op0, 0)) != VOIDmode
9088                 && bitsize != 0
9089                 && (bitpos % bitsize) == 0
9090                 && (bitsize % GET_MODE_ALIGNMENT (mode1)) == 0
9091                 && MEM_ALIGN (op0) == GET_MODE_ALIGNMENT (mode1))
9092               {
9093                 op0 = adjust_address (op0, mode1, bitpos / BITS_PER_UNIT);
9094                 bitpos = 0;
9095               }
9096
9097             op0 = offset_address (op0, offset_rtx,
9098                                   highest_pow2_factor (offset));
9099           }
9100
9101         /* If OFFSET is making OP0 more aligned than BIGGEST_ALIGNMENT,
9102            record its alignment as BIGGEST_ALIGNMENT.  */
9103         if (MEM_P (op0) && bitpos == 0 && offset != 0
9104             && is_aligning_offset (offset, tem))
9105           set_mem_align (op0, BIGGEST_ALIGNMENT);
9106
9107         /* Don't forget about volatility even if this is a bitfield.  */
9108         if (MEM_P (op0) && volatilep && ! MEM_VOLATILE_P (op0))
9109           {
9110             if (op0 == orig_op0)
9111               op0 = copy_rtx (op0);
9112
9113             MEM_VOLATILE_P (op0) = 1;
9114           }
9115
9116         /* In cases where an aligned union has an unaligned object
9117            as a field, we might be extracting a BLKmode value from
9118            an integer-mode (e.g., SImode) object.  Handle this case
9119            by doing the extract into an object as wide as the field
9120            (which we know to be the width of a basic mode), then
9121            storing into memory, and changing the mode to BLKmode.  */
9122         if (mode1 == VOIDmode
9123             || REG_P (op0) || GET_CODE (op0) == SUBREG
9124             || (mode1 != BLKmode && ! direct_load[(int) mode1]
9125                 && GET_MODE_CLASS (mode) != MODE_COMPLEX_INT
9126                 && GET_MODE_CLASS (mode) != MODE_COMPLEX_FLOAT
9127                 && modifier != EXPAND_CONST_ADDRESS
9128                 && modifier != EXPAND_INITIALIZER)
9129             /* If the field is volatile, we always want an aligned
9130                access.  */
9131             || (volatilep && flag_strict_volatile_bitfields > 0)
9132             /* If the field isn't aligned enough to fetch as a memref,
9133                fetch it as a bit field.  */
9134             || (mode1 != BLKmode
9135                 && (((TYPE_ALIGN (TREE_TYPE (tem)) < GET_MODE_ALIGNMENT (mode)
9136                       || (bitpos % GET_MODE_ALIGNMENT (mode) != 0)
9137                       || (MEM_P (op0)
9138                           && (MEM_ALIGN (op0) < GET_MODE_ALIGNMENT (mode1)
9139                               || (bitpos % GET_MODE_ALIGNMENT (mode1) != 0))))
9140                      && ((modifier == EXPAND_CONST_ADDRESS
9141                           || modifier == EXPAND_INITIALIZER)
9142                          ? STRICT_ALIGNMENT
9143                          : SLOW_UNALIGNED_ACCESS (mode1, MEM_ALIGN (op0))))
9144                     || (bitpos % BITS_PER_UNIT != 0)))
9145             /* If the type and the field are a constant size and the
9146                size of the type isn't the same size as the bitfield,
9147                we must use bitfield operations.  */
9148             || (bitsize >= 0
9149                 && TYPE_SIZE (TREE_TYPE (exp))
9150                 && TREE_CODE (TYPE_SIZE (TREE_TYPE (exp))) == INTEGER_CST
9151                 && 0 != compare_tree_int (TYPE_SIZE (TREE_TYPE (exp)),
9152                                           bitsize)))
9153           {
9154             enum machine_mode ext_mode = mode;
9155
9156             if (ext_mode == BLKmode
9157                 && ! (target != 0 && MEM_P (op0)
9158                       && MEM_P (target)
9159                       && bitpos % BITS_PER_UNIT == 0))
9160               ext_mode = mode_for_size (bitsize, MODE_INT, 1);
9161
9162             if (ext_mode == BLKmode)
9163               {
9164                 if (target == 0)
9165                   target = assign_temp (type, 0, 1, 1);
9166
9167                 if (bitsize == 0)
9168                   return target;
9169
9170                 /* In this case, BITPOS must start at a byte boundary and
9171                    TARGET, if specified, must be a MEM.  */
9172                 gcc_assert (MEM_P (op0)
9173                             && (!target || MEM_P (target))
9174                             && !(bitpos % BITS_PER_UNIT));
9175
9176                 emit_block_move (target,
9177                                  adjust_address (op0, VOIDmode,
9178                                                  bitpos / BITS_PER_UNIT),
9179                                  GEN_INT ((bitsize + BITS_PER_UNIT - 1)
9180                                           / BITS_PER_UNIT),
9181                                  (modifier == EXPAND_STACK_PARM
9182                                   ? BLOCK_OP_CALL_PARM : BLOCK_OP_NORMAL));
9183
9184                 return target;
9185               }
9186
9187             op0 = validize_mem (op0);
9188
9189             if (MEM_P (op0) && REG_P (XEXP (op0, 0)))
9190               mark_reg_pointer (XEXP (op0, 0), MEM_ALIGN (op0));
9191
9192             op0 = extract_bit_field (op0, bitsize, bitpos, unsignedp,
9193                                      (modifier == EXPAND_STACK_PARM
9194                                       ? NULL_RTX : target),
9195                                      ext_mode, ext_mode);
9196
9197             /* If the result is a record type and BITSIZE is narrower than
9198                the mode of OP0, an integral mode, and this is a big endian
9199                machine, we must put the field into the high-order bits.  */
9200             if (TREE_CODE (type) == RECORD_TYPE && BYTES_BIG_ENDIAN
9201                 && GET_MODE_CLASS (GET_MODE (op0)) == MODE_INT
9202                 && bitsize < (HOST_WIDE_INT) GET_MODE_BITSIZE (GET_MODE (op0)))
9203               op0 = expand_shift (LSHIFT_EXPR, GET_MODE (op0), op0,
9204                                   size_int (GET_MODE_BITSIZE (GET_MODE (op0))
9205                                             - bitsize),
9206                                   op0, 1);
9207
9208             /* If the result type is BLKmode, store the data into a temporary
9209                of the appropriate type, but with the mode corresponding to the
9210                mode for the data we have (op0's mode).  It's tempting to make
9211                this a constant type, since we know it's only being stored once,
9212                but that can cause problems if we are taking the address of this
9213                COMPONENT_REF because the MEM of any reference via that address
9214                will have flags corresponding to the type, which will not
9215                necessarily be constant.  */
9216             if (mode == BLKmode)
9217               {
9218                 HOST_WIDE_INT size = GET_MODE_BITSIZE (ext_mode);
9219                 rtx new_rtx;
9220
9221                 /* If the reference doesn't use the alias set of its type,
9222                    we cannot create the temporary using that type.  */
9223                 if (component_uses_parent_alias_set (exp))
9224                   {
9225                     new_rtx = assign_stack_local (ext_mode, size, 0);
9226                     set_mem_alias_set (new_rtx, get_alias_set (exp));
9227                   }
9228                 else
9229                   new_rtx = assign_stack_temp_for_type (ext_mode, size, 0, type);
9230
9231                 emit_move_insn (new_rtx, op0);
9232                 op0 = copy_rtx (new_rtx);
9233                 PUT_MODE (op0, BLKmode);
9234                 set_mem_attributes (op0, exp, 1);
9235               }
9236
9237             return op0;
9238           }
9239
9240         /* If the result is BLKmode, use that to access the object
9241            now as well.  */
9242         if (mode == BLKmode)
9243           mode1 = BLKmode;
9244
9245         /* Get a reference to just this component.  */
9246         if (modifier == EXPAND_CONST_ADDRESS
9247             || modifier == EXPAND_SUM || modifier == EXPAND_INITIALIZER)
9248           op0 = adjust_address_nv (op0, mode1, bitpos / BITS_PER_UNIT);
9249         else
9250           op0 = adjust_address (op0, mode1, bitpos / BITS_PER_UNIT);
9251
9252         if (op0 == orig_op0)
9253           op0 = copy_rtx (op0);
9254
9255         set_mem_attributes (op0, exp, 0);
9256         if (REG_P (XEXP (op0, 0)))
9257           mark_reg_pointer (XEXP (op0, 0), MEM_ALIGN (op0));
9258
9259         MEM_VOLATILE_P (op0) |= volatilep;
9260         if (mode == mode1 || mode1 == BLKmode || mode1 == tmode
9261             || modifier == EXPAND_CONST_ADDRESS
9262             || modifier == EXPAND_INITIALIZER)
9263           return op0;
9264         else if (target == 0)
9265           target = gen_reg_rtx (tmode != VOIDmode ? tmode : mode);
9266
9267         convert_move (target, op0, unsignedp);
9268         return target;
9269       }
9270
9271     case OBJ_TYPE_REF:
9272       return expand_expr (OBJ_TYPE_REF_EXPR (exp), target, tmode, modifier);
9273
9274     case CALL_EXPR:
9275       /* All valid uses of __builtin_va_arg_pack () are removed during
9276          inlining.  */
9277       if (CALL_EXPR_VA_ARG_PACK (exp))
9278         error ("%Kinvalid use of %<__builtin_va_arg_pack ()%>", exp);
9279       {
9280         tree fndecl = get_callee_fndecl (exp), attr;
9281
9282         if (fndecl
9283             && (attr = lookup_attribute ("error",
9284                                          DECL_ATTRIBUTES (fndecl))) != NULL)
9285           error ("%Kcall to %qs declared with attribute error: %s",
9286                  exp, identifier_to_locale (lang_hooks.decl_printable_name (fndecl, 1)),
9287                  TREE_STRING_POINTER (TREE_VALUE (TREE_VALUE (attr))));
9288         if (fndecl
9289             && (attr = lookup_attribute ("warning",
9290                                          DECL_ATTRIBUTES (fndecl))) != NULL)
9291           warning_at (tree_nonartificial_location (exp),
9292                       0, "%Kcall to %qs declared with attribute warning: %s",
9293                       exp, identifier_to_locale (lang_hooks.decl_printable_name (fndecl, 1)),
9294                       TREE_STRING_POINTER (TREE_VALUE (TREE_VALUE (attr))));
9295
9296         /* Check for a built-in function.  */
9297         if (fndecl && DECL_BUILT_IN (fndecl))
9298           {
9299             gcc_assert (DECL_BUILT_IN_CLASS (fndecl) != BUILT_IN_FRONTEND);
9300             return expand_builtin (exp, target, subtarget, tmode, ignore);
9301           }
9302       }
9303       return expand_call (exp, target, ignore);
9304
9305     case VIEW_CONVERT_EXPR:
9306       op0 = NULL_RTX;
9307
9308       /* If we are converting to BLKmode, try to avoid an intermediate
9309          temporary by fetching an inner memory reference.  */
9310       if (mode == BLKmode
9311           && TREE_CODE (TYPE_SIZE (TREE_TYPE (exp))) == INTEGER_CST
9312           && TYPE_MODE (TREE_TYPE (treeop0)) != BLKmode
9313           && handled_component_p (treeop0))
9314       {
9315         enum machine_mode mode1;
9316         HOST_WIDE_INT bitsize, bitpos;
9317         tree offset;
9318         int unsignedp;
9319         int volatilep = 0;
9320         tree tem
9321           = get_inner_reference (treeop0, &bitsize, &bitpos,
9322                                  &offset, &mode1, &unsignedp, &volatilep,
9323                                  true);
9324         rtx orig_op0;
9325
9326         /* ??? We should work harder and deal with non-zero offsets.  */
9327         if (!offset
9328             && (bitpos % BITS_PER_UNIT) == 0
9329             && bitsize >= 0
9330             && compare_tree_int (TYPE_SIZE (TREE_TYPE (exp)), bitsize) == 0)
9331           {
9332             /* See the normal_inner_ref case for the rationale.  */
9333             orig_op0
9334               = expand_expr (tem,
9335                              (TREE_CODE (TREE_TYPE (tem)) == UNION_TYPE
9336                               && (TREE_CODE (TYPE_SIZE (TREE_TYPE (tem)))
9337                                   != INTEGER_CST)
9338                               && modifier != EXPAND_STACK_PARM
9339                               ? target : NULL_RTX),
9340                              VOIDmode,
9341                              (modifier == EXPAND_INITIALIZER
9342                               || modifier == EXPAND_CONST_ADDRESS
9343                               || modifier == EXPAND_STACK_PARM)
9344                              ? modifier : EXPAND_NORMAL);
9345
9346             if (MEM_P (orig_op0))
9347               {
9348                 op0 = orig_op0;
9349
9350                 /* Get a reference to just this component.  */
9351                 if (modifier == EXPAND_CONST_ADDRESS
9352                     || modifier == EXPAND_SUM
9353                     || modifier == EXPAND_INITIALIZER)
9354                   op0 = adjust_address_nv (op0, mode, bitpos / BITS_PER_UNIT);
9355                 else
9356                   op0 = adjust_address (op0, mode, bitpos / BITS_PER_UNIT);
9357
9358                 if (op0 == orig_op0)
9359                   op0 = copy_rtx (op0);
9360
9361                 set_mem_attributes (op0, treeop0, 0);
9362                 if (REG_P (XEXP (op0, 0)))
9363                   mark_reg_pointer (XEXP (op0, 0), MEM_ALIGN (op0));
9364
9365                 MEM_VOLATILE_P (op0) |= volatilep;
9366               }
9367           }
9368       }
9369
9370       if (!op0)
9371         op0 = expand_expr (treeop0,
9372                            NULL_RTX, VOIDmode, modifier);
9373
9374       /* If the input and output modes are both the same, we are done.  */
9375       if (mode == GET_MODE (op0))
9376         ;
9377       /* If neither mode is BLKmode, and both modes are the same size
9378          then we can use gen_lowpart.  */
9379       else if (mode != BLKmode && GET_MODE (op0) != BLKmode
9380                && GET_MODE_SIZE (mode) == GET_MODE_SIZE (GET_MODE (op0))
9381                && !COMPLEX_MODE_P (GET_MODE (op0)))
9382         {
9383           if (GET_CODE (op0) == SUBREG)
9384             op0 = force_reg (GET_MODE (op0), op0);
9385           op0 = gen_lowpart (mode, op0);
9386         }
9387       /* If both types are integral, convert from one mode to the other.  */
9388       else if (INTEGRAL_TYPE_P (type) && INTEGRAL_TYPE_P (TREE_TYPE (treeop0)))
9389         op0 = convert_modes (mode, GET_MODE (op0), op0,
9390                              TYPE_UNSIGNED (TREE_TYPE (treeop0)));
9391       /* As a last resort, spill op0 to memory, and reload it in a
9392          different mode.  */
9393       else if (!MEM_P (op0))
9394         {
9395           /* If the operand is not a MEM, force it into memory.  Since we
9396              are going to be changing the mode of the MEM, don't call
9397              force_const_mem for constants because we don't allow pool
9398              constants to change mode.  */
9399           tree inner_type = TREE_TYPE (treeop0);
9400
9401           gcc_assert (!TREE_ADDRESSABLE (exp));
9402
9403           if (target == 0 || GET_MODE (target) != TYPE_MODE (inner_type))
9404             target
9405               = assign_stack_temp_for_type
9406                 (TYPE_MODE (inner_type),
9407                  GET_MODE_SIZE (TYPE_MODE (inner_type)), 0, inner_type);
9408
9409           emit_move_insn (target, op0);
9410           op0 = target;
9411         }
9412
9413       /* At this point, OP0 is in the correct mode.  If the output type is
9414          such that the operand is known to be aligned, indicate that it is.
9415          Otherwise, we need only be concerned about alignment for non-BLKmode
9416          results.  */
9417       if (MEM_P (op0))
9418         {
9419           op0 = copy_rtx (op0);
9420
9421           if (TYPE_ALIGN_OK (type))
9422             set_mem_align (op0, MAX (MEM_ALIGN (op0), TYPE_ALIGN (type)));
9423           else if (STRICT_ALIGNMENT
9424                    && mode != BLKmode
9425                    && MEM_ALIGN (op0) < GET_MODE_ALIGNMENT (mode))
9426             {
9427               tree inner_type = TREE_TYPE (treeop0);
9428               HOST_WIDE_INT temp_size
9429                 = MAX (int_size_in_bytes (inner_type),
9430                        (HOST_WIDE_INT) GET_MODE_SIZE (mode));
9431               rtx new_rtx
9432                 = assign_stack_temp_for_type (mode, temp_size, 0, type);
9433               rtx new_with_op0_mode
9434                 = adjust_address (new_rtx, GET_MODE (op0), 0);
9435
9436               gcc_assert (!TREE_ADDRESSABLE (exp));
9437
9438               if (GET_MODE (op0) == BLKmode)
9439                 emit_block_move (new_with_op0_mode, op0,
9440                                  GEN_INT (GET_MODE_SIZE (mode)),
9441                                  (modifier == EXPAND_STACK_PARM
9442                                   ? BLOCK_OP_CALL_PARM : BLOCK_OP_NORMAL));
9443               else
9444                 emit_move_insn (new_with_op0_mode, op0);
9445
9446               op0 = new_rtx;
9447             }
9448
9449           op0 = adjust_address (op0, mode, 0);
9450         }
9451
9452       return op0;
9453
9454       /* Use a compare and a jump for BLKmode comparisons, or for function
9455          type comparisons is HAVE_canonicalize_funcptr_for_compare.  */
9456
9457       /* Although TRUTH_{AND,OR}IF_EXPR aren't present in GIMPLE, they
9458          are occassionally created by folding during expansion.  */
9459     case TRUTH_ANDIF_EXPR:
9460     case TRUTH_ORIF_EXPR:
9461       if (! ignore
9462           && (target == 0
9463               || modifier == EXPAND_STACK_PARM
9464               || ! safe_from_p (target, treeop0, 1)
9465               || ! safe_from_p (target, treeop1, 1)
9466               /* Make sure we don't have a hard reg (such as function's return
9467                  value) live across basic blocks, if not optimizing.  */
9468               || (!optimize && REG_P (target)
9469                   && REGNO (target) < FIRST_PSEUDO_REGISTER)))
9470         target = gen_reg_rtx (tmode != VOIDmode ? tmode : mode);
9471
9472       if (target)
9473         emit_move_insn (target, const0_rtx);
9474
9475       op1 = gen_label_rtx ();
9476       jumpifnot_1 (code, treeop0, treeop1, op1, -1);
9477
9478       if (target)
9479         emit_move_insn (target, const1_rtx);
9480
9481       emit_label (op1);
9482       return ignore ? const0_rtx : target;
9483
9484     case STATEMENT_LIST:
9485       {
9486         tree_stmt_iterator iter;
9487
9488         gcc_assert (ignore);
9489
9490         for (iter = tsi_start (exp); !tsi_end_p (iter); tsi_next (&iter))
9491           expand_expr (tsi_stmt (iter), const0_rtx, VOIDmode, modifier);
9492       }
9493       return const0_rtx;
9494
9495     case COND_EXPR:
9496       /* A COND_EXPR with its type being VOID_TYPE represents a
9497          conditional jump and is handled in
9498          expand_gimple_cond_expr.  */
9499       gcc_assert (!VOID_TYPE_P (type));
9500
9501         /* Note that COND_EXPRs whose type is a structure or union
9502          are required to be constructed to contain assignments of
9503          a temporary variable, so that we can evaluate them here
9504          for side effect only.  If type is void, we must do likewise.  */
9505
9506         gcc_assert (!TREE_ADDRESSABLE (type)
9507                     && !ignore
9508                     && TREE_TYPE (treeop1) != void_type_node
9509                     && TREE_TYPE (treeop2) != void_type_node);
9510
9511        /* If we are not to produce a result, we have no target.  Otherwise,
9512          if a target was specified use it; it will not be used as an
9513          intermediate target unless it is safe.  If no target, use a
9514          temporary.  */
9515
9516        if (modifier != EXPAND_STACK_PARM
9517           && original_target
9518           && safe_from_p (original_target, treeop0, 1)
9519           && GET_MODE (original_target) == mode
9520 #ifdef HAVE_conditional_move
9521           && (! can_conditionally_move_p (mode)
9522               || REG_P (original_target))
9523 #endif
9524           && !MEM_P (original_target))
9525         temp = original_target;
9526        else
9527         temp = assign_temp (type, 0, 0, 1);
9528
9529        do_pending_stack_adjust ();
9530        NO_DEFER_POP;
9531        op0 = gen_label_rtx ();
9532        op1 = gen_label_rtx ();
9533        jumpifnot (treeop0, op0, -1);
9534        store_expr (treeop1, temp,
9535                   modifier == EXPAND_STACK_PARM,
9536                   false);
9537
9538        emit_jump_insn (gen_jump (op1));
9539        emit_barrier ();
9540        emit_label (op0);
9541        store_expr (treeop2, temp,
9542                   modifier == EXPAND_STACK_PARM,
9543                   false);
9544
9545        emit_label (op1);
9546        OK_DEFER_POP;
9547        return temp;
9548
9549     case VEC_COND_EXPR:
9550       target = expand_vec_cond_expr (type, treeop0, treeop1, treeop2, target);
9551       return target;
9552
9553     case MODIFY_EXPR:
9554       {
9555         tree lhs = treeop0;
9556         tree rhs = treeop1;
9557         gcc_assert (ignore);
9558
9559         /* Check for |= or &= of a bitfield of size one into another bitfield
9560            of size 1.  In this case, (unless we need the result of the
9561            assignment) we can do this more efficiently with a
9562            test followed by an assignment, if necessary.
9563
9564            ??? At this point, we can't get a BIT_FIELD_REF here.  But if
9565            things change so we do, this code should be enhanced to
9566            support it.  */
9567         if (TREE_CODE (lhs) == COMPONENT_REF
9568             && (TREE_CODE (rhs) == BIT_IOR_EXPR
9569                 || TREE_CODE (rhs) == BIT_AND_EXPR)
9570             && TREE_OPERAND (rhs, 0) == lhs
9571             && TREE_CODE (TREE_OPERAND (rhs, 1)) == COMPONENT_REF
9572             && integer_onep (DECL_SIZE (TREE_OPERAND (lhs, 1)))
9573             && integer_onep (DECL_SIZE (TREE_OPERAND (TREE_OPERAND (rhs, 1), 1))))
9574           {
9575             rtx label = gen_label_rtx ();
9576             int value = TREE_CODE (rhs) == BIT_IOR_EXPR;
9577             do_jump (TREE_OPERAND (rhs, 1),
9578                      value ? label : 0,
9579                      value ? 0 : label, -1);
9580             expand_assignment (lhs, build_int_cst (TREE_TYPE (rhs), value),
9581                                MOVE_NONTEMPORAL (exp));
9582             do_pending_stack_adjust ();
9583             emit_label (label);
9584             return const0_rtx;
9585           }
9586
9587         expand_assignment (lhs, rhs, MOVE_NONTEMPORAL (exp));
9588         return const0_rtx;
9589       }
9590
9591     case ADDR_EXPR:
9592       return expand_expr_addr_expr (exp, target, tmode, modifier);
9593
9594     case REALPART_EXPR:
9595       op0 = expand_normal (treeop0);
9596       return read_complex_part (op0, false);
9597
9598     case IMAGPART_EXPR:
9599       op0 = expand_normal (treeop0);
9600       return read_complex_part (op0, true);
9601
9602     case RETURN_EXPR:
9603     case LABEL_EXPR:
9604     case GOTO_EXPR:
9605     case SWITCH_EXPR:
9606     case ASM_EXPR:
9607       /* Expanded in cfgexpand.c.  */
9608       gcc_unreachable ();
9609
9610     case TRY_CATCH_EXPR:
9611     case CATCH_EXPR:
9612     case EH_FILTER_EXPR:
9613     case TRY_FINALLY_EXPR:
9614       /* Lowered by tree-eh.c.  */
9615       gcc_unreachable ();
9616
9617     case WITH_CLEANUP_EXPR:
9618     case CLEANUP_POINT_EXPR:
9619     case TARGET_EXPR:
9620     case CASE_LABEL_EXPR:
9621     case VA_ARG_EXPR:
9622     case BIND_EXPR:
9623     case INIT_EXPR:
9624     case CONJ_EXPR:
9625     case COMPOUND_EXPR:
9626     case PREINCREMENT_EXPR:
9627     case PREDECREMENT_EXPR:
9628     case POSTINCREMENT_EXPR:
9629     case POSTDECREMENT_EXPR:
9630     case LOOP_EXPR:
9631     case EXIT_EXPR:
9632       /* Lowered by gimplify.c.  */
9633       gcc_unreachable ();
9634
9635     case FDESC_EXPR:
9636       /* Function descriptors are not valid except for as
9637          initialization constants, and should not be expanded.  */
9638       gcc_unreachable ();
9639
9640     case WITH_SIZE_EXPR:
9641       /* WITH_SIZE_EXPR expands to its first argument.  The caller should
9642          have pulled out the size to use in whatever context it needed.  */
9643       return expand_expr_real (treeop0, original_target, tmode,
9644                                modifier, alt_rtl);
9645
9646     case REALIGN_LOAD_EXPR:
9647       {
9648         tree oprnd0 = treeop0;
9649         tree oprnd1 = treeop1;
9650         tree oprnd2 = treeop2;
9651         rtx op2;
9652
9653         this_optab = optab_for_tree_code (code, type, optab_default);
9654         expand_operands (oprnd0, oprnd1, NULL_RTX, &op0, &op1, EXPAND_NORMAL);
9655         op2 = expand_normal (oprnd2);
9656         temp = expand_ternary_op (mode, this_optab, op0, op1, op2,
9657                                   target, unsignedp);
9658         gcc_assert (temp);
9659         return temp;
9660       }
9661
9662     case DOT_PROD_EXPR:
9663       {
9664         tree oprnd0 = treeop0;
9665         tree oprnd1 = treeop1;
9666         tree oprnd2 = treeop2;
9667         rtx op2;
9668
9669         expand_operands (oprnd0, oprnd1, NULL_RTX, &op0, &op1, EXPAND_NORMAL);
9670         op2 = expand_normal (oprnd2);
9671         target = expand_widen_pattern_expr (&ops, op0, op1, op2,
9672                                             target, unsignedp);
9673         return target;
9674       }
9675
9676     case COMPOUND_LITERAL_EXPR:
9677       {
9678         /* Initialize the anonymous variable declared in the compound
9679            literal, then return the variable.  */
9680         tree decl = COMPOUND_LITERAL_EXPR_DECL (exp);
9681
9682         /* Create RTL for this variable.  */
9683         if (!DECL_RTL_SET_P (decl))
9684           {
9685             if (DECL_HARD_REGISTER (decl))
9686               /* The user specified an assembler name for this variable.
9687                  Set that up now.  */
9688               rest_of_decl_compilation (decl, 0, 0);
9689             else
9690               expand_decl (decl);
9691           }
9692
9693         return expand_expr_real (decl, original_target, tmode,
9694                                  modifier, alt_rtl);
9695       }
9696
9697     default:
9698       return expand_expr_real_2 (&ops, target, tmode, modifier);
9699     }
9700 }
9701 \f
9702 /* Subroutine of above: reduce EXP to the precision of TYPE (in the
9703    signedness of TYPE), possibly returning the result in TARGET.  */
9704 static rtx
9705 reduce_to_bit_field_precision (rtx exp, rtx target, tree type)
9706 {
9707   HOST_WIDE_INT prec = TYPE_PRECISION (type);
9708   if (target && GET_MODE (target) != GET_MODE (exp))
9709     target = 0;
9710   /* For constant values, reduce using build_int_cst_type. */
9711   if (CONST_INT_P (exp))
9712     {
9713       HOST_WIDE_INT value = INTVAL (exp);
9714       tree t = build_int_cst_type (type, value);
9715       return expand_expr (t, target, VOIDmode, EXPAND_NORMAL);
9716     }
9717   else if (TYPE_UNSIGNED (type))
9718     {
9719       rtx mask = immed_double_int_const (double_int_mask (prec),
9720                                          GET_MODE (exp));
9721       return expand_and (GET_MODE (exp), exp, mask, target);
9722     }
9723   else
9724     {
9725       tree count = build_int_cst (NULL_TREE,
9726                                   GET_MODE_BITSIZE (GET_MODE (exp)) - prec);
9727       exp = expand_shift (LSHIFT_EXPR, GET_MODE (exp), exp, count, target, 0);
9728       return expand_shift (RSHIFT_EXPR, GET_MODE (exp), exp, count, target, 0);
9729     }
9730 }
9731 \f
9732 /* Subroutine of above: returns 1 if OFFSET corresponds to an offset that
9733    when applied to the address of EXP produces an address known to be
9734    aligned more than BIGGEST_ALIGNMENT.  */
9735
9736 static int
9737 is_aligning_offset (const_tree offset, const_tree exp)
9738 {
9739   /* Strip off any conversions.  */
9740   while (CONVERT_EXPR_P (offset))
9741     offset = TREE_OPERAND (offset, 0);
9742
9743   /* We must now have a BIT_AND_EXPR with a constant that is one less than
9744      power of 2 and which is larger than BIGGEST_ALIGNMENT.  */
9745   if (TREE_CODE (offset) != BIT_AND_EXPR
9746       || !host_integerp (TREE_OPERAND (offset, 1), 1)
9747       || compare_tree_int (TREE_OPERAND (offset, 1),
9748                            BIGGEST_ALIGNMENT / BITS_PER_UNIT) <= 0
9749       || !exact_log2 (tree_low_cst (TREE_OPERAND (offset, 1), 1) + 1) < 0)
9750     return 0;
9751
9752   /* Look at the first operand of BIT_AND_EXPR and strip any conversion.
9753      It must be NEGATE_EXPR.  Then strip any more conversions.  */
9754   offset = TREE_OPERAND (offset, 0);
9755   while (CONVERT_EXPR_P (offset))
9756     offset = TREE_OPERAND (offset, 0);
9757
9758   if (TREE_CODE (offset) != NEGATE_EXPR)
9759     return 0;
9760
9761   offset = TREE_OPERAND (offset, 0);
9762   while (CONVERT_EXPR_P (offset))
9763     offset = TREE_OPERAND (offset, 0);
9764
9765   /* This must now be the address of EXP.  */
9766   return TREE_CODE (offset) == ADDR_EXPR && TREE_OPERAND (offset, 0) == exp;
9767 }
9768 \f
9769 /* Return the tree node if an ARG corresponds to a string constant or zero
9770    if it doesn't.  If we return nonzero, set *PTR_OFFSET to the offset
9771    in bytes within the string that ARG is accessing.  The type of the
9772    offset will be `sizetype'.  */
9773
9774 tree
9775 string_constant (tree arg, tree *ptr_offset)
9776 {
9777   tree array, offset, lower_bound;
9778   STRIP_NOPS (arg);
9779
9780   if (TREE_CODE (arg) == ADDR_EXPR)
9781     {
9782       if (TREE_CODE (TREE_OPERAND (arg, 0)) == STRING_CST)
9783         {
9784           *ptr_offset = size_zero_node;
9785           return TREE_OPERAND (arg, 0);
9786         }
9787       else if (TREE_CODE (TREE_OPERAND (arg, 0)) == VAR_DECL)
9788         {
9789           array = TREE_OPERAND (arg, 0);
9790           offset = size_zero_node;
9791         }
9792       else if (TREE_CODE (TREE_OPERAND (arg, 0)) == ARRAY_REF)
9793         {
9794           array = TREE_OPERAND (TREE_OPERAND (arg, 0), 0);
9795           offset = TREE_OPERAND (TREE_OPERAND (arg, 0), 1);
9796           if (TREE_CODE (array) != STRING_CST
9797               && TREE_CODE (array) != VAR_DECL)
9798             return 0;
9799
9800           /* Check if the array has a nonzero lower bound.  */
9801           lower_bound = array_ref_low_bound (TREE_OPERAND (arg, 0));
9802           if (!integer_zerop (lower_bound))
9803             {
9804               /* If the offset and base aren't both constants, return 0.  */
9805               if (TREE_CODE (lower_bound) != INTEGER_CST)
9806                 return 0;
9807               if (TREE_CODE (offset) != INTEGER_CST)
9808                 return 0;
9809               /* Adjust offset by the lower bound.  */
9810               offset = size_diffop (fold_convert (sizetype, offset),
9811                                     fold_convert (sizetype, lower_bound));
9812             }
9813         }
9814       else
9815         return 0;
9816     }
9817   else if (TREE_CODE (arg) == PLUS_EXPR || TREE_CODE (arg) == POINTER_PLUS_EXPR)
9818     {
9819       tree arg0 = TREE_OPERAND (arg, 0);
9820       tree arg1 = TREE_OPERAND (arg, 1);
9821
9822       STRIP_NOPS (arg0);
9823       STRIP_NOPS (arg1);
9824
9825       if (TREE_CODE (arg0) == ADDR_EXPR
9826           && (TREE_CODE (TREE_OPERAND (arg0, 0)) == STRING_CST
9827               || TREE_CODE (TREE_OPERAND (arg0, 0)) == VAR_DECL))
9828         {
9829           array = TREE_OPERAND (arg0, 0);
9830           offset = arg1;
9831         }
9832       else if (TREE_CODE (arg1) == ADDR_EXPR
9833                && (TREE_CODE (TREE_OPERAND (arg1, 0)) == STRING_CST
9834                    || TREE_CODE (TREE_OPERAND (arg1, 0)) == VAR_DECL))
9835         {
9836           array = TREE_OPERAND (arg1, 0);
9837           offset = arg0;
9838         }
9839       else
9840         return 0;
9841     }
9842   else
9843     return 0;
9844
9845   if (TREE_CODE (array) == STRING_CST)
9846     {
9847       *ptr_offset = fold_convert (sizetype, offset);
9848       return array;
9849     }
9850   else if (TREE_CODE (array) == VAR_DECL)
9851     {
9852       int length;
9853
9854       /* Variables initialized to string literals can be handled too.  */
9855       if (DECL_INITIAL (array) == NULL_TREE
9856           || TREE_CODE (DECL_INITIAL (array)) != STRING_CST)
9857         return 0;
9858
9859       /* If they are read-only, non-volatile and bind locally.  */
9860       if (! TREE_READONLY (array)
9861           || TREE_SIDE_EFFECTS (array)
9862           || ! targetm.binds_local_p (array))
9863         return 0;
9864
9865       /* Avoid const char foo[4] = "abcde";  */
9866       if (DECL_SIZE_UNIT (array) == NULL_TREE
9867           || TREE_CODE (DECL_SIZE_UNIT (array)) != INTEGER_CST
9868           || (length = TREE_STRING_LENGTH (DECL_INITIAL (array))) <= 0
9869           || compare_tree_int (DECL_SIZE_UNIT (array), length) < 0)
9870         return 0;
9871
9872       /* If variable is bigger than the string literal, OFFSET must be constant
9873          and inside of the bounds of the string literal.  */
9874       offset = fold_convert (sizetype, offset);
9875       if (compare_tree_int (DECL_SIZE_UNIT (array), length) > 0
9876           && (! host_integerp (offset, 1)
9877               || compare_tree_int (offset, length) >= 0))
9878         return 0;
9879
9880       *ptr_offset = offset;
9881       return DECL_INITIAL (array);
9882     }
9883
9884   return 0;
9885 }
9886 \f
9887 /* Generate code to calculate OPS, and exploded expression
9888    using a store-flag instruction and return an rtx for the result.
9889    OPS reflects a comparison.
9890
9891    If TARGET is nonzero, store the result there if convenient.
9892
9893    Return zero if there is no suitable set-flag instruction
9894    available on this machine.
9895
9896    Once expand_expr has been called on the arguments of the comparison,
9897    we are committed to doing the store flag, since it is not safe to
9898    re-evaluate the expression.  We emit the store-flag insn by calling
9899    emit_store_flag, but only expand the arguments if we have a reason
9900    to believe that emit_store_flag will be successful.  If we think that
9901    it will, but it isn't, we have to simulate the store-flag with a
9902    set/jump/set sequence.  */
9903
9904 static rtx
9905 do_store_flag (sepops ops, rtx target, enum machine_mode mode)
9906 {
9907   enum rtx_code code;
9908   tree arg0, arg1, type;
9909   tree tem;
9910   enum machine_mode operand_mode;
9911   int unsignedp;
9912   rtx op0, op1;
9913   rtx subtarget = target;
9914   location_t loc = ops->location;
9915
9916   arg0 = ops->op0;
9917   arg1 = ops->op1;
9918
9919   /* Don't crash if the comparison was erroneous.  */
9920   if (arg0 == error_mark_node || arg1 == error_mark_node)
9921     return const0_rtx;
9922
9923   type = TREE_TYPE (arg0);
9924   operand_mode = TYPE_MODE (type);
9925   unsignedp = TYPE_UNSIGNED (type);
9926
9927   /* We won't bother with BLKmode store-flag operations because it would mean
9928      passing a lot of information to emit_store_flag.  */
9929   if (operand_mode == BLKmode)
9930     return 0;
9931
9932   /* We won't bother with store-flag operations involving function pointers
9933      when function pointers must be canonicalized before comparisons.  */
9934 #ifdef HAVE_canonicalize_funcptr_for_compare
9935   if (HAVE_canonicalize_funcptr_for_compare
9936       && ((TREE_CODE (TREE_TYPE (arg0)) == POINTER_TYPE
9937            && (TREE_CODE (TREE_TYPE (TREE_TYPE (arg0)))
9938                == FUNCTION_TYPE))
9939           || (TREE_CODE (TREE_TYPE (arg1)) == POINTER_TYPE
9940               && (TREE_CODE (TREE_TYPE (TREE_TYPE (arg1)))
9941                   == FUNCTION_TYPE))))
9942     return 0;
9943 #endif
9944
9945   STRIP_NOPS (arg0);
9946   STRIP_NOPS (arg1);
9947
9948   /* Get the rtx comparison code to use.  We know that EXP is a comparison
9949      operation of some type.  Some comparisons against 1 and -1 can be
9950      converted to comparisons with zero.  Do so here so that the tests
9951      below will be aware that we have a comparison with zero.   These
9952      tests will not catch constants in the first operand, but constants
9953      are rarely passed as the first operand.  */
9954
9955   switch (ops->code)
9956     {
9957     case EQ_EXPR:
9958       code = EQ;
9959       break;
9960     case NE_EXPR:
9961       code = NE;
9962       break;
9963     case LT_EXPR:
9964       if (integer_onep (arg1))
9965         arg1 = integer_zero_node, code = unsignedp ? LEU : LE;
9966       else
9967         code = unsignedp ? LTU : LT;
9968       break;
9969     case LE_EXPR:
9970       if (! unsignedp && integer_all_onesp (arg1))
9971         arg1 = integer_zero_node, code = LT;
9972       else
9973         code = unsignedp ? LEU : LE;
9974       break;
9975     case GT_EXPR:
9976       if (! unsignedp && integer_all_onesp (arg1))
9977         arg1 = integer_zero_node, code = GE;
9978       else
9979         code = unsignedp ? GTU : GT;
9980       break;
9981     case GE_EXPR:
9982       if (integer_onep (arg1))
9983         arg1 = integer_zero_node, code = unsignedp ? GTU : GT;
9984       else
9985         code = unsignedp ? GEU : GE;
9986       break;
9987
9988     case UNORDERED_EXPR:
9989       code = UNORDERED;
9990       break;
9991     case ORDERED_EXPR:
9992       code = ORDERED;
9993       break;
9994     case UNLT_EXPR:
9995       code = UNLT;
9996       break;
9997     case UNLE_EXPR:
9998       code = UNLE;
9999       break;
10000     case UNGT_EXPR:
10001       code = UNGT;
10002       break;
10003     case UNGE_EXPR:
10004       code = UNGE;
10005       break;
10006     case UNEQ_EXPR:
10007       code = UNEQ;
10008       break;
10009     case LTGT_EXPR:
10010       code = LTGT;
10011       break;
10012
10013     default:
10014       gcc_unreachable ();
10015     }
10016
10017   /* Put a constant second.  */
10018   if (TREE_CODE (arg0) == REAL_CST || TREE_CODE (arg0) == INTEGER_CST
10019       || TREE_CODE (arg0) == FIXED_CST)
10020     {
10021       tem = arg0; arg0 = arg1; arg1 = tem;
10022       code = swap_condition (code);
10023     }
10024
10025   /* If this is an equality or inequality test of a single bit, we can
10026      do this by shifting the bit being tested to the low-order bit and
10027      masking the result with the constant 1.  If the condition was EQ,
10028      we xor it with 1.  This does not require an scc insn and is faster
10029      than an scc insn even if we have it.
10030
10031      The code to make this transformation was moved into fold_single_bit_test,
10032      so we just call into the folder and expand its result.  */
10033
10034   if ((code == NE || code == EQ)
10035       && TREE_CODE (arg0) == BIT_AND_EXPR && integer_zerop (arg1)
10036       && integer_pow2p (TREE_OPERAND (arg0, 1)))
10037     {
10038       tree type = lang_hooks.types.type_for_mode (mode, unsignedp);
10039       return expand_expr (fold_single_bit_test (loc,
10040                                                 code == NE ? NE_EXPR : EQ_EXPR,
10041                                                 arg0, arg1, type),
10042                           target, VOIDmode, EXPAND_NORMAL);
10043     }
10044
10045   if (! get_subtarget (target)
10046       || GET_MODE (subtarget) != operand_mode)
10047     subtarget = 0;
10048
10049   expand_operands (arg0, arg1, subtarget, &op0, &op1, EXPAND_NORMAL);
10050
10051   if (target == 0)
10052     target = gen_reg_rtx (mode);
10053
10054   /* Try a cstore if possible.  */
10055   return emit_store_flag_force (target, code, op0, op1,
10056                                 operand_mode, unsignedp, 1);
10057 }
10058 \f
10059
10060 /* Stubs in case we haven't got a casesi insn.  */
10061 #ifndef HAVE_casesi
10062 # define HAVE_casesi 0
10063 # define gen_casesi(a, b, c, d, e) (0)
10064 # define CODE_FOR_casesi CODE_FOR_nothing
10065 #endif
10066
10067 /* Attempt to generate a casesi instruction.  Returns 1 if successful,
10068    0 otherwise (i.e. if there is no casesi instruction).  */
10069 int
10070 try_casesi (tree index_type, tree index_expr, tree minval, tree range,
10071             rtx table_label ATTRIBUTE_UNUSED, rtx default_label,
10072             rtx fallback_label ATTRIBUTE_UNUSED)
10073 {
10074   enum machine_mode index_mode = SImode;
10075   int index_bits = GET_MODE_BITSIZE (index_mode);
10076   rtx op1, op2, index;
10077   enum machine_mode op_mode;
10078
10079   if (! HAVE_casesi)
10080     return 0;
10081
10082   /* Convert the index to SImode.  */
10083   if (GET_MODE_BITSIZE (TYPE_MODE (index_type)) > GET_MODE_BITSIZE (index_mode))
10084     {
10085       enum machine_mode omode = TYPE_MODE (index_type);
10086       rtx rangertx = expand_normal (range);
10087
10088       /* We must handle the endpoints in the original mode.  */
10089       index_expr = build2 (MINUS_EXPR, index_type,
10090                            index_expr, minval);
10091       minval = integer_zero_node;
10092       index = expand_normal (index_expr);
10093       if (default_label)
10094         emit_cmp_and_jump_insns (rangertx, index, LTU, NULL_RTX,
10095                                  omode, 1, default_label);
10096       /* Now we can safely truncate.  */
10097       index = convert_to_mode (index_mode, index, 0);
10098     }
10099   else
10100     {
10101       if (TYPE_MODE (index_type) != index_mode)
10102         {
10103           index_type = lang_hooks.types.type_for_size (index_bits, 0);
10104           index_expr = fold_convert (index_type, index_expr);
10105         }
10106
10107       index = expand_normal (index_expr);
10108     }
10109
10110   do_pending_stack_adjust ();
10111
10112   op_mode = insn_data[(int) CODE_FOR_casesi].operand[0].mode;
10113   if (! (*insn_data[(int) CODE_FOR_casesi].operand[0].predicate)
10114       (index, op_mode))
10115     index = copy_to_mode_reg (op_mode, index);
10116
10117   op1 = expand_normal (minval);
10118
10119   op_mode = insn_data[(int) CODE_FOR_casesi].operand[1].mode;
10120   op1 = convert_modes (op_mode, TYPE_MODE (TREE_TYPE (minval)),
10121                        op1, TYPE_UNSIGNED (TREE_TYPE (minval)));
10122   if (! (*insn_data[(int) CODE_FOR_casesi].operand[1].predicate)
10123       (op1, op_mode))
10124     op1 = copy_to_mode_reg (op_mode, op1);
10125
10126   op2 = expand_normal (range);
10127
10128   op_mode = insn_data[(int) CODE_FOR_casesi].operand[2].mode;
10129   op2 = convert_modes (op_mode, TYPE_MODE (TREE_TYPE (range)),
10130                        op2, TYPE_UNSIGNED (TREE_TYPE (range)));
10131   if (! (*insn_data[(int) CODE_FOR_casesi].operand[2].predicate)
10132       (op2, op_mode))
10133     op2 = copy_to_mode_reg (op_mode, op2);
10134
10135   emit_jump_insn (gen_casesi (index, op1, op2,
10136                               table_label, !default_label
10137                                            ? fallback_label : default_label));
10138   return 1;
10139 }
10140
10141 /* Attempt to generate a tablejump instruction; same concept.  */
10142 #ifndef HAVE_tablejump
10143 #define HAVE_tablejump 0
10144 #define gen_tablejump(x, y) (0)
10145 #endif
10146
10147 /* Subroutine of the next function.
10148
10149    INDEX is the value being switched on, with the lowest value
10150    in the table already subtracted.
10151    MODE is its expected mode (needed if INDEX is constant).
10152    RANGE is the length of the jump table.
10153    TABLE_LABEL is a CODE_LABEL rtx for the table itself.
10154
10155    DEFAULT_LABEL is a CODE_LABEL rtx to jump to if the
10156    index value is out of range.  */
10157
10158 static void
10159 do_tablejump (rtx index, enum machine_mode mode, rtx range, rtx table_label,
10160               rtx default_label)
10161 {
10162   rtx temp, vector;
10163
10164   if (INTVAL (range) > cfun->cfg->max_jumptable_ents)
10165     cfun->cfg->max_jumptable_ents = INTVAL (range);
10166
10167   /* Do an unsigned comparison (in the proper mode) between the index
10168      expression and the value which represents the length of the range.
10169      Since we just finished subtracting the lower bound of the range
10170      from the index expression, this comparison allows us to simultaneously
10171      check that the original index expression value is both greater than
10172      or equal to the minimum value of the range and less than or equal to
10173      the maximum value of the range.  */
10174
10175   if (default_label)
10176     emit_cmp_and_jump_insns (index, range, GTU, NULL_RTX, mode, 1,
10177                              default_label);
10178
10179   /* If index is in range, it must fit in Pmode.
10180      Convert to Pmode so we can index with it.  */
10181   if (mode != Pmode)
10182     index = convert_to_mode (Pmode, index, 1);
10183
10184   /* Don't let a MEM slip through, because then INDEX that comes
10185      out of PIC_CASE_VECTOR_ADDRESS won't be a valid address,
10186      and break_out_memory_refs will go to work on it and mess it up.  */
10187 #ifdef PIC_CASE_VECTOR_ADDRESS
10188   if (flag_pic && !REG_P (index))
10189     index = copy_to_mode_reg (Pmode, index);
10190 #endif
10191
10192   /* ??? The only correct use of CASE_VECTOR_MODE is the one inside the
10193      GET_MODE_SIZE, because this indicates how large insns are.  The other
10194      uses should all be Pmode, because they are addresses.  This code
10195      could fail if addresses and insns are not the same size.  */
10196   index = gen_rtx_PLUS (Pmode,
10197                         gen_rtx_MULT (Pmode, index,
10198                                       GEN_INT (GET_MODE_SIZE (CASE_VECTOR_MODE))),
10199                         gen_rtx_LABEL_REF (Pmode, table_label));
10200 #ifdef PIC_CASE_VECTOR_ADDRESS
10201   if (flag_pic)
10202     index = PIC_CASE_VECTOR_ADDRESS (index);
10203   else
10204 #endif
10205     index = memory_address (CASE_VECTOR_MODE, index);
10206   temp = gen_reg_rtx (CASE_VECTOR_MODE);
10207   vector = gen_const_mem (CASE_VECTOR_MODE, index);
10208   convert_move (temp, vector, 0);
10209
10210   emit_jump_insn (gen_tablejump (temp, table_label));
10211
10212   /* If we are generating PIC code or if the table is PC-relative, the
10213      table and JUMP_INSN must be adjacent, so don't output a BARRIER.  */
10214   if (! CASE_VECTOR_PC_RELATIVE && ! flag_pic)
10215     emit_barrier ();
10216 }
10217
10218 int
10219 try_tablejump (tree index_type, tree index_expr, tree minval, tree range,
10220                rtx table_label, rtx default_label)
10221 {
10222   rtx index;
10223
10224   if (! HAVE_tablejump)
10225     return 0;
10226
10227   index_expr = fold_build2 (MINUS_EXPR, index_type,
10228                             fold_convert (index_type, index_expr),
10229                             fold_convert (index_type, minval));
10230   index = expand_normal (index_expr);
10231   do_pending_stack_adjust ();
10232
10233   do_tablejump (index, TYPE_MODE (index_type),
10234                 convert_modes (TYPE_MODE (index_type),
10235                                TYPE_MODE (TREE_TYPE (range)),
10236                                expand_normal (range),
10237                                TYPE_UNSIGNED (TREE_TYPE (range))),
10238                 table_label, default_label);
10239   return 1;
10240 }
10241
10242 /* Nonzero if the mode is a valid vector mode for this architecture.
10243    This returns nonzero even if there is no hardware support for the
10244    vector mode, but we can emulate with narrower modes.  */
10245
10246 int
10247 vector_mode_valid_p (enum machine_mode mode)
10248 {
10249   enum mode_class mclass = GET_MODE_CLASS (mode);
10250   enum machine_mode innermode;
10251
10252   /* Doh!  What's going on?  */
10253   if (mclass != MODE_VECTOR_INT
10254       && mclass != MODE_VECTOR_FLOAT
10255       && mclass != MODE_VECTOR_FRACT
10256       && mclass != MODE_VECTOR_UFRACT
10257       && mclass != MODE_VECTOR_ACCUM
10258       && mclass != MODE_VECTOR_UACCUM)
10259     return 0;
10260
10261   /* Hardware support.  Woo hoo!  */
10262   if (targetm.vector_mode_supported_p (mode))
10263     return 1;
10264
10265   innermode = GET_MODE_INNER (mode);
10266
10267   /* We should probably return 1 if requesting V4DI and we have no DI,
10268      but we have V2DI, but this is probably very unlikely.  */
10269
10270   /* If we have support for the inner mode, we can safely emulate it.
10271      We may not have V2DI, but me can emulate with a pair of DIs.  */
10272   return targetm.scalar_mode_supported_p (innermode);
10273 }
10274
10275 /* Return a CONST_VECTOR rtx for a VECTOR_CST tree.  */
10276 static rtx
10277 const_vector_from_tree (tree exp)
10278 {
10279   rtvec v;
10280   int units, i;
10281   tree link, elt;
10282   enum machine_mode inner, mode;
10283
10284   mode = TYPE_MODE (TREE_TYPE (exp));
10285
10286   if (initializer_zerop (exp))
10287     return CONST0_RTX (mode);
10288
10289   units = GET_MODE_NUNITS (mode);
10290   inner = GET_MODE_INNER (mode);
10291
10292   v = rtvec_alloc (units);
10293
10294   link = TREE_VECTOR_CST_ELTS (exp);
10295   for (i = 0; link; link = TREE_CHAIN (link), ++i)
10296     {
10297       elt = TREE_VALUE (link);
10298
10299       if (TREE_CODE (elt) == REAL_CST)
10300         RTVEC_ELT (v, i) = CONST_DOUBLE_FROM_REAL_VALUE (TREE_REAL_CST (elt),
10301                                                          inner);
10302       else if (TREE_CODE (elt) == FIXED_CST)
10303         RTVEC_ELT (v, i) = CONST_FIXED_FROM_FIXED_VALUE (TREE_FIXED_CST (elt),
10304                                                          inner);
10305       else
10306         RTVEC_ELT (v, i) = immed_double_int_const (tree_to_double_int (elt),
10307                                                    inner);
10308     }
10309
10310   /* Initialize remaining elements to 0.  */
10311   for (; i < units; ++i)
10312     RTVEC_ELT (v, i) = CONST0_RTX (inner);
10313
10314   return gen_rtx_CONST_VECTOR (mode, v);
10315 }
10316
10317
10318 /* Build a decl for a EH personality function named NAME. */
10319
10320 tree
10321 build_personality_function (const char *name)
10322 {
10323   tree decl, type;
10324
10325   type = build_function_type_list (integer_type_node, integer_type_node,
10326                                    long_long_unsigned_type_node,
10327                                    ptr_type_node, ptr_type_node, NULL_TREE);
10328   decl = build_decl (UNKNOWN_LOCATION, FUNCTION_DECL,
10329                      get_identifier (name), type);
10330   DECL_ARTIFICIAL (decl) = 1;
10331   DECL_EXTERNAL (decl) = 1;
10332   TREE_PUBLIC (decl) = 1;
10333
10334   /* Zap the nonsensical SYMBOL_REF_DECL for this.  What we're left with
10335      are the flags assigned by targetm.encode_section_info.  */
10336   SET_SYMBOL_REF_DECL (XEXP (DECL_RTL (decl), 0), NULL);
10337
10338   return decl;
10339 }
10340
10341 /* Extracts the personality function of DECL and returns the corresponding
10342    libfunc.  */
10343
10344 rtx
10345 get_personality_function (tree decl)
10346 {
10347   tree personality = DECL_FUNCTION_PERSONALITY (decl);
10348   enum eh_personality_kind pk;
10349
10350   pk = function_needs_eh_personality (DECL_STRUCT_FUNCTION (decl));
10351   if (pk == eh_personality_none)
10352     return NULL;
10353
10354   if (!personality
10355       && pk == eh_personality_any)
10356     personality = lang_hooks.eh_personality ();
10357
10358   if (pk == eh_personality_lang)
10359     gcc_assert (personality != NULL_TREE);
10360
10361   return XEXP (DECL_RTL (personality), 0);
10362 }
10363
10364 #include "gt-expr.h"