[llvm-exegesis] Add predefined floating point values so we can test impact of special values on latency.
Summary: This will be useful to generate many configurations and test instruction regimes (NaN, Inf, subnormal, normal).
Reviewers: courbet
Subscribers: mgorny, tschuett, llvm-commits
Differential Revision: https://reviews.llvm.org/D51858
llvm-svn: 342369
diff --git a/llvm/tools/llvm-exegesis/lib/CMakeLists.txt b/llvm/tools/llvm-exegesis/lib/CMakeLists.txt
index 17e6a98..345af00 100644
--- a/llvm/tools/llvm-exegesis/lib/CMakeLists.txt
+++ b/llvm/tools/llvm-exegesis/lib/CMakeLists.txt
@@ -20,6 +20,7 @@
PerfHelper.cpp
RegisterAliasing.cpp
SnippetGenerator.cpp
+ RegisterValue.cpp
Target.cpp
Uops.cpp
)
diff --git a/llvm/tools/llvm-exegesis/lib/RegisterValue.cpp b/llvm/tools/llvm-exegesis/lib/RegisterValue.cpp
new file mode 100644
index 0000000..4b4786a
--- /dev/null
+++ b/llvm/tools/llvm-exegesis/lib/RegisterValue.cpp
@@ -0,0 +1,48 @@
+//===-- RegisterValue.cpp ---------------------------------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "RegisterValue.h"
+#include "llvm/ADT/APFloat.h"
+
+namespace exegesis {
+
+static llvm::APFloat getFloatValue(const llvm::fltSemantics &FltSemantics,
+ PredefinedValues Value) {
+ switch (Value) {
+ case PredefinedValues::POS_ZERO:
+ return llvm::APFloat::getZero(FltSemantics);
+ case PredefinedValues::NEG_ZERO:
+ return llvm::APFloat::getZero(FltSemantics, true);
+ case PredefinedValues::ONE:
+ return llvm::APFloat(FltSemantics, "1");
+ case PredefinedValues::TWO:
+ return llvm::APFloat(FltSemantics, "2");
+ case PredefinedValues::INF:
+ return llvm::APFloat::getInf(FltSemantics);
+ case PredefinedValues::QNAN:
+ return llvm::APFloat::getQNaN(FltSemantics);
+ case PredefinedValues::SMALLEST_NORM:
+ return llvm::APFloat::getSmallestNormalized(FltSemantics);
+ case PredefinedValues::LARGEST:
+ return llvm::APFloat::getLargest(FltSemantics);
+ case PredefinedValues::ULP:
+ return llvm::APFloat::getSmallest(FltSemantics);
+ case PredefinedValues::ONE_PLUS_ULP:
+ auto Output = getFloatValue(FltSemantics, PredefinedValues::ONE);
+ Output.next(false);
+ return Output;
+ }
+}
+
+llvm::APInt bitcastFloatValue(const llvm::fltSemantics &FltSemantics,
+ PredefinedValues Value) {
+ return getFloatValue(FltSemantics, Value).bitcastToAPInt();
+}
+
+} // namespace exegesis
diff --git a/llvm/tools/llvm-exegesis/lib/RegisterValue.h b/llvm/tools/llvm-exegesis/lib/RegisterValue.h
new file mode 100644
index 0000000..8b83ce3
--- /dev/null
+++ b/llvm/tools/llvm-exegesis/lib/RegisterValue.h
@@ -0,0 +1,38 @@
+//===-- RegisterValue.h -----------------------------------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+///
+/// \file
+///
+/// Defines a Target independent value for a Register. This is useful to explore
+/// the influence of the instruction input values on its execution time.
+///
+//===----------------------------------------------------------------------===//
+
+#include <llvm/ADT/APFloat.h>
+
+namespace exegesis {
+
+enum class PredefinedValues {
+ POS_ZERO, // Positive zero
+ NEG_ZERO, // Negative zero
+ ONE, // 1.0
+ TWO, // 2.0
+ INF, // Infinity
+ QNAN, // Quiet NaN
+ ULP, // One Unit in the last place
+ SMALLEST = ULP, // The minimum subnormal number
+ SMALLEST_NORM, // The minimum normal number
+ LARGEST, // The maximum normal number
+ ONE_PLUS_ULP, // The value just after 1.0
+};
+
+llvm::APInt bitcastFloatValue(const llvm::fltSemantics &FltSemantics,
+ PredefinedValues Value);
+
+} // namespace exegesis