Il ven 9 gen 2026, 17:51 Philippe Mathieu-Daudé <[email protected]> ha
scritto:

> Introduce load/store helpers which take a MemOp argument.
>
> Inspired-by: Paolo Bonzini <[email protected]>
>

That's a new one. :)

I think they should be inline and so should be
address_space_{ld,st}m_internal (maybe even always_inline). The amount of
optimization enabled by constant MemOp is huge.

One other small change:

+    const unsigned size = memop_size(mop);
> +    uint64_t val;
>

This must be initialized to zero.

Otherwise the whole series looks great, thanks. Sorry again for delaying my
review.

Paolo

+    uint8_t *pval = (uint8_t *)&val;
> +
> +    if (HOST_BIG_ENDIAN) {
> +        pval += sizeof(val) - size;
> +    }
> +
> +    __builtin_memcpy(pval, ptr, size);
> +    if (unlikely(mop & MO_BSWAP)) {
> +        switch (size) {
> +        case sizeof(uint16_t):
> +            val = __builtin_bswap16(val);
> +            break;
> +        case sizeof(uint32_t):
> +            val = __builtin_bswap32(val);
> +            break;
> +        case sizeof(uint64_t):
> +            val = __builtin_bswap64(val);
> +            break;
> +        default:
> +            g_assert_not_reached();
> +        }
> +    }
> +    return val;
> +}
> +
> +void stm_p(void *ptr, MemOp mop, uint64_t val)
> +{
> +    const unsigned size = memop_size(mop);
> +    const uint8_t *pval = (const uint8_t *)&val;
> +
> +    if (HOST_BIG_ENDIAN) {
> +        pval += sizeof(val) - size;
> +    }
> +
> +    if (unlikely(mop & MO_BSWAP)) {
> +        switch (size) {
> +        case sizeof(uint16_t):
> +            val = __builtin_bswap16(val);
> +            break;
> +        case sizeof(uint32_t):
> +            val = __builtin_bswap32(val);
> +            break;
> +        case sizeof(uint64_t):
> +            val = __builtin_bswap64(val);
> +            break;
> +        default:
> +            g_assert_not_reached();
> +        }
> +    }
> +    __builtin_memcpy(ptr, pval, size);
> +}
> diff --git a/util/meson.build b/util/meson.build
> index 35029380a37..b695b6e4728 100644
> --- a/util/meson.build
> +++ b/util/meson.build
> @@ -38,6 +38,7 @@ util_ss.add(files('envlist.c', 'path.c', 'module.c'))
>  util_ss.add(files('event.c'))
>  util_ss.add(files('host-utils.c'))
>  util_ss.add(files('bitmap.c', 'bitops.c'))
> +util_ss.add(files('ldst.c'))
>  util_ss.add(files('fifo8.c'))
>  util_ss.add(files('cacheflush.c'))
>  util_ss.add(files('error.c', 'error-report.c'))
> --
> 2.52.0
>
>

Reply via email to