/ libevmjit / Endianness.cpp
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  }