On 5/2/19 7:34 AM, Yoshinori Sato wrote: > +static int32_t li(DisasContext *ctx, int sz) > +{ > + int32_t addr; > + bfd_byte buf[4]; > + addr = ctx->addr; > + > + switch (sz) { > + case 1: > + ctx->addr += 1; > + ctx->dis->read_memory_func(addr, buf, 1, ctx->dis); > + return buf[0]; > + case 2: > + ctx->addr += 2; > + ctx->dis->read_memory_func(addr, buf, 2, ctx->dis); > + return buf[1] << 8 | buf[0]; > + case 3: > + ctx->addr += 3; > + ctx->dis->read_memory_func(addr, buf, 3, ctx->dis); > + return buf[2] << 16 | buf[1] << 8 | buf[0]; > + case 0: > + ctx->addr += 4; > + ctx->dis->read_memory_func(addr, buf, 4, ctx->dis); > + return buf[3] << 24 | buf[2] << 16 | buf[1] << 8 | buf[0]; > + default: > + g_assert_not_reached(); > + } > +}
These should be computing signed values. This is already correct over in translate.c. Also, we can make use of some endian-specific unaligned load functions from <qemu/bswap.h>. So for the 4 cases: return (int8_t)buf[0]; return ldsw_le_p(buf); return (int8_t)buf[2] << 16 | buf[1] << 8 | buf[0]; return ldl_le_p(buf); r~