29 return "ARM-64" SLJIT_CPUINFO;
37#define TMP_REG1 (SLJIT_NUMBER_OF_REGISTERS + 2)
38#define TMP_REG2 (SLJIT_NUMBER_OF_REGISTERS + 3)
39#define TMP_LR (SLJIT_NUMBER_OF_REGISTERS + 4)
40#define TMP_FP (SLJIT_NUMBER_OF_REGISTERS + 5)
42#define TMP_FREG1 (SLJIT_NUMBER_OF_FLOAT_REGISTERS + 1)
43#define TMP_FREG2 (SLJIT_NUMBER_OF_FLOAT_REGISTERS + 2)
46static const sljit_u8 reg_map[SLJIT_NUMBER_OF_REGISTERS + 8] = {
47 31, 0, 1, 2, 3, 4, 5, 6, 7, 11, 12, 13, 14, 15, 16, 17, 8, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 31, 9, 10, 30, 29
50static const sljit_u8 freg_map[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 3] = {
51 0, 0, 1, 2, 3, 4, 5, 6, 7, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 15, 14, 13, 12, 11, 10, 9, 8, 30, 31
54#define W_OP ((sljit_ins)1 << 31)
55#define RD(rd) ((sljit_ins)reg_map[rd])
56#define RT(rt) ((sljit_ins)reg_map[rt])
57#define RN(rn) ((sljit_ins)reg_map[rn] << 5)
58#define RT2(rt2) ((sljit_ins)reg_map[rt2] << 10)
59#define RM(rm) ((sljit_ins)reg_map[rm] << 16)
60#define VD(vd) ((sljit_ins)freg_map[vd])
61#define VT(vt) ((sljit_ins)freg_map[vt])
62#define VT2(vt) ((sljit_ins)freg_map[vt] << 10)
63#define VN(vn) ((sljit_ins)freg_map[vn] << 5)
64#define VM(vm) ((sljit_ins)freg_map[vm] << 16)
72#define ADDE 0x8b200000
73#define ADDI 0x91000000
75#define ADRP 0x90000000
77#define ANDI 0x92000000
78#define AND_v 0x0e201c00
79#define ASRV 0x9ac02800
81#define B_CC 0x54000000
87#define CASB 0x08a07c00
88#define CASH 0x48a07c00
90#define CCMPI 0xfa400800
92#define CSEL 0x9a800000
93#define CSINC 0x9a800400
94#define DUP_e 0x0e000400
95#define DUP_g 0x0e000c00
97#define EOR_v 0x2e201c00
98#define EORI 0xd2000000
99#define EXTR 0x93c00000
100#define FABS 0x1e60c000
101#define FADD 0x1e602800
102#define FCMP 0x1e602000
103#define FCSEL 0x1e600c00
104#define FCVT 0x1e224000
105#define FCVTL 0x0e217800
106#define FCVTZS 0x9e780000
107#define FDIV 0x1e601800
108#define FMOV 0x1e604000
109#define FMOV_R 0x9e660000
110#define FMOV_I 0x1e601000
111#define FMUL 0x1e600800
112#define FNEG 0x1e614000
113#define FSUB 0x1e603800
114#define INS 0x4e001c00
115#define INS_e 0x6e000400
116#define LD1 0x0c407000
117#define LD1_s 0x0d400000
118#define LD1R 0x0d40c000
119#define LDRI 0xf9400000
120#define LDRI_F64 0xfd400000
121#define LDRI_POST 0xf8400400
122#define LDP 0xa9400000
123#define LDP_F64 0x6d400000
124#define LDP_POST 0xa8c00000
125#define LDR_PRE 0xf8400c00
126#define LDXR 0xc85f7c00
127#define LDXRB 0x085f7c00
128#define LDXRH 0x485f7c00
129#define LSLV 0x9ac02000
130#define LSRV 0x9ac02400
131#define MADD 0x9b000000
132#define MOVI 0x0f000400
133#define MOVK 0xf2800000
134#define MOVN 0x92800000
135#define MOVZ 0xd2800000
136#define NOP 0xd503201f
137#define ORN 0xaa200000
138#define ORR 0xaa000000
139#define ORR_v 0x0ea01c00
140#define ORRI 0xb2000000
141#define RBIT 0xdac00000
142#define RET 0xd65f0000
143#define REV 0xdac00c00
144#define REV16 0xdac00400
145#define RORV 0x9ac02c00
146#define SBC 0xda000000
147#define SBFM 0x93400000
148#define SCVTF 0x9e620000
149#define SDIV 0x9ac00c00
150#define SMADDL 0x9b200000
151#define SMOV 0x0e002c00
152#define SMULH 0x9b403c00
153#define SSHLL 0x0f00a400
154#define ST1 0x0c007000
155#define ST1_s 0x0d000000
156#define STP 0xa9000000
157#define STP_F64 0x6d000000
158#define STP_PRE 0xa9800000
159#define STRB 0x38206800
160#define STRBI 0x39000000
161#define STRI 0xf9000000
162#define STRI_F64 0xfd000000
163#define STR_FI 0x3d000000
164#define STR_FR 0x3c206800
165#define STUR_FI 0x3c000000
166#define STURBI 0x38000000
167#define STXR 0xc8007c00
168#define STXRB 0x8007c00
169#define STXRH 0x48007c00
170#define SUB 0xcb000000
171#define SUBI 0xd1000000
172#define SUBS 0xeb000000
173#define TBZ 0x36000000
174#define UBFM 0xd3400000
175#define UCVTF 0x9e630000
176#define UDIV 0x9ac00800
177#define UMOV 0x0e003c00
178#define UMULH 0x9bc03c00
179#define USHLL 0x2f00a400
180#define USHR 0x2f000400
181#define USRA 0x2f001400
182#define XTN 0x0e212800
184#define CSET (CSINC | RM(TMP_ZERO) | RN(TMP_ZERO))
185#define LDR (STRI | (1 << 22))
186#define LDRB (STRBI | (1 << 22))
187#define LDRH (LDRB | (1 << 30))
188#define MOV (ORR | RN(TMP_ZERO))
204 return push_inst(compiler,
MOVK |
RD(dst) | ((
sljit_ins)(imm >> 48) << 5) | (3 << 21));
215 if (jump->flags & JUMP_ADDR)
216 target_addr = jump->u.target;
219 target_addr = (
sljit_uw)(code + jump->u.label->size) + (
sljit_uw)executable_offset;
224 if (jump->flags & IS_COND) {
225 diff += SSIZE_OF(ins);
226 if (diff <= 0xfffff && diff >= -0x100000) {
227 *(--code_ptr) ^= (jump->flags & IS_CBZ) ? (0x1 << 24) : 0x1;
228 jump->flags |= PATCH_COND;
232 diff -= SSIZE_OF(ins);
235 if (diff <= 0x7ffffff && diff >= -0x8000000) {
236 if (jump->flags & IS_COND)
237 code_ptr[-1] -= (4 << 5);
238 jump->flags |= PATCH_B;
242 if (target_addr < 0x100000000l) {
243 if (jump->flags & IS_COND)
244 code_ptr[-1] -= (2 << 5);
245 code_ptr[2] = code_ptr[0];
249 if (diff <= 0xfffff000l && diff >= -0x100000000l) {
250 if (jump->flags & IS_COND)
251 code_ptr[-1] -= (2 << 5);
252 jump->flags |= PATCH_B32;
253 code_ptr[2] = code_ptr[0];
257 if (target_addr < 0x1000000000000l) {
258 if (jump->flags & IS_COND)
259 code_ptr[-1] -= (1 << 5);
260 jump->flags |= PATCH_ABS48;
261 code_ptr[3] = code_ptr[0];
266 jump->flags |= PATCH_ABS64;
267 code_ptr[4] = code_ptr[0];
278 if (jump->flags & JUMP_ADDR)
279 addr = jump->u.target;
281 addr = (
sljit_uw)SLJIT_ADD_EXEC_OFFSET(code + jump->u.label->size, executable_offset);
285 if (diff <= 0xfffff && diff >= -0x100000) {
286 jump->flags |= PATCH_B;
290 if (diff <= 0xfffff000l && diff >= -0x100000000l) {
292 jump->flags |= PATCH_B32;
296 if (
addr < 0x100000000l) {
301 if (
addr < 0x1000000000000l) {
303 jump->flags |= PATCH_ABS48;
308 jump->flags |= PATCH_ABS64;
319 if (!(jump->flags & JUMP_MOV_ADDR)) {
320 if (jump->flags & PATCH_COND) {
321 addr = (
addr - (
sljit_sw)SLJIT_ADD_EXEC_OFFSET(buf_ptr, executable_offset)) >> 2;
327 if (jump->flags & PATCH_B) {
328 addr = (
addr - (
sljit_sw)SLJIT_ADD_EXEC_OFFSET(buf_ptr, executable_offset)) >> 2;
330 buf_ptr[0] = ((jump->flags & IS_BL) ?
BL :
B) | (
sljit_ins)(
addr & 0x3ffffff);
334 dst = (buf_ptr[0] >> 5) & 0x1f;
336 if (jump->flags & PATCH_B32) {
346 if (jump->flags & PATCH_B) {
347 addr -= (
sljit_sw)SLJIT_ADD_EXEC_OFFSET(buf_ptr, executable_offset);
353 if (jump->flags & PATCH_B32) {
367 if (jump->flags & (PATCH_ABS48 | PATCH_ABS64))
370 if (jump->flags & PATCH_ABS64)
379 SLJIT_NEXT_DEFINE_TYPES;
385 jump = compiler->
jumps;
386 const_ = compiler->
consts;
387 SLJIT_NEXT_INIT_TYPES();
390 SLJIT_GET_NEXT_MIN();
392 if (next_min_addr == SLJIT_MAX_ADDRESS)
395 if (next_min_addr == next_label_size) {
396 label->
size -= size_reduce;
399 next_label_size = SLJIT_GET_NEXT_SIZE(label);
402 if (next_min_addr == next_const_addr) {
403 const_->
addr -= size_reduce;
404 const_ = const_->
next;
405 next_const_addr = SLJIT_GET_NEXT_ADDRESS(const_);
409 if (next_min_addr != next_jump_addr)
412 jump->addr -= size_reduce;
413 if (!(jump->flags & JUMP_MOV_ADDR)) {
414 total_size = JUMP_MAX_SIZE;
417 if (jump->flags & JUMP_ADDR) {
418 if (jump->u.target < 0x100000000l)
420 else if (jump->u.target < 0x1000000000000l)
426 if ((jump->flags & IS_COND) && (diff + 1) <= (0xfffff / SSIZE_OF(ins)) && (diff + 1) >= (-0x100000 / SSIZE_OF(ins)))
428 else if (diff <= (0x7ffffff / SSIZE_OF(ins)) && diff >= (-0x8000000 / SSIZE_OF(ins)))
430 else if (diff <= (0xfffff000l / SSIZE_OF(ins)) && diff >= (-0x100000000l / SSIZE_OF(ins)))
435 size_reduce += JUMP_MAX_SIZE - total_size;
440 if (!(jump->flags & JUMP_ADDR)) {
443 if (diff <= (0xfffff / SSIZE_OF(ins)) && diff >= (-0x100000 / SSIZE_OF(ins)))
445 else if (diff <= (0xfffff000l / SSIZE_OF(ins)) && diff >= (-0x100000000l / SSIZE_OF(ins)))
447 }
else if (jump->u.target < 0x100000000l)
449 else if (jump->u.target < 0x1000000000000l)
452 size_reduce += 3 - total_size;
455 jump->flags |= total_size << JUMP_SIZE_SHIFT;
457 next_jump_addr = SLJIT_GET_NEXT_ADDRESS(jump);
460 compiler->
size -= size_reduce;
471 SLJIT_NEXT_DEFINE_TYPES;
480 CHECK_PTR(check_sljit_generate_code(compiler));
482 reduce_code_size(compiler);
487 reverse_buf(compiler);
493 jump = compiler->
jumps;
494 const_ = compiler->
consts;
495 SLJIT_NEXT_INIT_TYPES();
496 SLJIT_GET_NEXT_MIN();
500 buf_end = buf_ptr + (
buf->used_size >> 2);
502 *code_ptr = *buf_ptr++;
503 if (next_min_addr == word_count) {
509 if (next_min_addr == next_label_size) {
510 label->
u.
addr = (
sljit_uw)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset);
513 next_label_size = SLJIT_GET_NEXT_SIZE(label);
516 if (next_min_addr == next_jump_addr) {
517 if (!(jump->flags & JUMP_MOV_ADDR)) {
518 word_count = word_count - 1 + (jump->flags >> JUMP_SIZE_SHIFT);
520 code_ptr = detect_jump_type(jump, code_ptr, code, executable_offset);
523 word_count += jump->flags >> JUMP_SIZE_SHIFT;
525 code_ptr += mov_addr_get_length(jump, code_ptr, code, executable_offset);
530 next_jump_addr = SLJIT_GET_NEXT_ADDRESS(jump);
531 }
else if (next_min_addr == next_const_addr) {
533 const_ = const_->
next;
534 next_const_addr = SLJIT_GET_NEXT_ADDRESS(const_);
537 SLJIT_GET_NEXT_MIN();
541 }
while (buf_ptr < buf_end);
546 if (label && label->
size == word_count) {
547 label->
u.
addr = (
sljit_uw)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset);
557 jump = compiler->
jumps;
559 generate_jump_or_mov_addr(jump, executable_offset);
567 code = (
sljit_ins *)SLJIT_ADD_EXEC_OFFSET(code, executable_offset);
568 code_ptr = (
sljit_ins *)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset);
577 switch (feature_type) {
580#ifdef SLJIT_IS_FPU_AVAILABLE
618#define COUNT_TRAILING_ZERO(value, result) \
620 if (!(value & 0xffffffff)) { \
624 if (!(value & 0xffff)) { \
628 if (!(value & 0xff)) { \
632 if (!(value & 0xf)) { \
636 if (!(value & 0x3)) { \
640 if (!(value & 0x1)) { \
645#define LOGICAL_IMM_CHECK (sljit_ins)0x100
656 if (
len == 32 && (imm == 0 || imm == -1))
673 if ((uimm & mask) != ((uimm >>
len) & mask))
704 ins = (0x3f - ((
len << 1) - 1)) << 10;
707 return ins | ((
len - ones - 1) << 10) | ((
len - ones -
right) << 16);
709 return ins | ((ones - 1) << 10) | ((
len -
right) << 16);
712#undef COUNT_TRAILING_ZERO
724 if (simm < 0 && simm >= -0x10000)
725 return push_inst(compiler,
MOVN |
RD(dst) | (((
sljit_ins)~imm & 0xffff) << 5));
727 if (imm <= 0xffffffffl) {
728 if ((imm & 0xffff) == 0)
729 return push_inst(compiler,
MOVZ |
RD(dst) | ((
sljit_ins)(imm >> 16) << 5) | (1 << 21));
730 if ((imm & 0xffff0000l) == 0xffff0000)
732 if ((imm & 0xffff) == 0xffff)
733 return push_inst(compiler, (
MOVN ^
W_OP) |
RD(dst) | (((
sljit_ins)~imm & 0xffff0000u) >> (16 - 5)) | (1 << 21));
735 bitmask = logical_imm(simm, 16);
740 return push_inst(compiler,
MOVK |
RD(dst) | (((
sljit_ins)imm & 0xffff0000u) >> (16 - 5)) | (1 << 21));
743 bitmask = logical_imm(simm, 32);
747 if (simm < 0 && simm >= -0x100000000l) {
748 if ((imm & 0xffff) == 0xffff)
749 return push_inst(compiler,
MOVN |
RD(dst) | (((
sljit_ins)~imm & 0xffff0000u) >> (16 - 5)) | (1 << 21));
752 return push_inst(compiler,
MOVK |
RD(dst) | (((
sljit_ins)imm & 0xffff0000u) >> (16 - 5)) | (1 << 21));
759 for (i = 4; i > 0; i--) {
760 if ((simm & 0xffff) == 0)
762 if ((simm & 0xffff) == 0xffff)
771 for (i = 0; i < 4; i++) {
772 if (!(simm & 0xffff)) {
787 for (i = 0; i < 4; i++) {
788 if (!(simm & 0xffff)) {
803#define ARG1_IMM 0x0010000
804#define ARG2_IMM 0x0020000
805#define INT_OP 0x0040000
806#define SET_FLAGS 0x0080000
807#define UNUSED_RETURN 0x0100000
809#define CHECK_FLAGS(flag_bits) \
810 if (flags & SET_FLAGS) { \
811 inv_bits |= flag_bits; \
812 if (flags & UNUSED_RETURN) \
859 return load_immediate(compiler, dst, imm);
874 if (imm > 0 && imm <= 0xfff) {
876 return push_inst(compiler, (
ADDI ^ inv_bits) |
RD(dst) |
RN(reg) | ((
sljit_ins)imm << 10));
879 if (nimm > 0 && nimm <= 0xfff) {
881 return push_inst(compiler, (
SUBI ^ inv_bits) |
RD(dst) |
RN(reg) | ((
sljit_ins)nimm << 10));
883 if (imm > 0 && imm <= 0xffffff && !(imm & 0xfff)) {
885 return push_inst(compiler, (
ADDI ^ inv_bits) |
RD(dst) |
RN(reg) | (((
sljit_ins)imm >> 12) << 10) | (1 << 22));
887 if (nimm > 0 && nimm <= 0xffffff && !(nimm & 0xfff)) {
889 return push_inst(compiler, (
SUBI ^ inv_bits) |
RD(dst) |
RN(reg) | (((
sljit_ins)nimm >> 12) << 10) | (1 << 22));
893 return push_inst(compiler, (
ADDI ^ inv_bits) |
RD(dst) |
RN(dst) | (((
sljit_ins)imm & 0xfff) << 10));
897 return push_inst(compiler, (
SUBI ^ inv_bits) |
RD(dst) |
RN(dst) | (((
sljit_ins)nimm & 0xfff) << 10));
905 return push_inst(compiler, (
ANDI ^ inv_bits) |
RD(dst) |
RN(reg) | inst_bits);
920 FAIL_IF(push_inst(compiler, (inst_bits ^ inv_bits) |
RD(dst) |
RN(reg)));
935 inv_bits |= inv_bits >> 9;
945 inv_bits |= inv_bits >> 9;
951 inst_bits = ((
sljit_ins)imm << 16) | (31 << 10);
999 return push_inst(compiler,
MOV |
RD(dst) |
RM(
arg2));
1002 inv_bits |= inv_bits >> 9;
1003 return push_inst(compiler, (
UBFM ^ inv_bits) |
RD(dst) |
RN(
arg2) | (7 << 10));
1006 inv_bits |= inv_bits >> 9;
1007 return push_inst(compiler, (
SBFM ^ inv_bits) |
RD(dst) |
RN(
arg2) | (7 << 10));
1010 inv_bits |= inv_bits >> 9;
1011 return push_inst(compiler, (
UBFM ^ inv_bits) |
RD(dst) |
RN(
arg2) | (15 << 10));
1014 inv_bits |= inv_bits >> 9;
1015 return push_inst(compiler, (
SBFM ^ inv_bits) |
RD(dst) |
RN(
arg2) | (15 << 10));
1026 return push_inst(compiler,
SBFM | (1 << 22) |
RD(dst) |
RN(
arg2) | (31 << 10));
1029 return push_inst(compiler, (
CLZ ^ inv_bits) |
RD(dst) |
RN(
arg2));
1033 return push_inst(compiler, (
CLZ ^ inv_bits) |
RD(dst) |
RN(dst));
1036 inv_bits |= inv_bits >> 21;
1037 return push_inst(compiler, (
REV ^ inv_bits) |
RD(dst) |
RN(
arg2));
1044 inv_bits |= inv_bits >> 9;
1052 return push_inst(compiler,
SBFM | (1 << 22) |
RD(dst) |
RN(dst) | (31 << 10));
1070 compiler->status_flags_state = 0;
1109 compiler->status_flags_state = 0;
1125#define BYTE_SIZE 0x0
1126#define HALF_SIZE 0x1
1128#define WORD_SIZE 0x3
1130#define MEM_SIZE_SHIFT(flags) ((sljit_ins)(flags) & 0x3)
1146 if (argw == 0 || argw == shift)
1147 return push_inst(compiler,
STRB |
type |
RT(reg)
1148 |
RN(
arg & REG_MASK) |
RM(OFFS_REG(
arg)) | (argw ? (1 << 12) : 0));
1151 return push_inst(compiler,
STRBI |
type |
RT(reg) |
RN(tmp_reg));
1157 FAIL_IF(load_immediate(compiler, tmp_reg, argw & ~(0xfff << shift)));
1159 argw = (argw >> shift) & 0xfff;
1164 if ((argw & ((1 << shift) - 1)) == 0) {
1166 if ((argw >> shift) <= 0xfff)
1169 if (argw <= 0xffffff) {
1172 argw = ((argw & 0xfff) >> shift);
1175 }
else if (argw < -256 && argw >= -0xfff000) {
1177 argw = ((0x1000 + argw) & 0xfff) >> shift;
1182 if (argw <= 0xff && argw >= -0x100)
1185 if (((argw + 0x100) & 0xfff) <= 0x1ff && argw <= 0xfff0ff && argw >= -0xfff100) {
1193 if (!(argw & 0x100))
1201 FAIL_IF(load_immediate(compiler, tmp_reg, argw));
1219 CHECK(check_sljit_emit_enter(compiler,
options, arg_types, scratches, saveds, fscratches, fsaveds, local_size));
1220 set_emit_enter(compiler,
options, arg_types, scratches, saveds, fscratches, fsaveds, local_size);
1222 saved_regs_size = GET_SAVED_REGISTERS_SIZE(scratches, saveds - saved_arg_count, 2);
1223 saved_regs_size += GET_SAVED_FLOAT_REGISTERS_SIZE(fscratches, fsaveds, f64);
1225 local_size = (local_size + saved_regs_size + 0xf) & ~0xf;
1228 if (local_size <= 512) {
1231 offs = (
sljit_ins)(local_size - 2 * SSIZE_OF(sw)) << (15 - 3);
1234 saved_regs_size = ((saved_regs_size - 2 * SSIZE_OF(sw)) + 0xf) & ~0xf;
1237 offs = (
sljit_ins)(saved_regs_size - 2 * SSIZE_OF(sw)) << (15 - 3);
1238 local_size -= saved_regs_size;
1245 for (i =
SLJIT_S0 - saved_arg_count; i > tmp; i--) {
1296 if (local_size > 4096)
1302 saved_arg_count = 0;
1318 if (local_size > 4096) {
1319 if (local_size < 4 * 4096) {
1322 if (local_size >= 2 * 4096) {
1323 if (local_size >= 3 * 4096) {
1340 local_size &= 0xfff;
1348 if (local_size > 0) {
1349 if (local_size <= 512)
1353 if (local_size >= 4096)
1354 local_size = (1 << (22 - 10));
1364 if (local_size != 0) {
1365 if (local_size > 0xfff) {
1367 local_size &= 0xfff;
1370 if (local_size > 512 || local_size == 0) {
1371 if (local_size != 0)
1392 CHECK(check_sljit_set_context(compiler,
options, arg_types, scratches, saveds, fscratches, fsaveds, local_size));
1393 set_set_context(compiler,
options, arg_types, scratches, saveds, fscratches, fsaveds, local_size);
1395 saved_regs_size = GET_SAVED_REGISTERS_SIZE(scratches, saveds - SLJIT_KEPT_SAVEDS_COUNT(
options), 2);
1396 saved_regs_size += GET_SAVED_FLOAT_REGISTERS_SIZE(fscratches, fsaveds, f64);
1398 compiler->
local_size = (local_size + saved_regs_size + 0xf) & ~0xf;
1409 if (!is_return_to) {
1410 if (local_size > 512 && local_size <= 512 + 496) {
1417 if (local_size > 512 && local_size <= 512 + 248) {
1424 if (local_size > 512) {
1426 if (local_size > 0xfff) {
1428 | (((
sljit_ins)local_size >> 12) << 10) | (1 << 22)));
1429 local_size &= 0xfff;
1436 offs = (
sljit_ins)(local_size - 2 * SSIZE_OF(sw)) << (15 - 3);
1440 for (i =
SLJIT_S0 - SLJIT_KEPT_SAVEDS_COUNT(compiler->
options); i > tmp; i--) {
1496 CHECK(check_sljit_emit_return_void(compiler));
1498 FAIL_IF(emit_stack_frame_release(compiler, 0));
1507 CHECK(check_sljit_emit_return_to(compiler, src, srcw));
1510 ADJUST_LOCAL_OFFSET(src, srcw);
1520 FAIL_IF(emit_stack_frame_release(compiler, 1));
1522 SLJIT_SKIP_CHECKS(compiler);
1535 CHECK(check_sljit_emit_op0(compiler, op));
1540 return push_inst(compiler,
BRK);
1542 return push_inst(compiler,
NOP);
1573 CHECK(check_sljit_emit_op1(compiler, op, dst, dstw, src, srcw));
1574 ADJUST_LOCAL_OFFSET(dst, dstw);
1575 ADJUST_LOCAL_OFFSET(src, srcw);
1577 dst_r = FAST_IS_REG(dst) ? dst :
TMP_REG1;
1582 if (FAST_IS_REG(dst) && FAST_IS_REG(src))
1632 FAIL_IF(emit_op_mem(compiler, mem_flags, dst_r, src, srcw,
TMP_REG2));
1635 return emit_op_mem(compiler, mem_flags |
STORE, dst_r, dst, dstw,
TMP_REG2);
1668 return emit_op_mem(compiler, mem_flags |
STORE, dst_r, dst, dstw,
TMP_REG2);
1680 CHECK(check_sljit_emit_op2(compiler, op, 0, dst, dstw, src1, src1w, src2, src2w));
1681 ADJUST_LOCAL_OFFSET(dst, dstw);
1682 ADJUST_LOCAL_OFFSET(src1, src1w);
1683 ADJUST_LOCAL_OFFSET(src2, src2w);
1685 dst_r = FAST_IS_REG(dst) ? dst :
TMP_REG1;
1720 return emit_op_mem(compiler, mem_flags |
STORE, dst_r, dst, dstw,
TMP_REG2);
1729 CHECK(check_sljit_emit_op2(compiler, op, 1, 0, 0, src1, src1w, src2, src2w));
1731 SLJIT_SKIP_CHECKS(compiler);
1741 CHECK(check_sljit_emit_op2r(compiler, op, dst_reg, src1, src1w, src2, src2w));
1745 SLJIT_SKIP_CHECKS(compiler);
1746 return sljit_emit_op2(compiler, op, dst_reg, 0, src1, src1w, src2, src2w);
1763 CHECK(check_sljit_emit_shift_into(compiler, op, dst_reg, src1_reg, src2_reg, src3, src3w));
1767 if (src1_reg == src2_reg) {
1768 SLJIT_SKIP_CHECKS(compiler);
1772 ADJUST_LOCAL_OFFSET(src3, src3w);
1777 mask = inv_bits ? 0x1f : 0x3f;
1784 src3w = (src3w ^ mask) + 1;
1786 return push_inst(compiler, (
EXTR ^ (inv_bits | (inv_bits >> 9))) |
RD(dst_reg)
1787 |
RN(is_left ? src1_reg : src2_reg) |
RM(is_left ? src2_reg : src1_reg) | ((
sljit_ins)src3w << 10));
1793 }
else if (dst_reg == src3) {
1798 FAIL_IF(push_inst(compiler, ((is_left ?
LSLV :
LSRV) ^ inv_bits) |
RD(dst_reg) |
RN(src1_reg) |
RM(src3)));
1803 imm = (
sljit_ins)(inv_bits ? ((1 << 16) | (31 << 10)) : ((1 << 16) | (63 << 10) | (1 << 22)));
1805 imm = (
sljit_ins)(inv_bits ? ((31 << 16) | (30 << 10)) : ((63 << 16) | (62 << 10) | (1 << 22)));
1810 imm = (
sljit_ins)(inv_bits ? (4 << 10) : ((5 << 10) | (1 << 22)));
1818 return push_inst(compiler, (
ORR ^ inv_bits) |
RD(dst_reg) |
RN(dst_reg) |
RM(
TMP_REG1));
1825 CHECK(check_sljit_emit_op_src(compiler, op, src, srcw));
1826 ADJUST_LOCAL_OFFSET(src, srcw);
1830 if (FAST_IS_REG(src))
1842 SLJIT_ASSERT(reg_map[1] == 0 && reg_map[3] == 2 && reg_map[5] == 4);
1867 CHECK(check_sljit_emit_op_dst(compiler, op, dst, dstw));
1868 ADJUST_LOCAL_OFFSET(dst, dstw);
1872 if (FAST_IS_REG(dst))
1876 dst_r = FAST_IS_REG(dst) ? dst :
TMP_REG1;
1889 CHECK_REG_INDEX(check_sljit_get_register_index(
type, reg));
1892 return reg_map[reg];
1897 return freg_map[reg];
1905 CHECK(check_sljit_emit_op_custom(compiler, instruction,
size));
1907 return push_inst(compiler, *(
sljit_ins*)instruction);
1924 if (
arg & OFFS_REG_MASK) {
1926 if (argw == 0 || argw == shift)
1928 |
RN(
arg & REG_MASK) |
RM(OFFS_REG(
arg)) | (argw ? (1 << 12) : 0));
1937 FAIL_IF(load_immediate(compiler,
TMP_REG2, argw & ~(0xfff << shift)));
1939 argw = (argw >> shift) & 0xfff;
1944 if (argw >= 0 && (argw & ((1 << shift) - 1)) == 0) {
1945 if ((argw >> shift) <= 0xfff)
1948 if (argw <= 0xffffff) {
1951 argw = ((argw & 0xfff) >> shift);
1956 if (argw <= 255 && argw >= -256)
1999 FAIL_IF(push_inst(compiler, ins |
VD(dst_r) |
RN(src)));
2019 return sljit_emit_fop1_conv_f64_from_w(compiler,
SCVTF ^ inv_bits, dst, dstw, src, srcw);
2035 return sljit_emit_fop1_conv_f64_from_w(compiler,
UCVTF ^ inv_bits, dst, dstw, src, srcw);
2055 FAIL_IF(push_inst(compiler, (
FCMP ^ inv_bits) |
VN(src1) |
VM(src2)));
2061 return push_inst(compiler,
CCMPI | (0x0 << 16) | (0x7 << 12) |
RN(
TMP_REG1) | 0x4);
2074 SELECT_FOP1_OPERATION_WITH_CHECKS(compiler, op, dst, dstw, src, srcw);
2076 inv_bits = (op &
SLJIT_32) ? (1 << 22) : 0;
2077 dst_r = FAST_IS_REG(dst) ? dst :
TMP_FREG1;
2088 FAIL_IF(push_inst(compiler, (
FMOV ^ inv_bits) |
VD(dst_r) |
VN(src)));
2094 FAIL_IF(push_inst(compiler, (
FNEG ^ inv_bits) |
VD(dst_r) |
VN(src)));
2097 FAIL_IF(push_inst(compiler, (
FABS ^ inv_bits) |
VD(dst_r) |
VN(src)));
2105 return emit_fop_mem(compiler, mem_flags |
STORE, dst_r, dst, dstw);
2118 CHECK(check_sljit_emit_fop2(compiler, op, dst, dstw, src1, src1w, src2, src2w));
2119 ADJUST_LOCAL_OFFSET(dst, dstw);
2120 ADJUST_LOCAL_OFFSET(src1, src1w);
2121 ADJUST_LOCAL_OFFSET(src2, src2w);
2123 dst_r = FAST_IS_REG(dst) ? dst :
TMP_FREG1;
2135 FAIL_IF(push_inst(compiler, (
FADD ^ inv_bits) |
VD(dst_r) |
VN(src1) |
VM(src2)));
2138 FAIL_IF(push_inst(compiler, (
FSUB ^ inv_bits) |
VD(dst_r) |
VN(src1) |
VM(src2)));
2141 FAIL_IF(push_inst(compiler, (
FMUL ^ inv_bits) |
VD(dst_r) |
VN(src1) |
VM(src2)));
2144 FAIL_IF(push_inst(compiler, (
FDIV ^ inv_bits) |
VD(dst_r) |
VN(src1) |
VM(src2)));
2148 FAIL_IF(push_inst(compiler, (
FABS ^ inv_bits) |
VD(dst_r) |
VN(src1)));
2150 return push_inst(compiler, (
FNEG ^ inv_bits) |
VD(dst_r) |
VN(dst_r));
2155 return emit_fop_mem(compiler, mem_flags |
STORE,
TMP_FREG1, dst, dstw);
2168 CHECK(check_sljit_emit_fset32(compiler, freg,
value));
2175 if ((
u.imm << (32 - 19)) == 0) {
2176 exp = (
u.imm >> (23 + 2)) & 0x3f;
2178 if (
exp == 0x20 ||
exp == 0x1f)
2179 return push_inst(compiler, (
FMOV_I ^ (1 << 22)) | (
sljit_ins)((((
u.imm >> 24) & 0x80) | ((
u.imm >> 19) & 0x7f)) << 13) |
VD(freg));
2196 CHECK(check_sljit_emit_fset64(compiler, freg,
value));
2203 if ((
u.imm << (64 - 48)) == 0) {
2204 exp = (
u.imm >> (52 + 2)) & 0x1ff;
2206 if (
exp == 0x100 ||
exp == 0xff)
2207 return push_inst(compiler,
FMOV_I | (
sljit_ins)((((
u.imm >> 56) & 0x80) | ((
u.imm >> 48) & 0x7f)) << 13) |
VD(freg));
2220 CHECK(check_sljit_emit_fcopy(compiler, op, freg, reg));
2223 inst =
FMOV_R |
RN(reg) |
VD(freg) | (1 << 16);
2228 inst ^=
W_OP | (1 << 22);
2230 return push_inst(compiler, inst);
2331 CHECK_PTR(check_sljit_emit_label(compiler));
2338 set_label(label, compiler);
2347 CHECK_PTR(check_sljit_emit_jump(compiler,
type));
2355 jump->flags |= IS_COND;
2358 jump->flags |= IS_BL;
2360 jump->addr = compiler->
size;
2364 compiler->
size += JUMP_MAX_SIZE - 1;
2373 CHECK_PTR(check_sljit_emit_call(compiler,
type, arg_types));
2376 PTR_FAIL_IF(emit_stack_frame_release(compiler, 0));
2380 SLJIT_SKIP_CHECKS(compiler);
2391 ADJUST_LOCAL_OFFSET(src, srcw);
2396 jump->flags |= IS_CBZ | IS_COND;
2410 inv_bits |= 1 << 24;
2413 jump->addr = compiler->
size;
2417 compiler->
size += JUMP_MAX_SIZE - 1;
2426 CHECK(check_sljit_emit_ijump(compiler,
type, src, srcw));
2430 ADJUST_LOCAL_OFFSET(src, srcw);
2443 jump->addr = compiler->
size;
2445 compiler->
size += JUMP_MAX_SIZE - 1;
2455 CHECK(check_sljit_emit_icall(compiler,
type, arg_types, src, srcw));
2458 ADJUST_LOCAL_OFFSET(src, srcw);
2469 FAIL_IF(emit_stack_frame_release(compiler, 0));
2473 SLJIT_SKIP_CHECKS(compiler);
2485 CHECK(check_sljit_emit_op_flags(compiler, op, dst, dstw,
type));
2486 ADJUST_LOCAL_OFFSET(dst, dstw);
2488 cc = get_cc(compiler,
type);
2489 dst_r = FAST_IS_REG(dst) ? dst :
TMP_REG1;
2534 CHECK(check_sljit_emit_select(compiler,
type, dst_reg, src1, src1w, src2_reg));
2536 ADJUST_LOCAL_OFFSET(src1, src1w);
2549 return push_inst(compiler, (
CSEL ^ inv_bits) | (cc << 12) |
RD(dst_reg) |
RN(src2_reg) |
RM(src1));
2561 CHECK(check_sljit_emit_fselect(compiler,
type, dst_freg, src1, src1w, src2_freg));
2563 ADJUST_LOCAL_OFFSET(src1, src1w);
2571 return push_inst(compiler, (
FCSEL ^ inv_bits) | (cc << 12) |
VD(dst_freg) |
VN(src2_freg) |
VM(src1));
2581 CHECK(check_sljit_emit_mem(compiler,
type, reg, mem, memw));
2583 if (!(reg & REG_PAIR_MASK))
2584 return sljit_emit_mem_unaligned(compiler,
type, reg, mem, memw);
2586 ADJUST_LOCAL_OFFSET(mem, memw);
2588 if (!(mem & REG_MASK)) {
2593 }
else if (mem & OFFS_REG_MASK) {
2598 }
else if ((memw & 0x7) != 0 || memw > 0x1f8 || memw < -0x200) {
2605 }
else if ((memw & 0x7) == 0 && memw <= 0x7ff0) {
2608 return push_inst(compiler,
LDRI |
RD(REG_PAIR_FIRST(reg)) |
RN(mem & REG_MASK) | ((
sljit_ins)(memw + 0x8) << 7));
2613 FAIL_IF(push_inst(compiler, inst |
RD(REG_PAIR_FIRST(reg)) |
RN(mem & REG_MASK) | ((
sljit_ins)memw << 7)));
2614 return push_inst(compiler, inst |
RD(REG_PAIR_SECOND(reg)) |
RN(mem & REG_MASK) | ((
sljit_ins)(memw + 0x8) << 7));
2620 }
else if ((
sljit_uw)memw <= 0xffffff) {
2623 if ((memw & 0xe07) != 0) {
2641 SLJIT_ASSERT((memw & 0x7) == 0 && memw <= 0x1f8 && memw >= -0x200);
2652 CHECK(check_sljit_emit_mem_update(compiler,
type, reg, mem, memw));
2654 if ((mem & OFFS_REG_MASK) || (memw > 255 || memw < -256))
2660 switch (
type & 0xff) {
2691 inst |=
sign ? 0x00800000 : 0x00400000;
2696 return push_inst(compiler, inst |
RT(reg) |
RN(mem & REG_MASK) | (
sljit_ins)((memw & 0x1ff) << 12));
2706 CHECK(check_sljit_emit_fmem_update(compiler,
type, freg, mem, memw));
2708 if ((mem & OFFS_REG_MASK) || (memw > 255 || memw < -256))
2725 return push_inst(compiler, inst |
VT(freg) |
RN(mem & REG_MASK) | (
sljit_ins)((memw & 0x1ff) << 12));
2738 if (!(mem & REG_MASK)) {
2740 return load_immediate(compiler,
TMP_REG2, memw);
2752 if (memw < -0xffffff || memw > 0xffffff) {
2786 CHECK(check_sljit_emit_simd_mov(compiler,
type, freg, srcdst, srcdstw));
2788 ADJUST_LOCAL_OFFSET(srcdst, srcdstw);
2790 if (reg_size != 3 && reg_size != 4)
2801 ins =
VD(srcdst) |
VN(freg) |
VM(freg);
2803 ins =
VD(freg) |
VN(srcdst) |
VM(srcdst);
2808 return push_inst(compiler,
ORR_v | ins);
2811 FAIL_IF(sljit_emit_simd_mem_offset(compiler, &srcdst, srcdstw));
2821 return push_inst(compiler, ins | ((
sljit_ins)elem_size << 10) |
RN(srcdst) |
VT(freg));
2843 switch (elem_size) {
2853 if (
value <= 0xff) {
2858 if ((
value & 0xff) == 0) {
2876 if (
value <= 0xff) {
2934 CHECK(check_sljit_emit_simd_replicate(compiler,
type, freg, src, srcw));
2936 ADJUST_LOCAL_OFFSET(src, srcw);
2938 if (reg_size != 3 && reg_size != 4)
2948 FAIL_IF(sljit_emit_simd_mem_offset(compiler, &src, srcw));
2955 return push_inst(compiler,
LD1R | ins |
RN(src) |
VT(freg));
2965 return push_inst(compiler,
MOVI | (ins & ((
sljit_ins)1 << 30)) |
VD(freg));
2967 return push_inst(compiler,
DUP_e | ins |
VD(freg) |
VN(src));
2974 imm = simd_get_imm(elem_size, (
sljit_uw)srcw);
2979 return push_inst(compiler,
MOVI | imm |
VD(freg));
2986 return push_inst(compiler,
DUP_g | ins |
VD(freg) |
RN(src));
2998 CHECK(check_sljit_emit_simd_lane_mov(compiler,
type, freg, lane_index, srcdst, srcdstw));
3000 ADJUST_LOCAL_OFFSET(srcdst, srcdstw);
3002 if (reg_size != 3 && reg_size != 4)
3012 ins = (reg_size == 3) ? 0 : ((
sljit_ins)1 << 30);
3024 FAIL_IF(sljit_emit_simd_mem_offset(compiler, &srcdst, srcdstw));
3028 else if (elem_size == 0)
3033 lane_index = lane_index << elem_size;
3034 ins |= (
sljit_ins)(((lane_index & 0x8) << 27) | ((lane_index & 0x7) << 10));
3043 ins =
INS_e | ((((
sljit_ins)lane_index << 1) | 1) << (16 + elem_size)) |
VD(freg) |
VN(srcdst);
3045 return push_inst(compiler, ins);
3057 ins =
RD(srcdst) |
VN(freg);
3067 ins =
INS |
VD(freg) |
RN(srcdst);
3072 return push_inst(compiler, ins | ((((
sljit_ins)lane_index << 1) | 1) << (16 + elem_size)));
3084 CHECK(check_sljit_emit_simd_lane_replicate(compiler,
type, freg, src, src_lane_index));
3086 if (reg_size != 3 && reg_size != 4)
3095 ins = (((
sljit_ins)src_lane_index << 1) | 1) << (16 + elem_size);
3100 return push_inst(compiler,
DUP_e | ins |
VD(freg) |
VN(src));
3112 CHECK(check_sljit_emit_simd_extend(compiler,
type, freg, src, srcw));
3114 ADJUST_LOCAL_OFFSET(src, srcw);
3116 if (reg_size != 3 && reg_size != 4)
3126 FAIL_IF(sljit_emit_simd_mem_offset(compiler, &src, srcw));
3128 if (reg_size == 4 && elem2_size - elem_size == 1)
3137 return push_inst(compiler,
FCVTL | (1 << 22) |
VD(freg) |
VN(src));
3142 | ((
sljit_ins)1 << (19 + elem_size)) |
VD(freg) |
VN(src)));
3144 }
while (++elem_size < elem2_size);
3159 CHECK(check_sljit_emit_simd_sign(compiler,
type, freg, dst, dstw));
3161 ADJUST_LOCAL_OFFSET(dst, dstw);
3163 if (reg_size != 3 && reg_size != 4)
3172 switch (elem_size) {
3175 ins =
USHR | (0x9 << 16);
3178 imms = (reg_size == 4) ? 0x643219 : 0x6231;
3179 ins =
USHR | (0x11 << 16);
3182 imms = (reg_size == 4) ? 0x6231 : 0x61;
3183 ins =
USHR | (0x21 << 16);
3187 ins =
USHR | (0x41 << 16);
3196 if (reg_size == 4 && elem_size > 0)
3199 if (imms >= 0x100) {
3200 ins = (reg_size == 4 && elem_size == 0) ? (1 << 30) : 0;
3205 }
while (imms >= 0x100);
3210 dst_r = FAST_IS_REG(dst) ? dst :
TMP_REG2;
3213 if (reg_size == 4 && elem_size == 0) {
3234 CHECK(check_sljit_emit_simd_op2(compiler,
type, dst_freg, src1_freg, src2_freg));
3236 if (reg_size != 3 && reg_size != 4)
3242 switch (SLJIT_SIMD_GET_OPCODE(
type)) {
3260 return push_inst(compiler, ins |
VD(dst_freg) |
VN(src1_freg) |
VM(src2_freg));
3270 CHECK(check_sljit_emit_atomic_load(compiler, op, dst_reg, mem_reg));
3272#ifdef __ARM_FEATURE_ATOMICS
3276 ins =
LDR ^ (1 << 30);
3292 ins =
LDXR ^ (1 << 30);
3305 return push_inst(compiler, ins |
RN(mem_reg) |
RT(dst_reg));
3319 CHECK(check_sljit_emit_atomic_store(compiler, op, src_reg, mem_reg, temp_reg));
3321#ifdef __ARM_FEATURE_ATOMICS
3328 ins =
CAS ^ (1 << 30);
3348 FAIL_IF(push_inst(compiler, ins |
RM(tmp) |
RN(mem_reg) |
RD(src_reg)));
3352 FAIL_IF(push_inst(compiler, cmp |
RM(tmp) |
RN(temp_reg)));
3354 return push_inst(compiler, cmp |
RM(tmp) |
RN(
TMP_ZERO));
3365 ins =
STXR ^ (1 << 30);
3389 CHECK(check_sljit_get_local_base(compiler, dst, dstw,
offset));
3392 dst_reg = FAST_IS_REG(dst) ? dst :
TMP_REG1;
3429 CHECK_PTR(check_sljit_emit_const(compiler, dst, dstw, init_value));
3430 ADJUST_LOCAL_OFFSET(dst, dstw);
3434 set_const(const_, compiler);
3436 dst_r = FAST_IS_REG(dst) ? dst :
TMP_REG1;
3450 CHECK_PTR(check_sljit_emit_mov_addr(compiler, dst, dstw));
3451 ADJUST_LOCAL_OFFSET(dst, dstw);
3453 dst_r = FAST_IS_REG(dst) ? dst :
TMP_REG1;
3458 set_mov_addr(jump, compiler, 1);
3460 compiler->
size += 3;
3476 dst = inst[0] & 0x1f;
3478 inst[0] =
MOVZ | dst | (((
sljit_u32)new_target & 0xffff) << 5);
3479 inst[1] =
MOVK | dst | (((
sljit_u32)(new_target >> 16) & 0xffff) << 5) | (1 << 21);
3480 inst[2] =
MOVK | dst | (((
sljit_u32)(new_target >> 32) & 0xffff) << 5) | (2 << 21);
3481 inst[3] =
MOVK | dst | ((
sljit_u32)(new_target >> 48) << 5) | (3 << 21);
3484 inst = (
sljit_ins *)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset);
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_API_FUNC_ATTRIBUTE
#define SLJIT_COMPILE_ASSERT(x, description)
#define SLJIT_UNUSED_ARG(arg)
#define SLJIT_CACHE_FLUSH(from, to)
#define SLJIT_UPDATE_WX_FLAGS(from, to, enable_exec)
#define PTR_FAIL_IF(expr)
#define PTR_FAIL_WITH_EXEC_IF(ptr)
#define CHECK_ERROR_PTR()
#define SLJIT_UNORDERED_OR_LESS_EQUAL
#define SLJIT_SKIP_FRAMES_BEFORE_FAST_RETURN
#define SLJIT_ARG_TYPE_SCRATCH_REG
#define SLJIT_SIMD_OP2_AND
#define SLJIT_ORDERED_LESS_EQUAL
#define SLJIT_CONV_F64_FROM_S32
#define SLJIT_CONV_S32_FROM_F64
#define SLJIT_FAST_RETURN
#define SLJIT_SIMD_REG_64
#define SLJIT_ATOMIC_NOT_STORED
#define SLJIT_FIRST_SAVED_REG
#define SLJIT_CONV_F64_FROM_U32
#define SLJIT_UNORDERED_OR_GREATER
#define SLJIT_ORDERED_GREATER_EQUAL
#define SLJIT_PREFETCH_L3
#define SLJIT_SIG_GREATER_EQUAL
#define SLJIT_UNORDERED_OR_NOT_EQUAL
#define SLJIT_ARG_TYPE_F64
#define SLJIT_SIMD_EXTEND_SIGNED
#define SLJIT_PREFETCH_L1
#define SLJIT_SIMD_OP2_XOR
#define SLJIT_COPYSIGN_F64
#define SLJIT_ORDERED_EQUAL
#define SLJIT_ERR_UNSUPPORTED
#define SLJIT_UNORDERED_OR_LESS
#define SLJIT_ORDERED_GREATER
#define SLJIT_SIG_LESS_EQUAL
#define SLJIT_UNORDERED_OR_EQUAL
#define SLJIT_CALL_RETURN
#define SLJIT_REWRITABLE_JUMP
#define SLJIT_NOT_OVERFLOW
#define SLJIT_F_NOT_EQUAL
#define SLJIT_F_GREATER_EQUAL
#define SLJIT_CURRENT_FLAGS_ADD
#define SLJIT_HAS_PREFETCH
#define SLJIT_ENTER_REG_ARG
#define SLJIT_SIG_GREATER
#define SLJIT_SIMD_LANE_ZERO
#define SLJIT_FLOAT_REGISTER
#define SLJIT_ATOMIC_STORED
#define SLJIT_GET_RETURN_ADDRESS
#define SLJIT_FIRST_SAVED_FLOAT_REG
#define SLJIT_SIMD_OP2_OR
#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_ERR_COMPILED
#define SLJIT_HAS_COPY_F64
#define SLJIT_SIMD_REG_128
#define SLJIT_F_LESS_EQUAL
#define SLJIT_ORDERED_LESS
#define SLJIT_HAS_COPY_F32
#define SLJIT_CONV_F64_FROM_F32
#define SLJIT_COPY_TO_F64
#define SLJIT_PREFETCH_L2
#define SLJIT_SET_ATOMIC_STORED
#define SLJIT_CURRENT_FLAGS_SUB
#define SLJIT_PREFETCH_ONCE
#define SLJIT_ORDERED_NOT_EQUAL
#define SLJIT_UNORDERED_OR_GREATER_EQUAL
SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_flags(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 dst, sljit_sw dstw, sljit_s32 type)
SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump * sljit_emit_jump(struct sljit_compiler *compiler, sljit_s32 type)
SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump * sljit_emit_call(struct sljit_compiler *compiler, sljit_s32 type, sljit_s32 arg_types)
SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2r(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 dst_reg, sljit_s32 src1, sljit_sw src1w, sljit_s32 src2, sljit_sw src2w)
SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_select(struct sljit_compiler *compiler, sljit_s32 type, sljit_s32 dst_reg, sljit_s32 src1, sljit_sw src1w, sljit_s32 src2_reg)
SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_mem(struct sljit_compiler *compiler, sljit_s32 type, sljit_s32 reg, sljit_s32 mem, sljit_sw memw)
SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_return_to(struct sljit_compiler *compiler, sljit_s32 src, sljit_sw srcw)
SLJIT_API_FUNC_ATTRIBUTE const char * sljit_get_platform_name(void)
SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_has_cpu_feature(sljit_s32 feature_type)
SLJIT_API_FUNC_ATTRIBUTE void * sljit_generate_code(struct sljit_compiler *compiler, sljit_s32 options, void *exec_allocator_data)
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 sljit_s32 sljit_cmp_info(sljit_s32 type)
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)
SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_register_index(sljit_s32 type, sljit_s32 reg)
SLJIT_API_FUNC_ATTRIBUTE struct sljit_const * sljit_emit_const(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw, sljit_sw init_value)
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)
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)
SLJIT_API_FUNC_ATTRIBUTE void sljit_set_const(sljit_uw addr, sljit_sw new_constant, sljit_sw executable_offset)
#define CHECK_FLAGS(flag_bits)
SLJIT_API_FUNC_ATTRIBUTE struct sljit_label * sljit_emit_label(struct sljit_compiler *compiler)
SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_ijump(struct sljit_compiler *compiler, sljit_s32 type, sljit_s32 src, sljit_sw srcw)
SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fset32(struct sljit_compiler *compiler, sljit_s32 freg, sljit_f32 value)
#define COUNT_TRAILING_ZERO(value, result)
SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fcopy(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 freg, sljit_s32 reg)
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)
SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_set_context(struct sljit_compiler *compiler, sljit_s32 options, sljit_s32 arg_types, sljit_s32 scratches, sljit_s32 saveds, sljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size)
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)
SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump * sljit_emit_mov_addr(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw)
SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op0(struct sljit_compiler *compiler, sljit_s32 op)
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 sljit_s32 sljit_emit_shift_into(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 dst_reg, sljit_s32 src1_reg, sljit_s32 src2_reg, sljit_s32 src3, sljit_sw src3w)
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)
SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_enter(struct sljit_compiler *compiler, sljit_s32 options, sljit_s32 arg_types, sljit_s32 scratches, sljit_s32 saveds, sljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size)
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 LOGICAL_IMM_CHECK
SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fset64(struct sljit_compiler *compiler, sljit_s32 freg, sljit_f64 value)
SLJIT_API_FUNC_ATTRIBUTE void sljit_set_jump_addr(sljit_uw addr, sljit_uw new_target, sljit_sw executable_offset)
SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_dst(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 dst, sljit_sw dstw)
#define MEM_SIZE_SHIFT(flags)
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)
SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fselect(struct sljit_compiler *compiler, sljit_s32 type, sljit_s32 dst_freg, sljit_s32 src1, sljit_sw src1w, sljit_s32 src2_freg)
SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_src(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 src, sljit_sw srcw)
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 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 sljit_s32 sljit_emit_op_custom(struct sljit_compiler *compiler, void *instruction, sljit_u32 size)
SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_icall(struct sljit_compiler *compiler, sljit_s32 type, sljit_s32 arg_types, sljit_s32 src, sljit_sw srcw)
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)
#define SLJIT_IS_FPU_AVAILABLE
struct sljit_const * consts
sljit_sw executable_offset
struct sljit_jump * jumps
struct sljit_label * last_label
struct sljit_memory_fragment * buf
struct sljit_label * labels
struct sljit_const * next
struct sljit_label * next
union sljit_label::@034003116150245300057154161307153110213245130244 u
exit(string|int $status=0)