Alien-LibJIT

 view release on metacpan or  search on metacpan

libjit/jit/jit-rules-x86-64.ins  view on Meta::CPAN

JIT_OP_DNEG:
	[xreg] -> {
		/* Simply toggle the sign */
		jit_ulong values[2] = {0x8000000000000000, 0x8000000000000000};

		_jit_plopd_reg_imm(gen, &inst, XMM_XORP, $1, &(values[0]));
	}

/*
 * native float versions
 */
JIT_OP_NFABS: stack
	[freg] -> {
		x86_64_fabs(inst);
	}

JIT_OP_NFNEG:  stack
	[freg] -> {
		x86_64_fchs(inst);
	}

/*
 * Bitwise opcodes.
 */

JIT_OP_IAND: commutative
	[reg, imm] -> {
		x86_64_and_reg_imm_size(inst, $1, $2, 4);
	}
	[reg, local] -> {
		x86_64_and_reg_membase_size(inst, $1, X86_64_RBP, $2, 4);
	}
	[reg, reg] -> {
		x86_64_and_reg_reg_size(inst, $1, $2, 4);
	}

JIT_OP_IOR: commutative
	[reg, imm] -> {
		x86_64_or_reg_imm_size(inst, $1, $2, 4);
	}
	[reg, local] -> {
		x86_64_or_reg_membase_size(inst, $1, X86_64_RBP, $2, 4);
	}
	[reg, reg] -> {
		x86_64_or_reg_reg_size(inst, $1, $2, 4);
	}

JIT_OP_IXOR: commutative
	[reg, imm] -> {
		x86_64_xor_reg_imm_size(inst, $1, $2, 4);
	}
	[reg, local] -> {
		x86_64_xor_reg_membase_size(inst, $1, X86_64_RBP, $2, 4);
	}
	[reg, reg] -> {
		x86_64_xor_reg_reg_size(inst, $1, $2, 4);
	}

JIT_OP_INOT:
	[reg] -> {
		x86_64_not_reg_size(inst, $1, 4);
	}

JIT_OP_ISHL:
	[reg, imm] -> {
		x86_64_shl_reg_imm_size(inst, $1, ($2 & 0x1F), 4);
	}
	[sreg, reg("rcx")] -> {
		x86_64_shl_reg_size(inst, $1, 4);
	}

JIT_OP_ISHR:
	[reg, imm] -> {
		x86_64_sar_reg_imm_size(inst, $1, ($2 & 0x1F), 4);
	}
	[sreg, reg("rcx")] -> {
		x86_64_sar_reg_size(inst, $1, 4);
	}

JIT_OP_ISHR_UN:
	[reg, imm] -> {
		x86_64_shr_reg_imm_size(inst, $1, ($2 & 0x1F), 4);
	}
	[sreg, reg("rcx")] -> {
		x86_64_shr_reg_size(inst, $1, 4);
	}

JIT_OP_LAND: commutative
	[reg, imms32] -> {
		x86_64_and_reg_imm_size(inst, $1, $2, 8);
	}
	[reg, local] -> {
		x86_64_and_reg_membase_size(inst, $1, X86_64_RBP, $2, 8);
	}
	[reg, reg] -> {
		x86_64_and_reg_reg_size(inst, $1, $2, 8);
	}

JIT_OP_LOR: commutative
	[reg, imms32] -> {
		x86_64_or_reg_imm_size(inst, $1, $2, 8);
	}
	[reg, local] -> {
		x86_64_or_reg_membase_size(inst, $1, X86_64_RBP, $2, 8);
	}
	[reg, reg] -> {
		x86_64_or_reg_reg_size(inst, $1, $2, 8);
	}

JIT_OP_LXOR: commutative
	[reg, imms32] -> {
		x86_64_xor_reg_imm_size(inst, $1, $2, 8);
	}
	[reg, local] -> {
		x86_64_xor_reg_membase_size(inst, $1, X86_64_RBP, $2, 8);
	}
	[reg, reg] -> {
		x86_64_xor_reg_reg_size(inst, $1, $2, 8);
	}

JIT_OP_LNOT:
	[reg] -> {
		x86_64_not_reg_size(inst, $1, 8);
	}

JIT_OP_LSHL:
	[reg, imm] -> {
		x86_64_shl_reg_imm_size(inst, $1, ($2 & 0x3F), 8);
	}
	[sreg, reg("rcx")] -> {
		x86_64_shl_reg_size(inst, $1, 8);
	}

JIT_OP_LSHR:
	[reg, imm] -> {
		x86_64_sar_reg_imm_size(inst, $1, ($2 & 0x3F), 8);
	}
	[sreg, reg("rcx")] -> {
		x86_64_sar_reg_size(inst, $1, 8);
	}

JIT_OP_LSHR_UN:
	[reg, imm] -> {
		x86_64_shr_reg_imm_size(inst, $1, ($2 & 0x3F), 8);
	}
	[sreg, reg("rcx")] -> {
		x86_64_shr_reg_size(inst, $1, 8);
	}

/*
 * Branch opcodes.
 */

JIT_OP_BR: branch
	[] -> {
		inst = output_branch(func, inst, 0xEB /* jmp */, insn);
	}

JIT_OP_BR_IFALSE: branch
	[reg] -> {
		x86_64_test_reg_reg_size(inst, $1, $1, 4);
		inst = output_branch(func, inst, 0x74 /* eq */, insn);
	}

JIT_OP_BR_ITRUE: branch
	[reg] -> {
		x86_64_test_reg_reg_size(inst, $1, $1, 4);
		inst = output_branch(func, inst, 0x75 /* ne */, insn);
	}

JIT_OP_BR_IEQ: branch, commutative
	[reg, immzero] -> {
		x86_64_test_reg_reg_size(inst, $1, $1, 4);
		inst = output_branch(func, inst, 0x74 /* eq */, insn);
	}
	[reg, imm] -> {
		x86_64_cmp_reg_imm_size(inst, $1, $2, 4);
		inst = output_branch(func, inst, 0x74 /* eq */, insn);
	}
	[reg, local] -> {
		x86_64_cmp_reg_membase_size(inst, $1, X86_64_RBP, $2, 4);
		inst = output_branch(func, inst, 0x74 /* eq */, insn);
	}



( run in 0.413 second using v1.01-cache-2.11-cpan-63c85eba8c4 )