mirror of
https://github.com/RPCS3/asmjit.git
synced 2026-07-18 18:34:26 -04:00
Added ASMJIT_FALL_THROUGH to better deal with switch/case
Replaced ASSERTs by runtime checks in X86Compiler intrinsics
This commit is contained in:
@@ -716,6 +716,16 @@
|
||||
#endif
|
||||
// [@CC_EXPECT}@]
|
||||
|
||||
// [@CC_FALL_THROUGH{@]
|
||||
// \def ASMJIT_FALL_THROUGH
|
||||
// The code falls through annotation (switch / case).
|
||||
#if ASMJIT_CC_CLANG_GE(3, 3, 0)
|
||||
# define ASMJIT_FALL_THROUGH [[clang::fallthrough]]
|
||||
#else
|
||||
# define ASMJIT_FALL_THROUGH (void)0
|
||||
#endif
|
||||
// [@CC_FALL_THROUGH}@]
|
||||
|
||||
// [@CC_UNUSED{@]
|
||||
// \def ASMJIT_UNUSED(x)
|
||||
// Mark a variable x as unused.
|
||||
|
||||
@@ -660,7 +660,7 @@ static void X86Assembler_dumpRegister(StringBuilder& sb, uint32_t type, uint32_t
|
||||
goto _EmitNE;
|
||||
|
||||
index -= 4;
|
||||
// ... Fall through ...
|
||||
ASMJIT_FALL_THROUGH;
|
||||
|
||||
case kX86RegTypeGpbHi:
|
||||
if (index >= 4)
|
||||
@@ -1060,14 +1060,14 @@ static ASMJIT_INLINE Error X86Assembler_emit(Assembler* self_, uint32_t code, co
|
||||
|
||||
case kX86InstEncodingIdX86Op_66H:
|
||||
ADD_66H_P(true);
|
||||
// ... Fall through ...
|
||||
ASMJIT_FALL_THROUGH;
|
||||
|
||||
case kX86InstEncodingIdX86Op:
|
||||
goto _EmitX86Op;
|
||||
|
||||
case kX86InstEncodingIdX86Rm_B:
|
||||
opCode += o0->getSize() != 1;
|
||||
// ... Fall through ...
|
||||
ASMJIT_FALL_THROUGH;
|
||||
|
||||
case kX86InstEncodingIdX86Rm:
|
||||
ADD_66H_P_BY_SIZE(o0->getSize());
|
||||
@@ -1857,7 +1857,7 @@ static ASMJIT_INLINE Error X86Assembler_emit(Assembler* self_, uint32_t code, co
|
||||
EMIT_BYTE(imLen == 1 ? 0x6A : 0x68);
|
||||
goto _EmitImm;
|
||||
}
|
||||
// ... Fall through ...
|
||||
ASMJIT_FALL_THROUGH;
|
||||
|
||||
case kX86InstEncodingIdX86Pop:
|
||||
if (encoded == ENC_OPS(Reg, None, None)) {
|
||||
@@ -2104,7 +2104,7 @@ _GroupPop_Gp:
|
||||
rmMem = x86OpMem(o1);
|
||||
goto _EmitX86M;
|
||||
}
|
||||
// ... Fall through ...
|
||||
ASMJIT_FALL_THROUGH;
|
||||
|
||||
case kX86InstEncodingIdX86Xadd:
|
||||
if (encoded == ENC_OPS(Reg, Reg, None)) {
|
||||
@@ -2257,7 +2257,7 @@ _EmitFpArith_Mem:
|
||||
opCode += 1;
|
||||
goto _EmitFpuOp;
|
||||
}
|
||||
// ... Fall through ...
|
||||
ASMJIT_FALL_THROUGH;
|
||||
|
||||
case kX86InstEncodingIdFpuR:
|
||||
if (encoded == ENC_OPS(Reg, None, None)) {
|
||||
@@ -2564,11 +2564,11 @@ _EmitMmMovD:
|
||||
|
||||
case kX86InstEncodingIdExtRm_PQ:
|
||||
ADD_66H_P(o0->isRegType(kX86RegTypeXmm) || o1->isRegType(kX86RegTypeXmm));
|
||||
// ... Fall through ...
|
||||
ASMJIT_FALL_THROUGH;
|
||||
|
||||
case kX86InstEncodingIdExtRm_Q:
|
||||
ADD_REX_W(o0->isRegType(kX86RegTypeGpq) || o1->isRegType(kX86RegTypeGpq) || (o1->isMem() && o1->getSize() == 8));
|
||||
// ... Fall through ...
|
||||
ASMJIT_FALL_THROUGH;
|
||||
|
||||
case kX86InstEncodingIdExtRm:
|
||||
if (encoded == ENC_OPS(Reg, Reg, None)) {
|
||||
@@ -2780,7 +2780,7 @@ _EmitMmMovD:
|
||||
|
||||
case kX86InstEncodingIdAvxMr_P:
|
||||
ADD_VEX_L(x86IsYmm(o0) | x86IsYmm(o1));
|
||||
// ... Fall through ...
|
||||
ASMJIT_FALL_THROUGH;
|
||||
|
||||
case kX86InstEncodingIdAvxMr:
|
||||
if (encoded == ENC_OPS(Reg, Reg, None)) {
|
||||
@@ -2798,7 +2798,7 @@ _EmitMmMovD:
|
||||
|
||||
case kX86InstEncodingIdAvxMri_P:
|
||||
ADD_VEX_L(x86IsYmm(o0) | x86IsYmm(static_cast<const X86Reg*>(o1)));
|
||||
// ... Fall through ...
|
||||
ASMJIT_FALL_THROUGH;
|
||||
|
||||
case kX86InstEncodingIdAvxMri:
|
||||
imVal = static_cast<const Imm*>(o2)->getInt64();
|
||||
@@ -2819,7 +2819,7 @@ _EmitMmMovD:
|
||||
|
||||
case kX86InstEncodingIdAvxRm_P:
|
||||
ADD_VEX_L(x86IsYmm(static_cast<const X86Reg*>(o0)) | x86IsYmm(o1));
|
||||
// ... Fall through ...
|
||||
ASMJIT_FALL_THROUGH;
|
||||
|
||||
case kX86InstEncodingIdAvxRm:
|
||||
if (encoded == ENC_OPS(Reg, Reg, None)) {
|
||||
@@ -2837,7 +2837,7 @@ _EmitMmMovD:
|
||||
|
||||
case kX86InstEncodingIdAvxRmi_P:
|
||||
ADD_VEX_L(x86IsYmm(static_cast<const X86Reg*>(o0)) | x86IsYmm(o1));
|
||||
// ... Fall through ...
|
||||
ASMJIT_FALL_THROUGH;
|
||||
|
||||
case kX86InstEncodingIdAvxRmi:
|
||||
imVal = static_cast<const Imm*>(o2)->getInt64();
|
||||
@@ -2858,7 +2858,7 @@ _EmitMmMovD:
|
||||
|
||||
case kX86InstEncodingIdAvxRvm_P:
|
||||
ADD_VEX_L(x86IsYmm(static_cast<const X86Reg*>(o0)) | x86IsYmm(static_cast<const X86Reg*>(o1)));
|
||||
// ... Fall through ...
|
||||
ASMJIT_FALL_THROUGH;
|
||||
|
||||
case kX86InstEncodingIdAvxRvm:
|
||||
if (encoded == ENC_OPS(Reg, Reg, Reg)) {
|
||||
@@ -2877,7 +2877,7 @@ _EmitAvxRvm:
|
||||
|
||||
case kX86InstEncodingIdAvxRvmr_P:
|
||||
ADD_VEX_L(x86IsYmm(static_cast<const X86Reg*>(o0)) | x86IsYmm(static_cast<const X86Reg*>(o1)));
|
||||
// ... Fall through ...
|
||||
ASMJIT_FALL_THROUGH;
|
||||
|
||||
case kX86InstEncodingIdAvxRvmr:
|
||||
if (!o3->isReg())
|
||||
@@ -2901,7 +2901,7 @@ _EmitAvxRvm:
|
||||
|
||||
case kX86InstEncodingIdAvxRvmi_P:
|
||||
ADD_VEX_L(x86IsYmm(static_cast<const X86Reg*>(o0)) | x86IsYmm(static_cast<const X86Reg*>(o1)));
|
||||
// ... Fall through ...
|
||||
ASMJIT_FALL_THROUGH;
|
||||
|
||||
case kX86InstEncodingIdAvxRvmi:
|
||||
if (!o3->isImm())
|
||||
@@ -2977,7 +2977,7 @@ _EmitAvxRvm:
|
||||
|
||||
case kX86InstEncodingIdAvxRmMr_P:
|
||||
ADD_VEX_L(x86IsYmm(o0) | x86IsYmm(o1));
|
||||
// ... Fall through ...
|
||||
ASMJIT_FALL_THROUGH;
|
||||
|
||||
case kX86InstEncodingIdAvxRmMr:
|
||||
if (encoded == ENC_OPS(Reg, Reg, None)) {
|
||||
@@ -3006,7 +3006,7 @@ _AvxRmMr_AfterRegRegCheck:
|
||||
|
||||
case kX86InstEncodingIdAvxRvmRmi_P:
|
||||
ADD_VEX_L(x86IsYmm(static_cast<const X86Reg*>(o0)) | x86IsYmm(o1));
|
||||
// ... Fall through ...
|
||||
ASMJIT_FALL_THROUGH;
|
||||
|
||||
case kX86InstEncodingIdAvxRvmRmi:
|
||||
if (encoded == ENC_OPS(Reg, Reg, Reg)) {
|
||||
@@ -3072,7 +3072,7 @@ _AvxRmMr_AfterRegRegCheck:
|
||||
|
||||
case kX86InstEncodingIdAvxRvmMvr_P:
|
||||
ADD_VEX_L(x86IsYmm(o0) | x86IsYmm(o1));
|
||||
// ... Fall through ...
|
||||
ASMJIT_FALL_THROUGH;
|
||||
|
||||
case kX86InstEncodingIdAvxRvmMvr:
|
||||
if (encoded == ENC_OPS(Reg, Reg, Reg)) {
|
||||
@@ -3100,7 +3100,7 @@ _AvxRmMr_AfterRegRegCheck:
|
||||
|
||||
case kX86InstEncodingIdAvxRvmVmi_P:
|
||||
ADD_VEX_L(x86IsYmm(static_cast<const X86Reg*>(o0)) | x86IsYmm(o1));
|
||||
// ... Fall through ...
|
||||
ASMJIT_FALL_THROUGH;
|
||||
|
||||
case kX86InstEncodingIdAvxRvmVmi:
|
||||
if (encoded == ENC_OPS(Reg, Reg, Reg)) {
|
||||
@@ -3152,7 +3152,7 @@ _AvxRmMr_AfterRegRegCheck:
|
||||
|
||||
case kX86InstEncodingIdAvxVmi_P:
|
||||
ADD_VEX_L(x86IsYmm(static_cast<const X86Reg*>(o0)) | x86IsYmm(o1));
|
||||
// ... Fall through ...
|
||||
ASMJIT_FALL_THROUGH;
|
||||
|
||||
case kX86InstEncodingIdAvxVmi:
|
||||
imVal = static_cast<const Imm*>(o3)->getInt64();
|
||||
@@ -3173,7 +3173,7 @@ _AvxRmMr_AfterRegRegCheck:
|
||||
|
||||
case kX86InstEncodingIdAvxRvrmRvmr_P:
|
||||
ADD_VEX_L(x86IsYmm(static_cast<const X86Reg*>(o0)) | x86IsYmm(static_cast<const X86Reg*>(o1)));
|
||||
// ... Fall through ...
|
||||
ASMJIT_FALL_THROUGH;
|
||||
|
||||
case kX86InstEncodingIdAvxRvrmRvmr:
|
||||
if (encoded == ENC_OPS(Reg, Reg, Reg) && o3->isReg()) {
|
||||
@@ -3262,7 +3262,7 @@ _AvxRmMr_AfterRegRegCheck:
|
||||
case kX86InstEncodingIdFma4_P:
|
||||
// It's fine to just check the first operand, second is just for sanity.
|
||||
ADD_VEX_L(x86IsYmm(static_cast<const X86Reg*>(o0)) | x86IsYmm(static_cast<const X86Reg*>(o1)));
|
||||
// ... Fall through ...
|
||||
ASMJIT_FALL_THROUGH;
|
||||
|
||||
case kX86InstEncodingIdFma4:
|
||||
if (encoded == ENC_OPS(Reg, Reg, Reg) && o3->isReg()) {
|
||||
@@ -3303,7 +3303,7 @@ _AvxRmMr_AfterRegRegCheck:
|
||||
|
||||
case kX86InstEncodingIdXopRm_P:
|
||||
ADD_VEX_L(x86IsYmm(static_cast<const X86Reg*>(o0)) | x86IsYmm(o1));
|
||||
// ... Fall through ...
|
||||
ASMJIT_FALL_THROUGH;
|
||||
|
||||
case kX86InstEncodingIdXopRm:
|
||||
if (encoded == ENC_OPS(Reg, Reg, None)) {
|
||||
@@ -3387,7 +3387,7 @@ _AvxRmMr_AfterRegRegCheck:
|
||||
|
||||
case kX86InstEncodingIdXopRvmr_P:
|
||||
ADD_VEX_L(x86IsYmm(static_cast<const X86Reg*>(o0)) | x86IsYmm(static_cast<const X86Reg*>(o1)));
|
||||
// ... Fall through ...
|
||||
ASMJIT_FALL_THROUGH;
|
||||
|
||||
case kX86InstEncodingIdXopRvmr:
|
||||
if (!o3->isReg())
|
||||
@@ -3411,7 +3411,7 @@ _AvxRmMr_AfterRegRegCheck:
|
||||
|
||||
case kX86InstEncodingIdXopRvmi_P:
|
||||
ADD_VEX_L(x86IsYmm(static_cast<const X86Reg*>(o0)) | x86IsYmm(static_cast<const X86Reg*>(o1)));
|
||||
// ... Fall through ...
|
||||
ASMJIT_FALL_THROUGH;
|
||||
|
||||
case kX86InstEncodingIdXopRvmi:
|
||||
if (!o3->isImm())
|
||||
@@ -3435,7 +3435,7 @@ _AvxRmMr_AfterRegRegCheck:
|
||||
|
||||
case kX86InstEncodingIdXopRvrmRvmr_P:
|
||||
ADD_VEX_L(x86IsYmm(static_cast<const X86Reg*>(o0)) | x86IsYmm(static_cast<const X86Reg*>(o1)));
|
||||
// ... Fall through ...
|
||||
ASMJIT_FALL_THROUGH;
|
||||
|
||||
case kX86InstEncodingIdXopRvrmRvmr:
|
||||
if (encoded == ENC_OPS(Reg, Reg, Reg) && o3->isReg()) {
|
||||
|
||||
+76
-114
@@ -1273,12 +1273,6 @@ struct ASMJIT_VIRTAPI X86Compiler : public Compiler {
|
||||
return emit(_Code_, o0); \
|
||||
}
|
||||
|
||||
#define INST_1x_(_Inst_, _Code_, _Op0_, _Cond_) \
|
||||
ASMJIT_INLINE HLInst* _Inst_(const _Op0_& o0) { \
|
||||
ASMJIT_ASSERT(_Cond_); \
|
||||
return emit(_Code_, o0); \
|
||||
}
|
||||
|
||||
#define INST_1i(_Inst_, _Code_, _Op0_) \
|
||||
ASMJIT_INLINE HLInst* _Inst_(const _Op0_& o0) { \
|
||||
return emit(_Code_, o0); \
|
||||
@@ -1341,12 +1335,6 @@ struct ASMJIT_VIRTAPI X86Compiler : public Compiler {
|
||||
return emit(_Code_, o0, o1); \
|
||||
}
|
||||
|
||||
#define INST_2x_(_Inst_, _Code_, _Op0_, _Op1_, _Cond_) \
|
||||
ASMJIT_INLINE HLInst* _Inst_(const _Op0_& o0, const _Op1_& o1) { \
|
||||
ASMJIT_ASSERT(_Cond_); \
|
||||
return emit(_Code_, o0, o1); \
|
||||
}
|
||||
|
||||
#define INST_2i(_Inst_, _Code_, _Op0_, _Op1_) \
|
||||
ASMJIT_INLINE HLInst* _Inst_(const _Op0_& o0, const _Op1_& o1) { \
|
||||
return emit(_Code_, o0, o1); \
|
||||
@@ -1409,12 +1397,6 @@ struct ASMJIT_VIRTAPI X86Compiler : public Compiler {
|
||||
return emit(_Code_, o0, o1, o2); \
|
||||
}
|
||||
|
||||
#define INST_3x_(_Inst_, _Code_, _Op0_, _Op1_, _Op2_, _Cond_) \
|
||||
ASMJIT_INLINE HLInst* _Inst_(const _Op0_& o0, const _Op1_& o1, const _Op2_& o2) { \
|
||||
ASMJIT_ASSERT(_Cond_); \
|
||||
return emit(_Code_, o0, o1, o2); \
|
||||
}
|
||||
|
||||
#define INST_3i(_Inst_, _Code_, _Op0_, _Op1_, _Op2_) \
|
||||
ASMJIT_INLINE HLInst* _Inst_(const _Op0_& o0, const _Op1_& o1, const _Op2_& o2) { \
|
||||
return emit(_Code_, o0, o1, o2); \
|
||||
@@ -1466,12 +1448,6 @@ struct ASMJIT_VIRTAPI X86Compiler : public Compiler {
|
||||
return emit(_Code_, o0, o1, o2, o3); \
|
||||
}
|
||||
|
||||
#define INST_4x_(_Inst_, _Code_, _Op0_, _Op1_, _Op2_, _Cond_) \
|
||||
ASMJIT_INLINE HLInst* _Inst_(const _Op0_& o0, const _Op1_& o1, const _Op2_& o2, const _Op3_& o3) { \
|
||||
ASMJIT_ASSERT(_Cond_); \
|
||||
return emit(_Code_, o0, o1, o2, o3); \
|
||||
}
|
||||
|
||||
#define INST_4i(_Inst_, _Code_, _Op0_, _Op1_, _Op2_) \
|
||||
ASMJIT_INLINE HLInst* _Inst_(const _Op0_& o0, const _Op1_& o1, const _Op2_& o2, const _Op3_& o3) { \
|
||||
return emit(_Code_, o0, o1, o2, o3); \
|
||||
@@ -1556,17 +1532,17 @@ struct ASMJIT_VIRTAPI X86Compiler : public Compiler {
|
||||
INST_2i(and_, kX86InstIdAnd, X86Mem, Imm)
|
||||
|
||||
//! Bit scan forward.
|
||||
INST_2x_(bsf, kX86InstIdBsf, X86GpVar, X86GpVar, !o0.isGpb())
|
||||
INST_2x(bsf, kX86InstIdBsf, X86GpVar, X86GpVar)
|
||||
//! \overload
|
||||
INST_2x_(bsf, kX86InstIdBsf, X86GpVar, X86Mem, !o0.isGpb())
|
||||
INST_2x(bsf, kX86InstIdBsf, X86GpVar, X86Mem)
|
||||
|
||||
//! Bit scan reverse.
|
||||
INST_2x_(bsr, kX86InstIdBsr, X86GpVar, X86GpVar, !o0.isGpb())
|
||||
INST_2x(bsr, kX86InstIdBsr, X86GpVar, X86GpVar)
|
||||
//! \overload
|
||||
INST_2x_(bsr, kX86InstIdBsr, X86GpVar, X86Mem, !o0.isGpb())
|
||||
INST_2x(bsr, kX86InstIdBsr, X86GpVar, X86Mem)
|
||||
|
||||
//! Byte swap (32-bit or 64-bit registers only) (i486).
|
||||
INST_1x_(bswap, kX86InstIdBswap, X86GpVar, o0.getSize() >= 4)
|
||||
INST_1x(bswap, kX86InstIdBswap, X86GpVar)
|
||||
|
||||
//! Bit test.
|
||||
INST_2x(bt, kX86InstIdBt, X86GpVar, X86GpVar)
|
||||
@@ -1694,17 +1670,7 @@ struct ASMJIT_VIRTAPI X86Compiler : public Compiler {
|
||||
}
|
||||
|
||||
//! CPU identification (i486).
|
||||
ASMJIT_INLINE HLInst* cpuid(
|
||||
const X86GpVar& x_eax,
|
||||
const X86GpVar& w_ebx,
|
||||
const X86GpVar& x_ecx,
|
||||
const X86GpVar& w_edx) {
|
||||
|
||||
// Destination variables must be different.
|
||||
ASMJIT_ASSERT(x_eax.getId() != w_ebx.getId() &&
|
||||
w_ebx.getId() != x_ecx.getId() &&
|
||||
x_ecx.getId() != w_edx.getId());
|
||||
|
||||
ASMJIT_INLINE HLInst* cpuid(const X86GpVar& x_eax, const X86GpVar& w_ebx, const X86GpVar& x_ecx, const X86GpVar& w_edx) {
|
||||
return emit(kX86InstIdCpuid, x_eax, w_ebx, x_ecx, w_edx);
|
||||
}
|
||||
|
||||
@@ -1721,23 +1687,23 @@ struct ASMJIT_VIRTAPI X86Compiler : public Compiler {
|
||||
//! Unsigned divide (o0:o1 <- o0:o1 / o2).
|
||||
//!
|
||||
//! Remainder is stored in `o0`, quotient is stored in `o1`.
|
||||
INST_3x_(div, kX86InstIdDiv, X86GpVar, X86GpVar, X86GpVar, o0.getId() != o1.getId())
|
||||
INST_3x(div, kX86InstIdDiv, X86GpVar, X86GpVar, X86GpVar)
|
||||
//! \overload
|
||||
INST_3x_(div, kX86InstIdDiv, X86GpVar, X86GpVar, X86Mem, o0.getId() != o1.getId())
|
||||
INST_3x(div, kX86InstIdDiv, X86GpVar, X86GpVar, X86Mem)
|
||||
|
||||
//! Signed divide (o0:o1 <- o0:o1 / o2).
|
||||
//!
|
||||
//! Remainder is stored in `o0`, quotient is stored in `o1`.
|
||||
INST_3x_(idiv, kX86InstIdIdiv, X86GpVar, X86GpVar, X86GpVar, o0.getId() != o1.getId())
|
||||
INST_3x(idiv, kX86InstIdIdiv, X86GpVar, X86GpVar, X86GpVar)
|
||||
//! \overload
|
||||
INST_3x_(idiv, kX86InstIdIdiv, X86GpVar, X86GpVar, X86Mem, o0.getId() != o1.getId())
|
||||
INST_3x(idiv, kX86InstIdIdiv, X86GpVar, X86GpVar, X86Mem)
|
||||
|
||||
//! Signed multiply (o0:o1 <- o1 * o2).
|
||||
//!
|
||||
//! Hi value is stored in `o0`, lo value is stored in `o1`.
|
||||
INST_3x_(imul, kX86InstIdImul, X86GpVar, X86GpVar, X86GpVar, o0.getId() != o1.getId())
|
||||
INST_3x(imul, kX86InstIdImul, X86GpVar, X86GpVar, X86GpVar)
|
||||
//! \overload
|
||||
INST_3x_(imul, kX86InstIdImul, X86GpVar, X86GpVar, X86Mem, o0.getId() != o1.getId())
|
||||
INST_3x(imul, kX86InstIdImul, X86GpVar, X86GpVar, X86Mem)
|
||||
|
||||
//! Signed multiply.
|
||||
INST_2x(imul, kX86InstIdImul, X86GpVar, X86GpVar)
|
||||
@@ -1830,9 +1796,9 @@ struct ASMJIT_VIRTAPI X86Compiler : public Compiler {
|
||||
}
|
||||
|
||||
//! Move data after swapping bytes (SSE3 - Atom).
|
||||
INST_2x_(movbe, kX86InstIdMovbe, X86GpVar, X86Mem, !o0.isGpb());
|
||||
INST_2x(movbe, kX86InstIdMovbe, X86GpVar, X86Mem);
|
||||
//! \overload
|
||||
INST_2x_(movbe, kX86InstIdMovbe, X86Mem, X86GpVar, !o1.isGpb());
|
||||
INST_2x(movbe, kX86InstIdMovbe, X86Mem, X86GpVar);
|
||||
|
||||
//! Load BYTE from DS:`o1` to ES:`o0`.
|
||||
INST_2x(movsb, kX86InstIdMovsB, X86GpVar, X86GpVar)
|
||||
@@ -1859,9 +1825,9 @@ struct ASMJIT_VIRTAPI X86Compiler : public Compiler {
|
||||
INST_2x(movzx, kX86InstIdMovzx, X86GpVar, X86Mem)
|
||||
|
||||
//! Unsigned multiply (o0:o1 <- o1 * o2).
|
||||
INST_3x_(mul, kX86InstIdMul, X86GpVar, X86GpVar, X86GpVar, o0.getId() != o1.getId())
|
||||
INST_3x(mul, kX86InstIdMul, X86GpVar, X86GpVar, X86GpVar)
|
||||
//! \overload
|
||||
INST_3x_(mul, kX86InstIdMul, X86GpVar, X86GpVar, X86Mem, o0.getId() != o1.getId())
|
||||
INST_3x(mul, kX86InstIdMul, X86GpVar, X86GpVar, X86Mem)
|
||||
|
||||
//! Two's complement negation.
|
||||
INST_1x(neg, kX86InstIdNeg, X86GpVar)
|
||||
@@ -1888,17 +1854,17 @@ struct ASMJIT_VIRTAPI X86Compiler : public Compiler {
|
||||
INST_2i(or_, kX86InstIdOr, X86Mem, Imm)
|
||||
|
||||
//! Pop a value from the stack.
|
||||
INST_1x_(pop, kX86InstIdPop, X86GpVar, o0.getSize() == 2 || o0.getSize() == _regSize)
|
||||
INST_1x(pop, kX86InstIdPop, X86GpVar)
|
||||
//! \overload
|
||||
INST_1x_(pop, kX86InstIdPop, X86Mem, o0.getSize() == 2 || o0.getSize() == _regSize)
|
||||
INST_1x(pop, kX86InstIdPop, X86Mem)
|
||||
|
||||
//! Pop stack into EFLAGS Register (32-bit or 64-bit).
|
||||
INST_0x(popf, kX86InstIdPopf)
|
||||
|
||||
//! Push WORD or DWORD/QWORD on the stack.
|
||||
INST_1x_(push, kX86InstIdPush, X86GpVar, o0.getSize() == 2 || o0.getSize() == _regSize)
|
||||
INST_1x(push, kX86InstIdPush, X86GpVar)
|
||||
//! Push WORD or DWORD/QWORD on the stack.
|
||||
INST_1x_(push, kX86InstIdPush, X86Mem, o0.getSize() == 2 || o0.getSize() == _regSize)
|
||||
INST_1x(push, kX86InstIdPush, X86Mem)
|
||||
//! Push segment register on the stack.
|
||||
INST_1x(push, kX86InstIdPush, X86SegReg)
|
||||
//! Push WORD or DWORD/QWORD on the stack.
|
||||
@@ -1926,72 +1892,72 @@ struct ASMJIT_VIRTAPI X86Compiler : public Compiler {
|
||||
INST_2i(rcr, kX86InstIdRcr, X86Mem, Imm)
|
||||
|
||||
//! Read time-stamp counter (Pentium).
|
||||
INST_2x_(rdtsc, kX86InstIdRdtsc, X86GpVar, X86GpVar, o0.getId() != o1.getId())
|
||||
INST_2x(rdtsc, kX86InstIdRdtsc, X86GpVar, X86GpVar)
|
||||
//! Read time-stamp counter and processor id (Pentium).
|
||||
INST_3x_(rdtscp, kX86InstIdRdtscp, X86GpVar, X86GpVar, X86GpVar, o0.getId() != o1.getId() && o1.getId() != o2.getId())
|
||||
INST_3x(rdtscp, kX86InstIdRdtscp, X86GpVar, X86GpVar, X86GpVar)
|
||||
|
||||
//! Repeated load ECX/RCX BYTEs from DS:[ESI/RSI] to AL.
|
||||
INST_3x_(rep_lodsb, kX86InstIdRepLodsB, X86GpVar, X86GpVar, X86GpVar, o0.getId() != o1.getId() && o1.getId() != o2.getId())
|
||||
INST_3x(rep_lodsb, kX86InstIdRepLodsB, X86GpVar, X86GpVar, X86GpVar)
|
||||
//! Repeated load ECX/RCX DWORDs from DS:[ESI/RSI] to AL.
|
||||
INST_3x_(rep_lodsd, kX86InstIdRepLodsD, X86GpVar, X86GpVar, X86GpVar, o0.getId() != o1.getId() && o1.getId() != o2.getId())
|
||||
INST_3x(rep_lodsd, kX86InstIdRepLodsD, X86GpVar, X86GpVar, X86GpVar)
|
||||
//! Repeated load ECX/RCX QWORDs from DS:[RSI] to RAX (X64 Only).
|
||||
INST_3x_(rep_lodsq, kX86InstIdRepLodsQ, X86GpVar, X86GpVar, X86GpVar, o0.getId() != o1.getId() && o1.getId() != o2.getId())
|
||||
INST_3x(rep_lodsq, kX86InstIdRepLodsQ, X86GpVar, X86GpVar, X86GpVar)
|
||||
//! Repeated load ECX/RCX WORDs from DS:[ESI/RSI] to AX.
|
||||
INST_3x_(rep_lodsw, kX86InstIdRepLodsW, X86GpVar, X86GpVar, X86GpVar, o0.getId() != o1.getId() && o1.getId() != o2.getId())
|
||||
INST_3x(rep_lodsw, kX86InstIdRepLodsW, X86GpVar, X86GpVar, X86GpVar)
|
||||
|
||||
//! Repeated move ECX/RCX BYTEs from DS:[ESI/RSI] to ES:[EDI/RDI].
|
||||
INST_3x_(rep_movsb, kX86InstIdRepMovsB, X86GpVar, X86GpVar, X86GpVar, o0.getId() != o1.getId() && o1.getId() != o2.getId())
|
||||
INST_3x(rep_movsb, kX86InstIdRepMovsB, X86GpVar, X86GpVar, X86GpVar)
|
||||
//! Repeated move ECX/RCX DWORDs from DS:[ESI/RSI] to ES:[EDI/RDI].
|
||||
INST_3x_(rep_movsd, kX86InstIdRepMovsD, X86GpVar, X86GpVar, X86GpVar, o0.getId() != o1.getId() && o1.getId() != o2.getId())
|
||||
INST_3x(rep_movsd, kX86InstIdRepMovsD, X86GpVar, X86GpVar, X86GpVar)
|
||||
//! Repeated move ECX/RCX QWORDs from DS:[RSI] to ES:[RDI] (X64 Only).
|
||||
INST_3x_(rep_movsq, kX86InstIdRepMovsQ, X86GpVar, X86GpVar, X86GpVar, o0.getId() != o1.getId() && o1.getId() != o2.getId())
|
||||
INST_3x(rep_movsq, kX86InstIdRepMovsQ, X86GpVar, X86GpVar, X86GpVar)
|
||||
//! Repeated move ECX/RCX DWORDs from DS:[ESI/RSI] to ES:[EDI/RDI].
|
||||
INST_3x_(rep_movsw, kX86InstIdRepMovsW, X86GpVar, X86GpVar, X86GpVar, o0.getId() != o1.getId() && o1.getId() != o2.getId())
|
||||
INST_3x(rep_movsw, kX86InstIdRepMovsW, X86GpVar, X86GpVar, X86GpVar)
|
||||
|
||||
//! Repeated fill ECX/RCX BYTEs at ES:[EDI/RDI] with AL.
|
||||
INST_3x_(rep_stosb, kX86InstIdRepStosB, X86GpVar, X86GpVar, X86GpVar, o0.getId() != o1.getId() && o1.getId() != o2.getId())
|
||||
INST_3x(rep_stosb, kX86InstIdRepStosB, X86GpVar, X86GpVar, X86GpVar)
|
||||
//! Repeated fill ECX/RCX DWORDs at ES:[EDI/RDI] with EAX.
|
||||
INST_3x_(rep_stosd, kX86InstIdRepStosD, X86GpVar, X86GpVar, X86GpVar, o0.getId() != o1.getId() && o1.getId() != o2.getId())
|
||||
INST_3x(rep_stosd, kX86InstIdRepStosD, X86GpVar, X86GpVar, X86GpVar)
|
||||
//! Repeated fill ECX/RCX QWORDs at ES:[RDI] with RAX (X64 Only).
|
||||
INST_3x_(rep_stosq, kX86InstIdRepStosQ, X86GpVar, X86GpVar, X86GpVar, o0.getId() != o1.getId() && o1.getId() != o2.getId())
|
||||
INST_3x(rep_stosq, kX86InstIdRepStosQ, X86GpVar, X86GpVar, X86GpVar)
|
||||
//! Repeated fill ECX/RCX WORDs at ES:[EDI/RDI] with AX.
|
||||
INST_3x_(rep_stosw, kX86InstIdRepStosW, X86GpVar, X86GpVar, X86GpVar, o0.getId() != o1.getId() && o1.getId() != o2.getId())
|
||||
INST_3x(rep_stosw, kX86InstIdRepStosW, X86GpVar, X86GpVar, X86GpVar)
|
||||
|
||||
//! Repeated find non-AL BYTEs in ES:[EDI/RDI] and DS:[ESI/RDI].
|
||||
INST_3x_(repe_cmpsb, kX86InstIdRepeCmpsB, X86GpVar, X86GpVar, X86GpVar, o0.getId() != o1.getId() && o1.getId() != o2.getId())
|
||||
INST_3x(repe_cmpsb, kX86InstIdRepeCmpsB, X86GpVar, X86GpVar, X86GpVar)
|
||||
//! Repeated find non-EAX DWORDs in ES:[EDI/RDI] and DS:[ESI/RDI].
|
||||
INST_3x_(repe_cmpsd, kX86InstIdRepeCmpsD, X86GpVar, X86GpVar, X86GpVar, o0.getId() != o1.getId() && o1.getId() != o2.getId())
|
||||
INST_3x(repe_cmpsd, kX86InstIdRepeCmpsD, X86GpVar, X86GpVar, X86GpVar)
|
||||
//! Repeated find non-RAX QWORDs in ES:[RDI] and DS:[RDI] (X64 Only).
|
||||
INST_3x_(repe_cmpsq, kX86InstIdRepeCmpsQ, X86GpVar, X86GpVar, X86GpVar, o0.getId() != o1.getId() && o1.getId() != o2.getId())
|
||||
INST_3x(repe_cmpsq, kX86InstIdRepeCmpsQ, X86GpVar, X86GpVar, X86GpVar)
|
||||
//! Repeated find non-AX WORDs in ES:[EDI/RDI] and DS:[ESI/RDI].
|
||||
INST_3x_(repe_cmpsw, kX86InstIdRepeCmpsW, X86GpVar, X86GpVar, X86GpVar, o0.getId() != o1.getId() && o1.getId() != o2.getId())
|
||||
INST_3x(repe_cmpsw, kX86InstIdRepeCmpsW, X86GpVar, X86GpVar, X86GpVar)
|
||||
|
||||
//! Repeated find non-AL BYTE starting at ES:[EDI/RDI].
|
||||
INST_3x_(repe_scasb, kX86InstIdRepeScasB, X86GpVar, X86GpVar, X86GpVar, o0.getId() != o1.getId() && o1.getId() != o2.getId())
|
||||
INST_3x(repe_scasb, kX86InstIdRepeScasB, X86GpVar, X86GpVar, X86GpVar)
|
||||
//! Repeated find non-EAX DWORD starting at ES:[EDI/RDI].
|
||||
INST_3x_(repe_scasd, kX86InstIdRepeScasD, X86GpVar, X86GpVar, X86GpVar, o0.getId() != o1.getId() && o1.getId() != o2.getId())
|
||||
INST_3x(repe_scasd, kX86InstIdRepeScasD, X86GpVar, X86GpVar, X86GpVar)
|
||||
//! Repeated find non-RAX QWORD starting at ES:[RDI] (X64 Only).
|
||||
INST_3x_(repe_scasq, kX86InstIdRepeScasQ, X86GpVar, X86GpVar, X86GpVar, o0.getId() != o1.getId() && o1.getId() != o2.getId())
|
||||
INST_3x(repe_scasq, kX86InstIdRepeScasQ, X86GpVar, X86GpVar, X86GpVar)
|
||||
//! Repeated find non-AX WORD starting at ES:[EDI/RDI].
|
||||
INST_3x_(repe_scasw, kX86InstIdRepeScasW, X86GpVar, X86GpVar, X86GpVar, o0.getId() != o1.getId() && o1.getId() != o2.getId())
|
||||
INST_3x(repe_scasw, kX86InstIdRepeScasW, X86GpVar, X86GpVar, X86GpVar)
|
||||
|
||||
//! Repeated find AL BYTEs in [RDI] and [RSI].
|
||||
INST_3x_(repne_cmpsb, kX86InstIdRepneCmpsB, X86GpVar, X86GpVar, X86GpVar, o0.getId() != o1.getId() && o1.getId() != o2.getId())
|
||||
INST_3x(repne_cmpsb, kX86InstIdRepneCmpsB, X86GpVar, X86GpVar, X86GpVar)
|
||||
//! Repeated find EAX DWORDs in [RDI] and [RSI].
|
||||
INST_3x_(repne_cmpsd, kX86InstIdRepneCmpsD, X86GpVar, X86GpVar, X86GpVar, o0.getId() != o1.getId() && o1.getId() != o2.getId())
|
||||
INST_3x(repne_cmpsd, kX86InstIdRepneCmpsD, X86GpVar, X86GpVar, X86GpVar)
|
||||
//! Repeated find RAX QWORDs in [RDI] and [RSI] (X64 Only).
|
||||
INST_3x_(repne_cmpsq, kX86InstIdRepneCmpsQ, X86GpVar, X86GpVar, X86GpVar, o0.getId() != o1.getId() && o1.getId() != o2.getId())
|
||||
INST_3x(repne_cmpsq, kX86InstIdRepneCmpsQ, X86GpVar, X86GpVar, X86GpVar)
|
||||
//! Repeated find AX WORDs in [RDI] and [RSI].
|
||||
INST_3x_(repne_cmpsw, kX86InstIdRepneCmpsW, X86GpVar, X86GpVar, X86GpVar, o0.getId() != o1.getId() && o1.getId() != o2.getId())
|
||||
INST_3x(repne_cmpsw, kX86InstIdRepneCmpsW, X86GpVar, X86GpVar, X86GpVar)
|
||||
|
||||
//! Repeated Find AL BYTEs, starting at ES:[EDI/RDI].
|
||||
INST_3x_(repne_scasb, kX86InstIdRepneScasB, X86GpVar, X86GpVar, X86GpVar, o0.getId() != o1.getId() && o1.getId() != o2.getId())
|
||||
INST_3x(repne_scasb, kX86InstIdRepneScasB, X86GpVar, X86GpVar, X86GpVar)
|
||||
//! Repeated find EAX DWORDs, starting at ES:[EDI/RDI].
|
||||
INST_3x_(repne_scasd, kX86InstIdRepneScasD, X86GpVar, X86GpVar, X86GpVar, o0.getId() != o1.getId() && o1.getId() != o2.getId())
|
||||
INST_3x(repne_scasd, kX86InstIdRepneScasD, X86GpVar, X86GpVar, X86GpVar)
|
||||
//! Repeated find RAX QWORDs, starting at ES:[RDI] (X64 Only).
|
||||
INST_3x_(repne_scasq, kX86InstIdRepneScasQ, X86GpVar, X86GpVar, X86GpVar, o0.getId() != o1.getId() && o1.getId() != o2.getId())
|
||||
INST_3x(repne_scasq, kX86InstIdRepneScasQ, X86GpVar, X86GpVar, X86GpVar)
|
||||
//! Repeated find AX WORDs, starting at ES:[EDI/RDI].
|
||||
INST_3x_(repne_scasw, kX86InstIdRepneScasW, X86GpVar, X86GpVar, X86GpVar, o0.getId() != o1.getId() && o1.getId() != o2.getId())
|
||||
INST_3x(repne_scasw, kX86InstIdRepneScasW, X86GpVar, X86GpVar, X86GpVar)
|
||||
|
||||
//! Return.
|
||||
ASMJIT_INLINE HLRet* ret() { return addRet(noOperand, noOperand); }
|
||||
@@ -2174,7 +2140,7 @@ struct ASMJIT_VIRTAPI X86Compiler : public Compiler {
|
||||
INST_0x(fabs, kX86InstIdFabs)
|
||||
|
||||
//! Add `o0 = o0 + o1` (one operand has to be `fp0`) (FPU).
|
||||
INST_2x_(fadd, kX86InstIdFadd, X86FpReg, X86FpReg, o0.getRegIndex() == 0 || o1.getRegIndex() == 0)
|
||||
INST_2x(fadd, kX86InstIdFadd, X86FpReg, X86FpReg)
|
||||
//! Add `fp0 = fp0 + float_or_double[o0]` (FPU).
|
||||
INST_1x(fadd, kX86InstIdFadd, X86Mem)
|
||||
//! Add `o0 = o0 + fp0` and POP (FPU).
|
||||
@@ -2236,7 +2202,7 @@ struct ASMJIT_VIRTAPI X86Compiler : public Compiler {
|
||||
INST_0x(fdecstp, kX86InstIdFdecstp)
|
||||
|
||||
//! Divide `o0 = o0 / o1` (one has to be `fp0`) (FPU).
|
||||
INST_2x_(fdiv, kX86InstIdFdiv, X86FpReg, X86FpReg, o0.getRegIndex() == 0 || o1.getRegIndex() == 0)
|
||||
INST_2x(fdiv, kX86InstIdFdiv, X86FpReg, X86FpReg)
|
||||
//! Divide `fp0 = fp0 / float_or_double[o0]` (FPU).
|
||||
INST_1x(fdiv, kX86InstIdFdiv, X86Mem)
|
||||
//! Divide `o0 = o0 / fp0` and POP (FPU).
|
||||
@@ -2245,7 +2211,7 @@ struct ASMJIT_VIRTAPI X86Compiler : public Compiler {
|
||||
INST_0x(fdivp, kX86InstIdFdivp)
|
||||
|
||||
//! Reverse divide `o0 = o1 / o0` (one has to be `fp0`) (FPU).
|
||||
INST_2x_(fdivr, kX86InstIdFdivr, X86FpReg, X86FpReg, o0.getRegIndex() == 0 || o1.getRegIndex() == 0)
|
||||
INST_2x(fdivr, kX86InstIdFdivr, X86FpReg, X86FpReg)
|
||||
//! Reverse divide `fp0 = float_or_double[o0] / fp0` (FPU).
|
||||
INST_1x(fdivr, kX86InstIdFdivr, X86Mem)
|
||||
//! Reverse divide `o0 = fp0 / o0` and POP (FPU).
|
||||
@@ -2257,20 +2223,20 @@ struct ASMJIT_VIRTAPI X86Compiler : public Compiler {
|
||||
INST_1x(ffree, kX86InstIdFfree, X86FpReg)
|
||||
|
||||
//! Add `fp0 = fp0 + short_or_int[o0]` (FPU).
|
||||
INST_1x_(fiadd, kX86InstIdFiadd, X86Mem, o0.getSize() == 2 || o0.getSize() == 4)
|
||||
INST_1x(fiadd, kX86InstIdFiadd, X86Mem)
|
||||
//! Compare `fp0` with `short_or_int[o0]` (FPU).
|
||||
INST_1x_(ficom, kX86InstIdFicom, X86Mem, o0.getSize() == 2 || o0.getSize() == 4)
|
||||
INST_1x(ficom, kX86InstIdFicom, X86Mem)
|
||||
//! Compare `fp0` with `short_or_int[o0]` and POP (FPU).
|
||||
INST_1x_(ficomp, kX86InstIdFicomp, X86Mem, o0.getSize() == 2 || o0.getSize() == 4)
|
||||
INST_1x(ficomp, kX86InstIdFicomp, X86Mem)
|
||||
//! Divide `fp0 = fp0 / short_or_int[o0]` (FPU).
|
||||
INST_1x_(fidiv, kX86InstIdFidiv, X86Mem, o0.getSize() == 2 || o0.getSize() == 4)
|
||||
INST_1x(fidiv, kX86InstIdFidiv, X86Mem)
|
||||
//! Reverse divide `fp0 = short_or_int[o0] / fp0` (FPU).
|
||||
INST_1x_(fidivr, kX86InstIdFidivr, X86Mem, o0.getSize() == 2 || o0.getSize() == 4)
|
||||
INST_1x(fidivr, kX86InstIdFidivr, X86Mem)
|
||||
|
||||
//! Load `short_or_int_or_long[o0]` and PUSH (FPU).
|
||||
INST_1x_(fild, kX86InstIdFild, X86Mem, o0.getSize() == 2 || o0.getSize() == 4 || o0.getSize() == 8)
|
||||
INST_1x(fild, kX86InstIdFild, X86Mem)
|
||||
//! Multiply `fp0 *= short_or_int[o0]` (FPU).
|
||||
INST_1x_(fimul, kX86InstIdFimul, X86Mem, o0.getSize() == 2 || o0.getSize() == 4)
|
||||
INST_1x(fimul, kX86InstIdFimul, X86Mem)
|
||||
|
||||
//! Increment FPU stack pointer (FPU).
|
||||
INST_0x(fincstp, kX86InstIdFincstp)
|
||||
@@ -2278,20 +2244,20 @@ struct ASMJIT_VIRTAPI X86Compiler : public Compiler {
|
||||
INST_0x(finit, kX86InstIdFinit)
|
||||
|
||||
//! Subtract `fp0 = fp0 - short_or_int[o0]` (FPU).
|
||||
INST_1x_(fisub, kX86InstIdFisub, X86Mem, o0.getSize() == 2 || o0.getSize() == 4)
|
||||
INST_1x(fisub, kX86InstIdFisub, X86Mem)
|
||||
//! Reverse subtract `fp0 = short_or_int[o0] - fp0` (FPU).
|
||||
INST_1x_(fisubr, kX86InstIdFisubr, X86Mem, o0.getSize() == 2 || o0.getSize() == 4)
|
||||
INST_1x(fisubr, kX86InstIdFisubr, X86Mem)
|
||||
|
||||
//! Initialize FPU without checking for pending unmasked exceptions (FPU).
|
||||
INST_0x(fninit, kX86InstIdFninit)
|
||||
|
||||
//! Store `fp0` as `short_or_int[o0]` (FPU).
|
||||
INST_1x_(fist, kX86InstIdFist, X86Mem, o0.getSize() == 2 || o0.getSize() == 4)
|
||||
INST_1x(fist, kX86InstIdFist, X86Mem)
|
||||
//! Store `fp0` as `short_or_int_or_long[o0]` and POP (FPU).
|
||||
INST_1x_(fistp, kX86InstIdFistp, X86Mem, o0.getSize() == 2 || o0.getSize() == 4 || o0.getSize() == 8)
|
||||
INST_1x(fistp, kX86InstIdFistp, X86Mem)
|
||||
|
||||
//! Load `float_or_double_or_extended[o0]` and PUSH (FPU).
|
||||
INST_1x_(fld, kX86InstIdFld, X86Mem, o0.getSize() == 4 || o0.getSize() == 8 || o0.getSize() == 10)
|
||||
INST_1x(fld, kX86InstIdFld, X86Mem)
|
||||
//! PUSH `o0` (FPU).
|
||||
INST_1x(fld, kX86InstIdFld, X86FpReg)
|
||||
|
||||
@@ -2316,7 +2282,7 @@ struct ASMJIT_VIRTAPI X86Compiler : public Compiler {
|
||||
INST_1x(fldenv, kX86InstIdFldenv, X86Mem)
|
||||
|
||||
//! Multiply `o0 = o0 * o1` (one has to be `fp0`) (FPU).
|
||||
INST_2x_(fmul, kX86InstIdFmul, X86FpReg, X86FpReg, o0.getRegIndex() == 0 || o1.getRegIndex() == 0)
|
||||
INST_2x(fmul, kX86InstIdFmul, X86FpReg, X86FpReg)
|
||||
//! Multiply `fp0 = fp0 * float_or_double[o0]` (FPU).
|
||||
INST_1x(fmul, kX86InstIdFmul, X86Mem)
|
||||
//! Multiply `o0 = o0 * fp0` and POP (FPU).
|
||||
@@ -2366,11 +2332,11 @@ struct ASMJIT_VIRTAPI X86Compiler : public Compiler {
|
||||
INST_0x(fsqrt, kX86InstIdFsqrt)
|
||||
|
||||
//! Store floating point value to `float_or_double[o0]` (FPU).
|
||||
INST_1x_(fst, kX86InstIdFst, X86Mem, o0.getSize() == 4 || o0.getSize() == 8)
|
||||
INST_1x(fst, kX86InstIdFst, X86Mem)
|
||||
//! Copy `o0 = fp0` (FPU).
|
||||
INST_1x(fst, kX86InstIdFst, X86FpReg)
|
||||
//! Store floating point value to `float_or_double_or_extended[o0]` and POP (FPU).
|
||||
INST_1x_(fstp, kX86InstIdFstp, X86Mem, o0.getSize() == 4 || o0.getSize() == 8 || o0.getSize() == 10)
|
||||
INST_1x(fstp, kX86InstIdFstp, X86Mem)
|
||||
//! Copy `o0 = fp0` and POP (FPU).
|
||||
INST_1x(fstp, kX86InstIdFstp, X86FpReg)
|
||||
|
||||
@@ -2384,18 +2350,18 @@ struct ASMJIT_VIRTAPI X86Compiler : public Compiler {
|
||||
INST_1x(fstsw, kX86InstIdFstsw, X86Mem)
|
||||
|
||||
//! Subtract `o0 = o0 - o1` (one has to be `fp0`) (FPU).
|
||||
INST_2x_(fsub, kX86InstIdFsub, X86FpReg, X86FpReg, o0.getRegIndex() == 0 || o1.getRegIndex() == 0)
|
||||
INST_2x(fsub, kX86InstIdFsub, X86FpReg, X86FpReg)
|
||||
//! Subtract `fp0 = fp0 - float_or_double[o0]` (FPU).
|
||||
INST_1x_(fsub, kX86InstIdFsub, X86Mem, o0.getSize() == 4 || o0.getSize() == 8)
|
||||
INST_1x(fsub, kX86InstIdFsub, X86Mem)
|
||||
//! Subtract `o0 = o0 - fp0` and POP (FPU).
|
||||
INST_1x(fsubp, kX86InstIdFsubp, X86FpReg)
|
||||
//! Subtract `fp1 = fp1 - fp0` and POP (FPU).
|
||||
INST_0x(fsubp, kX86InstIdFsubp)
|
||||
|
||||
//! Reverse subtract `o0 = o1 - o0` (one has to be `fp0`) (FPU).
|
||||
INST_2x_(fsubr, kX86InstIdFsubr, X86FpReg, X86FpReg, o0.getRegIndex() == 0 || o1.getRegIndex() == 0)
|
||||
INST_2x(fsubr, kX86InstIdFsubr, X86FpReg, X86FpReg)
|
||||
//! Reverse subtract `fp0 = fp0 - float_or_double[o0]` (FPU).
|
||||
INST_1x_(fsubr, kX86InstIdFsubr, X86Mem, o0.getSize() == 4 || o0.getSize() == 8)
|
||||
INST_1x(fsubr, kX86InstIdFsubr, X86Mem)
|
||||
//! Reverse subtract `o0 = o0 - fp0` and POP (FPU).
|
||||
INST_1x(fsubrp, kX86InstIdFsubrp, X86FpReg)
|
||||
//! Reverse subtract `fp1 = fp1 - fp0` and POP (FPU).
|
||||
@@ -4252,9 +4218,9 @@ struct ASMJIT_VIRTAPI X86Compiler : public Compiler {
|
||||
// --------------------------------------------------------------------------
|
||||
|
||||
//! Accumulate crc32 value (polynomial 0x11EDC6F41) (SSE4.2).
|
||||
INST_2x_(crc32, kX86InstIdCrc32, X86GpVar, X86GpVar, o0.isRegType(kX86RegTypeGpd) || o0.isRegType(kX86RegTypeGpq))
|
||||
INST_2x(crc32, kX86InstIdCrc32, X86GpVar, X86GpVar)
|
||||
//! \overload
|
||||
INST_2x_(crc32, kX86InstIdCrc32, X86GpVar, X86Mem, o0.isRegType(kX86RegTypeGpd) || o0.isRegType(kX86RegTypeGpq))
|
||||
INST_2x(crc32, kX86InstIdCrc32, X86GpVar, X86Mem)
|
||||
|
||||
//! Packed compare explicit length strings, return index (SSE4.2).
|
||||
INST_3i(pcmpestri, kX86InstIdPcmpestri, X86XmmVar, X86XmmVar, Imm)
|
||||
@@ -4305,9 +4271,9 @@ struct ASMJIT_VIRTAPI X86Compiler : public Compiler {
|
||||
// --------------------------------------------------------------------------
|
||||
|
||||
//! Return the count of number of bits set to 1 (POPCNT).
|
||||
INST_2x_(popcnt, kX86InstIdPopcnt, X86GpVar, X86GpVar, !o0.isGpb() && o0.getSize() == o1.getSize())
|
||||
INST_2x(popcnt, kX86InstIdPopcnt, X86GpVar, X86GpVar)
|
||||
//! \overload
|
||||
INST_2x_(popcnt, kX86InstIdPopcnt, X86GpVar, X86Mem, !o0.isGpb())
|
||||
INST_2x(popcnt, kX86InstIdPopcnt, X86GpVar, X86Mem)
|
||||
|
||||
// --------------------------------------------------------------------------
|
||||
// [LZCNT]
|
||||
@@ -4392,22 +4358,18 @@ struct ASMJIT_VIRTAPI X86Compiler : public Compiler {
|
||||
#undef INST_0x
|
||||
|
||||
#undef INST_1x
|
||||
#undef INST_1x_
|
||||
#undef INST_1i
|
||||
#undef INST_1cc
|
||||
|
||||
#undef INST_2x
|
||||
#undef INST_2x_
|
||||
#undef INST_2i
|
||||
#undef INST_2cc
|
||||
|
||||
#undef INST_3x
|
||||
#undef INST_3x_
|
||||
#undef INST_3i
|
||||
#undef INST_3ii
|
||||
|
||||
#undef INST_4x
|
||||
#undef INST_4x_
|
||||
#undef INST_4i
|
||||
#undef INST_4ii
|
||||
};
|
||||
|
||||
@@ -495,7 +495,8 @@ static ASMJIT_INLINE const X86SpecialInst* X86SpecialInst_get(uint32_t instId, c
|
||||
return NULL;
|
||||
if (opCount == 3 && !(opList[0].isVar() && opList[1].isVar() && opList[2].isVarOrMem()))
|
||||
return NULL;
|
||||
// ... Fall through ...
|
||||
ASMJIT_FALL_THROUGH;
|
||||
|
||||
case kX86InstIdMul:
|
||||
return x86SpecialInstMul;
|
||||
|
||||
@@ -927,7 +928,7 @@ void X86Context::emitConvertVarToVar(uint32_t dstType, uint32_t dstIndex, uint32
|
||||
compiler->emit(kX86InstIdCvtpd2ps, x86::xmm(dstIndex), x86::xmm(srcIndex));
|
||||
return;
|
||||
}
|
||||
// ... Fall through ...
|
||||
ASMJIT_FALL_THROUGH;
|
||||
|
||||
case kX86VarTypeXmmSs:
|
||||
if (srcType == kX86VarTypeXmmSd || srcType == kX86VarTypeXmmPd || srcType == kX86VarTypeYmmPd) {
|
||||
@@ -946,7 +947,7 @@ void X86Context::emitConvertVarToVar(uint32_t dstType, uint32_t dstIndex, uint32
|
||||
compiler->emit(kX86InstIdCvtps2pd, x86::xmm(dstIndex), x86::xmm(srcIndex));
|
||||
return;
|
||||
}
|
||||
// ... Fall through ...
|
||||
ASMJIT_FALL_THROUGH;
|
||||
|
||||
case kX86VarTypeXmmSd:
|
||||
if (srcType == kX86VarTypeXmmSs || srcType == kX86VarTypeXmmPs || srcType == kX86VarTypeYmmPs) {
|
||||
@@ -5513,7 +5514,7 @@ _NextGroup:
|
||||
ASMJIT_PROPAGATE_ERROR(cAlloc.run(static_cast<X86CallNode*>(node_)));
|
||||
break;
|
||||
}
|
||||
// ... Fall through ...
|
||||
ASMJIT_FALL_THROUGH;
|
||||
|
||||
case kHLNodeTypeHint:
|
||||
case kHLNodeTypeRet: {
|
||||
|
||||
@@ -265,8 +265,8 @@ static Error X86FuncDecl_initFunc(X86FuncDecl* self, uint32_t arch,
|
||||
self->_rets[1]._varType = static_cast<uint8_t>(ret - 2);
|
||||
self->_rets[1]._regIndex = kX86RegIndexDx;
|
||||
}
|
||||
ASMJIT_FALL_THROUGH;
|
||||
#endif // ASMJIT_BUILD_X86
|
||||
// ... Fall through ...
|
||||
|
||||
case kVarTypeInt8:
|
||||
case kVarTypeUInt8:
|
||||
|
||||
Reference in New Issue
Block a user