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,
129 ok = cpu->
memory_rw(cpu, cpu->
mem, 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;
struct arm_instr_call * ic
void mips_unaligned_loadstore(struct cpu *cpu, struct mips_instr_call *ic, int is_left, int wlen, int store)
#define CAUSE_EXCCODE_MASK
#define EMUL_LITTLE_ENDIAN
#define MIPS_INSTR_ALIGNMENT_SHIFT
uint64_t reg[N_MIPS_COPROC_REGS]
int(* memory_rw)(struct cpu *cpu, struct memory *mem, uint64_t vaddr, unsigned char *data, size_t len, int writeflag, int cache_flags)
#define CAUSE_EXCCODE_SHIFT
struct mips_coproc * coproc[N_MIPS_COPROCS]
#define MIPS_IC_ENTRIES_PER_PAGE