Commit 611642a2 by Nicolas Capens

Implement support for For loops.

Bug swiftshader:13 Change-Id: I054d0521ecbb1959c5c19b6fa54f76707f4e49c9 Reviewed-on: https://swiftshader-review.googlesource.com/7358Tested-by: 's avatarNicolas Capens <capn@google.com> Reviewed-by: 's avatarAlexis Hétu <sugoi@google.com> Reviewed-by: 's avatarNicolas Capens <capn@google.com>
parent b955d5b4
...@@ -30,6 +30,11 @@ int main() ...@@ -30,6 +30,11 @@ int main()
Int y = function.Arg<1>(); Int y = function.Arg<1>();
Int z = 4; Int z = 4;
For(Int i = 0, i < 10, i++)
{
z += 2;
}
Int sum = x + y + z; Int sum = x + y + z;
Return(sum); Return(sum);
...@@ -42,7 +47,7 @@ int main() ...@@ -42,7 +47,7 @@ int main()
int (*add)(int*, int) = (int(*)(int*,int))routine->getEntry(); int (*add)(int*, int) = (int(*)(int*,int))routine->getEntry();
int one = 1; int one = 1;
int result = add(&one, 2); int result = add(&one, 2);
assert(result == 7); assert(result == 27);
} }
} }
......
...@@ -76,6 +76,11 @@ namespace sw ...@@ -76,6 +76,11 @@ namespace sw
return reinterpret_cast<Constant*>(c); return reinterpret_cast<Constant*>(c);
} }
BasicBlock *B(Ice::CfgNode *b)
{
return reinterpret_cast<BasicBlock*>(b);
}
Optimization optimization[10] = {InstructionCombining, Disabled}; Optimization optimization[10] = {InstructionCombining, Disabled};
void *loadImage(uint8_t *const elfImage) void *loadImage(uint8_t *const elfImage)
...@@ -273,18 +278,18 @@ namespace sw ...@@ -273,18 +278,18 @@ namespace sw
BasicBlock *Nucleus::createBasicBlock() BasicBlock *Nucleus::createBasicBlock()
{ {
assert(false && "UNIMPLEMENTED"); return nullptr; return B(::function->makeNode());
} }
BasicBlock *Nucleus::getInsertBlock() BasicBlock *Nucleus::getInsertBlock()
{ {
assert(false && "UNIMPLEMENTED"); return nullptr; return B(::basicBlock);
} }
void Nucleus::setInsertBlock(BasicBlock *basicBlock) void Nucleus::setInsertBlock(BasicBlock *basicBlock)
{ {
assert(!basicBlock->getInsts().back().getTerminatorEdges().empty() && "Previous basic block must have a terminator"); assert(::basicBlock->getInsts().back().getTerminatorEdges().size() >= 0 && "Previous basic block must have a terminator");
assert(false && "UNIMPLEMENTED"); return; ::basicBlock = basicBlock;
} }
BasicBlock *Nucleus::getPredecessor(BasicBlock *basicBlock) BasicBlock *Nucleus::getPredecessor(BasicBlock *basicBlock)
...@@ -326,12 +331,14 @@ namespace sw ...@@ -326,12 +331,14 @@ namespace sw
void Nucleus::createBr(BasicBlock *dest) void Nucleus::createBr(BasicBlock *dest)
{ {
assert(false && "UNIMPLEMENTED"); auto br = Ice::InstBr::create(::function, dest);
::basicBlock->appendInst(br);
} }
void Nucleus::createCondBr(Value *cond, BasicBlock *ifTrue, BasicBlock *ifFalse) void Nucleus::createCondBr(Value *cond, BasicBlock *ifTrue, BasicBlock *ifFalse)
{ {
assert(false && "UNIMPLEMENTED"); auto br = Ice::InstBr::create(::function, cond, ifTrue, ifFalse);
::basicBlock->appendInst(br);
} }
Value *Nucleus::createAdd(Value *lhs, Value *rhs) Value *Nucleus::createAdd(Value *lhs, Value *rhs)
...@@ -585,7 +592,13 @@ namespace sw ...@@ -585,7 +592,13 @@ namespace sw
Value *Nucleus::createICmpSLT(Value *lhs, Value *rhs) Value *Nucleus::createICmpSLT(Value *lhs, Value *rhs)
{ {
assert(false && "UNIMPLEMENTED"); return nullptr; assert(lhs->getType() == rhs->getType());
auto result = ::function->makeVariable(Ice::IceType_i1);
auto cmp = Ice::InstIcmp::create(::function, Ice::InstIcmp::Slt, result, lhs, rhs);
::basicBlock->appendInst(cmp);
return V(result);
} }
Value *Nucleus::createICmpSLE(Value *lhs, Value *rhs) Value *Nucleus::createICmpSLE(Value *lhs, Value *rhs)
...@@ -3406,7 +3419,13 @@ namespace sw ...@@ -3406,7 +3419,13 @@ namespace sw
RValue<Int> operator++(const Int &val, int) // Post-increment RValue<Int> operator++(const Int &val, int) // Post-increment
{ {
assert(false && "UNIMPLEMENTED"); return RValue<Int>(V(nullptr)); auto oldValue = val.loadValue();
auto newValue = ::function->makeVariable(Ice::IceType_i32);
auto inc = Ice::InstArithmetic::create(::function, Ice::InstArithmetic::Add, newValue, oldValue, ::context->getConstantInt32(1));
::basicBlock->appendInst(inc);
val.storeValue(V(newValue));
return RValue<Int>(oldValue);
} }
const Int &operator++(const Int &val) // Pre-increment const Int &operator++(const Int &val) // Pre-increment
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment