Home | History | Annotate | Download | only in 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 // Minimax polynomial coefficients and other constants
      8 DATA acoshrodataL11<> + 0(SB)/8, $-1.0
      9 DATA acoshrodataL11<> + 8(SB)/8, $.41375273347623353626
     10 DATA acoshrodataL11<> + 16(SB)/8, $.51487302528619766235E+04
     11 DATA acoshrodataL11<> + 24(SB)/8, $-1.67526912689208984375
     12 DATA acoshrodataL11<> + 32(SB)/8, $0.181818181818181826E+00
     13 DATA acoshrodataL11<> + 40(SB)/8, $-.165289256198351540E-01
     14 DATA acoshrodataL11<> + 48(SB)/8, $0.200350613573012186E-02
     15 DATA acoshrodataL11<> + 56(SB)/8, $-.273205381970859341E-03
     16 DATA acoshrodataL11<> + 64(SB)/8, $0.397389654305194527E-04
     17 DATA acoshrodataL11<> + 72(SB)/8, $0.938370938292558173E-06
     18 DATA acoshrodataL11<> + 80(SB)/8, $-.602107458843052029E-05
     19 DATA acoshrodataL11<> + 88(SB)/8, $0.212881813645679599E-07
     20 DATA acoshrodataL11<> + 96(SB)/8, $-.148682720127920854E-06
     21 DATA acoshrodataL11<> + 104(SB)/8, $-5.5
     22 DATA acoshrodataL11<> + 112(SB)/8, $0x7ff8000000000000      //Nan
     23 GLOBL acoshrodataL11<> + 0(SB), RODATA, $120
     24 
     25 // Table of log correction terms
     26 DATA acoshtab2068<> + 0(SB)/8, $0.585235384085551248E-01
     27 DATA acoshtab2068<> + 8(SB)/8, $0.412206153771168640E-01
     28 DATA acoshtab2068<> + 16(SB)/8, $0.273839003221648339E-01
     29 DATA acoshtab2068<> + 24(SB)/8, $0.166383778368856480E-01
     30 DATA acoshtab2068<> + 32(SB)/8, $0.866678223433169637E-02
     31 DATA acoshtab2068<> + 40(SB)/8, $0.319831684989627514E-02
     32 DATA acoshtab2068<> + 48(SB)/8, $0.0
     33 DATA acoshtab2068<> + 56(SB)/8, $-.113006378583725549E-02
     34 DATA acoshtab2068<> + 64(SB)/8, $-.367979419636602491E-03
     35 DATA acoshtab2068<> + 72(SB)/8, $0.213172484510484979E-02
     36 DATA acoshtab2068<> + 80(SB)/8, $0.623271047682013536E-02
     37 DATA acoshtab2068<> + 88(SB)/8, $0.118140812789696885E-01
     38 DATA acoshtab2068<> + 96(SB)/8, $0.187681358930914206E-01
     39 DATA acoshtab2068<> + 104(SB)/8, $0.269985148668178992E-01
     40 DATA acoshtab2068<> + 112(SB)/8, $0.364186619761331328E-01
     41 DATA acoshtab2068<> + 120(SB)/8, $0.469505379381388441E-01
     42 GLOBL acoshtab2068<> + 0(SB), RODATA, $128
     43 
     44 // Acosh returns the inverse hyperbolic cosine of the argument.
     45 //
     46 // Special cases are:
     47 //      Acosh(+Inf) = +Inf
     48 //      Acosh(x) = NaN if x < 1
     49 //      Acosh(NaN) = NaN
     50 // The algorithm used is minimax polynomial approximation
     51 // with coefficients determined with a Remez exchange algorithm.
     52 
     53 TEXT	acoshAsm(SB), NOSPLIT, $0-16
     54 	FMOVD	x+0(FP), F0
     55 	MOVD	$acoshrodataL11<>+0(SB), R9
     56 	WORD	$0xB3CD0010	//lgdr %r1, %f0
     57 	WORD	$0xC0295FEF	//iilf	%r2,1609564159
     58 	BYTE	$0xFF
     59 	BYTE	$0xFF
     60 	SRAD	$32, R1
     61 	CMPW	R1, R2
     62 	BGT	L2
     63 	WORD	$0xC0293FEF	//iilf	%r2,1072693247
     64 	BYTE	$0xFF
     65 	BYTE	$0xFF
     66 	CMPW	R1, R2
     67 	BGT	L10
     68 L3:
     69 	WFCEDBS	V0, V0, V2
     70 	BVS	L1
     71 	FMOVD	112(R9), F0
     72 L1:
     73 	FMOVD	F0, ret+8(FP)
     74 	RET
     75 L2:
     76 	WORD	$0xC0297FEF	//iilf	%r2,2146435071
     77 	BYTE	$0xFF
     78 	BYTE	$0xFF
     79 	MOVW	R1, R6
     80 	MOVW	R2, R7
     81 	CMPBGT	R6, R7, L1
     82 	FMOVD	F0, F8
     83 	FMOVD	$0, F0
     84 	WFADB	V0, V8, V0
     85 	WORD	$0xC0398006	//iilf	%r3,2147909631
     86 	BYTE	$0x7F
     87 	BYTE	$0xFF
     88 	WORD	$0xB3CD0050	//lgdr %r5, %f0
     89 	SRAD	$32, R5
     90 	MOVH	$0x0, R1
     91 	SUBW	R5, R3
     92 	FMOVD	$0, F10
     93 	WORD	$0xEC4320AF	//risbg	%r4,%r3,32,128+47,0
     94 	BYTE	$0x00
     95 	BYTE	$0x55
     96 	WORD	$0xEC3339BC	//risbg	%r3,%r3,57,128+60,64-13
     97 	BYTE	$0x33
     98 	BYTE	$0x55
     99 	BYTE	$0x18	//lr	%r2,%r4
    100 	BYTE	$0x24
    101 	WORD	$0xEC14001F	//risbgn	%r1,%r4,64-64+0,64-64+0+32-1,64-0-32
    102 	BYTE	$0x20
    103 	BYTE	$0x59
    104 	SUBW	$0x100000, R2
    105 	SRAW	$8, R2, R2
    106 	ORW	$0x45000000, R2
    107 L5:
    108 	WORD	$0xB3C10001	//ldgr	%f0,%r1
    109 	FMOVD	104(R9), F2
    110 	FMADD	F8, F0, F2
    111 	FMOVD	96(R9), F4
    112 	WFMADB	V10, V0, V2, V0
    113 	FMOVD	88(R9), F6
    114 	FMOVD	80(R9), F2
    115 	WFMADB	V0, V6, V4, V6
    116 	FMOVD	72(R9), F1
    117 	WFMDB	V0, V0, V4
    118 	WFMADB	V0, V1, V2, V1
    119 	FMOVD	64(R9), F2
    120 	WFMADB	V6, V4, V1, V6
    121 	FMOVD	56(R9), F1
    122 	WORD	$0xEC3339BC	//risbg	%r3,%r3,57,128+60,0
    123 	BYTE	$0x00
    124 	BYTE	$0x55
    125 	WFMADB	V0, V2, V1, V2
    126 	FMOVD	48(R9), F1
    127 	WFMADB	V4, V6, V2, V6
    128 	FMOVD	40(R9), F2
    129 	WFMADB	V0, V1, V2, V1
    130 	VLVGF	$0, R2, V2
    131 	WFMADB	V4, V6, V1, V4
    132 	LDEBR	F2, F2
    133 	FMOVD	32(R9), F6
    134 	WFMADB	V0, V4, V6, V4
    135 	FMOVD	24(R9), F1
    136 	FMOVD	16(R9), F6
    137 	MOVD	$acoshtab2068<>+0(SB), R1
    138 	WFMADB	V2, V1, V6, V2
    139 	FMOVD	0(R3)(R1*1), F3
    140 	WFMADB	V0, V4, V3, V0
    141 	FMOVD	8(R9), F4
    142 	FMADD	F4, F2, F0
    143 	FMOVD	F0, ret+8(FP)
    144 	RET
    145 L10:
    146 	FMOVD	F0, F8
    147 	FMOVD	0(R9), F0
    148 	FMADD	F8, F8, F0
    149 	WORD	$0xB3120000	//ltdbr	%f0,%f0
    150 	FSQRT	F0, F10
    151 L4:
    152 	WFADB	V10, V8, V0
    153 	WORD	$0xC0398006	//iilf	%r3,2147909631
    154 	BYTE	$0x7F
    155 	BYTE	$0xFF
    156 	WORD	$0xB3CD0050	//lgdr %r5, %f0
    157 	SRAD	$32, R5
    158 	MOVH	$0x0, R1
    159 	SUBW	R5, R3
    160 	SRAW	$8, R3, R2
    161 	WORD	$0xEC4320AF	//risbg	%r4,%r3,32,128+47,0
    162 	BYTE	$0x00
    163 	BYTE	$0x55
    164 	ANDW	$0xFFFFFF00, R2
    165 	WORD	$0xEC3339BC	//risbg	%r3,%r3,57,128+60,64-13
    166 	BYTE	$0x33
    167 	BYTE	$0x55
    168 	ORW	$0x45000000, R2
    169 	WORD	$0xEC14001F	//risbgn	%r1,%r4,64-64+0,64-64+0+32-1,64-0-32
    170 	BYTE	$0x20
    171 	BYTE	$0x59
    172 	BR	L5
    173