U0 AOTStoreCodeU8(CCompCtrl *cc, U8 b)
{
	CAOTCtrl	*aotc = cc->aotc;
	I64			 i = aotc->rip >> AOT_BIN_BLK_BITS;
	CAOTBinBlk	*tmpbin = aotc->bin;

	while (i--)
		if (!(tmpbin = tmpbin->next))
		{
			i = aotc->rip >> AOT_BIN_BLK_BITS + 1;
			tmpbin = &aotc->bin;
			while (i--)
			{
				if (!tmpbin->next)
					tmpbin->next = CAlloc(sizeof(CAOTBinBlk));
				tmpbin = tmpbin->next;
			}
			break;
		}
	tmpbin->body[aotc->rip++ & (AOT_BIN_BLK_SIZE - 1)] = b;
	if (aotc->list)
	{
		if (aotc->list_col >= 24)
		{
			'\n';
			aotc->list_col = 0;
		}
		"%02X ", b;
		aotc->list_col += 3;
	}
	if (aotc->rip>aotc->num_bin_U8s)
		aotc->num_bin_U8s = aotc->rip;
}

U0 AOTStoreCodeU32(CCompCtrl *cc, U32 d)
{
	CAOTCtrl	*aotc = cc->aotc;
	I64			 i = aotc->rip >> AOT_BIN_BLK_BITS, j = (aotc->rip + sizeof(U32)) >> AOT_BIN_BLK_BITS;
	U32			*_d;
	CAOTBinBlk	*tmpbin;

	if (i != j)
		for (i = 0; i < sizeof(U32); i++)
			AOTStoreCodeU8(cc, d.u8[i]);
	else
	{
		tmpbin = aotc->bin;
		while (i--)
			if (!(tmpbin = tmpbin->next))
			{
				i = aotc->rip >> AOT_BIN_BLK_BITS + 1;
				tmpbin = &aotc->bin;
				while (i--)
				{
					if (!tmpbin->next)
						tmpbin->next = CAlloc(sizeof(CAOTBinBlk));
					tmpbin = tmpbin->next;
				}
				break;
			}
		_d = tmpbin->body + aotc->rip & (AOT_BIN_BLK_SIZE - 1);
		*_d = d;
		aotc->rip += sizeof(U32);
		if (aotc->list)
		{
			if (aotc->list_col >= 24)
			{
				'\n';
				aotc->list_col = 0;
			}
			"%08X ", d;
			aotc->list_col += 9;
		}
		if (aotc->rip>aotc->num_bin_U8s)
			aotc->num_bin_U8s = aotc->rip;
	}
}

U0 AOTStoreCodeU64(CCompCtrl *cc, U64 q)
{
	CAOTCtrl	*aotc = cc->aotc;
	I64			 i = aotc->rip >> AOT_BIN_BLK_BITS, j = (aotc->rip + sizeof(I64)) >> AOT_BIN_BLK_BITS, *_q;
	CAOTBinBlk	*tmpbin;

	if (i != j)
		for (i = 0; i < sizeof(I64); i++)
			AOTStoreCodeU8(cc, q.u8[i]);
	else
	{
		tmpbin = aotc->bin;
		while (i--)
			if (!(tmpbin = tmpbin->next))
			{
				i = aotc->rip >> AOT_BIN_BLK_BITS + 1;
				tmpbin = &aotc->bin;
				while (i--)
				{
					if (!tmpbin->next)
						tmpbin->next = CAlloc(sizeof(CAOTBinBlk));
					tmpbin = tmpbin->next;
				}
				break;
			}
		_q = tmpbin->body + aotc->rip & (AOT_BIN_BLK_SIZE - 1);
		*_q = q;
		aotc->rip += sizeof(I64);
		if (aotc->list)
		{
			if (aotc->list_col >= 24)
			{
				'\n';
				aotc->list_col = 0;
			}
			"%016X ", q;
			aotc->list_col += 17;
		}
		if (aotc->rip>aotc->num_bin_U8s)
			aotc->num_bin_U8s = aotc->rip;
	}
}

U0 AOTStoreCodeU8At(CCompCtrl *cc, I64 rip, ...)
{
	CAOTCtrl	*aotc = cc->aotc;
	CAOTBinBlk	*tmpbin;
	I64			 i, j;

	for (j = 0; j < argc; j++)
	{
		i = rip >> AOT_BIN_BLK_BITS + 1;
		tmpbin = &aotc->bin;
		while (i--)
		{
			if (!tmpbin->next)
			{
				tmpbin->next = CAlloc(sizeof(CAOTBinBlk));
				tmpbin->next->next = NULL;
			}
			tmpbin = tmpbin->next;
		}
		tmpbin->body[rip++ & (AOT_BIN_BLK_SIZE - 1)] = argv[j];
	}
	if (rip > aotc->num_bin_U8s)
		aotc->num_bin_U8s = rip;
}

I64 AsmLexExpression(CCompCtrl *cc)
{
	U8 *machine_code;
	I64 res = 0;

	cc->asm_undef_hash = NULL;
	cc->flags &= ~(CCF_UNRESOLVED + CCF_LOCAL);
	cc->abs_counts = 0;
	if (!IsLexExpression2Bin(cc, &machine_code))
		LexSkipEol(cc);
	else
	{
		if (cc->abs_counts.externs)
			LexExcept(cc, "Extern Not Allowed at ");
		if (cc->flags & CCF_UNRESOLVED)
			LexExcept(cc, "Undefined sym at ");
		res = Call(machine_code);
		Free(machine_code);
	}
	return res;
}

U0 AsmLineList(CCompCtrl *cc)
{
	CAOTCtrl	*aotc = cc->aotc;
	CLexFile	*tmpf = cc->lex_include_stack;
	CDocEntry	*doc_e = tmpf->line_start, *doc_e2;

	if (aotc->list && aotc->list_last_lfn == tmpf && doc_e)
	{
		if (doc_e2 = aotc->list_last_line)
		{
			if (tmpf->flags & LFSF_DOC)
			{
				while (doc_e2->y < doc_e->y)
				{
					"%h*c%08X ", 24 - aotc->list_col, CH_SPACE, aotc->list_last_rip;
					aotc->list_col = 0;
					doc_e2 = LexPutLine(cc, doc_e2);
				}
			}
			else
			{
				while (*doc_e2(U8 *) && doc_e2 != doc_e)
				{
					"%h*c%08X ", 24 - aotc->list_col, CH_SPACE, aotc->list_last_rip;
					aotc->list_col = 0;
					doc_e2 = LexPutLine(cc,doc_e2);
				}
			}
			aotc->list_last_line = doc_e2;
		}
		else
			aotc->list_last_line = doc_e;
	}
	else
	{
		aotc->list_last_line = NULL;
		aotc->list_last_lfn = tmpf;
	}
	aotc->list_last_rip = aotc->rip;
}
