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