OSDN Git Service

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