Annotation of coherent/b/bin/c/n1/i386/tables/leaves.t, revision 1.1.1.1

1.1       root        1: //////////
                      2: / n1/i386/tables/leaves.t
                      3: //////////
                      4: 
                      5: /////////
                      6: /
                      7: / Leaf nodes, fixups, type conversions and casts,
                      8: / all performed by a single table.
                      9: / Table of contents:
                     10: /      1. Loads.
                     11: /      2. Widens.
                     12: /      3. Shrinks.
                     13: /      4. Tests.
                     14: /      5. Function arguments.
                     15: /      6. Cleanups
                     16: / These tables MUST be correct and complete, since they get used
                     17: / to fix up any missing entries in the other tables.
                     18: / Work on them carefully!
                     19: / The compiler is not very good at detecting errors or omissions here.
                     20: / A missing fixup entry usually makes the compiler run out of stack
                     21: / as the code generator calls itself again and again.
                     22: /
                     23: /////////
                     24: 
                     25: CONVERT:
                     26: CAST:
                     27: FIXUP:
                     28: LEAF:
                     29: 
                     30: /////////
                     31: /
                     32: / 1. Loads.
                     33: /
                     34: /////////
                     35: 
                     36: / Load a constant 0 (long, word or byte) or NULL (pointer).
                     37: / The subtract instruction is the shortest and fastest way to zero a register.
                     38: %      PVALUE
                     39:        NFLT            ANYR    *       *       TEMP
                     40:                0|MMX           *
                     41:                *               *
                     42:                        [ZSUB]  [R],[R]
                     43: 
                     44: / Load an effective address.
                     45: %      PVALUE
                     46:        DWORD           ANYR    *       *       TEMP
                     47:                LEA|MMX         DWORD
                     48:                *               *
                     49:                        [ZLEA]  [R],[NSE AL]
                     50: 
                     51: / For the word and byte patterns below,
                     52: / if [AL] is register, e.g. EAX (meaning word AX or byte AL),
                     53: / the generated ZMOV looks wrong (using EAX rather than AX or AL),
                     54: / but it gets cleaned up ex post facto by n2/i386/asm.c/asm().
                     55: / This is a kludge but at the moment I see no way around it.
                     56: / Load a dword.
                     57: %      PVALUE
                     58:        DWORD           ANYR    *       *       TEMP
                     59:                ADR|IMM         DWORD
                     60:                *               *
                     61: / Load a word.
                     62: %      PVALUE
                     63:        WORD            ANYR    *       *       TEMP
                     64:                ADR|IMM         WORD
                     65:                *               *
                     66: / Load a byte.
                     67: %      PVALUE|PBYTE
                     68:        BYTE            ANYR    *       *       TEMP
                     69:                ADR|IMM         BYTE
                     70:                *               *
                     71:                        [TN ZMOV]       [TN R],[AL]
                     72: 
                     73: / DECVAX or IEEE software floating point loads.
                     74: / Double immediate load.
                     75: %      PVALUE|PIEEE|PDECVAX
                     76:        FF64            EDXEAX  *       *       TEMP
                     77:                IMM|MMX         FF64
                     78:                *               *
                     79:                        [ZMOV]  [HI R],[HI AL]
                     80:                        [ZMOV]  [LO R],[LO AL]
                     81: 
                     82: / Double load.
                     83: / The bogus left arg spec EDX prevents EDX from being used
                     84: / for addressing the left arg, which would make the second fetch invalid.
                     85: %      PVALUE|PIEEE|PDECVAX
                     86:        FF64            EDXEAX  EDX     *       TEMP
                     87:                ADR             FF64
                     88:                *               *
                     89:                        [ZMOV]  [HI R],[HI AL]
                     90:                        [ZMOV]  [LO R],[LO AL]
                     91: 
                     92: / The float load actually loads 64 bits.
                     93: / It exists for much the same reasons as the byte and word loads.
                     94: / DECVAX format: 0-extend the float to double.
                     95: %      PVALUE|PDECVAX
                     96:        FLOAT           EDXEAX  *       *       TEMP
                     97:                ADR|IMM         FF32
                     98:                *               *
                     99:                        [ZMOV]  [HI R],[AL]
                    100:                        [ZMOV]  [LO R],[CONST 0]
                    101: 
                    102: / IEEE format: convert float to double.
                    103: %      PVALUE|PIEEE
                    104:        FLOAT           EDXEAX  *       *       TEMP
                    105:                ADR|IMM         FF32
                    106:                *               *
                    107:                        [ZMOV]  [LO R],[AL]
                    108:                        [ZCALL] [GID _dfcvt]
                    109: 
                    110: / Floating point loads using the numeric data coprocessor (80x87).
                    111: / Load floating 0.
                    112: %      PVALUE|PNDP
                    113:        FF64            FPAC    *       *       FPAC
                    114:                0|MMX           *
                    115:                *               *
                    116:                        [ZFLDZ]
                    117: 
                    118: / Load floating 1.
                    119: %      PVALUE|PNDP
                    120:        FF64            FPAC    *       *       FPAC
                    121:                1|MMX           *
                    122:                *               *
                    123:                        [ZFLD1]
                    124: 
                    125: / General floating point load.
                    126: %      PVALUE|PNDP
                    127:        FF64            FPAC    *       *       FPAC
                    128:                ADR             FF64
                    129:                *               *
                    130:                        [ZFLDD] [AL]
                    131: 
                    132: /////////
                    133: /
                    134: / 2. Widens.
                    135: /
                    136: /////////
                    137: 
                    138: / Widen short to dword.
                    139: / If [AL] is register, e.g. EAX (meaning word AX or byte AL),
                    140: / the generated ZMOVSX looks wrong (using EAX rather than AX or AL),
                    141: / but it gets cleaned up ex post facto by n2/i386/asm.c/asm().
                    142: / This is a kludge but at the moment I see no way around it.
                    143: %      PVALUE|PEFFECT
                    144:        DWORD           ANYR    *       *       TEMP
                    145:                ADR             SHORT
                    146:                *               *
                    147: / Widen byte to word.
                    148: %      PVALUE|PEFFECT
                    149:        WORD            ANYR    *       *       TEMP
                    150:                ADR             BYTE
                    151:                *               *
                    152:                        [TL ZMOVSX]     [R],[AL]
                    153: 
                    154: / DECVAX or IEEE software floating point.
                    155: / Widen signed immediate dword to double.
                    156: %      PVALUE|PEFFECT|PDECVAX|PIEEE
                    157:        FF64            EDXEAX  *       *       TEMP
                    158:                IMM|MMX         FS32
                    159:                *               *
                    160:                        [ZMOV]          [LO R],[AL]
                    161:                        [ZCALL]         [GID _dicvt]
                    162: 
                    163: / Widen signed integer to double.
                    164: %      PVALUE|PEFFECT|PDECVAX|PIEEE
                    165:        FF64            EDXEAX  *       *       TEMP
                    166:                ADR             FS8|FS16|FS32
                    167:                *               *
                    168:                        [TL ZMOVSX]     [LO R],[AL]
                    169:                        [ZCALL]         [GID _dicvt]
                    170: 
                    171: / Widen unsigned immediate dword to double.
                    172: %      PVALUE|PEFFECT|PDECVAX|PIEEE
                    173:        FF64            EDXEAX  *       *       TEMP
                    174:                IMM|MMX         FU32|PTX
                    175:                *               *
                    176:                        [ZMOV]          [LO R],[AL]
                    177:                        [ZCALL]         [GID _ducvt]
                    178: 
                    179: / Widen unsigned integer to double.
                    180: %      PVALUE|PEFFECT|PDECVAX|PIEEE
                    181:        FF64            EDXEAX  *       *       TEMP
                    182:                ADR             FU8|FU16|FU32|PTX
                    183:                *               *
                    184:                        [TL ZMOVZX]     [LO R],[AL]
                    185:                        [ZCALL]         [GID _ducvt]
                    186: 
                    187: / Widen float to double.
                    188: %      PVALUE|PEFFECT|PDECVAX|PIEEE
                    189:        FF64            EDXEAX  *       *       TEMP
                    190:                ADR|IMM         FF32
                    191:                *               *
                    192:                        [ZMOV]          [LO R],[AL]
                    193:                        [ZCALL]         [GID _dfcvt]
                    194: 
                    195: / Widen to NDP float or double.
                    196: %      PVALUE|PNDP
                    197:        FLOAT           FPAC    *       *       FPAC
                    198:                ADR             FS16|FS32|FF32
                    199:                *               *
                    200:                        [TL ZFLDD] [AL]
                    201: 
                    202: /////////
                    203: /
                    204: / 3. Shrinks.
                    205: / The word or byte value is simply the LO or LO LO part of the register.
                    206: /
                    207: /////////
                    208: 
                    209: / To word.
                    210: / Immediate to word.
                    211: %      PVALUE|PEFFECT
                    212:        WORD            ANYR    *       *       TEMP
                    213:                IMM|MMX         DWORD
                    214:                *               *
                    215:                        [ZMOVW] [LO R],[LO AL]
                    216: 
                    217: / Dword to word.
                    218: %      PVALUE|PEFFECT|P_SLT
                    219:        WORD            ANYR    ANYR    *       TEMP
                    220:                TREG            DWORD
                    221:                *               *
                    222:                        ;
                    223: 
                    224: / Direct dword to word.
                    225: %      PVALUE|PEFFECT
                    226:        WORD            ANYR    *       *       TEMP
                    227:                DIR|MMX         DWORD
                    228:                *               *
                    229:                        [ZMOVW] [LO R],[AL]
                    230: 
                    231: / Addressible dword to word.
                    232: / Since directs are handled above, the arg must be register.
                    233: %      PVALUE|PEFFECT
                    234:        WORD            ANYR    *       *       TEMP
                    235:                ADR             DWORD
                    236:                *               *
                    237:                        [ZMOV]  [R],[AL]
                    238: 
                    239: / To byte.
                    240: / Immediate to byte.
                    241: %      PVALUE|PEFFECT
                    242:        BYTE            ANYR    *       *       TEMP
                    243:                IMM|MMX         DWORD
                    244:                *               *
                    245:                        [ZMOVB] [LO LO R],[LO LO AL]
                    246: 
                    247: / Dword or word to byte.
                    248: %      PVALUE|PEFFECT|P_SLT
                    249:        BYTE            ANYR    ANYR    *       TEMP
                    250:                TREG            WORD|DWORD
                    251:                *               *
                    252:                        ;
                    253: 
                    254: / Direct word or dword to byte.
                    255: %      PVALUE|PEFFECT
                    256:        BYTE            ANYR    *       *       TEMP
                    257:                DIR|MMX         WORD|DWORD
                    258:                *               *
                    259:                        [ZMOVB] [LO LO R],[AL]
                    260: 
                    261: / Addressible word or dword to byte.
                    262: / Since directs are handled above, the arg must be register.
                    263: %      PVALUE|PEFFECT
                    264:        BYTE            ANYR    *       *       TEMP
                    265:                ADR             WORD|DWORD
                    266:                *               *
                    267:                        [ZMOV]  [R],[AL]
                    268: 
                    269: / IEEE or DECVAX software floating point.
                    270: / The bogus left arg spec EDX prevents EDX from being used
                    271: / for addressing the left arg, which would make the second fetch invalid.
                    272: / Shrink double to signed long integer.
                    273: %      PVALUE|PEFFECT|PDECVAX|PIEEE
                    274:        FS32            EDXEAX  EDX     *       EAX
                    275:                ADR|IMM         FF64
                    276:                *               *
                    277:                        [ZMOV]  [REGNO EDX], [HI AL]
                    278:                        [ZMOV]  [REGNO EAX], [LO AL]
                    279:                        [ZCALL] [GID _idcvt]
                    280: 
                    281: / Shrink double to signed word or byte.
                    282: / Cf. comment above re EDX.
                    283: %      PVALUE|PEFFECT|PDECVAX|PIEEE
                    284:        FS16|FS8        EDXEAX  EDX     *       EAX
                    285:                ADR|IMM         FF64
                    286:                *               *
                    287:                        [ZMOV]          [REGNO EDX], [HI AL]
                    288:                        [ZMOV]          [REGNO EAX], [LO AL]
                    289:                        [ZCALL]         [GID _idcvt]
                    290:                        [TN ZMOVSX]     [REGNO EAX], [TN REGNO EAX]
                    291: 
                    292: / Shrink double to unsigned long integer or pointer.
                    293: / Cf. comment above re EDX.
                    294: %      PVALUE|PEFFECT|PDECVAX|PIEEE
                    295:        FU32|PTX        EDXEAX  EDX     *       EAX
                    296:                ADR|IMM         FF64
                    297:                *               *
                    298:                        [ZMOV]  [REGNO EDX], [HI AL]
                    299:                        [ZMOV]  [REGNO EAX], [LO AL]
                    300:                        [ZCALL] [GID _udcvt]
                    301: 
                    302: / Shrink double to unsigned long word or byte.
                    303: / Cf. comment above re EDX.
                    304: %      PVALUE|PEFFECT|PDECVAX|PIEEE
                    305:        FU16|FU8        EDXEAX  EDX     *       EAX
                    306:                ADR|IMM         FF64
                    307:                *               *
                    308:                        [ZMOV]          [REGNO EDX], [HI AL]
                    309:                        [ZMOV]          [REGNO EAX], [LO AL]
                    310:                        [ZCALL]         [GID _udcvt]
                    311:                        [TN ZMOVZX]     [REGNO EAX], [TN REGNO EAX]
                    312: 
                    313: / Shrink float to signed long integer.
                    314: %      PVALUE|PEFFECT|PDECVAX|PIEEE
                    315:        FS32            EAX     *       *       TEMP
                    316:                ADR|IMM         FF32
                    317:                *               *
                    318:                        [ZMOV]  [R], [AL]
                    319:                        [ZCALL] [GID _ifcvt]
                    320: 
                    321: / Shrink float to signed word or byte.
                    322: %      PVALUE|PEFFECT|PDECVAX|PIEEE
                    323:        FS16|FS8        EAX     *       *       TEMP
                    324:                ADR|IMM         FF32
                    325:                *               *
                    326:                        [ZMOV]          [R], [AL]
                    327:                        [ZCALL]         [GID _ifcvt]
                    328:                        [TN ZMOVSX]     [R], [TN R]
                    329: 
                    330: / Shrink float to unsigned long integer or pointer.
                    331: %      PVALUE|PEFFECT|PDECVAX|PIEEE
                    332:        FU32|PTX        EAX     *       *       TEMP
                    333:                ADR|IMM         FF32
                    334:                *               *
                    335:                        [ZMOV]  [R], [AL]
                    336:                        [ZCALL] [GID _ufcvt]
                    337: 
                    338: / Shrink float to unsigned word or byte.
                    339: %      PVALUE|PEFFECT|PDECVAX|PIEEE
                    340:        FU16|FU8        EAX     *       *       TEMP
                    341:                ADR|IMM         FF32
                    342:                *               *
                    343:                        [ZMOV]          [R], [AL]
                    344:                        [ZCALL]         [GID _ufcvt]
                    345:                        [TN ZMOVZX]     [R], [TN R]
                    346: 
                    347: /////////
                    348: /
                    349: / 4. Test contexts.
                    350: / These handle checking of leaf nodes and transform the result
                    351: / of a PVALUE match into a match that generates a jump.
                    352: /
                    353: /////////
                    354: 
                    355: / Register.
                    356: / Long.
                    357: %      PSREL
                    358:        LONG            NONE    *       *       NONE
                    359:                REG|MMX         LONG
                    360:                *               *
                    361: / Pointer (equality only).
                    362: %      PEREL
                    363:        PTX             *       *       *       NONE
                    364:                REG|MMX         PTX
                    365:                *               *
                    366:                        [ZOR]   [AL],[AL]
                    367:                        [REL0]  [LAB]
                    368: 
                    369: / Addressible.
                    370: / Long.
                    371: %      PSREL
                    372:        LONG            NONE    *       *       NONE
                    373:                ADR             LONG
                    374:                *               *
                    375: / Pointer.
                    376: %      PREL
                    377:        PTX             NONE    *       *       NONE
                    378:                ADR             PTX
                    379:                *               *
                    380:                        [ZCMP]  [AL],[CONST 0]
                    381:                        [REL0]  [LAB]
                    382: 
                    383: / Short.
                    384: %      PSREL
                    385:        *               NONE    *       *       NONE
                    386:                ADR             SHORT
                    387:                *               *
                    388:                        [TL ZCMP]       [AL],[CONST 0]
                    389:                        [REL0]          [LAB]
                    390: 
                    391: / Unsigned >= is always true.
                    392: %      PUGE
                    393:        *               NONE    *       *       NONE
                    394:                *               *
                    395:                *               *
                    396:                        [ZJMP]  [LAB]
                    397: 
                    398: / Unsigned < is always false.
                    399: %      PULT
                    400:        *               NONE    *       *       NONE
                    401:                *               *
                    402:                *               *
                    403:                        ;
                    404: 
                    405: / Long.
                    406: %      PSREL
                    407:        LONG            NONE    ANYR    *       NONE
                    408:                TREG            LONG
                    409:                *               *
                    410: / Pointer.
                    411: %      PREL
                    412:        PTX             NONE    ANYR    *       NONE
                    413:                TREG            PTX
                    414:                *               *
                    415:                        [ZOR]   [RL],[RL]
                    416:                        [REL0]  [LAB]
                    417: 
                    418: / Double, IEEE software floating point.
                    419: %      PREL|PIEEE
                    420:        FF64            NONE    *       *       NONE
                    421:                ADR             FF64
                    422:                *               *
                    423:                        [ZTEST] [HI AL],[CONST 0x7FF00000]
                    424:                        [REL0]  [LAB]
                    425: 
                    426: / Double, DECVAX software floating point.
                    427: %      PREL|PDECVAX
                    428:        FF64            NONE    *       *       NONE
                    429:                ADR             FF64
                    430:                *               *
                    431:                        [ZTEST] [HI AL],[CONST 0x7F800000]
                    432:                        [REL0]  [LAB]
                    433: 
                    434: / Float, IEEE or DECVAX software floating point.
                    435: %      PREL|PIEEE|PDECVAX
                    436:        FLOAT           NONE    *       *       NONE
                    437:                ADR             FF32
                    438:                *               *
                    439:                        [ZTEST] [AL],[CONST 0x7F800000]
                    440:                        [REL0]  [LAB]
                    441: 
                    442: / NDP floating point.
                    443: %      PREL|PNDP
                    444:        FF64            *       *       *       NONE
                    445:                REG|MMX         FF64
                    446:                *               *
                    447:                        [ZCALL] [GID _tstccp]
                    448:                        [REL0]  [LAB]
                    449: 
                    450: /////////
                    451: / 
                    452: / 5. Push function arguments onto the stack.
                    453: /
                    454: /////////
                    455: 
                    456: / Effective address.
                    457: %      PFNARG
                    458:        DWORD           ANYR    *       *       NONE
                    459:                LEA|MMX         DWORD
                    460:                *               *
                    461:                        [ZLEA]  [R],[NSE AL]
                    462:                        [ZPUSH] [R]
                    463: 
                    464: / Immediate.
                    465: %      PFNARG
                    466:        DWORD           NONE    *       *       NONE
                    467:                IMM|MMX         DWORD
                    468:                *               *
                    469: / Addressible.
                    470: %      PFNARG
                    471:        DWORD   NONE    *       *       NONE
                    472:                ADR             DWORD
                    473:                *               *
                    474:                        [ZPUSH] [AL]
                    475: 
                    476: //////////
                    477: / Floating point.
                    478: //////////
                    479: 
                    480: / IEEE or DECVAX software fp.
                    481: / Push FPAC.
                    482: %      PFNARG|PIEEE|PDECVAX
                    483:        FF64            EDXEAX  EDXEAX  *       NONE
                    484:                REG|MMX         FF64
                    485:                *               *
                    486:                        [ZPUSH] [HI RL]
                    487:                        [ZPUSH] [LO RL]
                    488: 
                    489: / Push addressible double.
                    490: %      PFNARG|PIEEE|PDECVAX
                    491:        FF64            NONE    *       *       NONE
                    492:                ADR             FF64
                    493:                *               *
                    494:                        [ZPUSH] [HI AL]
                    495:                        [ZPUSH] [LO AL]
                    496: 
                    497: / Hardware coprocessor (NDP) floating point.
                    498: / Push direct double.
                    499: / The fwait is required to assure completion of any pending NDP operation,
                    500: / notably a store into the location being pushed.
                    501: %      PFNARG|PNDP
                    502:        FF64            NONE    *       *       NONE
                    503:                DIR|MMX         FF64
                    504:                *               *
                    505:                        [ZFWAIT]
                    506:                        [ZPUSH] [HI AL]
                    507:                        [ZPUSH] [LO AL]
                    508: 
                    509: / Push double from NDP stacktop.
                    510: %      PFNARG|PNDP
                    511:        FF64            NONE    *       *       NONE
                    512:                REG|MMX         FF64
                    513:                *               *
                    514:                        [ZCALL] [GID _dp87]
                    515: 
                    516: ////////
                    517: /
                    518: / 6. Miscellaneous cleanups.
                    519: / Transform value contexts into effect contexts.
                    520: / The empty entries are needed because a CALL node always produces a value.
                    521: /
                    522: ////////
                    523: 
                    524: / Ignore structs used for effect.
                    525: %      PEFFECT
                    526:        FBLK            NONE    *       *       NONE
                    527:                ADR|IMM         FBLK
                    528:                *               *
                    529:                        ;
                    530: 
                    531: / Ignore dword, word, byte for effect.
                    532: %      PEFFECT
                    533:        NFLT            NONE    *       *       NONE
                    534:                REG|MMX         NFLT
                    535:                *               *
                    536:                        ;
                    537: 
                    538: / Ignore software fp double for effect.
                    539: %      PEFFECT|PIEEE|PDECVAX
                    540:        FF64            NONE    *       *       NONE
                    541:                REG|MMX         FF64
                    542:                *               *
                    543:                        ;
                    544: 
                    545: / Clean the 80x87 stack.
                    546: %      PEFFECT|PNDP
                    547:        FF64            NONE    *       *       NONE
                    548:                REG|MMX         FF64
                    549:                *               *
                    550:                        [ZFDROP]
                    551: 
                    552: //////////
                    553: / end of n1/i386/tables/leaves.t
                    554: //////////

unix.superglobalmegacorp.com

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