OSDN Git Service

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