Text file src/math/pow_s390x.s

     1  // Copyright 2017 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  #define PosInf   0x7FF0000000000000
     8  #define NaN      0x7FF8000000000001
     9  #define NegInf   0xFFF0000000000000
    10  #define PosOne   0x3FF0000000000000
    11  #define NegOne   0xBFF0000000000000
    12  #define NegZero  0x8000000000000000
    13  
    14  // Minimax polynomial approximation
    15  DATA ·powrodataL51<> + 0(SB)/8, $-1.0
    16  DATA ·powrodataL51<> + 8(SB)/8, $1.0
    17  DATA ·powrodataL51<> + 16(SB)/8, $0.24022650695910110361E+00
    18  DATA ·powrodataL51<> + 24(SB)/8, $0.69314718055994686185E+00
    19  DATA ·powrodataL51<> + 32(SB)/8, $0.96181291057109484809E-02
    20  DATA ·powrodataL51<> + 40(SB)/8, $0.15403814778342868389E-03
    21  DATA ·powrodataL51<> + 48(SB)/8, $0.55504108652095235601E-01
    22  DATA ·powrodataL51<> + 56(SB)/8, $0.13333818813168698658E-02
    23  DATA ·powrodataL51<> + 64(SB)/8, $0.68205322933914439200E-12
    24  DATA ·powrodataL51<> + 72(SB)/8, $-.18466496523378731640E-01
    25  DATA ·powrodataL51<> + 80(SB)/8, $0.19697596291603973706E-02
    26  DATA ·powrodataL51<> + 88(SB)/8, $0.23083120654155209200E+00
    27  DATA ·powrodataL51<> + 96(SB)/8, $0.55324356012093416771E-06
    28  DATA ·powrodataL51<> + 104(SB)/8, $-.40340677224649339048E-05
    29  DATA ·powrodataL51<> + 112(SB)/8, $0.30255507904062541562E-04
    30  DATA ·powrodataL51<> + 120(SB)/8, $-.77453979912413008787E-07
    31  DATA ·powrodataL51<> + 128(SB)/8, $-.23637115549923464737E-03
    32  DATA ·powrodataL51<> + 136(SB)/8, $0.11016119077267717198E-07
    33  DATA ·powrodataL51<> + 144(SB)/8, $0.22608272174486123035E-09
    34  DATA ·powrodataL51<> + 152(SB)/8, $-.15895808101370190382E-08
    35  DATA ·powrodataL51<> + 160(SB)/8, $0x4540190000000000
    36  GLOBL ·powrodataL51<> + 0(SB), RODATA, $168
    37  
    38  // Constants
    39  DATA ·pow_x001a<> + 0(SB)/8, $0x1a000000000000
    40  GLOBL ·pow_x001a<> + 0(SB), RODATA, $8
    41  DATA ·pow_xinf<> + 0(SB)/8, $0x7ff0000000000000      //+Inf
    42  GLOBL ·pow_xinf<> + 0(SB), RODATA, $8
    43  DATA ·pow_xnan<> + 0(SB)/8, $0x7ff8000000000000      //NaN
    44  GLOBL ·pow_xnan<> + 0(SB), RODATA, $8
    45  DATA ·pow_x434<> + 0(SB)/8, $0x4340000000000000
    46  GLOBL ·pow_x434<> + 0(SB), RODATA, $8
    47  DATA ·pow_x433<> + 0(SB)/8, $0x4330000000000000
    48  GLOBL ·pow_x433<> + 0(SB), RODATA, $8
    49  DATA ·pow_x43f<> + 0(SB)/8, $0x43f0000000000000
    50  GLOBL ·pow_x43f<> + 0(SB), RODATA, $8
    51  DATA ·pow_xadd<> + 0(SB)/8, $0xc2f0000100003fef
    52  GLOBL ·pow_xadd<> + 0(SB), RODATA, $8
    53  DATA ·pow_xa<> + 0(SB)/8, $0x4019000000000000
    54  GLOBL ·pow_xa<> + 0(SB), RODATA, $8
    55  
    56  // Scale correction tables
    57  DATA powiadd<> + 0(SB)/8, $0xf000000000000000
    58  DATA powiadd<> + 8(SB)/8, $0x1000000000000000
    59  GLOBL powiadd<> + 0(SB), RODATA, $16
    60  DATA powxscale<> + 0(SB)/8, $0x4ff0000000000000
    61  DATA powxscale<> + 8(SB)/8, $0x2ff0000000000000
    62  GLOBL powxscale<> + 0(SB), RODATA, $16
    63  
    64  // Fractional powers of 2 table
    65  DATA ·powtexp<> + 0(SB)/8, $0.442737824274138381E-01
    66  DATA ·powtexp<> + 8(SB)/8, $0.263602189790660309E-01
    67  DATA ·powtexp<> + 16(SB)/8, $0.122565642281703586E-01
    68  DATA ·powtexp<> + 24(SB)/8, $0.143757052860721398E-02
    69  DATA ·powtexp<> + 32(SB)/8, $-.651375034121276075E-02
    70  DATA ·powtexp<> + 40(SB)/8, $-.119317678849450159E-01
    71  DATA ·powtexp<> + 48(SB)/8, $-.150868749549871069E-01
    72  DATA ·powtexp<> + 56(SB)/8, $-.161992609578469234E-01
    73  DATA ·powtexp<> + 64(SB)/8, $-.154492360403337917E-01
    74  DATA ·powtexp<> + 72(SB)/8, $-.129850717389178721E-01
    75  DATA ·powtexp<> + 80(SB)/8, $-.892902649276657891E-02
    76  DATA ·powtexp<> + 88(SB)/8, $-.338202636596794887E-02
    77  DATA ·powtexp<> + 96(SB)/8, $0.357266307045684762E-02
    78  DATA ·powtexp<> + 104(SB)/8, $0.118665304327406698E-01
    79  DATA ·powtexp<> + 112(SB)/8, $0.214434994118118914E-01
    80  DATA ·powtexp<> + 120(SB)/8, $0.322580645161290314E-01
    81  GLOBL ·powtexp<> + 0(SB), RODATA, $128
    82  
    83  // Log multiplier tables
    84  DATA ·powtl<> + 0(SB)/8, $0xbdf9723a80db6a05
    85  DATA ·powtl<> + 8(SB)/8, $0x3e0cfe4a0babe862
    86  DATA ·powtl<> + 16(SB)/8, $0xbe163b42dd33dada
    87  DATA ·powtl<> + 24(SB)/8, $0xbe0cdf9de2a8429c
    88  DATA ·powtl<> + 32(SB)/8, $0xbde9723a80db6a05
    89  DATA ·powtl<> + 40(SB)/8, $0xbdb37fcae081745e
    90  DATA ·powtl<> + 48(SB)/8, $0xbdd8b2f901ac662c
    91  DATA ·powtl<> + 56(SB)/8, $0xbde867dc68c36cc9
    92  DATA ·powtl<> + 64(SB)/8, $0xbdd23e36b47256b7
    93  DATA ·powtl<> + 72(SB)/8, $0xbde4c9b89fcc7933
    94  DATA ·powtl<> + 80(SB)/8, $0xbdd16905cad7cf66
    95  DATA ·powtl<> + 88(SB)/8, $0x3ddb417414aa5529
    96  DATA ·powtl<> + 96(SB)/8, $0xbdce046f2889983c
    97  DATA ·powtl<> + 104(SB)/8, $0x3dc2c3865d072897
    98  DATA ·powtl<> + 112(SB)/8, $0x8000000000000000
    99  DATA ·powtl<> + 120(SB)/8, $0x3dc1ca48817f8afe
   100  DATA ·powtl<> + 128(SB)/8, $0xbdd703518a88bfb7
   101  DATA ·powtl<> + 136(SB)/8, $0x3dc64afcc46942ce
   102  DATA ·powtl<> + 144(SB)/8, $0xbd9d79191389891a
   103  DATA ·powtl<> + 152(SB)/8, $0x3ddd563044da4fa0
   104  DATA ·powtl<> + 160(SB)/8, $0x3e0f42b5e5f8f4b6
   105  DATA ·powtl<> + 168(SB)/8, $0x3e0dfa2c2cbf6ead
   106  DATA ·powtl<> + 176(SB)/8, $0x3e14e25e91661293
   107  DATA ·powtl<> + 184(SB)/8, $0x3e0aac461509e20c
   108  GLOBL ·powtl<> + 0(SB), RODATA, $192
   109  
   110  DATA ·powtm<> + 0(SB)/8, $0x3da69e13
   111  DATA ·powtm<> + 8(SB)/8, $0x100003d66fcb6
   112  DATA ·powtm<> + 16(SB)/8, $0x200003d1538df
   113  DATA ·powtm<> + 24(SB)/8, $0x300003cab729e
   114  DATA ·powtm<> + 32(SB)/8, $0x400003c1a784c
   115  DATA ·powtm<> + 40(SB)/8, $0x500003ac9b074
   116  DATA ·powtm<> + 48(SB)/8, $0x60000bb498d22
   117  DATA ·powtm<> + 56(SB)/8, $0x68000bb8b29a2
   118  DATA ·powtm<> + 64(SB)/8, $0x70000bb9a32d4
   119  DATA ·powtm<> + 72(SB)/8, $0x74000bb9946bb
   120  DATA ·powtm<> + 80(SB)/8, $0x78000bb92e34b
   121  DATA ·powtm<> + 88(SB)/8, $0x80000bb6c57dc
   122  DATA ·powtm<> + 96(SB)/8, $0x84000bb4020f7
   123  DATA ·powtm<> + 104(SB)/8, $0x8c000ba93832d
   124  DATA ·powtm<> + 112(SB)/8, $0x9000080000000
   125  DATA ·powtm<> + 120(SB)/8, $0x940003aa66c4c
   126  DATA ·powtm<> + 128(SB)/8, $0x980003b2fb12a
   127  DATA ·powtm<> + 136(SB)/8, $0xa00003bc1def6
   128  DATA ·powtm<> + 144(SB)/8, $0xa80003c1eb0eb
   129  DATA ·powtm<> + 152(SB)/8, $0xb00003c64dcec
   130  DATA ·powtm<> + 160(SB)/8, $0xc00003cc49e4e
   131  DATA ·powtm<> + 168(SB)/8, $0xd00003d12f1de
   132  DATA ·powtm<> + 176(SB)/8, $0xe00003d4a9c6f
   133  DATA ·powtm<> + 184(SB)/8, $0xf00003d846c66
   134  GLOBL ·powtm<> + 0(SB), RODATA, $192
   135  
   136  // Table of indices into multiplier tables
   137  // Adjusted from asm to remove offset and convert
   138  DATA ·powtabi<> + 0(SB)/8, $0x1010101
   139  DATA ·powtabi<> + 8(SB)/8, $0x101020202020203
   140  DATA ·powtabi<> + 16(SB)/8, $0x303030404040405
   141  DATA ·powtabi<> + 24(SB)/8, $0x505050606060708
   142  DATA ·powtabi<> + 32(SB)/8, $0x90a0b0c0d0e0f10
   143  DATA ·powtabi<> + 40(SB)/8, $0x1011111212121313
   144  DATA ·powtabi<> + 48(SB)/8, $0x1314141414151515
   145  DATA ·powtabi<> + 56(SB)/8, $0x1516161617171717
   146  GLOBL ·powtabi<> + 0(SB), RODATA, $64
   147  
   148  // Pow returns x**y, the base-x exponential of y.
   149  //
   150  // Special cases are (in order):
   151  //      Pow(x, ±0) = 1 for any x
   152  //      Pow(1, y) = 1 for any y
   153  //      Pow(x, 1) = x for any x
   154  //      Pow(NaN, y) = NaN
   155  //      Pow(x, NaN) = NaN
   156  //      Pow(±0, y) = ±Inf for y an odd integer < 0
   157  //      Pow(±0, -Inf) = +Inf
   158  //      Pow(±0, +Inf) = +0
   159  //      Pow(±0, y) = +Inf for finite y < 0 and not an odd integer
   160  //      Pow(±0, y) = ±0 for y an odd integer > 0
   161  //      Pow(±0, y) = +0 for finite y > 0 and not an odd integer
   162  //      Pow(-1, ±Inf) = 1
   163  //      Pow(x, +Inf) = +Inf for |x| > 1
   164  //      Pow(x, -Inf) = +0 for |x| > 1
   165  //      Pow(x, +Inf) = +0 for |x| < 1
   166  //      Pow(x, -Inf) = +Inf for |x| < 1
   167  //      Pow(+Inf, y) = +Inf for y > 0
   168  //      Pow(+Inf, y) = +0 for y < 0
   169  //      Pow(-Inf, y) = Pow(-0, -y)
   170  //      Pow(x, y) = NaN for finite x < 0 and finite non-integer y
   171  
   172  TEXT	·powAsm(SB), NOSPLIT, $0-24
   173  	// special case
   174  	MOVD	x+0(FP), R1
   175  	MOVD	y+8(FP), R2
   176  
   177  	// special case Pow(1, y) = 1 for any y
   178  	MOVD	$PosOne, R3
   179  	CMPUBEQ	R1, R3, xIsOne
   180  
   181  	// special case Pow(x, 1) = x for any x
   182  	MOVD	$PosOne, R4
   183  	CMPUBEQ	R2, R4, yIsOne
   184  
   185  	// special case Pow(x, NaN) = NaN for any x
   186  	MOVD	$~(1<<63), R5
   187  	AND	R2, R5    // y = |y|
   188  	MOVD	$PosInf, R4
   189  	CMPUBLT R4, R5, yIsNan
   190  
   191  	MOVD	$NegInf, R3
   192  	CMPUBEQ	R1, R3, xIsNegInf
   193  
   194  	MOVD	$NegOne, R3
   195  	CMPUBEQ	R1, R3, xIsNegOne
   196  
   197  	MOVD	$PosInf, R3
   198  	CMPUBEQ	R1, R3, xIsPosInf
   199  
   200  	MOVD	$NegZero, R3
   201  	CMPUBEQ	R1, R3, xIsNegZero
   202  
   203  	MOVD	$PosInf, R4
   204  	CMPUBEQ	R2, R4, yIsPosInf
   205  
   206  	MOVD	$0x0, R3
   207  	CMPUBEQ	R1, R3, xIsPosZero
   208  	CMPBLT	R1, R3, xLtZero
   209  	BR	Normal
   210  xIsPosInf:
   211  	// special case Pow(+Inf, y) = +Inf for y > 0
   212  	MOVD	$0x0, R4
   213  	CMPBGT	R2, R4, posInfGeZero
   214  	BR	Normal
   215  xIsNegInf:
   216  	//Pow(-Inf, y) = Pow(-0, -y)
   217  	FMOVD y+8(FP), F2
   218  	FNEG F2, F2			// y = -y
   219  	BR negZeroNegY		// call Pow(-0, -y)
   220  xIsNegOne:
   221  	// special case Pow(-1, ±Inf) = 1
   222  	MOVD	$PosInf, R4
   223  	CMPUBEQ	R2, R4, negOnePosInf
   224  	MOVD	$NegInf, R4
   225  	CMPUBEQ	R2, R4, negOneNegInf
   226  	BR	Normal
   227  xIsPosZero:
   228  	// special case Pow(+0, -Inf) = +Inf
   229  	MOVD	$NegInf, R4
   230  	CMPUBEQ	R2, R4, zeroNegInf
   231  
   232  	// special case Pow(+0, y < 0) = +Inf
   233  	FMOVD	y+8(FP), F2
   234  	FMOVD	$(0.0), F4
   235  	FCMPU	F2, F4
   236  	BLT	posZeroLtZero				//y < 0.0
   237  	BR	Normal
   238  xIsNegZero:
   239  	// special case Pow(-0, -Inf) = +Inf
   240  	MOVD	$NegInf, R4
   241  	CMPUBEQ	R2, R4, zeroNegInf
   242  	FMOVD	y+8(FP), F2
   243  negZeroNegY:
   244  	// special case Pow(x, ±0) = 1 for any x
   245  	FMOVD	$(0.0), F4
   246  	FCMPU	F4, F2
   247  	BLT	negZeroGtZero		// y > 0.0
   248  	BEQ yIsZero				// y = 0.0
   249  
   250  	FMOVD $(-0.0), F4
   251  	FCMPU F4, F2
   252  	BLT negZeroGtZero				// y > -0.0
   253  	BEQ yIsZero				// y = -0.0
   254  
   255  	// special case Pow(-0, y) = -Inf for y an odd integer < 0
   256  	// special case Pow(-0, y) = +Inf for finite y < 0 and not an odd integer
   257  	FIDBR	$5, F2, F4		//F2 translate to integer F4
   258  	FCMPU	F2, F4
   259  	BNE	zeroNotOdd			// y is not an (odd) integer and y < 0
   260  	FMOVD	$(2.0), F4
   261  	FDIV	F4, F2			// F2 = F2 / 2.0
   262  	FIDBR	$5, F2, F4		//F2 translate to integer F4
   263  	FCMPU	F2, F4
   264  	BNE	negZeroOddInt		// y is an odd integer and y < 0
   265  	BR	zeroNotOdd			// y is not an (odd) integer and y < 0
   266  
   267  negZeroGtZero:
   268  	// special case Pow(-0, y) = -0 for y an odd integer > 0
   269  	// special case Pow(±0, y) = +0 for finite y > 0 and not an odd integer
   270  	FIDBR	$5, F2, F4      //F2 translate to integer F4
   271  	FCMPU	F2, F4
   272  	BNE	zeroNotOddGtZero    // y is not an (odd) integer and y > 0
   273  	FMOVD	$(2.0), F4
   274  	FDIV	F4, F2          // F2 = F2 / 2.0
   275  	FIDBR	$5, F2, F4      //F2 translate to integer F4
   276  	FCMPU	F2, F4
   277  	BNE	negZeroOddIntGtZero       // y is an odd integer and y > 0
   278  	BR	zeroNotOddGtZero          // y is not an (odd) integer
   279  
   280  xLtZero:
   281  	// special case Pow(x, y) = NaN for finite x < 0 and finite non-integer y
   282  	FMOVD	y+8(FP), F2
   283  	FIDBR	$5, F2, F4
   284  	FCMPU	F2, F4
   285  	BNE	ltZeroInt
   286  	BR	Normal
   287  yIsPosInf:
   288  	// special case Pow(x, +Inf) = +Inf for |x| > 1
   289  	FMOVD	x+0(FP), F1
   290  	FMOVD	$(1.0), F3
   291  	FCMPU	F1, F3
   292  	BGT	gtOnePosInf
   293  	FMOVD	$(-1.0), F3
   294  	FCMPU	F1, F3
   295  	BLT	ltNegOnePosInf
   296  Normal:
   297  	FMOVD	x+0(FP), F0
   298  	FMOVD	y+8(FP), F2
   299  	MOVD	$·powrodataL51<>+0(SB), R9
   300  	LGDR	F0, R3
   301  	WORD	$0xC0298009	//iilf	%r2,2148095317
   302  	BYTE	$0x55
   303  	BYTE	$0x55
   304  	RISBGNZ	$32, $63, $32, R3, R1
   305  	SUBW	R1, R2
   306  	RISBGNZ	$58, $63, $50, R2, R3
   307  	BYTE	$0x18	//lr	%r5,%r1
   308  	BYTE	$0x51
   309  	MOVD	$·powtabi<>+0(SB), R12
   310  	WORD	$0xE303C000	//llgc	%r0,0(%r3,%r12)
   311  	BYTE	$0x00
   312  	BYTE	$0x90
   313  	SUBW	$0x1A0000, R5
   314  	SLD	$3, R0, R3
   315  	MOVD	$·powtm<>+0(SB), R4
   316  	MOVH	$0x0, R8
   317  	ANDW	$0x7FF00000, R2
   318  	ORW	R5, R1
   319  	WORD	$0x5A234000	//a	%r2,0(%r3,%r4)
   320  	MOVD	$0x3FF0000000000000, R5
   321  	RISBGZ	$40, $63, $56, R2, R3
   322  	RISBGN	$0, $31, $32, R2, R8
   323  	ORW	$0x45000000, R3
   324  	MOVW	R1, R6
   325  	CMPBLT	R6, $0, L42
   326  	FMOVD	F0, F4
   327  L2:
   328  	VLVGF	$0, R3, V1
   329  	MOVD	$·pow_xa<>+0(SB), R2
   330  	WORD	$0xED3090A0	//lde	%f3,.L52-.L51(%r9)
   331  	BYTE	$0x00
   332  	BYTE	$0x24
   333  	FMOVD	0(R2), F6
   334  	FSUBS	F1, F3
   335  	LDGR	R8, F1
   336  	WFMSDB	V4, V1, V6, V4
   337  	FMOVD	152(R9), F6
   338  	WFMDB	V4, V4, V7
   339  	FMOVD	144(R9), F1
   340  	FMOVD	136(R9), F5
   341  	WFMADB	V4, V1, V6, V1
   342  	VLEG	$0, 128(R9), V16
   343  	FMOVD	120(R9), F6
   344  	WFMADB	V4, V5, V6, V5
   345  	FMOVD	112(R9), F6
   346  	WFMADB	V1, V7, V5, V1
   347  	WFMADB	V4, V6, V16, V16
   348  	SLD	$3, R0, R2
   349  	FMOVD	104(R9), F5
   350  	WORD	$0xED824004	//ldeb	%f8,4(%r2,%r4)
   351  	BYTE	$0x00
   352  	BYTE	$0x04
   353  	LDEBR	F3, F3
   354  	FMOVD	96(R9), F6
   355  	WFMADB	V4, V6, V5, V6
   356  	FADD	F8, F3
   357  	WFMADB	V7, V6, V16, V6
   358  	FMUL	F7, F7
   359  	FMOVD	88(R9), F5
   360  	FMADD	F7, F1, F6
   361  	WFMADB	V4, V5, V3, V16
   362  	FMOVD	80(R9), F1
   363  	WFSDB	V16, V3, V3
   364  	MOVD	$·powtl<>+0(SB), R3
   365  	WFMADB	V4, V6, V1, V6
   366  	FMADD	F5, F4, F3
   367  	FMOVD	72(R9), F1
   368  	WFMADB	V4, V6, V1, V6
   369  	WORD	$0xED323000	//adb	%f3,0(%r2,%r3)
   370  	BYTE	$0x00
   371  	BYTE	$0x1A
   372  	FMOVD	64(R9), F1
   373  	WFMADB	V4, V6, V1, V6
   374  	MOVD	$·pow_xadd<>+0(SB), R2
   375  	WFMADB	V4, V6, V3, V4
   376  	FMOVD	0(R2), F5
   377  	WFADB	V4, V16, V3
   378  	VLEG	$0, 56(R9), V20
   379  	WFMSDB	V2, V3, V5, V3
   380  	VLEG	$0, 48(R9), V18
   381  	WFADB	V3, V5, V6
   382  	LGDR	F3, R2
   383  	WFMSDB	V2, V16, V6, V16
   384  	FMOVD	40(R9), F1
   385  	WFMADB	V2, V4, V16, V4
   386  	FMOVD	32(R9), F7
   387  	WFMDB	V4, V4, V3
   388  	WFMADB	V4, V1, V20, V1
   389  	WFMADB	V4, V7, V18, V7
   390  	VLEG	$0, 24(R9), V16
   391  	WFMADB	V1, V3, V7, V1
   392  	FMOVD	16(R9), F5
   393  	WFMADB	V4, V5, V16, V5
   394  	RISBGZ	$57, $60, $3, R2, R4
   395  	WFMADB	V3, V1, V5, V1
   396  	MOVD	$·powtexp<>+0(SB), R3
   397  	WORD	$0x68343000	//ld	%f3,0(%r4,%r3)
   398  	FMADD	F3, F4, F4
   399  	RISBGN	$0, $15, $48, R2, R5
   400  	WFMADB	V4, V1, V3, V4
   401  	LGDR	F6, R2
   402  	LDGR	R5, F1
   403  	SRAD	$48, R2, R2
   404  	FMADD	F1, F4, F1
   405  	RLL	$16, R2, R2
   406  	ANDW	$0x7FFF0000, R2
   407  	WORD	$0xC22B3F71	//alfi	%r2,1064370176
   408  	BYTE	$0x00
   409  	BYTE	$0x00
   410  	ORW	R2, R1, R3
   411  	MOVW	R3, R6
   412  	CMPBLT	R6, $0, L43
   413  L1:
   414  	FMOVD	F1, ret+16(FP)
   415  	RET
   416  L43:
   417  	LTDBR	F0, F0
   418  	BLTU	L44
   419  	FMOVD	F0, F3
   420  L7:
   421  	MOVD	$·pow_xinf<>+0(SB), R3
   422  	FMOVD	0(R3), F5
   423  	WFCEDBS	V3, V5, V7
   424  	BVS	L8
   425  	WFMDB	V3, V2, V6
   426  L8:
   427  	WFCEDBS	V2, V2, V3
   428  	BVS	L9
   429  	LTDBR	F2, F2
   430  	BEQ	L26
   431  	MOVW	R1, R6
   432  	CMPBLT	R6, $0, L45
   433  L11:
   434  	WORD	$0xC0190003	//iilf	%r1,262143
   435  	BYTE	$0xFF
   436  	BYTE	$0xFF
   437  	MOVW	R2, R7
   438  	MOVW	R1, R6
   439  	CMPBLE	R7, R6, L34
   440  	RISBGNZ	$32, $63, $32, R5, R1
   441  	LGDR	F6, R2
   442  	MOVD	$powiadd<>+0(SB), R3
   443  	RISBGZ	$60, $60, $4, R2, R2
   444  	WORD	$0x5A123000	//a	%r1,0(%r2,%r3)
   445  	RISBGN	$0, $31, $32, R1, R5
   446  	LDGR	R5, F1
   447  	FMADD	F1, F4, F1
   448  	MOVD	$powxscale<>+0(SB), R1
   449  	WORD	$0xED121000	//mdb	%f1,0(%r2,%r1)
   450  	BYTE	$0x00
   451  	BYTE	$0x1C
   452  	BR	L1
   453  L42:
   454  	LTDBR	F0, F0
   455  	BLTU	L46
   456  	FMOVD	F0, F4
   457  L3:
   458  	MOVD	$·pow_x001a<>+0(SB), R2
   459  	WORD	$0xED402000	//cdb	%f4,0(%r2)
   460  	BYTE	$0x00
   461  	BYTE	$0x19
   462  	BGE	L2
   463  	BVS	L2
   464  	MOVD	$·pow_x43f<>+0(SB), R2
   465  	WORD	$0xED402000	//mdb	%f4,0(%r2)
   466  	BYTE	$0x00
   467  	BYTE	$0x1C
   468  	WORD	$0xC0298009	//iilf	%r2,2148095317
   469  	BYTE	$0x55
   470  	BYTE	$0x55
   471  	LGDR	F4, R3
   472  	RISBGNZ	$32, $63, $32, R3, R3
   473  	SUBW	R3, R2, R3
   474  	RISBGZ	$33, $43, $0, R3, R2
   475  	RISBGNZ	$58, $63, $50, R3, R3
   476  	WORD	$0xE303C000	//llgc	%r0,0(%r3,%r12)
   477  	BYTE	$0x00
   478  	BYTE	$0x90
   479  	SLD	$3, R0, R3
   480  	WORD	$0x5A234000	//a	%r2,0(%r3,%r4)
   481  	BYTE	$0x18	//lr	%r3,%r2
   482  	BYTE	$0x32
   483  	RISBGN	$0, $31, $32, R3, R8
   484  	ADDW	$0x4000000, R3
   485  	BLEU	L5
   486  	RISBGZ	$40, $63, $56, R3, R3
   487  	ORW	$0x45000000, R3
   488  	BR	L2
   489  L9:
   490  	WFCEDBS	V0, V0, V4
   491  	BVS	L35
   492  	FMOVD	F2, F1
   493  	BR	L1
   494  L46:
   495  	WORD	$0xB3130040	//lcdbr	%f4,%f0
   496  	BR	L3
   497  L44:
   498  	WORD	$0xB3130030	//lcdbr	%f3,%f0
   499  	BR	L7
   500  L35:
   501  	FMOVD	F0, F1
   502  	BR	L1
   503  L26:
   504  	FMOVD	8(R9), F1
   505  	BR	L1
   506  L34:
   507  	FMOVD	8(R9), F4
   508  L19:
   509  	LTDBR	F6, F6
   510  	BLEU	L47
   511  L18:
   512  	WFMDB	V4, V5, V1
   513  	BR	L1
   514  L5:
   515  	RISBGZ	$33, $50, $63, R3, R3
   516  	WORD	$0xC23B4000	//alfi	%r3,1073741824
   517  	BYTE	$0x00
   518  	BYTE	$0x00
   519  	RLL	$24, R3, R3
   520  	ORW	$0x45000000, R3
   521  	BR	L2
   522  L45:
   523  	WFCEDBS	V0, V0, V4
   524  	BVS	L35
   525  	LTDBR	F0, F0
   526  	BLEU	L48
   527  	FMOVD	8(R9), F4
   528  L12:
   529  	MOVW	R2, R6
   530  	CMPBLT	R6, $0, L19
   531  	FMUL	F4, F1
   532  	BR	L1
   533  L47:
   534  	BLT	L40
   535  	WFCEDBS	V0, V0, V2
   536  	BVS	L49
   537  L16:
   538  	MOVD	·pow_xnan<>+0(SB), R1
   539  	LDGR	R1, F0
   540  	WFMDB	V4, V0, V1
   541  	BR	L1
   542  L48:
   543  	LGDR	F0, R3
   544  	RISBGNZ	$32, $63, $32, R3, R1
   545  	MOVW	R1, R6
   546  	CMPBEQ	R6, $0, L29
   547  	LTDBR	F2, F2
   548  	BLTU	L50
   549  	FMOVD	F2, F4
   550  L14:
   551  	MOVD	$·pow_x433<>+0(SB), R1
   552  	FMOVD	0(R1), F7
   553  	WFCHDBS	V4, V7, V3
   554  	BEQ	L15
   555  	WFADB	V7, V4, V3
   556  	FSUB	F7, F3
   557  	WFCEDBS	V4, V3, V3
   558  	BEQ	L15
   559  	LTDBR	F0, F0
   560  	FMOVD	8(R9), F4
   561  	BNE	L16
   562  L13:
   563  	LTDBR	F2, F2
   564  	BLT	L18
   565  L40:
   566  	FMOVD	$0, F0
   567  	WFMDB	V4, V0, V1
   568  	BR	L1
   569  L49:
   570  	WFMDB	V0, V4, V1
   571  	BR	L1
   572  L29:
   573  	FMOVD	8(R9), F4
   574  	BR	L13
   575  L15:
   576  	MOVD	$·pow_x434<>+0(SB), R1
   577  	FMOVD	0(R1), F7
   578  	WFCHDBS	V4, V7, V3
   579  	BEQ	L32
   580  	WFADB	V7, V4, V3
   581  	FSUB	F7, F3
   582  	WFCEDBS	V4, V3, V4
   583  	BEQ	L32
   584  	FMOVD	0(R9), F4
   585  L17:
   586  	LTDBR	F0, F0
   587  	BNE	L12
   588  	BR	L13
   589  L32:
   590  	FMOVD	8(R9), F4
   591  	BR	L17
   592  L50:
   593  	WORD	$0xB3130042	//lcdbr	%f4,%f2
   594  	BR	L14
   595  xIsOne:			// Pow(1, y) = 1 for any y
   596  yIsOne:			// Pow(x, 1) = x for any x
   597  posInfGeZero:	// Pow(+Inf, y) = +Inf for y > 0
   598  	MOVD	R1, ret+16(FP)
   599  	RET
   600  yIsNan:			//  Pow(NaN, y) = NaN
   601  ltZeroInt:		// Pow(x, y) = NaN for finite x < 0 and finite non-integer y
   602  	MOVD	$NaN, R2
   603  	MOVD	R2, ret+16(FP)
   604  	RET
   605  negOnePosInf:	// Pow(-1, ±Inf) = 1
   606  negOneNegInf:
   607  	MOVD	$PosOne, R3
   608  	MOVD	R3, ret+16(FP)
   609  	RET
   610  negZeroOddInt:
   611  	MOVD	$NegInf, R3
   612  	MOVD	R3, ret+16(FP)
   613  	RET
   614  zeroNotOdd:		// Pow(±0, y) = +Inf for finite y < 0 and not an odd integer
   615  posZeroLtZero:	// special case Pow(+0, y < 0) = +Inf
   616  zeroNegInf:		// Pow(±0, -Inf) = +Inf
   617  	MOVD	$PosInf, R3
   618  	MOVD	R3, ret+16(FP)
   619  	RET
   620  gtOnePosInf:	//Pow(x, +Inf) = +Inf for |x| > 1
   621  ltNegOnePosInf:
   622  	MOVD	R2, ret+16(FP)
   623  	RET
   624  yIsZero:		//Pow(x, ±0) = 1 for any x
   625  	MOVD	$PosOne, R4
   626  	MOVD	R4, ret+16(FP)
   627  	RET
   628  negZeroOddIntGtZero:        // Pow(-0, y) = -0 for y an odd integer > 0
   629  	MOVD	$NegZero, R3
   630  	MOVD	R3, ret+16(FP)
   631  	RET
   632  zeroNotOddGtZero:        // Pow(±0, y) = +0 for finite y > 0 and not an odd integer
   633  	MOVD	$0, ret+16(FP)
   634  	RET
   635  

View as plain text