OSDN Git Service

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