return V(::builder->CreateXor(lhs, rhs));
}
+ Value *Nucleus::createAssign(Constant *constant)
+ {
+ return V(constant);
+ }
+
Value *Nucleus::createNeg(Value *v)
{
return V(::builder->CreateNeg(v));
Value *Nucleus::createStore(Value *value, Value *ptr, bool isVolatile, unsigned int align)
{
- return V(::builder->Insert(new StoreInst(value, ptr, isVolatile, align)));
+ ::builder->Insert(new StoreInst(value, ptr, isVolatile, align));
+ return value;
}
- Value *Nucleus::createStore(Constant *constant, Value *ptr, bool isVolatile, unsigned int align)
+ Constant *Nucleus::createStore(Constant *constant, Value *ptr, bool isVolatile, unsigned int align)
{
- return V(::builder->Insert(new StoreInst(constant, ptr, isVolatile, align)));
+ ::builder->Insert(new StoreInst(constant, ptr, isVolatile, align));
+ return constant;
}
Value *Nucleus::createGEP(Value *ptr, Value *index)
Pointer<Int> p = function.Arg<0>();
Int x = *p;
Int y = function.Arg<1>();
-
- Int sum = x + y;
+ Int z = 4;
+
+ Int sum = x + y + z;
Return(sum);
}
int (*add)(int*, int) = (int(*)(int*,int))routine->getEntry();
int one = 1;
int result = add(&one, 2);
- assert(result == 3);
+ assert(result == 7);
}
}
static Value *createAnd(Value *lhs, Value *rhs);
static Value *createOr(Value *lhs, Value *rhs);
static Value *createXor(Value *lhs, Value *rhs);
+
+ // Unary operators
+ static Value *createAssign(Constant *c);
static Value *createNeg(Value *V);
static Value *createFNeg(Value *V);
static Value *createNot(Value *V);
// Memory instructions
static Value *createLoad(Value *ptr, Type *type, bool isVolatile = false, unsigned int align = 0);
static Value *createStore(Value *value, Value *ptr, bool isVolatile = false, unsigned int align = 0);
- static Value *createStore(Constant *constant, Value *ptr, bool isVolatile = false, unsigned int align = 0);
+ static Constant *createStore(Constant *constant, Value *ptr, bool isVolatile = false, unsigned int align = 0);
static Value *createGEP(Value *ptr, Value *index);
// Atomic instructions
Value *loadValue(unsigned int alignment = 0) const;
Value *storeValue(Value *value, unsigned int alignment = 0) const;
- Value *storeValue(Constant *constant, unsigned int alignment = 0) const;
+ Constant *storeValue(Constant *constant, unsigned int alignment = 0) const;
Value *getAddress(Value *index) const;
protected:
{
public:
explicit RValue(Value *rvalue);
+ explicit RValue(Constant *constant);
RValue(const T &lvalue);
RValue(typename IntLiteral<T>::type i);
}
template<class T>
- Value *LValue<T>::storeValue(Constant *constant, unsigned int alignment) const
+ Constant *LValue<T>::storeValue(Constant *constant, unsigned int alignment) const
{
return Nucleus::createStore(constant, address, false, alignment);
}
}
template<class T>
+ RValue<T>::RValue(Constant *constant)
+ {
+ value = Nucleus::createAssign(constant);
+ }
+
+ template<class T>
RValue<T>::RValue(const T &lvalue)
{
value = lvalue.loadValue();
namespace sw
{
class Value : public Ice::Variable {};
+ class Constant : public Ice::Constant {};
class BasicBlock : public Ice::CfgNode {};
Ice::Type T(Type *t)
return reinterpret_cast<Value*>(v);
}
+ Constant *C(Ice::Constant *c)
+ {
+ return reinterpret_cast<Constant*>(c);
+ }
+
Optimization optimization[10] = {InstructionCombining, Disabled};
void *loadImage(uint8_t *const elfImage)
assert(false && "UNIMPLEMENTED"); return nullptr;
}
+ Value *Nucleus::createAssign(Constant *constant)
+ {
+ Ice::Variable *value = ::function->makeVariable(constant->getType());
+ auto assign = Ice::InstAssign::create(::function, value, constant);
+ ::basicBlock->appendInst(assign);
+
+ return V(value);
+ }
+
Value *Nucleus::createNeg(Value *v)
{
assert(false && "UNIMPLEMENTED"); return nullptr;
return value;
}
- Value *Nucleus::createStore(Constant *constant, Value *ptr, bool isVolatile, unsigned int align)
+ Constant *Nucleus::createStore(Constant *constant, Value *ptr, bool isVolatile, unsigned int align)
{
- assert(false && "UNIMPLEMENTED"); return nullptr;
+ auto store = Ice::InstStore::create(::function, constant, ptr, align);
+ ::basicBlock->appendInst(store);
+ return constant;
}
Value *Nucleus::createGEP(Value *ptr, Value *index)
Constant *Nucleus::createConstantInt(int i)
{
- assert(false && "UNIMPLEMENTED"); return nullptr;
+ return C(::context->getConstantInt32(i));
}
Constant *Nucleus::createConstantInt(unsigned int i)