]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/emit-rtl.c
2003-02-27 Jerry Quinn <jlquinn@optonline.net>
[thirdparty/gcc.git] / gcc / emit-rtl.c
CommitLineData
15bbde2b 1/* Emit RTL for the GNU C-Compiler expander.
ddca3e9d 2 Copyright (C) 1987, 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
80fabb90 3 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
15bbde2b 4
f12b58b3 5This file is part of GCC.
15bbde2b 6
f12b58b3 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.
15bbde2b 11
f12b58b3 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.
15bbde2b 16
17You should have received a copy of the GNU General Public License
f12b58b3 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. */
15bbde2b 21
22
23/* Middle-to-low level generation of rtx code and insns.
24
25 This file contains the functions `gen_rtx', `gen_reg_rtx'
26 and `gen_label_rtx' that are the usual ways of creating rtl
27 expressions for most purposes.
28
29 It also has the functions for creating insns and linking
30 them in the doubly-linked chain.
31
32 The patterns of the insns are created by machine-dependent
33 routines in insn-emit.c, which is generated automatically from
34 the machine description. These routines use `gen_rtx' to make
35 the individual rtx's of the pattern; what is machine dependent
36 is the kind of rtx's they make and what arguments they use. */
37
38#include "config.h"
405711de 39#include "system.h"
805e22b2 40#include "coretypes.h"
41#include "tm.h"
d3b64f2d 42#include "toplev.h"
15bbde2b 43#include "rtl.h"
3fd7e17f 44#include "tree.h"
7953c610 45#include "tm_p.h"
15bbde2b 46#include "flags.h"
47#include "function.h"
48#include "expr.h"
49#include "regs.h"
c6b6c51f 50#include "hard-reg-set.h"
73f5c1e3 51#include "hashtab.h"
15bbde2b 52#include "insn-config.h"
0dbd1c74 53#include "recog.h"
15bbde2b 54#include "real.h"
a3426c4c 55#include "bitmap.h"
f3d96a58 56#include "basic-block.h"
a7b0c170 57#include "ggc.h"
b29760a8 58#include "debug.h"
b0278d39 59#include "langhooks.h"
649d8da6 60
399d45d3 61/* Commonly used modes. */
62
a92771b8 63enum machine_mode byte_mode; /* Mode whose width is BITS_PER_UNIT. */
64enum machine_mode word_mode; /* Mode whose width is BITS_PER_WORD. */
9e042f31 65enum machine_mode double_mode; /* Mode whose width is DOUBLE_TYPE_SIZE. */
a92771b8 66enum machine_mode ptr_mode; /* Mode whose width is POINTER_SIZE. */
399d45d3 67
15bbde2b 68
69/* This is *not* reset after each function. It gives each CODE_LABEL
70 in the entire compilation a unique label number. */
71
9105005a 72static GTY(()) int label_num = 1;
15bbde2b 73
15bbde2b 74/* Highest label number in current function.
75 Zero means use the value of label_num instead.
76 This is nonzero only when belatedly compiling an inline function. */
77
78static int last_label_num;
79
80/* Value label_num had when set_new_first_and_last_label_number was called.
81 If label_num has not changed since then, last_label_num is valid. */
82
83static int base_label_num;
84
85/* Nonzero means do not generate NOTEs for source line numbers. */
86
87static int no_line_numbers;
88
89/* Commonly used rtx's, so that we only need space for one copy.
90 These are initialized once for the entire compilation.
2ff23ed0 91 All of these are unique; no other rtx-object will be equal to any
92 of these. */
15bbde2b 93
57c097d5 94rtx global_rtl[GR_MAX];
15bbde2b 95
90295bd2 96/* Commonly used RTL for hard registers. These objects are not necessarily
97 unique, so we allocate them separately from global_rtl. They are
98 initialized once per compilation unit, then copied into regno_reg_rtx
99 at the beginning of each function. */
100static GTY(()) rtx static_regno_reg_rtx[FIRST_PSEUDO_REGISTER];
101
15bbde2b 102/* We record floating-point CONST_DOUBLEs in each floating-point mode for
103 the values of 0, 1, and 2. For the integer entries and VOIDmode, we
104 record a copy of const[012]_rtx. */
105
106rtx const_tiny_rtx[3][(int) MAX_MACHINE_MODE];
107
1a60f06a 108rtx const_true_rtx;
109
15bbde2b 110REAL_VALUE_TYPE dconst0;
111REAL_VALUE_TYPE dconst1;
112REAL_VALUE_TYPE dconst2;
113REAL_VALUE_TYPE dconstm1;
114
115/* All references to the following fixed hard registers go through
116 these unique rtl objects. On machines where the frame-pointer and
117 arg-pointer are the same register, they use the same unique object.
118
119 After register allocation, other rtl objects which used to be pseudo-regs
120 may be clobbered to refer to the frame-pointer register.
121 But references that were originally to the frame-pointer can be
122 distinguished from the others because they contain frame_pointer_rtx.
123
90c25824 124 When to use frame_pointer_rtx and hard_frame_pointer_rtx is a little
125 tricky: until register elimination has taken place hard_frame_pointer_rtx
d823ba47 126 should be used if it is being set, and frame_pointer_rtx otherwise. After
90c25824 127 register elimination hard_frame_pointer_rtx should always be used.
128 On machines where the two registers are same (most) then these are the
129 same.
130
15bbde2b 131 In an inline procedure, the stack and frame pointer rtxs may not be
132 used for anything else. */
15bbde2b 133rtx struct_value_rtx; /* (REG:Pmode STRUCT_VALUE_REGNUM) */
134rtx struct_value_incoming_rtx; /* (REG:Pmode STRUCT_VALUE_INCOMING_REGNUM) */
135rtx static_chain_rtx; /* (REG:Pmode STATIC_CHAIN_REGNUM) */
136rtx static_chain_incoming_rtx; /* (REG:Pmode STATIC_CHAIN_INCOMING_REGNUM) */
137rtx pic_offset_table_rtx; /* (REG:Pmode PIC_OFFSET_TABLE_REGNUM) */
138
4b0c5859 139/* This is used to implement __builtin_return_address for some machines.
140 See for instance the MIPS port. */
141rtx return_address_pointer_rtx; /* (REG:Pmode RETURN_ADDRESS_POINTER_REGNUM) */
142
15bbde2b 143/* We make one copy of (const_int C) where C is in
144 [- MAX_SAVED_CONST_INT, MAX_SAVED_CONST_INT]
145 to save space during the compilation and simplify comparisons of
146 integers. */
147
57c097d5 148rtx const_int_rtx[MAX_SAVED_CONST_INT * 2 + 1];
15bbde2b 149
73f5c1e3 150/* A hash table storing CONST_INTs whose absolute value is greater
151 than MAX_SAVED_CONST_INT. */
152
1f3233d1 153static GTY ((if_marked ("ggc_marked_p"), param_is (struct rtx_def)))
154 htab_t const_int_htab;
73f5c1e3 155
c6259b83 156/* A hash table storing memory attribute structures. */
1f3233d1 157static GTY ((if_marked ("ggc_marked_p"), param_is (struct mem_attrs)))
158 htab_t mem_attrs_htab;
c6259b83 159
ca74b940 160/* A hash table storing register attribute structures. */
161static GTY ((if_marked ("ggc_marked_p"), param_is (struct reg_attrs)))
162 htab_t reg_attrs_htab;
163
2ff23ed0 164/* A hash table storing all CONST_DOUBLEs. */
1f3233d1 165static GTY ((if_marked ("ggc_marked_p"), param_is (struct rtx_def)))
166 htab_t const_double_htab;
2ff23ed0 167
08513b52 168#define first_insn (cfun->emit->x_first_insn)
169#define last_insn (cfun->emit->x_last_insn)
170#define cur_insn_uid (cfun->emit->x_cur_insn_uid)
171#define last_linenum (cfun->emit->x_last_linenum)
172#define last_filename (cfun->emit->x_last_filename)
173#define first_label_num (cfun->emit->x_first_label_num)
15bbde2b 174
621f6678 175static rtx make_jump_insn_raw PARAMS ((rtx));
176static rtx make_call_insn_raw PARAMS ((rtx));
177static rtx find_line_note PARAMS ((rtx));
96216d37 178static rtx change_address_1 PARAMS ((rtx, enum machine_mode, rtx,
179 int));
2d96a59a 180static void unshare_all_rtl_1 PARAMS ((rtx));
72ec8878 181static void unshare_all_decls PARAMS ((tree));
01dc9f0c 182static void reset_used_decls PARAMS ((tree));
344dc2fa 183static void mark_label_nuses PARAMS ((rtx));
73f5c1e3 184static hashval_t const_int_htab_hash PARAMS ((const void *));
185static int const_int_htab_eq PARAMS ((const void *,
186 const void *));
2ff23ed0 187static hashval_t const_double_htab_hash PARAMS ((const void *));
188static int const_double_htab_eq PARAMS ((const void *,
189 const void *));
190static rtx lookup_const_double PARAMS ((rtx));
c6259b83 191static hashval_t mem_attrs_htab_hash PARAMS ((const void *));
192static int mem_attrs_htab_eq PARAMS ((const void *,
193 const void *));
c6259b83 194static mem_attrs *get_mem_attrs PARAMS ((HOST_WIDE_INT, tree, rtx,
5cc193e7 195 rtx, unsigned int,
196 enum machine_mode));
ca74b940 197static hashval_t reg_attrs_htab_hash PARAMS ((const void *));
198static int reg_attrs_htab_eq PARAMS ((const void *,
199 const void *));
200static reg_attrs *get_reg_attrs PARAMS ((tree, int));
b10dbbca 201static tree component_ref_for_mem_expr PARAMS ((tree));
89dd3424 202static rtx gen_const_vector_0 PARAMS ((enum machine_mode));
73f5c1e3 203
3cd757b1 204/* Probability of the conditional branch currently proceeded by try_split.
205 Set to -1 otherwise. */
206int split_branch_probability = -1;
649d8da6 207\f
73f5c1e3 208/* Returns a hash code for X (which is a really a CONST_INT). */
209
210static hashval_t
211const_int_htab_hash (x)
212 const void *x;
213{
2ff23ed0 214 return (hashval_t) INTVAL ((struct rtx_def *) x);
73f5c1e3 215}
216
6ef828f9 217/* Returns nonzero if the value represented by X (which is really a
73f5c1e3 218 CONST_INT) is the same as that given by Y (which is really a
219 HOST_WIDE_INT *). */
220
221static int
222const_int_htab_eq (x, y)
223 const void *x;
224 const void *y;
225{
2ff23ed0 226 return (INTVAL ((rtx) x) == *((const HOST_WIDE_INT *) y));
227}
228
229/* Returns a hash code for X (which is really a CONST_DOUBLE). */
230static hashval_t
231const_double_htab_hash (x)
232 const void *x;
233{
2ff23ed0 234 rtx value = (rtx) x;
3393215f 235 hashval_t h;
2ff23ed0 236
3393215f 237 if (GET_MODE (value) == VOIDmode)
238 h = CONST_DOUBLE_LOW (value) ^ CONST_DOUBLE_HIGH (value);
239 else
a5760913 240 {
241 h = real_hash (CONST_DOUBLE_REAL_VALUE (value));
242 /* MODE is used in the comparison, so it should be in the hash. */
243 h ^= GET_MODE (value);
244 }
2ff23ed0 245 return h;
246}
247
6ef828f9 248/* Returns nonzero if the value represented by X (really a ...)
2ff23ed0 249 is the same as that represented by Y (really a ...) */
250static int
251const_double_htab_eq (x, y)
252 const void *x;
253 const void *y;
254{
255 rtx a = (rtx)x, b = (rtx)y;
2ff23ed0 256
257 if (GET_MODE (a) != GET_MODE (b))
258 return 0;
f82a103d 259 if (GET_MODE (a) == VOIDmode)
260 return (CONST_DOUBLE_LOW (a) == CONST_DOUBLE_LOW (b)
261 && CONST_DOUBLE_HIGH (a) == CONST_DOUBLE_HIGH (b));
262 else
263 return real_identical (CONST_DOUBLE_REAL_VALUE (a),
264 CONST_DOUBLE_REAL_VALUE (b));
73f5c1e3 265}
266
c6259b83 267/* Returns a hash code for X (which is a really a mem_attrs *). */
268
269static hashval_t
270mem_attrs_htab_hash (x)
271 const void *x;
272{
273 mem_attrs *p = (mem_attrs *) x;
274
275 return (p->alias ^ (p->align * 1000)
276 ^ ((p->offset ? INTVAL (p->offset) : 0) * 50000)
277 ^ ((p->size ? INTVAL (p->size) : 0) * 2500000)
b10dbbca 278 ^ (size_t) p->expr);
c6259b83 279}
280
6ef828f9 281/* Returns nonzero if the value represented by X (which is really a
c6259b83 282 mem_attrs *) is the same as that given by Y (which is also really a
283 mem_attrs *). */
73f5c1e3 284
285static int
c6259b83 286mem_attrs_htab_eq (x, y)
287 const void *x;
288 const void *y;
73f5c1e3 289{
c6259b83 290 mem_attrs *p = (mem_attrs *) x;
291 mem_attrs *q = (mem_attrs *) y;
292
b10dbbca 293 return (p->alias == q->alias && p->expr == q->expr && p->offset == q->offset
c6259b83 294 && p->size == q->size && p->align == q->align);
73f5c1e3 295}
296
c6259b83 297/* Allocate a new mem_attrs structure and insert it into the hash table if
5cc193e7 298 one identical to it is not already in the table. We are doing this for
299 MEM of mode MODE. */
c6259b83 300
301static mem_attrs *
b10dbbca 302get_mem_attrs (alias, expr, offset, size, align, mode)
c6259b83 303 HOST_WIDE_INT alias;
b10dbbca 304 tree expr;
c6259b83 305 rtx offset;
306 rtx size;
307 unsigned int align;
5cc193e7 308 enum machine_mode mode;
c6259b83 309{
310 mem_attrs attrs;
311 void **slot;
312
5cc193e7 313 /* If everything is the default, we can just return zero. */
b10dbbca 314 if (alias == 0 && expr == 0 && offset == 0
5cc193e7 315 && (size == 0
316 || (mode != BLKmode && GET_MODE_SIZE (mode) == INTVAL (size)))
675ffff3 317 && (align == BITS_PER_UNIT
981336a3 318 || (STRICT_ALIGNMENT
319 && mode != BLKmode && align == GET_MODE_ALIGNMENT (mode))))
5cc193e7 320 return 0;
321
c6259b83 322 attrs.alias = alias;
b10dbbca 323 attrs.expr = expr;
c6259b83 324 attrs.offset = offset;
325 attrs.size = size;
326 attrs.align = align;
327
328 slot = htab_find_slot (mem_attrs_htab, &attrs, INSERT);
329 if (*slot == 0)
330 {
331 *slot = ggc_alloc (sizeof (mem_attrs));
332 memcpy (*slot, &attrs, sizeof (mem_attrs));
333 }
334
335 return *slot;
73f5c1e3 336}
337
ca74b940 338/* Returns a hash code for X (which is a really a reg_attrs *). */
339
340static hashval_t
341reg_attrs_htab_hash (x)
342 const void *x;
343{
344 reg_attrs *p = (reg_attrs *) x;
345
346 return ((p->offset * 1000) ^ (long) p->decl);
347}
348
349/* Returns non-zero if the value represented by X (which is really a
350 reg_attrs *) is the same as that given by Y (which is also really a
351 reg_attrs *). */
352
353static int
354reg_attrs_htab_eq (x, y)
355 const void *x;
356 const void *y;
357{
358 reg_attrs *p = (reg_attrs *) x;
359 reg_attrs *q = (reg_attrs *) y;
360
361 return (p->decl == q->decl && p->offset == q->offset);
362}
363/* Allocate a new reg_attrs structure and insert it into the hash table if
364 one identical to it is not already in the table. We are doing this for
365 MEM of mode MODE. */
366
367static reg_attrs *
368get_reg_attrs (decl, offset)
369 tree decl;
370 int offset;
371{
372 reg_attrs attrs;
373 void **slot;
374
375 /* If everything is the default, we can just return zero. */
376 if (decl == 0 && offset == 0)
377 return 0;
378
379 attrs.decl = decl;
380 attrs.offset = offset;
381
382 slot = htab_find_slot (reg_attrs_htab, &attrs, INSERT);
383 if (*slot == 0)
384 {
385 *slot = ggc_alloc (sizeof (reg_attrs));
386 memcpy (*slot, &attrs, sizeof (reg_attrs));
387 }
388
389 return *slot;
390}
391
22cf44bc 392/* Generate a new REG rtx. Make sure ORIGINAL_REGNO is set properly, and
393 don't attempt to share with the various global pieces of rtl (such as
394 frame_pointer_rtx). */
395
396rtx
397gen_raw_REG (mode, regno)
398 enum machine_mode mode;
399 int regno;
400{
401 rtx x = gen_rtx_raw_REG (mode, regno);
402 ORIGINAL_REGNO (x) = regno;
403 return x;
404}
405
7014838c 406/* There are some RTL codes that require special attention; the generation
407 functions do the raw handling. If you add to this list, modify
408 special_rtx in gengenrtl.c as well. */
409
3ad7bb1c 410rtx
411gen_rtx_CONST_INT (mode, arg)
73f5c1e3 412 enum machine_mode mode ATTRIBUTE_UNUSED;
3ad7bb1c 413 HOST_WIDE_INT arg;
414{
73f5c1e3 415 void **slot;
416
3ad7bb1c 417 if (arg >= - MAX_SAVED_CONST_INT && arg <= MAX_SAVED_CONST_INT)
57c097d5 418 return const_int_rtx[arg + MAX_SAVED_CONST_INT];
3ad7bb1c 419
420#if STORE_FLAG_VALUE != 1 && STORE_FLAG_VALUE != -1
421 if (const_true_rtx && arg == STORE_FLAG_VALUE)
422 return const_true_rtx;
423#endif
424
73f5c1e3 425 /* Look up the CONST_INT in the hash table. */
2b3dbc20 426 slot = htab_find_slot_with_hash (const_int_htab, &arg,
427 (hashval_t) arg, INSERT);
7f2875d3 428 if (*slot == 0)
d7c47c0e 429 *slot = gen_rtx_raw_CONST_INT (VOIDmode, arg);
73f5c1e3 430
431 return (rtx) *slot;
3ad7bb1c 432}
433
2d232d05 434rtx
435gen_int_mode (c, mode)
436 HOST_WIDE_INT c;
437 enum machine_mode mode;
438{
439 return GEN_INT (trunc_int_for_mode (c, mode));
440}
441
2ff23ed0 442/* CONST_DOUBLEs might be created from pairs of integers, or from
443 REAL_VALUE_TYPEs. Also, their length is known only at run time,
444 so we cannot use gen_rtx_raw_CONST_DOUBLE. */
445
446/* Determine whether REAL, a CONST_DOUBLE, already exists in the
447 hash table. If so, return its counterpart; otherwise add it
448 to the hash table and return it. */
449static rtx
450lookup_const_double (real)
451 rtx real;
452{
453 void **slot = htab_find_slot (const_double_htab, real, INSERT);
454 if (*slot == 0)
455 *slot = real;
456
457 return (rtx) *slot;
458}
7f2875d3 459
2ff23ed0 460/* Return a CONST_DOUBLE rtx for a floating-point value specified by
461 VALUE in mode MODE. */
67f2a2eb 462rtx
2ff23ed0 463const_double_from_real_value (value, mode)
464 REAL_VALUE_TYPE value;
67f2a2eb 465 enum machine_mode mode;
67f2a2eb 466{
2ff23ed0 467 rtx real = rtx_alloc (CONST_DOUBLE);
468 PUT_MODE (real, mode);
469
470 memcpy (&CONST_DOUBLE_LOW (real), &value, sizeof (REAL_VALUE_TYPE));
471
472 return lookup_const_double (real);
473}
474
475/* Return a CONST_DOUBLE or CONST_INT for a value specified as a pair
476 of ints: I0 is the low-order word and I1 is the high-order word.
477 Do not use this routine for non-integer modes; convert to
478 REAL_VALUE_TYPE and use CONST_DOUBLE_FROM_REAL_VALUE. */
479
480rtx
481immed_double_const (i0, i1, mode)
482 HOST_WIDE_INT i0, i1;
483 enum machine_mode mode;
484{
485 rtx value;
486 unsigned int i;
487
488 if (mode != VOIDmode)
489 {
490 int width;
491 if (GET_MODE_CLASS (mode) != MODE_INT
ead34f59 492 && GET_MODE_CLASS (mode) != MODE_PARTIAL_INT
493 /* We can get a 0 for an error mark. */
494 && GET_MODE_CLASS (mode) != MODE_VECTOR_INT
495 && GET_MODE_CLASS (mode) != MODE_VECTOR_FLOAT)
2ff23ed0 496 abort ();
497
498 /* We clear out all bits that don't belong in MODE, unless they and
499 our sign bit are all one. So we get either a reasonable negative
500 value or a reasonable unsigned value for this mode. */
501 width = GET_MODE_BITSIZE (mode);
502 if (width < HOST_BITS_PER_WIDE_INT
503 && ((i0 & ((HOST_WIDE_INT) (-1) << (width - 1)))
504 != ((HOST_WIDE_INT) (-1) << (width - 1))))
505 i0 &= ((HOST_WIDE_INT) 1 << width) - 1, i1 = 0;
506 else if (width == HOST_BITS_PER_WIDE_INT
507 && ! (i1 == ~0 && i0 < 0))
508 i1 = 0;
509 else if (width > 2 * HOST_BITS_PER_WIDE_INT)
510 /* We cannot represent this value as a constant. */
511 abort ();
512
513 /* If this would be an entire word for the target, but is not for
514 the host, then sign-extend on the host so that the number will
515 look the same way on the host that it would on the target.
516
517 For example, when building a 64 bit alpha hosted 32 bit sparc
518 targeted compiler, then we want the 32 bit unsigned value -1 to be
519 represented as a 64 bit value -1, and not as 0x00000000ffffffff.
520 The latter confuses the sparc backend. */
521
522 if (width < HOST_BITS_PER_WIDE_INT
523 && (i0 & ((HOST_WIDE_INT) 1 << (width - 1))))
524 i0 |= ((HOST_WIDE_INT) (-1) << width);
4e929432 525
2ff23ed0 526 /* If MODE fits within HOST_BITS_PER_WIDE_INT, always use a
527 CONST_INT.
4e929432 528
2ff23ed0 529 ??? Strictly speaking, this is wrong if we create a CONST_INT for
530 a large unsigned constant with the size of MODE being
531 HOST_BITS_PER_WIDE_INT and later try to interpret that constant
532 in a wider mode. In that case we will mis-interpret it as a
533 negative number.
4e929432 534
2ff23ed0 535 Unfortunately, the only alternative is to make a CONST_DOUBLE for
536 any constant in any mode if it is an unsigned constant larger
537 than the maximum signed integer in an int on the host. However,
538 doing this will break everyone that always expects to see a
539 CONST_INT for SImode and smaller.
540
541 We have always been making CONST_INTs in this case, so nothing
542 new is being broken. */
543
544 if (width <= HOST_BITS_PER_WIDE_INT)
545 i1 = (i0 < 0) ? ~(HOST_WIDE_INT) 0 : 0;
546 }
547
548 /* If this integer fits in one word, return a CONST_INT. */
549 if ((i1 == 0 && i0 >= 0) || (i1 == ~0 && i0 < 0))
550 return GEN_INT (i0);
551
552 /* We use VOIDmode for integers. */
553 value = rtx_alloc (CONST_DOUBLE);
554 PUT_MODE (value, VOIDmode);
555
556 CONST_DOUBLE_LOW (value) = i0;
557 CONST_DOUBLE_HIGH (value) = i1;
558
559 for (i = 2; i < (sizeof CONST_DOUBLE_FORMAT - 1); i++)
560 XWINT (value, i) = 0;
561
562 return lookup_const_double (value);
67f2a2eb 563}
564
3ad7bb1c 565rtx
566gen_rtx_REG (mode, regno)
567 enum machine_mode mode;
2ff23ed0 568 unsigned int regno;
3ad7bb1c 569{
570 /* In case the MD file explicitly references the frame pointer, have
571 all such references point to the same frame pointer. This is
572 used during frame pointer elimination to distinguish the explicit
573 references to these registers from pseudos that happened to be
574 assigned to them.
575
576 If we have eliminated the frame pointer or arg pointer, we will
577 be using it as a normal register, for example as a spill
578 register. In such cases, we might be accessing it in a mode that
579 is not Pmode and therefore cannot use the pre-allocated rtx.
580
581 Also don't do this when we are making new REGs in reload, since
582 we don't want to get confused with the real pointers. */
583
584 if (mode == Pmode && !reload_in_progress)
585 {
71801afc 586 if (regno == FRAME_POINTER_REGNUM
587 && (!reload_completed || frame_pointer_needed))
3ad7bb1c 588 return frame_pointer_rtx;
589#if FRAME_POINTER_REGNUM != HARD_FRAME_POINTER_REGNUM
71801afc 590 if (regno == HARD_FRAME_POINTER_REGNUM
591 && (!reload_completed || frame_pointer_needed))
3ad7bb1c 592 return hard_frame_pointer_rtx;
593#endif
594#if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM && HARD_FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM
e8b59353 595 if (regno == ARG_POINTER_REGNUM)
3ad7bb1c 596 return arg_pointer_rtx;
597#endif
598#ifdef RETURN_ADDRESS_POINTER_REGNUM
e8b59353 599 if (regno == RETURN_ADDRESS_POINTER_REGNUM)
3ad7bb1c 600 return return_address_pointer_rtx;
601#endif
3473aefe 602 if (regno == (unsigned) PIC_OFFSET_TABLE_REGNUM
6ea47475 603 && fixed_regs[PIC_OFFSET_TABLE_REGNUM])
d4c5e26d 604 return pic_offset_table_rtx;
e8b59353 605 if (regno == STACK_POINTER_REGNUM)
3ad7bb1c 606 return stack_pointer_rtx;
607 }
608
32b53d83 609#if 0
90295bd2 610 /* If the per-function register table has been set up, try to re-use
32b53d83 611 an existing entry in that table to avoid useless generation of RTL.
612
613 This code is disabled for now until we can fix the various backends
614 which depend on having non-shared hard registers in some cases. Long
615 term we want to re-enable this code as it can significantly cut down
71801afc 616 on the amount of useless RTL that gets generated.
617
618 We'll also need to fix some code that runs after reload that wants to
619 set ORIGINAL_REGNO. */
620
90295bd2 621 if (cfun
622 && cfun->emit
623 && regno_reg_rtx
624 && regno < FIRST_PSEUDO_REGISTER
625 && reg_raw_mode[regno] == mode)
626 return regno_reg_rtx[regno];
32b53d83 627#endif
90295bd2 628
22cf44bc 629 return gen_raw_REG (mode, regno);
3ad7bb1c 630}
631
b5ba9f3a 632rtx
633gen_rtx_MEM (mode, addr)
634 enum machine_mode mode;
635 rtx addr;
636{
637 rtx rt = gen_rtx_raw_MEM (mode, addr);
638
639 /* This field is not cleared by the mere allocation of the rtx, so
640 we clear it here. */
c6259b83 641 MEM_ATTRS (rt) = 0;
b5ba9f3a 642
643 return rt;
644}
701e46d0 645
646rtx
647gen_rtx_SUBREG (mode, reg, offset)
648 enum machine_mode mode;
649 rtx reg;
650 int offset;
651{
652 /* This is the most common failure type.
653 Catch it early so we can see who does it. */
654 if ((offset % GET_MODE_SIZE (mode)) != 0)
655 abort ();
656
657 /* This check isn't usable right now because combine will
658 throw arbitrary crap like a CALL into a SUBREG in
659 gen_lowpart_for_combine so we must just eat it. */
660#if 0
661 /* Check for this too. */
662 if (offset >= GET_MODE_SIZE (GET_MODE (reg)))
663 abort ();
664#endif
2ff23ed0 665 return gen_rtx_raw_SUBREG (mode, reg, offset);
701e46d0 666}
667
c6259b83 668/* Generate a SUBREG representing the least-significant part of REG if MODE
669 is smaller than mode of REG, otherwise paradoxical SUBREG. */
670
701e46d0 671rtx
672gen_lowpart_SUBREG (mode, reg)
673 enum machine_mode mode;
674 rtx reg;
675{
676 enum machine_mode inmode;
701e46d0 677
678 inmode = GET_MODE (reg);
679 if (inmode == VOIDmode)
680 inmode = mode;
81802af6 681 return gen_rtx_SUBREG (mode, reg,
682 subreg_lowpart_offset (mode, inmode));
701e46d0 683}
7014838c 684\f
15bbde2b 685/* rtx gen_rtx (code, mode, [element1, ..., elementn])
686**
687** This routine generates an RTX of the size specified by
688** <code>, which is an RTX code. The RTX structure is initialized
689** from the arguments <element1> through <elementn>, which are
690** interpreted according to the specific RTX type's format. The
691** special machine mode associated with the rtx (if any) is specified
692** in <mode>.
693**
fc92fa61 694** gen_rtx can be invoked in a way which resembles the lisp-like
15bbde2b 695** rtx it will generate. For example, the following rtx structure:
696**
697** (plus:QI (mem:QI (reg:SI 1))
698** (mem:QI (plusw:SI (reg:SI 2) (reg:SI 3))))
699**
700** ...would be generated by the following C code:
701**
d823ba47 702** gen_rtx (PLUS, QImode,
15bbde2b 703** gen_rtx (MEM, QImode,
704** gen_rtx (REG, SImode, 1)),
705** gen_rtx (MEM, QImode,
706** gen_rtx (PLUS, SImode,
707** gen_rtx (REG, SImode, 2),
708** gen_rtx (REG, SImode, 3)))),
709*/
710
711/*VARARGS2*/
712rtx
621f6678 713gen_rtx VPARAMS ((enum rtx_code code, enum machine_mode mode, ...))
15bbde2b 714{
19cb6b50 715 int i; /* Array indices... */
716 const char *fmt; /* Current rtx's format... */
717 rtx rt_val; /* RTX to return to caller... */
15bbde2b 718
0903457a 719 VA_OPEN (p, mode);
720 VA_FIXEDARG (p, enum rtx_code, code);
721 VA_FIXEDARG (p, enum machine_mode, mode);
15bbde2b 722
67f2a2eb 723 switch (code)
15bbde2b 724 {
67f2a2eb 725 case CONST_INT:
726 rt_val = gen_rtx_CONST_INT (mode, va_arg (p, HOST_WIDE_INT));
727 break;
728
729 case CONST_DOUBLE:
730 {
ebde4c17 731 HOST_WIDE_INT arg0 = va_arg (p, HOST_WIDE_INT);
67f2a2eb 732 HOST_WIDE_INT arg1 = va_arg (p, HOST_WIDE_INT);
ebde4c17 733
ff385626 734 rt_val = immed_double_const (arg0, arg1, mode);
67f2a2eb 735 }
736 break;
737
738 case REG:
739 rt_val = gen_rtx_REG (mode, va_arg (p, int));
740 break;
741
742 case MEM:
743 rt_val = gen_rtx_MEM (mode, va_arg (p, rtx));
744 break;
745
746 default:
15bbde2b 747 rt_val = rtx_alloc (code); /* Allocate the storage space. */
748 rt_val->mode = mode; /* Store the machine mode... */
749
750 fmt = GET_RTX_FORMAT (code); /* Find the right format... */
751 for (i = 0; i < GET_RTX_LENGTH (code); i++)
752 {
753 switch (*fmt++)
754 {
755 case '0': /* Unused field. */
756 break;
757
758 case 'i': /* An integer? */
759 XINT (rt_val, i) = va_arg (p, int);
760 break;
761
b572011e 762 case 'w': /* A wide integer? */
763 XWINT (rt_val, i) = va_arg (p, HOST_WIDE_INT);
764 break;
765
15bbde2b 766 case 's': /* A string? */
767 XSTR (rt_val, i) = va_arg (p, char *);
768 break;
769
770 case 'e': /* An expression? */
771 case 'u': /* An insn? Same except when printing. */
772 XEXP (rt_val, i) = va_arg (p, rtx);
773 break;
774
775 case 'E': /* An RTX vector? */
776 XVEC (rt_val, i) = va_arg (p, rtvec);
777 break;
778
a3426c4c 779 case 'b': /* A bitmap? */
780 XBITMAP (rt_val, i) = va_arg (p, bitmap);
781 break;
782
783 case 't': /* A tree? */
784 XTREE (rt_val, i) = va_arg (p, tree);
785 break;
786
15bbde2b 787 default:
fc92fa61 788 abort ();
15bbde2b 789 }
790 }
67f2a2eb 791 break;
15bbde2b 792 }
67f2a2eb 793
0903457a 794 VA_CLOSE (p);
67f2a2eb 795 return rt_val;
15bbde2b 796}
797
798/* gen_rtvec (n, [rt1, ..., rtn])
799**
800** This routine creates an rtvec and stores within it the
801** pointers to rtx's which are its arguments.
802*/
803
804/*VARARGS1*/
805rtvec
621f6678 806gen_rtvec VPARAMS ((int n, ...))
15bbde2b 807{
7ad77798 808 int i, save_n;
15bbde2b 809 rtx *vector;
810
0903457a 811 VA_OPEN (p, n);
812 VA_FIXEDARG (p, int, n);
15bbde2b 813
814 if (n == 0)
815 return NULL_RTVEC; /* Don't allocate an empty rtvec... */
816
817 vector = (rtx *) alloca (n * sizeof (rtx));
e5fcd76a 818
15bbde2b 819 for (i = 0; i < n; i++)
820 vector[i] = va_arg (p, rtx);
7ad77798 821
822 /* The definition of VA_* in K&R C causes `n' to go out of scope. */
823 save_n = n;
0903457a 824 VA_CLOSE (p);
15bbde2b 825
7ad77798 826 return gen_rtvec_v (save_n, vector);
15bbde2b 827}
828
829rtvec
830gen_rtvec_v (n, argp)
831 int n;
832 rtx *argp;
833{
19cb6b50 834 int i;
835 rtvec rt_val;
15bbde2b 836
837 if (n == 0)
838 return NULL_RTVEC; /* Don't allocate an empty rtvec... */
839
840 rt_val = rtvec_alloc (n); /* Allocate an rtvec... */
841
842 for (i = 0; i < n; i++)
a4070a91 843 rt_val->elem[i] = *argp++;
15bbde2b 844
845 return rt_val;
846}
847\f
848/* Generate a REG rtx for a new pseudo register of mode MODE.
849 This pseudo is assigned the next sequential register number. */
850
851rtx
852gen_reg_rtx (mode)
853 enum machine_mode mode;
854{
08513b52 855 struct function *f = cfun;
19cb6b50 856 rtx val;
15bbde2b 857
9e519b97 858 /* Don't let anything called after initial flow analysis create new
859 registers. */
860 if (no_new_pseudos)
15bbde2b 861 abort ();
862
316bc009 863 if (generating_concat_p
864 && (GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT
865 || GET_MODE_CLASS (mode) == MODE_COMPLEX_INT))
76c37538 866 {
867 /* For complex modes, don't make a single pseudo.
868 Instead, make a CONCAT of two pseudos.
869 This allows noncontiguous allocation of the real and imaginary parts,
870 which makes much better code. Besides, allocating DCmode
871 pseudos overstrains reload on some machines like the 386. */
872 rtx realpart, imagpart;
e9e12845 873 enum machine_mode partmode = GET_MODE_INNER (mode);
76c37538 874
875 realpart = gen_reg_rtx (partmode);
876 imagpart = gen_reg_rtx (partmode);
3ad7bb1c 877 return gen_rtx_CONCAT (mode, realpart, imagpart);
76c37538 878 }
879
ca74b940 880 /* Make sure regno_pointer_align, and regno_reg_rtx are large
fcdc122e 881 enough to have an element for this pseudo reg number. */
15bbde2b 882
e61a0a7f 883 if (reg_rtx_no == f->emit->regno_pointer_align_length)
15bbde2b 884 {
e61a0a7f 885 int old_size = f->emit->regno_pointer_align_length;
26df1c5e 886 char *new;
fcdc122e 887 rtx *new1;
fcdc122e 888
1f3233d1 889 new = ggc_realloc (f->emit->regno_pointer_align, old_size * 2);
0a893c29 890 memset (new + old_size, 0, old_size);
4491f79f 891 f->emit->regno_pointer_align = (unsigned char *) new;
0a893c29 892
1f3233d1 893 new1 = (rtx *) ggc_realloc (f->emit->x_regno_reg_rtx,
894 old_size * 2 * sizeof (rtx));
0a893c29 895 memset (new1 + old_size, 0, old_size * sizeof (rtx));
15bbde2b 896 regno_reg_rtx = new1;
897
e61a0a7f 898 f->emit->regno_pointer_align_length = old_size * 2;
15bbde2b 899 }
900
22cf44bc 901 val = gen_raw_REG (mode, reg_rtx_no);
15bbde2b 902 regno_reg_rtx[reg_rtx_no++] = val;
903 return val;
904}
905
ca74b940 906/* Generate an register with same attributes as REG,
907 but offsetted by OFFSET. */
908
909rtx
910gen_rtx_REG_offset (reg, mode, regno, offset)
911 enum machine_mode mode;
912 unsigned int regno;
913 int offset;
914 rtx reg;
915{
916 rtx new = gen_rtx_REG (mode, regno);
917 REG_ATTRS (new) = get_reg_attrs (REG_EXPR (reg),
918 REG_OFFSET (reg) + offset);
919 return new;
920}
921
922/* Set the decl for MEM to DECL. */
923
924void
925set_reg_attrs_from_mem (reg, mem)
926 rtx reg;
927 rtx mem;
928{
929 if (MEM_OFFSET (mem) && GET_CODE (MEM_OFFSET (mem)) == CONST_INT)
930 REG_ATTRS (reg)
931 = get_reg_attrs (MEM_EXPR (mem), INTVAL (MEM_OFFSET (mem)));
932}
933
934/* Assign the RTX X to declaration T. */
935void
936set_decl_rtl (t, x)
937 tree t;
938 rtx x;
939{
940 DECL_CHECK (t)->decl.rtl = x;
941
942 if (!x)
943 return;
944 /* For register, we maitain the reverse information too. */
945 if (GET_CODE (x) == REG)
946 REG_ATTRS (x) = get_reg_attrs (t, 0);
947 else if (GET_CODE (x) == SUBREG)
948 REG_ATTRS (SUBREG_REG (x))
949 = get_reg_attrs (t, -SUBREG_BYTE (x));
950 if (GET_CODE (x) == CONCAT)
951 {
952 if (REG_P (XEXP (x, 0)))
953 REG_ATTRS (XEXP (x, 0)) = get_reg_attrs (t, 0);
954 if (REG_P (XEXP (x, 1)))
955 REG_ATTRS (XEXP (x, 1))
956 = get_reg_attrs (t, GET_MODE_UNIT_SIZE (GET_MODE (XEXP (x, 0))));
957 }
958 if (GET_CODE (x) == PARALLEL)
959 {
960 int i;
961 for (i = 0; i < XVECLEN (x, 0); i++)
962 {
963 rtx y = XVECEXP (x, 0, i);
964 if (REG_P (XEXP (y, 0)))
965 REG_ATTRS (XEXP (y, 0)) = get_reg_attrs (t, INTVAL (XEXP (y, 1)));
966 }
967 }
968}
969
de8ecfb5 970/* Identify REG (which may be a CONCAT) as a user register. */
971
972void
973mark_user_reg (reg)
974 rtx reg;
975{
976 if (GET_CODE (reg) == CONCAT)
977 {
978 REG_USERVAR_P (XEXP (reg, 0)) = 1;
979 REG_USERVAR_P (XEXP (reg, 1)) = 1;
980 }
981 else if (GET_CODE (reg) == REG)
982 REG_USERVAR_P (reg) = 1;
983 else
984 abort ();
985}
986
d4c332ff 987/* Identify REG as a probable pointer register and show its alignment
988 as ALIGN, if nonzero. */
15bbde2b 989
990void
d4c332ff 991mark_reg_pointer (reg, align)
15bbde2b 992 rtx reg;
d4c332ff 993 int align;
15bbde2b 994{
e61a0a7f 995 if (! REG_POINTER (reg))
612409a6 996 {
e61a0a7f 997 REG_POINTER (reg) = 1;
d4c332ff 998
612409a6 999 if (align)
1000 REGNO_POINTER_ALIGN (REGNO (reg)) = align;
1001 }
1002 else if (align && align < REGNO_POINTER_ALIGN (REGNO (reg)))
1003 /* We can no-longer be sure just how aligned this pointer is */
d4c332ff 1004 REGNO_POINTER_ALIGN (REGNO (reg)) = align;
15bbde2b 1005}
1006
1007/* Return 1 plus largest pseudo reg number used in the current function. */
1008
1009int
1010max_reg_num ()
1011{
1012 return reg_rtx_no;
1013}
1014
1015/* Return 1 + the largest label number used so far in the current function. */
1016
1017int
1018max_label_num ()
1019{
1020 if (last_label_num && label_num == base_label_num)
1021 return last_label_num;
1022 return label_num;
1023}
1024
1025/* Return first label number used in this function (if any were used). */
1026
1027int
1028get_first_label_num ()
1029{
1030 return first_label_num;
1031}
1032\f
701e46d0 1033/* Return the final regno of X, which is a SUBREG of a hard
1034 register. */
1035int
1036subreg_hard_regno (x, check_mode)
19cb6b50 1037 rtx x;
701e46d0 1038 int check_mode;
1039{
1040 enum machine_mode mode = GET_MODE (x);
1041 unsigned int byte_offset, base_regno, final_regno;
1042 rtx reg = SUBREG_REG (x);
1043
1044 /* This is where we attempt to catch illegal subregs
1045 created by the compiler. */
1046 if (GET_CODE (x) != SUBREG
1047 || GET_CODE (reg) != REG)
1048 abort ();
1049 base_regno = REGNO (reg);
1050 if (base_regno >= FIRST_PSEUDO_REGISTER)
1051 abort ();
475fa9bd 1052 if (check_mode && ! HARD_REGNO_MODE_OK (base_regno, GET_MODE (reg)))
701e46d0 1053 abort ();
1054
1055 /* Catch non-congruent offsets too. */
1056 byte_offset = SUBREG_BYTE (x);
1057 if ((byte_offset % GET_MODE_SIZE (mode)) != 0)
1058 abort ();
1059
1060 final_regno = subreg_regno (x);
1061
1062 return final_regno;
1063}
1064
15bbde2b 1065/* Return a value representing some low-order bits of X, where the number
1066 of low-order bits is given by MODE. Note that no conversion is done
d823ba47 1067 between floating-point and fixed-point values, rather, the bit
15bbde2b 1068 representation is returned.
1069
1070 This function handles the cases in common between gen_lowpart, below,
1071 and two variants in cse.c and combine.c. These are the cases that can
1072 be safely handled at all points in the compilation.
1073
1074 If this is not a case we can handle, return 0. */
1075
1076rtx
1077gen_lowpart_common (mode, x)
1078 enum machine_mode mode;
19cb6b50 1079 rtx x;
15bbde2b 1080{
701e46d0 1081 int msize = GET_MODE_SIZE (mode);
1082 int xsize = GET_MODE_SIZE (GET_MODE (x));
1083 int offset = 0;
15bbde2b 1084
1085 if (GET_MODE (x) == mode)
1086 return x;
1087
1088 /* MODE must occupy no more words than the mode of X. */
1089 if (GET_MODE (x) != VOIDmode
701e46d0 1090 && ((msize + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD
1091 > ((xsize + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD)))
15bbde2b 1092 return 0;
1093
9abe1e73 1094 /* Don't allow generating paradoxical FLOAT_MODE subregs. */
1095 if (GET_MODE_CLASS (mode) == MODE_FLOAT
1096 && GET_MODE (x) != VOIDmode && msize > xsize)
1097 return 0;
1098
81802af6 1099 offset = subreg_lowpart_offset (mode, GET_MODE (x));
15bbde2b 1100
1101 if ((GET_CODE (x) == ZERO_EXTEND || GET_CODE (x) == SIGN_EXTEND)
64115b39 1102 && (GET_MODE_CLASS (mode) == MODE_INT
1103 || GET_MODE_CLASS (mode) == MODE_PARTIAL_INT))
15bbde2b 1104 {
1105 /* If we are getting the low-order part of something that has been
1106 sign- or zero-extended, we can either just use the object being
1107 extended or make a narrower extension. If we want an even smaller
1108 piece than the size of the object being extended, call ourselves
1109 recursively.
1110
1111 This case is used mostly by combine and cse. */
1112
1113 if (GET_MODE (XEXP (x, 0)) == mode)
1114 return XEXP (x, 0);
1115 else if (GET_MODE_SIZE (mode) < GET_MODE_SIZE (GET_MODE (XEXP (x, 0))))
1116 return gen_lowpart_common (mode, XEXP (x, 0));
1117 else if (GET_MODE_SIZE (mode) < GET_MODE_SIZE (GET_MODE (x)))
3ad7bb1c 1118 return gen_rtx_fmt_e (GET_CODE (x), mode, XEXP (x, 0));
15bbde2b 1119 }
3c27c2b2 1120 else if (GET_CODE (x) == SUBREG || GET_CODE (x) == REG
20407c42 1121 || GET_CODE (x) == CONCAT || GET_CODE (x) == CONST_VECTOR)
81802af6 1122 return simplify_gen_subreg (mode, x, GET_MODE (x), offset);
752291c1 1123 else if ((GET_MODE_CLASS (mode) == MODE_VECTOR_INT
1124 || GET_MODE_CLASS (mode) == MODE_VECTOR_FLOAT)
1125 && GET_MODE (x) == VOIDmode)
1126 return simplify_gen_subreg (mode, x, int_mode_for_mode (mode), offset);
15bbde2b 1127 /* If X is a CONST_INT or a CONST_DOUBLE, extract the appropriate bits
1128 from the low-order part of the constant. */
64115b39 1129 else if ((GET_MODE_CLASS (mode) == MODE_INT
1130 || GET_MODE_CLASS (mode) == MODE_PARTIAL_INT)
1131 && GET_MODE (x) == VOIDmode
15bbde2b 1132 && (GET_CODE (x) == CONST_INT || GET_CODE (x) == CONST_DOUBLE))
99e0010b 1133 {
1134 /* If MODE is twice the host word size, X is already the desired
1135 representation. Otherwise, if MODE is wider than a word, we can't
b3b27b2a 1136 do this. If MODE is exactly a word, return just one CONST_INT. */
99e0010b 1137
d347deeb 1138 if (GET_MODE_BITSIZE (mode) >= 2 * HOST_BITS_PER_WIDE_INT)
99e0010b 1139 return x;
b572011e 1140 else if (GET_MODE_BITSIZE (mode) > HOST_BITS_PER_WIDE_INT)
99e0010b 1141 return 0;
b572011e 1142 else if (GET_MODE_BITSIZE (mode) == HOST_BITS_PER_WIDE_INT)
99e0010b 1143 return (GET_CODE (x) == CONST_INT ? x
b572011e 1144 : GEN_INT (CONST_DOUBLE_LOW (x)));
99e0010b 1145 else
1146 {
a0d52dee 1147 /* MODE must be narrower than HOST_BITS_PER_WIDE_INT. */
b572011e 1148 HOST_WIDE_INT val = (GET_CODE (x) == CONST_INT ? INTVAL (x)
1149 : CONST_DOUBLE_LOW (x));
99e0010b 1150
a0d52dee 1151 /* Sign extend to HOST_WIDE_INT. */
b3b27b2a 1152 val = trunc_int_for_mode (val, mode);
99e0010b 1153
1154 return (GET_CODE (x) == CONST_INT && INTVAL (x) == val ? x
b572011e 1155 : GEN_INT (val));
99e0010b 1156 }
1157 }
15bbde2b 1158
4268f174 1159 /* The floating-point emulator can handle all conversions between
c8971cad 1160 FP and integer operands. This simplifies reload because it
1161 doesn't have to deal with constructs like (subreg:DI
1162 (const_double:SF ...)) or (subreg:DF (const_int ...)). */
7547817f 1163 /* Single-precision floats are always 32-bits and double-precision
1164 floats are always 64-bits. */
c8971cad 1165
3c27c2b2 1166 else if (GET_MODE_CLASS (mode) == MODE_FLOAT
7547817f 1167 && GET_MODE_BITSIZE (mode) == 32
c8971cad 1168 && GET_CODE (x) == CONST_INT)
d4c5e26d 1169 {
c8971cad 1170 REAL_VALUE_TYPE r;
aa870c1b 1171 long i = INTVAL (x);
c8971cad 1172
aa870c1b 1173 real_from_target (&r, &i, mode);
c8971cad 1174 return CONST_DOUBLE_FROM_REAL_VALUE (r, mode);
d4c5e26d 1175 }
3c27c2b2 1176 else if (GET_MODE_CLASS (mode) == MODE_FLOAT
7547817f 1177 && GET_MODE_BITSIZE (mode) == 64
c8971cad 1178 && (GET_CODE (x) == CONST_INT || GET_CODE (x) == CONST_DOUBLE)
1179 && GET_MODE (x) == VOIDmode)
1180 {
1181 REAL_VALUE_TYPE r;
c8971cad 1182 HOST_WIDE_INT low, high;
aa870c1b 1183 long i[2];
c8971cad 1184
1185 if (GET_CODE (x) == CONST_INT)
1186 {
1187 low = INTVAL (x);
1188 high = low >> (HOST_BITS_PER_WIDE_INT - 1);
1189 }
1190 else
1191 {
d823ba47 1192 low = CONST_DOUBLE_LOW (x);
c8971cad 1193 high = CONST_DOUBLE_HIGH (x);
1194 }
1195
aa870c1b 1196 if (HOST_BITS_PER_WIDE_INT > 32)
1197 high = low >> 31 >> 1;
1198
c8971cad 1199 /* REAL_VALUE_TARGET_DOUBLE takes the addressing order of the
1200 target machine. */
1201 if (WORDS_BIG_ENDIAN)
1202 i[0] = high, i[1] = low;
1203 else
1204 i[0] = low, i[1] = high;
1205
aa870c1b 1206 real_from_target (&r, i, mode);
c8971cad 1207 return CONST_DOUBLE_FROM_REAL_VALUE (r, mode);
1208 }
1209 else if ((GET_MODE_CLASS (mode) == MODE_INT
1210 || GET_MODE_CLASS (mode) == MODE_PARTIAL_INT)
1211 && GET_CODE (x) == CONST_DOUBLE
1212 && GET_MODE_CLASS (GET_MODE (x)) == MODE_FLOAT)
1213 {
1214 REAL_VALUE_TYPE r;
1215 long i[4]; /* Only the low 32 bits of each 'long' are used. */
1216 int endian = WORDS_BIG_ENDIAN ? 1 : 0;
1217
db6bf7a6 1218 /* Convert 'r' into an array of four 32-bit words in target word
1219 order. */
c8971cad 1220 REAL_VALUE_FROM_CONST_DOUBLE (r, x);
7547817f 1221 switch (GET_MODE_BITSIZE (GET_MODE (x)))
c8971cad 1222 {
7547817f 1223 case 32:
d4c5e26d 1224 REAL_VALUE_TO_TARGET_SINGLE (r, i[3 * endian]);
db6bf7a6 1225 i[1] = 0;
1226 i[2] = 0;
d4c5e26d 1227 i[3 - 3 * endian] = 0;
1228 break;
7547817f 1229 case 64:
d4c5e26d 1230 REAL_VALUE_TO_TARGET_DOUBLE (r, i + 2 * endian);
db6bf7a6 1231 i[2 - 2 * endian] = 0;
1232 i[3 - 2 * endian] = 0;
d4c5e26d 1233 break;
7547817f 1234 case 96:
3f980cf7 1235 REAL_VALUE_TO_TARGET_LONG_DOUBLE (r, i + endian);
db6bf7a6 1236 i[3 - 3 * endian] = 0;
3c27c2b2 1237 break;
7547817f 1238 case 128:
c8971cad 1239 REAL_VALUE_TO_TARGET_LONG_DOUBLE (r, i);
1240 break;
1241 default:
a774762c 1242 abort ();
c8971cad 1243 }
c8971cad 1244 /* Now, pack the 32-bit elements of the array into a CONST_DOUBLE
1245 and return it. */
1246#if HOST_BITS_PER_WIDE_INT == 32
db6bf7a6 1247 return immed_double_const (i[3 * endian], i[1 + endian], mode);
c8971cad 1248#else
db6bf7a6 1249 if (HOST_BITS_PER_WIDE_INT != 64)
1250 abort ();
83e32a86 1251
23f63ace 1252 return immed_double_const ((((unsigned long) i[3 * endian])
1253 | ((HOST_WIDE_INT) i[1 + endian] << 32)),
1254 (((unsigned long) i[2 - endian])
1255 | ((HOST_WIDE_INT) i[3 - 3 * endian] << 32)),
db6bf7a6 1256 mode);
c8971cad 1257#endif
1258 }
4a307dd5 1259
15bbde2b 1260 /* Otherwise, we can't do this. */
1261 return 0;
1262}
1263\f
568f439b 1264/* Return the real part (which has mode MODE) of a complex value X.
1265 This always comes at the low address in memory. */
1266
1267rtx
1268gen_realpart (mode, x)
1269 enum machine_mode mode;
19cb6b50 1270 rtx x;
568f439b 1271{
81802af6 1272 if (WORDS_BIG_ENDIAN
1273 && GET_MODE_BITSIZE (mode) < BITS_PER_WORD
1274 && REG_P (x)
1275 && REGNO (x) < FIRST_PSEUDO_REGISTER)
f060a027 1276 internal_error
68435912 1277 ("can't access real part of complex value in hard register");
0864dc1b 1278 else if (WORDS_BIG_ENDIAN)
568f439b 1279 return gen_highpart (mode, x);
1280 else
1281 return gen_lowpart (mode, x);
1282}
1283
1284/* Return the imaginary part (which has mode MODE) of a complex value X.
1285 This always comes at the high address in memory. */
1286
1287rtx
1288gen_imagpart (mode, x)
1289 enum machine_mode mode;
19cb6b50 1290 rtx x;
568f439b 1291{
81802af6 1292 if (WORDS_BIG_ENDIAN)
568f439b 1293 return gen_lowpart (mode, x);
701e46d0 1294 else if (! WORDS_BIG_ENDIAN
ea9a92b6 1295 && GET_MODE_BITSIZE (mode) < BITS_PER_WORD
1296 && REG_P (x)
1297 && REGNO (x) < FIRST_PSEUDO_REGISTER)
f060a027 1298 internal_error
1299 ("can't access imaginary part of complex value in hard register");
568f439b 1300 else
1301 return gen_highpart (mode, x);
1302}
48c70a46 1303
1304/* Return 1 iff X, assumed to be a SUBREG,
1305 refers to the real part of the complex value in its containing reg.
1306 Complex values are always stored with the real part in the first word,
1307 regardless of WORDS_BIG_ENDIAN. */
1308
1309int
1310subreg_realpart_p (x)
1311 rtx x;
1312{
1313 if (GET_CODE (x) != SUBREG)
1314 abort ();
1315
701e46d0 1316 return ((unsigned int) SUBREG_BYTE (x)
02e7a332 1317 < GET_MODE_UNIT_SIZE (GET_MODE (SUBREG_REG (x))));
48c70a46 1318}
568f439b 1319\f
15bbde2b 1320/* Assuming that X is an rtx (e.g., MEM, REG or SUBREG) for a value,
1321 return an rtx (MEM, SUBREG, or CONST_INT) that refers to the
1322 least-significant part of X.
1323 MODE specifies how big a part of X to return;
1324 it usually should not be larger than a word.
1325 If X is a MEM whose address is a QUEUED, the value may be so also. */
1326
1327rtx
1328gen_lowpart (mode, x)
1329 enum machine_mode mode;
19cb6b50 1330 rtx x;
15bbde2b 1331{
1332 rtx result = gen_lowpart_common (mode, x);
1333
1334 if (result)
1335 return result;
365c9063 1336 else if (GET_CODE (x) == REG)
1337 {
1338 /* Must be a hard reg that's not valid in MODE. */
1339 result = gen_lowpart_common (mode, copy_to_reg (x));
1340 if (result == 0)
1341 abort ();
314d6ec8 1342 return result;
365c9063 1343 }
15bbde2b 1344 else if (GET_CODE (x) == MEM)
1345 {
1346 /* The only additional case we can do is MEM. */
19cb6b50 1347 int offset = 0;
15bbde2b 1348 if (WORDS_BIG_ENDIAN)
1349 offset = (MAX (GET_MODE_SIZE (GET_MODE (x)), UNITS_PER_WORD)
1350 - MAX (GET_MODE_SIZE (mode), UNITS_PER_WORD));
1351
1352 if (BYTES_BIG_ENDIAN)
1353 /* Adjust the address so that the address-after-the-data
1354 is unchanged. */
1355 offset -= (MIN (UNITS_PER_WORD, GET_MODE_SIZE (mode))
1356 - MIN (UNITS_PER_WORD, GET_MODE_SIZE (GET_MODE (x))));
1357
e513d163 1358 return adjust_address (x, mode, offset);
15bbde2b 1359 }
0dbd1c74 1360 else if (GET_CODE (x) == ADDRESSOF)
1361 return gen_lowpart (mode, force_reg (GET_MODE (x), x));
15bbde2b 1362 else
1363 abort ();
1364}
1365
d823ba47 1366/* Like `gen_lowpart', but refer to the most significant part.
d56d0ca2 1367 This is used to access the imaginary part of a complex number. */
1368
1369rtx
1370gen_highpart (mode, x)
1371 enum machine_mode mode;
19cb6b50 1372 rtx x;
d56d0ca2 1373{
701e46d0 1374 unsigned int msize = GET_MODE_SIZE (mode);
81802af6 1375 rtx result;
701e46d0 1376
d56d0ca2 1377 /* This case loses if X is a subreg. To catch bugs early,
1378 complain if an invalid MODE is used even in other cases. */
701e46d0 1379 if (msize > UNITS_PER_WORD
1380 && msize != GET_MODE_UNIT_SIZE (GET_MODE (x)))
d56d0ca2 1381 abort ();
701e46d0 1382
81802af6 1383 result = simplify_gen_subreg (mode, x, GET_MODE (x),
1384 subreg_highpart_offset (mode, GET_MODE (x)));
a8c36ab2 1385
1386 /* simplify_gen_subreg is not guaranteed to return a valid operand for
1387 the target if we have a MEM. gen_highpart must return a valid operand,
1388 emitting code if necessary to do so. */
81d5334a 1389 if (result != NULL_RTX && GET_CODE (result) == MEM)
a8c36ab2 1390 result = validize_mem (result);
1391
81802af6 1392 if (!result)
1393 abort ();
1394 return result;
1395}
704fcf2b 1396
1397/* Like gen_highpart_mode, but accept mode of EXP operand in case EXP can
1398 be VOIDmode constant. */
1399rtx
1400gen_highpart_mode (outermode, innermode, exp)
d4c5e26d 1401 enum machine_mode outermode, innermode;
1402 rtx exp;
704fcf2b 1403{
1404 if (GET_MODE (exp) != VOIDmode)
1405 {
1406 if (GET_MODE (exp) != innermode)
1407 abort ();
1408 return gen_highpart (outermode, exp);
1409 }
1410 return simplify_gen_subreg (outermode, exp, innermode,
1411 subreg_highpart_offset (outermode, innermode));
1412}
d4c5e26d 1413
81802af6 1414/* Return offset in bytes to get OUTERMODE low part
1415 of the value in mode INNERMODE stored in memory in target format. */
10ef59ac 1416
81802af6 1417unsigned int
1418subreg_lowpart_offset (outermode, innermode)
1419 enum machine_mode outermode, innermode;
1420{
1421 unsigned int offset = 0;
1422 int difference = (GET_MODE_SIZE (innermode) - GET_MODE_SIZE (outermode));
10ef59ac 1423
81802af6 1424 if (difference > 0)
d56d0ca2 1425 {
81802af6 1426 if (WORDS_BIG_ENDIAN)
1427 offset += (difference / UNITS_PER_WORD) * UNITS_PER_WORD;
1428 if (BYTES_BIG_ENDIAN)
1429 offset += difference % UNITS_PER_WORD;
d56d0ca2 1430 }
701e46d0 1431
81802af6 1432 return offset;
d56d0ca2 1433}
64ab453f 1434
81802af6 1435/* Return offset in bytes to get OUTERMODE high part
1436 of the value in mode INNERMODE stored in memory in target format. */
1437unsigned int
1438subreg_highpart_offset (outermode, innermode)
64ab453f 1439 enum machine_mode outermode, innermode;
64ab453f 1440{
1441 unsigned int offset = 0;
1442 int difference = (GET_MODE_SIZE (innermode) - GET_MODE_SIZE (outermode));
1443
81802af6 1444 if (GET_MODE_SIZE (innermode) < GET_MODE_SIZE (outermode))
d4c5e26d 1445 abort ();
81802af6 1446
64ab453f 1447 if (difference > 0)
1448 {
81802af6 1449 if (! WORDS_BIG_ENDIAN)
64ab453f 1450 offset += (difference / UNITS_PER_WORD) * UNITS_PER_WORD;
81802af6 1451 if (! BYTES_BIG_ENDIAN)
64ab453f 1452 offset += difference % UNITS_PER_WORD;
1453 }
1454
81802af6 1455 return offset;
64ab453f 1456}
d56d0ca2 1457
15bbde2b 1458/* Return 1 iff X, assumed to be a SUBREG,
1459 refers to the least significant part of its containing reg.
1460 If X is not a SUBREG, always return 1 (it is its own low part!). */
1461
1462int
1463subreg_lowpart_p (x)
1464 rtx x;
1465{
1466 if (GET_CODE (x) != SUBREG)
1467 return 1;
7e14c1bf 1468 else if (GET_MODE (SUBREG_REG (x)) == VOIDmode)
1469 return 0;
15bbde2b 1470
81802af6 1471 return (subreg_lowpart_offset (GET_MODE (x), GET_MODE (SUBREG_REG (x)))
1472 == SUBREG_BYTE (x));
15bbde2b 1473}
1474\f
15bbde2b 1475
701e46d0 1476/* Helper routine for all the constant cases of operand_subword.
1477 Some places invoke this directly. */
15bbde2b 1478
1479rtx
701e46d0 1480constant_subword (op, offset, mode)
15bbde2b 1481 rtx op;
701e46d0 1482 int offset;
15bbde2b 1483 enum machine_mode mode;
1484{
b572011e 1485 int size_ratio = HOST_BITS_PER_WIDE_INT / BITS_PER_WORD;
701e46d0 1486 HOST_WIDE_INT val;
15bbde2b 1487
1488 /* If OP is already an integer word, return it. */
1489 if (GET_MODE_CLASS (mode) == MODE_INT
1490 && GET_MODE_SIZE (mode) == UNITS_PER_WORD)
1491 return op;
1492
915c336f 1493 /* The output is some bits, the width of the target machine's word.
1494 A wider-word host can surely hold them in a CONST_INT. A narrower-word
1495 host can't. */
0477aa9f 1496 if (HOST_BITS_PER_WIDE_INT >= BITS_PER_WORD
fc92fa61 1497 && GET_MODE_CLASS (mode) == MODE_FLOAT
48509d90 1498 && GET_MODE_BITSIZE (mode) == 64
fc92fa61 1499 && GET_CODE (op) == CONST_DOUBLE)
1500 {
0477aa9f 1501 long k[2];
fc92fa61 1502 REAL_VALUE_TYPE rv;
1503
1504 REAL_VALUE_FROM_CONST_DOUBLE (rv, op);
1505 REAL_VALUE_TO_TARGET_DOUBLE (rv, k);
48509d90 1506
0477aa9f 1507 /* We handle 32-bit and >= 64-bit words here. Note that the order in
48509d90 1508 which the words are written depends on the word endianness.
48509d90 1509 ??? This is a potential portability problem and should
cd1091f4 1510 be fixed at some point.
1511
3fb1e43b 1512 We must exercise caution with the sign bit. By definition there
cd1091f4 1513 are 32 significant bits in K; there may be more in a HOST_WIDE_INT.
1514 Consider a host with a 32-bit long and a 64-bit HOST_WIDE_INT.
1515 So we explicitly mask and sign-extend as necessary. */
0477aa9f 1516 if (BITS_PER_WORD == 32)
cd1091f4 1517 {
701e46d0 1518 val = k[offset];
cd1091f4 1519 val = ((val & 0xffffffff) ^ 0x80000000) - 0x80000000;
1520 return GEN_INT (val);
1521 }
1522#if HOST_BITS_PER_WIDE_INT >= 64
701e46d0 1523 else if (BITS_PER_WORD >= 64 && offset == 0)
cd1091f4 1524 {
1525 val = k[! WORDS_BIG_ENDIAN];
1526 val = (((val & 0xffffffff) ^ 0x80000000) - 0x80000000) << 32;
1527 val |= (HOST_WIDE_INT) k[WORDS_BIG_ENDIAN] & 0xffffffff;
1528 return GEN_INT (val);
1529 }
0477aa9f 1530#endif
de8de626 1531 else if (BITS_PER_WORD == 16)
1532 {
701e46d0 1533 val = k[offset >> 1];
1534 if ((offset & 1) == ! WORDS_BIG_ENDIAN)
cd1091f4 1535 val >>= 16;
bfc60c50 1536 val = ((val & 0xffff) ^ 0x8000) - 0x8000;
cd1091f4 1537 return GEN_INT (val);
de8de626 1538 }
48509d90 1539 else
1540 abort ();
fc92fa61 1541 }
61f41e95 1542 else if (HOST_BITS_PER_WIDE_INT >= BITS_PER_WORD
1543 && GET_MODE_CLASS (mode) == MODE_FLOAT
1544 && GET_MODE_BITSIZE (mode) > 64
1545 && GET_CODE (op) == CONST_DOUBLE)
915c336f 1546 {
1547 long k[4];
1548 REAL_VALUE_TYPE rv;
61f41e95 1549
915c336f 1550 REAL_VALUE_FROM_CONST_DOUBLE (rv, op);
1551 REAL_VALUE_TO_TARGET_LONG_DOUBLE (rv, k);
61f41e95 1552
915c336f 1553 if (BITS_PER_WORD == 32)
1554 {
701e46d0 1555 val = k[offset];
915c336f 1556 val = ((val & 0xffffffff) ^ 0x80000000) - 0x80000000;
1557 return GEN_INT (val);
1558 }
1559#if HOST_BITS_PER_WIDE_INT >= 64
701e46d0 1560 else if (BITS_PER_WORD >= 64 && offset <= 1)
915c336f 1561 {
701e46d0 1562 val = k[offset * 2 + ! WORDS_BIG_ENDIAN];
915c336f 1563 val = (((val & 0xffffffff) ^ 0x80000000) - 0x80000000) << 32;
701e46d0 1564 val |= (HOST_WIDE_INT) k[offset * 2 + WORDS_BIG_ENDIAN] & 0xffffffff;
915c336f 1565 return GEN_INT (val);
1566 }
1567#endif
1568 else
1569 abort ();
1570 }
15bbde2b 1571
1572 /* Single word float is a little harder, since single- and double-word
1573 values often do not have the same high-order bits. We have already
1574 verified that we want the only defined word of the single-word value. */
0477aa9f 1575 if (GET_MODE_CLASS (mode) == MODE_FLOAT
48509d90 1576 && GET_MODE_BITSIZE (mode) == 32
fc92fa61 1577 && GET_CODE (op) == CONST_DOUBLE)
1578 {
0477aa9f 1579 long l;
fc92fa61 1580 REAL_VALUE_TYPE rv;
1581
1582 REAL_VALUE_FROM_CONST_DOUBLE (rv, op);
1583 REAL_VALUE_TO_TARGET_SINGLE (rv, l);
587a9fdf 1584
cd1091f4 1585 /* Sign extend from known 32-bit value to HOST_WIDE_INT. */
1586 val = l;
1587 val = ((val & 0xffffffff) ^ 0x80000000) - 0x80000000;
eb294a2f 1588
587a9fdf 1589 if (BITS_PER_WORD == 16)
1590 {
701e46d0 1591 if ((offset & 1) == ! WORDS_BIG_ENDIAN)
cd1091f4 1592 val >>= 16;
bfc60c50 1593 val = ((val & 0xffff) ^ 0x8000) - 0x8000;
587a9fdf 1594 }
cd1091f4 1595
1596 return GEN_INT (val);
fc92fa61 1597 }
d823ba47 1598
15bbde2b 1599 /* The only remaining cases that we can handle are integers.
1600 Convert to proper endianness now since these cases need it.
d823ba47 1601 At this point, offset == 0 means the low-order word.
15bbde2b 1602
870288ea 1603 We do not want to handle the case when BITS_PER_WORD <= HOST_BITS_PER_INT
1604 in general. However, if OP is (const_int 0), we can just return
1605 it for any word. */
1606
1607 if (op == const0_rtx)
1608 return op;
15bbde2b 1609
1610 if (GET_MODE_CLASS (mode) != MODE_INT
870288ea 1611 || (GET_CODE (op) != CONST_INT && GET_CODE (op) != CONST_DOUBLE)
5c1fd70d 1612 || BITS_PER_WORD > HOST_BITS_PER_WIDE_INT)
15bbde2b 1613 return 0;
1614
1615 if (WORDS_BIG_ENDIAN)
701e46d0 1616 offset = GET_MODE_SIZE (mode) / UNITS_PER_WORD - 1 - offset;
15bbde2b 1617
1618 /* Find out which word on the host machine this value is in and get
1619 it from the constant. */
701e46d0 1620 val = (offset / size_ratio == 0
15bbde2b 1621 ? (GET_CODE (op) == CONST_INT ? INTVAL (op) : CONST_DOUBLE_LOW (op))
1622 : (GET_CODE (op) == CONST_INT
1623 ? (INTVAL (op) < 0 ? ~0 : 0) : CONST_DOUBLE_HIGH (op)));
1624
5418f2a8 1625 /* Get the value we want into the low bits of val. */
b572011e 1626 if (BITS_PER_WORD < HOST_BITS_PER_WIDE_INT)
701e46d0 1627 val = ((val >> ((offset % size_ratio) * BITS_PER_WORD)));
5418f2a8 1628
b2345915 1629 val = trunc_int_for_mode (val, word_mode);
15bbde2b 1630
b572011e 1631 return GEN_INT (val);
15bbde2b 1632}
1633
701e46d0 1634/* Return subword OFFSET of operand OP.
1635 The word number, OFFSET, is interpreted as the word number starting
1636 at the low-order address. OFFSET 0 is the low-order word if not
1637 WORDS_BIG_ENDIAN, otherwise it is the high-order word.
1638
1639 If we cannot extract the required word, we return zero. Otherwise,
1640 an rtx corresponding to the requested word will be returned.
1641
1642 VALIDATE_ADDRESS is nonzero if the address should be validated. Before
1643 reload has completed, a valid address will always be returned. After
1644 reload, if a valid address cannot be returned, we return zero.
1645
1646 If VALIDATE_ADDRESS is zero, we simply form the required address; validating
1647 it is the responsibility of the caller.
1648
1649 MODE is the mode of OP in case it is a CONST_INT.
1650
1651 ??? This is still rather broken for some cases. The problem for the
1652 moment is that all callers of this thing provide no 'goal mode' to
1653 tell us to work with. This exists because all callers were written
84e81e84 1654 in a word based SUBREG world.
1655 Now use of this function can be deprecated by simplify_subreg in most
1656 cases.
1657 */
701e46d0 1658
1659rtx
1660operand_subword (op, offset, validate_address, mode)
1661 rtx op;
1662 unsigned int offset;
1663 int validate_address;
1664 enum machine_mode mode;
1665{
1666 if (mode == VOIDmode)
1667 mode = GET_MODE (op);
1668
1669 if (mode == VOIDmode)
1670 abort ();
1671
6312a35e 1672 /* If OP is narrower than a word, fail. */
701e46d0 1673 if (mode != BLKmode
1674 && (GET_MODE_SIZE (mode) < UNITS_PER_WORD))
1675 return 0;
1676
6312a35e 1677 /* If we want a word outside OP, return zero. */
701e46d0 1678 if (mode != BLKmode
1679 && (offset + 1) * UNITS_PER_WORD > GET_MODE_SIZE (mode))
1680 return const0_rtx;
1681
701e46d0 1682 /* Form a new MEM at the requested address. */
1683 if (GET_CODE (op) == MEM)
1684 {
e4e86ec5 1685 rtx new = adjust_address_nv (op, word_mode, offset * UNITS_PER_WORD);
701e46d0 1686
e4e86ec5 1687 if (! validate_address)
1688 return new;
1689
1690 else if (reload_completed)
701e46d0 1691 {
e4e86ec5 1692 if (! strict_memory_address_p (word_mode, XEXP (new, 0)))
1693 return 0;
701e46d0 1694 }
e4e86ec5 1695 else
1696 return replace_equiv_address (new, XEXP (new, 0));
701e46d0 1697 }
1698
84e81e84 1699 /* Rest can be handled by simplify_subreg. */
1700 return simplify_gen_subreg (word_mode, op, mode, (offset * UNITS_PER_WORD));
701e46d0 1701}
1702
15bbde2b 1703/* Similar to `operand_subword', but never return 0. If we can't extract
1704 the required subword, put OP into a register and try again. If that fails,
d823ba47 1705 abort. We always validate the address in this case.
15bbde2b 1706
1707 MODE is the mode of OP, in case it is CONST_INT. */
1708
1709rtx
701e46d0 1710operand_subword_force (op, offset, mode)
15bbde2b 1711 rtx op;
701e46d0 1712 unsigned int offset;
15bbde2b 1713 enum machine_mode mode;
1714{
701e46d0 1715 rtx result = operand_subword (op, offset, 1, mode);
15bbde2b 1716
1717 if (result)
1718 return result;
1719
1720 if (mode != BLKmode && mode != VOIDmode)
ac825d29 1721 {
1722 /* If this is a register which can not be accessed by words, copy it
1723 to a pseudo register. */
1724 if (GET_CODE (op) == REG)
1725 op = copy_to_reg (op);
1726 else
1727 op = force_reg (mode, op);
1728 }
15bbde2b 1729
701e46d0 1730 result = operand_subword (op, offset, 1, mode);
15bbde2b 1731 if (result == 0)
1732 abort ();
1733
1734 return result;
1735}
1736\f
1737/* Given a compare instruction, swap the operands.
1738 A test instruction is changed into a compare of 0 against the operand. */
1739
1740void
1741reverse_comparison (insn)
1742 rtx insn;
1743{
1744 rtx body = PATTERN (insn);
1745 rtx comp;
1746
1747 if (GET_CODE (body) == SET)
1748 comp = SET_SRC (body);
1749 else
1750 comp = SET_SRC (XVECEXP (body, 0, 0));
1751
1752 if (GET_CODE (comp) == COMPARE)
1753 {
1754 rtx op0 = XEXP (comp, 0);
1755 rtx op1 = XEXP (comp, 1);
1756 XEXP (comp, 0) = op1;
1757 XEXP (comp, 1) = op0;
1758 }
1759 else
1760 {
7014838c 1761 rtx new = gen_rtx_COMPARE (VOIDmode,
1762 CONST0_RTX (GET_MODE (comp)), comp);
15bbde2b 1763 if (GET_CODE (body) == SET)
1764 SET_SRC (body) = new;
1765 else
1766 SET_SRC (XVECEXP (body, 0, 0)) = new;
1767 }
1768}
1769\f
b10dbbca 1770/* Within a MEM_EXPR, we care about either (1) a component ref of a decl,
1771 or (2) a component ref of something variable. Represent the later with
1772 a NULL expression. */
1773
1774static tree
1775component_ref_for_mem_expr (ref)
1776 tree ref;
1777{
1778 tree inner = TREE_OPERAND (ref, 0);
1779
1780 if (TREE_CODE (inner) == COMPONENT_REF)
1781 inner = component_ref_for_mem_expr (inner);
3c00f11c 1782 else
1783 {
1784 tree placeholder_ptr = 0;
1785
1786 /* Now remove any conversions: they don't change what the underlying
1787 object is. Likewise for SAVE_EXPR. Also handle PLACEHOLDER_EXPR. */
1788 while (TREE_CODE (inner) == NOP_EXPR || TREE_CODE (inner) == CONVERT_EXPR
1789 || TREE_CODE (inner) == NON_LVALUE_EXPR
1790 || TREE_CODE (inner) == VIEW_CONVERT_EXPR
1791 || TREE_CODE (inner) == SAVE_EXPR
1792 || TREE_CODE (inner) == PLACEHOLDER_EXPR)
d4c5e26d 1793 if (TREE_CODE (inner) == PLACEHOLDER_EXPR)
1794 inner = find_placeholder (inner, &placeholder_ptr);
1795 else
1796 inner = TREE_OPERAND (inner, 0);
3c00f11c 1797
1798 if (! DECL_P (inner))
1799 inner = NULL_TREE;
1800 }
b10dbbca 1801
1802 if (inner == TREE_OPERAND (ref, 0))
1803 return ref;
1804 else
3c00f11c 1805 return build (COMPONENT_REF, TREE_TYPE (ref), inner,
1806 TREE_OPERAND (ref, 1));
b10dbbca 1807}
c6259b83 1808
1809/* Given REF, a MEM, and T, either the type of X or the expression
1810 corresponding to REF, set the memory attributes. OBJECTP is nonzero
6f717f77 1811 if we are making a new object of this type. BITPOS is nonzero if
1812 there is an offset outstanding on T that will be applied later. */
c6259b83 1813
1814void
6f717f77 1815set_mem_attributes_minus_bitpos (ref, t, objectp, bitpos)
c6259b83 1816 rtx ref;
1817 tree t;
1818 int objectp;
6f717f77 1819 HOST_WIDE_INT bitpos;
c6259b83 1820{
2a631e19 1821 HOST_WIDE_INT alias = MEM_ALIAS_SET (ref);
b10dbbca 1822 tree expr = MEM_EXPR (ref);
2a631e19 1823 rtx offset = MEM_OFFSET (ref);
1824 rtx size = MEM_SIZE (ref);
1825 unsigned int align = MEM_ALIGN (ref);
6f717f77 1826 HOST_WIDE_INT apply_bitpos = 0;
c6259b83 1827 tree type;
1828
1829 /* It can happen that type_for_mode was given a mode for which there
1830 is no language-level type. In which case it returns NULL, which
1831 we can see here. */
1832 if (t == NULL_TREE)
1833 return;
1834
1835 type = TYPE_P (t) ? t : TREE_TYPE (t);
1836
c6259b83 1837 /* If we have already set DECL_RTL = ref, get_alias_set will get the
1838 wrong answer, as it assumes that DECL_RTL already has the right alias
1839 info. Callers should not set DECL_RTL until after the call to
1840 set_mem_attributes. */
1841 if (DECL_P (t) && ref == DECL_RTL_IF_SET (t))
1842 abort ();
1843
96216d37 1844 /* Get the alias set from the expression or type (perhaps using a
2a631e19 1845 front-end routine) and use it. */
1846 alias = get_alias_set (t);
c6259b83 1847
1848 MEM_VOLATILE_P (ref) = TYPE_VOLATILE (type);
1849 MEM_IN_STRUCT_P (ref) = AGGREGATE_TYPE_P (type);
b8098e5b 1850 RTX_UNCHANGING_P (ref)
278fe152 1851 |= ((lang_hooks.honor_readonly
1852 && (TYPE_READONLY (type) || TREE_READONLY (t)))
1853 || (! TYPE_P (t) && TREE_CONSTANT (t)));
c6259b83 1854
2a631e19 1855 /* If we are making an object of this type, or if this is a DECL, we know
1856 that it is a scalar if the type is not an aggregate. */
1857 if ((objectp || DECL_P (t)) && ! AGGREGATE_TYPE_P (type))
c6259b83 1858 MEM_SCALAR_P (ref) = 1;
1859
a9d9ab08 1860 /* We can set the alignment from the type if we are making an object,
1861 this is an INDIRECT_REF, or if TYPE_ALIGN_OK. */
1862 if (objectp || TREE_CODE (t) == INDIRECT_REF || TYPE_ALIGN_OK (type))
1863 align = MAX (align, TYPE_ALIGN (type));
ecfe4ca9 1864
96216d37 1865 /* If the size is known, we can set that. */
1866 if (TYPE_SIZE_UNIT (type) && host_integerp (TYPE_SIZE_UNIT (type), 1))
2a631e19 1867 size = GEN_INT (tree_low_cst (TYPE_SIZE_UNIT (type), 1));
96216d37 1868
579bccf9 1869 /* If T is not a type, we may be able to deduce some more information about
1870 the expression. */
1871 if (! TYPE_P (t))
2a631e19 1872 {
1873 maybe_set_unchanging (ref, t);
1874 if (TREE_THIS_VOLATILE (t))
1875 MEM_VOLATILE_P (ref) = 1;
c6259b83 1876
3c00f11c 1877 /* Now remove any conversions: they don't change what the underlying
1878 object is. Likewise for SAVE_EXPR. */
2a631e19 1879 while (TREE_CODE (t) == NOP_EXPR || TREE_CODE (t) == CONVERT_EXPR
3c00f11c 1880 || TREE_CODE (t) == NON_LVALUE_EXPR
1881 || TREE_CODE (t) == VIEW_CONVERT_EXPR
1882 || TREE_CODE (t) == SAVE_EXPR)
2a631e19 1883 t = TREE_OPERAND (t, 0);
1884
5cc193e7 1885 /* If this expression can't be addressed (e.g., it contains a reference
1886 to a non-addressable field), show we don't change its alias set. */
1887 if (! can_address_p (t))
1888 MEM_KEEP_ALIAS_SET_P (ref) = 1;
1889
2a631e19 1890 /* If this is a decl, set the attributes of the MEM from it. */
1891 if (DECL_P (t))
1892 {
b10dbbca 1893 expr = t;
1894 offset = const0_rtx;
6f717f77 1895 apply_bitpos = bitpos;
2a631e19 1896 size = (DECL_SIZE_UNIT (t)
1897 && host_integerp (DECL_SIZE_UNIT (t), 1)
1898 ? GEN_INT (tree_low_cst (DECL_SIZE_UNIT (t), 1)) : 0);
d4c5e26d 1899 align = DECL_ALIGN (t);
2a631e19 1900 }
1901
ecfe4ca9 1902 /* If this is a constant, we know the alignment. */
42f6f447 1903 else if (TREE_CODE_CLASS (TREE_CODE (t)) == 'c')
1904 {
1905 align = TYPE_ALIGN (type);
1906#ifdef CONSTANT_ALIGNMENT
1907 align = CONSTANT_ALIGNMENT (t, align);
1908#endif
1909 }
b10dbbca 1910
1911 /* If this is a field reference and not a bit-field, record it. */
1912 /* ??? There is some information that can be gleened from bit-fields,
1913 such as the word offset in the structure that might be modified.
1914 But skip it for now. */
1915 else if (TREE_CODE (t) == COMPONENT_REF
1916 && ! DECL_BIT_FIELD (TREE_OPERAND (t, 1)))
1917 {
1918 expr = component_ref_for_mem_expr (t);
1919 offset = const0_rtx;
6f717f77 1920 apply_bitpos = bitpos;
b10dbbca 1921 /* ??? Any reason the field size would be different than
1922 the size we got from the type? */
1923 }
1924
1925 /* If this is an array reference, look for an outer field reference. */
1926 else if (TREE_CODE (t) == ARRAY_REF)
1927 {
1928 tree off_tree = size_zero_node;
1929
1930 do
1931 {
97f8ce30 1932 tree index = TREE_OPERAND (t, 1);
1933 tree array = TREE_OPERAND (t, 0);
1934 tree domain = TYPE_DOMAIN (TREE_TYPE (array));
1935 tree low_bound = (domain ? TYPE_MIN_VALUE (domain) : 0);
1936 tree unit_size = TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (array)));
1937
1938 /* We assume all arrays have sizes that are a multiple of a byte.
1939 First subtract the lower bound, if any, in the type of the
1940 index, then convert to sizetype and multiply by the size of the
1941 array element. */
1942 if (low_bound != 0 && ! integer_zerop (low_bound))
1943 index = fold (build (MINUS_EXPR, TREE_TYPE (index),
1944 index, low_bound));
1945
1946 /* If the index has a self-referential type, pass it to a
1947 WITH_RECORD_EXPR; if the component size is, pass our
1948 component to one. */
1949 if (! TREE_CONSTANT (index)
1950 && contains_placeholder_p (index))
1951 index = build (WITH_RECORD_EXPR, TREE_TYPE (index), index, t);
1952 if (! TREE_CONSTANT (unit_size)
1953 && contains_placeholder_p (unit_size))
1954 unit_size = build (WITH_RECORD_EXPR, sizetype,
1955 unit_size, array);
1956
b10dbbca 1957 off_tree
1958 = fold (build (PLUS_EXPR, sizetype,
1959 fold (build (MULT_EXPR, sizetype,
97f8ce30 1960 index,
1961 unit_size)),
b10dbbca 1962 off_tree));
1963 t = TREE_OPERAND (t, 0);
1964 }
1965 while (TREE_CODE (t) == ARRAY_REF);
1966
2d8fe5d0 1967 if (DECL_P (t))
1968 {
1969 expr = t;
0318dc09 1970 offset = NULL;
2d8fe5d0 1971 if (host_integerp (off_tree, 1))
0318dc09 1972 {
1973 HOST_WIDE_INT ioff = tree_low_cst (off_tree, 1);
1974 HOST_WIDE_INT aoff = (ioff & -ioff) * BITS_PER_UNIT;
1975 align = DECL_ALIGN (t);
3473aefe 1976 if (aoff && (unsigned HOST_WIDE_INT) aoff < align)
0318dc09 1977 align = aoff;
1978 offset = GEN_INT (ioff);
6f717f77 1979 apply_bitpos = bitpos;
0318dc09 1980 }
2d8fe5d0 1981 }
1982 else if (TREE_CODE (t) == COMPONENT_REF)
b10dbbca 1983 {
1984 expr = component_ref_for_mem_expr (t);
1985 if (host_integerp (off_tree, 1))
6f717f77 1986 {
1987 offset = GEN_INT (tree_low_cst (off_tree, 1));
1988 apply_bitpos = bitpos;
1989 }
b10dbbca 1990 /* ??? Any reason the field size would be different than
1991 the size we got from the type? */
1992 }
2d8fe5d0 1993 else if (flag_argument_noalias > 1
1994 && TREE_CODE (t) == INDIRECT_REF
1995 && TREE_CODE (TREE_OPERAND (t, 0)) == PARM_DECL)
1996 {
1997 expr = t;
1998 offset = NULL;
1999 }
2000 }
2001
2002 /* If this is a Fortran indirect argument reference, record the
2003 parameter decl. */
2004 else if (flag_argument_noalias > 1
2005 && TREE_CODE (t) == INDIRECT_REF
2006 && TREE_CODE (TREE_OPERAND (t, 0)) == PARM_DECL)
2007 {
2008 expr = t;
2009 offset = NULL;
b10dbbca 2010 }
2a631e19 2011 }
2012
6f717f77 2013 /* If we modified OFFSET based on T, then subtract the outstanding
595f1461 2014 bit position offset. Similarly, increase the size of the accessed
2015 object to contain the negative offset. */
6f717f77 2016 if (apply_bitpos)
595f1461 2017 {
2018 offset = plus_constant (offset, -(apply_bitpos / BITS_PER_UNIT));
2019 if (size)
2020 size = plus_constant (size, apply_bitpos / BITS_PER_UNIT);
2021 }
6f717f77 2022
2a631e19 2023 /* Now set the attributes we computed above. */
5cc193e7 2024 MEM_ATTRS (ref)
b10dbbca 2025 = get_mem_attrs (alias, expr, offset, size, align, GET_MODE (ref));
2a631e19 2026
2027 /* If this is already known to be a scalar or aggregate, we are done. */
2028 if (MEM_IN_STRUCT_P (ref) || MEM_SCALAR_P (ref))
96216d37 2029 return;
2030
2a631e19 2031 /* If it is a reference into an aggregate, this is part of an aggregate.
2032 Otherwise we don't know. */
c6259b83 2033 else if (TREE_CODE (t) == COMPONENT_REF || TREE_CODE (t) == ARRAY_REF
2034 || TREE_CODE (t) == ARRAY_RANGE_REF
2035 || TREE_CODE (t) == BIT_FIELD_REF)
2036 MEM_IN_STRUCT_P (ref) = 1;
2037}
2038
6f717f77 2039void
2040set_mem_attributes (ref, t, objectp)
2041 rtx ref;
2042 tree t;
2043 int objectp;
2044{
2045 set_mem_attributes_minus_bitpos (ref, t, objectp, 0);
2046}
2047
ca74b940 2048/* Set the decl for MEM to DECL. */
2049
2050void
2051set_mem_attrs_from_reg (mem, reg)
2052 rtx mem;
2053 rtx reg;
2054{
2055 MEM_ATTRS (mem)
2056 = get_mem_attrs (MEM_ALIAS_SET (mem), REG_EXPR (reg),
2057 GEN_INT (REG_OFFSET (reg)),
2058 MEM_SIZE (mem), MEM_ALIGN (mem), GET_MODE (mem));
2059}
2060
c6259b83 2061/* Set the alias set of MEM to SET. */
2062
2063void
2064set_mem_alias_set (mem, set)
2065 rtx mem;
2066 HOST_WIDE_INT set;
2067{
d4c5e26d 2068#ifdef ENABLE_CHECKING
c6259b83 2069 /* If the new and old alias sets don't conflict, something is wrong. */
2070 if (!alias_sets_conflict_p (set, MEM_ALIAS_SET (mem)))
2071 abort ();
c6259b83 2072#endif
2073
b10dbbca 2074 MEM_ATTRS (mem) = get_mem_attrs (set, MEM_EXPR (mem), MEM_OFFSET (mem),
5cc193e7 2075 MEM_SIZE (mem), MEM_ALIGN (mem),
2076 GET_MODE (mem));
c6259b83 2077}
96216d37 2078
1c4512da 2079/* Set the alignment of MEM to ALIGN bits. */
96216d37 2080
2081void
2082set_mem_align (mem, align)
2083 rtx mem;
2084 unsigned int align;
2085{
b10dbbca 2086 MEM_ATTRS (mem) = get_mem_attrs (MEM_ALIAS_SET (mem), MEM_EXPR (mem),
5cc193e7 2087 MEM_OFFSET (mem), MEM_SIZE (mem), align,
2088 GET_MODE (mem));
96216d37 2089}
278fe152 2090
b10dbbca 2091/* Set the expr for MEM to EXPR. */
278fe152 2092
2093void
b10dbbca 2094set_mem_expr (mem, expr)
278fe152 2095 rtx mem;
b10dbbca 2096 tree expr;
278fe152 2097{
2098 MEM_ATTRS (mem)
b10dbbca 2099 = get_mem_attrs (MEM_ALIAS_SET (mem), expr, MEM_OFFSET (mem),
278fe152 2100 MEM_SIZE (mem), MEM_ALIGN (mem), GET_MODE (mem));
2101}
b10dbbca 2102
2103/* Set the offset of MEM to OFFSET. */
2104
2105void
2106set_mem_offset (mem, offset)
2107 rtx mem, offset;
2108{
2109 MEM_ATTRS (mem) = get_mem_attrs (MEM_ALIAS_SET (mem), MEM_EXPR (mem),
2110 offset, MEM_SIZE (mem), MEM_ALIGN (mem),
2111 GET_MODE (mem));
f0500469 2112}
2113
2114/* Set the size of MEM to SIZE. */
2115
2116void
2117set_mem_size (mem, size)
2118 rtx mem, size;
2119{
2120 MEM_ATTRS (mem) = get_mem_attrs (MEM_ALIAS_SET (mem), MEM_EXPR (mem),
2121 MEM_OFFSET (mem), size, MEM_ALIGN (mem),
2122 GET_MODE (mem));
b10dbbca 2123}
c6259b83 2124\f
96216d37 2125/* Return a memory reference like MEMREF, but with its mode changed to MODE
2126 and its address changed to ADDR. (VOIDmode means don't change the mode.
2127 NULL for ADDR means don't change the address.) VALIDATE is nonzero if the
2128 returned memory location is required to be valid. The memory
2129 attributes are not changed. */
15bbde2b 2130
96216d37 2131static rtx
e4e86ec5 2132change_address_1 (memref, mode, addr, validate)
15bbde2b 2133 rtx memref;
2134 enum machine_mode mode;
2135 rtx addr;
e4e86ec5 2136 int validate;
15bbde2b 2137{
2138 rtx new;
2139
2140 if (GET_CODE (memref) != MEM)
2141 abort ();
2142 if (mode == VOIDmode)
2143 mode = GET_MODE (memref);
2144 if (addr == 0)
2145 addr = XEXP (memref, 0);
2146
e4e86ec5 2147 if (validate)
15bbde2b 2148 {
e4e86ec5 2149 if (reload_in_progress || reload_completed)
2150 {
2151 if (! memory_address_p (mode, addr))
2152 abort ();
2153 }
2154 else
2155 addr = memory_address (mode, addr);
15bbde2b 2156 }
d823ba47 2157
e8976cd7 2158 if (rtx_equal_p (addr, XEXP (memref, 0)) && mode == GET_MODE (memref))
2159 return memref;
2160
3ad7bb1c 2161 new = gen_rtx_MEM (mode, addr);
6a0934dd 2162 MEM_COPY_ATTRIBUTES (new, memref);
15bbde2b 2163 return new;
2164}
537ffcfc 2165
96216d37 2166/* Like change_address_1 with VALIDATE nonzero, but we are not saying in what
2167 way we are changing MEMREF, so we only preserve the alias set. */
e513d163 2168
2169rtx
96216d37 2170change_address (memref, mode, addr)
e513d163 2171 rtx memref;
2172 enum machine_mode mode;
96216d37 2173 rtx addr;
e513d163 2174{
96216d37 2175 rtx new = change_address_1 (memref, mode, addr, 1);
2176 enum machine_mode mmode = GET_MODE (new);
6cc60c4d 2177
96216d37 2178 MEM_ATTRS (new)
2179 = get_mem_attrs (MEM_ALIAS_SET (memref), 0, 0,
2180 mmode == BLKmode ? 0 : GEN_INT (GET_MODE_SIZE (mmode)),
2b96c5f6 2181 (mmode == BLKmode ? BITS_PER_UNIT
2182 : GET_MODE_ALIGNMENT (mmode)),
5cc193e7 2183 mmode);
fb257ae6 2184
96216d37 2185 return new;
e513d163 2186}
537ffcfc 2187
96216d37 2188/* Return a memory reference like MEMREF, but with its mode changed
2189 to MODE and its address offset by OFFSET bytes. If VALIDATE is
bf42c62d 2190 nonzero, the memory address is forced to be valid.
2191 If ADJUST is zero, OFFSET is only used to update MEM_ATTRS
2192 and caller is responsible for adjusting MEMREF base register. */
e4e86ec5 2193
2194rtx
bf42c62d 2195adjust_address_1 (memref, mode, offset, validate, adjust)
e4e86ec5 2196 rtx memref;
2197 enum machine_mode mode;
2198 HOST_WIDE_INT offset;
bf42c62d 2199 int validate, adjust;
e4e86ec5 2200{
fb257ae6 2201 rtx addr = XEXP (memref, 0);
96216d37 2202 rtx new;
2203 rtx memoffset = MEM_OFFSET (memref);
5cc193e7 2204 rtx size = 0;
96216d37 2205 unsigned int memalign = MEM_ALIGN (memref);
fb257ae6 2206
e36c3d58 2207 /* ??? Prefer to create garbage instead of creating shared rtl.
6ef828f9 2208 This may happen even if offset is nonzero -- consider
e36c3d58 2209 (plus (plus reg reg) const_int) -- so do this always. */
2210 addr = copy_rtx (addr);
2211
cd358719 2212 if (adjust)
2213 {
2214 /* If MEMREF is a LO_SUM and the offset is within the alignment of the
2215 object, we can merge it into the LO_SUM. */
2216 if (GET_MODE (memref) != BLKmode && GET_CODE (addr) == LO_SUM
2217 && offset >= 0
2218 && (unsigned HOST_WIDE_INT) offset
2219 < GET_MODE_ALIGNMENT (GET_MODE (memref)) / BITS_PER_UNIT)
2220 addr = gen_rtx_LO_SUM (Pmode, XEXP (addr, 0),
2221 plus_constant (XEXP (addr, 1), offset));
2222 else
2223 addr = plus_constant (addr, offset);
2224 }
fb257ae6 2225
96216d37 2226 new = change_address_1 (memref, mode, addr, validate);
2227
2228 /* Compute the new values of the memory attributes due to this adjustment.
2229 We add the offsets and update the alignment. */
2230 if (memoffset)
2231 memoffset = GEN_INT (offset + INTVAL (memoffset));
2232
b8098e5b 2233 /* Compute the new alignment by taking the MIN of the alignment and the
2234 lowest-order set bit in OFFSET, but don't change the alignment if OFFSET
2235 if zero. */
2236 if (offset != 0)
f4aee538 2237 memalign
2238 = MIN (memalign,
2239 (unsigned HOST_WIDE_INT) (offset & -offset) * BITS_PER_UNIT);
96216d37 2240
5cc193e7 2241 /* We can compute the size in a number of ways. */
2b96c5f6 2242 if (GET_MODE (new) != BLKmode)
2243 size = GEN_INT (GET_MODE_SIZE (GET_MODE (new)));
5cc193e7 2244 else if (MEM_SIZE (memref))
2245 size = plus_constant (MEM_SIZE (memref), -offset);
2246
b10dbbca 2247 MEM_ATTRS (new) = get_mem_attrs (MEM_ALIAS_SET (memref), MEM_EXPR (memref),
5cc193e7 2248 memoffset, size, memalign, GET_MODE (new));
96216d37 2249
2250 /* At some point, we should validate that this offset is within the object,
2251 if all the appropriate values are known. */
2252 return new;
e4e86ec5 2253}
2254
bf42c62d 2255/* Return a memory reference like MEMREF, but with its mode changed
2256 to MODE and its address changed to ADDR, which is assumed to be
2257 MEMREF offseted by OFFSET bytes. If VALIDATE is
2258 nonzero, the memory address is forced to be valid. */
2259
2260rtx
2261adjust_automodify_address_1 (memref, mode, addr, offset, validate)
2262 rtx memref;
2263 enum machine_mode mode;
2264 rtx addr;
2265 HOST_WIDE_INT offset;
2266 int validate;
2267{
2268 memref = change_address_1 (memref, VOIDmode, addr, validate);
2269 return adjust_address_1 (memref, mode, offset, validate, 0);
2270}
2271
2a631e19 2272/* Return a memory reference like MEMREF, but whose address is changed by
2273 adding OFFSET, an RTX, to it. POW2 is the highest power of two factor
2274 known to be in OFFSET (possibly 1). */
fcdc122e 2275
2276rtx
2277offset_address (memref, offset, pow2)
2278 rtx memref;
2279 rtx offset;
2280 HOST_WIDE_INT pow2;
2281{
fac6aae6 2282 rtx new, addr = XEXP (memref, 0);
2283
2284 new = simplify_gen_binary (PLUS, Pmode, addr, offset);
2285
d4c5e26d 2286 /* At this point we don't know _why_ the address is invalid. It
fac6aae6 2287 could have secondary memory refereces, multiplies or anything.
2288
2289 However, if we did go and rearrange things, we can wind up not
2290 being able to recognize the magic around pic_offset_table_rtx.
2291 This stuff is fragile, and is yet another example of why it is
2292 bad to expose PIC machinery too early. */
2293 if (! memory_address_p (GET_MODE (memref), new)
2294 && GET_CODE (addr) == PLUS
2295 && XEXP (addr, 0) == pic_offset_table_rtx)
2296 {
2297 addr = force_reg (GET_MODE (addr), addr);
2298 new = simplify_gen_binary (PLUS, Pmode, addr, offset);
2299 }
2300
430816ab 2301 update_temp_slot_address (XEXP (memref, 0), new);
fac6aae6 2302 new = change_address_1 (memref, VOIDmode, new, 1);
fcdc122e 2303
2304 /* Update the alignment to reflect the offset. Reset the offset, which
2305 we don't know. */
80fabb90 2306 MEM_ATTRS (new)
2307 = get_mem_attrs (MEM_ALIAS_SET (memref), MEM_EXPR (memref), 0, 0,
2308 MIN (MEM_ALIGN (memref),
f4aee538 2309 (unsigned HOST_WIDE_INT) pow2 * BITS_PER_UNIT),
80fabb90 2310 GET_MODE (new));
fcdc122e 2311 return new;
2312}
d4c5e26d 2313
537ffcfc 2314/* Return a memory reference like MEMREF, but with its address changed to
2315 ADDR. The caller is asserting that the actual piece of memory pointed
2316 to is the same, just the form of the address is being changed, such as
2317 by putting something into a register. */
2318
2319rtx
2320replace_equiv_address (memref, addr)
2321 rtx memref;
2322 rtx addr;
2323{
96216d37 2324 /* change_address_1 copies the memory attribute structure without change
2325 and that's exactly what we want here. */
ecfe4ca9 2326 update_temp_slot_address (XEXP (memref, 0), addr);
96216d37 2327 return change_address_1 (memref, VOIDmode, addr, 1);
537ffcfc 2328}
96216d37 2329
e4e86ec5 2330/* Likewise, but the reference is not required to be valid. */
2331
2332rtx
2333replace_equiv_address_nv (memref, addr)
2334 rtx memref;
2335 rtx addr;
2336{
e4e86ec5 2337 return change_address_1 (memref, VOIDmode, addr, 0);
2338}
8259ab07 2339
2340/* Return a memory reference like MEMREF, but with its mode widened to
2341 MODE and offset by OFFSET. This would be used by targets that e.g.
2342 cannot issue QImode memory operations and have to use SImode memory
2343 operations plus masking logic. */
2344
2345rtx
2346widen_memory_access (memref, mode, offset)
2347 rtx memref;
2348 enum machine_mode mode;
2349 HOST_WIDE_INT offset;
2350{
2351 rtx new = adjust_address_1 (memref, mode, offset, 1, 1);
2352 tree expr = MEM_EXPR (new);
2353 rtx memoffset = MEM_OFFSET (new);
2354 unsigned int size = GET_MODE_SIZE (mode);
2355
2356 /* If we don't know what offset we were at within the expression, then
2357 we can't know if we've overstepped the bounds. */
22ee087b 2358 if (! memoffset)
8259ab07 2359 expr = NULL_TREE;
2360
2361 while (expr)
2362 {
2363 if (TREE_CODE (expr) == COMPONENT_REF)
2364 {
2365 tree field = TREE_OPERAND (expr, 1);
2366
2367 if (! DECL_SIZE_UNIT (field))
2368 {
2369 expr = NULL_TREE;
2370 break;
2371 }
2372
2373 /* Is the field at least as large as the access? If so, ok,
2374 otherwise strip back to the containing structure. */
8359cfb4 2375 if (TREE_CODE (DECL_SIZE_UNIT (field)) == INTEGER_CST
2376 && compare_tree_int (DECL_SIZE_UNIT (field), size) >= 0
8259ab07 2377 && INTVAL (memoffset) >= 0)
2378 break;
2379
2380 if (! host_integerp (DECL_FIELD_OFFSET (field), 1))
2381 {
2382 expr = NULL_TREE;
2383 break;
2384 }
2385
2386 expr = TREE_OPERAND (expr, 0);
2387 memoffset = (GEN_INT (INTVAL (memoffset)
2388 + tree_low_cst (DECL_FIELD_OFFSET (field), 1)
2389 + (tree_low_cst (DECL_FIELD_BIT_OFFSET (field), 1)
2390 / BITS_PER_UNIT)));
2391 }
2392 /* Similarly for the decl. */
2393 else if (DECL_P (expr)
2394 && DECL_SIZE_UNIT (expr)
40c4e66e 2395 && TREE_CODE (DECL_SIZE_UNIT (expr)) == INTEGER_CST
8259ab07 2396 && compare_tree_int (DECL_SIZE_UNIT (expr), size) >= 0
2397 && (! memoffset || INTVAL (memoffset) >= 0))
2398 break;
2399 else
2400 {
2401 /* The widened memory access overflows the expression, which means
2402 that it could alias another expression. Zap it. */
2403 expr = NULL_TREE;
2404 break;
2405 }
2406 }
2407
2408 if (! expr)
2409 memoffset = NULL_RTX;
2410
2411 /* The widened memory may alias other stuff, so zap the alias set. */
2412 /* ??? Maybe use get_alias_set on any remaining expression. */
2413
2414 MEM_ATTRS (new) = get_mem_attrs (0, expr, memoffset, GEN_INT (size),
2415 MEM_ALIGN (new), mode);
2416
2417 return new;
2418}
15bbde2b 2419\f
2420/* Return a newly created CODE_LABEL rtx with a unique label number. */
2421
2422rtx
2423gen_label_rtx ()
2424{
a7ae1e59 2425 return gen_rtx_CODE_LABEL (VOIDmode, 0, NULL_RTX, NULL_RTX,
2426 NULL, label_num++, NULL);
15bbde2b 2427}
2428\f
2429/* For procedure integration. */
2430
15bbde2b 2431/* Install new pointers to the first and last insns in the chain.
d4c332ff 2432 Also, set cur_insn_uid to one higher than the last in use.
15bbde2b 2433 Used for an inline-procedure after copying the insn chain. */
2434
2435void
2436set_new_first_and_last_insn (first, last)
2437 rtx first, last;
2438{
d4c332ff 2439 rtx insn;
2440
15bbde2b 2441 first_insn = first;
2442 last_insn = last;
d4c332ff 2443 cur_insn_uid = 0;
2444
2445 for (insn = first; insn; insn = NEXT_INSN (insn))
2446 cur_insn_uid = MAX (cur_insn_uid, INSN_UID (insn));
2447
2448 cur_insn_uid++;
15bbde2b 2449}
2450
2451/* Set the range of label numbers found in the current function.
2452 This is used when belatedly compiling an inline function. */
2453
2454void
2455set_new_first_and_last_label_num (first, last)
2456 int first, last;
2457{
2458 base_label_num = label_num;
2459 first_label_num = first;
2460 last_label_num = last;
2461}
0a893c29 2462
2463/* Set the last label number found in the current function.
2464 This is used when belatedly compiling an inline function. */
15bbde2b 2465
2466void
0a893c29 2467set_new_last_label_num (last)
2468 int last;
15bbde2b 2469{
0a893c29 2470 base_label_num = label_num;
2471 last_label_num = last;
15bbde2b 2472}
0a893c29 2473\f
15bbde2b 2474/* Restore all variables describing the current status from the structure *P.
2475 This is used after a nested function. */
2476
2477void
2478restore_emit_status (p)
c5b89159 2479 struct function *p ATTRIBUTE_UNUSED;
15bbde2b 2480{
bb9d6298 2481 last_label_num = 0;
15bbde2b 2482}
2483\f
d823ba47 2484/* Go through all the RTL insn bodies and copy any invalid shared
2d96a59a 2485 structure. This routine should only be called once. */
15bbde2b 2486
2487void
2d96a59a 2488unshare_all_rtl (fndecl, insn)
2489 tree fndecl;
2490 rtx insn;
15bbde2b 2491{
2d96a59a 2492 tree decl;
15bbde2b 2493
2d96a59a 2494 /* Make sure that virtual parameters are not shared. */
2495 for (decl = DECL_ARGUMENTS (fndecl); decl; decl = TREE_CHAIN (decl))
0e8e37b2 2496 SET_DECL_RTL (decl, copy_rtx_if_shared (DECL_RTL (decl)));
2d96a59a 2497
72ec8878 2498 /* Make sure that virtual stack slots are not shared. */
2499 unshare_all_decls (DECL_INITIAL (fndecl));
2500
2d96a59a 2501 /* Unshare just about everything else. */
2502 unshare_all_rtl_1 (insn);
d823ba47 2503
15bbde2b 2504 /* Make sure the addresses of stack slots found outside the insn chain
2505 (such as, in DECL_RTL of a variable) are not shared
2506 with the insn chain.
2507
2508 This special care is necessary when the stack slot MEM does not
2509 actually appear in the insn chain. If it does appear, its address
2510 is unshared from all else at that point. */
45733446 2511 stack_slot_list = copy_rtx_if_shared (stack_slot_list);
15bbde2b 2512}
2513
d823ba47 2514/* Go through all the RTL insn bodies and copy any invalid shared
2d96a59a 2515 structure, again. This is a fairly expensive thing to do so it
2516 should be done sparingly. */
2517
2518void
2519unshare_all_rtl_again (insn)
2520 rtx insn;
2521{
2522 rtx p;
5244079b 2523 tree decl;
2524
2d96a59a 2525 for (p = insn; p; p = NEXT_INSN (p))
9204e736 2526 if (INSN_P (p))
2d96a59a 2527 {
2528 reset_used_flags (PATTERN (p));
2529 reset_used_flags (REG_NOTES (p));
2530 reset_used_flags (LOG_LINKS (p));
2531 }
5244079b 2532
01dc9f0c 2533 /* Make sure that virtual stack slots are not shared. */
2534 reset_used_decls (DECL_INITIAL (cfun->decl));
2535
5244079b 2536 /* Make sure that virtual parameters are not shared. */
2537 for (decl = DECL_ARGUMENTS (cfun->decl); decl; decl = TREE_CHAIN (decl))
2538 reset_used_flags (DECL_RTL (decl));
2539
2540 reset_used_flags (stack_slot_list);
2541
2542 unshare_all_rtl (cfun->decl, insn);
2d96a59a 2543}
2544
2545/* Go through all the RTL insn bodies and copy any invalid shared structure.
2546 Assumes the mark bits are cleared at entry. */
2547
2548static void
2549unshare_all_rtl_1 (insn)
2550 rtx insn;
2551{
2552 for (; insn; insn = NEXT_INSN (insn))
9204e736 2553 if (INSN_P (insn))
2d96a59a 2554 {
2555 PATTERN (insn) = copy_rtx_if_shared (PATTERN (insn));
2556 REG_NOTES (insn) = copy_rtx_if_shared (REG_NOTES (insn));
2557 LOG_LINKS (insn) = copy_rtx_if_shared (LOG_LINKS (insn));
2558 }
2559}
2560
72ec8878 2561/* Go through all virtual stack slots of a function and copy any
2562 shared structure. */
2563static void
2564unshare_all_decls (blk)
2565 tree blk;
2566{
2567 tree t;
2568
2569 /* Copy shared decls. */
2570 for (t = BLOCK_VARS (blk); t; t = TREE_CHAIN (t))
0e8e37b2 2571 if (DECL_RTL_SET_P (t))
2572 SET_DECL_RTL (t, copy_rtx_if_shared (DECL_RTL (t)));
72ec8878 2573
2574 /* Now process sub-blocks. */
2575 for (t = BLOCK_SUBBLOCKS (blk); t; t = TREE_CHAIN (t))
2576 unshare_all_decls (t);
2577}
2578
01dc9f0c 2579/* Go through all virtual stack slots of a function and mark them as
6312a35e 2580 not shared. */
01dc9f0c 2581static void
2582reset_used_decls (blk)
2583 tree blk;
2584{
2585 tree t;
2586
2587 /* Mark decls. */
2588 for (t = BLOCK_VARS (blk); t; t = TREE_CHAIN (t))
0e8e37b2 2589 if (DECL_RTL_SET_P (t))
2590 reset_used_flags (DECL_RTL (t));
01dc9f0c 2591
2592 /* Now process sub-blocks. */
2593 for (t = BLOCK_SUBBLOCKS (blk); t; t = TREE_CHAIN (t))
2594 reset_used_decls (t);
2595}
2596
c15aa775 2597/* Similar to `copy_rtx' except that if MAY_SHARE is present, it is
dd367d39 2598 placed in the result directly, rather than being copied. MAY_SHARE is
2599 either a MEM of an EXPR_LIST of MEMs. */
c15aa775 2600
2601rtx
2602copy_most_rtx (orig, may_share)
2603 rtx orig;
2604 rtx may_share;
2605{
2606 rtx copy;
2607 int i, j;
2608 RTX_CODE code;
2609 const char *format_ptr;
2610
dd367d39 2611 if (orig == may_share
2612 || (GET_CODE (may_share) == EXPR_LIST
2613 && in_expr_list_p (may_share, orig)))
c15aa775 2614 return orig;
2615
2616 code = GET_CODE (orig);
2617
2618 switch (code)
2619 {
2620 case REG:
2621 case QUEUED:
2622 case CONST_INT:
2623 case CONST_DOUBLE:
2624 case CONST_VECTOR:
2625 case SYMBOL_REF:
2626 case CODE_LABEL:
2627 case PC:
2628 case CC0:
2629 return orig;
2630 default:
2631 break;
2632 }
2633
2634 copy = rtx_alloc (code);
2635 PUT_MODE (copy, GET_MODE (orig));
7c25cb91 2636 RTX_FLAG (copy, in_struct) = RTX_FLAG (orig, in_struct);
2637 RTX_FLAG (copy, volatil) = RTX_FLAG (orig, volatil);
2638 RTX_FLAG (copy, unchanging) = RTX_FLAG (orig, unchanging);
2639 RTX_FLAG (copy, integrated) = RTX_FLAG (orig, integrated);
2640 RTX_FLAG (copy, frame_related) = RTX_FLAG (orig, frame_related);
c15aa775 2641
2642 format_ptr = GET_RTX_FORMAT (GET_CODE (copy));
2643
2644 for (i = 0; i < GET_RTX_LENGTH (GET_CODE (copy)); i++)
2645 {
2646 switch (*format_ptr++)
2647 {
2648 case 'e':
2649 XEXP (copy, i) = XEXP (orig, i);
2650 if (XEXP (orig, i) != NULL && XEXP (orig, i) != may_share)
2651 XEXP (copy, i) = copy_most_rtx (XEXP (orig, i), may_share);
2652 break;
2653
2654 case 'u':
2655 XEXP (copy, i) = XEXP (orig, i);
2656 break;
2657
2658 case 'E':
2659 case 'V':
2660 XVEC (copy, i) = XVEC (orig, i);
2661 if (XVEC (orig, i) != NULL)
2662 {
2663 XVEC (copy, i) = rtvec_alloc (XVECLEN (orig, i));
2664 for (j = 0; j < XVECLEN (copy, i); j++)
2665 XVECEXP (copy, i, j)
2666 = copy_most_rtx (XVECEXP (orig, i, j), may_share);
2667 }
2668 break;
2669
2670 case 'w':
2671 XWINT (copy, i) = XWINT (orig, i);
2672 break;
2673
2674 case 'n':
2675 case 'i':
2676 XINT (copy, i) = XINT (orig, i);
2677 break;
2678
2679 case 't':
2680 XTREE (copy, i) = XTREE (orig, i);
2681 break;
2682
2683 case 's':
2684 case 'S':
2685 XSTR (copy, i) = XSTR (orig, i);
2686 break;
2687
2688 case '0':
2689 /* Copy this through the wide int field; that's safest. */
2690 X0WINT (copy, i) = X0WINT (orig, i);
2691 break;
2692
2693 default:
2694 abort ();
2695 }
2696 }
2697 return copy;
2698}
2699
15bbde2b 2700/* Mark ORIG as in use, and return a copy of it if it was already in use.
2701 Recursively does the same for subexpressions. */
2702
2703rtx
2704copy_rtx_if_shared (orig)
2705 rtx orig;
2706{
19cb6b50 2707 rtx x = orig;
2708 int i;
2709 enum rtx_code code;
2710 const char *format_ptr;
15bbde2b 2711 int copied = 0;
2712
2713 if (x == 0)
2714 return 0;
2715
2716 code = GET_CODE (x);
2717
2718 /* These types may be freely shared. */
2719
2720 switch (code)
2721 {
2722 case REG:
2723 case QUEUED:
2724 case CONST_INT:
2725 case CONST_DOUBLE:
886cfd4f 2726 case CONST_VECTOR:
15bbde2b 2727 case SYMBOL_REF:
2728 case CODE_LABEL:
2729 case PC:
2730 case CC0:
2731 case SCRATCH:
a92771b8 2732 /* SCRATCH must be shared because they represent distinct values. */
15bbde2b 2733 return x;
2734
f63d12e3 2735 case CONST:
2736 /* CONST can be shared if it contains a SYMBOL_REF. If it contains
2737 a LABEL_REF, it isn't sharable. */
2738 if (GET_CODE (XEXP (x, 0)) == PLUS
2739 && GET_CODE (XEXP (XEXP (x, 0), 0)) == SYMBOL_REF
2740 && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT)
2741 return x;
2742 break;
2743
15bbde2b 2744 case INSN:
2745 case JUMP_INSN:
2746 case CALL_INSN:
2747 case NOTE:
15bbde2b 2748 case BARRIER:
2749 /* The chain of insns is not being copied. */
2750 return x;
2751
2752 case MEM:
baf55c37 2753 /* A MEM is allowed to be shared if its address is constant.
2754
d823ba47 2755 We used to allow sharing of MEMs which referenced
baf55c37 2756 virtual_stack_vars_rtx or virtual_incoming_args_rtx, but
2757 that can lose. instantiate_virtual_regs will not unshare
2758 the MEMs, and combine may change the structure of the address
2759 because it looks safe and profitable in one context, but
2760 in some other context it creates unrecognizable RTL. */
2761 if (CONSTANT_ADDRESS_P (XEXP (x, 0)))
15bbde2b 2762 return x;
2763
0dbd1c74 2764 break;
2765
2766 default:
2767 break;
15bbde2b 2768 }
2769
2770 /* This rtx may not be shared. If it has already been seen,
2771 replace it with a copy of itself. */
2772
7c25cb91 2773 if (RTX_FLAG (x, used))
15bbde2b 2774 {
19cb6b50 2775 rtx copy;
15bbde2b 2776
2777 copy = rtx_alloc (code);
b1b63592 2778 memcpy (copy, x,
748e6d74 2779 (sizeof (*copy) - sizeof (copy->fld)
2780 + sizeof (copy->fld[0]) * GET_RTX_LENGTH (code)));
15bbde2b 2781 x = copy;
2782 copied = 1;
2783 }
7c25cb91 2784 RTX_FLAG (x, used) = 1;
15bbde2b 2785
2786 /* Now scan the subexpressions recursively.
2787 We can store any replaced subexpressions directly into X
2788 since we know X is not shared! Any vectors in X
2789 must be copied if X was copied. */
2790
2791 format_ptr = GET_RTX_FORMAT (code);
2792
2793 for (i = 0; i < GET_RTX_LENGTH (code); i++)
2794 {
2795 switch (*format_ptr++)
2796 {
2797 case 'e':
2798 XEXP (x, i) = copy_rtx_if_shared (XEXP (x, i));
2799 break;
2800
2801 case 'E':
2802 if (XVEC (x, i) != NULL)
2803 {
19cb6b50 2804 int j;
ffe0869b 2805 int len = XVECLEN (x, i);
15bbde2b 2806
ffe0869b 2807 if (copied && len > 0)
a4070a91 2808 XVEC (x, i) = gen_rtvec_v (len, XVEC (x, i)->elem);
ffe0869b 2809 for (j = 0; j < len; j++)
2810 XVECEXP (x, i, j) = copy_rtx_if_shared (XVECEXP (x, i, j));
15bbde2b 2811 }
2812 break;
2813 }
2814 }
2815 return x;
2816}
2817
2818/* Clear all the USED bits in X to allow copy_rtx_if_shared to be used
2819 to look for shared sub-parts. */
2820
2821void
2822reset_used_flags (x)
2823 rtx x;
2824{
19cb6b50 2825 int i, j;
2826 enum rtx_code code;
2827 const char *format_ptr;
15bbde2b 2828
2829 if (x == 0)
2830 return;
2831
2832 code = GET_CODE (x);
2833
c3418f42 2834 /* These types may be freely shared so we needn't do any resetting
15bbde2b 2835 for them. */
2836
2837 switch (code)
2838 {
2839 case REG:
2840 case QUEUED:
2841 case CONST_INT:
2842 case CONST_DOUBLE:
886cfd4f 2843 case CONST_VECTOR:
15bbde2b 2844 case SYMBOL_REF:
2845 case CODE_LABEL:
2846 case PC:
2847 case CC0:
2848 return;
2849
2850 case INSN:
2851 case JUMP_INSN:
2852 case CALL_INSN:
2853 case NOTE:
2854 case LABEL_REF:
2855 case BARRIER:
2856 /* The chain of insns is not being copied. */
2857 return;
d823ba47 2858
0dbd1c74 2859 default:
2860 break;
15bbde2b 2861 }
2862
7c25cb91 2863 RTX_FLAG (x, used) = 0;
15bbde2b 2864
2865 format_ptr = GET_RTX_FORMAT (code);
2866 for (i = 0; i < GET_RTX_LENGTH (code); i++)
2867 {
2868 switch (*format_ptr++)
2869 {
2870 case 'e':
2871 reset_used_flags (XEXP (x, i));
2872 break;
2873
2874 case 'E':
2875 for (j = 0; j < XVECLEN (x, i); j++)
2876 reset_used_flags (XVECEXP (x, i, j));
2877 break;
2878 }
2879 }
2880}
2881\f
2882/* Copy X if necessary so that it won't be altered by changes in OTHER.
2883 Return X or the rtx for the pseudo reg the value of X was copied into.
2884 OTHER must be valid as a SET_DEST. */
2885
2886rtx
2887make_safe_from (x, other)
2888 rtx x, other;
2889{
2890 while (1)
2891 switch (GET_CODE (other))
2892 {
2893 case SUBREG:
2894 other = SUBREG_REG (other);
2895 break;
2896 case STRICT_LOW_PART:
2897 case SIGN_EXTEND:
2898 case ZERO_EXTEND:
2899 other = XEXP (other, 0);
2900 break;
2901 default:
2902 goto done;
2903 }
2904 done:
2905 if ((GET_CODE (other) == MEM
2906 && ! CONSTANT_P (x)
2907 && GET_CODE (x) != REG
2908 && GET_CODE (x) != SUBREG)
2909 || (GET_CODE (other) == REG
2910 && (REGNO (other) < FIRST_PSEUDO_REGISTER
2911 || reg_mentioned_p (other, x))))
2912 {
2913 rtx temp = gen_reg_rtx (GET_MODE (x));
2914 emit_move_insn (temp, x);
2915 return temp;
2916 }
2917 return x;
2918}
2919\f
2920/* Emission of insns (adding them to the doubly-linked list). */
2921
2922/* Return the first insn of the current sequence or current function. */
2923
2924rtx
2925get_insns ()
2926{
2927 return first_insn;
2928}
2929
fb20d6fa 2930/* Specify a new insn as the first in the chain. */
2931
2932void
2933set_first_insn (insn)
2934 rtx insn;
2935{
2936 if (PREV_INSN (insn) != 0)
2937 abort ();
2938 first_insn = insn;
2939}
2940
15bbde2b 2941/* Return the last insn emitted in current sequence or current function. */
2942
2943rtx
2944get_last_insn ()
2945{
2946 return last_insn;
2947}
2948
2949/* Specify a new insn as the last in the chain. */
2950
2951void
2952set_last_insn (insn)
2953 rtx insn;
2954{
2955 if (NEXT_INSN (insn) != 0)
2956 abort ();
2957 last_insn = insn;
2958}
2959
2960/* Return the last insn emitted, even if it is in a sequence now pushed. */
2961
2962rtx
2963get_last_insn_anywhere ()
2964{
2965 struct sequence_stack *stack;
2966 if (last_insn)
2967 return last_insn;
0a893c29 2968 for (stack = seq_stack; stack; stack = stack->next)
15bbde2b 2969 if (stack->last != 0)
2970 return stack->last;
2971 return 0;
2972}
2973
70545de4 2974/* Return the first nonnote insn emitted in current sequence or current
2975 function. This routine looks inside SEQUENCEs. */
2976
2977rtx
2978get_first_nonnote_insn ()
2979{
2980 rtx insn = first_insn;
2981
2982 while (insn)
2983 {
2984 insn = next_insn (insn);
2985 if (insn == 0 || GET_CODE (insn) != NOTE)
2986 break;
2987 }
2988
2989 return insn;
2990}
2991
2992/* Return the last nonnote insn emitted in current sequence or current
2993 function. This routine looks inside SEQUENCEs. */
2994
2995rtx
2996get_last_nonnote_insn ()
2997{
2998 rtx insn = last_insn;
2999
3000 while (insn)
3001 {
3002 insn = previous_insn (insn);
3003 if (insn == 0 || GET_CODE (insn) != NOTE)
3004 break;
3005 }
3006
3007 return insn;
3008}
3009
15bbde2b 3010/* Return a number larger than any instruction's uid in this function. */
3011
3012int
3013get_max_uid ()
3014{
3015 return cur_insn_uid;
3016}
90b89d2c 3017
214d02d0 3018/* Renumber instructions so that no instruction UIDs are wasted. */
3019
90b89d2c 3020void
214d02d0 3021renumber_insns (stream)
3022 FILE *stream;
90b89d2c 3023{
3024 rtx insn;
90b89d2c 3025
214d02d0 3026 /* If we're not supposed to renumber instructions, don't. */
3027 if (!flag_renumber_insns)
3028 return;
3029
90b89d2c 3030 /* If there aren't that many instructions, then it's not really
3031 worth renumbering them. */
214d02d0 3032 if (flag_renumber_insns == 1 && get_max_uid () < 25000)
90b89d2c 3033 return;
3034
3035 cur_insn_uid = 1;
3036
3037 for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
214d02d0 3038 {
3039 if (stream)
d823ba47 3040 fprintf (stream, "Renumbering insn %d to %d\n",
214d02d0 3041 INSN_UID (insn), cur_insn_uid);
3042 INSN_UID (insn) = cur_insn_uid++;
3043 }
90b89d2c 3044}
15bbde2b 3045\f
3046/* Return the next insn. If it is a SEQUENCE, return the first insn
3047 of the sequence. */
3048
3049rtx
3050next_insn (insn)
3051 rtx insn;
3052{
3053 if (insn)
3054 {
3055 insn = NEXT_INSN (insn);
3056 if (insn && GET_CODE (insn) == INSN
3057 && GET_CODE (PATTERN (insn)) == SEQUENCE)
3058 insn = XVECEXP (PATTERN (insn), 0, 0);
3059 }
3060
3061 return insn;
3062}
3063
3064/* Return the previous insn. If it is a SEQUENCE, return the last insn
3065 of the sequence. */
3066
3067rtx
3068previous_insn (insn)
3069 rtx insn;
3070{
3071 if (insn)
3072 {
3073 insn = PREV_INSN (insn);
3074 if (insn && GET_CODE (insn) == INSN
3075 && GET_CODE (PATTERN (insn)) == SEQUENCE)
3076 insn = XVECEXP (PATTERN (insn), 0, XVECLEN (PATTERN (insn), 0) - 1);
3077 }
3078
3079 return insn;
3080}
3081
3082/* Return the next insn after INSN that is not a NOTE. This routine does not
3083 look inside SEQUENCEs. */
3084
3085rtx
3086next_nonnote_insn (insn)
3087 rtx insn;
3088{
3089 while (insn)
3090 {
3091 insn = NEXT_INSN (insn);
3092 if (insn == 0 || GET_CODE (insn) != NOTE)
3093 break;
3094 }
3095
3096 return insn;
3097}
3098
3099/* Return the previous insn before INSN that is not a NOTE. This routine does
3100 not look inside SEQUENCEs. */
3101
3102rtx
3103prev_nonnote_insn (insn)
3104 rtx insn;
3105{
3106 while (insn)
3107 {
3108 insn = PREV_INSN (insn);
3109 if (insn == 0 || GET_CODE (insn) != NOTE)
3110 break;
3111 }
3112
3113 return insn;
3114}
3115
3116/* Return the next INSN, CALL_INSN or JUMP_INSN after INSN;
3117 or 0, if there is none. This routine does not look inside
a92771b8 3118 SEQUENCEs. */
15bbde2b 3119
3120rtx
3121next_real_insn (insn)
3122 rtx insn;
3123{
3124 while (insn)
3125 {
3126 insn = NEXT_INSN (insn);
3127 if (insn == 0 || GET_CODE (insn) == INSN
3128 || GET_CODE (insn) == CALL_INSN || GET_CODE (insn) == JUMP_INSN)
3129 break;
3130 }
3131
3132 return insn;
3133}
3134
3135/* Return the last INSN, CALL_INSN or JUMP_INSN before INSN;
3136 or 0, if there is none. This routine does not look inside
3137 SEQUENCEs. */
3138
3139rtx
3140prev_real_insn (insn)
3141 rtx insn;
3142{
3143 while (insn)
3144 {
3145 insn = PREV_INSN (insn);
3146 if (insn == 0 || GET_CODE (insn) == INSN || GET_CODE (insn) == CALL_INSN
3147 || GET_CODE (insn) == JUMP_INSN)
3148 break;
3149 }
3150
3151 return insn;
3152}
3153
3154/* Find the next insn after INSN that really does something. This routine
3155 does not look inside SEQUENCEs. Until reload has completed, this is the
3156 same as next_real_insn. */
3157
2215ca0d 3158int
3159active_insn_p (insn)
3160 rtx insn;
3161{
3a66feab 3162 return (GET_CODE (insn) == CALL_INSN || GET_CODE (insn) == JUMP_INSN
3163 || (GET_CODE (insn) == INSN
3164 && (! reload_completed
3165 || (GET_CODE (PATTERN (insn)) != USE
3166 && GET_CODE (PATTERN (insn)) != CLOBBER))));
2215ca0d 3167}
3168
15bbde2b 3169rtx
3170next_active_insn (insn)
3171 rtx insn;
3172{
3173 while (insn)
3174 {
3175 insn = NEXT_INSN (insn);
2215ca0d 3176 if (insn == 0 || active_insn_p (insn))
15bbde2b 3177 break;
3178 }
3179
3180 return insn;
3181}
3182
3183/* Find the last insn before INSN that really does something. This routine
3184 does not look inside SEQUENCEs. Until reload has completed, this is the
3185 same as prev_real_insn. */
3186
3187rtx
3188prev_active_insn (insn)
3189 rtx insn;
3190{
3191 while (insn)
3192 {
3193 insn = PREV_INSN (insn);
2215ca0d 3194 if (insn == 0 || active_insn_p (insn))
15bbde2b 3195 break;
3196 }
3197
3198 return insn;
3199}
3200
3201/* Return the next CODE_LABEL after the insn INSN, or 0 if there is none. */
3202
3203rtx
3204next_label (insn)
3205 rtx insn;
3206{
3207 while (insn)
3208 {
3209 insn = NEXT_INSN (insn);
3210 if (insn == 0 || GET_CODE (insn) == CODE_LABEL)
3211 break;
3212 }
3213
3214 return insn;
3215}
3216
3217/* Return the last CODE_LABEL before the insn INSN, or 0 if there is none. */
3218
3219rtx
3220prev_label (insn)
3221 rtx insn;
3222{
3223 while (insn)
3224 {
3225 insn = PREV_INSN (insn);
3226 if (insn == 0 || GET_CODE (insn) == CODE_LABEL)
3227 break;
3228 }
3229
3230 return insn;
3231}
3232\f
3233#ifdef HAVE_cc0
b15e0bba 3234/* INSN uses CC0 and is being moved into a delay slot. Set up REG_CC_SETTER
3235 and REG_CC_USER notes so we can find it. */
3236
3237void
3238link_cc0_insns (insn)
3239 rtx insn;
3240{
3241 rtx user = next_nonnote_insn (insn);
3242
3243 if (GET_CODE (user) == INSN && GET_CODE (PATTERN (user)) == SEQUENCE)
3244 user = XVECEXP (PATTERN (user), 0, 0);
3245
7014838c 3246 REG_NOTES (user) = gen_rtx_INSN_LIST (REG_CC_SETTER, insn,
3247 REG_NOTES (user));
3ad7bb1c 3248 REG_NOTES (insn) = gen_rtx_INSN_LIST (REG_CC_USER, user, REG_NOTES (insn));
b15e0bba 3249}
3250
15bbde2b 3251/* Return the next insn that uses CC0 after INSN, which is assumed to
3252 set it. This is the inverse of prev_cc0_setter (i.e., prev_cc0_setter
3253 applied to the result of this function should yield INSN).
3254
3255 Normally, this is simply the next insn. However, if a REG_CC_USER note
3256 is present, it contains the insn that uses CC0.
3257
3258 Return 0 if we can't find the insn. */
3259
3260rtx
3261next_cc0_user (insn)
3262 rtx insn;
3263{
b572011e 3264 rtx note = find_reg_note (insn, REG_CC_USER, NULL_RTX);
15bbde2b 3265
3266 if (note)
3267 return XEXP (note, 0);
3268
3269 insn = next_nonnote_insn (insn);
3270 if (insn && GET_CODE (insn) == INSN && GET_CODE (PATTERN (insn)) == SEQUENCE)
3271 insn = XVECEXP (PATTERN (insn), 0, 0);
3272
9204e736 3273 if (insn && INSN_P (insn) && reg_mentioned_p (cc0_rtx, PATTERN (insn)))
15bbde2b 3274 return insn;
3275
3276 return 0;
3277}
3278
3279/* Find the insn that set CC0 for INSN. Unless INSN has a REG_CC_SETTER
3280 note, it is the previous insn. */
3281
3282rtx
3283prev_cc0_setter (insn)
3284 rtx insn;
3285{
b572011e 3286 rtx note = find_reg_note (insn, REG_CC_SETTER, NULL_RTX);
15bbde2b 3287
3288 if (note)
3289 return XEXP (note, 0);
3290
3291 insn = prev_nonnote_insn (insn);
3292 if (! sets_cc0_p (PATTERN (insn)))
3293 abort ();
3294
3295 return insn;
3296}
3297#endif
344dc2fa 3298
3299/* Increment the label uses for all labels present in rtx. */
3300
3301static void
d4c5e26d 3302mark_label_nuses (x)
3303 rtx x;
344dc2fa 3304{
19cb6b50 3305 enum rtx_code code;
3306 int i, j;
3307 const char *fmt;
344dc2fa 3308
3309 code = GET_CODE (x);
3310 if (code == LABEL_REF)
3311 LABEL_NUSES (XEXP (x, 0))++;
3312
3313 fmt = GET_RTX_FORMAT (code);
3314 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
3315 {
3316 if (fmt[i] == 'e')
ff385626 3317 mark_label_nuses (XEXP (x, i));
344dc2fa 3318 else if (fmt[i] == 'E')
ff385626 3319 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
344dc2fa 3320 mark_label_nuses (XVECEXP (x, i, j));
3321 }
3322}
3323
15bbde2b 3324\f
3325/* Try splitting insns that can be split for better scheduling.
3326 PAT is the pattern which might split.
3327 TRIAL is the insn providing PAT.
6ef828f9 3328 LAST is nonzero if we should return the last insn of the sequence produced.
15bbde2b 3329
3330 If this routine succeeds in splitting, it returns the first or last
0e69a50a 3331 replacement insn depending on the value of LAST. Otherwise, it
15bbde2b 3332 returns TRIAL. If the insn to be returned can be split, it will be. */
3333
3334rtx
0e69a50a 3335try_split (pat, trial, last)
15bbde2b 3336 rtx pat, trial;
0e69a50a 3337 int last;
15bbde2b 3338{
3339 rtx before = PREV_INSN (trial);
3340 rtx after = NEXT_INSN (trial);
15bbde2b 3341 int has_barrier = 0;
3342 rtx tem;
3cd757b1 3343 rtx note, seq;
3344 int probability;
3345
3346 if (any_condjump_p (trial)
3347 && (note = find_reg_note (trial, REG_BR_PROB, 0)))
3348 split_branch_probability = INTVAL (XEXP (note, 0));
3349 probability = split_branch_probability;
3350
3351 seq = split_insns (pat, trial);
3352
3353 split_branch_probability = -1;
15bbde2b 3354
3355 /* If we are splitting a JUMP_INSN, it might be followed by a BARRIER.
3356 We may need to handle this specially. */
3357 if (after && GET_CODE (after) == BARRIER)
3358 {
3359 has_barrier = 1;
3360 after = NEXT_INSN (after);
3361 }
3362
3363 if (seq)
3364 {
31d3e01c 3365 /* Sometimes there will be only one insn in that list, this case will
3366 normally arise only when we want it in turn to be split (SFmode on
3367 the 29k is an example). */
3368 if (NEXT_INSN (seq) != NULL_RTX)
15bbde2b 3369 {
31d3e01c 3370 rtx insn_last, insn;
3371 int njumps = 0;
d823ba47 3372
3373 /* Avoid infinite loop if any insn of the result matches
5262c253 3374 the original pattern. */
31d3e01c 3375 insn_last = seq;
3376 while (1)
3377 {
6dfbc018 3378 if (INSN_P (insn_last)
3379 && rtx_equal_p (PATTERN (insn_last), pat))
31d3e01c 3380 return trial;
3381 if (NEXT_INSN (insn_last) == NULL_RTX)
3382 break;
3383 insn_last = NEXT_INSN (insn_last);
3384 }
5262c253 3385
5377f687 3386 /* Mark labels. */
31d3e01c 3387 insn = insn_last;
3388 while (insn != NULL_RTX)
3389 {
3390 if (GET_CODE (insn) == JUMP_INSN)
3391 {
3392 mark_jump_label (PATTERN (insn), insn, 0);
3393 njumps++;
3394 if (probability != -1
3395 && any_condjump_p (insn)
3396 && !find_reg_note (insn, REG_BR_PROB, 0))
3397 {
3398 /* We can preserve the REG_BR_PROB notes only if exactly
3399 one jump is created, otherwise the machine description
3400 is responsible for this step using
3401 split_branch_probability variable. */
3402 if (njumps != 1)
3403 abort ();
3404 REG_NOTES (insn)
3405 = gen_rtx_EXPR_LIST (REG_BR_PROB,
3406 GEN_INT (probability),
3407 REG_NOTES (insn));
3408 }
3409 }
3410
3411 insn = PREV_INSN (insn);
3412 }
381eb1e7 3413
1b3a64a8 3414 /* If we are splitting a CALL_INSN, look for the CALL_INSN
3415 in SEQ and copy our CALL_INSN_FUNCTION_USAGE to it. */
3416 if (GET_CODE (trial) == CALL_INSN)
31d3e01c 3417 {
3418 insn = insn_last;
3419 while (insn != NULL_RTX)
3420 {
3421 if (GET_CODE (insn) == CALL_INSN)
3422 CALL_INSN_FUNCTION_USAGE (insn)
3423 = CALL_INSN_FUNCTION_USAGE (trial);
3424
3425 insn = PREV_INSN (insn);
3426 }
3427 }
1b3a64a8 3428
381eb1e7 3429 /* Copy notes, particularly those related to the CFG. */
d4c5e26d 3430 for (note = REG_NOTES (trial); note; note = XEXP (note, 1))
381eb1e7 3431 {
3432 switch (REG_NOTE_KIND (note))
3433 {
3434 case REG_EH_REGION:
31d3e01c 3435 insn = insn_last;
3436 while (insn != NULL_RTX)
381eb1e7 3437 {
381eb1e7 3438 if (GET_CODE (insn) == CALL_INSN
3439 || (flag_non_call_exceptions
3440 && may_trap_p (PATTERN (insn))))
3441 REG_NOTES (insn)
3442 = gen_rtx_EXPR_LIST (REG_EH_REGION,
3443 XEXP (note, 0),
3444 REG_NOTES (insn));
31d3e01c 3445 insn = PREV_INSN (insn);
381eb1e7 3446 }
3447 break;
3448
3449 case REG_NORETURN:
3450 case REG_SETJMP:
3451 case REG_ALWAYS_RETURN:
31d3e01c 3452 insn = insn_last;
3453 while (insn != NULL_RTX)
381eb1e7 3454 {
381eb1e7 3455 if (GET_CODE (insn) == CALL_INSN)
3456 REG_NOTES (insn)
3457 = gen_rtx_EXPR_LIST (REG_NOTE_KIND (note),
3458 XEXP (note, 0),
3459 REG_NOTES (insn));
31d3e01c 3460 insn = PREV_INSN (insn);
381eb1e7 3461 }
3462 break;
3463
3464 case REG_NON_LOCAL_GOTO:
31d3e01c 3465 insn = insn_last;
3466 while (insn != NULL_RTX)
381eb1e7 3467 {
381eb1e7 3468 if (GET_CODE (insn) == JUMP_INSN)
3469 REG_NOTES (insn)
3470 = gen_rtx_EXPR_LIST (REG_NOTE_KIND (note),
3471 XEXP (note, 0),
3472 REG_NOTES (insn));
31d3e01c 3473 insn = PREV_INSN (insn);
381eb1e7 3474 }
3475 break;
3476
3477 default:
3478 break;
3479 }
3480 }
5bb27a4b 3481
344dc2fa 3482 /* If there are LABELS inside the split insns increment the
3483 usage count so we don't delete the label. */
3484 if (GET_CODE (trial) == INSN)
31d3e01c 3485 {
0a882416 3486 insn = insn_last;
31d3e01c 3487 while (insn != NULL_RTX)
3488 {
3489 if (GET_CODE (insn) == INSN)
3490 mark_label_nuses (PATTERN (insn));
3491
3492 insn = PREV_INSN (insn);
3493 }
3494 }
344dc2fa 3495
d321a68b 3496 tem = emit_insn_after_scope (seq, trial, INSN_SCOPE (trial));
15bbde2b 3497
0f43048e 3498 delete_insn (trial);
15bbde2b 3499 if (has_barrier)
3500 emit_barrier_after (tem);
0e69a50a 3501
3502 /* Recursively call try_split for each new insn created; by the
3503 time control returns here that insn will be fully split, so
3504 set LAST and continue from the insn after the one returned.
06343e77 3505 We can't use next_active_insn here since AFTER may be a note.
ab6683d6 3506 Ignore deleted insns, which can be occur if not optimizing. */
9204e736 3507 for (tem = NEXT_INSN (before); tem != after; tem = NEXT_INSN (tem))
3508 if (! INSN_DELETED_P (tem) && INSN_P (tem))
06343e77 3509 tem = try_split (PATTERN (tem), tem, 1);
15bbde2b 3510 }
3511 /* Avoid infinite loop if the result matches the original pattern. */
31d3e01c 3512 else if (rtx_equal_p (PATTERN (seq), pat))
15bbde2b 3513 return trial;
3514 else
3515 {
31d3e01c 3516 PATTERN (trial) = PATTERN (seq);
15bbde2b 3517 INSN_CODE (trial) = -1;
31d3e01c 3518 try_split (PATTERN (trial), trial, last);
15bbde2b 3519 }
3520
0e69a50a 3521 /* Return either the first or the last insn, depending on which was
3522 requested. */
d823ba47 3523 return last
3cd757b1 3524 ? (after ? PREV_INSN (after) : last_insn)
3525 : NEXT_INSN (before);
15bbde2b 3526 }
3527
3528 return trial;
3529}
3530\f
3531/* Make and return an INSN rtx, initializing all its slots.
6a84e367 3532 Store PATTERN in the pattern slots. */
15bbde2b 3533
3534rtx
6a84e367 3535make_insn_raw (pattern)
15bbde2b 3536 rtx pattern;
15bbde2b 3537{
19cb6b50 3538 rtx insn;
15bbde2b 3539
d7c47c0e 3540 insn = rtx_alloc (INSN);
15bbde2b 3541
575333f9 3542 INSN_UID (insn) = cur_insn_uid++;
15bbde2b 3543 PATTERN (insn) = pattern;
3544 INSN_CODE (insn) = -1;
fc92fa61 3545 LOG_LINKS (insn) = NULL;
3546 REG_NOTES (insn) = NULL;
ab87d1bc 3547 INSN_SCOPE (insn) = NULL;
3548 BLOCK_FOR_INSN (insn) = NULL;
15bbde2b 3549
fe7f701d 3550#ifdef ENABLE_RTL_CHECKING
3551 if (insn
9204e736 3552 && INSN_P (insn)
fe7f701d 3553 && (returnjump_p (insn)
3554 || (GET_CODE (insn) == SET
3555 && SET_DEST (insn) == pc_rtx)))
3556 {
3557 warning ("ICE: emit_insn used where emit_jump_insn needed:\n");
3558 debug_rtx (insn);
3559 }
3560#endif
d823ba47 3561
15bbde2b 3562 return insn;
3563}
3564
31d3e01c 3565/* Like `make_insn_raw' but make a JUMP_INSN instead of an insn. */
15bbde2b 3566
3567static rtx
6a84e367 3568make_jump_insn_raw (pattern)
15bbde2b 3569 rtx pattern;
15bbde2b 3570{
19cb6b50 3571 rtx insn;
15bbde2b 3572
6a84e367 3573 insn = rtx_alloc (JUMP_INSN);
fc92fa61 3574 INSN_UID (insn) = cur_insn_uid++;
15bbde2b 3575
3576 PATTERN (insn) = pattern;
3577 INSN_CODE (insn) = -1;
fc92fa61 3578 LOG_LINKS (insn) = NULL;
3579 REG_NOTES (insn) = NULL;
3580 JUMP_LABEL (insn) = NULL;
ab87d1bc 3581 INSN_SCOPE (insn) = NULL;
3582 BLOCK_FOR_INSN (insn) = NULL;
15bbde2b 3583
3584 return insn;
3585}
6e911104 3586
31d3e01c 3587/* Like `make_insn_raw' but make a CALL_INSN instead of an insn. */
6e911104 3588
3589static rtx
3590make_call_insn_raw (pattern)
3591 rtx pattern;
3592{
19cb6b50 3593 rtx insn;
6e911104 3594
3595 insn = rtx_alloc (CALL_INSN);
3596 INSN_UID (insn) = cur_insn_uid++;
3597
3598 PATTERN (insn) = pattern;
3599 INSN_CODE (insn) = -1;
3600 LOG_LINKS (insn) = NULL;
3601 REG_NOTES (insn) = NULL;
3602 CALL_INSN_FUNCTION_USAGE (insn) = NULL;
ab87d1bc 3603 INSN_SCOPE (insn) = NULL;
3604 BLOCK_FOR_INSN (insn) = NULL;
6e911104 3605
3606 return insn;
3607}
15bbde2b 3608\f
3609/* Add INSN to the end of the doubly-linked list.
3610 INSN may be an INSN, JUMP_INSN, CALL_INSN, CODE_LABEL, BARRIER or NOTE. */
3611
3612void
3613add_insn (insn)
19cb6b50 3614 rtx insn;
15bbde2b 3615{
3616 PREV_INSN (insn) = last_insn;
3617 NEXT_INSN (insn) = 0;
3618
3619 if (NULL != last_insn)
3620 NEXT_INSN (last_insn) = insn;
3621
3622 if (NULL == first_insn)
3623 first_insn = insn;
3624
3625 last_insn = insn;
3626}
3627
312de84d 3628/* Add INSN into the doubly-linked list after insn AFTER. This and
3629 the next should be the only functions called to insert an insn once
f65c10c0 3630 delay slots have been filled since only they know how to update a
312de84d 3631 SEQUENCE. */
15bbde2b 3632
3633void
3634add_insn_after (insn, after)
3635 rtx insn, after;
3636{
3637 rtx next = NEXT_INSN (after);
9dda7915 3638 basic_block bb;
15bbde2b 3639
9ea33026 3640 if (optimize && INSN_DELETED_P (after))
f65c10c0 3641 abort ();
3642
15bbde2b 3643 NEXT_INSN (insn) = next;
3644 PREV_INSN (insn) = after;
3645
3646 if (next)
3647 {
3648 PREV_INSN (next) = insn;
3649 if (GET_CODE (next) == INSN && GET_CODE (PATTERN (next)) == SEQUENCE)
3650 PREV_INSN (XVECEXP (PATTERN (next), 0, 0)) = insn;
3651 }
3652 else if (last_insn == after)
3653 last_insn = insn;
3654 else
3655 {
0a893c29 3656 struct sequence_stack *stack = seq_stack;
15bbde2b 3657 /* Scan all pending sequences too. */
3658 for (; stack; stack = stack->next)
3659 if (after == stack->last)
398f4855 3660 {
3661 stack->last = insn;
3662 break;
3663 }
312de84d 3664
3665 if (stack == 0)
3666 abort ();
15bbde2b 3667 }
3668
ab87d1bc 3669 if (GET_CODE (after) != BARRIER
3670 && GET_CODE (insn) != BARRIER
9dda7915 3671 && (bb = BLOCK_FOR_INSN (after)))
3672 {
3673 set_block_for_insn (insn, bb);
308f9b79 3674 if (INSN_P (insn))
d4c5e26d 3675 bb->flags |= BB_DIRTY;
9dda7915 3676 /* Should not happen as first in the BB is always
3fb1e43b 3677 either NOTE or LABEL. */
9dda7915 3678 if (bb->end == after
3679 /* Avoid clobbering of structure when creating new BB. */
3680 && GET_CODE (insn) != BARRIER
3681 && (GET_CODE (insn) != NOTE
3682 || NOTE_LINE_NUMBER (insn) != NOTE_INSN_BASIC_BLOCK))
3683 bb->end = insn;
3684 }
3685
15bbde2b 3686 NEXT_INSN (after) = insn;
3687 if (GET_CODE (after) == INSN && GET_CODE (PATTERN (after)) == SEQUENCE)
3688 {
3689 rtx sequence = PATTERN (after);
3690 NEXT_INSN (XVECEXP (sequence, 0, XVECLEN (sequence, 0) - 1)) = insn;
3691 }
3692}
3693
312de84d 3694/* Add INSN into the doubly-linked list before insn BEFORE. This and
3695 the previous should be the only functions called to insert an insn once
f65c10c0 3696 delay slots have been filled since only they know how to update a
312de84d 3697 SEQUENCE. */
3698
3699void
3700add_insn_before (insn, before)
3701 rtx insn, before;
3702{
3703 rtx prev = PREV_INSN (before);
9dda7915 3704 basic_block bb;
312de84d 3705
9ea33026 3706 if (optimize && INSN_DELETED_P (before))
f65c10c0 3707 abort ();
3708
312de84d 3709 PREV_INSN (insn) = prev;
3710 NEXT_INSN (insn) = before;
3711
3712 if (prev)
3713 {
3714 NEXT_INSN (prev) = insn;
3715 if (GET_CODE (prev) == INSN && GET_CODE (PATTERN (prev)) == SEQUENCE)
3716 {
3717 rtx sequence = PATTERN (prev);
3718 NEXT_INSN (XVECEXP (sequence, 0, XVECLEN (sequence, 0) - 1)) = insn;
3719 }
3720 }
3721 else if (first_insn == before)
3722 first_insn = insn;
3723 else
3724 {
0a893c29 3725 struct sequence_stack *stack = seq_stack;
312de84d 3726 /* Scan all pending sequences too. */
3727 for (; stack; stack = stack->next)
3728 if (before == stack->first)
398f4855 3729 {
3730 stack->first = insn;
3731 break;
3732 }
312de84d 3733
3734 if (stack == 0)
3735 abort ();
3736 }
3737
ab87d1bc 3738 if (GET_CODE (before) != BARRIER
3739 && GET_CODE (insn) != BARRIER
9dda7915 3740 && (bb = BLOCK_FOR_INSN (before)))
3741 {
3742 set_block_for_insn (insn, bb);
308f9b79 3743 if (INSN_P (insn))
d4c5e26d 3744 bb->flags |= BB_DIRTY;
9dda7915 3745 /* Should not happen as first in the BB is always
3fb1e43b 3746 either NOTE or LABEl. */
9dda7915 3747 if (bb->head == insn
3748 /* Avoid clobbering of structure when creating new BB. */
3749 && GET_CODE (insn) != BARRIER
3750 && (GET_CODE (insn) != NOTE
3751 || NOTE_LINE_NUMBER (insn) != NOTE_INSN_BASIC_BLOCK))
3752 abort ();
3753 }
3754
312de84d 3755 PREV_INSN (before) = insn;
3756 if (GET_CODE (before) == INSN && GET_CODE (PATTERN (before)) == SEQUENCE)
3757 PREV_INSN (XVECEXP (PATTERN (before), 0, 0)) = insn;
3758}
3759
7ddcf2bf 3760/* Remove an insn from its doubly-linked list. This function knows how
3761 to handle sequences. */
3762void
3763remove_insn (insn)
3764 rtx insn;
3765{
3766 rtx next = NEXT_INSN (insn);
3767 rtx prev = PREV_INSN (insn);
e4bf866d 3768 basic_block bb;
3769
7ddcf2bf 3770 if (prev)
3771 {
3772 NEXT_INSN (prev) = next;
3773 if (GET_CODE (prev) == INSN && GET_CODE (PATTERN (prev)) == SEQUENCE)
3774 {
3775 rtx sequence = PATTERN (prev);
3776 NEXT_INSN (XVECEXP (sequence, 0, XVECLEN (sequence, 0) - 1)) = next;
3777 }
3778 }
3779 else if (first_insn == insn)
3780 first_insn = next;
3781 else
3782 {
0a893c29 3783 struct sequence_stack *stack = seq_stack;
7ddcf2bf 3784 /* Scan all pending sequences too. */
3785 for (; stack; stack = stack->next)
3786 if (insn == stack->first)
3787 {
3788 stack->first = next;
3789 break;
3790 }
3791
3792 if (stack == 0)
3793 abort ();
3794 }
3795
3796 if (next)
3797 {
3798 PREV_INSN (next) = prev;
3799 if (GET_CODE (next) == INSN && GET_CODE (PATTERN (next)) == SEQUENCE)
3800 PREV_INSN (XVECEXP (PATTERN (next), 0, 0)) = prev;
3801 }
3802 else if (last_insn == insn)
3803 last_insn = prev;
3804 else
3805 {
0a893c29 3806 struct sequence_stack *stack = seq_stack;
7ddcf2bf 3807 /* Scan all pending sequences too. */
3808 for (; stack; stack = stack->next)
3809 if (insn == stack->last)
3810 {
3811 stack->last = prev;
3812 break;
3813 }
3814
3815 if (stack == 0)
3816 abort ();
3817 }
ab87d1bc 3818 if (GET_CODE (insn) != BARRIER
e4bf866d 3819 && (bb = BLOCK_FOR_INSN (insn)))
3820 {
308f9b79 3821 if (INSN_P (insn))
d4c5e26d 3822 bb->flags |= BB_DIRTY;
e4bf866d 3823 if (bb->head == insn)
3824 {
f4aee538 3825 /* Never ever delete the basic block note without deleting whole
3826 basic block. */
e4bf866d 3827 if (GET_CODE (insn) == NOTE)
3828 abort ();
3829 bb->head = next;
3830 }
3831 if (bb->end == insn)
3832 bb->end = prev;
3833 }
7ddcf2bf 3834}
3835
15bbde2b 3836/* Delete all insns made since FROM.
3837 FROM becomes the new last instruction. */
3838
3839void
3840delete_insns_since (from)
3841 rtx from;
3842{
3843 if (from == 0)
3844 first_insn = 0;
3845 else
3846 NEXT_INSN (from) = 0;
3847 last_insn = from;
3848}
3849
34e2ddcd 3850/* This function is deprecated, please use sequences instead.
3851
3852 Move a consecutive bunch of insns to a different place in the chain.
15bbde2b 3853 The insns to be moved are those between FROM and TO.
3854 They are moved to a new position after the insn AFTER.
3855 AFTER must not be FROM or TO or any insn in between.
3856
3857 This function does not know about SEQUENCEs and hence should not be
3858 called after delay-slot filling has been done. */
3859
3860void
9dda7915 3861reorder_insns_nobb (from, to, after)
15bbde2b 3862 rtx from, to, after;
3863{
3864 /* Splice this bunch out of where it is now. */
3865 if (PREV_INSN (from))
3866 NEXT_INSN (PREV_INSN (from)) = NEXT_INSN (to);
3867 if (NEXT_INSN (to))
3868 PREV_INSN (NEXT_INSN (to)) = PREV_INSN (from);
3869 if (last_insn == to)
3870 last_insn = PREV_INSN (from);
3871 if (first_insn == from)
3872 first_insn = NEXT_INSN (to);
3873
3874 /* Make the new neighbors point to it and it to them. */
3875 if (NEXT_INSN (after))
3876 PREV_INSN (NEXT_INSN (after)) = to;
3877
3878 NEXT_INSN (to) = NEXT_INSN (after);
3879 PREV_INSN (from) = after;
3880 NEXT_INSN (after) = from;
3881 if (after == last_insn)
3882 last_insn = to;
3883}
3884
9dda7915 3885/* Same as function above, but take care to update BB boundaries. */
3886void
3887reorder_insns (from, to, after)
3888 rtx from, to, after;
3889{
3890 rtx prev = PREV_INSN (from);
3891 basic_block bb, bb2;
3892
3893 reorder_insns_nobb (from, to, after);
3894
ab87d1bc 3895 if (GET_CODE (after) != BARRIER
9dda7915 3896 && (bb = BLOCK_FOR_INSN (after)))
3897 {
3898 rtx x;
308f9b79 3899 bb->flags |= BB_DIRTY;
d4c5e26d 3900
ab87d1bc 3901 if (GET_CODE (from) != BARRIER
9dda7915 3902 && (bb2 = BLOCK_FOR_INSN (from)))
3903 {
3904 if (bb2->end == to)
3905 bb2->end = prev;
308f9b79 3906 bb2->flags |= BB_DIRTY;
9dda7915 3907 }
3908
3909 if (bb->end == after)
3910 bb->end = to;
3911
3912 for (x = from; x != NEXT_INSN (to); x = NEXT_INSN (x))
3913 set_block_for_insn (x, bb);
3914 }
3915}
3916
15bbde2b 3917/* Return the line note insn preceding INSN. */
3918
3919static rtx
3920find_line_note (insn)
3921 rtx insn;
3922{
3923 if (no_line_numbers)
3924 return 0;
3925
3926 for (; insn; insn = PREV_INSN (insn))
3927 if (GET_CODE (insn) == NOTE
ff385626 3928 && NOTE_LINE_NUMBER (insn) >= 0)
15bbde2b 3929 break;
3930
3931 return insn;
3932}
3933
3934/* Like reorder_insns, but inserts line notes to preserve the line numbers
3935 of the moved insns when debugging. This may insert a note between AFTER
3936 and FROM, and another one after TO. */
3937
3938void
3939reorder_insns_with_line_notes (from, to, after)
3940 rtx from, to, after;
3941{
3942 rtx from_line = find_line_note (from);
3943 rtx after_line = find_line_note (after);
3944
3945 reorder_insns (from, to, after);
3946
3947 if (from_line == after_line)
3948 return;
3949
3950 if (from_line)
3951 emit_line_note_after (NOTE_SOURCE_FILE (from_line),
3952 NOTE_LINE_NUMBER (from_line),
3953 after);
3954 if (after_line)
3955 emit_line_note_after (NOTE_SOURCE_FILE (after_line),
3956 NOTE_LINE_NUMBER (after_line),
3957 to);
3958}
90b89d2c 3959
0a78547b 3960/* Remove unnecessary notes from the instruction stream. */
90b89d2c 3961
3962void
0a78547b 3963remove_unnecessary_notes ()
90b89d2c 3964{
92cfc4a8 3965 rtx block_stack = NULL_RTX;
3966 rtx eh_stack = NULL_RTX;
90b89d2c 3967 rtx insn;
3968 rtx next;
92cfc4a8 3969 rtx tmp;
90b89d2c 3970
f1ab82be 3971 /* We must not remove the first instruction in the function because
3972 the compiler depends on the first instruction being a note. */
90b89d2c 3973 for (insn = NEXT_INSN (get_insns ()); insn; insn = next)
3974 {
3975 /* Remember what's next. */
3976 next = NEXT_INSN (insn);
3977
3978 /* We're only interested in notes. */
3979 if (GET_CODE (insn) != NOTE)
3980 continue;
3981
92cfc4a8 3982 switch (NOTE_LINE_NUMBER (insn))
5846cb0f 3983 {
92cfc4a8 3984 case NOTE_INSN_DELETED:
cab14df7 3985 case NOTE_INSN_LOOP_END_TOP_COND:
92cfc4a8 3986 remove_insn (insn);
3987 break;
3988
3989 case NOTE_INSN_EH_REGION_BEG:
3990 eh_stack = alloc_INSN_LIST (insn, eh_stack);
3991 break;
3992
3993 case NOTE_INSN_EH_REGION_END:
3994 /* Too many end notes. */
3995 if (eh_stack == NULL_RTX)
3996 abort ();
3997 /* Mismatched nesting. */
3998 if (NOTE_EH_HANDLER (XEXP (eh_stack, 0)) != NOTE_EH_HANDLER (insn))
3999 abort ();
4000 tmp = eh_stack;
4001 eh_stack = XEXP (eh_stack, 1);
4002 free_INSN_LIST_node (tmp);
4003 break;
4004
4005 case NOTE_INSN_BLOCK_BEG:
4006 /* By now, all notes indicating lexical blocks should have
4007 NOTE_BLOCK filled in. */
4008 if (NOTE_BLOCK (insn) == NULL_TREE)
4009 abort ();
4010 block_stack = alloc_INSN_LIST (insn, block_stack);
4011 break;
4012
4013 case NOTE_INSN_BLOCK_END:
4014 /* Too many end notes. */
4015 if (block_stack == NULL_RTX)
4016 abort ();
4017 /* Mismatched nesting. */
4018 if (NOTE_BLOCK (XEXP (block_stack, 0)) != NOTE_BLOCK (insn))
4019 abort ();
4020 tmp = block_stack;
4021 block_stack = XEXP (block_stack, 1);
4022 free_INSN_LIST_node (tmp);
4023
5846cb0f 4024 /* Scan back to see if there are any non-note instructions
4025 between INSN and the beginning of this block. If not,
4026 then there is no PC range in the generated code that will
4027 actually be in this block, so there's no point in
4028 remembering the existence of the block. */
d4c5e26d 4029 for (tmp = PREV_INSN (insn); tmp; tmp = PREV_INSN (tmp))
5846cb0f 4030 {
4031 /* This block contains a real instruction. Note that we
4032 don't include labels; if the only thing in the block
4033 is a label, then there are still no PC values that
4034 lie within the block. */
92cfc4a8 4035 if (INSN_P (tmp))
5846cb0f 4036 break;
4037
4038 /* We're only interested in NOTEs. */
92cfc4a8 4039 if (GET_CODE (tmp) != NOTE)
5846cb0f 4040 continue;
4041
92cfc4a8 4042 if (NOTE_LINE_NUMBER (tmp) == NOTE_INSN_BLOCK_BEG)
5846cb0f 4043 {
b29760a8 4044 /* We just verified that this BLOCK matches us with
4045 the block_stack check above. Never delete the
4046 BLOCK for the outermost scope of the function; we
4047 can refer to names from that scope even if the
4048 block notes are messed up. */
4049 if (! is_body_block (NOTE_BLOCK (insn))
4050 && (*debug_hooks->ignore_block) (NOTE_BLOCK (insn)))
e33dbbdf 4051 {
92cfc4a8 4052 remove_insn (tmp);
e33dbbdf 4053 remove_insn (insn);
4054 }
5846cb0f 4055 break;
4056 }
92cfc4a8 4057 else if (NOTE_LINE_NUMBER (tmp) == NOTE_INSN_BLOCK_END)
5846cb0f 4058 /* There's a nested block. We need to leave the
4059 current block in place since otherwise the debugger
4060 wouldn't be able to show symbols from our block in
4061 the nested block. */
4062 break;
4063 }
4064 }
90b89d2c 4065 }
92cfc4a8 4066
4067 /* Too many begin notes. */
4068 if (block_stack || eh_stack)
4069 abort ();
90b89d2c 4070}
4071
15bbde2b 4072\f
31d3e01c 4073/* Emit insn(s) of given code and pattern
4074 at a specified place within the doubly-linked list.
15bbde2b 4075
31d3e01c 4076 All of the emit_foo global entry points accept an object
4077 X which is either an insn list or a PATTERN of a single
4078 instruction.
15bbde2b 4079
31d3e01c 4080 There are thus a few canonical ways to generate code and
4081 emit it at a specific place in the instruction stream. For
4082 example, consider the instruction named SPOT and the fact that
4083 we would like to emit some instructions before SPOT. We might
4084 do it like this:
15bbde2b 4085
31d3e01c 4086 start_sequence ();
4087 ... emit the new instructions ...
4088 insns_head = get_insns ();
4089 end_sequence ();
15bbde2b 4090
31d3e01c 4091 emit_insn_before (insns_head, SPOT);
15bbde2b 4092
31d3e01c 4093 It used to be common to generate SEQUENCE rtl instead, but that
4094 is a relic of the past which no longer occurs. The reason is that
4095 SEQUENCE rtl results in much fragmented RTL memory since the SEQUENCE
4096 generated would almost certainly die right after it was created. */
15bbde2b 4097
31d3e01c 4098/* Make X be output before the instruction BEFORE. */
15bbde2b 4099
4100rtx
31d3e01c 4101emit_insn_before (x, before)
4102 rtx x, before;
15bbde2b 4103{
31d3e01c 4104 rtx last = before;
19cb6b50 4105 rtx insn;
15bbde2b 4106
31d3e01c 4107#ifdef ENABLE_RTL_CHECKING
4108 if (before == NULL_RTX)
4109 abort ();
4110#endif
4111
4112 if (x == NULL_RTX)
4113 return last;
4114
4115 switch (GET_CODE (x))
15bbde2b 4116 {
31d3e01c 4117 case INSN:
4118 case JUMP_INSN:
4119 case CALL_INSN:
4120 case CODE_LABEL:
4121 case BARRIER:
4122 case NOTE:
4123 insn = x;
4124 while (insn)
4125 {
4126 rtx next = NEXT_INSN (insn);
4127 add_insn_before (insn, before);
4128 last = insn;
4129 insn = next;
4130 }
4131 break;
4132
4133#ifdef ENABLE_RTL_CHECKING
4134 case SEQUENCE:
4135 abort ();
4136 break;
4137#endif
4138
4139 default:
4140 last = make_insn_raw (x);
4141 add_insn_before (last, before);
4142 break;
15bbde2b 4143 }
4144
31d3e01c 4145 return last;
15bbde2b 4146}
4147
31d3e01c 4148/* Make an instruction with body X and code JUMP_INSN
15bbde2b 4149 and output it before the instruction BEFORE. */
4150
4151rtx
31d3e01c 4152emit_jump_insn_before (x, before)
4153 rtx x, before;
15bbde2b 4154{
d90b3d04 4155 rtx insn, last = NULL_RTX;
6e911104 4156
31d3e01c 4157#ifdef ENABLE_RTL_CHECKING
4158 if (before == NULL_RTX)
4159 abort ();
4160#endif
4161
4162 switch (GET_CODE (x))
6e911104 4163 {
31d3e01c 4164 case INSN:
4165 case JUMP_INSN:
4166 case CALL_INSN:
4167 case CODE_LABEL:
4168 case BARRIER:
4169 case NOTE:
4170 insn = x;
4171 while (insn)
4172 {
4173 rtx next = NEXT_INSN (insn);
4174 add_insn_before (insn, before);
4175 last = insn;
4176 insn = next;
4177 }
4178 break;
4179
4180#ifdef ENABLE_RTL_CHECKING
4181 case SEQUENCE:
4182 abort ();
4183 break;
4184#endif
4185
4186 default:
4187 last = make_jump_insn_raw (x);
4188 add_insn_before (last, before);
4189 break;
6e911104 4190 }
4191
31d3e01c 4192 return last;
15bbde2b 4193}
4194
31d3e01c 4195/* Make an instruction with body X and code CALL_INSN
cd0fe062 4196 and output it before the instruction BEFORE. */
4197
4198rtx
31d3e01c 4199emit_call_insn_before (x, before)
4200 rtx x, before;
cd0fe062 4201{
d90b3d04 4202 rtx last = NULL_RTX, insn;
cd0fe062 4203
31d3e01c 4204#ifdef ENABLE_RTL_CHECKING
4205 if (before == NULL_RTX)
4206 abort ();
4207#endif
4208
4209 switch (GET_CODE (x))
cd0fe062 4210 {
31d3e01c 4211 case INSN:
4212 case JUMP_INSN:
4213 case CALL_INSN:
4214 case CODE_LABEL:
4215 case BARRIER:
4216 case NOTE:
4217 insn = x;
4218 while (insn)
4219 {
4220 rtx next = NEXT_INSN (insn);
4221 add_insn_before (insn, before);
4222 last = insn;
4223 insn = next;
4224 }
4225 break;
4226
4227#ifdef ENABLE_RTL_CHECKING
4228 case SEQUENCE:
4229 abort ();
4230 break;
4231#endif
4232
4233 default:
4234 last = make_call_insn_raw (x);
4235 add_insn_before (last, before);
4236 break;
cd0fe062 4237 }
4238
31d3e01c 4239 return last;
cd0fe062 4240}
4241
15bbde2b 4242/* Make an insn of code BARRIER
71caadc0 4243 and output it before the insn BEFORE. */
15bbde2b 4244
4245rtx
4246emit_barrier_before (before)
19cb6b50 4247 rtx before;
15bbde2b 4248{
19cb6b50 4249 rtx insn = rtx_alloc (BARRIER);
15bbde2b 4250
4251 INSN_UID (insn) = cur_insn_uid++;
4252
312de84d 4253 add_insn_before (insn, before);
15bbde2b 4254 return insn;
4255}
4256
71caadc0 4257/* Emit the label LABEL before the insn BEFORE. */
4258
4259rtx
4260emit_label_before (label, before)
4261 rtx label, before;
4262{
4263 /* This can be called twice for the same label as a result of the
4264 confusion that follows a syntax error! So make it harmless. */
4265 if (INSN_UID (label) == 0)
4266 {
4267 INSN_UID (label) = cur_insn_uid++;
4268 add_insn_before (label, before);
4269 }
4270
4271 return label;
4272}
4273
15bbde2b 4274/* Emit a note of subtype SUBTYPE before the insn BEFORE. */
4275
4276rtx
4277emit_note_before (subtype, before)
4278 int subtype;
4279 rtx before;
4280{
19cb6b50 4281 rtx note = rtx_alloc (NOTE);
15bbde2b 4282 INSN_UID (note) = cur_insn_uid++;
4283 NOTE_SOURCE_FILE (note) = 0;
4284 NOTE_LINE_NUMBER (note) = subtype;
ab87d1bc 4285 BLOCK_FOR_INSN (note) = NULL;
15bbde2b 4286
312de84d 4287 add_insn_before (note, before);
15bbde2b 4288 return note;
4289}
4290\f
31d3e01c 4291/* Helper for emit_insn_after, handles lists of instructions
4292 efficiently. */
15bbde2b 4293
31d3e01c 4294static rtx emit_insn_after_1 PARAMS ((rtx, rtx));
4295
4296static rtx
4297emit_insn_after_1 (first, after)
4298 rtx first, after;
15bbde2b 4299{
31d3e01c 4300 rtx last;
4301 rtx after_after;
4302 basic_block bb;
15bbde2b 4303
31d3e01c 4304 if (GET_CODE (after) != BARRIER
4305 && (bb = BLOCK_FOR_INSN (after)))
15bbde2b 4306 {
31d3e01c 4307 bb->flags |= BB_DIRTY;
4308 for (last = first; NEXT_INSN (last); last = NEXT_INSN (last))
4309 if (GET_CODE (last) != BARRIER)
4310 set_block_for_insn (last, bb);
4311 if (GET_CODE (last) != BARRIER)
4312 set_block_for_insn (last, bb);
4313 if (bb->end == after)
4314 bb->end = last;
15bbde2b 4315 }
4316 else
31d3e01c 4317 for (last = first; NEXT_INSN (last); last = NEXT_INSN (last))
4318 continue;
4319
4320 after_after = NEXT_INSN (after);
4321
4322 NEXT_INSN (after) = first;
4323 PREV_INSN (first) = after;
4324 NEXT_INSN (last) = after_after;
4325 if (after_after)
4326 PREV_INSN (after_after) = last;
4327
4328 if (after == last_insn)
4329 last_insn = last;
4330 return last;
4331}
4332
4333/* Make X be output after the insn AFTER. */
4334
4335rtx
4336emit_insn_after (x, after)
4337 rtx x, after;
4338{
4339 rtx last = after;
4340
4341#ifdef ENABLE_RTL_CHECKING
4342 if (after == NULL_RTX)
4343 abort ();
4344#endif
4345
4346 if (x == NULL_RTX)
4347 return last;
4348
4349 switch (GET_CODE (x))
15bbde2b 4350 {
31d3e01c 4351 case INSN:
4352 case JUMP_INSN:
4353 case CALL_INSN:
4354 case CODE_LABEL:
4355 case BARRIER:
4356 case NOTE:
4357 last = emit_insn_after_1 (x, after);
4358 break;
4359
4360#ifdef ENABLE_RTL_CHECKING
4361 case SEQUENCE:
4362 abort ();
4363 break;
4364#endif
4365
4366 default:
4367 last = make_insn_raw (x);
4368 add_insn_after (last, after);
4369 break;
15bbde2b 4370 }
4371
31d3e01c 4372 return last;
15bbde2b 4373}
4374
1bea98fb 4375/* Similar to emit_insn_after, except that line notes are to be inserted so
4376 as to act as if this insn were at FROM. */
4377
4378void
31d3e01c 4379emit_insn_after_with_line_notes (x, after, from)
4380 rtx x, after, from;
1bea98fb 4381{
4382 rtx from_line = find_line_note (from);
4383 rtx after_line = find_line_note (after);
31d3e01c 4384 rtx insn = emit_insn_after (x, after);
1bea98fb 4385
4386 if (from_line)
4387 emit_line_note_after (NOTE_SOURCE_FILE (from_line),
4388 NOTE_LINE_NUMBER (from_line),
4389 after);
4390
4391 if (after_line)
4392 emit_line_note_after (NOTE_SOURCE_FILE (after_line),
4393 NOTE_LINE_NUMBER (after_line),
4394 insn);
4395}
4396
31d3e01c 4397/* Make an insn of code JUMP_INSN with body X
15bbde2b 4398 and output it after the insn AFTER. */
4399
4400rtx
31d3e01c 4401emit_jump_insn_after (x, after)
4402 rtx x, after;
15bbde2b 4403{
31d3e01c 4404 rtx last;
15bbde2b 4405
31d3e01c 4406#ifdef ENABLE_RTL_CHECKING
4407 if (after == NULL_RTX)
4408 abort ();
4409#endif
4410
4411 switch (GET_CODE (x))
15bbde2b 4412 {
31d3e01c 4413 case INSN:
4414 case JUMP_INSN:
4415 case CALL_INSN:
4416 case CODE_LABEL:
4417 case BARRIER:
4418 case NOTE:
4419 last = emit_insn_after_1 (x, after);
4420 break;
4421
4422#ifdef ENABLE_RTL_CHECKING
4423 case SEQUENCE:
4424 abort ();
4425 break;
4426#endif
4427
4428 default:
4429 last = make_jump_insn_raw (x);
4430 add_insn_after (last, after);
4431 break;
15bbde2b 4432 }
4433
31d3e01c 4434 return last;
4435}
4436
4437/* Make an instruction with body X and code CALL_INSN
4438 and output it after the instruction AFTER. */
4439
4440rtx
4441emit_call_insn_after (x, after)
4442 rtx x, after;
4443{
4444 rtx last;
4445
4446#ifdef ENABLE_RTL_CHECKING
4447 if (after == NULL_RTX)
4448 abort ();
4449#endif
4450
4451 switch (GET_CODE (x))
4452 {
4453 case INSN:
4454 case JUMP_INSN:
4455 case CALL_INSN:
4456 case CODE_LABEL:
4457 case BARRIER:
4458 case NOTE:
4459 last = emit_insn_after_1 (x, after);
4460 break;
4461
4462#ifdef ENABLE_RTL_CHECKING
4463 case SEQUENCE:
4464 abort ();
4465 break;
4466#endif
4467
4468 default:
4469 last = make_call_insn_raw (x);
4470 add_insn_after (last, after);
4471 break;
4472 }
4473
4474 return last;
15bbde2b 4475}
4476
4477/* Make an insn of code BARRIER
4478 and output it after the insn AFTER. */
4479
4480rtx
4481emit_barrier_after (after)
19cb6b50 4482 rtx after;
15bbde2b 4483{
19cb6b50 4484 rtx insn = rtx_alloc (BARRIER);
15bbde2b 4485
4486 INSN_UID (insn) = cur_insn_uid++;
4487
4488 add_insn_after (insn, after);
4489 return insn;
4490}
4491
4492/* Emit the label LABEL after the insn AFTER. */
4493
4494rtx
4495emit_label_after (label, after)
4496 rtx label, after;
4497{
4498 /* This can be called twice for the same label
4499 as a result of the confusion that follows a syntax error!
4500 So make it harmless. */
4501 if (INSN_UID (label) == 0)
4502 {
4503 INSN_UID (label) = cur_insn_uid++;
4504 add_insn_after (label, after);
4505 }
4506
4507 return label;
4508}
4509
4510/* Emit a note of subtype SUBTYPE after the insn AFTER. */
4511
4512rtx
4513emit_note_after (subtype, after)
4514 int subtype;
4515 rtx after;
4516{
19cb6b50 4517 rtx note = rtx_alloc (NOTE);
15bbde2b 4518 INSN_UID (note) = cur_insn_uid++;
4519 NOTE_SOURCE_FILE (note) = 0;
4520 NOTE_LINE_NUMBER (note) = subtype;
ab87d1bc 4521 BLOCK_FOR_INSN (note) = NULL;
15bbde2b 4522 add_insn_after (note, after);
4523 return note;
4524}
4525
4526/* Emit a line note for FILE and LINE after the insn AFTER. */
4527
4528rtx
4529emit_line_note_after (file, line, after)
9a356c3c 4530 const char *file;
15bbde2b 4531 int line;
4532 rtx after;
4533{
19cb6b50 4534 rtx note;
15bbde2b 4535
4536 if (no_line_numbers && line > 0)
4537 {
4538 cur_insn_uid++;
4539 return 0;
4540 }
4541
d4c5e26d 4542 note = rtx_alloc (NOTE);
15bbde2b 4543 INSN_UID (note) = cur_insn_uid++;
4544 NOTE_SOURCE_FILE (note) = file;
4545 NOTE_LINE_NUMBER (note) = line;
ab87d1bc 4546 BLOCK_FOR_INSN (note) = NULL;
15bbde2b 4547 add_insn_after (note, after);
4548 return note;
4549}
4550\f
d321a68b 4551/* Like emit_insn_after, but set INSN_SCOPE according to SCOPE. */
4552rtx
4553emit_insn_after_scope (pattern, after, scope)
4554 rtx pattern, after;
4555 tree scope;
4556{
4557 rtx last = emit_insn_after (pattern, after);
d321a68b 4558
31d3e01c 4559 after = NEXT_INSN (after);
4560 while (1)
4561 {
59d19cb8 4562 if (active_insn_p (after))
4563 INSN_SCOPE (after) = scope;
31d3e01c 4564 if (after == last)
4565 break;
4566 after = NEXT_INSN (after);
4567 }
d321a68b 4568 return last;
4569}
4570
4571/* Like emit_jump_insn_after, but set INSN_SCOPE according to SCOPE. */
4572rtx
4573emit_jump_insn_after_scope (pattern, after, scope)
4574 rtx pattern, after;
4575 tree scope;
4576{
4577 rtx last = emit_jump_insn_after (pattern, after);
31d3e01c 4578
4579 after = NEXT_INSN (after);
4580 while (1)
4581 {
59d19cb8 4582 if (active_insn_p (after))
4583 INSN_SCOPE (after) = scope;
31d3e01c 4584 if (after == last)
4585 break;
4586 after = NEXT_INSN (after);
4587 }
d321a68b 4588 return last;
4589}
4590
4591/* Like emit_call_insn_after, but set INSN_SCOPE according to SCOPE. */
4592rtx
4593emit_call_insn_after_scope (pattern, after, scope)
4594 rtx pattern, after;
4595 tree scope;
4596{
4597 rtx last = emit_call_insn_after (pattern, after);
31d3e01c 4598
4599 after = NEXT_INSN (after);
4600 while (1)
4601 {
59d19cb8 4602 if (active_insn_p (after))
4603 INSN_SCOPE (after) = scope;
31d3e01c 4604 if (after == last)
4605 break;
4606 after = NEXT_INSN (after);
4607 }
d321a68b 4608 return last;
4609}
4610
4611/* Like emit_insn_before, but set INSN_SCOPE according to SCOPE. */
4612rtx
4613emit_insn_before_scope (pattern, before, scope)
4614 rtx pattern, before;
4615 tree scope;
4616{
4617 rtx first = PREV_INSN (before);
4618 rtx last = emit_insn_before (pattern, before);
4619
31d3e01c 4620 first = NEXT_INSN (first);
4621 while (1)
4622 {
59d19cb8 4623 if (active_insn_p (first))
4624 INSN_SCOPE (first) = scope;
31d3e01c 4625 if (first == last)
4626 break;
4627 first = NEXT_INSN (first);
4628 }
d321a68b 4629 return last;
4630}
4631\f
31d3e01c 4632/* Take X and emit it at the end of the doubly-linked
4633 INSN list.
15bbde2b 4634
4635 Returns the last insn emitted. */
4636
4637rtx
31d3e01c 4638emit_insn (x)
4639 rtx x;
15bbde2b 4640{
31d3e01c 4641 rtx last = last_insn;
4642 rtx insn;
15bbde2b 4643
31d3e01c 4644 if (x == NULL_RTX)
4645 return last;
15bbde2b 4646
31d3e01c 4647 switch (GET_CODE (x))
4648 {
4649 case INSN:
4650 case JUMP_INSN:
4651 case CALL_INSN:
4652 case CODE_LABEL:
4653 case BARRIER:
4654 case NOTE:
4655 insn = x;
4656 while (insn)
15bbde2b 4657 {
31d3e01c 4658 rtx next = NEXT_INSN (insn);
15bbde2b 4659 add_insn (insn);
31d3e01c 4660 last = insn;
4661 insn = next;
15bbde2b 4662 }
31d3e01c 4663 break;
15bbde2b 4664
31d3e01c 4665#ifdef ENABLE_RTL_CHECKING
4666 case SEQUENCE:
4667 abort ();
4668 break;
4669#endif
15bbde2b 4670
31d3e01c 4671 default:
4672 last = make_insn_raw (x);
4673 add_insn (last);
4674 break;
15bbde2b 4675 }
4676
4677 return last;
4678}
4679
31d3e01c 4680/* Make an insn of code JUMP_INSN with pattern X
4681 and add it to the end of the doubly-linked list. */
15bbde2b 4682
4683rtx
31d3e01c 4684emit_jump_insn (x)
4685 rtx x;
15bbde2b 4686{
d90b3d04 4687 rtx last = NULL_RTX, insn;
15bbde2b 4688
31d3e01c 4689 switch (GET_CODE (x))
15bbde2b 4690 {
31d3e01c 4691 case INSN:
4692 case JUMP_INSN:
4693 case CALL_INSN:
4694 case CODE_LABEL:
4695 case BARRIER:
4696 case NOTE:
4697 insn = x;
4698 while (insn)
4699 {
4700 rtx next = NEXT_INSN (insn);
4701 add_insn (insn);
4702 last = insn;
4703 insn = next;
4704 }
4705 break;
b36b07d8 4706
31d3e01c 4707#ifdef ENABLE_RTL_CHECKING
4708 case SEQUENCE:
4709 abort ();
4710 break;
4711#endif
b36b07d8 4712
31d3e01c 4713 default:
4714 last = make_jump_insn_raw (x);
4715 add_insn (last);
4716 break;
9dda7915 4717 }
b36b07d8 4718
4719 return last;
4720}
4721
31d3e01c 4722/* Make an insn of code CALL_INSN with pattern X
15bbde2b 4723 and add it to the end of the doubly-linked list. */
4724
4725rtx
31d3e01c 4726emit_call_insn (x)
4727 rtx x;
15bbde2b 4728{
31d3e01c 4729 rtx insn;
4730
4731 switch (GET_CODE (x))
15bbde2b 4732 {
31d3e01c 4733 case INSN:
4734 case JUMP_INSN:
4735 case CALL_INSN:
4736 case CODE_LABEL:
4737 case BARRIER:
4738 case NOTE:
4739 insn = emit_insn (x);
4740 break;
15bbde2b 4741
31d3e01c 4742#ifdef ENABLE_RTL_CHECKING
4743 case SEQUENCE:
4744 abort ();
4745 break;
4746#endif
15bbde2b 4747
31d3e01c 4748 default:
4749 insn = make_call_insn_raw (x);
15bbde2b 4750 add_insn (insn);
31d3e01c 4751 break;
15bbde2b 4752 }
31d3e01c 4753
4754 return insn;
15bbde2b 4755}
4756
4757/* Add the label LABEL to the end of the doubly-linked list. */
4758
4759rtx
4760emit_label (label)
4761 rtx label;
4762{
4763 /* This can be called twice for the same label
4764 as a result of the confusion that follows a syntax error!
4765 So make it harmless. */
4766 if (INSN_UID (label) == 0)
4767 {
4768 INSN_UID (label) = cur_insn_uid++;
4769 add_insn (label);
4770 }
4771 return label;
4772}
4773
4774/* Make an insn of code BARRIER
4775 and add it to the end of the doubly-linked list. */
4776
4777rtx
4778emit_barrier ()
4779{
19cb6b50 4780 rtx barrier = rtx_alloc (BARRIER);
15bbde2b 4781 INSN_UID (barrier) = cur_insn_uid++;
4782 add_insn (barrier);
4783 return barrier;
4784}
4785
4786/* Make an insn of code NOTE
4787 with data-fields specified by FILE and LINE
4788 and add it to the end of the doubly-linked list,
4789 but only if line-numbers are desired for debugging info. */
4790
4791rtx
4792emit_line_note (file, line)
9a356c3c 4793 const char *file;
15bbde2b 4794 int line;
4795{
21b005ed 4796 set_file_and_line_for_stmt (file, line);
15bbde2b 4797
4798#if 0
4799 if (no_line_numbers)
4800 return 0;
4801#endif
4802
4803 return emit_note (file, line);
4804}
4805
4806/* Make an insn of code NOTE
4807 with data-fields specified by FILE and LINE
4808 and add it to the end of the doubly-linked list.
4809 If it is a line-number NOTE, omit it if it matches the previous one. */
4810
4811rtx
4812emit_note (file, line)
9a356c3c 4813 const char *file;
15bbde2b 4814 int line;
4815{
19cb6b50 4816 rtx note;
15bbde2b 4817
4818 if (line > 0)
4819 {
4820 if (file && last_filename && !strcmp (file, last_filename)
4821 && line == last_linenum)
4822 return 0;
4823 last_filename = file;
4824 last_linenum = line;
4825 }
4826
4827 if (no_line_numbers && line > 0)
4828 {
4829 cur_insn_uid++;
4830 return 0;
4831 }
4832
4833 note = rtx_alloc (NOTE);
4834 INSN_UID (note) = cur_insn_uid++;
4835 NOTE_SOURCE_FILE (note) = file;
4836 NOTE_LINE_NUMBER (note) = line;
ab87d1bc 4837 BLOCK_FOR_INSN (note) = NULL;
15bbde2b 4838 add_insn (note);
4839 return note;
4840}
4841
8d54063f 4842/* Emit a NOTE, and don't omit it even if LINE is the previous note. */
15bbde2b 4843
4844rtx
4845emit_line_note_force (file, line)
9a356c3c 4846 const char *file;
15bbde2b 4847 int line;
4848{
4849 last_linenum = -1;
4850 return emit_line_note (file, line);
4851}
4852
4853/* Cause next statement to emit a line note even if the line number
4854 has not changed. This is used at the beginning of a function. */
4855
4856void
4857force_next_line_note ()
4858{
4859 last_linenum = -1;
4860}
f1934a33 4861
4862/* Place a note of KIND on insn INSN with DATUM as the datum. If a
6312a35e 4863 note of this type already exists, remove it first. */
f1934a33 4864
c080d8f0 4865rtx
f1934a33 4866set_unique_reg_note (insn, kind, datum)
4867 rtx insn;
4868 enum reg_note kind;
4869 rtx datum;
4870{
4871 rtx note = find_reg_note (insn, kind, NULL_RTX);
4872
7e6224ab 4873 switch (kind)
4874 {
4875 case REG_EQUAL:
4876 case REG_EQUIV:
4877 /* Don't add REG_EQUAL/REG_EQUIV notes if the insn
4878 has multiple sets (some callers assume single_set
4879 means the insn only has one set, when in fact it
4880 means the insn only has one * useful * set). */
4881 if (GET_CODE (PATTERN (insn)) == PARALLEL && multiple_sets (insn))
4882 {
4883 if (note)
4884 abort ();
4885 return NULL_RTX;
4886 }
4887
4888 /* Don't add ASM_OPERAND REG_EQUAL/REG_EQUIV notes.
4889 It serves no useful purpose and breaks eliminate_regs. */
4890 if (GET_CODE (datum) == ASM_OPERANDS)
4891 return NULL_RTX;
4892 break;
4893
4894 default:
4895 break;
4896 }
c080d8f0 4897
d823ba47 4898 if (note)
c080d8f0 4899 {
4900 XEXP (note, 0) = datum;
4901 return note;
4902 }
f1934a33 4903
4904 REG_NOTES (insn) = gen_rtx_EXPR_LIST (kind, datum, REG_NOTES (insn));
c080d8f0 4905 return REG_NOTES (insn);
f1934a33 4906}
15bbde2b 4907\f
4908/* Return an indication of which type of insn should have X as a body.
4909 The value is CODE_LABEL, INSN, CALL_INSN or JUMP_INSN. */
4910
4911enum rtx_code
4912classify_insn (x)
4913 rtx x;
4914{
4915 if (GET_CODE (x) == CODE_LABEL)
4916 return CODE_LABEL;
4917 if (GET_CODE (x) == CALL)
4918 return CALL_INSN;
4919 if (GET_CODE (x) == RETURN)
4920 return JUMP_INSN;
4921 if (GET_CODE (x) == SET)
4922 {
4923 if (SET_DEST (x) == pc_rtx)
4924 return JUMP_INSN;
4925 else if (GET_CODE (SET_SRC (x)) == CALL)
4926 return CALL_INSN;
4927 else
4928 return INSN;
4929 }
4930 if (GET_CODE (x) == PARALLEL)
4931 {
19cb6b50 4932 int j;
15bbde2b 4933 for (j = XVECLEN (x, 0) - 1; j >= 0; j--)
4934 if (GET_CODE (XVECEXP (x, 0, j)) == CALL)
4935 return CALL_INSN;
4936 else if (GET_CODE (XVECEXP (x, 0, j)) == SET
4937 && SET_DEST (XVECEXP (x, 0, j)) == pc_rtx)
4938 return JUMP_INSN;
4939 else if (GET_CODE (XVECEXP (x, 0, j)) == SET
4940 && GET_CODE (SET_SRC (XVECEXP (x, 0, j))) == CALL)
4941 return CALL_INSN;
4942 }
4943 return INSN;
4944}
4945
4946/* Emit the rtl pattern X as an appropriate kind of insn.
4947 If X is a label, it is simply added into the insn chain. */
4948
4949rtx
4950emit (x)
4951 rtx x;
4952{
4953 enum rtx_code code = classify_insn (x);
4954
4955 if (code == CODE_LABEL)
4956 return emit_label (x);
4957 else if (code == INSN)
4958 return emit_insn (x);
4959 else if (code == JUMP_INSN)
4960 {
19cb6b50 4961 rtx insn = emit_jump_insn (x);
b2816317 4962 if (any_uncondjump_p (insn) || GET_CODE (x) == RETURN)
15bbde2b 4963 return emit_barrier ();
4964 return insn;
4965 }
4966 else if (code == CALL_INSN)
4967 return emit_call_insn (x);
4968 else
4969 abort ();
4970}
4971\f
1f3233d1 4972/* Space for free sequence stack entries. */
4973static GTY ((deletable (""))) struct sequence_stack *free_sequence_stack;
4974
b49854c6 4975/* Begin emitting insns to a sequence which can be packaged in an
4976 RTL_EXPR. If this sequence will contain something that might cause
4977 the compiler to pop arguments to function calls (because those
4978 pops have previously been deferred; see INHIBIT_DEFER_POP for more
4979 details), use do_pending_stack_adjust before calling this function.
4980 That will ensure that the deferred pops are not accidentally
9588521d 4981 emitted in the middle of this sequence. */
15bbde2b 4982
4983void
4984start_sequence ()
4985{
4986 struct sequence_stack *tem;
4987
1f3233d1 4988 if (free_sequence_stack != NULL)
4989 {
4990 tem = free_sequence_stack;
4991 free_sequence_stack = tem->next;
4992 }
4993 else
4994 tem = (struct sequence_stack *) ggc_alloc (sizeof (struct sequence_stack));
15bbde2b 4995
0a893c29 4996 tem->next = seq_stack;
15bbde2b 4997 tem->first = first_insn;
4998 tem->last = last_insn;
961819fb 4999 tem->sequence_rtl_expr = seq_rtl_expr;
15bbde2b 5000
0a893c29 5001 seq_stack = tem;
15bbde2b 5002
5003 first_insn = 0;
5004 last_insn = 0;
5005}
5006
961819fb 5007/* Similarly, but indicate that this sequence will be placed in T, an
5008 RTL_EXPR. See the documentation for start_sequence for more
5009 information about how to use this function. */
5010
5011void
5012start_sequence_for_rtl_expr (t)
5013 tree t;
5014{
5015 start_sequence ();
5016
5017 seq_rtl_expr = t;
5018}
5019
b49854c6 5020/* Set up the insn chain starting with FIRST as the current sequence,
5021 saving the previously current one. See the documentation for
5022 start_sequence for more information about how to use this function. */
15bbde2b 5023
5024void
5025push_to_sequence (first)
5026 rtx first;
5027{
5028 rtx last;
5029
5030 start_sequence ();
5031
5032 for (last = first; last && NEXT_INSN (last); last = NEXT_INSN (last));
5033
5034 first_insn = first;
5035 last_insn = last;
5036}
5037
78147e84 5038/* Set up the insn chain from a chain stort in FIRST to LAST. */
5039
5040void
5041push_to_full_sequence (first, last)
5042 rtx first, last;
5043{
5044 start_sequence ();
5045 first_insn = first;
5046 last_insn = last;
5047 /* We really should have the end of the insn chain here. */
5048 if (last && NEXT_INSN (last))
5049 abort ();
5050}
5051
ab74c92f 5052/* Set up the outer-level insn chain
5053 as the current sequence, saving the previously current one. */
5054
5055void
5056push_topmost_sequence ()
5057{
2041cfd9 5058 struct sequence_stack *stack, *top = NULL;
ab74c92f 5059
5060 start_sequence ();
5061
0a893c29 5062 for (stack = seq_stack; stack; stack = stack->next)
ab74c92f 5063 top = stack;
5064
5065 first_insn = top->first;
5066 last_insn = top->last;
961819fb 5067 seq_rtl_expr = top->sequence_rtl_expr;
ab74c92f 5068}
5069
5070/* After emitting to the outer-level insn chain, update the outer-level
5071 insn chain, and restore the previous saved state. */
5072
5073void
5074pop_topmost_sequence ()
5075{
2041cfd9 5076 struct sequence_stack *stack, *top = NULL;
ab74c92f 5077
0a893c29 5078 for (stack = seq_stack; stack; stack = stack->next)
ab74c92f 5079 top = stack;
5080
5081 top->first = first_insn;
5082 top->last = last_insn;
961819fb 5083 /* ??? Why don't we save seq_rtl_expr here? */
ab74c92f 5084
5085 end_sequence ();
5086}
5087
15bbde2b 5088/* After emitting to a sequence, restore previous saved state.
5089
b49854c6 5090 To get the contents of the sequence just made, you must call
31d3e01c 5091 `get_insns' *before* calling here.
b49854c6 5092
5093 If the compiler might have deferred popping arguments while
5094 generating this sequence, and this sequence will not be immediately
5095 inserted into the instruction stream, use do_pending_stack_adjust
31d3e01c 5096 before calling get_insns. That will ensure that the deferred
b49854c6 5097 pops are inserted into this sequence, and not into some random
5098 location in the instruction stream. See INHIBIT_DEFER_POP for more
5099 information about deferred popping of arguments. */
15bbde2b 5100
5101void
5102end_sequence ()
5103{
0a893c29 5104 struct sequence_stack *tem = seq_stack;
15bbde2b 5105
5106 first_insn = tem->first;
5107 last_insn = tem->last;
961819fb 5108 seq_rtl_expr = tem->sequence_rtl_expr;
0a893c29 5109 seq_stack = tem->next;
15bbde2b 5110
1f3233d1 5111 memset (tem, 0, sizeof (*tem));
5112 tem->next = free_sequence_stack;
5113 free_sequence_stack = tem;
15bbde2b 5114}
5115
78147e84 5116/* This works like end_sequence, but records the old sequence in FIRST
5117 and LAST. */
5118
5119void
5120end_full_sequence (first, last)
5121 rtx *first, *last;
5122{
5123 *first = first_insn;
5124 *last = last_insn;
d4c5e26d 5125 end_sequence ();
78147e84 5126}
5127
15bbde2b 5128/* Return 1 if currently emitting into a sequence. */
5129
5130int
5131in_sequence_p ()
5132{
0a893c29 5133 return seq_stack != 0;
15bbde2b 5134}
15bbde2b 5135\f
02ebfa52 5136/* Put the various virtual registers into REGNO_REG_RTX. */
5137
5138void
0a893c29 5139init_virtual_regs (es)
5140 struct emit_status *es;
02ebfa52 5141{
0a893c29 5142 rtx *ptr = es->x_regno_reg_rtx;
5143 ptr[VIRTUAL_INCOMING_ARGS_REGNUM] = virtual_incoming_args_rtx;
5144 ptr[VIRTUAL_STACK_VARS_REGNUM] = virtual_stack_vars_rtx;
5145 ptr[VIRTUAL_STACK_DYNAMIC_REGNUM] = virtual_stack_dynamic_rtx;
5146 ptr[VIRTUAL_OUTGOING_ARGS_REGNUM] = virtual_outgoing_args_rtx;
5147 ptr[VIRTUAL_CFA_REGNUM] = virtual_cfa_rtx;
5148}
5149
928d57e3 5150\f
5151/* Used by copy_insn_1 to avoid copying SCRATCHes more than once. */
5152static rtx copy_insn_scratch_in[MAX_RECOG_OPERANDS];
5153static rtx copy_insn_scratch_out[MAX_RECOG_OPERANDS];
5154static int copy_insn_n_scratches;
5155
5156/* When an insn is being copied by copy_insn_1, this is nonzero if we have
5157 copied an ASM_OPERANDS.
5158 In that case, it is the original input-operand vector. */
5159static rtvec orig_asm_operands_vector;
5160
5161/* When an insn is being copied by copy_insn_1, this is nonzero if we have
5162 copied an ASM_OPERANDS.
5163 In that case, it is the copied input-operand vector. */
5164static rtvec copy_asm_operands_vector;
5165
5166/* Likewise for the constraints vector. */
5167static rtvec orig_asm_constraints_vector;
5168static rtvec copy_asm_constraints_vector;
5169
5170/* Recursively create a new copy of an rtx for copy_insn.
5171 This function differs from copy_rtx in that it handles SCRATCHes and
5172 ASM_OPERANDs properly.
5173 Normally, this function is not used directly; use copy_insn as front end.
5174 However, you could first copy an insn pattern with copy_insn and then use
5175 this function afterwards to properly copy any REG_NOTEs containing
5176 SCRATCHes. */
5177
5178rtx
5179copy_insn_1 (orig)
19cb6b50 5180 rtx orig;
928d57e3 5181{
19cb6b50 5182 rtx copy;
5183 int i, j;
5184 RTX_CODE code;
5185 const char *format_ptr;
928d57e3 5186
5187 code = GET_CODE (orig);
5188
5189 switch (code)
5190 {
5191 case REG:
5192 case QUEUED:
5193 case CONST_INT:
5194 case CONST_DOUBLE:
886cfd4f 5195 case CONST_VECTOR:
928d57e3 5196 case SYMBOL_REF:
5197 case CODE_LABEL:
5198 case PC:
5199 case CC0:
5200 case ADDRESSOF:
5201 return orig;
5202
5203 case SCRATCH:
5204 for (i = 0; i < copy_insn_n_scratches; i++)
5205 if (copy_insn_scratch_in[i] == orig)
5206 return copy_insn_scratch_out[i];
5207 break;
5208
5209 case CONST:
5210 /* CONST can be shared if it contains a SYMBOL_REF. If it contains
5211 a LABEL_REF, it isn't sharable. */
5212 if (GET_CODE (XEXP (orig, 0)) == PLUS
5213 && GET_CODE (XEXP (XEXP (orig, 0), 0)) == SYMBOL_REF
5214 && GET_CODE (XEXP (XEXP (orig, 0), 1)) == CONST_INT)
5215 return orig;
5216 break;
d823ba47 5217
928d57e3 5218 /* A MEM with a constant address is not sharable. The problem is that
5219 the constant address may need to be reloaded. If the mem is shared,
5220 then reloading one copy of this mem will cause all copies to appear
5221 to have been reloaded. */
5222
5223 default:
5224 break;
5225 }
5226
5227 copy = rtx_alloc (code);
5228
5229 /* Copy the various flags, and other information. We assume that
5230 all fields need copying, and then clear the fields that should
5231 not be copied. That is the sensible default behavior, and forces
5232 us to explicitly document why we are *not* copying a flag. */
5233 memcpy (copy, orig, sizeof (struct rtx_def) - sizeof (rtunion));
5234
5235 /* We do not copy the USED flag, which is used as a mark bit during
5236 walks over the RTL. */
7c25cb91 5237 RTX_FLAG (copy, used) = 0;
928d57e3 5238
5239 /* We do not copy JUMP, CALL, or FRAME_RELATED for INSNs. */
5240 if (GET_RTX_CLASS (code) == 'i')
5241 {
7c25cb91 5242 RTX_FLAG (copy, jump) = 0;
5243 RTX_FLAG (copy, call) = 0;
5244 RTX_FLAG (copy, frame_related) = 0;
928d57e3 5245 }
d823ba47 5246
928d57e3 5247 format_ptr = GET_RTX_FORMAT (GET_CODE (copy));
5248
5249 for (i = 0; i < GET_RTX_LENGTH (GET_CODE (copy)); i++)
5250 {
d925550d 5251 copy->fld[i] = orig->fld[i];
928d57e3 5252 switch (*format_ptr++)
5253 {
5254 case 'e':
928d57e3 5255 if (XEXP (orig, i) != NULL)
5256 XEXP (copy, i) = copy_insn_1 (XEXP (orig, i));
5257 break;
5258
928d57e3 5259 case 'E':
5260 case 'V':
928d57e3 5261 if (XVEC (orig, i) == orig_asm_constraints_vector)
5262 XVEC (copy, i) = copy_asm_constraints_vector;
5263 else if (XVEC (orig, i) == orig_asm_operands_vector)
5264 XVEC (copy, i) = copy_asm_operands_vector;
5265 else if (XVEC (orig, i) != NULL)
5266 {
5267 XVEC (copy, i) = rtvec_alloc (XVECLEN (orig, i));
5268 for (j = 0; j < XVECLEN (copy, i); j++)
5269 XVECEXP (copy, i, j) = copy_insn_1 (XVECEXP (orig, i, j));
5270 }
5271 break;
5272
928d57e3 5273 case 't':
928d57e3 5274 case 'w':
928d57e3 5275 case 'i':
928d57e3 5276 case 's':
5277 case 'S':
d925550d 5278 case 'u':
5279 case '0':
5280 /* These are left unchanged. */
928d57e3 5281 break;
5282
5283 default:
5284 abort ();
5285 }
5286 }
5287
5288 if (code == SCRATCH)
5289 {
5290 i = copy_insn_n_scratches++;
5291 if (i >= MAX_RECOG_OPERANDS)
5292 abort ();
5293 copy_insn_scratch_in[i] = orig;
5294 copy_insn_scratch_out[i] = copy;
5295 }
5296 else if (code == ASM_OPERANDS)
5297 {
d91f2122 5298 orig_asm_operands_vector = ASM_OPERANDS_INPUT_VEC (orig);
5299 copy_asm_operands_vector = ASM_OPERANDS_INPUT_VEC (copy);
5300 orig_asm_constraints_vector = ASM_OPERANDS_INPUT_CONSTRAINT_VEC (orig);
5301 copy_asm_constraints_vector = ASM_OPERANDS_INPUT_CONSTRAINT_VEC (copy);
928d57e3 5302 }
5303
5304 return copy;
5305}
5306
5307/* Create a new copy of an rtx.
5308 This function differs from copy_rtx in that it handles SCRATCHes and
5309 ASM_OPERANDs properly.
5310 INSN doesn't really have to be a full INSN; it could be just the
5311 pattern. */
5312rtx
5313copy_insn (insn)
5314 rtx insn;
5315{
5316 copy_insn_n_scratches = 0;
5317 orig_asm_operands_vector = 0;
5318 orig_asm_constraints_vector = 0;
5319 copy_asm_operands_vector = 0;
5320 copy_asm_constraints_vector = 0;
5321 return copy_insn_1 (insn);
5322}
02ebfa52 5323
15bbde2b 5324/* Initialize data structures and variables in this file
5325 before generating rtl for each function. */
5326
5327void
5328init_emit ()
5329{
08513b52 5330 struct function *f = cfun;
15bbde2b 5331
1f3233d1 5332 f->emit = (struct emit_status *) ggc_alloc (sizeof (struct emit_status));
15bbde2b 5333 first_insn = NULL;
5334 last_insn = NULL;
961819fb 5335 seq_rtl_expr = NULL;
15bbde2b 5336 cur_insn_uid = 1;
5337 reg_rtx_no = LAST_VIRTUAL_REGISTER + 1;
5338 last_linenum = 0;
5339 last_filename = 0;
5340 first_label_num = label_num;
5341 last_label_num = 0;
0a893c29 5342 seq_stack = NULL;
15bbde2b 5343
15bbde2b 5344 /* Init the tables that describe all the pseudo regs. */
5345
e61a0a7f 5346 f->emit->regno_pointer_align_length = LAST_VIRTUAL_REGISTER + 101;
15bbde2b 5347
0a893c29 5348 f->emit->regno_pointer_align
1f3233d1 5349 = (unsigned char *) ggc_alloc_cleared (f->emit->regno_pointer_align_length
5350 * sizeof (unsigned char));
d4c332ff 5351
d823ba47 5352 regno_reg_rtx
64402fe6 5353 = (rtx *) ggc_alloc (f->emit->regno_pointer_align_length * sizeof (rtx));
fcdc122e 5354
936082bb 5355 /* Put copies of all the hard registers into regno_reg_rtx. */
90295bd2 5356 memcpy (regno_reg_rtx,
5357 static_regno_reg_rtx,
5358 FIRST_PSEUDO_REGISTER * sizeof (rtx));
936082bb 5359
15bbde2b 5360 /* Put copies of all the virtual register rtx into regno_reg_rtx. */
0a893c29 5361 init_virtual_regs (f->emit);
888e0d33 5362
5363 /* Indicate that the virtual registers and stack locations are
5364 all pointers. */
e61a0a7f 5365 REG_POINTER (stack_pointer_rtx) = 1;
5366 REG_POINTER (frame_pointer_rtx) = 1;
5367 REG_POINTER (hard_frame_pointer_rtx) = 1;
5368 REG_POINTER (arg_pointer_rtx) = 1;
888e0d33 5369
e61a0a7f 5370 REG_POINTER (virtual_incoming_args_rtx) = 1;
5371 REG_POINTER (virtual_stack_vars_rtx) = 1;
5372 REG_POINTER (virtual_stack_dynamic_rtx) = 1;
5373 REG_POINTER (virtual_outgoing_args_rtx) = 1;
5374 REG_POINTER (virtual_cfa_rtx) = 1;
89525da0 5375
d4c332ff 5376#ifdef STACK_BOUNDARY
80909c64 5377 REGNO_POINTER_ALIGN (STACK_POINTER_REGNUM) = STACK_BOUNDARY;
5378 REGNO_POINTER_ALIGN (FRAME_POINTER_REGNUM) = STACK_BOUNDARY;
5379 REGNO_POINTER_ALIGN (HARD_FRAME_POINTER_REGNUM) = STACK_BOUNDARY;
5380 REGNO_POINTER_ALIGN (ARG_POINTER_REGNUM) = STACK_BOUNDARY;
5381
5382 REGNO_POINTER_ALIGN (VIRTUAL_INCOMING_ARGS_REGNUM) = STACK_BOUNDARY;
5383 REGNO_POINTER_ALIGN (VIRTUAL_STACK_VARS_REGNUM) = STACK_BOUNDARY;
5384 REGNO_POINTER_ALIGN (VIRTUAL_STACK_DYNAMIC_REGNUM) = STACK_BOUNDARY;
5385 REGNO_POINTER_ALIGN (VIRTUAL_OUTGOING_ARGS_REGNUM) = STACK_BOUNDARY;
5386 REGNO_POINTER_ALIGN (VIRTUAL_CFA_REGNUM) = BITS_PER_WORD;
d4c332ff 5387#endif
5388
89525da0 5389#ifdef INIT_EXPANDERS
5390 INIT_EXPANDERS;
5391#endif
15bbde2b 5392}
5393
89dd3424 5394/* Generate the constant 0. */
886cfd4f 5395
5396static rtx
89dd3424 5397gen_const_vector_0 (mode)
886cfd4f 5398 enum machine_mode mode;
5399{
5400 rtx tem;
5401 rtvec v;
5402 int units, i;
5403 enum machine_mode inner;
5404
5405 units = GET_MODE_NUNITS (mode);
5406 inner = GET_MODE_INNER (mode);
5407
5408 v = rtvec_alloc (units);
5409
5410 /* We need to call this function after we to set CONST0_RTX first. */
5411 if (!CONST0_RTX (inner))
5412 abort ();
5413
5414 for (i = 0; i < units; ++i)
5415 RTVEC_ELT (v, i) = CONST0_RTX (inner);
5416
9426b612 5417 tem = gen_rtx_raw_CONST_VECTOR (mode, v);
886cfd4f 5418 return tem;
5419}
5420
9426b612 5421/* Generate a vector like gen_rtx_raw_CONST_VEC, but use the zero vector when
5422 all elements are zero. */
5423rtx
5424gen_rtx_CONST_VECTOR (mode, v)
5425 enum machine_mode mode;
5426 rtvec v;
5427{
5428 rtx inner_zero = CONST0_RTX (GET_MODE_INNER (mode));
5429 int i;
5430
5431 for (i = GET_MODE_NUNITS (mode) - 1; i >= 0; i--)
5432 if (RTVEC_ELT (v, i) != inner_zero)
5433 return gen_rtx_raw_CONST_VECTOR (mode, v);
5434 return CONST0_RTX (mode);
5435}
5436
15bbde2b 5437/* Create some permanent unique rtl objects shared between all functions.
5438 LINE_NUMBERS is nonzero if line numbers are to be generated. */
5439
5440void
5441init_emit_once (line_numbers)
5442 int line_numbers;
5443{
5444 int i;
5445 enum machine_mode mode;
9e042f31 5446 enum machine_mode double_mode;
15bbde2b 5447
2ff23ed0 5448 /* Initialize the CONST_INT, CONST_DOUBLE, and memory attribute hash
5449 tables. */
573aba85 5450 const_int_htab = htab_create_ggc (37, const_int_htab_hash,
5451 const_int_htab_eq, NULL);
c6259b83 5452
573aba85 5453 const_double_htab = htab_create_ggc (37, const_double_htab_hash,
5454 const_double_htab_eq, NULL);
2ff23ed0 5455
573aba85 5456 mem_attrs_htab = htab_create_ggc (37, mem_attrs_htab_hash,
5457 mem_attrs_htab_eq, NULL);
ca74b940 5458 reg_attrs_htab = htab_create_ggc (37, reg_attrs_htab_hash,
5459 reg_attrs_htab_eq, NULL);
77695070 5460
15bbde2b 5461 no_line_numbers = ! line_numbers;
5462
71d7daa2 5463 /* Compute the word and byte modes. */
5464
5465 byte_mode = VOIDmode;
5466 word_mode = VOIDmode;
5467 double_mode = VOIDmode;
5468
5469 for (mode = GET_CLASS_NARROWEST_MODE (MODE_INT); mode != VOIDmode;
5470 mode = GET_MODE_WIDER_MODE (mode))
5471 {
5472 if (GET_MODE_BITSIZE (mode) == BITS_PER_UNIT
5473 && byte_mode == VOIDmode)
5474 byte_mode = mode;
5475
5476 if (GET_MODE_BITSIZE (mode) == BITS_PER_WORD
5477 && word_mode == VOIDmode)
5478 word_mode = mode;
5479 }
5480
71d7daa2 5481 for (mode = GET_CLASS_NARROWEST_MODE (MODE_FLOAT); mode != VOIDmode;
5482 mode = GET_MODE_WIDER_MODE (mode))
5483 {
5484 if (GET_MODE_BITSIZE (mode) == DOUBLE_TYPE_SIZE
5485 && double_mode == VOIDmode)
5486 double_mode = mode;
5487 }
5488
5489 ptr_mode = mode_for_size (POINTER_SIZE, GET_MODE_CLASS (Pmode), 0);
5490
57c097d5 5491 /* Assign register numbers to the globally defined register rtx.
5492 This must be done at runtime because the register number field
5493 is in a union and some compilers can't initialize unions. */
5494
5495 pc_rtx = gen_rtx (PC, VOIDmode);
5496 cc0_rtx = gen_rtx (CC0, VOIDmode);
22cf44bc 5497 stack_pointer_rtx = gen_raw_REG (Pmode, STACK_POINTER_REGNUM);
5498 frame_pointer_rtx = gen_raw_REG (Pmode, FRAME_POINTER_REGNUM);
57c097d5 5499 if (hard_frame_pointer_rtx == 0)
d823ba47 5500 hard_frame_pointer_rtx = gen_raw_REG (Pmode,
22cf44bc 5501 HARD_FRAME_POINTER_REGNUM);
57c097d5 5502 if (arg_pointer_rtx == 0)
22cf44bc 5503 arg_pointer_rtx = gen_raw_REG (Pmode, ARG_POINTER_REGNUM);
d823ba47 5504 virtual_incoming_args_rtx =
22cf44bc 5505 gen_raw_REG (Pmode, VIRTUAL_INCOMING_ARGS_REGNUM);
d823ba47 5506 virtual_stack_vars_rtx =
22cf44bc 5507 gen_raw_REG (Pmode, VIRTUAL_STACK_VARS_REGNUM);
d823ba47 5508 virtual_stack_dynamic_rtx =
22cf44bc 5509 gen_raw_REG (Pmode, VIRTUAL_STACK_DYNAMIC_REGNUM);
d823ba47 5510 virtual_outgoing_args_rtx =
5511 gen_raw_REG (Pmode, VIRTUAL_OUTGOING_ARGS_REGNUM);
22cf44bc 5512 virtual_cfa_rtx = gen_raw_REG (Pmode, VIRTUAL_CFA_REGNUM);
57c097d5 5513
90295bd2 5514 /* Initialize RTL for commonly used hard registers. These are
5515 copied into regno_reg_rtx as we begin to compile each function. */
5516 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
5517 static_regno_reg_rtx[i] = gen_raw_REG (reg_raw_mode[i], i);
5518
57c097d5 5519#ifdef INIT_EXPANDERS
ab5beff9 5520 /* This is to initialize {init|mark|free}_machine_status before the first
5521 call to push_function_context_to. This is needed by the Chill front
3fb1e43b 5522 end which calls push_function_context_to before the first call to
57c097d5 5523 init_function_start. */
5524 INIT_EXPANDERS;
5525#endif
5526
15bbde2b 5527 /* Create the unique rtx's for certain rtx codes and operand values. */
5528
7014838c 5529 /* Don't use gen_rtx here since gen_rtx in this case
5530 tries to use these variables. */
15bbde2b 5531 for (i = - MAX_SAVED_CONST_INT; i <= MAX_SAVED_CONST_INT; i++)
d823ba47 5532 const_int_rtx[i + MAX_SAVED_CONST_INT] =
a717d5b4 5533 gen_rtx_raw_CONST_INT (VOIDmode, (HOST_WIDE_INT) i);
15bbde2b 5534
1a60f06a 5535 if (STORE_FLAG_VALUE >= - MAX_SAVED_CONST_INT
5536 && STORE_FLAG_VALUE <= MAX_SAVED_CONST_INT)
57c097d5 5537 const_true_rtx = const_int_rtx[STORE_FLAG_VALUE + MAX_SAVED_CONST_INT];
1a60f06a 5538 else
3ad7bb1c 5539 const_true_rtx = gen_rtx_CONST_INT (VOIDmode, STORE_FLAG_VALUE);
15bbde2b 5540
2ff23ed0 5541 REAL_VALUE_FROM_INT (dconst0, 0, 0, double_mode);
5542 REAL_VALUE_FROM_INT (dconst1, 1, 0, double_mode);
5543 REAL_VALUE_FROM_INT (dconst2, 2, 0, double_mode);
5544 REAL_VALUE_FROM_INT (dconstm1, -1, -1, double_mode);
15bbde2b 5545
5546 for (i = 0; i <= 2; i++)
5547 {
badfe841 5548 REAL_VALUE_TYPE *r =
5549 (i == 0 ? &dconst0 : i == 1 ? &dconst1 : &dconst2);
5550
15bbde2b 5551 for (mode = GET_CLASS_NARROWEST_MODE (MODE_FLOAT); mode != VOIDmode;
5552 mode = GET_MODE_WIDER_MODE (mode))
2ff23ed0 5553 const_tiny_rtx[i][(int) mode] =
5554 CONST_DOUBLE_FROM_REAL_VALUE (*r, mode);
15bbde2b 5555
b572011e 5556 const_tiny_rtx[i][(int) VOIDmode] = GEN_INT (i);
15bbde2b 5557
5558 for (mode = GET_CLASS_NARROWEST_MODE (MODE_INT); mode != VOIDmode;
5559 mode = GET_MODE_WIDER_MODE (mode))
b572011e 5560 const_tiny_rtx[i][(int) mode] = GEN_INT (i);
7540dcc4 5561
5562 for (mode = GET_CLASS_NARROWEST_MODE (MODE_PARTIAL_INT);
5563 mode != VOIDmode;
5564 mode = GET_MODE_WIDER_MODE (mode))
5565 const_tiny_rtx[i][(int) mode] = GEN_INT (i);
15bbde2b 5566 }
5567
886cfd4f 5568 for (mode = GET_CLASS_NARROWEST_MODE (MODE_VECTOR_INT);
5569 mode != VOIDmode;
5570 mode = GET_MODE_WIDER_MODE (mode))
89dd3424 5571 const_tiny_rtx[0][(int) mode] = gen_const_vector_0 (mode);
886cfd4f 5572
5573 for (mode = GET_CLASS_NARROWEST_MODE (MODE_VECTOR_FLOAT);
5574 mode != VOIDmode;
5575 mode = GET_MODE_WIDER_MODE (mode))
89dd3424 5576 const_tiny_rtx[0][(int) mode] = gen_const_vector_0 (mode);
886cfd4f 5577
0fd4500a 5578 for (i = (int) CCmode; i < (int) MAX_MACHINE_MODE; ++i)
5579 if (GET_MODE_CLASS ((enum machine_mode) i) == MODE_CC)
5580 const_tiny_rtx[0][i] = const0_rtx;
15bbde2b 5581
065336b4 5582 const_tiny_rtx[0][(int) BImode] = const0_rtx;
5583 if (STORE_FLAG_VALUE == 1)
5584 const_tiny_rtx[1][(int) BImode] = const1_rtx;
5585
f4bffa58 5586#ifdef RETURN_ADDRESS_POINTER_REGNUM
5587 return_address_pointer_rtx
22cf44bc 5588 = gen_raw_REG (Pmode, RETURN_ADDRESS_POINTER_REGNUM);
f4bffa58 5589#endif
5590
5591#ifdef STRUCT_VALUE
5592 struct_value_rtx = STRUCT_VALUE;
5593#else
5594 struct_value_rtx = gen_rtx_REG (Pmode, STRUCT_VALUE_REGNUM);
5595#endif
5596
5597#ifdef STRUCT_VALUE_INCOMING
5598 struct_value_incoming_rtx = STRUCT_VALUE_INCOMING;
5599#else
5600#ifdef STRUCT_VALUE_INCOMING_REGNUM
5601 struct_value_incoming_rtx
5602 = gen_rtx_REG (Pmode, STRUCT_VALUE_INCOMING_REGNUM);
5603#else
5604 struct_value_incoming_rtx = struct_value_rtx;
5605#endif
5606#endif
5607
5608#ifdef STATIC_CHAIN_REGNUM
5609 static_chain_rtx = gen_rtx_REG (Pmode, STATIC_CHAIN_REGNUM);
5610
5611#ifdef STATIC_CHAIN_INCOMING_REGNUM
5612 if (STATIC_CHAIN_INCOMING_REGNUM != STATIC_CHAIN_REGNUM)
5613 static_chain_incoming_rtx
5614 = gen_rtx_REG (Pmode, STATIC_CHAIN_INCOMING_REGNUM);
5615 else
5616#endif
5617 static_chain_incoming_rtx = static_chain_rtx;
5618#endif
5619
5620#ifdef STATIC_CHAIN
5621 static_chain_rtx = STATIC_CHAIN;
5622
5623#ifdef STATIC_CHAIN_INCOMING
5624 static_chain_incoming_rtx = STATIC_CHAIN_INCOMING;
5625#else
5626 static_chain_incoming_rtx = static_chain_rtx;
5627#endif
5628#endif
5629
3473aefe 5630 if ((unsigned) PIC_OFFSET_TABLE_REGNUM != INVALID_REGNUM)
52bcea50 5631 pic_offset_table_rtx = gen_raw_REG (Pmode, PIC_OFFSET_TABLE_REGNUM);
15bbde2b 5632}
ac6c481d 5633\f
5634/* Query and clear/ restore no_line_numbers. This is used by the
5635 switch / case handling in stmt.c to give proper line numbers in
5636 warnings about unreachable code. */
5637
5638int
5639force_line_numbers ()
5640{
5641 int old = no_line_numbers;
5642
5643 no_line_numbers = 0;
5644 if (old)
5645 force_next_line_note ();
5646 return old;
5647}
5648
5649void
5650restore_line_number_status (old_value)
5651 int old_value;
5652{
5653 no_line_numbers = old_value;
5654}
cd0fe062 5655
5656/* Produce exact duplicate of insn INSN after AFTER.
5657 Care updating of libcall regions if present. */
5658
5659rtx
5660emit_copy_of_insn_after (insn, after)
5661 rtx insn, after;
5662{
5663 rtx new;
5664 rtx note1, note2, link;
5665
5666 switch (GET_CODE (insn))
5667 {
5668 case INSN:
5669 new = emit_insn_after (copy_insn (PATTERN (insn)), after);
5670 break;
5671
5672 case JUMP_INSN:
5673 new = emit_jump_insn_after (copy_insn (PATTERN (insn)), after);
5674 break;
5675
5676 case CALL_INSN:
5677 new = emit_call_insn_after (copy_insn (PATTERN (insn)), after);
5678 if (CALL_INSN_FUNCTION_USAGE (insn))
5679 CALL_INSN_FUNCTION_USAGE (new)
5680 = copy_insn (CALL_INSN_FUNCTION_USAGE (insn));
5681 SIBLING_CALL_P (new) = SIBLING_CALL_P (insn);
5682 CONST_OR_PURE_CALL_P (new) = CONST_OR_PURE_CALL_P (insn);
5683 break;
5684
5685 default:
5686 abort ();
5687 }
5688
5689 /* Update LABEL_NUSES. */
5690 mark_jump_label (PATTERN (new), new, 0);
5691
ab87d1bc 5692 INSN_SCOPE (new) = INSN_SCOPE (insn);
5693
cd0fe062 5694 /* Copy all REG_NOTES except REG_LABEL since mark_jump_label will
5695 make them. */
5696 for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
5697 if (REG_NOTE_KIND (link) != REG_LABEL)
5698 {
5699 if (GET_CODE (link) == EXPR_LIST)
5700 REG_NOTES (new)
5701 = copy_insn_1 (gen_rtx_EXPR_LIST (REG_NOTE_KIND (link),
5702 XEXP (link, 0),
5703 REG_NOTES (new)));
5704 else
5705 REG_NOTES (new)
5706 = copy_insn_1 (gen_rtx_INSN_LIST (REG_NOTE_KIND (link),
5707 XEXP (link, 0),
5708 REG_NOTES (new)));
5709 }
5710
5711 /* Fix the libcall sequences. */
5712 if ((note1 = find_reg_note (new, REG_RETVAL, NULL_RTX)) != NULL)
5713 {
5714 rtx p = new;
5715 while ((note2 = find_reg_note (p, REG_LIBCALL, NULL_RTX)) == NULL)
5716 p = PREV_INSN (p);
5717 XEXP (note1, 0) = p;
5718 XEXP (note2, 0) = new;
5719 }
ce07bc35 5720 INSN_CODE (new) = INSN_CODE (insn);
cd0fe062 5721 return new;
5722}
1f3233d1 5723
5724#include "gt-emit-rtl.h"