|
6 | 6 |
|
7 | 7 | (require math/bigfloat |
8 | 8 | math/flonum |
9 | | - "runtime/libm.rkt" ; libm wrapper in Racket |
10 | 9 | "../utils/float.rkt" ; for shift/unshift |
11 | 10 | "../syntax/platform.rkt") |
12 | 11 | (provide platform) |
|
100 | 99 |
|
101 | 100 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; libm operators ;;;;;;;;;;;;;;;;;;;;;;;; |
102 | 101 |
|
103 | | -(define libm-impls.f64 |
104 | | - (make-libm-impls/binary64 |
105 | | - [(binary64 binary64) |
106 | | - ([fabs 0.10162] |
107 | | - [sin 3.318128] |
108 | | - [cos 3.32288] |
109 | | - [tan 3.710904] |
110 | | - [sinh 1.20954] |
111 | | - [cosh 0.953896] |
112 | | - [acos 0.357748] |
113 | | - [acosh 0.659472] |
114 | | - [asin 0.389788] |
115 | | - [asinh 0.835028] |
116 | | - [atan 0.83752] |
117 | | - [atanh 0.36238] |
118 | | - [cbrt 1.565176] |
119 | | - [ceil 0.47299] |
120 | | - [erf 0.806436] |
121 | | - [exp 1.0806] |
122 | | - [exp2 0.825484] |
123 | | - [floor 0.468568] |
124 | | - [lgamma 1.568012] |
125 | | - [log 0.505724] |
126 | | - [log10 0.868856] |
127 | | - [log2 0.681276] |
128 | | - [logb 0.220656] |
129 | | - [rint 0.121864] |
130 | | - [round 0.658564] |
131 | | - [sqrt 0.191872] |
132 | | - [tanh 0.824016] |
133 | | - [tgamma 1.882576] |
134 | | - [trunc 0.463644])] |
135 | | - [(binary64 binary64 binary64) |
136 | | - ([pow 1.52482] |
137 | | - [atan2 1.492804] |
138 | | - [copysign 0.200452] |
139 | | - [fdim 0.592576] |
140 | | - [fmax 0.3106] |
141 | | - [fmin 0.289256] |
142 | | - [fmod 94.277144] |
143 | | - [remainder 16.165012])])) |
144 | | - |
145 | | -(for ([libm-impl.f64 (in-list libm-impls.f64)] |
146 | | - #:when libm-impl.f64) |
147 | | - (platform-register-implementation! platform libm-impl.f64)) |
| 102 | +; ([name ([var : repr] ...) otype spec fl fpcore cost]) |
| 103 | +(platform-register-implementations! |
| 104 | + platform |
| 105 | + (; Unary libm operators |
| 106 | + [fabs.f64 ([x : binary64]) binary64 (fabs x) (from-libm 'fabs) (! :precision binary64 (fabs x)) 0.10162] |
| 107 | + [sin.f64 ([x : binary64]) binary64 (sin x) (from-libm 'sin) (! :precision binary64 (sin x)) 3.318128] |
| 108 | + [cos.f64 ([x : binary64]) binary64 (cos x) (from-libm 'cos) (! :precision binary64 (cos x)) 3.32288] |
| 109 | + [tan.f64 ([x : binary64]) binary64 (tan x) (from-libm 'tan) (! :precision binary64 (tan x)) 3.710904] |
| 110 | + [sinh.f64 ([x : binary64]) binary64 (sinh x) (from-libm 'sinh) (! :precision binary64 (sinh x)) 1.20954] |
| 111 | + [cosh.f64 ([x : binary64]) binary64 (cosh x) (from-libm 'cosh) (! :precision binary64 (cosh x)) 0.953896] |
| 112 | + [acos.f64 ([x : binary64]) binary64 (acos x) (from-libm 'acos) (! :precision binary64 (acos x)) 0.357748] |
| 113 | + [acosh.f64 ([x : binary64]) binary64 (acosh x) (from-libm 'acosh) (! :precision binary64 (acosh x)) 0.659472] |
| 114 | + [asin.f64 ([x : binary64]) binary64 (asin x) (from-libm 'asin) (! :precision binary64 (asin x)) 0.389788] |
| 115 | + [asinh.f64 ([x : binary64]) binary64 (asinh x) (from-libm 'asinh) (! :precision binary64 (asinh x)) 0.835028] |
| 116 | + [atan.f64 ([x : binary64]) binary64 (atan x) (from-libm 'atan) (! :precision binary64 (atan x)) 0.83752] |
| 117 | + [atanh.f64 ([x : binary64]) binary64 (atanh x) (from-libm 'atanh) (! :precision binary64 (atanh x)) 0.36238] |
| 118 | + [cbrt.f64 ([x : binary64]) binary64 (cbrt x) (from-libm 'cbrt) (! :precision binary64 (cbrt x)) 1.565176] |
| 119 | + [ceil.f64 ([x : binary64]) binary64 (ceil x) (from-libm 'ceil) (! :precision binary64 (ceil x)) 0.47299] |
| 120 | + [erf.f64 ([x : binary64]) binary64 (erf x) (from-libm 'erf) (! :precision binary64 (erf x)) 0.806436] |
| 121 | + [exp.f64 ([x : binary64]) binary64 (exp x) (from-libm 'exp) (! :precision binary64 (exp x)) 1.0806] |
| 122 | + [exp2.f64 ([x : binary64]) binary64 (exp2 x) (from-libm 'exp2) (! :precision binary64 (exp2 x)) 0.825484] |
| 123 | + [floor.f64 ([x : binary64]) binary64 (floor x) (from-libm 'floor) (! :precision binary64 (floor x)) 0.468568] |
| 124 | + [lgamma.f64 ([x : binary64]) binary64 (lgamma x) (from-libm 'lgamma) (! :precision binary64 (lgamma x)) 1.568012] |
| 125 | + [log.f64 ([x : binary64]) binary64 (log x) (from-libm 'log) (! :precision binary64 (log x)) 0.505724] |
| 126 | + [log10.f64 ([x : binary64]) binary64 (log10 x) (from-libm 'log10) (! :precision binary64 (log10 x)) 0.868856] |
| 127 | + [log2.f64 ([x : binary64]) binary64 (log2 x) (from-libm 'log2) (! :precision binary64 (log2 x)) 0.681276] |
| 128 | + [logb.f64 ([x : binary64]) binary64 (logb x) (from-libm 'logb) (! :precision binary64 (logb x)) 0.220656] |
| 129 | + [rint.f64 ([x : binary64]) binary64 (rint x) (from-libm 'rint) (! :precision binary64 (rint x)) 0.121864] |
| 130 | + [round.f64 ([x : binary64]) binary64 (round x) (from-libm 'round) (! :precision binary64 (round x)) 0.658564] |
| 131 | + [sqrt.f64 ([x : binary64]) binary64 (sqrt x) (from-libm 'sqrt) (! :precision binary64 (sqrt x)) 0.191872] |
| 132 | + [tanh.f64 ([x : binary64]) binary64 (tanh x) (from-libm 'tanh) (! :precision binary64 (tanh x)) 0.824016] |
| 133 | + [tgamma.f64 ([x : binary64]) binary64 (tgamma x) (from-libm 'tgamma) (! :precision binary64 (tgamma x)) 1.882576] |
| 134 | + [trunc.f64 ([x : binary64]) binary64 (trunc x) (from-libm 'trunc) (! :precision binary64 (trunc x)) 0.463644] |
| 135 | + ; Binary libm operators |
| 136 | + [pow.f64 ([x : binary64] [y : binary64]) binary64 (pow x y) (from-libm 'pow) (! :precision binary64 (pow x y)) 1.52482] |
| 137 | + [atan2.f64 ([x : binary64] [y : binary64]) binary64 (atan2 x y) (from-libm 'atan2) (! :precision binary64 (atan2 x y)) 1.492804] |
| 138 | + [copysign.f64 ([x : binary64] [y : binary64]) binary64 (copysign x y) (from-libm 'copysign) (! :precision binary64 (copysign x y)) 0.200452] |
| 139 | + [fdim.f64 ([x : binary64] [y : binary64]) binary64 (fdim x y) (from-libm 'fdim) (! :precision binary64 (fdim x y)) 0.592576] |
| 140 | + [fmax.f64 ([x : binary64] [y : binary64]) binary64 (fmax x y) (from-libm 'fmax) (! :precision binary64 (fmax x y)) 0.3106] |
| 141 | + [fmin.f64 ([x : binary64] [y : binary64]) binary64 (fmin x y) (from-libm 'fmin) (! :precision binary64 (fmin x y)) 0.289256] |
| 142 | + [fmod.f64 ([x : binary64] [y : binary64]) binary64 (fmod x y) (from-libm 'fmod) (! :precision binary64 (fmod x y)) 94.277144] |
| 143 | + [remainder.f64 ([x : binary64] [y : binary64]) binary64 (remainder x y) (from-libm 'remainder) (! :precision binary64 (remainder x y)) 16.165012])) |
148 | 144 |
|
149 | 145 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; libm accelerators ;;;;;;;;;;;;;;;;;;;;; |
150 | 146 |
|
151 | | -(define c_erfc (make-libm (erfc double double))) |
152 | | - |
153 | | -(when c_erfc |
154 | | - (platform-register-implementation! platform |
155 | | - (make-operator-impl (erfc.f64 [x : binary64]) |
156 | | - binary64 |
157 | | - #:spec (- 1 (erf x)) |
158 | | - #:fpcore (! :precision binary64 (erfc x)) |
159 | | - #:fl c_erfc |
160 | | - #:cost 0.816512))) |
| 147 | +(platform-register-implementation! platform |
| 148 | + (make-operator-impl (erfc.f64 [x : binary64]) |
| 149 | + binary64 |
| 150 | + #:spec (- 1 (erf x)) |
| 151 | + #:fpcore (! :precision binary64 (erfc x)) |
| 152 | + #:fl (from-libm 'erfc) |
| 153 | + #:cost 0.816512)) |
161 | 154 |
|
162 | 155 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; REGISTER PLATFORM ;;;;;;;;;;;;;;;;;;;;; |
163 | 156 |
|
|
0 commit comments