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