|
|
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.