Annotation of coherent/b/bin/c/n1/i386/table1.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * n1/i386/table1.c
        !             3:  * Machine specific tables used by the code generator coder.
        !             4:  * i386.
        !             5:  */
        !             6: 
        !             7: #ifdef   vax
        !             8: #include "INC$LIB:cc1.h"
        !             9: #else
        !            10: #include "cc1.h"
        !            11: #endif
        !            12: 
        !            13: /*
        !            14:  * Width table.
        !            15:  * Indexed by type.
        !            16:  * Values determine relative order of widths for iswiden(),
        !            17:  * they are not widths in bytes.
        !            18:  */
        !            19: char   wtype[] = {
        !            20:        0,      0,              /* S8   U8              */
        !            21:        1,      1,              /* S16  U16             */
        !            22:        2,      2,              /* S32  U32             */
        !            23:        3,      4,              /* F32  F64             */
        !            24:        5,                      /* BLK                  */
        !            25:        0,      1,      2,      /* FLD8 FLD16   FLD32   */
        !            26:        2,      2               /* PTR  PTRB            */
        !            27: };
        !            28: 
        !            29: /*
        !            30:  * Register table.
        !            31:  * Indexed by 'real' register numbers (as defined in mch.h).
        !            32:  * Dword values go in EAX|EBX|ECX|EDX|EDI|ESI.
        !            33:  * The code selector selects byte and word registers
        !            34:  * by the corresponding dword register; thus,
        !            35:  * word values go in EAX|EBX|ECX|EDX|EDI|ESI (i.e. AX|BX|CX|DX|DI|SI), and
        !            36:  * byte values go in EAX|EBX|ECX|EDX (i.e. AL|BL|CL|DL; AH|BH|CH|DH are unused).
        !            37:  * This allows TREG sharing of e.g. EAX/AX/AL and makes it easy to generate
        !            38:  * decent code for the shorter types.
        !            39:  * gen1.c/coderinit() patches the EDX:EAX and FPAC entries if -VNDP;
        !            40:  * values below are for software fp, for NDP rvalue KD is FPAC, not EDX:EAX.
        !            41:  */
        !            42: REGDESC        reg[]   = {
        !            43: 
        !            44: /*         KIND     KIND     int     REGNAME  REGNAME  REGNAME PREGSET */
        !            45: /*         r_lvalue r_rvalue r_goal  r_enpair r_hihalf r_lohalf r_phys */
        !            46: 
        !            47: /* eax */      KBWL,  KBWL,  MRVALUE,  EDXEAX, -1,     AX,     BEAX,
        !            48: /* edx */      KBWL,  KBWL,  MRVALUE,  EDXEAX, -1,     DX,     BEDX,
        !            49: /* ebx */      KBWL,  KBWL,  MRVALUE,  -1,     -1,     BX,     BEBX,
        !            50: /* ecx */      KBWL,  KBWL,  MRVALUE,  -1,     -1,     CX,     BECX,
        !            51: /* esi */      KBWL,  KWL,   MRVALUE,  -1,     -1,     SI,     BESI,
        !            52: /* edi */      KBWL,  KWL,   MRVALUE,  -1,     -1,     DI,     BEDI,
        !            53: /* esp */      0,     0,     -1,       -1,     -1,     -1,     BESP,
        !            54: /* ebp */      KBWL,  0,     -1,       -1,     -1,     -1,     BEBP,
        !            55: 
        !            56: /* edx:eax */  0,     KD,    MRVALUE,  -1,     EDX,    EAX,    BEDX|BEAX,
        !            57: 
        !            58: /* ax  */      0,     0,     MRVALUE,  EAX,    AH,     AL,     BEAX,
        !            59: /* dx  */      0,     0,     MRVALUE,  EDX,    DH,     DL,     BEDX,
        !            60: /* bx  */      0,     0,     MRVALUE,  EBX,    BH,     BL,     BEBX,
        !            61: /* cx  */      0,     0,     MRVALUE,  ECX,    CH,     CL,     BECX,
        !            62: /* si  */      0,     0,     MRVALUE,  -1,     -1,     -1,     BESI,
        !            63: /* di  */      0,     0,     MRVALUE,  -1,     -1,     -1,     BEDI,
        !            64: /* sp  */      0,     0,     -1,       -1,     -1,     -1,     BESP,
        !            65: /* bp  */      0,     0,     -1,       -1,     -1,     -1,     BEBP,
        !            66: 
        !            67: /* al  */      0,     0,     -1,       AX,     -1,     -1,     BEAX,
        !            68: /* bl  */      0,     0,     -1,       BX,     -1,     -1,     BEBX,
        !            69: /* cl  */      0,     0,     -1,       CX,     -1,     -1,     BECX,
        !            70: /* dl  */      0,     0,     -1,       DX,     -1,     -1,     BEDX,
        !            71: /* ah  */      0,     0,     -1,       AX,     -1,     -1,     BEAX,
        !            72: /* bh  */      0,     0,     -1,       BX,     -1,     -1,     BEBX,
        !            73: /* ch  */      0,     0,     -1,       CX,     -1,     -1,     BECX,
        !            74: /* dh  */      0,     0,     -1,       DX,     -1,     -1,     BEDX,
        !            75: 
        !            76: /* st  */      0,     0,    MRVALUE,  -1,      -1,     -1,     BFPAC
        !            77: 
        !            78: /* None        */
        !            79: /* Anyr        */
        !            80: /* Anyl        */
        !            81: /* Pair        */
        !            82: /* Temp        */
        !            83: /* Lo  */
        !            84: /* Hi  */
        !            85: 
        !            86: };
        !            87: 
        !            88: /*
        !            89:  * The opcode table.
        !            90:  * Indexed by operation.
        !            91:  * The 0th and 1st entries of the relations are used by REL0 and by REL1.
        !            92:  * The 2nd entry is the special supress EQ/NE entry used by LREL1 and LREL0.
        !            93:  */
        !            94: unsigned char  optab[][3] = {
        !            95: 
        !            96:        {       ZADD,   ZINC,   ZADC    },              /* ADD */
        !            97:        {       ZSUB,   ZDEC,   ZSBB    },              /* SUB */
        !            98:        {       ZMUL,   0,      0       },              /* MUL */
        !            99:        {       ZDIV,   0,      0       },              /* DIV */
        !           100:        {       ZDIV,   0,      0       },              /* REM */
        !           101:        {       ZAND,   ZTEST,  ZSUB    },              /* AND */
        !           102:        {       ZOR,    0,      0       },              /* OR  */
        !           103:        {       ZXOR,   ZNOT,   0       },              /* XOR */
        !           104:        {       ZSAL,   ZSHL,   ZRCL    },              /* SHL */
        !           105:        {       ZSAR,   ZSHR,   ZRCR    },              /* SHR */
        !           106: 
        !           107:        {       ZADD,   ZINC,   ZADC    },              /* AADD */
        !           108:        {       ZSUB,   ZDEC,   ZSBB    },              /* ASUB */
        !           109:        {       ZMUL,   ZMOV,   ZMOVB   },              /* AMUL */
        !           110:        {       ZDIV,   ZMOV,   ZMOVB   },              /* ADIV */
        !           111:        {       ZDIV,   ZMOV,   ZMOVB   },              /* AREM */
        !           112:        {       ZAND,   ZSUB,   0       },              /* AAND */
        !           113:        {       ZOR,    0,      0       },              /* AOR  */
        !           114:        {       ZXOR,   ZNOT,   0       },              /* AXOR */
        !           115:        {       ZSAL,   ZSHL,   ZRCL    },              /* ASHL */
        !           116:        {       ZSAR,   ZSHR,   ZRCR    },              /* ASHR */
        !           117: 
        !           118:        {       ZJE,    ZJE,    0       },              /* EQ  */
        !           119:        {       ZJNE,   ZJNE,   0       },              /* NE  */
        !           120:        {       ZJG,    0,      ZJG     },              /* GT  */
        !           121:        {       ZJGE,   ZJNS,   ZJG     },              /* GE  */
        !           122:        {       ZJLE,   0,      ZJL     },              /* LE  */
        !           123:        {       ZJL,    ZJS,    ZJL     },              /* LT  */
        !           124:        {       ZJA,    0,      ZJA     },              /* UGT */
        !           125:        {       ZJAE,   0,      ZJA     },              /* UGE */
        !           126:        {       ZJBE,   0,      ZJB     },              /* ULE */
        !           127:        {       ZJB,    0,      ZJB     },              /* ULT */
        !           128: 
        !           129:        {       0,      0,      0       },              /* STAR    */
        !           130:        {       0,      0,      0       },              /* ADDR    */
        !           131:        {       ZNEG,   ZSBB,   0       },              /* NEG     */
        !           132:        {       ZNOT,   0,      0       },              /* COM     */
        !           133:        {       0,      0,      0       },              /* NOT     */
        !           134:        {       0,      0,      0       },              /* QUEST   */
        !           135:        {       0,      0,      0       },              /* COLON   */
        !           136:        {       ZADD,   ZINC,   0       },              /* INCBEF  */
        !           137:        {       ZSUB,   ZDEC,   0       },              /* DECBEF  */
        !           138:        {       ZADD,   ZINC,   0       },              /* INCAFT  */
        !           139:        {       ZSUB,   ZDEC,   0       },              /* DECAFT  */
        !           140:        {       0,      0,      0       },              /* COMMA   */
        !           141:        {       0,      0,      0       },              /* CALL    */
        !           142:        {       0,      0,      0       },              /* ANDAND  */
        !           143:        {       0,      0,      0       },              /* OROR    */
        !           144:        {       0,      0,      0       },              /* CAST    */
        !           145:        {       0,      0,      0       },              /* CONVERT */
        !           146:        {       0,      0,      0       },              /* FIELD   */
        !           147:        {       0,      0,      0       },              /* SIZEOF  */
        !           148:        {       ZMOV,   ZSUB,   0       },              /* ASSIGN  */
        !           149:        {       0,      0,      0       },              /* NOP     */
        !           150:        {       0,      0,      0       },              /* INIT    */
        !           151:        {       0,      0,      0       },              /* ARGLST  */
        !           152:        {       0,      0,      0       },              /* LEAF    */
        !           153:        {       0,      0,      0       },              /* FIXUP   */
        !           154:        {       0,      0,      0       }               /* BLKMOVE */
        !           155: };
        !           156: 
        !           157: /*
        !           158:  * Per type info.
        !           159:  * Column 0 is function return register (-1 if never a return type).
        !           160:  * Column 1 is function return context, for select.
        !           161:  * Column 2 is size of a temp.
        !           162:  * Column 3 is the actual size in memory, for autoinc/autodec.
        !           163:  * Column 4 is bit set for searching pattern tables.
        !           164:  * Column 5 is register kind.
        !           165:  * Column 6 is register kind for a pair.
        !           166:  * gen1.c/coderinit() patches the F64 entry if -VNDP;
        !           167:  * its return register name below is for software fp but is FPAC if -VNDP.
        !           168:  */
        !           169: PERTYPE        pertype[] = {
        !           170: /*             REGNAME char            char    char    TYPESET KIND    KIND    */
        !           171: /*             p_frreg p_frcat         p_size  p_incr  p_type  p_kind  p_pair  */
        !           172: /* S8    */  { EAX,    MRVALUE,        4,      1,      FS8,    KB,     KL      },
        !           173: /* U8    */  { EAX,    MRVALUE,        4,      1,      FU8,    KB,     KL      },
        !           174: /* S16   */  { EAX,    MRVALUE,        4,      2,      FS16,   KW,     KL      },
        !           175: /* U16   */  { EAX,    MRVALUE,        4,      2,      FU16,   KW,     KL      },
        !           176: /* S32   */  { EAX,    MRVALUE,        4,      4,      FS32,   KL,     0       },
        !           177: /* U32   */  { EAX,    MRVALUE,        4,      4,      FU32,   KL,     0       },
        !           178: /* F32   */  { -1,     MRVALUE,        8,      4,      FF32,   0,      0       },
        !           179: /* F64   */  { EDXEAX, MRVALUE,        8,      8,      FF64,   KD,     0       },
        !           180: /* BLK   */  { -1,     MRVALUE,        0,      0,      FBLK,   0,      0       },
        !           181: /* FLD8  */  { -1,     MRVALUE,        0,      0,      FFLD8,  0,      0       },
        !           182: /* FLD16 */  { -1,     MRVALUE,        0,      0,      FFLD16, 0,      0       },
        !           183: /* FLD32 */  { -1,     MRVALUE,        0,      0,      FFLD32, 0,      0       },
        !           184: /* PTR  */   { EAX,    MRVALUE,        4,      4,      FPTR,   KP,     0       },
        !           185: /* PTB  */   { EAX,    MRVALUE,        4,      4,      FPTB,   KP,     0       }
        !           186: };
        !           187: 
        !           188: /*
        !           189:  * These tables adjust relational ops when the
        !           190:  * sense is reversed or when the subtrees are swapped.
        !           191:  */
        !           192: char   fliprel[] = {
        !           193:        EQ, NE, LT, LE, GE, GT, ULT, ULE, UGE, UGT
        !           194: };
        !           195: 
        !           196: char   otherel[] = {
        !           197:        NE, EQ, LE, LT, GT, GE, ULE, ULT, UGT, UGE
        !           198: };
        !           199: 
        !           200: /*
        !           201:  * Type table.
        !           202:  * Indexed by machine type.
        !           203:  * Used by type testing macros defined in cc1mch.h.
        !           204:  */
        !           205: char   tinfo[] = {
        !           206:        0060,   0064,           /* S8   U8      */
        !           207:        0022,   0026,           /* S16  U16     */
        !           208:        0021,   0025,           /* S32  U32     */
        !           209:        0010,   0010,           /* F32  F64     */
        !           210:        0100,                   /* BLK          */
        !           211:        0060,                   /* FLD8         */
        !           212:        0022,                   /* FLD16        */
        !           213:        0021,                   /* FLD32        */
        !           214:        0205,   0305            /* PTR  PTB     */
        !           215: };
        !           216: 
        !           217: /* end of n1/i386/table1.c */

unix.superglobalmegacorp.com

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