OSDN Git Service

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