29#if defined(__GNUC__) || (defined(__IBM_GCC_ASM) && __IBM_GCC_ASM)
30#define ASM_SLJIT_CLZ(src, dst) \
31 __asm__ volatile ( "cntlzd %0, %1" : "=r"(dst) : "r"(src) )
33#error "Please enable GCC syntax for inline assembly statements"
35#error "Must implement count leading zeroes"
39#define PUSH_SLDI_NEG(reg, shift) \
40 push_inst(compiler, RLDICR | S(reg) | A(reg) | RLDI_SH(63 - shift) | RLDI_ME(shift))
49 if (imm <= SIMM_MAX && imm >=
SIMM_MIN)
50 return push_inst(compiler,
ADDI |
D(reg) |
A(0) |
IMM(imm));
55 if (imm <= 0x7fffffffl && imm >= -0x80000000l) {
66 tmp = (
sljit_uw)((imm >= 0) ? imm : ~imm);
67 ASM_SLJIT_CLZ(tmp, shift);
72 if ((tmp & ~0xffff000000000000ul) == 0) {
78 if ((tmp & ~0xffffffff00000000ul) == 0) {
92 return push_inst(compiler,
ORI |
S(reg) |
A(reg) | (
sljit_ins)tmp2);
95 if (tmp2 <= 0xffffffff) {
102 ASM_SLJIT_CLZ(tmp2, shift2);
105 if ((tmp2 & ~0xffff000000000000ul) == 0) {
108 shift += (63 - shift2);
119 return push_inst(compiler,
ORI |
S(reg) |
A(reg) |
IMM(imm));
124#define CLRLDI(dst, src, n) \
125 (RLDICL | S(src) | A(dst) | RLDI_SH(0) | RLDI_MB(n))
129 if ((flags & (ALT_SIGN_EXT | REG2_SOURCE)) == (ALT_SIGN_EXT | REG2_SOURCE)) { \
130 FAIL_IF(push_inst(compiler, EXTSW | S(src2) | A(TMP_REG2))); \
135 if (flags & ALT_SIGN_EXT) { \
136 if (flags & REG1_SOURCE) { \
137 FAIL_IF(push_inst(compiler, EXTSW | S(src1) | A(TMP_REG1))); \
140 if (flags & REG2_SOURCE) { \
141 FAIL_IF(push_inst(compiler, EXTSW | S(src2) | A(TMP_REG2))); \
146#define BIN_IMM_EXTS() \
147 if ((flags & (ALT_SIGN_EXT | REG1_SOURCE)) == (ALT_SIGN_EXT | REG1_SOURCE)) { \
148 FAIL_IF(push_inst(compiler, EXTSW | S(src1) | A(TMP_REG1))); \
162 return push_inst(compiler,
OR |
S(src2) |
A(dst) |
B(src2));
170 return push_inst(compiler,
EXTSW |
S(src2) |
A(dst));
171 return push_inst(compiler,
CLRLDI(dst, src2, 32));
183 return push_inst(compiler,
EXTSB |
S(src2) |
A(dst));
184 return push_inst(compiler,
CLRLDI(dst, src2, 56));
187 return push_inst(compiler,
EXTSB |
S(src2) |
A(dst));
198 return push_inst(compiler,
EXTSH |
S(src2) |
A(dst));
199 return push_inst(compiler,
CLRLDI(dst, src2, 48));
231 return push_inst(compiler,
SRDI(32) |
S(dst) |
A(dst));
240 return push_inst(compiler,
ADDIS |
D(dst) |
A(src1) | compiler->imm);
245 FAIL_IF(push_inst(compiler,
ADDIS |
D(dst) |
A(src1) | (((imm >> 16) & 0xffff) + ((imm >> 15) & 0x1))));
249 return push_inst(compiler,
ADDI |
D(dst) |
A(src1) | (imm & 0xffff));
254 return push_inst(compiler,
ADDIC |
D(dst) |
A(src1) | compiler->imm);
258 FAIL_IF(push_inst(compiler,
ADDI |
D(dst) |
A(src1) | compiler->imm));
260 FAIL_IF(push_inst(compiler,
ADD |
D(dst) |
A(src1) |
B(src2)));
261 return push_inst(compiler,
CMPI |
A(dst) | 0);
264 return push_inst(compiler,
ADD |
D(dst) |
A(src1) |
B(src2));
268 return push_inst(compiler,
ADD |
RC(
flags) |
D(dst) |
A(src1) |
B(src2));
272 return push_inst(compiler,
ADDE |
D(dst) |
A(src1) |
B(src2));
280 return push_inst(compiler,
ADDI |
D(dst) |
A(src1) | (-compiler->imm & 0xffff));
285 return push_inst(compiler,
SUBF |
D(dst) |
A(src2) |
B(src1));
293 return push_inst(compiler,
ADDI |
D(dst) |
A(src1) | (-compiler->imm & 0xffff));
298 return push_inst(compiler,
SUBF |
D(dst) |
A(src2) |
B(src1));
320 return push_inst(compiler,
SRDI(32) |
S(dst) |
A(dst));
327 return push_inst(compiler,
SUBFIC |
D(dst) |
A(src1) | compiler->imm);
332 return push_inst(compiler,
SUBF |
D(dst) |
A(src2) |
B(src1));
345 return push_inst(compiler,
SUBFE |
D(dst) |
A(src2) |
B(src1));
350 return push_inst(compiler,
MULLI |
D(dst) |
A(src1) | compiler->imm);
360 return push_inst(compiler,
ANDI |
S(src1) |
A(dst) | compiler->imm);
364 return push_inst(compiler,
ANDIS |
S(src1) |
A(dst) | compiler->imm);
366 return push_inst(compiler,
AND |
RC(
flags) |
S(src1) |
A(dst) |
B(src2));
371 return push_inst(compiler,
ORI |
S(src1) |
A(dst) | compiler->imm);
375 return push_inst(compiler,
ORIS |
S(src1) |
A(dst) | compiler->imm);
382 return push_inst(compiler,
ORIS |
S(dst) |
A(dst) |
IMM(imm >> 16));
384 return push_inst(compiler,
OR |
RC(
flags) |
S(src1) |
A(dst) |
B(src2));
389 return push_inst(compiler,
XORI |
S(src1) |
A(dst) | compiler->imm);
393 return push_inst(compiler,
XORIS |
S(src1) |
A(dst) | compiler->imm);
400 return push_inst(compiler,
XORIS |
S(dst) |
A(dst) |
IMM(imm >> 16));
405 return push_inst(compiler,
NOR |
RC(
flags) |
S(src2) |
A(dst) |
B(src2));
407 return push_inst(compiler,
XOR |
RC(
flags) |
S(src1) |
A(dst) |
B(src2));
417 return push_inst(compiler,
SLWI(imm) |
RC(
flags) |
S(src1) |
A(dst));
421 return push_inst(compiler,
SLDI(imm) |
RC(
flags) |
S(src1) |
A(dst));
463 return push_inst(compiler,
SRAWI |
RC(
flags) |
S(src1) |
A(dst) | (imm << 11));
515 reg = *src & REG_MASK;
522 switch (arg_types & SLJIT_ARG_MASK) {
531 if (arg_count != word_arg_count && arg_count == reg) {
542 switch (
types & SLJIT_ARG_MASK) {
548 if (arg_count != word_arg_count)
549 FAIL_IF(push_inst(compiler,
OR |
S(word_arg_count) |
A(arg_count) |
B(word_arg_count)));
565 FAIL_IF(push_inst(compiler,
ORI |
S(reg) |
A(reg) |
IMM(init_value >> 32)));
567 FAIL_IF(push_inst(compiler,
ORIS |
S(reg) |
A(reg) |
IMM(init_value >> 16)));
568 return push_inst(compiler,
ORI |
S(reg) |
A(reg) |
IMM(init_value));
584 if (FAST_IS_REG(src))
591 if (FAST_IS_REG(src)) {
618 if (FAST_IS_REG(src))
638 FAIL_IF(push_inst(compiler,
BCx | (12 << 21) | (0 << 16) | 20));
680 CHECK(check_sljit_emit_fset64(compiler, freg,
value));
695 CHECK(check_sljit_emit_fcopy(compiler, op, freg, reg));
712 inst[0] = (inst[0] & 0xffff0000u) | ((
sljit_ins)(new_target >> 48) & 0xffff);
713 inst[1] = (inst[1] & 0xffff0000u) | ((
sljit_ins)(new_target >> 32) & 0xffff);
714 inst[3] = (inst[3] & 0xffff0000u) | ((
sljit_ins)(new_target >> 16) & 0xffff);
715 inst[4] = (inst[4] & 0xffff0000u) | ((
sljit_ins)new_target & 0xffff);
717 inst = (
sljit_ins *)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset);
#define SLJIT_UNREACHABLE()
#define SLJIT_API_FUNC_ATTRIBUTE
#define SLJIT_UNUSED_ARG(arg)
#define SLJIT_CACHE_FLUSH(from, to)
#define SLJIT_UPDATE_WX_FLAGS(from, to, enable_exec)
#define SLJIT_CONV_F64_FROM_S32
#define SLJIT_CONV_F64_FROM_U32
#define SLJIT_ARG_TYPE_F32
#define SLJIT_ARG_TYPE_F64
#define SLJIT_COPY_TO_F64
#define PUSH_SLDI_NEG(reg, shift)
#define CLRLDI(dst, src, n)
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_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)