Endianness.cpp
1 #include "Endianness.h" 2 3 #include "preprocessor/llvm_includes_start.h" 4 #include <llvm/IR/IntrinsicInst.h> 5 #include <llvm/Support/Host.h> 6 #include "preprocessor/llvm_includes_end.h" 7 8 #include "Type.h" 9 10 namespace dev 11 { 12 namespace eth 13 { 14 namespace jit 15 { 16 17 llvm::Value* Endianness::bswapIfLE(IRBuilder& _builder, llvm::Value* _value) 18 { 19 if (llvm::sys::IsLittleEndianHost) 20 { 21 if (auto constant = llvm::dyn_cast<llvm::ConstantInt>(_value)) 22 return _builder.getInt(constant->getValue().byteSwap()); 23 24 // OPT: Cache func declaration? 25 auto bswapFunc = llvm::Intrinsic::getDeclaration(_builder.GetInsertBlock()->getParent()->getParent(), llvm::Intrinsic::bswap, _value->getType()); 26 return _builder.CreateCall(bswapFunc, _value); 27 } 28 return _value; 29 } 30 31 } 32 } 33 }