OSDN Git Service

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