std::string DisassemblyTR3200 (const VComputer& vc, dword_t pc) {
#define BUF_SIZE (32)
      char buf[BUF_SIZE] = {0};

      dword_t inst = vc.ReadDW(pc); // Fetch
      pc = pc +4;

      dword_t opcode, rd, rn, rs;
      rd = GRD(inst);
      rs = GRS(inst);
      // Here beging the Decoding
      bool literal = HAVE_LITERAL(inst);
      opcode = GET_OP_CODE(inst);

      if (IS_P3(inst)) {
        // 3 parameter instruction ********************************************
        if (literal) {
          rn = LIT15(inst);
          if (IS_BIG_LITERAL_L15(rn)) { // Next dword is literal value
            rn = vc.ReadDW(pc);
            pc +=4;
          } else if (RN_SIGN_BIT(inst)) { // Negative Literal -> Extend sign
            rn |= 0xFFFF8000;
          }
        } else {
          rn = GRN(inst);
        }

        switch (opcode) {
          case P3_OPCODE::AND :
            if (literal)
              snprintf(buf, BUF_SIZE, "AND %%r%u, %%r%u, 0x%08X",  rd, rs, rn);
            else
              snprintf(buf, BUF_SIZE, "AND %%r%u, %%r%u, %%r%u", rd, rs, rn);
            break;

          case P3_OPCODE::OR :
            if (literal)
              snprintf(buf, BUF_SIZE, "OR %%r%u, %%r%u, 0x%08X",  rd, rs, rn);
            else
              snprintf(buf, BUF_SIZE, "OR %%r%u, %%r%u, %%r%u", rd, rs, rn);
            break;

          case P3_OPCODE::XOR :
            if (literal)
              snprintf(buf, BUF_SIZE, "XOR %%r%u, %%r%u, 0x%08X",  rd, rs, rn);
            else
              snprintf(buf, BUF_SIZE, "XOR %%r%u, %%r%u, %%r%u", rd, rs, rn);
            break;

          case P3_OPCODE::BITC :
            if (literal)
              snprintf(buf, BUF_SIZE, "BITC %%r%u, %%r%u, 0x%08X",  rd, rs, rn);
            else
              snprintf(buf, BUF_SIZE, "BITC %%r%u, %%r%u, %%r%u", rd, rs, rn);
            break;

          case P3_OPCODE::ADD :
            if (literal)
              snprintf(buf, BUF_SIZE, "ADD %%r%u, %%r%u, 0x%08X",  rd, rs, rn);
            else
              snprintf(buf, BUF_SIZE, "ADD %%r%u, %%r%u, %%r%u", rd, rs, rn);
            break;

          case P3_OPCODE::ADDC :
            if (literal)
              snprintf(buf, BUF_SIZE, "ADDC %%r%u, %%r%u, 0x%08X",  rd, rs, rn);
            else
              snprintf(buf, BUF_SIZE, "ADDC %%r%u, %%r%u, %%r%u", rd, rs, rn);
            break;

          case P3_OPCODE::SUB :
            if (literal)
              snprintf(buf, BUF_SIZE, "SUB %%r%u, %%r%u, 0x%08X",  rd, rs, rn);
            else
              snprintf(buf, BUF_SIZE, "SUB %%r%u, %%r%u, %%r%u", rd, rs, rn);
            break;

          case P3_OPCODE::SUBB :
            if (literal)
              snprintf(buf, BUF_SIZE, "SUBB %%r%u, %%r%u, 0x%08X",  rd, rs, rn);
            else
              snprintf(buf, BUF_SIZE, "SUBB %%r%u, %%r%u, %%r%u", rd, rs, rn);
            break;

          case P3_OPCODE::RSB :
            if (literal)
              snprintf(buf, BUF_SIZE, "RSB %%r%u, %%r%u, 0x%08X",  rd, rs, rn);
            else
              snprintf(buf, BUF_SIZE, "RSB %%r%u, %%r%u, %%r%u", rd, rs, rn);
            break;

          case P3_OPCODE::RSBB :
            if (literal)
              snprintf(buf, BUF_SIZE, "RSBB %%r%u, %%r%u, 0x%08X",  rd, rs, rn);
            else
              snprintf(buf, BUF_SIZE, "RSBB %%r%u, %%r%u, %%r%u", rd, rs, rn);
            break;

          case P3_OPCODE::LLS :
            if (literal)
              snprintf(buf, BUF_SIZE, "LLS %%r%u, %%r%u, 0x%08X",  rd, rs, rn);
            else
              snprintf(buf, BUF_SIZE, "LLS %%r%u, %%r%u, %%r%u", rd, rs, rn);
            break;

          case P3_OPCODE::RLS :
            if (literal)
              snprintf(buf, BUF_SIZE, "RLS %%r%u, %%r%u, 0x%08X",  rd, rs, rn);
            else
              snprintf(buf, BUF_SIZE, "RLS %%r%u, %%r%u, %%r%u", rd, rs, rn);
            break;

          case P3_OPCODE::ARS :
            if (literal)
              snprintf(buf, BUF_SIZE, "ARS %%r%u, %%r%u, 0x%08X",  rd, rs, rn);
            else
              snprintf(buf, BUF_SIZE, "ARS %%r%u, %%r%u, %%r%u", rd, rs, rn);
            break;

          case P3_OPCODE::ROTL :
            if (literal)
              snprintf(buf, BUF_SIZE, "ROTL %%r%u, %%r%u, 0x%08X",  rd, rs, rn);
            else
              snprintf(buf, BUF_SIZE, "ROTL %%r%u, %%r%u, %%r%u", rd, rs, rn);
            break;

          case P3_OPCODE::ROTR :
            if (literal)
              snprintf(buf, BUF_SIZE, "ROTR %%r%u, %%r%u, 0x%08X",  rd, rs, rn);
            else
              snprintf(buf, BUF_SIZE, "ROTR %%r%u, %%r%u, %%r%u", rd, rs, rn);
            break;


          case P3_OPCODE::MUL :
            if (literal)
              snprintf(buf, BUF_SIZE, "MUL %%r%u, %%r%u, 0x%08X",  rd, rs, rn);
            else
              snprintf(buf, BUF_SIZE, "MUL %%r%u, %%r%u, %%r%u", rd, rs, rn);
            break;

          case P3_OPCODE::SMUL :
            if (literal)
              snprintf(buf, BUF_SIZE, "SMUL %%r%u, %%r%u, 0x%08X",  rd, rs, rn);
            else
              snprintf(buf, BUF_SIZE, "SMUL %%r%u, %%r%u, %%r%u", rd, rs, rn);
            break;

          case P3_OPCODE::DIV :
            if (literal)
              snprintf(buf, BUF_SIZE, "DIV %%r%u, %%r%u, 0x%08X",  rd, rs, rn);
            else
              snprintf(buf, BUF_SIZE, "DIV %%r%u, %%r%u, %%r%u", rd, rs, rn);
            break;

          case P3_OPCODE::SDIV :
            if (literal)
              snprintf(buf, BUF_SIZE, "SDIV %%r%u, %%r%u, 0x%08X",  rd, rs, rn);
            else
              snprintf(buf, BUF_SIZE, "SDIV %%r%u, %%r%u, %%r%u", rd, rs, rn);
            break;


          case P3_OPCODE::LOAD :
            if (literal)
              snprintf(buf, BUF_SIZE, "LOAD %%r%u, [%%r%u + 0x%08X]",  rd, rs, rn);
            else
              snprintf(buf, BUF_SIZE, "LOAD %%r%u, [%%r%u + %%r%u]", rd, rs, rn);
            break;

          case P3_OPCODE::LOADW :
            if (literal)
              snprintf(buf, BUF_SIZE, "LOADW %%r%u, [%%r%u + 0x%08X]",  rd, rs, rn);
            else
              snprintf(buf, BUF_SIZE, "LOADW %%r%u, [%%r%u + %%r%u]", rd, rs, rn);
            break;

          case P3_OPCODE::LOADB :
            if (literal)
              snprintf(buf, BUF_SIZE, "LOADB %%r%u, [%%r%u + 0x%08X]",  rd, rs, rn);
            else
              snprintf(buf, BUF_SIZE, "LOADB %%r%u, [%%r%u + %%r%u]", rd, rs, rn);
            break;

          case P3_OPCODE::STORE :
            if (literal)
              snprintf(buf, BUF_SIZE, "STORE [%%r%u + 0x%08X], %%r%u", rs, rn, rd);
            else
              snprintf(buf, BUF_SIZE, "STORE [%%r%u + %%r%u], %%r%u",rs, rn, rd);
            break;

          case P3_OPCODE::STOREW :
            if (literal)
              snprintf(buf, BUF_SIZE, "STOREW [%%r%u + 0x%08X], %%r%u", rs, rn, rd);
            else
              snprintf(buf, BUF_SIZE, "STOREW [%%r%u + %%r%u], %%r%u", rs, rn, rd);
            break;

          case P3_OPCODE::STOREB :
            if (literal)
              snprintf(buf, BUF_SIZE, "STOREB [%%r%u + 0x%08X], %%r%u", rs, rn, rd);
            else
              snprintf(buf, BUF_SIZE, "STOREB [%%r%u + %%r%u], %%r%u", rs, rn, rd);
            break;


          default:
            if (literal)
              snprintf(buf, BUF_SIZE, "???? %%r%u, %%r%u, 0x%08X",  rd, rs, rn);
            else
              snprintf(buf, BUF_SIZE, "???? %%r%u, %%r%u, %%r%u", rd, rs, rn);
            break;
        }
      } else if (IS_P2(inst)) {
        // Fetch Rn operand
        if (literal) {
          rn = LIT19(inst);
          if (IS_BIG_LITERAL_L19(rn)) { // Next dword is literal value
            rn = vc.ReadDW(pc);
            pc +=4;
          } else if (RN_SIGN_BIT(inst)) { // Negative Literal -> Extend sign
            rn |= 0xFFF80000;
          }
        } else {
          rn = GRS(inst);
        }

        switch (opcode) {
          case P2_OPCODE::MOV :
            if (literal)
              snprintf(buf, BUF_SIZE, "MOV %%r%u, 0x%08X",  rd, rn);
            else
              snprintf(buf, BUF_SIZE, "MOV %%r%u, %%r%u", rd, rn);
            break;

          case P2_OPCODE::SWP :
            if (literal)
              snprintf(buf, BUF_SIZE, "SWP %%r%u, 0x%08X",  rd, rn);
            else
              snprintf(buf, BUF_SIZE, "SWP %%r%u, %%r%u", rd, rn);
            break;

          case P2_OPCODE::SIGXB :
            if (literal)
              snprintf(buf, BUF_SIZE, "SIGXB %%r%u, 0x%08X",  rd, rn);
            else
              snprintf(buf, BUF_SIZE, "SIGXB %%r%u, %%r%u", rd, rn);
            break;

          case P2_OPCODE::SIGXW :
            if (literal)
              snprintf(buf, BUF_SIZE, "SIGXW %%r%u, 0x%08X",  rd, rn);
            else
              snprintf(buf, BUF_SIZE, "SIGXW %%r%u, %%r%u", rd, rn);
            break;

          case P2_OPCODE::NOT :
            if (literal)
              snprintf(buf, BUF_SIZE, "NOT %%r%u, 0x%08X",  rd, rn);
            else
              snprintf(buf, BUF_SIZE, "NOT %%r%u, %%r%u", rd, rn);
            break;

          case P2_OPCODE::LOAD2 :
            if (literal)
              snprintf(buf, BUF_SIZE, "LOAD %%r%u, [0x%08X]",  rd, rn);
            else
              snprintf(buf, BUF_SIZE, "LOAD %%r%u, [%%r%u]", rd,  rn);
            break;

          case P2_OPCODE::LOADW2 :
            if (literal)
              snprintf(buf, BUF_SIZE, "LOADW %%r%u, [0x%08X]",  rd, rn);
            else
              snprintf(buf, BUF_SIZE, "LOADW %%r%u, [%%r%u]", rd, rn);
            break;

          case P2_OPCODE::LOADB2 :
            if (literal)
              snprintf(buf, BUF_SIZE, "LOADB %%r%u, [0x%08X]",  rd, rn);
            else
              snprintf(buf, BUF_SIZE, "LOADB %%r%u, [%%r%u]", rd, rn);
            break;

          case P2_OPCODE::STORE2 :
            if (literal)
              snprintf(buf, BUF_SIZE, "STORE [0x%08X], %%r%u",  rn, rd);
            else
              snprintf(buf, BUF_SIZE, "STORE [%%r%u], %%r%u", rn, rd);
            break;

          case P2_OPCODE::STOREW2 :
            if (literal)
              snprintf(buf, BUF_SIZE, "STOREW [0x%08X], %%r%u", rn, rd);
            else
              snprintf(buf, BUF_SIZE, "STOREW [%%r%u], %%r%u", rn, rd);
            break;

          case P2_OPCODE::STOREB2 :
            if (literal)
              snprintf(buf, BUF_SIZE, "STOREB [0x%08X], %%r%u", rn, rd);
            else
              snprintf(buf, BUF_SIZE, "STOREB [%%r%u], %%r%u", rn, rd);
            break;


          case P2_OPCODE::IFEQ :
            if (literal)
              snprintf(buf, BUF_SIZE, "IFEQ %%r%u, 0x%08X",  rd, rn);
            else
              snprintf(buf, BUF_SIZE, "IFEQ %%r%u, %%r%u", rd, rn);
            break;

          case P2_OPCODE::IFNEQ :
            if (literal)
              snprintf(buf, BUF_SIZE, "IFNEQ %%r%u, 0x%08X",  rd, rn);
            else
              snprintf(buf, BUF_SIZE, "IFNEQ %%r%u, %%r%u", rd, rn);
            break;

          case P2_OPCODE::IFL :
            if (literal)
              snprintf(buf, BUF_SIZE, "IFL %%r%u, 0x%08X",  rd, rn);
            else
              snprintf(buf, BUF_SIZE, "IFL %%r%u, %%r%u", rd, rn);
            break;

          case P2_OPCODE::IFSL :
            if (literal)
              snprintf(buf, BUF_SIZE, "IFSL %%r%u, 0x%08X",  rd, rn);
            else
              snprintf(buf, BUF_SIZE, "IFSL %%r%u, %%r%u", rd, rn);
            break;

          case P2_OPCODE::IFLE :
            if (literal)
              snprintf(buf, BUF_SIZE, "IFLE %%r%u, 0x%08X",  rd, rn);
            else
              snprintf(buf, BUF_SIZE, "IFLE %%r%u, %%r%u", rd, rn);
            break;

          case P2_OPCODE::IFSLE :
            if (literal)
              snprintf(buf, BUF_SIZE, "IFSLE %%r%u, 0x%08X",  rd, rn);
            else
              snprintf(buf, BUF_SIZE, "IFSLE %%r%u, %%r%u", rd, rn);
            break;

          case P2_OPCODE::IFBITS :
            if (literal)
              snprintf(buf, BUF_SIZE, "IFBITS %%r%u, 0x%08X",  rd, rn);
            else
              snprintf(buf, BUF_SIZE, "IFBITS %%r%u, %%r%u", rd, rn);
            break;

          case P2_OPCODE::IFCLEAR :
            if (literal)
              snprintf(buf, BUF_SIZE, "IFCLEAR %%r%u, 0x%08X",  rd, rn);
            else
              snprintf(buf, BUF_SIZE, "IFCLEAR %%r%u, %%r%u", rd, rn);
            break;


          case P2_OPCODE::JMP2 :
            if (literal)
              snprintf(buf, BUF_SIZE, "JMP %%r%u + 0x%08X",  rd, rn);
            else
              snprintf(buf, BUF_SIZE, "JMP %%r%u + %%r%u", rd, rn);
            break;

          case P2_OPCODE::CALL2 :
            if (literal)
              snprintf(buf, BUF_SIZE, "CALL %%r%u + 0x%08X",  rd, rn);
            else
              snprintf(buf, BUF_SIZE, "CALL %%r%u + %%r%u", rd, rn);
            break;


          default:
            if (literal)
              snprintf(buf, BUF_SIZE, "???? %%r%u, 0x%08X",  rd, rn);
            else
              snprintf(buf, BUF_SIZE, "???? %%r%u, %%r%u", rd, rn);
            break;
        }

      } else if (IS_P1(inst)) {
        // 1 parameter instrucction *******************************************
        // Fetch Rn operand
        if (literal) {
          rn = LIT23(inst);
          if (IS_BIG_LITERAL_L23(rn)) { // Next dword is literal value
            rn = vc.ReadDW(pc);
            pc +=4;
          } else if (RN_SIGN_BIT(inst)) { // Negative Literal -> Extend sign
            rn |= 0xFF800000;
          }
        } else {
          rn = GRD(inst);
        }

        switch (opcode) {
          case P1_OPCODE::XCHGB :
            if (literal)
              snprintf(buf, BUF_SIZE, "XCHGB? 0x%08X",  rn);
            else
              snprintf(buf, BUF_SIZE, "XCHGB %%r%u", rn);
            break;

          case P1_OPCODE::XCHGW :
            if (literal)
              snprintf(buf, BUF_SIZE, "XCHGW? 0x%08X",  rn);
            else
              snprintf(buf, BUF_SIZE, "XCHGW %%r%u", rn);
            break;

          case P1_OPCODE::GETPC :
            if (literal)
              snprintf(buf, BUF_SIZE, "GETPC? 0x%08X",  rn);
            else
              snprintf(buf, BUF_SIZE, "GETPC %%r%u", rn);
            break;


          case P1_OPCODE::POP :
            if (literal)
              snprintf(buf, BUF_SIZE, "POP? 0x%08X",  rn);
            else
              snprintf(buf, BUF_SIZE, "POP %%r%u", rn);
            break;

          case P1_OPCODE::PUSH :
            if (literal)
              snprintf(buf, BUF_SIZE, "PUSH 0x%08X",  rn);
            else
              snprintf(buf, BUF_SIZE, "PUSH %%r%u", rn);
            break;


          case P1_OPCODE::JMP :
            if (literal)
              snprintf(buf, BUF_SIZE, "JMP 0x%08X",  rn);
            else
              snprintf(buf, BUF_SIZE, "JMP %%r%u", rn);
            break;

          case P1_OPCODE::CALL :
            if (literal)
              snprintf(buf, BUF_SIZE, "CALL 0x%08X",  rn);
            else
              snprintf(buf, BUF_SIZE, "CALL %%r%u", rn);
            break;

          case P1_OPCODE::RJMP :
            if (literal)
              snprintf(buf, BUF_SIZE, "JMP %%pc +0x%08X",  rn);
            else
              snprintf(buf, BUF_SIZE, "JMP %%pc +%%r%u", rn);
            break;

          case P1_OPCODE::RCALL :
            if (literal)
              snprintf(buf, BUF_SIZE, "CALL %%pc +0x%08X",  rn);
            else
              snprintf(buf, BUF_SIZE, "CALL %%pc +%%r%u", rn);
            break;

          case P1_OPCODE::INT :
            if (literal)
              snprintf(buf, BUF_SIZE, "INT %08Xh", rn);
            else
              snprintf(buf, BUF_SIZE, "INT %%r%u", rn);
            break;



          default:
            if (literal)
              snprintf(buf, BUF_SIZE, "???? 0x%08X",  rn);
            else
              snprintf(buf, BUF_SIZE, "???? %%r%u", rn);
            break;
        }
      } else {
        // 0 parameter instrucction *******************************************

        switch (opcode) {
          case NP_OPCODE::SLEEP :
            snprintf(buf, BUF_SIZE, "SLEEP");
            break;

          case NP_OPCODE::RET :
            snprintf(buf, BUF_SIZE, "RET");
            break;

          case NP_OPCODE::RFI :
            snprintf(buf, BUF_SIZE, "RFI");
            break;

          default:
            snprintf(buf, BUF_SIZE, "????");
        }
      }


      std::string out(buf);
      return out;

#undef BUF_SIZE
    }
