cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

satanh.S (2235B)


      1|
      2|	satanh.sa 3.3 12/19/90
      3|
      4|	The entry point satanh computes the inverse
      5|	hyperbolic tangent of
      6|	an input argument; satanhd does the same except for denormalized
      7|	input.
      8|
      9|	Input: Double-extended number X in location pointed to
     10|		by address register a0.
     11|
     12|	Output: The value arctanh(X) returned in floating-point register Fp0.
     13|
     14|	Accuracy and Monotonicity: The returned result is within 3 ulps in
     15|		64 significant bit, i.e. within 0.5001 ulp to 53 bits if the
     16|		result is subsequently rounded to double precision. The
     17|		result is provably monotonic in double precision.
     18|
     19|	Speed: The program satanh takes approximately 270 cycles.
     20|
     21|	Algorithm:
     22|
     23|	ATANH
     24|	1. If |X| >= 1, go to 3.
     25|
     26|	2. (|X| < 1) Calculate atanh(X) by
     27|		sgn := sign(X)
     28|		y := |X|
     29|		z := 2y/(1-y)
     30|		atanh(X) := sgn * (1/2) * logp1(z)
     31|		Exit.
     32|
     33|	3. If |X| > 1, go to 5.
     34|
     35|	4. (|X| = 1) Generate infinity with an appropriate sign and
     36|		divide-by-zero by
     37|		sgn := sign(X)
     38|		atan(X) := sgn / (+0).
     39|		Exit.
     40|
     41|	5. (|X| > 1) Generate an invalid operation by 0 * infinity.
     42|		Exit.
     43|
     44
     45|		Copyright (C) Motorola, Inc. 1990
     46|			All Rights Reserved
     47|
     48|       For details on the license for this file, please see the
     49|       file, README, in this same directory.
     50
     51|satanh	idnt	2,1 | Motorola 040 Floating Point Software Package
     52
     53	|section	8
     54
     55	|xref	t_dz
     56	|xref	t_operr
     57	|xref	t_frcinx
     58	|xref	t_extdnrm
     59	|xref	slognp1
     60
     61	.global	satanhd
     62satanhd:
     63|--ATANH(X) = X FOR DENORMALIZED X
     64
     65	bra		t_extdnrm
     66
     67	.global	satanh
     68satanh:
     69	movel		(%a0),%d0
     70	movew		4(%a0),%d0
     71	andil		#0x7FFFFFFF,%d0
     72	cmpil		#0x3FFF8000,%d0
     73	bges		ATANHBIG
     74
     75|--THIS IS THE USUAL CASE, |X| < 1
     76|--Y = |X|, Z = 2Y/(1-Y), ATANH(X) = SIGN(X) * (1/2) * LOG1P(Z).
     77
     78	fabsx		(%a0),%fp0	| ...Y = |X|
     79	fmovex		%fp0,%fp1
     80	fnegx		%fp1		| ...-Y
     81	faddx		%fp0,%fp0		| ...2Y
     82	fadds		#0x3F800000,%fp1	| ...1-Y
     83	fdivx		%fp1,%fp0		| ...2Y/(1-Y)
     84	movel		(%a0),%d0
     85	andil		#0x80000000,%d0
     86	oril		#0x3F000000,%d0	| ...SIGN(X)*HALF
     87	movel		%d0,-(%sp)
     88
     89	fmovemx	%fp0-%fp0,(%a0)	| ...overwrite input
     90	movel		%d1,-(%sp)
     91	clrl		%d1
     92	bsr		slognp1		| ...LOG1P(Z)
     93	fmovel		(%sp)+,%fpcr
     94	fmuls		(%sp)+,%fp0
     95	bra		t_frcinx
     96
     97ATANHBIG:
     98	fabsx		(%a0),%fp0	| ...|X|
     99	fcmps		#0x3F800000,%fp0
    100	fbgt		t_operr
    101	bra		t_dz
    102
    103	|end