Annotation of coherent/b/bin/c/n1/i386/tables/leaves.t, revision 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.