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