Annotation of win32/pcre/sljit/sljitLir.c, revision 1.1
1.1 ! misha 1: /*
! 2: * Stack-less Just-In-Time compiler
! 3: *
! 4: * Copyright 2009-2012 Zoltan Herczeg (hzmester@freemail.hu). All rights reserved.
! 5: *
! 6: * Redistribution and use in source and binary forms, with or without modification, are
! 7: * permitted provided that the following conditions are met:
! 8: *
! 9: * 1. Redistributions of source code must retain the above copyright notice, this list of
! 10: * conditions and the following disclaimer.
! 11: *
! 12: * 2. Redistributions in binary form must reproduce the above copyright notice, this list
! 13: * of conditions and the following disclaimer in the documentation and/or other materials
! 14: * provided with the distribution.
! 15: *
! 16: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND CONTRIBUTORS ``AS IS'' AND ANY
! 17: * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
! 18: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
! 19: * SHALL THE COPYRIGHT HOLDER(S) OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
! 20: * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
! 21: * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
! 22: * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
! 23: * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
! 24: * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
! 25: */
! 26:
! 27: #include "sljitLir.h"
! 28:
! 29: #define CHECK_ERROR() \
! 30: do { \
! 31: if (SLJIT_UNLIKELY(compiler->error)) \
! 32: return compiler->error; \
! 33: } while (0)
! 34:
! 35: #define CHECK_ERROR_PTR() \
! 36: do { \
! 37: if (SLJIT_UNLIKELY(compiler->error)) \
! 38: return NULL; \
! 39: } while (0)
! 40:
! 41: #define CHECK_ERROR_VOID() \
! 42: do { \
! 43: if (SLJIT_UNLIKELY(compiler->error)) \
! 44: return; \
! 45: } while (0)
! 46:
! 47: #define FAIL_IF(expr) \
! 48: do { \
! 49: if (SLJIT_UNLIKELY(expr)) \
! 50: return compiler->error; \
! 51: } while (0)
! 52:
! 53: #define PTR_FAIL_IF(expr) \
! 54: do { \
! 55: if (SLJIT_UNLIKELY(expr)) \
! 56: return NULL; \
! 57: } while (0)
! 58:
! 59: #define FAIL_IF_NULL(ptr) \
! 60: do { \
! 61: if (SLJIT_UNLIKELY(!(ptr))) { \
! 62: compiler->error = SLJIT_ERR_ALLOC_FAILED; \
! 63: return SLJIT_ERR_ALLOC_FAILED; \
! 64: } \
! 65: } while (0)
! 66:
! 67: #define PTR_FAIL_IF_NULL(ptr) \
! 68: do { \
! 69: if (SLJIT_UNLIKELY(!(ptr))) { \
! 70: compiler->error = SLJIT_ERR_ALLOC_FAILED; \
! 71: return NULL; \
! 72: } \
! 73: } while (0)
! 74:
! 75: #define PTR_FAIL_WITH_EXEC_IF(ptr) \
! 76: do { \
! 77: if (SLJIT_UNLIKELY(!(ptr))) { \
! 78: compiler->error = SLJIT_ERR_EX_ALLOC_FAILED; \
! 79: return NULL; \
! 80: } \
! 81: } while (0)
! 82:
! 83: #if !(defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED)
! 84:
! 85: #define GET_OPCODE(op) \
! 86: ((op) & ~(SLJIT_INT_OP | SLJIT_SET_E | SLJIT_SET_S | SLJIT_SET_U | SLJIT_SET_O | SLJIT_SET_C | SLJIT_KEEP_FLAGS))
! 87:
! 88: #define GET_FLAGS(op) \
! 89: ((op) & (SLJIT_SET_E | SLJIT_SET_S | SLJIT_SET_U | SLJIT_SET_O | SLJIT_SET_C))
! 90:
! 91: #define GET_ALL_FLAGS(op) \
! 92: ((op) & (SLJIT_SET_E | SLJIT_SET_S | SLJIT_SET_U | SLJIT_SET_O | SLJIT_SET_C | SLJIT_KEEP_FLAGS))
! 93:
! 94: #define BUF_SIZE 4096
! 95:
! 96: #if (defined SLJIT_32BIT_ARCHITECTURE && SLJIT_32BIT_ARCHITECTURE)
! 97: #define ABUF_SIZE 2048
! 98: #else
! 99: #define ABUF_SIZE 4096
! 100: #endif
! 101:
! 102: /* Jump flags. */
! 103: #define JUMP_LABEL 0x1
! 104: #define JUMP_ADDR 0x2
! 105: /* SLJIT_REWRITABLE_JUMP is 0x1000. */
! 106:
! 107: #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) || (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
! 108: #define PATCH_MB 0x4
! 109: #define PATCH_MW 0x8
! 110: #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
! 111: #define PATCH_MD 0x10
! 112: #endif
! 113: #endif
! 114:
! 115: #if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) || (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7)
! 116: #define IS_BL 0x4
! 117: #define PATCH_B 0x8
! 118: #endif
! 119:
! 120: #if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)
! 121: #define CPOOL_SIZE 512
! 122: #endif
! 123:
! 124: #if (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2)
! 125: #define IS_CONDITIONAL 0x04
! 126: #define IS_BL 0x08
! 127: /* cannot be encoded as branch */
! 128: #define B_TYPE0 0x00
! 129: /* conditional + imm8 */
! 130: #define B_TYPE1 0x10
! 131: /* conditional + imm20 */
! 132: #define B_TYPE2 0x20
! 133: /* IT + imm24 */
! 134: #define B_TYPE3 0x30
! 135: /* imm11 */
! 136: #define B_TYPE4 0x40
! 137: /* imm24 */
! 138: #define B_TYPE5 0x50
! 139: /* BL + imm24 */
! 140: #define BL_TYPE6 0x60
! 141: /* 0xf00 cc code for branches */
! 142: #endif
! 143:
! 144: #if (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) || (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
! 145: #define UNCOND_B 0x04
! 146: #define PATCH_B 0x08
! 147: #define ABSOLUTE_B 0x10
! 148: #endif
! 149:
! 150: #if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)
! 151: #define IS_MOVABLE 0x04
! 152: #define IS_JAL 0x08
! 153: #define IS_BIT26_COND 0x10
! 154: #define IS_BIT16_COND 0x20
! 155:
! 156: #define IS_COND (IS_BIT26_COND | IS_BIT16_COND)
! 157:
! 158: #define PATCH_B 0x40
! 159: #define PATCH_J 0x80
! 160:
! 161: /* instruction types */
! 162: #define UNMOVABLE_INS 0
! 163: /* 1 - 31 last destination register */
! 164: #define FCSR_FCC 32
! 165: /* no destination (i.e: store) */
! 166: #define MOVABLE_INS 33
! 167: #endif
! 168:
! 169: #endif /* !(defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED) */
! 170:
! 171: /* Utils can still be used even if SLJIT_CONFIG_UNSUPPORTED is set. */
! 172: #include "sljitUtils.c"
! 173:
! 174: #if !(defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED)
! 175:
! 176: #if (defined SLJIT_EXECUTABLE_ALLOCATOR && SLJIT_EXECUTABLE_ALLOCATOR)
! 177: #include "sljitExecAllocator.c"
! 178: #endif
! 179:
! 180: #if (defined SLJIT_SSE2_AUTO && SLJIT_SSE2_AUTO) && !(defined SLJIT_SSE2 && SLJIT_SSE2)
! 181: #error SLJIT_SSE2_AUTO cannot be enabled without SLJIT_SSE2
! 182: #endif
! 183:
! 184: /* --------------------------------------------------------------------- */
! 185: /* Public functions */
! 186: /* --------------------------------------------------------------------- */
! 187:
! 188: #if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) || ((defined SLJIT_SSE2 && SLJIT_SSE2) && ((defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) || (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)))
! 189: #define SLJIT_NEEDS_COMPILER_INIT 1
! 190: static int compiler_initialized = 0;
! 191: /* A thread safe initialization. */
! 192: static void init_compiler(void);
! 193: #endif
! 194:
! 195:
! 196: SLJIT_API_FUNC_ATTRIBUTE struct sljit_compiler* sljit_create_compiler(void)
! 197: {
! 198: struct sljit_compiler *compiler = (struct sljit_compiler*)SLJIT_MALLOC(sizeof(struct sljit_compiler));
! 199: if (!compiler)
! 200: return NULL;
! 201: SLJIT_ZEROMEM(compiler, sizeof(struct sljit_compiler));
! 202:
! 203: SLJIT_COMPILE_ASSERT(
! 204: sizeof(sljit_b) == 1 && sizeof(sljit_ub) == 1
! 205: && sizeof(sljit_h) == 2 && sizeof(sljit_uh) == 2
! 206: && sizeof(sljit_i) == 4 && sizeof(sljit_ui) == 4
! 207: && ((sizeof(sljit_w) == 4 && sizeof(sljit_uw) == 4) || (sizeof(sljit_w) == 8 && sizeof(sljit_uw) == 8)),
! 208: invalid_integer_types);
! 209:
! 210: /* Only the non-zero members must be set. */
! 211: compiler->error = SLJIT_SUCCESS;
! 212:
! 213: compiler->buf = (struct sljit_memory_fragment*)SLJIT_MALLOC(BUF_SIZE);
! 214: compiler->abuf = (struct sljit_memory_fragment*)SLJIT_MALLOC(ABUF_SIZE);
! 215:
! 216: if (!compiler->buf || !compiler->abuf) {
! 217: if (compiler->buf)
! 218: SLJIT_FREE(compiler->buf);
! 219: if (compiler->abuf)
! 220: SLJIT_FREE(compiler->abuf);
! 221: SLJIT_FREE(compiler);
! 222: return NULL;
! 223: }
! 224:
! 225: compiler->buf->next = NULL;
! 226: compiler->buf->used_size = 0;
! 227: compiler->abuf->next = NULL;
! 228: compiler->abuf->used_size = 0;
! 229:
! 230: compiler->temporaries = -1;
! 231: compiler->saveds = -1;
! 232:
! 233: #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
! 234: compiler->args = -1;
! 235: #endif
! 236:
! 237: #if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)
! 238: compiler->cpool = (sljit_uw*)SLJIT_MALLOC(CPOOL_SIZE * sizeof(sljit_uw) + CPOOL_SIZE * sizeof(sljit_ub));
! 239: if (!compiler->cpool) {
! 240: SLJIT_FREE(compiler->buf);
! 241: SLJIT_FREE(compiler->abuf);
! 242: SLJIT_FREE(compiler);
! 243: return NULL;
! 244: }
! 245: compiler->cpool_unique = (sljit_ub*)(compiler->cpool + CPOOL_SIZE);
! 246: compiler->cpool_diff = 0xffffffff;
! 247: #endif
! 248:
! 249: #if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)
! 250: compiler->delay_slot = UNMOVABLE_INS;
! 251: #endif
! 252:
! 253: #if (defined SLJIT_NEEDS_COMPILER_INIT && SLJIT_NEEDS_COMPILER_INIT)
! 254: if (!compiler_initialized) {
! 255: init_compiler();
! 256: compiler_initialized = 1;
! 257: }
! 258: #endif
! 259:
! 260: return compiler;
! 261: }
! 262:
! 263: SLJIT_API_FUNC_ATTRIBUTE void sljit_free_compiler(struct sljit_compiler *compiler)
! 264: {
! 265: struct sljit_memory_fragment *buf;
! 266: struct sljit_memory_fragment *curr;
! 267:
! 268: buf = compiler->buf;
! 269: while (buf) {
! 270: curr = buf;
! 271: buf = buf->next;
! 272: SLJIT_FREE(curr);
! 273: }
! 274:
! 275: buf = compiler->abuf;
! 276: while (buf) {
! 277: curr = buf;
! 278: buf = buf->next;
! 279: SLJIT_FREE(curr);
! 280: }
! 281:
! 282: #if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)
! 283: SLJIT_FREE(compiler->cpool);
! 284: #endif
! 285: SLJIT_FREE(compiler);
! 286: }
! 287:
! 288: #if (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2)
! 289: SLJIT_API_FUNC_ATTRIBUTE void sljit_free_code(void* code)
! 290: {
! 291: /* Remove thumb mode flag. */
! 292: SLJIT_FREE_EXEC((void*)((sljit_uw)code & ~0x1));
! 293: }
! 294: #elif (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
! 295: SLJIT_API_FUNC_ATTRIBUTE void sljit_free_code(void* code)
! 296: {
! 297: /* Resolve indirection. */
! 298: code = (void*)(*(sljit_uw*)code);
! 299: SLJIT_FREE_EXEC(code);
! 300: }
! 301: #else
! 302: SLJIT_API_FUNC_ATTRIBUTE void sljit_free_code(void* code)
! 303: {
! 304: SLJIT_FREE_EXEC(code);
! 305: }
! 306: #endif
! 307:
! 308: SLJIT_API_FUNC_ATTRIBUTE void sljit_set_label(struct sljit_jump *jump, struct sljit_label* label)
! 309: {
! 310: if (SLJIT_LIKELY(!!jump) && SLJIT_LIKELY(!!label)) {
! 311: jump->flags &= ~JUMP_ADDR;
! 312: jump->flags |= JUMP_LABEL;
! 313: jump->u.label = label;
! 314: }
! 315: }
! 316:
! 317: SLJIT_API_FUNC_ATTRIBUTE void sljit_set_target(struct sljit_jump *jump, sljit_uw target)
! 318: {
! 319: if (SLJIT_LIKELY(!!jump)) {
! 320: SLJIT_ASSERT(jump->flags & SLJIT_REWRITABLE_JUMP);
! 321:
! 322: jump->flags &= ~JUMP_LABEL;
! 323: jump->flags |= JUMP_ADDR;
! 324: jump->u.target = target;
! 325: }
! 326: }
! 327:
! 328: /* --------------------------------------------------------------------- */
! 329: /* Private functions */
! 330: /* --------------------------------------------------------------------- */
! 331:
! 332: static void* ensure_buf(struct sljit_compiler *compiler, int size)
! 333: {
! 334: sljit_ub *ret;
! 335: struct sljit_memory_fragment *new_frag;
! 336:
! 337: if (compiler->buf->used_size + size <= (int)(BUF_SIZE - sizeof(sljit_uw) - sizeof(void*))) {
! 338: ret = compiler->buf->memory + compiler->buf->used_size;
! 339: compiler->buf->used_size += size;
! 340: return ret;
! 341: }
! 342: new_frag = (struct sljit_memory_fragment*)SLJIT_MALLOC(BUF_SIZE);
! 343: PTR_FAIL_IF_NULL(new_frag);
! 344: new_frag->next = compiler->buf;
! 345: compiler->buf = new_frag;
! 346: new_frag->used_size = size;
! 347: return new_frag->memory;
! 348: }
! 349:
! 350: static void* ensure_abuf(struct sljit_compiler *compiler, int size)
! 351: {
! 352: sljit_ub *ret;
! 353: struct sljit_memory_fragment *new_frag;
! 354:
! 355: if (compiler->abuf->used_size + size <= (int)(ABUF_SIZE - sizeof(sljit_uw) - sizeof(void*))) {
! 356: ret = compiler->abuf->memory + compiler->abuf->used_size;
! 357: compiler->abuf->used_size += size;
! 358: return ret;
! 359: }
! 360: new_frag = (struct sljit_memory_fragment*)SLJIT_MALLOC(ABUF_SIZE);
! 361: PTR_FAIL_IF_NULL(new_frag);
! 362: new_frag->next = compiler->abuf;
! 363: compiler->abuf = new_frag;
! 364: new_frag->used_size = size;
! 365: return new_frag->memory;
! 366: }
! 367:
! 368: SLJIT_API_FUNC_ATTRIBUTE void* sljit_alloc_memory(struct sljit_compiler *compiler, int size)
! 369: {
! 370: CHECK_ERROR_PTR();
! 371:
! 372: #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
! 373: if (size <= 0 || size > 128)
! 374: return NULL;
! 375: size = (size + 7) & ~7;
! 376: #else
! 377: if (size <= 0 || size > 64)
! 378: return NULL;
! 379: size = (size + 3) & ~3;
! 380: #endif
! 381: return ensure_abuf(compiler, size);
! 382: }
! 383:
! 384: static SLJIT_INLINE void reverse_buf(struct sljit_compiler *compiler)
! 385: {
! 386: struct sljit_memory_fragment *buf = compiler->buf;
! 387: struct sljit_memory_fragment *prev = NULL;
! 388: struct sljit_memory_fragment *tmp;
! 389:
! 390: do {
! 391: tmp = buf->next;
! 392: buf->next = prev;
! 393: prev = buf;
! 394: buf = tmp;
! 395: } while (buf != NULL);
! 396:
! 397: compiler->buf = prev;
! 398: }
! 399:
! 400: static SLJIT_INLINE void set_label(struct sljit_label *label, struct sljit_compiler *compiler)
! 401: {
! 402: label->next = NULL;
! 403: label->size = compiler->size;
! 404: if (compiler->last_label)
! 405: compiler->last_label->next = label;
! 406: else
! 407: compiler->labels = label;
! 408: compiler->last_label = label;
! 409: }
! 410:
! 411: static SLJIT_INLINE void set_jump(struct sljit_jump *jump, struct sljit_compiler *compiler, int flags)
! 412: {
! 413: jump->next = NULL;
! 414: jump->flags = flags;
! 415: if (compiler->last_jump)
! 416: compiler->last_jump->next = jump;
! 417: else
! 418: compiler->jumps = jump;
! 419: compiler->last_jump = jump;
! 420: }
! 421:
! 422: static SLJIT_INLINE void set_const(struct sljit_const *const_, struct sljit_compiler *compiler)
! 423: {
! 424: const_->next = NULL;
! 425: const_->addr = compiler->size;
! 426: if (compiler->last_const)
! 427: compiler->last_const->next = const_;
! 428: else
! 429: compiler->consts = const_;
! 430: compiler->last_const = const_;
! 431: }
! 432:
! 433: #define ADDRESSING_DEPENDS_ON(exp, reg) \
! 434: (((exp) & SLJIT_MEM) && (((exp) & 0xf) == reg || (((exp) >> 4) & 0xf) == reg))
! 435:
! 436: #if (defined SLJIT_DEBUG && SLJIT_DEBUG)
! 437: #define FUNCTION_CHECK_OP() \
! 438: SLJIT_ASSERT(!GET_FLAGS(op) || !(op & SLJIT_KEEP_FLAGS)); \
! 439: switch (GET_OPCODE(op)) { \
! 440: case SLJIT_NOT: \
! 441: case SLJIT_CLZ: \
! 442: case SLJIT_AND: \
! 443: case SLJIT_OR: \
! 444: case SLJIT_XOR: \
! 445: case SLJIT_SHL: \
! 446: case SLJIT_LSHR: \
! 447: case SLJIT_ASHR: \
! 448: SLJIT_ASSERT(!(op & (SLJIT_SET_S | SLJIT_SET_U | SLJIT_SET_O | SLJIT_SET_C))); \
! 449: break; \
! 450: case SLJIT_NEG: \
! 451: SLJIT_ASSERT(!(op & (SLJIT_SET_S | SLJIT_SET_U | SLJIT_SET_C))); \
! 452: break; \
! 453: case SLJIT_MUL: \
! 454: SLJIT_ASSERT(!(op & (SLJIT_SET_E | SLJIT_SET_S | SLJIT_SET_U | SLJIT_SET_C))); \
! 455: break; \
! 456: case SLJIT_FCMP: \
! 457: SLJIT_ASSERT(!(op & (SLJIT_INT_OP | SLJIT_SET_U | SLJIT_SET_O | SLJIT_SET_C | SLJIT_KEEP_FLAGS))); \
! 458: SLJIT_ASSERT((op & (SLJIT_SET_E | SLJIT_SET_S))); \
! 459: break; \
! 460: case SLJIT_ADD: \
! 461: SLJIT_ASSERT(!(op & (SLJIT_SET_S | SLJIT_SET_U))); \
! 462: break; \
! 463: case SLJIT_SUB: \
! 464: break; \
! 465: case SLJIT_ADDC: \
! 466: case SLJIT_SUBC: \
! 467: SLJIT_ASSERT(!(op & (SLJIT_SET_E | SLJIT_SET_S | SLJIT_SET_U | SLJIT_SET_O))); \
! 468: break; \
! 469: default: \
! 470: /* Nothing allowed */ \
! 471: SLJIT_ASSERT(!(op & (SLJIT_INT_OP | SLJIT_SET_E | SLJIT_SET_S | SLJIT_SET_U | SLJIT_SET_O | SLJIT_SET_C | SLJIT_KEEP_FLAGS))); \
! 472: break; \
! 473: }
! 474:
! 475: #define FUNCTION_CHECK_IS_REG(r) \
! 476: ((r) == SLJIT_UNUSED || (r) == SLJIT_LOCALS_REG || \
! 477: ((r) >= SLJIT_TEMPORARY_REG1 && (r) <= SLJIT_TEMPORARY_REG3 && (r) <= SLJIT_TEMPORARY_REG1 - 1 + compiler->temporaries) || \
! 478: ((r) >= SLJIT_SAVED_REG1 && (r) <= SLJIT_SAVED_REG3 && (r) <= SLJIT_SAVED_REG1 - 1 + compiler->saveds)) \
! 479:
! 480: #define FUNCTION_CHECK_SRC(p, i) \
! 481: SLJIT_ASSERT(compiler->temporaries != -1 && compiler->saveds != -1); \
! 482: if (((p) >= SLJIT_TEMPORARY_REG1 && (p) <= SLJIT_TEMPORARY_REG1 - 1 + compiler->temporaries) || \
! 483: ((p) >= SLJIT_SAVED_REG1 && (p) <= SLJIT_SAVED_REG1 - 1 + compiler->saveds) || \
! 484: (p) == SLJIT_LOCALS_REG) \
! 485: SLJIT_ASSERT(i == 0); \
! 486: else if ((p) == SLJIT_IMM) \
! 487: ; \
! 488: else if ((p) & SLJIT_MEM) { \
! 489: SLJIT_ASSERT(FUNCTION_CHECK_IS_REG((p) & 0xf)); \
! 490: if ((p) & 0xf0) { \
! 491: SLJIT_ASSERT(FUNCTION_CHECK_IS_REG(((p) >> 4) & 0xf)); \
! 492: SLJIT_ASSERT(((p) & 0xf0) != (SLJIT_LOCALS_REG << 4) && !(i & ~0x3)); \
! 493: } else \
! 494: SLJIT_ASSERT((((p) >> 4) & 0xf) == 0); \
! 495: SLJIT_ASSERT(((p) >> 9) == 0); \
! 496: } \
! 497: else \
! 498: SLJIT_ASSERT_STOP();
! 499:
! 500: #define FUNCTION_CHECK_DST(p, i) \
! 501: SLJIT_ASSERT(compiler->temporaries != -1 && compiler->saveds != -1); \
! 502: if (((p) >= SLJIT_TEMPORARY_REG1 && (p) <= SLJIT_TEMPORARY_REG1 - 1 + compiler->temporaries) || \
! 503: ((p) >= SLJIT_SAVED_REG1 && (p) <= SLJIT_SAVED_REG1 - 1 + compiler->saveds) || \
! 504: (p) == SLJIT_UNUSED) \
! 505: SLJIT_ASSERT(i == 0); \
! 506: else if ((p) & SLJIT_MEM) { \
! 507: SLJIT_ASSERT(FUNCTION_CHECK_IS_REG((p) & 0xf)); \
! 508: if ((p) & 0xf0) { \
! 509: SLJIT_ASSERT(FUNCTION_CHECK_IS_REG(((p) >> 4) & 0xf)); \
! 510: SLJIT_ASSERT(((p) & 0xf0) != (SLJIT_LOCALS_REG << 4) && !(i & ~0x3)); \
! 511: } else \
! 512: SLJIT_ASSERT((((p) >> 4) & 0xf) == 0); \
! 513: SLJIT_ASSERT(((p) >> 9) == 0); \
! 514: } \
! 515: else \
! 516: SLJIT_ASSERT_STOP();
! 517:
! 518: #define FUNCTION_FCHECK(p, i) \
! 519: if ((p) >= SLJIT_FLOAT_REG1 && (p) <= SLJIT_FLOAT_REG4) \
! 520: SLJIT_ASSERT(i == 0); \
! 521: else if ((p) & SLJIT_MEM) { \
! 522: SLJIT_ASSERT(FUNCTION_CHECK_IS_REG((p) & 0xf)); \
! 523: if ((p) & 0xf0) { \
! 524: SLJIT_ASSERT(FUNCTION_CHECK_IS_REG(((p) >> 4) & 0xf)); \
! 525: SLJIT_ASSERT(((p) & 0xf0) != (SLJIT_LOCALS_REG << 4) && !(i & ~0x3)); \
! 526: } else \
! 527: SLJIT_ASSERT((((p) >> 4) & 0xf) == 0); \
! 528: SLJIT_ASSERT(((p) >> 9) == 0); \
! 529: } \
! 530: else \
! 531: SLJIT_ASSERT_STOP();
! 532:
! 533: #define FUNCTION_CHECK_OP1() \
! 534: if (GET_OPCODE(op) >= SLJIT_MOV && GET_OPCODE(op) <= SLJIT_MOVU_SI) { \
! 535: SLJIT_ASSERT(!GET_ALL_FLAGS(op)); \
! 536: } \
! 537: if (GET_OPCODE(op) >= SLJIT_MOVU && GET_OPCODE(op) <= SLJIT_MOVU_SI) { \
! 538: SLJIT_ASSERT(!(src & SLJIT_MEM) || (src & 0xf) != SLJIT_LOCALS_REG); \
! 539: SLJIT_ASSERT(!(dst & SLJIT_MEM) || (dst & 0xf) != SLJIT_LOCALS_REG); \
! 540: if ((src & SLJIT_MEM) && (src & 0xf)) \
! 541: SLJIT_ASSERT((dst & 0xf) != (src & 0xf) && ((dst >> 4) & 0xf) != (src & 0xf)); \
! 542: }
! 543:
! 544: #endif
! 545:
! 546: #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
! 547:
! 548: SLJIT_API_FUNC_ATTRIBUTE void sljit_compiler_verbose(struct sljit_compiler *compiler, FILE* verbose)
! 549: {
! 550: compiler->verbose = verbose;
! 551: }
! 552:
! 553: static char* reg_names[] = {
! 554: (char*)"<noreg>", (char*)"t1", (char*)"t2", (char*)"t3",
! 555: (char*)"te1", (char*)"te2", (char*)"s1", (char*)"s2",
! 556: (char*)"s3", (char*)"se1", (char*)"se2", (char*)"lcr"
! 557: };
! 558:
! 559: static char* freg_names[] = {
! 560: (char*)"<noreg>", (char*)"float_r1", (char*)"float_r2", (char*)"float_r3", (char*)"float_r4"
! 561: };
! 562:
! 563: #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) || (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
! 564: #ifdef _WIN64
! 565: #define SLJIT_PRINT_D "I64"
! 566: #else
! 567: #define SLJIT_PRINT_D "l"
! 568: #endif
! 569: #else
! 570: #define SLJIT_PRINT_D ""
! 571: #endif
! 572:
! 573: #define sljit_verbose_param(p, i) \
! 574: if ((p) & SLJIT_IMM) \
! 575: fprintf(compiler->verbose, "#%"SLJIT_PRINT_D"d", (i)); \
! 576: else if ((p) & SLJIT_MEM) { \
! 577: if ((p) & 0xf) { \
! 578: if (i) { \
! 579: if (((p) >> 4) & 0xf) \
! 580: fprintf(compiler->verbose, "[%s + %s * %d]", reg_names[(p) & 0xF], reg_names[((p) >> 4)& 0xF], 1 << (i)); \
! 581: else \
! 582: fprintf(compiler->verbose, "[%s + #%"SLJIT_PRINT_D"d]", reg_names[(p) & 0xF], (i)); \
! 583: } \
! 584: else { \
! 585: if (((p) >> 4) & 0xf) \
! 586: fprintf(compiler->verbose, "[%s + %s]", reg_names[(p) & 0xF], reg_names[((p) >> 4)& 0xF]); \
! 587: else \
! 588: fprintf(compiler->verbose, "[%s]", reg_names[(p) & 0xF]); \
! 589: } \
! 590: } \
! 591: else \
! 592: fprintf(compiler->verbose, "[#%"SLJIT_PRINT_D"d]", (i)); \
! 593: } else \
! 594: fprintf(compiler->verbose, "%s", reg_names[p]);
! 595: #define sljit_verbose_fparam(p, i) \
! 596: if ((p) & SLJIT_MEM) { \
! 597: if ((p) & 0xf) { \
! 598: if (i) { \
! 599: if (((p) >> 4) & 0xf) \
! 600: fprintf(compiler->verbose, "[%s + %s * %d]", reg_names[(p) & 0xF], reg_names[((p) >> 4)& 0xF], 1 << (i)); \
! 601: else \
! 602: fprintf(compiler->verbose, "[%s + #%"SLJIT_PRINT_D"d]", reg_names[(p) & 0xF], (i)); \
! 603: } \
! 604: else { \
! 605: if (((p) >> 4) & 0xF) \
! 606: fprintf(compiler->verbose, "[%s + %s]", reg_names[(p) & 0xF], reg_names[((p) >> 4)& 0xF]); \
! 607: else \
! 608: fprintf(compiler->verbose, "[%s]", reg_names[(p) & 0xF]); \
! 609: } \
! 610: } \
! 611: else \
! 612: fprintf(compiler->verbose, "[#%"SLJIT_PRINT_D"d]", (i)); \
! 613: } else \
! 614: fprintf(compiler->verbose, "%s", freg_names[p]);
! 615:
! 616: static SLJIT_CONST char* op_names[] = {
! 617: /* op0 */
! 618: (char*)"breakpoint", (char*)"nop",
! 619: (char*)"umul", (char*)"smul", (char*)"udiv", (char*)"sdiv",
! 620: /* op1 */
! 621: (char*)"mov", (char*)"mov.ub", (char*)"mov.sb", (char*)"mov.uh",
! 622: (char*)"mov.sh", (char*)"mov.ui", (char*)"mov.si", (char*)"movu",
! 623: (char*)"movu.ub", (char*)"movu.sb", (char*)"movu.uh", (char*)"movu.sh",
! 624: (char*)"movu.ui", (char*)"movu.si", (char*)"not", (char*)"neg",
! 625: (char*)"clz",
! 626: /* op2 */
! 627: (char*)"add", (char*)"addc", (char*)"sub", (char*)"subc",
! 628: (char*)"mul", (char*)"and", (char*)"or", (char*)"xor",
! 629: (char*)"shl", (char*)"lshr", (char*)"ashr",
! 630: /* fop1 */
! 631: (char*)"fcmp", (char*)"fmov", (char*)"fneg", (char*)"fabs",
! 632: /* fop2 */
! 633: (char*)"fadd", (char*)"fsub", (char*)"fmul", (char*)"fdiv"
! 634: };
! 635:
! 636: static char* jump_names[] = {
! 637: (char*)"c_equal", (char*)"c_not_equal",
! 638: (char*)"c_less", (char*)"c_greater_equal",
! 639: (char*)"c_greater", (char*)"c_less_equal",
! 640: (char*)"c_sig_less", (char*)"c_sig_greater_equal",
! 641: (char*)"c_sig_greater", (char*)"c_sig_less_equal",
! 642: (char*)"c_overflow", (char*)"c_not_overflow",
! 643: (char*)"c_mul_overflow", (char*)"c_mul_not_overflow",
! 644: (char*)"c_float_equal", (char*)"c_float_not_equal",
! 645: (char*)"c_float_less", (char*)"c_float_greater_equal",
! 646: (char*)"c_float_greater", (char*)"c_float_less_equal",
! 647: (char*)"c_float_nan", (char*)"c_float_not_nan",
! 648: (char*)"jump", (char*)"fast_call",
! 649: (char*)"call0", (char*)"call1", (char*)"call2", (char*)"call3"
! 650: };
! 651:
! 652: #endif
! 653:
! 654: /* --------------------------------------------------------------------- */
! 655: /* Arch dependent */
! 656: /* --------------------------------------------------------------------- */
! 657:
! 658: static SLJIT_INLINE void check_sljit_generate_code(struct sljit_compiler *compiler)
! 659: {
! 660: #if (defined SLJIT_DEBUG && SLJIT_DEBUG)
! 661: struct sljit_jump *jump;
! 662: #endif
! 663: /* If debug and verbose are disabled, all arguments are unused. */
! 664: SLJIT_UNUSED_ARG(compiler);
! 665:
! 666: SLJIT_ASSERT(compiler->size > 0);
! 667: #if (defined SLJIT_DEBUG && SLJIT_DEBUG)
! 668: jump = compiler->jumps;
! 669: while (jump) {
! 670: /* All jumps have target. */
! 671: SLJIT_ASSERT(jump->flags & (JUMP_LABEL | JUMP_ADDR));
! 672: jump = jump->next;
! 673: }
! 674: #endif
! 675: }
! 676:
! 677: static SLJIT_INLINE void check_sljit_emit_enter(struct sljit_compiler *compiler, int args, int temporaries, int saveds, int local_size)
! 678: {
! 679: /* If debug and verbose are disabled, all arguments are unused. */
! 680: SLJIT_UNUSED_ARG(compiler);
! 681: SLJIT_UNUSED_ARG(args);
! 682: SLJIT_UNUSED_ARG(temporaries);
! 683: SLJIT_UNUSED_ARG(saveds);
! 684: SLJIT_UNUSED_ARG(local_size);
! 685:
! 686: SLJIT_ASSERT(args >= 0 && args <= 3);
! 687: SLJIT_ASSERT(temporaries >= 0 && temporaries <= SLJIT_NO_TMP_REGISTERS);
! 688: SLJIT_ASSERT(saveds >= 0 && saveds <= SLJIT_NO_GEN_REGISTERS);
! 689: SLJIT_ASSERT(args <= saveds);
! 690: SLJIT_ASSERT(local_size >= 0 && local_size <= SLJIT_MAX_LOCAL_SIZE);
! 691: #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
! 692: if (SLJIT_UNLIKELY(!!compiler->verbose))
! 693: fprintf(compiler->verbose, " enter args=%d temporaries=%d saveds=%d local_size=%d\n", args, temporaries, saveds, local_size);
! 694: #endif
! 695: }
! 696:
! 697: static SLJIT_INLINE void check_sljit_set_context(struct sljit_compiler *compiler, int args, int temporaries, int saveds, int local_size)
! 698: {
! 699: /* If debug and verbose are disabled, all arguments are unused. */
! 700: SLJIT_UNUSED_ARG(compiler);
! 701: SLJIT_UNUSED_ARG(args);
! 702: SLJIT_UNUSED_ARG(temporaries);
! 703: SLJIT_UNUSED_ARG(saveds);
! 704: SLJIT_UNUSED_ARG(local_size);
! 705:
! 706: SLJIT_ASSERT(args >= 0 && args <= 3);
! 707: SLJIT_ASSERT(temporaries >= 0 && temporaries <= SLJIT_NO_TMP_REGISTERS);
! 708: SLJIT_ASSERT(saveds >= 0 && saveds <= SLJIT_NO_GEN_REGISTERS);
! 709: SLJIT_ASSERT(args <= saveds);
! 710: SLJIT_ASSERT(local_size >= 0 && local_size <= SLJIT_MAX_LOCAL_SIZE);
! 711: #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
! 712: if (SLJIT_UNLIKELY(!!compiler->verbose))
! 713: fprintf(compiler->verbose, " fake_enter args=%d temporaries=%d saveds=%d local_size=%d\n", args, temporaries, saveds, local_size);
! 714: #endif
! 715: }
! 716:
! 717: static SLJIT_INLINE void check_sljit_emit_return(struct sljit_compiler *compiler, int op, int src, sljit_w srcw)
! 718: {
! 719: /* If debug and verbose are disabled, all arguments are unused. */
! 720: SLJIT_UNUSED_ARG(compiler);
! 721: SLJIT_UNUSED_ARG(op);
! 722: SLJIT_UNUSED_ARG(src);
! 723: SLJIT_UNUSED_ARG(srcw);
! 724:
! 725: #if (defined SLJIT_DEBUG && SLJIT_DEBUG)
! 726: if (op != SLJIT_UNUSED) {
! 727: SLJIT_ASSERT(op >= SLJIT_MOV && op <= SLJIT_MOV_SI);
! 728: FUNCTION_CHECK_SRC(src, srcw);
! 729: }
! 730: else
! 731: SLJIT_ASSERT(src == 0 && srcw == 0);
! 732: #endif
! 733: #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
! 734: if (SLJIT_UNLIKELY(!!compiler->verbose)) {
! 735: if (op == SLJIT_UNUSED)
! 736: fprintf(compiler->verbose, " return\n");
! 737: else {
! 738: fprintf(compiler->verbose, " return %s ", op_names[op]);
! 739: sljit_verbose_param(src, srcw);
! 740: fprintf(compiler->verbose, "\n");
! 741: }
! 742: }
! 743: #endif
! 744: }
! 745:
! 746: static SLJIT_INLINE void check_sljit_emit_fast_enter(struct sljit_compiler *compiler, int dst, sljit_w dstw, int args, int temporaries, int saveds, int local_size)
! 747: {
! 748: /* If debug and verbose are disabled, all arguments are unused. */
! 749: SLJIT_UNUSED_ARG(compiler);
! 750: SLJIT_UNUSED_ARG(dst);
! 751: SLJIT_UNUSED_ARG(dstw);
! 752: SLJIT_UNUSED_ARG(args);
! 753: SLJIT_UNUSED_ARG(temporaries);
! 754: SLJIT_UNUSED_ARG(saveds);
! 755: SLJIT_UNUSED_ARG(local_size);
! 756:
! 757: SLJIT_ASSERT(args >= 0 && args <= 3);
! 758: SLJIT_ASSERT(temporaries >= 0 && temporaries <= SLJIT_NO_TMP_REGISTERS);
! 759: SLJIT_ASSERT(saveds >= 0 && saveds <= SLJIT_NO_GEN_REGISTERS);
! 760: SLJIT_ASSERT(args <= saveds);
! 761: SLJIT_ASSERT(local_size >= 0 && local_size <= SLJIT_MAX_LOCAL_SIZE);
! 762: #if (defined SLJIT_DEBUG && SLJIT_DEBUG)
! 763: compiler->temporaries = temporaries;
! 764: compiler->saveds = saveds;
! 765: FUNCTION_CHECK_DST(dst, dstw);
! 766: compiler->temporaries = -1;
! 767: compiler->saveds = -1;
! 768: #endif
! 769: #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
! 770: if (SLJIT_UNLIKELY(!!compiler->verbose)) {
! 771: fprintf(compiler->verbose, " fast_enter ");
! 772: sljit_verbose_param(dst, dstw);
! 773: fprintf(compiler->verbose, " args=%d temporaries=%d saveds=%d local_size=%d\n", args, temporaries, saveds, local_size);
! 774: }
! 775: #endif
! 776: }
! 777:
! 778: static SLJIT_INLINE void check_sljit_emit_fast_return(struct sljit_compiler *compiler, int src, sljit_w srcw)
! 779: {
! 780: /* If debug and verbose are disabled, all arguments are unused. */
! 781: SLJIT_UNUSED_ARG(compiler);
! 782: SLJIT_UNUSED_ARG(src);
! 783: SLJIT_UNUSED_ARG(srcw);
! 784:
! 785: #if (defined SLJIT_DEBUG && SLJIT_DEBUG)
! 786: FUNCTION_CHECK_SRC(src, srcw);
! 787: #endif
! 788: #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
! 789: if (SLJIT_UNLIKELY(!!compiler->verbose)) {
! 790: fprintf(compiler->verbose, " fast_return ");
! 791: sljit_verbose_param(src, srcw);
! 792: fprintf(compiler->verbose, "\n");
! 793: }
! 794: #endif
! 795: }
! 796:
! 797: static SLJIT_INLINE void check_sljit_emit_op0(struct sljit_compiler *compiler, int op)
! 798: {
! 799: /* If debug and verbose are disabled, all arguments are unused. */
! 800: SLJIT_UNUSED_ARG(compiler);
! 801: SLJIT_UNUSED_ARG(op);
! 802:
! 803: SLJIT_ASSERT((op >= SLJIT_BREAKPOINT && op <= SLJIT_SMUL)
! 804: || ((op & ~SLJIT_INT_OP) >= SLJIT_UDIV && (op & ~SLJIT_INT_OP) <= SLJIT_SDIV));
! 805: #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
! 806: if (SLJIT_UNLIKELY(!!compiler->verbose))
! 807: fprintf(compiler->verbose, " %s%s\n", !(op & SLJIT_INT_OP) ? "" : "i", op_names[GET_OPCODE(op)]);
! 808: #endif
! 809: }
! 810:
! 811: static SLJIT_INLINE void check_sljit_emit_op1(struct sljit_compiler *compiler, int op,
! 812: int dst, sljit_w dstw,
! 813: int src, sljit_w srcw)
! 814: {
! 815: /* If debug and verbose are disabled, all arguments are unused. */
! 816: SLJIT_UNUSED_ARG(compiler);
! 817: SLJIT_UNUSED_ARG(op);
! 818: SLJIT_UNUSED_ARG(dst);
! 819: SLJIT_UNUSED_ARG(dstw);
! 820: SLJIT_UNUSED_ARG(src);
! 821: SLJIT_UNUSED_ARG(srcw);
! 822:
! 823: #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) || (defined SLJIT_DEBUG && SLJIT_DEBUG)
! 824: if (SLJIT_UNLIKELY(compiler->skip_checks)) {
! 825: compiler->skip_checks = 0;
! 826: return;
! 827: }
! 828: #endif
! 829:
! 830: SLJIT_ASSERT(GET_OPCODE(op) >= SLJIT_MOV && GET_OPCODE(op) <= SLJIT_CLZ);
! 831: #if (defined SLJIT_DEBUG && SLJIT_DEBUG)
! 832: FUNCTION_CHECK_OP();
! 833: FUNCTION_CHECK_SRC(src, srcw);
! 834: FUNCTION_CHECK_DST(dst, dstw);
! 835: FUNCTION_CHECK_OP1();
! 836: #endif
! 837: #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
! 838: if (SLJIT_UNLIKELY(!!compiler->verbose)) {
! 839: fprintf(compiler->verbose, " %s%s%s%s%s%s%s%s ", !(op & SLJIT_INT_OP) ? "" : "i", op_names[GET_OPCODE(op)],
! 840: !(op & SLJIT_SET_E) ? "" : "E", !(op & SLJIT_SET_S) ? "" : "S", !(op & SLJIT_SET_U) ? "" : "U", !(op & SLJIT_SET_O) ? "" : "O", !(op & SLJIT_SET_C) ? "" : "C", !(op & SLJIT_KEEP_FLAGS) ? "" : "K");
! 841: sljit_verbose_param(dst, dstw);
! 842: fprintf(compiler->verbose, ", ");
! 843: sljit_verbose_param(src, srcw);
! 844: fprintf(compiler->verbose, "\n");
! 845: }
! 846: #endif
! 847: }
! 848:
! 849: static SLJIT_INLINE void check_sljit_emit_op2(struct sljit_compiler *compiler, int op,
! 850: int dst, sljit_w dstw,
! 851: int src1, sljit_w src1w,
! 852: int src2, sljit_w src2w)
! 853: {
! 854: /* If debug and verbose are disabled, all arguments are unused. */
! 855: SLJIT_UNUSED_ARG(compiler);
! 856: SLJIT_UNUSED_ARG(op);
! 857: SLJIT_UNUSED_ARG(dst);
! 858: SLJIT_UNUSED_ARG(dstw);
! 859: SLJIT_UNUSED_ARG(src1);
! 860: SLJIT_UNUSED_ARG(src1w);
! 861: SLJIT_UNUSED_ARG(src2);
! 862: SLJIT_UNUSED_ARG(src2w);
! 863:
! 864: #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) || (defined SLJIT_DEBUG && SLJIT_DEBUG)
! 865: if (SLJIT_UNLIKELY(compiler->skip_checks)) {
! 866: compiler->skip_checks = 0;
! 867: return;
! 868: }
! 869: #endif
! 870:
! 871: SLJIT_ASSERT(GET_OPCODE(op) >= SLJIT_ADD && GET_OPCODE(op) <= SLJIT_ASHR);
! 872: #if (defined SLJIT_DEBUG && SLJIT_DEBUG)
! 873: FUNCTION_CHECK_OP();
! 874: FUNCTION_CHECK_SRC(src1, src1w);
! 875: FUNCTION_CHECK_SRC(src2, src2w);
! 876: FUNCTION_CHECK_DST(dst, dstw);
! 877: #endif
! 878: #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
! 879: if (SLJIT_UNLIKELY(!!compiler->verbose)) {
! 880: fprintf(compiler->verbose, " %s%s%s%s%s%s%s%s ", !(op & SLJIT_INT_OP) ? "" : "i", op_names[GET_OPCODE(op)],
! 881: !(op & SLJIT_SET_E) ? "" : "E", !(op & SLJIT_SET_S) ? "" : "S", !(op & SLJIT_SET_U) ? "" : "U", !(op & SLJIT_SET_O) ? "" : "O", !(op & SLJIT_SET_C) ? "" : "C", !(op & SLJIT_KEEP_FLAGS) ? "" : "K");
! 882: sljit_verbose_param(dst, dstw);
! 883: fprintf(compiler->verbose, ", ");
! 884: sljit_verbose_param(src1, src1w);
! 885: fprintf(compiler->verbose, ", ");
! 886: sljit_verbose_param(src2, src2w);
! 887: fprintf(compiler->verbose, "\n");
! 888: }
! 889: #endif
! 890: }
! 891:
! 892: static SLJIT_INLINE void check_sljit_get_register_index(int reg)
! 893: {
! 894: SLJIT_UNUSED_ARG(reg);
! 895: SLJIT_ASSERT(reg > 0 && reg <= SLJIT_NO_REGISTERS);
! 896: }
! 897:
! 898: static SLJIT_INLINE void check_sljit_emit_op_custom(struct sljit_compiler *compiler,
! 899: void *instruction, int size)
! 900: {
! 901: SLJIT_UNUSED_ARG(compiler);
! 902: SLJIT_UNUSED_ARG(instruction);
! 903: SLJIT_UNUSED_ARG(size);
! 904: SLJIT_ASSERT(instruction);
! 905: }
! 906:
! 907: static SLJIT_INLINE void check_sljit_emit_fop1(struct sljit_compiler *compiler, int op,
! 908: int dst, sljit_w dstw,
! 909: int src, sljit_w srcw)
! 910: {
! 911: /* If debug and verbose are disabled, all arguments are unused. */
! 912: SLJIT_UNUSED_ARG(compiler);
! 913: SLJIT_UNUSED_ARG(op);
! 914: SLJIT_UNUSED_ARG(dst);
! 915: SLJIT_UNUSED_ARG(dstw);
! 916: SLJIT_UNUSED_ARG(src);
! 917: SLJIT_UNUSED_ARG(srcw);
! 918:
! 919: #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) || (defined SLJIT_DEBUG && SLJIT_DEBUG)
! 920: if (SLJIT_UNLIKELY(compiler->skip_checks)) {
! 921: compiler->skip_checks = 0;
! 922: return;
! 923: }
! 924: #endif
! 925:
! 926: SLJIT_ASSERT(sljit_is_fpu_available());
! 927: SLJIT_ASSERT(GET_OPCODE(op) >= SLJIT_FCMP && GET_OPCODE(op) <= SLJIT_FABS);
! 928: #if (defined SLJIT_DEBUG && SLJIT_DEBUG)
! 929: FUNCTION_CHECK_OP();
! 930: FUNCTION_FCHECK(src, srcw);
! 931: FUNCTION_FCHECK(dst, dstw);
! 932: #endif
! 933: #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
! 934: if (SLJIT_UNLIKELY(!!compiler->verbose)) {
! 935: fprintf(compiler->verbose, " %s%s%s ", op_names[GET_OPCODE(op)],
! 936: !(op & SLJIT_SET_E) ? "" : "E", !(op & SLJIT_SET_S) ? "" : "S");
! 937: sljit_verbose_fparam(dst, dstw);
! 938: fprintf(compiler->verbose, ", ");
! 939: sljit_verbose_fparam(src, srcw);
! 940: fprintf(compiler->verbose, "\n");
! 941: }
! 942: #endif
! 943: }
! 944:
! 945: static SLJIT_INLINE void check_sljit_emit_fop2(struct sljit_compiler *compiler, int op,
! 946: int dst, sljit_w dstw,
! 947: int src1, sljit_w src1w,
! 948: int src2, sljit_w src2w)
! 949: {
! 950: /* If debug and verbose are disabled, all arguments are unused. */
! 951: SLJIT_UNUSED_ARG(compiler);
! 952: SLJIT_UNUSED_ARG(op);
! 953: SLJIT_UNUSED_ARG(dst);
! 954: SLJIT_UNUSED_ARG(dstw);
! 955: SLJIT_UNUSED_ARG(src1);
! 956: SLJIT_UNUSED_ARG(src1w);
! 957: SLJIT_UNUSED_ARG(src2);
! 958: SLJIT_UNUSED_ARG(src2w);
! 959:
! 960: SLJIT_ASSERT(sljit_is_fpu_available());
! 961: SLJIT_ASSERT(GET_OPCODE(op) >= SLJIT_FADD && GET_OPCODE(op) <= SLJIT_FDIV);
! 962: #if (defined SLJIT_DEBUG && SLJIT_DEBUG)
! 963: FUNCTION_CHECK_OP();
! 964: FUNCTION_FCHECK(src1, src1w);
! 965: FUNCTION_FCHECK(src2, src2w);
! 966: FUNCTION_FCHECK(dst, dstw);
! 967: #endif
! 968: #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
! 969: if (SLJIT_UNLIKELY(!!compiler->verbose)) {
! 970: fprintf(compiler->verbose, " %s ", op_names[GET_OPCODE(op)]);
! 971: sljit_verbose_fparam(dst, dstw);
! 972: fprintf(compiler->verbose, ", ");
! 973: sljit_verbose_fparam(src1, src1w);
! 974: fprintf(compiler->verbose, ", ");
! 975: sljit_verbose_fparam(src2, src2w);
! 976: fprintf(compiler->verbose, "\n");
! 977: }
! 978: #endif
! 979: }
! 980:
! 981: static SLJIT_INLINE void check_sljit_emit_label(struct sljit_compiler *compiler)
! 982: {
! 983: /* If debug and verbose are disabled, all arguments are unused. */
! 984: SLJIT_UNUSED_ARG(compiler);
! 985:
! 986: #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
! 987: if (SLJIT_UNLIKELY(!!compiler->verbose))
! 988: fprintf(compiler->verbose, "label:\n");
! 989: #endif
! 990: }
! 991:
! 992: static SLJIT_INLINE void check_sljit_emit_jump(struct sljit_compiler *compiler, int type)
! 993: {
! 994: /* If debug and verbose are disabled, all arguments are unused. */
! 995: SLJIT_UNUSED_ARG(compiler);
! 996: SLJIT_UNUSED_ARG(type);
! 997:
! 998: #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) || (defined SLJIT_DEBUG && SLJIT_DEBUG)
! 999: if (SLJIT_UNLIKELY(compiler->skip_checks)) {
! 1000: compiler->skip_checks = 0;
! 1001: return;
! 1002: }
! 1003: #endif
! 1004:
! 1005: SLJIT_ASSERT(!(type & ~(0xff | SLJIT_REWRITABLE_JUMP)));
! 1006: SLJIT_ASSERT((type & 0xff) >= SLJIT_C_EQUAL && (type & 0xff) <= SLJIT_CALL3);
! 1007: #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
! 1008: if (SLJIT_UNLIKELY(!!compiler->verbose))
! 1009: fprintf(compiler->verbose, " jump%s <%s>\n", !(type & SLJIT_REWRITABLE_JUMP) ? "" : "R", jump_names[type & 0xff]);
! 1010: #endif
! 1011: }
! 1012:
! 1013: static SLJIT_INLINE void check_sljit_emit_cmp(struct sljit_compiler *compiler, int type,
! 1014: int src1, sljit_w src1w,
! 1015: int src2, sljit_w src2w)
! 1016: {
! 1017: SLJIT_UNUSED_ARG(compiler);
! 1018: SLJIT_UNUSED_ARG(type);
! 1019: SLJIT_UNUSED_ARG(src1);
! 1020: SLJIT_UNUSED_ARG(src1w);
! 1021: SLJIT_UNUSED_ARG(src2);
! 1022: SLJIT_UNUSED_ARG(src2w);
! 1023:
! 1024: SLJIT_ASSERT(!(type & ~(0xff | SLJIT_INT_OP | SLJIT_REWRITABLE_JUMP)));
! 1025: SLJIT_ASSERT((type & 0xff) >= SLJIT_C_EQUAL && (type & 0xff) <= SLJIT_C_SIG_LESS_EQUAL);
! 1026: #if (defined SLJIT_DEBUG && SLJIT_DEBUG)
! 1027: FUNCTION_CHECK_SRC(src1, src1w);
! 1028: FUNCTION_CHECK_SRC(src2, src2w);
! 1029: #endif
! 1030: #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
! 1031: if (SLJIT_UNLIKELY(!!compiler->verbose)) {
! 1032: fprintf(compiler->verbose, " %scmp%s <%s> ", !(type & SLJIT_INT_OP) ? "" : "i", !(type & SLJIT_REWRITABLE_JUMP) ? "" : "R", jump_names[type & 0xff]);
! 1033: sljit_verbose_param(src1, src1w);
! 1034: fprintf(compiler->verbose, ", ");
! 1035: sljit_verbose_param(src2, src2w);
! 1036: fprintf(compiler->verbose, "\n");
! 1037: }
! 1038: #endif
! 1039: }
! 1040:
! 1041: static SLJIT_INLINE void check_sljit_emit_fcmp(struct sljit_compiler *compiler, int type,
! 1042: int src1, sljit_w src1w,
! 1043: int src2, sljit_w src2w)
! 1044: {
! 1045: SLJIT_UNUSED_ARG(compiler);
! 1046: SLJIT_UNUSED_ARG(type);
! 1047: SLJIT_UNUSED_ARG(src1);
! 1048: SLJIT_UNUSED_ARG(src1w);
! 1049: SLJIT_UNUSED_ARG(src2);
! 1050: SLJIT_UNUSED_ARG(src2w);
! 1051:
! 1052: SLJIT_ASSERT(sljit_is_fpu_available());
! 1053: SLJIT_ASSERT(!(type & ~(0xff | SLJIT_REWRITABLE_JUMP)));
! 1054: SLJIT_ASSERT((type & 0xff) >= SLJIT_C_FLOAT_EQUAL && (type & 0xff) <= SLJIT_C_FLOAT_NOT_NAN);
! 1055: #if (defined SLJIT_DEBUG && SLJIT_DEBUG)
! 1056: FUNCTION_FCHECK(src1, src1w);
! 1057: FUNCTION_FCHECK(src2, src2w);
! 1058: #endif
! 1059: #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
! 1060: if (SLJIT_UNLIKELY(!!compiler->verbose)) {
! 1061: fprintf(compiler->verbose, " fcmp%s <%s> ", !(type & SLJIT_REWRITABLE_JUMP) ? "" : "R", jump_names[type & 0xff]);
! 1062: sljit_verbose_fparam(src1, src1w);
! 1063: fprintf(compiler->verbose, ", ");
! 1064: sljit_verbose_fparam(src2, src2w);
! 1065: fprintf(compiler->verbose, "\n");
! 1066: }
! 1067: #endif
! 1068: }
! 1069:
! 1070: static SLJIT_INLINE void check_sljit_emit_ijump(struct sljit_compiler *compiler, int type, int src, sljit_w srcw)
! 1071: {
! 1072: /* If debug and verbose are disabled, all arguments are unused. */
! 1073: SLJIT_UNUSED_ARG(compiler);
! 1074: SLJIT_UNUSED_ARG(type);
! 1075: SLJIT_UNUSED_ARG(src);
! 1076: SLJIT_UNUSED_ARG(srcw);
! 1077:
! 1078: SLJIT_ASSERT(type >= SLJIT_JUMP && type <= SLJIT_CALL3);
! 1079: #if (defined SLJIT_DEBUG && SLJIT_DEBUG)
! 1080: FUNCTION_CHECK_SRC(src, srcw);
! 1081: #endif
! 1082: #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
! 1083: if (SLJIT_UNLIKELY(!!compiler->verbose)) {
! 1084: fprintf(compiler->verbose, " ijump <%s> ", jump_names[type]);
! 1085: sljit_verbose_param(src, srcw);
! 1086: fprintf(compiler->verbose, "\n");
! 1087: }
! 1088: #endif
! 1089: }
! 1090:
! 1091: static SLJIT_INLINE void check_sljit_emit_cond_value(struct sljit_compiler *compiler, int op, int dst, sljit_w dstw, int type)
! 1092: {
! 1093: /* If debug and verbose are disabled, all arguments are unused. */
! 1094: SLJIT_UNUSED_ARG(compiler);
! 1095: SLJIT_UNUSED_ARG(op);
! 1096: SLJIT_UNUSED_ARG(dst);
! 1097: SLJIT_UNUSED_ARG(dstw);
! 1098: SLJIT_UNUSED_ARG(type);
! 1099:
! 1100: SLJIT_ASSERT(type >= SLJIT_C_EQUAL && type < SLJIT_JUMP);
! 1101: SLJIT_ASSERT(op == SLJIT_MOV || GET_OPCODE(op) == SLJIT_OR);
! 1102: SLJIT_ASSERT(GET_ALL_FLAGS(op) == 0 || GET_ALL_FLAGS(op) == SLJIT_SET_E || GET_ALL_FLAGS(op) == SLJIT_KEEP_FLAGS);
! 1103: #if (defined SLJIT_DEBUG && SLJIT_DEBUG)
! 1104: FUNCTION_CHECK_DST(dst, dstw);
! 1105: #endif
! 1106: #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
! 1107: if (SLJIT_UNLIKELY(!!compiler->verbose)) {
! 1108: fprintf(compiler->verbose, " cond_set%s%s <%s> ", !(op & SLJIT_SET_E) ? "" : "E",
! 1109: !(op & SLJIT_KEEP_FLAGS) ? "" : "K", op_names[GET_OPCODE(op)]);
! 1110: sljit_verbose_param(dst, dstw);
! 1111: fprintf(compiler->verbose, ", <%s>\n", jump_names[type]);
! 1112: }
! 1113: #endif
! 1114: }
! 1115:
! 1116: static SLJIT_INLINE void check_sljit_emit_const(struct sljit_compiler *compiler, int dst, sljit_w dstw, sljit_w init_value)
! 1117: {
! 1118: /* If debug and verbose are disabled, all arguments are unused. */
! 1119: SLJIT_UNUSED_ARG(compiler);
! 1120: SLJIT_UNUSED_ARG(dst);
! 1121: SLJIT_UNUSED_ARG(dstw);
! 1122: SLJIT_UNUSED_ARG(init_value);
! 1123:
! 1124: #if (defined SLJIT_DEBUG && SLJIT_DEBUG)
! 1125: FUNCTION_CHECK_DST(dst, dstw);
! 1126: #endif
! 1127: #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
! 1128: if (SLJIT_UNLIKELY(!!compiler->verbose)) {
! 1129: fprintf(compiler->verbose, " const ");
! 1130: sljit_verbose_param(dst, dstw);
! 1131: fprintf(compiler->verbose, ", #%"SLJIT_PRINT_D"d\n", init_value);
! 1132: }
! 1133: #endif
! 1134: }
! 1135:
! 1136: static SLJIT_INLINE int emit_mov_before_return(struct sljit_compiler *compiler, int op, int src, sljit_w srcw)
! 1137: {
! 1138: /* Return if don't need to do anything. */
! 1139: if (op == SLJIT_UNUSED)
! 1140: return SLJIT_SUCCESS;
! 1141:
! 1142: #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
! 1143: if (src == SLJIT_RETURN_REG && op == SLJIT_MOV)
! 1144: return SLJIT_SUCCESS;
! 1145: #else
! 1146: if (src == SLJIT_RETURN_REG && (op == SLJIT_MOV || op == SLJIT_MOV_UI || op == SLJIT_MOV_SI))
! 1147: return SLJIT_SUCCESS;
! 1148: #endif
! 1149:
! 1150: #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) || (defined SLJIT_DEBUG && SLJIT_DEBUG)
! 1151: compiler->skip_checks = 1;
! 1152: #endif
! 1153: return sljit_emit_op1(compiler, op, SLJIT_RETURN_REG, 0, src, srcw);
! 1154: }
! 1155:
! 1156: /* CPU description section */
! 1157:
! 1158: #if (defined SLJIT_32BIT_ARCHITECTURE && SLJIT_32BIT_ARCHITECTURE)
! 1159: #define SLJIT_CPUINFO_PART1 " 32bit ("
! 1160: #elif (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
! 1161: #define SLJIT_CPUINFO_PART1 " 64bit ("
! 1162: #else
! 1163: #error "Internal error: CPU type info missing"
! 1164: #endif
! 1165:
! 1166: #if (defined SLJIT_LITTLE_ENDIAN && SLJIT_LITTLE_ENDIAN)
! 1167: #define SLJIT_CPUINFO_PART2 "little endian + "
! 1168: #elif (defined SLJIT_BIG_ENDIAN && SLJIT_BIG_ENDIAN)
! 1169: #define SLJIT_CPUINFO_PART2 "big endian + "
! 1170: #else
! 1171: #error "Internal error: CPU type info missing"
! 1172: #endif
! 1173:
! 1174: #if (defined SLJIT_UNALIGNED && SLJIT_UNALIGNED)
! 1175: #define SLJIT_CPUINFO_PART3 "unaligned)"
! 1176: #else
! 1177: #define SLJIT_CPUINFO_PART3 "aligned)"
! 1178: #endif
! 1179:
! 1180: #define SLJIT_CPUINFO SLJIT_CPUINFO_PART1 SLJIT_CPUINFO_PART2 SLJIT_CPUINFO_PART3
! 1181:
! 1182: #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
! 1183: #include "sljitNativeX86_common.c"
! 1184: #elif (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
! 1185: #include "sljitNativeX86_common.c"
! 1186: #elif (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)
! 1187: #include "sljitNativeARM_v5.c"
! 1188: #elif (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7)
! 1189: #include "sljitNativeARM_v5.c"
! 1190: #elif (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2)
! 1191: #include "sljitNativeARM_Thumb2.c"
! 1192: #elif (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32)
! 1193: #include "sljitNativePPC_common.c"
! 1194: #elif (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
! 1195: #include "sljitNativePPC_common.c"
! 1196: #elif (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)
! 1197: #include "sljitNativeMIPS_common.c"
! 1198: #endif
! 1199:
! 1200: #if !(defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)
! 1201:
! 1202: SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_cmp(struct sljit_compiler *compiler, int type,
! 1203: int src1, sljit_w src1w,
! 1204: int src2, sljit_w src2w)
! 1205: {
! 1206: /* Default compare for most architectures. */
! 1207: int flags, tmp_src, condition;
! 1208: sljit_w tmp_srcw;
! 1209:
! 1210: CHECK_ERROR_PTR();
! 1211: check_sljit_emit_cmp(compiler, type, src1, src1w, src2, src2w);
! 1212:
! 1213: condition = type & 0xff;
! 1214: if (SLJIT_UNLIKELY((src1 & SLJIT_IMM) && !(src2 & SLJIT_IMM))) {
! 1215: /* Immediate is prefered as second argument by most architectures. */
! 1216: switch (condition) {
! 1217: case SLJIT_C_LESS:
! 1218: condition = SLJIT_C_GREATER;
! 1219: break;
! 1220: case SLJIT_C_GREATER_EQUAL:
! 1221: condition = SLJIT_C_LESS_EQUAL;
! 1222: break;
! 1223: case SLJIT_C_GREATER:
! 1224: condition = SLJIT_C_LESS;
! 1225: break;
! 1226: case SLJIT_C_LESS_EQUAL:
! 1227: condition = SLJIT_C_GREATER_EQUAL;
! 1228: break;
! 1229: case SLJIT_C_SIG_LESS:
! 1230: condition = SLJIT_C_SIG_GREATER;
! 1231: break;
! 1232: case SLJIT_C_SIG_GREATER_EQUAL:
! 1233: condition = SLJIT_C_SIG_LESS_EQUAL;
! 1234: break;
! 1235: case SLJIT_C_SIG_GREATER:
! 1236: condition = SLJIT_C_SIG_LESS;
! 1237: break;
! 1238: case SLJIT_C_SIG_LESS_EQUAL:
! 1239: condition = SLJIT_C_SIG_GREATER_EQUAL;
! 1240: break;
! 1241: }
! 1242: type = condition | (type & (SLJIT_INT_OP | SLJIT_REWRITABLE_JUMP));
! 1243: tmp_src = src1;
! 1244: src1 = src2;
! 1245: src2 = tmp_src;
! 1246: tmp_srcw = src1w;
! 1247: src1w = src2w;
! 1248: src2w = tmp_srcw;
! 1249: }
! 1250:
! 1251: if (condition <= SLJIT_C_NOT_ZERO)
! 1252: flags = SLJIT_SET_E;
! 1253: else if (condition <= SLJIT_C_LESS_EQUAL)
! 1254: flags = SLJIT_SET_U;
! 1255: else
! 1256: flags = SLJIT_SET_S;
! 1257:
! 1258: #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) || (defined SLJIT_DEBUG && SLJIT_DEBUG)
! 1259: compiler->skip_checks = 1;
! 1260: #endif
! 1261: PTR_FAIL_IF(sljit_emit_op2(compiler, SLJIT_SUB | flags | (type & SLJIT_INT_OP),
! 1262: SLJIT_UNUSED, 0, src1, src1w, src2, src2w));
! 1263: #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) || (defined SLJIT_DEBUG && SLJIT_DEBUG)
! 1264: compiler->skip_checks = 1;
! 1265: #endif
! 1266: return sljit_emit_jump(compiler, condition | (type & SLJIT_REWRITABLE_JUMP));
! 1267: }
! 1268:
! 1269: SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_fcmp(struct sljit_compiler *compiler, int type,
! 1270: int src1, sljit_w src1w,
! 1271: int src2, sljit_w src2w)
! 1272: {
! 1273: int flags, condition;
! 1274:
! 1275: check_sljit_emit_fcmp(compiler, type, src1, src1w, src2, src2w);
! 1276:
! 1277: condition = type & 0xff;
! 1278: if (condition <= SLJIT_C_FLOAT_NOT_EQUAL)
! 1279: flags = SLJIT_SET_E;
! 1280: else
! 1281: flags = SLJIT_SET_S;
! 1282:
! 1283: #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) || (defined SLJIT_DEBUG && SLJIT_DEBUG)
! 1284: compiler->skip_checks = 1;
! 1285: #endif
! 1286: sljit_emit_fop1(compiler, SLJIT_FCMP | flags, src1, src1w, src2, src2w);
! 1287:
! 1288: #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) || (defined SLJIT_DEBUG && SLJIT_DEBUG)
! 1289: compiler->skip_checks = 1;
! 1290: #endif
! 1291: return sljit_emit_jump(compiler, condition | (type & SLJIT_REWRITABLE_JUMP));
! 1292: }
! 1293:
! 1294: #endif
! 1295:
! 1296: #else /* SLJIT_CONFIG_UNSUPPORTED */
! 1297:
! 1298: /* Empty function bodies for those machines, which are not (yet) supported. */
! 1299:
! 1300: SLJIT_API_FUNC_ATTRIBUTE SLJIT_CONST char* sljit_get_platform_name()
! 1301: {
! 1302: return "unsupported";
! 1303: }
! 1304:
! 1305: SLJIT_API_FUNC_ATTRIBUTE struct sljit_compiler* sljit_create_compiler(void)
! 1306: {
! 1307: SLJIT_ASSERT_STOP();
! 1308: return NULL;
! 1309: }
! 1310:
! 1311: SLJIT_API_FUNC_ATTRIBUTE void sljit_free_compiler(struct sljit_compiler *compiler)
! 1312: {
! 1313: SLJIT_UNUSED_ARG(compiler);
! 1314: SLJIT_ASSERT_STOP();
! 1315: }
! 1316:
! 1317: SLJIT_API_FUNC_ATTRIBUTE void* sljit_alloc_memory(struct sljit_compiler *compiler, int size)
! 1318: {
! 1319: SLJIT_UNUSED_ARG(compiler);
! 1320: SLJIT_UNUSED_ARG(size);
! 1321: SLJIT_ASSERT_STOP();
! 1322: return NULL;
! 1323: }
! 1324:
! 1325: #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
! 1326: SLJIT_API_FUNC_ATTRIBUTE void sljit_compiler_verbose(struct sljit_compiler *compiler, FILE* verbose)
! 1327: {
! 1328: SLJIT_UNUSED_ARG(compiler);
! 1329: SLJIT_UNUSED_ARG(verbose);
! 1330: SLJIT_ASSERT_STOP();
! 1331: }
! 1332: #endif
! 1333:
! 1334: SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compiler)
! 1335: {
! 1336: SLJIT_UNUSED_ARG(compiler);
! 1337: SLJIT_ASSERT_STOP();
! 1338: return NULL;
! 1339: }
! 1340:
! 1341: SLJIT_API_FUNC_ATTRIBUTE void sljit_free_code(void* code)
! 1342: {
! 1343: SLJIT_UNUSED_ARG(code);
! 1344: SLJIT_ASSERT_STOP();
! 1345: }
! 1346:
! 1347: SLJIT_API_FUNC_ATTRIBUTE int sljit_emit_enter(struct sljit_compiler *compiler, int args, int temporaries, int saveds, int local_size)
! 1348: {
! 1349: SLJIT_UNUSED_ARG(compiler);
! 1350: SLJIT_UNUSED_ARG(args);
! 1351: SLJIT_UNUSED_ARG(temporaries);
! 1352: SLJIT_UNUSED_ARG(saveds);
! 1353: SLJIT_UNUSED_ARG(local_size);
! 1354: SLJIT_ASSERT_STOP();
! 1355: return SLJIT_ERR_UNSUPPORTED;
! 1356: }
! 1357:
! 1358: SLJIT_API_FUNC_ATTRIBUTE void sljit_set_context(struct sljit_compiler *compiler, int args, int temporaries, int saveds, int local_size)
! 1359: {
! 1360: SLJIT_UNUSED_ARG(compiler);
! 1361: SLJIT_UNUSED_ARG(args);
! 1362: SLJIT_UNUSED_ARG(temporaries);
! 1363: SLJIT_UNUSED_ARG(saveds);
! 1364: SLJIT_UNUSED_ARG(local_size);
! 1365: SLJIT_ASSERT_STOP();
! 1366: }
! 1367:
! 1368: SLJIT_API_FUNC_ATTRIBUTE int sljit_emit_return(struct sljit_compiler *compiler, int op, int src, sljit_w srcw)
! 1369: {
! 1370: SLJIT_UNUSED_ARG(compiler);
! 1371: SLJIT_UNUSED_ARG(op);
! 1372: SLJIT_UNUSED_ARG(src);
! 1373: SLJIT_UNUSED_ARG(srcw);
! 1374: SLJIT_ASSERT_STOP();
! 1375: return SLJIT_ERR_UNSUPPORTED;
! 1376: }
! 1377:
! 1378: SLJIT_API_FUNC_ATTRIBUTE int sljit_emit_fast_enter(struct sljit_compiler *compiler, int dst, sljit_w dstw, int args, int temporaries, int saveds, int local_size)
! 1379: {
! 1380: SLJIT_UNUSED_ARG(compiler);
! 1381: SLJIT_UNUSED_ARG(dst);
! 1382: SLJIT_UNUSED_ARG(dstw);
! 1383: SLJIT_UNUSED_ARG(args);
! 1384: SLJIT_UNUSED_ARG(temporaries);
! 1385: SLJIT_UNUSED_ARG(saveds);
! 1386: SLJIT_UNUSED_ARG(local_size);
! 1387: SLJIT_ASSERT_STOP();
! 1388: return SLJIT_ERR_UNSUPPORTED;
! 1389: }
! 1390:
! 1391: SLJIT_API_FUNC_ATTRIBUTE int sljit_emit_fast_return(struct sljit_compiler *compiler, int src, sljit_w srcw)
! 1392: {
! 1393: SLJIT_UNUSED_ARG(compiler);
! 1394: SLJIT_UNUSED_ARG(src);
! 1395: SLJIT_UNUSED_ARG(srcw);
! 1396: SLJIT_ASSERT_STOP();
! 1397: return SLJIT_ERR_UNSUPPORTED;
! 1398: }
! 1399:
! 1400: SLJIT_API_FUNC_ATTRIBUTE int sljit_emit_op0(struct sljit_compiler *compiler, int op)
! 1401: {
! 1402: SLJIT_UNUSED_ARG(compiler);
! 1403: SLJIT_UNUSED_ARG(op);
! 1404: SLJIT_ASSERT_STOP();
! 1405: return SLJIT_ERR_UNSUPPORTED;
! 1406: }
! 1407:
! 1408: SLJIT_API_FUNC_ATTRIBUTE int sljit_emit_op1(struct sljit_compiler *compiler, int op,
! 1409: int dst, sljit_w dstw,
! 1410: int src, sljit_w srcw)
! 1411: {
! 1412: SLJIT_UNUSED_ARG(compiler);
! 1413: SLJIT_UNUSED_ARG(op);
! 1414: SLJIT_UNUSED_ARG(dst);
! 1415: SLJIT_UNUSED_ARG(dstw);
! 1416: SLJIT_UNUSED_ARG(src);
! 1417: SLJIT_UNUSED_ARG(srcw);
! 1418: SLJIT_ASSERT_STOP();
! 1419: return SLJIT_ERR_UNSUPPORTED;
! 1420: }
! 1421:
! 1422: SLJIT_API_FUNC_ATTRIBUTE int sljit_emit_op2(struct sljit_compiler *compiler, int op,
! 1423: int dst, sljit_w dstw,
! 1424: int src1, sljit_w src1w,
! 1425: int src2, sljit_w src2w)
! 1426: {
! 1427: SLJIT_UNUSED_ARG(compiler);
! 1428: SLJIT_UNUSED_ARG(op);
! 1429: SLJIT_UNUSED_ARG(dst);
! 1430: SLJIT_UNUSED_ARG(dstw);
! 1431: SLJIT_UNUSED_ARG(src1);
! 1432: SLJIT_UNUSED_ARG(src1w);
! 1433: SLJIT_UNUSED_ARG(src2);
! 1434: SLJIT_UNUSED_ARG(src2w);
! 1435: SLJIT_ASSERT_STOP();
! 1436: return SLJIT_ERR_UNSUPPORTED;
! 1437: }
! 1438:
! 1439: SLJIT_API_FUNC_ATTRIBUTE int sljit_get_register_index(int reg)
! 1440: {
! 1441: SLJIT_ASSERT_STOP();
! 1442: return reg;
! 1443: }
! 1444:
! 1445: SLJIT_API_FUNC_ATTRIBUTE int sljit_emit_op_custom(struct sljit_compiler *compiler,
! 1446: void *instruction, int size)
! 1447: {
! 1448: SLJIT_UNUSED_ARG(compiler);
! 1449: SLJIT_UNUSED_ARG(instruction);
! 1450: SLJIT_UNUSED_ARG(size);
! 1451: SLJIT_ASSERT_STOP();
! 1452: return SLJIT_ERR_UNSUPPORTED;
! 1453: }
! 1454:
! 1455: SLJIT_API_FUNC_ATTRIBUTE int sljit_is_fpu_available(void)
! 1456: {
! 1457: SLJIT_ASSERT_STOP();
! 1458: return 0;
! 1459: }
! 1460:
! 1461: SLJIT_API_FUNC_ATTRIBUTE int sljit_emit_fop1(struct sljit_compiler *compiler, int op,
! 1462: int dst, sljit_w dstw,
! 1463: int src, sljit_w srcw)
! 1464: {
! 1465: SLJIT_UNUSED_ARG(compiler);
! 1466: SLJIT_UNUSED_ARG(op);
! 1467: SLJIT_UNUSED_ARG(dst);
! 1468: SLJIT_UNUSED_ARG(dstw);
! 1469: SLJIT_UNUSED_ARG(src);
! 1470: SLJIT_UNUSED_ARG(srcw);
! 1471: SLJIT_ASSERT_STOP();
! 1472: return SLJIT_ERR_UNSUPPORTED;
! 1473: }
! 1474:
! 1475: SLJIT_API_FUNC_ATTRIBUTE int sljit_emit_fop2(struct sljit_compiler *compiler, int op,
! 1476: int dst, sljit_w dstw,
! 1477: int src1, sljit_w src1w,
! 1478: int src2, sljit_w src2w)
! 1479: {
! 1480: SLJIT_UNUSED_ARG(compiler);
! 1481: SLJIT_UNUSED_ARG(op);
! 1482: SLJIT_UNUSED_ARG(dst);
! 1483: SLJIT_UNUSED_ARG(dstw);
! 1484: SLJIT_UNUSED_ARG(src1);
! 1485: SLJIT_UNUSED_ARG(src1w);
! 1486: SLJIT_UNUSED_ARG(src2);
! 1487: SLJIT_UNUSED_ARG(src2w);
! 1488: SLJIT_ASSERT_STOP();
! 1489: return SLJIT_ERR_UNSUPPORTED;
! 1490: }
! 1491:
! 1492: SLJIT_API_FUNC_ATTRIBUTE struct sljit_label* sljit_emit_label(struct sljit_compiler *compiler)
! 1493: {
! 1494: SLJIT_UNUSED_ARG(compiler);
! 1495: SLJIT_ASSERT_STOP();
! 1496: return NULL;
! 1497: }
! 1498:
! 1499: SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compiler *compiler, int type)
! 1500: {
! 1501: SLJIT_UNUSED_ARG(compiler);
! 1502: SLJIT_UNUSED_ARG(type);
! 1503: SLJIT_ASSERT_STOP();
! 1504: return NULL;
! 1505: }
! 1506:
! 1507: SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_cmp(struct sljit_compiler *compiler, int type,
! 1508: int src1, sljit_w src1w,
! 1509: int src2, sljit_w src2w)
! 1510: {
! 1511: SLJIT_UNUSED_ARG(compiler);
! 1512: SLJIT_UNUSED_ARG(type);
! 1513: SLJIT_UNUSED_ARG(src1);
! 1514: SLJIT_UNUSED_ARG(src1w);
! 1515: SLJIT_UNUSED_ARG(src2);
! 1516: SLJIT_UNUSED_ARG(src2w);
! 1517: SLJIT_ASSERT_STOP();
! 1518: return NULL;
! 1519: }
! 1520:
! 1521: SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_fcmp(struct sljit_compiler *compiler, int type,
! 1522: int src1, sljit_w src1w,
! 1523: int src2, sljit_w src2w)
! 1524: {
! 1525: SLJIT_UNUSED_ARG(compiler);
! 1526: SLJIT_UNUSED_ARG(type);
! 1527: SLJIT_UNUSED_ARG(src1);
! 1528: SLJIT_UNUSED_ARG(src1w);
! 1529: SLJIT_UNUSED_ARG(src2);
! 1530: SLJIT_UNUSED_ARG(src2w);
! 1531: SLJIT_ASSERT_STOP();
! 1532: return NULL;
! 1533: }
! 1534:
! 1535: SLJIT_API_FUNC_ATTRIBUTE void sljit_set_label(struct sljit_jump *jump, struct sljit_label* label)
! 1536: {
! 1537: SLJIT_UNUSED_ARG(jump);
! 1538: SLJIT_UNUSED_ARG(label);
! 1539: SLJIT_ASSERT_STOP();
! 1540: }
! 1541:
! 1542: SLJIT_API_FUNC_ATTRIBUTE void sljit_set_target(struct sljit_jump *jump, sljit_uw target)
! 1543: {
! 1544: SLJIT_UNUSED_ARG(jump);
! 1545: SLJIT_UNUSED_ARG(target);
! 1546: SLJIT_ASSERT_STOP();
! 1547: }
! 1548:
! 1549: SLJIT_API_FUNC_ATTRIBUTE int sljit_emit_ijump(struct sljit_compiler *compiler, int type, int src, sljit_w srcw)
! 1550: {
! 1551: SLJIT_UNUSED_ARG(compiler);
! 1552: SLJIT_UNUSED_ARG(type);
! 1553: SLJIT_UNUSED_ARG(src);
! 1554: SLJIT_UNUSED_ARG(srcw);
! 1555: SLJIT_ASSERT_STOP();
! 1556: return SLJIT_ERR_UNSUPPORTED;
! 1557: }
! 1558:
! 1559: SLJIT_API_FUNC_ATTRIBUTE int sljit_emit_cond_value(struct sljit_compiler *compiler, int op, int dst, sljit_w dstw, int type)
! 1560: {
! 1561: SLJIT_UNUSED_ARG(compiler);
! 1562: SLJIT_UNUSED_ARG(op);
! 1563: SLJIT_UNUSED_ARG(dst);
! 1564: SLJIT_UNUSED_ARG(dstw);
! 1565: SLJIT_UNUSED_ARG(type);
! 1566: SLJIT_ASSERT_STOP();
! 1567: return SLJIT_ERR_UNSUPPORTED;
! 1568: }
! 1569:
! 1570: SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compiler *compiler, int dst, sljit_w dstw, sljit_w initval)
! 1571: {
! 1572: SLJIT_UNUSED_ARG(compiler);
! 1573: SLJIT_UNUSED_ARG(dst);
! 1574: SLJIT_UNUSED_ARG(dstw);
! 1575: SLJIT_UNUSED_ARG(initval);
! 1576: SLJIT_ASSERT_STOP();
! 1577: return NULL;
! 1578: }
! 1579:
! 1580: SLJIT_API_FUNC_ATTRIBUTE void sljit_set_jump_addr(sljit_uw addr, sljit_uw new_addr)
! 1581: {
! 1582: SLJIT_UNUSED_ARG(addr);
! 1583: SLJIT_UNUSED_ARG(new_addr);
! 1584: SLJIT_ASSERT_STOP();
! 1585: }
! 1586:
! 1587: SLJIT_API_FUNC_ATTRIBUTE void sljit_set_const(sljit_uw addr, sljit_w new_constant)
! 1588: {
! 1589: SLJIT_UNUSED_ARG(addr);
! 1590: SLJIT_UNUSED_ARG(new_constant);
! 1591: SLJIT_ASSERT_STOP();
! 1592: }
! 1593:
! 1594: #endif
E-mail: