mirror of
https://github.com/FEX-Emu/FEX.git
synced 2026-10-06 09:00:17 +02:00
[SVE256] Ensure insertion behavior for AES operations on SSE
These slipped through, so now we can add tests for them to prevent that from happening again.
This commit is contained in:
1 parent
1d695f6db4
commit
ab4fb7b3ad
11 files changed
+172
-14
No files matched your search
@@ -839,12 +839,12 @@ public:
|
||||
void SHA256MSG2Op(OpcodeArgs);
|
||||
void SHA256RNDS2Op(OpcodeArgs);
|
||||
|
||||
void AESImcOp(OpcodeArgs);
|
||||
void AESImcOp(OpcodeArgs, bool IsAVX);
|
||||
void AESEncOp(OpcodeArgs);
|
||||
void AESEncLastOp(OpcodeArgs);
|
||||
void AESDecOp(OpcodeArgs);
|
||||
void AESDecLastOp(OpcodeArgs);
|
||||
void AESKeyGenAssist(OpcodeArgs);
|
||||
void AESKeyGenAssist(OpcodeArgs, bool IsAVX);
|
||||
|
||||
void VFMAImpl(OpcodeArgs, IROps IROp, bool Scalar, uint8_t Src1Idx, uint8_t Src2Idx, uint8_t AddendIdx);
|
||||
void VFMAddSubImpl(OpcodeArgs, bool AddSub, uint8_t Src1Idx, uint8_t Src2Idx, uint8_t AddendIdx);
|
||||
|
||||
@@ -180,14 +180,19 @@ void OpDispatchBuilder::SHA256RNDS2Op(OpcodeArgs) {
|
||||
StoreResultFPR(Op, Result);
|
||||
}
|
||||
|
||||
void OpDispatchBuilder::AESImcOp(OpcodeArgs) {
|
||||
void OpDispatchBuilder::AESImcOp(OpcodeArgs, bool IsAVX) {
|
||||
if (!CTX->HostFeatures.SupportsAES) {
|
||||
UnimplementedOp(Op);
|
||||
return;
|
||||
}
|
||||
Ref Src = LoadSourceFPR(Op, Op->Src[0], Op->Flags);
|
||||
Ref Result = _VAESImc(Src);
|
||||
StoreResultFPR(Op, Result);
|
||||
|
||||
if (IsAVX) {
|
||||
StoreResultFPR(Op, Result);
|
||||
} else {
|
||||
StoreResult_WithAVXInsert(VectorOpType::SSE, RegClass::FPR, Op, Result);
|
||||
}
|
||||
}
|
||||
|
||||
void OpDispatchBuilder::AESEncOp(OpcodeArgs) {
|
||||
@@ -198,7 +203,7 @@ void OpDispatchBuilder::AESEncOp(OpcodeArgs) {
|
||||
Ref Dest = LoadSourceFPR(Op, Op->Dest, Op->Flags);
|
||||
Ref Src = LoadSourceFPR(Op, Op->Src[0], Op->Flags);
|
||||
Ref Result = _VAESEnc(OpSize::i128Bit, Dest, Src, LoadZeroVector(OpSize::i128Bit));
|
||||
StoreResultFPR(Op, Result);
|
||||
StoreResult_WithAVXInsert(VectorOpType::SSE, RegClass::FPR, Op, Result);
|
||||
}
|
||||
|
||||
void OpDispatchBuilder::VAESEncOp(OpcodeArgs) {
|
||||
@@ -223,7 +228,7 @@ void OpDispatchBuilder::AESEncLastOp(OpcodeArgs) {
|
||||
Ref Dest = LoadSourceFPR(Op, Op->Dest, Op->Flags);
|
||||
Ref Src = LoadSourceFPR(Op, Op->Src[0], Op->Flags);
|
||||
Ref Result = _VAESEncLast(OpSize::i128Bit, Dest, Src, LoadZeroVector(OpSize::i128Bit));
|
||||
StoreResultFPR(Op, Result);
|
||||
StoreResult_WithAVXInsert(VectorOpType::SSE, RegClass::FPR, Op, Result);
|
||||
}
|
||||
|
||||
void OpDispatchBuilder::VAESEncLastOp(OpcodeArgs) {
|
||||
@@ -248,7 +253,7 @@ void OpDispatchBuilder::AESDecOp(OpcodeArgs) {
|
||||
Ref Dest = LoadSourceFPR(Op, Op->Dest, Op->Flags);
|
||||
Ref Src = LoadSourceFPR(Op, Op->Src[0], Op->Flags);
|
||||
Ref Result = _VAESDec(OpSize::i128Bit, Dest, Src, LoadZeroVector(OpSize::i128Bit));
|
||||
StoreResultFPR(Op, Result);
|
||||
StoreResult_WithAVXInsert(VectorOpType::SSE, RegClass::FPR, Op, Result);
|
||||
}
|
||||
|
||||
void OpDispatchBuilder::VAESDecOp(OpcodeArgs) {
|
||||
@@ -273,7 +278,7 @@ void OpDispatchBuilder::AESDecLastOp(OpcodeArgs) {
|
||||
Ref Dest = LoadSourceFPR(Op, Op->Dest, Op->Flags);
|
||||
Ref Src = LoadSourceFPR(Op, Op->Src[0], Op->Flags);
|
||||
Ref Result = _VAESDecLast(OpSize::i128Bit, Dest, Src, LoadZeroVector(OpSize::i128Bit));
|
||||
StoreResultFPR(Op, Result);
|
||||
StoreResult_WithAVXInsert(VectorOpType::SSE, RegClass::FPR, Op, Result);
|
||||
}
|
||||
|
||||
void OpDispatchBuilder::VAESDecLastOp(OpcodeArgs) {
|
||||
@@ -298,14 +303,19 @@ Ref OpDispatchBuilder::AESKeyGenAssistImpl(OpcodeArgs) {
|
||||
return _VAESKeyGenAssist(Src, KeyGenSwizzle, LoadZeroVector(OpSize::i128Bit), RCON);
|
||||
}
|
||||
|
||||
void OpDispatchBuilder::AESKeyGenAssist(OpcodeArgs) {
|
||||
void OpDispatchBuilder::AESKeyGenAssist(OpcodeArgs, bool IsAVX) {
|
||||
if (!CTX->HostFeatures.SupportsAES) {
|
||||
UnimplementedOp(Op);
|
||||
return;
|
||||
}
|
||||
|
||||
Ref Result = AESKeyGenAssistImpl(Op);
|
||||
StoreResultFPR(Op, Result);
|
||||
|
||||
if (IsAVX) {
|
||||
StoreResultFPR(Op, Result);
|
||||
} else {
|
||||
StoreResult_WithAVXInsert(VectorOpType::SSE, RegClass::FPR, Op, Result);
|
||||
}
|
||||
}
|
||||
|
||||
void OpDispatchBuilder::PCLMULQDQOp(OpcodeArgs) {
|
||||
|
||||
@@ -79,7 +79,7 @@ constexpr DispatchTableEntry OpDispatch_H0F38Table[] = {
|
||||
{OPD(PF_38_NONE, 0xCC), 1, &OpDispatchBuilder::SHA256MSG1Op},
|
||||
{OPD(PF_38_NONE, 0xCD), 1, &OpDispatchBuilder::SHA256MSG2Op},
|
||||
|
||||
{OPD(PF_38_66, 0xDB), 1, &OpDispatchBuilder::AESImcOp},
|
||||
{OPD(PF_38_66, 0xDB), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AESImcOp, false>},
|
||||
{OPD(PF_38_66, 0xDC), 1, &OpDispatchBuilder::AESEncOp},
|
||||
{OPD(PF_38_66, 0xDD), 1, &OpDispatchBuilder::AESEncLastOp},
|
||||
{OPD(PF_38_66, 0xDE), 1, &OpDispatchBuilder::AESDecOp},
|
||||
|
||||
@@ -37,7 +37,7 @@ constexpr auto OpDispatchTableGenH0F3A = []() consteval {
|
||||
{OPD(REX, PF_3A_66, 0x63), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VPCMPISTRIOp, false>},
|
||||
|
||||
{OPD(REX, PF_3A_NONE, 0xCC), 1, &OpDispatchBuilder::SHA1RNDS4Op},
|
||||
{OPD(REX, PF_3A_66, 0xDF), 1, &OpDispatchBuilder::AESKeyGenAssist},
|
||||
{OPD(REX, PF_3A_66, 0xDF), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AESKeyGenAssist, false>},
|
||||
|
||||
};
|
||||
return std::to_array(Table);
|
||||
|
||||
@@ -808,7 +808,7 @@ namespace AVX256 {
|
||||
{OPD(2, 0b01, 0xB6), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VFMAddSubImpl, true, 2, 3, 1>}, // VFMADDSUB
|
||||
{OPD(2, 0b01, 0xB7), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VFMAddSubImpl, false, 2, 3, 1>}, // VFMSUBADD
|
||||
|
||||
{OPD(2, 0b01, 0xDB), 1, &OpDispatchBuilder::AESImcOp},
|
||||
{OPD(2, 0b01, 0xDB), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AESImcOp, true>},
|
||||
{OPD(2, 0b01, 0xDC), 1, &OpDispatchBuilder::VAESEncOp},
|
||||
{OPD(2, 0b01, 0xDD), 1, &OpDispatchBuilder::VAESEncLastOp},
|
||||
{OPD(2, 0b01, 0xDE), 1, &OpDispatchBuilder::VAESDecOp},
|
||||
@@ -860,7 +860,7 @@ namespace AVX256 {
|
||||
{OPD(3, 0b01, 0x62), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VPCMPISTRMOp, true>},
|
||||
{OPD(3, 0b01, 0x63), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VPCMPISTRIOp, true>},
|
||||
|
||||
{OPD(3, 0b01, 0xDF), 1, &OpDispatchBuilder::AESKeyGenAssist},
|
||||
{OPD(3, 0b01, 0xDF), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::AESKeyGenAssist, true>},
|
||||
};
|
||||
#undef OPD
|
||||
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
%ifdef CONFIG
|
||||
{
|
||||
"HostFeatures": ["AES", "AVX"],
|
||||
"RegData": {
|
||||
"XMM0": ["0x0871fe8ffd3f45ff", "0xf85579bd6f9b3f24", "0xccdbcfc31f3ff0f3", "0x108390defebac4be"],
|
||||
"XMM2": ["0x0871fe8ffd3f45ff", "0xf85579bd6f9b3f24", "0", "0"]
|
||||
}
|
||||
}
|
||||
%endif
|
||||
|
||||
vmovapd ymm0, [rel .data]
|
||||
vmovapd ymm1, [rel .data + 32]
|
||||
vmovapd ymm2, [rel .data]
|
||||
vmovapd ymm3, [rel .data + 32]
|
||||
|
||||
aesdec xmm0, xmm1
|
||||
vaesdec xmm2, xmm2, xmm3
|
||||
|
||||
hlt
|
||||
|
||||
align 32
|
||||
.data:
|
||||
dq 0xfdecd28fab3fa4a5, 0x7d7ccd8836d09fc2, 0xccdbcfc31f3ff0f3, 0x108390defebac4be
|
||||
dq 0x43cc1ad6970b4549, 0xbd7eb46a1278f793, 0xef673dac6e4cbb7b, 0x5b3d85d342718be9
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
%ifdef CONFIG
|
||||
{
|
||||
"HostFeatures": ["AES", "AVX"],
|
||||
"RegData": {
|
||||
"XMM0": ["0x67cd07a5b66bc560", "0xb3fddafd015d883b", "0xccdbcfc31f3ff0f3", "0x108390defebac4be"],
|
||||
"XMM2": ["0x67cd07a5b66bc560", "0xb3fddafd015d883b", "0", "0"]
|
||||
}
|
||||
}
|
||||
%endif
|
||||
|
||||
vmovapd ymm0, [rel .data]
|
||||
vmovapd ymm1, [rel .data + 32]
|
||||
vmovapd ymm2, [rel .data]
|
||||
vmovapd ymm3, [rel .data + 32]
|
||||
|
||||
aesdeclast xmm0, xmm1
|
||||
vaesdeclast xmm2, xmm2, xmm3
|
||||
|
||||
hlt
|
||||
|
||||
align 32
|
||||
.data:
|
||||
dq 0xfdecd28fab3fa4a5, 0x7d7ccd8836d09fc2, 0xccdbcfc31f3ff0f3, 0x108390defebac4be
|
||||
dq 0x43cc1ad6970b4549, 0xbd7eb46a1278f793, 0xef673dac6e4cbb7b, 0x5b3d85d342718be9
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
%ifdef CONFIG
|
||||
{
|
||||
"HostFeatures": ["AES", "AVX"],
|
||||
"RegData": {
|
||||
"XMM0": ["0xd9e29634bd425d0e", "0x677baee91df67824", "0xccdbcfc31f3ff0f3", "0x108390defebac4be"],
|
||||
"XMM2": ["0xd9e29634bd425d0e", "0x677baee91df67824", "0", "0"]
|
||||
}
|
||||
}
|
||||
%endif
|
||||
|
||||
vmovapd ymm0, [rel .data]
|
||||
vmovapd ymm1, [rel .data + 32]
|
||||
vmovapd ymm2, [rel .data]
|
||||
vmovapd ymm3, [rel .data + 32]
|
||||
|
||||
aesenc xmm0, xmm1
|
||||
vaesenc xmm2, xmm2, xmm3
|
||||
|
||||
hlt
|
||||
|
||||
align 32
|
||||
.data:
|
||||
dq 0xfdecd28fab3fa4a5, 0x7d7ccd8836d09fc2, 0xccdbcfc31f3ff0f3, 0x108390defebac4be
|
||||
dq 0x43cc1ad6970b4549, 0xbd7eb46a1278f793, 0xef673dac6e4cbb7b, 0x5b3d85d342718be9
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
%ifdef CONFIG
|
||||
{
|
||||
"HostFeatures": ["AES", "AVX"],
|
||||
"RegData": {
|
||||
"XMM0": ["0x21dcc1a5687bf04f", "0xb8b0fdae460d4ab6", "0xccdbcfc31f3ff0f3", "0x108390defebac4be"],
|
||||
"XMM2": ["0x21dcc1a5687bf04f", "0xb8b0fdae460d4ab6", "0", "0"]
|
||||
}
|
||||
}
|
||||
%endif
|
||||
|
||||
vmovapd ymm0, [rel .data]
|
||||
vmovapd ymm1, [rel .data + 32]
|
||||
vmovapd ymm2, [rel .data]
|
||||
vmovapd ymm3, [rel .data + 32]
|
||||
|
||||
aesenclast xmm0, xmm1
|
||||
vaesenclast xmm2, xmm2, xmm3
|
||||
|
||||
hlt
|
||||
|
||||
align 32
|
||||
.data:
|
||||
dq 0xfdecd28fab3fa4a5, 0x7d7ccd8836d09fc2, 0xccdbcfc31f3ff0f3, 0x108390defebac4be
|
||||
dq 0x43cc1ad6970b4549, 0xbd7eb46a1278f793, 0xef673dac6e4cbb7b, 0x5b3d85d342718be9
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
%ifdef CONFIG
|
||||
{
|
||||
"HostFeatures": ["AES", "AVX"],
|
||||
"RegData": {
|
||||
"XMM0": ["0x60ccbf502947c03e", "0xd946ea68cc5335a4", "0xccdbcfc31f3ff0f3", "0x108390defebac4be"],
|
||||
"XMM2": ["0x60ccbf502947c03e", "0xd946ea68cc5335a4", "0", "0"]
|
||||
}
|
||||
}
|
||||
%endif
|
||||
|
||||
vmovapd ymm0, [rel .data]
|
||||
vmovapd ymm1, [rel .data + 32]
|
||||
vmovapd ymm2, [rel .data]
|
||||
vmovapd ymm3, [rel .data + 32]
|
||||
|
||||
aesimc xmm0, xmm1
|
||||
vaesimc xmm2, xmm3
|
||||
|
||||
hlt
|
||||
|
||||
align 32
|
||||
.data:
|
||||
dq 0xfdecd28fab3fa4a5, 0x7d7ccd8836d09fc2, 0xccdbcfc31f3ff0f3, 0x108390defebac4be
|
||||
dq 0x43cc1ad6970b4549, 0xbd7eb46a1278f793, 0xef673dac6e4cbb7b, 0x5b3d85d342718be9
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
%ifdef CONFIG
|
||||
{
|
||||
"HostFeatures": ["AES", "AVX"],
|
||||
"RegData": {
|
||||
"XMM0": ["0xf61a4ba21a4ba2f6", "0x027af38d7af38d02", "0xccdbcfc31f3ff0f3", "0x108390defebac4be"],
|
||||
"XMM2": ["0xf61a4ba21a4ba2f6", "0x027af38d7af38d02", "0", "0"]
|
||||
}
|
||||
}
|
||||
%endif
|
||||
|
||||
vmovapd ymm0, [rel .data]
|
||||
vmovapd ymm2, [rel .data]
|
||||
|
||||
aeskeygenassist xmm0, [rel .data + 32], 0
|
||||
vaeskeygenassist xmm2, [rel .data + 32], 0
|
||||
|
||||
hlt
|
||||
|
||||
align 32
|
||||
.data:
|
||||
dq 0xfdecd28fab3fa4a5, 0x7d7ccd8836d09fc2, 0xccdbcfc31f3ff0f3, 0x108390defebac4be
|
||||
dq 0x43cc1ad6970b4549, 0xbd7eb46a1278f793, 0xef673dac6e4cbb7b, 0x5b3d85d342718be9
|
||||
|
||||
Reference in new issue
Block a user