OSDN Git Service

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