[llvm] r313472 - [X86] Make PLCMULQDQ instructions commutable during isel to fold loads.
Craig Topper via llvm-commits
llvm-commits at lists.llvm.org
Sat Sep 16 16:18:50 PDT 2017
Author: ctopper
Date: Sat Sep 16 16:18:50 2017
New Revision: 313472
URL: http://llvm.org/viewvc/llvm-project?rev=313472&view=rev
Log:
[X86] Make PLCMULQDQ instructions commutable during isel to fold loads.
This adds new patterns and SDNodeXForm to enable the immediate to commuted.
Modified:
llvm/trunk/lib/Target/X86/X86InstrSSE.td
Modified: llvm/trunk/lib/Target/X86/X86InstrSSE.td
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86InstrSSE.td?rev=313472&r1=313471&r2=313472&view=diff
==============================================================================
--- llvm/trunk/lib/Target/X86/X86InstrSSE.td (original)
+++ llvm/trunk/lib/Target/X86/X86InstrSSE.td Sat Sep 16 16:18:50 2017
@@ -7315,6 +7315,27 @@ def PCLMULQDQrm : PCLMULIi8<0x44, MRMSrc
Sched<[WriteCLMulLd, ReadAfterLd]>;
} // Constraints = "$src1 = $dst"
+// Immediate transform to help with commuting.
+def PCLMULCommuteImm : SDNodeXForm<imm, [{
+ uint8_t Imm = N->getZExtValue();
+ return getI8Imm((uint8_t)((Imm >> 4) | (Imm << 4)), SDLoc(N));
+}]>;
+
+// We can commute a load in the first operand by swapping the sources and
+// rotating the immediate.
+let Predicates = [HasAVX, HasPCLMUL] in {
+ def : Pat<(int_x86_pclmulqdq (loadv2i64 addr:$src2), VR128:$src1,
+ (i8 imm:$src3)),
+ (VPCLMULQDQrm VR128:$src1, addr:$src2,
+ (PCLMULCommuteImm imm:$src3))>;
+}
+
+let Predicates = [NoAVX, HasPCLMUL] in {
+ def : Pat<(int_x86_pclmulqdq (loadv2i64 addr:$src2), VR128:$src1,
+ (i8 imm:$src3)),
+ (PCLMULQDQrm VR128:$src1, addr:$src2,
+ (PCLMULCommuteImm imm:$src3))>;
+}
multiclass pclmul_alias<string asm, int immop> {
def : InstAlias<!strconcat("pclmul", asm, "dq {$src, $dst|$dst, $src}"),
More information about the llvm-commits
mailing list