From bf12583b9e0e6e61c0530b618f188a1d921dffc4 Mon Sep 17 00:00:00 2001 From: Wunkolo Date: Sat, 25 May 2024 15:47:18 -0700 Subject: [PATCH] [a64] Optimize constant vector byte-splats Detect when all bytes are repeating and use `MOVI` when applicable --- src/xenia/cpu/backend/a64/a64_emitter.cc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/xenia/cpu/backend/a64/a64_emitter.cc b/src/xenia/cpu/backend/a64/a64_emitter.cc index a3cccc231..8913da000 100644 --- a/src/xenia/cpu/backend/a64/a64_emitter.cc +++ b/src/xenia/cpu/backend/a64/a64_emitter.cc @@ -857,6 +857,10 @@ void A64Emitter::LoadConstantV(oaknut::QReg dest, const vec128_t& v) { } else if (v.low == ~uint64_t(0) && v.high == ~uint64_t(0)) { // 1111... MOVI(dest.B16(), 0xFF); + } else if (std::adjacent_find(std::cbegin(v.u8), std::cend(v.u8), + std::not_equal_to<>()) == std::cend(v.u8)) { + // 0xXX, 0xXX, 0xXX... + MOVI(dest.B16(), v.u8[0]); } else { // TODO(benvanik): see what other common values are. // TODO(benvanik): build constant table - 99% are reused.