diff options
author | Clement Courbet <courbet@google.com> | 2020-11-02 14:25:14 +0100 |
---|---|---|
committer | Clement Courbet <courbet@google.com> | 2020-11-04 10:44:15 +0100 |
commit | af658d920e2b677117d52fdb83a871f2ca5a98a0 (patch) | |
tree | b24e724fd85c5db5579a3f9a0c9423cafe697b7a | |
parent | a57550def15e77e33dd6a4de22c83885c8fdc6f1 (diff) | |
download | llvm-af658d920e2b677117d52fdb83a871f2ca5a98a0.tar.gz |
[llvm-exegesis][X86] Save and restore eflags.
This is needed to benchmark instruction that touch EFLAGS (e.g. STD: set direction flag).
Differential Revision: https://reviews.llvm.org/D90742
-rw-r--r-- | llvm/test/tools/llvm-exegesis/X86/uops-STD.s | 7 | ||||
-rw-r--r-- | llvm/tools/llvm-exegesis/lib/X86/Target.cpp | 5 |
2 files changed, 12 insertions, 0 deletions
diff --git a/llvm/test/tools/llvm-exegesis/X86/uops-STD.s b/llvm/test/tools/llvm-exegesis/X86/uops-STD.s new file mode 100644 index 000000000000..c67beed97022 --- /dev/null +++ b/llvm/test/tools/llvm-exegesis/X86/uops-STD.s @@ -0,0 +1,7 @@ +# RUN: llvm-exegesis -mode=uops -opcode-name=STD -repetition-mode=duplicate | FileCheck %s +# RUN: llvm-exegesis -mode=uops -opcode-name=STD -repetition-mode=loop | FileCheck %s + +CHECK: mode: uops +CHECK-NEXT: key: +CHECK-NEXT: instructions: +CHECK-NEXT: STD diff --git a/llvm/tools/llvm-exegesis/lib/X86/Target.cpp b/llvm/tools/llvm-exegesis/lib/X86/Target.cpp index db30c1f1837d..005ee4e9a129 100644 --- a/llvm/tools/llvm-exegesis/lib/X86/Target.cpp +++ b/llvm/tools/llvm-exegesis/lib/X86/Target.cpp @@ -603,8 +603,10 @@ public: #ifdef __x86_64__ # if defined(_MSC_VER) _fxsave64(FPState); + Eflags = __readeflags(); # elif defined(__GNUC__) __builtin_ia32_fxsave64(FPState); + Eflags = __builtin_ia32_readeflags_u64(); # endif #else llvm_unreachable("X86 exegesis running on non-X86 target"); @@ -618,9 +620,11 @@ public: # if defined(_MSC_VER) _clearfp(); _fxrstor64(FPState); + __writeeflags(Eflags); # elif defined(__GNUC__) asm volatile("fwait"); __builtin_ia32_fxrstor64(FPState); + __builtin_ia32_writeeflags_u64(Eflags); # endif #else llvm_unreachable("X86 exegesis running on non-X86 target"); @@ -630,6 +634,7 @@ public: private: #ifdef __x86_64__ alignas(16) char FPState[512]; + uint64_t Eflags; #endif }; |