OSDN Git Service

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