Exemple #2
0
int
_papi_hwd_get_system_info( void )
{
	struct wininfo win_hwinfo;
	HMODULE hModule;
	DWORD len;
	long i = 0;

	/* Path and args */
	_papi_hwi_system_info.pid = getpid(  );

	hModule = GetModuleHandle( NULL );	// current process
	len =
		GetModuleFileName( hModule, _papi_hwi_system_info.exe_info.fullname,
						   PAPI_MAX_STR_LEN );
	if ( len )
		splitpath( _papi_hwi_system_info.exe_info.fullname,
				   _papi_hwi_system_info.exe_info.address_info.name );
	else
		return ( PAPI_ESYS );

	SUBDBG( "Executable is %s\n",
			_papi_hwi_system_info.exe_info.address_info.name );
	SUBDBG( "Full Executable is %s\n",
			_papi_hwi_system_info.exe_info.fullname );
	/* Hardware info */
	if ( !init_hwinfo( &win_hwinfo ) )
		return ( PAPI_ESYS );

	_papi_hwi_system_info.hw_info.ncpu = win_hwinfo.ncpus;
	_papi_hwi_system_info.hw_info.nnodes = win_hwinfo.nnodes;
	_papi_hwi_system_info.hw_info.totalcpus = win_hwinfo.total_cpus;

	_papi_hwi_system_info.hw_info.vendor = win_hwinfo.vendor;
	_papi_hwi_system_info.hw_info.revision = ( float ) win_hwinfo.revision;
	strcpy( _papi_hwi_system_info.hw_info.vendor_string,
			win_hwinfo.vendor_string );

	/* initialize the model to something */
	_papi_hwi_system_info.hw_info.model = PERFCTR_X86_GENERIC;

	if ( IS_P3( &win_hwinfo ) || IS_P3_XEON( &win_hwinfo ) ||
		 IS_CELERON( &win_hwinfo ) )
		_papi_hwi_system_info.hw_info.model = PERFCTR_X86_INTEL_PIII;

	if ( IS_MOBILE( &win_hwinfo ) )
		_papi_hwi_system_info.hw_info.model = PERFCTR_X86_INTEL_PENTM;

	if ( IS_P4( &win_hwinfo ) ) {
		if ( win_hwinfo.model >= 2 )
			/* this is a guess for Pentium 4 Model 2 */
			_papi_hwi_system_info.hw_info.model = PERFCTR_X86_INTEL_P4M2;
		else
			_papi_hwi_system_info.hw_info.model = PERFCTR_X86_INTEL_P4;
	}

	if ( IS_AMDDURON( &win_hwinfo ) || IS_AMDATHLON( &win_hwinfo ) )
		_papi_hwi_system_info.hw_info.model = PERFCTR_X86_AMD_K7;

	strcpy( _papi_hwi_system_info.hw_info.model_string,
			win_hwinfo.model_string );

	_papi_hwi_system_info.num_cntrs = win_hwinfo.nrctr;
	_papi_hwi_system_info.num_gp_cntrs = _papi_hwi_system_info.num_cntrs;

	_papi_hwi_system_info.hw_info.mhz = ( float ) win_hwinfo.mhz;
	_papi_hwi_system_info.hw_info.clock_mhz = mhz;

	return ( PAPI_OK );
}