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