From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([140.186.70.92]:40147) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RlkP2-0006yU-L1 for qemu-devel@nongnu.org; Fri, 13 Jan 2012 11:54:57 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1RlkOw-0001di-TR for qemu-devel@nongnu.org; Fri, 13 Jan 2012 11:54:56 -0500 Received: from mail-iy0-f173.google.com ([209.85.210.173]:58999) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RlkOw-0001dd-OU for qemu-devel@nongnu.org; Fri, 13 Jan 2012 11:54:50 -0500 Received: by iaeo4 with SMTP id o4so3613703iae.4 for ; Fri, 13 Jan 2012 08:54:50 -0800 (PST) Message-ID: <4F1061D6.4060803@codemonkey.ws> Date: Fri, 13 Jan 2012 10:54:46 -0600 From: Anthony Liguori MIME-Version: 1.0 References: <1324653446-6929-1-git-send-email-pbonzini@redhat.com> In-Reply-To: <1324653446-6929-1-git-send-email-pbonzini@redhat.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH v2] vectorize is_dup_page List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Paolo Bonzini Cc: qemu-devel@nongnu.org On 12/23/2011 09:17 AM, Paolo Bonzini wrote: > is_dup_page is already proceeding in 32-bit chunks. Changing it > to 16 bytes using Altivec or SSE is easy. > > Signed-off-by: Paolo Bonzini Applied. Thanks. Regards, Anthony Liguori > --- > arch_init.c | 28 ++++++++++++++++++++++------ > 1 files changed, 22 insertions(+), 6 deletions(-) > > diff --git a/arch_init.c b/arch_init.c > index d4c92b0..8466ffb 100644 > --- a/arch_init.c > +++ b/arch_init.c > @@ -94,14 +94,30 @@ const uint32_t arch_type = QEMU_ARCH; > #define RAM_SAVE_FLAG_EOS 0x10 > #define RAM_SAVE_FLAG_CONTINUE 0x20 > > -static int is_dup_page(uint8_t *page, uint8_t ch) > +#ifdef __ALTIVEC__ > +#include > +#define VECTYPE vector unsigned char > +#define SPLAT(p) vec_splat(vec_ld(0, p), 0) > +#define ALL_EQ(v1, v2) vec_all_eq(v1, v2) > +#elif defined __SSE2__ > +#include > +#define VECTYPE __m128i > +#define SPLAT(p) _mm_set1_epi8(*(p)) > +#define ALL_EQ(v1, v2) (_mm_movemask_epi8(_mm_cmpeq_epi8(v1, v2)) == 0xFFFF) > +#else > +#define VECTYPE unsigned long > +#define SPLAT(p) (*(p) * (~0UL / 255)) > +#define ALL_EQ(v1, v2) ((v1) == (v2)) > +#endif > + > +static int is_dup_page(uint8_t *page) > { > - uint32_t val = ch<< 24 | ch<< 16 | ch<< 8 | ch; > - uint32_t *array = (uint32_t *)page; > + VECTYPE *p = (VECTYPE *)page; > + VECTYPE val = SPLAT(page); > int i; > > - for (i = 0; i< (TARGET_PAGE_SIZE / 4); i++) { > - if (array[i] != val) { > + for (i = 0; i< TARGET_PAGE_SIZE / sizeof(VECTYPE); i++) { > + if (!ALL_EQ(val, p[i])) { > return 0; > } > } > @@ -135,7 +151,7 @@ static int ram_save_block(QEMUFile *f) > > p = block->host + offset; > > - if (is_dup_page(p, *p)) { > + if (is_dup_page(p)) { > qemu_put_be64(f, offset | cont | RAM_SAVE_FLAG_COMPRESS); > if (!cont) { > qemu_put_byte(f, strlen(block->idstr));