Annotation of GNUtools/cc/config/i370/mvs370.c, revision 1.1

1.1     ! root        1: /* Subroutines for insn-output.c for System/370.
        !             2:    Copyright (C) 1989, 1993 Free Software Foundation, Inc.
        !             3:    Contributed by Jan Stein ([email protected]).
        !             4:    Modified for MVS C/370 by Dave Pitts ([email protected])
        !             5: 
        !             6: This file is part of GNU CC.
        !             7: 
        !             8: GNU CC is free software; you can redistribute it and/or modify
        !             9: it under the terms of the GNU General Public License as published by
        !            10: the Free Software Foundation; either version 2, or (at your option)
        !            11: any later version.
        !            12: 
        !            13: GNU CC is distributed in the hope that it will be useful,
        !            14: but WITHOUT ANY WARRANTY; without even the implied warranty of
        !            15: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
        !            16: GNU General Public License for more details.
        !            17: 
        !            18: You should have received a copy of the GNU General Public License
        !            19: along with GNU CC; see the file COPYING.  If not, write to
        !            20: the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
        !            21: 
        !            22: #include <stdio.h>
        !            23: #include <string.h>
        !            24: #include <ctype.h>
        !            25: #include "config.h"
        !            26: #include "rtl.h"
        !            27: #include "regs.h"
        !            28: #include "hard-reg-set.h"
        !            29: #include "real.h"
        !            30: #include "insn-config.h"
        !            31: #include "conditions.h"
        !            32: #include "insn-flags.h"
        !            33: #include "output.h"
        !            34: #include "insn-attr.h"
        !            35: #include "flags.h"
        !            36: #include "recog.h"
        !            37: 
        !            38: 
        !            39: /* Label node, this structure is used to keep track of labels on the
        !            40:    current page.  */
        !            41: typedef struct label_node
        !            42:   {
        !            43:     struct label_node *label_next;
        !            44:     int label_id;
        !            45:     int label_page;
        !            46:   }
        !            47: label_node_t;
        !            48: 
        !            49: /* Is 1 when a label has been generated and the base register must be
        !            50:    reloaded.  */
        !            51: int mvs_label_emited = 0;
        !            52: 
        !            53: /* Current function starting base page.  */
        !            54: int function_base_page;
        !            55: 
        !            56: /* Length of the current page code.  */
        !            57: int mvs_page_code;
        !            58: 
        !            59: /* Length of the current page literals.  */
        !            60: int mvs_page_lit;
        !            61: 
        !            62: /* Current function name.  */
        !            63: char *mvs_function_name = 0;
        !            64: 
        !            65: /* Current function name length.  */
        !            66: int mvs_function_name_length = 0;
        !            67: 
        !            68: /* Page number for multi-page functions.  */
        !            69: int mvs_page_num = 0;
        !            70: 
        !            71: /* Label node list anchor.  */
        !            72: static label_node_t *label_anchor = 0;
        !            73: 
        !            74: /* Label node free list anchor.  */
        !            75: static label_node_t *free_anchor = 0;
        !            76: 
        !            77: /* Assembler source file decriptor.  */
        !            78: static FILE *assembler_source = 0;
        !            79: 
        !            80: /* Define the length of the internal MVS function table.  */
        !            81: #define MVS_FUNCTION_TABLE_LENGTH 32
        !            82: 
        !            83: /* C/370 internal function table.  These functions use non-standard linkage
        !            84:    and must handled in a special manner.  */
        !            85: static char *mvs_function_table[MVS_FUNCTION_TABLE_LENGTH] =
        !            86: {
        !            87:    "ceil",     "edc_acos", "edc_asin", "edc_ata2", "edc_atan", "edc_cos",
        !            88:    "edc_cosh", "edc_erf",  "edc_erfc", "edc_exp",  "edc_gamm", "edc_lg10",
        !            89:    "edc_log",  "edc_sin",  "edc_sinh", "edc_sqrt", "edc_tan",  "edc_tanh",
        !            90:    "fabs",     "floor",    "fmod",     "frexp",    "hypot",    "j0",
        !            91:    "j1",       "jn",       "ldexp",    "modf",     "pow",      "y0",
        !            92:    "y1",       "yn"
        !            93: };
        !            94: 
        !            95: /* ASCII to EBCDIC conversion table.  */
        !            96: #if defined(TARGET_EBCDIC) && !defined(HOST_EBCDIC)
        !            97: static unsigned char ascebc[256] =
        !            98: {
        !            99:  /*00  NL    SH    SX    EX    ET    NQ    AK    BL */
        !           100:      0x00, 0x01, 0x02, 0x03, 0x37, 0x2D, 0x2E, 0x2F,
        !           101:  /*08  BS    HT    LF    VT    FF    CR    SO    SI */
        !           102:      0x16, 0x05, 0x15, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
        !           103:  /*10  DL    D1    D2    D3    D4    NK    SN    EB */
        !           104:      0x10, 0x11, 0x12, 0x13, 0x3C, 0x3D, 0x32, 0x26,
        !           105:  /*18  CN    EM    SB    EC    FS    GS    RS    US */
        !           106:      0x18, 0x19, 0x3F, 0x27, 0x1C, 0x1D, 0x1E, 0x1F,
        !           107:  /*20  SP     !     "     #     $     %     &     ' */
        !           108:      0x40, 0x5A, 0x7F, 0x7B, 0x5B, 0x6C, 0x50, 0x7D,
        !           109:  /*28   (     )     *     +     ,     -    .      / */
        !           110:      0x4D, 0x5D, 0x5C, 0x4E, 0x6B, 0x60, 0x4B, 0x61,
        !           111:  /*30   0     1     2     3     4     5     6     7 */
        !           112:      0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7,
        !           113:  /*38   8     9     :     ;     <     =     >     ? */
        !           114:      0xF8, 0xF9, 0x7A, 0x5E, 0x4C, 0x7E, 0x6E, 0x6F,
        !           115:  /*40   @     A     B     C     D     E     F     G */
        !           116:      0x7C, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7,
        !           117:  /*48   H     I     J     K     L     M     N     O */
        !           118:      0xC8, 0xC9, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6,
        !           119:  /*50   P     Q     R     S     T     U     V     W */
        !           120:      0xD7, 0xD8, 0xD9, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6,
        !           121:  /*58   X     Y     Z     [     \     ]     ^     _ */
        !           122:      0xE7, 0xE8, 0xE9, 0xAD, 0xE0, 0xBD, 0x5F, 0x6D,
        !           123:  /*60   `     a     b     c     d     e     f     g */
        !           124:      0x79, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
        !           125:  /*68   h     i     j     k     l     m     n     o */
        !           126:      0x88, 0x89, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96,
        !           127:  /*70   p     q     r     s     t     u     v     w */
        !           128:      0x97, 0x98, 0x99, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6,
        !           129:  /*78   x     y     z     {     |     }     ~    DL */
        !           130:      0xA7, 0xA8, 0xA9, 0xC0, 0x4F, 0xD0, 0xA1, 0x07,
        !           131:      0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
        !           132:      0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
        !           133:      0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
        !           134:      0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
        !           135:      0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
        !           136:      0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
        !           137:      0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
        !           138:      0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
        !           139:      0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
        !           140:      0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
        !           141:      0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
        !           142:      0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
        !           143:      0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
        !           144:      0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
        !           145:      0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
        !           146:      0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xFF
        !           147: };
        !           148: #endif
        !           149: 
        !           150: /* EBCDIC to ASCII conversion table.  */
        !           151: #if defined(HOST_EBCDIC) && !defined(TARGET_EBCDIC)
        !           152: unsigned char ebcasc[256] =
        !           153: {
        !           154:  /*00  NU    SH    SX    EX    PF    HT    LC    DL */
        !           155:      0x00, 0x01, 0x02, 0x03, 0x00, 0x09, 0x00, 0x7F,
        !           156:  /*08              SM    VT    FF    CR    SO    SI */
        !           157:      0x00, 0x00, 0x00, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
        !           158:  /*10  DE    D1    D2    TM    RS    NL    BS    IL */
        !           159:      0x10, 0x11, 0x12, 0x13, 0x14, 0x0A, 0x08, 0x00,
        !           160:  /*18  CN    EM    CC    C1    FS    GS    RS    US */
        !           161:      0x18, 0x19, 0x00, 0x00, 0x1C, 0x1D, 0x1E, 0x1F,
        !           162:  /*20  DS    SS    FS          BP    LF    EB    EC */
        !           163:      0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x17, 0x1B,
        !           164:  /*28              SM    C2    EQ    AK    BL       */
        !           165:      0x00, 0x00, 0x00, 0x00, 0x05, 0x06, 0x07, 0x00,
        !           166:  /*30              SY          PN    RS    UC    ET */
        !           167:      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04,
        !           168:  /*38                    C3    D4    NK          SU */
        !           169:      0x00, 0x00, 0x00, 0x00, 0x14, 0x15, 0x00, 0x1A,
        !           170:  /*40  SP                                           */
        !           171:      0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        !           172:  /*48                     .     <     (     +     | */
        !           173:      0x00, 0x00, 0x00, 0x2E, 0x3C, 0x28, 0x2B, 0x7C,
        !           174:  /*50   &                                           */
        !           175:      0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        !           176:  /*58               !     $     *     )     ;     ^ */
        !           177:      0x00, 0x00, 0x21, 0x24, 0x2A, 0x29, 0x3B, 0x5E,
        !           178:  /*60   -     /                                     */
        !           179:      0x2D, 0x2F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        !           180:  /*68                     ,     %     _     >     ? */
        !           181:      0x00, 0x00, 0x00, 0x2C, 0x25, 0x5F, 0x3E, 0x3F,
        !           182:  /*70                                               */
        !           183:      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        !           184:  /*78         `     :     #     @     '     =     " */
        !           185:      0x00, 0x60, 0x3A, 0x23, 0x40, 0x27, 0x3D, 0x22,
        !           186:  /*80         a     b     c     d     e     f     g */
        !           187:      0x00, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
        !           188:  /*88   h     i           {                         */
        !           189:      0x68, 0x69, 0x00, 0x7B, 0x00, 0x00, 0x00, 0x00,
        !           190:  /*90         j     k     l     m     n     o     p */
        !           191:      0x00, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70,
        !           192:  /*98   q     r           }                         */
        !           193:      0x71, 0x72, 0x00, 0x7D, 0x00, 0x00, 0x00, 0x00,
        !           194:  /*A0         ~     s     t     u     v     w     x */
        !           195:      0x00, 0x7E, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,
        !           196:  /*A8   y     z                       [             */
        !           197:      0x79, 0x7A, 0x00, 0x00, 0x00, 0x5B, 0x00, 0x00,
        !           198:  /*B0                                               */
        !           199:      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        !           200:  /*B8                                 ]             */
        !           201:      0x00, 0x00, 0x00, 0x00, 0x00, 0x5D, 0x00, 0x00,
        !           202:  /*C0   {     A     B     C     D     E     F     G */
        !           203:      0x7B, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
        !           204:  /*C8   H     I                                     */
        !           205:      0x48, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        !           206:  /*D0   }     J     K     L     M     N     O     P */
        !           207:      0x7D, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50,
        !           208:  /*D8   Q     R                                     */
        !           209:      0x51, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        !           210:  /*E0   \           S     T     U     V     W     X */
        !           211:      0x5C, 0x00, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58,
        !           212:  /*E8   Y     Z                                     */
        !           213:      0x59, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        !           214:  /*F0   0     1     2     3     4     5     6     7 */
        !           215:      0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
        !           216:  /*F8   8     9                                     */
        !           217:      0x38, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF
        !           218: };
        !           219: #endif
        !           220: 
        !           221: /* Map characters from one character set to another.
        !           222:    C is the character to be translated.  */
        !           223: 
        !           224: char
        !           225: mvs_map_char (c)
        !           226:      char c;
        !           227: {
        !           228: #if defined(TARGET_EBCDIC) && !defined(HOST_EBCDIC)
        !           229:   return ascebc[c];
        !           230: #else
        !           231: #if defined(HOST_EBCDIC) && !defined(TARGET_EBCDIC)
        !           232:   return ebcasc[c];
        !           233: #else
        !           234:   return c;
        !           235: #endif
        !           236: #endif
        !           237: }
        !           238: 
        !           239: /* Emit reload of base register if indicated.  This is to eliminate multiple
        !           240:    reloads when several labels are generated pointing to the same place
        !           241:    in the code.  */
        !           242: 
        !           243: int
        !           244: check_label_emit (void)
        !           245: {
        !           246:   if (mvs_label_emited)
        !           247:     {
        !           248:       mvs_label_emited = 0;
        !           249:       mvs_page_code += 4;
        !           250:       fprintf (assembler_source, "\tL\t%d,%d(,%d)\n",
        !           251:          BASE_REGISTER, (mvs_page_num - function_base_page) * 4,
        !           252:          PAGE_REGISTER);
        !           253:     }
        !           254: }
        !           255: 
        !           256: /* Add the label to the current page label list.  If a free element is available
        !           257:    it will be used for the new label.  Otherwise, a label element will be
        !           258:    allocated from memory.
        !           259:    ID is the label number of the label being added to the list.  */
        !           260: 
        !           261: int
        !           262: mvs_add_label (id)
        !           263:      int id;
        !           264: {
        !           265:   label_node_t *lp;
        !           266: 
        !           267:   if (free_anchor)
        !           268:     {
        !           269:       lp = free_anchor;
        !           270:       free_anchor = lp->label_next;
        !           271:     }
        !           272:   else
        !           273:     {
        !           274:       lp = (label_node_t *) malloc (sizeof (label_node_t));
        !           275:       if (lp == 0)
        !           276:        {
        !           277:          fatal ("virtual memory exhausted\n");
        !           278:          abort ();
        !           279:        }
        !           280:     }
        !           281:   lp->label_id = id;
        !           282:   lp->label_page = mvs_page_num;
        !           283:   lp->label_next = label_anchor;
        !           284:   label_anchor = lp;
        !           285: }
        !           286: 
        !           287: /* Check to see if the label is in the list.  If 1 is returned then a load 
        !           288:    and branch on register must be generated.
        !           289:    ID is the label number of the label being checked.  */
        !           290: 
        !           291: int
        !           292: mvs_check_label (id)
        !           293:      int id;
        !           294: {
        !           295:   label_node_t *lp;
        !           296: 
        !           297:   for (lp = label_anchor; lp; lp = lp->label_next)
        !           298:     {
        !           299:       if (lp->label_id == id)
        !           300:        return 1;
        !           301:     }
        !           302:   return 0;
        !           303: }
        !           304: 
        !           305: /* The label list for the current page freed by linking the list onto the free
        !           306:    label element chain.  */
        !           307: 
        !           308: int
        !           309: mvs_free_label (void)
        !           310: {
        !           311:   if (label_anchor)
        !           312:     {
        !           313:       if (free_anchor)
        !           314:        label_anchor->label_next = free_anchor;
        !           315:       free_anchor = label_anchor;
        !           316:     }
        !           317:   label_anchor = 0;
        !           318: }
        !           319: 
        !           320: /* If the page size limit is reached a new code page is started, and the base
        !           321:    register is set to it.  This page break point is counted conservatively,
        !           322:    most literals that have the same value are collapsed by the assembler.
        !           323:    True is returned when a new page is started.
        !           324:    FILE is the assembler output file descriptor.
        !           325:    CODE is the length, in bytes, of the instruction to be emitted.
        !           326:    LIT is the length of the literal to be emitted.  */
        !           327: 
        !           328: int
        !           329: mvs_check_page (file, code, lit)
        !           330:      FILE *file;
        !           331:      int code, lit;
        !           332: {
        !           333:   if (file)
        !           334:     assembler_source = file;
        !           335: 
        !           336:   if (mvs_page_code + code + mvs_page_lit + lit > MAX_MVS_PAGE_LENGTH)
        !           337:     {
        !           338:       fprintf (assembler_source, "\tB\tPGE%d\n", mvs_page_num);
        !           339:       fprintf (assembler_source, "\tDS\t0F\n");
        !           340:       fprintf (assembler_source, "\tLTORG\n");
        !           341:       fprintf (assembler_source, "\tDS\t0F\n");
        !           342:       fprintf (assembler_source, "PGE%d\tEQU\t*\n", mvs_page_num);
        !           343:       fprintf (assembler_source, "\tDROP\t%d\n", BASE_REGISTER);
        !           344:       mvs_page_num++;
        !           345:       fprintf (assembler_source, "\tBALR\t%d,0\n", BASE_REGISTER);
        !           346:       fprintf (assembler_source, "PG%d\tEQU\t*\n", mvs_page_num);
        !           347:       fprintf (assembler_source, "\tUSING\t*,%d\n", BASE_REGISTER);
        !           348:       mvs_free_label ();
        !           349:       mvs_page_code = code;
        !           350:       mvs_page_lit = lit;
        !           351:       return 1;
        !           352:     }
        !           353:   mvs_page_code += code;
        !           354:   mvs_page_lit += lit;
        !           355:   return 0;
        !           356: }
        !           357: 
        !           358: /* Check for C/370 runtime function, they don't use standard calling
        !           359:    conventions.  True is returned if the function is in the table.
        !           360:    NAME is the name of the current function.  */
        !           361: 
        !           362: int
        !           363: mvs_function_check (name)
        !           364:      char *name;
        !           365: {
        !           366:   int lower, middle, upper;
        !           367:   int i;
        !           368: 
        !           369:   lower = 0;
        !           370:   upper = MVS_FUNCTION_TABLE_LENGTH - 1;
        !           371:   while (lower <= upper)
        !           372:     {
        !           373:       middle = (lower + upper) / 2;
        !           374:       i = strcmp (name, mvs_function_table[middle]);
        !           375:       if (i == 0)
        !           376:        return 1;
        !           377:       if (i < 0)
        !           378:        upper = middle - 1;
        !           379:       else
        !           380:        lower = middle + 1;
        !           381:     }
        !           382:   return 0;
        !           383: }
        !           384: 
        !           385: 
        !           386: /* Return 1 if OP is a valid S operand for an RS, SI or SS type instruction.
        !           387:    OP is the current operation.
        !           388:    MODE is the current operation mode.  */
        !           389: 
        !           390: int
        !           391: s_operand (op, mode)
        !           392:      register rtx op;
        !           393:      enum machine_mode mode;
        !           394: {
        !           395:   extern int volatile_ok;
        !           396:   register enum rtx_code code = GET_CODE (op);
        !           397: 
        !           398:   if (CONSTANT_ADDRESS_P (op))
        !           399:     return 1;
        !           400:   if (mode == VOIDmode || GET_MODE (op) != mode)
        !           401:     return 0;
        !           402:   if (code == MEM)
        !           403:     {
        !           404:       register rtx x = XEXP (op, 0);
        !           405: 
        !           406:       if (!volatile_ok && op->volatil)
        !           407:        return 0;
        !           408:       if (REG_P (x) && REG_OK_FOR_BASE_P (x))
        !           409:        return 1;
        !           410:       if (GET_CODE (x) == PLUS
        !           411:          && REG_P (XEXP (x, 0)) && REG_OK_FOR_BASE_P (XEXP (x, 0))
        !           412:          && GET_CODE (XEXP (x, 1)) == CONST_INT
        !           413:          && (unsigned) INTVAL (XEXP (x, 1)) < 4096)
        !           414:        return 1;
        !           415:     }
        !           416:   return 0;
        !           417: }
        !           418: 
        !           419: 
        !           420: /* Return 1 if OP is a valid R or S operand for an RS, SI or SS type
        !           421:    instruction.
        !           422:    OP is the current operation.
        !           423:    MODE is the current operation mode.  */
        !           424: 
        !           425: int
        !           426: r_or_s_operand (op, mode)
        !           427:      register rtx op;
        !           428:      enum machine_mode mode;
        !           429: {
        !           430:   extern int volatile_ok;
        !           431:   register enum rtx_code code = GET_CODE (op);
        !           432: 
        !           433:   if (CONSTANT_ADDRESS_P (op))
        !           434:     return 1;
        !           435:   if (mode == VOIDmode || GET_MODE (op) != mode)
        !           436:     return 0;
        !           437:   if (code == REG)
        !           438:     return 1;
        !           439:   else if (code == MEM)
        !           440:     {
        !           441:       register rtx x = XEXP (op, 0);
        !           442: 
        !           443:       if (!volatile_ok && op->volatil)
        !           444:        return 0;
        !           445:       if (REG_P (x) && REG_OK_FOR_BASE_P (x))
        !           446:        return 1;
        !           447:       if (GET_CODE (x) == PLUS
        !           448:          && REG_P (XEXP (x, 0)) && REG_OK_FOR_BASE_P (XEXP (x, 0))
        !           449:          && GET_CODE (XEXP (x, 1)) == CONST_INT
        !           450:          && (unsigned) INTVAL (XEXP (x, 1)) < 4096)
        !           451:        return 1;
        !           452:     }
        !           453:   return 0;
        !           454: }
        !           455: 
        !           456: 
        !           457: /* Return 1 if the next instruction is an unsigned jump instruction.
        !           458:    INSN is the current instruction.  */
        !           459: 
        !           460: unsigned_jump_follows_p (insn)
        !           461:      register rtx insn;
        !           462: {
        !           463:   insn = NEXT_INSN (insn);
        !           464:   if (GET_CODE (insn) != JUMP_INSN)
        !           465:     return 0;
        !           466: 
        !           467:   insn = XEXP (insn, 3);
        !           468:   if (GET_CODE (insn) != SET)
        !           469:     return 0;
        !           470: 
        !           471:   if (GET_CODE (XEXP (insn, 0)) != PC)
        !           472:     return 0;
        !           473: 
        !           474:   insn = XEXP (insn, 1);
        !           475:   if (GET_CODE (insn) != IF_THEN_ELSE)
        !           476:     return 0;
        !           477: 
        !           478:   insn = XEXP (insn, 0);
        !           479:   return GET_CODE (insn) != GE && GET_CODE (insn) != GT
        !           480:     && GET_CODE (insn) != LE && GET_CODE (insn) != LT;
        !           481: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.