sljitTest.c revision 1.1.1.4 1 /*
2 * Stack-less Just-In-Time compiler
3 *
4 * Copyright 2009-2010 Zoltan Herczeg (hzmester (at) freemail.hu). All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without modification, are
7 * permitted provided that the following conditions are met:
8 *
9 * 1. Redistributions of source code must retain the above copyright notice, this list of
10 * conditions and the following disclaimer.
11 *
12 * 2. Redistributions in binary form must reproduce the above copyright notice, this list
13 * of conditions and the following disclaimer in the documentation and/or other materials
14 * provided with the distribution.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND CONTRIBUTORS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
19 * SHALL THE COPYRIGHT HOLDER(S) OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
20 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
21 * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
22 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
24 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25 */
26
27 /* Must be the first one. Must not depend on any other include. */
28 #include "sljitLir.h"
29
30 #include <stdio.h>
31 #include <stdlib.h>
32 #include <string.h>
33
34 #if defined _WIN32 || defined _WIN64
35 #define COLOR_RED
36 #define COLOR_GREEN
37 #define COLOR_ARCH
38 #define COLOR_DEFAULT
39 #else
40 #define COLOR_RED "\33[31m"
41 #define COLOR_GREEN "\33[32m"
42 #define COLOR_ARCH "\33[33m"
43 #define COLOR_DEFAULT "\33[0m"
44 #endif
45
46 union executable_code {
47 void* code;
48 sljit_sw (SLJIT_CALL *func0)(void);
49 sljit_sw (SLJIT_CALL *func1)(sljit_sw a);
50 sljit_sw (SLJIT_CALL *func2)(sljit_sw a, sljit_sw b);
51 sljit_sw (SLJIT_CALL *func3)(sljit_sw a, sljit_sw b, sljit_sw c);
52 };
53 typedef union executable_code executable_code;
54
55 static sljit_s32 successful_tests = 0;
56 static sljit_s32 verbose = 0;
57 static sljit_s32 silent = 0;
58
59 #define FAILED(cond, text) \
60 if (SLJIT_UNLIKELY(cond)) { \
61 printf(text); \
62 return; \
63 }
64
65 #define CHECK(compiler) \
66 if (sljit_get_compiler_error(compiler) != SLJIT_ERR_COMPILED) { \
67 printf("Compiler error: %d\n", sljit_get_compiler_error(compiler)); \
68 sljit_free_compiler(compiler); \
69 return; \
70 }
71
72 static void cond_set(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw, sljit_s32 type)
73 {
74 /* Testing both sljit_emit_op_flags and sljit_emit_jump. */
75 struct sljit_jump* jump;
76 struct sljit_label* label;
77
78 sljit_emit_op_flags(compiler, SLJIT_MOV, dst, dstw, SLJIT_UNUSED, 0, type);
79 jump = sljit_emit_jump(compiler, type);
80 sljit_emit_op2(compiler, SLJIT_ADD | SLJIT_KEEP_FLAGS, dst, dstw, dst, dstw, SLJIT_IMM, 2);
81 label = sljit_emit_label(compiler);
82 sljit_set_label(jump, label);
83 }
84
85 #if !(defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED)
86
87 #define MALLOC_EXEC(result, size) \
88 result = SLJIT_MALLOC_EXEC(size); \
89 if (!result) { \
90 printf("Cannot allocate executable memory\n"); \
91 return; \
92 } \
93 memset(result, 255, size);
94
95 static void test_exec_allocator(void)
96 {
97 /* This is not an sljit test. */
98 void *ptr1;
99 void *ptr2;
100 void *ptr3;
101
102 if (verbose)
103 printf("Run executable allocator test\n");
104
105 MALLOC_EXEC(ptr1, 32);
106 MALLOC_EXEC(ptr2, 512);
107 MALLOC_EXEC(ptr3, 512);
108 SLJIT_FREE_EXEC(ptr2);
109 SLJIT_FREE_EXEC(ptr3);
110 SLJIT_FREE_EXEC(ptr1);
111 MALLOC_EXEC(ptr1, 262104);
112 MALLOC_EXEC(ptr2, 32000);
113 SLJIT_FREE_EXEC(ptr1);
114 MALLOC_EXEC(ptr1, 262104);
115 SLJIT_FREE_EXEC(ptr1);
116 SLJIT_FREE_EXEC(ptr2);
117 MALLOC_EXEC(ptr1, 512);
118 MALLOC_EXEC(ptr2, 512);
119 MALLOC_EXEC(ptr3, 512);
120 SLJIT_FREE_EXEC(ptr2);
121 MALLOC_EXEC(ptr2, 512);
122 #if (defined SLJIT_EXECUTABLE_ALLOCATOR && SLJIT_EXECUTABLE_ALLOCATOR)
123 sljit_free_unused_memory_exec();
124 #endif
125 SLJIT_FREE_EXEC(ptr3);
126 SLJIT_FREE_EXEC(ptr1);
127 SLJIT_FREE_EXEC(ptr2);
128 #if (defined SLJIT_UTIL_GLOBAL_LOCK && SLJIT_UTIL_GLOBAL_LOCK)
129 /* Just call the global locks. */
130 sljit_grab_lock();
131 sljit_release_lock();
132 #endif
133
134 #if (defined SLJIT_EXECUTABLE_ALLOCATOR && SLJIT_EXECUTABLE_ALLOCATOR)
135 sljit_free_unused_memory_exec();
136 #endif
137 }
138
139 #undef MALLOC_EXEC
140
141 #endif /* !(defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED) */
142
143 static void test1(void)
144 {
145 /* Enter and return from an sljit function. */
146 executable_code code;
147 struct sljit_compiler* compiler = sljit_create_compiler(NULL);
148
149 if (verbose)
150 printf("Run test1\n");
151
152 FAILED(!compiler, "cannot create compiler\n");
153
154 /* 3 arguments passed, 3 arguments used. */
155 sljit_emit_enter(compiler, 0, 3, 3, 3, 0, 0, 0);
156 sljit_emit_return(compiler, SLJIT_MOV, SLJIT_S1, 0);
157
158 SLJIT_ASSERT(sljit_get_generated_code_size(compiler) == 0);
159 code.code = sljit_generate_code(compiler);
160 CHECK(compiler);
161 SLJIT_ASSERT(compiler->error == SLJIT_ERR_COMPILED);
162 SLJIT_ASSERT(sljit_get_generated_code_size(compiler) > 0);
163 sljit_free_compiler(compiler);
164
165 FAILED(code.func3(3, -21, 86) != -21, "test1 case 1 failed\n");
166 FAILED(code.func3(4789, 47890, 997) != 47890, "test1 case 2 failed\n");
167
168 sljit_free_code(code.code);
169 successful_tests++;
170 }
171
172 static void test2(void)
173 {
174 /* Test mov. */
175 executable_code code;
176 struct sljit_compiler* compiler = sljit_create_compiler(NULL);
177 sljit_sw buf[8];
178 static sljit_sw data[2] = { 0, -9876 };
179
180 if (verbose)
181 printf("Run test2\n");
182
183 FAILED(!compiler, "cannot create compiler\n");
184
185 buf[0] = 5678;
186 buf[1] = 0;
187 buf[2] = 0;
188 buf[3] = 0;
189 buf[4] = 0;
190 buf[5] = 0;
191 buf[6] = 0;
192 buf[7] = 0;
193 sljit_emit_enter(compiler, 0, 1, 3, 2, 0, 0, 0);
194 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_UNUSED, 0, SLJIT_MEM0(), (sljit_sw)&buf);
195 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 9999);
196 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S1, 0, SLJIT_S0, 0);
197 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S1), sizeof(sljit_sw), SLJIT_R0, 0);
198 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, sizeof(sljit_sw));
199 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_MEM2(SLJIT_S1, SLJIT_R1), 0);
200 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S0, 0, SLJIT_IMM, 2);
201 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM2(SLJIT_S1, SLJIT_S0), SLJIT_WORD_SHIFT, SLJIT_MEM2(SLJIT_S1, SLJIT_R1), 0);
202 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S0, 0, SLJIT_IMM, 3);
203 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM2(SLJIT_S1, SLJIT_S0), SLJIT_WORD_SHIFT, SLJIT_MEM0(), (sljit_sw)&buf);
204 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, sizeof(sljit_sw));
205 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_MEM1(SLJIT_R0), (sljit_sw)&data);
206 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S1), 4 * sizeof(sljit_sw), SLJIT_R0, 0);
207 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, (sljit_sw)&buf - 0x12345678);
208 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_MEM1(SLJIT_R0), 0x12345678);
209 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S1), 5 * sizeof(sljit_sw), SLJIT_R0, 0);
210 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 3456);
211 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, (sljit_sw)&buf - 0xff890 + 6 * sizeof(sljit_sw));
212 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R1), 0xff890, SLJIT_R0, 0);
213 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, (sljit_sw)&buf + 0xff890 + 7 * sizeof(sljit_sw));
214 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R1), -0xff890, SLJIT_R0, 0);
215 sljit_emit_return(compiler, SLJIT_MOV, SLJIT_R2, 0);
216
217 code.code = sljit_generate_code(compiler);
218 CHECK(compiler);
219 sljit_free_compiler(compiler);
220
221 FAILED(code.func1((sljit_sw)&buf) != 9999, "test2 case 1 failed\n");
222 FAILED(buf[1] != 9999, "test2 case 2 failed\n");
223 FAILED(buf[2] != 9999, "test2 case 3 failed\n");
224 FAILED(buf[3] != 5678, "test2 case 4 failed\n");
225 FAILED(buf[4] != -9876, "test2 case 5 failed\n");
226 FAILED(buf[5] != 5678, "test2 case 6 failed\n");
227 FAILED(buf[6] != 3456, "test2 case 6 failed\n");
228 FAILED(buf[7] != 3456, "test2 case 6 failed\n");
229
230 sljit_free_code(code.code);
231 successful_tests++;
232 }
233
234 static void test3(void)
235 {
236 /* Test not. */
237 executable_code code;
238 struct sljit_compiler* compiler = sljit_create_compiler(NULL);
239 sljit_sw buf[5];
240
241 if (verbose)
242 printf("Run test3\n");
243
244 FAILED(!compiler, "cannot create compiler\n");
245 buf[0] = 1234;
246 buf[1] = 0;
247 buf[2] = 9876;
248 buf[3] = 0;
249 buf[4] = 0x12345678;
250
251 sljit_emit_enter(compiler, 0, 1, 3, 1, 0, 0, 0);
252 sljit_emit_op1(compiler, SLJIT_NOT, SLJIT_UNUSED, 0, SLJIT_MEM0(), (sljit_sw)&buf);
253 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw), SLJIT_MEM1(SLJIT_S0), 0);
254 sljit_emit_op1(compiler, SLJIT_NOT, SLJIT_MEM0(), (sljit_sw)&buf[1], SLJIT_MEM0(), (sljit_sw)&buf[1]);
255 sljit_emit_op1(compiler, SLJIT_NOT, SLJIT_RETURN_REG, 0, SLJIT_MEM1(SLJIT_S0), 0);
256 sljit_emit_op1(compiler, SLJIT_NOT, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 3, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 2);
257 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, (sljit_sw)&buf[4] - 0xff0000 - 0x20);
258 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, (sljit_sw)&buf[4] - 0xff0000);
259 sljit_emit_op1(compiler, SLJIT_NOT, SLJIT_MEM1(SLJIT_R1), 0xff0000 + 0x20, SLJIT_MEM1(SLJIT_R2), 0xff0000);
260 sljit_emit_return(compiler, SLJIT_MOV, SLJIT_RETURN_REG, 0);
261
262 code.code = sljit_generate_code(compiler);
263 CHECK(compiler);
264 sljit_free_compiler(compiler);
265
266 FAILED(code.func1((sljit_sw)&buf) != ~1234, "test3 case 1 failed\n");
267 FAILED(buf[1] != ~1234, "test3 case 2 failed\n");
268 FAILED(buf[3] != ~9876, "test3 case 3 failed\n");
269 FAILED(buf[4] != ~0x12345678, "test3 case 4 failed\n");
270
271 sljit_free_code(code.code);
272 successful_tests++;
273 }
274
275 static void test4(void)
276 {
277 /* Test neg. */
278 executable_code code;
279 struct sljit_compiler* compiler = sljit_create_compiler(NULL);
280 sljit_sw buf[4];
281
282 if (verbose)
283 printf("Run test4\n");
284
285 FAILED(!compiler, "cannot create compiler\n");
286 buf[0] = 0;
287 buf[1] = 1234;
288 buf[2] = 0;
289 buf[3] = 0;
290
291 sljit_emit_enter(compiler, 0, 2, 3, 2, 0, 0, 0);
292 sljit_emit_op1(compiler, SLJIT_NEG, SLJIT_UNUSED, 0, SLJIT_MEM1(SLJIT_S0), 0);
293 sljit_emit_op1(compiler, SLJIT_NEG, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 2, SLJIT_S1, 0);
294 sljit_emit_op1(compiler, SLJIT_NEG, SLJIT_MEM0(), (sljit_sw)&buf[0], SLJIT_MEM0(), (sljit_sw)&buf[1]);
295 sljit_emit_op1(compiler, SLJIT_NEG, SLJIT_RETURN_REG, 0, SLJIT_S1, 0);
296 sljit_emit_op1(compiler, SLJIT_NEG, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 3, SLJIT_IMM, 299);
297 sljit_emit_return(compiler, SLJIT_MOV, SLJIT_RETURN_REG, 0);
298
299 code.code = sljit_generate_code(compiler);
300 CHECK(compiler);
301 sljit_free_compiler(compiler);
302
303 FAILED(code.func2((sljit_sw)&buf, 4567) != -4567, "test4 case 1 failed\n");
304 FAILED(buf[0] != -1234, "test4 case 2 failed\n");
305 FAILED(buf[2] != -4567, "test4 case 3 failed\n");
306 FAILED(buf[3] != -299, "test4 case 4 failed\n");
307
308 sljit_free_code(code.code);
309 successful_tests++;
310 }
311
312 static void test5(void)
313 {
314 /* Test add. */
315 executable_code code;
316 struct sljit_compiler* compiler = sljit_create_compiler(NULL);
317 sljit_sw buf[9];
318
319 if (verbose)
320 printf("Run test5\n");
321
322 FAILED(!compiler, "cannot create compiler\n");
323 buf[0] = 100;
324 buf[1] = 200;
325 buf[2] = 300;
326 buf[3] = 0;
327 buf[4] = 0;
328 buf[5] = 0;
329 buf[6] = 0;
330 buf[7] = 0;
331 buf[8] = 313;
332
333 sljit_emit_enter(compiler, 0, 1, 3, 2, 0, 0, 0);
334 sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_UNUSED, 0, SLJIT_IMM, 16, SLJIT_IMM, 16);
335 sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_UNUSED, 0, SLJIT_IMM, 255, SLJIT_IMM, 255);
336 sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_UNUSED, 0, SLJIT_S0, 0, SLJIT_S0, 0);
337 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, sizeof(sljit_sw));
338 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 50);
339 sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_MEM2(SLJIT_S0, SLJIT_R0), 1, SLJIT_MEM2(SLJIT_S0, SLJIT_R0), 1, SLJIT_MEM2(SLJIT_S0, SLJIT_R0), 0);
340 sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_IMM, sizeof(sljit_sw) + 2);
341 sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R1, 0, SLJIT_R1, 0, SLJIT_IMM, 50);
342 sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_MEM1(SLJIT_S0), 0);
343 sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_R0, 0);
344 sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R0, 0, SLJIT_IMM, 4, SLJIT_R0, 0);
345 sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R1, 0, SLJIT_IMM, 50, SLJIT_R1, 0);
346 sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_MEM1(SLJIT_S0), 5 * sizeof(sljit_sw), SLJIT_IMM, 50, SLJIT_MEM1(SLJIT_S0), 5 * sizeof(sljit_sw));
347 sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R1, 0, SLJIT_MEM1(SLJIT_S0), 5 * sizeof(sljit_sw), SLJIT_R1, 0);
348 sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_MEM1(SLJIT_S0), 4 * sizeof(sljit_sw), SLJIT_R1, 0, SLJIT_MEM1(SLJIT_S0), 4 * sizeof(sljit_sw));
349 sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_MEM1(SLJIT_S0), 5 * sizeof(sljit_sw), SLJIT_MEM1(SLJIT_S0), 4 * sizeof(sljit_sw), SLJIT_MEM1(SLJIT_S0), 5 * sizeof(sljit_sw));
350 sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_MEM1(SLJIT_S0), 3 * sizeof(sljit_sw), SLJIT_MEM1(SLJIT_S0), 4 * sizeof(sljit_sw), SLJIT_R1, 0);
351 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 0x1e7d39f2);
352 sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_MEM1(SLJIT_S0), 6 * sizeof(sljit_sw), SLJIT_R1, 0, SLJIT_IMM, 0x23de7c06);
353 sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_MEM1(SLJIT_S0), 7 * sizeof(sljit_sw), SLJIT_IMM, 0x3d72e452, SLJIT_R1, 0);
354 sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_MEM1(SLJIT_S0), 8 * sizeof(sljit_sw), SLJIT_IMM, -43, SLJIT_MEM1(SLJIT_S0), 8 * sizeof(sljit_sw));
355 sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R0, 0, SLJIT_IMM, 1000, SLJIT_R0, 0);
356 sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_IMM, 1430);
357 sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R0, 0, SLJIT_IMM, -99, SLJIT_R0, 0);
358
359 sljit_emit_return(compiler, SLJIT_MOV, SLJIT_R0, 0);
360
361 code.code = sljit_generate_code(compiler);
362 CHECK(compiler);
363 sljit_free_compiler(compiler);
364
365 FAILED(code.func1((sljit_sw)&buf) != 2437 + 2 * sizeof(sljit_sw), "test5 case 1 failed\n");
366 FAILED(buf[0] != 202 + 2 * sizeof(sljit_sw), "test5 case 2 failed\n");
367 FAILED(buf[2] != 500, "test5 case 3 failed\n");
368 FAILED(buf[3] != 400, "test5 case 4 failed\n");
369 FAILED(buf[4] != 200, "test5 case 5 failed\n");
370 FAILED(buf[5] != 250, "test5 case 6 failed\n");
371 FAILED(buf[6] != 0x425bb5f8, "test5 case 7 failed\n");
372 FAILED(buf[7] != 0x5bf01e44, "test5 case 8 failed\n");
373 FAILED(buf[8] != 270, "test5 case 9 failed\n");
374
375 sljit_free_code(code.code);
376 successful_tests++;
377 }
378
379 static void test6(void)
380 {
381 /* Test addc, sub, subc. */
382 executable_code code;
383 struct sljit_compiler* compiler = sljit_create_compiler(NULL);
384 sljit_sw buf[10];
385
386 if (verbose)
387 printf("Run test6\n");
388
389 FAILED(!compiler, "cannot create compiler\n");
390 buf[0] = 0;
391 buf[1] = 0;
392 buf[2] = 0;
393 buf[3] = 0;
394 buf[4] = 0;
395 buf[5] = 0;
396 buf[6] = 0;
397 buf[7] = 0;
398 buf[8] = 0;
399 buf[9] = 0;
400
401 sljit_emit_enter(compiler, 0, 1, 3, 1, 0, 0, 0);
402 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, -1);
403 sljit_emit_op2(compiler, SLJIT_ADD | SLJIT_SET_C, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_IMM, -1);
404 sljit_emit_op2(compiler, SLJIT_ADDC, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_IMM, 0, SLJIT_IMM, 0);
405 sljit_emit_op2(compiler, SLJIT_ADD | SLJIT_SET_C, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_R0, 0);
406 sljit_emit_op2(compiler, SLJIT_ADDC, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw), SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw), SLJIT_IMM, 4);
407 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 100);
408 sljit_emit_op2(compiler, SLJIT_SUB, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 2, SLJIT_R0, 0, SLJIT_IMM, 50);
409 sljit_emit_op2(compiler, SLJIT_SUB | SLJIT_SET_C, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_IMM, 6000);
410 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 3, SLJIT_IMM, 10);
411 sljit_emit_op2(compiler, SLJIT_SUBC, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 3, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 3, SLJIT_IMM, 5);
412 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 100);
413 sljit_emit_op2(compiler, SLJIT_SUB, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 2);
414 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 4, SLJIT_R0, 0);
415 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 5000);
416 sljit_emit_op2(compiler, SLJIT_SUB, SLJIT_R1, 0, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 4, SLJIT_R0, 0);
417 sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R1, 0, SLJIT_R0, 0, SLJIT_R1, 0);
418 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 5, SLJIT_R1, 0);
419 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 5000);
420 sljit_emit_op2(compiler, SLJIT_SUB, SLJIT_R0, 0, SLJIT_IMM, 6000, SLJIT_R0, 0);
421 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 6, SLJIT_R0, 0);
422 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 100);
423 sljit_emit_op2(compiler, SLJIT_SUB, SLJIT_R1, 0, SLJIT_R0, 0, SLJIT_IMM, 32768);
424 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 7, SLJIT_R1, 0);
425 sljit_emit_op2(compiler, SLJIT_SUB, SLJIT_R1, 0, SLJIT_R0, 0, SLJIT_IMM, -32767);
426 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 8, SLJIT_R1, 0);
427 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 0x52cd3bf4);
428 sljit_emit_op2(compiler, SLJIT_SUB, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 9, SLJIT_R0, 0, SLJIT_IMM, 0x3da297c6);
429 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_RETURN_REG, 0, SLJIT_IMM, 10);
430 sljit_emit_op2(compiler, SLJIT_SUB | SLJIT_SET_C, SLJIT_RETURN_REG, 0, SLJIT_RETURN_REG, 0, SLJIT_IMM, 5);
431 sljit_emit_op2(compiler, SLJIT_SUBC, SLJIT_RETURN_REG, 0, SLJIT_RETURN_REG, 0, SLJIT_IMM, 2);
432 sljit_emit_op2(compiler, SLJIT_SUB, SLJIT_RETURN_REG, 0, SLJIT_RETURN_REG, 0, SLJIT_IMM, -2220);
433 sljit_emit_return(compiler, SLJIT_MOV, SLJIT_RETURN_REG, 0);
434
435 code.code = sljit_generate_code(compiler);
436 CHECK(compiler);
437 sljit_free_compiler(compiler);
438
439 FAILED(code.func1((sljit_sw)&buf) != 2223, "test6 case 1 failed\n");
440 FAILED(buf[0] != 1, "test6 case 2 failed\n");
441 FAILED(buf[1] != 5, "test6 case 3 failed\n");
442 FAILED(buf[2] != 50, "test6 case 4 failed\n");
443 FAILED(buf[3] != 4, "test6 case 5 failed\n");
444 FAILED(buf[4] != 50, "test6 case 6 failed\n");
445 FAILED(buf[5] != 50, "test6 case 7 failed\n");
446 FAILED(buf[6] != 1000, "test6 case 8 failed\n");
447 FAILED(buf[7] != 100 - 32768, "test6 case 9 failed\n");
448 FAILED(buf[8] != 100 + 32767, "test6 case 10 failed\n");
449 FAILED(buf[9] != 0x152aa42e, "test6 case 11 failed\n");
450
451 sljit_free_code(code.code);
452 successful_tests++;
453 }
454
455 static void test7(void)
456 {
457 /* Test logical operators. */
458 executable_code code;
459 struct sljit_compiler* compiler = sljit_create_compiler(NULL);
460 sljit_sw buf[8];
461
462 if (verbose)
463 printf("Run test7\n");
464
465 FAILED(!compiler, "cannot create compiler\n");
466 buf[0] = 0xff80;
467 buf[1] = 0x0f808080;
468 buf[2] = 0;
469 buf[3] = 0xaaaaaa;
470 buf[4] = 0;
471 buf[5] = 0x4040;
472 buf[6] = 0;
473 buf[7] = 0xc43a7f95;
474
475 sljit_emit_enter(compiler, 0, 1, 3, 1, 0, 0, 0);
476 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 0xf0C000);
477 sljit_emit_op2(compiler, SLJIT_OR, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 2, SLJIT_R0, 0, SLJIT_IMM, 0x308f);
478 sljit_emit_op2(compiler, SLJIT_XOR, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw));
479 sljit_emit_op2(compiler, SLJIT_AND, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 3, SLJIT_IMM, 0xf0f0f0, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 3);
480 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 0xC0F0);
481 sljit_emit_op2(compiler, SLJIT_XOR, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 5);
482 sljit_emit_op2(compiler, SLJIT_OR, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_IMM, 0xff0000);
483 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 4, SLJIT_R0, 0);
484 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, 0xC0F0);
485 sljit_emit_op2(compiler, SLJIT_AND, SLJIT_R2, 0, SLJIT_R2, 0, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 5);
486 sljit_emit_op2(compiler, SLJIT_OR, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 5, SLJIT_R2, 0, SLJIT_IMM, 0xff0000);
487 sljit_emit_op2(compiler, SLJIT_XOR, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw), SLJIT_IMM, 0xFFFFFF, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw));
488 sljit_emit_op2(compiler, SLJIT_OR, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 6, SLJIT_IMM, 0xa56c82c0, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 6);
489 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 7);
490 sljit_emit_op2(compiler, SLJIT_XOR, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 7, SLJIT_IMM, 0xff00ff00, SLJIT_R0, 0);
491 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 0xff00ff00);
492 sljit_emit_op2(compiler, SLJIT_OR, SLJIT_R1, 0, SLJIT_R0, 0, SLJIT_IMM, 0x0f);
493 sljit_emit_op2(compiler, SLJIT_AND, SLJIT_RETURN_REG, 0, SLJIT_IMM, 0x888888, SLJIT_R1, 0);
494 sljit_emit_return(compiler, SLJIT_MOV, SLJIT_RETURN_REG, 0);
495
496 code.code = sljit_generate_code(compiler);
497 CHECK(compiler);
498 sljit_free_compiler(compiler);
499
500 FAILED(code.func1((sljit_sw)&buf) != 0x8808, "test7 case 1 failed\n");
501 FAILED(buf[0] != 0x0F807F00, "test7 case 2 failed\n");
502 FAILED(buf[1] != 0x0F7F7F7F, "test7 case 3 failed\n");
503 FAILED(buf[2] != 0x00F0F08F, "test7 case 4 failed\n");
504 FAILED(buf[3] != 0x00A0A0A0, "test7 case 5 failed\n");
505 FAILED(buf[4] != 0x00FF80B0, "test7 case 6 failed\n");
506 FAILED(buf[5] != 0x00FF4040, "test7 case 7 failed\n");
507 FAILED(buf[6] != 0xa56c82c0, "test7 case 8 failed\n");
508 FAILED(buf[7] != 0x3b3a8095, "test7 case 9 failed\n");
509
510 sljit_free_code(code.code);
511 successful_tests++;
512 }
513
514 static void test8(void)
515 {
516 /* Test flags (neg, cmp, test). */
517 executable_code code;
518 struct sljit_compiler* compiler = sljit_create_compiler(NULL);
519 sljit_sw buf[13];
520
521 if (verbose)
522 printf("Run test8\n");
523
524 FAILED(!compiler, "cannot create compiler\n");
525 buf[0] = 100;
526 buf[1] = 3;
527 buf[2] = 3;
528 buf[3] = 3;
529 buf[4] = 3;
530 buf[5] = 3;
531 buf[6] = 3;
532 buf[7] = 3;
533 buf[8] = 3;
534 buf[9] = 3;
535 buf[10] = 3;
536 buf[11] = 3;
537 buf[12] = 3;
538
539 sljit_emit_enter(compiler, 0, 1, 3, 2, 0, 0, 0);
540 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 20);
541 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 10);
542 sljit_emit_op2(compiler, SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, SLJIT_IMM, 6, SLJIT_IMM, 5);
543 sljit_emit_op_flags(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw), SLJIT_UNUSED, 0, SLJIT_NOT_EQUAL);
544 sljit_emit_op_flags(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 2, SLJIT_UNUSED, 0, SLJIT_EQUAL);
545 sljit_emit_op2(compiler, SLJIT_SUB | SLJIT_SET_U, SLJIT_UNUSED, 0, SLJIT_R0, 0, SLJIT_IMM, 3000);
546 sljit_emit_op_flags(compiler, SLJIT_MOV, SLJIT_S1, 0, SLJIT_UNUSED, 0, SLJIT_GREATER);
547 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 3, SLJIT_S1, 0);
548 sljit_emit_op_flags(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_UNUSED, 0, SLJIT_LESS);
549 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 4, SLJIT_R2, 0);
550 sljit_emit_op2(compiler, SLJIT_SUB | SLJIT_SET_S, SLJIT_UNUSED, 0, SLJIT_R0, 0, SLJIT_IMM, -15);
551 sljit_emit_op_flags(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_UNUSED, 0, SLJIT_SIG_GREATER);
552 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 5, SLJIT_R2, 0);
553 sljit_emit_op2(compiler, SLJIT_SUB | SLJIT_SET_E | SLJIT_SET_O, SLJIT_UNUSED, 0, SLJIT_R0, 0, SLJIT_R1, 0);
554 sljit_emit_op2(compiler, SLJIT_SUB | SLJIT_SET_E | SLJIT_SET_O, SLJIT_UNUSED, 0, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_R0, 0);
555 sljit_emit_op1(compiler, SLJIT_NEG | SLJIT_SET_E | SLJIT_SET_O, SLJIT_UNUSED, 0, SLJIT_IMM, (sljit_sw)1 << ((sizeof(sljit_sw) << 3) - 1));
556 sljit_emit_op_flags(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 6, SLJIT_UNUSED, 0, SLJIT_OVERFLOW);
557 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, -1);
558 sljit_emit_op1(compiler, SLJIT_NOT | SLJIT_SET_E, SLJIT_R1, 0, SLJIT_R0, 0);
559 sljit_emit_op_flags(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 7, SLJIT_UNUSED, 0, SLJIT_ZERO);
560 sljit_emit_op1(compiler, SLJIT_NOT | SLJIT_SET_E, SLJIT_UNUSED, 0, SLJIT_R1, 0);
561 sljit_emit_op_flags(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 8, SLJIT_UNUSED, 0, SLJIT_ZERO);
562 sljit_emit_op2(compiler, SLJIT_AND | SLJIT_SET_E, SLJIT_UNUSED, 0, SLJIT_IMM, 0xffff, SLJIT_R0, 0);
563 sljit_emit_op2(compiler, SLJIT_AND | SLJIT_SET_E, SLJIT_UNUSED, 0, SLJIT_R0, 0, SLJIT_IMM, 0xffff);
564 sljit_emit_op_flags(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 9, SLJIT_UNUSED, 0, SLJIT_NOT_ZERO);
565 sljit_emit_op2(compiler, SLJIT_AND | SLJIT_SET_E, SLJIT_UNUSED, 0, SLJIT_IMM, 0xffff, SLJIT_R1, 0);
566 sljit_emit_op2(compiler, SLJIT_AND | SLJIT_SET_E, SLJIT_UNUSED, 0, SLJIT_R1, 0, SLJIT_IMM, 0xffff);
567 sljit_emit_op2(compiler, SLJIT_AND | SLJIT_SET_E, SLJIT_UNUSED, 0, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_R1, 0);
568 sljit_emit_op2(compiler, SLJIT_AND | SLJIT_SET_E, SLJIT_UNUSED, 0, SLJIT_R1, 0, SLJIT_MEM1(SLJIT_S0), 0);
569 sljit_emit_op2(compiler, SLJIT_AND | SLJIT_SET_E, SLJIT_UNUSED, 0, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_MEM1(SLJIT_S0), 0);
570 sljit_emit_op2(compiler, SLJIT_AND | SLJIT_SET_E, SLJIT_UNUSED, 0, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_IMM, 0x1);
571 sljit_emit_op_flags(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 10, SLJIT_UNUSED, 0, SLJIT_NOT_ZERO);
572 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, SLJIT_W(1) << ((sizeof(sljit_sw) << 3) - 1));
573 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 0);
574 sljit_emit_op2(compiler, SLJIT_SUB | SLJIT_SET_O, SLJIT_UNUSED, 0, SLJIT_R1, 0, SLJIT_R0, 0);
575 sljit_emit_op_flags(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 11, SLJIT_UNUSED, 0, SLJIT_OVERFLOW);
576 sljit_emit_op2(compiler, SLJIT_ADD | SLJIT_SET_O, SLJIT_UNUSED, 0, SLJIT_R1, 0, SLJIT_R0, 0);
577 sljit_emit_op_flags(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 12, SLJIT_UNUSED, 0, SLJIT_OVERFLOW);
578 sljit_emit_return(compiler, SLJIT_UNUSED, 0, 0);
579
580 code.code = sljit_generate_code(compiler);
581 CHECK(compiler);
582 sljit_free_compiler(compiler);
583
584 code.func1((sljit_sw)&buf);
585 FAILED(buf[1] != 1, "test8 case 1 failed\n");
586 FAILED(buf[2] != 0, "test8 case 2 failed\n");
587 FAILED(buf[3] != 0, "test8 case 3 failed\n");
588 FAILED(buf[4] != 1, "test8 case 4 failed\n");
589 FAILED(buf[5] != 1, "test8 case 5 failed\n");
590 FAILED(buf[6] != 1, "test8 case 6 failed\n");
591 FAILED(buf[7] != 1, "test8 case 7 failed\n");
592 FAILED(buf[8] != 0, "test8 case 8 failed\n");
593 FAILED(buf[9] != 1, "test8 case 9 failed\n");
594 FAILED(buf[10] != 0, "test8 case 10 failed\n");
595 FAILED(buf[11] != 1, "test8 case 11 failed\n");
596 FAILED(buf[12] != 0, "test8 case 12 failed\n");
597
598 sljit_free_code(code.code);
599 successful_tests++;
600 }
601
602 static void test9(void)
603 {
604 /* Test shift. */
605 executable_code code;
606 struct sljit_compiler* compiler = sljit_create_compiler(NULL);
607 sljit_sw buf[13];
608
609 if (verbose)
610 printf("Run test9\n");
611
612 FAILED(!compiler, "cannot create compiler\n");
613 buf[0] = 0;
614 buf[1] = 0;
615 buf[2] = 0;
616 buf[3] = 0;
617 buf[4] = 1 << 10;
618 buf[5] = 0;
619 buf[6] = 0;
620 buf[7] = 0;
621 buf[8] = 0;
622 buf[9] = 3;
623 buf[10] = 0;
624 buf[11] = 0;
625 buf[12] = 0;
626
627 sljit_emit_enter(compiler, 0, 1, 3, 2, 0, 0, 0);
628 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 0xf);
629 sljit_emit_op2(compiler, SLJIT_SHL, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_IMM, 3);
630 sljit_emit_op2(compiler, SLJIT_LSHR, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_IMM, 1);
631 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_R0, 0);
632 sljit_emit_op2(compiler, SLJIT_ASHR, SLJIT_UNUSED, 0, SLJIT_R0, 0, SLJIT_IMM, 2);
633 sljit_emit_op2(compiler, SLJIT_SHL, SLJIT_R1, 0, SLJIT_R0, 0, SLJIT_IMM, 1);
634 sljit_emit_op2(compiler, SLJIT_SHL, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw), SLJIT_R1, 0, SLJIT_IMM, 1);
635 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, -64);
636 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_PREF_SHIFT_REG, 0, SLJIT_IMM, 2);
637 sljit_emit_op2(compiler, SLJIT_ASHR, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 2, SLJIT_R0, 0, SLJIT_PREF_SHIFT_REG, 0);
638
639 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_PREF_SHIFT_REG, 0, SLJIT_IMM, 0xff);
640 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 4);
641 sljit_emit_op2(compiler, SLJIT_SHL, SLJIT_PREF_SHIFT_REG, 0, SLJIT_PREF_SHIFT_REG, 0, SLJIT_R0, 0);
642 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 3, SLJIT_PREF_SHIFT_REG, 0);
643 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_PREF_SHIFT_REG, 0, SLJIT_IMM, 0xff);
644 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 8);
645 sljit_emit_op2(compiler, SLJIT_LSHR, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 4, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 4, SLJIT_R0, 0);
646 sljit_emit_op2(compiler, SLJIT_SHL, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 5, SLJIT_PREF_SHIFT_REG, 0, SLJIT_R0, 0);
647
648 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S1, 0, SLJIT_IMM, 0xf);
649 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 2);
650 sljit_emit_op2(compiler, SLJIT_SHL, SLJIT_S1, 0, SLJIT_S1, 0, SLJIT_R0, 0);
651 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 6, SLJIT_S1, 0);
652 sljit_emit_op2(compiler, SLJIT_SHL, SLJIT_R0, 0, SLJIT_S1, 0, SLJIT_R0, 0);
653 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 7, SLJIT_R0, 0);
654 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, 0xf00);
655 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 4);
656 sljit_emit_op2(compiler, SLJIT_LSHR, SLJIT_R1, 0, SLJIT_R2, 0, SLJIT_R0, 0);
657 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 8, SLJIT_R1, 0);
658
659 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, (sljit_sw)buf);
660 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 9);
661 sljit_emit_op2(compiler, SLJIT_SHL, SLJIT_MEM2(SLJIT_R0, SLJIT_R1), SLJIT_WORD_SHIFT, SLJIT_MEM2(SLJIT_R0, SLJIT_R1), SLJIT_WORD_SHIFT, SLJIT_MEM2(SLJIT_R0, SLJIT_R1), SLJIT_WORD_SHIFT);
662
663 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_PREF_SHIFT_REG, 0, SLJIT_IMM, 4);
664 sljit_emit_op2(compiler, SLJIT_SHL, SLJIT_PREF_SHIFT_REG, 0, SLJIT_IMM, 2, SLJIT_PREF_SHIFT_REG, 0);
665 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 10, SLJIT_PREF_SHIFT_REG, 0);
666
667 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 0xa9);
668 sljit_emit_op2(compiler, SLJIT_SHL, SLJIT_R1, 0, SLJIT_R0, 0, SLJIT_IMM, 0);
669 sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R0, 0, SLJIT_IMM, 0x7d00);
670 sljit_emit_op2(compiler, SLJIT_LSHR32, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_IMM, 32);
671 #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
672 sljit_emit_op1(compiler, SLJIT_MOV_U32, SLJIT_R0, 0, SLJIT_R0, 0);
673 #endif
674 sljit_emit_op2(compiler, SLJIT_OR, SLJIT_R1, 0, SLJIT_R1, 0, SLJIT_R0, 0);
675 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 0xe30000);
676 #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
677 sljit_emit_op2(compiler, SLJIT_ASHR, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_IMM, 0xffc0);
678 #else
679 sljit_emit_op2(compiler, SLJIT_ASHR, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_IMM, 0xffe0);
680 #endif
681 sljit_emit_op2(compiler, SLJIT_OR, SLJIT_R1, 0, SLJIT_R1, 0, SLJIT_R0, 0);
682 sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R0, 0, SLJIT_IMM, 0x25000000);
683 sljit_emit_op2(compiler, SLJIT_SHL32, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_IMM, 0xfffe1);
684 #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
685 sljit_emit_op1(compiler, SLJIT_MOV_U32, SLJIT_R0, 0, SLJIT_R0, 0);
686 #endif
687 sljit_emit_op2(compiler, SLJIT_OR, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 11, SLJIT_R1, 0, SLJIT_R0, 0);
688
689 SLJIT_ASSERT(SLJIT_R2 == SLJIT_PREF_SHIFT_REG);
690 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_PREF_SHIFT_REG, 0, SLJIT_IMM, 0);
691 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 0x5c);
692 sljit_emit_op2(compiler, SLJIT_SHL, SLJIT_R1, 0, SLJIT_R0, 0, SLJIT_PREF_SHIFT_REG, 0);
693 sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R0, 0, SLJIT_IMM, 0xf600);
694 sljit_emit_op2(compiler, SLJIT_LSHR32, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_PREF_SHIFT_REG, 0);
695 #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
696 /* Alternative form of uint32 type cast. */
697 sljit_emit_op2(compiler, SLJIT_AND, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_IMM, 0xffffffff);
698 #endif
699 sljit_emit_op2(compiler, SLJIT_OR, SLJIT_R1, 0, SLJIT_R1, 0, SLJIT_R0, 0);
700 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 0x630000);
701 sljit_emit_op2(compiler, SLJIT_ASHR, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_PREF_SHIFT_REG, 0);
702 sljit_emit_op2(compiler, SLJIT_OR, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 12, SLJIT_R1, 0, SLJIT_R0, 0);
703
704 sljit_emit_return(compiler, SLJIT_UNUSED, 0, 0);
705
706 code.code = sljit_generate_code(compiler);
707 CHECK(compiler);
708 sljit_free_compiler(compiler);
709
710 code.func1((sljit_sw)&buf);
711 FAILED(buf[0] != 0x3c, "test9 case 1 failed\n");
712 FAILED(buf[1] != 0xf0, "test9 case 2 failed\n");
713 FAILED(buf[2] != -16, "test9 case 3 failed\n");
714 FAILED(buf[3] != 0xff0, "test9 case 4 failed\n");
715 FAILED(buf[4] != 4, "test9 case 5 failed\n");
716 FAILED(buf[5] != 0xff00, "test9 case 6 failed\n");
717 FAILED(buf[6] != 0x3c, "test9 case 7 failed\n");
718 FAILED(buf[7] != 0xf0, "test9 case 8 failed\n");
719 FAILED(buf[8] != 0xf0, "test9 case 9 failed\n");
720 FAILED(buf[9] != 0x18, "test9 case 10 failed\n");
721 FAILED(buf[10] != 32, "test9 case 11 failed\n");
722 FAILED(buf[11] != 0x4ae37da9, "test9 case 12 failed\n");
723 FAILED(buf[12] != 0x63f65c, "test9 case 13 failed\n");
724
725 sljit_free_code(code.code);
726 successful_tests++;
727 }
728
729 static void test10(void)
730 {
731 /* Test multiplications. */
732 executable_code code;
733 struct sljit_compiler* compiler = sljit_create_compiler(NULL);
734 sljit_sw buf[7];
735
736 if (verbose)
737 printf("Run test10\n");
738
739 FAILED(!compiler, "cannot create compiler\n");
740 buf[0] = 3;
741 buf[1] = 0;
742 buf[2] = 0;
743 buf[3] = 6;
744 buf[4] = -10;
745 buf[5] = 0;
746 buf[6] = 0;
747
748 sljit_emit_enter(compiler, 0, 1, 3, 1, 0, 0, 0);
749 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 5);
750 sljit_emit_op2(compiler, SLJIT_MUL, SLJIT_R0, 0, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_R0, 0);
751 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_R0, 0);
752 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, 7);
753 sljit_emit_op2(compiler, SLJIT_MUL, SLJIT_R0, 0, SLJIT_R2, 0, SLJIT_IMM, 8);
754 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw), SLJIT_R0, 0);
755 sljit_emit_op2(compiler, SLJIT_MUL, SLJIT_R0, 0, SLJIT_IMM, -3, SLJIT_IMM, -4);
756 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 2, SLJIT_R0, 0);
757 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, -2);
758 sljit_emit_op2(compiler, SLJIT_MUL, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 3, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 3, SLJIT_R0, 0);
759 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, sizeof(sljit_sw) / 2);
760 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, (sljit_sw)&buf[3]);
761 sljit_emit_op2(compiler, SLJIT_MUL, SLJIT_MEM2(SLJIT_R1, SLJIT_R0), 1, SLJIT_MEM2(SLJIT_R1, SLJIT_R0), 1, SLJIT_MEM2(SLJIT_R1, SLJIT_R0), 1);
762 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 9);
763 sljit_emit_op2(compiler, SLJIT_MUL, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_R0, 0);
764 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 5, SLJIT_R0, 0);
765 #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
766 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 3);
767 sljit_emit_op2(compiler, SLJIT_MUL, SLJIT_R0, 0, SLJIT_R1, 0, SLJIT_IMM, SLJIT_W(0x123456789));
768 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 6, SLJIT_R0, 0);
769 #endif
770 sljit_emit_op2(compiler, SLJIT_MUL, SLJIT_RETURN_REG, 0, SLJIT_IMM, 11, SLJIT_IMM, 10);
771 sljit_emit_return(compiler, SLJIT_MOV, SLJIT_RETURN_REG, 0);
772
773 code.code = sljit_generate_code(compiler);
774 CHECK(compiler);
775 sljit_free_compiler(compiler);
776
777 FAILED(code.func1((sljit_sw)&buf) != 110, "test10 case 1 failed\n");
778 FAILED(buf[0] != 15, "test10 case 2 failed\n");
779 FAILED(buf[1] != 56, "test10 case 3 failed\n");
780 FAILED(buf[2] != 12, "test10 case 4 failed\n");
781 FAILED(buf[3] != -12, "test10 case 5 failed\n");
782 FAILED(buf[4] != 100, "test10 case 6 failed\n");
783 FAILED(buf[5] != 81, "test10 case 7 failed\n");
784 #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
785 FAILED(buf[6] != SLJIT_W(0x123456789) * 3, "test10 case 8 failed\n");
786 #endif
787
788 sljit_free_code(code.code);
789 successful_tests++;
790 }
791
792 static void test11(void)
793 {
794 /* Test rewritable constants. */
795 executable_code code;
796 struct sljit_compiler* compiler = sljit_create_compiler(NULL);
797 struct sljit_const* const1;
798 struct sljit_const* const2;
799 struct sljit_const* const3;
800 struct sljit_const* const4;
801 void* value;
802 sljit_uw const1_addr;
803 sljit_uw const2_addr;
804 sljit_uw const3_addr;
805 sljit_uw const4_addr;
806 #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
807 sljit_sw word_value1 = SLJIT_W(0xaaaaaaaaaaaaaaaa);
808 sljit_sw word_value2 = SLJIT_W(0xfee1deadfbadf00d);
809 #else
810 sljit_sw word_value1 = 0xaaaaaaaal;
811 sljit_sw word_value2 = 0xfbadf00dl;
812 #endif
813 sljit_sw buf[3];
814
815 if (verbose)
816 printf("Run test11\n");
817
818 FAILED(!compiler, "cannot create compiler\n");
819 buf[0] = 0;
820 buf[1] = 0;
821 buf[2] = 0;
822
823 sljit_emit_enter(compiler, 0, 1, 3, 1, 0, 0, 0);
824
825 const1 = sljit_emit_const(compiler, SLJIT_MEM0(), (sljit_sw)&buf[0], -0x81b9);
826 SLJIT_ASSERT(!sljit_alloc_memory(compiler, 0));
827 SLJIT_ASSERT(!sljit_alloc_memory(compiler, 16 * sizeof(sljit_sw) + 1));
828 value = sljit_alloc_memory(compiler, 16 * sizeof(sljit_sw));
829 SLJIT_ASSERT(!((sljit_sw)value & (sizeof(sljit_sw) - 1)));
830 memset(value, 255, 16 * sizeof(sljit_sw));
831 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 2);
832 const2 = sljit_emit_const(compiler, SLJIT_MEM2(SLJIT_S0, SLJIT_R0), SLJIT_WORD_SHIFT - 1, -65535);
833 sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_IMM, (sljit_sw)&buf[0] + 2 * sizeof(sljit_sw) - 2);
834 const3 = sljit_emit_const(compiler, SLJIT_MEM1(SLJIT_R0), 0, word_value1);
835 value = sljit_alloc_memory(compiler, 17);
836 SLJIT_ASSERT(!((sljit_sw)value & (sizeof(sljit_sw) - 1)));
837 memset(value, 255, 16);
838 const4 = sljit_emit_const(compiler, SLJIT_RETURN_REG, 0, 0xf7afcdb7);
839
840 sljit_emit_return(compiler, SLJIT_MOV, SLJIT_RETURN_REG, 0);
841
842 code.code = sljit_generate_code(compiler);
843 CHECK(compiler);
844 const1_addr = sljit_get_const_addr(const1);
845 const2_addr = sljit_get_const_addr(const2);
846 const3_addr = sljit_get_const_addr(const3);
847 const4_addr = sljit_get_const_addr(const4);
848 sljit_free_compiler(compiler);
849
850 FAILED(code.func1((sljit_sw)&buf) != 0xf7afcdb7, "test11 case 1 failed\n");
851 FAILED(buf[0] != -0x81b9, "test11 case 2 failed\n");
852 FAILED(buf[1] != -65535, "test11 case 3 failed\n");
853 FAILED(buf[2] != word_value1, "test11 case 4 failed\n");
854
855 sljit_set_const(const1_addr, -1);
856 sljit_set_const(const2_addr, word_value2);
857 sljit_set_const(const3_addr, 0xbab0fea1);
858 sljit_set_const(const4_addr, -60089);
859
860 FAILED(code.func1((sljit_sw)&buf) != -60089, "test11 case 5 failed\n");
861 FAILED(buf[0] != -1, "test11 case 6 failed\n");
862 FAILED(buf[1] != word_value2, "test11 case 7 failed\n");
863 FAILED(buf[2] != 0xbab0fea1, "test11 case 8 failed\n");
864
865 sljit_free_code(code.code);
866 successful_tests++;
867 }
868
869 static void test12(void)
870 {
871 /* Test rewriteable jumps. */
872 executable_code code;
873 struct sljit_compiler* compiler = sljit_create_compiler(NULL);
874 struct sljit_label *label1;
875 struct sljit_label *label2;
876 struct sljit_label *label3;
877 struct sljit_jump *jump1;
878 struct sljit_jump *jump2;
879 struct sljit_jump *jump3;
880 void* value;
881 sljit_uw jump1_addr;
882 sljit_uw label1_addr;
883 sljit_uw label2_addr;
884 sljit_sw buf[1];
885
886 if (verbose)
887 printf("Run test12\n");
888
889 FAILED(!compiler, "cannot create compiler\n");
890 buf[0] = 0;
891
892 sljit_emit_enter(compiler, 0, 2, 3, 2, 0, 0, 0);
893 sljit_emit_op2(compiler, SLJIT_SUB | SLJIT_SET_S, SLJIT_UNUSED, 0, SLJIT_S1, 0, SLJIT_IMM, 10);
894 jump1 = sljit_emit_jump(compiler, SLJIT_REWRITABLE_JUMP | SLJIT_SIG_GREATER);
895 /* Default handler. */
896 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_IMM, 5);
897 jump2 = sljit_emit_jump(compiler, SLJIT_JUMP);
898 value = sljit_alloc_memory(compiler, 15);
899 SLJIT_ASSERT(!((sljit_sw)value & (sizeof(sljit_sw) - 1)));
900 memset(value, 255, 15);
901 /* Handler 1. */
902 label1 = sljit_emit_label(compiler);
903 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_IMM, 6);
904 jump3 = sljit_emit_jump(compiler, SLJIT_JUMP);
905 /* Handler 2. */
906 label2 = sljit_emit_label(compiler);
907 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_IMM, 7);
908 /* Exit. */
909 label3 = sljit_emit_label(compiler);
910 sljit_set_label(jump2, label3);
911 sljit_set_label(jump3, label3);
912 /* By default, set to handler 1. */
913 sljit_set_label(jump1, label1);
914 sljit_emit_return(compiler, SLJIT_UNUSED, 0, 0);
915
916 value = sljit_alloc_memory(compiler, 8);
917 SLJIT_ASSERT(!((sljit_sw)value & (sizeof(sljit_sw) - 1)));
918 memset(value, 255, 8);
919
920 code.code = sljit_generate_code(compiler);
921 CHECK(compiler);
922 jump1_addr = sljit_get_jump_addr(jump1);
923 label1_addr = sljit_get_label_addr(label1);
924 label2_addr = sljit_get_label_addr(label2);
925 sljit_free_compiler(compiler);
926
927 code.func2((sljit_sw)&buf, 4);
928 FAILED(buf[0] != 5, "test12 case 1 failed\n");
929
930 code.func2((sljit_sw)&buf, 11);
931 FAILED(buf[0] != 6, "test12 case 2 failed\n");
932
933 sljit_set_jump_addr(jump1_addr, label2_addr);
934 code.func2((sljit_sw)&buf, 12);
935 FAILED(buf[0] != 7, "test12 case 3 failed\n");
936
937 sljit_set_jump_addr(jump1_addr, label1_addr);
938 code.func2((sljit_sw)&buf, 13);
939 FAILED(buf[0] != 6, "test12 case 4 failed\n");
940
941 sljit_free_code(code.code);
942 successful_tests++;
943 }
944
945 static void test13(void)
946 {
947 /* Test fpu monadic functions. */
948 executable_code code;
949 struct sljit_compiler* compiler = sljit_create_compiler(NULL);
950 sljit_f64 buf[7];
951 sljit_sw buf2[6];
952
953 if (verbose)
954 printf("Run test13\n");
955
956 if (!sljit_is_fpu_available()) {
957 if (verbose)
958 printf("no fpu available, test13 skipped\n");
959 successful_tests++;
960 if (compiler)
961 sljit_free_compiler(compiler);
962 return;
963 }
964
965 FAILED(!compiler, "cannot create compiler\n");
966 buf[0] = 7.75;
967 buf[1] = -4.5;
968 buf[2] = 0.0;
969 buf[3] = 0.0;
970 buf[4] = 0.0;
971 buf[5] = 0.0;
972 buf[6] = 0.0;
973
974 buf2[0] = 10;
975 buf2[1] = 10;
976 buf2[2] = 10;
977 buf2[3] = 10;
978 buf2[4] = 10;
979 buf2[5] = 10;
980
981 sljit_emit_enter(compiler, 0, 2, 3, 2, 6, 0, 0);
982 sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM0(), (sljit_sw)&buf[2], SLJIT_MEM0(), (sljit_sw)&buf[1]);
983 sljit_emit_fop1(compiler, SLJIT_ABS_F64, SLJIT_MEM1(SLJIT_S0), 3 * sizeof(sljit_f64), SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64));
984 sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR0, 0, SLJIT_MEM0(), (sljit_sw)&buf[0]);
985 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 2 * sizeof(sljit_f64));
986 sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR1, 0, SLJIT_MEM2(SLJIT_S0, SLJIT_R0), 0);
987 sljit_emit_fop1(compiler, SLJIT_NEG_F64, SLJIT_FR2, 0, SLJIT_FR0, 0);
988 sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR3, 0, SLJIT_FR2, 0);
989 sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM0(), (sljit_sw)&buf[4], SLJIT_FR3, 0);
990 sljit_emit_fop1(compiler, SLJIT_ABS_F64, SLJIT_FR4, 0, SLJIT_FR1, 0);
991 sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), 5 * sizeof(sljit_f64), SLJIT_FR4, 0);
992 sljit_emit_fop1(compiler, SLJIT_NEG_F64, SLJIT_MEM1(SLJIT_S0), 6 * sizeof(sljit_f64), SLJIT_FR4, 0);
993
994 sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR5, 0, SLJIT_MEM1(SLJIT_S0), 0);
995 sljit_emit_fop1(compiler, SLJIT_CMP_F64 | SLJIT_SET_S, SLJIT_FR5, 0, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64));
996 sljit_emit_op_flags(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S1), 0, SLJIT_UNUSED, 0, SLJIT_GREATER_F64);
997 sljit_emit_fop1(compiler, SLJIT_CMP_F64 | SLJIT_SET_S, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64), SLJIT_FR5, 0);
998 sljit_emit_op_flags(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S1), sizeof(sljit_sw), SLJIT_UNUSED, 0, SLJIT_GREATER_F64);
999 sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR1, 0, SLJIT_FR5, 0);
1000 sljit_emit_fop1(compiler, SLJIT_CMP_F64 | SLJIT_SET_E | SLJIT_SET_S, SLJIT_FR1, 0, SLJIT_FR1, 0);
1001 sljit_emit_op_flags(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S1), 2 * sizeof(sljit_sw), SLJIT_UNUSED, 0, SLJIT_EQUAL_F64);
1002 sljit_emit_op_flags(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S1), 3 * sizeof(sljit_sw), SLJIT_UNUSED, 0, SLJIT_LESS_F64);
1003 sljit_emit_fop1(compiler, SLJIT_CMP_F64 | SLJIT_SET_E, SLJIT_FR1, 0, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64));
1004 sljit_emit_op_flags(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S1), 4 * sizeof(sljit_sw), SLJIT_UNUSED, 0, SLJIT_EQUAL_F64);
1005 sljit_emit_op_flags(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S1), 5 * sizeof(sljit_sw), SLJIT_UNUSED, 0, SLJIT_NOT_EQUAL_F64);
1006
1007 sljit_emit_return(compiler, SLJIT_UNUSED, 0, 0);
1008
1009 code.code = sljit_generate_code(compiler);
1010 CHECK(compiler);
1011 sljit_free_compiler(compiler);
1012
1013 code.func2((sljit_sw)&buf, (sljit_sw)&buf2);
1014 FAILED(buf[2] != -4.5, "test13 case 1 failed\n");
1015 FAILED(buf[3] != 4.5, "test13 case 2 failed\n");
1016 FAILED(buf[4] != -7.75, "test13 case 3 failed\n");
1017 FAILED(buf[5] != 4.5, "test13 case 4 failed\n");
1018 FAILED(buf[6] != -4.5, "test13 case 5 failed\n");
1019
1020 FAILED(buf2[0] != 1, "test13 case 6 failed\n");
1021 FAILED(buf2[1] != 0, "test13 case 7 failed\n");
1022 FAILED(buf2[2] != 1, "test13 case 8 failed\n");
1023 FAILED(buf2[3] != 0, "test13 case 9 failed\n");
1024 FAILED(buf2[4] != 0, "test13 case 10 failed\n");
1025 FAILED(buf2[5] != 1, "test13 case 11 failed\n");
1026
1027 sljit_free_code(code.code);
1028 successful_tests++;
1029 }
1030
1031 static void test14(void)
1032 {
1033 /* Test fpu diadic functions. */
1034 executable_code code;
1035 struct sljit_compiler* compiler = sljit_create_compiler(NULL);
1036 sljit_f64 buf[15];
1037
1038 if (verbose)
1039 printf("Run test14\n");
1040
1041 if (!sljit_is_fpu_available()) {
1042 if (verbose)
1043 printf("no fpu available, test14 skipped\n");
1044 successful_tests++;
1045 if (compiler)
1046 sljit_free_compiler(compiler);
1047 return;
1048 }
1049 buf[0] = 7.25;
1050 buf[1] = 3.5;
1051 buf[2] = 1.75;
1052 buf[3] = 0.0;
1053 buf[4] = 0.0;
1054 buf[5] = 0.0;
1055 buf[6] = 0.0;
1056 buf[7] = 0.0;
1057 buf[8] = 0.0;
1058 buf[9] = 0.0;
1059 buf[10] = 0.0;
1060 buf[11] = 0.0;
1061 buf[12] = 8.0;
1062 buf[13] = 4.0;
1063 buf[14] = 0.0;
1064
1065 FAILED(!compiler, "cannot create compiler\n");
1066 sljit_emit_enter(compiler, 0, 1, 3, 1, 6, 0, 0);
1067
1068 /* ADD */
1069 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, sizeof(sljit_f64));
1070 sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR0, 0, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64));
1071 sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR1, 0, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64) * 2);
1072 sljit_emit_fop2(compiler, SLJIT_ADD_F64, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64) * 3, SLJIT_MEM2(SLJIT_S0, SLJIT_R0), 0, SLJIT_MEM1(SLJIT_S0), 0);
1073 sljit_emit_fop2(compiler, SLJIT_ADD_F64, SLJIT_FR0, 0, SLJIT_FR0, 0, SLJIT_FR1, 0);
1074 sljit_emit_fop2(compiler, SLJIT_ADD_F64, SLJIT_FR1, 0, SLJIT_FR0, 0, SLJIT_FR1, 0);
1075 sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64) * 4, SLJIT_FR0, 0);
1076 sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64) * 5, SLJIT_FR1, 0);
1077
1078 /* SUB */
1079 sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR2, 0, SLJIT_MEM1(SLJIT_S0), 0);
1080 sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR3, 0, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64) * 2);
1081 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 2);
1082 sljit_emit_fop2(compiler, SLJIT_SUB_F64, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64) * 6, SLJIT_FR3, 0, SLJIT_MEM2(SLJIT_S0, SLJIT_R1), SLJIT_F64_SHIFT);
1083 sljit_emit_fop2(compiler, SLJIT_SUB_F64, SLJIT_FR2, 0, SLJIT_FR2, 0, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64) * 2);
1084 sljit_emit_fop2(compiler, SLJIT_SUB_F64, SLJIT_FR3, 0, SLJIT_FR2, 0, SLJIT_FR3, 0);
1085 sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64) * 7, SLJIT_FR2, 0);
1086 sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64) * 8, SLJIT_FR3, 0);
1087
1088 /* MUL */
1089 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 1);
1090 sljit_emit_fop2(compiler, SLJIT_MUL_F64, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64) * 9, SLJIT_MEM2(SLJIT_S0, SLJIT_R1), SLJIT_F64_SHIFT, SLJIT_FR1, 0);
1091 sljit_emit_fop2(compiler, SLJIT_MUL_F64, SLJIT_FR1, 0, SLJIT_FR1, 0, SLJIT_FR2, 0);
1092 sljit_emit_fop2(compiler, SLJIT_MUL_F64, SLJIT_FR5, 0, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64) * 2, SLJIT_FR2, 0);
1093 sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64) * 10, SLJIT_FR1, 0);
1094 sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64) * 11, SLJIT_FR5, 0);
1095
1096 /* DIV */
1097 sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR5, 0, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64) * 12);
1098 sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR1, 0, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64) * 13);
1099 sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR4, 0, SLJIT_FR5, 0);
1100 sljit_emit_fop2(compiler, SLJIT_DIV_F64, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64) * 12, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64) * 12, SLJIT_FR1, 0);
1101 sljit_emit_fop2(compiler, SLJIT_DIV_F64, SLJIT_FR5, 0, SLJIT_FR5, 0, SLJIT_FR1, 0);
1102 sljit_emit_fop2(compiler, SLJIT_DIV_F64, SLJIT_FR4, 0, SLJIT_FR1, 0, SLJIT_FR4, 0);
1103 sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64) * 13, SLJIT_FR5, 0);
1104 sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64) * 14, SLJIT_FR4, 0);
1105
1106 sljit_emit_return(compiler, SLJIT_UNUSED, 0, 0);
1107
1108 code.code = sljit_generate_code(compiler);
1109 CHECK(compiler);
1110 sljit_free_compiler(compiler);
1111
1112 code.func1((sljit_sw)&buf);
1113 FAILED(buf[3] != 10.75, "test14 case 1 failed\n");
1114 FAILED(buf[4] != 5.25, "test14 case 2 failed\n");
1115 FAILED(buf[5] != 7.0, "test14 case 3 failed\n");
1116 FAILED(buf[6] != 0.0, "test14 case 4 failed\n");
1117 FAILED(buf[7] != 5.5, "test14 case 5 failed\n");
1118 FAILED(buf[8] != 3.75, "test14 case 6 failed\n");
1119 FAILED(buf[9] != 24.5, "test14 case 7 failed\n");
1120 FAILED(buf[10] != 38.5, "test14 case 8 failed\n");
1121 FAILED(buf[11] != 9.625, "test14 case 9 failed\n");
1122 FAILED(buf[12] != 2.0, "test14 case 10 failed\n");
1123 FAILED(buf[13] != 2.0, "test14 case 11 failed\n");
1124 FAILED(buf[14] != 0.5, "test14 case 12 failed\n");
1125
1126 sljit_free_code(code.code);
1127 successful_tests++;
1128 }
1129
1130 static sljit_sw SLJIT_CALL func(sljit_sw a, sljit_sw b, sljit_sw c)
1131 {
1132 return a + b + c + 5;
1133 }
1134
1135 static void test15(void)
1136 {
1137 /* Test function call. */
1138 executable_code code;
1139 struct sljit_compiler* compiler = sljit_create_compiler(NULL);
1140 struct sljit_jump* jump;
1141 sljit_sw buf[7];
1142
1143 if (verbose)
1144 printf("Run test15\n");
1145
1146 FAILED(!compiler, "cannot create compiler\n");
1147 buf[0] = 0;
1148 buf[1] = 0;
1149 buf[2] = 0;
1150 buf[3] = 0;
1151 buf[4] = 0;
1152 buf[5] = 0;
1153 buf[6] = SLJIT_FUNC_OFFSET(func);
1154
1155 sljit_emit_enter(compiler, 0, 1, 4, 1, 0, 0, 0);
1156
1157 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 5);
1158 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 7);
1159 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, -3);
1160 sljit_emit_ijump(compiler, SLJIT_CALL3, SLJIT_IMM, SLJIT_FUNC_OFFSET(func));
1161 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_RETURN_REG, 0);
1162
1163 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, -5);
1164 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, -10);
1165 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, 2);
1166 jump = sljit_emit_jump(compiler, SLJIT_CALL3 | SLJIT_REWRITABLE_JUMP);
1167 sljit_set_target(jump, (sljit_sw)-1);
1168 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw), SLJIT_RETURN_REG, 0);
1169
1170 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, SLJIT_FUNC_OFFSET(func));
1171 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 40);
1172 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, -3);
1173 sljit_emit_ijump(compiler, SLJIT_CALL3, SLJIT_R0, 0);
1174 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 2 * sizeof(sljit_sw), SLJIT_RETURN_REG, 0);
1175
1176 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, -60);
1177 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, SLJIT_FUNC_OFFSET(func));
1178 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, -30);
1179 sljit_emit_ijump(compiler, SLJIT_CALL3, SLJIT_R1, 0);
1180 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 3 * sizeof(sljit_sw), SLJIT_RETURN_REG, 0);
1181
1182 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 10);
1183 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 16);
1184 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, SLJIT_FUNC_OFFSET(func));
1185 sljit_emit_ijump(compiler, SLJIT_CALL3, SLJIT_R2, 0);
1186 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 4 * sizeof(sljit_sw), SLJIT_RETURN_REG, 0);
1187
1188 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 100);
1189 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 110);
1190 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, 120);
1191 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R3, 0, SLJIT_IMM, SLJIT_FUNC_OFFSET(func));
1192 sljit_emit_ijump(compiler, SLJIT_CALL3, SLJIT_R3, 0);
1193 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 5 * sizeof(sljit_sw), SLJIT_RETURN_REG, 0);
1194
1195 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, -10);
1196 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, -16);
1197 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, 6);
1198 sljit_emit_ijump(compiler, SLJIT_CALL3, SLJIT_MEM1(SLJIT_S0), 6 * sizeof(sljit_sw));
1199 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 6 * sizeof(sljit_sw), SLJIT_RETURN_REG, 0);
1200
1201 sljit_emit_return(compiler, SLJIT_MOV, SLJIT_RETURN_REG, 0);
1202
1203 code.code = sljit_generate_code(compiler);
1204 CHECK(compiler);
1205 sljit_set_jump_addr(sljit_get_jump_addr(jump), SLJIT_FUNC_OFFSET(func));
1206 sljit_free_compiler(compiler);
1207
1208 FAILED(code.func1((sljit_sw)&buf) != -15, "test15 case 1 failed\n");
1209 FAILED(buf[0] != 14, "test15 case 2 failed\n");
1210 FAILED(buf[1] != -8, "test15 case 3 failed\n");
1211 FAILED(buf[2] != SLJIT_FUNC_OFFSET(func) + 42, "test15 case 4 failed\n");
1212 FAILED(buf[3] != SLJIT_FUNC_OFFSET(func) - 85, "test15 case 5 failed\n");
1213 FAILED(buf[4] != SLJIT_FUNC_OFFSET(func) + 31, "test15 case 6 failed\n");
1214 FAILED(buf[5] != 335, "test15 case 7 failed\n");
1215 FAILED(buf[6] != -15, "test15 case 8 failed\n");
1216
1217 sljit_free_code(code.code);
1218 successful_tests++;
1219 }
1220
1221 static void test16(void)
1222 {
1223 /* Ackermann benchmark. */
1224 executable_code code;
1225 struct sljit_compiler* compiler = sljit_create_compiler(NULL);
1226 struct sljit_label *entry;
1227 struct sljit_label *label;
1228 struct sljit_jump *jump;
1229 struct sljit_jump *jump1;
1230 struct sljit_jump *jump2;
1231
1232 if (verbose)
1233 printf("Run test16\n");
1234
1235 FAILED(!compiler, "cannot create compiler\n");
1236
1237 entry = sljit_emit_label(compiler);
1238 sljit_emit_enter(compiler, 0, 2, 3, 2, 0, 0, 0);
1239 /* If x == 0. */
1240 sljit_emit_op2(compiler, SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, SLJIT_S0, 0, SLJIT_IMM, 0);
1241 jump1 = sljit_emit_jump(compiler, SLJIT_EQUAL);
1242 /* If y == 0. */
1243 sljit_emit_op2(compiler, SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, SLJIT_S1, 0, SLJIT_IMM, 0);
1244 jump2 = sljit_emit_jump(compiler, SLJIT_EQUAL);
1245
1246 /* Ack(x,y-1). */
1247 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_S0, 0);
1248 sljit_emit_op2(compiler, SLJIT_SUB, SLJIT_R1, 0, SLJIT_S1, 0, SLJIT_IMM, 1);
1249 jump = sljit_emit_jump(compiler, SLJIT_CALL2);
1250 sljit_set_label(jump, entry);
1251
1252 /* Returns with Ack(x-1, Ack(x,y-1)). */
1253 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_RETURN_REG, 0);
1254 sljit_emit_op2(compiler, SLJIT_SUB, SLJIT_R0, 0, SLJIT_S0, 0, SLJIT_IMM, 1);
1255 jump = sljit_emit_jump(compiler, SLJIT_CALL2);
1256 sljit_set_label(jump, entry);
1257 sljit_emit_return(compiler, SLJIT_MOV, SLJIT_RETURN_REG, 0);
1258
1259 /* Returns with y+1. */
1260 label = sljit_emit_label(compiler);
1261 sljit_set_label(jump1, label);
1262 sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_RETURN_REG, 0, SLJIT_IMM, 1, SLJIT_S1, 0);
1263 sljit_emit_return(compiler, SLJIT_MOV, SLJIT_RETURN_REG, 0);
1264
1265 /* Returns with Ack(x-1,1) */
1266 label = sljit_emit_label(compiler);
1267 sljit_set_label(jump2, label);
1268 sljit_emit_op2(compiler, SLJIT_SUB, SLJIT_R0, 0, SLJIT_S0, 0, SLJIT_IMM, 1);
1269 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 1);
1270 jump = sljit_emit_jump(compiler, SLJIT_CALL2);
1271 sljit_set_label(jump, entry);
1272 sljit_emit_return(compiler, SLJIT_MOV, SLJIT_RETURN_REG, 0);
1273
1274 code.code = sljit_generate_code(compiler);
1275 CHECK(compiler);
1276 sljit_free_compiler(compiler);
1277
1278 FAILED(code.func2(3, 3) != 61, "test16 case 1 failed\n");
1279 /* For benchmarking. */
1280 /* FAILED(code.func2(3, 11) != 16381, "test16 case 1 failed\n"); */
1281
1282 sljit_free_code(code.code);
1283 successful_tests++;
1284 }
1285
1286 static void test17(void)
1287 {
1288 /* Test arm constant pool. */
1289 executable_code code;
1290 struct sljit_compiler* compiler = sljit_create_compiler(NULL);
1291 sljit_s32 i;
1292 sljit_sw buf[5];
1293
1294 if (verbose)
1295 printf("Run test17\n");
1296
1297 FAILED(!compiler, "cannot create compiler\n");
1298 buf[0] = 0;
1299 buf[1] = 0;
1300 buf[2] = 0;
1301 buf[3] = 0;
1302 buf[4] = 0;
1303
1304 sljit_emit_enter(compiler, 0, 1, 3, 1, 0, 0, 0);
1305 for (i = 0; i <= 0xfff; i++) {
1306 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 0x81818000 | i);
1307 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 0x81818000 | i);
1308 if ((i & 0x3ff) == 0)
1309 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), (i >> 10) * sizeof(sljit_sw), SLJIT_R0, 0);
1310 }
1311 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 4 * sizeof(sljit_sw), SLJIT_R0, 0);
1312 sljit_emit_return(compiler, SLJIT_UNUSED, 0, 0);
1313
1314 code.code = sljit_generate_code(compiler);
1315 CHECK(compiler);
1316 sljit_free_compiler(compiler);
1317
1318 code.func1((sljit_sw)&buf);
1319 FAILED((sljit_uw)buf[0] != 0x81818000, "test17 case 1 failed\n");
1320 FAILED((sljit_uw)buf[1] != 0x81818400, "test17 case 2 failed\n");
1321 FAILED((sljit_uw)buf[2] != 0x81818800, "test17 case 3 failed\n");
1322 FAILED((sljit_uw)buf[3] != 0x81818c00, "test17 case 4 failed\n");
1323 FAILED((sljit_uw)buf[4] != 0x81818fff, "test17 case 5 failed\n");
1324
1325 sljit_free_code(code.code);
1326 successful_tests++;
1327 }
1328
1329 static void test18(void)
1330 {
1331 /* Test 64 bit. */
1332 executable_code code;
1333 struct sljit_compiler* compiler = sljit_create_compiler(NULL);
1334 sljit_sw buf[11];
1335
1336 if (verbose)
1337 printf("Run test18\n");
1338
1339 FAILED(!compiler, "cannot create compiler\n");
1340 buf[0] = 0;
1341 buf[1] = 0;
1342 buf[2] = 0;
1343 buf[3] = 0;
1344 buf[4] = 0;
1345 buf[5] = 100;
1346 buf[6] = 100;
1347 buf[7] = 100;
1348 buf[8] = 100;
1349 buf[9] = 0;
1350 #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE) && (defined SLJIT_BIG_ENDIAN && SLJIT_BIG_ENDIAN)
1351 buf[10] = SLJIT_W(1) << 32;
1352 #else
1353 buf[10] = 1;
1354 #endif
1355
1356 sljit_emit_enter(compiler, 0, 1, 3, 2, 0, 0, 0);
1357
1358 #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
1359 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_IMM, SLJIT_W(0x1122334455667788));
1360 sljit_emit_op1(compiler, SLJIT_MOV_U32, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw), SLJIT_IMM, SLJIT_W(0x1122334455667788));
1361
1362 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, SLJIT_W(1000000000000));
1363 sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 2, SLJIT_R0, 0, SLJIT_IMM, SLJIT_W(1000000000000));
1364 sljit_emit_op2(compiler, SLJIT_SUB, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 3, SLJIT_IMM, SLJIT_W(5000000000000), SLJIT_R0, 0);
1365
1366 sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R1, 0, SLJIT_IMM, SLJIT_W(0x1108080808));
1367 sljit_emit_op2(compiler, SLJIT_ADD32, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 4, SLJIT_R1, 0, SLJIT_IMM, SLJIT_W(0x1120202020));
1368
1369 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, SLJIT_W(0x1108080808));
1370 sljit_emit_op2(compiler, SLJIT_AND | SLJIT_SET_E, SLJIT_UNUSED, 0, SLJIT_R0, 0, SLJIT_IMM, SLJIT_W(0x1120202020));
1371 sljit_emit_op_flags(compiler, SLJIT_MOV, SLJIT_S1, 0, SLJIT_UNUSED, 0, SLJIT_ZERO);
1372 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 5, SLJIT_S1, 0);
1373 sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R0, 0, SLJIT_R0, 0);
1374 sljit_emit_op2(compiler, SLJIT_AND32 | SLJIT_SET_E, SLJIT_UNUSED, 0, SLJIT_R0, 0, SLJIT_IMM, SLJIT_W(0x1120202020));
1375 sljit_emit_op_flags(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 6, SLJIT_UNUSED, 0, SLJIT_ZERO32);
1376
1377 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, SLJIT_W(0x1108080808));
1378 sljit_emit_op2(compiler, SLJIT_SUB | SLJIT_SET_U, SLJIT_UNUSED, 0, SLJIT_R0, 0, SLJIT_IMM, SLJIT_W(0x2208080808));
1379 sljit_emit_op_flags(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 7, SLJIT_UNUSED, 0, SLJIT_LESS);
1380 sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R0, 0, SLJIT_R0, 0);
1381 sljit_emit_op2(compiler, SLJIT_AND32 | SLJIT_SET_E, SLJIT_UNUSED, 0, SLJIT_R0, 0, SLJIT_IMM, SLJIT_W(0x1104040404));
1382 sljit_emit_op_flags(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 8, SLJIT_UNUSED, 0, SLJIT_NOT_ZERO32);
1383
1384 sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R0, 0, SLJIT_IMM, 4);
1385 sljit_emit_op2(compiler, SLJIT_SHL32, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 9, SLJIT_IMM, SLJIT_W(0xffff0000), SLJIT_R0, 0);
1386
1387 sljit_emit_op2(compiler, SLJIT_MUL32, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 10, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 10, SLJIT_IMM, -1);
1388 #else
1389 /* 32 bit operations. */
1390
1391 sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_IMM, 0x11223344);
1392 sljit_emit_op2(compiler, SLJIT_ADD32, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw), SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw), SLJIT_IMM, 0x44332211);
1393
1394 #endif
1395
1396 sljit_emit_return(compiler, SLJIT_UNUSED, 0, 0);
1397
1398 code.code = sljit_generate_code(compiler);
1399 CHECK(compiler);
1400 sljit_free_compiler(compiler);
1401
1402 code.func1((sljit_sw)&buf);
1403 #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
1404 FAILED(buf[0] != SLJIT_W(0x1122334455667788), "test18 case 1 failed\n");
1405 #if (defined SLJIT_LITTLE_ENDIAN && SLJIT_LITTLE_ENDIAN)
1406 FAILED(buf[1] != 0x55667788, "test18 case 2 failed\n");
1407 #else
1408 FAILED(buf[1] != SLJIT_W(0x5566778800000000), "test18 case 2 failed\n");
1409 #endif
1410 FAILED(buf[2] != SLJIT_W(2000000000000), "test18 case 3 failed\n");
1411 FAILED(buf[3] != SLJIT_W(4000000000000), "test18 case 4 failed\n");
1412 #if (defined SLJIT_LITTLE_ENDIAN && SLJIT_LITTLE_ENDIAN)
1413 FAILED(buf[4] != 0x28282828, "test18 case 5 failed\n");
1414 #else
1415 FAILED(buf[4] != SLJIT_W(0x2828282800000000), "test18 case 5 failed\n");
1416 #endif
1417 FAILED(buf[5] != 0, "test18 case 6 failed\n");
1418 FAILED(buf[6] != 1, "test18 case 7 failed\n");
1419 FAILED(buf[7] != 1, "test18 case 8 failed\n");
1420 FAILED(buf[8] != 0, "test18 case 9 failed\n");
1421 #if (defined SLJIT_LITTLE_ENDIAN && SLJIT_LITTLE_ENDIAN)
1422 FAILED(buf[9] != 0xfff00000, "test18 case 10 failed\n");
1423 FAILED(buf[10] != 0xffffffff, "test18 case 11 failed\n");
1424 #else
1425 FAILED(buf[9] != SLJIT_W(0xfff0000000000000), "test18 case 10 failed\n");
1426 FAILED(buf[10] != SLJIT_W(0xffffffff00000000), "test18 case 11 failed\n");
1427 #endif
1428 #else
1429 FAILED(buf[0] != 0x11223344, "test18 case 1 failed\n");
1430 FAILED(buf[1] != 0x44332211, "test18 case 2 failed\n");
1431 #endif
1432
1433 sljit_free_code(code.code);
1434 successful_tests++;
1435 }
1436
1437 static void test19(void)
1438 {
1439 /* Test arm partial instruction caching. */
1440 executable_code code;
1441 struct sljit_compiler* compiler = sljit_create_compiler(NULL);
1442 sljit_sw buf[10];
1443
1444 if (verbose)
1445 printf("Run test19\n");
1446
1447 FAILED(!compiler, "cannot create compiler\n");
1448 buf[0] = 6;
1449 buf[1] = 4;
1450 buf[2] = 0;
1451 buf[3] = 0;
1452 buf[4] = 0;
1453 buf[5] = 0;
1454 buf[6] = 2;
1455 buf[7] = 0;
1456
1457 sljit_emit_enter(compiler, 0, 1, 3, 1, 0, 0, 0);
1458 sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw));
1459 sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_MEM0(), (sljit_sw)&buf[2], SLJIT_MEM0(), (sljit_sw)&buf[1], SLJIT_MEM0(), (sljit_sw)&buf[0]);
1460 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 0);
1461 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, sizeof(sljit_sw));
1462 sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 3, SLJIT_MEM1(SLJIT_R0), (sljit_sw)&buf[0], SLJIT_MEM1(SLJIT_R1), (sljit_sw)&buf[0]);
1463 sljit_emit_op2(compiler, SLJIT_SUB, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 4, SLJIT_MEM0(), (sljit_sw)&buf[0], SLJIT_IMM, 2);
1464 sljit_emit_op2(compiler, SLJIT_SUB, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 5, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 2, SLJIT_MEM1(SLJIT_R0), (sljit_sw)&buf[0] + 4 * sizeof(sljit_sw));
1465 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 7, SLJIT_IMM, 10);
1466 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 7);
1467 sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_MEM1(SLJIT_R1), (sljit_sw)&buf[5], SLJIT_MEM2(SLJIT_S0, SLJIT_R0), SLJIT_WORD_SHIFT, SLJIT_MEM1(SLJIT_R1), (sljit_sw)&buf[5]);
1468
1469 sljit_emit_return(compiler, SLJIT_UNUSED, 0, 0);
1470
1471 code.code = sljit_generate_code(compiler);
1472 CHECK(compiler);
1473 sljit_free_compiler(compiler);
1474
1475 code.func1((sljit_sw)&buf);
1476 FAILED(buf[0] != 10, "test19 case 1 failed\n");
1477 FAILED(buf[1] != 4, "test19 case 2 failed\n");
1478 FAILED(buf[2] != 14, "test19 case 3 failed\n");
1479 FAILED(buf[3] != 14, "test19 case 4 failed\n");
1480 FAILED(buf[4] != 8, "test19 case 5 failed\n");
1481 FAILED(buf[5] != 6, "test19 case 6 failed\n");
1482 FAILED(buf[6] != 12, "test19 case 7 failed\n");
1483 FAILED(buf[7] != 10, "test19 case 8 failed\n");
1484
1485 sljit_free_code(code.code);
1486 successful_tests++;
1487 }
1488
1489 static void test20(void)
1490 {
1491 /* Test stack. */
1492 executable_code code;
1493 struct sljit_compiler* compiler = sljit_create_compiler(NULL);
1494 struct sljit_jump* jump;
1495 struct sljit_label* label;
1496 sljit_sw buf[6];
1497 #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
1498 sljit_sw offset_value = SLJIT_W(0x1234567812345678);
1499 #else
1500 sljit_sw offset_value = SLJIT_W(0x12345678);
1501 #endif
1502
1503 if (verbose)
1504 printf("Run test20\n");
1505
1506 FAILED(!compiler, "cannot create compiler\n");
1507 buf[0] = 5;
1508 buf[1] = 12;
1509 buf[2] = 0;
1510 buf[3] = 0;
1511 buf[4] = 111;
1512 buf[5] = -12345;
1513
1514 sljit_emit_enter(compiler, 0, 1, 5, 5, 0, 0, 4 * sizeof(sljit_sw));
1515 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), sizeof(sljit_uw), SLJIT_MEM1(SLJIT_S0), 0);
1516 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), 0, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_uw));
1517 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R3, 0, SLJIT_IMM, -1);
1518 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R4, 0, SLJIT_IMM, -1);
1519 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S3, 0, SLJIT_IMM, -1);
1520 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S4, 0, SLJIT_IMM, -1);
1521 sljit_emit_op2(compiler, SLJIT_MUL, SLJIT_MEM1(SLJIT_S0), 2 * sizeof(sljit_uw), SLJIT_MEM1(SLJIT_SP), 0, SLJIT_MEM1(SLJIT_SP), sizeof(sljit_uw));
1522 sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_MEM1(SLJIT_S0), 3 * sizeof(sljit_uw), SLJIT_MEM1(SLJIT_SP), sizeof(sljit_uw), SLJIT_MEM1(SLJIT_SP), 0);
1523 sljit_get_local_base(compiler, SLJIT_R0, 0, -offset_value);
1524 sljit_get_local_base(compiler, SLJIT_MEM1(SLJIT_S0), 0, -0x1234);
1525 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_MEM1(SLJIT_S0), 0);
1526 sljit_emit_op2(compiler, SLJIT_SUB, SLJIT_MEM1(SLJIT_S0), 4 * sizeof(sljit_uw), SLJIT_MEM1(SLJIT_R0), offset_value, SLJIT_MEM1(SLJIT_R1), 0x1234 + sizeof(sljit_sw));
1527 sljit_emit_return(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 5 * sizeof(sljit_uw));
1528 /* Dummy last instructions. */
1529 sljit_emit_const(compiler, SLJIT_R0, 0, -9);
1530 sljit_emit_label(compiler);
1531
1532 code.code = sljit_generate_code(compiler);
1533 CHECK(compiler);
1534 sljit_free_compiler(compiler);
1535
1536 FAILED(code.func1((sljit_sw)&buf) != -12345, "test20 case 1 failed\n")
1537
1538 FAILED(buf[2] != 60, "test20 case 2 failed\n");
1539 FAILED(buf[3] != 17, "test20 case 3 failed\n");
1540 FAILED(buf[4] != 7, "test20 case 4 failed\n");
1541
1542 sljit_free_code(code.code);
1543
1544 compiler = sljit_create_compiler(NULL);
1545 sljit_emit_enter(compiler, 0, 0, 3, 0, 0, 0, SLJIT_MAX_LOCAL_SIZE);
1546
1547 sljit_get_local_base(compiler, SLJIT_R0, 0, SLJIT_MAX_LOCAL_SIZE - sizeof(sljit_sw));
1548 sljit_get_local_base(compiler, SLJIT_R1, 0, -(sljit_sw)sizeof(sljit_sw));
1549 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, -1);
1550 label = sljit_emit_label(compiler);
1551 sljit_emit_op1(compiler, SLJIT_MOVU, SLJIT_MEM1(SLJIT_R1), sizeof(sljit_sw), SLJIT_R2, 0);
1552 sljit_emit_op2(compiler, SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, SLJIT_R1, 0, SLJIT_R0, 0);
1553 jump = sljit_emit_jump(compiler, SLJIT_NOT_EQUAL);
1554 sljit_set_label(jump, label);
1555
1556 sljit_emit_return(compiler, SLJIT_UNUSED, 0, 0);
1557
1558 code.code = sljit_generate_code(compiler);
1559 CHECK(compiler);
1560 sljit_free_compiler(compiler);
1561
1562 /* Just survive this code. */
1563 code.func0();
1564
1565 sljit_free_code(code.code);
1566 successful_tests++;
1567 }
1568
1569 static void test21(void)
1570 {
1571 /* Test fake enter. The parts of the jit code can be separated in the memory. */
1572 executable_code code1;
1573 executable_code code2;
1574 struct sljit_compiler* compiler = sljit_create_compiler(NULL);
1575 struct sljit_jump* jump;
1576 sljit_uw addr;
1577 sljit_sw buf[4];
1578
1579 if (verbose)
1580 printf("Run test21\n");
1581
1582 FAILED(!compiler, "cannot create compiler\n");
1583 buf[0] = 9;
1584 buf[1] = -6;
1585 buf[2] = 0;
1586 buf[3] = 0;
1587
1588 sljit_emit_enter(compiler, 0, 1, 3, 2, 0, 0, 2 * sizeof(sljit_sw));
1589
1590 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), 0, SLJIT_IMM, 10);
1591 sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_MEM1(SLJIT_SP), sizeof(sljit_sw), SLJIT_MEM1(SLJIT_S0), 0, SLJIT_MEM1(SLJIT_SP), 0);
1592 jump = sljit_emit_jump(compiler, SLJIT_JUMP | SLJIT_REWRITABLE_JUMP);
1593 sljit_set_target(jump, 0);
1594
1595 code1.code = sljit_generate_code(compiler);
1596 CHECK(compiler);
1597 addr = sljit_get_jump_addr(jump);
1598 sljit_free_compiler(compiler);
1599
1600 compiler = sljit_create_compiler(NULL);
1601 FAILED(!compiler, "cannot create compiler\n");
1602
1603 /* Other part of the jit code. */
1604 sljit_set_context(compiler, 0, 1, 3, 2, 0, 0, 2 * sizeof(sljit_sw));
1605
1606 sljit_emit_op2(compiler, SLJIT_SUB, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 2, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw), SLJIT_MEM1(SLJIT_SP), 0);
1607 sljit_emit_op2(compiler, SLJIT_MUL, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 3, SLJIT_MEM1(SLJIT_SP), 0, SLJIT_MEM1(SLJIT_SP), 0);
1608 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_RETURN_REG, 0, SLJIT_MEM1(SLJIT_SP), sizeof(sljit_sw));
1609
1610 sljit_emit_return(compiler, SLJIT_MOV, SLJIT_RETURN_REG, 0);
1611
1612 code2.code = sljit_generate_code(compiler);
1613 CHECK(compiler);
1614 sljit_free_compiler(compiler);
1615
1616 sljit_set_jump_addr(addr, SLJIT_FUNC_OFFSET(code2.code));
1617
1618 FAILED(code1.func1((sljit_sw)&buf) != 19, "test21 case 1 failed\n");
1619 FAILED(buf[2] != -16, "test21 case 2 failed\n");
1620 FAILED(buf[3] != 100, "test21 case 3 failed\n");
1621
1622 sljit_free_code(code1.code);
1623 sljit_free_code(code2.code);
1624 successful_tests++;
1625 }
1626
1627 static void test22(void)
1628 {
1629 /* Test simple byte and half-int data transfers. */
1630 executable_code code;
1631 struct sljit_compiler* compiler = sljit_create_compiler(NULL);
1632 sljit_sw buf[9];
1633 sljit_s16 sbuf[7];
1634 sljit_s8 bbuf[5];
1635
1636 if (verbose)
1637 printf("Run test22\n");
1638
1639 FAILED(!compiler, "cannot create compiler\n");
1640 buf[0] = 5;
1641 buf[1] = 0;
1642 buf[2] = 0;
1643 buf[3] = 0;
1644 buf[4] = 0;
1645 buf[5] = 0;
1646 buf[6] = 0;
1647 buf[7] = 0;
1648 buf[8] = 0;
1649
1650 sbuf[0] = 0;
1651 sbuf[1] = 0;
1652 sbuf[2] = -9;
1653 sbuf[3] = 0;
1654 sbuf[4] = 0;
1655 sbuf[5] = 0;
1656 sbuf[6] = 0;
1657
1658 bbuf[0] = 0;
1659 bbuf[1] = 0;
1660 bbuf[2] = -56;
1661 bbuf[3] = 0;
1662 bbuf[4] = 0;
1663
1664 sljit_emit_enter(compiler, 0, 3, 3, 3, 0, 0, 0);
1665
1666 sljit_emit_op2(compiler, SLJIT_SUB, SLJIT_R0, 0, SLJIT_S0, 0, SLJIT_IMM, sizeof(sljit_sw));
1667 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_S0, 0);
1668 sljit_emit_op1(compiler, SLJIT_MOVU, SLJIT_MEM1(SLJIT_R1), sizeof(sljit_sw), SLJIT_IMM, -13);
1669 sljit_emit_op1(compiler, SLJIT_MOVU, SLJIT_R2, 0, SLJIT_MEM1(SLJIT_R0), sizeof(sljit_sw));
1670 sljit_emit_op1(compiler, SLJIT_MOVU, SLJIT_MEM1(SLJIT_R1), sizeof(sljit_sw), SLJIT_R2, 0);
1671 sljit_emit_op1(compiler, SLJIT_MOVU, SLJIT_MEM1(SLJIT_R1), sizeof(sljit_sw), SLJIT_MEM1(SLJIT_R0), sizeof(sljit_sw));
1672 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 1);
1673 sljit_emit_op1(compiler, SLJIT_MOVU, SLJIT_MEM2(SLJIT_R1, SLJIT_R0), SLJIT_WORD_SHIFT, SLJIT_R1, 0);
1674 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, sizeof(sljit_sw));
1675 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM2(SLJIT_R1, SLJIT_R0), 0, SLJIT_R1, 0);
1676 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 2);
1677 sljit_emit_op1(compiler, SLJIT_MOVU, SLJIT_MEM2(SLJIT_R1, SLJIT_R0), SLJIT_WORD_SHIFT, SLJIT_R1, 0);
1678
1679 sljit_emit_op1(compiler, SLJIT_MOV_S16, SLJIT_MEM1(SLJIT_S1), 0, SLJIT_IMM, -13);
1680 sljit_emit_op1(compiler, SLJIT_MOVU_U16, SLJIT_MEM1(SLJIT_S1), sizeof(sljit_s16), SLJIT_IMM, 0x1234);
1681 sljit_emit_op1(compiler, SLJIT_MOVU_S16, SLJIT_R0, 0, SLJIT_MEM1(SLJIT_S1), sizeof(sljit_s16));
1682 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 7 * sizeof(sljit_sw), SLJIT_R0, 0);
1683 sljit_emit_op1(compiler, SLJIT_MOV_U16, SLJIT_MEM1(SLJIT_S1), sizeof(sljit_s16), SLJIT_MEM1(SLJIT_S1), -(sljit_sw)sizeof(sljit_s16));
1684 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 0xff0000 + 8000);
1685 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 2);
1686 sljit_emit_op1(compiler, SLJIT_MOV_S16, SLJIT_MEM2(SLJIT_S1, SLJIT_R1), 1, SLJIT_R0, 0);
1687 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 3);
1688 sljit_emit_op1(compiler, SLJIT_MOVU_S16, SLJIT_MEM2(SLJIT_S1, SLJIT_R1), 1, SLJIT_R0, 0);
1689 sljit_emit_op1(compiler, SLJIT_MOV_S16, SLJIT_MEM1(SLJIT_S1), 0, SLJIT_IMM, -9317);
1690 sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R1, 0, SLJIT_S1, 0, SLJIT_IMM, 5 * sizeof(sljit_s16));
1691 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, -5);
1692 sljit_emit_op1(compiler, SLJIT_MOV_U16, SLJIT_R1, 0, SLJIT_MEM2(SLJIT_R1, SLJIT_R0), 1);
1693 sljit_emit_op1(compiler, SLJIT_MOV_U16, SLJIT_MEM1(SLJIT_S1), sizeof(sljit_s16), SLJIT_R1, 0);
1694
1695 sljit_emit_op1(compiler, SLJIT_MOV_S8, SLJIT_MEM1(SLJIT_S2), 0, SLJIT_IMM, -45);
1696 sljit_emit_op1(compiler, SLJIT_MOVU_U8, SLJIT_MEM1(SLJIT_S2), sizeof(sljit_s8), SLJIT_IMM, 0x12);
1697 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 2 * sizeof(sljit_s8));
1698 sljit_emit_op1(compiler, SLJIT_MOVU_S8, SLJIT_R1, 0, SLJIT_MEM1(SLJIT_S2), sizeof(sljit_s8));
1699 sljit_emit_op1(compiler, SLJIT_MOV_S8, SLJIT_S1, 0, SLJIT_R1, 0);
1700 sljit_emit_op1(compiler, SLJIT_MOV_U8, SLJIT_S1, 0, SLJIT_S1, 0);
1701 sljit_emit_op1(compiler, SLJIT_MOV_S8, SLJIT_R2, 0, SLJIT_S1, 0);
1702 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 8 * sizeof(sljit_sw), SLJIT_R2, 0);
1703 sljit_emit_op1(compiler, SLJIT_MOV_U8, SLJIT_MEM1(SLJIT_S2), sizeof(sljit_s8), SLJIT_S1, 0);
1704 sljit_emit_op1(compiler, SLJIT_MOV_U8, SLJIT_MEM2(SLJIT_S2, SLJIT_R0), 0, SLJIT_R0, 0);
1705
1706 sljit_emit_return(compiler, SLJIT_UNUSED, 0, 0);
1707
1708 code.code = sljit_generate_code(compiler);
1709 CHECK(compiler);
1710 sljit_free_compiler(compiler);
1711
1712 code.func3((sljit_sw)&buf, (sljit_sw)&sbuf, (sljit_sw)&bbuf);
1713 FAILED(buf[1] != -13, "test22 case 1 failed\n");
1714 FAILED(buf[2] != 5, "test22 case 2 failed\n");
1715 FAILED(buf[3] != -13, "test22 case 3 failed\n");
1716 FAILED(buf[4] != (sljit_sw)&buf[3], "test22 case 4 failed\n");
1717 FAILED(buf[5] != (sljit_sw)&buf[4], "test22 case 5 failed\n");
1718 FAILED(buf[6] != (sljit_sw)&buf[4], "test22 case 6 failed\n");
1719 FAILED(buf[7] != -9, "test22 case 7 failed\n");
1720 FAILED(buf[8] != -56, "test22 case 8 failed\n");
1721
1722 FAILED(sbuf[0] != -13, "test22 case 9 failed\n");
1723 FAILED(sbuf[1] != 0x1234, "test22 case 10 failed\n");
1724 FAILED(sbuf[3] != 0x1234, "test22 case 11 failed\n");
1725 FAILED(sbuf[4] != 8000, "test22 case 12 failed\n");
1726 FAILED(sbuf[5] != -9317, "test22 case 13 failed\n");
1727 FAILED(sbuf[6] != -9317, "test22 case 14 failed\n");
1728
1729 FAILED(bbuf[0] != -45, "test22 case 15 failed\n");
1730 FAILED(bbuf[1] != 0x12, "test22 case 16 failed\n");
1731 FAILED(bbuf[3] != -56, "test22 case 17 failed\n");
1732 FAILED(bbuf[4] != 2, "test22 case 18 failed\n");
1733
1734 sljit_free_code(code.code);
1735 successful_tests++;
1736 }
1737
1738 static void test23(void)
1739 {
1740 /* Test 32 bit / 64 bit signed / unsigned int transfer and conversion.
1741 This test has do real things on 64 bit systems, but works on 32 bit systems as well. */
1742 executable_code code;
1743 struct sljit_compiler* compiler = sljit_create_compiler(NULL);
1744 sljit_sw buf[9];
1745 sljit_s32 ibuf[5];
1746 union {
1747 sljit_s32 asint;
1748 sljit_u8 asbytes[4];
1749 } u;
1750 #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
1751 sljit_sw garbage = SLJIT_W(0x1234567812345678);
1752 #else
1753 sljit_sw garbage = 0x12345678;
1754 #endif
1755
1756 if (verbose)
1757 printf("Run test23\n");
1758
1759 FAILED(!compiler, "cannot create compiler\n");
1760 buf[0] = 0;
1761 buf[1] = 0;
1762 buf[2] = 0;
1763 buf[3] = 0;
1764 buf[4] = 0;
1765 buf[5] = 0;
1766 buf[6] = 0;
1767 buf[7] = 0;
1768 buf[8] = 0;
1769
1770 ibuf[0] = 0;
1771 ibuf[1] = 0;
1772 ibuf[2] = -5791;
1773 ibuf[3] = 43579;
1774 ibuf[4] = 658923;
1775
1776 sljit_emit_enter(compiler, 0, 2, 3, 3, 0, 0, 0);
1777 sljit_emit_op1(compiler, SLJIT_MOV_U32, SLJIT_MEM1(SLJIT_S1), 0, SLJIT_IMM, 34567);
1778 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 1);
1779 sljit_emit_op1(compiler, SLJIT_MOVU_S32, SLJIT_MEM2(SLJIT_S1, SLJIT_R0), 2, SLJIT_IMM, -7654);
1780 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, garbage);
1781 sljit_emit_op1(compiler, SLJIT_MOVU_S32, SLJIT_R0, 0, SLJIT_MEM1(SLJIT_S1), sizeof(sljit_s32));
1782 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_R0, 0);
1783 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, garbage);
1784 sljit_emit_op1(compiler, SLJIT_MOVU_U32, SLJIT_R0, 0, SLJIT_MEM1(SLJIT_S1), sizeof(sljit_s32));
1785 sljit_emit_op1(compiler, SLJIT_MOVU, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw), SLJIT_R0, 0);
1786 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, garbage);
1787 sljit_emit_op1(compiler, SLJIT_MOV_S32, SLJIT_R0, 0, SLJIT_MEM1(SLJIT_S1), sizeof(sljit_s32));
1788 sljit_emit_op1(compiler, SLJIT_MOV_U32, SLJIT_R0, 0, SLJIT_R0, 0);
1789 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw), SLJIT_R0, 0);
1790 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 0x0f00f00);
1791 sljit_emit_op2(compiler, SLJIT_SUB, SLJIT_S0, 0, SLJIT_S0, 0, SLJIT_IMM, 0x7777);
1792 sljit_emit_op1(compiler, SLJIT_MOVU, SLJIT_MEM1(SLJIT_S0), 0x7777 + 2 * sizeof(sljit_sw), SLJIT_R0, 0);
1793 sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_S0, 0, SLJIT_S0, 0, SLJIT_IMM, 0x7777);
1794 sljit_emit_op1(compiler, SLJIT_MOVU, SLJIT_MEM1(SLJIT_S0), -0x7777 + (sljit_sw)sizeof(sljit_sw), SLJIT_R0, 0);
1795 sljit_emit_op2(compiler, SLJIT_SUB, SLJIT_R1, 0, SLJIT_S0, 0, SLJIT_IMM, 16 - sizeof(sljit_sw));
1796 sljit_emit_op2(compiler, SLJIT_LSHR, SLJIT_R1, 0, SLJIT_R1, 0, SLJIT_IMM, 1);
1797 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 16);
1798 sljit_emit_op1(compiler, SLJIT_MOVU, SLJIT_MEM2(SLJIT_R0, SLJIT_R1), 1, SLJIT_R0, 0);
1799 sljit_emit_op2(compiler, SLJIT_OR, SLJIT_MEM1(SLJIT_R0), 0, SLJIT_IMM, 64, SLJIT_MEM1(SLJIT_R0), 0);
1800 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 0);
1801 sljit_emit_op1(compiler, SLJIT_MOVU, SLJIT_MEM1(SLJIT_R0), (sljit_sw)&buf[6], SLJIT_MEM0(), (sljit_sw)&buf[6]);
1802 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R0), 0, SLJIT_IMM, 0x123456);
1803 sljit_emit_op1(compiler, SLJIT_MOVU, SLJIT_MEM1(SLJIT_S0), 3 * sizeof(sljit_sw), SLJIT_S0, 0);
1804 sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_IMM, sizeof(sljit_sw));
1805 sljit_emit_op2(compiler, SLJIT_SUB, SLJIT_S0, 0, SLJIT_S0, 0, SLJIT_IMM, 100000 * sizeof(sljit_sw));
1806 sljit_emit_op1(compiler, SLJIT_MOVU, SLJIT_MEM1(SLJIT_S0), 100001 * sizeof(sljit_sw), SLJIT_S0, 0);
1807 sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_IMM, sizeof(sljit_sw));
1808 sljit_emit_op1(compiler, SLJIT_MOVU_S32, SLJIT_MEM1(SLJIT_S1), sizeof(sljit_s32), SLJIT_IMM, 0x12345678);
1809
1810 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 0x2bd700 | 243);
1811 sljit_emit_return(compiler, SLJIT_MOV_S8, SLJIT_R1, 0);
1812
1813 code.code = sljit_generate_code(compiler);
1814 CHECK(compiler);
1815 sljit_free_compiler(compiler);
1816
1817 FAILED(code.func2((sljit_sw)&buf, (sljit_sw)&ibuf) != -13, "test23 case 1 failed\n");
1818 FAILED(buf[0] != -5791, "test23 case 2 failed\n");
1819 FAILED(buf[1] != 43579, "test23 case 3 failed\n");
1820 FAILED(buf[2] != 658923, "test23 case 4 failed\n");
1821 FAILED(buf[3] != 0x0f00f00, "test23 case 5 failed\n");
1822 FAILED(buf[4] != 0x0f00f00, "test23 case 6 failed\n");
1823 FAILED(buf[5] != 80, "test23 case 7 failed\n");
1824 FAILED(buf[6] != 0x123456, "test23 case 8 failed\n");
1825 FAILED(buf[7] != (sljit_sw)&buf[5], "test23 case 9 failed\n");
1826 FAILED(buf[8] != (sljit_sw)&buf[8] - 100000 * sizeof(sljit_sw), "test23 case 10 failed\n");
1827
1828 FAILED(ibuf[0] != 34567, "test23 case 11 failed\n");
1829 FAILED(ibuf[1] != -7654, "test23 case 12 failed\n");
1830 u.asint = ibuf[4];
1831 #if (defined SLJIT_LITTLE_ENDIAN && SLJIT_LITTLE_ENDIAN)
1832 FAILED(u.asbytes[0] != 0x78, "test23 case 13 failed\n");
1833 FAILED(u.asbytes[1] != 0x56, "test23 case 14 failed\n");
1834 FAILED(u.asbytes[2] != 0x34, "test23 case 15 failed\n");
1835 FAILED(u.asbytes[3] != 0x12, "test23 case 16 failed\n");
1836 #else
1837 FAILED(u.asbytes[0] != 0x12, "test23 case 13 failed\n");
1838 FAILED(u.asbytes[1] != 0x34, "test23 case 14 failed\n");
1839 FAILED(u.asbytes[2] != 0x56, "test23 case 15 failed\n");
1840 FAILED(u.asbytes[3] != 0x78, "test23 case 16 failed\n");
1841 #endif
1842
1843 sljit_free_code(code.code);
1844 successful_tests++;
1845 }
1846
1847 static void test24(void)
1848 {
1849 /* Some complicated addressing modes. */
1850 executable_code code;
1851 struct sljit_compiler* compiler = sljit_create_compiler(NULL);
1852 sljit_sw buf[9];
1853 sljit_s16 sbuf[5];
1854 sljit_s8 bbuf[7];
1855
1856 if (verbose)
1857 printf("Run test24\n");
1858
1859 FAILED(!compiler, "cannot create compiler\n");
1860
1861 buf[0] = 100567;
1862 buf[1] = 75799;
1863 buf[2] = 0;
1864 buf[3] = -8;
1865 buf[4] = -50;
1866 buf[5] = 0;
1867 buf[6] = 0;
1868 buf[7] = 0;
1869 buf[8] = 0;
1870
1871 sbuf[0] = 30000;
1872 sbuf[1] = 0;
1873 sbuf[2] = 0;
1874 sbuf[3] = -12345;
1875 sbuf[4] = 0;
1876
1877 bbuf[0] = -128;
1878 bbuf[1] = 0;
1879 bbuf[2] = 0;
1880 bbuf[3] = 99;
1881 bbuf[4] = 0;
1882 bbuf[5] = 0;
1883 bbuf[6] = 0;
1884
1885 sljit_emit_enter(compiler, 0, 3, 3, 3, 0, 0, 0);
1886
1887 /* Nothing should be updated. */
1888 sljit_emit_op1(compiler, SLJIT_MOVU_S16, SLJIT_MEM0(), (sljit_sw)&sbuf[1], SLJIT_MEM0(), (sljit_sw)&sbuf[0]);
1889 sljit_emit_op1(compiler, SLJIT_MOVU_S8, SLJIT_MEM0(), (sljit_sw)&bbuf[1], SLJIT_MEM0(), (sljit_sw)&bbuf[0]);
1890 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 2);
1891 sljit_emit_op1(compiler, SLJIT_MOV_U16, SLJIT_MEM2(SLJIT_S1, SLJIT_R0), 1, SLJIT_MEM0(), (sljit_sw)&sbuf[3]);
1892 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, (sljit_sw)&buf[0]);
1893 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, sizeof(sljit_sw));
1894 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, 2);
1895 sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_MEM2(SLJIT_R0, SLJIT_R2), SLJIT_WORD_SHIFT, SLJIT_MEM0(), (sljit_sw)&buf[0], SLJIT_MEM2(SLJIT_R1, SLJIT_R0), 0);
1896 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, sizeof(sljit_s8));
1897 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, sizeof(sljit_s8));
1898 sljit_emit_op1(compiler, SLJIT_MOVU_U8, SLJIT_MEM1(SLJIT_R0), (sljit_sw)&bbuf[1], SLJIT_MEM1(SLJIT_R1), (sljit_sw)&bbuf[0]);
1899 sljit_emit_op1(compiler, SLJIT_MOVU_U8, SLJIT_MEM1(SLJIT_R0), 0, SLJIT_MEM1(SLJIT_R1), 2 * sizeof(sljit_s8));
1900
1901 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, sizeof(sljit_s16));
1902 sljit_emit_op1(compiler, SLJIT_MOV_S16, SLJIT_MEM1(SLJIT_R1), (sljit_sw)&sbuf[3], SLJIT_R1, 0);
1903
1904 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 3);
1905 sljit_emit_op2(compiler, SLJIT_MUL, SLJIT_MEM2(SLJIT_S0, SLJIT_R0), SLJIT_WORD_SHIFT, SLJIT_MEM2(SLJIT_S0, SLJIT_R0), SLJIT_WORD_SHIFT, SLJIT_MEM2(SLJIT_S0, SLJIT_R0), SLJIT_WORD_SHIFT);
1906 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 4);
1907 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_S0, 0);
1908 sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_MEM2(SLJIT_S0, SLJIT_R0), SLJIT_WORD_SHIFT, SLJIT_MEM2(SLJIT_R1, SLJIT_R0), SLJIT_WORD_SHIFT, SLJIT_MEM2(SLJIT_S0, SLJIT_R0), SLJIT_WORD_SHIFT);
1909 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_S0, 0);
1910 sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R1, 0, SLJIT_S0, 0, SLJIT_IMM, sizeof(sljit_sw));
1911 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, 4);
1912 sljit_emit_op1(compiler, SLJIT_MOVU, SLJIT_MEM2(SLJIT_R1, SLJIT_R2), SLJIT_WORD_SHIFT, SLJIT_MEM2(SLJIT_R0, SLJIT_R2), SLJIT_WORD_SHIFT);
1913 sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_MEM1(SLJIT_S0), 5 * sizeof(sljit_sw), SLJIT_MEM1(SLJIT_S0), 5 * sizeof(sljit_sw), SLJIT_R0, 0);
1914 sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_MEM1(SLJIT_S0), 5 * sizeof(sljit_sw), SLJIT_MEM1(SLJIT_S0), 5 * sizeof(sljit_sw), SLJIT_R1, 0);
1915
1916 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, (sljit_sw)&buf - 0x7fff8000 + 6 * sizeof(sljit_sw));
1917 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 952467);
1918 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R0), 0x7fff8000, SLJIT_R1, 0);
1919 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R0), 0x7fff8000 + sizeof(sljit_sw), SLJIT_MEM1(SLJIT_R0), 0x7fff8000);
1920
1921 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, (sljit_sw)&buf + 0x7fff7fff + 6 * sizeof(sljit_sw));
1922 sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_MEM1(SLJIT_R0), -0x7fff7fff + 2 * sizeof(sljit_sw), SLJIT_MEM1(SLJIT_R0), -0x7fff7fff + sizeof(sljit_sw), SLJIT_MEM1(SLJIT_R0), -0x7fff7fff);
1923 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, (sljit_sw)&bbuf - 0x7fff7ffe + 3 * sizeof(sljit_s8));
1924 sljit_emit_op1(compiler, SLJIT_MOV_S8, SLJIT_MEM1(SLJIT_R0), 0x7fff7fff, SLJIT_MEM1(SLJIT_R0), 0x7fff7ffe);
1925 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, (sljit_sw)&bbuf + 0x7fff7fff + 5 * sizeof(sljit_s8));
1926 sljit_emit_op1(compiler, SLJIT_MOV_S8, SLJIT_MEM1(SLJIT_R0), -0x7fff7fff, SLJIT_MEM1(SLJIT_R0), -0x7fff8000);
1927 #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
1928 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, (sljit_sw)&bbuf - SLJIT_W(0x123456123456));
1929 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, (sljit_sw)&bbuf - SLJIT_W(0x123456123456));
1930 sljit_emit_op1(compiler, SLJIT_MOV_S8, SLJIT_MEM1(SLJIT_R0), SLJIT_W(0x123456123456) + 6 * sizeof(sljit_s8), SLJIT_MEM1(SLJIT_R1), SLJIT_W(0x123456123456));
1931 #endif
1932
1933 sljit_emit_return(compiler, SLJIT_UNUSED, 0, 0);
1934
1935 code.code = sljit_generate_code(compiler);
1936 CHECK(compiler);
1937 sljit_free_compiler(compiler);
1938
1939 code.func3((sljit_sw)&buf, (sljit_sw)&sbuf, (sljit_sw)&bbuf);
1940 FAILED(buf[2] != 176366, "test24 case 1 failed\n");
1941 FAILED(buf[3] != 64, "test24 case 2 failed\n");
1942 FAILED(buf[4] != -100, "test24 case 3 failed\n");
1943 FAILED(buf[5] != -100 + (sljit_sw)&buf[5] + (sljit_sw)&buf[4], "test24 case 4 failed\n");
1944 FAILED(buf[6] != 952467, "test24 case 5 failed\n");
1945 FAILED(buf[7] != 952467, "test24 case 6 failed\n");
1946 FAILED(buf[8] != 952467 * 2, "test24 case 7 failed\n");
1947
1948 FAILED(sbuf[1] != 30000, "test24 case 8 failed\n");
1949 FAILED(sbuf[2] != -12345, "test24 case 9 failed\n");
1950 FAILED(sbuf[4] != sizeof(sljit_s16), "test24 case 10 failed\n");
1951
1952 FAILED(bbuf[1] != -128, "test24 case 11 failed\n");
1953 FAILED(bbuf[2] != 99, "test24 case 12 failed\n");
1954 FAILED(bbuf[4] != 99, "test24 case 13 failed\n");
1955 FAILED(bbuf[5] != 99, "test24 case 14 failed\n");
1956 #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
1957 FAILED(bbuf[6] != -128, "test24 case 15 failed\n");
1958 #endif
1959
1960 sljit_free_code(code.code);
1961 successful_tests++;
1962 }
1963
1964 static void test25(void)
1965 {
1966 #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
1967 /* 64 bit loads. */
1968 executable_code code;
1969 struct sljit_compiler* compiler = sljit_create_compiler(NULL);
1970 sljit_sw buf[14];
1971
1972 if (verbose)
1973 printf("Run test25\n");
1974
1975 FAILED(!compiler, "cannot create compiler\n");
1976 buf[0] = 7;
1977 buf[1] = 0;
1978 buf[2] = 0;
1979 buf[3] = 0;
1980 buf[4] = 0;
1981 buf[5] = 0;
1982 buf[6] = 0;
1983 buf[7] = 0;
1984 buf[8] = 0;
1985 buf[9] = 0;
1986 buf[10] = 0;
1987 buf[11] = 0;
1988 buf[12] = 0;
1989 buf[13] = 0;
1990
1991 sljit_emit_enter(compiler, 0, 1, 3, 1, 0, 0, 0);
1992
1993 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_IMM, 0);
1994 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 1 * sizeof(sljit_sw), SLJIT_IMM, 0x7fff);
1995 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 2 * sizeof(sljit_sw), SLJIT_IMM, -0x8000);
1996 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 3 * sizeof(sljit_sw), SLJIT_IMM, 0x7fffffff);
1997 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 4 * sizeof(sljit_sw), SLJIT_IMM, SLJIT_W(-0x80000000));
1998 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 5 * sizeof(sljit_sw), SLJIT_IMM, SLJIT_W(0x1234567887654321));
1999 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 6 * sizeof(sljit_sw), SLJIT_IMM, SLJIT_W(0xff80000000));
2000 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 7 * sizeof(sljit_sw), SLJIT_IMM, SLJIT_W(0x3ff0000000));
2001 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 8 * sizeof(sljit_sw), SLJIT_IMM, SLJIT_W(0xfffffff800100000));
2002 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 9 * sizeof(sljit_sw), SLJIT_IMM, SLJIT_W(0xfffffff80010f000));
2003 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 10 * sizeof(sljit_sw), SLJIT_IMM, SLJIT_W(0x07fff00000008001));
2004 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 11 * sizeof(sljit_sw), SLJIT_IMM, SLJIT_W(0x07fff00080010000));
2005 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 12 * sizeof(sljit_sw), SLJIT_IMM, SLJIT_W(0x07fff00080018001));
2006 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 13 * sizeof(sljit_sw), SLJIT_IMM, SLJIT_W(0x07fff00ffff00000));
2007
2008 sljit_emit_return(compiler, SLJIT_UNUSED, 0, 0);
2009
2010 code.code = sljit_generate_code(compiler);
2011 CHECK(compiler);
2012 sljit_free_compiler(compiler);
2013
2014 code.func1((sljit_sw)&buf);
2015 FAILED(buf[0] != 0, "test25 case 1 failed\n");
2016 FAILED(buf[1] != 0x7fff, "test25 case 2 failed\n");
2017 FAILED(buf[2] != -0x8000, "test25 case 3 failed\n");
2018 FAILED(buf[3] != 0x7fffffff, "test25 case 4 failed\n");
2019 FAILED(buf[4] != SLJIT_W(-0x80000000), "test25 case 5 failed\n");
2020 FAILED(buf[5] != SLJIT_W(0x1234567887654321), "test25 case 6 failed\n");
2021 FAILED(buf[6] != SLJIT_W(0xff80000000), "test25 case 7 failed\n");
2022 FAILED(buf[7] != SLJIT_W(0x3ff0000000), "test25 case 8 failed\n");
2023 FAILED((sljit_uw)buf[8] != SLJIT_W(0xfffffff800100000), "test25 case 9 failed\n");
2024 FAILED((sljit_uw)buf[9] != SLJIT_W(0xfffffff80010f000), "test25 case 10 failed\n");
2025 FAILED(buf[10] != SLJIT_W(0x07fff00000008001), "test25 case 11 failed\n");
2026 FAILED(buf[11] != SLJIT_W(0x07fff00080010000), "test25 case 12 failed\n");
2027 FAILED(buf[12] != SLJIT_W(0x07fff00080018001), "test25 case 13 failed\n");
2028 FAILED(buf[13] != SLJIT_W(0x07fff00ffff00000), "test25 case 14 failed\n");
2029
2030 sljit_free_code(code.code);
2031 #endif
2032 successful_tests++;
2033 }
2034
2035 static void test26(void)
2036 {
2037 /* Aligned access without aligned offsets. */
2038 executable_code code;
2039 struct sljit_compiler* compiler = sljit_create_compiler(NULL);
2040 sljit_sw buf[4];
2041 sljit_s32 ibuf[4];
2042 sljit_f64 dbuf[4];
2043
2044 if (verbose)
2045 printf("Run test26\n");
2046
2047 FAILED(!compiler, "cannot create compiler\n");
2048
2049 buf[0] = -2789;
2050 buf[1] = 0;
2051 buf[2] = 4;
2052 buf[3] = -4;
2053
2054 ibuf[0] = -689;
2055 ibuf[1] = 0;
2056 ibuf[2] = -6;
2057 ibuf[3] = 3;
2058
2059 dbuf[0] = 5.75;
2060 dbuf[1] = 0.0;
2061 dbuf[2] = 0.0;
2062 dbuf[3] = -4.0;
2063
2064 sljit_emit_enter(compiler, 0, 3, 3, 3, 0, 0, 0);
2065
2066 sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_S0, 0, SLJIT_S0, 0, SLJIT_IMM, 3);
2067 sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_S1, 0, SLJIT_S1, 0, SLJIT_IMM, 1);
2068 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_MEM1(SLJIT_S0), -3);
2069 sljit_emit_op1(compiler, SLJIT_MOV_S32, SLJIT_MEM1(SLJIT_S1), sizeof(sljit_s32) - 1, SLJIT_R0, 0);
2070 sljit_emit_op1(compiler, SLJIT_MOV_S32, SLJIT_R0, 0, SLJIT_MEM1(SLJIT_S1), -1);
2071 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) - 3, SLJIT_R0, 0);
2072
2073 sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R0, 0, SLJIT_S0, 0, SLJIT_IMM, 100);
2074 sljit_emit_op2(compiler, SLJIT_MUL, SLJIT_MEM1(SLJIT_R0), sizeof(sljit_sw) * 2 - 103, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 2 - 3, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 3 - 3);
2075 sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R0, 0, SLJIT_S1, 0, SLJIT_IMM, 100);
2076 sljit_emit_op2(compiler, SLJIT_MUL32, SLJIT_MEM1(SLJIT_R0), sizeof(sljit_s32) * 2 - 101, SLJIT_MEM1(SLJIT_S1), sizeof(sljit_s32) * 2 - 1, SLJIT_MEM1(SLJIT_S1), sizeof(sljit_s32) * 3 - 1);
2077
2078 if (sljit_is_fpu_available()) {
2079 sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_S2, 0, SLJIT_S2, 0, SLJIT_IMM, 3);
2080 sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S2), sizeof(sljit_f64) - 3, SLJIT_MEM1(SLJIT_S2), -3);
2081 sljit_emit_fop2(compiler, SLJIT_ADD_F64, SLJIT_MEM1(SLJIT_S2), sizeof(sljit_f64) * 2 - 3, SLJIT_MEM1(SLJIT_S2), -3, SLJIT_MEM1(SLJIT_S2), sizeof(sljit_f64) - 3);
2082 sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R0, 0, SLJIT_S2, 0, SLJIT_IMM, 2);
2083 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, (sizeof(sljit_f64) * 3 - 4) >> 1);
2084 sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R2, 0, SLJIT_S2, 0, SLJIT_IMM, 1);
2085 sljit_emit_fop2(compiler, SLJIT_DIV_F64, SLJIT_MEM1(SLJIT_R0), sizeof(sljit_f64) * 3 - 5, SLJIT_MEM1(SLJIT_S2), sizeof(sljit_f64) * 2 - 3, SLJIT_MEM2(SLJIT_R2, SLJIT_R1), 1);
2086 }
2087
2088 sljit_emit_return(compiler, SLJIT_UNUSED, 0, 0);
2089
2090 code.code = sljit_generate_code(compiler);
2091 CHECK(compiler);
2092 sljit_free_compiler(compiler);
2093
2094 code.func3((sljit_sw)&buf, (sljit_sw)&ibuf, (sljit_sw)&dbuf);
2095
2096 FAILED(buf[1] != -689, "test26 case 1 failed\n");
2097 FAILED(buf[2] != -16, "test26 case 2 failed\n");
2098 FAILED(ibuf[1] != -2789, "test26 case 3 failed\n");
2099 FAILED(ibuf[2] != -18, "test26 case 4 failed\n");
2100
2101 if (sljit_is_fpu_available()) {
2102 FAILED(dbuf[1] != 5.75, "test26 case 5 failed\n");
2103 FAILED(dbuf[2] != 11.5, "test26 case 6 failed\n");
2104 FAILED(dbuf[3] != -2.875, "test26 case 7 failed\n");
2105 }
2106
2107 sljit_free_code(code.code);
2108 successful_tests++;
2109 }
2110
2111 static void test27(void)
2112 {
2113 #define SET_NEXT_BYTE(type) \
2114 cond_set(compiler, SLJIT_R2, 0, type); \
2115 sljit_emit_op1(compiler, SLJIT_MOVU_U8, SLJIT_MEM1(SLJIT_S0), 1, SLJIT_R2, 0);
2116 #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
2117 #define RESULT(i) i
2118 #else
2119 #define RESULT(i) (3 - i)
2120 #endif
2121
2122 /* Playing with conditional flags. */
2123 executable_code code;
2124 struct sljit_compiler* compiler = sljit_create_compiler(NULL);
2125 sljit_s8 buf[37];
2126 sljit_s32 i;
2127
2128 if (verbose)
2129 printf("Run test27\n");
2130
2131 for (i = 0; i < 37; ++i)
2132 buf[i] = 10;
2133
2134 FAILED(!compiler, "cannot create compiler\n");
2135
2136 /* 3 arguments passed, 3 arguments used. */
2137 sljit_emit_enter(compiler, 0, 1, 3, 3, 0, 0, 0);
2138
2139 sljit_emit_op2(compiler, SLJIT_SUB, SLJIT_S0, 0, SLJIT_S0, 0, SLJIT_IMM, 1);
2140
2141 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 0x1001);
2142 sljit_emit_op2(compiler, SLJIT_SHL, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_IMM, 20);
2143 /* 0x100100000 on 64 bit machines, 0x100000 on 32 bit machines. */
2144 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 0x800000);
2145 sljit_emit_op2(compiler, SLJIT_SUB | SLJIT_SET_U, SLJIT_UNUSED, 0, SLJIT_R0, 0, SLJIT_R1, 0);
2146 sljit_emit_op0(compiler, SLJIT_NOP); /* Nop should keep the flags. */
2147 SET_NEXT_BYTE(SLJIT_GREATER);
2148 SET_NEXT_BYTE(SLJIT_LESS);
2149 sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R0, 0, SLJIT_R0, 0);
2150 sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R1, 0, SLJIT_R1, 0);
2151 sljit_emit_op2(compiler, SLJIT_SUB32 | SLJIT_SET_U, SLJIT_UNUSED, 0, SLJIT_R0, 0, SLJIT_R1, 0);
2152 sljit_emit_op0(compiler, SLJIT_NOP); /* Nop should keep the flags. */
2153 SET_NEXT_BYTE(SLJIT_GREATER32);
2154 SET_NEXT_BYTE(SLJIT_LESS32);
2155
2156 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 0x1000);
2157 sljit_emit_op2(compiler, SLJIT_SHL, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_IMM, 20);
2158 sljit_emit_op2(compiler, SLJIT_OR, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_IMM, 0x10);
2159 /* 0x100000010 on 64 bit machines, 0x10 on 32 bit machines. */
2160 sljit_emit_op2(compiler, SLJIT_SUB | SLJIT_SET_U, SLJIT_UNUSED, 0, SLJIT_R0, 0, SLJIT_IMM, 0x80);
2161 SET_NEXT_BYTE(SLJIT_GREATER);
2162 SET_NEXT_BYTE(SLJIT_LESS);
2163 sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R0, 0, SLJIT_R0, 0);
2164 sljit_emit_op2(compiler, SLJIT_SUB32 | SLJIT_SET_U, SLJIT_UNUSED, 0, SLJIT_R0, 0, SLJIT_IMM, 0x80);
2165 SET_NEXT_BYTE(SLJIT_GREATER32);
2166 SET_NEXT_BYTE(SLJIT_LESS32);
2167
2168 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 0);
2169 sljit_emit_op2(compiler, SLJIT_SUB, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_IMM, 1);
2170 /* 0xff..ff on all machines. */
2171 sljit_emit_op2(compiler, SLJIT_SUB | SLJIT_SET_U, SLJIT_R1, 0, SLJIT_R0, 0, SLJIT_IMM, 1);
2172 SET_NEXT_BYTE(SLJIT_LESS_EQUAL);
2173 SET_NEXT_BYTE(SLJIT_GREATER_EQUAL);
2174 sljit_emit_op2(compiler, SLJIT_SUB | SLJIT_SET_S, SLJIT_R1, 0, SLJIT_R1, 0, SLJIT_IMM, -1);
2175 SET_NEXT_BYTE(SLJIT_SIG_GREATER);
2176 SET_NEXT_BYTE(SLJIT_SIG_LESS);
2177 sljit_emit_op2(compiler, SLJIT_SUB | SLJIT_SET_E, SLJIT_R0, 0, SLJIT_R1, 0, SLJIT_R0, 0);
2178 SET_NEXT_BYTE(SLJIT_EQUAL);
2179 SET_NEXT_BYTE(SLJIT_NOT_EQUAL);
2180 sljit_emit_op2(compiler, SLJIT_SUB | SLJIT_SET_O | SLJIT_SET_U, SLJIT_R1, 0, SLJIT_R1, 0, SLJIT_IMM, -2);
2181 SET_NEXT_BYTE(SLJIT_OVERFLOW);
2182 SET_NEXT_BYTE(SLJIT_NOT_OVERFLOW);
2183 SET_NEXT_BYTE(SLJIT_GREATER_EQUAL);
2184 SET_NEXT_BYTE(SLJIT_LESS_EQUAL);
2185
2186 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 0x80000000);
2187 sljit_emit_op2(compiler, SLJIT_SHL, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_IMM, 16);
2188 sljit_emit_op2(compiler, SLJIT_SHL, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_IMM, 16);
2189 /* 0x80..0 on 64 bit machines, 0 on 32 bit machines. */
2190 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 0xffffffff);
2191 sljit_emit_op2(compiler, SLJIT_SUB | SLJIT_SET_O, SLJIT_UNUSED, 0, SLJIT_R0, 0, SLJIT_R1, 0);
2192 SET_NEXT_BYTE(SLJIT_OVERFLOW);
2193 SET_NEXT_BYTE(SLJIT_NOT_OVERFLOW);
2194 sljit_emit_op1(compiler, SLJIT_MOV_S32, SLJIT_R0, 0, SLJIT_R0, 0);
2195 sljit_emit_op1(compiler, SLJIT_MOV_U32, SLJIT_R1, 0, SLJIT_R1, 0);
2196 sljit_emit_op2(compiler, SLJIT_SUB32 | SLJIT_SET_O, SLJIT_UNUSED, 0, SLJIT_R0, 0, SLJIT_R1, 0);
2197 SET_NEXT_BYTE(SLJIT_OVERFLOW32);
2198 SET_NEXT_BYTE(SLJIT_NOT_OVERFLOW32);
2199
2200 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 0);
2201 sljit_emit_op2(compiler, SLJIT_SUB | SLJIT_SET_C, SLJIT_UNUSED, 0, SLJIT_R0, 0, SLJIT_IMM, 1);
2202 sljit_emit_op2(compiler, SLJIT_SUBC | SLJIT_SET_C, SLJIT_UNUSED, 0, SLJIT_R0, 0, SLJIT_IMM, 0);
2203 sljit_emit_op2(compiler, SLJIT_SUBC, SLJIT_R0, 0, SLJIT_IMM, 6, SLJIT_R0, 0);
2204 sljit_emit_op1(compiler, SLJIT_MOVU_U8, SLJIT_MEM1(SLJIT_S0), 1, SLJIT_R0, 0);
2205
2206 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, -1);
2207 sljit_emit_op2(compiler, SLJIT_ADD | SLJIT_SET_C, SLJIT_UNUSED, 0, SLJIT_R0, 0, SLJIT_IMM, 1);
2208 sljit_emit_op2(compiler, SLJIT_ADDC | SLJIT_SET_C, SLJIT_UNUSED, 0, SLJIT_R0, 0, SLJIT_IMM, 1);
2209 sljit_emit_op2(compiler, SLJIT_ADDC, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_IMM, 9);
2210 sljit_emit_op1(compiler, SLJIT_MOVU_U8, SLJIT_MEM1(SLJIT_S0), 1, SLJIT_R0, 0);
2211
2212 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 1);
2213 sljit_emit_op2(compiler, SLJIT_SHL, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_IMM, (8 * sizeof(sljit_sw)) - 1);
2214 sljit_emit_op2(compiler, SLJIT_ADD | SLJIT_SET_E, SLJIT_UNUSED, 0, SLJIT_R0, 0, SLJIT_IMM, 0);
2215 SET_NEXT_BYTE(SLJIT_EQUAL);
2216 sljit_emit_op2(compiler, SLJIT_ADD | SLJIT_SET_E, SLJIT_UNUSED, 0, SLJIT_R0, 0, SLJIT_R0, 0);
2217 SET_NEXT_BYTE(SLJIT_EQUAL);
2218
2219 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 0);
2220 sljit_emit_op2(compiler, SLJIT_ASHR | SLJIT_SET_E, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_IMM, 0);
2221 SET_NEXT_BYTE(SLJIT_EQUAL);
2222 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 1);
2223 sljit_emit_op2(compiler, SLJIT_LSHR | SLJIT_SET_E, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_IMM, 0xffffc0);
2224 SET_NEXT_BYTE(SLJIT_NOT_EQUAL);
2225 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_PREF_SHIFT_REG, 0, SLJIT_IMM, 0);
2226 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 0);
2227 sljit_emit_op2(compiler, SLJIT_ASHR | SLJIT_SET_E, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_PREF_SHIFT_REG, 0);
2228 SET_NEXT_BYTE(SLJIT_EQUAL);
2229 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_PREF_SHIFT_REG, 0, SLJIT_IMM, 0);
2230 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 1);
2231 sljit_emit_op2(compiler, SLJIT_LSHR | SLJIT_SET_E, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_PREF_SHIFT_REG, 0);
2232 SET_NEXT_BYTE(SLJIT_NOT_EQUAL);
2233
2234 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 0);
2235 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 1);
2236 sljit_emit_op2(compiler, SLJIT_SUB | SLJIT_SET_C, SLJIT_UNUSED, 0, SLJIT_R0, 0, SLJIT_R0, 0);
2237 sljit_emit_op2(compiler, SLJIT_SUBC, SLJIT_R2, 0, SLJIT_IMM, 1, SLJIT_R0, 0);
2238 sljit_emit_op1(compiler, SLJIT_MOVU_U8, SLJIT_MEM1(SLJIT_S0), 1, SLJIT_R2, 0);
2239 sljit_emit_op2(compiler, SLJIT_SUBC | SLJIT_SET_C, SLJIT_UNUSED, 0, SLJIT_R0, 0, SLJIT_R1, 0);
2240 sljit_emit_op2(compiler, SLJIT_SUBC, SLJIT_R2, 0, SLJIT_IMM, 1, SLJIT_R0, 0);
2241 sljit_emit_op1(compiler, SLJIT_MOVU_U8, SLJIT_MEM1(SLJIT_S0), 1, SLJIT_R2, 0);
2242
2243 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, -34);
2244 sljit_emit_op2(compiler, SLJIT_SUB | SLJIT_SET_S | SLJIT_SET_U, SLJIT_UNUSED, 0, SLJIT_R0, 0, SLJIT_IMM, 0x1234);
2245 SET_NEXT_BYTE(SLJIT_LESS);
2246 SET_NEXT_BYTE(SLJIT_SIG_LESS);
2247 #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
2248 sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R0, 0, SLJIT_IMM, SLJIT_W(0x12300000000) - 43);
2249 #else
2250 sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R0, 0, SLJIT_IMM, -43);
2251 #endif
2252 sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R1, 0, SLJIT_IMM, -96);
2253 sljit_emit_op2(compiler, SLJIT_SUB32 | SLJIT_SET_S | SLJIT_SET_U, SLJIT_UNUSED, 0, SLJIT_R0, 0, SLJIT_R1, 0);
2254 SET_NEXT_BYTE(SLJIT_LESS32);
2255 SET_NEXT_BYTE(SLJIT_SIG_GREATER32);
2256
2257 sljit_emit_return(compiler, SLJIT_UNUSED, 0, 0);
2258
2259 code.code = sljit_generate_code(compiler);
2260 CHECK(compiler);
2261 sljit_free_compiler(compiler);
2262
2263 code.func1((sljit_sw)&buf);
2264
2265 FAILED(buf[0] != RESULT(1), "test27 case 1 failed\n");
2266 FAILED(buf[1] != RESULT(2), "test27 case 2 failed\n");
2267 FAILED(buf[2] != 2, "test27 case 3 failed\n");
2268 FAILED(buf[3] != 1, "test27 case 4 failed\n");
2269 FAILED(buf[4] != RESULT(1), "test27 case 5 failed\n");
2270 FAILED(buf[5] != RESULT(2), "test27 case 6 failed\n");
2271 FAILED(buf[6] != 2, "test27 case 7 failed\n");
2272 FAILED(buf[7] != 1, "test27 case 8 failed\n");
2273
2274 FAILED(buf[8] != 2, "test27 case 9 failed\n");
2275 FAILED(buf[9] != 1, "test27 case 10 failed\n");
2276 FAILED(buf[10] != 2, "test27 case 11 failed\n");
2277 FAILED(buf[11] != 1, "test27 case 12 failed\n");
2278 FAILED(buf[12] != 1, "test27 case 13 failed\n");
2279 FAILED(buf[13] != 2, "test27 case 14 failed\n");
2280 FAILED(buf[14] != 2, "test27 case 15 failed\n");
2281 FAILED(buf[15] != 1, "test27 case 16 failed\n");
2282 FAILED(buf[16] != 1, "test27 case 17 failed\n");
2283 FAILED(buf[17] != 2, "test27 case 18 failed\n");
2284
2285 FAILED(buf[18] != RESULT(1), "test27 case 19 failed\n");
2286 FAILED(buf[19] != RESULT(2), "test27 case 20 failed\n");
2287 FAILED(buf[20] != 2, "test27 case 21 failed\n");
2288 FAILED(buf[21] != 1, "test27 case 22 failed\n");
2289
2290 FAILED(buf[22] != 5, "test27 case 23 failed\n");
2291 FAILED(buf[23] != 9, "test27 case 24 failed\n");
2292
2293 FAILED(buf[24] != 2, "test27 case 25 failed\n");
2294 FAILED(buf[25] != 1, "test27 case 26 failed\n");
2295
2296 FAILED(buf[26] != 1, "test27 case 27 failed\n");
2297 FAILED(buf[27] != 1, "test27 case 28 failed\n");
2298 FAILED(buf[28] != 1, "test27 case 29 failed\n");
2299 FAILED(buf[29] != 1, "test27 case 30 failed\n");
2300
2301 FAILED(buf[30] != 1, "test27 case 31 failed\n");
2302 FAILED(buf[31] != 0, "test27 case 32 failed\n");
2303
2304 FAILED(buf[32] != 2, "test27 case 33 failed\n");
2305 FAILED(buf[33] != 1, "test27 case 34 failed\n");
2306 FAILED(buf[34] != 2, "test27 case 35 failed\n");
2307 FAILED(buf[35] != 1, "test27 case 36 failed\n");
2308 FAILED(buf[36] != 10, "test27 case 37 failed\n");
2309
2310 sljit_free_code(code.code);
2311 successful_tests++;
2312 #undef SET_NEXT_BYTE
2313 #undef RESULT
2314 }
2315
2316 static void test28(void)
2317 {
2318 /* Test mov. */
2319 executable_code code;
2320 struct sljit_compiler* compiler = sljit_create_compiler(NULL);
2321 struct sljit_const* const1;
2322 struct sljit_label* label;
2323 sljit_uw label_addr;
2324 sljit_sw buf[5];
2325
2326 if (verbose)
2327 printf("Run test28\n");
2328
2329 FAILED(!compiler, "cannot create compiler\n");
2330
2331 buf[0] = -36;
2332 buf[1] = 8;
2333 buf[2] = 0;
2334 buf[3] = 10;
2335 buf[4] = 0;
2336
2337 FAILED(!compiler, "cannot create compiler\n");
2338 sljit_emit_enter(compiler, 0, 1, 5, 5, 0, 0, 0);
2339 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R3, 0, SLJIT_IMM, -234);
2340 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R4, 0, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw));
2341 sljit_emit_op2(compiler, SLJIT_MUL, SLJIT_S3, 0, SLJIT_R3, 0, SLJIT_R4, 0);
2342 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw), SLJIT_S3, 0);
2343 sljit_emit_op2(compiler, SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, SLJIT_S3, 0, SLJIT_IMM, 0);
2344 sljit_emit_op_flags(compiler, SLJIT_MOV, SLJIT_S3, 0, SLJIT_UNUSED, 0, SLJIT_NOT_ZERO);
2345 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 2 * sizeof(sljit_sw), SLJIT_S3, 0);
2346 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S4, 0, SLJIT_MEM1(SLJIT_S0), 3 * sizeof(sljit_sw));
2347 sljit_emit_op2(compiler, SLJIT_SUB, SLJIT_S4, 0, SLJIT_S4, 0, SLJIT_R4, 0);
2348 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 3 * sizeof(sljit_sw), SLJIT_S4, 0);
2349 const1 = sljit_emit_const(compiler, SLJIT_S3, 0, 0);
2350 sljit_emit_ijump(compiler, SLJIT_JUMP, SLJIT_S3, 0);
2351 sljit_emit_op2(compiler, SLJIT_SUB, SLJIT_S3, 0, SLJIT_S3, 0, SLJIT_IMM, 100);
2352 label = sljit_emit_label(compiler);
2353 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 4 * sizeof(sljit_sw), SLJIT_S3, 0);
2354 sljit_emit_return(compiler, SLJIT_MOV, SLJIT_R4, 0);
2355
2356 code.code = sljit_generate_code(compiler);
2357 CHECK(compiler);
2358 label_addr = sljit_get_label_addr(label);
2359 sljit_set_const(sljit_get_const_addr(const1), label_addr);
2360 sljit_free_compiler(compiler);
2361
2362 FAILED(code.func1((sljit_sw)&buf) != 8, "test28 case 1 failed\n");
2363 FAILED(buf[1] != -1872, "test28 case 2 failed\n");
2364 FAILED(buf[2] != 1, "test28 case 3 failed\n");
2365 FAILED(buf[3] != 2, "test28 case 4 failed\n");
2366 FAILED(buf[4] != label_addr, "test28 case 5 failed\n");
2367
2368 sljit_free_code(code.code);
2369 successful_tests++;
2370 }
2371
2372 static void test29(void)
2373 {
2374 /* Test signed/unsigned bytes and halfs. */
2375 executable_code code;
2376 struct sljit_compiler* compiler = sljit_create_compiler(NULL);
2377 sljit_sw buf[25];
2378
2379 if (verbose)
2380 printf("Run test29\n");
2381
2382 buf[0] = 0;
2383 buf[1] = 0;
2384 buf[2] = 0;
2385 buf[3] = 0;
2386 buf[4] = 0;
2387 buf[5] = 0;
2388 buf[6] = 0;
2389 buf[7] = 0;
2390 buf[8] = 0;
2391 buf[9] = 0;
2392 buf[10] = 0;
2393 buf[11] = 0;
2394 buf[12] = 0;
2395 buf[13] = 0;
2396 buf[14] = 0;
2397 buf[15] = 0;
2398 buf[16] = 0;
2399 buf[17] = 0;
2400 buf[18] = 0;
2401 buf[19] = 0;
2402 buf[20] = 0;
2403 buf[21] = 0;
2404 buf[22] = 0;
2405 buf[23] = 0;
2406 buf[24] = 0;
2407
2408 FAILED(!compiler, "cannot create compiler\n");
2409 sljit_emit_enter(compiler, 0, 1, 5, 5, 0, 0, 0);
2410
2411 sljit_emit_op1(compiler, SLJIT_MOV_S8, SLJIT_R0, 0, SLJIT_IMM, -187);
2412 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_R0, 0);
2413 sljit_emit_op1(compiler, SLJIT_MOVU_S8, SLJIT_R0, 0, SLJIT_IMM, -605);
2414 sljit_emit_op1(compiler, SLJIT_MOVU, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_uw), SLJIT_R0, 0);
2415 sljit_emit_op1(compiler, SLJIT_MOV_U8, SLJIT_R0, 0, SLJIT_IMM, -56);
2416 sljit_emit_op1(compiler, SLJIT_MOVU, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_uw), SLJIT_R0, 0);
2417 sljit_emit_op1(compiler, SLJIT_MOVU_U8, SLJIT_R4, 0, SLJIT_IMM, 0xcde5);
2418 sljit_emit_op1(compiler, SLJIT_MOVU, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_uw), SLJIT_R4, 0);
2419
2420 sljit_emit_op1(compiler, SLJIT_MOV_S16, SLJIT_R0, 0, SLJIT_IMM, -45896);
2421 sljit_emit_op1(compiler, SLJIT_MOVU, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_uw), SLJIT_R0, 0);
2422 sljit_emit_op1(compiler, SLJIT_MOVU_S16, SLJIT_R0, 0, SLJIT_IMM, -1472797);
2423 sljit_emit_op1(compiler, SLJIT_MOVU, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_uw), SLJIT_R0, 0);
2424 sljit_emit_op1(compiler, SLJIT_MOV_U16, SLJIT_R0, 0, SLJIT_IMM, -12890);
2425 sljit_emit_op1(compiler, SLJIT_MOVU, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_uw), SLJIT_R0, 0);
2426 sljit_emit_op1(compiler, SLJIT_MOVU_U16, SLJIT_R4, 0, SLJIT_IMM, 0x9cb0a6);
2427 sljit_emit_op1(compiler, SLJIT_MOVU, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_uw), SLJIT_R4, 0);
2428
2429 #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
2430 sljit_emit_op1(compiler, SLJIT_MOV_S32, SLJIT_R0, 0, SLJIT_IMM, SLJIT_W(-3580429715));
2431 sljit_emit_op1(compiler, SLJIT_MOVU, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_uw), SLJIT_R0, 0);
2432 sljit_emit_op1(compiler, SLJIT_MOVU_S32, SLJIT_R0, 0, SLJIT_IMM, SLJIT_W(-100722768662));
2433 sljit_emit_op1(compiler, SLJIT_MOVU, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_uw), SLJIT_R0, 0);
2434 sljit_emit_op1(compiler, SLJIT_MOV_U32, SLJIT_R0, 0, SLJIT_IMM, SLJIT_W(-1457052677972));
2435 sljit_emit_op1(compiler, SLJIT_MOVU, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_uw), SLJIT_R0, 0);
2436 sljit_emit_op1(compiler, SLJIT_MOVU_U32, SLJIT_R4, 0, SLJIT_IMM, SLJIT_W(0xcef97a70b5));
2437 sljit_emit_op1(compiler, SLJIT_MOVU, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_uw), SLJIT_R4, 0);
2438 #else
2439 sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_S0, 0, SLJIT_S0, 0, SLJIT_IMM, 4 * sizeof(sljit_uw));
2440 #endif
2441
2442 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, -187);
2443 sljit_emit_op1(compiler, SLJIT_MOV_S8, SLJIT_R0, 0, SLJIT_R1, 0);
2444 sljit_emit_op1(compiler, SLJIT_MOVU, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_uw), SLJIT_R0, 0);
2445 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S2, 0, SLJIT_IMM, -605);
2446 sljit_emit_op1(compiler, SLJIT_MOVU_S8, SLJIT_R0, 0, SLJIT_S2, 0);
2447 sljit_emit_op1(compiler, SLJIT_MOVU, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_uw), SLJIT_R0, 0);
2448 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, -56);
2449 sljit_emit_op1(compiler, SLJIT_MOV_U8, SLJIT_R0, 0, SLJIT_R2, 0);
2450 sljit_emit_op1(compiler, SLJIT_MOVU, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_uw), SLJIT_R0, 0);
2451 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R3, 0, SLJIT_IMM, 0xcde5);
2452 sljit_emit_op1(compiler, SLJIT_MOVU_U8, SLJIT_R4, 0, SLJIT_R3, 0);
2453 sljit_emit_op1(compiler, SLJIT_MOVU, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_uw), SLJIT_R4, 0);
2454
2455 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, -45896);
2456 sljit_emit_op1(compiler, SLJIT_MOV_S16, SLJIT_R0, 0, SLJIT_R1, 0);
2457 sljit_emit_op1(compiler, SLJIT_MOVU, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_uw), SLJIT_R0, 0);
2458 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S2, 0, SLJIT_IMM, -1472797);
2459 sljit_emit_op1(compiler, SLJIT_MOVU_S16, SLJIT_R0, 0, SLJIT_S2, 0);
2460 sljit_emit_op1(compiler, SLJIT_MOVU, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_uw), SLJIT_R0, 0);
2461 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, -12890);
2462 sljit_emit_op1(compiler, SLJIT_MOV_U16, SLJIT_R0, 0, SLJIT_R2, 0);
2463 sljit_emit_op1(compiler, SLJIT_MOVU, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_uw), SLJIT_R0, 0);
2464 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R3, 0, SLJIT_IMM, 0x9cb0a6);
2465 sljit_emit_op1(compiler, SLJIT_MOVU_U16, SLJIT_R4, 0, SLJIT_R3, 0);
2466 sljit_emit_op1(compiler, SLJIT_MOVU, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_uw), SLJIT_R4, 0);
2467
2468 #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
2469 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, SLJIT_W(-3580429715));
2470 sljit_emit_op1(compiler, SLJIT_MOV_S32, SLJIT_R0, 0, SLJIT_R1, 0);
2471 sljit_emit_op1(compiler, SLJIT_MOVU, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_uw), SLJIT_R0, 0);
2472 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S2, 0, SLJIT_IMM, SLJIT_W(-100722768662));
2473 sljit_emit_op1(compiler, SLJIT_MOVU_S32, SLJIT_R0, 0, SLJIT_S2, 0);
2474 sljit_emit_op1(compiler, SLJIT_MOVU, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_uw), SLJIT_R0, 0);
2475 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, SLJIT_W(-1457052677972));
2476 sljit_emit_op1(compiler, SLJIT_MOV_U32, SLJIT_R0, 0, SLJIT_R2, 0);
2477 sljit_emit_op1(compiler, SLJIT_MOVU, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_uw), SLJIT_R0, 0);
2478 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R3, 0, SLJIT_IMM, SLJIT_W(0xcef97a70b5));
2479 sljit_emit_op1(compiler, SLJIT_MOVU_U32, SLJIT_R4, 0, SLJIT_R3, 0);
2480 sljit_emit_op1(compiler, SLJIT_MOVU, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_uw), SLJIT_R4, 0);
2481 #else
2482 sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_S0, 0, SLJIT_S0, 0, SLJIT_IMM, 4 * sizeof(sljit_uw));
2483 #endif
2484
2485 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S2, 0, SLJIT_IMM, 0x9faa5);
2486 sljit_emit_op1(compiler, SLJIT_MOV_S8, SLJIT_S2, 0, SLJIT_S2, 0);
2487 sljit_emit_op1(compiler, SLJIT_MOVU, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_uw), SLJIT_S2, 0);
2488
2489 sljit_emit_return(compiler, SLJIT_UNUSED, 0, 0);
2490
2491 code.code = sljit_generate_code(compiler);
2492 CHECK(compiler);
2493 sljit_free_compiler(compiler);
2494
2495 code.func1((sljit_sw)&buf);
2496 FAILED(buf[0] != 69, "test29 case 1 failed\n");
2497 FAILED(buf[1] != -93, "test29 case 2 failed\n");
2498 FAILED(buf[2] != 200, "test29 case 3 failed\n");
2499 FAILED(buf[3] != 0xe5, "test29 case 4 failed\n");
2500 FAILED(buf[4] != 19640, "test29 case 5 failed\n");
2501 FAILED(buf[5] != -31005, "test29 case 6 failed\n");
2502 FAILED(buf[6] != 52646, "test29 case 7 failed\n");
2503 FAILED(buf[7] != 0xb0a6, "test29 case 8 failed\n");
2504
2505 #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
2506 FAILED(buf[8] != SLJIT_W(714537581), "test29 case 9 failed\n");
2507 FAILED(buf[9] != SLJIT_W(-1938520854), "test29 case 10 failed\n");
2508 FAILED(buf[10] != SLJIT_W(3236202668), "test29 case 11 failed\n");
2509 FAILED(buf[11] != SLJIT_W(0xf97a70b5), "test29 case 12 failed\n");
2510 #endif
2511
2512 FAILED(buf[12] != 69, "test29 case 13 failed\n");
2513 FAILED(buf[13] != -93, "test29 case 14 failed\n");
2514 FAILED(buf[14] != 200, "test29 case 15 failed\n");
2515 FAILED(buf[15] != 0xe5, "test29 case 16 failed\n");
2516 FAILED(buf[16] != 19640, "test29 case 17 failed\n");
2517 FAILED(buf[17] != -31005, "test29 case 18 failed\n");
2518 FAILED(buf[18] != 52646, "test29 case 19 failed\n");
2519 FAILED(buf[19] != 0xb0a6, "test29 case 20 failed\n");
2520
2521 #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
2522 FAILED(buf[20] != SLJIT_W(714537581), "test29 case 21 failed\n");
2523 FAILED(buf[21] != SLJIT_W(-1938520854), "test29 case 22 failed\n");
2524 FAILED(buf[22] != SLJIT_W(3236202668), "test29 case 23 failed\n");
2525 FAILED(buf[23] != SLJIT_W(0xf97a70b5), "test29 case 24 failed\n");
2526 #endif
2527
2528 FAILED(buf[24] != -91, "test29 case 25 failed\n");
2529
2530 sljit_free_code(code.code);
2531 successful_tests++;
2532 }
2533
2534 static void test30(void)
2535 {
2536 /* Test unused results. */
2537 executable_code code;
2538 struct sljit_compiler* compiler = sljit_create_compiler(NULL);
2539 sljit_sw buf[1];
2540
2541 if (verbose)
2542 printf("Run test30\n");
2543
2544 FAILED(!compiler, "cannot create compiler\n");
2545 buf[0] = 0;
2546 sljit_emit_enter(compiler, 0, 1, 5, 5, 0, 0, 0);
2547
2548 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 1);
2549 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 1);
2550 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, 1);
2551 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R3, 0, SLJIT_IMM, 1);
2552 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R4, 0, SLJIT_IMM, 1);
2553 #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
2554 sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_S1, 0, SLJIT_IMM, SLJIT_W(-0x123ffffffff));
2555 #else
2556 sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_S1, 0, SLJIT_IMM, 1);
2557 #endif
2558 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S2, 0, SLJIT_IMM, 1);
2559 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S3, 0, SLJIT_IMM, 1);
2560 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S4, 0, SLJIT_IMM, 1);
2561
2562 /* Some calculations with unused results. */
2563 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_UNUSED, 0, SLJIT_R2, 0);
2564 sljit_emit_op1(compiler, SLJIT_NOT, SLJIT_UNUSED, 0, SLJIT_R1, 0);
2565 sljit_emit_op1(compiler, SLJIT_NEG, SLJIT_UNUSED, 0, SLJIT_MEM1(SLJIT_S0), 0);
2566 sljit_emit_op2(compiler, SLJIT_ADD | SLJIT_SET_E, SLJIT_UNUSED, 0, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_MEM1(SLJIT_S0), 0);
2567 sljit_emit_op2(compiler, SLJIT_SUB32 | SLJIT_SET_U, SLJIT_UNUSED, 0, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_MEM1(SLJIT_S0), 0);
2568 sljit_emit_op2(compiler, SLJIT_MUL, SLJIT_UNUSED, 0, SLJIT_S0, 0, SLJIT_MEM1(SLJIT_S0), 0);
2569 sljit_emit_op2(compiler, SLJIT_SHL | SLJIT_SET_E, SLJIT_UNUSED, 0, SLJIT_S3, 0, SLJIT_R2, 0);
2570 sljit_emit_op2(compiler, SLJIT_LSHR | SLJIT_SET_E, SLJIT_UNUSED, 0, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_IMM, 5);
2571 sljit_emit_op2(compiler, SLJIT_AND, SLJIT_UNUSED, 0, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_IMM, 0xff);
2572 sljit_emit_op1(compiler, SLJIT_NOT32 | SLJIT_SET_E, SLJIT_UNUSED, 0, SLJIT_S1, 0);
2573
2574 /* Testing that any change happens. */
2575 sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_R1, 0);
2576 sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_R2, 0);
2577 sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_R3, 0);
2578 sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_R4, 0);
2579 sljit_emit_op1(compiler, SLJIT_MOV_U32, SLJIT_S1, 0, SLJIT_S1, 0);
2580 sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_S1, 0);
2581 sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_S2, 0);
2582 sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_S3, 0);
2583 sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_R0, 0, SLJIT_S4, 0);
2584
2585 sljit_emit_return(compiler, SLJIT_UNUSED, 0, 0);
2586
2587 code.code = sljit_generate_code(compiler);
2588 CHECK(compiler);
2589 sljit_free_compiler(compiler);
2590
2591 code.func1((sljit_sw)&buf);
2592 FAILED(buf[0] != 9, "test30 case 1 failed\n");
2593
2594 sljit_free_code(code.code);
2595 successful_tests++;
2596 }
2597
2598 static void test31(void)
2599 {
2600 /* Integer mul and set flags. */
2601 executable_code code;
2602 struct sljit_compiler* compiler = sljit_create_compiler(NULL);
2603 sljit_sw buf[12];
2604 #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
2605 sljit_sw big_word = SLJIT_W(0x7fffffff00000000);
2606 sljit_sw big_word2 = SLJIT_W(0x7fffffff00000012);
2607 #else
2608 sljit_sw big_word = 0x7fffffff;
2609 sljit_sw big_word2 = 0x00000012;
2610 #endif
2611
2612 if (verbose)
2613 printf("Run test31\n");
2614
2615 buf[0] = 3;
2616 buf[1] = 3;
2617 buf[2] = 3;
2618 buf[3] = 3;
2619 buf[4] = 3;
2620 buf[5] = 3;
2621 buf[6] = 3;
2622 buf[7] = 3;
2623 buf[8] = 3;
2624 buf[9] = 3;
2625 buf[10] = 3;
2626 buf[11] = 3;
2627
2628 FAILED(!compiler, "cannot create compiler\n");
2629
2630 sljit_emit_enter(compiler, 0, 1, 3, 5, 0, 0, 0);
2631 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 0);
2632 sljit_emit_op2(compiler, SLJIT_MUL | SLJIT_SET_O, SLJIT_UNUSED, 0, SLJIT_R1, 0, SLJIT_IMM, -45);
2633 cond_set(compiler, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_MUL_NOT_OVERFLOW);
2634 cond_set(compiler, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw), SLJIT_MUL_OVERFLOW);
2635
2636 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S2, 0, SLJIT_IMM, big_word);
2637 sljit_emit_op2(compiler, SLJIT_MUL | SLJIT_SET_O, SLJIT_R2, 0, SLJIT_S2, 0, SLJIT_IMM, -2);
2638 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 33); /* Should not change flags. */
2639 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 0); /* Should not change flags. */
2640 cond_set(compiler, SLJIT_MEM1(SLJIT_S0), 2 * sizeof(sljit_sw), SLJIT_MUL_OVERFLOW);
2641 cond_set(compiler, SLJIT_MEM1(SLJIT_S0), 3 * sizeof(sljit_sw), SLJIT_MUL_NOT_OVERFLOW);
2642
2643 sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_S3, 0, SLJIT_IMM, 0x3f6b0);
2644 sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_S4, 0, SLJIT_IMM, 0x2a783);
2645 sljit_emit_op2(compiler, SLJIT_MUL32 | SLJIT_SET_O, SLJIT_R1, 0, SLJIT_S3, 0, SLJIT_S4, 0);
2646 cond_set(compiler, SLJIT_MEM1(SLJIT_S0), 4 * sizeof(sljit_sw), SLJIT_MUL_OVERFLOW32);
2647 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 5 * sizeof(sljit_sw), SLJIT_R1, 0);
2648
2649 sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R1, 0, SLJIT_IMM, big_word2);
2650 sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R2, 0, SLJIT_R1, 0);
2651 sljit_emit_op2(compiler, SLJIT_MUL32 | SLJIT_SET_O, SLJIT_R1, 0, SLJIT_R1, 0, SLJIT_IMM, 23);
2652 cond_set(compiler, SLJIT_MEM1(SLJIT_S0), 6 * sizeof(sljit_sw), SLJIT_MUL_OVERFLOW32);
2653
2654 sljit_emit_op2(compiler, SLJIT_MUL32 | SLJIT_SET_O, SLJIT_UNUSED, 0, SLJIT_R2, 0, SLJIT_IMM, -23);
2655 cond_set(compiler, SLJIT_MEM1(SLJIT_S0), 7 * sizeof(sljit_sw), SLJIT_MUL_NOT_OVERFLOW32);
2656 sljit_emit_op2(compiler, SLJIT_MUL | SLJIT_SET_O, SLJIT_UNUSED, 0, SLJIT_R2, 0, SLJIT_IMM, -23);
2657 cond_set(compiler, SLJIT_MEM1(SLJIT_S0), 8 * sizeof(sljit_sw), SLJIT_MUL_NOT_OVERFLOW);
2658
2659 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 67);
2660 sljit_emit_op2(compiler, SLJIT_MUL | SLJIT_SET_O, SLJIT_R1, 0, SLJIT_R1, 0, SLJIT_IMM, -23);
2661 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 9 * sizeof(sljit_sw), SLJIT_R1, 0);
2662
2663 sljit_emit_return(compiler, SLJIT_UNUSED, 0, 0);
2664
2665 code.code = sljit_generate_code(compiler);
2666 CHECK(compiler);
2667 sljit_free_compiler(compiler);
2668
2669 code.func1((sljit_sw)&buf);
2670
2671 FAILED(buf[0] != 1, "test31 case 1 failed\n");
2672 FAILED(buf[1] != 2, "test31 case 2 failed\n");
2673 /* Qemu issues for 64 bit muls. */
2674 #if !(defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
2675 FAILED(buf[2] != 1, "test31 case 3 failed\n");
2676 FAILED(buf[3] != 2, "test31 case 4 failed\n");
2677 #endif
2678 FAILED(buf[4] != 1, "test31 case 5 failed\n");
2679 FAILED((buf[5] & 0xffffffff) != 0x85540c10, "test31 case 6 failed\n");
2680 FAILED(buf[6] != 2, "test31 case 7 failed\n");
2681 FAILED(buf[7] != 1, "test31 case 8 failed\n");
2682 #if !(defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
2683 FAILED(buf[8] != 1, "test31 case 9 failed\n");
2684 #endif
2685 FAILED(buf[9] != -1541, "test31 case 10 failed\n");
2686
2687 sljit_free_code(code.code);
2688 successful_tests++;
2689 }
2690
2691 static void test32(void)
2692 {
2693 /* Floating point set flags. */
2694 executable_code code;
2695 struct sljit_compiler* compiler = sljit_create_compiler(NULL);
2696
2697 sljit_sw buf[16];
2698 union {
2699 sljit_f64 value;
2700 struct {
2701 sljit_s32 value1;
2702 sljit_s32 value2;
2703 } u;
2704 } dbuf[4];
2705
2706 if (verbose)
2707 printf("Run test32\n");
2708
2709 buf[0] = 5;
2710 buf[1] = 5;
2711 buf[2] = 5;
2712 buf[3] = 5;
2713 buf[4] = 5;
2714 buf[5] = 5;
2715 buf[6] = 5;
2716 buf[7] = 5;
2717 buf[8] = 5;
2718 buf[9] = 5;
2719 buf[10] = 5;
2720 buf[11] = 5;
2721 buf[12] = 5;
2722 buf[13] = 5;
2723 buf[14] = 5;
2724 buf[15] = 5;
2725
2726 /* Two NaNs */
2727 dbuf[0].u.value1 = 0x7fffffff;
2728 dbuf[0].u.value2 = 0x7fffffff;
2729 dbuf[1].u.value1 = 0x7fffffff;
2730 dbuf[1].u.value2 = 0x7fffffff;
2731 dbuf[2].value = -13.0;
2732 dbuf[3].value = 27.0;
2733
2734 if (!sljit_is_fpu_available()) {
2735 if (verbose)
2736 printf("no fpu available, test32 skipped\n");
2737 successful_tests++;
2738 if (compiler)
2739 sljit_free_compiler(compiler);
2740 return;
2741 }
2742
2743 FAILED(!compiler, "cannot create compiler\n");
2744 SLJIT_ASSERT(sizeof(sljit_f64) == 8 && sizeof(sljit_s32) == 4 && sizeof(dbuf[0]) == 8);
2745
2746 sljit_emit_enter(compiler, 0, 2, 1, 2, 4, 0, 0);
2747
2748 sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR0, 0, SLJIT_MEM1(SLJIT_S1), 0);
2749 sljit_emit_fop1(compiler, SLJIT_CMP_F64 | SLJIT_SET_E, SLJIT_MEM1(SLJIT_S1), 3 * sizeof(sljit_f64), SLJIT_FR0, 0);
2750 sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR1, 0, SLJIT_MEM1(SLJIT_S1), 2 * sizeof(sljit_f64));
2751 cond_set(compiler, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_UNORDERED_F64);
2752 cond_set(compiler, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw), SLJIT_ORDERED_F64);
2753
2754 sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR2, 0, SLJIT_MEM1(SLJIT_S1), 3 * sizeof(sljit_f64));
2755 sljit_emit_fop1(compiler, SLJIT_CMP_F64 | SLJIT_SET_E | SLJIT_SET_S, SLJIT_FR1, 0, SLJIT_FR2, 0);
2756 cond_set(compiler, SLJIT_MEM1(SLJIT_S0), 2 * sizeof(sljit_sw), SLJIT_UNORDERED_F64);
2757 cond_set(compiler, SLJIT_MEM1(SLJIT_S0), 3 * sizeof(sljit_sw), SLJIT_ORDERED_F64);
2758 cond_set(compiler, SLJIT_MEM1(SLJIT_S0), 4 * sizeof(sljit_sw), SLJIT_LESS_F64);
2759 cond_set(compiler, SLJIT_MEM1(SLJIT_S0), 5 * sizeof(sljit_sw), SLJIT_GREATER_EQUAL_F64);
2760 cond_set(compiler, SLJIT_MEM1(SLJIT_S0), 6 * sizeof(sljit_sw), SLJIT_GREATER_F64);
2761 cond_set(compiler, SLJIT_MEM1(SLJIT_S0), 7 * sizeof(sljit_sw), SLJIT_LESS_EQUAL_F64);
2762 cond_set(compiler, SLJIT_MEM1(SLJIT_S0), 8 * sizeof(sljit_sw), SLJIT_EQUAL_F64);
2763 cond_set(compiler, SLJIT_MEM1(SLJIT_S0), 9 * sizeof(sljit_sw), SLJIT_NOT_EQUAL_F64);
2764
2765 sljit_emit_fop1(compiler, SLJIT_CMP_F64 | SLJIT_SET_E, SLJIT_FR2, 0, SLJIT_MEM1(SLJIT_S1), 3 * sizeof(sljit_f64));
2766 sljit_emit_fop2(compiler, SLJIT_ADD_F64, SLJIT_FR3, 0, SLJIT_FR1, 0, SLJIT_MEM1(SLJIT_S1), sizeof(sljit_f64));
2767 cond_set(compiler, SLJIT_MEM1(SLJIT_S0), 10 * sizeof(sljit_sw), SLJIT_UNORDERED_F64);
2768 cond_set(compiler, SLJIT_MEM1(SLJIT_S0), 11 * sizeof(sljit_sw), SLJIT_EQUAL_F64);
2769
2770 sljit_emit_fop1(compiler, SLJIT_CMP_F64 | SLJIT_SET_S, SLJIT_MEM1(SLJIT_S1), sizeof(sljit_f64), SLJIT_FR0, 0);
2771 cond_set(compiler, SLJIT_MEM1(SLJIT_S0), 12 * sizeof(sljit_sw), SLJIT_ORDERED_F64);
2772
2773 sljit_emit_fop1(compiler, SLJIT_CMP_F64 | SLJIT_SET_S, SLJIT_FR3, 0, SLJIT_FR2, 0);
2774 sljit_emit_op1(compiler, SLJIT_MOV_U8, SLJIT_R0, 0, SLJIT_MEM1(SLJIT_S1), 0);
2775 cond_set(compiler, SLJIT_MEM1(SLJIT_S0), 13 * sizeof(sljit_sw), SLJIT_UNORDERED_F64);
2776
2777 sljit_emit_return(compiler, SLJIT_UNUSED, 0, 0);
2778
2779 code.code = sljit_generate_code(compiler);
2780 CHECK(compiler);
2781 sljit_free_compiler(compiler);
2782
2783 code.func2((sljit_sw)&buf, (sljit_sw)&dbuf);
2784
2785 FAILED(buf[0] != 1, "test32 case 1 failed\n");
2786 FAILED(buf[1] != 2, "test32 case 2 failed\n");
2787 FAILED(buf[2] != 2, "test32 case 3 failed\n");
2788 FAILED(buf[3] != 1, "test32 case 4 failed\n");
2789 FAILED(buf[4] != 1, "test32 case 5 failed\n");
2790 FAILED(buf[5] != 2, "test32 case 6 failed\n");
2791 FAILED(buf[6] != 2, "test32 case 7 failed\n");
2792 FAILED(buf[7] != 1, "test32 case 8 failed\n");
2793 FAILED(buf[8] != 2, "test32 case 9 failed\n");
2794 FAILED(buf[9] != 1, "test32 case 10 failed\n");
2795 FAILED(buf[10] != 2, "test32 case 11 failed\n");
2796 FAILED(buf[11] != 1, "test32 case 12 failed\n");
2797 FAILED(buf[12] != 2, "test32 case 13 failed\n");
2798 FAILED(buf[13] != 1, "test32 case 14 failed\n");
2799
2800 sljit_free_code(code.code);
2801 successful_tests++;
2802 }
2803
2804 static void test33(void)
2805 {
2806 /* Test keep flags. */
2807 executable_code code;
2808 struct sljit_compiler* compiler = sljit_create_compiler(NULL);
2809 sljit_sw buf[7];
2810 #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
2811 sljit_sw big_word = SLJIT_W(0x8000000000000003);
2812 #else
2813 sljit_sw big_word = 0x80000003;
2814 #endif
2815
2816 if (verbose)
2817 printf("Run test33\n");
2818
2819 buf[0] = 3;
2820 buf[1] = 3;
2821 buf[2] = 3;
2822 buf[3] = 3;
2823 buf[4] = 3;
2824 buf[5] = 3;
2825 buf[6] = 3;
2826
2827 FAILED(!compiler, "cannot create compiler\n");
2828
2829 sljit_emit_enter(compiler, 0, 1, 3, 3, 0, 0, 0);
2830 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, big_word);
2831 sljit_emit_op2(compiler, SLJIT_ADD | SLJIT_SET_E | SLJIT_SET_C, SLJIT_R1, 0, SLJIT_R0, 0, SLJIT_IMM, big_word);
2832 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_R1, 0);
2833 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 8);
2834 sljit_emit_op2(compiler, SLJIT_SUB | SLJIT_KEEP_FLAGS, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_IMM, 8);
2835 sljit_emit_op_flags(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw), SLJIT_UNUSED, 0, SLJIT_NOT_ZERO);
2836 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 0);
2837 sljit_emit_op2(compiler, SLJIT_ADDC | SLJIT_KEEP_FLAGS, SLJIT_R1, 0, SLJIT_R0, 0, SLJIT_IMM, 0);
2838 sljit_emit_op2(compiler, SLJIT_ADDC, SLJIT_MEM1(SLJIT_S0), 2 * sizeof(sljit_sw), SLJIT_R0, 0, SLJIT_IMM, 7);
2839
2840 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 8);
2841 sljit_emit_op2(compiler, SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, SLJIT_R0, 0, SLJIT_IMM, 8);
2842 sljit_emit_op2(compiler, SLJIT_SHL | SLJIT_KEEP_FLAGS, SLJIT_MEM1(SLJIT_S0), 3 * sizeof(sljit_sw), SLJIT_MEM1(SLJIT_S0), 2 * sizeof(sljit_sw), SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw));
2843 sljit_emit_op_flags(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 4 * sizeof(sljit_sw), SLJIT_UNUSED, 0, SLJIT_EQUAL);
2844
2845 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 5 * sizeof(sljit_sw), SLJIT_IMM, 0x124);
2846 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 2);
2847 sljit_emit_op2(compiler, SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, SLJIT_R0, 0, SLJIT_IMM, 1);
2848 sljit_emit_op2(compiler, SLJIT_SUB | SLJIT_KEEP_FLAGS, SLJIT_UNUSED, 0, SLJIT_R0, 0, SLJIT_R0, 0);
2849 sljit_emit_op_flags(compiler, SLJIT_OR, SLJIT_MEM1(SLJIT_S0), 5 * sizeof(sljit_sw), SLJIT_MEM1(SLJIT_S0), 5 * sizeof(sljit_sw), SLJIT_NOT_EQUAL);
2850
2851 /* PowerPC specific test. */
2852 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, -1);
2853 sljit_emit_op2(compiler, SLJIT_ADD | SLJIT_SET_C, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_IMM, 2);
2854 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 0x80);
2855 sljit_emit_op2(compiler, SLJIT_ASHR | SLJIT_KEEP_FLAGS, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_IMM, 1);
2856 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 0);
2857 sljit_emit_op2(compiler, SLJIT_ADDC, SLJIT_MEM1(SLJIT_S0), 6 * sizeof(sljit_sw), SLJIT_R1, 0, SLJIT_IMM, 0);
2858
2859 sljit_emit_return(compiler, SLJIT_UNUSED, 0, 0);
2860
2861 code.code = sljit_generate_code(compiler);
2862 CHECK(compiler);
2863 sljit_free_compiler(compiler);
2864
2865 code.func1((sljit_sw)&buf);
2866
2867 FAILED(buf[0] != 6, "test33 case 1 failed\n");
2868 FAILED(buf[1] != 1, "test33 case 2 failed\n");
2869 FAILED(buf[2] != 8, "test33 case 3 failed\n");
2870 FAILED(buf[3] != 16, "test33 case 4 failed\n");
2871 FAILED(buf[4] != 1, "test33 case 5 failed\n");
2872 FAILED(buf[5] != 0x125, "test33 case 6 failed\n");
2873 FAILED(buf[6] != 1, "test33 case 7 failed\n");
2874
2875 sljit_free_code(code.code);
2876 successful_tests++;
2877 }
2878
2879 static void test34(void)
2880 {
2881 /* Test fast calls. */
2882 executable_code codeA;
2883 executable_code codeB;
2884 executable_code codeC;
2885 executable_code codeD;
2886 executable_code codeE;
2887 executable_code codeF;
2888 struct sljit_compiler* compiler;
2889 struct sljit_jump *jump;
2890 struct sljit_label* label;
2891 sljit_uw addr;
2892 sljit_p buf[2];
2893
2894 if (verbose)
2895 printf("Run test34\n");
2896
2897 buf[0] = 0;
2898 buf[1] = 0;
2899
2900 /* A */
2901 compiler = sljit_create_compiler(NULL);
2902 FAILED(!compiler, "cannot create compiler\n");
2903 sljit_set_context(compiler, 0, 1, 5, 5, 0, 0, 2 * sizeof(sljit_p));
2904
2905 sljit_emit_fast_enter(compiler, SLJIT_R1, 0);
2906 sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_IMM, 4);
2907 sljit_emit_fast_return(compiler, SLJIT_R1, 0);
2908
2909 codeA.code = sljit_generate_code(compiler);
2910 CHECK(compiler);
2911 sljit_free_compiler(compiler);
2912
2913 /* B */
2914 compiler = sljit_create_compiler(NULL);
2915 FAILED(!compiler, "cannot create compiler\n");
2916 sljit_set_context(compiler, 0, 1, 5, 5, 0, 0, 2 * sizeof(sljit_p));
2917
2918 sljit_emit_fast_enter(compiler, SLJIT_R4, 0);
2919 sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_IMM, 6);
2920 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, SLJIT_FUNC_OFFSET(codeA.code));
2921 sljit_emit_ijump(compiler, SLJIT_FAST_CALL, SLJIT_R1, 0);
2922 sljit_emit_fast_return(compiler, SLJIT_R4, 0);
2923
2924 codeB.code = sljit_generate_code(compiler);
2925 CHECK(compiler);
2926 sljit_free_compiler(compiler);
2927
2928 /* C */
2929 compiler = sljit_create_compiler(NULL);
2930 FAILED(!compiler, "cannot create compiler\n");
2931 sljit_set_context(compiler, 0, 1, 5, 5, 0, 0, 2 * sizeof(sljit_p));
2932
2933 sljit_emit_fast_enter(compiler, SLJIT_MEM1(SLJIT_SP), sizeof(sljit_p));
2934 sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_IMM, 8);
2935 jump = sljit_emit_jump(compiler, SLJIT_REWRITABLE_JUMP | SLJIT_FAST_CALL);
2936 sljit_set_target(jump, SLJIT_FUNC_OFFSET(codeB.code));
2937 sljit_emit_fast_return(compiler, SLJIT_MEM1(SLJIT_SP), sizeof(sljit_p));
2938
2939 codeC.code = sljit_generate_code(compiler);
2940 CHECK(compiler);
2941 sljit_free_compiler(compiler);
2942
2943 /* D */
2944 compiler = sljit_create_compiler(NULL);
2945 FAILED(!compiler, "cannot create compiler\n");
2946 sljit_set_context(compiler, 0, 1, 5, 5, 0, 0, 2 * sizeof(sljit_p));
2947
2948 sljit_emit_fast_enter(compiler, SLJIT_MEM1(SLJIT_SP), 0);
2949 sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_IMM, 10);
2950 sljit_emit_ijump(compiler, SLJIT_FAST_CALL, SLJIT_IMM, SLJIT_FUNC_OFFSET(codeC.code));
2951 sljit_emit_fast_return(compiler, SLJIT_MEM1(SLJIT_SP), 0);
2952
2953 codeD.code = sljit_generate_code(compiler);
2954 CHECK(compiler);
2955 sljit_free_compiler(compiler);
2956
2957 /* E */
2958 compiler = sljit_create_compiler(NULL);
2959 FAILED(!compiler, "cannot create compiler\n");
2960 sljit_set_context(compiler, 0, 1, 5, 5, 0, 0, 2 * sizeof(sljit_p));
2961
2962 sljit_emit_fast_enter(compiler, SLJIT_MEM1(SLJIT_S0), 0);
2963 sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_IMM, 12);
2964 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_p), SLJIT_IMM, SLJIT_FUNC_OFFSET(codeD.code));
2965 sljit_emit_ijump(compiler, SLJIT_FAST_CALL, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_p));
2966 sljit_emit_fast_return(compiler, SLJIT_MEM1(SLJIT_S0), 0);
2967
2968 codeE.code = sljit_generate_code(compiler);
2969 CHECK(compiler);
2970 sljit_free_compiler(compiler);
2971
2972 /* F */
2973 compiler = sljit_create_compiler(NULL);
2974 FAILED(!compiler, "cannot create compiler\n");
2975
2976 sljit_emit_enter(compiler, 0, 1, 5, 5, 0, 0, 2 * sizeof(sljit_p));
2977 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 0);
2978 sljit_emit_ijump(compiler, SLJIT_FAST_CALL, SLJIT_IMM, SLJIT_FUNC_OFFSET(codeE.code));
2979 label = sljit_emit_label(compiler);
2980 sljit_emit_return(compiler, SLJIT_MOV, SLJIT_R0, 0);
2981
2982 codeF.code = sljit_generate_code(compiler);
2983 CHECK(compiler);
2984 addr = sljit_get_label_addr(label);
2985 sljit_free_compiler(compiler);
2986
2987 FAILED(codeF.func1((sljit_sw)&buf) != 40, "test34 case 1 failed\n");
2988 FAILED(buf[0] != addr - SLJIT_RETURN_ADDRESS_OFFSET, "test34 case 2 failed\n");
2989
2990 sljit_free_code(codeA.code);
2991 sljit_free_code(codeB.code);
2992 sljit_free_code(codeC.code);
2993 sljit_free_code(codeD.code);
2994 sljit_free_code(codeE.code);
2995 sljit_free_code(codeF.code);
2996 successful_tests++;
2997 }
2998
2999 static void test35(void)
3000 {
3001 /* More complicated tests for fast calls. */
3002 executable_code codeA;
3003 executable_code codeB;
3004 executable_code codeC;
3005 struct sljit_compiler* compiler;
3006 struct sljit_jump *jump;
3007 struct sljit_label* label;
3008 sljit_uw return_addr, jump_addr;
3009 sljit_p buf[1];
3010
3011 if (verbose)
3012 printf("Run test35\n");
3013
3014 buf[0] = 0;
3015
3016 /* A */
3017 compiler = sljit_create_compiler(NULL);
3018 FAILED(!compiler, "cannot create compiler\n");
3019 sljit_set_context(compiler, 0, 0, 2, 2, 0, 0, 0);
3020
3021 sljit_emit_fast_enter(compiler, SLJIT_MEM0(), (sljit_sw)&buf[0]);
3022 sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_IMM, 5);
3023 jump = sljit_emit_jump(compiler, SLJIT_REWRITABLE_JUMP | SLJIT_FAST_CALL);
3024 sljit_set_target(jump, 0);
3025 label = sljit_emit_label(compiler);
3026 sljit_emit_fast_return(compiler, SLJIT_MEM0(), (sljit_sw)&buf[0]);
3027
3028 codeA.code = sljit_generate_code(compiler);
3029 CHECK(compiler);
3030 return_addr = sljit_get_label_addr(label) - SLJIT_RETURN_ADDRESS_OFFSET;
3031 jump_addr = sljit_get_jump_addr(jump);
3032 sljit_free_compiler(compiler);
3033
3034 /* B */
3035 compiler = sljit_create_compiler(NULL);
3036 FAILED(!compiler, "cannot create compiler\n");
3037 sljit_set_context(compiler, 0, 0, 2, 2, 0, 0, 0);
3038
3039 sljit_emit_fast_enter(compiler, SLJIT_UNUSED, 0);
3040 sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_IMM, 7);
3041 sljit_emit_fast_return(compiler, SLJIT_IMM, return_addr);
3042
3043 codeB.code = sljit_generate_code(compiler);
3044 CHECK(compiler);
3045 sljit_free_compiler(compiler);
3046 sljit_set_jump_addr(jump_addr, SLJIT_FUNC_OFFSET(codeB.code));
3047
3048 /* C */
3049 compiler = sljit_create_compiler(NULL);
3050 FAILED(!compiler, "cannot create compiler\n");
3051
3052 sljit_emit_enter(compiler, 0, 0, 2, 2, 0, 0, 0);
3053 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 0);
3054 sljit_emit_ijump(compiler, SLJIT_FAST_CALL, SLJIT_IMM, SLJIT_FUNC_OFFSET(codeA.code));
3055 label = sljit_emit_label(compiler);
3056 sljit_emit_return(compiler, SLJIT_MOV, SLJIT_R0, 0);
3057
3058 codeC.code = sljit_generate_code(compiler);
3059 CHECK(compiler);
3060 return_addr = sljit_get_label_addr(label);
3061 sljit_free_compiler(compiler);
3062
3063 FAILED(codeC.func0() != 12, "test35 case 1 failed\n");
3064 FAILED(buf[0] != return_addr - SLJIT_RETURN_ADDRESS_OFFSET, "test35 case 2 failed\n");
3065
3066 sljit_free_code(codeA.code);
3067 sljit_free_code(codeB.code);
3068 sljit_free_code(codeC.code);
3069 successful_tests++;
3070 }
3071
3072 static sljit_s32 cmp_test(struct sljit_compiler *compiler, sljit_s32 type, sljit_s32 src1, sljit_sw src1w, sljit_s32 src2, sljit_sw src2w)
3073 {
3074 /* 2 = true, 1 = false */
3075 struct sljit_jump* jump;
3076 struct sljit_label* label;
3077
3078 if (sljit_emit_op1(compiler, SLJIT_MOVU_U8, SLJIT_MEM1(SLJIT_S0), 1, SLJIT_IMM, 2))
3079 return compiler->error;
3080 jump = sljit_emit_cmp(compiler, type, src1, src1w, src2, src2w);
3081 if (!jump)
3082 return compiler->error;
3083 if (sljit_emit_op1(compiler, SLJIT_MOV_U8, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_IMM, 1))
3084 return compiler->error;
3085 label = sljit_emit_label(compiler);
3086 if (!label)
3087 return compiler->error;
3088 sljit_set_label(jump, label);
3089 return SLJIT_SUCCESS;
3090 }
3091
3092 #define TEST_CASES (7 + 10 + 12 + 11 + 4)
3093 static void test36(void)
3094 {
3095 /* Compare instruction. */
3096 executable_code code;
3097 struct sljit_compiler* compiler = sljit_create_compiler(NULL);
3098
3099 sljit_s8 buf[TEST_CASES];
3100 sljit_s8 compare_buf[TEST_CASES] = {
3101 1, 1, 2, 2, 1, 2, 2,
3102 1, 1, 2, 2, 2, 1, 2, 2, 1, 1,
3103 2, 2, 2, 1, 2, 2, 2, 2, 1, 1, 2, 2,
3104 2, 1, 2, 1, 1, 1, 2, 1, 2, 1, 2,
3105 2, 1, 1, 2
3106 };
3107 sljit_sw data[4];
3108 sljit_s32 i;
3109
3110 if (verbose)
3111 printf("Run test36\n");
3112
3113 FAILED(!compiler, "cannot create compiler\n");
3114 for (i = 0; i < TEST_CASES; ++i)
3115 buf[i] = 100;
3116 data[0] = 32;
3117 data[1] = -9;
3118 data[2] = 43;
3119 data[3] = -13;
3120
3121 sljit_emit_enter(compiler, 0, 2, 3, 2, 0, 0, 0);
3122 sljit_emit_op2(compiler, SLJIT_SUB, SLJIT_S0, 0, SLJIT_S0, 0, SLJIT_IMM, 1);
3123
3124 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 13);
3125 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 15);
3126 cmp_test(compiler, SLJIT_EQUAL, SLJIT_IMM, 9, SLJIT_R0, 0);
3127 cmp_test(compiler, SLJIT_EQUAL, SLJIT_R0, 0, SLJIT_R1, 0);
3128 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 3);
3129 cmp_test(compiler, SLJIT_EQUAL, SLJIT_MEM2(SLJIT_S1, SLJIT_R0), SLJIT_WORD_SHIFT, SLJIT_IMM, -13);
3130 cmp_test(compiler, SLJIT_NOT_EQUAL, SLJIT_IMM, 0, SLJIT_R0, 0);
3131 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 0);
3132 cmp_test(compiler, SLJIT_NOT_EQUAL | SLJIT_REWRITABLE_JUMP, SLJIT_IMM, 0, SLJIT_R0, 0);
3133 cmp_test(compiler, SLJIT_EQUAL, SLJIT_MEM2(SLJIT_S1, SLJIT_R0), SLJIT_WORD_SHIFT, SLJIT_MEM2(SLJIT_S1, SLJIT_R0), SLJIT_WORD_SHIFT);
3134 cmp_test(compiler, SLJIT_EQUAL | SLJIT_REWRITABLE_JUMP, SLJIT_R0, 0, SLJIT_IMM, 0);
3135
3136 cmp_test(compiler, SLJIT_SIG_LESS, SLJIT_MEM1(SLJIT_S1), 0, SLJIT_IMM, 0);
3137 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, -8);
3138 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 0);
3139 cmp_test(compiler, SLJIT_SIG_GREATER, SLJIT_R0, 0, SLJIT_IMM, 0);
3140 cmp_test(compiler, SLJIT_SIG_LESS_EQUAL, SLJIT_R0, 0, SLJIT_IMM, 0);
3141 cmp_test(compiler, SLJIT_SIG_LESS | SLJIT_REWRITABLE_JUMP, SLJIT_R0, 0, SLJIT_IMM, 0);
3142 cmp_test(compiler, SLJIT_SIG_GREATER_EQUAL, SLJIT_R1, 0, SLJIT_IMM, 0);
3143 cmp_test(compiler, SLJIT_SIG_GREATER, SLJIT_IMM, 0, SLJIT_MEM1(SLJIT_S1), 2 * sizeof(sljit_sw));
3144 cmp_test(compiler, SLJIT_SIG_LESS_EQUAL, SLJIT_IMM, 0, SLJIT_R1, 0);
3145 cmp_test(compiler, SLJIT_SIG_LESS, SLJIT_IMM, 0, SLJIT_MEM1(SLJIT_S1), 2 * sizeof(sljit_sw));
3146 cmp_test(compiler, SLJIT_SIG_LESS, SLJIT_IMM, 0, SLJIT_MEM1(SLJIT_S1), 3 * sizeof(sljit_sw));
3147 cmp_test(compiler, SLJIT_SIG_LESS | SLJIT_REWRITABLE_JUMP, SLJIT_IMM, 0, SLJIT_MEM1(SLJIT_S1), 3 * sizeof(sljit_sw));
3148
3149 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 8);
3150 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 0);
3151 cmp_test(compiler, SLJIT_LESS, SLJIT_R0, 0, SLJIT_MEM1(SLJIT_S1), sizeof(sljit_sw));
3152 cmp_test(compiler, SLJIT_GREATER_EQUAL, SLJIT_R0, 0, SLJIT_IMM, 8);
3153 cmp_test(compiler, SLJIT_LESS, SLJIT_R0, 0, SLJIT_IMM, -10);
3154 cmp_test(compiler, SLJIT_LESS, SLJIT_R0, 0, SLJIT_IMM, 8);
3155 cmp_test(compiler, SLJIT_GREATER_EQUAL, SLJIT_IMM, 8, SLJIT_R1, 0);
3156 cmp_test(compiler, SLJIT_GREATER_EQUAL | SLJIT_REWRITABLE_JUMP, SLJIT_IMM, 8, SLJIT_R1, 0);
3157 cmp_test(compiler, SLJIT_GREATER, SLJIT_IMM, 8, SLJIT_R1, 0);
3158 cmp_test(compiler, SLJIT_LESS_EQUAL, SLJIT_IMM, 7, SLJIT_R0, 0);
3159 cmp_test(compiler, SLJIT_GREATER, SLJIT_IMM, 1, SLJIT_MEM1(SLJIT_S1), 3 * sizeof(sljit_sw));
3160 cmp_test(compiler, SLJIT_LESS_EQUAL, SLJIT_R0, 0, SLJIT_R1, 0);
3161 cmp_test(compiler, SLJIT_GREATER, SLJIT_R0, 0, SLJIT_R1, 0);
3162 cmp_test(compiler, SLJIT_GREATER | SLJIT_REWRITABLE_JUMP, SLJIT_R0, 0, SLJIT_R1, 0);
3163
3164 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, -3);
3165 cmp_test(compiler, SLJIT_SIG_LESS, SLJIT_R0, 0, SLJIT_R1, 0);
3166 cmp_test(compiler, SLJIT_SIG_GREATER_EQUAL, SLJIT_R0, 0, SLJIT_R1, 0);
3167 cmp_test(compiler, SLJIT_SIG_LESS, SLJIT_R0, 0, SLJIT_IMM, -1);
3168 cmp_test(compiler, SLJIT_SIG_GREATER_EQUAL, SLJIT_R0, 0, SLJIT_IMM, 1);
3169 cmp_test(compiler, SLJIT_SIG_LESS, SLJIT_MEM1(SLJIT_S1), 0, SLJIT_IMM, -1);
3170 cmp_test(compiler, SLJIT_SIG_LESS | SLJIT_REWRITABLE_JUMP, SLJIT_MEM1(SLJIT_S1), 0, SLJIT_IMM, -1);
3171 cmp_test(compiler, SLJIT_SIG_LESS_EQUAL, SLJIT_R0, 0, SLJIT_R1, 0);
3172 cmp_test(compiler, SLJIT_SIG_GREATER, SLJIT_R0, 0, SLJIT_R1, 0);
3173 cmp_test(compiler, SLJIT_SIG_LESS_EQUAL, SLJIT_IMM, -4, SLJIT_R0, 0);
3174 cmp_test(compiler, SLJIT_SIG_GREATER, SLJIT_IMM, -1, SLJIT_R1, 0);
3175 cmp_test(compiler, SLJIT_SIG_GREATER | SLJIT_REWRITABLE_JUMP, SLJIT_R1, 0, SLJIT_IMM, -1);
3176
3177 #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
3178 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, SLJIT_W(0xf00000004));
3179 sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R1, 0, SLJIT_R0, 0);
3180 cmp_test(compiler, SLJIT_LESS32, SLJIT_R1, 0, SLJIT_IMM, 5);
3181 cmp_test(compiler, SLJIT_LESS, SLJIT_R0, 0, SLJIT_IMM, 5);
3182 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, SLJIT_W(0xff0000004));
3183 sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R1, 0, SLJIT_R0, 0);
3184 cmp_test(compiler, SLJIT_SIG_GREATER32, SLJIT_R1, 0, SLJIT_IMM, 5);
3185 cmp_test(compiler, SLJIT_SIG_GREATER, SLJIT_R0, 0, SLJIT_IMM, 5);
3186 #else
3187 sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R0, 0, SLJIT_IMM, 4);
3188 cmp_test(compiler, SLJIT_LESS32, SLJIT_R0, 0, SLJIT_IMM, 5);
3189 cmp_test(compiler, SLJIT_GREATER32, SLJIT_R0, 0, SLJIT_IMM, 5);
3190 sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R0, 0, SLJIT_IMM, 0xf0000004);
3191 cmp_test(compiler, SLJIT_SIG_GREATER32, SLJIT_R0, 0, SLJIT_IMM, 5);
3192 cmp_test(compiler, SLJIT_SIG_LESS32, SLJIT_R0, 0, SLJIT_IMM, 5);
3193 #endif
3194
3195 sljit_emit_return(compiler, SLJIT_UNUSED, 0, 0);
3196
3197 code.code = sljit_generate_code(compiler);
3198 CHECK(compiler);
3199 sljit_free_compiler(compiler);
3200
3201 code.func2((sljit_sw)&buf, (sljit_sw)&data);
3202
3203 for (i = 0; i < TEST_CASES; ++i)
3204 if (SLJIT_UNLIKELY(buf[i] != compare_buf[i])) {
3205 printf("test36 case %d failed\n", i + 1);
3206 return;
3207 }
3208
3209 sljit_free_code(code.code);
3210 successful_tests++;
3211 }
3212 #undef TEST_CASES
3213
3214 #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
3215 #define BITN(n) (SLJIT_W(1) << (63 - (n)))
3216 #define RESN(n) (n)
3217 #else
3218 #define BITN(n) (1 << (31 - ((n) & 0x1f)))
3219 #define RESN(n) ((n) & 0x1f)
3220 #endif
3221
3222 static void test37(void)
3223 {
3224 /* Test count leading zeroes. */
3225 executable_code code;
3226 struct sljit_compiler* compiler = sljit_create_compiler(NULL);
3227 sljit_sw buf[15];
3228 sljit_s32 ibuf[2];
3229 sljit_s32 i;
3230
3231 if (verbose)
3232 printf("Run test37\n");
3233
3234 FAILED(!compiler, "cannot create compiler\n");
3235
3236 for (i = 0; i < 15; i++)
3237 buf[i] = -1;
3238 buf[3] = 0;
3239 buf[7] = BITN(13);
3240 ibuf[0] = -1;
3241 ibuf[1] = -1;
3242 sljit_emit_enter(compiler, 0, 2, 1, 2, 0, 0, 0);
3243 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, BITN(27));
3244 sljit_emit_op1(compiler, SLJIT_CLZ, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_R0, 0);
3245 sljit_emit_op1(compiler, SLJIT_CLZ | SLJIT_SET_E, SLJIT_R0, 0, SLJIT_IMM, BITN(47));
3246 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw), SLJIT_R0, 0);
3247 sljit_emit_op_flags(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 2 * sizeof(sljit_sw), SLJIT_UNUSED, 0, SLJIT_ZERO);
3248 sljit_emit_op1(compiler, SLJIT_CLZ, SLJIT_MEM1(SLJIT_S0), 3 * sizeof(sljit_sw), SLJIT_MEM1(SLJIT_S0), 3 * sizeof(sljit_sw));
3249 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, -1);
3250 sljit_emit_op1(compiler, SLJIT_CLZ | SLJIT_SET_E, SLJIT_R0, 0, SLJIT_R0, 0);
3251 sljit_emit_op_flags(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 4 * sizeof(sljit_sw), SLJIT_UNUSED, 0, SLJIT_ZERO);
3252 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 5 * sizeof(sljit_sw), SLJIT_R0, 0);
3253 sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R0, 0, SLJIT_IMM, 0);
3254 sljit_emit_op1(compiler, SLJIT_CLZ32, SLJIT_MEM1(SLJIT_S1), 0, SLJIT_R0, 0);
3255 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, -1);
3256 sljit_emit_op1(compiler, SLJIT_CLZ | SLJIT_SET_E, SLJIT_UNUSED, 0, SLJIT_R0, 0);
3257 sljit_emit_op_flags(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 6 * sizeof(sljit_sw), SLJIT_UNUSED, 0, SLJIT_ZERO);
3258 sljit_emit_op1(compiler, SLJIT_CLZ | SLJIT_KEEP_FLAGS, SLJIT_R0, 0, SLJIT_MEM1(SLJIT_S0), 7 * sizeof(sljit_sw));
3259 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 7 * sizeof(sljit_sw), SLJIT_R0, 0);
3260 sljit_emit_op_flags(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 8 * sizeof(sljit_sw), SLJIT_UNUSED, 0, SLJIT_NOT_ZERO);
3261 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, BITN(58));
3262 sljit_emit_op1(compiler, SLJIT_CLZ, SLJIT_MEM1(SLJIT_S0), 9 * sizeof(sljit_sw), SLJIT_R0, 0);
3263 sljit_emit_op1(compiler, SLJIT_CLZ | SLJIT_SET_E, SLJIT_UNUSED, 0, SLJIT_MEM1(SLJIT_S0), 10 * sizeof(sljit_sw));
3264 sljit_emit_op_flags(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 10 * sizeof(sljit_sw), SLJIT_UNUSED, 0, SLJIT_NOT_ZERO);
3265 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 0);
3266 sljit_emit_op1(compiler, SLJIT_CLZ, SLJIT_MEM1(SLJIT_S0), 11 * sizeof(sljit_sw), SLJIT_R0, 0);
3267 #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
3268 sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R0, 0, SLJIT_IMM, SLJIT_W(0xff08a00000));
3269 #else
3270 sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R0, 0, SLJIT_IMM, 0x08a00000);
3271 #endif
3272 sljit_emit_op1(compiler, SLJIT_CLZ32, SLJIT_MEM1(SLJIT_S1), sizeof(sljit_s32), SLJIT_R0, 0);
3273 sljit_emit_op1(compiler, SLJIT_CLZ32, SLJIT_R0, 0, SLJIT_R0, 0);
3274 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 12 * sizeof(sljit_sw), SLJIT_R0, 0);
3275 #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
3276 sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R0, 0, SLJIT_IMM, SLJIT_W(0xffc8a00000));
3277 #else
3278 sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R0, 0, SLJIT_IMM, 0xc8a00000);
3279 #endif
3280 sljit_emit_op1(compiler, SLJIT_CLZ32 | SLJIT_SET_E, SLJIT_UNUSED, 0, SLJIT_R0, 0);
3281 sljit_emit_op_flags(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 13 * sizeof(sljit_sw), SLJIT_UNUSED, 0, SLJIT_ZERO32);
3282 sljit_emit_op1(compiler, SLJIT_CLZ32 | SLJIT_SET_E, SLJIT_R0, 0, SLJIT_R0, 0);
3283 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 14 * sizeof(sljit_sw), SLJIT_R0, 0);
3284
3285 sljit_emit_return(compiler, SLJIT_UNUSED, 0, 0);
3286
3287 code.code = sljit_generate_code(compiler);
3288 CHECK(compiler);
3289 sljit_free_compiler(compiler);
3290
3291 code.func2((sljit_sw)&buf, (sljit_sw)&ibuf);
3292 FAILED(buf[0] != RESN(27), "test37 case 1 failed\n");
3293 FAILED(buf[1] != RESN(47), "test37 case 2 failed\n");
3294 FAILED(buf[2] != 0, "test37 case 3 failed\n");
3295 #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
3296 FAILED(buf[3] != 64, "test37 case 4 failed\n");
3297 #else
3298 FAILED(buf[3] != 32, "test37 case 4 failed\n");
3299 #endif
3300 FAILED(buf[4] != 1, "test37 case 5 failed\n");
3301 FAILED(buf[5] != 0, "test37 case 6 failed\n");
3302 FAILED(ibuf[0] != 32, "test37 case 7 failed\n");
3303 FAILED(buf[6] != 1, "test37 case 8 failed\n");
3304 FAILED(buf[7] != RESN(13), "test37 case 9 failed\n");
3305 #if !(defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32)
3306 FAILED(buf[8] != 0, "test37 case 10 failed\n");
3307 #endif
3308 FAILED(buf[9] != RESN(58), "test37 case 11 failed\n");
3309 FAILED(buf[10] != 0, "test37 case 12 failed\n");
3310 #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
3311 FAILED(buf[11] != 64, "test37 case 13 failed\n");
3312 #else
3313 FAILED(buf[11] != 32, "test37 case 13 failed\n");
3314 #endif
3315 FAILED(ibuf[1] != 4, "test37 case 14 failed\n");
3316 FAILED((buf[12] & 0xffffffff) != 4, "test37 case 15 failed\n");
3317 FAILED(buf[13] != 1, "test37 case 16 failed\n");
3318 FAILED((buf[14] & 0xffffffff) != 0, "test37 case 17 failed\n");
3319
3320 sljit_free_code(code.code);
3321 successful_tests++;
3322 }
3323 #undef BITN
3324 #undef RESN
3325
3326 static void test38(void)
3327 {
3328 #if (defined SLJIT_UTIL_STACK && SLJIT_UTIL_STACK)
3329 /* Test stack utility. */
3330 executable_code code;
3331 struct sljit_compiler* compiler = sljit_create_compiler(NULL);
3332 struct sljit_jump* alloc_fail;
3333 struct sljit_jump* alloc2_fail;
3334 struct sljit_jump* alloc3_fail;
3335 struct sljit_jump* jump;
3336 struct sljit_label* label;
3337
3338 if (verbose)
3339 printf("Run test38\n");
3340
3341 FAILED(!compiler, "cannot create compiler\n");
3342
3343 sljit_emit_enter(compiler, 0, 0, 3, 1, 0, 0, 0);
3344
3345 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 8192);
3346 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 65536);
3347 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, 0);
3348 sljit_emit_ijump(compiler, SLJIT_CALL3, SLJIT_IMM, SLJIT_FUNC_OFFSET(sljit_allocate_stack));
3349 alloc_fail = sljit_emit_cmp(compiler, SLJIT_EQUAL, SLJIT_RETURN_REG, 0, SLJIT_IMM, 0);
3350 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S0, 0, SLJIT_RETURN_REG, 0);
3351
3352 /* Write 8k data. */
3353 sljit_emit_op2(compiler, SLJIT_SUB, SLJIT_R0, 0, SLJIT_MEM1(SLJIT_S0), SLJIT_OFFSETOF(struct sljit_stack, base), SLJIT_IMM, sizeof(sljit_sw));
3354 sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R1, 0, SLJIT_R0, 0, SLJIT_IMM, 8192);
3355 label = sljit_emit_label(compiler);
3356 sljit_emit_op1(compiler, SLJIT_MOVU, SLJIT_MEM1(SLJIT_R0), sizeof(sljit_sw), SLJIT_IMM, -1);
3357 jump = sljit_emit_cmp(compiler, SLJIT_LESS, SLJIT_R0, 0, SLJIT_R1, 0);
3358 sljit_set_label(jump, label);
3359
3360 /* Grow stack. */
3361 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_S0, 0);
3362 sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R1, 0, SLJIT_MEM1(SLJIT_S0), SLJIT_OFFSETOF(struct sljit_stack, base), SLJIT_IMM, 65536);
3363 sljit_emit_ijump(compiler, SLJIT_CALL2, SLJIT_IMM, SLJIT_FUNC_OFFSET(sljit_stack_resize));
3364 alloc2_fail = sljit_emit_cmp(compiler, SLJIT_NOT_EQUAL, SLJIT_RETURN_REG, 0, SLJIT_IMM, 0);
3365
3366 /* Write 64k data. */
3367 sljit_emit_op2(compiler, SLJIT_SUB, SLJIT_R0, 0, SLJIT_MEM1(SLJIT_S0), SLJIT_OFFSETOF(struct sljit_stack, base), SLJIT_IMM, sizeof(sljit_sw));
3368 sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R1, 0, SLJIT_R0, 0, SLJIT_IMM, 65536);
3369 label = sljit_emit_label(compiler);
3370 sljit_emit_op1(compiler, SLJIT_MOVU, SLJIT_MEM1(SLJIT_R0), sizeof(sljit_sw), SLJIT_IMM, -1);
3371 jump = sljit_emit_cmp(compiler, SLJIT_LESS, SLJIT_R0, 0, SLJIT_R1, 0);
3372 sljit_set_label(jump, label);
3373
3374 /* Shrink stack. */
3375 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_S0, 0);
3376 sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R1, 0, SLJIT_MEM1(SLJIT_S0), SLJIT_OFFSETOF(struct sljit_stack, base), SLJIT_IMM, 32768);
3377 sljit_emit_ijump(compiler, SLJIT_CALL2, SLJIT_IMM, SLJIT_FUNC_OFFSET(sljit_stack_resize));
3378 alloc3_fail = sljit_emit_cmp(compiler, SLJIT_NOT_EQUAL, SLJIT_RETURN_REG, 0, SLJIT_IMM, 0);
3379
3380 /* Write 32k data. */
3381 sljit_emit_op2(compiler, SLJIT_SUB, SLJIT_R0, 0, SLJIT_MEM1(SLJIT_S0), SLJIT_OFFSETOF(struct sljit_stack, base), SLJIT_IMM, sizeof(sljit_sw));
3382 sljit_emit_op2(compiler, SLJIT_SUB, SLJIT_R1, 0, SLJIT_MEM1(SLJIT_S0), SLJIT_OFFSETOF(struct sljit_stack, limit), SLJIT_IMM, sizeof(sljit_sw));
3383 label = sljit_emit_label(compiler);
3384 sljit_emit_op1(compiler, SLJIT_MOVU, SLJIT_MEM1(SLJIT_R0), sizeof(sljit_sw), SLJIT_IMM, -1);
3385 jump = sljit_emit_cmp(compiler, SLJIT_LESS, SLJIT_R0, 0, SLJIT_R1, 0);
3386 sljit_set_label(jump, label);
3387
3388 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_S0, 0);
3389 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 0);
3390 sljit_emit_ijump(compiler, SLJIT_CALL2, SLJIT_IMM, SLJIT_FUNC_OFFSET(sljit_free_stack));
3391
3392 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_RETURN_REG, 0, SLJIT_IMM, 1);
3393 label = sljit_emit_label(compiler);
3394 sljit_set_label(alloc_fail, label);
3395 sljit_set_label(alloc2_fail, label);
3396 sljit_set_label(alloc3_fail, label);
3397 sljit_emit_return(compiler, SLJIT_UNUSED, 0, 0);
3398
3399 code.code = sljit_generate_code(compiler);
3400 CHECK(compiler);
3401 sljit_free_compiler(compiler);
3402
3403 /* Just survive this. */
3404 FAILED(code.func0() != 1, "test38 case 1 failed\n");
3405
3406 sljit_free_code(code.code);
3407 #endif
3408 successful_tests++;
3409 }
3410
3411 static void test39(void)
3412 {
3413 /* Test error handling. */
3414 executable_code code;
3415 struct sljit_compiler* compiler = sljit_create_compiler(NULL);
3416 struct sljit_jump* jump;
3417
3418 if (verbose)
3419 printf("Run test39\n");
3420
3421 FAILED(!compiler, "cannot create compiler\n");
3422
3423 /* Such assignment should never happen in a regular program. */
3424 compiler->error = -3967;
3425
3426 SLJIT_ASSERT(sljit_emit_enter(compiler, 0, 2, 5, 5, 6, 0, 32) == -3967);
3427 SLJIT_ASSERT(sljit_emit_return(compiler, SLJIT_MOV, SLJIT_R1, 0) == -3967);
3428 SLJIT_ASSERT(sljit_emit_op0(compiler, SLJIT_NOP) == -3967);
3429 SLJIT_ASSERT(sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_MEM2(SLJIT_R0, SLJIT_R1), 1) == -3967);
3430 SLJIT_ASSERT(sljit_emit_op2(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_MEM1(SLJIT_R0), 64, SLJIT_MEM1(SLJIT_S0), -64) == -3967);
3431 SLJIT_ASSERT(sljit_emit_fop1(compiler, SLJIT_ABS_F64, SLJIT_FR0, 0, SLJIT_MEM1(SLJIT_R1), 0) == -3967);
3432 SLJIT_ASSERT(sljit_emit_fop2(compiler, SLJIT_DIV_F64, SLJIT_FR2, 0, SLJIT_MEM2(SLJIT_R0, SLJIT_S0), 0, SLJIT_FR2, 0) == -3967);
3433 SLJIT_ASSERT(!sljit_emit_label(compiler));
3434 jump = sljit_emit_jump(compiler, SLJIT_CALL3);
3435 SLJIT_ASSERT(!jump);
3436 sljit_set_label(jump, (struct sljit_label*)0x123450);
3437 sljit_set_target(jump, 0x123450);
3438 jump = sljit_emit_cmp(compiler, SLJIT_SIG_LESS_EQUAL, SLJIT_R0, 0, SLJIT_R1, 0);
3439 SLJIT_ASSERT(!jump);
3440 SLJIT_ASSERT(sljit_emit_ijump(compiler, SLJIT_JUMP, SLJIT_MEM1(SLJIT_R0), 8) == -3967);
3441 SLJIT_ASSERT(sljit_emit_op_flags(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_UNUSED, 0, SLJIT_MUL_OVERFLOW) == -3967);
3442 SLJIT_ASSERT(!sljit_emit_const(compiler, SLJIT_R0, 0, 99));
3443
3444 SLJIT_ASSERT(!compiler->labels && !compiler->jumps && !compiler->consts);
3445 SLJIT_ASSERT(!compiler->last_label && !compiler->last_jump && !compiler->last_const);
3446 SLJIT_ASSERT(!compiler->buf->next && !compiler->buf->used_size);
3447 SLJIT_ASSERT(!compiler->abuf->next && !compiler->abuf->used_size);
3448
3449 sljit_set_compiler_memory_error(compiler);
3450 FAILED(sljit_get_compiler_error(compiler) != -3967, "test39 case 1 failed\n");
3451
3452 code.code = sljit_generate_code(compiler);
3453 FAILED(sljit_get_compiler_error(compiler) != -3967, "test39 case 2 failed\n");
3454 FAILED(!!code.code, "test39 case 3 failed\n");
3455 sljit_free_compiler(compiler);
3456
3457 compiler = sljit_create_compiler(NULL);
3458 FAILED(!compiler, "cannot create compiler\n");
3459
3460 FAILED(sljit_get_compiler_error(compiler) != SLJIT_SUCCESS, "test39 case 4 failed\n");
3461 sljit_set_compiler_memory_error(compiler);
3462 FAILED(sljit_get_compiler_error(compiler) != SLJIT_ERR_ALLOC_FAILED, "test39 case 5 failed\n");
3463 sljit_free_compiler(compiler);
3464
3465 successful_tests++;
3466 }
3467
3468 static void test40(void)
3469 {
3470 /* Test emit_op_flags. */
3471 executable_code code;
3472 struct sljit_compiler* compiler = sljit_create_compiler(NULL);
3473 sljit_sw buf[10];
3474
3475 if (verbose)
3476 printf("Run test40\n");
3477
3478 FAILED(!compiler, "cannot create compiler\n");
3479 buf[0] = -100;
3480 buf[1] = -100;
3481 buf[2] = -100;
3482 buf[3] = -8;
3483 buf[4] = -100;
3484 buf[5] = -100;
3485 buf[6] = 0;
3486 buf[7] = 0;
3487 buf[8] = -100;
3488 buf[9] = -100;
3489
3490 sljit_emit_enter(compiler, 0, 1, 3, 4, 0, 0, sizeof(sljit_sw));
3491
3492 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, -5);
3493 sljit_emit_op2(compiler, SLJIT_SUB | SLJIT_SET_S, SLJIT_UNUSED, 0, SLJIT_IMM, -6, SLJIT_R0, 0);
3494 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 0x123456);
3495 sljit_emit_op_flags(compiler, SLJIT_OR, SLJIT_R1, 0, SLJIT_R1, 0, SLJIT_SIG_LESS);
3496 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_R1, 0);
3497
3498 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, -13);
3499 sljit_emit_op2(compiler, SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, SLJIT_IMM, -13, SLJIT_R0, 0);
3500 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), 0, SLJIT_IMM, 0);
3501 sljit_emit_op_flags(compiler, SLJIT_OR | SLJIT_KEEP_FLAGS, SLJIT_MEM1(SLJIT_SP), 0, SLJIT_MEM1(SLJIT_SP), 0, SLJIT_EQUAL);
3502 sljit_emit_op_flags(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw), SLJIT_UNUSED, 0, SLJIT_EQUAL);
3503 sljit_emit_op2(compiler, SLJIT_OR | SLJIT_KEEP_FLAGS, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw), SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw), SLJIT_MEM1(SLJIT_SP), 0);
3504 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 0);
3505 sljit_emit_op_flags(compiler, SLJIT_OR | SLJIT_SET_E, SLJIT_R1, 0, SLJIT_R1, 0, SLJIT_EQUAL);
3506 sljit_emit_op_flags(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 2, SLJIT_UNUSED, 0, SLJIT_EQUAL);
3507
3508 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, -13);
3509 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 3);
3510 sljit_emit_op2(compiler, SLJIT_SUB | SLJIT_SET_S, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_R1, 0);
3511 sljit_emit_op_flags(compiler, SLJIT_OR, SLJIT_MEM2(SLJIT_S0, SLJIT_R1), SLJIT_WORD_SHIFT, SLJIT_MEM2(SLJIT_S0, SLJIT_R1), SLJIT_WORD_SHIFT, SLJIT_SIG_LESS);
3512
3513 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, -8);
3514 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 33);
3515 sljit_emit_op2(compiler, SLJIT_SUB | SLJIT_SET_U, SLJIT_UNUSED, 0, SLJIT_R0, 0, SLJIT_R1, 0);
3516 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S1, 0, SLJIT_IMM, 0);
3517 sljit_emit_op_flags(compiler, SLJIT_OR | SLJIT_SET_E, SLJIT_UNUSED, 0, SLJIT_UNUSED, 0, SLJIT_GREATER);
3518 sljit_emit_op_flags(compiler, SLJIT_OR | SLJIT_KEEP_FLAGS, SLJIT_S1, 0, SLJIT_S1, 0, SLJIT_EQUAL);
3519 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S3, 0, SLJIT_IMM, 0x88);
3520 sljit_emit_op_flags(compiler, SLJIT_OR | SLJIT_KEEP_FLAGS, SLJIT_S3, 0, SLJIT_S3, 0, SLJIT_NOT_EQUAL);
3521 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 4, SLJIT_S1, 0);
3522 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 5, SLJIT_S3, 0);
3523
3524 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 0x84);
3525 sljit_emit_op2(compiler, SLJIT_AND | SLJIT_SET_E, SLJIT_UNUSED, 0, SLJIT_IMM, 0x180, SLJIT_R0, 0);
3526 sljit_emit_op_flags(compiler, SLJIT_OR | SLJIT_SET_E, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 6, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 6, SLJIT_EQUAL);
3527 sljit_emit_op_flags(compiler, SLJIT_OR, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 7, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 7, SLJIT_EQUAL);
3528
3529 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 1);
3530 sljit_emit_op2(compiler, SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, SLJIT_R0, 0, SLJIT_IMM, 1);
3531 sljit_emit_op_flags(compiler, SLJIT_OR | SLJIT_SET_E, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_NOT_EQUAL);
3532 sljit_emit_op_flags(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 8, SLJIT_UNUSED, 0, SLJIT_NOT_EQUAL);
3533
3534 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 0x123456);
3535 sljit_emit_op2(compiler, SLJIT_SUB | SLJIT_SET_U, SLJIT_UNUSED, 0, SLJIT_R0, 0, SLJIT_IMM, 1);
3536 sljit_emit_op_flags(compiler, SLJIT_OR, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_GREATER);
3537 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw) * 9, SLJIT_R0, 0);
3538
3539 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), 0, SLJIT_IMM, 0xbaddead);
3540 sljit_emit_return(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), 0);
3541
3542 code.code = sljit_generate_code(compiler);
3543 CHECK(compiler);
3544 sljit_free_compiler(compiler);
3545
3546 FAILED(code.func1((sljit_sw)&buf) != 0xbaddead, "test40 case 1 failed\n");
3547 FAILED(buf[0] != 0x123457, "test40 case 2 failed\n");
3548 FAILED(buf[1] != 1, "test40 case 3 failed\n");
3549 FAILED(buf[2] != 0, "test40 case 4 failed\n");
3550 FAILED(buf[3] != -7, "test40 case 5 failed\n");
3551 FAILED(buf[4] != 0, "test40 case 6 failed\n");
3552 FAILED(buf[5] != 0x89, "test40 case 7 failed\n");
3553 FAILED(buf[6] != 0, "test40 case 8 failed\n");
3554 FAILED(buf[7] != 1, "test40 case 9 failed\n");
3555 FAILED(buf[8] != 1, "test40 case 10 failed\n");
3556 FAILED(buf[9] != 0x123457, "test40 case 11 failed\n");
3557
3558 sljit_free_code(code.code);
3559 successful_tests++;
3560 }
3561
3562 static void test41(void)
3563 {
3564 /* Test inline assembly. */
3565 executable_code code;
3566 struct sljit_compiler* compiler = sljit_create_compiler(NULL);
3567 sljit_s32 i;
3568 sljit_f64 buf[3];
3569 #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
3570 sljit_u8 inst[16];
3571 #elif (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
3572 sljit_u8 inst[16];
3573 sljit_s32 reg;
3574 #else
3575 sljit_u32 inst;
3576 #endif
3577
3578 if (verbose)
3579 printf("Run test41\n");
3580
3581 for (i = 0; i < SLJIT_NUMBER_OF_REGISTERS; i++) {
3582 #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
3583 if (SLJIT_R(i) >= SLJIT_R3 && SLJIT_R(i) <= SLJIT_R6) {
3584 SLJIT_ASSERT(sljit_get_register_index(SLJIT_R(i)) == -1);
3585 continue;
3586 }
3587 #endif
3588 SLJIT_ASSERT(sljit_get_register_index(SLJIT_R(i)) >= 0 && sljit_get_register_index(SLJIT_R(i)) < 64);
3589 }
3590
3591 FAILED(!compiler, "cannot create compiler\n");
3592 sljit_emit_enter(compiler, 0, 2, 3, 3, 0, 0, 0);
3593
3594 /* Returns with the sum of SLJIT_S0 and SLJIT_S1. */
3595 #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
3596 /* lea SLJIT_RETURN_REG, [SLJIT_S0, SLJIT_S1] */
3597 inst[0] = 0x48;
3598 inst[1] = 0x8d;
3599 inst[2] = 0x04 | ((sljit_get_register_index(SLJIT_RETURN_REG) & 0x7) << 3);
3600 inst[3] = (sljit_get_register_index(SLJIT_S0) & 0x7)
3601 | ((sljit_get_register_index(SLJIT_S1) & 0x7) << 3);
3602 sljit_emit_op_custom(compiler, inst, 4);
3603 #elif (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
3604 /* lea SLJIT_RETURN_REG, [SLJIT_S0, SLJIT_S1] */
3605 inst[0] = 0x48; /* REX_W */
3606 inst[1] = 0x8d;
3607 inst[2] = 0x04;
3608 reg = sljit_get_register_index(SLJIT_RETURN_REG);
3609 inst[2] |= ((reg & 0x7) << 3);
3610 if (reg > 7)
3611 inst[0] |= 0x04; /* REX_R */
3612 reg = sljit_get_register_index(SLJIT_S0);
3613 inst[3] = reg & 0x7;
3614 if (reg > 7)
3615 inst[0] |= 0x01; /* REX_B */
3616 reg = sljit_get_register_index(SLJIT_S1);
3617 inst[3] |= (reg & 0x7) << 3;
3618 if (reg > 7)
3619 inst[0] |= 0x02; /* REX_X */
3620 sljit_emit_op_custom(compiler, inst, 4);
3621 #elif (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) || (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7)
3622 /* add rd, rn, rm */
3623 inst = 0xe0800000 | (sljit_get_register_index(SLJIT_RETURN_REG) << 12)
3624 | (sljit_get_register_index(SLJIT_S0) << 16)
3625 | sljit_get_register_index(SLJIT_S1);
3626 sljit_emit_op_custom(compiler, &inst, sizeof(sljit_u32));
3627 #elif (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2)
3628 /* add rd, rn, rm */
3629 inst = 0xeb000000 | (sljit_get_register_index(SLJIT_RETURN_REG) << 8)
3630 | (sljit_get_register_index(SLJIT_S0) << 16)
3631 | sljit_get_register_index(SLJIT_S1);
3632 sljit_emit_op_custom(compiler, &inst, sizeof(sljit_u32));
3633 #elif (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64)
3634 /* add rd, rn, rm */
3635 inst = 0x8b000000 | sljit_get_register_index(SLJIT_RETURN_REG)
3636 | (sljit_get_register_index(SLJIT_S0) << 5)
3637 | (sljit_get_register_index(SLJIT_S1) << 16);
3638 sljit_emit_op_custom(compiler, &inst, sizeof(sljit_u32));
3639 #elif (defined SLJIT_CONFIG_PPC && SLJIT_CONFIG_PPC)
3640 /* add rD, rA, rB */
3641 inst = (31 << 26) | (266 << 1) | (sljit_get_register_index(SLJIT_RETURN_REG) << 21)
3642 | (sljit_get_register_index(SLJIT_S0) << 16)
3643 | (sljit_get_register_index(SLJIT_S1) << 11);
3644 sljit_emit_op_custom(compiler, &inst, sizeof(sljit_u32));
3645 #elif (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)
3646 /* addu rd, rs, rt */
3647 inst = 33 | (sljit_get_register_index(SLJIT_RETURN_REG) << 11)
3648 | (sljit_get_register_index(SLJIT_S0) << 21)
3649 | (sljit_get_register_index(SLJIT_S1) << 16);
3650 sljit_emit_op_custom(compiler, &inst, sizeof(sljit_u32));
3651 #elif (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64)
3652 /* daddu rd, rs, rt */
3653 inst = 45 | (sljit_get_register_index(SLJIT_RETURN_REG) << 11)
3654 | (sljit_get_register_index(SLJIT_S0) << 21)
3655 | (sljit_get_register_index(SLJIT_S1) << 16);
3656 sljit_emit_op_custom(compiler, &inst, sizeof(sljit_u32));
3657 #elif (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32)
3658 /* add rd, rs1, rs2 */
3659 inst = (0x2 << 30) | (sljit_get_register_index(SLJIT_RETURN_REG) << 25)
3660 | (sljit_get_register_index(SLJIT_S0) << 14)
3661 | sljit_get_register_index(SLJIT_S1);
3662 sljit_emit_op_custom(compiler, &inst, sizeof(sljit_u32));
3663 #else
3664 inst = 0;
3665 sljit_emit_op_custom(compiler, &inst, 0);
3666 #endif
3667
3668 sljit_emit_return(compiler, SLJIT_MOV, SLJIT_RETURN_REG, 0);
3669
3670 code.code = sljit_generate_code(compiler);
3671 CHECK(compiler);
3672 sljit_free_compiler(compiler);
3673
3674 FAILED(code.func2(32, -11) != 21, "test41 case 1 failed\n");
3675 FAILED(code.func2(1000, 234) != 1234, "test41 case 2 failed\n");
3676 #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
3677 FAILED(code.func2(SLJIT_W(0x20f0a04090c06070), SLJIT_W(0x020f0a04090c0607)) != SLJIT_W(0x22ffaa4499cc6677), "test41 case 3 failed\n");
3678 #endif
3679
3680 sljit_free_code(code.code);
3681
3682 if (sljit_is_fpu_available()) {
3683 buf[0] = 13.5;
3684 buf[1] = -2.25;
3685 buf[2] = 0.0;
3686
3687 compiler = sljit_create_compiler(NULL);
3688 sljit_emit_enter(compiler, 0, 1, 0, 1, 2, 0, 0);
3689 sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR0, 0, SLJIT_MEM1(SLJIT_S0), 0);
3690 sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR1, 0, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64));
3691 #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
3692 /* addsd x, xm */
3693 inst[0] = 0xf2;
3694 inst[1] = 0x0f;
3695 inst[2] = 0x58;
3696 inst[3] = 0xc0 | (sljit_get_float_register_index(SLJIT_FR0) << 3)
3697 | sljit_get_float_register_index(SLJIT_FR1);
3698 sljit_emit_op_custom(compiler, inst, 4);
3699 #elif (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
3700 /* addsd x, xm */
3701 if (sljit_get_float_register_index(SLJIT_FR0) > 7 || sljit_get_float_register_index(SLJIT_FR1) > 7) {
3702 inst[0] = 0;
3703 if (sljit_get_float_register_index(SLJIT_FR0) > 7)
3704 inst[0] |= 0x04; /* REX_R */
3705 if (sljit_get_float_register_index(SLJIT_FR1) > 7)
3706 inst[0] |= 0x01; /* REX_B */
3707 inst[1] = 0xf2;
3708 inst[2] = 0x0f;
3709 inst[3] = 0x58;
3710 inst[4] = 0xc0 | ((sljit_get_float_register_index(SLJIT_FR0) & 0x7) << 3)
3711 | (sljit_get_float_register_index(SLJIT_FR1) & 0x7);
3712 sljit_emit_op_custom(compiler, inst, 5);
3713 }
3714 else {
3715 inst[0] = 0xf2;
3716 inst[1] = 0x0f;
3717 inst[2] = 0x58;
3718 inst[3] = 0xc0 | (sljit_get_float_register_index(SLJIT_FR0) << 3)
3719 | sljit_get_float_register_index(SLJIT_FR1);
3720 sljit_emit_op_custom(compiler, inst, 4);
3721 }
3722 #elif (defined SLJIT_CONFIG_ARM_32 && SLJIT_CONFIG_ARM_32)
3723 /* vadd.f64 dd, dn, dm */
3724 inst = 0xee300b00 | ((sljit_get_float_register_index(SLJIT_FR0) >> 1) << 12)
3725 | ((sljit_get_float_register_index(SLJIT_FR0) >> 1) << 16)
3726 | (sljit_get_float_register_index(SLJIT_FR1) >> 1);
3727 sljit_emit_op_custom(compiler, &inst, sizeof(sljit_u32));
3728 #elif (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64)
3729 /* fadd rd, rn, rm */
3730 inst = 0x1e602800 | sljit_get_float_register_index(SLJIT_FR0)
3731 | (sljit_get_float_register_index(SLJIT_FR0) << 5)
3732 | (sljit_get_float_register_index(SLJIT_FR1) << 16);
3733 sljit_emit_op_custom(compiler, &inst, sizeof(sljit_u32));
3734 #elif (defined SLJIT_CONFIG_PPC && SLJIT_CONFIG_PPC)
3735 /* fadd frD, frA, frB */
3736 inst = (63 << 26) | (21 << 1) | (sljit_get_float_register_index(SLJIT_FR0) << 21)
3737 | (sljit_get_float_register_index(SLJIT_FR0) << 16)
3738 | (sljit_get_float_register_index(SLJIT_FR1) << 11);
3739 sljit_emit_op_custom(compiler, &inst, sizeof(sljit_u32));
3740 #elif (defined SLJIT_CONFIG_MIPS && SLJIT_CONFIG_MIPS)
3741 /* add.d fd, fs, ft */
3742 inst = (17 << 26) | (17 << 21) | (sljit_get_float_register_index(SLJIT_FR0) << 6)
3743 | (sljit_get_float_register_index(SLJIT_FR0) << 11)
3744 | (sljit_get_float_register_index(SLJIT_FR1) << 16);
3745 sljit_emit_op_custom(compiler, &inst, sizeof(sljit_u32));
3746 #elif (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32)
3747 /* faddd rd, rs1, rs2 */
3748 inst = (0x2 << 30) | (0x34 << 19) | (0x42 << 5)
3749 | (sljit_get_float_register_index(SLJIT_FR0) << 25)
3750 | (sljit_get_float_register_index(SLJIT_FR0) << 14)
3751 | sljit_get_float_register_index(SLJIT_FR1);
3752 sljit_emit_op_custom(compiler, &inst, sizeof(sljit_u32));
3753 #endif
3754 sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), 2 * sizeof(sljit_f64), SLJIT_FR0, 0);
3755 sljit_emit_return(compiler, SLJIT_UNUSED, 0, 0);
3756
3757 code.code = sljit_generate_code(compiler);
3758 CHECK(compiler);
3759 sljit_free_compiler(compiler);
3760
3761 code.func1((sljit_sw)&buf);
3762 FAILED(buf[2] != 11.25, "test41 case 3 failed\n");
3763
3764 sljit_free_code(code.code);
3765 }
3766
3767 successful_tests++;
3768 }
3769
3770 static void test42(void)
3771 {
3772 /* Test long multiply and division. */
3773 executable_code code;
3774 struct sljit_compiler* compiler = sljit_create_compiler(NULL);
3775 sljit_s32 i;
3776 sljit_sw buf[7 + 4 + 8 + 8];
3777
3778 if (verbose)
3779 printf("Run test42\n");
3780
3781 FAILED(!compiler, "cannot create compiler\n");
3782 for (i = 0; i < 7 + 4 + 8 + 8; i++)
3783 buf[i] = -1;
3784
3785 sljit_emit_enter(compiler, 0, 1, 5, 5, 0, 0, 0);
3786
3787 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, -0x1fb308a);
3788 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R3, 0, SLJIT_IMM, 0xf50c873);
3789 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R4, 0, SLJIT_IMM, 0x8a0475b);
3790 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S1, 0, SLJIT_IMM, 0x9dc849b);
3791 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S2, 0, SLJIT_IMM, -0x7c69a35);
3792 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S3, 0, SLJIT_IMM, 0x5a4d0c4);
3793 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S4, 0, SLJIT_IMM, 0x9a3b06d);
3794
3795 #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
3796 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, SLJIT_W(-0x5dc4f897b8cd67f5));
3797 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, SLJIT_W(0x3f8b5c026cb088df));
3798 sljit_emit_op0(compiler, SLJIT_LMUL_UW);
3799 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 7 * sizeof(sljit_sw), SLJIT_R0, 0);
3800 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 8 * sizeof(sljit_sw), SLJIT_R1, 0);
3801
3802 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, SLJIT_W(-0x5dc4f897b8cd67f5));
3803 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, SLJIT_W(0x3f8b5c026cb088df));
3804 sljit_emit_op0(compiler, SLJIT_LMUL_SW);
3805 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 9 * sizeof(sljit_sw), SLJIT_R0, 0);
3806 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 10 * sizeof(sljit_sw), SLJIT_R1, 0);
3807
3808 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, SLJIT_W(-0x5dc4f897b8cd67f5));
3809 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, SLJIT_W(0x3f8b5c026cb088df));
3810 sljit_emit_op0(compiler, SLJIT_DIVMOD_UW);
3811 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 11 * sizeof(sljit_sw), SLJIT_R0, 0);
3812 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 12 * sizeof(sljit_sw), SLJIT_R1, 0);
3813
3814 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, SLJIT_W(-0x5dc4f897b8cd67f5));
3815 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, SLJIT_W(0x3f8b5c026cb088df));
3816 sljit_emit_op0(compiler, SLJIT_DIVMOD_SW);
3817 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 13 * sizeof(sljit_sw), SLJIT_R0, 0);
3818 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 14 * sizeof(sljit_sw), SLJIT_R1, 0);
3819
3820 sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R0, 0, SLJIT_IMM, SLJIT_W(0x5cf783d3cf0a74b0));
3821 sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R1, 0, SLJIT_IMM, SLJIT_W(0x3d5df42d03a28fc7));
3822 sljit_emit_op0(compiler, SLJIT_DIVMOD_U32);
3823 sljit_emit_op1(compiler, SLJIT_MOV_U32, SLJIT_R0, 0, SLJIT_R0, 0);
3824 sljit_emit_op1(compiler, SLJIT_MOV_U32, SLJIT_R1, 0, SLJIT_R1, 0);
3825 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 15 * sizeof(sljit_sw), SLJIT_R0, 0);
3826 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 16 * sizeof(sljit_sw), SLJIT_R1, 0);
3827
3828 sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R0, 0, SLJIT_IMM, SLJIT_W(0x371df5197ba26a28));
3829 sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R1, 0, SLJIT_IMM, SLJIT_W(0x46c78a5cfd6a420c));
3830 sljit_emit_op0(compiler, SLJIT_DIVMOD_S32);
3831 sljit_emit_op1(compiler, SLJIT_MOV_S32, SLJIT_R0, 0, SLJIT_R0, 0);
3832 sljit_emit_op1(compiler, SLJIT_MOV_S32, SLJIT_R1, 0, SLJIT_R1, 0);
3833 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 17 * sizeof(sljit_sw), SLJIT_R0, 0);
3834 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 18 * sizeof(sljit_sw), SLJIT_R1, 0);
3835
3836 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, SLJIT_W(0xc456f048c28a611b));
3837 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, SLJIT_W(0x3d4af2c543));
3838 sljit_emit_op0(compiler, SLJIT_DIV_UW);
3839 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 19 * sizeof(sljit_sw), SLJIT_R0, 0);
3840 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 20 * sizeof(sljit_sw), SLJIT_R1, 0);
3841
3842 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, SLJIT_W(-0x720fa4b74c329b14));
3843 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, SLJIT_W(0xa64ae42b7d6));
3844 sljit_emit_op0(compiler, SLJIT_DIV_SW);
3845 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 21 * sizeof(sljit_sw), SLJIT_R0, 0);
3846 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 22 * sizeof(sljit_sw), SLJIT_R1, 0);
3847
3848 sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R0, 0, SLJIT_IMM, SLJIT_W(0x4af51c027b34));
3849 sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R1, 0, SLJIT_IMM, SLJIT_W(0x9ba4ff2906b14));
3850 sljit_emit_op0(compiler, SLJIT_DIV_U32);
3851 sljit_emit_op1(compiler, SLJIT_MOV_U32, SLJIT_R0, 0, SLJIT_R0, 0);
3852 sljit_emit_op1(compiler, SLJIT_MOV_U32, SLJIT_R1, 0, SLJIT_R1, 0);
3853 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 23 * sizeof(sljit_sw), SLJIT_R0, 0);
3854 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 24 * sizeof(sljit_sw), SLJIT_R1, 0);
3855
3856 sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R0, 0, SLJIT_IMM, SLJIT_W(0xc40b58a3f20d));
3857 sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R1, 0, SLJIT_IMM, SLJIT_W(-0xa63c923));
3858 sljit_emit_op0(compiler, SLJIT_DIV_S32);
3859 sljit_emit_op1(compiler, SLJIT_MOV_S32, SLJIT_R0, 0, SLJIT_R0, 0);
3860 sljit_emit_op1(compiler, SLJIT_MOV_S32, SLJIT_R1, 0, SLJIT_R1, 0);
3861 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 25 * sizeof(sljit_sw), SLJIT_R0, 0);
3862 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 26 * sizeof(sljit_sw), SLJIT_R1, 0);
3863
3864 #else
3865 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, -0x58cd67f5);
3866 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 0x3cb088df);
3867 sljit_emit_op0(compiler, SLJIT_LMUL_UW);
3868 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 7 * sizeof(sljit_sw), SLJIT_R0, 0);
3869 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 8 * sizeof(sljit_sw), SLJIT_R1, 0);
3870
3871 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, -0x58cd67f5);
3872 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 0x3cb088df);
3873 sljit_emit_op0(compiler, SLJIT_LMUL_SW);
3874 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 9 * sizeof(sljit_sw), SLJIT_R0, 0);
3875 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 10 * sizeof(sljit_sw), SLJIT_R1, 0);
3876
3877 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, -0x58cd67f5);
3878 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 0x3cb088df);
3879 sljit_emit_op0(compiler, SLJIT_DIVMOD_UW);
3880 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 11 * sizeof(sljit_sw), SLJIT_R0, 0);
3881 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 12 * sizeof(sljit_sw), SLJIT_R1, 0);
3882
3883 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, -0x58cd67f5);
3884 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 0x3cb088df);
3885 sljit_emit_op0(compiler, SLJIT_DIVMOD_SW);
3886 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 13 * sizeof(sljit_sw), SLJIT_R0, 0);
3887 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 14 * sizeof(sljit_sw), SLJIT_R1, 0);
3888
3889 sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R0, 0, SLJIT_IMM, 0xcf0a74b0);
3890 sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R1, 0, SLJIT_IMM, 0x03a28fc7);
3891 sljit_emit_op0(compiler, SLJIT_DIVMOD_U32);
3892 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 15 * sizeof(sljit_sw), SLJIT_R0, 0);
3893 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 16 * sizeof(sljit_sw), SLJIT_R1, 0);
3894
3895 sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R0, 0, SLJIT_IMM, 0x7ba26a28);
3896 sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R1, 0, SLJIT_IMM, (sljit_sw)0xfd6a420c);
3897 sljit_emit_op0(compiler, SLJIT_DIVMOD_S32);
3898 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 17 * sizeof(sljit_sw), SLJIT_R0, 0);
3899 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 18 * sizeof(sljit_sw), SLJIT_R1, 0);
3900
3901 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, SLJIT_W(0x9d4b7036));
3902 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, SLJIT_W(0xb86d0));
3903 sljit_emit_op0(compiler, SLJIT_DIV_UW);
3904 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 19 * sizeof(sljit_sw), SLJIT_R0, 0);
3905 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 20 * sizeof(sljit_sw), SLJIT_R1, 0);
3906
3907 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, SLJIT_W(-0x58b0692c));
3908 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, SLJIT_W(0xd357));
3909 sljit_emit_op0(compiler, SLJIT_DIV_SW);
3910 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 21 * sizeof(sljit_sw), SLJIT_R0, 0);
3911 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 22 * sizeof(sljit_sw), SLJIT_R1, 0);
3912
3913 sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R0, 0, SLJIT_IMM, SLJIT_W(0x1c027b34));
3914 sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R1, 0, SLJIT_IMM, SLJIT_W(0xf2906b14));
3915 sljit_emit_op0(compiler, SLJIT_DIV_U32);
3916 sljit_emit_op1(compiler, SLJIT_MOV_U32, SLJIT_R0, 0, SLJIT_R0, 0);
3917 sljit_emit_op1(compiler, SLJIT_MOV_U32, SLJIT_R1, 0, SLJIT_R1, 0);
3918 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 23 * sizeof(sljit_sw), SLJIT_R0, 0);
3919 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 24 * sizeof(sljit_sw), SLJIT_R1, 0);
3920
3921 sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R0, 0, SLJIT_IMM, SLJIT_W(0x58a3f20d));
3922 sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R1, 0, SLJIT_IMM, SLJIT_W(-0xa63c923));
3923 sljit_emit_op0(compiler, SLJIT_DIV_S32);
3924 sljit_emit_op1(compiler, SLJIT_MOV_S32, SLJIT_R0, 0, SLJIT_R0, 0);
3925 sljit_emit_op1(compiler, SLJIT_MOV_S32, SLJIT_R1, 0, SLJIT_R1, 0);
3926 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 25 * sizeof(sljit_sw), SLJIT_R0, 0);
3927 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 26 * sizeof(sljit_sw), SLJIT_R1, 0);
3928 #endif
3929
3930 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_R2, 0);
3931 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw), SLJIT_R3, 0);
3932 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 2 * sizeof(sljit_sw), SLJIT_R4, 0);
3933 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 3 * sizeof(sljit_sw), SLJIT_S1, 0);
3934 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 4 * sizeof(sljit_sw), SLJIT_S2, 0);
3935 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 5 * sizeof(sljit_sw), SLJIT_S3, 0);
3936 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 6 * sizeof(sljit_sw), SLJIT_S4, 0);
3937
3938 sljit_emit_return(compiler, SLJIT_UNUSED, 0, 0);
3939
3940 code.code = sljit_generate_code(compiler);
3941 CHECK(compiler);
3942 sljit_free_compiler(compiler);
3943
3944 code.func1((sljit_sw)&buf);
3945
3946 FAILED(buf[0] != -0x1fb308a, "test42 case 1 failed\n");
3947 FAILED(buf[1] != 0xf50c873, "test42 case 2 failed\n");
3948 FAILED(buf[2] != 0x8a0475b, "test42 case 3 failed\n");
3949 FAILED(buf[3] != 0x9dc849b, "test42 case 4 failed\n");
3950 FAILED(buf[4] != -0x7c69a35, "test42 case 5 failed\n");
3951 FAILED(buf[5] != 0x5a4d0c4, "test42 case 6 failed\n");
3952 FAILED(buf[6] != 0x9a3b06d, "test42 case 7 failed\n");
3953
3954 #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
3955 FAILED(buf[7] != SLJIT_W(-4388959407985636971), "test42 case 8 failed\n");
3956 FAILED(buf[8] != SLJIT_W(2901680654366567099), "test42 case 9 failed\n");
3957 FAILED(buf[9] != SLJIT_W(-4388959407985636971), "test42 case 10 failed\n");
3958 FAILED(buf[10] != SLJIT_W(-1677173957268872740), "test42 case 11 failed\n");
3959 FAILED(buf[11] != SLJIT_W(2), "test42 case 12 failed\n");
3960 FAILED(buf[12] != SLJIT_W(2532236178951865933), "test42 case 13 failed\n");
3961 FAILED(buf[13] != SLJIT_W(-1), "test42 case 14 failed\n");
3962 FAILED(buf[14] != SLJIT_W(-2177944059851366166), "test42 case 15 failed\n");
3963 #else
3964 FAILED(buf[7] != -1587000939, "test42 case 8 failed\n");
3965 FAILED(buf[8] != 665003983, "test42 case 9 failed\n");
3966 FAILED(buf[9] != -1587000939, "test42 case 10 failed\n");
3967 FAILED(buf[10] != -353198352, "test42 case 11 failed\n");
3968 FAILED(buf[11] != 2, "test42 case 12 failed\n");
3969 FAILED(buf[12] != 768706125, "test42 case 13 failed\n");
3970 FAILED(buf[13] != -1, "test42 case 14 failed\n");
3971 FAILED(buf[14] != -471654166, "test42 case 15 failed\n");
3972 #endif
3973
3974 FAILED(buf[15] != SLJIT_W(56), "test42 case 16 failed\n");
3975 FAILED(buf[16] != SLJIT_W(58392872), "test42 case 17 failed\n");
3976 FAILED(buf[17] != SLJIT_W(-47), "test42 case 18 failed\n");
3977 FAILED(buf[18] != SLJIT_W(35949148), "test42 case 19 failed\n");
3978
3979 #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
3980 FAILED(buf[19] != SLJIT_W(0x3340bfc), "test42 case 20 failed\n");
3981 FAILED(buf[20] != SLJIT_W(0x3d4af2c543), "test42 case 21 failed\n");
3982 FAILED(buf[21] != SLJIT_W(-0xaf978), "test42 case 22 failed\n");
3983 FAILED(buf[22] != SLJIT_W(0xa64ae42b7d6), "test42 case 23 failed\n");
3984 #else
3985 FAILED(buf[19] != SLJIT_W(0xda5), "test42 case 20 failed\n");
3986 FAILED(buf[20] != SLJIT_W(0xb86d0), "test42 case 21 failed\n");
3987 FAILED(buf[21] != SLJIT_W(-0x6b6e), "test42 case 22 failed\n");
3988 FAILED(buf[22] != SLJIT_W(0xd357), "test42 case 23 failed\n");
3989 #endif
3990
3991 FAILED(buf[23] != SLJIT_W(0x0), "test42 case 24 failed\n");
3992 FAILED(buf[24] != SLJIT_W(0xf2906b14), "test42 case 25 failed\n");
3993 FAILED(buf[25] != SLJIT_W(-0x8), "test42 case 26 failed\n");
3994 FAILED(buf[26] != SLJIT_W(-0xa63c923), "test42 case 27 failed\n");
3995
3996 sljit_free_code(code.code);
3997 successful_tests++;
3998 }
3999
4000 static void test43(void)
4001 {
4002 /* Test floating point compare. */
4003 executable_code code;
4004 struct sljit_compiler* compiler = sljit_create_compiler(NULL);
4005 struct sljit_jump* jump;
4006
4007 union {
4008 sljit_f64 value;
4009 struct {
4010 sljit_u32 value1;
4011 sljit_u32 value2;
4012 } u;
4013 } dbuf[4];
4014
4015 if (verbose)
4016 printf("Run test43\n");
4017
4018 if (!sljit_is_fpu_available()) {
4019 if (verbose)
4020 printf("no fpu available, test43 skipped\n");
4021 successful_tests++;
4022 if (compiler)
4023 sljit_free_compiler(compiler);
4024 return;
4025 }
4026
4027 FAILED(!compiler, "cannot create compiler\n");
4028
4029 dbuf[0].value = 12.125;
4030 /* a NaN */
4031 dbuf[1].u.value1 = 0x7fffffff;
4032 dbuf[1].u.value2 = 0x7fffffff;
4033 dbuf[2].value = -13.5;
4034 dbuf[3].value = 12.125;
4035
4036 sljit_emit_enter(compiler, 0, 1, 1, 1, 3, 0, 0);
4037 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 2);
4038 /* dbuf[0] < dbuf[2] -> -2 */
4039 jump = sljit_emit_fcmp(compiler, SLJIT_GREATER_EQUAL_F64, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_MEM2(SLJIT_S0, SLJIT_R0), SLJIT_F64_SHIFT);
4040 sljit_emit_return(compiler, SLJIT_MOV, SLJIT_IMM, -2);
4041
4042 sljit_set_label(jump, sljit_emit_label(compiler));
4043 sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR1, 0, SLJIT_MEM1(SLJIT_S0), 0);
4044 /* dbuf[0] and dbuf[1] is not NaN -> 5 */
4045 jump = sljit_emit_fcmp(compiler, SLJIT_UNORDERED_F64, SLJIT_MEM0(), (sljit_sw)&dbuf[1], SLJIT_FR1, 0);
4046 sljit_emit_return(compiler, SLJIT_MOV, SLJIT_IMM, 5);
4047
4048 sljit_set_label(jump, sljit_emit_label(compiler));
4049 sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR2, 0, SLJIT_MEM1(SLJIT_S0), 3 * sizeof(sljit_f64));
4050 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_RETURN_REG, 0, SLJIT_IMM, 11);
4051 /* dbuf[0] == dbuf[3] -> 11 */
4052 jump = sljit_emit_fcmp(compiler, SLJIT_EQUAL_F64, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_FR2, 0);
4053
4054 /* else -> -17 */
4055 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_RETURN_REG, 0, SLJIT_IMM, -17);
4056 sljit_set_label(jump, sljit_emit_label(compiler));
4057 sljit_emit_return(compiler, SLJIT_MOV, SLJIT_RETURN_REG, 0);
4058
4059 code.code = sljit_generate_code(compiler);
4060 CHECK(compiler);
4061 sljit_free_compiler(compiler);
4062
4063 FAILED(code.func1((sljit_sw)&dbuf) != 11, "test43 case 1 failed\n");
4064 dbuf[3].value = 12;
4065 FAILED(code.func1((sljit_sw)&dbuf) != -17, "test43 case 2 failed\n");
4066 dbuf[1].value = 0;
4067 FAILED(code.func1((sljit_sw)&dbuf) != 5, "test43 case 3 failed\n");
4068 dbuf[2].value = 20;
4069 FAILED(code.func1((sljit_sw)&dbuf) != -2, "test43 case 4 failed\n");
4070
4071 sljit_free_code(code.code);
4072 successful_tests++;
4073 }
4074
4075 static void test44(void)
4076 {
4077 /* Test mov. */
4078 executable_code code;
4079 struct sljit_compiler* compiler = sljit_create_compiler(NULL);
4080 void *buf[5];
4081
4082 if (verbose)
4083 printf("Run test44\n");
4084
4085 FAILED(!compiler, "cannot create compiler\n");
4086
4087 buf[0] = buf + 2;
4088 buf[1] = NULL;
4089 buf[2] = NULL;
4090 buf[3] = NULL;
4091 buf[4] = NULL;
4092 sljit_emit_enter(compiler, 0, 1, 3, 2, 0, 0, 0);
4093
4094 sljit_emit_op1(compiler, SLJIT_MOV_P, SLJIT_R0, 0, SLJIT_MEM1(SLJIT_S0), 0);
4095 sljit_emit_op1(compiler, SLJIT_MOV_P, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_p), SLJIT_R0, 0);
4096 sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_IMM, sizeof(sljit_p));
4097 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 2);
4098 sljit_emit_op1(compiler, SLJIT_MOV_P, SLJIT_MEM2(SLJIT_S0, SLJIT_R1), SLJIT_POINTER_SHIFT, SLJIT_R0, 0);
4099 sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_IMM, sizeof(sljit_p));
4100 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 3);
4101 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_S0, 0);
4102 sljit_emit_op1(compiler, SLJIT_MOVU_P, SLJIT_MEM2(SLJIT_R2, SLJIT_R1), SLJIT_POINTER_SHIFT, SLJIT_R0, 0);
4103 sljit_emit_op2(compiler, SLJIT_SUB, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_IMM, 2 * sizeof(sljit_p));
4104 sljit_emit_op1(compiler, SLJIT_MOV_P, SLJIT_MEM1(SLJIT_R2), sizeof(sljit_p), SLJIT_R0, 0);
4105
4106 sljit_emit_return(compiler, SLJIT_MOV, SLJIT_R0, 0);
4107
4108 code.code = sljit_generate_code(compiler);
4109 CHECK(compiler);
4110 sljit_free_compiler(compiler);
4111
4112 FAILED(code.func1((sljit_sw)&buf) != (sljit_sw)(buf + 2), "test44 case 1 failed\n");
4113 FAILED(buf[1] != buf + 2, "test44 case 2 failed\n");
4114 FAILED(buf[2] != buf + 3, "test44 case 3 failed\n");
4115 FAILED(buf[3] != buf + 4, "test44 case 4 failed\n");
4116 FAILED(buf[4] != buf + 2, "test44 case 5 failed\n");
4117
4118 sljit_free_code(code.code);
4119 successful_tests++;
4120 }
4121
4122 static void test45(void)
4123 {
4124 /* Test single precision floating point. */
4125
4126 executable_code code;
4127 struct sljit_compiler* compiler = sljit_create_compiler(NULL);
4128 sljit_f32 buf[12];
4129 sljit_sw buf2[6];
4130 struct sljit_jump* jump;
4131
4132 if (verbose)
4133 printf("Run test45\n");
4134
4135 if (!sljit_is_fpu_available()) {
4136 if (verbose)
4137 printf("no fpu available, test45 skipped\n");
4138 successful_tests++;
4139 if (compiler)
4140 sljit_free_compiler(compiler);
4141 return;
4142 }
4143
4144 FAILED(!compiler, "cannot create compiler\n");
4145
4146 buf[0] = 5.5;
4147 buf[1] = -7.25;
4148 buf[2] = 0;
4149 buf[3] = 0;
4150 buf[4] = 0;
4151 buf[5] = 0;
4152 buf[6] = 0;
4153 buf[7] = 8.75;
4154 buf[8] = 0;
4155 buf[9] = 16.5;
4156 buf[10] = 0;
4157 buf[11] = 0;
4158
4159 buf2[0] = -1;
4160 buf2[1] = -1;
4161 buf2[2] = -1;
4162 buf2[3] = -1;
4163 buf2[4] = -1;
4164 buf2[5] = -1;
4165
4166 sljit_emit_enter(compiler, 0, 2, 3, 2, 6, 0, 0);
4167
4168 sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_FR0, 0, SLJIT_MEM1(SLJIT_S0), 0);
4169 sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_FR5, 0, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f32));
4170 sljit_emit_fop1(compiler, SLJIT_NEG_F32, SLJIT_MEM1(SLJIT_S0), 2 * sizeof(sljit_f32), SLJIT_FR0, 0);
4171 sljit_emit_fop1(compiler, SLJIT_ABS_F32, SLJIT_FR1, 0, SLJIT_FR5, 0);
4172 sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_MEM1(SLJIT_S0), 3 * sizeof(sljit_f32), SLJIT_FR1, 0);
4173 sljit_emit_fop1(compiler, SLJIT_ABS_F32, SLJIT_MEM1(SLJIT_S0), 4 * sizeof(sljit_f32), SLJIT_FR5, 0);
4174 sljit_emit_fop1(compiler, SLJIT_NEG_F32, SLJIT_FR4, 0, SLJIT_MEM1(SLJIT_S0), 0);
4175 sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_MEM1(SLJIT_S0), 5 * sizeof(sljit_f32), SLJIT_FR4, 0);
4176
4177 sljit_emit_fop2(compiler, SLJIT_ADD_F32, SLJIT_FR0, 0, SLJIT_FR0, 0, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f32));
4178 sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_MEM1(SLJIT_S0), 6 * sizeof(sljit_f32), SLJIT_FR0, 0);
4179 sljit_emit_fop2(compiler, SLJIT_SUB_F32, SLJIT_MEM1(SLJIT_S0), 7 * sizeof(sljit_f32), SLJIT_MEM1(SLJIT_S0), 7 * sizeof(sljit_f32), SLJIT_FR5, 0);
4180 sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_FR0, 0, SLJIT_MEM1(SLJIT_S0), 0);
4181 sljit_emit_fop2(compiler, SLJIT_MUL_F32, SLJIT_MEM1(SLJIT_S0), 8 * sizeof(sljit_f32), SLJIT_FR0, 0, SLJIT_FR0, 0);
4182 sljit_emit_fop2(compiler, SLJIT_DIV_F32, SLJIT_FR2, 0, SLJIT_MEM1(SLJIT_S0), 9 * sizeof(sljit_f32), SLJIT_FR0, 0);
4183 sljit_emit_fop1(compiler, SLJIT_ABS_F32, SLJIT_MEM1(SLJIT_S0), 9 * sizeof(sljit_f32), SLJIT_FR2, 0);
4184 sljit_emit_op2(compiler, SLJIT_SUB, SLJIT_R0, 0, SLJIT_S0, 0, SLJIT_IMM, 0x3d0ac);
4185 sljit_emit_fop1(compiler, SLJIT_NEG_F32, SLJIT_MEM1(SLJIT_S0), 10 * sizeof(sljit_f32), SLJIT_MEM1(SLJIT_R0), 0x3d0ac);
4186 sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R0, 0, SLJIT_S0, 0, SLJIT_IMM, 0x3d0ac + sizeof(sljit_f32));
4187 sljit_emit_fop1(compiler, SLJIT_ABS_F32, SLJIT_MEM1(SLJIT_S0), 11 * sizeof(sljit_f32), SLJIT_MEM1(SLJIT_R0), -0x3d0ac);
4188
4189 sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_FR1, 0, SLJIT_MEM1(SLJIT_S0), 0);
4190 sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_FR2, 0, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f32));
4191 sljit_emit_fop1(compiler, SLJIT_CMP_F32 | SLJIT_SET_E | SLJIT_SET_S, SLJIT_FR1, 0, SLJIT_MEM1(SLJIT_S0), 0);
4192 cond_set(compiler, SLJIT_MEM1(SLJIT_S1), 0, SLJIT_EQUAL_F32);
4193 cond_set(compiler, SLJIT_MEM1(SLJIT_S1), sizeof(sljit_sw), SLJIT_LESS_F32);
4194 sljit_emit_fop1(compiler, SLJIT_CMP_F32 | SLJIT_SET_E, SLJIT_FR1, 0, SLJIT_FR2, 0);
4195 cond_set(compiler, SLJIT_MEM1(SLJIT_S1), 2 * sizeof(sljit_sw), SLJIT_EQUAL_F32);
4196 sljit_emit_fop1(compiler, SLJIT_CMP_F32 | SLJIT_SET_S, SLJIT_FR1, 0, SLJIT_FR2, 0);
4197 cond_set(compiler, SLJIT_MEM1(SLJIT_S1), 3 * sizeof(sljit_sw), SLJIT_GREATER_EQUAL_F32);
4198
4199 jump = sljit_emit_fcmp(compiler, SLJIT_LESS_EQUAL_F32, SLJIT_FR1, 0, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f32));
4200 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S1), 4 * sizeof(sljit_sw), SLJIT_IMM, 7);
4201 sljit_set_label(jump, sljit_emit_label(compiler));
4202
4203 jump = sljit_emit_fcmp(compiler, SLJIT_GREATER_F32, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_FR2, 0);
4204 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S1), 5 * sizeof(sljit_sw), SLJIT_IMM, 6);
4205 sljit_set_label(jump, sljit_emit_label(compiler));
4206
4207 sljit_emit_return(compiler, SLJIT_MOV, SLJIT_R0, 0);
4208
4209 code.code = sljit_generate_code(compiler);
4210 CHECK(compiler);
4211 sljit_free_compiler(compiler);
4212
4213 code.func2((sljit_sw)&buf, (sljit_sw)&buf2);
4214 FAILED(buf[2] != -5.5, "test45 case 1 failed\n");
4215 FAILED(buf[3] != 7.25, "test45 case 2 failed\n");
4216 FAILED(buf[4] != 7.25, "test45 case 3 failed\n");
4217 FAILED(buf[5] != -5.5, "test45 case 4 failed\n");
4218 FAILED(buf[6] != -1.75, "test45 case 5 failed\n");
4219 FAILED(buf[7] != 16.0, "test45 case 6 failed\n");
4220 FAILED(buf[8] != 30.25, "test45 case 7 failed\n");
4221 FAILED(buf[9] != 3, "test45 case 8 failed\n");
4222 FAILED(buf[10] != -5.5, "test45 case 9 failed\n");
4223 FAILED(buf[11] != 7.25, "test45 case 10 failed\n");
4224 FAILED(buf2[0] != 1, "test45 case 11 failed\n");
4225 FAILED(buf2[1] != 2, "test45 case 12 failed\n");
4226 FAILED(buf2[2] != 2, "test45 case 13 failed\n");
4227 FAILED(buf2[3] != 1, "test45 case 14 failed\n");
4228 FAILED(buf2[4] != 7, "test45 case 15 failed\n");
4229 FAILED(buf2[5] != -1, "test45 case 16 failed\n");
4230
4231 sljit_free_code(code.code);
4232 successful_tests++;
4233 }
4234
4235 static void test46(void)
4236 {
4237 /* Test sljit_emit_op_flags with 32 bit operations. */
4238
4239 executable_code code;
4240 struct sljit_compiler* compiler = sljit_create_compiler(NULL);
4241 sljit_s32 buf[24];
4242 sljit_sw buf2[6];
4243 sljit_s32 i;
4244
4245 if (verbose)
4246 printf("Run test46\n");
4247
4248 for (i = 0; i < 24; ++i)
4249 buf[i] = -17;
4250 buf[16] = 0;
4251 for (i = 0; i < 6; ++i)
4252 buf2[i] = -13;
4253 buf2[4] = -124;
4254
4255 sljit_emit_enter(compiler, 0, 2, 3, 3, 0, 0, 0);
4256
4257 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, -7);
4258 sljit_emit_op2(compiler, SLJIT_SUB | SLJIT_SET_E | SLJIT_SET_U, SLJIT_UNUSED, 0, SLJIT_R2, 0, SLJIT_IMM, 13);
4259 sljit_emit_op_flags(compiler, SLJIT_MOV_S32, SLJIT_MEM0(), (sljit_sw)&buf, SLJIT_UNUSED, 0, SLJIT_LESS);
4260 sljit_emit_op_flags(compiler, SLJIT_AND32, SLJIT_MEM1(SLJIT_S0), 2 * sizeof(sljit_s32), SLJIT_MEM1(SLJIT_S0), 2 * sizeof(sljit_s32), SLJIT_GREATER);
4261
4262 sljit_emit_op2(compiler, SLJIT_SUB | SLJIT_SET_E | SLJIT_SET_U, SLJIT_UNUSED, 0, SLJIT_R2, 0, SLJIT_IMM, -7);
4263 sljit_emit_op_flags(compiler, SLJIT_AND32 | SLJIT_KEEP_FLAGS, SLJIT_MEM1(SLJIT_S0), 4 * sizeof(sljit_s32), SLJIT_MEM1(SLJIT_S0), 4 * sizeof(sljit_s32), SLJIT_EQUAL);
4264 sljit_emit_op_flags(compiler, SLJIT_AND32 | SLJIT_KEEP_FLAGS, SLJIT_MEM1(SLJIT_S0), 6 * sizeof(sljit_s32), SLJIT_MEM1(SLJIT_S0), 6 * sizeof(sljit_s32), SLJIT_EQUAL);
4265 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 0x1235);
4266 sljit_emit_op_flags(compiler, SLJIT_AND32 | SLJIT_SET_E, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_EQUAL);
4267 sljit_emit_op_flags(compiler, SLJIT_AND32, SLJIT_MEM1(SLJIT_S0), 8 * sizeof(sljit_s32), SLJIT_MEM1(SLJIT_S0), 8 * sizeof(sljit_s32), SLJIT_EQUAL32);
4268 sljit_emit_op1(compiler, SLJIT_MOV_U32, SLJIT_MEM1(SLJIT_S0), 10 * sizeof(sljit_s32), SLJIT_R0, 0);
4269
4270 sljit_emit_op2(compiler, SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, SLJIT_R2, 0, SLJIT_IMM, -7);
4271 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 12);
4272 sljit_emit_op_flags(compiler, SLJIT_MOV_U32, SLJIT_MEM2(SLJIT_S0, SLJIT_R0), 2, SLJIT_UNUSED, 0, SLJIT_EQUAL);
4273 sljit_emit_op_flags(compiler, SLJIT_MOV32, SLJIT_R0, 0, SLJIT_UNUSED, 0, SLJIT_EQUAL);
4274 sljit_emit_op1(compiler, SLJIT_MOV_S32, SLJIT_MEM1(SLJIT_S0), 14 * sizeof(sljit_s32), SLJIT_R0, 0);
4275 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 16);
4276 sljit_emit_op_flags(compiler, SLJIT_AND32 | SLJIT_SET_E, SLJIT_MEM2(SLJIT_S0, SLJIT_R0), 2, SLJIT_MEM2(SLJIT_S0, SLJIT_R0), 2, SLJIT_EQUAL);
4277 sljit_emit_op_flags(compiler, SLJIT_MOV_U32, SLJIT_MEM1(SLJIT_S0), 18 * sizeof(sljit_s32), SLJIT_UNUSED, 0, SLJIT_NOT_EQUAL32);
4278
4279 sljit_emit_op2(compiler, SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, SLJIT_R2, 0, SLJIT_IMM, -7);
4280 sljit_emit_op_flags(compiler, SLJIT_XOR32 | SLJIT_KEEP_FLAGS, SLJIT_MEM1(SLJIT_S0), 20 * sizeof(sljit_s32), SLJIT_MEM1(SLJIT_S0), 20 * sizeof(sljit_s32), SLJIT_EQUAL);
4281 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 39);
4282 sljit_emit_op_flags(compiler, SLJIT_XOR32, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_EQUAL);
4283 sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_MEM1(SLJIT_S0), 22 * sizeof(sljit_s32), SLJIT_R0, 0);
4284
4285 sljit_emit_op2(compiler, SLJIT_SUB | SLJIT_SET_E | SLJIT_SET_U, SLJIT_UNUSED, 0, SLJIT_R2, 0, SLJIT_IMM, -7);
4286 sljit_emit_op_flags(compiler, SLJIT_AND, SLJIT_MEM0(), (sljit_sw)&buf2, SLJIT_MEM0(), (sljit_sw)&buf2, SLJIT_GREATER);
4287 sljit_emit_op2(compiler, SLJIT_SUB | SLJIT_SET_E | SLJIT_SET_S | SLJIT_SET_U, SLJIT_UNUSED, 0, SLJIT_R2, 0, SLJIT_IMM, 5);
4288 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 1);
4289 sljit_emit_op_flags(compiler, SLJIT_AND | SLJIT_KEEP_FLAGS, SLJIT_MEM2(SLJIT_S1, SLJIT_R0), SLJIT_WORD_SHIFT, SLJIT_MEM2(SLJIT_S1, SLJIT_R0), SLJIT_WORD_SHIFT, SLJIT_SIG_LESS);
4290 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 2);
4291 sljit_emit_op_flags(compiler, SLJIT_MOV, SLJIT_MEM2(SLJIT_S1, SLJIT_R0), SLJIT_WORD_SHIFT, SLJIT_UNUSED, 0, SLJIT_LESS);
4292 sljit_emit_op_flags(compiler, SLJIT_MOV, SLJIT_S2, 0, SLJIT_UNUSED, 0, SLJIT_NOT_EQUAL);
4293 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S1), 3 * sizeof(sljit_sw), SLJIT_S2, 0);
4294 sljit_emit_op_flags(compiler, SLJIT_OR, SLJIT_MEM1(SLJIT_S1), 4 * sizeof(sljit_sw), SLJIT_MEM1(SLJIT_S1), 4 * sizeof(sljit_sw), SLJIT_GREATER);
4295 sljit_emit_op2(compiler, SLJIT_SUB | SLJIT_SET_U, SLJIT_UNUSED, 0, SLJIT_R2, 0, SLJIT_IMM, 0);
4296 sljit_emit_op_flags(compiler, SLJIT_XOR, SLJIT_MEM1(SLJIT_S1), 5 * sizeof(sljit_sw), SLJIT_MEM1(SLJIT_S1), 5 * sizeof(sljit_sw), SLJIT_GREATER);
4297
4298 sljit_emit_return(compiler, SLJIT_UNUSED, 0, 0);
4299
4300 code.code = sljit_generate_code(compiler);
4301 CHECK(compiler);
4302 sljit_free_compiler(compiler);
4303
4304 code.func2((sljit_sw)&buf, (sljit_sw)&buf2);
4305 FAILED(buf[0] != 0, "test46 case 1 failed\n");
4306 FAILED(buf[1] != -17, "test46 case 2 failed\n");
4307 FAILED(buf[2] != 1, "test46 case 3 failed\n");
4308 FAILED(buf[3] != -17, "test46 case 4 failed\n");
4309 FAILED(buf[4] != 1, "test46 case 5 failed\n");
4310 FAILED(buf[5] != -17, "test46 case 6 failed\n");
4311 FAILED(buf[6] != 1, "test46 case 7 failed\n");
4312 FAILED(buf[7] != -17, "test46 case 8 failed\n");
4313 FAILED(buf[8] != 0, "test46 case 9 failed\n");
4314 FAILED(buf[9] != -17, "test46 case 10 failed\n");
4315 FAILED(buf[10] != 1, "test46 case 11 failed\n");
4316 FAILED(buf[11] != -17, "test46 case 12 failed\n");
4317 FAILED(buf[12] != 1, "test46 case 13 failed\n");
4318 FAILED(buf[13] != -17, "test46 case 14 failed\n");
4319 FAILED(buf[14] != 1, "test46 case 15 failed\n");
4320 FAILED(buf[15] != -17, "test46 case 16 failed\n");
4321 FAILED(buf[16] != 0, "test46 case 17 failed\n");
4322 FAILED(buf[17] != -17, "test46 case 18 failed\n");
4323 FAILED(buf[18] != 0, "test46 case 19 failed\n");
4324 FAILED(buf[19] != -17, "test46 case 20 failed\n");
4325 FAILED(buf[20] != -18, "test46 case 21 failed\n");
4326 FAILED(buf[21] != -17, "test46 case 22 failed\n");
4327 FAILED(buf[22] != 38, "test46 case 23 failed\n");
4328 FAILED(buf[23] != -17, "test46 case 24 failed\n");
4329
4330 FAILED(buf2[0] != 0, "test46 case 25 failed\n");
4331 FAILED(buf2[1] != 1, "test46 case 26 failed\n");
4332 FAILED(buf2[2] != 0, "test46 case 27 failed\n");
4333 FAILED(buf2[3] != 1, "test46 case 28 failed\n");
4334 FAILED(buf2[4] != -123, "test46 case 29 failed\n");
4335 FAILED(buf2[5] != -14, "test46 case 30 failed\n");
4336
4337 sljit_free_code(code.code);
4338 successful_tests++;
4339 }
4340
4341 static void test47(void)
4342 {
4343 /* Test jump optimizations. */
4344 executable_code code;
4345 struct sljit_compiler* compiler = sljit_create_compiler(NULL);
4346 sljit_sw buf[3];
4347
4348 if (verbose)
4349 printf("Run test47\n");
4350
4351 FAILED(!compiler, "cannot create compiler\n");
4352 buf[0] = 0;
4353 buf[1] = 0;
4354 buf[2] = 0;
4355
4356 sljit_emit_enter(compiler, 0, 1, 3, 1, 0, 0, 0);
4357 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 0x3a5c6f);
4358 sljit_emit_op2(compiler, SLJIT_SUB | SLJIT_SET_U, SLJIT_UNUSED, 0, SLJIT_R0, 0, SLJIT_IMM, 3);
4359 sljit_set_target(sljit_emit_jump(compiler, SLJIT_LESS), 0x11223344);
4360 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_R0, 0);
4361 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 0xd37c10);
4362 #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
4363 sljit_set_target(sljit_emit_jump(compiler, SLJIT_LESS), SLJIT_W(0x112233445566));
4364 #endif
4365 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw), SLJIT_R0, 0);
4366 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 0x59b48e);
4367 #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
4368 sljit_set_target(sljit_emit_jump(compiler, SLJIT_LESS), SLJIT_W(0x1122334455667788));
4369 #endif
4370 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 2 * sizeof(sljit_sw), SLJIT_R0, 0);
4371 sljit_emit_return(compiler, SLJIT_MOV, SLJIT_RETURN_REG, 0);
4372
4373 code.code = sljit_generate_code(compiler);
4374 CHECK(compiler);
4375 sljit_free_compiler(compiler);
4376
4377 code.func1((sljit_sw)&buf);
4378 FAILED(buf[0] != 0x3a5c6f, "test47 case 1 failed\n");
4379 FAILED(buf[1] != 0xd37c10, "test47 case 2 failed\n");
4380 FAILED(buf[2] != 0x59b48e, "test47 case 3 failed\n");
4381
4382 sljit_free_code(code.code);
4383 successful_tests++;
4384 }
4385
4386 static void test48(void)
4387 {
4388 /* Test floating point conversions. */
4389 executable_code code;
4390 struct sljit_compiler* compiler = sljit_create_compiler(NULL);
4391 int i;
4392 sljit_f64 dbuf[9];
4393 sljit_f32 sbuf[9];
4394 sljit_sw wbuf[9];
4395 sljit_s32 ibuf[9];
4396
4397 if (verbose)
4398 printf("Run test48\n");
4399
4400 if (!sljit_is_fpu_available()) {
4401 if (verbose)
4402 printf("no fpu available, test48 skipped\n");
4403 successful_tests++;
4404 if (compiler)
4405 sljit_free_compiler(compiler);
4406 return;
4407 }
4408
4409 FAILED(!compiler, "cannot create compiler\n");
4410 for (i = 0; i < 9; i++) {
4411 dbuf[i] = 0.0;
4412 sbuf[i] = 0.0;
4413 wbuf[i] = 0;
4414 ibuf[i] = 0;
4415 }
4416
4417 dbuf[0] = 123.5;
4418 dbuf[1] = -367;
4419 dbuf[2] = 917.75;
4420
4421 sbuf[0] = 476.25;
4422 sbuf[1] = -1689.75;
4423
4424 wbuf[0] = 2345;
4425
4426 ibuf[0] = 312;
4427 ibuf[1] = -9324;
4428
4429 sljit_emit_enter(compiler, 0, 0, 3, 3, 6, 0, 0);
4430 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S0, 0, SLJIT_IMM, (sljit_sw)&dbuf);
4431 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S1, 0, SLJIT_IMM, (sljit_sw)&sbuf);
4432 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S2, 0, SLJIT_IMM, (sljit_sw)&wbuf);
4433 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, (sljit_sw)&ibuf);
4434
4435 /* sbuf[2] */
4436 sljit_emit_fop1(compiler, SLJIT_CONV_F32_FROM_F64, SLJIT_MEM1(SLJIT_S1), 2 * sizeof(sljit_f32), SLJIT_MEM1(SLJIT_S0), 0);
4437 sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR5, 0, SLJIT_MEM1(SLJIT_S0), 0);
4438 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 3);
4439 /* sbuf[3] */
4440 sljit_emit_fop1(compiler, SLJIT_CONV_F32_FROM_F64, SLJIT_MEM2(SLJIT_S1, SLJIT_R0), SLJIT_F32_SHIFT, SLJIT_FR5, 0);
4441 sljit_emit_fop1(compiler, SLJIT_CONV_F64_FROM_F32, SLJIT_FR4, 0, SLJIT_MEM1(SLJIT_S1), 0);
4442 /* dbuf[3] */
4443 sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), 3 * sizeof(sljit_f64), SLJIT_FR4, 0);
4444 sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_FR3, 0, SLJIT_MEM1(SLJIT_S1), 0);
4445 sljit_emit_fop1(compiler, SLJIT_CONV_F64_FROM_F32, SLJIT_FR2, 0, SLJIT_FR3, 0);
4446 /* dbuf[4] */
4447 sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), 4 * sizeof(sljit_f64), SLJIT_FR2, 0);
4448 /* sbuf[4] */
4449 sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_MEM1(SLJIT_S1), 4 * sizeof(sljit_f32), SLJIT_FR3, 0);
4450
4451 /* wbuf[1] */
4452 sljit_emit_fop1(compiler, SLJIT_CONV_SW_FROM_F64, SLJIT_MEM1(SLJIT_S2), sizeof(sljit_sw), SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f64));
4453 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 2);
4454 sljit_emit_fop1(compiler, SLJIT_CONV_SW_FROM_F64, SLJIT_UNUSED, 0, SLJIT_MEM2(SLJIT_S0, SLJIT_R0), SLJIT_F64_SHIFT);
4455 sljit_emit_fop1(compiler, SLJIT_CONV_SW_FROM_F64, SLJIT_R0, 0, SLJIT_MEM2(SLJIT_S0, SLJIT_R0), SLJIT_F64_SHIFT);
4456 /* wbuf[2] */
4457 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S2), 2 * sizeof(sljit_sw), SLJIT_R0, 0);
4458 sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_FR5, 0, SLJIT_MEM1(SLJIT_S1), 0);
4459 /* wbuf[3] */
4460 sljit_emit_fop1(compiler, SLJIT_CONV_SW_FROM_F32, SLJIT_MEM1(SLJIT_S2), 3 * sizeof(sljit_sw), SLJIT_FR5, 0);
4461 sljit_emit_fop1(compiler, SLJIT_NEG_F32, SLJIT_FR0, 0, SLJIT_FR5, 0);
4462 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 4);
4463 /* wbuf[4] */
4464 sljit_emit_fop1(compiler, SLJIT_CONV_SW_FROM_F32, SLJIT_MEM2(SLJIT_S2, SLJIT_R1), SLJIT_WORD_SHIFT, SLJIT_FR0, 0);
4465 sljit_emit_fop1(compiler, SLJIT_NEG_F64, SLJIT_FR4, 0, SLJIT_MEM1(SLJIT_S0), 2 * sizeof(sljit_f64));
4466 /* ibuf[2] */
4467 sljit_emit_fop1(compiler, SLJIT_CONV_S32_FROM_F64, SLJIT_MEM1(SLJIT_R2), 2 * sizeof(sljit_s32), SLJIT_FR4, 0);
4468 sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_FR1, 0, SLJIT_MEM1(SLJIT_S1), sizeof(sljit_f32));
4469 sljit_emit_fop1(compiler, SLJIT_CONV_S32_FROM_F32, SLJIT_R0, 0, SLJIT_FR1, 0);
4470 /* ibuf[3] */
4471 sljit_emit_op1(compiler, SLJIT_MOV_S32, SLJIT_MEM1(SLJIT_R2), 3 * sizeof(sljit_s32), SLJIT_R0, 0);
4472
4473 /* dbuf[5] */
4474 sljit_emit_fop1(compiler, SLJIT_CONV_F64_FROM_SW, SLJIT_MEM1(SLJIT_S0), 5 * sizeof(sljit_f64), SLJIT_MEM1(SLJIT_S2), 0);
4475 sljit_emit_fop1(compiler, SLJIT_CONV_F64_FROM_SW, SLJIT_FR2, 0, SLJIT_IMM, -6213);
4476 /* dbuf[6] */
4477 sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), 6 * sizeof(sljit_f64), SLJIT_FR2, 0);
4478 /* dbuf[7] */
4479 sljit_emit_fop1(compiler, SLJIT_CONV_F64_FROM_S32, SLJIT_MEM1(SLJIT_S0), 7 * sizeof(sljit_f64), SLJIT_MEM0(), (sljit_sw)&ibuf[0]);
4480 sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R0, 0, SLJIT_MEM1(SLJIT_R2), sizeof(sljit_s32));
4481 sljit_emit_fop1(compiler, SLJIT_CONV_F64_FROM_S32, SLJIT_FR1, 0, SLJIT_R0, 0);
4482 /* dbuf[8] */
4483 sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), 8 * sizeof(sljit_f64), SLJIT_FR1, 0);
4484 /* sbuf[5] */
4485 sljit_emit_fop1(compiler, SLJIT_CONV_F32_FROM_SW, SLJIT_MEM1(SLJIT_S1), 5 * sizeof(sljit_f32), SLJIT_IMM, -123);
4486 sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R0, 0, SLJIT_IMM, 7190);
4487 sljit_emit_fop1(compiler, SLJIT_CONV_F32_FROM_SW, SLJIT_FR3, 0, SLJIT_R0, 0);
4488 /* sbuf[6] */
4489 sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_MEM1(SLJIT_S1), 6 * sizeof(sljit_f32), SLJIT_FR3, 0);
4490 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 123);
4491 sljit_emit_op2(compiler, SLJIT_SUB, SLJIT_R1, 0, SLJIT_R2, 0, SLJIT_IMM, 123 * sizeof(sljit_s32));
4492 sljit_emit_fop1(compiler, SLJIT_CONV_F32_FROM_S32, SLJIT_FR1, 0, SLJIT_MEM2(SLJIT_R1, SLJIT_R0), 2);
4493 /* sbuf[7] */
4494 sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_MEM1(SLJIT_S1), 7 * sizeof(sljit_f32), SLJIT_FR1, 0);
4495 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 8);
4496 sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R1, 0, SLJIT_IMM, 3812);
4497 /* sbuf[8] */
4498 sljit_emit_fop1(compiler, SLJIT_CONV_F32_FROM_S32, SLJIT_MEM2(SLJIT_S1, SLJIT_R0), SLJIT_F32_SHIFT, SLJIT_R1, 0);
4499
4500 sljit_emit_return(compiler, SLJIT_MOV, SLJIT_RETURN_REG, 0);
4501
4502 code.code = sljit_generate_code(compiler);
4503 CHECK(compiler);
4504 sljit_free_compiler(compiler);
4505
4506 code.func0();
4507 FAILED(dbuf[3] != 476.25, "test48 case 1 failed\n");
4508 FAILED(dbuf[4] != 476.25, "test48 case 2 failed\n");
4509 FAILED(dbuf[5] != 2345.0, "test48 case 3 failed\n");
4510 FAILED(dbuf[6] != -6213.0, "test48 case 4 failed\n");
4511 FAILED(dbuf[7] != 312.0, "test48 case 5 failed\n");
4512 FAILED(dbuf[8] != -9324.0, "test48 case 6 failed\n");
4513
4514 FAILED(sbuf[2] != 123.5, "test48 case 7 failed\n");
4515 FAILED(sbuf[3] != 123.5, "test48 case 8 failed\n");
4516 FAILED(sbuf[4] != 476.25, "test48 case 9 failed\n");
4517 FAILED(sbuf[5] != -123, "test48 case 10 failed\n");
4518 FAILED(sbuf[6] != 7190, "test48 case 11 failed\n");
4519 FAILED(sbuf[7] != 312, "test48 case 12 failed\n");
4520 FAILED(sbuf[8] != 3812, "test48 case 13 failed\n");
4521
4522 FAILED(wbuf[1] != -367, "test48 case 14 failed\n");
4523 FAILED(wbuf[2] != 917, "test48 case 15 failed\n");
4524 FAILED(wbuf[3] != 476, "test48 case 16 failed\n");
4525 FAILED(wbuf[4] != -476, "test48 case 17 failed\n");
4526
4527 FAILED(ibuf[2] != -917, "test48 case 18 failed\n");
4528 FAILED(ibuf[3] != -1689, "test48 case 19 failed\n");
4529
4530 sljit_free_code(code.code);
4531 successful_tests++;
4532 }
4533
4534 static void test49(void)
4535 {
4536 /* Test floating point conversions. */
4537 executable_code code;
4538 struct sljit_compiler* compiler = sljit_create_compiler(NULL);
4539 int i;
4540 sljit_f64 dbuf[10];
4541 sljit_f32 sbuf[9];
4542 sljit_sw wbuf[9];
4543 sljit_s32 ibuf[9];
4544 sljit_s32* dbuf_ptr = (sljit_s32*)dbuf;
4545 sljit_s32* sbuf_ptr = (sljit_s32*)sbuf;
4546
4547 if (verbose)
4548 printf("Run test49\n");
4549
4550 if (!sljit_is_fpu_available()) {
4551 if (verbose)
4552 printf("no fpu available, test49 skipped\n");
4553 successful_tests++;
4554 if (compiler)
4555 sljit_free_compiler(compiler);
4556 return;
4557 }
4558
4559 FAILED(!compiler, "cannot create compiler\n");
4560
4561 for (i = 0; i < 9; i++) {
4562 dbuf_ptr[i << 1] = -1;
4563 dbuf_ptr[(i << 1) + 1] = -1;
4564 sbuf_ptr[i] = -1;
4565 wbuf[i] = -1;
4566 ibuf[i] = -1;
4567 }
4568
4569 #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
4570 dbuf[9] = (sljit_f64)SLJIT_W(0x1122334455);
4571 #endif
4572 dbuf[0] = 673.75;
4573 sbuf[0] = -879.75;
4574 wbuf[0] = 345;
4575 ibuf[0] = -249;
4576
4577 sljit_emit_enter(compiler, 0, 0, 3, 3, 3, 0, 0);
4578 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S0, 0, SLJIT_IMM, (sljit_sw)&dbuf);
4579 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S1, 0, SLJIT_IMM, (sljit_sw)&sbuf);
4580 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S2, 0, SLJIT_IMM, (sljit_sw)&wbuf);
4581 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, (sljit_sw)&ibuf);
4582
4583 /* dbuf[2] */
4584 sljit_emit_fop1(compiler, SLJIT_CONV_F64_FROM_F32, SLJIT_MEM1(SLJIT_S0), 2 * sizeof(sljit_f64), SLJIT_MEM1(SLJIT_S1), 0);
4585 /* sbuf[2] */
4586 sljit_emit_fop1(compiler, SLJIT_CONV_F32_FROM_F64, SLJIT_MEM1(SLJIT_S1), 2 * sizeof(sljit_f32), SLJIT_MEM1(SLJIT_S0), 0);
4587 /* wbuf[2] */
4588 sljit_emit_fop1(compiler, SLJIT_CONV_SW_FROM_F64, SLJIT_MEM1(SLJIT_S2), 2 * sizeof(sljit_sw), SLJIT_MEM1(SLJIT_S0), 0);
4589 /* wbuf[4] */
4590 sljit_emit_fop1(compiler, SLJIT_CONV_SW_FROM_F32, SLJIT_MEM1(SLJIT_S2), 4 * sizeof(sljit_sw), SLJIT_MEM1(SLJIT_S1), 0);
4591 /* ibuf[2] */
4592 sljit_emit_fop1(compiler, SLJIT_CONV_S32_FROM_F64, SLJIT_MEM1(SLJIT_R2), 2 * sizeof(sljit_s32), SLJIT_MEM1(SLJIT_S0), 0);
4593 /* ibuf[4] */
4594 sljit_emit_fop1(compiler, SLJIT_CONV_S32_FROM_F32, SLJIT_MEM1(SLJIT_R2), 4 * sizeof(sljit_s32), SLJIT_MEM1(SLJIT_S1), 0);
4595 /* dbuf[4] */
4596 sljit_emit_fop1(compiler, SLJIT_CONV_F64_FROM_SW, SLJIT_MEM1(SLJIT_S0), 4 * sizeof(sljit_f64), SLJIT_MEM1(SLJIT_S2), 0);
4597 /* sbuf[4] */
4598 sljit_emit_fop1(compiler, SLJIT_CONV_F32_FROM_SW, SLJIT_MEM1(SLJIT_S1), 4 * sizeof(sljit_f32), SLJIT_MEM1(SLJIT_S2), 0);
4599 /* dbuf[6] */
4600 sljit_emit_fop1(compiler, SLJIT_CONV_F64_FROM_S32, SLJIT_MEM1(SLJIT_S0), 6 * sizeof(sljit_f64), SLJIT_MEM1(SLJIT_R2), 0);
4601 /* sbuf[6] */
4602 sljit_emit_fop1(compiler, SLJIT_CONV_F32_FROM_S32, SLJIT_MEM1(SLJIT_S1), 6 * sizeof(sljit_f32), SLJIT_MEM1(SLJIT_R2), 0);
4603
4604 #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
4605 sljit_emit_fop1(compiler, SLJIT_CONV_SW_FROM_F64, SLJIT_R0, 0, SLJIT_MEM1(SLJIT_S0), 9 * sizeof(sljit_f64));
4606 /* wbuf[8] */
4607 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S2), 8 * sizeof(sljit_sw), SLJIT_R0, 0);
4608 sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR2, 0, SLJIT_MEM1(SLJIT_S0), 9 * sizeof(sljit_f64));
4609 sljit_emit_fop1(compiler, SLJIT_CONV_S32_FROM_F64, SLJIT_R0, 0, SLJIT_FR2, 0);
4610 sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R0, 0, SLJIT_R0, 0);
4611 sljit_emit_op2(compiler, SLJIT_AND32, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_IMM, 0xffff);
4612 /* ibuf[8] */
4613 sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_MEM1(SLJIT_R2), 8 * sizeof(sljit_s32), SLJIT_R0, 0);
4614 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, SLJIT_W(0x4455667788));
4615 /* dbuf[8] */
4616 sljit_emit_fop1(compiler, SLJIT_CONV_F64_FROM_SW, SLJIT_MEM1(SLJIT_S0), 8 * sizeof(sljit_f64), SLJIT_R0, 0);
4617 /* dbuf[9] */
4618 sljit_emit_fop1(compiler, SLJIT_CONV_F64_FROM_S32, SLJIT_MEM1(SLJIT_S0), 9 * sizeof(sljit_f64), SLJIT_IMM, SLJIT_W(0x7766554433));
4619 #endif
4620
4621 sljit_emit_return(compiler, SLJIT_MOV, SLJIT_RETURN_REG, 0);
4622
4623 code.code = sljit_generate_code(compiler);
4624 CHECK(compiler);
4625 sljit_free_compiler(compiler);
4626
4627 code.func0();
4628
4629 FAILED(dbuf_ptr[(1 * 2) + 0] != -1, "test49 case 1 failed\n");
4630 FAILED(dbuf_ptr[(1 * 2) + 1] != -1, "test49 case 2 failed\n");
4631 FAILED(dbuf[2] != -879.75, "test49 case 3 failed\n");
4632 FAILED(dbuf_ptr[(3 * 2) + 0] != -1, "test49 case 4 failed\n");
4633 FAILED(dbuf_ptr[(3 * 2) + 1] != -1, "test49 case 5 failed\n");
4634 FAILED(dbuf[4] != 345, "test49 case 6 failed\n");
4635 FAILED(dbuf_ptr[(5 * 2) + 0] != -1, "test49 case 7 failed\n");
4636 FAILED(dbuf_ptr[(5 * 2) + 1] != -1, "test49 case 8 failed\n");
4637 FAILED(dbuf[6] != -249, "test49 case 9 failed\n");
4638 FAILED(dbuf_ptr[(7 * 2) + 0] != -1, "test49 case 10 failed\n");
4639 FAILED(dbuf_ptr[(7 * 2) + 1] != -1, "test49 case 11 failed\n");
4640
4641 FAILED(sbuf_ptr[1] != -1, "test49 case 12 failed\n");
4642 FAILED(sbuf[2] != 673.75, "test49 case 13 failed\n");
4643 FAILED(sbuf_ptr[3] != -1, "test49 case 14 failed\n");
4644 FAILED(sbuf[4] != 345, "test49 case 15 failed\n");
4645 FAILED(sbuf_ptr[5] != -1, "test49 case 16 failed\n");
4646 FAILED(sbuf[6] != -249, "test49 case 17 failed\n");
4647 FAILED(sbuf_ptr[7] != -1, "test49 case 18 failed\n");
4648
4649 FAILED(wbuf[1] != -1, "test49 case 19 failed\n");
4650 FAILED(wbuf[2] != 673, "test49 case 20 failed\n");
4651 FAILED(wbuf[3] != -1, "test49 case 21 failed\n");
4652 FAILED(wbuf[4] != -879, "test49 case 22 failed\n");
4653 FAILED(wbuf[5] != -1, "test49 case 23 failed\n");
4654
4655 FAILED(ibuf[1] != -1, "test49 case 24 failed\n");
4656 FAILED(ibuf[2] != 673, "test49 case 25 failed\n");
4657 FAILED(ibuf[3] != -1, "test49 case 26 failed\n");
4658 FAILED(ibuf[4] != -879, "test49 case 27 failed\n");
4659 FAILED(ibuf[5] != -1, "test49 case 28 failed\n");
4660
4661 #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
4662 FAILED(dbuf[8] != (sljit_f64)SLJIT_W(0x4455667788), "test49 case 29 failed\n");
4663 FAILED(dbuf[9] != (sljit_f64)SLJIT_W(0x66554433), "test49 case 30 failed\n");
4664 FAILED(wbuf[8] != SLJIT_W(0x1122334455), "test48 case 31 failed\n");
4665 FAILED(ibuf[8] == 0x4455, "test48 case 32 failed\n");
4666 #endif
4667
4668 sljit_free_code(code.code);
4669 successful_tests++;
4670 }
4671
4672 static void test50(void)
4673 {
4674 /* Test stack and floating point operations. */
4675 executable_code code;
4676 struct sljit_compiler* compiler = sljit_create_compiler(NULL);
4677 #if !(defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86)
4678 sljit_uw size1, size2, size3;
4679 int result;
4680 #endif
4681 sljit_f32 sbuf[7];
4682
4683 if (verbose)
4684 printf("Run test50\n");
4685
4686 if (!sljit_is_fpu_available()) {
4687 if (verbose)
4688 printf("no fpu available, test50 skipped\n");
4689 successful_tests++;
4690 if (compiler)
4691 sljit_free_compiler(compiler);
4692 return;
4693 }
4694
4695 FAILED(!compiler, "cannot create compiler\n");
4696
4697 sbuf[0] = 245.5;
4698 sbuf[1] = -100.25;
4699 sbuf[2] = 713.75;
4700
4701 sljit_emit_enter(compiler, 0, 1, 3, 3, 6, 0, 8 * sizeof(sljit_f32));
4702
4703 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), 0, SLJIT_MEM1(SLJIT_S0), 0);
4704 sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_MEM1(SLJIT_SP), sizeof(sljit_f32), SLJIT_MEM1(SLJIT_SP), 0);
4705 /* sbuf[3] */
4706 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 3 * sizeof(sljit_f32), SLJIT_MEM1(SLJIT_SP), sizeof(sljit_f32));
4707 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), sizeof(sljit_f32), SLJIT_MEM1(SLJIT_S0), sizeof(sljit_f32));
4708 sljit_emit_fop2(compiler, SLJIT_ADD_F32, SLJIT_MEM1(SLJIT_SP), 2 * sizeof(sljit_f32), SLJIT_MEM1(SLJIT_SP), 0, SLJIT_MEM1(SLJIT_SP), sizeof(sljit_f32));
4709 /* sbuf[4] */
4710 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 4 * sizeof(sljit_f32), SLJIT_MEM1(SLJIT_SP), 2 * sizeof(sljit_f32));
4711 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), 2 * sizeof(sljit_f32), SLJIT_IMM, 5934);
4712 sljit_emit_fop1(compiler, SLJIT_CONV_F32_FROM_SW, SLJIT_MEM1(SLJIT_SP), 3 * sizeof(sljit_f32), SLJIT_MEM1(SLJIT_SP), 2 * sizeof(sljit_f32));
4713 /* sbuf[5] */
4714 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 5 * sizeof(sljit_f32), SLJIT_MEM1(SLJIT_SP), 3 * sizeof(sljit_f32));
4715
4716 #if !(defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86)
4717 size1 = compiler->size;
4718 #endif
4719 sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_FR2, 0, SLJIT_MEM1(SLJIT_S0), 2 * sizeof(sljit_f32));
4720 #if !(defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86)
4721 size2 = compiler->size;
4722 #endif
4723 sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_FR5, 0, SLJIT_FR2, 0);
4724 #if !(defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86)
4725 size3 = compiler->size;
4726 #endif
4727 /* sbuf[6] */
4728 sljit_emit_fop1(compiler, SLJIT_MOV_F32, SLJIT_MEM1(SLJIT_S0), 6 * sizeof(sljit_f32), SLJIT_FR5, 0);
4729 #if !(defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86)
4730 result = (compiler->size - size3) == (size3 - size2) && (size3 - size2) == (size2 - size1);
4731 #endif
4732
4733 sljit_emit_return(compiler, SLJIT_MOV, SLJIT_RETURN_REG, 0);
4734
4735 code.code = sljit_generate_code(compiler);
4736 CHECK(compiler);
4737 sljit_free_compiler(compiler);
4738
4739 code.func1((sljit_sw)&sbuf);
4740
4741 FAILED(sbuf[3] != 245.5, "test50 case 1 failed\n");
4742 FAILED(sbuf[4] != 145.25, "test50 case 2 failed\n");
4743 FAILED(sbuf[5] != 5934, "test50 case 3 failed\n");
4744 FAILED(sbuf[6] != 713.75, "test50 case 4 failed\n");
4745 #if !(defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86)
4746 FAILED(!result, "test50 case 5 failed\n");
4747 #endif
4748
4749 sljit_free_code(code.code);
4750 successful_tests++;
4751 }
4752
4753 static void test51(void)
4754 {
4755 /* Test all registers provided by the CPU. */
4756 executable_code code;
4757 struct sljit_compiler* compiler = sljit_create_compiler(NULL);
4758 struct sljit_jump* jump;
4759 sljit_sw buf[2];
4760 sljit_s32 i;
4761
4762 FAILED(!compiler, "cannot create compiler\n");
4763
4764 buf[0] = 39;
4765
4766 sljit_emit_enter(compiler, 0, 0, SLJIT_NUMBER_OF_REGISTERS, 0, 0, 0, 0);
4767
4768 for (i = 0; i < SLJIT_NUMBER_OF_REGISTERS; i++)
4769 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R(i), 0, SLJIT_IMM, 32);
4770
4771 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, (sljit_sw)buf);
4772 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 0);
4773
4774 for (i = 2; i < SLJIT_NUMBER_OF_REGISTERS; i++) {
4775 if (sljit_get_register_index(SLJIT_R(i)) >= 0) {
4776 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R(i), 0, SLJIT_R0, 0);
4777 sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R1, 0, SLJIT_R1, 0, SLJIT_MEM1(SLJIT_R(i)), 0);
4778 } else
4779 sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R1, 0, SLJIT_R1, 0, SLJIT_IMM, buf[0]);
4780 }
4781
4782 sljit_emit_op2(compiler, SLJIT_SUB, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_IMM, 32);
4783 for (i = 2; i < SLJIT_NUMBER_OF_REGISTERS; i++) {
4784 if (sljit_get_register_index(SLJIT_R(i)) >= 0) {
4785 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R(i), 0, SLJIT_R0, 0);
4786 sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R1, 0, SLJIT_R1, 0, SLJIT_MEM1(SLJIT_R(i)), 32);
4787 } else
4788 sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R1, 0, SLJIT_R1, 0, SLJIT_IMM, buf[0]);
4789 }
4790
4791 for (i = 2; i < SLJIT_NUMBER_OF_REGISTERS; i++) {
4792 if (sljit_get_register_index(SLJIT_R(i)) >= 0) {
4793 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R(i), 0, SLJIT_IMM, 32);
4794 sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R1, 0, SLJIT_R1, 0, SLJIT_MEM2(SLJIT_R(i), SLJIT_R0), 0);
4795 sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R1, 0, SLJIT_R1, 0, SLJIT_MEM2(SLJIT_R0, SLJIT_R(i)), 0);
4796 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R(i), 0, SLJIT_IMM, 8);
4797 sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R1, 0, SLJIT_R1, 0, SLJIT_MEM2(SLJIT_R0, SLJIT_R(i)), 2);
4798 } else
4799 sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R1, 0, SLJIT_R1, 0, SLJIT_IMM, 3 * buf[0]);
4800 }
4801
4802 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_R0), 32 + sizeof(sljit_sw), SLJIT_R1, 0);
4803
4804 sljit_emit_return(compiler, SLJIT_UNUSED, 0, 0);
4805
4806 code.code = sljit_generate_code(compiler);
4807 CHECK(compiler);
4808 sljit_free_compiler(compiler);
4809
4810 code.func0();
4811
4812 FAILED(buf[1] != (39 * 5 * (SLJIT_NUMBER_OF_REGISTERS - 2)), "test51 case 1 failed\n");
4813
4814 sljit_free_code(code.code);
4815
4816 /* Next test. */
4817
4818 compiler = sljit_create_compiler(NULL);
4819
4820 FAILED(!compiler, "cannot create compiler\n");
4821
4822 sljit_emit_enter(compiler, 0, 0, SLJIT_NUMBER_OF_SCRATCH_REGISTERS, SLJIT_NUMBER_OF_SAVED_REGISTERS, 0, 0, 0);
4823
4824 for (i = 0; i < SLJIT_NUMBER_OF_REGISTERS; i++)
4825 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R(i), 0, SLJIT_IMM, 17);
4826
4827 jump = sljit_emit_jump(compiler, SLJIT_CALL0);
4828 /* SLJIT_R0 contains the first value. */
4829 for (i = 1; i < SLJIT_NUMBER_OF_REGISTERS; i++)
4830 sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_R(i), 0);
4831
4832 sljit_emit_return(compiler, SLJIT_MOV, SLJIT_R0, 0);
4833
4834 sljit_set_label(jump, sljit_emit_label(compiler));
4835 sljit_emit_enter(compiler, 0, 0, SLJIT_NUMBER_OF_REGISTERS, 0, 0, 0, 0);
4836 for (i = 0; i < SLJIT_NUMBER_OF_REGISTERS; i++)
4837 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R(i), 0, SLJIT_IMM, 35);
4838 sljit_emit_return(compiler, SLJIT_UNUSED, 0, 0);
4839
4840 code.code = sljit_generate_code(compiler);
4841 CHECK(compiler);
4842 sljit_free_compiler(compiler);
4843
4844 FAILED(code.func0() != (SLJIT_NUMBER_OF_SCRATCH_REGISTERS * 35 + SLJIT_NUMBER_OF_SAVED_REGISTERS * 17), "test51 case 2 failed\n");
4845
4846 sljit_free_code(code.code);
4847
4848 /* Next test. */
4849
4850 compiler = sljit_create_compiler(NULL);
4851
4852 FAILED(!compiler, "cannot create compiler\n");
4853
4854 sljit_emit_enter(compiler, 0, 0, SLJIT_NUMBER_OF_SCRATCH_REGISTERS, SLJIT_NUMBER_OF_SAVED_REGISTERS, 0, 0, 0);
4855
4856 for (i = 0; i < SLJIT_NUMBER_OF_REGISTERS; i++)
4857 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R(i), 0, SLJIT_IMM, 68);
4858
4859 jump = sljit_emit_jump(compiler, SLJIT_CALL0);
4860 /* SLJIT_R0 contains the first value. */
4861 for (i = 1; i < SLJIT_NUMBER_OF_REGISTERS; i++)
4862 sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_R(i), 0);
4863
4864 sljit_emit_return(compiler, SLJIT_MOV, SLJIT_R0, 0);
4865
4866 sljit_set_label(jump, sljit_emit_label(compiler));
4867 sljit_emit_enter(compiler, 0, 0, 0, SLJIT_NUMBER_OF_REGISTERS, 0, 0, 0);
4868 for (i = 0; i < SLJIT_NUMBER_OF_REGISTERS; i++)
4869 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_S(i), 0, SLJIT_IMM, 43);
4870 sljit_emit_return(compiler, SLJIT_UNUSED, 0, 0);
4871
4872 code.code = sljit_generate_code(compiler);
4873 CHECK(compiler);
4874 sljit_free_compiler(compiler);
4875
4876 FAILED(code.func0() != (SLJIT_NUMBER_OF_SCRATCH_REGISTERS * 43 + SLJIT_NUMBER_OF_SAVED_REGISTERS * 68), "test51 case 3 failed\n");
4877
4878 sljit_free_code(code.code);
4879 successful_tests++;
4880 }
4881
4882 static void test52(void)
4883 {
4884 /* Test all registers provided by the CPU. */
4885 executable_code code;
4886 struct sljit_compiler* compiler;
4887 struct sljit_jump* jump;
4888 sljit_f64 buf[3];
4889 sljit_s32 i;
4890
4891 if (!sljit_is_fpu_available()) {
4892 if (verbose)
4893 printf("no fpu available, test52 skipped\n");
4894 successful_tests++;
4895 return;
4896 }
4897
4898 /* Next test. */
4899
4900 compiler = sljit_create_compiler(NULL);
4901 FAILED(!compiler, "cannot create compiler\n");
4902 buf[0] = 6.25;
4903 buf[1] = 17.75;
4904
4905 sljit_emit_enter(compiler, 0, 1, 0, 1, SLJIT_NUMBER_OF_SCRATCH_FLOAT_REGISTERS, SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS, 0);
4906
4907 for (i = 0; i < SLJIT_NUMBER_OF_FLOAT_REGISTERS; i++)
4908 sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR(i), 0, SLJIT_MEM1(SLJIT_S0), 0);
4909
4910 jump = sljit_emit_jump(compiler, SLJIT_CALL0);
4911 /* SLJIT_FR0 contains the first value. */
4912 for (i = 1; i < SLJIT_NUMBER_OF_FLOAT_REGISTERS; i++)
4913 sljit_emit_fop2(compiler, SLJIT_ADD_F64, SLJIT_FR0, 0, SLJIT_FR0, 0, SLJIT_FR(i), 0);
4914 sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), 2 * sizeof(sljit_f64), SLJIT_FR0, 0);
4915
4916 sljit_emit_return(compiler, SLJIT_UNUSED, 0, 0);
4917
4918 sljit_set_label(jump, sljit_emit_label(compiler));
4919 sljit_emit_enter(compiler, 0, 0, 1, 0, SLJIT_NUMBER_OF_FLOAT_REGISTERS, 0, 0);
4920 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, (sljit_sw)&buf[1]);
4921 for (i = 0; i < SLJIT_NUMBER_OF_FLOAT_REGISTERS; i++)
4922 sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR(i), 0, SLJIT_MEM1(SLJIT_R0), 0);
4923 sljit_emit_return(compiler, SLJIT_UNUSED, 0, 0);
4924
4925 code.code = sljit_generate_code(compiler);
4926 CHECK(compiler);
4927 sljit_free_compiler(compiler);
4928
4929 code.func1((sljit_sw)&buf);
4930 FAILED(buf[2] != (SLJIT_NUMBER_OF_SCRATCH_FLOAT_REGISTERS * 17.75 + SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS * 6.25), "test52 case 1 failed\n");
4931
4932 sljit_free_code(code.code);
4933
4934 /* Next test. */
4935
4936 compiler = sljit_create_compiler(NULL);
4937 FAILED(!compiler, "cannot create compiler\n");
4938 buf[0] = -32.5;
4939 buf[1] = -11.25;
4940
4941 sljit_emit_enter(compiler, 0, 1, 0, 1, SLJIT_NUMBER_OF_SCRATCH_FLOAT_REGISTERS, SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS, 0);
4942
4943 for (i = 0; i < SLJIT_NUMBER_OF_FLOAT_REGISTERS; i++)
4944 sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FR(i), 0, SLJIT_MEM1(SLJIT_S0), 0);
4945
4946 jump = sljit_emit_jump(compiler, SLJIT_CALL0);
4947 /* SLJIT_FR0 contains the first value. */
4948 for (i = 1; i < SLJIT_NUMBER_OF_FLOAT_REGISTERS; i++)
4949 sljit_emit_fop2(compiler, SLJIT_ADD_F64, SLJIT_FR0, 0, SLJIT_FR0, 0, SLJIT_FR(i), 0);
4950 sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_MEM1(SLJIT_S0), 2 * sizeof(sljit_f64), SLJIT_FR0, 0);
4951
4952 sljit_emit_return(compiler, SLJIT_UNUSED, 0, 0);
4953
4954 sljit_set_label(jump, sljit_emit_label(compiler));
4955 sljit_emit_enter(compiler, 0, 0, 1, 0, 0, SLJIT_NUMBER_OF_FLOAT_REGISTERS, 0);
4956 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, (sljit_sw)&buf[1]);
4957 for (i = 0; i < SLJIT_NUMBER_OF_FLOAT_REGISTERS; i++)
4958 sljit_emit_fop1(compiler, SLJIT_MOV_F64, SLJIT_FS(i), 0, SLJIT_MEM1(SLJIT_R0), 0);
4959 sljit_emit_return(compiler, SLJIT_UNUSED, 0, 0);
4960
4961 code.code = sljit_generate_code(compiler);
4962 CHECK(compiler);
4963 sljit_free_compiler(compiler);
4964
4965 code.func1((sljit_sw)&buf);
4966 FAILED(buf[2] != (SLJIT_NUMBER_OF_SCRATCH_FLOAT_REGISTERS * -11.25 + SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS * -32.5), "test52 case 2 failed\n");
4967
4968 sljit_free_code(code.code);
4969 successful_tests++;
4970 }
4971
4972 static void test53(void)
4973 {
4974 /* Check SLJIT_DOUBLE_ALIGNMENT. */
4975 executable_code code;
4976 struct sljit_compiler* compiler = sljit_create_compiler(NULL);
4977 sljit_sw buf[1];
4978
4979 if (verbose)
4980 printf("Run test53\n");
4981
4982 FAILED(!compiler, "cannot create compiler\n");
4983 buf[0] = -1;
4984
4985 sljit_emit_enter(compiler, SLJIT_DOUBLE_ALIGNMENT, 1, 1, 1, 0, 0, 2 * sizeof(sljit_sw));
4986
4987 sljit_get_local_base(compiler, SLJIT_R0, 0, 0);
4988 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_R0, 0);
4989
4990 sljit_emit_return(compiler, SLJIT_UNUSED, 0, 0);
4991
4992 code.code = sljit_generate_code(compiler);
4993 CHECK(compiler);
4994 sljit_free_compiler(compiler);
4995
4996 code.func1((sljit_sw)&buf);
4997
4998 FAILED((buf[0] & (sizeof(sljit_f64) - 1)) != 0, "test53 case 1 failed\n");
4999
5000 sljit_free_code(code.code);
5001
5002 /* Next test. */
5003
5004 compiler = sljit_create_compiler(NULL);
5005 FAILED(!compiler, "cannot create compiler\n");
5006 buf[0] = -1;
5007
5008 /* One more saved register to break the alignment on x86-32. */
5009 sljit_emit_enter(compiler, SLJIT_DOUBLE_ALIGNMENT, 1, 1, 2, 0, 0, 2 * sizeof(sljit_sw));
5010
5011 sljit_get_local_base(compiler, SLJIT_R0, 0, 0);
5012 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_R0, 0);
5013
5014 sljit_emit_return(compiler, SLJIT_UNUSED, 0, 0);
5015
5016 code.code = sljit_generate_code(compiler);
5017 CHECK(compiler);
5018 sljit_free_compiler(compiler);
5019
5020 code.func1((sljit_sw)&buf);
5021
5022 FAILED((buf[0] & (sizeof(sljit_f64) - 1)) != 0, "test53 case 2 failed\n");
5023
5024 sljit_free_code(code.code);
5025 successful_tests++;
5026 }
5027
5028 static void test54(void)
5029 {
5030 /* Check x86 cmov. */
5031 executable_code code;
5032 struct sljit_compiler* compiler = sljit_create_compiler(NULL);
5033 sljit_sw buf[6];
5034 sljit_s32 ibuf[6];
5035
5036 if (verbose)
5037 printf("Run test53\n");
5038
5039 buf[0] = 98;
5040 buf[1] = 0;
5041 buf[2] = 0;
5042 buf[3] = 0;
5043 buf[4] = 0;
5044 buf[5] = 0;
5045 ibuf[0] = 0;
5046 ibuf[1] = 0;
5047 ibuf[2] = 0;
5048 ibuf[3] = 0;
5049 ibuf[4] = 67;
5050 ibuf[5] = 38;
5051
5052 sljit_emit_enter(compiler, 0, 2, 2, 2, 0, 0, 0);
5053
5054 #if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86)
5055 if (sljit_x86_is_cmov_available()) {
5056 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 17);
5057 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, 34);
5058 sljit_emit_op2(compiler, SLJIT_SUB | SLJIT_SET_S, SLJIT_UNUSED, 0, SLJIT_R0, 0, SLJIT_IMM, -10);
5059 sljit_x86_emit_cmov(compiler, SLJIT_SIG_LESS, SLJIT_R0, SLJIT_R1, 0);
5060 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw), SLJIT_R0, 0);
5061 sljit_x86_emit_cmov(compiler, SLJIT_SIG_GREATER, SLJIT_R0, SLJIT_R1, 0);
5062 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 2 * sizeof(sljit_sw), SLJIT_R0, 0);
5063
5064 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_R0, 0, SLJIT_IMM, 24);
5065 sljit_emit_op2(compiler, SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, SLJIT_R0, 0, SLJIT_IMM, 24);
5066 sljit_x86_emit_cmov(compiler, SLJIT_NOT_EQUAL, SLJIT_R0, SLJIT_MEM1(SLJIT_S0), 0);
5067 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 3 * sizeof(sljit_sw), SLJIT_R0, 0);
5068 sljit_x86_emit_cmov(compiler, SLJIT_EQUAL, SLJIT_R0, SLJIT_MEM1(SLJIT_S0), 0);
5069 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 4 * sizeof(sljit_sw), SLJIT_R0, 0);
5070 sljit_x86_emit_cmov(compiler, SLJIT_EQUAL, SLJIT_R0, SLJIT_IMM, -135);
5071 sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_S0), 5 * sizeof(sljit_sw), SLJIT_R0, 0);
5072
5073 sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R0, 0, SLJIT_IMM, 177);
5074 sljit_emit_op2(compiler, SLJIT_SUB32 | SLJIT_SET_U, SLJIT_UNUSED, 0, SLJIT_R0, 0, SLJIT_IMM, 177);
5075 sljit_x86_emit_cmov(compiler, SLJIT_LESS32, SLJIT_R0 | SLJIT_I32_OP, SLJIT_MEM1(SLJIT_S1), 4 * sizeof(sljit_s32));
5076 sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_MEM1(SLJIT_S1), 3 * sizeof(sljit_s32), SLJIT_R0, 0);
5077 sljit_x86_emit_cmov(compiler, SLJIT_GREATER32, SLJIT_R0 | SLJIT_I32_OP, SLJIT_MEM1(SLJIT_S1), 4 * sizeof(sljit_s32));
5078 sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_MEM1(SLJIT_S1), 2 * sizeof(sljit_s32), SLJIT_R0, 0);
5079 sljit_x86_emit_cmov(compiler, SLJIT_LESS_EQUAL32, SLJIT_R0 | SLJIT_I32_OP, SLJIT_MEM1(SLJIT_S1), 4 * sizeof(sljit_s32));
5080 sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_MEM1(SLJIT_S1), sizeof(sljit_s32), SLJIT_R0, 0);
5081 sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_R1, 0, SLJIT_IMM, 5 * sizeof(sljit_s32));
5082 sljit_x86_emit_cmov(compiler, SLJIT_GREATER_EQUAL32, SLJIT_R0 | SLJIT_I32_OP, SLJIT_MEM2(SLJIT_S1, SLJIT_R1), 0);
5083 sljit_emit_op1(compiler, SLJIT_MOV32, SLJIT_MEM1(SLJIT_S1), 0, SLJIT_R0, 0);
5084 }
5085 #endif
5086
5087 sljit_emit_return(compiler, SLJIT_UNUSED, 0, 0);
5088
5089 code.code = sljit_generate_code(compiler);
5090 CHECK(compiler);
5091 sljit_free_compiler(compiler);
5092
5093 code.func2((sljit_sw)&buf, (sljit_sw)&ibuf);
5094
5095 #if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86)
5096 if (sljit_x86_is_cmov_available()) {
5097 FAILED(buf[1] != 17, "test54 case 1 failed\n");
5098 FAILED(buf[2] != 34, "test54 case 2 failed\n");
5099 FAILED(buf[3] != 24, "test54 case 3 failed\n");
5100 FAILED(buf[4] != 98, "test54 case 4 failed\n");
5101 FAILED(buf[5] != -135, "test54 case 5 failed\n");
5102 FAILED(ibuf[0] != 38, "test54 case 6 failed\n");
5103 FAILED(ibuf[1] != 67, "test54 case 7 failed\n");
5104 FAILED(ibuf[2] != 177, "test54 case 8 failed\n");
5105 FAILED(ibuf[3] != 177, "test54 case 9 failed\n");
5106 }
5107 #endif
5108
5109 FAILED(!compiler, "cannot create compiler\n");
5110 sljit_free_code(code.code);
5111 successful_tests++;
5112 }
5113
5114 void sljit_test(int argc, char* argv[])
5115 {
5116 sljit_s32 has_arg = (argc >= 2 && argv[1][0] == '-' && argv[1][2] == '\0');
5117 verbose = has_arg && argv[1][1] == 'v';
5118 silent = has_arg && argv[1][1] == 's';
5119
5120 if (!verbose && !silent)
5121 printf("Pass -v to enable verbose, -s to disable this hint.\n\n");
5122
5123 #if !(defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED)
5124 test_exec_allocator();
5125 #endif
5126 test1();
5127 test2();
5128 test3();
5129 test4();
5130 test5();
5131 test6();
5132 test7();
5133 test8();
5134 test9();
5135 test10();
5136 test11();
5137 test12();
5138 test13();
5139 test14();
5140 test15();
5141 test16();
5142 test17();
5143 test18();
5144 test19();
5145 test20();
5146 test21();
5147 test22();
5148 test23();
5149 test24();
5150 test25();
5151 test26();
5152 test27();
5153 test28();
5154 test29();
5155 test30();
5156 test31();
5157 test32();
5158 test33();
5159 test34();
5160 test35();
5161 test36();
5162 test37();
5163 test38();
5164 test39();
5165 test40();
5166 test41();
5167 test42();
5168 test43();
5169 test44();
5170 test45();
5171 test46();
5172 test47();
5173 test48();
5174 test49();
5175 test50();
5176 test51();
5177 test52();
5178 test53();
5179 test54();
5180
5181 #if (defined SLJIT_EXECUTABLE_ALLOCATOR && SLJIT_EXECUTABLE_ALLOCATOR)
5182 sljit_free_unused_memory_exec();
5183 #endif
5184
5185 # define TEST_COUNT 54
5186
5187 printf("SLJIT tests: ");
5188 if (successful_tests == TEST_COUNT)
5189 printf("all tests are " COLOR_GREEN "PASSED" COLOR_DEFAULT " ");
5190 else
5191 printf(COLOR_RED "%d" COLOR_DEFAULT " (" COLOR_RED "%d%%" COLOR_DEFAULT ") tests are " COLOR_RED "FAILED" COLOR_DEFAULT " ", TEST_COUNT - successful_tests, (TEST_COUNT - successful_tests) * 100 / 47);
5192 printf("on " COLOR_ARCH "%s" COLOR_DEFAULT "%s\n", sljit_get_platform_name(), sljit_is_fpu_available() ? " (with fpu)" : " (without fpu)");
5193
5194 # undef TEST_COUNT
5195 }
5196