162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright (C) 2020-2022 Loongson Technology Corporation Limited
462306a36Sopenharmony_ci */
562306a36Sopenharmony_ci#ifndef _ASM_ASMMACRO_H
662306a36Sopenharmony_ci#define _ASM_ASMMACRO_H
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#include <asm/asm-offsets.h>
962306a36Sopenharmony_ci#include <asm/regdef.h>
1062306a36Sopenharmony_ci#include <asm/fpregdef.h>
1162306a36Sopenharmony_ci#include <asm/loongarch.h>
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci	.macro	cpu_save_nonscratch thread
1462306a36Sopenharmony_ci	stptr.d	s0, \thread, THREAD_REG23
1562306a36Sopenharmony_ci	stptr.d	s1, \thread, THREAD_REG24
1662306a36Sopenharmony_ci	stptr.d	s2, \thread, THREAD_REG25
1762306a36Sopenharmony_ci	stptr.d	s3, \thread, THREAD_REG26
1862306a36Sopenharmony_ci	stptr.d	s4, \thread, THREAD_REG27
1962306a36Sopenharmony_ci	stptr.d	s5, \thread, THREAD_REG28
2062306a36Sopenharmony_ci	stptr.d	s6, \thread, THREAD_REG29
2162306a36Sopenharmony_ci	stptr.d	s7, \thread, THREAD_REG30
2262306a36Sopenharmony_ci	stptr.d	s8, \thread, THREAD_REG31
2362306a36Sopenharmony_ci	stptr.d	sp, \thread, THREAD_REG03
2462306a36Sopenharmony_ci	stptr.d	fp, \thread, THREAD_REG22
2562306a36Sopenharmony_ci	.endm
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_ci	.macro	cpu_restore_nonscratch thread
2862306a36Sopenharmony_ci	ldptr.d	s0, \thread, THREAD_REG23
2962306a36Sopenharmony_ci	ldptr.d	s1, \thread, THREAD_REG24
3062306a36Sopenharmony_ci	ldptr.d	s2, \thread, THREAD_REG25
3162306a36Sopenharmony_ci	ldptr.d	s3, \thread, THREAD_REG26
3262306a36Sopenharmony_ci	ldptr.d	s4, \thread, THREAD_REG27
3362306a36Sopenharmony_ci	ldptr.d	s5, \thread, THREAD_REG28
3462306a36Sopenharmony_ci	ldptr.d	s6, \thread, THREAD_REG29
3562306a36Sopenharmony_ci	ldptr.d	s7, \thread, THREAD_REG30
3662306a36Sopenharmony_ci	ldptr.d	s8, \thread, THREAD_REG31
3762306a36Sopenharmony_ci	ldptr.d	ra, \thread, THREAD_REG01
3862306a36Sopenharmony_ci	ldptr.d	sp, \thread, THREAD_REG03
3962306a36Sopenharmony_ci	ldptr.d	fp, \thread, THREAD_REG22
4062306a36Sopenharmony_ci	.endm
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_ci	.macro fpu_save_csr thread tmp
4362306a36Sopenharmony_ci	movfcsr2gr	\tmp, fcsr0
4462306a36Sopenharmony_ci	stptr.w		\tmp, \thread, THREAD_FCSR
4562306a36Sopenharmony_ci#ifdef CONFIG_CPU_HAS_LBT
4662306a36Sopenharmony_ci	/* TM bit is always 0 if LBT not supported */
4762306a36Sopenharmony_ci	andi		\tmp, \tmp, FPU_CSR_TM
4862306a36Sopenharmony_ci	beqz		\tmp, 1f
4962306a36Sopenharmony_ci	/* Save FTOP */
5062306a36Sopenharmony_ci	x86mftop	\tmp
5162306a36Sopenharmony_ci	stptr.w		\tmp, \thread, THREAD_FTOP
5262306a36Sopenharmony_ci	/* Turn off TM to ensure the order of FPR in memory independent of TM */
5362306a36Sopenharmony_ci	x86clrtm
5462306a36Sopenharmony_ci1:
5562306a36Sopenharmony_ci#endif
5662306a36Sopenharmony_ci	.endm
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_ci	.macro fpu_restore_csr thread tmp0 tmp1
5962306a36Sopenharmony_ci	ldptr.w		\tmp0, \thread, THREAD_FCSR
6062306a36Sopenharmony_ci	movgr2fcsr	fcsr0, \tmp0
6162306a36Sopenharmony_ci#ifdef CONFIG_CPU_HAS_LBT
6262306a36Sopenharmony_ci	/* TM bit is always 0 if LBT not supported */
6362306a36Sopenharmony_ci	andi		\tmp0, \tmp0, FPU_CSR_TM
6462306a36Sopenharmony_ci	beqz		\tmp0, 2f
6562306a36Sopenharmony_ci	/* Restore FTOP */
6662306a36Sopenharmony_ci	ldptr.w		\tmp0, \thread, THREAD_FTOP
6762306a36Sopenharmony_ci	andi		\tmp0, \tmp0, 0x7
6862306a36Sopenharmony_ci	la.pcrel	\tmp1, 1f
6962306a36Sopenharmony_ci	alsl.d		\tmp1, \tmp0, \tmp1, 3
7062306a36Sopenharmony_ci	jr		\tmp1
7162306a36Sopenharmony_ci1:
7262306a36Sopenharmony_ci	x86mttop	0
7362306a36Sopenharmony_ci	b	2f
7462306a36Sopenharmony_ci	x86mttop	1
7562306a36Sopenharmony_ci	b	2f
7662306a36Sopenharmony_ci	x86mttop	2
7762306a36Sopenharmony_ci	b	2f
7862306a36Sopenharmony_ci	x86mttop	3
7962306a36Sopenharmony_ci	b	2f
8062306a36Sopenharmony_ci	x86mttop	4
8162306a36Sopenharmony_ci	b	2f
8262306a36Sopenharmony_ci	x86mttop	5
8362306a36Sopenharmony_ci	b	2f
8462306a36Sopenharmony_ci	x86mttop	6
8562306a36Sopenharmony_ci	b	2f
8662306a36Sopenharmony_ci	x86mttop	7
8762306a36Sopenharmony_ci2:
8862306a36Sopenharmony_ci#endif
8962306a36Sopenharmony_ci	.endm
9062306a36Sopenharmony_ci
9162306a36Sopenharmony_ci	.macro fpu_save_cc thread tmp0 tmp1
9262306a36Sopenharmony_ci	movcf2gr	\tmp0, $fcc0
9362306a36Sopenharmony_ci	move	\tmp1, \tmp0
9462306a36Sopenharmony_ci	movcf2gr	\tmp0, $fcc1
9562306a36Sopenharmony_ci	bstrins.d	\tmp1, \tmp0, 15, 8
9662306a36Sopenharmony_ci	movcf2gr	\tmp0, $fcc2
9762306a36Sopenharmony_ci	bstrins.d	\tmp1, \tmp0, 23, 16
9862306a36Sopenharmony_ci	movcf2gr	\tmp0, $fcc3
9962306a36Sopenharmony_ci	bstrins.d	\tmp1, \tmp0, 31, 24
10062306a36Sopenharmony_ci	movcf2gr	\tmp0, $fcc4
10162306a36Sopenharmony_ci	bstrins.d	\tmp1, \tmp0, 39, 32
10262306a36Sopenharmony_ci	movcf2gr	\tmp0, $fcc5
10362306a36Sopenharmony_ci	bstrins.d	\tmp1, \tmp0, 47, 40
10462306a36Sopenharmony_ci	movcf2gr	\tmp0, $fcc6
10562306a36Sopenharmony_ci	bstrins.d	\tmp1, \tmp0, 55, 48
10662306a36Sopenharmony_ci	movcf2gr	\tmp0, $fcc7
10762306a36Sopenharmony_ci	bstrins.d	\tmp1, \tmp0, 63, 56
10862306a36Sopenharmony_ci	stptr.d		\tmp1, \thread, THREAD_FCC
10962306a36Sopenharmony_ci	.endm
11062306a36Sopenharmony_ci
11162306a36Sopenharmony_ci	.macro fpu_restore_cc thread tmp0 tmp1
11262306a36Sopenharmony_ci	ldptr.d	\tmp0, \thread, THREAD_FCC
11362306a36Sopenharmony_ci	bstrpick.d	\tmp1, \tmp0, 7, 0
11462306a36Sopenharmony_ci	movgr2cf	$fcc0, \tmp1
11562306a36Sopenharmony_ci	bstrpick.d	\tmp1, \tmp0, 15, 8
11662306a36Sopenharmony_ci	movgr2cf	$fcc1, \tmp1
11762306a36Sopenharmony_ci	bstrpick.d	\tmp1, \tmp0, 23, 16
11862306a36Sopenharmony_ci	movgr2cf	$fcc2, \tmp1
11962306a36Sopenharmony_ci	bstrpick.d	\tmp1, \tmp0, 31, 24
12062306a36Sopenharmony_ci	movgr2cf	$fcc3, \tmp1
12162306a36Sopenharmony_ci	bstrpick.d	\tmp1, \tmp0, 39, 32
12262306a36Sopenharmony_ci	movgr2cf	$fcc4, \tmp1
12362306a36Sopenharmony_ci	bstrpick.d	\tmp1, \tmp0, 47, 40
12462306a36Sopenharmony_ci	movgr2cf	$fcc5, \tmp1
12562306a36Sopenharmony_ci	bstrpick.d	\tmp1, \tmp0, 55, 48
12662306a36Sopenharmony_ci	movgr2cf	$fcc6, \tmp1
12762306a36Sopenharmony_ci	bstrpick.d	\tmp1, \tmp0, 63, 56
12862306a36Sopenharmony_ci	movgr2cf	$fcc7, \tmp1
12962306a36Sopenharmony_ci	.endm
13062306a36Sopenharmony_ci
13162306a36Sopenharmony_ci	.macro	fpu_save_double thread tmp
13262306a36Sopenharmony_ci	li.w	\tmp, THREAD_FPR0
13362306a36Sopenharmony_ci	PTR_ADD \tmp, \tmp, \thread
13462306a36Sopenharmony_ci	fst.d	$f0, \tmp, THREAD_FPR0  - THREAD_FPR0
13562306a36Sopenharmony_ci	fst.d	$f1, \tmp, THREAD_FPR1  - THREAD_FPR0
13662306a36Sopenharmony_ci	fst.d	$f2, \tmp, THREAD_FPR2  - THREAD_FPR0
13762306a36Sopenharmony_ci	fst.d	$f3, \tmp, THREAD_FPR3  - THREAD_FPR0
13862306a36Sopenharmony_ci	fst.d	$f4, \tmp, THREAD_FPR4  - THREAD_FPR0
13962306a36Sopenharmony_ci	fst.d	$f5, \tmp, THREAD_FPR5  - THREAD_FPR0
14062306a36Sopenharmony_ci	fst.d	$f6, \tmp, THREAD_FPR6  - THREAD_FPR0
14162306a36Sopenharmony_ci	fst.d	$f7, \tmp, THREAD_FPR7  - THREAD_FPR0
14262306a36Sopenharmony_ci	fst.d	$f8, \tmp, THREAD_FPR8  - THREAD_FPR0
14362306a36Sopenharmony_ci	fst.d	$f9, \tmp, THREAD_FPR9  - THREAD_FPR0
14462306a36Sopenharmony_ci	fst.d	$f10, \tmp, THREAD_FPR10 - THREAD_FPR0
14562306a36Sopenharmony_ci	fst.d	$f11, \tmp, THREAD_FPR11 - THREAD_FPR0
14662306a36Sopenharmony_ci	fst.d	$f12, \tmp, THREAD_FPR12 - THREAD_FPR0
14762306a36Sopenharmony_ci	fst.d	$f13, \tmp, THREAD_FPR13 - THREAD_FPR0
14862306a36Sopenharmony_ci	fst.d	$f14, \tmp, THREAD_FPR14 - THREAD_FPR0
14962306a36Sopenharmony_ci	fst.d	$f15, \tmp, THREAD_FPR15 - THREAD_FPR0
15062306a36Sopenharmony_ci	fst.d	$f16, \tmp, THREAD_FPR16 - THREAD_FPR0
15162306a36Sopenharmony_ci	fst.d	$f17, \tmp, THREAD_FPR17 - THREAD_FPR0
15262306a36Sopenharmony_ci	fst.d	$f18, \tmp, THREAD_FPR18 - THREAD_FPR0
15362306a36Sopenharmony_ci	fst.d	$f19, \tmp, THREAD_FPR19 - THREAD_FPR0
15462306a36Sopenharmony_ci	fst.d	$f20, \tmp, THREAD_FPR20 - THREAD_FPR0
15562306a36Sopenharmony_ci	fst.d	$f21, \tmp, THREAD_FPR21 - THREAD_FPR0
15662306a36Sopenharmony_ci	fst.d	$f22, \tmp, THREAD_FPR22 - THREAD_FPR0
15762306a36Sopenharmony_ci	fst.d	$f23, \tmp, THREAD_FPR23 - THREAD_FPR0
15862306a36Sopenharmony_ci	fst.d	$f24, \tmp, THREAD_FPR24 - THREAD_FPR0
15962306a36Sopenharmony_ci	fst.d	$f25, \tmp, THREAD_FPR25 - THREAD_FPR0
16062306a36Sopenharmony_ci	fst.d	$f26, \tmp, THREAD_FPR26 - THREAD_FPR0
16162306a36Sopenharmony_ci	fst.d	$f27, \tmp, THREAD_FPR27 - THREAD_FPR0
16262306a36Sopenharmony_ci	fst.d	$f28, \tmp, THREAD_FPR28 - THREAD_FPR0
16362306a36Sopenharmony_ci	fst.d	$f29, \tmp, THREAD_FPR29 - THREAD_FPR0
16462306a36Sopenharmony_ci	fst.d	$f30, \tmp, THREAD_FPR30 - THREAD_FPR0
16562306a36Sopenharmony_ci	fst.d	$f31, \tmp, THREAD_FPR31 - THREAD_FPR0
16662306a36Sopenharmony_ci	.endm
16762306a36Sopenharmony_ci
16862306a36Sopenharmony_ci	.macro	fpu_restore_double thread tmp
16962306a36Sopenharmony_ci	li.w	\tmp, THREAD_FPR0
17062306a36Sopenharmony_ci	PTR_ADD \tmp, \tmp, \thread
17162306a36Sopenharmony_ci	fld.d	$f0, \tmp, THREAD_FPR0  - THREAD_FPR0
17262306a36Sopenharmony_ci	fld.d	$f1, \tmp, THREAD_FPR1  - THREAD_FPR0
17362306a36Sopenharmony_ci	fld.d	$f2, \tmp, THREAD_FPR2  - THREAD_FPR0
17462306a36Sopenharmony_ci	fld.d	$f3, \tmp, THREAD_FPR3  - THREAD_FPR0
17562306a36Sopenharmony_ci	fld.d	$f4, \tmp, THREAD_FPR4  - THREAD_FPR0
17662306a36Sopenharmony_ci	fld.d	$f5, \tmp, THREAD_FPR5  - THREAD_FPR0
17762306a36Sopenharmony_ci	fld.d	$f6, \tmp, THREAD_FPR6  - THREAD_FPR0
17862306a36Sopenharmony_ci	fld.d	$f7, \tmp, THREAD_FPR7  - THREAD_FPR0
17962306a36Sopenharmony_ci	fld.d	$f8, \tmp, THREAD_FPR8  - THREAD_FPR0
18062306a36Sopenharmony_ci	fld.d	$f9, \tmp, THREAD_FPR9  - THREAD_FPR0
18162306a36Sopenharmony_ci	fld.d	$f10, \tmp, THREAD_FPR10 - THREAD_FPR0
18262306a36Sopenharmony_ci	fld.d	$f11, \tmp, THREAD_FPR11 - THREAD_FPR0
18362306a36Sopenharmony_ci	fld.d	$f12, \tmp, THREAD_FPR12 - THREAD_FPR0
18462306a36Sopenharmony_ci	fld.d	$f13, \tmp, THREAD_FPR13 - THREAD_FPR0
18562306a36Sopenharmony_ci	fld.d	$f14, \tmp, THREAD_FPR14 - THREAD_FPR0
18662306a36Sopenharmony_ci	fld.d	$f15, \tmp, THREAD_FPR15 - THREAD_FPR0
18762306a36Sopenharmony_ci	fld.d	$f16, \tmp, THREAD_FPR16 - THREAD_FPR0
18862306a36Sopenharmony_ci	fld.d	$f17, \tmp, THREAD_FPR17 - THREAD_FPR0
18962306a36Sopenharmony_ci	fld.d	$f18, \tmp, THREAD_FPR18 - THREAD_FPR0
19062306a36Sopenharmony_ci	fld.d	$f19, \tmp, THREAD_FPR19 - THREAD_FPR0
19162306a36Sopenharmony_ci	fld.d	$f20, \tmp, THREAD_FPR20 - THREAD_FPR0
19262306a36Sopenharmony_ci	fld.d	$f21, \tmp, THREAD_FPR21 - THREAD_FPR0
19362306a36Sopenharmony_ci	fld.d	$f22, \tmp, THREAD_FPR22 - THREAD_FPR0
19462306a36Sopenharmony_ci	fld.d	$f23, \tmp, THREAD_FPR23 - THREAD_FPR0
19562306a36Sopenharmony_ci	fld.d	$f24, \tmp, THREAD_FPR24 - THREAD_FPR0
19662306a36Sopenharmony_ci	fld.d	$f25, \tmp, THREAD_FPR25 - THREAD_FPR0
19762306a36Sopenharmony_ci	fld.d	$f26, \tmp, THREAD_FPR26 - THREAD_FPR0
19862306a36Sopenharmony_ci	fld.d	$f27, \tmp, THREAD_FPR27 - THREAD_FPR0
19962306a36Sopenharmony_ci	fld.d	$f28, \tmp, THREAD_FPR28 - THREAD_FPR0
20062306a36Sopenharmony_ci	fld.d	$f29, \tmp, THREAD_FPR29 - THREAD_FPR0
20162306a36Sopenharmony_ci	fld.d	$f30, \tmp, THREAD_FPR30 - THREAD_FPR0
20262306a36Sopenharmony_ci	fld.d	$f31, \tmp, THREAD_FPR31 - THREAD_FPR0
20362306a36Sopenharmony_ci	.endm
20462306a36Sopenharmony_ci
20562306a36Sopenharmony_ci	.macro	lsx_save_data thread tmp
20662306a36Sopenharmony_ci	li.w	\tmp, THREAD_FPR0
20762306a36Sopenharmony_ci	PTR_ADD \tmp, \thread, \tmp
20862306a36Sopenharmony_ci	vst	$vr0, \tmp, THREAD_FPR0  - THREAD_FPR0
20962306a36Sopenharmony_ci	vst	$vr1, \tmp, THREAD_FPR1  - THREAD_FPR0
21062306a36Sopenharmony_ci	vst	$vr2, \tmp, THREAD_FPR2  - THREAD_FPR0
21162306a36Sopenharmony_ci	vst	$vr3, \tmp, THREAD_FPR3  - THREAD_FPR0
21262306a36Sopenharmony_ci	vst	$vr4, \tmp, THREAD_FPR4  - THREAD_FPR0
21362306a36Sopenharmony_ci	vst	$vr5, \tmp, THREAD_FPR5  - THREAD_FPR0
21462306a36Sopenharmony_ci	vst	$vr6, \tmp, THREAD_FPR6  - THREAD_FPR0
21562306a36Sopenharmony_ci	vst	$vr7, \tmp, THREAD_FPR7  - THREAD_FPR0
21662306a36Sopenharmony_ci	vst	$vr8, \tmp, THREAD_FPR8  - THREAD_FPR0
21762306a36Sopenharmony_ci	vst	$vr9, \tmp, THREAD_FPR9  - THREAD_FPR0
21862306a36Sopenharmony_ci	vst	$vr10, \tmp, THREAD_FPR10 - THREAD_FPR0
21962306a36Sopenharmony_ci	vst	$vr11, \tmp, THREAD_FPR11 - THREAD_FPR0
22062306a36Sopenharmony_ci	vst	$vr12, \tmp, THREAD_FPR12 - THREAD_FPR0
22162306a36Sopenharmony_ci	vst	$vr13, \tmp, THREAD_FPR13 - THREAD_FPR0
22262306a36Sopenharmony_ci	vst	$vr14, \tmp, THREAD_FPR14 - THREAD_FPR0
22362306a36Sopenharmony_ci	vst	$vr15, \tmp, THREAD_FPR15 - THREAD_FPR0
22462306a36Sopenharmony_ci	vst	$vr16, \tmp, THREAD_FPR16 - THREAD_FPR0
22562306a36Sopenharmony_ci	vst	$vr17, \tmp, THREAD_FPR17 - THREAD_FPR0
22662306a36Sopenharmony_ci	vst	$vr18, \tmp, THREAD_FPR18 - THREAD_FPR0
22762306a36Sopenharmony_ci	vst	$vr19, \tmp, THREAD_FPR19 - THREAD_FPR0
22862306a36Sopenharmony_ci	vst	$vr20, \tmp, THREAD_FPR20 - THREAD_FPR0
22962306a36Sopenharmony_ci	vst	$vr21, \tmp, THREAD_FPR21 - THREAD_FPR0
23062306a36Sopenharmony_ci	vst	$vr22, \tmp, THREAD_FPR22 - THREAD_FPR0
23162306a36Sopenharmony_ci	vst	$vr23, \tmp, THREAD_FPR23 - THREAD_FPR0
23262306a36Sopenharmony_ci	vst	$vr24, \tmp, THREAD_FPR24 - THREAD_FPR0
23362306a36Sopenharmony_ci	vst	$vr25, \tmp, THREAD_FPR25 - THREAD_FPR0
23462306a36Sopenharmony_ci	vst	$vr26, \tmp, THREAD_FPR26 - THREAD_FPR0
23562306a36Sopenharmony_ci	vst	$vr27, \tmp, THREAD_FPR27 - THREAD_FPR0
23662306a36Sopenharmony_ci	vst	$vr28, \tmp, THREAD_FPR28 - THREAD_FPR0
23762306a36Sopenharmony_ci	vst	$vr29, \tmp, THREAD_FPR29 - THREAD_FPR0
23862306a36Sopenharmony_ci	vst	$vr30, \tmp, THREAD_FPR30 - THREAD_FPR0
23962306a36Sopenharmony_ci	vst	$vr31, \tmp, THREAD_FPR31 - THREAD_FPR0
24062306a36Sopenharmony_ci	.endm
24162306a36Sopenharmony_ci
24262306a36Sopenharmony_ci	.macro	lsx_restore_data thread tmp
24362306a36Sopenharmony_ci	li.w	\tmp, THREAD_FPR0
24462306a36Sopenharmony_ci	PTR_ADD	\tmp, \thread, \tmp
24562306a36Sopenharmony_ci	vld	$vr0, \tmp, THREAD_FPR0  - THREAD_FPR0
24662306a36Sopenharmony_ci	vld	$vr1, \tmp, THREAD_FPR1  - THREAD_FPR0
24762306a36Sopenharmony_ci	vld	$vr2, \tmp, THREAD_FPR2  - THREAD_FPR0
24862306a36Sopenharmony_ci	vld	$vr3, \tmp, THREAD_FPR3  - THREAD_FPR0
24962306a36Sopenharmony_ci	vld	$vr4, \tmp, THREAD_FPR4  - THREAD_FPR0
25062306a36Sopenharmony_ci	vld	$vr5, \tmp, THREAD_FPR5  - THREAD_FPR0
25162306a36Sopenharmony_ci	vld	$vr6, \tmp, THREAD_FPR6  - THREAD_FPR0
25262306a36Sopenharmony_ci	vld	$vr7, \tmp, THREAD_FPR7  - THREAD_FPR0
25362306a36Sopenharmony_ci	vld	$vr8, \tmp, THREAD_FPR8  - THREAD_FPR0
25462306a36Sopenharmony_ci	vld	$vr9, \tmp, THREAD_FPR9  - THREAD_FPR0
25562306a36Sopenharmony_ci	vld	$vr10, \tmp, THREAD_FPR10 - THREAD_FPR0
25662306a36Sopenharmony_ci	vld	$vr11, \tmp, THREAD_FPR11 - THREAD_FPR0
25762306a36Sopenharmony_ci	vld	$vr12, \tmp, THREAD_FPR12 - THREAD_FPR0
25862306a36Sopenharmony_ci	vld	$vr13, \tmp, THREAD_FPR13 - THREAD_FPR0
25962306a36Sopenharmony_ci	vld	$vr14, \tmp, THREAD_FPR14 - THREAD_FPR0
26062306a36Sopenharmony_ci	vld	$vr15, \tmp, THREAD_FPR15 - THREAD_FPR0
26162306a36Sopenharmony_ci	vld	$vr16, \tmp, THREAD_FPR16 - THREAD_FPR0
26262306a36Sopenharmony_ci	vld	$vr17, \tmp, THREAD_FPR17 - THREAD_FPR0
26362306a36Sopenharmony_ci	vld	$vr18, \tmp, THREAD_FPR18 - THREAD_FPR0
26462306a36Sopenharmony_ci	vld	$vr19, \tmp, THREAD_FPR19 - THREAD_FPR0
26562306a36Sopenharmony_ci	vld	$vr20, \tmp, THREAD_FPR20 - THREAD_FPR0
26662306a36Sopenharmony_ci	vld	$vr21, \tmp, THREAD_FPR21 - THREAD_FPR0
26762306a36Sopenharmony_ci	vld	$vr22, \tmp, THREAD_FPR22 - THREAD_FPR0
26862306a36Sopenharmony_ci	vld	$vr23, \tmp, THREAD_FPR23 - THREAD_FPR0
26962306a36Sopenharmony_ci	vld	$vr24, \tmp, THREAD_FPR24 - THREAD_FPR0
27062306a36Sopenharmony_ci	vld	$vr25, \tmp, THREAD_FPR25 - THREAD_FPR0
27162306a36Sopenharmony_ci	vld	$vr26, \tmp, THREAD_FPR26 - THREAD_FPR0
27262306a36Sopenharmony_ci	vld	$vr27, \tmp, THREAD_FPR27 - THREAD_FPR0
27362306a36Sopenharmony_ci	vld	$vr28, \tmp, THREAD_FPR28 - THREAD_FPR0
27462306a36Sopenharmony_ci	vld	$vr29, \tmp, THREAD_FPR29 - THREAD_FPR0
27562306a36Sopenharmony_ci	vld	$vr30, \tmp, THREAD_FPR30 - THREAD_FPR0
27662306a36Sopenharmony_ci	vld	$vr31, \tmp, THREAD_FPR31 - THREAD_FPR0
27762306a36Sopenharmony_ci	.endm
27862306a36Sopenharmony_ci
27962306a36Sopenharmony_ci	.macro	lsx_save_all	thread tmp0 tmp1
28062306a36Sopenharmony_ci	fpu_save_cc		\thread, \tmp0, \tmp1
28162306a36Sopenharmony_ci	fpu_save_csr		\thread, \tmp0
28262306a36Sopenharmony_ci	lsx_save_data		\thread, \tmp0
28362306a36Sopenharmony_ci	.endm
28462306a36Sopenharmony_ci
28562306a36Sopenharmony_ci	.macro	lsx_restore_all	thread tmp0 tmp1
28662306a36Sopenharmony_ci	lsx_restore_data	\thread, \tmp0
28762306a36Sopenharmony_ci	fpu_restore_cc		\thread, \tmp0, \tmp1
28862306a36Sopenharmony_ci	fpu_restore_csr		\thread, \tmp0, \tmp1
28962306a36Sopenharmony_ci	.endm
29062306a36Sopenharmony_ci
29162306a36Sopenharmony_ci	.macro	lsx_save_upper vd base tmp off
29262306a36Sopenharmony_ci	vpickve2gr.d	\tmp, \vd, 1
29362306a36Sopenharmony_ci	st.d		\tmp, \base, (\off+8)
29462306a36Sopenharmony_ci	.endm
29562306a36Sopenharmony_ci
29662306a36Sopenharmony_ci	.macro	lsx_save_all_upper thread base tmp
29762306a36Sopenharmony_ci	li.w		\tmp, THREAD_FPR0
29862306a36Sopenharmony_ci	PTR_ADD		\base, \thread, \tmp
29962306a36Sopenharmony_ci	lsx_save_upper	$vr0,  \base, \tmp, (THREAD_FPR0-THREAD_FPR0)
30062306a36Sopenharmony_ci	lsx_save_upper	$vr1,  \base, \tmp, (THREAD_FPR1-THREAD_FPR0)
30162306a36Sopenharmony_ci	lsx_save_upper	$vr2,  \base, \tmp, (THREAD_FPR2-THREAD_FPR0)
30262306a36Sopenharmony_ci	lsx_save_upper	$vr3,  \base, \tmp, (THREAD_FPR3-THREAD_FPR0)
30362306a36Sopenharmony_ci	lsx_save_upper	$vr4,  \base, \tmp, (THREAD_FPR4-THREAD_FPR0)
30462306a36Sopenharmony_ci	lsx_save_upper	$vr5,  \base, \tmp, (THREAD_FPR5-THREAD_FPR0)
30562306a36Sopenharmony_ci	lsx_save_upper	$vr6,  \base, \tmp, (THREAD_FPR6-THREAD_FPR0)
30662306a36Sopenharmony_ci	lsx_save_upper	$vr7,  \base, \tmp, (THREAD_FPR7-THREAD_FPR0)
30762306a36Sopenharmony_ci	lsx_save_upper	$vr8,  \base, \tmp, (THREAD_FPR8-THREAD_FPR0)
30862306a36Sopenharmony_ci	lsx_save_upper	$vr9,  \base, \tmp, (THREAD_FPR9-THREAD_FPR0)
30962306a36Sopenharmony_ci	lsx_save_upper	$vr10, \base, \tmp, (THREAD_FPR10-THREAD_FPR0)
31062306a36Sopenharmony_ci	lsx_save_upper	$vr11, \base, \tmp, (THREAD_FPR11-THREAD_FPR0)
31162306a36Sopenharmony_ci	lsx_save_upper	$vr12, \base, \tmp, (THREAD_FPR12-THREAD_FPR0)
31262306a36Sopenharmony_ci	lsx_save_upper	$vr13, \base, \tmp, (THREAD_FPR13-THREAD_FPR0)
31362306a36Sopenharmony_ci	lsx_save_upper	$vr14, \base, \tmp, (THREAD_FPR14-THREAD_FPR0)
31462306a36Sopenharmony_ci	lsx_save_upper	$vr15, \base, \tmp, (THREAD_FPR15-THREAD_FPR0)
31562306a36Sopenharmony_ci	lsx_save_upper	$vr16, \base, \tmp, (THREAD_FPR16-THREAD_FPR0)
31662306a36Sopenharmony_ci	lsx_save_upper	$vr17, \base, \tmp, (THREAD_FPR17-THREAD_FPR0)
31762306a36Sopenharmony_ci	lsx_save_upper	$vr18, \base, \tmp, (THREAD_FPR18-THREAD_FPR0)
31862306a36Sopenharmony_ci	lsx_save_upper	$vr19, \base, \tmp, (THREAD_FPR19-THREAD_FPR0)
31962306a36Sopenharmony_ci	lsx_save_upper	$vr20, \base, \tmp, (THREAD_FPR20-THREAD_FPR0)
32062306a36Sopenharmony_ci	lsx_save_upper	$vr21, \base, \tmp, (THREAD_FPR21-THREAD_FPR0)
32162306a36Sopenharmony_ci	lsx_save_upper	$vr22, \base, \tmp, (THREAD_FPR22-THREAD_FPR0)
32262306a36Sopenharmony_ci	lsx_save_upper	$vr23, \base, \tmp, (THREAD_FPR23-THREAD_FPR0)
32362306a36Sopenharmony_ci	lsx_save_upper	$vr24, \base, \tmp, (THREAD_FPR24-THREAD_FPR0)
32462306a36Sopenharmony_ci	lsx_save_upper	$vr25, \base, \tmp, (THREAD_FPR25-THREAD_FPR0)
32562306a36Sopenharmony_ci	lsx_save_upper	$vr26, \base, \tmp, (THREAD_FPR26-THREAD_FPR0)
32662306a36Sopenharmony_ci	lsx_save_upper	$vr27, \base, \tmp, (THREAD_FPR27-THREAD_FPR0)
32762306a36Sopenharmony_ci	lsx_save_upper	$vr28, \base, \tmp, (THREAD_FPR28-THREAD_FPR0)
32862306a36Sopenharmony_ci	lsx_save_upper	$vr29, \base, \tmp, (THREAD_FPR29-THREAD_FPR0)
32962306a36Sopenharmony_ci	lsx_save_upper	$vr30, \base, \tmp, (THREAD_FPR30-THREAD_FPR0)
33062306a36Sopenharmony_ci	lsx_save_upper	$vr31, \base, \tmp, (THREAD_FPR31-THREAD_FPR0)
33162306a36Sopenharmony_ci	.endm
33262306a36Sopenharmony_ci
33362306a36Sopenharmony_ci	.macro	lsx_restore_upper vd base tmp off
33462306a36Sopenharmony_ci	ld.d		\tmp, \base, (\off+8)
33562306a36Sopenharmony_ci	vinsgr2vr.d	\vd,  \tmp, 1
33662306a36Sopenharmony_ci	.endm
33762306a36Sopenharmony_ci
33862306a36Sopenharmony_ci	.macro	lsx_restore_all_upper thread base tmp
33962306a36Sopenharmony_ci	li.w		  \tmp, THREAD_FPR0
34062306a36Sopenharmony_ci	PTR_ADD		  \base, \thread, \tmp
34162306a36Sopenharmony_ci	lsx_restore_upper $vr0,  \base, \tmp, (THREAD_FPR0-THREAD_FPR0)
34262306a36Sopenharmony_ci	lsx_restore_upper $vr1,  \base, \tmp, (THREAD_FPR1-THREAD_FPR0)
34362306a36Sopenharmony_ci	lsx_restore_upper $vr2,  \base, \tmp, (THREAD_FPR2-THREAD_FPR0)
34462306a36Sopenharmony_ci	lsx_restore_upper $vr3,  \base, \tmp, (THREAD_FPR3-THREAD_FPR0)
34562306a36Sopenharmony_ci	lsx_restore_upper $vr4,  \base, \tmp, (THREAD_FPR4-THREAD_FPR0)
34662306a36Sopenharmony_ci	lsx_restore_upper $vr5,  \base, \tmp, (THREAD_FPR5-THREAD_FPR0)
34762306a36Sopenharmony_ci	lsx_restore_upper $vr6,  \base, \tmp, (THREAD_FPR6-THREAD_FPR0)
34862306a36Sopenharmony_ci	lsx_restore_upper $vr7,  \base, \tmp, (THREAD_FPR7-THREAD_FPR0)
34962306a36Sopenharmony_ci	lsx_restore_upper $vr8,  \base, \tmp, (THREAD_FPR8-THREAD_FPR0)
35062306a36Sopenharmony_ci	lsx_restore_upper $vr9,  \base, \tmp, (THREAD_FPR9-THREAD_FPR0)
35162306a36Sopenharmony_ci	lsx_restore_upper $vr10, \base, \tmp, (THREAD_FPR10-THREAD_FPR0)
35262306a36Sopenharmony_ci	lsx_restore_upper $vr11, \base, \tmp, (THREAD_FPR11-THREAD_FPR0)
35362306a36Sopenharmony_ci	lsx_restore_upper $vr12, \base, \tmp, (THREAD_FPR12-THREAD_FPR0)
35462306a36Sopenharmony_ci	lsx_restore_upper $vr13, \base, \tmp, (THREAD_FPR13-THREAD_FPR0)
35562306a36Sopenharmony_ci	lsx_restore_upper $vr14, \base, \tmp, (THREAD_FPR14-THREAD_FPR0)
35662306a36Sopenharmony_ci	lsx_restore_upper $vr15, \base, \tmp, (THREAD_FPR15-THREAD_FPR0)
35762306a36Sopenharmony_ci	lsx_restore_upper $vr16, \base, \tmp, (THREAD_FPR16-THREAD_FPR0)
35862306a36Sopenharmony_ci	lsx_restore_upper $vr17, \base, \tmp, (THREAD_FPR17-THREAD_FPR0)
35962306a36Sopenharmony_ci	lsx_restore_upper $vr18, \base, \tmp, (THREAD_FPR18-THREAD_FPR0)
36062306a36Sopenharmony_ci	lsx_restore_upper $vr19, \base, \tmp, (THREAD_FPR19-THREAD_FPR0)
36162306a36Sopenharmony_ci	lsx_restore_upper $vr20, \base, \tmp, (THREAD_FPR20-THREAD_FPR0)
36262306a36Sopenharmony_ci	lsx_restore_upper $vr21, \base, \tmp, (THREAD_FPR21-THREAD_FPR0)
36362306a36Sopenharmony_ci	lsx_restore_upper $vr22, \base, \tmp, (THREAD_FPR22-THREAD_FPR0)
36462306a36Sopenharmony_ci	lsx_restore_upper $vr23, \base, \tmp, (THREAD_FPR23-THREAD_FPR0)
36562306a36Sopenharmony_ci	lsx_restore_upper $vr24, \base, \tmp, (THREAD_FPR24-THREAD_FPR0)
36662306a36Sopenharmony_ci	lsx_restore_upper $vr25, \base, \tmp, (THREAD_FPR25-THREAD_FPR0)
36762306a36Sopenharmony_ci	lsx_restore_upper $vr26, \base, \tmp, (THREAD_FPR26-THREAD_FPR0)
36862306a36Sopenharmony_ci	lsx_restore_upper $vr27, \base, \tmp, (THREAD_FPR27-THREAD_FPR0)
36962306a36Sopenharmony_ci	lsx_restore_upper $vr28, \base, \tmp, (THREAD_FPR28-THREAD_FPR0)
37062306a36Sopenharmony_ci	lsx_restore_upper $vr29, \base, \tmp, (THREAD_FPR29-THREAD_FPR0)
37162306a36Sopenharmony_ci	lsx_restore_upper $vr30, \base, \tmp, (THREAD_FPR30-THREAD_FPR0)
37262306a36Sopenharmony_ci	lsx_restore_upper $vr31, \base, \tmp, (THREAD_FPR31-THREAD_FPR0)
37362306a36Sopenharmony_ci	.endm
37462306a36Sopenharmony_ci
37562306a36Sopenharmony_ci	.macro	lsx_init_upper vd tmp
37662306a36Sopenharmony_ci	vinsgr2vr.d	\vd, \tmp, 1
37762306a36Sopenharmony_ci	.endm
37862306a36Sopenharmony_ci
37962306a36Sopenharmony_ci	.macro	lsx_init_all_upper tmp
38062306a36Sopenharmony_ci	not		\tmp, zero
38162306a36Sopenharmony_ci	lsx_init_upper	$vr0 \tmp
38262306a36Sopenharmony_ci	lsx_init_upper	$vr1 \tmp
38362306a36Sopenharmony_ci	lsx_init_upper	$vr2 \tmp
38462306a36Sopenharmony_ci	lsx_init_upper	$vr3 \tmp
38562306a36Sopenharmony_ci	lsx_init_upper	$vr4 \tmp
38662306a36Sopenharmony_ci	lsx_init_upper	$vr5 \tmp
38762306a36Sopenharmony_ci	lsx_init_upper	$vr6 \tmp
38862306a36Sopenharmony_ci	lsx_init_upper	$vr7 \tmp
38962306a36Sopenharmony_ci	lsx_init_upper	$vr8 \tmp
39062306a36Sopenharmony_ci	lsx_init_upper	$vr9 \tmp
39162306a36Sopenharmony_ci	lsx_init_upper	$vr10 \tmp
39262306a36Sopenharmony_ci	lsx_init_upper	$vr11 \tmp
39362306a36Sopenharmony_ci	lsx_init_upper	$vr12 \tmp
39462306a36Sopenharmony_ci	lsx_init_upper	$vr13 \tmp
39562306a36Sopenharmony_ci	lsx_init_upper	$vr14 \tmp
39662306a36Sopenharmony_ci	lsx_init_upper	$vr15 \tmp
39762306a36Sopenharmony_ci	lsx_init_upper	$vr16 \tmp
39862306a36Sopenharmony_ci	lsx_init_upper	$vr17 \tmp
39962306a36Sopenharmony_ci	lsx_init_upper	$vr18 \tmp
40062306a36Sopenharmony_ci	lsx_init_upper	$vr19 \tmp
40162306a36Sopenharmony_ci	lsx_init_upper	$vr20 \tmp
40262306a36Sopenharmony_ci	lsx_init_upper	$vr21 \tmp
40362306a36Sopenharmony_ci	lsx_init_upper	$vr22 \tmp
40462306a36Sopenharmony_ci	lsx_init_upper	$vr23 \tmp
40562306a36Sopenharmony_ci	lsx_init_upper	$vr24 \tmp
40662306a36Sopenharmony_ci	lsx_init_upper	$vr25 \tmp
40762306a36Sopenharmony_ci	lsx_init_upper	$vr26 \tmp
40862306a36Sopenharmony_ci	lsx_init_upper	$vr27 \tmp
40962306a36Sopenharmony_ci	lsx_init_upper	$vr28 \tmp
41062306a36Sopenharmony_ci	lsx_init_upper	$vr29 \tmp
41162306a36Sopenharmony_ci	lsx_init_upper	$vr30 \tmp
41262306a36Sopenharmony_ci	lsx_init_upper	$vr31 \tmp
41362306a36Sopenharmony_ci	.endm
41462306a36Sopenharmony_ci
41562306a36Sopenharmony_ci	.macro	lasx_save_data thread tmp
41662306a36Sopenharmony_ci	li.w	\tmp, THREAD_FPR0
41762306a36Sopenharmony_ci	PTR_ADD	\tmp, \thread, \tmp
41862306a36Sopenharmony_ci	xvst	$xr0, \tmp, THREAD_FPR0  - THREAD_FPR0
41962306a36Sopenharmony_ci	xvst	$xr1, \tmp, THREAD_FPR1  - THREAD_FPR0
42062306a36Sopenharmony_ci	xvst	$xr2, \tmp, THREAD_FPR2  - THREAD_FPR0
42162306a36Sopenharmony_ci	xvst	$xr3, \tmp, THREAD_FPR3  - THREAD_FPR0
42262306a36Sopenharmony_ci	xvst	$xr4, \tmp, THREAD_FPR4  - THREAD_FPR0
42362306a36Sopenharmony_ci	xvst	$xr5, \tmp, THREAD_FPR5  - THREAD_FPR0
42462306a36Sopenharmony_ci	xvst	$xr6, \tmp, THREAD_FPR6  - THREAD_FPR0
42562306a36Sopenharmony_ci	xvst	$xr7, \tmp, THREAD_FPR7  - THREAD_FPR0
42662306a36Sopenharmony_ci	xvst	$xr8, \tmp, THREAD_FPR8  - THREAD_FPR0
42762306a36Sopenharmony_ci	xvst	$xr9, \tmp, THREAD_FPR9  - THREAD_FPR0
42862306a36Sopenharmony_ci	xvst	$xr10, \tmp, THREAD_FPR10 - THREAD_FPR0
42962306a36Sopenharmony_ci	xvst	$xr11, \tmp, THREAD_FPR11 - THREAD_FPR0
43062306a36Sopenharmony_ci	xvst	$xr12, \tmp, THREAD_FPR12 - THREAD_FPR0
43162306a36Sopenharmony_ci	xvst	$xr13, \tmp, THREAD_FPR13 - THREAD_FPR0
43262306a36Sopenharmony_ci	xvst	$xr14, \tmp, THREAD_FPR14 - THREAD_FPR0
43362306a36Sopenharmony_ci	xvst	$xr15, \tmp, THREAD_FPR15 - THREAD_FPR0
43462306a36Sopenharmony_ci	xvst	$xr16, \tmp, THREAD_FPR16 - THREAD_FPR0
43562306a36Sopenharmony_ci	xvst	$xr17, \tmp, THREAD_FPR17 - THREAD_FPR0
43662306a36Sopenharmony_ci	xvst	$xr18, \tmp, THREAD_FPR18 - THREAD_FPR0
43762306a36Sopenharmony_ci	xvst	$xr19, \tmp, THREAD_FPR19 - THREAD_FPR0
43862306a36Sopenharmony_ci	xvst	$xr20, \tmp, THREAD_FPR20 - THREAD_FPR0
43962306a36Sopenharmony_ci	xvst	$xr21, \tmp, THREAD_FPR21 - THREAD_FPR0
44062306a36Sopenharmony_ci	xvst	$xr22, \tmp, THREAD_FPR22 - THREAD_FPR0
44162306a36Sopenharmony_ci	xvst	$xr23, \tmp, THREAD_FPR23 - THREAD_FPR0
44262306a36Sopenharmony_ci	xvst	$xr24, \tmp, THREAD_FPR24 - THREAD_FPR0
44362306a36Sopenharmony_ci	xvst	$xr25, \tmp, THREAD_FPR25 - THREAD_FPR0
44462306a36Sopenharmony_ci	xvst	$xr26, \tmp, THREAD_FPR26 - THREAD_FPR0
44562306a36Sopenharmony_ci	xvst	$xr27, \tmp, THREAD_FPR27 - THREAD_FPR0
44662306a36Sopenharmony_ci	xvst	$xr28, \tmp, THREAD_FPR28 - THREAD_FPR0
44762306a36Sopenharmony_ci	xvst	$xr29, \tmp, THREAD_FPR29 - THREAD_FPR0
44862306a36Sopenharmony_ci	xvst	$xr30, \tmp, THREAD_FPR30 - THREAD_FPR0
44962306a36Sopenharmony_ci	xvst	$xr31, \tmp, THREAD_FPR31 - THREAD_FPR0
45062306a36Sopenharmony_ci	.endm
45162306a36Sopenharmony_ci
45262306a36Sopenharmony_ci	.macro	lasx_restore_data thread tmp
45362306a36Sopenharmony_ci	li.w	\tmp, THREAD_FPR0
45462306a36Sopenharmony_ci	PTR_ADD	\tmp, \thread, \tmp
45562306a36Sopenharmony_ci	xvld	$xr0, \tmp, THREAD_FPR0  - THREAD_FPR0
45662306a36Sopenharmony_ci	xvld	$xr1, \tmp, THREAD_FPR1  - THREAD_FPR0
45762306a36Sopenharmony_ci	xvld	$xr2, \tmp, THREAD_FPR2  - THREAD_FPR0
45862306a36Sopenharmony_ci	xvld	$xr3, \tmp, THREAD_FPR3  - THREAD_FPR0
45962306a36Sopenharmony_ci	xvld	$xr4, \tmp, THREAD_FPR4  - THREAD_FPR0
46062306a36Sopenharmony_ci	xvld	$xr5, \tmp, THREAD_FPR5  - THREAD_FPR0
46162306a36Sopenharmony_ci	xvld	$xr6, \tmp, THREAD_FPR6  - THREAD_FPR0
46262306a36Sopenharmony_ci	xvld	$xr7, \tmp, THREAD_FPR7  - THREAD_FPR0
46362306a36Sopenharmony_ci	xvld	$xr8, \tmp, THREAD_FPR8  - THREAD_FPR0
46462306a36Sopenharmony_ci	xvld	$xr9, \tmp, THREAD_FPR9  - THREAD_FPR0
46562306a36Sopenharmony_ci	xvld	$xr10, \tmp, THREAD_FPR10 - THREAD_FPR0
46662306a36Sopenharmony_ci	xvld	$xr11, \tmp, THREAD_FPR11 - THREAD_FPR0
46762306a36Sopenharmony_ci	xvld	$xr12, \tmp, THREAD_FPR12 - THREAD_FPR0
46862306a36Sopenharmony_ci	xvld	$xr13, \tmp, THREAD_FPR13 - THREAD_FPR0
46962306a36Sopenharmony_ci	xvld	$xr14, \tmp, THREAD_FPR14 - THREAD_FPR0
47062306a36Sopenharmony_ci	xvld	$xr15, \tmp, THREAD_FPR15 - THREAD_FPR0
47162306a36Sopenharmony_ci	xvld	$xr16, \tmp, THREAD_FPR16 - THREAD_FPR0
47262306a36Sopenharmony_ci	xvld	$xr17, \tmp, THREAD_FPR17 - THREAD_FPR0
47362306a36Sopenharmony_ci	xvld	$xr18, \tmp, THREAD_FPR18 - THREAD_FPR0
47462306a36Sopenharmony_ci	xvld	$xr19, \tmp, THREAD_FPR19 - THREAD_FPR0
47562306a36Sopenharmony_ci	xvld	$xr20, \tmp, THREAD_FPR20 - THREAD_FPR0
47662306a36Sopenharmony_ci	xvld	$xr21, \tmp, THREAD_FPR21 - THREAD_FPR0
47762306a36Sopenharmony_ci	xvld	$xr22, \tmp, THREAD_FPR22 - THREAD_FPR0
47862306a36Sopenharmony_ci	xvld	$xr23, \tmp, THREAD_FPR23 - THREAD_FPR0
47962306a36Sopenharmony_ci	xvld	$xr24, \tmp, THREAD_FPR24 - THREAD_FPR0
48062306a36Sopenharmony_ci	xvld	$xr25, \tmp, THREAD_FPR25 - THREAD_FPR0
48162306a36Sopenharmony_ci	xvld	$xr26, \tmp, THREAD_FPR26 - THREAD_FPR0
48262306a36Sopenharmony_ci	xvld	$xr27, \tmp, THREAD_FPR27 - THREAD_FPR0
48362306a36Sopenharmony_ci	xvld	$xr28, \tmp, THREAD_FPR28 - THREAD_FPR0
48462306a36Sopenharmony_ci	xvld	$xr29, \tmp, THREAD_FPR29 - THREAD_FPR0
48562306a36Sopenharmony_ci	xvld	$xr30, \tmp, THREAD_FPR30 - THREAD_FPR0
48662306a36Sopenharmony_ci	xvld	$xr31, \tmp, THREAD_FPR31 - THREAD_FPR0
48762306a36Sopenharmony_ci	.endm
48862306a36Sopenharmony_ci
48962306a36Sopenharmony_ci	.macro	lasx_save_all	thread tmp0 tmp1
49062306a36Sopenharmony_ci	fpu_save_cc		\thread, \tmp0, \tmp1
49162306a36Sopenharmony_ci	fpu_save_csr		\thread, \tmp0
49262306a36Sopenharmony_ci	lasx_save_data		\thread, \tmp0
49362306a36Sopenharmony_ci	.endm
49462306a36Sopenharmony_ci
49562306a36Sopenharmony_ci	.macro	lasx_restore_all thread tmp0 tmp1
49662306a36Sopenharmony_ci	lasx_restore_data	\thread, \tmp0
49762306a36Sopenharmony_ci	fpu_restore_cc		\thread, \tmp0, \tmp1
49862306a36Sopenharmony_ci	fpu_restore_csr		\thread, \tmp0, \tmp1
49962306a36Sopenharmony_ci	.endm
50062306a36Sopenharmony_ci
50162306a36Sopenharmony_ci	.macro	lasx_save_upper xd base tmp off
50262306a36Sopenharmony_ci	/* Nothing */
50362306a36Sopenharmony_ci	.endm
50462306a36Sopenharmony_ci
50562306a36Sopenharmony_ci	.macro	lasx_save_all_upper thread base tmp
50662306a36Sopenharmony_ci	/* Nothing */
50762306a36Sopenharmony_ci	.endm
50862306a36Sopenharmony_ci
50962306a36Sopenharmony_ci	.macro	lasx_restore_upper xd base tmp0 tmp1 off
51062306a36Sopenharmony_ci	vld		\tmp0, \base, (\off+16)
51162306a36Sopenharmony_ci	xvpermi.q 	\xd,   \tmp1, 0x2
51262306a36Sopenharmony_ci	.endm
51362306a36Sopenharmony_ci
51462306a36Sopenharmony_ci	.macro	lasx_restore_all_upper thread base tmp
51562306a36Sopenharmony_ci	li.w		\tmp, THREAD_FPR0
51662306a36Sopenharmony_ci	PTR_ADD		\base, \thread, \tmp
51762306a36Sopenharmony_ci	/* Save $vr31 ($xr31 lower bits) with xvpickve2gr */
51862306a36Sopenharmony_ci	xvpickve2gr.d	$r17, $xr31, 0
51962306a36Sopenharmony_ci	xvpickve2gr.d	$r18, $xr31, 1
52062306a36Sopenharmony_ci	lasx_restore_upper $xr0, \base, $vr31, $xr31, (THREAD_FPR0-THREAD_FPR0)
52162306a36Sopenharmony_ci	lasx_restore_upper $xr1, \base, $vr31, $xr31, (THREAD_FPR1-THREAD_FPR0)
52262306a36Sopenharmony_ci	lasx_restore_upper $xr2, \base, $vr31, $xr31, (THREAD_FPR2-THREAD_FPR0)
52362306a36Sopenharmony_ci	lasx_restore_upper $xr3, \base, $vr31, $xr31, (THREAD_FPR3-THREAD_FPR0)
52462306a36Sopenharmony_ci	lasx_restore_upper $xr4, \base, $vr31, $xr31, (THREAD_FPR4-THREAD_FPR0)
52562306a36Sopenharmony_ci	lasx_restore_upper $xr5, \base, $vr31, $xr31, (THREAD_FPR5-THREAD_FPR0)
52662306a36Sopenharmony_ci	lasx_restore_upper $xr6, \base, $vr31, $xr31, (THREAD_FPR6-THREAD_FPR0)
52762306a36Sopenharmony_ci	lasx_restore_upper $xr7, \base, $vr31, $xr31, (THREAD_FPR7-THREAD_FPR0)
52862306a36Sopenharmony_ci	lasx_restore_upper $xr8, \base, $vr31, $xr31, (THREAD_FPR8-THREAD_FPR0)
52962306a36Sopenharmony_ci	lasx_restore_upper $xr9, \base, $vr31, $xr31, (THREAD_FPR9-THREAD_FPR0)
53062306a36Sopenharmony_ci	lasx_restore_upper $xr10, \base, $vr31, $xr31, (THREAD_FPR10-THREAD_FPR0)
53162306a36Sopenharmony_ci	lasx_restore_upper $xr11, \base, $vr31, $xr31, (THREAD_FPR11-THREAD_FPR0)
53262306a36Sopenharmony_ci	lasx_restore_upper $xr12, \base, $vr31, $xr31, (THREAD_FPR12-THREAD_FPR0)
53362306a36Sopenharmony_ci	lasx_restore_upper $xr13, \base, $vr31, $xr31, (THREAD_FPR13-THREAD_FPR0)
53462306a36Sopenharmony_ci	lasx_restore_upper $xr14, \base, $vr31, $xr31, (THREAD_FPR14-THREAD_FPR0)
53562306a36Sopenharmony_ci	lasx_restore_upper $xr15, \base, $vr31, $xr31, (THREAD_FPR15-THREAD_FPR0)
53662306a36Sopenharmony_ci	lasx_restore_upper $xr16, \base, $vr31, $xr31, (THREAD_FPR16-THREAD_FPR0)
53762306a36Sopenharmony_ci	lasx_restore_upper $xr17, \base, $vr31, $xr31, (THREAD_FPR17-THREAD_FPR0)
53862306a36Sopenharmony_ci	lasx_restore_upper $xr18, \base, $vr31, $xr31, (THREAD_FPR18-THREAD_FPR0)
53962306a36Sopenharmony_ci	lasx_restore_upper $xr19, \base, $vr31, $xr31, (THREAD_FPR19-THREAD_FPR0)
54062306a36Sopenharmony_ci	lasx_restore_upper $xr20, \base, $vr31, $xr31, (THREAD_FPR20-THREAD_FPR0)
54162306a36Sopenharmony_ci	lasx_restore_upper $xr21, \base, $vr31, $xr31, (THREAD_FPR21-THREAD_FPR0)
54262306a36Sopenharmony_ci	lasx_restore_upper $xr22, \base, $vr31, $xr31, (THREAD_FPR22-THREAD_FPR0)
54362306a36Sopenharmony_ci	lasx_restore_upper $xr23, \base, $vr31, $xr31, (THREAD_FPR23-THREAD_FPR0)
54462306a36Sopenharmony_ci	lasx_restore_upper $xr24, \base, $vr31, $xr31, (THREAD_FPR24-THREAD_FPR0)
54562306a36Sopenharmony_ci	lasx_restore_upper $xr25, \base, $vr31, $xr31, (THREAD_FPR25-THREAD_FPR0)
54662306a36Sopenharmony_ci	lasx_restore_upper $xr26, \base, $vr31, $xr31, (THREAD_FPR26-THREAD_FPR0)
54762306a36Sopenharmony_ci	lasx_restore_upper $xr27, \base, $vr31, $xr31, (THREAD_FPR27-THREAD_FPR0)
54862306a36Sopenharmony_ci	lasx_restore_upper $xr28, \base, $vr31, $xr31, (THREAD_FPR28-THREAD_FPR0)
54962306a36Sopenharmony_ci	lasx_restore_upper $xr29, \base, $vr31, $xr31, (THREAD_FPR29-THREAD_FPR0)
55062306a36Sopenharmony_ci	lasx_restore_upper $xr30, \base, $vr31, $xr31, (THREAD_FPR30-THREAD_FPR0)
55162306a36Sopenharmony_ci	lasx_restore_upper $xr31, \base, $vr31, $xr31, (THREAD_FPR31-THREAD_FPR0)
55262306a36Sopenharmony_ci	/* Restore $vr31 ($xr31 lower bits) with xvinsgr2vr */
55362306a36Sopenharmony_ci	xvinsgr2vr.d	$xr31, $r17, 0
55462306a36Sopenharmony_ci	xvinsgr2vr.d	$xr31, $r18, 1
55562306a36Sopenharmony_ci	.endm
55662306a36Sopenharmony_ci
55762306a36Sopenharmony_ci	.macro	lasx_init_upper xd tmp
55862306a36Sopenharmony_ci	xvinsgr2vr.d	\xd, \tmp, 2
55962306a36Sopenharmony_ci	xvinsgr2vr.d	\xd, \tmp, 3
56062306a36Sopenharmony_ci	.endm
56162306a36Sopenharmony_ci
56262306a36Sopenharmony_ci	.macro	lasx_init_all_upper tmp
56362306a36Sopenharmony_ci	not		\tmp, zero
56462306a36Sopenharmony_ci	lasx_init_upper	$xr0 \tmp
56562306a36Sopenharmony_ci	lasx_init_upper	$xr1 \tmp
56662306a36Sopenharmony_ci	lasx_init_upper	$xr2 \tmp
56762306a36Sopenharmony_ci	lasx_init_upper	$xr3 \tmp
56862306a36Sopenharmony_ci	lasx_init_upper	$xr4 \tmp
56962306a36Sopenharmony_ci	lasx_init_upper	$xr5 \tmp
57062306a36Sopenharmony_ci	lasx_init_upper	$xr6 \tmp
57162306a36Sopenharmony_ci	lasx_init_upper	$xr7 \tmp
57262306a36Sopenharmony_ci	lasx_init_upper	$xr8 \tmp
57362306a36Sopenharmony_ci	lasx_init_upper	$xr9 \tmp
57462306a36Sopenharmony_ci	lasx_init_upper	$xr10 \tmp
57562306a36Sopenharmony_ci	lasx_init_upper	$xr11 \tmp
57662306a36Sopenharmony_ci	lasx_init_upper	$xr12 \tmp
57762306a36Sopenharmony_ci	lasx_init_upper	$xr13 \tmp
57862306a36Sopenharmony_ci	lasx_init_upper	$xr14 \tmp
57962306a36Sopenharmony_ci	lasx_init_upper	$xr15 \tmp
58062306a36Sopenharmony_ci	lasx_init_upper	$xr16 \tmp
58162306a36Sopenharmony_ci	lasx_init_upper	$xr17 \tmp
58262306a36Sopenharmony_ci	lasx_init_upper	$xr18 \tmp
58362306a36Sopenharmony_ci	lasx_init_upper	$xr19 \tmp
58462306a36Sopenharmony_ci	lasx_init_upper	$xr20 \tmp
58562306a36Sopenharmony_ci	lasx_init_upper	$xr21 \tmp
58662306a36Sopenharmony_ci	lasx_init_upper	$xr22 \tmp
58762306a36Sopenharmony_ci	lasx_init_upper	$xr23 \tmp
58862306a36Sopenharmony_ci	lasx_init_upper	$xr24 \tmp
58962306a36Sopenharmony_ci	lasx_init_upper	$xr25 \tmp
59062306a36Sopenharmony_ci	lasx_init_upper	$xr26 \tmp
59162306a36Sopenharmony_ci	lasx_init_upper	$xr27 \tmp
59262306a36Sopenharmony_ci	lasx_init_upper	$xr28 \tmp
59362306a36Sopenharmony_ci	lasx_init_upper	$xr29 \tmp
59462306a36Sopenharmony_ci	lasx_init_upper	$xr30 \tmp
59562306a36Sopenharmony_ci	lasx_init_upper	$xr31 \tmp
59662306a36Sopenharmony_ci	.endm
59762306a36Sopenharmony_ci
59862306a36Sopenharmony_ci.macro not dst src
59962306a36Sopenharmony_ci	nor	\dst, \src, zero
60062306a36Sopenharmony_ci.endm
60162306a36Sopenharmony_ci
60262306a36Sopenharmony_ci.macro la_abs reg, sym
60362306a36Sopenharmony_ci#ifndef CONFIG_RELOCATABLE
60462306a36Sopenharmony_ci	la.abs	\reg, \sym
60562306a36Sopenharmony_ci#else
60662306a36Sopenharmony_ci	766:
60762306a36Sopenharmony_ci	lu12i.w	\reg, 0
60862306a36Sopenharmony_ci	ori	\reg, \reg, 0
60962306a36Sopenharmony_ci	lu32i.d	\reg, 0
61062306a36Sopenharmony_ci	lu52i.d	\reg, \reg, 0
61162306a36Sopenharmony_ci	.pushsection ".la_abs", "aw", %progbits
61262306a36Sopenharmony_ci	.dword	766b
61362306a36Sopenharmony_ci	.dword	\sym
61462306a36Sopenharmony_ci	.popsection
61562306a36Sopenharmony_ci#endif
61662306a36Sopenharmony_ci.endm
61762306a36Sopenharmony_ci
61862306a36Sopenharmony_ci#endif /* _ASM_ASMMACRO_H */
619