1 #include "hphp/util/etch-helpers.h"
2 #include "hphp/util/hphp-config.h"
4 #if defined(__x86_64__) && defined(ENABLE_AVX2) && !defined(__APPLE__)
5 .file "memset-x64-avx2.S"
7 .globl ETCH_NAME(memset)
8 .type ETCH_NAME(memset), @function
11 ETCH_LABEL(ENTRY_MEMSET):
14 vpxor %xmm0, %xmm0, %xmm0
16 vpshufb %xmm0, %xmm1, %xmm0
20 je ETCH_LABEL(more_than_63bytes)
25 ja ETCH_LABEL(more_than_7bytes)
26 jmp *ETCH_LABEL(less_than_7bytes)(,%rax,8)
30 ETCH_LABEL(less_than_7bytes):
31 .quad ETCH_LABEL(1byte_move)
32 .quad ETCH_LABEL(2byte_move)
33 .quad ETCH_LABEL(3byte_move)
34 .quad ETCH_LABEL(4byte_move)
35 .quad ETCH_LABEL(5byte_move)
36 .quad ETCH_LABEL(6byte_move)
37 .quad ETCH_LABEL(7byte_move)
39 ETCH_LABEL(7byte_move):
41 ETCH_LABEL(6byte_move):
43 ETCH_LABEL(5byte_move):
45 ETCH_LABEL(4byte_move):
47 ETCH_LABEL(3byte_move):
49 ETCH_LABEL(2byte_move):
51 ETCH_LABEL(1byte_move):
53 ETCH_LABEL(more_than_7bytes):
55 leaq (%rcx,%rdi), %rcx
62 ja ETCH_LABEL(more_than_63bytes)
63 jmp *ETCH_LABEL(less_than_63bytes)(,%rdi,8)
67 ETCH_LABEL(less_than_63bytes):
68 .quad ETCH_LABEL(8byte_move)
69 .quad ETCH_LABEL(16byte_move)
70 .quad ETCH_LABEL(24byte_move)
71 .quad ETCH_LABEL(32byte_move)
72 .quad ETCH_LABEL(40byte_move)
73 .quad ETCH_LABEL(48byte_move)
74 .quad ETCH_LABEL(56byte_move)
76 ETCH_LABEL(56byte_move):
78 ETCH_LABEL(48byte_move):
80 ETCH_LABEL(40byte_move):
82 ETCH_LABEL(32byte_move):
84 ETCH_LABEL(24byte_move):
86 ETCH_LABEL(16byte_move):
88 ETCH_LABEL(8byte_move):
91 leaq (%rcx,%rax), %rcx
92 ETCH_LABEL(more_than_63bytes):
94 je ETCH_LABEL(EXIT_MEMSET)
96 vinserti128 $1, %xmm0, %ymm0, %ymm0
98 je ETCH_LABEL(128byte_loop_data_guzzler)
100 vmovdqu %ymm0, 0x20(%rcx)
103 je ETCH_LABEL(EXIT_MEMSET)
107 ETCH_LABEL(128byte_loop_data_guzzler):
108 vmovdqu %ymm0, (%rcx)
109 vmovdqu %ymm0, 0x20(%rcx)
110 vmovdqu %ymm0, 0x40(%rcx)
111 vmovdqu %ymm0, 0x60(%rcx)
114 ja ETCH_LABEL(128byte_loop_data_guzzler)
116 ETCH_LABEL(EXIT_MEMSET):
120 .size memset, .-memset