[PATCH] D52866: [llvm-exegesis][NFC] Improve parsing of the YAML files
Guillaume Chatelet via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Thu Oct 4 01:14:03 PDT 2018
gchatelet created this revision.
gchatelet added a reviewer: courbet.
Herald added subscribers: llvm-commits, tschuett.
sscanf turns out to be slow for reading floating points.
Repository:
rL LLVM
https://reviews.llvm.org/D52866
Files:
tools/llvm-exegesis/lib/BenchmarkResult.cpp
Index: tools/llvm-exegesis/lib/BenchmarkResult.cpp
===================================================================
--- tools/llvm-exegesis/lib/BenchmarkResult.cpp
+++ tools/llvm-exegesis/lib/BenchmarkResult.cpp
@@ -17,8 +17,8 @@
#include "llvm/Support/Format.h"
#include "llvm/Support/raw_ostream.h"
-static constexpr const char kIntegerFormat[] = "i_0x%" PRId64 "x";
-static constexpr const char kDoubleFormat[] = "f_%la";
+static constexpr const char kIntegerPrefix[] = "i_0x";
+static constexpr const char kDoublePrefix[] = "f_";
static constexpr const char kInvalidOperand[] = "INVALID";
// A mutable struct holding an LLVMState that can be passed through the
@@ -73,14 +73,45 @@
}
private:
+ void serializeIntegerOperand(llvm::raw_ostream &OS, int64_t Value) {
+ OS << kIntegerPrefix;
+ unsigned long long Unsigned;
+ static_assert(sizeof(unsigned long long) == sizeof(uint64_t), "");
+ std::memcpy(&Unsigned, &Value, sizeof(Unsigned));
+ OS.write_hex(Unsigned);
+ }
+
+ bool tryDeserializeIntegerOperand(llvm::StringRef String, int64_t &Value) {
+ if (!String.consume_front(kIntegerPrefix))
+ return false;
+ unsigned long long Result;
+ if (consumeUnsignedInteger(String, 16, Result))
+ return false;
+ static_assert(sizeof(unsigned long long) == sizeof(uint64_t), "");
+ std::memcpy(&Value, &Result, sizeof(Value));
+ return true;
+ }
+
+ void serializeFPOperand(llvm::raw_ostream &OS, double Value) {
+ OS << kDoublePrefix << llvm::format("%la", Value);
+ }
+
+ bool tryDeserializeFPOperand(llvm::StringRef String, double &Value) {
+ if (!String.consume_front(kDoublePrefix))
+ return false;
+ char *EndPointer = nullptr;
+ Value = strtod(String.begin(), &EndPointer);
+ return EndPointer == String.end();
+ }
+
void serializeMCOperand(const llvm::MCOperand &MCOperand,
llvm::raw_ostream &OS) {
if (MCOperand.isReg()) {
OS << getRegName(MCOperand.getReg());
} else if (MCOperand.isImm()) {
- OS << llvm::format(kIntegerFormat, MCOperand.getImm());
+ serializeIntegerOperand(OS, MCOperand.getImm());
} else if (MCOperand.isFPImm()) {
- OS << llvm::format(kDoubleFormat, MCOperand.getFPImm());
+ serializeFPOperand(OS, MCOperand.getFPImm());
} else {
OS << kInvalidOperand;
}
@@ -90,11 +121,9 @@
assert(!String.empty());
int64_t IntValue = 0;
double DoubleValue = 0;
- if (String[0] == kIntegerFormat[0] &&
- sscanf(String.data(), kIntegerFormat, &IntValue) == 1)
+ if (tryDeserializeIntegerOperand(String, IntValue))
return llvm::MCOperand::createImm(IntValue);
- if (String[0] == kDoubleFormat[0] &&
- sscanf(String.data(), kDoubleFormat, &DoubleValue) == 1)
+ if (tryDeserializeFPOperand(String, DoubleValue))
return llvm::MCOperand::createFPImm(DoubleValue);
if (unsigned RegNo = getRegNo(String))
return llvm::MCOperand::createReg(RegNo);
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D52866.168234.patch
Type: text/x-patch
Size: 2996 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20181004/e8db9f1f/attachment.bin>
More information about the llvm-commits
mailing list