U0 OptPass5(CCompCtrl *cc)
{
	CIntermediateCode	*tmpi, *tmpi1;
	I64					 code, i;
	CParseStack			*ps = cc->ps;

	ps->ptr = 0;
	ps->ptr2 = 0;

	tmpi = cc->coc.coc_head.next;
	while (code = tmpi->ic_code)
	{
		if (code >IC_NOP2)
		{
			if (tmpi->ic_flags&ICF_PASS_TRACE) {
				if (Bt(&cc->saved_pass_trace, 5))
				{
					"%2d:", ps->ptr;
					ICPut(cc, tmpi);
				}
			}
			if (intermediate_code_table[code].arg_count == IS_V_ARG)
				ps->ptr -= tmpi->ic_data >> 3;
			if (code == IC_PUSH_REGS)
			{
				for (i = 0; i < REG_REGS_NUM; i++)
					if (Bt(&tmpi->ic_data, i))
						ps->ptr++;
			}
			else if (code == IC_POP_REGS)
			{
				for (i = 0; i < REG_REGS_NUM; i++)
					if (Bt(&tmpi->ic_data, i))
						ps->ptr--;
			}
			if (tmpi->arg2.type & MDF_STACK)
			{
				tmpi1 = ParsePop(ps);
				if (tmpi1->ic_code == IC_MOV || tmpi1->ic_code == IC_REG)
				{
					if (tmpi1->ic_flags & ICF_RES_TO_INT)
					{
						if (tmpi1->arg1.type & MDF_IMM)
							tmpi1->arg1.disp = tmpi1->arg1.disp(F64);
						else
							tmpi->ic_flags |= ICF_ARG2_TO_INT;
					}
					else if (tmpi1->ic_flags & ICF_RES_TO_F64)
					{
						if (tmpi1->arg1.type & MDF_IMM)
							tmpi1->arg1.disp(F64) = tmpi1->arg1.disp;
						else
							tmpi->ic_flags |= ICF_ARG2_TO_F64;
					}
					tmpi->arg2.type = tmpi1->arg1.type & MDG_MASK +
								MinI64(tmpi->arg2.type.raw_type, MinI64(tmpi1->res.type.raw_type, tmpi1->arg1.type.raw_type));
					tmpi->arg2.reg = tmpi1->arg1.reg;
					tmpi->arg2.disp = tmpi1->arg1.disp;
					tmpi->ic_flags |= tmpi1->ic_flags & ICG_NO_CONVERT_MASK;
					OptSetNOP2(tmpi1);
				}
			}

			if (tmpi->arg1.type & MDF_STACK)
			{
				tmpi1 = ParsePop(ps);
				if (tmpi1->ic_code == IC_MOV || tmpi1->ic_code == IC_REG)
				{
					if (tmpi1->ic_flags & ICF_RES_TO_INT)
					{
						if (tmpi1->arg1.type & MDF_IMM)
							tmpi1->arg1.disp = tmpi1->arg1.disp(F64);
						else
							tmpi->ic_flags |= ICF_ARG1_TO_INT;
					}
					else if (tmpi1->ic_flags & ICF_RES_TO_F64)
					{
						if (tmpi1->arg1.type & MDF_IMM)
						{
							if (tmpi1->arg1.type & RTF_UNSIGNED)
								tmpi1->arg1.disp(F64) = tmpi1->arg1.disp(U64);
							else
								tmpi1->arg1.disp(F64) = tmpi1->arg1.disp(I64);
						}
						else
							tmpi->ic_flags |= ICF_ARG1_TO_F64;
					}
					tmpi->arg1.type = tmpi1->arg1.type & MDG_MASK +
								MinI64(tmpi->arg1.type.raw_type, MinI64(tmpi1->res.type.raw_type, tmpi1->arg1.type.raw_type));
					CompMinTypePointed(tmpi, tmpi1->arg1_type_pointed_to);
					tmpi->arg1.reg = tmpi1->arg1.reg;
					tmpi->arg1.disp = tmpi1->arg1.disp;
					tmpi->ic_flags |= tmpi1->ic_flags & ICG_NO_CONVERT_MASK;
					OptSetNOP2(tmpi1);
				}
			}
			if (tmpi->res.type & MDF_STACK && !(tmpi->ic_flags & ICF_RES_NOT_USED))
				ParsePush(ps, tmpi);
		}
		tmpi = tmpi->next;
	}
	if (ps->ptr > 2)
	{
		"Pass:%d Stack:%08X\n", cc->pass, ps->ptr;
		LexExcept(cc, "Compiler Optimization Error at ");
	}
}
