1 #include <proto/exec.h>
2 #include <proto/aros.h>
7 double X_Mul(double x
, double y
)
13 /* to avoid casts these two lines are absolutely necessary!!*/
16 #include <proto/mathffp.h>
17 #include <proto/mathtrans.h>
18 #include <proto/mathieeesingbas.h>
19 #include <proto/mathieeesingtrans.h>
20 #include <proto/mathieeedoubbas.h>
21 #include <proto/mathieeedoubtrans.h>
25 #include <exec/types.h>
27 struct Library
* MathBase
;
28 struct Library
* MathTransBase
;
29 struct Library
* MathIeeeSingBasBase
;
30 struct Library
* MathIeeeSingTransBase
;
31 struct Library
* MathIeeeDoubBasBase
;
32 struct Library
* MathIeeeDoubTransBase
;
36 int main(int argc
, char ** argv
)
38 float FFPOne
, FFPTwo
, FFPOnehalf
, FFPMinusOne
, FFPNull
;
39 float SPOne
, SPTwo
, SPOnehalf
;
41 LONG
* float_resptr
= (LONG
*)&float_res
;
44 double double_res
, double_res2
;
45 double * Darg1
, * Darg2
;
46 QUAD
* double_resptr
= (QUAD
*)&double_res
;
47 QUAD
* double_resptr2
= (QUAD
*)&double_res2
;
50 Darg1
= (double *)&QArg1
;
51 Darg2
= (double *)&QArg2
;
53 #define DEF_FFPOne 0x80000041UL
54 #define DEF_FFPTwo 0x80000042UL
55 #define DEF_FFPMinusOne 0x800000C1UL
56 #define DEF_FFPOnehalf 0x80000040UL
57 #define DEF_FFPNull 0x00000000UL
59 #define DEF_SPOne 0x3f800000UL
60 #define DEF_SPTwo 0x40000000UL
61 #define DEF_SPOnehalf 0x3f000000UL
63 #define DEF_DPOne 0x3ff0000000000000ULL
64 #define DEF_DPMinusOne 0xbff0000000000000ULL
65 #define DEF_DPTwo 0x4000000000000000ULL
66 #define DEF_DPThree 0x4008000000000000ULL
67 #define DEF_DPFour 0x4010000000000000ULL
68 #define DEF_DPTwenty 0x4034000000000000ULL
70 ptr
= (LONG
*)&FFPOne
; *ptr
= DEF_FFPOne
;
71 ptr
= (LONG
*)&FFPTwo
; *ptr
= DEF_FFPTwo
;
72 ptr
= (LONG
*)&FFPMinusOne
; *ptr
= DEF_FFPMinusOne
;
73 ptr
= (LONG
*)&FFPOnehalf
; *ptr
= DEF_FFPOnehalf
;
74 ptr
= (LONG
*)&FFPNull
; *ptr
= DEF_FFPNull
;
76 ptr
= (LONG
*)&SPOne
; *ptr
= DEF_SPOne
;
77 ptr
= (LONG
*)&SPOnehalf
; *ptr
= DEF_SPOnehalf
;
78 ptr
= (LONG
*)&SPTwo
; *ptr
= DEF_SPTwo
;
80 /* if you deactivate #define float LONG something very funny happens here:
81 printf("two: %x <-> %x \n",*ptr,SPTwo);
82 printf("two: %x <-> %x \n",SPTwo,*ptr);
85 #define CHECK(func, args, cres) \
86 float_res = func args; \
87 if (*float_resptr != cres) \
88 printf ("FAIL: " #func " " #args " in line %d (got=0x%08lx expected=0x%08lx)\n", \
89 __LINE__, (unsigned long)*float_resptr, (unsigned long)cres); \
91 printf ("OK : " #func " " #args "\n");
94 When using doubles or QUADs it is important to pay attention to the Endianess of the processor,
95 otherwise you'll never see what you want to see.
98 #define CHECK_DOUBLE1A(func, arg1, cres) \
99 double_res = func (arg1); \
100 if (*double_resptr != cres) \
102 if (0 != AROS_BIG_ENDIAN) \
104 printf ("FAIL: " #func " " #arg1 " in line %d (got=0x%08lx%08lx expected=0x%08lx%08lx)\n", \
106 (unsigned long)(((QUAD)*double_resptr)>>32),(unsigned long)*(((LONG *)double_resptr)+1), \
107 (unsigned long)(((QUAD)cres)>>32),(unsigned long)cres); \
111 printf ("(little endian) FAIL: " #func " " #arg1 " in line %d (got=0x%08lx%08lx expected=0x%08lx%08lx)\n", \
113 (unsigned long)*(((LONG *)double_resptr)+1),(unsigned long)*(((LONG *)double_resptr)), \
114 (unsigned long)(((QUAD)cres)>>32),(unsigned long)cres); \
118 printf ("OK : " #func " " #arg1 "\n");
120 #define CHECK_DOUBLE1B(func, arg1, cres) \
122 double_res = func (*Darg1); \
123 if (*double_resptr != cres) \
125 if (0 != AROS_BIG_ENDIAN) \
127 printf ("FAIL: " #func " " #arg1 " in line %d (got=0x%08lx%08lx expected=0x%08lx%08lx)\n", \
129 (unsigned long)(((QUAD)*double_resptr)>>32),(unsigned long)*(((LONG *)double_resptr)+1), \
130 (unsigned long)(((QUAD)cres)>>32),(unsigned long)cres); \
134 printf ("(little endian) FAIL: " #func " " #arg1 " in line %d (got=0x%08lx%08lx expected=0x%08lx%08lx)\n", \
136 (unsigned long)*(((LONG *)double_resptr)+1),(unsigned long)*(((LONG *)double_resptr)), \
137 (unsigned long)(((QUAD)cres)>>32),(unsigned long)cres); \
141 printf ("OK : " #func " " #arg1 "\n");
143 #define CHECK_DOUBLE2A(func, arg1, arg2, cres) \
144 double_res = func (arg1, arg2); \
145 double_res2 = cres; \
146 if (double_res != double_res2) \
148 if (0 != AROS_BIG_ENDIAN) \
150 printf ("FAIL: " #func " (" #arg1 "," #arg2 ") in line %d (got=0x%08lx%08lx expected=0x%08lx%08lx)\n", \
152 (unsigned long)(((QUAD)*double_resptr )>>32),(unsigned long)*(((LONG *)double_resptr )+1), \
153 (unsigned long)(((QUAD)*double_resptr2)>>32),(unsigned long)*(((LONG *)double_resptr2)+1) ); \
157 printf ("(little endian) FAIL: " #func " (" #arg1 "," #arg2 ") in line %d (got=0x%08lx%08lx expected=0x%08lx%08lx)\n", \
159 (unsigned long)*(((LONG *)double_resptr )+1),(unsigned long)*(((LONG *)double_resptr)), \
160 (unsigned long)*(((LONG *)double_resptr2)+1),(unsigned long)*(((LONG *)double_resptr2)) ); \
164 printf ("OK : " #func " ( " #arg1 "," #arg2 " ) \n");
171 if (!(MathBase
= OpenLibrary("mathffp.library", 0L)))
173 printf ("Couldn't open mathffp.library\n");
177 printf("Very basic mathffp functionality test...\n");
179 /* this should set the zero-bit*/
180 wanted
= DEF_FFPNull
; CHECK(SPAbs
,(0),wanted
);
182 wanted
= DEF_FFPNull
; CHECK(SPFlt
,(0),wanted
);
183 wanted
= DEF_FFPOne
; CHECK(SPFlt
,(1),wanted
);
184 wanted
= DEF_FFPTwo
; CHECK(SPFlt
,(2),wanted
);
185 wanted
= DEF_FFPMinusOne
; CHECK(SPFlt
,(-1),wanted
);
186 wanted
= DEF_FFPTwo
; CHECK(SPAdd
,(FFPOne
, FFPOne
),wanted
);
187 wanted
= DEF_FFPOnehalf
; CHECK(SPDiv
,(FFPTwo
, FFPOne
),wanted
);
188 wanted
= DEF_FFPTwo
; CHECK(SPMul
,(FFPOne
, FFPTwo
),wanted
);
189 CloseLibrary(MathBase
);
191 if (!(MathTransBase
= OpenLibrary("mathtrans.library", 0L)))
193 fprintf (stderr
, "Couldn't open mathtrans.library\n");
197 printf("Very basic mathtrans functionality test...\n");
199 CHECK (SPLog
, (FFPTwo
), 0xb1721840UL
);
200 CHECK (SPLog10
, (FFPTwo
), 0x9a209b3fUL
);
201 CHECK (SPSin
, (FFPOne
), 0xd76aa440UL
);
202 CHECK (SPCos
, (FFPOne
), 0x8a514040UL
);
203 CHECK (SPTan
, (FFPOne
), 0xc7592341UL
);
204 CHECK (SPSinh
, (FFPOne
), 0x966cfe41UL
);
205 CHECK (SPCosh
, (FFPOne
), 0xc583aa41UL
);
206 CHECK (SPTanh
, (FFPOne
), 0xc2f7d640UL
);
207 CHECK (SPExp
, (FFPTwo
), 0xec732543UL
);
208 CHECK (SPAsin
, (FFPOnehalf
), 0x860a9240UL
);
209 CHECK (SPAcos
, (FFPOnehalf
), 0x860a9241UL
);
211 CloseLibrary(MathTransBase
);
213 if (!(MathIeeeSingBasBase
= OpenLibrary("mathieeesingbas.library", 0L)))
215 printf ("Couldn't open mathieeesingbas.library\n");
220 if (!(MathIeeeSingTransBase
= OpenLibrary("mathieeesingtrans.library", 0L)))
222 printf ("Couldn't open mathieeesingtrans.library\n");
226 printf("Very basic mathieeesingtrans functionality test...\n");
229 CHECK (IEEESPLog
, (SPTwo
), 0x3f317218UL
);
230 CHECK (IEEESPLog10
, (SPTwo
), 0x3e9a209aUL
);
231 CHECK (IEEESPSin
, (SPOne
), 0x3f576aa4UL
);
232 CHECK (IEEESPCos
, (SPOne
), 0x3f0a5140UL
);
233 CHECK (IEEESPTan
, (SPOne
), 0x3fc75923UL
);
234 CHECK (IEEESPSinh
, (SPTwo
), 0x40681e7bUL
);
235 CHECK (IEEESPCosh
, (SPTwo
), 0x4070c7d1UL
);
236 CHECK (IEEESPTanh
, (SPOne
), 0x3f42f7d6UL
);
237 CHECK (IEEESPExp
, (SPTwo
), 0x40ec7325UL
);
238 CHECK (IEEESPAsin
, (SPOnehalf
), 0x3f060a92UL
);
239 CHECK (IEEESPAcos
, (SPOnehalf
), 0x3f860a92UL
);
241 CloseLibrary(MathIeeeSingTransBase
);
243 if (!(MathIeeeDoubBasBase
= OpenLibrary("mathieeedoubbas.library", 0L)))
245 printf ("Couldn't open mathieeedoubbas.library\n");
251 CHECK_DOUBLE1A(IEEEDPFlt
, ((LONG
)1), DEF_DPOne
);
252 CHECK_DOUBLE1A(IEEEDPFlt
, ((LONG
)2), DEF_DPTwo
);
253 CHECK_DOUBLE1A(IEEEDPFlt
, ((LONG
)3), DEF_DPThree
);
254 CHECK_DOUBLE1A(IEEEDPFlt
, ((LONG
)20), DEF_DPTwenty
);
255 CHECK_DOUBLE1B(IEEEDPAbs
, ((QUAD
)DEF_DPMinusOne
), (QUAD
)DEF_DPOne
);
256 CHECK_DOUBLE1B(IEEEDPNeg
, ((QUAD
)DEF_DPMinusOne
), (QUAD
)DEF_DPOne
);
257 CHECK_DOUBLE2A(IEEEDPAdd
, IEEEDPFlt(1), IEEEDPFlt(1), IEEEDPFlt(2));
258 CHECK_DOUBLE2A(IEEEDPAdd
, IEEEDPFlt(123456), IEEEDPFlt(654321), IEEEDPFlt(777777));
259 CHECK_DOUBLE2A(IEEEDPSub
, IEEEDPFlt(123456), IEEEDPFlt(654321), IEEEDPFlt(-530865));
260 CHECK_DOUBLE2A(IEEEDPMul
, IEEEDPFlt(321), IEEEDPFlt(123456), IEEEDPFlt(39629376));
261 CHECK_DOUBLE2A(IEEEDPMul
, IEEEDPFlt(2), IEEEDPFlt(2), IEEEDPFlt(4));
262 CHECK_DOUBLE2A(IEEEDPMul
, IEEEDPFlt(20), IEEEDPFlt(20), IEEEDPFlt(400));
265 if (!(MathIeeeDoubTransBase
= OpenLibrary("mathieeedoubtrans.library", 0L)))
267 printf ("Couldn't open mathieeedoubtrans.library\n");
271 CHECK_DOUBLE1A(IEEEDPSqrt
, ((double)IEEEDPFlt(4)), DEF_DPTwo
);
272 CHECK_DOUBLE1A(IEEEDPSqrt
, ((double)IEEEDPFlt(9)), DEF_DPThree
);
273 CHECK_DOUBLE1A(IEEEDPCos
, ((double)IEEEDPFlt(1)), 0x3fe14a280fb5068bULL
);
274 CHECK_DOUBLE1A(IEEEDPSin
, ((double)IEEEDPFlt(1)), 0x3feaed548f090ceeULL
);
276 CloseLibrary(MathIeeeDoubTransBase
);
277 CloseLibrary(MathIeeeDoubBasBase
);