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