mirror of
https://github.com/FEX-Emu/FEX.git
synced 2026-10-29 04:01:27 +01:00
x86_64/VectorOps: Separate 128-bit VNeg path
This commit is contained in:
1 parent
37c7dee236
commit
569461a01c
1 file changed
+24
-6
@@ -1238,28 +1238,46 @@ DEF_OP(VFRSqrt) {
|
||||
|
||||
DEF_OP(VNeg) {
|
||||
const auto Op = IROp->C<IR::IROp_VNeg>();
|
||||
const auto OpSize = IROp->Size;
|
||||
|
||||
const auto ElementSize = Op->Header.ElementSize;
|
||||
const auto Is256Bit = OpSize == Core::CPUState::XMM_AVX_REG_SIZE;
|
||||
|
||||
const auto Dst = ToYMM(GetDst(Node));
|
||||
const auto Vector = ToYMM(GetSrc(Op->Vector.ID()));
|
||||
const auto Dst = GetDst(Node);
|
||||
const auto Vector = GetSrc(Op->Vector.ID());
|
||||
|
||||
vpxor(xmm15, xmm15, xmm15);
|
||||
switch (ElementSize) {
|
||||
case 1: {
|
||||
vpsubb(Dst, ymm15, Vector);
|
||||
if (Is256Bit) {
|
||||
vpsubb(ToYMM(Dst), ymm15, ToYMM(Vector));
|
||||
} else {
|
||||
vpsubb(Dst, xmm15, Vector);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 2: {
|
||||
vpsubw(Dst, ymm15, Vector);
|
||||
if (Is256Bit) {
|
||||
vpsubw(ToYMM(Dst), ymm15, ToYMM(Vector));
|
||||
} else {
|
||||
vpsubw(Dst, xmm15, Vector);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 4: {
|
||||
vpsubd(Dst, ymm15, Vector);
|
||||
if (Is256Bit) {
|
||||
vpsubd(ToYMM(Dst), ymm15, ToYMM(Vector));
|
||||
} else {
|
||||
vpsubd(Dst, xmm15, Vector);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 8: {
|
||||
vpsubq(Dst, ymm15, Vector);
|
||||
if (Is256Bit) {
|
||||
vpsubq(ToYMM(Dst), ymm15, ToYMM(Vector));
|
||||
} else {
|
||||
vpsubq(Dst, xmm15, Vector);
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
|
||||
Reference in new issue
Block a user