Пример #1
0
void dailyCheck(void) {
	//calculate sunrise/sunset for the day
	if ((0 < Sunrise_Compute(GetM(), GetDOM(), READ_SUNRISE)) && (0 < Sunrise_Compute(GetM(), GetDOM(), READ_SUNSET))){
//		_DBG("[INFO]-dailyCheck()");_DBG(" (");_DBG(__FILE__);_DBG(":");_DBD16(__LINE__);_DBG(")\r\n");
		uint32_t unix_day = RTC_time_FindUnixtime(GetY(), GetM(), GetDOM(), 0, 0, 0);
		if(dst_correction_needed()){
			time2.sunrise_unix = unix_day + (60 * Sunrise_Compute(GetM(), GetDOM(), READ_SUNRISE)) + DST_CORRECTION_VALUE_SEC;
			time2.sunset_unix = unix_day + (60 * Sunrise_Compute(GetM(), GetDOM(), READ_SUNSET)) + DST_CORRECTION_VALUE_SEC;
			time2.noon_unix = unix_day + (60 * Sunrise_Compute(GetM(), GetDOM(), READ_NOON)) + DST_CORRECTION_VALUE_SEC;
		}else{
			time2.sunrise_unix = unix_day + (60 * Sunrise_Compute(GetM(), GetDOM(), READ_SUNRISE));
			time2.sunset_unix = unix_day + (60 * Sunrise_Compute(GetM(), GetDOM(), READ_SUNSET));
			time2.noon_unix = unix_day + (60 * Sunrise_Compute(GetM(), GetDOM(), READ_NOON));
		}
	} else {
		//TODO but not important - Calculation for if the is no sunrise/set/both
/*		if ((0 > Sunrise_Compute(time2.month, time2.dom, READ_SUNRISE)) && (0 > Sunrise_Compute(time2.month, time2.dom, READ_SUNSET))){

		} else {
			if (0 > Sunrise_Compute(time2.month, time2.dom, READ_SUNRISE)){
				time2.sunrise_unix = time2.unix + (60 * Sunrise_Compute(time2.month, time2.dom, READ_SUNRISE));
				time2.sunset_unix = time2.unix + (24 * 60 * 60);
				time2.no_set_rise = RISE_ONLY;
			}
			if (0 > Sunrise_Compute(time2.month, time2.dom, READ_SUNSET)){
				time2.sunset_unix = time2.unix + (60 * Sunrise_Compute(time2.month, time2.dom, READ_SUNSET));
				time2.sunrise_unix = time2.unix + (24 * 60 * 60);
				time2.no_set_rise = SET_ONLY;
			}
		}*/
	}
}
Пример #2
0
            virtual ST Y(FT x) const
            {
                const size_t i = this->GetIndex(x);
                const FT t = this->GetSubRange(i, x);

                const ST y1 = this->GetY(i);
                const ST y2 = this->GetY(i+1);

                const ST m1 = GetM(i);
                const ST m2 = GetM(i+1);

                return Function::Hermite<ST, FT>(m1, y1, y2, m2, t);
            }
