OSDN Git Service

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