29#if (defined SLJIT_CONFIG_RISCV_32 && SLJIT_CONFIG_RISCV_32)
30 return "RISC-V-32" SLJIT_CPUINFO;
32 return "RISC-V-64" SLJIT_CPUINFO;
40#define TMP_REG1 (SLJIT_NUMBER_OF_REGISTERS + 2)
41#define TMP_REG2 (SLJIT_NUMBER_OF_REGISTERS + 3)
42#define TMP_REG3 (SLJIT_NUMBER_OF_REGISTERS + 4)
46#define EQUAL_FLAG (SLJIT_NUMBER_OF_REGISTERS + 5)
47#define RETURN_ADDR_REG TMP_REG2
48#define OTHER_FLAG (SLJIT_NUMBER_OF_REGISTERS + 6)
50#define TMP_FREG1 (SLJIT_NUMBER_OF_FLOAT_REGISTERS + 1)
51#define TMP_FREG2 (SLJIT_NUMBER_OF_FLOAT_REGISTERS + 2)
53static const sljit_u8 reg_map[SLJIT_NUMBER_OF_REGISTERS + 7] = {
54 0, 10, 11, 12, 13, 14, 15, 16, 17, 29, 30, 31, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 9, 8, 2, 6, 1, 7, 5, 28
57static const sljit_u8 freg_map[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 3] = {
58 0, 10, 11, 12, 13, 14, 15, 16, 17, 2, 3, 4, 5, 6, 7, 28, 29, 30, 31, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 9, 8, 0, 1,
65#define RD(rd) ((sljit_ins)reg_map[rd] << 7)
66#define RS1(rs1) ((sljit_ins)reg_map[rs1] << 15)
67#define RS2(rs2) ((sljit_ins)reg_map[rs2] << 20)
68#define FRD(rd) ((sljit_ins)freg_map[rd] << 7)
69#define FRS1(rs1) ((sljit_ins)freg_map[rs1] << 15)
70#define FRS2(rs2) ((sljit_ins)freg_map[rs2] << 20)
71#define IMM_I(imm) ((sljit_ins)(imm) << 20)
72#define IMM_S(imm) ((((sljit_ins)(imm) & 0xfe0) << 20) | (((sljit_ins)(imm) & 0x1f) << 7))
75#define OPC(o) ((sljit_ins)(o))
76#define F3(f) ((sljit_ins)(f) << 12)
77#define F12(f) ((sljit_ins)(f) << 20)
78#define F7(f) ((sljit_ins)(f) << 25)
80#define ADD (F7(0x0) | F3(0x0) | OPC(0x33))
81#define ADDI (F3(0x0) | OPC(0x13))
82#define AND (F7(0x0) | F3(0x7) | OPC(0x33))
83#define ANDI (F3(0x7) | OPC(0x13))
84#define AUIPC (OPC(0x17))
85#define BEQ (F3(0x0) | OPC(0x63))
86#define BNE (F3(0x1) | OPC(0x63))
87#define BLT (F3(0x4) | OPC(0x63))
88#define BGE (F3(0x5) | OPC(0x63))
89#define BLTU (F3(0x6) | OPC(0x63))
90#define BGEU (F3(0x7) | OPC(0x63))
91#define DIV (F7(0x1) | F3(0x4) | OPC(0x33))
92#define DIVU (F7(0x1) | F3(0x5) | OPC(0x33))
93#define EBREAK (F12(0x1) | F3(0x0) | OPC(0x73))
94#define FADD_S (F7(0x0) | F3(0x7) | OPC(0x53))
95#define FDIV_S (F7(0xc) | F3(0x7) | OPC(0x53))
96#define FEQ_S (F7(0x50) | F3(0x2) | OPC(0x53))
97#define FLD (F3(0x3) | OPC(0x7))
98#define FLE_S (F7(0x50) | F3(0x0) | OPC(0x53))
99#define FLT_S (F7(0x50) | F3(0x1) | OPC(0x53))
101#define FCVT_S_D (F7(0x20) | OPC(0x53))
102#define FCVT_S_W (F7(0x68) | OPC(0x53))
103#define FCVT_S_WU (F7(0x68) | F12(0x1) | OPC(0x53))
104#define FCVT_W_S (F7(0x60) | F3(0x1) | OPC(0x53))
105#define FMUL_S (F7(0x8) | F3(0x7) | OPC(0x53))
106#define FMV_X_W (F7(0x70) | F3(0x0) | OPC(0x53))
107#define FMV_W_X (F7(0x78) | F3(0x0) | OPC(0x53))
108#define FSD (F3(0x3) | OPC(0x27))
109#define FSGNJ_S (F7(0x10) | F3(0x0) | OPC(0x53))
110#define FSGNJN_S (F7(0x10) | F3(0x1) | OPC(0x53))
111#define FSGNJX_S (F7(0x10) | F3(0x2) | OPC(0x53))
112#define FSUB_S (F7(0x4) | F3(0x7) | OPC(0x53))
113#define FSW (F3(0x2) | OPC(0x27))
114#define JAL (OPC(0x6f))
115#define JALR (F3(0x0) | OPC(0x67))
116#define LD (F3(0x3) | OPC(0x3))
117#define LUI (OPC(0x37))
118#define LW (F3(0x2) | OPC(0x3))
119#define MUL (F7(0x1) | F3(0x0) | OPC(0x33))
120#define MULH (F7(0x1) | F3(0x1) | OPC(0x33))
121#define MULHU (F7(0x1) | F3(0x3) | OPC(0x33))
122#define OR (F7(0x0) | F3(0x6) | OPC(0x33))
123#define ORI (F3(0x6) | OPC(0x13))
124#define REM (F7(0x1) | F3(0x6) | OPC(0x33))
125#define REMU (F7(0x1) | F3(0x7) | OPC(0x33))
126#define SD (F3(0x3) | OPC(0x23))
127#define SLL (F7(0x0) | F3(0x1) | OPC(0x33))
128#define SLLI (IMM_I(0x0) | F3(0x1) | OPC(0x13))
129#define SLT (F7(0x0) | F3(0x2) | OPC(0x33))
130#define SLTI (F3(0x2) | OPC(0x13))
131#define SLTU (F7(0x0) | F3(0x3) | OPC(0x33))
132#define SLTUI (F3(0x3) | OPC(0x13))
133#define SRL (F7(0x0) | F3(0x5) | OPC(0x33))
134#define SRLI (IMM_I(0x0) | F3(0x5) | OPC(0x13))
135#define SRA (F7(0x20) | F3(0x5) | OPC(0x33))
136#define SRAI (IMM_I(0x400) | F3(0x5) | OPC(0x13))
137#define SUB (F7(0x20) | F3(0x0) | OPC(0x33))
138#define SW (F3(0x2) | OPC(0x23))
139#define XOR (F7(0x0) | F3(0x4) | OPC(0x33))
140#define XORI (F3(0x4) | OPC(0x13))
142#define SIMM_MAX (0x7ff)
143#define SIMM_MIN (-0x800)
144#define BRANCH_MAX (0xfff)
145#define BRANCH_MIN (-0x1000)
146#define JUMP_MAX (0xfffff)
147#define JUMP_MIN (-0x100000)
149#if (defined SLJIT_CONFIG_RISCV_64 && SLJIT_CONFIG_RISCV_64)
150#define S32_MAX (0x7ffff7ffl)
151#define S32_MIN (-0x80000000l)
152#define S44_MAX (0x7fffffff7ffl)
153#define S52_MAX (0x7ffffffffffffl)
167 return push_inst(compiler, ins |
IMM_S(imm));
181 if (jump->flags & JUMP_ADDR)
182 target_addr = jump->u.target;
185 target_addr = (
sljit_uw)(code + jump->u.label->size) + (
sljit_uw)executable_offset;
190 if (jump->flags & IS_COND) {
191 diff += SSIZE_OF(ins);
195 inst[0] = (inst[0] & 0x1fff07f) ^ 0x1000;
196 jump->flags |= PATCH_B;
201 diff -= SSIZE_OF(ins);
205 if (jump->flags & IS_COND) {
206#if (defined SLJIT_CONFIG_RISCV_32 && SLJIT_CONFIG_RISCV_32)
213 jump->flags |= PATCH_J;
217#if (defined SLJIT_CONFIG_RISCV_64 && SLJIT_CONFIG_RISCV_64)
219 if (jump->flags & IS_COND)
222 jump->flags |= PATCH_REL32;
228 if (jump->flags & IS_COND)
231 jump->flags |= PATCH_ABS32;
236 if (target_addr <= S44_MAX) {
237 if (jump->flags & IS_COND)
240 jump->flags |= PATCH_ABS44;
246 if (jump->flags & IS_COND)
249 jump->flags |= PATCH_ABS52;
256#if (defined SLJIT_CONFIG_RISCV_32 && SLJIT_CONFIG_RISCV_32)
265#if (defined SLJIT_CONFIG_RISCV_64 && SLJIT_CONFIG_RISCV_64)
274 if (jump->flags & JUMP_ADDR)
275 addr = jump->u.target;
277 addr = (
sljit_uw)SLJIT_ADD_EXEC_OFFSET(code + jump->u.label->size, executable_offset);
283 jump->flags |= PATCH_REL32;
289 jump->flags |= PATCH_ABS32;
293 if (
addr <= S44_MAX) {
295 jump->flags |= PATCH_ABS44;
301 jump->flags |= PATCH_ABS52;
317#if (defined SLJIT_CONFIG_RISCV_64 && SLJIT_CONFIG_RISCV_64)
322#if (defined SLJIT_CONFIG_RISCV_64 && SLJIT_CONFIG_RISCV_64)
323 if (
flags & PATCH_REL32) {
324 addr -= (
sljit_uw)SLJIT_ADD_EXEC_OFFSET(ins, executable_offset);
328 if ((
addr & 0x800) != 0)
333 if (!(
flags & JUMP_MOV_ADDR)) {
335 ins[1] = (ins[1] & 0xfffff) |
IMM_I(
addr);
342 if ((
addr & 0x800) != 0)
345#if (defined SLJIT_CONFIG_RISCV_32 && SLJIT_CONFIG_RISCV_32)
349 if (
flags & PATCH_ABS32) {
352 }
else if (
flags & PATCH_ABS44) {
361 if ((high & 0x800) != 0)
373 if ((
addr & 0x80000000l) != 0)
376 if (
flags & PATCH_ABS52) {
380 if ((high & 0x800) != 0)
394 if (!(
flags & JUMP_MOV_ADDR)) {
396 ins[1] = (ins[1] & 0xfffff) |
IMM_I(
addr);
406 SLJIT_NEXT_DEFINE_TYPES;
412 jump = compiler->
jumps;
413 const_ = compiler->
consts;
414 SLJIT_NEXT_INIT_TYPES();
417 SLJIT_GET_NEXT_MIN();
419 if (next_min_addr == SLJIT_MAX_ADDRESS)
422 if (next_min_addr == next_label_size) {
423 label->
size -= size_reduce;
426 next_label_size = SLJIT_GET_NEXT_SIZE(label);
429 if (next_min_addr == next_const_addr) {
430 const_->
addr -= size_reduce;
431 const_ = const_->
next;
432 next_const_addr = SLJIT_GET_NEXT_ADDRESS(const_);
436 if (next_min_addr != next_jump_addr)
439 jump->addr -= size_reduce;
440 if (!(jump->flags & JUMP_MOV_ADDR)) {
441 total_size = JUMP_MAX_SIZE;
444 if (jump->flags & JUMP_ADDR) {
445#if (defined SLJIT_CONFIG_RISCV_64 && SLJIT_CONFIG_RISCV_64)
448 else if (jump->u.target <= S44_MAX)
450 else if (jump->u.target <=
S52_MAX)
457 if ((jump->flags & IS_COND) && (diff + 1) <= (
BRANCH_MAX / SSIZE_OF(ins)) && (diff + 1) >= (
BRANCH_MIN / SSIZE_OF(ins)))
459 else if (diff >= (
JUMP_MIN / SSIZE_OF(ins)) && diff <= (
JUMP_MAX / SSIZE_OF(ins)))
461#if (defined SLJIT_CONFIG_RISCV_64 && SLJIT_CONFIG_RISCV_64)
462 else if (diff >= (
S32_MIN / SSIZE_OF(ins)) && diff <= (
S32_MAX / SSIZE_OF(ins)))
468 size_reduce += JUMP_MAX_SIZE - total_size;
469 jump->flags |= total_size << JUMP_SIZE_SHIFT;
470#if (defined SLJIT_CONFIG_RISCV_64 && SLJIT_CONFIG_RISCV_64)
474 if (!(jump->flags & JUMP_ADDR)) {
478 if (diff >= (
S32_MIN / SSIZE_OF(ins)) && diff <= (
S32_MAX / SSIZE_OF(ins)))
480 }
else if (jump->u.target <
S32_MAX)
482 else if (jump->u.target < S44_MAX)
484 else if (jump->u.target <=
S52_MAX)
487 size_reduce += 5 - total_size;
488 jump->flags |= total_size << JUMP_SIZE_SHIFT;
493 next_jump_addr = SLJIT_GET_NEXT_ADDRESS(jump);
496 compiler->
size -= size_reduce;
507 SLJIT_NEXT_DEFINE_TYPES;
516 CHECK_PTR(check_sljit_generate_code(compiler));
518 reduce_code_size(compiler);
523 reverse_buf(compiler);
529 jump = compiler->
jumps;
530 const_ = compiler->
consts;
531 SLJIT_NEXT_INIT_TYPES();
532 SLJIT_GET_NEXT_MIN();
536 buf_end = buf_ptr + (
buf->used_size >> 2);
538 *code_ptr = *buf_ptr++;
539 if (next_min_addr == word_count) {
545 if (next_min_addr == next_label_size) {
546 label->
u.
addr = (
sljit_uw)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset);
549 next_label_size = SLJIT_GET_NEXT_SIZE(label);
552 if (next_min_addr == next_jump_addr) {
553 if (!(jump->flags & JUMP_MOV_ADDR)) {
554 word_count = word_count - 1 + (jump->flags >> JUMP_SIZE_SHIFT);
556 code_ptr = detect_jump_type(jump, code, executable_offset);
559#if (defined SLJIT_CONFIG_RISCV_32 && SLJIT_CONFIG_RISCV_32)
564 word_count += jump->flags >> JUMP_SIZE_SHIFT;
566 code_ptr += mov_addr_get_length(jump, code_ptr, code, executable_offset);
571 next_jump_addr = SLJIT_GET_NEXT_ADDRESS(jump);
572 }
else if (next_min_addr == next_const_addr) {
574 const_ = const_->
next;
575 next_const_addr = SLJIT_GET_NEXT_ADDRESS(const_);
578 SLJIT_GET_NEXT_MIN();
582 }
while (buf_ptr < buf_end);
587 if (label && label->
size == word_count) {
598 jump = compiler->
jumps;
601 if (!(jump->flags & (PATCH_B | PATCH_J)) || (jump->flags & JUMP_MOV_ADDR)) {
602 load_addr_to_reg(jump, executable_offset);
606 addr = (jump->flags & JUMP_ADDR) ? jump->u.target : jump->u.label->u.addr;
608 addr -= (
sljit_uw)SLJIT_ADD_EXEC_OFFSET(buf_ptr, executable_offset);
610 if (jump->flags & PATCH_B) {
612 addr = ((
addr & 0x800) >> 4) | ((
addr & 0x1e) << 7) | ((
addr & 0x7e0) << 20) | ((
addr & 0x1000) << 19);
618 addr = (
addr & 0xff000) | ((
addr & 0x800) << 9) | ((
addr & 0x7fe) << 20) | ((
addr & 0x100000) << 11);
629 code = (
sljit_ins *)SLJIT_ADD_EXEC_OFFSET(code, executable_offset);
630 code_ptr = (
sljit_ins *)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset);
639 switch (feature_type) {
641#ifdef SLJIT_IS_FPU_AVAILABLE
643#elif defined(__riscv_float_abi_soft)
650#if (defined SLJIT_CONFIG_RISCV_64 && SLJIT_CONFIG_RISCV_64)
679#define LOAD_DATA 0x01
680#define WORD_DATA 0x00
681#define BYTE_DATA 0x02
682#define HALF_DATA 0x04
684#define SIGNED_DATA 0x08
687#define DOUBLE_DATA 0x10
688#define SINGLE_DATA 0x12
692#define ARG_TEST 0x00020
693#define ALT_KEEP_CACHE 0x00040
694#define CUMULATIVE_OP 0x00080
695#define IMM_OP 0x00100
696#define MOVE_OP 0x00200
697#define SRC2_IMM 0x00400
699#define UNUSED_DEST 0x00800
700#define REG_DEST 0x01000
701#define REG1_SOURCE 0x02000
702#define REG2_SOURCE 0x04000
703#define SLOW_SRC1 0x08000
704#define SLOW_SRC2 0x10000
705#define SLOW_DEST 0x20000
706#define MEM_USE_TMP2 0x40000
708#if (defined SLJIT_CONFIG_RISCV_32 && SLJIT_CONFIG_RISCV_32)
709#define STACK_STORE SW
712#define STACK_STORE SD
716#if (defined SLJIT_CONFIG_RISCV_32 && SLJIT_CONFIG_RISCV_32)
722#define STACK_MAX_DISTANCE (-SIMM_MIN)
734 CHECK(check_sljit_emit_enter(compiler,
options, arg_types, scratches, saveds, fscratches, fsaveds, local_size));
735 set_emit_enter(compiler,
options, arg_types, scratches, saveds, fscratches, fsaveds, local_size);
737 local_size += GET_SAVED_REGISTERS_SIZE(scratches, saveds - saved_arg_count, 1);
738#if (defined SLJIT_CONFIG_RISCV_32 && SLJIT_CONFIG_RISCV_32)
740 if ((local_size & SSIZE_OF(sw)) != 0)
741 local_size += SSIZE_OF(sw);
742 local_size += GET_SAVED_FLOAT_REGISTERS_SIZE(fscratches, fsaveds, f64);
745 local_size += GET_SAVED_FLOAT_REGISTERS_SIZE(fscratches, fsaveds, f64);
753 offset = local_size - SSIZE_OF(sw);
767 for (i =
SLJIT_S0 - saved_arg_count; i > tmp; i--) {
777#if (defined SLJIT_CONFIG_RISCV_32 && SLJIT_CONFIG_RISCV_32)
779 if ((
offset & SSIZE_OF(sw)) != 0)
796 else if (local_size > 0)
806 while (arg_types > 0) {
821#undef STACK_MAX_DISTANCE
828 CHECK(check_sljit_set_context(compiler,
options, arg_types, scratches, saveds, fscratches, fsaveds, local_size));
829 set_set_context(compiler,
options, arg_types, scratches, saveds, fscratches, fsaveds, local_size);
831 local_size += GET_SAVED_REGISTERS_SIZE(scratches, saveds - SLJIT_KEPT_SAVEDS_COUNT(
options), 1);
832#if (defined SLJIT_CONFIG_RISCV_32 && SLJIT_CONFIG_RISCV_32)
834 if ((local_size & SSIZE_OF(sw)) != 0)
835 local_size += SSIZE_OF(sw);
836 local_size += GET_SAVED_FLOAT_REGISTERS_SIZE(fscratches, fsaveds, f64);
839 local_size += GET_SAVED_FLOAT_REGISTERS_SIZE(fscratches, fsaveds, f64);
846#define STACK_MAX_DISTANCE (-SIMM_MIN - 16)
867 offset = local_size - SSIZE_OF(sw);
872 for (i =
SLJIT_S0 - SLJIT_KEPT_SAVEDS_COUNT(compiler->
options); i > tmp; i--) {
882#if (defined SLJIT_CONFIG_RISCV_32 && SLJIT_CONFIG_RISCV_32)
884 if ((
offset & SSIZE_OF(sw)) != 0)
902#undef STACK_MAX_DISTANCE
907 CHECK(check_sljit_emit_return_void(compiler));
909 FAIL_IF(emit_stack_frame_release(compiler, 0));
917 CHECK(check_sljit_emit_return_to(compiler, src, srcw));
920 ADJUST_LOCAL_OFFSET(src, srcw);
930 FAIL_IF(emit_stack_frame_release(compiler, 1));
932 SLJIT_SKIP_CHECKS(compiler);
940#if (defined SLJIT_CONFIG_RISCV_32 && SLJIT_CONFIG_RISCV_32)
941#define ARCH_32_64(a, b) a
943#define ARCH_32_64(a, b) b
946static const sljit_ins data_transfer_insts[16 + 4] = {
949 F3(0x0) |
OPC(0x23) ,
951 F3(0x1) |
OPC(0x23) ,
953 F3(0x2) |
OPC(0x23) ,
958 F3(0x0) |
OPC(0x23) ,
960 F3(0x1) |
OPC(0x23) ,
962 F3(0x2) |
OPC(0x23) ,
965 F3(0x3) |
OPC(0x27) ,
967 F3(0x2) |
OPC(0x27) ,
985 return push_inst(compiler, ins);
993 if (!(
arg & OFFS_REG_MASK) && argw <= SIMM_MAX && argw >=
SIMM_MIN) {
1004#define TO_ARGW_HI(argw) (((argw) & ~0xfff) + (((argw) & 0x800) ? 0x1000 : 0))
1013 if (
arg & OFFS_REG_MASK) {
1016 if (argw && argw == next_argw && (
arg == next_arg || (
arg & OFFS_REG_MASK) == (next_arg & OFFS_REG_MASK)))
1021 if (
arg == next_arg) {
1048 if (argw == compiler->cache_argw) {
1049 if (
arg == compiler->cache_arg)
1052 if ((
SLJIT_MEM | (
arg & OFFS_REG_MASK)) == compiler->cache_arg) {
1053 if (
arg == next_arg && argw == (next_argw & 0x3)) {
1054 compiler->cache_arg =
arg;
1055 compiler->cache_argw = argw;
1060 return push_mem_inst(compiler,
flags, reg, tmp_r, 0);
1065 compiler->cache_arg =
SLJIT_MEM | (
arg & OFFS_REG_MASK);
1066 compiler->cache_argw = argw;
1070 if (
arg == next_arg && argw == (next_argw & 0x3)) {
1071 compiler->cache_arg =
arg;
1072 compiler->cache_argw = argw;
1078 return push_mem_inst(compiler,
flags, reg, tmp_r, 0);
1081 if (compiler->cache_arg ==
arg && argw - compiler->cache_argw <=
SIMM_MAX && argw - compiler->cache_argw >=
SIMM_MIN)
1082 return push_mem_inst(compiler,
flags, reg,
TMP_REG3, argw - compiler->cache_argw);
1084 if (compiler->cache_arg ==
SLJIT_MEM && (argw - compiler->cache_argw <=
SIMM_MAX) && (argw - compiler->cache_argw >=
SIMM_MIN)) {
1085 offset = argw - compiler->cache_argw;
1091 if (next_arg && next_argw - argw <= SIMM_MAX && next_argw - argw >=
SIMM_MIN && argw_hi !=
TO_ARGW_HI(next_argw)) {
1093 compiler->cache_argw = argw;
1097 compiler->cache_argw = argw_hi;
1106 if (
arg == next_arg && next_argw - argw <= SIMM_MAX && next_argw - argw >=
SIMM_MIN) {
1107 compiler->cache_arg =
arg;
1113 return push_mem_inst(compiler,
flags, reg, tmp_r,
offset);
1121 if (getput_arg_fast(compiler,
flags, reg,
arg, argw))
1122 return compiler->
error;
1145 return push_mem_inst(compiler,
flags, reg, tmp_r, argw & 0xfff);
1150 if (getput_arg_fast(compiler,
flags, reg,
arg1, arg1w))
1151 return compiler->
error;
1152 return getput_arg(compiler,
flags, reg,
arg1, arg1w,
arg2, arg2w);
1155#if (defined SLJIT_CONFIG_RISCV_32 && SLJIT_CONFIG_RISCV_32)
1158#define IMM_EXTEND(v) (IMM_I(v))
1162#define IMM_EXTEND(v) (IMM_I((op & SLJIT_32) ? (v) : (32 + (v))))
1168#if (defined SLJIT_CONFIG_RISCV_64 && SLJIT_CONFIG_RISCV_64)
1213#if (defined SLJIT_CONFIG_RISCV_64 && SLJIT_CONFIG_RISCV_64)
1254#if (defined SLJIT_CONFIG_RISCV_64 && SLJIT_CONFIG_RISCV_64)
1268#define EMIT_LOGICAL(op_imm, op_reg) \
1269 if (flags & SRC2_IMM) { \
1270 if (op & SLJIT_SET_Z) \
1271 FAIL_IF(push_inst(compiler, op_imm | RD(EQUAL_FLAG) | RS1(src1) | IMM_I(src2))); \
1272 if (!(flags & UNUSED_DEST)) \
1273 FAIL_IF(push_inst(compiler, op_imm | RD(dst) | RS1(src1) | IMM_I(src2))); \
1276 if (op & SLJIT_SET_Z) \
1277 FAIL_IF(push_inst(compiler, op_reg | RD(EQUAL_FLAG) | RS1(src1) | RS2(src2))); \
1278 if (!(flags & UNUSED_DEST)) \
1279 FAIL_IF(push_inst(compiler, op_reg | RD(dst) | RS1(src1) | RS2(src2))); \
1282#define EMIT_SHIFT(imm, reg) \
1289 sljit_s32 is_overflow, is_carry, carry_src_r, is_handled, reg;
1291#if (defined SLJIT_CONFIG_RISCV_64 && SLJIT_CONFIG_RISCV_64)
1301 return push_inst(compiler,
ADDI |
RD(dst) |
RS1(src2) |
IMM_I(0));
1307 return push_inst(compiler,
ANDI |
RD(dst) |
RS1(src2) |
IMM_I(0xff));
1338#if (defined SLJIT_CONFIG_RISCV_64 && SLJIT_CONFIG_RISCV_64)
1343 return push_inst(compiler,
SRLI |
RD(dst) |
RS1(dst) |
IMM_I(32));
1351 return push_inst(compiler,
ADDI | 0x8 |
RD(dst) |
RS1(src2) |
IMM_I(0));
1359 return emit_clz_ctz(compiler, op, dst, src2);
1363#if (defined SLJIT_CONFIG_RISCV_32 && SLJIT_CONFIG_RISCV_32)
1367 return emit_rev(compiler, op, dst, src2);
1372 return emit_rev16(compiler, op, dst, src2);
1374#if (defined SLJIT_CONFIG_RISCV_64 && SLJIT_CONFIG_RISCV_64)
1377 FAIL_IF(emit_rev(compiler, op, dst, src2));
1381 return push_inst(compiler,
SRLI |
RD(dst) |
RS1(dst) |
IMM_I(32));
1409 if (is_overflow || carry_src_r != 0) {
1412 else if (src2 != dst)
1426 if (is_overflow || carry_src_r != 0) {
1448 if (carry_src_r != 0) {
1451 else if (src2 != dst)
1463 if (carry_src_r != 0) {
1472 if (carry_src_r == 0)
1510 switch (GET_FLAG_TYPE(op)) {
1537 return push_inst(compiler,
SUB |
WORD |
RD(dst) |
RS1(src1) |
RS2(src2));
1555 if (is_overflow || is_carry)
1568 if (is_overflow || is_carry)
1621 return push_inst(compiler,
MUL |
WORD |
RD(dst) |
RS1(src1) |
RS2(src2));
1623#if (defined SLJIT_CONFIG_RISCV_64 && SLJIT_CONFIG_RISCV_64)
1633#if (defined SLJIT_CONFIG_RISCV_32 && SLJIT_CONFIG_RISCV_32)
1675#if (defined SLJIT_CONFIG_RISCV_64 && SLJIT_CONFIG_RISCV_64)
1676 src2 = ((op &
SLJIT_32) ? 32 : 64) - src2;
1709 return push_inst(compiler, op_imm |
WORD |
RD(dst) |
RS1(src1) |
IMM_I(src2));
1717 return push_inst(compiler, op_reg |
WORD |
RD(dst) |
RS1(src1) |
RS2(src2));
1737 compiler->cache_arg = 0;
1738 compiler->cache_argw = 0;
1746 else if (FAST_IS_REG(dst)) {
1750 src2_tmp_reg = dst_r;
1756 if (src2 ==
SLJIT_IMM && src2w != 0 && src2w <= SIMM_MAX && src2w >=
SIMM_MIN) {
1773 if (FAST_IS_REG(src1)) {
1792 if (FAST_IS_REG(src2)) {
1801 src2_r = src2_tmp_reg;
1813 if (getput_arg_fast(compiler,
flags |
LOAD_DATA, src2_tmp_reg, src2, src2w))
1817 src2_r = src2_tmp_reg;
1822 if ((
flags &
SLOW_DEST) && !can_cache(src2, src2w, src1, src1w) && can_cache(src2, src2w, dst, dstw)) {
1835 FAIL_IF(emit_single_op(compiler, op,
flags, dst_r, src1_r, src2_r));
1839 getput_arg_fast(compiler,
flags, dst_r, dst, dstw);
1840 return compiler->
error;
1842 return getput_arg(compiler,
flags, dst_r, dst, dstw, 0, 0);
1850#if (defined SLJIT_CONFIG_RISCV_64 && SLJIT_CONFIG_RISCV_64)
1857 CHECK(check_sljit_emit_op0(compiler, op));
1861 return push_inst(compiler,
EBREAK);
1899 CHECK(check_sljit_emit_op1(compiler, op, dst, dstw, src, srcw));
1900 ADJUST_LOCAL_OFFSET(dst, dstw);
1901 ADJUST_LOCAL_OFFSET(src, srcw);
1903#if (defined SLJIT_CONFIG_RISCV_64 && SLJIT_CONFIG_RISCV_64)
1910#if (defined SLJIT_CONFIG_RISCV_32 && SLJIT_CONFIG_RISCV_32)
1918#if (defined SLJIT_CONFIG_RISCV_64 && SLJIT_CONFIG_RISCV_64)
1943 return emit_op(compiler, op,
flags, dst, dstw,
TMP_ZERO, 0, src, srcw);
1966 CHECK(check_sljit_emit_op2(compiler, op, 0, dst, dstw, src1, src1w, src2, src2w));
1967 ADJUST_LOCAL_OFFSET(dst, dstw);
1968 ADJUST_LOCAL_OFFSET(src1, src1w);
1969 ADJUST_LOCAL_OFFSET(src2, src2w);
1971#if (defined SLJIT_CONFIG_RISCV_64 && SLJIT_CONFIG_RISCV_64)
1990 return emit_op(compiler, op,
flags |
IMM_OP, dst, dstw, src1, src1w, src2, src2w);
1993 compiler->status_flags_state = 0;
1994 return emit_op(compiler, op,
flags |
CUMULATIVE_OP, dst, dstw, src1, src1w, src2, src2w);
2010#if (defined SLJIT_CONFIG_RISCV_32 && SLJIT_CONFIG_RISCV_32)
2020 return emit_op(compiler, op,
flags |
IMM_OP, dst, dstw, src1, src1w, src2, src2w);
2032 CHECK(check_sljit_emit_op2(compiler, op, 1, 0, 0, src1, src1w, src2, src2w));
2034 SLJIT_SKIP_CHECKS(compiler);
2035 return sljit_emit_op2(compiler, op, 0, 0, src1, src1w, src2, src2w);
2043#if (defined SLJIT_CONFIG_RISCV_64 && SLJIT_CONFIG_RISCV_64)
2048 CHECK(check_sljit_emit_op2r(compiler, op, dst_reg, src1, src1w, src2, src2w));
2054 SLJIT_SKIP_CHECKS(compiler);
2070#if (defined SLJIT_CONFIG_RISCV_64 && SLJIT_CONFIG_RISCV_64)
2082 CHECK(check_sljit_emit_shift_into(compiler, op, dst_reg, src1_reg, src2_reg, src3, src3w));
2086 if (src1_reg == src2_reg) {
2087 SLJIT_SKIP_CHECKS(compiler);
2091 ADJUST_LOCAL_OFFSET(src3, src3w);
2094 src3w &= bit_length - 1;
2101 src3w = bit_length - src3w;
2105 src3w = bit_length - src3w;
2109 FAIL_IF(push_inst(compiler, ins1 |
RD(dst_reg) |
RS1(src1_reg)));
2117 }
else if (dst_reg == src3) {
2149 CHECK(check_sljit_emit_op_src(compiler, op, src, srcw));
2150 ADJUST_LOCAL_OFFSET(src, srcw);
2154 if (FAST_IS_REG(src))
2178 CHECK(check_sljit_emit_op_dst(compiler, op, dst, dstw));
2179 ADJUST_LOCAL_OFFSET(dst, dstw);
2183 if (FAST_IS_REG(dst))
2189 dst_r = FAST_IS_REG(dst) ? dst :
TMP_REG2;
2202 CHECK_REG_INDEX(check_sljit_get_register_index(
type, reg));
2205 return reg_map[reg];
2210 return freg_map[reg];
2219 CHECK(check_sljit_emit_op_custom(compiler, instruction,
size));
2221 return push_inst(compiler, *(
sljit_ins*)instruction);
2228#define FLOAT_DATA(op) (DOUBLE_DATA | ((op & SLJIT_32) >> 7))
2229#define FMT(op) ((sljit_ins)((op & SLJIT_32) ^ SLJIT_32) << 17)
2235#if (defined SLJIT_CONFIG_RISCV_32 && SLJIT_CONFIG_RISCV_32)
2236# define flags (sljit_u32)0
2251#if (defined SLJIT_CONFIG_RISCV_32 && SLJIT_CONFIG_RISCV_32)
2259#if (defined SLJIT_CONFIG_RISCV_32 && SLJIT_CONFIG_RISCV_32)
2271#if (defined SLJIT_CONFIG_RISCV_32 && SLJIT_CONFIG_RISCV_32)
2295#if (defined SLJIT_CONFIG_RISCV_32 && SLJIT_CONFIG_RISCV_32)
2308 return sljit_emit_fop1_conv_f64_from_w(compiler, ins, dst, dstw, src, srcw);
2317#if (defined SLJIT_CONFIG_RISCV_32 && SLJIT_CONFIG_RISCV_32)
2330 return sljit_emit_fop1_conv_f64_from_w(compiler, ins, dst, dstw, src, srcw);
2349 switch (GET_FLAG_TYPE(op)) {
2384 return push_inst(compiler, inst);
2394 compiler->cache_arg = 0;
2395 compiler->cache_argw = 0;
2398 SELECT_FOP1_OPERATION_WITH_CHECKS(compiler, op, dst, dstw, src, srcw);
2403 dst_r = FAST_IS_REG(dst) ? dst :
TMP_FREG1;
2433 return emit_op_mem2(compiler,
FLOAT_DATA(op), dst_r, dst, dstw, 0, 0);
2445 CHECK(check_sljit_emit_fop2(compiler, op, dst, dstw, src1, src1w, src2, src2w));
2446 ADJUST_LOCAL_OFFSET(dst, dstw);
2447 ADJUST_LOCAL_OFFSET(src1, src1w);
2448 ADJUST_LOCAL_OFFSET(src2, src2w);
2450 compiler->cache_arg = 0;
2451 compiler->cache_argw = 0;
2453 dst_r = FAST_IS_REG(dst) ? dst :
TMP_FREG2;
2472 if ((dst &
SLJIT_MEM) && !can_cache(src1, src1w, src2, src2w) && can_cache(src1, src1w, dst, dstw)) {
2526 CHECK(check_sljit_emit_fset32(compiler, freg,
value));
2546 CHECK_PTR(check_sljit_emit_label(compiler));
2553 set_label(label, compiler);
2557#if (defined SLJIT_CONFIG_RISCV_32 && SLJIT_CONFIG_RISCV_32)
2558#define BRANCH_LENGTH ((sljit_ins)(3 * sizeof(sljit_ins)) << 7)
2560#define BRANCH_LENGTH ((sljit_ins)(7 * sizeof(sljit_ins)) << 7)
2617 CHECK_PTR(check_sljit_emit_jump(compiler,
type));
2624 inst = get_jump_instruction(
type);
2628 jump->flags |= IS_COND;
2631 jump->addr = compiler->
size;
2635 jump->flags |= IS_CALL;
2642 compiler->
size += JUMP_MAX_SIZE - 1;
2651 CHECK_PTR(check_sljit_emit_call(compiler,
type, arg_types));
2654 PTR_FAIL_IF(emit_stack_frame_release(compiler, 0));
2658 SLJIT_SKIP_CHECKS(compiler);
2672 CHECK_PTR(check_sljit_emit_cmp(compiler,
type, src1, src1w, src2, src2w));
2673 ADJUST_LOCAL_OFFSET(src1, src1w);
2674 ADJUST_LOCAL_OFFSET(src2, src2w);
2676 compiler->cache_arg = 0;
2677 compiler->cache_argw = 0;
2678#if (defined SLJIT_CONFIG_RISCV_32 && SLJIT_CONFIG_RISCV_32)
2690 PTR_FAIL_IF(emit_op_mem2(compiler,
flags, src2_tmp_reg, src2, src2w, 0, 0));
2691 src2 = src2_tmp_reg;
2706 src2 = src2_tmp_reg;
2752 jump->addr = compiler->
size;
2756 compiler->
size += JUMP_MAX_SIZE - 1;
2767 CHECK(check_sljit_emit_ijump(compiler,
type, src, srcw));
2771 ADJUST_LOCAL_OFFSET(src, srcw);
2784 jump->addr = compiler->
size;
2788 compiler->
size += JUMP_MAX_SIZE - 1;
2798 CHECK(check_sljit_emit_icall(compiler,
type, arg_types, src, srcw));
2801 ADJUST_LOCAL_OFFSET(src, srcw);
2812 FAIL_IF(emit_stack_frame_release(compiler, 0));
2816 SLJIT_SKIP_CHECKS(compiler);
2826#if (defined SLJIT_CONFIG_RISCV_32 && SLJIT_CONFIG_RISCV_32)
2833 CHECK(check_sljit_emit_op_flags(compiler, op, dst, dstw,
type));
2834 ADJUST_LOCAL_OFFSET(dst, dstw);
2839 compiler->cache_arg = 0;
2840 compiler->cache_argw = 0;
2847 invert =
type & 0x1;
2893 return emit_op_mem(compiler, mem_type, src_r, dst, dstw);
2896 return push_inst(compiler,
ADDI |
RD(dst_r) |
RS1(src_r) |
IMM_I(0));
2903 return emit_op(compiler, saved_op, mem_type, dst, dstw,
TMP_REG1, 0, src_r, 0);
2904 return emit_op(compiler, saved_op, mem_type, dst, dstw, dst, dstw, src_r, 0);
2914#if (defined SLJIT_CONFIG_RISCV_64 && SLJIT_CONFIG_RISCV_64)
2924 CHECK(check_sljit_emit_select(compiler,
type, dst_reg, src1, src1w, src2_reg));
2926 ADJUST_LOCAL_OFFSET(src1, src1w);
2928 if (dst_reg != src2_reg) {
2929 if (dst_reg == src1) {
2934 if (ADDRESSING_DEPENDS_ON(src1, dst_reg)) {
2937 if ((src1 & REG_MASK) == dst_reg)
2938 src1 = (src1 & ~REG_MASK) |
TMP_REG1;
2940 if (OFFS_REG(src1) == dst_reg)
2941 src1 = (src1 & ~OFFS_REG_MASK) | TO_OFFS_REG(
TMP_REG1);
2955 FAIL_IF(emit_op_mem(compiler, inp_flags, dst_reg, src1, src1w));
2957#if (defined SLJIT_CONFIG_RISCV_64 && SLJIT_CONFIG_RISCV_64)
2981 CHECK(check_sljit_emit_fselect(compiler,
type, dst_freg, src1, src1w, src2_freg));
2983 ADJUST_LOCAL_OFFSET(src1, src1w);
2985 if (dst_freg != src2_freg) {
2986 if (dst_freg == src1) {
3020 CHECK(check_sljit_emit_mem(compiler,
type, reg, mem, memw));
3022 if (!(reg & REG_PAIR_MASK))
3023 return sljit_emit_mem_unaligned(compiler,
type, reg, mem, memw);
3037 if (((memw + 0x800) & 0xfff) <= 0xfff - SSIZE_OF(sw)) {
3058 return push_mem_inst(compiler,
WORD_DATA |
LOAD_DATA, REG_PAIR_FIRST(reg), mem, memw);
3063 FAIL_IF(push_mem_inst(compiler,
flags, REG_PAIR_FIRST(reg), mem, memw));
3064 return push_mem_inst(compiler,
flags, REG_PAIR_SECOND(reg), mem, (memw + SSIZE_OF(sw)) & 0xfff);
3075 CHECK_PTR(check_sljit_emit_const(compiler, dst, dstw, init_value));
3076 ADJUST_LOCAL_OFFSET(dst, dstw);
3080 set_const(const_, compiler);
3082 dst_r = FAST_IS_REG(dst) ? dst :
TMP_REG2;
3097 CHECK_PTR(check_sljit_emit_mov_addr(compiler, dst, dstw));
3098 ADJUST_LOCAL_OFFSET(dst, dstw);
3102 set_mov_addr(jump, compiler, 0);
3104 dst_r = FAST_IS_REG(dst) ? dst :
TMP_REG2;
3106#if (defined SLJIT_CONFIG_RISCV_32 && SLJIT_CONFIG_RISCV_32)
3107 compiler->
size += 1;
3109 compiler->
size += 5;
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_LOCALS_OFFSET
#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_ORDERED_LESS_EQUAL
#define SLJIT_CONV_F64_FROM_S32
#define SLJIT_FAST_RETURN
#define SLJIT_HAS_ZERO_REGISTER
#define SLJIT_FIRST_SAVED_REG
#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_PREFETCH_L1
#define SLJIT_COPYSIGN_F64
#define SLJIT_ORDERED_EQUAL
#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_CONV_SW_FROM_F64
#define SLJIT_CURRENT_FLAGS_ADD
#define SLJIT_ENTER_REG_ARG
#define SLJIT_SIG_GREATER
#define SLJIT_FLOAT_REGISTER
#define SLJIT_GET_RETURN_ADDRESS
#define SLJIT_FIRST_SAVED_FLOAT_REG
#define SLJIT_CONV_F64_FROM_SW
#define SLJIT_SHIFT_INTO_NON_ZERO
#define SLJIT_GREATER_EQUAL
#define SLJIT_GP_REGISTER
#define SLJIT_SKIP_FRAMES_BEFORE_RETURN
SLJIT_API_FUNC_ATTRIBUTE void sljit_set_jump_addr(sljit_uw addr, sljit_uw new_target, sljit_sw executable_offset)
#define SLJIT_ERR_COMPILED
#define SLJIT_HAS_COPY_F64
#define SLJIT_F_LESS_EQUAL
#define SLJIT_ORDERED_LESS
#define SLJIT_HAS_COPY_F32
#define SLJIT_CONV_F64_FROM_F32
#define SLJIT_PREFETCH_L2
#define SLJIT_CURRENT_FLAGS_SUB
#define SLJIT_PREFETCH_ONCE
#define SLJIT_ORDERED_NOT_EQUAL
#define SLJIT_CONV_F64_FROM_UW
#define SLJIT_UNORDERED_OR_GREATER_EQUAL
#define STACK_MAX_DISTANCE
#define SLJIT_IS_FPU_AVAILABLE
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_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 void sljit_set_const(sljit_uw addr, sljit_sw new_constant, sljit_sw executable_offset)
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)
#define EMIT_SHIFT(imm, reg)
#define EMIT_LOGICAL(op_imm, op_reg)
SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fset32(struct sljit_compiler *compiler, sljit_s32 freg, sljit_f32 value)
SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_return_void(struct sljit_compiler *compiler)
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 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_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_op_dst(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 dst, sljit_sw dstw)
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_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 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)
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_op1(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 dst, sljit_sw dstw, sljit_s32 src, sljit_sw srcw)
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)