[llvm] f5f66e2 - [X86]Support lowering for APX Promoted SHA/MOVDIR/CRC32/INVPCID/CET instructions (#76786)
via llvm-commits
llvm-commits at lists.llvm.org
Thu Jan 4 23:56:19 PST 2024
Author: XinWang10
Date: 2024-01-05T15:56:15+08:00
New Revision: f5f66e26b5f010218651cab831d5651fe7a71a0a
URL: https://github.com/llvm/llvm-project/commit/f5f66e26b5f010218651cab831d5651fe7a71a0a
DIFF: https://github.com/llvm/llvm-project/commit/f5f66e26b5f010218651cab831d5651fe7a71a0a.diff
LOG: [X86]Support lowering for APX Promoted SHA/MOVDIR/CRC32/INVPCID/CET instructions (#76786)
R16-R31 was added into GPRs in
https://github.com/llvm/llvm-project/pull/70958,
This patch supports the lowering for promoted
SHA/MOVDIR/CRC32/INVPCID/CET.
RFC:
https://discourse.llvm.org/t/rfc-design-for-apx-feature-egpr-and-ndd-support/73031/4
Added:
Modified:
llvm/lib/Target/X86/X86DomainReassignment.cpp
llvm/lib/Target/X86/X86FastISel.cpp
llvm/lib/Target/X86/X86InstrSystem.td
llvm/test/CodeGen/X86/crc32-intrinsics-fast-isel-x86.ll
llvm/test/CodeGen/X86/crc32-intrinsics-fast-isel-x86_64.ll
llvm/test/CodeGen/X86/crc32-intrinsics-x86.ll
llvm/test/CodeGen/X86/crc32-intrinsics-x86_64.ll
llvm/test/CodeGen/X86/invpcid-intrinsic.ll
llvm/test/CodeGen/X86/movdir-intrinsic-x86.ll
llvm/test/CodeGen/X86/movdir-intrinsic-x86_64.ll
llvm/test/CodeGen/X86/sha.ll
llvm/test/CodeGen/X86/x64-cet-intrinsics.ll
Removed:
################################################################################
diff --git a/llvm/lib/Target/X86/X86DomainReassignment.cpp b/llvm/lib/Target/X86/X86DomainReassignment.cpp
index bdd86e48fa5438..20dbaf797e3272 100644
--- a/llvm/lib/Target/X86/X86DomainReassignment.cpp
+++ b/llvm/lib/Target/X86/X86DomainReassignment.cpp
@@ -619,40 +619,30 @@ void X86DomainReassignment::initConverters() {
std::make_unique<InstrReplacerDstCOPY>(From, To);
};
- bool HasEGPR = STI->hasEGPR();
- createReplacerDstCOPY(X86::MOVZX32rm16,
- HasEGPR ? X86::KMOVWkm_EVEX : X86::KMOVWkm);
- createReplacerDstCOPY(X86::MOVZX64rm16,
- HasEGPR ? X86::KMOVWkm_EVEX : X86::KMOVWkm);
+#define GET_EGPR_IF_ENABLED(OPC) STI->hasEGPR() ? OPC##_EVEX : OPC
+ createReplacerDstCOPY(X86::MOVZX32rm16, GET_EGPR_IF_ENABLED(X86::KMOVWkm));
+ createReplacerDstCOPY(X86::MOVZX64rm16, GET_EGPR_IF_ENABLED(X86::KMOVWkm));
- createReplacerDstCOPY(X86::MOVZX32rr16,
- HasEGPR ? X86::KMOVWkk_EVEX : X86::KMOVWkk);
- createReplacerDstCOPY(X86::MOVZX64rr16,
- HasEGPR ? X86::KMOVWkk_EVEX : X86::KMOVWkk);
+ createReplacerDstCOPY(X86::MOVZX32rr16, GET_EGPR_IF_ENABLED(X86::KMOVWkk));
+ createReplacerDstCOPY(X86::MOVZX64rr16, GET_EGPR_IF_ENABLED(X86::KMOVWkk));
if (STI->hasDQI()) {
- createReplacerDstCOPY(X86::MOVZX16rm8,
- HasEGPR ? X86::KMOVBkm_EVEX : X86::KMOVBkm);
- createReplacerDstCOPY(X86::MOVZX32rm8,
- HasEGPR ? X86::KMOVBkm_EVEX : X86::KMOVBkm);
- createReplacerDstCOPY(X86::MOVZX64rm8,
- HasEGPR ? X86::KMOVBkm_EVEX : X86::KMOVBkm);
-
- createReplacerDstCOPY(X86::MOVZX16rr8,
- HasEGPR ? X86::KMOVBkk_EVEX : X86::KMOVBkk);
- createReplacerDstCOPY(X86::MOVZX32rr8,
- HasEGPR ? X86::KMOVBkk_EVEX : X86::KMOVBkk);
- createReplacerDstCOPY(X86::MOVZX64rr8,
- HasEGPR ? X86::KMOVBkk_EVEX : X86::KMOVBkk);
+ createReplacerDstCOPY(X86::MOVZX16rm8, GET_EGPR_IF_ENABLED(X86::KMOVBkm));
+ createReplacerDstCOPY(X86::MOVZX32rm8, GET_EGPR_IF_ENABLED(X86::KMOVBkm));
+ createReplacerDstCOPY(X86::MOVZX64rm8, GET_EGPR_IF_ENABLED(X86::KMOVBkm));
+
+ createReplacerDstCOPY(X86::MOVZX16rr8, GET_EGPR_IF_ENABLED(X86::KMOVBkk));
+ createReplacerDstCOPY(X86::MOVZX32rr8, GET_EGPR_IF_ENABLED(X86::KMOVBkk));
+ createReplacerDstCOPY(X86::MOVZX64rr8, GET_EGPR_IF_ENABLED(X86::KMOVBkk));
}
auto createReplacer = [&](unsigned From, unsigned To) {
Converters[{MaskDomain, From}] = std::make_unique<InstrReplacer>(From, To);
};
- createReplacer(X86::MOV16rm, HasEGPR ? X86::KMOVWkm_EVEX : X86::KMOVWkm);
- createReplacer(X86::MOV16mr, HasEGPR ? X86::KMOVWmk_EVEX : X86::KMOVWmk);
- createReplacer(X86::MOV16rr, HasEGPR ? X86::KMOVWkk_EVEX : X86::KMOVWkk);
+ createReplacer(X86::MOV16rm, GET_EGPR_IF_ENABLED(X86::KMOVWkm));
+ createReplacer(X86::MOV16mr, GET_EGPR_IF_ENABLED(X86::KMOVWmk));
+ createReplacer(X86::MOV16rr, GET_EGPR_IF_ENABLED(X86::KMOVWkk));
createReplacer(X86::SHR16ri, X86::KSHIFTRWri);
createReplacer(X86::SHL16ri, X86::KSHIFTLWri);
createReplacer(X86::NOT16r, X86::KNOTWrr);
@@ -661,14 +651,14 @@ void X86DomainReassignment::initConverters() {
createReplacer(X86::XOR16rr, X86::KXORWrr);
if (STI->hasBWI()) {
- createReplacer(X86::MOV32rm, HasEGPR ? X86::KMOVDkm_EVEX : X86::KMOVDkm);
- createReplacer(X86::MOV64rm, HasEGPR ? X86::KMOVQkm_EVEX : X86::KMOVQkm);
+ createReplacer(X86::MOV32rm, GET_EGPR_IF_ENABLED(X86::KMOVDkm));
+ createReplacer(X86::MOV64rm, GET_EGPR_IF_ENABLED(X86::KMOVQkm));
- createReplacer(X86::MOV32mr, HasEGPR ? X86::KMOVDmk_EVEX : X86::KMOVDmk);
- createReplacer(X86::MOV64mr, HasEGPR ? X86::KMOVQmk_EVEX : X86::KMOVQmk);
+ createReplacer(X86::MOV32mr, GET_EGPR_IF_ENABLED(X86::KMOVDmk));
+ createReplacer(X86::MOV64mr, GET_EGPR_IF_ENABLED(X86::KMOVQmk));
- createReplacer(X86::MOV32rr, HasEGPR ? X86::KMOVDkk_EVEX : X86::KMOVDkk);
- createReplacer(X86::MOV64rr, HasEGPR ? X86::KMOVQkk_EVEX : X86::KMOVQkk);
+ createReplacer(X86::MOV32rr, GET_EGPR_IF_ENABLED(X86::KMOVDkk));
+ createReplacer(X86::MOV64rr, GET_EGPR_IF_ENABLED(X86::KMOVQkk));
createReplacer(X86::SHR32ri, X86::KSHIFTRDri);
createReplacer(X86::SHR64ri, X86::KSHIFTRQri);
@@ -696,8 +686,8 @@ void X86DomainReassignment::initConverters() {
// TODO: KTEST is not a replacement for TEST due to flag
diff erences. Need
// to prove only Z flag is used.
- //createReplacer(X86::TEST32rr, X86::KTESTDrr);
- //createReplacer(X86::TEST64rr, X86::KTESTQrr);
+ // createReplacer(X86::TEST32rr, X86::KTESTDrr);
+ // createReplacer(X86::TEST64rr, X86::KTESTQrr);
}
if (STI->hasDQI()) {
@@ -706,9 +696,9 @@ void X86DomainReassignment::initConverters() {
createReplacer(X86::AND8rr, X86::KANDBrr);
- createReplacer(X86::MOV8rm, HasEGPR ? X86::KMOVBkm_EVEX : X86::KMOVBkm);
- createReplacer(X86::MOV8mr, HasEGPR ? X86::KMOVBmk_EVEX : X86::KMOVBmk);
- createReplacer(X86::MOV8rr, HasEGPR ? X86::KMOVBkk_EVEX : X86::KMOVBkk);
+ createReplacer(X86::MOV8rm, GET_EGPR_IF_ENABLED(X86::KMOVBkm));
+ createReplacer(X86::MOV8mr, GET_EGPR_IF_ENABLED(X86::KMOVBmk));
+ createReplacer(X86::MOV8rr, GET_EGPR_IF_ENABLED(X86::KMOVBkk));
createReplacer(X86::NOT8r, X86::KNOTBrr);
@@ -719,11 +709,12 @@ void X86DomainReassignment::initConverters() {
// TODO: KTEST is not a replacement for TEST due to flag
diff erences. Need
// to prove only Z flag is used.
- //createReplacer(X86::TEST8rr, X86::KTESTBrr);
- //createReplacer(X86::TEST16rr, X86::KTESTWrr);
+ // createReplacer(X86::TEST8rr, X86::KTESTBrr);
+ // createReplacer(X86::TEST16rr, X86::KTESTWrr);
createReplacer(X86::XOR8rr, X86::KXORBrr);
}
+#undef GET_EGPR_IF_ENABLED
}
bool X86DomainReassignment::runOnMachineFunction(MachineFunction &MF) {
diff --git a/llvm/lib/Target/X86/X86FastISel.cpp b/llvm/lib/Target/X86/X86FastISel.cpp
index c789ac82ac9433..1ce1e6f6a56355 100644
--- a/llvm/lib/Target/X86/X86FastISel.cpp
+++ b/llvm/lib/Target/X86/X86FastISel.cpp
@@ -3046,22 +3046,24 @@ bool X86FastISel::fastLowerIntrinsicCall(const IntrinsicInst *II) {
switch (II->getIntrinsicID()) {
default:
llvm_unreachable("Unexpected intrinsic.");
+#define GET_EGPR_IF_ENABLED(OPC) Subtarget->hasEGPR() ? OPC##_EVEX : OPC
case Intrinsic::x86_sse42_crc32_32_8:
- Opc = X86::CRC32r32r8;
+ Opc = GET_EGPR_IF_ENABLED(X86::CRC32r32r8);
RC = &X86::GR32RegClass;
break;
case Intrinsic::x86_sse42_crc32_32_16:
- Opc = X86::CRC32r32r16;
+ Opc = GET_EGPR_IF_ENABLED(X86::CRC32r32r16);
RC = &X86::GR32RegClass;
break;
case Intrinsic::x86_sse42_crc32_32_32:
- Opc = X86::CRC32r32r32;
+ Opc = GET_EGPR_IF_ENABLED(X86::CRC32r32r32);
RC = &X86::GR32RegClass;
break;
case Intrinsic::x86_sse42_crc32_64_64:
- Opc = X86::CRC32r64r64;
+ Opc = GET_EGPR_IF_ENABLED(X86::CRC32r64r64);
RC = &X86::GR64RegClass;
break;
+#undef GET_EGPR_IF_ENABLED
}
const Value *LHS = II->getArgOperand(0);
diff --git a/llvm/lib/Target/X86/X86InstrSystem.td b/llvm/lib/Target/X86/X86InstrSystem.td
index 699e5847e63fb9..b1be4739617dfc 100644
--- a/llvm/lib/Target/X86/X86InstrSystem.td
+++ b/llvm/lib/Target/X86/X86InstrSystem.td
@@ -695,14 +695,14 @@ def INVPCID32 : I<0x82, MRMSrcMem, (outs), (ins GR32:$src1, i128mem:$src2),
Requires<[Not64BitMode, HasINVPCID]>;
def INVPCID64 : I<0x82, MRMSrcMem, (outs), (ins GR64:$src1, i128mem:$src2),
"invpcid\t{$src2, $src1|$src1, $src2}", []>, T8, PD,
- Requires<[In64BitMode, HasINVPCID]>;
+ Requires<[In64BitMode]>;
def INVPCID64_EVEX : I<0xF2, MRMSrcMem, (outs), (ins GR64:$src1, i128mem:$src2),
"invpcid\t{$src2, $src1|$src1, $src2}", []>,
- EVEX, NoCD8, T_MAP4, XS, Requires<[In64BitMode, HasINVPCID]>;
+ EVEX, NoCD8, T_MAP4, XS, Requires<[In64BitMode]>;
} // SchedRW
-let Predicates = [In64BitMode, HasINVPCID] in {
+let Predicates = [HasINVPCID, NoEGPR] in {
// The instruction can only use a 64 bit register as the register argument
// in 64 bit mode, while the intrinsic only accepts a 32 bit argument
// corresponding to it.
@@ -714,6 +714,13 @@ let Predicates = [In64BitMode, HasINVPCID] in {
addr:$src2)>;
}
+let Predicates = [HasINVPCID, HasEGPR] in {
+ def : Pat<(int_x86_invpcid GR32:$src1, addr:$src2),
+ (INVPCID64_EVEX
+ (SUBREG_TO_REG (i64 0), (MOV32rr GR32:$src1), sub_32bit),
+ addr:$src2)>;
+}
+
//===----------------------------------------------------------------------===//
// SMAP Instruction
diff --git a/llvm/test/CodeGen/X86/crc32-intrinsics-fast-isel-x86.ll b/llvm/test/CodeGen/X86/crc32-intrinsics-fast-isel-x86.ll
index 056d79f379fd10..873986e99777d9 100644
--- a/llvm/test/CodeGen/X86/crc32-intrinsics-fast-isel-x86.ll
+++ b/llvm/test/CodeGen/X86/crc32-intrinsics-fast-isel-x86.ll
@@ -3,8 +3,9 @@
; RUN: llc < %s -fast-isel -pass-remarks-missed=sdagisel -mtriple=i686-unknown-unknown -mattr=+crc32 2>&1 >/dev/null | FileCheck %s -check-prefix=STDERR-X86 -allow-empty
; RUN: llc < %s -fast-isel -fast-isel-abort=1 -mtriple=i686-unknown-unknown -mattr=-sse4.2,+crc32 | FileCheck %s -check-prefix=X86
; RUN: llc < %s -fast-isel -fast-isel-abort=1 -mtriple=i686-unknown-unknown -mattr=+crc32 | FileCheck %s -check-prefix=X86
-; RUN: llc < %s -fast-isel -fast-isel-abort=3 -mtriple=x86_64-unknown-unknown -mattr=-sse4.2,+crc32 | FileCheck %s -check-prefix=X64
-; RUN: llc < %s -fast-isel -fast-isel-abort=3 -mtriple=x86_64-unknown-unknown -mattr=+crc32 | FileCheck %s -check-prefix=X64
+; RUN: llc < %s -fast-isel -fast-isel-abort=3 -mtriple=x86_64-unknown-unknown -mattr=-sse4.2,+crc32 --show-mc-encoding | FileCheck %s -check-prefix=X64
+; RUN: llc < %s -fast-isel -fast-isel-abort=3 -mtriple=x86_64-unknown-unknown -mattr=+crc32 --show-mc-encoding | FileCheck %s -check-prefix=X64
+; RUN: llc < %s -fast-isel -fast-isel-abort=3 -mtriple=x86_64-unknown-unknown -mattr=+crc32,+egpr --show-mc-encoding | FileCheck %s -check-prefix=EGPR
; NOTE: This should use IR equivalent to what is generated by clang/test/CodeGen/sse42-builtins.c
@@ -21,9 +22,15 @@ define i32 @test_mm_crc32_u8(i32 %a0, i32 %a1) nounwind {
;
; X64-LABEL: test_mm_crc32_u8:
; X64: # %bb.0:
-; X64-NEXT: movl %edi, %eax
-; X64-NEXT: crc32b %sil, %eax
-; X64-NEXT: retq
+; X64-NEXT: movl %edi, %eax # encoding: [0x89,0xf8]
+; X64-NEXT: crc32b %sil, %eax # encoding: [0xf2,0x40,0x0f,0x38,0xf0,0xc6]
+; X64-NEXT: retq # encoding: [0xc3]
+;
+; EGPR-LABEL: test_mm_crc32_u8:
+; EGPR: # %bb.0:
+; EGPR-NEXT: movl %edi, %eax # encoding: [0x89,0xf8]
+; EGPR-NEXT: crc32b %sil, %eax # encoding: [0x62,0xf4,0x7c,0x08,0xf0,0xc6]
+; EGPR-NEXT: retq # encoding: [0xc3]
%trunc = trunc i32 %a1 to i8
%res = call i32 @llvm.x86.sse42.crc32.32.8(i32 %a0, i8 %trunc)
ret i32 %res
@@ -41,9 +48,15 @@ define i32 @test_mm_crc32_u16(i32 %a0, i32 %a1) nounwind {
;
; X64-LABEL: test_mm_crc32_u16:
; X64: # %bb.0:
-; X64-NEXT: movl %edi, %eax
-; X64-NEXT: crc32w %si, %eax
-; X64-NEXT: retq
+; X64-NEXT: movl %edi, %eax # encoding: [0x89,0xf8]
+; X64-NEXT: crc32w %si, %eax # encoding: [0x66,0xf2,0x0f,0x38,0xf1,0xc6]
+; X64-NEXT: retq # encoding: [0xc3]
+;
+; EGPR-LABEL: test_mm_crc32_u16:
+; EGPR: # %bb.0:
+; EGPR-NEXT: movl %edi, %eax # encoding: [0x89,0xf8]
+; EGPR-NEXT: crc32w %si, %eax # encoding: [0x62,0xf4,0x7d,0x08,0xf1,0xc6]
+; EGPR-NEXT: retq # encoding: [0xc3]
%trunc = trunc i32 %a1 to i16
%res = call i32 @llvm.x86.sse42.crc32.32.16(i32 %a0, i16 %trunc)
ret i32 %res
@@ -59,9 +72,15 @@ define i32 @test_mm_crc32_u32(i32 %a0, i32 %a1) nounwind {
;
; X64-LABEL: test_mm_crc32_u32:
; X64: # %bb.0:
-; X64-NEXT: movl %edi, %eax
-; X64-NEXT: crc32l %esi, %eax
-; X64-NEXT: retq
+; X64-NEXT: movl %edi, %eax # encoding: [0x89,0xf8]
+; X64-NEXT: crc32l %esi, %eax # encoding: [0xf2,0x0f,0x38,0xf1,0xc6]
+; X64-NEXT: retq # encoding: [0xc3]
+;
+; EGPR-LABEL: test_mm_crc32_u32:
+; EGPR: # %bb.0:
+; EGPR-NEXT: movl %edi, %eax # encoding: [0x89,0xf8]
+; EGPR-NEXT: crc32l %esi, %eax # encoding: [0x62,0xf4,0x7c,0x08,0xf1,0xc6]
+; EGPR-NEXT: retq # encoding: [0xc3]
%res = call i32 @llvm.x86.sse42.crc32.32.32(i32 %a0, i32 %a1)
ret i32 %res
}
diff --git a/llvm/test/CodeGen/X86/crc32-intrinsics-fast-isel-x86_64.ll b/llvm/test/CodeGen/X86/crc32-intrinsics-fast-isel-x86_64.ll
index e0ec432b385499..71d955bda75235 100644
--- a/llvm/test/CodeGen/X86/crc32-intrinsics-fast-isel-x86_64.ll
+++ b/llvm/test/CodeGen/X86/crc32-intrinsics-fast-isel-x86_64.ll
@@ -1,6 +1,7 @@
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
-; RUN: llc < %s -fast-isel -fast-isel-abort=3 -mtriple=x86_64-unknown-unknown -mattr=-sse4.2,+crc32 | FileCheck %s
-; RUN: llc < %s -fast-isel -fast-isel-abort=3 -mtriple=x86_64-unknown-unknown -mattr=+crc32 | FileCheck %s
+; RUN: llc < %s -fast-isel -fast-isel-abort=3 -mtriple=x86_64-unknown-unknown -mattr=-sse4.2,+crc32 --show-mc-encoding | FileCheck %s
+; RUN: llc < %s -fast-isel -fast-isel-abort=3 -mtriple=x86_64-unknown-unknown -mattr=+crc32 --show-mc-encoding | FileCheck %s
+; RUN: llc < %s -fast-isel -fast-isel-abort=3 -mtriple=x86_64-unknown-unknown -mattr=+crc32,+egpr --show-mc-encoding | FileCheck %s -check-prefix=EGPR
; NOTE: This should use IR equivalent to what is generated by clang/test/CodeGen/sse42-builtins.c
@@ -8,9 +9,15 @@
define i64 @test_mm_crc64_u8(i64 %a0, i32 %a1) nounwind{
; CHECK-LABEL: test_mm_crc64_u8:
; CHECK: # %bb.0:
-; CHECK-NEXT: crc32b %sil, %edi
-; CHECK-NEXT: movl %edi, %eax
-; CHECK-NEXT: retq
+; CHECK-NEXT: crc32b %sil, %edi # encoding: [0xf2,0x40,0x0f,0x38,0xf0,0xfe]
+; CHECK-NEXT: movl %edi, %eax # encoding: [0x89,0xf8]
+; CHECK-NEXT: retq # encoding: [0xc3]
+;
+; EGPR-LABEL: test_mm_crc64_u8:
+; EGPR: # %bb.0:
+; EGPR-NEXT: crc32b %sil, %edi # encoding: [0x62,0xf4,0x7c,0x08,0xf0,0xfe]
+; EGPR-NEXT: movl %edi, %eax # encoding: [0x89,0xf8]
+; EGPR-NEXT: retq # encoding: [0xc3]
%trunc = trunc i32 %a1 to i8
%res = call i64 @llvm.x86.sse42.crc32.64.8(i64 %a0, i8 %trunc)
ret i64 %res
@@ -20,9 +27,15 @@ declare i64 @llvm.x86.sse42.crc32.64.8(i64, i8) nounwind readnone
define i64 @test_mm_crc64_u64(i64 %a0, i64 %a1) nounwind{
; CHECK-LABEL: test_mm_crc64_u64:
; CHECK: # %bb.0:
-; CHECK-NEXT: movq %rdi, %rax
-; CHECK-NEXT: crc32q %rsi, %rax
-; CHECK-NEXT: retq
+; CHECK-NEXT: movq %rdi, %rax # encoding: [0x48,0x89,0xf8]
+; CHECK-NEXT: crc32q %rsi, %rax # encoding: [0xf2,0x48,0x0f,0x38,0xf1,0xc6]
+; CHECK-NEXT: retq # encoding: [0xc3]
+;
+; EGPR-LABEL: test_mm_crc64_u64:
+; EGPR: # %bb.0:
+; EGPR-NEXT: movq %rdi, %rax # encoding: [0x48,0x89,0xf8]
+; EGPR-NEXT: crc32q %rsi, %rax # encoding: [0x62,0xf4,0xfc,0x08,0xf1,0xc6]
+; EGPR-NEXT: retq # encoding: [0xc3]
%res = call i64 @llvm.x86.sse42.crc32.64.64(i64 %a0, i64 %a1)
ret i64 %res
}
diff --git a/llvm/test/CodeGen/X86/crc32-intrinsics-x86.ll b/llvm/test/CodeGen/X86/crc32-intrinsics-x86.ll
index 7623ba68353e10..84c7f90cfe3c3d 100644
--- a/llvm/test/CodeGen/X86/crc32-intrinsics-x86.ll
+++ b/llvm/test/CodeGen/X86/crc32-intrinsics-x86.ll
@@ -1,6 +1,7 @@
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc < %s -disable-peephole -mtriple=i386-apple-darwin -mattr=+crc32 -show-mc-encoding | FileCheck %s --check-prefixes=X86
; RUN: llc < %s -disable-peephole -mtriple=x86_64-apple-darwin -mattr=+crc32 -show-mc-encoding | FileCheck %s --check-prefixes=X64
+; RUN: llc < %s -disable-peephole -mtriple=x86_64-apple-darwin -mattr=+crc32,+egpr -show-mc-encoding | FileCheck %s --check-prefixes=EGPR
define i32 @crc32_32_8(i32 %a, i8 %b) nounwind {
; X86-LABEL: crc32_32_8:
@@ -14,6 +15,12 @@ define i32 @crc32_32_8(i32 %a, i8 %b) nounwind {
; X64-NEXT: movl %edi, %eax ## encoding: [0x89,0xf8]
; X64-NEXT: crc32b %sil, %eax ## encoding: [0xf2,0x40,0x0f,0x38,0xf0,0xc6]
; X64-NEXT: retq ## encoding: [0xc3]
+;
+; EGPR-LABEL: crc32_32_8:
+; EGPR: ## %bb.0:
+; EGPR-NEXT: movl %edi, %eax ## encoding: [0x89,0xf8]
+; EGPR-NEXT: crc32b %sil, %eax ## encoding: [0x62,0xf4,0x7c,0x08,0xf0,0xc6]
+; EGPR-NEXT: retq ## encoding: [0xc3]
%tmp = call i32 @llvm.x86.sse42.crc32.32.8(i32 %a, i8 %b)
ret i32 %tmp
}
@@ -31,6 +38,12 @@ define i32 @crc32_32_16(i32 %a, i16 %b) nounwind {
; X64-NEXT: movl %edi, %eax ## encoding: [0x89,0xf8]
; X64-NEXT: crc32w %si, %eax ## encoding: [0x66,0xf2,0x0f,0x38,0xf1,0xc6]
; X64-NEXT: retq ## encoding: [0xc3]
+;
+; EGPR-LABEL: crc32_32_16:
+; EGPR: ## %bb.0:
+; EGPR-NEXT: movl %edi, %eax ## encoding: [0x89,0xf8]
+; EGPR-NEXT: crc32w %si, %eax ## encoding: [0x62,0xf4,0x7d,0x08,0xf1,0xc6]
+; EGPR-NEXT: retq ## encoding: [0xc3]
%tmp = call i32 @llvm.x86.sse42.crc32.32.16(i32 %a, i16 %b)
ret i32 %tmp
}
@@ -48,6 +61,12 @@ define i32 @crc32_32_32(i32 %a, i32 %b) nounwind {
; X64-NEXT: movl %edi, %eax ## encoding: [0x89,0xf8]
; X64-NEXT: crc32l %esi, %eax ## encoding: [0xf2,0x0f,0x38,0xf1,0xc6]
; X64-NEXT: retq ## encoding: [0xc3]
+;
+; EGPR-LABEL: crc32_32_32:
+; EGPR: ## %bb.0:
+; EGPR-NEXT: movl %edi, %eax ## encoding: [0x89,0xf8]
+; EGPR-NEXT: crc32l %esi, %eax ## encoding: [0x62,0xf4,0x7c,0x08,0xf1,0xc6]
+; EGPR-NEXT: retq ## encoding: [0xc3]
%tmp = call i32 @llvm.x86.sse42.crc32.32.32(i32 %a, i32 %b)
ret i32 %tmp
}
diff --git a/llvm/test/CodeGen/X86/crc32-intrinsics-x86_64.ll b/llvm/test/CodeGen/X86/crc32-intrinsics-x86_64.ll
index b0f7a394f07b76..bda26a15b277a4 100644
--- a/llvm/test/CodeGen/X86/crc32-intrinsics-x86_64.ll
+++ b/llvm/test/CodeGen/X86/crc32-intrinsics-x86_64.ll
@@ -1,5 +1,6 @@
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc < %s -mtriple=x86_64-apple-darwin -mattr=+crc32 -show-mc-encoding | FileCheck %s
+; RUN: llc < %s -mtriple=x86_64-apple-darwin -mattr=+crc32,+egpr -show-mc-encoding | FileCheck %s --check-prefixes=EGPR
declare i64 @llvm.x86.sse42.crc32.64.8(i64, i8) nounwind
declare i64 @llvm.x86.sse42.crc32.64.64(i64, i64) nounwind
@@ -10,6 +11,12 @@ define i64 @crc32_64_8(i64 %a, i8 %b) nounwind {
; CHECK-NEXT: movq %rdi, %rax ## encoding: [0x48,0x89,0xf8]
; CHECK-NEXT: crc32b %sil, %eax ## encoding: [0xf2,0x40,0x0f,0x38,0xf0,0xc6]
; CHECK-NEXT: retq ## encoding: [0xc3]
+;
+; EGPR-LABEL: crc32_64_8:
+; EGPR: ## %bb.0:
+; EGPR-NEXT: movq %rdi, %rax ## encoding: [0x48,0x89,0xf8]
+; EGPR-NEXT: crc32b %sil, %eax ## encoding: [0x62,0xf4,0x7c,0x08,0xf0,0xc6]
+; EGPR-NEXT: retq ## encoding: [0xc3]
%tmp = call i64 @llvm.x86.sse42.crc32.64.8(i64 %a, i8 %b)
ret i64 %tmp
}
@@ -20,6 +27,12 @@ define i64 @crc32_64_64(i64 %a, i64 %b) nounwind {
; CHECK-NEXT: movq %rdi, %rax ## encoding: [0x48,0x89,0xf8]
; CHECK-NEXT: crc32q %rsi, %rax ## encoding: [0xf2,0x48,0x0f,0x38,0xf1,0xc6]
; CHECK-NEXT: retq ## encoding: [0xc3]
+;
+; EGPR-LABEL: crc32_64_64:
+; EGPR: ## %bb.0:
+; EGPR-NEXT: movq %rdi, %rax ## encoding: [0x48,0x89,0xf8]
+; EGPR-NEXT: crc32q %rsi, %rax ## encoding: [0x62,0xf4,0xfc,0x08,0xf1,0xc6]
+; EGPR-NEXT: retq ## encoding: [0xc3]
%tmp = call i64 @llvm.x86.sse42.crc32.64.64(i64 %a, i64 %b)
ret i64 %tmp
}
diff --git a/llvm/test/CodeGen/X86/invpcid-intrinsic.ll b/llvm/test/CodeGen/X86/invpcid-intrinsic.ll
index 3aa9fde35e23f7..19a6249fc708f3 100644
--- a/llvm/test/CodeGen/X86/invpcid-intrinsic.ll
+++ b/llvm/test/CodeGen/X86/invpcid-intrinsic.ll
@@ -1,6 +1,7 @@
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc < %s -mtriple=i386-unknown-unknown -mattr=+invpcid | FileCheck %s --check-prefix=X86
-; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+invpcid | FileCheck %s --check-prefix=X86_64
+; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+invpcid --show-mc-encoding | FileCheck %s --check-prefix=X86_64
+; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+invpcid,+egpr --show-mc-encoding | FileCheck %s --check-prefix=EGPR
define void @test_invpcid(i32 %type, ptr %descriptor) {
; X86-LABEL: test_invpcid:
@@ -12,9 +13,15 @@ define void @test_invpcid(i32 %type, ptr %descriptor) {
;
; X86_64-LABEL: test_invpcid:
; X86_64: # %bb.0: # %entry
-; X86_64-NEXT: movl %edi, %eax
-; X86_64-NEXT: invpcid (%rsi), %rax
-; X86_64-NEXT: retq
+; X86_64-NEXT: movl %edi, %eax # encoding: [0x89,0xf8]
+; X86_64-NEXT: invpcid (%rsi), %rax # encoding: [0x66,0x0f,0x38,0x82,0x06]
+; X86_64-NEXT: retq # encoding: [0xc3]
+;
+; EGPR-LABEL: test_invpcid:
+; EGPR: # %bb.0: # %entry
+; EGPR-NEXT: movl %edi, %eax # encoding: [0x89,0xf8]
+; EGPR-NEXT: invpcid (%rsi), %rax # encoding: [0x62,0xf4,0x7e,0x08,0xf2,0x06]
+; EGPR-NEXT: retq # encoding: [0xc3]
entry:
call void @llvm.x86.invpcid(i32 %type, ptr %descriptor)
ret void
@@ -31,9 +38,15 @@ define void @test_invpcid2(ptr readonly %type, ptr %descriptor) {
;
; X86_64-LABEL: test_invpcid2:
; X86_64: # %bb.0: # %entry
-; X86_64-NEXT: movl (%rdi), %eax
-; X86_64-NEXT: invpcid (%rsi), %rax
-; X86_64-NEXT: retq
+; X86_64-NEXT: movl (%rdi), %eax # encoding: [0x8b,0x07]
+; X86_64-NEXT: invpcid (%rsi), %rax # encoding: [0x66,0x0f,0x38,0x82,0x06]
+; X86_64-NEXT: retq # encoding: [0xc3]
+;
+; EGPR-LABEL: test_invpcid2:
+; EGPR: # %bb.0: # %entry
+; EGPR-NEXT: movl (%rdi), %eax # encoding: [0x8b,0x07]
+; EGPR-NEXT: invpcid (%rsi), %rax # encoding: [0x62,0xf4,0x7e,0x08,0xf2,0x06]
+; EGPR-NEXT: retq # encoding: [0xc3]
entry:
%0 = load i32, ptr %type, align 4
tail call void @llvm.x86.invpcid(i32 %0, ptr %descriptor) #1
diff --git a/llvm/test/CodeGen/X86/movdir-intrinsic-x86.ll b/llvm/test/CodeGen/X86/movdir-intrinsic-x86.ll
index 1769bcbf6f6051..4d03510ad5d4f2 100644
--- a/llvm/test/CodeGen/X86/movdir-intrinsic-x86.ll
+++ b/llvm/test/CodeGen/X86/movdir-intrinsic-x86.ll
@@ -1,19 +1,25 @@
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
-; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+movdiri -mattr=+movdir64b | FileCheck %s --check-prefix=X64
; RUN: llc < %s -mtriple=i386-unknown-unknown -mattr=+movdiri -mattr=+movdir64b | FileCheck %s --check-prefix=X32
+; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+movdiri -mattr=+movdir64b --show-mc-encoding | FileCheck %s --check-prefix=X64
+; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+movdiri -mattr=+movdir64b,+egpr --show-mc-encoding | FileCheck %s --check-prefix=EGPR
define void @test_movdiri(ptr %p, i32 %v) {
-; X64-LABEL: test_movdiri:
-; X64: # %bb.0: # %entry
-; X64-NEXT: movdiri %esi, (%rdi)
-; X64-NEXT: retq
-;
; X32-LABEL: test_movdiri:
; X32: # %bb.0: # %entry
; X32-NEXT: movl {{[0-9]+}}(%esp), %eax
; X32-NEXT: movl {{[0-9]+}}(%esp), %ecx
; X32-NEXT: movdiri %eax, (%ecx)
; X32-NEXT: retl
+;
+; X64-LABEL: test_movdiri:
+; X64: # %bb.0: # %entry
+; X64-NEXT: movdiri %esi, (%rdi) # encoding: [0x0f,0x38,0xf9,0x37]
+; X64-NEXT: retq # encoding: [0xc3]
+;
+; EGPR-LABEL: test_movdiri:
+; EGPR: # %bb.0: # %entry
+; EGPR-NEXT: movdiri %esi, (%rdi) # encoding: [0x62,0xf4,0x7c,0x08,0xf9,0x37]
+; EGPR-NEXT: retq # encoding: [0xc3]
entry:
call void @llvm.x86.directstore32(ptr %p, i32 %v)
ret void
@@ -22,17 +28,22 @@ entry:
declare void @llvm.x86.directstore32(ptr, i32)
define void @test_movdir64b(ptr %dst, ptr %src) {
-; X64-LABEL: test_movdir64b:
-; X64: # %bb.0: # %entry
-; X64-NEXT: movdir64b (%rsi), %rdi
-; X64-NEXT: retq
-;
; X32-LABEL: test_movdir64b:
; X32: # %bb.0: # %entry
; X32-NEXT: movl {{[0-9]+}}(%esp), %eax
; X32-NEXT: movl {{[0-9]+}}(%esp), %ecx
; X32-NEXT: movdir64b (%eax), %ecx
; X32-NEXT: retl
+;
+; X64-LABEL: test_movdir64b:
+; X64: # %bb.0: # %entry
+; X64-NEXT: movdir64b (%rsi), %rdi # encoding: [0x66,0x0f,0x38,0xf8,0x3e]
+; X64-NEXT: retq # encoding: [0xc3]
+;
+; EGPR-LABEL: test_movdir64b:
+; EGPR: # %bb.0: # %entry
+; EGPR-NEXT: movdir64b (%rsi), %rdi # encoding: [0x62,0xf4,0x7d,0x08,0xf8,0x3e]
+; EGPR-NEXT: retq # encoding: [0xc3]
entry:
call void @llvm.x86.movdir64b(ptr %dst, ptr %src)
ret void
diff --git a/llvm/test/CodeGen/X86/movdir-intrinsic-x86_64.ll b/llvm/test/CodeGen/X86/movdir-intrinsic-x86_64.ll
index b20d7df26515da..ddd44f6d73d592 100644
--- a/llvm/test/CodeGen/X86/movdir-intrinsic-x86_64.ll
+++ b/llvm/test/CodeGen/X86/movdir-intrinsic-x86_64.ll
@@ -1,11 +1,17 @@
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
-; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+movdiri | FileCheck %s
+; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+movdiri --show-mc-encoding | FileCheck %s
+; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+movdiri,+egpr --show-mc-encoding | FileCheck %s -check-prefix=EGPR
define void @test_movdiri(ptr %p, i64 %v) {
; CHECK-LABEL: test_movdiri:
; CHECK: # %bb.0: # %entry
-; CHECK-NEXT: movdiri %rsi, (%rdi)
-; CHECK-NEXT: retq
+; CHECK-NEXT: movdiri %rsi, (%rdi) # encoding: [0x48,0x0f,0x38,0xf9,0x37]
+; CHECK-NEXT: retq # encoding: [0xc3]
+;
+; EGPR-LABEL: test_movdiri:
+; EGPR: # %bb.0: # %entry
+; EGPR-NEXT: movdiri %rsi, (%rdi) # encoding: [0x62,0xf4,0xfc,0x08,0xf9,0x37]
+; EGPR-NEXT: retq # encoding: [0xc3]
entry:
call void @llvm.x86.directstore64(ptr %p, i64 %v)
ret void
diff --git a/llvm/test/CodeGen/X86/sha.ll b/llvm/test/CodeGen/X86/sha.ll
index d5427556dc0bbe..d8fa354a391355 100644
--- a/llvm/test/CodeGen/X86/sha.ll
+++ b/llvm/test/CodeGen/X86/sha.ll
@@ -1,24 +1,45 @@
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc < %s -mattr=+sha -mtriple=x86_64-unknown-unknown | FileCheck %s --check-prefix=CHECK --check-prefix=SSE
-; RUN: llc < %s -mattr=+sha,+avx2 -mtriple=x86_64-unknown-unknown | FileCheck %s --check-prefix=CHECK --check-prefix=AVX
+; RUN: llc < %s -mattr=+sha,+avx2 -mtriple=x86_64-unknown-unknown --show-mc-encoding | FileCheck %s --check-prefix=CHECK --check-prefix=AVX
+; RUN: llc < %s -mattr=+sha,+egpr -mtriple=x86_64-unknown-unknown --show-mc-encoding | FileCheck %s --check-prefix=CHECK --check-prefix=EGPR
declare <4 x i32> @llvm.x86.sha1rnds4(<4 x i32>, <4 x i32>, i8) nounwind readnone
define <4 x i32> @test_sha1rnds4rr(<4 x i32> %a, <4 x i32> %b) nounwind uwtable {
-; CHECK-LABEL: test_sha1rnds4rr:
-; CHECK: # %bb.0: # %entry
-; CHECK-NEXT: sha1rnds4 $3, %xmm1, %xmm0
-; CHECK-NEXT: retq
+; SSE-LABEL: test_sha1rnds4rr:
+; SSE: # %bb.0: # %entry
+; SSE-NEXT: sha1rnds4 $3, %xmm1, %xmm0
+; SSE-NEXT: retq
+;
+; AVX-LABEL: test_sha1rnds4rr:
+; AVX: # %bb.0: # %entry
+; AVX-NEXT: sha1rnds4 $3, %xmm1, %xmm0 # encoding: [0x0f,0x3a,0xcc,0xc1,0x03]
+; AVX-NEXT: retq # encoding: [0xc3]
+;
+; EGPR-LABEL: test_sha1rnds4rr:
+; EGPR: # %bb.0: # %entry
+; EGPR-NEXT: sha1rnds4 $3, %xmm1, %xmm0 # encoding: [0x62,0xf4,0x7c,0x08,0xd4,0xc1,0x03]
+; EGPR-NEXT: retq # encoding: [0xc3]
entry:
%0 = tail call <4 x i32> @llvm.x86.sha1rnds4(<4 x i32> %a, <4 x i32> %b, i8 3)
ret <4 x i32> %0
}
define <4 x i32> @test_sha1rnds4rm(<4 x i32> %a, ptr %b) nounwind uwtable {
-; CHECK-LABEL: test_sha1rnds4rm:
-; CHECK: # %bb.0: # %entry
-; CHECK-NEXT: sha1rnds4 $3, (%rdi), %xmm0
-; CHECK-NEXT: retq
+; SSE-LABEL: test_sha1rnds4rm:
+; SSE: # %bb.0: # %entry
+; SSE-NEXT: sha1rnds4 $3, (%rdi), %xmm0
+; SSE-NEXT: retq
+;
+; AVX-LABEL: test_sha1rnds4rm:
+; AVX: # %bb.0: # %entry
+; AVX-NEXT: sha1rnds4 $3, (%rdi), %xmm0 # encoding: [0x0f,0x3a,0xcc,0x07,0x03]
+; AVX-NEXT: retq # encoding: [0xc3]
+;
+; EGPR-LABEL: test_sha1rnds4rm:
+; EGPR: # %bb.0: # %entry
+; EGPR-NEXT: sha1rnds4 $3, (%rdi), %xmm0 # encoding: [0x62,0xf4,0x7c,0x08,0xd4,0x07,0x03]
+; EGPR-NEXT: retq # encoding: [0xc3]
entry:
%0 = load <4 x i32>, ptr %b
%1 = tail call <4 x i32> @llvm.x86.sha1rnds4(<4 x i32> %a, <4 x i32> %0, i8 3)
@@ -28,20 +49,40 @@ entry:
declare <4 x i32> @llvm.x86.sha1nexte(<4 x i32>, <4 x i32>) nounwind readnone
define <4 x i32> @test_sha1nexterr(<4 x i32> %a, <4 x i32> %b) nounwind uwtable {
-; CHECK-LABEL: test_sha1nexterr:
-; CHECK: # %bb.0: # %entry
-; CHECK-NEXT: sha1nexte %xmm1, %xmm0
-; CHECK-NEXT: retq
+; SSE-LABEL: test_sha1nexterr:
+; SSE: # %bb.0: # %entry
+; SSE-NEXT: sha1nexte %xmm1, %xmm0
+; SSE-NEXT: retq
+;
+; AVX-LABEL: test_sha1nexterr:
+; AVX: # %bb.0: # %entry
+; AVX-NEXT: sha1nexte %xmm1, %xmm0 # encoding: [0x0f,0x38,0xc8,0xc1]
+; AVX-NEXT: retq # encoding: [0xc3]
+;
+; EGPR-LABEL: test_sha1nexterr:
+; EGPR: # %bb.0: # %entry
+; EGPR-NEXT: sha1nexte %xmm1, %xmm0 # encoding: [0x62,0xf4,0x7c,0x08,0xd8,0xc1]
+; EGPR-NEXT: retq # encoding: [0xc3]
entry:
%0 = tail call <4 x i32> @llvm.x86.sha1nexte(<4 x i32> %a, <4 x i32> %b)
ret <4 x i32> %0
}
define <4 x i32> @test_sha1nexterm(<4 x i32> %a, ptr %b) nounwind uwtable {
-; CHECK-LABEL: test_sha1nexterm:
-; CHECK: # %bb.0: # %entry
-; CHECK-NEXT: sha1nexte (%rdi), %xmm0
-; CHECK-NEXT: retq
+; SSE-LABEL: test_sha1nexterm:
+; SSE: # %bb.0: # %entry
+; SSE-NEXT: sha1nexte (%rdi), %xmm0
+; SSE-NEXT: retq
+;
+; AVX-LABEL: test_sha1nexterm:
+; AVX: # %bb.0: # %entry
+; AVX-NEXT: sha1nexte (%rdi), %xmm0 # encoding: [0x0f,0x38,0xc8,0x07]
+; AVX-NEXT: retq # encoding: [0xc3]
+;
+; EGPR-LABEL: test_sha1nexterm:
+; EGPR: # %bb.0: # %entry
+; EGPR-NEXT: sha1nexte (%rdi), %xmm0 # encoding: [0x62,0xf4,0x7c,0x08,0xd8,0x07]
+; EGPR-NEXT: retq # encoding: [0xc3]
entry:
%0 = load <4 x i32>, ptr %b
%1 = tail call <4 x i32> @llvm.x86.sha1nexte(<4 x i32> %a, <4 x i32> %0)
@@ -51,20 +92,40 @@ entry:
declare <4 x i32> @llvm.x86.sha1msg1(<4 x i32>, <4 x i32>) nounwind readnone
define <4 x i32> @test_sha1msg1rr(<4 x i32> %a, <4 x i32> %b) nounwind uwtable {
-; CHECK-LABEL: test_sha1msg1rr:
-; CHECK: # %bb.0: # %entry
-; CHECK-NEXT: sha1msg1 %xmm1, %xmm0
-; CHECK-NEXT: retq
+; SSE-LABEL: test_sha1msg1rr:
+; SSE: # %bb.0: # %entry
+; SSE-NEXT: sha1msg1 %xmm1, %xmm0
+; SSE-NEXT: retq
+;
+; AVX-LABEL: test_sha1msg1rr:
+; AVX: # %bb.0: # %entry
+; AVX-NEXT: sha1msg1 %xmm1, %xmm0 # encoding: [0x0f,0x38,0xc9,0xc1]
+; AVX-NEXT: retq # encoding: [0xc3]
+;
+; EGPR-LABEL: test_sha1msg1rr:
+; EGPR: # %bb.0: # %entry
+; EGPR-NEXT: sha1msg1 %xmm1, %xmm0 # encoding: [0x62,0xf4,0x7c,0x08,0xd9,0xc1]
+; EGPR-NEXT: retq # encoding: [0xc3]
entry:
%0 = tail call <4 x i32> @llvm.x86.sha1msg1(<4 x i32> %a, <4 x i32> %b)
ret <4 x i32> %0
}
define <4 x i32> @test_sha1msg1rm(<4 x i32> %a, ptr %b) nounwind uwtable {
-; CHECK-LABEL: test_sha1msg1rm:
-; CHECK: # %bb.0: # %entry
-; CHECK-NEXT: sha1msg1 (%rdi), %xmm0
-; CHECK-NEXT: retq
+; SSE-LABEL: test_sha1msg1rm:
+; SSE: # %bb.0: # %entry
+; SSE-NEXT: sha1msg1 (%rdi), %xmm0
+; SSE-NEXT: retq
+;
+; AVX-LABEL: test_sha1msg1rm:
+; AVX: # %bb.0: # %entry
+; AVX-NEXT: sha1msg1 (%rdi), %xmm0 # encoding: [0x0f,0x38,0xc9,0x07]
+; AVX-NEXT: retq # encoding: [0xc3]
+;
+; EGPR-LABEL: test_sha1msg1rm:
+; EGPR: # %bb.0: # %entry
+; EGPR-NEXT: sha1msg1 (%rdi), %xmm0 # encoding: [0x62,0xf4,0x7c,0x08,0xd9,0x07]
+; EGPR-NEXT: retq # encoding: [0xc3]
entry:
%0 = load <4 x i32>, ptr %b
%1 = tail call <4 x i32> @llvm.x86.sha1msg1(<4 x i32> %a, <4 x i32> %0)
@@ -74,20 +135,40 @@ entry:
declare <4 x i32> @llvm.x86.sha1msg2(<4 x i32>, <4 x i32>) nounwind readnone
define <4 x i32> @test_sha1msg2rr(<4 x i32> %a, <4 x i32> %b) nounwind uwtable {
-; CHECK-LABEL: test_sha1msg2rr:
-; CHECK: # %bb.0: # %entry
-; CHECK-NEXT: sha1msg2 %xmm1, %xmm0
-; CHECK-NEXT: retq
+; SSE-LABEL: test_sha1msg2rr:
+; SSE: # %bb.0: # %entry
+; SSE-NEXT: sha1msg2 %xmm1, %xmm0
+; SSE-NEXT: retq
+;
+; AVX-LABEL: test_sha1msg2rr:
+; AVX: # %bb.0: # %entry
+; AVX-NEXT: sha1msg2 %xmm1, %xmm0 # encoding: [0x0f,0x38,0xca,0xc1]
+; AVX-NEXT: retq # encoding: [0xc3]
+;
+; EGPR-LABEL: test_sha1msg2rr:
+; EGPR: # %bb.0: # %entry
+; EGPR-NEXT: sha1msg2 %xmm1, %xmm0 # encoding: [0x62,0xf4,0x7c,0x08,0xda,0xc1]
+; EGPR-NEXT: retq # encoding: [0xc3]
entry:
%0 = tail call <4 x i32> @llvm.x86.sha1msg2(<4 x i32> %a, <4 x i32> %b)
ret <4 x i32> %0
}
define <4 x i32> @test_sha1msg2rm(<4 x i32> %a, ptr %b) nounwind uwtable {
-; CHECK-LABEL: test_sha1msg2rm:
-; CHECK: # %bb.0: # %entry
-; CHECK-NEXT: sha1msg2 (%rdi), %xmm0
-; CHECK-NEXT: retq
+; SSE-LABEL: test_sha1msg2rm:
+; SSE: # %bb.0: # %entry
+; SSE-NEXT: sha1msg2 (%rdi), %xmm0
+; SSE-NEXT: retq
+;
+; AVX-LABEL: test_sha1msg2rm:
+; AVX: # %bb.0: # %entry
+; AVX-NEXT: sha1msg2 (%rdi), %xmm0 # encoding: [0x0f,0x38,0xca,0x07]
+; AVX-NEXT: retq # encoding: [0xc3]
+;
+; EGPR-LABEL: test_sha1msg2rm:
+; EGPR: # %bb.0: # %entry
+; EGPR-NEXT: sha1msg2 (%rdi), %xmm0 # encoding: [0x62,0xf4,0x7c,0x08,0xda,0x07]
+; EGPR-NEXT: retq # encoding: [0xc3]
entry:
%0 = load <4 x i32>, ptr %b
%1 = tail call <4 x i32> @llvm.x86.sha1msg2(<4 x i32> %a, <4 x i32> %0)
@@ -107,11 +188,19 @@ define <4 x i32> @test_sha256rnds2rr(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c) n
;
; AVX-LABEL: test_sha256rnds2rr:
; AVX: # %bb.0: # %entry
-; AVX-NEXT: vmovaps %xmm0, %xmm3
-; AVX-NEXT: vmovaps %xmm2, %xmm0
-; AVX-NEXT: sha256rnds2 %xmm0, %xmm1, %xmm3
-; AVX-NEXT: vmovaps %xmm3, %xmm0
-; AVX-NEXT: retq
+; AVX-NEXT: vmovaps %xmm0, %xmm3 # encoding: [0xc5,0xf8,0x28,0xd8]
+; AVX-NEXT: vmovaps %xmm2, %xmm0 # encoding: [0xc5,0xf8,0x28,0xc2]
+; AVX-NEXT: sha256rnds2 %xmm0, %xmm1, %xmm3 # encoding: [0x0f,0x38,0xcb,0xd9]
+; AVX-NEXT: vmovaps %xmm3, %xmm0 # encoding: [0xc5,0xf8,0x28,0xc3]
+; AVX-NEXT: retq # encoding: [0xc3]
+;
+; EGPR-LABEL: test_sha256rnds2rr:
+; EGPR: # %bb.0: # %entry
+; EGPR-NEXT: movaps %xmm0, %xmm3 # encoding: [0x0f,0x28,0xd8]
+; EGPR-NEXT: movaps %xmm2, %xmm0 # encoding: [0x0f,0x28,0xc2]
+; EGPR-NEXT: sha256rnds2 %xmm0, %xmm1, %xmm3 # encoding: [0x62,0xf4,0x7c,0x08,0xdb,0xd9]
+; EGPR-NEXT: movaps %xmm3, %xmm0 # encoding: [0x0f,0x28,0xc3]
+; EGPR-NEXT: retq # encoding: [0xc3]
entry:
%0 = tail call <4 x i32> @llvm.x86.sha256rnds2(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c)
ret <4 x i32> %0
@@ -128,11 +217,19 @@ define <4 x i32> @test_sha256rnds2rm(<4 x i32> %a, ptr %b, <4 x i32> %c) nounwin
;
; AVX-LABEL: test_sha256rnds2rm:
; AVX: # %bb.0: # %entry
-; AVX-NEXT: vmovaps %xmm0, %xmm2
-; AVX-NEXT: vmovaps %xmm1, %xmm0
-; AVX-NEXT: sha256rnds2 %xmm0, (%rdi), %xmm2
-; AVX-NEXT: vmovaps %xmm2, %xmm0
-; AVX-NEXT: retq
+; AVX-NEXT: vmovaps %xmm0, %xmm2 # encoding: [0xc5,0xf8,0x28,0xd0]
+; AVX-NEXT: vmovaps %xmm1, %xmm0 # encoding: [0xc5,0xf8,0x28,0xc1]
+; AVX-NEXT: sha256rnds2 %xmm0, (%rdi), %xmm2 # encoding: [0x0f,0x38,0xcb,0x17]
+; AVX-NEXT: vmovaps %xmm2, %xmm0 # encoding: [0xc5,0xf8,0x28,0xc2]
+; AVX-NEXT: retq # encoding: [0xc3]
+;
+; EGPR-LABEL: test_sha256rnds2rm:
+; EGPR: # %bb.0: # %entry
+; EGPR-NEXT: movaps %xmm0, %xmm2 # encoding: [0x0f,0x28,0xd0]
+; EGPR-NEXT: movaps %xmm1, %xmm0 # encoding: [0x0f,0x28,0xc1]
+; EGPR-NEXT: sha256rnds2 %xmm0, (%rdi), %xmm2 # encoding: [0x62,0xf4,0x7c,0x08,0xdb,0x17]
+; EGPR-NEXT: movaps %xmm2, %xmm0 # encoding: [0x0f,0x28,0xc2]
+; EGPR-NEXT: retq # encoding: [0xc3]
entry:
%0 = load <4 x i32>, ptr %b
%1 = tail call <4 x i32> @llvm.x86.sha256rnds2(<4 x i32> %a, <4 x i32> %0, <4 x i32> %c)
@@ -142,20 +239,40 @@ entry:
declare <4 x i32> @llvm.x86.sha256msg1(<4 x i32>, <4 x i32>) nounwind readnone
define <4 x i32> @test_sha256msg1rr(<4 x i32> %a, <4 x i32> %b) nounwind uwtable {
-; CHECK-LABEL: test_sha256msg1rr:
-; CHECK: # %bb.0: # %entry
-; CHECK-NEXT: sha256msg1 %xmm1, %xmm0
-; CHECK-NEXT: retq
+; SSE-LABEL: test_sha256msg1rr:
+; SSE: # %bb.0: # %entry
+; SSE-NEXT: sha256msg1 %xmm1, %xmm0
+; SSE-NEXT: retq
+;
+; AVX-LABEL: test_sha256msg1rr:
+; AVX: # %bb.0: # %entry
+; AVX-NEXT: sha256msg1 %xmm1, %xmm0 # encoding: [0x0f,0x38,0xcc,0xc1]
+; AVX-NEXT: retq # encoding: [0xc3]
+;
+; EGPR-LABEL: test_sha256msg1rr:
+; EGPR: # %bb.0: # %entry
+; EGPR-NEXT: sha256msg1 %xmm1, %xmm0 # encoding: [0x62,0xf4,0x7c,0x08,0xdc,0xc1]
+; EGPR-NEXT: retq # encoding: [0xc3]
entry:
%0 = tail call <4 x i32> @llvm.x86.sha256msg1(<4 x i32> %a, <4 x i32> %b)
ret <4 x i32> %0
}
define <4 x i32> @test_sha256msg1rm(<4 x i32> %a, ptr %b) nounwind uwtable {
-; CHECK-LABEL: test_sha256msg1rm:
-; CHECK: # %bb.0: # %entry
-; CHECK-NEXT: sha256msg1 (%rdi), %xmm0
-; CHECK-NEXT: retq
+; SSE-LABEL: test_sha256msg1rm:
+; SSE: # %bb.0: # %entry
+; SSE-NEXT: sha256msg1 (%rdi), %xmm0
+; SSE-NEXT: retq
+;
+; AVX-LABEL: test_sha256msg1rm:
+; AVX: # %bb.0: # %entry
+; AVX-NEXT: sha256msg1 (%rdi), %xmm0 # encoding: [0x0f,0x38,0xcc,0x07]
+; AVX-NEXT: retq # encoding: [0xc3]
+;
+; EGPR-LABEL: test_sha256msg1rm:
+; EGPR: # %bb.0: # %entry
+; EGPR-NEXT: sha256msg1 (%rdi), %xmm0 # encoding: [0x62,0xf4,0x7c,0x08,0xdc,0x07]
+; EGPR-NEXT: retq # encoding: [0xc3]
entry:
%0 = load <4 x i32>, ptr %b
%1 = tail call <4 x i32> @llvm.x86.sha256msg1(<4 x i32> %a, <4 x i32> %0)
@@ -165,20 +282,40 @@ entry:
declare <4 x i32> @llvm.x86.sha256msg2(<4 x i32>, <4 x i32>) nounwind readnone
define <4 x i32> @test_sha256msg2rr(<4 x i32> %a, <4 x i32> %b) nounwind uwtable {
-; CHECK-LABEL: test_sha256msg2rr:
-; CHECK: # %bb.0: # %entry
-; CHECK-NEXT: sha256msg2 %xmm1, %xmm0
-; CHECK-NEXT: retq
+; SSE-LABEL: test_sha256msg2rr:
+; SSE: # %bb.0: # %entry
+; SSE-NEXT: sha256msg2 %xmm1, %xmm0
+; SSE-NEXT: retq
+;
+; AVX-LABEL: test_sha256msg2rr:
+; AVX: # %bb.0: # %entry
+; AVX-NEXT: sha256msg2 %xmm1, %xmm0 # encoding: [0x0f,0x38,0xcd,0xc1]
+; AVX-NEXT: retq # encoding: [0xc3]
+;
+; EGPR-LABEL: test_sha256msg2rr:
+; EGPR: # %bb.0: # %entry
+; EGPR-NEXT: sha256msg2 %xmm1, %xmm0 # encoding: [0x62,0xf4,0x7c,0x08,0xdd,0xc1]
+; EGPR-NEXT: retq # encoding: [0xc3]
entry:
%0 = tail call <4 x i32> @llvm.x86.sha256msg2(<4 x i32> %a, <4 x i32> %b)
ret <4 x i32> %0
}
define <4 x i32> @test_sha256msg2rm(<4 x i32> %a, ptr %b) nounwind uwtable {
-; CHECK-LABEL: test_sha256msg2rm:
-; CHECK: # %bb.0: # %entry
-; CHECK-NEXT: sha256msg2 (%rdi), %xmm0
-; CHECK-NEXT: retq
+; SSE-LABEL: test_sha256msg2rm:
+; SSE: # %bb.0: # %entry
+; SSE-NEXT: sha256msg2 (%rdi), %xmm0
+; SSE-NEXT: retq
+;
+; AVX-LABEL: test_sha256msg2rm:
+; AVX: # %bb.0: # %entry
+; AVX-NEXT: sha256msg2 (%rdi), %xmm0 # encoding: [0x0f,0x38,0xcd,0x07]
+; AVX-NEXT: retq # encoding: [0xc3]
+;
+; EGPR-LABEL: test_sha256msg2rm:
+; EGPR: # %bb.0: # %entry
+; EGPR-NEXT: sha256msg2 (%rdi), %xmm0 # encoding: [0x62,0xf4,0x7c,0x08,0xdd,0x07]
+; EGPR-NEXT: retq # encoding: [0xc3]
entry:
%0 = load <4 x i32>, ptr %b
%1 = tail call <4 x i32> @llvm.x86.sha256msg2(<4 x i32> %a, <4 x i32> %0)
@@ -195,12 +332,20 @@ define <8 x i32> @test_sha1rnds4_zero_extend(<4 x i32> %a, ptr %b) nounwind uwta
;
; AVX-LABEL: test_sha1rnds4_zero_extend:
; AVX: # %bb.0: # %entry
-; AVX-NEXT: sha1rnds4 $3, (%rdi), %xmm0
-; AVX-NEXT: vmovaps %xmm0, %xmm0
-; AVX-NEXT: retq
+; AVX-NEXT: sha1rnds4 $3, (%rdi), %xmm0 # encoding: [0x0f,0x3a,0xcc,0x07,0x03]
+; AVX-NEXT: vmovaps %xmm0, %xmm0 # encoding: [0xc5,0xf8,0x28,0xc0]
+; AVX-NEXT: retq # encoding: [0xc3]
+;
+; EGPR-LABEL: test_sha1rnds4_zero_extend:
+; EGPR: # %bb.0: # %entry
+; EGPR-NEXT: sha1rnds4 $3, (%rdi), %xmm0 # encoding: [0x62,0xf4,0x7c,0x08,0xd4,0x07,0x03]
+; EGPR-NEXT: xorps %xmm1, %xmm1 # encoding: [0x0f,0x57,0xc9]
+; EGPR-NEXT: retq # encoding: [0xc3]
entry:
%0 = load <4 x i32>, ptr %b
%1 = tail call <4 x i32> @llvm.x86.sha1rnds4(<4 x i32> %a, <4 x i32> %0, i8 3)
%2 = shufflevector <4 x i32> %1, <4 x i32> zeroinitializer, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
ret <8 x i32> %2
}
+;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
+; CHECK: {{.*}}
diff --git a/llvm/test/CodeGen/X86/x64-cet-intrinsics.ll b/llvm/test/CodeGen/X86/x64-cet-intrinsics.ll
index 4c28c8ab43699f..bf87ae5cac05aa 100644
--- a/llvm/test/CodeGen/X86/x64-cet-intrinsics.ll
+++ b/llvm/test/CodeGen/X86/x64-cet-intrinsics.ll
@@ -1,11 +1,17 @@
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
-; RUN: llc < %s -mtriple=x86_64-apple-darwin -mattr=+shstk | FileCheck %s
+; RUN: llc < %s -mtriple=x86_64-apple-darwin -mattr=+shstk --show-mc-encoding | FileCheck %s
+; RUN: llc < %s -mtriple=x86_64-apple-darwin -mattr=+shstk,+egpr --show-mc-encoding | FileCheck %s -check-prefix=EGPR
define void @test_incsspd(i32 %a) local_unnamed_addr {
; CHECK-LABEL: test_incsspd:
; CHECK: ## %bb.0: ## %entry
-; CHECK-NEXT: incsspd %edi
-; CHECK-NEXT: retq
+; CHECK-NEXT: incsspd %edi ## encoding: [0xf3,0x0f,0xae,0xef]
+; CHECK-NEXT: retq ## encoding: [0xc3]
+;
+; EGPR-LABEL: test_incsspd:
+; EGPR: ## %bb.0: ## %entry
+; EGPR-NEXT: incsspd %edi ## encoding: [0xf3,0x0f,0xae,0xef]
+; EGPR-NEXT: retq ## encoding: [0xc3]
entry:
tail call void @llvm.x86.incsspd(i32 %a)
ret void
@@ -16,9 +22,15 @@ declare void @llvm.x86.incsspd(i32)
define void @test_incsspq(i32 %a) local_unnamed_addr {
; CHECK-LABEL: test_incsspq:
; CHECK: ## %bb.0: ## %entry
-; CHECK-NEXT: movslq %edi, %rax
-; CHECK-NEXT: incsspq %rax
-; CHECK-NEXT: retq
+; CHECK-NEXT: movslq %edi, %rax ## encoding: [0x48,0x63,0xc7]
+; CHECK-NEXT: incsspq %rax ## encoding: [0xf3,0x48,0x0f,0xae,0xe8]
+; CHECK-NEXT: retq ## encoding: [0xc3]
+;
+; EGPR-LABEL: test_incsspq:
+; EGPR: ## %bb.0: ## %entry
+; EGPR-NEXT: movslq %edi, %rax ## encoding: [0x48,0x63,0xc7]
+; EGPR-NEXT: incsspq %rax ## encoding: [0xf3,0x48,0x0f,0xae,0xe8]
+; EGPR-NEXT: retq ## encoding: [0xc3]
entry:
%conv.i = sext i32 %a to i64
tail call void @llvm.x86.incsspq(i64 %conv.i)
@@ -30,9 +42,15 @@ declare void @llvm.x86.incsspq(i64)
define i32 @test_rdsspd(i32 %a) {
; CHECK-LABEL: test_rdsspd:
; CHECK: ## %bb.0: ## %entry
-; CHECK-NEXT: movl %edi, %eax
-; CHECK-NEXT: rdsspd %eax
-; CHECK-NEXT: retq
+; CHECK-NEXT: movl %edi, %eax ## encoding: [0x89,0xf8]
+; CHECK-NEXT: rdsspd %eax ## encoding: [0xf3,0x0f,0x1e,0xc8]
+; CHECK-NEXT: retq ## encoding: [0xc3]
+;
+; EGPR-LABEL: test_rdsspd:
+; EGPR: ## %bb.0: ## %entry
+; EGPR-NEXT: movl %edi, %eax ## encoding: [0x89,0xf8]
+; EGPR-NEXT: rdsspd %eax ## encoding: [0xf3,0x0f,0x1e,0xc8]
+; EGPR-NEXT: retq ## encoding: [0xc3]
entry:
%0 = call i32 @llvm.x86.rdsspd(i32 %a)
ret i32 %0
@@ -43,9 +61,15 @@ declare i32 @llvm.x86.rdsspd(i32)
define i64 @test_rdsspq(i64 %a) {
; CHECK-LABEL: test_rdsspq:
; CHECK: ## %bb.0: ## %entry
-; CHECK-NEXT: movq %rdi, %rax
-; CHECK-NEXT: rdsspq %rax
-; CHECK-NEXT: retq
+; CHECK-NEXT: movq %rdi, %rax ## encoding: [0x48,0x89,0xf8]
+; CHECK-NEXT: rdsspq %rax ## encoding: [0xf3,0x48,0x0f,0x1e,0xc8]
+; CHECK-NEXT: retq ## encoding: [0xc3]
+;
+; EGPR-LABEL: test_rdsspq:
+; EGPR: ## %bb.0: ## %entry
+; EGPR-NEXT: movq %rdi, %rax ## encoding: [0x48,0x89,0xf8]
+; EGPR-NEXT: rdsspq %rax ## encoding: [0xf3,0x48,0x0f,0x1e,0xc8]
+; EGPR-NEXT: retq ## encoding: [0xc3]
entry:
%0 = call i64 @llvm.x86.rdsspq(i64 %a)
ret i64 %0
@@ -56,8 +80,13 @@ declare i64 @llvm.x86.rdsspq(i64)
define void @test_saveprevssp() {
; CHECK-LABEL: test_saveprevssp:
; CHECK: ## %bb.0: ## %entry
-; CHECK-NEXT: saveprevssp
-; CHECK-NEXT: retq
+; CHECK-NEXT: saveprevssp ## encoding: [0xf3,0x0f,0x01,0xea]
+; CHECK-NEXT: retq ## encoding: [0xc3]
+;
+; EGPR-LABEL: test_saveprevssp:
+; EGPR: ## %bb.0: ## %entry
+; EGPR-NEXT: saveprevssp ## encoding: [0xf3,0x0f,0x01,0xea]
+; EGPR-NEXT: retq ## encoding: [0xc3]
entry:
tail call void @llvm.x86.saveprevssp()
ret void
@@ -68,8 +97,13 @@ declare void @llvm.x86.saveprevssp()
define void @test_rstorssp(ptr %__p) {
; CHECK-LABEL: test_rstorssp:
; CHECK: ## %bb.0: ## %entry
-; CHECK-NEXT: rstorssp (%rdi)
-; CHECK-NEXT: retq
+; CHECK-NEXT: rstorssp (%rdi) ## encoding: [0xf3,0x0f,0x01,0x2f]
+; CHECK-NEXT: retq ## encoding: [0xc3]
+;
+; EGPR-LABEL: test_rstorssp:
+; EGPR: ## %bb.0: ## %entry
+; EGPR-NEXT: rstorssp (%rdi) ## encoding: [0xf3,0x0f,0x01,0x2f]
+; EGPR-NEXT: retq ## encoding: [0xc3]
entry:
tail call void @llvm.x86.rstorssp(ptr %__p)
ret void
@@ -80,8 +114,13 @@ declare void @llvm.x86.rstorssp(ptr)
define void @test_wrssd(i32 %a, ptr %__p) {
; CHECK-LABEL: test_wrssd:
; CHECK: ## %bb.0: ## %entry
-; CHECK-NEXT: wrssd %edi, (%rsi)
-; CHECK-NEXT: retq
+; CHECK-NEXT: wrssd %edi, (%rsi) ## encoding: [0x0f,0x38,0xf6,0x3e]
+; CHECK-NEXT: retq ## encoding: [0xc3]
+;
+; EGPR-LABEL: test_wrssd:
+; EGPR: ## %bb.0: ## %entry
+; EGPR-NEXT: wrssd %edi, (%rsi) ## encoding: [0x62,0xf4,0x7c,0x08,0x66,0x3e]
+; EGPR-NEXT: retq ## encoding: [0xc3]
entry:
tail call void @llvm.x86.wrssd(i32 %a, ptr %__p)
ret void
@@ -92,8 +131,13 @@ declare void @llvm.x86.wrssd(i32, ptr)
define void @test_wrssq(i64 %a, ptr %__p) {
; CHECK-LABEL: test_wrssq:
; CHECK: ## %bb.0: ## %entry
-; CHECK-NEXT: wrssq %rdi, (%rsi)
-; CHECK-NEXT: retq
+; CHECK-NEXT: wrssq %rdi, (%rsi) ## encoding: [0x48,0x0f,0x38,0xf6,0x3e]
+; CHECK-NEXT: retq ## encoding: [0xc3]
+;
+; EGPR-LABEL: test_wrssq:
+; EGPR: ## %bb.0: ## %entry
+; EGPR-NEXT: wrssq %rdi, (%rsi) ## encoding: [0x62,0xf4,0xfc,0x08,0x66,0x3e]
+; EGPR-NEXT: retq ## encoding: [0xc3]
entry:
tail call void @llvm.x86.wrssq(i64 %a, ptr %__p)
ret void
@@ -104,8 +148,13 @@ declare void @llvm.x86.wrssq(i64, ptr)
define void @test_wrussd(i32 %a, ptr %__p) {
; CHECK-LABEL: test_wrussd:
; CHECK: ## %bb.0: ## %entry
-; CHECK-NEXT: wrussd %edi, (%rsi)
-; CHECK-NEXT: retq
+; CHECK-NEXT: wrussd %edi, (%rsi) ## encoding: [0x66,0x0f,0x38,0xf5,0x3e]
+; CHECK-NEXT: retq ## encoding: [0xc3]
+;
+; EGPR-LABEL: test_wrussd:
+; EGPR: ## %bb.0: ## %entry
+; EGPR-NEXT: wrussd %edi, (%rsi) ## encoding: [0x62,0xf4,0x7d,0x08,0x65,0x3e]
+; EGPR-NEXT: retq ## encoding: [0xc3]
entry:
tail call void @llvm.x86.wrussd(i32 %a, ptr %__p)
ret void
@@ -116,8 +165,13 @@ declare void @llvm.x86.wrussd(i32, ptr)
define void @test_wrussq(i64 %a, ptr %__p) {
; CHECK-LABEL: test_wrussq:
; CHECK: ## %bb.0: ## %entry
-; CHECK-NEXT: wrussq %rdi, (%rsi)
-; CHECK-NEXT: retq
+; CHECK-NEXT: wrussq %rdi, (%rsi) ## encoding: [0x66,0x48,0x0f,0x38,0xf5,0x3e]
+; CHECK-NEXT: retq ## encoding: [0xc3]
+;
+; EGPR-LABEL: test_wrussq:
+; EGPR: ## %bb.0: ## %entry
+; EGPR-NEXT: wrussq %rdi, (%rsi) ## encoding: [0x62,0xf4,0xfd,0x08,0x65,0x3e]
+; EGPR-NEXT: retq ## encoding: [0xc3]
entry:
tail call void @llvm.x86.wrussq(i64 %a, ptr %__p)
ret void
@@ -128,8 +182,13 @@ declare void @llvm.x86.wrussq(i64, ptr)
define void @test_setssbsy() {
; CHECK-LABEL: test_setssbsy:
; CHECK: ## %bb.0: ## %entry
-; CHECK-NEXT: setssbsy
-; CHECK-NEXT: retq
+; CHECK-NEXT: setssbsy ## encoding: [0xf3,0x0f,0x01,0xe8]
+; CHECK-NEXT: retq ## encoding: [0xc3]
+;
+; EGPR-LABEL: test_setssbsy:
+; EGPR: ## %bb.0: ## %entry
+; EGPR-NEXT: setssbsy ## encoding: [0xf3,0x0f,0x01,0xe8]
+; EGPR-NEXT: retq ## encoding: [0xc3]
entry:
tail call void @llvm.x86.setssbsy()
ret void
@@ -140,8 +199,13 @@ declare void @llvm.x86.setssbsy()
define void @test_clrssbsy(ptr %__p) {
; CHECK-LABEL: test_clrssbsy:
; CHECK: ## %bb.0: ## %entry
-; CHECK-NEXT: clrssbsy (%rdi)
-; CHECK-NEXT: retq
+; CHECK-NEXT: clrssbsy (%rdi) ## encoding: [0xf3,0x0f,0xae,0x37]
+; CHECK-NEXT: retq ## encoding: [0xc3]
+;
+; EGPR-LABEL: test_clrssbsy:
+; EGPR: ## %bb.0: ## %entry
+; EGPR-NEXT: clrssbsy (%rdi) ## encoding: [0xf3,0x0f,0xae,0x37]
+; EGPR-NEXT: retq ## encoding: [0xc3]
entry:
tail call void @llvm.x86.clrssbsy(ptr %__p)
ret void
More information about the llvm-commits
mailing list