OSDN Git Service

* expr.c (store_constructor): Set RTX_UNCHANGING_P if readonly_field_p
[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.  */
5532
5533   if (mode == BLKmode
5534       && (GET_CODE (target) == REG || GET_CODE (target) == SUBREG))
5535     {
5536       rtx object
5537         = assign_temp
5538           (build_qualified_type (type, TYPE_QUALS (type) | TYPE_QUAL_CONST),
5539            0, 1, 1);
5540       rtx blk_object = adjust_address (object, BLKmode, 0);
5541
5542       if (bitsize != (HOST_WIDE_INT) GET_MODE_BITSIZE (GET_MODE (target)))
5543         emit_move_insn (object, target);
5544
5545       store_field (blk_object, bitsize, bitpos, mode, exp, VOIDmode, 0, type,
5546                    alias_set);
5547
5548       emit_move_insn (target, object);
5549
5550       /* We want to return the BLKmode version of the data.  */
5551       return blk_object;
5552     }
5553
5554   if (GET_CODE (target) == CONCAT)
5555     {
5556       /* We're storing into a struct containing a single __complex.  */
5557
5558       if (bitpos != 0)
5559         abort ();
5560       return store_expr (exp, target, 0);
5561     }
5562
5563   /* If the structure is in a register or if the component
5564      is a bit field, we cannot use addressing to access it.
5565      Use bit-field techniques or SUBREG to store in it.  */
5566
5567   if (mode == VOIDmode
5568       || (mode != BLKmode && ! direct_store[(int) mode]
5569           && GET_MODE_CLASS (mode) != MODE_COMPLEX_INT
5570           && GET_MODE_CLASS (mode) != MODE_COMPLEX_FLOAT)
5571       || GET_CODE (target) == REG
5572       || GET_CODE (target) == SUBREG
5573       /* If the field isn't aligned enough to store as an ordinary memref,
5574          store it as a bit field.  */
5575       || (mode != BLKmode
5576           && ((SLOW_UNALIGNED_ACCESS (mode, MEM_ALIGN (target))
5577                && (MEM_ALIGN (target) < GET_MODE_ALIGNMENT (mode)))
5578               || bitpos % GET_MODE_ALIGNMENT (mode)))
5579       /* If the RHS and field are a constant size and the size of the
5580          RHS isn't the same size as the bitfield, we must use bitfield
5581          operations.  */
5582       || (bitsize >= 0
5583           && TREE_CODE (TYPE_SIZE (TREE_TYPE (exp))) == INTEGER_CST
5584           && compare_tree_int (TYPE_SIZE (TREE_TYPE (exp)), bitsize) != 0))
5585     {
5586       rtx temp = expand_expr (exp, NULL_RTX, VOIDmode, 0);
5587
5588       /* If BITSIZE is narrower than the size of the type of EXP
5589          we will be narrowing TEMP.  Normally, what's wanted are the
5590          low-order bits.  However, if EXP's type is a record and this is
5591          big-endian machine, we want the upper BITSIZE bits.  */
5592       if (BYTES_BIG_ENDIAN && GET_MODE_CLASS (GET_MODE (temp)) == MODE_INT
5593           && bitsize < (HOST_WIDE_INT) GET_MODE_BITSIZE (GET_MODE (temp))
5594           && TREE_CODE (TREE_TYPE (exp)) == RECORD_TYPE)
5595         temp = expand_shift (RSHIFT_EXPR, GET_MODE (temp), temp,
5596                              size_int (GET_MODE_BITSIZE (GET_MODE (temp))
5597                                        - bitsize),
5598                              temp, 1);
5599
5600       /* Unless MODE is VOIDmode or BLKmode, convert TEMP to
5601          MODE.  */
5602       if (mode != VOIDmode && mode != BLKmode
5603           && mode != TYPE_MODE (TREE_TYPE (exp)))
5604         temp = convert_modes (mode, TYPE_MODE (TREE_TYPE (exp)), temp, 1);
5605
5606       /* If the modes of TARGET and TEMP are both BLKmode, both
5607          must be in memory and BITPOS must be aligned on a byte
5608          boundary.  If so, we simply do a block copy.  */
5609       if (GET_MODE (target) == BLKmode && GET_MODE (temp) == BLKmode)
5610         {
5611           if (GET_CODE (target) != MEM || GET_CODE (temp) != MEM
5612               || bitpos % BITS_PER_UNIT != 0)
5613             abort ();
5614
5615           target = adjust_address (target, VOIDmode, bitpos / BITS_PER_UNIT);
5616           emit_block_move (target, temp,
5617                            GEN_INT ((bitsize + BITS_PER_UNIT - 1)
5618                                     / BITS_PER_UNIT),
5619                            BLOCK_OP_NORMAL);
5620
5621           return value_mode == VOIDmode ? const0_rtx : target;
5622         }
5623
5624       /* Store the value in the bitfield.  */
5625       store_bit_field (target, bitsize, bitpos, mode, temp,
5626                        int_size_in_bytes (type));
5627
5628       if (value_mode != VOIDmode)
5629         {
5630           /* The caller wants an rtx for the value.
5631              If possible, avoid refetching from the bitfield itself.  */
5632           if (width_mask != 0
5633               && ! (GET_CODE (target) == MEM && MEM_VOLATILE_P (target)))
5634             {
5635               tree count;
5636               enum machine_mode tmode;
5637
5638               tmode = GET_MODE (temp);
5639               if (tmode == VOIDmode)
5640                 tmode = value_mode;
5641
5642               if (unsignedp)
5643                 return expand_and (tmode, temp,
5644                                    gen_int_mode (width_mask, tmode),
5645                                    NULL_RTX);
5646
5647               count = build_int_2 (GET_MODE_BITSIZE (tmode) - bitsize, 0);
5648               temp = expand_shift (LSHIFT_EXPR, tmode, temp, count, 0, 0);
5649               return expand_shift (RSHIFT_EXPR, tmode, temp, count, 0, 0);
5650             }
5651
5652           return extract_bit_field (target, bitsize, bitpos, unsignedp,
5653                                     NULL_RTX, value_mode, VOIDmode,
5654                                     int_size_in_bytes (type));
5655         }
5656       return const0_rtx;
5657     }
5658   else
5659     {
5660       rtx addr = XEXP (target, 0);
5661       rtx to_rtx = target;
5662
5663       /* If a value is wanted, it must be the lhs;
5664          so make the address stable for multiple use.  */
5665
5666       if (value_mode != VOIDmode && GET_CODE (addr) != REG
5667           && ! CONSTANT_ADDRESS_P (addr)
5668           /* A frame-pointer reference is already stable.  */
5669           && ! (GET_CODE (addr) == PLUS
5670                 && GET_CODE (XEXP (addr, 1)) == CONST_INT
5671                 && (XEXP (addr, 0) == virtual_incoming_args_rtx
5672                     || XEXP (addr, 0) == virtual_stack_vars_rtx)))
5673         to_rtx = replace_equiv_address (to_rtx, copy_to_reg (addr));
5674
5675       /* Now build a reference to just the desired component.  */
5676
5677       to_rtx = adjust_address (target, mode, bitpos / BITS_PER_UNIT);
5678
5679       if (to_rtx == target)
5680         to_rtx = copy_rtx (to_rtx);
5681
5682       MEM_SET_IN_STRUCT_P (to_rtx, 1);
5683       if (!MEM_KEEP_ALIAS_SET_P (to_rtx) && MEM_ALIAS_SET (to_rtx) != 0)
5684         set_mem_alias_set (to_rtx, alias_set);
5685
5686       return store_expr (exp, to_rtx, value_mode != VOIDmode);
5687     }
5688 }
5689 \f
5690 /* Given an expression EXP that may be a COMPONENT_REF, a BIT_FIELD_REF,
5691    an ARRAY_REF, or an ARRAY_RANGE_REF, look for nested operations of these
5692    codes and find the ultimate containing object, which we return.
5693
5694    We set *PBITSIZE to the size in bits that we want, *PBITPOS to the
5695    bit position, and *PUNSIGNEDP to the signedness of the field.
5696    If the position of the field is variable, we store a tree
5697    giving the variable offset (in units) in *POFFSET.
5698    This offset is in addition to the bit position.
5699    If the position is not variable, we store 0 in *POFFSET.
5700
5701    If any of the extraction expressions is volatile,
5702    we store 1 in *PVOLATILEP.  Otherwise we don't change that.
5703
5704    If the field is a bit-field, *PMODE is set to VOIDmode.  Otherwise, it
5705    is a mode that can be used to access the field.  In that case, *PBITSIZE
5706    is redundant.
5707
5708    If the field describes a variable-sized object, *PMODE is set to
5709    VOIDmode and *PBITSIZE is set to -1.  An access cannot be made in
5710    this case, but the address of the object can be found.  */
5711
5712 tree
5713 get_inner_reference (exp, pbitsize, pbitpos, poffset, pmode,
5714                      punsignedp, pvolatilep)
5715      tree exp;
5716      HOST_WIDE_INT *pbitsize;
5717      HOST_WIDE_INT *pbitpos;
5718      tree *poffset;
5719      enum machine_mode *pmode;
5720      int *punsignedp;
5721      int *pvolatilep;
5722 {
5723   tree size_tree = 0;
5724   enum machine_mode mode = VOIDmode;
5725   tree offset = size_zero_node;
5726   tree bit_offset = bitsize_zero_node;
5727   tree placeholder_ptr = 0;
5728   tree tem;
5729
5730   /* First get the mode, signedness, and size.  We do this from just the
5731      outermost expression.  */
5732   if (TREE_CODE (exp) == COMPONENT_REF)
5733     {
5734       size_tree = DECL_SIZE (TREE_OPERAND (exp, 1));
5735       if (! DECL_BIT_FIELD (TREE_OPERAND (exp, 1)))
5736         mode = DECL_MODE (TREE_OPERAND (exp, 1));
5737
5738       *punsignedp = TREE_UNSIGNED (TREE_OPERAND (exp, 1));
5739     }
5740   else if (TREE_CODE (exp) == BIT_FIELD_REF)
5741     {
5742       size_tree = TREE_OPERAND (exp, 1);
5743       *punsignedp = TREE_UNSIGNED (exp);
5744     }
5745   else
5746     {
5747       mode = TYPE_MODE (TREE_TYPE (exp));
5748       *punsignedp = TREE_UNSIGNED (TREE_TYPE (exp));
5749
5750       if (mode == BLKmode)
5751         size_tree = TYPE_SIZE (TREE_TYPE (exp));
5752       else
5753         *pbitsize = GET_MODE_BITSIZE (mode);
5754     }
5755
5756   if (size_tree != 0)
5757     {
5758       if (! host_integerp (size_tree, 1))
5759         mode = BLKmode, *pbitsize = -1;
5760       else
5761         *pbitsize = tree_low_cst (size_tree, 1);
5762     }
5763
5764   /* Compute cumulative bit-offset for nested component-refs and array-refs,
5765      and find the ultimate containing object.  */
5766   while (1)
5767     {
5768       if (TREE_CODE (exp) == BIT_FIELD_REF)
5769         bit_offset = size_binop (PLUS_EXPR, bit_offset, TREE_OPERAND (exp, 2));
5770       else if (TREE_CODE (exp) == COMPONENT_REF)
5771         {
5772           tree field = TREE_OPERAND (exp, 1);
5773           tree this_offset = DECL_FIELD_OFFSET (field);
5774
5775           /* If this field hasn't been filled in yet, don't go
5776              past it.  This should only happen when folding expressions
5777              made during type construction.  */
5778           if (this_offset == 0)
5779             break;
5780           else if (! TREE_CONSTANT (this_offset)
5781                    && contains_placeholder_p (this_offset))
5782             this_offset = build (WITH_RECORD_EXPR, sizetype, this_offset, exp);
5783
5784           offset = size_binop (PLUS_EXPR, offset, this_offset);
5785           bit_offset = size_binop (PLUS_EXPR, bit_offset,
5786                                    DECL_FIELD_BIT_OFFSET (field));
5787
5788           /* ??? Right now we don't do anything with DECL_OFFSET_ALIGN.  */
5789         }
5790
5791       else if (TREE_CODE (exp) == ARRAY_REF
5792                || TREE_CODE (exp) == ARRAY_RANGE_REF)
5793         {
5794           tree index = TREE_OPERAND (exp, 1);
5795           tree array = TREE_OPERAND (exp, 0);
5796           tree domain = TYPE_DOMAIN (TREE_TYPE (array));
5797           tree low_bound = (domain ? TYPE_MIN_VALUE (domain) : 0);
5798           tree unit_size = TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (array)));
5799
5800           /* We assume all arrays have sizes that are a multiple of a byte.
5801              First subtract the lower bound, if any, in the type of the
5802              index, then convert to sizetype and multiply by the size of the
5803              array element.  */
5804           if (low_bound != 0 && ! integer_zerop (low_bound))
5805             index = fold (build (MINUS_EXPR, TREE_TYPE (index),
5806                                  index, low_bound));
5807
5808           /* If the index has a self-referential type, pass it to a
5809              WITH_RECORD_EXPR; if the component size is, pass our
5810              component to one.  */
5811           if (! TREE_CONSTANT (index)
5812               && contains_placeholder_p (index))
5813             index = build (WITH_RECORD_EXPR, TREE_TYPE (index), index, exp);
5814           if (! TREE_CONSTANT (unit_size)
5815               && contains_placeholder_p (unit_size))
5816             unit_size = build (WITH_RECORD_EXPR, sizetype, unit_size, array);
5817
5818           offset = size_binop (PLUS_EXPR, offset,
5819                                size_binop (MULT_EXPR,
5820                                            convert (sizetype, index),
5821                                            unit_size));
5822         }
5823
5824       else if (TREE_CODE (exp) == PLACEHOLDER_EXPR)
5825         {
5826           tree new = find_placeholder (exp, &placeholder_ptr);
5827
5828           /* If we couldn't find the replacement, return the PLACEHOLDER_EXPR.
5829              We might have been called from tree optimization where we
5830              haven't set up an object yet.  */
5831           if (new == 0)
5832             break;
5833           else
5834             exp = new;
5835
5836           continue;
5837         }
5838       else if (TREE_CODE (exp) != NON_LVALUE_EXPR
5839                && TREE_CODE (exp) != VIEW_CONVERT_EXPR
5840                && ! ((TREE_CODE (exp) == NOP_EXPR
5841                       || TREE_CODE (exp) == CONVERT_EXPR)
5842                      && (TYPE_MODE (TREE_TYPE (exp))
5843                          == TYPE_MODE (TREE_TYPE (TREE_OPERAND (exp, 0))))))
5844         break;
5845
5846       /* If any reference in the chain is volatile, the effect is volatile.  */
5847       if (TREE_THIS_VOLATILE (exp))
5848         *pvolatilep = 1;
5849
5850       exp = TREE_OPERAND (exp, 0);
5851     }
5852
5853   /* If OFFSET is constant, see if we can return the whole thing as a
5854      constant bit position.  Otherwise, split it up.  */
5855   if (host_integerp (offset, 0)
5856       && 0 != (tem = size_binop (MULT_EXPR, convert (bitsizetype, offset),
5857                                  bitsize_unit_node))
5858       && 0 != (tem = size_binop (PLUS_EXPR, tem, bit_offset))
5859       && host_integerp (tem, 0))
5860     *pbitpos = tree_low_cst (tem, 0), *poffset = 0;
5861   else
5862     *pbitpos = tree_low_cst (bit_offset, 0), *poffset = offset;
5863
5864   *pmode = mode;
5865   return exp;
5866 }
5867
5868 /* Return 1 if T is an expression that get_inner_reference handles.  */
5869
5870 int
5871 handled_component_p (t)
5872      tree t;
5873 {
5874   switch (TREE_CODE (t))
5875     {
5876     case BIT_FIELD_REF:
5877     case COMPONENT_REF:
5878     case ARRAY_REF:
5879     case ARRAY_RANGE_REF:
5880     case NON_LVALUE_EXPR:
5881     case VIEW_CONVERT_EXPR:
5882       return 1;
5883
5884     case NOP_EXPR:
5885     case CONVERT_EXPR:
5886       return (TYPE_MODE (TREE_TYPE (t))
5887               == TYPE_MODE (TREE_TYPE (TREE_OPERAND (t, 0))));
5888
5889     default:
5890       return 0;
5891     }
5892 }
5893 \f
5894 /* Given an rtx VALUE that may contain additions and multiplications, return
5895    an equivalent value that just refers to a register, memory, or constant.
5896    This is done by generating instructions to perform the arithmetic and
5897    returning a pseudo-register containing the value.
5898
5899    The returned value may be a REG, SUBREG, MEM or constant.  */
5900
5901 rtx
5902 force_operand (value, target)
5903      rtx value, target;
5904 {
5905   rtx op1, op2;
5906   /* Use subtarget as the target for operand 0 of a binary operation.  */
5907   rtx subtarget = get_subtarget (target);
5908   enum rtx_code code = GET_CODE (value);
5909
5910   /* Check for a PIC address load.  */
5911   if ((code == PLUS || code == MINUS)
5912       && XEXP (value, 0) == pic_offset_table_rtx
5913       && (GET_CODE (XEXP (value, 1)) == SYMBOL_REF
5914           || GET_CODE (XEXP (value, 1)) == LABEL_REF
5915           || GET_CODE (XEXP (value, 1)) == CONST))
5916     {
5917       if (!subtarget)
5918         subtarget = gen_reg_rtx (GET_MODE (value));
5919       emit_move_insn (subtarget, value);
5920       return subtarget;
5921     }
5922
5923   if (code == ZERO_EXTEND || code == SIGN_EXTEND)
5924     {
5925       if (!target)
5926         target = gen_reg_rtx (GET_MODE (value));
5927       convert_move (target, force_operand (XEXP (value, 0), NULL),
5928                     code == ZERO_EXTEND);
5929       return target;
5930     }
5931
5932   if (GET_RTX_CLASS (code) == '2' || GET_RTX_CLASS (code) == 'c')
5933     {
5934       op2 = XEXP (value, 1);
5935       if (!CONSTANT_P (op2) && !(GET_CODE (op2) == REG && op2 != subtarget))
5936         subtarget = 0;
5937       if (code == MINUS && GET_CODE (op2) == CONST_INT)
5938         {
5939           code = PLUS;
5940           op2 = negate_rtx (GET_MODE (value), op2);
5941         }
5942
5943       /* Check for an addition with OP2 a constant integer and our first
5944          operand a PLUS of a virtual register and something else.  In that
5945          case, we want to emit the sum of the virtual register and the
5946          constant first and then add the other value.  This allows virtual
5947          register instantiation to simply modify the constant rather than
5948          creating another one around this addition.  */
5949       if (code == PLUS && GET_CODE (op2) == CONST_INT
5950           && GET_CODE (XEXP (value, 0)) == PLUS
5951           && GET_CODE (XEXP (XEXP (value, 0), 0)) == REG
5952           && REGNO (XEXP (XEXP (value, 0), 0)) >= FIRST_VIRTUAL_REGISTER
5953           && REGNO (XEXP (XEXP (value, 0), 0)) <= LAST_VIRTUAL_REGISTER)
5954         {
5955           rtx temp = expand_simple_binop (GET_MODE (value), code,
5956                                           XEXP (XEXP (value, 0), 0), op2,
5957                                           subtarget, 0, OPTAB_LIB_WIDEN);
5958           return expand_simple_binop (GET_MODE (value), code, temp,
5959                                       force_operand (XEXP (XEXP (value,
5960                                                                  0), 1), 0),
5961                                       target, 0, OPTAB_LIB_WIDEN);
5962         }
5963
5964       op1 = force_operand (XEXP (value, 0), subtarget);
5965       op2 = force_operand (op2, NULL_RTX);
5966       switch (code)
5967         {
5968         case MULT:
5969           return expand_mult (GET_MODE (value), op1, op2, target, 1);
5970         case DIV:
5971           if (!INTEGRAL_MODE_P (GET_MODE (value)))
5972             return expand_simple_binop (GET_MODE (value), code, op1, op2,
5973                                         target, 1, OPTAB_LIB_WIDEN);
5974           else
5975             return expand_divmod (0,
5976                                   FLOAT_MODE_P (GET_MODE (value))
5977                                   ? RDIV_EXPR : TRUNC_DIV_EXPR,
5978                                   GET_MODE (value), op1, op2, target, 0);
5979           break;
5980         case MOD:
5981           return expand_divmod (1, TRUNC_MOD_EXPR, GET_MODE (value), op1, op2,
5982                                 target, 0);
5983           break;
5984         case UDIV:
5985           return expand_divmod (0, TRUNC_DIV_EXPR, GET_MODE (value), op1, op2,
5986                                 target, 1);
5987           break;
5988         case UMOD:
5989           return expand_divmod (1, TRUNC_MOD_EXPR, GET_MODE (value), op1, op2,
5990                                 target, 1);
5991           break;
5992         case ASHIFTRT:
5993           return expand_simple_binop (GET_MODE (value), code, op1, op2,
5994                                       target, 0, OPTAB_LIB_WIDEN);
5995           break;
5996         default:
5997           return expand_simple_binop (GET_MODE (value), code, op1, op2,
5998                                       target, 1, OPTAB_LIB_WIDEN);
5999         }
6000     }
6001   if (GET_RTX_CLASS (code) == '1')
6002     {
6003       op1 = force_operand (XEXP (value, 0), NULL_RTX);
6004       return expand_simple_unop (GET_MODE (value), code, op1, target, 0);
6005     }
6006
6007 #ifdef INSN_SCHEDULING
6008   /* On machines that have insn scheduling, we want all memory reference to be
6009      explicit, so we need to deal with such paradoxical SUBREGs.  */
6010   if (GET_CODE (value) == SUBREG && GET_CODE (SUBREG_REG (value)) == MEM
6011       && (GET_MODE_SIZE (GET_MODE (value))
6012           > GET_MODE_SIZE (GET_MODE (SUBREG_REG (value)))))
6013     value
6014       = simplify_gen_subreg (GET_MODE (value),
6015                              force_reg (GET_MODE (SUBREG_REG (value)),
6016                                         force_operand (SUBREG_REG (value),
6017                                                        NULL_RTX)),
6018                              GET_MODE (SUBREG_REG (value)),
6019                              SUBREG_BYTE (value));
6020 #endif
6021
6022   return value;
6023 }
6024 \f
6025 /* Subroutine of expand_expr: return nonzero iff there is no way that
6026    EXP can reference X, which is being modified.  TOP_P is nonzero if this
6027    call is going to be used to determine whether we need a temporary
6028    for EXP, as opposed to a recursive call to this function.
6029
6030    It is always safe for this routine to return zero since it merely
6031    searches for optimization opportunities.  */
6032
6033 int
6034 safe_from_p (x, exp, top_p)
6035      rtx x;
6036      tree exp;
6037      int top_p;
6038 {
6039   rtx exp_rtl = 0;
6040   int i, nops;
6041   static tree save_expr_list;
6042
6043   if (x == 0
6044       /* If EXP has varying size, we MUST use a target since we currently
6045          have no way of allocating temporaries of variable size
6046          (except for arrays that have TYPE_ARRAY_MAX_SIZE set).
6047          So we assume here that something at a higher level has prevented a
6048          clash.  This is somewhat bogus, but the best we can do.  Only
6049          do this when X is BLKmode and when we are at the top level.  */
6050       || (top_p && TREE_TYPE (exp) != 0 && COMPLETE_TYPE_P (TREE_TYPE (exp))
6051           && TREE_CODE (TYPE_SIZE (TREE_TYPE (exp))) != INTEGER_CST
6052           && (TREE_CODE (TREE_TYPE (exp)) != ARRAY_TYPE
6053               || TYPE_ARRAY_MAX_SIZE (TREE_TYPE (exp)) == NULL_TREE
6054               || TREE_CODE (TYPE_ARRAY_MAX_SIZE (TREE_TYPE (exp)))
6055               != INTEGER_CST)
6056           && GET_MODE (x) == BLKmode)
6057       /* If X is in the outgoing argument area, it is always safe.  */
6058       || (GET_CODE (x) == MEM
6059           && (XEXP (x, 0) == virtual_outgoing_args_rtx
6060               || (GET_CODE (XEXP (x, 0)) == PLUS
6061                   && XEXP (XEXP (x, 0), 0) == virtual_outgoing_args_rtx))))
6062     return 1;
6063
6064   /* If this is a subreg of a hard register, declare it unsafe, otherwise,
6065      find the underlying pseudo.  */
6066   if (GET_CODE (x) == SUBREG)
6067     {
6068       x = SUBREG_REG (x);
6069       if (GET_CODE (x) == REG && REGNO (x) < FIRST_PSEUDO_REGISTER)
6070         return 0;
6071     }
6072
6073   /* A SAVE_EXPR might appear many times in the expression passed to the
6074      top-level safe_from_p call, and if it has a complex subexpression,
6075      examining it multiple times could result in a combinatorial explosion.
6076      E.g. on an Alpha running at least 200MHz, a Fortran test case compiled
6077      with optimization took about 28 minutes to compile -- even though it was
6078      only a few lines long.  So we mark each SAVE_EXPR we see with TREE_PRIVATE
6079      and turn that off when we are done.  We keep a list of the SAVE_EXPRs
6080      we have processed.  Note that the only test of top_p was above.  */
6081
6082   if (top_p)
6083     {
6084       int rtn;
6085       tree t;
6086
6087       save_expr_list = 0;
6088
6089       rtn = safe_from_p (x, exp, 0);
6090
6091       for (t = save_expr_list; t != 0; t = TREE_CHAIN (t))
6092         TREE_PRIVATE (TREE_PURPOSE (t)) = 0;
6093
6094       return rtn;
6095     }
6096
6097   /* Now look at our tree code and possibly recurse.  */
6098   switch (TREE_CODE_CLASS (TREE_CODE (exp)))
6099     {
6100     case 'd':
6101       exp_rtl = DECL_RTL_IF_SET (exp);
6102       break;
6103
6104     case 'c':
6105       return 1;
6106
6107     case 'x':
6108       if (TREE_CODE (exp) == TREE_LIST)
6109         {
6110           while (1)
6111             {
6112               if (TREE_VALUE (exp) && !safe_from_p (x, TREE_VALUE (exp), 0))
6113                 return 0;
6114               exp = TREE_CHAIN (exp);
6115               if (!exp)
6116                 return 1;
6117               if (TREE_CODE (exp) != TREE_LIST)
6118                 return safe_from_p (x, exp, 0);
6119             }
6120         }
6121       else if (TREE_CODE (exp) == ERROR_MARK)
6122         return 1;       /* An already-visited SAVE_EXPR? */
6123       else
6124         return 0;
6125
6126     case '2':
6127     case '<':
6128       if (!safe_from_p (x, TREE_OPERAND (exp, 1), 0))
6129         return 0;
6130       /* FALLTHRU */
6131
6132     case '1':
6133       return safe_from_p (x, TREE_OPERAND (exp, 0), 0);
6134
6135     case 'e':
6136     case 'r':
6137       /* Now do code-specific tests.  EXP_RTL is set to any rtx we find in
6138          the expression.  If it is set, we conflict iff we are that rtx or
6139          both are in memory.  Otherwise, we check all operands of the
6140          expression recursively.  */
6141
6142       switch (TREE_CODE (exp))
6143         {
6144         case ADDR_EXPR:
6145           /* If the operand is static or we are static, we can't conflict.
6146              Likewise if we don't conflict with the operand at all.  */
6147           if (staticp (TREE_OPERAND (exp, 0))
6148               || TREE_STATIC (exp)
6149               || safe_from_p (x, TREE_OPERAND (exp, 0), 0))
6150             return 1;
6151
6152           /* Otherwise, the only way this can conflict is if we are taking
6153              the address of a DECL a that address if part of X, which is
6154              very rare.  */
6155           exp = TREE_OPERAND (exp, 0);
6156           if (DECL_P (exp))
6157             {
6158               if (!DECL_RTL_SET_P (exp)
6159                   || GET_CODE (DECL_RTL (exp)) != MEM)
6160                 return 0;
6161               else
6162                 exp_rtl = XEXP (DECL_RTL (exp), 0);
6163             }
6164           break;
6165
6166         case INDIRECT_REF:
6167           if (GET_CODE (x) == MEM
6168               && alias_sets_conflict_p (MEM_ALIAS_SET (x),
6169                                         get_alias_set (exp)))
6170             return 0;
6171           break;
6172
6173         case CALL_EXPR:
6174           /* Assume that the call will clobber all hard registers and
6175              all of memory.  */
6176           if ((GET_CODE (x) == REG && REGNO (x) < FIRST_PSEUDO_REGISTER)
6177               || GET_CODE (x) == MEM)
6178             return 0;
6179           break;
6180
6181         case RTL_EXPR:
6182           /* If a sequence exists, we would have to scan every instruction
6183              in the sequence to see if it was safe.  This is probably not
6184              worthwhile.  */
6185           if (RTL_EXPR_SEQUENCE (exp))
6186             return 0;
6187
6188           exp_rtl = RTL_EXPR_RTL (exp);
6189           break;
6190
6191         case WITH_CLEANUP_EXPR:
6192           exp_rtl = WITH_CLEANUP_EXPR_RTL (exp);
6193           break;
6194
6195         case CLEANUP_POINT_EXPR:
6196           return safe_from_p (x, TREE_OPERAND (exp, 0), 0);
6197
6198         case SAVE_EXPR:
6199           exp_rtl = SAVE_EXPR_RTL (exp);
6200           if (exp_rtl)
6201             break;
6202
6203           /* If we've already scanned this, don't do it again.  Otherwise,
6204              show we've scanned it and record for clearing the flag if we're
6205              going on.  */
6206           if (TREE_PRIVATE (exp))
6207             return 1;
6208
6209           TREE_PRIVATE (exp) = 1;
6210           if (! safe_from_p (x, TREE_OPERAND (exp, 0), 0))
6211             {
6212               TREE_PRIVATE (exp) = 0;
6213               return 0;
6214             }
6215
6216           save_expr_list = tree_cons (exp, NULL_TREE, save_expr_list);
6217           return 1;
6218
6219         case BIND_EXPR:
6220           /* The only operand we look at is operand 1.  The rest aren't
6221              part of the expression.  */
6222           return safe_from_p (x, TREE_OPERAND (exp, 1), 0);
6223
6224         case METHOD_CALL_EXPR:
6225           /* This takes an rtx argument, but shouldn't appear here.  */
6226           abort ();
6227
6228         default:
6229           break;
6230         }
6231
6232       /* If we have an rtx, we do not need to scan our operands.  */
6233       if (exp_rtl)
6234         break;
6235
6236       nops = first_rtl_op (TREE_CODE (exp));
6237       for (i = 0; i < nops; i++)
6238         if (TREE_OPERAND (exp, i) != 0
6239             && ! safe_from_p (x, TREE_OPERAND (exp, i), 0))
6240           return 0;
6241
6242       /* If this is a language-specific tree code, it may require
6243          special handling.  */
6244       if ((unsigned int) TREE_CODE (exp)
6245           >= (unsigned int) LAST_AND_UNUSED_TREE_CODE
6246           && !(*lang_hooks.safe_from_p) (x, exp))
6247         return 0;
6248     }
6249
6250   /* If we have an rtl, find any enclosed object.  Then see if we conflict
6251      with it.  */
6252   if (exp_rtl)
6253     {
6254       if (GET_CODE (exp_rtl) == SUBREG)
6255         {
6256           exp_rtl = SUBREG_REG (exp_rtl);
6257           if (GET_CODE (exp_rtl) == REG
6258               && REGNO (exp_rtl) < FIRST_PSEUDO_REGISTER)
6259             return 0;
6260         }
6261
6262       /* If the rtl is X, then it is not safe.  Otherwise, it is unless both
6263          are memory and they conflict.  */
6264       return ! (rtx_equal_p (x, exp_rtl)
6265                 || (GET_CODE (x) == MEM && GET_CODE (exp_rtl) == MEM
6266                     && true_dependence (exp_rtl, VOIDmode, x,
6267                                         rtx_addr_varies_p)));
6268     }
6269
6270   /* If we reach here, it is safe.  */
6271   return 1;
6272 }
6273
6274 /* Subroutine of expand_expr: return rtx if EXP is a
6275    variable or parameter; else return 0.  */
6276
6277 static rtx
6278 var_rtx (exp)
6279      tree exp;
6280 {
6281   STRIP_NOPS (exp);
6282   switch (TREE_CODE (exp))
6283     {
6284     case PARM_DECL:
6285     case VAR_DECL:
6286       return DECL_RTL (exp);
6287     default:
6288       return 0;
6289     }
6290 }
6291
6292 #ifdef MAX_INTEGER_COMPUTATION_MODE
6293
6294 void
6295 check_max_integer_computation_mode (exp)
6296      tree exp;
6297 {
6298   enum tree_code code;
6299   enum machine_mode mode;
6300
6301   /* Strip any NOPs that don't change the mode.  */
6302   STRIP_NOPS (exp);
6303   code = TREE_CODE (exp);
6304
6305   /* We must allow conversions of constants to MAX_INTEGER_COMPUTATION_MODE.  */
6306   if (code == NOP_EXPR
6307       && TREE_CODE (TREE_OPERAND (exp, 0)) == INTEGER_CST)
6308     return;
6309
6310   /* First check the type of the overall operation.   We need only look at
6311      unary, binary and relational operations.  */
6312   if (TREE_CODE_CLASS (code) == '1'
6313       || TREE_CODE_CLASS (code) == '2'
6314       || TREE_CODE_CLASS (code) == '<')
6315     {
6316       mode = TYPE_MODE (TREE_TYPE (exp));
6317       if (GET_MODE_CLASS (mode) == MODE_INT
6318           && mode > MAX_INTEGER_COMPUTATION_MODE)
6319         internal_error ("unsupported wide integer operation");
6320     }
6321
6322   /* Check operand of a unary op.  */
6323   if (TREE_CODE_CLASS (code) == '1')
6324     {
6325       mode = TYPE_MODE (TREE_TYPE (TREE_OPERAND (exp, 0)));
6326       if (GET_MODE_CLASS (mode) == MODE_INT
6327           && mode > MAX_INTEGER_COMPUTATION_MODE)
6328         internal_error ("unsupported wide integer operation");
6329     }
6330
6331   /* Check operands of a binary/comparison op.  */
6332   if (TREE_CODE_CLASS (code) == '2' || TREE_CODE_CLASS (code) == '<')
6333     {
6334       mode = TYPE_MODE (TREE_TYPE (TREE_OPERAND (exp, 0)));
6335       if (GET_MODE_CLASS (mode) == MODE_INT
6336           && mode > MAX_INTEGER_COMPUTATION_MODE)
6337         internal_error ("unsupported wide integer operation");
6338
6339       mode = TYPE_MODE (TREE_TYPE (TREE_OPERAND (exp, 1)));
6340       if (GET_MODE_CLASS (mode) == MODE_INT
6341           && mode > MAX_INTEGER_COMPUTATION_MODE)
6342         internal_error ("unsupported wide integer operation");
6343     }
6344 }
6345 #endif
6346 \f
6347 /* Return the highest power of two that EXP is known to be a multiple of.
6348    This is used in updating alignment of MEMs in array references.  */
6349
6350 static unsigned HOST_WIDE_INT
6351 highest_pow2_factor (exp)
6352      tree exp;
6353 {
6354   unsigned HOST_WIDE_INT c0, c1;
6355
6356   switch (TREE_CODE (exp))
6357     {
6358     case INTEGER_CST:
6359       /* We can find the lowest bit that's a one.  If the low
6360          HOST_BITS_PER_WIDE_INT bits are zero, return BIGGEST_ALIGNMENT.
6361          We need to handle this case since we can find it in a COND_EXPR,
6362          a MIN_EXPR, or a MAX_EXPR.  If the constant overlows, we have an
6363          erroneous program, so return BIGGEST_ALIGNMENT to avoid any
6364          later ICE.  */
6365       if (TREE_CONSTANT_OVERFLOW (exp))
6366         return BIGGEST_ALIGNMENT;
6367       else
6368         {
6369           /* Note: tree_low_cst is intentionally not used here,
6370              we don't care about the upper bits.  */
6371           c0 = TREE_INT_CST_LOW (exp);
6372           c0 &= -c0;
6373           return c0 ? c0 : BIGGEST_ALIGNMENT;
6374         }
6375       break;
6376
6377     case PLUS_EXPR:  case MINUS_EXPR:  case MIN_EXPR:  case MAX_EXPR:
6378       c0 = highest_pow2_factor (TREE_OPERAND (exp, 0));
6379       c1 = highest_pow2_factor (TREE_OPERAND (exp, 1));
6380       return MIN (c0, c1);
6381
6382     case MULT_EXPR:
6383       c0 = highest_pow2_factor (TREE_OPERAND (exp, 0));
6384       c1 = highest_pow2_factor (TREE_OPERAND (exp, 1));
6385       return c0 * c1;
6386
6387     case ROUND_DIV_EXPR:  case TRUNC_DIV_EXPR:  case FLOOR_DIV_EXPR:
6388     case CEIL_DIV_EXPR:
6389       if (integer_pow2p (TREE_OPERAND (exp, 1))
6390           && host_integerp (TREE_OPERAND (exp, 1), 1))
6391         {
6392           c0 = highest_pow2_factor (TREE_OPERAND (exp, 0));
6393           c1 = tree_low_cst (TREE_OPERAND (exp, 1), 1);
6394           return MAX (1, c0 / c1);
6395         }
6396       break;
6397
6398     case NON_LVALUE_EXPR:  case NOP_EXPR:  case CONVERT_EXPR:
6399     case SAVE_EXPR: case WITH_RECORD_EXPR:
6400       return highest_pow2_factor (TREE_OPERAND (exp, 0));
6401
6402     case COMPOUND_EXPR:
6403       return highest_pow2_factor (TREE_OPERAND (exp, 1));
6404
6405     case COND_EXPR:
6406       c0 = highest_pow2_factor (TREE_OPERAND (exp, 1));
6407       c1 = highest_pow2_factor (TREE_OPERAND (exp, 2));
6408       return MIN (c0, c1);
6409
6410     default:
6411       break;
6412     }
6413
6414   return 1;
6415 }
6416
6417 /* Similar, except that it is known that the expression must be a multiple
6418    of the alignment of TYPE.  */
6419
6420 static unsigned HOST_WIDE_INT
6421 highest_pow2_factor_for_type (type, exp)
6422      tree type;
6423      tree exp;
6424 {
6425   unsigned HOST_WIDE_INT type_align, factor;
6426
6427   factor = highest_pow2_factor (exp);
6428   type_align = TYPE_ALIGN (type) / BITS_PER_UNIT;
6429   return MAX (factor, type_align);
6430 }
6431 \f
6432 /* Return an object on the placeholder list that matches EXP, a
6433    PLACEHOLDER_EXPR.  An object "matches" if it is of the type of the
6434    PLACEHOLDER_EXPR or a pointer type to it.  For further information, see
6435    tree.def.  If no such object is found, return 0.  If PLIST is nonzero, it
6436    is a location which initially points to a starting location in the
6437    placeholder list (zero means start of the list) and where a pointer into
6438    the placeholder list at which the object is found is placed.  */
6439
6440 tree
6441 find_placeholder (exp, plist)
6442      tree exp;
6443      tree *plist;
6444 {
6445   tree type = TREE_TYPE (exp);
6446   tree placeholder_expr;
6447
6448   for (placeholder_expr
6449        = plist && *plist ? TREE_CHAIN (*plist) : placeholder_list;
6450        placeholder_expr != 0;
6451        placeholder_expr = TREE_CHAIN (placeholder_expr))
6452     {
6453       tree need_type = TYPE_MAIN_VARIANT (type);
6454       tree elt;
6455
6456       /* Find the outermost reference that is of the type we want.  If none,
6457          see if any object has a type that is a pointer to the type we
6458          want.  */
6459       for (elt = TREE_PURPOSE (placeholder_expr); elt != 0;
6460            elt = ((TREE_CODE (elt) == COMPOUND_EXPR
6461                    || TREE_CODE (elt) == COND_EXPR)
6462                   ? TREE_OPERAND (elt, 1)
6463                   : (TREE_CODE_CLASS (TREE_CODE (elt)) == 'r'
6464                      || TREE_CODE_CLASS (TREE_CODE (elt)) == '1'
6465                      || TREE_CODE_CLASS (TREE_CODE (elt)) == '2'
6466                      || TREE_CODE_CLASS (TREE_CODE (elt)) == 'e')
6467                   ? TREE_OPERAND (elt, 0) : 0))
6468         if (TYPE_MAIN_VARIANT (TREE_TYPE (elt)) == need_type)
6469           {
6470             if (plist)
6471               *plist = placeholder_expr;
6472             return elt;
6473           }
6474
6475       for (elt = TREE_PURPOSE (placeholder_expr); elt != 0;
6476            elt
6477            = ((TREE_CODE (elt) == COMPOUND_EXPR
6478                || TREE_CODE (elt) == COND_EXPR)
6479               ? TREE_OPERAND (elt, 1)
6480               : (TREE_CODE_CLASS (TREE_CODE (elt)) == 'r'
6481                  || TREE_CODE_CLASS (TREE_CODE (elt)) == '1'
6482                  || TREE_CODE_CLASS (TREE_CODE (elt)) == '2'
6483                  || TREE_CODE_CLASS (TREE_CODE (elt)) == 'e')
6484               ? TREE_OPERAND (elt, 0) : 0))
6485         if (POINTER_TYPE_P (TREE_TYPE (elt))
6486             && (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (elt)))
6487                 == need_type))
6488           {
6489             if (plist)
6490               *plist = placeholder_expr;
6491             return build1 (INDIRECT_REF, need_type, elt);
6492           }
6493     }
6494
6495   return 0;
6496 }
6497 \f
6498 /* expand_expr: generate code for computing expression EXP.
6499    An rtx for the computed value is returned.  The value is never null.
6500    In the case of a void EXP, const0_rtx is returned.
6501
6502    The value may be stored in TARGET if TARGET is nonzero.
6503    TARGET is just a suggestion; callers must assume that
6504    the rtx returned may not be the same as TARGET.
6505
6506    If TARGET is CONST0_RTX, it means that the value will be ignored.
6507
6508    If TMODE is not VOIDmode, it suggests generating the
6509    result in mode TMODE.  But this is done only when convenient.
6510    Otherwise, TMODE is ignored and the value generated in its natural mode.
6511    TMODE is just a suggestion; callers must assume that
6512    the rtx returned may not have mode TMODE.
6513
6514    Note that TARGET may have neither TMODE nor MODE.  In that case, it
6515    probably will not be used.
6516
6517    If MODIFIER is EXPAND_SUM then when EXP is an addition
6518    we can return an rtx of the form (MULT (REG ...) (CONST_INT ...))
6519    or a nest of (PLUS ...) and (MINUS ...) where the terms are
6520    products as above, or REG or MEM, or constant.
6521    Ordinarily in such cases we would output mul or add instructions
6522    and then return a pseudo reg containing the sum.
6523
6524    EXPAND_INITIALIZER is much like EXPAND_SUM except that
6525    it also marks a label as absolutely required (it can't be dead).
6526    It also makes a ZERO_EXTEND or SIGN_EXTEND instead of emitting extend insns.
6527    This is used for outputting expressions used in initializers.
6528
6529    EXPAND_CONST_ADDRESS says that it is okay to return a MEM
6530    with a constant address even if that address is not normally legitimate.
6531    EXPAND_INITIALIZER and EXPAND_SUM also have this effect.
6532
6533    EXPAND_STACK_PARM is used when expanding to a TARGET on the stack for
6534    a call parameter.  Such targets require special care as we haven't yet
6535    marked TARGET so that it's safe from being trashed by libcalls.  We
6536    don't want to use TARGET for anything but the final result;
6537    Intermediate values must go elsewhere.   Additionally, calls to
6538    emit_block_move will be flagged with BLOCK_OP_CALL_PARM.  */
6539
6540 rtx
6541 expand_expr (exp, target, tmode, modifier)
6542      tree exp;
6543      rtx target;
6544      enum machine_mode tmode;
6545      enum expand_modifier modifier;
6546 {
6547   rtx op0, op1, temp;
6548   tree type = TREE_TYPE (exp);
6549   int unsignedp = TREE_UNSIGNED (type);
6550   enum machine_mode mode;
6551   enum tree_code code = TREE_CODE (exp);
6552   optab this_optab;
6553   rtx subtarget, original_target;
6554   int ignore;
6555   tree context;
6556
6557   /* Handle ERROR_MARK before anybody tries to access its type.  */
6558   if (TREE_CODE (exp) == ERROR_MARK || TREE_CODE (type) == ERROR_MARK)
6559     {
6560       op0 = CONST0_RTX (tmode);
6561       if (op0 != 0)
6562         return op0;
6563       return const0_rtx;
6564     }
6565
6566   mode = TYPE_MODE (type);
6567   /* Use subtarget as the target for operand 0 of a binary operation.  */
6568   subtarget = get_subtarget (target);
6569   original_target = target;
6570   ignore = (target == const0_rtx
6571             || ((code == NON_LVALUE_EXPR || code == NOP_EXPR
6572                  || code == CONVERT_EXPR || code == REFERENCE_EXPR
6573                  || code == COND_EXPR || code == VIEW_CONVERT_EXPR)
6574                 && TREE_CODE (type) == VOID_TYPE));
6575
6576   /* If we are going to ignore this result, we need only do something
6577      if there is a side-effect somewhere in the expression.  If there
6578      is, short-circuit the most common cases here.  Note that we must
6579      not call expand_expr with anything but const0_rtx in case this
6580      is an initial expansion of a size that contains a PLACEHOLDER_EXPR.  */
6581
6582   if (ignore)
6583     {
6584       if (! TREE_SIDE_EFFECTS (exp))
6585         return const0_rtx;
6586
6587       /* Ensure we reference a volatile object even if value is ignored, but
6588          don't do this if all we are doing is taking its address.  */
6589       if (TREE_THIS_VOLATILE (exp)
6590           && TREE_CODE (exp) != FUNCTION_DECL
6591           && mode != VOIDmode && mode != BLKmode
6592           && modifier != EXPAND_CONST_ADDRESS)
6593         {
6594           temp = expand_expr (exp, NULL_RTX, VOIDmode, modifier);
6595           if (GET_CODE (temp) == MEM)
6596             temp = copy_to_reg (temp);
6597           return const0_rtx;
6598         }
6599
6600       if (TREE_CODE_CLASS (code) == '1' || code == COMPONENT_REF
6601           || code == INDIRECT_REF || code == BUFFER_REF)
6602         return expand_expr (TREE_OPERAND (exp, 0), const0_rtx, VOIDmode,
6603                             modifier);
6604
6605       else if (TREE_CODE_CLASS (code) == '2' || TREE_CODE_CLASS (code) == '<'
6606                || code == ARRAY_REF || code == ARRAY_RANGE_REF)
6607         {
6608           expand_expr (TREE_OPERAND (exp, 0), const0_rtx, VOIDmode, modifier);
6609           expand_expr (TREE_OPERAND (exp, 1), const0_rtx, VOIDmode, modifier);
6610           return const0_rtx;
6611         }
6612       else if ((code == TRUTH_ANDIF_EXPR || code == TRUTH_ORIF_EXPR)
6613                && ! TREE_SIDE_EFFECTS (TREE_OPERAND (exp, 1)))
6614         /* If the second operand has no side effects, just evaluate
6615            the first.  */
6616         return expand_expr (TREE_OPERAND (exp, 0), const0_rtx, VOIDmode,
6617                             modifier);
6618       else if (code == BIT_FIELD_REF)
6619         {
6620           expand_expr (TREE_OPERAND (exp, 0), const0_rtx, VOIDmode, modifier);
6621           expand_expr (TREE_OPERAND (exp, 1), const0_rtx, VOIDmode, modifier);
6622           expand_expr (TREE_OPERAND (exp, 2), const0_rtx, VOIDmode, modifier);
6623           return const0_rtx;
6624         }
6625
6626       target = 0;
6627     }
6628
6629 #ifdef MAX_INTEGER_COMPUTATION_MODE
6630   /* Only check stuff here if the mode we want is different from the mode
6631      of the expression; if it's the same, check_max_integer_computation_mode
6632      will handle it.  Do we really need to check this stuff at all?  */
6633
6634   if (target
6635       && GET_MODE (target) != mode
6636       && TREE_CODE (exp) != INTEGER_CST
6637       && TREE_CODE (exp) != PARM_DECL
6638       && TREE_CODE (exp) != ARRAY_REF
6639       && TREE_CODE (exp) != ARRAY_RANGE_REF
6640       && TREE_CODE (exp) != COMPONENT_REF
6641       && TREE_CODE (exp) != BIT_FIELD_REF
6642       && TREE_CODE (exp) != INDIRECT_REF
6643       && TREE_CODE (exp) != CALL_EXPR
6644       && TREE_CODE (exp) != VAR_DECL
6645       && TREE_CODE (exp) != RTL_EXPR)
6646     {
6647       enum machine_mode mode = GET_MODE (target);
6648
6649       if (GET_MODE_CLASS (mode) == MODE_INT
6650           && mode > MAX_INTEGER_COMPUTATION_MODE)
6651         internal_error ("unsupported wide integer operation");
6652     }
6653
6654   if (tmode != mode
6655       && TREE_CODE (exp) != INTEGER_CST
6656       && TREE_CODE (exp) != PARM_DECL
6657       && TREE_CODE (exp) != ARRAY_REF
6658       && TREE_CODE (exp) != ARRAY_RANGE_REF
6659       && TREE_CODE (exp) != COMPONENT_REF
6660       && TREE_CODE (exp) != BIT_FIELD_REF
6661       && TREE_CODE (exp) != INDIRECT_REF
6662       && TREE_CODE (exp) != VAR_DECL
6663       && TREE_CODE (exp) != CALL_EXPR
6664       && TREE_CODE (exp) != RTL_EXPR
6665       && GET_MODE_CLASS (tmode) == MODE_INT
6666       && tmode > MAX_INTEGER_COMPUTATION_MODE)
6667     internal_error ("unsupported wide integer operation");
6668
6669   check_max_integer_computation_mode (exp);
6670 #endif
6671
6672   /* If will do cse, generate all results into pseudo registers
6673      since 1) that allows cse to find more things
6674      and 2) otherwise cse could produce an insn the machine
6675      cannot support.  An exception is a CONSTRUCTOR into a multi-word
6676      MEM: that's much more likely to be most efficient into the MEM.
6677      Another is a CALL_EXPR which must return in memory.  */
6678
6679   if (! cse_not_expected && mode != BLKmode && target
6680       && (GET_CODE (target) != REG || REGNO (target) < FIRST_PSEUDO_REGISTER)
6681       && ! (code == CONSTRUCTOR && GET_MODE_SIZE (mode) > UNITS_PER_WORD)
6682       && ! (code == CALL_EXPR && aggregate_value_p (exp)))
6683     target = 0;
6684
6685   switch (code)
6686     {
6687     case LABEL_DECL:
6688       {
6689         tree function = decl_function_context (exp);
6690         /* Handle using a label in a containing function.  */
6691         if (function != current_function_decl
6692             && function != inline_function_decl && function != 0)
6693           {
6694             struct function *p = find_function_data (function);
6695             p->expr->x_forced_labels
6696               = gen_rtx_EXPR_LIST (VOIDmode, label_rtx (exp),
6697                                    p->expr->x_forced_labels);
6698           }
6699         else
6700           {
6701             if (modifier == EXPAND_INITIALIZER)
6702               forced_labels = gen_rtx_EXPR_LIST (VOIDmode,
6703                                                  label_rtx (exp),
6704                                                  forced_labels);
6705           }
6706
6707         temp = gen_rtx_MEM (FUNCTION_MODE,
6708                             gen_rtx_LABEL_REF (Pmode, label_rtx (exp)));
6709         if (function != current_function_decl
6710             && function != inline_function_decl && function != 0)
6711           LABEL_REF_NONLOCAL_P (XEXP (temp, 0)) = 1;
6712         return temp;
6713       }
6714
6715     case PARM_DECL:
6716       if (!DECL_RTL_SET_P (exp))
6717         {
6718           error_with_decl (exp, "prior parameter's size depends on `%s'");
6719           return CONST0_RTX (mode);
6720         }
6721
6722       /* ... fall through ...  */
6723
6724     case VAR_DECL:
6725       /* If a static var's type was incomplete when the decl was written,
6726          but the type is complete now, lay out the decl now.  */
6727       if (DECL_SIZE (exp) == 0
6728           && COMPLETE_OR_UNBOUND_ARRAY_TYPE_P (TREE_TYPE (exp))
6729           && (TREE_STATIC (exp) || DECL_EXTERNAL (exp)))
6730         layout_decl (exp, 0);
6731
6732       /* ... fall through ...  */
6733
6734     case FUNCTION_DECL:
6735     case RESULT_DECL:
6736       if (DECL_RTL (exp) == 0)
6737         abort ();
6738
6739       /* Ensure variable marked as used even if it doesn't go through
6740          a parser.  If it hasn't be used yet, write out an external
6741          definition.  */
6742       if (! TREE_USED (exp))
6743         {
6744           assemble_external (exp);
6745           TREE_USED (exp) = 1;
6746         }
6747
6748       /* Show we haven't gotten RTL for this yet.  */
6749       temp = 0;
6750
6751       /* Handle variables inherited from containing functions.  */
6752       context = decl_function_context (exp);
6753
6754       /* We treat inline_function_decl as an alias for the current function
6755          because that is the inline function whose vars, types, etc.
6756          are being merged into the current function.
6757          See expand_inline_function.  */
6758
6759       if (context != 0 && context != current_function_decl
6760           && context != inline_function_decl
6761           /* If var is static, we don't need a static chain to access it.  */
6762           && ! (GET_CODE (DECL_RTL (exp)) == MEM
6763                 && CONSTANT_P (XEXP (DECL_RTL (exp), 0))))
6764         {
6765           rtx addr;
6766
6767           /* Mark as non-local and addressable.  */
6768           DECL_NONLOCAL (exp) = 1;
6769           if (DECL_NO_STATIC_CHAIN (current_function_decl))
6770             abort ();
6771           (*lang_hooks.mark_addressable) (exp);
6772           if (GET_CODE (DECL_RTL (exp)) != MEM)
6773             abort ();
6774           addr = XEXP (DECL_RTL (exp), 0);
6775           if (GET_CODE (addr) == MEM)
6776             addr
6777               = replace_equiv_address (addr,
6778                                        fix_lexical_addr (XEXP (addr, 0), exp));
6779           else
6780             addr = fix_lexical_addr (addr, exp);
6781
6782           temp = replace_equiv_address (DECL_RTL (exp), addr);
6783         }
6784
6785       /* This is the case of an array whose size is to be determined
6786          from its initializer, while the initializer is still being parsed.
6787          See expand_decl.  */
6788
6789       else if (GET_CODE (DECL_RTL (exp)) == MEM
6790                && GET_CODE (XEXP (DECL_RTL (exp), 0)) == REG)
6791         temp = validize_mem (DECL_RTL (exp));
6792
6793       /* If DECL_RTL is memory, we are in the normal case and either
6794          the address is not valid or it is not a register and -fforce-addr
6795          is specified, get the address into a register.  */
6796
6797       else if (GET_CODE (DECL_RTL (exp)) == MEM
6798                && modifier != EXPAND_CONST_ADDRESS
6799                && modifier != EXPAND_SUM
6800                && modifier != EXPAND_INITIALIZER
6801                && (! memory_address_p (DECL_MODE (exp),
6802                                        XEXP (DECL_RTL (exp), 0))
6803                    || (flag_force_addr
6804                        && GET_CODE (XEXP (DECL_RTL (exp), 0)) != REG)))
6805         temp = replace_equiv_address (DECL_RTL (exp),
6806                                       copy_rtx (XEXP (DECL_RTL (exp), 0)));
6807
6808       /* If we got something, return it.  But first, set the alignment
6809          if the address is a register.  */
6810       if (temp != 0)
6811         {
6812           if (GET_CODE (temp) == MEM && GET_CODE (XEXP (temp, 0)) == REG)
6813             mark_reg_pointer (XEXP (temp, 0), DECL_ALIGN (exp));
6814
6815           return temp;
6816         }
6817
6818       /* If the mode of DECL_RTL does not match that of the decl, it
6819          must be a promoted value.  We return a SUBREG of the wanted mode,
6820          but mark it so that we know that it was already extended.  */
6821
6822       if (GET_CODE (DECL_RTL (exp)) == REG
6823           && GET_MODE (DECL_RTL (exp)) != DECL_MODE (exp))
6824         {
6825           /* Get the signedness used for this variable.  Ensure we get the
6826              same mode we got when the variable was declared.  */
6827           if (GET_MODE (DECL_RTL (exp))
6828               != promote_mode (type, DECL_MODE (exp), &unsignedp,
6829                                (TREE_CODE (exp) == RESULT_DECL ? 1 : 0)))
6830             abort ();
6831
6832           temp = gen_lowpart_SUBREG (mode, DECL_RTL (exp));
6833           SUBREG_PROMOTED_VAR_P (temp) = 1;
6834           SUBREG_PROMOTED_UNSIGNED_SET (temp, unsignedp);
6835           return temp;
6836         }
6837
6838       return DECL_RTL (exp);
6839
6840     case INTEGER_CST:
6841       temp = immed_double_const (TREE_INT_CST_LOW (exp),
6842                                  TREE_INT_CST_HIGH (exp), mode);
6843
6844       /* ??? If overflow is set, fold will have done an incomplete job,
6845          which can result in (plus xx (const_int 0)), which can get
6846          simplified by validate_replace_rtx during virtual register
6847          instantiation, which can result in unrecognizable insns.
6848          Avoid this by forcing all overflows into registers.  */
6849       if (TREE_CONSTANT_OVERFLOW (exp)
6850           && modifier != EXPAND_INITIALIZER)
6851         temp = force_reg (mode, temp);
6852
6853       return temp;
6854
6855     case VECTOR_CST:
6856       return const_vector_from_tree (exp);
6857
6858     case CONST_DECL:
6859       return expand_expr (DECL_INITIAL (exp), target, VOIDmode, modifier);
6860
6861     case REAL_CST:
6862       /* If optimized, generate immediate CONST_DOUBLE
6863          which will be turned into memory by reload if necessary.
6864
6865          We used to force a register so that loop.c could see it.  But
6866          this does not allow gen_* patterns to perform optimizations with
6867          the constants.  It also produces two insns in cases like "x = 1.0;".
6868          On most machines, floating-point constants are not permitted in
6869          many insns, so we'd end up copying it to a register in any case.
6870
6871          Now, we do the copying in expand_binop, if appropriate.  */
6872       return CONST_DOUBLE_FROM_REAL_VALUE (TREE_REAL_CST (exp),
6873                                            TYPE_MODE (TREE_TYPE (exp)));
6874
6875     case COMPLEX_CST:
6876     case STRING_CST:
6877       if (! TREE_CST_RTL (exp))
6878         output_constant_def (exp, 1);
6879
6880       /* TREE_CST_RTL probably contains a constant address.
6881          On RISC machines where a constant address isn't valid,
6882          make some insns to get that address into a register.  */
6883       if (GET_CODE (TREE_CST_RTL (exp)) == MEM
6884           && modifier != EXPAND_CONST_ADDRESS
6885           && modifier != EXPAND_INITIALIZER
6886           && modifier != EXPAND_SUM
6887           && (! memory_address_p (mode, XEXP (TREE_CST_RTL (exp), 0))
6888               || (flag_force_addr
6889                   && GET_CODE (XEXP (TREE_CST_RTL (exp), 0)) != REG)))
6890         return replace_equiv_address (TREE_CST_RTL (exp),
6891                                       copy_rtx (XEXP (TREE_CST_RTL (exp), 0)));
6892       return TREE_CST_RTL (exp);
6893
6894     case EXPR_WITH_FILE_LOCATION:
6895       {
6896         rtx to_return;
6897         const char *saved_input_filename = input_filename;
6898         int saved_lineno = lineno;
6899         input_filename = EXPR_WFL_FILENAME (exp);
6900         lineno = EXPR_WFL_LINENO (exp);
6901         if (EXPR_WFL_EMIT_LINE_NOTE (exp))
6902           emit_line_note (input_filename, lineno);
6903         /* Possibly avoid switching back and forth here.  */
6904         to_return = expand_expr (EXPR_WFL_NODE (exp), target, tmode, modifier);
6905         input_filename = saved_input_filename;
6906         lineno = saved_lineno;
6907         return to_return;
6908       }
6909
6910     case SAVE_EXPR:
6911       context = decl_function_context (exp);
6912
6913       /* If this SAVE_EXPR was at global context, assume we are an
6914          initialization function and move it into our context.  */
6915       if (context == 0)
6916         SAVE_EXPR_CONTEXT (exp) = current_function_decl;
6917
6918       /* We treat inline_function_decl as an alias for the current function
6919          because that is the inline function whose vars, types, etc.
6920          are being merged into the current function.
6921          See expand_inline_function.  */
6922       if (context == current_function_decl || context == inline_function_decl)
6923         context = 0;
6924
6925       /* If this is non-local, handle it.  */
6926       if (context)
6927         {
6928           /* The following call just exists to abort if the context is
6929              not of a containing function.  */
6930           find_function_data (context);
6931
6932           temp = SAVE_EXPR_RTL (exp);
6933           if (temp && GET_CODE (temp) == REG)
6934             {
6935               put_var_into_stack (exp, /*rescan=*/true);
6936               temp = SAVE_EXPR_RTL (exp);
6937             }
6938           if (temp == 0 || GET_CODE (temp) != MEM)
6939             abort ();
6940           return
6941             replace_equiv_address (temp,
6942                                    fix_lexical_addr (XEXP (temp, 0), exp));
6943         }
6944       if (SAVE_EXPR_RTL (exp) == 0)
6945         {
6946           if (mode == VOIDmode)
6947             temp = const0_rtx;
6948           else
6949             temp = assign_temp (build_qualified_type (type,
6950                                                       (TYPE_QUALS (type)
6951                                                        | TYPE_QUAL_CONST)),
6952                                 3, 0, 0);
6953
6954           SAVE_EXPR_RTL (exp) = temp;
6955           if (!optimize && GET_CODE (temp) == REG)
6956             save_expr_regs = gen_rtx_EXPR_LIST (VOIDmode, temp,
6957                                                 save_expr_regs);
6958
6959           /* If the mode of TEMP does not match that of the expression, it
6960              must be a promoted value.  We pass store_expr a SUBREG of the
6961              wanted mode but mark it so that we know that it was already
6962              extended.  */
6963
6964           if (GET_CODE (temp) == REG && GET_MODE (temp) != mode)
6965             {
6966               temp = gen_lowpart_SUBREG (mode, SAVE_EXPR_RTL (exp));
6967               promote_mode (type, mode, &unsignedp, 0);
6968               SUBREG_PROMOTED_VAR_P (temp) = 1;
6969               SUBREG_PROMOTED_UNSIGNED_SET (temp, unsignedp);
6970             }
6971
6972           if (temp == const0_rtx)
6973             expand_expr (TREE_OPERAND (exp, 0), const0_rtx, VOIDmode, 0);
6974           else
6975             store_expr (TREE_OPERAND (exp, 0), temp,
6976                         modifier == EXPAND_STACK_PARM ? 2 : 0);
6977
6978           TREE_USED (exp) = 1;
6979         }
6980
6981       /* If the mode of SAVE_EXPR_RTL does not match that of the expression, it
6982          must be a promoted value.  We return a SUBREG of the wanted mode,
6983          but mark it so that we know that it was already extended.  */
6984
6985       if (GET_CODE (SAVE_EXPR_RTL (exp)) == REG
6986           && GET_MODE (SAVE_EXPR_RTL (exp)) != mode)
6987         {
6988           /* Compute the signedness and make the proper SUBREG.  */
6989           promote_mode (type, mode, &unsignedp, 0);
6990           temp = gen_lowpart_SUBREG (mode, SAVE_EXPR_RTL (exp));
6991           SUBREG_PROMOTED_VAR_P (temp) = 1;
6992           SUBREG_PROMOTED_UNSIGNED_SET (temp, unsignedp);
6993           return temp;
6994         }
6995
6996       return SAVE_EXPR_RTL (exp);
6997
6998     case UNSAVE_EXPR:
6999       {
7000         rtx temp;
7001         temp = expand_expr (TREE_OPERAND (exp, 0), target, tmode, modifier);
7002         TREE_OPERAND (exp, 0)
7003           = (*lang_hooks.unsave_expr_now) (TREE_OPERAND (exp, 0));
7004         return temp;
7005       }
7006
7007     case PLACEHOLDER_EXPR:
7008       {
7009         tree old_list = placeholder_list;
7010         tree placeholder_expr = 0;
7011
7012         exp = find_placeholder (exp, &placeholder_expr);
7013         if (exp == 0)
7014           abort ();
7015
7016         placeholder_list = TREE_CHAIN (placeholder_expr);
7017         temp = expand_expr (exp, original_target, tmode, modifier);
7018         placeholder_list = old_list;
7019         return temp;
7020       }
7021
7022     case WITH_RECORD_EXPR:
7023       /* Put the object on the placeholder list, expand our first operand,
7024          and pop the list.  */
7025       placeholder_list = tree_cons (TREE_OPERAND (exp, 1), NULL_TREE,
7026                                     placeholder_list);
7027       target = expand_expr (TREE_OPERAND (exp, 0), original_target, tmode,
7028                             modifier);
7029       placeholder_list = TREE_CHAIN (placeholder_list);
7030       return target;
7031
7032     case GOTO_EXPR:
7033       if (TREE_CODE (TREE_OPERAND (exp, 0)) == LABEL_DECL)
7034         expand_goto (TREE_OPERAND (exp, 0));
7035       else
7036         expand_computed_goto (TREE_OPERAND (exp, 0));
7037       return const0_rtx;
7038
7039     case EXIT_EXPR:
7040       expand_exit_loop_if_false (NULL,
7041                                  invert_truthvalue (TREE_OPERAND (exp, 0)));
7042       return const0_rtx;
7043
7044     case LABELED_BLOCK_EXPR:
7045       if (LABELED_BLOCK_BODY (exp))
7046         expand_expr_stmt_value (LABELED_BLOCK_BODY (exp), 0, 1);
7047       /* Should perhaps use expand_label, but this is simpler and safer.  */
7048       do_pending_stack_adjust ();
7049       emit_label (label_rtx (LABELED_BLOCK_LABEL (exp)));
7050       return const0_rtx;
7051
7052     case EXIT_BLOCK_EXPR:
7053       if (EXIT_BLOCK_RETURN (exp))
7054         sorry ("returned value in block_exit_expr");
7055       expand_goto (LABELED_BLOCK_LABEL (EXIT_BLOCK_LABELED_BLOCK (exp)));
7056       return const0_rtx;
7057
7058     case LOOP_EXPR:
7059       push_temp_slots ();
7060       expand_start_loop (1);
7061       expand_expr_stmt_value (TREE_OPERAND (exp, 0), 0, 1);
7062       expand_end_loop ();
7063       pop_temp_slots ();
7064
7065       return const0_rtx;
7066
7067     case BIND_EXPR:
7068       {
7069         tree vars = TREE_OPERAND (exp, 0);
7070
7071         /* Need to open a binding contour here because
7072            if there are any cleanups they must be contained here.  */
7073         expand_start_bindings (2);
7074
7075         /* Mark the corresponding BLOCK for output in its proper place.  */
7076         if (TREE_OPERAND (exp, 2) != 0
7077             && ! TREE_USED (TREE_OPERAND (exp, 2)))
7078           (*lang_hooks.decls.insert_block) (TREE_OPERAND (exp, 2));
7079
7080         /* If VARS have not yet been expanded, expand them now.  */
7081         while (vars)
7082           {
7083             if (!DECL_RTL_SET_P (vars))
7084               expand_decl (vars);
7085             expand_decl_init (vars);
7086             vars = TREE_CHAIN (vars);
7087           }
7088
7089         temp = expand_expr (TREE_OPERAND (exp, 1), target, tmode, modifier);
7090
7091         expand_end_bindings (TREE_OPERAND (exp, 0), 0, 0);
7092
7093         return temp;
7094       }
7095
7096     case RTL_EXPR:
7097       if (RTL_EXPR_SEQUENCE (exp))
7098         {
7099           if (RTL_EXPR_SEQUENCE (exp) == const0_rtx)
7100             abort ();
7101           emit_insn (RTL_EXPR_SEQUENCE (exp));
7102           RTL_EXPR_SEQUENCE (exp) = const0_rtx;
7103         }
7104       preserve_rtl_expr_result (RTL_EXPR_RTL (exp));
7105       free_temps_for_rtl_expr (exp);
7106       return RTL_EXPR_RTL (exp);
7107
7108     case CONSTRUCTOR:
7109       /* If we don't need the result, just ensure we evaluate any
7110          subexpressions.  */
7111       if (ignore)
7112         {
7113           tree elt;
7114
7115           for (elt = CONSTRUCTOR_ELTS (exp); elt; elt = TREE_CHAIN (elt))
7116             expand_expr (TREE_VALUE (elt), const0_rtx, VOIDmode, 0);
7117
7118           return const0_rtx;
7119         }
7120
7121       /* All elts simple constants => refer to a constant in memory.  But
7122          if this is a non-BLKmode mode, let it store a field at a time
7123          since that should make a CONST_INT or CONST_DOUBLE when we
7124          fold.  Likewise, if we have a target we can use, it is best to
7125          store directly into the target unless the type is large enough
7126          that memcpy will be used.  If we are making an initializer and
7127          all operands are constant, put it in memory as well.
7128
7129         FIXME: Avoid trying to fill vector constructors piece-meal.
7130         Output them with output_constant_def below unless we're sure
7131         they're zeros.  This should go away when vector initializers
7132         are treated like VECTOR_CST instead of arrays.
7133       */
7134       else if ((TREE_STATIC (exp)
7135                 && ((mode == BLKmode
7136                      && ! (target != 0 && safe_from_p (target, exp, 1)))
7137                     || TREE_ADDRESSABLE (exp)
7138                     || (host_integerp (TYPE_SIZE_UNIT (type), 1)
7139                         && (! MOVE_BY_PIECES_P
7140                             (tree_low_cst (TYPE_SIZE_UNIT (type), 1),
7141                              TYPE_ALIGN (type)))
7142                         && ((TREE_CODE (type) == VECTOR_TYPE
7143                              && !is_zeros_p (exp))
7144                             || ! mostly_zeros_p (exp)))))
7145                || (modifier == EXPAND_INITIALIZER && TREE_CONSTANT (exp)))
7146         {
7147           rtx constructor = output_constant_def (exp, 1);
7148
7149           if (modifier != EXPAND_CONST_ADDRESS
7150               && modifier != EXPAND_INITIALIZER
7151               && modifier != EXPAND_SUM)
7152             constructor = validize_mem (constructor);
7153
7154           return constructor;
7155         }
7156       else
7157         {
7158           /* Handle calls that pass values in multiple non-contiguous
7159              locations.  The Irix 6 ABI has examples of this.  */
7160           if (target == 0 || ! safe_from_p (target, exp, 1)
7161               || GET_CODE (target) == PARALLEL
7162               || modifier == EXPAND_STACK_PARM)
7163             target
7164               = assign_temp (build_qualified_type (type,
7165                                                    (TYPE_QUALS (type)
7166                                                     | (TREE_READONLY (exp)
7167                                                        * TYPE_QUAL_CONST))),
7168                              0, TREE_ADDRESSABLE (exp), 1);
7169
7170           store_constructor (exp, target, 0, int_expr_size (exp));
7171           return target;
7172         }
7173
7174     case INDIRECT_REF:
7175       {
7176         tree exp1 = TREE_OPERAND (exp, 0);
7177         tree index;
7178         tree string = string_constant (exp1, &index);
7179
7180         /* Try to optimize reads from const strings.  */
7181         if (string
7182             && TREE_CODE (string) == STRING_CST
7183             && TREE_CODE (index) == INTEGER_CST
7184             && compare_tree_int (index, TREE_STRING_LENGTH (string)) < 0
7185             && GET_MODE_CLASS (mode) == MODE_INT
7186             && GET_MODE_SIZE (mode) == 1
7187             && modifier != EXPAND_WRITE)
7188           return gen_int_mode (TREE_STRING_POINTER (string)
7189                                [TREE_INT_CST_LOW (index)], mode);
7190
7191         op0 = expand_expr (exp1, NULL_RTX, VOIDmode, EXPAND_SUM);
7192         op0 = memory_address (mode, op0);
7193         temp = gen_rtx_MEM (mode, op0);
7194         set_mem_attributes (temp, exp, 0);
7195
7196         /* If we are writing to this object and its type is a record with
7197            readonly fields, we must mark it as readonly so it will
7198            conflict with readonly references to those fields.  */
7199         if (modifier == EXPAND_WRITE && readonly_fields_p (type))
7200           RTX_UNCHANGING_P (temp) = 1;
7201
7202         return temp;
7203       }
7204
7205     case ARRAY_REF:
7206       if (TREE_CODE (TREE_TYPE (TREE_OPERAND (exp, 0))) != ARRAY_TYPE)
7207         abort ();
7208
7209       {
7210         tree array = TREE_OPERAND (exp, 0);
7211         tree domain = TYPE_DOMAIN (TREE_TYPE (array));
7212         tree low_bound = domain ? TYPE_MIN_VALUE (domain) : integer_zero_node;
7213         tree index = convert (sizetype, TREE_OPERAND (exp, 1));
7214         HOST_WIDE_INT i;
7215
7216         /* Optimize the special-case of a zero lower bound.
7217
7218            We convert the low_bound to sizetype to avoid some problems
7219            with constant folding.  (E.g. suppose the lower bound is 1,
7220            and its mode is QI.  Without the conversion,  (ARRAY
7221            +(INDEX-(unsigned char)1)) becomes ((ARRAY+(-(unsigned char)1))
7222            +INDEX), which becomes (ARRAY+255+INDEX).  Oops!)  */
7223
7224         if (! integer_zerop (low_bound))
7225           index = size_diffop (index, convert (sizetype, low_bound));
7226
7227         /* Fold an expression like: "foo"[2].
7228            This is not done in fold so it won't happen inside &.
7229            Don't fold if this is for wide characters since it's too
7230            difficult to do correctly and this is a very rare case.  */
7231
7232         if (modifier != EXPAND_CONST_ADDRESS && modifier != EXPAND_INITIALIZER
7233             && TREE_CODE (array) == STRING_CST
7234             && TREE_CODE (index) == INTEGER_CST
7235             && compare_tree_int (index, TREE_STRING_LENGTH (array)) < 0
7236             && GET_MODE_CLASS (mode) == MODE_INT
7237             && GET_MODE_SIZE (mode) == 1)
7238           return gen_int_mode (TREE_STRING_POINTER (array)
7239                                [TREE_INT_CST_LOW (index)], mode);
7240
7241         /* If this is a constant index into a constant array,
7242            just get the value from the array.  Handle both the cases when
7243            we have an explicit constructor and when our operand is a variable
7244            that was declared const.  */
7245
7246         if (modifier != EXPAND_CONST_ADDRESS && modifier != EXPAND_INITIALIZER
7247             && TREE_CODE (array) == CONSTRUCTOR && ! TREE_SIDE_EFFECTS (array)
7248             && TREE_CODE (index) == INTEGER_CST
7249             && 0 > compare_tree_int (index,
7250                                      list_length (CONSTRUCTOR_ELTS
7251                                                   (TREE_OPERAND (exp, 0)))))
7252           {
7253             tree elem;
7254
7255             for (elem = CONSTRUCTOR_ELTS (TREE_OPERAND (exp, 0)),
7256                  i = TREE_INT_CST_LOW (index);
7257                  elem != 0 && i != 0; i--, elem = TREE_CHAIN (elem))
7258               ;
7259
7260             if (elem)
7261               return expand_expr (fold (TREE_VALUE (elem)), target, tmode,
7262                                   modifier);
7263           }
7264
7265         else if (optimize >= 1
7266                  && modifier != EXPAND_CONST_ADDRESS
7267                  && modifier != EXPAND_INITIALIZER
7268                  && TREE_READONLY (array) && ! TREE_SIDE_EFFECTS (array)
7269                  && TREE_CODE (array) == VAR_DECL && DECL_INITIAL (array)
7270                  && TREE_CODE (DECL_INITIAL (array)) != ERROR_MARK)
7271           {
7272             if (TREE_CODE (index) == INTEGER_CST)
7273               {
7274                 tree init = DECL_INITIAL (array);
7275
7276                 if (TREE_CODE (init) == CONSTRUCTOR)
7277                   {
7278                     tree elem;
7279
7280                     for (elem = CONSTRUCTOR_ELTS (init);
7281                          (elem
7282                           && !tree_int_cst_equal (TREE_PURPOSE (elem), index));
7283                          elem = TREE_CHAIN (elem))
7284                       ;
7285
7286                     if (elem && !TREE_SIDE_EFFECTS (TREE_VALUE (elem)))
7287                       return expand_expr (fold (TREE_VALUE (elem)), target,
7288                                           tmode, modifier);
7289                   }
7290                 else if (TREE_CODE (init) == STRING_CST
7291                          && 0 > compare_tree_int (index,
7292                                                   TREE_STRING_LENGTH (init)))
7293                   {
7294                     tree type = TREE_TYPE (TREE_TYPE (init));
7295                     enum machine_mode mode = TYPE_MODE (type);
7296
7297                     if (GET_MODE_CLASS (mode) == MODE_INT
7298                         && GET_MODE_SIZE (mode) == 1)
7299                       return gen_int_mode (TREE_STRING_POINTER (init)
7300                                            [TREE_INT_CST_LOW (index)], mode);
7301                   }
7302               }
7303           }
7304       }
7305       /* Fall through.  */
7306
7307     case COMPONENT_REF:
7308     case BIT_FIELD_REF:
7309     case ARRAY_RANGE_REF:
7310       /* If the operand is a CONSTRUCTOR, we can just extract the
7311          appropriate field if it is present.  Don't do this if we have
7312          already written the data since we want to refer to that copy
7313          and varasm.c assumes that's what we'll do.  */
7314       if (code == COMPONENT_REF
7315           && TREE_CODE (TREE_OPERAND (exp, 0)) == CONSTRUCTOR
7316           && TREE_CST_RTL (TREE_OPERAND (exp, 0)) == 0)
7317         {
7318           tree elt;
7319
7320           for (elt = CONSTRUCTOR_ELTS (TREE_OPERAND (exp, 0)); elt;
7321                elt = TREE_CHAIN (elt))
7322             if (TREE_PURPOSE (elt) == TREE_OPERAND (exp, 1)
7323                 /* We can normally use the value of the field in the
7324                    CONSTRUCTOR.  However, if this is a bitfield in
7325                    an integral mode that we can fit in a HOST_WIDE_INT,
7326                    we must mask only the number of bits in the bitfield,
7327                    since this is done implicitly by the constructor.  If
7328                    the bitfield does not meet either of those conditions,
7329                    we can't do this optimization.  */
7330                 && (! DECL_BIT_FIELD (TREE_PURPOSE (elt))
7331                     || ((GET_MODE_CLASS (DECL_MODE (TREE_PURPOSE (elt)))
7332                          == MODE_INT)
7333                         && (GET_MODE_BITSIZE (DECL_MODE (TREE_PURPOSE (elt)))
7334                             <= HOST_BITS_PER_WIDE_INT))))
7335               {
7336                 if (DECL_BIT_FIELD (TREE_PURPOSE (elt))
7337                     && modifier == EXPAND_STACK_PARM)
7338                   target = 0;
7339                 op0 = expand_expr (TREE_VALUE (elt), target, tmode, modifier);
7340                 if (DECL_BIT_FIELD (TREE_PURPOSE (elt)))
7341                   {
7342                     HOST_WIDE_INT bitsize
7343                       = TREE_INT_CST_LOW (DECL_SIZE (TREE_PURPOSE (elt)));
7344                     enum machine_mode imode
7345                       = TYPE_MODE (TREE_TYPE (TREE_PURPOSE (elt)));
7346
7347                     if (TREE_UNSIGNED (TREE_TYPE (TREE_PURPOSE (elt))))
7348                       {
7349                         op1 = GEN_INT (((HOST_WIDE_INT) 1 << bitsize) - 1);
7350                         op0 = expand_and (imode, op0, op1, target);
7351                       }
7352                     else
7353                       {
7354                         tree count
7355                           = build_int_2 (GET_MODE_BITSIZE (imode) - bitsize,
7356                                          0);
7357
7358                         op0 = expand_shift (LSHIFT_EXPR, imode, op0, count,
7359                                             target, 0);
7360                         op0 = expand_shift (RSHIFT_EXPR, imode, op0, count,
7361                                             target, 0);
7362                       }
7363                   }
7364
7365                 return op0;
7366               }
7367         }
7368
7369       {
7370         enum machine_mode mode1;
7371         HOST_WIDE_INT bitsize, bitpos;
7372         tree offset;
7373         int volatilep = 0;
7374         tree tem = get_inner_reference (exp, &bitsize, &bitpos, &offset,
7375                                         &mode1, &unsignedp, &volatilep);
7376         rtx orig_op0;
7377
7378         /* If we got back the original object, something is wrong.  Perhaps
7379            we are evaluating an expression too early.  In any event, don't
7380            infinitely recurse.  */
7381         if (tem == exp)
7382           abort ();
7383
7384         /* If TEM's type is a union of variable size, pass TARGET to the inner
7385            computation, since it will need a temporary and TARGET is known
7386            to have to do.  This occurs in unchecked conversion in Ada.  */
7387
7388         orig_op0 = op0
7389           = expand_expr (tem,
7390                          (TREE_CODE (TREE_TYPE (tem)) == UNION_TYPE
7391                           && (TREE_CODE (TYPE_SIZE (TREE_TYPE (tem)))
7392                               != INTEGER_CST)
7393                           && modifier != EXPAND_STACK_PARM
7394                           ? target : NULL_RTX),
7395                          VOIDmode,
7396                          (modifier == EXPAND_INITIALIZER
7397                           || modifier == EXPAND_CONST_ADDRESS
7398                           || modifier == EXPAND_STACK_PARM)
7399                          ? modifier : EXPAND_NORMAL);
7400
7401         /* If this is a constant, put it into a register if it is a
7402            legitimate constant and OFFSET is 0 and memory if it isn't.  */
7403         if (CONSTANT_P (op0))
7404           {
7405             enum machine_mode mode = TYPE_MODE (TREE_TYPE (tem));
7406             if (mode != BLKmode && LEGITIMATE_CONSTANT_P (op0)
7407                 && offset == 0)
7408               op0 = force_reg (mode, op0);
7409             else
7410               op0 = validize_mem (force_const_mem (mode, op0));
7411           }
7412
7413         if (offset != 0)
7414           {
7415             rtx offset_rtx = expand_expr (offset, NULL_RTX, VOIDmode,
7416                                           EXPAND_SUM);
7417
7418             /* If this object is in a register, put it into memory.
7419                This case can't occur in C, but can in Ada if we have
7420                unchecked conversion of an expression from a scalar type to
7421                an array or record type.  */
7422             if (GET_CODE (op0) == REG || GET_CODE (op0) == SUBREG
7423                 || GET_CODE (op0) == CONCAT || GET_CODE (op0) == ADDRESSOF)
7424               {
7425                 /* If the operand is a SAVE_EXPR, we can deal with this by
7426                    forcing the SAVE_EXPR into memory.  */
7427                 if (TREE_CODE (TREE_OPERAND (exp, 0)) == SAVE_EXPR)
7428                   {
7429                     put_var_into_stack (TREE_OPERAND (exp, 0), 
7430                                         /*rescan=*/true);
7431                     op0 = SAVE_EXPR_RTL (TREE_OPERAND (exp, 0));
7432                   }
7433                 else
7434                   {
7435                     tree nt
7436                       = build_qualified_type (TREE_TYPE (tem),
7437                                               (TYPE_QUALS (TREE_TYPE (tem))
7438                                                | TYPE_QUAL_CONST));
7439                     rtx memloc = assign_temp (nt, 1, 1, 1);
7440
7441                     emit_move_insn (memloc, op0);
7442                     op0 = memloc;
7443                   }
7444               }
7445
7446             if (GET_CODE (op0) != MEM)
7447               abort ();
7448
7449 #ifdef POINTERS_EXTEND_UNSIGNED
7450             if (GET_MODE (offset_rtx) != Pmode)
7451               offset_rtx = convert_to_mode (Pmode, offset_rtx, 0);
7452 #else
7453             if (GET_MODE (offset_rtx) != ptr_mode)
7454               offset_rtx = convert_to_mode (ptr_mode, offset_rtx, 0);
7455 #endif
7456
7457             /* A constant address in OP0 can have VOIDmode, we must not try
7458                to call force_reg for that case.  Avoid that case.  */
7459             if (GET_CODE (op0) == MEM
7460                 && GET_MODE (op0) == BLKmode
7461                 && GET_MODE (XEXP (op0, 0)) != VOIDmode
7462                 && bitsize != 0
7463                 && (bitpos % bitsize) == 0
7464                 && (bitsize % GET_MODE_ALIGNMENT (mode1)) == 0
7465                 && MEM_ALIGN (op0) == GET_MODE_ALIGNMENT (mode1))
7466               {
7467                 op0 = adjust_address (op0, mode1, bitpos / BITS_PER_UNIT);
7468                 bitpos = 0;
7469               }
7470
7471             op0 = offset_address (op0, offset_rtx,
7472                                   highest_pow2_factor (offset));
7473           }
7474
7475         /* If OFFSET is making OP0 more aligned than BIGGEST_ALIGNMENT,
7476            record its alignment as BIGGEST_ALIGNMENT.  */
7477         if (GET_CODE (op0) == MEM && bitpos == 0 && offset != 0
7478             && is_aligning_offset (offset, tem))
7479           set_mem_align (op0, BIGGEST_ALIGNMENT);
7480
7481         /* Don't forget about volatility even if this is a bitfield.  */
7482         if (GET_CODE (op0) == MEM && volatilep && ! MEM_VOLATILE_P (op0))
7483           {
7484             if (op0 == orig_op0)
7485               op0 = copy_rtx (op0);
7486
7487             MEM_VOLATILE_P (op0) = 1;
7488           }
7489
7490         /* The following code doesn't handle CONCAT.
7491            Assume only bitpos == 0 can be used for CONCAT, due to
7492            one element arrays having the same mode as its element.  */
7493         if (GET_CODE (op0) == CONCAT)
7494           {
7495             if (bitpos != 0 || bitsize != GET_MODE_BITSIZE (GET_MODE (op0)))
7496               abort ();
7497             return op0;
7498           }
7499
7500         /* In cases where an aligned union has an unaligned object
7501            as a field, we might be extracting a BLKmode value from
7502            an integer-mode (e.g., SImode) object.  Handle this case
7503            by doing the extract into an object as wide as the field
7504            (which we know to be the width of a basic mode), then
7505            storing into memory, and changing the mode to BLKmode.  */
7506         if (mode1 == VOIDmode
7507             || GET_CODE (op0) == REG || GET_CODE (op0) == SUBREG
7508             || (mode1 != BLKmode && ! direct_load[(int) mode1]
7509                 && GET_MODE_CLASS (mode) != MODE_COMPLEX_INT
7510                 && GET_MODE_CLASS (mode) != MODE_COMPLEX_FLOAT
7511                 && modifier != EXPAND_CONST_ADDRESS
7512                 && modifier != EXPAND_INITIALIZER)
7513             /* If the field isn't aligned enough to fetch as a memref,
7514                fetch it as a bit field.  */
7515             || (mode1 != BLKmode
7516                 && ((TYPE_ALIGN (TREE_TYPE (tem)) < GET_MODE_ALIGNMENT (mode)
7517                      && SLOW_UNALIGNED_ACCESS (mode1, MEM_ALIGN (op0)))
7518                     || (bitpos % GET_MODE_ALIGNMENT (mode) != 0)))
7519             /* If the type and the field are a constant size and the
7520                size of the type isn't the same size as the bitfield,
7521                we must use bitfield operations.  */
7522             || (bitsize >= 0
7523                 && (TREE_CODE (TYPE_SIZE (TREE_TYPE (exp)))
7524                     == INTEGER_CST)
7525                 && 0 != compare_tree_int (TYPE_SIZE (TREE_TYPE (exp)),
7526                                           bitsize)))
7527           {
7528             enum machine_mode ext_mode = mode;
7529
7530             if (ext_mode == BLKmode
7531                 && ! (target != 0 && GET_CODE (op0) == MEM
7532                       && GET_CODE (target) == MEM
7533                       && bitpos % BITS_PER_UNIT == 0))
7534               ext_mode = mode_for_size (bitsize, MODE_INT, 1);
7535
7536             if (ext_mode == BLKmode)
7537               {
7538                 /* In this case, BITPOS must start at a byte boundary and
7539                    TARGET, if specified, must be a MEM.  */
7540                 if (GET_CODE (op0) != MEM
7541                     || (target != 0 && GET_CODE (target) != MEM)
7542                     || bitpos % BITS_PER_UNIT != 0)
7543                   abort ();
7544
7545                 op0 = adjust_address (op0, VOIDmode, bitpos / BITS_PER_UNIT);
7546                 if (target == 0)
7547                   target = assign_temp (type, 0, 1, 1);
7548
7549                 emit_block_move (target, op0,
7550                                  GEN_INT ((bitsize + BITS_PER_UNIT - 1)
7551                                           / BITS_PER_UNIT),
7552                                  (modifier == EXPAND_STACK_PARM
7553                                   ? BLOCK_OP_CALL_PARM : BLOCK_OP_NORMAL));
7554
7555                 return target;
7556               }
7557
7558             op0 = validize_mem (op0);
7559
7560             if (GET_CODE (op0) == MEM && GET_CODE (XEXP (op0, 0)) == REG)
7561               mark_reg_pointer (XEXP (op0, 0), MEM_ALIGN (op0));
7562
7563             op0 = extract_bit_field (op0, bitsize, bitpos, unsignedp,
7564                                      (modifier == EXPAND_STACK_PARM
7565                                       ? NULL_RTX : target),
7566                                      ext_mode, ext_mode,
7567                                      int_size_in_bytes (TREE_TYPE (tem)));
7568
7569             /* If the result is a record type and BITSIZE is narrower than
7570                the mode of OP0, an integral mode, and this is a big endian
7571                machine, we must put the field into the high-order bits.  */
7572             if (TREE_CODE (type) == RECORD_TYPE && BYTES_BIG_ENDIAN
7573                 && GET_MODE_CLASS (GET_MODE (op0)) == MODE_INT
7574                 && bitsize < (HOST_WIDE_INT) GET_MODE_BITSIZE (GET_MODE (op0)))
7575               op0 = expand_shift (LSHIFT_EXPR, GET_MODE (op0), op0,
7576                                   size_int (GET_MODE_BITSIZE (GET_MODE (op0))
7577                                             - bitsize),
7578                                   op0, 1);
7579
7580             if (mode == BLKmode)
7581               {
7582                 rtx new = assign_temp (build_qualified_type
7583                                        ((*lang_hooks.types.type_for_mode)
7584                                         (ext_mode, 0),
7585                                         TYPE_QUAL_CONST), 0, 1, 1);
7586
7587                 emit_move_insn (new, op0);
7588                 op0 = copy_rtx (new);
7589                 PUT_MODE (op0, BLKmode);
7590                 set_mem_attributes (op0, exp, 1);
7591               }
7592
7593             return op0;
7594           }
7595
7596         /* If the result is BLKmode, use that to access the object
7597            now as well.  */
7598         if (mode == BLKmode)
7599           mode1 = BLKmode;
7600
7601         /* Get a reference to just this component.  */
7602         if (modifier == EXPAND_CONST_ADDRESS
7603             || modifier == EXPAND_SUM || modifier == EXPAND_INITIALIZER)
7604           op0 = adjust_address_nv (op0, mode1, bitpos / BITS_PER_UNIT);
7605         else
7606           op0 = adjust_address (op0, mode1, bitpos / BITS_PER_UNIT);
7607
7608         if (op0 == orig_op0)
7609           op0 = copy_rtx (op0);
7610
7611         set_mem_attributes (op0, exp, 0);
7612         if (GET_CODE (XEXP (op0, 0)) == REG)
7613           mark_reg_pointer (XEXP (op0, 0), MEM_ALIGN (op0));
7614
7615         MEM_VOLATILE_P (op0) |= volatilep;
7616         if (mode == mode1 || mode1 == BLKmode || mode1 == tmode
7617             || modifier == EXPAND_CONST_ADDRESS
7618             || modifier == EXPAND_INITIALIZER)
7619           return op0;
7620         else if (target == 0)
7621           target = gen_reg_rtx (tmode != VOIDmode ? tmode : mode);
7622
7623         convert_move (target, op0, unsignedp);
7624         return target;
7625       }
7626
7627     case VTABLE_REF:
7628       {
7629         rtx insn, before = get_last_insn (), vtbl_ref;
7630
7631         /* Evaluate the interior expression.  */
7632         subtarget = expand_expr (TREE_OPERAND (exp, 0), target,
7633                                  tmode, modifier);
7634
7635         /* Get or create an instruction off which to hang a note.  */
7636         if (REG_P (subtarget))
7637           {
7638             target = subtarget;
7639             insn = get_last_insn ();
7640             if (insn == before)
7641               abort ();
7642             if (! INSN_P (insn))
7643               insn = prev_nonnote_insn (insn);
7644           }
7645         else
7646           {
7647             target = gen_reg_rtx (GET_MODE (subtarget));
7648             insn = emit_move_insn (target, subtarget);
7649           }
7650
7651         /* Collect the data for the note.  */
7652         vtbl_ref = XEXP (DECL_RTL (TREE_OPERAND (exp, 1)), 0);
7653         vtbl_ref = plus_constant (vtbl_ref,
7654                                   tree_low_cst (TREE_OPERAND (exp, 2), 0));
7655         /* Discard the initial CONST that was added.  */
7656         vtbl_ref = XEXP (vtbl_ref, 0);
7657
7658         REG_NOTES (insn)
7659           = gen_rtx_EXPR_LIST (REG_VTABLE_REF, vtbl_ref, REG_NOTES (insn));
7660
7661         return target;
7662       }
7663
7664       /* Intended for a reference to a buffer of a file-object in Pascal.
7665          But it's not certain that a special tree code will really be
7666          necessary for these.  INDIRECT_REF might work for them.  */
7667     case BUFFER_REF:
7668       abort ();
7669
7670     case IN_EXPR:
7671       {
7672         /* Pascal set IN expression.
7673
7674            Algorithm:
7675                rlo       = set_low - (set_low%bits_per_word);
7676                the_word  = set [ (index - rlo)/bits_per_word ];
7677                bit_index = index % bits_per_word;
7678                bitmask   = 1 << bit_index;
7679                return !!(the_word & bitmask);  */
7680
7681         tree set = TREE_OPERAND (exp, 0);
7682         tree index = TREE_OPERAND (exp, 1);
7683         int iunsignedp = TREE_UNSIGNED (TREE_TYPE (index));
7684         tree set_type = TREE_TYPE (set);
7685         tree set_low_bound = TYPE_MIN_VALUE (TYPE_DOMAIN (set_type));
7686         tree set_high_bound = TYPE_MAX_VALUE (TYPE_DOMAIN (set_type));
7687         rtx index_val = expand_expr (index, 0, VOIDmode, 0);
7688         rtx lo_r = expand_expr (set_low_bound, 0, VOIDmode, 0);
7689         rtx hi_r = expand_expr (set_high_bound, 0, VOIDmode, 0);
7690         rtx setval = expand_expr (set, 0, VOIDmode, 0);
7691         rtx setaddr = XEXP (setval, 0);
7692         enum machine_mode index_mode = TYPE_MODE (TREE_TYPE (index));
7693         rtx rlow;
7694         rtx diff, quo, rem, addr, bit, result;
7695
7696         /* If domain is empty, answer is no.  Likewise if index is constant
7697            and out of bounds.  */
7698         if (((TREE_CODE (set_high_bound) == INTEGER_CST
7699              && TREE_CODE (set_low_bound) == INTEGER_CST
7700              && tree_int_cst_lt (set_high_bound, set_low_bound))
7701              || (TREE_CODE (index) == INTEGER_CST
7702                  && TREE_CODE (set_low_bound) == INTEGER_CST
7703                  && tree_int_cst_lt (index, set_low_bound))
7704              || (TREE_CODE (set_high_bound) == INTEGER_CST
7705                  && TREE_CODE (index) == INTEGER_CST
7706                  && tree_int_cst_lt (set_high_bound, index))))
7707           return const0_rtx;
7708
7709         if (target == 0)
7710           target = gen_reg_rtx (tmode != VOIDmode ? tmode : mode);
7711
7712         /* If we get here, we have to generate the code for both cases
7713            (in range and out of range).  */
7714
7715         op0 = gen_label_rtx ();
7716         op1 = gen_label_rtx ();
7717
7718         if (! (GET_CODE (index_val) == CONST_INT
7719                && GET_CODE (lo_r) == CONST_INT))
7720           emit_cmp_and_jump_insns (index_val, lo_r, LT, NULL_RTX,
7721                                    GET_MODE (index_val), iunsignedp, op1);
7722
7723         if (! (GET_CODE (index_val) == CONST_INT
7724                && GET_CODE (hi_r) == CONST_INT))
7725           emit_cmp_and_jump_insns (index_val, hi_r, GT, NULL_RTX,
7726                                    GET_MODE (index_val), iunsignedp, op1);
7727
7728         /* Calculate the element number of bit zero in the first word
7729            of the set.  */
7730         if (GET_CODE (lo_r) == CONST_INT)
7731           rlow = GEN_INT (INTVAL (lo_r)
7732                           & ~((HOST_WIDE_INT) 1 << BITS_PER_UNIT));
7733         else
7734           rlow = expand_binop (index_mode, and_optab, lo_r,
7735                                GEN_INT (~((HOST_WIDE_INT) 1 << BITS_PER_UNIT)),
7736                                NULL_RTX, iunsignedp, OPTAB_LIB_WIDEN);
7737
7738         diff = expand_binop (index_mode, sub_optab, index_val, rlow,
7739                              NULL_RTX, iunsignedp, OPTAB_LIB_WIDEN);
7740
7741         quo = expand_divmod (0, TRUNC_DIV_EXPR, index_mode, diff,
7742                              GEN_INT (BITS_PER_UNIT), NULL_RTX, iunsignedp);
7743         rem = expand_divmod (1, TRUNC_MOD_EXPR, index_mode, index_val,
7744                              GEN_INT (BITS_PER_UNIT), NULL_RTX, iunsignedp);
7745
7746         addr = memory_address (byte_mode,
7747                                expand_binop (index_mode, add_optab, diff,
7748                                              setaddr, NULL_RTX, iunsignedp,
7749                                              OPTAB_LIB_WIDEN));
7750
7751         /* Extract the bit we want to examine.  */
7752         bit = expand_shift (RSHIFT_EXPR, byte_mode,
7753                             gen_rtx_MEM (byte_mode, addr),
7754                             make_tree (TREE_TYPE (index), rem),
7755                             NULL_RTX, 1);
7756         result = expand_binop (byte_mode, and_optab, bit, const1_rtx,
7757                                GET_MODE (target) == byte_mode ? target : 0,
7758                                1, OPTAB_LIB_WIDEN);
7759
7760         if (result != target)
7761           convert_move (target, result, 1);
7762
7763         /* Output the code to handle the out-of-range case.  */
7764         emit_jump (op0);
7765         emit_label (op1);
7766         emit_move_insn (target, const0_rtx);
7767         emit_label (op0);
7768         return target;
7769       }
7770
7771     case WITH_CLEANUP_EXPR:
7772       if (WITH_CLEANUP_EXPR_RTL (exp) == 0)
7773         {
7774           WITH_CLEANUP_EXPR_RTL (exp)
7775             = expand_expr (TREE_OPERAND (exp, 0), target, tmode, modifier);
7776           expand_decl_cleanup_eh (NULL_TREE, TREE_OPERAND (exp, 1),
7777                                   CLEANUP_EH_ONLY (exp));
7778
7779           /* That's it for this cleanup.  */
7780           TREE_OPERAND (exp, 1) = 0;
7781         }
7782       return WITH_CLEANUP_EXPR_RTL (exp);
7783
7784     case CLEANUP_POINT_EXPR:
7785       {
7786         /* Start a new binding layer that will keep track of all cleanup
7787            actions to be performed.  */
7788         expand_start_bindings (2);
7789
7790         target_temp_slot_level = temp_slot_level;
7791
7792         op0 = expand_expr (TREE_OPERAND (exp, 0), target, tmode, modifier);
7793         /* If we're going to use this value, load it up now.  */
7794         if (! ignore)
7795           op0 = force_not_mem (op0);
7796         preserve_temp_slots (op0);
7797         expand_end_bindings (NULL_TREE, 0, 0);
7798       }
7799       return op0;
7800
7801     case CALL_EXPR:
7802       /* Check for a built-in function.  */
7803       if (TREE_CODE (TREE_OPERAND (exp, 0)) == ADDR_EXPR
7804           && (TREE_CODE (TREE_OPERAND (TREE_OPERAND (exp, 0), 0))
7805               == FUNCTION_DECL)
7806           && DECL_BUILT_IN (TREE_OPERAND (TREE_OPERAND (exp, 0), 0)))
7807         {
7808           if (DECL_BUILT_IN_CLASS (TREE_OPERAND (TREE_OPERAND (exp, 0), 0))
7809               == BUILT_IN_FRONTEND)
7810             return (*lang_hooks.expand_expr) (exp, original_target,
7811                                               tmode, modifier);
7812           else
7813             return expand_builtin (exp, target, subtarget, tmode, ignore);
7814         }
7815
7816       return expand_call (exp, target, ignore);
7817
7818     case NON_LVALUE_EXPR:
7819     case NOP_EXPR:
7820     case CONVERT_EXPR:
7821     case REFERENCE_EXPR:
7822       if (TREE_OPERAND (exp, 0) == error_mark_node)
7823         return const0_rtx;
7824
7825       if (TREE_CODE (type) == UNION_TYPE)
7826         {
7827           tree valtype = TREE_TYPE (TREE_OPERAND (exp, 0));
7828
7829           /* If both input and output are BLKmode, this conversion isn't doing
7830              anything except possibly changing memory attribute.  */
7831           if (mode == BLKmode && TYPE_MODE (valtype) == BLKmode)
7832             {
7833               rtx result = expand_expr (TREE_OPERAND (exp, 0), target, tmode,
7834                                         modifier);
7835
7836               result = copy_rtx (result);
7837               set_mem_attributes (result, exp, 0);
7838               return result;
7839             }
7840
7841           if (target == 0)
7842             target = assign_temp (type, 0, 1, 1);
7843
7844           if (GET_CODE (target) == MEM)
7845             /* Store data into beginning of memory target.  */
7846             store_expr (TREE_OPERAND (exp, 0),
7847                         adjust_address (target, TYPE_MODE (valtype), 0),
7848                         modifier == EXPAND_STACK_PARM ? 2 : 0);
7849
7850           else if (GET_CODE (target) == REG)
7851             /* Store this field into a union of the proper type.  */
7852             store_field (target,
7853                          MIN ((int_size_in_bytes (TREE_TYPE
7854                                                   (TREE_OPERAND (exp, 0)))
7855                                * BITS_PER_UNIT),
7856                               (HOST_WIDE_INT) GET_MODE_BITSIZE (mode)),
7857                          0, TYPE_MODE (valtype), TREE_OPERAND (exp, 0),
7858                          VOIDmode, 0, type, 0);
7859           else
7860             abort ();
7861
7862           /* Return the entire union.  */
7863           return target;
7864         }
7865
7866       if (mode == TYPE_MODE (TREE_TYPE (TREE_OPERAND (exp, 0))))
7867         {
7868           op0 = expand_expr (TREE_OPERAND (exp, 0), target, VOIDmode,
7869                              modifier);
7870
7871           /* If the signedness of the conversion differs and OP0 is
7872              a promoted SUBREG, clear that indication since we now
7873              have to do the proper extension.  */
7874           if (TREE_UNSIGNED (TREE_TYPE (TREE_OPERAND (exp, 0))) != unsignedp
7875               && GET_CODE (op0) == SUBREG)
7876             SUBREG_PROMOTED_VAR_P (op0) = 0;
7877
7878           return op0;
7879         }
7880
7881       op0 = expand_expr (TREE_OPERAND (exp, 0), NULL_RTX, mode, modifier);
7882       if (GET_MODE (op0) == mode)
7883         return op0;
7884
7885       /* If OP0 is a constant, just convert it into the proper mode.  */
7886       if (CONSTANT_P (op0))
7887         {
7888           tree inner_type = TREE_TYPE (TREE_OPERAND (exp, 0));
7889           enum machine_mode inner_mode = TYPE_MODE (inner_type);
7890
7891           if (modifier == EXPAND_INITIALIZER)
7892             return simplify_gen_subreg (mode, op0, inner_mode,
7893                                         subreg_lowpart_offset (mode,
7894                                                                inner_mode));
7895           else
7896             return convert_modes (mode, inner_mode, op0,
7897                                   TREE_UNSIGNED (inner_type));
7898         }
7899
7900       if (modifier == EXPAND_INITIALIZER)
7901         return gen_rtx_fmt_e (unsignedp ? ZERO_EXTEND : SIGN_EXTEND, mode, op0);
7902
7903       if (target == 0)
7904         return
7905           convert_to_mode (mode, op0,
7906                            TREE_UNSIGNED (TREE_TYPE (TREE_OPERAND (exp, 0))));
7907       else
7908         convert_move (target, op0,
7909                       TREE_UNSIGNED (TREE_TYPE (TREE_OPERAND (exp, 0))));
7910       return target;
7911
7912     case VIEW_CONVERT_EXPR:
7913       op0 = expand_expr (TREE_OPERAND (exp, 0), NULL_RTX, mode, modifier);
7914
7915       /* If the input and output modes are both the same, we are done.
7916          Otherwise, if neither mode is BLKmode and both are within a word, we
7917          can use gen_lowpart.  If neither is true, make sure the operand is
7918          in memory and convert the MEM to the new mode.  */
7919       if (TYPE_MODE (type) == GET_MODE (op0))
7920         ;
7921       else if (TYPE_MODE (type) != BLKmode && GET_MODE (op0) != BLKmode
7922                && GET_MODE_SIZE (TYPE_MODE (type)) <= UNITS_PER_WORD
7923                && GET_MODE_SIZE (GET_MODE (op0)) <= UNITS_PER_WORD)
7924         op0 = gen_lowpart (TYPE_MODE (type), op0);
7925       else if (GET_CODE (op0) != MEM)
7926         {
7927           /* If the operand is not a MEM, force it into memory.  Since we
7928              are going to be be changing the mode of the MEM, don't call
7929              force_const_mem for constants because we don't allow pool
7930              constants to change mode.  */
7931           tree inner_type = TREE_TYPE (TREE_OPERAND (exp, 0));
7932
7933           if (TREE_ADDRESSABLE (exp))
7934             abort ();
7935
7936           if (target == 0 || GET_MODE (target) != TYPE_MODE (inner_type))
7937             target
7938               = assign_stack_temp_for_type
7939                 (TYPE_MODE (inner_type),
7940                  GET_MODE_SIZE (TYPE_MODE (inner_type)), 0, inner_type);
7941
7942           emit_move_insn (target, op0);
7943           op0 = target;
7944         }
7945
7946       /* At this point, OP0 is in the correct mode.  If the output type is such
7947          that the operand is known to be aligned, indicate that it is.
7948          Otherwise, we need only be concerned about alignment for non-BLKmode
7949          results.  */
7950       if (GET_CODE (op0) == MEM)
7951         {
7952           op0 = copy_rtx (op0);
7953
7954           if (TYPE_ALIGN_OK (type))
7955             set_mem_align (op0, MAX (MEM_ALIGN (op0), TYPE_ALIGN (type)));
7956           else if (TYPE_MODE (type) != BLKmode && STRICT_ALIGNMENT
7957                    && MEM_ALIGN (op0) < GET_MODE_ALIGNMENT (TYPE_MODE (type)))
7958             {
7959               tree inner_type = TREE_TYPE (TREE_OPERAND (exp, 0));
7960               HOST_WIDE_INT temp_size
7961                 = MAX (int_size_in_bytes (inner_type),
7962                        (HOST_WIDE_INT) GET_MODE_SIZE (TYPE_MODE (type)));
7963               rtx new = assign_stack_temp_for_type (TYPE_MODE (type),
7964                                                     temp_size, 0, type);
7965               rtx new_with_op0_mode = adjust_address (new, GET_MODE (op0), 0);
7966
7967               if (TREE_ADDRESSABLE (exp))
7968                 abort ();
7969
7970               if (GET_MODE (op0) == BLKmode)
7971                 emit_block_move (new_with_op0_mode, op0,
7972                                  GEN_INT (GET_MODE_SIZE (TYPE_MODE (type))),
7973                                  (modifier == EXPAND_STACK_PARM
7974                                   ? BLOCK_OP_CALL_PARM : BLOCK_OP_NORMAL));
7975               else
7976                 emit_move_insn (new_with_op0_mode, op0);
7977
7978               op0 = new;
7979             }
7980
7981           op0 = adjust_address (op0, TYPE_MODE (type), 0);
7982         }
7983
7984       return op0;
7985
7986     case PLUS_EXPR:
7987       this_optab = ! unsignedp && flag_trapv
7988                    && (GET_MODE_CLASS (mode) == MODE_INT)
7989                    ? addv_optab : add_optab;
7990
7991       /* If we are adding a constant, an RTL_EXPR that is sp, fp, or ap, and
7992          something else, make sure we add the register to the constant and
7993          then to the other thing.  This case can occur during strength
7994          reduction and doing it this way will produce better code if the
7995          frame pointer or argument pointer is eliminated.
7996
7997          fold-const.c will ensure that the constant is always in the inner
7998          PLUS_EXPR, so the only case we need to do anything about is if
7999          sp, ap, or fp is our second argument, in which case we must swap
8000          the innermost first argument and our second argument.  */
8001
8002       if (TREE_CODE (TREE_OPERAND (exp, 0)) == PLUS_EXPR
8003           && TREE_CODE (TREE_OPERAND (TREE_OPERAND (exp, 0), 1)) == INTEGER_CST
8004           && TREE_CODE (TREE_OPERAND (exp, 1)) == RTL_EXPR
8005           && (RTL_EXPR_RTL (TREE_OPERAND (exp, 1)) == frame_pointer_rtx
8006               || RTL_EXPR_RTL (TREE_OPERAND (exp, 1)) == stack_pointer_rtx
8007               || RTL_EXPR_RTL (TREE_OPERAND (exp, 1)) == arg_pointer_rtx))
8008         {
8009           tree t = TREE_OPERAND (exp, 1);
8010
8011           TREE_OPERAND (exp, 1) = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
8012           TREE_OPERAND (TREE_OPERAND (exp, 0), 0) = t;
8013         }
8014
8015       /* If the result is to be ptr_mode and we are adding an integer to
8016          something, we might be forming a constant.  So try to use
8017          plus_constant.  If it produces a sum and we can't accept it,
8018          use force_operand.  This allows P = &ARR[const] to generate
8019          efficient code on machines where a SYMBOL_REF is not a valid
8020          address.
8021
8022          If this is an EXPAND_SUM call, always return the sum.  */
8023       if (modifier == EXPAND_SUM || modifier == EXPAND_INITIALIZER
8024           || (mode == ptr_mode && (unsignedp || ! flag_trapv)))
8025         {
8026           if (modifier == EXPAND_STACK_PARM)
8027             target = 0;
8028           if (TREE_CODE (TREE_OPERAND (exp, 0)) == INTEGER_CST
8029               && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
8030               && TREE_CONSTANT (TREE_OPERAND (exp, 1)))
8031             {
8032               rtx constant_part;
8033
8034               op1 = expand_expr (TREE_OPERAND (exp, 1), subtarget, VOIDmode,
8035                                  EXPAND_SUM);
8036               /* Use immed_double_const to ensure that the constant is
8037                  truncated according to the mode of OP1, then sign extended
8038                  to a HOST_WIDE_INT.  Using the constant directly can result
8039                  in non-canonical RTL in a 64x32 cross compile.  */
8040               constant_part
8041                 = immed_double_const (TREE_INT_CST_LOW (TREE_OPERAND (exp, 0)),
8042                                       (HOST_WIDE_INT) 0,
8043                                       TYPE_MODE (TREE_TYPE (TREE_OPERAND (exp, 1))));
8044               op1 = plus_constant (op1, INTVAL (constant_part));
8045               if (modifier != EXPAND_SUM && modifier != EXPAND_INITIALIZER)
8046                 op1 = force_operand (op1, target);
8047               return op1;
8048             }
8049
8050           else if (TREE_CODE (TREE_OPERAND (exp, 1)) == INTEGER_CST
8051                    && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_INT
8052                    && TREE_CONSTANT (TREE_OPERAND (exp, 0)))
8053             {
8054               rtx constant_part;
8055
8056               op0 = expand_expr (TREE_OPERAND (exp, 0), subtarget, VOIDmode,
8057                                  (modifier == EXPAND_INITIALIZER
8058                                  ? EXPAND_INITIALIZER : EXPAND_SUM));
8059               if (! CONSTANT_P (op0))
8060                 {
8061                   op1 = expand_expr (TREE_OPERAND (exp, 1), NULL_RTX,
8062                                      VOIDmode, modifier);
8063                   /* Don't go to both_summands if modifier
8064                      says it's not right to return a PLUS.  */
8065                   if (modifier != EXPAND_SUM && modifier != EXPAND_INITIALIZER)
8066                     goto binop2;
8067                   goto both_summands;
8068                 }
8069               /* Use immed_double_const to ensure that the constant is
8070                  truncated according to the mode of OP1, then sign extended
8071                  to a HOST_WIDE_INT.  Using the constant directly can result
8072                  in non-canonical RTL in a 64x32 cross compile.  */
8073               constant_part
8074                 = immed_double_const (TREE_INT_CST_LOW (TREE_OPERAND (exp, 1)),
8075                                       (HOST_WIDE_INT) 0,
8076                                       TYPE_MODE (TREE_TYPE (TREE_OPERAND (exp, 0))));
8077               op0 = plus_constant (op0, INTVAL (constant_part));
8078               if (modifier != EXPAND_SUM && modifier != EXPAND_INITIALIZER)
8079                 op0 = force_operand (op0, target);
8080               return op0;
8081             }
8082         }
8083
8084       if (! safe_from_p (subtarget, TREE_OPERAND (exp, 1), 1))
8085         subtarget = 0;
8086
8087       /* No sense saving up arithmetic to be done
8088          if it's all in the wrong mode to form part of an address.
8089          And force_operand won't know whether to sign-extend or
8090          zero-extend.  */
8091       if ((modifier != EXPAND_SUM && modifier != EXPAND_INITIALIZER)
8092           || mode != ptr_mode)
8093         {
8094           op0 = expand_expr (TREE_OPERAND (exp, 0), subtarget, VOIDmode, 0);
8095           op1 = expand_expr (TREE_OPERAND (exp, 1), NULL_RTX, VOIDmode, 0);
8096           if (op0 == const0_rtx)
8097             return op1;
8098           if (op1 == const0_rtx)
8099             return op0;
8100           goto binop2;
8101         }
8102
8103       op0 = expand_expr (TREE_OPERAND (exp, 0), subtarget, VOIDmode, modifier);
8104       op1 = expand_expr (TREE_OPERAND (exp, 1), NULL_RTX, VOIDmode, modifier);
8105
8106       /* We come here from MINUS_EXPR when the second operand is a
8107          constant.  */
8108     both_summands:
8109       /* Make sure any term that's a sum with a constant comes last.  */
8110       if (GET_CODE (op0) == PLUS
8111           && CONSTANT_P (XEXP (op0, 1)))
8112         {
8113           temp = op0;
8114           op0 = op1;
8115           op1 = temp;
8116         }
8117       /* If adding to a sum including a constant,
8118          associate it to put the constant outside.  */
8119       if (GET_CODE (op1) == PLUS
8120           && CONSTANT_P (XEXP (op1, 1)))
8121         {
8122           rtx constant_term = const0_rtx;
8123
8124           temp = simplify_binary_operation (PLUS, mode, XEXP (op1, 0), op0);
8125           if (temp != 0)
8126             op0 = temp;
8127           /* Ensure that MULT comes first if there is one.  */
8128           else if (GET_CODE (op0) == MULT)
8129             op0 = gen_rtx_PLUS (mode, op0, XEXP (op1, 0));
8130           else
8131             op0 = gen_rtx_PLUS (mode, XEXP (op1, 0), op0);
8132
8133           /* Let's also eliminate constants from op0 if possible.  */
8134           op0 = eliminate_constant_term (op0, &constant_term);
8135
8136           /* CONSTANT_TERM and XEXP (op1, 1) are known to be constant, so
8137              their sum should be a constant.  Form it into OP1, since the
8138              result we want will then be OP0 + OP1.  */
8139
8140           temp = simplify_binary_operation (PLUS, mode, constant_term,
8141                                             XEXP (op1, 1));
8142           if (temp != 0)
8143             op1 = temp;
8144           else
8145             op1 = gen_rtx_PLUS (mode, constant_term, XEXP (op1, 1));
8146         }
8147
8148       /* Put a constant term last and put a multiplication first.  */
8149       if (CONSTANT_P (op0) || GET_CODE (op1) == MULT)
8150         temp = op1, op1 = op0, op0 = temp;
8151
8152       temp = simplify_binary_operation (PLUS, mode, op0, op1);
8153       return temp ? temp : gen_rtx_PLUS (mode, op0, op1);
8154
8155     case MINUS_EXPR:
8156       /* For initializers, we are allowed to return a MINUS of two
8157          symbolic constants.  Here we handle all cases when both operands
8158          are constant.  */
8159       /* Handle difference of two symbolic constants,
8160          for the sake of an initializer.  */
8161       if ((modifier == EXPAND_SUM || modifier == EXPAND_INITIALIZER)
8162           && really_constant_p (TREE_OPERAND (exp, 0))
8163           && really_constant_p (TREE_OPERAND (exp, 1)))
8164         {
8165           rtx op0 = expand_expr (TREE_OPERAND (exp, 0), NULL_RTX, VOIDmode,
8166                                  modifier);
8167           rtx op1 = expand_expr (TREE_OPERAND (exp, 1), NULL_RTX, VOIDmode,
8168                                  modifier);
8169
8170           /* If the last operand is a CONST_INT, use plus_constant of
8171              the negated constant.  Else make the MINUS.  */
8172           if (GET_CODE (op1) == CONST_INT)
8173             return plus_constant (op0, - INTVAL (op1));
8174           else
8175             return gen_rtx_MINUS (mode, op0, op1);
8176         }
8177
8178       this_optab = ! unsignedp && flag_trapv
8179                    && (GET_MODE_CLASS(mode) == MODE_INT)
8180                    ? subv_optab : sub_optab;
8181
8182       /* No sense saving up arithmetic to be done
8183          if it's all in the wrong mode to form part of an address.
8184          And force_operand won't know whether to sign-extend or
8185          zero-extend.  */
8186       if ((modifier != EXPAND_SUM && modifier != EXPAND_INITIALIZER)
8187           || mode != ptr_mode)
8188         goto binop;
8189
8190       if (! safe_from_p (subtarget, TREE_OPERAND (exp, 1), 1))
8191         subtarget = 0;
8192
8193       op0 = expand_expr (TREE_OPERAND (exp, 0), subtarget, VOIDmode, modifier);
8194       op1 = expand_expr (TREE_OPERAND (exp, 1), NULL_RTX, VOIDmode, modifier);
8195
8196       /* Convert A - const to A + (-const).  */
8197       if (GET_CODE (op1) == CONST_INT)
8198         {
8199           op1 = negate_rtx (mode, op1);
8200           goto both_summands;
8201         }
8202
8203       goto binop2;
8204
8205     case MULT_EXPR:
8206       /* If first operand is constant, swap them.
8207          Thus the following special case checks need only
8208          check the second operand.  */
8209       if (TREE_CODE (TREE_OPERAND (exp, 0)) == INTEGER_CST)
8210         {
8211           tree t1 = TREE_OPERAND (exp, 0);
8212           TREE_OPERAND (exp, 0) = TREE_OPERAND (exp, 1);
8213           TREE_OPERAND (exp, 1) = t1;
8214         }
8215
8216       /* Attempt to return something suitable for generating an
8217          indexed address, for machines that support that.  */
8218
8219       if (modifier == EXPAND_SUM && mode == ptr_mode
8220           && host_integerp (TREE_OPERAND (exp, 1), 0))
8221         {
8222           tree exp1 = TREE_OPERAND (exp, 1);
8223
8224           op0 = expand_expr (TREE_OPERAND (exp, 0), subtarget, VOIDmode,
8225                              EXPAND_SUM);
8226
8227           /* If we knew for certain that this is arithmetic for an array
8228              reference, and we knew the bounds of the array, then we could
8229              apply the distributive law across (PLUS X C) for constant C.
8230              Without such knowledge, we risk overflowing the computation
8231              when both X and C are large, but X+C isn't.  */
8232           /* ??? Could perhaps special-case EXP being unsigned and C being
8233              positive.  In that case we are certain that X+C is no smaller
8234              than X and so the transformed expression will overflow iff the
8235              original would have.  */
8236
8237           if (GET_CODE (op0) != REG)
8238             op0 = force_operand (op0, NULL_RTX);
8239           if (GET_CODE (op0) != REG)
8240             op0 = copy_to_mode_reg (mode, op0);
8241
8242           return gen_rtx_MULT (mode, op0,
8243                                gen_int_mode (tree_low_cst (exp1, 0),
8244                                              TYPE_MODE (TREE_TYPE (exp1))));
8245         }
8246
8247       if (! safe_from_p (subtarget, TREE_OPERAND (exp, 1), 1))
8248         subtarget = 0;
8249
8250       if (modifier == EXPAND_STACK_PARM)
8251         target = 0;
8252
8253       /* Check for multiplying things that have been extended
8254          from a narrower type.  If this machine supports multiplying
8255          in that narrower type with a result in the desired type,
8256          do it that way, and avoid the explicit type-conversion.  */
8257       if (TREE_CODE (TREE_OPERAND (exp, 0)) == NOP_EXPR
8258           && TREE_CODE (type) == INTEGER_TYPE
8259           && (TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (exp, 0), 0)))
8260               < TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (exp, 0))))
8261           && ((TREE_CODE (TREE_OPERAND (exp, 1)) == INTEGER_CST
8262                && int_fits_type_p (TREE_OPERAND (exp, 1),
8263                                    TREE_TYPE (TREE_OPERAND (TREE_OPERAND (exp, 0), 0)))
8264                /* Don't use a widening multiply if a shift will do.  */
8265                && ((GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (TREE_OPERAND (exp, 1))))
8266                     > HOST_BITS_PER_WIDE_INT)
8267                    || exact_log2 (TREE_INT_CST_LOW (TREE_OPERAND (exp, 1))) < 0))
8268               ||
8269               (TREE_CODE (TREE_OPERAND (exp, 1)) == NOP_EXPR
8270                && (TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (exp, 1), 0)))
8271                    ==
8272                    TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (exp, 0), 0))))
8273                /* If both operands are extended, they must either both
8274                   be zero-extended or both be sign-extended.  */
8275                && (TREE_UNSIGNED (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (exp, 1), 0)))
8276                    ==
8277                    TREE_UNSIGNED (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (exp, 0), 0)))))))
8278         {
8279           enum machine_mode innermode
8280             = TYPE_MODE (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (exp, 0), 0)));
8281           optab other_optab = (TREE_UNSIGNED (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (exp, 0), 0)))
8282                         ? smul_widen_optab : umul_widen_optab);
8283           this_optab = (TREE_UNSIGNED (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (exp, 0), 0)))
8284                         ? umul_widen_optab : smul_widen_optab);
8285           if (mode == GET_MODE_WIDER_MODE (innermode))
8286             {
8287               if (this_optab->handlers[(int) mode].insn_code != CODE_FOR_nothing)
8288                 {
8289                   op0 = expand_expr (TREE_OPERAND (TREE_OPERAND (exp, 0), 0),
8290                                      NULL_RTX, VOIDmode, 0);
8291                   if (TREE_CODE (TREE_OPERAND (exp, 1)) == INTEGER_CST)
8292                     op1 = expand_expr (TREE_OPERAND (exp, 1), NULL_RTX,
8293                                        VOIDmode, 0);
8294                   else
8295                     op1 = expand_expr (TREE_OPERAND (TREE_OPERAND (exp, 1), 0),
8296                                        NULL_RTX, VOIDmode, 0);
8297                   goto binop2;
8298                 }
8299               else if (other_optab->handlers[(int) mode].insn_code != CODE_FOR_nothing
8300                        && innermode == word_mode)
8301                 {
8302                   rtx htem;
8303                   op0 = expand_expr (TREE_OPERAND (TREE_OPERAND (exp, 0), 0),
8304                                      NULL_RTX, VOIDmode, 0);
8305                   if (TREE_CODE (TREE_OPERAND (exp, 1)) == INTEGER_CST)
8306                     op1 = convert_modes (innermode, mode,
8307                                          expand_expr (TREE_OPERAND (exp, 1),
8308                                                       NULL_RTX, VOIDmode, 0),
8309                                          unsignedp);
8310                   else
8311                     op1 = expand_expr (TREE_OPERAND (TREE_OPERAND (exp, 1), 0),
8312                                        NULL_RTX, VOIDmode, 0);
8313                   temp = expand_binop (mode, other_optab, op0, op1, target,
8314                                        unsignedp, OPTAB_LIB_WIDEN);
8315                   htem = expand_mult_highpart_adjust (innermode,
8316                                                       gen_highpart (innermode, temp),
8317                                                       op0, op1,
8318                                                       gen_highpart (innermode, temp),
8319                                                       unsignedp);
8320                   emit_move_insn (gen_highpart (innermode, temp), htem);
8321                   return temp;
8322                 }
8323             }
8324         }
8325       op0 = expand_expr (TREE_OPERAND (exp, 0), subtarget, VOIDmode, 0);
8326       op1 = expand_expr (TREE_OPERAND (exp, 1), NULL_RTX, VOIDmode, 0);
8327       return expand_mult (mode, op0, op1, target, unsignedp);
8328
8329     case TRUNC_DIV_EXPR:
8330     case FLOOR_DIV_EXPR:
8331     case CEIL_DIV_EXPR:
8332     case ROUND_DIV_EXPR:
8333     case EXACT_DIV_EXPR:
8334       if (! safe_from_p (subtarget, TREE_OPERAND (exp, 1), 1))
8335         subtarget = 0;
8336       if (modifier == EXPAND_STACK_PARM)
8337         target = 0;
8338       /* Possible optimization: compute the dividend with EXPAND_SUM
8339          then if the divisor is constant can optimize the case
8340          where some terms of the dividend have coeffs divisible by it.  */
8341       op0 = expand_expr (TREE_OPERAND (exp, 0), subtarget, VOIDmode, 0);
8342       op1 = expand_expr (TREE_OPERAND (exp, 1), NULL_RTX, VOIDmode, 0);
8343       return expand_divmod (0, code, mode, op0, op1, target, unsignedp);
8344
8345     case RDIV_EXPR:
8346       /* Emit a/b as a*(1/b).  Later we may manage CSE the reciprocal saving
8347          expensive divide.  If not, combine will rebuild the original
8348          computation.  */
8349       if (flag_unsafe_math_optimizations && optimize && !optimize_size
8350           && TREE_CODE (type) == REAL_TYPE
8351           && !real_onep (TREE_OPERAND (exp, 0)))
8352         return expand_expr (build (MULT_EXPR, type, TREE_OPERAND (exp, 0),
8353                                    build (RDIV_EXPR, type,
8354                                           build_real (type, dconst1),
8355                                           TREE_OPERAND (exp, 1))),
8356                             target, tmode, modifier);
8357       this_optab = sdiv_optab;
8358       goto binop;
8359
8360     case TRUNC_MOD_EXPR:
8361     case FLOOR_MOD_EXPR:
8362     case CEIL_MOD_EXPR:
8363     case ROUND_MOD_EXPR:
8364       if (! safe_from_p (subtarget, TREE_OPERAND (exp, 1), 1))
8365         subtarget = 0;
8366       if (modifier == EXPAND_STACK_PARM)
8367         target = 0;
8368       op0 = expand_expr (TREE_OPERAND (exp, 0), subtarget, VOIDmode, 0);
8369       op1 = expand_expr (TREE_OPERAND (exp, 1), NULL_RTX, VOIDmode, 0);
8370       return expand_divmod (1, code, mode, op0, op1, target, unsignedp);
8371
8372     case FIX_ROUND_EXPR:
8373     case FIX_FLOOR_EXPR:
8374     case FIX_CEIL_EXPR:
8375       abort ();                 /* Not used for C.  */
8376
8377     case FIX_TRUNC_EXPR:
8378       op0 = expand_expr (TREE_OPERAND (exp, 0), NULL_RTX, VOIDmode, 0);
8379       if (target == 0 || modifier == EXPAND_STACK_PARM)
8380         target = gen_reg_rtx (mode);
8381       expand_fix (target, op0, unsignedp);
8382       return target;
8383
8384     case FLOAT_EXPR:
8385       op0 = expand_expr (TREE_OPERAND (exp, 0), NULL_RTX, VOIDmode, 0);
8386       if (target == 0 || modifier == EXPAND_STACK_PARM)
8387         target = gen_reg_rtx (mode);
8388       /* expand_float can't figure out what to do if FROM has VOIDmode.
8389          So give it the correct mode.  With -O, cse will optimize this.  */
8390       if (GET_MODE (op0) == VOIDmode)
8391         op0 = copy_to_mode_reg (TYPE_MODE (TREE_TYPE (TREE_OPERAND (exp, 0))),
8392                                 op0);
8393       expand_float (target, op0,
8394                     TREE_UNSIGNED (TREE_TYPE (TREE_OPERAND (exp, 0))));
8395       return target;
8396
8397     case NEGATE_EXPR:
8398       op0 = expand_expr (TREE_OPERAND (exp, 0), subtarget, VOIDmode, 0);
8399       if (modifier == EXPAND_STACK_PARM)
8400         target = 0;
8401       temp = expand_unop (mode,
8402                           ! unsignedp && flag_trapv
8403                           && (GET_MODE_CLASS(mode) == MODE_INT)
8404                           ? negv_optab : neg_optab, op0, target, 0);
8405       if (temp == 0)
8406         abort ();
8407       return temp;
8408
8409     case ABS_EXPR:
8410       op0 = expand_expr (TREE_OPERAND (exp, 0), subtarget, VOIDmode, 0);
8411       if (modifier == EXPAND_STACK_PARM)
8412         target = 0;
8413
8414       /* Handle complex values specially.  */
8415       if (GET_MODE_CLASS (mode) == MODE_COMPLEX_INT
8416           || GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT)
8417         return expand_complex_abs (mode, op0, target, unsignedp);
8418
8419       /* Unsigned abs is simply the operand.  Testing here means we don't
8420          risk generating incorrect code below.  */
8421       if (TREE_UNSIGNED (type))
8422         return op0;
8423
8424       return expand_abs (mode, op0, target, unsignedp,
8425                          safe_from_p (target, TREE_OPERAND (exp, 0), 1));
8426
8427     case MAX_EXPR:
8428     case MIN_EXPR:
8429       target = original_target;
8430       if (target == 0
8431           || modifier == EXPAND_STACK_PARM
8432           || ! safe_from_p (target, TREE_OPERAND (exp, 1), 1)
8433           || (GET_CODE (target) == MEM && MEM_VOLATILE_P (target))
8434           || GET_MODE (target) != mode
8435           || (GET_CODE (target) == REG
8436               && REGNO (target) < FIRST_PSEUDO_REGISTER))
8437         target = gen_reg_rtx (mode);
8438       op1 = expand_expr (TREE_OPERAND (exp, 1), NULL_RTX, VOIDmode, 0);
8439       op0 = expand_expr (TREE_OPERAND (exp, 0), target, VOIDmode, 0);
8440
8441       /* First try to do it with a special MIN or MAX instruction.
8442          If that does not win, use a conditional jump to select the proper
8443          value.  */
8444       this_optab = (TREE_UNSIGNED (type)
8445                     ? (code == MIN_EXPR ? umin_optab : umax_optab)
8446                     : (code == MIN_EXPR ? smin_optab : smax_optab));
8447
8448       temp = expand_binop (mode, this_optab, op0, op1, target, unsignedp,
8449                            OPTAB_WIDEN);
8450       if (temp != 0)
8451         return temp;
8452
8453       /* At this point, a MEM target is no longer useful; we will get better
8454          code without it.  */
8455
8456       if (GET_CODE (target) == MEM)
8457         target = gen_reg_rtx (mode);
8458
8459       if (target != op0)
8460         emit_move_insn (target, op0);
8461
8462       op0 = gen_label_rtx ();
8463
8464       /* If this mode is an integer too wide to compare properly,
8465          compare word by word.  Rely on cse to optimize constant cases.  */
8466       if (GET_MODE_CLASS (mode) == MODE_INT
8467           && ! can_compare_p (GE, mode, ccp_jump))
8468         {
8469           if (code == MAX_EXPR)
8470             do_jump_by_parts_greater_rtx (mode, TREE_UNSIGNED (type),
8471                                           target, op1, NULL_RTX, op0);
8472           else
8473             do_jump_by_parts_greater_rtx (mode, TREE_UNSIGNED (type),
8474                                           op1, target, NULL_RTX, op0);
8475         }
8476       else
8477         {
8478           int unsignedp = TREE_UNSIGNED (TREE_TYPE (TREE_OPERAND (exp, 1)));
8479           do_compare_rtx_and_jump (target, op1, code == MAX_EXPR ? GE : LE,
8480                                    unsignedp, mode, NULL_RTX, NULL_RTX,
8481                                    op0);
8482         }
8483       emit_move_insn (target, op1);
8484       emit_label (op0);
8485       return target;
8486
8487     case BIT_NOT_EXPR:
8488       op0 = expand_expr (TREE_OPERAND (exp, 0), subtarget, VOIDmode, 0);
8489       if (modifier == EXPAND_STACK_PARM)
8490         target = 0;
8491       temp = expand_unop (mode, one_cmpl_optab, op0, target, 1);
8492       if (temp == 0)
8493         abort ();
8494       return temp;
8495
8496     case FFS_EXPR:
8497       op0 = expand_expr (TREE_OPERAND (exp, 0), subtarget, VOIDmode, 0);
8498       if (modifier == EXPAND_STACK_PARM)
8499         target = 0;
8500       temp = expand_unop (mode, ffs_optab, op0, target, 1);
8501       if (temp == 0)
8502         abort ();
8503       return temp;
8504
8505     case CLZ_EXPR:
8506       op0 = expand_expr (TREE_OPERAND (exp, 0), subtarget, VOIDmode, 0);
8507       temp = expand_unop (mode, clz_optab, op0, target, 1);
8508       if (temp == 0)
8509         abort ();
8510       return temp;
8511
8512     case CTZ_EXPR:
8513       op0 = expand_expr (TREE_OPERAND (exp, 0), subtarget, VOIDmode, 0);
8514       temp = expand_unop (mode, ctz_optab, op0, target, 1);
8515       if (temp == 0)
8516         abort ();
8517       return temp;
8518
8519     case POPCOUNT_EXPR:
8520       op0 = expand_expr (TREE_OPERAND (exp, 0), subtarget, VOIDmode, 0);
8521       temp = expand_unop (mode, popcount_optab, op0, target, 1);
8522       if (temp == 0)
8523         abort ();
8524       return temp;
8525
8526     case PARITY_EXPR:
8527       op0 = expand_expr (TREE_OPERAND (exp, 0), subtarget, VOIDmode, 0);
8528       temp = expand_unop (mode, parity_optab, op0, target, 1);
8529       if (temp == 0)
8530         abort ();
8531       return temp;
8532
8533       /* ??? Can optimize bitwise operations with one arg constant.
8534          Can optimize (a bitwise1 n) bitwise2 (a bitwise3 b)
8535          and (a bitwise1 b) bitwise2 b (etc)
8536          but that is probably not worth while.  */
8537
8538       /* BIT_AND_EXPR is for bitwise anding.  TRUTH_AND_EXPR is for anding two
8539          boolean values when we want in all cases to compute both of them.  In
8540          general it is fastest to do TRUTH_AND_EXPR by computing both operands
8541          as actual zero-or-1 values and then bitwise anding.  In cases where
8542          there cannot be any side effects, better code would be made by
8543          treating TRUTH_AND_EXPR like TRUTH_ANDIF_EXPR; but the question is
8544          how to recognize those cases.  */
8545
8546     case TRUTH_AND_EXPR:
8547     case BIT_AND_EXPR:
8548       this_optab = and_optab;
8549       goto binop;
8550
8551     case TRUTH_OR_EXPR:
8552     case BIT_IOR_EXPR:
8553       this_optab = ior_optab;
8554       goto binop;
8555
8556     case TRUTH_XOR_EXPR:
8557     case BIT_XOR_EXPR:
8558       this_optab = xor_optab;
8559       goto binop;
8560
8561     case LSHIFT_EXPR:
8562     case RSHIFT_EXPR:
8563     case LROTATE_EXPR:
8564     case RROTATE_EXPR:
8565       if (! safe_from_p (subtarget, TREE_OPERAND (exp, 1), 1))
8566         subtarget = 0;
8567       if (modifier == EXPAND_STACK_PARM)
8568         target = 0;
8569       op0 = expand_expr (TREE_OPERAND (exp, 0), subtarget, VOIDmode, 0);
8570       return expand_shift (code, mode, op0, TREE_OPERAND (exp, 1), target,
8571                            unsignedp);
8572
8573       /* Could determine the answer when only additive constants differ.  Also,
8574          the addition of one can be handled by changing the condition.  */
8575     case LT_EXPR:
8576     case LE_EXPR:
8577     case GT_EXPR:
8578     case GE_EXPR:
8579     case EQ_EXPR:
8580     case NE_EXPR:
8581     case UNORDERED_EXPR:
8582     case ORDERED_EXPR:
8583     case UNLT_EXPR:
8584     case UNLE_EXPR:
8585     case UNGT_EXPR:
8586     case UNGE_EXPR:
8587     case UNEQ_EXPR:
8588       temp = do_store_flag (exp,
8589                             modifier != EXPAND_STACK_PARM ? target : NULL_RTX,
8590                             tmode != VOIDmode ? tmode : mode, 0);
8591       if (temp != 0)
8592         return temp;
8593
8594       /* For foo != 0, load foo, and if it is nonzero load 1 instead.  */
8595       if (code == NE_EXPR && integer_zerop (TREE_OPERAND (exp, 1))
8596           && original_target
8597           && GET_CODE (original_target) == REG
8598           && (GET_MODE (original_target)
8599               == TYPE_MODE (TREE_TYPE (TREE_OPERAND (exp, 0)))))
8600         {
8601           temp = expand_expr (TREE_OPERAND (exp, 0), original_target,
8602                               VOIDmode, 0);
8603
8604           /* If temp is constant, we can just compute the result.  */
8605           if (GET_CODE (temp) == CONST_INT)
8606             {
8607               if (INTVAL (temp) != 0)
8608                 emit_move_insn (target, const1_rtx);
8609               else
8610                 emit_move_insn (target, const0_rtx);
8611
8612               return target;
8613             }
8614
8615           if (temp != original_target)
8616             {
8617               enum machine_mode mode1 = GET_MODE (temp);
8618               if (mode1 == VOIDmode)
8619                 mode1 = tmode != VOIDmode ? tmode : mode;
8620
8621               temp = copy_to_mode_reg (mode1, temp);
8622             }
8623
8624           op1 = gen_label_rtx ();
8625           emit_cmp_and_jump_insns (temp, const0_rtx, EQ, NULL_RTX,
8626                                    GET_MODE (temp), unsignedp, op1);
8627           emit_move_insn (temp, const1_rtx);
8628           emit_label (op1);
8629           return temp;
8630         }
8631
8632       /* If no set-flag instruction, must generate a conditional
8633          store into a temporary variable.  Drop through
8634          and handle this like && and ||.  */
8635
8636     case TRUTH_ANDIF_EXPR:
8637     case TRUTH_ORIF_EXPR:
8638       if (! ignore
8639           && (target == 0
8640               || modifier == EXPAND_STACK_PARM
8641               || ! safe_from_p (target, exp, 1)
8642               /* Make sure we don't have a hard reg (such as function's return
8643                  value) live across basic blocks, if not optimizing.  */
8644               || (!optimize && GET_CODE (target) == REG
8645                   && REGNO (target) < FIRST_PSEUDO_REGISTER)))
8646         target = gen_reg_rtx (tmode != VOIDmode ? tmode : mode);
8647
8648       if (target)
8649         emit_clr_insn (target);
8650
8651       op1 = gen_label_rtx ();
8652       jumpifnot (exp, op1);
8653
8654       if (target)
8655         emit_0_to_1_insn (target);
8656
8657       emit_label (op1);
8658       return ignore ? const0_rtx : target;
8659
8660     case TRUTH_NOT_EXPR:
8661       if (modifier == EXPAND_STACK_PARM)
8662         target = 0;
8663       op0 = expand_expr (TREE_OPERAND (exp, 0), target, VOIDmode, 0);
8664       /* The parser is careful to generate TRUTH_NOT_EXPR
8665          only with operands that are always zero or one.  */
8666       temp = expand_binop (mode, xor_optab, op0, const1_rtx,
8667                            target, 1, OPTAB_LIB_WIDEN);
8668       if (temp == 0)
8669         abort ();
8670       return temp;
8671
8672     case COMPOUND_EXPR:
8673       expand_expr (TREE_OPERAND (exp, 0), const0_rtx, VOIDmode, 0);
8674       emit_queue ();
8675       return expand_expr (TREE_OPERAND (exp, 1),
8676                           (ignore ? const0_rtx : target),
8677                           VOIDmode, modifier);
8678
8679     case COND_EXPR:
8680       /* If we would have a "singleton" (see below) were it not for a
8681          conversion in each arm, bring that conversion back out.  */
8682       if (TREE_CODE (TREE_OPERAND (exp, 1)) == NOP_EXPR
8683           && TREE_CODE (TREE_OPERAND (exp, 2)) == NOP_EXPR
8684           && (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (exp, 1), 0))
8685               == TREE_TYPE (TREE_OPERAND (TREE_OPERAND (exp, 2), 0))))
8686         {
8687           tree iftrue = TREE_OPERAND (TREE_OPERAND (exp, 1), 0);
8688           tree iffalse = TREE_OPERAND (TREE_OPERAND (exp, 2), 0);
8689
8690           if ((TREE_CODE_CLASS (TREE_CODE (iftrue)) == '2'
8691                && operand_equal_p (iffalse, TREE_OPERAND (iftrue, 0), 0))
8692               || (TREE_CODE_CLASS (TREE_CODE (iffalse)) == '2'
8693                   && operand_equal_p (iftrue, TREE_OPERAND (iffalse, 0), 0))
8694               || (TREE_CODE_CLASS (TREE_CODE (iftrue)) == '1'
8695                   && operand_equal_p (iffalse, TREE_OPERAND (iftrue, 0), 0))
8696               || (TREE_CODE_CLASS (TREE_CODE (iffalse)) == '1'
8697                   && operand_equal_p (iftrue, TREE_OPERAND (iffalse, 0), 0)))
8698             return expand_expr (build1 (NOP_EXPR, type,
8699                                         build (COND_EXPR, TREE_TYPE (iftrue),
8700                                                TREE_OPERAND (exp, 0),
8701                                                iftrue, iffalse)),
8702                                 target, tmode, modifier);
8703         }
8704
8705       {
8706         /* Note that COND_EXPRs whose type is a structure or union
8707            are required to be constructed to contain assignments of
8708            a temporary variable, so that we can evaluate them here
8709            for side effect only.  If type is void, we must do likewise.  */
8710
8711         /* If an arm of the branch requires a cleanup,
8712            only that cleanup is performed.  */
8713
8714         tree singleton = 0;
8715         tree binary_op = 0, unary_op = 0;
8716
8717         /* If this is (A ? 1 : 0) and A is a condition, just evaluate it and
8718            convert it to our mode, if necessary.  */
8719         if (integer_onep (TREE_OPERAND (exp, 1))
8720             && integer_zerop (TREE_OPERAND (exp, 2))
8721             && TREE_CODE_CLASS (TREE_CODE (TREE_OPERAND (exp, 0))) == '<')
8722           {
8723             if (ignore)
8724               {
8725                 expand_expr (TREE_OPERAND (exp, 0), const0_rtx, VOIDmode,
8726                              modifier);
8727                 return const0_rtx;
8728               }
8729
8730             if (modifier == EXPAND_STACK_PARM)
8731               target = 0;
8732             op0 = expand_expr (TREE_OPERAND (exp, 0), target, mode, modifier);
8733             if (GET_MODE (op0) == mode)
8734               return op0;
8735
8736             if (target == 0)
8737               target = gen_reg_rtx (mode);
8738             convert_move (target, op0, unsignedp);
8739             return target;
8740           }
8741
8742         /* Check for X ? A + B : A.  If we have this, we can copy A to the
8743            output and conditionally add B.  Similarly for unary operations.
8744            Don't do this if X has side-effects because those side effects
8745            might affect A or B and the "?" operation is a sequence point in
8746            ANSI.  (operand_equal_p tests for side effects.)  */
8747
8748         if (TREE_CODE_CLASS (TREE_CODE (TREE_OPERAND (exp, 1))) == '2'
8749             && operand_equal_p (TREE_OPERAND (exp, 2),
8750                                 TREE_OPERAND (TREE_OPERAND (exp, 1), 0), 0))
8751           singleton = TREE_OPERAND (exp, 2), binary_op = TREE_OPERAND (exp, 1);
8752         else if (TREE_CODE_CLASS (TREE_CODE (TREE_OPERAND (exp, 2))) == '2'
8753                  && operand_equal_p (TREE_OPERAND (exp, 1),
8754                                      TREE_OPERAND (TREE_OPERAND (exp, 2), 0), 0))
8755           singleton = TREE_OPERAND (exp, 1), binary_op = TREE_OPERAND (exp, 2);
8756         else if (TREE_CODE_CLASS (TREE_CODE (TREE_OPERAND (exp, 1))) == '1'
8757                  && operand_equal_p (TREE_OPERAND (exp, 2),
8758                                      TREE_OPERAND (TREE_OPERAND (exp, 1), 0), 0))
8759           singleton = TREE_OPERAND (exp, 2), unary_op = TREE_OPERAND (exp, 1);
8760         else if (TREE_CODE_CLASS (TREE_CODE (TREE_OPERAND (exp, 2))) == '1'
8761                  && operand_equal_p (TREE_OPERAND (exp, 1),
8762                                      TREE_OPERAND (TREE_OPERAND (exp, 2), 0), 0))
8763           singleton = TREE_OPERAND (exp, 1), unary_op = TREE_OPERAND (exp, 2);
8764
8765         /* If we are not to produce a result, we have no target.  Otherwise,
8766            if a target was specified use it; it will not be used as an
8767            intermediate target unless it is safe.  If no target, use a
8768            temporary.  */
8769
8770         if (ignore)
8771           temp = 0;
8772         else if (modifier == EXPAND_STACK_PARM)
8773           temp = assign_temp (type, 0, 0, 1);
8774         else if (original_target
8775                  && (safe_from_p (original_target, TREE_OPERAND (exp, 0), 1)
8776                      || (singleton && GET_CODE (original_target) == REG
8777                          && REGNO (original_target) >= FIRST_PSEUDO_REGISTER
8778                          && original_target == var_rtx (singleton)))
8779                  && GET_MODE (original_target) == mode
8780 #ifdef HAVE_conditional_move
8781                  && (! can_conditionally_move_p (mode)
8782                      || GET_CODE (original_target) == REG
8783                      || TREE_ADDRESSABLE (type))
8784 #endif
8785                  && (GET_CODE (original_target) != MEM
8786                      || TREE_ADDRESSABLE (type)))
8787           temp = original_target;
8788         else if (TREE_ADDRESSABLE (type))
8789           abort ();
8790         else
8791           temp = assign_temp (type, 0, 0, 1);
8792
8793         /* If we had X ? A + C : A, with C a constant power of 2, and we can
8794            do the test of X as a store-flag operation, do this as
8795            A + ((X != 0) << log C).  Similarly for other simple binary
8796            operators.  Only do for C == 1 if BRANCH_COST is low.  */
8797         if (temp && singleton && binary_op
8798             && (TREE_CODE (binary_op) == PLUS_EXPR
8799                 || TREE_CODE (binary_op) == MINUS_EXPR
8800                 || TREE_CODE (binary_op) == BIT_IOR_EXPR
8801                 || TREE_CODE (binary_op) == BIT_XOR_EXPR)
8802             && (BRANCH_COST >= 3 ? integer_pow2p (TREE_OPERAND (binary_op, 1))
8803                 : integer_onep (TREE_OPERAND (binary_op, 1)))
8804             && TREE_CODE_CLASS (TREE_CODE (TREE_OPERAND (exp, 0))) == '<')
8805           {
8806             rtx result;
8807             tree cond;
8808             optab boptab = (TREE_CODE (binary_op) == PLUS_EXPR
8809                             ? (TYPE_TRAP_SIGNED (TREE_TYPE (binary_op))
8810                                ? addv_optab : add_optab)
8811                             : TREE_CODE (binary_op) == MINUS_EXPR
8812                             ? (TYPE_TRAP_SIGNED (TREE_TYPE (binary_op))
8813                                ? subv_optab : sub_optab)
8814                             : TREE_CODE (binary_op) == BIT_IOR_EXPR ? ior_optab
8815                             : xor_optab);
8816
8817             /* If we had X ? A : A + 1, do this as A + (X == 0).  */
8818             if (singleton == TREE_OPERAND (exp, 1))
8819               cond = invert_truthvalue (TREE_OPERAND (exp, 0));
8820             else
8821               cond = TREE_OPERAND (exp, 0);
8822
8823             result = do_store_flag (cond, (safe_from_p (temp, singleton, 1)
8824                                            ? temp : NULL_RTX),
8825                                     mode, BRANCH_COST <= 1);
8826
8827             if (result != 0 && ! integer_onep (TREE_OPERAND (binary_op, 1)))
8828               result = expand_shift (LSHIFT_EXPR, mode, result,
8829                                      build_int_2 (tree_log2
8830                                                   (TREE_OPERAND
8831                                                    (binary_op, 1)),
8832                                                   0),
8833                                      (safe_from_p (temp, singleton, 1)
8834                                       ? temp : NULL_RTX), 0);
8835
8836             if (result)
8837               {
8838                 op1 = expand_expr (singleton, NULL_RTX, VOIDmode, 0);
8839                 return expand_binop (mode, boptab, op1, result, temp,
8840                                      unsignedp, OPTAB_LIB_WIDEN);
8841               }
8842           }
8843
8844         do_pending_stack_adjust ();
8845         NO_DEFER_POP;
8846         op0 = gen_label_rtx ();
8847
8848         if (singleton && ! TREE_SIDE_EFFECTS (TREE_OPERAND (exp, 0)))
8849           {
8850             if (temp != 0)
8851               {
8852                 /* If the target conflicts with the other operand of the
8853                    binary op, we can't use it.  Also, we can't use the target
8854                    if it is a hard register, because evaluating the condition
8855                    might clobber it.  */
8856                 if ((binary_op
8857                      && ! safe_from_p (temp, TREE_OPERAND (binary_op, 1), 1))
8858                     || (GET_CODE (temp) == REG
8859                         && REGNO (temp) < FIRST_PSEUDO_REGISTER))
8860                   temp = gen_reg_rtx (mode);
8861                 store_expr (singleton, temp,
8862                             modifier == EXPAND_STACK_PARM ? 2 : 0);
8863               }
8864             else
8865               expand_expr (singleton,
8866                            ignore ? const0_rtx : NULL_RTX, VOIDmode, 0);
8867             if (singleton == TREE_OPERAND (exp, 1))
8868               jumpif (TREE_OPERAND (exp, 0), op0);
8869             else
8870               jumpifnot (TREE_OPERAND (exp, 0), op0);
8871
8872             start_cleanup_deferral ();
8873             if (binary_op && temp == 0)
8874               /* Just touch the other operand.  */
8875               expand_expr (TREE_OPERAND (binary_op, 1),
8876                            ignore ? const0_rtx : NULL_RTX, VOIDmode, 0);
8877             else if (binary_op)
8878               store_expr (build (TREE_CODE (binary_op), type,
8879                                  make_tree (type, temp),
8880                                  TREE_OPERAND (binary_op, 1)),
8881                           temp, modifier == EXPAND_STACK_PARM ? 2 : 0);
8882             else
8883               store_expr (build1 (TREE_CODE (unary_op), type,
8884                                   make_tree (type, temp)),
8885                           temp, modifier == EXPAND_STACK_PARM ? 2 : 0);
8886             op1 = op0;
8887           }
8888         /* Check for A op 0 ? A : FOO and A op 0 ? FOO : A where OP is any
8889            comparison operator.  If we have one of these cases, set the
8890            output to A, branch on A (cse will merge these two references),
8891            then set the output to FOO.  */
8892         else if (temp
8893                  && TREE_CODE_CLASS (TREE_CODE (TREE_OPERAND (exp, 0))) == '<'
8894                  && integer_zerop (TREE_OPERAND (TREE_OPERAND (exp, 0), 1))
8895                  && operand_equal_p (TREE_OPERAND (TREE_OPERAND (exp, 0), 0),
8896                                      TREE_OPERAND (exp, 1), 0)
8897                  && (! TREE_SIDE_EFFECTS (TREE_OPERAND (exp, 0))
8898                      || TREE_CODE (TREE_OPERAND (exp, 1)) == SAVE_EXPR)
8899                  && safe_from_p (temp, TREE_OPERAND (exp, 2), 1))
8900           {
8901             if (GET_CODE (temp) == REG
8902                 && REGNO (temp) < FIRST_PSEUDO_REGISTER)
8903               temp = gen_reg_rtx (mode);
8904             store_expr (TREE_OPERAND (exp, 1), temp,
8905                         modifier == EXPAND_STACK_PARM ? 2 : 0);
8906             jumpif (TREE_OPERAND (exp, 0), op0);
8907
8908             start_cleanup_deferral ();
8909             store_expr (TREE_OPERAND (exp, 2), temp,
8910                         modifier == EXPAND_STACK_PARM ? 2 : 0);
8911             op1 = op0;
8912           }
8913         else if (temp
8914                  && TREE_CODE_CLASS (TREE_CODE (TREE_OPERAND (exp, 0))) == '<'
8915                  && integer_zerop (TREE_OPERAND (TREE_OPERAND (exp, 0), 1))
8916                  && operand_equal_p (TREE_OPERAND (TREE_OPERAND (exp, 0), 0),
8917                                      TREE_OPERAND (exp, 2), 0)
8918                  && (! TREE_SIDE_EFFECTS (TREE_OPERAND (exp, 0))
8919                      || TREE_CODE (TREE_OPERAND (exp, 2)) == SAVE_EXPR)
8920                  && safe_from_p (temp, TREE_OPERAND (exp, 1), 1))
8921           {
8922             if (GET_CODE (temp) == REG
8923                 && REGNO (temp) < FIRST_PSEUDO_REGISTER)
8924               temp = gen_reg_rtx (mode);
8925             store_expr (TREE_OPERAND (exp, 2), temp,
8926                         modifier == EXPAND_STACK_PARM ? 2 : 0);
8927             jumpifnot (TREE_OPERAND (exp, 0), op0);
8928
8929             start_cleanup_deferral ();
8930             store_expr (TREE_OPERAND (exp, 1), temp,
8931                         modifier == EXPAND_STACK_PARM ? 2 : 0);
8932             op1 = op0;
8933           }
8934         else
8935           {
8936             op1 = gen_label_rtx ();
8937             jumpifnot (TREE_OPERAND (exp, 0), op0);
8938
8939             start_cleanup_deferral ();
8940
8941             /* One branch of the cond can be void, if it never returns. For
8942                example A ? throw : E  */
8943             if (temp != 0
8944                 && TREE_TYPE (TREE_OPERAND (exp, 1)) != void_type_node)
8945               store_expr (TREE_OPERAND (exp, 1), temp,
8946                           modifier == EXPAND_STACK_PARM ? 2 : 0);
8947             else
8948               expand_expr (TREE_OPERAND (exp, 1),
8949                            ignore ? const0_rtx : NULL_RTX, VOIDmode, 0);
8950             end_cleanup_deferral ();
8951             emit_queue ();
8952             emit_jump_insn (gen_jump (op1));
8953             emit_barrier ();
8954             emit_label (op0);
8955             start_cleanup_deferral ();
8956             if (temp != 0
8957                 && TREE_TYPE (TREE_OPERAND (exp, 2)) != void_type_node)
8958               store_expr (TREE_OPERAND (exp, 2), temp,
8959                           modifier == EXPAND_STACK_PARM ? 2 : 0);
8960             else
8961               expand_expr (TREE_OPERAND (exp, 2),
8962                            ignore ? const0_rtx : NULL_RTX, VOIDmode, 0);
8963           }
8964
8965         end_cleanup_deferral ();
8966
8967         emit_queue ();
8968         emit_label (op1);
8969         OK_DEFER_POP;
8970
8971         return temp;
8972       }
8973
8974     case TARGET_EXPR:
8975       {
8976         /* Something needs to be initialized, but we didn't know
8977            where that thing was when building the tree.  For example,
8978            it could be the return value of a function, or a parameter
8979            to a function which lays down in the stack, or a temporary
8980            variable which must be passed by reference.
8981
8982            We guarantee that the expression will either be constructed
8983            or copied into our original target.  */
8984
8985         tree slot = TREE_OPERAND (exp, 0);
8986         tree cleanups = NULL_TREE;
8987         tree exp1;
8988
8989         if (TREE_CODE (slot) != VAR_DECL)
8990           abort ();
8991
8992         if (! ignore)
8993           target = original_target;
8994
8995         /* Set this here so that if we get a target that refers to a
8996            register variable that's already been used, put_reg_into_stack
8997            knows that it should fix up those uses.  */
8998         TREE_USED (slot) = 1;
8999
9000         if (target == 0)
9001           {
9002             if (DECL_RTL_SET_P (slot))
9003               {
9004                 target = DECL_RTL (slot);
9005                 /* If we have already expanded the slot, so don't do
9006                    it again.  (mrs)  */
9007                 if (TREE_OPERAND (exp, 1) == NULL_TREE)
9008                   return target;
9009               }
9010             else
9011               {
9012                 target = assign_temp (type, 2, 0, 1);
9013                 /* All temp slots at this level must not conflict.  */
9014                 preserve_temp_slots (target);
9015                 SET_DECL_RTL (slot, target);
9016                 if (TREE_ADDRESSABLE (slot))
9017                   put_var_into_stack (slot, /*rescan=*/false);
9018
9019                 /* Since SLOT is not known to the called function
9020                    to belong to its stack frame, we must build an explicit
9021                    cleanup.  This case occurs when we must build up a reference
9022                    to pass the reference as an argument.  In this case,
9023                    it is very likely that such a reference need not be
9024                    built here.  */
9025
9026                 if (TREE_OPERAND (exp, 2) == 0)
9027                   TREE_OPERAND (exp, 2)
9028                     = (*lang_hooks.maybe_build_cleanup) (slot);
9029                 cleanups = TREE_OPERAND (exp, 2);
9030               }
9031           }
9032         else
9033           {
9034             /* This case does occur, when expanding a parameter which
9035                needs to be constructed on the stack.  The target
9036                is the actual stack address that we want to initialize.
9037                The function we call will perform the cleanup in this case.  */
9038
9039             /* If we have already assigned it space, use that space,
9040                not target that we were passed in, as our target
9041                parameter is only a hint.  */
9042             if (DECL_RTL_SET_P (slot))
9043               {
9044                 target = DECL_RTL (slot);
9045                 /* If we have already expanded the slot, so don't do
9046                    it again.  (mrs)  */
9047                 if (TREE_OPERAND (exp, 1) == NULL_TREE)
9048                   return target;
9049               }
9050             else
9051               {
9052                 SET_DECL_RTL (slot, target);
9053                 /* If we must have an addressable slot, then make sure that
9054                    the RTL that we just stored in slot is OK.  */
9055                 if (TREE_ADDRESSABLE (slot))
9056                   put_var_into_stack (slot, /*rescan=*/true);
9057               }
9058           }
9059
9060         exp1 = TREE_OPERAND (exp, 3) = TREE_OPERAND (exp, 1);
9061         /* Mark it as expanded.  */
9062         TREE_OPERAND (exp, 1) = NULL_TREE;
9063
9064         store_expr (exp1, target, modifier == EXPAND_STACK_PARM ? 2 : 0);
9065
9066         expand_decl_cleanup_eh (NULL_TREE, cleanups, CLEANUP_EH_ONLY (exp));
9067
9068         return target;
9069       }
9070
9071     case INIT_EXPR:
9072       {
9073         tree lhs = TREE_OPERAND (exp, 0);
9074         tree rhs = TREE_OPERAND (exp, 1);
9075
9076         temp = expand_assignment (lhs, rhs, ! ignore, original_target != 0);
9077         return temp;
9078       }
9079
9080     case MODIFY_EXPR:
9081       {
9082         /* If lhs is complex, expand calls in rhs before computing it.
9083            That's so we don't compute a pointer and save it over a
9084            call.  If lhs is simple, compute it first so we can give it
9085            as a target if the rhs is just a call.  This avoids an
9086            extra temp and copy and that prevents a partial-subsumption
9087            which makes bad code.  Actually we could treat
9088            component_ref's of vars like vars.  */
9089
9090         tree lhs = TREE_OPERAND (exp, 0);
9091         tree rhs = TREE_OPERAND (exp, 1);
9092
9093         temp = 0;
9094
9095         /* Check for |= or &= of a bitfield of size one into another bitfield
9096            of size 1.  In this case, (unless we need the result of the
9097            assignment) we can do this more efficiently with a
9098            test followed by an assignment, if necessary.
9099
9100            ??? At this point, we can't get a BIT_FIELD_REF here.  But if
9101            things change so we do, this code should be enhanced to
9102            support it.  */
9103         if (ignore
9104             && TREE_CODE (lhs) == COMPONENT_REF
9105             && (TREE_CODE (rhs) == BIT_IOR_EXPR
9106                 || TREE_CODE (rhs) == BIT_AND_EXPR)
9107             && TREE_OPERAND (rhs, 0) == lhs
9108             && TREE_CODE (TREE_OPERAND (rhs, 1)) == COMPONENT_REF
9109             && integer_onep (DECL_SIZE (TREE_OPERAND (lhs, 1)))
9110             && integer_onep (DECL_SIZE (TREE_OPERAND (TREE_OPERAND (rhs, 1), 1))))
9111           {
9112             rtx label = gen_label_rtx ();
9113
9114             do_jump (TREE_OPERAND (rhs, 1),
9115                      TREE_CODE (rhs) == BIT_IOR_EXPR ? label : 0,
9116                      TREE_CODE (rhs) == BIT_AND_EXPR ? label : 0);
9117             expand_assignment (lhs, convert (TREE_TYPE (rhs),
9118                                              (TREE_CODE (rhs) == BIT_IOR_EXPR
9119                                               ? integer_one_node
9120                                               : integer_zero_node)),
9121                                0, 0);
9122             do_pending_stack_adjust ();
9123             emit_label (label);
9124             return const0_rtx;
9125           }
9126
9127         temp = expand_assignment (lhs, rhs, ! ignore, original_target != 0);
9128
9129         return temp;
9130       }
9131
9132     case RETURN_EXPR:
9133       if (!TREE_OPERAND (exp, 0))
9134         expand_null_return ();
9135       else
9136         expand_return (TREE_OPERAND (exp, 0));
9137       return const0_rtx;
9138
9139     case PREINCREMENT_EXPR:
9140     case PREDECREMENT_EXPR:
9141       return expand_increment (exp, 0, ignore);
9142
9143     case POSTINCREMENT_EXPR:
9144     case POSTDECREMENT_EXPR:
9145       /* Faster to treat as pre-increment if result is not used.  */
9146       return expand_increment (exp, ! ignore, ignore);
9147
9148     case ADDR_EXPR:
9149       if (modifier == EXPAND_STACK_PARM)
9150         target = 0;
9151       /* Are we taking the address of a nested function?  */
9152       if (TREE_CODE (TREE_OPERAND (exp, 0)) == FUNCTION_DECL
9153           && decl_function_context (TREE_OPERAND (exp, 0)) != 0
9154           && ! DECL_NO_STATIC_CHAIN (TREE_OPERAND (exp, 0))
9155           && ! TREE_STATIC (exp))
9156         {
9157           op0 = trampoline_address (TREE_OPERAND (exp, 0));
9158           op0 = force_operand (op0, target);
9159         }
9160       /* If we are taking the address of something erroneous, just
9161          return a zero.  */
9162       else if (TREE_CODE (TREE_OPERAND (exp, 0)) == ERROR_MARK)
9163         return const0_rtx;
9164       /* If we are taking the address of a constant and are at the
9165          top level, we have to use output_constant_def since we can't
9166          call force_const_mem at top level.  */
9167       else if (cfun == 0
9168                && (TREE_CODE (TREE_OPERAND (exp, 0)) == CONSTRUCTOR
9169                    || (TREE_CODE_CLASS (TREE_CODE (TREE_OPERAND (exp, 0)))
9170                        == 'c')))
9171         op0 = XEXP (output_constant_def (TREE_OPERAND (exp, 0), 0), 0);
9172       else
9173         {
9174           /* We make sure to pass const0_rtx down if we came in with
9175              ignore set, to avoid doing the cleanups twice for something.  */
9176           op0 = expand_expr (TREE_OPERAND (exp, 0),
9177                              ignore ? const0_rtx : NULL_RTX, VOIDmode,
9178                              (modifier == EXPAND_INITIALIZER
9179                               ? modifier : EXPAND_CONST_ADDRESS));
9180
9181           /* If we are going to ignore the result, OP0 will have been set
9182              to const0_rtx, so just return it.  Don't get confused and
9183              think we are taking the address of the constant.  */
9184           if (ignore)
9185             return op0;
9186
9187           /* Pass 1 for MODIFY, so that protect_from_queue doesn't get
9188              clever and returns a REG when given a MEM.  */
9189           op0 = protect_from_queue (op0, 1);
9190
9191           /* We would like the object in memory.  If it is a constant, we can
9192              have it be statically allocated into memory.  For a non-constant,
9193              we need to allocate some memory and store the value into it.  */
9194
9195           if (CONSTANT_P (op0))
9196             op0 = force_const_mem (TYPE_MODE (TREE_TYPE (TREE_OPERAND (exp, 0))),
9197                                    op0);
9198           else if (GET_CODE (op0) == REG || GET_CODE (op0) == SUBREG
9199                    || GET_CODE (op0) == CONCAT || GET_CODE (op0) == ADDRESSOF
9200                    || GET_CODE (op0) == PARALLEL)
9201             {
9202               /* If the operand is a SAVE_EXPR, we can deal with this by
9203                  forcing the SAVE_EXPR into memory.  */
9204               if (TREE_CODE (TREE_OPERAND (exp, 0)) == SAVE_EXPR)
9205                 {
9206                   put_var_into_stack (TREE_OPERAND (exp, 0),
9207                                       /*rescan=*/true);
9208                   op0 = SAVE_EXPR_RTL (TREE_OPERAND (exp, 0));
9209                 }
9210               else
9211                 {
9212                   /* If this object is in a register, it can't be BLKmode.  */
9213                   tree inner_type = TREE_TYPE (TREE_OPERAND (exp, 0));
9214                   rtx memloc = assign_temp (inner_type, 1, 1, 1);
9215
9216                   if (GET_CODE (op0) == PARALLEL)
9217                     /* Handle calls that pass values in multiple
9218                        non-contiguous locations.  The Irix 6 ABI has examples
9219                        of this.  */
9220                     emit_group_store (memloc, op0,
9221                                       int_size_in_bytes (inner_type));
9222                   else
9223                     emit_move_insn (memloc, op0);
9224
9225                   op0 = memloc;
9226                 }
9227             }
9228
9229           if (GET_CODE (op0) != MEM)
9230             abort ();
9231
9232           mark_temp_addr_taken (op0);
9233           if (modifier == EXPAND_SUM || modifier == EXPAND_INITIALIZER)
9234             {
9235               op0 = XEXP (op0, 0);
9236 #ifdef POINTERS_EXTEND_UNSIGNED
9237               if (GET_MODE (op0) == Pmode && GET_MODE (op0) != mode
9238                   && mode == ptr_mode)
9239                 op0 = convert_memory_address (ptr_mode, op0);
9240 #endif
9241               return op0;
9242             }
9243
9244           /* If OP0 is not aligned as least as much as the type requires, we
9245              need to make a temporary, copy OP0 to it, and take the address of
9246              the temporary.  We want to use the alignment of the type, not of
9247              the operand.  Note that this is incorrect for FUNCTION_TYPE, but
9248              the test for BLKmode means that can't happen.  The test for
9249              BLKmode is because we never make mis-aligned MEMs with
9250              non-BLKmode.
9251
9252              We don't need to do this at all if the machine doesn't have
9253              strict alignment.  */
9254           if (STRICT_ALIGNMENT && GET_MODE (op0) == BLKmode
9255               && (TYPE_ALIGN (TREE_TYPE (TREE_OPERAND (exp, 0)))
9256                   > MEM_ALIGN (op0))
9257               && MEM_ALIGN (op0) < BIGGEST_ALIGNMENT)
9258             {
9259               tree inner_type = TREE_TYPE (TREE_OPERAND (exp, 0));
9260               rtx new;
9261
9262               if (TYPE_ALIGN_OK (inner_type))
9263                 abort ();
9264
9265               if (TREE_ADDRESSABLE (inner_type))
9266                 {
9267                   /* We can't make a bitwise copy of this object, so fail.  */
9268                   error ("cannot take the address of an unaligned member");
9269                   return const0_rtx;
9270                 }
9271
9272               new = assign_stack_temp_for_type
9273                 (TYPE_MODE (inner_type),
9274                  MEM_SIZE (op0) ? INTVAL (MEM_SIZE (op0))
9275                  : int_size_in_bytes (inner_type),
9276                  1, build_qualified_type (inner_type,
9277                                           (TYPE_QUALS (inner_type)
9278                                            | TYPE_QUAL_CONST)));
9279
9280               emit_block_move (new, op0, expr_size (TREE_OPERAND (exp, 0)),
9281                                (modifier == EXPAND_STACK_PARM
9282                                 ? BLOCK_OP_CALL_PARM : BLOCK_OP_NORMAL));
9283
9284               op0 = new;
9285             }
9286
9287           op0 = force_operand (XEXP (op0, 0), target);
9288         }
9289
9290       if (flag_force_addr
9291           && GET_CODE (op0) != REG
9292           && modifier != EXPAND_CONST_ADDRESS
9293           && modifier != EXPAND_INITIALIZER
9294           && modifier != EXPAND_SUM)
9295         op0 = force_reg (Pmode, op0);
9296
9297       if (GET_CODE (op0) == REG
9298           && ! REG_USERVAR_P (op0))
9299         mark_reg_pointer (op0, TYPE_ALIGN (TREE_TYPE (type)));
9300
9301 #ifdef POINTERS_EXTEND_UNSIGNED
9302       if (GET_MODE (op0) == Pmode && GET_MODE (op0) != mode
9303           && mode == ptr_mode)
9304         op0 = convert_memory_address (ptr_mode, op0);
9305 #endif
9306
9307       return op0;
9308
9309     case ENTRY_VALUE_EXPR:
9310       abort ();
9311
9312     /* COMPLEX type for Extended Pascal & Fortran  */
9313     case COMPLEX_EXPR:
9314       {
9315         enum machine_mode mode = TYPE_MODE (TREE_TYPE (TREE_TYPE (exp)));
9316         rtx insns;
9317
9318         /* Get the rtx code of the operands.  */
9319         op0 = expand_expr (TREE_OPERAND (exp, 0), 0, VOIDmode, 0);
9320         op1 = expand_expr (TREE_OPERAND (exp, 1), 0, VOIDmode, 0);
9321
9322         if (! target)
9323           target = gen_reg_rtx (TYPE_MODE (TREE_TYPE (exp)));
9324
9325         start_sequence ();
9326
9327         /* Move the real (op0) and imaginary (op1) parts to their location.  */
9328         emit_move_insn (gen_realpart (mode, target), op0);
9329         emit_move_insn (gen_imagpart (mode, target), op1);
9330
9331         insns = get_insns ();
9332         end_sequence ();
9333
9334         /* Complex construction should appear as a single unit.  */
9335         /* If TARGET is a CONCAT, we got insns like RD = RS, ID = IS,
9336            each with a separate pseudo as destination.
9337            It's not correct for flow to treat them as a unit.  */
9338         if (GET_CODE (target) != CONCAT)
9339           emit_no_conflict_block (insns, target, op0, op1, NULL_RTX);
9340         else
9341           emit_insn (insns);
9342
9343         return target;
9344       }
9345
9346     case REALPART_EXPR:
9347       op0 = expand_expr (TREE_OPERAND (exp, 0), 0, VOIDmode, 0);
9348       return gen_realpart (mode, op0);
9349
9350     case IMAGPART_EXPR:
9351       op0 = expand_expr (TREE_OPERAND (exp, 0), 0, VOIDmode, 0);
9352       return gen_imagpart (mode, op0);
9353
9354     case CONJ_EXPR:
9355       {
9356         enum machine_mode partmode = TYPE_MODE (TREE_TYPE (TREE_TYPE (exp)));
9357         rtx imag_t;
9358         rtx insns;
9359
9360         op0 = expand_expr (TREE_OPERAND (exp, 0), 0, VOIDmode, 0);
9361
9362         if (! target)
9363           target = gen_reg_rtx (mode);
9364
9365         start_sequence ();
9366
9367         /* Store the realpart and the negated imagpart to target.  */
9368         emit_move_insn (gen_realpart (partmode, target),
9369                         gen_realpart (partmode, op0));
9370
9371         imag_t = gen_imagpart (partmode, target);
9372         temp = expand_unop (partmode,
9373                             ! unsignedp && flag_trapv
9374                             && (GET_MODE_CLASS(partmode) == MODE_INT)
9375                             ? negv_optab : neg_optab,
9376                             gen_imagpart (partmode, op0), imag_t, 0);
9377         if (temp != imag_t)
9378           emit_move_insn (imag_t, temp);
9379
9380         insns = get_insns ();
9381         end_sequence ();
9382
9383         /* Conjugate should appear as a single unit
9384            If TARGET is a CONCAT, we got insns like RD = RS, ID = - IS,
9385            each with a separate pseudo as destination.
9386            It's not correct for flow to treat them as a unit.  */
9387         if (GET_CODE (target) != CONCAT)
9388           emit_no_conflict_block (insns, target, op0, NULL_RTX, NULL_RTX);
9389         else
9390           emit_insn (insns);
9391
9392         return target;
9393       }
9394
9395     case TRY_CATCH_EXPR:
9396       {
9397         tree handler = TREE_OPERAND (exp, 1);
9398
9399         expand_eh_region_start ();
9400
9401         op0 = expand_expr (TREE_OPERAND (exp, 0), 0, VOIDmode, 0);
9402
9403         expand_eh_region_end_cleanup (handler);
9404
9405         return op0;
9406       }
9407
9408     case TRY_FINALLY_EXPR:
9409       {
9410         tree try_block = TREE_OPERAND (exp, 0);
9411         tree finally_block = TREE_OPERAND (exp, 1);
9412
9413         if (!optimize || unsafe_for_reeval (finally_block) > 1)
9414           {
9415             /* In this case, wrapping FINALLY_BLOCK in an UNSAVE_EXPR
9416                is not sufficient, so we cannot expand the block twice.
9417                So we play games with GOTO_SUBROUTINE_EXPR to let us
9418                expand the thing only once.  */
9419             /* When not optimizing, we go ahead with this form since
9420                (1) user breakpoints operate more predictably without
9421                    code duplication, and
9422                (2) we're not running any of the global optimizers
9423                    that would explode in time/space with the highly
9424                    connected CFG created by the indirect branching.  */
9425
9426             rtx finally_label = gen_label_rtx ();
9427             rtx done_label = gen_label_rtx ();
9428             rtx return_link = gen_reg_rtx (Pmode);
9429             tree cleanup = build (GOTO_SUBROUTINE_EXPR, void_type_node,
9430                                   (tree) finally_label, (tree) return_link);
9431             TREE_SIDE_EFFECTS (cleanup) = 1;
9432
9433             /* Start a new binding layer that will keep track of all cleanup
9434                actions to be performed.  */
9435             expand_start_bindings (2);
9436             target_temp_slot_level = temp_slot_level;
9437
9438             expand_decl_cleanup (NULL_TREE, cleanup);
9439             op0 = expand_expr (try_block, target, tmode, modifier);
9440
9441             preserve_temp_slots (op0);
9442             expand_end_bindings (NULL_TREE, 0, 0);
9443             emit_jump (done_label);
9444             emit_label (finally_label);
9445             expand_expr (finally_block, const0_rtx, VOIDmode, 0);
9446             emit_indirect_jump (return_link);
9447             emit_label (done_label);
9448           }
9449         else
9450           {
9451             expand_start_bindings (2);
9452             target_temp_slot_level = temp_slot_level;
9453
9454             expand_decl_cleanup (NULL_TREE, finally_block);
9455             op0 = expand_expr (try_block, target, tmode, modifier);
9456
9457             preserve_temp_slots (op0);
9458             expand_end_bindings (NULL_TREE, 0, 0);
9459           }
9460
9461         return op0;
9462       }
9463
9464     case GOTO_SUBROUTINE_EXPR:
9465       {
9466         rtx subr = (rtx) TREE_OPERAND (exp, 0);
9467         rtx return_link = *(rtx *) &TREE_OPERAND (exp, 1);
9468         rtx return_address = gen_label_rtx ();
9469         emit_move_insn (return_link,
9470                         gen_rtx_LABEL_REF (Pmode, return_address));
9471         emit_jump (subr);
9472         emit_label (return_address);
9473         return const0_rtx;
9474       }
9475
9476     case VA_ARG_EXPR:
9477       return expand_builtin_va_arg (TREE_OPERAND (exp, 0), type);
9478
9479     case EXC_PTR_EXPR:
9480       return get_exception_pointer (cfun);
9481
9482     case FDESC_EXPR:
9483       /* Function descriptors are not valid except for as
9484          initialization constants, and should not be expanded.  */
9485       abort ();
9486
9487     default:
9488       return (*lang_hooks.expand_expr) (exp, original_target, tmode, modifier);
9489     }
9490
9491   /* Here to do an ordinary binary operator, generating an instruction
9492      from the optab already placed in `this_optab'.  */
9493  binop:
9494   if (! safe_from_p (subtarget, TREE_OPERAND (exp, 1), 1))
9495     subtarget = 0;
9496   op0 = expand_expr (TREE_OPERAND (exp, 0), subtarget, VOIDmode, 0);
9497   op1 = expand_expr (TREE_OPERAND (exp, 1), NULL_RTX, VOIDmode, 0);
9498  binop2:
9499   if (modifier == EXPAND_STACK_PARM)
9500     target = 0;
9501   temp = expand_binop (mode, this_optab, op0, op1, target,
9502                        unsignedp, OPTAB_LIB_WIDEN);
9503   if (temp == 0)
9504     abort ();
9505   return temp;
9506 }
9507 \f
9508 /* Subroutine of above: returns 1 if OFFSET corresponds to an offset that
9509    when applied to the address of EXP produces an address known to be
9510    aligned more than BIGGEST_ALIGNMENT.  */
9511
9512 static int
9513 is_aligning_offset (offset, exp)
9514      tree offset;
9515      tree exp;
9516 {
9517   /* Strip off any conversions and WITH_RECORD_EXPR nodes.  */
9518   while (TREE_CODE (offset) == NON_LVALUE_EXPR
9519          || TREE_CODE (offset) == NOP_EXPR
9520          || TREE_CODE (offset) == CONVERT_EXPR
9521          || TREE_CODE (offset) == WITH_RECORD_EXPR)
9522     offset = TREE_OPERAND (offset, 0);
9523
9524   /* We must now have a BIT_AND_EXPR with a constant that is one less than
9525      power of 2 and which is larger than BIGGEST_ALIGNMENT.  */
9526   if (TREE_CODE (offset) != BIT_AND_EXPR
9527       || !host_integerp (TREE_OPERAND (offset, 1), 1)
9528       || compare_tree_int (TREE_OPERAND (offset, 1), BIGGEST_ALIGNMENT) <= 0
9529       || !exact_log2 (tree_low_cst (TREE_OPERAND (offset, 1), 1) + 1) < 0)
9530     return 0;
9531
9532   /* Look at the first operand of BIT_AND_EXPR and strip any conversion.
9533      It must be NEGATE_EXPR.  Then strip any more conversions.  */
9534   offset = TREE_OPERAND (offset, 0);
9535   while (TREE_CODE (offset) == NON_LVALUE_EXPR
9536          || TREE_CODE (offset) == NOP_EXPR
9537          || TREE_CODE (offset) == CONVERT_EXPR)
9538     offset = TREE_OPERAND (offset, 0);
9539
9540   if (TREE_CODE (offset) != NEGATE_EXPR)
9541     return 0;
9542
9543   offset = TREE_OPERAND (offset, 0);
9544   while (TREE_CODE (offset) == NON_LVALUE_EXPR
9545          || TREE_CODE (offset) == NOP_EXPR
9546          || TREE_CODE (offset) == CONVERT_EXPR)
9547     offset = TREE_OPERAND (offset, 0);
9548
9549   /* This must now be the address either of EXP or of a PLACEHOLDER_EXPR
9550      whose type is the same as EXP.  */
9551   return (TREE_CODE (offset) == ADDR_EXPR
9552           && (TREE_OPERAND (offset, 0) == exp
9553               || (TREE_CODE (TREE_OPERAND (offset, 0)) == PLACEHOLDER_EXPR
9554                   && (TREE_TYPE (TREE_OPERAND (offset, 0))
9555                       == TREE_TYPE (exp)))));
9556 }
9557 \f
9558 /* Return the tree node if an ARG corresponds to a string constant or zero
9559    if it doesn't.  If we return nonzero, set *PTR_OFFSET to the offset
9560    in bytes within the string that ARG is accessing.  The type of the
9561    offset will be `sizetype'.  */
9562
9563 tree
9564 string_constant (arg, ptr_offset)
9565      tree arg;
9566      tree *ptr_offset;
9567 {
9568   STRIP_NOPS (arg);
9569
9570   if (TREE_CODE (arg) == ADDR_EXPR
9571       && TREE_CODE (TREE_OPERAND (arg, 0)) == STRING_CST)
9572     {
9573       *ptr_offset = size_zero_node;
9574       return TREE_OPERAND (arg, 0);
9575     }
9576   else if (TREE_CODE (arg) == PLUS_EXPR)
9577     {
9578       tree arg0 = TREE_OPERAND (arg, 0);
9579       tree arg1 = TREE_OPERAND (arg, 1);
9580
9581       STRIP_NOPS (arg0);
9582       STRIP_NOPS (arg1);
9583
9584       if (TREE_CODE (arg0) == ADDR_EXPR
9585           && TREE_CODE (TREE_OPERAND (arg0, 0)) == STRING_CST)
9586         {
9587           *ptr_offset = convert (sizetype, arg1);
9588           return TREE_OPERAND (arg0, 0);
9589         }
9590       else if (TREE_CODE (arg1) == ADDR_EXPR
9591                && TREE_CODE (TREE_OPERAND (arg1, 0)) == STRING_CST)
9592         {
9593           *ptr_offset = convert (sizetype, arg0);
9594           return TREE_OPERAND (arg1, 0);
9595         }
9596     }
9597
9598   return 0;
9599 }
9600 \f
9601 /* Expand code for a post- or pre- increment or decrement
9602    and return the RTX for the result.
9603    POST is 1 for postinc/decrements and 0 for preinc/decrements.  */
9604
9605 static rtx
9606 expand_increment (exp, post, ignore)
9607      tree exp;
9608      int post, ignore;
9609 {
9610   rtx op0, op1;
9611   rtx temp, value;
9612   tree incremented = TREE_OPERAND (exp, 0);
9613   optab this_optab = add_optab;
9614   int icode;
9615   enum machine_mode mode = TYPE_MODE (TREE_TYPE (exp));
9616   int op0_is_copy = 0;
9617   int single_insn = 0;
9618   /* 1 means we can't store into OP0 directly,
9619      because it is a subreg narrower than a word,
9620      and we don't dare clobber the rest of the word.  */
9621   int bad_subreg = 0;
9622
9623   /* Stabilize any component ref that might need to be
9624      evaluated more than once below.  */
9625   if (!post
9626       || TREE_CODE (incremented) == BIT_FIELD_REF
9627       || (TREE_CODE (incremented) == COMPONENT_REF
9628           && (TREE_CODE (TREE_OPERAND (incremented, 0)) != INDIRECT_REF
9629               || DECL_BIT_FIELD (TREE_OPERAND (incremented, 1)))))
9630     incremented = stabilize_reference (incremented);
9631   /* Nested *INCREMENT_EXPRs can happen in C++.  We must force innermost
9632      ones into save exprs so that they don't accidentally get evaluated
9633      more than once by the code below.  */
9634   if (TREE_CODE (incremented) == PREINCREMENT_EXPR
9635       || TREE_CODE (incremented) == PREDECREMENT_EXPR)
9636     incremented = save_expr (incremented);
9637
9638   /* Compute the operands as RTX.
9639      Note whether OP0 is the actual lvalue or a copy of it:
9640      I believe it is a copy iff it is a register or subreg
9641      and insns were generated in computing it.  */
9642
9643   temp = get_last_insn ();
9644   op0 = expand_expr (incremented, NULL_RTX, VOIDmode, 0);
9645
9646   /* If OP0 is a SUBREG made for a promoted variable, we cannot increment
9647      in place but instead must do sign- or zero-extension during assignment,
9648      so we copy it into a new register and let the code below use it as
9649      a copy.
9650
9651      Note that we can safely modify this SUBREG since it is know not to be
9652      shared (it was made by the expand_expr call above).  */
9653
9654   if (GET_CODE (op0) == SUBREG && SUBREG_PROMOTED_VAR_P (op0))
9655     {
9656       if (post)
9657         SUBREG_REG (op0) = copy_to_reg (SUBREG_REG (op0));
9658       else
9659         bad_subreg = 1;
9660     }
9661   else if (GET_CODE (op0) == SUBREG
9662            && GET_MODE_BITSIZE (GET_MODE (op0)) < BITS_PER_WORD)
9663     {
9664       /* We cannot increment this SUBREG in place.  If we are
9665          post-incrementing, get a copy of the old value.  Otherwise,
9666          just mark that we cannot increment in place.  */
9667       if (post)
9668         op0 = copy_to_reg (op0);
9669       else
9670         bad_subreg = 1;
9671     }
9672
9673   op0_is_copy = ((GET_CODE (op0) == SUBREG || GET_CODE (op0) == REG)
9674                  && temp != get_last_insn ());
9675   op1 = expand_expr (TREE_OPERAND (exp, 1), NULL_RTX, VOIDmode, 0);
9676
9677   /* Decide whether incrementing or decrementing.  */
9678   if (TREE_CODE (exp) == POSTDECREMENT_EXPR
9679       || TREE_CODE (exp) == PREDECREMENT_EXPR)
9680     this_optab = sub_optab;
9681
9682   /* Convert decrement by a constant into a negative increment.  */
9683   if (this_optab == sub_optab
9684       && GET_CODE (op1) == CONST_INT)
9685     {
9686       op1 = GEN_INT (-INTVAL (op1));
9687       this_optab = add_optab;
9688     }
9689
9690   if (TYPE_TRAP_SIGNED (TREE_TYPE (exp)))
9691     this_optab = this_optab == add_optab ? addv_optab : subv_optab;
9692
9693   /* For a preincrement, see if we can do this with a single instruction.  */
9694   if (!post)
9695     {
9696       icode = (int) this_optab->handlers[(int) mode].insn_code;
9697       if (icode != (int) CODE_FOR_nothing
9698           /* Make sure that OP0 is valid for operands 0 and 1
9699              of the insn we want to queue.  */
9700           && (*insn_data[icode].operand[0].predicate) (op0, mode)
9701           && (*insn_data[icode].operand[1].predicate) (op0, mode)
9702           && (*insn_data[icode].operand[2].predicate) (op1, mode))
9703         single_insn = 1;
9704     }
9705
9706   /* If OP0 is not the actual lvalue, but rather a copy in a register,
9707      then we cannot just increment OP0.  We must therefore contrive to
9708      increment the original value.  Then, for postincrement, we can return
9709      OP0 since it is a copy of the old value.  For preincrement, expand here
9710      unless we can do it with a single insn.
9711
9712      Likewise if storing directly into OP0 would clobber high bits
9713      we need to preserve (bad_subreg).  */
9714   if (op0_is_copy || (!post && !single_insn) || bad_subreg)
9715     {
9716       /* This is the easiest way to increment the value wherever it is.
9717          Problems with multiple evaluation of INCREMENTED are prevented
9718          because either (1) it is a component_ref or preincrement,
9719          in which case it was stabilized above, or (2) it is an array_ref
9720          with constant index in an array in a register, which is
9721          safe to reevaluate.  */
9722       tree newexp = build (((TREE_CODE (exp) == POSTDECREMENT_EXPR
9723                              || TREE_CODE (exp) == PREDECREMENT_EXPR)
9724                             ? MINUS_EXPR : PLUS_EXPR),
9725                            TREE_TYPE (exp),
9726                            incremented,
9727                            TREE_OPERAND (exp, 1));
9728
9729       while (TREE_CODE (incremented) == NOP_EXPR
9730              || TREE_CODE (incremented) == CONVERT_EXPR)
9731         {
9732           newexp = convert (TREE_TYPE (incremented), newexp);
9733           incremented = TREE_OPERAND (incremented, 0);
9734         }
9735
9736       temp = expand_assignment (incremented, newexp, ! post && ! ignore , 0);
9737       return post ? op0 : temp;
9738     }
9739
9740   if (post)
9741     {
9742       /* We have a true reference to the value in OP0.
9743          If there is an insn to add or subtract in this mode, queue it.
9744          Queueing the increment insn avoids the register shuffling
9745          that often results if we must increment now and first save
9746          the old value for subsequent use.  */
9747
9748 #if 0  /* Turned off to avoid making extra insn for indexed memref.  */
9749       op0 = stabilize (op0);
9750 #endif
9751
9752       icode = (int) this_optab->handlers[(int) mode].insn_code;
9753       if (icode != (int) CODE_FOR_nothing
9754           /* Make sure that OP0 is valid for operands 0 and 1
9755              of the insn we want to queue.  */
9756           && (*insn_data[icode].operand[0].predicate) (op0, mode)
9757           && (*insn_data[icode].operand[1].predicate) (op0, mode))
9758         {
9759           if (! (*insn_data[icode].operand[2].predicate) (op1, mode))
9760             op1 = force_reg (mode, op1);
9761
9762           return enqueue_insn (op0, GEN_FCN (icode) (op0, op0, op1));
9763         }
9764       if (icode != (int) CODE_FOR_nothing && GET_CODE (op0) == MEM)
9765         {
9766           rtx addr = (general_operand (XEXP (op0, 0), mode)
9767                       ? force_reg (Pmode, XEXP (op0, 0))
9768                       : copy_to_reg (XEXP (op0, 0)));
9769           rtx temp, result;
9770
9771           op0 = replace_equiv_address (op0, addr);
9772           temp = force_reg (GET_MODE (op0), op0);
9773           if (! (*insn_data[icode].operand[2].predicate) (op1, mode))
9774             op1 = force_reg (mode, op1);
9775
9776           /* The increment queue is LIFO, thus we have to `queue'
9777              the instructions in reverse order.  */
9778           enqueue_insn (op0, gen_move_insn (op0, temp));
9779           result = enqueue_insn (temp, GEN_FCN (icode) (temp, temp, op1));
9780           return result;
9781         }
9782     }
9783
9784   /* Preincrement, or we can't increment with one simple insn.  */
9785   if (post)
9786     /* Save a copy of the value before inc or dec, to return it later.  */
9787     temp = value = copy_to_reg (op0);
9788   else
9789     /* Arrange to return the incremented value.  */
9790     /* Copy the rtx because expand_binop will protect from the queue,
9791        and the results of that would be invalid for us to return
9792        if our caller does emit_queue before using our result.  */
9793     temp = copy_rtx (value = op0);
9794
9795   /* Increment however we can.  */
9796   op1 = expand_binop (mode, this_optab, value, op1, op0,
9797                       TREE_UNSIGNED (TREE_TYPE (exp)), OPTAB_LIB_WIDEN);
9798
9799   /* Make sure the value is stored into OP0.  */
9800   if (op1 != op0)
9801     emit_move_insn (op0, op1);
9802
9803   return temp;
9804 }
9805 \f
9806 /* Generate code to calculate EXP using a store-flag instruction
9807    and return an rtx for the result.  EXP is either a comparison
9808    or a TRUTH_NOT_EXPR whose operand is a comparison.
9809
9810    If TARGET is nonzero, store the result there if convenient.
9811
9812    If ONLY_CHEAP is nonzero, only do this if it is likely to be very
9813    cheap.
9814
9815    Return zero if there is no suitable set-flag instruction
9816    available on this machine.
9817
9818    Once expand_expr has been called on the arguments of the comparison,
9819    we are committed to doing the store flag, since it is not safe to
9820    re-evaluate the expression.  We emit the store-flag insn by calling
9821    emit_store_flag, but only expand the arguments if we have a reason
9822    to believe that emit_store_flag will be successful.  If we think that
9823    it will, but it isn't, we have to simulate the store-flag with a
9824    set/jump/set sequence.  */
9825
9826 static rtx
9827 do_store_flag (exp, target, mode, only_cheap)
9828      tree exp;
9829      rtx target;
9830      enum machine_mode mode;
9831      int only_cheap;
9832 {
9833   enum rtx_code code;
9834   tree arg0, arg1, type;
9835   tree tem;
9836   enum machine_mode operand_mode;
9837   int invert = 0;
9838   int unsignedp;
9839   rtx op0, op1;
9840   enum insn_code icode;
9841   rtx subtarget = target;
9842   rtx result, label;
9843
9844   /* If this is a TRUTH_NOT_EXPR, set a flag indicating we must invert the
9845      result at the end.  We can't simply invert the test since it would
9846      have already been inverted if it were valid.  This case occurs for
9847      some floating-point comparisons.  */
9848
9849   if (TREE_CODE (exp) == TRUTH_NOT_EXPR)
9850     invert = 1, exp = TREE_OPERAND (exp, 0);
9851
9852   arg0 = TREE_OPERAND (exp, 0);
9853   arg1 = TREE_OPERAND (exp, 1);
9854
9855   /* Don't crash if the comparison was erroneous.  */
9856   if (arg0 == error_mark_node || arg1 == error_mark_node)
9857     return const0_rtx;
9858
9859   type = TREE_TYPE (arg0);
9860   operand_mode = TYPE_MODE (type);
9861   unsignedp = TREE_UNSIGNED (type);
9862
9863   /* We won't bother with BLKmode store-flag operations because it would mean
9864      passing a lot of information to emit_store_flag.  */
9865   if (operand_mode == BLKmode)
9866     return 0;
9867
9868   /* We won't bother with store-flag operations involving function pointers
9869      when function pointers must be canonicalized before comparisons.  */
9870 #ifdef HAVE_canonicalize_funcptr_for_compare
9871   if (HAVE_canonicalize_funcptr_for_compare
9872       && ((TREE_CODE (TREE_TYPE (TREE_OPERAND (exp, 0))) == POINTER_TYPE
9873            && (TREE_CODE (TREE_TYPE (TREE_TYPE (TREE_OPERAND (exp, 0))))
9874                == FUNCTION_TYPE))
9875           || (TREE_CODE (TREE_TYPE (TREE_OPERAND (exp, 1))) == POINTER_TYPE
9876               && (TREE_CODE (TREE_TYPE (TREE_TYPE (TREE_OPERAND (exp, 1))))
9877                   == FUNCTION_TYPE))))
9878     return 0;
9879 #endif
9880
9881   STRIP_NOPS (arg0);
9882   STRIP_NOPS (arg1);
9883
9884   /* Get the rtx comparison code to use.  We know that EXP is a comparison
9885      operation of some type.  Some comparisons against 1 and -1 can be
9886      converted to comparisons with zero.  Do so here so that the tests
9887      below will be aware that we have a comparison with zero.   These
9888      tests will not catch constants in the first operand, but constants
9889      are rarely passed as the first operand.  */
9890
9891   switch (TREE_CODE (exp))
9892     {
9893     case EQ_EXPR:
9894       code = EQ;
9895       break;
9896     case NE_EXPR:
9897       code = NE;
9898       break;
9899     case LT_EXPR:
9900       if (integer_onep (arg1))
9901         arg1 = integer_zero_node, code = unsignedp ? LEU : LE;
9902       else
9903         code = unsignedp ? LTU : LT;
9904       break;
9905     case LE_EXPR:
9906       if (! unsignedp && integer_all_onesp (arg1))
9907         arg1 = integer_zero_node, code = LT;
9908       else
9909         code = unsignedp ? LEU : LE;
9910       break;
9911     case GT_EXPR:
9912       if (! unsignedp && integer_all_onesp (arg1))
9913         arg1 = integer_zero_node, code = GE;
9914       else
9915         code = unsignedp ? GTU : GT;
9916       break;
9917     case GE_EXPR:
9918       if (integer_onep (arg1))
9919         arg1 = integer_zero_node, code = unsignedp ? GTU : GT;
9920       else
9921         code = unsignedp ? GEU : GE;
9922       break;
9923
9924     case UNORDERED_EXPR:
9925       code = UNORDERED;
9926       break;
9927     case ORDERED_EXPR:
9928       code = ORDERED;
9929       break;
9930     case UNLT_EXPR:
9931       code = UNLT;
9932       break;
9933     case UNLE_EXPR:
9934       code = UNLE;
9935       break;
9936     case UNGT_EXPR:
9937       code = UNGT;
9938       break;
9939     case UNGE_EXPR:
9940       code = UNGE;
9941       break;
9942     case UNEQ_EXPR:
9943       code = UNEQ;
9944       break;
9945
9946     default:
9947       abort ();
9948     }
9949
9950   /* Put a constant second.  */
9951   if (TREE_CODE (arg0) == REAL_CST || TREE_CODE (arg0) == INTEGER_CST)
9952     {
9953       tem = arg0; arg0 = arg1; arg1 = tem;
9954       code = swap_condition (code);
9955     }
9956
9957   /* If this is an equality or inequality test of a single bit, we can
9958      do this by shifting the bit being tested to the low-order bit and
9959      masking the result with the constant 1.  If the condition was EQ,
9960      we xor it with 1.  This does not require an scc insn and is faster
9961      than an scc insn even if we have it.  */
9962
9963   if ((code == NE || code == EQ)
9964       && TREE_CODE (arg0) == BIT_AND_EXPR && integer_zerop (arg1)
9965       && integer_pow2p (TREE_OPERAND (arg0, 1)))
9966     {
9967       tree inner = TREE_OPERAND (arg0, 0);
9968       int bitnum = tree_log2 (TREE_OPERAND (arg0, 1));
9969       int ops_unsignedp;
9970
9971       /* If INNER is a right shift of a constant and it plus BITNUM does
9972          not overflow, adjust BITNUM and INNER.  */
9973
9974       if (TREE_CODE (inner) == RSHIFT_EXPR
9975           && TREE_CODE (TREE_OPERAND (inner, 1)) == INTEGER_CST
9976           && TREE_INT_CST_HIGH (TREE_OPERAND (inner, 1)) == 0
9977           && bitnum < TYPE_PRECISION (type)
9978           && 0 > compare_tree_int (TREE_OPERAND (inner, 1),
9979                                    bitnum - TYPE_PRECISION (type)))
9980         {
9981           bitnum += TREE_INT_CST_LOW (TREE_OPERAND (inner, 1));
9982           inner = TREE_OPERAND (inner, 0);
9983         }
9984
9985       /* If we are going to be able to omit the AND below, we must do our
9986          operations as unsigned.  If we must use the AND, we have a choice.
9987          Normally unsigned is faster, but for some machines signed is.  */
9988       ops_unsignedp = (bitnum == TYPE_PRECISION (type) - 1 ? 1
9989 #ifdef LOAD_EXTEND_OP
9990                        : (LOAD_EXTEND_OP (operand_mode) == SIGN_EXTEND ? 0 : 1)
9991 #else
9992                        : 1
9993 #endif
9994                        );
9995
9996       if (! get_subtarget (subtarget)
9997           || GET_MODE (subtarget) != operand_mode
9998           || ! safe_from_p (subtarget, inner, 1))
9999         subtarget = 0;
10000
10001       op0 = expand_expr (inner, subtarget, VOIDmode, 0);
10002
10003       if (bitnum != 0)
10004         op0 = expand_shift (RSHIFT_EXPR, operand_mode, op0,
10005                             size_int (bitnum), subtarget, ops_unsignedp);
10006
10007       if (GET_MODE (op0) != mode)
10008         op0 = convert_to_mode (mode, op0, ops_unsignedp);
10009
10010       if ((code == EQ && ! invert) || (code == NE && invert))
10011         op0 = expand_binop (mode, xor_optab, op0, const1_rtx, subtarget,
10012                             ops_unsignedp, OPTAB_LIB_WIDEN);
10013
10014       /* Put the AND last so it can combine with more things.  */
10015       if (bitnum != TYPE_PRECISION (type) - 1)
10016         op0 = expand_and (mode, op0, const1_rtx, subtarget);
10017
10018       return op0;
10019     }
10020
10021   /* Now see if we are likely to be able to do this.  Return if not.  */
10022   if (! can_compare_p (code, operand_mode, ccp_store_flag))
10023     return 0;
10024
10025   icode = setcc_gen_code[(int) code];
10026   if (icode == CODE_FOR_nothing
10027       || (only_cheap && insn_data[(int) icode].operand[0].mode != mode))
10028     {
10029       /* We can only do this if it is one of the special cases that
10030          can be handled without an scc insn.  */
10031       if ((code == LT && integer_zerop (arg1))
10032           || (! only_cheap && code == GE && integer_zerop (arg1)))
10033         ;
10034       else if (BRANCH_COST >= 0
10035                && ! only_cheap && (code == NE || code == EQ)
10036                && TREE_CODE (type) != REAL_TYPE
10037                && ((abs_optab->handlers[(int) operand_mode].insn_code
10038                     != CODE_FOR_nothing)
10039                    || (ffs_optab->handlers[(int) operand_mode].insn_code
10040                        != CODE_FOR_nothing)))
10041         ;
10042       else
10043         return 0;
10044     }
10045
10046   if (! get_subtarget (target)
10047       || GET_MODE (subtarget) != operand_mode
10048       || ! safe_from_p (subtarget, arg1, 1))
10049     subtarget = 0;
10050
10051   op0 = expand_expr (arg0, subtarget, VOIDmode, 0);
10052   op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);
10053
10054   if (target == 0)
10055     target = gen_reg_rtx (mode);
10056
10057   /* Pass copies of OP0 and OP1 in case they contain a QUEUED.  This is safe
10058      because, if the emit_store_flag does anything it will succeed and
10059      OP0 and OP1 will not be used subsequently.  */
10060
10061   result = emit_store_flag (target, code,
10062                             queued_subexp_p (op0) ? copy_rtx (op0) : op0,
10063                             queued_subexp_p (op1) ? copy_rtx (op1) : op1,
10064                             operand_mode, unsignedp, 1);
10065
10066   if (result)
10067     {
10068       if (invert)
10069         result = expand_binop (mode, xor_optab, result, const1_rtx,
10070                                result, 0, OPTAB_LIB_WIDEN);
10071       return result;
10072     }
10073
10074   /* If this failed, we have to do this with set/compare/jump/set code.  */
10075   if (GET_CODE (target) != REG
10076       || reg_mentioned_p (target, op0) || reg_mentioned_p (target, op1))
10077     target = gen_reg_rtx (GET_MODE (target));
10078
10079   emit_move_insn (target, invert ? const0_rtx : const1_rtx);
10080   result = compare_from_rtx (op0, op1, code, unsignedp,
10081                              operand_mode, NULL_RTX);
10082   if (GET_CODE (result) == CONST_INT)
10083     return (((result == const0_rtx && ! invert)
10084              || (result != const0_rtx && invert))
10085             ? const0_rtx : const1_rtx);
10086
10087   /* The code of RESULT may not match CODE if compare_from_rtx
10088      decided to swap its operands and reverse the original code.
10089
10090      We know that compare_from_rtx returns either a CONST_INT or
10091      a new comparison code, so it is safe to just extract the
10092      code from RESULT.  */
10093   code = GET_CODE (result);
10094
10095   label = gen_label_rtx ();
10096   if (bcc_gen_fctn[(int) code] == 0)
10097     abort ();
10098
10099   emit_jump_insn ((*bcc_gen_fctn[(int) code]) (label));
10100   emit_move_insn (target, invert ? const1_rtx : const0_rtx);
10101   emit_label (label);
10102
10103   return target;
10104 }
10105 \f
10106
10107 /* Stubs in case we haven't got a casesi insn.  */
10108 #ifndef HAVE_casesi
10109 # define HAVE_casesi 0
10110 # define gen_casesi(a, b, c, d, e) (0)
10111 # define CODE_FOR_casesi CODE_FOR_nothing
10112 #endif
10113
10114 /* If the machine does not have a case insn that compares the bounds,
10115    this means extra overhead for dispatch tables, which raises the
10116    threshold for using them.  */
10117 #ifndef CASE_VALUES_THRESHOLD
10118 #define CASE_VALUES_THRESHOLD (HAVE_casesi ? 4 : 5)
10119 #endif /* CASE_VALUES_THRESHOLD */
10120
10121 unsigned int
10122 case_values_threshold ()
10123 {
10124   return CASE_VALUES_THRESHOLD;
10125 }
10126
10127 /* Attempt to generate a casesi instruction.  Returns 1 if successful,
10128    0 otherwise (i.e. if there is no casesi instruction).  */
10129 int
10130 try_casesi (index_type, index_expr, minval, range,
10131             table_label, default_label)
10132      tree index_type, index_expr, minval, range;
10133      rtx table_label ATTRIBUTE_UNUSED;
10134      rtx default_label;
10135 {
10136   enum machine_mode index_mode = SImode;
10137   int index_bits = GET_MODE_BITSIZE (index_mode);
10138   rtx op1, op2, index;
10139   enum machine_mode op_mode;
10140
10141   if (! HAVE_casesi)
10142     return 0;
10143
10144   /* Convert the index to SImode.  */
10145   if (GET_MODE_BITSIZE (TYPE_MODE (index_type)) > GET_MODE_BITSIZE (index_mode))
10146     {
10147       enum machine_mode omode = TYPE_MODE (index_type);
10148       rtx rangertx = expand_expr (range, NULL_RTX, VOIDmode, 0);
10149
10150       /* We must handle the endpoints in the original mode.  */
10151       index_expr = build (MINUS_EXPR, index_type,
10152                           index_expr, minval);
10153       minval = integer_zero_node;
10154       index = expand_expr (index_expr, NULL_RTX, VOIDmode, 0);
10155       emit_cmp_and_jump_insns (rangertx, index, LTU, NULL_RTX,
10156                                omode, 1, default_label);
10157       /* Now we can safely truncate.  */
10158       index = convert_to_mode (index_mode, index, 0);
10159     }
10160   else
10161     {
10162       if (TYPE_MODE (index_type) != index_mode)
10163         {
10164           index_expr = convert ((*lang_hooks.types.type_for_size)
10165                                 (index_bits, 0), index_expr);
10166           index_type = TREE_TYPE (index_expr);
10167         }
10168
10169       index = expand_expr (index_expr, NULL_RTX, VOIDmode, 0);
10170     }
10171   emit_queue ();
10172   index = protect_from_queue (index, 0);
10173   do_pending_stack_adjust ();
10174
10175   op_mode = insn_data[(int) CODE_FOR_casesi].operand[0].mode;
10176   if (! (*insn_data[(int) CODE_FOR_casesi].operand[0].predicate)
10177       (index, op_mode))
10178     index = copy_to_mode_reg (op_mode, index);
10179
10180   op1 = expand_expr (minval, NULL_RTX, VOIDmode, 0);
10181
10182   op_mode = insn_data[(int) CODE_FOR_casesi].operand[1].mode;
10183   op1 = convert_modes (op_mode, TYPE_MODE (TREE_TYPE (minval)),
10184                        op1, TREE_UNSIGNED (TREE_TYPE (minval)));
10185   if (! (*insn_data[(int) CODE_FOR_casesi].operand[1].predicate)
10186       (op1, op_mode))
10187     op1 = copy_to_mode_reg (op_mode, op1);
10188
10189   op2 = expand_expr (range, NULL_RTX, VOIDmode, 0);
10190
10191   op_mode = insn_data[(int) CODE_FOR_casesi].operand[2].mode;
10192   op2 = convert_modes (op_mode, TYPE_MODE (TREE_TYPE (range)),
10193                        op2, TREE_UNSIGNED (TREE_TYPE (range)));
10194   if (! (*insn_data[(int) CODE_FOR_casesi].operand[2].predicate)
10195       (op2, op_mode))
10196     op2 = copy_to_mode_reg (op_mode, op2);
10197
10198   emit_jump_insn (gen_casesi (index, op1, op2,
10199                               table_label, default_label));
10200   return 1;
10201 }
10202
10203 /* Attempt to generate a tablejump instruction; same concept.  */
10204 #ifndef HAVE_tablejump
10205 #define HAVE_tablejump 0
10206 #define gen_tablejump(x, y) (0)
10207 #endif
10208
10209 /* Subroutine of the next function.
10210
10211    INDEX is the value being switched on, with the lowest value
10212    in the table already subtracted.
10213    MODE is its expected mode (needed if INDEX is constant).
10214    RANGE is the length of the jump table.
10215    TABLE_LABEL is a CODE_LABEL rtx for the table itself.
10216
10217    DEFAULT_LABEL is a CODE_LABEL rtx to jump to if the
10218    index value is out of range.  */
10219
10220 static void
10221 do_tablejump (index, mode, range, table_label, default_label)
10222      rtx index, range, table_label, default_label;
10223      enum machine_mode mode;
10224 {
10225   rtx temp, vector;
10226
10227   if (INTVAL (range) > cfun->max_jumptable_ents)
10228     cfun->max_jumptable_ents = INTVAL (range);
10229
10230   /* Do an unsigned comparison (in the proper mode) between the index
10231      expression and the value which represents the length of the range.
10232      Since we just finished subtracting the lower bound of the range
10233      from the index expression, this comparison allows us to simultaneously
10234      check that the original index expression value is both greater than
10235      or equal to the minimum value of the range and less than or equal to
10236      the maximum value of the range.  */
10237
10238   emit_cmp_and_jump_insns (index, range, GTU, NULL_RTX, mode, 1,
10239                            default_label);
10240
10241   /* If index is in range, it must fit in Pmode.
10242      Convert to Pmode so we can index with it.  */
10243   if (mode != Pmode)
10244     index = convert_to_mode (Pmode, index, 1);
10245
10246   /* Don't let a MEM slip thru, because then INDEX that comes
10247      out of PIC_CASE_VECTOR_ADDRESS won't be a valid address,
10248      and break_out_memory_refs will go to work on it and mess it up.  */
10249 #ifdef PIC_CASE_VECTOR_ADDRESS
10250   if (flag_pic && GET_CODE (index) != REG)
10251     index = copy_to_mode_reg (Pmode, index);
10252 #endif
10253
10254   /* If flag_force_addr were to affect this address
10255      it could interfere with the tricky assumptions made
10256      about addresses that contain label-refs,
10257      which may be valid only very near the tablejump itself.  */
10258   /* ??? The only correct use of CASE_VECTOR_MODE is the one inside the
10259      GET_MODE_SIZE, because this indicates how large insns are.  The other
10260      uses should all be Pmode, because they are addresses.  This code
10261      could fail if addresses and insns are not the same size.  */
10262   index = gen_rtx_PLUS (Pmode,
10263                         gen_rtx_MULT (Pmode, index,
10264                                       GEN_INT (GET_MODE_SIZE (CASE_VECTOR_MODE))),
10265                         gen_rtx_LABEL_REF (Pmode, table_label));
10266 #ifdef PIC_CASE_VECTOR_ADDRESS
10267   if (flag_pic)
10268     index = PIC_CASE_VECTOR_ADDRESS (index);
10269   else
10270 #endif
10271     index = memory_address_noforce (CASE_VECTOR_MODE, index);
10272   temp = gen_reg_rtx (CASE_VECTOR_MODE);
10273   vector = gen_rtx_MEM (CASE_VECTOR_MODE, index);
10274   RTX_UNCHANGING_P (vector) = 1;
10275   convert_move (temp, vector, 0);
10276
10277   emit_jump_insn (gen_tablejump (temp, table_label));
10278
10279   /* If we are generating PIC code or if the table is PC-relative, the
10280      table and JUMP_INSN must be adjacent, so don't output a BARRIER.  */
10281   if (! CASE_VECTOR_PC_RELATIVE && ! flag_pic)
10282     emit_barrier ();
10283 }
10284
10285 int
10286 try_tablejump (index_type, index_expr, minval, range,
10287                table_label, default_label)
10288      tree index_type, index_expr, minval, range;
10289      rtx table_label, default_label;
10290 {
10291   rtx index;
10292
10293   if (! HAVE_tablejump)
10294     return 0;
10295
10296   index_expr = fold (build (MINUS_EXPR, index_type,
10297                             convert (index_type, index_expr),
10298                             convert (index_type, minval)));
10299   index = expand_expr (index_expr, NULL_RTX, VOIDmode, 0);
10300   emit_queue ();
10301   index = protect_from_queue (index, 0);
10302   do_pending_stack_adjust ();
10303
10304   do_tablejump (index, TYPE_MODE (index_type),
10305                 convert_modes (TYPE_MODE (index_type),
10306                                TYPE_MODE (TREE_TYPE (range)),
10307                                expand_expr (range, NULL_RTX,
10308                                             VOIDmode, 0),
10309                                TREE_UNSIGNED (TREE_TYPE (range))),
10310                 table_label, default_label);
10311   return 1;
10312 }
10313
10314 /* Nonzero if the mode is a valid vector mode for this architecture.
10315    This returns nonzero even if there is no hardware support for the
10316    vector mode, but we can emulate with narrower modes.  */
10317
10318 int
10319 vector_mode_valid_p (mode)
10320      enum machine_mode mode;
10321 {
10322   enum mode_class class = GET_MODE_CLASS (mode);
10323   enum machine_mode innermode;
10324
10325   /* Doh!  What's going on?  */
10326   if (class != MODE_VECTOR_INT
10327       && class != MODE_VECTOR_FLOAT)
10328     return 0;
10329
10330   /* Hardware support.  Woo hoo!  */
10331   if (VECTOR_MODE_SUPPORTED_P (mode))
10332     return 1;
10333
10334   innermode = GET_MODE_INNER (mode);
10335
10336   /* We should probably return 1 if requesting V4DI and we have no DI,
10337      but we have V2DI, but this is probably very unlikely.  */
10338
10339   /* If we have support for the inner mode, we can safely emulate it.
10340      We may not have V2DI, but me can emulate with a pair of DIs.  */
10341   return mov_optab->handlers[innermode].insn_code != CODE_FOR_nothing;
10342 }
10343
10344 /* Return a CONST_VECTOR rtx for a VECTOR_CST tree.  */
10345 static rtx
10346 const_vector_from_tree (exp)
10347      tree exp;
10348 {
10349   rtvec v;
10350   int units, i;
10351   tree link, elt;
10352   enum machine_mode inner, mode;
10353
10354   mode = TYPE_MODE (TREE_TYPE (exp));
10355
10356   if (is_zeros_p (exp))
10357     return CONST0_RTX (mode);
10358
10359   units = GET_MODE_NUNITS (mode);
10360   inner = GET_MODE_INNER (mode);
10361
10362   v = rtvec_alloc (units);
10363
10364   link = TREE_VECTOR_CST_ELTS (exp);
10365   for (i = 0; link; link = TREE_CHAIN (link), ++i)
10366     {
10367       elt = TREE_VALUE (link);
10368
10369       if (TREE_CODE (elt) == REAL_CST)
10370         RTVEC_ELT (v, i) = CONST_DOUBLE_FROM_REAL_VALUE (TREE_REAL_CST (elt),
10371                                                          inner);
10372       else
10373         RTVEC_ELT (v, i) = immed_double_const (TREE_INT_CST_LOW (elt),
10374                                                TREE_INT_CST_HIGH (elt),
10375                                                inner);
10376     }
10377
10378   return gen_rtx_raw_CONST_VECTOR (mode, v);
10379 }
10380
10381 #include "gt-expr.h"