// Copyright 2016 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. #include "textflag.h" TEXT ·Exp2(SB),NOSPLIT,$0 BR ·exp2(SB) TEXT ·Frexp(SB),NOSPLIT,$0 BR ·frexp(SB) TEXT ·Hypot(SB),NOSPLIT,$0 BR ·hypot(SB) TEXT ·Ldexp(SB),NOSPLIT,$0 BR ·ldexp(SB) TEXT ·Log2(SB),NOSPLIT,$0 BR ·log2(SB) TEXT ·Modf(SB),NOSPLIT,$0 BR ·modf(SB) TEXT ·Mod(SB),NOSPLIT,$0 BR ·mod(SB) TEXT ·Remainder(SB),NOSPLIT,$0 BR ·remainder(SB) //if go assembly use vector instruction TEXT ·hasVectorFacility(SB),NOSPLIT,$24-1 MOVD $x-24(SP), R1 XC $24, 0(R1), 0(R1) // clear the storage MOVD $2, R0 // R0 is the number of double words stored -1 WORD $0xB2B01000 // STFLE 0(R1) XOR R0, R0 // reset the value of R0 MOVBZ z-8(SP), R1 AND $0x40, R1 BEQ novector vectorinstalled: // check if the vector instruction has been enabled VLEIB $0, $0xF, V16 VLGVB $0, V16, R1 CMPBNE R1, $0xF, novector MOVB $1, ret+0(FP) // have vx RET novector: MOVB $0, ret+0(FP) // no vx RET TEXT ·Log10(SB),NOSPLIT,$0 MOVD ·log10vectorfacility+0x00(SB),R1 BR (R1) TEXT ·log10TrampolineSetup(SB),NOSPLIT, $0 MOVB ·hasVX(SB), R1 CMPBEQ R1, $1, vectorimpl // vectorfacility = 1, vector supported MOVD $·log10vectorfacility+0x00(SB), R1 MOVD $·log10(SB), R2 MOVD R2, 0(R1) BR ·log10(SB) vectorimpl: MOVD $·log10vectorfacility+0x00(SB), R1 MOVD $·log10Asm(SB), R2 MOVD R2, 0(R1) BR ·log10Asm(SB) GLOBL ·log10vectorfacility+0x00(SB), NOPTR, $8 DATA ·log10vectorfacility+0x00(SB)/8, $·log10TrampolineSetup(SB) TEXT ·Cos(SB),NOSPLIT,$0 MOVD ·cosvectorfacility+0x00(SB),R1 BR (R1) TEXT ·cosTrampolineSetup(SB),NOSPLIT, $0 MOVB ·hasVX(SB), R1 CMPBEQ R1, $1, vectorimpl // vectorfacility = 1, vector supported MOVD $·cosvectorfacility+0x00(SB), R1 MOVD $·cos(SB), R2 MOVD R2, 0(R1) BR ·cos(SB) vectorimpl: MOVD $·cosvectorfacility+0x00(SB), R1 MOVD $·cosAsm(SB), R2 MOVD R2, 0(R1) BR ·cosAsm(SB) GLOBL ·cosvectorfacility+0x00(SB), NOPTR, $8 DATA ·cosvectorfacility+0x00(SB)/8, $·cosTrampolineSetup(SB) TEXT ·Cosh(SB),NOSPLIT,$0 MOVD ·coshvectorfacility+0x00(SB),R1 BR (R1) TEXT ·coshTrampolineSetup(SB),NOSPLIT, $0 MOVB ·hasVX(SB), R1 CMPBEQ R1, $1, vectorimpl // vectorfacility = 1, vector supported MOVD $·coshvectorfacility+0x00(SB), R1 MOVD $·cosh(SB), R2 MOVD R2, 0(R1) BR ·cosh(SB) vectorimpl: MOVD $·coshvectorfacility+0x00(SB), R1 MOVD $·coshAsm(SB), R2 MOVD R2, 0(R1) BR ·coshAsm(SB) GLOBL ·coshvectorfacility+0x00(SB), NOPTR, $8 DATA ·coshvectorfacility+0x00(SB)/8, $·coshTrampolineSetup(SB) TEXT ·Sin(SB),NOSPLIT,$0 MOVD ·sinvectorfacility+0x00(SB),R1 BR (R1) TEXT ·sinTrampolineSetup(SB),NOSPLIT, $0 MOVB ·hasVX(SB), R1 CMPBEQ R1, $1, vectorimpl // vectorfacility = 1, vector supported MOVD $·sinvectorfacility+0x00(SB), R1 MOVD $·sin(SB), R2 MOVD R2, 0(R1) BR ·sin(SB) vectorimpl: MOVD $·sinvectorfacility+0x00(SB), R1 MOVD $·sinAsm(SB), R2 MOVD R2, 0(R1) BR ·sinAsm(SB) GLOBL ·sinvectorfacility+0x00(SB), NOPTR, $8 DATA ·sinvectorfacility+0x00(SB)/8, $·sinTrampolineSetup(SB) TEXT ·Sinh(SB),NOSPLIT,$0 MOVD ·sinhvectorfacility+0x00(SB),R1 BR (R1) TEXT ·sinhTrampolineSetup(SB),NOSPLIT, $0 MOVB ·hasVX(SB), R1 CMPBEQ R1, $1, vectorimpl // vectorfacility = 1, vector supported MOVD $·sinhvectorfacility+0x00(SB), R1 MOVD $·sinh(SB), R2 MOVD R2, 0(R1) BR ·sinh(SB) vectorimpl: MOVD $·sinhvectorfacility+0x00(SB), R1 MOVD $·sinhAsm(SB), R2 MOVD R2, 0(R1) BR ·sinhAsm(SB) GLOBL ·sinhvectorfacility+0x00(SB), NOPTR, $8 DATA ·sinhvectorfacility+0x00(SB)/8, $·sinhTrampolineSetup(SB) TEXT ·Tanh(SB),NOSPLIT,$0 MOVD ·tanhvectorfacility+0x00(SB),R1 BR (R1) TEXT ·tanhTrampolineSetup(SB),NOSPLIT, $0 MOVB ·hasVX(SB), R1 CMPBEQ R1, $1, vectorimpl // vectorfacility = 1, vector supported MOVD $·tanhvectorfacility+0x00(SB), R1 MOVD $·tanh(SB), R2 MOVD R2, 0(R1) BR ·tanh(SB) vectorimpl: MOVD $·tanhvectorfacility+0x00(SB), R1 MOVD $·tanhAsm(SB), R2 MOVD R2, 0(R1) BR ·tanhAsm(SB) GLOBL ·tanhvectorfacility+0x00(SB), NOPTR, $8 DATA ·tanhvectorfacility+0x00(SB)/8, $·tanhTrampolineSetup(SB) TEXT ·Log1p(SB),NOSPLIT,$0 MOVD ·log1pvectorfacility+0x00(SB),R1 BR (R1) TEXT ·log1pTrampolineSetup(SB),NOSPLIT, $0 MOVB ·hasVX(SB), R1 CMPBEQ R1, $1, vectorimpl // vectorfacility = 1, vector supported MOVD $·log1pvectorfacility+0x00(SB), R1 MOVD $·log1p(SB), R2 MOVD R2, 0(R1) BR ·log1p(SB) vectorimpl: MOVD $·log1pvectorfacility+0x00(SB), R1 MOVD $·log1pAsm(SB), R2 MOVD R2, 0(R1) BR ·log1pAsm(SB) GLOBL ·log1pvectorfacility+0x00(SB), NOPTR, $8 DATA ·log1pvectorfacility+0x00(SB)/8, $·log1pTrampolineSetup(SB) TEXT ·Atanh(SB),NOSPLIT,$0 MOVD ·atanhvectorfacility+0x00(SB),R1 BR (R1) TEXT ·atanhTrampolineSetup(SB),NOSPLIT, $0 MOVB ·hasVX(SB), R1 CMPBEQ R1, $1, vectorimpl // vectorfacility = 1, vector supported MOVD $·atanhvectorfacility+0x00(SB), R1 MOVD $·atanh(SB), R2 MOVD R2, 0(R1) BR ·atanh(SB) vectorimpl: MOVD $·atanhvectorfacility+0x00(SB), R1 MOVD $·atanhAsm(SB), R2 MOVD R2, 0(R1) BR ·atanhAsm(SB) GLOBL ·atanhvectorfacility+0x00(SB), NOPTR, $8 DATA ·atanhvectorfacility+0x00(SB)/8, $·atanhTrampolineSetup(SB) TEXT ·Acos(SB),NOSPLIT,$0 MOVD ·acosvectorfacility+0x00(SB),R1 BR (R1) TEXT ·acosTrampolineSetup(SB),NOSPLIT, $0 MOVB ·hasVX(SB), R1 CMPBEQ R1, $1, vectorimpl // vectorfacility = 1, vector supported MOVD $·acosvectorfacility+0x00(SB), R1 MOVD $·acos(SB), R2 MOVD R2, 0(R1) BR ·acos(SB) vectorimpl: MOVD $·acosvectorfacility+0x00(SB), R1 MOVD $·acosAsm(SB), R2 MOVD R2, 0(R1) BR ·acosAsm(SB) GLOBL ·acosvectorfacility+0x00(SB), NOPTR, $8 DATA ·acosvectorfacility+0x00(SB)/8, $·acosTrampolineSetup(SB) TEXT ·Asin(SB),NOSPLIT,$0 MOVD ·asinvectorfacility+0x00(SB),R1 BR (R1) TEXT ·asinTrampolineSetup(SB),NOSPLIT, $0 MOVB ·hasVX(SB), R1 CMPBEQ R1, $1, vectorimpl // vectorfacility = 1, vector supported MOVD $·asinvectorfacility+0x00(SB), R1 MOVD $·asin(SB), R2 MOVD R2, 0(R1) BR ·asin(SB) vectorimpl: MOVD $·asinvectorfacility+0x00(SB), R1 MOVD $·asinAsm(SB), R2 MOVD R2, 0(R1) BR ·asinAsm(SB) GLOBL ·asinvectorfacility+0x00(SB), NOPTR, $8 DATA ·asinvectorfacility+0x00(SB)/8, $·asinTrampolineSetup(SB) TEXT ·Asinh(SB),NOSPLIT,$0 MOVD ·asinhvectorfacility+0x00(SB),R1 BR (R1) TEXT ·asinhTrampolineSetup(SB),NOSPLIT, $0 MOVB ·hasVX(SB), R1 CMPBEQ R1, $1, vectorimpl // vectorfacility = 1, vector supported MOVD $·asinhvectorfacility+0x00(SB), R1 MOVD $·asinh(SB), R2 MOVD R2, 0(R1) BR ·asinh(SB) vectorimpl: MOVD $·asinhvectorfacility+0x00(SB), R1 MOVD $·asinhAsm(SB), R2 MOVD R2, 0(R1) BR ·asinhAsm(SB) GLOBL ·asinhvectorfacility+0x00(SB), NOPTR, $8 DATA ·asinhvectorfacility+0x00(SB)/8, $·asinhTrampolineSetup(SB) TEXT ·Acosh(SB),NOSPLIT,$0 MOVD ·acoshvectorfacility+0x00(SB),R1 BR (R1) TEXT ·acoshTrampolineSetup(SB),NOSPLIT, $0 MOVB ·hasVX(SB), R1 CMPBEQ R1, $1, vectorimpl // vectorfacility = 1, vector supported MOVD $·acoshvectorfacility+0x00(SB), R1 MOVD $·acosh(SB), R2 MOVD R2, 0(R1) BR ·acosh(SB) vectorimpl: MOVD $·acoshvectorfacility+0x00(SB), R1 MOVD $·acoshAsm(SB), R2 MOVD R2, 0(R1) BR ·acoshAsm(SB) GLOBL ·acoshvectorfacility+0x00(SB), NOPTR, $8 DATA ·acoshvectorfacility+0x00(SB)/8, $·acoshTrampolineSetup(SB) TEXT ·Erf(SB),NOSPLIT,$0 MOVD ·erfvectorfacility+0x00(SB),R1 BR (R1) TEXT ·erfTrampolineSetup(SB),NOSPLIT, $0 MOVB ·hasVX(SB), R1 CMPBEQ R1, $1, vectorimpl // vectorfacility = 1, vector supported MOVD $·erfvectorfacility+0x00(SB), R1 MOVD $·erf(SB), R2 MOVD R2, 0(R1) BR ·erf(SB) vectorimpl: MOVD $·erfvectorfacility+0x00(SB), R1 MOVD $·erfAsm(SB), R2 MOVD R2, 0(R1) BR ·erfAsm(SB) GLOBL ·erfvectorfacility+0x00(SB), NOPTR, $8 DATA ·erfvectorfacility+0x00(SB)/8, $·erfTrampolineSetup(SB) TEXT ·Erfc(SB),NOSPLIT,$0 MOVD ·erfcvectorfacility+0x00(SB),R1 BR (R1) TEXT ·erfcTrampolineSetup(SB),NOSPLIT, $0 MOVB ·hasVX(SB), R1 CMPBEQ R1, $1, vectorimpl // vectorfacility = 1, vector supported MOVD $·erfcvectorfacility+0x00(SB), R1 MOVD $·erfc(SB), R2 MOVD R2, 0(R1) BR ·erfc(SB) vectorimpl: MOVD $·erfcvectorfacility+0x00(SB), R1 MOVD $·erfcAsm(SB), R2 MOVD R2, 0(R1) BR ·erfcAsm(SB) GLOBL ·erfcvectorfacility+0x00(SB), NOPTR, $8 DATA ·erfcvectorfacility+0x00(SB)/8, $·erfcTrampolineSetup(SB) TEXT ·Atan(SB),NOSPLIT,$0 MOVD ·atanvectorfacility+0x00(SB),R1 BR (R1) TEXT ·atanTrampolineSetup(SB),NOSPLIT, $0 MOVB ·hasVX(SB), R1 CMPBEQ R1, $1, vectorimpl // vectorfacility = 1, vector supported MOVD $·atanvectorfacility+0x00(SB), R1 MOVD $·atan(SB), R2 MOVD R2, 0(R1) BR ·atan(SB) vectorimpl: MOVD $·atanvectorfacility+0x00(SB), R1 MOVD $·atanAsm(SB), R2 MOVD R2, 0(R1) BR ·atanAsm(SB) GLOBL ·atanvectorfacility+0x00(SB), NOPTR, $8 DATA ·atanvectorfacility+0x00(SB)/8, $·atanTrampolineSetup(SB) TEXT ·Atan2(SB),NOSPLIT,$0 MOVD ·atan2vectorfacility+0x00(SB),R1 BR (R1) TEXT ·atan2TrampolineSetup(SB),NOSPLIT, $0 MOVB ·hasVX(SB), R1 CMPBEQ R1, $1, vectorimpl // vectorfacility = 1, vector supported MOVD $·atan2vectorfacility+0x00(SB), R1 MOVD $·atan2(SB), R2 MOVD R2, 0(R1) BR ·atan2(SB) vectorimpl: MOVD $·atan2vectorfacility+0x00(SB), R1 MOVD $·atan2Asm(SB), R2 MOVD R2, 0(R1) BR ·atan2Asm(SB) GLOBL ·atan2vectorfacility+0x00(SB), NOPTR, $8 DATA ·atan2vectorfacility+0x00(SB)/8, $·atan2TrampolineSetup(SB) TEXT ·Cbrt(SB),NOSPLIT,$0 MOVD ·cbrtvectorfacility+0x00(SB),R1 BR (R1) TEXT ·cbrtTrampolineSetup(SB),NOSPLIT, $0 MOVB ·hasVX(SB), R1 CMPBEQ R1, $1, vectorimpl // vectorfacility = 1, vector supported MOVD $·cbrtvectorfacility+0x00(SB), R1 MOVD $·cbrt(SB), R2 MOVD R2, 0(R1) BR ·cbrt(SB) vectorimpl: MOVD $·cbrtvectorfacility+0x00(SB), R1 MOVD $·cbrtAsm(SB), R2 MOVD R2, 0(R1) BR ·cbrtAsm(SB) GLOBL ·cbrtvectorfacility+0x00(SB), NOPTR, $8 DATA ·cbrtvectorfacility+0x00(SB)/8, $·cbrtTrampolineSetup(SB) TEXT ·Log(SB),NOSPLIT,$0 MOVD ·logvectorfacility+0x00(SB),R1 BR (R1) TEXT ·logTrampolineSetup(SB),NOSPLIT, $0 MOVB ·hasVX(SB), R1 CMPBEQ R1, $1, vectorimpl // vectorfacility = 1, vector supported MOVD $·logvectorfacility+0x00(SB), R1 MOVD $·log(SB), R2 MOVD R2, 0(R1) BR ·log(SB) vectorimpl: MOVD $·logvectorfacility+0x00(SB), R1 MOVD $·logAsm(SB), R2 MOVD R2, 0(R1) BR ·logAsm(SB) GLOBL ·logvectorfacility+0x00(SB), NOPTR, $8 DATA ·logvectorfacility+0x00(SB)/8, $·logTrampolineSetup(SB) TEXT ·Tan(SB),NOSPLIT,$0 MOVD ·tanvectorfacility+0x00(SB),R1 BR (R1) TEXT ·tanTrampolineSetup(SB),NOSPLIT, $0 MOVB ·hasVX(SB), R1 CMPBEQ R1, $1, vectorimpl // vectorfacility = 1, vector supported MOVD $·tanvectorfacility+0x00(SB), R1 MOVD $·tan(SB), R2 MOVD R2, 0(R1) BR ·tan(SB) vectorimpl: MOVD $·tanvectorfacility+0x00(SB), R1 MOVD $·tanAsm(SB), R2 MOVD R2, 0(R1) BR ·tanAsm(SB) GLOBL ·tanvectorfacility+0x00(SB), NOPTR, $8 DATA ·tanvectorfacility+0x00(SB)/8, $·tanTrampolineSetup(SB) TEXT ·Exp(SB),NOSPLIT,$0 MOVD ·expvectorfacility+0x00(SB),R1 BR (R1) TEXT ·expTrampolineSetup(SB),NOSPLIT, $0 MOVB ·hasVX(SB), R1 CMPBEQ R1, $1, vectorimpl // vectorfacility = 1, vector supported MOVD $·expvectorfacility+0x00(SB), R1 MOVD $·exp(SB), R2 MOVD R2, 0(R1) BR ·exp(SB) vectorimpl: MOVD $·expvectorfacility+0x00(SB), R1 MOVD $·expAsm(SB), R2 MOVD R2, 0(R1) BR ·expAsm(SB) GLOBL ·expvectorfacility+0x00(SB), NOPTR, $8 DATA ·expvectorfacility+0x00(SB)/8, $·expTrampolineSetup(SB) TEXT ·Expm1(SB),NOSPLIT,$0 MOVD ·expm1vectorfacility+0x00(SB),R1 BR (R1) TEXT ·expm1TrampolineSetup(SB),NOSPLIT, $0 MOVB ·hasVX(SB), R1 CMPBEQ R1, $1, vectorimpl // vectorfacility = 1, vector supported MOVD $·expm1vectorfacility+0x00(SB), R1 MOVD $·expm1(SB), R2 MOVD R2, 0(R1) BR ·expm1(SB) vectorimpl: MOVD $·expm1vectorfacility+0x00(SB), R1 MOVD $·expm1Asm(SB), R2 MOVD R2, 0(R1) BR ·expm1Asm(SB) GLOBL ·expm1vectorfacility+0x00(SB), NOPTR, $8 DATA ·expm1vectorfacility+0x00(SB)/8, $·expm1TrampolineSetup(SB) TEXT ·Pow(SB),NOSPLIT,$0 MOVD ·powvectorfacility+0x00(SB),R1 BR (R1) TEXT ·powTrampolineSetup(SB),NOSPLIT, $0 MOVB ·hasVX(SB), R1 CMPBEQ R1, $1, vectorimpl // vectorfacility = 1, vector supported MOVD $·powvectorfacility+0x00(SB), R1 MOVD $·pow(SB), R2 MOVD R2, 0(R1) BR ·pow(SB) vectorimpl: MOVD $·powvectorfacility+0x00(SB), R1 MOVD $·powAsm(SB), R2 MOVD R2, 0(R1) BR ·powAsm(SB) GLOBL ·powvectorfacility+0x00(SB), NOPTR, $8 DATA ·powvectorfacility+0x00(SB)/8, $·powTrampolineSetup(SB)