OSDN Git Service

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