Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. /* Copyright (C) 1999 DJ Delorie, see COPYING.DJ for details */
  2. #include<libc/asm.h>
  3.         .text
  4. MK_C_SYM(powi)
  5.         /* double powi(double x, int iy) = x^iy */
  6.  
  7.         fldl    4(%esp)                 /* x2p = x; */
  8.         movl    12(%esp), %eax
  9.  
  10.         testl   %eax, %eax              /* if (iy < 0) { */
  11.         jge     Endif1
  12.         negl    %eax                    /*        iy = -iy; */
  13.         fld1                            /*        x = 1./x; */
  14.         /* Should be fdivrp %st, %st(1) (gas bug) */
  15.         .byte   0xDE, 0xF1
  16. Endif1:                                 /* } */
  17.  
  18.         fld1                            /* result = 1.; */
  19.         fxch    %st(1)
  20.  
  21.         jmp     Test
  22.         .balign 16,,7
  23. Loop:
  24.         testb   $1, %al                 /*        if (iy & 1) result *= x2p; */
  25.         je      Endif2
  26.         fmul    %st, %st(1)
  27. Endif2:
  28.         shrl    $1, %eax                /*        (unsigned) iy >>= 1; */
  29.         fmul    %st(0), %st             /*        x2p *= x2p; */
  30. Test:
  31.         testl   %eax, %eax              /* } */
  32.         jne     Loop
  33.         fstp    %st(0)
  34.         ret                             /* return result; */
  35.