Implement Reactor pointer subscript operator. Change-Id: I8f4604a0cd81f004d46172d286286722b6198dd5 Reviewed-on: https://swiftshader-review.googlesource.com/5700 Reviewed-by: Alexis Hétu <sugoi@google.com> Reviewed-by: Nicolas Capens <capn@google.com> Tested-by: Nicolas Capens <capn@google.com>
diff --git a/docs/Reactor.md b/docs/Reactor.md index cbeec68..263c1bf 100644 --- a/docs/Reactor.md +++ b/docs/Reactor.md
@@ -216,9 +216,7 @@ For(Int i = 0, i < n, i++) { - total += *p; - - p = Pointer<Int>(Pointer<Byte>(p) + sizeof(int)); + total += p[i]; } Return(total); @@ -245,22 +243,20 @@ { if(state.operation == ADD) { - total += *p; + total += p[i]; } else if(state.operation == SUBTRACT) { - total -= *p; + total -= p[i]; } else if(state.operation == AND) { - total &= *p; + total &= p[i]; } else if(...) { ... } - - p = Pointer<Int>(Pointer<Byte>(p) + sizeof(int)); } Return(total);
diff --git a/src/Reactor/Nucleus.hpp b/src/Reactor/Nucleus.hpp index 4a2f22d..3aab2d2 100644 --- a/src/Reactor/Nucleus.hpp +++ b/src/Reactor/Nucleus.hpp
@@ -2436,6 +2436,8 @@ RValue<Pointer<T>> operator=(const Reference<Pointer<T>> &rhs) const; Reference<T> operator*(); + Reference<T> operator[](int index); + Reference<T> operator[](RValue<Int> index); static llvm::Type *getType(); @@ -2465,7 +2467,6 @@ Reference<T> operator[](int index); Reference<T> operator[](RValue<Int> index); - Reference<T> operator[](RValue<UInt> index); }; // RValue<Array<T>> operator++(const Array<T> &val, int); // Post-increment @@ -2857,6 +2858,22 @@ } template<class T> + Reference<T> Pointer<T>::operator[](int index) + { + llvm::Value *element = Nucleus::createGEP(LValue::loadValue(), (llvm::Value*)Nucleus::createConstantInt(index)); + + return Reference<T>(element, alignment); + } + + template<class T> + Reference<T> Pointer<T>::operator[](RValue<Int> index) + { + llvm::Value *element = Nucleus::createGEP(LValue::loadValue(), index.value); + + return Reference<T>(element, alignment); + } + + template<class T> llvm::Type *Pointer<T>::getType() { return Nucleus::getPointerType(T::getType()); @@ -2883,14 +2900,6 @@ return Reference<T>(element); } - template<class T, int S> - Reference<T> Array<T, S>::operator[](RValue<UInt> index) - { - llvm::Value *element = LValue::getAddress(index.value); - - return Reference<T>(element); - } - // template<class T> // RValue<Array<T>> operator++(const Array<T> &val, int) // {