|
|
1.1 ! root 1: ///////// ! 2: / ! 3: / Shift left. ! 4: / Small shifts (1 or 2 bits) are easy. ! 5: / Longer shifts use either 'shift by CL' (words) or a loop (longs). ! 6: / Shifts by a constant generate the load of CL directly ! 7: / to get a 'movb' instruction and save a byte. ! 8: / ! 9: ///////// ! 10: ! 11: SHL: ! 12: % PEFFECT|PRVALUE|PREL|P_SLT|P80186 ! 13: WORD ANYR ANYR * TEMP ! 14: TREG WORD ! 15: BYTE|MMX WORD ! 16: % PLVALUE|P_SLT|P80186 ! 17: WORD ANYL ANYL * TEMP ! 18: TREG WORD ! 19: BYTE|MMX WORD ! 20: [ZSAL] [R],[AR] ! 21: [IFR] [REL0] [LAB] ! 22: ! 23: % PEFFECT|PRVALUE|PREL|P_SLT ! 24: WORD ANYR ANYR * TEMP ! 25: TREG WORD ! 26: 1|MMX * ! 27: % PLVALUE|P_SLT ! 28: WORD ANYL ANYL * TEMP ! 29: TREG WORD ! 30: 1|MMX * ! 31: [ZSAL] [R],[AR] ! 32: [IFR] [REL0] [LAB] ! 33: ! 34: % PEFFECT|PRVALUE|PREL|P_SLT ! 35: WORD ANYR ANYR * TEMP ! 36: TREG WORD ! 37: 2|MMX * ! 38: % PLVALUE|P_SLT ! 39: WORD ANYL ANYL * TEMP ! 40: TREG WORD ! 41: 2|MMX * ! 42: [ZSAL] [R],[CONST 1] ! 43: [ZSAL] [R],[CONST 1] ! 44: [IFR] [REL0] [LAB] ! 45: ! 46: ///////// ! 47: / ! 48: / Harder word shifts. ! 49: / If the right is a constant, ! 50: / use a MOVB to load the shift count and save a byte. ! 51: / ! 52: ///////// ! 53: % PEFFECT|PRVALUE|PREL|P_SLT ! 54: WORD ANYR ANYR CX TEMP ! 55: TREG WORD ! 56: IMM|MMX WORD ! 57: % PLVALUE|P_SLT ! 58: WORD ANYL ANYL CX TEMP ! 59: TREG WORD ! 60: IMM|MMX WORD ! 61: [ZMOVB] [REGNO CL],[AR] ! 62: [ZSAL] [R],[REGNO CL] ! 63: [IFR] [REL0] [LAB] ! 64: ! 65: % PEFFECT|PRVALUE|P_SLT ! 66: WORD ANYR ANYR CX TEMP ! 67: TREG WORD ! 68: ADR WORD ! 69: % PLVALUE|P_SLT ! 70: WORD ANYL ANYL CX TEMP ! 71: TREG WORD ! 72: ADR WORD ! 73: [ZMOV] [REGNO CX],[AR] ! 74: [ZSAL] [R],[REGNO CL] ! 75: ! 76: ///////// ! 77: / ! 78: / Hard long shifts. ! 79: / Since the modify phase has ripped out shifts by 0, ! 80: / any immediate shift is by a nonzero count, so no JCXZ is needed. ! 81: / ! 82: ///////// ! 83: ! 84: % PEFFECT|PRVALUE|P_SLT ! 85: LONG DXAX DXAX CX DXAX ! 86: TREG LONG ! 87: IMM|MMX WORD ! 88: [ZMOV] [REGNO CX],[AR] ! 89: [DLAB0]:[ZSAL] [LO R],[CONST 1] ! 90: [ZRCL] [HI R],[CONST 1] ! 91: [ZLOOP] [LAB0] ! 92: ! 93: % PEFFECT|PRVALUE|P_SLT ! 94: LONG DXAX DXAX CX DXAX ! 95: TREG LONG ! 96: ADR WORD ! 97: [ZMOV] [REGNO CX],[AR] ! 98: [ZJCXZ] [LAB0] ! 99: [DLAB1]:[ZSAL] [LO R],[CONST 1] ! 100: [ZRCL] [HI R],[CONST 1] ! 101: [ZLOOP] [LAB1] ! 102: [DLAB0]: ! 103: ! 104: ///////// ! 105: / ! 106: / These strange entries are for LARGE model int-to-pointer conversions. ! 107: / The pointer is a strange kind of long integer. ! 108: / Computes the word into the offset, does the shift ! 109: / and sets the base to 0. ! 110: / ! 111: ///////// ! 112: ! 113: #ifndef ONLYSMALL ! 114: % PEFFECT|PRVALUE|P80186 ! 115: LPTX DXAX AX * DXAX ! 116: TREG WORD ! 117: BYTE|MMX WORD ! 118: [ZSAL] [LO R],[AR] ! 119: [ZSUB] [HI R],[HI R] ! 120: ! 121: % PEFFECT|PRVALUE ! 122: LPTX DXAX AX CX DXAX ! 123: TREG WORD ! 124: IMM|MMX WORD ! 125: [ZMOVB] [REGNO CL],[AR] ! 126: [ZSAL] [LO R],[REGNO CL] ! 127: [ZSUB] [HI R],[HI R] ! 128: ! 129: % PEFFECT|PRVALUE ! 130: LPTX DXAX AX CX DXAX ! 131: TREG WORD ! 132: ADR WORD ! 133: [ZMOV] [REGNO CX],[AR] ! 134: [ZSAL] [LO R],[REGNO CL] ! 135: [ZSUB] [HI R],[HI R] ! 136: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.