[llvm] [X86] Add (v)pcmpestr(m/i)q to set the W bit. (PR #184746)
Craig Topper via llvm-commits
llvm-commits at lists.llvm.org
Wed Mar 4 22:34:20 PST 2026
https://github.com/topperc created https://github.com/llvm/llvm-project/pull/184746
These instructions don't ignore the W bit as we had previously marked.
Also support (v)pcmpestr(m/i)l as an alias for the W0 form to match binutils.
Fixes part of #183635
>From b547e428a61f09de43e17cb7531f6a5b52108080 Mon Sep 17 00:00:00 2001
From: Craig Topper <craig.topper at sifive.com>
Date: Wed, 4 Mar 2026 21:55:31 -0800
Subject: [PATCH] [X86] Add (v)pcmpestr(m/i)q to set the W bit.
These instructions don't ignore the W bit as we had previously
marked.
Also support (v)pcmpestr(m/i)l as an alias for the W0 form to
match binutils.
Fixes part of #183635
---
llvm/lib/Target/X86/X86InstrSSE.td | 36 ++++++++++++++++++--
llvm/test/MC/Disassembler/X86/x86-64-avx.txt | 4 +--
llvm/test/MC/X86/SSE42-32.s | 16 +++++++++
llvm/test/MC/X86/SSE42-64.s | 32 +++++++++++++++++
llvm/test/MC/X86/avx-32-att.s | 16 +++++++++
llvm/test/MC/X86/avx-64-att.s | 32 +++++++++++++++++
llvm/test/TableGen/x86-fold-tables.inc | 4 +++
llvm/test/TableGen/x86-instr-mapping.inc | 4 +++
8 files changed, 140 insertions(+), 4 deletions(-)
diff --git a/llvm/lib/Target/X86/X86InstrSSE.td b/llvm/lib/Target/X86/X86InstrSSE.td
index f67bc0e74acc8..203344cd81aab 100644
--- a/llvm/lib/Target/X86/X86InstrSSE.td
+++ b/llvm/lib/Target/X86/X86InstrSSE.td
@@ -6677,10 +6677,26 @@ multiclass SS42AI_pcmpestrm<string asm> {
let Defs = [XMM0, EFLAGS], Uses = [EAX, EDX], hasSideEffects = 0 in {
let Predicates = [HasAVX] in
- defm VPCMPESTRM : SS42AI_pcmpestrm<"vpcmpestrm">, VEX, WIG;
+ defm VPCMPESTRM : SS42AI_pcmpestrm<"vpcmpestrm">, VEX;
defm PCMPESTRM : SS42AI_pcmpestrm<"pcmpestrm">;
}
+let Defs = [XMM0, EFLAGS], Uses = [RAX, RDX], hasSideEffects = 0 in {
+ let Predicates = [HasAVX, In64BitMode] in
+ defm VPCMPESTRMQ : SS42AI_pcmpestrm<"vpcmpestrmq">, VEX, REX_W;
+ let Predicates = [UseSSE42, In64BitMode] in
+ defm PCMPESTRMQ : SS42AI_pcmpestrm<"pcmpestrmq">, REX_W;
+}
+
+def : InstAlias<"vpcmpestrm{l}\t{$src5, $src3, $src1|$src1, $src3, $src5}",
+ (VPCMPESTRMrri VR128:$src1, VR128:$src3, u8imm:$src5), 0, "att">;
+def : InstAlias<"vpcmpestrm{l}\t{$src5, $src3, $src1|$src1, $src3, $src5}",
+ (VPCMPESTRMrmi VR128:$src1, i128mem:$src3, u8imm:$src5), 0, "att">;
+def : InstAlias<"pcmpestrm{l}\t{$src5, $src3, $src1|$src1, $src3, $src5}",
+ (PCMPESTRMrri VR128:$src1, VR128:$src3, u8imm:$src5), 0, "att">;
+def : InstAlias<"pcmpestrm{l}\t{$src5, $src3, $src1|$src1, $src3, $src5}",
+ (PCMPESTRMrmi VR128:$src1, i128mem:$src3, u8imm:$src5), 0, "att">;
+
multiclass SS42AI_pcmpistri<string asm> {
def rri : SS42AI<0x63, MRMSrcReg, (outs),
(ins VR128:$src1, VR128:$src2, u8imm:$src3),
@@ -6713,10 +6729,26 @@ multiclass SS42AI_pcmpestri<string asm> {
let Defs = [ECX, EFLAGS], Uses = [EAX, EDX], hasSideEffects = 0 in {
let Predicates = [HasAVX] in
- defm VPCMPESTRI : SS42AI_pcmpestri<"vpcmpestri">, VEX, WIG;
+ defm VPCMPESTRI : SS42AI_pcmpestri<"vpcmpestri">, VEX;
defm PCMPESTRI : SS42AI_pcmpestri<"pcmpestri">;
}
+let Defs = [ECX, EFLAGS], Uses = [RAX, RDX], hasSideEffects = 0 in {
+ let Predicates = [HasAVX, In64BitMode] in
+ defm VPCMPESTRIQ : SS42AI_pcmpestri<"vpcmpestriq">, VEX, REX_W;
+ let Predicates = [UseSSE42, In64BitMode] in
+ defm PCMPESTRIQ : SS42AI_pcmpestri<"pcmpestriq">, REX_W;
+}
+
+def : InstAlias<"vpcmpestri{l}\t{$src5, $src3, $src1|$src1, $src3, $src5}",
+ (VPCMPESTRIrri VR128:$src1, VR128:$src3, u8imm:$src5), 0, "att">;
+def : InstAlias<"vpcmpestri{l}\t{$src5, $src3, $src1|$src1, $src3, $src5}",
+ (VPCMPESTRIrmi VR128:$src1, i128mem:$src3, u8imm:$src5), 0, "att">;
+def : InstAlias<"pcmpestri{l}\t{$src5, $src3, $src1|$src1, $src3, $src5}",
+ (PCMPESTRIrri VR128:$src1, VR128:$src3, u8imm:$src5), 0, "att">;
+def : InstAlias<"pcmpestri{l}\t{$src5, $src3, $src1|$src1, $src3, $src5}",
+ (PCMPESTRIrmi VR128:$src1, i128mem:$src3, u8imm:$src5), 0, "att">;
+
//===----------------------------------------------------------------------===//
// SSE4.2 - CRC Instructions
//===----------------------------------------------------------------------===//
diff --git a/llvm/test/MC/Disassembler/X86/x86-64-avx.txt b/llvm/test/MC/Disassembler/X86/x86-64-avx.txt
index c0ca4cd715314..7caeaf0053950 100644
--- a/llvm/test/MC/Disassembler/X86/x86-64-avx.txt
+++ b/llvm/test/MC/Disassembler/X86/x86-64-avx.txt
@@ -9,13 +9,13 @@
# CHECK: vpcmpestri $100, %xmm3, %xmm11
0xc4 0x63 0x79 0x61 0xdb 0x64
-# CHECK: vpcmpestri $100, %xmm3, %xmm11
+# CHECK: vpcmpestriq $100, %xmm3, %xmm11
0xc4 0x63 0xf9 0x61 0xdb 0x64
# CHECK: vpcmpestrm $100, %xmm3, %xmm11
0xc4 0x63 0x79 0x60 0xdb 0x64
-# CHECK: vpcmpestrm $100, %xmm3, %xmm11
+# CHECK: vpcmpestrmq $100, %xmm3, %xmm11
0xc4 0x63 0xf9 0x60 0xdb 0x64
# CHECK: vpcmpistri $100, %xmm3, %xmm11
diff --git a/llvm/test/MC/X86/SSE42-32.s b/llvm/test/MC/X86/SSE42-32.s
index 0c4d8c640a5ff..7f33c3dc6f2c8 100644
--- a/llvm/test/MC/X86/SSE42-32.s
+++ b/llvm/test/MC/X86/SSE42-32.s
@@ -88,6 +88,10 @@ crc32l (%edx), %ebx
// CHECK: encoding: [0x66,0x0f,0x3a,0x61,0x8c,0x82,0x10,0xe3,0x0f,0xe3,0x00]
pcmpestri $0, -485498096(%edx,%eax,4), %xmm1
+// CHECK: pcmpestri $0, -485498096(%edx,%eax,4), %xmm1
+// CHECK: encoding: [0x66,0x0f,0x3a,0x61,0x8c,0x82,0x10,0xe3,0x0f,0xe3,0x00]
+pcmpestril $0, -485498096(%edx,%eax,4), %xmm1
+
// CHECK: pcmpestri $0, 485498096(%edx,%eax,4), %xmm1
// CHECK: encoding: [0x66,0x0f,0x3a,0x61,0x8c,0x82,0xf0,0x1c,0xf0,0x1c,0x00]
pcmpestri $0, 485498096(%edx,%eax,4), %xmm1
@@ -112,10 +116,18 @@ pcmpestri $0, (%edx), %xmm1
// CHECK: encoding: [0x66,0x0f,0x3a,0x61,0xc9,0x00]
pcmpestri $0, %xmm1, %xmm1
+// CHECK: pcmpestri $0, %xmm1, %xmm1
+// CHECK: encoding: [0x66,0x0f,0x3a,0x61,0xc9,0x00]
+pcmpestril $0, %xmm1, %xmm1
+
// CHECK: pcmpestrm $0, -485498096(%edx,%eax,4), %xmm1
// CHECK: encoding: [0x66,0x0f,0x3a,0x60,0x8c,0x82,0x10,0xe3,0x0f,0xe3,0x00]
pcmpestrm $0, -485498096(%edx,%eax,4), %xmm1
+// CHECK: pcmpestrm $0, -485498096(%edx,%eax,4), %xmm1
+// CHECK: encoding: [0x66,0x0f,0x3a,0x60,0x8c,0x82,0x10,0xe3,0x0f,0xe3,0x00]
+pcmpestrml $0, -485498096(%edx,%eax,4), %xmm1
+
// CHECK: pcmpestrm $0, 485498096(%edx,%eax,4), %xmm1
// CHECK: encoding: [0x66,0x0f,0x3a,0x60,0x8c,0x82,0xf0,0x1c,0xf0,0x1c,0x00]
pcmpestrm $0, 485498096(%edx,%eax,4), %xmm1
@@ -140,6 +152,10 @@ pcmpestrm $0, (%edx), %xmm1
// CHECK: encoding: [0x66,0x0f,0x3a,0x60,0xc9,0x00]
pcmpestrm $0, %xmm1, %xmm1
+// CHECK: pcmpestrm $0, %xmm1, %xmm1
+// CHECK: encoding: [0x66,0x0f,0x3a,0x60,0xc9,0x00]
+pcmpestrml $0, %xmm1, %xmm1
+
// CHECK: pcmpgtq -485498096(%edx,%eax,4), %xmm1
// CHECK: encoding: [0x66,0x0f,0x38,0x37,0x8c,0x82,0x10,0xe3,0x0f,0xe3]
pcmpgtq -485498096(%edx,%eax,4), %xmm1
diff --git a/llvm/test/MC/X86/SSE42-64.s b/llvm/test/MC/X86/SSE42-64.s
index bde7d36156365..7a829d74bb603 100644
--- a/llvm/test/MC/X86/SSE42-64.s
+++ b/llvm/test/MC/X86/SSE42-64.s
@@ -116,6 +116,14 @@ crc32q (%rdx), %r13
// CHECK: encoding: [0x66,0x0f,0x3a,0x61,0x34,0x25,0xf0,0x1c,0xf0,0x1c,0x00]
pcmpestri $0, 485498096, %xmm6
+// CHECK: pcmpestri $0, 485498096, %xmm6
+// CHECK: encoding: [0x66,0x0f,0x3a,0x61,0x34,0x25,0xf0,0x1c,0xf0,0x1c,0x00]
+pcmpestril $0, 485498096, %xmm6
+
+// CHECK: pcmpestriq $0, 485498096, %xmm6
+// CHECK: encoding: [0x66,0x48,0x0f,0x3a,0x61,0x34,0x25,0xf0,0x1c,0xf0,0x1c,0x00]
+pcmpestriq $0, 485498096, %xmm6
+
// CHECK: pcmpestri $0, -64(%rdx,%rax,4), %xmm6
// CHECK: encoding: [0x66,0x0f,0x3a,0x61,0x74,0x82,0xc0,0x00]
pcmpestri $0, -64(%rdx,%rax,4), %xmm6
@@ -140,10 +148,26 @@ pcmpestri $0, (%rdx), %xmm6
// CHECK: encoding: [0x66,0x0f,0x3a,0x61,0xf6,0x00]
pcmpestri $0, %xmm6, %xmm6
+// CHECK: pcmpestri $0, %xmm6, %xmm6
+// CHECK: encoding: [0x66,0x0f,0x3a,0x61,0xf6,0x00]
+pcmpestril $0, %xmm6, %xmm6
+
+// CHECK: pcmpestriq $0, %xmm6, %xmm6
+// CHECK: encoding: [0x66,0x48,0x0f,0x3a,0x61,0xf6,0x00]
+pcmpestriq $0, %xmm6, %xmm6
+
// CHECK: pcmpestrm $0, 485498096, %xmm6
// CHECK: encoding: [0x66,0x0f,0x3a,0x60,0x34,0x25,0xf0,0x1c,0xf0,0x1c,0x00]
pcmpestrm $0, 485498096, %xmm6
+// CHECK: pcmpestrm $0, 485498096, %xmm6
+// CHECK: encoding: [0x66,0x0f,0x3a,0x60,0x34,0x25,0xf0,0x1c,0xf0,0x1c,0x00]
+pcmpestrml $0, 485498096, %xmm6
+
+// CHECK: pcmpestrmq $0, 485498096, %xmm6
+// CHECK: encoding: [0x66,0x48,0x0f,0x3a,0x60,0x34,0x25,0xf0,0x1c,0xf0,0x1c,0x00]
+pcmpestrmq $0, 485498096, %xmm6
+
// CHECK: pcmpestrm $0, -64(%rdx,%rax,4), %xmm6
// CHECK: encoding: [0x66,0x0f,0x3a,0x60,0x74,0x82,0xc0,0x00]
pcmpestrm $0, -64(%rdx,%rax,4), %xmm6
@@ -168,6 +192,14 @@ pcmpestrm $0, (%rdx), %xmm6
// CHECK: encoding: [0x66,0x0f,0x3a,0x60,0xf6,0x00]
pcmpestrm $0, %xmm6, %xmm6
+// CHECK: pcmpestrm $0, %xmm6, %xmm6
+// CHECK: encoding: [0x66,0x0f,0x3a,0x60,0xf6,0x00]
+pcmpestrml $0, %xmm6, %xmm6
+
+// CHECK: pcmpestrmq $0, %xmm6, %xmm6
+// CHECK: encoding: [0x66,0x48,0x0f,0x3a,0x60,0xf6,0x00]
+pcmpestrmq $0, %xmm6, %xmm6
+
// CHECK: pcmpgtq 485498096, %xmm6
// CHECK: encoding: [0x66,0x0f,0x38,0x37,0x34,0x25,0xf0,0x1c,0xf0,0x1c]
pcmpgtq 485498096, %xmm6
diff --git a/llvm/test/MC/X86/avx-32-att.s b/llvm/test/MC/X86/avx-32-att.s
index beba7faa18299..4bac27bec22b7 100644
--- a/llvm/test/MC/X86/avx-32-att.s
+++ b/llvm/test/MC/X86/avx-32-att.s
@@ -2127,10 +2127,18 @@
// CHECK: encoding: [0xc4,0xe3,0x79,0x60,0xea,0x07]
vpcmpestrm $7, %xmm2, %xmm5
+// CHECK: vpcmpestrm $7, %xmm2, %xmm5
+// CHECK: encoding: [0xc4,0xe3,0x79,0x60,0xea,0x07]
+ vpcmpestrml $7, %xmm2, %xmm5
+
// CHECK: vpcmpestrm $7, (%eax), %xmm5
// CHECK: encoding: [0xc4,0xe3,0x79,0x60,0x28,0x07]
vpcmpestrm $7, (%eax), %xmm5
+// CHECK: vpcmpestrm $7, (%eax), %xmm5
+// CHECK: encoding: [0xc4,0xe3,0x79,0x60,0x28,0x07]
+ vpcmpestrml $7, (%eax), %xmm5
+
// CHECK: vpcmpistri $7, %xmm2, %xmm5
// CHECK: encoding: [0xc4,0xe3,0x79,0x63,0xea,0x07]
vpcmpistri $7, %xmm2, %xmm5
@@ -2143,10 +2151,18 @@
// CHECK: encoding: [0xc4,0xe3,0x79,0x61,0xea,0x07]
vpcmpestri $7, %xmm2, %xmm5
+// CHECK: vpcmpestri $7, %xmm2, %xmm5
+// CHECK: encoding: [0xc4,0xe3,0x79,0x61,0xea,0x07]
+ vpcmpestril $7, %xmm2, %xmm5
+
// CHECK: vpcmpestri $7, (%eax), %xmm5
// CHECK: encoding: [0xc4,0xe3,0x79,0x61,0x28,0x07]
vpcmpestri $7, (%eax), %xmm5
+// CHECK: vpcmpestri $7, (%eax), %xmm5
+// CHECK: encoding: [0xc4,0xe3,0x79,0x61,0x28,0x07]
+ vpcmpestril $7, (%eax), %xmm5
+
// CHECK: vaesimc %xmm2, %xmm5
// CHECK: encoding: [0xc4,0xe2,0x79,0xdb,0xea]
vaesimc %xmm2, %xmm5
diff --git a/llvm/test/MC/X86/avx-64-att.s b/llvm/test/MC/X86/avx-64-att.s
index f29142549bf52..519e4fc310919 100644
--- a/llvm/test/MC/X86/avx-64-att.s
+++ b/llvm/test/MC/X86/avx-64-att.s
@@ -2872,10 +2872,26 @@ vdivpd -4(%rcx,%rbx,8), %xmm10, %xmm11
// CHECK: encoding: [0xc4,0x43,0x79,0x60,0xd4,0x07]
vpcmpestrm $7, %xmm12, %xmm10
+// CHECK: vpcmpestrm $7, %xmm12, %xmm10
+// CHECK: encoding: [0xc4,0x43,0x79,0x60,0xd4,0x07]
+ vpcmpestrml $7, %xmm12, %xmm10
+
+// CHECK: vpcmpestrmq $7, %xmm12, %xmm10
+// CHECK: encoding: [0xc4,0x43,0xf9,0x60,0xd4,0x07]
+ vpcmpestrmq $7, %xmm12, %xmm10
+
// CHECK: vpcmpestrm $7, (%rax), %xmm10
// CHECK: encoding: [0xc4,0x63,0x79,0x60,0x10,0x07]
vpcmpestrm $7, (%rax), %xmm10
+// CHECK: vpcmpestrm $7, (%rax), %xmm10
+// CHECK: encoding: [0xc4,0x63,0x79,0x60,0x10,0x07]
+ vpcmpestrml $7, (%rax), %xmm10
+
+// CHECK: vpcmpestrmq $7, (%rax), %xmm10
+// CHECK: encoding: [0xc4,0x63,0xf9,0x60,0x10,0x07]
+ vpcmpestrmq $7, (%rax), %xmm10
+
// CHECK: vpcmpistri $7, %xmm12, %xmm10
// CHECK: encoding: [0xc4,0x43,0x79,0x63,0xd4,0x07]
vpcmpistri $7, %xmm12, %xmm10
@@ -2888,10 +2904,26 @@ vdivpd -4(%rcx,%rbx,8), %xmm10, %xmm11
// CHECK: encoding: [0xc4,0x43,0x79,0x61,0xd4,0x07]
vpcmpestri $7, %xmm12, %xmm10
+// CHECK: vpcmpestri $7, %xmm12, %xmm10
+// CHECK: encoding: [0xc4,0x43,0x79,0x61,0xd4,0x07]
+ vpcmpestril $7, %xmm12, %xmm10
+
+// CHECK: vpcmpestriq $7, %xmm12, %xmm10
+// CHECK: encoding: [0xc4,0x43,0xf9,0x61,0xd4,0x07]
+ vpcmpestriq $7, %xmm12, %xmm10
+
// CHECK: vpcmpestri $7, (%rax), %xmm10
// CHECK: encoding: [0xc4,0x63,0x79,0x61,0x10,0x07]
vpcmpestri $7, (%rax), %xmm10
+// CHECK: vpcmpestri $7, (%rax), %xmm10
+// CHECK: encoding: [0xc4,0x63,0x79,0x61,0x10,0x07]
+ vpcmpestril $7, (%rax), %xmm10
+
+// CHECK: vpcmpestriq $7, (%rax), %xmm10
+// CHECK: encoding: [0xc4,0x63,0xf9,0x61,0x10,0x07]
+ vpcmpestriq $7, (%rax), %xmm10
+
// CHECK: vaesimc %xmm12, %xmm10
// CHECK: encoding: [0xc4,0x42,0x79,0xdb,0xd4]
vaesimc %xmm12, %xmm10
diff --git a/llvm/test/TableGen/x86-fold-tables.inc b/llvm/test/TableGen/x86-fold-tables.inc
index bafc98a69ddae..1ddffacc322f2 100644
--- a/llvm/test/TableGen/x86-fold-tables.inc
+++ b/llvm/test/TableGen/x86-fold-tables.inc
@@ -868,7 +868,9 @@ static const X86FoldTableEntry Table1[] = {
{X86::PABSBrr, X86::PABSBrm, TB_ALIGN_16},
{X86::PABSDrr, X86::PABSDrm, TB_ALIGN_16},
{X86::PABSWrr, X86::PABSWrm, TB_ALIGN_16},
+ {X86::PCMPESTRIQrri, X86::PCMPESTRIQrmi, 0},
{X86::PCMPESTRIrri, X86::PCMPESTRIrmi, 0},
+ {X86::PCMPESTRMQrri, X86::PCMPESTRMQrmi, 0},
{X86::PCMPESTRMrri, X86::PCMPESTRMrmi, 0},
{X86::PCMPISTRIrri, X86::PCMPISTRIrmi, 0},
{X86::PCMPISTRMrri, X86::PCMPISTRMrmi, 0},
@@ -1653,7 +1655,9 @@ static const X86FoldTableEntry Table1[] = {
{X86::VPBROADCASTWZ256rr, X86::VPBROADCASTWZ256rm, TB_NO_REVERSE},
{X86::VPBROADCASTWZrr, X86::VPBROADCASTWZrm, TB_NO_REVERSE},
{X86::VPBROADCASTWrr, X86::VPBROADCASTWrm, TB_NO_REVERSE},
+ {X86::VPCMPESTRIQrri, X86::VPCMPESTRIQrmi, 0},
{X86::VPCMPESTRIrri, X86::VPCMPESTRIrmi, 0},
+ {X86::VPCMPESTRMQrri, X86::VPCMPESTRMQrmi, 0},
{X86::VPCMPESTRMrri, X86::VPCMPESTRMrmi, 0},
{X86::VPCMPISTRIrri, X86::VPCMPISTRIrmi, 0},
{X86::VPCMPISTRMrri, X86::VPCMPISTRMrmi, 0},
diff --git a/llvm/test/TableGen/x86-instr-mapping.inc b/llvm/test/TableGen/x86-instr-mapping.inc
index c22dd34ef981c..84550770fefe9 100644
--- a/llvm/test/TableGen/x86-instr-mapping.inc
+++ b/llvm/test/TableGen/x86-instr-mapping.inc
@@ -3030,8 +3030,12 @@ static const X86TableEntry X86SSE2AVXTable[] = {
{ X86::PCMPEQQrr, X86::VPCMPEQQrr },
{ X86::PCMPEQWrm, X86::VPCMPEQWrm },
{ X86::PCMPEQWrr, X86::VPCMPEQWrr },
+ { X86::PCMPESTRIQrmi, X86::VPCMPESTRIQrmi },
+ { X86::PCMPESTRIQrri, X86::VPCMPESTRIQrri },
{ X86::PCMPESTRIrmi, X86::VPCMPESTRIrmi },
{ X86::PCMPESTRIrri, X86::VPCMPESTRIrri },
+ { X86::PCMPESTRMQrmi, X86::VPCMPESTRMQrmi },
+ { X86::PCMPESTRMQrri, X86::VPCMPESTRMQrri },
{ X86::PCMPESTRMrmi, X86::VPCMPESTRMrmi },
{ X86::PCMPESTRMrri, X86::VPCMPESTRMrri },
{ X86::PCMPGTBrm, X86::VPCMPGTBrm },
More information about the llvm-commits
mailing list