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 --- /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 --- a/llvm/tools/llvm-exegesis/lib/X86/Target.cpp +++ b/llvm/tools/llvm-exegesis/lib/X86/Target.cpp @@ -603,8 +603,10 @@ #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 @@ # 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 @@ private: #ifdef __x86_64__ alignas(16) char FPState[512]; + uint64_t Eflags; #endif };