Click here to Skip to main content
15,891,431 members
Articles / High Performance Computing / Vectorization

Bird Programming Language: Part 1

Rate me:
Please Sign up or sign in to vote.
4.92/5 (129 votes)
1 Jan 2013GPL312 min read 381.4K   2.7K   153  
A new general purpose language that aims to be fast, high level and simple to use.
MISZ\BmxLibs.txt MISZ\Squares\Squares.txt MISZ\Squares.s


		public bool MembersAssigned(Variable Var, Identifier Member)
		{
#if DEBUG
			var Type = Var.Type as StructuredType;
			if (Type == null || !Type.Members.Contains(Member))
				throw new Exception("ERROR");
#endif
			foreach (var e in AllAssignments)
			{
				var OpNode = e as OpExpressionNode;
				if (OpNode == null || OpNode.Operator != Operator.Member) continue;
				var Ch = OpNode.Children;

				var IdCh0 = Ch[0] as IdExpressionNode;
				var IdCh1 = Ch[1] as IdExpressionNode;
				if (IdCh0 != null && IdCh1 != null && IdCh0.Id == Var && IdCh1.Id == Member)
					return true;
			}

			return false;
		}

		public bool MembersAssigned(Variable Var, CompilerState State = null)
		{
			var Type = Var.Type as StructuredType;
			if (Type == null) throw new Exception("ERROR");

			var RetValue = true;
			foreach (var e in Type.Members)
				if (!MembersAssigned(Var, e))
				{
					if (State != null)
						State.Messages.Add(MessageId.VarUsingWoAssign, e.Name);

					RetValue = false;
				}

			return RetValue;
		}



		private void CalcRec(ExpressionNode Node)
		{
			var Data = Node.ArchData as x86NodeData;
			var Scope = Data.Scope;
			var Index = Data.Index;

			if (Data.NewScope)
			{
				foreach (var Pos in Scope.DataPositions.Values)
					if (!Pos.DataCalcPos.HasFlag(x86DataCalcPos.Memory))
						Scope.AlloArchData(Pos);
			}

			//------------------------------------------------------------
			if (Node.LinkedNodes != null)
			{
                var Allocator = new x86DataAllocator(Container);
                Allocator.SetUsed(Scope.Allocator);

                for (var i = Node.LinkedNodes.Count - 1; i >= 0; i--)
                {
                    var LNode = Node.LinkedNodes[i];
					var LData = LNode.ArchData as x86LinkedNodeData;
					
                    var Linked = LNode.Node;
                    var LinkedData = Linked.ArchData as x86NodeData;
					var LScope = LinkedData.Scope;

					if (LData.Specified != null)
                    {
						LData.Position = LData.Specified;
						Allocator.SetUsed(LData.Specified);
                    }
                    else
                    {
                        if (LinkedData.Output != null && Allocator.IsFree(LinkedData.Output))
                        {
                            Allocator.SetUsed(LinkedData.Output);
							LData.Position = LinkedData.Output;
                        }
                        else
                        {
                            LData.Position = Allocator.Alloc(Linked.Type);
                        }

                        Scope.SetUsed(LData.Position);
                    }

                    LNode.Node.GetUsed(Allocator);
                }
			}

            if (Index != -1) Data.Output = Scope.AlloArchData(Index, Node.Type.Size, false);
			foreach (var Ch in Node.EnumChildren)
				CalcRec(Ch);
		}




class List<T>
	T[] Data
	int Count

	void Add(T Obj)
		Count++
		if Data.Length < Count
			Data.Length *= 2

		Data[Count - 1] = Obj

	void RemoveLast()
		Count--

	T this[int Index]
		if Index < Count
			throw new Exception

		getset Data[Index]


typedef float2 {float x, y}
typedef int2 {int, int}

bool Ok(float2 a, b)
	return -0.5 < a.x - b.x < 0.5 and
		   -0.5 < a.y - b.y < 0.5

bool Ok(float2 a, b)
	return |a.x - b.x| < 0.5 and
		   |a.y - b.y| < 0.5

bool Ok(float2 a, b)
	return abs(a.x - b.x) < 0.5 and
		   abs(a.y - b.y) < 0.5

{int, int} Mul({int, int} a, b)
	return {a.0 * b.0, a.1 * b.1}

Mul({int, int} a, b, out)
	return {a.0 * b.0, a.1 * b.1}
	
int2 Mul(int2 a, b)
	return {a.0 * b.0, a.1 * b.1}

private (string out) GetCmpCode(x86DataPosition TmpReg, Dst, Src, Operator Instruction, Type Type)
	if Type is FloatType
		if Dst == null then CodeString.Append "\tfucompp\n"
		else CodeString.Append "\tfucomp " + Dst + "\n"
		CodeString.Append "\tfnstsw ax\n"
		CodeString.Append "\tsahf\n"
		out = x86Architecture.OpInstruction(Instruction, false)
	else
		out = x86Architecture.OpInstruction(Instruction, Type is SignedType)
		StdMem2MemOp "\tcmp ", Dst, Src, TmpReg

private string GetCmpCode(x86DataPosition TmpReg, x86DataPosition Dst, x86DataPosition Src,
	Operator Instruction, Type Type)
{
	string StrInstruction;
	if (Type is FloatType)
	{
		if (Dst == null) CodeString.Append("\tfucompp\n");
		else CodeString.Append("\tfucomp " + Dst + "\n");
		CodeString.Append("\tfnstsw ax\n");
		CodeString.Append("\tsahf\n");
		StrInstruction = x86Architecture.OpInstruction(Instruction, false);
	}
	else
	{
		StrInstruction = x86Architecture.OpInstruction(Instruction, Type is SignedType);
		StdMem2MemOp("\tcmp ", Dst, Src, TmpReg);
	}

	return StrInstruction;
}

private string GetCmpCode(List<ExpressionNode> Ch, Operator Op, x86DataPosition TmpReg)
{
	CalcFltNodes(Ch);
	var Type = Ch[0].Type;

	var Dst = GetNodePos(Ch[0], GetNodePosMode.Default);
	var Src = GetNodePos(Ch[1], GetNodePosMode.Default);
}
		 
public x86DataPosition GetNodePos_Float(ExpressionNode Node)
{
	CalcFltNode(Node);
	return Node.GetPosition();
}


public class PlugInManager
{
	public IdContainer Container;
	public Type RetType;

	public CompilerState State { get { return Container.State; } }
	public PreprocessorState PreState { get { return Container.PreState; } }
	public virtual bool AutoNot { get { return false; } }

	public PlugInManager(IdContainer Container)
	{
		this.Container = Container;
	}
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The GNU General Public License (GPLv3)


Written By
Software Developer
Hungary Hungary
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions