18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
28c2ecf20Sopenharmony_ci#include <linux/linkage.h>
38c2ecf20Sopenharmony_ci#include <asm/export.h>
48c2ecf20Sopenharmony_ci
58c2ecf20Sopenharmony_ci/*
68c2ecf20Sopenharmony_ci * Most CPUs support enhanced REP MOVSB/STOSB instructions. It is
78c2ecf20Sopenharmony_ci * recommended to use this when possible and we do use them by default.
88c2ecf20Sopenharmony_ci * If enhanced REP MOVSB/STOSB is not available, try to use fast string.
98c2ecf20Sopenharmony_ci * Otherwise, use original.
108c2ecf20Sopenharmony_ci */
118c2ecf20Sopenharmony_ci
128c2ecf20Sopenharmony_ci/*
138c2ecf20Sopenharmony_ci * Zero a page.
148c2ecf20Sopenharmony_ci * %rdi	- page
158c2ecf20Sopenharmony_ci */
168c2ecf20Sopenharmony_ciSYM_FUNC_START(clear_page_rep)
178c2ecf20Sopenharmony_ci	movl $4096/8,%ecx
188c2ecf20Sopenharmony_ci	xorl %eax,%eax
198c2ecf20Sopenharmony_ci	rep stosq
208c2ecf20Sopenharmony_ci	RET
218c2ecf20Sopenharmony_ciSYM_FUNC_END(clear_page_rep)
228c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(clear_page_rep)
238c2ecf20Sopenharmony_ci
248c2ecf20Sopenharmony_ciSYM_FUNC_START(clear_page_orig)
258c2ecf20Sopenharmony_ci	xorl   %eax,%eax
268c2ecf20Sopenharmony_ci	movl   $4096/64,%ecx
278c2ecf20Sopenharmony_ci	.p2align 4
288c2ecf20Sopenharmony_ci.Lloop:
298c2ecf20Sopenharmony_ci	decl	%ecx
308c2ecf20Sopenharmony_ci#define PUT(x) movq %rax,x*8(%rdi)
318c2ecf20Sopenharmony_ci	movq %rax,(%rdi)
328c2ecf20Sopenharmony_ci	PUT(1)
338c2ecf20Sopenharmony_ci	PUT(2)
348c2ecf20Sopenharmony_ci	PUT(3)
358c2ecf20Sopenharmony_ci	PUT(4)
368c2ecf20Sopenharmony_ci	PUT(5)
378c2ecf20Sopenharmony_ci	PUT(6)
388c2ecf20Sopenharmony_ci	PUT(7)
398c2ecf20Sopenharmony_ci	leaq	64(%rdi),%rdi
408c2ecf20Sopenharmony_ci	jnz	.Lloop
418c2ecf20Sopenharmony_ci	nop
428c2ecf20Sopenharmony_ci	RET
438c2ecf20Sopenharmony_ciSYM_FUNC_END(clear_page_orig)
448c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(clear_page_orig)
458c2ecf20Sopenharmony_ci
468c2ecf20Sopenharmony_ciSYM_FUNC_START(clear_page_erms)
478c2ecf20Sopenharmony_ci	movl $4096,%ecx
488c2ecf20Sopenharmony_ci	xorl %eax,%eax
498c2ecf20Sopenharmony_ci	rep stosb
508c2ecf20Sopenharmony_ci	RET
518c2ecf20Sopenharmony_ciSYM_FUNC_END(clear_page_erms)
528c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(clear_page_erms)
53