dp32.s
上传用户:nvosite88
上传日期:2007-01-17
资源大小:4983k
文件大小:24k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* dp32.s - VxWorks conversion from Microtek tools to Sun native */
  2. /* Copyright 1984-1992 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01a,05aug92,jwt  converted.
  7. */
  8. /*
  9. ! ! ! ! !
  10. ! SPARClite Floating Point Library
  11. !
  12. ! Copyright (C) 1992 By
  13. ! United States Software Corporation
  14. ! 14215 N.W. Science Park Drive
  15. ! Portland, Oregon 97229
  16. !
  17. ! This software is furnished under a license and may be used
  18. ! and copied only in accordance with the terms of such license
  19. ! and with the inclusion of the above copyright notice.
  20. ! This software or any other copies thereof may not be provided
  21. ! or otherwise made available to any other person.  No title to
  22. ! and ownership of the software is hereby transferred.
  23. !
  24. ! The information in this software is subject to change without 
  25. ! notice and should not be construed as a commitment by United
  26. ! States Software Corporation.
  27. !
  28. ! First Release: V1.02 March 26 1992
  29. ! ! ! ! !
  30. .macro scan,p1,p2,p3
  31. .word 0x81602000 | (&p3<<25) | (&p1<<14) | p2
  32. .endm
  33. .macro umul,p1,p2,p3
  34. .word 0x80500000 | (&p3<<25) | (&p1<<14) | &p2
  35. .endm
  36. .macro divscc,p1,p2,p3
  37. .word 0x80e80000 | (&p3<<25) | (&p1<<14) | &p2
  38. .endm
  39. */
  40. #include "arch/sparc/ussSun4.h"
  41. .text
  42. .align 4
  43. .global _dpsub
  44. _dpsub:
  45. .global __dsub
  46. __dsub:
  47. sethi   %hi(0x80000000),%g1
  48. xor     %o2,%g1,%o2
  49. .global _dpadd
  50. _dpadd:
  51. .global __dadd
  52. __dadd:
  53. save %sp,-96,%sp
  54. sll     %i0,1,%l4
  55. srl     %l4,21,%l4
  56. sll     %i0,11,%l2
  57. srl     %i1,21,%g1
  58. or      %l2,%g1,%l2
  59. sll     %i1,11,%l3
  60. sethi   %hi(0x80000000),%l1
  61. or      %l2,%l1,%l2
  62. sll     %i2,1,%l7
  63. srl     %l7,21,%l7
  64. sll     %i2,11,%l5
  65. srl     %i3,21,%g1
  66. or      %l5,%g1,%l5
  67. sll     %i3,11,%l6
  68. or      %l5,%l1,%l5
  69. and     %l1,%i0,%l1
  70. sub     %l4,1,%g1
  71. subcc   %g1,0x7fe,%g0
  72. bcc     BspecA         
  73. Blab1: sub     %l7,1,%g1
  74. subcc   %g1,0x7fe,%g0
  75. bcc     BspecB   
  76. NOP
  77. Blab2: subcc   %l4,%l7,%i4
  78. be      Badd3          
  79. subcc   %i4,0,%i4
  80. ble     i1       
  81. NOP
  82. L1: subcc %i4,32,%g0
  83. bcs L2             
  84. orcc %l6,0,%g0
  85. sub %i4,32,%i4
  86. or %l5,0,%l6
  87. or %g0,0,%l5
  88. be L3             
  89. orcc %l6,0,%g0
  90. or %l6,2,%l6
  91. L3: bne L1             
  92. NOP
  93. ba,a Badd3          
  94. L2: subcc %g0,%i4,%i5
  95. be Badd3          
  96. sll %l6,%i5,%l0
  97. orcc %l0,0,%g0
  98. sll %l5,%i5,%i5
  99. srl %l6,%i4,%l6
  100. srl %l5,%i4,%l5
  101. or %l6,%i5,%l6
  102. bne,a Badd3          
  103. or %l6,2,%l6
  104. ba,a    Badd3    
  105. i1: or      %g0,%l7,%l4
  106. sub     %g0,%i4,%i4
  107. L5: subcc %i4,32,%g0
  108. bcs L6             
  109. orcc %l3,0,%g0
  110. sub %i4,32,%i4
  111. or %l2,0,%l3
  112. or %g0,0,%l2
  113. be L7             
  114. orcc %l3,0,%g0
  115. or %l3,2,%l3
  116. L7: bne L5             
  117. NOP
  118. ba,a Badd3          
  119. L6: subcc %g0,%i4,%i5
  120. be Badd3          
  121. sll %l3,%i5,%l0
  122. orcc %l0,0,%g0
  123. sll %l2,%i5,%i5
  124. srl %l3,%i4,%l3
  125. srl %l2,%i4,%l2
  126. or %l3,%i5,%l3
  127. bne,a Badd3          
  128. or %l3,2,%l3
  129. Badd3: xorcc   %i0,%i2,%g1
  130. bneg    Bsub1    
  131. NOP
  132. addcc   %l3,%l6,%l3
  133. addxcc  %l2,%l5,%l2
  134. bcc     Bres           
  135. andcc   %l3,1,%g1
  136. bne,a i3               
  137. or      %l3,2,%l3
  138. i3: srl     %l3,1,%l3
  139. sll     %l2,31,%g1
  140. srl     %l2,1,%l2
  141. or      %l3,%g1,%l3
  142. sethi   %hi(0x80000000),%g1
  143. or      %l2,%g1,%l2
  144. add     %l4,1,%l4
  145. subcc   %l4,0x7ff,%g0
  146. be      Binf     
  147. NOP
  148. ba,a    Bres     
  149. Bsub1: subcc   %l3,%l6,%l3
  150. subxcc  %l2,%l5,%l2
  151. bcc     i4       
  152. NOP
  153. sethi   %hi(0x80000000),%g1
  154. xor     %l1,%g1,%l1
  155. subcc   %g0,%l3,%l3
  156. subx    %g0,%l2,%l2
  157. i4:
  158. /* scan %l2,0,%i4 */
  159. SCAN | (lo2 << 14) | 0 | (in4 << 25)
  160. subcc %i4,63,%g0
  161. bne L9             
  162. NOP
  163. or %l3,0,%l2
  164. or %g0,0,%l3
  165. sub %l4,32,%l4
  166. /* scan %l2,0,%i4 */
  167. SCAN | (lo2 << 14) | 0 | (in4 << 25)
  168. subcc %i4,63,%g0
  169. be,a L9             
  170. or %i4,0,%l4
  171. L9: subcc %g0,%i4,%i5
  172. be Bres            
  173. sub %l4,%i4,%l4
  174. sll %l2,%i4,%l2
  175. srl %l3,%i5,%i5
  176. or %i5,%l2,%l2
  177. sll %l3,%i4,%l3
  178. Bres: subcc   %l4,0,%l4
  179. ble     Bund     
  180. NOP
  181. Blab8: addcc   %l3,0x400,%l3
  182. addxcc  %l2,0,%l2
  183. addx    %l4,0,%l4
  184. srl     %l3,11,%g1
  185. and     %g1,1,%g1
  186. sub     %l3,%g1,%l3
  187. srl     %l3,11,%i1
  188. sll     %l2,21,%g1
  189. or      %i1,%g1,%i1
  190. srl     %l2,11,%i0
  191. sethi   %hi(0xfffff),%g1
  192. or      %g1,0x3ff,%g1
  193. and     %i0,%g1,%i0
  194. sll     %l4,20,%g1
  195. or      %i0,%g1,%i0
  196. Bret: or      %i0,%l1,%i0
  197. B999: jmpl %i7+8,%g0
  198. restore %g0,0,%g0
  199. BspecA: subcc   %l4,0,%l4
  200. bne     i5       
  201. NOP
  202. addcc   %l3,%l3,%l3
  203. addx    %l2,%l2,%l2
  204. orcc    %l2,%l3,%g1
  205. be      i6       
  206. NOP
  207. /* scan %l2,0,%i4 */
  208. SCAN | (lo2 << 14) | 0 | (in4 << 25)
  209. subcc %i4,63,%g0
  210. bne L11             
  211. NOP
  212. or %l3,0,%l2
  213. or %g0,0,%l3
  214. sub %l4,32,%l4
  215. /* scan %l2,0,%i4 */
  216. SCAN | (lo2 << 14) | 0 | (in4 << 25)
  217. subcc %i4,63,%g0
  218. be,a L11             
  219. or %i4,0,%l4
  220. L11: subcc %g0,%i4,%i5
  221. be Blab1           
  222. sub %l4,%i4,%l4
  223. sll %l2,%i4,%l2
  224. srl %l3,%i5,%i5
  225. or %i5,%l2,%l2
  226. sll %l3,%i4,%l3
  227. ba,a    Blab1    
  228. i6: subcc   %l7,0x7ff,%g0
  229. be      BspecB   
  230. NOP
  231. ba,a    BretB    
  232. i5: sll     %l2,1,%g1
  233. orcc    %g1,%l3,%g1
  234. bne     Bnan           
  235. subcc   %l7,0x7ff,%g0
  236. bne     BretA          
  237. xorcc   %i0,%i2,%g1
  238. bneg    Bnan     
  239. NOP
  240. ba,a    BretB    
  241. BspecB: subcc   %l7,0,%l7
  242. bne     i8       
  243. NOP
  244. addcc   %l6,%l6,%l6
  245. addx    %l5,%l5,%l5
  246. orcc    %l5,%l6,%g1
  247. be      BretA    
  248. NOP
  249. /* scan %l5,0,%i4 */
  250. SCAN | (lo5 << 14) | 0 | (in4 << 25)
  251. subcc %i4,63,%g0
  252. bne L13             
  253. NOP
  254. or %l6,0,%l5
  255. or %g0,0,%l6
  256. sub %l7,32,%l7
  257. /* scan %l5,0,%i4 */
  258. SCAN | (lo5 << 14) | 0 | (in4 << 25)
  259. subcc %i4,63,%g0
  260. be,a L13             
  261. or %i4,0,%l7
  262. L13: subcc %g0,%i4,%i5
  263. be Blab2           
  264. sub %l7,%i4,%l7
  265. sll %l5,%i4,%l5
  266. srl %l6,%i5,%i5
  267. or %i5,%l5,%l5
  268. sll %l6,%i4,%l6
  269. ba,a    Blab2    
  270. i8: sll     %l5,1,%g1
  271. orcc    %g1,%l6,%g1
  272. bne     Bnan     
  273. NOP
  274. BretB: or      %g0,%i2,%i0
  275. ba      B999     
  276. or      %g0,%i3,%i1
  277. BretA:
  278. ba,a    B999     
  279. Bnan: sethi   %hi(0xfff80000),%i0
  280. ba      Bret     
  281. or      %g0,0,%i1
  282. Bund: or      %g0,1,%i4
  283. sub     %i4,%l4,%i4
  284. L15: subcc %i4,32,%g0
  285. bcs L16             
  286. orcc %l3,0,%g0
  287. sub %i4,32,%i4
  288. or %l2,0,%l3
  289. or %g0,0,%l2
  290. be L17             
  291. orcc %l3,0,%g0
  292. or %l3,2,%l3
  293. L17: bne L15             
  294. NOP
  295. ba,a L18             
  296. L16: subcc %g0,%i4,%i5
  297. be L18             
  298. sll %l3,%i5,%l0
  299. orcc %l0,0,%g0
  300. sll %l2,%i5,%i5
  301. srl %l3,%i4,%l3
  302. srl %l2,%i4,%l2
  303. or %l3,%i5,%l3
  304. bne,a L18             
  305. or %l3,2,%l3
  306. L18: ba      Blab8    
  307. or      %g0,0,%l4
  308. Binf: sethi   %hi(0x7ff00000),%i0
  309. ba      Bret     
  310. or      %g0,0,%i1
  311. .global _dpmul
  312. _dpmul:
  313. .global __dmul
  314. __dmul:
  315. save %sp,-96,%sp
  316. sll     %i0,1,%l0
  317. srl     %l0,21,%l0
  318. sll     %i0,11,%i4
  319. srl     %i1,21,%g1
  320. or      %i4,%g1,%i4
  321. sll     %i1,11,%i5
  322. sethi   %hi(0x80000000),%l5
  323. or      %i4,%l5,%i4
  324. sll     %i2,1,%l3
  325. srl     %l3,21,%l3
  326. sll     %i2,11,%l1
  327. srl     %i3,21,%g1
  328. or      %l1,%g1,%l1
  329. sll     %i3,11,%l2
  330. or      %l1,%l5,%l1
  331. xor     %i0,%i2,%g1
  332. and     %l5,%g1,%l5
  333. sub     %l0,1,%g1
  334. subcc   %g1,0x7fe,%g0
  335. bcc     CspecA         
  336. Clab1: sub     %l3,1,%g1
  337. subcc   %g1,0x7fe,%g0
  338. bcc     CspecB   
  339. NOP
  340. Clab2: umul %i4,%l1,%i2
  341. rd %y,%l6
  342. umul %i5,%l2,%l4
  343. rd %y,%i3
  344. umul %i4,%l2,%l2
  345. rd %y,%l7
  346. addcc   %i3,%l2,%i3
  347. addxcc  %i2,%l7,%i2
  348. addx    %l6,0,%l6
  349. umul %i5,%l1,%i5
  350. rd %y,%l7
  351. addcc   %i3,%i5,%i3
  352. addxcc  %i2,%l7,%i2
  353. addx    %l6,0,%l6
  354. orcc    %l4,%i3,%g1
  355. bne,a i10              
  356. or      %i2,1,%i2
  357. i10: orcc    %g0,%l6,%i4
  358. bneg    i11      
  359. or      %g0,%i2,%i5
  360. addcc   %i5,%i5,%i5
  361. addx    %i4,%i4,%i4
  362. sub     %l0,1,%l0
  363. i11: sub     %l3,0x3fe,%g1
  364. add     %l0,%g1,%l0
  365. sub     %l0,1,%g1
  366. subcc   %g1,0x7fe,%g0
  367. bcc     Coveund  
  368. NOP
  369. Clab8: addcc   %i5,0x400,%i5
  370. addxcc  %i4,0,%i4
  371. addx    %l0,0,%l0
  372. srl     %i5,11,%g1
  373. and     %g1,1,%g1
  374. sub     %i5,%g1,%i5
  375. srl     %i5,11,%i1
  376. sll     %i4,21,%g1
  377. or      %i1,%g1,%i1
  378. srl     %i4,11,%i0
  379. sethi   %hi(0xfffff),%g1
  380. or      %g1,0x3ff,%g1
  381. and     %i0,%g1,%i0
  382. sll     %l0,20,%g1
  383. or      %i0,%g1,%i0
  384. Cret: or      %i0,%l5,%i0
  385. Cret2:
  386. C999: jmpl %i7+8,%g0
  387. restore %g0,0,%g0
  388. CspecA: subcc   %l0,0,%l0
  389. bne     i12      
  390. NOP
  391. addcc   %i5,%i5,%i5
  392. addx    %i4,%i4,%i4
  393. orcc    %i4,%i5,%g1
  394. be      i12      
  395. NOP
  396. /* scan %i4,0,%l6 */
  397. SCAN | (in4 << 14) | 0 | (lo6 << 25)
  398. subcc %l6,63,%g0
  399. bne L19             
  400. NOP
  401. or %i5,0,%i4
  402. or %g0,0,%i5
  403. sub %l0,32,%l0
  404. /* scan %i4,0,%l6 */
  405. SCAN | (in4 << 14) | 0 | (lo6 << 25)
  406. subcc %l6,63,%g0
  407. be,a L19             
  408. or %l6,0,%l0
  409. L19: subcc %g0,%l6,%i2
  410. be Clab1           
  411. sub %l0,%l6,%l0
  412. sll %i4,%l6,%i4
  413. srl %i5,%i2,%i2
  414. or %i2,%i4,%i4
  415. sll %i5,%l6,%i5
  416. ba,a    Clab1    
  417. i12: add     %l0,%l3,%g1
  418. subcc   %g1,0x7ff,%g0
  419. be      Cnan           
  420. subcc   %l0,0,%l0
  421. be      Czer           
  422. sll     %i4,1,%g1
  423. orcc    %g1,%i5,%g1
  424. bne     Cnan           
  425. subcc   %l3,0x7ff,%g0
  426. bne     Cinf           
  427. CspecB: subcc   %l3,0,%l3
  428. bne     i14      
  429. NOP
  430. addcc   %l2,%l2,%l2
  431. addx    %l1,%l1,%l1
  432. orcc    %l1,%l2,%g1
  433. be      Czer     
  434. NOP
  435. /* scan %l1,0,%l7 */
  436. SCAN | (lo1 << 14) | 0 | (lo7 << 25)
  437. subcc %l7,63,%g0
  438. bne L21             
  439. NOP
  440. or %l2,0,%l1
  441. or %g0,0,%l2
  442. sub %l3,32,%l3
  443. /* scan %l1,0,%l7 */
  444. SCAN | (lo1 << 14) | 0 | (lo7 << 25)
  445. subcc %l7,63,%g0
  446. be,a L21             
  447. or %l7,0,%l3
  448. L21: subcc %g0,%l7,%l6
  449. be Clab2           
  450. sub %l3,%l7,%l3
  451. sll %l1,%l7,%l1
  452. srl %l2,%l6,%l6
  453. or %l6,%l1,%l1
  454. sll %l2,%l7,%l2
  455. ba,a    Clab2    
  456. i14: sll     %l1,1,%g1
  457. orcc    %g1,%l2,%g1
  458. bne     Cnan     
  459. NOP
  460. Cinf: sethi   %hi(0x7ff00000),%i0
  461. ba      Cret     
  462. or      %g0,0,%i1
  463. Cnan: sethi   %hi(0xfff80000),%i0
  464. ba      Cret     
  465. or      %g0,0,%i1
  466. Coveund:
  467. subcc   %l0,0,%l0
  468. bg      Cinf     
  469. NOP
  470. or      %g0,1,%l6
  471. sub     %l6,%l0,%l6
  472. L23: subcc %l6,32,%g0
  473. bcs L24             
  474. orcc %i5,0,%g0
  475. sub %l6,32,%l6
  476. or %i4,0,%i5
  477. or %g0,0,%i4
  478. be L25             
  479. orcc %i5,0,%g0
  480. or %i5,2,%i5
  481. L25: bne L23             
  482. NOP
  483. ba,a L26             
  484. L24: subcc %g0,%l6,%i2
  485. be L26             
  486. sll %i5,%i2,%i3
  487. orcc %i3,0,%g0
  488. sll %i4,%i2,%i2
  489. srl %i5,%l6,%i5
  490. srl %i4,%l6,%i4
  491. or %i5,%i2,%i5
  492. bne,a L26             
  493. or %i5,2,%i5
  494. L26: ba      Clab8    
  495. or      %g0,0,%l0
  496. Czer: or      %g0,0,%i0
  497. ba      Cret     
  498. or      %g0,%i0,%i1
  499. .global _dpdiv
  500. _dpdiv:
  501. .global __ddiv
  502. __ddiv:
  503. save %sp,-96,%sp
  504. sll     %i0,1,%l0
  505. srl     %l0,21,%l0
  506. sll     %i0,11,%i4
  507. srl     %i1,21,%g1
  508. or      %i4,%g1,%i4
  509. sll     %i1,11,%i5
  510. sethi   %hi(0x80000000),%l4
  511. or      %i4,%l4,%i4
  512. sll     %i2,1,%l3
  513. srl     %l3,21,%l3
  514. sll     %i2,11,%l1
  515. srl     %i3,21,%g1
  516. or      %l1,%g1,%l1
  517. sll     %i3,11,%l2
  518. or      %l1,%l4,%l1
  519. xor     %i0,%i2,%g1
  520. and     %l4,%g1,%l4
  521. sub     %l0,1,%g1
  522. subcc   %g1,0x7fe,%g0
  523. bcc     DspecA         
  524. Dlab1: sub     %l3,1,%g1
  525. subcc   %g1,0x7fe,%g0
  526. bcc     DspecB   
  527. NOP
  528. Dlab2: srl     %i5,1,%i5
  529. sll     %i4,31,%g1
  530. srl     %i4,1,%i4
  531. or      %i5,%g1,%i5
  532. wr %i4,0,%y
  533. or %g0,%i5,%l5
  534. orcc %g0,0,%g0
  535. #if 0
  536. divscc %l5,%l1,%l5
  537. divscc %l5,%l1,%l5
  538. divscc %l5,%l1,%l5
  539. divscc %l5,%l1,%l5
  540. divscc %l5,%l1,%l5
  541. divscc %l5,%l1,%l5
  542. divscc %l5,%l1,%l5
  543. divscc %l5,%l1,%l5
  544. divscc %l5,%l1,%l5
  545. divscc %l5,%l1,%l5
  546. divscc %l5,%l1,%l5
  547. divscc %l5,%l1,%l5
  548. divscc %l5,%l1,%l5
  549. divscc %l5,%l1,%l5
  550. divscc %l5,%l1,%l5
  551. divscc %l5,%l1,%l5
  552. divscc %l5,%l1,%l5
  553. divscc %l5,%l1,%l5
  554. divscc %l5,%l1,%l5
  555. divscc %l5,%l1,%l5
  556. divscc %l5,%l1,%l5
  557. divscc %l5,%l1,%l5
  558. divscc %l5,%l1,%l5
  559. divscc %l5,%l1,%l5
  560. divscc %l5,%l1,%l5
  561. divscc %l5,%l1,%l5
  562. divscc %l5,%l1,%l5
  563. divscc %l5,%l1,%l5
  564. divscc %l5,%l1,%l5
  565. divscc %l5,%l1,%l5
  566. divscc %l5,%l1,%l5
  567. divscc %l5,%l1,%l5
  568. #else
  569. DIVSCC | (lo5 << 14) | lo1 | (lo5 << 25)
  570. DIVSCC | (lo5 << 14) | lo1 | (lo5 << 25)
  571. DIVSCC | (lo5 << 14) | lo1 | (lo5 << 25)
  572. DIVSCC | (lo5 << 14) | lo1 | (lo5 << 25)
  573. DIVSCC | (lo5 << 14) | lo1 | (lo5 << 25)
  574. DIVSCC | (lo5 << 14) | lo1 | (lo5 << 25)
  575. DIVSCC | (lo5 << 14) | lo1 | (lo5 << 25)
  576. DIVSCC | (lo5 << 14) | lo1 | (lo5 << 25)
  577. DIVSCC | (lo5 << 14) | lo1 | (lo5 << 25)
  578. DIVSCC | (lo5 << 14) | lo1 | (lo5 << 25)
  579. DIVSCC | (lo5 << 14) | lo1 | (lo5 << 25)
  580. DIVSCC | (lo5 << 14) | lo1 | (lo5 << 25)
  581. DIVSCC | (lo5 << 14) | lo1 | (lo5 << 25)
  582. DIVSCC | (lo5 << 14) | lo1 | (lo5 << 25)
  583. DIVSCC | (lo5 << 14) | lo1 | (lo5 << 25)
  584. DIVSCC | (lo5 << 14) | lo1 | (lo5 << 25)
  585. DIVSCC | (lo5 << 14) | lo1 | (lo5 << 25)
  586. DIVSCC | (lo5 << 14) | lo1 | (lo5 << 25)
  587. DIVSCC | (lo5 << 14) | lo1 | (lo5 << 25)
  588. DIVSCC | (lo5 << 14) | lo1 | (lo5 << 25)
  589. DIVSCC | (lo5 << 14) | lo1 | (lo5 << 25)
  590. DIVSCC | (lo5 << 14) | lo1 | (lo5 << 25)
  591. DIVSCC | (lo5 << 14) | lo1 | (lo5 << 25)
  592. DIVSCC | (lo5 << 14) | lo1 | (lo5 << 25)
  593. DIVSCC | (lo5 << 14) | lo1 | (lo5 << 25)
  594. DIVSCC | (lo5 << 14) | lo1 | (lo5 << 25)
  595. DIVSCC | (lo5 << 14) | lo1 | (lo5 << 25)
  596. DIVSCC | (lo5 << 14) | lo1 | (lo5 << 25)
  597. DIVSCC | (lo5 << 14) | lo1 | (lo5 << 25)
  598. DIVSCC | (lo5 << 14) | lo1 | (lo5 << 25)
  599. DIVSCC | (lo5 << 14) | lo1 | (lo5 << 25)
  600. DIVSCC | (lo5 << 14) | lo1 | (lo5 << 25)
  601. #endif
  602. bge L27       
  603.  rd %y,%i4
  604. addcc %l1,%i4,%i4
  605. L27: umul %l5,%l2,%i2
  606. rd %y,%l7
  607. or      %g0,0,%i5
  608. subcc   %i5,%i2,%i5
  609. subxcc  %i4,%l7,%i4
  610. bcc     i16      
  611. NOP
  612. Dlab3: sub     %l5,1,%l5
  613. addcc   %i5,%l2,%i5
  614. addxcc  %i4,%l1,%i4
  615. bcc     Dlab3          
  616. i16: subcc   %i4,%l1,%g0
  617. bne     i17      
  618. NOP
  619. or      %g0,%l2,%l7
  620. or      %g0,%i5,%i4
  621. or      %g0,0,%l6
  622. ba      e17      
  623. or      %g0,%l6,%i2
  624. i17: wr %i4,0,%y
  625. or %g0,%i5,%l6
  626. orcc %g0,0,%g0
  627. #if 0
  628. divscc %l6,%l1,%l6
  629. divscc %l6,%l1,%l6
  630. divscc %l6,%l1,%l6
  631. divscc %l6,%l1,%l6
  632. divscc %l6,%l1,%l6
  633. divscc %l6,%l1,%l6
  634. divscc %l6,%l1,%l6
  635. divscc %l6,%l1,%l6
  636. divscc %l6,%l1,%l6
  637. divscc %l6,%l1,%l6
  638. divscc %l6,%l1,%l6
  639. divscc %l6,%l1,%l6
  640. divscc %l6,%l1,%l6
  641. divscc %l6,%l1,%l6
  642. divscc %l6,%l1,%l6
  643. divscc %l6,%l1,%l6
  644. divscc %l6,%l1,%l6
  645. divscc %l6,%l1,%l6
  646. divscc %l6,%l1,%l6
  647. divscc %l6,%l1,%l6
  648. divscc %l6,%l1,%l6
  649. divscc %l6,%l1,%l6
  650. divscc %l6,%l1,%l6
  651. divscc %l6,%l1,%l6
  652. divscc %l6,%l1,%l6
  653. divscc %l6,%l1,%l6
  654. divscc %l6,%l1,%l6
  655. divscc %l6,%l1,%l6
  656. divscc %l6,%l1,%l6
  657. divscc %l6,%l1,%l6
  658. divscc %l6,%l1,%l6
  659. divscc %l6,%l1,%l6
  660. #else
  661. DIVSCC | (lo6 << 14) | lo1 | (lo6 << 25)
  662. DIVSCC | (lo6 << 14) | lo1 | (lo6 << 25)
  663. DIVSCC | (lo6 << 14) | lo1 | (lo6 << 25)
  664. DIVSCC | (lo6 << 14) | lo1 | (lo6 << 25)
  665. DIVSCC | (lo6 << 14) | lo1 | (lo6 << 25)
  666. DIVSCC | (lo6 << 14) | lo1 | (lo6 << 25)
  667. DIVSCC | (lo6 << 14) | lo1 | (lo6 << 25)
  668. DIVSCC | (lo6 << 14) | lo1 | (lo6 << 25)
  669. DIVSCC | (lo6 << 14) | lo1 | (lo6 << 25)
  670. DIVSCC | (lo6 << 14) | lo1 | (lo6 << 25)
  671. DIVSCC | (lo6 << 14) | lo1 | (lo6 << 25)
  672. DIVSCC | (lo6 << 14) | lo1 | (lo6 << 25)
  673. DIVSCC | (lo6 << 14) | lo1 | (lo6 << 25)
  674. DIVSCC | (lo6 << 14) | lo1 | (lo6 << 25)
  675. DIVSCC | (lo6 << 14) | lo1 | (lo6 << 25)
  676. DIVSCC | (lo6 << 14) | lo1 | (lo6 << 25)
  677. DIVSCC | (lo6 << 14) | lo1 | (lo6 << 25)
  678. DIVSCC | (lo6 << 14) | lo1 | (lo6 << 25)
  679. DIVSCC | (lo6 << 14) | lo1 | (lo6 << 25)
  680. DIVSCC | (lo6 << 14) | lo1 | (lo6 << 25)
  681. DIVSCC | (lo6 << 14) | lo1 | (lo6 << 25)
  682. DIVSCC | (lo6 << 14) | lo1 | (lo6 << 25)
  683. DIVSCC | (lo6 << 14) | lo1 | (lo6 << 25)
  684. DIVSCC | (lo6 << 14) | lo1 | (lo6 << 25)
  685. DIVSCC | (lo6 << 14) | lo1 | (lo6 << 25)
  686. DIVSCC | (lo6 << 14) | lo1 | (lo6 << 25)
  687. DIVSCC | (lo6 << 14) | lo1 | (lo6 << 25)
  688. DIVSCC | (lo6 << 14) | lo1 | (lo6 << 25)
  689. DIVSCC | (lo6 << 14) | lo1 | (lo6 << 25)
  690. DIVSCC | (lo6 << 14) | lo1 | (lo6 << 25)
  691. DIVSCC | (lo6 << 14) | lo1 | (lo6 << 25)
  692. DIVSCC | (lo6 << 14) | lo1 | (lo6 << 25)
  693. #endif
  694. bge L28       
  695.  rd %y,%i4
  696. addcc %l1,%i4,%i4
  697. L28: umul %l6,%l2,%i2
  698. rd %y,%l7
  699. e17: or      %g0,0,%i5
  700. subcc   %i5,%i2,%i5
  701. subxcc  %i4,%l7,%i4
  702. bcc     i18      
  703. NOP
  704. Dlab4: sub     %l6,1,%l6
  705. addcc   %i5,%l2,%i5
  706. addxcc  %i4,%l1,%i4
  707. bcc     Dlab4    
  708. NOP
  709. i18: sub     %l0,%l3,%l0
  710. add     %l0,0x3ff,%l0
  711. subcc   %l5,0,%l5
  712. bneg    i19      
  713. NOP
  714. addcc   %l6,%l6,%l6
  715. addx    %l5,%l5,%l5
  716. sub     %l0,1,%l0
  717. i19: orcc    %i4,%i5,%g1
  718. bne,a i20              
  719. or      %l6,1,%l6
  720. i20: or      %g0,%l5,%i4
  721. or      %g0,%l6,%i5
  722. sub     %l0,1,%g1
  723. subcc   %g1,0x7fe,%g0
  724. bcc     Doveund  
  725. NOP
  726. Dlab8: addcc   %i5,0x400,%i5
  727. addxcc  %i4,0,%i4
  728. addx    %l0,0,%l0
  729. srl     %i5,11,%g1
  730. and     %g1,1,%g1
  731. sub     %i5,%g1,%i5
  732. srl     %i5,11,%i1
  733. sll     %i4,21,%g1
  734. or      %i1,%g1,%i1
  735. srl     %i4,11,%i0
  736. sethi   %hi(0xfffff),%g1
  737. or      %g1,0x3ff,%g1
  738. and     %i0,%g1,%i0
  739. sll     %l0,20,%g1
  740. or      %i0,%g1,%i0
  741. Dret: or      %i0,%l4,%i0
  742. D999: jmpl %i7+8,%g0
  743. restore %g0,0,%g0
  744. Doveund:
  745. subcc   %l0,0,%l0
  746. bg      Dinf     
  747. NOP
  748. or      %g0,1,%l5
  749. sub     %l5,%l0,%l5
  750. L29: subcc %l5,32,%g0
  751. bcs L30             
  752. orcc %i5,0,%g0
  753. sub %l5,32,%l5
  754. or %i4,0,%i5
  755. or %g0,0,%i4
  756. be L31             
  757. orcc %i5,0,%g0
  758. or %i5,2,%i5
  759. L31: bne L29             
  760. NOP
  761. ba,a L32             
  762. L30: subcc %g0,%l5,%l6
  763. be L32             
  764. sll %i5,%l6,%l7
  765. orcc %l7,0,%g0
  766. sll %i4,%l6,%l6
  767. srl %i5,%l5,%i5
  768. srl %i4,%l5,%i4
  769. or %i5,%l6,%i5
  770. bne,a L32             
  771. or %i5,2,%i5
  772. L32: ba      Dlab8    
  773. or      %g0,0,%l0
  774. DspecA: subcc   %l0,0,%l0
  775. bne     i21      
  776. NOP
  777. addcc   %i5,%i5,%i5
  778. addx    %i4,%i4,%i4
  779. orcc    %i4,%i5,%g1
  780. be      i21      
  781. NOP
  782. /* scan %i4,0,%l5 */
  783. SCAN | (in4 << 14) | 0 | (lo5 << 25)
  784. subcc %l5,63,%g0
  785. bne L33             
  786. NOP
  787. or %i5,0,%i4
  788. or %g0,0,%i5
  789. sub %l0,32,%l0
  790. /* scan %i4,0,%l5 */
  791. SCAN | (in4 << 14) | 0 | (lo5 << 25)
  792. subcc %l5,63,%g0
  793. be,a L33             
  794. or %l5,0,%l0
  795. L33: subcc %g0,%l5,%l6
  796. be Dlab1           
  797. sub %l0,%l5,%l0
  798. sll %i4,%l5,%i4
  799. srl %i5,%l6,%l6
  800. or %l6,%i4,%i4
  801. sll %i5,%l5,%i5
  802. ba,a    Dlab1    
  803. i21: subcc   %l0,%l3,%g0
  804. be      Dnan           
  805. subcc   %l3,0x7ff,%g0
  806. be      DspecB         
  807. subcc   %l0,0,%l0
  808. be      Dzer           
  809. sll     %i4,1,%g1
  810. orcc    %g1,%i5,%g1
  811. bne     Dnan     
  812. NOP
  813. Dinf: sethi   %hi(0x7ff00000),%i0
  814. ba      Dret     
  815. or      %g0,0,%i1
  816. DspecB: subcc   %l3,0,%l3
  817. bne     i23      
  818. NOP
  819. addcc   %l2,%l2,%l2
  820. addx    %l1,%l1,%l1
  821. orcc    %l1,%l2,%g1
  822. be      Dinf     
  823. NOP
  824. /* scan %l1,0,%l5 */
  825. SCAN | (lo1 << 14) | 0 | (lo5 << 25)
  826. subcc %l5,63,%g0
  827. bne L35             
  828. NOP
  829. or %l2,0,%l1
  830. or %g0,0,%l2
  831. sub %l3,32,%l3
  832. /* scan %l1,0,%l5 */
  833. SCAN | (lo1 << 14) | 0 | (lo5 << 25)
  834. subcc %l5,63,%g0
  835. be,a L35             
  836. or %l5,0,%l3
  837. L35: subcc %g0,%l5,%l6
  838. be Dlab2           
  839. sub %l3,%l5,%l3
  840. sll %l1,%l5,%l1
  841. srl %l2,%l6,%l6
  842. or %l6,%l1,%l1
  843. sll %l2,%l5,%l2
  844. ba,a    Dlab2    
  845. i23: sll     %l1,1,%g1
  846. orcc    %g1,%l2,%g1
  847. bne     Dnan     
  848. NOP
  849. Dzer: or      %g0,0,%i1
  850. ba      Dret     
  851. or      %g0,%i1,%i0
  852. Dnan: sethi   %hi(0xfff80000),%i0
  853. ba      Dret     
  854. or      %g0,0,%i1
  855. .global __dcmp
  856. .global _dpcmp
  857. ! ! ! ! !
  858. !  __dcmp: dp floating point comparison
  859. !  On entry: o0:o1 = argument A
  860. ! o2:o3 = argument B
  861. !  On exit: condition codes set
  862. ! o0 = -1  A < B
  863. !  0  A == B
  864. !  1  A > B
  865. ! ! ! ! !
  866. __dcmp: ! C ifc
  867. _dpcmp: ! USSW ifc
  868. or %o2,%o0,%o4 ! two zeroes of any kind are equal
  869. add %o4,%o4,%o4
  870. or %o4,%o1,%o4
  871. orcc %o4,%o3,%o4
  872. be cmp98
  873. !
  874.  andcc %o0,%o2,%g0
  875. bneg cmp10 ! j/ both negative
  876. !
  877. ! A & B are both positive or of different sign
  878. !
  879.  subcc %o0,%o2,%g0
  880. bl,a cmp99 ! j/ A < B
  881.  or %g0,-1,%o0
  882. bg,a cmp99 ! j/ A > B
  883.  or %g0,1,%o0
  884. subcc %o1,%o3,%g0
  885. bcs,a cmp99 ! j/ A < B
  886.  or %g0,-1,%o0
  887. bgu,a cmp99 ! j/ A > B
  888.  or %g0,1,%o0
  889. cmp98: or %g0,0,%o0 ! A == B
  890. cmp99: jmpl %o7+8,%g0 ! return
  891.  orcc %g0,%o0,%g0 ! setting cc
  892. !
  893. ! A & B are both negative
  894. !
  895. cmp10:  subcc %o0,%o2,%g0
  896. bl,a cmp99 ! j/ A > B
  897.  or %g0,1,%o0
  898. bg,a cmp99 ! j/ A < B
  899.  or %g0,-1,%o0
  900. subcc %o1,%o3,%o0
  901. bcs,a cmp99 ! j/ A > B
  902.  or %g0,1,%o0
  903. bgu,a cmp99 ! j/ A < B
  904.  or %g0,-1,%o0
  905. jmpl %o7+8,%g0 ! return
  906.  orcc %g0,%o0,%g0 ! setting cc
  907. .global __dtol
  908. .global _dptoli
  909. ! ! ! ! !
  910. !  __dtol: dp floating point to long
  911. !  On entry: o0:o1 = argument A
  912. !  On exit: o0 = long
  913. !  Note: >>>> This routine truncates DOWN <<<<
  914. ! ! ! ! !
  915. __dtol: ! C ifc
  916. _dptoli: ! USSW ifc
  917. sll %o0,1,%o2 ! o2 = exp:mant left justified
  918. sethi %hi(0xffe00000),%g1
  919. subcc %o2,%g1,%g0
  920. bgu tol22 ! j/ NaN
  921.  srl %o2,21,%o2 ! o2 = exp right justified
  922. !
  923. sll %o0,11,%o3 ! %o3 = mantissa left justified
  924. sethi %hi(0x80000000),%g1
  925. or %o3,%g1,%o3
  926. srl %o1,21,%g1
  927. or %g1,%o3,%o3
  928. !
  929. ! convert mantissa to integer
  930. !
  931. subcc %o2,1054,%o2  ! check unbiased exponent
  932. bge tol22 ! j/ exp too large
  933.  sub %g0,%o2,%o2
  934. subcc %o2,31,%g0
  935. bg tol20 ! j/ exp too small
  936.  orcc %o0,0,%g0
  937. bge tol99 ! j/ positive number
  938.  srl %o3,%o2,%o0 ! shift mantissa to long answer
  939. !
  940. sub %g0,%o0,%o0 ! negative answer
  941. !
  942. tol99: jmpl %o7+8,%g0 ! return
  943.  nop
  944. !
  945. ! exponent too small, return 0
  946. !
  947. tol20: ba tol99 ! exp too small, return 0
  948.  or %g0,%g0,%o0
  949. !
  950. ! NaN or exponent too large, return IEEE invalid 0x80000000
  951. !
  952. tol22: ba tol99
  953. sethi %hi(0x80000000),%o0
  954. .global _dptoul
  955. _dptoul:
  956. save %sp,-96,%sp
  957. sll %i0,11,%i3
  958. srl %i1,21,%i5
  959. sll %i1,11,%i4
  960. or %i3,%i5,%i3
  961. sethi %hi(0x80000000),%i5
  962. or %i3,%i5,%i3
  963. sll %i0,1,%i5
  964. srl %i5,21,%i5
  965. or %g0,%i3,%l0
  966. subcc %i5,0x41f,%g0
  967. bcc Lnaninf
  968. NOP
  969. or %g0,0x41e,%i2
  970. subcc %i2,%i5,%i2
  971. subcc %i2,32,%g0
  972. bcc,a L4
  973. or %g0,0,%l0
  974. L4: srl %l0,%i2,%l0
  975. subcc %i0,0x0,%g0
  976. bge i28      
  977. NOP
  978. subcc %g0,%l0,%l0
  979. i28: or %g0,%l0,%i0
  980. L999: jmpl %i7+8,%g0
  981. restore %g0,0,%g0
  982. Lnaninf:
  983. sethi %hi(0x80000000),%i0
  984. ba L999
  985. NOP
  986. .global __ltod
  987. .global __ultod
  988. .global _litodp
  989. .global _ultodp
  990. ! ! ! ! !
  991. !  __ultod: unsigned long to dp floating point
  992. !  __ltod: long to dp floating point
  993. !  On entry: o0 = argument A
  994. !  On exit: o0:o1 = dp floating point
  995. ! ! ! ! !
  996. __ltod: ! C ifc
  997. _litodp: ! USSW ifc
  998. orcc %o0,0,%g0
  999. bl tod10 ! j/ negative
  1000. __ultod: ! C ifc
  1001. _ultodp: ! USSW ifc
  1002.  or %g0,31+0x3ff,%o4 ! o4 = anticipated exp
  1003. !
  1004. ! normalize mantissa to o2:o3
  1005. !
  1006. tod01:
  1007. /* scan %o0,0,%g1 ! count zero bits */
  1008. SCAN | (out0 << 14) | 0 | (gl1 << 25)
  1009. subcc %g1,63,%g0
  1010. be tod22 ! j/ zero
  1011.  sll %o0,%g1,%o2 ! o2 = long left justified
  1012. sll %o2,1,%o2 ! toss hidden bit
  1013. sll %o2,20,%o3 ! o3 = low order bits
  1014. srl %o2,12,%o2 ! room for sign & mant
  1015. !
  1016. sub %o4,%g1,%o4 ! adjust exp
  1017. sll %o4,20,%o4 ! position exp
  1018. or %o2,%o4,%o2 ! combine exp & mant
  1019. !
  1020. ! o0:o1 = answer
  1021. !
  1022. tod99: or %g0,%o2,%o0 ! o0:o1 = answer
  1023. jmpl %o7+8,%g0 ! return
  1024.  or %g0,%o3,%o1
  1025. !
  1026. tod22: or %g0,0,%o0 ! return 0
  1027. jmpl %o7+8,%g0
  1028.  or %g0,0,%o1
  1029. !
  1030. ! negate long
  1031. ! normalize mantissa to o2:o3
  1032. !
  1033. tod10: sub %g0,%o0,%o0 ! negate long
  1034. /* scan %o0,0,%g1 ! count zero bits */
  1035. SCAN | (out0 << 14) | 0 | (gl1 << 25)
  1036. sll %o0,%g1,%o2 ! o2 = long left justified
  1037. sll %o2,1,%o2 ! toss hidden bit
  1038. sll %o2,20,%o3 ! o3 = low order bits
  1039. srl %o2,12,%o2 ! room for sign & mant
  1040. !
  1041. sub %o4,%g1,%o4 ! adjust exp
  1042. or %o4,0x800,%o4 ! combine sign & exp
  1043. sll %o4,20,%o4 ! position sign & exp
  1044. ba tod99
  1045.  or %o2,%o4,%o2 ! combine sign & exp & mant
  1046. .global _fptodp
  1047. _fptodp:
  1048. .global __ftod
  1049. __ftod:
  1050. save %sp,-96,%sp
  1051. srl     %i0,23,%i3
  1052. and     %i3,0xff,%i3
  1053. sethi   %hi(0x80000000),%i4
  1054. and     %i0,%i4,%i1
  1055. sub     %i3,1,%i5
  1056. subcc   %i5,0xfe,%g0
  1057. bcc     Gspec    
  1058. NOP
  1059. Glab1: add     %i3,0x380,%i3
  1060. sll     %i0,9,%i5
  1061. srl     %i5,12,%i5
  1062. or      %i1,%i5,%i1
  1063. sll     %i0,29,%i2
  1064. Gret: sll     %i3,20,%i5
  1065. or      %i1,%i5,%i1
  1066. Gret2: or      %g0,%i1,%i0
  1067. or      %g0,%i2,%i1
  1068. G999: jmpl %i7+8,%g0
  1069. restore %g0,0,%g0
  1070. Gspec: or      %g0,0,%i2
  1071. subcc   %i3,0,%i3
  1072. bne     j28      
  1073. NOP
  1074. addcc   %i0,%i0,%i0
  1075. be      Gret2    
  1076. NOP
  1077. /* scan %i0,0,%i4 */
  1078. SCAN | (in0 << 14) | 0 | (in4 << 25)
  1079. sll %i0,%i4,%i0
  1080. subcc %i3,%i4,%i3
  1081. srl     %i0,8,%i0
  1082. ba      Glab1    
  1083. add     %i3,8,%i3
  1084. j28: or      %g0,0x7ff,%i3
  1085. sethi   %hi(0xff800000),%l0
  1086. andncc  %i0,%l0,%i5
  1087. bne,a Gret             
  1088. sethi   %hi(0xfff80000),%i1
  1089. ba,a    Gret     
  1090. .global _dptofp
  1091. _dptofp:
  1092. .global __dtof
  1093. __dtof:
  1094. save %sp,-96,%sp
  1095. sll     %i0,1,%i4
  1096. srl     %i4,21,%i4
  1097. sll     %i0,11,%i2
  1098. srl     %i1,21,%l1
  1099. or      %i2,%l1,%i2
  1100. sll     %i1,11,%i3
  1101. sethi   %hi(0x80000000),%i5
  1102. or      %i2,%i5,%i2
  1103. and     %i5,%i0,%i5
  1104. sub     %i4,0x380,%i4
  1105. sub     %i4,1,%l1
  1106. subcc   %l1,0xfe,%g0
  1107. bcc     Hspec          
  1108. Hlab1: subcc   %i3,0,%i3
  1109. bne,a i30              
  1110. or      %i2,1,%i2
  1111. i30: addcc   %i2,0x80,%i2
  1112. addx    %i4,0,%i4
  1113. srl     %i2,8,%l1
  1114. and     %l1,1,%l1
  1115. sub     %i2,%l1,%i2
  1116. sll     %i2,1,%i2
  1117. srl     %i2,9,%i2
  1118. sll     %i4,23,%l1
  1119. or      %i2,%l1,%i2
  1120. or      %i2,%i5,%i0
  1121. H999: jmpl %i7+8,%g0
  1122. restore %g0,0,%g0
  1123. Hspec: subcc   %i4,0x47f,%g0
  1124. bne     i31            
  1125. sll     %i2,1,%l1
  1126. orcc    %l1,%i3,%l1
  1127. be      i31      
  1128. NOP
  1129. sethi   %hi(0x7fc00000),%l1
  1130. ba      H999     
  1131. or      %l1,%i5,%i0
  1132. i31: subcc   %i4,0xff,%g0
  1133. bl      i33      
  1134. NOP
  1135. sethi   %hi(0x7f800000),%l1
  1136. ba      H999     
  1137. or      %l1,%i5,%i0
  1138. i33: or      %g0,1,%l0
  1139. sub     %l0,%i4,%l0
  1140. subcc   %l0,0x20,%g0
  1141. bcs     i34      
  1142. NOP
  1143. or      %i3,%i2,%i3
  1144. ba      e34      
  1145. or      %g0,0,%i2
  1146. i34: or      %g0,0x20,%l2
  1147. sub     %l2,%l0,%l2
  1148. sll     %i2,%l2,%l1
  1149. or      %i3,%l1,%i3
  1150. srl     %i2,%l0,%i2
  1151. e34: ba      Hlab1    
  1152. or      %g0,0,%i4
  1153. .global _dpfabs
  1154. _dpfabs:
  1155. sethi %hi(0x80000000),%g1
  1156. jmpl %o7+8,%g0
  1157. andn %o0,%g1,%o0
  1158. ! .end