source: trunk/src/opengl/glide/swlibs/fxmisc/fx64.c

Last change on this file was 2887, checked in by sandervl, 26 years ago

Created swlibs dir

File size: 3.2 KB
Line 
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
30FxI64 i64_one = { 0, 1 };
31FxI64 i64_zero = { 0, 0 };
32
33static FxBool fx64_cf;
34
35FxBool __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
43FxI64 __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
53FxI64 __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*/
70FxI64 __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
82FxI64 __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
92FxI64 __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
102float __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
111FxI64 __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
139int __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
Note: See TracBrowser for help on using the repository browser.