From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([140.186.70.92]:43281) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RljTT-0002lh-IR for qemu-devel@nongnu.org; Fri, 13 Jan 2012 10:55:34 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1RljTN-0001ol-Pw for qemu-devel@nongnu.org; Fri, 13 Jan 2012 10:55:27 -0500 Received: from lo.gmane.org ([80.91.229.12]:57991) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RljTN-0001oV-DS for qemu-devel@nongnu.org; Fri, 13 Jan 2012 10:55:21 -0500 Received: from list by lo.gmane.org with local (Exim 4.69) (envelope-from ) id 1RljTM-000277-5c for qemu-devel@nongnu.org; Fri, 13 Jan 2012 16:55:20 +0100 Received: from 93-34-200-238.ip51.fastwebnet.it ([93.34.200.238]) by main.gmane.org with esmtp (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Fri, 13 Jan 2012 16:55:20 +0100 Received: from pbonzini by 93-34-200-238.ip51.fastwebnet.it with local (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Fri, 13 Jan 2012 16:55:20 +0100 From: Paolo Bonzini Date: Fri, 13 Jan 2012 16:55:01 +0100 Message-ID: References: <1324653446-6929-1-git-send-email-pbonzini@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit In-Reply-To: <1324653446-6929-1-git-send-email-pbonzini@redhat.com> Subject: Re: [Qemu-devel] [PATCH v2] vectorize is_dup_page List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org On 12/23/2011 04:17 PM, 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 > --- > 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)); Ping. Paolo