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 > >
