1803b0fc5SHuacai Chen/* SPDX-License-Identifier: GPL-2.0 */ 2803b0fc5SHuacai Chen/* 3803b0fc5SHuacai Chen * Author: Lu Zeng <zenglu@loongson.cn> 4803b0fc5SHuacai Chen * Pei Huang <huangpei@loongson.cn> 5803b0fc5SHuacai Chen * Huacai Chen <chenhuacai@loongson.cn> 6803b0fc5SHuacai Chen * 7803b0fc5SHuacai Chen * Copyright (C) 2020-2022 Loongson Technology Corporation Limited 8803b0fc5SHuacai Chen */ 955b46ff9SMasahiro Yamada#include <linux/export.h> 10803b0fc5SHuacai Chen#include <asm/asm.h> 11803b0fc5SHuacai Chen#include <asm/asmmacro.h> 12508f28c6SYouling Tang#include <asm/asm-extable.h> 13803b0fc5SHuacai Chen#include <asm/asm-offsets.h> 14803b0fc5SHuacai Chen#include <asm/errno.h> 15803b0fc5SHuacai Chen#include <asm/fpregdef.h> 16803b0fc5SHuacai Chen#include <asm/loongarch.h> 17803b0fc5SHuacai Chen#include <asm/regdef.h> 18803b0fc5SHuacai Chen 19803b0fc5SHuacai Chen#define FPU_REG_WIDTH 8 20803b0fc5SHuacai Chen#define LSX_REG_WIDTH 16 21803b0fc5SHuacai Chen#define LASX_REG_WIDTH 32 22803b0fc5SHuacai Chen 23803b0fc5SHuacai Chen .macro EX insn, reg, src, offs 24803b0fc5SHuacai Chen.ex\@: \insn \reg, \src, \offs 258f58c571STiezhu Yang _asm_extable .ex\@, .L_fpu_fault 26803b0fc5SHuacai Chen .endm 27803b0fc5SHuacai Chen 28803b0fc5SHuacai Chen .macro sc_save_fp base 29803b0fc5SHuacai Chen EX fst.d $f0, \base, (0 * FPU_REG_WIDTH) 30803b0fc5SHuacai Chen EX fst.d $f1, \base, (1 * FPU_REG_WIDTH) 31803b0fc5SHuacai Chen EX fst.d $f2, \base, (2 * FPU_REG_WIDTH) 32803b0fc5SHuacai Chen EX fst.d $f3, \base, (3 * FPU_REG_WIDTH) 33803b0fc5SHuacai Chen EX fst.d $f4, \base, (4 * FPU_REG_WIDTH) 34803b0fc5SHuacai Chen EX fst.d $f5, \base, (5 * FPU_REG_WIDTH) 35803b0fc5SHuacai Chen EX fst.d $f6, \base, (6 * FPU_REG_WIDTH) 36803b0fc5SHuacai Chen EX fst.d $f7, \base, (7 * FPU_REG_WIDTH) 37803b0fc5SHuacai Chen EX fst.d $f8, \base, (8 * FPU_REG_WIDTH) 38803b0fc5SHuacai Chen EX fst.d $f9, \base, (9 * FPU_REG_WIDTH) 39803b0fc5SHuacai Chen EX fst.d $f10, \base, (10 * FPU_REG_WIDTH) 40803b0fc5SHuacai Chen EX fst.d $f11, \base, (11 * FPU_REG_WIDTH) 41803b0fc5SHuacai Chen EX fst.d $f12, \base, (12 * FPU_REG_WIDTH) 42803b0fc5SHuacai Chen EX fst.d $f13, \base, (13 * FPU_REG_WIDTH) 43803b0fc5SHuacai Chen EX fst.d $f14, \base, (14 * FPU_REG_WIDTH) 44803b0fc5SHuacai Chen EX fst.d $f15, \base, (15 * FPU_REG_WIDTH) 45803b0fc5SHuacai Chen EX fst.d $f16, \base, (16 * FPU_REG_WIDTH) 46803b0fc5SHuacai Chen EX fst.d $f17, \base, (17 * FPU_REG_WIDTH) 47803b0fc5SHuacai Chen EX fst.d $f18, \base, (18 * FPU_REG_WIDTH) 48803b0fc5SHuacai Chen EX fst.d $f19, \base, (19 * FPU_REG_WIDTH) 49803b0fc5SHuacai Chen EX fst.d $f20, \base, (20 * FPU_REG_WIDTH) 50803b0fc5SHuacai Chen EX fst.d $f21, \base, (21 * FPU_REG_WIDTH) 51803b0fc5SHuacai Chen EX fst.d $f22, \base, (22 * FPU_REG_WIDTH) 52803b0fc5SHuacai Chen EX fst.d $f23, \base, (23 * FPU_REG_WIDTH) 53803b0fc5SHuacai Chen EX fst.d $f24, \base, (24 * FPU_REG_WIDTH) 54803b0fc5SHuacai Chen EX fst.d $f25, \base, (25 * FPU_REG_WIDTH) 55803b0fc5SHuacai Chen EX fst.d $f26, \base, (26 * FPU_REG_WIDTH) 56803b0fc5SHuacai Chen EX fst.d $f27, \base, (27 * FPU_REG_WIDTH) 57803b0fc5SHuacai Chen EX fst.d $f28, \base, (28 * FPU_REG_WIDTH) 58803b0fc5SHuacai Chen EX fst.d $f29, \base, (29 * FPU_REG_WIDTH) 59803b0fc5SHuacai Chen EX fst.d $f30, \base, (30 * FPU_REG_WIDTH) 60803b0fc5SHuacai Chen EX fst.d $f31, \base, (31 * FPU_REG_WIDTH) 61803b0fc5SHuacai Chen .endm 62803b0fc5SHuacai Chen 63803b0fc5SHuacai Chen .macro sc_restore_fp base 64803b0fc5SHuacai Chen EX fld.d $f0, \base, (0 * FPU_REG_WIDTH) 65803b0fc5SHuacai Chen EX fld.d $f1, \base, (1 * FPU_REG_WIDTH) 66803b0fc5SHuacai Chen EX fld.d $f2, \base, (2 * FPU_REG_WIDTH) 67803b0fc5SHuacai Chen EX fld.d $f3, \base, (3 * FPU_REG_WIDTH) 68803b0fc5SHuacai Chen EX fld.d $f4, \base, (4 * FPU_REG_WIDTH) 69803b0fc5SHuacai Chen EX fld.d $f5, \base, (5 * FPU_REG_WIDTH) 70803b0fc5SHuacai Chen EX fld.d $f6, \base, (6 * FPU_REG_WIDTH) 71803b0fc5SHuacai Chen EX fld.d $f7, \base, (7 * FPU_REG_WIDTH) 72803b0fc5SHuacai Chen EX fld.d $f8, \base, (8 * FPU_REG_WIDTH) 73803b0fc5SHuacai Chen EX fld.d $f9, \base, (9 * FPU_REG_WIDTH) 74803b0fc5SHuacai Chen EX fld.d $f10, \base, (10 * FPU_REG_WIDTH) 75803b0fc5SHuacai Chen EX fld.d $f11, \base, (11 * FPU_REG_WIDTH) 76803b0fc5SHuacai Chen EX fld.d $f12, \base, (12 * FPU_REG_WIDTH) 77803b0fc5SHuacai Chen EX fld.d $f13, \base, (13 * FPU_REG_WIDTH) 78803b0fc5SHuacai Chen EX fld.d $f14, \base, (14 * FPU_REG_WIDTH) 79803b0fc5SHuacai Chen EX fld.d $f15, \base, (15 * FPU_REG_WIDTH) 80803b0fc5SHuacai Chen EX fld.d $f16, \base, (16 * FPU_REG_WIDTH) 81803b0fc5SHuacai Chen EX fld.d $f17, \base, (17 * FPU_REG_WIDTH) 82803b0fc5SHuacai Chen EX fld.d $f18, \base, (18 * FPU_REG_WIDTH) 83803b0fc5SHuacai Chen EX fld.d $f19, \base, (19 * FPU_REG_WIDTH) 84803b0fc5SHuacai Chen EX fld.d $f20, \base, (20 * FPU_REG_WIDTH) 85803b0fc5SHuacai Chen EX fld.d $f21, \base, (21 * FPU_REG_WIDTH) 86803b0fc5SHuacai Chen EX fld.d $f22, \base, (22 * FPU_REG_WIDTH) 87803b0fc5SHuacai Chen EX fld.d $f23, \base, (23 * FPU_REG_WIDTH) 88803b0fc5SHuacai Chen EX fld.d $f24, \base, (24 * FPU_REG_WIDTH) 89803b0fc5SHuacai Chen EX fld.d $f25, \base, (25 * FPU_REG_WIDTH) 90803b0fc5SHuacai Chen EX fld.d $f26, \base, (26 * FPU_REG_WIDTH) 91803b0fc5SHuacai Chen EX fld.d $f27, \base, (27 * FPU_REG_WIDTH) 92803b0fc5SHuacai Chen EX fld.d $f28, \base, (28 * FPU_REG_WIDTH) 93803b0fc5SHuacai Chen EX fld.d $f29, \base, (29 * FPU_REG_WIDTH) 94803b0fc5SHuacai Chen EX fld.d $f30, \base, (30 * FPU_REG_WIDTH) 95803b0fc5SHuacai Chen EX fld.d $f31, \base, (31 * FPU_REG_WIDTH) 96803b0fc5SHuacai Chen .endm 97803b0fc5SHuacai Chen 98803b0fc5SHuacai Chen .macro sc_save_fcc base, tmp0, tmp1 99803b0fc5SHuacai Chen movcf2gr \tmp0, $fcc0 100803b0fc5SHuacai Chen move \tmp1, \tmp0 101803b0fc5SHuacai Chen movcf2gr \tmp0, $fcc1 102803b0fc5SHuacai Chen bstrins.d \tmp1, \tmp0, 15, 8 103803b0fc5SHuacai Chen movcf2gr \tmp0, $fcc2 104803b0fc5SHuacai Chen bstrins.d \tmp1, \tmp0, 23, 16 105803b0fc5SHuacai Chen movcf2gr \tmp0, $fcc3 106803b0fc5SHuacai Chen bstrins.d \tmp1, \tmp0, 31, 24 107803b0fc5SHuacai Chen movcf2gr \tmp0, $fcc4 108803b0fc5SHuacai Chen bstrins.d \tmp1, \tmp0, 39, 32 109803b0fc5SHuacai Chen movcf2gr \tmp0, $fcc5 110803b0fc5SHuacai Chen bstrins.d \tmp1, \tmp0, 47, 40 111803b0fc5SHuacai Chen movcf2gr \tmp0, $fcc6 112803b0fc5SHuacai Chen bstrins.d \tmp1, \tmp0, 55, 48 113803b0fc5SHuacai Chen movcf2gr \tmp0, $fcc7 114803b0fc5SHuacai Chen bstrins.d \tmp1, \tmp0, 63, 56 115803b0fc5SHuacai Chen EX st.d \tmp1, \base, 0 116803b0fc5SHuacai Chen .endm 117803b0fc5SHuacai Chen 118803b0fc5SHuacai Chen .macro sc_restore_fcc base, tmp0, tmp1 119803b0fc5SHuacai Chen EX ld.d \tmp0, \base, 0 120803b0fc5SHuacai Chen bstrpick.d \tmp1, \tmp0, 7, 0 121803b0fc5SHuacai Chen movgr2cf $fcc0, \tmp1 122803b0fc5SHuacai Chen bstrpick.d \tmp1, \tmp0, 15, 8 123803b0fc5SHuacai Chen movgr2cf $fcc1, \tmp1 124803b0fc5SHuacai Chen bstrpick.d \tmp1, \tmp0, 23, 16 125803b0fc5SHuacai Chen movgr2cf $fcc2, \tmp1 126803b0fc5SHuacai Chen bstrpick.d \tmp1, \tmp0, 31, 24 127803b0fc5SHuacai Chen movgr2cf $fcc3, \tmp1 128803b0fc5SHuacai Chen bstrpick.d \tmp1, \tmp0, 39, 32 129803b0fc5SHuacai Chen movgr2cf $fcc4, \tmp1 130803b0fc5SHuacai Chen bstrpick.d \tmp1, \tmp0, 47, 40 131803b0fc5SHuacai Chen movgr2cf $fcc5, \tmp1 132803b0fc5SHuacai Chen bstrpick.d \tmp1, \tmp0, 55, 48 133803b0fc5SHuacai Chen movgr2cf $fcc6, \tmp1 134803b0fc5SHuacai Chen bstrpick.d \tmp1, \tmp0, 63, 56 135803b0fc5SHuacai Chen movgr2cf $fcc7, \tmp1 136803b0fc5SHuacai Chen .endm 137803b0fc5SHuacai Chen 138803b0fc5SHuacai Chen .macro sc_save_fcsr base, tmp0 139803b0fc5SHuacai Chen movfcsr2gr \tmp0, fcsr0 140803b0fc5SHuacai Chen EX st.w \tmp0, \base, 0 141*bd3c5798SQi Hu#if defined(CONFIG_CPU_HAS_LBT) 142*bd3c5798SQi Hu /* TM bit is always 0 if LBT not supported */ 143*bd3c5798SQi Hu andi \tmp0, \tmp0, FPU_CSR_TM 144*bd3c5798SQi Hu beqz \tmp0, 1f 145*bd3c5798SQi Hu x86clrtm 146*bd3c5798SQi Hu1: 147*bd3c5798SQi Hu#endif 148803b0fc5SHuacai Chen .endm 149803b0fc5SHuacai Chen 150803b0fc5SHuacai Chen .macro sc_restore_fcsr base, tmp0 151803b0fc5SHuacai Chen EX ld.w \tmp0, \base, 0 152803b0fc5SHuacai Chen movgr2fcsr fcsr0, \tmp0 153803b0fc5SHuacai Chen .endm 154803b0fc5SHuacai Chen 15561650023SHuacai Chen .macro sc_save_lsx base 15661650023SHuacai Chen#ifdef CONFIG_CPU_HAS_LSX 15761650023SHuacai Chen EX vst $vr0, \base, (0 * LSX_REG_WIDTH) 15861650023SHuacai Chen EX vst $vr1, \base, (1 * LSX_REG_WIDTH) 15961650023SHuacai Chen EX vst $vr2, \base, (2 * LSX_REG_WIDTH) 16061650023SHuacai Chen EX vst $vr3, \base, (3 * LSX_REG_WIDTH) 16161650023SHuacai Chen EX vst $vr4, \base, (4 * LSX_REG_WIDTH) 16261650023SHuacai Chen EX vst $vr5, \base, (5 * LSX_REG_WIDTH) 16361650023SHuacai Chen EX vst $vr6, \base, (6 * LSX_REG_WIDTH) 16461650023SHuacai Chen EX vst $vr7, \base, (7 * LSX_REG_WIDTH) 16561650023SHuacai Chen EX vst $vr8, \base, (8 * LSX_REG_WIDTH) 16661650023SHuacai Chen EX vst $vr9, \base, (9 * LSX_REG_WIDTH) 16761650023SHuacai Chen EX vst $vr10, \base, (10 * LSX_REG_WIDTH) 16861650023SHuacai Chen EX vst $vr11, \base, (11 * LSX_REG_WIDTH) 16961650023SHuacai Chen EX vst $vr12, \base, (12 * LSX_REG_WIDTH) 17061650023SHuacai Chen EX vst $vr13, \base, (13 * LSX_REG_WIDTH) 17161650023SHuacai Chen EX vst $vr14, \base, (14 * LSX_REG_WIDTH) 17261650023SHuacai Chen EX vst $vr15, \base, (15 * LSX_REG_WIDTH) 17361650023SHuacai Chen EX vst $vr16, \base, (16 * LSX_REG_WIDTH) 17461650023SHuacai Chen EX vst $vr17, \base, (17 * LSX_REG_WIDTH) 17561650023SHuacai Chen EX vst $vr18, \base, (18 * LSX_REG_WIDTH) 17661650023SHuacai Chen EX vst $vr19, \base, (19 * LSX_REG_WIDTH) 17761650023SHuacai Chen EX vst $vr20, \base, (20 * LSX_REG_WIDTH) 17861650023SHuacai Chen EX vst $vr21, \base, (21 * LSX_REG_WIDTH) 17961650023SHuacai Chen EX vst $vr22, \base, (22 * LSX_REG_WIDTH) 18061650023SHuacai Chen EX vst $vr23, \base, (23 * LSX_REG_WIDTH) 18161650023SHuacai Chen EX vst $vr24, \base, (24 * LSX_REG_WIDTH) 18261650023SHuacai Chen EX vst $vr25, \base, (25 * LSX_REG_WIDTH) 18361650023SHuacai Chen EX vst $vr26, \base, (26 * LSX_REG_WIDTH) 18461650023SHuacai Chen EX vst $vr27, \base, (27 * LSX_REG_WIDTH) 18561650023SHuacai Chen EX vst $vr28, \base, (28 * LSX_REG_WIDTH) 18661650023SHuacai Chen EX vst $vr29, \base, (29 * LSX_REG_WIDTH) 18761650023SHuacai Chen EX vst $vr30, \base, (30 * LSX_REG_WIDTH) 18861650023SHuacai Chen EX vst $vr31, \base, (31 * LSX_REG_WIDTH) 18961650023SHuacai Chen#endif 19061650023SHuacai Chen .endm 19161650023SHuacai Chen 19261650023SHuacai Chen .macro sc_restore_lsx base 19361650023SHuacai Chen#ifdef CONFIG_CPU_HAS_LSX 19461650023SHuacai Chen EX vld $vr0, \base, (0 * LSX_REG_WIDTH) 19561650023SHuacai Chen EX vld $vr1, \base, (1 * LSX_REG_WIDTH) 19661650023SHuacai Chen EX vld $vr2, \base, (2 * LSX_REG_WIDTH) 19761650023SHuacai Chen EX vld $vr3, \base, (3 * LSX_REG_WIDTH) 19861650023SHuacai Chen EX vld $vr4, \base, (4 * LSX_REG_WIDTH) 19961650023SHuacai Chen EX vld $vr5, \base, (5 * LSX_REG_WIDTH) 20061650023SHuacai Chen EX vld $vr6, \base, (6 * LSX_REG_WIDTH) 20161650023SHuacai Chen EX vld $vr7, \base, (7 * LSX_REG_WIDTH) 20261650023SHuacai Chen EX vld $vr8, \base, (8 * LSX_REG_WIDTH) 20361650023SHuacai Chen EX vld $vr9, \base, (9 * LSX_REG_WIDTH) 20461650023SHuacai Chen EX vld $vr10, \base, (10 * LSX_REG_WIDTH) 20561650023SHuacai Chen EX vld $vr11, \base, (11 * LSX_REG_WIDTH) 20661650023SHuacai Chen EX vld $vr12, \base, (12 * LSX_REG_WIDTH) 20761650023SHuacai Chen EX vld $vr13, \base, (13 * LSX_REG_WIDTH) 20861650023SHuacai Chen EX vld $vr14, \base, (14 * LSX_REG_WIDTH) 20961650023SHuacai Chen EX vld $vr15, \base, (15 * LSX_REG_WIDTH) 21061650023SHuacai Chen EX vld $vr16, \base, (16 * LSX_REG_WIDTH) 21161650023SHuacai Chen EX vld $vr17, \base, (17 * LSX_REG_WIDTH) 21261650023SHuacai Chen EX vld $vr18, \base, (18 * LSX_REG_WIDTH) 21361650023SHuacai Chen EX vld $vr19, \base, (19 * LSX_REG_WIDTH) 21461650023SHuacai Chen EX vld $vr20, \base, (20 * LSX_REG_WIDTH) 21561650023SHuacai Chen EX vld $vr21, \base, (21 * LSX_REG_WIDTH) 21661650023SHuacai Chen EX vld $vr22, \base, (22 * LSX_REG_WIDTH) 21761650023SHuacai Chen EX vld $vr23, \base, (23 * LSX_REG_WIDTH) 21861650023SHuacai Chen EX vld $vr24, \base, (24 * LSX_REG_WIDTH) 21961650023SHuacai Chen EX vld $vr25, \base, (25 * LSX_REG_WIDTH) 22061650023SHuacai Chen EX vld $vr26, \base, (26 * LSX_REG_WIDTH) 22161650023SHuacai Chen EX vld $vr27, \base, (27 * LSX_REG_WIDTH) 22261650023SHuacai Chen EX vld $vr28, \base, (28 * LSX_REG_WIDTH) 22361650023SHuacai Chen EX vld $vr29, \base, (29 * LSX_REG_WIDTH) 22461650023SHuacai Chen EX vld $vr30, \base, (30 * LSX_REG_WIDTH) 22561650023SHuacai Chen EX vld $vr31, \base, (31 * LSX_REG_WIDTH) 22661650023SHuacai Chen#endif 22761650023SHuacai Chen .endm 22861650023SHuacai Chen 22961650023SHuacai Chen .macro sc_save_lasx base 23061650023SHuacai Chen#ifdef CONFIG_CPU_HAS_LASX 23161650023SHuacai Chen EX xvst $xr0, \base, (0 * LASX_REG_WIDTH) 23261650023SHuacai Chen EX xvst $xr1, \base, (1 * LASX_REG_WIDTH) 23361650023SHuacai Chen EX xvst $xr2, \base, (2 * LASX_REG_WIDTH) 23461650023SHuacai Chen EX xvst $xr3, \base, (3 * LASX_REG_WIDTH) 23561650023SHuacai Chen EX xvst $xr4, \base, (4 * LASX_REG_WIDTH) 23661650023SHuacai Chen EX xvst $xr5, \base, (5 * LASX_REG_WIDTH) 23761650023SHuacai Chen EX xvst $xr6, \base, (6 * LASX_REG_WIDTH) 23861650023SHuacai Chen EX xvst $xr7, \base, (7 * LASX_REG_WIDTH) 23961650023SHuacai Chen EX xvst $xr8, \base, (8 * LASX_REG_WIDTH) 24061650023SHuacai Chen EX xvst $xr9, \base, (9 * LASX_REG_WIDTH) 24161650023SHuacai Chen EX xvst $xr10, \base, (10 * LASX_REG_WIDTH) 24261650023SHuacai Chen EX xvst $xr11, \base, (11 * LASX_REG_WIDTH) 24361650023SHuacai Chen EX xvst $xr12, \base, (12 * LASX_REG_WIDTH) 24461650023SHuacai Chen EX xvst $xr13, \base, (13 * LASX_REG_WIDTH) 24561650023SHuacai Chen EX xvst $xr14, \base, (14 * LASX_REG_WIDTH) 24661650023SHuacai Chen EX xvst $xr15, \base, (15 * LASX_REG_WIDTH) 24761650023SHuacai Chen EX xvst $xr16, \base, (16 * LASX_REG_WIDTH) 24861650023SHuacai Chen EX xvst $xr17, \base, (17 * LASX_REG_WIDTH) 24961650023SHuacai Chen EX xvst $xr18, \base, (18 * LASX_REG_WIDTH) 25061650023SHuacai Chen EX xvst $xr19, \base, (19 * LASX_REG_WIDTH) 25161650023SHuacai Chen EX xvst $xr20, \base, (20 * LASX_REG_WIDTH) 25261650023SHuacai Chen EX xvst $xr21, \base, (21 * LASX_REG_WIDTH) 25361650023SHuacai Chen EX xvst $xr22, \base, (22 * LASX_REG_WIDTH) 25461650023SHuacai Chen EX xvst $xr23, \base, (23 * LASX_REG_WIDTH) 25561650023SHuacai Chen EX xvst $xr24, \base, (24 * LASX_REG_WIDTH) 25661650023SHuacai Chen EX xvst $xr25, \base, (25 * LASX_REG_WIDTH) 25761650023SHuacai Chen EX xvst $xr26, \base, (26 * LASX_REG_WIDTH) 25861650023SHuacai Chen EX xvst $xr27, \base, (27 * LASX_REG_WIDTH) 25961650023SHuacai Chen EX xvst $xr28, \base, (28 * LASX_REG_WIDTH) 26061650023SHuacai Chen EX xvst $xr29, \base, (29 * LASX_REG_WIDTH) 26161650023SHuacai Chen EX xvst $xr30, \base, (30 * LASX_REG_WIDTH) 26261650023SHuacai Chen EX xvst $xr31, \base, (31 * LASX_REG_WIDTH) 26361650023SHuacai Chen#endif 26461650023SHuacai Chen .endm 26561650023SHuacai Chen 26661650023SHuacai Chen .macro sc_restore_lasx base 26761650023SHuacai Chen#ifdef CONFIG_CPU_HAS_LASX 26861650023SHuacai Chen EX xvld $xr0, \base, (0 * LASX_REG_WIDTH) 26961650023SHuacai Chen EX xvld $xr1, \base, (1 * LASX_REG_WIDTH) 27061650023SHuacai Chen EX xvld $xr2, \base, (2 * LASX_REG_WIDTH) 27161650023SHuacai Chen EX xvld $xr3, \base, (3 * LASX_REG_WIDTH) 27261650023SHuacai Chen EX xvld $xr4, \base, (4 * LASX_REG_WIDTH) 27361650023SHuacai Chen EX xvld $xr5, \base, (5 * LASX_REG_WIDTH) 27461650023SHuacai Chen EX xvld $xr6, \base, (6 * LASX_REG_WIDTH) 27561650023SHuacai Chen EX xvld $xr7, \base, (7 * LASX_REG_WIDTH) 27661650023SHuacai Chen EX xvld $xr8, \base, (8 * LASX_REG_WIDTH) 27761650023SHuacai Chen EX xvld $xr9, \base, (9 * LASX_REG_WIDTH) 27861650023SHuacai Chen EX xvld $xr10, \base, (10 * LASX_REG_WIDTH) 27961650023SHuacai Chen EX xvld $xr11, \base, (11 * LASX_REG_WIDTH) 28061650023SHuacai Chen EX xvld $xr12, \base, (12 * LASX_REG_WIDTH) 28161650023SHuacai Chen EX xvld $xr13, \base, (13 * LASX_REG_WIDTH) 28261650023SHuacai Chen EX xvld $xr14, \base, (14 * LASX_REG_WIDTH) 28361650023SHuacai Chen EX xvld $xr15, \base, (15 * LASX_REG_WIDTH) 28461650023SHuacai Chen EX xvld $xr16, \base, (16 * LASX_REG_WIDTH) 28561650023SHuacai Chen EX xvld $xr17, \base, (17 * LASX_REG_WIDTH) 28661650023SHuacai Chen EX xvld $xr18, \base, (18 * LASX_REG_WIDTH) 28761650023SHuacai Chen EX xvld $xr19, \base, (19 * LASX_REG_WIDTH) 28861650023SHuacai Chen EX xvld $xr20, \base, (20 * LASX_REG_WIDTH) 28961650023SHuacai Chen EX xvld $xr21, \base, (21 * LASX_REG_WIDTH) 29061650023SHuacai Chen EX xvld $xr22, \base, (22 * LASX_REG_WIDTH) 29161650023SHuacai Chen EX xvld $xr23, \base, (23 * LASX_REG_WIDTH) 29261650023SHuacai Chen EX xvld $xr24, \base, (24 * LASX_REG_WIDTH) 29361650023SHuacai Chen EX xvld $xr25, \base, (25 * LASX_REG_WIDTH) 29461650023SHuacai Chen EX xvld $xr26, \base, (26 * LASX_REG_WIDTH) 29561650023SHuacai Chen EX xvld $xr27, \base, (27 * LASX_REG_WIDTH) 29661650023SHuacai Chen EX xvld $xr28, \base, (28 * LASX_REG_WIDTH) 29761650023SHuacai Chen EX xvld $xr29, \base, (29 * LASX_REG_WIDTH) 29861650023SHuacai Chen EX xvld $xr30, \base, (30 * LASX_REG_WIDTH) 29961650023SHuacai Chen EX xvld $xr31, \base, (31 * LASX_REG_WIDTH) 30061650023SHuacai Chen#endif 30161650023SHuacai Chen .endm 30261650023SHuacai Chen 303803b0fc5SHuacai Chen/* 304803b0fc5SHuacai Chen * Save a thread's fp context. 305803b0fc5SHuacai Chen */ 306803b0fc5SHuacai ChenSYM_FUNC_START(_save_fp) 307803b0fc5SHuacai Chen fpu_save_csr a0 t1 308803b0fc5SHuacai Chen fpu_save_double a0 t1 # clobbers t1 309803b0fc5SHuacai Chen fpu_save_cc a0 t1 t2 # clobbers t1, t2 31007b48069SWANG Xuerui jr ra 311803b0fc5SHuacai ChenSYM_FUNC_END(_save_fp) 312803b0fc5SHuacai ChenEXPORT_SYMBOL(_save_fp) 313803b0fc5SHuacai Chen 314803b0fc5SHuacai Chen/* 315803b0fc5SHuacai Chen * Restore a thread's fp context. 316803b0fc5SHuacai Chen */ 317803b0fc5SHuacai ChenSYM_FUNC_START(_restore_fp) 318803b0fc5SHuacai Chen fpu_restore_double a0 t1 # clobbers t1 319*bd3c5798SQi Hu fpu_restore_csr a0 t1 t2 320803b0fc5SHuacai Chen fpu_restore_cc a0 t1 t2 # clobbers t1, t2 32107b48069SWANG Xuerui jr ra 322803b0fc5SHuacai ChenSYM_FUNC_END(_restore_fp) 323803b0fc5SHuacai Chen 32461650023SHuacai Chen#ifdef CONFIG_CPU_HAS_LSX 32561650023SHuacai Chen 32661650023SHuacai Chen/* 32761650023SHuacai Chen * Save a thread's LSX vector context. 32861650023SHuacai Chen */ 32961650023SHuacai ChenSYM_FUNC_START(_save_lsx) 33061650023SHuacai Chen lsx_save_all a0 t1 t2 33161650023SHuacai Chen jr ra 33261650023SHuacai ChenSYM_FUNC_END(_save_lsx) 33361650023SHuacai ChenEXPORT_SYMBOL(_save_lsx) 33461650023SHuacai Chen 33561650023SHuacai Chen/* 33661650023SHuacai Chen * Restore a thread's LSX vector context. 33761650023SHuacai Chen */ 33861650023SHuacai ChenSYM_FUNC_START(_restore_lsx) 33961650023SHuacai Chen lsx_restore_all a0 t1 t2 34061650023SHuacai Chen jr ra 34161650023SHuacai ChenSYM_FUNC_END(_restore_lsx) 34261650023SHuacai Chen 34361650023SHuacai ChenSYM_FUNC_START(_save_lsx_upper) 34461650023SHuacai Chen lsx_save_all_upper a0 t0 t1 34561650023SHuacai Chen jr ra 34661650023SHuacai ChenSYM_FUNC_END(_save_lsx_upper) 34761650023SHuacai Chen 34861650023SHuacai ChenSYM_FUNC_START(_restore_lsx_upper) 34961650023SHuacai Chen lsx_restore_all_upper a0 t0 t1 35061650023SHuacai Chen jr ra 35161650023SHuacai ChenSYM_FUNC_END(_restore_lsx_upper) 35261650023SHuacai Chen 35361650023SHuacai ChenSYM_FUNC_START(_init_lsx_upper) 35461650023SHuacai Chen lsx_init_all_upper t1 35561650023SHuacai Chen jr ra 35661650023SHuacai ChenSYM_FUNC_END(_init_lsx_upper) 35761650023SHuacai Chen#endif 35861650023SHuacai Chen 35961650023SHuacai Chen#ifdef CONFIG_CPU_HAS_LASX 36061650023SHuacai Chen 36161650023SHuacai Chen/* 36261650023SHuacai Chen * Save a thread's LASX vector context. 36361650023SHuacai Chen */ 36461650023SHuacai ChenSYM_FUNC_START(_save_lasx) 36561650023SHuacai Chen lasx_save_all a0 t1 t2 36661650023SHuacai Chen jr ra 36761650023SHuacai ChenSYM_FUNC_END(_save_lasx) 36861650023SHuacai ChenEXPORT_SYMBOL(_save_lasx) 36961650023SHuacai Chen 37061650023SHuacai Chen/* 37161650023SHuacai Chen * Restore a thread's LASX vector context. 37261650023SHuacai Chen */ 37361650023SHuacai ChenSYM_FUNC_START(_restore_lasx) 37461650023SHuacai Chen lasx_restore_all a0 t1 t2 37561650023SHuacai Chen jr ra 37661650023SHuacai ChenSYM_FUNC_END(_restore_lasx) 37761650023SHuacai Chen 37861650023SHuacai ChenSYM_FUNC_START(_save_lasx_upper) 37961650023SHuacai Chen lasx_save_all_upper a0 t0 t1 38061650023SHuacai Chen jr ra 38161650023SHuacai ChenSYM_FUNC_END(_save_lasx_upper) 38261650023SHuacai Chen 38361650023SHuacai ChenSYM_FUNC_START(_restore_lasx_upper) 38461650023SHuacai Chen lasx_restore_all_upper a0 t0 t1 38561650023SHuacai Chen jr ra 38661650023SHuacai ChenSYM_FUNC_END(_restore_lasx_upper) 38761650023SHuacai Chen 38861650023SHuacai ChenSYM_FUNC_START(_init_lasx_upper) 38961650023SHuacai Chen lasx_init_all_upper t1 39061650023SHuacai Chen jr ra 39161650023SHuacai ChenSYM_FUNC_END(_init_lasx_upper) 39261650023SHuacai Chen#endif 39361650023SHuacai Chen 394803b0fc5SHuacai Chen/* 395803b0fc5SHuacai Chen * Load the FPU with signalling NANS. This bit pattern we're using has 396803b0fc5SHuacai Chen * the property that no matter whether considered as single or as double 397803b0fc5SHuacai Chen * precision represents signaling NANS. 398803b0fc5SHuacai Chen * 399803b0fc5SHuacai Chen * The value to initialize fcsr0 to comes in $a0. 400803b0fc5SHuacai Chen */ 401803b0fc5SHuacai Chen 402803b0fc5SHuacai ChenSYM_FUNC_START(_init_fpu) 403803b0fc5SHuacai Chen li.w t1, CSR_EUEN_FPEN 404803b0fc5SHuacai Chen csrxchg t1, t1, LOONGARCH_CSR_EUEN 405803b0fc5SHuacai Chen 406803b0fc5SHuacai Chen movgr2fcsr fcsr0, a0 407803b0fc5SHuacai Chen 408803b0fc5SHuacai Chen li.w t1, -1 # SNaN 409803b0fc5SHuacai Chen 410803b0fc5SHuacai Chen movgr2fr.d $f0, t1 411803b0fc5SHuacai Chen movgr2fr.d $f1, t1 412803b0fc5SHuacai Chen movgr2fr.d $f2, t1 413803b0fc5SHuacai Chen movgr2fr.d $f3, t1 414803b0fc5SHuacai Chen movgr2fr.d $f4, t1 415803b0fc5SHuacai Chen movgr2fr.d $f5, t1 416803b0fc5SHuacai Chen movgr2fr.d $f6, t1 417803b0fc5SHuacai Chen movgr2fr.d $f7, t1 418803b0fc5SHuacai Chen movgr2fr.d $f8, t1 419803b0fc5SHuacai Chen movgr2fr.d $f9, t1 420803b0fc5SHuacai Chen movgr2fr.d $f10, t1 421803b0fc5SHuacai Chen movgr2fr.d $f11, t1 422803b0fc5SHuacai Chen movgr2fr.d $f12, t1 423803b0fc5SHuacai Chen movgr2fr.d $f13, t1 424803b0fc5SHuacai Chen movgr2fr.d $f14, t1 425803b0fc5SHuacai Chen movgr2fr.d $f15, t1 426803b0fc5SHuacai Chen movgr2fr.d $f16, t1 427803b0fc5SHuacai Chen movgr2fr.d $f17, t1 428803b0fc5SHuacai Chen movgr2fr.d $f18, t1 429803b0fc5SHuacai Chen movgr2fr.d $f19, t1 430803b0fc5SHuacai Chen movgr2fr.d $f20, t1 431803b0fc5SHuacai Chen movgr2fr.d $f21, t1 432803b0fc5SHuacai Chen movgr2fr.d $f22, t1 433803b0fc5SHuacai Chen movgr2fr.d $f23, t1 434803b0fc5SHuacai Chen movgr2fr.d $f24, t1 435803b0fc5SHuacai Chen movgr2fr.d $f25, t1 436803b0fc5SHuacai Chen movgr2fr.d $f26, t1 437803b0fc5SHuacai Chen movgr2fr.d $f27, t1 438803b0fc5SHuacai Chen movgr2fr.d $f28, t1 439803b0fc5SHuacai Chen movgr2fr.d $f29, t1 440803b0fc5SHuacai Chen movgr2fr.d $f30, t1 441803b0fc5SHuacai Chen movgr2fr.d $f31, t1 442803b0fc5SHuacai Chen 44307b48069SWANG Xuerui jr ra 444803b0fc5SHuacai ChenSYM_FUNC_END(_init_fpu) 445803b0fc5SHuacai Chen 446803b0fc5SHuacai Chen/* 447803b0fc5SHuacai Chen * a0: fpregs 448803b0fc5SHuacai Chen * a1: fcc 449803b0fc5SHuacai Chen * a2: fcsr 450803b0fc5SHuacai Chen */ 451803b0fc5SHuacai ChenSYM_FUNC_START(_save_fp_context) 452803b0fc5SHuacai Chen sc_save_fcc a1 t1 t2 453803b0fc5SHuacai Chen sc_save_fcsr a2 t1 454803b0fc5SHuacai Chen sc_save_fp a0 455803b0fc5SHuacai Chen li.w a0, 0 # success 45607b48069SWANG Xuerui jr ra 457803b0fc5SHuacai ChenSYM_FUNC_END(_save_fp_context) 458803b0fc5SHuacai Chen 459803b0fc5SHuacai Chen/* 460803b0fc5SHuacai Chen * a0: fpregs 461803b0fc5SHuacai Chen * a1: fcc 462803b0fc5SHuacai Chen * a2: fcsr 463803b0fc5SHuacai Chen */ 464803b0fc5SHuacai ChenSYM_FUNC_START(_restore_fp_context) 465803b0fc5SHuacai Chen sc_restore_fp a0 466803b0fc5SHuacai Chen sc_restore_fcc a1 t1 t2 467803b0fc5SHuacai Chen sc_restore_fcsr a2 t1 468803b0fc5SHuacai Chen li.w a0, 0 # success 46907b48069SWANG Xuerui jr ra 470803b0fc5SHuacai ChenSYM_FUNC_END(_restore_fp_context) 471803b0fc5SHuacai Chen 47261650023SHuacai Chen/* 47361650023SHuacai Chen * a0: fpregs 47461650023SHuacai Chen * a1: fcc 47561650023SHuacai Chen * a2: fcsr 47661650023SHuacai Chen */ 47761650023SHuacai ChenSYM_FUNC_START(_save_lsx_context) 47861650023SHuacai Chen sc_save_fcc a1, t0, t1 47961650023SHuacai Chen sc_save_fcsr a2, t0 48061650023SHuacai Chen sc_save_lsx a0 48161650023SHuacai Chen li.w a0, 0 # success 48261650023SHuacai Chen jr ra 48361650023SHuacai ChenSYM_FUNC_END(_save_lsx_context) 48461650023SHuacai Chen 48561650023SHuacai Chen/* 48661650023SHuacai Chen * a0: fpregs 48761650023SHuacai Chen * a1: fcc 48861650023SHuacai Chen * a2: fcsr 48961650023SHuacai Chen */ 49061650023SHuacai ChenSYM_FUNC_START(_restore_lsx_context) 49161650023SHuacai Chen sc_restore_lsx a0 49261650023SHuacai Chen sc_restore_fcc a1, t1, t2 49361650023SHuacai Chen sc_restore_fcsr a2, t1 49461650023SHuacai Chen li.w a0, 0 # success 49561650023SHuacai Chen jr ra 49661650023SHuacai ChenSYM_FUNC_END(_restore_lsx_context) 49761650023SHuacai Chen 49861650023SHuacai Chen/* 49961650023SHuacai Chen * a0: fpregs 50061650023SHuacai Chen * a1: fcc 50161650023SHuacai Chen * a2: fcsr 50261650023SHuacai Chen */ 50361650023SHuacai ChenSYM_FUNC_START(_save_lasx_context) 50461650023SHuacai Chen sc_save_fcc a1, t0, t1 50561650023SHuacai Chen sc_save_fcsr a2, t0 50661650023SHuacai Chen sc_save_lasx a0 50761650023SHuacai Chen li.w a0, 0 # success 50861650023SHuacai Chen jr ra 50961650023SHuacai ChenSYM_FUNC_END(_save_lasx_context) 51061650023SHuacai Chen 51161650023SHuacai Chen/* 51261650023SHuacai Chen * a0: fpregs 51361650023SHuacai Chen * a1: fcc 51461650023SHuacai Chen * a2: fcsr 51561650023SHuacai Chen */ 51661650023SHuacai ChenSYM_FUNC_START(_restore_lasx_context) 51761650023SHuacai Chen sc_restore_lasx a0 51861650023SHuacai Chen sc_restore_fcc a1, t1, t2 51961650023SHuacai Chen sc_restore_fcsr a2, t1 52061650023SHuacai Chen li.w a0, 0 # success 52161650023SHuacai Chen jr ra 52261650023SHuacai ChenSYM_FUNC_END(_restore_lasx_context) 52361650023SHuacai Chen 5248f58c571STiezhu Yang.L_fpu_fault: 525803b0fc5SHuacai Chen li.w a0, -EFAULT # failure 52607b48069SWANG Xuerui jr ra 527