162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright (C) 2020-2022 Loongson Technology Corporation Limited
462306a36Sopenharmony_ci */
562306a36Sopenharmony_ci#include <linux/export.h>
662306a36Sopenharmony_ci#include <linux/linkage.h>
762306a36Sopenharmony_ci#include <asm/asm.h>
862306a36Sopenharmony_ci#include <asm/page.h>
962306a36Sopenharmony_ci#include <asm/regdef.h>
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci	.align 5
1262306a36Sopenharmony_ciSYM_FUNC_START(clear_page)
1362306a36Sopenharmony_ci	lu12i.w	t0, 1 << (PAGE_SHIFT - 12)
1462306a36Sopenharmony_ci	add.d	t0, t0, a0
1562306a36Sopenharmony_ci1:
1662306a36Sopenharmony_ci	st.d	zero, a0, 0
1762306a36Sopenharmony_ci	st.d	zero, a0, 8
1862306a36Sopenharmony_ci	st.d	zero, a0, 16
1962306a36Sopenharmony_ci	st.d	zero, a0, 24
2062306a36Sopenharmony_ci	st.d	zero, a0, 32
2162306a36Sopenharmony_ci	st.d	zero, a0, 40
2262306a36Sopenharmony_ci	st.d	zero, a0, 48
2362306a36Sopenharmony_ci	st.d	zero, a0, 56
2462306a36Sopenharmony_ci	addi.d	a0,   a0, 128
2562306a36Sopenharmony_ci	st.d	zero, a0, -64
2662306a36Sopenharmony_ci	st.d	zero, a0, -56
2762306a36Sopenharmony_ci	st.d	zero, a0, -48
2862306a36Sopenharmony_ci	st.d	zero, a0, -40
2962306a36Sopenharmony_ci	st.d	zero, a0, -32
3062306a36Sopenharmony_ci	st.d	zero, a0, -24
3162306a36Sopenharmony_ci	st.d	zero, a0, -16
3262306a36Sopenharmony_ci	st.d	zero, a0, -8
3362306a36Sopenharmony_ci	bne	t0,   a0, 1b
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_ci	jr	ra
3662306a36Sopenharmony_ciSYM_FUNC_END(clear_page)
3762306a36Sopenharmony_ciEXPORT_SYMBOL(clear_page)
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_ci.align 5
4062306a36Sopenharmony_ciSYM_FUNC_START(copy_page)
4162306a36Sopenharmony_ci	lu12i.w	t8, 1 << (PAGE_SHIFT - 12)
4262306a36Sopenharmony_ci	add.d	t8, t8, a0
4362306a36Sopenharmony_ci1:
4462306a36Sopenharmony_ci	ld.d	t0, a1, 0
4562306a36Sopenharmony_ci	ld.d	t1, a1, 8
4662306a36Sopenharmony_ci	ld.d	t2, a1, 16
4762306a36Sopenharmony_ci	ld.d	t3, a1, 24
4862306a36Sopenharmony_ci	ld.d	t4, a1, 32
4962306a36Sopenharmony_ci	ld.d	t5, a1, 40
5062306a36Sopenharmony_ci	ld.d	t6, a1, 48
5162306a36Sopenharmony_ci	ld.d	t7, a1, 56
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_ci	st.d	t0, a0, 0
5462306a36Sopenharmony_ci	st.d	t1, a0, 8
5562306a36Sopenharmony_ci	ld.d	t0, a1, 64
5662306a36Sopenharmony_ci	ld.d	t1, a1, 72
5762306a36Sopenharmony_ci	st.d	t2, a0, 16
5862306a36Sopenharmony_ci	st.d	t3, a0, 24
5962306a36Sopenharmony_ci	ld.d	t2, a1, 80
6062306a36Sopenharmony_ci	ld.d	t3, a1, 88
6162306a36Sopenharmony_ci	st.d	t4, a0, 32
6262306a36Sopenharmony_ci	st.d	t5, a0, 40
6362306a36Sopenharmony_ci	ld.d	t4, a1, 96
6462306a36Sopenharmony_ci	ld.d	t5, a1, 104
6562306a36Sopenharmony_ci	st.d	t6, a0, 48
6662306a36Sopenharmony_ci	st.d	t7, a0, 56
6762306a36Sopenharmony_ci	ld.d	t6, a1, 112
6862306a36Sopenharmony_ci	ld.d	t7, a1, 120
6962306a36Sopenharmony_ci	addi.d	a0, a0, 128
7062306a36Sopenharmony_ci	addi.d	a1, a1, 128
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_ci	st.d	t0, a0, -64
7362306a36Sopenharmony_ci	st.d	t1, a0, -56
7462306a36Sopenharmony_ci	st.d	t2, a0, -48
7562306a36Sopenharmony_ci	st.d	t3, a0, -40
7662306a36Sopenharmony_ci	st.d	t4, a0, -32
7762306a36Sopenharmony_ci	st.d	t5, a0, -24
7862306a36Sopenharmony_ci	st.d	t6, a0, -16
7962306a36Sopenharmony_ci	st.d	t7, a0, -8
8062306a36Sopenharmony_ci
8162306a36Sopenharmony_ci	bne	t8, a0, 1b
8262306a36Sopenharmony_ci	jr	ra
8362306a36Sopenharmony_ciSYM_FUNC_END(copy_page)
8462306a36Sopenharmony_ciEXPORT_SYMBOL(copy_page)
85