Path: blob/master/arch/loongarch/include/asm/asmmacro.h
51978 views
/* SPDX-License-Identifier: GPL-2.0 */1/*2* Copyright (C) 2020-2022 Loongson Technology Corporation Limited3*/4#ifndef _ASM_ASMMACRO_H5#define _ASM_ASMMACRO_H67#include <linux/sizes.h>8#include <asm/asm-offsets.h>9#include <asm/regdef.h>10#include <asm/fpregdef.h>11#include <asm/loongarch.h>1213#ifdef CONFIG_64BIT14#define TASK_STRUCT_OFFSET 015#else16#define TASK_STRUCT_OFFSET 200017#endif1819.macro cpu_save_nonscratch thread20LONG_SPTR s0, \thread, (THREAD_REG23 - TASK_STRUCT_OFFSET)21LONG_SPTR s1, \thread, (THREAD_REG24 - TASK_STRUCT_OFFSET)22LONG_SPTR s2, \thread, (THREAD_REG25 - TASK_STRUCT_OFFSET)23LONG_SPTR s3, \thread, (THREAD_REG26 - TASK_STRUCT_OFFSET)24LONG_SPTR s4, \thread, (THREAD_REG27 - TASK_STRUCT_OFFSET)25LONG_SPTR s5, \thread, (THREAD_REG28 - TASK_STRUCT_OFFSET)26LONG_SPTR s6, \thread, (THREAD_REG29 - TASK_STRUCT_OFFSET)27LONG_SPTR s7, \thread, (THREAD_REG30 - TASK_STRUCT_OFFSET)28LONG_SPTR s8, \thread, (THREAD_REG31 - TASK_STRUCT_OFFSET)29LONG_SPTR ra, \thread, (THREAD_REG01 - TASK_STRUCT_OFFSET)30LONG_SPTR sp, \thread, (THREAD_REG03 - TASK_STRUCT_OFFSET)31LONG_SPTR fp, \thread, (THREAD_REG22 - TASK_STRUCT_OFFSET)32.endm3334.macro cpu_restore_nonscratch thread35LONG_LPTR s0, \thread, (THREAD_REG23 - TASK_STRUCT_OFFSET)36LONG_LPTR s1, \thread, (THREAD_REG24 - TASK_STRUCT_OFFSET)37LONG_LPTR s2, \thread, (THREAD_REG25 - TASK_STRUCT_OFFSET)38LONG_LPTR s3, \thread, (THREAD_REG26 - TASK_STRUCT_OFFSET)39LONG_LPTR s4, \thread, (THREAD_REG27 - TASK_STRUCT_OFFSET)40LONG_LPTR s5, \thread, (THREAD_REG28 - TASK_STRUCT_OFFSET)41LONG_LPTR s6, \thread, (THREAD_REG29 - TASK_STRUCT_OFFSET)42LONG_LPTR s7, \thread, (THREAD_REG30 - TASK_STRUCT_OFFSET)43LONG_LPTR s8, \thread, (THREAD_REG31 - TASK_STRUCT_OFFSET)44LONG_LPTR ra, \thread, (THREAD_REG01 - TASK_STRUCT_OFFSET)45LONG_LPTR sp, \thread, (THREAD_REG03 - TASK_STRUCT_OFFSET)46LONG_LPTR fp, \thread, (THREAD_REG22 - TASK_STRUCT_OFFSET)47.endm4849.macro fpu_save_csr thread tmp50movfcsr2gr \tmp, fcsr051#ifdef CONFIG_32BIT52st.w \tmp, \thread, THREAD_FCSR53#else54stptr.w \tmp, \thread, THREAD_FCSR55#endif56#ifdef CONFIG_CPU_HAS_LBT57/* TM bit is always 0 if LBT not supported */58andi \tmp, \tmp, FPU_CSR_TM59beqz \tmp, 1f60/* Save FTOP */61x86mftop \tmp62stptr.w \tmp, \thread, THREAD_FTOP63/* Turn off TM to ensure the order of FPR in memory independent of TM */64x86clrtm651:66#endif67.endm6869.macro fpu_restore_csr thread tmp0 tmp170#ifdef CONFIG_32BIT71ld.w \tmp0, \thread, THREAD_FCSR72#else73ldptr.w \tmp0, \thread, THREAD_FCSR74#endif75movgr2fcsr fcsr0, \tmp076#ifdef CONFIG_CPU_HAS_LBT77/* TM bit is always 0 if LBT not supported */78andi \tmp0, \tmp0, FPU_CSR_TM79beqz \tmp0, 2f80/* Restore FTOP */81ldptr.w \tmp0, \thread, THREAD_FTOP82andi \tmp0, \tmp0, 0x783la.pcrel \tmp1, 1f84alsl.d \tmp1, \tmp0, \tmp1, 385jr \tmp1861:87x86mttop 088b 2f89x86mttop 190b 2f91x86mttop 292b 2f93x86mttop 394b 2f95x86mttop 496b 2f97x86mttop 598b 2f99x86mttop 6100b 2f101x86mttop 71022:103#endif104.endm105106#ifdef CONFIG_32BIT107.macro fpu_save_cc thread tmp0 tmp1108movcf2gr \tmp0, $fcc0109move \tmp1, \tmp0110movcf2gr \tmp0, $fcc1111bstrins.w \tmp1, \tmp0, 15, 8112movcf2gr \tmp0, $fcc2113bstrins.w \tmp1, \tmp0, 23, 16114movcf2gr \tmp0, $fcc3115bstrins.w \tmp1, \tmp0, 31, 24116st.w \tmp1, \thread, THREAD_FCC117movcf2gr \tmp0, $fcc4118move \tmp1, \tmp0119movcf2gr \tmp0, $fcc5120bstrins.w \tmp1, \tmp0, 15, 8121movcf2gr \tmp0, $fcc6122bstrins.w \tmp1, \tmp0, 23, 16123movcf2gr \tmp0, $fcc7124bstrins.w \tmp1, \tmp0, 31, 24125st.w \tmp1, \thread, (THREAD_FCC + 4)126.endm127128.macro fpu_restore_cc thread tmp0 tmp1129ld.w \tmp0, \thread, THREAD_FCC130bstrpick.w \tmp1, \tmp0, 7, 0131movgr2cf $fcc0, \tmp1132bstrpick.w \tmp1, \tmp0, 15, 8133movgr2cf $fcc1, \tmp1134bstrpick.w \tmp1, \tmp0, 23, 16135movgr2cf $fcc2, \tmp1136bstrpick.w \tmp1, \tmp0, 31, 24137movgr2cf $fcc3, \tmp1138ld.w \tmp0, \thread, (THREAD_FCC + 4)139bstrpick.w \tmp1, \tmp0, 7, 0140movgr2cf $fcc4, \tmp1141bstrpick.w \tmp1, \tmp0, 15, 8142movgr2cf $fcc5, \tmp1143bstrpick.w \tmp1, \tmp0, 23, 16144movgr2cf $fcc6, \tmp1145bstrpick.w \tmp1, \tmp0, 31, 24146movgr2cf $fcc7, \tmp1147.endm148#else149.macro fpu_save_cc thread tmp0 tmp1150movcf2gr \tmp0, $fcc0151move \tmp1, \tmp0152movcf2gr \tmp0, $fcc1153bstrins.d \tmp1, \tmp0, 15, 8154movcf2gr \tmp0, $fcc2155bstrins.d \tmp1, \tmp0, 23, 16156movcf2gr \tmp0, $fcc3157bstrins.d \tmp1, \tmp0, 31, 24158movcf2gr \tmp0, $fcc4159bstrins.d \tmp1, \tmp0, 39, 32160movcf2gr \tmp0, $fcc5161bstrins.d \tmp1, \tmp0, 47, 40162movcf2gr \tmp0, $fcc6163bstrins.d \tmp1, \tmp0, 55, 48164movcf2gr \tmp0, $fcc7165bstrins.d \tmp1, \tmp0, 63, 56166stptr.d \tmp1, \thread, THREAD_FCC167.endm168169.macro fpu_restore_cc thread tmp0 tmp1170ldptr.d \tmp0, \thread, THREAD_FCC171bstrpick.d \tmp1, \tmp0, 7, 0172movgr2cf $fcc0, \tmp1173bstrpick.d \tmp1, \tmp0, 15, 8174movgr2cf $fcc1, \tmp1175bstrpick.d \tmp1, \tmp0, 23, 16176movgr2cf $fcc2, \tmp1177bstrpick.d \tmp1, \tmp0, 31, 24178movgr2cf $fcc3, \tmp1179bstrpick.d \tmp1, \tmp0, 39, 32180movgr2cf $fcc4, \tmp1181bstrpick.d \tmp1, \tmp0, 47, 40182movgr2cf $fcc5, \tmp1183bstrpick.d \tmp1, \tmp0, 55, 48184movgr2cf $fcc6, \tmp1185bstrpick.d \tmp1, \tmp0, 63, 56186movgr2cf $fcc7, \tmp1187.endm188#endif189190.macro fpu_save_double thread tmp191li.w \tmp, THREAD_FPR0192PTR_ADD \tmp, \tmp, \thread193fst.d $f0, \tmp, THREAD_FPR0 - THREAD_FPR0194fst.d $f1, \tmp, THREAD_FPR1 - THREAD_FPR0195fst.d $f2, \tmp, THREAD_FPR2 - THREAD_FPR0196fst.d $f3, \tmp, THREAD_FPR3 - THREAD_FPR0197fst.d $f4, \tmp, THREAD_FPR4 - THREAD_FPR0198fst.d $f5, \tmp, THREAD_FPR5 - THREAD_FPR0199fst.d $f6, \tmp, THREAD_FPR6 - THREAD_FPR0200fst.d $f7, \tmp, THREAD_FPR7 - THREAD_FPR0201fst.d $f8, \tmp, THREAD_FPR8 - THREAD_FPR0202fst.d $f9, \tmp, THREAD_FPR9 - THREAD_FPR0203fst.d $f10, \tmp, THREAD_FPR10 - THREAD_FPR0204fst.d $f11, \tmp, THREAD_FPR11 - THREAD_FPR0205fst.d $f12, \tmp, THREAD_FPR12 - THREAD_FPR0206fst.d $f13, \tmp, THREAD_FPR13 - THREAD_FPR0207fst.d $f14, \tmp, THREAD_FPR14 - THREAD_FPR0208fst.d $f15, \tmp, THREAD_FPR15 - THREAD_FPR0209fst.d $f16, \tmp, THREAD_FPR16 - THREAD_FPR0210fst.d $f17, \tmp, THREAD_FPR17 - THREAD_FPR0211fst.d $f18, \tmp, THREAD_FPR18 - THREAD_FPR0212fst.d $f19, \tmp, THREAD_FPR19 - THREAD_FPR0213fst.d $f20, \tmp, THREAD_FPR20 - THREAD_FPR0214fst.d $f21, \tmp, THREAD_FPR21 - THREAD_FPR0215fst.d $f22, \tmp, THREAD_FPR22 - THREAD_FPR0216fst.d $f23, \tmp, THREAD_FPR23 - THREAD_FPR0217fst.d $f24, \tmp, THREAD_FPR24 - THREAD_FPR0218fst.d $f25, \tmp, THREAD_FPR25 - THREAD_FPR0219fst.d $f26, \tmp, THREAD_FPR26 - THREAD_FPR0220fst.d $f27, \tmp, THREAD_FPR27 - THREAD_FPR0221fst.d $f28, \tmp, THREAD_FPR28 - THREAD_FPR0222fst.d $f29, \tmp, THREAD_FPR29 - THREAD_FPR0223fst.d $f30, \tmp, THREAD_FPR30 - THREAD_FPR0224fst.d $f31, \tmp, THREAD_FPR31 - THREAD_FPR0225.endm226227.macro fpu_restore_double thread tmp228li.w \tmp, THREAD_FPR0229PTR_ADD \tmp, \tmp, \thread230fld.d $f0, \tmp, THREAD_FPR0 - THREAD_FPR0231fld.d $f1, \tmp, THREAD_FPR1 - THREAD_FPR0232fld.d $f2, \tmp, THREAD_FPR2 - THREAD_FPR0233fld.d $f3, \tmp, THREAD_FPR3 - THREAD_FPR0234fld.d $f4, \tmp, THREAD_FPR4 - THREAD_FPR0235fld.d $f5, \tmp, THREAD_FPR5 - THREAD_FPR0236fld.d $f6, \tmp, THREAD_FPR6 - THREAD_FPR0237fld.d $f7, \tmp, THREAD_FPR7 - THREAD_FPR0238fld.d $f8, \tmp, THREAD_FPR8 - THREAD_FPR0239fld.d $f9, \tmp, THREAD_FPR9 - THREAD_FPR0240fld.d $f10, \tmp, THREAD_FPR10 - THREAD_FPR0241fld.d $f11, \tmp, THREAD_FPR11 - THREAD_FPR0242fld.d $f12, \tmp, THREAD_FPR12 - THREAD_FPR0243fld.d $f13, \tmp, THREAD_FPR13 - THREAD_FPR0244fld.d $f14, \tmp, THREAD_FPR14 - THREAD_FPR0245fld.d $f15, \tmp, THREAD_FPR15 - THREAD_FPR0246fld.d $f16, \tmp, THREAD_FPR16 - THREAD_FPR0247fld.d $f17, \tmp, THREAD_FPR17 - THREAD_FPR0248fld.d $f18, \tmp, THREAD_FPR18 - THREAD_FPR0249fld.d $f19, \tmp, THREAD_FPR19 - THREAD_FPR0250fld.d $f20, \tmp, THREAD_FPR20 - THREAD_FPR0251fld.d $f21, \tmp, THREAD_FPR21 - THREAD_FPR0252fld.d $f22, \tmp, THREAD_FPR22 - THREAD_FPR0253fld.d $f23, \tmp, THREAD_FPR23 - THREAD_FPR0254fld.d $f24, \tmp, THREAD_FPR24 - THREAD_FPR0255fld.d $f25, \tmp, THREAD_FPR25 - THREAD_FPR0256fld.d $f26, \tmp, THREAD_FPR26 - THREAD_FPR0257fld.d $f27, \tmp, THREAD_FPR27 - THREAD_FPR0258fld.d $f28, \tmp, THREAD_FPR28 - THREAD_FPR0259fld.d $f29, \tmp, THREAD_FPR29 - THREAD_FPR0260fld.d $f30, \tmp, THREAD_FPR30 - THREAD_FPR0261fld.d $f31, \tmp, THREAD_FPR31 - THREAD_FPR0262.endm263264.macro lsx_save_data thread tmp265li.w \tmp, THREAD_FPR0266PTR_ADD \tmp, \thread, \tmp267vst $vr0, \tmp, THREAD_FPR0 - THREAD_FPR0268vst $vr1, \tmp, THREAD_FPR1 - THREAD_FPR0269vst $vr2, \tmp, THREAD_FPR2 - THREAD_FPR0270vst $vr3, \tmp, THREAD_FPR3 - THREAD_FPR0271vst $vr4, \tmp, THREAD_FPR4 - THREAD_FPR0272vst $vr5, \tmp, THREAD_FPR5 - THREAD_FPR0273vst $vr6, \tmp, THREAD_FPR6 - THREAD_FPR0274vst $vr7, \tmp, THREAD_FPR7 - THREAD_FPR0275vst $vr8, \tmp, THREAD_FPR8 - THREAD_FPR0276vst $vr9, \tmp, THREAD_FPR9 - THREAD_FPR0277vst $vr10, \tmp, THREAD_FPR10 - THREAD_FPR0278vst $vr11, \tmp, THREAD_FPR11 - THREAD_FPR0279vst $vr12, \tmp, THREAD_FPR12 - THREAD_FPR0280vst $vr13, \tmp, THREAD_FPR13 - THREAD_FPR0281vst $vr14, \tmp, THREAD_FPR14 - THREAD_FPR0282vst $vr15, \tmp, THREAD_FPR15 - THREAD_FPR0283vst $vr16, \tmp, THREAD_FPR16 - THREAD_FPR0284vst $vr17, \tmp, THREAD_FPR17 - THREAD_FPR0285vst $vr18, \tmp, THREAD_FPR18 - THREAD_FPR0286vst $vr19, \tmp, THREAD_FPR19 - THREAD_FPR0287vst $vr20, \tmp, THREAD_FPR20 - THREAD_FPR0288vst $vr21, \tmp, THREAD_FPR21 - THREAD_FPR0289vst $vr22, \tmp, THREAD_FPR22 - THREAD_FPR0290vst $vr23, \tmp, THREAD_FPR23 - THREAD_FPR0291vst $vr24, \tmp, THREAD_FPR24 - THREAD_FPR0292vst $vr25, \tmp, THREAD_FPR25 - THREAD_FPR0293vst $vr26, \tmp, THREAD_FPR26 - THREAD_FPR0294vst $vr27, \tmp, THREAD_FPR27 - THREAD_FPR0295vst $vr28, \tmp, THREAD_FPR28 - THREAD_FPR0296vst $vr29, \tmp, THREAD_FPR29 - THREAD_FPR0297vst $vr30, \tmp, THREAD_FPR30 - THREAD_FPR0298vst $vr31, \tmp, THREAD_FPR31 - THREAD_FPR0299.endm300301.macro lsx_restore_data thread tmp302li.w \tmp, THREAD_FPR0303PTR_ADD \tmp, \thread, \tmp304vld $vr0, \tmp, THREAD_FPR0 - THREAD_FPR0305vld $vr1, \tmp, THREAD_FPR1 - THREAD_FPR0306vld $vr2, \tmp, THREAD_FPR2 - THREAD_FPR0307vld $vr3, \tmp, THREAD_FPR3 - THREAD_FPR0308vld $vr4, \tmp, THREAD_FPR4 - THREAD_FPR0309vld $vr5, \tmp, THREAD_FPR5 - THREAD_FPR0310vld $vr6, \tmp, THREAD_FPR6 - THREAD_FPR0311vld $vr7, \tmp, THREAD_FPR7 - THREAD_FPR0312vld $vr8, \tmp, THREAD_FPR8 - THREAD_FPR0313vld $vr9, \tmp, THREAD_FPR9 - THREAD_FPR0314vld $vr10, \tmp, THREAD_FPR10 - THREAD_FPR0315vld $vr11, \tmp, THREAD_FPR11 - THREAD_FPR0316vld $vr12, \tmp, THREAD_FPR12 - THREAD_FPR0317vld $vr13, \tmp, THREAD_FPR13 - THREAD_FPR0318vld $vr14, \tmp, THREAD_FPR14 - THREAD_FPR0319vld $vr15, \tmp, THREAD_FPR15 - THREAD_FPR0320vld $vr16, \tmp, THREAD_FPR16 - THREAD_FPR0321vld $vr17, \tmp, THREAD_FPR17 - THREAD_FPR0322vld $vr18, \tmp, THREAD_FPR18 - THREAD_FPR0323vld $vr19, \tmp, THREAD_FPR19 - THREAD_FPR0324vld $vr20, \tmp, THREAD_FPR20 - THREAD_FPR0325vld $vr21, \tmp, THREAD_FPR21 - THREAD_FPR0326vld $vr22, \tmp, THREAD_FPR22 - THREAD_FPR0327vld $vr23, \tmp, THREAD_FPR23 - THREAD_FPR0328vld $vr24, \tmp, THREAD_FPR24 - THREAD_FPR0329vld $vr25, \tmp, THREAD_FPR25 - THREAD_FPR0330vld $vr26, \tmp, THREAD_FPR26 - THREAD_FPR0331vld $vr27, \tmp, THREAD_FPR27 - THREAD_FPR0332vld $vr28, \tmp, THREAD_FPR28 - THREAD_FPR0333vld $vr29, \tmp, THREAD_FPR29 - THREAD_FPR0334vld $vr30, \tmp, THREAD_FPR30 - THREAD_FPR0335vld $vr31, \tmp, THREAD_FPR31 - THREAD_FPR0336.endm337338.macro lsx_save_all thread tmp0 tmp1339fpu_save_cc \thread, \tmp0, \tmp1340fpu_save_csr \thread, \tmp0341lsx_save_data \thread, \tmp0342.endm343344.macro lsx_restore_all thread tmp0 tmp1345lsx_restore_data \thread, \tmp0346fpu_restore_cc \thread, \tmp0, \tmp1347fpu_restore_csr \thread, \tmp0, \tmp1348.endm349350.macro lsx_save_upper vd base tmp off351vpickve2gr.d \tmp, \vd, 1352st.d \tmp, \base, (\off+8)353.endm354355.macro lsx_save_all_upper thread base tmp356li.w \tmp, THREAD_FPR0357PTR_ADD \base, \thread, \tmp358lsx_save_upper $vr0, \base, \tmp, (THREAD_FPR0-THREAD_FPR0)359lsx_save_upper $vr1, \base, \tmp, (THREAD_FPR1-THREAD_FPR0)360lsx_save_upper $vr2, \base, \tmp, (THREAD_FPR2-THREAD_FPR0)361lsx_save_upper $vr3, \base, \tmp, (THREAD_FPR3-THREAD_FPR0)362lsx_save_upper $vr4, \base, \tmp, (THREAD_FPR4-THREAD_FPR0)363lsx_save_upper $vr5, \base, \tmp, (THREAD_FPR5-THREAD_FPR0)364lsx_save_upper $vr6, \base, \tmp, (THREAD_FPR6-THREAD_FPR0)365lsx_save_upper $vr7, \base, \tmp, (THREAD_FPR7-THREAD_FPR0)366lsx_save_upper $vr8, \base, \tmp, (THREAD_FPR8-THREAD_FPR0)367lsx_save_upper $vr9, \base, \tmp, (THREAD_FPR9-THREAD_FPR0)368lsx_save_upper $vr10, \base, \tmp, (THREAD_FPR10-THREAD_FPR0)369lsx_save_upper $vr11, \base, \tmp, (THREAD_FPR11-THREAD_FPR0)370lsx_save_upper $vr12, \base, \tmp, (THREAD_FPR12-THREAD_FPR0)371lsx_save_upper $vr13, \base, \tmp, (THREAD_FPR13-THREAD_FPR0)372lsx_save_upper $vr14, \base, \tmp, (THREAD_FPR14-THREAD_FPR0)373lsx_save_upper $vr15, \base, \tmp, (THREAD_FPR15-THREAD_FPR0)374lsx_save_upper $vr16, \base, \tmp, (THREAD_FPR16-THREAD_FPR0)375lsx_save_upper $vr17, \base, \tmp, (THREAD_FPR17-THREAD_FPR0)376lsx_save_upper $vr18, \base, \tmp, (THREAD_FPR18-THREAD_FPR0)377lsx_save_upper $vr19, \base, \tmp, (THREAD_FPR19-THREAD_FPR0)378lsx_save_upper $vr20, \base, \tmp, (THREAD_FPR20-THREAD_FPR0)379lsx_save_upper $vr21, \base, \tmp, (THREAD_FPR21-THREAD_FPR0)380lsx_save_upper $vr22, \base, \tmp, (THREAD_FPR22-THREAD_FPR0)381lsx_save_upper $vr23, \base, \tmp, (THREAD_FPR23-THREAD_FPR0)382lsx_save_upper $vr24, \base, \tmp, (THREAD_FPR24-THREAD_FPR0)383lsx_save_upper $vr25, \base, \tmp, (THREAD_FPR25-THREAD_FPR0)384lsx_save_upper $vr26, \base, \tmp, (THREAD_FPR26-THREAD_FPR0)385lsx_save_upper $vr27, \base, \tmp, (THREAD_FPR27-THREAD_FPR0)386lsx_save_upper $vr28, \base, \tmp, (THREAD_FPR28-THREAD_FPR0)387lsx_save_upper $vr29, \base, \tmp, (THREAD_FPR29-THREAD_FPR0)388lsx_save_upper $vr30, \base, \tmp, (THREAD_FPR30-THREAD_FPR0)389lsx_save_upper $vr31, \base, \tmp, (THREAD_FPR31-THREAD_FPR0)390.endm391392.macro lsx_restore_upper vd base tmp off393ld.d \tmp, \base, (\off+8)394vinsgr2vr.d \vd, \tmp, 1395.endm396397.macro lsx_restore_all_upper thread base tmp398li.w \tmp, THREAD_FPR0399PTR_ADD \base, \thread, \tmp400lsx_restore_upper $vr0, \base, \tmp, (THREAD_FPR0-THREAD_FPR0)401lsx_restore_upper $vr1, \base, \tmp, (THREAD_FPR1-THREAD_FPR0)402lsx_restore_upper $vr2, \base, \tmp, (THREAD_FPR2-THREAD_FPR0)403lsx_restore_upper $vr3, \base, \tmp, (THREAD_FPR3-THREAD_FPR0)404lsx_restore_upper $vr4, \base, \tmp, (THREAD_FPR4-THREAD_FPR0)405lsx_restore_upper $vr5, \base, \tmp, (THREAD_FPR5-THREAD_FPR0)406lsx_restore_upper $vr6, \base, \tmp, (THREAD_FPR6-THREAD_FPR0)407lsx_restore_upper $vr7, \base, \tmp, (THREAD_FPR7-THREAD_FPR0)408lsx_restore_upper $vr8, \base, \tmp, (THREAD_FPR8-THREAD_FPR0)409lsx_restore_upper $vr9, \base, \tmp, (THREAD_FPR9-THREAD_FPR0)410lsx_restore_upper $vr10, \base, \tmp, (THREAD_FPR10-THREAD_FPR0)411lsx_restore_upper $vr11, \base, \tmp, (THREAD_FPR11-THREAD_FPR0)412lsx_restore_upper $vr12, \base, \tmp, (THREAD_FPR12-THREAD_FPR0)413lsx_restore_upper $vr13, \base, \tmp, (THREAD_FPR13-THREAD_FPR0)414lsx_restore_upper $vr14, \base, \tmp, (THREAD_FPR14-THREAD_FPR0)415lsx_restore_upper $vr15, \base, \tmp, (THREAD_FPR15-THREAD_FPR0)416lsx_restore_upper $vr16, \base, \tmp, (THREAD_FPR16-THREAD_FPR0)417lsx_restore_upper $vr17, \base, \tmp, (THREAD_FPR17-THREAD_FPR0)418lsx_restore_upper $vr18, \base, \tmp, (THREAD_FPR18-THREAD_FPR0)419lsx_restore_upper $vr19, \base, \tmp, (THREAD_FPR19-THREAD_FPR0)420lsx_restore_upper $vr20, \base, \tmp, (THREAD_FPR20-THREAD_FPR0)421lsx_restore_upper $vr21, \base, \tmp, (THREAD_FPR21-THREAD_FPR0)422lsx_restore_upper $vr22, \base, \tmp, (THREAD_FPR22-THREAD_FPR0)423lsx_restore_upper $vr23, \base, \tmp, (THREAD_FPR23-THREAD_FPR0)424lsx_restore_upper $vr24, \base, \tmp, (THREAD_FPR24-THREAD_FPR0)425lsx_restore_upper $vr25, \base, \tmp, (THREAD_FPR25-THREAD_FPR0)426lsx_restore_upper $vr26, \base, \tmp, (THREAD_FPR26-THREAD_FPR0)427lsx_restore_upper $vr27, \base, \tmp, (THREAD_FPR27-THREAD_FPR0)428lsx_restore_upper $vr28, \base, \tmp, (THREAD_FPR28-THREAD_FPR0)429lsx_restore_upper $vr29, \base, \tmp, (THREAD_FPR29-THREAD_FPR0)430lsx_restore_upper $vr30, \base, \tmp, (THREAD_FPR30-THREAD_FPR0)431lsx_restore_upper $vr31, \base, \tmp, (THREAD_FPR31-THREAD_FPR0)432.endm433434.macro lsx_init_upper vd tmp435vinsgr2vr.d \vd, \tmp, 1436.endm437438.macro lsx_init_all_upper tmp439not \tmp, zero440lsx_init_upper $vr0 \tmp441lsx_init_upper $vr1 \tmp442lsx_init_upper $vr2 \tmp443lsx_init_upper $vr3 \tmp444lsx_init_upper $vr4 \tmp445lsx_init_upper $vr5 \tmp446lsx_init_upper $vr6 \tmp447lsx_init_upper $vr7 \tmp448lsx_init_upper $vr8 \tmp449lsx_init_upper $vr9 \tmp450lsx_init_upper $vr10 \tmp451lsx_init_upper $vr11 \tmp452lsx_init_upper $vr12 \tmp453lsx_init_upper $vr13 \tmp454lsx_init_upper $vr14 \tmp455lsx_init_upper $vr15 \tmp456lsx_init_upper $vr16 \tmp457lsx_init_upper $vr17 \tmp458lsx_init_upper $vr18 \tmp459lsx_init_upper $vr19 \tmp460lsx_init_upper $vr20 \tmp461lsx_init_upper $vr21 \tmp462lsx_init_upper $vr22 \tmp463lsx_init_upper $vr23 \tmp464lsx_init_upper $vr24 \tmp465lsx_init_upper $vr25 \tmp466lsx_init_upper $vr26 \tmp467lsx_init_upper $vr27 \tmp468lsx_init_upper $vr28 \tmp469lsx_init_upper $vr29 \tmp470lsx_init_upper $vr30 \tmp471lsx_init_upper $vr31 \tmp472.endm473474.macro lasx_save_data thread tmp475li.w \tmp, THREAD_FPR0476PTR_ADD \tmp, \thread, \tmp477xvst $xr0, \tmp, THREAD_FPR0 - THREAD_FPR0478xvst $xr1, \tmp, THREAD_FPR1 - THREAD_FPR0479xvst $xr2, \tmp, THREAD_FPR2 - THREAD_FPR0480xvst $xr3, \tmp, THREAD_FPR3 - THREAD_FPR0481xvst $xr4, \tmp, THREAD_FPR4 - THREAD_FPR0482xvst $xr5, \tmp, THREAD_FPR5 - THREAD_FPR0483xvst $xr6, \tmp, THREAD_FPR6 - THREAD_FPR0484xvst $xr7, \tmp, THREAD_FPR7 - THREAD_FPR0485xvst $xr8, \tmp, THREAD_FPR8 - THREAD_FPR0486xvst $xr9, \tmp, THREAD_FPR9 - THREAD_FPR0487xvst $xr10, \tmp, THREAD_FPR10 - THREAD_FPR0488xvst $xr11, \tmp, THREAD_FPR11 - THREAD_FPR0489xvst $xr12, \tmp, THREAD_FPR12 - THREAD_FPR0490xvst $xr13, \tmp, THREAD_FPR13 - THREAD_FPR0491xvst $xr14, \tmp, THREAD_FPR14 - THREAD_FPR0492xvst $xr15, \tmp, THREAD_FPR15 - THREAD_FPR0493xvst $xr16, \tmp, THREAD_FPR16 - THREAD_FPR0494xvst $xr17, \tmp, THREAD_FPR17 - THREAD_FPR0495xvst $xr18, \tmp, THREAD_FPR18 - THREAD_FPR0496xvst $xr19, \tmp, THREAD_FPR19 - THREAD_FPR0497xvst $xr20, \tmp, THREAD_FPR20 - THREAD_FPR0498xvst $xr21, \tmp, THREAD_FPR21 - THREAD_FPR0499xvst $xr22, \tmp, THREAD_FPR22 - THREAD_FPR0500xvst $xr23, \tmp, THREAD_FPR23 - THREAD_FPR0501xvst $xr24, \tmp, THREAD_FPR24 - THREAD_FPR0502xvst $xr25, \tmp, THREAD_FPR25 - THREAD_FPR0503xvst $xr26, \tmp, THREAD_FPR26 - THREAD_FPR0504xvst $xr27, \tmp, THREAD_FPR27 - THREAD_FPR0505xvst $xr28, \tmp, THREAD_FPR28 - THREAD_FPR0506xvst $xr29, \tmp, THREAD_FPR29 - THREAD_FPR0507xvst $xr30, \tmp, THREAD_FPR30 - THREAD_FPR0508xvst $xr31, \tmp, THREAD_FPR31 - THREAD_FPR0509.endm510511.macro lasx_restore_data thread tmp512li.w \tmp, THREAD_FPR0513PTR_ADD \tmp, \thread, \tmp514xvld $xr0, \tmp, THREAD_FPR0 - THREAD_FPR0515xvld $xr1, \tmp, THREAD_FPR1 - THREAD_FPR0516xvld $xr2, \tmp, THREAD_FPR2 - THREAD_FPR0517xvld $xr3, \tmp, THREAD_FPR3 - THREAD_FPR0518xvld $xr4, \tmp, THREAD_FPR4 - THREAD_FPR0519xvld $xr5, \tmp, THREAD_FPR5 - THREAD_FPR0520xvld $xr6, \tmp, THREAD_FPR6 - THREAD_FPR0521xvld $xr7, \tmp, THREAD_FPR7 - THREAD_FPR0522xvld $xr8, \tmp, THREAD_FPR8 - THREAD_FPR0523xvld $xr9, \tmp, THREAD_FPR9 - THREAD_FPR0524xvld $xr10, \tmp, THREAD_FPR10 - THREAD_FPR0525xvld $xr11, \tmp, THREAD_FPR11 - THREAD_FPR0526xvld $xr12, \tmp, THREAD_FPR12 - THREAD_FPR0527xvld $xr13, \tmp, THREAD_FPR13 - THREAD_FPR0528xvld $xr14, \tmp, THREAD_FPR14 - THREAD_FPR0529xvld $xr15, \tmp, THREAD_FPR15 - THREAD_FPR0530xvld $xr16, \tmp, THREAD_FPR16 - THREAD_FPR0531xvld $xr17, \tmp, THREAD_FPR17 - THREAD_FPR0532xvld $xr18, \tmp, THREAD_FPR18 - THREAD_FPR0533xvld $xr19, \tmp, THREAD_FPR19 - THREAD_FPR0534xvld $xr20, \tmp, THREAD_FPR20 - THREAD_FPR0535xvld $xr21, \tmp, THREAD_FPR21 - THREAD_FPR0536xvld $xr22, \tmp, THREAD_FPR22 - THREAD_FPR0537xvld $xr23, \tmp, THREAD_FPR23 - THREAD_FPR0538xvld $xr24, \tmp, THREAD_FPR24 - THREAD_FPR0539xvld $xr25, \tmp, THREAD_FPR25 - THREAD_FPR0540xvld $xr26, \tmp, THREAD_FPR26 - THREAD_FPR0541xvld $xr27, \tmp, THREAD_FPR27 - THREAD_FPR0542xvld $xr28, \tmp, THREAD_FPR28 - THREAD_FPR0543xvld $xr29, \tmp, THREAD_FPR29 - THREAD_FPR0544xvld $xr30, \tmp, THREAD_FPR30 - THREAD_FPR0545xvld $xr31, \tmp, THREAD_FPR31 - THREAD_FPR0546.endm547548.macro lasx_save_all thread tmp0 tmp1549fpu_save_cc \thread, \tmp0, \tmp1550fpu_save_csr \thread, \tmp0551lasx_save_data \thread, \tmp0552.endm553554.macro lasx_restore_all thread tmp0 tmp1555lasx_restore_data \thread, \tmp0556fpu_restore_cc \thread, \tmp0, \tmp1557fpu_restore_csr \thread, \tmp0, \tmp1558.endm559560.macro lasx_save_upper xd base tmp off561/* Nothing */562.endm563564.macro lasx_save_all_upper thread base tmp565/* Nothing */566.endm567568.macro lasx_restore_upper xd base tmp0 tmp1 off569vld \tmp0, \base, (\off+16)570xvpermi.q \xd, \tmp1, 0x2571.endm572573.macro lasx_restore_all_upper thread base tmp574li.w \tmp, THREAD_FPR0575PTR_ADD \base, \thread, \tmp576/* Save $vr31 ($xr31 lower bits) with xvpickve2gr */577xvpickve2gr.d $r17, $xr31, 0578xvpickve2gr.d $r18, $xr31, 1579lasx_restore_upper $xr0, \base, $vr31, $xr31, (THREAD_FPR0-THREAD_FPR0)580lasx_restore_upper $xr1, \base, $vr31, $xr31, (THREAD_FPR1-THREAD_FPR0)581lasx_restore_upper $xr2, \base, $vr31, $xr31, (THREAD_FPR2-THREAD_FPR0)582lasx_restore_upper $xr3, \base, $vr31, $xr31, (THREAD_FPR3-THREAD_FPR0)583lasx_restore_upper $xr4, \base, $vr31, $xr31, (THREAD_FPR4-THREAD_FPR0)584lasx_restore_upper $xr5, \base, $vr31, $xr31, (THREAD_FPR5-THREAD_FPR0)585lasx_restore_upper $xr6, \base, $vr31, $xr31, (THREAD_FPR6-THREAD_FPR0)586lasx_restore_upper $xr7, \base, $vr31, $xr31, (THREAD_FPR7-THREAD_FPR0)587lasx_restore_upper $xr8, \base, $vr31, $xr31, (THREAD_FPR8-THREAD_FPR0)588lasx_restore_upper $xr9, \base, $vr31, $xr31, (THREAD_FPR9-THREAD_FPR0)589lasx_restore_upper $xr10, \base, $vr31, $xr31, (THREAD_FPR10-THREAD_FPR0)590lasx_restore_upper $xr11, \base, $vr31, $xr31, (THREAD_FPR11-THREAD_FPR0)591lasx_restore_upper $xr12, \base, $vr31, $xr31, (THREAD_FPR12-THREAD_FPR0)592lasx_restore_upper $xr13, \base, $vr31, $xr31, (THREAD_FPR13-THREAD_FPR0)593lasx_restore_upper $xr14, \base, $vr31, $xr31, (THREAD_FPR14-THREAD_FPR0)594lasx_restore_upper $xr15, \base, $vr31, $xr31, (THREAD_FPR15-THREAD_FPR0)595lasx_restore_upper $xr16, \base, $vr31, $xr31, (THREAD_FPR16-THREAD_FPR0)596lasx_restore_upper $xr17, \base, $vr31, $xr31, (THREAD_FPR17-THREAD_FPR0)597lasx_restore_upper $xr18, \base, $vr31, $xr31, (THREAD_FPR18-THREAD_FPR0)598lasx_restore_upper $xr19, \base, $vr31, $xr31, (THREAD_FPR19-THREAD_FPR0)599lasx_restore_upper $xr20, \base, $vr31, $xr31, (THREAD_FPR20-THREAD_FPR0)600lasx_restore_upper $xr21, \base, $vr31, $xr31, (THREAD_FPR21-THREAD_FPR0)601lasx_restore_upper $xr22, \base, $vr31, $xr31, (THREAD_FPR22-THREAD_FPR0)602lasx_restore_upper $xr23, \base, $vr31, $xr31, (THREAD_FPR23-THREAD_FPR0)603lasx_restore_upper $xr24, \base, $vr31, $xr31, (THREAD_FPR24-THREAD_FPR0)604lasx_restore_upper $xr25, \base, $vr31, $xr31, (THREAD_FPR25-THREAD_FPR0)605lasx_restore_upper $xr26, \base, $vr31, $xr31, (THREAD_FPR26-THREAD_FPR0)606lasx_restore_upper $xr27, \base, $vr31, $xr31, (THREAD_FPR27-THREAD_FPR0)607lasx_restore_upper $xr28, \base, $vr31, $xr31, (THREAD_FPR28-THREAD_FPR0)608lasx_restore_upper $xr29, \base, $vr31, $xr31, (THREAD_FPR29-THREAD_FPR0)609lasx_restore_upper $xr30, \base, $vr31, $xr31, (THREAD_FPR30-THREAD_FPR0)610lasx_restore_upper $xr31, \base, $vr31, $xr31, (THREAD_FPR31-THREAD_FPR0)611/* Restore $vr31 ($xr31 lower bits) with xvinsgr2vr */612xvinsgr2vr.d $xr31, $r17, 0613xvinsgr2vr.d $xr31, $r18, 1614.endm615616.macro lasx_init_upper xd tmp617xvinsgr2vr.d \xd, \tmp, 2618xvinsgr2vr.d \xd, \tmp, 3619.endm620621.macro lasx_init_all_upper tmp622not \tmp, zero623lasx_init_upper $xr0 \tmp624lasx_init_upper $xr1 \tmp625lasx_init_upper $xr2 \tmp626lasx_init_upper $xr3 \tmp627lasx_init_upper $xr4 \tmp628lasx_init_upper $xr5 \tmp629lasx_init_upper $xr6 \tmp630lasx_init_upper $xr7 \tmp631lasx_init_upper $xr8 \tmp632lasx_init_upper $xr9 \tmp633lasx_init_upper $xr10 \tmp634lasx_init_upper $xr11 \tmp635lasx_init_upper $xr12 \tmp636lasx_init_upper $xr13 \tmp637lasx_init_upper $xr14 \tmp638lasx_init_upper $xr15 \tmp639lasx_init_upper $xr16 \tmp640lasx_init_upper $xr17 \tmp641lasx_init_upper $xr18 \tmp642lasx_init_upper $xr19 \tmp643lasx_init_upper $xr20 \tmp644lasx_init_upper $xr21 \tmp645lasx_init_upper $xr22 \tmp646lasx_init_upper $xr23 \tmp647lasx_init_upper $xr24 \tmp648lasx_init_upper $xr25 \tmp649lasx_init_upper $xr26 \tmp650lasx_init_upper $xr27 \tmp651lasx_init_upper $xr28 \tmp652lasx_init_upper $xr29 \tmp653lasx_init_upper $xr30 \tmp654lasx_init_upper $xr31 \tmp655.endm656657.macro not dst src658nor \dst, \src, zero659.endm660661.macro la_abs reg, sym662#ifndef CONFIG_RELOCATABLE663la.abs \reg, \sym664#else665766:666lu12i.w \reg, 0667ori \reg, \reg, 0668#ifdef CONFIG_64BIT669lu32i.d \reg, 0670lu52i.d \reg, \reg, 0671#endif672.pushsection ".la_abs", "aw", %progbits673.p2align PTRLOG674PTR 766b675PTR \sym676.popsection677#endif678.endm679680#endif /* _ASM_ASMMACRO_H */681682683