hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/arch/x86/lib/memmove_64.S
....@@ -8,7 +8,7 @@
88 */
99 #include <linux/linkage.h>
1010 #include <asm/cpufeatures.h>
11
-#include <asm/alternative-asm.h>
11
+#include <asm/alternative.h>
1212 #include <asm/export.h>
1313
1414 #undef memmove
....@@ -24,15 +24,10 @@
2424 * Output:
2525 * rax: dest
2626 */
27
-.weak memmove
28
-.p2align 4, 0x90
29
-memmove:
30
-ENTRY(__memmove)
27
+SYM_FUNC_START_WEAK(memmove)
28
+SYM_FUNC_START(__memmove)
3129
32
- /* Handle more 32 bytes in loop */
3330 mov %rdi, %rax
34
- cmp $0x20, %rdx
35
- jb 1f
3631
3732 /* Decide forward/backward copy mode */
3833 cmp %rdi, %rsi
....@@ -42,8 +37,10 @@
4237 cmp %rdi, %r8
4338 jg 2f
4439
40
+ /* FSRM implies ERMS => no length checks, do the copy directly */
4541 .Lmemmove_begin_forward:
46
- ALTERNATIVE "", "movq %rdx, %rcx; rep movsb; retq", X86_FEATURE_ERMS
42
+ ALTERNATIVE "cmp $0x20, %rdx; jb 1f", "", X86_FEATURE_FSRM
43
+ ALTERNATIVE "", "jmp .Lmemmove_erms", X86_FEATURE_ERMS
4744
4845 /*
4946 * movsq instruction have many startup latency
....@@ -114,6 +111,8 @@
114111 */
115112 .p2align 4
116113 2:
114
+ cmp $0x20, %rdx
115
+ jb 1f
117116 cmp $680, %rdx
118117 jb 6f
119118 cmp %dil, %sil
....@@ -206,8 +205,13 @@
206205 movb (%rsi), %r11b
207206 movb %r11b, (%rdi)
208207 13:
209
- retq
210
-ENDPROC(__memmove)
211
-ENDPROC(memmove)
208
+ RET
209
+
210
+.Lmemmove_erms:
211
+ movq %rdx, %rcx
212
+ rep movsb
213
+ RET
214
+SYM_FUNC_END(__memmove)
215
+SYM_FUNC_END_ALIAS(memmove)
212216 EXPORT_SYMBOL(__memmove)
213217 EXPORT_SYMBOL(memmove)