OSDN Git Service

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