Skip to content

Commit 17d04a6

Browse files
author
andreas
committedMar 27, 2006
Initial version of FloatMathPlugin.
git-svn-id: http://squeakvm.org/svn/squeak/trunk/platforms/Cross/plugins@1378 fa1542d4-bde8-0310-ad64-8ed1123d492a
1 parent c9e3cd9 commit 17d04a6

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

138 files changed

+13205
-0
lines changed
 

‎FloatMathPlugin/FloatMathPlugin.h

+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
/* we only declare those functions from fdlibm that we actually use
2+
and avoid including fdlibm.h alltogether as it conflicts with math.h */
3+
extern double __ieee754_sqrt(double);
4+
5+
extern double __ieee754_acos(double);
6+
extern double __ieee754_acosh(double);
7+
extern double __ieee754_asin(double);
8+
extern double __ieee754_asinh(double);
9+
extern double __ieee754_atan(double);
10+
extern double __ieee754_atan2(double,double);
11+
extern double __ieee754_atanh(double);
12+
extern double __ieee754_cos(double);
13+
extern double __ieee754_cosh(double);
14+
extern double __ieee754_exp(double);
15+
extern double __ieee754_fmod(double,double);
16+
extern double __ieee754_modf(double,double*);
17+
extern double __ieee754_hypot(double,double);
18+
extern double __ieee754_log10(double);
19+
extern double __ieee754_log(double);
20+
extern double __ieee754_pow(double,double);
21+
extern double __ieee754_sin(double);
22+
extern double __ieee754_sinh(double);
23+
extern double __ieee754_sqrt(double);
24+
extern double __ieee754_tan(double);
25+
extern double __ieee754_tanh(double);
26+
extern double __ieee754_ldexp(double, int);
27+

