diff --git a/libevmjit/Endianness.cpp b/libevmjit/Endianness.cpp index e062fb77ea..c2cc1ef90f 100644 --- a/libevmjit/Endianness.cpp +++ b/libevmjit/Endianness.cpp @@ -12,12 +12,21 @@ namespace eth namespace jit { -llvm::Value* Endianness::bswap(llvm::IRBuilder<>& _builder, llvm::Value* _word) +llvm::Value* Endianness::bswapIfLE(llvm::IRBuilder<>& _builder, llvm::Value* _word) { - // TODO: Native is Little Endian - assert(_word->getType() == Type::Word); - auto bswap = llvm::Intrinsic::getDeclaration(_builder.GetInsertBlock()->getParent()->getParent(), llvm::Intrinsic::bswap, Type::Word); - return _builder.CreateCall(bswap, _word); + union tester + { + unsigned int x; + unsigned char isLE; + }; + + if (tester{1}.isLE) + { + // OPT: Cache func declaration? + auto bswapFunc = llvm::Intrinsic::getDeclaration(_builder.GetInsertBlock()->getParent()->getParent(), llvm::Intrinsic::bswap, Type::Word); + return _builder.CreateCall(bswapFunc, _word); + } + return _word; } } diff --git a/libevmjit/Endianness.h b/libevmjit/Endianness.h index 951904358c..8a1f41085a 100644 --- a/libevmjit/Endianness.h +++ b/libevmjit/Endianness.h @@ -1,8 +1,6 @@ #pragma once -#include - #include namespace dev @@ -14,19 +12,11 @@ namespace jit struct Endianness { - -#if defined(BOOST_LITTLE_ENDIAN) - static llvm::Value* toBE(llvm::IRBuilder<>& _builder, llvm::Value* _word) { return bswap(_builder, _word); } - static llvm::Value* toNative(llvm::IRBuilder<>& _builder, llvm::Value* _word) { return bswap(_builder, _word); } - -#elif defined(BOOST_BIG_ENDIAN) - static llvm::Value* toBE(llvm::IRBuilder<>&, llvm::Value* _word) { return _word; } - static llvm::Value* toNative(llvm::IRBuilder<>&, llvm::Value* _word) { return _word; } - -#endif // Add support for PDP endianness if needed + static llvm::Value* toBE(llvm::IRBuilder<>& _builder, llvm::Value* _word) { return bswapIfLE(_builder, _word); } + static llvm::Value* toNative(llvm::IRBuilder<>& _builder, llvm::Value* _word) { return bswapIfLE(_builder, _word); } private: - static llvm::Value* bswap(llvm::IRBuilder<>& _builder, llvm::Value* _word); + static llvm::Value* bswapIfLE(llvm::IRBuilder<>& _builder, llvm::Value* _word); }; }