35#if !(defined SLJIT_STD_MACROS_DEFINED && SLJIT_STD_MACROS_DEFINED)
43#define CHECK_ERROR() \
45 if (SLJIT_UNLIKELY(compiler->error)) \
46 return compiler->error; \
49#define CHECK_ERROR_PTR() \
51 if (SLJIT_UNLIKELY(compiler->error)) \
55#define FAIL_IF(expr) \
57 if (SLJIT_UNLIKELY(expr)) \
58 return compiler->error; \
61#define PTR_FAIL_IF(expr) \
63 if (SLJIT_UNLIKELY(expr)) \
67#define FAIL_IF_NULL(ptr) \
69 if (SLJIT_UNLIKELY(!(ptr))) { \
70 compiler->error = SLJIT_ERR_ALLOC_FAILED; \
71 return SLJIT_ERR_ALLOC_FAILED; \
75#define PTR_FAIL_IF_NULL(ptr) \
77 if (SLJIT_UNLIKELY(!(ptr))) { \
78 compiler->error = SLJIT_ERR_ALLOC_FAILED; \
83#define PTR_FAIL_WITH_EXEC_IF(ptr) \
85 if (SLJIT_UNLIKELY(!(ptr))) { \
86 compiler->error = SLJIT_ERR_EX_ALLOC_FAILED; \
91#if !(defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED)
93#define SSIZE_OF(type) ((sljit_s32)sizeof(sljit_ ## type))
95#define VARIABLE_FLAG_SHIFT (10)
97#define VARIABLE_FLAG_MASK (0x3e << VARIABLE_FLAG_SHIFT)
98#define GET_FLAG_TYPE(op) ((op) >> VARIABLE_FLAG_SHIFT)
100#define GET_OPCODE(op) \
101 ((op) & ~(SLJIT_32 | SLJIT_SET_Z | VARIABLE_FLAG_MASK))
103#define HAS_FLAGS(op) \
104 ((op) & (SLJIT_SET_Z | VARIABLE_FLAG_MASK))
106#define GET_ALL_FLAGS(op) \
107 ((op) & (SLJIT_32 | SLJIT_SET_Z | VARIABLE_FLAG_MASK))
109#if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
110#define TYPE_CAST_NEEDED(op) \
111 ((op) >= SLJIT_MOV_U8 && (op) <= SLJIT_MOV_S32)
113#define TYPE_CAST_NEEDED(op) \
114 ((op) >= SLJIT_MOV_U8 && (op) <= SLJIT_MOV_S16)
119#if (defined SLJIT_32BIT_ARCHITECTURE && SLJIT_32BIT_ARCHITECTURE)
120#define ABUF_SIZE 2048
122#define ABUF_SIZE 4096
127#define OFFS_REG(reg) (((reg) >> 8) & REG_MASK)
128#define OFFS_REG_MASK (REG_MASK << 8)
129#define TO_OFFS_REG(reg) ((reg) << 8)
130#define FAST_IS_REG(reg) ((reg) < REG_MASK)
133#define SLJIT_ARG_MASK 0x7
134#define SLJIT_ARG_FULL_MASK (SLJIT_ARG_MASK | SLJIT_ARG_TYPE_SCRATCH_REG)
137#define REG_PAIR_MASK 0x7f00
138#define REG_PAIR_FIRST(reg) ((reg) & 0x7f)
139#define REG_PAIR_SECOND(reg) ((reg) >> 8)
142#define SLJIT_KEPT_SAVEDS_COUNT(options) ((options) & 0x3)
145#define SLJIT_SIMD_GET_OPCODE(type) ((type) & 0xff)
146#define SLJIT_SIMD_GET_REG_SIZE(type) (((type) >> 12) & 0x3f)
147#define SLJIT_SIMD_GET_ELEM_SIZE(type) (((type) >> 18) & 0x3f)
148#define SLJIT_SIMD_GET_ELEM2_SIZE(type) (((type) >> 24) & 0x3f)
150#define SLJIT_SIMD_CHECK_REG(type) (((type) & 0x3f000) >= SLJIT_SIMD_REG_64 && ((type) & 0x3f000) <= SLJIT_SIMD_REG_512)
151#define SLJIT_SIMD_TYPE_MASK(m) ((sljit_s32)0xff000fff & ~(SLJIT_SIMD_FLOAT | SLJIT_SIMD_TEST | (m)))
152#define SLJIT_SIMD_TYPE_MASK2(m) ((sljit_s32)0xc0000fff & ~(SLJIT_SIMD_FLOAT | SLJIT_SIMD_TEST | (m)))
156#define JUMP_MOV_ADDR 0x2
159#if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86)
160# define PATCH_MB 0x04
161# define PATCH_MW 0x08
162#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
163# define PATCH_MD 0x10
164# define MOV_ADDR_HI 0x20
165# define JUMP_MAX_SIZE ((sljit_uw)(10 + 3))
166# define CJUMP_MAX_SIZE ((sljit_uw)(2 + 10 + 3))
168# define JUMP_MAX_SIZE ((sljit_uw)5)
169# define CJUMP_MAX_SIZE ((sljit_uw)6)
171# define TYPE_SHIFT 13
172#if (defined SLJIT_DEBUG && SLJIT_DEBUG)
174# define JUMP_SIZE_SHIFT 7
178#if (defined SLJIT_CONFIG_ARM_V6 && SLJIT_CONFIG_ARM_V6) || (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7)
183#if (defined SLJIT_CONFIG_ARM_V6 && SLJIT_CONFIG_ARM_V6)
184# define CPOOL_SIZE 512
187#if (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7)
188# define JUMP_SIZE_SHIFT 26
189# define JUMP_MAX_SIZE ((sljit_uw)3)
192#if (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2)
196# define PATCH_TYPE1 0x10
198# define PATCH_TYPE2 0x20
200# define PATCH_TYPE3 0x30
202# define PATCH_TYPE4 0x40
204# define PATCH_TYPE5 0x50
206# define PATCH_TYPE6 0x60
208# define JUMP_SIZE_SHIFT 26
209# define JUMP_MAX_SIZE ((sljit_uw)5)
212#if (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64)
213# define IS_COND 0x004
216# define PATCH_COND 0x020
217# define PATCH_B 0x040
218# define PATCH_B32 0x080
219# define PATCH_ABS48 0x100
220# define PATCH_ABS64 0x200
221# define JUMP_SIZE_SHIFT 58
222# define JUMP_MAX_SIZE ((sljit_uw)5)
225#if (defined SLJIT_CONFIG_PPC && SLJIT_CONFIG_PPC)
226# define IS_COND 0x004
227# define IS_CALL 0x008
228# define PATCH_B 0x010
229# define PATCH_ABS_B 0x020
230#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
231# define PATCH_ABS32 0x040
232# define PATCH_ABS48 0x080
233# define JUMP_SIZE_SHIFT 58
234# define JUMP_MAX_SIZE ((sljit_uw)7)
236# define JUMP_SIZE_SHIFT 26
237# define JUMP_MAX_SIZE ((sljit_uw)4)
241#if (defined SLJIT_CONFIG_MIPS && SLJIT_CONFIG_MIPS)
242# define IS_MOVABLE 0x004
244# define IS_CALL 0x010
245# define IS_BIT26_COND 0x020
246# define IS_BIT16_COND 0x040
247# define IS_BIT23_COND 0x080
249# define IS_COND (IS_BIT26_COND | IS_BIT16_COND | IS_BIT23_COND)
251# define PATCH_B 0x100
252# define PATCH_J 0x200
254#if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64)
255# define PATCH_ABS32 0x400
256# define PATCH_ABS48 0x800
260# define MOVABLE_INS 0
263# define UNMOVABLE_INS 32
268#if (defined SLJIT_CONFIG_RISCV && SLJIT_CONFIG_RISCV)
269# define IS_COND 0x004
270# define IS_CALL 0x008
272# define PATCH_B 0x010
273# define PATCH_J 0x020
275#if (defined SLJIT_CONFIG_RISCV_64 && SLJIT_CONFIG_RISCV_64)
276# define PATCH_REL32 0x040
277# define PATCH_ABS32 0x080
278# define PATCH_ABS44 0x100
279# define PATCH_ABS52 0x200
280# define JUMP_SIZE_SHIFT 58
281# define JUMP_MAX_SIZE ((sljit_uw)6)
283# define JUMP_SIZE_SHIFT 26
284# define JUMP_MAX_SIZE ((sljit_uw)2)
288#if (defined SLJIT_CONFIG_LOONGARCH && SLJIT_CONFIG_LOONGARCH)
289# define IS_COND 0x004
290# define IS_CALL 0x008
292# define PATCH_B 0x010
293# define PATCH_J 0x020
295# define PATCH_REL32 0x040
296# define PATCH_ABS32 0x080
297# define PATCH_ABS52 0x100
298# define JUMP_SIZE_SHIFT 58
299# define JUMP_MAX_SIZE ((sljit_uw)4)
304#define GET_SAVED_REGISTERS_SIZE(scratches, saveds, extra) \
305 (((scratches < SLJIT_NUMBER_OF_SCRATCH_REGISTERS ? 0 : (scratches - SLJIT_NUMBER_OF_SCRATCH_REGISTERS)) + \
306 (saveds) + (sljit_s32)(extra)) * (sljit_s32)sizeof(sljit_sw))
308#define GET_SAVED_FLOAT_REGISTERS_SIZE(fscratches, fsaveds, type) \
309 (((fscratches < SLJIT_NUMBER_OF_SCRATCH_FLOAT_REGISTERS ? 0 : (fscratches - SLJIT_NUMBER_OF_SCRATCH_FLOAT_REGISTERS)) + \
310 (fsaveds)) * SSIZE_OF(type))
312#define ADJUST_LOCAL_OFFSET(p, i) \
313 if ((p) == (SLJIT_MEM1(SLJIT_SP))) \
314 (i) += SLJIT_LOCALS_OFFSET;
321#if (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2)
322#define SLJIT_CODE_TO_PTR(code) ((void*)((sljit_up)(code) & ~(sljit_up)0x1))
323#elif (defined SLJIT_INDIRECT_CALL && SLJIT_INDIRECT_CALL)
324#define SLJIT_CODE_TO_PTR(code) ((void*)(*(sljit_up*)code))
326#define SLJIT_CODE_TO_PTR(code) ((void*)(code))
329#if !(defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED)
331#if (defined SLJIT_EXECUTABLE_ALLOCATOR && SLJIT_EXECUTABLE_ALLOCATOR)
333#if (defined SLJIT_PROT_EXECUTABLE_ALLOCATOR && SLJIT_PROT_EXECUTABLE_ALLOCATOR)
335#if defined(__NetBSD__)
341#elif (defined SLJIT_WX_EXECUTABLE_ALLOCATOR && SLJIT_WX_EXECUTABLE_ALLOCATOR)
353#elif defined(__APPLE__)
355#elif defined(__FreeBSD__)
365#ifndef SLJIT_UPDATE_WX_FLAGS
366#define SLJIT_UPDATE_WX_FLAGS(from, to, enable_exec)
371#if (defined SLJIT_PROT_EXECUTABLE_ALLOCATOR && SLJIT_PROT_EXECUTABLE_ALLOCATOR)
372#define SLJIT_ADD_EXEC_OFFSET(ptr, exec_offset) ((sljit_u8 *)(ptr) + (exec_offset))
374#define SLJIT_ADD_EXEC_OFFSET(ptr, exec_offset) ((sljit_u8 *)(ptr))
379#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
383#define CHECK_ARGUMENT(x) \
385 if (SLJIT_UNLIKELY(!(x))) \
389#define CHECK_RETURN_TYPE sljit_s32
390#define CHECK_RETURN_OK return 0
394 if (SLJIT_UNLIKELY(x)) { \
395 compiler->error = SLJIT_ERR_BAD_ARGUMENT; \
396 return SLJIT_ERR_BAD_ARGUMENT; \
400#define CHECK_PTR(x) \
402 if (SLJIT_UNLIKELY(x)) { \
403 compiler->error = SLJIT_ERR_BAD_ARGUMENT; \
408#define CHECK_REG_INDEX(x) \
410 if (SLJIT_UNLIKELY(x)) { \
415#elif (defined SLJIT_DEBUG && SLJIT_DEBUG)
418#undef SLJIT_ARGUMENT_CHECKS
419#define SLJIT_ARGUMENT_CHECKS 1
421#define CHECK_ARGUMENT(x) SLJIT_ASSERT(x)
422#define CHECK_RETURN_TYPE void
423#define CHECK_RETURN_OK return
425#define CHECK_PTR(x) x
426#define CHECK_REG_INDEX(x) x
428#elif (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
431#define CHECK_RETURN_TYPE void
432#define CHECK_RETURN_OK return
434#define CHECK_PTR(x) x
435#define CHECK_REG_INDEX(x) x
442#define CHECK_REG_INDEX(x)
450#if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86)
451#define SLJIT_NEEDS_COMPILER_INIT 1
452static sljit_s32 compiler_initialized = 0;
473 invalid_integer_types);
475 rewritable_jump_and_single_op_must_not_be_the_same);
477 conditional_flags_must_be_even_numbers);
486 if (!compiler->
buf || !compiler->
abuf) {
506#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
507 compiler->args_size = -1;
510#if (defined SLJIT_CONFIG_ARM_V6 && SLJIT_CONFIG_ARM_V6)
512 + CPOOL_SIZE *
sizeof(
sljit_u8), allocator_data);
513 if (!compiler->cpool) {
519 compiler->cpool_unique = (
sljit_u8*)(compiler->cpool + CPOOL_SIZE);
520 compiler->cpool_diff = 0xffffffff;
523#if (defined SLJIT_CONFIG_MIPS && SLJIT_CONFIG_MIPS)
524 compiler->delay_slot = UNMOVABLE_INS;
527#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) \
528 || (defined SLJIT_DEBUG && SLJIT_DEBUG)
534#if (defined SLJIT_NEEDS_COMPILER_INIT && SLJIT_NEEDS_COMPILER_INIT)
535 if (!compiler_initialized) {
537 compiler_initialized = 1;
565#if (defined SLJIT_CONFIG_ARM_V6 && SLJIT_CONFIG_ARM_V6)
587 jump->flags &= (
sljit_uw)~JUMP_ADDR;
588 jump->u.label = label;
595 jump->flags |= JUMP_ADDR;
596 jump->u.target = target;
600#define SLJIT_CURRENT_FLAGS_ALL \
601 (SLJIT_CURRENT_FLAGS_32 | SLJIT_CURRENT_FLAGS_ADD | SLJIT_CURRENT_FLAGS_SUB | SLJIT_CURRENT_FLAGS_COMPARE)
608#if (defined SLJIT_HAS_STATUS_FLAGS_STATE && SLJIT_HAS_STATUS_FLAGS_STATE)
609 compiler->status_flags_state = current_flags;
612#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
614 if ((current_flags & ~(VARIABLE_FLAG_MASK |
SLJIT_SET_Z | SLJIT_CURRENT_FLAGS_ALL)) == 0) {
637 new_frag->
next = compiler->
buf;
638 compiler->
buf = new_frag;
657 compiler->
abuf = new_frag;
666#if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
695 void *exec_allocator_data,
sljit_sw *executable_offset)
701 code = SLJIT_MALLOC_EXEC(
size, exec_allocator_data);
716#define SLJIT_MAX_ADDRESS ~(sljit_uw)0
718#define SLJIT_GET_NEXT_SIZE(ptr) (ptr != NULL) ? ((ptr)->size) : SLJIT_MAX_ADDRESS
719#define SLJIT_GET_NEXT_ADDRESS(ptr) (ptr != NULL) ? ((ptr)->addr) : SLJIT_MAX_ADDRESS
721#if !(defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86)
723#define SLJIT_NEXT_DEFINE_TYPES \
724 sljit_uw next_label_size; \
725 sljit_uw next_jump_addr; \
726 sljit_uw next_const_addr; \
727 sljit_uw next_min_addr
729#define SLJIT_NEXT_INIT_TYPES() \
730 next_label_size = SLJIT_GET_NEXT_SIZE(label); \
731 next_jump_addr = SLJIT_GET_NEXT_ADDRESS(jump); \
732 next_const_addr = SLJIT_GET_NEXT_ADDRESS(const_);
734#define SLJIT_GET_NEXT_MIN() \
735 next_min_addr = sljit_get_next_min(next_label_size, next_jump_addr, next_const_addr);
744 if (next_const_addr <
result)
747 if (next_label_size <
result)
764 compiler->
saveds = saveds;
767#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
782 compiler->
saveds = saveds;
785#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
807 jump->u.label =
NULL;
811 compiler->
jumps = jump;
819 jump->flags = JUMP_MOV_ADDR;
820 jump->u.label =
NULL;
824 compiler->
jumps = jump;
835 compiler->
consts = const_;
839#define ADDRESSING_DEPENDS_ON(exp, reg) \
840 (((exp) & SLJIT_MEM) && (((exp) & REG_MASK) == reg || OFFS_REG(exp) == reg))
842#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
846 sljit_s32 word_arg_count, scratch_arg_end, saved_arg_count, float_arg_count, curr_type;
848 curr_type = (arg_types & SLJIT_ARG_FULL_MASK);
864 while (arg_types != 0) {
865 if (word_arg_count + float_arg_count >= 4)
868 curr_type = (arg_types & SLJIT_ARG_MASK);
871 if (saveds == -1 || curr_type < SLJIT_ARG_TYPE_W || curr_type >
SLJIT_ARG_TYPE_P)
875 scratch_arg_end = word_arg_count;
891 return (word_arg_count <= scratches && float_arg_count <= fscratches);
893 return (saved_arg_count <= saveds && scratch_arg_end <= scratches && float_arg_count <= fscratches);
896#define FUNCTION_CHECK_IS_REG(r) \
897 (((r) >= SLJIT_R0 && (r) < (SLJIT_R0 + compiler->scratches)) \
898 || ((r) > (SLJIT_S0 - compiler->saveds) && (r) <= SLJIT_S0) \
899 || ((r) >= SLJIT_TMP_REGISTER_BASE && (r) < (SLJIT_TMP_REGISTER_BASE + SLJIT_NUMBER_OF_TEMPORARY_REGISTERS)))
901#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
902#define CHECK_IF_VIRTUAL_REGISTER(p) ((p) <= SLJIT_S3 && (p) >= SLJIT_S8)
904#define CHECK_IF_VIRTUAL_REGISTER(p) 0
916 return (i >= 0 && i < compiler->logical_local_size);
918 if (!(!(
p & REG_MASK) || FUNCTION_CHECK_IS_REG(
p & REG_MASK)))
921 if (CHECK_IF_VIRTUAL_REGISTER(
p & REG_MASK))
924 if (
p & OFFS_REG_MASK) {
928 if (!(FUNCTION_CHECK_IS_REG(OFFS_REG(
p))))
931 if (CHECK_IF_VIRTUAL_REGISTER(OFFS_REG(
p)))
938 return (
p & ~(
SLJIT_MEM | REG_MASK | OFFS_REG_MASK)) == 0;
941#define FUNCTION_CHECK_SRC_MEM(p, i) \
942 CHECK_ARGUMENT(function_check_src_mem(compiler, p, i));
949 if (FUNCTION_CHECK_IS_REG(
p))
955 return function_check_src_mem(compiler,
p, i);
958#define FUNCTION_CHECK_SRC(p, i) \
959 CHECK_ARGUMENT(function_check_src(compiler, p, i));
966 if (FUNCTION_CHECK_IS_REG(
p))
969 return function_check_src_mem(compiler,
p, i);
972#define FUNCTION_CHECK_DST(p, i) \
973 CHECK_ARGUMENT(function_check_dst(compiler, p, i));
975#if (defined SLJIT_CONFIG_ARM_32 && SLJIT_CONFIG_ARM_32) \
976 || (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)
978#define FUNCTION_CHECK_IS_FREG(fr, is_32) \
979 function_check_is_freg(compiler, (fr), (is_32))
983#define FUNCTION_FCHECK(p, i, is_32) \
984 CHECK_ARGUMENT(function_fcheck(compiler, (p), (i), (is_32)));
991 if (FUNCTION_CHECK_IS_FREG(
p, is_32))
994 return function_check_src_mem(compiler,
p, i);
998#define FUNCTION_CHECK_IS_FREG(fr, is_32) \
999 function_check_is_freg(compiler, (fr))
1011#define FUNCTION_FCHECK(p, i, is_32) \
1012 CHECK_ARGUMENT(function_fcheck(compiler, (p), (i)));
1024 return function_check_src_mem(compiler,
p, i);
1031#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
1038#if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
1041# define SLJIT_PRINT_D "ll"
1043# define SLJIT_PRINT_D "I64"
1046# define SLJIT_PRINT_D "l"
1049# define SLJIT_PRINT_D ""
1057 fprintf(compiler->
verbose,
"s%d", SLJIT_NUMBER_OF_REGISTERS - r);
1066#if (defined SLJIT_CONFIG_ARM_32 && SLJIT_CONFIG_ARM_32) \
1067 || (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)
1077 fprintf(compiler->
verbose,
"fs%d", SLJIT_NUMBER_OF_FLOAT_REGISTERS - r);
1087 if ((
p) & REG_MASK) {
1088 fputc(
'[', compiler->
verbose);
1089 sljit_verbose_reg(compiler, (
p) & REG_MASK);
1090 if ((
p) & OFFS_REG_MASK) {
1092 sljit_verbose_reg(compiler, OFFS_REG(
p));
1098 fputc(
']', compiler->
verbose);
1103 sljit_verbose_reg(compiler,
p);
1109 if ((
p) & REG_MASK) {
1110 fputc(
'[', compiler->
verbose);
1111 sljit_verbose_reg(compiler, (
p) & REG_MASK);
1112 if ((
p) & OFFS_REG_MASK) {
1114 sljit_verbose_reg(compiler, OFFS_REG(
p));
1120 fputc(
']', compiler->
verbose);
1126 sljit_verbose_freg(compiler,
p);
1129static const char* op0_names[] = {
1130 "breakpoint",
"nop",
"lmul.uw",
"lmul.sw",
1131 "divmod.u",
"divmod.s",
"div.u",
"div.s",
1132 "endbr",
"skip_frames_before_return"
1135static const char* op1_names[] = {
1136 "mov",
"mov",
"mov",
"mov",
1137 "mov",
"mov",
"mov",
"mov",
1138 "mov",
"clz",
"ctz",
"rev",
1139 "rev",
"rev",
"rev",
"rev"
1142static const char* op1_types[] = {
1143 "",
".u8",
".s8",
".u16",
1144 ".s16",
".u32",
".s32",
"32",
1146 ".u16",
".s16",
".u32",
".s32"
1149static const char* op2_names[] = {
1150 "add",
"addc",
"sub",
"subc",
1151 "mul",
"and",
"or",
"xor",
1152 "shl",
"mshl",
"lshr",
"mlshr",
1153 "ashr",
"mashr",
"rotl",
"rotr"
1156static const char* op2r_names[] = {
1160static const char* op_src_dst_names[] = {
1161 "fast_return",
"skip_frames_before_fast_return",
1162 "prefetch_l1",
"prefetch_l2",
1163 "prefetch_l3",
"prefetch_once",
1164 "fast_enter",
"get_return_address"
1167static const char* fop1_names[] = {
1168 "mov",
"conv",
"conv",
"conv",
1169 "conv",
"conv",
"conv",
"conv",
1170 "cmp",
"neg",
"abs",
1173static const char* fop1_conv_types[] = {
1174 "sw",
"s32",
"sw",
"s32",
1178static const char* fop2_names[] = {
1179 "add",
"sub",
"mul",
"div"
1182static const char* fop2r_names[] = {
1186static const char* simd_op2_names[] = {
1190static const char* jump_names[] = {
1191 "equal",
"not_equal",
1192 "less",
"greater_equal",
1193 "greater",
"less_equal",
1194 "sig_less",
"sig_greater_equal",
1195 "sig_greater",
"sig_less_equal",
1196 "overflow",
"not_overflow",
1197 "carry",
"not_carry",
1198 "atomic_stored",
"atomic_not_stored",
1199 "f_equal",
"f_not_equal",
1200 "f_less",
"f_greater_equal",
1201 "f_greater",
"f_less_equal",
1202 "unordered",
"ordered",
1203 "ordered_equal",
"unordered_or_not_equal",
1204 "ordered_less",
"unordered_or_greater_equal",
1205 "ordered_greater",
"unordered_or_less_equal",
1206 "unordered_or_equal",
"ordered_not_equal",
1207 "unordered_or_less",
"ordered_greater_equal",
1208 "unordered_or_greater",
"ordered_less_equal",
1209 "jump",
"fast_call",
1210 "call",
"call_reg_arg"
1213static const char* call_arg_names[] = {
1214 "void",
"w",
"32",
"p",
"f64",
"f32"
1223#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) \
1224 || (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
1226#define SLJIT_SKIP_CHECKS(compiler) (compiler)->skip_checks = 1
1230#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
1236#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
1237 CHECK_ARGUMENT(compiler->
size > 0);
1238 jump = compiler->
jumps;
1241 CHECK_ARGUMENT((jump->flags & JUMP_ADDR) || jump->u.label !=
NULL);
1248#if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86)
1249#define SLJIT_ENTER_CPU_SPECIFIC_OPTIONS (SLJIT_ENTER_USE_VEX)
1251#define SLJIT_ENTER_CPU_SPECIFIC_OPTIONS (0)
1260#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
1264 CHECK_ARGUMENT((
options & ~SLJIT_ENTER_CPU_SPECIFIC_OPTIONS) == 0);
1266 CHECK_ARGUMENT(SLJIT_KEPT_SAVEDS_COUNT(
options) <= 3 && SLJIT_KEPT_SAVEDS_COUNT(
options) <= saveds);
1267 CHECK_ARGUMENT(scratches >= 0 && scratches <= SLJIT_NUMBER_OF_REGISTERS);
1268 CHECK_ARGUMENT(saveds >= 0 && saveds <= SLJIT_NUMBER_OF_SAVED_REGISTERS);
1269 CHECK_ARGUMENT(scratches + saveds <= SLJIT_NUMBER_OF_REGISTERS);
1270 CHECK_ARGUMENT(fscratches >= 0 && fscratches <= SLJIT_NUMBER_OF_FLOAT_REGISTERS);
1271 CHECK_ARGUMENT(fsaveds >= 0 && fsaveds <= SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS);
1272 CHECK_ARGUMENT(fscratches + fsaveds <= SLJIT_NUMBER_OF_FLOAT_REGISTERS);
1279#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
1281 fprintf(compiler->
verbose,
" enter ret[%s", call_arg_names[arg_types & SLJIT_ARG_MASK]);
1287 fprintf(compiler->
verbose,
"%s%s", call_arg_names[arg_types & SLJIT_ARG_MASK],
1292 }
while (arg_types);
1298 if (SLJIT_KEPT_SAVEDS_COUNT(
options) > 0)
1304#if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86)
1305 if (
options & SLJIT_ENTER_USE_VEX) {
1310 fprintf(compiler->
verbose,
" scratches:%d, saveds:%d, fscratches:%d, fsaveds:%d, local_size:%d\n",
1311 scratches, saveds, fscratches, fsaveds, local_size);
1323#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
1327 CHECK_ARGUMENT((
options & ~SLJIT_ENTER_CPU_SPECIFIC_OPTIONS) == 0);
1329 CHECK_ARGUMENT(SLJIT_KEPT_SAVEDS_COUNT(
options) <= 3 && SLJIT_KEPT_SAVEDS_COUNT(
options) <= saveds);
1330 CHECK_ARGUMENT(scratches >= 0 && scratches <= SLJIT_NUMBER_OF_REGISTERS);
1331 CHECK_ARGUMENT(saveds >= 0 && saveds <= SLJIT_NUMBER_OF_SAVED_REGISTERS);
1332 CHECK_ARGUMENT(scratches + saveds <= SLJIT_NUMBER_OF_REGISTERS);
1333 CHECK_ARGUMENT(fscratches >= 0 && fscratches <= SLJIT_NUMBER_OF_FLOAT_REGISTERS);
1334 CHECK_ARGUMENT(fsaveds >= 0 && fsaveds <= SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS);
1335 CHECK_ARGUMENT(fscratches + fsaveds <= SLJIT_NUMBER_OF_FLOAT_REGISTERS);
1342#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
1344 fprintf(compiler->
verbose,
" set_context ret[%s", call_arg_names[arg_types & SLJIT_ARG_MASK]);
1350 fprintf(compiler->
verbose,
"%s%s", call_arg_names[arg_types & SLJIT_ARG_MASK],
1355 }
while (arg_types);
1361 if (SLJIT_KEPT_SAVEDS_COUNT(
options) > 0)
1367#if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86)
1368 if (
options & SLJIT_ENTER_USE_VEX) {
1373 fprintf(compiler->
verbose,
" scratches:%d, saveds:%d, fscratches:%d, fsaveds:%d, local_size:%d\n",
1374 scratches, saveds, fscratches, fsaveds, local_size);
1380#undef SLJIT_ENTER_CPU_SPECIFIC_OPTIONS
1389#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
1393#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
1403#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
1404 CHECK_ARGUMENT(compiler->
scratches >= 0);
1431 FUNCTION_CHECK_SRC(src, srcw);
1433 FUNCTION_FCHECK(src, srcw, op &
SLJIT_32);
1437#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
1442 sljit_verbose_param(compiler, src, srcw);
1445 sljit_verbose_fparam(compiler, src, srcw);
1456#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
1457 FUNCTION_CHECK_SRC(src, srcw);
1459#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
1462 sljit_verbose_param(compiler, src, srcw);
1471#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
1479#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
1501#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
1517 CHECK_ARGUMENT(!(op & (
SLJIT_SET_Z | VARIABLE_FLAG_MASK)));
1521 FUNCTION_CHECK_DST(dst, dstw);
1522 FUNCTION_CHECK_SRC(src, srcw);
1524#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
1529 sljit_verbose_param(compiler, dst, dstw);
1531 sljit_verbose_param(compiler, src, srcw);
1547#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
1553 CHECK_ARGUMENT(FUNCTION_CHECK_IS_REG(dst_reg));
1554 CHECK_ARGUMENT(FUNCTION_CHECK_IS_REG(mem_reg) && !CHECK_IF_VIRTUAL_REGISTER(mem_reg));
1558 CHECK_ARGUMENT(!(op & (VARIABLE_FLAG_MASK |
SLJIT_SET_Z)));
1566#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
1570 sljit_verbose_reg(compiler, dst_reg);
1572 sljit_verbose_reg(compiler, mem_reg);
1589#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
1595 CHECK_ARGUMENT(FUNCTION_CHECK_IS_REG(src_reg));
1596 CHECK_ARGUMENT(FUNCTION_CHECK_IS_REG(mem_reg) && !CHECK_IF_VIRTUAL_REGISTER(mem_reg));
1597 CHECK_ARGUMENT(FUNCTION_CHECK_IS_REG(temp_reg) && src_reg != temp_reg);
1611#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
1615 sljit_verbose_reg(compiler, src_reg);
1617 sljit_verbose_reg(compiler, mem_reg);
1619 sljit_verbose_reg(compiler, temp_reg);
1636#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
1649 CHECK_ARGUMENT(!(op & VARIABLE_FLAG_MASK));
1653 CHECK_ARGUMENT(!(op & VARIABLE_FLAG_MASK)
1657 CHECK_ARGUMENT(!(op & VARIABLE_FLAG_MASK)
1662 CHECK_ARGUMENT(!(op & VARIABLE_FLAG_MASK)
1668 CHECK_ARGUMENT(!(op & VARIABLE_FLAG_MASK)
1675 CHECK_ARGUMENT(!(op & (
SLJIT_SET_Z | VARIABLE_FLAG_MASK)));
1683 CHECK_ARGUMENT(HAS_FLAGS(op));
1685 FUNCTION_CHECK_DST(dst, dstw);
1687 FUNCTION_CHECK_SRC(src1, src1w);
1688 FUNCTION_CHECK_SRC(src2, src2w);
1691#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
1694 !(op &
SLJIT_SET_Z) ?
"" :
".z", !(op & VARIABLE_FLAG_MASK) ?
"" :
".",
1695 !(op & VARIABLE_FLAG_MASK) ?
"" : jump_names[GET_FLAG_TYPE(op)]);
1699 sljit_verbose_param(compiler, dst, dstw);
1701 sljit_verbose_param(compiler, src1, src1w);
1703 sljit_verbose_param(compiler, src2, src2w);
1715#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
1717 CHECK_ARGUMENT(FUNCTION_CHECK_IS_REG(dst_reg));
1718 FUNCTION_CHECK_SRC(src1, src1w);
1719 FUNCTION_CHECK_SRC(src2, src2w);
1722#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
1726 sljit_verbose_reg(compiler, dst_reg);
1728 sljit_verbose_param(compiler, src1, src1w);
1730 sljit_verbose_param(compiler, src2, src2w);
1743#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
1747 CHECK_ARGUMENT(FUNCTION_CHECK_IS_REG(dst_reg));
1748 CHECK_ARGUMENT(FUNCTION_CHECK_IS_REG(src1_reg));
1749 CHECK_ARGUMENT(FUNCTION_CHECK_IS_REG(src2_reg));
1750 FUNCTION_CHECK_SRC(src3, src3w);
1751 CHECK_ARGUMENT(dst_reg != src2_reg);
1753#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
1758 sljit_verbose_reg(compiler, dst_reg);
1760 sljit_verbose_reg(compiler, src1_reg);
1762 sljit_verbose_reg(compiler, src2_reg);
1764 sljit_verbose_param(compiler, src3, src3w);
1774#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
1776 FUNCTION_CHECK_SRC(src, srcw);
1785#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
1788 sljit_verbose_param(compiler, src, srcw);
1798#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
1800 FUNCTION_CHECK_DST(dst, dstw);
1805#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
1808 sljit_verbose_param(compiler, dst, dstw);
1819#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
1821 CHECK_ARGUMENT((reg > 0 && reg <= SLJIT_NUMBER_OF_REGISTERS)
1825 CHECK_ARGUMENT((reg > 0 && reg <= SLJIT_NUMBER_OF_FLOAT_REGISTERS)
1835#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
1841#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
1842 CHECK_ARGUMENT(instruction);
1844#if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86)
1845 CHECK_ARGUMENT(
size > 0 &&
size < 16);
1846#elif (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2)
1847 CHECK_ARGUMENT((
size == 2 && (((
sljit_sw)instruction) & 0x1) == 0)
1848 || (
size == 4 && (((
sljit_sw)instruction) & 0x3) == 0));
1849#elif (defined SLJIT_CONFIG_S390X && SLJIT_CONFIG_S390X)
1852 CHECK_ARGUMENT(
size == 4 && (((
sljit_sw)instruction) & 0x3) == 0);
1857#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
1860 for (i = 0; i <
size; i++)
1877#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
1880 CHECK_ARGUMENT(!(op & (
SLJIT_SET_Z | VARIABLE_FLAG_MASK)));
1881 FUNCTION_FCHECK(src, srcw, op &
SLJIT_32);
1882 FUNCTION_FCHECK(dst, dstw, op &
SLJIT_32);
1884#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
1888 (op &
SLJIT_32) ?
".f32.from.f64" :
".f64.from.f32");
1891 (op &
SLJIT_32) ?
".f32" :
".f64");
1893 sljit_verbose_fparam(compiler, dst, dstw);
1895 sljit_verbose_fparam(compiler, src, srcw);
1906#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
1915#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
1919 CHECK_ARGUMENT((op & VARIABLE_FLAG_MASK)
1921 FUNCTION_FCHECK(src1, src1w, op &
SLJIT_32);
1922 FUNCTION_FCHECK(src2, src2w, op &
SLJIT_32);
1924#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
1927 if (op & VARIABLE_FLAG_MASK) {
1928 fprintf(compiler->
verbose,
".%s", jump_names[GET_FLAG_TYPE(op)]);
1931 sljit_verbose_fparam(compiler, src1, src1w);
1933 sljit_verbose_fparam(compiler, src2, src2w);
1949#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
1951 CHECK_ARGUMENT(!(op & (
SLJIT_SET_Z | VARIABLE_FLAG_MASK)));
1952 FUNCTION_FCHECK(src, srcw, op &
SLJIT_32);
1953 FUNCTION_CHECK_DST(dst, dstw);
1955#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
1959 (op &
SLJIT_32) ?
".f32" :
".f64");
1960 sljit_verbose_param(compiler, dst, dstw);
1962 sljit_verbose_fparam(compiler, src, srcw);
1978#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
1980 CHECK_ARGUMENT(!(op & (
SLJIT_SET_Z | VARIABLE_FLAG_MASK)));
1981 FUNCTION_CHECK_SRC(src, srcw);
1982 FUNCTION_FCHECK(dst, dstw, op &
SLJIT_32);
1984#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
1989 sljit_verbose_fparam(compiler, dst, dstw);
1991 sljit_verbose_param(compiler, src, srcw);
2008#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
2011 CHECK_ARGUMENT(!(op & (
SLJIT_SET_Z | VARIABLE_FLAG_MASK)));
2012 FUNCTION_FCHECK(src1, src1w, op &
SLJIT_32);
2013 FUNCTION_FCHECK(src2, src2w, op &
SLJIT_32);
2014 FUNCTION_FCHECK(dst, dstw, op &
SLJIT_32);
2016#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
2019 sljit_verbose_fparam(compiler, dst, dstw);
2021 sljit_verbose_fparam(compiler, src1, src1w);
2023 sljit_verbose_fparam(compiler, src2, src2w);
2035#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
2038 FUNCTION_FCHECK(src1, src1w, op &
SLJIT_32);
2039 FUNCTION_FCHECK(src2, src2w, op &
SLJIT_32);
2040 CHECK_ARGUMENT(FUNCTION_CHECK_IS_FREG(dst_freg, op &
SLJIT_32));
2042#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
2045 sljit_verbose_freg(compiler, dst_freg);
2047 sljit_verbose_fparam(compiler, src1, src1w);
2049 sljit_verbose_fparam(compiler, src2, src2w);
2066#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
2068 CHECK_ARGUMENT(FUNCTION_CHECK_IS_FREG(freg, 1));
2070#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
2073 sljit_verbose_freg(compiler, freg);
2090#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
2092 CHECK_ARGUMENT(FUNCTION_CHECK_IS_FREG(freg, 0));
2094#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
2097 sljit_verbose_freg(compiler, freg);
2107#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
2110 CHECK_ARGUMENT(!(op & (
SLJIT_SET_Z | VARIABLE_FLAG_MASK)));
2111 CHECK_ARGUMENT(FUNCTION_CHECK_IS_FREG(freg, op &
SLJIT_32));
2113#if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
2114 CHECK_ARGUMENT(FUNCTION_CHECK_IS_REG(reg));
2119 CHECK_ARGUMENT(FUNCTION_CHECK_IS_REG(reg));
2123 if (reg & REG_PAIR_MASK) {
2124 CHECK_ARGUMENT(FUNCTION_CHECK_IS_REG(REG_PAIR_FIRST(reg)));
2125 CHECK_ARGUMENT(FUNCTION_CHECK_IS_REG(REG_PAIR_SECOND(reg)));
2130 CHECK_ARGUMENT(REG_PAIR_FIRST(reg) != REG_PAIR_SECOND(reg));
2134 CHECK_ARGUMENT(FUNCTION_CHECK_IS_REG(reg));
2139#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
2144 sljit_verbose_freg(compiler, freg);
2146 if (reg & REG_PAIR_MASK) {
2148 sljit_verbose_reg(compiler, REG_PAIR_FIRST(reg));
2150 sljit_verbose_reg(compiler, REG_PAIR_SECOND(reg));
2154 sljit_verbose_reg(compiler, reg);
2171#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
2175#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
2182#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
2183#if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86) \
2184 || (defined SLJIT_CONFIG_ARM && SLJIT_CONFIG_ARM)
2185#define CHECK_UNORDERED(type, last_flags) \
2186 ((((type) & 0xfe) == SLJIT_ORDERED) && \
2187 ((last_flags) & 0xff) >= SLJIT_UNORDERED && ((last_flags) & 0xff) <= SLJIT_ORDERED_LESS_EQUAL)
2189#define CHECK_UNORDERED(type, last_flags) 0
2200#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
2215#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
2218 jump_names[
type & 0xff]);
2226#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
2229 CHECK_ARGUMENT(function_check_arguments(arg_types, compiler->
scratches, -1, compiler->
fscratches));
2232 CHECK_ARGUMENT((arg_types & SLJIT_ARG_MASK) == compiler->
last_return);
2241#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
2246 call_arg_names[arg_types & SLJIT_ARG_MASK]);
2252 fprintf(compiler->
verbose,
"%s", call_arg_names[arg_types & SLJIT_ARG_MASK]);
2256 }
while (arg_types);
2268#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
2271 FUNCTION_CHECK_SRC(src1, src1w);
2272 FUNCTION_CHECK_SRC(src2, src2w);
2275#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
2279 sljit_verbose_param(compiler, src1, src1w);
2281 sljit_verbose_param(compiler, src2, src2w);
2292#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
2300#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
2304 sljit_verbose_fparam(compiler, src1, src1w);
2306 sljit_verbose_fparam(compiler, src2, src2w);
2321#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
2323 FUNCTION_CHECK_SRC(src, srcw);
2325#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
2328 sljit_verbose_param(compiler, src, srcw);
2339#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
2342 CHECK_ARGUMENT(function_check_arguments(arg_types, compiler->
scratches, -1, compiler->
fscratches));
2343 FUNCTION_CHECK_SRC(src, srcw);
2346 CHECK_ARGUMENT((arg_types & SLJIT_ARG_MASK) == compiler->
last_return);
2355#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
2359 call_arg_names[arg_types & SLJIT_ARG_MASK]);
2365 fprintf(compiler->
verbose,
"%s", call_arg_names[arg_types & SLJIT_ARG_MASK]);
2369 }
while (arg_types);
2372 sljit_verbose_param(compiler, src, srcw);
2383#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
2387 CHECK_ARGUMENT(!(op & VARIABLE_FLAG_MASK));
2395 FUNCTION_CHECK_DST(dst, dstw);
2400#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
2406 sljit_verbose_param(compiler, dst, dstw);
2418#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
2424 CHECK_ARGUMENT(FUNCTION_CHECK_IS_REG(dst_reg));
2425 FUNCTION_CHECK_SRC(src1, src1w);
2426 CHECK_ARGUMENT(FUNCTION_CHECK_IS_REG(src2_reg));
2434 CHECK_ARGUMENT((cond & 0xfe) == (compiler->
last_flags & 0xff)
2435 || CHECK_UNORDERED(cond, compiler->
last_flags));
2437#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
2442 sljit_verbose_reg(compiler, dst_reg);
2444 sljit_verbose_param(compiler, src1, src1w);
2446 sljit_verbose_reg(compiler, src2_reg);
2458#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
2464 CHECK_ARGUMENT(FUNCTION_CHECK_IS_FREG(dst_freg,
type &
SLJIT_32));
2466 CHECK_ARGUMENT(FUNCTION_CHECK_IS_FREG(src2_freg,
type &
SLJIT_32));
2474 CHECK_ARGUMENT((cond & 0xfe) == (compiler->
last_flags & 0xff)
2475 || CHECK_UNORDERED(cond, compiler->
last_flags));
2477#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
2482 sljit_verbose_freg(compiler, dst_freg);
2484 sljit_verbose_fparam(compiler, src1, src1w);
2486 sljit_verbose_freg(compiler, src2_freg);
2497#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
2506#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
2517 switch (
type & 0xff) {
2531 if (reg & REG_PAIR_MASK) {
2533 CHECK_ARGUMENT(FUNCTION_CHECK_IS_REG(REG_PAIR_FIRST(reg)));
2534 CHECK_ARGUMENT(FUNCTION_CHECK_IS_REG(REG_PAIR_SECOND(reg)));
2535 CHECK_ARGUMENT(REG_PAIR_FIRST(reg) != REG_PAIR_SECOND(reg));
2539 CHECK_ARGUMENT(FUNCTION_CHECK_IS_REG(reg));
2542 FUNCTION_CHECK_SRC_MEM(mem, memw);
2544#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
2561 if (reg & REG_PAIR_MASK) {
2563 sljit_verbose_reg(compiler, REG_PAIR_FIRST(reg));
2565 sljit_verbose_reg(compiler, REG_PAIR_SECOND(reg));
2569 sljit_verbose_reg(compiler, reg);
2572 sljit_verbose_param(compiler, mem, memw);
2588#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
2591 CHECK_ARGUMENT((mem & REG_MASK) != 0 && (mem & REG_MASK) != reg);
2593 FUNCTION_CHECK_SRC_MEM(mem, memw);
2595#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
2600 fprintf(compiler->
verbose,
" # mem: unsupported form, no instructions are emitted\n");
2615 sljit_verbose_reg(compiler, reg);
2617 sljit_verbose_param(compiler, mem, memw);
2628#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
2642 CHECK_ARGUMENT(FUNCTION_CHECK_IS_FREG(freg,
type &
SLJIT_32));
2643 FUNCTION_CHECK_SRC_MEM(mem, memw);
2645#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
2659 sljit_verbose_freg(compiler, freg);
2661 sljit_verbose_param(compiler, mem, memw);
2672#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
2676 FUNCTION_CHECK_SRC_MEM(mem, memw);
2677 CHECK_ARGUMENT(FUNCTION_CHECK_IS_FREG(freg,
type &
SLJIT_32));
2679#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
2684 fprintf(compiler->
verbose,
" # fmem: unsupported form, no instructions are emitted\n");
2693 sljit_verbose_freg(compiler, freg);
2695 sljit_verbose_param(compiler, mem, memw);
2706#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
2709 CHECK_ARGUMENT(SLJIT_SIMD_CHECK_REG(
type));
2710 CHECK_ARGUMENT(SLJIT_SIMD_GET_ELEM_SIZE(
type) <= SLJIT_SIMD_GET_REG_SIZE(
type));
2711 CHECK_ARGUMENT(SLJIT_SIMD_GET_ELEM2_SIZE(
type) <= (srcdst &
SLJIT_MEM) ? SLJIT_SIMD_GET_REG_SIZE(
type) : 0);
2712 CHECK_ARGUMENT(FUNCTION_CHECK_IS_FREG(freg, 0));
2713 FUNCTION_FCHECK(srcdst, srcdstw, 0);
2715#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
2720 fprintf(compiler->
verbose,
" # simd_mem: unsupported form, no instructions are emitted\n");
2726 (8 << SLJIT_SIMD_GET_REG_SIZE(
type)),
2728 (8 << SLJIT_SIMD_GET_ELEM_SIZE(
type)));
2735 sljit_verbose_freg(compiler, freg);
2737 sljit_verbose_fparam(compiler, srcdst, srcdstw);
2748#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
2750 CHECK_ARGUMENT((
type & SLJIT_SIMD_TYPE_MASK(0)) == 0);
2751 CHECK_ARGUMENT(SLJIT_SIMD_CHECK_REG(
type));
2752 CHECK_ARGUMENT(SLJIT_SIMD_GET_ELEM_SIZE(
type) < SLJIT_SIMD_GET_REG_SIZE(
type));
2753 CHECK_ARGUMENT(FUNCTION_CHECK_IS_FREG(freg, 0));
2757 CHECK_ARGUMENT(srcw == 0);
2759 FUNCTION_FCHECK(src, srcw, SLJIT_SIMD_GET_ELEM_SIZE(
type) == 2);
2762 FUNCTION_CHECK_DST(src, srcw);
2765#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
2770 fprintf(compiler->
verbose,
" # simd_dup: unsupported form, no instructions are emitted\n");
2775 (8 << SLJIT_SIMD_GET_REG_SIZE(
type)),
2777 (8 << SLJIT_SIMD_GET_ELEM_SIZE(
type)));
2779 sljit_verbose_freg(compiler, freg);
2782 sljit_verbose_fparam(compiler, src, srcw);
2784 sljit_verbose_param(compiler, src, srcw);
2795#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
2801 CHECK_ARGUMENT(SLJIT_SIMD_CHECK_REG(
type));
2802 CHECK_ARGUMENT(SLJIT_SIMD_GET_ELEM_SIZE(
type) < SLJIT_SIMD_GET_REG_SIZE(
type));
2804 CHECK_ARGUMENT(FUNCTION_CHECK_IS_FREG(freg, 0));
2805 CHECK_ARGUMENT(lane_index >= 0 && lane_index < (1 << (SLJIT_SIMD_GET_REG_SIZE(
type) - SLJIT_SIMD_GET_ELEM_SIZE(
type))));
2808 FUNCTION_FCHECK(srcdst, srcdstw, SLJIT_SIMD_GET_ELEM_SIZE(
type) == 2);
2810 FUNCTION_CHECK_DST(srcdst, srcdstw);
2813#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
2818 fprintf(compiler->
verbose,
" # simd_move_lane: unsupported form, no instructions are emitted\n");
2827 (8 << SLJIT_SIMD_GET_REG_SIZE(
type)),
2829 (8 << SLJIT_SIMD_GET_ELEM_SIZE(
type)));
2831 sljit_verbose_freg(compiler, freg);
2834 sljit_verbose_fparam(compiler, srcdst, srcdstw);
2836 sljit_verbose_param(compiler, srcdst, srcdstw);
2847#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
2849 CHECK_ARGUMENT((
type & SLJIT_SIMD_TYPE_MASK(0)) == 0);
2850 CHECK_ARGUMENT(SLJIT_SIMD_CHECK_REG(
type));
2851 CHECK_ARGUMENT(SLJIT_SIMD_GET_ELEM_SIZE(
type) < SLJIT_SIMD_GET_REG_SIZE(
type));
2852 CHECK_ARGUMENT(FUNCTION_CHECK_IS_FREG(freg, 0));
2853 CHECK_ARGUMENT(FUNCTION_CHECK_IS_FREG(src, 0));
2854 CHECK_ARGUMENT(src_lane_index >= 0 && src_lane_index < (1 << (SLJIT_SIMD_GET_REG_SIZE(
type) - SLJIT_SIMD_GET_ELEM_SIZE(
type))));
2856#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
2861 fprintf(compiler->
verbose,
" # simd_lane_replicate: unsupported form, no instructions are emitted\n");
2866 (8 << SLJIT_SIMD_GET_REG_SIZE(
type)),
2868 (8 << SLJIT_SIMD_GET_ELEM_SIZE(
type)));
2870 sljit_verbose_freg(compiler, freg);
2872 sljit_verbose_freg(compiler, src);
2883#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
2887 CHECK_ARGUMENT(SLJIT_SIMD_CHECK_REG(
type));
2888 CHECK_ARGUMENT(SLJIT_SIMD_GET_ELEM2_SIZE(
type) < SLJIT_SIMD_GET_REG_SIZE(
type));
2889 CHECK_ARGUMENT(SLJIT_SIMD_GET_ELEM_SIZE(
type) < SLJIT_SIMD_GET_ELEM2_SIZE(
type));
2890 CHECK_ARGUMENT(FUNCTION_CHECK_IS_FREG(freg, 0));
2891 FUNCTION_FCHECK(src, srcw, SLJIT_SIMD_GET_ELEM_SIZE(
type) == 2);
2893#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
2898 fprintf(compiler->
verbose,
" # simd_extend: unsupported form, no instructions are emitted\n");
2904 (8 << SLJIT_SIMD_GET_REG_SIZE(
type)),
2906 (8 << SLJIT_SIMD_GET_ELEM2_SIZE(
type)),
2908 (8 << SLJIT_SIMD_GET_ELEM_SIZE(
type)));
2910 sljit_verbose_freg(compiler, freg);
2912 sljit_verbose_fparam(compiler, src, srcw);
2923#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
2926 CHECK_ARGUMENT(SLJIT_SIMD_CHECK_REG(
type));
2927 CHECK_ARGUMENT(SLJIT_SIMD_GET_ELEM_SIZE(
type) < SLJIT_SIMD_GET_REG_SIZE(
type));
2928 CHECK_ARGUMENT(FUNCTION_CHECK_IS_FREG(freg, 0));
2929 FUNCTION_CHECK_DST(dst, dstw);
2931#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
2936 fprintf(compiler->
verbose,
" # simd_sign: unsupported form, no instructions are emitted\n");
2942 (8 << SLJIT_SIMD_GET_REG_SIZE(
type)),
2944 (8 << SLJIT_SIMD_GET_ELEM_SIZE(
type)));
2946 sljit_verbose_freg(compiler, freg);
2948 sljit_verbose_param(compiler, dst, dstw);
2958#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
2961 CHECK_ARGUMENT(SLJIT_SIMD_CHECK_REG(
type));
2962 CHECK_ARGUMENT(SLJIT_SIMD_GET_ELEM_SIZE(
type) <= SLJIT_SIMD_GET_REG_SIZE(
type));
2963 CHECK_ARGUMENT(FUNCTION_CHECK_IS_FREG(dst_freg, 0));
2964 CHECK_ARGUMENT(FUNCTION_CHECK_IS_FREG(src1_freg, 0));
2965 CHECK_ARGUMENT(FUNCTION_CHECK_IS_FREG(src2_freg, 0));
2967#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
2972 fprintf(compiler->
verbose,
" # simd_op2: unsupported form, no instructions are emitted\n");
2977 simd_op2_names[SLJIT_SIMD_GET_OPCODE(
type) - 1],
2978 (8 << SLJIT_SIMD_GET_REG_SIZE(
type)),
2980 (8 << SLJIT_SIMD_GET_ELEM_SIZE(
type)));
2982 sljit_verbose_freg(compiler, dst_freg);
2984 sljit_verbose_freg(compiler, src1_freg);
2986 sljit_verbose_freg(compiler, src2_freg);
2998#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
2999 FUNCTION_CHECK_DST(dst, dstw);
3001#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
3004 sljit_verbose_param(compiler, dst, dstw);
3015#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
3016 FUNCTION_CHECK_DST(dst, dstw);
3018#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
3021 sljit_verbose_param(compiler, dst, dstw);
3022 fprintf(compiler->
verbose,
", #%" SLJIT_PRINT_D
"d\n", init_value);
3030#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
3031 FUNCTION_CHECK_DST(dst, dstw);
3033#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
3036 sljit_verbose_param(compiler, dst, dstw);
3045#define SLJIT_SKIP_CHECKS(compiler)
3049#define SELECT_FOP1_OPERATION_WITH_CHECKS(compiler, op, dst, dstw, src, srcw) \
3050 SLJIT_COMPILE_ASSERT(!(SLJIT_CONV_SW_FROM_F64 & 0x1) && !(SLJIT_CONV_F64_FROM_SW & 0x1) && !(SLJIT_CONV_F64_FROM_UW & 0x1), \
3051 invalid_float_opcodes); \
3052 if (GET_OPCODE(op) >= SLJIT_CONV_SW_FROM_F64 && GET_OPCODE(op) <= SLJIT_CMP_F64) { \
3053 if (GET_OPCODE(op) == SLJIT_CMP_F64) { \
3054 CHECK(check_sljit_emit_fop1_cmp(compiler, op, dst, dstw, src, srcw)); \
3055 ADJUST_LOCAL_OFFSET(dst, dstw); \
3056 ADJUST_LOCAL_OFFSET(src, srcw); \
3057 return sljit_emit_fop1_cmp(compiler, op, dst, dstw, src, srcw); \
3059 if ((GET_OPCODE(op) | 0x1) == SLJIT_CONV_S32_FROM_F64) { \
3060 CHECK(check_sljit_emit_fop1_conv_sw_from_f64(compiler, op, dst, dstw, src, srcw)); \
3061 ADJUST_LOCAL_OFFSET(dst, dstw); \
3062 ADJUST_LOCAL_OFFSET(src, srcw); \
3063 return sljit_emit_fop1_conv_sw_from_f64(compiler, op, dst, dstw, src, srcw); \
3065 if ((GET_OPCODE(op) | 0x1) == SLJIT_CONV_F64_FROM_S32) { \
3066 CHECK(check_sljit_emit_fop1_conv_f64_from_w(compiler, op, dst, dstw, src, srcw)); \
3067 ADJUST_LOCAL_OFFSET(dst, dstw); \
3068 ADJUST_LOCAL_OFFSET(src, srcw); \
3069 return sljit_emit_fop1_conv_f64_from_sw(compiler, op, dst, dstw, src, srcw); \
3071 CHECK(check_sljit_emit_fop1_conv_f64_from_w(compiler, op, dst, dstw, src, srcw)); \
3072 ADJUST_LOCAL_OFFSET(dst, dstw); \
3073 ADJUST_LOCAL_OFFSET(src, srcw); \
3074 return sljit_emit_fop1_conv_f64_from_uw(compiler, op, dst, dstw, src, srcw); \
3076 CHECK(check_sljit_emit_fop1(compiler, op, dst, dstw, src, srcw)); \
3077 ADJUST_LOCAL_OFFSET(dst, dstw); \
3078 ADJUST_LOCAL_OFFSET(src, srcw);
3080#if (!(defined SLJIT_CONFIG_MIPS && SLJIT_CONFIG_MIPS) || (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 6))
3086 SLJIT_SKIP_CHECKS(compiler);
3095#if (!(defined SLJIT_CONFIG_MIPS && SLJIT_CONFIG_MIPS) || (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 6)) \
3096 && !(defined SLJIT_CONFIG_ARM_32 && SLJIT_CONFIG_ARM_32)
3102 SLJIT_SKIP_CHECKS(compiler);
3113#if (defined SLJIT_32BIT_ARCHITECTURE && SLJIT_32BIT_ARCHITECTURE)
3114#define SLJIT_CPUINFO_PART1 " 32bit ("
3115#elif (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
3116#define SLJIT_CPUINFO_PART1 " 64bit ("
3118#error "Internal error: CPU type info missing"
3121#if (defined SLJIT_LITTLE_ENDIAN && SLJIT_LITTLE_ENDIAN)
3122#define SLJIT_CPUINFO_PART2 "little endian + "
3123#elif (defined SLJIT_BIG_ENDIAN && SLJIT_BIG_ENDIAN)
3124#define SLJIT_CPUINFO_PART2 "big endian + "
3126#error "Internal error: CPU type info missing"
3129#if (defined SLJIT_UNALIGNED && SLJIT_UNALIGNED)
3130#define SLJIT_CPUINFO_PART3 "unaligned)"
3132#define SLJIT_CPUINFO_PART3 "aligned)"
3135#define SLJIT_CPUINFO SLJIT_CPUINFO_PART1 SLJIT_CPUINFO_PART2 SLJIT_CPUINFO_PART3
3137#if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86)
3139#elif (defined SLJIT_CONFIG_ARM_V6 && SLJIT_CONFIG_ARM_V6)
3141#elif (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7)
3143#elif (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2)
3145#elif (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64)
3147#elif (defined SLJIT_CONFIG_PPC && SLJIT_CONFIG_PPC)
3149#elif (defined SLJIT_CONFIG_MIPS && SLJIT_CONFIG_MIPS)
3151#elif (defined SLJIT_CONFIG_RISCV && SLJIT_CONFIG_RISCV)
3153#elif (defined SLJIT_CONFIG_S390X && SLJIT_CONFIG_S390X)
3155#elif (defined SLJIT_CONFIG_LOONGARCH && SLJIT_CONFIG_LOONGARCH)
3163#if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
3172 SLJIT_SKIP_CHECKS(compiler);
3176#if !(defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) \
3177 && !((defined SLJIT_CONFIG_ARM_32 && SLJIT_CONFIG_ARM_32) && defined __SOFTFP__)
3184 SLJIT_SKIP_CHECKS(compiler);
3193 CHECK(check_sljit_emit_return(compiler, op, src, srcw));
3196 FAIL_IF(emit_mov_before_return(compiler, op, src, srcw));
3198 FAIL_IF(emit_fmov_before_return(compiler, op, src, srcw));
3201 SLJIT_SKIP_CHECKS(compiler);
3205#if !(defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86) \
3206 && !(defined SLJIT_CONFIG_S390X && SLJIT_CONFIG_S390X) \
3207 && !(defined(SLJIT_CONFIG_LOONGARCH_64) && SLJIT_CONFIG_LOONGARCH_64)
3215 CHECK(check_sljit_emit_fop2r(compiler, op, dst_freg, src1, src1w, src2, src2w));
3216 ADJUST_LOCAL_OFFSET(src1, src1w);
3217 ADJUST_LOCAL_OFFSET(src2, src2w);
3219 SLJIT_SKIP_CHECKS(compiler);
3220 return sljit_emit_fop2(compiler, op, dst_freg, 0, src1, src1w, src2, src2w);
3225#if !(defined SLJIT_CONFIG_MIPS && SLJIT_CONFIG_MIPS) \
3226 && !(defined SLJIT_CONFIG_RISCV && SLJIT_CONFIG_RISCV) \
3227 && !(defined SLJIT_CONFIG_LOONGARCH && SLJIT_CONFIG_LOONGARCH)
3238 CHECK_PTR(check_sljit_emit_cmp(compiler,
type, src1, src1w, src2, src2w));
3240 condition =
type & 0xff;
3241#if (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64)
3250 return emit_cmp_to0(compiler,
type, src1, src1w);
3256 switch (condition) {
3295 flags = (condition & 0xfe) << VARIABLE_FLAG_SHIFT;
3297 SLJIT_SKIP_CHECKS(compiler);
3301 SLJIT_SKIP_CHECKS(compiler);
3307#if (defined SLJIT_CONFIG_ARM_32 && SLJIT_CONFIG_ARM_32)
3327 CHECK_PTR(check_sljit_emit_fcmp(compiler,
type, src1, src1w, src2, src2w));
3329 SLJIT_SKIP_CHECKS(compiler);
3332 SLJIT_SKIP_CHECKS(compiler);
3336#if !(defined SLJIT_CONFIG_ARM && SLJIT_CONFIG_ARM) \
3337 && !(defined SLJIT_CONFIG_PPC && SLJIT_CONFIG_PPC)
3344 CHECK(check_sljit_emit_mem_update(compiler,
type, reg, mem, memw));
3355#if !(defined SLJIT_CONFIG_ARM_32 && SLJIT_CONFIG_ARM_32) \
3356 && !(defined SLJIT_CONFIG_MIPS && SLJIT_CONFIG_MIPS)
3363 CHECK(check_sljit_emit_fmem(compiler,
type, freg, mem, memw));
3365 return sljit_emit_fmem_unaligned(compiler,
type, freg, mem, memw);
3370#if !(defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64) \
3371 && !(defined SLJIT_CONFIG_PPC && SLJIT_CONFIG_PPC)
3378 CHECK(check_sljit_emit_fmem_update(compiler,
type, freg, mem, memw));
3389#if !(defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86) \
3390 && !(defined SLJIT_CONFIG_ARM && SLJIT_CONFIG_ARM) \
3391 && !(defined SLJIT_CONFIG_S390X && SLJIT_CONFIG_S390X) \
3392 && !(defined SLJIT_CONFIG_LOONGARCH && SLJIT_CONFIG_LOONGARCH)
3399 CHECK(check_sljit_emit_simd_mov(compiler,
type, freg, srcdst, srcdstw));
3414 CHECK(check_sljit_emit_simd_replicate(compiler,
type, freg, src, srcw));
3429 CHECK(check_sljit_emit_simd_lane_mov(compiler,
type, freg, lane_index, srcdst, srcdstw));
3445 CHECK(check_sljit_emit_simd_lane_replicate(compiler,
type, freg, src, src_lane_index));
3460 CHECK(check_sljit_emit_simd_extend(compiler,
type, freg, src, srcw));
3475 CHECK(check_sljit_emit_simd_sign(compiler,
type, freg, dst, dstw));
3489 CHECK(check_sljit_emit_simd_op2(compiler,
type, dst_freg, src1_freg, src2_freg));
3501#if !(defined(SLJIT_CONFIG_X86) && SLJIT_CONFIG_X86) \
3502 && !(defined(SLJIT_CONFIG_ARM) && SLJIT_CONFIG_ARM) \
3503 && !(defined(SLJIT_CONFIG_S390X) && SLJIT_CONFIG_S390X) \
3504 && !(defined(SLJIT_CONFIG_LOONGARCH) && SLJIT_CONFIG_LOONGARCH)
3517 CHECK(check_sljit_emit_atomic_load(compiler, op, dst_reg, mem_reg));
3535 CHECK(check_sljit_emit_atomic_store(compiler, op, src_reg, mem_reg, temp_reg));
3542#if !(defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86) \
3543 && !(defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64)
3548 CHECK(check_sljit_get_local_base(compiler, dst, dstw,
offset));
3552 SLJIT_SKIP_CHECKS(compiler);
fprintf($stream, string $format, mixed ... $values)
printf(string $format, mixed ... $values)
prev(array|object &$array)
zend_ffi_ctype_name_buf buf
PHP_JSON_API size_t int options
#define SLJIT_UNREACHABLE()
unsigned short int sljit_u16
signed short int sljit_s16
#define SLJIT_UNLIKELY(x)
#define SLJIT_ZEROMEM(dest, len)
#define SLJIT_API_FUNC_ATTRIBUTE
#define SLJIT_COMPILE_ASSERT(x, description)
#define SLJIT_F64_SECOND(reg)
#define SLJIT_MALLOC(size, allocator_data)
#define SLJIT_FREE(ptr, allocator_data)
#define SLJIT_UNUSED_ARG(arg)
#define SLJIT_TMP_REGISTER_BASE
#define SLJIT_TMP_FREGISTER_BASE
#define SLJIT_EXEC_OFFSET(ptr)
#define PTR_FAIL_IF_NULL(ptr)
#define PTR_FAIL_IF(expr)
#define SLJIT_CODE_TO_PTR(code)
#define CHECK_ERROR_PTR()
SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump * sljit_emit_jump(struct sljit_compiler *compiler, sljit_s32 type)
#define SLJIT_SKIP_FRAMES_BEFORE_FAST_RETURN
#define SLJIT_CALL_REG_ARG
#define SLJIT_ARG_TYPE_SCRATCH_REG
#define SLJIT_SIMD_OP2_AND
#define SLJIT_ORDERED_LESS_EQUAL
SLJIT_API_FUNC_ATTRIBUTE void sljit_free_code(void *code, void *exec_allocator_data)
#define SLJIT_FAST_RETURN
#define SLJIT_MEM_UNALIGNED
SLJIT_API_FUNC_ATTRIBUTE void * sljit_alloc_memory(struct sljit_compiler *compiler, sljit_s32 size)
SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_has_cpu_feature(sljit_s32 feature_type)
SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2u(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 src1, sljit_sw src1w, sljit_s32 src2, sljit_sw src2w)
SLJIT_API_FUNC_ATTRIBUTE void sljit_set_target(struct sljit_jump *jump, sljit_uw target)
#define SLJIT_ARG_TYPE_F32
SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_cmp_info(sljit_s32 type)
#define SLJIT_SIG_GREATER_EQUAL
#define SLJIT_RETURN_FREG
SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_local_base(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw, sljit_sw offset)
SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_atomic_load(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 dst_reg, sljit_s32 mem_reg)
#define SLJIT_ARG_TYPE_F64
#define SLJIT_SIMD_MEM_UNALIGNED
#define SLJIT_COPY32_FROM_F32
SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_replicate(struct sljit_compiler *compiler, sljit_s32 type, sljit_s32 freg, sljit_s32 src, sljit_sw srcw)
#define SLJIT_SIMD_EXTEND_SIGNED
SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_op2(struct sljit_compiler *compiler, sljit_s32 type, sljit_s32 dst_freg, sljit_s32 src1_freg, sljit_s32 src2_freg)
#define SLJIT_PREFETCH_L1
#define SLJIT_SIMD_OP2_XOR
#define SLJIT_COPYSIGN_F64
#define SLJIT_ERR_UNSUPPORTED
#define SLJIT_MEM_ALIGNED_16
SLJIT_API_FUNC_ATTRIBUTE void sljit_set_label(struct sljit_jump *jump, struct sljit_label *label)
SLJIT_API_FUNC_ATTRIBUTE void sljit_set_current_flags(struct sljit_compiler *compiler, sljit_s32 current_flags)
SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop2r(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 dst_freg, sljit_s32 src1, sljit_sw src1w, sljit_s32 src2, sljit_sw src2w)
#define SLJIT_SIG_LESS_EQUAL
SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_return_void(struct sljit_compiler *compiler)
SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_mem_update(struct sljit_compiler *compiler, sljit_s32 type, sljit_s32 reg, sljit_s32 mem, sljit_sw memw)
#define SLJIT_UNORDERED_OR_EQUAL
SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_lane_mov(struct sljit_compiler *compiler, sljit_s32 type, sljit_s32 freg, sljit_s32 lane_index, sljit_s32 srcdst, sljit_sw srcdstw)
#define SLJIT_ERR_ALLOC_FAILED
#define SLJIT_CALL_RETURN
SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop2(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 dst, sljit_sw dstw, sljit_s32 src1, sljit_sw src1w, sljit_s32 src2, sljit_sw src2w)
SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop1(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 dst, sljit_sw dstw, sljit_s32 src, sljit_sw srcw)
SLJIT_API_FUNC_ATTRIBUTE void sljit_compiler_verbose(struct sljit_compiler *compiler, FILE *verbose)
#define SLJIT_REWRITABLE_JUMP
SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_extend(struct sljit_compiler *compiler, sljit_s32 type, sljit_s32 freg, sljit_s32 src, sljit_sw srcw)
#define SLJIT_OP_SRC_DST_BASE
#define SLJIT_ARG_TYPE_32
#define SLJIT_CONV_SW_FROM_F64
SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump * sljit_emit_fcmp(struct sljit_compiler *compiler, sljit_s32 type, sljit_s32 src1, sljit_sw src1w, sljit_s32 src2, sljit_sw src2w)
#define SLJIT_ENTER_REG_ARG
SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_mov(struct sljit_compiler *compiler, sljit_s32 type, sljit_s32 freg, sljit_s32 srcdst, sljit_sw srcdstw)
#define SLJIT_GENERATE_CODE_BUFFER
#define SLJIT_SIG_GREATER
#define SLJIT_SIMD_LANE_ZERO
#define SLJIT_FLOAT_REGISTER
#define SLJIT_ATOMIC_STORED
#define SLJIT_GET_RETURN_ADDRESS
#define SLJIT_MEM_ALIGNED_32
SLJIT_API_FUNC_ATTRIBUTE void sljit_set_compiler_memory_error(struct sljit_compiler *compiler)
#define SLJIT_SHIFT_INTO_NON_ZERO
#define SLJIT_SIMD_LANE_SIGNED
#define SLJIT_GREATER_EQUAL
#define SLJIT_GP_REGISTER
#define SLJIT_SKIP_FRAMES_BEFORE_RETURN
#define SLJIT_OFFSETOF(base, member)
SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_atomic_store(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 src_reg, sljit_s32 mem_reg, sljit_s32 temp_reg)
#define SLJIT_CONV_F64_FROM_F32
#define SLJIT_COPY_TO_F64
#define SLJIT_COPY32_TO_F32
#define SLJIT_MAX_LOCAL_SIZE
#define SLJIT_ARG_TYPE_RET_VOID
SLJIT_API_FUNC_ATTRIBUTE struct sljit_compiler * sljit_create_compiler(void *allocator_data)
#define SLJIT_PREFETCH_ONCE
SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_sign(struct sljit_compiler *compiler, sljit_s32 type, sljit_s32 freg, sljit_s32 dst, sljit_sw dstw)
SLJIT_API_FUNC_ATTRIBUTE void sljit_free_compiler(struct sljit_compiler *compiler)
SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fmem(struct sljit_compiler *compiler, sljit_s32 type, sljit_s32 freg, sljit_s32 mem, sljit_sw memw)
SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_return(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 src, sljit_sw srcw)
#define SLJIT_ORDERED_NOT_EQUAL
SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 dst, sljit_sw dstw, sljit_s32 src1, sljit_sw src1w, sljit_s32 src2, sljit_sw src2w)
SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump * sljit_emit_cmp(struct sljit_compiler *compiler, sljit_s32 type, sljit_s32 src1, sljit_sw src1w, sljit_s32 src2, sljit_sw src2w)
#define SLJIT_COPY_FROM_F64
SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fmem_update(struct sljit_compiler *compiler, sljit_s32 type, sljit_s32 freg, sljit_s32 mem, sljit_sw memw)
SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op1(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 dst, sljit_sw dstw, sljit_s32 src, sljit_sw srcw)
SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_simd_lane_replicate(struct sljit_compiler *compiler, sljit_s32 type, sljit_s32 freg, sljit_s32 src, sljit_s32 src_lane_index)
struct sljit_jump * last_jump
struct sljit_const * consts
struct sljit_const * last_const
struct sljit_jump * jumps
struct sljit_label * last_label
struct sljit_memory_fragment * abuf
struct sljit_memory_fragment * buf
sljit_s32 logical_local_size
struct sljit_label * labels
struct sljit_const * next
sljit_sw executable_offset
struct sljit_label * next
union sljit_label::@034003116150245300057154161307153110213245130244 u
struct sljit_memory_fragment * next