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