OSDN Git Service

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