|
|
1.1 root 1: /////////
2: /
3: / Subtraction.
4: / Similar (at least in spirit) to addition.
5: / Some of the very strange cases are not required,
6: / since subtraction is not as reorderable as addition.
7: / Special stuff for LARGE model pointers.
8: /
9: /////////
10:
11: SUB:
12: % PEFFECT|PRVALUE|PSREL|P_SLT
13: WORD ANYR ANYR * TEMP
14: TREG WORD
15: 1|MMX *
16: % PLVALUE|P_SLT
17: WORD ANYL ANYL * TEMP
18: TREG WORD
19: 1|MMX *
20: [ZDEC] [R]
21: [IFR] [REL0] [LAB]
22:
23: #ifndef ONLYSMALL
24: % PEFFECT|PRVALUE|P_SLT
25: LPTX ANYR ANYR * TEMP
26: TREG LPTX
27: 1|MMX *
28: % PLVALUE|P_SLT
29: LPTX ANYL ANYL * TEMP
30: TREG LPTX
31: 1|MMX *
32: [ZDEC] [LO R]
33: #endif
34:
35: /////////
36: /
37: / A strange optimization for the i8086.
38: / It is just as fast as the subtract, and it is smaller.
39: / Thanks to Bob McNamara at Digital.
40: /
41: /////////
42:
43: % PEFFECT|PRVALUE|PSREL|P_SLT
44: WORD ANYR ANYR * TEMP
45: TREG WORD
46: 2|MMX *
47: % PLVALUE|P_SLT
48: WORD ANYL ANYL * TEMP
49: TREG WORD
50: 2|MMX *
51: [ZDEC] [R]
52: [ZDEC] [R]
53: [IFR] [REL0] [LAB]
54:
55: #ifndef ONLYSMALL
56: % PEFFECT|PRVALUE|P_SLT
57: LPTX ANYR ANYR * TEMP
58: TREG LPTX
59: 2|MMX *
60: % PLVALUE|P_SLT
61: LPTX ANYL ANYL * TEMP
62: TREG LPTX
63: 2|MMX *
64: [ZDEC] [LO R]
65: [ZDEC] [LO R]
66: #endif
67:
68: /////////
69: /
70: / Old fashoned subtraction.
71: /
72: /////////
73:
74: % PEFFECT|PRVALUE|PSREL|P_SLT
75: WORD ANYR ANYR * TEMP
76: TREG WORD
77: ADR|IMM WORD
78: % PLVALUE|P_SLT
79: WORD ANYL ANYL * TEMP
80: TREG WORD
81: ADR|IMM WORD
82: [ZSUB] [R],[AR]
83: [IFR] [REL0] [LAB]
84:
85: #ifndef ONLYSMALL
86: % PEFFECT|PRVALUE|P_SLT
87: LPTX ANYR ANYR * TEMP
88: TREG LPTX
89: ADR|IMM WORD
90: % PLVALUE|P_SLT
91: LPTX ANYL ANYL * TEMP
92: TREG LPTX
93: ADR|IMM WORD
94: [ZSUB] [LO R],[AR]
95: #endif
96:
97: % PEFFECT|PRVALUE|PGE|PLT|P_SLT
98: LONG DXAX DXAX * DXAX
99: TREG LONG
100: ADR|IMM LONG
101: [ZSUB] [LO R],[LO AR]
102: [ZSBB] [HI R],[HI AR]
103: [IFR] [REL1] [LAB]
104:
105: #ifndef ONLYSMALL
106: % PEFFECT|PRVALUE|P_SLT
107: LPTX ANYR ANYR * TEMP
108: TREG LPTX
109: ADR|IMM LONG
110: % PLVALUE|P_SLT
111: LPTX ANYL ANYL * TEMP
112: TREG LPTX
113: ADR|IMM LONG
114: [ZSUB] [LO R],[LO AR]
115: #endif
116:
117: /////////
118: /
119: / LARGE model pointer-pointer yields 1 word of result.
120: / Only RVALUE contexts need to be done.
121: /
122: /////////
123:
124: #ifndef ONLYSMALL
125: % PRVALUE
126: WORD ANYR * * TEMP
127: DIR|IMM|MMX LPTX
128: DIR|IMM|MMX LPTX
129: [ZMOV] [R],[LO AL]
130: [ZSUB] [R],[LO AR]
131:
132: % PRVALUE
133: WORD DXAX DXAX * AX
134: TREG LPTX
135: ADR|IMM LPTX
136: [ZSUB] [LO R],[LO AR]
137: #endif
138:
139: ////////
140: /
141: / Floating point, using the numeric data coprocessor (8087).
142: /
143: ////////
144:
145: #ifdef NDPDEF
146: % PRVALUE|P_SLT
147: FF32|FF64 FPAC FPAC * FPAC
148: TREG FF64
149: ADR FS16
150: [ZFSUBI] [AR]
151:
152: % PRVALUE|P_SLT
153: FF32|FF64 FPAC FPAC * FPAC
154: TREG FF64
155: ADR FS32
156: [ZFSUBL] [AR]
157:
158: % PRVALUE|P_SLT
159: FF32|FF64 FPAC FPAC * FPAC
160: TREG FF64
161: ADR FF32
162: [ZFSUBF] [AR]
163:
164: % PRVALUE|P_SLT
165: FF32|FF64 FPAC FPAC * FPAC
166: TREG FF64
167: ADR FF64
168: [ZFSUBD] [AR]
169: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.