VECTOR_COMPARE_UGT/UGE (probably).
This commit is contained in:
parent
289075d052
commit
ff8c03046a
|
@ -505,6 +505,10 @@ Address X64Emitter::GetXmmConstPtr(XmmConst id) {
|
||||||
/* XMMShiftByteMask */ vec128i(0x000000FFu, 0x000000FFu, 0x000000FFu, 0x000000FFu),
|
/* XMMShiftByteMask */ vec128i(0x000000FFu, 0x000000FFu, 0x000000FFu, 0x000000FFu),
|
||||||
/* XMMUnsignedDwordMax */ vec128i(0xFFFFFFFFu, 0x00000000u, 0xFFFFFFFFu, 0x00000000u),
|
/* XMMUnsignedDwordMax */ vec128i(0xFFFFFFFFu, 0x00000000u, 0xFFFFFFFFu, 0x00000000u),
|
||||||
/* XMM255 */ vec128f(255.0f, 255.0f, 255.0f, 255.0f),
|
/* XMM255 */ vec128f(255.0f, 255.0f, 255.0f, 255.0f),
|
||||||
|
/* XMMSignMaskI8 */ vec128i(0x80808080u, 0x80808080u, 0x80808080u, 0x80808080u),
|
||||||
|
/* XMMSignMaskI16 */ vec128i(0x80008000u, 0x80008000u, 0x80008000u, 0x80008000u),
|
||||||
|
/* XMMSignMaskI32 */ vec128i(0x80000000u, 0x80000000u, 0x80000000u, 0x80000000u),
|
||||||
|
/* XMMSignMaskF32 */ vec128i(0x80000000u, 0x80000000u, 0x80000000u, 0x80000000u),
|
||||||
};
|
};
|
||||||
// TODO(benvanik): cache base pointer somewhere? stack? It'd be nice to
|
// TODO(benvanik): cache base pointer somewhere? stack? It'd be nice to
|
||||||
// prevent this move.
|
// prevent this move.
|
||||||
|
|
|
@ -57,6 +57,10 @@ enum XmmConst {
|
||||||
XMMShiftByteMask,
|
XMMShiftByteMask,
|
||||||
XMMUnsignedDwordMax,
|
XMMUnsignedDwordMax,
|
||||||
XMM255,
|
XMM255,
|
||||||
|
XMMSignMaskI8,
|
||||||
|
XMMSignMaskI16,
|
||||||
|
XMMSignMaskI32,
|
||||||
|
XMMSignMaskF32,
|
||||||
};
|
};
|
||||||
|
|
||||||
// Unfortunately due to the design of xbyak we have to pass this to the ctor.
|
// Unfortunately due to the design of xbyak we have to pass this to the ctor.
|
||||||
|
|
|
@ -2337,25 +2337,117 @@ EMITTER_OPCODE_TABLE(
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
// OPCODE_VECTOR_COMPARE_UGT
|
// OPCODE_VECTOR_COMPARE_UGT
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
//EMITTER(VECTOR_COMPARE_UGT_V128, MATCH(I<OPCODE_VECTOR_COMPARE_UGT, V128<>, V128<>, V128<>>)) {
|
EMITTER(VECTOR_COMPARE_UGT_V128, MATCH(I<OPCODE_VECTOR_COMPARE_UGT, V128<>, V128<>, V128<>>)) {
|
||||||
// static void Emit(X64Emitter& e, const EmitArgType& i) {
|
static void Emit(X64Emitter& e, const EmitArgType& i) {
|
||||||
// }
|
Xbyak::Address sign_addr = e.ptr[e.rax]; // dummy
|
||||||
//};
|
switch (i.instr->flags) {
|
||||||
//EMITTER_OPCODE_TABLE(
|
case INT8_TYPE:
|
||||||
// OPCODE_VECTOR_COMPARE_UGT,
|
sign_addr = e.GetXmmConstPtr(XMMSignMaskI8);
|
||||||
// VECTOR_COMPARE_UGT_V128);
|
break;
|
||||||
|
case INT16_TYPE:
|
||||||
|
sign_addr = e.GetXmmConstPtr(XMMSignMaskI16);
|
||||||
|
break;
|
||||||
|
case INT32_TYPE:
|
||||||
|
sign_addr = e.GetXmmConstPtr(XMMSignMaskI32);
|
||||||
|
break;
|
||||||
|
case FLOAT32_TYPE:
|
||||||
|
sign_addr = e.GetXmmConstPtr(XMMSignMaskF32);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (i.src1.is_constant) {
|
||||||
|
// TODO(benvanik): make this constant.
|
||||||
|
e.LoadConstantXmm(e.xmm0, i.src1.constant());
|
||||||
|
e.vpxor(e.xmm0, sign_addr);
|
||||||
|
} else {
|
||||||
|
e.vpxor(e.xmm0, i.src1, sign_addr);
|
||||||
|
}
|
||||||
|
if (i.src2.is_constant) {
|
||||||
|
// TODO(benvanik): make this constant.
|
||||||
|
e.LoadConstantXmm(e.xmm1, i.src1.constant());
|
||||||
|
e.vpxor(e.xmm1, sign_addr);
|
||||||
|
} else {
|
||||||
|
e.vpxor(e.xmm1, i.src2, sign_addr);
|
||||||
|
}
|
||||||
|
switch (i.instr->flags) {
|
||||||
|
case INT8_TYPE:
|
||||||
|
e.vpcmpgtb(i.dest, e.xmm0, e.xmm1);
|
||||||
|
break;
|
||||||
|
case INT16_TYPE:
|
||||||
|
e.vpcmpgtw(i.dest, e.xmm0, e.xmm1);
|
||||||
|
break;
|
||||||
|
case INT32_TYPE:
|
||||||
|
e.vpcmpgtd(i.dest, e.xmm0, e.xmm1);
|
||||||
|
break;
|
||||||
|
case FLOAT32_TYPE:
|
||||||
|
e.vcmpgtps(i.dest, e.xmm0, e.xmm1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
EMITTER_OPCODE_TABLE(
|
||||||
|
OPCODE_VECTOR_COMPARE_UGT,
|
||||||
|
VECTOR_COMPARE_UGT_V128);
|
||||||
|
|
||||||
|
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
// OPCODE_VECTOR_COMPARE_UGE
|
// OPCODE_VECTOR_COMPARE_UGE
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
//EMITTER(VECTOR_COMPARE_UGE_V128, MATCH(I<OPCODE_VECTOR_COMPARE_UGE, V128<>, V128<>, V128<>>)) {
|
EMITTER(VECTOR_COMPARE_UGE_V128, MATCH(I<OPCODE_VECTOR_COMPARE_UGE, V128<>, V128<>, V128<>>)) {
|
||||||
// static void Emit(X64Emitter& e, const EmitArgType& i) {
|
static void Emit(X64Emitter& e, const EmitArgType& i) {
|
||||||
// }
|
Xbyak::Address sign_addr = e.ptr[e.rax]; // dummy
|
||||||
//};
|
switch (i.instr->flags) {
|
||||||
//EMITTER_OPCODE_TABLE(
|
case INT8_TYPE:
|
||||||
// OPCODE_VECTOR_COMPARE_UGE,
|
sign_addr = e.GetXmmConstPtr(XMMSignMaskI8);
|
||||||
// VECTOR_COMPARE_UGE_V128);
|
break;
|
||||||
|
case INT16_TYPE:
|
||||||
|
sign_addr = e.GetXmmConstPtr(XMMSignMaskI16);
|
||||||
|
break;
|
||||||
|
case INT32_TYPE:
|
||||||
|
sign_addr = e.GetXmmConstPtr(XMMSignMaskI32);
|
||||||
|
break;
|
||||||
|
case FLOAT32_TYPE:
|
||||||
|
sign_addr = e.GetXmmConstPtr(XMMSignMaskF32);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (i.src1.is_constant) {
|
||||||
|
// TODO(benvanik): make this constant.
|
||||||
|
e.LoadConstantXmm(e.xmm0, i.src1.constant());
|
||||||
|
e.vpxor(e.xmm0, sign_addr);
|
||||||
|
} else {
|
||||||
|
e.vpxor(e.xmm0, i.src1, sign_addr);
|
||||||
|
}
|
||||||
|
if (i.src2.is_constant) {
|
||||||
|
// TODO(benvanik): make this constant.
|
||||||
|
e.LoadConstantXmm(e.xmm1, i.src1.constant());
|
||||||
|
e.vpxor(e.xmm1, sign_addr);
|
||||||
|
} else {
|
||||||
|
e.vpxor(e.xmm1, i.src2, sign_addr);
|
||||||
|
}
|
||||||
|
switch (i.instr->flags) {
|
||||||
|
case INT8_TYPE:
|
||||||
|
e.vpcmpeqb(e.xmm2, e.xmm0, e.xmm1);
|
||||||
|
e.vpcmpgtb(i.dest, e.xmm0, e.xmm1);
|
||||||
|
e.vpor(i.dest, e.xmm2);
|
||||||
|
break;
|
||||||
|
case INT16_TYPE:
|
||||||
|
e.vpcmpeqw(e.xmm2, e.xmm0, e.xmm1);
|
||||||
|
e.vpcmpgtw(i.dest, e.xmm0, e.xmm1);
|
||||||
|
e.vpor(i.dest, e.xmm2);
|
||||||
|
break;
|
||||||
|
case INT32_TYPE:
|
||||||
|
e.vpcmpeqd(e.xmm2, e.xmm0, e.xmm1);
|
||||||
|
e.vpcmpgtd(i.dest, e.xmm0, e.xmm1);
|
||||||
|
e.vpor(i.dest, e.xmm2);
|
||||||
|
break;
|
||||||
|
case FLOAT32_TYPE:
|
||||||
|
e.vcmpgeps(i.dest, e.xmm0, e.xmm1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
EMITTER_OPCODE_TABLE(
|
||||||
|
OPCODE_VECTOR_COMPARE_UGE,
|
||||||
|
VECTOR_COMPARE_UGE_V128);
|
||||||
|
|
||||||
|
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
|
@ -4968,8 +5060,8 @@ void alloy::backend::x64::RegisterSequences() {
|
||||||
REGISTER_EMITTER_OPCODE_TABLE(OPCODE_VECTOR_COMPARE_EQ);
|
REGISTER_EMITTER_OPCODE_TABLE(OPCODE_VECTOR_COMPARE_EQ);
|
||||||
REGISTER_EMITTER_OPCODE_TABLE(OPCODE_VECTOR_COMPARE_SGT);
|
REGISTER_EMITTER_OPCODE_TABLE(OPCODE_VECTOR_COMPARE_SGT);
|
||||||
REGISTER_EMITTER_OPCODE_TABLE(OPCODE_VECTOR_COMPARE_SGE);
|
REGISTER_EMITTER_OPCODE_TABLE(OPCODE_VECTOR_COMPARE_SGE);
|
||||||
//REGISTER_EMITTER_OPCODE_TABLE(OPCODE_VECTOR_COMPARE_UGT);
|
REGISTER_EMITTER_OPCODE_TABLE(OPCODE_VECTOR_COMPARE_UGT);
|
||||||
//REGISTER_EMITTER_OPCODE_TABLE(OPCODE_VECTOR_COMPARE_UGE);
|
REGISTER_EMITTER_OPCODE_TABLE(OPCODE_VECTOR_COMPARE_UGE);
|
||||||
REGISTER_EMITTER_OPCODE_TABLE(OPCODE_ADD);
|
REGISTER_EMITTER_OPCODE_TABLE(OPCODE_ADD);
|
||||||
REGISTER_EMITTER_OPCODE_TABLE(OPCODE_ADD_CARRY);
|
REGISTER_EMITTER_OPCODE_TABLE(OPCODE_ADD_CARRY);
|
||||||
REGISTER_EMITTER_OPCODE_TABLE(OPCODE_VECTOR_ADD);
|
REGISTER_EMITTER_OPCODE_TABLE(OPCODE_VECTOR_ADD);
|
||||||
|
|
Loading…
Reference in New Issue