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~