Text file src/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    $sincosxlim<>+0(SB), R1
    77  	FMOVD   0(R1), F1
    78  	FCMPU   F5, F1
    79  	BGT     L16
    80  	MOVD    $sincoss7<>+0(SB), R1
    81  	FMOVD   0(R1), F4
    82  	MOVD    $sincoss6<>+0(SB), R1
    83  	FMOVD   0(R1), F1
    84  	MOVD    $sincoss5<>+0(SB), R1
    85  	VLEG    $0, 0(R1), V18
    86  	MOVD    $sincoss4<>+0(SB), R1
    87  	FMOVD   0(R1), F6
    88  	MOVD    $sincoss2<>+0(SB), R1
    89  	VLEG    $0, 0(R1), V16
    90  	MOVD    $sincoss3<>+0(SB), R1
    91  	FMOVD   0(R1), F7
    92  	MOVD    $sincoss1<>+0(SB), R1
    93  	FMOVD   0(R1), F3
    94  	MOVD    $sincoss0<>+0(SB), R1
    95  	FMOVD   0(R1), F2
    96  	WFCHDBS V2, V5, V2
    97  	BEQ     L18
    98  	MOVD    $sincosrpi2<>+0(SB), R1
    99  	FMOVD   0(R1), F3
   100  	MOVD    $sincosxadd<>+0(SB), R1
   101  	FMOVD   0(R1), F2
   102  	WFMSDB  V0, V3, V2, V3
   103  	FMOVD   0(R1), F6
   104  	FADD    F3, F6
   105  	MOVD    $sincosxpi2h<>+0(SB), R1
   106  	FMOVD   0(R1), F2
   107  	FMSUB   F2, F6, F0
   108  	MOVD    $sincosxpi2m<>+0(SB), R1
   109  	FMOVD   0(R1), F4
   110  	FMADD   F4, F6, F0
   111  	MOVD    $sincosxpi2l<>+0(SB), R1
   112  	WFMDB   V0, V0, V1
   113  	FMOVD   0(R1), F7
   114  	WFMDB   V1, V1, V2
   115  	LGDR    F3, R1
   116  	MOVD    $sincosxlim<>+0(SB), R2
   117  	TMLL	R1, $1
   118  	BEQ     L6
   119  	FMOVD   0(R2), F0
   120  	WFCHDBS V0, V5, V0
   121  	BNE     L14
   122  	MOVD    $sincosc7<>+0(SB), R2
   123  	FMOVD   0(R2), F0
   124  	MOVD    $sincosc6<>+0(SB), R2
   125  	FMOVD   0(R2), F4
   126  	MOVD    $sincosc5<>+0(SB), R2
   127  	WFMADB  V1, V0, V4, V0
   128  	FMOVD   0(R2), F6
   129  	MOVD    $sincosc4<>+0(SB), R2
   130  	WFMADB  V1, V0, V6, V0
   131  	FMOVD   0(R2), F4
   132  	MOVD    $sincosc2<>+0(SB), R2
   133  	FMOVD   0(R2), F6
   134  	WFMADB  V2, V4, V6, V4
   135  	MOVD    $sincosc3<>+0(SB), R2
   136  	FMOVD   0(R2), F3
   137  	MOVD    $sincosc1<>+0(SB), R2
   138  	WFMADB  V2, V0, V3, V0
   139  	FMOVD   0(R2), F6
   140  	WFMADB  V1, V4, V6, V4
   141  	TMLL	R1, $2
   142  	WFMADB  V2, V0, V4, V0
   143  	MOVD    $sincosc0<>+0(SB), R1
   144  	FMOVD   0(R1), F2
   145  	WFMADB  V1, V0, V2, V0
   146  	BNE     L15
   147  	FMOVD   F0, ret+8(FP)
   148  	RET
   149  
   150  L6:
   151  	FMOVD   0(R2), F4
   152  	WFCHDBS V4, V5, V4
   153  	BNE     L14
   154  	MOVD    $sincoss7<>+0(SB), R2
   155  	FMOVD   0(R2), F4
   156  	MOVD    $sincoss6<>+0(SB), R2
   157  	FMOVD   0(R2), F3
   158  	MOVD    $sincoss5<>+0(SB), R2
   159  	WFMADB  V1, V4, V3, V4
   160  	WFMADB  V6, V7, V0, V6
   161  	FMOVD   0(R2), F0
   162  	MOVD    $sincoss4<>+0(SB), R2
   163  	FMADD   F4, F1, F0
   164  	FMOVD   0(R2), F3
   165  	MOVD    $sincoss2<>+0(SB), R2
   166  	FMOVD   0(R2), F4
   167  	MOVD    $sincoss3<>+0(SB), R2
   168  	WFMADB  V2, V3, V4, V3
   169  	FMOVD   0(R2), F4
   170  	MOVD    $sincoss1<>+0(SB), R2
   171  	WFMADB  V2, V0, V4, V0
   172  	FMOVD   0(R2), F4
   173  	WFMADB  V1, V3, V4, V3
   174  	FNEG    F6, F4
   175  	WFMADB  V2, V0, V3, V2
   176  	WFMDB   V4, V1, V0
   177  	TMLL	R1, $2
   178  	WFMSDB  V0, V2, V6, V0
   179  	BNE     L15
   180  	FMOVD   F0, ret+8(FP)
   181  	RET
   182  
   183  L14:
   184  	MOVD    $sincosxnan<>+0(SB), R1
   185  	FMOVD   0(R1), F0
   186  	FMOVD   F0, ret+8(FP)
   187  	RET
   188  
   189  L18:
   190  	WFMDB   V0, V0, V2
   191  	WFMADB  V2, V4, V1, V4
   192  	WFMDB   V2, V2, V1
   193  	WFMADB  V2, V4, V18, V4
   194  	WFMADB  V1, V6, V16, V6
   195  	WFMADB  V1, V4, V7, V4
   196  	WFMADB  V2, V6, V3, V6
   197  	FMUL    F0, F2
   198  	WFMADB  V1, V4, V6, V4
   199  	FMADD   F4, F2, F0
   200  	FMOVD   F0, ret+8(FP)
   201  	RET
   202  
   203  L17:
   204  	FNEG    F0, F5
   205  	BR      L2
   206  L15:
   207  	FNEG    F0, F0
   208  	FMOVD   F0, ret+8(FP)
   209  	RET
   210  
   211  
   212  L16:
   213  	BR     ·sin(SB)		//tail call
   214  sinIsZero:
   215  	FMOVD   F0, ret+8(FP)
   216  	RET
   217  
   218  // Cos returns the cosine of the radian argument.
   219  //
   220  // Special cases are:
   221  //      Cos(±Inf) = NaN
   222  //      Cos(NaN) = NaN
   223  // The algorithm used is minimax polynomial approximation.
   224  // with coefficients determined with a Remez exchange algorithm.
   225  
   226  TEXT ·cosAsm(SB),NOSPLIT,$0-16
   227  	FMOVD   x+0(FP), F0
   228  	LTDBR	F0, F0
   229  	BLTU    L35
   230  	FMOVD   F0, F1
   231  L21:
   232  	MOVD    $sincosxlim<>+0(SB), R1
   233  	FMOVD   0(R1), F2
   234  	FCMPU   F1, F2
   235  	BGT     L30
   236  	MOVD    $sincosc7<>+0(SB), R1
   237  	FMOVD   0(R1), F4
   238  	MOVD    $sincosc6<>+0(SB), R1
   239  	VLEG    $0, 0(R1), V20
   240  	MOVD    $sincosc5<>+0(SB), R1
   241  	VLEG    $0, 0(R1), V18
   242  	MOVD    $sincosc4<>+0(SB), R1
   243  	FMOVD   0(R1), F6
   244  	MOVD    $sincosc2<>+0(SB), R1
   245  	VLEG    $0, 0(R1), V16
   246  	MOVD    $sincosc3<>+0(SB), R1
   247  	FMOVD   0(R1), F7
   248  	MOVD    $sincosc1<>+0(SB), R1
   249  	FMOVD   0(R1), F5
   250  	MOVD    $sincosrpi2<>+0(SB), R1
   251  	FMOVD   0(R1), F2
   252  	MOVD    $sincosxadd<>+0(SB), R1
   253  	FMOVD   0(R1), F3
   254  	MOVD    $sincoss0<>+0(SB), R1
   255  	WFMSDB  V0, V2, V3, V2
   256  	FMOVD   0(R1), F3
   257  	WFCHDBS V3, V1, V3
   258  	LGDR    F2, R1
   259  	BEQ     L36
   260  	MOVD    $sincosxadd<>+0(SB), R2
   261  	FMOVD   0(R2), F4
   262  	FADD    F2, F4
   263  	MOVD    $sincosxpi2h<>+0(SB), R2
   264  	FMOVD   0(R2), F2
   265  	WFMSDB  V4, V2, V0, V2
   266  	MOVD    $sincosxpi2m<>+0(SB), R2
   267  	FMOVD   0(R2), F0
   268  	WFMADB  V4, V0, V2, V0
   269  	MOVD    $sincosxpi2l<>+0(SB), R2
   270  	WFMDB   V0, V0, V2
   271  	FMOVD   0(R2), F5
   272  	WFMDB   V2, V2, V6
   273  	MOVD    $sincosxlim<>+0(SB), R2
   274  	TMLL	R1, $1
   275  	BNE     L25
   276  	FMOVD   0(R2), F0
   277  	WFCHDBS V0, V1, V0
   278  	BNE     L33
   279  	MOVD    $sincosc7<>+0(SB), R2
   280  	FMOVD   0(R2), F0
   281  	MOVD    $sincosc6<>+0(SB), R2
   282  	FMOVD   0(R2), F4
   283  	MOVD    $sincosc5<>+0(SB), R2
   284  	WFMADB  V2, V0, V4, V0
   285  	FMOVD   0(R2), F1
   286  	MOVD    $sincosc4<>+0(SB), R2
   287  	WFMADB  V2, V0, V1, V0
   288  	FMOVD   0(R2), F4
   289  	MOVD    $sincosc2<>+0(SB), R2
   290  	FMOVD   0(R2), F1
   291  	WFMADB  V6, V4, V1, V4
   292  	MOVD    $sincosc3<>+0(SB), R2
   293  	FMOVD   0(R2), F3
   294  	MOVD    $sincosc1<>+0(SB), R2
   295  	WFMADB  V6, V0, V3, V0
   296  	FMOVD   0(R2), F1
   297  	WFMADB  V2, V4, V1, V4
   298  	TMLL	R1, $2
   299  	WFMADB  V6, V0, V4, V0
   300  	MOVD    $sincosc0<>+0(SB), R1
   301  	FMOVD   0(R1), F4
   302  	WFMADB  V2, V0, V4, V0
   303  	BNE     L34
   304  	FMOVD   F0, ret+8(FP)
   305  	RET
   306  
   307  L25:
   308  	FMOVD   0(R2), F3
   309  	WFCHDBS V3, V1, V1
   310  	BNE     L33
   311  	MOVD    $sincoss7<>+0(SB), R2
   312  	FMOVD   0(R2), F1
   313  	MOVD    $sincoss6<>+0(SB), R2
   314  	FMOVD   0(R2), F3
   315  	MOVD    $sincoss5<>+0(SB), R2
   316  	WFMADB  V2, V1, V3, V1
   317  	FMOVD   0(R2), F3
   318  	MOVD    $sincoss4<>+0(SB), R2
   319  	WFMADB  V2, V1, V3, V1
   320  	FMOVD   0(R2), F3
   321  	MOVD    $sincoss2<>+0(SB), R2
   322  	FMOVD   0(R2), F7
   323  	WFMADB  V6, V3, V7, V3
   324  	MOVD    $sincoss3<>+0(SB), R2
   325  	FMADD   F5, F4, F0
   326  	FMOVD   0(R2), F4
   327  	MOVD    $sincoss1<>+0(SB), R2
   328  	FMADD   F1, F6, F4
   329  	FMOVD   0(R2), F1
   330  	FMADD   F3, F2, F1
   331  	FMUL    F0, F2
   332  	WFMADB  V6, V4, V1, V6
   333  	TMLL	R1, $2
   334  	FMADD   F6, F2, F0
   335  	BNE     L34
   336  	FMOVD   F0, ret+8(FP)
   337  	RET
   338  
   339  L33:
   340  	MOVD    $sincosxnan<>+0(SB), R1
   341  	FMOVD   0(R1), F0
   342  	FMOVD   F0, ret+8(FP)
   343  	RET
   344  
   345  L36:
   346  	FMUL    F0, F0
   347  	MOVD    $sincosc0<>+0(SB), R1
   348  	WFMDB   V0, V0, V1
   349  	WFMADB  V0, V4, V20, V4
   350  	WFMADB  V1, V6, V16, V6
   351  	WFMADB  V0, V4, V18, V4
   352  	WFMADB  V0, V6, V5, V6
   353  	WFMADB  V1, V4, V7, V4
   354  	FMOVD   0(R1), F2
   355  	WFMADB  V1, V4, V6, V4
   356  	WFMADB  V0, V4, V2, V0
   357  	FMOVD   F0, ret+8(FP)
   358  	RET
   359  
   360  L35:
   361  	FNEG    F0, F1
   362  	BR      L21
   363  L34:
   364  	FNEG    F0, F0
   365  	FMOVD   F0, ret+8(FP)
   366  	RET
   367  
   368  L30:
   369  	BR     ·cos(SB)		//tail call
   370  

View as plain text