/* Copyright (C) 2011 DJ Delorie, see COPYING.DJ for details */
/* Copyright (C) 1999 DJ Delorie, see COPYING.DJ for details */
	.text
	.globl	_powi
_powi:
	/* double powi(double x, int iy) = x^iy */

	fldl	4(%esp)			/* x2p = x; */
	movl	12(%esp), %eax

	testl	%eax, %eax		/* if (iy < 0) { */
	jge	Endif1
	negl	%eax			/*	  iy = -iy; */
	fld1				/*	  x = 1./x; */
	/* Should be fdivrp %st, %st(1) (gas bug) */
	.byte	0xDE, 0xF1
Endif1:					/* } */

	fld1				/* result = 1.; */
	fxch	%st(1)

	jmp	Test
	.balign	16,,7
Loop:
	testb	$1, %al			/*	  if (iy & 1) result *= x2p; */
	je	Endif2
	fmul	%st, %st(1)
Endif2:
	shrl	$1, %eax		/*	  (unsigned) iy >>= 1; */
	fmul	%st(0), %st		/*	  x2p *= x2p; */
Test:
	testl	%eax, %eax		/* } */
	jne	Loop
	fstp	%st(0)
	ret				/* return result; */

#include <libc/asmdefs.h>
