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

slog2.S (5198B)


      1|
      2|	slog2.sa 3.1 12/10/90
      3|
      4|       The entry point slog10 computes the base-10
      5|	logarithm of an input argument X.
      6|	slog10d does the same except the input value is a
      7|	denormalized number.
      8|	sLog2 and sLog2d are the base-2 analogues.
      9|
     10|       INPUT:	Double-extended value in memory location pointed to
     11|		by address register a0.
     12|
     13|       OUTPUT: log_10(X) or log_2(X) returned in floating-point
     14|		register fp0.
     15|
     16|       ACCURACY and MONOTONICITY: The returned result is within 1.7
     17|		ulps in 64 significant bit, i.e. within 0.5003 ulp
     18|		to 53 bits if the result is subsequently rounded
     19|		to double precision. The result is provably monotonic
     20|		in double precision.
     21|
     22|       SPEED:	Two timings are measured, both in the copy-back mode.
     23|		The first one is measured when the function is invoked
     24|		the first time (so the instructions and data are not
     25|		in cache), and the second one is measured when the
     26|		function is reinvoked at the same input argument.
     27|
     28|       ALGORITHM and IMPLEMENTATION NOTES:
     29|
     30|       slog10d:
     31|
     32|       Step 0.   If X < 0, create a NaN and raise the invalid operation
     33|                 flag. Otherwise, save FPCR in D1; set FpCR to default.
     34|       Notes:    Default means round-to-nearest mode, no floating-point
     35|                 traps, and precision control = double extended.
     36|
     37|       Step 1.   Call slognd to obtain Y = log(X), the natural log of X.
     38|       Notes:    Even if X is denormalized, log(X) is always normalized.
     39|
     40|       Step 2.   Compute log_10(X) = log(X) * (1/log(10)).
     41|            2.1  Restore the user FPCR
     42|            2.2  Return ans := Y * INV_L10.
     43|
     44|
     45|       slog10:
     46|
     47|       Step 0.   If X < 0, create a NaN and raise the invalid operation
     48|                 flag. Otherwise, save FPCR in D1; set FpCR to default.
     49|       Notes:    Default means round-to-nearest mode, no floating-point
     50|                 traps, and precision control = double extended.
     51|
     52|       Step 1.   Call sLogN to obtain Y = log(X), the natural log of X.
     53|
     54|       Step 2.   Compute log_10(X) = log(X) * (1/log(10)).
     55|            2.1  Restore the user FPCR
     56|            2.2  Return ans := Y * INV_L10.
     57|
     58|
     59|       sLog2d:
     60|
     61|       Step 0.   If X < 0, create a NaN and raise the invalid operation
     62|                 flag. Otherwise, save FPCR in D1; set FpCR to default.
     63|       Notes:    Default means round-to-nearest mode, no floating-point
     64|                 traps, and precision control = double extended.
     65|
     66|       Step 1.   Call slognd to obtain Y = log(X), the natural log of X.
     67|       Notes:    Even if X is denormalized, log(X) is always normalized.
     68|
     69|       Step 2.   Compute log_10(X) = log(X) * (1/log(2)).
     70|            2.1  Restore the user FPCR
     71|            2.2  Return ans := Y * INV_L2.
     72|
     73|
     74|       sLog2:
     75|
     76|       Step 0.   If X < 0, create a NaN and raise the invalid operation
     77|                 flag. Otherwise, save FPCR in D1; set FpCR to default.
     78|       Notes:    Default means round-to-nearest mode, no floating-point
     79|                 traps, and precision control = double extended.
     80|
     81|       Step 1.   If X is not an integer power of two, i.e., X != 2^k,
     82|                 go to Step 3.
     83|
     84|       Step 2.   Return k.
     85|            2.1  Get integer k, X = 2^k.
     86|            2.2  Restore the user FPCR.
     87|            2.3  Return ans := convert-to-double-extended(k).
     88|
     89|       Step 3.   Call sLogN to obtain Y = log(X), the natural log of X.
     90|
     91|       Step 4.   Compute log_2(X) = log(X) * (1/log(2)).
     92|            4.1  Restore the user FPCR
     93|            4.2  Return ans := Y * INV_L2.
     94|
     95
     96|		Copyright (C) Motorola, Inc. 1990
     97|			All Rights Reserved
     98|
     99|       For details on the license for this file, please see the
    100|       file, README, in this same directory.
    101
    102|SLOG2    idnt    2,1 | Motorola 040 Floating Point Software Package
    103
    104	|section	8
    105
    106	|xref	t_frcinx
    107	|xref	t_operr
    108	|xref	slogn
    109	|xref	slognd
    110
    111INV_L10:  .long 0x3FFD0000,0xDE5BD8A9,0x37287195,0x00000000
    112
    113INV_L2:   .long 0x3FFF0000,0xB8AA3B29,0x5C17F0BC,0x00000000
    114
    115	.global	slog10d
    116slog10d:
    117|--entry point for Log10(X), X is denormalized
    118	movel		(%a0),%d0
    119	blt		invalid
    120	movel		%d1,-(%sp)
    121	clrl		%d1
    122	bsr		slognd			| ...log(X), X denorm.
    123	fmovel		(%sp)+,%fpcr
    124	fmulx		INV_L10,%fp0
    125	bra		t_frcinx
    126
    127	.global	slog10
    128slog10:
    129|--entry point for Log10(X), X is normalized
    130
    131	movel		(%a0),%d0
    132	blt		invalid
    133	movel		%d1,-(%sp)
    134	clrl		%d1
    135	bsr		slogn			| ...log(X), X normal.
    136	fmovel		(%sp)+,%fpcr
    137	fmulx		INV_L10,%fp0
    138	bra		t_frcinx
    139
    140
    141	.global	slog2d
    142slog2d:
    143|--entry point for Log2(X), X is denormalized
    144
    145	movel		(%a0),%d0
    146	blt		invalid
    147	movel		%d1,-(%sp)
    148	clrl		%d1
    149	bsr		slognd			| ...log(X), X denorm.
    150	fmovel		(%sp)+,%fpcr
    151	fmulx		INV_L2,%fp0
    152	bra		t_frcinx
    153
    154	.global	slog2
    155slog2:
    156|--entry point for Log2(X), X is normalized
    157	movel		(%a0),%d0
    158	blt		invalid
    159
    160	movel		8(%a0),%d0
    161	bnes		continue		| ...X is not 2^k
    162
    163	movel		4(%a0),%d0
    164	andl		#0x7FFFFFFF,%d0
    165	tstl		%d0
    166	bnes		continue
    167
    168|--X = 2^k.
    169	movew		(%a0),%d0
    170	andl		#0x00007FFF,%d0
    171	subl		#0x3FFF,%d0
    172	fmovel		%d1,%fpcr
    173	fmovel		%d0,%fp0
    174	bra		t_frcinx
    175
    176continue:
    177	movel		%d1,-(%sp)
    178	clrl		%d1
    179	bsr		slogn			| ...log(X), X normal.
    180	fmovel		(%sp)+,%fpcr
    181	fmulx		INV_L2,%fp0
    182	bra		t_frcinx
    183
    184invalid:
    185	bra		t_operr
    186
    187	|end