|
version 1.1.1.1, 2012/02/21 23:05:52
|
version 1.1.1.2, 2012/02/21 23:50:25
|
|
Line 1
|
Line 1
|
| /* |
/* |
| * Stack-less Just-In-Time compiler |
* Stack-less Just-In-Time compiler |
| * |
* |
| * Copyright 2009-2010 Zoltan Herczeg (hzmester@freemail.hu). All rights reserved. | * Copyright 2009-2012 Zoltan Herczeg (hzmester@freemail.hu). All rights reserved. |
| * |
* |
| * Redistribution and use in source and binary forms, with or without modification, are |
* Redistribution and use in source and binary forms, with or without modification, are |
| * permitted provided that the following conditions are met: |
* permitted provided that the following conditions are met: |
|
Line 228 SLJIT_API_FUNC_ATTRIBUTE struct sljit_compiler* sljit_
|
Line 228 SLJIT_API_FUNC_ATTRIBUTE struct sljit_compiler* sljit_
|
| compiler->abuf->used_size = 0; |
compiler->abuf->used_size = 0; |
| |
|
| compiler->temporaries = -1; |
compiler->temporaries = -1; |
| compiler->generals = -1; | compiler->saveds = -1; |
| |
|
| #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) |
#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) |
| compiler->args = -1; |
compiler->args = -1; |
|
Line 475 static SLJIT_INLINE void set_const(struct sljit_const
|
Line 475 static SLJIT_INLINE void set_const(struct sljit_const
|
| #define FUNCTION_CHECK_IS_REG(r) \ |
#define FUNCTION_CHECK_IS_REG(r) \ |
| ((r) == SLJIT_UNUSED || (r) == SLJIT_LOCALS_REG || \ |
((r) == SLJIT_UNUSED || (r) == SLJIT_LOCALS_REG || \ |
| ((r) >= SLJIT_TEMPORARY_REG1 && (r) <= SLJIT_TEMPORARY_REG3 && (r) <= SLJIT_TEMPORARY_REG1 - 1 + compiler->temporaries) || \ |
((r) >= SLJIT_TEMPORARY_REG1 && (r) <= SLJIT_TEMPORARY_REG3 && (r) <= SLJIT_TEMPORARY_REG1 - 1 + compiler->temporaries) || \ |
| ((r) >= SLJIT_GENERAL_REG1 && (r) <= SLJIT_GENERAL_REG3 && (r) <= SLJIT_GENERAL_REG1 - 1 + compiler->generals)) \ | ((r) >= SLJIT_SAVED_REG1 && (r) <= SLJIT_SAVED_REG3 && (r) <= SLJIT_SAVED_REG1 - 1 + compiler->saveds)) \ |
| |
|
| #define FUNCTION_CHECK_SRC(p, i) \ |
#define FUNCTION_CHECK_SRC(p, i) \ |
| SLJIT_ASSERT(compiler->temporaries != -1 && compiler->generals != -1); \ | SLJIT_ASSERT(compiler->temporaries != -1 && compiler->saveds != -1); \ |
| if (((p) >= SLJIT_TEMPORARY_REG1 && (p) <= SLJIT_TEMPORARY_REG1 - 1 + compiler->temporaries) || \ |
if (((p) >= SLJIT_TEMPORARY_REG1 && (p) <= SLJIT_TEMPORARY_REG1 - 1 + compiler->temporaries) || \ |
| ((p) >= SLJIT_GENERAL_REG1 && (p) <= SLJIT_GENERAL_REG1 - 1 + compiler->generals) || \ | ((p) >= SLJIT_SAVED_REG1 && (p) <= SLJIT_SAVED_REG1 - 1 + compiler->saveds) || \ |
| (p) == SLJIT_LOCALS_REG) \ |
(p) == SLJIT_LOCALS_REG) \ |
| SLJIT_ASSERT(i == 0); \ |
SLJIT_ASSERT(i == 0); \ |
| else if ((p) == SLJIT_IMM) \ |
else if ((p) == SLJIT_IMM) \ |
|
Line 498 static SLJIT_INLINE void set_const(struct sljit_const
|
Line 498 static SLJIT_INLINE void set_const(struct sljit_const
|
| SLJIT_ASSERT_STOP(); |
SLJIT_ASSERT_STOP(); |
| |
|
| #define FUNCTION_CHECK_DST(p, i) \ |
#define FUNCTION_CHECK_DST(p, i) \ |
| SLJIT_ASSERT(compiler->temporaries != -1 && compiler->generals != -1); \ | SLJIT_ASSERT(compiler->temporaries != -1 && compiler->saveds != -1); \ |
| if (((p) >= SLJIT_TEMPORARY_REG1 && (p) <= SLJIT_TEMPORARY_REG1 - 1 + compiler->temporaries) || \ |
if (((p) >= SLJIT_TEMPORARY_REG1 && (p) <= SLJIT_TEMPORARY_REG1 - 1 + compiler->temporaries) || \ |
| ((p) >= SLJIT_GENERAL_REG1 && (p) <= SLJIT_GENERAL_REG1 - 1 + compiler->generals) || \ | ((p) >= SLJIT_SAVED_REG1 && (p) <= SLJIT_SAVED_REG1 - 1 + compiler->saveds) || \ |
| (p) == SLJIT_UNUSED) \ |
(p) == SLJIT_UNUSED) \ |
| SLJIT_ASSERT(i == 0); \ |
SLJIT_ASSERT(i == 0); \ |
| else if ((p) & SLJIT_MEM) { \ |
else if ((p) & SLJIT_MEM) { \ |
|
Line 551 SLJIT_API_FUNC_ATTRIBUTE void sljit_compiler_verbose(s
|
Line 551 SLJIT_API_FUNC_ATTRIBUTE void sljit_compiler_verbose(s
|
| } |
} |
| |
|
| static char* reg_names[] = { |
static char* reg_names[] = { |
| (char*)"<noreg>", (char*)"tmp_r1", (char*)"tmp_r2", (char*)"tmp_r3", | (char*)"<noreg>", (char*)"t1", (char*)"t2", (char*)"t3", |
| (char*)"tmp_er1", (char*)"tmp_er2", (char*)"gen_r1", (char*)"gen_r2", | (char*)"te1", (char*)"te2", (char*)"s1", (char*)"s2", |
| (char*)"gen_r3", (char*)"gen_er1", (char*)"gen_er2", (char*)"stack_r" | (char*)"s3", (char*)"se1", (char*)"se2", (char*)"lcr" |
| }; |
}; |
| |
|
| static char* freg_names[] = { |
static char* freg_names[] = { |
|
Line 616 static char* freg_names[] = {
|
Line 616 static char* freg_names[] = {
|
| static SLJIT_CONST char* op_names[] = { |
static SLJIT_CONST char* op_names[] = { |
| /* op0 */ |
/* op0 */ |
| (char*)"breakpoint", (char*)"nop", |
(char*)"breakpoint", (char*)"nop", |
| |
(char*)"umul", (char*)"smul", (char*)"udiv", (char*)"sdiv", |
| /* op1 */ |
/* op1 */ |
| (char*)"mov", (char*)"mov.ub", (char*)"mov.sb", (char*)"mov.uh", |
(char*)"mov", (char*)"mov.ub", (char*)"mov.sb", (char*)"mov.uh", |
| (char*)"mov.sh", (char*)"mov.ui", (char*)"mov.si", (char*)"movu", |
(char*)"mov.sh", (char*)"mov.ui", (char*)"mov.si", (char*)"movu", |
|
Line 673 static SLJIT_INLINE void check_sljit_generate_code(str
|
Line 674 static SLJIT_INLINE void check_sljit_generate_code(str
|
| #endif |
#endif |
| } |
} |
| |
|
| static SLJIT_INLINE void check_sljit_emit_enter(struct sljit_compiler *compiler, int args, int temporaries, int generals, int local_size) | static SLJIT_INLINE void check_sljit_emit_enter(struct sljit_compiler *compiler, int args, int temporaries, int saveds, int local_size) |
| { |
{ |
| /* If debug and verbose are disabled, all arguments are unused. */ |
/* If debug and verbose are disabled, all arguments are unused. */ |
| SLJIT_UNUSED_ARG(compiler); |
SLJIT_UNUSED_ARG(compiler); |
| SLJIT_UNUSED_ARG(args); |
SLJIT_UNUSED_ARG(args); |
| SLJIT_UNUSED_ARG(temporaries); |
SLJIT_UNUSED_ARG(temporaries); |
| SLJIT_UNUSED_ARG(generals); | SLJIT_UNUSED_ARG(saveds); |
| SLJIT_UNUSED_ARG(local_size); |
SLJIT_UNUSED_ARG(local_size); |
| |
|
| SLJIT_ASSERT(args >= 0 && args <= 3); |
SLJIT_ASSERT(args >= 0 && args <= 3); |
| SLJIT_ASSERT(temporaries >= 0 && temporaries <= SLJIT_NO_TMP_REGISTERS); |
SLJIT_ASSERT(temporaries >= 0 && temporaries <= SLJIT_NO_TMP_REGISTERS); |
| SLJIT_ASSERT(generals >= 0 && generals <= SLJIT_NO_GEN_REGISTERS); | SLJIT_ASSERT(saveds >= 0 && saveds <= SLJIT_NO_GEN_REGISTERS); |
| SLJIT_ASSERT(args <= generals); | SLJIT_ASSERT(args <= saveds); |
| SLJIT_ASSERT(local_size >= 0 && local_size <= SLJIT_MAX_LOCAL_SIZE); |
SLJIT_ASSERT(local_size >= 0 && local_size <= SLJIT_MAX_LOCAL_SIZE); |
| #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) |
#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) |
| if (SLJIT_UNLIKELY(!!compiler->verbose)) |
if (SLJIT_UNLIKELY(!!compiler->verbose)) |
| fprintf(compiler->verbose, " enter args=%d temporaries=%d generals=%d local_size=%d\n", args, temporaries, generals, local_size); | fprintf(compiler->verbose, " enter args=%d temporaries=%d saveds=%d local_size=%d\n", args, temporaries, saveds, local_size); |
| #endif |
#endif |
| } |
} |
| |
|
| static SLJIT_INLINE void check_sljit_fake_enter(struct sljit_compiler *compiler, int args, int temporaries, int generals, int local_size) | static SLJIT_INLINE void check_sljit_set_context(struct sljit_compiler *compiler, int args, int temporaries, int saveds, int local_size) |
| { |
{ |
| /* If debug and verbose are disabled, all arguments are unused. */ |
/* If debug and verbose are disabled, all arguments are unused. */ |
| SLJIT_UNUSED_ARG(compiler); |
SLJIT_UNUSED_ARG(compiler); |
| SLJIT_UNUSED_ARG(args); |
SLJIT_UNUSED_ARG(args); |
| SLJIT_UNUSED_ARG(temporaries); |
SLJIT_UNUSED_ARG(temporaries); |
| SLJIT_UNUSED_ARG(generals); | SLJIT_UNUSED_ARG(saveds); |
| SLJIT_UNUSED_ARG(local_size); |
SLJIT_UNUSED_ARG(local_size); |
| |
|
| SLJIT_ASSERT(args >= 0 && args <= 3); |
SLJIT_ASSERT(args >= 0 && args <= 3); |
| SLJIT_ASSERT(temporaries >= 0 && temporaries <= SLJIT_NO_TMP_REGISTERS); |
SLJIT_ASSERT(temporaries >= 0 && temporaries <= SLJIT_NO_TMP_REGISTERS); |
| SLJIT_ASSERT(generals >= 0 && generals <= SLJIT_NO_GEN_REGISTERS); | SLJIT_ASSERT(saveds >= 0 && saveds <= SLJIT_NO_GEN_REGISTERS); |
| SLJIT_ASSERT(args <= generals); | SLJIT_ASSERT(args <= saveds); |
| SLJIT_ASSERT(local_size >= 0 && local_size <= SLJIT_MAX_LOCAL_SIZE); |
SLJIT_ASSERT(local_size >= 0 && local_size <= SLJIT_MAX_LOCAL_SIZE); |
| #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) |
#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) |
| if (SLJIT_UNLIKELY(!!compiler->verbose)) |
if (SLJIT_UNLIKELY(!!compiler->verbose)) |
| fprintf(compiler->verbose, " fake_enter args=%d temporaries=%d generals=%d local_size=%d\n", args, temporaries, generals, local_size); | fprintf(compiler->verbose, " fake_enter args=%d temporaries=%d saveds=%d local_size=%d\n", args, temporaries, saveds, local_size); |
| #endif |
#endif |
| } |
} |
| |
|
| static SLJIT_INLINE void check_sljit_emit_return(struct sljit_compiler *compiler, int src, sljit_w srcw) | static SLJIT_INLINE void check_sljit_emit_return(struct sljit_compiler *compiler, int op, int src, sljit_w srcw) |
| { |
{ |
| /* If debug and verbose are disabled, all arguments are unused. */ |
/* If debug and verbose are disabled, all arguments are unused. */ |
| SLJIT_UNUSED_ARG(compiler); |
SLJIT_UNUSED_ARG(compiler); |
| |
SLJIT_UNUSED_ARG(op); |
| SLJIT_UNUSED_ARG(src); |
SLJIT_UNUSED_ARG(src); |
| SLJIT_UNUSED_ARG(srcw); |
SLJIT_UNUSED_ARG(srcw); |
| |
|
| #if (defined SLJIT_DEBUG && SLJIT_DEBUG) |
#if (defined SLJIT_DEBUG && SLJIT_DEBUG) |
| if (src != SLJIT_UNUSED) { | if (op != SLJIT_UNUSED) { |
| | SLJIT_ASSERT(op >= SLJIT_MOV && op <= SLJIT_MOV_SI); |
| FUNCTION_CHECK_SRC(src, srcw); |
FUNCTION_CHECK_SRC(src, srcw); |
| } |
} |
| else |
else |
| SLJIT_ASSERT(srcw == 0); | SLJIT_ASSERT(src == 0 && srcw == 0); |
| #endif |
#endif |
| #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) |
#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) |
| if (SLJIT_UNLIKELY(!!compiler->verbose)) { |
if (SLJIT_UNLIKELY(!!compiler->verbose)) { |
| fprintf(compiler->verbose, " return "); | if (op == SLJIT_UNUSED) |
| sljit_verbose_param(src, srcw); | fprintf(compiler->verbose, " return\n"); |
| fprintf(compiler->verbose, "\n"); | else { |
| | fprintf(compiler->verbose, " return %s ", op_names[op]); |
| | sljit_verbose_param(src, srcw); |
| | fprintf(compiler->verbose, "\n"); |
| | } |
| } |
} |
| #endif |
#endif |
| } |
} |
| |
|
| 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) | 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) |
| { |
{ |
| /* If debug and verbose are disabled, all arguments are unused. */ |
/* If debug and verbose are disabled, all arguments are unused. */ |
| SLJIT_UNUSED_ARG(compiler); |
SLJIT_UNUSED_ARG(compiler); |
|
Line 744 static SLJIT_INLINE void check_sljit_emit_fast_enter(s
|
Line 751 static SLJIT_INLINE void check_sljit_emit_fast_enter(s
|
| SLJIT_UNUSED_ARG(dstw); |
SLJIT_UNUSED_ARG(dstw); |
| SLJIT_UNUSED_ARG(args); |
SLJIT_UNUSED_ARG(args); |
| SLJIT_UNUSED_ARG(temporaries); |
SLJIT_UNUSED_ARG(temporaries); |
| SLJIT_UNUSED_ARG(generals); | SLJIT_UNUSED_ARG(saveds); |
| SLJIT_UNUSED_ARG(local_size); |
SLJIT_UNUSED_ARG(local_size); |
| |
|
| SLJIT_ASSERT(args >= 0 && args <= 3); |
SLJIT_ASSERT(args >= 0 && args <= 3); |
| SLJIT_ASSERT(temporaries >= 0 && temporaries <= SLJIT_NO_TMP_REGISTERS); |
SLJIT_ASSERT(temporaries >= 0 && temporaries <= SLJIT_NO_TMP_REGISTERS); |
| SLJIT_ASSERT(generals >= 0 && generals <= SLJIT_NO_GEN_REGISTERS); | SLJIT_ASSERT(saveds >= 0 && saveds <= SLJIT_NO_GEN_REGISTERS); |
| SLJIT_ASSERT(args <= generals); | SLJIT_ASSERT(args <= saveds); |
| SLJIT_ASSERT(local_size >= 0 && local_size <= SLJIT_MAX_LOCAL_SIZE); |
SLJIT_ASSERT(local_size >= 0 && local_size <= SLJIT_MAX_LOCAL_SIZE); |
| #if (defined SLJIT_DEBUG && SLJIT_DEBUG) |
#if (defined SLJIT_DEBUG && SLJIT_DEBUG) |
| compiler->temporaries = temporaries; |
compiler->temporaries = temporaries; |
| compiler->generals = generals; | compiler->saveds = saveds; |
| FUNCTION_CHECK_DST(dst, dstw); |
FUNCTION_CHECK_DST(dst, dstw); |
| compiler->temporaries = -1; |
compiler->temporaries = -1; |
| compiler->generals = -1; | compiler->saveds = -1; |
| #endif |
#endif |
| #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) |
#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) |
| if (SLJIT_UNLIKELY(!!compiler->verbose)) { |
if (SLJIT_UNLIKELY(!!compiler->verbose)) { |
| fprintf(compiler->verbose, " fast_enter "); |
fprintf(compiler->verbose, " fast_enter "); |
| sljit_verbose_param(dst, dstw); |
sljit_verbose_param(dst, dstw); |
| fprintf(compiler->verbose, " args=%d temporaries=%d generals=%d local_size=%d\n", args, temporaries, generals, local_size); | fprintf(compiler->verbose, " args=%d temporaries=%d saveds=%d local_size=%d\n", args, temporaries, saveds, local_size); |
| } |
} |
| #endif |
#endif |
| } |
} |
|
Line 793 static SLJIT_INLINE void check_sljit_emit_op0(struct s
|
Line 800 static SLJIT_INLINE void check_sljit_emit_op0(struct s
|
| SLJIT_UNUSED_ARG(compiler); |
SLJIT_UNUSED_ARG(compiler); |
| SLJIT_UNUSED_ARG(op); |
SLJIT_UNUSED_ARG(op); |
| |
|
| SLJIT_ASSERT(op >= SLJIT_BREAKPOINT && op <= SLJIT_NOP); | SLJIT_ASSERT((op >= SLJIT_BREAKPOINT && op <= SLJIT_SMUL) |
| | || ((op & ~SLJIT_INT_OP) >= SLJIT_UDIV && (op & ~SLJIT_INT_OP) <= SLJIT_SDIV)); |
| #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) |
#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) |
| if (SLJIT_UNLIKELY(!!compiler->verbose)) |
if (SLJIT_UNLIKELY(!!compiler->verbose)) |
| fprintf(compiler->verbose, " %s\n", op_names[op]); | fprintf(compiler->verbose, " %s%s\n", !(op & SLJIT_INT_OP) ? "" : "i", op_names[GET_OPCODE(op)]); |
| #endif |
#endif |
| } |
} |
| |
|
|
Line 812 static SLJIT_INLINE void check_sljit_emit_op1(struct s
|
Line 820 static SLJIT_INLINE void check_sljit_emit_op1(struct s
|
| SLJIT_UNUSED_ARG(src); |
SLJIT_UNUSED_ARG(src); |
| SLJIT_UNUSED_ARG(srcw); |
SLJIT_UNUSED_ARG(srcw); |
| |
|
| |
#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) || (defined SLJIT_DEBUG && SLJIT_DEBUG) |
| |
if (SLJIT_UNLIKELY(compiler->skip_checks)) { |
| |
compiler->skip_checks = 0; |
| |
return; |
| |
} |
| |
#endif |
| |
|
| SLJIT_ASSERT(GET_OPCODE(op) >= SLJIT_MOV && GET_OPCODE(op) <= SLJIT_CLZ); |
SLJIT_ASSERT(GET_OPCODE(op) >= SLJIT_MOV && GET_OPCODE(op) <= SLJIT_CLZ); |
| #if (defined SLJIT_DEBUG && SLJIT_DEBUG) |
#if (defined SLJIT_DEBUG && SLJIT_DEBUG) |
| FUNCTION_CHECK_OP(); |
FUNCTION_CHECK_OP(); |
|
Line 874 static SLJIT_INLINE void check_sljit_emit_op2(struct s
|
Line 889 static SLJIT_INLINE void check_sljit_emit_op2(struct s
|
| #endif |
#endif |
| } |
} |
| |
|
| |
static SLJIT_INLINE void check_sljit_get_register_index(int reg) |
| |
{ |
| |
SLJIT_UNUSED_ARG(reg); |
| |
SLJIT_ASSERT(reg > 0 && reg <= SLJIT_NO_REGISTERS); |
| |
} |
| |
|
| |
static SLJIT_INLINE void check_sljit_emit_op_custom(struct sljit_compiler *compiler, |
| |
void *instruction, int size) |
| |
{ |
| |
SLJIT_UNUSED_ARG(compiler); |
| |
SLJIT_UNUSED_ARG(instruction); |
| |
SLJIT_UNUSED_ARG(size); |
| |
SLJIT_ASSERT(instruction); |
| |
} |
| |
|
| static SLJIT_INLINE void check_sljit_emit_fop1(struct sljit_compiler *compiler, int op, |
static SLJIT_INLINE void check_sljit_emit_fop1(struct sljit_compiler *compiler, int op, |
| int dst, sljit_w dstw, |
int dst, sljit_w dstw, |
| int src, sljit_w srcw) |
int src, sljit_w srcw) |
|
Line 886 static SLJIT_INLINE void check_sljit_emit_fop1(struct
|
Line 916 static SLJIT_INLINE void check_sljit_emit_fop1(struct
|
| SLJIT_UNUSED_ARG(src); |
SLJIT_UNUSED_ARG(src); |
| SLJIT_UNUSED_ARG(srcw); |
SLJIT_UNUSED_ARG(srcw); |
| |
|
| |
#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) || (defined SLJIT_DEBUG && SLJIT_DEBUG) |
| |
if (SLJIT_UNLIKELY(compiler->skip_checks)) { |
| |
compiler->skip_checks = 0; |
| |
return; |
| |
} |
| |
#endif |
| |
|
| SLJIT_ASSERT(sljit_is_fpu_available()); |
SLJIT_ASSERT(sljit_is_fpu_available()); |
| SLJIT_ASSERT(GET_OPCODE(op) >= SLJIT_FCMP && GET_OPCODE(op) <= SLJIT_FABS); |
SLJIT_ASSERT(GET_OPCODE(op) >= SLJIT_FCMP && GET_OPCODE(op) <= SLJIT_FABS); |
| #if (defined SLJIT_DEBUG && SLJIT_DEBUG) |
#if (defined SLJIT_DEBUG && SLJIT_DEBUG) |
|
Line 1001 static SLJIT_INLINE void check_sljit_emit_cmp(struct s
|
Line 1038 static SLJIT_INLINE void check_sljit_emit_cmp(struct s
|
| #endif |
#endif |
| } |
} |
| |
|
| |
static SLJIT_INLINE void check_sljit_emit_fcmp(struct sljit_compiler *compiler, int type, |
| |
int src1, sljit_w src1w, |
| |
int src2, sljit_w src2w) |
| |
{ |
| |
SLJIT_UNUSED_ARG(compiler); |
| |
SLJIT_UNUSED_ARG(type); |
| |
SLJIT_UNUSED_ARG(src1); |
| |
SLJIT_UNUSED_ARG(src1w); |
| |
SLJIT_UNUSED_ARG(src2); |
| |
SLJIT_UNUSED_ARG(src2w); |
| |
|
| |
SLJIT_ASSERT(sljit_is_fpu_available()); |
| |
SLJIT_ASSERT(!(type & ~(0xff | SLJIT_REWRITABLE_JUMP))); |
| |
SLJIT_ASSERT((type & 0xff) >= SLJIT_C_FLOAT_EQUAL && (type & 0xff) <= SLJIT_C_FLOAT_NOT_NAN); |
| |
#if (defined SLJIT_DEBUG && SLJIT_DEBUG) |
| |
FUNCTION_FCHECK(src1, src1w); |
| |
FUNCTION_FCHECK(src2, src2w); |
| |
#endif |
| |
#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) |
| |
if (SLJIT_UNLIKELY(!!compiler->verbose)) { |
| |
fprintf(compiler->verbose, " fcmp%s <%s> ", !(type & SLJIT_REWRITABLE_JUMP) ? "" : "R", jump_names[type & 0xff]); |
| |
sljit_verbose_fparam(src1, src1w); |
| |
fprintf(compiler->verbose, ", "); |
| |
sljit_verbose_fparam(src2, src2w); |
| |
fprintf(compiler->verbose, "\n"); |
| |
} |
| |
#endif |
| |
} |
| |
|
| static SLJIT_INLINE void check_sljit_emit_ijump(struct sljit_compiler *compiler, int type, int src, sljit_w srcw) |
static SLJIT_INLINE void check_sljit_emit_ijump(struct sljit_compiler *compiler, int type, int src, sljit_w srcw) |
| { |
{ |
| /* If debug and verbose are disabled, all arguments are unused. */ |
/* If debug and verbose are disabled, all arguments are unused. */ |
|
Line 1067 static SLJIT_INLINE void check_sljit_emit_const(struct
|
Line 1133 static SLJIT_INLINE void check_sljit_emit_const(struct
|
| #endif |
#endif |
| } |
} |
| |
|
| |
static SLJIT_INLINE int emit_mov_before_return(struct sljit_compiler *compiler, int op, int src, sljit_w srcw) |
| |
{ |
| |
/* Return if don't need to do anything. */ |
| |
if (op == SLJIT_UNUSED) |
| |
return SLJIT_SUCCESS; |
| |
|
| |
#if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE) |
| |
if (src == SLJIT_RETURN_REG && op == SLJIT_MOV) |
| |
return SLJIT_SUCCESS; |
| |
#else |
| |
if (src == SLJIT_RETURN_REG && (op == SLJIT_MOV || op == SLJIT_MOV_UI || op == SLJIT_MOV_SI)) |
| |
return SLJIT_SUCCESS; |
| |
#endif |
| |
|
| |
#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) || (defined SLJIT_DEBUG && SLJIT_DEBUG) |
| |
compiler->skip_checks = 1; |
| |
#endif |
| |
return sljit_emit_op1(compiler, op, SLJIT_RETURN_REG, 0, src, srcw); |
| |
} |
| |
|
| |
/* CPU description section */ |
| |
|
| |
#if (defined SLJIT_32BIT_ARCHITECTURE && SLJIT_32BIT_ARCHITECTURE) |
| |
#define SLJIT_CPUINFO_PART1 " 32bit (" |
| |
#elif (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE) |
| |
#define SLJIT_CPUINFO_PART1 " 64bit (" |
| |
#else |
| |
#error "Internal error: CPU type info missing" |
| |
#endif |
| |
|
| |
#if (defined SLJIT_LITTLE_ENDIAN && SLJIT_LITTLE_ENDIAN) |
| |
#define SLJIT_CPUINFO_PART2 "little endian + " |
| |
#elif (defined SLJIT_BIG_ENDIAN && SLJIT_BIG_ENDIAN) |
| |
#define SLJIT_CPUINFO_PART2 "big endian + " |
| |
#else |
| |
#error "Internal error: CPU type info missing" |
| |
#endif |
| |
|
| |
#if (defined SLJIT_UNALIGNED && SLJIT_UNALIGNED) |
| |
#define SLJIT_CPUINFO_PART3 "unaligned)" |
| |
#else |
| |
#define SLJIT_CPUINFO_PART3 "aligned)" |
| |
#endif |
| |
|
| |
#define SLJIT_CPUINFO SLJIT_CPUINFO_PART1 SLJIT_CPUINFO_PART2 SLJIT_CPUINFO_PART3 |
| |
|
| #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) |
#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) |
| #include "sljitNativeX86_common.c" |
#include "sljitNativeX86_common.c" |
| #elif (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) |
#elif (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) |
|
Line 1086 static SLJIT_INLINE void check_sljit_emit_const(struct
|
Line 1198 static SLJIT_INLINE void check_sljit_emit_const(struct
|
| #endif |
#endif |
| |
|
| #if !(defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) |
#if !(defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) |
| |
|
| SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_cmp(struct sljit_compiler *compiler, int type, |
SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_cmp(struct sljit_compiler *compiler, int type, |
| int src1, sljit_w src1w, |
int src1, sljit_w src1w, |
| int src2, sljit_w src2w) |
int src2, sljit_w src2w) |
|
Line 1152 SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit
|
Line 1265 SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit
|
| #endif |
#endif |
| return sljit_emit_jump(compiler, condition | (type & SLJIT_REWRITABLE_JUMP)); |
return sljit_emit_jump(compiler, condition | (type & SLJIT_REWRITABLE_JUMP)); |
| } |
} |
| |
|
| |
SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_fcmp(struct sljit_compiler *compiler, int type, |
| |
int src1, sljit_w src1w, |
| |
int src2, sljit_w src2w) |
| |
{ |
| |
int flags, condition; |
| |
|
| |
check_sljit_emit_fcmp(compiler, type, src1, src1w, src2, src2w); |
| |
|
| |
condition = type & 0xff; |
| |
if (condition <= SLJIT_C_FLOAT_NOT_EQUAL) |
| |
flags = SLJIT_SET_E; |
| |
else |
| |
flags = SLJIT_SET_S; |
| |
|
| |
#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) || (defined SLJIT_DEBUG && SLJIT_DEBUG) |
| |
compiler->skip_checks = 1; |
| #endif |
#endif |
| |
sljit_emit_fop1(compiler, SLJIT_FCMP | flags, src1, src1w, src2, src2w); |
| |
|
| |
#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) || (defined SLJIT_DEBUG && SLJIT_DEBUG) |
| |
compiler->skip_checks = 1; |
| |
#endif |
| |
return sljit_emit_jump(compiler, condition | (type & SLJIT_REWRITABLE_JUMP)); |
| |
} |
| |
|
| |
#endif |
| |
|
| #else /* SLJIT_CONFIG_UNSUPPORTED */ |
#else /* SLJIT_CONFIG_UNSUPPORTED */ |
| |
|
| /* Empty function bodies for those machines, which are not (yet) supported. */ |
/* Empty function bodies for those machines, which are not (yet) supported. */ |
|
Line 1205 SLJIT_API_FUNC_ATTRIBUTE void sljit_free_code(void* co
|
Line 1344 SLJIT_API_FUNC_ATTRIBUTE void sljit_free_code(void* co
|
| SLJIT_ASSERT_STOP(); |
SLJIT_ASSERT_STOP(); |
| } |
} |
| |
|
| SLJIT_API_FUNC_ATTRIBUTE int sljit_emit_enter(struct sljit_compiler *compiler, int args, int temporaries, int generals, int local_size) | SLJIT_API_FUNC_ATTRIBUTE int sljit_emit_enter(struct sljit_compiler *compiler, int args, int temporaries, int saveds, int local_size) |
| { |
{ |
| SLJIT_UNUSED_ARG(compiler); |
SLJIT_UNUSED_ARG(compiler); |
| SLJIT_UNUSED_ARG(args); |
SLJIT_UNUSED_ARG(args); |
| SLJIT_UNUSED_ARG(temporaries); |
SLJIT_UNUSED_ARG(temporaries); |
| SLJIT_UNUSED_ARG(generals); | SLJIT_UNUSED_ARG(saveds); |
| SLJIT_UNUSED_ARG(local_size); |
SLJIT_UNUSED_ARG(local_size); |
| SLJIT_ASSERT_STOP(); |
SLJIT_ASSERT_STOP(); |
| return SLJIT_ERR_UNSUPPORTED; |
return SLJIT_ERR_UNSUPPORTED; |
| } |
} |
| |
|
| SLJIT_API_FUNC_ATTRIBUTE void sljit_fake_enter(struct sljit_compiler *compiler, int args, int temporaries, int generals, int local_size) | SLJIT_API_FUNC_ATTRIBUTE void sljit_set_context(struct sljit_compiler *compiler, int args, int temporaries, int saveds, int local_size) |
| { |
{ |
| SLJIT_UNUSED_ARG(compiler); |
SLJIT_UNUSED_ARG(compiler); |
| SLJIT_UNUSED_ARG(args); |
SLJIT_UNUSED_ARG(args); |
| SLJIT_UNUSED_ARG(temporaries); |
SLJIT_UNUSED_ARG(temporaries); |
| SLJIT_UNUSED_ARG(generals); | SLJIT_UNUSED_ARG(saveds); |
| SLJIT_UNUSED_ARG(local_size); |
SLJIT_UNUSED_ARG(local_size); |
| SLJIT_ASSERT_STOP(); |
SLJIT_ASSERT_STOP(); |
| } |
} |
| |
|
| SLJIT_API_FUNC_ATTRIBUTE int sljit_emit_return(struct sljit_compiler *compiler, int src, sljit_w srcw) | SLJIT_API_FUNC_ATTRIBUTE int sljit_emit_return(struct sljit_compiler *compiler, int op, int src, sljit_w srcw) |
| { |
{ |
| SLJIT_UNUSED_ARG(compiler); |
SLJIT_UNUSED_ARG(compiler); |
| |
SLJIT_UNUSED_ARG(op); |
| SLJIT_UNUSED_ARG(src); |
SLJIT_UNUSED_ARG(src); |
| SLJIT_UNUSED_ARG(srcw); |
SLJIT_UNUSED_ARG(srcw); |
| SLJIT_ASSERT_STOP(); |
SLJIT_ASSERT_STOP(); |
| return SLJIT_ERR_UNSUPPORTED; |
return SLJIT_ERR_UNSUPPORTED; |
| } |
} |
| |
|
| 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) | 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) |
| { |
{ |
| SLJIT_UNUSED_ARG(compiler); |
SLJIT_UNUSED_ARG(compiler); |
| SLJIT_UNUSED_ARG(dst); |
SLJIT_UNUSED_ARG(dst); |
| SLJIT_UNUSED_ARG(dstw); |
SLJIT_UNUSED_ARG(dstw); |
| SLJIT_UNUSED_ARG(args); |
SLJIT_UNUSED_ARG(args); |
| SLJIT_UNUSED_ARG(temporaries); |
SLJIT_UNUSED_ARG(temporaries); |
| SLJIT_UNUSED_ARG(generals); | SLJIT_UNUSED_ARG(saveds); |
| SLJIT_UNUSED_ARG(local_size); |
SLJIT_UNUSED_ARG(local_size); |
| SLJIT_ASSERT_STOP(); |
SLJIT_ASSERT_STOP(); |
| return SLJIT_ERR_UNSUPPORTED; |
return SLJIT_ERR_UNSUPPORTED; |
|
Line 1296 SLJIT_API_FUNC_ATTRIBUTE int sljit_emit_op2(struct slj
|
Line 1436 SLJIT_API_FUNC_ATTRIBUTE int sljit_emit_op2(struct slj
|
| return SLJIT_ERR_UNSUPPORTED; |
return SLJIT_ERR_UNSUPPORTED; |
| } |
} |
| |
|
| |
SLJIT_API_FUNC_ATTRIBUTE int sljit_get_register_index(int reg) |
| |
{ |
| |
SLJIT_ASSERT_STOP(); |
| |
return reg; |
| |
} |
| |
|
| |
SLJIT_API_FUNC_ATTRIBUTE int sljit_emit_op_custom(struct sljit_compiler *compiler, |
| |
void *instruction, int size) |
| |
{ |
| |
SLJIT_UNUSED_ARG(compiler); |
| |
SLJIT_UNUSED_ARG(instruction); |
| |
SLJIT_UNUSED_ARG(size); |
| |
SLJIT_ASSERT_STOP(); |
| |
return SLJIT_ERR_UNSUPPORTED; |
| |
} |
| |
|
| SLJIT_API_FUNC_ATTRIBUTE int sljit_is_fpu_available(void) |
SLJIT_API_FUNC_ATTRIBUTE int sljit_is_fpu_available(void) |
| { |
{ |
| SLJIT_ASSERT_STOP(); |
SLJIT_ASSERT_STOP(); |
|
Line 1349 SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit
|
Line 1505 SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit
|
| } |
} |
| |
|
| SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_cmp(struct sljit_compiler *compiler, int type, |
SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_cmp(struct sljit_compiler *compiler, int type, |
| |
int src1, sljit_w src1w, |
| |
int src2, sljit_w src2w) |
| |
{ |
| |
SLJIT_UNUSED_ARG(compiler); |
| |
SLJIT_UNUSED_ARG(type); |
| |
SLJIT_UNUSED_ARG(src1); |
| |
SLJIT_UNUSED_ARG(src1w); |
| |
SLJIT_UNUSED_ARG(src2); |
| |
SLJIT_UNUSED_ARG(src2w); |
| |
SLJIT_ASSERT_STOP(); |
| |
return NULL; |
| |
} |
| |
|
| |
SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_fcmp(struct sljit_compiler *compiler, int type, |
| int src1, sljit_w src1w, |
int src1, sljit_w src1w, |
| int src2, sljit_w src2w) |
int src2, sljit_w src2w) |
| { |
{ |