OSDN Git Service

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