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