annotate test/suite_floats/main.cc @ 606:85b7a117b807

- more statics in test code (this is partly needed on an experimental freebsd sparc64 build where the elf cleanup code crashes for some reason ... it's probably that experimental build, but a good change to do regardless)
author Tassilo Philipp
date Wed, 21 Sep 2022 15:20:58 +0200
parents d73dc7ad37e4
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
1 /*
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
2
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
3 Package: dyncall
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
4 Library: test
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
5 File: test/suite_floats/main.cc
410
7608e34098b0 - cleanups, simplifications, some api clarification, ...
Tassilo Philipp
parents: 281
diff changeset
6 Description:
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
7 License:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
8
606
85b7a117b807 - more statics in test code (this is partly needed on an experimental freebsd sparc64 build where the elf cleanup code crashes for some reason ... it's probably that experimental build, but a good change to do regardless)
Tassilo Philipp
parents: 413
diff changeset
9 Copyright (c) 2007-2022 Daniel Adler <dadler@uni-goettingen.de>,
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
10 Tassilo Philipp <tphilipp@potion-studios.com>
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
11
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
12 Permission to use, copy, modify, and distribute this software for any
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
13 purpose with or without fee is hereby granted, provided that the above
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
14 copyright notice and this permission notice appear in all copies.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
15
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
16 THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
17 WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
18 MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
19 ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
20 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
21 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
22 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
23
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
24 */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
25
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
26
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
27
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
28 #include "../../dyncall/dyncall.h"
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
29 #include "config.h"
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
30 #include "../../dyncall/dyncall_value.h"
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
31 #include <math.h>
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
32 #include <stdlib.h>
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
33 #include "../common/platformInit.h"
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
34 #include "../common/platformInit.c" /* Impl. for functions only used in this translation unit */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
35
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
36
56
2cccd38e5e4d - added -lm in GNU/kFreeBSD config, to build all tests out of the box
cslag
parents: 0
diff changeset
37 int getId();
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
38 DCpointer getFunc(int x);
56
2cccd38e5e4d - added -lm in GNU/kFreeBSD config, to build all tests out of the box
cslag
parents: 0
diff changeset
39 DCValue* getArg(int pos);
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
40
606
85b7a117b807 - more statics in test code (this is partly needed on an experimental freebsd sparc64 build where the elf cleanup code crashes for some reason ... it's probably that experimental build, but a good change to do regardless)
Tassilo Philipp
parents: 413
diff changeset
41 static DCdouble valueDouble [NARGS];
85b7a117b807 - more statics in test code (this is partly needed on an experimental freebsd sparc64 build where the elf cleanup code crashes for some reason ... it's probably that experimental build, but a good change to do regardless)
Tassilo Philipp
parents: 413
diff changeset
42 static DCfloat valueFloat [NARGS];
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
43
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
44
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
45 bool equals(int select, int pos, void* data)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
46 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
47 switch(select)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
48 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
49 case 0: return ( getArg(pos)->d == valueDouble [pos] ); break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
50 case 1: return ( getArg(pos)->f == valueFloat [pos] ); break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
51 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
52 return false;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
53 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
54
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
55
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
56 void clearValues();
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
57
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
58
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
59 void init()
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
60 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
61 for (int i = 0 ; i < NARGS ; ++i ) {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
62 valueDouble[i] = DCdouble(i);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
63 valueFloat[i] = DCfloat(i);
410
7608e34098b0 - cleanups, simplifications, some api clarification, ...
Tassilo Philipp
parents: 281
diff changeset
64 }
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
65 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
66
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
67
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
68 void push(DCCallVM* pCall, int select, int pos)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
69 {
410
7608e34098b0 - cleanups, simplifications, some api clarification, ...
Tassilo Philipp
parents: 281
diff changeset
70 switch(select)
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
71 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
72 case 0: dcArgDouble ( pCall, valueDouble [pos] ); break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
73 case 1: dcArgFloat ( pCall, valueFloat [pos] ); break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
74 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
75 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
76
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
77
410
7608e34098b0 - cleanups, simplifications, some api clarification, ...
Tassilo Philipp
parents: 281
diff changeset
78 #define test(x) if (!(x)) return false
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
79
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
80
413
d73dc7ad37e4 - fix nameclash due to a previous and bad cleanup
Tassilo Philipp
parents: 410
diff changeset
81 bool test_case(int x)
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
82 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
83 clearValues();
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
84
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
85 DCCallVM* pCall = dcNewCallVM(4096);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
86 dcReset(pCall);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
87 int y = x;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
88 int selects[NARGS] = { 0, };
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
89 int pos = 0;
410
7608e34098b0 - cleanups, simplifications, some api clarification, ...
Tassilo Philipp
parents: 281
diff changeset
90 for(pos = 0;y>0;++pos)
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
91 {
410
7608e34098b0 - cleanups, simplifications, some api clarification, ...
Tassilo Philipp
parents: 281
diff changeset
92 int select = (y-1) % NTYPES;
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
93 selects[pos] = select;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
94 push(pCall,select,pos);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
95 y = (y-1) / NTYPES;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
96 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
97 dcCallVoid(pCall,getFunc(x));
410
7608e34098b0 - cleanups, simplifications, some api clarification, ...
Tassilo Philipp
parents: 281
diff changeset
98
7608e34098b0 - cleanups, simplifications, some api clarification, ...
Tassilo Philipp
parents: 281
diff changeset
99 test( getId() == x );
7608e34098b0 - cleanups, simplifications, some api clarification, ...
Tassilo Philipp
parents: 281
diff changeset
100
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
101 for(int i = 0;i<pos;++i) {
410
7608e34098b0 - cleanups, simplifications, some api clarification, ...
Tassilo Philipp
parents: 281
diff changeset
102 test( equals( selects[i], i, getArg(i) ) );
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
103 }
410
7608e34098b0 - cleanups, simplifications, some api clarification, ...
Tassilo Philipp
parents: 281
diff changeset
104
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
105 dcFree(pCall);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
106 return true;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
107 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
108
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
109
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
110 int powerfact(int x, int n)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
111 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
112 if (n==0) return 0;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
113 return static_cast<int>( pow((double)x,n)+powerfact(x,n-1) );
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
114 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
115
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
116
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
117 bool run_range(int from, int to)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
118 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
119 bool tr = true;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
120 for (int i = from ; i < to ; ++i ) {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
121 printf("%d:",i);
413
d73dc7ad37e4 - fix nameclash due to a previous and bad cleanup
Tassilo Philipp
parents: 410
diff changeset
122 bool r = test_case(i);
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
123 printf("%d\n", r);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
124 tr &= r;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
125 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
126 return tr;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
127 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
128
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
129 extern "C" {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
130
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
131 int main(int argc, char* argv[])
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
132 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
133 dcTest_initPlatform();
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
134
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
135 bool success = false;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
136 init();
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
137 if (argc == 2) {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
138 int index = atoi(argv[1]);
410
7608e34098b0 - cleanups, simplifications, some api clarification, ...
Tassilo Philipp
parents: 281
diff changeset
139 success = run_range( index, index+1 );
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
140 } else if (argc == 3) {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
141 int from = atoi(argv[1]);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
142 int to = atoi(argv[2])+1;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
143 success = run_range(from,to);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
144 } else {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
145 int ncalls = powerfact(NTYPES,NARGS)+1;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
146 success = run_range(0,ncalls);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
147 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
148
410
7608e34098b0 - cleanups, simplifications, some api clarification, ...
Tassilo Philipp
parents: 281
diff changeset
149 printf("result: suite_floats: %d\n", success);
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
150
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
151 dcTest_deInitPlatform();
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
152
410
7608e34098b0 - cleanups, simplifications, some api clarification, ...
Tassilo Philipp
parents: 281
diff changeset
153 return !success;
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
154 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
155
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
156 } // extern "C"
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
157