]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/explow.c
(OBJECT_SUFFIX): Move to here; now has period.
[thirdparty/gcc.git] / gcc / explow.c
CommitLineData
18ca7dab 1/* Subroutines for manipulating rtx's in semantically interesting ways.
e475ed2a 2 Copyright (C) 1987, 1991, 1994, 1995 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
18the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
19
20
21#include "config.h"
22#include "rtl.h"
23#include "tree.h"
24#include "flags.h"
25#include "expr.h"
26#include "hard-reg-set.h"
27#include "insn-config.h"
28#include "recog.h"
29#include "insn-flags.h"
30#include "insn-codes.h"
31
ea534b63
RK
32static rtx break_out_memory_refs PROTO((rtx));
33static rtx convert_memory_address PROTO((rtx));
34
b1ec3c92
CH
35/* Return an rtx for the sum of X and the integer C.
36
8008b228 37 This function should be used via the `plus_constant' macro. */
18ca7dab
RK
38
39rtx
b1ec3c92 40plus_constant_wide (x, c)
18ca7dab 41 register rtx x;
b1ec3c92 42 register HOST_WIDE_INT c;
18ca7dab
RK
43{
44 register RTX_CODE code;
45 register enum machine_mode mode;
46 register rtx tem;
47 int all_constant = 0;
48
49 if (c == 0)
50 return x;
51
52 restart:
53
54 code = GET_CODE (x);
55 mode = GET_MODE (x);
56 switch (code)
57 {
58 case CONST_INT:
b1ec3c92 59 return GEN_INT (INTVAL (x) + c);
18ca7dab
RK
60
61 case CONST_DOUBLE:
62 {
b1ec3c92
CH
63 HOST_WIDE_INT l1 = CONST_DOUBLE_LOW (x);
64 HOST_WIDE_INT h1 = CONST_DOUBLE_HIGH (x);
65 HOST_WIDE_INT l2 = c;
66 HOST_WIDE_INT h2 = c < 0 ? ~0 : 0;
67 HOST_WIDE_INT lv, hv;
18ca7dab
RK
68
69 add_double (l1, h1, l2, h2, &lv, &hv);
70
71 return immed_double_const (lv, hv, VOIDmode);
72 }
73
74 case MEM:
75 /* If this is a reference to the constant pool, try replacing it with
76 a reference to a new constant. If the resulting address isn't
77 valid, don't return it because we have no way to validize it. */
78 if (GET_CODE (XEXP (x, 0)) == SYMBOL_REF
79 && CONSTANT_POOL_ADDRESS_P (XEXP (x, 0)))
80 {
81 tem
82 = force_const_mem (GET_MODE (x),
83 plus_constant (get_pool_constant (XEXP (x, 0)),
84 c));
85 if (memory_address_p (GET_MODE (tem), XEXP (tem, 0)))
86 return tem;
87 }
88 break;
89
90 case CONST:
91 /* If adding to something entirely constant, set a flag
92 so that we can add a CONST around the result. */
93 x = XEXP (x, 0);
94 all_constant = 1;
95 goto restart;
96
97 case SYMBOL_REF:
98 case LABEL_REF:
99 all_constant = 1;
100 break;
101
102 case PLUS:
103 /* The interesting case is adding the integer to a sum.
104 Look for constant term in the sum and combine
105 with C. For an integer constant term, we make a combined
106 integer. For a constant term that is not an explicit integer,
e5671f2b
RK
107 we cannot really combine, but group them together anyway.
108
109 Use a recursive call in case the remaining operand is something
110 that we handle specially, such as a SYMBOL_REF. */
111
112 if (GET_CODE (XEXP (x, 1)) == CONST_INT)
113 return plus_constant (XEXP (x, 0), c + INTVAL (XEXP (x, 1)));
18ca7dab
RK
114 else if (CONSTANT_P (XEXP (x, 0)))
115 return gen_rtx (PLUS, mode,
116 plus_constant (XEXP (x, 0), c),
117 XEXP (x, 1));
118 else if (CONSTANT_P (XEXP (x, 1)))
119 return gen_rtx (PLUS, mode,
120 XEXP (x, 0),
121 plus_constant (XEXP (x, 1), c));
122 }
123
124 if (c != 0)
b1ec3c92 125 x = gen_rtx (PLUS, mode, x, GEN_INT (c));
18ca7dab
RK
126
127 if (GET_CODE (x) == SYMBOL_REF || GET_CODE (x) == LABEL_REF)
128 return x;
129 else if (all_constant)
130 return gen_rtx (CONST, mode, x);
131 else
132 return x;
133}
134
b1ec3c92
CH
135/* This is the same as `plus_constant', except that it handles LO_SUM.
136
137 This function should be used via the `plus_constant_for_output' macro. */
18ca7dab
RK
138
139rtx
b1ec3c92 140plus_constant_for_output_wide (x, c)
18ca7dab 141 register rtx x;
b1ec3c92 142 register HOST_WIDE_INT c;
18ca7dab
RK
143{
144 register RTX_CODE code = GET_CODE (x);
145 register enum machine_mode mode = GET_MODE (x);
146 int all_constant = 0;
147
148 if (GET_CODE (x) == LO_SUM)
149 return gen_rtx (LO_SUM, mode, XEXP (x, 0),
150 plus_constant_for_output (XEXP (x, 1), c));
151
152 else
153 return plus_constant (x, c);
154}
155\f
156/* If X is a sum, return a new sum like X but lacking any constant terms.
157 Add all the removed constant terms into *CONSTPTR.
158 X itself is not altered. The result != X if and only if
159 it is not isomorphic to X. */
160
161rtx
162eliminate_constant_term (x, constptr)
163 rtx x;
164 rtx *constptr;
165{
166 register rtx x0, x1;
167 rtx tem;
168
169 if (GET_CODE (x) != PLUS)
170 return x;
171
172 /* First handle constants appearing at this level explicitly. */
173 if (GET_CODE (XEXP (x, 1)) == CONST_INT
174 && 0 != (tem = simplify_binary_operation (PLUS, GET_MODE (x), *constptr,
175 XEXP (x, 1)))
176 && GET_CODE (tem) == CONST_INT)
177 {
178 *constptr = tem;
179 return eliminate_constant_term (XEXP (x, 0), constptr);
180 }
181
182 tem = const0_rtx;
183 x0 = eliminate_constant_term (XEXP (x, 0), &tem);
184 x1 = eliminate_constant_term (XEXP (x, 1), &tem);
185 if ((x1 != XEXP (x, 1) || x0 != XEXP (x, 0))
186 && 0 != (tem = simplify_binary_operation (PLUS, GET_MODE (x),
187 *constptr, tem))
188 && GET_CODE (tem) == CONST_INT)
189 {
190 *constptr = tem;
191 return gen_rtx (PLUS, GET_MODE (x), x0, x1);
192 }
193
194 return x;
195}
196
197/* Returns the insn that next references REG after INSN, or 0
198 if REG is clobbered before next referenced or we cannot find
199 an insn that references REG in a straight-line piece of code. */
200
201rtx
202find_next_ref (reg, insn)
203 rtx reg;
204 rtx insn;
205{
206 rtx next;
207
208 for (insn = NEXT_INSN (insn); insn; insn = next)
209 {
210 next = NEXT_INSN (insn);
211 if (GET_CODE (insn) == NOTE)
212 continue;
213 if (GET_CODE (insn) == CODE_LABEL
214 || GET_CODE (insn) == BARRIER)
215 return 0;
216 if (GET_CODE (insn) == INSN
217 || GET_CODE (insn) == JUMP_INSN
218 || GET_CODE (insn) == CALL_INSN)
219 {
220 if (reg_set_p (reg, insn))
221 return 0;
222 if (reg_mentioned_p (reg, PATTERN (insn)))
223 return insn;
224 if (GET_CODE (insn) == JUMP_INSN)
225 {
226 if (simplejump_p (insn))
227 next = JUMP_LABEL (insn);
228 else
229 return 0;
230 }
231 if (GET_CODE (insn) == CALL_INSN
232 && REGNO (reg) < FIRST_PSEUDO_REGISTER
233 && call_used_regs[REGNO (reg)])
234 return 0;
235 }
236 else
237 abort ();
238 }
239 return 0;
240}
241
242/* Return an rtx for the size in bytes of the value of EXP. */
243
244rtx
245expr_size (exp)
246 tree exp;
247{
99098c66
RK
248 tree size = size_in_bytes (TREE_TYPE (exp));
249
250 if (TREE_CODE (size) != INTEGER_CST
251 && contains_placeholder_p (size))
252 size = build (WITH_RECORD_EXPR, sizetype, size, exp);
253
254 return expand_expr (size, NULL_RTX, TYPE_MODE (sizetype), 0);
18ca7dab
RK
255}
256\f
257/* Return a copy of X in which all memory references
258 and all constants that involve symbol refs
259 have been replaced with new temporary registers.
260 Also emit code to load the memory locations and constants
261 into those registers.
262
263 If X contains no such constants or memory references,
264 X itself (not a copy) is returned.
265
266 If a constant is found in the address that is not a legitimate constant
267 in an insn, it is left alone in the hope that it might be valid in the
268 address.
269
270 X may contain no arithmetic except addition, subtraction and multiplication.
271 Values returned by expand_expr with 1 for sum_ok fit this constraint. */
272
273static rtx
274break_out_memory_refs (x)
275 register rtx x;
276{
277 if (GET_CODE (x) == MEM
cabeca29 278 || (CONSTANT_P (x) && CONSTANT_ADDRESS_P (x)
18ca7dab 279 && GET_MODE (x) != VOIDmode))
2cca6e3f 280 x = force_reg (GET_MODE (x), x);
18ca7dab
RK
281 else if (GET_CODE (x) == PLUS || GET_CODE (x) == MINUS
282 || GET_CODE (x) == MULT)
283 {
284 register rtx op0 = break_out_memory_refs (XEXP (x, 0));
285 register rtx op1 = break_out_memory_refs (XEXP (x, 1));
2cca6e3f 286
18ca7dab
RK
287 if (op0 != XEXP (x, 0) || op1 != XEXP (x, 1))
288 x = gen_rtx (GET_CODE (x), Pmode, op0, op1);
289 }
2cca6e3f 290
18ca7dab
RK
291 return x;
292}
293
ea534b63
RK
294#ifdef POINTERS_EXTEND_UNSIGNED
295
296/* Given X, a memory address in ptr_mode, convert it to an address
297 in Pmode. We take advantage of the fact that pointers are not
298 allowed to overflow by commuting arithmetic operations over
299 conversions so that address arithmetic insns can be used. */
300
301static rtx
302convert_memory_address (x)
303 rtx x;
304{
305 switch (GET_CODE (x))
306 {
307 case CONST_INT:
308 case CONST_DOUBLE:
309 case LABEL_REF:
310 case SYMBOL_REF:
311 case CONST:
312 return x;
313
314 case PLUS:
315 case MULT:
316 return gen_rtx (GET_CODE (x), Pmode,
317 convert_memory_address (XEXP (x, 0)),
318 convert_memory_address (XEXP (x, 1)));
319
320 default:
321 return convert_modes (Pmode, ptr_mode, x, POINTERS_EXTEND_UNSIGNED);
322 }
323}
324#endif
325
18ca7dab
RK
326/* Given a memory address or facsimile X, construct a new address,
327 currently equivalent, that is stable: future stores won't change it.
328
329 X must be composed of constants, register and memory references
330 combined with addition, subtraction and multiplication:
331 in other words, just what you can get from expand_expr if sum_ok is 1.
332
333 Works by making copies of all regs and memory locations used
334 by X and combining them the same way X does.
335 You could also stabilize the reference to this address
336 by copying the address to a register with copy_to_reg;
337 but then you wouldn't get indexed addressing in the reference. */
338
339rtx
340copy_all_regs (x)
341 register rtx x;
342{
343 if (GET_CODE (x) == REG)
344 {
11c50c5e
DE
345 if (REGNO (x) != FRAME_POINTER_REGNUM
346#if HARD_FRAME_POINTER_REGNUM != FRAME_POINTER_REGNUM
347 && REGNO (x) != HARD_FRAME_POINTER_REGNUM
348#endif
349 )
18ca7dab
RK
350 x = copy_to_reg (x);
351 }
352 else if (GET_CODE (x) == MEM)
353 x = copy_to_reg (x);
354 else if (GET_CODE (x) == PLUS || GET_CODE (x) == MINUS
355 || GET_CODE (x) == MULT)
356 {
357 register rtx op0 = copy_all_regs (XEXP (x, 0));
358 register rtx op1 = copy_all_regs (XEXP (x, 1));
359 if (op0 != XEXP (x, 0) || op1 != XEXP (x, 1))
360 x = gen_rtx (GET_CODE (x), Pmode, op0, op1);
361 }
362 return x;
363}
364\f
365/* Return something equivalent to X but valid as a memory address
366 for something of mode MODE. When X is not itself valid, this
367 works by copying X or subexpressions of it into registers. */
368
369rtx
370memory_address (mode, x)
371 enum machine_mode mode;
372 register rtx x;
373{
18b9ca6f 374 register rtx oldx = x;
18ca7dab 375
ea534b63
RK
376#ifdef POINTERS_EXTEND_UNSIGNED
377 if (GET_MODE (x) == ptr_mode)
378 x = convert_memory_address (x);
379#endif
380
18ca7dab
RK
381 /* By passing constant addresses thru registers
382 we get a chance to cse them. */
cabeca29 383 if (! cse_not_expected && CONSTANT_P (x) && CONSTANT_ADDRESS_P (x))
18b9ca6f 384 x = force_reg (Pmode, x);
18ca7dab
RK
385
386 /* Accept a QUEUED that refers to a REG
387 even though that isn't a valid address.
388 On attempting to put this in an insn we will call protect_from_queue
389 which will turn it into a REG, which is valid. */
18b9ca6f 390 else if (GET_CODE (x) == QUEUED
18ca7dab 391 && GET_CODE (QUEUED_VAR (x)) == REG)
18b9ca6f 392 ;
18ca7dab
RK
393
394 /* We get better cse by rejecting indirect addressing at this stage.
395 Let the combiner create indirect addresses where appropriate.
396 For now, generate the code so that the subexpressions useful to share
397 are visible. But not if cse won't be done! */
18b9ca6f 398 else
18ca7dab 399 {
18b9ca6f
RK
400 if (! cse_not_expected && GET_CODE (x) != REG)
401 x = break_out_memory_refs (x);
402
403 /* At this point, any valid address is accepted. */
404 GO_IF_LEGITIMATE_ADDRESS (mode, x, win);
405
406 /* If it was valid before but breaking out memory refs invalidated it,
407 use it the old way. */
408 if (memory_address_p (mode, oldx))
409 goto win2;
410
411 /* Perform machine-dependent transformations on X
412 in certain cases. This is not necessary since the code
413 below can handle all possible cases, but machine-dependent
414 transformations can make better code. */
415 LEGITIMIZE_ADDRESS (x, oldx, mode, win);
416
417 /* PLUS and MULT can appear in special ways
418 as the result of attempts to make an address usable for indexing.
419 Usually they are dealt with by calling force_operand, below.
420 But a sum containing constant terms is special
421 if removing them makes the sum a valid address:
422 then we generate that address in a register
423 and index off of it. We do this because it often makes
424 shorter code, and because the addresses thus generated
425 in registers often become common subexpressions. */
426 if (GET_CODE (x) == PLUS)
427 {
428 rtx constant_term = const0_rtx;
429 rtx y = eliminate_constant_term (x, &constant_term);
430 if (constant_term == const0_rtx
431 || ! memory_address_p (mode, y))
432 x = force_operand (x, NULL_RTX);
433 else
434 {
435 y = gen_rtx (PLUS, GET_MODE (x), copy_to_reg (y), constant_term);
436 if (! memory_address_p (mode, y))
437 x = force_operand (x, NULL_RTX);
438 else
439 x = y;
440 }
441 }
18ca7dab 442
e475ed2a 443 else if (GET_CODE (x) == MULT || GET_CODE (x) == MINUS)
18b9ca6f 444 x = force_operand (x, NULL_RTX);
18ca7dab 445
18b9ca6f
RK
446 /* If we have a register that's an invalid address,
447 it must be a hard reg of the wrong class. Copy it to a pseudo. */
448 else if (GET_CODE (x) == REG)
449 x = copy_to_reg (x);
450
451 /* Last resort: copy the value to a register, since
452 the register is a valid address. */
453 else
454 x = force_reg (Pmode, x);
455
456 goto done;
18ca7dab 457
c02a7fbb
RK
458 win2:
459 x = oldx;
460 win:
461 if (flag_force_addr && ! cse_not_expected && GET_CODE (x) != REG
462 /* Don't copy an addr via a reg if it is one of our stack slots. */
463 && ! (GET_CODE (x) == PLUS
464 && (XEXP (x, 0) == virtual_stack_vars_rtx
465 || XEXP (x, 0) == virtual_incoming_args_rtx)))
466 {
467 if (general_operand (x, Pmode))
468 x = force_reg (Pmode, x);
469 else
470 x = force_operand (x, NULL_RTX);
471 }
18ca7dab 472 }
18b9ca6f
RK
473
474 done:
475
2cca6e3f
RK
476 /* If we didn't change the address, we are done. Otherwise, mark
477 a reg as a pointer if we have REG or REG + CONST_INT. */
478 if (oldx == x)
479 return x;
480 else if (GET_CODE (x) == REG)
481 mark_reg_pointer (x);
482 else if (GET_CODE (x) == PLUS
483 && GET_CODE (XEXP (x, 0)) == REG
484 && GET_CODE (XEXP (x, 1)) == CONST_INT)
485 mark_reg_pointer (XEXP (x, 0));
486
18b9ca6f
RK
487 /* OLDX may have been the address on a temporary. Update the address
488 to indicate that X is now used. */
489 update_temp_slot_address (oldx, x);
490
18ca7dab
RK
491 return x;
492}
493
494/* Like `memory_address' but pretend `flag_force_addr' is 0. */
495
496rtx
497memory_address_noforce (mode, x)
498 enum machine_mode mode;
499 rtx x;
500{
501 int ambient_force_addr = flag_force_addr;
502 rtx val;
503
504 flag_force_addr = 0;
505 val = memory_address (mode, x);
506 flag_force_addr = ambient_force_addr;
507 return val;
508}
509
510/* Convert a mem ref into one with a valid memory address.
511 Pass through anything else unchanged. */
512
513rtx
514validize_mem (ref)
515 rtx ref;
516{
517 if (GET_CODE (ref) != MEM)
518 return ref;
519 if (memory_address_p (GET_MODE (ref), XEXP (ref, 0)))
520 return ref;
521 /* Don't alter REF itself, since that is probably a stack slot. */
522 return change_address (ref, GET_MODE (ref), XEXP (ref, 0));
523}
524\f
525/* Return a modified copy of X with its memory address copied
526 into a temporary register to protect it from side effects.
527 If X is not a MEM, it is returned unchanged (and not copied).
528 Perhaps even if it is a MEM, if there is no need to change it. */
529
530rtx
531stabilize (x)
532 rtx x;
533{
534 register rtx addr;
535 if (GET_CODE (x) != MEM)
536 return x;
537 addr = XEXP (x, 0);
538 if (rtx_unstable_p (addr))
539 {
540 rtx temp = copy_all_regs (addr);
541 rtx mem;
542 if (GET_CODE (temp) != REG)
543 temp = copy_to_reg (temp);
544 mem = gen_rtx (MEM, GET_MODE (x), temp);
545
546 /* Mark returned memref with in_struct if it's in an array or
547 structure. Copy const and volatile from original memref. */
548
549 MEM_IN_STRUCT_P (mem) = MEM_IN_STRUCT_P (x) || GET_CODE (addr) == PLUS;
550 RTX_UNCHANGING_P (mem) = RTX_UNCHANGING_P (x);
551 MEM_VOLATILE_P (mem) = MEM_VOLATILE_P (x);
552 return mem;
553 }
554 return x;
555}
556\f
557/* Copy the value or contents of X to a new temp reg and return that reg. */
558
559rtx
560copy_to_reg (x)
561 rtx x;
562{
563 register rtx temp = gen_reg_rtx (GET_MODE (x));
564
565 /* If not an operand, must be an address with PLUS and MULT so
566 do the computation. */
567 if (! general_operand (x, VOIDmode))
568 x = force_operand (x, temp);
569
570 if (x != temp)
571 emit_move_insn (temp, x);
572
573 return temp;
574}
575
576/* Like copy_to_reg but always give the new register mode Pmode
577 in case X is a constant. */
578
579rtx
580copy_addr_to_reg (x)
581 rtx x;
582{
583 return copy_to_mode_reg (Pmode, x);
584}
585
586/* Like copy_to_reg but always give the new register mode MODE
587 in case X is a constant. */
588
589rtx
590copy_to_mode_reg (mode, x)
591 enum machine_mode mode;
592 rtx x;
593{
594 register rtx temp = gen_reg_rtx (mode);
595
596 /* If not an operand, must be an address with PLUS and MULT so
597 do the computation. */
598 if (! general_operand (x, VOIDmode))
599 x = force_operand (x, temp);
600
601 if (GET_MODE (x) != mode && GET_MODE (x) != VOIDmode)
602 abort ();
603 if (x != temp)
604 emit_move_insn (temp, x);
605 return temp;
606}
607
608/* Load X into a register if it is not already one.
609 Use mode MODE for the register.
610 X should be valid for mode MODE, but it may be a constant which
611 is valid for all integer modes; that's why caller must specify MODE.
612
613 The caller must not alter the value in the register we return,
614 since we mark it as a "constant" register. */
615
616rtx
617force_reg (mode, x)
618 enum machine_mode mode;
619 rtx x;
620{
62874575 621 register rtx temp, insn, set;
18ca7dab
RK
622
623 if (GET_CODE (x) == REG)
624 return x;
625 temp = gen_reg_rtx (mode);
626 insn = emit_move_insn (temp, x);
62874575 627
18ca7dab 628 /* Let optimizers know that TEMP's value never changes
62874575
RK
629 and that X can be substituted for it. Don't get confused
630 if INSN set something else (such as a SUBREG of TEMP). */
631 if (CONSTANT_P (x)
632 && (set = single_set (insn)) != 0
633 && SET_DEST (set) == temp)
18ca7dab 634 {
b1ec3c92 635 rtx note = find_reg_note (insn, REG_EQUAL, NULL_RTX);
18ca7dab
RK
636
637 if (note)
638 XEXP (note, 0) = x;
639 else
640 REG_NOTES (insn) = gen_rtx (EXPR_LIST, REG_EQUAL, x, REG_NOTES (insn));
641 }
642 return temp;
643}
644
645/* If X is a memory ref, copy its contents to a new temp reg and return
646 that reg. Otherwise, return X. */
647
648rtx
649force_not_mem (x)
650 rtx x;
651{
652 register rtx temp;
653 if (GET_CODE (x) != MEM || GET_MODE (x) == BLKmode)
654 return x;
655 temp = gen_reg_rtx (GET_MODE (x));
656 emit_move_insn (temp, x);
657 return temp;
658}
659
660/* Copy X to TARGET (if it's nonzero and a reg)
661 or to a new temp reg and return that reg.
662 MODE is the mode to use for X in case it is a constant. */
663
664rtx
665copy_to_suggested_reg (x, target, mode)
666 rtx x, target;
667 enum machine_mode mode;
668{
669 register rtx temp;
670
671 if (target && GET_CODE (target) == REG)
672 temp = target;
673 else
674 temp = gen_reg_rtx (mode);
675
676 emit_move_insn (temp, x);
677 return temp;
678}
679\f
9ff65789
RK
680/* Return the mode to use to store a scalar of TYPE and MODE.
681 PUNSIGNEDP points to the signedness of the type and may be adjusted
682 to show what signedness to use on extension operations.
683
684 FOR_CALL is non-zero if this call is promoting args for a call. */
685
686enum machine_mode
687promote_mode (type, mode, punsignedp, for_call)
688 tree type;
689 enum machine_mode mode;
690 int *punsignedp;
691 int for_call;
692{
693 enum tree_code code = TREE_CODE (type);
694 int unsignedp = *punsignedp;
695
696#ifdef PROMOTE_FOR_CALL_ONLY
697 if (! for_call)
698 return mode;
699#endif
700
701 switch (code)
702 {
703#ifdef PROMOTE_MODE
704 case INTEGER_TYPE: case ENUMERAL_TYPE: case BOOLEAN_TYPE:
705 case CHAR_TYPE: case REAL_TYPE: case OFFSET_TYPE:
706 PROMOTE_MODE (mode, unsignedp, type);
707 break;
708#endif
709
ea534b63 710#ifdef POINTERS_EXTEND_UNSIGNED
9ff65789 711 case POINTER_TYPE:
ea534b63
RK
712 mode = Pmode;
713 unsignedp = POINTERS_EXTEND_UNSIGNED;
9ff65789 714 break;
ea534b63 715#endif
9ff65789
RK
716 }
717
718 *punsignedp = unsignedp;
719 return mode;
720}
721\f
18ca7dab
RK
722/* Adjust the stack pointer by ADJUST (an rtx for a number of bytes).
723 This pops when ADJUST is positive. ADJUST need not be constant. */
724
725void
726adjust_stack (adjust)
727 rtx adjust;
728{
729 rtx temp;
730 adjust = protect_from_queue (adjust, 0);
731
732 if (adjust == const0_rtx)
733 return;
734
735 temp = expand_binop (Pmode,
736#ifdef STACK_GROWS_DOWNWARD
737 add_optab,
738#else
739 sub_optab,
740#endif
741 stack_pointer_rtx, adjust, stack_pointer_rtx, 0,
742 OPTAB_LIB_WIDEN);
743
744 if (temp != stack_pointer_rtx)
745 emit_move_insn (stack_pointer_rtx, temp);
746}
747
748/* Adjust the stack pointer by minus ADJUST (an rtx for a number of bytes).
749 This pushes when ADJUST is positive. ADJUST need not be constant. */
750
751void
752anti_adjust_stack (adjust)
753 rtx adjust;
754{
755 rtx temp;
756 adjust = protect_from_queue (adjust, 0);
757
758 if (adjust == const0_rtx)
759 return;
760
761 temp = expand_binop (Pmode,
762#ifdef STACK_GROWS_DOWNWARD
763 sub_optab,
764#else
765 add_optab,
766#endif
767 stack_pointer_rtx, adjust, stack_pointer_rtx, 0,
768 OPTAB_LIB_WIDEN);
769
770 if (temp != stack_pointer_rtx)
771 emit_move_insn (stack_pointer_rtx, temp);
772}
773
774/* Round the size of a block to be pushed up to the boundary required
775 by this machine. SIZE is the desired size, which need not be constant. */
776
777rtx
778round_push (size)
779 rtx size;
780{
781#ifdef STACK_BOUNDARY
782 int align = STACK_BOUNDARY / BITS_PER_UNIT;
783 if (align == 1)
784 return size;
785 if (GET_CODE (size) == CONST_INT)
786 {
787 int new = (INTVAL (size) + align - 1) / align * align;
788 if (INTVAL (size) != new)
b1ec3c92 789 size = GEN_INT (new);
18ca7dab
RK
790 }
791 else
792 {
5244db05
RK
793 /* CEIL_DIV_EXPR needs to worry about the addition overflowing,
794 but we know it can't. So add ourselves and then do TRUNC_DIV_EXPR. */
795 size = expand_binop (Pmode, add_optab, size, GEN_INT (align - 1),
796 NULL_RTX, 1, OPTAB_LIB_WIDEN);
797 size = expand_divmod (0, TRUNC_DIV_EXPR, Pmode, size, GEN_INT (align),
b1ec3c92
CH
798 NULL_RTX, 1);
799 size = expand_mult (Pmode, size, GEN_INT (align), NULL_RTX, 1);
18ca7dab
RK
800 }
801#endif /* STACK_BOUNDARY */
802 return size;
803}
804\f
59257ff7
RK
805/* Save the stack pointer for the purpose in SAVE_LEVEL. PSAVE is a pointer
806 to a previously-created save area. If no save area has been allocated,
807 this function will allocate one. If a save area is specified, it
808 must be of the proper mode.
809
810 The insns are emitted after insn AFTER, if nonzero, otherwise the insns
811 are emitted at the current position. */
812
813void
814emit_stack_save (save_level, psave, after)
815 enum save_level save_level;
816 rtx *psave;
817 rtx after;
818{
819 rtx sa = *psave;
820 /* The default is that we use a move insn and save in a Pmode object. */
821 rtx (*fcn) () = gen_move_insn;
822 enum machine_mode mode = Pmode;
823
824 /* See if this machine has anything special to do for this kind of save. */
825 switch (save_level)
826 {
827#ifdef HAVE_save_stack_block
828 case SAVE_BLOCK:
829 if (HAVE_save_stack_block)
830 {
831 fcn = gen_save_stack_block;
832 mode = insn_operand_mode[CODE_FOR_save_stack_block][0];
833 }
834 break;
835#endif
836#ifdef HAVE_save_stack_function
837 case SAVE_FUNCTION:
838 if (HAVE_save_stack_function)
839 {
840 fcn = gen_save_stack_function;
841 mode = insn_operand_mode[CODE_FOR_save_stack_function][0];
842 }
843 break;
844#endif
845#ifdef HAVE_save_stack_nonlocal
846 case SAVE_NONLOCAL:
847 if (HAVE_save_stack_nonlocal)
848 {
849 fcn = gen_save_stack_nonlocal;
0d69ab6f 850 mode = insn_operand_mode[(int) CODE_FOR_save_stack_nonlocal][0];
59257ff7
RK
851 }
852 break;
853#endif
854 }
855
856 /* If there is no save area and we have to allocate one, do so. Otherwise
857 verify the save area is the proper mode. */
858
859 if (sa == 0)
860 {
861 if (mode != VOIDmode)
862 {
863 if (save_level == SAVE_NONLOCAL)
864 *psave = sa = assign_stack_local (mode, GET_MODE_SIZE (mode), 0);
865 else
866 *psave = sa = gen_reg_rtx (mode);
867 }
868 }
869 else
870 {
871 if (mode == VOIDmode || GET_MODE (sa) != mode)
872 abort ();
873 }
874
875 if (after)
700f6f98
RK
876 {
877 rtx seq;
878
879 start_sequence ();
5460015d
JW
880 /* We must validize inside the sequence, to ensure that any instructions
881 created by the validize call also get moved to the right place. */
882 if (sa != 0)
883 sa = validize_mem (sa);
d072107f 884 emit_insn (fcn (sa, stack_pointer_rtx));
700f6f98
RK
885 seq = gen_sequence ();
886 end_sequence ();
887 emit_insn_after (seq, after);
888 }
59257ff7 889 else
5460015d
JW
890 {
891 if (sa != 0)
892 sa = validize_mem (sa);
893 emit_insn (fcn (sa, stack_pointer_rtx));
894 }
59257ff7
RK
895}
896
897/* Restore the stack pointer for the purpose in SAVE_LEVEL. SA is the save
898 area made by emit_stack_save. If it is zero, we have nothing to do.
899
900 Put any emitted insns after insn AFTER, if nonzero, otherwise at
901 current position. */
902
903void
904emit_stack_restore (save_level, sa, after)
905 enum save_level save_level;
906 rtx after;
907 rtx sa;
908{
909 /* The default is that we use a move insn. */
910 rtx (*fcn) () = gen_move_insn;
911
912 /* See if this machine has anything special to do for this kind of save. */
913 switch (save_level)
914 {
915#ifdef HAVE_restore_stack_block
916 case SAVE_BLOCK:
917 if (HAVE_restore_stack_block)
918 fcn = gen_restore_stack_block;
919 break;
920#endif
921#ifdef HAVE_restore_stack_function
922 case SAVE_FUNCTION:
923 if (HAVE_restore_stack_function)
924 fcn = gen_restore_stack_function;
925 break;
926#endif
927#ifdef HAVE_restore_stack_nonlocal
928
929 case SAVE_NONLOCAL:
930 if (HAVE_restore_stack_nonlocal)
931 fcn = gen_restore_stack_nonlocal;
932 break;
933#endif
934 }
935
d072107f
RK
936 if (sa != 0)
937 sa = validize_mem (sa);
938
59257ff7 939 if (after)
700f6f98
RK
940 {
941 rtx seq;
942
943 start_sequence ();
d072107f 944 emit_insn (fcn (stack_pointer_rtx, sa));
700f6f98
RK
945 seq = gen_sequence ();
946 end_sequence ();
947 emit_insn_after (seq, after);
948 }
59257ff7 949 else
d072107f 950 emit_insn (fcn (stack_pointer_rtx, sa));
59257ff7
RK
951}
952\f
18ca7dab
RK
953/* Return an rtx representing the address of an area of memory dynamically
954 pushed on the stack. This region of memory is always aligned to
955 a multiple of BIGGEST_ALIGNMENT.
956
957 Any required stack pointer alignment is preserved.
958
959 SIZE is an rtx representing the size of the area.
091ad0b9
RK
960 TARGET is a place in which the address can be placed.
961
962 KNOWN_ALIGN is the alignment (in bits) that we know SIZE has. */
18ca7dab
RK
963
964rtx
091ad0b9 965allocate_dynamic_stack_space (size, target, known_align)
18ca7dab
RK
966 rtx size;
967 rtx target;
091ad0b9 968 int known_align;
18ca7dab 969{
15fc0026
RK
970 /* If we're asking for zero bytes, it doesn't matter what we point
971 to since we can't derefference it. But return a reasonable
972 address anyway. */
973 if (size == const0_rtx)
974 return virtual_stack_dynamic_rtx;
975
976 /* Otherwise, show we're calling alloca or equivalent. */
977 current_function_calls_alloca = 1;
978
18ca7dab
RK
979 /* Ensure the size is in the proper mode. */
980 if (GET_MODE (size) != VOIDmode && GET_MODE (size) != Pmode)
981 size = convert_to_mode (Pmode, size, 1);
982
983 /* We will need to ensure that the address we return is aligned to
984 BIGGEST_ALIGNMENT. If STACK_DYNAMIC_OFFSET is defined, we don't
985 always know its final value at this point in the compilation (it
986 might depend on the size of the outgoing parameter lists, for
987 example), so we must align the value to be returned in that case.
988 (Note that STACK_DYNAMIC_OFFSET will have a default non-zero value if
989 STACK_POINTER_OFFSET or ACCUMULATE_OUTGOING_ARGS are defined).
990 We must also do an alignment operation on the returned value if
991 the stack pointer alignment is less strict that BIGGEST_ALIGNMENT.
992
993 If we have to align, we must leave space in SIZE for the hole
994 that might result from the alignment operation. */
995
515a7242
JW
996#if defined (STACK_DYNAMIC_OFFSET) || defined (STACK_POINTER_OFFSET) || defined (ALLOCATE_OUTGOING_ARGS) || ! defined (STACK_BOUNDARY)
997#define MUST_ALIGN 1
998#else
999#define MUST_ALIGN (STACK_BOUNDARY < BIGGEST_ALIGNMENT)
18ca7dab
RK
1000#endif
1001
515a7242 1002 if (MUST_ALIGN)
3b998c11
RK
1003 {
1004 if (GET_CODE (size) == CONST_INT)
b1ec3c92
CH
1005 size = GEN_INT (INTVAL (size)
1006 + (BIGGEST_ALIGNMENT / BITS_PER_UNIT - 1));
3b998c11
RK
1007 else
1008 size = expand_binop (Pmode, add_optab, size,
b1ec3c92
CH
1009 GEN_INT (BIGGEST_ALIGNMENT / BITS_PER_UNIT - 1),
1010 NULL_RTX, 1, OPTAB_LIB_WIDEN);
3b998c11 1011 }
1d9d04f8 1012
18ca7dab
RK
1013#ifdef SETJMP_VIA_SAVE_AREA
1014 /* If setjmp restores regs from a save area in the stack frame,
1015 avoid clobbering the reg save area. Note that the offset of
1016 virtual_incoming_args_rtx includes the preallocated stack args space.
1017 It would be no problem to clobber that, but it's on the wrong side
1018 of the old save area. */
1019 {
1020 rtx dynamic_offset
1021 = expand_binop (Pmode, sub_optab, virtual_stack_dynamic_rtx,
b1ec3c92 1022 stack_pointer_rtx, NULL_RTX, 1, OPTAB_LIB_WIDEN);
18ca7dab 1023 size = expand_binop (Pmode, add_optab, size, dynamic_offset,
b1ec3c92 1024 NULL_RTX, 1, OPTAB_LIB_WIDEN);
18ca7dab
RK
1025 }
1026#endif /* SETJMP_VIA_SAVE_AREA */
1027
1028 /* Round the size to a multiple of the required stack alignment.
1029 Since the stack if presumed to be rounded before this allocation,
1030 this will maintain the required alignment.
1031
1032 If the stack grows downward, we could save an insn by subtracting
1033 SIZE from the stack pointer and then aligning the stack pointer.
1034 The problem with this is that the stack pointer may be unaligned
1035 between the execution of the subtraction and alignment insns and
1036 some machines do not allow this. Even on those that do, some
1037 signal handlers malfunction if a signal should occur between those
1038 insns. Since this is an extremely rare event, we have no reliable
1039 way of knowing which systems have this problem. So we avoid even
1040 momentarily mis-aligning the stack. */
1041
89d825c9 1042#ifdef STACK_BOUNDARY
86b25e81
RS
1043 /* If we added a variable amount to SIZE,
1044 we can no longer assume it is aligned. */
515a7242 1045#if !defined (SETJMP_VIA_SAVE_AREA)
96ec484f 1046 if (MUST_ALIGN || known_align % STACK_BOUNDARY != 0)
34c9156a 1047#endif
091ad0b9 1048 size = round_push (size);
89d825c9 1049#endif
18ca7dab
RK
1050
1051 do_pending_stack_adjust ();
1052
091ad0b9
RK
1053 /* Don't use a TARGET that isn't a pseudo. */
1054 if (target == 0 || GET_CODE (target) != REG
1055 || REGNO (target) < FIRST_PSEUDO_REGISTER)
18ca7dab
RK
1056 target = gen_reg_rtx (Pmode);
1057
3ad69266
RS
1058 mark_reg_pointer (target);
1059
18ca7dab
RK
1060#ifndef STACK_GROWS_DOWNWARD
1061 emit_move_insn (target, virtual_stack_dynamic_rtx);
1062#endif
1063
1064 /* Perform the required allocation from the stack. Some systems do
1065 this differently than simply incrementing/decrementing from the
1066 stack pointer. */
1067#ifdef HAVE_allocate_stack
1068 if (HAVE_allocate_stack)
1069 {
1070 enum machine_mode mode
1071 = insn_operand_mode[(int) CODE_FOR_allocate_stack][0];
1072
ea534b63
RK
1073 size = convert_modes (mode, ptr_mode, size, 1);
1074
18ca7dab
RK
1075 if (insn_operand_predicate[(int) CODE_FOR_allocate_stack][0]
1076 && ! ((*insn_operand_predicate[(int) CODE_FOR_allocate_stack][0])
1077 (size, mode)))
1078 size = copy_to_mode_reg (mode, size);
1079
1080 emit_insn (gen_allocate_stack (size));
1081 }
1082 else
1083#endif
ea534b63
RK
1084 {
1085 size = convert_modes (Pmode, ptr_mode, size, 1);
1086 anti_adjust_stack (size);
1087 }
18ca7dab
RK
1088
1089#ifdef STACK_GROWS_DOWNWARD
1090 emit_move_insn (target, virtual_stack_dynamic_rtx);
1091#endif
1092
515a7242 1093 if (MUST_ALIGN)
091ad0b9 1094 {
5244db05
RK
1095 /* CEIL_DIV_EXPR needs to worry about the addition overflowing,
1096 but we know it can't. So add ourselves and then do TRUNC_DIV_EXPR. */
0f56a403 1097 target = expand_binop (Pmode, add_optab, target,
5244db05
RK
1098 GEN_INT (BIGGEST_ALIGNMENT / BITS_PER_UNIT - 1),
1099 NULL_RTX, 1, OPTAB_LIB_WIDEN);
1100 target = expand_divmod (0, TRUNC_DIV_EXPR, Pmode, target,
b1ec3c92
CH
1101 GEN_INT (BIGGEST_ALIGNMENT / BITS_PER_UNIT),
1102 NULL_RTX, 1);
091ad0b9 1103 target = expand_mult (Pmode, target,
b1ec3c92
CH
1104 GEN_INT (BIGGEST_ALIGNMENT / BITS_PER_UNIT),
1105 NULL_RTX, 1);
091ad0b9 1106 }
18ca7dab
RK
1107
1108 /* Some systems require a particular insn to refer to the stack
1109 to make the pages exist. */
1110#ifdef HAVE_probe
1111 if (HAVE_probe)
1112 emit_insn (gen_probe ());
1113#endif
1114
15fc0026
RK
1115 /* Record the new stack level for nonlocal gotos. */
1116 if (nonlocal_goto_handler_slot != 0)
1117 emit_stack_save (SAVE_NONLOCAL, &nonlocal_goto_stack_level, NULL_RTX);
1118
18ca7dab
RK
1119 return target;
1120}
1121\f
1122/* Return an rtx representing the register or memory location
1123 in which a scalar value of data type VALTYPE
1124 was returned by a function call to function FUNC.
1125 FUNC is a FUNCTION_DECL node if the precise function is known,
1126 otherwise 0. */
1127
1128rtx
1129hard_function_value (valtype, func)
1130 tree valtype;
1131 tree func;
1132{
e1a4071f
JL
1133 rtx val = FUNCTION_VALUE (valtype, func);
1134 if (GET_CODE (val) == REG
1135 && GET_MODE (val) == BLKmode)
1136 {
1137 int bytes = int_size_in_bytes (valtype);
1138 enum machine_mode tmpmode;
1139 for (tmpmode = GET_CLASS_NARROWEST_MODE (MODE_INT);
1140 tmpmode != MAX_MACHINE_MODE;
1141 tmpmode = GET_MODE_WIDER_MODE (tmpmode))
1142 {
1143 /* Have we found a large enough mode? */
1144 if (GET_MODE_SIZE (tmpmode) >= bytes)
1145 break;
1146 }
1147
1148 /* No suitable mode found. */
1149 if (tmpmode == MAX_MACHINE_MODE)
1150 abort ();
1151
1152 PUT_MODE (val, tmpmode);
1153 }
1154 return val;
18ca7dab
RK
1155}
1156
1157/* Return an rtx representing the register or memory location
1158 in which a scalar value of mode MODE was returned by a library call. */
1159
1160rtx
1161hard_libcall_value (mode)
1162 enum machine_mode mode;
1163{
1164 return LIBCALL_VALUE (mode);
1165}
0c5e217d
RS
1166
1167/* Look up the tree code for a given rtx code
1168 to provide the arithmetic operation for REAL_ARITHMETIC.
1169 The function returns an int because the caller may not know
1170 what `enum tree_code' means. */
1171
1172int
1173rtx_to_tree_code (code)
1174 enum rtx_code code;
1175{
1176 enum tree_code tcode;
1177
1178 switch (code)
1179 {
1180 case PLUS:
1181 tcode = PLUS_EXPR;
1182 break;
1183 case MINUS:
1184 tcode = MINUS_EXPR;
1185 break;
1186 case MULT:
1187 tcode = MULT_EXPR;
1188 break;
1189 case DIV:
1190 tcode = RDIV_EXPR;
1191 break;
1192 case SMIN:
1193 tcode = MIN_EXPR;
1194 break;
1195 case SMAX:
1196 tcode = MAX_EXPR;
1197 break;
1198 default:
1199 tcode = LAST_AND_UNUSED_TREE_CODE;
1200 break;
1201 }
1202 return ((int) tcode);
1203}