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