return value;
}
- Value *Nucleus::createGEP(Value *ptr, Type *type, Value *index)
+ Value *Nucleus::createGEP(Value *ptr, Type *type, Value *index, bool unsignedIndex)
{
+ if(unsignedIndex && sizeof(void*) == 8)
+ {
+ index = createZExt(index, Long::getType());
+ }
+
assert(ptr->getType()->getContainedType(0) == type);
return V(::builder->CreateGEP(ptr, index));
}
RValue<Pointer<Byte>> operator+(RValue<Pointer<Byte>> lhs, int offset)
{
- return RValue<Pointer<Byte>>(Nucleus::createGEP(lhs.value, Byte::getType(), V(Nucleus::createConstantInt(offset))));
+ return RValue<Pointer<Byte>>(Nucleus::createGEP(lhs.value, Byte::getType(), V(Nucleus::createConstantInt(offset)), false));
}
RValue<Pointer<Byte>> operator+(RValue<Pointer<Byte>> lhs, RValue<Int> offset)
{
- return RValue<Pointer<Byte>>(Nucleus::createGEP(lhs.value, Byte::getType(), offset.value));
+ return RValue<Pointer<Byte>>(Nucleus::createGEP(lhs.value, Byte::getType(), offset.value, false));
}
RValue<Pointer<Byte>> operator+(RValue<Pointer<Byte>> lhs, RValue<UInt> offset)
{
- return RValue<Pointer<Byte>>(Nucleus::createGEP(lhs.value, Byte::getType(), offset.value));
+ return RValue<Pointer<Byte>>(Nucleus::createGEP(lhs.value, Byte::getType(), offset.value, true));
}
RValue<Pointer<Byte>> operator+=(Pointer<Byte> &lhs, int offset)
Value *loadValue(unsigned int alignment = 0) const;
Value *storeValue(Value *value, unsigned int alignment = 0) const;
- Value *getAddress(Value *index) const;
+ Value *getAddress(Value *index, bool unsignedIndex) const;
};
template<class T>
Reference<T> operator*();
Reference<T> operator[](int index);
+ Reference<T> operator[](unsigned int index);
Reference<T> operator[](RValue<Int> index);
+ Reference<T> operator[](RValue<UInt> index);
static Type *getType();
Array(int size = S);
Reference<T> operator[](int index);
+ Reference<T> operator[](unsigned int index);
Reference<T> operator[](RValue<Int> index);
+ Reference<T> operator[](RValue<UInt> index);
};
// RValue<Array<T>> operator++(Array<T> &val, int); // Post-increment
}
template<class T>
- Value *LValue<T>::getAddress(Value *index) const
+ Value *LValue<T>::getAddress(Value *index, bool unsignedIndex) const
{
- return Nucleus::createGEP(address, T::getType(), index);
+ return Nucleus::createGEP(address, T::getType(), index, unsignedIndex);
}
template<class T>
template<class T>
Reference<T> Pointer<T>::operator[](int index)
{
- Value *element = Nucleus::createGEP(LValue<Pointer<T>>::loadValue(), T::getType(), Nucleus::createConstantInt(index));
+ Value *element = Nucleus::createGEP(LValue<Pointer<T>>::loadValue(), T::getType(), Nucleus::createConstantInt(index), false);
+
+ return Reference<T>(element, alignment);
+ }
+
+ template<class T>
+ Reference<T> Pointer<T>::operator[](unsigned int index)
+ {
+ Value *element = Nucleus::createGEP(LValue<Pointer<T>>::loadValue(), T::getType(), Nucleus::createConstantInt(index), true);
return Reference<T>(element, alignment);
}
template<class T>
Reference<T> Pointer<T>::operator[](RValue<Int> index)
{
- Value *element = Nucleus::createGEP(LValue<Pointer<T>>::loadValue(), T::getType(), index.value);
+ Value *element = Nucleus::createGEP(LValue<Pointer<T>>::loadValue(), T::getType(), index.value, false);
+
+ return Reference<T>(element, alignment);
+ }
+
+ template<class T>
+ Reference<T> Pointer<T>::operator[](RValue<UInt> index)
+ {
+ Value *element = Nucleus::createGEP(LValue<Pointer<T>>::loadValue(), T::getType(), index.value, true);
return Reference<T>(element, alignment);
}
template<class T, int S>
Reference<T> Array<T, S>::operator[](int index)
{
- Value *element = LValue<T>::getAddress(Nucleus::createConstantInt(index));
+ Value *element = LValue<T>::getAddress(Nucleus::createConstantInt(index), false);
+
+ return Reference<T>(element);
+ }
+
+ template<class T, int S>
+ Reference<T> Array<T, S>::operator[](unsigned int index)
+ {
+ Value *element = LValue<T>::getAddress(Nucleus::createConstantInt(index), true);
return Reference<T>(element);
}
template<class T, int S>
Reference<T> Array<T, S>::operator[](RValue<Int> index)
{
- Value *element = LValue<T>::getAddress(index.value);
+ Value *element = LValue<T>::getAddress(index.value, false);
+
+ return Reference<T>(element);
+ }
+
+ template<class T, int S>
+ Reference<T> Array<T, S>::operator[](RValue<UInt> index)
+ {
+ Value *element = LValue<T>::getAddress(index.value, true);
return Reference<T>(element);
}
return value;
}
- Value *Nucleus::createGEP(Value *ptr, Type *type, Value *index)
+ Value *Nucleus::createGEP(Value *ptr, Type *type, Value *index, bool unsignedIndex)
{
assert(index->getType() == Ice::IceType_i32);
if(sizeof(void*) == 8)
{
- index = createSExt(index, T(Ice::IceType_i64));
+ if(unsignedIndex)
+ {
+ index = createZExt(index, T(Ice::IceType_i64));
+ }
+ else
+ {
+ index = createSExt(index, T(Ice::IceType_i64));
+ }
}
return createAdd(ptr, index);
RValue<Pointer<Byte>> operator+(RValue<Pointer<Byte>> lhs, RValue<Int> offset)
{
- return RValue<Pointer<Byte>>(Nucleus::createGEP(lhs.value, Byte::getType(), offset.value));
+ return RValue<Pointer<Byte>>(Nucleus::createGEP(lhs.value, Byte::getType(), offset.value, false));
}
RValue<Pointer<Byte>> operator+(RValue<Pointer<Byte>> lhs, RValue<UInt> offset)
{
- return RValue<Pointer<Byte>>(Nucleus::createGEP(lhs.value, Byte::getType(), offset.value));
+ return RValue<Pointer<Byte>>(Nucleus::createGEP(lhs.value, Byte::getType(), offset.value, true));
}
RValue<Pointer<Byte>> operator+=(Pointer<Byte> &lhs, int offset)