Annotation of embedaddon/pcre/sljit/sljitLir.c, revision 1.1
1.1 ! misho 1: /*
! 2: * Stack-less Just-In-Time compiler
! 3: *
! 4: * Copyright 2009-2010 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->generals = -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_GENERAL_REG1 && (r) <= SLJIT_GENERAL_REG3 && (r) <= SLJIT_GENERAL_REG1 - 1 + compiler->generals)) \
! 479:
! 480: #define FUNCTION_CHECK_SRC(p, i) \
! 481: SLJIT_ASSERT(compiler->temporaries != -1 && compiler->generals != -1); \
! 482: if (((p) >= SLJIT_TEMPORARY_REG1 && (p) <= SLJIT_TEMPORARY_REG1 - 1 + compiler->temporaries) || \
! 483: ((p) >= SLJIT_GENERAL_REG1 && (p) <= SLJIT_GENERAL_REG1 - 1 + compiler->generals) || \
! 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->generals != -1); \
! 502: if (((p) >= SLJIT_TEMPORARY_REG1 && (p) <= SLJIT_TEMPORARY_REG1 - 1 + compiler->temporaries) || \
! 503: ((p) >= SLJIT_GENERAL_REG1 && (p) <= SLJIT_GENERAL_REG1 - 1 + compiler->generals) || \
! 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*)"tmp_r1", (char*)"tmp_r2", (char*)"tmp_r3",
! 555: (char*)"tmp_er1", (char*)"tmp_er2", (char*)"gen_r1", (char*)"gen_r2",
! 556: (char*)"gen_r3", (char*)"gen_er1", (char*)"gen_er2", (char*)"stack_r"
! 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: /* op1 */
! 620: (char*)"mov", (char*)"mov.ub", (char*)"mov.sb", (char*)"mov.uh",
! 621: (char*)"mov.sh", (char*)"mov.ui", (char*)"mov.si", (char*)"movu",
! 622: (char*)"movu.ub", (char*)"movu.sb", (char*)"movu.uh", (char*)"movu.sh",
! 623: (char*)"movu.ui", (char*)"movu.si", (char*)"not", (char*)"neg",
! 624: (char*)"clz",
! 625: /* op2 */
! 626: (char*)"add", (char*)"addc", (char*)"sub", (char*)"subc",
! 627: (char*)"mul", (char*)"and", (char*)"or", (char*)"xor",
! 628: (char*)"shl", (char*)"lshr", (char*)"ashr",
! 629: /* fop1 */
! 630: (char*)"fcmp", (char*)"fmov", (char*)"fneg", (char*)"fabs",
! 631: /* fop2 */
! 632: (char*)"fadd", (char*)"fsub", (char*)"fmul", (char*)"fdiv"
! 633: };
! 634:
! 635: static char* jump_names[] = {
! 636: (char*)"c_equal", (char*)"c_not_equal",
! 637: (char*)"c_less", (char*)"c_greater_equal",
! 638: (char*)"c_greater", (char*)"c_less_equal",
! 639: (char*)"c_sig_less", (char*)"c_sig_greater_equal",
! 640: (char*)"c_sig_greater", (char*)"c_sig_less_equal",
! 641: (char*)"c_overflow", (char*)"c_not_overflow",
! 642: (char*)"c_mul_overflow", (char*)"c_mul_not_overflow",
! 643: (char*)"c_float_equal", (char*)"c_float_not_equal",
! 644: (char*)"c_float_less", (char*)"c_float_greater_equal",
! 645: (char*)"c_float_greater", (char*)"c_float_less_equal",
! 646: (char*)"c_float_nan", (char*)"c_float_not_nan",
! 647: (char*)"jump", (char*)"fast_call",
! 648: (char*)"call0", (char*)"call1", (char*)"call2", (char*)"call3"
! 649: };
! 650:
! 651: #endif
! 652:
! 653: /* --------------------------------------------------------------------- */
! 654: /* Arch dependent */
! 655: /* --------------------------------------------------------------------- */
! 656:
! 657: static SLJIT_INLINE void check_sljit_generate_code(struct sljit_compiler *compiler)
! 658: {
! 659: #if (defined SLJIT_DEBUG && SLJIT_DEBUG)
! 660: struct sljit_jump *jump;
! 661: #endif
! 662: /* If debug and verbose are disabled, all arguments are unused. */
! 663: SLJIT_UNUSED_ARG(compiler);
! 664:
! 665: SLJIT_ASSERT(compiler->size > 0);
! 666: #if (defined SLJIT_DEBUG && SLJIT_DEBUG)
! 667: jump = compiler->jumps;
! 668: while (jump) {
! 669: /* All jumps have target. */
! 670: SLJIT_ASSERT(jump->flags & (JUMP_LABEL | JUMP_ADDR));
! 671: jump = jump->next;
! 672: }
! 673: #endif
! 674: }
! 675:
! 676: static SLJIT_INLINE void check_sljit_emit_enter(struct sljit_compiler *compiler, int args, int temporaries, int generals, int local_size)
! 677: {
! 678: /* If debug and verbose are disabled, all arguments are unused. */
! 679: SLJIT_UNUSED_ARG(compiler);
! 680: SLJIT_UNUSED_ARG(args);
! 681: SLJIT_UNUSED_ARG(temporaries);
! 682: SLJIT_UNUSED_ARG(generals);
! 683: SLJIT_UNUSED_ARG(local_size);
! 684:
! 685: SLJIT_ASSERT(args >= 0 && args <= 3);
! 686: SLJIT_ASSERT(temporaries >= 0 && temporaries <= SLJIT_NO_TMP_REGISTERS);
! 687: SLJIT_ASSERT(generals >= 0 && generals <= SLJIT_NO_GEN_REGISTERS);
! 688: SLJIT_ASSERT(args <= generals);
! 689: SLJIT_ASSERT(local_size >= 0 && local_size <= SLJIT_MAX_LOCAL_SIZE);
! 690: #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
! 691: if (SLJIT_UNLIKELY(!!compiler->verbose))
! 692: fprintf(compiler->verbose, " enter args=%d temporaries=%d generals=%d local_size=%d\n", args, temporaries, generals, local_size);
! 693: #endif
! 694: }
! 695:
! 696: static SLJIT_INLINE void check_sljit_fake_enter(struct sljit_compiler *compiler, int args, int temporaries, int generals, int local_size)
! 697: {
! 698: /* If debug and verbose are disabled, all arguments are unused. */
! 699: SLJIT_UNUSED_ARG(compiler);
! 700: SLJIT_UNUSED_ARG(args);
! 701: SLJIT_UNUSED_ARG(temporaries);
! 702: SLJIT_UNUSED_ARG(generals);
! 703: SLJIT_UNUSED_ARG(local_size);
! 704:
! 705: SLJIT_ASSERT(args >= 0 && args <= 3);
! 706: SLJIT_ASSERT(temporaries >= 0 && temporaries <= SLJIT_NO_TMP_REGISTERS);
! 707: SLJIT_ASSERT(generals >= 0 && generals <= SLJIT_NO_GEN_REGISTERS);
! 708: SLJIT_ASSERT(args <= generals);
! 709: SLJIT_ASSERT(local_size >= 0 && local_size <= SLJIT_MAX_LOCAL_SIZE);
! 710: #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
! 711: if (SLJIT_UNLIKELY(!!compiler->verbose))
! 712: fprintf(compiler->verbose, " fake_enter args=%d temporaries=%d generals=%d local_size=%d\n", args, temporaries, generals, local_size);
! 713: #endif
! 714: }
! 715:
! 716: static SLJIT_INLINE void check_sljit_emit_return(struct sljit_compiler *compiler, int src, sljit_w srcw)
! 717: {
! 718: /* If debug and verbose are disabled, all arguments are unused. */
! 719: SLJIT_UNUSED_ARG(compiler);
! 720: SLJIT_UNUSED_ARG(src);
! 721: SLJIT_UNUSED_ARG(srcw);
! 722:
! 723: #if (defined SLJIT_DEBUG && SLJIT_DEBUG)
! 724: if (src != SLJIT_UNUSED) {
! 725: FUNCTION_CHECK_SRC(src, srcw);
! 726: }
! 727: else
! 728: SLJIT_ASSERT(srcw == 0);
! 729: #endif
! 730: #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
! 731: if (SLJIT_UNLIKELY(!!compiler->verbose)) {
! 732: fprintf(compiler->verbose, " return ");
! 733: sljit_verbose_param(src, srcw);
! 734: fprintf(compiler->verbose, "\n");
! 735: }
! 736: #endif
! 737: }
! 738:
! 739: static SLJIT_INLINE void check_sljit_emit_fast_enter(struct sljit_compiler *compiler, int dst, sljit_w dstw, int args, int temporaries, int generals, int local_size)
! 740: {
! 741: /* If debug and verbose are disabled, all arguments are unused. */
! 742: SLJIT_UNUSED_ARG(compiler);
! 743: SLJIT_UNUSED_ARG(dst);
! 744: SLJIT_UNUSED_ARG(dstw);
! 745: SLJIT_UNUSED_ARG(args);
! 746: SLJIT_UNUSED_ARG(temporaries);
! 747: SLJIT_UNUSED_ARG(generals);
! 748: SLJIT_UNUSED_ARG(local_size);
! 749:
! 750: SLJIT_ASSERT(args >= 0 && args <= 3);
! 751: SLJIT_ASSERT(temporaries >= 0 && temporaries <= SLJIT_NO_TMP_REGISTERS);
! 752: SLJIT_ASSERT(generals >= 0 && generals <= SLJIT_NO_GEN_REGISTERS);
! 753: SLJIT_ASSERT(args <= generals);
! 754: SLJIT_ASSERT(local_size >= 0 && local_size <= SLJIT_MAX_LOCAL_SIZE);
! 755: #if (defined SLJIT_DEBUG && SLJIT_DEBUG)
! 756: compiler->temporaries = temporaries;
! 757: compiler->generals = generals;
! 758: FUNCTION_CHECK_DST(dst, dstw);
! 759: compiler->temporaries = -1;
! 760: compiler->generals = -1;
! 761: #endif
! 762: #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
! 763: if (SLJIT_UNLIKELY(!!compiler->verbose)) {
! 764: fprintf(compiler->verbose, " fast_enter ");
! 765: sljit_verbose_param(dst, dstw);
! 766: fprintf(compiler->verbose, " args=%d temporaries=%d generals=%d local_size=%d\n", args, temporaries, generals, local_size);
! 767: }
! 768: #endif
! 769: }
! 770:
! 771: static SLJIT_INLINE void check_sljit_emit_fast_return(struct sljit_compiler *compiler, int src, sljit_w srcw)
! 772: {
! 773: /* If debug and verbose are disabled, all arguments are unused. */
! 774: SLJIT_UNUSED_ARG(compiler);
! 775: SLJIT_UNUSED_ARG(src);
! 776: SLJIT_UNUSED_ARG(srcw);
! 777:
! 778: #if (defined SLJIT_DEBUG && SLJIT_DEBUG)
! 779: FUNCTION_CHECK_SRC(src, srcw);
! 780: #endif
! 781: #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
! 782: if (SLJIT_UNLIKELY(!!compiler->verbose)) {
! 783: fprintf(compiler->verbose, " fast_return ");
! 784: sljit_verbose_param(src, srcw);
! 785: fprintf(compiler->verbose, "\n");
! 786: }
! 787: #endif
! 788: }
! 789:
! 790: static SLJIT_INLINE void check_sljit_emit_op0(struct sljit_compiler *compiler, int op)
! 791: {
! 792: /* If debug and verbose are disabled, all arguments are unused. */
! 793: SLJIT_UNUSED_ARG(compiler);
! 794: SLJIT_UNUSED_ARG(op);
! 795:
! 796: SLJIT_ASSERT(op >= SLJIT_BREAKPOINT && op <= SLJIT_NOP);
! 797: #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
! 798: if (SLJIT_UNLIKELY(!!compiler->verbose))
! 799: fprintf(compiler->verbose, " %s\n", op_names[op]);
! 800: #endif
! 801: }
! 802:
! 803: static SLJIT_INLINE void check_sljit_emit_op1(struct sljit_compiler *compiler, int op,
! 804: int dst, sljit_w dstw,
! 805: int src, sljit_w srcw)
! 806: {
! 807: /* If debug and verbose are disabled, all arguments are unused. */
! 808: SLJIT_UNUSED_ARG(compiler);
! 809: SLJIT_UNUSED_ARG(op);
! 810: SLJIT_UNUSED_ARG(dst);
! 811: SLJIT_UNUSED_ARG(dstw);
! 812: SLJIT_UNUSED_ARG(src);
! 813: SLJIT_UNUSED_ARG(srcw);
! 814:
! 815: SLJIT_ASSERT(GET_OPCODE(op) >= SLJIT_MOV && GET_OPCODE(op) <= SLJIT_CLZ);
! 816: #if (defined SLJIT_DEBUG && SLJIT_DEBUG)
! 817: FUNCTION_CHECK_OP();
! 818: FUNCTION_CHECK_SRC(src, srcw);
! 819: FUNCTION_CHECK_DST(dst, dstw);
! 820: FUNCTION_CHECK_OP1();
! 821: #endif
! 822: #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
! 823: if (SLJIT_UNLIKELY(!!compiler->verbose)) {
! 824: fprintf(compiler->verbose, " %s%s%s%s%s%s%s%s ", !(op & SLJIT_INT_OP) ? "" : "i", op_names[GET_OPCODE(op)],
! 825: !(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");
! 826: sljit_verbose_param(dst, dstw);
! 827: fprintf(compiler->verbose, ", ");
! 828: sljit_verbose_param(src, srcw);
! 829: fprintf(compiler->verbose, "\n");
! 830: }
! 831: #endif
! 832: }
! 833:
! 834: static SLJIT_INLINE void check_sljit_emit_op2(struct sljit_compiler *compiler, int op,
! 835: int dst, sljit_w dstw,
! 836: int src1, sljit_w src1w,
! 837: int src2, sljit_w src2w)
! 838: {
! 839: /* If debug and verbose are disabled, all arguments are unused. */
! 840: SLJIT_UNUSED_ARG(compiler);
! 841: SLJIT_UNUSED_ARG(op);
! 842: SLJIT_UNUSED_ARG(dst);
! 843: SLJIT_UNUSED_ARG(dstw);
! 844: SLJIT_UNUSED_ARG(src1);
! 845: SLJIT_UNUSED_ARG(src1w);
! 846: SLJIT_UNUSED_ARG(src2);
! 847: SLJIT_UNUSED_ARG(src2w);
! 848:
! 849: #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) || (defined SLJIT_DEBUG && SLJIT_DEBUG)
! 850: if (SLJIT_UNLIKELY(compiler->skip_checks)) {
! 851: compiler->skip_checks = 0;
! 852: return;
! 853: }
! 854: #endif
! 855:
! 856: SLJIT_ASSERT(GET_OPCODE(op) >= SLJIT_ADD && GET_OPCODE(op) <= SLJIT_ASHR);
! 857: #if (defined SLJIT_DEBUG && SLJIT_DEBUG)
! 858: FUNCTION_CHECK_OP();
! 859: FUNCTION_CHECK_SRC(src1, src1w);
! 860: FUNCTION_CHECK_SRC(src2, src2w);
! 861: FUNCTION_CHECK_DST(dst, dstw);
! 862: #endif
! 863: #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
! 864: if (SLJIT_UNLIKELY(!!compiler->verbose)) {
! 865: fprintf(compiler->verbose, " %s%s%s%s%s%s%s%s ", !(op & SLJIT_INT_OP) ? "" : "i", op_names[GET_OPCODE(op)],
! 866: !(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");
! 867: sljit_verbose_param(dst, dstw);
! 868: fprintf(compiler->verbose, ", ");
! 869: sljit_verbose_param(src1, src1w);
! 870: fprintf(compiler->verbose, ", ");
! 871: sljit_verbose_param(src2, src2w);
! 872: fprintf(compiler->verbose, "\n");
! 873: }
! 874: #endif
! 875: }
! 876:
! 877: static SLJIT_INLINE void check_sljit_emit_fop1(struct sljit_compiler *compiler, int op,
! 878: int dst, sljit_w dstw,
! 879: int src, sljit_w srcw)
! 880: {
! 881: /* If debug and verbose are disabled, all arguments are unused. */
! 882: SLJIT_UNUSED_ARG(compiler);
! 883: SLJIT_UNUSED_ARG(op);
! 884: SLJIT_UNUSED_ARG(dst);
! 885: SLJIT_UNUSED_ARG(dstw);
! 886: SLJIT_UNUSED_ARG(src);
! 887: SLJIT_UNUSED_ARG(srcw);
! 888:
! 889: SLJIT_ASSERT(sljit_is_fpu_available());
! 890: SLJIT_ASSERT(GET_OPCODE(op) >= SLJIT_FCMP && GET_OPCODE(op) <= SLJIT_FABS);
! 891: #if (defined SLJIT_DEBUG && SLJIT_DEBUG)
! 892: FUNCTION_CHECK_OP();
! 893: FUNCTION_FCHECK(src, srcw);
! 894: FUNCTION_FCHECK(dst, dstw);
! 895: #endif
! 896: #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
! 897: if (SLJIT_UNLIKELY(!!compiler->verbose)) {
! 898: fprintf(compiler->verbose, " %s%s%s ", op_names[GET_OPCODE(op)],
! 899: !(op & SLJIT_SET_E) ? "" : "E", !(op & SLJIT_SET_S) ? "" : "S");
! 900: sljit_verbose_fparam(dst, dstw);
! 901: fprintf(compiler->verbose, ", ");
! 902: sljit_verbose_fparam(src, srcw);
! 903: fprintf(compiler->verbose, "\n");
! 904: }
! 905: #endif
! 906: }
! 907:
! 908: static SLJIT_INLINE void check_sljit_emit_fop2(struct sljit_compiler *compiler, int op,
! 909: int dst, sljit_w dstw,
! 910: int src1, sljit_w src1w,
! 911: int src2, sljit_w src2w)
! 912: {
! 913: /* If debug and verbose are disabled, all arguments are unused. */
! 914: SLJIT_UNUSED_ARG(compiler);
! 915: SLJIT_UNUSED_ARG(op);
! 916: SLJIT_UNUSED_ARG(dst);
! 917: SLJIT_UNUSED_ARG(dstw);
! 918: SLJIT_UNUSED_ARG(src1);
! 919: SLJIT_UNUSED_ARG(src1w);
! 920: SLJIT_UNUSED_ARG(src2);
! 921: SLJIT_UNUSED_ARG(src2w);
! 922:
! 923: SLJIT_ASSERT(sljit_is_fpu_available());
! 924: SLJIT_ASSERT(GET_OPCODE(op) >= SLJIT_FADD && GET_OPCODE(op) <= SLJIT_FDIV);
! 925: #if (defined SLJIT_DEBUG && SLJIT_DEBUG)
! 926: FUNCTION_CHECK_OP();
! 927: FUNCTION_FCHECK(src1, src1w);
! 928: FUNCTION_FCHECK(src2, src2w);
! 929: FUNCTION_FCHECK(dst, dstw);
! 930: #endif
! 931: #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
! 932: if (SLJIT_UNLIKELY(!!compiler->verbose)) {
! 933: fprintf(compiler->verbose, " %s ", op_names[GET_OPCODE(op)]);
! 934: sljit_verbose_fparam(dst, dstw);
! 935: fprintf(compiler->verbose, ", ");
! 936: sljit_verbose_fparam(src1, src1w);
! 937: fprintf(compiler->verbose, ", ");
! 938: sljit_verbose_fparam(src2, src2w);
! 939: fprintf(compiler->verbose, "\n");
! 940: }
! 941: #endif
! 942: }
! 943:
! 944: static SLJIT_INLINE void check_sljit_emit_label(struct sljit_compiler *compiler)
! 945: {
! 946: /* If debug and verbose are disabled, all arguments are unused. */
! 947: SLJIT_UNUSED_ARG(compiler);
! 948:
! 949: #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
! 950: if (SLJIT_UNLIKELY(!!compiler->verbose))
! 951: fprintf(compiler->verbose, "label:\n");
! 952: #endif
! 953: }
! 954:
! 955: static SLJIT_INLINE void check_sljit_emit_jump(struct sljit_compiler *compiler, int type)
! 956: {
! 957: /* If debug and verbose are disabled, all arguments are unused. */
! 958: SLJIT_UNUSED_ARG(compiler);
! 959: SLJIT_UNUSED_ARG(type);
! 960:
! 961: #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) || (defined SLJIT_DEBUG && SLJIT_DEBUG)
! 962: if (SLJIT_UNLIKELY(compiler->skip_checks)) {
! 963: compiler->skip_checks = 0;
! 964: return;
! 965: }
! 966: #endif
! 967:
! 968: SLJIT_ASSERT(!(type & ~(0xff | SLJIT_REWRITABLE_JUMP)));
! 969: SLJIT_ASSERT((type & 0xff) >= SLJIT_C_EQUAL && (type & 0xff) <= SLJIT_CALL3);
! 970: #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
! 971: if (SLJIT_UNLIKELY(!!compiler->verbose))
! 972: fprintf(compiler->verbose, " jump%s <%s>\n", !(type & SLJIT_REWRITABLE_JUMP) ? "" : "R", jump_names[type & 0xff]);
! 973: #endif
! 974: }
! 975:
! 976: static SLJIT_INLINE void check_sljit_emit_cmp(struct sljit_compiler *compiler, int type,
! 977: int src1, sljit_w src1w,
! 978: int src2, sljit_w src2w)
! 979: {
! 980: SLJIT_UNUSED_ARG(compiler);
! 981: SLJIT_UNUSED_ARG(type);
! 982: SLJIT_UNUSED_ARG(src1);
! 983: SLJIT_UNUSED_ARG(src1w);
! 984: SLJIT_UNUSED_ARG(src2);
! 985: SLJIT_UNUSED_ARG(src2w);
! 986:
! 987: SLJIT_ASSERT(!(type & ~(0xff | SLJIT_INT_OP | SLJIT_REWRITABLE_JUMP)));
! 988: SLJIT_ASSERT((type & 0xff) >= SLJIT_C_EQUAL && (type & 0xff) <= SLJIT_C_SIG_LESS_EQUAL);
! 989: #if (defined SLJIT_DEBUG && SLJIT_DEBUG)
! 990: FUNCTION_CHECK_SRC(src1, src1w);
! 991: FUNCTION_CHECK_SRC(src2, src2w);
! 992: #endif
! 993: #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
! 994: if (SLJIT_UNLIKELY(!!compiler->verbose)) {
! 995: fprintf(compiler->verbose, " %scmp%s <%s> ", !(type & SLJIT_INT_OP) ? "" : "i", !(type & SLJIT_REWRITABLE_JUMP) ? "" : "R", jump_names[type & 0xff]);
! 996: sljit_verbose_param(src1, src1w);
! 997: fprintf(compiler->verbose, ", ");
! 998: sljit_verbose_param(src2, src2w);
! 999: fprintf(compiler->verbose, "\n");
! 1000: }
! 1001: #endif
! 1002: }
! 1003:
! 1004: static SLJIT_INLINE void check_sljit_emit_ijump(struct sljit_compiler *compiler, int type, int src, sljit_w srcw)
! 1005: {
! 1006: /* If debug and verbose are disabled, all arguments are unused. */
! 1007: SLJIT_UNUSED_ARG(compiler);
! 1008: SLJIT_UNUSED_ARG(type);
! 1009: SLJIT_UNUSED_ARG(src);
! 1010: SLJIT_UNUSED_ARG(srcw);
! 1011:
! 1012: SLJIT_ASSERT(type >= SLJIT_JUMP && type <= SLJIT_CALL3);
! 1013: #if (defined SLJIT_DEBUG && SLJIT_DEBUG)
! 1014: FUNCTION_CHECK_SRC(src, srcw);
! 1015: #endif
! 1016: #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
! 1017: if (SLJIT_UNLIKELY(!!compiler->verbose)) {
! 1018: fprintf(compiler->verbose, " ijump <%s> ", jump_names[type]);
! 1019: sljit_verbose_param(src, srcw);
! 1020: fprintf(compiler->verbose, "\n");
! 1021: }
! 1022: #endif
! 1023: }
! 1024:
! 1025: static SLJIT_INLINE void check_sljit_emit_cond_value(struct sljit_compiler *compiler, int op, int dst, sljit_w dstw, int type)
! 1026: {
! 1027: /* If debug and verbose are disabled, all arguments are unused. */
! 1028: SLJIT_UNUSED_ARG(compiler);
! 1029: SLJIT_UNUSED_ARG(op);
! 1030: SLJIT_UNUSED_ARG(dst);
! 1031: SLJIT_UNUSED_ARG(dstw);
! 1032: SLJIT_UNUSED_ARG(type);
! 1033:
! 1034: SLJIT_ASSERT(type >= SLJIT_C_EQUAL && type < SLJIT_JUMP);
! 1035: SLJIT_ASSERT(op == SLJIT_MOV || GET_OPCODE(op) == SLJIT_OR);
! 1036: SLJIT_ASSERT(GET_ALL_FLAGS(op) == 0 || GET_ALL_FLAGS(op) == SLJIT_SET_E || GET_ALL_FLAGS(op) == SLJIT_KEEP_FLAGS);
! 1037: #if (defined SLJIT_DEBUG && SLJIT_DEBUG)
! 1038: FUNCTION_CHECK_DST(dst, dstw);
! 1039: #endif
! 1040: #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
! 1041: if (SLJIT_UNLIKELY(!!compiler->verbose)) {
! 1042: fprintf(compiler->verbose, " cond_set%s%s <%s> ", !(op & SLJIT_SET_E) ? "" : "E",
! 1043: !(op & SLJIT_KEEP_FLAGS) ? "" : "K", op_names[GET_OPCODE(op)]);
! 1044: sljit_verbose_param(dst, dstw);
! 1045: fprintf(compiler->verbose, ", <%s>\n", jump_names[type]);
! 1046: }
! 1047: #endif
! 1048: }
! 1049:
! 1050: static SLJIT_INLINE void check_sljit_emit_const(struct sljit_compiler *compiler, int dst, sljit_w dstw, sljit_w init_value)
! 1051: {
! 1052: /* If debug and verbose are disabled, all arguments are unused. */
! 1053: SLJIT_UNUSED_ARG(compiler);
! 1054: SLJIT_UNUSED_ARG(dst);
! 1055: SLJIT_UNUSED_ARG(dstw);
! 1056: SLJIT_UNUSED_ARG(init_value);
! 1057:
! 1058: #if (defined SLJIT_DEBUG && SLJIT_DEBUG)
! 1059: FUNCTION_CHECK_DST(dst, dstw);
! 1060: #endif
! 1061: #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
! 1062: if (SLJIT_UNLIKELY(!!compiler->verbose)) {
! 1063: fprintf(compiler->verbose, " const ");
! 1064: sljit_verbose_param(dst, dstw);
! 1065: fprintf(compiler->verbose, ", #%"SLJIT_PRINT_D"d\n", init_value);
! 1066: }
! 1067: #endif
! 1068: }
! 1069:
! 1070: #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
! 1071: #include "sljitNativeX86_common.c"
! 1072: #elif (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
! 1073: #include "sljitNativeX86_common.c"
! 1074: #elif (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)
! 1075: #include "sljitNativeARM_v5.c"
! 1076: #elif (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7)
! 1077: #include "sljitNativeARM_v5.c"
! 1078: #elif (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2)
! 1079: #include "sljitNativeARM_Thumb2.c"
! 1080: #elif (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32)
! 1081: #include "sljitNativePPC_common.c"
! 1082: #elif (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
! 1083: #include "sljitNativePPC_common.c"
! 1084: #elif (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)
! 1085: #include "sljitNativeMIPS_common.c"
! 1086: #endif
! 1087:
! 1088: #if !(defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)
! 1089: SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_cmp(struct sljit_compiler *compiler, int type,
! 1090: int src1, sljit_w src1w,
! 1091: int src2, sljit_w src2w)
! 1092: {
! 1093: /* Default compare for most architectures. */
! 1094: int flags, tmp_src, condition;
! 1095: sljit_w tmp_srcw;
! 1096:
! 1097: CHECK_ERROR_PTR();
! 1098: check_sljit_emit_cmp(compiler, type, src1, src1w, src2, src2w);
! 1099:
! 1100: condition = type & 0xff;
! 1101: if (SLJIT_UNLIKELY((src1 & SLJIT_IMM) && !(src2 & SLJIT_IMM))) {
! 1102: /* Immediate is prefered as second argument by most architectures. */
! 1103: switch (condition) {
! 1104: case SLJIT_C_LESS:
! 1105: condition = SLJIT_C_GREATER;
! 1106: break;
! 1107: case SLJIT_C_GREATER_EQUAL:
! 1108: condition = SLJIT_C_LESS_EQUAL;
! 1109: break;
! 1110: case SLJIT_C_GREATER:
! 1111: condition = SLJIT_C_LESS;
! 1112: break;
! 1113: case SLJIT_C_LESS_EQUAL:
! 1114: condition = SLJIT_C_GREATER_EQUAL;
! 1115: break;
! 1116: case SLJIT_C_SIG_LESS:
! 1117: condition = SLJIT_C_SIG_GREATER;
! 1118: break;
! 1119: case SLJIT_C_SIG_GREATER_EQUAL:
! 1120: condition = SLJIT_C_SIG_LESS_EQUAL;
! 1121: break;
! 1122: case SLJIT_C_SIG_GREATER:
! 1123: condition = SLJIT_C_SIG_LESS;
! 1124: break;
! 1125: case SLJIT_C_SIG_LESS_EQUAL:
! 1126: condition = SLJIT_C_SIG_GREATER_EQUAL;
! 1127: break;
! 1128: }
! 1129: type = condition | (type & (SLJIT_INT_OP | SLJIT_REWRITABLE_JUMP));
! 1130: tmp_src = src1;
! 1131: src1 = src2;
! 1132: src2 = tmp_src;
! 1133: tmp_srcw = src1w;
! 1134: src1w = src2w;
! 1135: src2w = tmp_srcw;
! 1136: }
! 1137:
! 1138: if (condition <= SLJIT_C_NOT_ZERO)
! 1139: flags = SLJIT_SET_E;
! 1140: else if (condition <= SLJIT_C_LESS_EQUAL)
! 1141: flags = SLJIT_SET_U;
! 1142: else
! 1143: flags = SLJIT_SET_S;
! 1144:
! 1145: #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) || (defined SLJIT_DEBUG && SLJIT_DEBUG)
! 1146: compiler->skip_checks = 1;
! 1147: #endif
! 1148: PTR_FAIL_IF(sljit_emit_op2(compiler, SLJIT_SUB | flags | (type & SLJIT_INT_OP),
! 1149: SLJIT_UNUSED, 0, src1, src1w, src2, src2w));
! 1150: #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) || (defined SLJIT_DEBUG && SLJIT_DEBUG)
! 1151: compiler->skip_checks = 1;
! 1152: #endif
! 1153: return sljit_emit_jump(compiler, condition | (type & SLJIT_REWRITABLE_JUMP));
! 1154: }
! 1155: #endif
! 1156:
! 1157: #else /* SLJIT_CONFIG_UNSUPPORTED */
! 1158:
! 1159: /* Empty function bodies for those machines, which are not (yet) supported. */
! 1160:
! 1161: SLJIT_API_FUNC_ATTRIBUTE SLJIT_CONST char* sljit_get_platform_name()
! 1162: {
! 1163: return "unsupported";
! 1164: }
! 1165:
! 1166: SLJIT_API_FUNC_ATTRIBUTE struct sljit_compiler* sljit_create_compiler(void)
! 1167: {
! 1168: SLJIT_ASSERT_STOP();
! 1169: return NULL;
! 1170: }
! 1171:
! 1172: SLJIT_API_FUNC_ATTRIBUTE void sljit_free_compiler(struct sljit_compiler *compiler)
! 1173: {
! 1174: SLJIT_UNUSED_ARG(compiler);
! 1175: SLJIT_ASSERT_STOP();
! 1176: }
! 1177:
! 1178: SLJIT_API_FUNC_ATTRIBUTE void* sljit_alloc_memory(struct sljit_compiler *compiler, int size)
! 1179: {
! 1180: SLJIT_UNUSED_ARG(compiler);
! 1181: SLJIT_UNUSED_ARG(size);
! 1182: SLJIT_ASSERT_STOP();
! 1183: return NULL;
! 1184: }
! 1185:
! 1186: #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
! 1187: SLJIT_API_FUNC_ATTRIBUTE void sljit_compiler_verbose(struct sljit_compiler *compiler, FILE* verbose)
! 1188: {
! 1189: SLJIT_UNUSED_ARG(compiler);
! 1190: SLJIT_UNUSED_ARG(verbose);
! 1191: SLJIT_ASSERT_STOP();
! 1192: }
! 1193: #endif
! 1194:
! 1195: SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compiler)
! 1196: {
! 1197: SLJIT_UNUSED_ARG(compiler);
! 1198: SLJIT_ASSERT_STOP();
! 1199: return NULL;
! 1200: }
! 1201:
! 1202: SLJIT_API_FUNC_ATTRIBUTE void sljit_free_code(void* code)
! 1203: {
! 1204: SLJIT_UNUSED_ARG(code);
! 1205: SLJIT_ASSERT_STOP();
! 1206: }
! 1207:
! 1208: SLJIT_API_FUNC_ATTRIBUTE int sljit_emit_enter(struct sljit_compiler *compiler, int args, int temporaries, int generals, int local_size)
! 1209: {
! 1210: SLJIT_UNUSED_ARG(compiler);
! 1211: SLJIT_UNUSED_ARG(args);
! 1212: SLJIT_UNUSED_ARG(temporaries);
! 1213: SLJIT_UNUSED_ARG(generals);
! 1214: SLJIT_UNUSED_ARG(local_size);
! 1215: SLJIT_ASSERT_STOP();
! 1216: return SLJIT_ERR_UNSUPPORTED;
! 1217: }
! 1218:
! 1219: SLJIT_API_FUNC_ATTRIBUTE void sljit_fake_enter(struct sljit_compiler *compiler, int args, int temporaries, int generals, int local_size)
! 1220: {
! 1221: SLJIT_UNUSED_ARG(compiler);
! 1222: SLJIT_UNUSED_ARG(args);
! 1223: SLJIT_UNUSED_ARG(temporaries);
! 1224: SLJIT_UNUSED_ARG(generals);
! 1225: SLJIT_UNUSED_ARG(local_size);
! 1226: SLJIT_ASSERT_STOP();
! 1227: }
! 1228:
! 1229: SLJIT_API_FUNC_ATTRIBUTE int sljit_emit_return(struct sljit_compiler *compiler, int src, sljit_w srcw)
! 1230: {
! 1231: SLJIT_UNUSED_ARG(compiler);
! 1232: SLJIT_UNUSED_ARG(src);
! 1233: SLJIT_UNUSED_ARG(srcw);
! 1234: SLJIT_ASSERT_STOP();
! 1235: return SLJIT_ERR_UNSUPPORTED;
! 1236: }
! 1237:
! 1238: SLJIT_API_FUNC_ATTRIBUTE int sljit_emit_fast_enter(struct sljit_compiler *compiler, int dst, sljit_w dstw, int args, int temporaries, int generals, int local_size)
! 1239: {
! 1240: SLJIT_UNUSED_ARG(compiler);
! 1241: SLJIT_UNUSED_ARG(dst);
! 1242: SLJIT_UNUSED_ARG(dstw);
! 1243: SLJIT_UNUSED_ARG(args);
! 1244: SLJIT_UNUSED_ARG(temporaries);
! 1245: SLJIT_UNUSED_ARG(generals);
! 1246: SLJIT_UNUSED_ARG(local_size);
! 1247: SLJIT_ASSERT_STOP();
! 1248: return SLJIT_ERR_UNSUPPORTED;
! 1249: }
! 1250:
! 1251: SLJIT_API_FUNC_ATTRIBUTE int sljit_emit_fast_return(struct sljit_compiler *compiler, int src, sljit_w srcw)
! 1252: {
! 1253: SLJIT_UNUSED_ARG(compiler);
! 1254: SLJIT_UNUSED_ARG(src);
! 1255: SLJIT_UNUSED_ARG(srcw);
! 1256: SLJIT_ASSERT_STOP();
! 1257: return SLJIT_ERR_UNSUPPORTED;
! 1258: }
! 1259:
! 1260: SLJIT_API_FUNC_ATTRIBUTE int sljit_emit_op0(struct sljit_compiler *compiler, int op)
! 1261: {
! 1262: SLJIT_UNUSED_ARG(compiler);
! 1263: SLJIT_UNUSED_ARG(op);
! 1264: SLJIT_ASSERT_STOP();
! 1265: return SLJIT_ERR_UNSUPPORTED;
! 1266: }
! 1267:
! 1268: SLJIT_API_FUNC_ATTRIBUTE int sljit_emit_op1(struct sljit_compiler *compiler, int op,
! 1269: int dst, sljit_w dstw,
! 1270: int src, sljit_w srcw)
! 1271: {
! 1272: SLJIT_UNUSED_ARG(compiler);
! 1273: SLJIT_UNUSED_ARG(op);
! 1274: SLJIT_UNUSED_ARG(dst);
! 1275: SLJIT_UNUSED_ARG(dstw);
! 1276: SLJIT_UNUSED_ARG(src);
! 1277: SLJIT_UNUSED_ARG(srcw);
! 1278: SLJIT_ASSERT_STOP();
! 1279: return SLJIT_ERR_UNSUPPORTED;
! 1280: }
! 1281:
! 1282: SLJIT_API_FUNC_ATTRIBUTE int sljit_emit_op2(struct sljit_compiler *compiler, int op,
! 1283: int dst, sljit_w dstw,
! 1284: int src1, sljit_w src1w,
! 1285: int src2, sljit_w src2w)
! 1286: {
! 1287: SLJIT_UNUSED_ARG(compiler);
! 1288: SLJIT_UNUSED_ARG(op);
! 1289: SLJIT_UNUSED_ARG(dst);
! 1290: SLJIT_UNUSED_ARG(dstw);
! 1291: SLJIT_UNUSED_ARG(src1);
! 1292: SLJIT_UNUSED_ARG(src1w);
! 1293: SLJIT_UNUSED_ARG(src2);
! 1294: SLJIT_UNUSED_ARG(src2w);
! 1295: SLJIT_ASSERT_STOP();
! 1296: return SLJIT_ERR_UNSUPPORTED;
! 1297: }
! 1298:
! 1299: SLJIT_API_FUNC_ATTRIBUTE int sljit_is_fpu_available(void)
! 1300: {
! 1301: SLJIT_ASSERT_STOP();
! 1302: return 0;
! 1303: }
! 1304:
! 1305: SLJIT_API_FUNC_ATTRIBUTE int sljit_emit_fop1(struct sljit_compiler *compiler, int op,
! 1306: int dst, sljit_w dstw,
! 1307: int src, sljit_w srcw)
! 1308: {
! 1309: SLJIT_UNUSED_ARG(compiler);
! 1310: SLJIT_UNUSED_ARG(op);
! 1311: SLJIT_UNUSED_ARG(dst);
! 1312: SLJIT_UNUSED_ARG(dstw);
! 1313: SLJIT_UNUSED_ARG(src);
! 1314: SLJIT_UNUSED_ARG(srcw);
! 1315: SLJIT_ASSERT_STOP();
! 1316: return SLJIT_ERR_UNSUPPORTED;
! 1317: }
! 1318:
! 1319: SLJIT_API_FUNC_ATTRIBUTE int sljit_emit_fop2(struct sljit_compiler *compiler, int op,
! 1320: int dst, sljit_w dstw,
! 1321: int src1, sljit_w src1w,
! 1322: int src2, sljit_w src2w)
! 1323: {
! 1324: SLJIT_UNUSED_ARG(compiler);
! 1325: SLJIT_UNUSED_ARG(op);
! 1326: SLJIT_UNUSED_ARG(dst);
! 1327: SLJIT_UNUSED_ARG(dstw);
! 1328: SLJIT_UNUSED_ARG(src1);
! 1329: SLJIT_UNUSED_ARG(src1w);
! 1330: SLJIT_UNUSED_ARG(src2);
! 1331: SLJIT_UNUSED_ARG(src2w);
! 1332: SLJIT_ASSERT_STOP();
! 1333: return SLJIT_ERR_UNSUPPORTED;
! 1334: }
! 1335:
! 1336: SLJIT_API_FUNC_ATTRIBUTE struct sljit_label* sljit_emit_label(struct sljit_compiler *compiler)
! 1337: {
! 1338: SLJIT_UNUSED_ARG(compiler);
! 1339: SLJIT_ASSERT_STOP();
! 1340: return NULL;
! 1341: }
! 1342:
! 1343: SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compiler *compiler, int type)
! 1344: {
! 1345: SLJIT_UNUSED_ARG(compiler);
! 1346: SLJIT_UNUSED_ARG(type);
! 1347: SLJIT_ASSERT_STOP();
! 1348: return NULL;
! 1349: }
! 1350:
! 1351: SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_cmp(struct sljit_compiler *compiler, int type,
! 1352: int src1, sljit_w src1w,
! 1353: int src2, sljit_w src2w)
! 1354: {
! 1355: SLJIT_UNUSED_ARG(compiler);
! 1356: SLJIT_UNUSED_ARG(type);
! 1357: SLJIT_UNUSED_ARG(src1);
! 1358: SLJIT_UNUSED_ARG(src1w);
! 1359: SLJIT_UNUSED_ARG(src2);
! 1360: SLJIT_UNUSED_ARG(src2w);
! 1361: SLJIT_ASSERT_STOP();
! 1362: return NULL;
! 1363: }
! 1364:
! 1365: SLJIT_API_FUNC_ATTRIBUTE void sljit_set_label(struct sljit_jump *jump, struct sljit_label* label)
! 1366: {
! 1367: SLJIT_UNUSED_ARG(jump);
! 1368: SLJIT_UNUSED_ARG(label);
! 1369: SLJIT_ASSERT_STOP();
! 1370: }
! 1371:
! 1372: SLJIT_API_FUNC_ATTRIBUTE void sljit_set_target(struct sljit_jump *jump, sljit_uw target)
! 1373: {
! 1374: SLJIT_UNUSED_ARG(jump);
! 1375: SLJIT_UNUSED_ARG(target);
! 1376: SLJIT_ASSERT_STOP();
! 1377: }
! 1378:
! 1379: SLJIT_API_FUNC_ATTRIBUTE int sljit_emit_ijump(struct sljit_compiler *compiler, int type, int src, sljit_w srcw)
! 1380: {
! 1381: SLJIT_UNUSED_ARG(compiler);
! 1382: SLJIT_UNUSED_ARG(type);
! 1383: SLJIT_UNUSED_ARG(src);
! 1384: SLJIT_UNUSED_ARG(srcw);
! 1385: SLJIT_ASSERT_STOP();
! 1386: return SLJIT_ERR_UNSUPPORTED;
! 1387: }
! 1388:
! 1389: SLJIT_API_FUNC_ATTRIBUTE int sljit_emit_cond_value(struct sljit_compiler *compiler, int op, int dst, sljit_w dstw, int type)
! 1390: {
! 1391: SLJIT_UNUSED_ARG(compiler);
! 1392: SLJIT_UNUSED_ARG(op);
! 1393: SLJIT_UNUSED_ARG(dst);
! 1394: SLJIT_UNUSED_ARG(dstw);
! 1395: SLJIT_UNUSED_ARG(type);
! 1396: SLJIT_ASSERT_STOP();
! 1397: return SLJIT_ERR_UNSUPPORTED;
! 1398: }
! 1399:
! 1400: SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compiler *compiler, int dst, sljit_w dstw, sljit_w initval)
! 1401: {
! 1402: SLJIT_UNUSED_ARG(compiler);
! 1403: SLJIT_UNUSED_ARG(dst);
! 1404: SLJIT_UNUSED_ARG(dstw);
! 1405: SLJIT_UNUSED_ARG(initval);
! 1406: SLJIT_ASSERT_STOP();
! 1407: return NULL;
! 1408: }
! 1409:
! 1410: SLJIT_API_FUNC_ATTRIBUTE void sljit_set_jump_addr(sljit_uw addr, sljit_uw new_addr)
! 1411: {
! 1412: SLJIT_UNUSED_ARG(addr);
! 1413: SLJIT_UNUSED_ARG(new_addr);
! 1414: SLJIT_ASSERT_STOP();
! 1415: }
! 1416:
! 1417: SLJIT_API_FUNC_ATTRIBUTE void sljit_set_const(sljit_uw addr, sljit_w new_constant)
! 1418: {
! 1419: SLJIT_UNUSED_ARG(addr);
! 1420: SLJIT_UNUSED_ARG(new_constant);
! 1421: SLJIT_ASSERT_STOP();
! 1422: }
! 1423:
! 1424: #endif
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>