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

sgetem.S (3666B)


      1|
      2|	sgetem.sa 3.1 12/10/90
      3|
      4|	The entry point sGETEXP returns the exponent portion
      5|	of the input argument.  The exponent bias is removed
      6|	and the exponent value is returned as an extended
      7|	precision number in fp0.  sGETEXPD handles denormalized
      8|	numbers.
      9|
     10|	The entry point sGETMAN extracts the mantissa of the
     11|	input argument.  The mantissa is converted to an
     12|	extended precision number and returned in fp0.  The
     13|	range of the result is [1.0 - 2.0).
     14|
     15|
     16|	Input:  Double-extended number X in the ETEMP space in
     17|		the floating-point save stack.
     18|
     19|	Output:	The functions return exp(X) or man(X) in fp0.
     20|
     21|	Modified: fp0.
     22|
     23|
     24|		Copyright (C) Motorola, Inc. 1990
     25|			All Rights Reserved
     26|
     27|       For details on the license for this file, please see the
     28|       file, README, in this same directory.
     29
     30|SGETEM	idnt	2,1 | Motorola 040 Floating Point Software Package
     31
     32	|section 8
     33
     34#include "fpsp.h"
     35
     36	|xref	nrm_set
     37
     38|
     39| This entry point is used by the unimplemented instruction exception
     40| handler.  It points a0 to the input operand.
     41|
     42|
     43|
     44|	SGETEXP
     45|
     46
     47	.global	sgetexp
     48sgetexp:
     49	movew	LOCAL_EX(%a0),%d0	|get the exponent
     50	bclrl	#15,%d0		|clear the sign bit
     51	subw	#0x3fff,%d0	|subtract off the bias
     52	fmovew  %d0,%fp0		|move the exp to fp0
     53	rts
     54
     55	.global	sgetexpd
     56sgetexpd:
     57	bclrb	#sign_bit,LOCAL_EX(%a0)
     58	bsr	nrm_set		|normalize (exp will go negative)
     59	movew	LOCAL_EX(%a0),%d0	|load resulting exponent into d0
     60	subw	#0x3fff,%d0	|subtract off the bias
     61	fmovew	%d0,%fp0		|move the exp to fp0
     62	rts
     63|
     64|
     65| This entry point is used by the unimplemented instruction exception
     66| handler.  It points a0 to the input operand.
     67|
     68|
     69|
     70|	SGETMAN
     71|
     72|
     73| For normalized numbers, leave the mantissa alone, simply load
     74| with an exponent of +/- $3fff.
     75|
     76	.global	sgetman
     77sgetman:
     78	movel	USER_FPCR(%a6),%d0
     79	andil	#0xffffff00,%d0	|clear rounding precision and mode
     80	fmovel	%d0,%fpcr		|this fpcr setting is used by the 882
     81	movew	LOCAL_EX(%a0),%d0	|get the exp (really just want sign bit)
     82	orw	#0x7fff,%d0	|clear old exp
     83	bclrl	#14,%d0		|make it the new exp +-3fff
     84	movew	%d0,LOCAL_EX(%a0)	|move the sign & exp back to fsave stack
     85	fmovex	(%a0),%fp0	|put new value back in fp0
     86	rts
     87
     88|
     89| For denormalized numbers, shift the mantissa until the j-bit = 1,
     90| then load the exponent with +/1 $3fff.
     91|
     92	.global	sgetmand
     93sgetmand:
     94	movel	LOCAL_HI(%a0),%d0	|load ms mant in d0
     95	movel	LOCAL_LO(%a0),%d1	|load ls mant in d1
     96	bsr	shft		|shift mantissa bits till msbit is set
     97	movel	%d0,LOCAL_HI(%a0)	|put ms mant back on stack
     98	movel	%d1,LOCAL_LO(%a0)	|put ls mant back on stack
     99	bras	sgetman
    100
    101|
    102|	SHFT
    103|
    104|	Shifts the mantissa bits until msbit is set.
    105|	input:
    106|		ms mantissa part in d0
    107|		ls mantissa part in d1
    108|	output:
    109|		shifted bits in d0 and d1
    110shft:
    111	tstl	%d0		|if any bits set in ms mant
    112	bnes	upper		|then branch
    113|				;else no bits set in ms mant
    114	tstl	%d1		|test if any bits set in ls mant
    115	bnes	cont		|if set then continue
    116	bras	shft_end	|else return
    117cont:
    118	movel	%d3,-(%a7)	|save d3
    119	exg	%d0,%d1		|shift ls mant to ms mant
    120	bfffo	%d0{#0:#32},%d3	|find first 1 in ls mant to d0
    121	lsll	%d3,%d0		|shift first 1 to integer bit in ms mant
    122	movel	(%a7)+,%d3	|restore d3
    123	bras	shft_end
    124upper:
    125
    126	moveml	%d3/%d5/%d6,-(%a7)	|save registers
    127	bfffo	%d0{#0:#32},%d3	|find first 1 in ls mant to d0
    128	lsll	%d3,%d0		|shift ms mant until j-bit is set
    129	movel	%d1,%d6		|save ls mant in d6
    130	lsll	%d3,%d1		|shift ls mant by count
    131	movel	#32,%d5
    132	subl	%d3,%d5		|sub 32 from shift for ls mant
    133	lsrl	%d5,%d6		|shift off all bits but those that will
    134|				;be shifted into ms mant
    135	orl	%d6,%d0		|shift the ls mant bits into the ms mant
    136	moveml	(%a7)+,%d3/%d5/%d6	|restore registers
    137shft_end:
    138	rts
    139
    140	|end