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