comparison test/suite_x86win32fast/main.cc @ 0:3e629dc19168

initial from svn dyncall-1745
author Daniel Adler
date Thu, 19 Mar 2015 22:24:28 +0100
parents
children f5577f6bf97a
comparison
equal deleted inserted replaced
-1:000000000000 0:3e629dc19168
1 /*
2
3 Package: dyncall
4 Library: test
5 File: test/suite_x86win32fast/main.cc
6 Description:
7 License:
8
9 Copyright (c) 2007-2015 Daniel Adler <dadler@uni-goettingen.de>,
10 Tassilo Philipp <tphilipp@potion-studios.com>
11
12 Permission to use, copy, modify, and distribute this software for any
13 purpose with or without fee is hereby granted, provided that the above
14 copyright notice and this permission notice appear in all copies.
15
16 THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
17 WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
18 MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
19 ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
20 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
21 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
22 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
23
24 */
25
26
27
28 #include "../../dyncall/dyncall.h"
29 #include "config.h"
30 #include "../../dyncall/dyncall_value.h"
31 #include "../../dyncall/dyncall_macros.h"
32 #include <math.h>
33 #include "../common/platformInit.h"
34 #include "../common/platformInit.c" /* Impl. for functions only used in this translation unit */
35
36
37 int getId();
38 DCpointer getFunc(int x);
39 DCValue* getArg(int pos);
40
41
42 typedef double precise;
43
44
45 DCbool valueBool[NARGS];
46 DCshort valueShort[NARGS];
47 DCchar valueChar[NARGS];
48 DCint valueInt[NARGS];
49 DClonglong valueLongLong[NARGS];
50 DCdouble valueDouble[NARGS];
51 DCpointer valuePointer[NARGS];
52 DCfloat valueFloat[NARGS];
53
54
55 bool equals(int select, int pos, void* data)
56 {
57 switch(select)
58 {
59 case 0: return ( getArg(pos)->B == valueBool[pos] ); break;
60 case 1: return ( getArg(pos)->i == valueInt[pos] ); break;
61 case 2: return ( getArg(pos)->l == valueLongLong[pos] ); break;
62 case 3: return ( getArg(pos)->d == valueDouble[pos] ); break;
63 case 4: return ( getArg(pos)->p == valuePointer[pos] ); break;
64 case 5: return ( getArg(pos)->f == valueFloat[pos] ); break;
65 }
66 return false;
67 }
68
69
70 void clearValues();
71
72
73 void init()
74 {
75 for (int i = 0 ; i < NARGS ; ++i ) {
76
77 valueBool[i] = DCbool( (i % 1) ? DC_TRUE : DC_FALSE );
78 valueInt[i] = DCint(i);
79 valueLongLong[i] = DClonglong(i);
80 valueDouble[i] = DCdouble(i);
81 valuePointer[i] = DCpointer(i);
82 valueFloat[i] = DCfloat(i);
83 }
84 }
85
86
87 void push(DCCallVM* pCall, int select, int pos)
88 {
89 switch(select)
90 {
91 case 0: dcArgBool( pCall, valueBool[pos] ); break;
92 case 1: dcArgInt( pCall, valueInt[pos] ); break;
93 case 2: dcArgLongLong( pCall, valueLongLong[pos] ); break;
94 case 3: dcArgDouble( pCall, valueDouble[pos] ); break;
95 case 4: dcArgPointer( pCall, valuePointer[pos] ); break;
96 case 5: dcArgFloat( pCall, valueFloat[pos] ); break;
97 }
98 }
99
100
101 #define assert(x) if (!(x)) return false
102
103
104 bool test(int x)
105 {
106 clearValues();
107
108 DCCallVM* pCall = dcNewCallVM(4096);
109 #ifdef DC__C_GNU
110 dcMode(pCall, DC_CALL_C_X86_WIN32_FAST_GNU);
111 #else
112 dcMode(pCall, DC_CALL_C_X86_WIN32_FAST_MS);
113 #endif
114 dcReset(pCall);
115
116 int y = x;
117 int selects[NARGS] = { 0, };
118 int pos = 0;
119 for(pos = 0;y>0;++pos)
120 {
121 int select = (y-1) % NTYPES;
122 selects[pos] = select;
123 push(pCall,select,pos);
124 y = (y-1) / NTYPES;
125 }
126 dcCallVoid(pCall,getFunc(x));
127
128 assert( getId() == x );
129
130 for(int i = 0;i<pos;++i) {
131 assert( equals( selects[i], i, getArg(i) ) );
132 }
133
134 dcFree(pCall);
135 return true;
136 }
137
138
139 int powerfact(int x, int n)
140 {
141 if (n==0) return 0;
142 return static_cast<int>( pow((double)x,n)+powerfact(x,n-1) );
143 }
144
145 #include <stdio.h>
146 #include <stdlib.h>
147
148 bool run_range(int from, int to)
149 {
150 bool tr = true;
151 for (int i = from ; i < to ; ++i ) {
152 printf("%d:",i);
153 bool r = test(i);
154 printf("%d\n", r);
155 tr &= r;
156 }
157 return tr;
158 }
159
160 extern "C" {
161
162 int main(int argc, char* argv[])
163 {
164 dcTest_initPlatform();
165
166 bool success = false;
167 init();
168 if (argc == 2) {
169 int index = atoi(argv[1]);
170 success = run_range( index, index+1 );
171 } else if (argc == 3) {
172 int from = atoi(argv[1]);
173 int to = atoi(argv[2])+1;
174 success = run_range(from,to);
175 } else {
176 int ncalls = powerfact(NTYPES,NARGS)+1;
177 success = run_range(0,ncalls);
178 }
179
180 printf("result: suite_x86win32fast: %s\n", success ? "1" : "0");
181
182 dcTest_deInitPlatform();
183
184 return (success) ? 0 : -1;
185 }
186
187 } // extern "C"
188