...
Run Format

Text file src/math/pow_s390x.s

Documentation: math

     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 indeces 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		WORD	$0xB3CD0030	//lgdr	%r3,%f0
   301		WORD	$0xC0298009	//iilf	%r2,2148095317
   302		BYTE	$0x55
   303		BYTE	$0x55
   304		WORD	$0xEC1320BF	//risbgn	%r1,%r3,64-32,128+63,64+0+32
   305		BYTE	$0x60
   306		BYTE	$0x59
   307		SUBW	R1, R2
   308		WORD	$0xEC323ABF	//risbgn	%r3,%r2,64-6,128+63,64+44+6
   309		BYTE	$0x72
   310		BYTE	$0x59
   311		BYTE	$0x18	//lr	%r5,%r1
   312		BYTE	$0x51
   313		MOVD	$·powtabi<>+0(SB), R12
   314		WORD	$0xE303C000	//llgc	%r0,0(%r3,%r12)
   315		BYTE	$0x00
   316		BYTE	$0x90
   317		SUBW	$0x1A0000, R5
   318		SLD	$3, R0, R3
   319		MOVD	$·powtm<>+0(SB), R4
   320		MOVH	$0x0, R8
   321		ANDW	$0x7FF00000, R2
   322		ORW	R5, R1
   323		WORD	$0x5A234000	//a	%r2,0(%r3,%r4)
   324		MOVD	$0x3FF0000000000000, R5
   325		WORD	$0xEC3228BF	//risbg	%r3,%r2,64-24,128+63,64+32+24
   326		BYTE	$0x78
   327		BYTE	$0x55
   328		WORD	$0xEC82001F	//risbgn	%r8,%r2,64-64+0,64-64+0+32-1,64-0-32
   329		BYTE	$0x20
   330		BYTE	$0x59
   331		ORW	$0x45000000, R3
   332		MOVW	R1, R6
   333		CMPBLT	R6, $0, L42
   334		FMOVD	F0, F4
   335	L2:
   336		VLVGF	$0, R3, V1
   337		MOVD	$·pow_xa<>+0(SB), R2
   338		WORD	$0xED3090A0	//lde	%f3,.L52-.L51(%r9)
   339		BYTE	$0x00
   340		BYTE	$0x24
   341		FMOVD	0(R2), F6
   342		FSUBS	F1, F3
   343		WORD	$0xB3C10018	//ldgr	%f1,%r8
   344		WFMSDB	V4, V1, V6, V4
   345		FMOVD	152(R9), F6
   346		WFMDB	V4, V4, V7
   347		FMOVD	144(R9), F1
   348		FMOVD	136(R9), F5
   349		WFMADB	V4, V1, V6, V1
   350		VLEG	$0, 128(R9), V16
   351		FMOVD	120(R9), F6
   352		WFMADB	V4, V5, V6, V5
   353		FMOVD	112(R9), F6
   354		WFMADB	V1, V7, V5, V1
   355		WFMADB	V4, V6, V16, V16
   356		SLD	$3, R0, R2
   357		FMOVD	104(R9), F5
   358		WORD	$0xED824004	//ldeb	%f8,4(%r2,%r4)
   359		BYTE	$0x00
   360		BYTE	$0x04
   361		LDEBR	F3, F3
   362		FMOVD	96(R9), F6
   363		WFMADB	V4, V6, V5, V6
   364		FADD	F8, F3
   365		WFMADB	V7, V6, V16, V6
   366		FMUL	F7, F7
   367		FMOVD	88(R9), F5
   368		FMADD	F7, F1, F6
   369		WFMADB	V4, V5, V3, V16
   370		FMOVD	80(R9), F1
   371		WFSDB	V16, V3, V3
   372		MOVD	$·powtl<>+0(SB), R3
   373		WFMADB	V4, V6, V1, V6
   374		FMADD	F5, F4, F3
   375		FMOVD	72(R9), F1
   376		WFMADB	V4, V6, V1, V6
   377		WORD	$0xED323000	//adb	%f3,0(%r2,%r3)
   378		BYTE	$0x00
   379		BYTE	$0x1A
   380		FMOVD	64(R9), F1
   381		WFMADB	V4, V6, V1, V6
   382		MOVD	$·pow_xadd<>+0(SB), R2
   383		WFMADB	V4, V6, V3, V4
   384		FMOVD	0(R2), F5
   385		WFADB	V4, V16, V3
   386		VLEG	$0, 56(R9), V20
   387		WFMSDB	V2, V3, V5, V3
   388		VLEG	$0, 48(R9), V18
   389		WFADB	V3, V5, V6
   390		WORD	$0xB3CD0023	//lgdr	%r2,%f3
   391		WFMSDB	V2, V16, V6, V16
   392		FMOVD	40(R9), F1
   393		WFMADB	V2, V4, V16, V4
   394		FMOVD	32(R9), F7
   395		WFMDB	V4, V4, V3
   396		WFMADB	V4, V1, V20, V1
   397		WFMADB	V4, V7, V18, V7
   398		VLEG	$0, 24(R9), V16
   399		WFMADB	V1, V3, V7, V1
   400		FMOVD	16(R9), F5
   401		WFMADB	V4, V5, V16, V5
   402		WORD	$0xEC4239BC	//risbg	%r4,%r2,57,128+60,3
   403		BYTE	$0x03
   404		BYTE	$0x55
   405		WFMADB	V3, V1, V5, V1
   406		MOVD	$·powtexp<>+0(SB), R3
   407		WORD	$0x68343000	//ld	%f3,0(%r4,%r3)
   408		FMADD	F3, F4, F4
   409		WORD	$0xEC52000F	//risbgn	%r5,%r2,64-64+0,64-64+0+16-1,64-0-16
   410		BYTE	$0x30
   411		BYTE	$0x59
   412		WFMADB	V4, V1, V3, V4
   413		WORD	$0xB3CD0026	//lgdr	%r2,%f6
   414		WORD	$0xB3C10015	//ldgr	%f1,%r5
   415		SRAD	$48, R2, R2
   416		FMADD	F1, F4, F1
   417		RLL	$16, R2, R2
   418		ANDW	$0x7FFF0000, R2
   419		WORD	$0xC22B3F71	//alfi	%r2,1064370176
   420		BYTE	$0x00
   421		BYTE	$0x00
   422		ORW	R2, R1, R3
   423		MOVW	R3, R6
   424		CMPBLT	R6, $0, L43
   425	L1:
   426		FMOVD	F1, ret+16(FP)
   427		RET
   428	L43:
   429		WORD	$0xB3120000	//ltdbr	%f0,%f0
   430		BLTU	L44
   431		FMOVD	F0, F3
   432	L7:
   433		MOVD	$·pow_xinf<>+0(SB), R3
   434		FMOVD	0(R3), F5
   435		WFCEDBS	V3, V5, V7
   436		BVS	L8
   437		WFMDB	V3, V2, V6
   438	L8:
   439		WFCEDBS	V2, V2, V3
   440		BVS	L9
   441		WORD	$0xB3120022	//ltdbr	%f2,%f2
   442		BEQ	L26
   443		MOVW	R1, R6
   444		CMPBLT	R6, $0, L45
   445	L11:
   446		WORD	$0xC0190003	//iilf	%r1,262143
   447		BYTE	$0xFF
   448		BYTE	$0xFF
   449		MOVW	R2, R7
   450		MOVW	R1, R6
   451		CMPBLE	R7, R6, L34
   452		WORD	$0xEC1520BF	//risbgn	%r1,%r5,64-32,128+63,64+0+32
   453		BYTE	$0x60
   454		BYTE	$0x59
   455		WORD	$0xB3CD0026	//lgdr	%r2,%f6
   456		MOVD	$powiadd<>+0(SB), R3
   457		WORD	$0xEC223CBC	//risbg	%r2,%r2,60,128+60,64-60
   458		BYTE	$0x04
   459		BYTE	$0x55
   460		WORD	$0x5A123000	//a	%r1,0(%r2,%r3)
   461		WORD	$0xEC51001F	//risbgn	%r5,%r1,64-64+0,64-64+0+32-1,64-0-32
   462		BYTE	$0x20
   463		BYTE	$0x59
   464		WORD	$0xB3C10015	//ldgr	%f1,%r5
   465		FMADD	F1, F4, F1
   466		MOVD	$powxscale<>+0(SB), R1
   467		WORD	$0xED121000	//mdb	%f1,0(%r2,%r1)
   468		BYTE	$0x00
   469		BYTE	$0x1C
   470		BR	L1
   471	L42:
   472		WORD	$0xB3120000	//ltdbr	%f0,%f0
   473		BLTU	L46
   474		FMOVD	F0, F4
   475	L3:
   476		MOVD	$·pow_x001a<>+0(SB), R2
   477		WORD	$0xED402000	//cdb	%f4,0(%r2)
   478		BYTE	$0x00
   479		BYTE	$0x19
   480		BGE	L2
   481		BVS	L2
   482		MOVD	$·pow_x43f<>+0(SB), R2
   483		WORD	$0xED402000	//mdb	%f4,0(%r2)
   484		BYTE	$0x00
   485		BYTE	$0x1C
   486		WORD	$0xC0298009	//iilf	%r2,2148095317
   487		BYTE	$0x55
   488		BYTE	$0x55
   489		WORD	$0xB3CD0034	//lgdr	%r3,%f4
   490		WORD	$0xEC3320BF	//risbgn	%r3,%r3,64-32,128+63,64+0+32
   491		BYTE	$0x60
   492		BYTE	$0x59
   493		SUBW	R3, R2, R3
   494		WORD	$0xEC2321AB	//risbg	%r2,%r3,33,128+43,0
   495		BYTE	$0x00
   496		BYTE	$0x55
   497		WORD	$0xEC333ABF	//risbgn	%r3,%r3,64-6,128+63,64+44+6
   498		BYTE	$0x72
   499		BYTE	$0x59
   500		WORD	$0xE303C000	//llgc	%r0,0(%r3,%r12)
   501		BYTE	$0x00
   502		BYTE	$0x90
   503		SLD	$3, R0, R3
   504		WORD	$0x5A234000	//a	%r2,0(%r3,%r4)
   505		BYTE	$0x18	//lr	%r3,%r2
   506		BYTE	$0x32
   507		WORD	$0xEC83001F	//risbgn	%r8,%r3,64-64+0,64-64+0+32-1,64-0-32
   508		BYTE	$0x20
   509		BYTE	$0x59
   510		ADDW	$0x4000000, R3
   511		BLEU	L5
   512		WORD	$0xEC3328BF	//risbg	%r3,%r3,64-24,128+63,64+32+24
   513		BYTE	$0x78
   514		BYTE	$0x55
   515		ORW	$0x45000000, R3
   516		BR	L2
   517	L9:
   518		WFCEDBS	V0, V0, V4
   519		BVS	L35
   520		FMOVD	F2, F1
   521		BR	L1
   522	L46:
   523		WORD	$0xB3130040	//lcdbr	%f4,%f0
   524		BR	L3
   525	L44:
   526		WORD	$0xB3130030	//lcdbr	%f3,%f0
   527		BR	L7
   528	L35:
   529		FMOVD	F0, F1
   530		BR	L1
   531	L26:
   532		FMOVD	8(R9), F1
   533		BR	L1
   534	L34:
   535		FMOVD	8(R9), F4
   536	L19:
   537		WORD	$0xB3120066	//ltdbr	%f6,%f6
   538		BLEU	L47
   539	L18:
   540		WFMDB	V4, V5, V1
   541		BR	L1
   542	L5:
   543		WORD	$0xEC3321B2	//risbg	%r3,%r3,33,128+50,64-1
   544		BYTE	$0x3F
   545		BYTE	$0x55
   546		WORD	$0xC23B4000	//alfi	%r3,1073741824
   547		BYTE	$0x00
   548		BYTE	$0x00
   549		RLL	$24, R3, R3
   550		ORW	$0x45000000, R3
   551		BR	L2
   552	L45:
   553		WFCEDBS	V0, V0, V4
   554		BVS	L35
   555		WORD	$0xB3120000	//ltdbr	%f0,%f0
   556		BLEU	L48
   557		FMOVD	8(R9), F4
   558	L12:
   559		MOVW	R2, R6
   560		CMPBLT	R6, $0, L19
   561		FMUL	F4, F1
   562		BR	L1
   563	L47:
   564		BLT	L40
   565		WFCEDBS	V0, V0, V2
   566		BVS	L49
   567	L16:
   568		MOVD	·pow_xnan<>+0(SB), R1
   569		WORD	$0xB3C10001	//ldgr	%f0,%r1
   570		WFMDB	V4, V0, V1
   571		BR	L1
   572	L48:
   573		WORD	$0xB3CD0030	//lgdr	%r3,%f0
   574		WORD	$0xEC1320BF	//risbgn	%r1,%r3,64-32,128+63,64+0+32
   575		BYTE	$0x60
   576		BYTE	$0x59
   577		MOVW	R1, R6
   578		CMPBEQ	R6, $0, L29
   579		WORD	$0xB3120022	//ltdbr	%f2,%f2
   580		BLTU	L50
   581		FMOVD	F2, F4
   582	L14:
   583		MOVD	$·pow_x433<>+0(SB), R1
   584		FMOVD	0(R1), F7
   585		WFCHDBS	V4, V7, V3
   586		BEQ	L15
   587		WFADB	V7, V4, V3
   588		FSUB	F7, F3
   589		WFCEDBS	V4, V3, V3
   590		BEQ	L15
   591		WORD	$0xB3120000	//ltdbr	%f0,%f0
   592		FMOVD	8(R9), F4
   593		BNE	L16
   594	L13:
   595		WORD	$0xB3120022	//ltdbr	%f2,%f2
   596		BLT	L18
   597	L40:
   598		FMOVD	$0, F0
   599		WFMDB	V4, V0, V1
   600		BR	L1
   601	L49:
   602		WFMDB	V0, V4, V1
   603		BR	L1
   604	L29:
   605		FMOVD	8(R9), F4
   606		BR	L13
   607	L15:
   608		MOVD	$·pow_x434<>+0(SB), R1
   609		FMOVD	0(R1), F7
   610		WFCHDBS	V4, V7, V3
   611		BEQ	L32
   612		WFADB	V7, V4, V3
   613		FSUB	F7, F3
   614		WFCEDBS	V4, V3, V4
   615		BEQ	L32
   616		FMOVD	0(R9), F4
   617	L17:
   618		WORD	$0xB3120000	//ltdbr	%f0,%f0
   619		BNE	L12
   620		BR	L13
   621	L32:
   622		FMOVD	8(R9), F4
   623		BR	L17
   624	L50:
   625		WORD	$0xB3130042	//lcdbr	%f4,%f2
   626		BR	L14
   627	xIsOne:			// Pow(1, y) = 1 for any y
   628	yIsOne:			// Pow(x, 1) = x for any x
   629	posInfGeZero:	// Pow(+Inf, y) = +Inf for y > 0
   630		MOVD	R1, ret+16(FP)
   631		RET
   632	yIsNan:			//  Pow(NaN, y) = NaN
   633	ltZeroInt:		// Pow(x, y) = NaN for finite x < 0 and finite non-integer y
   634		MOVD	$NaN, R2
   635		MOVD	R2, ret+16(FP)
   636		RET
   637	negOnePosInf:	// Pow(-1, ±Inf) = 1
   638	negOneNegInf:
   639		MOVD	$PosOne, R3
   640		MOVD	R3, ret+16(FP)
   641		RET
   642	negZeroOddInt:
   643		MOVD	$NegInf, R3
   644		MOVD	R3, ret+16(FP)
   645		RET
   646	zeroNotOdd:		// Pow(±0, y) = +Inf for finite y < 0 and not an odd integer
   647	posZeroLtZero:	// special case Pow(+0, y < 0) = +Inf
   648	zeroNegInf:		// Pow(±0, -Inf) = +Inf
   649		MOVD	$PosInf, R3
   650		MOVD	R3, ret+16(FP)
   651		RET
   652	gtOnePosInf:	//Pow(x, +Inf) = +Inf for |x| > 1
   653	ltNegOnePosInf:
   654		MOVD	R2, ret+16(FP)
   655		RET
   656	yIsZero:		//Pow(x, ±0) = 1 for any x
   657		MOVD	$PosOne, R4
   658		MOVD	R4, ret+16(FP)
   659		RET
   660	negZeroOddIntGtZero:        // Pow(-0, y) = -0 for y an odd integer > 0
   661		MOVD	$NegZero, R3
   662		MOVD	R3, ret+16(FP)
   663		RET
   664	zeroNotOddGtZero:        // Pow(±0, y) = +0 for finite y > 0 and not an odd integer
   665		MOVD	$0, ret+16(FP)
   666		RET

View as plain text