OSDN Git Service

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