OSDN Git Service

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