2012-11-12 13:24:27 +00:00
/*
* FP / SIMD state saving and restoring macros
*
* Copyright ( C ) 2012 ARM Ltd .
* Author : Catalin Marinas < catalin . marinas @ arm . com >
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program . If not , see < http : //www.gnu.org/licenses/>.
*/
. macro fpsimd_save state , tmpnr
stp q0 , q1 , [ \ state , # 16 * 0 ]
stp q2 , q3 , [ \ state , # 16 * 2 ]
stp q4 , q5 , [ \ state , # 16 * 4 ]
stp q6 , q7 , [ \ state , # 16 * 6 ]
stp q8 , q9 , [ \ state , # 16 * 8 ]
stp q10 , q11 , [ \ state , # 16 * 10 ]
stp q12 , q13 , [ \ state , # 16 * 12 ]
stp q14 , q15 , [ \ state , # 16 * 14 ]
stp q16 , q17 , [ \ state , # 16 * 16 ]
stp q18 , q19 , [ \ state , # 16 * 18 ]
stp q20 , q21 , [ \ state , # 16 * 20 ]
stp q22 , q23 , [ \ state , # 16 * 22 ]
stp q24 , q25 , [ \ state , # 16 * 24 ]
stp q26 , q27 , [ \ state , # 16 * 26 ]
stp q28 , q29 , [ \ state , # 16 * 28 ]
stp q30 , q31 , [ \ state , # 16 * 30 ] !
mrs x \ tmpnr , fpsr
str w \ tmpnr , [ \ state , # 16 * 2 ]
mrs x \ tmpnr , fpcr
str w \ tmpnr , [ \ state , # 16 * 2 + 4 ]
. endm
. macro fpsimd_restore state , tmpnr
ldp q0 , q1 , [ \ state , # 16 * 0 ]
ldp q2 , q3 , [ \ state , # 16 * 2 ]
ldp q4 , q5 , [ \ state , # 16 * 4 ]
ldp q6 , q7 , [ \ state , # 16 * 6 ]
ldp q8 , q9 , [ \ state , # 16 * 8 ]
ldp q10 , q11 , [ \ state , # 16 * 10 ]
ldp q12 , q13 , [ \ state , # 16 * 12 ]
ldp q14 , q15 , [ \ state , # 16 * 14 ]
ldp q16 , q17 , [ \ state , # 16 * 16 ]
ldp q18 , q19 , [ \ state , # 16 * 18 ]
ldp q20 , q21 , [ \ state , # 16 * 20 ]
ldp q22 , q23 , [ \ state , # 16 * 22 ]
ldp q24 , q25 , [ \ state , # 16 * 24 ]
ldp q26 , q27 , [ \ state , # 16 * 26 ]
ldp q28 , q29 , [ \ state , # 16 * 28 ]
ldp q30 , q31 , [ \ state , # 16 * 30 ] !
ldr w \ tmpnr , [ \ state , # 16 * 2 ]
msr fpsr , x \ tmpnr
ldr w \ tmpnr , [ \ state , # 16 * 2 + 4 ]
msr fpcr , x \ tmpnr
. endm
2014-02-24 15:26:29 +01:00
. altmacro
. macro fpsimd_save_partial state , numnr , tmpnr1 , tmpnr2
mrs x \ tmpnr1 , fpsr
str w \ numnr , [ \ state , # 8 ]
mrs x \ tmpnr2 , fpcr
stp w \ tmpnr1 , w \ tmpnr2 , [ \ state ]
adr x \ tmpnr1 , 0f
add \ state , \ state , x \ numnr , lsl # 4
sub x \ tmpnr1 , x \ tmpnr1 , x \ numnr , lsl # 1
br x \ tmpnr1
. irp qa , 30 , 28 , 26 , 24 , 22 , 20 , 18 , 16 , 14 , 12 , 10 , 8 , 6 , 4 , 2 , 0
. irp qb , % ( qa + 1 )
stp q \ qa , q \ qb , [ \ state , # - 16 * \ qa - 16 ]
. endr
. endr
0 :
. endm
. macro fpsimd_restore_partial state , tmpnr1 , tmpnr2
ldp w \ tmpnr1 , w \ tmpnr2 , [ \ state ]
msr fpsr , x \ tmpnr1
msr fpcr , x \ tmpnr2
adr x \ tmpnr1 , 0f
ldr w \ tmpnr2 , [ \ state , # 8 ]
add \ state , \ state , x \ tmpnr2 , lsl # 4
sub x \ tmpnr1 , x \ tmpnr1 , x \ tmpnr2 , lsl # 1
br x \ tmpnr1
. irp qa , 30 , 28 , 26 , 24 , 22 , 20 , 18 , 16 , 14 , 12 , 10 , 8 , 6 , 4 , 2 , 0
. irp qb , % ( qa + 1 )
ldp q \ qa , q \ qb , [ \ state , # - 16 * \ qa - 16 ]
. endr
. endr
0 :
. endm