OSDN Git Service

* expr.c (expand_expr_real): Use usmul_optab for widening
[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     {
2673       emit_move_insn (adjust_address_nv (cplx, imode,
2674                                          imag_p ? GET_MODE_SIZE (imode) : 0),
2675                       val);
2676       return;
2677     }
2678
2679   /* If the sub-object is at least word sized, then we know that subregging
2680      will work.  This special case is important, since store_bit_field
2681      wants to operate on integer modes, and there's rarely an OImode to
2682      correspond to TCmode.  */
2683   if (ibitsize >= BITS_PER_WORD
2684       /* For hard regs we have exact predicates.  Assume we can split
2685          the original object if it spans an even number of hard regs.
2686          This special case is important for SCmode on 64-bit platforms
2687          where the natural size of floating-point regs is 32-bit.  */
2688       || (REG_P (cplx)
2689           && REGNO (cplx) < FIRST_PSEUDO_REGISTER
2690           && hard_regno_nregs[REGNO (cplx)][cmode] % 2 == 0))
2691     {
2692       rtx part = simplify_gen_subreg (imode, cplx, cmode,
2693                                       imag_p ? GET_MODE_SIZE (imode) : 0);
2694       if (part)
2695         {
2696           emit_move_insn (part, val);
2697           return;
2698         }
2699       else
2700         /* simplify_gen_subreg may fail for sub-word MEMs.  */
2701         gcc_assert (MEM_P (cplx) && ibitsize < BITS_PER_WORD);
2702     }
2703
2704   store_bit_field (cplx, ibitsize, imag_p ? ibitsize : 0, imode, val);
2705 }
2706
2707 /* Extract one of the components of the complex value CPLX.  Extract the
2708    real part if IMAG_P is false, and the imaginary part if it's true.  */
2709
2710 static rtx
2711 read_complex_part (rtx cplx, bool imag_p)
2712 {
2713   enum machine_mode cmode, imode;
2714   unsigned ibitsize;
2715
2716   if (GET_CODE (cplx) == CONCAT)
2717     return XEXP (cplx, imag_p);
2718
2719   cmode = GET_MODE (cplx);
2720   imode = GET_MODE_INNER (cmode);
2721   ibitsize = GET_MODE_BITSIZE (imode);
2722
2723   /* Special case reads from complex constants that got spilled to memory.  */
2724   if (MEM_P (cplx) && GET_CODE (XEXP (cplx, 0)) == SYMBOL_REF)
2725     {
2726       tree decl = SYMBOL_REF_DECL (XEXP (cplx, 0));
2727       if (decl && TREE_CODE (decl) == COMPLEX_CST)
2728         {
2729           tree part = imag_p ? TREE_IMAGPART (decl) : TREE_REALPART (decl);
2730           if (CONSTANT_CLASS_P (part))
2731             return expand_expr (part, NULL_RTX, imode, EXPAND_NORMAL);
2732         }
2733     }
2734
2735   /* For MEMs simplify_gen_subreg may generate an invalid new address
2736      because, e.g., the original address is considered mode-dependent
2737      by the target, which restricts simplify_subreg from invoking
2738      adjust_address_nv.  Instead of preparing fallback support for an
2739      invalid address, we call adjust_address_nv directly.  */
2740   if (MEM_P (cplx))
2741     return adjust_address_nv (cplx, imode,
2742                               imag_p ? GET_MODE_SIZE (imode) : 0);
2743
2744   /* If the sub-object is at least word sized, then we know that subregging
2745      will work.  This special case is important, since extract_bit_field
2746      wants to operate on integer modes, and there's rarely an OImode to
2747      correspond to TCmode.  */
2748   if (ibitsize >= BITS_PER_WORD
2749       /* For hard regs we have exact predicates.  Assume we can split
2750          the original object if it spans an even number of hard regs.
2751          This special case is important for SCmode on 64-bit platforms
2752          where the natural size of floating-point regs is 32-bit.  */
2753       || (REG_P (cplx)
2754           && REGNO (cplx) < FIRST_PSEUDO_REGISTER
2755           && hard_regno_nregs[REGNO (cplx)][cmode] % 2 == 0))
2756     {
2757       rtx ret = simplify_gen_subreg (imode, cplx, cmode,
2758                                      imag_p ? GET_MODE_SIZE (imode) : 0);
2759       if (ret)
2760         return ret;
2761       else
2762         /* simplify_gen_subreg may fail for sub-word MEMs.  */
2763         gcc_assert (MEM_P (cplx) && ibitsize < BITS_PER_WORD);
2764     }
2765
2766   return extract_bit_field (cplx, ibitsize, imag_p ? ibitsize : 0,
2767                             true, NULL_RTX, imode, imode);
2768 }
2769 \f
2770 /* A subroutine of emit_move_insn_1.  Yet another lowpart generator.
2771    NEW_MODE and OLD_MODE are the same size.  Return NULL if X cannot be
2772    represented in NEW_MODE.  If FORCE is true, this will never happen, as
2773    we'll force-create a SUBREG if needed.  */
2774
2775 static rtx
2776 emit_move_change_mode (enum machine_mode new_mode,
2777                        enum machine_mode old_mode, rtx x, bool force)
2778 {
2779   rtx ret;
2780
2781   if (reload_in_progress && MEM_P (x))
2782     {
2783       /* We can't use gen_lowpart here because it may call change_address
2784          which is not appropriate if we were called when a reload was in
2785          progress.  We don't have to worry about changing the address since
2786          the size in bytes is supposed to be the same.  Copy the MEM to
2787          change the mode and move any substitutions from the old MEM to
2788          the new one.  */
2789
2790       ret = adjust_address_nv (x, new_mode, 0);
2791       copy_replacements (x, ret);
2792     }
2793   else
2794     {
2795       /* Note that we do want simplify_subreg's behavior of validating
2796          that the new mode is ok for a hard register.  If we were to use
2797          simplify_gen_subreg, we would create the subreg, but would
2798          probably run into the target not being able to implement it.  */
2799       /* Except, of course, when FORCE is true, when this is exactly what
2800          we want.  Which is needed for CCmodes on some targets.  */
2801       if (force)
2802         ret = simplify_gen_subreg (new_mode, x, old_mode, 0);
2803       else
2804         ret = simplify_subreg (new_mode, x, old_mode, 0);
2805     }
2806
2807   return ret;
2808 }
2809
2810 /* A subroutine of emit_move_insn_1.  Generate a move from Y into X using
2811    an integer mode of the same size as MODE.  Returns the instruction
2812    emitted, or NULL if such a move could not be generated.  */
2813
2814 static rtx
2815 emit_move_via_integer (enum machine_mode mode, rtx x, rtx y, bool force)
2816 {
2817   enum machine_mode imode;
2818   enum insn_code code;
2819
2820   /* There must exist a mode of the exact size we require.  */
2821   imode = int_mode_for_mode (mode);
2822   if (imode == BLKmode)
2823     return NULL_RTX;
2824
2825   /* The target must support moves in this mode.  */
2826   code = mov_optab->handlers[imode].insn_code;
2827   if (code == CODE_FOR_nothing)
2828     return NULL_RTX;
2829
2830   x = emit_move_change_mode (imode, mode, x, force);
2831   if (x == NULL_RTX)
2832     return NULL_RTX;
2833   y = emit_move_change_mode (imode, mode, y, force);
2834   if (y == NULL_RTX)
2835     return NULL_RTX;
2836   return emit_insn (GEN_FCN (code) (x, y));
2837 }
2838
2839 /* A subroutine of emit_move_insn_1.  X is a push_operand in MODE.
2840    Return an equivalent MEM that does not use an auto-increment.  */
2841
2842 static rtx
2843 emit_move_resolve_push (enum machine_mode mode, rtx x)
2844 {
2845   enum rtx_code code = GET_CODE (XEXP (x, 0));
2846   HOST_WIDE_INT adjust;
2847   rtx temp;
2848
2849   adjust = GET_MODE_SIZE (mode);
2850 #ifdef PUSH_ROUNDING
2851   adjust = PUSH_ROUNDING (adjust);
2852 #endif
2853   if (code == PRE_DEC || code == POST_DEC)
2854     adjust = -adjust;
2855
2856   /* Do not use anti_adjust_stack, since we don't want to update
2857      stack_pointer_delta.  */
2858   temp = expand_simple_binop (Pmode, PLUS, stack_pointer_rtx,
2859                               GEN_INT (adjust), stack_pointer_rtx,
2860                               0, OPTAB_LIB_WIDEN);
2861   if (temp != stack_pointer_rtx)
2862     emit_move_insn (stack_pointer_rtx, temp);
2863
2864   switch (code)
2865     {
2866     case PRE_INC:
2867     case PRE_DEC:
2868       temp = stack_pointer_rtx;
2869       break;
2870     case POST_INC:
2871       temp = plus_constant (stack_pointer_rtx, -GET_MODE_SIZE (mode));
2872       break;
2873     case POST_DEC:
2874       temp = plus_constant (stack_pointer_rtx, GET_MODE_SIZE (mode));
2875       break;
2876     default:
2877       gcc_unreachable ();
2878     }
2879
2880   return replace_equiv_address (x, temp);
2881 }
2882
2883 /* A subroutine of emit_move_complex.  Generate a move from Y into X.
2884    X is known to satisfy push_operand, and MODE is known to be complex.
2885    Returns the last instruction emitted.  */
2886
2887 static rtx
2888 emit_move_complex_push (enum machine_mode mode, rtx x, rtx y)
2889 {
2890   enum machine_mode submode = GET_MODE_INNER (mode);
2891   bool imag_first;
2892
2893 #ifdef PUSH_ROUNDING
2894   unsigned int submodesize = GET_MODE_SIZE (submode);
2895
2896   /* In case we output to the stack, but the size is smaller than the
2897      machine can push exactly, we need to use move instructions.  */
2898   if (PUSH_ROUNDING (submodesize) != submodesize)
2899     {
2900       x = emit_move_resolve_push (mode, x);
2901       return emit_move_insn (x, y);
2902     }
2903 #endif
2904
2905   /* Note that the real part always precedes the imag part in memory
2906      regardless of machine's endianness.  */
2907   switch (GET_CODE (XEXP (x, 0)))
2908     {
2909     case PRE_DEC:
2910     case POST_DEC:
2911       imag_first = true;
2912       break;
2913     case PRE_INC:
2914     case POST_INC:
2915       imag_first = false;
2916       break;
2917     default:
2918       gcc_unreachable ();
2919     }
2920
2921   emit_move_insn (gen_rtx_MEM (submode, XEXP (x, 0)),
2922                   read_complex_part (y, imag_first));
2923   return emit_move_insn (gen_rtx_MEM (submode, XEXP (x, 0)),
2924                          read_complex_part (y, !imag_first));
2925 }
2926
2927 /* A subroutine of emit_move_insn_1.  Generate a move from Y into X.
2928    MODE is known to be complex.  Returns the last instruction emitted.  */
2929
2930 static rtx
2931 emit_move_complex (enum machine_mode mode, rtx x, rtx y)
2932 {
2933   bool try_int;
2934
2935   /* Need to take special care for pushes, to maintain proper ordering
2936      of the data, and possibly extra padding.  */
2937   if (push_operand (x, mode))
2938     return emit_move_complex_push (mode, x, y);
2939
2940   /* See if we can coerce the target into moving both values at once.  */
2941
2942   /* Move floating point as parts.  */
2943   if (GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT
2944       && mov_optab->handlers[GET_MODE_INNER (mode)].insn_code != CODE_FOR_nothing)
2945     try_int = false;
2946   /* Not possible if the values are inherently not adjacent.  */
2947   else if (GET_CODE (x) == CONCAT || GET_CODE (y) == CONCAT)
2948     try_int = false;
2949   /* Is possible if both are registers (or subregs of registers).  */
2950   else if (register_operand (x, mode) && register_operand (y, mode))
2951     try_int = true;
2952   /* If one of the operands is a memory, and alignment constraints
2953      are friendly enough, we may be able to do combined memory operations.
2954      We do not attempt this if Y is a constant because that combination is
2955      usually better with the by-parts thing below.  */
2956   else if ((MEM_P (x) ? !CONSTANT_P (y) : MEM_P (y))
2957            && (!STRICT_ALIGNMENT
2958                || get_mode_alignment (mode) == BIGGEST_ALIGNMENT))
2959     try_int = true;
2960   else
2961     try_int = false;
2962
2963   if (try_int)
2964     {
2965       rtx ret;
2966
2967       /* For memory to memory moves, optimal behavior can be had with the
2968          existing block move logic.  */
2969       if (MEM_P (x) && MEM_P (y))
2970         {
2971           emit_block_move (x, y, GEN_INT (GET_MODE_SIZE (mode)),
2972                            BLOCK_OP_NO_LIBCALL);
2973           return get_last_insn ();
2974         }
2975
2976       ret = emit_move_via_integer (mode, x, y, true);
2977       if (ret)
2978         return ret;
2979     }
2980
2981   /* Show the output dies here.  This is necessary for SUBREGs
2982      of pseudos since we cannot track their lifetimes correctly;
2983      hard regs shouldn't appear here except as return values.  */
2984   if (!reload_completed && !reload_in_progress
2985       && REG_P (x) && !reg_overlap_mentioned_p (x, y))
2986     emit_insn (gen_rtx_CLOBBER (VOIDmode, x));
2987
2988   write_complex_part (x, read_complex_part (y, false), false);
2989   write_complex_part (x, read_complex_part (y, true), true);
2990   return get_last_insn ();
2991 }
2992
2993 /* A subroutine of emit_move_insn_1.  Generate a move from Y into X.
2994    MODE is known to be MODE_CC.  Returns the last instruction emitted.  */
2995
2996 static rtx
2997 emit_move_ccmode (enum machine_mode mode, rtx x, rtx y)
2998 {
2999   rtx ret;
3000
3001   /* Assume all MODE_CC modes are equivalent; if we have movcc, use it.  */
3002   if (mode != CCmode)
3003     {
3004       enum insn_code code = mov_optab->handlers[CCmode].insn_code;
3005       if (code != CODE_FOR_nothing)
3006         {
3007           x = emit_move_change_mode (CCmode, mode, x, true);
3008           y = emit_move_change_mode (CCmode, mode, y, true);
3009           return emit_insn (GEN_FCN (code) (x, y));
3010         }
3011     }
3012
3013   /* Otherwise, find the MODE_INT mode of the same width.  */
3014   ret = emit_move_via_integer (mode, x, y, false);
3015   gcc_assert (ret != NULL);
3016   return ret;
3017 }
3018
3019 /* A subroutine of emit_move_insn_1.  Generate a move from Y into X.
3020    MODE is any multi-word or full-word mode that lacks a move_insn
3021    pattern.  Note that you will get better code if you define such
3022    patterns, even if they must turn into multiple assembler instructions.  */
3023
3024 static rtx
3025 emit_move_multi_word (enum machine_mode mode, rtx x, rtx y)
3026 {
3027   rtx last_insn = 0;
3028   rtx seq, inner;
3029   bool need_clobber;
3030   int i;
3031       
3032   gcc_assert (GET_MODE_SIZE (mode) >= UNITS_PER_WORD);
3033       
3034   /* If X is a push on the stack, do the push now and replace
3035      X with a reference to the stack pointer.  */
3036   if (push_operand (x, mode))
3037     x = emit_move_resolve_push (mode, x);
3038
3039   /* If we are in reload, see if either operand is a MEM whose address
3040      is scheduled for replacement.  */
3041   if (reload_in_progress && MEM_P (x)
3042       && (inner = find_replacement (&XEXP (x, 0))) != XEXP (x, 0))
3043     x = replace_equiv_address_nv (x, inner);
3044   if (reload_in_progress && MEM_P (y)
3045       && (inner = find_replacement (&XEXP (y, 0))) != XEXP (y, 0))
3046     y = replace_equiv_address_nv (y, inner);
3047
3048   start_sequence ();
3049
3050   need_clobber = false;
3051   for (i = 0;
3052        i < (GET_MODE_SIZE (mode) + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD;
3053        i++)
3054     {
3055       rtx xpart = operand_subword (x, i, 1, mode);
3056       rtx ypart = operand_subword (y, i, 1, mode);
3057
3058       /* If we can't get a part of Y, put Y into memory if it is a
3059          constant.  Otherwise, force it into a register.  Then we must
3060          be able to get a part of Y.  */
3061       if (ypart == 0 && CONSTANT_P (y))
3062         {
3063           y = force_const_mem (mode, y);
3064           ypart = operand_subword (y, i, 1, mode);
3065         }
3066       else if (ypart == 0)
3067         ypart = operand_subword_force (y, i, mode);
3068
3069       gcc_assert (xpart && ypart);
3070
3071       need_clobber |= (GET_CODE (xpart) == SUBREG);
3072
3073       last_insn = emit_move_insn (xpart, ypart);
3074     }
3075
3076   seq = get_insns ();
3077   end_sequence ();
3078
3079   /* Show the output dies here.  This is necessary for SUBREGs
3080      of pseudos since we cannot track their lifetimes correctly;
3081      hard regs shouldn't appear here except as return values.
3082      We never want to emit such a clobber after reload.  */
3083   if (x != y
3084       && ! (reload_in_progress || reload_completed)
3085       && need_clobber != 0)
3086     emit_insn (gen_rtx_CLOBBER (VOIDmode, x));
3087
3088   emit_insn (seq);
3089
3090   return last_insn;
3091 }
3092
3093 /* Low level part of emit_move_insn.
3094    Called just like emit_move_insn, but assumes X and Y
3095    are basically valid.  */
3096
3097 rtx
3098 emit_move_insn_1 (rtx x, rtx y)
3099 {
3100   enum machine_mode mode = GET_MODE (x);
3101   enum insn_code code;
3102
3103   gcc_assert ((unsigned int) mode < (unsigned int) MAX_MACHINE_MODE);
3104
3105   code = mov_optab->handlers[mode].insn_code;
3106   if (code != CODE_FOR_nothing)
3107     return emit_insn (GEN_FCN (code) (x, y));
3108
3109   /* Expand complex moves by moving real part and imag part.  */
3110   if (COMPLEX_MODE_P (mode))
3111     return emit_move_complex (mode, x, y);
3112
3113   if (GET_MODE_CLASS (mode) == MODE_CC)
3114     return emit_move_ccmode (mode, x, y);
3115
3116   /* Try using a move pattern for the corresponding integer mode.  This is
3117      only safe when simplify_subreg can convert MODE constants into integer
3118      constants.  At present, it can only do this reliably if the value
3119      fits within a HOST_WIDE_INT.  */
3120   if (!CONSTANT_P (y) || GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
3121     {
3122       rtx ret = emit_move_via_integer (mode, x, y, false);
3123       if (ret)
3124         return ret;
3125     }
3126
3127   return emit_move_multi_word (mode, x, y);
3128 }
3129
3130 /* Generate code to copy Y into X.
3131    Both Y and X must have the same mode, except that
3132    Y can be a constant with VOIDmode.
3133    This mode cannot be BLKmode; use emit_block_move for that.
3134
3135    Return the last instruction emitted.  */
3136
3137 rtx
3138 emit_move_insn (rtx x, rtx y)
3139 {
3140   enum machine_mode mode = GET_MODE (x);
3141   rtx y_cst = NULL_RTX;
3142   rtx last_insn, set;
3143
3144   gcc_assert (mode != BLKmode
3145               && (GET_MODE (y) == mode || GET_MODE (y) == VOIDmode));
3146
3147   if (CONSTANT_P (y))
3148     {
3149       if (optimize
3150           && SCALAR_FLOAT_MODE_P (GET_MODE (x))
3151           && (last_insn = compress_float_constant (x, y)))
3152         return last_insn;
3153
3154       y_cst = y;
3155
3156       if (!LEGITIMATE_CONSTANT_P (y))
3157         {
3158           y = force_const_mem (mode, y);
3159
3160           /* If the target's cannot_force_const_mem prevented the spill,
3161              assume that the target's move expanders will also take care
3162              of the non-legitimate constant.  */
3163           if (!y)
3164             y = y_cst;
3165         }
3166     }
3167
3168   /* If X or Y are memory references, verify that their addresses are valid
3169      for the machine.  */
3170   if (MEM_P (x)
3171       && ((! memory_address_p (GET_MODE (x), XEXP (x, 0))
3172            && ! push_operand (x, GET_MODE (x)))
3173           || (flag_force_addr
3174               && CONSTANT_ADDRESS_P (XEXP (x, 0)))))
3175     x = validize_mem (x);
3176
3177   if (MEM_P (y)
3178       && (! memory_address_p (GET_MODE (y), XEXP (y, 0))
3179           || (flag_force_addr
3180               && CONSTANT_ADDRESS_P (XEXP (y, 0)))))
3181     y = validize_mem (y);
3182
3183   gcc_assert (mode != BLKmode);
3184
3185   last_insn = emit_move_insn_1 (x, y);
3186
3187   if (y_cst && REG_P (x)
3188       && (set = single_set (last_insn)) != NULL_RTX
3189       && SET_DEST (set) == x
3190       && ! rtx_equal_p (y_cst, SET_SRC (set)))
3191     set_unique_reg_note (last_insn, REG_EQUAL, y_cst);
3192
3193   return last_insn;
3194 }
3195
3196 /* If Y is representable exactly in a narrower mode, and the target can
3197    perform the extension directly from constant or memory, then emit the
3198    move as an extension.  */
3199
3200 static rtx
3201 compress_float_constant (rtx x, rtx y)
3202 {
3203   enum machine_mode dstmode = GET_MODE (x);
3204   enum machine_mode orig_srcmode = GET_MODE (y);
3205   enum machine_mode srcmode;
3206   REAL_VALUE_TYPE r;
3207   int oldcost, newcost;
3208
3209   REAL_VALUE_FROM_CONST_DOUBLE (r, y);
3210
3211   if (LEGITIMATE_CONSTANT_P (y))
3212     oldcost = rtx_cost (y, SET);
3213   else
3214     oldcost = rtx_cost (force_const_mem (dstmode, y), SET);
3215
3216   for (srcmode = GET_CLASS_NARROWEST_MODE (GET_MODE_CLASS (orig_srcmode));
3217        srcmode != orig_srcmode;
3218        srcmode = GET_MODE_WIDER_MODE (srcmode))
3219     {
3220       enum insn_code ic;
3221       rtx trunc_y, last_insn;
3222
3223       /* Skip if the target can't extend this way.  */
3224       ic = can_extend_p (dstmode, srcmode, 0);
3225       if (ic == CODE_FOR_nothing)
3226         continue;
3227
3228       /* Skip if the narrowed value isn't exact.  */
3229       if (! exact_real_truncate (srcmode, &r))
3230         continue;
3231
3232       trunc_y = CONST_DOUBLE_FROM_REAL_VALUE (r, srcmode);
3233
3234       if (LEGITIMATE_CONSTANT_P (trunc_y))
3235         {
3236           /* Skip if the target needs extra instructions to perform
3237              the extension.  */
3238           if (! (*insn_data[ic].operand[1].predicate) (trunc_y, srcmode))
3239             continue;
3240           /* This is valid, but may not be cheaper than the original. */
3241           newcost = rtx_cost (gen_rtx_FLOAT_EXTEND (dstmode, trunc_y), SET);
3242           if (oldcost < newcost)
3243             continue;
3244         }
3245       else if (float_extend_from_mem[dstmode][srcmode])
3246         {
3247           trunc_y = force_const_mem (srcmode, trunc_y);
3248           /* This is valid, but may not be cheaper than the original. */
3249           newcost = rtx_cost (gen_rtx_FLOAT_EXTEND (dstmode, trunc_y), SET);
3250           if (oldcost < newcost)
3251             continue;
3252           trunc_y = validize_mem (trunc_y);
3253         }
3254       else
3255         continue;
3256  
3257       emit_unop_insn (ic, x, trunc_y, UNKNOWN);
3258       last_insn = get_last_insn ();
3259
3260       if (REG_P (x))
3261         set_unique_reg_note (last_insn, REG_EQUAL, y);
3262
3263       return last_insn;
3264     }
3265
3266   return NULL_RTX;
3267 }
3268 \f
3269 /* Pushing data onto the stack.  */
3270
3271 /* Push a block of length SIZE (perhaps variable)
3272    and return an rtx to address the beginning of the block.
3273    The value may be virtual_outgoing_args_rtx.
3274
3275    EXTRA is the number of bytes of padding to push in addition to SIZE.
3276    BELOW nonzero means this padding comes at low addresses;
3277    otherwise, the padding comes at high addresses.  */
3278
3279 rtx
3280 push_block (rtx size, int extra, int below)
3281 {
3282   rtx temp;
3283
3284   size = convert_modes (Pmode, ptr_mode, size, 1);
3285   if (CONSTANT_P (size))
3286     anti_adjust_stack (plus_constant (size, extra));
3287   else if (REG_P (size) && extra == 0)
3288     anti_adjust_stack (size);
3289   else
3290     {
3291       temp = copy_to_mode_reg (Pmode, size);
3292       if (extra != 0)
3293         temp = expand_binop (Pmode, add_optab, temp, GEN_INT (extra),
3294                              temp, 0, OPTAB_LIB_WIDEN);
3295       anti_adjust_stack (temp);
3296     }
3297
3298 #ifndef STACK_GROWS_DOWNWARD
3299   if (0)
3300 #else
3301   if (1)
3302 #endif
3303     {
3304       temp = virtual_outgoing_args_rtx;
3305       if (extra != 0 && below)
3306         temp = plus_constant (temp, extra);
3307     }
3308   else
3309     {
3310       if (GET_CODE (size) == CONST_INT)
3311         temp = plus_constant (virtual_outgoing_args_rtx,
3312                               -INTVAL (size) - (below ? 0 : extra));
3313       else if (extra != 0 && !below)
3314         temp = gen_rtx_PLUS (Pmode, virtual_outgoing_args_rtx,
3315                              negate_rtx (Pmode, plus_constant (size, extra)));
3316       else
3317         temp = gen_rtx_PLUS (Pmode, virtual_outgoing_args_rtx,
3318                              negate_rtx (Pmode, size));
3319     }
3320
3321   return memory_address (GET_CLASS_NARROWEST_MODE (MODE_INT), temp);
3322 }
3323
3324 #ifdef PUSH_ROUNDING
3325
3326 /* Emit single push insn.  */
3327
3328 static void
3329 emit_single_push_insn (enum machine_mode mode, rtx x, tree type)
3330 {
3331   rtx dest_addr;
3332   unsigned rounded_size = PUSH_ROUNDING (GET_MODE_SIZE (mode));
3333   rtx dest;
3334   enum insn_code icode;
3335   insn_operand_predicate_fn pred;
3336
3337   stack_pointer_delta += PUSH_ROUNDING (GET_MODE_SIZE (mode));
3338   /* If there is push pattern, use it.  Otherwise try old way of throwing
3339      MEM representing push operation to move expander.  */
3340   icode = push_optab->handlers[(int) mode].insn_code;
3341   if (icode != CODE_FOR_nothing)
3342     {
3343       if (((pred = insn_data[(int) icode].operand[0].predicate)
3344            && !((*pred) (x, mode))))
3345         x = force_reg (mode, x);
3346       emit_insn (GEN_FCN (icode) (x));
3347       return;
3348     }
3349   if (GET_MODE_SIZE (mode) == rounded_size)
3350     dest_addr = gen_rtx_fmt_e (STACK_PUSH_CODE, Pmode, stack_pointer_rtx);
3351   /* If we are to pad downward, adjust the stack pointer first and
3352      then store X into the stack location using an offset.  This is
3353      because emit_move_insn does not know how to pad; it does not have
3354      access to type.  */
3355   else if (FUNCTION_ARG_PADDING (mode, type) == downward)
3356     {
3357       unsigned padding_size = rounded_size - GET_MODE_SIZE (mode);
3358       HOST_WIDE_INT offset;
3359
3360       emit_move_insn (stack_pointer_rtx,
3361                       expand_binop (Pmode,
3362 #ifdef STACK_GROWS_DOWNWARD
3363                                     sub_optab,
3364 #else
3365                                     add_optab,
3366 #endif
3367                                     stack_pointer_rtx,
3368                                     GEN_INT (rounded_size),
3369                                     NULL_RTX, 0, OPTAB_LIB_WIDEN));
3370
3371       offset = (HOST_WIDE_INT) padding_size;
3372 #ifdef STACK_GROWS_DOWNWARD
3373       if (STACK_PUSH_CODE == POST_DEC)
3374         /* We have already decremented the stack pointer, so get the
3375            previous value.  */
3376         offset += (HOST_WIDE_INT) rounded_size;
3377 #else
3378       if (STACK_PUSH_CODE == POST_INC)
3379         /* We have already incremented the stack pointer, so get the
3380            previous value.  */
3381         offset -= (HOST_WIDE_INT) rounded_size;
3382 #endif
3383       dest_addr = gen_rtx_PLUS (Pmode, stack_pointer_rtx, GEN_INT (offset));
3384     }
3385   else
3386     {
3387 #ifdef STACK_GROWS_DOWNWARD
3388       /* ??? This seems wrong if STACK_PUSH_CODE == POST_DEC.  */
3389       dest_addr = gen_rtx_PLUS (Pmode, stack_pointer_rtx,
3390                                 GEN_INT (-(HOST_WIDE_INT) rounded_size));
3391 #else
3392       /* ??? This seems wrong if STACK_PUSH_CODE == POST_INC.  */
3393       dest_addr = gen_rtx_PLUS (Pmode, stack_pointer_rtx,
3394                                 GEN_INT (rounded_size));
3395 #endif
3396       dest_addr = gen_rtx_PRE_MODIFY (Pmode, stack_pointer_rtx, dest_addr);
3397     }
3398
3399   dest = gen_rtx_MEM (mode, dest_addr);
3400
3401   if (type != 0)
3402     {
3403       set_mem_attributes (dest, type, 1);
3404
3405       if (flag_optimize_sibling_calls)
3406         /* Function incoming arguments may overlap with sibling call
3407            outgoing arguments and we cannot allow reordering of reads
3408            from function arguments with stores to outgoing arguments
3409            of sibling calls.  */
3410         set_mem_alias_set (dest, 0);
3411     }
3412   emit_move_insn (dest, x);
3413 }
3414 #endif
3415
3416 /* Generate code to push X onto the stack, assuming it has mode MODE and
3417    type TYPE.
3418    MODE is redundant except when X is a CONST_INT (since they don't
3419    carry mode info).
3420    SIZE is an rtx for the size of data to be copied (in bytes),
3421    needed only if X is BLKmode.
3422
3423    ALIGN (in bits) is maximum alignment we can assume.
3424
3425    If PARTIAL and REG are both nonzero, then copy that many of the first
3426    bytes of X into registers starting with REG, and push the rest of X.
3427    The amount of space pushed is decreased by PARTIAL bytes.
3428    REG must be a hard register in this case.
3429    If REG is zero but PARTIAL is not, take any all others actions for an
3430    argument partially in registers, but do not actually load any
3431    registers.
3432
3433    EXTRA is the amount in bytes of extra space to leave next to this arg.
3434    This is ignored if an argument block has already been allocated.
3435
3436    On a machine that lacks real push insns, ARGS_ADDR is the address of
3437    the bottom of the argument block for this call.  We use indexing off there
3438    to store the arg.  On machines with push insns, ARGS_ADDR is 0 when a
3439    argument block has not been preallocated.
3440
3441    ARGS_SO_FAR is the size of args previously pushed for this call.
3442
3443    REG_PARM_STACK_SPACE is nonzero if functions require stack space
3444    for arguments passed in registers.  If nonzero, it will be the number
3445    of bytes required.  */
3446
3447 void
3448 emit_push_insn (rtx x, enum machine_mode mode, tree type, rtx size,
3449                 unsigned int align, int partial, rtx reg, int extra,
3450                 rtx args_addr, rtx args_so_far, int reg_parm_stack_space,
3451                 rtx alignment_pad)
3452 {
3453   rtx xinner;
3454   enum direction stack_direction
3455 #ifdef STACK_GROWS_DOWNWARD
3456     = downward;
3457 #else
3458     = upward;
3459 #endif
3460
3461   /* Decide where to pad the argument: `downward' for below,
3462      `upward' for above, or `none' for don't pad it.
3463      Default is below for small data on big-endian machines; else above.  */
3464   enum direction where_pad = FUNCTION_ARG_PADDING (mode, type);
3465
3466   /* Invert direction if stack is post-decrement.
3467      FIXME: why?  */
3468   if (STACK_PUSH_CODE == POST_DEC)
3469     if (where_pad != none)
3470       where_pad = (where_pad == downward ? upward : downward);
3471
3472   xinner = x;
3473
3474   if (mode == BLKmode)
3475     {
3476       /* Copy a block into the stack, entirely or partially.  */
3477
3478       rtx temp;
3479       int used;
3480       int offset;
3481       int skip;
3482
3483       offset = partial % (PARM_BOUNDARY / BITS_PER_UNIT);
3484       used = partial - offset;
3485
3486       gcc_assert (size);
3487
3488       /* USED is now the # of bytes we need not copy to the stack
3489          because registers will take care of them.  */
3490
3491       if (partial != 0)
3492         xinner = adjust_address (xinner, BLKmode, used);
3493
3494       /* If the partial register-part of the arg counts in its stack size,
3495          skip the part of stack space corresponding to the registers.
3496          Otherwise, start copying to the beginning of the stack space,
3497          by setting SKIP to 0.  */
3498       skip = (reg_parm_stack_space == 0) ? 0 : used;
3499
3500 #ifdef PUSH_ROUNDING
3501       /* Do it with several push insns if that doesn't take lots of insns
3502          and if there is no difficulty with push insns that skip bytes
3503          on the stack for alignment purposes.  */
3504       if (args_addr == 0
3505           && PUSH_ARGS
3506           && GET_CODE (size) == CONST_INT
3507           && skip == 0
3508           && MEM_ALIGN (xinner) >= align
3509           && (MOVE_BY_PIECES_P ((unsigned) INTVAL (size) - used, align))
3510           /* Here we avoid the case of a structure whose weak alignment
3511              forces many pushes of a small amount of data,
3512              and such small pushes do rounding that causes trouble.  */
3513           && ((! SLOW_UNALIGNED_ACCESS (word_mode, align))
3514               || align >= BIGGEST_ALIGNMENT
3515               || (PUSH_ROUNDING (align / BITS_PER_UNIT)
3516                   == (align / BITS_PER_UNIT)))
3517           && PUSH_ROUNDING (INTVAL (size)) == INTVAL (size))
3518         {
3519           /* Push padding now if padding above and stack grows down,
3520              or if padding below and stack grows up.
3521              But if space already allocated, this has already been done.  */
3522           if (extra && args_addr == 0
3523               && where_pad != none && where_pad != stack_direction)
3524             anti_adjust_stack (GEN_INT (extra));
3525
3526           move_by_pieces (NULL, xinner, INTVAL (size) - used, align, 0);
3527         }
3528       else
3529 #endif /* PUSH_ROUNDING  */
3530         {
3531           rtx target;
3532
3533           /* Otherwise make space on the stack and copy the data
3534              to the address of that space.  */
3535
3536           /* Deduct words put into registers from the size we must copy.  */
3537           if (partial != 0)
3538             {
3539               if (GET_CODE (size) == CONST_INT)
3540                 size = GEN_INT (INTVAL (size) - used);
3541               else
3542                 size = expand_binop (GET_MODE (size), sub_optab, size,
3543                                      GEN_INT (used), NULL_RTX, 0,
3544                                      OPTAB_LIB_WIDEN);
3545             }
3546
3547           /* Get the address of the stack space.
3548              In this case, we do not deal with EXTRA separately.
3549              A single stack adjust will do.  */
3550           if (! args_addr)
3551             {
3552               temp = push_block (size, extra, where_pad == downward);
3553               extra = 0;
3554             }
3555           else if (GET_CODE (args_so_far) == CONST_INT)
3556             temp = memory_address (BLKmode,
3557                                    plus_constant (args_addr,
3558                                                   skip + INTVAL (args_so_far)));
3559           else
3560             temp = memory_address (BLKmode,
3561                                    plus_constant (gen_rtx_PLUS (Pmode,
3562                                                                 args_addr,
3563                                                                 args_so_far),
3564                                                   skip));
3565
3566           if (!ACCUMULATE_OUTGOING_ARGS)
3567             {
3568               /* If the source is referenced relative to the stack pointer,
3569                  copy it to another register to stabilize it.  We do not need
3570                  to do this if we know that we won't be changing sp.  */
3571
3572               if (reg_mentioned_p (virtual_stack_dynamic_rtx, temp)
3573                   || reg_mentioned_p (virtual_outgoing_args_rtx, temp))
3574                 temp = copy_to_reg (temp);
3575             }
3576
3577           target = gen_rtx_MEM (BLKmode, temp);
3578
3579           /* We do *not* set_mem_attributes here, because incoming arguments
3580              may overlap with sibling call outgoing arguments and we cannot
3581              allow reordering of reads from function arguments with stores
3582              to outgoing arguments of sibling calls.  We do, however, want
3583              to record the alignment of the stack slot.  */
3584           /* ALIGN may well be better aligned than TYPE, e.g. due to
3585              PARM_BOUNDARY.  Assume the caller isn't lying.  */
3586           set_mem_align (target, align);
3587
3588           emit_block_move (target, xinner, size, BLOCK_OP_CALL_PARM);
3589         }
3590     }
3591   else if (partial > 0)
3592     {
3593       /* Scalar partly in registers.  */
3594
3595       int size = GET_MODE_SIZE (mode) / UNITS_PER_WORD;
3596       int i;
3597       int not_stack;
3598       /* # bytes of start of argument
3599          that we must make space for but need not store.  */
3600       int offset = partial % (PARM_BOUNDARY / BITS_PER_UNIT);
3601       int args_offset = INTVAL (args_so_far);
3602       int skip;
3603
3604       /* Push padding now if padding above and stack grows down,
3605          or if padding below and stack grows up.
3606          But if space already allocated, this has already been done.  */
3607       if (extra && args_addr == 0
3608           && where_pad != none && where_pad != stack_direction)
3609         anti_adjust_stack (GEN_INT (extra));
3610
3611       /* If we make space by pushing it, we might as well push
3612          the real data.  Otherwise, we can leave OFFSET nonzero
3613          and leave the space uninitialized.  */
3614       if (args_addr == 0)
3615         offset = 0;
3616
3617       /* Now NOT_STACK gets the number of words that we don't need to
3618          allocate on the stack.  Convert OFFSET to words too.  */
3619       not_stack = (partial - offset) / UNITS_PER_WORD;
3620       offset /= UNITS_PER_WORD;
3621
3622       /* If the partial register-part of the arg counts in its stack size,
3623          skip the part of stack space corresponding to the registers.
3624          Otherwise, start copying to the beginning of the stack space,
3625          by setting SKIP to 0.  */
3626       skip = (reg_parm_stack_space == 0) ? 0 : not_stack;
3627
3628       if (CONSTANT_P (x) && ! LEGITIMATE_CONSTANT_P (x))
3629         x = validize_mem (force_const_mem (mode, x));
3630
3631       /* If X is a hard register in a non-integer mode, copy it into a pseudo;
3632          SUBREGs of such registers are not allowed.  */
3633       if ((REG_P (x) && REGNO (x) < FIRST_PSEUDO_REGISTER
3634            && GET_MODE_CLASS (GET_MODE (x)) != MODE_INT))
3635         x = copy_to_reg (x);
3636
3637       /* Loop over all the words allocated on the stack for this arg.  */
3638       /* We can do it by words, because any scalar bigger than a word
3639          has a size a multiple of a word.  */
3640 #ifndef PUSH_ARGS_REVERSED
3641       for (i = not_stack; i < size; i++)
3642 #else
3643       for (i = size - 1; i >= not_stack; i--)
3644 #endif
3645         if (i >= not_stack + offset)
3646           emit_push_insn (operand_subword_force (x, i, mode),
3647                           word_mode, NULL_TREE, NULL_RTX, align, 0, NULL_RTX,
3648                           0, args_addr,
3649                           GEN_INT (args_offset + ((i - not_stack + skip)
3650                                                   * UNITS_PER_WORD)),
3651                           reg_parm_stack_space, alignment_pad);
3652     }
3653   else
3654     {
3655       rtx addr;
3656       rtx dest;
3657
3658       /* Push padding now if padding above and stack grows down,
3659          or if padding below and stack grows up.
3660          But if space already allocated, this has already been done.  */
3661       if (extra && args_addr == 0
3662           && where_pad != none && where_pad != stack_direction)
3663         anti_adjust_stack (GEN_INT (extra));
3664
3665 #ifdef PUSH_ROUNDING
3666       if (args_addr == 0 && PUSH_ARGS)
3667         emit_single_push_insn (mode, x, type);
3668       else
3669 #endif
3670         {
3671           if (GET_CODE (args_so_far) == CONST_INT)
3672             addr
3673               = memory_address (mode,
3674                                 plus_constant (args_addr,
3675                                                INTVAL (args_so_far)));
3676           else
3677             addr = memory_address (mode, gen_rtx_PLUS (Pmode, args_addr,
3678                                                        args_so_far));
3679           dest = gen_rtx_MEM (mode, addr);
3680
3681           /* We do *not* set_mem_attributes here, because incoming arguments
3682              may overlap with sibling call outgoing arguments and we cannot
3683              allow reordering of reads from function arguments with stores
3684              to outgoing arguments of sibling calls.  We do, however, want
3685              to record the alignment of the stack slot.  */
3686           /* ALIGN may well be better aligned than TYPE, e.g. due to
3687              PARM_BOUNDARY.  Assume the caller isn't lying.  */
3688           set_mem_align (dest, align);
3689
3690           emit_move_insn (dest, x);
3691         }
3692     }
3693
3694   /* If part should go in registers, copy that part
3695      into the appropriate registers.  Do this now, at the end,
3696      since mem-to-mem copies above may do function calls.  */
3697   if (partial > 0 && reg != 0)
3698     {
3699       /* Handle calls that pass values in multiple non-contiguous locations.
3700          The Irix 6 ABI has examples of this.  */
3701       if (GET_CODE (reg) == PARALLEL)
3702         emit_group_load (reg, x, type, -1);
3703       else
3704         {
3705           gcc_assert (partial % UNITS_PER_WORD == 0);
3706           move_block_to_reg (REGNO (reg), x, partial / UNITS_PER_WORD, mode);
3707         }
3708     }
3709
3710   if (extra && args_addr == 0 && where_pad == stack_direction)
3711     anti_adjust_stack (GEN_INT (extra));
3712
3713   if (alignment_pad && args_addr == 0)
3714     anti_adjust_stack (alignment_pad);
3715 }
3716 \f
3717 /* Return X if X can be used as a subtarget in a sequence of arithmetic
3718    operations.  */
3719
3720 static rtx
3721 get_subtarget (rtx x)
3722 {
3723   return (optimize
3724           || x == 0
3725            /* Only registers can be subtargets.  */
3726            || !REG_P (x)
3727            /* Don't use hard regs to avoid extending their life.  */
3728            || REGNO (x) < FIRST_PSEUDO_REGISTER
3729           ? 0 : x);
3730 }
3731
3732 /* A subroutine of expand_assignment.  Optimize FIELD op= VAL, where
3733    FIELD is a bitfield.  Returns true if the optimization was successful,
3734    and there's nothing else to do.  */
3735
3736 static bool
3737 optimize_bitfield_assignment_op (unsigned HOST_WIDE_INT bitsize,
3738                                  unsigned HOST_WIDE_INT bitpos,
3739                                  enum machine_mode mode1, rtx str_rtx,
3740                                  tree to, tree src)
3741 {
3742   enum machine_mode str_mode = GET_MODE (str_rtx);
3743   unsigned int str_bitsize = GET_MODE_BITSIZE (str_mode);
3744   tree op0, op1;
3745   rtx value, result;
3746   optab binop;
3747
3748   if (mode1 != VOIDmode
3749       || bitsize >= BITS_PER_WORD
3750       || str_bitsize > BITS_PER_WORD
3751       || TREE_SIDE_EFFECTS (to)
3752       || TREE_THIS_VOLATILE (to))
3753     return false;
3754
3755   STRIP_NOPS (src);
3756   if (!BINARY_CLASS_P (src)
3757       || TREE_CODE (TREE_TYPE (src)) != INTEGER_TYPE)
3758     return false;
3759
3760   op0 = TREE_OPERAND (src, 0);
3761   op1 = TREE_OPERAND (src, 1);
3762   STRIP_NOPS (op0);
3763
3764   if (!operand_equal_p (to, op0, 0))
3765     return false;
3766
3767   if (MEM_P (str_rtx))
3768     {
3769       unsigned HOST_WIDE_INT offset1;
3770
3771       if (str_bitsize == 0 || str_bitsize > BITS_PER_WORD)
3772         str_mode = word_mode;
3773       str_mode = get_best_mode (bitsize, bitpos,
3774                                 MEM_ALIGN (str_rtx), str_mode, 0);
3775       if (str_mode == VOIDmode)
3776         return false;
3777       str_bitsize = GET_MODE_BITSIZE (str_mode);
3778
3779       offset1 = bitpos;
3780       bitpos %= str_bitsize;
3781       offset1 = (offset1 - bitpos) / BITS_PER_UNIT;
3782       str_rtx = adjust_address (str_rtx, str_mode, offset1);
3783     }
3784   else if (!REG_P (str_rtx) && GET_CODE (str_rtx) != SUBREG)
3785     return false;
3786
3787   /* If the bit field covers the whole REG/MEM, store_field
3788      will likely generate better code.  */
3789   if (bitsize >= str_bitsize)
3790     return false;
3791
3792   /* We can't handle fields split across multiple entities.  */
3793   if (bitpos + bitsize > str_bitsize)
3794     return false;
3795
3796   if (BYTES_BIG_ENDIAN)
3797     bitpos = str_bitsize - bitpos - bitsize;
3798
3799   switch (TREE_CODE (src))
3800     {
3801     case PLUS_EXPR:
3802     case MINUS_EXPR:
3803       /* For now, just optimize the case of the topmost bitfield
3804          where we don't need to do any masking and also
3805          1 bit bitfields where xor can be used.
3806          We might win by one instruction for the other bitfields
3807          too if insv/extv instructions aren't used, so that
3808          can be added later.  */
3809       if (bitpos + bitsize != str_bitsize
3810           && (bitsize != 1 || TREE_CODE (op1) != INTEGER_CST))
3811         break;
3812
3813       value = expand_expr (op1, NULL_RTX, str_mode, 0);
3814       value = convert_modes (str_mode,
3815                              TYPE_MODE (TREE_TYPE (op1)), value,
3816                              TYPE_UNSIGNED (TREE_TYPE (op1)));
3817
3818       /* We may be accessing data outside the field, which means
3819          we can alias adjacent data.  */
3820       if (MEM_P (str_rtx))
3821         {
3822           str_rtx = shallow_copy_rtx (str_rtx);
3823           set_mem_alias_set (str_rtx, 0);
3824           set_mem_expr (str_rtx, 0);
3825         }
3826
3827       binop = TREE_CODE (src) == PLUS_EXPR ? add_optab : sub_optab;
3828       if (bitsize == 1 && bitpos + bitsize != str_bitsize)
3829         {
3830           value = expand_and (str_mode, value, const1_rtx, NULL);
3831           binop = xor_optab;
3832         }
3833       value = expand_shift (LSHIFT_EXPR, str_mode, value,
3834                             build_int_cst (NULL_TREE, bitpos),
3835                             NULL_RTX, 1);
3836       result = expand_binop (str_mode, binop, str_rtx,
3837                              value, str_rtx, 1, OPTAB_WIDEN);
3838       if (result != str_rtx)
3839         emit_move_insn (str_rtx, result);
3840       return true;
3841
3842     case BIT_IOR_EXPR:
3843     case BIT_XOR_EXPR:
3844       if (TREE_CODE (op1) != INTEGER_CST)
3845         break;
3846       value = expand_expr (op1, NULL_RTX, GET_MODE (str_rtx), 0);
3847       value = convert_modes (GET_MODE (str_rtx),
3848                              TYPE_MODE (TREE_TYPE (op1)), value,
3849                              TYPE_UNSIGNED (TREE_TYPE (op1)));
3850
3851       /* We may be accessing data outside the field, which means
3852          we can alias adjacent data.  */
3853       if (MEM_P (str_rtx))
3854         {
3855           str_rtx = shallow_copy_rtx (str_rtx);
3856           set_mem_alias_set (str_rtx, 0);
3857           set_mem_expr (str_rtx, 0);
3858         }
3859
3860       binop = TREE_CODE (src) == BIT_IOR_EXPR ? ior_optab : xor_optab;
3861       if (bitpos + bitsize != GET_MODE_BITSIZE (GET_MODE (str_rtx)))
3862         {
3863           rtx mask = GEN_INT (((unsigned HOST_WIDE_INT) 1 << bitsize)
3864                               - 1);
3865           value = expand_and (GET_MODE (str_rtx), value, mask,
3866                               NULL_RTX);
3867         }
3868       value = expand_shift (LSHIFT_EXPR, GET_MODE (str_rtx), value,
3869                             build_int_cst (NULL_TREE, bitpos),
3870                             NULL_RTX, 1);
3871       result = expand_binop (GET_MODE (str_rtx), binop, str_rtx,
3872                              value, str_rtx, 1, OPTAB_WIDEN);
3873       if (result != str_rtx)
3874         emit_move_insn (str_rtx, result);
3875       return true;
3876
3877     default:
3878       break;
3879     }
3880
3881   return false;
3882 }
3883
3884
3885 /* Expand an assignment that stores the value of FROM into TO.  */
3886
3887 void
3888 expand_assignment (tree to, tree from)
3889 {
3890   rtx to_rtx = 0;
3891   rtx result;
3892
3893   /* Don't crash if the lhs of the assignment was erroneous.  */
3894
3895   if (TREE_CODE (to) == ERROR_MARK)
3896     {
3897       result = expand_expr (from, NULL_RTX, VOIDmode, 0);
3898       return;
3899     }
3900
3901   /* Assignment of a structure component needs special treatment
3902      if the structure component's rtx is not simply a MEM.
3903      Assignment of an array element at a constant index, and assignment of
3904      an array element in an unaligned packed structure field, has the same
3905      problem.  */
3906   if (handled_component_p (to)
3907       || TREE_CODE (TREE_TYPE (to)) == ARRAY_TYPE)
3908     {
3909       enum machine_mode mode1;
3910       HOST_WIDE_INT bitsize, bitpos;
3911       tree offset;
3912       int unsignedp;
3913       int volatilep = 0;
3914       tree tem;
3915
3916       push_temp_slots ();
3917       tem = get_inner_reference (to, &bitsize, &bitpos, &offset, &mode1,
3918                                  &unsignedp, &volatilep, true);
3919
3920       /* If we are going to use store_bit_field and extract_bit_field,
3921          make sure to_rtx will be safe for multiple use.  */
3922
3923       to_rtx = expand_expr (tem, NULL_RTX, VOIDmode, 0);
3924
3925       if (offset != 0)
3926         {
3927           rtx offset_rtx;
3928
3929           if (!MEM_P (to_rtx))
3930             {
3931               /* We can get constant negative offsets into arrays with broken
3932                  user code.  Translate this to a trap instead of ICEing.  */
3933               gcc_assert (TREE_CODE (offset) == INTEGER_CST);
3934               expand_builtin_trap ();
3935               to_rtx = gen_rtx_MEM (BLKmode, const0_rtx);
3936             }
3937
3938           offset_rtx = expand_expr (offset, NULL_RTX, VOIDmode, EXPAND_SUM);
3939 #ifdef POINTERS_EXTEND_UNSIGNED
3940           if (GET_MODE (offset_rtx) != Pmode)
3941             offset_rtx = convert_to_mode (Pmode, offset_rtx, 0);
3942 #else
3943           if (GET_MODE (offset_rtx) != ptr_mode)
3944             offset_rtx = convert_to_mode (ptr_mode, offset_rtx, 0);
3945 #endif
3946
3947           /* A constant address in TO_RTX can have VOIDmode, we must not try
3948              to call force_reg for that case.  Avoid that case.  */
3949           if (MEM_P (to_rtx)
3950               && GET_MODE (to_rtx) == BLKmode
3951               && GET_MODE (XEXP (to_rtx, 0)) != VOIDmode
3952               && bitsize > 0
3953               && (bitpos % bitsize) == 0
3954               && (bitsize % GET_MODE_ALIGNMENT (mode1)) == 0
3955               && MEM_ALIGN (to_rtx) == GET_MODE_ALIGNMENT (mode1))
3956             {
3957               to_rtx = adjust_address (to_rtx, mode1, bitpos / BITS_PER_UNIT);
3958               bitpos = 0;
3959             }
3960
3961           to_rtx = offset_address (to_rtx, offset_rtx,
3962                                    highest_pow2_factor_for_target (to,
3963                                                                    offset));
3964         }
3965
3966       /* Handle expand_expr of a complex value returning a CONCAT.  */
3967       if (GET_CODE (to_rtx) == CONCAT)
3968         {
3969           if (TREE_CODE (TREE_TYPE (from)) == COMPLEX_TYPE)
3970             {
3971               gcc_assert (bitpos == 0);
3972               result = store_expr (from, to_rtx, false);
3973             }
3974           else
3975             {
3976               gcc_assert (bitpos == 0 || bitpos == GET_MODE_BITSIZE (mode1));
3977               result = store_expr (from, XEXP (to_rtx, bitpos != 0), false);
3978             }
3979         }
3980       else
3981         {
3982           if (MEM_P (to_rtx))
3983             {
3984               /* If the field is at offset zero, we could have been given the
3985                  DECL_RTX of the parent struct.  Don't munge it.  */
3986               to_rtx = shallow_copy_rtx (to_rtx);
3987
3988               set_mem_attributes_minus_bitpos (to_rtx, to, 0, bitpos);
3989
3990               /* Deal with volatile and readonly fields.  The former is only
3991                  done for MEM.  Also set MEM_KEEP_ALIAS_SET_P if needed.  */
3992               if (volatilep)
3993                 MEM_VOLATILE_P (to_rtx) = 1;
3994               if (component_uses_parent_alias_set (to))
3995                 MEM_KEEP_ALIAS_SET_P (to_rtx) = 1;
3996             }
3997
3998           if (optimize_bitfield_assignment_op (bitsize, bitpos, mode1,
3999                                                to_rtx, to, from))
4000             result = NULL;
4001           else
4002             result = store_field (to_rtx, bitsize, bitpos, mode1, from,
4003                                   TREE_TYPE (tem), get_alias_set (to));
4004         }
4005
4006       if (result)
4007         preserve_temp_slots (result);
4008       free_temp_slots ();
4009       pop_temp_slots ();
4010       return;
4011     }
4012
4013   /* If the rhs is a function call and its value is not an aggregate,
4014      call the function before we start to compute the lhs.
4015      This is needed for correct code for cases such as
4016      val = setjmp (buf) on machines where reference to val
4017      requires loading up part of an address in a separate insn.
4018
4019      Don't do this if TO is a VAR_DECL or PARM_DECL whose DECL_RTL is REG
4020      since it might be a promoted variable where the zero- or sign- extension
4021      needs to be done.  Handling this in the normal way is safe because no
4022      computation is done before the call.  */
4023   if (TREE_CODE (from) == CALL_EXPR && ! aggregate_value_p (from, from)
4024       && TREE_CODE (TYPE_SIZE (TREE_TYPE (from))) == INTEGER_CST
4025       && ! ((TREE_CODE (to) == VAR_DECL || TREE_CODE (to) == PARM_DECL)
4026             && REG_P (DECL_RTL (to))))
4027     {
4028       rtx value;
4029
4030       push_temp_slots ();
4031       value = expand_expr (from, NULL_RTX, VOIDmode, 0);
4032       if (to_rtx == 0)
4033         to_rtx = expand_expr (to, NULL_RTX, VOIDmode, EXPAND_WRITE);
4034
4035       /* Handle calls that return values in multiple non-contiguous locations.
4036          The Irix 6 ABI has examples of this.  */
4037       if (GET_CODE (to_rtx) == PARALLEL)
4038         emit_group_load (to_rtx, value, TREE_TYPE (from),
4039                          int_size_in_bytes (TREE_TYPE (from)));
4040       else if (GET_MODE (to_rtx) == BLKmode)
4041         emit_block_move (to_rtx, value, expr_size (from), BLOCK_OP_NORMAL);
4042       else
4043         {
4044           if (POINTER_TYPE_P (TREE_TYPE (to)))
4045             value = convert_memory_address (GET_MODE (to_rtx), value);
4046           emit_move_insn (to_rtx, value);
4047         }
4048       preserve_temp_slots (to_rtx);
4049       free_temp_slots ();
4050       pop_temp_slots ();
4051       return;
4052     }
4053
4054   /* Ordinary treatment.  Expand TO to get a REG or MEM rtx.
4055      Don't re-expand if it was expanded already (in COMPONENT_REF case).  */
4056
4057   if (to_rtx == 0)
4058     to_rtx = expand_expr (to, NULL_RTX, VOIDmode, EXPAND_WRITE);
4059
4060   /* Don't move directly into a return register.  */
4061   if (TREE_CODE (to) == RESULT_DECL
4062       && (REG_P (to_rtx) || GET_CODE (to_rtx) == PARALLEL))
4063     {
4064       rtx temp;
4065
4066       push_temp_slots ();
4067       temp = expand_expr (from, 0, GET_MODE (to_rtx), 0);
4068
4069       if (GET_CODE (to_rtx) == PARALLEL)
4070         emit_group_load (to_rtx, temp, TREE_TYPE (from),
4071                          int_size_in_bytes (TREE_TYPE (from)));
4072       else
4073         emit_move_insn (to_rtx, temp);
4074
4075       preserve_temp_slots (to_rtx);
4076       free_temp_slots ();
4077       pop_temp_slots ();
4078       return;
4079     }
4080
4081   /* In case we are returning the contents of an object which overlaps
4082      the place the value is being stored, use a safe function when copying
4083      a value through a pointer into a structure value return block.  */
4084   if (TREE_CODE (to) == RESULT_DECL && TREE_CODE (from) == INDIRECT_REF
4085       && current_function_returns_struct
4086       && !current_function_returns_pcc_struct)
4087     {
4088       rtx from_rtx, size;
4089
4090       push_temp_slots ();
4091       size = expr_size (from);
4092       from_rtx = expand_expr (from, NULL_RTX, VOIDmode, 0);
4093
4094       emit_library_call (memmove_libfunc, LCT_NORMAL,
4095                          VOIDmode, 3, XEXP (to_rtx, 0), Pmode,
4096                          XEXP (from_rtx, 0), Pmode,
4097                          convert_to_mode (TYPE_MODE (sizetype),
4098                                           size, TYPE_UNSIGNED (sizetype)),
4099                          TYPE_MODE (sizetype));
4100
4101       preserve_temp_slots (to_rtx);
4102       free_temp_slots ();
4103       pop_temp_slots ();
4104       return;
4105     }
4106
4107   /* Compute FROM and store the value in the rtx we got.  */
4108
4109   push_temp_slots ();
4110   result = store_expr (from, to_rtx, 0);
4111   preserve_temp_slots (result);
4112   free_temp_slots ();
4113   pop_temp_slots ();
4114   return;
4115 }
4116
4117 /* Generate code for computing expression EXP,
4118    and storing the value into TARGET.
4119
4120    If the mode is BLKmode then we may return TARGET itself.
4121    It turns out that in BLKmode it doesn't cause a problem.
4122    because C has no operators that could combine two different
4123    assignments into the same BLKmode object with different values
4124    with no sequence point.  Will other languages need this to
4125    be more thorough?
4126
4127    If CALL_PARAM_P is nonzero, this is a store into a call param on the
4128    stack, and block moves may need to be treated specially.  */
4129
4130 rtx
4131 store_expr (tree exp, rtx target, int call_param_p)
4132 {
4133   rtx temp;
4134   rtx alt_rtl = NULL_RTX;
4135   int dont_return_target = 0;
4136
4137   if (VOID_TYPE_P (TREE_TYPE (exp)))
4138     {
4139       /* C++ can generate ?: expressions with a throw expression in one
4140          branch and an rvalue in the other. Here, we resolve attempts to
4141          store the throw expression's nonexistent result.  */
4142       gcc_assert (!call_param_p);
4143       expand_expr (exp, const0_rtx, VOIDmode, 0);
4144       return NULL_RTX;
4145     }
4146   if (TREE_CODE (exp) == COMPOUND_EXPR)
4147     {
4148       /* Perform first part of compound expression, then assign from second
4149          part.  */
4150       expand_expr (TREE_OPERAND (exp, 0), const0_rtx, VOIDmode,
4151                    call_param_p ? EXPAND_STACK_PARM : EXPAND_NORMAL);
4152       return store_expr (TREE_OPERAND (exp, 1), target, call_param_p);
4153     }
4154   else if (TREE_CODE (exp) == COND_EXPR && GET_MODE (target) == BLKmode)
4155     {
4156       /* For conditional expression, get safe form of the target.  Then
4157          test the condition, doing the appropriate assignment on either
4158          side.  This avoids the creation of unnecessary temporaries.
4159          For non-BLKmode, it is more efficient not to do this.  */
4160
4161       rtx lab1 = gen_label_rtx (), lab2 = gen_label_rtx ();
4162
4163       do_pending_stack_adjust ();
4164       NO_DEFER_POP;
4165       jumpifnot (TREE_OPERAND (exp, 0), lab1);
4166       store_expr (TREE_OPERAND (exp, 1), target, call_param_p);
4167       emit_jump_insn (gen_jump (lab2));
4168       emit_barrier ();
4169       emit_label (lab1);
4170       store_expr (TREE_OPERAND (exp, 2), target, call_param_p);
4171       emit_label (lab2);
4172       OK_DEFER_POP;
4173
4174       return NULL_RTX;
4175     }
4176   else if (GET_CODE (target) == SUBREG && SUBREG_PROMOTED_VAR_P (target))
4177     /* If this is a scalar in a register that is stored in a wider mode
4178        than the declared mode, compute the result into its declared mode
4179        and then convert to the wider mode.  Our value is the computed
4180        expression.  */
4181     {
4182       rtx inner_target = 0;
4183
4184       /* We can do the conversion inside EXP, which will often result
4185          in some optimizations.  Do the conversion in two steps: first
4186          change the signedness, if needed, then the extend.  But don't
4187          do this if the type of EXP is a subtype of something else
4188          since then the conversion might involve more than just
4189          converting modes.  */
4190       if (INTEGRAL_TYPE_P (TREE_TYPE (exp))
4191           && TREE_TYPE (TREE_TYPE (exp)) == 0
4192           && (!lang_hooks.reduce_bit_field_operations
4193               || (GET_MODE_PRECISION (GET_MODE (target))
4194                   == TYPE_PRECISION (TREE_TYPE (exp)))))
4195         {
4196           if (TYPE_UNSIGNED (TREE_TYPE (exp))
4197               != SUBREG_PROMOTED_UNSIGNED_P (target))
4198             exp = convert
4199               (lang_hooks.types.signed_or_unsigned_type
4200                (SUBREG_PROMOTED_UNSIGNED_P (target), TREE_TYPE (exp)), exp);
4201
4202           exp = convert (lang_hooks.types.type_for_mode
4203                          (GET_MODE (SUBREG_REG (target)),
4204                           SUBREG_PROMOTED_UNSIGNED_P (target)),
4205                          exp);
4206
4207           inner_target = SUBREG_REG (target);
4208         }
4209
4210       temp = expand_expr (exp, inner_target, VOIDmode,
4211                           call_param_p ? EXPAND_STACK_PARM : EXPAND_NORMAL);
4212
4213       /* If TEMP is a VOIDmode constant, use convert_modes to make
4214          sure that we properly convert it.  */
4215       if (CONSTANT_P (temp) && GET_MODE (temp) == VOIDmode)
4216         {
4217           temp = convert_modes (GET_MODE (target), TYPE_MODE (TREE_TYPE (exp)),
4218                                 temp, SUBREG_PROMOTED_UNSIGNED_P (target));
4219           temp = convert_modes (GET_MODE (SUBREG_REG (target)),
4220                                 GET_MODE (target), temp,
4221                                 SUBREG_PROMOTED_UNSIGNED_P (target));
4222         }
4223
4224       convert_move (SUBREG_REG (target), temp,
4225                     SUBREG_PROMOTED_UNSIGNED_P (target));
4226
4227       return NULL_RTX;
4228     }
4229   else
4230     {
4231       temp = expand_expr_real (exp, target, GET_MODE (target),
4232                                (call_param_p
4233                                 ? EXPAND_STACK_PARM : EXPAND_NORMAL),
4234                                &alt_rtl);
4235       /* Return TARGET if it's a specified hardware register.
4236          If TARGET is a volatile mem ref, either return TARGET
4237          or return a reg copied *from* TARGET; ANSI requires this.
4238
4239          Otherwise, if TEMP is not TARGET, return TEMP
4240          if it is constant (for efficiency),
4241          or if we really want the correct value.  */
4242       if (!(target && REG_P (target)
4243             && REGNO (target) < FIRST_PSEUDO_REGISTER)
4244           && !(MEM_P (target) && MEM_VOLATILE_P (target))
4245           && ! rtx_equal_p (temp, target)
4246           && CONSTANT_P (temp))
4247         dont_return_target = 1;
4248     }
4249
4250   /* If TEMP is a VOIDmode constant and the mode of the type of EXP is not
4251      the same as that of TARGET, adjust the constant.  This is needed, for
4252      example, in case it is a CONST_DOUBLE and we want only a word-sized
4253      value.  */
4254   if (CONSTANT_P (temp) && GET_MODE (temp) == VOIDmode
4255       && TREE_CODE (exp) != ERROR_MARK
4256       && GET_MODE (target) != TYPE_MODE (TREE_TYPE (exp)))
4257     temp = convert_modes (GET_MODE (target), TYPE_MODE (TREE_TYPE (exp)),
4258                           temp, TYPE_UNSIGNED (TREE_TYPE (exp)));
4259
4260   /* If value was not generated in the target, store it there.
4261      Convert the value to TARGET's type first if necessary and emit the
4262      pending incrementations that have been queued when expanding EXP.
4263      Note that we cannot emit the whole queue blindly because this will
4264      effectively disable the POST_INC optimization later.
4265
4266      If TEMP and TARGET compare equal according to rtx_equal_p, but
4267      one or both of them are volatile memory refs, we have to distinguish
4268      two cases:
4269      - expand_expr has used TARGET.  In this case, we must not generate
4270        another copy.  This can be detected by TARGET being equal according
4271        to == .
4272      - expand_expr has not used TARGET - that means that the source just
4273        happens to have the same RTX form.  Since temp will have been created
4274        by expand_expr, it will compare unequal according to == .
4275        We must generate a copy in this case, to reach the correct number
4276        of volatile memory references.  */
4277
4278   if ((! rtx_equal_p (temp, target)
4279        || (temp != target && (side_effects_p (temp)
4280                               || side_effects_p (target))))
4281       && TREE_CODE (exp) != ERROR_MARK
4282       /* If store_expr stores a DECL whose DECL_RTL(exp) == TARGET,
4283          but TARGET is not valid memory reference, TEMP will differ
4284          from TARGET although it is really the same location.  */
4285       && !(alt_rtl && rtx_equal_p (alt_rtl, target))
4286       /* If there's nothing to copy, don't bother.  Don't call
4287          expr_size unless necessary, because some front-ends (C++)
4288          expr_size-hook must not be given objects that are not
4289          supposed to be bit-copied or bit-initialized.  */
4290       && expr_size (exp) != const0_rtx)
4291     {
4292       if (GET_MODE (temp) != GET_MODE (target)
4293           && GET_MODE (temp) != VOIDmode)
4294         {
4295           int unsignedp = TYPE_UNSIGNED (TREE_TYPE (exp));
4296           if (dont_return_target)
4297             {
4298               /* In this case, we will return TEMP,
4299                  so make sure it has the proper mode.
4300                  But don't forget to store the value into TARGET.  */
4301               temp = convert_to_mode (GET_MODE (target), temp, unsignedp);
4302               emit_move_insn (target, temp);
4303             }
4304           else
4305             convert_move (target, temp, unsignedp);
4306         }
4307
4308       else if (GET_MODE (temp) == BLKmode && TREE_CODE (exp) == STRING_CST)
4309         {
4310           /* Handle copying a string constant into an array.  The string
4311              constant may be shorter than the array.  So copy just the string's
4312              actual length, and clear the rest.  First get the size of the data
4313              type of the string, which is actually the size of the target.  */
4314           rtx size = expr_size (exp);
4315
4316           if (GET_CODE (size) == CONST_INT
4317               && INTVAL (size) < TREE_STRING_LENGTH (exp))
4318             emit_block_move (target, temp, size,
4319                              (call_param_p
4320                               ? BLOCK_OP_CALL_PARM : BLOCK_OP_NORMAL));
4321           else
4322             {
4323               /* Compute the size of the data to copy from the string.  */
4324               tree copy_size
4325                 = size_binop (MIN_EXPR,
4326                               make_tree (sizetype, size),
4327                               size_int (TREE_STRING_LENGTH (exp)));
4328               rtx copy_size_rtx
4329                 = expand_expr (copy_size, NULL_RTX, VOIDmode,
4330                                (call_param_p
4331                                 ? EXPAND_STACK_PARM : EXPAND_NORMAL));
4332               rtx label = 0;
4333
4334               /* Copy that much.  */
4335               copy_size_rtx = convert_to_mode (ptr_mode, copy_size_rtx,
4336                                                TYPE_UNSIGNED (sizetype));
4337               emit_block_move (target, temp, copy_size_rtx,
4338                                (call_param_p
4339                                 ? BLOCK_OP_CALL_PARM : BLOCK_OP_NORMAL));
4340
4341               /* Figure out how much is left in TARGET that we have to clear.
4342                  Do all calculations in ptr_mode.  */
4343               if (GET_CODE (copy_size_rtx) == CONST_INT)
4344                 {
4345                   size = plus_constant (size, -INTVAL (copy_size_rtx));
4346                   target = adjust_address (target, BLKmode,
4347                                            INTVAL (copy_size_rtx));
4348                 }
4349               else
4350                 {
4351                   size = expand_binop (TYPE_MODE (sizetype), sub_optab, size,
4352                                        copy_size_rtx, NULL_RTX, 0,
4353                                        OPTAB_LIB_WIDEN);
4354
4355 #ifdef POINTERS_EXTEND_UNSIGNED
4356                   if (GET_MODE (copy_size_rtx) != Pmode)
4357                     copy_size_rtx = convert_to_mode (Pmode, copy_size_rtx,
4358                                                      TYPE_UNSIGNED (sizetype));
4359 #endif
4360
4361                   target = offset_address (target, copy_size_rtx,
4362                                            highest_pow2_factor (copy_size));
4363                   label = gen_label_rtx ();
4364                   emit_cmp_and_jump_insns (size, const0_rtx, LT, NULL_RTX,
4365                                            GET_MODE (size), 0, label);
4366                 }
4367
4368               if (size != const0_rtx)
4369                 clear_storage (target, size, BLOCK_OP_NORMAL);
4370
4371               if (label)
4372                 emit_label (label);
4373             }
4374         }
4375       /* Handle calls that return values in multiple non-contiguous locations.
4376          The Irix 6 ABI has examples of this.  */
4377       else if (GET_CODE (target) == PARALLEL)
4378         emit_group_load (target, temp, TREE_TYPE (exp),
4379                          int_size_in_bytes (TREE_TYPE (exp)));
4380       else if (GET_MODE (temp) == BLKmode)
4381         emit_block_move (target, temp, expr_size (exp),
4382                          (call_param_p
4383                           ? BLOCK_OP_CALL_PARM : BLOCK_OP_NORMAL));
4384       else
4385         {
4386           temp = force_operand (temp, target);
4387           if (temp != target)
4388             emit_move_insn (target, temp);
4389         }
4390     }
4391
4392   return NULL_RTX;
4393 }
4394 \f
4395 /* Examine CTOR to discover:
4396    * how many scalar fields are set to nonzero values,
4397      and place it in *P_NZ_ELTS;
4398    * how many scalar fields are set to non-constant values,
4399      and place it in  *P_NC_ELTS; and
4400    * how many scalar fields in total are in CTOR,
4401      and place it in *P_ELT_COUNT.
4402    * if a type is a union, and the initializer from the constructor
4403      is not the largest element in the union, then set *p_must_clear.  */
4404
4405 static void
4406 categorize_ctor_elements_1 (tree ctor, HOST_WIDE_INT *p_nz_elts,
4407                             HOST_WIDE_INT *p_nc_elts,
4408                             HOST_WIDE_INT *p_elt_count,
4409                             bool *p_must_clear)
4410 {
4411   unsigned HOST_WIDE_INT idx;
4412   HOST_WIDE_INT nz_elts, nc_elts, elt_count;
4413   tree value, purpose;
4414
4415   nz_elts = 0;
4416   nc_elts = 0;
4417   elt_count = 0;
4418
4419   FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (ctor), idx, purpose, value)
4420     {
4421       HOST_WIDE_INT mult;
4422
4423       mult = 1;
4424       if (TREE_CODE (purpose) == RANGE_EXPR)
4425         {
4426           tree lo_index = TREE_OPERAND (purpose, 0);
4427           tree hi_index = TREE_OPERAND (purpose, 1);
4428
4429           if (host_integerp (lo_index, 1) && host_integerp (hi_index, 1))
4430             mult = (tree_low_cst (hi_index, 1)
4431                     - tree_low_cst (lo_index, 1) + 1);
4432         }
4433
4434       switch (TREE_CODE (value))
4435         {
4436         case CONSTRUCTOR:
4437           {
4438             HOST_WIDE_INT nz = 0, nc = 0, ic = 0;
4439             categorize_ctor_elements_1 (value, &nz, &nc, &ic, p_must_clear);
4440             nz_elts += mult * nz;
4441             nc_elts += mult * nc;
4442             elt_count += mult * ic;
4443           }
4444           break;
4445
4446         case INTEGER_CST:
4447         case REAL_CST:
4448           if (!initializer_zerop (value))
4449             nz_elts += mult;
4450           elt_count += mult;
4451           break;
4452
4453         case STRING_CST:
4454           nz_elts += mult * TREE_STRING_LENGTH (value);
4455           elt_count += mult * TREE_STRING_LENGTH (value);
4456           break;
4457
4458         case COMPLEX_CST:
4459           if (!initializer_zerop (TREE_REALPART (value)))
4460             nz_elts += mult;
4461           if (!initializer_zerop (TREE_IMAGPART (value)))
4462             nz_elts += mult;
4463           elt_count += mult;
4464           break;
4465
4466         case VECTOR_CST:
4467           {
4468             tree v;
4469             for (v = TREE_VECTOR_CST_ELTS (value); v; v = TREE_CHAIN (v))
4470               {
4471                 if (!initializer_zerop (TREE_VALUE (v)))
4472                   nz_elts += mult;
4473                 elt_count += mult;
4474               }
4475           }
4476           break;
4477
4478         default:
4479           nz_elts += mult;
4480           elt_count += mult;
4481           if (!initializer_constant_valid_p (value, TREE_TYPE (value)))
4482             nc_elts += mult;
4483           break;
4484         }
4485     }
4486
4487   if (!*p_must_clear
4488       && (TREE_CODE (TREE_TYPE (ctor)) == UNION_TYPE
4489           || TREE_CODE (TREE_TYPE (ctor)) == QUAL_UNION_TYPE))
4490     {
4491       tree init_sub_type;
4492       bool clear_this = true;
4493
4494       if (!VEC_empty (constructor_elt, CONSTRUCTOR_ELTS (ctor)))
4495         {
4496           /* We don't expect more than one element of the union to be
4497              initialized.  Not sure what we should do otherwise... */
4498           gcc_assert (VEC_length (constructor_elt, CONSTRUCTOR_ELTS (ctor))
4499                       == 1);
4500
4501           init_sub_type = TREE_TYPE (VEC_index (constructor_elt,
4502                                                 CONSTRUCTOR_ELTS (ctor),
4503                                                 0)->value);
4504
4505           /* ??? We could look at each element of the union, and find the
4506              largest element.  Which would avoid comparing the size of the
4507              initialized element against any tail padding in the union.
4508              Doesn't seem worth the effort...  */
4509           if (simple_cst_equal (TYPE_SIZE (TREE_TYPE (ctor)), 
4510                                 TYPE_SIZE (init_sub_type)) == 1)
4511             {
4512               /* And now we have to find out if the element itself is fully
4513                  constructed.  E.g. for union { struct { int a, b; } s; } u
4514                  = { .s = { .a = 1 } }.  */
4515               if (elt_count == count_type_elements (init_sub_type, false))
4516                 clear_this = false;
4517             }
4518         }
4519
4520       *p_must_clear = clear_this;
4521     }
4522
4523   *p_nz_elts += nz_elts;
4524   *p_nc_elts += nc_elts;
4525   *p_elt_count += elt_count;
4526 }
4527
4528 void
4529 categorize_ctor_elements (tree ctor, HOST_WIDE_INT *p_nz_elts,
4530                           HOST_WIDE_INT *p_nc_elts,
4531                           HOST_WIDE_INT *p_elt_count,
4532                           bool *p_must_clear)
4533 {
4534   *p_nz_elts = 0;
4535   *p_nc_elts = 0;
4536   *p_elt_count = 0;
4537   *p_must_clear = false;
4538   categorize_ctor_elements_1 (ctor, p_nz_elts, p_nc_elts, p_elt_count,
4539                               p_must_clear);
4540 }
4541
4542 /* Count the number of scalars in TYPE.  Return -1 on overflow or
4543    variable-sized.  If ALLOW_FLEXARR is true, don't count flexible
4544    array member at the end of the structure.  */
4545
4546 HOST_WIDE_INT
4547 count_type_elements (tree type, bool allow_flexarr)
4548 {
4549   const HOST_WIDE_INT max = ~((HOST_WIDE_INT)1 << (HOST_BITS_PER_WIDE_INT-1));
4550   switch (TREE_CODE (type))
4551     {
4552     case ARRAY_TYPE:
4553       {
4554         tree telts = array_type_nelts (type);
4555         if (telts && host_integerp (telts, 1))
4556           {
4557             HOST_WIDE_INT n = tree_low_cst (telts, 1) + 1;
4558             HOST_WIDE_INT m = count_type_elements (TREE_TYPE (type), false);
4559             if (n == 0)
4560               return 0;
4561             else if (max / n > m)
4562               return n * m;
4563           }
4564         return -1;
4565       }
4566
4567     case RECORD_TYPE:
4568       {
4569         HOST_WIDE_INT n = 0, t;
4570         tree f;
4571
4572         for (f = TYPE_FIELDS (type); f ; f = TREE_CHAIN (f))
4573           if (TREE_CODE (f) == FIELD_DECL)
4574             {
4575               t = count_type_elements (TREE_TYPE (f), false);
4576               if (t < 0)
4577                 {
4578                   /* Check for structures with flexible array member.  */
4579                   tree tf = TREE_TYPE (f);
4580                   if (allow_flexarr
4581                       && TREE_CHAIN (f) == NULL
4582                       && TREE_CODE (tf) == ARRAY_TYPE
4583                       && TYPE_DOMAIN (tf)
4584                       && TYPE_MIN_VALUE (TYPE_DOMAIN (tf))
4585                       && integer_zerop (TYPE_MIN_VALUE (TYPE_DOMAIN (tf)))
4586                       && !TYPE_MAX_VALUE (TYPE_DOMAIN (tf))
4587                       && int_size_in_bytes (type) >= 0)
4588                     break;
4589
4590                   return -1;
4591                 }
4592               n += t;
4593             }
4594
4595         return n;
4596       }
4597
4598     case UNION_TYPE:
4599     case QUAL_UNION_TYPE:
4600       {
4601         /* Ho hum.  How in the world do we guess here?  Clearly it isn't
4602            right to count the fields.  Guess based on the number of words.  */
4603         HOST_WIDE_INT n = int_size_in_bytes (type);
4604         if (n < 0)
4605           return -1;
4606         return n / UNITS_PER_WORD;
4607       }
4608
4609     case COMPLEX_TYPE:
4610       return 2;
4611
4612     case VECTOR_TYPE:
4613       return TYPE_VECTOR_SUBPARTS (type);
4614
4615     case INTEGER_TYPE:
4616     case REAL_TYPE:
4617     case ENUMERAL_TYPE:
4618     case BOOLEAN_TYPE:
4619     case CHAR_TYPE:
4620     case POINTER_TYPE:
4621     case OFFSET_TYPE:
4622     case REFERENCE_TYPE:
4623       return 1;
4624
4625     case VOID_TYPE:
4626     case METHOD_TYPE:
4627     case FUNCTION_TYPE:
4628     case LANG_TYPE:
4629     default:
4630       gcc_unreachable ();
4631     }
4632 }
4633
4634 /* Return 1 if EXP contains mostly (3/4)  zeros.  */
4635
4636 static int
4637 mostly_zeros_p (tree exp)
4638 {
4639   if (TREE_CODE (exp) == CONSTRUCTOR)
4640
4641     {
4642       HOST_WIDE_INT nz_elts, nc_elts, count, elts;
4643       bool must_clear;
4644
4645       categorize_ctor_elements (exp, &nz_elts, &nc_elts, &count, &must_clear);
4646       if (must_clear)
4647         return 1;
4648
4649       elts = count_type_elements (TREE_TYPE (exp), false);
4650
4651       return nz_elts < elts / 4;
4652     }
4653
4654   return initializer_zerop (exp);
4655 }
4656
4657 /* Return 1 if EXP contains all zeros.  */
4658
4659 static int
4660 all_zeros_p (tree exp)
4661 {
4662   if (TREE_CODE (exp) == CONSTRUCTOR)
4663
4664     {
4665       HOST_WIDE_INT nz_elts, nc_elts, count;
4666       bool must_clear;
4667
4668       categorize_ctor_elements (exp, &nz_elts, &nc_elts, &count, &must_clear);
4669       return nz_elts == 0;
4670     }
4671
4672   return initializer_zerop (exp);
4673 }
4674 \f
4675 /* Helper function for store_constructor.
4676    TARGET, BITSIZE, BITPOS, MODE, EXP are as for store_field.
4677    TYPE is the type of the CONSTRUCTOR, not the element type.
4678    CLEARED is as for store_constructor.
4679    ALIAS_SET is the alias set to use for any stores.
4680
4681    This provides a recursive shortcut back to store_constructor when it isn't
4682    necessary to go through store_field.  This is so that we can pass through
4683    the cleared field to let store_constructor know that we may not have to
4684    clear a substructure if the outer structure has already been cleared.  */
4685
4686 static void
4687 store_constructor_field (rtx target, unsigned HOST_WIDE_INT bitsize,
4688                          HOST_WIDE_INT bitpos, enum machine_mode mode,
4689                          tree exp, tree type, int cleared, int alias_set)
4690 {
4691   if (TREE_CODE (exp) == CONSTRUCTOR
4692       /* We can only call store_constructor recursively if the size and
4693          bit position are on a byte boundary.  */
4694       && bitpos % BITS_PER_UNIT == 0
4695       && (bitsize > 0 && bitsize % BITS_PER_UNIT == 0)
4696       /* If we have a nonzero bitpos for a register target, then we just
4697          let store_field do the bitfield handling.  This is unlikely to
4698          generate unnecessary clear instructions anyways.  */
4699       && (bitpos == 0 || MEM_P (target)))
4700     {
4701       if (MEM_P (target))
4702         target
4703           = adjust_address (target,
4704                             GET_MODE (target) == BLKmode
4705                             || 0 != (bitpos
4706                                      % GET_MODE_ALIGNMENT (GET_MODE (target)))
4707                             ? BLKmode : VOIDmode, bitpos / BITS_PER_UNIT);
4708
4709
4710       /* Update the alias set, if required.  */
4711       if (MEM_P (target) && ! MEM_KEEP_ALIAS_SET_P (target)
4712           && MEM_ALIAS_SET (target) != 0)
4713         {
4714           target = copy_rtx (target);
4715           set_mem_alias_set (target, alias_set);
4716         }
4717
4718       store_constructor (exp, target, cleared, bitsize / BITS_PER_UNIT);
4719     }
4720   else
4721     store_field (target, bitsize, bitpos, mode, exp, type, alias_set);
4722 }
4723
4724 /* Store the value of constructor EXP into the rtx TARGET.
4725    TARGET is either a REG or a MEM; we know it cannot conflict, since
4726    safe_from_p has been called.
4727    CLEARED is true if TARGET is known to have been zero'd.
4728    SIZE is the number of bytes of TARGET we are allowed to modify: this
4729    may not be the same as the size of EXP if we are assigning to a field
4730    which has been packed to exclude padding bits.  */
4731
4732 static void
4733 store_constructor (tree exp, rtx target, int cleared, HOST_WIDE_INT size)
4734 {
4735   tree type = TREE_TYPE (exp);
4736 #ifdef WORD_REGISTER_OPERATIONS
4737   HOST_WIDE_INT exp_size = int_size_in_bytes (type);
4738 #endif
4739
4740   switch (TREE_CODE (type))
4741     {
4742     case RECORD_TYPE:
4743     case UNION_TYPE:
4744     case QUAL_UNION_TYPE:
4745       {
4746         unsigned HOST_WIDE_INT idx;
4747         tree field, value;
4748
4749         /* If size is zero or the target is already cleared, do nothing.  */
4750         if (size == 0 || cleared)
4751           cleared = 1;
4752         /* We either clear the aggregate or indicate the value is dead.  */
4753         else if ((TREE_CODE (type) == UNION_TYPE
4754                   || TREE_CODE (type) == QUAL_UNION_TYPE)
4755                  && ! CONSTRUCTOR_ELTS (exp))
4756           /* If the constructor is empty, clear the union.  */
4757           {
4758             clear_storage (target, expr_size (exp), BLOCK_OP_NORMAL);
4759             cleared = 1;
4760           }
4761
4762         /* If we are building a static constructor into a register,
4763            set the initial value as zero so we can fold the value into
4764            a constant.  But if more than one register is involved,
4765            this probably loses.  */
4766         else if (REG_P (target) && TREE_STATIC (exp)
4767                  && GET_MODE_SIZE (GET_MODE (target)) <= UNITS_PER_WORD)
4768           {
4769             emit_move_insn (target, CONST0_RTX (GET_MODE (target)));
4770             cleared = 1;
4771           }
4772
4773         /* If the constructor has fewer fields than the structure or
4774            if we are initializing the structure to mostly zeros, clear
4775            the whole structure first.  Don't do this if TARGET is a
4776            register whose mode size isn't equal to SIZE since
4777            clear_storage can't handle this case.  */
4778         else if (size > 0
4779                  && (((int)VEC_length (constructor_elt, CONSTRUCTOR_ELTS (exp))
4780                       != fields_length (type))
4781                      || mostly_zeros_p (exp))
4782                  && (!REG_P (target)
4783                      || ((HOST_WIDE_INT) GET_MODE_SIZE (GET_MODE (target))
4784                          == size)))
4785           {
4786             clear_storage (target, GEN_INT (size), BLOCK_OP_NORMAL);
4787             cleared = 1;
4788           }
4789
4790         if (! cleared)
4791           emit_insn (gen_rtx_CLOBBER (VOIDmode, target));
4792
4793         /* Store each element of the constructor into the
4794            corresponding field of TARGET.  */
4795         FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (exp), idx, field, value)
4796           {
4797             enum machine_mode mode;
4798             HOST_WIDE_INT bitsize;
4799             HOST_WIDE_INT bitpos = 0;
4800             tree offset;
4801             rtx to_rtx = target;
4802             
4803             /* Just ignore missing fields.  We cleared the whole
4804                structure, above, if any fields are missing.  */
4805             if (field == 0)
4806               continue;
4807             
4808             if (cleared && initializer_zerop (value))
4809               continue;
4810             
4811             if (host_integerp (DECL_SIZE (field), 1))
4812               bitsize = tree_low_cst (DECL_SIZE (field), 1);
4813             else
4814               bitsize = -1;
4815             
4816             mode = DECL_MODE (field);
4817             if (DECL_BIT_FIELD (field))
4818               mode = VOIDmode;
4819             
4820             offset = DECL_FIELD_OFFSET (field);
4821             if (host_integerp (offset, 0)
4822                 && host_integerp (bit_position (field), 0))
4823               {
4824                 bitpos = int_bit_position (field);
4825                 offset = 0;
4826               }
4827             else
4828               bitpos = tree_low_cst (DECL_FIELD_BIT_OFFSET (field), 0);
4829             
4830             if (offset)
4831               {
4832                 rtx offset_rtx;
4833                 
4834                 offset
4835                   = SUBSTITUTE_PLACEHOLDER_IN_EXPR (offset,
4836                                                     make_tree (TREE_TYPE (exp),
4837                                                                target));
4838
4839                 offset_rtx = expand_expr (offset, NULL_RTX, VOIDmode, 0);
4840                 gcc_assert (MEM_P (to_rtx));
4841                 
4842 #ifdef POINTERS_EXTEND_UNSIGNED
4843                 if (GET_MODE (offset_rtx) != Pmode)
4844                   offset_rtx = convert_to_mode (Pmode, offset_rtx, 0);
4845 #else
4846                 if (GET_MODE (offset_rtx) != ptr_mode)
4847                   offset_rtx = convert_to_mode (ptr_mode, offset_rtx, 0);
4848 #endif
4849
4850                 to_rtx = offset_address (to_rtx, offset_rtx,
4851                                          highest_pow2_factor (offset));
4852               }
4853
4854 #ifdef WORD_REGISTER_OPERATIONS
4855             /* If this initializes a field that is smaller than a
4856                word, at the start of a word, try to widen it to a full
4857                word.  This special case allows us to output C++ member
4858                function initializations in a form that the optimizers
4859                can understand.  */
4860             if (REG_P (target)
4861                 && bitsize < BITS_PER_WORD
4862                 && bitpos % BITS_PER_WORD == 0
4863                 && GET_MODE_CLASS (mode) == MODE_INT
4864                 && TREE_CODE (value) == INTEGER_CST
4865                 && exp_size >= 0
4866                 && bitpos + BITS_PER_WORD <= exp_size * BITS_PER_UNIT)
4867               {
4868                 tree type = TREE_TYPE (value);
4869                 
4870                 if (TYPE_PRECISION (type) < BITS_PER_WORD)
4871                   {
4872                     type = lang_hooks.types.type_for_size
4873                       (BITS_PER_WORD, TYPE_UNSIGNED (type));
4874                     value = convert (type, value);
4875                   }
4876                 
4877                 if (BYTES_BIG_ENDIAN)
4878                   value
4879                    = fold_build2 (LSHIFT_EXPR, type, value,
4880                                    build_int_cst (NULL_TREE,
4881                                                   BITS_PER_WORD - bitsize));
4882                 bitsize = BITS_PER_WORD;
4883                 mode = word_mode;
4884               }
4885 #endif
4886
4887             if (MEM_P (to_rtx) && !MEM_KEEP_ALIAS_SET_P (to_rtx)
4888                 && DECL_NONADDRESSABLE_P (field))
4889               {
4890                 to_rtx = copy_rtx (to_rtx);
4891                 MEM_KEEP_ALIAS_SET_P (to_rtx) = 1;
4892               }
4893             
4894             store_constructor_field (to_rtx, bitsize, bitpos, mode,
4895                                      value, type, cleared,
4896                                      get_alias_set (TREE_TYPE (field)));
4897           }
4898         break;
4899       }
4900     case ARRAY_TYPE:
4901       {
4902         tree value, index;
4903         unsigned HOST_WIDE_INT i;
4904         int need_to_clear;
4905         tree domain;
4906         tree elttype = TREE_TYPE (type);
4907         int const_bounds_p;
4908         HOST_WIDE_INT minelt = 0;
4909         HOST_WIDE_INT maxelt = 0;
4910
4911         domain = TYPE_DOMAIN (type);
4912         const_bounds_p = (TYPE_MIN_VALUE (domain)
4913                           && TYPE_MAX_VALUE (domain)
4914                           && host_integerp (TYPE_MIN_VALUE (domain), 0)
4915                           && host_integerp (TYPE_MAX_VALUE (domain), 0));
4916
4917         /* If we have constant bounds for the range of the type, get them.  */
4918         if (const_bounds_p)
4919           {
4920             minelt = tree_low_cst (TYPE_MIN_VALUE (domain), 0);
4921             maxelt = tree_low_cst (TYPE_MAX_VALUE (domain), 0);
4922           }
4923
4924         /* If the constructor has fewer elements than the array, clear
4925            the whole array first.  Similarly if this is static
4926            constructor of a non-BLKmode object.  */
4927         if (cleared)
4928           need_to_clear = 0;
4929         else if (REG_P (target) && TREE_STATIC (exp))
4930           need_to_clear = 1;
4931         else
4932           {
4933             unsigned HOST_WIDE_INT idx;
4934             tree index, value;
4935             HOST_WIDE_INT count = 0, zero_count = 0;
4936             need_to_clear = ! const_bounds_p;
4937             
4938             /* This loop is a more accurate version of the loop in
4939                mostly_zeros_p (it handles RANGE_EXPR in an index).  It
4940                is also needed to check for missing elements.  */
4941             FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (exp), idx, index, value)
4942               {
4943                 HOST_WIDE_INT this_node_count;
4944
4945                 if (need_to_clear)
4946                   break;
4947                 
4948                 if (index != NULL_TREE && TREE_CODE (index) == RANGE_EXPR)
4949                   {
4950                     tree lo_index = TREE_OPERAND (index, 0);
4951                     tree hi_index = TREE_OPERAND (index, 1);
4952                     
4953                     if (! host_integerp (lo_index, 1)
4954                         || ! host_integerp (hi_index, 1))
4955                       {
4956                         need_to_clear = 1;
4957                         break;
4958                       }
4959                     
4960                     this_node_count = (tree_low_cst (hi_index, 1)
4961                                        - tree_low_cst (lo_index, 1) + 1);
4962                   }
4963                 else
4964                   this_node_count = 1;
4965                 
4966                 count += this_node_count;
4967                 if (mostly_zeros_p (value))
4968                   zero_count += this_node_count;
4969               }
4970             
4971             /* Clear the entire array first if there are any missing
4972                elements, or if the incidence of zero elements is >=
4973                75%.  */
4974             if (! need_to_clear
4975                 && (count < maxelt - minelt + 1
4976                     || 4 * zero_count >= 3 * count))
4977               need_to_clear = 1;
4978           }
4979         
4980         if (need_to_clear && size > 0)
4981           {
4982             if (REG_P (target))
4983               emit_move_insn (target,  CONST0_RTX (GET_MODE (target)));
4984             else
4985               clear_storage (target, GEN_INT (size), BLOCK_OP_NORMAL);
4986             cleared = 1;
4987           }
4988
4989         if (!cleared && REG_P (target))
4990           /* Inform later passes that the old value is dead.  */
4991           emit_insn (gen_rtx_CLOBBER (VOIDmode, target));
4992
4993         /* Store each element of the constructor into the
4994            corresponding element of TARGET, determined by counting the
4995            elements.  */
4996         FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (exp), i, index, value)
4997           {
4998             enum machine_mode mode;
4999             HOST_WIDE_INT bitsize;
5000             HOST_WIDE_INT bitpos;
5001             int unsignedp;
5002             rtx xtarget = target;
5003             
5004             if (cleared && initializer_zerop (value))
5005               continue;
5006             
5007             unsignedp = TYPE_UNSIGNED (elttype);
5008             mode = TYPE_MODE (elttype);
5009             if (mode == BLKmode)
5010               bitsize = (host_integerp (TYPE_SIZE (elttype), 1)
5011                          ? tree_low_cst (TYPE_SIZE (elttype), 1)
5012                          : -1);
5013             else
5014               bitsize = GET_MODE_BITSIZE (mode);
5015             
5016             if (index != NULL_TREE && TREE_CODE (index) == RANGE_EXPR)
5017               {
5018                 tree lo_index = TREE_OPERAND (index, 0);
5019                 tree hi_index = TREE_OPERAND (index, 1);
5020                 rtx index_r, pos_rtx;
5021                 HOST_WIDE_INT lo, hi, count;
5022                 tree position;
5023                 
5024                 /* If the range is constant and "small", unroll the loop.  */
5025                 if (const_bounds_p
5026                     && host_integerp (lo_index, 0)
5027                     && host_integerp (hi_index, 0)
5028                     && (lo = tree_low_cst (lo_index, 0),
5029                         hi = tree_low_cst (hi_index, 0),
5030                         count = hi - lo + 1,
5031                         (!MEM_P (target)
5032                          || count <= 2
5033                          || (host_integerp (TYPE_SIZE (elttype), 1)
5034                              && (tree_low_cst (TYPE_SIZE (elttype), 1) * count
5035                                  <= 40 * 8)))))
5036                   {
5037                     lo -= minelt;  hi -= minelt;
5038                     for (; lo <= hi; lo++)
5039                       {
5040                         bitpos = lo * tree_low_cst (TYPE_SIZE (elttype), 0);
5041                         
5042                         if (MEM_P (target)
5043                             && !MEM_KEEP_ALIAS_SET_P (target)
5044                             && TREE_CODE (type) == ARRAY_TYPE
5045                             && TYPE_NONALIASED_COMPONENT (type))
5046                           {
5047                             target = copy_rtx (target);
5048                             MEM_KEEP_ALIAS_SET_P (target) = 1;
5049                           }
5050                         
5051                         store_constructor_field
5052                           (target, bitsize, bitpos, mode, value, type, cleared,
5053                            get_alias_set (elttype));
5054                       }
5055                   }
5056                 else
5057                   {
5058                     rtx loop_start = gen_label_rtx ();
5059                     rtx loop_end = gen_label_rtx ();
5060                     tree exit_cond;
5061                     
5062                     expand_expr (hi_index, NULL_RTX, VOIDmode, 0);
5063                     unsignedp = TYPE_UNSIGNED (domain);
5064                     
5065                     index = build_decl (VAR_DECL, NULL_TREE, domain);
5066                     
5067                     index_r
5068                       = gen_reg_rtx (promote_mode (domain, DECL_MODE (index),
5069                                                    &unsignedp, 0));
5070                     SET_DECL_RTL (index, index_r);
5071                     store_expr (lo_index, index_r, 0);
5072                     
5073                     /* Build the head of the loop.  */
5074                     do_pending_stack_adjust ();
5075                     emit_label (loop_start);
5076
5077                     /* Assign value to element index.  */
5078                     position
5079                       = convert (ssizetype,
5080                                  fold_build2 (MINUS_EXPR, TREE_TYPE (index),
5081                                               index, TYPE_MIN_VALUE (domain)));
5082                     position = size_binop (MULT_EXPR, position,
5083                                            convert (ssizetype,
5084                                                     TYPE_SIZE_UNIT (elttype)));
5085                     
5086                     pos_rtx = expand_expr (position, 0, VOIDmode, 0);
5087                     xtarget = offset_address (target, pos_rtx,
5088                                               highest_pow2_factor (position));
5089                     xtarget = adjust_address (xtarget, mode, 0);
5090                     if (TREE_CODE (value) == CONSTRUCTOR)
5091                       store_constructor (value, xtarget, cleared,
5092                                          bitsize / BITS_PER_UNIT);
5093                     else
5094                       store_expr (value, xtarget, 0);
5095
5096                     /* Generate a conditional jump to exit the loop.  */
5097                     exit_cond = build2 (LT_EXPR, integer_type_node,
5098                                         index, hi_index);
5099                     jumpif (exit_cond, loop_end);
5100                     
5101                     /* Update the loop counter, and jump to the head of
5102                        the loop.  */
5103                     expand_assignment (index,
5104                                        build2 (PLUS_EXPR, TREE_TYPE (index),
5105                                                index, integer_one_node));
5106                     
5107                     emit_jump (loop_start);
5108                     
5109                     /* Build the end of the loop.  */
5110                     emit_label (loop_end);
5111                   }
5112               }
5113             else if ((index != 0 && ! host_integerp (index, 0))
5114                      || ! host_integerp (TYPE_SIZE (elttype), 1))
5115               {
5116                 tree position;
5117                 
5118                 if (index == 0)
5119                   index = ssize_int (1);
5120                 
5121                 if (minelt)
5122                   index = fold_convert (ssizetype,
5123                                         fold_build2 (MINUS_EXPR,
5124                                                      TREE_TYPE (index),
5125                                                      index,
5126                                                      TYPE_MIN_VALUE (domain)));
5127                 
5128                 position = size_binop (MULT_EXPR, index,
5129                                        convert (ssizetype,
5130                                                 TYPE_SIZE_UNIT (elttype)));
5131                 xtarget = offset_address (target,
5132                                           expand_expr (position, 0, VOIDmode, 0),
5133                                           highest_pow2_factor (position));
5134                 xtarget = adjust_address (xtarget, mode, 0);
5135                 store_expr (value, xtarget, 0);
5136               }
5137             else
5138               {
5139                 if (index != 0)
5140                   bitpos = ((tree_low_cst (index, 0) - minelt)
5141                             * tree_low_cst (TYPE_SIZE (elttype), 1));
5142                 else
5143                   bitpos = (i * tree_low_cst (TYPE_SIZE (elttype), 1));
5144                 
5145                 if (MEM_P (target) && !MEM_KEEP_ALIAS_SET_P (target)
5146                     && TREE_CODE (type) == ARRAY_TYPE
5147                     && TYPE_NONALIASED_COMPONENT (type))
5148                   {
5149                     target = copy_rtx (target);
5150                     MEM_KEEP_ALIAS_SET_P (target) = 1;
5151                   }
5152                 store_constructor_field (target, bitsize, bitpos, mode, value,
5153                                          type, cleared, get_alias_set (elttype));
5154               }
5155           }
5156         break;
5157       }
5158
5159     case VECTOR_TYPE:
5160       {
5161         unsigned HOST_WIDE_INT idx;
5162         constructor_elt *ce;
5163         int i;
5164         int need_to_clear;
5165         int icode = 0;
5166         tree elttype = TREE_TYPE (type);
5167         int elt_size = tree_low_cst (TYPE_SIZE (elttype), 1);
5168         enum machine_mode eltmode = TYPE_MODE (elttype);
5169         HOST_WIDE_INT bitsize;
5170         HOST_WIDE_INT bitpos;
5171         rtvec vector = NULL;
5172         unsigned n_elts;
5173         
5174         gcc_assert (eltmode != BLKmode);
5175         
5176         n_elts = TYPE_VECTOR_SUBPARTS (type);
5177         if (REG_P (target) && VECTOR_MODE_P (GET_MODE (target)))
5178           {
5179             enum machine_mode mode = GET_MODE (target);
5180             
5181             icode = (int) vec_init_optab->handlers[mode].insn_code;
5182             if (icode != CODE_FOR_nothing)
5183               {
5184                 unsigned int i;
5185                 
5186                 vector = rtvec_alloc (n_elts);
5187                 for (i = 0; i < n_elts; i++)
5188                   RTVEC_ELT (vector, i) = CONST0_RTX (GET_MODE_INNER (mode));
5189               }
5190           }
5191         
5192         /* If the constructor has fewer elements than the vector,
5193            clear the whole array first.  Similarly if this is static
5194            constructor of a non-BLKmode object.  */
5195         if (cleared)
5196           need_to_clear = 0;
5197         else if (REG_P (target) && TREE_STATIC (exp))
5198           need_to_clear = 1;
5199         else
5200           {
5201             unsigned HOST_WIDE_INT count = 0, zero_count = 0;
5202             tree value;
5203             
5204             FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (exp), idx, value)
5205               {
5206                 int n_elts_here = tree_low_cst
5207                   (int_const_binop (TRUNC_DIV_EXPR,
5208                                     TYPE_SIZE (TREE_TYPE (value)),
5209                                     TYPE_SIZE (elttype), 0), 1);
5210                 
5211                 count += n_elts_here;
5212                 if (mostly_zeros_p (value))
5213                   zero_count += n_elts_here;
5214               }
5215
5216             /* Clear the entire vector first if there are any missing elements,
5217                or if the incidence of zero elements is >= 75%.  */
5218             need_to_clear = (count < n_elts || 4 * zero_count >= 3 * count);
5219           }
5220         
5221         if (need_to_clear && size > 0 && !vector)
5222           {
5223             if (REG_P (target))
5224               emit_move_insn (target,  CONST0_RTX (GET_MODE (target)));
5225             else
5226               clear_storage (target, GEN_INT (size), BLOCK_OP_NORMAL);
5227             cleared = 1;
5228           }
5229         
5230         /* Inform later passes that the old value is dead.  */
5231         if (!cleared && REG_P (target))
5232           emit_move_insn (target, CONST0_RTX (GET_MODE (target)));
5233
5234         /* Store each element of the constructor into the corresponding
5235            element of TARGET, determined by counting the elements.  */
5236         for (idx = 0, i = 0;
5237              VEC_iterate (constructor_elt, CONSTRUCTOR_ELTS (exp), idx, ce);
5238              idx++, i += bitsize / elt_size)
5239           {
5240             HOST_WIDE_INT eltpos;
5241             tree value = ce->value;
5242             
5243             bitsize = tree_low_cst (TYPE_SIZE (TREE_TYPE (value)), 1);
5244             if (cleared && initializer_zerop (value))
5245               continue;
5246             
5247             if (ce->index)
5248               eltpos = tree_low_cst (ce->index, 1);
5249             else
5250               eltpos = i;
5251             
5252             if (vector)
5253               {
5254                 /* Vector CONSTRUCTORs should only be built from smaller
5255                    vectors in the case of BLKmode vectors.  */
5256                 gcc_assert (TREE_CODE (TREE_TYPE (value)) != VECTOR_TYPE);
5257                 RTVEC_ELT (vector, eltpos)
5258                   = expand_expr (value, NULL_RTX, VOIDmode, 0);
5259               }
5260             else
5261               {
5262                 enum machine_mode value_mode =
5263                   TREE_CODE (TREE_TYPE (value)) == VECTOR_TYPE
5264                   ? TYPE_MODE (TREE_TYPE (value))
5265                   : eltmode;
5266                 bitpos = eltpos * elt_size;
5267                 store_constructor_field (target, bitsize, bitpos,
5268                                          value_mode, value, type,
5269                                          cleared, get_alias_set (elttype));
5270               }
5271           }
5272         
5273         if (vector)
5274           emit_insn (GEN_FCN (icode)
5275                      (target,
5276                       gen_rtx_PARALLEL (GET_MODE (target), vector)));
5277         break;
5278       }
5279       
5280     default:
5281       gcc_unreachable ();
5282     }
5283 }
5284
5285 /* Store the value of EXP (an expression tree)
5286    into a subfield of TARGET which has mode MODE and occupies
5287    BITSIZE bits, starting BITPOS bits from the start of TARGET.
5288    If MODE is VOIDmode, it means that we are storing into a bit-field.
5289
5290    Always return const0_rtx unless we have something particular to
5291    return.
5292
5293    TYPE is the type of the underlying object,
5294
5295    ALIAS_SET is the alias set for the destination.  This value will
5296    (in general) be different from that for TARGET, since TARGET is a
5297    reference to the containing structure.  */
5298
5299 static rtx
5300 store_field (rtx target, HOST_WIDE_INT bitsize, HOST_WIDE_INT bitpos,
5301              enum machine_mode mode, tree exp, tree type, int alias_set)
5302 {
5303   HOST_WIDE_INT width_mask = 0;
5304
5305   if (TREE_CODE (exp) == ERROR_MARK)
5306     return const0_rtx;
5307
5308   /* If we have nothing to store, do nothing unless the expression has
5309      side-effects.  */
5310   if (bitsize == 0)
5311     return expand_expr (exp, const0_rtx, VOIDmode, 0);
5312   else if (bitsize >= 0 && bitsize < HOST_BITS_PER_WIDE_INT)
5313     width_mask = ((HOST_WIDE_INT) 1 << bitsize) - 1;
5314
5315   /* If we are storing into an unaligned field of an aligned union that is
5316      in a register, we may have the mode of TARGET being an integer mode but
5317      MODE == BLKmode.  In that case, get an aligned object whose size and
5318      alignment are the same as TARGET and store TARGET into it (we can avoid
5319      the store if the field being stored is the entire width of TARGET).  Then
5320      call ourselves recursively to store the field into a BLKmode version of
5321      that object.  Finally, load from the object into TARGET.  This is not
5322      very efficient in general, but should only be slightly more expensive
5323      than the otherwise-required unaligned accesses.  Perhaps this can be
5324      cleaned up later.  It's tempting to make OBJECT readonly, but it's set
5325      twice, once with emit_move_insn and once via store_field.  */
5326
5327   if (mode == BLKmode
5328       && (REG_P (target) || GET_CODE (target) == SUBREG))
5329     {
5330       rtx object = assign_temp (type, 0, 1, 1);
5331       rtx blk_object = adjust_address (object, BLKmode, 0);
5332
5333       if (bitsize != (HOST_WIDE_INT) GET_MODE_BITSIZE (GET_MODE (target)))
5334         emit_move_insn (object, target);
5335
5336       store_field (blk_object, bitsize, bitpos, mode, exp, type, alias_set);
5337
5338       emit_move_insn (target, object);
5339
5340       /* We want to return the BLKmode version of the data.  */
5341       return blk_object;
5342     }
5343
5344   if (GET_CODE (target) == CONCAT)
5345     {
5346       /* We're storing into a struct containing a single __complex.  */
5347
5348       gcc_assert (!bitpos);
5349       return store_expr (exp, target, 0);
5350     }
5351
5352   /* If the structure is in a register or if the component
5353      is a bit field, we cannot use addressing to access it.
5354      Use bit-field techniques or SUBREG to store in it.  */
5355
5356   if (mode == VOIDmode
5357       || (mode != BLKmode && ! direct_store[(int) mode]
5358           && GET_MODE_CLASS (mode) != MODE_COMPLEX_INT
5359           && GET_MODE_CLASS (mode) != MODE_COMPLEX_FLOAT)
5360       || REG_P (target)
5361       || GET_CODE (target) == SUBREG
5362       /* If the field isn't aligned enough to store as an ordinary memref,
5363          store it as a bit field.  */
5364       || (mode != BLKmode
5365           && ((((MEM_ALIGN (target) < GET_MODE_ALIGNMENT (mode))
5366                 || bitpos % GET_MODE_ALIGNMENT (mode))
5367                && SLOW_UNALIGNED_ACCESS (mode, MEM_ALIGN (target)))
5368               || (bitpos % BITS_PER_UNIT != 0)))
5369       /* If the RHS and field are a constant size and the size of the
5370          RHS isn't the same size as the bitfield, we must use bitfield
5371          operations.  */
5372       || (bitsize >= 0
5373           && TREE_CODE (TYPE_SIZE (TREE_TYPE (exp))) == INTEGER_CST
5374           && compare_tree_int (TYPE_SIZE (TREE_TYPE (exp)), bitsize) != 0))
5375     {
5376       rtx temp;
5377
5378       /* If EXP is a NOP_EXPR of precision less than its mode, then that
5379          implies a mask operation.  If the precision is the same size as
5380          the field we're storing into, that mask is redundant.  This is
5381          particularly common with bit field assignments generated by the
5382          C front end.  */
5383       if (TREE_CODE (exp) == NOP_EXPR)
5384         {
5385           tree type = TREE_TYPE (exp);
5386           if (INTEGRAL_TYPE_P (type)
5387               && TYPE_PRECISION (type) < GET_MODE_BITSIZE (TYPE_MODE (type))
5388               && bitsize == TYPE_PRECISION (type))
5389             {
5390               type = TREE_TYPE (TREE_OPERAND (exp, 0));
5391               if (INTEGRAL_TYPE_P (type) && TYPE_PRECISION (type) >= bitsize)
5392                 exp = TREE_OPERAND (exp, 0);
5393             }
5394         }
5395
5396       temp = expand_expr (exp, NULL_RTX, VOIDmode, 0);
5397
5398       /* If BITSIZE is narrower than the size of the type of EXP
5399          we will be narrowing TEMP.  Normally, what's wanted are the
5400          low-order bits.  However, if EXP's type is a record and this is
5401          big-endian machine, we want the upper BITSIZE bits.  */
5402       if (BYTES_BIG_ENDIAN && GET_MODE_CLASS (GET_MODE (temp)) == MODE_INT
5403           && bitsize < (HOST_WIDE_INT) GET_MODE_BITSIZE (GET_MODE (temp))
5404           && TREE_CODE (TREE_TYPE (exp)) == RECORD_TYPE)
5405         temp = expand_shift (RSHIFT_EXPR, GET_MODE (temp), temp,
5406                              size_int (GET_MODE_BITSIZE (GET_MODE (temp))
5407                                        - bitsize),
5408                              NULL_RTX, 1);
5409
5410       /* Unless MODE is VOIDmode or BLKmode, convert TEMP to
5411          MODE.  */
5412       if (mode != VOIDmode && mode != BLKmode
5413           && mode != TYPE_MODE (TREE_TYPE (exp)))
5414         temp = convert_modes (mode, TYPE_MODE (TREE_TYPE (exp)), temp, 1);
5415
5416       /* If the modes of TARGET and TEMP are both BLKmode, both
5417          must be in memory and BITPOS must be aligned on a byte
5418          boundary.  If so, we simply do a block copy.  */
5419       if (GET_MODE (target) == BLKmode && GET_MODE (temp) == BLKmode)
5420         {
5421           gcc_assert (MEM_P (target) && MEM_P (temp)
5422                       && !(bitpos % BITS_PER_UNIT));
5423
5424           target = adjust_address (target, VOIDmode, bitpos / BITS_PER_UNIT);
5425           emit_block_move (target, temp,
5426                            GEN_INT ((bitsize + BITS_PER_UNIT - 1)
5427                                     / BITS_PER_UNIT),
5428                            BLOCK_OP_NORMAL);
5429
5430           return const0_rtx;
5431         }
5432
5433       /* Store the value in the bitfield.  */
5434       store_bit_field (target, bitsize, bitpos, mode, temp);
5435
5436       return const0_rtx;
5437     }
5438   else
5439     {
5440       /* Now build a reference to just the desired component.  */
5441       rtx to_rtx = adjust_address (target, mode, bitpos / BITS_PER_UNIT);
5442
5443       if (to_rtx == target)
5444         to_rtx = copy_rtx (to_rtx);
5445
5446       MEM_SET_IN_STRUCT_P (to_rtx, 1);
5447       if (!MEM_KEEP_ALIAS_SET_P (to_rtx) && MEM_ALIAS_SET (to_rtx) != 0)
5448         set_mem_alias_set (to_rtx, alias_set);
5449
5450       return store_expr (exp, to_rtx, 0);
5451     }
5452 }
5453 \f
5454 /* Given an expression EXP that may be a COMPONENT_REF, a BIT_FIELD_REF,
5455    an ARRAY_REF, or an ARRAY_RANGE_REF, look for nested operations of these
5456    codes and find the ultimate containing object, which we return.
5457
5458    We set *PBITSIZE to the size in bits that we want, *PBITPOS to the
5459    bit position, and *PUNSIGNEDP to the signedness of the field.
5460    If the position of the field is variable, we store a tree
5461    giving the variable offset (in units) in *POFFSET.
5462    This offset is in addition to the bit position.
5463    If the position is not variable, we store 0 in *POFFSET.
5464
5465    If any of the extraction expressions is volatile,
5466    we store 1 in *PVOLATILEP.  Otherwise we don't change that.
5467
5468    If the field is a bit-field, *PMODE is set to VOIDmode.  Otherwise, it
5469    is a mode that can be used to access the field.  In that case, *PBITSIZE
5470    is redundant.
5471
5472    If the field describes a variable-sized object, *PMODE is set to
5473    VOIDmode and *PBITSIZE is set to -1.  An access cannot be made in
5474    this case, but the address of the object can be found.
5475
5476    If KEEP_ALIGNING is true and the target is STRICT_ALIGNMENT, we don't
5477    look through nodes that serve as markers of a greater alignment than
5478    the one that can be deduced from the expression.  These nodes make it
5479    possible for front-ends to prevent temporaries from being created by
5480    the middle-end on alignment considerations.  For that purpose, the
5481    normal operating mode at high-level is to always pass FALSE so that
5482    the ultimate containing object is really returned; moreover, the
5483    associated predicate handled_component_p will always return TRUE
5484    on these nodes, thus indicating that they are essentially handled
5485    by get_inner_reference.  TRUE should only be passed when the caller
5486    is scanning the expression in order to build another representation
5487    and specifically knows how to handle these nodes; as such, this is
5488    the normal operating mode in the RTL expanders.  */
5489
5490 tree
5491 get_inner_reference (tree exp, HOST_WIDE_INT *pbitsize,
5492                      HOST_WIDE_INT *pbitpos, tree *poffset,
5493                      enum machine_mode *pmode, int *punsignedp,
5494                      int *pvolatilep, bool keep_aligning)
5495 {
5496   tree size_tree = 0;
5497   enum machine_mode mode = VOIDmode;
5498   tree offset = size_zero_node;
5499   tree bit_offset = bitsize_zero_node;
5500   tree tem;
5501
5502   /* First get the mode, signedness, and size.  We do this from just the
5503      outermost expression.  */
5504   if (TREE_CODE (exp) == COMPONENT_REF)
5505     {
5506       size_tree = DECL_SIZE (TREE_OPERAND (exp, 1));
5507       if (! DECL_BIT_FIELD (TREE_OPERAND (exp, 1)))
5508         mode = DECL_MODE (TREE_OPERAND (exp, 1));
5509
5510       *punsignedp = DECL_UNSIGNED (TREE_OPERAND (exp, 1));
5511     }
5512   else if (TREE_CODE (exp) == BIT_FIELD_REF)
5513     {
5514       size_tree = TREE_OPERAND (exp, 1);
5515       *punsignedp = BIT_FIELD_REF_UNSIGNED (exp);
5516     }
5517   else
5518     {
5519       mode = TYPE_MODE (TREE_TYPE (exp));
5520       *punsignedp = TYPE_UNSIGNED (TREE_TYPE (exp));
5521
5522       if (mode == BLKmode)
5523         size_tree = TYPE_SIZE (TREE_TYPE (exp));
5524       else
5525         *pbitsize = GET_MODE_BITSIZE (mode);
5526     }
5527
5528   if (size_tree != 0)
5529     {
5530       if (! host_integerp (size_tree, 1))
5531         mode = BLKmode, *pbitsize = -1;
5532       else
5533         *pbitsize = tree_low_cst (size_tree, 1);
5534     }
5535
5536   /* Compute cumulative bit-offset for nested component-refs and array-refs,
5537      and find the ultimate containing object.  */
5538   while (1)
5539     {
5540       switch (TREE_CODE (exp))
5541         {
5542         case BIT_FIELD_REF:
5543           bit_offset = size_binop (PLUS_EXPR, bit_offset,
5544                                    TREE_OPERAND (exp, 2));
5545           break;
5546
5547         case COMPONENT_REF:
5548           {
5549             tree field = TREE_OPERAND (exp, 1);
5550             tree this_offset = component_ref_field_offset (exp);
5551
5552             /* If this field hasn't been filled in yet, don't go past it.
5553                This should only happen when folding expressions made during
5554                type construction.  */
5555             if (this_offset == 0)
5556               break;
5557
5558             offset = size_binop (PLUS_EXPR, offset, this_offset);
5559             bit_offset = size_binop (PLUS_EXPR, bit_offset,
5560                                      DECL_FIELD_BIT_OFFSET (field));
5561
5562             /* ??? Right now we don't do anything with DECL_OFFSET_ALIGN.  */
5563           }
5564           break;
5565
5566         case ARRAY_REF:
5567         case ARRAY_RANGE_REF:
5568           {
5569             tree index = TREE_OPERAND (exp, 1);
5570             tree low_bound = array_ref_low_bound (exp);
5571             tree unit_size = array_ref_element_size (exp);
5572
5573             /* We assume all arrays have sizes that are a multiple of a byte.
5574                First subtract the lower bound, if any, in the type of the
5575                index, then convert to sizetype and multiply by the size of
5576                the array element.  */
5577             if (! integer_zerop (low_bound))
5578               index = fold_build2 (MINUS_EXPR, TREE_TYPE (index),
5579                                    index, low_bound);
5580
5581             offset = size_binop (PLUS_EXPR, offset,
5582                                  size_binop (MULT_EXPR,
5583                                              convert (sizetype, index),
5584                                              unit_size));
5585           }
5586           break;
5587
5588         case REALPART_EXPR:
5589           break;
5590
5591         case IMAGPART_EXPR:
5592           bit_offset = size_binop (PLUS_EXPR, bit_offset,
5593                                    bitsize_int (*pbitsize));
5594           break;
5595
5596         case VIEW_CONVERT_EXPR:
5597           if (keep_aligning && STRICT_ALIGNMENT
5598               && (TYPE_ALIGN (TREE_TYPE (exp))
5599                > TYPE_ALIGN (TREE_TYPE (TREE_OPERAND (exp, 0))))
5600               && (TYPE_ALIGN (TREE_TYPE (TREE_OPERAND (exp, 0)))
5601                   < BIGGEST_ALIGNMENT)
5602               && (TYPE_ALIGN_OK (TREE_TYPE (exp))
5603                   || TYPE_ALIGN_OK (TREE_TYPE (TREE_OPERAND (exp, 0)))))
5604             goto done;
5605           break;
5606
5607         default:
5608           goto done;
5609         }
5610
5611       /* If any reference in the chain is volatile, the effect is volatile.  */
5612       if (TREE_THIS_VOLATILE (exp))
5613         *pvolatilep = 1;
5614
5615       exp = TREE_OPERAND (exp, 0);
5616     }
5617  done:
5618
5619   /* If OFFSET is constant, see if we can return the whole thing as a
5620      constant bit position.  Otherwise, split it up.  */
5621   if (host_integerp (offset, 0)
5622       && 0 != (tem = size_binop (MULT_EXPR, convert (bitsizetype, offset),
5623                                  bitsize_unit_node))
5624       && 0 != (tem = size_binop (PLUS_EXPR, tem, bit_offset))
5625       && host_integerp (tem, 0))
5626     *pbitpos = tree_low_cst (tem, 0), *poffset = 0;
5627   else
5628     *pbitpos = tree_low_cst (bit_offset, 0), *poffset = offset;
5629
5630   *pmode = mode;
5631   return exp;
5632 }
5633
5634 /* Return a tree of sizetype representing the size, in bytes, of the element
5635    of EXP, an ARRAY_REF.  */
5636
5637 tree
5638 array_ref_element_size (tree exp)
5639 {
5640   tree aligned_size = TREE_OPERAND (exp, 3);
5641   tree elmt_type = TREE_TYPE (TREE_TYPE (TREE_OPERAND (exp, 0)));
5642
5643   /* If a size was specified in the ARRAY_REF, it's the size measured
5644      in alignment units of the element type.  So multiply by that value.  */
5645   if (aligned_size)
5646     {
5647       /* ??? tree_ssa_useless_type_conversion will eliminate casts to
5648          sizetype from another type of the same width and signedness.  */
5649       if (TREE_TYPE (aligned_size) != sizetype)
5650         aligned_size = fold_convert (sizetype, aligned_size);
5651       return size_binop (MULT_EXPR, aligned_size,
5652                          size_int (TYPE_ALIGN_UNIT (elmt_type)));
5653     }
5654
5655   /* Otherwise, take the size from that of the element type.  Substitute
5656      any PLACEHOLDER_EXPR that we have.  */
5657   else
5658     return SUBSTITUTE_PLACEHOLDER_IN_EXPR (TYPE_SIZE_UNIT (elmt_type), exp);
5659 }
5660
5661 /* Return a tree representing the lower bound of the array mentioned in
5662    EXP, an ARRAY_REF.  */
5663
5664 tree
5665 array_ref_low_bound (tree exp)
5666 {
5667   tree domain_type = TYPE_DOMAIN (TREE_TYPE (TREE_OPERAND (exp, 0)));
5668
5669   /* If a lower bound is specified in EXP, use it.  */
5670   if (TREE_OPERAND (exp, 2))
5671     return TREE_OPERAND (exp, 2);
5672
5673   /* Otherwise, if there is a domain type and it has a lower bound, use it,
5674      substituting for a PLACEHOLDER_EXPR as needed.  */
5675   if (domain_type && TYPE_MIN_VALUE (domain_type))
5676     return SUBSTITUTE_PLACEHOLDER_IN_EXPR (TYPE_MIN_VALUE (domain_type), exp);
5677
5678   /* Otherwise, return a zero of the appropriate type.  */
5679   return build_int_cst (TREE_TYPE (TREE_OPERAND (exp, 1)), 0);
5680 }
5681
5682 /* Return a tree representing the upper bound of the array mentioned in
5683    EXP, an ARRAY_REF.  */
5684
5685 tree
5686 array_ref_up_bound (tree exp)
5687 {
5688   tree domain_type = TYPE_DOMAIN (TREE_TYPE (TREE_OPERAND (exp, 0)));
5689
5690   /* If there is a domain type and it has an upper bound, use it, substituting
5691      for a PLACEHOLDER_EXPR as needed.  */
5692   if (domain_type && TYPE_MAX_VALUE (domain_type))
5693     return SUBSTITUTE_PLACEHOLDER_IN_EXPR (TYPE_MAX_VALUE (domain_type), exp);
5694
5695   /* Otherwise fail.  */
5696   return NULL_TREE;
5697 }
5698
5699 /* Return a tree representing the offset, in bytes, of the field referenced
5700    by EXP.  This does not include any offset in DECL_FIELD_BIT_OFFSET.  */
5701
5702 tree
5703 component_ref_field_offset (tree exp)
5704 {
5705   tree aligned_offset = TREE_OPERAND (exp, 2);
5706   tree field = TREE_OPERAND (exp, 1);
5707
5708   /* If an offset was specified in the COMPONENT_REF, it's the offset measured
5709      in units of DECL_OFFSET_ALIGN / BITS_PER_UNIT.  So multiply by that
5710      value.  */
5711   if (aligned_offset)
5712     {
5713       /* ??? tree_ssa_useless_type_conversion will eliminate casts to
5714          sizetype from another type of the same width and signedness.  */
5715       if (TREE_TYPE (aligned_offset) != sizetype)
5716         aligned_offset = fold_convert (sizetype, aligned_offset);
5717       return size_binop (MULT_EXPR, aligned_offset,
5718                          size_int (DECL_OFFSET_ALIGN (field) / BITS_PER_UNIT));
5719     }
5720
5721   /* Otherwise, take the offset from that of the field.  Substitute
5722      any PLACEHOLDER_EXPR that we have.  */
5723   else
5724     return SUBSTITUTE_PLACEHOLDER_IN_EXPR (DECL_FIELD_OFFSET (field), exp);
5725 }
5726
5727 /* Return 1 if T is an expression that get_inner_reference handles.  */
5728
5729 int
5730 handled_component_p (tree t)
5731 {
5732   switch (TREE_CODE (t))
5733     {
5734     case BIT_FIELD_REF:
5735     case COMPONENT_REF:
5736     case ARRAY_REF:
5737     case ARRAY_RANGE_REF:
5738     case VIEW_CONVERT_EXPR:
5739     case REALPART_EXPR:
5740     case IMAGPART_EXPR:
5741       return 1;
5742
5743     default:
5744       return 0;
5745     }
5746 }
5747 \f
5748 /* Given an rtx VALUE that may contain additions and multiplications, return
5749    an equivalent value that just refers to a register, memory, or constant.
5750    This is done by generating instructions to perform the arithmetic and
5751    returning a pseudo-register containing the value.
5752
5753    The returned value may be a REG, SUBREG, MEM or constant.  */
5754
5755 rtx
5756 force_operand (rtx value, rtx target)
5757 {
5758   rtx op1, op2;
5759   /* Use subtarget as the target for operand 0 of a binary operation.  */
5760   rtx subtarget = get_subtarget (target);
5761   enum rtx_code code = GET_CODE (value);
5762
5763   /* Check for subreg applied to an expression produced by loop optimizer.  */
5764   if (code == SUBREG
5765       && !REG_P (SUBREG_REG (value))
5766       && !MEM_P (SUBREG_REG (value)))
5767     {
5768       value = simplify_gen_subreg (GET_MODE (value),
5769                                    force_reg (GET_MODE (SUBREG_REG (value)),
5770                                               force_operand (SUBREG_REG (value),
5771                                                              NULL_RTX)),
5772                                    GET_MODE (SUBREG_REG (value)),
5773                                    SUBREG_BYTE (value));
5774       code = GET_CODE (value);
5775     }
5776
5777   /* Check for a PIC address load.  */
5778   if ((code == PLUS || code == MINUS)
5779       && XEXP (value, 0) == pic_offset_table_rtx
5780       && (GET_CODE (XEXP (value, 1)) == SYMBOL_REF
5781           || GET_CODE (XEXP (value, 1)) == LABEL_REF
5782           || GET_CODE (XEXP (value, 1)) == CONST))
5783     {
5784       if (!subtarget)
5785         subtarget = gen_reg_rtx (GET_MODE (value));
5786       emit_move_insn (subtarget, value);
5787       return subtarget;
5788     }
5789
5790   if (code == ZERO_EXTEND || code == SIGN_EXTEND)
5791     {
5792       if (!target)
5793         target = gen_reg_rtx (GET_MODE (value));
5794       convert_move (target, force_operand (XEXP (value, 0), NULL),
5795                     code == ZERO_EXTEND);
5796       return target;
5797     }
5798
5799   if (ARITHMETIC_P (value))
5800     {
5801       op2 = XEXP (value, 1);
5802       if (!CONSTANT_P (op2) && !(REG_P (op2) && op2 != subtarget))
5803         subtarget = 0;
5804       if (code == MINUS && GET_CODE (op2) == CONST_INT)
5805         {
5806           code = PLUS;
5807           op2 = negate_rtx (GET_MODE (value), op2);
5808         }
5809
5810       /* Check for an addition with OP2 a constant integer and our first
5811          operand a PLUS of a virtual register and something else.  In that
5812          case, we want to emit the sum of the virtual register and the
5813          constant first and then add the other value.  This allows virtual
5814          register instantiation to simply modify the constant rather than
5815          creating another one around this addition.  */
5816       if (code == PLUS && GET_CODE (op2) == CONST_INT
5817           && GET_CODE (XEXP (value, 0)) == PLUS
5818           && REG_P (XEXP (XEXP (value, 0), 0))
5819           && REGNO (XEXP (XEXP (value, 0), 0)) >= FIRST_VIRTUAL_REGISTER
5820           && REGNO (XEXP (XEXP (value, 0), 0)) <= LAST_VIRTUAL_REGISTER)
5821         {
5822           rtx temp = expand_simple_binop (GET_MODE (value), code,
5823                                           XEXP (XEXP (value, 0), 0), op2,
5824                                           subtarget, 0, OPTAB_LIB_WIDEN);
5825           return expand_simple_binop (GET_MODE (value), code, temp,
5826                                       force_operand (XEXP (XEXP (value,
5827                                                                  0), 1), 0),
5828                                       target, 0, OPTAB_LIB_WIDEN);
5829         }
5830
5831       op1 = force_operand (XEXP (value, 0), subtarget);
5832       op2 = force_operand (op2, NULL_RTX);
5833       switch (code)
5834         {
5835         case MULT:
5836           return expand_mult (GET_MODE (value), op1, op2, target, 1);
5837         case DIV:
5838           if (!INTEGRAL_MODE_P (GET_MODE (value)))
5839             return expand_simple_binop (GET_MODE (value), code, op1, op2,
5840                                         target, 1, OPTAB_LIB_WIDEN);
5841           else
5842             return expand_divmod (0,
5843                                   FLOAT_MODE_P (GET_MODE (value))
5844                                   ? RDIV_EXPR : TRUNC_DIV_EXPR,
5845                                   GET_MODE (value), op1, op2, target, 0);
5846           break;
5847         case MOD:
5848           return expand_divmod (1, TRUNC_MOD_EXPR, GET_MODE (value), op1, op2,
5849                                 target, 0);
5850           break;
5851         case UDIV:
5852           return expand_divmod (0, TRUNC_DIV_EXPR, GET_MODE (value), op1, op2,
5853                                 target, 1);
5854           break;
5855         case UMOD:
5856           return expand_divmod (1, TRUNC_MOD_EXPR, GET_MODE (value), op1, op2,
5857                                 target, 1);
5858           break;
5859         case ASHIFTRT:
5860           return expand_simple_binop (GET_MODE (value), code, op1, op2,
5861                                       target, 0, OPTAB_LIB_WIDEN);
5862           break;
5863         default:
5864           return expand_simple_binop (GET_MODE (value), code, op1, op2,
5865                                       target, 1, OPTAB_LIB_WIDEN);
5866         }
5867     }
5868   if (UNARY_P (value))
5869     {
5870       op1 = force_operand (XEXP (value, 0), NULL_RTX);
5871       return expand_simple_unop (GET_MODE (value), code, op1, target, 0);
5872     }
5873
5874 #ifdef INSN_SCHEDULING
5875   /* On machines that have insn scheduling, we want all memory reference to be
5876      explicit, so we need to deal with such paradoxical SUBREGs.  */
5877   if (GET_CODE (value) == SUBREG && MEM_P (SUBREG_REG (value))
5878       && (GET_MODE_SIZE (GET_MODE (value))
5879           > GET_MODE_SIZE (GET_MODE (SUBREG_REG (value)))))
5880     value
5881       = simplify_gen_subreg (GET_MODE (value),
5882                              force_reg (GET_MODE (SUBREG_REG (value)),
5883                                         force_operand (SUBREG_REG (value),
5884                                                        NULL_RTX)),
5885                              GET_MODE (SUBREG_REG (value)),
5886                              SUBREG_BYTE (value));
5887 #endif
5888
5889   return value;
5890 }
5891 \f
5892 /* Subroutine of expand_expr: return nonzero iff there is no way that
5893    EXP can reference X, which is being modified.  TOP_P is nonzero if this
5894    call is going to be used to determine whether we need a temporary
5895    for EXP, as opposed to a recursive call to this function.
5896
5897    It is always safe for this routine to return zero since it merely
5898    searches for optimization opportunities.  */
5899
5900 int
5901 safe_from_p (rtx x, tree exp, int top_p)
5902 {
5903   rtx exp_rtl = 0;
5904   int i, nops;
5905
5906   if (x == 0
5907       /* If EXP has varying size, we MUST use a target since we currently
5908          have no way of allocating temporaries of variable size
5909          (except for arrays that have TYPE_ARRAY_MAX_SIZE set).
5910          So we assume here that something at a higher level has prevented a
5911          clash.  This is somewhat bogus, but the best we can do.  Only
5912          do this when X is BLKmode and when we are at the top level.  */
5913       || (top_p && TREE_TYPE (exp) != 0 && COMPLETE_TYPE_P (TREE_TYPE (exp))
5914           && TREE_CODE (TYPE_SIZE (TREE_TYPE (exp))) != INTEGER_CST
5915           && (TREE_CODE (TREE_TYPE (exp)) != ARRAY_TYPE
5916               || TYPE_ARRAY_MAX_SIZE (TREE_TYPE (exp)) == NULL_TREE
5917               || TREE_CODE (TYPE_ARRAY_MAX_SIZE (TREE_TYPE (exp)))
5918               != INTEGER_CST)
5919           && GET_MODE (x) == BLKmode)
5920       /* If X is in the outgoing argument area, it is always safe.  */
5921       || (MEM_P (x)
5922           && (XEXP (x, 0) == virtual_outgoing_args_rtx
5923               || (GET_CODE (XEXP (x, 0)) == PLUS
5924                   && XEXP (XEXP (x, 0), 0) == virtual_outgoing_args_rtx))))
5925     return 1;
5926
5927   /* If this is a subreg of a hard register, declare it unsafe, otherwise,
5928      find the underlying pseudo.  */
5929   if (GET_CODE (x) == SUBREG)
5930     {
5931       x = SUBREG_REG (x);
5932       if (REG_P (x) && REGNO (x) < FIRST_PSEUDO_REGISTER)
5933         return 0;
5934     }
5935
5936   /* Now look at our tree code and possibly recurse.  */
5937   switch (TREE_CODE_CLASS (TREE_CODE (exp)))
5938     {
5939     case tcc_declaration:
5940       exp_rtl = DECL_RTL_IF_SET (exp);
5941       break;
5942
5943     case tcc_constant:
5944       return 1;
5945
5946     case tcc_exceptional:
5947       if (TREE_CODE (exp) == TREE_LIST)
5948         {
5949           while (1)
5950             {
5951               if (TREE_VALUE (exp) && !safe_from_p (x, TREE_VALUE (exp), 0))
5952                 return 0;
5953               exp = TREE_CHAIN (exp);
5954               if (!exp)
5955                 return 1;
5956               if (TREE_CODE (exp) != TREE_LIST)
5957                 return safe_from_p (x, exp, 0);
5958             }
5959         }
5960       else if (TREE_CODE (exp) == ERROR_MARK)
5961         return 1;       /* An already-visited SAVE_EXPR? */
5962       else
5963         return 0;
5964
5965     case tcc_statement:
5966       /* The only case we look at here is the DECL_INITIAL inside a
5967          DECL_EXPR.  */
5968       return (TREE_CODE (exp) != DECL_EXPR
5969               || TREE_CODE (DECL_EXPR_DECL (exp)) != VAR_DECL
5970               || !DECL_INITIAL (DECL_EXPR_DECL (exp))
5971               || safe_from_p (x, DECL_INITIAL (DECL_EXPR_DECL (exp)), 0));
5972
5973     case tcc_binary:
5974     case tcc_comparison:
5975       if (!safe_from_p (x, TREE_OPERAND (exp, 1), 0))
5976         return 0;
5977       /* Fall through.  */
5978
5979     case tcc_unary:
5980       return safe_from_p (x, TREE_OPERAND (exp, 0), 0);
5981
5982     case tcc_expression:
5983     case tcc_reference:
5984       /* Now do code-specific tests.  EXP_RTL is set to any rtx we find in
5985          the expression.  If it is set, we conflict iff we are that rtx or
5986          both are in memory.  Otherwise, we check all operands of the
5987          expression recursively.  */
5988
5989       switch (TREE_CODE (exp))
5990         {
5991         case ADDR_EXPR:
5992           /* If the operand is static or we are static, we can't conflict.
5993              Likewise if we don't conflict with the operand at all.  */
5994           if (staticp (TREE_OPERAND (exp, 0))
5995               || TREE_STATIC (exp)
5996               || safe_from_p (x, TREE_OPERAND (exp, 0), 0))
5997             return 1;
5998
5999           /* Otherwise, the only way this can conflict is if we are taking
6000              the address of a DECL a that address if part of X, which is
6001              very rare.  */
6002           exp = TREE_OPERAND (exp, 0);
6003           if (DECL_P (exp))
6004             {
6005               if (!DECL_RTL_SET_P (exp)
6006                   || !MEM_P (DECL_RTL (exp)))
6007                 return 0;
6008               else
6009                 exp_rtl = XEXP (DECL_RTL (exp), 0);
6010             }
6011           break;
6012
6013         case MISALIGNED_INDIRECT_REF:
6014         case ALIGN_INDIRECT_REF:
6015         case INDIRECT_REF:
6016           if (MEM_P (x)
6017               && alias_sets_conflict_p (MEM_ALIAS_SET (x),
6018                                         get_alias_set (exp)))
6019             return 0;
6020           break;
6021
6022         case CALL_EXPR:
6023           /* Assume that the call will clobber all hard registers and
6024              all of memory.  */
6025           if ((REG_P (x) && REGNO (x) < FIRST_PSEUDO_REGISTER)
6026               || MEM_P (x))
6027             return 0;
6028           break;
6029
6030         case WITH_CLEANUP_EXPR:
6031         case CLEANUP_POINT_EXPR:
6032           /* Lowered by gimplify.c.  */
6033           gcc_unreachable ();
6034
6035         case SAVE_EXPR:
6036           return safe_from_p (x, TREE_OPERAND (exp, 0), 0);
6037
6038         default:
6039           break;
6040         }
6041
6042       /* If we have an rtx, we do not need to scan our operands.  */
6043       if (exp_rtl)
6044         break;
6045
6046       nops = TREE_CODE_LENGTH (TREE_CODE (exp));
6047       for (i = 0; i < nops; i++)
6048         if (TREE_OPERAND (exp, i) != 0
6049             && ! safe_from_p (x, TREE_OPERAND (exp, i), 0))
6050           return 0;
6051
6052       /* If this is a language-specific tree code, it may require
6053          special handling.  */
6054       if ((unsigned int) TREE_CODE (exp)
6055           >= (unsigned int) LAST_AND_UNUSED_TREE_CODE
6056           && !lang_hooks.safe_from_p (x, exp))
6057         return 0;
6058       break;
6059
6060     case tcc_type:
6061       /* Should never get a type here.  */
6062       gcc_unreachable ();
6063     }
6064
6065   /* If we have an rtl, find any enclosed object.  Then see if we conflict
6066      with it.  */
6067   if (exp_rtl)
6068     {
6069       if (GET_CODE (exp_rtl) == SUBREG)
6070         {
6071           exp_rtl = SUBREG_REG (exp_rtl);
6072           if (REG_P (exp_rtl)
6073               && REGNO (exp_rtl) < FIRST_PSEUDO_REGISTER)
6074             return 0;
6075         }
6076
6077       /* If the rtl is X, then it is not safe.  Otherwise, it is unless both
6078          are memory and they conflict.  */
6079       return ! (rtx_equal_p (x, exp_rtl)
6080                 || (MEM_P (x) && MEM_P (exp_rtl)
6081                     && true_dependence (exp_rtl, VOIDmode, x,
6082                                         rtx_addr_varies_p)));
6083     }
6084
6085   /* If we reach here, it is safe.  */
6086   return 1;
6087 }
6088
6089 \f
6090 /* Return the highest power of two that EXP is known to be a multiple of.
6091    This is used in updating alignment of MEMs in array references.  */
6092
6093 unsigned HOST_WIDE_INT
6094 highest_pow2_factor (tree exp)
6095 {
6096   unsigned HOST_WIDE_INT c0, c1;
6097
6098   switch (TREE_CODE (exp))
6099     {
6100     case INTEGER_CST:
6101       /* We can find the lowest bit that's a one.  If the low
6102          HOST_BITS_PER_WIDE_INT bits are zero, return BIGGEST_ALIGNMENT.
6103          We need to handle this case since we can find it in a COND_EXPR,
6104          a MIN_EXPR, or a MAX_EXPR.  If the constant overflows, we have an
6105          erroneous program, so return BIGGEST_ALIGNMENT to avoid any
6106          later ICE.  */
6107       if (TREE_CONSTANT_OVERFLOW (exp))
6108         return BIGGEST_ALIGNMENT;
6109       else
6110         {
6111           /* Note: tree_low_cst is intentionally not used here,
6112              we don't care about the upper bits.  */
6113           c0 = TREE_INT_CST_LOW (exp);
6114           c0 &= -c0;
6115           return c0 ? c0 : BIGGEST_ALIGNMENT;
6116         }
6117       break;
6118
6119     case PLUS_EXPR:  case MINUS_EXPR:  case MIN_EXPR:  case MAX_EXPR:
6120       c0 = highest_pow2_factor (TREE_OPERAND (exp, 0));
6121       c1 = highest_pow2_factor (TREE_OPERAND (exp, 1));
6122       return MIN (c0, c1);
6123
6124     case MULT_EXPR:
6125       c0 = highest_pow2_factor (TREE_OPERAND (exp, 0));
6126       c1 = highest_pow2_factor (TREE_OPERAND (exp, 1));
6127       return c0 * c1;
6128
6129     case ROUND_DIV_EXPR:  case TRUNC_DIV_EXPR:  case FLOOR_DIV_EXPR:
6130     case CEIL_DIV_EXPR:
6131       if (integer_pow2p (TREE_OPERAND (exp, 1))
6132           && host_integerp (TREE_OPERAND (exp, 1), 1))
6133         {
6134           c0 = highest_pow2_factor (TREE_OPERAND (exp, 0));
6135           c1 = tree_low_cst (TREE_OPERAND (exp, 1), 1);
6136           return MAX (1, c0 / c1);
6137         }
6138       break;
6139
6140     case NON_LVALUE_EXPR:  case NOP_EXPR:  case CONVERT_EXPR:
6141     case SAVE_EXPR:
6142       return highest_pow2_factor (TREE_OPERAND (exp, 0));
6143
6144     case COMPOUND_EXPR:
6145       return highest_pow2_factor (TREE_OPERAND (exp, 1));
6146
6147     case COND_EXPR:
6148       c0 = highest_pow2_factor (TREE_OPERAND (exp, 1));
6149       c1 = highest_pow2_factor (TREE_OPERAND (exp, 2));
6150       return MIN (c0, c1);
6151
6152     default:
6153       break;
6154     }
6155
6156   return 1;
6157 }
6158
6159 /* Similar, except that the alignment requirements of TARGET are
6160    taken into account.  Assume it is at least as aligned as its
6161    type, unless it is a COMPONENT_REF in which case the layout of
6162    the structure gives the alignment.  */
6163
6164 static unsigned HOST_WIDE_INT
6165 highest_pow2_factor_for_target (tree target, tree exp)
6166 {
6167   unsigned HOST_WIDE_INT target_align, factor;
6168
6169   factor = highest_pow2_factor (exp);
6170   if (TREE_CODE (target) == COMPONENT_REF)
6171     target_align = DECL_ALIGN_UNIT (TREE_OPERAND (target, 1));
6172   else
6173     target_align = TYPE_ALIGN_UNIT (TREE_TYPE (target));
6174   return MAX (factor, target_align);
6175 }
6176 \f
6177 /* Expands variable VAR.  */
6178
6179 void
6180 expand_var (tree var)
6181 {
6182   if (DECL_EXTERNAL (var))
6183     return;
6184
6185   if (TREE_STATIC (var))
6186     /* If this is an inlined copy of a static local variable,
6187        look up the original decl.  */
6188     var = DECL_ORIGIN (var);
6189
6190   if (TREE_STATIC (var)
6191       ? !TREE_ASM_WRITTEN (var)
6192       : !DECL_RTL_SET_P (var))
6193     {
6194       if (TREE_CODE (var) == VAR_DECL && DECL_HAS_VALUE_EXPR_P (var))
6195         /* Should be ignored.  */;
6196       else if (lang_hooks.expand_decl (var))
6197         /* OK.  */;
6198       else if (TREE_CODE (var) == VAR_DECL && !TREE_STATIC (var))
6199         expand_decl (var);
6200       else if (TREE_CODE (var) == VAR_DECL && TREE_STATIC (var))
6201         rest_of_decl_compilation (var, 0, 0);
6202       else
6203         /* No expansion needed.  */
6204         gcc_assert (TREE_CODE (var) == TYPE_DECL
6205                     || TREE_CODE (var) == CONST_DECL
6206                     || TREE_CODE (var) == FUNCTION_DECL
6207                     || TREE_CODE (var) == LABEL_DECL);
6208     }
6209 }
6210
6211 /* Subroutine of expand_expr.  Expand the two operands of a binary
6212    expression EXP0 and EXP1 placing the results in OP0 and OP1.
6213    The value may be stored in TARGET if TARGET is nonzero.  The
6214    MODIFIER argument is as documented by expand_expr.  */
6215
6216 static void
6217 expand_operands (tree exp0, tree exp1, rtx target, rtx *op0, rtx *op1,
6218                  enum expand_modifier modifier)
6219 {
6220   if (! safe_from_p (target, exp1, 1))
6221     target = 0;
6222   if (operand_equal_p (exp0, exp1, 0))
6223     {
6224       *op0 = expand_expr (exp0, target, VOIDmode, modifier);
6225       *op1 = copy_rtx (*op0);
6226     }
6227   else
6228     {
6229       /* If we need to preserve evaluation order, copy exp0 into its own
6230          temporary variable so that it can't be clobbered by exp1.  */
6231       if (flag_evaluation_order && TREE_SIDE_EFFECTS (exp1))
6232         exp0 = save_expr (exp0);
6233       *op0 = expand_expr (exp0, target, VOIDmode, modifier);
6234       *op1 = expand_expr (exp1, NULL_RTX, VOIDmode, modifier);
6235     }
6236 }
6237
6238 \f
6239 /* A subroutine of expand_expr_addr_expr.  Evaluate the address of EXP.
6240    The TARGET, TMODE and MODIFIER arguments are as for expand_expr.  */
6241
6242 static rtx
6243 expand_expr_addr_expr_1 (tree exp, rtx target, enum machine_mode tmode,
6244                          enum expand_modifier modifier)
6245 {
6246   rtx result, subtarget;
6247   tree inner, offset;
6248   HOST_WIDE_INT bitsize, bitpos;
6249   int volatilep, unsignedp;
6250   enum machine_mode mode1;
6251
6252   /* If we are taking the address of a constant and are at the top level,
6253      we have to use output_constant_def since we can't call force_const_mem
6254      at top level.  */
6255   /* ??? This should be considered a front-end bug.  We should not be
6256      generating ADDR_EXPR of something that isn't an LVALUE.  The only
6257      exception here is STRING_CST.  */
6258   if (TREE_CODE (exp) == CONSTRUCTOR
6259       || CONSTANT_CLASS_P (exp))
6260     return XEXP (output_constant_def (exp, 0), 0);
6261
6262   /* Everything must be something allowed by is_gimple_addressable.  */
6263   switch (TREE_CODE (exp))
6264     {
6265     case INDIRECT_REF:
6266       /* This case will happen via recursion for &a->b.  */
6267       return expand_expr (TREE_OPERAND (exp, 0), target, tmode, EXPAND_NORMAL);
6268
6269     case CONST_DECL:
6270       /* Recurse and make the output_constant_def clause above handle this.  */
6271       return expand_expr_addr_expr_1 (DECL_INITIAL (exp), target,
6272                                       tmode, modifier);
6273
6274     case REALPART_EXPR:
6275       /* The real part of the complex number is always first, therefore
6276          the address is the same as the address of the parent object.  */
6277       offset = 0;
6278       bitpos = 0;
6279       inner = TREE_OPERAND (exp, 0);
6280       break;
6281
6282     case IMAGPART_EXPR:
6283       /* The imaginary part of the complex number is always second.
6284          The expression is therefore always offset by the size of the
6285          scalar type.  */
6286       offset = 0;
6287       bitpos = GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (exp)));
6288       inner = TREE_OPERAND (exp, 0);
6289       break;
6290
6291     default:
6292       /* If the object is a DECL, then expand it for its rtl.  Don't bypass
6293          expand_expr, as that can have various side effects; LABEL_DECLs for
6294          example, may not have their DECL_RTL set yet.  Assume language
6295          specific tree nodes can be expanded in some interesting way.  */
6296       if (DECL_P (exp)
6297           || TREE_CODE (exp) >= LAST_AND_UNUSED_TREE_CODE)
6298         {
6299           result = expand_expr (exp, target, tmode,
6300                                 modifier == EXPAND_INITIALIZER
6301                                 ? EXPAND_INITIALIZER : EXPAND_CONST_ADDRESS);
6302
6303           /* If the DECL isn't in memory, then the DECL wasn't properly
6304              marked TREE_ADDRESSABLE, which will be either a front-end
6305              or a tree optimizer bug.  */
6306           gcc_assert (MEM_P (result));
6307           result = XEXP (result, 0);
6308
6309           /* ??? Is this needed anymore?  */
6310           if (DECL_P (exp) && !TREE_USED (exp) == 0)
6311             {
6312               assemble_external (exp);
6313               TREE_USED (exp) = 1;
6314             }
6315
6316           if (modifier != EXPAND_INITIALIZER
6317               && modifier != EXPAND_CONST_ADDRESS)
6318             result = force_operand (result, target);
6319           return result;
6320         }
6321
6322       /* Pass FALSE as the last argument to get_inner_reference although
6323          we are expanding to RTL.  The rationale is that we know how to
6324          handle "aligning nodes" here: we can just bypass them because
6325          they won't change the final object whose address will be returned
6326          (they actually exist only for that purpose).  */
6327       inner = get_inner_reference (exp, &bitsize, &bitpos, &offset,
6328                                    &mode1, &unsignedp, &volatilep, false);
6329       break;
6330     }
6331
6332   /* We must have made progress.  */
6333   gcc_assert (inner != exp);
6334
6335   subtarget = offset || bitpos ? NULL_RTX : target;
6336   result = expand_expr_addr_expr_1 (inner, subtarget, tmode, modifier);
6337
6338   if (offset)
6339     {
6340       rtx tmp;
6341
6342       if (modifier != EXPAND_NORMAL)
6343         result = force_operand (result, NULL);
6344       tmp = expand_expr (offset, NULL, tmode, EXPAND_NORMAL);
6345
6346       result = convert_memory_address (tmode, result);
6347       tmp = convert_memory_address (tmode, tmp);
6348
6349       if (modifier == EXPAND_SUM || modifier == EXPAND_INITIALIZER)
6350         result = gen_rtx_PLUS (tmode, result, tmp);
6351       else
6352         {
6353           subtarget = bitpos ? NULL_RTX : target;
6354           result = expand_simple_binop (tmode, PLUS, result, tmp, subtarget,
6355                                         1, OPTAB_LIB_WIDEN);
6356         }
6357     }
6358
6359   if (bitpos)
6360     {
6361       /* Someone beforehand should have rejected taking the address
6362          of such an object.  */
6363       gcc_assert ((bitpos % BITS_PER_UNIT) == 0);
6364
6365       result = plus_constant (result, bitpos / BITS_PER_UNIT);
6366       if (modifier < EXPAND_SUM)
6367         result = force_operand (result, target);
6368     }
6369
6370   return result;
6371 }
6372
6373 /* A subroutine of expand_expr.  Evaluate EXP, which is an ADDR_EXPR.
6374    The TARGET, TMODE and MODIFIER arguments are as for expand_expr.  */
6375
6376 static rtx
6377 expand_expr_addr_expr (tree exp, rtx target, enum machine_mode tmode,
6378                        enum expand_modifier modifier)
6379 {
6380   enum machine_mode rmode;
6381   rtx result;
6382
6383   /* Target mode of VOIDmode says "whatever's natural".  */
6384   if (tmode == VOIDmode)
6385     tmode = TYPE_MODE (TREE_TYPE (exp));
6386
6387   /* We can get called with some Weird Things if the user does silliness
6388      like "(short) &a".  In that case, convert_memory_address won't do
6389      the right thing, so ignore the given target mode.  */
6390   if (tmode != Pmode && tmode != ptr_mode)
6391     tmode = Pmode;
6392
6393   result = expand_expr_addr_expr_1 (TREE_OPERAND (exp, 0), target,
6394                                     tmode, modifier);
6395
6396   /* Despite expand_expr claims concerning ignoring TMODE when not
6397      strictly convenient, stuff breaks if we don't honor it.  Note
6398      that combined with the above, we only do this for pointer modes.  */
6399   rmode = GET_MODE (result);
6400   if (rmode == VOIDmode)
6401     rmode = tmode;
6402   if (rmode != tmode)
6403     result = convert_memory_address (tmode, result);
6404
6405   return result;
6406 }
6407
6408
6409 /* expand_expr: generate code for computing expression EXP.
6410    An rtx for the computed value is returned.  The value is never null.
6411    In the case of a void EXP, const0_rtx is returned.
6412
6413    The value may be stored in TARGET if TARGET is nonzero.
6414    TARGET is just a suggestion; callers must assume that
6415    the rtx returned may not be the same as TARGET.
6416
6417    If TARGET is CONST0_RTX, it means that the value will be ignored.
6418
6419    If TMODE is not VOIDmode, it suggests generating the
6420    result in mode TMODE.  But this is done only when convenient.
6421    Otherwise, TMODE is ignored and the value generated in its natural mode.
6422    TMODE is just a suggestion; callers must assume that
6423    the rtx returned may not have mode TMODE.
6424
6425    Note that TARGET may have neither TMODE nor MODE.  In that case, it
6426    probably will not be used.
6427
6428    If MODIFIER is EXPAND_SUM then when EXP is an addition
6429    we can return an rtx of the form (MULT (REG ...) (CONST_INT ...))
6430    or a nest of (PLUS ...) and (MINUS ...) where the terms are
6431    products as above, or REG or MEM, or constant.
6432    Ordinarily in such cases we would output mul or add instructions
6433    and then return a pseudo reg containing the sum.
6434
6435    EXPAND_INITIALIZER is much like EXPAND_SUM except that
6436    it also marks a label as absolutely required (it can't be dead).
6437    It also makes a ZERO_EXTEND or SIGN_EXTEND instead of emitting extend insns.
6438    This is used for outputting expressions used in initializers.
6439
6440    EXPAND_CONST_ADDRESS says that it is okay to return a MEM
6441    with a constant address even if that address is not normally legitimate.
6442    EXPAND_INITIALIZER and EXPAND_SUM also have this effect.
6443
6444    EXPAND_STACK_PARM is used when expanding to a TARGET on the stack for
6445    a call parameter.  Such targets require special care as we haven't yet
6446    marked TARGET so that it's safe from being trashed by libcalls.  We
6447    don't want to use TARGET for anything but the final result;
6448    Intermediate values must go elsewhere.   Additionally, calls to
6449    emit_block_move will be flagged with BLOCK_OP_CALL_PARM.
6450
6451    If EXP is a VAR_DECL whose DECL_RTL was a MEM with an invalid
6452    address, and ALT_RTL is non-NULL, then *ALT_RTL is set to the
6453    DECL_RTL of the VAR_DECL.  *ALT_RTL is also set if EXP is a
6454    COMPOUND_EXPR whose second argument is such a VAR_DECL, and so on
6455    recursively.  */
6456
6457 static rtx expand_expr_real_1 (tree, rtx, enum machine_mode,
6458                                enum expand_modifier, rtx *);
6459
6460 rtx
6461 expand_expr_real (tree exp, rtx target, enum machine_mode tmode,
6462                   enum expand_modifier modifier, rtx *alt_rtl)
6463 {
6464   int rn = -1;
6465   rtx ret, last = NULL;
6466
6467   /* Handle ERROR_MARK before anybody tries to access its type.  */
6468   if (TREE_CODE (exp) == ERROR_MARK
6469       || TREE_CODE (TREE_TYPE (exp)) == ERROR_MARK)
6470     {
6471       ret = CONST0_RTX (tmode);
6472       return ret ? ret : const0_rtx;
6473     }
6474
6475   if (flag_non_call_exceptions)
6476     {
6477       rn = lookup_stmt_eh_region (exp);
6478       /* If rn < 0, then either (1) tree-ssa not used or (2) doesn't throw.  */
6479       if (rn >= 0)
6480         last = get_last_insn ();
6481     }
6482
6483   /* If this is an expression of some kind and it has an associated line
6484      number, then emit the line number before expanding the expression.
6485
6486      We need to save and restore the file and line information so that
6487      errors discovered during expansion are emitted with the right
6488      information.  It would be better of the diagnostic routines
6489      used the file/line information embedded in the tree nodes rather
6490      than globals.  */
6491   if (cfun && cfun->ib_boundaries_block && EXPR_HAS_LOCATION (exp))
6492     {
6493       location_t saved_location = input_location;
6494       input_location = EXPR_LOCATION (exp);
6495       emit_line_note (input_location);
6496
6497       /* Record where the insns produced belong.  */
6498       record_block_change (TREE_BLOCK (exp));
6499
6500       ret = expand_expr_real_1 (exp, target, tmode, modifier, alt_rtl);
6501
6502       input_location = saved_location;
6503     }
6504   else
6505     {
6506       ret = expand_expr_real_1 (exp, target, tmode, modifier, alt_rtl);
6507     }
6508
6509   /* If using non-call exceptions, mark all insns that may trap.
6510      expand_call() will mark CALL_INSNs before we get to this code,
6511      but it doesn't handle libcalls, and these may trap.  */
6512   if (rn >= 0)
6513     {
6514       rtx insn;
6515       for (insn = next_real_insn (last); insn;
6516            insn = next_real_insn (insn))
6517         {
6518           if (! find_reg_note (insn, REG_EH_REGION, NULL_RTX)
6519               /* If we want exceptions for non-call insns, any
6520                  may_trap_p instruction may throw.  */
6521               && GET_CODE (PATTERN (insn)) != CLOBBER
6522               && GET_CODE (PATTERN (insn)) != USE
6523               && (CALL_P (insn) || may_trap_p (PATTERN (insn))))
6524             {
6525               REG_NOTES (insn) = alloc_EXPR_LIST (REG_EH_REGION, GEN_INT (rn),
6526                                                   REG_NOTES (insn));
6527             }
6528         }
6529     }
6530
6531   return ret;
6532 }
6533
6534 static rtx
6535 expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
6536                     enum expand_modifier modifier, rtx *alt_rtl)
6537 {
6538   rtx op0, op1, temp;
6539   tree type = TREE_TYPE (exp);
6540   int unsignedp;
6541   enum machine_mode mode;
6542   enum tree_code code = TREE_CODE (exp);
6543   optab this_optab;
6544   rtx subtarget, original_target;
6545   int ignore;
6546   tree context, subexp0, subexp1;
6547   bool reduce_bit_field = false;
6548 #define REDUCE_BIT_FIELD(expr)  (reduce_bit_field && !ignore              \
6549                                  ? reduce_to_bit_field_precision ((expr), \
6550                                                                   target, \
6551                                                                   type)   \
6552                                  : (expr))
6553
6554   mode = TYPE_MODE (type);
6555   unsignedp = TYPE_UNSIGNED (type);
6556   if (lang_hooks.reduce_bit_field_operations
6557       && TREE_CODE (type) == INTEGER_TYPE
6558       && GET_MODE_PRECISION (mode) > TYPE_PRECISION (type))
6559     {
6560       /* An operation in what may be a bit-field type needs the
6561          result to be reduced to the precision of the bit-field type,
6562          which is narrower than that of the type's mode.  */
6563       reduce_bit_field = true;
6564       if (modifier == EXPAND_STACK_PARM)
6565         target = 0;
6566     }
6567
6568   /* Use subtarget as the target for operand 0 of a binary operation.  */
6569   subtarget = get_subtarget (target);
6570   original_target = target;
6571   ignore = (target == const0_rtx
6572             || ((code == NON_LVALUE_EXPR || code == NOP_EXPR
6573                  || code == CONVERT_EXPR || code == COND_EXPR
6574                  || code == VIEW_CONVERT_EXPR)
6575                 && TREE_CODE (type) == VOID_TYPE));
6576
6577   /* If we are going to ignore this result, we need only do something
6578      if there is a side-effect somewhere in the expression.  If there
6579      is, short-circuit the most common cases here.  Note that we must
6580      not call expand_expr with anything but const0_rtx in case this
6581      is an initial expansion of a size that contains a PLACEHOLDER_EXPR.  */
6582
6583   if (ignore)
6584     {
6585       if (! TREE_SIDE_EFFECTS (exp))
6586         return const0_rtx;
6587
6588       /* Ensure we reference a volatile object even if value is ignored, but
6589          don't do this if all we are doing is taking its address.  */
6590       if (TREE_THIS_VOLATILE (exp)
6591           && TREE_CODE (exp) != FUNCTION_DECL
6592           && mode != VOIDmode && mode != BLKmode
6593           && modifier != EXPAND_CONST_ADDRESS)
6594         {
6595           temp = expand_expr (exp, NULL_RTX, VOIDmode, modifier);
6596           if (MEM_P (temp))
6597             temp = copy_to_reg (temp);
6598           return const0_rtx;
6599         }
6600
6601       if (TREE_CODE_CLASS (code) == tcc_unary
6602           || code == COMPONENT_REF || code == INDIRECT_REF)
6603         return expand_expr (TREE_OPERAND (exp, 0), const0_rtx, VOIDmode,
6604                             modifier);
6605
6606       else if (TREE_CODE_CLASS (code) == tcc_binary
6607                || TREE_CODE_CLASS (code) == tcc_comparison
6608                || code == ARRAY_REF || code == ARRAY_RANGE_REF)
6609         {
6610           expand_expr (TREE_OPERAND (exp, 0), const0_rtx, VOIDmode, modifier);
6611           expand_expr (TREE_OPERAND (exp, 1), const0_rtx, VOIDmode, modifier);
6612           return const0_rtx;
6613         }
6614       else if (code == BIT_FIELD_REF)
6615         {
6616           expand_expr (TREE_OPERAND (exp, 0), const0_rtx, VOIDmode, modifier);
6617           expand_expr (TREE_OPERAND (exp, 1), const0_rtx, VOIDmode, modifier);
6618           expand_expr (TREE_OPERAND (exp, 2), const0_rtx, VOIDmode, modifier);
6619           return const0_rtx;
6620         }
6621
6622       target = 0;
6623     }
6624
6625
6626   switch (code)
6627     {
6628     case LABEL_DECL:
6629       {
6630         tree function = decl_function_context (exp);
6631
6632         temp = label_rtx (exp);
6633         temp = gen_rtx_LABEL_REF (Pmode, temp);
6634
6635         if (function != current_function_decl
6636             && function != 0)
6637           LABEL_REF_NONLOCAL_P (temp) = 1;
6638
6639         temp = gen_rtx_MEM (FUNCTION_MODE, temp);
6640         return temp;
6641       }
6642
6643     case SSA_NAME:
6644       return expand_expr_real_1 (SSA_NAME_VAR (exp), target, tmode, modifier,
6645                                  NULL);
6646
6647     case PARM_DECL:
6648     case VAR_DECL:
6649       /* If a static var's type was incomplete when the decl was written,
6650          but the type is complete now, lay out the decl now.  */
6651       if (DECL_SIZE (exp) == 0
6652           && COMPLETE_OR_UNBOUND_ARRAY_TYPE_P (TREE_TYPE (exp))
6653           && (TREE_STATIC (exp) || DECL_EXTERNAL (exp)))
6654         layout_decl (exp, 0);
6655
6656       /* ... fall through ...  */
6657
6658     case FUNCTION_DECL:
6659     case RESULT_DECL:
6660       gcc_assert (DECL_RTL (exp));
6661
6662       /* Ensure variable marked as used even if it doesn't go through
6663          a parser.  If it hasn't be used yet, write out an external
6664          definition.  */
6665       if (! TREE_USED (exp))
6666         {
6667           assemble_external (exp);
6668           TREE_USED (exp) = 1;
6669         }
6670
6671       /* Show we haven't gotten RTL for this yet.  */
6672       temp = 0;
6673
6674       /* Variables inherited from containing functions should have
6675          been lowered by this point.  */
6676       context = decl_function_context (exp);
6677       gcc_assert (!context
6678                   || context == current_function_decl
6679                   || TREE_STATIC (exp)
6680                   /* ??? C++ creates functions that are not TREE_STATIC.  */
6681                   || TREE_CODE (exp) == FUNCTION_DECL);
6682
6683       /* This is the case of an array whose size is to be determined
6684          from its initializer, while the initializer is still being parsed.
6685          See expand_decl.  */
6686
6687       if (MEM_P (DECL_RTL (exp))
6688                && REG_P (XEXP (DECL_RTL (exp), 0)))
6689         temp = validize_mem (DECL_RTL (exp));
6690
6691       /* If DECL_RTL is memory, we are in the normal case and either
6692          the address is not valid or it is not a register and -fforce-addr
6693          is specified, get the address into a register.  */
6694
6695       else if (MEM_P (DECL_RTL (exp))
6696                && modifier != EXPAND_CONST_ADDRESS
6697                && modifier != EXPAND_SUM
6698                && modifier != EXPAND_INITIALIZER
6699                && (! memory_address_p (DECL_MODE (exp),
6700                                        XEXP (DECL_RTL (exp), 0))
6701                    || (flag_force_addr
6702                        && !REG_P (XEXP (DECL_RTL (exp), 0)))))
6703         {
6704           if (alt_rtl)
6705             *alt_rtl = DECL_RTL (exp);
6706           temp = replace_equiv_address (DECL_RTL (exp),
6707                                         copy_rtx (XEXP (DECL_RTL (exp), 0)));
6708         }
6709
6710       /* If we got something, return it.  But first, set the alignment
6711          if the address is a register.  */
6712       if (temp != 0)
6713         {
6714           if (MEM_P (temp) && REG_P (XEXP (temp, 0)))
6715             mark_reg_pointer (XEXP (temp, 0), DECL_ALIGN (exp));
6716
6717           return temp;
6718         }
6719
6720       /* If the mode of DECL_RTL does not match that of the decl, it
6721          must be a promoted value.  We return a SUBREG of the wanted mode,
6722          but mark it so that we know that it was already extended.  */
6723
6724       if (REG_P (DECL_RTL (exp))
6725           && GET_MODE (DECL_RTL (exp)) != DECL_MODE (exp))
6726         {
6727           enum machine_mode pmode;
6728           
6729           /* Get the signedness used for this variable.  Ensure we get the
6730              same mode we got when the variable was declared.  */
6731           pmode = promote_mode (type, DECL_MODE (exp), &unsignedp,
6732                                 (TREE_CODE (exp) == RESULT_DECL ? 1 : 0));
6733           gcc_assert (GET_MODE (DECL_RTL (exp)) == pmode);
6734
6735           temp = gen_lowpart_SUBREG (mode, DECL_RTL (exp));
6736           SUBREG_PROMOTED_VAR_P (temp) = 1;
6737           SUBREG_PROMOTED_UNSIGNED_SET (temp, unsignedp);
6738           return temp;
6739         }
6740
6741       return DECL_RTL (exp);
6742
6743     case INTEGER_CST:
6744       temp = immed_double_const (TREE_INT_CST_LOW (exp),
6745                                  TREE_INT_CST_HIGH (exp), mode);
6746
6747       /* ??? If overflow is set, fold will have done an incomplete job,
6748          which can result in (plus xx (const_int 0)), which can get
6749          simplified by validate_replace_rtx during virtual register
6750          instantiation, which can result in unrecognizable insns.
6751          Avoid this by forcing all overflows into registers.  */
6752       if (TREE_CONSTANT_OVERFLOW (exp)
6753           && modifier != EXPAND_INITIALIZER)
6754         temp = force_reg (mode, temp);
6755
6756       return temp;
6757
6758     case VECTOR_CST:
6759       if (GET_MODE_CLASS (TYPE_MODE (TREE_TYPE (exp))) == MODE_VECTOR_INT
6760           || GET_MODE_CLASS (TYPE_MODE (TREE_TYPE (exp))) == MODE_VECTOR_FLOAT)
6761         return const_vector_from_tree (exp);
6762       else
6763         return expand_expr (build_constructor_from_list
6764                             (TREE_TYPE (exp),
6765                              TREE_VECTOR_CST_ELTS (exp)),
6766                             ignore ? const0_rtx : target, tmode, modifier);
6767
6768     case CONST_DECL:
6769       return expand_expr (DECL_INITIAL (exp), target, VOIDmode, modifier);
6770
6771     case REAL_CST:
6772       /* If optimized, generate immediate CONST_DOUBLE
6773          which will be turned into memory by reload if necessary.
6774
6775          We used to force a register so that loop.c could see it.  But
6776          this does not allow gen_* patterns to perform optimizations with
6777          the constants.  It also produces two insns in cases like "x = 1.0;".
6778          On most machines, floating-point constants are not permitted in
6779          many insns, so we'd end up copying it to a register in any case.
6780
6781          Now, we do the copying in expand_binop, if appropriate.  */
6782       return CONST_DOUBLE_FROM_REAL_VALUE (TREE_REAL_CST (exp),
6783                                            TYPE_MODE (TREE_TYPE (exp)));
6784
6785     case COMPLEX_CST:
6786       /* Handle evaluating a complex constant in a CONCAT target.  */
6787       if (original_target && GET_CODE (original_target) == CONCAT)
6788         {
6789           enum machine_mode mode = TYPE_MODE (TREE_TYPE (TREE_TYPE (exp)));
6790           rtx rtarg, itarg;
6791
6792           rtarg = XEXP (original_target, 0);
6793           itarg = XEXP (original_target, 1);
6794
6795           /* Move the real and imaginary parts separately.  */
6796           op0 = expand_expr (TREE_REALPART (exp), rtarg, mode, 0);
6797           op1 = expand_expr (TREE_IMAGPART (exp), itarg, mode, 0);
6798
6799           if (op0 != rtarg)
6800             emit_move_insn (rtarg, op0);
6801           if (op1 != itarg)
6802             emit_move_insn (itarg, op1);
6803
6804           return original_target;
6805         }
6806
6807       /* ... fall through ...  */
6808
6809     case STRING_CST:
6810       temp = output_constant_def (exp, 1);
6811
6812       /* temp contains a constant address.
6813          On RISC machines where a constant address isn't valid,
6814          make some insns to get that address into a register.  */
6815       if (modifier != EXPAND_CONST_ADDRESS
6816           && modifier != EXPAND_INITIALIZER
6817           && modifier != EXPAND_SUM
6818           && (! memory_address_p (mode, XEXP (temp, 0))
6819               || flag_force_addr))
6820         return replace_equiv_address (temp,
6821                                       copy_rtx (XEXP (temp, 0)));
6822       return temp;
6823
6824     case SAVE_EXPR:
6825       {
6826         tree val = TREE_OPERAND (exp, 0);
6827         rtx ret = expand_expr_real_1 (val, target, tmode, modifier, alt_rtl);
6828
6829         if (!SAVE_EXPR_RESOLVED_P (exp))
6830           {
6831             /* We can indeed still hit this case, typically via builtin
6832                expanders calling save_expr immediately before expanding
6833                something.  Assume this means that we only have to deal
6834                with non-BLKmode values.  */
6835             gcc_assert (GET_MODE (ret) != BLKmode);
6836
6837             val = build_decl (VAR_DECL, NULL, TREE_TYPE (exp));
6838             DECL_ARTIFICIAL (val) = 1;
6839             DECL_IGNORED_P (val) = 1;
6840             TREE_OPERAND (exp, 0) = val;
6841             SAVE_EXPR_RESOLVED_P (exp) = 1;
6842
6843             if (!CONSTANT_P (ret))
6844               ret = copy_to_reg (ret);
6845             SET_DECL_RTL (val, ret);
6846           }
6847
6848         return ret;
6849       }
6850
6851     case GOTO_EXPR:
6852       if (TREE_CODE (TREE_OPERAND (exp, 0)) == LABEL_DECL)
6853         expand_goto (TREE_OPERAND (exp, 0));
6854       else
6855         expand_computed_goto (TREE_OPERAND (exp, 0));
6856       return const0_rtx;
6857
6858     case CONSTRUCTOR:
6859       /* If we don't need the result, just ensure we evaluate any
6860          subexpressions.  */
6861       if (ignore)
6862         {
6863           unsigned HOST_WIDE_INT idx;
6864           tree value;
6865
6866           FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (exp), idx, value)
6867             expand_expr (value, const0_rtx, VOIDmode, 0);
6868
6869           return const0_rtx;
6870         }
6871
6872       /* Try to avoid creating a temporary at all.  This is possible
6873          if all of the initializer is zero.
6874          FIXME: try to handle all [0..255] initializers we can handle
6875          with memset.  */
6876       else if (TREE_STATIC (exp)
6877                && !TREE_ADDRESSABLE (exp)
6878                && target != 0 && mode == BLKmode
6879                && all_zeros_p (exp))
6880         {
6881           clear_storage (target, expr_size (exp), BLOCK_OP_NORMAL);
6882           return target;
6883         }
6884
6885       /* All elts simple constants => refer to a constant in memory.  But
6886          if this is a non-BLKmode mode, let it store a field at a time
6887          since that should make a CONST_INT or CONST_DOUBLE when we
6888          fold.  Likewise, if we have a target we can use, it is best to
6889          store directly into the target unless the type is large enough
6890          that memcpy will be used.  If we are making an initializer and
6891          all operands are constant, put it in memory as well.
6892
6893         FIXME: Avoid trying to fill vector constructors piece-meal.
6894         Output them with output_constant_def below unless we're sure
6895         they're zeros.  This should go away when vector initializers
6896         are treated like VECTOR_CST instead of arrays.
6897       */
6898       else if ((TREE_STATIC (exp)
6899                 && ((mode == BLKmode
6900                      && ! (target != 0 && safe_from_p (target, exp, 1)))
6901                     || TREE_ADDRESSABLE (exp)
6902                     || (host_integerp (TYPE_SIZE_UNIT (type), 1)
6903                         && (! MOVE_BY_PIECES_P
6904                             (tree_low_cst (TYPE_SIZE_UNIT (type), 1),
6905                              TYPE_ALIGN (type)))
6906                         && ! mostly_zeros_p (exp))))
6907                || ((modifier == EXPAND_INITIALIZER
6908                     || modifier == EXPAND_CONST_ADDRESS)
6909                    && TREE_CONSTANT (exp)))
6910         {
6911           rtx constructor = output_constant_def (exp, 1);
6912
6913           if (modifier != EXPAND_CONST_ADDRESS
6914               && modifier != EXPAND_INITIALIZER
6915               && modifier != EXPAND_SUM)
6916             constructor = validize_mem (constructor);
6917
6918           return constructor;
6919         }
6920       else
6921         {
6922           /* Handle calls that pass values in multiple non-contiguous
6923              locations.  The Irix 6 ABI has examples of this.  */
6924           if (target == 0 || ! safe_from_p (target, exp, 1)
6925               || GET_CODE (target) == PARALLEL
6926               || modifier == EXPAND_STACK_PARM)
6927             target
6928               = assign_temp (build_qualified_type (type,
6929                                                    (TYPE_QUALS (type)
6930                                                     | (TREE_READONLY (exp)
6931                                                        * TYPE_QUAL_CONST))),
6932                              0, TREE_ADDRESSABLE (exp), 1);
6933
6934           store_constructor (exp, target, 0, int_expr_size (exp));
6935           return target;
6936         }
6937
6938     case MISALIGNED_INDIRECT_REF:
6939     case ALIGN_INDIRECT_REF:
6940     case INDIRECT_REF:
6941       {
6942         tree exp1 = TREE_OPERAND (exp, 0);
6943
6944         if (modifier != EXPAND_WRITE)
6945           {
6946             tree t;
6947
6948             t = fold_read_from_constant_string (exp);
6949             if (t)
6950               return expand_expr (t, target, tmode, modifier);
6951           }
6952
6953         op0 = expand_expr (exp1, NULL_RTX, VOIDmode, EXPAND_SUM);
6954         op0 = memory_address (mode, op0);
6955
6956         if (code == ALIGN_INDIRECT_REF)
6957           {
6958             int align = TYPE_ALIGN_UNIT (type);
6959             op0 = gen_rtx_AND (Pmode, op0, GEN_INT (-align));
6960             op0 = memory_address (mode, op0);
6961           }
6962
6963         temp = gen_rtx_MEM (mode, op0);
6964
6965         set_mem_attributes (temp, exp, 0);
6966
6967         /* Resolve the misalignment now, so that we don't have to remember
6968            to resolve it later.  Of course, this only works for reads.  */
6969         /* ??? When we get around to supporting writes, we'll have to handle
6970            this in store_expr directly.  The vectorizer isn't generating
6971            those yet, however.  */
6972         if (code == MISALIGNED_INDIRECT_REF)
6973           {
6974             int icode;
6975             rtx reg, insn;
6976
6977             gcc_assert (modifier == EXPAND_NORMAL
6978                         || modifier == EXPAND_STACK_PARM);
6979
6980             /* The vectorizer should have already checked the mode.  */
6981             icode = movmisalign_optab->handlers[mode].insn_code;
6982             gcc_assert (icode != CODE_FOR_nothing);
6983
6984             /* We've already validated the memory, and we're creating a
6985                new pseudo destination.  The predicates really can't fail.  */
6986             reg = gen_reg_rtx (mode);
6987
6988             /* Nor can the insn generator.  */
6989             insn = GEN_FCN (icode) (reg, temp);
6990             emit_insn (insn);
6991
6992             return reg;
6993           }
6994
6995         return temp;
6996       }
6997
6998     case TARGET_MEM_REF:
6999       {
7000         struct mem_address addr;
7001
7002         get_address_description (exp, &addr);
7003         op0 = addr_for_mem_ref (&addr, true);
7004         op0 = memory_address (mode, op0);
7005         temp = gen_rtx_MEM (mode, op0);
7006         set_mem_attributes (temp, TMR_ORIGINAL (exp), 0);
7007       }
7008       return temp;
7009
7010     case ARRAY_REF:
7011
7012       {
7013         tree array = TREE_OPERAND (exp, 0);
7014         tree index = TREE_OPERAND (exp, 1);
7015
7016         /* Fold an expression like: "foo"[2].
7017            This is not done in fold so it won't happen inside &.
7018            Don't fold if this is for wide characters since it's too
7019            difficult to do correctly and this is a very rare case.  */
7020
7021         if (modifier != EXPAND_CONST_ADDRESS
7022             && modifier != EXPAND_INITIALIZER
7023             && modifier != EXPAND_MEMORY)
7024           {
7025             tree t = fold_read_from_constant_string (exp);
7026
7027             if (t)
7028               return expand_expr (t, target, tmode, modifier);
7029           }
7030
7031         /* If this is a constant index into a constant array,
7032            just get the value from the array.  Handle both the cases when
7033            we have an explicit constructor and when our operand is a variable
7034            that was declared const.  */
7035
7036         if (modifier != EXPAND_CONST_ADDRESS
7037             && modifier != EXPAND_INITIALIZER
7038             && modifier != EXPAND_MEMORY
7039             && TREE_CODE (array) == CONSTRUCTOR
7040             && ! TREE_SIDE_EFFECTS (array)
7041             && TREE_CODE (index) == INTEGER_CST)
7042           {
7043             unsigned HOST_WIDE_INT ix;
7044             tree field, value;
7045
7046             FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (array), ix,
7047                                       field, value)
7048               if (tree_int_cst_equal (field, index))
7049                 {
7050                   if (!TREE_SIDE_EFFECTS (value))
7051                     return expand_expr (fold (value), target, tmode, modifier);
7052                   break;
7053                 }
7054           }
7055
7056         else if (optimize >= 1
7057                  && modifier != EXPAND_CONST_ADDRESS
7058                  && modifier != EXPAND_INITIALIZER
7059                  && modifier != EXPAND_MEMORY
7060                  && TREE_READONLY (array) && ! TREE_SIDE_EFFECTS (array)
7061                  && TREE_CODE (array) == VAR_DECL && DECL_INITIAL (array)
7062                  && TREE_CODE (DECL_INITIAL (array)) != ERROR_MARK
7063                  && targetm.binds_local_p (array))
7064           {
7065             if (TREE_CODE (index) == INTEGER_CST)
7066               {
7067                 tree init = DECL_INITIAL (array);
7068
7069                 if (TREE_CODE (init) == CONSTRUCTOR)
7070                   {
7071                     unsigned HOST_WIDE_INT ix;
7072                     tree field, value;
7073
7074                     FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (init), ix,
7075                                               field, value)
7076                       if (tree_int_cst_equal (field, index))
7077                         {
7078                           if (!TREE_SIDE_EFFECTS (value))
7079                             return expand_expr (fold (value), target, tmode,
7080                                                 modifier);
7081                           break;
7082                         }
7083                   }
7084                 else if (TREE_CODE (init) == STRING_CST
7085                          && 0 > compare_tree_int (index,
7086                                                   TREE_STRING_LENGTH (init)))
7087                   {
7088                     tree type = TREE_TYPE (TREE_TYPE (init));
7089                     enum machine_mode mode = TYPE_MODE (type);
7090
7091                     if (GET_MODE_CLASS (mode) == MODE_INT
7092                         && GET_MODE_SIZE (mode) == 1)
7093                       return gen_int_mode (TREE_STRING_POINTER (init)
7094                                            [TREE_INT_CST_LOW (index)], mode);
7095                   }
7096               }
7097           }
7098       }
7099       goto normal_inner_ref;
7100
7101     case COMPONENT_REF:
7102       /* If the operand is a CONSTRUCTOR, we can just extract the
7103          appropriate field if it is present.  */
7104       if (TREE_CODE (TREE_OPERAND (exp, 0)) == CONSTRUCTOR)
7105         {
7106           unsigned HOST_WIDE_INT idx;
7107           tree field, value;
7108
7109           FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (TREE_OPERAND (exp, 0)),
7110                                     idx, field, value)
7111             if (field == TREE_OPERAND (exp, 1)
7112                 /* We can normally use the value of the field in the
7113                    CONSTRUCTOR.  However, if this is a bitfield in
7114                    an integral mode that we can fit in a HOST_WIDE_INT,
7115                    we must mask only the number of bits in the bitfield,
7116                    since this is done implicitly by the constructor.  If
7117                    the bitfield does not meet either of those conditions,
7118                    we can't do this optimization.  */
7119                 && (! DECL_BIT_FIELD (field)
7120                     || ((GET_MODE_CLASS (DECL_MODE (field)) == MODE_INT)
7121                         && (GET_MODE_BITSIZE (DECL_MODE (field))
7122                             <= HOST_BITS_PER_WIDE_INT))))
7123               {
7124                 if (DECL_BIT_FIELD (field)
7125                     && modifier == EXPAND_STACK_PARM)
7126                   target = 0;
7127                 op0 = expand_expr (value, target, tmode, modifier);
7128                 if (DECL_BIT_FIELD (field))
7129                   {
7130                     HOST_WIDE_INT bitsize = TREE_INT_CST_LOW (DECL_SIZE (field));
7131                     enum machine_mode imode = TYPE_MODE (TREE_TYPE (field));
7132
7133                     if (TYPE_UNSIGNED (TREE_TYPE (field)))
7134                       {
7135                         op1 = GEN_INT (((HOST_WIDE_INT) 1 << bitsize) - 1);
7136                         op0 = expand_and (imode, op0, op1, target);
7137                       }
7138                     else
7139                       {
7140                         tree count
7141                           = build_int_cst (NULL_TREE,
7142                                            GET_MODE_BITSIZE (imode) - bitsize);
7143
7144                         op0 = expand_shift (LSHIFT_EXPR, imode, op0, count,
7145                                             target, 0);
7146                         op0 = expand_shift (RSHIFT_EXPR, imode, op0, count,
7147                                             target, 0);
7148                       }
7149                   }
7150
7151                 return op0;
7152               }
7153         }
7154       goto normal_inner_ref;
7155
7156     case BIT_FIELD_REF:
7157     case ARRAY_RANGE_REF:
7158     normal_inner_ref:
7159       {
7160         enum machine_mode mode1;
7161         HOST_WIDE_INT bitsize, bitpos;
7162         tree offset;
7163         int volatilep = 0;
7164         tree tem = get_inner_reference (exp, &bitsize, &bitpos, &offset,
7165                                         &mode1, &unsignedp, &volatilep, true);
7166         rtx orig_op0;
7167
7168         /* If we got back the original object, something is wrong.  Perhaps
7169            we are evaluating an expression too early.  In any event, don't
7170            infinitely recurse.  */
7171         gcc_assert (tem != exp);
7172
7173         /* If TEM's type is a union of variable size, pass TARGET to the inner
7174            computation, since it will need a temporary and TARGET is known
7175            to have to do.  This occurs in unchecked conversion in Ada.  */
7176
7177         orig_op0 = op0
7178           = expand_expr (tem,
7179                          (TREE_CODE (TREE_TYPE (tem)) == UNION_TYPE
7180                           && (TREE_CODE (TYPE_SIZE (TREE_TYPE (tem)))
7181                               != INTEGER_CST)
7182                           && modifier != EXPAND_STACK_PARM
7183                           ? target : NULL_RTX),
7184                          VOIDmode,
7185                          (modifier == EXPAND_INITIALIZER
7186                           || modifier == EXPAND_CONST_ADDRESS
7187                           || modifier == EXPAND_STACK_PARM)
7188                          ? modifier : EXPAND_NORMAL);
7189
7190         /* If this is a constant, put it into a register if it is a legitimate
7191            constant, OFFSET is 0, and we won't try to extract outside the
7192            register (in case we were passed a partially uninitialized object
7193            or a view_conversion to a larger size).  Force the constant to
7194            memory otherwise.  */
7195         if (CONSTANT_P (op0))
7196           {
7197             enum machine_mode mode = TYPE_MODE (TREE_TYPE (tem));
7198             if (mode != BLKmode && LEGITIMATE_CONSTANT_P (op0)
7199                 && offset == 0
7200                 && bitpos + bitsize <= GET_MODE_BITSIZE (mode))
7201               op0 = force_reg (mode, op0);
7202             else
7203               op0 = validize_mem (force_const_mem (mode, op0));
7204           }
7205
7206         /* Otherwise, if this object not in memory and we either have an
7207            offset, a BLKmode result, or a reference outside the object, put it
7208            there.  Such cases can occur in Ada if we have unchecked conversion
7209            of an expression from a scalar type to an array or record type or
7210            for an ARRAY_RANGE_REF whose type is BLKmode.  */
7211         else if (!MEM_P (op0)
7212                  && (offset != 0
7213                      || (bitpos + bitsize > GET_MODE_BITSIZE (GET_MODE (op0)))
7214                      || (code == ARRAY_RANGE_REF && mode == BLKmode)))
7215           {
7216             tree nt = build_qualified_type (TREE_TYPE (tem),
7217                                             (TYPE_QUALS (TREE_TYPE (tem))
7218                                              | TYPE_QUAL_CONST));
7219             rtx memloc = assign_temp (nt, 1, 1, 1);
7220
7221             emit_move_insn (memloc, op0);
7222             op0 = memloc;
7223           }
7224
7225         if (offset != 0)
7226           {
7227             rtx offset_rtx = expand_expr (offset, NULL_RTX, VOIDmode,
7228                                           EXPAND_SUM);
7229
7230             gcc_assert (MEM_P (op0));
7231
7232 #ifdef POINTERS_EXTEND_UNSIGNED
7233             if (GET_MODE (offset_rtx) != Pmode)
7234               offset_rtx = convert_to_mode (Pmode, offset_rtx, 0);
7235 #else
7236             if (GET_MODE (offset_rtx) != ptr_mode)
7237               offset_rtx = convert_to_mode (ptr_mode, offset_rtx, 0);
7238 #endif
7239
7240             if (GET_MODE (op0) == BLKmode
7241                 /* A constant address in OP0 can have VOIDmode, we must
7242                    not try to call force_reg in that case.  */
7243                 && GET_MODE (XEXP (op0, 0)) != VOIDmode
7244                 && bitsize != 0
7245                 && (bitpos % bitsize) == 0
7246                 && (bitsize % GET_MODE_ALIGNMENT (mode1)) == 0
7247                 && MEM_ALIGN (op0) == GET_MODE_ALIGNMENT (mode1))
7248               {
7249                 op0 = adjust_address (op0, mode1, bitpos / BITS_PER_UNIT);
7250                 bitpos = 0;
7251               }
7252
7253             op0 = offset_address (op0, offset_rtx,
7254                                   highest_pow2_factor (offset));
7255           }
7256
7257         /* If OFFSET is making OP0 more aligned than BIGGEST_ALIGNMENT,
7258            record its alignment as BIGGEST_ALIGNMENT.  */
7259         if (MEM_P (op0) && bitpos == 0 && offset != 0
7260             && is_aligning_offset (offset, tem))
7261           set_mem_align (op0, BIGGEST_ALIGNMENT);
7262
7263         /* Don't forget about volatility even if this is a bitfield.  */
7264         if (MEM_P (op0) && volatilep && ! MEM_VOLATILE_P (op0))
7265           {
7266             if (op0 == orig_op0)
7267               op0 = copy_rtx (op0);
7268
7269             MEM_VOLATILE_P (op0) = 1;
7270           }
7271
7272         /* The following code doesn't handle CONCAT.
7273            Assume only bitpos == 0 can be used for CONCAT, due to
7274            one element arrays having the same mode as its element.  */
7275         if (GET_CODE (op0) == CONCAT)
7276           {
7277             gcc_assert (bitpos == 0
7278                         && bitsize == GET_MODE_BITSIZE (GET_MODE (op0)));
7279             return op0;
7280           }
7281
7282         /* In cases where an aligned union has an unaligned object
7283            as a field, we might be extracting a BLKmode value from
7284            an integer-mode (e.g., SImode) object.  Handle this case
7285            by doing the extract into an object as wide as the field
7286            (which we know to be the width of a basic mode), then
7287            storing into memory, and changing the mode to BLKmode.  */
7288         if (mode1 == VOIDmode
7289             || REG_P (op0) || GET_CODE (op0) == SUBREG
7290             || (mode1 != BLKmode && ! direct_load[(int) mode1]
7291                 && GET_MODE_CLASS (mode) != MODE_COMPLEX_INT
7292                 && GET_MODE_CLASS (mode) != MODE_COMPLEX_FLOAT
7293                 && modifier != EXPAND_CONST_ADDRESS
7294                 && modifier != EXPAND_INITIALIZER)
7295             /* If the field isn't aligned enough to fetch as a memref,
7296                fetch it as a bit field.  */
7297             || (mode1 != BLKmode
7298                 && (((TYPE_ALIGN (TREE_TYPE (tem)) < GET_MODE_ALIGNMENT (mode)
7299                       || (bitpos % GET_MODE_ALIGNMENT (mode) != 0)
7300                       || (MEM_P (op0)
7301                           && (MEM_ALIGN (op0) < GET_MODE_ALIGNMENT (mode1)
7302                               || (bitpos % GET_MODE_ALIGNMENT (mode1) != 0))))
7303                      && ((modifier == EXPAND_CONST_ADDRESS
7304                           || modifier == EXPAND_INITIALIZER)
7305                          ? STRICT_ALIGNMENT
7306                          : SLOW_UNALIGNED_ACCESS (mode1, MEM_ALIGN (op0))))
7307                     || (bitpos % BITS_PER_UNIT != 0)))
7308             /* If the type and the field are a constant size and the
7309                size of the type isn't the same size as the bitfield,
7310                we must use bitfield operations.  */
7311             || (bitsize >= 0
7312                 && TYPE_SIZE (TREE_TYPE (exp))
7313                 && TREE_CODE (TYPE_SIZE (TREE_TYPE (exp))) == INTEGER_CST
7314                 && 0 != compare_tree_int (TYPE_SIZE (TREE_TYPE (exp)),
7315                                           bitsize)))
7316           {
7317             enum machine_mode ext_mode = mode;
7318
7319             if (ext_mode == BLKmode
7320                 && ! (target != 0 && MEM_P (op0)
7321                       && MEM_P (target)
7322                       && bitpos % BITS_PER_UNIT == 0))
7323               ext_mode = mode_for_size (bitsize, MODE_INT, 1);
7324
7325             if (ext_mode == BLKmode)
7326               {
7327                 if (target == 0)
7328                   target = assign_temp (type, 0, 1, 1);
7329
7330                 if (bitsize == 0)
7331                   return target;
7332
7333                 /* In this case, BITPOS must start at a byte boundary and
7334                    TARGET, if specified, must be a MEM.  */
7335                 gcc_assert (MEM_P (op0)
7336                             && (!target || MEM_P (target))
7337                             && !(bitpos % BITS_PER_UNIT));
7338
7339                 emit_block_move (target,
7340                                  adjust_address (op0, VOIDmode,
7341                                                  bitpos / BITS_PER_UNIT),
7342                                  GEN_INT ((bitsize + BITS_PER_UNIT - 1)
7343                                           / BITS_PER_UNIT),
7344                                  (modifier == EXPAND_STACK_PARM
7345                                   ? BLOCK_OP_CALL_PARM : BLOCK_OP_NORMAL));
7346
7347                 return target;
7348               }
7349
7350             op0 = validize_mem (op0);
7351
7352             if (MEM_P (op0) && REG_P (XEXP (op0, 0)))
7353               mark_reg_pointer (XEXP (op0, 0), MEM_ALIGN (op0));
7354
7355             op0 = extract_bit_field (op0, bitsize, bitpos, unsignedp,
7356                                      (modifier == EXPAND_STACK_PARM
7357                                       ? NULL_RTX : target),
7358                                      ext_mode, ext_mode);
7359
7360             /* If the result is a record type and BITSIZE is narrower than
7361                the mode of OP0, an integral mode, and this is a big endian
7362                machine, we must put the field into the high-order bits.  */
7363             if (TREE_CODE (type) == RECORD_TYPE && BYTES_BIG_ENDIAN
7364                 && GET_MODE_CLASS (GET_MODE (op0)) == MODE_INT
7365                 && bitsize < (HOST_WIDE_INT) GET_MODE_BITSIZE (GET_MODE (op0)))
7366               op0 = expand_shift (LSHIFT_EXPR, GET_MODE (op0), op0,
7367                                   size_int (GET_MODE_BITSIZE (GET_MODE (op0))
7368                                             - bitsize),
7369                                   op0, 1);
7370
7371             /* If the result type is BLKmode, store the data into a temporary
7372                of the appropriate type, but with the mode corresponding to the
7373                mode for the data we have (op0's mode).  It's tempting to make
7374                this a constant type, since we know it's only being stored once,
7375                but that can cause problems if we are taking the address of this
7376                COMPONENT_REF because the MEM of any reference via that address
7377                will have flags corresponding to the type, which will not
7378                necessarily be constant.  */
7379             if (mode == BLKmode)
7380               {
7381                 rtx new
7382                   = assign_stack_temp_for_type
7383                     (ext_mode, GET_MODE_BITSIZE (ext_mode), 0, type);
7384
7385                 emit_move_insn (new, op0);
7386                 op0 = copy_rtx (new);
7387                 PUT_MODE (op0, BLKmode);
7388                 set_mem_attributes (op0, exp, 1);
7389               }
7390
7391             return op0;
7392           }
7393
7394         /* If the result is BLKmode, use that to access the object
7395            now as well.  */
7396         if (mode == BLKmode)
7397           mode1 = BLKmode;
7398
7399         /* Get a reference to just this component.  */
7400         if (modifier == EXPAND_CONST_ADDRESS
7401             || modifier == EXPAND_SUM || modifier == EXPAND_INITIALIZER)
7402           op0 = adjust_address_nv (op0, mode1, bitpos / BITS_PER_UNIT);
7403         else
7404           op0 = adjust_address (op0, mode1, bitpos / BITS_PER_UNIT);
7405
7406         if (op0 == orig_op0)
7407           op0 = copy_rtx (op0);
7408
7409         set_mem_attributes (op0, exp, 0);
7410         if (REG_P (XEXP (op0, 0)))
7411           mark_reg_pointer (XEXP (op0, 0), MEM_ALIGN (op0));
7412
7413         MEM_VOLATILE_P (op0) |= volatilep;
7414         if (mode == mode1 || mode1 == BLKmode || mode1 == tmode
7415             || modifier == EXPAND_CONST_ADDRESS
7416             || modifier == EXPAND_INITIALIZER)
7417           return op0;
7418         else if (target == 0)
7419           target = gen_reg_rtx (tmode != VOIDmode ? tmode : mode);
7420
7421         convert_move (target, op0, unsignedp);
7422         return target;
7423       }
7424
7425     case OBJ_TYPE_REF:
7426       return expand_expr (OBJ_TYPE_REF_EXPR (exp), target, tmode, modifier);
7427
7428     case CALL_EXPR:
7429       /* Check for a built-in function.  */
7430       if (TREE_CODE (TREE_OPERAND (exp, 0)) == ADDR_EXPR
7431           && (TREE_CODE (TREE_OPERAND (TREE_OPERAND (exp, 0), 0))
7432               == FUNCTION_DECL)
7433           && DECL_BUILT_IN (TREE_OPERAND (TREE_OPERAND (exp, 0), 0)))
7434         {
7435           if (DECL_BUILT_IN_CLASS (TREE_OPERAND (TREE_OPERAND (exp, 0), 0))
7436               == BUILT_IN_FRONTEND)
7437             return lang_hooks.expand_expr (exp, original_target,
7438                                            tmode, modifier,
7439                                            alt_rtl);
7440           else
7441             return expand_builtin (exp, target, subtarget, tmode, ignore);
7442         }
7443
7444       return expand_call (exp, target, ignore);
7445
7446     case NON_LVALUE_EXPR:
7447     case NOP_EXPR:
7448     case CONVERT_EXPR:
7449       if (TREE_OPERAND (exp, 0) == error_mark_node)
7450         return const0_rtx;
7451
7452       if (TREE_CODE (type) == UNION_TYPE)
7453         {
7454           tree valtype = TREE_TYPE (TREE_OPERAND (exp, 0));
7455
7456           /* If both input and output are BLKmode, this conversion isn't doing
7457              anything except possibly changing memory attribute.  */
7458           if (mode == BLKmode && TYPE_MODE (valtype) == BLKmode)
7459             {
7460               rtx result = expand_expr (TREE_OPERAND (exp, 0), target, tmode,
7461                                         modifier);
7462
7463               result = copy_rtx (result);
7464               set_mem_attributes (result, exp, 0);
7465               return result;
7466             }
7467
7468           if (target == 0)
7469             {
7470               if (TYPE_MODE (type) != BLKmode)
7471                 target = gen_reg_rtx (TYPE_MODE (type));
7472               else
7473                 target = assign_temp (type, 0, 1, 1);
7474             }
7475
7476           if (MEM_P (target))
7477             /* Store data into beginning of memory target.  */
7478             store_expr (TREE_OPERAND (exp, 0),
7479                         adjust_address (target, TYPE_MODE (valtype), 0),
7480                         modifier == EXPAND_STACK_PARM);
7481
7482           else
7483             {
7484               gcc_assert (REG_P (target));
7485               
7486               /* Store this field into a union of the proper type.  */
7487               store_field (target,
7488                            MIN ((int_size_in_bytes (TREE_TYPE
7489                                                     (TREE_OPERAND (exp, 0)))
7490                                  * BITS_PER_UNIT),
7491                                 (HOST_WIDE_INT) GET_MODE_BITSIZE (mode)),
7492                            0, TYPE_MODE (valtype), TREE_OPERAND (exp, 0),
7493                            type, 0);
7494             }
7495
7496           /* Return the entire union.  */
7497           return target;
7498         }
7499
7500       if (mode == TYPE_MODE (TREE_TYPE (TREE_OPERAND (exp, 0))))
7501         {
7502           op0 = expand_expr (TREE_OPERAND (exp, 0), target, VOIDmode,
7503                              modifier);
7504
7505           /* If the signedness of the conversion differs and OP0 is
7506              a promoted SUBREG, clear that indication since we now
7507              have to do the proper extension.  */
7508           if (TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (exp, 0))) != unsignedp
7509               && GET_CODE (op0) == SUBREG)
7510             SUBREG_PROMOTED_VAR_P (op0) = 0;
7511
7512           return REDUCE_BIT_FIELD (op0);
7513         }
7514
7515       op0 = expand_expr (TREE_OPERAND (exp, 0), NULL_RTX, mode, modifier);
7516       if (GET_MODE (op0) == mode)
7517         ;
7518
7519       /* If OP0 is a constant, just convert it into the proper mode.  */
7520       else if (CONSTANT_P (op0))
7521         {
7522           tree inner_type = TREE_TYPE (TREE_OPERAND (exp, 0));
7523           enum machine_mode inner_mode = TYPE_MODE (inner_type);
7524
7525           if (modifier == EXPAND_INITIALIZER)
7526             op0 = simplify_gen_subreg (mode, op0, inner_mode,
7527                                        subreg_lowpart_offset (mode,
7528                                                               inner_mode));
7529           else
7530             op0=  convert_modes (mode, inner_mode, op0,
7531                                  TYPE_UNSIGNED (inner_type));
7532         }
7533
7534       else if (modifier == EXPAND_INITIALIZER)
7535         op0 = gen_rtx_fmt_e (unsignedp ? ZERO_EXTEND : SIGN_EXTEND, mode, op0);
7536
7537       else if (target == 0)
7538         op0 = convert_to_mode (mode, op0,
7539                                TYPE_UNSIGNED (TREE_TYPE
7540                                               (TREE_OPERAND (exp, 0))));
7541       else
7542         {
7543           convert_move (target, op0,
7544                         TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (exp, 0))));
7545           op0 = target;
7546         }
7547
7548       return REDUCE_BIT_FIELD (op0);
7549
7550     case VIEW_CONVERT_EXPR:
7551       op0 = expand_expr (TREE_OPERAND (exp, 0), NULL_RTX, mode, modifier);
7552
7553       /* If the input and output modes are both the same, we are done.  */
7554       if (TYPE_MODE (type) == GET_MODE (op0))
7555         ;
7556       /* If neither mode is BLKmode, and both modes are the same size
7557          then we can use gen_lowpart.  */
7558       else if (TYPE_MODE (type) != BLKmode && GET_MODE (op0) != BLKmode
7559                && GET_MODE_SIZE (TYPE_MODE (type))
7560                    == GET_MODE_SIZE (GET_MODE (op0)))
7561         {
7562           if (GET_CODE (op0) == SUBREG)
7563             op0 = force_reg (GET_MODE (op0), op0);
7564           op0 = gen_lowpart (TYPE_MODE (type), op0);
7565         }
7566       /* If both modes are integral, then we can convert from one to the
7567          other.  */
7568       else if (SCALAR_INT_MODE_P (GET_MODE (op0))
7569                && SCALAR_INT_MODE_P (TYPE_MODE (type)))
7570         op0 = convert_modes (TYPE_MODE (type), GET_MODE (op0), op0, 
7571                              TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (exp, 0))));
7572       /* As a last resort, spill op0 to memory, and reload it in a 
7573          different mode.  */
7574       else if (!MEM_P (op0))
7575         {
7576           /* If the operand is not a MEM, force it into memory.  Since we
7577              are going to be be changing the mode of the MEM, don't call
7578              force_const_mem for constants because we don't allow pool
7579              constants to change mode.  */
7580           tree inner_type = TREE_TYPE (TREE_OPERAND (exp, 0));
7581
7582           gcc_assert (!TREE_ADDRESSABLE (exp));
7583
7584           if (target == 0 || GET_MODE (target) != TYPE_MODE (inner_type))
7585             target
7586               = assign_stack_temp_for_type
7587                 (TYPE_MODE (inner_type),
7588                  GET_MODE_SIZE (TYPE_MODE (inner_type)), 0, inner_type);
7589
7590           emit_move_insn (target, op0);
7591           op0 = target;
7592         }
7593
7594       /* At this point, OP0 is in the correct mode.  If the output type is such
7595          that the operand is known to be aligned, indicate that it is.
7596          Otherwise, we need only be concerned about alignment for non-BLKmode
7597          results.  */
7598       if (MEM_P (op0))
7599         {
7600           op0 = copy_rtx (op0);
7601
7602           if (TYPE_ALIGN_OK (type))
7603             set_mem_align (op0, MAX (MEM_ALIGN (op0), TYPE_ALIGN (type)));
7604           else if (TYPE_MODE (type) != BLKmode && STRICT_ALIGNMENT
7605                    && MEM_ALIGN (op0) < GET_MODE_ALIGNMENT (TYPE_MODE (type)))
7606             {
7607               tree inner_type = TREE_TYPE (TREE_OPERAND (exp, 0));
7608               HOST_WIDE_INT temp_size
7609                 = MAX (int_size_in_bytes (inner_type),
7610                        (HOST_WIDE_INT) GET_MODE_SIZE (TYPE_MODE (type)));
7611               rtx new = assign_stack_temp_for_type (TYPE_MODE (type),
7612                                                     temp_size, 0, type);
7613               rtx new_with_op0_mode = adjust_address (new, GET_MODE (op0), 0);
7614
7615               gcc_assert (!TREE_ADDRESSABLE (exp));
7616
7617               if (GET_MODE (op0) == BLKmode)
7618                 emit_block_move (new_with_op0_mode, op0,
7619                                  GEN_INT (GET_MODE_SIZE (TYPE_MODE (type))),
7620                                  (modifier == EXPAND_STACK_PARM
7621                                   ? BLOCK_OP_CALL_PARM : BLOCK_OP_NORMAL));
7622               else
7623                 emit_move_insn (new_with_op0_mode, op0);
7624
7625               op0 = new;
7626             }
7627
7628           op0 = adjust_address (op0, TYPE_MODE (type), 0);
7629         }
7630
7631       return op0;
7632
7633     case PLUS_EXPR:
7634       /* If we are adding a constant, a VAR_DECL that is sp, fp, or ap, and
7635          something else, make sure we add the register to the constant and
7636          then to the other thing.  This case can occur during strength
7637          reduction and doing it this way will produce better code if the
7638          frame pointer or argument pointer is eliminated.
7639
7640          fold-const.c will ensure that the constant is always in the inner
7641          PLUS_EXPR, so the only case we need to do anything about is if
7642          sp, ap, or fp is our second argument, in which case we must swap
7643          the innermost first argument and our second argument.  */
7644
7645       if (TREE_CODE (TREE_OPERAND (exp, 0)) == PLUS_EXPR
7646           && TREE_CODE (TREE_OPERAND (TREE_OPERAND (exp, 0), 1)) == INTEGER_CST
7647           && TREE_CODE (TREE_OPERAND (exp, 1)) == VAR_DECL
7648           && (DECL_RTL (TREE_OPERAND (exp, 1)) == frame_pointer_rtx
7649               || DECL_RTL (TREE_OPERAND (exp, 1)) == stack_pointer_rtx
7650               || DECL_RTL (TREE_OPERAND (exp, 1)) == arg_pointer_rtx))
7651         {
7652           tree t = TREE_OPERAND (exp, 1);
7653
7654           TREE_OPERAND (exp, 1) = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
7655           TREE_OPERAND (TREE_OPERAND (exp, 0), 0) = t;
7656         }
7657
7658       /* If the result is to be ptr_mode and we are adding an integer to
7659          something, we might be forming a constant.  So try to use
7660          plus_constant.  If it produces a sum and we can't accept it,
7661          use force_operand.  This allows P = &ARR[const] to generate
7662          efficient code on machines where a SYMBOL_REF is not a valid
7663          address.
7664
7665          If this is an EXPAND_SUM call, always return the sum.  */
7666       if (modifier == EXPAND_SUM || modifier == EXPAND_INITIALIZER
7667           || (mode == ptr_mode && (unsignedp || ! flag_trapv)))
7668         {
7669           if (modifier == EXPAND_STACK_PARM)
7670             target = 0;
7671           if (TREE_CODE (TREE_OPERAND (exp, 0)) == INTEGER_CST
7672               && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
7673               && TREE_CONSTANT (TREE_OPERAND (exp, 1)))
7674             {
7675               rtx constant_part;
7676
7677               op1 = expand_expr (TREE_OPERAND (exp, 1), subtarget, VOIDmode,
7678                                  EXPAND_SUM);
7679               /* Use immed_double_const to ensure that the constant is
7680                  truncated according to the mode of OP1, then sign extended
7681                  to a HOST_WIDE_INT.  Using the constant directly can result
7682                  in non-canonical RTL in a 64x32 cross compile.  */
7683               constant_part
7684                 = immed_double_const (TREE_INT_CST_LOW (TREE_OPERAND (exp, 0)),
7685                                       (HOST_WIDE_INT) 0,
7686                                       TYPE_MODE (TREE_TYPE (TREE_OPERAND (exp, 1))));
7687               op1 = plus_constant (op1, INTVAL (constant_part));
7688               if (modifier != EXPAND_SUM && modifier != EXPAND_INITIALIZER)
7689                 op1 = force_operand (op1, target);
7690               return REDUCE_BIT_FIELD (op1);
7691             }
7692
7693           else if (TREE_CODE (TREE_OPERAND (exp, 1)) == INTEGER_CST
7694                    && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
7695                    && TREE_CONSTANT (TREE_OPERAND (exp, 0)))
7696             {
7697               rtx constant_part;
7698
7699               op0 = expand_expr (TREE_OPERAND (exp, 0), subtarget, VOIDmode,
7700                                  (modifier == EXPAND_INITIALIZER
7701                                  ? EXPAND_INITIALIZER : EXPAND_SUM));
7702               if (! CONSTANT_P (op0))
7703                 {
7704                   op1 = expand_expr (TREE_OPERAND (exp, 1), NULL_RTX,
7705                                      VOIDmode, modifier);
7706                   /* Return a PLUS if modifier says it's OK.  */
7707                   if (modifier == EXPAND_SUM
7708                       || modifier == EXPAND_INITIALIZER)
7709                     return simplify_gen_binary (PLUS, mode, op0, op1);
7710                   goto binop2;
7711                 }
7712               /* Use immed_double_const to ensure that the constant is
7713                  truncated according to the mode of OP1, then sign extended
7714                  to a HOST_WIDE_INT.  Using the constant directly can result
7715                  in non-canonical RTL in a 64x32 cross compile.  */
7716               constant_part
7717                 = immed_double_const (TREE_INT_CST_LOW (TREE_OPERAND (exp, 1)),
7718                                       (HOST_WIDE_INT) 0,
7719                                       TYPE_MODE (TREE_TYPE (TREE_OPERAND (exp, 0))));
7720               op0 = plus_constant (op0, INTVAL (constant_part));
7721               if (modifier != EXPAND_SUM && modifier != EXPAND_INITIALIZER)
7722                 op0 = force_operand (op0, target);
7723               return REDUCE_BIT_FIELD (op0);
7724             }
7725         }
7726
7727       /* No sense saving up arithmetic to be done
7728          if it's all in the wrong mode to form part of an address.
7729          And force_operand won't know whether to sign-extend or
7730          zero-extend.  */
7731       if ((modifier != EXPAND_SUM && modifier != EXPAND_INITIALIZER)
7732           || mode != ptr_mode)
7733         {
7734           expand_operands (TREE_OPERAND (exp, 0), TREE_OPERAND (exp, 1),
7735                            subtarget, &op0, &op1, 0);
7736           if (op0 == const0_rtx)
7737             return op1;
7738           if (op1 == const0_rtx)
7739             return op0;
7740           goto binop2;
7741         }
7742
7743       expand_operands (TREE_OPERAND (exp, 0), TREE_OPERAND (exp, 1),
7744                        subtarget, &op0, &op1, modifier);
7745       return REDUCE_BIT_FIELD (simplify_gen_binary (PLUS, mode, op0, op1));
7746
7747     case MINUS_EXPR:
7748       /* For initializers, we are allowed to return a MINUS of two
7749          symbolic constants.  Here we handle all cases when both operands
7750          are constant.  */
7751       /* Handle difference of two symbolic constants,
7752          for the sake of an initializer.  */
7753       if ((modifier == EXPAND_SUM || modifier == EXPAND_INITIALIZER)
7754           && really_constant_p (TREE_OPERAND (exp, 0))
7755           && really_constant_p (TREE_OPERAND (exp, 1)))
7756         {
7757           expand_operands (TREE_OPERAND (exp, 0), TREE_OPERAND (exp, 1),
7758                            NULL_RTX, &op0, &op1, modifier);
7759
7760           /* If the last operand is a CONST_INT, use plus_constant of
7761              the negated constant.  Else make the MINUS.  */
7762           if (GET_CODE (op1) == CONST_INT)
7763             return REDUCE_BIT_FIELD (plus_constant (op0, - INTVAL (op1)));
7764           else
7765             return REDUCE_BIT_FIELD (gen_rtx_MINUS (mode, op0, op1));
7766         }
7767
7768       /* No sense saving up arithmetic to be done
7769          if it's all in the wrong mode to form part of an address.
7770          And force_operand won't know whether to sign-extend or
7771          zero-extend.  */
7772       if ((modifier != EXPAND_SUM && modifier != EXPAND_INITIALIZER)
7773           || mode != ptr_mode)
7774         goto binop;
7775
7776       expand_operands (TREE_OPERAND (exp, 0), TREE_OPERAND (exp, 1),
7777                        subtarget, &op0, &op1, modifier);
7778
7779       /* Convert A - const to A + (-const).  */
7780       if (GET_CODE (op1) == CONST_INT)
7781         {
7782           op1 = negate_rtx (mode, op1);
7783           return REDUCE_BIT_FIELD (simplify_gen_binary (PLUS, mode, op0, op1));
7784         }
7785
7786       goto binop2;
7787
7788     case MULT_EXPR:
7789       /* If first operand is constant, swap them.
7790          Thus the following special case checks need only
7791          check the second operand.  */
7792       if (TREE_CODE (TREE_OPERAND (exp, 0)) == INTEGER_CST)
7793         {
7794           tree t1 = TREE_OPERAND (exp, 0);
7795           TREE_OPERAND (exp, 0) = TREE_OPERAND (exp, 1);
7796           TREE_OPERAND (exp, 1) = t1;
7797         }
7798
7799       /* Attempt to return something suitable for generating an
7800          indexed address, for machines that support that.  */
7801
7802       if (modifier == EXPAND_SUM && mode == ptr_mode
7803           && host_integerp (TREE_OPERAND (exp, 1), 0))
7804         {
7805           tree exp1 = TREE_OPERAND (exp, 1);
7806
7807           op0 = expand_expr (TREE_OPERAND (exp, 0), subtarget, VOIDmode,
7808                              EXPAND_SUM);
7809
7810           if (!REG_P (op0))
7811             op0 = force_operand (op0, NULL_RTX);
7812           if (!REG_P (op0))
7813             op0 = copy_to_mode_reg (mode, op0);
7814
7815           return REDUCE_BIT_FIELD (gen_rtx_MULT (mode, op0,
7816                                gen_int_mode (tree_low_cst (exp1, 0),
7817                                              TYPE_MODE (TREE_TYPE (exp1)))));
7818         }
7819
7820       if (modifier == EXPAND_STACK_PARM)
7821         target = 0;
7822
7823       /* Check for multiplying things that have been extended
7824          from a narrower type.  If this machine supports multiplying
7825          in that narrower type with a result in the desired type,
7826          do it that way, and avoid the explicit type-conversion.  */
7827
7828       subexp0 = TREE_OPERAND (exp, 0);
7829       subexp1 = TREE_OPERAND (exp, 1);
7830       /* First, check if we have a multiplication of one signed and one
7831          unsigned operand.  */
7832       if (TREE_CODE (subexp0) == NOP_EXPR
7833           && TREE_CODE (subexp1) == NOP_EXPR
7834           && TREE_CODE (type) == INTEGER_TYPE
7835           && (TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (subexp0, 0)))
7836               < TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (exp, 0))))
7837           && (TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (subexp0, 0)))
7838               == TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (subexp1, 0))))
7839           && (TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (subexp0, 0)))
7840               != TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (subexp1, 0)))))
7841         {
7842           enum machine_mode innermode
7843             = TYPE_MODE (TREE_TYPE (TREE_OPERAND (subexp0, 0)));
7844           this_optab = usmul_widen_optab;
7845           if (mode == GET_MODE_WIDER_MODE (innermode))
7846             {
7847               if (this_optab->handlers[(int) mode].insn_code != CODE_FOR_nothing)
7848                 {
7849                   if (TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (subexp0, 0))))
7850                     expand_operands (TREE_OPERAND (subexp0, 0),
7851                                      TREE_OPERAND (subexp1, 0),
7852                                      NULL_RTX, &op0, &op1, 0);
7853                   else
7854                     expand_operands (TREE_OPERAND (subexp0, 0),
7855                                      TREE_OPERAND (subexp1, 0),
7856                                      NULL_RTX, &op1, &op0, 0);
7857
7858                   goto binop2;
7859                 }
7860             }
7861         }
7862       /* Check for a multiplication with matching signedness.  */
7863       else if (TREE_CODE (TREE_OPERAND (exp, 0)) == NOP_EXPR
7864           && TREE_CODE (type) == INTEGER_TYPE
7865           && (TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (exp, 0), 0)))
7866               < TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (exp, 0))))
7867           && ((TREE_CODE (TREE_OPERAND (exp, 1)) == INTEGER_CST
7868                && int_fits_type_p (TREE_OPERAND (exp, 1),
7869                                    TREE_TYPE (TREE_OPERAND (TREE_OPERAND (exp, 0), 0)))
7870                /* Don't use a widening multiply if a shift will do.  */
7871                && ((GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (TREE_OPERAND (exp, 1))))
7872                     > HOST_BITS_PER_WIDE_INT)
7873                    || exact_log2 (TREE_INT_CST_LOW (TREE_OPERAND (exp, 1))) < 0))
7874               ||
7875               (TREE_CODE (TREE_OPERAND (exp, 1)) == NOP_EXPR
7876                && (TYPE_PRECISION (TREE_TYPE
7877                                    (TREE_OPERAND (TREE_OPERAND (exp, 1), 0)))
7878                    == TYPE_PRECISION (TREE_TYPE
7879                                       (TREE_OPERAND
7880                                        (TREE_OPERAND (exp, 0), 0))))
7881                /* If both operands are extended, they must either both
7882                   be zero-extended or both be sign-extended.  */
7883                && (TYPE_UNSIGNED (TREE_TYPE
7884                                   (TREE_OPERAND (TREE_OPERAND (exp, 1), 0)))
7885                    == TYPE_UNSIGNED (TREE_TYPE
7886                                      (TREE_OPERAND
7887                                       (TREE_OPERAND (exp, 0), 0)))))))
7888         {
7889           tree op0type = TREE_TYPE (TREE_OPERAND (TREE_OPERAND (exp, 0), 0));
7890           enum machine_mode innermode = TYPE_MODE (op0type);
7891           bool zextend_p = TYPE_UNSIGNED (op0type);
7892           optab other_optab = zextend_p ? smul_widen_optab : umul_widen_optab;
7893           this_optab = zextend_p ? umul_widen_optab : smul_widen_optab;
7894
7895           if (mode == GET_MODE_2XWIDER_MODE (innermode))
7896             {
7897               if (this_optab->handlers[(int) mode].insn_code != CODE_FOR_nothing)
7898                 {
7899                   if (TREE_CODE (TREE_OPERAND (exp, 1)) == INTEGER_CST)
7900                     expand_operands (TREE_OPERAND (TREE_OPERAND (exp, 0), 0),
7901                                      TREE_OPERAND (exp, 1),
7902                                      NULL_RTX, &op0, &op1, 0);
7903                   else
7904                     expand_operands (TREE_OPERAND (TREE_OPERAND (exp, 0), 0),
7905                                      TREE_OPERAND (TREE_OPERAND (exp, 1), 0),
7906                                      NULL_RTX, &op0, &op1, 0);
7907                   goto binop3;
7908                 }
7909               else if (other_optab->handlers[(int) mode].insn_code != CODE_FOR_nothing
7910                        && innermode == word_mode)
7911                 {
7912                   rtx htem, hipart;
7913                   op0 = expand_expr (TREE_OPERAND (TREE_OPERAND (exp, 0), 0),
7914                                      NULL_RTX, VOIDmode, 0);
7915                   if (TREE_CODE (TREE_OPERAND (exp, 1)) == INTEGER_CST)
7916                     op1 = convert_modes (innermode, mode,
7917                                          expand_expr (TREE_OPERAND (exp, 1),
7918                                                       NULL_RTX, VOIDmode, 0),
7919                                          unsignedp);
7920                   else
7921                     op1 = expand_expr (TREE_OPERAND (TREE_OPERAND (exp, 1), 0),
7922                                        NULL_RTX, VOIDmode, 0);
7923                   temp = expand_binop (mode, other_optab, op0, op1, target,
7924                                        unsignedp, OPTAB_LIB_WIDEN);
7925                   hipart = gen_highpart (innermode, temp);
7926                   htem = expand_mult_highpart_adjust (innermode, hipart,
7927                                                       op0, op1, hipart,
7928                                                       zextend_p);
7929                   if (htem != hipart)
7930                     emit_move_insn (hipart, htem);
7931                   return REDUCE_BIT_FIELD (temp);
7932                 }
7933             }
7934         }
7935       expand_operands (TREE_OPERAND (exp, 0), TREE_OPERAND (exp, 1),
7936                        subtarget, &op0, &op1, 0);
7937       return REDUCE_BIT_FIELD (expand_mult (mode, op0, op1, target, unsignedp));
7938
7939     case TRUNC_DIV_EXPR:
7940     case FLOOR_DIV_EXPR:
7941     case CEIL_DIV_EXPR:
7942     case ROUND_DIV_EXPR:
7943     case EXACT_DIV_EXPR:
7944       if (modifier == EXPAND_STACK_PARM)
7945         target = 0;
7946       /* Possible optimization: compute the dividend with EXPAND_SUM
7947          then if the divisor is constant can optimize the case
7948          where some terms of the dividend have coeffs divisible by it.  */
7949       expand_operands (TREE_OPERAND (exp, 0), TREE_OPERAND (exp, 1),
7950                        subtarget, &op0, &op1, 0);
7951       return expand_divmod (0, code, mode, op0, op1, target, unsignedp);
7952
7953     case RDIV_EXPR:
7954       goto binop;
7955
7956     case TRUNC_MOD_EXPR:
7957     case FLOOR_MOD_EXPR:
7958     case CEIL_MOD_EXPR:
7959     case ROUND_MOD_EXPR:
7960       if (modifier == EXPAND_STACK_PARM)
7961         target = 0;
7962       expand_operands (TREE_OPERAND (exp, 0), TREE_OPERAND (exp, 1),
7963                        subtarget, &op0, &op1, 0);
7964       return expand_divmod (1, code, mode, op0, op1, target, unsignedp);
7965
7966     case FIX_ROUND_EXPR:
7967     case FIX_FLOOR_EXPR:
7968     case FIX_CEIL_EXPR:
7969       gcc_unreachable ();                       /* Not used for C.  */
7970
7971     case FIX_TRUNC_EXPR:
7972       op0 = expand_expr (TREE_OPERAND (exp, 0), NULL_RTX, VOIDmode, 0);
7973       if (target == 0 || modifier == EXPAND_STACK_PARM)
7974         target = gen_reg_rtx (mode);
7975       expand_fix (target, op0, unsignedp);
7976       return target;
7977
7978     case FLOAT_EXPR:
7979       op0 = expand_expr (TREE_OPERAND (exp, 0), NULL_RTX, VOIDmode, 0);
7980       if (target == 0 || modifier == EXPAND_STACK_PARM)
7981         target = gen_reg_rtx (mode);
7982       /* expand_float can't figure out what to do if FROM has VOIDmode.
7983          So give it the correct mode.  With -O, cse will optimize this.  */
7984       if (GET_MODE (op0) == VOIDmode)
7985         op0 = copy_to_mode_reg (TYPE_MODE (TREE_TYPE (TREE_OPERAND (exp, 0))),
7986                                 op0);
7987       expand_float (target, op0,
7988                     TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (exp, 0))));
7989       return target;
7990
7991     case NEGATE_EXPR:
7992       op0 = expand_expr (TREE_OPERAND (exp, 0), subtarget, VOIDmode, 0);
7993       if (modifier == EXPAND_STACK_PARM)
7994         target = 0;
7995       temp = expand_unop (mode,
7996                           optab_for_tree_code (NEGATE_EXPR, type),
7997                           op0, target, 0);
7998       gcc_assert (temp);
7999       return REDUCE_BIT_FIELD (temp);
8000
8001     case ABS_EXPR:
8002       op0 = expand_expr (TREE_OPERAND (exp, 0), subtarget, VOIDmode, 0);
8003       if (modifier == EXPAND_STACK_PARM)
8004         target = 0;
8005
8006       /* ABS_EXPR is not valid for complex arguments.  */
8007       gcc_assert (GET_MODE_CLASS (mode) != MODE_COMPLEX_INT
8008                   && GET_MODE_CLASS (mode) != MODE_COMPLEX_FLOAT);
8009
8010       /* Unsigned abs is simply the operand.  Testing here means we don't
8011          risk generating incorrect code below.  */
8012       if (TYPE_UNSIGNED (type))
8013         return op0;
8014
8015       return expand_abs (mode, op0, target, unsignedp,
8016                          safe_from_p (target, TREE_OPERAND (exp, 0), 1));
8017
8018     case MAX_EXPR:
8019     case MIN_EXPR:
8020       target = original_target;
8021       if (target == 0
8022           || modifier == EXPAND_STACK_PARM
8023           || (MEM_P (target) && MEM_VOLATILE_P (target))
8024           || GET_MODE (target) != mode
8025           || (REG_P (target)
8026               && REGNO (target) < FIRST_PSEUDO_REGISTER))
8027         target = gen_reg_rtx (mode);
8028       expand_operands (TREE_OPERAND (exp, 0), TREE_OPERAND (exp, 1),
8029                        target, &op0, &op1, 0);
8030
8031       /* First try to do it with a special MIN or MAX instruction.
8032          If that does not win, use a conditional jump to select the proper
8033          value.  */
8034       this_optab = optab_for_tree_code (code, type);
8035       temp = expand_binop (mode, this_optab, op0, op1, target, unsignedp,
8036                            OPTAB_WIDEN);
8037       if (temp != 0)
8038         return temp;
8039
8040       /* At this point, a MEM target is no longer useful; we will get better
8041          code without it.  */
8042
8043       if (! REG_P (target))
8044         target = gen_reg_rtx (mode);
8045
8046       /* If op1 was placed in target, swap op0 and op1.  */
8047       if (target != op0 && target == op1)
8048         {
8049           temp = op0;
8050           op0 = op1;
8051           op1 = temp;
8052         }
8053
8054       /* We generate better code and avoid problems with op1 mentioning
8055          target by forcing op1 into a pseudo if it isn't a constant.  */
8056       if (! CONSTANT_P (op1))
8057         op1 = force_reg (mode, op1);
8058
8059       {
8060         enum rtx_code comparison_code;
8061         rtx cmpop1 = op1;
8062
8063         if (code == MAX_EXPR)
8064           comparison_code = unsignedp ? GEU : GE;
8065         else
8066           comparison_code = unsignedp ? LEU : LE;
8067
8068         /* Canonicalize to comparsions against 0.  */
8069         if (op1 == const1_rtx)
8070           {
8071             /* Converting (a >= 1 ? a : 1) into (a > 0 ? a : 1)
8072                or (a != 0 ? a : 1) for unsigned.
8073                For MIN we are safe converting (a <= 1 ? a : 1)
8074                into (a <= 0 ? a : 1)  */
8075             cmpop1 = const0_rtx;
8076             if (code == MAX_EXPR)
8077               comparison_code = unsignedp ? NE : GT;
8078           }
8079         if (op1 == constm1_rtx && !unsignedp)
8080           {
8081             /* Converting (a >= -1 ? a : -1) into (a >= 0 ? a : -1)
8082                and (a <= -1 ? a : -1) into (a < 0 ? a : -1) */
8083             cmpop1 = const0_rtx;
8084             if (code == MIN_EXPR)
8085               comparison_code = LT;
8086           }
8087 #ifdef HAVE_conditional_move
8088         /* Use a conditional move if possible.  */
8089         if (can_conditionally_move_p (mode))
8090           {
8091             rtx insn;
8092
8093             /* ??? Same problem as in expmed.c: emit_conditional_move
8094                forces a stack adjustment via compare_from_rtx, and we
8095                lose the stack adjustment if the sequence we are about
8096                to create is discarded.  */
8097             do_pending_stack_adjust ();
8098
8099             start_sequence ();
8100
8101             /* Try to emit the conditional move.  */
8102             insn = emit_conditional_move (target, comparison_code,
8103                                           op0, cmpop1, mode,
8104                                           op0, op1, mode,
8105                                           unsignedp);
8106
8107             /* If we could do the conditional move, emit the sequence,
8108                and return.  */
8109             if (insn)
8110               {
8111                 rtx seq = get_insns ();
8112                 end_sequence ();
8113                 emit_insn (seq);
8114                 return target;
8115               }
8116
8117             /* Otherwise discard the sequence and fall back to code with
8118                branches.  */
8119             end_sequence ();
8120           }
8121 #endif
8122         if (target != op0)
8123           emit_move_insn (target, op0);
8124
8125         temp = gen_label_rtx ();
8126
8127         /* If this mode is an integer too wide to compare properly,
8128            compare word by word.  Rely on cse to optimize constant cases.  */
8129         if (GET_MODE_CLASS (mode) == MODE_INT
8130             && ! can_compare_p (GE, mode, ccp_jump))
8131           {
8132             if (code == MAX_EXPR)
8133               do_jump_by_parts_greater_rtx (mode, unsignedp, target, op1,
8134                                             NULL_RTX, temp);
8135             else
8136               do_jump_by_parts_greater_rtx (mode, unsignedp, op1, target,
8137                                             NULL_RTX, temp);
8138           }
8139         else
8140           {
8141             do_compare_rtx_and_jump (target, cmpop1, comparison_code,
8142                                      unsignedp, mode, NULL_RTX, NULL_RTX, temp);
8143           }
8144       }
8145       emit_move_insn (target, op1);
8146       emit_label (temp);
8147       return target;
8148
8149     case BIT_NOT_EXPR:
8150       op0 = expand_expr (TREE_OPERAND (exp, 0), subtarget, VOIDmode, 0);
8151       if (modifier == EXPAND_STACK_PARM)
8152         target = 0;
8153       temp = expand_unop (mode, one_cmpl_optab, op0, target, 1);
8154       gcc_assert (temp);
8155       return temp;
8156
8157       /* ??? Can optimize bitwise operations with one arg constant.
8158          Can optimize (a bitwise1 n) bitwise2 (a bitwise3 b)
8159          and (a bitwise1 b) bitwise2 b (etc)
8160          but that is probably not worth while.  */
8161
8162       /* BIT_AND_EXPR is for bitwise anding.  TRUTH_AND_EXPR is for anding two
8163          boolean values when we want in all cases to compute both of them.  In
8164          general it is fastest to do TRUTH_AND_EXPR by computing both operands
8165          as actual zero-or-1 values and then bitwise anding.  In cases where
8166          there cannot be any side effects, better code would be made by
8167          treating TRUTH_AND_EXPR like TRUTH_ANDIF_EXPR; but the question is
8168          how to recognize those cases.  */
8169
8170     case TRUTH_AND_EXPR:
8171       code = BIT_AND_EXPR;
8172     case BIT_AND_EXPR:
8173       goto binop;
8174
8175     case TRUTH_OR_EXPR:
8176       code = BIT_IOR_EXPR;
8177     case BIT_IOR_EXPR:
8178       goto binop;
8179
8180     case TRUTH_XOR_EXPR:
8181       code = BIT_XOR_EXPR;
8182     case BIT_XOR_EXPR:
8183       goto binop;
8184
8185     case LSHIFT_EXPR:
8186     case RSHIFT_EXPR:
8187     case LROTATE_EXPR:
8188     case RROTATE_EXPR:
8189       if (! safe_from_p (subtarget, TREE_OPERAND (exp, 1), 1))
8190         subtarget = 0;
8191       if (modifier == EXPAND_STACK_PARM)
8192         target = 0;
8193       op0 = expand_expr (TREE_OPERAND (exp, 0), subtarget, VOIDmode, 0);
8194       return expand_shift (code, mode, op0, TREE_OPERAND (exp, 1), target,
8195                            unsignedp);
8196
8197       /* Could determine the answer when only additive constants differ.  Also,
8198          the addition of one can be handled by changing the condition.  */
8199     case LT_EXPR:
8200     case LE_EXPR:
8201     case GT_EXPR:
8202     case GE_EXPR:
8203     case EQ_EXPR:
8204     case NE_EXPR:
8205     case UNORDERED_EXPR:
8206     case ORDERED_EXPR:
8207     case UNLT_EXPR:
8208     case UNLE_EXPR:
8209     case UNGT_EXPR:
8210     case UNGE_EXPR:
8211     case UNEQ_EXPR:
8212     case LTGT_EXPR:
8213       temp = do_store_flag (exp,
8214                             modifier != EXPAND_STACK_PARM ? target : NULL_RTX,
8215                             tmode != VOIDmode ? tmode : mode, 0);
8216       if (temp != 0)
8217         return temp;
8218
8219       /* For foo != 0, load foo, and if it is nonzero load 1 instead.  */
8220       if (code == NE_EXPR && integer_zerop (TREE_OPERAND (exp, 1))
8221           && original_target
8222           && REG_P (original_target)
8223           && (GET_MODE (original_target)
8224               == TYPE_MODE (TREE_TYPE (TREE_OPERAND (exp, 0)))))
8225         {
8226           temp = expand_expr (TREE_OPERAND (exp, 0), original_target,
8227                               VOIDmode, 0);
8228
8229           /* If temp is constant, we can just compute the result.  */
8230           if (GET_CODE (temp) == CONST_INT)
8231             {
8232               if (INTVAL (temp) != 0)
8233                 emit_move_insn (target, const1_rtx);
8234               else
8235                 emit_move_insn (target, const0_rtx);
8236
8237               return target;
8238             }
8239
8240           if (temp != original_target)
8241             {
8242               enum machine_mode mode1 = GET_MODE (temp);
8243               if (mode1 == VOIDmode)
8244                 mode1 = tmode != VOIDmode ? tmode : mode;
8245
8246               temp = copy_to_mode_reg (mode1, temp);
8247             }
8248
8249           op1 = gen_label_rtx ();
8250           emit_cmp_and_jump_insns (temp, const0_rtx, EQ, NULL_RTX,
8251                                    GET_MODE (temp), unsignedp, op1);
8252           emit_move_insn (temp, const1_rtx);
8253           emit_label (op1);
8254           return temp;
8255         }
8256
8257       /* If no set-flag instruction, must generate a conditional store
8258          into a temporary variable.  Drop through and handle this
8259          like && and ||.  */
8260
8261       if (! ignore
8262           && (target == 0
8263               || modifier == EXPAND_STACK_PARM
8264               || ! safe_from_p (target, exp, 1)
8265               /* Make sure we don't have a hard reg (such as function's return
8266                  value) live across basic blocks, if not optimizing.  */
8267               || (!optimize && REG_P (target)
8268                   && REGNO (target) < FIRST_PSEUDO_REGISTER)))
8269         target = gen_reg_rtx (tmode != VOIDmode ? tmode : mode);
8270
8271       if (target)
8272         emit_move_insn (target, const0_rtx);
8273
8274       op1 = gen_label_rtx ();
8275       jumpifnot (exp, op1);
8276
8277       if (target)
8278         emit_move_insn (target, const1_rtx);
8279
8280       emit_label (op1);
8281       return ignore ? const0_rtx : target;
8282
8283     case TRUTH_NOT_EXPR:
8284       if (modifier == EXPAND_STACK_PARM)
8285         target = 0;
8286       op0 = expand_expr (TREE_OPERAND (exp, 0), target, VOIDmode, 0);
8287       /* The parser is careful to generate TRUTH_NOT_EXPR
8288          only with operands that are always zero or one.  */
8289       temp = expand_binop (mode, xor_optab, op0, const1_rtx,
8290                            target, 1, OPTAB_LIB_WIDEN);
8291       gcc_assert (temp);
8292       return temp;
8293
8294     case STATEMENT_LIST:
8295       {
8296         tree_stmt_iterator iter;
8297
8298         gcc_assert (ignore);
8299
8300         for (iter = tsi_start (exp); !tsi_end_p (iter); tsi_next (&iter))
8301           expand_expr (tsi_stmt (iter), const0_rtx, VOIDmode, modifier);
8302       }
8303       return const0_rtx;
8304
8305     case COND_EXPR:
8306       /* A COND_EXPR with its type being VOID_TYPE represents a
8307          conditional jump and is handled in
8308          expand_gimple_cond_expr.  */
8309       gcc_assert (!VOID_TYPE_P (TREE_TYPE (exp)));
8310
8311         /* Note that COND_EXPRs whose type is a structure or union
8312          are required to be constructed to contain assignments of
8313          a temporary variable, so that we can evaluate them here
8314          for side effect only.  If type is void, we must do likewise.  */
8315
8316         gcc_assert (!TREE_ADDRESSABLE (type)
8317                     && !ignore
8318                     && TREE_TYPE (TREE_OPERAND (exp, 1)) != void_type_node
8319                     && TREE_TYPE (TREE_OPERAND (exp, 2)) != void_type_node);
8320
8321        /* If we are not to produce a result, we have no target.  Otherwise,
8322          if a target was specified use it; it will not be used as an
8323          intermediate target unless it is safe.  If no target, use a
8324          temporary.  */
8325
8326        if (modifier != EXPAND_STACK_PARM
8327           && original_target
8328           && safe_from_p (original_target, TREE_OPERAND (exp, 0), 1)
8329           && GET_MODE (original_target) == mode
8330 #ifdef HAVE_conditional_move
8331           && (! can_conditionally_move_p (mode)
8332               || REG_P (original_target))
8333 #endif
8334           && !MEM_P (original_target))
8335         temp = original_target;
8336        else
8337         temp = assign_temp (type, 0, 0, 1);
8338
8339        do_pending_stack_adjust ();
8340        NO_DEFER_POP;
8341        op0 = gen_label_rtx ();
8342        op1 = gen_label_rtx ();
8343        jumpifnot (TREE_OPERAND (exp, 0), op0);
8344        store_expr (TREE_OPERAND (exp, 1), temp,
8345                   modifier == EXPAND_STACK_PARM);
8346
8347        emit_jump_insn (gen_jump (op1));
8348        emit_barrier ();
8349        emit_label (op0);
8350        store_expr (TREE_OPERAND (exp, 2), temp,
8351                   modifier == EXPAND_STACK_PARM);
8352
8353        emit_label (op1);
8354        OK_DEFER_POP;
8355        return temp;
8356
8357     case VEC_COND_EXPR:
8358         target = expand_vec_cond_expr (exp, target);
8359         return target;
8360
8361     case MODIFY_EXPR:
8362       {
8363         tree lhs = TREE_OPERAND (exp, 0);
8364         tree rhs = TREE_OPERAND (exp, 1);
8365
8366         gcc_assert (ignore);
8367
8368         /* Check for |= or &= of a bitfield of size one into another bitfield
8369            of size 1.  In this case, (unless we need the result of the
8370            assignment) we can do this more efficiently with a
8371            test followed by an assignment, if necessary.
8372
8373            ??? At this point, we can't get a BIT_FIELD_REF here.  But if
8374            things change so we do, this code should be enhanced to
8375            support it.  */
8376         if (TREE_CODE (lhs) == COMPONENT_REF
8377             && (TREE_CODE (rhs) == BIT_IOR_EXPR
8378                 || TREE_CODE (rhs) == BIT_AND_EXPR)
8379             && TREE_OPERAND (rhs, 0) == lhs
8380             && TREE_CODE (TREE_OPERAND (rhs, 1)) == COMPONENT_REF
8381             && integer_onep (DECL_SIZE (TREE_OPERAND (lhs, 1)))
8382             && integer_onep (DECL_SIZE (TREE_OPERAND (TREE_OPERAND (rhs, 1), 1))))
8383           {
8384             rtx label = gen_label_rtx ();
8385
8386             do_jump (TREE_OPERAND (rhs, 1),
8387                      TREE_CODE (rhs) == BIT_IOR_EXPR ? label : 0,
8388                      TREE_CODE (rhs) == BIT_AND_EXPR ? label : 0);
8389             expand_assignment (lhs, convert (TREE_TYPE (rhs),
8390                                              (TREE_CODE (rhs) == BIT_IOR_EXPR
8391                                               ? integer_one_node
8392                                               : integer_zero_node)));
8393             do_pending_stack_adjust ();
8394             emit_label (label);
8395             return const0_rtx;
8396           }
8397
8398         expand_assignment (lhs, rhs);
8399
8400         return const0_rtx;
8401       }
8402
8403     case RETURN_EXPR:
8404       if (!TREE_OPERAND (exp, 0))
8405         expand_null_return ();
8406       else
8407         expand_return (TREE_OPERAND (exp, 0));
8408       return const0_rtx;
8409
8410     case ADDR_EXPR:
8411       return expand_expr_addr_expr (exp, target, tmode, modifier);
8412
8413     case COMPLEX_EXPR:
8414       /* Get the rtx code of the operands.  */
8415       op0 = expand_expr (TREE_OPERAND (exp, 0), 0, VOIDmode, 0);
8416       op1 = expand_expr (TREE_OPERAND (exp, 1), 0, VOIDmode, 0);
8417
8418       if (!target)
8419         target = gen_reg_rtx (TYPE_MODE (TREE_TYPE (exp)));
8420
8421       /* Move the real (op0) and imaginary (op1) parts to their location.  */
8422       write_complex_part (target, op0, false);
8423       write_complex_part (target, op1, true);
8424
8425       return target;
8426
8427     case REALPART_EXPR:
8428       op0 = expand_expr (TREE_OPERAND (exp, 0), 0, VOIDmode, 0);
8429       return read_complex_part (op0, false);
8430
8431     case IMAGPART_EXPR:
8432       op0 = expand_expr (TREE_OPERAND (exp, 0), 0, VOIDmode, 0);
8433       return read_complex_part (op0, true);
8434
8435     case RESX_EXPR:
8436       expand_resx_expr (exp);
8437       return const0_rtx;
8438
8439     case TRY_CATCH_EXPR:
8440     case CATCH_EXPR:
8441     case EH_FILTER_EXPR:
8442     case TRY_FINALLY_EXPR:
8443       /* Lowered by tree-eh.c.  */
8444       gcc_unreachable ();
8445
8446     case WITH_CLEANUP_EXPR:
8447     case CLEANUP_POINT_EXPR:
8448     case TARGET_EXPR:
8449     case CASE_LABEL_EXPR:
8450     case VA_ARG_EXPR:
8451     case BIND_EXPR:
8452     case INIT_EXPR:
8453     case CONJ_EXPR:
8454     case COMPOUND_EXPR:
8455     case PREINCREMENT_EXPR:
8456     case PREDECREMENT_EXPR:
8457     case POSTINCREMENT_EXPR:
8458     case POSTDECREMENT_EXPR:
8459     case LOOP_EXPR:
8460     case EXIT_EXPR:
8461     case TRUTH_ANDIF_EXPR:
8462     case TRUTH_ORIF_EXPR:
8463       /* Lowered by gimplify.c.  */
8464       gcc_unreachable ();
8465
8466     case EXC_PTR_EXPR:
8467       return get_exception_pointer (cfun);
8468
8469     case FILTER_EXPR:
8470       return get_exception_filter (cfun);
8471
8472     case FDESC_EXPR:
8473       /* Function descriptors are not valid except for as
8474          initialization constants, and should not be expanded.  */
8475       gcc_unreachable ();
8476
8477     case SWITCH_EXPR:
8478       expand_case (exp);
8479       return const0_rtx;
8480
8481     case LABEL_EXPR:
8482       expand_label (TREE_OPERAND (exp, 0));
8483       return const0_rtx;
8484
8485     case ASM_EXPR:
8486       expand_asm_expr (exp);
8487       return const0_rtx;
8488
8489     case WITH_SIZE_EXPR:
8490       /* WITH_SIZE_EXPR expands to its first argument.  The caller should
8491          have pulled out the size to use in whatever context it needed.  */
8492       return expand_expr_real (TREE_OPERAND (exp, 0), original_target, tmode,
8493                                modifier, alt_rtl);
8494
8495     case REALIGN_LOAD_EXPR:
8496       {
8497         tree oprnd0 = TREE_OPERAND (exp, 0); 
8498         tree oprnd1 = TREE_OPERAND (exp, 1);
8499         tree oprnd2 = TREE_OPERAND (exp, 2);
8500         rtx op2;
8501
8502         this_optab = optab_for_tree_code (code, type);
8503         expand_operands (oprnd0, oprnd1, NULL_RTX, &op0, &op1, 0);
8504         op2 = expand_expr (oprnd2, NULL_RTX, VOIDmode, 0);
8505         temp = expand_ternary_op (mode, this_optab, op0, op1, op2, 
8506                                   target, unsignedp);
8507         gcc_assert (temp);
8508         return temp;
8509       }
8510
8511     case REDUC_MAX_EXPR:
8512     case REDUC_MIN_EXPR:
8513     case REDUC_PLUS_EXPR:
8514       {
8515         op0 = expand_expr (TREE_OPERAND (exp, 0), NULL_RTX, VOIDmode, 0);
8516         this_optab = optab_for_tree_code (code, type);
8517         temp = expand_unop (mode, this_optab, op0, target, unsignedp);
8518         gcc_assert (temp);
8519         return temp;
8520       }
8521
8522     case VEC_LSHIFT_EXPR:
8523     case VEC_RSHIFT_EXPR:
8524       {
8525         target = expand_vec_shift_expr (exp, target);
8526         return target;
8527       }
8528
8529     default:
8530       return lang_hooks.expand_expr (exp, original_target, tmode,
8531                                      modifier, alt_rtl);
8532     }
8533
8534   /* Here to do an ordinary binary operator.  */
8535  binop:
8536   expand_operands (TREE_OPERAND (exp, 0), TREE_OPERAND (exp, 1),
8537                    subtarget, &op0, &op1, 0);
8538  binop2:
8539   this_optab = optab_for_tree_code (code, type);
8540  binop3:
8541   if (modifier == EXPAND_STACK_PARM)
8542     target = 0;
8543   temp = expand_binop (mode, this_optab, op0, op1, target,
8544                        unsignedp, OPTAB_LIB_WIDEN);
8545   gcc_assert (temp);
8546   return REDUCE_BIT_FIELD (temp);
8547 }
8548 #undef REDUCE_BIT_FIELD
8549 \f
8550 /* Subroutine of above: reduce EXP to the precision of TYPE (in the
8551    signedness of TYPE), possibly returning the result in TARGET.  */
8552 static rtx
8553 reduce_to_bit_field_precision (rtx exp, rtx target, tree type)
8554 {
8555   HOST_WIDE_INT prec = TYPE_PRECISION (type);
8556   if (target && GET_MODE (target) != GET_MODE (exp))
8557     target = 0;
8558   if (TYPE_UNSIGNED (type))
8559     {
8560       rtx mask;
8561       if (prec < HOST_BITS_PER_WIDE_INT)
8562         mask = immed_double_const (((unsigned HOST_WIDE_INT) 1 << prec) - 1, 0,
8563                                    GET_MODE (exp));
8564       else
8565         mask = immed_double_const ((unsigned HOST_WIDE_INT) -1,
8566                                    ((unsigned HOST_WIDE_INT) 1
8567                                     << (prec - HOST_BITS_PER_WIDE_INT)) - 1,
8568                                    GET_MODE (exp));
8569       return expand_and (GET_MODE (exp), exp, mask, target);
8570     }
8571   else
8572     {
8573       tree count = build_int_cst (NULL_TREE,
8574                                   GET_MODE_BITSIZE (GET_MODE (exp)) - prec);
8575       exp = expand_shift (LSHIFT_EXPR, GET_MODE (exp), exp, count, target, 0);
8576       return expand_shift (RSHIFT_EXPR, GET_MODE (exp), exp, count, target, 0);
8577     }
8578 }
8579 \f
8580 /* Subroutine of above: returns 1 if OFFSET corresponds to an offset that
8581    when applied to the address of EXP produces an address known to be
8582    aligned more than BIGGEST_ALIGNMENT.  */
8583
8584 static int
8585 is_aligning_offset (tree offset, tree exp)
8586 {
8587   /* Strip off any conversions.  */
8588   while (TREE_CODE (offset) == NON_LVALUE_EXPR
8589          || TREE_CODE (offset) == NOP_EXPR
8590          || TREE_CODE (offset) == CONVERT_EXPR)
8591     offset = TREE_OPERAND (offset, 0);
8592
8593   /* We must now have a BIT_AND_EXPR with a constant that is one less than
8594      power of 2 and which is larger than BIGGEST_ALIGNMENT.  */
8595   if (TREE_CODE (offset) != BIT_AND_EXPR
8596       || !host_integerp (TREE_OPERAND (offset, 1), 1)
8597       || compare_tree_int (TREE_OPERAND (offset, 1),
8598                            BIGGEST_ALIGNMENT / BITS_PER_UNIT) <= 0
8599       || !exact_log2 (tree_low_cst (TREE_OPERAND (offset, 1), 1) + 1) < 0)
8600     return 0;
8601
8602   /* Look at the first operand of BIT_AND_EXPR and strip any conversion.
8603      It must be NEGATE_EXPR.  Then strip any more conversions.  */
8604   offset = TREE_OPERAND (offset, 0);
8605   while (TREE_CODE (offset) == NON_LVALUE_EXPR
8606          || TREE_CODE (offset) == NOP_EXPR
8607          || TREE_CODE (offset) == CONVERT_EXPR)
8608     offset = TREE_OPERAND (offset, 0);
8609
8610   if (TREE_CODE (offset) != NEGATE_EXPR)
8611     return 0;
8612
8613   offset = TREE_OPERAND (offset, 0);
8614   while (TREE_CODE (offset) == NON_LVALUE_EXPR
8615          || TREE_CODE (offset) == NOP_EXPR
8616          || TREE_CODE (offset) == CONVERT_EXPR)
8617     offset = TREE_OPERAND (offset, 0);
8618
8619   /* This must now be the address of EXP.  */
8620   return TREE_CODE (offset) == ADDR_EXPR && TREE_OPERAND (offset, 0) == exp;
8621 }
8622 \f
8623 /* Return the tree node if an ARG corresponds to a string constant or zero
8624    if it doesn't.  If we return nonzero, set *PTR_OFFSET to the offset
8625    in bytes within the string that ARG is accessing.  The type of the
8626    offset will be `sizetype'.  */
8627
8628 tree
8629 string_constant (tree arg, tree *ptr_offset)
8630 {
8631   tree array, offset;
8632   STRIP_NOPS (arg);
8633
8634   if (TREE_CODE (arg) == ADDR_EXPR)
8635     {
8636       if (TREE_CODE (TREE_OPERAND (arg, 0)) == STRING_CST)
8637         {
8638           *ptr_offset = size_zero_node;
8639           return TREE_OPERAND (arg, 0);
8640         }
8641       else if (TREE_CODE (TREE_OPERAND (arg, 0)) == VAR_DECL)
8642         {
8643           array = TREE_OPERAND (arg, 0);
8644           offset = size_zero_node;
8645         }
8646       else if (TREE_CODE (TREE_OPERAND (arg, 0)) == ARRAY_REF)
8647         {
8648           array = TREE_OPERAND (TREE_OPERAND (arg, 0), 0);
8649           offset = TREE_OPERAND (TREE_OPERAND (arg, 0), 1);
8650           if (TREE_CODE (array) != STRING_CST
8651               && TREE_CODE (array) != VAR_DECL)
8652             return 0;
8653         }
8654       else
8655         return 0;
8656     }
8657   else if (TREE_CODE (arg) == PLUS_EXPR)
8658     {
8659       tree arg0 = TREE_OPERAND (arg, 0);
8660       tree arg1 = TREE_OPERAND (arg, 1);
8661
8662       STRIP_NOPS (arg0);
8663       STRIP_NOPS (arg1);
8664
8665       if (TREE_CODE (arg0) == ADDR_EXPR
8666           && (TREE_CODE (TREE_OPERAND (arg0, 0)) == STRING_CST
8667               || TREE_CODE (TREE_OPERAND (arg0, 0)) == VAR_DECL))
8668         {
8669           array = TREE_OPERAND (arg0, 0);
8670           offset = arg1;
8671         }
8672       else if (TREE_CODE (arg1) == ADDR_EXPR
8673                && (TREE_CODE (TREE_OPERAND (arg1, 0)) == STRING_CST
8674                    || TREE_CODE (TREE_OPERAND (arg1, 0)) == VAR_DECL))
8675         {
8676           array = TREE_OPERAND (arg1, 0);
8677           offset = arg0;
8678         }
8679       else
8680         return 0;
8681     }
8682   else
8683     return 0;
8684
8685   if (TREE_CODE (array) == STRING_CST)
8686     {
8687       *ptr_offset = convert (sizetype, offset);
8688       return array;
8689     }
8690   else if (TREE_CODE (array) == VAR_DECL)
8691     {
8692       int length;
8693
8694       /* Variables initialized to string literals can be handled too.  */
8695       if (DECL_INITIAL (array) == NULL_TREE
8696           || TREE_CODE (DECL_INITIAL (array)) != STRING_CST)
8697         return 0;
8698
8699       /* If they are read-only, non-volatile and bind locally.  */
8700       if (! TREE_READONLY (array)
8701           || TREE_SIDE_EFFECTS (array)
8702           || ! targetm.binds_local_p (array))
8703         return 0;
8704
8705       /* Avoid const char foo[4] = "abcde";  */
8706       if (DECL_SIZE_UNIT (array) == NULL_TREE
8707           || TREE_CODE (DECL_SIZE_UNIT (array)) != INTEGER_CST
8708           || (length = TREE_STRING_LENGTH (DECL_INITIAL (array))) <= 0
8709           || compare_tree_int (DECL_SIZE_UNIT (array), length) < 0)
8710         return 0;
8711
8712       /* If variable is bigger than the string literal, OFFSET must be constant
8713          and inside of the bounds of the string literal.  */
8714       offset = convert (sizetype, offset);
8715       if (compare_tree_int (DECL_SIZE_UNIT (array), length) > 0
8716           && (! host_integerp (offset, 1)
8717               || compare_tree_int (offset, length) >= 0))
8718         return 0;
8719
8720       *ptr_offset = offset;
8721       return DECL_INITIAL (array);
8722     }
8723
8724   return 0;
8725 }
8726 \f
8727 /* Generate code to calculate EXP using a store-flag instruction
8728    and return an rtx for the result.  EXP is either a comparison
8729    or a TRUTH_NOT_EXPR whose operand is a comparison.
8730
8731    If TARGET is nonzero, store the result there if convenient.
8732
8733    If ONLY_CHEAP is nonzero, only do this if it is likely to be very
8734    cheap.
8735
8736    Return zero if there is no suitable set-flag instruction
8737    available on this machine.
8738
8739    Once expand_expr has been called on the arguments of the comparison,
8740    we are committed to doing the store flag, since it is not safe to
8741    re-evaluate the expression.  We emit the store-flag insn by calling
8742    emit_store_flag, but only expand the arguments if we have a reason
8743    to believe that emit_store_flag will be successful.  If we think that
8744    it will, but it isn't, we have to simulate the store-flag with a
8745    set/jump/set sequence.  */
8746
8747 static rtx
8748 do_store_flag (tree exp, rtx target, enum machine_mode mode, int only_cheap)
8749 {
8750   enum rtx_code code;
8751   tree arg0, arg1, type;
8752   tree tem;
8753   enum machine_mode operand_mode;
8754   int invert = 0;
8755   int unsignedp;
8756   rtx op0, op1;
8757   enum insn_code icode;
8758   rtx subtarget = target;
8759   rtx result, label;
8760
8761   /* If this is a TRUTH_NOT_EXPR, set a flag indicating we must invert the
8762      result at the end.  We can't simply invert the test since it would
8763      have already been inverted if it were valid.  This case occurs for
8764      some floating-point comparisons.  */
8765
8766   if (TREE_CODE (exp) == TRUTH_NOT_EXPR)
8767     invert = 1, exp = TREE_OPERAND (exp, 0);
8768
8769   arg0 = TREE_OPERAND (exp, 0);
8770   arg1 = TREE_OPERAND (exp, 1);
8771
8772   /* Don't crash if the comparison was erroneous.  */
8773   if (arg0 == error_mark_node || arg1 == error_mark_node)
8774     return const0_rtx;
8775
8776   type = TREE_TYPE (arg0);
8777   operand_mode = TYPE_MODE (type);
8778   unsignedp = TYPE_UNSIGNED (type);
8779
8780   /* We won't bother with BLKmode store-flag operations because it would mean
8781      passing a lot of information to emit_store_flag.  */
8782   if (operand_mode == BLKmode)
8783     return 0;
8784
8785   /* We won't bother with store-flag operations involving function pointers
8786      when function pointers must be canonicalized before comparisons.  */
8787 #ifdef HAVE_canonicalize_funcptr_for_compare
8788   if (HAVE_canonicalize_funcptr_for_compare
8789       && ((TREE_CODE (TREE_TYPE (TREE_OPERAND (exp, 0))) == POINTER_TYPE
8790            && (TREE_CODE (TREE_TYPE (TREE_TYPE (TREE_OPERAND (exp, 0))))
8791                == FUNCTION_TYPE))
8792           || (TREE_CODE (TREE_TYPE (TREE_OPERAND (exp, 1))) == POINTER_TYPE
8793               && (TREE_CODE (TREE_TYPE (TREE_TYPE (TREE_OPERAND (exp, 1))))
8794                   == FUNCTION_TYPE))))
8795     return 0;
8796 #endif
8797
8798   STRIP_NOPS (arg0);
8799   STRIP_NOPS (arg1);
8800
8801   /* Get the rtx comparison code to use.  We know that EXP is a comparison
8802      operation of some type.  Some comparisons against 1 and -1 can be
8803      converted to comparisons with zero.  Do so here so that the tests
8804      below will be aware that we have a comparison with zero.   These
8805      tests will not catch constants in the first operand, but constants
8806      are rarely passed as the first operand.  */
8807
8808   switch (TREE_CODE (exp))
8809     {
8810     case EQ_EXPR:
8811       code = EQ;
8812       break;
8813     case NE_EXPR:
8814       code = NE;
8815       break;
8816     case LT_EXPR:
8817       if (integer_onep (arg1))
8818         arg1 = integer_zero_node, code = unsignedp ? LEU : LE;
8819       else
8820         code = unsignedp ? LTU : LT;
8821       break;
8822     case LE_EXPR:
8823       if (! unsignedp && integer_all_onesp (arg1))
8824         arg1 = integer_zero_node, code = LT;
8825       else
8826         code = unsignedp ? LEU : LE;
8827       break;
8828     case GT_EXPR:
8829       if (! unsignedp && integer_all_onesp (arg1))
8830         arg1 = integer_zero_node, code = GE;
8831       else
8832         code = unsignedp ? GTU : GT;
8833       break;
8834     case GE_EXPR:
8835       if (integer_onep (arg1))
8836         arg1 = integer_zero_node, code = unsignedp ? GTU : GT;
8837       else
8838         code = unsignedp ? GEU : GE;
8839       break;
8840
8841     case UNORDERED_EXPR:
8842       code = UNORDERED;
8843       break;
8844     case ORDERED_EXPR:
8845       code = ORDERED;
8846       break;
8847     case UNLT_EXPR:
8848       code = UNLT;
8849       break;
8850     case UNLE_EXPR:
8851       code = UNLE;
8852       break;
8853     case UNGT_EXPR:
8854       code = UNGT;
8855       break;
8856     case UNGE_EXPR:
8857       code = UNGE;
8858       break;
8859     case UNEQ_EXPR:
8860       code = UNEQ;
8861       break;
8862     case LTGT_EXPR:
8863       code = LTGT;
8864       break;
8865
8866     default:
8867       gcc_unreachable ();
8868     }
8869
8870   /* Put a constant second.  */
8871   if (TREE_CODE (arg0) == REAL_CST || TREE_CODE (arg0) == INTEGER_CST)
8872     {
8873       tem = arg0; arg0 = arg1; arg1 = tem;
8874       code = swap_condition (code);
8875     }
8876
8877   /* If this is an equality or inequality test of a single bit, we can
8878      do this by shifting the bit being tested to the low-order bit and
8879      masking the result with the constant 1.  If the condition was EQ,
8880      we xor it with 1.  This does not require an scc insn and is faster
8881      than an scc insn even if we have it.
8882
8883      The code to make this transformation was moved into fold_single_bit_test,
8884      so we just call into the folder and expand its result.  */
8885
8886   if ((code == NE || code == EQ)
8887       && TREE_CODE (arg0) == BIT_AND_EXPR && integer_zerop (arg1)
8888       && integer_pow2p (TREE_OPERAND (arg0, 1)))
8889     {
8890       tree type = lang_hooks.types.type_for_mode (mode, unsignedp);
8891       return expand_expr (fold_single_bit_test (code == NE ? NE_EXPR : EQ_EXPR,
8892                                                 arg0, arg1, type),
8893                           target, VOIDmode, EXPAND_NORMAL);
8894     }
8895
8896   /* Now see if we are likely to be able to do this.  Return if not.  */
8897   if (! can_compare_p (code, operand_mode, ccp_store_flag))
8898     return 0;
8899
8900   icode = setcc_gen_code[(int) code];
8901   if (icode == CODE_FOR_nothing
8902       || (only_cheap && insn_data[(int) icode].operand[0].mode != mode))
8903     {
8904       /* We can only do this if it is one of the special cases that
8905          can be handled without an scc insn.  */
8906       if ((code == LT && integer_zerop (arg1))
8907           || (! only_cheap && code == GE && integer_zerop (arg1)))
8908         ;
8909       else if (! only_cheap && (code == NE || code == EQ)
8910                && TREE_CODE (type) != REAL_TYPE
8911                && ((abs_optab->handlers[(int) operand_mode].insn_code
8912                     != CODE_FOR_nothing)
8913                    || (ffs_optab->handlers[(int) operand_mode].insn_code
8914                        != CODE_FOR_nothing)))
8915         ;
8916       else
8917         return 0;
8918     }
8919
8920   if (! get_subtarget (target)
8921       || GET_MODE (subtarget) != operand_mode)
8922     subtarget = 0;
8923
8924   expand_operands (arg0, arg1, subtarget, &op0, &op1, 0);
8925
8926   if (target == 0)
8927     target = gen_reg_rtx (mode);
8928
8929   result = emit_store_flag (target, code, op0, op1,
8930                             operand_mode, unsignedp, 1);
8931
8932   if (result)
8933     {
8934       if (invert)
8935         result = expand_binop (mode, xor_optab, result, const1_rtx,
8936                                result, 0, OPTAB_LIB_WIDEN);
8937       return result;
8938     }
8939
8940   /* If this failed, we have to do this with set/compare/jump/set code.  */
8941   if (!REG_P (target)
8942       || reg_mentioned_p (target, op0) || reg_mentioned_p (target, op1))
8943     target = gen_reg_rtx (GET_MODE (target));
8944
8945   emit_move_insn (target, invert ? const0_rtx : const1_rtx);
8946   result = compare_from_rtx (op0, op1, code, unsignedp,
8947                              operand_mode, NULL_RTX);
8948   if (GET_CODE (result) == CONST_INT)
8949     return (((result == const0_rtx && ! invert)
8950              || (result != const0_rtx && invert))
8951             ? const0_rtx : const1_rtx);
8952
8953   /* The code of RESULT may not match CODE if compare_from_rtx
8954      decided to swap its operands and reverse the original code.
8955
8956      We know that compare_from_rtx returns either a CONST_INT or
8957      a new comparison code, so it is safe to just extract the
8958      code from RESULT.  */
8959   code = GET_CODE (result);
8960
8961   label = gen_label_rtx ();
8962   gcc_assert (bcc_gen_fctn[(int) code]);
8963
8964   emit_jump_insn ((*bcc_gen_fctn[(int) code]) (label));
8965   emit_move_insn (target, invert ? const1_rtx : const0_rtx);
8966   emit_label (label);
8967
8968   return target;
8969 }
8970 \f
8971
8972 /* Stubs in case we haven't got a casesi insn.  */
8973 #ifndef HAVE_casesi
8974 # define HAVE_casesi 0
8975 # define gen_casesi(a, b, c, d, e) (0)
8976 # define CODE_FOR_casesi CODE_FOR_nothing
8977 #endif
8978
8979 /* If the machine does not have a case insn that compares the bounds,
8980    this means extra overhead for dispatch tables, which raises the
8981    threshold for using them.  */
8982 #ifndef CASE_VALUES_THRESHOLD
8983 #define CASE_VALUES_THRESHOLD (HAVE_casesi ? 4 : 5)
8984 #endif /* CASE_VALUES_THRESHOLD */
8985
8986 unsigned int
8987 case_values_threshold (void)
8988 {
8989   return CASE_VALUES_THRESHOLD;
8990 }
8991
8992 /* Attempt to generate a casesi instruction.  Returns 1 if successful,
8993    0 otherwise (i.e. if there is no casesi instruction).  */
8994 int
8995 try_casesi (tree index_type, tree index_expr, tree minval, tree range,
8996             rtx table_label ATTRIBUTE_UNUSED, rtx default_label)
8997 {
8998   enum machine_mode index_mode = SImode;
8999   int index_bits = GET_MODE_BITSIZE (index_mode);
9000   rtx op1, op2, index;
9001   enum machine_mode op_mode;
9002
9003   if (! HAVE_casesi)
9004     return 0;
9005
9006   /* Convert the index to SImode.  */
9007   if (GET_MODE_BITSIZE (TYPE_MODE (index_type)) > GET_MODE_BITSIZE (index_mode))
9008     {
9009       enum machine_mode omode = TYPE_MODE (index_type);
9010       rtx rangertx = expand_expr (range, NULL_RTX, VOIDmode, 0);
9011
9012       /* We must handle the endpoints in the original mode.  */
9013       index_expr = build2 (MINUS_EXPR, index_type,
9014                            index_expr, minval);
9015       minval = integer_zero_node;
9016       index = expand_expr (index_expr, NULL_RTX, VOIDmode, 0);
9017       emit_cmp_and_jump_insns (rangertx, index, LTU, NULL_RTX,
9018                                omode, 1, default_label);
9019       /* Now we can safely truncate.  */
9020       index = convert_to_mode (index_mode, index, 0);
9021     }
9022   else
9023     {
9024       if (TYPE_MODE (index_type) != index_mode)
9025         {
9026           index_expr = convert (lang_hooks.types.type_for_size
9027                                 (index_bits, 0), index_expr);
9028           index_type = TREE_TYPE (index_expr);
9029         }
9030
9031       index = expand_expr (index_expr, NULL_RTX, VOIDmode, 0);
9032     }
9033
9034   do_pending_stack_adjust ();
9035
9036   op_mode = insn_data[(int) CODE_FOR_casesi].operand[0].mode;
9037   if (! (*insn_data[(int) CODE_FOR_casesi].operand[0].predicate)
9038       (index, op_mode))
9039     index = copy_to_mode_reg (op_mode, index);
9040
9041   op1 = expand_expr (minval, NULL_RTX, VOIDmode, 0);
9042
9043   op_mode = insn_data[(int) CODE_FOR_casesi].operand[1].mode;
9044   op1 = convert_modes (op_mode, TYPE_MODE (TREE_TYPE (minval)),
9045                        op1, TYPE_UNSIGNED (TREE_TYPE (minval)));
9046   if (! (*insn_data[(int) CODE_FOR_casesi].operand[1].predicate)
9047       (op1, op_mode))
9048     op1 = copy_to_mode_reg (op_mode, op1);
9049
9050   op2 = expand_expr (range, NULL_RTX, VOIDmode, 0);
9051
9052   op_mode = insn_data[(int) CODE_FOR_casesi].operand[2].mode;
9053   op2 = convert_modes (op_mode, TYPE_MODE (TREE_TYPE (range)),
9054                        op2, TYPE_UNSIGNED (TREE_TYPE (range)));
9055   if (! (*insn_data[(int) CODE_FOR_casesi].operand[2].predicate)
9056       (op2, op_mode))
9057     op2 = copy_to_mode_reg (op_mode, op2);
9058
9059   emit_jump_insn (gen_casesi (index, op1, op2,
9060                               table_label, default_label));
9061   return 1;
9062 }
9063
9064 /* Attempt to generate a tablejump instruction; same concept.  */
9065 #ifndef HAVE_tablejump
9066 #define HAVE_tablejump 0
9067 #define gen_tablejump(x, y) (0)
9068 #endif
9069
9070 /* Subroutine of the next function.
9071
9072    INDEX is the value being switched on, with the lowest value
9073    in the table already subtracted.
9074    MODE is its expected mode (needed if INDEX is constant).
9075    RANGE is the length of the jump table.
9076    TABLE_LABEL is a CODE_LABEL rtx for the table itself.
9077
9078    DEFAULT_LABEL is a CODE_LABEL rtx to jump to if the
9079    index value is out of range.  */
9080
9081 static void
9082 do_tablejump (rtx index, enum machine_mode mode, rtx range, rtx table_label,
9083               rtx default_label)
9084 {
9085   rtx temp, vector;
9086
9087   if (INTVAL (range) > cfun->max_jumptable_ents)
9088     cfun->max_jumptable_ents = INTVAL (range);
9089
9090   /* Do an unsigned comparison (in the proper mode) between the index
9091      expression and the value which represents the length of the range.
9092      Since we just finished subtracting the lower bound of the range
9093      from the index expression, this comparison allows us to simultaneously
9094      check that the original index expression value is both greater than
9095      or equal to the minimum value of the range and less than or equal to
9096      the maximum value of the range.  */
9097
9098   emit_cmp_and_jump_insns (index, range, GTU, NULL_RTX, mode, 1,
9099                            default_label);
9100
9101   /* If index is in range, it must fit in Pmode.
9102      Convert to Pmode so we can index with it.  */
9103   if (mode != Pmode)
9104     index = convert_to_mode (Pmode, index, 1);
9105
9106   /* Don't let a MEM slip through, because then INDEX that comes
9107      out of PIC_CASE_VECTOR_ADDRESS won't be a valid address,
9108      and break_out_memory_refs will go to work on it and mess it up.  */
9109 #ifdef PIC_CASE_VECTOR_ADDRESS
9110   if (flag_pic && !REG_P (index))
9111     index = copy_to_mode_reg (Pmode, index);
9112 #endif
9113
9114   /* If flag_force_addr were to affect this address
9115      it could interfere with the tricky assumptions made
9116      about addresses that contain label-refs,
9117      which may be valid only very near the tablejump itself.  */
9118   /* ??? The only correct use of CASE_VECTOR_MODE is the one inside the
9119      GET_MODE_SIZE, because this indicates how large insns are.  The other
9120      uses should all be Pmode, because they are addresses.  This code
9121      could fail if addresses and insns are not the same size.  */
9122   index = gen_rtx_PLUS (Pmode,
9123                         gen_rtx_MULT (Pmode, index,
9124                                       GEN_INT (GET_MODE_SIZE (CASE_VECTOR_MODE))),
9125                         gen_rtx_LABEL_REF (Pmode, table_label));
9126 #ifdef PIC_CASE_VECTOR_ADDRESS
9127   if (flag_pic)
9128     index = PIC_CASE_VECTOR_ADDRESS (index);
9129   else
9130 #endif
9131     index = memory_address_noforce (CASE_VECTOR_MODE, index);
9132   temp = gen_reg_rtx (CASE_VECTOR_MODE);
9133   vector = gen_const_mem (CASE_VECTOR_MODE, index);
9134   convert_move (temp, vector, 0);
9135
9136   emit_jump_insn (gen_tablejump (temp, table_label));
9137
9138   /* If we are generating PIC code or if the table is PC-relative, the
9139      table and JUMP_INSN must be adjacent, so don't output a BARRIER.  */
9140   if (! CASE_VECTOR_PC_RELATIVE && ! flag_pic)
9141     emit_barrier ();
9142 }
9143
9144 int
9145 try_tablejump (tree index_type, tree index_expr, tree minval, tree range,
9146                rtx table_label, rtx default_label)
9147 {
9148   rtx index;
9149
9150   if (! HAVE_tablejump)
9151     return 0;
9152
9153   index_expr = fold_build2 (MINUS_EXPR, index_type,
9154                             convert (index_type, index_expr),
9155                             convert (index_type, minval));
9156   index = expand_expr (index_expr, NULL_RTX, VOIDmode, 0);
9157   do_pending_stack_adjust ();
9158
9159   do_tablejump (index, TYPE_MODE (index_type),
9160                 convert_modes (TYPE_MODE (index_type),
9161                                TYPE_MODE (TREE_TYPE (range)),
9162                                expand_expr (range, NULL_RTX,
9163                                             VOIDmode, 0),
9164                                TYPE_UNSIGNED (TREE_TYPE (range))),
9165                 table_label, default_label);
9166   return 1;
9167 }
9168
9169 /* Nonzero if the mode is a valid vector mode for this architecture.
9170    This returns nonzero even if there is no hardware support for the
9171    vector mode, but we can emulate with narrower modes.  */
9172
9173 int
9174 vector_mode_valid_p (enum machine_mode mode)
9175 {
9176   enum mode_class class = GET_MODE_CLASS (mode);
9177   enum machine_mode innermode;
9178
9179   /* Doh!  What's going on?  */
9180   if (class != MODE_VECTOR_INT
9181       && class != MODE_VECTOR_FLOAT)
9182     return 0;
9183
9184   /* Hardware support.  Woo hoo!  */
9185   if (targetm.vector_mode_supported_p (mode))
9186     return 1;
9187
9188   innermode = GET_MODE_INNER (mode);
9189
9190   /* We should probably return 1 if requesting V4DI and we have no DI,
9191      but we have V2DI, but this is probably very unlikely.  */
9192
9193   /* If we have support for the inner mode, we can safely emulate it.
9194      We may not have V2DI, but me can emulate with a pair of DIs.  */
9195   return targetm.scalar_mode_supported_p (innermode);
9196 }
9197
9198 /* Return a CONST_VECTOR rtx for a VECTOR_CST tree.  */
9199 static rtx
9200 const_vector_from_tree (tree exp)
9201 {
9202   rtvec v;
9203   int units, i;
9204   tree link, elt;
9205   enum machine_mode inner, mode;
9206
9207   mode = TYPE_MODE (TREE_TYPE (exp));
9208
9209   if (initializer_zerop (exp))
9210     return CONST0_RTX (mode);
9211
9212   units = GET_MODE_NUNITS (mode);
9213   inner = GET_MODE_INNER (mode);
9214
9215   v = rtvec_alloc (units);
9216
9217   link = TREE_VECTOR_CST_ELTS (exp);
9218   for (i = 0; link; link = TREE_CHAIN (link), ++i)
9219     {
9220       elt = TREE_VALUE (link);
9221
9222       if (TREE_CODE (elt) == REAL_CST)
9223         RTVEC_ELT (v, i) = CONST_DOUBLE_FROM_REAL_VALUE (TREE_REAL_CST (elt),
9224                                                          inner);
9225       else
9226         RTVEC_ELT (v, i) = immed_double_const (TREE_INT_CST_LOW (elt),
9227                                                TREE_INT_CST_HIGH (elt),
9228                                                inner);
9229     }
9230
9231   /* Initialize remaining elements to 0.  */
9232   for (; i < units; ++i)
9233     RTVEC_ELT (v, i) = CONST0_RTX (inner);
9234
9235   return gen_rtx_CONST_VECTOR (mode, v);
9236 }
9237 #include "gt-expr.h"