On Mon, Aug 13, 2012 at 07:04:02PM +0200, Borislav Petkov wrote: > On Mon, Aug 13, 2012 at 02:43:34PM +0300, Kirill A. Shutemov wrote: > > $ cat test.c > > #include <stdio.h> > > #include <sys/mman.h> > > > > #define SIZE 1024*1024*1024 > > > > void clear_page_nocache_sse2(void *page) __attribute__((regparm(1))); > > > > int main(int argc, char** argv) > > { > > char *p; > > unsigned long i, j; > > > > p = mmap(NULL, SIZE, PROT_WRITE|PROT_READ, > > MAP_PRIVATE|MAP_ANONYMOUS|MAP_POPULATE, -1, 0); > > for(j = 0; j < 100; j++) { > > for(i = 0; i < SIZE; i += 4096) { > > clear_page_nocache_sse2(p + i); > > } > > } > > > > return 0; > > } > > $ cat clear_page_nocache_unroll32.S > > .globl clear_page_nocache_sse2 > > .align 4,0x90 > > clear_page_nocache_sse2: > > .cfi_startproc > > mov %eax,%edx > > xorl %eax,%eax > > movl $4096/32,%ecx > > .p2align 4 > > .Lloop_sse2: > > decl %ecx > > #define PUT(x) movnti %eax,x*4(%edx) > > PUT(0) > > PUT(1) > > PUT(2) > > PUT(3) > > PUT(4) > > PUT(5) > > PUT(6) > > PUT(7) > > #undef PUT > > lea 32(%edx),%edx > > jnz .Lloop_sse2 > > nop > > ret > > .cfi_endproc > > .type clear_page_nocache_sse2, @function > > .size clear_page_nocache_sse2, .-clear_page_nocache_sse2 > > $ cat clear_page_nocache_unroll64.S > > .globl clear_page_nocache_sse2 > > .align 4,0x90 > > clear_page_nocache_sse2: > > .cfi_startproc > > mov %eax,%edx > > This must still be the 32-bit version becaue it segfaults here. Yes, it's test for 32-bit version. -- Kirill A. Shutemov