OSDN Git Service

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