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