sl@0: // Copyright (c) 2003-2009 Nokia Corporation and/or its subsidiary(-ies). sl@0: // All rights reserved. sl@0: // This component and the accompanying materials are made available sl@0: // under the terms of the License "Eclipse Public License v1.0" sl@0: // which accompanies this distribution, and is available sl@0: // at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: // sl@0: // Initial Contributors: sl@0: // Nokia Corporation - initial contribution. sl@0: // sl@0: // Contributors: sl@0: // sl@0: // Description: sl@0: // e32test\math\t_vfp.cia sl@0: // sl@0: // sl@0: sl@0: #include "t_vfp.h" sl@0: #include sl@0: sl@0: #define __TEST_VFPV3 sl@0: sl@0: #define _DIE(x) asm(".word %a0" : : "i" ((TInt)( 0xe7f000f0|((x)&0x0f)|(((x)&0xfff0)<<4) ))); sl@0: #define DIE _DIE(__LINE__); sl@0: sl@0: /****************************************************************************** sl@0: * Control registers sl@0: ******************************************************************************/ sl@0: __NAKED__ TUint32 Vfp::Fpscr() sl@0: { sl@0: VFP_FMRX(,0,VFP_XREG_FPSCR); sl@0: __JUMP(,lr); sl@0: } sl@0: sl@0: __NAKED__ void Vfp::SetFpscr(TUint32 /*aVal*/) sl@0: { sl@0: VFP_FMXR(,VFP_XREG_FPSCR,0); sl@0: __JUMP(,lr); sl@0: } sl@0: sl@0: /****************************************************************************** sl@0: * Single precision operations sl@0: ******************************************************************************/ sl@0: __NAKED__ TInt32 Vfp::SRegInt(TInt /*aReg*/) sl@0: { sl@0: // fall through sl@0: } sl@0: sl@0: __NAKED__ TReal32 Vfp::SReg(TInt /*aReg*/) sl@0: { sl@0: asm("cmp r0, #31 "); sl@0: asm("addls pc, pc, r0, lsl #3 "); sl@0: DIE; sl@0: VFP_FMRS(CC_AL,0,0); sl@0: __JUMP(,lr); sl@0: VFP_FMRS(CC_AL,0,1); sl@0: __JUMP(,lr); sl@0: VFP_FMRS(CC_AL,0,2); sl@0: __JUMP(,lr); sl@0: VFP_FMRS(CC_AL,0,3); sl@0: __JUMP(,lr); sl@0: VFP_FMRS(CC_AL,0,4); sl@0: __JUMP(,lr); sl@0: VFP_FMRS(CC_AL,0,5); sl@0: __JUMP(,lr); sl@0: VFP_FMRS(CC_AL,0,6); sl@0: __JUMP(,lr); sl@0: VFP_FMRS(CC_AL,0,7); sl@0: __JUMP(,lr); sl@0: VFP_FMRS(CC_AL,0,8); sl@0: __JUMP(,lr); sl@0: VFP_FMRS(CC_AL,0,9); sl@0: __JUMP(,lr); sl@0: VFP_FMRS(CC_AL,0,10); sl@0: __JUMP(,lr); sl@0: VFP_FMRS(CC_AL,0,11); sl@0: __JUMP(,lr); sl@0: VFP_FMRS(CC_AL,0,12); sl@0: __JUMP(,lr); sl@0: VFP_FMRS(CC_AL,0,13); sl@0: __JUMP(,lr); sl@0: VFP_FMRS(CC_AL,0,14); sl@0: __JUMP(,lr); sl@0: VFP_FMRS(CC_AL,0,15); sl@0: __JUMP(,lr); sl@0: VFP_FMRS(CC_AL,0,16); sl@0: __JUMP(,lr); sl@0: VFP_FMRS(CC_AL,0,17); sl@0: __JUMP(,lr); sl@0: VFP_FMRS(CC_AL,0,18); sl@0: __JUMP(,lr); sl@0: VFP_FMRS(CC_AL,0,19); sl@0: __JUMP(,lr); sl@0: VFP_FMRS(CC_AL,0,20); sl@0: __JUMP(,lr); sl@0: VFP_FMRS(CC_AL,0,21); sl@0: __JUMP(,lr); sl@0: VFP_FMRS(CC_AL,0,22); sl@0: __JUMP(,lr); sl@0: VFP_FMRS(CC_AL,0,23); sl@0: __JUMP(,lr); sl@0: VFP_FMRS(CC_AL,0,24); sl@0: __JUMP(,lr); sl@0: VFP_FMRS(CC_AL,0,25); sl@0: __JUMP(,lr); sl@0: VFP_FMRS(CC_AL,0,26); sl@0: __JUMP(,lr); sl@0: VFP_FMRS(CC_AL,0,27); sl@0: __JUMP(,lr); sl@0: VFP_FMRS(CC_AL,0,28); sl@0: __JUMP(,lr); sl@0: VFP_FMRS(CC_AL,0,29); sl@0: __JUMP(,lr); sl@0: VFP_FMRS(CC_AL,0,30); sl@0: __JUMP(,lr); sl@0: VFP_FMRS(CC_AL,0,31); sl@0: __JUMP(,lr); sl@0: } sl@0: sl@0: __NAKED__ void Vfp::SetSReg(TInt32 /*aVal*/, TInt /*aReg*/) sl@0: { sl@0: // fall through sl@0: } sl@0: sl@0: __NAKED__ void Vfp::SetSReg(TReal32 /*aVal*/, TInt /*aReg*/) sl@0: { sl@0: asm("cmp r1, #31 "); sl@0: asm("addls pc, pc, r1, lsl #3 "); sl@0: DIE; sl@0: VFP_FMSR(CC_AL,0,0); sl@0: __JUMP(,lr); sl@0: VFP_FMSR(CC_AL,1,0); sl@0: __JUMP(,lr); sl@0: VFP_FMSR(CC_AL,2,0); sl@0: __JUMP(,lr); sl@0: VFP_FMSR(CC_AL,3,0); sl@0: __JUMP(,lr); sl@0: VFP_FMSR(CC_AL,4,0); sl@0: __JUMP(,lr); sl@0: VFP_FMSR(CC_AL,5,0); sl@0: __JUMP(,lr); sl@0: VFP_FMSR(CC_AL,6,0); sl@0: __JUMP(,lr); sl@0: VFP_FMSR(CC_AL,7,0); sl@0: __JUMP(,lr); sl@0: VFP_FMSR(CC_AL,8,0); sl@0: __JUMP(,lr); sl@0: VFP_FMSR(CC_AL,9,0); sl@0: __JUMP(,lr); sl@0: VFP_FMSR(CC_AL,10,0); sl@0: __JUMP(,lr); sl@0: VFP_FMSR(CC_AL,11,0); sl@0: __JUMP(,lr); sl@0: VFP_FMSR(CC_AL,12,0); sl@0: __JUMP(,lr); sl@0: VFP_FMSR(CC_AL,13,0); sl@0: __JUMP(,lr); sl@0: VFP_FMSR(CC_AL,14,0); sl@0: __JUMP(,lr); sl@0: VFP_FMSR(CC_AL,15,0); sl@0: __JUMP(,lr); sl@0: VFP_FMSR(CC_AL,16,0); sl@0: __JUMP(,lr); sl@0: VFP_FMSR(CC_AL,17,0); sl@0: __JUMP(,lr); sl@0: VFP_FMSR(CC_AL,18,0); sl@0: __JUMP(,lr); sl@0: VFP_FMSR(CC_AL,19,0); sl@0: __JUMP(,lr); sl@0: VFP_FMSR(CC_AL,20,0); sl@0: __JUMP(,lr); sl@0: VFP_FMSR(CC_AL,21,0); sl@0: __JUMP(,lr); sl@0: VFP_FMSR(CC_AL,22,0); sl@0: __JUMP(,lr); sl@0: VFP_FMSR(CC_AL,23,0); sl@0: __JUMP(,lr); sl@0: VFP_FMSR(CC_AL,24,0); sl@0: __JUMP(,lr); sl@0: VFP_FMSR(CC_AL,25,0); sl@0: __JUMP(,lr); sl@0: VFP_FMSR(CC_AL,26,0); sl@0: __JUMP(,lr); sl@0: VFP_FMSR(CC_AL,27,0); sl@0: __JUMP(,lr); sl@0: VFP_FMSR(CC_AL,28,0); sl@0: __JUMP(,lr); sl@0: VFP_FMSR(CC_AL,29,0); sl@0: __JUMP(,lr); sl@0: VFP_FMSR(CC_AL,30,0); sl@0: __JUMP(,lr); sl@0: VFP_FMSR(CC_AL,31,0); sl@0: __JUMP(,lr); sl@0: } sl@0: sl@0: __NAKED__ void Vfp::AbsS() sl@0: { sl@0: asm("nop "); // so that RVCT doesn't complain about branches to non-code symbols sl@0: VFP_FABSS(CC_AL,0,1); sl@0: __JUMP(,lr); sl@0: } sl@0: sl@0: __NAKED__ void Vfp::AddS() sl@0: { sl@0: asm("nop "); // so that RVCT doesn't complain about branches to non-code symbols sl@0: VFP_FADDS(CC_AL,0,1,2); sl@0: __JUMP(,lr); sl@0: } sl@0: sl@0: __NAKED__ void Vfp::CmpS() sl@0: { sl@0: VFP_FCMPS(CC_AL,0,1); sl@0: __JUMP(,lr); sl@0: } sl@0: sl@0: __NAKED__ void Vfp::CmpES() sl@0: { sl@0: VFP_FCMPES(CC_AL,0,1); sl@0: __JUMP(,lr); sl@0: } sl@0: sl@0: __NAKED__ void Vfp::CmpEZS() sl@0: { sl@0: VFP_FCMPEZS(CC_AL,0); sl@0: __JUMP(,lr); sl@0: } sl@0: sl@0: __NAKED__ void Vfp::CmpZS() sl@0: { sl@0: VFP_FCMPZS(CC_AL,0); sl@0: __JUMP(,lr); sl@0: } sl@0: sl@0: __NAKED__ void Vfp::Cpy0S(TInt /*aReg*/) sl@0: { sl@0: asm("cmp r0, #31 "); sl@0: asm("addls pc, pc, r0, lsl #3 "); sl@0: DIE; sl@0: VFP_FCPYS(CC_AL,0,0); sl@0: __JUMP(,lr); sl@0: VFP_FCPYS(CC_AL,0,1); sl@0: __JUMP(,lr); sl@0: VFP_FCPYS(CC_AL,0,2); sl@0: __JUMP(,lr); sl@0: VFP_FCPYS(CC_AL,0,3); sl@0: __JUMP(,lr); sl@0: VFP_FCPYS(CC_AL,0,4); sl@0: __JUMP(,lr); sl@0: VFP_FCPYS(CC_AL,0,5); sl@0: __JUMP(,lr); sl@0: VFP_FCPYS(CC_AL,0,6); sl@0: __JUMP(,lr); sl@0: VFP_FCPYS(CC_AL,0,7); sl@0: __JUMP(,lr); sl@0: VFP_FCPYS(CC_AL,0,8); sl@0: __JUMP(,lr); sl@0: VFP_FCPYS(CC_AL,0,9); sl@0: __JUMP(,lr); sl@0: VFP_FCPYS(CC_AL,0,10); sl@0: __JUMP(,lr); sl@0: VFP_FCPYS(CC_AL,0,11); sl@0: __JUMP(,lr); sl@0: VFP_FCPYS(CC_AL,0,12); sl@0: __JUMP(,lr); sl@0: VFP_FCPYS(CC_AL,0,13); sl@0: __JUMP(,lr); sl@0: VFP_FCPYS(CC_AL,0,14); sl@0: __JUMP(,lr); sl@0: VFP_FCPYS(CC_AL,0,15); sl@0: __JUMP(,lr); sl@0: VFP_FCPYS(CC_AL,0,16); sl@0: __JUMP(,lr); sl@0: VFP_FCPYS(CC_AL,0,17); sl@0: __JUMP(,lr); sl@0: VFP_FCPYS(CC_AL,0,18); sl@0: __JUMP(,lr); sl@0: VFP_FCPYS(CC_AL,0,19); sl@0: __JUMP(,lr); sl@0: VFP_FCPYS(CC_AL,0,20); sl@0: __JUMP(,lr); sl@0: VFP_FCPYS(CC_AL,0,21); sl@0: __JUMP(,lr); sl@0: VFP_FCPYS(CC_AL,0,22); sl@0: __JUMP(,lr); sl@0: VFP_FCPYS(CC_AL,0,23); sl@0: __JUMP(,lr); sl@0: VFP_FCPYS(CC_AL,0,24); sl@0: __JUMP(,lr); sl@0: VFP_FCPYS(CC_AL,0,25); sl@0: __JUMP(,lr); sl@0: VFP_FCPYS(CC_AL,0,26); sl@0: __JUMP(,lr); sl@0: VFP_FCPYS(CC_AL,0,27); sl@0: __JUMP(,lr); sl@0: VFP_FCPYS(CC_AL,0,28); sl@0: __JUMP(,lr); sl@0: VFP_FCPYS(CC_AL,0,29); sl@0: __JUMP(,lr); sl@0: VFP_FCPYS(CC_AL,0,30); sl@0: __JUMP(,lr); sl@0: VFP_FCPYS(CC_AL,0,31); sl@0: __JUMP(,lr); sl@0: } sl@0: sl@0: __NAKED__ void Vfp::CpyS0(TInt /*aReg*/) sl@0: { sl@0: asm("cmp r0, #31 "); sl@0: asm("addls pc, pc, r0, lsl #3 "); sl@0: DIE; sl@0: VFP_FCPYS(CC_AL,0,0); sl@0: __JUMP(,lr); sl@0: VFP_FCPYS(CC_AL,1,0); sl@0: __JUMP(,lr); sl@0: VFP_FCPYS(CC_AL,2,0); sl@0: __JUMP(,lr); sl@0: VFP_FCPYS(CC_AL,3,0); sl@0: __JUMP(,lr); sl@0: VFP_FCPYS(CC_AL,4,0); sl@0: __JUMP(,lr); sl@0: VFP_FCPYS(CC_AL,5,0); sl@0: __JUMP(,lr); sl@0: VFP_FCPYS(CC_AL,6,0); sl@0: __JUMP(,lr); sl@0: VFP_FCPYS(CC_AL,7,0); sl@0: __JUMP(,lr); sl@0: VFP_FCPYS(CC_AL,8,0); sl@0: __JUMP(,lr); sl@0: VFP_FCPYS(CC_AL,9,0); sl@0: __JUMP(,lr); sl@0: VFP_FCPYS(CC_AL,10,0); sl@0: __JUMP(,lr); sl@0: VFP_FCPYS(CC_AL,11,0); sl@0: __JUMP(,lr); sl@0: VFP_FCPYS(CC_AL,12,0); sl@0: __JUMP(,lr); sl@0: VFP_FCPYS(CC_AL,13,0); sl@0: __JUMP(,lr); sl@0: VFP_FCPYS(CC_AL,14,0); sl@0: __JUMP(,lr); sl@0: VFP_FCPYS(CC_AL,15,0); sl@0: __JUMP(,lr); sl@0: VFP_FCPYS(CC_AL,16,0); sl@0: __JUMP(,lr); sl@0: VFP_FCPYS(CC_AL,17,0); sl@0: __JUMP(,lr); sl@0: VFP_FCPYS(CC_AL,18,0); sl@0: __JUMP(,lr); sl@0: VFP_FCPYS(CC_AL,19,0); sl@0: __JUMP(,lr); sl@0: VFP_FCPYS(CC_AL,20,0); sl@0: __JUMP(,lr); sl@0: VFP_FCPYS(CC_AL,21,0); sl@0: __JUMP(,lr); sl@0: VFP_FCPYS(CC_AL,22,0); sl@0: __JUMP(,lr); sl@0: VFP_FCPYS(CC_AL,23,0); sl@0: __JUMP(,lr); sl@0: VFP_FCPYS(CC_AL,24,0); sl@0: __JUMP(,lr); sl@0: VFP_FCPYS(CC_AL,25,0); sl@0: __JUMP(,lr); sl@0: VFP_FCPYS(CC_AL,26,0); sl@0: __JUMP(,lr); sl@0: VFP_FCPYS(CC_AL,27,0); sl@0: __JUMP(,lr); sl@0: VFP_FCPYS(CC_AL,28,0); sl@0: __JUMP(,lr); sl@0: VFP_FCPYS(CC_AL,29,0); sl@0: __JUMP(,lr); sl@0: VFP_FCPYS(CC_AL,30,0); sl@0: __JUMP(,lr); sl@0: VFP_FCPYS(CC_AL,31,0); sl@0: __JUMP(,lr); sl@0: } sl@0: sl@0: __NAKED__ void Vfp::DivS() sl@0: { sl@0: asm("nop "); // so that RVCT doesn't complain about branches to non-code symbols sl@0: VFP_FDIVS(CC_AL,0,1,2); sl@0: __JUMP(,lr); sl@0: } sl@0: sl@0: __NAKED__ void Vfp::MacS() sl@0: { sl@0: asm("nop "); // so that RVCT doesn't complain about branches to non-code symbols sl@0: VFP_FMACS(CC_AL,0,1,2); sl@0: __JUMP(,lr); sl@0: } sl@0: sl@0: __NAKED__ void Vfp::MscS() sl@0: { sl@0: asm("nop "); // so that RVCT doesn't complain about branches to non-code symbols sl@0: VFP_FMSCS(CC_AL,0,1,2); sl@0: __JUMP(,lr); sl@0: } sl@0: sl@0: __NAKED__ void Vfp::MulS() sl@0: { sl@0: asm("nop "); // so that RVCT doesn't complain about branches to non-code symbols sl@0: VFP_FMULS(CC_AL,0,1,2); sl@0: __JUMP(,lr); sl@0: } sl@0: sl@0: __NAKED__ void Vfp::NegS() sl@0: { sl@0: asm("nop "); // so that RVCT doesn't complain about branches to non-code symbols sl@0: VFP_FNEGS(CC_AL,0,1); sl@0: __JUMP(,lr); sl@0: } sl@0: sl@0: __NAKED__ void Vfp::NMacS() sl@0: { sl@0: asm("nop "); // so that RVCT doesn't complain about branches to non-code symbols sl@0: VFP_FNMACS(CC_AL,0,1,2); sl@0: __JUMP(,lr); sl@0: } sl@0: sl@0: __NAKED__ void Vfp::NMscS() sl@0: { sl@0: asm("nop "); // so that RVCT doesn't complain about branches to non-code symbols sl@0: VFP_FNMSCS(CC_AL,0,1,2); sl@0: __JUMP(,lr); sl@0: } sl@0: sl@0: __NAKED__ void Vfp::NMulS() sl@0: { sl@0: asm("nop "); // so that RVCT doesn't complain about branches to non-code symbols sl@0: VFP_FNMULS(CC_AL,0,1,2); sl@0: __JUMP(,lr); sl@0: } sl@0: sl@0: __NAKED__ void Vfp::SqrtS() sl@0: { sl@0: asm("nop "); // so that RVCT doesn't complain about branches to non-code symbols sl@0: VFP_FSQRTS(CC_AL,0,1); sl@0: __JUMP(,lr); sl@0: } sl@0: sl@0: __NAKED__ void Vfp::SubS() sl@0: { sl@0: asm("nop "); // so that RVCT doesn't complain about branches to non-code symbols sl@0: VFP_FSUBS(CC_AL,0,1,2); sl@0: __JUMP(,lr); sl@0: } sl@0: sl@0: sl@0: sl@0: sl@0: /****************************************************************************** sl@0: * Double precision operations sl@0: ******************************************************************************/ sl@0: __NAKED__ TInt64 Vfp::DRegInt(TInt /*aReg*/) sl@0: { sl@0: // fall through sl@0: } sl@0: sl@0: __NAKED__ TReal64 Vfp::DReg(TInt /*aReg*/) sl@0: { sl@0: #ifdef __TEST_VFPV3 sl@0: asm("cmp r0, #31 "); sl@0: #else sl@0: asm("cmp r0, #15 "); sl@0: #endif sl@0: asm("addls r0, r0, r0, lsl #1 "); sl@0: asm("addls pc, pc, r0, lsl #2 "); sl@0: DIE; sl@0: sl@0: // test sl@0: // VFP_FLDD(CC_AL,4,5,0); sl@0: sl@0: VFP_FMRDL(CC_AL,0,0); sl@0: VFP_FMRDH(CC_AL,1,0); sl@0: asm("b 0f "); sl@0: VFP_FMRDL(CC_AL,0,1); sl@0: VFP_FMRDH(CC_AL,1,1); sl@0: asm("b 0f "); sl@0: VFP_FMRDL(CC_AL,0,2); sl@0: VFP_FMRDH(CC_AL,1,2); sl@0: asm("b 0f "); sl@0: VFP_FMRDL(CC_AL,0,3); sl@0: VFP_FMRDH(CC_AL,1,3); sl@0: asm("b 0f "); sl@0: VFP_FMRDL(CC_AL,0,4); sl@0: VFP_FMRDH(CC_AL,1,4); sl@0: asm("b 0f "); sl@0: VFP_FMRDL(CC_AL,0,5); sl@0: VFP_FMRDH(CC_AL,1,5); sl@0: asm("b 0f "); sl@0: VFP_FMRDL(CC_AL,0,6); sl@0: VFP_FMRDH(CC_AL,1,6); sl@0: asm("b 0f "); sl@0: VFP_FMRDL(CC_AL,0,7); sl@0: VFP_FMRDH(CC_AL,1,7); sl@0: asm("b 0f "); sl@0: VFP_FMRDL(CC_AL,0,8); sl@0: VFP_FMRDH(CC_AL,1,8); sl@0: asm("b 0f "); sl@0: VFP_FMRDL(CC_AL,0,9); sl@0: VFP_FMRDH(CC_AL,1,9); sl@0: asm("b 0f "); sl@0: VFP_FMRDL(CC_AL,0,10); sl@0: VFP_FMRDH(CC_AL,1,10); sl@0: asm("b 0f "); sl@0: VFP_FMRDL(CC_AL,0,11); sl@0: VFP_FMRDH(CC_AL,1,11); sl@0: asm("b 0f "); sl@0: VFP_FMRDL(CC_AL,0,12); sl@0: VFP_FMRDH(CC_AL,1,12); sl@0: asm("b 0f "); sl@0: VFP_FMRDL(CC_AL,0,13); sl@0: VFP_FMRDH(CC_AL,1,13); sl@0: asm("b 0f "); sl@0: VFP_FMRDL(CC_AL,0,14); sl@0: VFP_FMRDH(CC_AL,1,14); sl@0: asm("b 0f "); sl@0: VFP_FMRDL(CC_AL,0,15); sl@0: VFP_FMRDH(CC_AL,1,15); sl@0: asm("b 0f "); sl@0: sl@0: #ifdef __TEST_VFPV3 sl@0: VFP_FMRDL(CC_AL,0,16); sl@0: VFP_FMRDH(CC_AL,1,16); sl@0: asm("b 0f "); sl@0: VFP_FMRDL(CC_AL,0,17); sl@0: VFP_FMRDH(CC_AL,1,17); sl@0: asm("b 0f "); sl@0: VFP_FMRDL(CC_AL,0,18); sl@0: VFP_FMRDH(CC_AL,1,18); sl@0: asm("b 0f "); sl@0: VFP_FMRDL(CC_AL,0,19); sl@0: VFP_FMRDH(CC_AL,1,19); sl@0: asm("b 0f "); sl@0: VFP_FMRDL(CC_AL,0,20); sl@0: VFP_FMRDH(CC_AL,1,20); sl@0: asm("b 0f "); sl@0: VFP_FMRDL(CC_AL,0,21); sl@0: VFP_FMRDH(CC_AL,1,21); sl@0: asm("b 0f "); sl@0: VFP_FMRDL(CC_AL,0,22); sl@0: VFP_FMRDH(CC_AL,1,22); sl@0: asm("b 0f "); sl@0: VFP_FMRDL(CC_AL,0,23); sl@0: VFP_FMRDH(CC_AL,1,23); sl@0: asm("b 0f "); sl@0: VFP_FMRDL(CC_AL,0,24); sl@0: VFP_FMRDH(CC_AL,1,24); sl@0: asm("b 0f "); sl@0: VFP_FMRDL(CC_AL,0,25); sl@0: VFP_FMRDH(CC_AL,1,25); sl@0: asm("b 0f "); sl@0: VFP_FMRDL(CC_AL,0,26); sl@0: VFP_FMRDH(CC_AL,1,26); sl@0: asm("b 0f "); sl@0: VFP_FMRDL(CC_AL,0,27); sl@0: VFP_FMRDH(CC_AL,1,27); sl@0: asm("b 0f "); sl@0: VFP_FMRDL(CC_AL,0,28); sl@0: VFP_FMRDH(CC_AL,1,28); sl@0: asm("b 0f "); sl@0: VFP_FMRDL(CC_AL,0,29); sl@0: VFP_FMRDH(CC_AL,1,29); sl@0: asm("b 0f "); sl@0: VFP_FMRDL(CC_AL,0,30); sl@0: VFP_FMRDH(CC_AL,1,30); sl@0: asm("b 0f "); sl@0: VFP_FMRDL(CC_AL,0,31); sl@0: VFP_FMRDH(CC_AL,1,31); sl@0: #endif // __TEST_VFPV3 sl@0: sl@0: asm("0: "); sl@0: #ifdef __DOUBLE_WORDS_SWAPPED__ sl@0: asm("mov r2, r0 "); sl@0: asm("mov r0, r1 "); sl@0: asm("mov r1, r2 "); sl@0: #endif sl@0: __JUMP(,lr); sl@0: } sl@0: sl@0: __NAKED__ void Vfp::SetDReg(TInt64 /*aVal*/, TInt /*aReg*/) sl@0: { sl@0: // fall through sl@0: } sl@0: sl@0: __NAKED__ void Vfp::SetDReg(TReal64 /*aVal*/, TInt /*aReg*/) sl@0: { sl@0: #ifdef __DOUBLE_WORDS_SWAPPED__ sl@0: asm("mov r3, r0 "); sl@0: asm("mov r0, r1 "); sl@0: asm("mov r1, r3 "); sl@0: #endif sl@0: #ifdef __TEST_VFPV3 sl@0: asm("cmp r2, #31 "); sl@0: #else sl@0: asm("cmp r2, #15 "); sl@0: #endif sl@0: asm("addls r2, r2, r2, lsl #1 "); sl@0: asm("addls pc, pc, r2, lsl #2 "); sl@0: DIE; sl@0: VFP_FMDLR(CC_AL,0,0); sl@0: VFP_FMDHR(CC_AL,0,1); sl@0: __JUMP(,lr); sl@0: VFP_FMDLR(CC_AL,1,0); sl@0: VFP_FMDHR(CC_AL,1,1); sl@0: __JUMP(,lr); sl@0: VFP_FMDLR(CC_AL,2,0); sl@0: VFP_FMDHR(CC_AL,2,1); sl@0: __JUMP(,lr); sl@0: VFP_FMDLR(CC_AL,3,0); sl@0: VFP_FMDHR(CC_AL,3,1); sl@0: __JUMP(,lr); sl@0: VFP_FMDLR(CC_AL,4,0); sl@0: VFP_FMDHR(CC_AL,4,1); sl@0: __JUMP(,lr); sl@0: VFP_FMDLR(CC_AL,5,0); sl@0: VFP_FMDHR(CC_AL,5,1); sl@0: __JUMP(,lr); sl@0: VFP_FMDLR(CC_AL,6,0); sl@0: VFP_FMDHR(CC_AL,6,1); sl@0: __JUMP(,lr); sl@0: VFP_FMDLR(CC_AL,7,0); sl@0: VFP_FMDHR(CC_AL,7,1); sl@0: __JUMP(,lr); sl@0: VFP_FMDLR(CC_AL,8,0); sl@0: VFP_FMDHR(CC_AL,8,1); sl@0: __JUMP(,lr); sl@0: VFP_FMDLR(CC_AL,9,0); sl@0: VFP_FMDHR(CC_AL,9,1); sl@0: __JUMP(,lr); sl@0: VFP_FMDLR(CC_AL,10,0); sl@0: VFP_FMDHR(CC_AL,10,1); sl@0: __JUMP(,lr); sl@0: VFP_FMDLR(CC_AL,11,0); sl@0: VFP_FMDHR(CC_AL,11,1); sl@0: __JUMP(,lr); sl@0: VFP_FMDLR(CC_AL,12,0); sl@0: VFP_FMDHR(CC_AL,12,1); sl@0: __JUMP(,lr); sl@0: VFP_FMDLR(CC_AL,13,0); sl@0: VFP_FMDHR(CC_AL,13,1); sl@0: __JUMP(,lr); sl@0: VFP_FMDLR(CC_AL,14,0); sl@0: VFP_FMDHR(CC_AL,14,1); sl@0: __JUMP(,lr); sl@0: VFP_FMDLR(CC_AL,15,0); sl@0: VFP_FMDHR(CC_AL,15,1); sl@0: __JUMP(,lr); sl@0: #ifdef __TEST_VFPV3 sl@0: VFP_FMDLR(CC_AL,16,0); sl@0: VFP_FMDHR(CC_AL,16,1); sl@0: __JUMP(,lr); sl@0: VFP_FMDLR(CC_AL,17,0); sl@0: VFP_FMDHR(CC_AL,17,1); sl@0: __JUMP(,lr); sl@0: VFP_FMDLR(CC_AL,18,0); sl@0: VFP_FMDHR(CC_AL,18,1); sl@0: __JUMP(,lr); sl@0: VFP_FMDLR(CC_AL,19,0); sl@0: VFP_FMDHR(CC_AL,19,1); sl@0: __JUMP(,lr); sl@0: VFP_FMDLR(CC_AL,20,0); sl@0: VFP_FMDHR(CC_AL,20,1); sl@0: __JUMP(,lr); sl@0: VFP_FMDLR(CC_AL,21,0); sl@0: VFP_FMDHR(CC_AL,21,1); sl@0: __JUMP(,lr); sl@0: VFP_FMDLR(CC_AL,22,0); sl@0: VFP_FMDHR(CC_AL,22,1); sl@0: __JUMP(,lr); sl@0: VFP_FMDLR(CC_AL,23,0); sl@0: VFP_FMDHR(CC_AL,23,1); sl@0: __JUMP(,lr); sl@0: VFP_FMDLR(CC_AL,24,0); sl@0: VFP_FMDHR(CC_AL,24,1); sl@0: __JUMP(,lr); sl@0: VFP_FMDLR(CC_AL,25,0); sl@0: VFP_FMDHR(CC_AL,25,1); sl@0: __JUMP(,lr); sl@0: VFP_FMDLR(CC_AL,26,0); sl@0: VFP_FMDHR(CC_AL,26,1); sl@0: __JUMP(,lr); sl@0: VFP_FMDLR(CC_AL,27,0); sl@0: VFP_FMDHR(CC_AL,27,1); sl@0: __JUMP(,lr); sl@0: VFP_FMDLR(CC_AL,28,0); sl@0: VFP_FMDHR(CC_AL,28,1); sl@0: __JUMP(,lr); sl@0: VFP_FMDLR(CC_AL,29,0); sl@0: VFP_FMDHR(CC_AL,29,1); sl@0: __JUMP(,lr); sl@0: VFP_FMDLR(CC_AL,30,0); sl@0: VFP_FMDHR(CC_AL,30,1); sl@0: __JUMP(,lr); sl@0: VFP_FMDLR(CC_AL,31,0); sl@0: VFP_FMDHR(CC_AL,31,1); sl@0: __JUMP(,lr); sl@0: #endif // __TEST_VFPV3 sl@0: } sl@0: sl@0: __NAKED__ void Vfp::AbsD() sl@0: { sl@0: VFP_FABSD(,0,1); sl@0: __JUMP(,lr); sl@0: } sl@0: sl@0: __NAKED__ void Vfp::AddD() sl@0: { sl@0: VFP_FADDD(,0,1,2); sl@0: __JUMP(,lr); sl@0: } sl@0: sl@0: __NAKED__ void Vfp::CmpD() sl@0: { sl@0: VFP_FCMPD(,0,1); sl@0: __JUMP(,lr); sl@0: } sl@0: sl@0: __NAKED__ void Vfp::CmpED() sl@0: { sl@0: VFP_FCMPED(,0,1); sl@0: __JUMP(,lr); sl@0: } sl@0: sl@0: __NAKED__ void Vfp::CmpEZD() sl@0: { sl@0: VFP_FCMPEZD(,0); sl@0: __JUMP(,lr); sl@0: } sl@0: sl@0: __NAKED__ void Vfp::CmpZD() sl@0: { sl@0: VFP_FCMPZD(,0); sl@0: __JUMP(,lr); sl@0: } sl@0: sl@0: __NAKED__ void Vfp::Cpy0D(TInt /*aReg*/) sl@0: { sl@0: asm("cmp r0, #15 "); sl@0: asm("addls pc, pc, r0, lsl #3 "); sl@0: DIE; sl@0: VFP_FCPYD(,0,0); sl@0: __JUMP(,lr); sl@0: VFP_FCPYD(,0,1); sl@0: __JUMP(,lr); sl@0: VFP_FCPYD(,0,2); sl@0: __JUMP(,lr); sl@0: VFP_FCPYD(,0,3); sl@0: __JUMP(,lr); sl@0: VFP_FCPYD(,0,4); sl@0: __JUMP(,lr); sl@0: VFP_FCPYD(,0,5); sl@0: __JUMP(,lr); sl@0: VFP_FCPYD(,0,6); sl@0: __JUMP(,lr); sl@0: VFP_FCPYD(,0,7); sl@0: __JUMP(,lr); sl@0: VFP_FCPYD(,0,8); sl@0: __JUMP(,lr); sl@0: VFP_FCPYD(,0,9); sl@0: __JUMP(,lr); sl@0: VFP_FCPYD(,0,10); sl@0: __JUMP(,lr); sl@0: VFP_FCPYD(,0,11); sl@0: __JUMP(,lr); sl@0: VFP_FCPYD(,0,12); sl@0: __JUMP(,lr); sl@0: VFP_FCPYD(,0,13); sl@0: __JUMP(,lr); sl@0: VFP_FCPYD(,0,14); sl@0: __JUMP(,lr); sl@0: VFP_FCPYD(,0,15); sl@0: __JUMP(,lr); sl@0: } sl@0: sl@0: __NAKED__ void Vfp::CpyD0(TInt /*aReg*/) sl@0: { sl@0: asm("cmp r0, #15 "); sl@0: asm("addls pc, pc, r0, lsl #3 "); sl@0: DIE; sl@0: VFP_FCPYD(,0,0); sl@0: __JUMP(,lr); sl@0: VFP_FCPYD(,1,0); sl@0: __JUMP(,lr); sl@0: VFP_FCPYD(,2,0); sl@0: __JUMP(,lr); sl@0: VFP_FCPYD(,3,0); sl@0: __JUMP(,lr); sl@0: VFP_FCPYD(,4,0); sl@0: __JUMP(,lr); sl@0: VFP_FCPYD(,5,0); sl@0: __JUMP(,lr); sl@0: VFP_FCPYD(,6,0); sl@0: __JUMP(,lr); sl@0: VFP_FCPYD(,7,0); sl@0: __JUMP(,lr); sl@0: VFP_FCPYD(,8,0); sl@0: __JUMP(,lr); sl@0: VFP_FCPYD(,9,0); sl@0: __JUMP(,lr); sl@0: VFP_FCPYD(,10,0); sl@0: __JUMP(,lr); sl@0: VFP_FCPYD(,11,0); sl@0: __JUMP(,lr); sl@0: VFP_FCPYD(,12,0); sl@0: __JUMP(,lr); sl@0: VFP_FCPYD(,13,0); sl@0: __JUMP(,lr); sl@0: VFP_FCPYD(,14,0); sl@0: __JUMP(,lr); sl@0: VFP_FCPYD(,15,0); sl@0: __JUMP(,lr); sl@0: } sl@0: sl@0: __NAKED__ void Vfp::DivD() sl@0: { sl@0: VFP_FDIVD(,0,1,2); sl@0: __JUMP(,lr); sl@0: } sl@0: sl@0: __NAKED__ void Vfp::MacD() sl@0: { sl@0: VFP_FMACD(,0,1,2); sl@0: __JUMP(,lr); sl@0: } sl@0: sl@0: __NAKED__ void Vfp::MscD() sl@0: { sl@0: VFP_FMSCD(,0,1,2); sl@0: __JUMP(,lr); sl@0: } sl@0: sl@0: __NAKED__ void Vfp::MulD() sl@0: { sl@0: VFP_FMULD(,0,1,2); sl@0: __JUMP(,lr); sl@0: } sl@0: sl@0: __NAKED__ void Vfp::NegD() sl@0: { sl@0: VFP_FNEGD(,0,1); sl@0: __JUMP(,lr); sl@0: } sl@0: sl@0: __NAKED__ void Vfp::NMacD() sl@0: { sl@0: VFP_FNMACD(,0,1,2); sl@0: __JUMP(,lr); sl@0: } sl@0: sl@0: __NAKED__ void Vfp::NMscD() sl@0: { sl@0: VFP_FNMSCD(,0,1,2); sl@0: __JUMP(,lr); sl@0: } sl@0: sl@0: __NAKED__ void Vfp::NMulD() sl@0: { sl@0: VFP_FNMULD(,0,1,2); sl@0: __JUMP(,lr); sl@0: } sl@0: sl@0: __NAKED__ void Vfp::SqrtD() sl@0: { sl@0: VFP_FSQRTD(,0,1); sl@0: __JUMP(,lr); sl@0: } sl@0: sl@0: __NAKED__ void Vfp::SubD() sl@0: { sl@0: VFP_FSUBD(,0,1,2); sl@0: __JUMP(,lr); sl@0: } sl@0: sl@0: sl@0: /****************************************************************************** sl@0: * Conversion operations sl@0: ******************************************************************************/ sl@0: __NAKED__ void Vfp::CvtDS() sl@0: { sl@0: VFP_FCVTDS(CC_AL,0,2); sl@0: __JUMP(,lr); sl@0: } sl@0: sl@0: __NAKED__ void Vfp::CvtSD() sl@0: { sl@0: VFP_FCVTSD(CC_AL,0,1); sl@0: __JUMP(,lr); sl@0: } sl@0: sl@0: __NAKED__ void Vfp::SitoD() sl@0: { sl@0: VFP_FSITOD(CC_AL,0,2); sl@0: __JUMP(,lr); sl@0: } sl@0: sl@0: __NAKED__ void Vfp::SitoS() sl@0: { sl@0: VFP_FSITOS(CC_AL,0,2); sl@0: __JUMP(,lr); sl@0: } sl@0: sl@0: __NAKED__ void Vfp::TosiD() sl@0: { sl@0: VFP_FTOSID(CC_AL,0,1); sl@0: __JUMP(,lr); sl@0: } sl@0: sl@0: __NAKED__ void Vfp::TosiZD() sl@0: { sl@0: VFP_FTOSIZD(CC_AL,0,1); sl@0: __JUMP(,lr); sl@0: } sl@0: sl@0: __NAKED__ void Vfp::TosiS() sl@0: { sl@0: VFP_FTOSIS(CC_AL,0,2); sl@0: __JUMP(,lr); sl@0: } sl@0: sl@0: __NAKED__ void Vfp::TosiZS() sl@0: { sl@0: VFP_FTOSIZS(CC_AL,0,2); sl@0: __JUMP(,lr); sl@0: } sl@0: sl@0: __NAKED__ void Vfp::UitoD() sl@0: { sl@0: VFP_FUITOD(CC_AL,0,2); sl@0: __JUMP(,lr); sl@0: } sl@0: sl@0: __NAKED__ void Vfp::UitoS() sl@0: { sl@0: VFP_FUITOS(CC_AL,0,2); sl@0: __JUMP(,lr); sl@0: } sl@0: sl@0: __NAKED__ void Vfp::TouiD() sl@0: { sl@0: VFP_FTOUID(CC_AL,0,1); sl@0: __JUMP(,lr); sl@0: } sl@0: sl@0: __NAKED__ void Vfp::TouiZD() sl@0: { sl@0: VFP_FTOUIZD(CC_AL,0,1); sl@0: __JUMP(,lr); sl@0: } sl@0: sl@0: __NAKED__ void Vfp::TouiS() sl@0: { sl@0: VFP_FTOUIS(CC_AL,0,2); sl@0: __JUMP(,lr); sl@0: } sl@0: sl@0: __NAKED__ void Vfp::TouiZS() sl@0: { sl@0: VFP_FTOUIZS(CC_AL,0,2); sl@0: __JUMP(,lr); sl@0: } sl@0: sl@0: #ifdef __TEST_VFPV3 sl@0: __NAKED__ void Vfp::ToFixedS(TInt /*aBits*/) sl@0: { sl@0: asm("cmp r0, #15 "); sl@0: asm("addls pc, pc, r0, lsl #3 "); sl@0: DIE; sl@0: VFP_VCT_S32_F32(CC_AL,0,0); sl@0: __JUMP(,lr); sl@0: VFP_VCT_S32_F32(CC_AL,0,1); sl@0: __JUMP(,lr); sl@0: VFP_VCT_S32_F32(CC_AL,0,2); sl@0: __JUMP(,lr); sl@0: VFP_VCT_S32_F32(CC_AL,0,3); sl@0: __JUMP(,lr); sl@0: VFP_VCT_S32_F32(CC_AL,0,4); sl@0: __JUMP(,lr); sl@0: VFP_VCT_S32_F32(CC_AL,0,5); sl@0: __JUMP(,lr); sl@0: VFP_VCT_S32_F32(CC_AL,0,6); sl@0: __JUMP(,lr); sl@0: VFP_VCT_S32_F32(CC_AL,0,7); sl@0: __JUMP(,lr); sl@0: VFP_VCT_S32_F32(CC_AL,0,8); sl@0: __JUMP(,lr); sl@0: VFP_VCT_S32_F32(CC_AL,0,9); sl@0: __JUMP(,lr); sl@0: VFP_VCT_S32_F32(CC_AL,0,10); sl@0: __JUMP(,lr); sl@0: VFP_VCT_S32_F32(CC_AL,0,11); sl@0: __JUMP(,lr); sl@0: VFP_VCT_S32_F32(CC_AL,0,12); sl@0: __JUMP(,lr); sl@0: VFP_VCT_S32_F32(CC_AL,0,13); sl@0: __JUMP(,lr); sl@0: VFP_VCT_S32_F32(CC_AL,0,14); sl@0: __JUMP(,lr); sl@0: VFP_VCT_S32_F32(CC_AL,0,15); sl@0: __JUMP(,lr); sl@0: } sl@0: sl@0: __NAKED__ void Vfp::FromFixedS(TInt /*aBits*/) sl@0: { sl@0: asm("cmp r0, #15 "); sl@0: asm("addls pc, pc, r0, lsl #3 "); sl@0: DIE; sl@0: VFP_VCT_F32_S32(CC_AL,0,0); sl@0: __JUMP(,lr); sl@0: VFP_VCT_F32_S32(CC_AL,0,1); sl@0: __JUMP(,lr); sl@0: VFP_VCT_F32_S32(CC_AL,0,2); sl@0: __JUMP(,lr); sl@0: VFP_VCT_F32_S32(CC_AL,0,3); sl@0: __JUMP(,lr); sl@0: VFP_VCT_F32_S32(CC_AL,0,4); sl@0: __JUMP(,lr); sl@0: VFP_VCT_F32_S32(CC_AL,0,5); sl@0: __JUMP(,lr); sl@0: VFP_VCT_F32_S32(CC_AL,0,6); sl@0: __JUMP(,lr); sl@0: VFP_VCT_F32_S32(CC_AL,0,7); sl@0: __JUMP(,lr); sl@0: VFP_VCT_F32_S32(CC_AL,0,8); sl@0: __JUMP(,lr); sl@0: VFP_VCT_F32_S32(CC_AL,0,9); sl@0: __JUMP(,lr); sl@0: VFP_VCT_F32_S32(CC_AL,0,10); sl@0: __JUMP(,lr); sl@0: VFP_VCT_F32_S32(CC_AL,0,11); sl@0: __JUMP(,lr); sl@0: VFP_VCT_F32_S32(CC_AL,0,12); sl@0: __JUMP(,lr); sl@0: VFP_VCT_F32_S32(CC_AL,0,13); sl@0: __JUMP(,lr); sl@0: VFP_VCT_F32_S32(CC_AL,0,14); sl@0: __JUMP(,lr); sl@0: VFP_VCT_F32_S32(CC_AL,0,15); sl@0: __JUMP(,lr); sl@0: } sl@0: sl@0: sl@0: // S0=2 sl@0: __NAKED__ void Vfp::TconstS2() sl@0: { sl@0: asm("nop "); sl@0: VFP_VMOV_IMM(CC_AL,0,0,0); sl@0: __JUMP(,lr); sl@0: } sl@0: sl@0: // D0=2 sl@0: __NAKED__ void Vfp::TconstD2() sl@0: { sl@0: asm("nop "); sl@0: VFP_VMOV_IMM(CC_AL,1,0,0); sl@0: __JUMP(,lr); sl@0: } sl@0: sl@0: // S0=2.875 sl@0: __NAKED__ void Vfp::TconstS2_8() sl@0: { sl@0: asm("nop "); sl@0: VFP_VMOV_IMM(CC_AL,0,0,0x7); sl@0: __JUMP(,lr); sl@0: } sl@0: sl@0: // D0=2.875 sl@0: __NAKED__ void Vfp::TconstD2_8() sl@0: { sl@0: asm("nop "); sl@0: VFP_VMOV_IMM(CC_AL,1,0,0x7); sl@0: __JUMP(,lr); sl@0: } sl@0: sl@0: sl@0: sl@0: // Neon test instructions sl@0: sl@0: __NAKED__ TInt NeonWithF2(TAny*) sl@0: { sl@0: asm("nop "); sl@0: // VEXT.8 D0, D1, D2, #3 sl@0: asm(".word 0xF2B10302 "); sl@0: asm("mov r0, #0 "); sl@0: __JUMP(,lr); sl@0: } sl@0: sl@0: __NAKED__ TInt NeonWithF3(TAny*) sl@0: { sl@0: asm("nop "); sl@0: // VDUP.8 D0, D1[2] sl@0: asm(".word 0xF3B50C01 "); sl@0: asm("mov r0, #0 "); sl@0: __JUMP(,lr); sl@0: } sl@0: sl@0: __NAKED__ TInt NeonWithF4x(TAny*) sl@0: { sl@0: asm("adr r2, 1f "); sl@0: // VLD1.8 {D0[1]}, r2 sl@0: asm(".word 0xF4E2002F "); sl@0: asm("mov r0, #0 "); sl@0: __JUMP(,lr); sl@0: asm("1: "); sl@0: asm(".word 0x12345678" ); sl@0: } sl@0: sl@0: __NAKED__ TInt ThumbMode(TAny*) sl@0: { sl@0: #if defined(__SUPPORT_THUMB_INTERWORKING) sl@0: asm("adr r2, 1f "); // Store a test value address sl@0: sl@0: asm("mov r1, #1 "); // r1 = 1 sl@0: asm("add r1, r0, lsl #3 "); // Add the arg * 8 to r1 sl@0: sl@0: asm("mov r0, #0 "); // Store a return value of KErrNone sl@0: sl@0: asm("add r1, pc, r1 "); // Add pc to get jump destination sl@0: asm("bx r1 "); // Switch to thumb mode sl@0: sl@0: asm(".code 16 "); sl@0: // Thumb mode so halfwords reversed sl@0: asm(".word 0x0A10EC41 "); // VMOV S0, S1, r0, r1 sl@0: asm("bx lr "); sl@0: asm("nop "); sl@0: asm(".word 0x0B00ED12 "); // VLDR D0, [r2] sl@0: asm("bx lr "); sl@0: asm("nop "); sl@0: asm(".word 0x8A00EE30 "); // VADD.32 S0, S0, S0 sl@0: asm("bx lr "); sl@0: asm("nop "); sl@0: asm(".word 0x0302EFB1 "); // VEXT.8 D0, D1, D2, #3 sl@0: asm("bx lr "); sl@0: asm("nop "); sl@0: asm(".word 0x002FF9E2 "); // VLD1.8 {D0[1]}, r2 sl@0: asm("bx lr "); sl@0: asm("nop "); sl@0: asm(".word 0x0C01FFB5 "); // VDUP.8 D0, D1[2] sl@0: asm("bx lr "); sl@0: asm("nop "); sl@0: #endif sl@0: asm("mov r0, #1 "); // Change ret to "done" sl@0: __JUMP(,lr); sl@0: sl@0: asm(".code 32 "); sl@0: asm("1: "); sl@0: asm(".word 0x12345678" ); sl@0: } sl@0: sl@0: #endif // __TEST_VFPV3