xref: /csrg-svn/usr.bin/f77/libF77/pow_hh.c (revision 23778)
110513Sdlw /*
222936Skre  * Copyright (c) 1980 Regents of the University of California.
322936Skre  * All rights reserved.  The Berkeley software License Agreement
422936Skre  * specifies the terms and conditions for redistribution.
522936Skre  *
6*23778Sjerry  *	@(#)pow_hh.c	5.2	06/26/85
710513Sdlw  */
810513Sdlw 
910513Sdlw short pow_hh(ap, bp)
1010513Sdlw short *ap, *bp;
1110513Sdlw {
12*23778Sjerry 	short int pow, x, n;
1310513Sdlw 
14*23778Sjerry 	pow = 1;
15*23778Sjerry 	x = *ap;
16*23778Sjerry 	n = *bp;
1710513Sdlw 
18*23778Sjerry 	if (n == 0)
19*23778Sjerry 		return ( 1L );
20*23778Sjerry 
21*23778Sjerry 	if (x == 0)
22*23778Sjerry 	{
23*23778Sjerry 		if( n > 0 )
24*23778Sjerry 			return ( 0L );
25*23778Sjerry 		else
26*23778Sjerry 			return ( 1/x );
27*23778Sjerry 	}
28*23778Sjerry 
29*23778Sjerry 	if (x == 1)
30*23778Sjerry 		return ( 1L );
31*23778Sjerry 
32*23778Sjerry 	if (x == -1)
33*23778Sjerry 	{
34*23778Sjerry 		if (n < 0)
3510513Sdlw 		{
36*23778Sjerry 			if (n < -2)
37*23778Sjerry 				n += 2;
38*23778Sjerry 			n = -n;
39*23778Sjerry 		}
40*23778Sjerry 		if (n % 2 == 0)
41*23778Sjerry 			return ( 1L );
4210513Sdlw 		else
43*23778Sjerry 			return ( -1L );
44*23778Sjerry 	}
45*23778Sjerry 
46*23778Sjerry 	if (n > 0)
47*23778Sjerry 		for( ; ; )
48*23778Sjerry 		{
49*23778Sjerry 			if(n & 01)
50*23778Sjerry 				pow *= x;
51*23778Sjerry 			if(n >>= 1)
52*23778Sjerry 				x *= x;
53*23778Sjerry 			else
54*23778Sjerry 				break;
5510513Sdlw 		}
56*23778Sjerry 	else
57*23778Sjerry 		pow = 0;
58*23778Sjerry 
59*23778Sjerry 	return(pow);
6010513Sdlw }
61