OSDN Git Service

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