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~

Reply via email to