longlong2str-x86.s
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:3k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
  2.    
  3.    This program is free software; you can redistribute it and/or modify
  4.    it under the terms of the GNU General Public License as published by
  5.    the Free Software Foundation; either version 2 of the License, or
  6.    (at your option) any later version.
  7.    
  8.    This program is distributed in the hope that it will be useful,
  9.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  11.    GNU General Public License for more details.
  12.    
  13.    You should have received a copy of the GNU General Public License
  14.    along with this program; if not, write to the Free Software
  15.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  16. # Optimized longlong2str function for Intel 80x86  (gcc/gas syntax) 
  17. # Some set sequences are optimized for pentuimpro II 
  18. .file "longlong2str.s"
  19. .version "1.01"
  20. .text
  21. .align 4
  22. .globl longlong2str
  23. .type  longlong2str,@function
  24. longlong2str:
  25. subl $80,%esp
  26. pushl %ebp
  27. pushl %esi
  28. pushl %edi
  29. pushl %ebx
  30. movl 100(%esp),%esi # Lower part of val 
  31. movl 104(%esp),%ebp # Higher part of val 
  32. movl 108(%esp),%edi # get dst 
  33. movl 112(%esp),%ebx # Radix 
  34. movl %ebx,%eax
  35. testl %eax,%eax
  36. jge .L144
  37. addl $36,%eax
  38. cmpl $34,%eax
  39. ja .Lerror # Wrong radix 
  40. testl %ebp,%ebp
  41. jge .L146
  42. movb $45,(%edi) # Add sign 
  43. incl %edi # Change sign of val 
  44. negl %esi
  45. adcl $0,%ebp
  46. negl %ebp
  47. .L146:
  48. negl %ebx # Change radix to positive 
  49. jmp .L148
  50. .align 4
  51. .L144:
  52. addl $-2,%eax
  53. cmpl $34,%eax
  54. ja .Lerror # Radix in range 
  55. .L148:
  56. movl %esi,%eax # Test if zero (for easy loop) 
  57. orl %ebp,%eax
  58. jne .L150
  59. movb $48,(%edi)
  60. incl %edi
  61. jmp .L164
  62. .align 4
  63. .L150:
  64. leal 92(%esp),%ecx # End of buffer 
  65. jmp  .L155
  66. .align 4
  67. .L153:
  68. # val is stored in in ebp:esi 
  69. movl %ebp,%eax # High part of value 
  70. xorl %edx,%edx
  71. divl %ebx
  72. movl %eax,%ebp
  73. movl %esi,%eax
  74. divl %ebx
  75. movl %eax,%esi # quotent in ebp:esi 
  76. movb _dig_vec(%edx),%al   # al is faster than dl 
  77. decl %ecx
  78. movb %al,(%ecx) # store value in buff 
  79. .align 4
  80. .L155:
  81. testl %ebp,%ebp
  82. ja .L153
  83. testl %esi,%esi # rest value 
  84. jl .L153
  85. je .L160 # Ready 
  86. movl %esi,%eax
  87. movl $_dig_vec,%ebp
  88. .align 4
  89. .L154: # Do rest with integer precision 
  90. cltd
  91. divl %ebx
  92. decl %ecx
  93. movb (%edx,%ebp),%dl # bh is always zero as ebx=radix < 36 
  94. testl %eax,%eax
  95. movb %dl,(%ecx)
  96. jne .L154
  97. .L160:
  98. movl %ecx,%esi
  99. leal 92(%esp),%ecx # End of buffer 
  100. subl %esi,%ecx
  101. rep
  102. movsb
  103. .L164:
  104. movl %edi,%eax # Pointer to end null 
  105. movb $0,(%edi) # Store the end null 
  106. .L165:
  107. popl %ebx
  108. popl %edi
  109. popl %esi
  110. popl %ebp
  111. addl $80,%esp
  112. ret
  113. .Lerror:
  114. xorl %eax,%eax # Wrong radix 
  115. jmp .L165
  116. .Lfe3:
  117. .size  longlong2str,.Lfe3-longlong2str
  118. .globl longlong10_to_str
  119. .type  longlong10_str,@function
  120. longlong10_to_str:
  121. jmp longlong2str
  122. .L10end:
  123. .size  longlong10_to_str,.L10end-longlong10_to_str