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);
 	}
 }