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