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