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