Hi, This series is the result of a chat with Stefan after looking at Peter response to Bibo on a problem with unoptimized memcpy() leading to atomic issues: https://www.mail-archive.com/qemu-devel@nongnu.org/msg808209.html
MIPS R6 (32/64-bit) does support unaligned accesses, but for the older releases the compiler can't optimize the __builtin_memcpy(). When a pointer is known to be aligned, we can skip the checks for misalignment and directly access the data. The pair of virtio vring fields happen to be aligned. To be able to call the aligned functions from the virtio layer, we have to fill the gap in multiple API layers. The series is decomposed as: - cleanups (1-6) - clean ldst API using macros (7-13) - add aligned ldst methods (14) - add aligned memory methods (15-16) - similar changes in virtio (17-24) - use the new methods on vring aligned values (25) There are some checkpatch errors related to the macro used. Regards, Phil. Philippe Mathieu-Daudé (25): exec/memory_ldst_cached: Sort declarations exec/memory_ldst_phys: Sort declarations exec/memory_ldst: Use correct type sizes exec/memory_ldst_phys: Use correct type sizes exec/memory_ldst_cached: Use correct type size exec/memory: Use correct type size qemu/bswap: Introduce ST_CONVERT() macro qemu/bswap: Use ST_CONVERT() macro to emit 16-bit load/store functions qemu/bswap: Introduce LD_CONVERT() macro qemu/bswap: Use LD_CONVERT macro to emit 16-bit signed load/store code qemu/bswap: Use LD_CONVERT macro to emit 16-bit unsigned load/store code qemu/bswap: Use LDST_CONVERT macro to emit 32-bit load/store functions qemu/bswap: Use LDST_CONVERT macro to emit 64-bit load/store functions qemu/bswap: Introduce load/store for aligned pointer exec/memory: Add methods for aligned pointer access (address space) exec/memory: Add methods for aligned pointer access (physical memory) hw/virtio: Use correct type sizes hw/virtio: Introduce VIRTIO_LD_CONVERT() macro hw/virtio: Use LD_CONVERT macro to emit 16-bit unsigned load/store code hw/virtio: Introduce VIRTIO_ST_CONVERT() macro hw/virtio: Use ST_CONVERT() macro to emit 16-bit load/store functions hw/virtio: Use LDST_CONVERT macro to emit 32-bit load/store functions hw/virtio: Use LDST_CONVERT macro to emit 64-bit load/store functions hw/virtio: Add methods for aligned pointer access hw/virtio: Optimize accesses on vring aligned pointers docs/devel/loads-stores.rst | 27 +-- include/exec/memory.h | 18 +- include/hw/virtio/virtio-access.h | 239 +++++++++----------------- include/qemu/bswap.h | 149 ++++++---------- include/exec/memory_ldst.h.inc | 16 +- include/exec/memory_ldst_cached.h.inc | 66 ++++--- include/exec/memory_ldst_phys.h.inc | 72 ++++---- hw/virtio/virtio.c | 13 +- memory_ldst.c.inc | 20 +-- 9 files changed, 270 insertions(+), 350 deletions(-) -- 2.26.3