Merge branch 'master' of https://github.com/xenia-project/xenia into canary_experimental
This commit is contained in:
@@ -481,6 +481,43 @@ struct VECTOR_COMPARE_UGT_V128
|
||||
: Sequence<VECTOR_COMPARE_UGT_V128,
|
||||
I<OPCODE_VECTOR_COMPARE_UGT, V128Op, V128Op, V128Op>> {
|
||||
static void Emit(X64Emitter& e, const EmitArgType& i) {
|
||||
if (e.IsFeatureEnabled(kX64EmitAVX512Ortho | kX64EmitAVX512BW |
|
||||
kX64EmitAVX512DQ) &&
|
||||
(i.instr->flags != FLOAT32_TYPE)) {
|
||||
Xmm src1 = e.xmm0;
|
||||
if (i.src1.is_constant) {
|
||||
e.LoadConstantXmm(src1, i.src1.constant());
|
||||
} else {
|
||||
src1 = i.src1;
|
||||
}
|
||||
|
||||
Xmm src2 = e.xmm1;
|
||||
if (i.src2.is_constant) {
|
||||
e.LoadConstantXmm(src2, i.src2.constant());
|
||||
} else {
|
||||
src2 = i.src2;
|
||||
}
|
||||
|
||||
switch (i.instr->flags) {
|
||||
case INT8_TYPE:
|
||||
e.vpcmpub(e.k1, src1, src2, 0x6);
|
||||
e.vpmovm2b(i.dest, e.k1);
|
||||
break;
|
||||
case INT16_TYPE:
|
||||
e.vpcmpuw(e.k1, src1, src2, 0x6);
|
||||
e.vpmovm2w(i.dest, e.k1);
|
||||
break;
|
||||
case INT32_TYPE:
|
||||
e.vpcmpud(e.k1, src1, src2, 0x6);
|
||||
e.vpmovm2d(i.dest, e.k1);
|
||||
break;
|
||||
default:
|
||||
assert_always();
|
||||
break;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
Xbyak::Address sign_addr = e.ptr[e.rax]; // dummy
|
||||
switch (i.instr->flags) {
|
||||
case INT8_TYPE:
|
||||
|
||||
@@ -646,8 +646,9 @@ bool ConstantPropagationPass::Run(HIRBuilder* builder, bool& result) {
|
||||
break;
|
||||
case OPCODE_AND_NOT:
|
||||
if (i->src1.value->IsConstant() && i->src2.value->IsConstant()) {
|
||||
v->set_from(i->src1.value);
|
||||
v->AndNot(i->src2.value);
|
||||
v->set_from(i->src2.value);
|
||||
v->Not();
|
||||
v->And(i->src1.value);
|
||||
i->UnlinkAndNOP();
|
||||
result = true;
|
||||
}
|
||||
|
||||
@@ -324,8 +324,13 @@ int InstrEmit_mtvscr(PPCHIRBuilder& f, const InstrData& i) {
|
||||
}
|
||||
|
||||
int InstrEmit_vaddcuw(PPCHIRBuilder& f, const InstrData& i) {
|
||||
XEINSTRNOTIMPLEMENTED();
|
||||
return 1;
|
||||
Value* sum = f.VectorAdd(f.LoadVR(i.VX.VA), f.LoadVR(i.VX.VB), INT32_TYPE,
|
||||
ARITHMETIC_UNSIGNED);
|
||||
Value* overflow = f.VectorCompareUGT(f.LoadVR(i.VX.VA), sum, INT32_TYPE);
|
||||
Value* carry =
|
||||
f.VectorShr(overflow, f.LoadConstantVec128(vec128i(31)), INT32_TYPE);
|
||||
f.StoreVR(i.VX.VD, carry);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int InstrEmit_vaddfp_(PPCHIRBuilder& f, uint32_t vd, uint32_t va, uint32_t vb) {
|
||||
@@ -1665,7 +1670,11 @@ int InstrEmit_vsrw128(PPCHIRBuilder& f, const InstrData& i) {
|
||||
}
|
||||
|
||||
int InstrEmit_vsubcuw(PPCHIRBuilder& f, const InstrData& i) {
|
||||
XEINSTRNOTIMPLEMENTED();
|
||||
Value* underflow =
|
||||
f.VectorCompareUGE(f.LoadVR(i.VX.VA), f.LoadVR(i.VX.VB), INT32_TYPE);
|
||||
Value* borrow =
|
||||
f.VectorShr(underflow, f.LoadConstantVec128(vec128i(31)), INT32_TYPE);
|
||||
f.StoreVR(i.VX.VD, borrow);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user