|
|
1.1 root 1: ////////
2: /
3: / Intel 8086 floating point.
4: / Double compare.
5: / SMALL model.
6: /
7: ////////
8:
9: .globl ircmp
10: .globl ilcmp
11: .globl urcmp
12: .globl ulcmp
13:
14: ////////
15: /
16: / ** ircmp -- double compare (rvalue)
17: / ** ilcmp -- double compare (lvalue)
18: /
19: / these two routines perform floating point compares. both the rvalue
20: / and the lvalue forms are provided for use by the compiler. ax gets
21: / set to a completion code; an or ax,ax sets the flags so that a jump
22: / instruction may be generated.
23: /
24: / compiler calling sequences:
25: / push <right double argument>
26: / push <left double argument>
27: / call ircmp
28: / add sp,16
29: /
30: / mov ax,offset <right double argument>
31: / push ax
32: / push <left double argument>
33: / call ilcmp
34: / add sp,10
35: /
36: / outputs:
37: / ax =-1 if l<r
38: / ax = 0 if l=r
39: / ax = 1 if l>r
40: /
41: / uses:
42: / ax, bx, cx, dx
43: /
44: ////////
45:
46: expon = 0x7F80 / DECVAX format exponent bits
47:
48: l = 8 / left argument
49: r = 16 / right argument (rvalue)
50: rp = 16 / right argument (lvalue)
51:
52: urcmp:
53: ircmp: push si / standard
54: push di / c
55: push bp / function
56: mov bp,sp / linkage
57: lea di,r(bp) / di=pointer to right op.
58: jmp L0 / go to common code.
59:
60: ulcmp:
61: ilcmp: push si / standard
62: push di / c
63: push bp / function
64: mov bp,sp / linkage.
65: mov di,rp(bp) / di=pointer to right op.
66:
67: L0: sub ax,ax / default return equal.
68: mov bx,l+6(bp) / bx=sign/exp word of left op.
69: mov cx,6(di) / cx=sign/exp word of right op.
70: test bx,$expon / check if left is zero.
71: jnz L1 / left nonzero.
72: test cx,$expon / check if right is zero.
73: jz L6 / 0:0, return equal.
74: orb ch,ch / check sign of right.
75: js GT / 0:-, return greater.
76: LT: dec ax / 0:+, return less.
77: jmp L6 / all done.
78:
79: / Left is nonzero.
80: L1: orb bh,bh / check left sign.
81: js L3 / jump if negative.
82: test cx,$expon / check if right is zero.
83: jnz L2 / jump if nonzero.
84: GT: inc ax / +:0, return greater.
85: jmp L6 / all done.
86:
87: / Left is positive, right is nonzero.
88: L2: orb ch,ch / check sign of right.
89: jns L4 / jump if both positive.
90: jmp GT / +:-, return greater.
91:
92: / Left is negative.
93: L3: test cx,$expon / check if right is zero.
94: jz LT / -:0, return less.
95: orb ch,ch / check sign of right op.
96: jns LT / -:+, return less.
97:
98: / Left and right both nonzero and both same sign.
99: L4: add di,$6 / di=right op.
100: lea si,l+6(bp) / si=left op.
101: mov cx,$4 / cx=count (4 words)
102: std / decrement.
103: repe / do the
104: cmpsw / long compare.
105: cld / reset the increment flag.
106: je L6 / matches, return equal.
107: inc ax / ax=1, cf=untouched.
108: jae L5 / jump if correct assumption.
109: neg ax / less.
110:
111: L5: orb bh,bh / were operands less than zero.
112: jns L6 / jump if not.
113: neg ax / yes, flip sense.
114:
115: L6: pop bp / standard
116: pop di / c
117: pop si / function
118: ret / return
119:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.