Esempio n. 1
0
void ARMCore::thumbDataLo(uint4 opcode, uint3 ird, uint3 irm) {
  auto &rd = r[ird], rm = r[irm];
  r[15] += 2;
  
       if(opcode ==  2) { SOut r = lsl(rd, rm); bitf(true, rd = r, r); }  // lsls
  else if(opcode ==  3) { SOut r = lsr(rd, rm); bitf(true, rd = r, r); }  // lsrs
  else if(opcode ==  4) { SOut r = asr(rd, rm); bitf(true, rd = r, r); }  // asrs
  else if(opcode ==  7) { SOut r = ror(rd, rm); bitf(true, rd = r, r); }  // rors
  else if(opcode ==  9) sumf(true, rd = -rm, 0, ~rm);                     // negs
  else if(opcode == 13) bitf(true, rd = rm * rd, {rm*rd, Cf});            // muls
  else alu(2*opcode+1, rd, rd, {rm,Cf});                // others are same as ARM
}
void tbh(int i){
	int n,m,halfwords;
	*((int *)(&TbH)) = i;
	n = TbH.rn;
	m = TbH.rm;
	if(n == 13 || Bad_Reg(m))
		printf("	It is unpredictable!");
	else if(InITBlock() && !LastInITBlock())
		printf("	It is unpredictable!");
	else{
		halfwords = get_MemU(get_general_register(n) + lsl(get_general_register(m),1),1);
		halfwords = halfwords << 1;
		BranchWritePC(get_pc() + halfwords);
		//printf("	*****tbh");
	}
}
Esempio n. 3
0
void armv7a::ror_c(bits* result, uint32_t* carry_out, const bits& x, uint32_t shift)
{
    //pseudo_assert(shift != 0, "ror_c assert error");
    //pseudo_assert(shift < 32, "ror_c assert error");  //hit, but no need?
    if(shift == 0)
    {
        (*result) = x;
        *carry_out = 0;
    }
    else
    {
        uint32_t m = shift % x.n;
        bits r1, r2;
        lsr(&r1, x, m);
        lsl(&r2, x, x.n - m);
        result->val = r1.val | r2.val;
        result->n = x.n;
        printd(d_inst, "x=%X:%d shift:%d lsr_r1:%X lsr_r2:%X result:%X, result.n:%d", x.val, x.n, shift, r1.val, r2.val, result->val, result->n);
        *carry_out = (*result)(x.n - 1);
    }
}
Esempio n. 4
0
// Returns the next random number based on seeds
// and updates the seeds accordingly.
dodBYTE RNG::RANDOM()
{
	int x, y;
	dodBYTE a, b;
	carry = 0;
	for (x = 8; x != 0; --x)
	{
		b = 0;
		a = (SEED[2] & 0xE1);
		for (y = 8; y != 0; --y)
		{
			a = lsl(a);
			if (carry != 0)
				++b;
		}
		b = lsr(b);
		SEED[0] = rol(SEED[0]);
		SEED[1] = rol(SEED[1]);
		SEED[2] = rol(SEED[2]);
	}
	return SEED[0];
}
Esempio n. 5
0
void execALU(){
	switch(controle_alu.op_code){
		case  1: add();      break;
		case  2: addinc();   break;
		case  3: and();      break;
		case  4: andnota();  break;
		case  5: asl();      break;
		case  6: asr();      break;
		case  7: deca();     break;
		case  8: inca();     break;
		case  9: j();        break;
		case 10: jal(); 	 break;
		case 11: jf(); 	  	 break;
		case 12: jr(); 		 break;
		case 13: jt(); 		 break;
		case 14: lch(); 	 break;
		case 15: lcl(); 	 break;
		case 16: load();	 break;
		case 17: loadlit();	 break;
		case 18: lsl();		 break;
		case 19: lsr();		 break;
		case 20: nand();	 break;
		case 21: nor();		 break;
		case 22: ones();	 break;
		case 23: or();		 break;
		case 24: ornotb();	 break;
		case 25: passa();	 break;
		case 26: passnota(); break;
		case 27: store();	 break;
		case 28: sub();		 break;
		case 29: subdec();	 break;
		case 30: xnor();	 break;
		case 31: xor();		 break;
		case 32: zeros();	 break;
	}
}