Пример #3
0
u32 MatchDiv32(u32 pc , Sh4RegType &reg1,Sh4RegType &reg2 , Sh4RegType &reg3)
{

	u32 v_pc=pc;
	u32 match=1;
	for (int i=0;i<32;i++)
	{
		u16 opcode=ReadMem16(v_pc);
		v_pc+=2;
		if ((opcode&MASK_N)==ROTCL_KEY)
		{
			if (reg1==NoReg)
				reg1=(Sh4RegType)GetN(opcode);
			else if (reg1!=(Sh4RegType)GetN(opcode))
				break;
			match++;
		}
		else
		{
			//printf("DIV MATCH BROKEN BY: %s\n",OpDesc[opcode]->diss);
			break;
		}
		
		opcode=ReadMem16(v_pc);
		v_pc+=2;
		if ((opcode&MASK_N_M)==DIV1_KEY)
		{
			if (reg2==NoReg)
				reg2=(Sh4RegType)GetM(opcode);
			else if (reg2!=(Sh4RegType)GetM(opcode))
				break;
			
			if (reg2==reg1)
				break;

			if (reg3==NoReg)
				reg3=(Sh4RegType)GetN(opcode);
			else if (reg3!=(Sh4RegType)GetN(opcode))
				break;
			
			if (reg3==reg1)
				break;

			match++;
		}
		else
			break;
	}
	
	return match;
}
Пример #4
0
u32 MatchDiv32(u32 pc , Sh4RegType &reg1,Sh4RegType &reg2 , Sh4RegType &reg3)
{
	if (settings.dynarec.Safe)
		return 0;

	u32 v_pc=pc;
	u32 match=1;
	for (int i=0;i<32;i++)
	{
		u16 opcode=ReadMem16(v_pc);
		v_pc+=2;
		if ((opcode&MASK_N)==ROTCL_KEY)
		{
			if (reg1==NoReg)
				reg1=(Sh4RegType)GetN(opcode);
			else if (reg1!=(Sh4RegType)GetN(opcode))
				break;
			match++;
		}
		else
			break;
		
		opcode=ReadMem16(v_pc);
		v_pc+=2;
		if ((opcode&MASK_N_M)==DIV1_KEY)
		{
			if (reg2==NoReg)
				reg2=(Sh4RegType)GetM(opcode);
			else if (reg2!=(Sh4RegType)GetM(opcode))
				break;
			
			if (reg2==reg1)
				break;

			if (reg3==NoReg)
				reg3=(Sh4RegType)GetN(opcode);
			else if (reg3!=(Sh4RegType)GetN(opcode))
				break;
			
			if (reg3==reg1)
				break;

			match++;
		}
		else
			break;
	}
	
	return match;
}
Пример #5
0
strArray GetCellCharItems(pMatrix ppm, int element, int len)
{
        int m, n, i;
        rMatrix pm = ppm[element];
        pMatrix pa0, **pa;

        if (!mxIsCell(pm))
                ErrMsgTxt("Expecting a cell argument.");

        m = GetM(pm);
        n = GetN(pm);
        if (!(((m == 1) && (n == len)) || ((n == 1) && (m == len))))
                ErrMsgTxt("invalid vector.");
        pa = pa0 = (pMatrix) matCalloc(len, sizeof(*pa));
        for (i = 0; i < len; i++) {
        	*pa = mxGetCell(pm, i);
        	if (!mxIsChar(*pa))
                        break;
                pa++;
        }
        if (i < len) {
                matFree(pa0);
        	ErrMsgTxt("Expecting a character cell element.");
        }
        return(pa0);
}
Пример #6
0
bool MatchDiv32s(u32 op,u32 pc)
{
	u32 n = GetN(op);
	u32 m = GetM(op);

	div_som_reg1=NoReg;
	div_som_reg2=(Sh4RegType)m;
	div_som_reg3=(Sh4RegType)n;

	u32 match=MatchDiv32(pc+2,div_som_reg1,div_som_reg2,div_som_reg3);
	printf("DIV32S matched %d%% @ 0x%X\n",match*100/65,pc);
	
	if (match==65)
	{
		//DIV32S was perfectly matched :)
		printf("div32s %d/%d/%d\n",div_som_reg1,div_som_reg2,div_som_reg3);
		return true;
	}
	else //no match ...
	{
		/*
		printf("%04X\n",ReadMem16(pc-2));
		printf("%04X\n",ReadMem16(pc-0));
		printf("%04X\n",ReadMem16(pc+2));
		printf("%04X\n",ReadMem16(pc+4));
		printf("%04X\n",ReadMem16(pc+6));*/
		return false;
	}
}
Пример #7
0
int GetN(structlpsolvecaller *lpsolvecaller, zval arg)
{
        int n, n1;
        HashTable *arr_hash;
        zval    *data;
        zend_string *key;
        long i;

        switch (Z_TYPE(arg)) {
        case IS_LONG:
        case IS_DOUBLE:
                n = 1;
                break;
        case IS_ARRAY:
                //n = 1; /* only 1-dim arrays supported at this time */
                arr_hash = Z_ARRVAL(arg);

                n = 0;
                ZEND_HASH_FOREACH_KEY_VAL(arr_hash, i, key, data) {

                    if (key || (i < 0)) {
                        ErrMsgTxt(lpsolvecaller, "invalid vector.");
                    }
                    n1 = GetM(lpsolvecaller, *data);
                    if (n1 >= n)
                        n = n1;
                } ZEND_HASH_FOREACH_END();
                break;
        default:
                n = 0;
                break;
        }
        return(n);
}
Пример #8
0
Double GetRealScalar(pMatrix ppm, int element)
{
        rMatrix pm = ppm[element];

	if ((GetM(pm) == 1) && (GetN(pm) == 1)
	  && (IsNumeric(pm)) && (!IsComplex(pm)) ) {
		return(mxGetScalar(pm));
	} else {
		ErrMsgTxt("Expecting a scalar argument.");
	}
        return(0.0);
}
Пример #9
0
void update_time(void){
#if 0
	time2.year = RTC_GetTime(LPC_RTC, RTC_TIMETYPE_YEAR);
	time2.month = RTC_GetTime(LPC_RTC, RTC_TIMETYPE_MONTH);
	time2.dom = RTC_GetTime(LPC_RTC, RTC_TIMETYPE_DAYOFMONTH);
	time2.dow = RTC_GetTime(LPC_RTC, RTC_TIMETYPE_DAYOFWEEK);
	time2.doy = RTC_GetTime(LPC_RTC, RTC_TIMETYPE_DAYOFYEAR);
	time2.hh = RTC_GetTime(LPC_RTC, RTC_TIMETYPE_HOUR);
	time2.mm = RTC_GetTime(LPC_RTC, RTC_TIMETYPE_MINUTE);
	time2.ss = RTC_GetTime(LPC_RTC, RTC_TIMETYPE_SECOND);
#endif
	time2.unix = RTC_time_FindUnixtime(GetY(), GetM(), GetDOM(), GetHH(), GetMM(), GetSS());
	UNIX = time2.unix;
//	_DBG("[INFO]-time2.unix = ");_DBD32(time2.unix);_DBG(" (");_DBG(__FILE__);_DBG(":");_DBD16(__LINE__);_DBG(")\r\n");
}
Пример #10
0
extern "C" void RTC_IRQHandler(void){
//	RTC_ClearIntPending(LPC_RTC, RTC_INT_COUNTER_INCREASE);
//	secondlyCheck();
//	return;
	uint32_t secval;
	// This is increment counter interrupt
	if (RTC_GetIntPending(LPC_RTC, RTC_INT_COUNTER_INCREASE)){
		// Clear pending interrupt
		RTC_ClearIntPending(LPC_RTC, RTC_INT_COUNTER_INCREASE);
		_60th_SEC_COUNT=0;
		time2.second_inc=1;
		//run  checks at xx:xx:00
		if(!GetSS()){
			//run  checks at xx:00:00
			if(!GetMM()){
				//run daily checks at 00:00:00
				if(!GetHH()){
					//run weekly checks at Mon 00:00:00
					if(1 == GetDOW()){
						//run weekly checks at 1st Mon 00:00:00
						if(1 == GetDOM()){
							//run weekly checks at Jan 1st Mon 00:00:00
							if(1 == GetM()){
								yearlyCheck();
							}
							monthlyCheck();
						}
						weeklyCheck();
					}
					dailyCheck();
				}
				hourlyCheck();
			}
			minutelyCheck();
		}
		secondlyCheck();
	}

	// Continue to check the Alarm match
	if (RTC_GetIntPending(LPC_RTC, RTC_INT_ALARM)){
		// Clear pending interrupt
		RTC_ClearIntPending(LPC_RTC, RTC_INT_ALARM);
		set_next_alarm();
		sort_alarms();
		/* Send debug information */
//		_DBG_ ("ALARM 10s matched!");
	}
}
Пример #11
0
void DST_check_and_correct(void) {
//	time2.unix = RTC_time_FindUnixtime(time2.year, time2.month, time2.dom, time2.hh, time2.mm, time2.ss);
//	_DBG("[INFO]-time2.hh=");_DBD(time2.hh);_DBG(" (");_DBG(__FILE__);_DBG(":");_DBD16(__LINE__);_DBG(")\r\n");
	// Only update time once for DST when it ticks over
//	_DBG("[INFO]-dst_correction_needed() = ");_DBD32(dst_correction_needed());_DBG(" (");_DBG(__FILE__);_DBG(":");_DBD16(__LINE__);_DBG(")\r\n");
	if(dst_correction_needed()!=getDSTstatus()){
		if(dst_correction_needed()){
			time2.unix = time2.unix + DST_CORRECTION_VALUE_SEC;
			setDSTstatus(1);
		}
		else{
			time2.unix = time2.unix - DST_CORRECTION_VALUE_SEC;
			setDSTstatus(0);
		}
		unix_to_hh_mm_ss(time2.unix, &time2.hh, &time2.mm, &time2.ss);
		RTC_time_SetTime(GetY(), GetM(), GetDOM(), time2.hh, time2.mm, time2.ss, 00);
	}

#if 0 //old
	if(dst_correction_needed()) {
//		_DBG("dst_correction_needed");_DBG(" (");_DBG(__FILE__);_DBG(":");_DBD16(__LINE__);_DBG(")\r\n");
		if(time2.DST_begin_calculated == time2.unix){
			time2.unix_dst_last_update = time2.unix;
			time2.unix += DST_CORRECTION_VALUE_SEC;
			unix_to_hh_mm_ss(time2.unix, &time2.hh, &time2.mm, &time2.ss);
			RTC_SetTime (LPC_RTC, RTC_TIMETYPE_SECOND, time2.ss);
			RTC_SetTime (LPC_RTC, RTC_TIMETYPE_MINUTE, time2.mm);
			RTC_SetTime (LPC_RTC, RTC_TIMETYPE_HOUR, time2.hh);
		}
		if(time2.DST_end_calculated == time2.unix){
			if(time2.unix_dst_last_update != time2.DST_end_calculated){
				time2.unix_dst_last_update = time2.unix;
				time2.unix -= DST_CORRECTION_VALUE_SEC;
				unix_to_hh_mm_ss(time2.unix, &time2.hh, &time2.mm, &time2.ss);
				RTC_SetTime (LPC_RTC, RTC_TIMETYPE_SECOND, time2.ss);
				RTC_SetTime (LPC_RTC, RTC_TIMETYPE_MINUTE, time2.mm);
				RTC_SetTime (LPC_RTC, RTC_TIMETYPE_HOUR, time2.hh);
			}
		}
		time2.unix_utc = time2.unix - DST_CORRECTION_VALUE_SEC;
//		_DBD(time2.hh_utc);_DBG(" (");_DBG(__FILE__);_DBG(":");_DBD16(__LINE__);_DBG(")\r\n");
	}else{
		time2.unix_utc = time2.unix;
	}
#endif
}
Пример #12
0
bool __fastcall MatchDiv32s(u32 op,u32 pc)
{
	u32 n = GetN(op);
	u32 m = GetM(op);

	div_som_reg1=NoReg;
	div_som_reg2=(Sh4RegType)m;
	div_som_reg3=(Sh4RegType)n;

	u32 match=MatchDiv32(pc+2,div_som_reg1,div_som_reg2,div_som_reg3);
	log("DIV32S matched %d%% @ 0x%X\n",match*100/65,pc);
	
	if (match==65)
	{
		//DIV32S was perfectly matched :)
		return true;
	}
	else //no match ...
		return false;
}
Пример #13
0
void RTC_print_time(void){
	char buffer[100];
    time_t rawtime;
    struct tm * timeinfo;


//	xprintf(INFO "%d/%d/%d %d:%d:%d" " (%s:%d)\n",GetDOM(),GetM(),GetY(),GetHH(),GetMM(),GetSS(),_F_,_L_);
	time( &rawtime );
    timeinfo = localtime ( &rawtime );
	strftime(buffer,90,"%d/%m/%Y %I:%M:%S%p WOY:%U DOY:%j",timeinfo);
	xprintf(INFO "%s" " (%s:%d)\n", buffer,_F_,_L_);
//	xprintf(INFO "%d/%d/%d %d:%d:%d" " (%s:%d)\n",_F_,_L_);
//	xprintf(INFO "Unix: %d" " (%s:%d)\n",time2.unix,_F_,_L_);

//	xprintf(INFO "Sunrise: %d" " (%s:%d)\n",time2.sunrise_unix,_F_,_L_);
	timeinfo = localtime ( &time2.sunrise_unix );
	strftime(buffer,80,"Sunrise: %I:%M:%S%p.",timeinfo);
	xprintf(INFO "%s" " (%s:%d)\n", buffer,_F_,_L_);

//	xprintf(INFO "Sunset: %d" " (%s:%d)\n",time2.sunset_unix,_F_,_L_);
	timeinfo = localtime ( &time2.sunset_unix );
	strftime(buffer,80,"Sunset: %I:%M:%S%p.",timeinfo);
	xprintf(INFO "%s" " (%s:%d)\n", buffer,_F_,_L_);

//	xprintf(INFO "Noon: %d" " (%s:%d)\n",time2.noon_unix,_F_,_L_);
	timeinfo = localtime ( &time2.noon_unix );
	strftime(buffer,80,"Noon: %I:%M:%S%p.",timeinfo);
	xprintf(INFO "%s" " (%s:%d)\n", buffer,_F_,_L_);

	xprintf(INFO "It's %s" " (%s:%d)\n",time2.day_night ? "Night time" : "Day time" ,_F_,_L_);
//	xprintf(INFO "Day/Night: %d" " (%s:%d)\n",time2.day_night,_F_,_L_);
	xprintf(INFO "DST begin: %d end: %d" " (%s:%d)\n",time2.DST_begin_calculated,time2.DST_end_calculated,_F_,_L_);


#if 0
	_DBG("[INFO]-Date=");
	_DBD(GetDOM());
	_DBG("/");
	_DBD(GetM());
	_DBG("/");
	_DBD16(GetY());
	_DBG(" (");_DBG(__FILE__);_DBG(":");_DBD16(__LINE__);_DBG(")\r\n");

	_DBG("[INFO]-Time=");
	_DBD(GetHH());
	_DBG(":");
	_DBD(GetMM());
	_DBG(":");
	_DBD(GetSS());
	_DBG(" (");_DBG(__FILE__);_DBG(":");_DBD16(__LINE__);_DBG(")\r\n");

	_DBG("[INFO]-Unix: ");
	_DBD32(time2.unix);
	_DBG("  Sunrise: ");
	_DBD32(time2.sunrise_unix);
	_DBG("  Sunset: ");
	_DBD32(time2.sunset_unix);
	_DBG("  Noon: ");
	_DBD32(time2.noon_unix);
	_DBG("  Day/Night: ");
	_DBD(time2.day_night);
	_DBG(" (");_DBG(__FILE__);_DBG(":");_DBD16(__LINE__);_DBG(")\r\n");

	_DBG("[INFO]-DST begin: ");
	_DBD32(time2.DST_begin_calculated);
	_DBG("  end: ");
	_DBD32(time2.DST_end_calculated);
	_DBG(" (");_DBG(__FILE__);_DBG(":");_DBD16(__LINE__);_DBG(")\r\n");
#endif
}
Пример #14
0
int GetRealSparseVector(structlpsolvecaller *lpsolvecaller, int element, Double *vec, int *index, int start, int len, int col)
{
	int	m, n, count = 0;
        zval    pm = GetpMatrix(lpsolvecaller, element);
        zval    *data;
        HashTable *arr_hash;
        Double a;
        zend_string *key;
        ulong i;

        if ((Z_ISUNDEF(pm)) || (Z_TYPE(pm) != IS_ARRAY)) {
            ErrMsgTxt(lpsolvecaller, "invalid vector.");
        }

#if 1
        m = GetM(lpsolvecaller, pm);
	n = GetN(lpsolvecaller, pm);
#else
        m = zend_hash_num_elements(Z_ARRVAL_P(pm));
        n = 1;
#endif

	if (  ((col == 0) && (((m != 1) && (n != 1)) || ((m == 1) && (n > len)) || ((n == 1) && (m > len)))) ||
              ((col != 0) && ((m > len) || (col > n))) /* ||
	      !IsNumeric(pm) ||
              IsComplex(pm) */ ) {
/* Printf("1: m=%d, n=%d, col=%d, len=%d, IsNumeric=%d, IsComplex=%d\n", m,n,col,len,IsNumeric(pm),IsComplex(pm)); */
		ErrMsgTxt(lpsolvecaller, "invalid vector.");
	}

        if ((((n == 1) || (col != 0)) && (m > len)) || ((col == 0) && (m == 1) && (n > len))) {
/* Printf("2: m=%d, n=%d, col=%d, len=%d\n", m,n,col,len); */
                ErrMsgTxt(lpsolvecaller, "invalid vector.");
        }

        arr_hash = Z_ARRVAL(pm);
        ZEND_HASH_FOREACH_KEY_VAL(arr_hash, i, key, data) {

            if (key) {
                ErrMsgTxt(lpsolvecaller, "invalid vector.");
            } else {
                zval pm = *data;

                a = 0;

                if (Z_TYPE(pm) == IS_ARRAY) {
                    zval    *data;
                    HashTable *arr_hash;
                    zend_string *key;
                    ulong i;

                    arr_hash = Z_ARRVAL(pm);
                    ZEND_HASH_FOREACH_KEY_VAL(arr_hash, i, key, data) {

                        if (key) {
                            ErrMsgTxt(lpsolvecaller, "invalid vector.");
                        } else if (i + 1 == col) {
                            a = GetRealArg(lpsolvecaller, *data);
                            break;
                        }
                    } ZEND_HASH_FOREACH_END();
                } else {
                        a = GetRealArg(lpsolvecaller, pm);
                }

                if (a) {
                    *(vec++) = a;
                    *(index++) = start + i;
                    count++;
                }
            }
Пример #15
0
//
// process thread
//
unsigned __stdcall MatchThreadForFull(void *pParam)
{
    int FLEN;
    int n = 0, n1, i;
    dbQuery sql;
    ControlFlowGraph *target_cfg;

    db.attach();

    dbCursor<LibM> cursor1;
    int thread_id = (int)pParam;
    instruction_count[thread_id] = 0;
    fn[thread_id] = 0;

    while ((i = GetM()) != -1)
    {
        int startEA = f_info[i].startEA;
        FLEN = f_info[i].len;

        // disasm
        byte *bin = (byte *)RvaToPtr(pImageNtH, stMapFile.ImageBase, startEA - pOH->ImageBase);
        if (bin == NULL)
        {
            continue;
        }

        target_cfg = (ControlFlowGraph *)disasm(bin, FLEN, false, NULL);

        if (target_cfg == NULL || target_cfg->instructions.size() < MIN_INS_LENGTH)
        {
            clean(target_cfg);
            continue;
        }

        fn[thread_id]++;

        instruction_count[thread_id] += target_cfg->instructions.size();
        target_cfg->build();

        {
            sql = "MOV_COUNT=", target_cfg->MOV_COUNT, " and CTI_COUNT=", target_cfg->CTI_COUNT, " and ARITHMETIC_COUNT=", target_cfg->ARITHMETIC_COUNT, " and LOGI_COUNT=", target_cfg->LOGI_COUNT, " and STRING_COUNT=", target_cfg->STRING_COUNT, " and ETC_COUNT=", target_cfg->ETC_COUNT, " and instruction_size=", target_cfg->instructions.size(), "and block_size=", target_cfg->bb_len, "order by instruction_size desc";
        }

        n1 = cursor1.select(sql);
        if (n1 == 0)
        {
            clean(target_cfg);
            continue;
        }

        CBitSet lib_info(target_cfg->instructions.size());
        do
        {
            ControlFlowGraph *library_cfg = (ControlFlowGraph *)(cursor1->cfg);

            // BBLR
            bitset<10240> t = target_cfg->bblen_set;
            t.flip();
            t &= library_cfg->bblen_set;
            if (t.any())
            {
                continue;
            }

            target_cfg->buildDepGraph(false);
            library_cfg->buildDepGraph(true);

            //if (bSerialize)
            {
                // rule5: BBSR
                if (!matchBBSF(target_cfg, library_cfg))
                {
                    //r5[thread_id]++;
                    continue;
                }
            }

            library_cfg->serialize();
            library_cfg->buildVLibGraph();

            target_cfg->serialize();
            target_cfg->buildVLibGraph();

            //r0[thread_id]++;
            Graph _g(&target_cfg->vlibARGEdit);
            Graph _m(&library_cfg->vlibARGEdit);
            _m.SetNodeComparator(new InstructionComparator3);

            VF2SubState s0(&_m, &_g);
            Match m(&s0, my_visitor1, &lib_info);
            m.match_par();
            if (m.foundFlg)
            {
                printf("%d\t1\t%X\t%s\n", thread_id, startEA, cursor1->lib_name);
            }
        }
        while (cursor1.next());

        clean(target_cfg);
    }
    db.detach();

    printf("#%d done.\n", thread_id);
    return 0;
}
Пример #16
0
void dec_param(DecParam p,shil_param& r1,shil_param& r2, u32 op)
{
	switch(p)
	{
		//constants
	case PRM_PC_D8_x2:
		r1=mk_imm((state.cpu.rpc+4)+(GetImm8(op)<<1));
		break;

	case PRM_PC_D8_x4:
		r1=mk_imm(((state.cpu.rpc+4)&0xFFFFFFFC)+(GetImm8(op)<<2));
		break;
	
	case PRM_ZERO:
		r1= mk_imm(0);
		break;

	case PRM_ONE:
		r1= mk_imm(1);
		break;

	case PRM_TWO:
		r1= mk_imm(2);
		break;

	case PRM_TWO_INV:
		r1= mk_imm(~2);
		break;

	case PRM_ONE_F32:
		r1= mk_imm(0x3f800000);
		break;

	//imms
	case PRM_SIMM8:
		r1=mk_imm(GetSImm8(op));
		break;
	case PRM_UIMM8:
		r1=mk_imm(GetImm8(op));
		break;

	//direct registers
	case PRM_R0:
		r1=mk_reg(reg_r0);
		break;

	case PRM_RN:
		r1=mk_regi(reg_r0+GetN(op));
		break;

	case PRM_RM:
		r1=mk_regi(reg_r0+GetM(op));
		break;

	case PRM_FRN_SZ:
		if (state.cpu.FSZ64)
		{
			int rx=GetN(op)/2;
			if (GetN(op)&1)
				rx+=regv_xd_0;
			else
				rx+=regv_dr_0;

			r1=mk_regi(rx);
			break;
		}
	case PRM_FRN:
		r1=mk_regi(reg_fr_0+GetN(op));
		break;

	case PRM_FRM_SZ:
		if (state.cpu.FSZ64)
		{
			int rx=GetM(op)/2;
			if (GetM(op)&1)
				rx+=regv_xd_0;
			else
				rx+=regv_dr_0;

			r1=mk_regi(rx);
			break;
		}
	case PRM_FRM:
		r1=mk_regi(reg_fr_0+GetM(op));
		break;

	case PRM_FPUL:
		r1=mk_regi(reg_fpul);
		break;

	case PRM_FPN:	//float pair, 3 bits
		r1=mk_regi(regv_dr_0+GetN(op)/2);
		break;

	case PRM_FVN:	//float quad, 2 bits
		r1=mk_regi(regv_fv_0+GetN(op)/4);
		break;

	case PRM_FVM:	//float quad, 2 bits
		r1=mk_regi(regv_fv_0+(GetN(op)&0x3));
		break;

	case PRM_XMTRX:	//float matrix, 0 bits
		r1=mk_regi(regv_xmtrx);
		break;

	case PRM_FRM_FR0:
		r1=mk_regi(reg_fr_0+GetM(op));
		r2=mk_regi(reg_fr_0);
		break;

	case PRM_SR_T:
		r1=mk_regi(reg_sr_T);
		break;

	case PRM_SR_STATUS:
		r1=mk_regi(reg_sr_status);
		break;

	case PRM_SREG:	//FPUL/FPSCR/MACH/MACL/PR/DBR/SGR
		r1=mk_regi(SREGS[GetM(op)]);
		break;
	case PRM_CREG:	//SR/GBR/VBR/SSR/SPC/<RM_BANK>
		r1=mk_regi(CREGS[GetM(op)]);
		break;
	
	//reg/imm reg/reg
	case PRM_RN_D4_x1:
	case PRM_RN_D4_x2:
	case PRM_RN_D4_x4:
		{
			u32 shft=p-PRM_RN_D4_x1;
			r1=mk_regi(reg_r0+GetN(op));
			r2=mk_imm(GetImm4(op)<<shft);
		}
		break;

	case PRM_RN_R0:
		r1=mk_regi(reg_r0+GetN(op));
		r2=mk_regi(reg_r0);
		break;

	case PRM_RM_D4_x1:
	case PRM_RM_D4_x2:
	case PRM_RM_D4_x4:
		{
			u32 shft=p-PRM_RM_D4_x1;
			r1=mk_regi(reg_r0+GetM(op));
			r2=mk_imm(GetImm4(op)<<shft);
		}
		break;

	case PRM_RM_R0:
		r1=mk_regi(reg_r0+GetM(op));
		r2=mk_regi(reg_r0);
		break;

	case PRM_GBR_D8_x1:
	case PRM_GBR_D8_x2:
	case PRM_GBR_D8_x4:
		{
			u32 shft=p-PRM_GBR_D8_x1;
			r1=mk_regi(reg_gbr);
			r2=mk_imm(GetImm8(op)<<shft);
		}
		break;

	default:
		die("Non-supported parameter used");
	}
}
Пример #17
0
void SimplexLP::ToStandard( VerbLevel Verbosity )
{
	//--------------------------------------------------------------------------
	//	Resize all the vectors to match the constraint matrix dimensions.
	//
	SlackU.Resize( m );				SlackU.Fill( +INFINITY, m );
	SlackVT.Resize( m );			SlackVT.Fill( VT_NORM, m );

	Slack.Resize( m );
	SlackRow.Resize( m );
	SlackPosByRows.Resize( m );		SlackPosByRows.Fill( -1, m );
	Lambda.Resize( m );				Lambda.Fill( 1.0, m );
	LambdaVT.Resize( m );			LambdaVT.Fill( VT_FIXED | VT_ARTIF, m );
	LambdaRow.Resize( m );

	Int_T i;
	for( i = 0; i < m; i++ ) LambdaRow[i] = i;

	ComputePenalty();
	ShiftLowerBoundsToZero();

	//--------------------------------------------------------------------------
	//	Add slacks to non-equality rows.
	//
	for( i = 0; i < m; i++ )
	{
		//----------------------------------------------------------------------
		//	Row with a range => upper bound on a slack variable has to be
		//	imposed.
		//
		if( RowType[i] & RT_RNG )
		{
			switch( RowType[i] & RT_TYPE )
			{
			case RT_LE:	Slack[ SlackLen ]	= 1.0e0;					break;
			case RT_GE:	Slack[ SlackLen ]	= -1.0e0;					break;
			case RT_EQ: Slack[ SlackLen ]	= r[i] > 0.0 ? -1.0 : 1.0;	break;
#ifndef NDEBUG
			default:	abort();
#endif
			}
		 	SlackU[ SlackLen ]		= fabs( r[i] );
			SlackVT[ SlackLen ]		= VT_BOUNDED;
			SlackRow[ SlackLen ]	= i;
			SlackPosByRows[ i ]		= SlackLen++;
		}
		else
		//----------------------------------------------------------------------
		//	Row without a range. Slack declared PL or MI depending on row type.
		//
		{
			Slack[ SlackLen ] = 1.0e0;
			switch( RowType[i] & RT_TYPE )
			{
			case RT_LE:
				SlackVT[ SlackLen ]	= VT_NORM;
				break;

			case RT_GE:
				SlackVT[ SlackLen ]	= VT_MI;
				SlackU[ SlackLen ]	= 0.0;
				break;

			case RT_EQ:	break;

#ifndef NDEBUG
			default:	abort();
#endif
			}

			if( !(RowType[i] & RT_EQ) )
			{
				SlackRow[ SlackLen ]	= i;
				SlackPosByRows[ i ]		= SlackLen++;
			}
		}
	}

	//--------------------------------------------------------------------------
	//	Report on current problem statistics.
	//
	if( Verbosity >= V_HIGH )
		Print(

			/* Stream output FORMAT (two lines at the top, then - a table). */

			"\nConversion to standard form completed.\n"
			"Constraint matrix data:\n"
			"\t%-18s%10d\n"
			"\t%-18s%10d\n"
			"\t%-18s%10ld\n"
			"\t%-18s%10d\n"
			"\t%-18s%10.4f %%\n"
			"\t%-18s%10.4f %%\n",

			/* DATA. */

			"No. of rows:",				(int) GetM(),
			"No. of vars:",				(int) GetN(),
			"No. of non-zeros:",		(long int) GetNZ(),
			"No. of slacks:",			(int) SlackLen,
			"Density (orig.):",			(double)( 100 * nz )
										/ (double) ( m * n ),
			"Density (total):",			double( 100 * GetNZ() )
										/ (double) ( GetM() * GetN() )
			);
	Standard = True;
}
Пример #18
0
unsigned __stdcall MatchThread(void *pParam)
{
    int FLEN;
    int n = 0, n1, i;
    dbQuery sql;
    ControlFlowGraph *target_cfg;

    db.attach();

    dbCursor<LibM> cursor1;
    int thread_id = (int)pParam;
    instruction_count[thread_id] = 0;
    fn[thread_id] = 0;

    while ((i = GetM()) != -1)
    {
        int startEA = f_info[i].startEA;
        FLEN = f_info[i].len;

        // disasm
        byte *bin = (byte *)RvaToPtr(pImageNtH, stMapFile.ImageBase, startEA - pOH->ImageBase);
        if (bin == NULL)
        {
            continue;
        }

        target_cfg = (ControlFlowGraph *)disasm(bin, FLEN, false, NULL);

        if (target_cfg == NULL || target_cfg->instructions.size() < MIN_INS_LENGTH)
        {
            clean(target_cfg);
            continue;
        }

        fn[thread_id]++;

        instruction_count[thread_id] += target_cfg->instructions.size();
        target_cfg->build();

        {
            sql = "MOV_COUNT<=", target_cfg->MOV_COUNT, " and CTI_COUNT<=", target_cfg->CTI_COUNT, " and ARITHMETIC_COUNT<=", target_cfg->ARITHMETIC_COUNT, " and LOGI_COUNT<=", target_cfg->LOGI_COUNT, " and STRING_COUNT<=", target_cfg->STRING_COUNT, " and ETC_COUNT<=", target_cfg->ETC_COUNT, " and instruction_size<=", target_cfg->instructions.size(), "and block_size<=", target_cfg->bb_len, "order by instruction_size desc";
        }

        n1 = cursor1.select(sql);
        if (n1 == 0)
        {
            clean(target_cfg);
            continue;
        }

        CBitSet lib_info(target_cfg->instructions.size());
        do
        {
            ControlFlowGraph *library_cfg = (ControlFlowGraph *)(cursor1->cfg);


            target_cfg->buildDepGraph(false);
            library_cfg->buildDepGraph(true);

            library_cfg->serialize();
            library_cfg->buildVLibGraph();

            target_cfg->serialize();
            target_cfg->buildVLibGraph();

            //r0[thread_id]++;
            Graph _g(&target_cfg->vlibARGEdit);
            Graph _m(&library_cfg->vlibARGEdit);
            _m.SetNodeComparator(new InstructionComparator3);

            VF2SubState s0(&_m, &_g);
            int d[4];
            d[0] = (int)target_cfg;
            d[1] = startEA;
            d[2] = (int)cursor1->lib_name;
            d[3] = (int)&lib_info;
            Match m(&s0, my_visitor2, &d);
            m.match_serial();
        }
        while (cursor1.next());

        clean(target_cfg);
    }
    db.detach();

    printf("#%d done.\n", thread_id);
    return 0;
}
Пример #19
0
int GetRealSparseVector(pMatrix ppm, int element, Double *vec, int *index, int start, int len, int col)
{
	int	j, k, k1, m, n, start1, count = 0;
	int	*ir, *jc;
	double	*pr, *pr0;
        rMatrix pm = ppm[element];

	m = GetM(pm);
	n = GetN(pm);

	if (  ((col == 0) && (((m != 1) && (n != 1)) || ((m == 1) && (n > len)) || ((n == 1) && (m > len)))) ||
              ((col != 0) && ((m > len) || (col > n))) ||
	      !IsNumeric(pm) ||
              IsComplex(pm)  ) {
		ErrMsgTxt("invalid vector.");
	}

	pr = GetPr(pm);

	if (!IsSparse(pm)) {
                if ((((n == 1) || (col != 0)) && (m != len)) || ((col == 0) && (m == 1) && (n != len)))
                        ErrMsgTxt("invalid vector.");

                if (col)
                	pr += (col - 1) * m;
                for (k = 0; k < len; k++, pr++) {
                        if (*pr) {
				*(vec++) = *pr;
                        	*(index++) = start + k;
                        	count++;
                        }
		}
	} else if (IsSparse(pm)) {
                int j1, j2;

		jc = mxGetJc(pm);
		ir = mxGetIr(pm);
                pr0 = pr;
                if (col == 0) {
                        j1 = 0;
                        j2 = n;
                }
                else {
                        j1 = col - 1;
                        j2 = col;
                }
		for (j = j1; j < j2; j++) {
                        k = jc[j];
                        k1 = jc[j + 1];
                        pr = pr0 + k;
                        start1 = start;
                        if (col == 0)
                        	start1 += j * m;
                        for (; k < k1; k++, pr++, vec++, index++) {
                                *vec = *pr;
                                *index = start1 + ir[k];
                                count++;
			}
		}
	} else {
		ErrMsgTxt("Can't figure out this matrix.");
	}

        return(count);
}