Subversion Repositories Kolibri OS

Rev

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

  1. /* ix87 specific frexp implementation for double.
  2.    Copyright (C) 1997, 2000, 2005 Free Software Foundation, Inc.
  3.    This file is part of the GNU C Library.
  4.    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
  5.  
  6.    The GNU C Library is free software; you can redistribute it and/or
  7.    modify it under the terms of the GNU Lesser General Public
  8.    License as published by the Free Software Foundation; either
  9.    version 2.1 of the License, or (at your option) any later version.
  10.  
  11.    The GNU C Library is distributed in the hope that it will be useful,
  12.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  14.    Lesser General Public License for more details.
  15.  
  16.    You should have received a copy of the GNU Lesser General Public
  17.    License along with the GNU C Library; if not, write to the Free
  18.    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
  19.    02111-1307 USA.  */
  20.  
  21.  
  22.   .file "frexp.s"
  23.         .text
  24.  
  25. .align 4
  26. two54:  .byte 0, 0, 0, 0, 0, 0, 0x50, 0x43
  27.  
  28.         .p2align 4,,15
  29.  
  30. .globl _frexp
  31. .def   _frexp;  .scl  2;  .type 32; .endef
  32.  
  33. _frexp:
  34.  
  35.       movl  4(%esp), %ecx
  36.       movl  8(%esp), %eax
  37.       movl  %eax, %edx
  38.       andl  $0x7fffffff, %eax
  39.       orl %eax, %ecx
  40.       jz  1f
  41.  
  42.       xorl  %ecx, %ecx
  43.       cmpl  $0x7ff00000, %eax
  44.       jae 1f
  45.  
  46.       cmpl  $0x00100000, %eax
  47.       jae 2f
  48.  
  49.       fld  4(%esp)
  50.  
  51.       fmull two54
  52.       movl  $-54, %ecx
  53.       fstpl 4(%esp)
  54.       fwait
  55.       movl  8(%esp), %eax
  56.       movl  %eax, %edx
  57.       andl  $0x7fffffff, %eax
  58.  
  59. 2:
  60.       shrl  $20, %eax
  61.       andl  $0x800fffff, %edx
  62.       subl  $1022, %eax
  63.       orl $0x3fe00000, %edx
  64.       addl  %eax, %ecx
  65.       movl  %edx, 8(%esp)
  66.  
  67.         /* Store %ecx in the variable pointed to by the second argument,
  68.            get the factor from the stack and return.  */
  69. 1:
  70.       movl  12(%esp), %eax
  71.       fldl  4(%esp)
  72.       movl  %ecx, (%eax)
  73.  
  74.       ret
  75.