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) )
32 #elif defined(__xlc__)
33 #error "Please enable GCC syntax for inline assembly statements"
35 #error "Must implement count leading zeroes"
38 #define PUSH_RLDICR(reg, shift) \
39 push_inst(compiler, RLDI(reg, reg, 63 - shift, shift, 1))
48 if (imm <= SIMM_MAX && imm >=
SIMM_MIN)
49 return push_inst(compiler,
ADDI |
D(reg) |
A(0) |
IMM(imm));
54 if (imm <= 0x7fffffffl && imm >= -0x80000000l) {
60 tmp = (
sljit_uw)((imm >= 0) ? imm : ~imm);
61 ASM_SLJIT_CLZ(tmp,
shift);
66 if ((tmp & ~0xffff000000000000ul) == 0) {
72 if ((tmp & ~0xffffffff00000000ul) == 0) {
86 return push_inst(compiler,
ORI |
S(reg) |
A(reg) | (
sljit_ins)tmp2);
89 if (tmp2 <= 0xffffffff) {
96 ASM_SLJIT_CLZ(tmp2, shift2);
99 if ((tmp2 & ~0xffff000000000000ul) == 0) {
102 shift += (63 - shift2);
113 return push_inst(compiler,
ORI |
S(reg) |
A(reg) |
IMM(imm));
117 #define INS_CLEAR_LEFT(dst, src, from) \
118 (RLDICL | S(src) | A(dst) | ((from) << 6) | (1 << 5))
122 if ((flags & (ALT_SIGN_EXT | REG2_SOURCE)) == (ALT_SIGN_EXT | REG2_SOURCE)) { \
123 FAIL_IF(push_inst(compiler, EXTSW | S(src2) | A(TMP_REG2))); \
128 if (flags & ALT_SIGN_EXT) { \
129 if (flags & REG1_SOURCE) { \
130 FAIL_IF(push_inst(compiler, EXTSW | S(src1) | A(TMP_REG1))); \
133 if (flags & REG2_SOURCE) { \
134 FAIL_IF(push_inst(compiler, EXTSW | S(src2) | A(TMP_REG2))); \
139 #define BIN_IMM_EXTS() \
140 if ((flags & (ALT_SIGN_EXT | REG1_SOURCE)) == (ALT_SIGN_EXT | REG1_SOURCE)) { \
141 FAIL_IF(push_inst(compiler, EXTSW | S(src1) | A(TMP_REG1))); \
153 return push_inst(compiler,
OR |
S(src2) |
A(
dst) |
B(src2));
161 return push_inst(compiler,
EXTSW |
S(src2) |
A(
dst));
174 return push_inst(compiler,
EXTSB |
S(src2) |
A(
dst));
178 return push_inst(compiler,
EXTSB |
S(src2) |
A(
dst));
189 return push_inst(compiler,
EXTSH |
S(src2) |
A(
dst));
205 return push_inst(compiler,
CNTLZW |
S(src2) |
A(
dst));
206 return push_inst(compiler,
CNTLZD |
S(src2) |
A(
dst));
219 return push_inst(compiler,
RLDI(
dst,
dst, 32, 32, 0));
228 return push_inst(compiler,
ADDIS |
D(
dst) |
A(src1) | compiler->imm);
231 FAIL_IF(push_inst(compiler,
ADDIS |
D(
dst) |
A(src1) | (((compiler->imm >> 16) & 0xffff) + ((compiler->imm >> 15) & 0x1))));
235 return push_inst(compiler,
ADDI |
D(
dst) |
A(src1) | (compiler->imm & 0xffff));
240 return push_inst(compiler,
ADDIC |
D(
dst) |
A(src1) | compiler->imm);
247 return push_inst(compiler,
CMPI |
A(
dst) | 0);
250 return push_inst(compiler,
ADD |
D(
dst) |
A(src1) |
B(src2));
258 return push_inst(compiler,
ADDE |
D(
dst) |
A(src1) |
B(src2));
266 return push_inst(compiler,
ADDI |
D(
dst) |
A(src1) | (-compiler->imm & 0xffff));
271 return push_inst(compiler,
SUBF |
D(
dst) |
A(src2) |
B(src1));
279 return push_inst(compiler,
ADDI |
D(
dst) |
A(src1) | (-compiler->imm & 0xffff));
284 return push_inst(compiler,
SUBF |
D(
dst) |
A(src2) |
B(src1));
306 return push_inst(compiler,
RLDI(
dst,
dst, 32, 32, 0));
313 return push_inst(compiler,
SUBFIC |
D(
dst) |
A(src1) | compiler->imm);
318 return push_inst(compiler,
SUBF |
D(
dst) |
A(src2) |
B(src1));
331 return push_inst(compiler,
SUBFE |
D(
dst) |
A(src2) |
B(src1));
336 return push_inst(compiler,
MULLI |
D(
dst) |
A(src1) | compiler->imm);
346 return push_inst(compiler,
ANDI |
S(src1) |
A(
dst) | compiler->imm);
350 return push_inst(compiler,
ANDIS |
S(src1) |
A(
dst) | compiler->imm);
357 return push_inst(compiler,
ORI |
S(src1) |
A(
dst) | compiler->imm);
361 return push_inst(compiler,
ORIS |
S(src1) |
A(
dst) | compiler->imm);
366 return push_inst(compiler,
ORIS |
S(
dst) |
A(
dst) |
IMM(compiler->imm >> 16));
368 return push_inst(compiler,
OR |
RC(
flags) |
S(src1) |
A(
dst) |
B(src2));
373 return push_inst(compiler,
XORI |
S(src1) |
A(
dst) | compiler->imm);
377 return push_inst(compiler,
XORIS |
S(src1) |
A(
dst) | compiler->imm);
382 return push_inst(compiler,
XORIS |
S(
dst) |
A(
dst) |
IMM(compiler->imm >> 16));
390 compiler->imm &= 0x1f;
391 return push_inst(compiler,
RLWINM |
RC(
flags) |
S(src1) |
A(
dst) | (compiler->imm << 11) | ((31 - compiler->imm) << 1));
393 compiler->imm &= 0x3f;
394 return push_inst(compiler,
RLDI(
dst, src1, compiler->imm, 63 - compiler->imm, 1) |
RC(
flags));
402 compiler->imm &= 0x1f;
403 return push_inst(compiler,
RLWINM |
RC(
flags) |
S(src1) |
A(
dst) | (((32 - compiler->imm) & 0x1f) << 11) | (compiler->imm << 6) | (31 << 1));
405 compiler->imm &= 0x3f;
406 return push_inst(compiler,
RLDI(
dst, src1, 64 - compiler->imm, compiler->imm, 0) |
RC(
flags));
414 compiler->imm &= 0x1f;
415 return push_inst(compiler,
SRAWI |
RC(
flags) |
S(src1) |
A(
dst) | (compiler->imm << 11));
417 compiler->imm &= 0x3f;
418 return push_inst(compiler,
SRADI |
RC(
flags) |
S(src1) |
A(
dst) | ((compiler->imm & 0x1f) << 11) | ((compiler->imm & 0x20) >> 4));
435 reg = *
src & REG_MASK;
442 switch (arg_types & SLJIT_ARG_MASK) {
451 if (arg_count != word_arg_count && arg_count == reg) {
462 switch (
types & SLJIT_ARG_MASK) {
468 if (arg_count != word_arg_count)
469 FAIL_IF(push_inst(compiler,
OR |
S(word_arg_count) |
A(arg_count) |
B(word_arg_count)));
485 FAIL_IF(push_inst(compiler,
ORI |
S(reg) |
A(reg) |
IMM(init_value >> 32)));
487 FAIL_IF(push_inst(compiler,
ORIS |
S(reg) |
A(reg) |
IMM(init_value >> 16)));
488 return push_inst(compiler,
ORI |
S(reg) |
A(reg) |
IMM(init_value));
497 inst[0] = (inst[0] & 0xffff0000u) | ((
sljit_ins)(new_target >> 48) & 0xffff);
498 inst[1] = (inst[1] & 0xffff0000u) | ((
sljit_ins)(new_target >> 32) & 0xffff);
499 inst[3] = (inst[3] & 0xffff0000u) | ((
sljit_ins)(new_target >> 16) & 0xffff);
500 inst[4] = (inst[4] & 0xffff0000u) | ((
sljit_ins)new_target & 0xffff);
502 inst = (
sljit_ins *)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset);
set set set set set set set macro pixldst1 op
GLsizei GLenum GLenum * types
#define SLJIT_UNREACHABLE()
#define SLJIT_API_FUNC_ATTRIBUTE
#define SLJIT_UNUSED_ARG(arg)
unsigned long int sljit_uw
#define SLJIT_CACHE_FLUSH(from, to)
#define SLJIT_UPDATE_WX_FLAGS(from, to, enable_exec)
#define SLJIT_ARG_TYPE_F32
#define SLJIT_ARG_TYPE_F64
#define PUSH_RLDICR(reg, shift)
SLJIT_API_FUNC_ATTRIBUTE void sljit_set_const(sljit_uw addr, sljit_sw new_constant, sljit_sw executable_offset)
SLJIT_API_FUNC_ATTRIBUTE void sljit_set_jump_addr(sljit_uw addr, sljit_uw new_target, sljit_sw executable_offset)
#define INS_CLEAR_LEFT(dst, src, from)
#define RLDI(dst, src, sh, mb, type)