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

1.1       root        1: //////////
                      2: / n1/i386/tables/ashift.t
                      3: //////////
                      4: 
                      5: /////////
                      6: /
                      7: / Assigned shift left (<<=), assigned shift right (>>=).
                      8: / Signed and unsigned right shifts are different (SAR != SHR).
                      9: / Signed and unsigned left shifts are identical (SAL == SHL).
                     10: / Shifts by byte immediates on are done directly.
                     11: / Harder shifts use the CL shift opcode.
                     12: / The [TL OP0] macro maps ZSAL or ZSAR into a signed or unsigned
                     13: / shift of the appropriate width, e.g. ZSAR could become ZSHR or ZSARB, etc.
                     14: / The [OP1] macro is just the unsigned shift ZSHL or ZSHR.
                     15: / This makes this table much shorter; see n1/i386/outmch.c for the gory details.
                     16: / The result of a shift by more than 32 bits is undefined behavior.
                     17: / This table simply generates a shift by the arg,
                     18: / and the i386 uses the shift count modulo 32.
                     19: /
                     20: /////////
                     21: 
                     22: ASHL:
                     23: ASHR:
                     24: 
                     25: //////////
                     26: / Longs.
                     27: //////////
                     28: 
                     29: / Integer op= byte constant.
                     30: %      PEFFECT|PVALUE|PREL
                     31:        LONG            ANYR    *       *       TEMP
                     32:                ADR|LV          SINT|UINT
                     33:                SHCNT|MMX       LONG
                     34:                        [TL OP0]        [AL],[AR]
                     35:                [IFV]   [TL ZMOVSX]     [R],[AL]
                     36:                [IFR]   [REL0]          [LAB]
                     37: 
                     38: #ifdef BOGUS
                     39: / This entry generates much better code
                     40: / than the non-BOGUS entries which replaces it,
                     41: / but it is wrong when [AL] uses ECX for indexing (it gets clobbered).
                     42: / Retained here in hope of seeing a better way out of this mess sometime.
                     43: / Integer op= long.
                     44: %      PEFFECT|PVALUE
                     45:        LONG            ANYR    *       ECX     TEMP
                     46:                ADR|LV          SINT|UINT
                     47:                ADR             LONG
                     48:                        [ZMOV]          [REGNO ECX],[AR]
                     49:                        [TL OP0]        [AL],[REGNO CL]
                     50:                [IFV]   [TL ZMOVSX]     [R],[AL]
                     51: #endif
                     52: 
                     53: / Long op= long.
                     54: / Save and restore ECX in case [AL] uses it, cf. remarks above.
                     55: %      PEFFECT|PVALUE
                     56:        LONG            ANYR    *       *       TEMP
                     57:                ADR|LV          LONG
                     58:                ADR             LONG
                     59:                        [ZMOV]          [R],[AL]
                     60:                        [ZPUSH]         [REGNO ECX]     / save in case [AL] uses it
                     61:                        [ZMOV]          [REGNO ECX],[AR]
                     62:                        [TL OP0]        [R],[REGNO CL]
                     63:                        [ZPOP]          [REGNO ECX]     / and restore
                     64:                        [ZMOV]          [AL],[R]
                     65: 
                     66: //////////
                     67: / Words and bytes.
                     68: //////////
                     69: 
                     70: / Short op= long.
                     71: / Save and restore ECX in case [AL] uses it, cf. remarks above.
                     72: / The [IFV] is necessary e.g. when negative signed arg gets left shifted to 0.
                     73: %      PEFFECT|PVALUE|PBYTE
                     74:        LONG            ANYR    *       *       TEMP
                     75:                ADR|LV          SHORT
                     76:                ADR             LONG
                     77:                        [TL ZMOVSX]     [R],[AL]
                     78:                        [ZPUSH]         [REGNO ECX]
                     79:                        [ZMOV]          [REGNO ECX],[AR]
                     80:                        [TL OP0]        [TL R],[REGNO CL]
                     81:                        [ZPOP]          [REGNO ECX]
                     82:                        [TL ZMOV]       [AL],[TL R]
                     83:                [IFV]   [TL ZMOVSX]     [R], [TL R]
                     84: 
                     85: //////////
                     86: / Fields.
                     87: //////////
                     88: 
                     89: / Field op= byte constant.
                     90: %      PEFFECT|PVALUE|PBYTE
                     91:        LONG            ANYR    *       *       TEMP
                     92:                ADR|LV          FLD
                     93:                SHCNT|MMX       LONG
                     94:                        [TL ZMOVZX]     [R],[AL]        / fetch
                     95:                        [ZAND]          [R],[EMASK]     / extract
                     96:                        [OP1]           [R],[AR]        / shift
                     97:                        [ZAND]          [R],[EMASK]     / mask
                     98:                        [TL ZAND]       [AL],[TL CMASK] / clear
                     99:                        [TL ZOR]        [AL],[TL R]     / store
                    100: 
                    101: / Long field op= long.
                    102: %      PEFFECT|PVALUE|PBYTE
                    103:        LONG            ANYR    *       *       TEMP
                    104:                ADR|LV          FLD
                    105:                ADR             LONG
                    106:                        [TL ZMOVZX]     [R],[AL]        / fetch
                    107:                        [ZAND]          [R],[EMASK]     / extract
                    108:                        [ZPUSH]         [REGNO ECX]     / save in case [AL] uses it
                    109:                        [ZMOV]          [REGNO ECX],[AR] / count to CL
                    110:                        [OP1]           [R],[REGNO CL]  / shift
                    111:                        [ZPOP]          [REGNO ECX]     / restore
                    112:                        [ZAND]          [R],[EMASK]     / mask
                    113:                        [TL ZAND]       [AL],[TL CMASK] / clear
                    114:                        [TL ZOR]        [AL],[TL R]     / store
                    115: 
                    116: //////////
                    117: / end of n1/i386/tables/ashift.t
                    118: //////////

unix.superglobalmegacorp.com

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