mirror of
https://github.com/FEX-Emu/FEX.git
synced 2026-10-06 14:00:16 +02:00
Merge pull request #4929 from Sonicadvance1/sse4a_imm
OpcodeDispatcher: Implement support for imm variants of SSE4a extrq/insertq
This commit is contained in:
15 files changed
+263
-23
No files matched your search
@@ -41,6 +41,7 @@ namespace FEXCore::CPU {
|
||||
const auto Op = IROp->C<IR::IROp_##FEXOp>(); \
|
||||
const auto OpSize = IROp->Size; \
|
||||
const auto Is256Bit = OpSize == IR::OpSize::i256Bit; \
|
||||
const auto Is128Bit = OpSize == IR::OpSize::i128Bit; \
|
||||
LOGMAN_THROW_A_FMT(!Is256Bit || HostSupportsSVE256, "Need SVE256 support in order to use {} with 256-bit operation", __func__); \
|
||||
\
|
||||
const auto Dst = GetVReg(Node); \
|
||||
@@ -49,8 +50,10 @@ namespace FEXCore::CPU {
|
||||
\
|
||||
if (HostSupportsSVE256 && Is256Bit) { \
|
||||
ARMOp(Dst.Z(), Vector1.Z(), Vector2.Z()); \
|
||||
} else { \
|
||||
} else if (Is128Bit) { \
|
||||
ARMOp(Dst.Q(), Vector1.Q(), Vector2.Q()); \
|
||||
} else { \
|
||||
ARMOp(Dst.D(), Vector1.D(), Vector2.D()); \
|
||||
} \
|
||||
}
|
||||
|
||||
|
||||
@@ -908,6 +908,8 @@ public:
|
||||
void VPCLMULQDQOp(OpcodeArgs);
|
||||
|
||||
void CRC32(OpcodeArgs);
|
||||
void Extrq_imm(OpcodeArgs);
|
||||
void Insertq_imm(OpcodeArgs);
|
||||
|
||||
void BreakOp(OpcodeArgs, FEXCore::IR::BreakDefinition BreakDefinition);
|
||||
void UnimplementedOp(OpcodeArgs);
|
||||
|
||||
@@ -151,6 +151,9 @@ constexpr DispatchTableEntry OpDispatch_SecondaryGroupTables[] = {
|
||||
{OPD(FEXCore::X86Tables::TYPE_GROUP_16, PF_F2, 3), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::Prefetch, false, false, 3>},
|
||||
{OPD(FEXCore::X86Tables::TYPE_GROUP_16, PF_F2, 4), 4, &OpDispatchBuilder::NOPOp},
|
||||
|
||||
// GROUP 17
|
||||
{OPD(FEXCore::X86Tables::TYPE_GROUP_17, PF_66, 0), 1, &OpDispatchBuilder::Extrq_imm},
|
||||
|
||||
// GROUP P
|
||||
{OPD(FEXCore::X86Tables::TYPE_GROUP_P, PF_NONE, 0), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::Prefetch, false, false, 1>},
|
||||
{OPD(FEXCore::X86Tables::TYPE_GROUP_P, PF_NONE, 1), 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::Prefetch, true, false, 1>},
|
||||
|
||||
@@ -198,6 +198,7 @@ constexpr DispatchTableEntry OpDispatch_SecondaryRepNEModTables[] = {
|
||||
{0x5E, 1, &OpDispatchBuilder::VectorScalarInsertALUOp<IR::OP_VFDIVSCALARINSERT, OpSize::i64Bit>},
|
||||
{0x5F, 1, &OpDispatchBuilder::VectorScalarInsertALUOp<IR::OP_VFMAXSCALARINSERT, OpSize::i64Bit>},
|
||||
{0x70, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::PSHUFWOp, true>},
|
||||
{0x78, 1, &OpDispatchBuilder::Insertq_imm},
|
||||
{0x7C, 1, &OpDispatchBuilder::Bind<&OpDispatchBuilder::VectorALUOp, IR::OP_VFADDP, OpSize::i32Bit>},
|
||||
{0x7D, 1, &OpDispatchBuilder::HSUBP<OpSize::i32Bit>},
|
||||
{0xD0, 1, &OpDispatchBuilder::ADDSUBPOp<OpSize::i32Bit>},
|
||||
|
||||
@@ -5132,4 +5132,51 @@ void OpDispatchBuilder::VPGATHER(OpcodeArgs) {
|
||||
template void OpDispatchBuilder::VPGATHER<OpSize::i32Bit>(OpcodeArgs);
|
||||
template void OpDispatchBuilder::VPGATHER<OpSize::i64Bit>(OpcodeArgs);
|
||||
|
||||
void OpDispatchBuilder::Extrq_imm(OpcodeArgs) {
|
||||
const uint8_t MaskWidth = Op->Src[1].Literal() & 0x3F;
|
||||
const uint8_t Shift = (Op->Src[1].Literal() >> 8) & 0x3F;
|
||||
|
||||
Ref Dest = LoadSourceFPR(Op, Op->Dest, Op->Flags);
|
||||
Ref Result = Dest;
|
||||
if (Shift > 0) {
|
||||
Result = _VUShrI(OpSize::i64Bit, OpSize::i64Bit, Dest, Shift);
|
||||
}
|
||||
|
||||
const uint64_t Mask = ~0ULL >> (MaskWidth == 0 ? 0 : (64 - MaskWidth));
|
||||
const Ref ZeroRegister = LoadZeroVector(OpSize::i128Bit);
|
||||
const Ref MaskVector = _VInsGPR(OpSize::i128Bit, OpSize::i64Bit, 0, ZeroRegister, _Constant(Mask));
|
||||
Result = _VAnd(OpSize::i128Bit, OpSize::i64Bit, Result, MaskVector);
|
||||
|
||||
StoreResultFPR(Op, Result, OpSize::iInvalid);
|
||||
}
|
||||
|
||||
void OpDispatchBuilder::Insertq_imm(OpcodeArgs) {
|
||||
const uint8_t MaskWidth = Op->Src[1].Literal() & 0x3F;
|
||||
const uint8_t Shift = (Op->Src[1].Literal() >> 8) & 0x3F;
|
||||
|
||||
Ref Dest = LoadSourceFPR(Op, Op->Dest, Op->Flags);
|
||||
Ref Src = LoadSourceFPR(Op, Op->Src[0], Op->Flags);
|
||||
|
||||
const uint64_t Mask = ~0ULL >> (MaskWidth == 0 ? 0 : (64 - MaskWidth));
|
||||
const Ref ZeroRegister = LoadZeroVector(OpSize::i128Bit);
|
||||
Ref MaskVector = _VInsGPR(OpSize::i128Bit, OpSize::i64Bit, 0, ZeroRegister, _Constant(Mask));
|
||||
|
||||
// Mask incoming source.
|
||||
Src = _VAnd(OpSize::i64Bit, OpSize::i64Bit, Src, MaskVector);
|
||||
|
||||
// If shifting then shift source and mask in to the correct location.
|
||||
if (Shift) {
|
||||
Src = _VShlI(OpSize::i64Bit, OpSize::i64Bit, Src, Shift);
|
||||
MaskVector = _VShlI(OpSize::i128Bit, OpSize::i64Bit, MaskVector, Shift);
|
||||
}
|
||||
|
||||
// Negate the mask.
|
||||
MaskVector = _VNot(OpSize::i64Bit, OpSize::i64Bit, MaskVector);
|
||||
|
||||
Dest = _VAnd(OpSize::i64Bit, OpSize::i64Bit, Dest, MaskVector);
|
||||
const Ref Result = _VOr(OpSize::i64Bit, OpSize::i64Bit, Dest, Src);
|
||||
|
||||
StoreResultFPR(Op, Result, OpSize::iInvalid);
|
||||
}
|
||||
|
||||
} // namespace FEXCore::IR
|
||||
@@ -442,7 +442,7 @@ constexpr std::array<X86InstInfo, MAX_REPNE_MOD_TABLE_SIZE> RepNEModOps = []() c
|
||||
{0x70, 1, X86InstInfo{"PSHUFLW", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 1}},
|
||||
{0x71, 3, X86InstInfo{"", TYPE_COPY_OTHER, FLAGS_NONE, 0}},
|
||||
{0x74, 4, X86InstInfo{"", TYPE_INVALID, FLAGS_NONE, 0}},
|
||||
{0x78, 1, X86InstInfo{"INSERTQ", TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_SF_MOD_REG_ONLY | FLAGS_XMM_FLAGS,2}},
|
||||
{0x78, 1, X86InstInfo{"INSERTQ", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_SF_MOD_REG_ONLY | FLAGS_XMM_FLAGS,2}},
|
||||
{0x79, 1, X86InstInfo{"INSERTQ", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_SF_MOD_REG_ONLY | FLAGS_XMM_FLAGS, 0}},
|
||||
{0x7A, 2, X86InstInfo{"", TYPE_INVALID, FLAGS_NONE, 0}},
|
||||
{0x7C, 1, X86InstInfo{"HADDPS", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0}},
|
||||
|
||||
@@ -2150,22 +2150,34 @@
|
||||
|
||||
"FPR = VAnd OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector1, FPR:$Vector2": {
|
||||
"DestSize": "RegisterSize",
|
||||
"ElementSize": "ElementSize"
|
||||
"ElementSize": "ElementSize",
|
||||
"EmitValidation": [
|
||||
"RegisterSize == FEXCore::IR::OpSize::i256Bit || RegisterSize == FEXCore::IR::OpSize::i128Bit || RegisterSize == FEXCore::IR::OpSize::i64Bit"
|
||||
]
|
||||
},
|
||||
|
||||
"FPR = VAndn OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector1, FPR:$Vector2": {
|
||||
"DestSize": "RegisterSize",
|
||||
"ElementSize": "ElementSize"
|
||||
"ElementSize": "ElementSize",
|
||||
"EmitValidation": [
|
||||
"RegisterSize == FEXCore::IR::OpSize::i256Bit || RegisterSize == FEXCore::IR::OpSize::i128Bit || RegisterSize == FEXCore::IR::OpSize::i64Bit"
|
||||
]
|
||||
},
|
||||
|
||||
"FPR = VOr OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector1, FPR:$Vector2": {
|
||||
"DestSize": "RegisterSize",
|
||||
"ElementSize": "ElementSize"
|
||||
"ElementSize": "ElementSize",
|
||||
"EmitValidation": [
|
||||
"RegisterSize == FEXCore::IR::OpSize::i256Bit || RegisterSize == FEXCore::IR::OpSize::i128Bit || RegisterSize == FEXCore::IR::OpSize::i64Bit"
|
||||
]
|
||||
},
|
||||
|
||||
"FPR = VXor OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector1, FPR:$Vector2": {
|
||||
"DestSize": "RegisterSize",
|
||||
"ElementSize": "ElementSize"
|
||||
"ElementSize": "ElementSize",
|
||||
"EmitValidation": [
|
||||
"RegisterSize == FEXCore::IR::OpSize::i256Bit || RegisterSize == FEXCore::IR::OpSize::i128Bit || RegisterSize == FEXCore::IR::OpSize::i64Bit"
|
||||
]
|
||||
},
|
||||
|
||||
"FPR = VUQAdd OpSize:#RegisterSize, OpSize:#ElementSize, FPR:$Vector1, FPR:$Vector2": {
|
||||
|
||||
@@ -110,3 +110,7 @@ Test_Secondary/09_F3_07.asm
|
||||
|
||||
# Vixl sim at 256-bit vector width access too much memory with some AVX instructions
|
||||
Test_modrm_oob/VEX.asm
|
||||
|
||||
# Vixl simulator with 256-bit vector width doesn't always do correct data retention for 128-bit non-AVX operations.
|
||||
Test_SSE4a/extrq_imm.asm
|
||||
Test_SSE4a/insertq_imm.asm
|
||||
@@ -0,0 +1,59 @@
|
||||
%ifdef CONFIG
|
||||
{
|
||||
"RegData": {
|
||||
"XMM0": ["0x48510f254d2fa47f", "0", "0x30b556de1f6de86b", "0x67d29af330ae762c"],
|
||||
"XMM1": ["0", "0", "0xb615b9533de8ad09", "0xb76472a37404b890"],
|
||||
"XMM2": ["0x3615b9533de8ad09", "0", "0x24426b4c72f110ad", "0x8a6789f2d415a567"],
|
||||
"XMM3": ["0", "0", "0x8996f88178236612", "0x19a26b823d3ca2a9"],
|
||||
"XMM4": ["0x00000001132df102", "0", "0x00f658ab689712b0", "0xc97d9d031ed21972"],
|
||||
"XMM5": ["0x0000000001ecb156", "0", "0x1c86432298df55c8", "0xb29bfeda891be9cc"],
|
||||
"XMM6": ["0x00000000432298df", "0", "0x88b0bd28710f2147", "0xc4e95e887fb5ac38"],
|
||||
"XMM7": ["0x0000b0bd28710f21", "0", "0xa7df8c2ad03e5be4", "0x6c70d1eec2d395ea"]
|
||||
}
|
||||
}
|
||||
%endif
|
||||
|
||||
; Random data
|
||||
vmovups ymm0, [rel .random_data + (0 * 16)]
|
||||
vmovups ymm1, [rel .random_data + (1 * 16)]
|
||||
vmovups ymm2, [rel .random_data + (2 * 16)]
|
||||
vmovups ymm3, [rel .random_data + (3 * 16)]
|
||||
vmovups ymm4, [rel .random_data + (4 * 16)]
|
||||
vmovups ymm5, [rel .random_data + (5 * 16)]
|
||||
vmovups ymm6, [rel .random_data + (6 * 16)]
|
||||
vmovups ymm7, [rel .random_data + (7 * 16)]
|
||||
|
||||
; imm extrq
|
||||
; The upper 64-bits of the xmm are "undefined." Zen will zero.
|
||||
; Additionally if width and length is > 64 then the results are undefined.
|
||||
; - Behaviour is actually shift then mask so FEX matches "undefined" behaviour here.
|
||||
extrq xmm0, 0, 0
|
||||
extrq xmm1, 0, 63
|
||||
extrq xmm2, 63, 0
|
||||
extrq xmm3, 63, 63
|
||||
extrq xmm4, 0, 31
|
||||
extrq xmm5, 31, 31
|
||||
extrq xmm6, 31, 16
|
||||
extrq xmm7, 48, 8
|
||||
|
||||
hlt
|
||||
|
||||
align 16
|
||||
; 256bytes of random data
|
||||
.random_data:
|
||||
db 0x7f, 0xa4, 0x2f, 0x4d, 0x25, 0x0f, 0x51, 0x48, 0x86, 0x48, 0x97, 0x3a, 0x31, 0x74, 0x57, 0x2b
|
||||
db 0x6b, 0xe8, 0x6d, 0x1f, 0xde, 0x56, 0xb5, 0x30, 0x2c, 0x76, 0xae, 0x30, 0xf3, 0x9a, 0xd2, 0x67
|
||||
db 0x09, 0xad, 0xe8, 0x3d, 0x53, 0xb9, 0x15, 0xb6, 0x90, 0xb8, 0x04, 0x74, 0xa3, 0x72, 0x64, 0xb7
|
||||
db 0xad, 0x10, 0xf1, 0x72, 0x4c, 0x6b, 0x42, 0x24, 0x67, 0xa5, 0x15, 0xd4, 0xf2, 0x89, 0x67, 0x8a
|
||||
db 0x12, 0x66, 0x23, 0x78, 0x81, 0xf8, 0x96, 0x89, 0xa9, 0xa2, 0x3c, 0x3d, 0x82, 0x6b, 0xa2, 0x19
|
||||
db 0xb0, 0x12, 0x97, 0x68, 0xab, 0x58, 0xf6, 0x00, 0x72, 0x19, 0xd2, 0x1e, 0x03, 0x9d, 0x7d, 0xc9
|
||||
db 0xc8, 0x55, 0xdf, 0x98, 0x22, 0x43, 0x86, 0x1c, 0xcc, 0xe9, 0x1b, 0x89, 0xda, 0xfe, 0x9b, 0xb2
|
||||
db 0x47, 0x21, 0x0f, 0x71, 0x28, 0xbd, 0xb0, 0x88, 0x38, 0xac, 0xb5, 0x7f, 0x88, 0x5e, 0xe9, 0xc4
|
||||
db 0xe4, 0x5b, 0x3e, 0xd0, 0x2a, 0x8c, 0xdf, 0xa7, 0xea, 0x95, 0xd3, 0xc2, 0xee, 0xd1, 0x70, 0x6c
|
||||
db 0x18, 0x77, 0xc1, 0x38, 0x7b, 0xfc, 0xa9, 0x58, 0x92, 0xe8, 0xc6, 0xcd, 0x07, 0x5d, 0x3d, 0x76
|
||||
db 0xf4, 0x4c, 0x5b, 0x25, 0x7f, 0x9b, 0x02, 0x41, 0x78, 0x39, 0x9e, 0x3e, 0x4c, 0xa2, 0x79, 0xca
|
||||
db 0x1c, 0xe9, 0xf2, 0x9a, 0xaf, 0x6d, 0xfa, 0x57, 0x10, 0xc7, 0xfd, 0x5f, 0x20, 0x80, 0xf5, 0x65
|
||||
db 0x3c, 0x77, 0xfb, 0xa8, 0xdf, 0x94, 0x16, 0x4f, 0xc0, 0x78, 0x00, 0x76, 0x03, 0x8c, 0x82, 0x10
|
||||
db 0x7f, 0x07, 0xe0, 0x02, 0x92, 0xbb, 0xf9, 0x2e, 0xfa, 0x3d, 0x88, 0xc8, 0x24, 0x27, 0xa6, 0x1e
|
||||
db 0x04, 0x90, 0xf6, 0xf8, 0x76, 0x0a, 0x4c, 0x94, 0xbc, 0xb7, 0x8d, 0x8b, 0xf9, 0x65, 0xf5, 0x07
|
||||
db 0x7f, 0xc1, 0x37, 0x78, 0xa1, 0x1f, 0xc4, 0x10, 0x6c, 0x29, 0x5e, 0x7e, 0x32, 0x24, 0x92, 0x09
|
||||
@@ -0,0 +1,67 @@
|
||||
%ifdef CONFIG
|
||||
{
|
||||
"RegData": {
|
||||
"XMM0": ["0xa7df8c2ad03e5be4", "0", "0x30b556de1f6de86b", "0x67d29af330ae762c"],
|
||||
"XMM1": ["0x30b556de1f6de86b", "0", "0xb615b9533de8ad09", "0xb76472a37404b890"],
|
||||
"XMM2": ["0xc1029b7f255b4cf4", "0", "0x24426b4c72f110ad", "0x8a6789f2d415a567"],
|
||||
"XMM3": ["0x24426b4c72f110ad", "0", "0x8996f88178236612", "0x19a26b823d3ca2a9"],
|
||||
"XMM4": ["0xd47dbb9e78236612", "0", "0x00f658ab689712b0", "0xc97d9d031ed21972"],
|
||||
"XMM5": ["0x017003bfe89712b0", "0", "0x1c86432298df55c8", "0xb29bfeda891be9cc"],
|
||||
"XMM6": ["0x1c8678f6900455c8", "0", "0x88b0bd28710f2147", "0xc4e95e887fb5ac38"],
|
||||
"XMM7": ["0x881fa17837c17f47", "0", "0xa7df8c2ad03e5be4", "0x6c70d1eec2d395ea"]
|
||||
}
|
||||
}
|
||||
%endif
|
||||
|
||||
; Random data
|
||||
vmovups ymm0, [rel .random_data + (0 * 16)]
|
||||
vmovups ymm1, [rel .random_data + (1 * 16)]
|
||||
vmovups ymm2, [rel .random_data + (2 * 16)]
|
||||
vmovups ymm3, [rel .random_data + (3 * 16)]
|
||||
vmovups ymm4, [rel .random_data + (4 * 16)]
|
||||
vmovups ymm5, [rel .random_data + (5 * 16)]
|
||||
vmovups ymm6, [rel .random_data + (6 * 16)]
|
||||
vmovups ymm7, [rel .random_data + (7 * 16)]
|
||||
vmovups ymm8, [rel .random_data + (8 * 16)]
|
||||
vmovups ymm9, [rel .random_data + (9 * 16)]
|
||||
vmovups ymm10, [rel .random_data + (10 * 16)]
|
||||
vmovups ymm11, [rel .random_data + (11 * 16)]
|
||||
vmovups ymm12, [rel .random_data + (12 * 16)]
|
||||
vmovups ymm13, [rel .random_data + (13 * 16)]
|
||||
vmovups ymm14, [rel .random_data + (14 * 16)]
|
||||
vmovups ymm15, [rel .random_data + (15 * 16)]
|
||||
|
||||
; imm insertq
|
||||
; The upper 64-bits of the xmm are "undefined." Zen will zero.
|
||||
; Additionally if width and length is > 64 then the results are undefined.
|
||||
; - Behaviour is actually shift then mask so FEX matches "undefined" behaviour here.
|
||||
insertq xmm0, xmm8, 0, 0
|
||||
insertq xmm1, xmm9, 0, 63
|
||||
insertq xmm2, xmm10, 63, 0
|
||||
insertq xmm3, xmm11, 63, 63
|
||||
insertq xmm4, xmm12, 0, 31
|
||||
insertq xmm5, xmm13, 31, 31
|
||||
insertq xmm6, xmm14, 31, 16
|
||||
insertq xmm7, xmm15, 48, 8
|
||||
|
||||
hlt
|
||||
|
||||
align 16
|
||||
; 256bytes of random data
|
||||
.random_data:
|
||||
db 0x7f, 0xa4, 0x2f, 0x4d, 0x25, 0x0f, 0x51, 0x48, 0x86, 0x48, 0x97, 0x3a, 0x31, 0x74, 0x57, 0x2b
|
||||
db 0x6b, 0xe8, 0x6d, 0x1f, 0xde, 0x56, 0xb5, 0x30, 0x2c, 0x76, 0xae, 0x30, 0xf3, 0x9a, 0xd2, 0x67
|
||||
db 0x09, 0xad, 0xe8, 0x3d, 0x53, 0xb9, 0x15, 0xb6, 0x90, 0xb8, 0x04, 0x74, 0xa3, 0x72, 0x64, 0xb7
|
||||
db 0xad, 0x10, 0xf1, 0x72, 0x4c, 0x6b, 0x42, 0x24, 0x67, 0xa5, 0x15, 0xd4, 0xf2, 0x89, 0x67, 0x8a
|
||||
db 0x12, 0x66, 0x23, 0x78, 0x81, 0xf8, 0x96, 0x89, 0xa9, 0xa2, 0x3c, 0x3d, 0x82, 0x6b, 0xa2, 0x19
|
||||
db 0xb0, 0x12, 0x97, 0x68, 0xab, 0x58, 0xf6, 0x00, 0x72, 0x19, 0xd2, 0x1e, 0x03, 0x9d, 0x7d, 0xc9
|
||||
db 0xc8, 0x55, 0xdf, 0x98, 0x22, 0x43, 0x86, 0x1c, 0xcc, 0xe9, 0x1b, 0x89, 0xda, 0xfe, 0x9b, 0xb2
|
||||
db 0x47, 0x21, 0x0f, 0x71, 0x28, 0xbd, 0xb0, 0x88, 0x38, 0xac, 0xb5, 0x7f, 0x88, 0x5e, 0xe9, 0xc4
|
||||
db 0xe4, 0x5b, 0x3e, 0xd0, 0x2a, 0x8c, 0xdf, 0xa7, 0xea, 0x95, 0xd3, 0xc2, 0xee, 0xd1, 0x70, 0x6c
|
||||
db 0x18, 0x77, 0xc1, 0x38, 0x7b, 0xfc, 0xa9, 0x58, 0x92, 0xe8, 0xc6, 0xcd, 0x07, 0x5d, 0x3d, 0x76
|
||||
db 0xf4, 0x4c, 0x5b, 0x25, 0x7f, 0x9b, 0x02, 0x41, 0x78, 0x39, 0x9e, 0x3e, 0x4c, 0xa2, 0x79, 0xca
|
||||
db 0x1c, 0xe9, 0xf2, 0x9a, 0xaf, 0x6d, 0xfa, 0x57, 0x10, 0xc7, 0xfd, 0x5f, 0x20, 0x80, 0xf5, 0x65
|
||||
db 0x3c, 0x77, 0xfb, 0xa8, 0xdf, 0x94, 0x16, 0x4f, 0xc0, 0x78, 0x00, 0x76, 0x03, 0x8c, 0x82, 0x10
|
||||
db 0x7f, 0x07, 0xe0, 0x02, 0x92, 0xbb, 0xf9, 0x2e, 0xfa, 0x3d, 0x88, 0xc8, 0x24, 0x27, 0xa6, 0x1e
|
||||
db 0x04, 0x90, 0xf6, 0xf8, 0x76, 0x0a, 0x4c, 0x94, 0xbc, 0xb7, 0x8d, 0x8b, 0xf9, 0x65, 0xf5, 0x07
|
||||
db 0x7f, 0xc1, 0x37, 0x78, 0xa1, 0x1f, 0xc4, 0x10, 0x6c, 0x29, 0x5e, 0x7e, 0x32, 0x24, 0x92, 0x09
|
||||
@@ -1610,7 +1610,7 @@
|
||||
"ldr d2, [x28, #1040]",
|
||||
"ldr d3, [x28, #3216]",
|
||||
"cmlt v2.16b, v2.16b, #0",
|
||||
"and v2.16b, v2.16b, v3.16b",
|
||||
"and v2.8b, v2.8b, v3.8b",
|
||||
"addp v2.16b, v2.16b, v2.16b",
|
||||
"addp v2.8b, v2.8b, v2.8b",
|
||||
"addp v2.8b, v2.8b, v2.8b",
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
"ldr d2, [x28, #1040]",
|
||||
"ldr d3, [x28, #1056]",
|
||||
"movi v4.16b, #0x87",
|
||||
"and v3.16b, v3.16b, v4.16b",
|
||||
"and v3.8b, v3.8b, v4.8b",
|
||||
"tbl v2.8b, {v2.16b}, v3.8b",
|
||||
"str d2, [x28, #1040]",
|
||||
"strh w20, [x28, #1048]"
|
||||
|
||||
@@ -3692,7 +3692,7 @@
|
||||
"ldr d2, [x28, #1040]",
|
||||
"ldr d3, [x28, #3216]",
|
||||
"cmlt v2.16b, v2.16b, #0",
|
||||
"and v2.16b, v2.16b, v3.16b",
|
||||
"and v2.8b, v2.8b, v3.8b",
|
||||
"addp v2.16b, v2.16b, v2.16b",
|
||||
"addp v2.8b, v2.8b, v2.8b",
|
||||
"addp v2.8b, v2.8b, v2.8b",
|
||||
@@ -3750,7 +3750,7 @@
|
||||
"strb w20, [x28, #1186]",
|
||||
"ldr d2, [x28, #1056]",
|
||||
"ldr d3, [x28, #1040]",
|
||||
"and v2.16b, v3.16b, v2.16b",
|
||||
"and v2.8b, v3.8b, v2.8b",
|
||||
"str d2, [x28, #1040]",
|
||||
"strh w20, [x28, #1048]"
|
||||
]
|
||||
@@ -3806,7 +3806,7 @@
|
||||
"strb w20, [x28, #1186]",
|
||||
"ldr d2, [x28, #1056]",
|
||||
"ldr d3, [x28, #1040]",
|
||||
"bic v2.16b, v2.16b, v3.16b",
|
||||
"bic v2.8b, v2.8b, v3.8b",
|
||||
"str d2, [x28, #1040]",
|
||||
"strh w20, [x28, #1048]"
|
||||
]
|
||||
@@ -3967,7 +3967,7 @@
|
||||
"strb w20, [x28, #1186]",
|
||||
"ldr d2, [x28, #1056]",
|
||||
"ldr d3, [x28, #1040]",
|
||||
"orr v2.16b, v3.16b, v2.16b",
|
||||
"orr v2.8b, v3.8b, v2.8b",
|
||||
"str d2, [x28, #1040]",
|
||||
"strh w20, [x28, #1048]"
|
||||
]
|
||||
@@ -4023,7 +4023,7 @@
|
||||
"strb w20, [x28, #1186]",
|
||||
"ldr d2, [x28, #1056]",
|
||||
"ldr d3, [x28, #1040]",
|
||||
"eor v2.16b, v3.16b, v2.16b",
|
||||
"eor v2.8b, v3.8b, v2.8b",
|
||||
"str d2, [x28, #1040]",
|
||||
"strh w20, [x28, #1048]"
|
||||
]
|
||||
|
||||
@@ -799,27 +799,43 @@
|
||||
]
|
||||
},
|
||||
"extrq xmm0, 64, 0": {
|
||||
"ExpectedInstructionCount": 7,
|
||||
"Skip": "Yes",
|
||||
"ExpectedInstructionCount": 4,
|
||||
"Comment": [
|
||||
"SSE4a",
|
||||
"0x66 0x0f 0x78"
|
||||
],
|
||||
"ExpectedArm64ASM": [
|
||||
"movi v2.2d, #0x0",
|
||||
"mov x20, #0xffffffffffffffff",
|
||||
"mov v2.d[0], x20",
|
||||
"and v16.16b, v16.16b, v2.16b"
|
||||
]
|
||||
},
|
||||
"extrq xmm0, 32, 32": {
|
||||
"ExpectedInstructionCount": 7,
|
||||
"Skip": "Yes",
|
||||
"ExpectedInstructionCount": 5,
|
||||
"Comment": [
|
||||
"SSE4a",
|
||||
"0x66 0x0f 0x78"
|
||||
],
|
||||
"ExpectedArm64ASM": [
|
||||
"ushr v2.2d, v16.2d, #32",
|
||||
"movi v3.2d, #0x0",
|
||||
"mov w20, #0xffffffff",
|
||||
"mov v3.d[0], x20",
|
||||
"and v16.16b, v2.16b, v3.16b"
|
||||
]
|
||||
},
|
||||
"extrq xmm0, 0, 0": {
|
||||
"ExpectedInstructionCount": 7,
|
||||
"Skip": "Yes",
|
||||
"ExpectedInstructionCount": 4,
|
||||
"Comment": [
|
||||
"SSE4a",
|
||||
"0x66 0x0f 0x78"
|
||||
],
|
||||
"ExpectedArm64ASM": [
|
||||
"movi v2.2d, #0x0",
|
||||
"mov x20, #0xffffffffffffffff",
|
||||
"mov v2.d[0], x20",
|
||||
"and v16.16b, v16.16b, v2.16b"
|
||||
]
|
||||
},
|
||||
"extrq xmm0, xmm1": {
|
||||
|
||||
@@ -321,26 +321,52 @@
|
||||
},
|
||||
"insertq xmm0, xmm1, 0, 0": {
|
||||
"ExpectedInstructionCount": 7,
|
||||
"Skip": "Yes",
|
||||
"Comment": [
|
||||
"SSE4a",
|
||||
"0xf2 0x0f 0x78"
|
||||
],
|
||||
"ExpectedArm64ASM": [
|
||||
"movi v2.2d, #0x0",
|
||||
"mov x20, #0xffffffffffffffff",
|
||||
"mov v2.d[0], x20",
|
||||
"and v3.8b, v17.8b, v2.8b",
|
||||
"mvn v2.16b, v2.16b",
|
||||
"and v2.8b, v16.8b, v2.8b",
|
||||
"orr v16.8b, v2.8b, v3.8b"
|
||||
]
|
||||
},
|
||||
"insertq xmm0, xmm1, 64, 0": {
|
||||
"ExpectedInstructionCount": 7,
|
||||
"Skip": "Yes",
|
||||
"Comment": [
|
||||
"SSE4a",
|
||||
"0xf2 0x0f 0x78"
|
||||
],
|
||||
"ExpectedArm64ASM": [
|
||||
"movi v2.2d, #0x0",
|
||||
"mov x20, #0xffffffffffffffff",
|
||||
"mov v2.d[0], x20",
|
||||
"and v3.8b, v17.8b, v2.8b",
|
||||
"mvn v2.16b, v2.16b",
|
||||
"and v2.8b, v16.8b, v2.8b",
|
||||
"orr v16.8b, v2.8b, v3.8b"
|
||||
]
|
||||
},
|
||||
"insertq xmm0, xmm1, 32, 32": {
|
||||
"ExpectedInstructionCount": 7,
|
||||
"Skip": "Yes",
|
||||
"ExpectedInstructionCount": 9,
|
||||
"Comment": [
|
||||
"SSE4a",
|
||||
"0xf2 0x0f 0x78"
|
||||
],
|
||||
"ExpectedArm64ASM": [
|
||||
"movi v2.2d, #0x0",
|
||||
"mov w20, #0xffffffff",
|
||||
"mov v2.d[0], x20",
|
||||
"and v3.8b, v17.8b, v2.8b",
|
||||
"shl v3.2d, v3.2d, #32",
|
||||
"shl v2.2d, v2.2d, #32",
|
||||
"mvn v2.16b, v2.16b",
|
||||
"and v2.8b, v16.8b, v2.8b",
|
||||
"orr v16.8b, v2.8b, v3.8b"
|
||||
]
|
||||
},
|
||||
"insertq xmm0, xmm1": {
|
||||
|
||||
Reference in new issue
Block a user