divdi3.S
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:6k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /* Copyright (C) 1989, 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
  2. This file is part of GNU CC.
  3. GNU CC 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, or (at your option)
  6. any later version.
  7. GNU CC is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  10. GNU General Public License for more details.
  11. You should have received a copy of the GNU General Public License
  12. along with GNU CC; see the file COPYING.  If not, write to
  13. the Free Software Foundation, 59 Temple Place - Suite 330,
  14. Boston, MA 02111-1307, USA.  */
  15. .data
  16. .align 8
  17. .globl __clz_tab
  18. __clz_tab:
  19. .byte 0,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5
  20. .byte 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6
  21. .byte 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7
  22. .byte 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7
  23. .byte 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8
  24. .byte 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8
  25. .byte 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8
  26. .byte 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8
  27. .size  __clz_tab,256
  28. .global .udiv
  29. .text
  30. .align 4
  31. .globl __divdi3
  32. __divdi3:
  33. save %sp,-104,%sp
  34. cmp %i0,0
  35. bge .LL40
  36. mov 0,%l4
  37. mov -1,%l4
  38. sub %g0,%i1,%o0
  39. mov %o0,%o5
  40. subcc %g0,%o0,%g0
  41. sub %g0,%i0,%o0
  42. subx %o0,0,%o4
  43. mov %o4,%i0
  44. mov %o5,%i1
  45. .LL40:
  46. cmp %i2,0
  47. bge .LL84
  48. mov %i3,%o4
  49. xnor %g0,%l4,%l4
  50. sub %g0,%i3,%o0
  51. mov %o0,%o3
  52. subcc %g0,%o0,%g0
  53. sub %g0,%i2,%o0
  54. subx %o0,0,%o2
  55. mov %o2,%i2
  56. mov %o3,%i3
  57. mov %i3,%o4
  58. .LL84:
  59. cmp %i2,0
  60. bne .LL45
  61. mov %i1,%i3
  62. cmp %o4,%i0
  63. bleu .LL46
  64. mov %i3,%o1
  65. mov 32,%g1
  66. subcc %i0,%o4,%g0
  67. 1: bcs 5f
  68.  addxcc %o1,%o1,%o1 ! shift n1n0 and a q-bit in lsb
  69. sub %i0,%o4,%i0 ! this kills msb of n
  70. addx %i0,%i0,%i0 ! so this cannot give carry
  71. subcc %g1,1,%g1
  72. 2: bne 1b
  73.  subcc %i0,%o4,%g0
  74. bcs 3f
  75.  addxcc %o1,%o1,%o1 ! shift n1n0 and a q-bit in lsb
  76. b 3f
  77.  sub %i0,%o4,%i0 ! this kills msb of n
  78. 4: sub %i0,%o4,%i0
  79. 5: addxcc %i0,%i0,%i0
  80. bcc 2b
  81.  subcc %g1,1,%g1
  82. ! Got carry from n.  Subtract next step to cancel this carry.
  83. bne 4b
  84.  addcc %o1,%o1,%o1 ! shift n1n0 and a 0-bit in lsb
  85. sub %i0,%o4,%i0
  86. 3: xnor %o1,0,%o1
  87. b .LL50
  88. mov 0,%o2
  89. .LL46:
  90. cmp %o4,0
  91. bne .LL85
  92. mov %i0,%o2
  93. mov 1,%o0
  94. call .udiv,0
  95. mov 0,%o1
  96. mov %o0,%o4
  97. mov %i0,%o2
  98. .LL85:
  99. mov 0,%g3
  100. mov 32,%g1
  101. subcc %g3,%o4,%g0
  102. 1: bcs 5f
  103.  addxcc %o2,%o2,%o2 ! shift n1n0 and a q-bit in lsb
  104. sub %g3,%o4,%g3 ! this kills msb of n
  105. addx %g3,%g3,%g3 ! so this cannot give carry
  106. subcc %g1,1,%g1
  107. 2: bne 1b
  108.  subcc %g3,%o4,%g0
  109. bcs 3f
  110.  addxcc %o2,%o2,%o2 ! shift n1n0 and a q-bit in lsb
  111. b 3f
  112.  sub %g3,%o4,%g3 ! this kills msb of n
  113. 4: sub %g3,%o4,%g3
  114. 5: addxcc %g3,%g3,%g3
  115. bcc 2b
  116.  subcc %g1,1,%g1
  117. ! Got carry from n.  Subtract next step to cancel this carry.
  118. bne 4b
  119.  addcc %o2,%o2,%o2 ! shift n1n0 and a 0-bit in lsb
  120. sub %g3,%o4,%g3
  121. 3: xnor %o2,0,%o2
  122. mov %g3,%i0
  123. mov %i3,%o1
  124. mov 32,%g1
  125. subcc %i0,%o4,%g0
  126. 1: bcs 5f
  127.  addxcc %o1,%o1,%o1 ! shift n1n0 and a q-bit in lsb
  128. sub %i0,%o4,%i0 ! this kills msb of n
  129. addx %i0,%i0,%i0 ! so this cannot give carry
  130. subcc %g1,1,%g1
  131. 2: bne 1b
  132.  subcc %i0,%o4,%g0
  133. bcs 3f
  134.  addxcc %o1,%o1,%o1 ! shift n1n0 and a q-bit in lsb
  135. b 3f
  136.  sub %i0,%o4,%i0 ! this kills msb of n
  137. 4: sub %i0,%o4,%i0
  138. 5: addxcc %i0,%i0,%i0
  139. bcc 2b
  140.  subcc %g1,1,%g1
  141. ! Got carry from n.  Subtract next step to cancel this carry.
  142. bne 4b
  143.  addcc %o1,%o1,%o1 ! shift n1n0 and a 0-bit in lsb
  144. sub %i0,%o4,%i0
  145. 3: xnor %o1,0,%o1
  146. b .LL86
  147. mov %o1,%l1
  148. .LL45:
  149. cmp %i2,%i0
  150. bleu .LL51
  151. sethi %hi(65535),%o0
  152. b .LL78
  153. mov 0,%o1
  154. .LL51:
  155. or %o0,%lo(65535),%o0
  156. cmp %i2,%o0
  157. bgu .LL58
  158. mov %i2,%o1
  159. cmp %i2,256
  160. addx %g0,-1,%o0
  161. b .LL64
  162. and %o0,8,%o2
  163. .LL58:
  164. sethi %hi(16777215),%o0
  165. or %o0,%lo(16777215),%o0
  166. cmp %i2,%o0
  167. bgu .LL64
  168. mov 24,%o2
  169. mov 16,%o2
  170. .LL64:
  171. srl %o1,%o2,%o0
  172. sethi %hi(__clz_tab),%o1
  173. or %o1,%lo(__clz_tab),%o1
  174. ldub [%o0+%o1],%o0
  175. add %o0,%o2,%o0
  176. mov 32,%o1
  177. subcc %o1,%o0,%o3
  178. bne,a .LL72
  179. sub %o1,%o3,%o1
  180. cmp %i0,%i2
  181. bgu .LL74
  182. cmp %i3,%o4
  183. blu .LL78
  184. mov 0,%o1
  185. .LL74:
  186. b .LL78
  187. mov 1,%o1
  188. .LL72:
  189. sll %i2,%o3,%o2
  190. srl %o4,%o1,%o0
  191. or %o2,%o0,%i2
  192. sll %o4,%o3,%o4
  193. srl %i0,%o1,%o2
  194. sll %i0,%o3,%o0
  195. srl %i3,%o1,%o1
  196. or %o0,%o1,%i0
  197. sll %i3,%o3,%i3
  198. mov %i0,%o1
  199. mov 32,%g1
  200. subcc %o2,%i2,%g0
  201. 1: bcs 5f
  202.  addxcc %o1,%o1,%o1 ! shift n1n0 and a q-bit in lsb
  203. sub %o2,%i2,%o2 ! this kills msb of n
  204. addx %o2,%o2,%o2 ! so this cannot give carry
  205. subcc %g1,1,%g1
  206. 2: bne 1b
  207.  subcc %o2,%i2,%g0
  208. bcs 3f
  209.  addxcc %o1,%o1,%o1 ! shift n1n0 and a q-bit in lsb
  210. b 3f
  211.  sub %o2,%i2,%o2 ! this kills msb of n
  212. 4: sub %o2,%i2,%o2
  213. 5: addxcc %o2,%o2,%o2
  214. bcc 2b
  215.  subcc %g1,1,%g1
  216. ! Got carry from n.  Subtract next step to cancel this carry.
  217. bne 4b
  218.  addcc %o1,%o1,%o1 ! shift n1n0 and a 0-bit in lsb
  219. sub %o2,%i2,%o2
  220. 3: xnor %o1,0,%o1
  221. mov %o2,%i0
  222. wr %g0,%o1,%y ! SPARC has 0-3 delay insn after a wr
  223. sra %o4,31,%g2 ! Do not move this insn
  224. and %o1,%g2,%g2 ! Do not move this insn
  225. andcc %g0,0,%g1 ! Do not move this insn
  226. mulscc %g1,%o4,%g1
  227. mulscc %g1,%o4,%g1
  228. mulscc %g1,%o4,%g1
  229. mulscc %g1,%o4,%g1
  230. mulscc %g1,%o4,%g1
  231. mulscc %g1,%o4,%g1
  232. mulscc %g1,%o4,%g1
  233. mulscc %g1,%o4,%g1
  234. mulscc %g1,%o4,%g1
  235. mulscc %g1,%o4,%g1
  236. mulscc %g1,%o4,%g1
  237. mulscc %g1,%o4,%g1
  238. mulscc %g1,%o4,%g1
  239. mulscc %g1,%o4,%g1
  240. mulscc %g1,%o4,%g1
  241. mulscc %g1,%o4,%g1
  242. mulscc %g1,%o4,%g1
  243. mulscc %g1,%o4,%g1
  244. mulscc %g1,%o4,%g1
  245. mulscc %g1,%o4,%g1
  246. mulscc %g1,%o4,%g1
  247. mulscc %g1,%o4,%g1
  248. mulscc %g1,%o4,%g1
  249. mulscc %g1,%o4,%g1
  250. mulscc %g1,%o4,%g1
  251. mulscc %g1,%o4,%g1
  252. mulscc %g1,%o4,%g1
  253. mulscc %g1,%o4,%g1
  254. mulscc %g1,%o4,%g1
  255. mulscc %g1,%o4,%g1
  256. mulscc %g1,%o4,%g1
  257. mulscc %g1,%o4,%g1
  258. mulscc %g1,0,%g1
  259. add %g1,%g2,%o0
  260. rd %y,%o2
  261. cmp %o0,%i0
  262. bgu,a .LL78
  263. add %o1,-1,%o1
  264. bne,a .LL50
  265. mov 0,%o2
  266. cmp %o2,%i3
  267. bleu .LL50
  268. mov 0,%o2
  269. add %o1,-1,%o1
  270. .LL78:
  271. mov 0,%o2
  272. .LL50:
  273. mov %o1,%l1
  274. .LL86:
  275. mov %o2,%l0
  276. mov %l0,%i0
  277. mov %l1,%i1
  278. cmp %l4,0
  279. be .LL81
  280. sub %g0,%i1,%o0
  281. mov %o0,%l3
  282. subcc %g0,%o0,%g0
  283. sub %g0,%i0,%o0
  284. subx %o0,0,%l2
  285. mov %l2,%i0
  286. mov %l3,%i1
  287. .LL81:
  288. ret
  289. restore