]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/explow.c
Daily bump.
[thirdparty/gcc.git] / gcc / explow.c
CommitLineData
18ca7dab 1/* Subroutines for manipulating rtx's in semantically interesting ways.
747215f1 2 Copyright (C) 1987, 91, 94-97, 1998, 1999 Free Software Foundation, Inc.
18ca7dab
RK
3
4This file is part of GNU CC.
5
6GNU CC is free software; you can redistribute it and/or modify
7it under the terms of the GNU General Public License as published by
8the Free Software Foundation; either version 2, or (at your option)
9any later version.
10
11GNU CC is distributed in the hope that it will be useful,
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14GNU General Public License for more details.
15
16You should have received a copy of the GNU General Public License
17along with GNU CC; see the file COPYING. If not, write to
940d9d63
RK
18the Free Software Foundation, 59 Temple Place - Suite 330,
19Boston, MA 02111-1307, USA. */
18ca7dab
RK
20
21
22#include "config.h"
670ee920 23#include "system.h"
18ca7dab
RK
24#include "rtl.h"
25#include "tree.h"
26#include "flags.h"
27#include "expr.h"
28#include "hard-reg-set.h"
29#include "insn-config.h"
30#include "recog.h"
31#include "insn-flags.h"
32#include "insn-codes.h"
33
c795bca9
BS
34#if !defined PREFERRED_STACK_BOUNDARY && defined STACK_BOUNDARY
35#define PREFERRED_STACK_BOUNDARY STACK_BOUNDARY
36#endif
37
ea534b63 38static rtx break_out_memory_refs PROTO((rtx));
edff2491 39static void emit_stack_probe PROTO((rtx));
b1ec3c92
CH
40/* Return an rtx for the sum of X and the integer C.
41
8008b228 42 This function should be used via the `plus_constant' macro. */
18ca7dab
RK
43
44rtx
b1ec3c92 45plus_constant_wide (x, c)
18ca7dab 46 register rtx x;
b1ec3c92 47 register HOST_WIDE_INT c;
18ca7dab
RK
48{
49 register RTX_CODE code;
50 register enum machine_mode mode;
51 register rtx tem;
52 int all_constant = 0;
53
54 if (c == 0)
55 return x;
56
57 restart:
58
59 code = GET_CODE (x);
60 mode = GET_MODE (x);
61 switch (code)
62 {
63 case CONST_INT:
b1ec3c92 64 return GEN_INT (INTVAL (x) + c);
18ca7dab
RK
65
66 case CONST_DOUBLE:
67 {
b1ec3c92
CH
68 HOST_WIDE_INT l1 = CONST_DOUBLE_LOW (x);
69 HOST_WIDE_INT h1 = CONST_DOUBLE_HIGH (x);
70 HOST_WIDE_INT l2 = c;
71 HOST_WIDE_INT h2 = c < 0 ? ~0 : 0;
72 HOST_WIDE_INT lv, hv;
18ca7dab
RK
73
74 add_double (l1, h1, l2, h2, &lv, &hv);
75
76 return immed_double_const (lv, hv, VOIDmode);
77 }
78
79 case MEM:
80 /* If this is a reference to the constant pool, try replacing it with
81 a reference to a new constant. If the resulting address isn't
82 valid, don't return it because we have no way to validize it. */
83 if (GET_CODE (XEXP (x, 0)) == SYMBOL_REF
84 && CONSTANT_POOL_ADDRESS_P (XEXP (x, 0)))
85 {
38a448ca
RH
86 /* Any rtl we create here must go in a saveable obstack, since
87 we might have been called from within combine. */
88 push_obstacks_nochange ();
89 rtl_in_saveable_obstack ();
18ca7dab
RK
90 tem
91 = force_const_mem (GET_MODE (x),
92 plus_constant (get_pool_constant (XEXP (x, 0)),
93 c));
38a448ca 94 pop_obstacks ();
18ca7dab
RK
95 if (memory_address_p (GET_MODE (tem), XEXP (tem, 0)))
96 return tem;
97 }
98 break;
99
100 case CONST:
101 /* If adding to something entirely constant, set a flag
102 so that we can add a CONST around the result. */
103 x = XEXP (x, 0);
104 all_constant = 1;
105 goto restart;
106
107 case SYMBOL_REF:
108 case LABEL_REF:
109 all_constant = 1;
110 break;
111
112 case PLUS:
113 /* The interesting case is adding the integer to a sum.
114 Look for constant term in the sum and combine
115 with C. For an integer constant term, we make a combined
116 integer. For a constant term that is not an explicit integer,
e5671f2b
RK
117 we cannot really combine, but group them together anyway.
118
03d937fc
R
119 Restart or use a recursive call in case the remaining operand is
120 something that we handle specially, such as a SYMBOL_REF.
121
122 We may not immediately return from the recursive call here, lest
123 all_constant gets lost. */
e5671f2b
RK
124
125 if (GET_CODE (XEXP (x, 1)) == CONST_INT)
03d937fc
R
126 {
127 c += INTVAL (XEXP (x, 1));
128 x = XEXP (x, 0);
129 goto restart;
130 }
18ca7dab 131 else if (CONSTANT_P (XEXP (x, 0)))
03d937fc
R
132 {
133 x = gen_rtx_PLUS (mode,
134 plus_constant (XEXP (x, 0), c),
135 XEXP (x, 1));
136 c = 0;
137 }
18ca7dab 138 else if (CONSTANT_P (XEXP (x, 1)))
03d937fc
R
139 {
140 x = gen_rtx_PLUS (mode,
141 XEXP (x, 0),
142 plus_constant (XEXP (x, 1), c));
143 c = 0;
144 }
38a448ca
RH
145 break;
146
147 default:
148 break;
18ca7dab
RK
149 }
150
151 if (c != 0)
38a448ca 152 x = gen_rtx_PLUS (mode, x, GEN_INT (c));
18ca7dab
RK
153
154 if (GET_CODE (x) == SYMBOL_REF || GET_CODE (x) == LABEL_REF)
155 return x;
156 else if (all_constant)
38a448ca 157 return gen_rtx_CONST (mode, x);
18ca7dab
RK
158 else
159 return x;
160}
161
b1ec3c92
CH
162/* This is the same as `plus_constant', except that it handles LO_SUM.
163
164 This function should be used via the `plus_constant_for_output' macro. */
18ca7dab
RK
165
166rtx
b1ec3c92 167plus_constant_for_output_wide (x, c)
18ca7dab 168 register rtx x;
b1ec3c92 169 register HOST_WIDE_INT c;
18ca7dab 170{
18ca7dab 171 register enum machine_mode mode = GET_MODE (x);
18ca7dab
RK
172
173 if (GET_CODE (x) == LO_SUM)
38a448ca 174 return gen_rtx_LO_SUM (mode, XEXP (x, 0),
18ca7dab
RK
175 plus_constant_for_output (XEXP (x, 1), c));
176
177 else
178 return plus_constant (x, c);
179}
180\f
181/* If X is a sum, return a new sum like X but lacking any constant terms.
182 Add all the removed constant terms into *CONSTPTR.
183 X itself is not altered. The result != X if and only if
184 it is not isomorphic to X. */
185
186rtx
187eliminate_constant_term (x, constptr)
188 rtx x;
189 rtx *constptr;
190{
191 register rtx x0, x1;
192 rtx tem;
193
194 if (GET_CODE (x) != PLUS)
195 return x;
196
197 /* First handle constants appearing at this level explicitly. */
198 if (GET_CODE (XEXP (x, 1)) == CONST_INT
199 && 0 != (tem = simplify_binary_operation (PLUS, GET_MODE (x), *constptr,
200 XEXP (x, 1)))
201 && GET_CODE (tem) == CONST_INT)
202 {
203 *constptr = tem;
204 return eliminate_constant_term (XEXP (x, 0), constptr);
205 }
206
207 tem = const0_rtx;
208 x0 = eliminate_constant_term (XEXP (x, 0), &tem);
209 x1 = eliminate_constant_term (XEXP (x, 1), &tem);
210 if ((x1 != XEXP (x, 1) || x0 != XEXP (x, 0))
211 && 0 != (tem = simplify_binary_operation (PLUS, GET_MODE (x),
212 *constptr, tem))
213 && GET_CODE (tem) == CONST_INT)
214 {
215 *constptr = tem;
38a448ca 216 return gen_rtx_PLUS (GET_MODE (x), x0, x1);
18ca7dab
RK
217 }
218
219 return x;
220}
221
222/* Returns the insn that next references REG after INSN, or 0
223 if REG is clobbered before next referenced or we cannot find
224 an insn that references REG in a straight-line piece of code. */
225
226rtx
227find_next_ref (reg, insn)
228 rtx reg;
229 rtx insn;
230{
231 rtx next;
232
233 for (insn = NEXT_INSN (insn); insn; insn = next)
234 {
235 next = NEXT_INSN (insn);
236 if (GET_CODE (insn) == NOTE)
237 continue;
238 if (GET_CODE (insn) == CODE_LABEL
239 || GET_CODE (insn) == BARRIER)
240 return 0;
241 if (GET_CODE (insn) == INSN
242 || GET_CODE (insn) == JUMP_INSN
243 || GET_CODE (insn) == CALL_INSN)
244 {
245 if (reg_set_p (reg, insn))
246 return 0;
247 if (reg_mentioned_p (reg, PATTERN (insn)))
248 return insn;
249 if (GET_CODE (insn) == JUMP_INSN)
250 {
251 if (simplejump_p (insn))
252 next = JUMP_LABEL (insn);
253 else
254 return 0;
255 }
256 if (GET_CODE (insn) == CALL_INSN
257 && REGNO (reg) < FIRST_PSEUDO_REGISTER
258 && call_used_regs[REGNO (reg)])
259 return 0;
260 }
261 else
262 abort ();
263 }
264 return 0;
265}
266
267/* Return an rtx for the size in bytes of the value of EXP. */
268
269rtx
270expr_size (exp)
271 tree exp;
272{
99098c66
RK
273 tree size = size_in_bytes (TREE_TYPE (exp));
274
275 if (TREE_CODE (size) != INTEGER_CST
276 && contains_placeholder_p (size))
277 size = build (WITH_RECORD_EXPR, sizetype, size, exp);
278
8fbea4dc
RK
279 return expand_expr (size, NULL_RTX, TYPE_MODE (sizetype),
280 EXPAND_MEMORY_USE_BAD);
18ca7dab
RK
281}
282\f
283/* Return a copy of X in which all memory references
284 and all constants that involve symbol refs
285 have been replaced with new temporary registers.
286 Also emit code to load the memory locations and constants
287 into those registers.
288
289 If X contains no such constants or memory references,
290 X itself (not a copy) is returned.
291
292 If a constant is found in the address that is not a legitimate constant
293 in an insn, it is left alone in the hope that it might be valid in the
294 address.
295
296 X may contain no arithmetic except addition, subtraction and multiplication.
297 Values returned by expand_expr with 1 for sum_ok fit this constraint. */
298
299static rtx
300break_out_memory_refs (x)
301 register rtx x;
302{
303 if (GET_CODE (x) == MEM
cabeca29 304 || (CONSTANT_P (x) && CONSTANT_ADDRESS_P (x)
18ca7dab 305 && GET_MODE (x) != VOIDmode))
2cca6e3f 306 x = force_reg (GET_MODE (x), x);
18ca7dab
RK
307 else if (GET_CODE (x) == PLUS || GET_CODE (x) == MINUS
308 || GET_CODE (x) == MULT)
309 {
310 register rtx op0 = break_out_memory_refs (XEXP (x, 0));
311 register rtx op1 = break_out_memory_refs (XEXP (x, 1));
2cca6e3f 312
18ca7dab 313 if (op0 != XEXP (x, 0) || op1 != XEXP (x, 1))
38a448ca 314 x = gen_rtx_fmt_ee (GET_CODE (x), Pmode, op0, op1);
18ca7dab 315 }
2cca6e3f 316
18ca7dab
RK
317 return x;
318}
319
ea534b63
RK
320#ifdef POINTERS_EXTEND_UNSIGNED
321
322/* Given X, a memory address in ptr_mode, convert it to an address
498b529f
RK
323 in Pmode, or vice versa (TO_MODE says which way). We take advantage of
324 the fact that pointers are not allowed to overflow by commuting arithmetic
325 operations over conversions so that address arithmetic insns can be
326 used. */
ea534b63 327
498b529f
RK
328rtx
329convert_memory_address (to_mode, x)
330 enum machine_mode to_mode;
ea534b63
RK
331 rtx x;
332{
0b04ec8c 333 enum machine_mode from_mode = to_mode == ptr_mode ? Pmode : ptr_mode;
498b529f
RK
334 rtx temp;
335
0b04ec8c
RK
336 /* Here we handle some special cases. If none of them apply, fall through
337 to the default case. */
ea534b63
RK
338 switch (GET_CODE (x))
339 {
340 case CONST_INT:
341 case CONST_DOUBLE:
498b529f
RK
342 return x;
343
ea534b63 344 case LABEL_REF:
38a448ca
RH
345 temp = gen_rtx_LABEL_REF (to_mode, XEXP (x, 0));
346 LABEL_REF_NONLOCAL_P (temp) = LABEL_REF_NONLOCAL_P (x);
347 return temp;
498b529f 348
ea534b63 349 case SYMBOL_REF:
38a448ca 350 temp = gen_rtx_SYMBOL_REF (to_mode, XSTR (x, 0));
498b529f 351 SYMBOL_REF_FLAG (temp) = SYMBOL_REF_FLAG (x);
d7dc4377 352 CONSTANT_POOL_ADDRESS_P (temp) = CONSTANT_POOL_ADDRESS_P (x);
498b529f 353 return temp;
ea534b63 354
498b529f 355 case CONST:
38a448ca
RH
356 return gen_rtx_CONST (to_mode,
357 convert_memory_address (to_mode, XEXP (x, 0)));
ea534b63 358
0b04ec8c
RK
359 case PLUS:
360 case MULT:
361 /* For addition the second operand is a small constant, we can safely
38a448ca 362 permute the conversion and addition operation. We can always safely
60725c78
RK
363 permute them if we are making the address narrower. In addition,
364 always permute the operations if this is a constant. */
0b04ec8c
RK
365 if (GET_MODE_SIZE (to_mode) < GET_MODE_SIZE (from_mode)
366 || (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 1)) == CONST_INT
60725c78
RK
367 && (INTVAL (XEXP (x, 1)) + 20000 < 40000
368 || CONSTANT_P (XEXP (x, 0)))))
38a448ca
RH
369 return gen_rtx_fmt_ee (GET_CODE (x), to_mode,
370 convert_memory_address (to_mode, XEXP (x, 0)),
371 convert_memory_address (to_mode, XEXP (x, 1)));
372 break;
373
374 default:
375 break;
ea534b63 376 }
0b04ec8c
RK
377
378 return convert_modes (to_mode, from_mode,
379 x, POINTERS_EXTEND_UNSIGNED);
ea534b63
RK
380}
381#endif
382
18ca7dab
RK
383/* Given a memory address or facsimile X, construct a new address,
384 currently equivalent, that is stable: future stores won't change it.
385
386 X must be composed of constants, register and memory references
387 combined with addition, subtraction and multiplication:
388 in other words, just what you can get from expand_expr if sum_ok is 1.
389
390 Works by making copies of all regs and memory locations used
391 by X and combining them the same way X does.
392 You could also stabilize the reference to this address
393 by copying the address to a register with copy_to_reg;
394 but then you wouldn't get indexed addressing in the reference. */
395
396rtx
397copy_all_regs (x)
398 register rtx x;
399{
400 if (GET_CODE (x) == REG)
401 {
11c50c5e
DE
402 if (REGNO (x) != FRAME_POINTER_REGNUM
403#if HARD_FRAME_POINTER_REGNUM != FRAME_POINTER_REGNUM
404 && REGNO (x) != HARD_FRAME_POINTER_REGNUM
405#endif
406 )
18ca7dab
RK
407 x = copy_to_reg (x);
408 }
409 else if (GET_CODE (x) == MEM)
410 x = copy_to_reg (x);
411 else if (GET_CODE (x) == PLUS || GET_CODE (x) == MINUS
412 || GET_CODE (x) == MULT)
413 {
414 register rtx op0 = copy_all_regs (XEXP (x, 0));
415 register rtx op1 = copy_all_regs (XEXP (x, 1));
416 if (op0 != XEXP (x, 0) || op1 != XEXP (x, 1))
38a448ca 417 x = gen_rtx_fmt_ee (GET_CODE (x), Pmode, op0, op1);
18ca7dab
RK
418 }
419 return x;
420}
421\f
422/* Return something equivalent to X but valid as a memory address
423 for something of mode MODE. When X is not itself valid, this
424 works by copying X or subexpressions of it into registers. */
425
426rtx
427memory_address (mode, x)
428 enum machine_mode mode;
429 register rtx x;
430{
18b9ca6f 431 register rtx oldx = x;
18ca7dab 432
38a448ca
RH
433 if (GET_CODE (x) == ADDRESSOF)
434 return x;
435
ea534b63
RK
436#ifdef POINTERS_EXTEND_UNSIGNED
437 if (GET_MODE (x) == ptr_mode)
498b529f 438 x = convert_memory_address (Pmode, x);
ea534b63
RK
439#endif
440
18ca7dab
RK
441 /* By passing constant addresses thru registers
442 we get a chance to cse them. */
cabeca29 443 if (! cse_not_expected && CONSTANT_P (x) && CONSTANT_ADDRESS_P (x))
18b9ca6f 444 x = force_reg (Pmode, x);
18ca7dab
RK
445
446 /* Accept a QUEUED that refers to a REG
447 even though that isn't a valid address.
448 On attempting to put this in an insn we will call protect_from_queue
449 which will turn it into a REG, which is valid. */
18b9ca6f 450 else if (GET_CODE (x) == QUEUED
18ca7dab 451 && GET_CODE (QUEUED_VAR (x)) == REG)
18b9ca6f 452 ;
18ca7dab
RK
453
454 /* We get better cse by rejecting indirect addressing at this stage.
455 Let the combiner create indirect addresses where appropriate.
456 For now, generate the code so that the subexpressions useful to share
457 are visible. But not if cse won't be done! */
18b9ca6f 458 else
18ca7dab 459 {
18b9ca6f
RK
460 if (! cse_not_expected && GET_CODE (x) != REG)
461 x = break_out_memory_refs (x);
462
463 /* At this point, any valid address is accepted. */
464 GO_IF_LEGITIMATE_ADDRESS (mode, x, win);
465
466 /* If it was valid before but breaking out memory refs invalidated it,
467 use it the old way. */
468 if (memory_address_p (mode, oldx))
469 goto win2;
470
471 /* Perform machine-dependent transformations on X
472 in certain cases. This is not necessary since the code
473 below can handle all possible cases, but machine-dependent
474 transformations can make better code. */
475 LEGITIMIZE_ADDRESS (x, oldx, mode, win);
476
477 /* PLUS and MULT can appear in special ways
478 as the result of attempts to make an address usable for indexing.
479 Usually they are dealt with by calling force_operand, below.
480 But a sum containing constant terms is special
481 if removing them makes the sum a valid address:
482 then we generate that address in a register
483 and index off of it. We do this because it often makes
484 shorter code, and because the addresses thus generated
485 in registers often become common subexpressions. */
486 if (GET_CODE (x) == PLUS)
487 {
488 rtx constant_term = const0_rtx;
489 rtx y = eliminate_constant_term (x, &constant_term);
490 if (constant_term == const0_rtx
491 || ! memory_address_p (mode, y))
492 x = force_operand (x, NULL_RTX);
493 else
494 {
38a448ca 495 y = gen_rtx_PLUS (GET_MODE (x), copy_to_reg (y), constant_term);
18b9ca6f
RK
496 if (! memory_address_p (mode, y))
497 x = force_operand (x, NULL_RTX);
498 else
499 x = y;
500 }
501 }
18ca7dab 502
e475ed2a 503 else if (GET_CODE (x) == MULT || GET_CODE (x) == MINUS)
18b9ca6f 504 x = force_operand (x, NULL_RTX);
18ca7dab 505
18b9ca6f
RK
506 /* If we have a register that's an invalid address,
507 it must be a hard reg of the wrong class. Copy it to a pseudo. */
508 else if (GET_CODE (x) == REG)
509 x = copy_to_reg (x);
510
511 /* Last resort: copy the value to a register, since
512 the register is a valid address. */
513 else
514 x = force_reg (Pmode, x);
515
516 goto done;
18ca7dab 517
c02a7fbb
RK
518 win2:
519 x = oldx;
520 win:
521 if (flag_force_addr && ! cse_not_expected && GET_CODE (x) != REG
522 /* Don't copy an addr via a reg if it is one of our stack slots. */
523 && ! (GET_CODE (x) == PLUS
524 && (XEXP (x, 0) == virtual_stack_vars_rtx
525 || XEXP (x, 0) == virtual_incoming_args_rtx)))
526 {
527 if (general_operand (x, Pmode))
528 x = force_reg (Pmode, x);
529 else
530 x = force_operand (x, NULL_RTX);
531 }
18ca7dab 532 }
18b9ca6f
RK
533
534 done:
535
2cca6e3f
RK
536 /* If we didn't change the address, we are done. Otherwise, mark
537 a reg as a pointer if we have REG or REG + CONST_INT. */
538 if (oldx == x)
539 return x;
540 else if (GET_CODE (x) == REG)
305f22b5 541 mark_reg_pointer (x, 1);
2cca6e3f
RK
542 else if (GET_CODE (x) == PLUS
543 && GET_CODE (XEXP (x, 0)) == REG
544 && GET_CODE (XEXP (x, 1)) == CONST_INT)
305f22b5 545 mark_reg_pointer (XEXP (x, 0), 1);
2cca6e3f 546
18b9ca6f
RK
547 /* OLDX may have been the address on a temporary. Update the address
548 to indicate that X is now used. */
549 update_temp_slot_address (oldx, x);
550
18ca7dab
RK
551 return x;
552}
553
554/* Like `memory_address' but pretend `flag_force_addr' is 0. */
555
556rtx
557memory_address_noforce (mode, x)
558 enum machine_mode mode;
559 rtx x;
560{
561 int ambient_force_addr = flag_force_addr;
562 rtx val;
563
564 flag_force_addr = 0;
565 val = memory_address (mode, x);
566 flag_force_addr = ambient_force_addr;
567 return val;
568}
569
570/* Convert a mem ref into one with a valid memory address.
571 Pass through anything else unchanged. */
572
573rtx
574validize_mem (ref)
575 rtx ref;
576{
577 if (GET_CODE (ref) != MEM)
578 return ref;
579 if (memory_address_p (GET_MODE (ref), XEXP (ref, 0)))
580 return ref;
581 /* Don't alter REF itself, since that is probably a stack slot. */
582 return change_address (ref, GET_MODE (ref), XEXP (ref, 0));
583}
584\f
585/* Return a modified copy of X with its memory address copied
586 into a temporary register to protect it from side effects.
587 If X is not a MEM, it is returned unchanged (and not copied).
588 Perhaps even if it is a MEM, if there is no need to change it. */
589
590rtx
591stabilize (x)
592 rtx x;
593{
594 register rtx addr;
595 if (GET_CODE (x) != MEM)
596 return x;
597 addr = XEXP (x, 0);
598 if (rtx_unstable_p (addr))
599 {
600 rtx temp = copy_all_regs (addr);
601 rtx mem;
602 if (GET_CODE (temp) != REG)
603 temp = copy_to_reg (temp);
38a448ca 604 mem = gen_rtx_MEM (GET_MODE (x), temp);
18ca7dab
RK
605
606 /* Mark returned memref with in_struct if it's in an array or
607 structure. Copy const and volatile from original memref. */
608
18ca7dab 609 RTX_UNCHANGING_P (mem) = RTX_UNCHANGING_P (x);
c6df88cb
MM
610 MEM_COPY_ATTRIBUTES (mem, x);
611 if (GET_CODE (addr) == PLUS)
612 MEM_SET_IN_STRUCT_P (mem, 1);
41472af8
MM
613
614 /* Since the new MEM is just like the old X, it can alias only
615 the things that X could. */
616 MEM_ALIAS_SET (mem) = MEM_ALIAS_SET (x);
617
18ca7dab
RK
618 return mem;
619 }
620 return x;
621}
622\f
623/* Copy the value or contents of X to a new temp reg and return that reg. */
624
625rtx
626copy_to_reg (x)
627 rtx x;
628{
629 register rtx temp = gen_reg_rtx (GET_MODE (x));
630
631 /* If not an operand, must be an address with PLUS and MULT so
632 do the computation. */
633 if (! general_operand (x, VOIDmode))
634 x = force_operand (x, temp);
635
636 if (x != temp)
637 emit_move_insn (temp, x);
638
639 return temp;
640}
641
642/* Like copy_to_reg but always give the new register mode Pmode
643 in case X is a constant. */
644
645rtx
646copy_addr_to_reg (x)
647 rtx x;
648{
649 return copy_to_mode_reg (Pmode, x);
650}
651
652/* Like copy_to_reg but always give the new register mode MODE
653 in case X is a constant. */
654
655rtx
656copy_to_mode_reg (mode, x)
657 enum machine_mode mode;
658 rtx x;
659{
660 register rtx temp = gen_reg_rtx (mode);
661
662 /* If not an operand, must be an address with PLUS and MULT so
663 do the computation. */
664 if (! general_operand (x, VOIDmode))
665 x = force_operand (x, temp);
666
667 if (GET_MODE (x) != mode && GET_MODE (x) != VOIDmode)
668 abort ();
669 if (x != temp)
670 emit_move_insn (temp, x);
671 return temp;
672}
673
674/* Load X into a register if it is not already one.
675 Use mode MODE for the register.
676 X should be valid for mode MODE, but it may be a constant which
677 is valid for all integer modes; that's why caller must specify MODE.
678
679 The caller must not alter the value in the register we return,
680 since we mark it as a "constant" register. */
681
682rtx
683force_reg (mode, x)
684 enum machine_mode mode;
685 rtx x;
686{
62874575 687 register rtx temp, insn, set;
18ca7dab
RK
688
689 if (GET_CODE (x) == REG)
690 return x;
691 temp = gen_reg_rtx (mode);
692 insn = emit_move_insn (temp, x);
62874575 693
18ca7dab 694 /* Let optimizers know that TEMP's value never changes
62874575
RK
695 and that X can be substituted for it. Don't get confused
696 if INSN set something else (such as a SUBREG of TEMP). */
697 if (CONSTANT_P (x)
698 && (set = single_set (insn)) != 0
699 && SET_DEST (set) == temp)
18ca7dab 700 {
b1ec3c92 701 rtx note = find_reg_note (insn, REG_EQUAL, NULL_RTX);
18ca7dab
RK
702
703 if (note)
704 XEXP (note, 0) = x;
705 else
38a448ca 706 REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_EQUAL, x, REG_NOTES (insn));
18ca7dab
RK
707 }
708 return temp;
709}
710
711/* If X is a memory ref, copy its contents to a new temp reg and return
712 that reg. Otherwise, return X. */
713
714rtx
715force_not_mem (x)
716 rtx x;
717{
718 register rtx temp;
719 if (GET_CODE (x) != MEM || GET_MODE (x) == BLKmode)
720 return x;
721 temp = gen_reg_rtx (GET_MODE (x));
722 emit_move_insn (temp, x);
723 return temp;
724}
725
726/* Copy X to TARGET (if it's nonzero and a reg)
727 or to a new temp reg and return that reg.
728 MODE is the mode to use for X in case it is a constant. */
729
730rtx
731copy_to_suggested_reg (x, target, mode)
732 rtx x, target;
733 enum machine_mode mode;
734{
735 register rtx temp;
736
737 if (target && GET_CODE (target) == REG)
738 temp = target;
739 else
740 temp = gen_reg_rtx (mode);
741
742 emit_move_insn (temp, x);
743 return temp;
744}
745\f
9ff65789
RK
746/* Return the mode to use to store a scalar of TYPE and MODE.
747 PUNSIGNEDP points to the signedness of the type and may be adjusted
748 to show what signedness to use on extension operations.
749
750 FOR_CALL is non-zero if this call is promoting args for a call. */
751
752enum machine_mode
753promote_mode (type, mode, punsignedp, for_call)
754 tree type;
755 enum machine_mode mode;
756 int *punsignedp;
c84e2712 757 int for_call ATTRIBUTE_UNUSED;
9ff65789
RK
758{
759 enum tree_code code = TREE_CODE (type);
760 int unsignedp = *punsignedp;
761
762#ifdef PROMOTE_FOR_CALL_ONLY
763 if (! for_call)
764 return mode;
765#endif
766
767 switch (code)
768 {
769#ifdef PROMOTE_MODE
770 case INTEGER_TYPE: case ENUMERAL_TYPE: case BOOLEAN_TYPE:
771 case CHAR_TYPE: case REAL_TYPE: case OFFSET_TYPE:
772 PROMOTE_MODE (mode, unsignedp, type);
773 break;
774#endif
775
ea534b63 776#ifdef POINTERS_EXTEND_UNSIGNED
56a4c9e2 777 case REFERENCE_TYPE:
9ff65789 778 case POINTER_TYPE:
ea534b63
RK
779 mode = Pmode;
780 unsignedp = POINTERS_EXTEND_UNSIGNED;
9ff65789 781 break;
ea534b63 782#endif
38a448ca
RH
783
784 default:
785 break;
9ff65789
RK
786 }
787
788 *punsignedp = unsignedp;
789 return mode;
790}
791\f
18ca7dab
RK
792/* Adjust the stack pointer by ADJUST (an rtx for a number of bytes).
793 This pops when ADJUST is positive. ADJUST need not be constant. */
794
795void
796adjust_stack (adjust)
797 rtx adjust;
798{
799 rtx temp;
800 adjust = protect_from_queue (adjust, 0);
801
802 if (adjust == const0_rtx)
803 return;
804
805 temp = expand_binop (Pmode,
806#ifdef STACK_GROWS_DOWNWARD
807 add_optab,
808#else
809 sub_optab,
810#endif
811 stack_pointer_rtx, adjust, stack_pointer_rtx, 0,
812 OPTAB_LIB_WIDEN);
813
814 if (temp != stack_pointer_rtx)
815 emit_move_insn (stack_pointer_rtx, temp);
816}
817
818/* Adjust the stack pointer by minus ADJUST (an rtx for a number of bytes).
819 This pushes when ADJUST is positive. ADJUST need not be constant. */
820
821void
822anti_adjust_stack (adjust)
823 rtx adjust;
824{
825 rtx temp;
826 adjust = protect_from_queue (adjust, 0);
827
828 if (adjust == const0_rtx)
829 return;
830
831 temp = expand_binop (Pmode,
832#ifdef STACK_GROWS_DOWNWARD
833 sub_optab,
834#else
835 add_optab,
836#endif
837 stack_pointer_rtx, adjust, stack_pointer_rtx, 0,
838 OPTAB_LIB_WIDEN);
839
840 if (temp != stack_pointer_rtx)
841 emit_move_insn (stack_pointer_rtx, temp);
842}
843
844/* Round the size of a block to be pushed up to the boundary required
845 by this machine. SIZE is the desired size, which need not be constant. */
846
847rtx
848round_push (size)
849 rtx size;
850{
c795bca9
BS
851#ifdef PREFERRED_STACK_BOUNDARY
852 int align = PREFERRED_STACK_BOUNDARY / BITS_PER_UNIT;
18ca7dab
RK
853 if (align == 1)
854 return size;
855 if (GET_CODE (size) == CONST_INT)
856 {
857 int new = (INTVAL (size) + align - 1) / align * align;
858 if (INTVAL (size) != new)
b1ec3c92 859 size = GEN_INT (new);
18ca7dab
RK
860 }
861 else
862 {
5244db05 863 /* CEIL_DIV_EXPR needs to worry about the addition overflowing,
0f41302f
MS
864 but we know it can't. So add ourselves and then do
865 TRUNC_DIV_EXPR. */
5244db05
RK
866 size = expand_binop (Pmode, add_optab, size, GEN_INT (align - 1),
867 NULL_RTX, 1, OPTAB_LIB_WIDEN);
868 size = expand_divmod (0, TRUNC_DIV_EXPR, Pmode, size, GEN_INT (align),
b1ec3c92
CH
869 NULL_RTX, 1);
870 size = expand_mult (Pmode, size, GEN_INT (align), NULL_RTX, 1);
18ca7dab 871 }
c795bca9 872#endif /* PREFERRED_STACK_BOUNDARY */
18ca7dab
RK
873 return size;
874}
875\f
59257ff7
RK
876/* Save the stack pointer for the purpose in SAVE_LEVEL. PSAVE is a pointer
877 to a previously-created save area. If no save area has been allocated,
878 this function will allocate one. If a save area is specified, it
879 must be of the proper mode.
880
881 The insns are emitted after insn AFTER, if nonzero, otherwise the insns
882 are emitted at the current position. */
883
884void
885emit_stack_save (save_level, psave, after)
886 enum save_level save_level;
887 rtx *psave;
888 rtx after;
889{
890 rtx sa = *psave;
891 /* The default is that we use a move insn and save in a Pmode object. */
0ddc9a94 892 rtx (*fcn) PROTO ((rtx, rtx)) = gen_move_insn;
a260abc9 893 enum machine_mode mode = STACK_SAVEAREA_MODE (save_level);
59257ff7
RK
894
895 /* See if this machine has anything special to do for this kind of save. */
896 switch (save_level)
897 {
898#ifdef HAVE_save_stack_block
899 case SAVE_BLOCK:
900 if (HAVE_save_stack_block)
a260abc9 901 fcn = gen_save_stack_block;
59257ff7
RK
902 break;
903#endif
904#ifdef HAVE_save_stack_function
905 case SAVE_FUNCTION:
906 if (HAVE_save_stack_function)
a260abc9 907 fcn = gen_save_stack_function;
59257ff7
RK
908 break;
909#endif
910#ifdef HAVE_save_stack_nonlocal
911 case SAVE_NONLOCAL:
912 if (HAVE_save_stack_nonlocal)
a260abc9 913 fcn = gen_save_stack_nonlocal;
59257ff7
RK
914 break;
915#endif
38a448ca
RH
916 default:
917 break;
59257ff7
RK
918 }
919
920 /* If there is no save area and we have to allocate one, do so. Otherwise
921 verify the save area is the proper mode. */
922
923 if (sa == 0)
924 {
925 if (mode != VOIDmode)
926 {
927 if (save_level == SAVE_NONLOCAL)
928 *psave = sa = assign_stack_local (mode, GET_MODE_SIZE (mode), 0);
929 else
930 *psave = sa = gen_reg_rtx (mode);
931 }
932 }
933 else
934 {
935 if (mode == VOIDmode || GET_MODE (sa) != mode)
936 abort ();
937 }
938
939 if (after)
700f6f98
RK
940 {
941 rtx seq;
942
943 start_sequence ();
5460015d
JW
944 /* We must validize inside the sequence, to ensure that any instructions
945 created by the validize call also get moved to the right place. */
946 if (sa != 0)
947 sa = validize_mem (sa);
d072107f 948 emit_insn (fcn (sa, stack_pointer_rtx));
700f6f98
RK
949 seq = gen_sequence ();
950 end_sequence ();
951 emit_insn_after (seq, after);
952 }
59257ff7 953 else
5460015d
JW
954 {
955 if (sa != 0)
956 sa = validize_mem (sa);
957 emit_insn (fcn (sa, stack_pointer_rtx));
958 }
59257ff7
RK
959}
960
961/* Restore the stack pointer for the purpose in SAVE_LEVEL. SA is the save
962 area made by emit_stack_save. If it is zero, we have nothing to do.
963
964 Put any emitted insns after insn AFTER, if nonzero, otherwise at
965 current position. */
966
967void
968emit_stack_restore (save_level, sa, after)
969 enum save_level save_level;
970 rtx after;
971 rtx sa;
972{
973 /* The default is that we use a move insn. */
0ddc9a94 974 rtx (*fcn) PROTO ((rtx, rtx)) = gen_move_insn;
59257ff7
RK
975
976 /* See if this machine has anything special to do for this kind of save. */
977 switch (save_level)
978 {
979#ifdef HAVE_restore_stack_block
980 case SAVE_BLOCK:
981 if (HAVE_restore_stack_block)
982 fcn = gen_restore_stack_block;
983 break;
984#endif
985#ifdef HAVE_restore_stack_function
986 case SAVE_FUNCTION:
987 if (HAVE_restore_stack_function)
988 fcn = gen_restore_stack_function;
989 break;
990#endif
991#ifdef HAVE_restore_stack_nonlocal
59257ff7
RK
992 case SAVE_NONLOCAL:
993 if (HAVE_restore_stack_nonlocal)
994 fcn = gen_restore_stack_nonlocal;
995 break;
996#endif
38a448ca
RH
997 default:
998 break;
59257ff7
RK
999 }
1000
d072107f
RK
1001 if (sa != 0)
1002 sa = validize_mem (sa);
1003
59257ff7 1004 if (after)
700f6f98
RK
1005 {
1006 rtx seq;
1007
1008 start_sequence ();
d072107f 1009 emit_insn (fcn (stack_pointer_rtx, sa));
700f6f98
RK
1010 seq = gen_sequence ();
1011 end_sequence ();
1012 emit_insn_after (seq, after);
1013 }
59257ff7 1014 else
d072107f 1015 emit_insn (fcn (stack_pointer_rtx, sa));
59257ff7
RK
1016}
1017\f
c9ec4f99
DM
1018#ifdef SETJMP_VIA_SAVE_AREA
1019/* Optimize RTL generated by allocate_dynamic_stack_space for targets
1020 where SETJMP_VIA_SAVE_AREA is true. The problem is that on these
1021 platforms, the dynamic stack space used can corrupt the original
1022 frame, thus causing a crash if a longjmp unwinds to it. */
1023
1024void
1025optimize_save_area_alloca (insns)
1026 rtx insns;
1027{
1028 rtx insn;
1029
1030 for (insn = insns; insn; insn = NEXT_INSN(insn))
1031 {
1032 rtx note;
1033
1034 if (GET_CODE (insn) != INSN)
1035 continue;
1036
1037 for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
1038 {
1039 if (REG_NOTE_KIND (note) != REG_SAVE_AREA)
1040 continue;
1041
1042 if (!current_function_calls_setjmp)
1043 {
1044 rtx pat = PATTERN (insn);
1045
1046 /* If we do not see the note in a pattern matching
1047 these precise characteristics, we did something
1048 entirely wrong in allocate_dynamic_stack_space.
1049
38e01259 1050 Note, one way this could happen is if SETJMP_VIA_SAVE_AREA
c9ec4f99
DM
1051 was defined on a machine where stacks grow towards higher
1052 addresses.
1053
1054 Right now only supported port with stack that grow upward
1055 is the HPPA and it does not define SETJMP_VIA_SAVE_AREA. */
1056 if (GET_CODE (pat) != SET
1057 || SET_DEST (pat) != stack_pointer_rtx
1058 || GET_CODE (SET_SRC (pat)) != MINUS
1059 || XEXP (SET_SRC (pat), 0) != stack_pointer_rtx)
1060 abort ();
1061
1062 /* This will now be transformed into a (set REG REG)
1063 so we can just blow away all the other notes. */
1064 XEXP (SET_SRC (pat), 1) = XEXP (note, 0);
1065 REG_NOTES (insn) = NULL_RTX;
1066 }
1067 else
1068 {
1069 /* setjmp was called, we must remove the REG_SAVE_AREA
1070 note so that later passes do not get confused by its
1071 presence. */
1072 if (note == REG_NOTES (insn))
1073 {
1074 REG_NOTES (insn) = XEXP (note, 1);
1075 }
1076 else
1077 {
1078 rtx srch;
1079
1080 for (srch = REG_NOTES (insn); srch; srch = XEXP (srch, 1))
1081 if (XEXP (srch, 1) == note)
1082 break;
1083
1084 if (srch == NULL_RTX)
1085 abort();
1086
1087 XEXP (srch, 1) = XEXP (note, 1);
1088 }
1089 }
1090 /* Once we've seen the note of interest, we need not look at
1091 the rest of them. */
1092 break;
1093 }
1094 }
1095}
1096#endif /* SETJMP_VIA_SAVE_AREA */
1097
18ca7dab
RK
1098/* Return an rtx representing the address of an area of memory dynamically
1099 pushed on the stack. This region of memory is always aligned to
1100 a multiple of BIGGEST_ALIGNMENT.
1101
1102 Any required stack pointer alignment is preserved.
1103
1104 SIZE is an rtx representing the size of the area.
091ad0b9
RK
1105 TARGET is a place in which the address can be placed.
1106
1107 KNOWN_ALIGN is the alignment (in bits) that we know SIZE has. */
18ca7dab
RK
1108
1109rtx
091ad0b9 1110allocate_dynamic_stack_space (size, target, known_align)
18ca7dab
RK
1111 rtx size;
1112 rtx target;
091ad0b9 1113 int known_align;
18ca7dab 1114{
c9ec4f99
DM
1115#ifdef SETJMP_VIA_SAVE_AREA
1116 rtx setjmpless_size = NULL_RTX;
1117#endif
1118
15fc0026 1119 /* If we're asking for zero bytes, it doesn't matter what we point
9faa82d8 1120 to since we can't dereference it. But return a reasonable
15fc0026
RK
1121 address anyway. */
1122 if (size == const0_rtx)
1123 return virtual_stack_dynamic_rtx;
1124
1125 /* Otherwise, show we're calling alloca or equivalent. */
1126 current_function_calls_alloca = 1;
1127
18ca7dab
RK
1128 /* Ensure the size is in the proper mode. */
1129 if (GET_MODE (size) != VOIDmode && GET_MODE (size) != Pmode)
1130 size = convert_to_mode (Pmode, size, 1);
1131
1132 /* We will need to ensure that the address we return is aligned to
1133 BIGGEST_ALIGNMENT. If STACK_DYNAMIC_OFFSET is defined, we don't
1134 always know its final value at this point in the compilation (it
1135 might depend on the size of the outgoing parameter lists, for
1136 example), so we must align the value to be returned in that case.
1137 (Note that STACK_DYNAMIC_OFFSET will have a default non-zero value if
1138 STACK_POINTER_OFFSET or ACCUMULATE_OUTGOING_ARGS are defined).
1139 We must also do an alignment operation on the returned value if
1140 the stack pointer alignment is less strict that BIGGEST_ALIGNMENT.
1141
1142 If we have to align, we must leave space in SIZE for the hole
1143 that might result from the alignment operation. */
1144
c795bca9 1145#if defined (STACK_DYNAMIC_OFFSET) || defined (STACK_POINTER_OFFSET) || ! defined (PREFERRED_STACK_BOUNDARY)
515a7242
JW
1146#define MUST_ALIGN 1
1147#else
c795bca9 1148#define MUST_ALIGN (PREFERRED_STACK_BOUNDARY < BIGGEST_ALIGNMENT)
18ca7dab
RK
1149#endif
1150
515a7242 1151 if (MUST_ALIGN)
3b998c11
RK
1152 {
1153 if (GET_CODE (size) == CONST_INT)
b1ec3c92
CH
1154 size = GEN_INT (INTVAL (size)
1155 + (BIGGEST_ALIGNMENT / BITS_PER_UNIT - 1));
3b998c11
RK
1156 else
1157 size = expand_binop (Pmode, add_optab, size,
b1ec3c92
CH
1158 GEN_INT (BIGGEST_ALIGNMENT / BITS_PER_UNIT - 1),
1159 NULL_RTX, 1, OPTAB_LIB_WIDEN);
3b998c11 1160 }
1d9d04f8 1161
18ca7dab
RK
1162#ifdef SETJMP_VIA_SAVE_AREA
1163 /* If setjmp restores regs from a save area in the stack frame,
1164 avoid clobbering the reg save area. Note that the offset of
1165 virtual_incoming_args_rtx includes the preallocated stack args space.
1166 It would be no problem to clobber that, but it's on the wrong side
1167 of the old save area. */
1168 {
1169 rtx dynamic_offset
1170 = expand_binop (Pmode, sub_optab, virtual_stack_dynamic_rtx,
b1ec3c92 1171 stack_pointer_rtx, NULL_RTX, 1, OPTAB_LIB_WIDEN);
c9ec4f99
DM
1172
1173 if (!current_function_calls_setjmp)
1174 {
c795bca9 1175 int align = PREFERRED_STACK_BOUNDARY / BITS_PER_UNIT;
c9ec4f99
DM
1176
1177 /* See optimize_save_area_alloca to understand what is being
1178 set up here. */
1179
c795bca9 1180#if !defined(PREFERRED_STACK_BOUNDARY) || !defined(MUST_ALIGN) || (PREFERRED_STACK_BOUNDARY != BIGGEST_ALIGNMENT)
c9ec4f99
DM
1181 /* If anyone creates a target with these characteristics, let them
1182 know that our optimization cannot work correctly in such a case. */
1183 abort();
1184#endif
1185
1186 if (GET_CODE (size) == CONST_INT)
1187 {
1188 int new = INTVAL (size) / align * align;
1189
1190 if (INTVAL (size) != new)
1191 setjmpless_size = GEN_INT (new);
1192 else
1193 setjmpless_size = size;
1194 }
1195 else
1196 {
1197 /* Since we know overflow is not possible, we avoid using
1198 CEIL_DIV_EXPR and use TRUNC_DIV_EXPR instead. */
1199 setjmpless_size = expand_divmod (0, TRUNC_DIV_EXPR, Pmode, size,
1200 GEN_INT (align), NULL_RTX, 1);
1201 setjmpless_size = expand_mult (Pmode, setjmpless_size,
1202 GEN_INT (align), NULL_RTX, 1);
1203 }
1204 /* Our optimization works based upon being able to perform a simple
1205 transformation of this RTL into a (set REG REG) so make sure things
1206 did in fact end up in a REG. */
1207 if (!arith_operand (setjmpless_size, Pmode))
1208 setjmpless_size = force_reg (Pmode, setjmpless_size);
1209 }
1210
18ca7dab 1211 size = expand_binop (Pmode, add_optab, size, dynamic_offset,
b1ec3c92 1212 NULL_RTX, 1, OPTAB_LIB_WIDEN);
18ca7dab
RK
1213 }
1214#endif /* SETJMP_VIA_SAVE_AREA */
1215
1216 /* Round the size to a multiple of the required stack alignment.
1217 Since the stack if presumed to be rounded before this allocation,
1218 this will maintain the required alignment.
1219
1220 If the stack grows downward, we could save an insn by subtracting
1221 SIZE from the stack pointer and then aligning the stack pointer.
1222 The problem with this is that the stack pointer may be unaligned
1223 between the execution of the subtraction and alignment insns and
1224 some machines do not allow this. Even on those that do, some
1225 signal handlers malfunction if a signal should occur between those
1226 insns. Since this is an extremely rare event, we have no reliable
1227 way of knowing which systems have this problem. So we avoid even
1228 momentarily mis-aligning the stack. */
1229
c795bca9 1230#ifdef PREFERRED_STACK_BOUNDARY
86b25e81
RS
1231 /* If we added a variable amount to SIZE,
1232 we can no longer assume it is aligned. */
515a7242 1233#if !defined (SETJMP_VIA_SAVE_AREA)
c795bca9 1234 if (MUST_ALIGN || known_align % PREFERRED_STACK_BOUNDARY != 0)
34c9156a 1235#endif
091ad0b9 1236 size = round_push (size);
89d825c9 1237#endif
18ca7dab
RK
1238
1239 do_pending_stack_adjust ();
1240
edff2491
RK
1241 /* If needed, check that we have the required amount of stack. Take into
1242 account what has already been checked. */
1243 if (flag_stack_check && ! STACK_CHECK_BUILTIN)
1244 probe_stack_range (STACK_CHECK_MAX_FRAME_SIZE + STACK_CHECK_PROTECT, size);
1245
091ad0b9
RK
1246 /* Don't use a TARGET that isn't a pseudo. */
1247 if (target == 0 || GET_CODE (target) != REG
1248 || REGNO (target) < FIRST_PSEUDO_REGISTER)
18ca7dab
RK
1249 target = gen_reg_rtx (Pmode);
1250
305f22b5 1251 mark_reg_pointer (target, known_align / BITS_PER_UNIT);
3ad69266 1252
18ca7dab
RK
1253 /* Perform the required allocation from the stack. Some systems do
1254 this differently than simply incrementing/decrementing from the
38a448ca 1255 stack pointer, such as acquiring the space by calling malloc(). */
18ca7dab
RK
1256#ifdef HAVE_allocate_stack
1257 if (HAVE_allocate_stack)
1258 {
39403d82
DE
1259 enum machine_mode mode = STACK_SIZE_MODE;
1260
18ca7dab
RK
1261 if (insn_operand_predicate[(int) CODE_FOR_allocate_stack][0]
1262 && ! ((*insn_operand_predicate[(int) CODE_FOR_allocate_stack][0])
38a448ca
RH
1263 (target, Pmode)))
1264 target = copy_to_mode_reg (Pmode, target);
39403d82 1265 size = convert_modes (mode, ptr_mode, size, 1);
38a448ca
RH
1266 if (insn_operand_predicate[(int) CODE_FOR_allocate_stack][1]
1267 && ! ((*insn_operand_predicate[(int) CODE_FOR_allocate_stack][1])
39403d82
DE
1268 (size, mode)))
1269 size = copy_to_mode_reg (mode, size);
18ca7dab 1270
38a448ca 1271 emit_insn (gen_allocate_stack (target, size));
18ca7dab
RK
1272 }
1273 else
1274#endif
ea534b63 1275 {
38a448ca
RH
1276#ifndef STACK_GROWS_DOWNWARD
1277 emit_move_insn (target, virtual_stack_dynamic_rtx);
1278#endif
ea534b63
RK
1279 size = convert_modes (Pmode, ptr_mode, size, 1);
1280 anti_adjust_stack (size);
c9ec4f99
DM
1281#ifdef SETJMP_VIA_SAVE_AREA
1282 if (setjmpless_size != NULL_RTX)
1283 {
1284 rtx note_target = get_last_insn ();
1285
9e6a5703
JC
1286 REG_NOTES (note_target)
1287 = gen_rtx_EXPR_LIST (REG_SAVE_AREA, setjmpless_size,
1288 REG_NOTES (note_target));
c9ec4f99
DM
1289 }
1290#endif /* SETJMP_VIA_SAVE_AREA */
18ca7dab
RK
1291#ifdef STACK_GROWS_DOWNWARD
1292 emit_move_insn (target, virtual_stack_dynamic_rtx);
1293#endif
38a448ca 1294 }
18ca7dab 1295
515a7242 1296 if (MUST_ALIGN)
091ad0b9 1297 {
5244db05 1298 /* CEIL_DIV_EXPR needs to worry about the addition overflowing,
0f41302f
MS
1299 but we know it can't. So add ourselves and then do
1300 TRUNC_DIV_EXPR. */
0f56a403 1301 target = expand_binop (Pmode, add_optab, target,
5244db05
RK
1302 GEN_INT (BIGGEST_ALIGNMENT / BITS_PER_UNIT - 1),
1303 NULL_RTX, 1, OPTAB_LIB_WIDEN);
1304 target = expand_divmod (0, TRUNC_DIV_EXPR, Pmode, target,
b1ec3c92
CH
1305 GEN_INT (BIGGEST_ALIGNMENT / BITS_PER_UNIT),
1306 NULL_RTX, 1);
091ad0b9 1307 target = expand_mult (Pmode, target,
b1ec3c92
CH
1308 GEN_INT (BIGGEST_ALIGNMENT / BITS_PER_UNIT),
1309 NULL_RTX, 1);
091ad0b9 1310 }
18ca7dab
RK
1311
1312 /* Some systems require a particular insn to refer to the stack
1313 to make the pages exist. */
1314#ifdef HAVE_probe
1315 if (HAVE_probe)
1316 emit_insn (gen_probe ());
1317#endif
1318
15fc0026 1319 /* Record the new stack level for nonlocal gotos. */
ba716ac9 1320 if (nonlocal_goto_handler_slots != 0)
15fc0026
RK
1321 emit_stack_save (SAVE_NONLOCAL, &nonlocal_goto_stack_level, NULL_RTX);
1322
18ca7dab
RK
1323 return target;
1324}
1325\f
edff2491
RK
1326/* Emit one stack probe at ADDRESS, an address within the stack. */
1327
1328static void
1329emit_stack_probe (address)
1330 rtx address;
1331{
38a448ca 1332 rtx memref = gen_rtx_MEM (word_mode, address);
edff2491
RK
1333
1334 MEM_VOLATILE_P (memref) = 1;
1335
1336 if (STACK_CHECK_PROBE_LOAD)
1337 emit_move_insn (gen_reg_rtx (word_mode), memref);
1338 else
1339 emit_move_insn (memref, const0_rtx);
1340}
1341
1342/* Probe a range of stack addresses from FIRST to FIRST+SIZE, inclusive.
1343 FIRST is a constant and size is a Pmode RTX. These are offsets from the
1344 current stack pointer. STACK_GROWS_DOWNWARD says whether to add or
1345 subtract from the stack. If SIZE is constant, this is done
1346 with a fixed number of probes. Otherwise, we must make a loop. */
1347
1348#ifdef STACK_GROWS_DOWNWARD
1349#define STACK_GROW_OP MINUS
1350#else
1351#define STACK_GROW_OP PLUS
1352#endif
1353
1354void
1355probe_stack_range (first, size)
1356 HOST_WIDE_INT first;
1357 rtx size;
1358{
1359 /* First see if we have an insn to check the stack. Use it if so. */
1360#ifdef HAVE_check_stack
1361 if (HAVE_check_stack)
1362 {
38a448ca
RH
1363 rtx last_addr
1364 = force_operand (gen_rtx_STACK_GROW_OP (Pmode,
1365 stack_pointer_rtx,
1366 plus_constant (size, first)),
1367 NULL_RTX);
edff2491
RK
1368
1369 if (insn_operand_predicate[(int) CODE_FOR_check_stack][0]
1370 && ! ((*insn_operand_predicate[(int) CODE_FOR_check_stack][0])
1371 (last_address, Pmode)))
1372 last_address = copy_to_mode_reg (Pmode, last_address);
1373
1374 emit_insn (gen_check_stack (last_address));
1375 return;
1376 }
1377#endif
1378
1379 /* If we have to generate explicit probes, see if we have a constant
95a086b1 1380 small number of them to generate. If so, that's the easy case. */
e5e809f4
JL
1381 if (GET_CODE (size) == CONST_INT
1382 && INTVAL (size) < 10 * STACK_CHECK_PROBE_INTERVAL)
edff2491
RK
1383 {
1384 HOST_WIDE_INT offset;
1385
1386 /* Start probing at FIRST + N * STACK_CHECK_PROBE_INTERVAL
1387 for values of N from 1 until it exceeds LAST. If only one
1388 probe is needed, this will not generate any code. Then probe
1389 at LAST. */
1390 for (offset = first + STACK_CHECK_PROBE_INTERVAL;
1391 offset < INTVAL (size);
1392 offset = offset + STACK_CHECK_PROBE_INTERVAL)
38a448ca
RH
1393 emit_stack_probe (gen_rtx_fmt_ee (STACK_GROW_OP, Pmode,
1394 stack_pointer_rtx,
1395 GEN_INT (offset)));
edff2491 1396
38a448ca
RH
1397 emit_stack_probe (gen_rtx_fmt_ee (STACK_GROW_OP, Pmode,
1398 stack_pointer_rtx,
1399 plus_constant (size, first)));
edff2491
RK
1400 }
1401
1402 /* In the variable case, do the same as above, but in a loop. We emit loop
1403 notes so that loop optimization can be done. */
1404 else
1405 {
1406 rtx test_addr
38a448ca
RH
1407 = force_operand (gen_rtx_fmt_ee (STACK_GROW_OP, Pmode,
1408 stack_pointer_rtx,
1409 GEN_INT (first + STACK_CHECK_PROBE_INTERVAL)),
edff2491
RK
1410 NULL_RTX);
1411 rtx last_addr
38a448ca
RH
1412 = force_operand (gen_rtx_fmt_ee (STACK_GROW_OP, Pmode,
1413 stack_pointer_rtx,
1414 plus_constant (size, first)),
edff2491
RK
1415 NULL_RTX);
1416 rtx incr = GEN_INT (STACK_CHECK_PROBE_INTERVAL);
1417 rtx loop_lab = gen_label_rtx ();
1418 rtx test_lab = gen_label_rtx ();
1419 rtx end_lab = gen_label_rtx ();
1420 rtx temp;
1421
1422 if (GET_CODE (test_addr) != REG
1423 || REGNO (test_addr) < FIRST_PSEUDO_REGISTER)
1424 test_addr = force_reg (Pmode, test_addr);
1425
1426 emit_note (NULL_PTR, NOTE_INSN_LOOP_BEG);
1427 emit_jump (test_lab);
1428
1429 emit_label (loop_lab);
1430 emit_stack_probe (test_addr);
1431
1432 emit_note (NULL_PTR, NOTE_INSN_LOOP_CONT);
1433
1434#ifdef STACK_GROWS_DOWNWARD
1435#define CMP_OPCODE GTU
1436 temp = expand_binop (Pmode, sub_optab, test_addr, incr, test_addr,
1437 1, OPTAB_WIDEN);
1438#else
1439#define CMP_OPCODE LTU
1440 temp = expand_binop (Pmode, add_optab, test_addr, incr, test_addr,
1441 1, OPTAB_WIDEN);
1442#endif
1443
1444 if (temp != test_addr)
1445 abort ();
1446
1447 emit_label (test_lab);
1448 emit_cmp_insn (test_addr, last_addr, CMP_OPCODE, NULL_RTX, Pmode, 1, 0);
1449 emit_jump_insn ((*bcc_gen_fctn[(int) CMP_OPCODE]) (loop_lab));
1450 emit_jump (end_lab);
1451 emit_note (NULL_PTR, NOTE_INSN_LOOP_END);
1452 emit_label (end_lab);
1453
38a448ca
RH
1454 /* If will be doing stupid optimization, show test_addr is still live. */
1455 if (obey_regdecls)
1456 emit_insn (gen_rtx_USE (VOIDmode, test_addr));
1457
edff2491
RK
1458 emit_stack_probe (last_addr);
1459 }
1460}
1461\f
18ca7dab
RK
1462/* Return an rtx representing the register or memory location
1463 in which a scalar value of data type VALTYPE
1464 was returned by a function call to function FUNC.
1465 FUNC is a FUNCTION_DECL node if the precise function is known,
1466 otherwise 0. */
1467
1468rtx
1469hard_function_value (valtype, func)
1470 tree valtype;
1471 tree func;
1472{
e1a4071f
JL
1473 rtx val = FUNCTION_VALUE (valtype, func);
1474 if (GET_CODE (val) == REG
1475 && GET_MODE (val) == BLKmode)
1476 {
1477 int bytes = int_size_in_bytes (valtype);
1478 enum machine_mode tmpmode;
1479 for (tmpmode = GET_CLASS_NARROWEST_MODE (MODE_INT);
1480 tmpmode != MAX_MACHINE_MODE;
1481 tmpmode = GET_MODE_WIDER_MODE (tmpmode))
1482 {
1483 /* Have we found a large enough mode? */
1484 if (GET_MODE_SIZE (tmpmode) >= bytes)
1485 break;
1486 }
1487
1488 /* No suitable mode found. */
1489 if (tmpmode == MAX_MACHINE_MODE)
1490 abort ();
1491
1492 PUT_MODE (val, tmpmode);
1493 }
1494 return val;
18ca7dab
RK
1495}
1496
1497/* Return an rtx representing the register or memory location
1498 in which a scalar value of mode MODE was returned by a library call. */
1499
1500rtx
1501hard_libcall_value (mode)
1502 enum machine_mode mode;
1503{
1504 return LIBCALL_VALUE (mode);
1505}
0c5e217d
RS
1506
1507/* Look up the tree code for a given rtx code
1508 to provide the arithmetic operation for REAL_ARITHMETIC.
1509 The function returns an int because the caller may not know
1510 what `enum tree_code' means. */
1511
1512int
1513rtx_to_tree_code (code)
1514 enum rtx_code code;
1515{
1516 enum tree_code tcode;
1517
1518 switch (code)
1519 {
1520 case PLUS:
1521 tcode = PLUS_EXPR;
1522 break;
1523 case MINUS:
1524 tcode = MINUS_EXPR;
1525 break;
1526 case MULT:
1527 tcode = MULT_EXPR;
1528 break;
1529 case DIV:
1530 tcode = RDIV_EXPR;
1531 break;
1532 case SMIN:
1533 tcode = MIN_EXPR;
1534 break;
1535 case SMAX:
1536 tcode = MAX_EXPR;
1537 break;
1538 default:
1539 tcode = LAST_AND_UNUSED_TREE_CODE;
1540 break;
1541 }
1542 return ((int) tcode);
1543}