1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
#include <xen/config.h>
#include <asm/page.h>
#define src_reg %rsi
#define dst_reg %rdi
#define WORD_SIZE 8
#define tmp1_reg %r8
#define tmp2_reg %r9
#define tmp3_reg %r10
#define tmp4_reg %r11
ENTRY(copy_page_sse2)
mov $PAGE_SIZE/(4*WORD_SIZE)-3, %ecx
prefetchnta 2*4*WORD_SIZE(src_reg)
mov (src_reg), tmp1_reg
mov WORD_SIZE(src_reg), tmp2_reg
mov 2*WORD_SIZE(src_reg), tmp3_reg
mov 3*WORD_SIZE(src_reg), tmp4_reg
0: prefetchnta 3*4*WORD_SIZE(src_reg)
1: add $4*WORD_SIZE, src_reg
movnti tmp1_reg, (dst_reg)
mov (src_reg), tmp1_reg
dec %ecx
movnti tmp2_reg, WORD_SIZE(dst_reg)
mov WORD_SIZE(src_reg), tmp2_reg
movnti tmp3_reg, 2*WORD_SIZE(dst_reg)
mov 2*WORD_SIZE(src_reg), tmp3_reg
movnti tmp4_reg, 3*WORD_SIZE(dst_reg)
lea 4*WORD_SIZE(dst_reg), dst_reg
mov 3*WORD_SIZE(src_reg), tmp4_reg
jg 0b
jpe 1b
movnti tmp1_reg, (dst_reg)
movnti tmp2_reg, WORD_SIZE(dst_reg)
movnti tmp3_reg, 2*WORD_SIZE(dst_reg)
movnti tmp4_reg, 3*WORD_SIZE(dst_reg)
sfence
ret
|