29 return "PowerPC" SLJIT_CPUINFO;
36#if ((defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) && (defined _AIX)) \
37 || (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
38#define SLJIT_PPC_STACK_FRAME_V2 1
45#if (defined _CALL_ELF && _CALL_ELF == 2)
46#define SLJIT_PASS_ENTRY_ADDR_TO_CALL 1
49#if (defined SLJIT_CACHE_FLUSH_OWN_IMPL && SLJIT_CACHE_FLUSH_OWN_IMPL)
54 _sync_cache_range((caddr_t)from, (
int)((
size_t)to - (
size_t)from));
55#elif defined(__GNUC__) || (defined(__IBM_GCC_ASM) && __IBM_GCC_ASM)
56# if defined(_ARCH_PWR) || defined(_ARCH_PWR2)
66 __asm__
volatile (
"ics" );
67# elif defined(_ARCH_COM) && !defined(_ARCH_PPC)
68# error "Cache flush is not implemented for PowerPC/POWER common mode."
80 __asm__
volatile (
"isync" );
83# warning "This file may fail to compile if -qfuncsect is used"
86#error "Please enable GCC syntax for inline assembly statements with -qasm=gcc"
88#error "This platform requires a cache flush implementation."
94#define TMP_REG1 (SLJIT_NUMBER_OF_REGISTERS + 2)
95#define TMP_REG2 (SLJIT_NUMBER_OF_REGISTERS + 3)
96#define TMP_ZERO (SLJIT_NUMBER_OF_REGISTERS + 4)
98#if (defined SLJIT_PASS_ENTRY_ADDR_TO_CALL && SLJIT_PASS_ENTRY_ADDR_TO_CALL)
99#define TMP_CALL_REG (SLJIT_NUMBER_OF_REGISTERS + 5)
101#define TMP_CALL_REG TMP_REG1
104#define TMP_FREG1 (SLJIT_NUMBER_OF_FLOAT_REGISTERS + 1)
105#define TMP_FREG2 (SLJIT_NUMBER_OF_FLOAT_REGISTERS + 2)
107static const sljit_u8 reg_map[SLJIT_NUMBER_OF_REGISTERS + 7] = {
108 0, 3, 4, 5, 6, 7, 8, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 1, 9, 10, 31, 12
111static const sljit_u8 freg_map[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 3] = {
112 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 0, 13
118#define D(d) ((sljit_ins)reg_map[d] << 21)
119#define S(s) ((sljit_ins)reg_map[s] << 21)
120#define A(a) ((sljit_ins)reg_map[a] << 16)
121#define B(b) ((sljit_ins)reg_map[b] << 11)
122#define C(c) ((sljit_ins)reg_map[c] << 6)
123#define FD(fd) ((sljit_ins)freg_map[fd] << 21)
124#define FS(fs) ((sljit_ins)freg_map[fs] << 21)
125#define FA(fa) ((sljit_ins)freg_map[fa] << 16)
126#define FB(fb) ((sljit_ins)freg_map[fb] << 11)
127#define FC(fc) ((sljit_ins)freg_map[fc] << 6)
128#define IMM(imm) ((sljit_ins)(imm) & 0xffff)
129#define CRD(d) ((sljit_ins)(d) << 21)
133#define OE(flags) ((flags) & ALT_SET_FLAGS)
135#define RC(flags) ((sljit_ins)((flags) & ALT_SET_FLAGS) >> 10)
136#define HI(opcode) ((sljit_ins)(opcode) << 26)
137#define LO(opcode) ((sljit_ins)(opcode) << 1)
139#define ADD (HI(31) | LO(266))
140#define ADDC (HI(31) | LO(10))
141#define ADDE (HI(31) | LO(138))
143#define ADDIC (HI(13))
144#define ADDIS (HI(15))
145#define ADDME (HI(31) | LO(234))
146#define AND (HI(31) | LO(28))
148#define ANDIS (HI(29))
151#define BCCTR (HI(19) | LO(528) | (3 << 11))
152#define BLR (HI(19) | LO(16) | (0x14 << 21))
153#if defined(_ARCH_PWR10) && _ARCH_PWR10
154#define BRD (HI(31) | LO(187))
156#define CNTLZD (HI(31) | LO(58))
157#define CNTLZW (HI(31) | LO(26))
158#define CMP (HI(31) | LO(0))
160#define CMPL (HI(31) | LO(32))
161#define CMPLI (HI(10))
162#define CROR (HI(19) | LO(449))
163#define DCBT (HI(31) | LO(278))
164#define DIVD (HI(31) | LO(489))
165#define DIVDU (HI(31) | LO(457))
166#define DIVW (HI(31) | LO(491))
167#define DIVWU (HI(31) | LO(459))
168#define EXTSB (HI(31) | LO(954))
169#define EXTSH (HI(31) | LO(922))
170#define EXTSW (HI(31) | LO(986))
171#define FABS (HI(63) | LO(264))
172#define FADD (HI(63) | LO(21))
173#define FADDS (HI(59) | LO(21))
174#define FCFID (HI(63) | LO(846))
175#define FCMPU (HI(63) | LO(0))
176#define FCTIDZ (HI(63) | LO(815))
177#define FCTIWZ (HI(63) | LO(15))
178#define FDIV (HI(63) | LO(18))
179#define FDIVS (HI(59) | LO(18))
180#define FMR (HI(63) | LO(72))
181#define FMUL (HI(63) | LO(25))
182#define FMULS (HI(59) | LO(25))
183#define FNEG (HI(63) | LO(40))
184#define FRSP (HI(63) | LO(12))
185#define FSUB (HI(63) | LO(20))
186#define FSUBS (HI(59) | LO(20))
187#define LD (HI(58) | 0)
190#if defined(_ARCH_PWR7) && _ARCH_PWR7
191#define LDBRX (HI(31) | LO(532))
193#define LHBRX (HI(31) | LO(790))
194#define LWBRX (HI(31) | LO(534))
196#define MFCR (HI(31) | LO(19))
197#define MFLR (HI(31) | LO(339) | 0x80000)
198#define MFXER (HI(31) | LO(339) | 0x10000)
199#define MTCTR (HI(31) | LO(467) | 0x90000)
200#define MTLR (HI(31) | LO(467) | 0x80000)
201#define MTXER (HI(31) | LO(467) | 0x10000)
202#define MULHD (HI(31) | LO(73))
203#define MULHDU (HI(31) | LO(9))
204#define MULHW (HI(31) | LO(75))
205#define MULHWU (HI(31) | LO(11))
206#define MULLD (HI(31) | LO(233))
208#define MULLW (HI(31) | LO(235))
209#define NEG (HI(31) | LO(104))
211#define NOR (HI(31) | LO(124))
212#define OR (HI(31) | LO(444))
215#define RLDCL (HI(30) | LO(8))
216#define RLDICL (HI(30) | LO(0 << 1))
217#define RLDICR (HI(30) | LO(1 << 1))
218#define RLDIMI (HI(30) | LO(3 << 1))
219#define RLWIMI (HI(20))
220#define RLWINM (HI(21))
221#define RLWNM (HI(23))
222#define SLD (HI(31) | LO(27))
223#define SLW (HI(31) | LO(24))
224#define SRAD (HI(31) | LO(794))
225#define SRADI (HI(31) | LO(413 << 1))
226#define SRAW (HI(31) | LO(792))
227#define SRAWI (HI(31) | LO(824))
228#define SRD (HI(31) | LO(539))
229#define SRW (HI(31) | LO(536))
230#define STD (HI(62) | 0)
231#if defined(_ARCH_PWR7) && _ARCH_PWR7
232#define STDBRX (HI(31) | LO(660))
234#define STDU (HI(62) | 1)
235#define STDUX (HI(31) | LO(181))
237#define STFIWX (HI(31) | LO(983))
239#define STHBRX (HI(31) | LO(918))
241#define STWBRX (HI(31) | LO(662))
243#define STWUX (HI(31) | LO(183))
244#define SUBF (HI(31) | LO(40))
245#define SUBFC (HI(31) | LO(8))
246#define SUBFE (HI(31) | LO(136))
247#define SUBFIC (HI(8))
248#define XOR (HI(31) | LO(316))
250#define XORIS (HI(27))
252#define SIMM_MAX (0x7fff)
253#define SIMM_MIN (-0x8000)
254#define UIMM_MAX (0xffff)
257#define RLWI_SH(sh) ((sljit_ins)(sh) << 11)
258#define RLWI_MBE(mb, me) (((sljit_ins)(mb) << 6) | ((sljit_ins)(me) << 1))
259#define RLDI_SH(sh) ((((sljit_ins)(sh) & 0x1f) << 11) | (((sljit_ins)(sh) & 0x20) >> 4))
260#define RLDI_MB(mb) ((((sljit_ins)(mb) & 0x1f) << 6) | ((sljit_ins)(mb) & 0x20))
261#define RLDI_ME(me) RLDI_MB(me)
263#define SLWI(shift) (RLWINM | RLWI_SH(shift) | RLWI_MBE(0, 31 - (shift)))
264#define SLDI(shift) (RLDICR | RLDI_SH(shift) | RLDI_ME(63 - (shift)))
266#define SRWI(shift) (RLWINM | RLWI_SH(32 - (shift)) | RLWI_MBE((shift), 31))
267#define SRDI(shift) (RLDICL | RLDI_SH(64 - (shift)) | RLDI_MB(shift))
269#if (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32)
270#define SLWI_W(shift) SLWI(shift)
271#define TMP_MEM_OFFSET (2 * sizeof(sljit_sw))
273#define SLWI_W(shift) SLDI(shift)
274#define TMP_MEM_OFFSET (6 * sizeof(sljit_sw))
277#if (defined SLJIT_LITTLE_ENDIAN && SLJIT_LITTLE_ENDIAN)
278#define TMP_MEM_OFFSET_LO (TMP_MEM_OFFSET)
279#define TMP_MEM_OFFSET_HI (TMP_MEM_OFFSET + sizeof(sljit_s32))
280#define LWBRX_FIRST_REG S(TMP_REG1)
281#define LWBRX_SECOND_REG S(dst)
283#define TMP_MEM_OFFSET_LO (TMP_MEM_OFFSET + sizeof(sljit_s32))
284#define TMP_MEM_OFFSET_HI (TMP_MEM_OFFSET)
285#define LWBRX_FIRST_REG S(dst)
286#define LWBRX_SECOND_REG S(TMP_REG1)
289#if (defined SLJIT_INDIRECT_CALL && SLJIT_INDIRECT_CALL)
318#if (defined SLJIT_PASS_ENTRY_ADDR_TO_CALL && SLJIT_PASS_ENTRY_ADDR_TO_CALL) && (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32)
326 if (jump->flags & JUMP_ADDR)
327 target_addr = jump->u.target;
330 target_addr = (
sljit_uw)(code + jump->u.label->size) + (
sljit_uw)executable_offset;
333#if (defined SLJIT_PASS_ENTRY_ADDR_TO_CALL && SLJIT_PASS_ENTRY_ADDR_TO_CALL) && (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
334 if (jump->flags & IS_CALL)
340 if (jump->flags & IS_COND) {
341 if (diff <= 0x7fff && diff >= -0x8000) {
342 jump->flags |= PATCH_B;
345 if (target_addr <= 0xffff) {
346 jump->flags |= PATCH_B | PATCH_ABS_B;
350 diff -= SSIZE_OF(ins);
353 if (diff <= 0x01ffffff && diff >= -0x02000000) {
354 jump->flags |= PATCH_B;
355 }
else if (target_addr <= 0x01ffffff) {
356 jump->flags |= PATCH_B | PATCH_ABS_B;
359 if (jump->flags & PATCH_B) {
360 if (!(jump->flags & IS_COND))
363 code_ptr[0] =
BCx | (2 << 2) | ((code_ptr[0] ^ (8 << 21)) & 0x03ff0001);
366 jump->flags -= IS_COND;
370#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
371#if (defined SLJIT_PASS_ENTRY_ADDR_TO_CALL && SLJIT_PASS_ENTRY_ADDR_TO_CALL)
374 if (target_addr < 0x80000000l) {
375 jump->flags |= PATCH_ABS32;
377 code_ptr[3] = code_ptr[0];
381 if (target_addr < 0x800000000000l) {
382 jump->flags |= PATCH_ABS48;
384 code_ptr[5] = code_ptr[0];
390#if (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32)
392 code_ptr[3] = code_ptr[0];
395 code_ptr[6] = code_ptr[0];
397 return code_ptr + JUMP_MAX_SIZE - 1;
400#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
408 if (jump->flags & JUMP_ADDR)
409 addr = jump->u.target;
411 addr = (
sljit_uw)SLJIT_ADD_EXEC_OFFSET(code + jump->u.label->size, executable_offset);
413 if (
addr < 0x80000000l) {
415 jump->flags |= PATCH_ABS32;
419 if (
addr < 0x800000000000l) {
421 jump->flags |= PATCH_ABS48;
431static void generate_jump_or_mov_addr(
struct sljit_jump *jump,
sljit_sw executable_offset)
439 if (
flags & PATCH_B) {
440 if (
flags & IS_COND) {
441 if (!(
flags & PATCH_ABS_B)) {
442 addr -= (
sljit_uw)SLJIT_ADD_EXEC_OFFSET(ins, executable_offset);
452 if (!(
flags & PATCH_ABS_B)) {
453 addr -= (
sljit_uw)SLJIT_ADD_EXEC_OFFSET(ins, executable_offset);
465#if (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32)
471 if (
flags & PATCH_ABS32) {
478 if (
flags & PATCH_ABS48) {
482 ins[2] =
SLDI(16) |
S(reg) |
A(reg);
489 ins[2] =
SLDI(32) |
S(reg) |
A(reg);
500 SLJIT_NEXT_DEFINE_TYPES;
506 jump = compiler->
jumps;
507 const_ = compiler->
consts;
508 SLJIT_NEXT_INIT_TYPES();
511 SLJIT_GET_NEXT_MIN();
513 if (next_min_addr == SLJIT_MAX_ADDRESS)
516 if (next_min_addr == next_label_size) {
517 label->
size -= size_reduce;
520 next_label_size = SLJIT_GET_NEXT_SIZE(label);
523 if (next_min_addr == next_const_addr) {
524 const_->
addr -= size_reduce;
525 const_ = const_->
next;
526 next_const_addr = SLJIT_GET_NEXT_ADDRESS(const_);
530 if (next_min_addr != next_jump_addr)
533 jump->addr -= size_reduce;
534 if (!(jump->flags & JUMP_MOV_ADDR)) {
535 total_size = JUMP_MAX_SIZE - 1;
538 if (jump->flags & JUMP_ADDR) {
539 if (jump->u.target <= 0x01ffffff)
541#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
542 else if (jump->u.target < 0x80000000l)
544 else if (jump->u.target < 0x800000000000l)
551 if (jump->flags & IS_COND) {
552 if (diff <= (0x7fff / SSIZE_OF(ins)) && diff >= (-0x8000 / SSIZE_OF(ins)))
554 else if ((diff - 1) <= (0x01ffffff / SSIZE_OF(ins)) && (diff - 1) >= (-0x02000000 / SSIZE_OF(ins)))
556 }
else if (diff <= (0x01ffffff / SSIZE_OF(ins)) && diff >= (-0x02000000 / SSIZE_OF(ins)))
561 size_reduce += (JUMP_MAX_SIZE - 1) - total_size;
562 jump->flags |= total_size << JUMP_SIZE_SHIFT;
563#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
565 total_size = (
sljit_uw)4 << JUMP_SIZE_SHIFT;
567 if (jump->flags & JUMP_ADDR) {
568 if (jump->u.target < 0x80000000l) {
569 total_size = (
sljit_uw)1 << JUMP_SIZE_SHIFT;
571 }
else if (jump->u.target < 0x800000000000l) {
572 total_size = (
sljit_uw)3 << JUMP_SIZE_SHIFT;
576 jump->flags |= total_size;
581 next_jump_addr = SLJIT_GET_NEXT_ADDRESS(jump);
584 compiler->
size -= size_reduce;
595 SLJIT_NEXT_DEFINE_TYPES;
603 CHECK_PTR(check_sljit_generate_code(compiler));
605 reduce_code_size(compiler);
607#if (defined SLJIT_INDIRECT_CALL && SLJIT_INDIRECT_CALL)
609#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
610 compiler->
size += (compiler->
size & 0x1) + (
sizeof(
struct sljit_function_context) /
sizeof(
sljit_ins));
618 reverse_buf(compiler);
624 jump = compiler->
jumps;
625 const_ = compiler->
consts;
626 SLJIT_NEXT_INIT_TYPES();
627 SLJIT_GET_NEXT_MIN();
631 buf_end = buf_ptr + (
buf->used_size >> 2);
633 *code_ptr = *buf_ptr++;
634 if (next_min_addr == word_count) {
640 if (next_min_addr == next_label_size) {
642 label->
u.
addr = (
sljit_uw)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset);
645 next_label_size = SLJIT_GET_NEXT_SIZE(label);
648 if (next_min_addr == next_jump_addr) {
649 if (!(jump->flags & JUMP_MOV_ADDR)) {
650 word_count += jump->flags >> JUMP_SIZE_SHIFT;
652 code_ptr = detect_jump_type(jump, code_ptr, code, executable_offset);
656#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
657 word_count += jump->flags >> JUMP_SIZE_SHIFT;
658 code_ptr += mov_addr_get_length(jump, code, executable_offset);
665 next_jump_addr = SLJIT_GET_NEXT_ADDRESS(jump);
666 }
else if (next_min_addr == next_const_addr) {
668 const_ = const_->
next;
669 next_const_addr = SLJIT_GET_NEXT_ADDRESS(const_);
672 SLJIT_GET_NEXT_MIN();
676 }
while (buf_ptr < buf_end);
681 if (label && label->
size == word_count) {
682 label->
u.
addr = (
sljit_uw)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset);
691#if (defined SLJIT_INDIRECT_CALL && SLJIT_INDIRECT_CALL)
697 jump = compiler->
jumps;
699 generate_jump_or_mov_addr(jump, executable_offset);
706 code = (
sljit_ins *)SLJIT_ADD_EXEC_OFFSET(code, executable_offset);
708#if (defined SLJIT_INDIRECT_CALL && SLJIT_INDIRECT_CALL)
709#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
716 code_ptr = (
sljit_ins *)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset);
721#if (defined SLJIT_INDIRECT_CALL && SLJIT_INDIRECT_CALL)
732 switch (feature_type) {
734#ifdef SLJIT_IS_FPU_AVAILABLE
741#if defined(_ARCH_PWR10) && _ARCH_PWR10
783#define LOAD_DATA 0x01
785#define SIGNED_DATA 0x04
787#define WORD_DATA 0x00
788#define BYTE_DATA 0x08
789#define HALF_DATA 0x10
793#define DOUBLE_DATA 0x20
797#define FLOAT_DATA(op) (DOUBLE_DATA | ((op & SLJIT_32) >> 6))
802#define ALT_SIGN_EXT 0x000100
804#define ALT_SET_FLAGS 0x000400
805#define ALT_FORM1 0x001000
806#define ALT_FORM2 0x002000
807#define ALT_FORM3 0x004000
808#define ALT_FORM4 0x008000
809#define ALT_FORM5 0x010000
812#define REG_DEST 0x000001
813#define REG1_SOURCE 0x000002
814#define REG2_SOURCE 0x000004
825#if (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32)
831#if (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32)
832#define STACK_STORE STW
833#define STACK_LOAD LWZ
835#define STACK_STORE STD
839#if (defined SLJIT_PPC_STACK_FRAME_V2 && SLJIT_PPC_STACK_FRAME_V2)
840#define LR_SAVE_OFFSET (2 * SSIZE_OF(sw))
842#define LR_SAVE_OFFSET SSIZE_OF(sw)
845#define STACK_MAX_DISTANCE (0x8000 - SSIZE_OF(sw) - LR_SAVE_OFFSET)
854#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
859 CHECK(check_sljit_emit_enter(compiler,
options, arg_types, scratches, saveds, fscratches, fsaveds, local_size));
860 set_emit_enter(compiler,
options, arg_types, scratches, saveds, fscratches, fsaveds, local_size);
862 local_size += GET_SAVED_REGISTERS_SIZE(scratches, saveds - saved_arg_count, 0)
863 + GET_SAVED_FLOAT_REGISTERS_SIZE(fscratches, fsaveds, f64);
866 local_size += SSIZE_OF(sw);
877#if (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32)
886#if (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32)
912 for (i =
SLJIT_S0 - saved_arg_count; i > tmp; i--) {
932 while (arg_types > 0) {
934#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
939 }
else if (arg_count != word_arg_count)
955#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
969 CHECK(check_sljit_set_context(compiler,
options, arg_types, scratches, saveds, fscratches, fsaveds, local_size));
970 set_set_context(compiler,
options, arg_types, scratches, saveds, fscratches, fsaveds, local_size);
972 local_size += GET_SAVED_REGISTERS_SIZE(scratches, saveds - SLJIT_KEPT_SAVEDS_COUNT(
options), 0)
973 + GET_SAVED_FLOAT_REGISTERS_SIZE(fscratches, fsaveds, f64);
976 local_size += SSIZE_OF(sw);
1022 for (i =
SLJIT_S0 - SLJIT_KEPT_SAVEDS_COUNT(compiler->
options); i > tmp; i--) {
1033 push_inst(compiler,
MTLR |
S(0));
1039 return push_inst(compiler,
OR |
S(base) |
A(
SLJIT_SP) |
B(base));
1048 CHECK(check_sljit_emit_return_void(compiler));
1050 FAIL_IF(emit_stack_frame_release(compiler, 0));
1051 return push_inst(compiler,
BLR);
1058 CHECK(check_sljit_emit_return_to(compiler, src, srcw));
1061 ADJUST_LOCAL_OFFSET(src, srcw);
1071 FAIL_IF(emit_stack_frame_release(compiler, 1));
1073 SLJIT_SKIP_CHECKS(compiler);
1089#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
1090#define INT_ALIGNED 0x10000
1093#if (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32)
1094#define ARCH_32_64(a, b) a
1095#define INST_CODE_AND_DST(inst, flags, reg) \
1096 ((sljit_ins)(inst) | (sljit_ins)(((flags) & MEM_MASK) <= GPR_REG ? D(reg) : FD(reg)))
1098#define ARCH_32_64(a, b) b
1099#define INST_CODE_AND_DST(inst, flags, reg) \
1100 (((sljit_ins)(inst) & ~(sljit_ins)INT_ALIGNED) | (sljit_ins)(((flags) & MEM_MASK) <= GPR_REG ? D(reg) : FD(reg)))
1103static const sljit_ins data_transfer_insts[64 + 16] = {
1168static const sljit_ins updated_data_transfer_insts[64] = {
1248 offs_reg = OFFS_REG(
arg);
1257#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
1264 inst = data_transfer_insts[inp_flags &
MEM_MASK];
1267#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
1268 if ((inst & INT_ALIGNED) && (argw & 0x3) != 0) {
1269 FAIL_IF(load_immediate(compiler, tmp_reg, argw));
1276 if (argw <= SIMM_MAX && argw >=
SIMM_MIN)
1279#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
1280 if (argw <= 0x7fff7fffl && argw >= -0x80000000l) {
1284#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
1287 FAIL_IF(load_immediate(compiler, tmp_reg, argw));
1309 if (FAST_IS_REG(dst)) {
1316 src2_tmp_reg = dst_r;
1320 if (FAST_IS_REG(src2)) {
1329 FAIL_IF(load_immediate(compiler, src2_tmp_reg, src2w));
1330 src2_r = src2_tmp_reg;
1334 src2_r = src2_tmp_reg;
1338 if (FAST_IS_REG(src1)) {
1352 FAIL_IF(emit_single_op(compiler, op,
flags, dst_r, src1_r, src2_r));
1357 return emit_op_mem(compiler, input_flags, dst_r, dst, dstw,
TMP_REG1);
1362#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
1367 CHECK(check_sljit_emit_op0(compiler, op));
1373 return push_inst(compiler,
NOP);
1377#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
1387#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
1397#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
1416#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
1435 return push_inst(compiler,
EXTSH |
S(dst) |
A(dst));
1438#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
1440#if defined(_ARCH_PWR10) && _ARCH_PWR10
1441 return push_inst(compiler, BRD |
S(src) |
A(dst));
1457#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
1459 return push_inst(compiler,
EXTSW |
S(dst) |
A(dst));
1475#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
1488 offs_reg = OFFS_REG(mem);
1496#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
1497 }
else if (memw > 0x7fff7fffl || memw < -0x80000000l) {
1513 return push_inst(compiler,
STHBRX |
S(src) |
A(mem) |
B(offs_reg));
1519 return push_inst(compiler,
EXTSH |
S(dst) |
A(dst));
1522#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
1525#if defined(_ARCH_PWR7) && _ARCH_PWR7
1526 return push_inst(compiler, STDBRX |
S(src) |
A(mem) |
B(offs_reg));
1528#if defined(SLJIT_LITTLE_ENDIAN) && SLJIT_LITTLE_ENDIAN
1541#if defined(_ARCH_PWR7) && _ARCH_PWR7
1542 return push_inst(compiler, LDBRX |
S(dst) |
A(mem) |
B(offs_reg));
1553 return push_inst(compiler,
STWBRX |
S(src) |
A(mem) |
B(offs_reg));
1556#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
1558 return push_inst(compiler,
EXTSW |
S(dst) |
A(dst));
1563#define EMIT_MOV(type, type_flags, type_cast) \
1564 emit_op(compiler, (src == SLJIT_IMM) ? SLJIT_MOV : type, flags | (type_flags), dst, dstw, TMP_REG1, 0, src, (src == SLJIT_IMM) ? type_cast srcw : srcw)
1574 CHECK(check_sljit_emit_op1(compiler, op, dst, dstw, src, srcw));
1575 ADJUST_LOCAL_OFFSET(dst, dstw);
1576 ADJUST_LOCAL_OFFSET(src, srcw);
1583 if (op <=
SLJIT_MOV_P && FAST_IS_REG(src) && src == dst) {
1584 if (!TYPE_CAST_NEEDED(op))
1588#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
1603 if (HAS_FLAGS(op_flags))
1611#if (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32)
1619#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
1642#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
1646 return emit_op(compiler, op,
flags, dst, dstw,
TMP_REG1, 0, src, srcw);
1649#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
1656#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
1659 return emit_rev(compiler, op, dst, dstw, src, srcw);
1668#define TEST_SL_IMM(src, srcw) \
1669 ((src) == SLJIT_IMM && (srcw) <= SIMM_MAX && (srcw) >= SIMM_MIN)
1670#define TEST_UL_IMM(src, srcw) \
1671 ((src) == SLJIT_IMM && !((srcw) & ~0xffff))
1672#define TEST_UH_IMM(src, srcw) \
1673 ((src) == SLJIT_IMM && !((srcw) & ~(sljit_sw)0xffff0000))
1675#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
1676#define TEST_SH_IMM(src, srcw) \
1677 ((src) == SLJIT_IMM && !((srcw) & 0xffff) && (srcw) <= 0x7fffffffl && (srcw) >= -0x80000000l)
1678#define TEST_ADD_IMM(src, srcw) \
1679 ((src) == SLJIT_IMM && (srcw) <= 0x7fff7fffl && (srcw) >= -0x80000000l)
1680#define TEST_UI_IMM(src, srcw) \
1681 ((src) == SLJIT_IMM && !((srcw) & ~0xffffffff))
1683#define TEST_ADD_FORM1(op) \
1684 (GET_FLAG_TYPE(op) == SLJIT_OVERFLOW \
1685 || (op & (SLJIT_32 | SLJIT_SET_Z | VARIABLE_FLAG_MASK)) == (SLJIT_32 | SLJIT_SET_Z | SLJIT_SET_CARRY))
1686#define TEST_SUB_FORM2(op) \
1687 ((GET_FLAG_TYPE(op) >= SLJIT_SIG_LESS && GET_FLAG_TYPE(op) <= SLJIT_SIG_LESS_EQUAL) \
1688 || (op & (SLJIT_32 | SLJIT_SET_Z | VARIABLE_FLAG_MASK)) == (SLJIT_32 | SLJIT_SET_Z))
1689#define TEST_SUB_FORM3(op) \
1690 (GET_FLAG_TYPE(op) == SLJIT_OVERFLOW \
1691 || (op & (SLJIT_32 | SLJIT_SET_Z)) == (SLJIT_32 | SLJIT_SET_Z))
1694#define TEST_SH_IMM(src, srcw) \
1695 ((src) == SLJIT_IMM && !((srcw) & 0xffff))
1696#define TEST_ADD_IMM(src, srcw) \
1697 ((src) == SLJIT_IMM)
1698#define TEST_UI_IMM(src, srcw) \
1699 ((src) == SLJIT_IMM)
1701#define TEST_ADD_FORM1(op) \
1702 (GET_FLAG_TYPE(op) == SLJIT_OVERFLOW)
1703#define TEST_SUB_FORM2(op) \
1704 (GET_FLAG_TYPE(op) >= SLJIT_SIG_LESS && GET_FLAG_TYPE(op) <= SLJIT_SIG_LESS_EQUAL)
1705#define TEST_SUB_FORM3(op) \
1706 (GET_FLAG_TYPE(op) == SLJIT_OVERFLOW)
1717 CHECK(check_sljit_emit_op2(compiler, op, 0, dst, dstw, src1, src1w, src2, src2w));
1718 ADJUST_LOCAL_OFFSET(dst, dstw);
1719 ADJUST_LOCAL_OFFSET(src1, src1w);
1720 ADJUST_LOCAL_OFFSET(src2, src2w);
1722#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
1746 compiler->imm = (
sljit_ins)src2w & 0xffff;
1750 compiler->imm = (
sljit_ins)src1w & 0xffff;
1754 compiler->imm = (
sljit_ins)(src2w >> 16) & 0xffff;
1758 compiler->imm = (
sljit_ins)(src1w >> 16) & 0xffff;
1763 compiler->imm = (
sljit_ins)src2w & 0xffffffff;
1767 compiler->imm = (
sljit_ins)src1w & 0xffffffff;
1772#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
1775 compiler->imm = (
sljit_ins)src2w & 0xffff;
1779 compiler->imm = (
sljit_ins)src1w & 0xffff;
1785 if (HAS_FLAGS(op)) {
1787 compiler->imm = (
sljit_ins)src2w & 0xffff;
1791 compiler->imm = (
sljit_ins)src1w & 0xffff;
1799 return emit_op(compiler,
SLJIT_ADDC,
flags, dst, dstw, src1, src1w, src2, src2w);
1807 compiler->imm = (
sljit_ins)src2w & 0xffff;
1822 compiler->imm = (
sljit_ins)src2w & 0xffff;
1830 compiler->imm = (
sljit_ins)src2w & 0xffff;
1840 compiler->imm = (
sljit_ins)(-src2w) & 0xffff;
1845 compiler->imm = (
sljit_ins)src1w & 0xffff;
1849 if (!HAS_FLAGS(op)) {
1851 compiler->imm = (
sljit_ins)((-src2w) >> 16) & 0xffff;
1866 return emit_op(compiler,
SLJIT_SUBC,
flags, dst, dstw, src1, src1w, src2, src2w);
1869#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
1873 if (!HAS_FLAGS(op)) {
1875 compiler->imm = (
sljit_ins)src2w & 0xffff;
1879 compiler->imm = (
sljit_ins)src1w & 0xffff;
1885 return emit_op(compiler,
SLJIT_MUL,
flags, dst, dstw, src1, src1w, src2, src2w);
1908 compiler->imm = (
sljit_ins)(src2w >> 16) & 0xffff;
1912 compiler->imm = (
sljit_ins)(src1w >> 16) & 0xffff;
1927 return emit_op(compiler,
GET_OPCODE(op),
flags, dst, dstw, src1, src1w, src2, src2w);
1937#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
1945 return emit_op(compiler,
GET_OPCODE(op),
flags, dst, dstw, src1, src1w, src2, src2w);
1956 CHECK(check_sljit_emit_op2(compiler, op, 1, 0, 0, src1, src1w, src2, src2w));
1958 SLJIT_SKIP_CHECKS(compiler);
1962#undef TEST_ADD_FORM1
1963#undef TEST_SUB_FORM2
1964#undef TEST_SUB_FORM3
1972 CHECK(check_sljit_emit_op2r(compiler, op, dst_reg, src1, src1w, src2, src2w));
1976 SLJIT_SKIP_CHECKS(compiler);
1978 return push_inst(compiler,
ADD |
D(dst_reg) |
A(dst_reg) |
B(
TMP_REG2));
1991#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
2000 CHECK(check_sljit_emit_shift_into(compiler, op, dst_reg, src1_reg, src2_reg, src3, src3w));
2004 if (src1_reg == src2_reg) {
2005 SLJIT_SKIP_CHECKS(compiler);
2009 ADJUST_LOCAL_OFFSET(src3, src3w);
2012 src3w &= bit_length - 1;
2017#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
2020 FAIL_IF(push_inst(compiler,
SRDI(src3w) |
S(src1_reg) |
A(dst_reg)));
2024 FAIL_IF(push_inst(compiler,
SLDI(src3w) |
S(src1_reg) |
A(dst_reg)));
2027 return push_inst(compiler,
OR |
S(dst_reg) |
A(dst_reg) |
B(
TMP_REG1));
2032 FAIL_IF(push_inst(compiler,
SRWI(src3w) |
S(src1_reg) |
A(dst_reg)));
2036 FAIL_IF(push_inst(compiler,
SLWI(src3w) |
S(src1_reg) |
A(dst_reg)));
2045#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
2052 FAIL_IF(push_inst(compiler, (is_right ?
SRD :
SLD) |
S(src1_reg) |
A(dst_reg) |
B(src3)));
2056 return push_inst(compiler,
OR |
S(dst_reg) |
A(dst_reg) |
B(
TMP_REG1));
2065 FAIL_IF(push_inst(compiler, (is_right ?
SRW :
SLW) |
S(src1_reg) |
A(dst_reg) |
B(src3)));
2069 return push_inst(compiler,
OR |
S(dst_reg) |
A(dst_reg) |
B(
TMP_REG1));
2075 if (!(src & OFFS_REG_MASK)) {
2076 if (srcw == 0 && (src & REG_MASK))
2077 return push_inst(compiler,
DCBT |
A(0) |
B(src & REG_MASK));
2081 return push_inst(compiler,
DCBT |
A(src & REG_MASK) |
B(
TMP_REG1));
2087 return push_inst(compiler,
DCBT |
A(src & REG_MASK) |
B(OFFS_REG(src)));
2090 return push_inst(compiler,
DCBT |
A(src & REG_MASK) |
B(
TMP_REG1));
2097 CHECK(check_sljit_emit_op_src(compiler, op, src, srcw));
2098 ADJUST_LOCAL_OFFSET(src, srcw);
2102 if (FAST_IS_REG(src))
2109 return push_inst(compiler,
BLR);
2116 return emit_prefetch(compiler, src, srcw);
2128 CHECK(check_sljit_emit_op_dst(compiler, op, dst, dstw));
2129 ADJUST_LOCAL_OFFSET(dst, dstw);
2133 if (FAST_IS_REG(dst))
2134 return push_inst(compiler,
MFLR |
D(dst));
2139 dst_r = FAST_IS_REG(dst) ? dst :
TMP_REG1;
2152 CHECK_REG_INDEX(check_sljit_get_register_index(
type, reg));
2155 return reg_map[reg];
2160 return freg_map[reg];
2169 CHECK(check_sljit_emit_op_custom(compiler, instruction,
size));
2171 return push_inst(compiler, *(
sljit_ins*)instruction);
2178#define SELECT_FOP(op, single, double) ((sljit_ins)((op & SLJIT_32) ? single : double))
2190#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
2195 if (FAST_IS_REG(dst)) {
2205 if (FAST_IS_REG(dst)) {
2213 if (dst & OFFS_REG_MASK) {
2219 dstw = OFFS_REG(dst);
2222 if ((dst & REG_MASK) && !dstw) {
2223 dstw = dst & REG_MASK;
2251 switch (GET_FLAG_TYPE(op)) {
2253 return push_inst(compiler,
CROR | ((4 + 2) << 21) | ((4 + 2) << 16) | ((4 + 3) << 11));
2255 return push_inst(compiler,
CROR | ((4 + 0) << 21) | ((4 + 0) << 16) | ((4 + 3) << 11));
2257 return push_inst(compiler,
CROR | ((4 + 1) << 21) | ((4 + 1) << 16) | ((4 + 3) << 11));
2272 SELECT_FOP1_OPERATION_WITH_CHECKS(compiler, op, dst, dstw, src, srcw);
2277 dst_r = FAST_IS_REG(dst) ? dst :
TMP_FREG1;
2321 CHECK(check_sljit_emit_fop2(compiler, op, dst, dstw, src1, src1w, src2, src2w));
2322 ADJUST_LOCAL_OFFSET(dst, dstw);
2323 ADJUST_LOCAL_OFFSET(src1, src1w);
2324 ADJUST_LOCAL_OFFSET(src2, src2w);
2326 dst_r = FAST_IS_REG(dst) ? dst :
TMP_FREG2;
2353#if (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32)
2359#if (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32)
2364 FAIL_IF(push_inst(compiler,
BCx | (4 << 21) | (0 << 16) | 8));
2365 return push_inst(compiler,
FNEG |
FD(dst_r) |
FB(dst_r));
2385 CHECK(check_sljit_emit_fset32(compiler, freg,
value));
2405 CHECK_PTR(check_sljit_emit_label(compiler));
2412 set_label(label, compiler);
2421 return (4 << 21) | (2 << 16);
2425 return (12 << 21) | (2 << 16);
2429 return (12 << 21) | (2 << 16);
2433 return (4 << 21) | (2 << 16);
2437 return (12 << 21) | (0 << 16);
2441 return (4 << 21) | (0 << 16);
2445 return (12 << 21) | (1 << 16);
2449 return (4 << 21) | (1 << 16);
2452 return (12 << 21) | (3 << 16);
2455 return (4 << 21) | (3 << 16);
2460 return (12 << 21) | ((4 + 0) << 16);
2465 return (4 << 21) | ((4 + 0) << 16);
2470 return (12 << 21) | ((4 + 1) << 16);
2475 return (4 << 21) | ((4 + 1) << 16);
2480 return (12 << 21) | ((4 + 2) << 16);
2485 return (4 << 21) | ((4 + 2) << 16);
2488 return (12 << 21) | ((4 + 3) << 16);
2491 return (4 << 21) | ((4 + 3) << 16);
2505 CHECK_PTR(check_sljit_emit_jump(compiler,
type));
2507 bo_bi_flags = get_bo_bi_flags(compiler,
type & 0xff);
2521 jump->flags |= IS_COND;
2522#if (defined SLJIT_PASS_ENTRY_ADDR_TO_CALL && SLJIT_PASS_ENTRY_ADDR_TO_CALL)
2524 jump->flags |= IS_CALL;
2527 jump->addr = compiler->
size;
2531 compiler->
size += JUMP_MAX_SIZE - 1;
2541 CHECK_PTR(check_sljit_emit_call(compiler,
type, arg_types));
2543#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
2549 PTR_FAIL_IF(emit_stack_frame_release(compiler, 0));
2553 SLJIT_SKIP_CHECKS(compiler);
2563 CHECK(check_sljit_emit_ijump(compiler,
type, src, srcw));
2569 set_jump(jump, compiler, JUMP_ADDR);
2572#if (defined SLJIT_PASS_ENTRY_ADDR_TO_CALL && SLJIT_PASS_ENTRY_ADDR_TO_CALL)
2574 jump->flags |= IS_CALL;
2577 jump->addr = compiler->
size;
2581 compiler->
size += JUMP_MAX_SIZE - 1;
2585 if (FAST_IS_REG(src)) {
2586#if (defined SLJIT_PASS_ENTRY_ADDR_TO_CALL && SLJIT_PASS_ENTRY_ADDR_TO_CALL)
2596 ADJUST_LOCAL_OFFSET(src, srcw);
2612 CHECK(check_sljit_emit_icall(compiler,
type, arg_types, src, srcw));
2615 ADJUST_LOCAL_OFFSET(src, srcw);
2626 FAIL_IF(emit_stack_frame_release(compiler, 0));
2630#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
2632 FAIL_IF(call_with_args(compiler, arg_types, &src));
2635 SLJIT_SKIP_CHECKS(compiler);
2647#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
2654 CHECK(check_sljit_emit_op_flags(compiler, op, dst, dstw,
type));
2655 ADJUST_LOCAL_OFFSET(dst, dstw);
2783 return emit_op_mem(compiler, input_flags, reg, dst, dstw,
TMP_REG1);
2786 SLJIT_SKIP_CHECKS(compiler);
2800#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
2807 CHECK(check_sljit_emit_select(compiler,
type, dst_reg, src1, src1w, src2_reg));
2809 ADJUST_LOCAL_OFFSET(src1, src1w);
2811 if (dst_reg != src2_reg) {
2812 if (dst_reg == src1) {
2817 if (ADDRESSING_DEPENDS_ON(src1, dst_reg)) {
2820 if ((src1 & REG_MASK) == dst_reg)
2821 src1 = (src1 & ~REG_MASK) |
TMP_REG1;
2823 if (OFFS_REG(src1) == dst_reg)
2824 src1 = (src1 & ~OFFS_REG_MASK) | TO_OFFS_REG(
TMP_REG1);
2827 FAIL_IF(push_inst(compiler,
OR |
S(src2_reg) |
A(dst_reg) |
B(src2_reg)));
2841 FAIL_IF(emit_op_mem(compiler, inp_flags, dst_reg, src1, src1w,
TMP_REG1));
2843#if (defined SLJIT_CONFIG_RISCV_64 && SLJIT_CONFIG_RISCV_64)
2847 FAIL_IF(load_immediate(compiler, dst_reg, src1w));
2849 FAIL_IF(push_inst(compiler,
OR |
S(src1) |
A(dst_reg) |
B(src1)));
2864 CHECK(check_sljit_emit_fselect(compiler,
type, dst_freg, src1, src1w, src2_freg));
2866 ADJUST_LOCAL_OFFSET(src1, src1w);
2868 if (dst_freg != src2_freg) {
2869 if (dst_freg == src1) {
2874 FAIL_IF(push_inst(compiler,
FMR |
FD(dst_freg) |
FB(src2_freg)));
2895#if (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32)
2897#define EMIT_MEM_LOAD_IMM(inst, mem, memw) \
2898 ((sljit_s16)(memw) > SIMM_MAX - SSIZE_OF(sw))
2902#define EMIT_MEM_LOAD_IMM(inst, mem, memw) \
2903 ((((inst) & INT_ALIGNED) && ((memw) & 0x3) != 0) \
2904 || ((sljit_s16)(memw) > SIMM_MAX - SSIZE_OF(sw)) \
2905 || ((memw) > 0x7fff7fffl || (memw) < -0x80000000l)) \
2916 CHECK(check_sljit_emit_mem(compiler,
type, reg, mem, memw));
2918 if (!(reg & REG_PAIR_MASK))
2919 return sljit_emit_mem_unaligned(compiler,
type, reg, mem, memw);
2921 ADJUST_LOCAL_OFFSET(mem, memw);
2938 if ((mem & REG_MASK) != 0) {
2939 SLJIT_SKIP_CHECKS(compiler);
2957 SLJIT_ASSERT((memw >= 0 && memw <=
SIMM_MAX - SSIZE_OF(sw)) || (memw >= 0x8000 && memw <= 0xffff));
2959#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
2964 FAIL_IF(push_inst(compiler, inst |
D(REG_PAIR_SECOND(reg)) |
A(mem) |
IMM(memw + SSIZE_OF(sw))));
2965 return push_inst(compiler, inst |
D(REG_PAIR_FIRST(reg)) |
A(mem) |
IMM(memw));
2968 FAIL_IF(push_inst(compiler, inst |
D(REG_PAIR_FIRST(reg)) |
A(mem) |
IMM(memw)));
2969 return push_inst(compiler, inst |
D(REG_PAIR_SECOND(reg)) |
A(mem) |
IMM(memw + SSIZE_OF(sw)));
2972#undef EMIT_MEM_LOAD_IMM
2982 CHECK(check_sljit_emit_mem_update(compiler,
type, reg, mem, memw));
2987 switch (
type & 0xff) {
2990#if (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32)
2998#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
3008 if (mem & OFFS_REG_MASK)
3045 inst = updated_data_transfer_insts[mem_flags |
INDEXED];
3052 inst = updated_data_transfer_insts[mem_flags];
3054#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
3055 if ((inst & INT_ALIGNED) && (memw & 0x3) != 0)
3066 return push_inst(compiler,
EXTSB |
S(reg) |
A(reg));
3078 CHECK(check_sljit_emit_fmem_update(compiler,
type, freg, mem, memw));
3101 inst = updated_data_transfer_insts[mem_flags |
INDEXED];
3105 inst = updated_data_transfer_insts[mem_flags];
3115 CHECK_PTR(check_sljit_emit_const(compiler, dst, dstw, init_value));
3116 ADJUST_LOCAL_OFFSET(dst, dstw);
3120 set_const(const_, compiler);
3122 dst_r = FAST_IS_REG(dst) ? dst :
TMP_REG2;
3123 PTR_FAIL_IF(emit_const(compiler, dst_r, init_value));
3137 CHECK_PTR(check_sljit_emit_mov_addr(compiler, dst, dstw));
3138 ADJUST_LOCAL_OFFSET(dst, dstw);
3142 set_mov_addr(jump, compiler, 0);
3144 dst_r = FAST_IS_REG(dst) ? dst :
TMP_REG2;
3146#if (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32)
3149 compiler->
size += 4;
sizeof(Countable|array $value, int $mode=COUNT_NORMAL)
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_CALL_REG_ARG
#define SLJIT_ARG_TYPE_SCRATCH_REG
#define SLJIT_ORDERED_LESS_EQUAL
#define SLJIT_CONV_S32_FROM_F64
#define SLJIT_FAST_RETURN
#define SLJIT_HAS_ZERO_REGISTER
#define SLJIT_FIRST_SAVED_REG
SLJIT_API_FUNC_ATTRIBUTE void * sljit_generate_code(struct sljit_compiler *compiler, sljit_s32 options, void *exec_allocator_data)
#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_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_CONV_SW_FROM_F64
#define SLJIT_CURRENT_FLAGS_ADD
#define SLJIT_HAS_PREFETCH
#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_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_F_LESS_EQUAL
#define SLJIT_ORDERED_LESS
#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_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)
#define TMP_MEM_OFFSET_HI
#define TEST_SUB_FORM2(op)
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)
#define INST_CODE_AND_DST(inst, flags, reg)
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)
#define TEST_SH_IMM(src, srcw)
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)
#define TEST_ADD_IMM(src, srcw)
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 SELECT_FOP(op, single, double)
SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fset32(struct sljit_compiler *compiler, sljit_s32 freg, sljit_f32 value)
#define TEST_UI_IMM(src, srcw)
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 struct sljit_jump * sljit_emit_mov_addr(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw)
#define EMIT_MEM_LOAD_IMM(inst, mem, memw)
SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op0(struct sljit_compiler *compiler, sljit_s32 op)
#define TEST_UH_IMM(src, srcw)
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)
#define EMIT_MOV(type, type_flags, type_cast)
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)
#define TEST_UL_IMM(src, srcw)
SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_src(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 src, sljit_sw srcw)
#define TEST_SL_IMM(src, srcw)
#define TMP_MEM_OFFSET_LO
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)
#define TEST_SUB_FORM3(op)
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)
#define TEST_ADD_FORM1(op)
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)