OSDN Git Service

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