45 int is_left,
int wlen,
int store)
49 uint64_t
addr = *((uint64_t *)
ic->arg[1]) + (int32_t)
ic->arg[2];
50 int i, dir, reg_dir, reg_ofs, ok;
51 uint64_t result_value, tmpaddr;
52 uint64_t aligned_addr =
addr & ~(wlen-1);
53 unsigned char aligned_word[8], databyte;
55 int low_pc = ((size_t)
ic - (
size_t)
cpu->
cd.
mips.cur_ic_page)
56 /
sizeof(
struct mips_instr_call);
73 result_value = *((uint64_t *)
ic->arg[0]);
76 result_value = (int32_t)result_value;
77 aligned_addr = (int32_t)aligned_addr;
83 uint64_t oldpc =
cpu->
pc;
95 if (
cpu->
pc != oldpc) {
104 for (i=0; i<wlen; i++) {
105 tmpaddr =
addr + i*dir;
107 if ( (tmpaddr & ~(wlen-1)) != (
addr & ~(wlen-1)) )
115 aligned_word[tmpaddr & (wlen-1)] =
116 (result_value >> (reg_ofs * 8)) & 255;
122 aligned_addr, &aligned_word[0], wlen,
134 for (i=0; i<wlen; i++) {
135 tmpaddr =
addr + i*dir;
137 if ( (tmpaddr & ~(wlen-1)) != (
addr & ~(wlen-1)) )
145 databyte = aligned_word[tmpaddr & (wlen-1)];
146 result_value &= ~((uint64_t)0xff << (reg_ofs * 8));
147 result_value |= (uint64_t)databyte << (reg_ofs * 8);
153 if (!store && wlen ==
sizeof(uint32_t))
154 result_value = (int32_t)result_value;
156 (*(uint64_t *)
ic->arg[0]) = result_value;