longlong2str-x86.s
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:3k
- /* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
- # Optimized longlong2str function for Intel 80x86 (gcc/gas syntax)
- # Some set sequences are optimized for pentuimpro II
- .file "longlong2str.s"
- .version "1.01"
- .text
- .align 4
- .globl longlong2str
- .type longlong2str,@function
-
- longlong2str:
- subl $80,%esp
- pushl %ebp
- pushl %esi
- pushl %edi
- pushl %ebx
- movl 100(%esp),%esi # Lower part of val
- movl 104(%esp),%ebp # Higher part of val
- movl 108(%esp),%edi # get dst
- movl 112(%esp),%ebx # Radix
- movl %ebx,%eax
- testl %eax,%eax
- jge .L144
- addl $36,%eax
- cmpl $34,%eax
- ja .Lerror # Wrong radix
- testl %ebp,%ebp
- jge .L146
- movb $45,(%edi) # Add sign
- incl %edi # Change sign of val
- negl %esi
- adcl $0,%ebp
- negl %ebp
- .L146:
- negl %ebx # Change radix to positive
- jmp .L148
- .align 4
- .L144:
- addl $-2,%eax
- cmpl $34,%eax
- ja .Lerror # Radix in range
- .L148:
- movl %esi,%eax # Test if zero (for easy loop)
- orl %ebp,%eax
- jne .L150
- movb $48,(%edi)
- incl %edi
- jmp .L164
- .align 4
- .L150:
- leal 92(%esp),%ecx # End of buffer
- jmp .L155
- .align 4
- .L153:
- # val is stored in in ebp:esi
- movl %ebp,%eax # High part of value
- xorl %edx,%edx
- divl %ebx
- movl %eax,%ebp
- movl %esi,%eax
- divl %ebx
- movl %eax,%esi # quotent in ebp:esi
- movb _dig_vec(%edx),%al # al is faster than dl
- decl %ecx
- movb %al,(%ecx) # store value in buff
- .align 4
- .L155:
- testl %ebp,%ebp
- ja .L153
- testl %esi,%esi # rest value
- jl .L153
- je .L160 # Ready
- movl %esi,%eax
- movl $_dig_vec,%ebp
- .align 4
- .L154: # Do rest with integer precision
- cltd
- divl %ebx
- decl %ecx
- movb (%edx,%ebp),%dl # bh is always zero as ebx=radix < 36
- testl %eax,%eax
- movb %dl,(%ecx)
- jne .L154
- .L160:
- movl %ecx,%esi
- leal 92(%esp),%ecx # End of buffer
- subl %esi,%ecx
- rep
- movsb
- .L164:
- movl %edi,%eax # Pointer to end null
- movb $0,(%edi) # Store the end null
- .L165:
- popl %ebx
- popl %edi
- popl %esi
- popl %ebp
- addl $80,%esp
- ret
- .Lerror:
- xorl %eax,%eax # Wrong radix
- jmp .L165
- .Lfe3:
- .size longlong2str,.Lfe3-longlong2str
- .globl longlong10_to_str
- .type longlong10_str,@function
- longlong10_to_str:
- jmp longlong2str
- .L10end:
- .size longlong10_to_str,.L10end-longlong10_to_str