1 | /*
|
---|
2 | ** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY
|
---|
3 | ** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT
|
---|
4 | ** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX
|
---|
5 | ** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE
|
---|
6 | ** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com).
|
---|
7 | ** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
|
---|
8 | ** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A
|
---|
9 | ** FULL TEXT OF THE NON-WARRANTY PROVISIONS.
|
---|
10 | **
|
---|
11 | ** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO
|
---|
12 | ** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN
|
---|
13 | ** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013,
|
---|
14 | ** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR
|
---|
15 | ** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF
|
---|
16 | ** THE UNITED STATES.
|
---|
17 | **
|
---|
18 | ** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED
|
---|
19 | **
|
---|
20 | ** $Revision: 1.1 $
|
---|
21 | ** $Date: 2000-02-25 00:33:50 $
|
---|
22 | */
|
---|
23 | #include <stdlib.h>
|
---|
24 | #include <stdio.h>
|
---|
25 |
|
---|
26 | #include <fx64.h>
|
---|
27 |
|
---|
28 | #ifndef NATIVE_64_SUPPORT
|
---|
29 |
|
---|
30 | FxI64 i64_one = { 0, 1 };
|
---|
31 | FxI64 i64_zero = { 0, 0 };
|
---|
32 |
|
---|
33 | static FxBool fx64_cf;
|
---|
34 |
|
---|
35 | FxBool __FX_ADD32( FxU32 a, FxU32 b );
|
---|
36 | #pragma aux __FX_ADD32 = \
|
---|
37 | "mov fx64_cf, 0" \
|
---|
38 | "add eax, edx" \
|
---|
39 | "adc fx64_cf, 0" \
|
---|
40 | parm [eax] [edx] \
|
---|
41 | value [eax];
|
---|
42 |
|
---|
43 | FxI64 __FX_AND64( FxI64 a, FxI64 b )
|
---|
44 | {
|
---|
45 | FxI64 result;
|
---|
46 |
|
---|
47 | result.hi = a.hi & b.hi;
|
---|
48 | result.lo = a.lo & b.lo;
|
---|
49 |
|
---|
50 | return result;
|
---|
51 | }
|
---|
52 |
|
---|
53 | FxI64 __FX_CREATE64( FxI32 a, FxU32 b )
|
---|
54 | {
|
---|
55 | FxI64 result;
|
---|
56 |
|
---|
57 | result.hi = a;
|
---|
58 | result.lo = b;
|
---|
59 |
|
---|
60 | return result;
|
---|
61 | }
|
---|
62 |
|
---|
63 | /*
|
---|
64 | ** __FX_MUL64
|
---|
65 | **
|
---|
66 | ** The following code is NOT a full 64-bit multiply. It only computes
|
---|
67 | ** the low order 64-bits of the product since this is all our hardware
|
---|
68 | ** needs.
|
---|
69 | */
|
---|
70 | FxI64 __FX_MUL64( FxI64 a, FxI64 b )
|
---|
71 | {
|
---|
72 | FxI64 result = { 0, 0 };
|
---|
73 |
|
---|
74 | FXUNUSED( a );
|
---|
75 | FXUNUSED( b );
|
---|
76 |
|
---|
77 | puts( "__FX_MUL64: not implemented" );
|
---|
78 | exit( 1 );
|
---|
79 | return result;
|
---|
80 | }
|
---|
81 |
|
---|
82 | FxI64 __FX_OR64( FxI64 a, FxI64 b )
|
---|
83 | {
|
---|
84 | FxI64 result;
|
---|
85 |
|
---|
86 | result.hi = a.hi | b.hi;
|
---|
87 | result.lo = a.lo | b.lo;
|
---|
88 |
|
---|
89 | return result;
|
---|
90 | }
|
---|
91 |
|
---|
92 | FxI64 __FX_COMP64( FxI64 a )
|
---|
93 | {
|
---|
94 | FxI64 result;
|
---|
95 |
|
---|
96 | result.hi = ~a.hi;
|
---|
97 | result.lo = ~a.lo;
|
---|
98 |
|
---|
99 | return result;
|
---|
100 | }
|
---|
101 |
|
---|
102 | float __FX_64TOFLOAT( FxI64 a )
|
---|
103 | {
|
---|
104 | double hi, lo;
|
---|
105 |
|
---|
106 | hi = a.hi * 4294967296.0; // 2**32
|
---|
107 | lo = ( float ) a.lo;
|
---|
108 | return (float)(hi + lo);
|
---|
109 | }
|
---|
110 |
|
---|
111 | FxI64 __FX_FLOATTO64( float f )
|
---|
112 | {
|
---|
113 | int n;
|
---|
114 | FxU32 data;
|
---|
115 | FxI64 result;
|
---|
116 |
|
---|
117 | data = *(FxU32 *)&f; // get into integer register
|
---|
118 | n = (data>>23) & 0xFF; // peel off exponent
|
---|
119 | n = 150 - n; // compute shift amount
|
---|
120 | data |= 0x800000; // add in the hidden bit
|
---|
121 | result.hi = 0;
|
---|
122 | result.lo = (data&0xFFFFFF);
|
---|
123 | if (n > 0) { // need to shift right, < 2**23
|
---|
124 | if (n > 31) n = 31;
|
---|
125 | result.lo >>= n;
|
---|
126 | }
|
---|
127 | else {
|
---|
128 | n = -n;
|
---|
129 | if (n > 63) n = 63;
|
---|
130 | result = FX_SHL64( result, n );
|
---|
131 | }
|
---|
132 | // negate after shift, this rounds down instead of to zero
|
---|
133 | if (data & 0x80000000)
|
---|
134 | result = FX_NEG64(result);
|
---|
135 | return result;
|
---|
136 | }
|
---|
137 |
|
---|
138 |
|
---|
139 | int __FX_CMP64( FxI64 a, FxI64 b )
|
---|
140 | {
|
---|
141 | if ( a.hi < b.hi )
|
---|
142 | return -1;
|
---|
143 | if ( a.hi > b.hi )
|
---|
144 | return 1;
|
---|
145 | if ( a.lo < b.lo )
|
---|
146 | return -1;
|
---|
147 | else if ( a.lo > b.lo )
|
---|
148 | return 1;
|
---|
149 | return 0;
|
---|
150 | }
|
---|
151 |
|
---|
152 | #endif
|
---|
153 |
|
---|