...

Text file src/pkg/math/sin_s390x.s

     1	// Copyright 2016 The Go Authors. All rights reserved.
     2	// Use of this source code is governed by a BSD-style
     3	// license that can be found in the LICENSE file.
     4	
     5	#include "textflag.h"
     6	
     7	// Various constants
     8	DATA sincosxnan<>+0(SB)/8, $0x7ff8000000000000
     9	GLOBL sincosxnan<>+0(SB), RODATA, $8
    10	DATA sincosxlim<>+0(SB)/8, $0x432921fb54442d19
    11	GLOBL sincosxlim<>+0(SB), RODATA, $8
    12	DATA sincosxadd<>+0(SB)/8, $0xc338000000000000
    13	GLOBL sincosxadd<>+0(SB), RODATA, $8
    14	DATA sincosxpi2l<>+0(SB)/8, $0.108285667392191389e-31
    15	GLOBL sincosxpi2l<>+0(SB), RODATA, $8
    16	DATA sincosxpi2m<>+0(SB)/8, $0.612323399573676480e-16
    17	GLOBL sincosxpi2m<>+0(SB), RODATA, $8
    18	DATA sincosxpi2h<>+0(SB)/8, $0.157079632679489656e+01
    19	GLOBL sincosxpi2h<>+0(SB), RODATA, $8
    20	DATA sincosrpi2<>+0(SB)/8, $0.636619772367581341e+00
    21	GLOBL sincosrpi2<>+0(SB), RODATA, $8
    22	
    23	// Minimax polynomial approximations
    24	DATA sincosc0<>+0(SB)/8, $0.100000000000000000E+01
    25	GLOBL sincosc0<>+0(SB), RODATA, $8
    26	DATA sincosc1<>+0(SB)/8, $-.499999999999999833E+00
    27	GLOBL sincosc1<>+0(SB), RODATA, $8
    28	DATA sincosc2<>+0(SB)/8, $0.416666666666625843E-01
    29	GLOBL sincosc2<>+0(SB), RODATA, $8
    30	DATA sincosc3<>+0(SB)/8, $-.138888888885498984E-02
    31	GLOBL sincosc3<>+0(SB), RODATA, $8
    32	DATA sincosc4<>+0(SB)/8, $0.248015871681607202E-04
    33	GLOBL sincosc4<>+0(SB), RODATA, $8
    34	DATA sincosc5<>+0(SB)/8, $-.275572911309937875E-06
    35	GLOBL sincosc5<>+0(SB), RODATA, $8
    36	DATA sincosc6<>+0(SB)/8, $0.208735047247632818E-08
    37	GLOBL sincosc6<>+0(SB), RODATA, $8
    38	DATA sincosc7<>+0(SB)/8, $-.112753632738365317E-10
    39	GLOBL sincosc7<>+0(SB), RODATA, $8
    40	DATA sincoss0<>+0(SB)/8, $0.100000000000000000E+01
    41	GLOBL sincoss0<>+0(SB), RODATA, $8
    42	DATA sincoss1<>+0(SB)/8, $-.166666666666666657E+00
    43	GLOBL sincoss1<>+0(SB), RODATA, $8
    44	DATA sincoss2<>+0(SB)/8, $0.833333333333309209E-02
    45	GLOBL sincoss2<>+0(SB), RODATA, $8
    46	DATA sincoss3<>+0(SB)/8, $-.198412698410701448E-03
    47	GLOBL sincoss3<>+0(SB), RODATA, $8
    48	DATA sincoss4<>+0(SB)/8, $0.275573191453906794E-05
    49	GLOBL sincoss4<>+0(SB), RODATA, $8
    50	DATA sincoss5<>+0(SB)/8, $-.250520918387633290E-07
    51	GLOBL sincoss5<>+0(SB), RODATA, $8
    52	DATA sincoss6<>+0(SB)/8, $0.160571285514715856E-09
    53	GLOBL sincoss6<>+0(SB), RODATA, $8
    54	DATA sincoss7<>+0(SB)/8, $-.753213484933210972E-12
    55	GLOBL sincoss7<>+0(SB), RODATA, $8
    56	
    57	// Sin returns the sine of the radian argument x.
    58	//
    59	// Special cases are:
    60	//      Sin(±0) = ±0
    61	//      Sin(±Inf) = NaN
    62	//      Sin(NaN) = NaN
    63	// The algorithm used is minimax polynomial approximation.
    64	// with coefficients determined with a Remez exchange algorithm.
    65	
    66	TEXT ·sinAsm(SB),NOSPLIT,$0-16
    67		FMOVD   x+0(FP), F0
    68		//special case Sin(±0) = ±0
    69		FMOVD   $(0.0), F1
    70		FCMPU   F0, F1
    71		BEQ     sinIsZero
    72		LTDBR	F0, F0
    73		BLTU    L17
    74		FMOVD   F0, F5
    75	L2:
    76		MOVD    $sincoss7<>+0(SB), R1
    77		FMOVD   0(R1), F4
    78		MOVD    $sincoss6<>+0(SB), R1
    79		FMOVD   0(R1), F1
    80		MOVD    $sincoss5<>+0(SB), R1
    81		VLEG    $0, 0(R1), V18
    82		MOVD    $sincoss4<>+0(SB), R1
    83		FMOVD   0(R1), F6
    84		MOVD    $sincoss2<>+0(SB), R1
    85		VLEG    $0, 0(R1), V16
    86		MOVD    $sincoss3<>+0(SB), R1
    87		FMOVD   0(R1), F7
    88		MOVD    $sincoss1<>+0(SB), R1
    89		FMOVD   0(R1), F3
    90		MOVD    $sincoss0<>+0(SB), R1
    91		FMOVD   0(R1), F2
    92		WFCHDBS V2, V5, V2
    93		BEQ     L18
    94		MOVD    $sincosrpi2<>+0(SB), R1
    95		FMOVD   0(R1), F3
    96		MOVD    $sincosxadd<>+0(SB), R1
    97		FMOVD   0(R1), F2
    98		WFMSDB  V0, V3, V2, V3
    99		FMOVD   0(R1), F6
   100		FADD    F3, F6
   101		MOVD    $sincosxpi2h<>+0(SB), R1
   102		FMOVD   0(R1), F2
   103		FMSUB   F2, F6, F0
   104		MOVD    $sincosxpi2m<>+0(SB), R1
   105		FMOVD   0(R1), F4
   106		FMADD   F4, F6, F0
   107		MOVD    $sincosxpi2l<>+0(SB), R1
   108		WFMDB   V0, V0, V1
   109		FMOVD   0(R1), F7
   110		WFMDB   V1, V1, V2
   111		LGDR    F3, R1
   112		MOVD    $sincosxlim<>+0(SB), R2
   113		TMLL	R1, $1
   114		BEQ     L6
   115		FMOVD   0(R2), F0
   116		WFCHDBS V0, V5, V0
   117		BNE     L14
   118		MOVD    $sincosc7<>+0(SB), R2
   119		FMOVD   0(R2), F0
   120		MOVD    $sincosc6<>+0(SB), R2
   121		FMOVD   0(R2), F4
   122		MOVD    $sincosc5<>+0(SB), R2
   123		WFMADB  V1, V0, V4, V0
   124		FMOVD   0(R2), F6
   125		MOVD    $sincosc4<>+0(SB), R2
   126		WFMADB  V1, V0, V6, V0
   127		FMOVD   0(R2), F4
   128		MOVD    $sincosc2<>+0(SB), R2
   129		FMOVD   0(R2), F6
   130		WFMADB  V2, V4, V6, V4
   131		MOVD    $sincosc3<>+0(SB), R2
   132		FMOVD   0(R2), F3
   133		MOVD    $sincosc1<>+0(SB), R2
   134		WFMADB  V2, V0, V3, V0
   135		FMOVD   0(R2), F6
   136		WFMADB  V1, V4, V6, V4
   137		TMLL	R1, $2
   138		WFMADB  V2, V0, V4, V0
   139		MOVD    $sincosc0<>+0(SB), R1
   140		FMOVD   0(R1), F2
   141		WFMADB  V1, V0, V2, V0
   142		BNE     L15
   143		FMOVD   F0, ret+8(FP)
   144		RET
   145	
   146	L6:
   147		FMOVD   0(R2), F4
   148		WFCHDBS V4, V5, V4
   149		BNE     L14
   150		MOVD    $sincoss7<>+0(SB), R2
   151		FMOVD   0(R2), F4
   152		MOVD    $sincoss6<>+0(SB), R2
   153		FMOVD   0(R2), F3
   154		MOVD    $sincoss5<>+0(SB), R2
   155		WFMADB  V1, V4, V3, V4
   156		WFMADB  V6, V7, V0, V6
   157		FMOVD   0(R2), F0
   158		MOVD    $sincoss4<>+0(SB), R2
   159		FMADD   F4, F1, F0
   160		FMOVD   0(R2), F3
   161		MOVD    $sincoss2<>+0(SB), R2
   162		FMOVD   0(R2), F4
   163		MOVD    $sincoss3<>+0(SB), R2
   164		WFMADB  V2, V3, V4, V3
   165		FMOVD   0(R2), F4
   166		MOVD    $sincoss1<>+0(SB), R2
   167		WFMADB  V2, V0, V4, V0
   168		FMOVD   0(R2), F4
   169		WFMADB  V1, V3, V4, V3
   170		FNEG    F6, F4
   171		WFMADB  V2, V0, V3, V2
   172		WFMDB   V4, V1, V0
   173		TMLL	R1, $2
   174		WFMSDB  V0, V2, V6, V0
   175		BNE     L15
   176		FMOVD   F0, ret+8(FP)
   177		RET
   178	
   179	L14:
   180		MOVD    $sincosxnan<>+0(SB), R1
   181		FMOVD   0(R1), F0
   182		FMOVD   F0, ret+8(FP)
   183		RET
   184	
   185	L18:
   186		WFMDB   V0, V0, V2
   187		WFMADB  V2, V4, V1, V4
   188		WFMDB   V2, V2, V1
   189		WFMADB  V2, V4, V18, V4
   190		WFMADB  V1, V6, V16, V6
   191		WFMADB  V1, V4, V7, V4
   192		WFMADB  V2, V6, V3, V6
   193		FMUL    F0, F2
   194		WFMADB  V1, V4, V6, V4
   195		FMADD   F4, F2, F0
   196		FMOVD   F0, ret+8(FP)
   197		RET
   198	
   199	L17:
   200		FNEG    F0, F5
   201		BR      L2
   202	L15:
   203		FNEG    F0, F0
   204		FMOVD   F0, ret+8(FP)
   205		RET
   206	
   207	
   208	sinIsZero:
   209		FMOVD   F0, ret+8(FP)
   210		RET
   211	
   212	// Cos returns the cosine of the radian argument.
   213	//
   214	// Special cases are:
   215	//      Cos(±Inf) = NaN
   216	//      Cos(NaN) = NaN
   217	// The algorithm used is minimax polynomial approximation.
   218	// with coefficients determined with a Remez exchange algorithm.
   219	
   220	TEXT ·cosAsm(SB),NOSPLIT,$0-16
   221		FMOVD   x+0(FP), F0
   222		LTDBR	F0, F0
   223		BLTU    L35
   224		FMOVD   F0, F1
   225	L21:
   226		MOVD    $sincosc7<>+0(SB), R1
   227		FMOVD   0(R1), F4
   228		MOVD    $sincosc6<>+0(SB), R1
   229		VLEG    $0, 0(R1), V20
   230		MOVD    $sincosc5<>+0(SB), R1
   231		VLEG    $0, 0(R1), V18
   232		MOVD    $sincosc4<>+0(SB), R1
   233		FMOVD   0(R1), F6
   234		MOVD    $sincosc2<>+0(SB), R1
   235		VLEG    $0, 0(R1), V16
   236		MOVD    $sincosc3<>+0(SB), R1
   237		FMOVD   0(R1), F7
   238		MOVD    $sincosc1<>+0(SB), R1
   239		FMOVD   0(R1), F5
   240		MOVD    $sincosrpi2<>+0(SB), R1
   241		FMOVD   0(R1), F2
   242		MOVD    $sincosxadd<>+0(SB), R1
   243		FMOVD   0(R1), F3
   244		MOVD    $sincoss0<>+0(SB), R1
   245		WFMSDB  V0, V2, V3, V2
   246		FMOVD   0(R1), F3
   247		WFCHDBS V3, V1, V3
   248		LGDR    F2, R1
   249		BEQ     L36
   250		MOVD    $sincosxadd<>+0(SB), R2
   251		FMOVD   0(R2), F4
   252		FADD    F2, F4
   253		MOVD    $sincosxpi2h<>+0(SB), R2
   254		FMOVD   0(R2), F2
   255		WFMSDB  V4, V2, V0, V2
   256		MOVD    $sincosxpi2m<>+0(SB), R2
   257		FMOVD   0(R2), F0
   258		WFMADB  V4, V0, V2, V0
   259		MOVD    $sincosxpi2l<>+0(SB), R2
   260		WFMDB   V0, V0, V2
   261		FMOVD   0(R2), F5
   262		WFMDB   V2, V2, V6
   263		MOVD    $sincosxlim<>+0(SB), R2
   264		TMLL	R1, $1
   265		BNE     L25
   266		FMOVD   0(R2), F0
   267		WFCHDBS V0, V1, V0
   268		BNE     L33
   269		MOVD    $sincosc7<>+0(SB), R2
   270		FMOVD   0(R2), F0
   271		MOVD    $sincosc6<>+0(SB), R2
   272		FMOVD   0(R2), F4
   273		MOVD    $sincosc5<>+0(SB), R2
   274		WFMADB  V2, V0, V4, V0
   275		FMOVD   0(R2), F1
   276		MOVD    $sincosc4<>+0(SB), R2
   277		WFMADB  V2, V0, V1, V0
   278		FMOVD   0(R2), F4
   279		MOVD    $sincosc2<>+0(SB), R2
   280		FMOVD   0(R2), F1
   281		WFMADB  V6, V4, V1, V4
   282		MOVD    $sincosc3<>+0(SB), R2
   283		FMOVD   0(R2), F3
   284		MOVD    $sincosc1<>+0(SB), R2
   285		WFMADB  V6, V0, V3, V0
   286		FMOVD   0(R2), F1
   287		WFMADB  V2, V4, V1, V4
   288		TMLL	R1, $2
   289		WFMADB  V6, V0, V4, V0
   290		MOVD    $sincosc0<>+0(SB), R1
   291		FMOVD   0(R1), F4
   292		WFMADB  V2, V0, V4, V0
   293		BNE     L34
   294		FMOVD   F0, ret+8(FP)
   295		RET
   296	
   297	L25:
   298		FMOVD   0(R2), F3
   299		WFCHDBS V3, V1, V1
   300		BNE     L33
   301		MOVD    $sincoss7<>+0(SB), R2
   302		FMOVD   0(R2), F1
   303		MOVD    $sincoss6<>+0(SB), R2
   304		FMOVD   0(R2), F3
   305		MOVD    $sincoss5<>+0(SB), R2
   306		WFMADB  V2, V1, V3, V1
   307		FMOVD   0(R2), F3
   308		MOVD    $sincoss4<>+0(SB), R2
   309		WFMADB  V2, V1, V3, V1
   310		FMOVD   0(R2), F3
   311		MOVD    $sincoss2<>+0(SB), R2
   312		FMOVD   0(R2), F7
   313		WFMADB  V6, V3, V7, V3
   314		MOVD    $sincoss3<>+0(SB), R2
   315		FMADD   F5, F4, F0
   316		FMOVD   0(R2), F4
   317		MOVD    $sincoss1<>+0(SB), R2
   318		FMADD   F1, F6, F4
   319		FMOVD   0(R2), F1
   320		FMADD   F3, F2, F1
   321		FMUL    F0, F2
   322		WFMADB  V6, V4, V1, V6
   323		TMLL	R1, $2
   324		FMADD   F6, F2, F0
   325		BNE     L34
   326		FMOVD   F0, ret+8(FP)
   327		RET
   328	
   329	L33:
   330		MOVD    $sincosxnan<>+0(SB), R1
   331		FMOVD   0(R1), F0
   332		FMOVD   F0, ret+8(FP)
   333		RET
   334	
   335	L36:
   336		FMUL    F0, F0
   337		MOVD    $sincosc0<>+0(SB), R1
   338		WFMDB   V0, V0, V1
   339		WFMADB  V0, V4, V20, V4
   340		WFMADB  V1, V6, V16, V6
   341		WFMADB  V0, V4, V18, V4
   342		WFMADB  V0, V6, V5, V6
   343		WFMADB  V1, V4, V7, V4
   344		FMOVD   0(R1), F2
   345		WFMADB  V1, V4, V6, V4
   346		WFMADB  V0, V4, V2, V0
   347		FMOVD   F0, ret+8(FP)
   348		RET
   349	
   350	L35:
   351		FNEG    F0, F1
   352		BR      L21
   353	L34:
   354		FNEG    F0, F0
   355		FMOVD   F0, ret+8(FP)
   356		RET

View as plain text