Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   1) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   2) |	sacos.sa 3.3 12/19/90
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   3) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   4) |	Description: The entry point sAcos computes the inverse cosine of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   5) |		an input argument; sAcosd does the same except for denormalized
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   6) |		input.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   7) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   8) |	Input: Double-extended number X in location pointed to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   9) |		by address register a0.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  10) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  11) |	Output: The value arccos(X) returned in floating-point register Fp0.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  12) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  13) |	Accuracy and Monotonicity: The returned result is within 3 ulps in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  14) |		64 significant bit, i.e. within 0.5001 ulp to 53 bits if the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  15) |		result is subsequently rounded to double precision. The
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  16) |		result is provably monotonic in double precision.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  17) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  18) |	Speed: The program sCOS takes approximately 310 cycles.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  19) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  20) |	Algorithm:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  21) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  22) |	ACOS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  23) |	1. If |X| >= 1, go to 3.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  24) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  25) |	2. (|X| < 1) Calculate acos(X) by
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  26) |		z := (1-X) / (1+X)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  27) |		acos(X) = 2 * atan( sqrt(z) ).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  28) |		Exit.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  29) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  30) |	3. If |X| > 1, go to 5.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  31) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  32) |	4. (|X| = 1) If X > 0, return 0. Otherwise, return Pi. Exit.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  33) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  34) |	5. (|X| > 1) Generate an invalid operation by 0 * infinity.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  35) |		Exit.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  36) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  37) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  38) |		Copyright (C) Motorola, Inc. 1990
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  39) |			All Rights Reserved
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  40) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  41) |       For details on the license for this file, please see the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  42) |       file, README, in this same directory.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  43) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  44) |SACOS	idnt	2,1 | Motorola 040 Floating Point Software Package
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  45) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  46) 	|section	8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  47) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  48) PI:	.long 0x40000000,0xC90FDAA2,0x2168C235,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  49) PIBY2:	.long 0x3FFF0000,0xC90FDAA2,0x2168C235,0x00000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  50) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  51) 	|xref	t_operr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  52) 	|xref	t_frcinx
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  53) 	|xref	satan
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  54) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  55) 	.global	sacosd
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  56) sacosd:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  57) |--ACOS(X) = PI/2 FOR DENORMALIZED X
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  58) 	fmovel		%d1,%fpcr		| ...load user's rounding mode/precision
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  59) 	fmovex		PIBY2,%fp0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  60) 	bra		t_frcinx
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  61) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  62) 	.global	sacos
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  63) sacos:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  64) 	fmovex		(%a0),%fp0	| ...LOAD INPUT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  65) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  66) 	movel		(%a0),%d0		| ...pack exponent with upper 16 fraction
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  67) 	movew		4(%a0),%d0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  68) 	andil		#0x7FFFFFFF,%d0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  69) 	cmpil		#0x3FFF8000,%d0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  70) 	bges		ACOSBIG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  71) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  72) |--THIS IS THE USUAL CASE, |X| < 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  73) |--ACOS(X) = 2 * ATAN(	SQRT( (1-X)/(1+X) )	)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  74) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  75) 	fmoves		#0x3F800000,%fp1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  76) 	faddx		%fp0,%fp1		| ...1+X
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  77) 	fnegx		%fp0		| ... -X
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  78) 	fadds		#0x3F800000,%fp0	| ...1-X
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  79) 	fdivx		%fp1,%fp0		| ...(1-X)/(1+X)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  80) 	fsqrtx		%fp0		| ...SQRT((1-X)/(1+X))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  81) 	fmovemx	%fp0-%fp0,(%a0)	| ...overwrite input
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  82) 	movel		%d1,-(%sp)	|save original users fpcr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  83) 	clrl		%d1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  84) 	bsr		satan		| ...ATAN(SQRT([1-X]/[1+X]))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  85) 	fmovel		(%sp)+,%fpcr	|restore users exceptions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  86) 	faddx		%fp0,%fp0		| ...2 * ATAN( STUFF )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  87) 	bra		t_frcinx
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  88) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  89) ACOSBIG:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  90) 	fabsx		%fp0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  91) 	fcmps		#0x3F800000,%fp0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  92) 	fbgt		t_operr		|cause an operr exception
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  93) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  94) |--|X| = 1, ACOS(X) = 0 OR PI
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  95) 	movel		(%a0),%d0		| ...pack exponent with upper 16 fraction
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  96) 	movew		4(%a0),%d0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  97) 	cmpl		#0,%d0		|D0 has original exponent+fraction
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  98) 	bgts		ACOSP1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  99) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) |--X = -1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) |Returns PI and inexact exception
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) 	fmovex		PI,%fp0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) 	fmovel		%d1,%FPCR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) 	fadds		#0x00800000,%fp0	|cause an inexact exception to be put
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) |					;into the 040 - will not trap until next
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) |					;fp inst.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) 	bra		t_frcinx
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) ACOSP1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) 	fmovel		%d1,%FPCR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) 	fmoves		#0x00000000,%fp0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) 	rts				|Facos ; of +1 is exact
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) 	|end