#pragma once

#include "CompilerHelper.h"

namespace dev
{
namespace eth
{
namespace jit
{

class Arith256 : public CompilerHelper
{
public:
	Arith256(llvm::IRBuilder<>& _builder);

	llvm::Value* exp(llvm::Value* _arg1, llvm::Value* _arg2);

	void debug(llvm::Value* _value, char _c);

	static llvm::Function* getMulFunc(llvm::Module& _module);
	static llvm::Function* getMul512Func(llvm::Module& _module);
	static llvm::Function* getUDiv256Func(llvm::Module& _module);
	static llvm::Function* getURem256Func(llvm::Module& _module);
	static llvm::Function* getURem512Func(llvm::Module& _module);
	static llvm::Function* getUDivRem256Func(llvm::Module& _module);
	static llvm::Function* getSDiv256Func(llvm::Module& _module);
	static llvm::Function* getSRem256Func(llvm::Module& _module);
	static llvm::Function* getSDivRem256Func(llvm::Module& _module);
	static llvm::Function* getUDivRem512Func(llvm::Module& _module);

private:
	llvm::Function* getExpFunc();

	llvm::Function* m_exp = nullptr;
	llvm::Function* m_debug = nullptr;
};


}
}
}