blob: f67a1354108423fe8abe9f254986cd266d344f0b [file] [log] [blame]
/*
* Copyright 2015, Imagination Technologies Limited and/or its
* affiliated group companies.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holder nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#if __mips_isa_rev < 6 || !defined(__mips_micromips)
.module hardfloat
.module doublefloat
#undef fp
.module fp=64
.module msa
.set nomips16
#include <mips/asm.h>
#include <mips/regdef.h>
#include <mips/m32c0.h>
#include <mips/hal.h>
#
# FUNCTION: _msactx_save
#
# DESCRIPTION: save MSA registers to memory starting at a0
#
# RETURNS: int
# 0: No context saved
# CTX_*: Type of context stored
#
LEAF(_msactx_save)
PTR_S zero, LINKCTX_NEXT(a0)
mfc0 t0, C0_CONFIG5
ext t0, t0, CFG5_MSAEN_SHIFT, 1
bnez t0, 1f
# MSA not enabled, bail out
move v0, zero
jr ra
# Save FCSR if necessary
1: mfc0 t0, C0_STATUS
ext t1, t0, SR_CU1_SHIFT, 1
lui v0, %hi(LINKCTX_TYPE_MSA)
beqz t1, 2f
lui v0, %hi(LINKCTX_TYPE_FMSA)
cfc1 t2, $31
REG_S t2, MSACTX_FCSR(a0)
# Save MSA
2: ori v0, v0, %lo(LINKCTX_TYPE_MSA)
cfcmsa t0, $1
REG_S t0, MSACTX_MSACSR(a0)
st.d $w0, MSACTX_0(a0)
st.d $w1, MSACTX_1(a0)
st.d $w2, MSACTX_2(a0)
st.d $w3, MSACTX_3(a0)
st.d $w4, MSACTX_4(a0)
st.d $w5, MSACTX_5(a0)
st.d $w6, MSACTX_6(a0)
st.d $w7, MSACTX_7(a0)
st.d $w8, MSACTX_8(a0)
st.d $w9, MSACTX_9(a0)
st.d $w10, MSACTX_10(a0)
st.d $w11, MSACTX_11(a0)
st.d $w12, MSACTX_12(a0)
st.d $w13, MSACTX_13(a0)
st.d $w14, MSACTX_14(a0)
st.d $w15, MSACTX_15(a0)
st.d $w16, MSACTX_16(a0)
st.d $w17, MSACTX_17(a0)
st.d $w18, MSACTX_18(a0)
st.d $w19, MSACTX_19(a0)
st.d $w20, MSACTX_20(a0)
st.d $w21, MSACTX_21(a0)
st.d $w22, MSACTX_22(a0)
st.d $w23, MSACTX_23(a0)
st.d $w24, MSACTX_24(a0)
st.d $w25, MSACTX_25(a0)
st.d $w26, MSACTX_26(a0)
st.d $w27, MSACTX_27(a0)
st.d $w28, MSACTX_28(a0)
st.d $w29, MSACTX_29(a0)
st.d $w30, MSACTX_30(a0)
st.d $w31, MSACTX_31(a0)
REG_S v0, LINKCTX_ID(a0)
jr ra
END(_msactx_save)
#
# FUNCTION: _msactx_load
#
# DESCRIPTION: load MSA/floating point registers from memory starting at a0
#
# RETURNS: int
# 0: Unrecognised context
# CTX_*: Type of context restored
#
LEAF(_msactx_load)
REG_L v0, LINKCTX_ID(a0)
# Detect type
li t0, LINKCTX_TYPE_FMSA
li t1, LINKCTX_TYPE_MSA
li t2, SR_CU1
beq v0, t0, 0f
beq v0, t1, 1f
# Don't recognise this context, fail
move v0, zero
jr ra
0: # FPU+MSA context
# Enable CU1
di t3
ehb
or t3, t3, t2
mtc0 t3, C0_STATUS
ehb
REG_L t1, MSACTX_FCSR(a0)
ctc1 t1, $31
1: # MSA context
# Enable MSA
li t3, CFG5_MSAEN
mfc0 t2, C0_CONFIG5
or t2, t3, t2
mtc0 t2, C0_CONFIG5
ehb
# Load MSA
lw t3, MSACTX_MSACSR(a0)
ctcmsa $1, t3
ld.d $w0, MSACTX_0(a0)
ld.d $w1, MSACTX_1(a0)
ld.d $w2, MSACTX_2(a0)
ld.d $w3, MSACTX_3(a0)
ld.d $w4, MSACTX_4(a0)
ld.d $w5, MSACTX_5(a0)
ld.d $w6, MSACTX_6(a0)
ld.d $w7, MSACTX_7(a0)
ld.d $w8, MSACTX_8(a0)
ld.d $w9, MSACTX_9(a0)
ld.d $w10, MSACTX_10(a0)
ld.d $w11, MSACTX_11(a0)
ld.d $w12, MSACTX_12(a0)
ld.d $w13, MSACTX_13(a0)
ld.d $w14, MSACTX_14(a0)
ld.d $w15, MSACTX_15(a0)
ld.d $w16, MSACTX_16(a0)
ld.d $w17, MSACTX_17(a0)
ld.d $w18, MSACTX_18(a0)
ld.d $w19, MSACTX_19(a0)
ld.d $w20, MSACTX_20(a0)
ld.d $w21, MSACTX_21(a0)
ld.d $w22, MSACTX_22(a0)
ld.d $w23, MSACTX_23(a0)
ld.d $w24, MSACTX_24(a0)
ld.d $w25, MSACTX_25(a0)
ld.d $w26, MSACTX_26(a0)
ld.d $w27, MSACTX_27(a0)
ld.d $w28, MSACTX_28(a0)
ld.d $w29, MSACTX_29(a0)
ld.d $w30, MSACTX_30(a0)
ld.w $w31, MSACTX_31(a0)
# Return CTX_(F)MSA
jr ra
END(_msactx_load)
#endif // __mips_isa_rev < 6 || !defined(__micromips__)