mirror of
https://github.com/FEX-Emu/FEX.git
synced 2026-10-07 19:00:16 +02:00
IR: Handle 256-bit VBSL
Extends VBSL to handle 256-bit vectors.
This commit is contained in:
1 parent
8d8b029285
commit
ecba1b6838
3 files changed
+43
-21
No files matched your search
@@ -951,15 +951,16 @@ DEF_OP(VUnZip) {
|
||||
|
||||
DEF_OP(VBSL) {
|
||||
auto Op = IROp->C<IR::IROp_VBSL>();
|
||||
const auto Src1 = *GetSrc<__uint128_t*>(Data->SSAData, Op->VectorMask);
|
||||
const auto Src2 = *GetSrc<__uint128_t*>(Data->SSAData, Op->VectorTrue);
|
||||
const auto Src3 = *GetSrc<__uint128_t*>(Data->SSAData, Op->VectorFalse);
|
||||
const auto Src1 = *GetSrc<InterpVector256*>(Data->SSAData, Op->VectorMask);
|
||||
const auto Src2 = *GetSrc<InterpVector256*>(Data->SSAData, Op->VectorTrue);
|
||||
const auto Src3 = *GetSrc<InterpVector256*>(Data->SSAData, Op->VectorFalse);
|
||||
|
||||
__uint128_t Tmp{};
|
||||
Tmp = Src2 & Src1;
|
||||
Tmp |= Src3 & ~Src1;
|
||||
const auto Tmp = InterpVector256{
|
||||
.Lower = (Src2.Lower & Src1.Lower) | (Src3.Lower & ~Src1.Lower),
|
||||
.Upper = (Src2.Upper & Src1.Upper) | (Src3.Upper & ~Src1.Upper),
|
||||
};
|
||||
|
||||
memcpy(GDP, &Tmp, 16);
|
||||
memcpy(GDP, &Tmp, sizeof(Tmp));
|
||||
}
|
||||
|
||||
DEF_OP(VCMPEQ) {
|
||||
|
||||
+25
-10
@@ -2263,16 +2263,31 @@ DEF_OP(VUnZip2) {
|
||||
}
|
||||
|
||||
DEF_OP(VBSL) {
|
||||
auto Op = IROp->C<IR::IROp_VBSL>();
|
||||
if (IROp->Size == 16) {
|
||||
mov(VTMP1.V16B(), GetSrc(Op->VectorMask.ID()).V16B());
|
||||
bsl(VTMP1.V16B(), GetSrc(Op->VectorTrue.ID()).V16B(), GetSrc(Op->VectorFalse.ID()).V16B());
|
||||
mov(GetDst(Node).V16B(), VTMP1.V16B());
|
||||
}
|
||||
else {
|
||||
mov(VTMP1.V8B(), GetSrc(Op->VectorMask.ID()).V8B());
|
||||
bsl(VTMP1.V8B(), GetSrc(Op->VectorTrue.ID()).V8B(), GetSrc(Op->VectorFalse.ID()).V8B());
|
||||
mov(GetDst(Node).V8B(), VTMP1.V8B());
|
||||
const auto Op = IROp->C<IR::IROp_VBSL>();
|
||||
const auto OpSize = IROp->Size;
|
||||
|
||||
const auto Dst = GetDst(Node);
|
||||
const auto VectorFalse = GetSrc(Op->VectorFalse.ID());
|
||||
const auto VectorTrue = GetSrc(Op->VectorTrue.ID());
|
||||
const auto VectorMask = GetSrc(Op->VectorMask.ID());
|
||||
|
||||
if (HostSupportsSVE) {
|
||||
// NOTE: Slight parameter difference from ASIMD
|
||||
// ASIMD -> BSL Mask, True, False
|
||||
// SVE -> BSL True, True, False, Mask
|
||||
mov(VTMP1.Z().VnD(), VectorTrue.Z().VnD());
|
||||
bsl(VTMP1.Z().VnD(), VTMP1.Z().VnD(), VectorFalse.Z().VnD(), VectorMask.Z().VnD());
|
||||
mov(Dst.Z().VnD(), VTMP1.Z().VnD());
|
||||
} else {
|
||||
if (OpSize == 8) {
|
||||
mov(VTMP1.V8B(), VectorMask.V8B());
|
||||
bsl(VTMP1.V8B(), VectorTrue.V8B(), VectorFalse.V8B());
|
||||
mov(Dst.V8B(), VTMP1.V8B());
|
||||
} else {
|
||||
mov(VTMP1.V16B(), VectorMask.V16B());
|
||||
bsl(VTMP1.V16B(), VectorTrue.V16B(), VectorFalse.V16B());
|
||||
mov(Dst.V16B(), VTMP1.V16B());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1410,10 +1410,16 @@ DEF_OP(VUnZip2) {
|
||||
|
||||
|
||||
DEF_OP(VBSL) {
|
||||
auto Op = IROp->C<IR::IROp_VBSL>();
|
||||
vpand(xmm0, GetSrc(Op->VectorMask.ID()), GetSrc(Op->VectorTrue.ID()));
|
||||
vpandn(xmm12, GetSrc(Op->VectorMask.ID()), GetSrc(Op->VectorFalse.ID()));
|
||||
vpor(GetDst(Node), xmm0, xmm12);
|
||||
const auto Op = IROp->C<IR::IROp_VBSL>();
|
||||
|
||||
const auto Dst = ToYMM(GetDst(Node));
|
||||
const auto VectorFalse = ToYMM(GetSrc(Op->VectorFalse.ID()));
|
||||
const auto VectorTrue = ToYMM(GetSrc(Op->VectorTrue.ID()));
|
||||
const auto VectorMask = ToYMM(GetSrc(Op->VectorMask.ID()));
|
||||
|
||||
vpand(ymm0, VectorMask, VectorTrue);
|
||||
vpandn(ymm12, VectorMask, VectorFalse);
|
||||
vpor(Dst, ymm0, ymm12);
|
||||
}
|
||||
|
||||
DEF_OP(VCMPEQ) {
|
||||
|
||||
Reference in new issue
Block a user