From 6dfb6ccf8cac7d50d08bec08198686032d7e6630 Mon Sep 17 00:00:00 2001 From: merry Date: Sun, 14 Aug 2022 21:35:08 +0100 Subject: [PATCH] PreAllocator: Check if instruction supports a Vex prefix in IsVexSameOperandDestSrc1 (#3587) --- ARMeilleure/CodeGen/X86/AssemblerTable.cs | 5 +++++ ARMeilleure/CodeGen/X86/PreAllocator.cs | 6 +++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/ARMeilleure/CodeGen/X86/AssemblerTable.cs b/ARMeilleure/CodeGen/X86/AssemblerTable.cs index 68791fbb79..3af4220419 100644 --- a/ARMeilleure/CodeGen/X86/AssemblerTable.cs +++ b/ARMeilleure/CodeGen/X86/AssemblerTable.cs @@ -4,6 +4,11 @@ namespace ARMeilleure.CodeGen.X86 { partial class Assembler { + public static bool SupportsVexPrefix(X86Instruction inst) + { + return _instTable[(int)inst].Flags.HasFlag(InstructionFlags.Vex); + } + private const int BadOp = 0; [Flags] diff --git a/ARMeilleure/CodeGen/X86/PreAllocator.cs b/ARMeilleure/CodeGen/X86/PreAllocator.cs index 72bf64edf2..7d2d4df0d0 100644 --- a/ARMeilleure/CodeGen/X86/PreAllocator.cs +++ b/ARMeilleure/CodeGen/X86/PreAllocator.cs @@ -1297,11 +1297,15 @@ namespace ARMeilleure.CodeGen.X86 { if (IsIntrinsic(operation.Instruction)) { + IntrinsicInfo info = IntrinsicTable.GetInfo(operation.Intrinsic); + + bool hasVex = HardwareCapabilities.SupportsVexEncoding && Assembler.SupportsVexPrefix(info.Inst); + bool isUnary = operation.SourcesCount < 2; bool hasVecDest = operation.Destination != default && operation.Destination.Type == OperandType.V128; - return !HardwareCapabilities.SupportsVexEncoding && !isUnary && hasVecDest; + return !hasVex && !isUnary && hasVecDest; } return false;