‎FloatMathPlugin/FloatMathPlugin.st

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
'From Croquet1.0beta of 24 March 2006 [latest update: #6665] on 26 March 2006 at 6:00:28 pm'!InterpreterPlugin subclass: #FloatMathPlugin instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'VMMaker-Plugins'!!FloatMathPlugin methodsFor: 'float primitives' stamp: 'ar 3/26/2006 15:24'!primitiveArcCos "Computes acos(receiver)" | rcvr result | self export: true. self var: #rcvr type: 'double'. self var: #result type: 'double'. rcvr := interpreterProxy stackFloatValue: 0. (interpreterProxy failed) ifTrue:[^nil]. result := self cCode: '__ieee754_acos(rcvr)' inSmalltalk: [rcvr arcCos]. interpreterProxy pop: interpreterProxy methodArgumentCount + 1. interpreterProxy pushFloat: result.! !!FloatMathPlugin methodsFor: 'float primitives' stamp: 'ar 3/26/2006 15:24'!primitiveArcCosH "Computes acosh(receiver)" | rcvr result | self export: true. self var: #rcvr type: 'double'. self var: #result type: 'double'. rcvr := interpreterProxy stackFloatValue: 0. (interpreterProxy failed) ifTrue:[^nil]. result := self cCode: '__ieee754_acosh(rcvr)' inSmalltalk: [rcvr arcCosH]. interpreterProxy pop: interpreterProxy methodArgumentCount + 1. interpreterProxy pushFloat: result.! !!FloatMathPlugin methodsFor: 'float primitives' stamp: 'ar 3/26/2006 15:24'!primitiveArcSin "Computes asin(receiver)" | rcvr result | self export: true. self var: #rcvr type: 'double'. self var: #result type: 'double'. rcvr := interpreterProxy stackFloatValue: 0. (interpreterProxy failed) ifTrue:[^nil]. result := self cCode: '__ieee754_asin(rcvr)' inSmalltalk: [rcvr arcSin]. interpreterProxy pop: interpreterProxy methodArgumentCount + 1. interpreterProxy pushFloat: result.! !!FloatMathPlugin methodsFor: 'float primitives' stamp: 'ar 3/26/2006 15:24'!primitiveArcSinH "Computes asinh(receiver)" | rcvr result | self export: true. self var: #rcvr type: 'double'. self var: #result type: 'double'. rcvr := interpreterProxy stackFloatValue: 0. (interpreterProxy failed) ifTrue:[^nil]. result := self cCode: '__ieee754_asinh(rcvr)' inSmalltalk: [rcvr arcSinH]. interpreterProxy pop: interpreterProxy methodArgumentCount + 1. interpreterProxy pushFloat: result.! !!FloatMathPlugin methodsFor: 'float primitives' stamp: 'ar 3/26/2006 15:24'!primitiveArcTan "Computes atan(receiver)" | rcvr result | self export: true. self var: #rcvr type: 'double'. self var: #result type: 'double'. rcvr := interpreterProxy stackFloatValue: 0. (interpreterProxy failed) ifTrue:[^nil]. result := self cCode: '__ieee754_atan(rcvr)' inSmalltalk: [rcvr arcTan]. interpreterProxy pop: interpreterProxy methodArgumentCount + 1. interpreterProxy pushFloat: result.! !!FloatMathPlugin methodsFor: 'float primitives' stamp: 'ar 3/26/2006 15:24'!primitiveArcTan2 "Computes atan2(receiver, arg)" | rcvr arg result | self export: true. self var: #rcvr type: 'double'. self var: #arg type: 'double'. self var: #result type: 'double'. arg := interpreterProxy stackFloatValue: 0. rcvr := interpreterProxy stackFloatValue: 1. (interpreterProxy failed) ifTrue:[^nil]. result := self cCode: '__ieee754_atan2(rcvr, arg)' inSmalltalk: [rcvr arcTan: arg]. interpreterProxy pop: interpreterProxy methodArgumentCount + 1. interpreterProxy pushFloat: result.! !!FloatMathPlugin methodsFor: 'float primitives' stamp: 'ar 3/26/2006 15:24'!primitiveArcTanH "Computes atanh(receiver)" | rcvr result | self export: true. self var: #rcvr type: 'double'. self var: #result type: 'double'. rcvr := interpreterProxy stackFloatValue: 0. (interpreterProxy failed) ifTrue:[^nil]. result := self cCode: '__ieee754_atanh(rcvr)' inSmalltalk: [rcvr arcTanH]. interpreterProxy pop: interpreterProxy methodArgumentCount + 1. interpreterProxy pushFloat: result.! !!FloatMathPlugin methodsFor: 'float primitives' stamp: 'ar 3/26/2006 15:24'!primitiveCos "Computes cos(receiver)" | rcvr result | self export: true. self var: #rcvr type: 'double'. self var: #result type: 'double'. rcvr := interpreterProxy stackFloatValue: 0. (interpreterProxy failed) ifTrue:[^nil]. result := self cCode: '__ieee754_cos(rcvr)' inSmalltalk: [rcvr cos]. interpreterProxy pop: interpreterProxy methodArgumentCount + 1. interpreterProxy pushFloat: result.! !!FloatMathPlugin methodsFor: 'float primitives' stamp: 'ar 3/26/2006 15:24'!primitiveCosH "Computes cosh(receiver)" | rcvr result | self export: true. self var: #rcvr type: 'double'. self var: #result type: 'double'. rcvr := interpreterProxy stackFloatValue: 0. (interpreterProxy failed) ifTrue:[^nil]. result := self cCode: '__ieee754_cosh(rcvr)' inSmalltalk: [rcvr cosH]. interpreterProxy pop: interpreterProxy methodArgumentCount + 1. interpreterProxy pushFloat: result.! !!FloatMathPlugin methodsFor: 'float primitives' stamp: 'ar 11/6/2005 03:01'!primitiveExp "Computes E raised to the receiver power." | rcvr result | self export: true. self var: #rcvr type: 'double'. self var: #result type: 'double'. rcvr := interpreterProxy stackFloatValue: 0. (interpreterProxy failed) ifTrue:[^nil]. result := (self cCode: '__ieee754_exp(rcvr)' inSmalltalk: [rcvr exp]). interpreterProxy pop: interpreterProxy methodArgumentCount + 1. interpreterProxy pushFloat: result.! !!FloatMathPlugin methodsFor: 'float primitives' stamp: 'ar 3/26/2006 15:21'!primitiveFMod "Computes receiver \\ arg" | rcvr arg result | self export: true. self var: #rcvr type: 'double'. self var: #arg type: 'double'. self var: #result type: 'double'. arg := interpreterProxy stackFloatValue: 0. rcvr := interpreterProxy stackFloatValue: 1. (interpreterProxy failed) ifTrue:[^nil]. result := self cCode: '__ieee754_fmod(rcvr, arg)' inSmalltalk: [rcvr \\ arg]. interpreterProxy pop: interpreterProxy methodArgumentCount + 1. interpreterProxy pushFloat: result.! !!FloatMathPlugin methodsFor: 'float primitives' stamp: 'ar 3/26/2006 15:21'!primitiveFractionalPart "Computes receiver \\ 1.0" | rcvr result trunc| self export: true. self var: #rcvr type: 'double'. self var: #result type: 'double'. self var: #trunc type: 'double'. rcvr := interpreterProxy stackFloatValue: 0. (interpreterProxy failed) ifTrue:[^nil]. result := self cCode: '__ieee754_modf(rcvr, &trunc)' inSmalltalk: [rcvr fractionPart]. interpreterProxy pop: interpreterProxy methodArgumentCount + 1. interpreterProxy pushFloat: result.! !!FloatMathPlugin methodsFor: 'float primitives' stamp: 'ar 11/6/2005 16:13'!primitiveHypot "hypot(x,y) returns sqrt(x^2+y^2) with error less than 1 ulps" | rcvr arg result | self export: true. self var: #rcvr type: 'double'. self var: #arg type: 'double'. self var: #result type: 'double'. arg := interpreterProxy stackFloatValue: 0. rcvr := interpreterProxy stackFloatValue: 1. (interpreterProxy failed) ifTrue:[^nil]. result := self cCode: '__ieee754_hypot(rcvr, arg)' inSmalltalk: [rcvr hypot: arg]. interpreterProxy pop: interpreterProxy methodArgumentCount + 1. interpreterProxy pushFloat: result.! !!FloatMathPlugin methodsFor: 'float primitives' stamp: 'ar 3/26/2006 15:25'!primitiveLog10 "Computes log10(receiver)" | rcvr result | self export: true. self var: #rcvr type: 'double'. self var: #result type: 'double'. rcvr := interpreterProxy stackFloatValue: 0. (interpreterProxy failed) ifTrue:[^nil]. rcvr < 0.0 ifTrue:[^interpreterProxy primitiveFail]. result := self cCode: '__ieee754_log10(rcvr)' inSmalltalk: [rcvr log: 10]. interpreterProxy pop: interpreterProxy methodArgumentCount + 1. interpreterProxy pushFloat: result.! !!FloatMathPlugin methodsFor: 'float primitives' stamp: 'ar 3/26/2006 17:24'!primitiveLogN "Computes log(receiver)" | rcvr result | self export: true. self var: #rcvr type: 'double'. self var: #result type: 'double'. rcvr := interpreterProxy stackFloatValue: 0. (interpreterProxy failed) ifTrue:[^nil]. rcvr < 0.0 ifTrue:[^interpreterProxy primitiveFail]. result := self cCode: '__ieee754_log(rcvr)' inSmalltalk: [rcvr ln]. interpreterProxy pop: interpreterProxy methodArgumentCount + 1. interpreterProxy pushFloat: result.! !!FloatMathPlugin methodsFor: 'float primitives' stamp: 'ar 3/26/2006 15:23'!primitiveRaisedToPower "Computes receiver**arg" | rcvr arg result | self export: true. self var: #rcvr type: 'double'. self var: #arg type: 'double'. self var: #result type: 'double'. arg := interpreterProxy stackFloatValue: 0. rcvr := interpreterProxy stackFloatValue: 1. (interpreterProxy failed) ifTrue:[^nil]. result := self cCode: '__ieee754_pow(rcvr, arg)' inSmalltalk: [rcvr raisedTo: arg]. interpreterProxy pop: interpreterProxy methodArgumentCount + 1. interpreterProxy pushFloat: result.! !!FloatMathPlugin methodsFor: 'float primitives' stamp: 'ar 3/26/2006 15:23'!primitiveSin "Computes sin(receiver)" | rcvr result | self export: true. self var: #rcvr type: 'double'. self var: #result type: 'double'. rcvr := interpreterProxy stackFloatValue: 0. (interpreterProxy failed) ifTrue:[^nil]. result := self cCode: '__ieee754_sin(rcvr)' inSmalltalk: [rcvr sin]. interpreterProxy pop: interpreterProxy methodArgumentCount + 1. interpreterProxy pushFloat: result.! !!FloatMathPlugin methodsFor: 'float primitives' stamp: 'ar 3/26/2006 15:23'!primitiveSinH "Computes sinh(receiver)" | rcvr result | self export: true. self var: #rcvr type: 'double'. self var: #result type: 'double'. rcvr := interpreterProxy stackFloatValue: 0. (interpreterProxy failed) ifTrue:[^nil]. result := self cCode: '__ieee754_sinh(rcvr)' inSmalltalk: [rcvr sinH]. interpreterProxy pop: interpreterProxy methodArgumentCount + 1. interpreterProxy pushFloat: result.! !!FloatMathPlugin methodsFor: 'float primitives' stamp: 'ar 3/26/2006 15:22'!primitiveSqrt "Computes sqrt(receiver)" | rcvr result | self export: true. self var: #rcvr type: 'double'. self var: #result type: 'double'. rcvr := interpreterProxy stackFloatValue: 0. (interpreterProxy failed) ifTrue:[^nil]. rcvr < 0.0 ifTrue:[^interpreterProxy primitiveFail]. result := self cCode: '__ieee754_sqrt(rcvr)' inSmalltalk: [rcvr sqrt]. interpreterProxy pop: interpreterProxy methodArgumentCount + 1. interpreterProxy pushFloat: result.! !!FloatMathPlugin methodsFor: 'float primitives' stamp: 'ar 3/26/2006 15:23'!primitiveTan "Computes tan(receiver)" | rcvr result | self export: true. self var: #rcvr type: 'double'. self var: #result type: 'double'. rcvr := interpreterProxy stackFloatValue: 0. (interpreterProxy failed) ifTrue:[^nil]. result := self cCode: '__ieee754_tan(rcvr)' inSmalltalk: [rcvr tan]. interpreterProxy pop: interpreterProxy methodArgumentCount + 1. interpreterProxy pushFloat: result.! !!FloatMathPlugin methodsFor: 'float primitives' stamp: 'ar 3/26/2006 15:23'!primitiveTanH "Computes tanh(receiver)" | rcvr result | self export: true. self var: #rcvr type: 'double'. self var: #result type: 'double'. rcvr := interpreterProxy stackFloatValue: 0. (interpreterProxy failed) ifTrue:[^nil]. result := self cCode: '__ieee754_tanh(rcvr)' inSmalltalk: [rcvr tanH]. interpreterProxy pop: interpreterProxy methodArgumentCount + 1. interpreterProxy pushFloat: result.! !!FloatMathPlugin methodsFor: 'float primitives' stamp: 'ar 3/26/2006 14:06'!primitiveTimesTwoPower "Computes E raised to the receiver power." | rcvr arg result | self export: true. self var: #rcvr type: 'double'. self var: #result type: 'double'. arg := interpreterProxy stackIntegerValue: 0. rcvr := interpreterProxy stackFloatValue: 1. (interpreterProxy failed) ifTrue:[^nil]. result := self cCode: '__ieee754_ldexp(rcvr, arg)' inSmalltalk: [rcvr timesTwoPower: arg]. interpreterProxy pop: interpreterProxy methodArgumentCount + 1. interpreterProxy pushFloat: result.! !"-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!FloatMathPlugin class instanceVariableNames: ''!!FloatMathPlugin class methodsFor: 'as yet unclassified' stamp: 'ar 11/6/2005 02:48'!hasHeaderFile "If there is a single intrinsic header file to be associated with the plugin, here is where you want to flag" ^true! !!FloatMathPlugin class methodsFor: 'as yet unclassified' stamp: 'ar 11/6/2005 16:20'!requiresCrossPlatformFiles "default is ok for most, any plugin needing platform specific files must say so" ^true! !

0 commit comments

Comments
 (0)
Please sign in to comment.