Mercurial > projects > ddmd
diff dmd/UnrolledLoopStatement.d @ 67:f708f0452e81
some of the backend/codegen stuff implemented
author | korDen |
---|---|
date | Mon, 23 Aug 2010 21:21:05 +0400 |
parents | cab4c37afb89 |
children | 2e2a5c3f943a |
line wrap: on
line diff
--- a/dmd/UnrolledLoopStatement.d Mon Aug 23 20:38:30 2010 +0400 +++ b/dmd/UnrolledLoopStatement.d Mon Aug 23 21:21:05 2010 +0400 @@ -14,6 +14,11 @@ import dmd.InlineScanState; import dmd.BE; +import dmd.backend.BC; +import dmd.backend.Blockx; +import dmd.backend.block; +import dmd.backend.Util; + class UnrolledLoopStatement : Statement { Statements statements; @@ -115,7 +120,38 @@ void toIR(IRState* irs) { - assert(false); + Blockx* blx = irs.blx; + + IRState mystate = IRState(irs, this); + mystate.breakBlock = block_calloc(blx); + + block* bpre = blx.curblock; + block_next(blx, BCgoto, null); + + block* bdo = blx.curblock; + list_append(&bpre.Bsucc, bdo); + + block* bdox; + + size_t dim = statements.dim; + for (size_t i = 0 ; i < dim ; i++) + { + Statement s = cast(Statement)statements.data[i]; + if (s !is null) + { + mystate.contBlock = block_calloc(blx); + + s.toIR(&mystate); + + bdox = blx.curblock; + block_next(blx, BCgoto, mystate.contBlock); + list_append(&bdox.Bsucc, mystate.contBlock); + } + } + + bdox = blx.curblock; + block_next(blx, BCgoto, mystate.breakBlock); + list_append(&bdox.Bsucc, mystate.breakBlock); } }