|
|
1.1 root 1: /* Subroutines used for code generation on IBM RS/6000.
2: Copyright (C) 1991, 1993 Free Software Foundation, Inc.
3: Contributed by Richard Kenner ([email protected])
4:
5: This file is part of GNU CC.
6:
7: GNU CC is free software; you can redistribute it and/or modify
8: it under the terms of the GNU General Public License as published by
9: the Free Software Foundation; either version 2, or (at your option)
10: any later version.
11:
12: GNU CC is distributed in the hope that it will be useful,
13: but WITHOUT ANY WARRANTY; without even the implied warranty of
14: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15: GNU General Public License for more details.
16:
17: You should have received a copy of the GNU General Public License
18: along with GNU CC; see the file COPYING. If not, write to
19: the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
20:
21: #include <stdio.h>
22: #include "config.h"
23: #include "rtl.h"
24: #include "regs.h"
25: #include "hard-reg-set.h"
26: #include "real.h"
27: #include "insn-config.h"
28: #include "conditions.h"
29: #include "insn-flags.h"
30: #include "output.h"
31: #include "insn-attr.h"
32: #include "flags.h"
33: #include "recog.h"
34: #include "expr.h"
35: #include "obstack.h"
36: #include "tree.h"
37:
38: extern char *language_string;
39: extern int profile_block_flag;
40:
41: #define min(A,B) ((A) < (B) ? (A) : (B))
42: #define max(A,B) ((A) > (B) ? (A) : (B))
43:
44: /* Target cpu type */
45:
46: enum processor_type rs6000_cpu;
47: char *rs6000_cpu_string;
48:
49: /* Set to non-zero by "fix" operation to indicate that itrunc and
50: uitrunc must be defined. */
51:
52: int rs6000_trunc_used;
53:
54: /* Set to non-zero once they have been defined. */
55:
56: static int trunc_defined;
57:
58: /* Save information from a "cmpxx" operation until the branch or scc is
59: emitted. */
60:
61: rtx rs6000_compare_op0, rs6000_compare_op1;
62: int rs6000_compare_fp_p;
63:
64: /* Override command line options. Mostly we process the processor
65: type and sometimes adjust other TARGET_ options. */
66:
67: void
68: rs6000_override_options ()
69: {
70: int i;
71:
72: /* Simplify the entries below by making a mask for any POWER
73: variant and any PowerPC variant. */
74:
75: #define POWER_MASKS (MASK_POWER | MASK_POWER2)
76: #define POWERPC_MASKS (MASK_POWERPC | MASK_POWERPCSQR | MASK_POWERPC64)
77:
78: static struct ptt
79: {
80: char *name; /* Canonical processor name. */
81: enum processor_type processor; /* Processor type enum value. */
82: int target_enable; /* Target flags to enable. */
83: int target_disable; /* Target flags to disable. */
84: } processor_target_table[]
85: = {{"all", PROCESSOR_DEFAULT, 0, POWER_MASKS | POWERPC_MASKS},
86: {"rios", PROCESSOR_RIOS1, MASK_POWER, MASK_POWER2 | POWERPC_MASKS},
87: {"rios1", PROCESSOR_RIOS1, MASK_POWER, MASK_POWER2 | POWERPC_MASKS},
88: {"rsc", PROCESSOR_PPC601, MASK_POWER, MASK_POWER2 | POWERPC_MASKS},
89: {"rsc1", PROCESSOR_PPC601, MASK_POWER, MASK_POWER2 | POWERPC_MASKS},
90: {"rios2", PROCESSOR_RIOS2, MASK_POWER | MASK_POWER2 , POWERPC_MASKS},
91: {"601", PROCESSOR_PPC601,
92: MASK_POWER | MASK_POWERPC | MASK_NEW_MNEMONICS,
93: MASK_POWER2 | MASK_POWERPCSQR | MASK_POWERPC64},
94: {"mpc601", PROCESSOR_PPC601,
95: MASK_POWER | MASK_POWERPC | MASK_NEW_MNEMONICS,
96: MASK_POWER2 | MASK_POWERPCSQR | MASK_POWERPC64},
97: {"ppc601", PROCESSOR_PPC601,
98: MASK_POWER | MASK_POWERPC | MASK_NEW_MNEMONICS,
99: MASK_POWER2 | MASK_POWERPCSQR | MASK_POWERPC64},
100: {"603", PROCESSOR_PPC603,
101: MASK_POWERPC | MASK_POWERPCSQR | MASK_NEW_MNEMONICS,
102: POWER_MASKS | MASK_POWERPC64},
103: {"mpc603", PROCESSOR_PPC603,
104: MASK_POWERPC | MASK_POWERPCSQR | MASK_NEW_MNEMONICS,
105: POWER_MASKS | MASK_POWERPC64},
106: {"ppc603", PROCESSOR_PPC603,
107: MASK_POWERPC | MASK_POWERPCSQR | MASK_NEW_MNEMONICS,
108: POWER_MASKS | MASK_POWERPC64},
109: {"604", PROCESSOR_PPC604,
110: MASK_POWERPC | MASK_POWERPCSQR | MASK_NEW_MNEMONICS,
111: POWER_MASKS | MASK_POWERPC64},
112: {"mpc604", PROCESSOR_PPC604,
113: MASK_POWERPC | MASK_POWERPCSQR | MASK_NEW_MNEMONICS,
114: POWER_MASKS | MASK_POWERPC64},
115: {"ppc604", PROCESSOR_PPC604,
116: MASK_POWERPC | MASK_POWERPCSQR | MASK_NEW_MNEMONICS,
117: POWER_MASKS | MASK_POWERPC64},
118: {"620", PROCESSOR_PPC620,
119: (MASK_POWERPC | MASK_POWERPCSQR | MASK_POWERPC64
120: | MASK_NEW_MNEMONICS),
121: POWER_MASKS},
122: {"mpc620", PROCESSOR_PPC620,
123: (MASK_POWERPC | MASK_POWERPCSQR | MASK_POWERPC64
124: | MASK_NEW_MNEMONICS),
125: POWER_MASKS},
126: {"ppc620", PROCESSOR_PPC620,
127: (MASK_POWERPC | MASK_POWERPCSQR | MASK_POWERPC64
128: | MASK_NEW_MNEMONICS),
129: POWER_MASKS}};
130:
131: int ptt_size = sizeof (processor_target_table) / sizeof (struct ptt);
132:
133: profile_block_flag = 0;
134:
135: /* Identify the processor type */
136: if (rs6000_cpu_string == 0)
137: rs6000_cpu = PROCESSOR_DEFAULT;
138: else
139: {
140: for (i = 0; i < ptt_size; i++)
141: if (! strcmp (rs6000_cpu_string, processor_target_table[i].name))
142: {
143: rs6000_cpu = processor_target_table[i].processor;
144: target_flags |= processor_target_table[i].target_enable;
145: target_flags &= ~processor_target_table[i].target_disable;
146: break;
147: }
148:
149: if (i == ptt_size)
150: {
151: error ("bad value (%s) for -mcpu= switch", rs6000_cpu_string);
152: rs6000_cpu_string = "default";
153: rs6000_cpu = PROCESSOR_DEFAULT;
154: }
155: }
156: }
157:
158: /* Return non-zero if this function is known to have a null epilogue. */
159:
160: int
161: direct_return ()
162: {
163: return (reload_completed
164: && first_reg_to_save () == 32
165: && first_fp_reg_to_save () == 64
166: && ! regs_ever_live[65]
167: && ! rs6000_pushes_stack ());
168: }
169:
170: /* Returns 1 always. */
171:
172: int
173: any_operand (op, mode)
174: register rtx op;
175: enum machine_mode mode;
176: {
177: return 1;
178: }
179:
180: /* Return 1 if OP is a constant that can fit in a D field. */
181:
182: int
183: short_cint_operand (op, mode)
184: register rtx op;
185: enum machine_mode mode;
186: {
187: return (GET_CODE (op) == CONST_INT
188: && (unsigned) (INTVAL (op) + 0x8000) < 0x10000);
189: }
190:
191: /* Similar for a unsigned D field. */
192:
193: int
194: u_short_cint_operand (op, mode)
195: register rtx op;
196: enum machine_mode mode;
197: {
198: return (GET_CODE (op) == CONST_INT && (INTVAL (op) & 0xffff0000) == 0);
199: }
200:
201: /* Return 1 if OP is a CONST_INT that cannot fit in a signed D field. */
202:
203: int
204: non_short_cint_operand (op, mode)
205: register rtx op;
206: enum machine_mode mode;
207: {
208: return (GET_CODE (op) == CONST_INT
209: && (unsigned) (INTVAL (op) + 0x8000) >= 0x10000);
210: }
211:
212: /* Returns 1 if OP is a register that is not special (i.e., not MQ,
213: ctr, or lr). */
214:
215: int
216: gpc_reg_operand (op, mode)
217: register rtx op;
218: enum machine_mode mode;
219: {
220: return (register_operand (op, mode)
221: && (GET_CODE (op) != REG || REGNO (op) >= 67 || REGNO (op) < 64));
222: }
223:
224: /* Returns 1 if OP is either a pseudo-register or a register denoting a
225: CR field. */
226:
227: int
228: cc_reg_operand (op, mode)
229: register rtx op;
230: enum machine_mode mode;
231: {
232: return (register_operand (op, mode)
233: && (GET_CODE (op) != REG
234: || REGNO (op) >= FIRST_PSEUDO_REGISTER
235: || CR_REGNO_P (REGNO (op))));
236: }
237:
238: /* Returns 1 if OP is either a constant integer valid for a D-field or a
239: non-special register. If a register, it must be in the proper mode unless
240: MODE is VOIDmode. */
241:
242: int
243: reg_or_short_operand (op, mode)
244: register rtx op;
245: enum machine_mode mode;
246: {
247: return short_cint_operand (op, mode) || gpc_reg_operand (op, mode);
248: }
249:
250: /* Similar, except check if the negation of the constant would be valid for
251: a D-field. */
252:
253: int
254: reg_or_neg_short_operand (op, mode)
255: register rtx op;
256: enum machine_mode mode;
257: {
258: if (GET_CODE (op) == CONST_INT)
259: return CONST_OK_FOR_LETTER_P (INTVAL (op), 'P');
260:
261: return gpc_reg_operand (op, mode);
262: }
263:
264: /* Return 1 if the operand is either a register or an integer whose high-order
265: 16 bits are zero. */
266:
267: int
268: reg_or_u_short_operand (op, mode)
269: register rtx op;
270: enum machine_mode mode;
271: {
272: if (GET_CODE (op) == CONST_INT
273: && (INTVAL (op) & 0xffff0000) == 0)
274: return 1;
275:
276: return gpc_reg_operand (op, mode);
277: }
278:
279: /* Return 1 is the operand is either a non-special register or ANY
280: constant integer. */
281:
282: int
283: reg_or_cint_operand (op, mode)
284: register rtx op;
285: enum machine_mode mode;
286: {
287: return GET_CODE (op) == CONST_INT || gpc_reg_operand (op, mode);
288: }
289:
290: /* Return 1 if the operand is a CONST_DOUBLE and it can be put into a register
291: with one instruction per word. We only do this if we can safely read
292: CONST_DOUBLE_{LOW,HIGH}. */
293:
294: int
295: easy_fp_constant (op, mode)
296: register rtx op;
297: register enum machine_mode mode;
298: {
299: rtx low, high;
300:
301: if (GET_CODE (op) != CONST_DOUBLE
302: || GET_MODE (op) != mode
303: || GET_MODE_CLASS (mode) != MODE_FLOAT)
304: return 0;
305:
306: high = operand_subword (op, 0, 0, mode);
307: low = operand_subword (op, 1, 0, mode);
308:
309: if (high == 0 || ! input_operand (high, word_mode))
310: return 0;
311:
312: return (mode == SFmode
313: || (low != 0 && input_operand (low, word_mode)));
314: }
315:
316: /* Return 1 if the operand is either a floating-point register, a pseudo
317: register, or memory. */
318:
319: int
320: fp_reg_or_mem_operand (op, mode)
321: register rtx op;
322: enum machine_mode mode;
323: {
324: return (memory_operand (op, mode)
325: || (register_operand (op, mode)
326: && (GET_CODE (op) != REG
327: || REGNO (op) >= FIRST_PSEUDO_REGISTER
328: || FP_REGNO_P (REGNO (op)))));
329: }
330:
331: /* Return 1 if the operand is either an easy FP constant (see above) or
332: memory. */
333:
334: int
335: mem_or_easy_const_operand (op, mode)
336: register rtx op;
337: enum machine_mode mode;
338: {
339: return memory_operand (op, mode) || easy_fp_constant (op, mode);
340: }
341:
342: /* Return 1 if the operand is either a non-special register or an item
343: that can be used as the operand of an SI add insn. */
344:
345: int
346: add_operand (op, mode)
347: register rtx op;
348: enum machine_mode mode;
349: {
350: return (reg_or_short_operand (op, mode)
351: || (GET_CODE (op) == CONST_INT && (INTVAL (op) & 0xffff) == 0));
352: }
353:
354: /* Return 1 if OP is a constant but not a valid add_operand. */
355:
356: int
357: non_add_cint_operand (op, mode)
358: register rtx op;
359: enum machine_mode mode;
360: {
361: return (GET_CODE (op) == CONST_INT
362: && (unsigned) (INTVAL (op) + 0x8000) >= 0x10000
363: && (INTVAL (op) & 0xffff) != 0);
364: }
365:
366: /* Return 1 if the operand is a non-special register or a constant that
367: can be used as the operand of an OR or XOR insn on the RS/6000. */
368:
369: int
370: logical_operand (op, mode)
371: register rtx op;
372: enum machine_mode mode;
373: {
374: return (gpc_reg_operand (op, mode)
375: || (GET_CODE (op) == CONST_INT
376: && ((INTVAL (op) & 0xffff0000) == 0
377: || (INTVAL (op) & 0xffff) == 0)));
378: }
379:
380: /* Return 1 if C is a constant that is not a logical operand (as
381: above). */
382:
383: int
384: non_logical_cint_operand (op, mode)
385: register rtx op;
386: enum machine_mode mode;
387: {
388: return (GET_CODE (op) == CONST_INT
389: && (INTVAL (op) & 0xffff0000) != 0
390: && (INTVAL (op) & 0xffff) != 0);
391: }
392:
393: /* Return 1 if C is a constant that can be encoded in a mask on the
394: RS/6000. It is if there are no more than two 1->0 or 0->1 transitions.
395: Reject all ones and all zeros, since these should have been optimized
396: away and confuse the making of MB and ME. */
397:
398: int
399: mask_constant (c)
400: register int c;
401: {
402: int i;
403: int last_bit_value;
404: int transitions = 0;
405:
406: if (c == 0 || c == ~0)
407: return 0;
408:
409: last_bit_value = c & 1;
410:
411: for (i = 1; i < 32; i++)
412: if (((c >>= 1) & 1) != last_bit_value)
413: last_bit_value ^= 1, transitions++;
414:
415: return transitions <= 2;
416: }
417:
418: /* Return 1 if the operand is a constant that is a mask on the RS/6000. */
419:
420: int
421: mask_operand (op, mode)
422: register rtx op;
423: enum machine_mode mode;
424: {
425: return GET_CODE (op) == CONST_INT && mask_constant (INTVAL (op));
426: }
427:
428: /* Return 1 if the operand is either a non-special register or a
429: constant that can be used as the operand of an RS/6000 logical AND insn. */
430:
431: int
432: and_operand (op, mode)
433: register rtx op;
434: enum machine_mode mode;
435: {
436: return (reg_or_short_operand (op, mode)
437: || logical_operand (op, mode)
438: || mask_operand (op, mode));
439: }
440:
441: /* Return 1 if the operand is a constant but not a valid operand for an AND
442: insn. */
443:
444: int
445: non_and_cint_operand (op, mode)
446: register rtx op;
447: enum machine_mode mode;
448: {
449: return GET_CODE (op) == CONST_INT && ! and_operand (op, mode);
450: }
451:
452: /* Return 1 if the operand is a general register or memory operand. */
453:
454: int
455: reg_or_mem_operand (op, mode)
456: register rtx op;
457: register enum machine_mode mode;
458: {
459: return gpc_reg_operand (op, mode) || memory_operand (op, mode);
460: }
461:
462: /* Return 1 if the operand, used inside a MEM, is a valid first argument
463: to CALL. This is a SYMBOL_REF or a pseudo-register, which will be
464: forced to lr. */
465:
466: int
467: call_operand (op, mode)
468: register rtx op;
469: enum machine_mode mode;
470: {
471: if (mode != VOIDmode && GET_MODE (op) != mode)
472: return 0;
473:
474: return (GET_CODE (op) == SYMBOL_REF
475: || (GET_CODE (op) == REG && REGNO (op) >= FIRST_PSEUDO_REGISTER));
476: }
477:
478:
479: /* Return 1 if the operand is a SYMBOL_REF for a function known to be in
480: this file. */
481:
482: int
483: current_file_function_operand (op, mode)
484: register rtx op;
485: enum machine_mode mode;
486: {
487: return (GET_CODE (op) == SYMBOL_REF
488: && (SYMBOL_REF_FLAG (op)
489: || op == XEXP (DECL_RTL (current_function_decl), 0)));
490: }
491:
492:
493: /* Return 1 if this operand is a valid input for a move insn. */
494:
495: int
496: input_operand (op, mode)
497: register rtx op;
498: enum machine_mode mode;
499: {
500: /* Memory is always valid. */
501: if (memory_operand (op, mode))
502: return 1;
503:
504: /* For floating-point, easy constants are valid. */
505: if (GET_MODE_CLASS (mode) == MODE_FLOAT
506: && CONSTANT_P (op)
507: && easy_fp_constant (op, mode))
508: return 1;
509:
510: /* For floating-point or multi-word mode, the only remaining valid type
511: is a register. */
512: if (GET_MODE_CLASS (mode) == MODE_FLOAT
513: || GET_MODE_SIZE (mode) > UNITS_PER_WORD)
514: return register_operand (op, mode);
515:
516: /* The only cases left are integral modes one word or smaller (we
517: do not get called for MODE_CC values). These can be in any
518: register. */
519: if (register_operand (op, mode))
520: return 1;
521:
522: /* For HImode and QImode, any constant is valid. */
523: if ((mode == HImode || mode == QImode)
524: && GET_CODE (op) == CONST_INT)
525: return 1;
526:
527: /* Otherwise, we will be doing this SET with an add, so anything valid
528: for an add will be valid. */
529: return add_operand (op, mode);
530: }
531:
532: /* Return 1 if OP is a load multiple operation. It is known to be a
533: PARALLEL and the first section will be tested. */
534:
535: int
536: load_multiple_operation (op, mode)
537: rtx op;
538: enum machine_mode mode;
539: {
540: int count = XVECLEN (op, 0);
541: int dest_regno;
542: rtx src_addr;
543: int i;
544:
545: /* Perform a quick check so we don't blow up below. */
546: if (count <= 1
547: || GET_CODE (XVECEXP (op, 0, 0)) != SET
548: || GET_CODE (SET_DEST (XVECEXP (op, 0, 0))) != REG
549: || GET_CODE (SET_SRC (XVECEXP (op, 0, 0))) != MEM)
550: return 0;
551:
552: dest_regno = REGNO (SET_DEST (XVECEXP (op, 0, 0)));
553: src_addr = XEXP (SET_SRC (XVECEXP (op, 0, 0)), 0);
554:
555: for (i = 1; i < count; i++)
556: {
557: rtx elt = XVECEXP (op, 0, i);
558:
559: if (GET_CODE (elt) != SET
560: || GET_CODE (SET_DEST (elt)) != REG
561: || GET_MODE (SET_DEST (elt)) != SImode
562: || REGNO (SET_DEST (elt)) != dest_regno + i
563: || GET_CODE (SET_SRC (elt)) != MEM
564: || GET_MODE (SET_SRC (elt)) != SImode
565: || GET_CODE (XEXP (SET_SRC (elt), 0)) != PLUS
566: || ! rtx_equal_p (XEXP (XEXP (SET_SRC (elt), 0), 0), src_addr)
567: || GET_CODE (XEXP (XEXP (SET_SRC (elt), 0), 1)) != CONST_INT
568: || INTVAL (XEXP (XEXP (SET_SRC (elt), 0), 1)) != i * 4)
569: return 0;
570: }
571:
572: return 1;
573: }
574:
575: /* Similar, but tests for store multiple. Here, the second vector element
576: is a CLOBBER. It will be tested later. */
577:
578: int
579: store_multiple_operation (op, mode)
580: rtx op;
581: enum machine_mode mode;
582: {
583: int count = XVECLEN (op, 0) - 1;
584: int src_regno;
585: rtx dest_addr;
586: int i;
587:
588: /* Perform a quick check so we don't blow up below. */
589: if (count <= 1
590: || GET_CODE (XVECEXP (op, 0, 0)) != SET
591: || GET_CODE (SET_DEST (XVECEXP (op, 0, 0))) != MEM
592: || GET_CODE (SET_SRC (XVECEXP (op, 0, 0))) != REG)
593: return 0;
594:
595: src_regno = REGNO (SET_SRC (XVECEXP (op, 0, 0)));
596: dest_addr = XEXP (SET_DEST (XVECEXP (op, 0, 0)), 0);
597:
598: for (i = 1; i < count; i++)
599: {
600: rtx elt = XVECEXP (op, 0, i + 1);
601:
602: if (GET_CODE (elt) != SET
603: || GET_CODE (SET_SRC (elt)) != REG
604: || GET_MODE (SET_SRC (elt)) != SImode
605: || REGNO (SET_SRC (elt)) != src_regno + i
606: || GET_CODE (SET_DEST (elt)) != MEM
607: || GET_MODE (SET_DEST (elt)) != SImode
608: || GET_CODE (XEXP (SET_DEST (elt), 0)) != PLUS
609: || ! rtx_equal_p (XEXP (XEXP (SET_DEST (elt), 0), 0), dest_addr)
610: || GET_CODE (XEXP (XEXP (SET_DEST (elt), 0), 1)) != CONST_INT
611: || INTVAL (XEXP (XEXP (SET_DEST (elt), 0), 1)) != i * 4)
612: return 0;
613: }
614:
615: return 1;
616: }
617:
618: /* Return 1 if OP is a comparison operation that is valid for a branch insn.
619: We only check the opcode against the mode of the CC value here. */
620:
621: int
622: branch_comparison_operator (op, mode)
623: register rtx op;
624: enum machine_mode mode;
625: {
626: enum rtx_code code = GET_CODE (op);
627: enum machine_mode cc_mode;
628:
629: if (GET_RTX_CLASS (code) != '<')
630: return 0;
631:
632: cc_mode = GET_MODE (XEXP (op, 0));
633: if (GET_MODE_CLASS (cc_mode) != MODE_CC)
634: return 0;
635:
636: if ((code == GT || code == LT || code == GE || code == LE)
637: && cc_mode == CCUNSmode)
638: return 0;
639:
640: if ((code == GTU || code == LTU || code == GEU || code == LEU)
641: && (cc_mode != CCUNSmode))
642: return 0;
643:
644: return 1;
645: }
646:
647: /* Return 1 if OP is a comparison operation that is valid for an scc insn.
648: We check the opcode against the mode of the CC value and disallow EQ or
649: NE comparisons for integers. */
650:
651: int
652: scc_comparison_operator (op, mode)
653: register rtx op;
654: enum machine_mode mode;
655: {
656: enum rtx_code code = GET_CODE (op);
657: enum machine_mode cc_mode;
658:
659: if (GET_MODE (op) != mode && mode != VOIDmode)
660: return 0;
661:
662: if (GET_RTX_CLASS (code) != '<')
663: return 0;
664:
665: cc_mode = GET_MODE (XEXP (op, 0));
666: if (GET_MODE_CLASS (cc_mode) != MODE_CC)
667: return 0;
668:
669: if (code == NE && cc_mode != CCFPmode)
670: return 0;
671:
672: if ((code == GT || code == LT || code == GE || code == LE)
673: && cc_mode == CCUNSmode)
674: return 0;
675:
676: if ((code == GTU || code == LTU || code == GEU || code == LEU)
677: && (cc_mode != CCUNSmode))
678: return 0;
679:
680: if (cc_mode == CCEQmode && code != EQ && code != NE)
681: return 0;
682:
683: return 1;
684: }
685:
686: /* Return 1 if ANDOP is a mask that has no bits on that are not in the
687: mask required to convert the result of a rotate insn into a shift
688: left insn of SHIFTOP bits. Both are known to be CONST_INT. */
689:
690: int
691: includes_lshift_p (shiftop, andop)
692: register rtx shiftop;
693: register rtx andop;
694: {
695: int shift_mask = (~0 << INTVAL (shiftop));
696:
697: return (INTVAL (andop) & ~shift_mask) == 0;
698: }
699:
700: /* Similar, but for right shift. */
701:
702: int
703: includes_rshift_p (shiftop, andop)
704: register rtx shiftop;
705: register rtx andop;
706: {
707: unsigned shift_mask = ~0;
708:
709: shift_mask >>= INTVAL (shiftop);
710:
711: return (INTVAL (andop) & ~ shift_mask) == 0;
712: }
713:
714: /* Return the register class of a scratch register needed to copy IN into
715: or out of a register in CLASS in MODE. If it can be done directly,
716: NO_REGS is returned. */
717:
718: enum reg_class
719: secondary_reload_class (class, mode, in)
720: enum reg_class class;
721: enum machine_mode mode;
722: rtx in;
723: {
724: int regno = true_regnum (in);
725:
726: if (regno >= FIRST_PSEUDO_REGISTER)
727: regno = -1;
728:
729: /* We can place anything into GENERAL_REGS and can put GENERAL_REGS
730: into anything. */
731: if (class == GENERAL_REGS || class == BASE_REGS
732: || (regno >= 0 && INT_REGNO_P (regno)))
733: return NO_REGS;
734:
735: /* Constants, memory, and FP registers can go into FP registers. */
736: if ((regno == -1 || FP_REGNO_P (regno))
737: && (class == FLOAT_REGS || class == NON_SPECIAL_REGS))
738: return NO_REGS;
739:
740: /* We can copy among the CR registers. */
741: if ((class == CR_REGS || class == CR0_REGS)
742: && regno >= 0 && CR_REGNO_P (regno))
743: return NO_REGS;
744:
745: /* Otherwise, we need GENERAL_REGS. */
746: return GENERAL_REGS;
747: }
748:
749: /* Given a comparison operation, return the bit number in CCR to test. We
750: know this is a valid comparison.
751:
752: SCC_P is 1 if this is for an scc. That means that %D will have been
753: used instead of %C, so the bits will be in different places.
754:
755: Return -1 if OP isn't a valid comparison for some reason. */
756:
757: int
758: ccr_bit (op, scc_p)
759: register rtx op;
760: int scc_p;
761: {
762: enum rtx_code code = GET_CODE (op);
763: enum machine_mode cc_mode;
764: int cc_regnum;
765: int base_bit;
766:
767: if (GET_RTX_CLASS (code) != '<')
768: return -1;
769:
770: cc_mode = GET_MODE (XEXP (op, 0));
771: cc_regnum = REGNO (XEXP (op, 0));
772: base_bit = 4 * (cc_regnum - 68);
773:
774: /* In CCEQmode cases we have made sure that the result is always in the
775: third bit of the CR field. */
776:
777: if (cc_mode == CCEQmode)
778: return base_bit + 3;
779:
780: switch (code)
781: {
782: case NE:
783: return scc_p ? base_bit + 3 : base_bit + 2;
784: case EQ:
785: return base_bit + 2;
786: case GT: case GTU:
787: return base_bit + 1;
788: case LT: case LTU:
789: return base_bit;
790:
791: case GE: case GEU:
792: /* If floating-point, we will have done a cror to put the bit in the
793: unordered position. So test that bit. For integer, this is ! LT
794: unless this is an scc insn. */
795: return cc_mode == CCFPmode || scc_p ? base_bit + 3 : base_bit;
796:
797: case LE: case LEU:
798: return cc_mode == CCFPmode || scc_p ? base_bit + 3 : base_bit + 1;
799:
800: default:
801: abort ();
802: }
803: }
804:
805: /* Print an operand. Recognize special options, documented below. */
806:
807: void
808: print_operand (file, x, code)
809: FILE *file;
810: rtx x;
811: char code;
812: {
813: int i;
814: int val;
815:
816: /* These macros test for integers and extract the low-order bits. */
817: #define INT_P(X) \
818: ((GET_CODE (X) == CONST_INT || GET_CODE (X) == CONST_DOUBLE) \
819: && GET_MODE (X) == VOIDmode)
820:
821: #define INT_LOWPART(X) \
822: (GET_CODE (X) == CONST_INT ? INTVAL (X) : CONST_DOUBLE_LOW (X))
823:
824: switch (code)
825: {
826: case '.':
827: /* Write out an instruction after the call which may be replaced
828: with glue code by the loader. This depends on the AIX version. */
829: asm_fprintf (file, RS6000_CALL_GLUE);
830: return;
831:
832: case 'A':
833: /* If X is a constant integer whose low-order 5 bits are zero,
834: write 'l'. Otherwise, write 'r'. This is a kludge to fix a bug
835: in the AIX assembler where "sri" with a zero shift count
836: write a trash instruction. */
837: if (GET_CODE (x) == CONST_INT && (INTVAL (x) & 31) == 0)
838: putc ('l', file);
839: else
840: putc ('r', file);
841: return;
842:
843: case 'b':
844: /* Low-order 16 bits of constant, unsigned. */
845: if (! INT_P (x))
846: output_operand_lossage ("invalid %%b value");
847:
848: fprintf (file, "%d", INT_LOWPART (x) & 0xffff);
849: return;
850:
851: case 'C':
852: /* This is an optional cror needed for LE or GE floating-point
853: comparisons. Otherwise write nothing. */
854: if ((GET_CODE (x) == LE || GET_CODE (x) == GE)
855: && GET_MODE (XEXP (x, 0)) == CCFPmode)
856: {
857: int base_bit = 4 * (REGNO (XEXP (x, 0)) - 68);
858:
859: fprintf (file, "cror %d,%d,%d\n\t", base_bit + 3,
860: base_bit + 2, base_bit + (GET_CODE (x) == GE));
861: }
862: return;
863:
864: case 'D':
865: /* Similar, except that this is for an scc, so we must be able to
866: encode the test in a single bit that is one. We do the above
867: for any LE, GE, GEU, or LEU and invert the bit for NE. */
868: if (GET_CODE (x) == LE || GET_CODE (x) == GE
869: || GET_CODE (x) == LEU || GET_CODE (x) == GEU)
870: {
871: int base_bit = 4 * (REGNO (XEXP (x, 0)) - 68);
872:
873: fprintf (file, "cror %d,%d,%d\n\t", base_bit + 3,
874: base_bit + 2,
875: base_bit + (GET_CODE (x) == GE || GET_CODE (x) == GEU));
876: }
877:
878: else if (GET_CODE (x) == NE)
879: {
880: int base_bit = 4 * (REGNO (XEXP (x, 0)) - 68);
881:
882: fprintf (file, "crnor %d,%d,%d\n\t", base_bit + 3,
883: base_bit + 2, base_bit + 2);
884: }
885: return;
886:
887: case 'E':
888: /* X is a CR register. Print the number of the third bit of the CR */
889: if (GET_CODE (x) != REG || ! CR_REGNO_P (REGNO (x)))
890: output_operand_lossage ("invalid %%E value");
891:
892: fprintf(file, "%d", 4 * (REGNO (x) - 68) + 3);
893: return;
894:
895: case 'f':
896: /* X is a CR register. Print the shift count needed to move it
897: to the high-order four bits. */
898: if (GET_CODE (x) != REG || ! CR_REGNO_P (REGNO (x)))
899: output_operand_lossage ("invalid %%f value");
900: else
901: fprintf (file, "%d", 4 * (REGNO (x) - 68));
902: return;
903:
904: case 'F':
905: /* Similar, but print the count for the rotate in the opposite
906: direction. */
907: if (GET_CODE (x) != REG || ! CR_REGNO_P (REGNO (x)))
908: output_operand_lossage ("invalid %%F value");
909: else
910: fprintf (file, "%d", 32 - 4 * (REGNO (x) - 68));
911: return;
912:
913: case 'G':
914: /* X is a constant integer. If it is negative, print "m",
915: otherwise print "z". This is to make a aze or ame insn. */
916: if (GET_CODE (x) != CONST_INT)
917: output_operand_lossage ("invalid %%G value");
918: else if (INTVAL (x) >= 0)
919: putc ('z', file);
920: else
921: putc ('m', file);
922: return;
923:
924: case 'h':
925: /* If constant, output low-order five bits. Otherwise,
926: write normally. */
927: if (INT_P (x))
928: fprintf (file, "%d", INT_LOWPART (x) & 31);
929: else
930: print_operand (file, x, 0);
931: return;
932:
933: case 'H':
934: /* X must be a constant. Output the low order 5 bits plus 24. */
935: if (! INT_P (x))
936: output_operand_lossage ("invalid %%H value");
937:
938: fprintf (file, "%d", (INT_LOWPART (x) + 24) & 31);
939: return;
940:
941: case 'I':
942: /* Print `i' if this is a constant, else nothing. */
943: if (INT_P (x))
944: putc ('i', file);
945: return;
946:
947: case 'j':
948: /* Write the bit number in CCR for jump. */
949: i = ccr_bit (x, 0);
950: if (i == -1)
951: output_operand_lossage ("invalid %%j code");
952: else
953: fprintf (file, "%d", i);
954: return;
955:
956: case 'J':
957: /* Similar, but add one for shift count in rlinm for scc and pass
958: scc flag to `ccr_bit'. */
959: i = ccr_bit (x, 1);
960: if (i == -1)
961: output_operand_lossage ("invalid %%J code");
962: else
963: /* If we want bit 31, write a shift count of zero, not 32. */
964: fprintf (file, "%d", i == 31 ? 0 : i + 1);
965: return;
966:
967: case 'k':
968: /* X must be a constant. Write the 1's complement of the
969: constant. */
970: if (! INT_P (x))
971: output_operand_lossage ("invalid %%k value");
972:
973: fprintf (file, "%d", ~ INT_LOWPART (x));
974: return;
975:
976: case 'L':
977: /* Write second word of DImode or DFmode reference. Works on register
978: or non-indexed memory only. */
979: if (GET_CODE (x) == REG)
980: fprintf (file, "%d", REGNO (x) + 1);
981: else if (GET_CODE (x) == MEM)
982: {
983: /* Handle possible auto-increment. Since it is pre-increment and
984: we have already done it, we can just use an offset of four. */
985: if (GET_CODE (XEXP (x, 0)) == PRE_INC
986: || GET_CODE (XEXP (x, 0)) == PRE_DEC)
987: output_address (plus_constant (XEXP (XEXP (x, 0), 0), 4));
988: else
989: output_address (plus_constant (XEXP (x, 0), 4));
990: }
991: return;
992:
993: case 'm':
994: /* MB value for a mask operand. */
995: if (! mask_operand (x, VOIDmode))
996: output_operand_lossage ("invalid %%m value");
997:
998: val = INT_LOWPART (x);
999:
1000: /* If the high bit is set and the low bit is not, the value is zero.
1001: If the high bit is zero, the value is the first 1 bit we find from
1002: the left. */
1003: if (val < 0 && (val & 1) == 0)
1004: {
1005: fprintf (file, "0");
1006: return;
1007: }
1008: else if (val >= 0)
1009: {
1010: for (i = 1; i < 32; i++)
1011: if ((val <<= 1) < 0)
1012: break;
1013: fprintf (file, "%d", i);
1014: return;
1015: }
1016:
1017: /* Otherwise, look for the first 0 bit from the right. The result is its
1018: number plus 1. We know the low-order bit is one. */
1019: for (i = 0; i < 32; i++)
1020: if (((val >>= 1) & 1) == 0)
1021: break;
1022:
1023: /* If we ended in ...01, I would be 0. The correct value is 31, so
1024: we want 31 - i. */
1025: fprintf (file, "%d", 31 - i);
1026: return;
1027:
1028: case 'M':
1029: /* ME value for a mask operand. */
1030: if (! mask_operand (x, VOIDmode))
1031: output_operand_lossage ("invalid %%m value");
1032:
1033: val = INT_LOWPART (x);
1034:
1035: /* If the low bit is set and the high bit is not, the value is 31.
1036: If the low bit is zero, the value is the first 1 bit we find from
1037: the right. */
1038: if ((val & 1) && val >= 0)
1039: {
1040: fputs ("31", file);
1041: return;
1042: }
1043: else if ((val & 1) == 0)
1044: {
1045: for (i = 0; i < 32; i++)
1046: if ((val >>= 1) & 1)
1047: break;
1048:
1049: /* If we had ....10, I would be 0. The result should be
1050: 30, so we need 30 - i. */
1051: fprintf (file, "%d", 30 - i);
1052: return;
1053: }
1054:
1055: /* Otherwise, look for the first 0 bit from the left. The result is its
1056: number minus 1. We know the high-order bit is one. */
1057: for (i = 0; i < 32; i++)
1058: if ((val <<= 1) >= 0)
1059: break;
1060:
1061: fprintf (file, "%d", i);
1062: return;
1063:
1064: case 'N':
1065: /* Write the number of elements in the vector times 4. */
1066: if (GET_CODE (x) != PARALLEL)
1067: output_operand_lossage ("invalid %%N value");
1068:
1069: fprintf (file, "%d", XVECLEN (x, 0) * 4);
1070: return;
1071:
1072: case 'O':
1073: /* Similar, but subtract 1 first. */
1074: if (GET_CODE (x) != PARALLEL)
1075: output_operand_lossage ("invalid %%N value");
1076:
1077: fprintf (file, "%d", (XVECLEN (x, 0) - 1) * 4);
1078: return;
1079:
1080: case 'p':
1081: /* X is a CONST_INT that is a power of two. Output the logarithm. */
1082: if (! INT_P (x)
1083: || (i = exact_log2 (INT_LOWPART (x))) < 0)
1084: output_operand_lossage ("invalid %%p value");
1085:
1086: fprintf (file, "%d", i);
1087: return;
1088:
1089: case 'P':
1090: /* The operand must be an indirect memory reference. The result
1091: is the register number. */
1092: if (GET_CODE (x) != MEM || GET_CODE (XEXP (x, 0)) != REG
1093: || REGNO (XEXP (x, 0)) >= 32)
1094: output_operand_lossage ("invalid %%P value");
1095:
1096: fprintf (file, "%d", REGNO (XEXP (x, 0)));
1097: return;
1098:
1099: case 'R':
1100: /* X is a CR register. Print the mask for `mtcrf'. */
1101: if (GET_CODE (x) != REG || ! CR_REGNO_P (REGNO (x)))
1102: output_operand_lossage ("invalid %%R value");
1103: else
1104: fprintf (file, "%d", 128 >> (REGNO (x) - 68));
1105: return;
1106:
1107: case 's':
1108: /* Low 5 bits of 32 - value */
1109: if (! INT_P (x))
1110: output_operand_lossage ("invalid %%s value");
1111:
1112: fprintf (file, "%d", (32 - INT_LOWPART (x)) & 31);
1113: return;
1114:
1115: case 'S':
1116: /* Low 5 bits of 31 - value */
1117: if (! INT_P (x))
1118: output_operand_lossage ("invalid %%S value");
1119:
1120: fprintf (file, "%d", (31 - INT_LOWPART (x)) & 31);
1121: return;
1122:
1123: case 't':
1124: /* Write 12 if this jump operation will branch if true, 4 otherwise.
1125: All floating-point operations except NE branch true and integer
1126: EQ, LT, GT, LTU and GTU also branch true. */
1127: if (GET_RTX_CLASS (GET_CODE (x)) != '<')
1128: output_operand_lossage ("invalid %%t value");
1129:
1130: else if ((GET_MODE (XEXP (x, 0)) == CCFPmode
1131: && GET_CODE (x) != NE)
1132: || GET_CODE (x) == EQ
1133: || GET_CODE (x) == LT || GET_CODE (x) == GT
1134: || GET_CODE (x) == LTU || GET_CODE (x) == GTU)
1135: fputs ("12", file);
1136: else
1137: putc ('4', file);
1138: return;
1139:
1140: case 'T':
1141: /* Opposite of 't': write 4 if this jump operation will branch if true,
1142: 12 otherwise. */
1143: if (GET_RTX_CLASS (GET_CODE (x)) != '<')
1144: output_operand_lossage ("invalid %%t value");
1145:
1146: else if ((GET_MODE (XEXP (x, 0)) == CCFPmode
1147: && GET_CODE (x) != NE)
1148: || GET_CODE (x) == EQ
1149: || GET_CODE (x) == LT || GET_CODE (x) == GT
1150: || GET_CODE (x) == LTU || GET_CODE (x) == GTU)
1151: putc ('4', file);
1152: else
1153: fputs ("12", file);
1154: return;
1155:
1156: case 'u':
1157: /* High-order 16 bits of constant. */
1158: if (! INT_P (x))
1159: output_operand_lossage ("invalid %%u value");
1160:
1161: fprintf (file, "0x%x", (INT_LOWPART (x) >> 16) & 0xffff);
1162: return;
1163:
1164: case 'U':
1165: /* Print `u' if this has an auto-increment or auto-decrement. */
1166: if (GET_CODE (x) == MEM
1167: && (GET_CODE (XEXP (x, 0)) == PRE_INC
1168: || GET_CODE (XEXP (x, 0)) == PRE_DEC))
1169: putc ('u', file);
1170: return;
1171:
1172: case 'w':
1173: /* If constant, low-order 16 bits of constant, signed. Otherwise, write
1174: normally. */
1175: if (INT_P (x))
1176: fprintf (file, "%d",
1177: (INT_LOWPART (x) & 0xffff) - 2 * (INT_LOWPART (x) & 0x8000));
1178: else
1179: print_operand (file, x, 0);
1180: return;
1181:
1182: case 'W':
1183: /* If constant, low-order 16 bits of constant, unsigned.
1184: Otherwise, write normally. */
1185: if (INT_P (x))
1186: fprintf (file, "%d", INT_LOWPART (x) & 0xffff);
1187: else
1188: print_operand (file, x, 0);
1189: return;
1190:
1191: case 'X':
1192: if (GET_CODE (x) == MEM
1193: && LEGITIMATE_INDEXED_ADDRESS_P (XEXP (x, 0)))
1194: putc ('x', file);
1195: return;
1196:
1197: case 'Y':
1198: /* Like 'L', for third word of TImode */
1199: if (GET_CODE (x) == REG)
1200: fprintf (file, "%d", REGNO (x) + 2);
1201: else if (GET_CODE (x) == MEM)
1202: {
1203: if (GET_CODE (XEXP (x, 0)) == PRE_INC
1204: || GET_CODE (XEXP (x, 0)) == PRE_DEC)
1205: output_address (plus_constant (XEXP (XEXP (x, 0), 0), 8));
1206: else
1207: output_address (plus_constant (XEXP (x, 0), 8));
1208: }
1209: return;
1210:
1211: case 'z':
1212: /* X is a SYMBOL_REF. Write out the name preceded by a
1213: period and without any trailing data in brackets. Used for function
1214: names. */
1215: if (GET_CODE (x) != SYMBOL_REF)
1216: abort ();
1217:
1218: putc ('.', file);
1219: RS6000_OUTPUT_BASENAME (file, XSTR (x, 0));
1220: return;
1221:
1222: case 'Z':
1223: /* Like 'L', for last word of TImode. */
1224: if (GET_CODE (x) == REG)
1225: fprintf (file, "%d", REGNO (x) + 3);
1226: else if (GET_CODE (x) == MEM)
1227: {
1228: if (GET_CODE (XEXP (x, 0)) == PRE_INC
1229: || GET_CODE (XEXP (x, 0)) == PRE_DEC)
1230: output_address (plus_constant (XEXP (XEXP (x, 0), 0), 12));
1231: else
1232: output_address (plus_constant (XEXP (x, 0), 12));
1233: }
1234: return;
1235:
1236: case 0:
1237: if (GET_CODE (x) == REG)
1238: fprintf (file, "%s", reg_names[REGNO (x)]);
1239: else if (GET_CODE (x) == MEM)
1240: {
1241: /* We need to handle PRE_INC and PRE_DEC here, since we need to
1242: know the width from the mode. */
1243: if (GET_CODE (XEXP (x, 0)) == PRE_INC)
1244: fprintf (file, "%d(%d)", GET_MODE_SIZE (GET_MODE (x)),
1245: REGNO (XEXP (XEXP (x, 0), 0)));
1246: else if (GET_CODE (XEXP (x, 0)) == PRE_DEC)
1247: fprintf (file, "%d(%d)", - GET_MODE_SIZE (GET_MODE (x)),
1248: REGNO (XEXP (XEXP (x, 0), 0)));
1249: else
1250: output_address (XEXP (x, 0));
1251: }
1252: else
1253: output_addr_const (file, x);
1254: return;
1255:
1256: default:
1257: output_operand_lossage ("invalid %%xn code");
1258: }
1259: }
1260:
1261: /* Print the address of an operand. */
1262:
1263: void
1264: print_operand_address (file, x)
1265: FILE *file;
1266: register rtx x;
1267: {
1268: if (GET_CODE (x) == REG)
1269: fprintf (file, "0(%d)", REGNO (x));
1270: else if (GET_CODE (x) == SYMBOL_REF || GET_CODE (x) == CONST)
1271: {
1272: output_addr_const (file, x);
1273: /* When TARGET_MINIMAL_TOC, use the indirected toc table pointer instead
1274: of the toc pointer. */
1275: if (TARGET_MINIMAL_TOC)
1276: fprintf (file, "(30)");
1277: else
1278: fprintf (file, "(2)");
1279: }
1280: else if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 1)) == REG)
1281: {
1282: if (REGNO (XEXP (x, 0)) == 0)
1283: fprintf (file, "%d,%d", REGNO (XEXP (x, 1)), REGNO (XEXP (x, 0)));
1284: else
1285: fprintf (file, "%d,%d", REGNO (XEXP (x, 0)), REGNO (XEXP (x, 1)));
1286: }
1287: else if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 1)) == CONST_INT)
1288: fprintf (file, "%d(%d)", INTVAL (XEXP (x, 1)), REGNO (XEXP (x, 0)));
1289: else
1290: abort ();
1291: }
1292:
1293: /* This page contains routines that are used to determine what the function
1294: prologue and epilogue code will do and write them out. */
1295:
1296: /* Return the first fixed-point register that is required to be saved. 32 if
1297: none. */
1298:
1299: int
1300: first_reg_to_save ()
1301: {
1302: int first_reg;
1303:
1304: /* Find lowest numbered live register. */
1305: for (first_reg = 13; first_reg <= 31; first_reg++)
1306: if (regs_ever_live[first_reg])
1307: break;
1308:
1309: /* If profiling, then we must save/restore every register that contains
1310: a parameter before/after the .mcount call. Use registers from 30 down
1311: to 23 to do this. Don't use the frame pointer in reg 31.
1312:
1313: For now, save enough room for all of the parameter registers. */
1314: if (profile_flag)
1315: if (first_reg > 23)
1316: first_reg = 23;
1317:
1318: return first_reg;
1319: }
1320:
1321: /* Similar, for FP regs. */
1322:
1323: int
1324: first_fp_reg_to_save ()
1325: {
1326: int first_reg;
1327:
1328: /* Find lowest numbered live register. */
1329: for (first_reg = 14 + 32; first_reg <= 63; first_reg++)
1330: if (regs_ever_live[first_reg])
1331: break;
1332:
1333: return first_reg;
1334: }
1335:
1336: /* Return 1 if we need to save CR. */
1337:
1338: int
1339: must_save_cr ()
1340: {
1341: return regs_ever_live[70] || regs_ever_live[71] || regs_ever_live[72];
1342: }
1343:
1344: /* Compute the size of the save area in the stack, including the space for
1345: the fixed area. */
1346:
1347: int
1348: rs6000_sa_size ()
1349: {
1350: int size;
1351:
1352: /* We have the six fixed words, plus the size of the register save
1353: areas, rounded to a double-word. */
1354: size = 6 + (32 - first_reg_to_save ()) + (64 - first_fp_reg_to_save ()) * 2;
1355: if (size & 1)
1356: size++;
1357:
1358: return size * 4;
1359: }
1360:
1361: /* Return non-zero if this function makes calls. */
1362:
1363: int
1364: rs6000_makes_calls ()
1365: {
1366: rtx insn;
1367:
1368: /* If we are profiling, we will be making a call to mcount. */
1369: if (profile_flag)
1370: return 1;
1371:
1372: for (insn = get_insns (); insn; insn = next_insn (insn))
1373: if (GET_CODE (insn) == CALL_INSN)
1374: return 1;
1375:
1376: return 0;
1377: }
1378:
1379: /* Return non-zero if this function needs to push space on the stack. */
1380:
1381: int
1382: rs6000_pushes_stack ()
1383: {
1384: int total_size = (rs6000_sa_size () + get_frame_size ()
1385: + current_function_outgoing_args_size);
1386:
1387: /* We need to push the stack if a frame pointer is needed (because the
1388: stack might be dynamically adjusted), if we are debugging, if the
1389: total stack size is more than 220 bytes, or if we make calls. */
1390:
1391: return (frame_pointer_needed || write_symbols != NO_DEBUG
1392: || total_size > 220
1393: || rs6000_makes_calls ());
1394: }
1395:
1396: /* Write function prologue. */
1397:
1398: void
1399: output_prolog (file, size)
1400: FILE *file;
1401: int size;
1402: {
1403: int first_reg = first_reg_to_save ();
1404: int must_push = rs6000_pushes_stack ();
1405: int first_fp_reg = first_fp_reg_to_save ();
1406: int basic_size = rs6000_sa_size ();
1407: int total_size = (basic_size + size + current_function_outgoing_args_size);
1408:
1409: /* Round size to multiple of 8 bytes. */
1410: total_size = (total_size + 7) & ~7;
1411:
1412: /* Write .extern for any function we will call to save and restore fp
1413: values. */
1414: if (first_fp_reg < 62)
1415: fprintf (file, "\t.extern ._savef%d\n\t.extern ._restf%d\n",
1416: first_fp_reg - 32, first_fp_reg - 32);
1417:
1418: /* Write .extern for truncation routines, if needed. */
1419: if (rs6000_trunc_used && ! trunc_defined)
1420: {
1421: fprintf (file, "\t.extern .itrunc\n\t.extern .uitrunc\n");
1422: trunc_defined = 1;
1423: }
1424:
1425: /* If we have to call a function to save fpr's, or if we are doing profiling,
1426: then we will be using LR. */
1427: if (first_fp_reg < 62 || profile_flag)
1428: regs_ever_live[65] = 1;
1429:
1430: /* If we use the link register, get it into r0. */
1431: if (regs_ever_live[65])
1432: asm_fprintf (file, "\tmflr 0\n");
1433:
1434: /* If we need to save CR, put it into r12. */
1435: if (must_save_cr ())
1436: asm_fprintf (file, "\tmfcr 12\n");
1437:
1438: /* Do any required saving of fpr's. If only one or two to save, do it
1439: ourself. Otherwise, call function. Note that since they are statically
1440: linked, we do not need a nop following them. */
1441: if (first_fp_reg == 62)
1442: asm_fprintf (file, "\tstfd 30,-16(1)\n\tstfd 31,-8(1)\n");
1443: else if (first_fp_reg == 63)
1444: asm_fprintf (file, "\tstfd 31,-8(1)\n");
1445: else if (first_fp_reg != 64)
1446: asm_fprintf (file, "\tbl ._savef%d\n", first_fp_reg - 32);
1447:
1448: /* Now save gpr's. */
1449: if (! TARGET_POWER || first_reg == 31)
1450: {
1451: int regno, loc;
1452:
1453: for (regno = first_reg,
1454: loc = - (32 - first_reg) * 4 - (64 - first_fp_reg) * 8;
1455: regno < 32;
1456: regno++, loc += 4)
1457: asm_fprintf (file, "\t{st|stw} %d,%d(1)\n", regno, loc);
1458: }
1459:
1460: else if (first_reg != 32)
1461: asm_fprintf (file, "\t{stm|stmw} %d,%d(1)\n", first_reg,
1462: - (32 - first_reg) * 4 - (64 - first_fp_reg) * 8);
1463:
1464: /* Save lr if we used it. */
1465: if (regs_ever_live[65])
1466: asm_fprintf (file, "\t{st|stw} 0,8(1)\n");
1467:
1468: /* Save CR if we use any that must be preserved. */
1469: if (must_save_cr ())
1470: asm_fprintf (file, "\t{st|stw} 12,4(1)\n");
1471:
1472: /* Update stack and set back pointer. */
1473: if (must_push)
1474: {
1475: if (total_size < 32767)
1476: asm_fprintf (file, "\t{stu|stwu} 1,%d(1)\n", - total_size);
1477: else
1478: {
1479: asm_fprintf (file, "\t{cau|addis} 0,0,%d\n\t{oril|ori} 0,0,%d\n",
1480: (total_size >> 16) & 0xffff, total_size & 0xffff);
1481: asm_fprintf (file, "\t{sf|subfc} 12,0,1\n");
1482: asm_fprintf (file, "\t{st|stw} 1,0(12)\n\t{oril|ori} 1,12,0\n");
1483: }
1484: }
1485:
1486: /* Set frame pointer, if needed. */
1487: if (frame_pointer_needed)
1488: asm_fprintf (file, "\t{oril|ori} 31,1,0\n");
1489:
1490: /* If TARGET_MINIMAL_TOC, and the constant pool is needed, then load the
1491: TOC_TABLE address into register 30. */
1492: if (TARGET_MINIMAL_TOC && get_pool_size () != 0)
1493: asm_fprintf (file, "\t{l|lwz} 30,LCTOC..0(2)\n");
1494: }
1495:
1496: /* Write function epilogue. */
1497:
1498: void
1499: output_epilog (file, size)
1500: FILE *file;
1501: int size;
1502: {
1503: int first_reg = first_reg_to_save ();
1504: int must_push = rs6000_pushes_stack ();
1505: int first_fp_reg = first_fp_reg_to_save ();
1506: int basic_size = rs6000_sa_size ();
1507: int total_size = (basic_size + size + current_function_outgoing_args_size);
1508: rtx insn = get_last_insn ();
1509:
1510: /* Round size to multiple of 8 bytes. */
1511: total_size = (total_size + 7) & ~7;
1512:
1513: /* If the last insn was a BARRIER, we don't have to write anything except
1514: the trace table. */
1515: if (GET_CODE (insn) == NOTE)
1516: insn = prev_nonnote_insn (insn);
1517: if (insn == 0 || GET_CODE (insn) != BARRIER)
1518: {
1519: /* If we have a frame pointer, a call to alloca, or a large stack
1520: frame, restore the old stack pointer using the backchain. Otherwise,
1521: we know what size to update it with. */
1522: if (frame_pointer_needed || current_function_calls_alloca
1523: || total_size > 32767)
1524: asm_fprintf (file, "\t{l|lwz} 1,0(1)\n");
1525: else if (must_push)
1526: asm_fprintf (file, "\t{ai|addic} 1,1,%d\n", total_size);
1527:
1528: /* Get the old lr if we saved it. */
1529: if (regs_ever_live[65])
1530: asm_fprintf (file, "\t{l|lwz} 0,8(1)\n");
1531:
1532: /* Get the old cr if we saved it. */
1533: if (must_save_cr ())
1534: asm_fprintf (file, "\t{l|lwz} 12,4(1)\n");
1535:
1536: /* Set LR here to try to overlap restores below. */
1537: if (regs_ever_live[65])
1538: asm_fprintf (file, "\tmtlr 0\n");
1539:
1540: /* Restore gpr's. */
1541: if (! TARGET_POWER || first_reg == 31)
1542: {
1543: int regno, loc;
1544:
1545: for (regno = first_reg,
1546: loc = - (32 - first_reg) * 4 - (64 - first_fp_reg) * 8;
1547: regno < 32;
1548: regno++, loc += 4)
1549: asm_fprintf (file, "\t{l|lwz} %d,%d(1)\n", regno, loc);
1550: }
1551:
1552: else if (first_reg != 32)
1553: asm_fprintf (file, "\t{lm|lmw} %d,%d(1)\n", first_reg,
1554: - (32 - first_reg) * 4 - (64 - first_fp_reg) * 8);
1555:
1556: /* Restore fpr's if we can do it without calling a function. */
1557: if (first_fp_reg == 62)
1558: asm_fprintf (file, "\tlfd 30,-16(1)\n\tlfd 31,-8(1)\n");
1559: else if (first_fp_reg == 63)
1560: asm_fprintf (file, "\tlfd 31,-8(1)\n");
1561:
1562: /* If we saved cr, restore it here. Just those of cr2, cr3, and cr4
1563: that were used. */
1564: if (must_save_cr ())
1565: asm_fprintf (file, "\tmtcrf %d,12\n",
1566: (regs_ever_live[70] != 0) * 0x20
1567: + (regs_ever_live[71] != 0) * 0x10
1568: + (regs_ever_live[72] != 0) * 0x8);
1569:
1570: /* If we have to restore more than two FP registers, branch to the
1571: restore function. It will return to our caller. */
1572: if (first_fp_reg < 62)
1573: asm_fprintf (file, "\tb ._restf%d\n", first_fp_reg - 32);
1574: else
1575: asm_fprintf (file, "\t{br|blr}\n");
1576: }
1577:
1578: /* Output a traceback table here. See /usr/include/sys/debug.h for info
1579: on its format. */
1580: {
1581: char *fname = XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0);
1582: int fixed_parms, float_parms, parm_info;
1583: int i;
1584:
1585: /* Need label immediately before tbtab, so we can compute its offset
1586: from the function start. */
1587: if (*fname == '*')
1588: ++fname;
1589: fprintf (file, "LT..");
1590: ASM_OUTPUT_LABEL (file, fname);
1591:
1592: /* The .tbtab pseudo-op can only be used for the first eight
1593: expressions, since it can't handle the possibly variable length
1594: fields that follow. However, if you omit the optional fields,
1595: the assembler outputs zeros for all optional fields anyways, giving each
1596: variable length field is minimum length (as defined in sys/debug.h).
1597: Thus we can not use the .tbtab pseudo-op at all. */
1598:
1599: /* An all-zero word flags the start of the tbtab, for debuggers that have
1600: to find it by searching forward from the entry point or from the
1601: current pc. */
1602: fprintf (file, "\t.long 0\n");
1603:
1604: /* Tbtab format type. Use format type 0. */
1605: fprintf (file, "\t.byte 0,");
1606:
1607: /* Language type. Unfortunately, there doesn't seem to be any official way
1608: to get this info, so we use language_string. C is 0. C++ is 9.
1609: No number defined for Obj-C, so use the value for C for now. */
1610: if (! strcmp (language_string, "GNU C")
1611: || ! strcmp (language_string, "GNU Obj-C"))
1612: i = 0;
1613: else if (! strcmp (language_string, "GNU F77"))
1614: i = 1;
1615: else if (! strcmp (language_string, "GNU Ada"))
1616: i = 3;
1617: else if (! strcmp (language_string, "GNU PASCAL"))
1618: i = 2;
1619: else if (! strcmp (language_string, "GNU C++"))
1620: i = 9;
1621: else
1622: abort ();
1623: fprintf (file, "%d,", i);
1624:
1625: /* 8 single bit fields: global linkage (not set for C extern linkage,
1626: apparently a PL/I convention?), out-of-line epilogue/prologue, offset
1627: from start of procedure stored in tbtab, internal function, function
1628: has controlled storage, function has no toc, function uses fp,
1629: function logs/aborts fp operations. */
1630: /* Assume that fp operations are used if any fp reg must be saved. */
1631: fprintf (file, "%d,", (1 << 5) | ((first_fp_reg != 64) << 1));
1632:
1633: /* 6 bitfields: function is interrupt handler, name present in proc table,
1634: function calls alloca, on condition directives (controls stack walks,
1635: 3 bits), saves condition reg, saves link reg. */
1636: /* The `function calls alloca' bit seems to be set whenever reg 31 is
1637: set up as a frame pointer, even when there is no alloca call. */
1638: fprintf (file, "%d,",
1639: ((1 << 6) | (frame_pointer_needed << 5)
1640: | (must_save_cr () << 1) | (regs_ever_live[65])));
1641:
1642: /* 3 bitfields: saves backchain, spare bit, number of fpr saved
1643: (6 bits). */
1644: fprintf (file, "%d,",
1645: (must_push << 7) | (64 - first_fp_reg_to_save ()));
1646:
1647: /* 2 bitfields: spare bits (2 bits), number of gpr saved (6 bits). */
1648: fprintf (file, "%d,", (32 - first_reg_to_save ()));
1649:
1650: {
1651: /* Compute the parameter info from the function decl argument list. */
1652: tree decl;
1653: int next_parm_info_bit;
1654:
1655: next_parm_info_bit = 31;
1656: parm_info = 0;
1657: fixed_parms = 0;
1658: float_parms = 0;
1659:
1660: for (decl = DECL_ARGUMENTS (current_function_decl);
1661: decl; decl = TREE_CHAIN (decl))
1662: {
1663: rtx parameter = DECL_INCOMING_RTL (decl);
1664: enum machine_mode mode = GET_MODE (parameter);
1665:
1666: if (GET_CODE (parameter) == REG)
1667: {
1668: if (GET_MODE_CLASS (mode) == MODE_FLOAT)
1669: {
1670: int bits;
1671:
1672: float_parms++;
1673:
1674: if (mode == SFmode)
1675: bits = 0x2;
1676: else if (mode == DFmode)
1677: bits = 0x3;
1678: else
1679: abort ();
1680:
1681: /* If only one bit will fit, don't or in this entry. */
1682: if (next_parm_info_bit > 0)
1683: parm_info |= (bits << (next_parm_info_bit - 1));
1684: next_parm_info_bit -= 2;
1685: }
1686: else
1687: {
1688: fixed_parms += ((GET_MODE_SIZE (mode) + (UNITS_PER_WORD - 1))
1689: / UNITS_PER_WORD);
1690: next_parm_info_bit -= 1;
1691: }
1692: }
1693: }
1694: }
1695:
1696: /* Number of fixed point parameters. */
1697: /* This is actually the number of words of fixed point parameters; thus
1698: an 8 byte struct counts as 2; and thus the maximum value is 8. */
1699: fprintf (file, "%d,", fixed_parms);
1700:
1701: /* 2 bitfields: number of floating point parameters (7 bits), parameters
1702: all on stack. */
1703: /* This is actually the number of fp registers that hold parameters;
1704: and thus the maximum value is 13. */
1705: /* Set parameters on stack bit if parameters are not in their original
1706: registers, regardless of whether they are on the stack? Xlc
1707: seems to set the bit when not optimizing. */
1708: fprintf (file, "%d\n", ((float_parms << 1) | (! optimize)));
1709:
1710: /* Optional fields follow. Some are variable length. */
1711:
1712: /* Parameter types, left adjusted bit fields: 0 fixed, 10 single float,
1713: 11 double float. */
1714: /* There is an entry for each parameter in a register, in the order that
1715: they occur in the parameter list. Any intervening arguments on the
1716: stack are ignored. If the list overflows a long (max possible length
1717: 34 bits) then completely leave off all elements that don't fit. */
1718: /* Only emit this long if there was at least one parameter. */
1719: if (fixed_parms || float_parms)
1720: fprintf (file, "\t.long %d\n", parm_info);
1721:
1722: /* Offset from start of code to tb table. */
1723: fprintf (file, "\t.long LT..");
1724: RS6000_OUTPUT_BASENAME (file, fname);
1725: fprintf (file, "-.");
1726: RS6000_OUTPUT_BASENAME (file, fname);
1727: fprintf (file, "\n");
1728:
1729: /* Interrupt handler mask. */
1730: /* Omit this long, since we never set the interrupt handler bit above. */
1731:
1732: /* Number of CTL (controlled storage) anchors. */
1733: /* Omit this long, since the has_ctl bit is never set above. */
1734:
1735: /* Displacement into stack of each CTL anchor. */
1736: /* Omit this list of longs, because there are no CTL anchors. */
1737:
1738: /* Length of function name. */
1739: fprintf (file, "\t.short %d\n", strlen (fname));
1740:
1741: /* Function name. */
1742: assemble_string (fname, strlen (fname));
1743:
1744: /* Register for alloca automatic storage; this is always reg 31.
1745: Only emit this if the alloca bit was set above. */
1746: if (frame_pointer_needed)
1747: fprintf (file, "\t.byte 31\n");
1748: }
1749: }
1750:
1751: /* Output a TOC entry. We derive the entry name from what is
1752: being written. */
1753:
1754: void
1755: output_toc (file, x, labelno)
1756: FILE *file;
1757: rtx x;
1758: int labelno;
1759: {
1760: char buf[256];
1761: char *name = buf;
1762: rtx base = x;
1763: int offset = 0;
1764:
1765: ASM_OUTPUT_INTERNAL_LABEL (file, "LC", labelno);
1766:
1767: /* Handle FP constants specially. Note that if we have a minimal
1768: TOC, things we put here aren't actually in the TOC, so we can allow
1769: FP constants. */
1770: if (GET_CODE (x) == CONST_DOUBLE
1771: && GET_MODE (x) == DFmode
1772: && TARGET_FLOAT_FORMAT == HOST_FLOAT_FORMAT
1773: && BITS_PER_WORD == HOST_BITS_PER_INT
1774: && ! (TARGET_NO_FP_IN_TOC && ! TARGET_MINIMAL_TOC))
1775: {
1776: if (TARGET_MINIMAL_TOC)
1777: fprintf (file, "\t.long %d\n\t.long %d\n",
1778: CONST_DOUBLE_LOW (x), CONST_DOUBLE_HIGH (x));
1779: else
1780: fprintf (file, "\t.tc FD_%x_%x[TC],%d,%d\n",
1781: CONST_DOUBLE_LOW (x), CONST_DOUBLE_HIGH (x),
1782: CONST_DOUBLE_LOW (x), CONST_DOUBLE_HIGH (x));
1783: return;
1784: }
1785: else if (GET_CODE (x) == CONST_DOUBLE && GET_MODE (x) == SFmode
1786: && ! (TARGET_NO_FP_IN_TOC && ! TARGET_MINIMAL_TOC))
1787: {
1788: rtx val = operand_subword (x, 0, 0, SFmode);
1789:
1790: if (val == 0 || GET_CODE (val) != CONST_INT)
1791: abort ();
1792:
1793: if (TARGET_MINIMAL_TOC)
1794: fprintf (file, "\t.long %d\n", INTVAL (val));
1795: else
1796: fprintf (file, "\t.tc FS_%x[TC],%d\n", INTVAL (val), INTVAL (val));
1797: return;
1798: }
1799:
1800: if (GET_CODE (x) == CONST)
1801: {
1802: base = XEXP (XEXP (x, 0), 0);
1803: offset = INTVAL (XEXP (XEXP (x, 0), 1));
1804: }
1805:
1806: if (GET_CODE (base) == SYMBOL_REF)
1807: name = XSTR (base, 0);
1808: else if (GET_CODE (base) == LABEL_REF)
1809: ASM_GENERATE_INTERNAL_LABEL (buf, "L", CODE_LABEL_NUMBER (XEXP (base, 0)));
1810: else if (GET_CODE (base) == CODE_LABEL)
1811: ASM_GENERATE_INTERNAL_LABEL (buf, "L", CODE_LABEL_NUMBER (base));
1812: else
1813: abort ();
1814:
1815: if (TARGET_MINIMAL_TOC)
1816: fprintf (file, "\t.long ");
1817: else
1818: {
1819: fprintf (file, "\t.tc ");
1820: RS6000_OUTPUT_BASENAME (file, name);
1821:
1822: if (offset < 0)
1823: fprintf (file, ".N%d", - offset);
1824: else if (offset)
1825: fprintf (file, ".P%d", offset);
1826:
1827: fprintf (file, "[TC],");
1828: }
1829: output_addr_const (file, x);
1830: fprintf (file, "\n");
1831: }
1832:
1833: /* Output an assembler pseudo-op to write an ASCII string of N characters
1834: starting at P to FILE.
1835:
1836: On the RS/6000, we have to do this using the .byte operation and
1837: write out special characters outside the quoted string.
1838: Also, the assembler is broken; very long strings are truncated,
1839: so we must artificially break them up early. */
1840:
1841: void
1842: output_ascii (file, p, n)
1843: FILE *file;
1844: char *p;
1845: int n;
1846: {
1847: char c;
1848: int i, count_string;
1849: char *for_string = "\t.byte \"";
1850: char *for_decimal = "\t.byte ";
1851: char *to_close = NULL;
1852:
1853: count_string = 0;
1854: for (i = 0; i < n; i++)
1855: {
1856: c = *p++;
1857: if (c >= ' ' && c < 0177)
1858: {
1859: if (for_string)
1860: fputs (for_string, file);
1861: putc (c, file);
1862:
1863: /* Write two quotes to get one. */
1864: if (c == '"')
1865: {
1866: putc (c, file);
1867: ++count_string;
1868: }
1869:
1870: for_string = NULL;
1871: for_decimal = "\"\n\t.byte ";
1872: to_close = "\"\n";
1873: ++count_string;
1874:
1875: if (count_string >= 512)
1876: {
1877: fputs (to_close, file);
1878:
1879: for_string = "\t.byte \"";
1880: for_decimal = "\t.byte ";
1881: to_close = NULL;
1882: count_string = 0;
1883: }
1884: }
1885: else
1886: {
1887: if (for_decimal)
1888: fputs (for_decimal, file);
1889: fprintf (file, "%d", c);
1890:
1891: for_string = "\n\t.byte \"";
1892: for_decimal = ", ";
1893: to_close = "\n";
1894: count_string = 0;
1895: }
1896: }
1897:
1898: /* Now close the string if we have written one. Then end the line. */
1899: if (to_close)
1900: fprintf (file, to_close);
1901: }
1902:
1903: /* Generate a unique section name for FILENAME for a section type
1904: represented by SECTION_DESC. Output goes into BUF.
1905:
1906: SECTION_DESC can be any string, as long as it is different for each
1907: possible section type.
1908:
1909: We name the section in the same manner as xlc. The name begins with an
1910: underscore followed by the filename (after stripping any leading directory
1911: names) with the last period replaced by the string SECTION_DESC. If
1912: FILENAME does not contain a period, SECTION_DESC is appended to the end of
1913: the name. */
1914:
1915: void
1916: rs6000_gen_section_name (buf, filename, section_desc)
1917: char **buf;
1918: char *filename;
1919: char *section_desc;
1920: {
1921: char *q, *after_last_slash, *last_period;
1922: char *p;
1923: int len;
1924:
1925: after_last_slash = filename;
1926: for (q = filename; *q; q++)
1927: {
1928: if (*q == '/')
1929: after_last_slash = q + 1;
1930: else if (*q == '.')
1931: last_period = q;
1932: }
1933:
1934: len = strlen (after_last_slash) + strlen (section_desc) + 2;
1935: *buf = (char *) permalloc (len);
1936:
1937: p = *buf;
1938: *p++ = '_';
1939:
1940: for (q = after_last_slash; *q; q++)
1941: {
1942: if (q == last_period)
1943: {
1944: strcpy (p, section_desc);
1945: p += strlen (section_desc);
1946: }
1947:
1948: else if (isalnum (*q))
1949: *p++ = *q;
1950: }
1951:
1952: if (last_period == 0)
1953: strcpy (p, section_desc);
1954: else
1955: *p = '\0';
1956: }
1957:
1958: /* Write function profiler code. */
1959:
1960: void
1961: output_function_profiler (file, labelno)
1962: FILE *file;
1963: int labelno;
1964: {
1965: /* The last used parameter register. */
1966: int last_parm_reg;
1967: int i, j;
1968:
1969: /* Set up a TOC entry for the profiler label. */
1970: toc_section ();
1971: if (TARGET_MINIMAL_TOC)
1972: fprintf (file, "LPC..%d:\n\t.long LP..%d\n", labelno, labelno);
1973: else
1974: fprintf (file, "LPC..%d:\n\t.tc\tLP..%d[TC],LP..%d\n",
1975: labelno, labelno, labelno);
1976: text_section ();
1977:
1978: /* Figure out last used parameter register. The proper thing to do is
1979: to walk incoming args of the function. A function might have live
1980: parameter registers even if it has no incoming args. */
1981:
1982: for (last_parm_reg = 10;
1983: last_parm_reg > 2 && ! regs_ever_live [last_parm_reg];
1984: last_parm_reg--)
1985: ;
1986:
1987: /* Save parameter registers in regs 23-30. Don't overwrite reg 31, since
1988: it might be set up as the frame pointer. */
1989:
1990: for (i = 3, j = 30; i <= last_parm_reg; i++, j--)
1991: fprintf (file, "\tai %d,%d,0\n", j, i);
1992:
1993: /* Load location address into r3, and call mcount. */
1994:
1995: fprintf (file, "\tl 3,LPC..%d(2)\n\tbl .mcount\n", labelno);
1996:
1997: /* Restore parameter registers. */
1998:
1999: for (i = 3, j = 30; i <= last_parm_reg; i++, j--)
2000: fprintf (file, "\tai %d,%d,0\n", i, j);
2001: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.