Alien-LibJIT
view release on metacpan or search on metacpan
libjit/jit/jit-rules-x86.ins view on Meta::CPAN
fp_stack_index(gen, $2 + JIT_REG_STACK_START), 0);
}
}
}
JIT_OP_FREM, JIT_OP_DREM, JIT_OP_NFREM: stack
[freg, freg, scratch reg("eax")] -> {
unsigned char *label;
label = inst;
x86_fprem(inst);
x86_fnstsw(inst);
x86_alu_reg_imm(inst, X86_AND, X86_EAX, 0x0400);
x86_branch(inst, X86_CC_NZ, label, 0);
x86_fstp(inst, 1);
}
JIT_OP_FNEG, JIT_OP_DNEG, JIT_OP_NFNEG: stack
[freg] -> {
x86_fchs(inst);
}
/*
* Bitwise opcodes.
*/
JIT_OP_IAND: commutative
[reg, imm] -> {
x86_alu_reg_imm(inst, X86_AND, $1, $2);
}
[reg, local] -> {
x86_alu_reg_membase(inst, X86_AND, $1, X86_EBP, $2);
}
[reg, reg] -> {
x86_alu_reg_reg(inst, X86_AND, $1, $2);
}
JIT_OP_IOR: commutative
[reg, imm] -> {
x86_alu_reg_imm(inst, X86_OR, $1, $2);
}
[reg, local] -> {
x86_alu_reg_membase(inst, X86_OR, $1, X86_EBP, $2);
}
[reg, reg] -> {
x86_alu_reg_reg(inst, X86_OR, $1, $2);
}
JIT_OP_IXOR: commutative
[reg, imm] -> {
x86_alu_reg_imm(inst, X86_XOR, $1, $2);
}
[reg, local] -> {
x86_alu_reg_membase(inst, X86_XOR, $1, X86_EBP, $2);
}
[reg, reg] -> {
x86_alu_reg_reg(inst, X86_XOR, $1, $2);
}
JIT_OP_INOT:
[reg] -> {
x86_not_reg(inst, $1);
}
JIT_OP_ISHL:
[reg, imm] -> {
x86_shift_reg_imm(inst, X86_SHL, $1, ($2 & 0x1F));
}
[reg, reg("ecx")] -> {
x86_shift_reg(inst, X86_SHL, $1);
}
JIT_OP_ISHR:
[reg, imm] -> {
x86_shift_reg_imm(inst, X86_SAR, $1, ($2 & 0x1F));
}
[reg, reg("ecx")] -> {
x86_shift_reg(inst, X86_SAR, $1);
}
JIT_OP_ISHR_UN:
[reg, imm] -> {
x86_shift_reg_imm(inst, X86_SHR, $1, ($2 & 0x1F));
}
[reg, reg("ecx")] -> {
x86_shift_reg(inst, X86_SHR, $1);
}
JIT_OP_LAND: commutative
[lreg, imm] -> {
jit_int value1 = ((jit_int *)($2))[0];
jit_int value2 = ((jit_int *)($2))[1];
x86_alu_reg_imm(inst, X86_AND, $1, value1);
x86_alu_reg_imm(inst, X86_AND, %1, value2);
}
[lreg, local] -> {
x86_alu_reg_membase(inst, X86_AND, $1, X86_EBP, $2);
x86_alu_reg_membase(inst, X86_AND, %1, X86_EBP, $2 + 4);
}
[lreg, lreg] -> {
x86_alu_reg_reg(inst, X86_AND, $1, $2);
x86_alu_reg_reg(inst, X86_AND, %1, %2);
}
JIT_OP_LOR: commutative
[lreg, imm] -> {
jit_int value1 = ((jit_int *)($2))[0];
jit_int value2 = ((jit_int *)($2))[1];
x86_alu_reg_imm(inst, X86_OR, $1, value1);
x86_alu_reg_imm(inst, X86_OR, %1, value2);
}
[lreg, local] -> {
x86_alu_reg_membase(inst, X86_OR, $1, X86_EBP, $2);
x86_alu_reg_membase(inst, X86_OR, %1, X86_EBP, $2 + 4);
}
[lreg, lreg] -> {
x86_alu_reg_reg(inst, X86_OR, $1, $2);
x86_alu_reg_reg(inst, X86_OR, %1, %2);
}
JIT_OP_LXOR: commutative
[lreg, imm] -> {
jit_int value1 = ((jit_int *)($2))[0];
jit_int value2 = ((jit_int *)($2))[1];
x86_alu_reg_imm(inst, X86_XOR, $1, value1);
x86_alu_reg_imm(inst, X86_XOR, %1, value2);
}
[lreg, local] -> {
x86_alu_reg_membase(inst, X86_XOR, $1, X86_EBP, $2);
x86_alu_reg_membase(inst, X86_XOR, %1, X86_EBP, $2 + 4);
}
[lreg, lreg] -> {
x86_alu_reg_reg(inst, X86_XOR, $1, $2);
x86_alu_reg_reg(inst, X86_XOR, %1, %2);
}
JIT_OP_LNOT:
[lreg] -> {
x86_not_reg(inst, $1);
x86_not_reg(inst, %1);
}
/*
* Branch opcodes.
*/
JIT_OP_BR: branch
[] -> {
inst = output_branch(func, inst, 0xEB /* jmp */, insn);
}
JIT_OP_BR_IFALSE: branch
[reg] -> {
x86_alu_reg_reg(inst, X86_OR, $1, $1);
inst = output_branch(func, inst, 0x74 /* eq */, insn);
}
JIT_OP_BR_ITRUE: branch
[reg] -> {
x86_alu_reg_reg(inst, X86_OR, $1, $1);
inst = output_branch(func, inst, 0x75 /* ne */, insn);
}
JIT_OP_BR_IEQ: branch
[reg, immzero] -> {
x86_alu_reg_reg(inst, X86_OR, $1, $1);
inst = output_branch(func, inst, 0x74 /* eq */, insn);
}
[reg, imm] -> {
x86_alu_reg_imm(inst, X86_CMP, $1, $2);
inst = output_branch(func, inst, 0x74 /* eq */, insn);
}
[reg, local] -> {
x86_alu_reg_membase(inst, X86_CMP, $1, X86_EBP, $2);
inst = output_branch(func, inst, 0x74 /* eq */, insn);
}
[reg, reg] -> {
x86_alu_reg_reg(inst, X86_CMP, $1, $2);
inst = output_branch(func, inst, 0x74 /* eq */, insn);
}
JIT_OP_BR_INE: branch
[reg, immzero] -> {
x86_alu_reg_reg(inst, X86_OR, $1, $1);
inst = output_branch(func, inst, 0x75 /* ne */, insn);
}
[reg, imm] -> {
x86_alu_reg_imm(inst, X86_CMP, $1, $2);
inst = output_branch(func, inst, 0x75 /* ne */, insn);
}
[reg, local] -> {
x86_alu_reg_membase(inst, X86_CMP, $1, X86_EBP, $2);
inst = output_branch(func, inst, 0x75 /* ne */, insn);
}
[reg, reg] -> {
x86_alu_reg_reg(inst, X86_CMP, $1, $2);
inst = output_branch(func, inst, 0x75 /* ne */, insn);
}
JIT_OP_BR_ILT: branch
( run in 0.542 second using v1.01-cache-2.11-cpan-63c85eba8c4 )