OSDN Git Service

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