OSDN Git Service

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