OSDN Git Service

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