view dmd/UnrolledLoopStatement.d @ 114:e28b18c23469

added a module dmd.common for commonly used stuff it currently holds code for consistency checking of predefined versions also added a VisualD project file
author Trass3r
date Wed, 01 Sep 2010 18:21:58 +0200
parents 2e2a5c3f943a
children c77e9f4f1793
line wrap: on
line source

module dmd.UnrolledLoopStatement;

import dmd.common;
import dmd.Expression;
import dmd.Statement;
import dmd.InterState;
import dmd.ArrayTypes;
import dmd.OutBuffer;
import dmd.Loc;
import dmd.Scope;
import dmd.InlineCostState;
import dmd.InlineDoState;
import dmd.IRState;
import dmd.HdrGenState;
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;

	this(Loc loc, Statements s)
	{
		super(loc);
		statements = s;
	}

	override Statement syntaxCopy()
	{
		assert(false);
	}

	override Statement semantic(Scope sc)
	{
		//printf("UnrolledLoopStatement.semantic(this = %p, sc = %p)\n", this, sc);

		sc.noctor++;
		Scope scd = sc.push();
		scd.sbreak = this;
		scd.scontinue = this;

		for (size_t i = 0; i < statements.dim; i++)
		{
			Statement s = cast(Statement) statements.data[i];
			if (s)
			{
				s = s.semantic(scd);
				statements.data[i] = cast(void*)s;
			}
		}

		scd.pop();
		sc.noctor--;
		return this;
	}

	override bool hasBreak()
	{
		assert(false);
	}

	override bool hasContinue()
	{
		assert(false);
	}

	override bool usesEH()
	{
		assert(false);
	}

	override BE blockExit()
	{
		BE result = BEfallthru;
		for (size_t i = 0; i < statements.dim; i++)
		{	
			Statement s = cast(Statement) statements.data[i];
			if (s)
			{
				int r = s.blockExit();
				result |= r & ~(BEbreak | BEcontinue);
			}
		}
		return result;
	}

	override bool comeFrom()
	{
		assert(false);
	}

	override Expression interpret(InterState istate)
	{
		assert(false);
	}

	override void toCBuffer(OutBuffer buf, HdrGenState* hgs)
	{
		assert(false);
	}

	override int inlineCost(InlineCostState* ics)
	{
		assert(false);
	}

	override Expression doInline(InlineDoState ids)
	{
		assert(false);
	}

	override Statement inlineScan(InlineScanState* iss)
	{
		assert(false);
	}

	override void toIR(IRState* irs)
	{
		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);
	}
}