Advertisement
Guest User

Untitled

a guest
Oct 13th, 2019
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.25 KB | None | 0 0
  1. void EE_JIT64::write_gpr(EmotionEngine &ee, REG_64 addr_reg, REG_64 value_reg, int size)
  2. {
  3.     REG_64 temp = lalloc_int_reg(ee, 0, REG_TYPE::INTSCRATCHPAD, REG_STATE::SCRATCHPAD);
  4.  
  5.     emitter.MOV32_REG(addr_reg, temp);
  6.  
  7.     //uint8_t* mem = tlb_map[addr / 4096]
  8.     emitter.SHR32_REG_IMM(12, temp);
  9.     emitter.SHL32_REG_IMM(3, temp);
  10.     emitter.ADD64_REG(REG_64::R15, temp);
  11.     emitter.MOV64_FROM_MEM(temp, temp);
  12.  
  13.     //if (mem > (uint8_t*)1)
  14.     emitter.CMP64_IMM(1, temp);
  15.     uint8_t* is_mem_dest = emitter.JCC_NEAR_DEFERRED(ConditionCode::G);
  16.  
  17.     //else if (mem == (uint8_t*)1)
  18.     uint8_t* is_mmio_dest = emitter.JCC_NEAR_DEFERRED(ConditionCode::E);
  19.  
  20.     //else
  21.     emitter.MOV32_TO_MEM(value_reg, temp);
  22.  
  23.     emitter.set_jump_dest(is_mmio_dest);
  24.  
  25.     //return e->readT(address & 0x1FFFFFFF)
  26.     emitter.AND32_REG_IMM(0x1FFFFFFF, addr_reg);
  27.     prepare_abi((uint64_t)ee.e);
  28.     prepare_abi_reg(addr_reg);
  29.     prepare_abi_reg(value_reg);
  30.  
  31.     switch (size)
  32.     {
  33.         case 8:
  34.             call_abi_func((uint64_t)emulator_write8);
  35.             break;
  36.         case 16:
  37.             call_abi_func((uint64_t)emulator_write16);
  38.             break;
  39.         case 32:
  40.             call_abi_func((uint64_t)emulator_write32);
  41.             break;
  42.         case 64:
  43.             call_abi_func((uint64_t)emulator_write64);
  44.             break;
  45.         default:
  46.             Errors::die("[EE_JIT64] Unrecognized size %d in read_gpr", size);
  47.     }
  48.  
  49.     uint8_t* mmio_finished_dest = emitter.JMP_NEAR_DEFERRED();
  50.  
  51.     emitter.set_jump_dest(is_mem_dest);
  52.  
  53.     //*(T*)&mem[address & 4095] = value
  54.     emitter.AND32_REG_IMM(0xFFF, addr_reg);
  55.     emitter.ADD64_REG(temp, addr_reg);
  56.     switch (size)
  57.     {
  58.         case 8:
  59.             emitter.MOV8_TO_MEM(value_reg, addr_reg);
  60.             break;
  61.         case 16:
  62.             emitter.MOV16_TO_MEM(value_reg, addr_reg);
  63.             break;
  64.         case 32:
  65.             emitter.MOV32_TO_MEM(value_reg, addr_reg);
  66.             break;
  67.         case 64:
  68.             emitter.MOV64_TO_MEM(value_reg, addr_reg);
  69.             break;
  70.         default:
  71.             Errors::die("[EE_JIT64] Unrecognized size %d in write_gpr", size);
  72.     }
  73.  
  74.     emitter.set_jump_dest(mmio_finished_dest);
  75.  
  76.     free_int_reg(ee, temp);
  77. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement