xref: /netbsd-src/sys/external/bsd/sljit/dist/test_src/sljitTest.c (revision 63aea4bd5b445e491ff0389fe27ec78b3099dba3)
1 /*	$NetBSD: sljitTest.c,v 1.6 2015/05/09 13:16:42 christos 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_si successful_tests = 0;
58 static sljit_si verbose = 0;
59 static sljit_si 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_si dst, sljit_sw dstw, sljit_si 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();
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, 3, 3, 3, 0);
165 	sljit_emit_return(compiler, SLJIT_MOV, SLJIT_SAVED_REG2, 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();
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, 1, 3, 2, 0);
203 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_UNUSED, 0, SLJIT_MEM0(), (sljit_sw)&buf);
204 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 9999);
205 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SAVED_REG2, 0, SLJIT_SAVED_REG1, 0);
206 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG2), sizeof(sljit_sw), SLJIT_SCRATCH_REG1, 0);
207 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG2, 0, SLJIT_IMM, sizeof(sljit_sw));
208 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG3, 0, SLJIT_MEM2(SLJIT_SAVED_REG2, SLJIT_SCRATCH_REG2), 0);
209 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SAVED_REG1, 0, SLJIT_IMM, 2);
210 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM2(SLJIT_SAVED_REG2, SLJIT_SAVED_REG1), SLJIT_WORD_SHIFT, SLJIT_MEM2(SLJIT_SAVED_REG2, SLJIT_SCRATCH_REG2), 0);
211 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SAVED_REG1, 0, SLJIT_IMM, 3);
212 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM2(SLJIT_SAVED_REG2, SLJIT_SAVED_REG1), SLJIT_WORD_SHIFT, SLJIT_MEM0(), (sljit_sw)&buf);
213 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, sizeof(sljit_sw));
214 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_MEM1(SLJIT_SCRATCH_REG1), (sljit_sw)&data);
215 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG2), 4 * sizeof(sljit_sw), SLJIT_SCRATCH_REG1, 0);
216 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, (sljit_sw)&buf - 0x12345678);
217 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_MEM1(SLJIT_SCRATCH_REG1), 0x12345678);
218 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG2), 5 * sizeof(sljit_sw), SLJIT_SCRATCH_REG1, 0);
219 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 3456);
220 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG2, 0, SLJIT_IMM, (sljit_sw)&buf - 0xff890 + 6 * sizeof(sljit_sw));
221 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SCRATCH_REG2), 0xff890, SLJIT_SCRATCH_REG1, 0);
222 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG2, 0, SLJIT_IMM, (sljit_sw)&buf + 0xff890 + 7 * sizeof(sljit_sw));
223 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SCRATCH_REG2), -0xff890, SLJIT_SCRATCH_REG1, 0);
224 	sljit_emit_return(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG3, 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();
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, 1, 3, 1, 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_SAVED_REG1), sizeof(sljit_sw), SLJIT_MEM1(SLJIT_SAVED_REG1), 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_SAVED_REG1), 0);
265 	sljit_emit_op1(compiler, SLJIT_NOT, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw) * 3, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw) * 2);
266 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG2, 0, SLJIT_IMM, (sljit_sw)&buf[4] - 0xff0000 - 0x20);
267 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG3, 0, SLJIT_IMM, (sljit_sw)&buf[4] - 0xff0000);
268 	sljit_emit_op1(compiler, SLJIT_NOT, SLJIT_MEM1(SLJIT_SCRATCH_REG2), 0xff0000 + 0x20, SLJIT_MEM1(SLJIT_SCRATCH_REG3), 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();
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, 2, 3, 2, 0);
301 	sljit_emit_op1(compiler, SLJIT_NEG, SLJIT_UNUSED, 0, SLJIT_MEM1(SLJIT_SAVED_REG1), 0);
302 	sljit_emit_op1(compiler, SLJIT_NEG, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw) * 2, SLJIT_SAVED_REG2, 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_SAVED_REG2, 0);
305 	sljit_emit_op1(compiler, SLJIT_NEG, SLJIT_MEM1(SLJIT_SAVED_REG1), 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();
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, 1, 3, 2, 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_SAVED_REG1, 0, SLJIT_SAVED_REG1, 0);
346 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, sizeof(sljit_sw));
347 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG2, 0, SLJIT_IMM, 50);
348 	sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_MEM2(SLJIT_SAVED_REG1, SLJIT_SCRATCH_REG1), 1, SLJIT_MEM2(SLJIT_SAVED_REG1, SLJIT_SCRATCH_REG1), 1, SLJIT_MEM2(SLJIT_SAVED_REG1, SLJIT_SCRATCH_REG1), 0);
349 	sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, sizeof(sljit_sw) + 2);
350 	sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_SCRATCH_REG2, 0, SLJIT_SCRATCH_REG2, 0, SLJIT_IMM, 50);
351 	sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_MEM1(SLJIT_SAVED_REG1), 0);
352 	sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_MEM1(SLJIT_SAVED_REG1), 0, SLJIT_MEM1(SLJIT_SAVED_REG1), 0, SLJIT_SCRATCH_REG1, 0);
353 	sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 4, SLJIT_SCRATCH_REG1, 0);
354 	sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_SCRATCH_REG2, 0, SLJIT_IMM, 50, SLJIT_SCRATCH_REG2, 0);
355 	sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_MEM1(SLJIT_SAVED_REG1), 5 * sizeof(sljit_sw), SLJIT_IMM, 50, SLJIT_MEM1(SLJIT_SAVED_REG1), 5 * sizeof(sljit_sw));
356 	sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_SCRATCH_REG2, 0, SLJIT_MEM1(SLJIT_SAVED_REG1), 5 * sizeof(sljit_sw), SLJIT_SCRATCH_REG2, 0);
357 	sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_MEM1(SLJIT_SAVED_REG1), 4 * sizeof(sljit_sw), SLJIT_SCRATCH_REG2, 0, SLJIT_MEM1(SLJIT_SAVED_REG1), 4 * sizeof(sljit_sw));
358 	sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_MEM1(SLJIT_SAVED_REG1), 5 * sizeof(sljit_sw), SLJIT_MEM1(SLJIT_SAVED_REG1), 4 * sizeof(sljit_sw), SLJIT_MEM1(SLJIT_SAVED_REG1), 5 * sizeof(sljit_sw));
359 	sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_MEM1(SLJIT_SAVED_REG1), 3 * sizeof(sljit_sw), SLJIT_MEM1(SLJIT_SAVED_REG1), 4 * sizeof(sljit_sw), SLJIT_SCRATCH_REG2, 0);
360 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG2, 0, SLJIT_IMM, 0x1e7d39f2);
361 	sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_MEM1(SLJIT_SAVED_REG1), 6 * sizeof(sljit_sw), SLJIT_SCRATCH_REG2, 0, SLJIT_IMM, 0x23de7c06);
362 	sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_MEM1(SLJIT_SAVED_REG1), 7 * sizeof(sljit_sw), SLJIT_IMM, 0x3d72e452, SLJIT_SCRATCH_REG2, 0);
363 	sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_MEM1(SLJIT_SAVED_REG1), 8 * sizeof(sljit_sw), SLJIT_IMM, -43, SLJIT_MEM1(SLJIT_SAVED_REG1), 8 * sizeof(sljit_sw));
364 	sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 1000, SLJIT_SCRATCH_REG1, 0);
365 	sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 1430);
366 	sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, -99, SLJIT_SCRATCH_REG1, 0);
367 
368 	sljit_emit_return(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 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();
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, 1, 3, 1, 0);
411 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, -1);
412 	sljit_emit_op2(compiler, SLJIT_ADD | SLJIT_SET_C, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, -1);
413 	sljit_emit_op2(compiler, SLJIT_ADDC, SLJIT_MEM1(SLJIT_SAVED_REG1), 0, SLJIT_IMM, 0, SLJIT_IMM, 0);
414 	sljit_emit_op2(compiler, SLJIT_ADD | SLJIT_SET_C, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG1, 0);
415 	sljit_emit_op2(compiler, SLJIT_ADDC, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw), SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw), SLJIT_IMM, 4);
416 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 100);
417 	sljit_emit_op2(compiler, SLJIT_SUB, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw) * 2, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 50);
418 	sljit_emit_op2(compiler, SLJIT_SUB | SLJIT_SET_C, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 6000);
419 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw) * 3, SLJIT_IMM, 10);
420 	sljit_emit_op2(compiler, SLJIT_SUBC, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw) * 3, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw) * 3, SLJIT_IMM, 5);
421 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 100);
422 	sljit_emit_op2(compiler, SLJIT_SUB, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw) * 2);
423 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw) * 4, SLJIT_SCRATCH_REG1, 0);
424 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 5000);
425 	sljit_emit_op2(compiler, SLJIT_SUB, SLJIT_SCRATCH_REG2, 0, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw) * 4, SLJIT_SCRATCH_REG1, 0);
426 	sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_SCRATCH_REG2, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG2, 0);
427 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw) * 5, SLJIT_SCRATCH_REG2, 0);
428 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 5000);
429 	sljit_emit_op2(compiler, SLJIT_SUB, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 6000, SLJIT_SCRATCH_REG1, 0);
430 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw) * 6, SLJIT_SCRATCH_REG1, 0);
431 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 100);
432 	sljit_emit_op2(compiler, SLJIT_SUB, SLJIT_SCRATCH_REG2, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 32768);
433 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw) * 7, SLJIT_SCRATCH_REG2, 0);
434 	sljit_emit_op2(compiler, SLJIT_SUB, SLJIT_SCRATCH_REG2, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, -32767);
435 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw) * 8, SLJIT_SCRATCH_REG2, 0);
436 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 0x52cd3bf4);
437 	sljit_emit_op2(compiler, SLJIT_SUB, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw) * 9, SLJIT_SCRATCH_REG1, 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();
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, 1, 3, 1, 0);
485 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 0xf0C000);
486 	sljit_emit_op2(compiler, SLJIT_OR, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw) * 2, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 0x308f);
487 	sljit_emit_op2(compiler, SLJIT_XOR, SLJIT_MEM1(SLJIT_SAVED_REG1), 0, SLJIT_MEM1(SLJIT_SAVED_REG1), 0, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw));
488 	sljit_emit_op2(compiler, SLJIT_AND, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw) * 3, SLJIT_IMM, 0xf0f0f0, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw) * 3);
489 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 0xC0F0);
490 	sljit_emit_op2(compiler, SLJIT_XOR, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw) * 5);
491 	sljit_emit_op2(compiler, SLJIT_OR, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 0xff0000);
492 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw) * 4, SLJIT_SCRATCH_REG1, 0);
493 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG3, 0, SLJIT_IMM, 0xC0F0);
494 	sljit_emit_op2(compiler, SLJIT_AND, SLJIT_SCRATCH_REG3, 0, SLJIT_SCRATCH_REG3, 0, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw) * 5);
495 	sljit_emit_op2(compiler, SLJIT_OR, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw) * 5, SLJIT_SCRATCH_REG3, 0, SLJIT_IMM, 0xff0000);
496 	sljit_emit_op2(compiler, SLJIT_XOR, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw), SLJIT_IMM, 0xFFFFFF, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw));
497 	sljit_emit_op2(compiler, SLJIT_OR, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw) * 6, SLJIT_IMM, 0xa56c82c0, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw) * 6);
498 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw) * 7);
499 	sljit_emit_op2(compiler, SLJIT_XOR, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw) * 7, SLJIT_IMM, 0xff00ff00, SLJIT_SCRATCH_REG1, 0);
500 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 0xff00ff00);
501 	sljit_emit_op2(compiler, SLJIT_OR, SLJIT_SCRATCH_REG2, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 0x0f);
502 	sljit_emit_op2(compiler, SLJIT_AND, SLJIT_RETURN_REG, 0, SLJIT_IMM, 0x888888, SLJIT_SCRATCH_REG2, 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();
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, 1, 3, 2, 0);
549 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 20);
550 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG2, 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_SAVED_REG1), sizeof(sljit_sw), SLJIT_UNUSED, 0, SLJIT_C_NOT_EQUAL);
553 	sljit_emit_op_flags(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw) * 2, SLJIT_UNUSED, 0, SLJIT_C_EQUAL);
554 	sljit_emit_op2(compiler, SLJIT_SUB | SLJIT_SET_U, SLJIT_UNUSED, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 3000);
555 	sljit_emit_op_flags(compiler, SLJIT_MOV, SLJIT_SAVED_REG2, 0, SLJIT_UNUSED, 0, SLJIT_C_GREATER);
556 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw) * 3, SLJIT_SAVED_REG2, 0);
557 	sljit_emit_op_flags(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG3, 0, SLJIT_UNUSED, 0, SLJIT_C_LESS);
558 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw) * 4, SLJIT_SCRATCH_REG3, 0);
559 	sljit_emit_op2(compiler, SLJIT_SUB | SLJIT_SET_S, SLJIT_UNUSED, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, -15);
560 	sljit_emit_op_flags(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG3, 0, SLJIT_UNUSED, 0, SLJIT_C_SIG_GREATER);
561 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw) * 5, SLJIT_SCRATCH_REG3, 0);
562 	sljit_emit_op2(compiler, SLJIT_SUB | SLJIT_SET_E | SLJIT_SET_O, SLJIT_UNUSED, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG2, 0);
563 	sljit_emit_op2(compiler, SLJIT_SUB | SLJIT_SET_E | SLJIT_SET_O, SLJIT_UNUSED, 0, SLJIT_MEM1(SLJIT_SAVED_REG1), 0, SLJIT_SCRATCH_REG1, 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_SAVED_REG1), sizeof(sljit_sw) * 6, SLJIT_UNUSED, 0, SLJIT_C_OVERFLOW);
566 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, -1);
567 	sljit_emit_op1(compiler, SLJIT_NOT | SLJIT_SET_E, SLJIT_SCRATCH_REG2, 0, SLJIT_SCRATCH_REG1, 0);
568 	sljit_emit_op_flags(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw) * 7, SLJIT_UNUSED, 0, SLJIT_C_ZERO);
569 	sljit_emit_op1(compiler, SLJIT_NOT | SLJIT_SET_E, SLJIT_UNUSED, 0, SLJIT_SCRATCH_REG2, 0);
570 	sljit_emit_op_flags(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw) * 8, SLJIT_UNUSED, 0, SLJIT_C_ZERO);
571 	sljit_emit_op2(compiler, SLJIT_AND | SLJIT_SET_E, SLJIT_UNUSED, 0, SLJIT_IMM, 0xffff, SLJIT_SCRATCH_REG1, 0);
572 	sljit_emit_op2(compiler, SLJIT_AND | SLJIT_SET_E, SLJIT_UNUSED, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 0xffff);
573 	sljit_emit_op_flags(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw) * 9, SLJIT_UNUSED, 0, SLJIT_C_NOT_ZERO);
574 	sljit_emit_op2(compiler, SLJIT_AND | SLJIT_SET_E, SLJIT_UNUSED, 0, SLJIT_IMM, 0xffff, SLJIT_SCRATCH_REG2, 0);
575 	sljit_emit_op2(compiler, SLJIT_AND | SLJIT_SET_E, SLJIT_UNUSED, 0, SLJIT_SCRATCH_REG2, 0, SLJIT_IMM, 0xffff);
576 	sljit_emit_op2(compiler, SLJIT_AND | SLJIT_SET_E, SLJIT_UNUSED, 0, SLJIT_MEM1(SLJIT_SAVED_REG1), 0, SLJIT_SCRATCH_REG2, 0);
577 	sljit_emit_op2(compiler, SLJIT_AND | SLJIT_SET_E, SLJIT_UNUSED, 0, SLJIT_SCRATCH_REG2, 0, SLJIT_MEM1(SLJIT_SAVED_REG1), 0);
578 	sljit_emit_op2(compiler, SLJIT_AND | SLJIT_SET_E, SLJIT_UNUSED, 0, SLJIT_MEM1(SLJIT_SAVED_REG1), 0, SLJIT_MEM1(SLJIT_SAVED_REG1), 0);
579 	sljit_emit_op2(compiler, SLJIT_AND | SLJIT_SET_E, SLJIT_UNUSED, 0, SLJIT_MEM1(SLJIT_SAVED_REG1), 0, SLJIT_IMM, 0x1);
580 	sljit_emit_op_flags(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw) * 10, SLJIT_UNUSED, 0, SLJIT_C_NOT_ZERO);
581 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, (sljit_sw)1 << ((sizeof(sljit_sw) << 3) - 1));
582 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG2, 0, SLJIT_IMM, 0);
583 	sljit_emit_op2(compiler, SLJIT_SUB | SLJIT_SET_O, SLJIT_UNUSED, 0, SLJIT_SCRATCH_REG2, 0, SLJIT_SCRATCH_REG1, 0);
584 	sljit_emit_op_flags(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw) * 11, SLJIT_UNUSED, 0, SLJIT_C_OVERFLOW);
585 	sljit_emit_op2(compiler, SLJIT_ADD | SLJIT_SET_O, SLJIT_UNUSED, 0, SLJIT_SCRATCH_REG2, 0, SLJIT_SCRATCH_REG1, 0);
586 	sljit_emit_op_flags(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw) * 12, SLJIT_UNUSED, 0, SLJIT_C_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();
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, 1, 3, 2, 0);
637 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 0xf);
638 	sljit_emit_op2(compiler, SLJIT_SHL, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 3);
639 	sljit_emit_op2(compiler, SLJIT_LSHR, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 1);
640 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), 0, SLJIT_SCRATCH_REG1, 0);
641 	sljit_emit_op2(compiler, SLJIT_ASHR, SLJIT_UNUSED, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 2);
642 	sljit_emit_op2(compiler, SLJIT_SHL, SLJIT_SCRATCH_REG2, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 1);
643 	sljit_emit_op2(compiler, SLJIT_SHL, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw), SLJIT_SCRATCH_REG2, 0, SLJIT_IMM, 1);
644 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 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_SAVED_REG1), sizeof(sljit_sw) * 2, SLJIT_SCRATCH_REG1, 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_SCRATCH_REG1, 0, SLJIT_IMM, 4);
650 	sljit_emit_op2(compiler, SLJIT_SHL, SLJIT_PREF_SHIFT_REG, 0, SLJIT_PREF_SHIFT_REG, 0, SLJIT_SCRATCH_REG1, 0);
651 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), 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_SCRATCH_REG1, 0, SLJIT_IMM, 8);
654 	sljit_emit_op2(compiler, SLJIT_LSHR, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw) * 4, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw) * 4, SLJIT_SCRATCH_REG1, 0);
655 	sljit_emit_op2(compiler, SLJIT_SHL, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw) * 5, SLJIT_PREF_SHIFT_REG, 0, SLJIT_SCRATCH_REG1, 0);
656 
657 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SAVED_REG2, 0, SLJIT_IMM, 0xf);
658 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 2);
659 	sljit_emit_op2(compiler, SLJIT_SHL, SLJIT_SAVED_REG2, 0, SLJIT_SAVED_REG2, 0, SLJIT_SCRATCH_REG1, 0);
660 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw) * 6, SLJIT_SAVED_REG2, 0);
661 	sljit_emit_op2(compiler, SLJIT_SHL, SLJIT_SCRATCH_REG1, 0, SLJIT_SAVED_REG2, 0, SLJIT_SCRATCH_REG1, 0);
662 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw) * 7, SLJIT_SCRATCH_REG1, 0);
663 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG3, 0, SLJIT_IMM, 0xf00);
664 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 4);
665 	sljit_emit_op2(compiler, SLJIT_LSHR, SLJIT_SCRATCH_REG2, 0, SLJIT_SCRATCH_REG3, 0, SLJIT_SCRATCH_REG1, 0);
666 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw) * 8, SLJIT_SCRATCH_REG2, 0);
667 
668 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, (sljit_sw)buf);
669 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG2, 0, SLJIT_IMM, 9);
670 	sljit_emit_op2(compiler, SLJIT_SHL, SLJIT_MEM2(SLJIT_SCRATCH_REG1, SLJIT_SCRATCH_REG2), SLJIT_WORD_SHIFT, SLJIT_MEM2(SLJIT_SCRATCH_REG1, SLJIT_SCRATCH_REG2), SLJIT_WORD_SHIFT, SLJIT_MEM2(SLJIT_SCRATCH_REG1, SLJIT_SCRATCH_REG2), 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_SAVED_REG1), sizeof(sljit_sw) * 10, SLJIT_PREF_SHIFT_REG, 0);
675 
676 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 0xa9);
677 	sljit_emit_op2(compiler, SLJIT_SHL, SLJIT_SCRATCH_REG2, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 0);
678 	sljit_emit_op1(compiler, SLJIT_IMOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 0x7d00);
679 	sljit_emit_op2(compiler, SLJIT_ILSHR, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 32);
680 #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
681 	sljit_emit_op1(compiler, SLJIT_MOV_UI, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG1, 0);
682 #endif
683 	sljit_emit_op2(compiler, SLJIT_OR, SLJIT_SCRATCH_REG2, 0, SLJIT_SCRATCH_REG2, 0, SLJIT_SCRATCH_REG1, 0);
684 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 0xe30000);
685 #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
686 	sljit_emit_op2(compiler, SLJIT_ASHR, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 0xffc0);
687 #else
688 	sljit_emit_op2(compiler, SLJIT_ASHR, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 0xffe0);
689 #endif
690 	sljit_emit_op2(compiler, SLJIT_OR, SLJIT_SCRATCH_REG2, 0, SLJIT_SCRATCH_REG2, 0, SLJIT_SCRATCH_REG1, 0);
691 	sljit_emit_op1(compiler, SLJIT_MOV_SI | SLJIT_INT_OP, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 0x25000000);
692 	sljit_emit_op2(compiler, SLJIT_ISHL, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 0xfffe1);
693 #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
694 	sljit_emit_op1(compiler, SLJIT_MOV_UI, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG1, 0);
695 #endif
696 	sljit_emit_op2(compiler, SLJIT_OR, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw) * 11, SLJIT_SCRATCH_REG2, 0, SLJIT_SCRATCH_REG1, 0);
697 
698 	SLJIT_ASSERT(SLJIT_SCRATCH_REG3 == 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_SCRATCH_REG1, 0, SLJIT_IMM, 0x5c);
701 	sljit_emit_op2(compiler, SLJIT_SHL, SLJIT_SCRATCH_REG2, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_PREF_SHIFT_REG, 0);
702 	sljit_emit_op1(compiler, SLJIT_IMOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 0xf600);
703 	sljit_emit_op2(compiler, SLJIT_ILSHR, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG1, 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_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 0xffffffff);
707 #endif
708 	sljit_emit_op2(compiler, SLJIT_OR, SLJIT_SCRATCH_REG2, 0, SLJIT_SCRATCH_REG2, 0, SLJIT_SCRATCH_REG1, 0);
709 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 0x630000);
710 	sljit_emit_op2(compiler, SLJIT_ASHR, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_PREF_SHIFT_REG, 0);
711 	sljit_emit_op2(compiler, SLJIT_OR, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw) * 12, SLJIT_SCRATCH_REG2, 0, SLJIT_SCRATCH_REG1, 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();
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, 1, 3, 1, 0);
758 
759 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 5);
760 	sljit_emit_op2(compiler, SLJIT_MUL, SLJIT_SCRATCH_REG1, 0, SLJIT_MEM1(SLJIT_SAVED_REG1), 0, SLJIT_SCRATCH_REG1, 0);
761 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), 0, SLJIT_SCRATCH_REG1, 0);
762 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG3, 0, SLJIT_IMM, 7);
763 	sljit_emit_op2(compiler, SLJIT_MUL, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG3, 0, SLJIT_IMM, 8);
764 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw), SLJIT_SCRATCH_REG1, 0);
765 	sljit_emit_op2(compiler, SLJIT_MUL, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, -3, SLJIT_IMM, -4);
766 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw) * 2, SLJIT_SCRATCH_REG1, 0);
767 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, -2);
768 	sljit_emit_op2(compiler, SLJIT_MUL, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw) * 3, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw) * 3, SLJIT_SCRATCH_REG1, 0);
769 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, sizeof(sljit_sw) / 2);
770 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG2, 0, SLJIT_IMM, (sljit_sw)&buf[3]);
771 	sljit_emit_op2(compiler, SLJIT_MUL, SLJIT_MEM2(SLJIT_SCRATCH_REG2, SLJIT_SCRATCH_REG1), 1, SLJIT_MEM2(SLJIT_SCRATCH_REG2, SLJIT_SCRATCH_REG1), 1, SLJIT_MEM2(SLJIT_SCRATCH_REG2, SLJIT_SCRATCH_REG1), 1);
772 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 9);
773 	sljit_emit_op2(compiler, SLJIT_MUL, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG1, 0);
774 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw) * 5, SLJIT_SCRATCH_REG1, 0);
775 #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
776 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG2, 0, SLJIT_IMM, 3);
777 	sljit_emit_op2(compiler, SLJIT_MUL, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG2, 0, SLJIT_IMM, SLJIT_W(0x123456789));
778 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw) * 6, SLJIT_SCRATCH_REG1, 0);
779 #endif
780 	sljit_emit_op2(compiler, SLJIT_MUL, SLJIT_RETURN_REG, 0, SLJIT_IMM, 11, SLJIT_IMM, 10);
781 	sljit_emit_return(compiler, SLJIT_MOV, SLJIT_RETURN_REG, 0);
782 
783 	code.code = sljit_generate_code(compiler);
784 	CHECK(compiler);
785 	sljit_free_compiler(compiler);
786 
787 	FAILED(code.func1((sljit_sw)&buf) != 110, "test10 case 1 failed\n");
788 	FAILED(buf[0] != 15, "test10 case 2 failed\n");
789 	FAILED(buf[1] != 56, "test10 case 3 failed\n");
790 	FAILED(buf[2] != 12, "test10 case 4 failed\n");
791 	FAILED(buf[3] != -12, "test10 case 5 failed\n");
792 	FAILED(buf[4] != 100, "test10 case 6 failed\n");
793 	FAILED(buf[5] != 81, "test10 case 7 failed\n");
794 #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
795 	FAILED(buf[6] != SLJIT_W(0x123456789) * 3, "test10 case 8 failed\n");
796 #endif
797 
798 	sljit_free_code(code.code);
799 	successful_tests++;
800 }
801 
802 static void test11(void)
803 {
804 	/* Test rewritable constants. */
805 	executable_code code;
806 	struct sljit_compiler* compiler = sljit_create_compiler();
807 	struct sljit_const* const1;
808 	struct sljit_const* const2;
809 	struct sljit_const* const3;
810 	struct sljit_const* const4;
811 	void* value;
812 	sljit_uw const1_addr;
813 	sljit_uw const2_addr;
814 	sljit_uw const3_addr;
815 	sljit_uw const4_addr;
816 #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
817 	sljit_sw word_value1 = SLJIT_W(0xaaaaaaaaaaaaaaaa);
818 	sljit_sw word_value2 = SLJIT_W(0xfee1deadfbadf00d);
819 #else
820 	sljit_sw word_value1 = 0xaaaaaaaal;
821 	sljit_sw word_value2 = 0xfbadf00dl;
822 #endif
823 	sljit_sw buf[3];
824 
825 	if (verbose)
826 		printf("Run test11\n");
827 
828 	FAILED(!compiler, "cannot create compiler\n");
829 	buf[0] = 0;
830 	buf[1] = 0;
831 	buf[2] = 0;
832 
833 	sljit_emit_enter(compiler, 1, 3, 1, 0);
834 
835 	const1 = sljit_emit_const(compiler, SLJIT_MEM0(), (sljit_sw)&buf[0], -0x81b9);
836 	SLJIT_ASSERT(!sljit_alloc_memory(compiler, 0));
837 	SLJIT_ASSERT(!sljit_alloc_memory(compiler, 16 * sizeof(sljit_sw) + 1));
838 	value = sljit_alloc_memory(compiler, 16 * sizeof(sljit_sw));
839 	SLJIT_ASSERT(!((sljit_sw)value & (sizeof(sljit_sw) - 1)));
840 	memset(value, 255, 16 * sizeof(sljit_sw));
841 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 2);
842 	const2 = sljit_emit_const(compiler, SLJIT_MEM2(SLJIT_SAVED_REG1, SLJIT_SCRATCH_REG1), SLJIT_WORD_SHIFT - 1, -65535);
843 	sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, (sljit_sw)&buf[0] + 2 * sizeof(sljit_sw) - 2);
844 	const3 = sljit_emit_const(compiler, SLJIT_MEM1(SLJIT_SCRATCH_REG1), 0, word_value1);
845 	value = sljit_alloc_memory(compiler, 17);
846 	SLJIT_ASSERT(!((sljit_sw)value & (sizeof(sljit_sw) - 1)));
847 	memset(value, 255, 16);
848 	const4 = sljit_emit_const(compiler, SLJIT_RETURN_REG, 0, 0xf7afcdb7);
849 
850 	sljit_emit_return(compiler, SLJIT_MOV, SLJIT_RETURN_REG, 0);
851 
852 	code.code = sljit_generate_code(compiler);
853 	CHECK(compiler);
854 	const1_addr = sljit_get_const_addr(const1);
855 	const2_addr = sljit_get_const_addr(const2);
856 	const3_addr = sljit_get_const_addr(const3);
857 	const4_addr = sljit_get_const_addr(const4);
858 	sljit_free_compiler(compiler);
859 
860 	FAILED(code.func1((sljit_sw)&buf) != 0xf7afcdb7, "test11 case 1 failed\n");
861 	FAILED(buf[0] != -0x81b9, "test11 case 2 failed\n");
862 	FAILED(buf[1] != -65535, "test11 case 3 failed\n");
863 	FAILED(buf[2] != word_value1, "test11 case 4 failed\n");
864 
865 	sljit_set_const(const1_addr, -1);
866 	sljit_set_const(const2_addr, word_value2);
867 	sljit_set_const(const3_addr, 0xbab0fea1);
868 	sljit_set_const(const4_addr, -60089);
869 
870 	FAILED(code.func1((sljit_sw)&buf) != -60089, "test11 case 5 failed\n");
871 	FAILED(buf[0] != -1, "test11 case 6 failed\n");
872 	FAILED(buf[1] != word_value2, "test11 case 7 failed\n");
873 	FAILED(buf[2] != 0xbab0fea1, "test11 case 8 failed\n");
874 
875 	sljit_free_code(code.code);
876 	successful_tests++;
877 }
878 
879 static void test12(void)
880 {
881 	/* Test rewriteable jumps. */
882 	executable_code code;
883 	struct sljit_compiler* compiler = sljit_create_compiler();
884 	struct sljit_label *label1;
885 	struct sljit_label *label2;
886 	struct sljit_label *label3;
887 	struct sljit_jump *jump1;
888 	struct sljit_jump *jump2;
889 	struct sljit_jump *jump3;
890 	void* value;
891 	sljit_uw jump1_addr;
892 	sljit_uw label1_addr;
893 	sljit_uw label2_addr;
894 	sljit_sw buf[1];
895 
896 	if (verbose)
897 		printf("Run test12\n");
898 
899 	FAILED(!compiler, "cannot create compiler\n");
900 	buf[0] = 0;
901 
902 	sljit_emit_enter(compiler, 2, 3, 2, 0);
903 	sljit_emit_op2(compiler, SLJIT_SUB | SLJIT_SET_S, SLJIT_UNUSED, 0, SLJIT_SAVED_REG2, 0, SLJIT_IMM, 10);
904 	jump1 = sljit_emit_jump(compiler, SLJIT_REWRITABLE_JUMP | SLJIT_C_SIG_GREATER);
905 	/* Default handler. */
906 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), 0, SLJIT_IMM, 5);
907 	jump2 = sljit_emit_jump(compiler, SLJIT_JUMP);
908 	value = sljit_alloc_memory(compiler, 15);
909 	SLJIT_ASSERT(!((sljit_sw)value & (sizeof(sljit_sw) - 1)));
910 	memset(value, 255, 15);
911 	/* Handler 1. */
912 	label1 = sljit_emit_label(compiler);
913 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), 0, SLJIT_IMM, 6);
914 	jump3 = sljit_emit_jump(compiler, SLJIT_JUMP);
915 	/* Handler 2. */
916 	label2 = sljit_emit_label(compiler);
917 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), 0, SLJIT_IMM, 7);
918 	/* Exit. */
919 	label3 = sljit_emit_label(compiler);
920 	sljit_set_label(jump2, label3);
921 	sljit_set_label(jump3, label3);
922 	/* By default, set to handler 1. */
923 	sljit_set_label(jump1, label1);
924 	sljit_emit_return(compiler, SLJIT_UNUSED, 0, 0);
925 
926 	value = sljit_alloc_memory(compiler, 8);
927 	SLJIT_ASSERT(!((sljit_sw)value & (sizeof(sljit_sw) - 1)));
928 	memset(value, 255, 8);
929 
930 	code.code = sljit_generate_code(compiler);
931 	CHECK(compiler);
932 	jump1_addr = sljit_get_jump_addr(jump1);
933 	label1_addr = sljit_get_label_addr(label1);
934 	label2_addr = sljit_get_label_addr(label2);
935 	sljit_free_compiler(compiler);
936 
937 	code.func2((sljit_sw)&buf, 4);
938 	FAILED(buf[0] != 5, "test12 case 1 failed\n");
939 
940 	code.func2((sljit_sw)&buf, 11);
941 	FAILED(buf[0] != 6, "test12 case 2 failed\n");
942 
943 	sljit_set_jump_addr(jump1_addr, label2_addr);
944 	code.func2((sljit_sw)&buf, 12);
945 	FAILED(buf[0] != 7, "test12 case 3 failed\n");
946 
947 	sljit_set_jump_addr(jump1_addr, label1_addr);
948 	code.func2((sljit_sw)&buf, 13);
949 	FAILED(buf[0] != 6, "test12 case 4 failed\n");
950 
951 	sljit_free_code(code.code);
952 	successful_tests++;
953 }
954 
955 static void test13(void)
956 {
957 	/* Test fpu monadic functions. */
958 	executable_code code;
959 	struct sljit_compiler* compiler = sljit_create_compiler();
960 	sljit_d buf[7];
961 	sljit_sw buf2[6];
962 
963 	if (verbose)
964 		printf("Run test13\n");
965 
966 	if (!sljit_is_fpu_available()) {
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, 2, 3, 2, 0);
991 	sljit_emit_fop1(compiler, SLJIT_MOVD, SLJIT_MEM0(), (sljit_sw)&buf[2], SLJIT_MEM0(), (sljit_sw)&buf[1]);
992 	sljit_emit_fop1(compiler, SLJIT_ABSD, SLJIT_MEM1(SLJIT_SAVED_REG1), 3 * sizeof(sljit_d), SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_d));
993 	sljit_emit_fop1(compiler, SLJIT_MOVD, SLJIT_FLOAT_REG1, 0, SLJIT_MEM0(), (sljit_sw)&buf[0]);
994 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 2 * sizeof(sljit_d));
995 	sljit_emit_fop1(compiler, SLJIT_MOVD, SLJIT_FLOAT_REG2, 0, SLJIT_MEM2(SLJIT_SAVED_REG1, SLJIT_SCRATCH_REG1), 0);
996 	sljit_emit_fop1(compiler, SLJIT_NEGD, SLJIT_FLOAT_REG3, 0, SLJIT_FLOAT_REG1, 0);
997 	sljit_emit_fop1(compiler, SLJIT_MOVD, SLJIT_FLOAT_REG4, 0, SLJIT_FLOAT_REG3, 0);
998 	sljit_emit_fop1(compiler, SLJIT_MOVD, SLJIT_MEM0(), (sljit_sw)&buf[4], SLJIT_FLOAT_REG4, 0);
999 	sljit_emit_fop1(compiler, SLJIT_ABSD, SLJIT_FLOAT_REG5, 0, SLJIT_FLOAT_REG2, 0);
1000 	sljit_emit_fop1(compiler, SLJIT_MOVD, SLJIT_MEM1(SLJIT_SAVED_REG1), 5 * sizeof(sljit_d), SLJIT_FLOAT_REG5, 0);
1001 	sljit_emit_fop1(compiler, SLJIT_NEGD, SLJIT_MEM1(SLJIT_SAVED_REG1), 6 * sizeof(sljit_d), SLJIT_FLOAT_REG5, 0);
1002 
1003 	sljit_emit_fop1(compiler, SLJIT_MOVD, SLJIT_FLOAT_REG6, 0, SLJIT_MEM1(SLJIT_SAVED_REG1), 0);
1004 	sljit_emit_fop1(compiler, SLJIT_CMPD | SLJIT_SET_S, SLJIT_FLOAT_REG6, 0, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_d));
1005 	sljit_emit_op_flags(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG2), 0, SLJIT_UNUSED, 0, SLJIT_C_FLOAT_GREATER);
1006 	sljit_emit_fop1(compiler, SLJIT_CMPD | SLJIT_SET_S, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_d), SLJIT_FLOAT_REG6, 0);
1007 	sljit_emit_op_flags(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG2), sizeof(sljit_sw), SLJIT_UNUSED, 0, SLJIT_C_FLOAT_GREATER);
1008 	sljit_emit_fop1(compiler, SLJIT_MOVD, SLJIT_FLOAT_REG2, 0, SLJIT_FLOAT_REG6, 0);
1009 	sljit_emit_fop1(compiler, SLJIT_CMPD | SLJIT_SET_E | SLJIT_SET_S, SLJIT_FLOAT_REG2, 0, SLJIT_FLOAT_REG2, 0);
1010 	sljit_emit_op_flags(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG2), 2 * sizeof(sljit_sw), SLJIT_UNUSED, 0, SLJIT_C_FLOAT_EQUAL);
1011 	sljit_emit_op_flags(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG2), 3 * sizeof(sljit_sw), SLJIT_UNUSED, 0, SLJIT_C_FLOAT_LESS);
1012 	sljit_emit_fop1(compiler, SLJIT_CMPD | SLJIT_SET_E, SLJIT_FLOAT_REG2, 0, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_d));
1013 	sljit_emit_op_flags(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG2), 4 * sizeof(sljit_sw), SLJIT_UNUSED, 0, SLJIT_C_FLOAT_EQUAL);
1014 	sljit_emit_op_flags(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG2), 5 * sizeof(sljit_sw), SLJIT_UNUSED, 0, SLJIT_C_FLOAT_NOT_EQUAL);
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();
1045 	sljit_d buf[15];
1046 
1047 	if (verbose)
1048 		printf("Run test14\n");
1049 
1050 	if (!sljit_is_fpu_available()) {
1051 		printf("no fpu available, test14 skipped\n");
1052 		successful_tests++;
1053 		if (compiler)
1054 			sljit_free_compiler(compiler);
1055 		return;
1056 	}
1057 	buf[0] = 7.25;
1058 	buf[1] = 3.5;
1059 	buf[2] = 1.75;
1060 	buf[3] = 0.0;
1061 	buf[4] = 0.0;
1062 	buf[5] = 0.0;
1063 	buf[6] = 0.0;
1064 	buf[7] = 0.0;
1065 	buf[8] = 0.0;
1066 	buf[9] = 0.0;
1067 	buf[10] = 0.0;
1068 	buf[11] = 0.0;
1069 	buf[12] = 8.0;
1070 	buf[13] = 4.0;
1071 	buf[14] = 0.0;
1072 
1073 	FAILED(!compiler, "cannot create compiler\n");
1074 	sljit_emit_enter(compiler, 1, 3, 1, 0);
1075 
1076 	/* ADD */
1077 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, sizeof(sljit_d));
1078 	sljit_emit_fop1(compiler, SLJIT_MOVD, SLJIT_FLOAT_REG1, 0, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_d));
1079 	sljit_emit_fop1(compiler, SLJIT_MOVD, SLJIT_FLOAT_REG2, 0, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_d) * 2);
1080 	sljit_emit_fop2(compiler, SLJIT_ADDD, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_d) * 3, SLJIT_MEM2(SLJIT_SAVED_REG1, SLJIT_SCRATCH_REG1), 0, SLJIT_MEM1(SLJIT_SAVED_REG1), 0);
1081 	sljit_emit_fop2(compiler, SLJIT_ADDD, SLJIT_FLOAT_REG1, 0, SLJIT_FLOAT_REG1, 0, SLJIT_FLOAT_REG2, 0);
1082 	sljit_emit_fop2(compiler, SLJIT_ADDD, SLJIT_FLOAT_REG2, 0, SLJIT_FLOAT_REG1, 0, SLJIT_FLOAT_REG2, 0);
1083 	sljit_emit_fop1(compiler, SLJIT_MOVD, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_d) * 4, SLJIT_FLOAT_REG1, 0);
1084 	sljit_emit_fop1(compiler, SLJIT_MOVD, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_d) * 5, SLJIT_FLOAT_REG2, 0);
1085 
1086 	/* SUB */
1087 	sljit_emit_fop1(compiler, SLJIT_MOVD, SLJIT_FLOAT_REG3, 0, SLJIT_MEM1(SLJIT_SAVED_REG1), 0);
1088 	sljit_emit_fop1(compiler, SLJIT_MOVD, SLJIT_FLOAT_REG4, 0, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_d) * 2);
1089 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG2, 0, SLJIT_IMM, 2);
1090 	sljit_emit_fop2(compiler, SLJIT_SUBD, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_d) * 6, SLJIT_FLOAT_REG4, 0, SLJIT_MEM2(SLJIT_SAVED_REG1, SLJIT_SCRATCH_REG2), SLJIT_DOUBLE_SHIFT);
1091 	sljit_emit_fop2(compiler, SLJIT_SUBD, SLJIT_FLOAT_REG3, 0, SLJIT_FLOAT_REG3, 0, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_d) * 2);
1092 	sljit_emit_fop2(compiler, SLJIT_SUBD, SLJIT_FLOAT_REG4, 0, SLJIT_FLOAT_REG3, 0, SLJIT_FLOAT_REG4, 0);
1093 	sljit_emit_fop1(compiler, SLJIT_MOVD, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_d) * 7, SLJIT_FLOAT_REG3, 0);
1094 	sljit_emit_fop1(compiler, SLJIT_MOVD, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_d) * 8, SLJIT_FLOAT_REG4, 0);
1095 
1096 	/* MUL */
1097 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG2, 0, SLJIT_IMM, 1);
1098 	sljit_emit_fop2(compiler, SLJIT_MULD, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_d) * 9, SLJIT_MEM2(SLJIT_SAVED_REG1, SLJIT_SCRATCH_REG2), SLJIT_DOUBLE_SHIFT, SLJIT_FLOAT_REG2, 0);
1099 	sljit_emit_fop2(compiler, SLJIT_MULD, SLJIT_FLOAT_REG2, 0, SLJIT_FLOAT_REG2, 0, SLJIT_FLOAT_REG3, 0);
1100 	sljit_emit_fop2(compiler, SLJIT_MULD, SLJIT_FLOAT_REG6, 0, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_d) * 2, SLJIT_FLOAT_REG3, 0);
1101 	sljit_emit_fop1(compiler, SLJIT_MOVD, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_d) * 10, SLJIT_FLOAT_REG2, 0);
1102 	sljit_emit_fop1(compiler, SLJIT_MOVD, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_d) * 11, SLJIT_FLOAT_REG6, 0);
1103 
1104 	/* DIV */
1105 	sljit_emit_fop1(compiler, SLJIT_MOVD, SLJIT_FLOAT_REG6, 0, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_d) * 12);
1106 	sljit_emit_fop1(compiler, SLJIT_MOVD, SLJIT_FLOAT_REG2, 0, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_d) * 13);
1107 	sljit_emit_fop1(compiler, SLJIT_MOVD, SLJIT_FLOAT_REG5, 0, SLJIT_FLOAT_REG6, 0);
1108 	sljit_emit_fop2(compiler, SLJIT_DIVD, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_d) * 12, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_d) * 12, SLJIT_FLOAT_REG2, 0);
1109 	sljit_emit_fop2(compiler, SLJIT_DIVD, SLJIT_FLOAT_REG6, 0, SLJIT_FLOAT_REG6, 0, SLJIT_FLOAT_REG2, 0);
1110 	sljit_emit_fop2(compiler, SLJIT_DIVD, SLJIT_FLOAT_REG5, 0, SLJIT_FLOAT_REG2, 0, SLJIT_FLOAT_REG5, 0);
1111 	sljit_emit_fop1(compiler, SLJIT_MOVD, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_d) * 13, SLJIT_FLOAT_REG6, 0);
1112 	sljit_emit_fop1(compiler, SLJIT_MOVD, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_d) * 14, SLJIT_FLOAT_REG5, 0);
1113 
1114 	sljit_emit_return(compiler, SLJIT_UNUSED, 0, 0);
1115 
1116 	code.code = sljit_generate_code(compiler);
1117 	CHECK(compiler);
1118 	sljit_free_compiler(compiler);
1119 
1120 	code.func1((sljit_sw)&buf);
1121 	FAILED(buf[3] != 10.75, "test14 case 1 failed\n");
1122 	FAILED(buf[4] != 5.25, "test14 case 2 failed\n");
1123 	FAILED(buf[5] != 7.0, "test14 case 3 failed\n");
1124 	FAILED(buf[6] != 0.0, "test14 case 4 failed\n");
1125 	FAILED(buf[7] != 5.5, "test14 case 5 failed\n");
1126 	FAILED(buf[8] != 3.75, "test14 case 6 failed\n");
1127 	FAILED(buf[9] != 24.5, "test14 case 7 failed\n");
1128 	FAILED(buf[10] != 38.5, "test14 case 8 failed\n");
1129 	FAILED(buf[11] != 9.625, "test14 case 9 failed\n");
1130 	FAILED(buf[12] != 2.0, "test14 case 10 failed\n");
1131 	FAILED(buf[13] != 2.0, "test14 case 11 failed\n");
1132 	FAILED(buf[14] != 0.5, "test14 case 12 failed\n");
1133 
1134 	sljit_free_code(code.code);
1135 	successful_tests++;
1136 }
1137 
1138 static sljit_sw SLJIT_CALL func(sljit_sw a, sljit_sw b, sljit_sw c)
1139 {
1140 	return a + b + c + 5;
1141 }
1142 
1143 static void test15(void)
1144 {
1145 	/* Test function call. */
1146 	executable_code code;
1147 	struct sljit_compiler* compiler = sljit_create_compiler();
1148 	struct sljit_jump* jump;
1149 	sljit_sw buf[7];
1150 
1151 	if (verbose)
1152 		printf("Run test15\n");
1153 
1154 	FAILED(!compiler, "cannot create compiler\n");
1155 	buf[0] = 0;
1156 	buf[1] = 0;
1157 	buf[2] = 0;
1158 	buf[3] = 0;
1159 	buf[4] = 0;
1160 	buf[5] = 0;
1161 	buf[6] = SLJIT_FUNC_OFFSET(func);
1162 
1163 	sljit_emit_enter(compiler, 1, 4, 1, 0);
1164 
1165 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 5);
1166 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG2, 0, SLJIT_IMM, 7);
1167 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG3, 0, SLJIT_IMM, -3);
1168 	sljit_emit_ijump(compiler, SLJIT_CALL3, SLJIT_IMM, SLJIT_FUNC_OFFSET(func));
1169 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), 0, SLJIT_RETURN_REG, 0);
1170 
1171 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, -5);
1172 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG2, 0, SLJIT_IMM, -10);
1173 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG3, 0, SLJIT_IMM, 2);
1174 	jump = sljit_emit_jump(compiler, SLJIT_CALL3 | SLJIT_REWRITABLE_JUMP);
1175 	sljit_set_target(jump, (sljit_sw)-1);
1176 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw), SLJIT_RETURN_REG, 0);
1177 
1178 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, SLJIT_FUNC_OFFSET(func));
1179 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG2, 0, SLJIT_IMM, 40);
1180 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG3, 0, SLJIT_IMM, -3);
1181 	sljit_emit_ijump(compiler, SLJIT_CALL3, SLJIT_SCRATCH_REG1, 0);
1182 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), 2 * sizeof(sljit_sw), SLJIT_RETURN_REG, 0);
1183 
1184 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, -60);
1185 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG2, 0, SLJIT_IMM, SLJIT_FUNC_OFFSET(func));
1186 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG3, 0, SLJIT_IMM, -30);
1187 	sljit_emit_ijump(compiler, SLJIT_CALL3, SLJIT_SCRATCH_REG2, 0);
1188 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), 3 * sizeof(sljit_sw), SLJIT_RETURN_REG, 0);
1189 
1190 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 10);
1191 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG2, 0, SLJIT_IMM, 16);
1192 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG3, 0, SLJIT_IMM, SLJIT_FUNC_OFFSET(func));
1193 	sljit_emit_ijump(compiler, SLJIT_CALL3, SLJIT_SCRATCH_REG3, 0);
1194 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), 4 * sizeof(sljit_sw), SLJIT_RETURN_REG, 0);
1195 
1196 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 100);
1197 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG2, 0, SLJIT_IMM, 110);
1198 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG3, 0, SLJIT_IMM, 120);
1199 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_TEMPORARY_EREG1, 0, SLJIT_IMM, SLJIT_FUNC_OFFSET(func));
1200 	sljit_emit_ijump(compiler, SLJIT_CALL3, SLJIT_TEMPORARY_EREG1, 0);
1201 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), 5 * sizeof(sljit_sw), SLJIT_RETURN_REG, 0);
1202 
1203 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, -10);
1204 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG2, 0, SLJIT_IMM, -16);
1205 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG3, 0, SLJIT_IMM, 6);
1206 	sljit_emit_ijump(compiler, SLJIT_CALL3, SLJIT_MEM1(SLJIT_SAVED_REG1), 6 * sizeof(sljit_sw));
1207 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), 6 * sizeof(sljit_sw), SLJIT_RETURN_REG, 0);
1208 
1209 	sljit_emit_return(compiler, SLJIT_MOV, SLJIT_RETURN_REG, 0);
1210 
1211 	code.code = sljit_generate_code(compiler);
1212 	CHECK(compiler);
1213 	sljit_set_jump_addr(sljit_get_jump_addr(jump), SLJIT_FUNC_OFFSET(func));
1214 	sljit_free_compiler(compiler);
1215 
1216 	FAILED(code.func1((sljit_sw)&buf) != -15, "test15 case 1 failed\n");
1217 	FAILED(buf[0] != 14, "test15 case 2 failed\n");
1218 	FAILED(buf[1] != -8, "test15 case 3 failed\n");
1219 	FAILED(buf[2] != SLJIT_FUNC_OFFSET(func) + 42, "test15 case 4 failed\n");
1220 	FAILED(buf[3] != SLJIT_FUNC_OFFSET(func) - 85, "test15 case 5 failed\n");
1221 	FAILED(buf[4] != SLJIT_FUNC_OFFSET(func) + 31, "test15 case 6 failed\n");
1222 	FAILED(buf[5] != 335, "test15 case 7 failed\n");
1223 	FAILED(buf[6] != -15, "test15 case 8 failed\n");
1224 
1225 	sljit_free_code(code.code);
1226 	successful_tests++;
1227 }
1228 
1229 static void test16(void)
1230 {
1231 	/* Ackermann benchmark. */
1232 	executable_code code;
1233 	struct sljit_compiler* compiler = sljit_create_compiler();
1234 	struct sljit_label *entry;
1235 	struct sljit_label *label;
1236 	struct sljit_jump *jump;
1237 	struct sljit_jump *jump1;
1238 	struct sljit_jump *jump2;
1239 
1240 	if (verbose)
1241 		printf("Run test16\n");
1242 
1243 	FAILED(!compiler, "cannot create compiler\n");
1244 
1245 	entry = sljit_emit_label(compiler);
1246 	sljit_emit_enter(compiler, 2, 3, 2, 0);
1247 	/* If x == 0. */
1248 	sljit_emit_op2(compiler, SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, SLJIT_SAVED_REG1, 0, SLJIT_IMM, 0);
1249 	jump1 = sljit_emit_jump(compiler, SLJIT_C_EQUAL);
1250 	/* If y == 0. */
1251 	sljit_emit_op2(compiler, SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, SLJIT_SAVED_REG2, 0, SLJIT_IMM, 0);
1252 	jump2 = sljit_emit_jump(compiler, SLJIT_C_EQUAL);
1253 
1254 	/* Ack(x,y-1). */
1255 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_SAVED_REG1, 0);
1256 	sljit_emit_op2(compiler, SLJIT_SUB, SLJIT_SCRATCH_REG2, 0, SLJIT_SAVED_REG2, 0, SLJIT_IMM, 1);
1257 	jump = sljit_emit_jump(compiler, SLJIT_CALL2);
1258 	sljit_set_label(jump, entry);
1259 
1260 	/* Returns with Ack(x-1, Ack(x,y-1)). */
1261 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG2, 0, SLJIT_RETURN_REG, 0);
1262 	sljit_emit_op2(compiler, SLJIT_SUB, SLJIT_SCRATCH_REG1, 0, SLJIT_SAVED_REG1, 0, SLJIT_IMM, 1);
1263 	jump = sljit_emit_jump(compiler, SLJIT_CALL2);
1264 	sljit_set_label(jump, entry);
1265 	sljit_emit_return(compiler, SLJIT_MOV, SLJIT_RETURN_REG, 0);
1266 
1267 	/* Returns with y+1. */
1268 	label = sljit_emit_label(compiler);
1269 	sljit_set_label(jump1, label);
1270 	sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_RETURN_REG, 0, SLJIT_IMM, 1, SLJIT_SAVED_REG2, 0);
1271 	sljit_emit_return(compiler, SLJIT_MOV, SLJIT_RETURN_REG, 0);
1272 
1273 	/* Returns with Ack(x-1,1) */
1274 	label = sljit_emit_label(compiler);
1275 	sljit_set_label(jump2, label);
1276 	sljit_emit_op2(compiler, SLJIT_SUB, SLJIT_SCRATCH_REG1, 0, SLJIT_SAVED_REG1, 0, SLJIT_IMM, 1);
1277 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG2, 0, SLJIT_IMM, 1);
1278 	jump = sljit_emit_jump(compiler, SLJIT_CALL2);
1279 	sljit_set_label(jump, entry);
1280 	sljit_emit_return(compiler, SLJIT_MOV, SLJIT_RETURN_REG, 0);
1281 
1282 	code.code = sljit_generate_code(compiler);
1283 	CHECK(compiler);
1284 	sljit_free_compiler(compiler);
1285 
1286 	FAILED(code.func2(3, 3) != 61, "test16 case 1 failed\n");
1287 	/* For benchmarking. */
1288 	/* FAILED(code.func2(3, 11) != 16381, "test16 case 1 failed\n"); */
1289 
1290 	sljit_free_code(code.code);
1291 	successful_tests++;
1292 }
1293 
1294 static void test17(void)
1295 {
1296 	/* Test arm constant pool. */
1297 	executable_code code;
1298 	struct sljit_compiler* compiler = sljit_create_compiler();
1299 	sljit_si i;
1300 	sljit_sw buf[5];
1301 
1302 	if (verbose)
1303 		printf("Run test17\n");
1304 
1305 	FAILED(!compiler, "cannot create compiler\n");
1306 	buf[0] = 0;
1307 	buf[1] = 0;
1308 	buf[2] = 0;
1309 	buf[3] = 0;
1310 	buf[4] = 0;
1311 
1312 	sljit_emit_enter(compiler, 1, 3, 1, 0);
1313 	for (i = 0; i <= 0xfff; i++) {
1314 		sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 0x81818000 | i);
1315 		sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 0x81818000 | i);
1316 		if ((i & 0x3ff) == 0)
1317 			sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), (i >> 10) * sizeof(sljit_sw), SLJIT_SCRATCH_REG1, 0);
1318 	}
1319 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), 4 * sizeof(sljit_sw), SLJIT_SCRATCH_REG1, 0);
1320 	sljit_emit_return(compiler, SLJIT_UNUSED, 0, 0);
1321 
1322 	code.code = sljit_generate_code(compiler);
1323 	CHECK(compiler);
1324 	sljit_free_compiler(compiler);
1325 
1326 	code.func1((sljit_sw)&buf);
1327 	FAILED((sljit_uw)buf[0] != 0x81818000, "test17 case 1 failed\n");
1328 	FAILED((sljit_uw)buf[1] != 0x81818400, "test17 case 2 failed\n");
1329 	FAILED((sljit_uw)buf[2] != 0x81818800, "test17 case 3 failed\n");
1330 	FAILED((sljit_uw)buf[3] != 0x81818c00, "test17 case 4 failed\n");
1331 	FAILED((sljit_uw)buf[4] != 0x81818fff, "test17 case 5 failed\n");
1332 
1333 	sljit_free_code(code.code);
1334 	successful_tests++;
1335 }
1336 
1337 static void test18(void)
1338 {
1339 	/* Test 64 bit. */
1340 	executable_code code;
1341 	struct sljit_compiler* compiler = sljit_create_compiler();
1342 	sljit_sw buf[11];
1343 
1344 	if (verbose)
1345 		printf("Run test18\n");
1346 
1347 	FAILED(!compiler, "cannot create compiler\n");
1348 	buf[0] = 0;
1349 	buf[1] = 0;
1350 	buf[2] = 0;
1351 	buf[3] = 0;
1352 	buf[4] = 0;
1353 	buf[5] = 100;
1354 	buf[6] = 100;
1355 	buf[7] = 100;
1356 	buf[8] = 100;
1357 	buf[9] = 0;
1358 #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE) && (defined SLJIT_BIG_ENDIAN && SLJIT_BIG_ENDIAN)
1359 	buf[10] = SLJIT_W(1) << 32;
1360 #else
1361 	buf[10] = 1;
1362 #endif
1363 
1364 	sljit_emit_enter(compiler, 1, 3, 2, 0);
1365 
1366 #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
1367 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), 0, SLJIT_IMM, SLJIT_W(0x1122334455667788));
1368 	sljit_emit_op1(compiler, SLJIT_MOV_UI, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw), SLJIT_IMM, SLJIT_W(0x1122334455667788));
1369 
1370 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, SLJIT_W(1000000000000));
1371 	sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw) * 2, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, SLJIT_W(1000000000000));
1372 	sljit_emit_op2(compiler, SLJIT_SUB, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw) * 3, SLJIT_IMM, SLJIT_W(5000000000000), SLJIT_SCRATCH_REG1, 0);
1373 
1374 	sljit_emit_op1(compiler, SLJIT_IMOV, SLJIT_SCRATCH_REG2, 0, SLJIT_IMM, SLJIT_W(0x1108080808));
1375 	sljit_emit_op2(compiler, SLJIT_IADD, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw) * 4, SLJIT_SCRATCH_REG2, 0, SLJIT_IMM, SLJIT_W(0x1120202020));
1376 
1377 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, SLJIT_W(0x1108080808));
1378 	sljit_emit_op2(compiler, SLJIT_AND | SLJIT_SET_E, SLJIT_UNUSED, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, SLJIT_W(0x1120202020));
1379 	sljit_emit_op_flags(compiler, SLJIT_MOV, SLJIT_SAVED_REG2, 0, SLJIT_UNUSED, 0, SLJIT_C_ZERO);
1380 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw) * 5, SLJIT_SAVED_REG2, 0);
1381 	sljit_emit_op1(compiler, SLJIT_IMOV, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG1, 0);
1382 	sljit_emit_op2(compiler, SLJIT_IAND | SLJIT_SET_E, SLJIT_UNUSED, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, SLJIT_W(0x1120202020));
1383 	sljit_emit_op_flags(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw) * 6, SLJIT_UNUSED, 0, SLJIT_C_ZERO);
1384 
1385 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, SLJIT_W(0x1108080808));
1386 	sljit_emit_op2(compiler, SLJIT_SUB | SLJIT_SET_U, SLJIT_UNUSED, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, SLJIT_W(0x2208080808));
1387 	sljit_emit_op_flags(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw) * 7, SLJIT_UNUSED, 0, SLJIT_C_LESS);
1388 	sljit_emit_op1(compiler, SLJIT_MOV_SI | SLJIT_INT_OP, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG1, 0);
1389 	sljit_emit_op2(compiler, SLJIT_IAND | SLJIT_SET_E, SLJIT_UNUSED, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, SLJIT_W(0x1104040404));
1390 	sljit_emit_op_flags(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw) * 8, SLJIT_UNUSED, 0, SLJIT_C_NOT_ZERO);
1391 
1392 	sljit_emit_op1(compiler, SLJIT_IMOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 4);
1393 	sljit_emit_op2(compiler, SLJIT_ISHL, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw) * 9, SLJIT_IMM, SLJIT_W(0xffff0000), SLJIT_SCRATCH_REG1, 0);
1394 
1395 	sljit_emit_op2(compiler, SLJIT_IMUL, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw) * 10, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw) * 10, SLJIT_IMM, -1);
1396 #else
1397 	/* 32 bit operations. */
1398 
1399 	sljit_emit_op1(compiler, SLJIT_IMOV, SLJIT_MEM1(SLJIT_SAVED_REG1), 0, SLJIT_IMM, 0x11223344);
1400 	sljit_emit_op2(compiler, SLJIT_IADD, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw), SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw), SLJIT_IMM, 0x44332211);
1401 
1402 #endif
1403 
1404 	sljit_emit_return(compiler, SLJIT_UNUSED, 0, 0);
1405 
1406 	code.code = sljit_generate_code(compiler);
1407 	CHECK(compiler);
1408 	sljit_free_compiler(compiler);
1409 
1410 	code.func1((sljit_sw)&buf);
1411 #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
1412 	FAILED(buf[0] != SLJIT_W(0x1122334455667788), "test18 case 1 failed\n");
1413 #if (defined SLJIT_LITTLE_ENDIAN && SLJIT_LITTLE_ENDIAN)
1414 	FAILED(buf[1] != 0x55667788, "test18 case 2 failed\n");
1415 #else
1416 	FAILED(buf[1] != SLJIT_W(0x5566778800000000), "test18 case 2 failed\n");
1417 #endif
1418 	FAILED(buf[2] != SLJIT_W(2000000000000), "test18 case 3 failed\n");
1419 	FAILED(buf[3] != SLJIT_W(4000000000000), "test18 case 4 failed\n");
1420 #if (defined SLJIT_LITTLE_ENDIAN && SLJIT_LITTLE_ENDIAN)
1421 	FAILED(buf[4] != 0x28282828, "test18 case 5 failed\n");
1422 #else
1423 	FAILED(buf[4] != SLJIT_W(0x2828282800000000), "test18 case 5 failed\n");
1424 #endif
1425 	FAILED(buf[5] != 0, "test18 case 6 failed\n");
1426 	FAILED(buf[6] != 1, "test18 case 7 failed\n");
1427 	FAILED(buf[7] != 1, "test18 case 8 failed\n");
1428 	FAILED(buf[8] != 0, "test18 case 9 failed\n");
1429 #if (defined SLJIT_LITTLE_ENDIAN && SLJIT_LITTLE_ENDIAN)
1430 	FAILED(buf[9] != 0xfff00000, "test18 case 10 failed\n");
1431 	FAILED(buf[10] != 0xffffffff, "test18 case 11 failed\n");
1432 #else
1433 	FAILED(buf[9] != SLJIT_W(0xfff0000000000000), "test18 case 10 failed\n");
1434 	FAILED(buf[10] != SLJIT_W(0xffffffff00000000), "test18 case 11 failed\n");
1435 #endif
1436 #else
1437 	FAILED(buf[0] != 0x11223344, "test18 case 1 failed\n");
1438 	FAILED(buf[1] != 0x44332211, "test18 case 2 failed\n");
1439 #endif
1440 
1441 	sljit_free_code(code.code);
1442 	successful_tests++;
1443 }
1444 
1445 static void test19(void)
1446 {
1447 	/* Test arm partial instruction caching. */
1448 	executable_code code;
1449 	struct sljit_compiler* compiler = sljit_create_compiler();
1450 	sljit_sw buf[10];
1451 
1452 	if (verbose)
1453 		printf("Run test19\n");
1454 
1455 	FAILED(!compiler, "cannot create compiler\n");
1456 	buf[0] = 6;
1457 	buf[1] = 4;
1458 	buf[2] = 0;
1459 	buf[3] = 0;
1460 	buf[4] = 0;
1461 	buf[5] = 0;
1462 	buf[6] = 2;
1463 	buf[7] = 0;
1464 
1465 	sljit_emit_enter(compiler, 1, 3, 1, 0);
1466 	sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_MEM1(SLJIT_SAVED_REG1), 0, SLJIT_MEM1(SLJIT_SAVED_REG1), 0, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw));
1467 #if (defined SLJIT_CONFIG_ARM && SLJIT_CONFIG_ARM)
1468 	SLJIT_ASSERT(compiler->cache_arg == 0);
1469 #endif
1470 	sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_MEM0(), (sljit_sw)&buf[2], SLJIT_MEM0(), (sljit_sw)&buf[1], SLJIT_MEM0(), (sljit_sw)&buf[0]);
1471 #if (defined SLJIT_CONFIG_ARM && SLJIT_CONFIG_ARM)
1472 	SLJIT_ASSERT(compiler->cache_arg > 0);
1473 #endif
1474 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 0);
1475 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG2, 0, SLJIT_IMM, sizeof(sljit_sw));
1476 	sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw) * 3, SLJIT_MEM1(SLJIT_SCRATCH_REG1), (sljit_sw)&buf[0], SLJIT_MEM1(SLJIT_SCRATCH_REG2), (sljit_sw)&buf[0]);
1477 #if (defined SLJIT_CONFIG_ARM && SLJIT_CONFIG_ARM)
1478 	SLJIT_ASSERT(compiler->cache_arg > 0);
1479 #endif
1480 	sljit_emit_op2(compiler, SLJIT_SUB, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw) * 4, SLJIT_MEM0(), (sljit_sw)&buf[0], SLJIT_IMM, 2);
1481 #if (defined SLJIT_CONFIG_ARM && SLJIT_CONFIG_ARM)
1482 	SLJIT_ASSERT(compiler->cache_arg > 0);
1483 #endif
1484 	sljit_emit_op2(compiler, SLJIT_SUB, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw) * 5, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw) * 2, SLJIT_MEM1(SLJIT_SCRATCH_REG1), (sljit_sw)&buf[0] + 4 * sizeof(sljit_sw));
1485 #if (defined SLJIT_CONFIG_ARM && SLJIT_CONFIG_ARM)
1486 	SLJIT_ASSERT(compiler->cache_arg > 0);
1487 #endif
1488 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw) * 7, SLJIT_IMM, 10);
1489 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 7);
1490 	sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_MEM1(SLJIT_SCRATCH_REG2), (sljit_sw)&buf[5], SLJIT_MEM2(SLJIT_SAVED_REG1, SLJIT_SCRATCH_REG1), SLJIT_WORD_SHIFT, SLJIT_MEM1(SLJIT_SCRATCH_REG2), (sljit_sw)&buf[5]);
1491 #if (defined SLJIT_CONFIG_ARM && SLJIT_CONFIG_ARM)
1492 	SLJIT_ASSERT(compiler->cache_arg > 0);
1493 #endif
1494 
1495 	sljit_emit_return(compiler, SLJIT_UNUSED, 0, 0);
1496 
1497 	code.code = sljit_generate_code(compiler);
1498 	CHECK(compiler);
1499 	sljit_free_compiler(compiler);
1500 
1501 	code.func1((sljit_sw)&buf);
1502 	FAILED(buf[0] != 10, "test19 case 1 failed\n");
1503 	FAILED(buf[1] != 4, "test19 case 2 failed\n");
1504 	FAILED(buf[2] != 14, "test19 case 3 failed\n");
1505 	FAILED(buf[3] != 14, "test19 case 4 failed\n");
1506 	FAILED(buf[4] != 8, "test19 case 5 failed\n");
1507 	FAILED(buf[5] != 6, "test19 case 6 failed\n");
1508 	FAILED(buf[6] != 12, "test19 case 7 failed\n");
1509 	FAILED(buf[7] != 10, "test19 case 8 failed\n");
1510 
1511 	sljit_free_code(code.code);
1512 	successful_tests++;
1513 }
1514 
1515 static void test20(void)
1516 {
1517 	/* Test stack. */
1518 	executable_code code;
1519 	struct sljit_compiler* compiler = sljit_create_compiler();
1520 	struct sljit_jump* jump;
1521 	struct sljit_label* label;
1522 	sljit_sw buf[6];
1523 #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
1524 	sljit_sw offset_value = SLJIT_W(0x1234567812345678);
1525 #else
1526 	sljit_sw offset_value = SLJIT_W(0x12345678);
1527 #endif
1528 
1529 	if (verbose)
1530 		printf("Run test20\n");
1531 
1532 	FAILED(!compiler, "cannot create compiler\n");
1533 	buf[0] = 5;
1534 	buf[1] = 12;
1535 	buf[2] = 0;
1536 	buf[3] = 0;
1537 	buf[4] = 111;
1538 	buf[5] = -12345;
1539 
1540 	sljit_emit_enter(compiler, 1, 5, 5, 4 * sizeof(sljit_sw));
1541 
1542 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), sizeof(sljit_uw), SLJIT_MEM1(SLJIT_SAVED_REG1), 0);
1543 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), 0, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_uw));
1544 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_TEMPORARY_EREG1, 0, SLJIT_IMM, -1);
1545 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_TEMPORARY_EREG2, 0, SLJIT_IMM, -1);
1546 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SAVED_EREG1, 0, SLJIT_IMM, -1);
1547 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SAVED_EREG2, 0, SLJIT_IMM, -1);
1548 	sljit_emit_op2(compiler, SLJIT_MUL, SLJIT_MEM1(SLJIT_SAVED_REG1), 2 * sizeof(sljit_uw), SLJIT_MEM1(SLJIT_LOCALS_REG), 0, SLJIT_MEM1(SLJIT_LOCALS_REG), sizeof(sljit_uw));
1549 	sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_MEM1(SLJIT_SAVED_REG1), 3 * sizeof(sljit_uw), SLJIT_MEM1(SLJIT_LOCALS_REG), sizeof(sljit_uw), SLJIT_MEM1(SLJIT_LOCALS_REG), 0);
1550 	sljit_get_local_base(compiler, SLJIT_SCRATCH_REG1, 0, -offset_value);
1551 	sljit_get_local_base(compiler, SLJIT_MEM1(SLJIT_SAVED_REG1), 0, -0x1234);
1552 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG2, 0, SLJIT_MEM1(SLJIT_SAVED_REG1), 0);
1553 	sljit_emit_op2(compiler, SLJIT_SUB, SLJIT_MEM1(SLJIT_SAVED_REG1), 4 * sizeof(sljit_uw), SLJIT_MEM1(SLJIT_SCRATCH_REG1), offset_value, SLJIT_MEM1(SLJIT_SCRATCH_REG2), 0x1234 + sizeof(sljit_sw));
1554 
1555 	sljit_emit_return(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), 5 * sizeof(sljit_uw));
1556 	/* Dummy last instructions. */
1557 	sljit_emit_const(compiler, SLJIT_SCRATCH_REG1, 0, -9);
1558 	sljit_emit_label(compiler);
1559 
1560 	code.code = sljit_generate_code(compiler);
1561 	CHECK(compiler);
1562 	sljit_free_compiler(compiler);
1563 
1564 	FAILED(code.func1((sljit_sw)&buf) != -12345, "test20 case 1 failed\n")
1565 
1566 	FAILED(buf[2] != 60, "test20 case 2 failed\n");
1567 	FAILED(buf[3] != 17, "test20 case 3 failed\n");
1568 	FAILED(buf[4] != 7, "test20 case 4 failed\n");
1569 
1570 	sljit_free_code(code.code);
1571 
1572 	compiler = sljit_create_compiler();
1573 	sljit_emit_enter(compiler, 0, 3, 0, SLJIT_MAX_LOCAL_SIZE);
1574 
1575 	sljit_get_local_base(compiler, SLJIT_SCRATCH_REG1, 0, SLJIT_MAX_LOCAL_SIZE - sizeof(sljit_sw));
1576 	sljit_get_local_base(compiler, SLJIT_SCRATCH_REG2, 0, -(sljit_sw)sizeof(sljit_sw));
1577 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG3, 0, SLJIT_IMM, -1);
1578 	label = sljit_emit_label(compiler);
1579 	sljit_emit_op1(compiler, SLJIT_MOVU, SLJIT_MEM1(SLJIT_SCRATCH_REG2), sizeof(sljit_sw), SLJIT_SCRATCH_REG3, 0);
1580 	sljit_emit_op2(compiler, SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, SLJIT_SCRATCH_REG2, 0, SLJIT_SCRATCH_REG1, 0);
1581 	jump = sljit_emit_jump(compiler, SLJIT_C_NOT_EQUAL);
1582 	sljit_set_label(jump, label);
1583 
1584 	sljit_emit_return(compiler, SLJIT_UNUSED, 0, 0);
1585 
1586 	code.code = sljit_generate_code(compiler);
1587 	CHECK(compiler);
1588 	sljit_free_compiler(compiler);
1589 
1590 	/* Just survive this code. */
1591 	code.func0();
1592 
1593 	sljit_free_code(code.code);
1594 	successful_tests++;
1595 }
1596 
1597 static void test21(void)
1598 {
1599 	/* Test fake enter. The parts of the jit code can be separated in the memory. */
1600 	executable_code code1;
1601 	executable_code code2;
1602 	struct sljit_compiler* compiler = sljit_create_compiler();
1603 	struct sljit_jump* jump;
1604 	sljit_uw addr;
1605 	sljit_sw buf[4];
1606 
1607 	if (verbose)
1608 		printf("Run test21\n");
1609 
1610 	FAILED(!compiler, "cannot create compiler\n");
1611 	buf[0] = 9;
1612 	buf[1] = -6;
1613 	buf[2] = 0;
1614 	buf[3] = 0;
1615 
1616 	sljit_emit_enter(compiler, 1, 3, 2, 2 * sizeof(sljit_sw));
1617 
1618 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), 0, SLJIT_IMM, 10);
1619 	sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_MEM1(SLJIT_LOCALS_REG), sizeof(sljit_sw), SLJIT_MEM1(SLJIT_SAVED_REG1), 0, SLJIT_MEM1(SLJIT_LOCALS_REG), 0);
1620 	jump = sljit_emit_jump(compiler, SLJIT_JUMP | SLJIT_REWRITABLE_JUMP);
1621 	sljit_set_target(jump, 0);
1622 
1623 	code1.code = sljit_generate_code(compiler);
1624 	CHECK(compiler);
1625 	addr = sljit_get_jump_addr(jump);
1626 	sljit_free_compiler(compiler);
1627 
1628 	compiler = sljit_create_compiler();
1629 	FAILED(!compiler, "cannot create compiler\n");
1630 
1631 	/* Other part of the jit code. */
1632 	sljit_set_context(compiler, 1, 3, 2, 2 * sizeof(sljit_sw));
1633 
1634 	sljit_emit_op2(compiler, SLJIT_SUB, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw) * 2, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw), SLJIT_MEM1(SLJIT_LOCALS_REG), 0);
1635 	sljit_emit_op2(compiler, SLJIT_MUL, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw) * 3, SLJIT_MEM1(SLJIT_LOCALS_REG), 0, SLJIT_MEM1(SLJIT_LOCALS_REG), 0);
1636 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_RETURN_REG, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), sizeof(sljit_sw));
1637 
1638 	sljit_emit_return(compiler, SLJIT_MOV, SLJIT_RETURN_REG, 0);
1639 
1640 	code2.code = sljit_generate_code(compiler);
1641 	CHECK(compiler);
1642 	sljit_free_compiler(compiler);
1643 
1644 	sljit_set_jump_addr(addr, SLJIT_FUNC_OFFSET(code2.code));
1645 
1646 	FAILED(code1.func1((sljit_sw)&buf) != 19, "test21 case 1 failed\n");
1647 	FAILED(buf[2] != -16, "test21 case 2 failed\n");
1648 	FAILED(buf[3] != 100, "test21 case 3 failed\n");
1649 
1650 	sljit_free_code(code1.code);
1651 	sljit_free_code(code2.code);
1652 	successful_tests++;
1653 }
1654 
1655 static void test22(void)
1656 {
1657 	/* Test simple byte and half-int data transfers. */
1658 	executable_code code;
1659 	struct sljit_compiler* compiler = sljit_create_compiler();
1660 	sljit_sw buf[9];
1661 	sljit_sh sbuf[7];
1662 	sljit_sb bbuf[5];
1663 
1664 	if (verbose)
1665 		printf("Run test22\n");
1666 
1667 	FAILED(!compiler, "cannot create compiler\n");
1668 	buf[0] = 5;
1669 	buf[1] = 0;
1670 	buf[2] = 0;
1671 	buf[3] = 0;
1672 	buf[4] = 0;
1673 	buf[5] = 0;
1674 	buf[6] = 0;
1675 	buf[7] = 0;
1676 	buf[8] = 0;
1677 
1678 	sbuf[0] = 0;
1679 	sbuf[1] = 0;
1680 	sbuf[2] = -9;
1681 	sbuf[3] = 0;
1682 	sbuf[4] = 0;
1683 	sbuf[5] = 0;
1684 	sbuf[6] = 0;
1685 
1686 	bbuf[0] = 0;
1687 	bbuf[1] = 0;
1688 	bbuf[2] = -56;
1689 	bbuf[3] = 0;
1690 	bbuf[4] = 0;
1691 
1692 	sljit_emit_enter(compiler, 3, 3, 3, 0);
1693 
1694 	sljit_emit_op2(compiler, SLJIT_SUB, SLJIT_SCRATCH_REG1, 0, SLJIT_SAVED_REG1, 0, SLJIT_IMM, sizeof(sljit_sw));
1695 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG2, 0, SLJIT_SAVED_REG1, 0);
1696 	sljit_emit_op1(compiler, SLJIT_MOVU, SLJIT_MEM1(SLJIT_SCRATCH_REG2), sizeof(sljit_sw), SLJIT_IMM, -13);
1697 	sljit_emit_op1(compiler, SLJIT_MOVU, SLJIT_SCRATCH_REG3, 0, SLJIT_MEM1(SLJIT_SCRATCH_REG1), sizeof(sljit_sw));
1698 	sljit_emit_op1(compiler, SLJIT_MOVU, SLJIT_MEM1(SLJIT_SCRATCH_REG2), sizeof(sljit_sw), SLJIT_SCRATCH_REG3, 0);
1699 	sljit_emit_op1(compiler, SLJIT_MOVU, SLJIT_MEM1(SLJIT_SCRATCH_REG2), sizeof(sljit_sw), SLJIT_MEM1(SLJIT_SCRATCH_REG1), sizeof(sljit_sw));
1700 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 1);
1701 	sljit_emit_op1(compiler, SLJIT_MOVU, SLJIT_MEM2(SLJIT_SCRATCH_REG2, SLJIT_SCRATCH_REG1), SLJIT_WORD_SHIFT, SLJIT_SCRATCH_REG2, 0);
1702 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, sizeof(sljit_sw));
1703 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM2(SLJIT_SCRATCH_REG2, SLJIT_SCRATCH_REG1), 0, SLJIT_SCRATCH_REG2, 0);
1704 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 2);
1705 	sljit_emit_op1(compiler, SLJIT_MOVU, SLJIT_MEM2(SLJIT_SCRATCH_REG2, SLJIT_SCRATCH_REG1), SLJIT_WORD_SHIFT, SLJIT_SCRATCH_REG2, 0);
1706 
1707 	sljit_emit_op1(compiler, SLJIT_MOV_SH, SLJIT_MEM1(SLJIT_SAVED_REG2), 0, SLJIT_IMM, -13);
1708 	sljit_emit_op1(compiler, SLJIT_MOVU_UH, SLJIT_MEM1(SLJIT_SAVED_REG2), sizeof(sljit_sh), SLJIT_IMM, 0x1234);
1709 	sljit_emit_op1(compiler, SLJIT_MOVU_SH, SLJIT_SCRATCH_REG1, 0, SLJIT_MEM1(SLJIT_SAVED_REG2), sizeof(sljit_sh));
1710 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), 7 * sizeof(sljit_sw), SLJIT_SCRATCH_REG1, 0);
1711 	sljit_emit_op1(compiler, SLJIT_MOV_UH, SLJIT_MEM1(SLJIT_SAVED_REG2), sizeof(sljit_sh), SLJIT_MEM1(SLJIT_SAVED_REG2), -(sljit_sw)sizeof(sljit_sh));
1712 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 0xff0000 + 8000);
1713 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG2, 0, SLJIT_IMM, 2);
1714 	sljit_emit_op1(compiler, SLJIT_MOV_SH, SLJIT_MEM2(SLJIT_SAVED_REG2, SLJIT_SCRATCH_REG2), 1, SLJIT_SCRATCH_REG1, 0);
1715 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG2, 0, SLJIT_IMM, 3);
1716 	sljit_emit_op1(compiler, SLJIT_MOVU_SH, SLJIT_MEM2(SLJIT_SAVED_REG2, SLJIT_SCRATCH_REG2), 1, SLJIT_SCRATCH_REG1, 0);
1717 	sljit_emit_op1(compiler, SLJIT_MOV_SH, SLJIT_MEM1(SLJIT_SAVED_REG2), 0, SLJIT_IMM, -9317);
1718 	sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_SCRATCH_REG2, 0, SLJIT_SAVED_REG2, 0, SLJIT_IMM, 5 * sizeof(sljit_sh));
1719 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, -5);
1720 	sljit_emit_op1(compiler, SLJIT_MOV_UH, SLJIT_SCRATCH_REG2, 0, SLJIT_MEM2(SLJIT_SCRATCH_REG2, SLJIT_SCRATCH_REG1), 1);
1721 	sljit_emit_op1(compiler, SLJIT_MOV_UH, SLJIT_MEM1(SLJIT_SAVED_REG2), sizeof(sljit_sh), SLJIT_SCRATCH_REG2, 0);
1722 
1723 	sljit_emit_op1(compiler, SLJIT_MOV_SB, SLJIT_MEM1(SLJIT_SAVED_REG3), 0, SLJIT_IMM, -45);
1724 	sljit_emit_op1(compiler, SLJIT_MOVU_UB, SLJIT_MEM1(SLJIT_SAVED_REG3), sizeof(sljit_sb), SLJIT_IMM, 0x12);
1725 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 2 * sizeof(sljit_sb));
1726 	sljit_emit_op1(compiler, SLJIT_MOVU_SB, SLJIT_SCRATCH_REG2, 0, SLJIT_MEM1(SLJIT_SAVED_REG3), sizeof(sljit_sb));
1727 	sljit_emit_op1(compiler, SLJIT_MOV_SB, SLJIT_SAVED_REG2, 0, SLJIT_SCRATCH_REG2, 0);
1728 	sljit_emit_op1(compiler, SLJIT_MOV_UB, SLJIT_SAVED_REG2, 0, SLJIT_SAVED_REG2, 0);
1729 	sljit_emit_op1(compiler, SLJIT_MOV_SB, SLJIT_SCRATCH_REG3, 0, SLJIT_SAVED_REG2, 0);
1730 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), 8 * sizeof(sljit_sw), SLJIT_SCRATCH_REG3, 0);
1731 	sljit_emit_op1(compiler, SLJIT_MOV_UB, SLJIT_MEM1(SLJIT_SAVED_REG3), sizeof(sljit_sb), SLJIT_SAVED_REG2, 0);
1732 	sljit_emit_op1(compiler, SLJIT_MOV_UB, SLJIT_MEM2(SLJIT_SAVED_REG3, SLJIT_SCRATCH_REG1), 0, SLJIT_SCRATCH_REG1, 0);
1733 
1734 	sljit_emit_return(compiler, SLJIT_UNUSED, 0, 0);
1735 
1736 	code.code = sljit_generate_code(compiler);
1737 	CHECK(compiler);
1738 	sljit_free_compiler(compiler);
1739 
1740 	code.func3((sljit_sw)&buf, (sljit_sw)&sbuf, (sljit_sw)&bbuf);
1741 	FAILED(buf[1] != -13, "test22 case 1 failed\n");
1742 	FAILED(buf[2] != 5, "test22 case 2 failed\n");
1743 	FAILED(buf[3] != -13, "test22 case 3 failed\n");
1744 	FAILED(buf[4] != (sljit_sw)&buf[3], "test22 case 4 failed\n");
1745 	FAILED(buf[5] != (sljit_sw)&buf[4], "test22 case 5 failed\n");
1746 	FAILED(buf[6] != (sljit_sw)&buf[4], "test22 case 6 failed\n");
1747 	FAILED(buf[7] != -9, "test22 case 7 failed\n");
1748 	FAILED(buf[8] != -56, "test22 case 8 failed\n");
1749 
1750 	FAILED(sbuf[0] != -13, "test22 case 9 failed\n");
1751 	FAILED(sbuf[1] != 0x1234, "test22 case 10 failed\n");
1752 	FAILED(sbuf[3] != 0x1234, "test22 case 11 failed\n");
1753 	FAILED(sbuf[4] != 8000, "test22 case 12 failed\n");
1754 	FAILED(sbuf[5] != -9317, "test22 case 13 failed\n");
1755 	FAILED(sbuf[6] != -9317, "test22 case 14 failed\n");
1756 
1757 	FAILED(bbuf[0] != -45, "test22 case 15 failed\n");
1758 	FAILED(bbuf[1] != 0x12, "test22 case 16 failed\n");
1759 	FAILED(bbuf[3] != -56, "test22 case 17 failed\n");
1760 	FAILED(bbuf[4] != 2, "test22 case 18 failed\n");
1761 
1762 	sljit_free_code(code.code);
1763 	successful_tests++;
1764 }
1765 
1766 static void test23(void)
1767 {
1768 	/* Test 32 bit / 64 bit signed / unsigned int transfer and conversion.
1769 	   This test has do real things on 64 bit systems, but works on 32 bit systems as well. */
1770 	executable_code code;
1771 	struct sljit_compiler* compiler = sljit_create_compiler();
1772 	sljit_sw buf[9];
1773 	sljit_si ibuf[5];
1774 	union {
1775 		sljit_si asint;
1776 		sljit_ub asbytes[4];
1777 	} u;
1778 #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
1779 	sljit_sw garbage = SLJIT_W(0x1234567812345678);
1780 #else
1781 	sljit_sw garbage = 0x12345678;
1782 #endif
1783 
1784 	if (verbose)
1785 		printf("Run test23\n");
1786 
1787 	FAILED(!compiler, "cannot create compiler\n");
1788 	buf[0] = 0;
1789 	buf[1] = 0;
1790 	buf[2] = 0;
1791 	buf[3] = 0;
1792 	buf[4] = 0;
1793 	buf[5] = 0;
1794 	buf[6] = 0;
1795 	buf[7] = 0;
1796 	buf[8] = 0;
1797 
1798 	ibuf[0] = 0;
1799 	ibuf[1] = 0;
1800 	ibuf[2] = -5791;
1801 	ibuf[3] = 43579;
1802 	ibuf[4] = 658923;
1803 
1804 	sljit_emit_enter(compiler, 2, 3, 3, 0);
1805 	sljit_emit_op1(compiler, SLJIT_MOV_UI, SLJIT_MEM1(SLJIT_SAVED_REG2), 0, SLJIT_IMM, 34567);
1806 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 1);
1807 	sljit_emit_op1(compiler, SLJIT_MOVU_SI, SLJIT_MEM2(SLJIT_SAVED_REG2, SLJIT_SCRATCH_REG1), 2, SLJIT_IMM, -7654);
1808 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, garbage);
1809 	sljit_emit_op1(compiler, SLJIT_MOVU_SI, SLJIT_SCRATCH_REG1, 0, SLJIT_MEM1(SLJIT_SAVED_REG2), sizeof(sljit_si));
1810 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), 0, SLJIT_SCRATCH_REG1, 0);
1811 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, garbage);
1812 	sljit_emit_op1(compiler, SLJIT_MOVU_UI, SLJIT_SCRATCH_REG1, 0, SLJIT_MEM1(SLJIT_SAVED_REG2), sizeof(sljit_si));
1813 	sljit_emit_op1(compiler, SLJIT_MOVU, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw), SLJIT_SCRATCH_REG1, 0);
1814 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, garbage);
1815 	sljit_emit_op1(compiler, SLJIT_MOV_SI, SLJIT_SCRATCH_REG1, 0, SLJIT_MEM1(SLJIT_SAVED_REG2), sizeof(sljit_si));
1816 	sljit_emit_op1(compiler, SLJIT_MOV_UI, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG1, 0);
1817 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw), SLJIT_SCRATCH_REG1, 0);
1818 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 0x0f00f00);
1819 	sljit_emit_op2(compiler, SLJIT_SUB, SLJIT_SAVED_REG1, 0, SLJIT_SAVED_REG1, 0, SLJIT_IMM, 0x7777);
1820 	sljit_emit_op1(compiler, SLJIT_MOVU, SLJIT_MEM1(SLJIT_SAVED_REG1), 0x7777 + 2 * sizeof(sljit_sw), SLJIT_SCRATCH_REG1, 0);
1821 	sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_SAVED_REG1, 0, SLJIT_SAVED_REG1, 0, SLJIT_IMM, 0x7777);
1822 	sljit_emit_op1(compiler, SLJIT_MOVU, SLJIT_MEM1(SLJIT_SAVED_REG1), -0x7777 + (sljit_sw)sizeof(sljit_sw), SLJIT_SCRATCH_REG1, 0);
1823 	sljit_emit_op2(compiler, SLJIT_SUB, SLJIT_SCRATCH_REG2, 0, SLJIT_SAVED_REG1, 0, SLJIT_IMM, 16 - sizeof(sljit_sw));
1824 	sljit_emit_op2(compiler, SLJIT_LSHR, SLJIT_SCRATCH_REG2, 0, SLJIT_SCRATCH_REG2, 0, SLJIT_IMM, 1);
1825 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 16);
1826 	sljit_emit_op1(compiler, SLJIT_MOVU, SLJIT_MEM2(SLJIT_SCRATCH_REG1, SLJIT_SCRATCH_REG2), 1, SLJIT_SCRATCH_REG1, 0);
1827 	sljit_emit_op2(compiler, SLJIT_OR, SLJIT_MEM1(SLJIT_SCRATCH_REG1), 0, SLJIT_IMM, 64, SLJIT_MEM1(SLJIT_SCRATCH_REG1), 0);
1828 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 0);
1829 	sljit_emit_op1(compiler, SLJIT_MOVU, SLJIT_MEM1(SLJIT_SCRATCH_REG1), (sljit_sw)&buf[6], SLJIT_MEM0(), (sljit_sw)&buf[6]);
1830 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SCRATCH_REG1), 0, SLJIT_IMM, 0x123456);
1831 	sljit_emit_op1(compiler, SLJIT_MOVU, SLJIT_MEM1(SLJIT_SAVED_REG1), 3 * sizeof(sljit_sw), SLJIT_SAVED_REG1, 0);
1832 	sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_MEM1(SLJIT_SAVED_REG1), 0, SLJIT_MEM1(SLJIT_SAVED_REG1), 0, SLJIT_IMM, sizeof(sljit_sw));
1833 	sljit_emit_op2(compiler, SLJIT_SUB, SLJIT_SAVED_REG1, 0, SLJIT_SAVED_REG1, 0, SLJIT_IMM, 100000 * sizeof(sljit_sw));
1834 	sljit_emit_op1(compiler, SLJIT_MOVU, SLJIT_MEM1(SLJIT_SAVED_REG1), 100001 * sizeof(sljit_sw), SLJIT_SAVED_REG1, 0);
1835 	sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_MEM1(SLJIT_SAVED_REG1), 0, SLJIT_MEM1(SLJIT_SAVED_REG1), 0, SLJIT_IMM, sizeof(sljit_sw));
1836 	sljit_emit_op1(compiler, SLJIT_MOVU_SI, SLJIT_MEM1(SLJIT_SAVED_REG2), sizeof(sljit_si), SLJIT_IMM, 0x12345678);
1837 
1838 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG2, 0, SLJIT_IMM, 0x2bd700 | 243);
1839 	sljit_emit_return(compiler, SLJIT_MOV_SB, SLJIT_SCRATCH_REG2, 0);
1840 
1841 	code.code = sljit_generate_code(compiler);
1842 	CHECK(compiler);
1843 	sljit_free_compiler(compiler);
1844 
1845 	FAILED(code.func2((sljit_sw)&buf, (sljit_sw)&ibuf) != -13, "test23 case 1 failed\n");
1846 	FAILED(buf[0] != -5791, "test23 case 2 failed\n");
1847 	FAILED(buf[1] != 43579, "test23 case 3 failed\n");
1848 	FAILED(buf[2] != 658923, "test23 case 4 failed\n");
1849 	FAILED(buf[3] != 0x0f00f00, "test23 case 5 failed\n");
1850 	FAILED(buf[4] != 0x0f00f00, "test23 case 6 failed\n");
1851 	FAILED(buf[5] != 80, "test23 case 7 failed\n");
1852 	FAILED(buf[6] != 0x123456, "test23 case 8 failed\n");
1853 	FAILED(buf[7] != (sljit_sw)&buf[5], "test23 case 9 failed\n");
1854 	FAILED(buf[8] != (sljit_sw)&buf[8] - 100000 * sizeof(sljit_sw), "test23 case 10 failed\n");
1855 
1856 	FAILED(ibuf[0] != 34567, "test23 case 11 failed\n");
1857 	FAILED(ibuf[1] != -7654, "test23 case 12 failed\n");
1858 	u.asint = ibuf[4];
1859 #if (defined SLJIT_LITTLE_ENDIAN && SLJIT_LITTLE_ENDIAN)
1860 	FAILED(u.asbytes[0] != 0x78, "test23 case 13 failed\n");
1861 	FAILED(u.asbytes[1] != 0x56, "test23 case 14 failed\n");
1862 	FAILED(u.asbytes[2] != 0x34, "test23 case 15 failed\n");
1863 	FAILED(u.asbytes[3] != 0x12, "test23 case 16 failed\n");
1864 #else
1865 	FAILED(u.asbytes[0] != 0x12, "test23 case 13 failed\n");
1866 	FAILED(u.asbytes[1] != 0x34, "test23 case 14 failed\n");
1867 	FAILED(u.asbytes[2] != 0x56, "test23 case 15 failed\n");
1868 	FAILED(u.asbytes[3] != 0x78, "test23 case 16 failed\n");
1869 #endif
1870 
1871 	sljit_free_code(code.code);
1872 	successful_tests++;
1873 }
1874 
1875 static void test24(void)
1876 {
1877 	/* Some complicated addressing modes. */
1878 	executable_code code;
1879 	struct sljit_compiler* compiler = sljit_create_compiler();
1880 	sljit_sw buf[9];
1881 	sljit_sh sbuf[5];
1882 	sljit_sb bbuf[7];
1883 
1884 	if (verbose)
1885 		printf("Run test24\n");
1886 
1887 	FAILED(!compiler, "cannot create compiler\n");
1888 
1889 	buf[0] = 100567;
1890 	buf[1] = 75799;
1891 	buf[2] = 0;
1892 	buf[3] = -8;
1893 	buf[4] = -50;
1894 	buf[5] = 0;
1895 	buf[6] = 0;
1896 	buf[7] = 0;
1897 	buf[8] = 0;
1898 
1899 	sbuf[0] = 30000;
1900 	sbuf[1] = 0;
1901 	sbuf[2] = 0;
1902 	sbuf[3] = -12345;
1903 	sbuf[4] = 0;
1904 
1905 	bbuf[0] = -128;
1906 	bbuf[1] = 0;
1907 	bbuf[2] = 0;
1908 	bbuf[3] = 99;
1909 	bbuf[4] = 0;
1910 	bbuf[5] = 0;
1911 	bbuf[6] = 0;
1912 
1913 	sljit_emit_enter(compiler, 3, 3, 3, 0);
1914 
1915 	/* Nothing should be updated. */
1916 	sljit_emit_op1(compiler, SLJIT_MOVU_SH, SLJIT_MEM0(), (sljit_sw)&sbuf[1], SLJIT_MEM0(), (sljit_sw)&sbuf[0]);
1917 #if (defined SLJIT_CONFIG_ARM && SLJIT_CONFIG_ARM)
1918 	SLJIT_ASSERT(compiler->cache_arg > 0);
1919 #endif
1920 	sljit_emit_op1(compiler, SLJIT_MOVU_SB, SLJIT_MEM0(), (sljit_sw)&bbuf[1], SLJIT_MEM0(), (sljit_sw)&bbuf[0]);
1921 #if (defined SLJIT_CONFIG_ARM && SLJIT_CONFIG_ARM)
1922 	SLJIT_ASSERT(compiler->cache_arg > 0);
1923 #endif
1924 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 2);
1925 	sljit_emit_op1(compiler, SLJIT_MOV_UH, SLJIT_MEM2(SLJIT_SAVED_REG2, SLJIT_SCRATCH_REG1), 1, SLJIT_MEM0(), (sljit_sw)&sbuf[3]);
1926 #if (defined SLJIT_CONFIG_ARM && SLJIT_CONFIG_ARM)
1927 	SLJIT_ASSERT(compiler->cache_arg > 0);
1928 #endif
1929 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, (sljit_sw)&buf[0]);
1930 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG2, 0, SLJIT_IMM, sizeof(sljit_sw));
1931 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG3, 0, SLJIT_IMM, 2);
1932 	sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_MEM2(SLJIT_SCRATCH_REG1, SLJIT_SCRATCH_REG3), SLJIT_WORD_SHIFT, SLJIT_MEM0(), (sljit_sw)&buf[0], SLJIT_MEM2(SLJIT_SCRATCH_REG2, SLJIT_SCRATCH_REG1), 0);
1933 #if (defined SLJIT_CONFIG_ARM && SLJIT_CONFIG_ARM)
1934 	SLJIT_ASSERT(compiler->cache_arg > 0);
1935 #endif
1936 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, sizeof(sljit_sb));
1937 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG2, 0, SLJIT_IMM, sizeof(sljit_sb));
1938 	sljit_emit_op1(compiler, SLJIT_MOVU_UB, SLJIT_MEM1(SLJIT_SCRATCH_REG1), (sljit_sw)&bbuf[1], SLJIT_MEM1(SLJIT_SCRATCH_REG2), (sljit_sw)&bbuf[0]);
1939 #if (defined SLJIT_CONFIG_ARM && SLJIT_CONFIG_ARM)
1940 	SLJIT_ASSERT(compiler->cache_arg > 0);
1941 #endif
1942 	sljit_emit_op1(compiler, SLJIT_MOVU_UB, SLJIT_MEM1(SLJIT_SCRATCH_REG1), 0, SLJIT_MEM1(SLJIT_SCRATCH_REG2), 2 * sizeof(sljit_sb));
1943 
1944 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG2, 0, SLJIT_IMM, sizeof(sljit_sh));
1945 	sljit_emit_op1(compiler, SLJIT_MOV_SH, SLJIT_MEM1(SLJIT_SCRATCH_REG2), (sljit_sw)&sbuf[3], SLJIT_SCRATCH_REG2, 0);
1946 #if (defined SLJIT_CONFIG_ARM && SLJIT_CONFIG_ARM)
1947 	SLJIT_ASSERT(compiler->cache_arg == 0);
1948 #endif
1949 
1950 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 3);
1951 	sljit_emit_op2(compiler, SLJIT_MUL, SLJIT_MEM2(SLJIT_SAVED_REG1, SLJIT_SCRATCH_REG1), SLJIT_WORD_SHIFT, SLJIT_MEM2(SLJIT_SAVED_REG1, SLJIT_SCRATCH_REG1), SLJIT_WORD_SHIFT, SLJIT_MEM2(SLJIT_SAVED_REG1, SLJIT_SCRATCH_REG1), SLJIT_WORD_SHIFT);
1952 #if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)
1953 	SLJIT_ASSERT(compiler->cache_arg > 0);
1954 #endif
1955 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 4);
1956 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG2, 0, SLJIT_SAVED_REG1, 0);
1957 	sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_MEM2(SLJIT_SAVED_REG1, SLJIT_SCRATCH_REG1), SLJIT_WORD_SHIFT, SLJIT_MEM2(SLJIT_SCRATCH_REG2, SLJIT_SCRATCH_REG1), SLJIT_WORD_SHIFT, SLJIT_MEM2(SLJIT_SAVED_REG1, SLJIT_SCRATCH_REG1), SLJIT_WORD_SHIFT);
1958 #if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)
1959 	SLJIT_ASSERT(compiler->cache_arg > 0);
1960 #endif
1961 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_SAVED_REG1, 0);
1962 	sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_SCRATCH_REG2, 0, SLJIT_SAVED_REG1, 0, SLJIT_IMM, sizeof(sljit_sw));
1963 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG3, 0, SLJIT_IMM, 4);
1964 	sljit_emit_op1(compiler, SLJIT_MOVU, SLJIT_MEM2(SLJIT_SCRATCH_REG2, SLJIT_SCRATCH_REG3), SLJIT_WORD_SHIFT, SLJIT_MEM2(SLJIT_SCRATCH_REG1, SLJIT_SCRATCH_REG3), SLJIT_WORD_SHIFT);
1965 #if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)
1966 	SLJIT_ASSERT(compiler->cache_arg > 0);
1967 #endif
1968 	sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_MEM1(SLJIT_SAVED_REG1), 5 * sizeof(sljit_sw), SLJIT_MEM1(SLJIT_SAVED_REG1), 5 * sizeof(sljit_sw), SLJIT_SCRATCH_REG1, 0);
1969 	sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_MEM1(SLJIT_SAVED_REG1), 5 * sizeof(sljit_sw), SLJIT_MEM1(SLJIT_SAVED_REG1), 5 * sizeof(sljit_sw), SLJIT_SCRATCH_REG2, 0);
1970 
1971 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, (sljit_sw)&buf - 0x7fff8000 + 6 * sizeof(sljit_sw));
1972 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG2, 0, SLJIT_IMM, 952467);
1973 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SCRATCH_REG1), 0x7fff8000, SLJIT_SCRATCH_REG2, 0);
1974 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SCRATCH_REG1), 0x7fff8000 + sizeof(sljit_sw), SLJIT_MEM1(SLJIT_SCRATCH_REG1), 0x7fff8000);
1975 
1976 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, (sljit_sw)&buf + 0x7fff7fff + 6 * sizeof(sljit_sw));
1977 	sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_MEM1(SLJIT_SCRATCH_REG1), -0x7fff7fff + 2 * sizeof(sljit_sw), SLJIT_MEM1(SLJIT_SCRATCH_REG1), -0x7fff7fff + sizeof(sljit_sw), SLJIT_MEM1(SLJIT_SCRATCH_REG1), -0x7fff7fff);
1978 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, (sljit_sw)&bbuf - 0x7fff7ffe + 3 * sizeof(sljit_sb));
1979 	sljit_emit_op1(compiler, SLJIT_MOV_SB, SLJIT_MEM1(SLJIT_SCRATCH_REG1), 0x7fff7fff, SLJIT_MEM1(SLJIT_SCRATCH_REG1), 0x7fff7ffe);
1980 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, (sljit_sw)&bbuf + 0x7fff7fff + 5 * sizeof(sljit_sb));
1981 	sljit_emit_op1(compiler, SLJIT_MOV_SB, SLJIT_MEM1(SLJIT_SCRATCH_REG1), -0x7fff7fff, SLJIT_MEM1(SLJIT_SCRATCH_REG1), -0x7fff8000);
1982 #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
1983 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, (sljit_sw)&bbuf - SLJIT_W(0x123456123456));
1984 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG2, 0, SLJIT_IMM, (sljit_sw)&bbuf - SLJIT_W(0x123456123456));
1985 	sljit_emit_op1(compiler, SLJIT_MOV_SB, SLJIT_MEM1(SLJIT_SCRATCH_REG1), SLJIT_W(0x123456123456) + 6 * sizeof(sljit_sb), SLJIT_MEM1(SLJIT_SCRATCH_REG2), SLJIT_W(0x123456123456));
1986 #endif
1987 
1988 	sljit_emit_return(compiler, SLJIT_UNUSED, 0, 0);
1989 
1990 	code.code = sljit_generate_code(compiler);
1991 	CHECK(compiler);
1992 	sljit_free_compiler(compiler);
1993 
1994 	code.func3((sljit_sw)&buf, (sljit_sw)&sbuf, (sljit_sw)&bbuf);
1995 	FAILED(buf[2] != 176366, "test24 case 1 failed\n");
1996 	FAILED(buf[3] != 64, "test24 case 2 failed\n");
1997 	FAILED(buf[4] != -100, "test24 case 3 failed\n");
1998 	FAILED(buf[5] != -100 + (sljit_sw)&buf[5] + (sljit_sw)&buf[4], "test24 case 4 failed\n");
1999 	FAILED(buf[6] != 952467, "test24 case 5 failed\n");
2000 	FAILED(buf[7] != 952467, "test24 case 6 failed\n");
2001 	FAILED(buf[8] != 952467 * 2, "test24 case 7 failed\n");
2002 
2003 	FAILED(sbuf[1] != 30000, "test24 case 8 failed\n");
2004 	FAILED(sbuf[2] != -12345, "test24 case 9 failed\n");
2005 	FAILED(sbuf[4] != sizeof(sljit_sh), "test24 case 10 failed\n");
2006 
2007 	FAILED(bbuf[1] != -128, "test24 case 11 failed\n");
2008 	FAILED(bbuf[2] != 99, "test24 case 12 failed\n");
2009 	FAILED(bbuf[4] != 99, "test24 case 13 failed\n");
2010 	FAILED(bbuf[5] != 99, "test24 case 14 failed\n");
2011 #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
2012 	FAILED(bbuf[6] != -128, "test24 case 15 failed\n");
2013 #endif
2014 
2015 	sljit_free_code(code.code);
2016 	successful_tests++;
2017 }
2018 
2019 static void test25(void)
2020 {
2021 #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
2022 	/* 64 bit loads. */
2023 	executable_code code;
2024 	struct sljit_compiler* compiler = sljit_create_compiler();
2025 	sljit_sw buf[14];
2026 
2027 	if (verbose)
2028 		printf("Run test25\n");
2029 
2030 	FAILED(!compiler, "cannot create compiler\n");
2031 	buf[0] = 7;
2032 	buf[1] = 0;
2033 	buf[2] = 0;
2034 	buf[3] = 0;
2035 	buf[4] = 0;
2036 	buf[5] = 0;
2037 	buf[6] = 0;
2038 	buf[7] = 0;
2039 	buf[8] = 0;
2040 	buf[9] = 0;
2041 	buf[10] = 0;
2042 	buf[11] = 0;
2043 	buf[12] = 0;
2044 	buf[13] = 0;
2045 
2046 	sljit_emit_enter(compiler, 1, 3, 1, 0);
2047 
2048 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), 0, SLJIT_IMM, 0);
2049 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), 1 * sizeof(sljit_sw), SLJIT_IMM, 0x7fff);
2050 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), 2 * sizeof(sljit_sw), SLJIT_IMM, -0x8000);
2051 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), 3 * sizeof(sljit_sw), SLJIT_IMM, 0x7fffffff);
2052 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), 4 * sizeof(sljit_sw), SLJIT_IMM, SLJIT_W(-0x80000000));
2053 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), 5 * sizeof(sljit_sw), SLJIT_IMM, SLJIT_W(0x1234567887654321));
2054 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), 6 * sizeof(sljit_sw), SLJIT_IMM, SLJIT_W(0xff80000000));
2055 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), 7 * sizeof(sljit_sw), SLJIT_IMM, SLJIT_W(0x3ff0000000));
2056 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), 8 * sizeof(sljit_sw), SLJIT_IMM, SLJIT_W(0xfffffff800100000));
2057 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), 9 * sizeof(sljit_sw), SLJIT_IMM, SLJIT_W(0xfffffff80010f000));
2058 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), 10 * sizeof(sljit_sw), SLJIT_IMM, SLJIT_W(0x07fff00000008001));
2059 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), 11 * sizeof(sljit_sw), SLJIT_IMM, SLJIT_W(0x07fff00080010000));
2060 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), 12 * sizeof(sljit_sw), SLJIT_IMM, SLJIT_W(0x07fff00080018001));
2061 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), 13 * sizeof(sljit_sw), SLJIT_IMM, SLJIT_W(0x07fff00ffff00000));
2062 
2063 	sljit_emit_return(compiler, SLJIT_UNUSED, 0, 0);
2064 
2065 	code.code = sljit_generate_code(compiler);
2066 	CHECK(compiler);
2067 	sljit_free_compiler(compiler);
2068 
2069 	code.func1((sljit_sw)&buf);
2070 	FAILED(buf[0] != 0, "test25 case 1 failed\n");
2071 	FAILED(buf[1] != 0x7fff, "test25 case 2 failed\n");
2072 	FAILED(buf[2] != -0x8000, "test25 case 3 failed\n");
2073 	FAILED(buf[3] != 0x7fffffff, "test25 case 4 failed\n");
2074 	FAILED(buf[4] != SLJIT_W(-0x80000000), "test25 case 5 failed\n");
2075 	FAILED(buf[5] != SLJIT_W(0x1234567887654321), "test25 case 6 failed\n");
2076 	FAILED(buf[6] != SLJIT_W(0xff80000000), "test25 case 7 failed\n");
2077 	FAILED(buf[7] != SLJIT_W(0x3ff0000000), "test25 case 8 failed\n");
2078 	FAILED((sljit_uw)buf[8] != SLJIT_W(0xfffffff800100000), "test25 case 9 failed\n");
2079 	FAILED((sljit_uw)buf[9] != SLJIT_W(0xfffffff80010f000), "test25 case 10 failed\n");
2080 	FAILED(buf[10] != SLJIT_W(0x07fff00000008001), "test25 case 11 failed\n");
2081 	FAILED(buf[11] != SLJIT_W(0x07fff00080010000), "test25 case 12 failed\n");
2082 	FAILED(buf[12] != SLJIT_W(0x07fff00080018001), "test25 case 13 failed\n");
2083 	FAILED(buf[13] != SLJIT_W(0x07fff00ffff00000), "test25 case 14 failed\n");
2084 
2085 	sljit_free_code(code.code);
2086 #endif
2087 	successful_tests++;
2088 }
2089 
2090 static void test26(void)
2091 {
2092 	/* Aligned access without aligned offsets. */
2093 	executable_code code;
2094 	struct sljit_compiler* compiler = sljit_create_compiler();
2095 	sljit_sw buf[4];
2096 	sljit_si ibuf[4];
2097 	sljit_d dbuf[4];
2098 
2099 	if (verbose)
2100 		printf("Run test26\n");
2101 
2102 	FAILED(!compiler, "cannot create compiler\n");
2103 
2104 	buf[0] = -2789;
2105 	buf[1] = 0;
2106 	buf[2] = 4;
2107 	buf[3] = -4;
2108 
2109 	ibuf[0] = -689;
2110 	ibuf[1] = 0;
2111 	ibuf[2] = -6;
2112 	ibuf[3] = 3;
2113 
2114 	dbuf[0] = 5.75;
2115 	dbuf[1] = 0.0;
2116 	dbuf[2] = 0.0;
2117 	dbuf[3] = -4.0;
2118 
2119 	sljit_emit_enter(compiler, 3, 3, 3, 0);
2120 
2121 	sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_SAVED_REG1, 0, SLJIT_SAVED_REG1, 0, SLJIT_IMM, 3);
2122 	sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_SAVED_REG2, 0, SLJIT_SAVED_REG2, 0, SLJIT_IMM, 1);
2123 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_MEM1(SLJIT_SAVED_REG1), -3);
2124 	sljit_emit_op1(compiler, SLJIT_MOV_SI, SLJIT_MEM1(SLJIT_SAVED_REG2), sizeof(sljit_si) - 1, SLJIT_SCRATCH_REG1, 0);
2125 	sljit_emit_op1(compiler, SLJIT_MOV_SI, SLJIT_SCRATCH_REG1, 0, SLJIT_MEM1(SLJIT_SAVED_REG2), -1);
2126 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw) - 3, SLJIT_SCRATCH_REG1, 0);
2127 
2128 	sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_SCRATCH_REG1, 0, SLJIT_SAVED_REG1, 0, SLJIT_IMM, 100);
2129 	sljit_emit_op2(compiler, SLJIT_MUL, SLJIT_MEM1(SLJIT_SCRATCH_REG1), sizeof(sljit_sw) * 2 - 103, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw) * 2 - 3, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw) * 3 - 3);
2130 	sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_SCRATCH_REG1, 0, SLJIT_SAVED_REG2, 0, SLJIT_IMM, 100);
2131 	sljit_emit_op2(compiler, SLJIT_IMUL, SLJIT_MEM1(SLJIT_SCRATCH_REG1), sizeof(sljit_si) * 2 - 101, SLJIT_MEM1(SLJIT_SAVED_REG2), sizeof(sljit_si) * 2 - 1, SLJIT_MEM1(SLJIT_SAVED_REG2), sizeof(sljit_si) * 3 - 1);
2132 
2133 	if (sljit_is_fpu_available()) {
2134 		sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_SAVED_REG3, 0, SLJIT_SAVED_REG3, 0, SLJIT_IMM, 3);
2135 		sljit_emit_fop1(compiler, SLJIT_MOVD, SLJIT_MEM1(SLJIT_SAVED_REG3), sizeof(sljit_d) - 3, SLJIT_MEM1(SLJIT_SAVED_REG3), -3);
2136 		sljit_emit_fop2(compiler, SLJIT_ADDD, SLJIT_MEM1(SLJIT_SAVED_REG3), sizeof(sljit_d) * 2 - 3, SLJIT_MEM1(SLJIT_SAVED_REG3), -3, SLJIT_MEM1(SLJIT_SAVED_REG3), sizeof(sljit_d) - 3);
2137 		sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_SCRATCH_REG1, 0, SLJIT_SAVED_REG3, 0, SLJIT_IMM, 2);
2138 		sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG2, 0, SLJIT_IMM, (sizeof(sljit_d) * 3 - 4) >> 1);
2139 		sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_SCRATCH_REG3, 0, SLJIT_SAVED_REG3, 0, SLJIT_IMM, 1);
2140 		sljit_emit_fop2(compiler, SLJIT_DIVD, SLJIT_MEM1(SLJIT_SCRATCH_REG1), sizeof(sljit_d) * 3 - 5, SLJIT_MEM1(SLJIT_SAVED_REG3), sizeof(sljit_d) * 2 - 3, SLJIT_MEM2(SLJIT_SCRATCH_REG3, SLJIT_SCRATCH_REG2), 1);
2141 	}
2142 
2143 	sljit_emit_return(compiler, SLJIT_UNUSED, 0, 0);
2144 
2145 	code.code = sljit_generate_code(compiler);
2146 	CHECK(compiler);
2147 	sljit_free_compiler(compiler);
2148 
2149 	code.func3((sljit_sw)&buf, (sljit_sw)&ibuf, (sljit_sw)&dbuf);
2150 
2151 	FAILED(buf[1] != -689, "test26 case 1 failed\n");
2152 	FAILED(buf[2] != -16, "test26 case 2 failed\n");
2153 	FAILED(ibuf[1] != -2789, "test26 case 3 failed\n");
2154 	FAILED(ibuf[2] != -18, "test26 case 4 failed\n");
2155 
2156 	if (sljit_is_fpu_available()) {
2157 		FAILED(dbuf[1] != 5.75, "test26 case 5 failed\n");
2158 		FAILED(dbuf[2] != 11.5, "test26 case 6 failed\n");
2159 		FAILED(dbuf[3] != -2.875, "test26 case 7 failed\n");
2160 	}
2161 
2162 	sljit_free_code(code.code);
2163 	successful_tests++;
2164 }
2165 
2166 static void test27(void)
2167 {
2168 #define SET_NEXT_BYTE(type) \
2169 		cond_set(compiler, SLJIT_SCRATCH_REG3, 0, type); \
2170 		sljit_emit_op1(compiler, SLJIT_MOVU_UB, SLJIT_MEM1(SLJIT_SAVED_REG1), 1, SLJIT_SCRATCH_REG3, 0);
2171 #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
2172 #define RESULT(i) i
2173 #else
2174 #define RESULT(i) (3 - i)
2175 #endif
2176 
2177 	/* Playing with conditional flags. */
2178 	executable_code code;
2179 	struct sljit_compiler* compiler = sljit_create_compiler();
2180 	sljit_sb buf[37];
2181 	sljit_si i;
2182 
2183 	if (verbose)
2184 		printf("Run test27\n");
2185 
2186 	for (i = 0; i < 37; ++i)
2187 		buf[i] = 10;
2188 
2189 	FAILED(!compiler, "cannot create compiler\n");
2190 
2191 	/* 3 arguments passed, 3 arguments used. */
2192 	sljit_emit_enter(compiler, 1, 3, 3, 0);
2193 
2194 	sljit_emit_op2(compiler, SLJIT_SUB, SLJIT_SAVED_REG1, 0, SLJIT_SAVED_REG1, 0, SLJIT_IMM, 1);
2195 
2196 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 0x1001);
2197 	sljit_emit_op2(compiler, SLJIT_SHL, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 20);
2198 	/* 0x100100000 on 64 bit machines, 0x100000 on 32 bit machines. */
2199 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG2, 0, SLJIT_IMM, 0x800000);
2200 	sljit_emit_op2(compiler, SLJIT_SUB | SLJIT_SET_U, SLJIT_UNUSED, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG2, 0);
2201 	sljit_emit_op0(compiler, SLJIT_NOP); /* Nop should keep the flags. */
2202 	SET_NEXT_BYTE(SLJIT_C_GREATER);
2203 	SET_NEXT_BYTE(SLJIT_C_LESS);
2204 	sljit_emit_op1(compiler, SLJIT_MOV_SI | SLJIT_INT_OP, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG1, 0);
2205 	sljit_emit_op1(compiler, SLJIT_MOV_SI | SLJIT_INT_OP, SLJIT_SCRATCH_REG2, 0, SLJIT_SCRATCH_REG2, 0);
2206 	sljit_emit_op2(compiler, SLJIT_ISUB | SLJIT_SET_U, SLJIT_UNUSED, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG2, 0);
2207 	sljit_emit_op0(compiler, SLJIT_NOP); /* Nop should keep the flags. */
2208 	SET_NEXT_BYTE(SLJIT_C_GREATER);
2209 	SET_NEXT_BYTE(SLJIT_C_LESS);
2210 
2211 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 0x1000);
2212 	sljit_emit_op2(compiler, SLJIT_SHL, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 20);
2213 	sljit_emit_op2(compiler, SLJIT_OR, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 0x10);
2214 	/* 0x100000010 on 64 bit machines, 0x10 on 32 bit machines. */
2215 	sljit_emit_op2(compiler, SLJIT_SUB | SLJIT_SET_U, SLJIT_UNUSED, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 0x80);
2216 	SET_NEXT_BYTE(SLJIT_C_GREATER);
2217 	SET_NEXT_BYTE(SLJIT_C_LESS);
2218 	sljit_emit_op1(compiler, SLJIT_IMOV, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG1, 0);
2219 	sljit_emit_op2(compiler, SLJIT_ISUB | SLJIT_SET_U, SLJIT_UNUSED, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 0x80);
2220 	SET_NEXT_BYTE(SLJIT_C_GREATER);
2221 	SET_NEXT_BYTE(SLJIT_C_LESS);
2222 
2223 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 0);
2224 	sljit_emit_op2(compiler, SLJIT_SUB, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 1);
2225 	/* 0xff..ff on all machines. */
2226 	sljit_emit_op2(compiler, SLJIT_SUB | SLJIT_SET_U, SLJIT_SCRATCH_REG2, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 1);
2227 	SET_NEXT_BYTE(SLJIT_C_LESS_EQUAL);
2228 	SET_NEXT_BYTE(SLJIT_C_GREATER_EQUAL);
2229 	sljit_emit_op2(compiler, SLJIT_SUB | SLJIT_SET_S, SLJIT_SCRATCH_REG2, 0, SLJIT_SCRATCH_REG2, 0, SLJIT_IMM, -1);
2230 	SET_NEXT_BYTE(SLJIT_C_SIG_GREATER);
2231 	SET_NEXT_BYTE(SLJIT_C_SIG_LESS);
2232 	sljit_emit_op2(compiler, SLJIT_SUB | SLJIT_SET_E, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG2, 0, SLJIT_SCRATCH_REG1, 0);
2233 	SET_NEXT_BYTE(SLJIT_C_EQUAL);
2234 	SET_NEXT_BYTE(SLJIT_C_NOT_EQUAL);
2235 	sljit_emit_op2(compiler, SLJIT_SUB | SLJIT_SET_O | SLJIT_SET_U, SLJIT_SCRATCH_REG2, 0, SLJIT_SCRATCH_REG2, 0, SLJIT_IMM, -2);
2236 	SET_NEXT_BYTE(SLJIT_C_OVERFLOW);
2237 	SET_NEXT_BYTE(SLJIT_C_NOT_OVERFLOW);
2238 	SET_NEXT_BYTE(SLJIT_C_GREATER_EQUAL);
2239 	SET_NEXT_BYTE(SLJIT_C_LESS_EQUAL);
2240 
2241 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 0x80000000);
2242 	sljit_emit_op2(compiler, SLJIT_SHL, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 16);
2243 	sljit_emit_op2(compiler, SLJIT_SHL, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 16);
2244 	/* 0x80..0 on 64 bit machines, 0 on 32 bit machines. */
2245 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG2, 0, SLJIT_IMM, 0xffffffff);
2246 	sljit_emit_op2(compiler, SLJIT_SUB | SLJIT_SET_O, SLJIT_UNUSED, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG2, 0);
2247 	SET_NEXT_BYTE(SLJIT_C_OVERFLOW);
2248 	SET_NEXT_BYTE(SLJIT_C_NOT_OVERFLOW);
2249 	sljit_emit_op1(compiler, SLJIT_MOV_SI, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG1, 0);
2250 	sljit_emit_op1(compiler, SLJIT_MOV_UI, SLJIT_SCRATCH_REG2, 0, SLJIT_SCRATCH_REG2, 0);
2251 	sljit_emit_op2(compiler, SLJIT_ISUB | SLJIT_SET_O, SLJIT_UNUSED, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG2, 0);
2252 	SET_NEXT_BYTE(SLJIT_C_OVERFLOW);
2253 	SET_NEXT_BYTE(SLJIT_C_NOT_OVERFLOW);
2254 
2255 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 0);
2256 	sljit_emit_op2(compiler, SLJIT_SUB | SLJIT_SET_C, SLJIT_UNUSED, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 1);
2257 	sljit_emit_op2(compiler, SLJIT_SUBC | SLJIT_SET_C, SLJIT_UNUSED, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 0);
2258 	sljit_emit_op2(compiler, SLJIT_SUBC, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 6, SLJIT_SCRATCH_REG1, 0);
2259 	sljit_emit_op1(compiler, SLJIT_MOVU_UB, SLJIT_MEM1(SLJIT_SAVED_REG1), 1, SLJIT_SCRATCH_REG1, 0);
2260 
2261 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, -1);
2262 	sljit_emit_op2(compiler, SLJIT_ADD | SLJIT_SET_C, SLJIT_UNUSED, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 1);
2263 	sljit_emit_op2(compiler, SLJIT_ADDC | SLJIT_SET_C, SLJIT_UNUSED, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 1);
2264 	sljit_emit_op2(compiler, SLJIT_ADDC, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 9);
2265 	sljit_emit_op1(compiler, SLJIT_MOVU_UB, SLJIT_MEM1(SLJIT_SAVED_REG1), 1, SLJIT_SCRATCH_REG1, 0);
2266 
2267 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 1);
2268 	sljit_emit_op2(compiler, SLJIT_SHL, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, (8 * sizeof(sljit_sw)) - 1);
2269 	sljit_emit_op2(compiler, SLJIT_ADD | SLJIT_SET_E, SLJIT_UNUSED, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 0);
2270 	SET_NEXT_BYTE(SLJIT_C_EQUAL);
2271 	sljit_emit_op2(compiler, SLJIT_ADD | SLJIT_SET_E, SLJIT_UNUSED, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG1, 0);
2272 	SET_NEXT_BYTE(SLJIT_C_EQUAL);
2273 
2274 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 0);
2275 	sljit_emit_op2(compiler, SLJIT_ASHR | SLJIT_SET_E, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 0);
2276 	SET_NEXT_BYTE(SLJIT_C_EQUAL);
2277 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 1);
2278 	sljit_emit_op2(compiler, SLJIT_LSHR | SLJIT_SET_E, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 0xffffc0);
2279 	SET_NEXT_BYTE(SLJIT_C_NOT_EQUAL);
2280 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_PREF_SHIFT_REG, 0, SLJIT_IMM, 0);
2281 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 0);
2282 	sljit_emit_op2(compiler, SLJIT_ASHR | SLJIT_SET_E, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_PREF_SHIFT_REG, 0);
2283 	SET_NEXT_BYTE(SLJIT_C_EQUAL);
2284 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_PREF_SHIFT_REG, 0, SLJIT_IMM, 0);
2285 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 1);
2286 	sljit_emit_op2(compiler, SLJIT_LSHR | SLJIT_SET_E, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_PREF_SHIFT_REG, 0);
2287 	SET_NEXT_BYTE(SLJIT_C_NOT_EQUAL);
2288 
2289 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 0);
2290 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG2, 0, SLJIT_IMM, 1);
2291 	sljit_emit_op2(compiler, SLJIT_SUB | SLJIT_SET_C, SLJIT_UNUSED, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG1, 0);
2292 	sljit_emit_op2(compiler, SLJIT_SUBC, SLJIT_SCRATCH_REG3, 0, SLJIT_IMM, 1, SLJIT_SCRATCH_REG1, 0);
2293 	sljit_emit_op1(compiler, SLJIT_MOVU_UB, SLJIT_MEM1(SLJIT_SAVED_REG1), 1, SLJIT_SCRATCH_REG3, 0);
2294 	sljit_emit_op2(compiler, SLJIT_SUBC | SLJIT_SET_C, SLJIT_UNUSED, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG2, 0);
2295 	sljit_emit_op2(compiler, SLJIT_SUBC, SLJIT_SCRATCH_REG3, 0, SLJIT_IMM, 1, SLJIT_SCRATCH_REG1, 0);
2296 	sljit_emit_op1(compiler, SLJIT_MOVU_UB, SLJIT_MEM1(SLJIT_SAVED_REG1), 1, SLJIT_SCRATCH_REG3, 0);
2297 
2298 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, -34);
2299 	sljit_emit_op2(compiler, SLJIT_SUB | SLJIT_SET_S | SLJIT_SET_U, SLJIT_UNUSED, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 0x1234);
2300 	SET_NEXT_BYTE(SLJIT_C_LESS);
2301 	SET_NEXT_BYTE(SLJIT_C_SIG_LESS);
2302 #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
2303 	sljit_emit_op1(compiler, SLJIT_IMOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, SLJIT_W(0x12300000000) - 43);
2304 #else
2305 	sljit_emit_op1(compiler, SLJIT_IMOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, -43);
2306 #endif
2307 	sljit_emit_op1(compiler, SLJIT_IMOV, SLJIT_SCRATCH_REG2, 0, SLJIT_IMM, -96);
2308 	sljit_emit_op2(compiler, SLJIT_ISUB | SLJIT_SET_S | SLJIT_SET_U, SLJIT_UNUSED, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG2, 0);
2309 	SET_NEXT_BYTE(SLJIT_C_LESS);
2310 	SET_NEXT_BYTE(SLJIT_C_SIG_GREATER);
2311 
2312 	sljit_emit_return(compiler, SLJIT_UNUSED, 0, 0);
2313 
2314 	code.code = sljit_generate_code(compiler);
2315 	CHECK(compiler);
2316 	sljit_free_compiler(compiler);
2317 
2318 	code.func1((sljit_sw)&buf);
2319 
2320 	FAILED(buf[0] != RESULT(1), "test27 case 1 failed\n");
2321 	FAILED(buf[1] != RESULT(2), "test27 case 2 failed\n");
2322 	FAILED(buf[2] != 2, "test27 case 3 failed\n");
2323 	FAILED(buf[3] != 1, "test27 case 4 failed\n");
2324 	FAILED(buf[4] != RESULT(1), "test27 case 5 failed\n");
2325 	FAILED(buf[5] != RESULT(2), "test27 case 6 failed\n");
2326 	FAILED(buf[6] != 2, "test27 case 7 failed\n");
2327 	FAILED(buf[7] != 1, "test27 case 8 failed\n");
2328 
2329 	FAILED(buf[8] != 2, "test27 case 9 failed\n");
2330 	FAILED(buf[9] != 1, "test27 case 10 failed\n");
2331 	FAILED(buf[10] != 2, "test27 case 11 failed\n");
2332 	FAILED(buf[11] != 1, "test27 case 12 failed\n");
2333 	FAILED(buf[12] != 1, "test27 case 13 failed\n");
2334 	FAILED(buf[13] != 2, "test27 case 14 failed\n");
2335 	FAILED(buf[14] != 2, "test27 case 15 failed\n");
2336 	FAILED(buf[15] != 1, "test27 case 16 failed\n");
2337 	FAILED(buf[16] != 1, "test27 case 17 failed\n");
2338 	FAILED(buf[17] != 2, "test27 case 18 failed\n");
2339 
2340 	FAILED(buf[18] != RESULT(1), "test27 case 19 failed\n");
2341 	FAILED(buf[19] != RESULT(2), "test27 case 20 failed\n");
2342 	FAILED(buf[20] != 2, "test27 case 21 failed\n");
2343 	FAILED(buf[21] != 1, "test27 case 22 failed\n");
2344 
2345 	FAILED(buf[22] != 5, "test27 case 23 failed\n");
2346 	FAILED(buf[23] != 9, "test27 case 24 failed\n");
2347 
2348 	FAILED(buf[24] != 2, "test27 case 25 failed\n");
2349 	FAILED(buf[25] != 1, "test27 case 26 failed\n");
2350 
2351 	FAILED(buf[26] != 1, "test27 case 27 failed\n");
2352 	FAILED(buf[27] != 1, "test27 case 28 failed\n");
2353 	FAILED(buf[28] != 1, "test27 case 29 failed\n");
2354 	FAILED(buf[29] != 1, "test27 case 30 failed\n");
2355 
2356 	FAILED(buf[30] != 1, "test27 case 31 failed\n");
2357 	FAILED(buf[31] != 0, "test27 case 32 failed\n");
2358 
2359 	FAILED(buf[32] != 2, "test27 case 33 failed\n");
2360 	FAILED(buf[33] != 1, "test27 case 34 failed\n");
2361 	FAILED(buf[34] != 2, "test27 case 35 failed\n");
2362 	FAILED(buf[35] != 1, "test27 case 36 failed\n");
2363 	FAILED(buf[36] != 10, "test27 case 37 failed\n");
2364 
2365 	sljit_free_code(code.code);
2366 	successful_tests++;
2367 #undef SET_NEXT_BYTE
2368 #undef RESULT
2369 }
2370 
2371 static void test28(void)
2372 {
2373 	/* Test mov. */
2374 	executable_code code;
2375 	struct sljit_compiler* compiler = sljit_create_compiler();
2376 	struct sljit_const* const1;
2377 	struct sljit_label* label;
2378 	sljit_uw label_addr;
2379 	sljit_sw buf[5];
2380 
2381 	if (verbose)
2382 		printf("Run test28\n");
2383 
2384 	FAILED(!compiler, "cannot create compiler\n");
2385 
2386 	buf[0] = -36;
2387 	buf[1] = 8;
2388 	buf[2] = 0;
2389 	buf[3] = 10;
2390 	buf[4] = 0;
2391 
2392 	FAILED(!compiler, "cannot create compiler\n");
2393 	sljit_emit_enter(compiler, 1, 5, 5, 0);
2394 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_TEMPORARY_EREG1, 0, SLJIT_IMM, -234);
2395 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_TEMPORARY_EREG2, 0, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw));
2396 	sljit_emit_op2(compiler, SLJIT_MUL, SLJIT_SAVED_EREG1, 0, SLJIT_TEMPORARY_EREG1, 0, SLJIT_TEMPORARY_EREG2, 0);
2397 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw), SLJIT_SAVED_EREG1, 0);
2398 	sljit_emit_op2(compiler, SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, SLJIT_SAVED_EREG1, 0, SLJIT_IMM, 0);
2399 	sljit_emit_op_flags(compiler, SLJIT_MOV, SLJIT_SAVED_EREG1, 0, SLJIT_UNUSED, 0, SLJIT_C_NOT_ZERO);
2400 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), 2 * sizeof(sljit_sw), SLJIT_SAVED_EREG1, 0);
2401 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SAVED_EREG2, 0, SLJIT_MEM1(SLJIT_SAVED_REG1), 3 * sizeof(sljit_sw));
2402 	sljit_emit_op2(compiler, SLJIT_SUB, SLJIT_SAVED_EREG2, 0, SLJIT_SAVED_EREG2, 0, SLJIT_TEMPORARY_EREG2, 0);
2403 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), 3 * sizeof(sljit_sw), SLJIT_SAVED_EREG2, 0);
2404 	const1 = sljit_emit_const(compiler, SLJIT_SAVED_EREG1, 0, 0);
2405 	sljit_emit_ijump(compiler, SLJIT_JUMP, SLJIT_SAVED_EREG1, 0);
2406 	sljit_emit_op2(compiler, SLJIT_SUB, SLJIT_SAVED_EREG1, 0, SLJIT_SAVED_EREG1, 0, SLJIT_IMM, 100);
2407 	label = sljit_emit_label(compiler);
2408 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), 4 * sizeof(sljit_sw), SLJIT_SAVED_EREG1, 0);
2409 	sljit_emit_return(compiler, SLJIT_MOV, SLJIT_TEMPORARY_EREG2, 0);
2410 
2411 	code.code = sljit_generate_code(compiler);
2412 	CHECK(compiler);
2413 	label_addr = sljit_get_label_addr(label);
2414 	sljit_set_const(sljit_get_const_addr(const1), label_addr);
2415 	sljit_free_compiler(compiler);
2416 
2417 	FAILED(code.func1((sljit_sw)&buf) != 8, "test28 case 1 failed\n");
2418 	FAILED(buf[1] != -1872, "test28 case 2 failed\n");
2419 	FAILED(buf[2] != 1, "test28 case 3 failed\n");
2420 	FAILED(buf[3] != 2, "test28 case 4 failed\n");
2421 	FAILED(buf[4] != label_addr, "test28 case 5 failed\n");
2422 
2423 	sljit_free_code(code.code);
2424 	successful_tests++;
2425 }
2426 
2427 static void test29(void)
2428 {
2429 	/* Test signed/unsigned bytes and halfs. */
2430 	executable_code code;
2431 	struct sljit_compiler* compiler = sljit_create_compiler();
2432 	sljit_sw buf[25];
2433 
2434 	if (verbose)
2435 		printf("Run test29\n");
2436 
2437 	buf[0] = 0;
2438 	buf[1] = 0;
2439 	buf[2] = 0;
2440 	buf[3] = 0;
2441 	buf[4] = 0;
2442 	buf[5] = 0;
2443 	buf[6] = 0;
2444 	buf[7] = 0;
2445 	buf[8] = 0;
2446 	buf[9] = 0;
2447 	buf[10] = 0;
2448 	buf[11] = 0;
2449 	buf[12] = 0;
2450 	buf[13] = 0;
2451 	buf[14] = 0;
2452 	buf[15] = 0;
2453 	buf[16] = 0;
2454 	buf[17] = 0;
2455 	buf[18] = 0;
2456 	buf[19] = 0;
2457 	buf[20] = 0;
2458 	buf[21] = 0;
2459 	buf[22] = 0;
2460 	buf[23] = 0;
2461 	buf[24] = 0;
2462 
2463 	FAILED(!compiler, "cannot create compiler\n");
2464 	sljit_emit_enter(compiler, 1, 5, 5, 0);
2465 
2466 	sljit_emit_op1(compiler, SLJIT_MOV_SB, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, -187);
2467 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), 0, SLJIT_SCRATCH_REG1, 0);
2468 	sljit_emit_op1(compiler, SLJIT_MOVU_SB, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, -605);
2469 	sljit_emit_op1(compiler, SLJIT_MOVU, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_uw), SLJIT_SCRATCH_REG1, 0);
2470 	sljit_emit_op1(compiler, SLJIT_MOV_UB, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, -56);
2471 	sljit_emit_op1(compiler, SLJIT_MOVU, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_uw), SLJIT_SCRATCH_REG1, 0);
2472 	sljit_emit_op1(compiler, SLJIT_MOVU_UB, SLJIT_TEMPORARY_EREG2, 0, SLJIT_IMM, 0xcde5);
2473 	sljit_emit_op1(compiler, SLJIT_MOVU, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_uw), SLJIT_TEMPORARY_EREG2, 0);
2474 
2475 	sljit_emit_op1(compiler, SLJIT_MOV_SH, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, -45896);
2476 	sljit_emit_op1(compiler, SLJIT_MOVU, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_uw), SLJIT_SCRATCH_REG1, 0);
2477 	sljit_emit_op1(compiler, SLJIT_MOVU_SH, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, -1472797);
2478 	sljit_emit_op1(compiler, SLJIT_MOVU, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_uw), SLJIT_SCRATCH_REG1, 0);
2479 	sljit_emit_op1(compiler, SLJIT_MOV_UH, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, -12890);
2480 	sljit_emit_op1(compiler, SLJIT_MOVU, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_uw), SLJIT_SCRATCH_REG1, 0);
2481 	sljit_emit_op1(compiler, SLJIT_MOVU_UH, SLJIT_TEMPORARY_EREG2, 0, SLJIT_IMM, 0x9cb0a6);
2482 	sljit_emit_op1(compiler, SLJIT_MOVU, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_uw), SLJIT_TEMPORARY_EREG2, 0);
2483 
2484 #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
2485 	sljit_emit_op1(compiler, SLJIT_MOV_SI, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, SLJIT_W(-3580429715));
2486 	sljit_emit_op1(compiler, SLJIT_MOVU, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_uw), SLJIT_SCRATCH_REG1, 0);
2487 	sljit_emit_op1(compiler, SLJIT_MOVU_SI, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, SLJIT_W(-100722768662));
2488 	sljit_emit_op1(compiler, SLJIT_MOVU, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_uw), SLJIT_SCRATCH_REG1, 0);
2489 	sljit_emit_op1(compiler, SLJIT_MOV_UI, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, SLJIT_W(-1457052677972));
2490 	sljit_emit_op1(compiler, SLJIT_MOVU, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_uw), SLJIT_SCRATCH_REG1, 0);
2491 	sljit_emit_op1(compiler, SLJIT_MOVU_UI, SLJIT_TEMPORARY_EREG2, 0, SLJIT_IMM, SLJIT_W(0xcef97a70b5));
2492 	sljit_emit_op1(compiler, SLJIT_MOVU, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_uw), SLJIT_TEMPORARY_EREG2, 0);
2493 #else
2494 	sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_SAVED_REG1, 0, SLJIT_SAVED_REG1, 0, SLJIT_IMM, 4 * sizeof(sljit_uw));
2495 #endif
2496 
2497 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG2, 0, SLJIT_IMM, -187);
2498 	sljit_emit_op1(compiler, SLJIT_MOV_SB, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG2, 0);
2499 	sljit_emit_op1(compiler, SLJIT_MOVU, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_uw), SLJIT_SCRATCH_REG1, 0);
2500 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SAVED_REG3, 0, SLJIT_IMM, -605);
2501 	sljit_emit_op1(compiler, SLJIT_MOVU_SB, SLJIT_SCRATCH_REG1, 0, SLJIT_SAVED_REG3, 0);
2502 	sljit_emit_op1(compiler, SLJIT_MOVU, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_uw), SLJIT_SCRATCH_REG1, 0);
2503 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG3, 0, SLJIT_IMM, -56);
2504 	sljit_emit_op1(compiler, SLJIT_MOV_UB, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG3, 0);
2505 	sljit_emit_op1(compiler, SLJIT_MOVU, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_uw), SLJIT_SCRATCH_REG1, 0);
2506 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_TEMPORARY_EREG1, 0, SLJIT_IMM, 0xcde5);
2507 	sljit_emit_op1(compiler, SLJIT_MOVU_UB, SLJIT_TEMPORARY_EREG2, 0, SLJIT_TEMPORARY_EREG1, 0);
2508 	sljit_emit_op1(compiler, SLJIT_MOVU, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_uw), SLJIT_TEMPORARY_EREG2, 0);
2509 
2510 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG2, 0, SLJIT_IMM, -45896);
2511 	sljit_emit_op1(compiler, SLJIT_MOV_SH, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG2, 0);
2512 	sljit_emit_op1(compiler, SLJIT_MOVU, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_uw), SLJIT_SCRATCH_REG1, 0);
2513 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SAVED_REG3, 0, SLJIT_IMM, -1472797);
2514 	sljit_emit_op1(compiler, SLJIT_MOVU_SH, SLJIT_SCRATCH_REG1, 0, SLJIT_SAVED_REG3, 0);
2515 	sljit_emit_op1(compiler, SLJIT_MOVU, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_uw), SLJIT_SCRATCH_REG1, 0);
2516 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG3, 0, SLJIT_IMM, -12890);
2517 	sljit_emit_op1(compiler, SLJIT_MOV_UH, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG3, 0);
2518 	sljit_emit_op1(compiler, SLJIT_MOVU, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_uw), SLJIT_SCRATCH_REG1, 0);
2519 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_TEMPORARY_EREG1, 0, SLJIT_IMM, 0x9cb0a6);
2520 	sljit_emit_op1(compiler, SLJIT_MOVU_UH, SLJIT_TEMPORARY_EREG2, 0, SLJIT_TEMPORARY_EREG1, 0);
2521 	sljit_emit_op1(compiler, SLJIT_MOVU, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_uw), SLJIT_TEMPORARY_EREG2, 0);
2522 
2523 #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
2524 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG2, 0, SLJIT_IMM, SLJIT_W(-3580429715));
2525 	sljit_emit_op1(compiler, SLJIT_MOV_SI, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG2, 0);
2526 	sljit_emit_op1(compiler, SLJIT_MOVU, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_uw), SLJIT_SCRATCH_REG1, 0);
2527 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SAVED_REG3, 0, SLJIT_IMM, SLJIT_W(-100722768662));
2528 	sljit_emit_op1(compiler, SLJIT_MOVU_SI, SLJIT_SCRATCH_REG1, 0, SLJIT_SAVED_REG3, 0);
2529 	sljit_emit_op1(compiler, SLJIT_MOVU, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_uw), SLJIT_SCRATCH_REG1, 0);
2530 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG3, 0, SLJIT_IMM, SLJIT_W(-1457052677972));
2531 	sljit_emit_op1(compiler, SLJIT_MOV_UI, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG3, 0);
2532 	sljit_emit_op1(compiler, SLJIT_MOVU, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_uw), SLJIT_SCRATCH_REG1, 0);
2533 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_TEMPORARY_EREG1, 0, SLJIT_IMM, SLJIT_W(0xcef97a70b5));
2534 	sljit_emit_op1(compiler, SLJIT_MOVU_UI, SLJIT_TEMPORARY_EREG2, 0, SLJIT_TEMPORARY_EREG1, 0);
2535 	sljit_emit_op1(compiler, SLJIT_MOVU, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_uw), SLJIT_TEMPORARY_EREG2, 0);
2536 #else
2537 	sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_SAVED_REG1, 0, SLJIT_SAVED_REG1, 0, SLJIT_IMM, 4 * sizeof(sljit_uw));
2538 #endif
2539 
2540 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SAVED_REG3, 0, SLJIT_IMM, 0x9faa5);
2541 	sljit_emit_op1(compiler, SLJIT_MOV_SB, SLJIT_SAVED_REG3, 0, SLJIT_SAVED_REG3, 0);
2542 	sljit_emit_op1(compiler, SLJIT_MOVU, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_uw), SLJIT_SAVED_REG3, 0);
2543 
2544 	sljit_emit_return(compiler, SLJIT_UNUSED, 0, 0);
2545 
2546 	code.code = sljit_generate_code(compiler);
2547 	CHECK(compiler);
2548 	sljit_free_compiler(compiler);
2549 
2550 	code.func1((sljit_sw)&buf);
2551 	FAILED(buf[0] != 69, "test29 case 1 failed\n");
2552 	FAILED(buf[1] != -93, "test29 case 2 failed\n");
2553 	FAILED(buf[2] != 200, "test29 case 3 failed\n");
2554 	FAILED(buf[3] != 0xe5, "test29 case 4 failed\n");
2555 	FAILED(buf[4] != 19640, "test29 case 5 failed\n");
2556 	FAILED(buf[5] != -31005, "test29 case 6 failed\n");
2557 	FAILED(buf[6] != 52646, "test29 case 7 failed\n");
2558 	FAILED(buf[7] != 0xb0a6, "test29 case 8 failed\n");
2559 
2560 #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
2561 	FAILED(buf[8] != SLJIT_W(714537581), "test29 case 9 failed\n");
2562 	FAILED(buf[9] != SLJIT_W(-1938520854), "test29 case 10 failed\n");
2563 	FAILED(buf[10] != SLJIT_W(3236202668), "test29 case 11 failed\n");
2564 	FAILED(buf[11] != SLJIT_W(0xf97a70b5), "test29 case 12 failed\n");
2565 #endif
2566 
2567 	FAILED(buf[12] != 69, "test29 case 13 failed\n");
2568 	FAILED(buf[13] != -93, "test29 case 14 failed\n");
2569 	FAILED(buf[14] != 200, "test29 case 15 failed\n");
2570 	FAILED(buf[15] != 0xe5, "test29 case 16 failed\n");
2571 	FAILED(buf[16] != 19640, "test29 case 17 failed\n");
2572 	FAILED(buf[17] != -31005, "test29 case 18 failed\n");
2573 	FAILED(buf[18] != 52646, "test29 case 19 failed\n");
2574 	FAILED(buf[19] != 0xb0a6, "test29 case 20 failed\n");
2575 
2576 #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
2577 	FAILED(buf[20] != SLJIT_W(714537581), "test29 case 21 failed\n");
2578 	FAILED(buf[21] != SLJIT_W(-1938520854), "test29 case 22 failed\n");
2579 	FAILED(buf[22] != SLJIT_W(3236202668), "test29 case 23 failed\n");
2580 	FAILED(buf[23] != SLJIT_W(0xf97a70b5), "test29 case 24 failed\n");
2581 #endif
2582 
2583 	FAILED(buf[24] != -91, "test29 case 25 failed\n");
2584 
2585 	sljit_free_code(code.code);
2586 	successful_tests++;
2587 }
2588 
2589 static void test30(void)
2590 {
2591 	/* Test unused results. */
2592 	executable_code code;
2593 	struct sljit_compiler* compiler = sljit_create_compiler();
2594 	sljit_sw buf[1];
2595 
2596 	if (verbose)
2597 		printf("Run test30\n");
2598 
2599 	FAILED(!compiler, "cannot create compiler\n");
2600 	buf[0] = 0;
2601 	sljit_emit_enter(compiler, 1, 5, 5, 0);
2602 
2603 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 1);
2604 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG2, 0, SLJIT_IMM, 1);
2605 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG3, 0, SLJIT_IMM, 1);
2606 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_TEMPORARY_EREG1, 0, SLJIT_IMM, 1);
2607 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_TEMPORARY_EREG2, 0, SLJIT_IMM, 1);
2608 #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
2609 	sljit_emit_op1(compiler, SLJIT_IMOV, SLJIT_SAVED_REG2, 0, SLJIT_IMM, SLJIT_W(-0x123ffffffff));
2610 #else
2611 	sljit_emit_op1(compiler, SLJIT_IMOV, SLJIT_SAVED_REG2, 0, SLJIT_IMM, 1);
2612 #endif
2613 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SAVED_REG3, 0, SLJIT_IMM, 1);
2614 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SAVED_EREG1, 0, SLJIT_IMM, 1);
2615 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SAVED_EREG2, 0, SLJIT_IMM, 1);
2616 
2617 	/* Some calculations with unused results. */
2618 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_UNUSED, 0, SLJIT_SCRATCH_REG3, 0);
2619 	sljit_emit_op1(compiler, SLJIT_NOT, SLJIT_UNUSED, 0, SLJIT_SCRATCH_REG2, 0);
2620 	sljit_emit_op1(compiler, SLJIT_NEG, SLJIT_UNUSED, 0, SLJIT_MEM1(SLJIT_SAVED_REG1), 0);
2621 	sljit_emit_op2(compiler, SLJIT_ADD | SLJIT_SET_E, SLJIT_UNUSED, 0, SLJIT_MEM1(SLJIT_SAVED_REG1), 0, SLJIT_MEM1(SLJIT_SAVED_REG1), 0);
2622 	sljit_emit_op2(compiler, SLJIT_ISUB | SLJIT_SET_U, SLJIT_UNUSED, 0, SLJIT_MEM1(SLJIT_SAVED_REG1), 0, SLJIT_MEM1(SLJIT_SAVED_REG1), 0);
2623 	sljit_emit_op2(compiler, SLJIT_MUL, SLJIT_UNUSED, 0, SLJIT_SAVED_REG1, 0, SLJIT_MEM1(SLJIT_SAVED_REG1), 0);
2624 	sljit_emit_op2(compiler, SLJIT_SHL | SLJIT_SET_E, SLJIT_UNUSED, 0, SLJIT_SAVED_EREG1, 0, SLJIT_SCRATCH_REG3, 0);
2625 	sljit_emit_op2(compiler, SLJIT_LSHR | SLJIT_SET_E, SLJIT_UNUSED, 0, SLJIT_MEM1(SLJIT_SAVED_REG1), 0, SLJIT_IMM, 5);
2626 	sljit_emit_op2(compiler, SLJIT_AND, SLJIT_UNUSED, 0, SLJIT_MEM1(SLJIT_SAVED_REG1), 0, SLJIT_IMM, 0xff);
2627 	sljit_emit_op1(compiler, SLJIT_INOT | SLJIT_SET_E, SLJIT_UNUSED, 0, SLJIT_SAVED_REG2, 0);
2628 
2629 	/* Testing that any change happens. */
2630 	sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG2, 0);
2631 	sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG3, 0);
2632 	sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_TEMPORARY_EREG1, 0);
2633 	sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_TEMPORARY_EREG2, 0);
2634 	sljit_emit_op1(compiler, SLJIT_MOV_UI, SLJIT_SAVED_REG2, 0, SLJIT_SAVED_REG2, 0);
2635 	sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_SAVED_REG2, 0);
2636 	sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_SAVED_REG3, 0);
2637 	sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_SAVED_EREG1, 0);
2638 	sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_MEM1(SLJIT_SAVED_REG1), 0, SLJIT_SCRATCH_REG1, 0, SLJIT_SAVED_EREG2, 0);
2639 
2640 	sljit_emit_return(compiler, SLJIT_UNUSED, 0, 0);
2641 
2642 	code.code = sljit_generate_code(compiler);
2643 	CHECK(compiler);
2644 	sljit_free_compiler(compiler);
2645 
2646 	code.func1((sljit_sw)&buf);
2647 	FAILED(buf[0] != 9, "test30 case 1 failed\n");
2648 
2649 	sljit_free_code(code.code);
2650 	successful_tests++;
2651 }
2652 
2653 static void test31(void)
2654 {
2655 	/* Integer mul and set flags. */
2656 	executable_code code;
2657 	struct sljit_compiler* compiler = sljit_create_compiler();
2658 	sljit_sw buf[12];
2659 #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
2660 	sljit_sw big_word = SLJIT_W(0x7fffffff00000000);
2661 	sljit_sw big_word2 = SLJIT_W(0x7fffffff00000012);
2662 #else
2663 	sljit_sw big_word = 0x7fffffff;
2664 	sljit_sw big_word2 = 0x00000012;
2665 #endif
2666 
2667 	if (verbose)
2668 		printf("Run test31\n");
2669 
2670 	buf[0] = 3;
2671 	buf[1] = 3;
2672 	buf[2] = 3;
2673 	buf[3] = 3;
2674 	buf[4] = 3;
2675 	buf[5] = 3;
2676 	buf[6] = 3;
2677 	buf[7] = 3;
2678 	buf[8] = 3;
2679 	buf[9] = 3;
2680 	buf[10] = 3;
2681 	buf[11] = 3;
2682 
2683 	FAILED(!compiler, "cannot create compiler\n");
2684 
2685 	sljit_emit_enter(compiler, 1, 3, 5, 0);
2686 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG2, 0, SLJIT_IMM, 0);
2687 	sljit_emit_op2(compiler, SLJIT_MUL | SLJIT_SET_O, SLJIT_UNUSED, 0, SLJIT_SCRATCH_REG2, 0, SLJIT_IMM, -45);
2688 	cond_set(compiler, SLJIT_MEM1(SLJIT_SAVED_REG1), 0, SLJIT_C_MUL_NOT_OVERFLOW);
2689 	cond_set(compiler, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw), SLJIT_C_MUL_OVERFLOW);
2690 
2691 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SAVED_REG3, 0, SLJIT_IMM, big_word);
2692 	sljit_emit_op2(compiler, SLJIT_MUL | SLJIT_SET_O, SLJIT_SCRATCH_REG3, 0, SLJIT_SAVED_REG3, 0, SLJIT_IMM, -2);
2693 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG2, 0, SLJIT_IMM, 33); /* Should not change flags. */
2694 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG2, 0, SLJIT_IMM, 0); /* Should not change flags. */
2695 	cond_set(compiler, SLJIT_MEM1(SLJIT_SAVED_REG1), 2 * sizeof(sljit_sw), SLJIT_C_MUL_OVERFLOW);
2696 	cond_set(compiler, SLJIT_MEM1(SLJIT_SAVED_REG1), 3 * sizeof(sljit_sw), SLJIT_C_MUL_NOT_OVERFLOW);
2697 
2698 	sljit_emit_op1(compiler, SLJIT_IMOV, SLJIT_SAVED_EREG1, 0, SLJIT_IMM, 0x3f6b0);
2699 	sljit_emit_op1(compiler, SLJIT_IMOV, SLJIT_SAVED_EREG2, 0, SLJIT_IMM, 0x2a783);
2700 	sljit_emit_op2(compiler, SLJIT_IMUL | SLJIT_SET_O, SLJIT_SCRATCH_REG2, 0, SLJIT_SAVED_EREG1, 0, SLJIT_SAVED_EREG2, 0);
2701 	cond_set(compiler, SLJIT_MEM1(SLJIT_SAVED_REG1), 4 * sizeof(sljit_sw), SLJIT_C_MUL_OVERFLOW);
2702 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), 5 * sizeof(sljit_sw), SLJIT_SCRATCH_REG2, 0);
2703 
2704 	sljit_emit_op1(compiler, SLJIT_IMOV, SLJIT_SCRATCH_REG2, 0, SLJIT_IMM, big_word2);
2705 	sljit_emit_op1(compiler, SLJIT_IMOV, SLJIT_SCRATCH_REG3, 0, SLJIT_SCRATCH_REG2, 0);
2706 	sljit_emit_op2(compiler, SLJIT_IMUL | SLJIT_SET_O, SLJIT_SCRATCH_REG2, 0, SLJIT_SCRATCH_REG2, 0, SLJIT_IMM, 23);
2707 	cond_set(compiler, SLJIT_MEM1(SLJIT_SAVED_REG1), 6 * sizeof(sljit_sw), SLJIT_C_MUL_OVERFLOW);
2708 
2709 	sljit_emit_op2(compiler, SLJIT_IMUL | SLJIT_SET_O, SLJIT_UNUSED, 0, SLJIT_SCRATCH_REG3, 0, SLJIT_IMM, -23);
2710 	cond_set(compiler, SLJIT_MEM1(SLJIT_SAVED_REG1), 7 * sizeof(sljit_sw), SLJIT_C_MUL_NOT_OVERFLOW);
2711 	sljit_emit_op2(compiler, SLJIT_MUL | SLJIT_SET_O, SLJIT_UNUSED, 0, SLJIT_SCRATCH_REG3, 0, SLJIT_IMM, -23);
2712 	cond_set(compiler, SLJIT_MEM1(SLJIT_SAVED_REG1), 8 * sizeof(sljit_sw), SLJIT_C_MUL_NOT_OVERFLOW);
2713 
2714 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG2, 0, SLJIT_IMM, 67);
2715 	sljit_emit_op2(compiler, SLJIT_MUL | SLJIT_SET_O, SLJIT_SCRATCH_REG2, 0, SLJIT_SCRATCH_REG2, 0, SLJIT_IMM, -23);
2716 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), 9 * sizeof(sljit_sw), SLJIT_SCRATCH_REG2, 0);
2717 
2718 	sljit_emit_return(compiler, SLJIT_UNUSED, 0, 0);
2719 
2720 	code.code = sljit_generate_code(compiler);
2721 	CHECK(compiler);
2722 	sljit_free_compiler(compiler);
2723 
2724 	code.func1((sljit_sw)&buf);
2725 
2726 	FAILED(buf[0] != 1, "test31 case 1 failed\n");
2727 	FAILED(buf[1] != 2, "test31 case 2 failed\n");
2728 /* Qemu issues for 64 bit muls. */
2729 #if !(defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
2730 	FAILED(buf[2] != 1, "test31 case 3 failed\n");
2731 	FAILED(buf[3] != 2, "test31 case 4 failed\n");
2732 #endif
2733 	FAILED(buf[4] != 1, "test31 case 5 failed\n");
2734 	FAILED((buf[5] & 0xffffffff) != 0x85540c10, "test31 case 6 failed\n");
2735 	FAILED(buf[6] != 2, "test31 case 7 failed\n");
2736 	FAILED(buf[7] != 1, "test31 case 8 failed\n");
2737 #if !(defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
2738 	FAILED(buf[8] != 1, "test31 case 9 failed\n");
2739 #endif
2740 	FAILED(buf[9] != -1541, "test31 case 10 failed\n");
2741 
2742 	sljit_free_code(code.code);
2743 	successful_tests++;
2744 }
2745 
2746 static void test32(void)
2747 {
2748 	/* Floating point set flags. */
2749 	executable_code code;
2750 	struct sljit_compiler* compiler = sljit_create_compiler();
2751 
2752 	sljit_sw buf[16];
2753 	union {
2754 		sljit_d value;
2755 		struct {
2756 			sljit_si value1;
2757 			sljit_si value2;
2758 		} u;
2759 	} dbuf[4];
2760 
2761 	if (verbose)
2762 		printf("Run test32\n");
2763 
2764 	buf[0] = 5;
2765 	buf[1] = 5;
2766 	buf[2] = 5;
2767 	buf[3] = 5;
2768 	buf[4] = 5;
2769 	buf[5] = 5;
2770 	buf[6] = 5;
2771 	buf[7] = 5;
2772 	buf[8] = 5;
2773 	buf[9] = 5;
2774 	buf[10] = 5;
2775 	buf[11] = 5;
2776 	buf[12] = 5;
2777 	buf[13] = 5;
2778 	buf[14] = 5;
2779 	buf[15] = 5;
2780 
2781 	/* Two NaNs */
2782 	dbuf[0].u.value1 = 0x7fffffff;
2783 	dbuf[0].u.value2 = 0x7fffffff;
2784 	dbuf[1].u.value1 = 0x7fffffff;
2785 	dbuf[1].u.value2 = 0x7fffffff;
2786 	dbuf[2].value = -13.0;
2787 	dbuf[3].value = 27.0;
2788 
2789 	if (!sljit_is_fpu_available()) {
2790 		printf("no fpu available, test32 skipped\n");
2791 		successful_tests++;
2792 		if (compiler)
2793 			sljit_free_compiler(compiler);
2794 		return;
2795 	}
2796 
2797 	FAILED(!compiler, "cannot create compiler\n");
2798 	SLJIT_ASSERT(sizeof(sljit_d) == 8 && sizeof(sljit_si) == 4 && sizeof(dbuf[0]) == 8);
2799 
2800 	sljit_emit_enter(compiler, 2, 1, 2, 0);
2801 
2802 	sljit_emit_fop1(compiler, SLJIT_MOVD, SLJIT_FLOAT_REG1, 0, SLJIT_MEM1(SLJIT_SAVED_REG2), 0);
2803 	sljit_emit_fop1(compiler, SLJIT_CMPD | SLJIT_SET_E, SLJIT_MEM1(SLJIT_SAVED_REG2), 3 * sizeof(sljit_d), SLJIT_FLOAT_REG1, 0);
2804 	sljit_emit_fop1(compiler, SLJIT_MOVD, SLJIT_FLOAT_REG2, 0, SLJIT_MEM1(SLJIT_SAVED_REG2), 2 * sizeof(sljit_d));
2805 	cond_set(compiler, SLJIT_MEM1(SLJIT_SAVED_REG1), 0, SLJIT_C_FLOAT_UNORDERED);
2806 	cond_set(compiler, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw), SLJIT_C_FLOAT_ORDERED);
2807 
2808 	sljit_emit_fop1(compiler, SLJIT_MOVD, SLJIT_FLOAT_REG3, 0, SLJIT_MEM1(SLJIT_SAVED_REG2), 3 * sizeof(sljit_d));
2809 	sljit_emit_fop1(compiler, SLJIT_CMPD | SLJIT_SET_E | SLJIT_SET_S, SLJIT_FLOAT_REG2, 0, SLJIT_FLOAT_REG3, 0);
2810 	cond_set(compiler, SLJIT_MEM1(SLJIT_SAVED_REG1), 2 * sizeof(sljit_sw), SLJIT_C_FLOAT_UNORDERED);
2811 	cond_set(compiler, SLJIT_MEM1(SLJIT_SAVED_REG1), 3 * sizeof(sljit_sw), SLJIT_C_FLOAT_ORDERED);
2812 	cond_set(compiler, SLJIT_MEM1(SLJIT_SAVED_REG1), 4 * sizeof(sljit_sw), SLJIT_C_FLOAT_LESS);
2813 	cond_set(compiler, SLJIT_MEM1(SLJIT_SAVED_REG1), 5 * sizeof(sljit_sw), SLJIT_C_FLOAT_GREATER_EQUAL);
2814 	cond_set(compiler, SLJIT_MEM1(SLJIT_SAVED_REG1), 6 * sizeof(sljit_sw), SLJIT_C_FLOAT_GREATER);
2815 	cond_set(compiler, SLJIT_MEM1(SLJIT_SAVED_REG1), 7 * sizeof(sljit_sw), SLJIT_C_FLOAT_LESS_EQUAL);
2816 	cond_set(compiler, SLJIT_MEM1(SLJIT_SAVED_REG1), 8 * sizeof(sljit_sw), SLJIT_C_FLOAT_EQUAL);
2817 	cond_set(compiler, SLJIT_MEM1(SLJIT_SAVED_REG1), 9 * sizeof(sljit_sw), SLJIT_C_FLOAT_NOT_EQUAL);
2818 
2819 	sljit_emit_fop1(compiler, SLJIT_CMPD | SLJIT_SET_E, SLJIT_FLOAT_REG3, 0, SLJIT_MEM1(SLJIT_SAVED_REG2), 3 * sizeof(sljit_d));
2820 	sljit_emit_fop2(compiler, SLJIT_ADDD, SLJIT_FLOAT_REG4, 0, SLJIT_FLOAT_REG2, 0, SLJIT_MEM1(SLJIT_SAVED_REG2), sizeof(sljit_d));
2821 	cond_set(compiler, SLJIT_MEM1(SLJIT_SAVED_REG1), 10 * sizeof(sljit_sw), SLJIT_C_FLOAT_UNORDERED);
2822 	cond_set(compiler, SLJIT_MEM1(SLJIT_SAVED_REG1), 11 * sizeof(sljit_sw), SLJIT_C_FLOAT_EQUAL);
2823 
2824 	sljit_emit_fop1(compiler, SLJIT_CMPD | SLJIT_SET_S, SLJIT_MEM1(SLJIT_SAVED_REG2), sizeof(sljit_d), SLJIT_FLOAT_REG1, 0);
2825 	cond_set(compiler, SLJIT_MEM1(SLJIT_SAVED_REG1), 12 * sizeof(sljit_sw), SLJIT_C_FLOAT_ORDERED);
2826 
2827 	sljit_emit_fop1(compiler, SLJIT_CMPD | SLJIT_SET_S, SLJIT_FLOAT_REG4, 0, SLJIT_FLOAT_REG3, 0);
2828 	sljit_emit_op1(compiler, SLJIT_MOV_UB, SLJIT_SCRATCH_REG1, 0, SLJIT_MEM1(SLJIT_SAVED_REG2), 0);
2829 	cond_set(compiler, SLJIT_MEM1(SLJIT_SAVED_REG1), 13 * sizeof(sljit_sw), SLJIT_C_FLOAT_UNORDERED);
2830 
2831 	sljit_emit_return(compiler, SLJIT_UNUSED, 0, 0);
2832 
2833 	code.code = sljit_generate_code(compiler);
2834 	CHECK(compiler);
2835 	sljit_free_compiler(compiler);
2836 
2837 	code.func2((sljit_sw)&buf, (sljit_sw)&dbuf);
2838 
2839 	FAILED(buf[0] != 1, "test32 case 1 failed\n");
2840 	FAILED(buf[1] != 2, "test32 case 2 failed\n");
2841 	FAILED(buf[2] != 2, "test32 case 3 failed\n");
2842 	FAILED(buf[3] != 1, "test32 case 4 failed\n");
2843 	FAILED(buf[4] != 1, "test32 case 5 failed\n");
2844 	FAILED(buf[5] != 2, "test32 case 6 failed\n");
2845 	FAILED(buf[6] != 2, "test32 case 7 failed\n");
2846 	FAILED(buf[7] != 1, "test32 case 8 failed\n");
2847 	FAILED(buf[8] != 2, "test32 case 9 failed\n");
2848 	FAILED(buf[9] != 1, "test32 case 10 failed\n");
2849 	FAILED(buf[10] != 2, "test32 case 11 failed\n");
2850 	FAILED(buf[11] != 1, "test32 case 12 failed\n");
2851 	FAILED(buf[12] != 2, "test32 case 13 failed\n");
2852 	FAILED(buf[13] != 1, "test32 case 14 failed\n");
2853 
2854 	sljit_free_code(code.code);
2855 	successful_tests++;
2856 }
2857 
2858 static void test33(void)
2859 {
2860 	/* Test keep flags. */
2861 	executable_code code;
2862 	struct sljit_compiler* compiler = sljit_create_compiler();
2863 	sljit_sw buf[7];
2864 #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
2865 	sljit_sw big_word = SLJIT_W(0x8000000000000003);
2866 #else
2867 	sljit_sw big_word = 0x80000003;
2868 #endif
2869 
2870 	if (verbose)
2871 		printf("Run test33\n");
2872 
2873 	buf[0] = 3;
2874 	buf[1] = 3;
2875 	buf[2] = 3;
2876 	buf[3] = 3;
2877 	buf[4] = 3;
2878 	buf[5] = 3;
2879 	buf[6] = 3;
2880 
2881 	FAILED(!compiler, "cannot create compiler\n");
2882 
2883 	sljit_emit_enter(compiler, 1, 3, 3, 0);
2884 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, big_word);
2885 	sljit_emit_op2(compiler, SLJIT_ADD | SLJIT_SET_E | SLJIT_SET_C, SLJIT_SCRATCH_REG2, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, big_word);
2886 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), 0, SLJIT_SCRATCH_REG2, 0);
2887 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 8);
2888 	sljit_emit_op2(compiler, SLJIT_SUB | SLJIT_KEEP_FLAGS, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 8);
2889 	sljit_emit_op_flags(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw), SLJIT_UNUSED, 0, SLJIT_C_NOT_ZERO);
2890 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 0);
2891 	sljit_emit_op2(compiler, SLJIT_ADDC | SLJIT_KEEP_FLAGS, SLJIT_SCRATCH_REG2, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 0);
2892 	sljit_emit_op2(compiler, SLJIT_ADDC, SLJIT_MEM1(SLJIT_SAVED_REG1), 2 * sizeof(sljit_sw), SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 7);
2893 
2894 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 8);
2895 	sljit_emit_op2(compiler, SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 8);
2896 	sljit_emit_op2(compiler, SLJIT_SHL | SLJIT_KEEP_FLAGS, SLJIT_MEM1(SLJIT_SAVED_REG1), 3 * sizeof(sljit_sw), SLJIT_MEM1(SLJIT_SAVED_REG1), 2 * sizeof(sljit_sw), SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw));
2897 	sljit_emit_op_flags(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), 4 * sizeof(sljit_sw), SLJIT_UNUSED, 0, SLJIT_C_EQUAL);
2898 
2899 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), 5 * sizeof(sljit_sw), SLJIT_IMM, 0x124);
2900 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 2);
2901 	sljit_emit_op2(compiler, SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 1);
2902 	sljit_emit_op2(compiler, SLJIT_SUB | SLJIT_KEEP_FLAGS, SLJIT_UNUSED, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG1, 0);
2903 	sljit_emit_op_flags(compiler, SLJIT_OR, SLJIT_MEM1(SLJIT_SAVED_REG1), 5 * sizeof(sljit_sw), SLJIT_MEM1(SLJIT_SAVED_REG1), 5 * sizeof(sljit_sw), SLJIT_C_NOT_EQUAL);
2904 
2905 	/* PowerPC specific test. */
2906 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, -1);
2907 	sljit_emit_op2(compiler, SLJIT_ADD | SLJIT_SET_C, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 2);
2908 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 0x80);
2909 	sljit_emit_op2(compiler, SLJIT_ASHR | SLJIT_KEEP_FLAGS, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 1);
2910 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG2, 0, SLJIT_IMM, 0);
2911 	sljit_emit_op2(compiler, SLJIT_ADDC, SLJIT_MEM1(SLJIT_SAVED_REG1), 6 * sizeof(sljit_sw), SLJIT_SCRATCH_REG2, 0, SLJIT_IMM, 0);
2912 
2913 	sljit_emit_return(compiler, SLJIT_UNUSED, 0, 0);
2914 
2915 	code.code = sljit_generate_code(compiler);
2916 	CHECK(compiler);
2917 	sljit_free_compiler(compiler);
2918 
2919 	code.func1((sljit_sw)&buf);
2920 
2921 	FAILED(buf[0] != 6, "test33 case 1 failed\n");
2922 	FAILED(buf[1] != 1, "test33 case 2 failed\n");
2923 	FAILED(buf[2] != 8, "test33 case 3 failed\n");
2924 	FAILED(buf[3] != 16, "test33 case 4 failed\n");
2925 	FAILED(buf[4] != 1, "test33 case 5 failed\n");
2926 	FAILED(buf[5] != 0x125, "test33 case 6 failed\n");
2927 	FAILED(buf[6] != 1, "test33 case 7 failed\n");
2928 
2929 	sljit_free_code(code.code);
2930 	successful_tests++;
2931 }
2932 
2933 static void test34(void)
2934 {
2935 	/* Test fast calls. */
2936 	executable_code codeA;
2937 	executable_code codeB;
2938 	executable_code codeC;
2939 	executable_code codeD;
2940 	executable_code codeE;
2941 	executable_code codeF;
2942 	struct sljit_compiler* compiler;
2943 	struct sljit_jump *jump;
2944 	struct sljit_label* label;
2945 	sljit_uw addr;
2946 	sljit_p buf[2];
2947 
2948 	if (verbose)
2949 		printf("Run test34\n");
2950 
2951 	buf[0] = 0;
2952 	buf[1] = 0;
2953 
2954 	/* A */
2955 	compiler = sljit_create_compiler();
2956 	FAILED(!compiler, "cannot create compiler\n");
2957 	sljit_set_context(compiler, 1, 5, 5, 2 * sizeof(sljit_p));
2958 
2959 	sljit_emit_fast_enter(compiler, SLJIT_SCRATCH_REG2, 0);
2960 	sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 4);
2961 	sljit_emit_fast_return(compiler, SLJIT_SCRATCH_REG2, 0);
2962 
2963 	codeA.code = sljit_generate_code(compiler);
2964 	CHECK(compiler);
2965 	sljit_free_compiler(compiler);
2966 
2967 	/* B */
2968 	compiler = sljit_create_compiler();
2969 	FAILED(!compiler, "cannot create compiler\n");
2970 	sljit_set_context(compiler, 1, 5, 5, 2 * sizeof(sljit_p));
2971 
2972 	sljit_emit_fast_enter(compiler, SLJIT_TEMPORARY_EREG2, 0);
2973 	sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 6);
2974 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG2, 0, SLJIT_IMM, SLJIT_FUNC_OFFSET(codeA.code));
2975 	sljit_emit_ijump(compiler, SLJIT_FAST_CALL, SLJIT_SCRATCH_REG2, 0);
2976 	sljit_emit_fast_return(compiler, SLJIT_TEMPORARY_EREG2, 0);
2977 
2978 	codeB.code = sljit_generate_code(compiler);
2979 	CHECK(compiler);
2980 	sljit_free_compiler(compiler);
2981 
2982 	/* C */
2983 	compiler = sljit_create_compiler();
2984 	FAILED(!compiler, "cannot create compiler\n");
2985 	sljit_set_context(compiler, 1, 5, 5, 2 * sizeof(sljit_p));
2986 
2987 	sljit_emit_fast_enter(compiler, SLJIT_MEM1(SLJIT_LOCALS_REG), sizeof(sljit_p));
2988 	sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 8);
2989 	jump = sljit_emit_jump(compiler, SLJIT_REWRITABLE_JUMP | SLJIT_FAST_CALL);
2990 	sljit_set_target(jump, SLJIT_FUNC_OFFSET(codeB.code));
2991 	sljit_emit_fast_return(compiler, SLJIT_MEM1(SLJIT_LOCALS_REG), sizeof(sljit_p));
2992 
2993 	codeC.code = sljit_generate_code(compiler);
2994 	CHECK(compiler);
2995 	sljit_free_compiler(compiler);
2996 
2997 	/* D */
2998 	compiler = sljit_create_compiler();
2999 	FAILED(!compiler, "cannot create compiler\n");
3000 	sljit_set_context(compiler, 1, 5, 5, 2 * sizeof(sljit_p));
3001 
3002 	sljit_emit_fast_enter(compiler, SLJIT_MEM1(SLJIT_LOCALS_REG), 0);
3003 	sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 10);
3004 	sljit_emit_ijump(compiler, SLJIT_FAST_CALL, SLJIT_IMM, SLJIT_FUNC_OFFSET(codeC.code));
3005 	sljit_emit_fast_return(compiler, SLJIT_MEM1(SLJIT_LOCALS_REG), 0);
3006 
3007 	codeD.code = sljit_generate_code(compiler);
3008 	CHECK(compiler);
3009 	sljit_free_compiler(compiler);
3010 
3011 	/* E */
3012 	compiler = sljit_create_compiler();
3013 	FAILED(!compiler, "cannot create compiler\n");
3014 	sljit_set_context(compiler, 1, 5, 5, 2 * sizeof(sljit_p));
3015 
3016 	sljit_emit_fast_enter(compiler, SLJIT_MEM1(SLJIT_SAVED_REG1), 0);
3017 	sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 12);
3018 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_p), SLJIT_IMM, SLJIT_FUNC_OFFSET(codeD.code));
3019 	sljit_emit_ijump(compiler, SLJIT_FAST_CALL, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_p));
3020 	sljit_emit_fast_return(compiler, SLJIT_MEM1(SLJIT_SAVED_REG1), 0);
3021 
3022 	codeE.code = sljit_generate_code(compiler);
3023 	CHECK(compiler);
3024 	sljit_free_compiler(compiler);
3025 
3026 	/* F */
3027 	compiler = sljit_create_compiler();
3028 	FAILED(!compiler, "cannot create compiler\n");
3029 
3030 	sljit_emit_enter(compiler, 1, 5, 5, 2 * sizeof(sljit_p));
3031 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 0);
3032 	sljit_emit_ijump(compiler, SLJIT_FAST_CALL, SLJIT_IMM, SLJIT_FUNC_OFFSET(codeE.code));
3033 	label = sljit_emit_label(compiler);
3034 	sljit_emit_return(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0);
3035 
3036 	codeF.code = sljit_generate_code(compiler);
3037 	CHECK(compiler);
3038 	addr = sljit_get_label_addr(label);
3039 	sljit_free_compiler(compiler);
3040 
3041 	FAILED(codeF.func1((sljit_sw)&buf) != 40, "test34 case 1 failed\n");
3042 	FAILED(buf[0] != addr - SLJIT_RETURN_ADDRESS_OFFSET, "test34 case 2 failed\n");
3043 
3044 	sljit_free_code(codeA.code);
3045 	sljit_free_code(codeB.code);
3046 	sljit_free_code(codeC.code);
3047 	sljit_free_code(codeD.code);
3048 	sljit_free_code(codeE.code);
3049 	sljit_free_code(codeF.code);
3050 	successful_tests++;
3051 }
3052 
3053 static void test35(void)
3054 {
3055 	/* More complicated tests for fast calls. */
3056 	executable_code codeA;
3057 	executable_code codeB;
3058 	executable_code codeC;
3059 	struct sljit_compiler* compiler;
3060 	struct sljit_jump *jump;
3061 	struct sljit_label* label;
3062 	sljit_uw return_addr, jump_addr;
3063 	sljit_p buf[1];
3064 
3065 	if (verbose)
3066 		printf("Run test35\n");
3067 
3068 	buf[0] = 0;
3069 
3070 	/* A */
3071 	compiler = sljit_create_compiler();
3072 	FAILED(!compiler, "cannot create compiler\n");
3073 	sljit_set_context(compiler, 0, 2, 2, 0);
3074 
3075 	sljit_emit_fast_enter(compiler, SLJIT_MEM0(), (sljit_sw)&buf[0]);
3076 	sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 5);
3077 	jump = sljit_emit_jump(compiler, SLJIT_REWRITABLE_JUMP | SLJIT_FAST_CALL);
3078 	sljit_set_target(jump, 0);
3079 	label = sljit_emit_label(compiler);
3080 	sljit_emit_fast_return(compiler, SLJIT_MEM0(), (sljit_sw)&buf[0]);
3081 
3082 	codeA.code = sljit_generate_code(compiler);
3083 	CHECK(compiler);
3084 	return_addr = sljit_get_label_addr(label) - SLJIT_RETURN_ADDRESS_OFFSET;
3085 	jump_addr = sljit_get_jump_addr(jump);
3086 	sljit_free_compiler(compiler);
3087 
3088 	/* B */
3089 	compiler = sljit_create_compiler();
3090 	FAILED(!compiler, "cannot create compiler\n");
3091 	sljit_set_context(compiler, 0, 2, 2, 0);
3092 
3093 	sljit_emit_fast_enter(compiler, SLJIT_UNUSED, 0);
3094 	sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 7);
3095 	sljit_emit_fast_return(compiler, SLJIT_IMM, return_addr);
3096 
3097 	codeB.code = sljit_generate_code(compiler);
3098 	CHECK(compiler);
3099 	sljit_free_compiler(compiler);
3100 	sljit_set_jump_addr(jump_addr, SLJIT_FUNC_OFFSET(codeB.code));
3101 
3102 	/* C */
3103 	compiler = sljit_create_compiler();
3104 	FAILED(!compiler, "cannot create compiler\n");
3105 
3106 	sljit_emit_enter(compiler, 0, 2, 2, 0);
3107 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 0);
3108 	sljit_emit_ijump(compiler, SLJIT_FAST_CALL, SLJIT_IMM, SLJIT_FUNC_OFFSET(codeA.code));
3109 	label = sljit_emit_label(compiler);
3110 	sljit_emit_return(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0);
3111 
3112 	codeC.code = sljit_generate_code(compiler);
3113 	CHECK(compiler);
3114 	return_addr = sljit_get_label_addr(label);
3115 	sljit_free_compiler(compiler);
3116 
3117 	FAILED(codeC.func0() != 12, "test35 case 1 failed\n");
3118 	FAILED(buf[0] != return_addr - SLJIT_RETURN_ADDRESS_OFFSET, "test35 case 2 failed\n");
3119 
3120 	sljit_free_code(codeA.code);
3121 	sljit_free_code(codeB.code);
3122 	sljit_free_code(codeC.code);
3123 	successful_tests++;
3124 }
3125 
3126 static sljit_si cmp_test(struct sljit_compiler *compiler, sljit_si type, sljit_si src1, sljit_sw src1w, sljit_si src2, sljit_sw src2w)
3127 {
3128 	/* 2 = true, 1 = false */
3129 	struct sljit_jump* jump;
3130 	struct sljit_label* label;
3131 
3132 	if (sljit_emit_op1(compiler, SLJIT_MOVU_UB, SLJIT_MEM1(SLJIT_SAVED_REG1), 1, SLJIT_IMM, 2))
3133 		return compiler->error;
3134 	jump = sljit_emit_cmp(compiler, type, src1, src1w, src2, src2w);
3135 	if (!jump)
3136 		return compiler->error;
3137 	if (sljit_emit_op1(compiler, SLJIT_MOV_UB, SLJIT_MEM1(SLJIT_SAVED_REG1), 0, SLJIT_IMM, 1))
3138 		return compiler->error;
3139 	label = sljit_emit_label(compiler);
3140 	if (!label)
3141 		return compiler->error;
3142 	sljit_set_label(jump, label);
3143 	return SLJIT_SUCCESS;
3144 }
3145 
3146 #define TEST_CASES	(7 + 10 + 12 + 11 + 4)
3147 static void test36(void)
3148 {
3149 	/* Compare instruction. */
3150 	executable_code code;
3151 	struct sljit_compiler* compiler = sljit_create_compiler();
3152 
3153 	sljit_sb buf[TEST_CASES];
3154 	sljit_sb compare_buf[TEST_CASES] = {
3155 		1, 1, 2, 2, 1, 2, 2,
3156 		1, 1, 2, 2, 2, 1, 2, 2, 1, 1,
3157 		2, 2, 2, 1, 2, 2, 2, 2, 1, 1, 2, 2,
3158 		2, 1, 2, 1, 1, 1, 2, 1, 2, 1, 2,
3159 		2, 1, 1, 2
3160 	};
3161 	sljit_sw data[4];
3162 	sljit_si i;
3163 
3164 	if (verbose)
3165 		printf("Run test36\n");
3166 
3167 	FAILED(!compiler, "cannot create compiler\n");
3168 	for (i = 0; i < TEST_CASES; ++i)
3169 		buf[i] = 100;
3170 	data[0] = 32;
3171 	data[1] = -9;
3172 	data[2] = 43;
3173 	data[3] = -13;
3174 
3175 	sljit_emit_enter(compiler, 2, 3, 2, 0);
3176 	sljit_emit_op2(compiler, SLJIT_SUB, SLJIT_SAVED_REG1, 0, SLJIT_SAVED_REG1, 0, SLJIT_IMM, 1);
3177 
3178 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 13);
3179 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG2, 0, SLJIT_IMM, 15);
3180 	cmp_test(compiler, SLJIT_C_EQUAL, SLJIT_IMM, 9, SLJIT_SCRATCH_REG1, 0);
3181 	cmp_test(compiler, SLJIT_C_EQUAL, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG2, 0);
3182 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 3);
3183 	cmp_test(compiler, SLJIT_C_EQUAL, SLJIT_MEM2(SLJIT_SAVED_REG2, SLJIT_SCRATCH_REG1), SLJIT_WORD_SHIFT, SLJIT_IMM, -13);
3184 	cmp_test(compiler, SLJIT_C_NOT_EQUAL, SLJIT_IMM, 0, SLJIT_SCRATCH_REG1, 0);
3185 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 0);
3186 	cmp_test(compiler, SLJIT_C_NOT_EQUAL | SLJIT_REWRITABLE_JUMP, SLJIT_IMM, 0, SLJIT_SCRATCH_REG1, 0);
3187 	cmp_test(compiler, SLJIT_C_EQUAL, SLJIT_MEM2(SLJIT_SAVED_REG2, SLJIT_SCRATCH_REG1), SLJIT_WORD_SHIFT, SLJIT_MEM2(SLJIT_SAVED_REG2, SLJIT_SCRATCH_REG1), SLJIT_WORD_SHIFT);
3188 	cmp_test(compiler, SLJIT_C_EQUAL | SLJIT_REWRITABLE_JUMP, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 0);
3189 
3190 	cmp_test(compiler, SLJIT_C_SIG_LESS, SLJIT_MEM1(SLJIT_SAVED_REG2), 0, SLJIT_IMM, 0);
3191 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, -8);
3192 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG2, 0, SLJIT_IMM, 0);
3193 	cmp_test(compiler, SLJIT_C_SIG_GREATER, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 0);
3194 	cmp_test(compiler, SLJIT_C_SIG_LESS_EQUAL, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 0);
3195 	cmp_test(compiler, SLJIT_C_SIG_LESS | SLJIT_REWRITABLE_JUMP, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 0);
3196 	cmp_test(compiler, SLJIT_C_SIG_GREATER_EQUAL, SLJIT_SCRATCH_REG2, 0, SLJIT_IMM, 0);
3197 	cmp_test(compiler, SLJIT_C_SIG_GREATER, SLJIT_IMM, 0, SLJIT_MEM1(SLJIT_SAVED_REG2), 2 * sizeof(sljit_sw));
3198 	cmp_test(compiler, SLJIT_C_SIG_LESS_EQUAL, SLJIT_IMM, 0, SLJIT_SCRATCH_REG2, 0);
3199 	cmp_test(compiler, SLJIT_C_SIG_LESS, SLJIT_IMM, 0, SLJIT_MEM1(SLJIT_SAVED_REG2), 2 * sizeof(sljit_sw));
3200 	cmp_test(compiler, SLJIT_C_SIG_LESS, SLJIT_IMM, 0, SLJIT_MEM1(SLJIT_SAVED_REG2), 3 * sizeof(sljit_sw));
3201 	cmp_test(compiler, SLJIT_C_SIG_LESS | SLJIT_REWRITABLE_JUMP, SLJIT_IMM, 0, SLJIT_MEM1(SLJIT_SAVED_REG2), 3 * sizeof(sljit_sw));
3202 
3203 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 8);
3204 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG2, 0, SLJIT_IMM, 0);
3205 	cmp_test(compiler, SLJIT_C_LESS, SLJIT_SCRATCH_REG1, 0, SLJIT_MEM1(SLJIT_SAVED_REG2), sizeof(sljit_sw));
3206 	cmp_test(compiler, SLJIT_C_GREATER_EQUAL, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 8);
3207 	cmp_test(compiler, SLJIT_C_LESS, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, -10);
3208 	cmp_test(compiler, SLJIT_C_LESS, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 8);
3209 	cmp_test(compiler, SLJIT_C_GREATER_EQUAL, SLJIT_IMM, 8, SLJIT_SCRATCH_REG2, 0);
3210 	cmp_test(compiler, SLJIT_C_GREATER_EQUAL | SLJIT_REWRITABLE_JUMP, SLJIT_IMM, 8, SLJIT_SCRATCH_REG2, 0);
3211 	cmp_test(compiler, SLJIT_C_GREATER, SLJIT_IMM, 8, SLJIT_SCRATCH_REG2, 0);
3212 	cmp_test(compiler, SLJIT_C_LESS_EQUAL, SLJIT_IMM, 7, SLJIT_SCRATCH_REG1, 0);
3213 	cmp_test(compiler, SLJIT_C_GREATER, SLJIT_IMM, 1, SLJIT_MEM1(SLJIT_SAVED_REG2), 3 * sizeof(sljit_sw));
3214 	cmp_test(compiler, SLJIT_C_LESS_EQUAL, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG2, 0);
3215 	cmp_test(compiler, SLJIT_C_GREATER, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG2, 0);
3216 	cmp_test(compiler, SLJIT_C_GREATER | SLJIT_REWRITABLE_JUMP, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG2, 0);
3217 
3218 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, -3);
3219 	cmp_test(compiler, SLJIT_C_SIG_LESS, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG2, 0);
3220 	cmp_test(compiler, SLJIT_C_SIG_GREATER_EQUAL, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG2, 0);
3221 	cmp_test(compiler, SLJIT_C_SIG_LESS, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, -1);
3222 	cmp_test(compiler, SLJIT_C_SIG_GREATER_EQUAL, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 1);
3223 	cmp_test(compiler, SLJIT_C_SIG_LESS, SLJIT_MEM1(SLJIT_SAVED_REG2), 0, SLJIT_IMM, -1);
3224 	cmp_test(compiler, SLJIT_C_SIG_LESS | SLJIT_REWRITABLE_JUMP, SLJIT_MEM1(SLJIT_SAVED_REG2), 0, SLJIT_IMM, -1);
3225 	cmp_test(compiler, SLJIT_C_SIG_LESS_EQUAL, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG2, 0);
3226 	cmp_test(compiler, SLJIT_C_SIG_GREATER, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG2, 0);
3227 	cmp_test(compiler, SLJIT_C_SIG_LESS_EQUAL, SLJIT_IMM, -4, SLJIT_SCRATCH_REG1, 0);
3228 	cmp_test(compiler, SLJIT_C_SIG_GREATER, SLJIT_IMM, -1, SLJIT_SCRATCH_REG2, 0);
3229 	cmp_test(compiler, SLJIT_C_SIG_GREATER | SLJIT_REWRITABLE_JUMP, SLJIT_SCRATCH_REG2, 0, SLJIT_IMM, -1);
3230 
3231 #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
3232 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, SLJIT_W(0xf00000004));
3233 	sljit_emit_op1(compiler, SLJIT_IMOV, SLJIT_SCRATCH_REG2, 0, SLJIT_SCRATCH_REG1, 0);
3234 	cmp_test(compiler, SLJIT_C_LESS | SLJIT_INT_OP, SLJIT_SCRATCH_REG2, 0, SLJIT_IMM, 5);
3235 	cmp_test(compiler, SLJIT_C_LESS, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 5);
3236 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, SLJIT_W(0xff0000004));
3237 	sljit_emit_op1(compiler, SLJIT_IMOV, SLJIT_SCRATCH_REG2, 0, SLJIT_SCRATCH_REG1, 0);
3238 	cmp_test(compiler, SLJIT_C_SIG_GREATER | SLJIT_INT_OP, SLJIT_SCRATCH_REG2, 0, SLJIT_IMM, 5);
3239 	cmp_test(compiler, SLJIT_C_SIG_GREATER, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 5);
3240 #else
3241 	sljit_emit_op1(compiler, SLJIT_IMOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 4);
3242 	cmp_test(compiler, SLJIT_C_LESS | SLJIT_INT_OP, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 5);
3243 	cmp_test(compiler, SLJIT_C_GREATER | SLJIT_INT_OP, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 5);
3244 	sljit_emit_op1(compiler, SLJIT_IMOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 0xf0000004);
3245 	cmp_test(compiler, SLJIT_C_SIG_GREATER | SLJIT_INT_OP, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 5);
3246 	cmp_test(compiler, SLJIT_C_SIG_LESS | SLJIT_INT_OP, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 5);
3247 #endif
3248 
3249 	sljit_emit_return(compiler, SLJIT_UNUSED, 0, 0);
3250 
3251 	code.code = sljit_generate_code(compiler);
3252 	CHECK(compiler);
3253 	sljit_free_compiler(compiler);
3254 
3255 	code.func2((sljit_sw)&buf, (sljit_sw)&data);
3256 
3257 	for (i = 0; i < TEST_CASES; ++i)
3258 		if (SLJIT_UNLIKELY(buf[i] != compare_buf[i])) {
3259 			printf("test36 case %d failed\n", i + 1);
3260 			return;
3261 		}
3262 
3263 	sljit_free_code(code.code);
3264 	successful_tests++;
3265 }
3266 #undef TEST_CASES
3267 
3268 #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
3269 #define BITN(n) (SLJIT_W(1) << (63 - (n)))
3270 #define RESN(n) (n)
3271 #else
3272 #define BITN(n) (1 << (31 - ((n) & 0x1f)))
3273 #define RESN(n) ((n) & 0x1f)
3274 #endif
3275 
3276 static void test37(void)
3277 {
3278 	/* Test count leading zeroes. */
3279 	executable_code code;
3280 	struct sljit_compiler* compiler = sljit_create_compiler();
3281 	sljit_sw buf[15];
3282 	sljit_si ibuf[2];
3283 	sljit_si i;
3284 
3285 	if (verbose)
3286 		printf("Run test37\n");
3287 
3288 	FAILED(!compiler, "cannot create compiler\n");
3289 
3290 	for (i = 0; i < 15; i++)
3291 		buf[i] = -1;
3292 	buf[3] = 0;
3293 	buf[7] = BITN(13);
3294 	ibuf[0] = -1;
3295 	ibuf[1] = -1;
3296 	sljit_emit_enter(compiler, 2, 1, 2, 0);
3297 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, BITN(27));
3298 	sljit_emit_op1(compiler, SLJIT_CLZ, SLJIT_MEM1(SLJIT_SAVED_REG1), 0, SLJIT_SCRATCH_REG1, 0);
3299 	sljit_emit_op1(compiler, SLJIT_CLZ | SLJIT_SET_E, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, BITN(47));
3300 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw), SLJIT_SCRATCH_REG1, 0);
3301 	sljit_emit_op_flags(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), 2 * sizeof(sljit_sw), SLJIT_UNUSED, 0, SLJIT_C_ZERO);
3302 	sljit_emit_op1(compiler, SLJIT_CLZ, SLJIT_MEM1(SLJIT_SAVED_REG1), 3 * sizeof(sljit_sw), SLJIT_MEM1(SLJIT_SAVED_REG1), 3 * sizeof(sljit_sw));
3303 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, -1);
3304 	sljit_emit_op1(compiler, SLJIT_CLZ | SLJIT_SET_E, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG1, 0);
3305 	sljit_emit_op_flags(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), 4 * sizeof(sljit_sw), SLJIT_UNUSED, 0, SLJIT_C_ZERO);
3306 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), 5 * sizeof(sljit_sw), SLJIT_SCRATCH_REG1, 0);
3307 	sljit_emit_op1(compiler, SLJIT_IMOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 0);
3308 	sljit_emit_op1(compiler, SLJIT_ICLZ, SLJIT_MEM1(SLJIT_SAVED_REG2), 0, SLJIT_SCRATCH_REG1, 0);
3309 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, -1);
3310 	sljit_emit_op1(compiler, SLJIT_CLZ | SLJIT_SET_E, SLJIT_UNUSED, 0, SLJIT_SCRATCH_REG1, 0);
3311 	sljit_emit_op_flags(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), 6 * sizeof(sljit_sw), SLJIT_UNUSED, 0, SLJIT_C_ZERO);
3312 	sljit_emit_op1(compiler, SLJIT_CLZ | SLJIT_KEEP_FLAGS, SLJIT_SCRATCH_REG1, 0, SLJIT_MEM1(SLJIT_SAVED_REG1), 7 * sizeof(sljit_sw));
3313 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), 7 * sizeof(sljit_sw), SLJIT_SCRATCH_REG1, 0);
3314 	sljit_emit_op_flags(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), 8 * sizeof(sljit_sw), SLJIT_UNUSED, 0, SLJIT_C_NOT_ZERO);
3315 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, BITN(58));
3316 	sljit_emit_op1(compiler, SLJIT_CLZ, SLJIT_MEM1(SLJIT_SAVED_REG1), 9 * sizeof(sljit_sw), SLJIT_SCRATCH_REG1, 0);
3317 	sljit_emit_op1(compiler, SLJIT_CLZ | SLJIT_SET_E, SLJIT_UNUSED, 0, SLJIT_MEM1(SLJIT_SAVED_REG1), 10 * sizeof(sljit_sw));
3318 	sljit_emit_op_flags(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), 10 * sizeof(sljit_sw), SLJIT_UNUSED, 0, SLJIT_C_NOT_ZERO);
3319 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 0);
3320 	sljit_emit_op1(compiler, SLJIT_CLZ, SLJIT_MEM1(SLJIT_SAVED_REG1), 11 * sizeof(sljit_sw), SLJIT_SCRATCH_REG1, 0);
3321 #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
3322 	sljit_emit_op1(compiler, SLJIT_IMOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, SLJIT_W(0xff08a00000));
3323 #else
3324 	sljit_emit_op1(compiler, SLJIT_IMOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 0x08a00000);
3325 #endif
3326 	sljit_emit_op1(compiler, SLJIT_ICLZ, SLJIT_MEM1(SLJIT_SAVED_REG2), sizeof(sljit_si), SLJIT_SCRATCH_REG1, 0);
3327 	sljit_emit_op1(compiler, SLJIT_ICLZ, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG1, 0);
3328 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), 12 * sizeof(sljit_sw), SLJIT_SCRATCH_REG1, 0);
3329 #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
3330 	sljit_emit_op1(compiler, SLJIT_IMOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, SLJIT_W(0xffc8a00000));
3331 #else
3332 	sljit_emit_op1(compiler, SLJIT_IMOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 0xc8a00000);
3333 #endif
3334 	sljit_emit_op1(compiler, SLJIT_ICLZ | SLJIT_SET_E, SLJIT_UNUSED, 0, SLJIT_SCRATCH_REG1, 0);
3335 	sljit_emit_op_flags(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), 13 * sizeof(sljit_sw), SLJIT_UNUSED, 0, SLJIT_C_ZERO);
3336 	sljit_emit_op1(compiler, SLJIT_ICLZ | SLJIT_SET_E, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG1, 0);
3337 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), 14 * sizeof(sljit_sw), SLJIT_SCRATCH_REG1, 0);
3338 
3339 	sljit_emit_return(compiler, SLJIT_UNUSED, 0, 0);
3340 
3341 	code.code = sljit_generate_code(compiler);
3342 	CHECK(compiler);
3343 	sljit_free_compiler(compiler);
3344 
3345 	code.func2((sljit_sw)&buf, (sljit_sw)&ibuf);
3346 	FAILED(buf[0] != RESN(27), "test37 case 1 failed\n");
3347 	FAILED(buf[1] != RESN(47), "test37 case 2 failed\n");
3348 	FAILED(buf[2] != 0, "test37 case 3 failed\n");
3349 #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
3350 	FAILED(buf[3] != 64, "test37 case 4 failed\n");
3351 #else
3352 	FAILED(buf[3] != 32, "test37 case 4 failed\n");
3353 #endif
3354 	FAILED(buf[4] != 1, "test37 case 5 failed\n");
3355 	FAILED(buf[5] != 0, "test37 case 6 failed\n");
3356 	FAILED(ibuf[0] != 32, "test37 case 7 failed\n");
3357 	FAILED(buf[6] != 1, "test37 case 8 failed\n");
3358 	FAILED(buf[7] != RESN(13), "test37 case 9 failed\n");
3359 #if !(defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32)
3360 	FAILED(buf[8] != 0, "test37 case 10 failed\n");
3361 #endif
3362 	FAILED(buf[9] != RESN(58), "test37 case 11 failed\n");
3363 	FAILED(buf[10] != 0, "test37 case 12 failed\n");
3364 #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
3365 	FAILED(buf[11] != 64, "test37 case 13 failed\n");
3366 #else
3367 	FAILED(buf[11] != 32, "test37 case 13 failed\n");
3368 #endif
3369 	FAILED(ibuf[1] != 4, "test37 case 14 failed\n");
3370 	FAILED((buf[12] & 0xffffffff) != 4, "test37 case 15 failed\n");
3371 	FAILED(buf[13] != 1, "test37 case 16 failed\n");
3372 	FAILED((buf[14] & 0xffffffff) != 0, "test37 case 17 failed\n");
3373 
3374 	sljit_free_code(code.code);
3375 	successful_tests++;
3376 }
3377 #undef BITN
3378 #undef RESN
3379 
3380 static void test38(void)
3381 {
3382 #if (defined SLJIT_UTIL_STACK && SLJIT_UTIL_STACK)
3383 	/* Test stack utility. */
3384 	executable_code code;
3385 	struct sljit_compiler* compiler = sljit_create_compiler();
3386 	struct sljit_jump* alloc_fail;
3387 	struct sljit_jump* alloc2_fail;
3388 	struct sljit_jump* alloc3_fail;
3389 	struct sljit_jump* jump;
3390 	struct sljit_label* label;
3391 
3392 	if (verbose)
3393 		printf("Run test38\n");
3394 
3395 	FAILED(!compiler, "cannot create compiler\n");
3396 
3397 	sljit_emit_enter(compiler, 0, 2, 1, 0);
3398 
3399 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 8192);
3400 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG2, 0, SLJIT_IMM, 65536);
3401 	sljit_emit_ijump(compiler, SLJIT_CALL2, SLJIT_IMM, SLJIT_FUNC_OFFSET(sljit_allocate_stack));
3402 	alloc_fail = sljit_emit_cmp(compiler, SLJIT_C_EQUAL, SLJIT_RETURN_REG, 0, SLJIT_IMM, 0);
3403 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SAVED_REG1, 0, SLJIT_RETURN_REG, 0);
3404 
3405 	/* Write 8k data. */
3406 	sljit_emit_op2(compiler, SLJIT_SUB, SLJIT_SCRATCH_REG1, 0, SLJIT_MEM1(SLJIT_SAVED_REG1), SLJIT_OFFSETOF(struct sljit_stack, base), SLJIT_IMM, sizeof(sljit_sw));
3407 	sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_SCRATCH_REG2, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 8192);
3408 	label = sljit_emit_label(compiler);
3409 	sljit_emit_op1(compiler, SLJIT_MOVU, SLJIT_MEM1(SLJIT_SCRATCH_REG1), sizeof(sljit_sw), SLJIT_IMM, -1);
3410 	jump = sljit_emit_cmp(compiler, SLJIT_C_LESS, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG2, 0);
3411 	sljit_set_label(jump, label);
3412 
3413 	/* Grow stack. */
3414 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_SAVED_REG1, 0);
3415 	sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_SCRATCH_REG2, 0, SLJIT_MEM1(SLJIT_SAVED_REG1), SLJIT_OFFSETOF(struct sljit_stack, base), SLJIT_IMM, 65536);
3416 	sljit_emit_ijump(compiler, SLJIT_CALL2, SLJIT_IMM, SLJIT_FUNC_OFFSET(sljit_stack_resize));
3417 	alloc2_fail = sljit_emit_cmp(compiler, SLJIT_C_NOT_EQUAL, SLJIT_RETURN_REG, 0, SLJIT_IMM, 0);
3418 
3419 	/* Write 64k data. */
3420 	sljit_emit_op2(compiler, SLJIT_SUB, SLJIT_SCRATCH_REG1, 0, SLJIT_MEM1(SLJIT_SAVED_REG1), SLJIT_OFFSETOF(struct sljit_stack, base), SLJIT_IMM, sizeof(sljit_sw));
3421 	sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_SCRATCH_REG2, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 65536);
3422 	label = sljit_emit_label(compiler);
3423 	sljit_emit_op1(compiler, SLJIT_MOVU, SLJIT_MEM1(SLJIT_SCRATCH_REG1), sizeof(sljit_sw), SLJIT_IMM, -1);
3424 	jump = sljit_emit_cmp(compiler, SLJIT_C_LESS, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG2, 0);
3425 	sljit_set_label(jump, label);
3426 
3427 	/* Shrink stack. */
3428 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_SAVED_REG1, 0);
3429 	sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_SCRATCH_REG2, 0, SLJIT_MEM1(SLJIT_SAVED_REG1), SLJIT_OFFSETOF(struct sljit_stack, base), SLJIT_IMM, 32768);
3430 	sljit_emit_ijump(compiler, SLJIT_CALL2, SLJIT_IMM, SLJIT_FUNC_OFFSET(sljit_stack_resize));
3431 	alloc3_fail = sljit_emit_cmp(compiler, SLJIT_C_NOT_EQUAL, SLJIT_RETURN_REG, 0, SLJIT_IMM, 0);
3432 
3433 	/* Write 32k data. */
3434 	sljit_emit_op2(compiler, SLJIT_SUB, SLJIT_SCRATCH_REG1, 0, SLJIT_MEM1(SLJIT_SAVED_REG1), SLJIT_OFFSETOF(struct sljit_stack, base), SLJIT_IMM, sizeof(sljit_sw));
3435 	sljit_emit_op2(compiler, SLJIT_SUB, SLJIT_SCRATCH_REG2, 0, SLJIT_MEM1(SLJIT_SAVED_REG1), SLJIT_OFFSETOF(struct sljit_stack, limit), SLJIT_IMM, sizeof(sljit_sw));
3436 	label = sljit_emit_label(compiler);
3437 	sljit_emit_op1(compiler, SLJIT_MOVU, SLJIT_MEM1(SLJIT_SCRATCH_REG1), sizeof(sljit_sw), SLJIT_IMM, -1);
3438 	jump = sljit_emit_cmp(compiler, SLJIT_C_LESS, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG2, 0);
3439 	sljit_set_label(jump, label);
3440 
3441 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_SAVED_REG1, 0);
3442 	sljit_emit_ijump(compiler, SLJIT_CALL1, SLJIT_IMM, SLJIT_FUNC_OFFSET(sljit_free_stack));
3443 
3444 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_RETURN_REG, 0, SLJIT_IMM, 1);
3445 	label = sljit_emit_label(compiler);
3446 	sljit_set_label(alloc_fail, label);
3447 	sljit_set_label(alloc2_fail, label);
3448 	sljit_set_label(alloc3_fail, label);
3449 	sljit_emit_return(compiler, SLJIT_UNUSED, 0, 0);
3450 
3451 	code.code = sljit_generate_code(compiler);
3452 	CHECK(compiler);
3453 	sljit_free_compiler(compiler);
3454 
3455 	/* Just survive this. */
3456 	FAILED(code.func0() != 1, "test38 case 1 failed\n");
3457 
3458 	sljit_free_code(code.code);
3459 #endif
3460 	successful_tests++;
3461 }
3462 
3463 static void test39(void)
3464 {
3465 	/* Test error handling. */
3466 	executable_code code;
3467 	struct sljit_compiler* compiler = sljit_create_compiler();
3468 	struct sljit_jump* jump;
3469 
3470 	if (verbose)
3471 		printf("Run test39\n");
3472 
3473 	FAILED(!compiler, "cannot create compiler\n");
3474 
3475 	/* Such assignment should never happen in a regular program. */
3476 	compiler->error = -3967;
3477 
3478 	SLJIT_ASSERT(sljit_emit_enter(compiler, 2, 5, 5, 32) == -3967);
3479 	SLJIT_ASSERT(sljit_emit_return(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG2, 0) == -3967);
3480 	SLJIT_ASSERT(sljit_emit_op0(compiler, SLJIT_NOP) == -3967);
3481 	SLJIT_ASSERT(sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_MEM2(SLJIT_SCRATCH_REG1, SLJIT_SCRATCH_REG2), 1) == -3967);
3482 	SLJIT_ASSERT(sljit_emit_op2(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_MEM1(SLJIT_SCRATCH_REG1), 64, SLJIT_MEM1(SLJIT_SAVED_REG1), -64) == -3967);
3483 	SLJIT_ASSERT(sljit_emit_fop1(compiler, SLJIT_ABSD, SLJIT_FLOAT_REG1, 0, SLJIT_MEM1(SLJIT_SCRATCH_REG2), 0) == -3967);
3484 	SLJIT_ASSERT(sljit_emit_fop2(compiler, SLJIT_DIVD, SLJIT_FLOAT_REG3, 0, SLJIT_MEM2(SLJIT_SCRATCH_REG1, SLJIT_SAVED_REG1), 0, SLJIT_FLOAT_REG3, 0) == -3967);
3485 	SLJIT_ASSERT(!sljit_emit_label(compiler));
3486 	jump = sljit_emit_jump(compiler, SLJIT_CALL3);
3487 	SLJIT_ASSERT(!jump);
3488 	sljit_set_label(jump, (struct sljit_label*)0x123450);
3489 	sljit_set_target(jump, 0x123450);
3490 	jump = sljit_emit_cmp(compiler, SLJIT_C_SIG_LESS_EQUAL, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG2, 0);
3491 	SLJIT_ASSERT(!jump);
3492 	SLJIT_ASSERT(sljit_emit_ijump(compiler, SLJIT_JUMP, SLJIT_MEM1(SLJIT_SCRATCH_REG1), 8) == -3967);
3493 	SLJIT_ASSERT(sljit_emit_op_flags(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_UNUSED, 0, SLJIT_C_MUL_OVERFLOW) == -3967);
3494 	SLJIT_ASSERT(!sljit_emit_const(compiler, SLJIT_SCRATCH_REG1, 0, 99));
3495 
3496 	SLJIT_ASSERT(!compiler->labels && !compiler->jumps && !compiler->consts);
3497 	SLJIT_ASSERT(!compiler->last_label && !compiler->last_jump && !compiler->last_const);
3498 	SLJIT_ASSERT(!compiler->buf->next && !compiler->buf->used_size);
3499 	SLJIT_ASSERT(!compiler->abuf->next && !compiler->abuf->used_size);
3500 
3501 	code.code = sljit_generate_code(compiler);
3502 	SLJIT_ASSERT(!code.code && sljit_get_compiler_error(compiler) == -3967);
3503 	sljit_free_compiler(compiler);
3504 	successful_tests++;
3505 }
3506 
3507 static void test40(void)
3508 {
3509 	/* Test emit_op_flags. */
3510 	executable_code code;
3511 	struct sljit_compiler* compiler = sljit_create_compiler();
3512 	sljit_sw buf[10];
3513 
3514 	if (verbose)
3515 		printf("Run test40\n");
3516 
3517 	FAILED(!compiler, "cannot create compiler\n");
3518 	buf[0] = -100;
3519 	buf[1] = -100;
3520 	buf[2] = -100;
3521 	buf[3] = -8;
3522 	buf[4] = -100;
3523 	buf[5] = -100;
3524 	buf[6] = 0;
3525 	buf[7] = 0;
3526 	buf[8] = -100;
3527 	buf[9] = -100;
3528 
3529 	sljit_emit_enter(compiler, 1, 3, 4, sizeof(sljit_sw));
3530 
3531 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, -5);
3532 	sljit_emit_op2(compiler, SLJIT_SUB | SLJIT_SET_S, SLJIT_UNUSED, 0, SLJIT_IMM, -6, SLJIT_SCRATCH_REG1, 0);
3533 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG2, 0, SLJIT_IMM, 0x123456);
3534 	sljit_emit_op_flags(compiler, SLJIT_OR, SLJIT_SCRATCH_REG2, 0, SLJIT_SCRATCH_REG2, 0, SLJIT_C_SIG_LESS);
3535 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), 0, SLJIT_SCRATCH_REG2, 0);
3536 
3537 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, -13);
3538 	sljit_emit_op2(compiler, SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, SLJIT_IMM, -13, SLJIT_SCRATCH_REG1, 0);
3539 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), 0, SLJIT_IMM, 0);
3540 	sljit_emit_op_flags(compiler, SLJIT_OR | SLJIT_KEEP_FLAGS, SLJIT_MEM1(SLJIT_LOCALS_REG), 0, SLJIT_MEM1(SLJIT_LOCALS_REG), 0, SLJIT_C_EQUAL);
3541 	sljit_emit_op_flags(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw), SLJIT_UNUSED, 0, SLJIT_C_EQUAL);
3542 	sljit_emit_op2(compiler, SLJIT_OR | SLJIT_KEEP_FLAGS, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw), SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw), SLJIT_MEM1(SLJIT_LOCALS_REG), 0);
3543 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG2, 0, SLJIT_IMM, 0);
3544 	sljit_emit_op_flags(compiler, SLJIT_OR | SLJIT_SET_E, SLJIT_SCRATCH_REG2, 0, SLJIT_SCRATCH_REG2, 0, SLJIT_C_EQUAL);
3545 	sljit_emit_op_flags(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw) * 2, SLJIT_UNUSED, 0, SLJIT_C_EQUAL);
3546 
3547 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, -13);
3548 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG2, 0, SLJIT_IMM, 3);
3549 	sljit_emit_op2(compiler, SLJIT_SUB | SLJIT_SET_S, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG2, 0);
3550 	sljit_emit_op_flags(compiler, SLJIT_OR, SLJIT_MEM2(SLJIT_SAVED_REG1, SLJIT_SCRATCH_REG2), SLJIT_WORD_SHIFT, SLJIT_MEM2(SLJIT_SAVED_REG1, SLJIT_SCRATCH_REG2), SLJIT_WORD_SHIFT, SLJIT_C_SIG_LESS);
3551 
3552 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, -8);
3553 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG2, 0, SLJIT_IMM, 33);
3554 	sljit_emit_op2(compiler, SLJIT_SUB | SLJIT_SET_U, SLJIT_UNUSED, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG2, 0);
3555 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SAVED_REG2, 0, SLJIT_IMM, 0);
3556 	sljit_emit_op_flags(compiler, SLJIT_OR | SLJIT_SET_E, SLJIT_UNUSED, 0, SLJIT_UNUSED, 0, SLJIT_C_GREATER);
3557 	sljit_emit_op_flags(compiler, SLJIT_OR | SLJIT_KEEP_FLAGS, SLJIT_SAVED_REG2, 0, SLJIT_SAVED_REG2, 0, SLJIT_C_EQUAL);
3558 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SAVED_EREG1, 0, SLJIT_IMM, 0x88);
3559 	sljit_emit_op_flags(compiler, SLJIT_OR | SLJIT_KEEP_FLAGS, SLJIT_SAVED_EREG1, 0, SLJIT_SAVED_EREG1, 0, SLJIT_C_NOT_EQUAL);
3560 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw) * 4, SLJIT_SAVED_REG2, 0);
3561 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw) * 5, SLJIT_SAVED_EREG1, 0);
3562 
3563 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 0x84);
3564 	sljit_emit_op2(compiler, SLJIT_AND | SLJIT_SET_E, SLJIT_UNUSED, 0, SLJIT_IMM, 0x180, SLJIT_SCRATCH_REG1, 0);
3565 	sljit_emit_op_flags(compiler, SLJIT_OR | SLJIT_SET_E, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw) * 6, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw) * 6, SLJIT_C_EQUAL);
3566 	sljit_emit_op_flags(compiler, SLJIT_OR, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw) * 7, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw) * 7, SLJIT_C_EQUAL);
3567 
3568 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 1);
3569 	sljit_emit_op2(compiler, SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 1);
3570 	sljit_emit_op_flags(compiler, SLJIT_OR | SLJIT_SET_E, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_C_NOT_EQUAL);
3571 	sljit_emit_op_flags(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw) * 8, SLJIT_UNUSED, 0, SLJIT_C_NOT_EQUAL);
3572 
3573 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 0x123456);
3574 	sljit_emit_op2(compiler, SLJIT_SUB | SLJIT_SET_U, SLJIT_UNUSED, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 1);
3575 	sljit_emit_op_flags(compiler, SLJIT_OR, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_C_GREATER);
3576 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw) * 9, SLJIT_SCRATCH_REG1, 0);
3577 
3578 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), 0, SLJIT_IMM, 0xbaddead);
3579 	sljit_emit_return(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), 0);
3580 
3581 	code.code = sljit_generate_code(compiler);
3582 	CHECK(compiler);
3583 	sljit_free_compiler(compiler);
3584 
3585 	FAILED(code.func1((sljit_sw)&buf) != 0xbaddead, "test40 case 1 failed\n");
3586 	FAILED(buf[0] != 0x123457, "test40 case 2 failed\n");
3587 	FAILED(buf[1] != 1, "test40 case 3 failed\n");
3588 	FAILED(buf[2] != 0, "test40 case 4 failed\n");
3589 	FAILED(buf[3] != -7, "test40 case 5 failed\n");
3590 	FAILED(buf[4] != 0, "test40 case 6 failed\n");
3591 	FAILED(buf[5] != 0x89, "test40 case 7 failed\n");
3592 	FAILED(buf[6] != 0, "test40 case 8 failed\n");
3593 	FAILED(buf[7] != 1, "test40 case 9 failed\n");
3594 	FAILED(buf[8] != 1, "test40 case 10 failed\n");
3595 	FAILED(buf[9] != 0x123457, "test40 case 11 failed\n");
3596 
3597 	sljit_free_code(code.code);
3598 	successful_tests++;
3599 }
3600 
3601 static void test41(void)
3602 {
3603 	/* Test inline assembly. */
3604 	executable_code code;
3605 	struct sljit_compiler* compiler = sljit_create_compiler();
3606 	sljit_si i;
3607 	sljit_d buf[3];
3608 #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
3609 	sljit_ub inst[16];
3610 #elif (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
3611 	sljit_ub inst[16];
3612 	sljit_si reg;
3613 #else
3614 	sljit_ui inst;
3615 #endif
3616 
3617 	if (verbose)
3618 		printf("Run test41\n");
3619 
3620 	for (i = 1; i <= SLJIT_NO_REGISTERS; i++) {
3621 #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
3622 		if (i == SLJIT_TEMPORARY_EREG1 || i == SLJIT_TEMPORARY_EREG2
3623 				|| i == SLJIT_SAVED_EREG1 || i == SLJIT_SAVED_EREG2) {
3624 			SLJIT_ASSERT(sljit_get_register_index(i) == -1);
3625 			continue;
3626 		}
3627 #endif
3628 		SLJIT_ASSERT(sljit_get_register_index(i) >= 0 && sljit_get_register_index(i) < 32);
3629 	}
3630 
3631 	FAILED(!compiler, "cannot create compiler\n");
3632 	sljit_emit_enter(compiler, 2, 3, 3, 0);
3633 
3634 	/* Returns with the sum of SLJIT_SAVED_REG1 and SLJIT_SAVED_REG2. */
3635 #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
3636 	/* lea SLJIT_RETURN_REG, [SLJIT_SAVED_REG1, SLJIT_SAVED_REG2] */
3637 	inst[0] = 0x48;
3638 	inst[1] = 0x8d;
3639 	inst[2] = 0x04 | ((sljit_get_register_index(SLJIT_RETURN_REG) & 0x7) << 3);
3640 	inst[3] = (sljit_get_register_index(SLJIT_SAVED_REG1) & 0x7)
3641 		| ((sljit_get_register_index(SLJIT_SAVED_REG2) & 0x7) << 3);
3642 	sljit_emit_op_custom(compiler, inst, 4);
3643 #elif (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
3644 	/* lea SLJIT_RETURN_REG, [SLJIT_SAVED_REG1, SLJIT_SAVED_REG2] */
3645 	inst[0] = 0x48; /* REX_W */
3646 	inst[1] = 0x8d;
3647 	inst[2] = 0x04;
3648 	reg = sljit_get_register_index(SLJIT_RETURN_REG);
3649 	inst[2] |= ((reg & 0x7) << 3);
3650 	if (reg > 7)
3651 		inst[0] |= 0x04; /* REX_R */
3652 	reg = sljit_get_register_index(SLJIT_SAVED_REG1);
3653 	inst[3] = reg & 0x7;
3654 	if (reg > 7)
3655 		inst[0] |= 0x01; /* REX_B */
3656 	reg = sljit_get_register_index(SLJIT_SAVED_REG2);
3657 	inst[3] |= (reg & 0x7) << 3;
3658 	if (reg > 7)
3659 		inst[0] |= 0x02; /* REX_X */
3660 	sljit_emit_op_custom(compiler, inst, 4);
3661 #elif (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) || (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7)
3662 	/* add rd, rn, rm */
3663 	inst = 0xe0800000 | (sljit_get_register_index(SLJIT_RETURN_REG) << 12)
3664 		| (sljit_get_register_index(SLJIT_SAVED_REG1) << 16)
3665 		| sljit_get_register_index(SLJIT_SAVED_REG2);
3666 	sljit_emit_op_custom(compiler, &inst, sizeof(sljit_ui));
3667 #elif (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2)
3668 	/* add rd, rn, rm */
3669 	inst = 0xeb000000 | (sljit_get_register_index(SLJIT_RETURN_REG) << 8)
3670 		| (sljit_get_register_index(SLJIT_SAVED_REG1) << 16)
3671 		| sljit_get_register_index(SLJIT_SAVED_REG2);
3672 	sljit_emit_op_custom(compiler, &inst, sizeof(sljit_ui));
3673 #elif (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64)
3674 	/* add rd, rn, rm */
3675 	inst = 0x8b000000 | sljit_get_register_index(SLJIT_RETURN_REG)
3676 		| (sljit_get_register_index(SLJIT_SAVED_REG1) << 5)
3677 		| (sljit_get_register_index(SLJIT_SAVED_REG2) << 16);
3678 	sljit_emit_op_custom(compiler, &inst, sizeof(sljit_ui));
3679 #elif (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) || (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
3680 	/* add rD, rA, rB */
3681 	inst = (31 << 26) | (266 << 1) | (sljit_get_register_index(SLJIT_RETURN_REG) << 21)
3682 		| (sljit_get_register_index(SLJIT_SAVED_REG1) << 16)
3683 		| (sljit_get_register_index(SLJIT_SAVED_REG2) << 11);
3684 	sljit_emit_op_custom(compiler, &inst, sizeof(sljit_ui));
3685 #elif (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)
3686 	/* addu rd, rs, rt */
3687 	inst = 33 | (sljit_get_register_index(SLJIT_RETURN_REG) << 11)
3688 		| (sljit_get_register_index(SLJIT_SAVED_REG1) << 21)
3689 		| (sljit_get_register_index(SLJIT_SAVED_REG2) << 16);
3690 	sljit_emit_op_custom(compiler, &inst, sizeof(sljit_ui));
3691 #elif (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64)
3692 	/* daddu rd, rs, rt */
3693 	inst = 45 | (sljit_get_register_index(SLJIT_RETURN_REG) << 11)
3694 		| (sljit_get_register_index(SLJIT_SAVED_REG1) << 21)
3695 		| (sljit_get_register_index(SLJIT_SAVED_REG2) << 16);
3696 	sljit_emit_op_custom(compiler, &inst, sizeof(sljit_ui));
3697 #elif (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32)
3698 	/* add rd, rs1, rs2 */
3699 	inst = (0x2 << 30) | (sljit_get_register_index(SLJIT_RETURN_REG) << 25)
3700 		| (sljit_get_register_index(SLJIT_SAVED_REG1) << 14)
3701 		| sljit_get_register_index(SLJIT_SAVED_REG2);
3702 	sljit_emit_op_custom(compiler, &inst, sizeof(sljit_ui));
3703 #else
3704 	inst = 0;
3705 	sljit_emit_op_custom(compiler, &inst, 0);
3706 #endif
3707 
3708 	sljit_emit_return(compiler, SLJIT_MOV, SLJIT_RETURN_REG, 0);
3709 
3710 	code.code = sljit_generate_code(compiler);
3711 	CHECK(compiler);
3712 	sljit_free_compiler(compiler);
3713 
3714 	FAILED(code.func2(32, -11) != 21, "test41 case 1 failed\n");
3715 	FAILED(code.func2(1000, 234) != 1234, "test41 case 2 failed\n");
3716 #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
3717 	FAILED(code.func2(SLJIT_W(0x20f0a04090c06070), SLJIT_W(0x020f0a04090c0607)) != SLJIT_W(0x22ffaa4499cc6677), "test41 case 3 failed\n");
3718 #endif
3719 
3720 	sljit_free_code(code.code);
3721 
3722 	if (sljit_is_fpu_available()) {
3723 		buf[0] = 13.5;
3724 		buf[1] = -2.25;
3725 		buf[2] = 0.0;
3726 
3727 		compiler = sljit_create_compiler();
3728 		sljit_emit_enter(compiler, 1, 0, 1, 0);
3729 		sljit_emit_fop1(compiler, SLJIT_MOVD, SLJIT_FLOAT_REG1, 0, SLJIT_MEM1(SLJIT_SAVED_REG1), 0);
3730 		sljit_emit_fop1(compiler, SLJIT_MOVD, SLJIT_FLOAT_REG2, 0, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_d));
3731 #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
3732 		/* addsd x, xm */
3733 		inst[0] = 0xf2;
3734 		inst[1] = 0x0f;
3735 		inst[2] = 0x58;
3736 		inst[3] = 0xc0 | (sljit_get_float_register_index(SLJIT_FLOAT_REG1) << 3)
3737 			| sljit_get_float_register_index(SLJIT_FLOAT_REG2);
3738 		sljit_emit_op_custom(compiler, inst, 4);
3739 #elif (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
3740 		/* addsd x, xm */
3741 		if (sljit_get_float_register_index(SLJIT_FLOAT_REG1) > 7 || sljit_get_float_register_index(SLJIT_FLOAT_REG2) > 7) {
3742 			inst[0] = 0;
3743 			if (sljit_get_float_register_index(SLJIT_FLOAT_REG1) > 7)
3744 				inst[0] |= 0x04; /* REX_R */
3745 			if (sljit_get_float_register_index(SLJIT_FLOAT_REG2) > 7)
3746 				inst[0] |= 0x01; /* REX_B */
3747 			inst[1] = 0xf2;
3748 			inst[2] = 0x0f;
3749 			inst[3] = 0x58;
3750 			inst[4] = 0xc0 | ((sljit_get_float_register_index(SLJIT_FLOAT_REG1) & 0x7) << 3)
3751 				| (sljit_get_float_register_index(SLJIT_FLOAT_REG2) & 0x7);
3752 			sljit_emit_op_custom(compiler, inst, 5);
3753 		}
3754 		else {
3755 			inst[0] = 0xf2;
3756 			inst[1] = 0x0f;
3757 			inst[2] = 0x58;
3758 			inst[3] = 0xc0 | (sljit_get_float_register_index(SLJIT_FLOAT_REG1) << 3)
3759 				| sljit_get_float_register_index(SLJIT_FLOAT_REG2);
3760 			sljit_emit_op_custom(compiler, inst, 4);
3761 		}
3762 #elif (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) || (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7) || (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2)
3763 		/* vadd.f64 dd, dn, dm */
3764 		inst = 0xee300b00 | (sljit_get_float_register_index(SLJIT_FLOAT_REG1) << 12)
3765 			| (sljit_get_float_register_index(SLJIT_FLOAT_REG1) << 16)
3766 			| sljit_get_float_register_index(SLJIT_FLOAT_REG2);
3767 		sljit_emit_op_custom(compiler, &inst, sizeof(sljit_ui));
3768 #elif (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64)
3769 		/* fadd rd, rn, rm */
3770 		inst = 0x1e602800 | sljit_get_float_register_index(SLJIT_FLOAT_REG1)
3771 			| (sljit_get_float_register_index(SLJIT_FLOAT_REG1) << 5)
3772 			| (sljit_get_float_register_index(SLJIT_FLOAT_REG2) << 16);
3773 		sljit_emit_op_custom(compiler, &inst, sizeof(sljit_ui));
3774 #elif (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) || (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
3775 		/* fadd frD, frA, frB */
3776 		inst = (63 << 26) | (21 << 1) | (sljit_get_float_register_index(SLJIT_FLOAT_REG1) << 21)
3777 			| (sljit_get_float_register_index(SLJIT_FLOAT_REG1) << 16)
3778 			| (sljit_get_float_register_index(SLJIT_FLOAT_REG2) << 11);
3779 		sljit_emit_op_custom(compiler, &inst, sizeof(sljit_ui));
3780 #elif (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) || (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64)
3781 		/* add.d fd, fs, ft */
3782 		inst = (17 << 26) | (17 << 21) | (sljit_get_float_register_index(SLJIT_FLOAT_REG1) << 6)
3783 			| (sljit_get_float_register_index(SLJIT_FLOAT_REG1) << 11)
3784 			| (sljit_get_float_register_index(SLJIT_FLOAT_REG2) << 16);
3785 		sljit_emit_op_custom(compiler, &inst, sizeof(sljit_ui));
3786 #elif (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32)
3787 		/* faddd rd, rs1, rs2 */
3788 		inst = (0x2 << 30) | (0x34 << 19) | (0x42 << 5)
3789 			| (sljit_get_float_register_index(SLJIT_FLOAT_REG1) << 25)
3790 			| (sljit_get_float_register_index(SLJIT_FLOAT_REG1) << 14)
3791 			| sljit_get_float_register_index(SLJIT_FLOAT_REG2);
3792 		sljit_emit_op_custom(compiler, &inst, sizeof(sljit_ui));
3793 #endif
3794 		sljit_emit_fop1(compiler, SLJIT_MOVD, SLJIT_MEM1(SLJIT_SAVED_REG1), 2 * sizeof(sljit_d), SLJIT_FLOAT_REG1, 0);
3795 		sljit_emit_return(compiler, SLJIT_UNUSED, 0, 0);
3796 
3797 		code.code = sljit_generate_code(compiler);
3798 		CHECK(compiler);
3799 		sljit_free_compiler(compiler);
3800 
3801 		code.func1((sljit_sw)&buf);
3802 		FAILED(buf[2] != 11.25, "test41 case 3 failed\n");
3803 
3804 		sljit_free_code(code.code);
3805 	}
3806 
3807 	successful_tests++;
3808 }
3809 
3810 static void test42(void)
3811 {
3812 	/* Test long multiply and division. */
3813 	executable_code code;
3814 	struct sljit_compiler* compiler = sljit_create_compiler();
3815 	sljit_si i;
3816 	sljit_sw buf[7 + 8 + 4];
3817 
3818 	if (verbose)
3819 		printf("Run test42\n");
3820 
3821 	FAILED(!compiler, "cannot create compiler\n");
3822 	for (i = 0; i < 7 + 8; i++)
3823 		buf[i] = -1;
3824 
3825 	sljit_emit_enter(compiler, 1, 5, 5, 0);
3826 
3827 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG3, 0, SLJIT_IMM, -0x1fb308a);
3828 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_TEMPORARY_EREG1, 0, SLJIT_IMM, 0xf50c873);
3829 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_TEMPORARY_EREG2, 0, SLJIT_IMM, 0x8a0475b);
3830 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SAVED_REG2, 0, SLJIT_IMM, 0x9dc849b);
3831 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SAVED_REG3, 0, SLJIT_IMM, -0x7c69a35);
3832 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SAVED_EREG1, 0, SLJIT_IMM, 0x5a4d0c4);
3833 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SAVED_EREG2, 0, SLJIT_IMM, 0x9a3b06d);
3834 
3835 #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
3836 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, SLJIT_W(-0x5dc4f897b8cd67f5));
3837 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG2, 0, SLJIT_IMM, SLJIT_W(0x3f8b5c026cb088df));
3838 	sljit_emit_op0(compiler, SLJIT_UMUL);
3839 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), 7 * sizeof(sljit_sw), SLJIT_SCRATCH_REG1, 0);
3840 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), 8 * sizeof(sljit_sw), SLJIT_SCRATCH_REG2, 0);
3841 
3842 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, SLJIT_W(-0x5dc4f897b8cd67f5));
3843 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG2, 0, SLJIT_IMM, SLJIT_W(0x3f8b5c026cb088df));
3844 	sljit_emit_op0(compiler, SLJIT_SMUL);
3845 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), 9 * sizeof(sljit_sw), SLJIT_SCRATCH_REG1, 0);
3846 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), 10 * sizeof(sljit_sw), SLJIT_SCRATCH_REG2, 0);
3847 
3848 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, SLJIT_W(-0x5dc4f897b8cd67f5));
3849 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG2, 0, SLJIT_IMM, SLJIT_W(0x3f8b5c026cb088df));
3850 	sljit_emit_op0(compiler, SLJIT_UDIV);
3851 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), 11 * sizeof(sljit_sw), SLJIT_SCRATCH_REG1, 0);
3852 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), 12 * sizeof(sljit_sw), SLJIT_SCRATCH_REG2, 0);
3853 
3854 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, SLJIT_W(-0x5dc4f897b8cd67f5));
3855 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG2, 0, SLJIT_IMM, SLJIT_W(0x3f8b5c026cb088df));
3856 	sljit_emit_op0(compiler, SLJIT_SDIV);
3857 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), 13 * sizeof(sljit_sw), SLJIT_SCRATCH_REG1, 0);
3858 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), 14 * sizeof(sljit_sw), SLJIT_SCRATCH_REG2, 0);
3859 
3860 	sljit_emit_op1(compiler, SLJIT_IMOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, SLJIT_W(0x5cf783d3cf0a74b0));
3861 	sljit_emit_op1(compiler, SLJIT_IMOV, SLJIT_SCRATCH_REG2, 0, SLJIT_IMM, SLJIT_W(0x3d5df42d03a28fc7));
3862 	sljit_emit_op0(compiler, SLJIT_IUDIV);
3863 	sljit_emit_op1(compiler, SLJIT_MOV_UI, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG1, 0);
3864 	sljit_emit_op1(compiler, SLJIT_MOV_UI, SLJIT_SCRATCH_REG2, 0, SLJIT_SCRATCH_REG2, 0);
3865 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), 15 * sizeof(sljit_sw), SLJIT_SCRATCH_REG1, 0);
3866 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), 16 * sizeof(sljit_sw), SLJIT_SCRATCH_REG2, 0);
3867 
3868 	sljit_emit_op1(compiler, SLJIT_IMOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, SLJIT_W(0x371df5197ba26a28));
3869 	sljit_emit_op1(compiler, SLJIT_IMOV, SLJIT_SCRATCH_REG2, 0, SLJIT_IMM, SLJIT_W(0x46c78a5cfd6a420c));
3870 	sljit_emit_op0(compiler, SLJIT_ISDIV);
3871 	sljit_emit_op1(compiler, SLJIT_MOV_SI, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG1, 0);
3872 	sljit_emit_op1(compiler, SLJIT_MOV_SI, SLJIT_SCRATCH_REG2, 0, SLJIT_SCRATCH_REG2, 0);
3873 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), 17 * sizeof(sljit_sw), SLJIT_SCRATCH_REG1, 0);
3874 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), 18 * sizeof(sljit_sw), SLJIT_SCRATCH_REG2, 0);
3875 
3876 #else
3877 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, -0x58cd67f5);
3878 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG2, 0, SLJIT_IMM, 0x3cb088df);
3879 	sljit_emit_op0(compiler, SLJIT_UMUL);
3880 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), 7 * sizeof(sljit_sw), SLJIT_SCRATCH_REG1, 0);
3881 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), 8 * sizeof(sljit_sw), SLJIT_SCRATCH_REG2, 0);
3882 
3883 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, -0x58cd67f5);
3884 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG2, 0, SLJIT_IMM, 0x3cb088df);
3885 	sljit_emit_op0(compiler, SLJIT_SMUL);
3886 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), 9 * sizeof(sljit_sw), SLJIT_SCRATCH_REG1, 0);
3887 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), 10 * sizeof(sljit_sw), SLJIT_SCRATCH_REG2, 0);
3888 
3889 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, -0x58cd67f5);
3890 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG2, 0, SLJIT_IMM, 0x3cb088df);
3891 	sljit_emit_op0(compiler, SLJIT_UDIV);
3892 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), 11 * sizeof(sljit_sw), SLJIT_SCRATCH_REG1, 0);
3893 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), 12 * sizeof(sljit_sw), SLJIT_SCRATCH_REG2, 0);
3894 
3895 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, -0x58cd67f5);
3896 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG2, 0, SLJIT_IMM, 0x3cb088df);
3897 	sljit_emit_op0(compiler, SLJIT_SDIV);
3898 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), 13 * sizeof(sljit_sw), SLJIT_SCRATCH_REG1, 0);
3899 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), 14 * sizeof(sljit_sw), SLJIT_SCRATCH_REG2, 0);
3900 
3901 	sljit_emit_op1(compiler, SLJIT_IMOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 0xcf0a74b0);
3902 	sljit_emit_op1(compiler, SLJIT_IMOV, SLJIT_SCRATCH_REG2, 0, SLJIT_IMM, 0x03a28fc7);
3903 	sljit_emit_op0(compiler, SLJIT_IUDIV);
3904 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), 15 * sizeof(sljit_sw), SLJIT_SCRATCH_REG1, 0);
3905 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), 16 * sizeof(sljit_sw), SLJIT_SCRATCH_REG2, 0);
3906 
3907 	sljit_emit_op1(compiler, SLJIT_IMOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 0x7ba26a28);
3908 	sljit_emit_op1(compiler, SLJIT_IMOV, SLJIT_SCRATCH_REG2, 0, SLJIT_IMM, (sljit_sw)0xfd6a420c);
3909 	sljit_emit_op0(compiler, SLJIT_ISDIV);
3910 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), 17 * sizeof(sljit_sw), SLJIT_SCRATCH_REG1, 0);
3911 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), 18 * sizeof(sljit_sw), SLJIT_SCRATCH_REG2, 0);
3912 #endif
3913 
3914 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), 0, SLJIT_SCRATCH_REG3, 0);
3915 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw), SLJIT_TEMPORARY_EREG1, 0);
3916 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), 2 * sizeof(sljit_sw), SLJIT_TEMPORARY_EREG2, 0);
3917 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), 3 * sizeof(sljit_sw), SLJIT_SAVED_REG2, 0);
3918 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), 4 * sizeof(sljit_sw), SLJIT_SAVED_REG3, 0);
3919 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), 5 * sizeof(sljit_sw), SLJIT_SAVED_EREG1, 0);
3920 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), 6 * sizeof(sljit_sw), SLJIT_SAVED_EREG2, 0);
3921 
3922 	sljit_emit_return(compiler, SLJIT_UNUSED, 0, 0);
3923 
3924 	code.code = sljit_generate_code(compiler);
3925 	CHECK(compiler);
3926 	sljit_free_compiler(compiler);
3927 
3928 	code.func1((sljit_sw)&buf);
3929 
3930 	FAILED(buf[0] != -0x1fb308a, "test42 case 1 failed\n");
3931 	FAILED(buf[1] != 0xf50c873, "test42 case 2 failed\n");
3932 	FAILED(buf[2] != 0x8a0475b, "test42 case 3 failed\n");
3933 	FAILED(buf[3] != 0x9dc849b, "test42 case 4 failed\n");
3934 	FAILED(buf[4] != -0x7c69a35, "test42 case 5 failed\n");
3935 	FAILED(buf[5] != 0x5a4d0c4, "test42 case 6 failed\n");
3936 	FAILED(buf[6] != 0x9a3b06d, "test42 case 7 failed\n");
3937 
3938 #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
3939 	FAILED(buf[7] != SLJIT_W(-4388959407985636971), "test42 case 8 failed\n");
3940 	FAILED(buf[8] != SLJIT_W(2901680654366567099), "test42 case 9 failed\n");
3941 	FAILED(buf[9] != SLJIT_W(-4388959407985636971), "test42 case 10 failed\n");
3942 	FAILED(buf[10] != SLJIT_W(-1677173957268872740), "test42 case 11 failed\n");
3943 	FAILED(buf[11] != SLJIT_W(2), "test42 case 12 failed\n");
3944 	FAILED(buf[12] != SLJIT_W(2532236178951865933), "test42 case 13 failed\n");
3945 	FAILED(buf[13] != SLJIT_W(-1), "test42 case 14 failed\n");
3946 	FAILED(buf[14] != SLJIT_W(-2177944059851366166), "test42 case 15 failed\n");
3947 #else
3948 	FAILED(buf[7] != -1587000939, "test42 case 8 failed\n");
3949 	FAILED(buf[8] != 665003983, "test42 case 9 failed\n");
3950 	FAILED(buf[9] != -1587000939, "test42 case 10 failed\n");
3951 	FAILED(buf[10] != -353198352, "test42 case 11 failed\n");
3952 	FAILED(buf[11] != 2, "test42 case 12 failed\n");
3953 	FAILED(buf[12] != 768706125, "test42 case 13 failed\n");
3954 	FAILED(buf[13] != -1, "test42 case 14 failed\n");
3955 	FAILED(buf[14] != -471654166, "test42 case 15 failed\n");
3956 #endif
3957 
3958 	FAILED(buf[15] != SLJIT_W(56), "test42 case 16 failed\n");
3959 	FAILED(buf[16] != SLJIT_W(58392872), "test42 case 17 failed\n");
3960 	FAILED(buf[17] != SLJIT_W(-47), "test42 case 18 failed\n");
3961 	FAILED(buf[18] != SLJIT_W(35949148), "test42 case 19 failed\n");
3962 
3963 	sljit_free_code(code.code);
3964 	successful_tests++;
3965 }
3966 
3967 static void test43(void)
3968 {
3969 	/* Test floating point compare. */
3970 	executable_code code;
3971 	struct sljit_compiler* compiler = sljit_create_compiler();
3972 	struct sljit_jump* jump;
3973 
3974 	union {
3975 		sljit_d value;
3976 		struct {
3977 			sljit_ui value1;
3978 			sljit_ui value2;
3979 		} u;
3980 	} dbuf[4];
3981 
3982 	if (verbose)
3983 		printf("Run test43\n");
3984 
3985 	if (!sljit_is_fpu_available()) {
3986 		printf("no fpu available, test43 skipped\n");
3987 		successful_tests++;
3988 		if (compiler)
3989 			sljit_free_compiler(compiler);
3990 		return;
3991 	}
3992 
3993 	FAILED(!compiler, "cannot create compiler\n");
3994 
3995 	dbuf[0].value = 12.125;
3996 	/* a NaN */
3997 	dbuf[1].u.value1 = 0x7fffffff;
3998 	dbuf[1].u.value2 = 0x7fffffff;
3999 	dbuf[2].value = -13.5;
4000 	dbuf[3].value = 12.125;
4001 
4002 	sljit_emit_enter(compiler, 1, 1, 1, 0);
4003 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 2);
4004 	/* dbuf[0] < dbuf[2] -> -2 */
4005 	jump = sljit_emit_fcmp(compiler, SLJIT_C_FLOAT_GREATER_EQUAL, SLJIT_MEM1(SLJIT_SAVED_REG1), 0, SLJIT_MEM2(SLJIT_SAVED_REG1, SLJIT_SCRATCH_REG1), SLJIT_DOUBLE_SHIFT);
4006 	sljit_emit_return(compiler, SLJIT_MOV, SLJIT_IMM, -2);
4007 
4008 	sljit_set_label(jump, sljit_emit_label(compiler));
4009 	sljit_emit_fop1(compiler, SLJIT_MOVD, SLJIT_FLOAT_REG2, 0, SLJIT_MEM1(SLJIT_SAVED_REG1), 0);
4010 	/* dbuf[0] and dbuf[1] is not NaN -> 5 */
4011 	jump = sljit_emit_fcmp(compiler, SLJIT_C_FLOAT_UNORDERED, SLJIT_MEM0(), (sljit_sw)&dbuf[1], SLJIT_FLOAT_REG2, 0);
4012 	sljit_emit_return(compiler, SLJIT_MOV, SLJIT_IMM, 5);
4013 
4014 	sljit_set_label(jump, sljit_emit_label(compiler));
4015 	sljit_emit_fop1(compiler, SLJIT_MOVD, SLJIT_FLOAT_REG3, 0, SLJIT_MEM1(SLJIT_SAVED_REG1), 3 * sizeof(sljit_d));
4016 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_RETURN_REG, 0, SLJIT_IMM, 11);
4017 	/* dbuf[0] == dbuf[3] -> 11 */
4018 	jump = sljit_emit_fcmp(compiler, SLJIT_C_FLOAT_EQUAL, SLJIT_MEM1(SLJIT_SAVED_REG1), 0, SLJIT_FLOAT_REG3, 0);
4019 
4020 	/* else -> -17 */
4021 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_RETURN_REG, 0, SLJIT_IMM, -17);
4022 	sljit_set_label(jump, sljit_emit_label(compiler));
4023 	sljit_emit_return(compiler, SLJIT_MOV, SLJIT_RETURN_REG, 0);
4024 
4025 	code.code = sljit_generate_code(compiler);
4026 	CHECK(compiler);
4027 	sljit_free_compiler(compiler);
4028 
4029 	FAILED(code.func1((sljit_sw)&dbuf) != 11, "test43 case 1 failed\n");
4030 	dbuf[3].value = 12;
4031 	FAILED(code.func1((sljit_sw)&dbuf) != -17, "test43 case 2 failed\n");
4032 	dbuf[1].value = 0;
4033 	FAILED(code.func1((sljit_sw)&dbuf) != 5, "test43 case 3 failed\n");
4034 	dbuf[2].value = 20;
4035 	FAILED(code.func1((sljit_sw)&dbuf) != -2, "test43 case 4 failed\n");
4036 
4037 	sljit_free_code(code.code);
4038 	successful_tests++;
4039 }
4040 
4041 static void test44(void)
4042 {
4043 	/* Test mov. */
4044 	executable_code code;
4045 	struct sljit_compiler* compiler = sljit_create_compiler();
4046 	void *buf[5];
4047 
4048 	if (verbose)
4049 		printf("Run test44\n");
4050 
4051 	FAILED(!compiler, "cannot create compiler\n");
4052 
4053 	buf[0] = buf + 2;
4054 	buf[1] = NULL;
4055 	buf[2] = NULL;
4056 	buf[3] = NULL;
4057 	buf[4] = NULL;
4058 	sljit_emit_enter(compiler, 1, 3, 2, 0);
4059 
4060 	sljit_emit_op1(compiler, SLJIT_MOV_P, SLJIT_SCRATCH_REG1, 0, SLJIT_MEM1(SLJIT_SAVED_REG1), 0);
4061 	sljit_emit_op1(compiler, SLJIT_MOV_P, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_p), SLJIT_SCRATCH_REG1, 0);
4062 	sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, sizeof(sljit_p));
4063 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG2, 0, SLJIT_IMM, 2);
4064 	sljit_emit_op1(compiler, SLJIT_MOV_P, SLJIT_MEM2(SLJIT_SAVED_REG1, SLJIT_SCRATCH_REG2), SLJIT_POINTER_SHIFT, SLJIT_SCRATCH_REG1, 0);
4065 	sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, sizeof(sljit_p));
4066 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG2, 0, SLJIT_IMM, 3);
4067 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG3, 0, SLJIT_SAVED_REG1, 0);
4068 	sljit_emit_op1(compiler, SLJIT_MOVU_P, SLJIT_MEM2(SLJIT_SCRATCH_REG3, SLJIT_SCRATCH_REG2), SLJIT_POINTER_SHIFT, SLJIT_SCRATCH_REG1, 0);
4069 	sljit_emit_op2(compiler, SLJIT_SUB, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 2 * sizeof(sljit_p));
4070 	sljit_emit_op1(compiler, SLJIT_MOV_P, SLJIT_MEM1(SLJIT_SCRATCH_REG3), sizeof(sljit_p), SLJIT_SCRATCH_REG1, 0);
4071 
4072 	sljit_emit_return(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0);
4073 
4074 	code.code = sljit_generate_code(compiler);
4075 	CHECK(compiler);
4076 	sljit_free_compiler(compiler);
4077 
4078 	FAILED(code.func1((sljit_sw)&buf) != (sljit_sw)(buf + 2), "test44 case 1 failed\n");
4079 	FAILED(buf[1] != buf + 2, "test44 case 2 failed\n");
4080 	FAILED(buf[2] != buf + 3, "test44 case 3 failed\n");
4081 	FAILED(buf[3] != buf + 4, "test44 case 4 failed\n");
4082 	FAILED(buf[4] != buf + 2, "test44 case 5 failed\n");
4083 
4084 	sljit_free_code(code.code);
4085 	successful_tests++;
4086 }
4087 
4088 static void test45(void)
4089 {
4090 	/* Test single precision floating point. */
4091 
4092 	executable_code code;
4093 	struct sljit_compiler* compiler = sljit_create_compiler();
4094 	sljit_s buf[12];
4095 	sljit_sw buf2[6];
4096 	struct sljit_jump* jump;
4097 
4098 	if (verbose)
4099 		printf("Run test45\n");
4100 
4101 	if (!sljit_is_fpu_available()) {
4102 		printf("no fpu available, test45 skipped\n");
4103 		successful_tests++;
4104 		if (compiler)
4105 			sljit_free_compiler(compiler);
4106 		return;
4107 	}
4108 
4109 	FAILED(!compiler, "cannot create compiler\n");
4110 
4111 	buf[0] = 5.5;
4112 	buf[1] = -7.25;
4113 	buf[2] = 0;
4114 	buf[3] = 0;
4115 	buf[4] = 0;
4116 	buf[5] = 0;
4117 	buf[6] = 0;
4118 	buf[7] = 8.75;
4119 	buf[8] = 0;
4120 	buf[9] = 16.5;
4121 	buf[10] = 0;
4122 	buf[11] = 0;
4123 
4124 	buf2[0] = -1;
4125 	buf2[1] = -1;
4126 	buf2[2] = -1;
4127 	buf2[3] = -1;
4128 	buf2[4] = -1;
4129 	buf2[5] = -1;
4130 
4131 	sljit_emit_enter(compiler, 2, 3, 2, 0);
4132 
4133 	sljit_emit_fop1(compiler, SLJIT_MOVS, SLJIT_FLOAT_REG1, 0, SLJIT_MEM1(SLJIT_SAVED_REG1), 0);
4134 	sljit_emit_fop1(compiler, SLJIT_MOVS, SLJIT_FLOAT_REG6, 0, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_s));
4135 	sljit_emit_fop1(compiler, SLJIT_NEGS, SLJIT_MEM1(SLJIT_SAVED_REG1), 2 * sizeof(sljit_s), SLJIT_FLOAT_REG1, 0);
4136 	sljit_emit_fop1(compiler, SLJIT_ABSS, SLJIT_FLOAT_REG2, 0, SLJIT_FLOAT_REG6, 0);
4137 	sljit_emit_fop1(compiler, SLJIT_MOVS, SLJIT_MEM1(SLJIT_SAVED_REG1), 3 * sizeof(sljit_s), SLJIT_FLOAT_REG2, 0);
4138 	sljit_emit_fop1(compiler, SLJIT_ABSS, SLJIT_MEM1(SLJIT_SAVED_REG1), 4 * sizeof(sljit_s), SLJIT_FLOAT_REG6, 0);
4139 	sljit_emit_fop1(compiler, SLJIT_NEGS, SLJIT_FLOAT_REG5, 0, SLJIT_MEM1(SLJIT_SAVED_REG1), 0);
4140 	sljit_emit_fop1(compiler, SLJIT_MOVS, SLJIT_MEM1(SLJIT_SAVED_REG1), 5 * sizeof(sljit_s), SLJIT_FLOAT_REG5, 0);
4141 
4142 	sljit_emit_fop2(compiler, SLJIT_ADDS, SLJIT_FLOAT_REG1, 0, SLJIT_FLOAT_REG1, 0, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_s));
4143 	sljit_emit_fop1(compiler, SLJIT_MOVS, SLJIT_MEM1(SLJIT_SAVED_REG1), 6 * sizeof(sljit_s), SLJIT_FLOAT_REG1, 0);
4144 	sljit_emit_fop2(compiler, SLJIT_SUBS, SLJIT_MEM1(SLJIT_SAVED_REG1), 7 * sizeof(sljit_s), SLJIT_MEM1(SLJIT_SAVED_REG1), 7 * sizeof(sljit_s), SLJIT_FLOAT_REG6, 0);
4145 	sljit_emit_fop1(compiler, SLJIT_MOVS, SLJIT_FLOAT_REG1, 0, SLJIT_MEM1(SLJIT_SAVED_REG1), 0);
4146 	sljit_emit_fop2(compiler, SLJIT_MULS, SLJIT_MEM1(SLJIT_SAVED_REG1), 8 * sizeof(sljit_s), SLJIT_FLOAT_REG1, 0, SLJIT_FLOAT_REG1, 0);
4147 	sljit_emit_fop2(compiler, SLJIT_DIVS, SLJIT_FLOAT_REG3, 0, SLJIT_MEM1(SLJIT_SAVED_REG1), 9 * sizeof(sljit_s), SLJIT_FLOAT_REG1, 0);
4148 	sljit_emit_fop1(compiler, SLJIT_ABSS, SLJIT_MEM1(SLJIT_SAVED_REG1), 9 * sizeof(sljit_s), SLJIT_FLOAT_REG3, 0);
4149 	sljit_emit_op2(compiler, SLJIT_SUB, SLJIT_SCRATCH_REG1, 0, SLJIT_SAVED_REG1, 0, SLJIT_IMM, 0x3d0ac);
4150 	sljit_emit_fop1(compiler, SLJIT_NEGS, SLJIT_MEM1(SLJIT_SAVED_REG1), 10 * sizeof(sljit_s), SLJIT_MEM1(SLJIT_SCRATCH_REG1), 0x3d0ac);
4151 	sljit_emit_op2(compiler, SLJIT_ADD, SLJIT_SCRATCH_REG1, 0, SLJIT_SAVED_REG1, 0, SLJIT_IMM, 0x3d0ac + sizeof(sljit_s));
4152 	sljit_emit_fop1(compiler, SLJIT_ABSS, SLJIT_MEM1(SLJIT_SAVED_REG1), 11 * sizeof(sljit_s), SLJIT_MEM1(SLJIT_SCRATCH_REG1), -0x3d0ac);
4153 
4154 	sljit_emit_fop1(compiler, SLJIT_MOVS, SLJIT_FLOAT_REG2, 0, SLJIT_MEM1(SLJIT_SAVED_REG1), 0);
4155 	sljit_emit_fop1(compiler, SLJIT_MOVS, SLJIT_FLOAT_REG3, 0, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_s));
4156 	sljit_emit_fop1(compiler, SLJIT_CMPS | SLJIT_SET_E | SLJIT_SET_S, SLJIT_FLOAT_REG2, 0, SLJIT_MEM1(SLJIT_SAVED_REG1), 0);
4157 	cond_set(compiler, SLJIT_MEM1(SLJIT_SAVED_REG2), 0, SLJIT_C_FLOAT_EQUAL);
4158 	cond_set(compiler, SLJIT_MEM1(SLJIT_SAVED_REG2), sizeof(sljit_sw), SLJIT_C_FLOAT_LESS);
4159 	sljit_emit_fop1(compiler, SLJIT_CMPS | SLJIT_SET_E, SLJIT_FLOAT_REG2, 0, SLJIT_FLOAT_REG3, 0);
4160 	cond_set(compiler, SLJIT_MEM1(SLJIT_SAVED_REG2), 2 * sizeof(sljit_sw), SLJIT_C_FLOAT_EQUAL);
4161 	sljit_emit_fop1(compiler, SLJIT_CMPS | SLJIT_SET_S, SLJIT_FLOAT_REG2, 0, SLJIT_FLOAT_REG3, 0);
4162 	cond_set(compiler, SLJIT_MEM1(SLJIT_SAVED_REG2), 3 * sizeof(sljit_sw), SLJIT_C_FLOAT_GREATER_EQUAL);
4163 
4164 	jump = sljit_emit_fcmp(compiler, SLJIT_C_FLOAT_LESS_EQUAL | SLJIT_SINGLE_OP, SLJIT_FLOAT_REG2, 0, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_s));
4165 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG2), 4 * sizeof(sljit_sw), SLJIT_IMM, 7);
4166 	sljit_set_label(jump, sljit_emit_label(compiler));
4167 
4168 	jump = sljit_emit_fcmp(compiler, SLJIT_C_FLOAT_GREATER | SLJIT_SINGLE_OP, SLJIT_MEM1(SLJIT_SAVED_REG1), 0, SLJIT_FLOAT_REG3, 0);
4169 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG2), 5 * sizeof(sljit_sw), SLJIT_IMM, 6);
4170 	sljit_set_label(jump, sljit_emit_label(compiler));
4171 
4172 	sljit_emit_return(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0);
4173 
4174 	code.code = sljit_generate_code(compiler);
4175 	CHECK(compiler);
4176 	sljit_free_compiler(compiler);
4177 
4178 	code.func2((sljit_sw)&buf, (sljit_sw)&buf2);
4179 	FAILED(buf[2] != -5.5, "test45 case 1 failed\n");
4180 	FAILED(buf[3] != 7.25, "test45 case 2 failed\n");
4181 	FAILED(buf[4] != 7.25, "test45 case 3 failed\n");
4182 	FAILED(buf[5] != -5.5, "test45 case 4 failed\n");
4183 	FAILED(buf[6] != -1.75, "test45 case 5 failed\n");
4184 	FAILED(buf[7] != 16.0, "test45 case 6 failed\n");
4185 	FAILED(buf[8] != 30.25, "test45 case 7 failed\n");
4186 	FAILED(buf[9] != 3, "test45 case 8 failed\n");
4187 	FAILED(buf[10] != -5.5, "test45 case 9 failed\n");
4188 	FAILED(buf[11] != 7.25, "test45 case 10 failed\n");
4189 	FAILED(buf2[0] != 1, "test45 case 11 failed\n");
4190 	FAILED(buf2[1] != 2, "test45 case 12 failed\n");
4191 	FAILED(buf2[2] != 2, "test45 case 13 failed\n");
4192 	FAILED(buf2[3] != 1, "test45 case 14 failed\n");
4193 	FAILED(buf2[4] != 7, "test45 case 15 failed\n");
4194 	FAILED(buf2[5] != -1, "test45 case 16 failed\n");
4195 
4196 	sljit_free_code(code.code);
4197 	successful_tests++;
4198 }
4199 
4200 static void test46(void)
4201 {
4202 	/* Test sljit_emit_op_flags with 32 bit operations. */
4203 
4204 	executable_code code;
4205 	struct sljit_compiler* compiler = sljit_create_compiler();
4206 	sljit_si buf[24];
4207 	sljit_sw buf2[6];
4208 	sljit_si i;
4209 
4210 	if (verbose)
4211 		printf("Run test46\n");
4212 
4213 	for (i = 0; i < 24; ++i)
4214 		buf[i] = -17;
4215 	buf[16] = 0;
4216 	for (i = 0; i < 6; ++i)
4217 		buf2[i] = -13;
4218 	buf2[4] = -124;
4219 
4220 	sljit_emit_enter(compiler, 2, 3, 3, 0);
4221 
4222 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG3, 0, SLJIT_IMM, -7);
4223 	sljit_emit_op2(compiler, SLJIT_SUB | SLJIT_SET_E | SLJIT_SET_U, SLJIT_UNUSED, 0, SLJIT_SCRATCH_REG3, 0, SLJIT_IMM, 13);
4224 	sljit_emit_op_flags(compiler, SLJIT_MOV_SI, SLJIT_MEM0(), (sljit_sw)&buf, SLJIT_UNUSED, 0, SLJIT_C_LESS);
4225 	sljit_emit_op_flags(compiler, SLJIT_IAND, SLJIT_MEM1(SLJIT_SAVED_REG1), 2 * sizeof(sljit_si), SLJIT_MEM1(SLJIT_SAVED_REG1), 2 * sizeof(sljit_si), SLJIT_C_GREATER);
4226 
4227 	sljit_emit_op2(compiler, SLJIT_SUB | SLJIT_SET_E | SLJIT_SET_U, SLJIT_UNUSED, 0, SLJIT_SCRATCH_REG3, 0, SLJIT_IMM, -7);
4228 	sljit_emit_op_flags(compiler, SLJIT_IAND | SLJIT_KEEP_FLAGS, SLJIT_MEM1(SLJIT_SAVED_REG1), 4 * sizeof(sljit_si), SLJIT_MEM1(SLJIT_SAVED_REG1), 4 * sizeof(sljit_si), SLJIT_C_EQUAL);
4229 	sljit_emit_op_flags(compiler, SLJIT_IAND | SLJIT_KEEP_FLAGS, SLJIT_MEM1(SLJIT_SAVED_REG1), 6 * sizeof(sljit_si), SLJIT_MEM1(SLJIT_SAVED_REG1), 6 * sizeof(sljit_si), SLJIT_C_EQUAL);
4230 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 0x1235);
4231 	sljit_emit_op_flags(compiler, SLJIT_IAND | SLJIT_SET_E, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_C_EQUAL);
4232 	sljit_emit_op_flags(compiler, SLJIT_IAND, SLJIT_MEM1(SLJIT_SAVED_REG1), 8 * sizeof(sljit_si), SLJIT_MEM1(SLJIT_SAVED_REG1), 8 * sizeof(sljit_si), SLJIT_C_EQUAL);
4233 	sljit_emit_op1(compiler, SLJIT_MOV_UI, SLJIT_MEM1(SLJIT_SAVED_REG1), 10 * sizeof(sljit_si), SLJIT_SCRATCH_REG1, 0);
4234 
4235 	sljit_emit_op2(compiler, SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, SLJIT_SCRATCH_REG3, 0, SLJIT_IMM, -7);
4236 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 12);
4237 	sljit_emit_op_flags(compiler, SLJIT_MOV_UI, SLJIT_MEM2(SLJIT_SAVED_REG1, SLJIT_SCRATCH_REG1), 2, SLJIT_UNUSED, 0, SLJIT_C_EQUAL);
4238 	sljit_emit_op_flags(compiler, SLJIT_IMOV, SLJIT_SCRATCH_REG1, 0, SLJIT_UNUSED, 0, SLJIT_C_EQUAL);
4239 	sljit_emit_op1(compiler, SLJIT_MOV_SI, SLJIT_MEM1(SLJIT_SAVED_REG1), 14 * sizeof(sljit_si), SLJIT_SCRATCH_REG1, 0);
4240 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 16);
4241 	sljit_emit_op_flags(compiler, SLJIT_IAND | SLJIT_SET_E, SLJIT_MEM2(SLJIT_SAVED_REG1, SLJIT_SCRATCH_REG1), 2, SLJIT_MEM2(SLJIT_SAVED_REG1, SLJIT_SCRATCH_REG1), 2, SLJIT_C_EQUAL);
4242 	sljit_emit_op_flags(compiler, SLJIT_MOV_UI, SLJIT_MEM1(SLJIT_SAVED_REG1), 18 * sizeof(sljit_si), SLJIT_UNUSED, 0, SLJIT_C_NOT_EQUAL);
4243 
4244 	sljit_emit_op2(compiler, SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, SLJIT_SCRATCH_REG3, 0, SLJIT_IMM, -7);
4245 	sljit_emit_op_flags(compiler, SLJIT_IXOR | SLJIT_KEEP_FLAGS, SLJIT_MEM1(SLJIT_SAVED_REG1), 20 * sizeof(sljit_si), SLJIT_MEM1(SLJIT_SAVED_REG1), 20 * sizeof(sljit_si), SLJIT_C_EQUAL);
4246 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 39);
4247 	sljit_emit_op_flags(compiler, SLJIT_IXOR, SLJIT_SCRATCH_REG1, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_C_EQUAL);
4248 	sljit_emit_op1(compiler, SLJIT_MOV_SI | SLJIT_INT_OP, SLJIT_MEM1(SLJIT_SAVED_REG1), 22 * sizeof(sljit_si), SLJIT_SCRATCH_REG1, 0);
4249 
4250 	sljit_emit_op2(compiler, SLJIT_SUB | SLJIT_SET_E | SLJIT_SET_U, SLJIT_UNUSED, 0, SLJIT_SCRATCH_REG3, 0, SLJIT_IMM, -7);
4251 	sljit_emit_op_flags(compiler, SLJIT_AND, SLJIT_MEM0(), (sljit_sw)&buf2, SLJIT_MEM0(), (sljit_sw)&buf2, SLJIT_C_GREATER);
4252 	sljit_emit_op2(compiler, SLJIT_SUB | SLJIT_SET_E | SLJIT_SET_S | SLJIT_SET_U, SLJIT_UNUSED, 0, SLJIT_SCRATCH_REG3, 0, SLJIT_IMM, 5);
4253 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 1);
4254 	sljit_emit_op_flags(compiler, SLJIT_AND | SLJIT_KEEP_FLAGS, SLJIT_MEM2(SLJIT_SAVED_REG2, SLJIT_SCRATCH_REG1), SLJIT_WORD_SHIFT, SLJIT_MEM2(SLJIT_SAVED_REG2, SLJIT_SCRATCH_REG1), SLJIT_WORD_SHIFT, SLJIT_C_SIG_LESS);
4255 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 2);
4256 	sljit_emit_op_flags(compiler, SLJIT_MOV, SLJIT_MEM2(SLJIT_SAVED_REG2, SLJIT_SCRATCH_REG1), SLJIT_WORD_SHIFT, SLJIT_UNUSED, 0, SLJIT_C_LESS);
4257 	sljit_emit_op_flags(compiler, SLJIT_MOV, SLJIT_SAVED_REG3, 0, SLJIT_UNUSED, 0, SLJIT_C_NOT_EQUAL);
4258 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG2), 3 * sizeof(sljit_sw), SLJIT_SAVED_REG3, 0);
4259 	sljit_emit_op_flags(compiler, SLJIT_OR, SLJIT_MEM1(SLJIT_SAVED_REG2), 4 * sizeof(sljit_sw), SLJIT_MEM1(SLJIT_SAVED_REG2), 4 * sizeof(sljit_sw), SLJIT_C_GREATER);
4260 	sljit_emit_op2(compiler, SLJIT_SUB | SLJIT_SET_U, SLJIT_UNUSED, 0, SLJIT_SCRATCH_REG3, 0, SLJIT_IMM, 0);
4261 	sljit_emit_op_flags(compiler, SLJIT_XOR, SLJIT_MEM1(SLJIT_SAVED_REG2), 5 * sizeof(sljit_sw), SLJIT_MEM1(SLJIT_SAVED_REG2), 5 * sizeof(sljit_sw), SLJIT_C_GREATER);
4262 
4263 	sljit_emit_return(compiler, SLJIT_UNUSED, 0, 0);
4264 
4265 	code.code = sljit_generate_code(compiler);
4266 	CHECK(compiler);
4267 	sljit_free_compiler(compiler);
4268 
4269 	code.func2((sljit_sw)&buf, (sljit_sw)&buf2);
4270 	FAILED(buf[0] != 0, "test46 case 1 failed\n");
4271 	FAILED(buf[1] != -17, "test46 case 2 failed\n");
4272 	FAILED(buf[2] != 1, "test46 case 3 failed\n");
4273 	FAILED(buf[3] != -17, "test46 case 4 failed\n");
4274 	FAILED(buf[4] != 1, "test46 case 5 failed\n");
4275 	FAILED(buf[5] != -17, "test46 case 6 failed\n");
4276 	FAILED(buf[6] != 1, "test46 case 7 failed\n");
4277 	FAILED(buf[7] != -17, "test46 case 8 failed\n");
4278 	FAILED(buf[8] != 0, "test46 case 9 failed\n");
4279 	FAILED(buf[9] != -17, "test46 case 10 failed\n");
4280 	FAILED(buf[10] != 1, "test46 case 11 failed\n");
4281 	FAILED(buf[11] != -17, "test46 case 12 failed\n");
4282 	FAILED(buf[12] != 1, "test46 case 13 failed\n");
4283 	FAILED(buf[13] != -17, "test46 case 14 failed\n");
4284 	FAILED(buf[14] != 1, "test46 case 15 failed\n");
4285 	FAILED(buf[15] != -17, "test46 case 16 failed\n");
4286 	FAILED(buf[16] != 0, "test46 case 17 failed\n");
4287 	FAILED(buf[17] != -17, "test46 case 18 failed\n");
4288 	FAILED(buf[18] != 0, "test46 case 19 failed\n");
4289 	FAILED(buf[19] != -17, "test46 case 20 failed\n");
4290 	FAILED(buf[20] != -18, "test46 case 21 failed\n");
4291 	FAILED(buf[21] != -17, "test46 case 22 failed\n");
4292 	FAILED(buf[22] != 38, "test46 case 23 failed\n");
4293 	FAILED(buf[23] != -17, "test46 case 24 failed\n");
4294 
4295 	FAILED(buf2[0] != 0, "test46 case 25 failed\n");
4296 	FAILED(buf2[1] != 1, "test46 case 26 failed\n");
4297 	FAILED(buf2[2] != 0, "test46 case 27 failed\n");
4298 	FAILED(buf2[3] != 1, "test46 case 28 failed\n");
4299 	FAILED(buf2[4] != -123, "test46 case 29 failed\n");
4300 	FAILED(buf2[5] != -14, "test46 case 30 failed\n");
4301 
4302 	sljit_free_code(code.code);
4303 	successful_tests++;
4304 }
4305 
4306 static void test47(void)
4307 {
4308 	/* Test jump optimizations. */
4309 	executable_code code;
4310 	struct sljit_compiler* compiler = sljit_create_compiler();
4311 	sljit_sw buf[3];
4312 
4313 	if (verbose)
4314 		printf("Run test47\n");
4315 
4316 	FAILED(!compiler, "cannot create compiler\n");
4317 	buf[0] = 0;
4318 	buf[1] = 0;
4319 	buf[2] = 0;
4320 
4321 	sljit_emit_enter(compiler, 1, 3, 1, 0);
4322 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 0x3a5c6f);
4323 	sljit_emit_op2(compiler, SLJIT_SUB | SLJIT_SET_U, SLJIT_UNUSED, 0, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 3);
4324 	sljit_set_target(sljit_emit_jump(compiler, SLJIT_C_LESS), 0x11223344);
4325 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), 0, SLJIT_SCRATCH_REG1, 0);
4326 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 0xd37c10);
4327 #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
4328 	sljit_set_target(sljit_emit_jump(compiler, SLJIT_C_LESS), SLJIT_W(0x112233445566));
4329 #endif
4330 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), sizeof(sljit_sw), SLJIT_SCRATCH_REG1, 0);
4331 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_SCRATCH_REG1, 0, SLJIT_IMM, 0x59b48e);
4332 #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
4333 	sljit_set_target(sljit_emit_jump(compiler, SLJIT_C_LESS), SLJIT_W(0x1122334455667788));
4334 #endif
4335 	sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM1(SLJIT_SAVED_REG1), 2 * sizeof(sljit_sw), SLJIT_SCRATCH_REG1, 0);
4336 	sljit_emit_return(compiler, SLJIT_MOV, SLJIT_RETURN_REG, 0);
4337 
4338 	code.code = sljit_generate_code(compiler);
4339 	CHECK(compiler);
4340 	sljit_free_compiler(compiler);
4341 
4342 	code.func1((sljit_sw)&buf);
4343 	FAILED(buf[0] != 0x3a5c6f, "test47 case 1 failed\n");
4344 	FAILED(buf[1] != 0xd37c10, "test47 case 2 failed\n");
4345 	FAILED(buf[2] != 0x59b48e, "test47 case 3 failed\n");
4346 
4347 	sljit_free_code(code.code);
4348 	successful_tests++;
4349 }
4350 
4351 void sljit_test(int argc, char* argv[]);
4352 void sljit_test(int argc, char* argv[])
4353 {
4354 	sljit_si has_arg = (argc >= 2 && argv[1][0] == '-' && argv[1][2] == '\0');
4355 	verbose = has_arg && argv[1][1] == 'v';
4356 	silent = has_arg && argv[1][1] == 's';
4357 
4358 	if (!verbose && !silent)
4359 		printf("Pass -v to enable verbose, -s to disable this hint.\n\n");
4360 
4361 #if !(defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED)
4362 	test_exec_allocator();
4363 #endif
4364 	test1();
4365 	test2();
4366 	test3();
4367 	test4();
4368 	test5();
4369 	test6();
4370 	test7();
4371 	test8();
4372 	test9();
4373 	test10();
4374 	test11();
4375 	test12();
4376 	test13();
4377 	test14();
4378 	test15();
4379 	test16();
4380 	test17();
4381 	test18();
4382 	test19();
4383 	test20();
4384 	test21();
4385 	test22();
4386 	test23();
4387 	test24();
4388 	test25();
4389 	test26();
4390 	test27();
4391 	test28();
4392 	test29();
4393 	test30();
4394 	test31();
4395 	test32();
4396 	test33();
4397 	test34();
4398 	test35();
4399 	test36();
4400 	test37();
4401 	test38();
4402 	test39();
4403 	test40();
4404 	test41();
4405 	test42();
4406 	test43();
4407 	test44();
4408 	test45();
4409 	test46();
4410 	test47();
4411 
4412 #if (defined SLJIT_EXECUTABLE_ALLOCATOR && SLJIT_EXECUTABLE_ALLOCATOR)
4413 	sljit_free_unused_memory_exec();
4414 #endif
4415 
4416 	printf("SLJIT tests: On " COLOR_ARCH "%s" COLOR_DEFAULT "%s: ", sljit_get_platform_name(), sljit_is_fpu_available() ? " (+fpu)" : "");
4417 	if (successful_tests == 47)
4418 		printf("All tests are " COLOR_GREEN "PASSED" COLOR_DEFAULT "!\n");
4419 	else
4420 		printf("Successful test ratio: " COLOR_RED "%d%%" COLOR_DEFAULT ".\n", successful_tests * 100 / 47);
4421 }
4422