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

VxWorks

开发平台:

C/C++

  1. /* l_entry.s - Motorola 68040 FP entry points (LIB) */
  2. /* Copyright 1991-1993 Wind River Systems, Inc. */
  3. .data
  4. .globl _copyright_wind_river
  5. .long _copyright_wind_river
  6. /*
  7. modification history
  8. --------------------
  9. 01j,28jan97,ms   fixed SPR 7822 (bug from 01i check-in - never part of product)
  10. 01i,31may96,ms   updated to mototorola version 2.3
  11. 01h,21jul93,kdl  added .text (SPR #2372).
  12. 01g,18sep92,kdl  restored title line clobbered in 01f checkin.
  13. 01f,18sep92,kdl  changed multi-reg (fpsr/fpcr) saves to use offset USER_FPCR
  14.  instead of USER_FPSR, to reflect actual save order (SPR #1455).
  15. 01e,23aug92,jcf  changed bxxx to jxx.
  16. 01d,20aug92,kdl  added changes from Motorola FPSP v2.2 to correctly save fpcr.
  17. 01c,26may92,rrr  the tree shuffle
  18. 01b,09jan92,kdl  added modification history; general cleanup.
  19. 01a,15aug91,kdl  original version, from Motorola FPSP v2.0.
  20. */
  21. /*
  22. DESCRIPTION
  23. This file contains Motorola FPSP library interface entry points for
  24. various floating point operations.
  25. */
  26. | section 8
  27. #include "fpsp040L.h"
  28. | xref __l_tag
  29. | xref __l_szero
  30. | xref __l_sinf
  31. | xref __l_sopr_inf
  32. | xref __l_sone
  33. | xref __l_spi_2
  34. | xref __l_szr_inf
  35. | xref __l_src_nan
  36. | xref __l_t_operr
  37. | xref __l_t_dz2
  38. | xref __l_snzrinx
  39. | xref __l_ld_pone
  40. | xref __l_ld_pinf
  41. | xref __l_ld_ppi2
  42. | xref __l_ssincosz
  43. | xref __l_ssincosi
  44. | xref __l_ssincosnan
  45. | xref __l_setoxm1i
  46. |
  47. | MONADIC.GEN 1.3 4/30/91
  48. |
  49. | MONADIC.GEN --- generic MONADIC template
  50. |
  51. | This version saves all registers that will be used by the emulation
  52. | routines and restores all but FP0 on exit.  The FPSR is
  53. | updated to reflect the result of the operation.  Return value
  54. | is placed in FP0 for single, double and extended results.
  55. |
  56. | The package subroutines expect the incoming fpcr to be zeroed
  57. | since they need extended precision to work properly.  The
  58. /*  'final' fpcr is expected in d1 so that the calculated result */
  59. | can be properly sized and rounded.  Also, if the incoming fpcr
  60. | has enabled any exceptions, the exception will be taken on the
  61. | final fmovem in this template.
  62. |
  63. | Customizations:
  64. | 1. Remove the moveml at the entry and exit of
  65. |    each routine if your compiler treats those
  66. |    registers as scratch.
  67. /*  2. Likewise, don't save FP0/FP1 if they are scratch */
  68. |    registers.
  69. | 3. Delete handling of the fpsr if you only care about
  70. |    the result.
  71. | 4. Some (most?) C compilers convert all float arguments
  72. |    to double, and provide no support at all for extended
  73. |    precision so remove the __l_facoss and __l_facosx entry points.
  74. | 5. Move the result to d0/d1 if the compiler is that old.
  75. | Copyright (C) Motorola, Inc. 1991
  76. | All Rights Reserved
  77. |
  78. | THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
  79. | The copyright notice above does not evidence any
  80. | actual or intended publication of such source code.
  81. | xref __l_tag
  82. | xref __l_sacos
  83. | xref __l_ld_ppi2
  84. | xref __l_t_operr
  85. | xref __l_mon_nan
  86. | xref __l_sacosd
  87. .text
  88. .globl __l_facoss
  89. __l_facoss:
  90. link a6,#-LOCAL_SIZE
  91. moveml d0-d1/a0-a1,a6@(USER_DA)
  92. fmovemx fp0-fp3,a6@(USER_FP0)
  93. fmovel fpsr,a6@(USER_FPSR)
  94. fmovel fpcr,a6@(USER_FPCR)
  95. fmovel fpcr,d1 /* |  user's rounding mode/precision */
  96. fmovel #0,fpcr |  force rounding mode/prec to extended,rn
  97. |
  98. | copy, convert and tag input argument
  99. |
  100. fmoves a6@(8),fp0
  101. fmovex fp0,a6@(ETEMP)
  102. lea a6@(ETEMP),a0
  103. bsrl __l_tag
  104. moveb d0,a6@(STAG)
  105. tstb d0
  106. jne  L_1012
  107. bsrl __l_sacos |  normalized (regular) number
  108. jra  L_1016
  109. L_1012:
  110. cmpb #0x20,d0 |  zero?
  111. jne  L_1013
  112. bsrl __l_ld_ppi2
  113. jra  L_1016
  114. L_1013:
  115. cmpb #0x40,d0 |  infinity?
  116. jne  L_1014
  117. bsrl __l_t_operr
  118. jra  L_1016
  119. L_1014:
  120. cmpb #0x60,d0 |  NaN?
  121. jne  L_1015
  122. bsrl __l_mon_nan
  123. jra  L_1016
  124. L_1015:
  125. bsrl __l_sacosd |  assuming a denorm...
  126. L_1016:
  127. fmovel fpsr,d0 |  update status register
  128. orb a6@(USER_FPSR+3),d0 | add previously accrued exceptions
  129. fmovel d0,fpsr
  130. |
  131. | Result is now in FP0
  132. |
  133. moveml a6@(USER_DA),d0-d1/a0-a1
  134. fmovemx a6@(USER_FP1),fp1-fp3 |  note: fp0 not restored
  135. fmovel a6@(USER_FPCR),fpcr | fpcr restored
  136. unlk a6
  137. rts
  138. .globl __l_facosd
  139. __l_facosd:
  140. link a6,#-LOCAL_SIZE
  141. moveml d0-d1/a0-a1,a6@(USER_DA)
  142. fmovemx fp0-fp3,a6@(USER_FP0)
  143. fmovel fpsr,a6@(USER_FPSR)
  144. fmovel fpcr,a6@(USER_FPCR)
  145. fmovel fpcr,d1 /* |  user's rounding mode/precision */
  146. fmovel #0,fpcr |  force rounding mode/prec to extended,rn
  147. |
  148. | copy, convert and tag input argument
  149. |
  150. fmoved a6@(8),fp0
  151. fmovex fp0,a6@(ETEMP)
  152. lea a6@(ETEMP),a0
  153. bsrl __l_tag
  154. moveb d0,a6@(STAG)
  155. tstb d0
  156. jne  L_1017
  157. bsrl __l_sacos |  normalized (regular) number
  158. jra  L_101B
  159. L_1017:
  160. cmpb #0x20,d0 |  zero?
  161. jne  L_1018
  162. bsrl __l_ld_ppi2
  163. jra  L_101B
  164. L_1018:
  165. cmpb #0x40,d0 |  infinity?
  166. jne  L_1019
  167. bsrl __l_t_operr
  168. jra  L_101B
  169. L_1019:
  170. cmpb #0x60,d0 |  NaN?
  171. jne  L_101A
  172. bsrl __l_mon_nan
  173. jra  L_101B
  174. L_101A:
  175. bsrl __l_sacosd |  assuming a denorm...
  176. L_101B:
  177. fmovel fpsr,d0 |  update status register
  178. orb a6@(USER_FPSR+3),d0 | add previously accrued exceptions
  179. fmovel d0,fpsr
  180. |
  181. | Result is now in FP0
  182. |
  183. moveml a6@(USER_DA),d0-d1/a0-a1
  184. fmovemx a6@(USER_FP1),fp1-fp3 |  note: fp0 not restored
  185. fmovel a6@(USER_FPCR),fpcr | fpcr restored
  186. unlk a6
  187. rts
  188. .globl __l_facosx
  189. __l_facosx:
  190. link a6,#-LOCAL_SIZE
  191. moveml d0-d1/a0-a1,a6@(USER_DA)
  192. fmovemx fp0-fp3,a6@(USER_FP0)
  193. fmovel fpsr,a6@(USER_FPSR)
  194. fmovel fpcr,a6@(USER_FPCR)
  195. fmovel fpcr,d1 /* |  user's rounding mode/precision */
  196. fmovel #0,fpcr |  force rounding mode/prec to extended,rn
  197. |
  198. | copy, convert and tag input argument
  199. |
  200. fmovex a6@(8),fp0
  201. fmovex fp0,a6@(ETEMP)
  202. lea a6@(ETEMP),a0
  203. bsrl __l_tag
  204. moveb d0,a6@(STAG)
  205. tstb d0
  206. jne  L_101C
  207. bsrl __l_sacos |  normalized (regular) number
  208. jra  L_101G
  209. L_101C:
  210. cmpb #0x20,d0 |  zero?
  211. jne  L_101D
  212. bsrl __l_ld_ppi2
  213. jra  L_101G
  214. L_101D:
  215. cmpb #0x40,d0 |  infinity?
  216. jne  L_101E
  217. bsrl __l_t_operr
  218. jra  L_101G
  219. L_101E:
  220. cmpb #0x60,d0 |  NaN?
  221. jne  L_101F
  222. bsrl __l_mon_nan
  223. jra  L_101G
  224. L_101F:
  225. bsrl __l_sacosd |  assuming a denorm...
  226. L_101G:
  227. fmovel fpsr,d0 |  update status register
  228. orb a6@(USER_FPSR+3),d0 | add previously accrued exceptions
  229. fmovel d0,fpsr
  230. |
  231. | Result is now in FP0
  232. |
  233. moveml a6@(USER_DA),d0-d1/a0-a1
  234. fmovemx a6@(USER_FP1),fp1-fp3 |  note: fp0 not restored
  235. fmovel a6@(USER_FPCR),fpcr | fpcr restored
  236. unlk a6
  237. rts
  238. |
  239. | MONADIC.GEN 1.3 4/30/91
  240. |
  241. | MONADIC.GEN --- generic MONADIC template
  242. |
  243. | This version saves all registers that will be used by the emulation
  244. | routines and restores all but FP0 on exit.  The FPSR is
  245. | updated to reflect the result of the operation.  Return value
  246. | is placed in FP0 for single, double and extended results.
  247. |
  248. | The package subroutines expect the incoming fpcr to be zeroed
  249. | since they need extended precision to work properly.  The
  250. /* | 'final' fpcr is expected in d1 so that the calculated result */
  251. | can be properly sized and rounded.  Also, if the incoming fpcr
  252. | has enabled any exceptions, the exception will be taken on the
  253. | final fmovem in this template.
  254. |
  255. | Customizations:
  256. | 1. Remove the moveml at the entry and exit of
  257. |    each routine if your compiler treats those
  258. |    registers as scratch.
  259. /* | 2. Likewise, don't save FP0/FP1 if they are scratch */
  260. |    registers.
  261. | 3. Delete handling of the fpsr if you only care about
  262. |    the result.
  263. | 4. Some (most?) C compilers convert all float arguments
  264. |    to double, and provide no support at all for extended
  265. |    precision so remove the __l_fasins and __l_fasinx entry points.
  266. | 5. Move the result to d0/d1 if the compiler is that old.
  267. | Copyright (C) Motorola, Inc. 1991
  268. | All Rights Reserved
  269. |
  270. | THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
  271. | The copyright notice above does not evidence any
  272. | actual or intended publication of such source code.
  273. | xref __l_tag
  274. | xref __l_sasin
  275. | xref __l_szero
  276. | xref __l_t_operr
  277. | xref __l_mon_nan
  278. | xref __l_sasind
  279. .globl __l_fasins
  280. __l_fasins:
  281. link a6,#-LOCAL_SIZE
  282. moveml d0-d1/a0-a1,a6@(USER_DA)
  283. fmovemx fp0-fp3,a6@(USER_FP0)
  284. fmovel fpsr,a6@(USER_FPSR)
  285. fmovel fpcr,a6@(USER_FPCR)
  286. fmovel fpcr,d1 /* |  user's rounding mode/precision */
  287. fmovel #0,fpcr |  force rounding mode/prec to extended,rn
  288. |
  289. | copy, convert and tag input argument
  290. |
  291. fmoves a6@(8),fp0
  292. fmovex fp0,a6@(ETEMP)
  293. lea a6@(ETEMP),a0
  294. bsrl __l_tag
  295. moveb d0,a6@(STAG)
  296. tstb d0
  297. jne  L_1022
  298. bsrl __l_sasin |  normalized (regular) number
  299. jra  L_1026
  300. L_1022:
  301. cmpb #0x20,d0 |  zero?
  302. jne  L_1023
  303. bsrl __l_szero
  304. jra  L_1026
  305. L_1023:
  306. cmpb #0x40,d0 |  infinity?
  307. jne  L_1024
  308. bsrl __l_t_operr
  309. jra  L_1026
  310. L_1024:
  311. cmpb #0x60,d0 |  NaN?
  312. jne  L_1025
  313. bsrl __l_mon_nan
  314. jra  L_1026
  315. L_1025:
  316. bsrl __l_sasind |  assuming a denorm...
  317. L_1026:
  318. fmovel fpsr,d0 |  update status register
  319. orb a6@(USER_FPSR+3),d0 | add previously accrued exceptions
  320. fmovel d0,fpsr
  321. |
  322. | Result is now in FP0
  323. |
  324. moveml a6@(USER_DA),d0-d1/a0-a1
  325. fmovemx a6@(USER_FP1),fp1-fp3 |  note: fp0 not restored
  326. fmovel a6@(USER_FPCR),fpcr | fpcr restored
  327. unlk a6
  328. rts
  329. .globl __l_fasind
  330. __l_fasind:
  331. link a6,#-LOCAL_SIZE
  332. moveml d0-d1/a0-a1,a6@(USER_DA)
  333. fmovemx fp0-fp3,a6@(USER_FP0)
  334. fmovel fpsr,a6@(USER_FPSR)
  335. fmovel fpcr,a6@(USER_FPCR)
  336. fmovel fpcr,d1 /* |  user's rounding mode/precision */
  337. fmovel #0,fpcr |  force rounding mode/prec to extended,rn
  338. |
  339. | copy, convert and tag input argument
  340. |
  341. fmoved a6@(8),fp0
  342. fmovex fp0,a6@(ETEMP)
  343. lea a6@(ETEMP),a0
  344. bsrl __l_tag
  345. moveb d0,a6@(STAG)
  346. tstb d0
  347. jne  L_1027
  348. bsrl __l_sasin |  normalized (regular) number
  349. jra  L_102B
  350. L_1027:
  351. cmpb #0x20,d0 |  zero?
  352. jne  L_1028
  353. bsrl __l_szero
  354. jra  L_102B
  355. L_1028:
  356. cmpb #0x40,d0 |  infinity?
  357. jne  L_1029
  358. bsrl __l_t_operr
  359. jra  L_102B
  360. L_1029:
  361. cmpb #0x60,d0 |  NaN?
  362. jne  L_102A
  363. bsrl __l_mon_nan
  364. jra  L_102B
  365. L_102A:
  366. bsrl __l_sasind |  assuming a denorm...
  367. L_102B:
  368. fmovel fpsr,d0 |  update status register
  369. orb a6@(USER_FPSR+3),d0 | add previously accrued exceptions
  370. fmovel d0,fpsr
  371. |
  372. | Result is now in FP0
  373. |
  374. moveml a6@(USER_DA),d0-d1/a0-a1
  375. fmovemx a6@(USER_FP1),fp1-fp3 |  note: fp0 not restored
  376. fmovel a6@(USER_FPCR),fpcr | fpcr restored
  377. unlk a6
  378. rts
  379. .globl __l_fasinx
  380. __l_fasinx:
  381. link a6,#-LOCAL_SIZE
  382. moveml d0-d1/a0-a1,a6@(USER_DA)
  383. fmovemx fp0-fp3,a6@(USER_FP0)
  384. fmovel fpsr,a6@(USER_FPSR)
  385. fmovel fpcr,a6@(USER_FPCR)
  386. fmovel fpcr,d1 /* |  user's rounding mode/precision */
  387. fmovel #0,fpcr |  force rounding mode/prec to extended,rn
  388. |
  389. | copy, convert and tag input argument
  390. |
  391. fmovex a6@(8),fp0
  392. fmovex fp0,a6@(ETEMP)
  393. lea a6@(ETEMP),a0
  394. bsrl __l_tag
  395. moveb d0,a6@(STAG)
  396. tstb d0
  397. jne  L_102C
  398. bsrl __l_sasin |  normalized (regular) number
  399. jra  L_102G
  400. L_102C:
  401. cmpb #0x20,d0 |  zero?
  402. jne  L_102D
  403. bsrl __l_szero
  404. jra  L_102G
  405. L_102D:
  406. cmpb #0x40,d0 |  infinity?
  407. jne  L_102E
  408. bsrl __l_t_operr
  409. jra  L_102G
  410. L_102E:
  411. cmpb #0x60,d0 |  NaN?
  412. jne  L_102F
  413. bsrl __l_mon_nan
  414. jra  L_102G
  415. L_102F:
  416. bsrl __l_sasind |  assuming a denorm...
  417. L_102G:
  418. fmovel fpsr,d0 |  update status register
  419. orb a6@(USER_FPSR+3),d0 | add previously accrued exceptions
  420. fmovel d0,fpsr
  421. |
  422. | Result is now in FP0
  423. |
  424. moveml a6@(USER_DA),d0-d1/a0-a1
  425. fmovemx a6@(USER_FP1),fp1-fp3 |  note: fp0 not restored
  426. fmovel a6@(USER_FPCR),fpcr | fpcr restored
  427. unlk a6
  428. rts
  429. |
  430. | MONADIC.GEN 1.3 4/30/91
  431. |
  432. | MONADIC.GEN --- generic MONADIC template
  433. |
  434. | This version saves all registers that will be used by the emulation
  435. | routines and restores all but FP0 on exit.  The FPSR is
  436. | updated to reflect the result of the operation.  Return value
  437. | is placed in FP0 for single, double and extended results.
  438. |
  439. | The package subroutines expect the incoming fpcr to be zeroed
  440. | since they need extended precision to work properly.  The
  441. /* | 'final' fpcr is expected in d1 so that the calculated result */
  442. | can be properly sized and rounded.  Also, if the incoming fpcr
  443. | has enabled any exceptions, the exception will be taken on the
  444. | final fmovem in this template.
  445. |
  446. | Customizations:
  447. | 1. Remove the moveml at the entry and exit of
  448. |    each routine if your compiler treats those
  449. |    registers as scratch.
  450. /* | 2. Likewise, don't save FP0/FP1 if they are scratch */
  451. |    registers.
  452. | 3. Delete handling of the fpsr if you only care about
  453. |    the result.
  454. | 4. Some (most?) C compilers convert all float arguments
  455. |    to double, and provide no support at all for extended
  456. |    precision so remove the __l_fatans and __l_fatanx entry points.
  457. | 5. Move the result to d0/d1 if the compiler is that old.
  458. | Copyright (C) Motorola, Inc. 1991
  459. | All Rights Reserved
  460. |
  461. | THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
  462. | The copyright notice above does not evidence any
  463. | actual or intended publication of such source code.
  464. | xref __l_tag
  465. | xref __l_satan
  466. | xref __l_szero
  467. | xref __l_spi_2
  468. | xref __l_mon_nan
  469. | xref __l_satand
  470. .globl __l_fatans
  471. __l_fatans:
  472. link a6,#-LOCAL_SIZE
  473. moveml d0-d1/a0-a1,a6@(USER_DA)
  474. fmovemx fp0-fp3,a6@(USER_FP0)
  475. fmovel fpsr,a6@(USER_FPSR)
  476. fmovel fpcr,a6@(USER_FPCR)
  477. fmovel fpcr,d1 /* |  user's rounding mode/precision */
  478. fmovel #0,fpcr |  force rounding mode/prec to extended,rn
  479. |
  480. | copy, convert and tag input argument
  481. |
  482. fmoves a6@(8),fp0
  483. fmovex fp0,a6@(ETEMP)
  484. lea a6@(ETEMP),a0
  485. bsrl __l_tag
  486. moveb d0,a6@(STAG)
  487. tstb d0
  488. jne  L_1032
  489. bsrl __l_satan |  normalized (regular) number
  490. jra  L_1036
  491. L_1032:
  492. cmpb #0x20,d0 |  zero?
  493. jne  L_1033
  494. bsrl __l_szero
  495. jra  L_1036
  496. L_1033:
  497. cmpb #0x40,d0 |  infinity?
  498. jne  L_1034
  499. bsrl __l_spi_2
  500. jra  L_1036
  501. L_1034:
  502. cmpb #0x60,d0 |  NaN?
  503. jne  L_1035
  504. bsrl __l_mon_nan
  505. jra  L_1036
  506. L_1035:
  507. bsrl __l_satand |  assuming a denorm...
  508. L_1036:
  509. fmovel fpsr,d0 |  update status register
  510. orb a6@(USER_FPSR+3),d0 | add previously accrued exceptions
  511. fmovel d0,fpsr
  512. |
  513. | Result is now in FP0
  514. |
  515. moveml a6@(USER_DA),d0-d1/a0-a1
  516. fmovemx a6@(USER_FP1),fp1-fp3 |  note: fp0 not restored
  517. fmovel a6@(USER_FPCR),fpcr | fpcr restored
  518. unlk a6
  519. rts
  520. .globl __l_fatand
  521. __l_fatand:
  522. link a6,#-LOCAL_SIZE
  523. moveml d0-d1/a0-a1,a6@(USER_DA)
  524. fmovemx fp0-fp3,a6@(USER_FP0)
  525. fmovel fpsr,a6@(USER_FPSR)
  526. fmovel fpcr,a6@(USER_FPCR)
  527. fmovel fpcr,d1 /* |  user's rounding mode/precision */
  528. fmovel #0,fpcr |  force rounding mode/prec to extended,rn
  529. |
  530. | copy, convert and tag input argument
  531. |
  532. fmoved a6@(8),fp0
  533. fmovex fp0,a6@(ETEMP)
  534. lea a6@(ETEMP),a0
  535. bsrl __l_tag
  536. moveb d0,a6@(STAG)
  537. tstb d0
  538. jne  L_1037
  539. bsrl __l_satan |  normalized (regular) number
  540. jra  L_103B
  541. L_1037:
  542. cmpb #0x20,d0 |  zero?
  543. jne  L_1038
  544. bsrl __l_szero
  545. jra  L_103B
  546. L_1038:
  547. cmpb #0x40,d0 |  infinity?
  548. jne  L_1039
  549. bsrl __l_spi_2
  550. jra  L_103B
  551. L_1039:
  552. cmpb #0x60,d0 |  NaN?
  553. jne  L_103A
  554. bsrl __l_mon_nan
  555. jra  L_103B
  556. L_103A:
  557. bsrl __l_satand |  assuming a denorm...
  558. L_103B:
  559. fmovel fpsr,d0 |  update status register
  560. orb a6@(USER_FPSR+3),d0 | add previously accrued exceptions
  561. fmovel d0,fpsr
  562. |
  563. | Result is now in FP0
  564. |
  565. moveml a6@(USER_DA),d0-d1/a0-a1
  566. fmovemx a6@(USER_FP1),fp1-fp3 |  note: fp0 not restored
  567. fmovel a6@(USER_FPCR),fpcr | fpcr restored
  568. unlk a6
  569. rts
  570. .globl __l_fatanx
  571. __l_fatanx:
  572. link a6,#-LOCAL_SIZE
  573. moveml d0-d1/a0-a1,a6@(USER_DA)
  574. fmovemx fp0-fp3,a6@(USER_FP0)
  575. fmovel fpsr,a6@(USER_FPSR)
  576. fmovel fpcr,a6@(USER_FPCR)
  577. fmovel fpcr,d1 /* |  user's rounding mode/precision */
  578. fmovel #0,fpcr |  force rounding mode/prec to extended,rn
  579. |
  580. | copy, convert and tag input argument
  581. |
  582. fmovex a6@(8),fp0
  583. fmovex fp0,a6@(ETEMP)
  584. lea a6@(ETEMP),a0
  585. bsrl __l_tag
  586. moveb d0,a6@(STAG)
  587. tstb d0
  588. jne  L_103C
  589. bsrl __l_satan |  normalized (regular) number
  590. jra  L_103G
  591. L_103C:
  592. cmpb #0x20,d0 |  zero?
  593. jne  L_103D
  594. bsrl __l_szero
  595. jra  L_103G
  596. L_103D:
  597. cmpb #0x40,d0 |  infinity?
  598. jne  L_103E
  599. bsrl __l_spi_2
  600. jra  L_103G
  601. L_103E:
  602. cmpb #0x60,d0 |  NaN?
  603. jne  L_103F
  604. bsrl __l_mon_nan
  605. jra  L_103G
  606. L_103F:
  607. bsrl __l_satand |  assuming a denorm...
  608. L_103G:
  609. fmovel fpsr,d0 |  update status register
  610. orb a6@(USER_FPSR+3),d0 | add previously accrued exceptions
  611. fmovel d0,fpsr
  612. |
  613. | Result is now in FP0
  614. |
  615. moveml a6@(USER_DA),d0-d1/a0-a1
  616. fmovemx a6@(USER_FP1),fp1-fp3 |  note: fp0 not restored
  617. fmovel a6@(USER_FPCR),fpcr | fpcr restored
  618. unlk a6
  619. rts
  620. |
  621. | MONADIC.GEN 1.3 4/30/91
  622. |
  623. | MONADIC.GEN --- generic MONADIC template
  624. |
  625. | This version saves all registers that will be used by the emulation
  626. | routines and restores all but FP0 on exit.  The FPSR is
  627. | updated to reflect the result of the operation.  Return value
  628. | is placed in FP0 for single, double and extended results.
  629. |
  630. | The package subroutines expect the incoming fpcr to be zeroed
  631. | since they need extended precision to work properly.  The
  632. /* | 'final' fpcr is expected in d1 so that the calculated result */
  633. | can be properly sized and rounded.  Also, if the incoming fpcr
  634. | has enabled any exceptions, the exception will be taken on the
  635. | final fmovem in this template.
  636. |
  637. | Customizations:
  638. | 1. Remove the moveml at the entry and exit of
  639. |    each routine if your compiler treats those
  640. |    registers as scratch.
  641. /* | 2. Likewise, don't save FP0/FP1 if they are scratch */
  642. |    registers.
  643. | 3. Delete handling of the fpsr if you only care about
  644. |    the result.
  645. | 4. Some (most?) C compilers convert all float arguments
  646. |    to double, and provide no support at all for extended
  647. |    precision so remove the __l_fatanhs and __l_fatanhx entry points.
  648. | 5. Move the result to d0/d1 if the compiler is that old.
  649. | Copyright (C) Motorola, Inc. 1991
  650. | All Rights Reserved
  651. |
  652. | THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
  653. | The copyright notice above does not evidence any
  654. | actual or intended publication of such source code.
  655. | xref __l_tag
  656. | xref __l_satanh
  657. | xref __l_szero
  658. | xref __l_t_operr
  659. | xref __l_mon_nan
  660. | xref __l_satanhd
  661. .globl __l_fatanhs
  662. __l_fatanhs:
  663. link a6,#-LOCAL_SIZE
  664. moveml d0-d1/a0-a1,a6@(USER_DA)
  665. fmovemx fp0-fp3,a6@(USER_FP0)
  666. fmovel fpsr,a6@(USER_FPSR)
  667. fmovel fpcr,a6@(USER_FPCR)
  668. fmovel fpcr,d1 /* |  user's rounding mode/precision */
  669. fmovel #0,fpcr |  force rounding mode/prec to extended,rn
  670. |
  671. | copy, convert and tag input argument
  672. |
  673. fmoves a6@(8),fp0
  674. fmovex fp0,a6@(ETEMP)
  675. lea a6@(ETEMP),a0
  676. bsrl __l_tag
  677. moveb d0,a6@(STAG)
  678. tstb d0
  679. jne  L_1042
  680. bsrl __l_satanh |  normalized (regular) number
  681. jra  L_1046
  682. L_1042:
  683. cmpb #0x20,d0 |  zero?
  684. jne  L_1043
  685. bsrl __l_szero
  686. jra  L_1046
  687. L_1043:
  688. cmpb #0x40,d0 |  infinity?
  689. jne  L_1044
  690. bsrl __l_t_operr
  691. jra  L_1046
  692. L_1044:
  693. cmpb #0x60,d0 |  NaN?
  694. jne  L_1045
  695. bsrl __l_mon_nan
  696. jra  L_1046
  697. L_1045:
  698. bsrl __l_satanhd |  assuming a denorm...
  699. L_1046:
  700. fmovel fpsr,d0 |  update status register
  701. orb a6@(USER_FPSR+3),d0 | add previously accrued exceptions
  702. fmovel d0,fpsr
  703. |
  704. | Result is now in FP0
  705. |
  706. moveml a6@(USER_DA),d0-d1/a0-a1
  707. fmovemx a6@(USER_FP1),fp1-fp3 |  note: fp0 not restored
  708. fmovel a6@(USER_FPCR),fpcr | fpcr restored
  709. unlk a6
  710. rts
  711. .globl __l_fatanhd
  712. __l_fatanhd:
  713. link a6,#-LOCAL_SIZE
  714. moveml d0-d1/a0-a1,a6@(USER_DA)
  715. fmovemx fp0-fp3,a6@(USER_FP0)
  716. fmovel fpsr,a6@(USER_FPSR)
  717. fmovel fpcr,a6@(USER_FPCR)
  718. fmovel fpcr,d1 /* |  user's rounding mode/precision */
  719. fmovel #0,fpcr |  force rounding mode/prec to extended,rn
  720. |
  721. | copy, convert and tag input argument
  722. |
  723. fmoved a6@(8),fp0
  724. fmovex fp0,a6@(ETEMP)
  725. lea a6@(ETEMP),a0
  726. bsrl __l_tag
  727. moveb d0,a6@(STAG)
  728. tstb d0
  729. jne  L_1047
  730. bsrl __l_satanh |  normalized (regular) number
  731. jra  L_104B
  732. L_1047:
  733. cmpb #0x20,d0 |  zero?
  734. jne  L_1048
  735. bsrl __l_szero
  736. jra  L_104B
  737. L_1048:
  738. cmpb #0x40,d0 |  infinity?
  739. jne  L_1049
  740. bsrl __l_t_operr
  741. jra  L_104B
  742. L_1049:
  743. cmpb #0x60,d0 |  NaN?
  744. jne  L_104A
  745. bsrl __l_mon_nan
  746. jra  L_104B
  747. L_104A:
  748. bsrl __l_satanhd |  assuming a denorm...
  749. L_104B:
  750. fmovel fpsr,d0 |  update status register
  751. orb a6@(USER_FPSR+3),d0 | add previously accrued exceptions
  752. fmovel d0,fpsr
  753. |
  754. | Result is now in FP0
  755. |
  756. moveml a6@(USER_DA),d0-d1/a0-a1
  757. fmovemx a6@(USER_FP1),fp1-fp3 |  note: fp0 not restored
  758. fmovel a6@(USER_FPCR),fpcr | fpcr restored
  759. unlk a6
  760. rts
  761. .globl __l_fatanhx
  762. __l_fatanhx:
  763. link a6,#-LOCAL_SIZE
  764. moveml d0-d1/a0-a1,a6@(USER_DA)
  765. fmovemx fp0-fp3,a6@(USER_FP0)
  766. fmovel fpsr,a6@(USER_FPSR)
  767. fmovel fpcr,a6@(USER_FPCR)
  768. fmovel fpcr,d1 /* |  user's rounding mode/precision */
  769. fmovel #0,fpcr |  force rounding mode/prec to extended,rn
  770. |
  771. | copy, convert and tag input argument
  772. |
  773. fmovex a6@(8),fp0
  774. fmovex fp0,a6@(ETEMP)
  775. lea a6@(ETEMP),a0
  776. bsrl __l_tag
  777. moveb d0,a6@(STAG)
  778. tstb d0
  779. jne  L_104C
  780. bsrl __l_satanh |  normalized (regular) number
  781. jra  L_104G
  782. L_104C:
  783. cmpb #0x20,d0 |  zero?
  784. jne  L_104D
  785. bsrl __l_szero
  786. jra  L_104G
  787. L_104D:
  788. cmpb #0x40,d0 |  infinity?
  789. jne  L_104E
  790. bsrl __l_t_operr
  791. jra  L_104G
  792. L_104E:
  793. cmpb #0x60,d0 |  NaN?
  794. jne  L_104F
  795. bsrl __l_mon_nan
  796. jra  L_104G
  797. L_104F:
  798. bsrl __l_satanhd |  assuming a denorm...
  799. L_104G:
  800. fmovel fpsr,d0 |  update status register
  801. orb a6@(USER_FPSR+3),d0 | add previously accrued exceptions
  802. fmovel d0,fpsr
  803. |
  804. | Result is now in FP0
  805. |
  806. moveml a6@(USER_DA),d0-d1/a0-a1
  807. fmovemx a6@(USER_FP1),fp1-fp3 |  note: fp0 not restored
  808. fmovel a6@(USER_FPCR),fpcr | fpcr restored
  809. unlk a6
  810. rts
  811. |
  812. | MONADIC.GEN 1.3 4/30/91
  813. |
  814. | MONADIC.GEN --- generic MONADIC template
  815. |
  816. | This version saves all registers that will be used by the emulation
  817. | routines and restores all but FP0 on exit.  The FPSR is
  818. | updated to reflect the result of the operation.  Return value
  819. | is placed in FP0 for single, double and extended results.
  820. |
  821. | The package subroutines expect the incoming fpcr to be zeroed
  822. | since they need extended precision to work properly.  The
  823. /* | 'final' fpcr is expected in d1 so that the calculated result */
  824. | can be properly sized and rounded.  Also, if the incoming fpcr
  825. | has enabled any exceptions, the exception will be taken on the
  826. | final fmovem in this template.
  827. |
  828. | Customizations:
  829. | 1. Remove the moveml at the entry and exit of
  830. |    each routine if your compiler treats those
  831. |    registers as scratch.
  832. /* | 2. Likewise, don't save FP0/FP1 if they are scratch */
  833. |    registers.
  834. | 3. Delete handling of the fpsr if you only care about
  835. |    the result.
  836. | 4. Some (most?) C compilers convert all float arguments
  837. |    to double, and provide no support at all for extended
  838. |    precision so remove the __l_fcoss and __l_fcosx entry points.
  839. | 5. Move the result to d0/d1 if the compiler is that old.
  840. | Copyright (C) Motorola, Inc. 1991
  841. | All Rights Reserved
  842. |
  843. | THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
  844. | The copyright notice above does not evidence any
  845. | actual or intended publication of such source code.
  846. | xref __l_tag
  847. | xref __l_scos
  848. | xref __l_ld_pone
  849. | xref __l_t_operr
  850. | xref __l_mon_nan
  851. | xref __l_scosd
  852. .globl __l_fcoss
  853. __l_fcoss:
  854. link a6,#-LOCAL_SIZE
  855. moveml d0-d1/a0-a1,a6@(USER_DA)
  856. fmovemx fp0-fp3,a6@(USER_FP0)
  857. fmovel fpsr,a6@(USER_FPSR)
  858. fmovel fpcr,a6@(USER_FPCR)
  859. fmovel fpcr,d1 /* |  user's rounding mode/precision */
  860. fmovel #0,fpcr |  force rounding mode/prec to extended,rn
  861. |
  862. | copy, convert and tag input argument
  863. |
  864. fmoves a6@(8),fp0
  865. fmovex fp0,a6@(ETEMP)
  866. lea a6@(ETEMP),a0
  867. bsrl __l_tag
  868. moveb d0,a6@(STAG)
  869. tstb d0
  870. jne  L_1052
  871. bsrl __l_scos |  normalized (regular) number
  872. jra  L_1056
  873. L_1052:
  874. cmpb #0x20,d0 |  zero?
  875. jne  L_1053
  876. bsrl __l_ld_pone
  877. jra  L_1056
  878. L_1053:
  879. cmpb #0x40,d0 |  infinity?
  880. jne  L_1054
  881. bsrl __l_t_operr
  882. jra  L_1056
  883. L_1054:
  884. cmpb #0x60,d0 |  NaN?
  885. jne  L_1055
  886. bsrl __l_mon_nan
  887. jra  L_1056
  888. L_1055:
  889. bsrl __l_scosd |  assuming a denorm...
  890. L_1056:
  891. fmovel fpsr,d0 |  update status register
  892. orb a6@(USER_FPSR+3),d0 | add previously accrued exceptions
  893. fmovel d0,fpsr
  894. |
  895. | Result is now in FP0
  896. |
  897. moveml a6@(USER_DA),d0-d1/a0-a1
  898. fmovemx a6@(USER_FP1),fp1-fp3 |  note: fp0 not restored
  899. fmovel a6@(USER_FPCR),fpcr | fpcr restored
  900. unlk a6
  901. rts
  902. .globl __l_fcosd
  903. __l_fcosd:
  904. link a6,#-LOCAL_SIZE
  905. moveml d0-d1/a0-a1,a6@(USER_DA)
  906. fmovemx fp0-fp3,a6@(USER_FP0)
  907. fmovel fpsr,a6@(USER_FPSR)
  908. fmovel fpcr,a6@(USER_FPCR)
  909. fmovel fpcr,d1 /* |  user's rounding mode/precision */
  910. fmovel #0,fpcr |  force rounding mode/prec to extended,rn
  911. |
  912. | copy, convert and tag input argument
  913. |
  914. fmoved a6@(8),fp0
  915. fmovex fp0,a6@(ETEMP)
  916. lea a6@(ETEMP),a0
  917. bsrl __l_tag
  918. moveb d0,a6@(STAG)
  919. tstb d0
  920. jne  L_1057
  921. bsrl __l_scos |  normalized (regular) number
  922. jra  L_105B
  923. L_1057:
  924. cmpb #0x20,d0 |  zero?
  925. jne  L_1058
  926. bsrl __l_ld_pone
  927. jra  L_105B
  928. L_1058:
  929. cmpb #0x40,d0 |  infinity?
  930. jne  L_1059
  931. bsrl __l_t_operr
  932. jra  L_105B
  933. L_1059:
  934. cmpb #0x60,d0 |  NaN?
  935. jne  L_105A
  936. bsrl __l_mon_nan
  937. jra  L_105B
  938. L_105A:
  939. bsrl __l_scosd |  assuming a denorm...
  940. L_105B:
  941. fmovel fpsr,d0 |  update status register
  942. orb a6@(USER_FPSR+3),d0 | add previously accrued exceptions
  943. fmovel d0,fpsr
  944. |
  945. | Result is now in FP0
  946. |
  947. moveml a6@(USER_DA),d0-d1/a0-a1
  948. fmovemx a6@(USER_FP1),fp1-fp3 |  note: fp0 not restored
  949. fmovel a6@(USER_FPCR),fpcr | fpcr restored
  950. unlk a6
  951. rts
  952. .globl __l_fcosx
  953. __l_fcosx:
  954. link a6,#-LOCAL_SIZE
  955. moveml d0-d1/a0-a1,a6@(USER_DA)
  956. fmovemx fp0-fp3,a6@(USER_FP0)
  957. fmovel fpsr,a6@(USER_FPSR)
  958. fmovel fpcr,a6@(USER_FPCR)
  959. fmovel fpcr,d1 /* |  user's rounding mode/precision */
  960. fmovel #0,fpcr |  force rounding mode/prec to extended,rn
  961. |
  962. | copy, convert and tag input argument
  963. |
  964. fmovex a6@(8),fp0
  965. fmovex fp0,a6@(ETEMP)
  966. lea a6@(ETEMP),a0
  967. bsrl __l_tag
  968. moveb d0,a6@(STAG)
  969. tstb d0
  970. jne  L_105C
  971. bsrl __l_scos |  normalized (regular) number
  972. jra  L_105G
  973. L_105C:
  974. cmpb #0x20,d0 |  zero?
  975. jne  L_105D
  976. bsrl __l_ld_pone
  977. jra  L_105G
  978. L_105D:
  979. cmpb #0x40,d0 |  infinity?
  980. jne  L_105E
  981. bsrl __l_t_operr
  982. jra  L_105G
  983. L_105E:
  984. cmpb #0x60,d0 |  NaN?
  985. jne  L_105F
  986. bsrl __l_mon_nan
  987. jra  L_105G
  988. L_105F:
  989. bsrl __l_scosd |  assuming a denorm...
  990. L_105G:
  991. fmovel fpsr,d0 |  update status register
  992. orb a6@(USER_FPSR+3),d0 | add previously accrued exceptions
  993. fmovel d0,fpsr
  994. |
  995. | Result is now in FP0
  996. |
  997. moveml a6@(USER_DA),d0-d1/a0-a1
  998. fmovemx a6@(USER_FP1),fp1-fp3 |  note: fp0 not restored
  999. fmovel a6@(USER_FPCR),fpcr | fpcr restored
  1000. unlk a6
  1001. rts
  1002. |
  1003. | MONADIC.GEN 1.3 4/30/91
  1004. |
  1005. | MONADIC.GEN --- generic MONADIC template
  1006. |
  1007. | This version saves all registers that will be used by the emulation
  1008. | routines and restores all but FP0 on exit.  The FPSR is
  1009. | updated to reflect the result of the operation.  Return value
  1010. | is placed in FP0 for single, double and extended results.
  1011. |
  1012. | The package subroutines expect the incoming fpcr to be zeroed
  1013. | since they need extended precision to work properly.  The
  1014. /* | 'final' fpcr is expected in d1 so that the calculated result */
  1015. | can be properly sized and rounded.  Also, if the incoming fpcr
  1016. | has enabled any exceptions, the exception will be taken on the
  1017. | final fmovem in this template.
  1018. |
  1019. | Customizations:
  1020. | 1. Remove the moveml at the entry and exit of
  1021. |    each routine if your compiler treats those
  1022. |    registers as scratch.
  1023. /* | 2. Likewise, don't save FP0/FP1 if they are scratch */
  1024. |    registers.
  1025. | 3. Delete handling of the fpsr if you only care about
  1026. |    the result.
  1027. | 4. Some (most?) C compilers convert all float arguments
  1028. |    to double, and provide no support at all for extended
  1029. |    precision so remove the __l_fcoshs and __l_fcoshx entry points.
  1030. | 5. Move the result to d0/d1 if the compiler is that old.
  1031. | Copyright (C) Motorola, Inc. 1991
  1032. | All Rights Reserved
  1033. |
  1034. | THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
  1035. | The copyright notice above does not evidence any
  1036. | actual or intended publication of such source code.
  1037. | xref __l_tag
  1038. | xref __l_scosh
  1039. | xref __l_ld_pone
  1040. | xref __l_ld_pinf
  1041. | xref __l_mon_nan
  1042. | xref __l_scoshd
  1043. .globl __l_fcoshs
  1044. __l_fcoshs:
  1045. link a6,#-LOCAL_SIZE
  1046. moveml d0-d1/a0-a1,a6@(USER_DA)
  1047. fmovemx fp0-fp3,a6@(USER_FP0)
  1048. fmovel fpsr,a6@(USER_FPSR)
  1049. fmovel fpcr,a6@(USER_FPCR)
  1050. fmovel fpcr,d1 /* |  user's rounding mode/precision */
  1051. fmovel #0,fpcr |  force rounding mode/prec to extended,rn
  1052. |
  1053. | copy, convert and tag input argument
  1054. |
  1055. fmoves a6@(8),fp0
  1056. fmovex fp0,a6@(ETEMP)
  1057. lea a6@(ETEMP),a0
  1058. bsrl __l_tag
  1059. moveb d0,a6@(STAG)
  1060. tstb d0
  1061. jne  L_1062
  1062. bsrl __l_scosh |  normalized (regular) number
  1063. jra  L_1066
  1064. L_1062:
  1065. cmpb #0x20,d0 |  zero?
  1066. jne  L_1063
  1067. bsrl __l_ld_pone
  1068. jra  L_1066
  1069. L_1063:
  1070. cmpb #0x40,d0 |  infinity?
  1071. jne  L_1064
  1072. bsrl __l_ld_pinf
  1073. jra  L_1066
  1074. L_1064:
  1075. cmpb #0x60,d0 |  NaN?
  1076. jne  L_1065
  1077. bsrl __l_mon_nan
  1078. jra  L_1066
  1079. L_1065:
  1080. bsrl __l_scoshd |  assuming a denorm...
  1081. L_1066:
  1082. fmovel fpsr,d0 |  update status register
  1083. orb a6@(USER_FPSR+3),d0 | add previously accrued exceptions
  1084. fmovel d0,fpsr
  1085. |
  1086. | Result is now in FP0
  1087. |
  1088. moveml a6@(USER_DA),d0-d1/a0-a1
  1089. fmovemx a6@(USER_FP1),fp1-fp3 |  note: fp0 not restored
  1090. fmovel a6@(USER_FPCR),fpcr | fpcr restored
  1091. unlk a6
  1092. rts
  1093. .globl __l_fcoshd
  1094. __l_fcoshd:
  1095. link a6,#-LOCAL_SIZE
  1096. moveml d0-d1/a0-a1,a6@(USER_DA)
  1097. fmovemx fp0-fp3,a6@(USER_FP0)
  1098. fmovel fpsr,a6@(USER_FPSR)
  1099. fmovel fpcr,a6@(USER_FPCR)
  1100. fmovel fpcr,d1 /* |  user's rounding mode/precision */
  1101. fmovel #0,fpcr |  force rounding mode/prec to extended,rn
  1102. |
  1103. | copy, convert and tag input argument
  1104. |
  1105. fmoved a6@(8),fp0
  1106. fmovex fp0,a6@(ETEMP)
  1107. lea a6@(ETEMP),a0
  1108. bsrl __l_tag
  1109. moveb d0,a6@(STAG)
  1110. tstb d0
  1111. jne  L_1067
  1112. bsrl __l_scosh |  normalized (regular) number
  1113. jra  L_106B
  1114. L_1067:
  1115. cmpb #0x20,d0 |  zero?
  1116. jne  L_1068
  1117. bsrl __l_ld_pone
  1118. jra  L_106B
  1119. L_1068:
  1120. cmpb #0x40,d0 |  infinity?
  1121. jne  L_1069
  1122. bsrl __l_ld_pinf
  1123. jra  L_106B
  1124. L_1069:
  1125. cmpb #0x60,d0 |  NaN?
  1126. jne  L_106A
  1127. bsrl __l_mon_nan
  1128. jra  L_106B
  1129. L_106A:
  1130. bsrl __l_scoshd |  assuming a denorm...
  1131. L_106B:
  1132. fmovel fpsr,d0 |  update status register
  1133. orb a6@(USER_FPSR+3),d0 | add previously accrued exceptions
  1134. fmovel d0,fpsr
  1135. |
  1136. | Result is now in FP0
  1137. |
  1138. moveml a6@(USER_DA),d0-d1/a0-a1
  1139. fmovemx a6@(USER_FP1),fp1-fp3 |  note: fp0 not restored
  1140. fmovel a6@(USER_FPCR),fpcr | fpcr restored
  1141. unlk a6
  1142. rts
  1143. .globl __l_fcoshx
  1144. __l_fcoshx:
  1145. link a6,#-LOCAL_SIZE
  1146. moveml d0-d1/a0-a1,a6@(USER_DA)
  1147. fmovemx fp0-fp3,a6@(USER_FP0)
  1148. fmovel fpsr,a6@(USER_FPSR)
  1149. fmovel fpcr,a6@(USER_FPCR)
  1150. fmovel fpcr,d1 /* |  user's rounding mode/precision */
  1151. fmovel #0,fpcr |  force rounding mode/prec to extended,rn
  1152. |
  1153. | copy, convert and tag input argument
  1154. |
  1155. fmovex a6@(8),fp0
  1156. fmovex fp0,a6@(ETEMP)
  1157. lea a6@(ETEMP),a0
  1158. bsrl __l_tag
  1159. moveb d0,a6@(STAG)
  1160. tstb d0
  1161. jne  L_106C
  1162. bsrl __l_scosh |  normalized (regular) number
  1163. jra  L_106G
  1164. L_106C:
  1165. cmpb #0x20,d0 |  zero?
  1166. jne  L_106D
  1167. bsrl __l_ld_pone
  1168. jra  L_106G
  1169. L_106D:
  1170. cmpb #0x40,d0 |  infinity?
  1171. jne  L_106E
  1172. bsrl __l_ld_pinf
  1173. jra  L_106G
  1174. L_106E:
  1175. cmpb #0x60,d0 |  NaN?
  1176. jne  L_106F
  1177. bsrl __l_mon_nan
  1178. jra  L_106G
  1179. L_106F:
  1180. bsrl __l_scoshd |  assuming a denorm...
  1181. L_106G:
  1182. fmovel fpsr,d0 |  update status register
  1183. orb a6@(USER_FPSR+3),d0 | add previously accrued exceptions
  1184. fmovel d0,fpsr
  1185. |
  1186. | Result is now in FP0
  1187. |
  1188. moveml a6@(USER_DA),d0-d1/a0-a1
  1189. fmovemx a6@(USER_FP1),fp1-fp3 |  note: fp0 not restored
  1190. fmovel a6@(USER_FPCR),fpcr | fpcr restored
  1191. unlk a6
  1192. rts
  1193. |
  1194. | MONADIC.GEN 1.3 4/30/91
  1195. |
  1196. | MONADIC.GEN --- generic MONADIC template
  1197. |
  1198. | This version saves all registers that will be used by the emulation
  1199. | routines and restores all but FP0 on exit.  The FPSR is
  1200. | updated to reflect the result of the operation.  Return value
  1201. | is placed in FP0 for single, double and extended results.
  1202. |
  1203. | The package subroutines expect the incoming fpcr to be zeroed
  1204. | since they need extended precision to work properly.  The
  1205. /* | 'final' fpcr is expected in d1 so that the calculated result */
  1206. | can be properly sized and rounded.  Also, if the incoming fpcr
  1207. | has enabled any exceptions, the exception will be taken on the
  1208. | final fmovem in this template.
  1209. |
  1210. | Customizations:
  1211. | 1. Remove the moveml at the entry and exit of
  1212. |    each routine if your compiler treats those
  1213. |    registers as scratch.
  1214. /* | 2. Likewise, don't save FP0/FP1 if they are scratch */
  1215. |    registers.
  1216. | 3. Delete handling of the fpsr if you only care about
  1217. |    the result.
  1218. | 4. Some (most?) C compilers convert all float arguments
  1219. |    to double, and provide no support at all for extended
  1220. |    precision so remove the __l_fetoxs and __l_fetoxx entry points.
  1221. | 5. Move the result to d0/d1 if the compiler is that old.
  1222. | Copyright (C) Motorola, Inc. 1991
  1223. | All Rights Reserved
  1224. |
  1225. | THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
  1226. | The copyright notice above does not evidence any
  1227. | actual or intended publication of such source code.
  1228. | xref __l_tag
  1229. | xref __l_setox
  1230. | xref __l_ld_pone
  1231. | xref __l_szr_inf
  1232. | xref __l_mon_nan
  1233. | xref __l_setoxd
  1234. .globl __l_fetoxs
  1235. __l_fetoxs:
  1236. link a6,#-LOCAL_SIZE
  1237. moveml d0-d1/a0-a1,a6@(USER_DA)
  1238. fmovemx fp0-fp3,a6@(USER_FP0)
  1239. fmovel fpsr,a6@(USER_FPSR)
  1240. fmovel fpcr,a6@(USER_FPCR)
  1241. fmovel fpcr,d1 /* |  user's rounding mode/precision */
  1242. fmovel #0,fpcr |  force rounding mode/prec to extended,rn
  1243. |
  1244. | copy, convert and tag input argument
  1245. |
  1246. fmoves a6@(8),fp0
  1247. fmovex fp0,a6@(ETEMP)
  1248. lea a6@(ETEMP),a0
  1249. bsrl __l_tag
  1250. moveb d0,a6@(STAG)
  1251. tstb d0
  1252. jne  L_1072
  1253. bsrl __l_setox |  normalized (regular) number
  1254. jra  L_1076
  1255. L_1072:
  1256. cmpb #0x20,d0 |  zero?
  1257. jne  L_1073
  1258. bsrl __l_ld_pone
  1259. jra  L_1076
  1260. L_1073:
  1261. cmpb #0x40,d0 |  infinity?
  1262. jne  L_1074
  1263. bsrl __l_szr_inf
  1264. jra  L_1076
  1265. L_1074:
  1266. cmpb #0x60,d0 |  NaN?
  1267. jne  L_1075
  1268. bsrl __l_mon_nan
  1269. jra  L_1076
  1270. L_1075:
  1271. bsrl __l_setoxd |  assuming a denorm...
  1272. L_1076:
  1273. fmovel fpsr,d0 |  update status register
  1274. orb a6@(USER_FPSR+3),d0 | add previously accrued exceptions
  1275. fmovel d0,fpsr
  1276. |
  1277. | Result is now in FP0
  1278. |
  1279. moveml a6@(USER_DA),d0-d1/a0-a1
  1280. fmovemx a6@(USER_FP1),fp1-fp3 |  note: fp0 not restored
  1281. fmovel a6@(USER_FPCR),fpcr | fpcr restored
  1282. unlk a6
  1283. rts
  1284. .globl __l_fetoxd
  1285. __l_fetoxd:
  1286. link a6,#-LOCAL_SIZE
  1287. moveml d0-d1/a0-a1,a6@(USER_DA)
  1288. fmovemx fp0-fp3,a6@(USER_FP0)
  1289. fmovel fpsr,a6@(USER_FPSR)
  1290. fmovel fpcr,a6@(USER_FPCR)
  1291. fmovel fpcr,d1 /* |  user's rounding mode/precision */
  1292. fmovel #0,fpcr |  force rounding mode/prec to extended,rn
  1293. |
  1294. | copy, convert and tag input argument
  1295. |
  1296. fmoved a6@(8),fp0
  1297. fmovex fp0,a6@(ETEMP)
  1298. lea a6@(ETEMP),a0
  1299. bsrl __l_tag
  1300. moveb d0,a6@(STAG)
  1301. tstb d0
  1302. jne  L_1077
  1303. bsrl __l_setox |  normalized (regular) number
  1304. jra  L_107B
  1305. L_1077:
  1306. cmpb #0x20,d0 |  zero?
  1307. jne  L_1078
  1308. bsrl __l_ld_pone
  1309. jra  L_107B
  1310. L_1078:
  1311. cmpb #0x40,d0 |  infinity?
  1312. jne  L_1079
  1313. bsrl __l_szr_inf
  1314. jra  L_107B
  1315. L_1079:
  1316. cmpb #0x60,d0 |  NaN?
  1317. jne  L_107A
  1318. bsrl __l_mon_nan
  1319. jra  L_107B
  1320. L_107A:
  1321. bsrl __l_setoxd |  assuming a denorm...
  1322. L_107B:
  1323. fmovel fpsr,d0 |  update status register
  1324. orb a6@(USER_FPSR+3),d0 | add previously accrued exceptions
  1325. fmovel d0,fpsr
  1326. |
  1327. | Result is now in FP0
  1328. |
  1329. moveml a6@(USER_DA),d0-d1/a0-a1
  1330. fmovemx a6@(USER_FP1),fp1-fp3 |  note: fp0 not restored
  1331. fmovel a6@(USER_FPCR),fpcr | fpcr restored
  1332. unlk a6
  1333. rts
  1334. .globl __l_fetoxx
  1335. __l_fetoxx:
  1336. link a6,#-LOCAL_SIZE
  1337. moveml d0-d1/a0-a1,a6@(USER_DA)
  1338. fmovemx fp0-fp3,a6@(USER_FP0)
  1339. fmovel fpsr,a6@(USER_FPSR)
  1340. fmovel fpcr,a6@(USER_FPCR)
  1341. fmovel fpcr,d1 /* |  user's rounding mode/precision */
  1342. fmovel #0,fpcr |  force rounding mode/prec to extended,rn
  1343. |
  1344. | copy, convert and tag input argument
  1345. |
  1346. fmovex a6@(8),fp0
  1347. fmovex fp0,a6@(ETEMP)
  1348. lea a6@(ETEMP),a0
  1349. bsrl __l_tag
  1350. moveb d0,a6@(STAG)
  1351. tstb d0
  1352. jne  L_107C
  1353. bsrl __l_setox |  normalized (regular) number
  1354. jra  L_107G
  1355. L_107C:
  1356. cmpb #0x20,d0 |  zero?
  1357. jne  L_107D
  1358. bsrl __l_ld_pone
  1359. jra  L_107G
  1360. L_107D:
  1361. cmpb #0x40,d0 |  infinity?
  1362. jne  L_107E
  1363. bsrl __l_szr_inf
  1364. jra  L_107G
  1365. L_107E:
  1366. cmpb #0x60,d0 |  NaN?
  1367. jne  L_107F
  1368. bsrl __l_mon_nan
  1369. jra  L_107G
  1370. L_107F:
  1371. bsrl __l_setoxd |  assuming a denorm...
  1372. L_107G:
  1373. fmovel fpsr,d0 |  update status register
  1374. orb a6@(USER_FPSR+3),d0 | add previously accrued exceptions
  1375. fmovel d0,fpsr
  1376. |
  1377. | Result is now in FP0
  1378. |
  1379. moveml a6@(USER_DA),d0-d1/a0-a1
  1380. fmovemx a6@(USER_FP1),fp1-fp3 |  note: fp0 not restored
  1381. fmovel a6@(USER_FPCR),fpcr | fpcr restored
  1382. unlk a6
  1383. rts
  1384. |
  1385. | MONADIC.GEN 1.3 4/30/91
  1386. |
  1387. | MONADIC.GEN --- generic MONADIC template
  1388. |
  1389. | This version saves all registers that will be used by the emulation
  1390. | routines and restores all but FP0 on exit.  The FPSR is
  1391. | updated to reflect the result of the operation.  Return value
  1392. | is placed in FP0 for single, double and extended results.
  1393. |
  1394. | The package subroutines expect the incoming fpcr to be zeroed
  1395. | since they need extended precision to work properly.  The
  1396. /* | 'final' fpcr is expected in d1 so that the calculated result */
  1397. | can be properly sized and rounded.  Also, if the incoming fpcr
  1398. | has enabled any exceptions, the exception will be taken on the
  1399. | final fmovem in this template.
  1400. |
  1401. | Customizations:
  1402. | 1. Remove the moveml at the entry and exit of
  1403. |    each routine if your compiler treats those
  1404. |    registers as scratch.
  1405. /* | 2. Likewise, don't save FP0/FP1 if they are scratch */
  1406. |    registers.
  1407. | 3. Delete handling of the fpsr if you only care about
  1408. |    the result.
  1409. | 4. Some (most?) C compilers convert all float arguments
  1410. |    to double, and provide no support at all for extended
  1411. |    precision so remove the __l_fetoxm1s and __l_fetoxm1x entry points.
  1412. | 5. Move the result to d0/d1 if the compiler is that old.
  1413. | Copyright (C) Motorola, Inc. 1991
  1414. | All Rights Reserved
  1415. |
  1416. | THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
  1417. | The copyright notice above does not evidence any
  1418. | actual or intended publication of such source code.
  1419. | xref __l_tag
  1420. | xref __l_setoxm1
  1421. | xref __l_szero
  1422. | xref __l_setoxm1i
  1423. | xref __l_mon_nan
  1424. | xref __l_setoxm1d
  1425. .globl __l_fetoxm1s
  1426. __l_fetoxm1s:
  1427. link a6,#-LOCAL_SIZE
  1428. moveml d0-d1/a0-a1,a6@(USER_DA)
  1429. fmovemx fp0-fp3,a6@(USER_FP0)
  1430. fmovel fpsr,a6@(USER_FPSR)
  1431. fmovel fpcr,a6@(USER_FPCR)
  1432. fmovel fpcr,d1 /* |  user's rounding mode/precision */
  1433. fmovel #0,fpcr |  force rounding mode/prec to extended,rn
  1434. |
  1435. | copy, convert and tag input argument
  1436. |
  1437. fmoves a6@(8),fp0
  1438. fmovex fp0,a6@(ETEMP)
  1439. lea a6@(ETEMP),a0
  1440. bsrl __l_tag
  1441. moveb d0,a6@(STAG)
  1442. tstb d0
  1443. jne  L_1082
  1444. bsrl __l_setoxm1 |  normalized (regular) number
  1445. jra  L_1086
  1446. L_1082:
  1447. cmpb #0x20,d0 |  zero?
  1448. jne  L_1083
  1449. bsrl __l_szero
  1450. jra  L_1086
  1451. L_1083:
  1452. cmpb #0x40,d0 |  infinity?
  1453. jne  L_1084
  1454. bsrl __l_setoxm1i
  1455. jra  L_1086
  1456. L_1084:
  1457. cmpb #0x60,d0 |  NaN?
  1458. jne  L_1085
  1459. bsrl __l_mon_nan
  1460. jra  L_1086
  1461. L_1085:
  1462. bsrl __l_setoxm1d |  assuming a denorm...
  1463. L_1086:
  1464. fmovel fpsr,d0 |  update status register
  1465. orb a6@(USER_FPSR+3),d0 | add previously accrued exceptions
  1466. fmovel d0,fpsr
  1467. |
  1468. | Result is now in FP0
  1469. |
  1470. moveml a6@(USER_DA),d0-d1/a0-a1
  1471. fmovemx a6@(USER_FP1),fp1-fp3 |  note: fp0 not restored
  1472. fmovel a6@(USER_FPCR),fpcr | fpcr restored
  1473. unlk a6
  1474. rts
  1475. .globl __l_fetoxm1d
  1476. __l_fetoxm1d:
  1477. link a6,#-LOCAL_SIZE
  1478. moveml d0-d1/a0-a1,a6@(USER_DA)
  1479. fmovemx fp0-fp3,a6@(USER_FP0)
  1480. fmovel fpsr,a6@(USER_FPSR)
  1481. fmovel fpcr,a6@(USER_FPCR)
  1482. fmovel fpcr,d1 /* |  user's rounding mode/precision */
  1483. fmovel #0,fpcr |  force rounding mode/prec to extended,rn
  1484. |
  1485. | copy, convert and tag input argument
  1486. |
  1487. fmoved a6@(8),fp0
  1488. fmovex fp0,a6@(ETEMP)
  1489. lea a6@(ETEMP),a0
  1490. bsrl __l_tag
  1491. moveb d0,a6@(STAG)
  1492. tstb d0
  1493. jne  L_1087
  1494. bsrl __l_setoxm1 |  normalized (regular) number
  1495. jra  L_108B
  1496. L_1087:
  1497. cmpb #0x20,d0 |  zero?
  1498. jne  L_1088
  1499. bsrl __l_szero
  1500. jra  L_108B
  1501. L_1088:
  1502. cmpb #0x40,d0 |  infinity?
  1503. jne  L_1089
  1504. bsrl __l_setoxm1i
  1505. jra  L_108B
  1506. L_1089:
  1507. cmpb #0x60,d0 |  NaN?
  1508. jne  L_108A
  1509. bsrl __l_mon_nan
  1510. jra  L_108B
  1511. L_108A:
  1512. bsrl __l_setoxm1d |  assuming a denorm...
  1513. L_108B:
  1514. fmovel fpsr,d0 |  update status register
  1515. orb a6@(USER_FPSR+3),d0 | add previously accrued exceptions
  1516. fmovel d0,fpsr
  1517. |
  1518. | Result is now in FP0
  1519. |
  1520. moveml a6@(USER_DA),d0-d1/a0-a1
  1521. fmovemx a6@(USER_FP1),fp1-fp3 |  note: fp0 not restored
  1522. fmovel a6@(USER_FPCR),fpcr | fpcr restored
  1523. unlk a6
  1524. rts
  1525. .globl __l_fetoxm1x
  1526. __l_fetoxm1x:
  1527. link a6,#-LOCAL_SIZE
  1528. moveml d0-d1/a0-a1,a6@(USER_DA)
  1529. fmovemx fp0-fp3,a6@(USER_FP0)
  1530. fmovel fpsr,a6@(USER_FPSR)
  1531. fmovel fpcr,a6@(USER_FPCR)
  1532. fmovel fpcr,d1 /* |  user's rounding mode/precision */
  1533. fmovel #0,fpcr |  force rounding mode/prec to extended,rn
  1534. |
  1535. | copy, convert and tag input argument
  1536. |
  1537. fmovex a6@(8),fp0
  1538. fmovex fp0,a6@(ETEMP)
  1539. lea a6@(ETEMP),a0
  1540. bsrl __l_tag
  1541. moveb d0,a6@(STAG)
  1542. tstb d0
  1543. jne  L_108C
  1544. bsrl __l_setoxm1 |  normalized (regular) number
  1545. jra  L_108G
  1546. L_108C:
  1547. cmpb #0x20,d0 |  zero?
  1548. jne  L_108D
  1549. bsrl __l_szero
  1550. jra  L_108G
  1551. L_108D:
  1552. cmpb #0x40,d0 |  infinity?
  1553. jne  L_108E
  1554. bsrl __l_setoxm1i
  1555. jra  L_108G
  1556. L_108E:
  1557. cmpb #0x60,d0 |  NaN?
  1558. jne  L_108F
  1559. bsrl __l_mon_nan
  1560. jra  L_108G
  1561. L_108F:
  1562. bsrl __l_setoxm1d |  assuming a denorm...
  1563. L_108G:
  1564. fmovel fpsr,d0 |  update status register
  1565. orb a6@(USER_FPSR+3),d0 | add previously accrued exceptions
  1566. fmovel d0,fpsr
  1567. |
  1568. | Result is now in FP0
  1569. |
  1570. moveml a6@(USER_DA),d0-d1/a0-a1
  1571. fmovemx a6@(USER_FP1),fp1-fp3 |  note: fp0 not restored
  1572. fmovel a6@(USER_FPCR),fpcr | fpcr restored
  1573. unlk a6
  1574. rts
  1575. |
  1576. | MONADIC.GEN 1.3 4/30/91
  1577. |
  1578. | MONADIC.GEN --- generic MONADIC template
  1579. |
  1580. | This version saves all registers that will be used by the emulation
  1581. | routines and restores all but FP0 on exit.  The FPSR is
  1582. | updated to reflect the result of the operation.  Return value
  1583. | is placed in FP0 for single, double and extended results.
  1584. |
  1585. | The package subroutines expect the incoming fpcr to be zeroed
  1586. | since they need extended precision to work properly.  The
  1587. /* | 'final' fpcr is expected in d1 so that the calculated result */
  1588. | can be properly sized and rounded.  Also, if the incoming fpcr
  1589. | has enabled any exceptions, the exception will be taken on the
  1590. | final fmovem in this template.
  1591. |
  1592. | Customizations:
  1593. | 1. Remove the moveml at the entry and exit of
  1594. |    each routine if your compiler treats those
  1595. |    registers as scratch.
  1596. /* | 2. Likewise, don't save FP0/FP1 if they are scratch */
  1597. |    registers.
  1598. | 3. Delete handling of the fpsr if you only care about
  1599. |    the result.
  1600. | 4. Some (most?) C compilers convert all float arguments
  1601. |    to double, and provide no support at all for extended
  1602. |    precision so remove the __l_fgetexps and __l_fgetexpx entry points.
  1603. | 5. Move the result to d0/d1 if the compiler is that old.
  1604. | Copyright (C) Motorola, Inc. 1991
  1605. | All Rights Reserved
  1606. |
  1607. | THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
  1608. | The copyright notice above does not evidence any
  1609. | actual or intended publication of such source code.
  1610. | xref __l_tag
  1611. | xref __l_sgetexp
  1612. | xref __l_szero
  1613. | xref __l_t_operr
  1614. | xref __l_mon_nan
  1615. | xref __l_sgetexpd
  1616. .globl __l_fgetexps
  1617. __l_fgetexps:
  1618. link a6,#-LOCAL_SIZE
  1619. moveml d0-d1/a0-a1,a6@(USER_DA)
  1620. fmovemx fp0-fp3,a6@(USER_FP0)
  1621. fmovel fpsr,a6@(USER_FPSR)
  1622. fmovel fpcr,a6@(USER_FPCR)
  1623. fmovel fpcr,d1 /* |  user's rounding mode/precision */
  1624. fmovel #0,fpcr |  force rounding mode/prec to extended,rn
  1625. |
  1626. | copy, convert and tag input argument
  1627. |
  1628. fmoves a6@(8),fp0
  1629. fmovex fp0,a6@(ETEMP)
  1630. lea a6@(ETEMP),a0
  1631. bsrl __l_tag
  1632. moveb d0,a6@(STAG)
  1633. tstb d0
  1634. jne  L_1092
  1635. bsrl __l_sgetexp |  normalized (regular) number
  1636. jra  L_1096
  1637. L_1092:
  1638. cmpb #0x20,d0 |  zero?
  1639. jne  L_1093
  1640. bsrl __l_szero
  1641. jra  L_1096
  1642. L_1093:
  1643. cmpb #0x40,d0 |  infinity?
  1644. jne  L_1094
  1645. bsrl __l_t_operr
  1646. jra  L_1096
  1647. L_1094:
  1648. cmpb #0x60,d0 |  NaN?
  1649. jne  L_1095
  1650. bsrl __l_mon_nan
  1651. jra  L_1096
  1652. L_1095:
  1653. bsrl __l_sgetexpd |  assuming a denorm...
  1654. L_1096:
  1655. fmovel fpsr,d0 |  update status register
  1656. orb a6@(USER_FPSR+3),d0 | add previously accrued exceptions
  1657. fmovel d0,fpsr
  1658. |
  1659. | Result is now in FP0
  1660. |
  1661. moveml a6@(USER_DA),d0-d1/a0-a1
  1662. fmovemx a6@(USER_FP1),fp1-fp3 |  note: fp0 not restored
  1663. fmovel a6@(USER_FPCR),fpcr | fpcr restored
  1664. unlk a6
  1665. rts
  1666. .globl __l_fgetexpd
  1667. __l_fgetexpd:
  1668. link a6,#-LOCAL_SIZE
  1669. moveml d0-d1/a0-a1,a6@(USER_DA)
  1670. fmovemx fp0-fp3,a6@(USER_FP0)
  1671. fmovel fpsr,a6@(USER_FPSR)
  1672. fmovel fpcr,a6@(USER_FPCR)
  1673. fmovel fpcr,d1 /* |  user's rounding mode/precision */
  1674. fmovel #0,fpcr |  force rounding mode/prec to extended,rn
  1675. |
  1676. | copy, convert and tag input argument
  1677. |
  1678. fmoved a6@(8),fp0
  1679. fmovex fp0,a6@(ETEMP)
  1680. lea a6@(ETEMP),a0
  1681. bsrl __l_tag
  1682. moveb d0,a6@(STAG)
  1683. tstb d0
  1684. jne  L_1097
  1685. bsrl __l_sgetexp |  normalized (regular) number
  1686. jra  L_109B
  1687. L_1097:
  1688. cmpb #0x20,d0 |  zero?
  1689. jne  L_1098
  1690. bsrl __l_szero
  1691. jra  L_109B
  1692. L_1098:
  1693. cmpb #0x40,d0 |  infinity?
  1694. jne  L_1099
  1695. bsrl __l_t_operr
  1696. jra  L_109B
  1697. L_1099:
  1698. cmpb #0x60,d0 |  NaN?
  1699. jne  L_109A
  1700. bsrl __l_mon_nan
  1701. jra  L_109B
  1702. L_109A:
  1703. bsrl __l_sgetexpd |  assuming a denorm...
  1704. L_109B:
  1705. fmovel fpsr,d0 |  update status register
  1706. orb a6@(USER_FPSR+3),d0 | add previously accrued exceptions
  1707. fmovel d0,fpsr
  1708. |
  1709. | Result is now in FP0
  1710. |
  1711. moveml a6@(USER_DA),d0-d1/a0-a1
  1712. fmovemx a6@(USER_FP1),fp1-fp3 |  note: fp0 not restored
  1713. fmovel a6@(USER_FPCR),fpcr | fpcr restored
  1714. unlk a6
  1715. rts
  1716. .globl __l_fgetexpx
  1717. __l_fgetexpx:
  1718. link a6,#-LOCAL_SIZE
  1719. moveml d0-d1/a0-a1,a6@(USER_DA)
  1720. fmovemx fp0-fp3,a6@(USER_FP0)
  1721. fmovel fpsr,a6@(USER_FPSR)
  1722. fmovel fpcr,a6@(USER_FPCR)
  1723. fmovel fpcr,d1 /* |  user's rounding mode/precision */
  1724. fmovel #0,fpcr |  force rounding mode/prec to extended,rn
  1725. |
  1726. | copy, convert and tag input argument
  1727. |
  1728. fmovex a6@(8),fp0
  1729. fmovex fp0,a6@(ETEMP)
  1730. lea a6@(ETEMP),a0
  1731. bsrl __l_tag
  1732. moveb d0,a6@(STAG)
  1733. tstb d0
  1734. jne  L_109C
  1735. bsrl __l_sgetexp |  normalized (regular) number
  1736. jra  L_109G
  1737. L_109C:
  1738. cmpb #0x20,d0 |  zero?
  1739. jne  L_109D
  1740. bsrl __l_szero
  1741. jra  L_109G
  1742. L_109D:
  1743. cmpb #0x40,d0 |  infinity?
  1744. jne  L_109E
  1745. bsrl __l_t_operr
  1746. jra  L_109G
  1747. L_109E:
  1748. cmpb #0x60,d0 |  NaN?
  1749. jne  L_109F
  1750. bsrl __l_mon_nan
  1751. jra  L_109G
  1752. L_109F:
  1753. bsrl __l_sgetexpd |  assuming a denorm...
  1754. L_109G:
  1755. fmovel fpsr,d0 |  update status register
  1756. orb a6@(USER_FPSR+3),d0 | add previously accrued exceptions
  1757. fmovel d0,fpsr
  1758. |
  1759. | Result is now in FP0
  1760. |
  1761. moveml a6@(USER_DA),d0-d1/a0-a1
  1762. fmovemx a6@(USER_FP1),fp1-fp3 |  note: fp0 not restored
  1763. fmovel a6@(USER_FPCR),fpcr | fpcr restored
  1764. unlk a6
  1765. rts
  1766. |
  1767. | MONADIC.GEN 1.3 4/30/91
  1768. |
  1769. | MONADIC.GEN --- generic MONADIC template
  1770. |
  1771. | This version saves all registers that will be used by the emulation
  1772. | routines and restores all but FP0 on exit.  The FPSR is
  1773. | updated to reflect the result of the operation.  Return value
  1774. | is placed in FP0 for single, double and extended results.
  1775. |
  1776. | The package subroutines expect the incoming fpcr to be zeroed
  1777. | since they need extended precision to work properly.  The
  1778. /* | 'final' fpcr is expected in d1 so that the calculated result */
  1779. | can be properly sized and rounded.  Also, if the incoming fpcr
  1780. | has enabled any exceptions, the exception will be taken on the
  1781. | final fmovem in this template.
  1782. |
  1783. | Customizations:
  1784. | 1. Remove the moveml at the entry and exit of
  1785. |    each routine if your compiler treats those
  1786. |    registers as scratch.
  1787. /* | 2. Likewise, don't save FP0/FP1 if they are scratch */
  1788. |    registers.
  1789. | 3. Delete handling of the fpsr if you only care about
  1790. |    the result.
  1791. | 4. Some (most?) C compilers convert all float arguments
  1792. |    to double, and provide no support at all for extended
  1793. |    precision so remove the __l_fsins and __l_fsinx entry points.
  1794. | 5. Move the result to d0/d1 if the compiler is that old.
  1795. | Copyright (C) Motorola, Inc. 1991
  1796. | All Rights Reserved
  1797. |
  1798. | THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
  1799. | The copyright notice above does not evidence any
  1800. | actual or intended publication of such source code.
  1801. | xref __l_tag
  1802. | xref __l_ssin
  1803. | xref __l_szero
  1804. | xref __l_t_operr
  1805. | xref __l_mon_nan
  1806. | xref __l_ssind
  1807. .globl __l_fsins
  1808. __l_fsins:
  1809. link a6,#-LOCAL_SIZE
  1810. moveml d0-d1/a0-a1,a6@(USER_DA)
  1811. fmovemx fp0-fp3,a6@(USER_FP0)
  1812. fmovel fpsr,a6@(USER_FPSR)
  1813. fmovel fpcr,a6@(USER_FPCR)
  1814. fmovel fpcr,d1 /* |  user's rounding mode/precision */
  1815. fmovel #0,fpcr |  force rounding mode/prec to extended,rn
  1816. |
  1817. | copy, convert and tag input argument
  1818. |
  1819. fmoves a6@(8),fp0
  1820. fmovex fp0,a6@(ETEMP)
  1821. lea a6@(ETEMP),a0
  1822. bsrl __l_tag
  1823. moveb d0,a6@(STAG)
  1824. tstb d0
  1825. jne  L_1102
  1826. bsrl __l_ssin |  normalized (regular) number
  1827. jra  L_1106
  1828. L_1102:
  1829. cmpb #0x20,d0 |  zero?
  1830. jne  L_1103
  1831. bsrl __l_szero
  1832. jra  L_1106
  1833. L_1103:
  1834. cmpb #0x40,d0 |  infinity?
  1835. jne  L_1104
  1836. bsrl __l_t_operr
  1837. jra  L_1106
  1838. L_1104:
  1839. cmpb #0x60,d0 |  NaN?
  1840. jne  L_1105
  1841. bsrl __l_mon_nan
  1842. jra  L_1106
  1843. L_1105:
  1844. bsrl __l_ssind |  assuming a denorm...
  1845. L_1106:
  1846. fmovel fpsr,d0 |  update status register
  1847. orb a6@(USER_FPSR+3),d0 | add previously accrued exceptions
  1848. fmovel d0,fpsr
  1849. |
  1850. | Result is now in FP0
  1851. |
  1852. moveml a6@(USER_DA),d0-d1/a0-a1
  1853. fmovemx a6@(USER_FP1),fp1-fp3 |  note: fp0 not restored
  1854. fmovel a6@(USER_FPCR),fpcr | fpcr restored
  1855. unlk a6
  1856. rts
  1857. .globl __l_fsind
  1858. __l_fsind:
  1859. link a6,#-LOCAL_SIZE
  1860. moveml d0-d1/a0-a1,a6@(USER_DA)
  1861. fmovemx fp0-fp3,a6@(USER_FP0)
  1862. fmovel fpsr,a6@(USER_FPSR)
  1863. fmovel fpcr,a6@(USER_FPCR)
  1864. fmovel fpcr,d1 /* |  user's rounding mode/precision */
  1865. fmovel #0,fpcr |  force rounding mode/prec to extended,rn
  1866. |
  1867. | copy, convert and tag input argument
  1868. |
  1869. fmoved a6@(8),fp0
  1870. fmovex fp0,a6@(ETEMP)
  1871. lea a6@(ETEMP),a0
  1872. bsrl __l_tag
  1873. moveb d0,a6@(STAG)
  1874. tstb d0
  1875. jne  L_1107
  1876. bsrl __l_ssin |  normalized (regular) number
  1877. jra  L_110B
  1878. L_1107:
  1879. cmpb #0x20,d0 |  zero?
  1880. jne  L_1108
  1881. bsrl __l_szero
  1882. jra  L_110B
  1883. L_1108:
  1884. cmpb #0x40,d0 |  infinity?
  1885. jne  L_1109
  1886. bsrl __l_t_operr
  1887. jra  L_110B
  1888. L_1109:
  1889. cmpb #0x60,d0 |  NaN?
  1890. jne  L_110A
  1891. bsrl __l_mon_nan
  1892. jra  L_110B
  1893. L_110A:
  1894. bsrl __l_ssind |  assuming a denorm...
  1895. L_110B:
  1896. fmovel fpsr,d0 |  update status register
  1897. orb a6@(USER_FPSR+3),d0 | add previously accrued exceptions
  1898. fmovel d0,fpsr
  1899. |
  1900. | Result is now in FP0
  1901. |
  1902. moveml a6@(USER_DA),d0-d1/a0-a1
  1903. fmovemx a6@(USER_FP1),fp1-fp3 |  note: fp0 not restored
  1904. fmovel a6@(USER_FPCR),fpcr | fpcr restored
  1905. unlk a6
  1906. rts
  1907. .globl __l_fsinx
  1908. __l_fsinx:
  1909. link a6,#-LOCAL_SIZE
  1910. moveml d0-d1/a0-a1,a6@(USER_DA)
  1911. fmovemx fp0-fp3,a6@(USER_FP0)
  1912. fmovel fpsr,a6@(USER_FPSR)
  1913. fmovel fpcr,a6@(USER_FPCR)
  1914. fmovel fpcr,d1 /* |  user's rounding mode/precision */
  1915. fmovel #0,fpcr |  force rounding mode/prec to extended,rn
  1916. |
  1917. | copy, convert and tag input argument
  1918. |
  1919. fmovex a6@(8),fp0
  1920. fmovex fp0,a6@(ETEMP)
  1921. lea a6@(ETEMP),a0
  1922. bsrl __l_tag
  1923. moveb d0,a6@(STAG)
  1924. tstb d0
  1925. jne  L_110C
  1926. bsrl __l_ssin |  normalized (regular) number
  1927. jra  L_110G
  1928. L_110C:
  1929. cmpb #0x20,d0 |  zero?
  1930. jne  L_110D
  1931. bsrl __l_szero
  1932. jra  L_110G
  1933. L_110D:
  1934. cmpb #0x40,d0 |  infinity?
  1935. jne  L_110E
  1936. bsrl __l_t_operr
  1937. jra  L_110G
  1938. L_110E:
  1939. cmpb #0x60,d0 |  NaN?
  1940. jne  L_110F
  1941. bsrl __l_mon_nan
  1942. jra  L_110G
  1943. L_110F:
  1944. bsrl __l_ssind |  assuming a denorm...
  1945. L_110G:
  1946. fmovel fpsr,d0 |  update status register
  1947. orb a6@(USER_FPSR+3),d0 | add previously accrued exceptions
  1948. fmovel d0,fpsr
  1949. |
  1950. | Result is now in FP0
  1951. |
  1952. moveml a6@(USER_DA),d0-d1/a0-a1
  1953. fmovemx a6@(USER_FP1),fp1-fp3 |  note: fp0 not restored
  1954. fmovel a6@(USER_FPCR),fpcr | fpcr restored
  1955. unlk a6
  1956. rts
  1957. |
  1958. | MONADIC.GEN 1.3 4/30/91
  1959. |
  1960. | MONADIC.GEN --- generic MONADIC template
  1961. |
  1962. | This version saves all registers that will be used by the emulation
  1963. | routines and restores all but FP0 on exit.  The FPSR is
  1964. | updated to reflect the result of the operation.  Return value
  1965. | is placed in FP0 for single, double and extended results.
  1966. |
  1967. | The package subroutines expect the incoming fpcr to be zeroed
  1968. | since they need extended precision to work properly.  The
  1969. /* | 'final' fpcr is expected in d1 so that the calculated result */
  1970. | can be properly sized and rounded.  Also, if the incoming fpcr
  1971. | has enabled any exceptions, the exception will be taken on the
  1972. | final fmovem in this template.
  1973. |
  1974. | Customizations:
  1975. | 1. Remove the moveml at the entry and exit of
  1976. |    each routine if your compiler treats those
  1977. |    registers as scratch.
  1978. /* | 2. Likewise, don't save FP0/FP1 if they are scratch */
  1979. |    registers.
  1980. | 3. Delete handling of the fpsr if you only care about
  1981. |    the result.
  1982. | 4. Some (most?) C compilers convert all float arguments
  1983. |    to double, and provide no support at all for extended
  1984. |    precision so remove the __l_fsinhs and __l_fsinhx entry points.
  1985. | 5. Move the result to d0/d1 if the compiler is that old.
  1986. | Copyright (C) Motorola, Inc. 1991
  1987. | All Rights Reserved
  1988. |
  1989. | THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
  1990. | The copyright notice above does not evidence any
  1991. | actual or intended publication of such source code.
  1992. | xref __l_tag
  1993. | xref __l_ssinh
  1994. | xref __l_szero
  1995. | xref __l_sinf
  1996. | xref __l_mon_nan
  1997. | xref __l_ssinhd
  1998. .globl __l_fsinhs
  1999. __l_fsinhs:
  2000. link a6,#-LOCAL_SIZE
  2001. moveml d0-d1/a0-a1,a6@(USER_DA)
  2002. fmovemx fp0-fp3,a6@(USER_FP0)
  2003. fmovel fpsr,a6@(USER_FPSR)
  2004. fmovel fpcr,a6@(USER_FPCR)
  2005. fmovel fpcr,d1 /* |  user's rounding mode/precision */
  2006. fmovel #0,fpcr |  force rounding mode/prec to extended,rn
  2007. |
  2008. | copy, convert and tag input argument
  2009. |
  2010. fmoves a6@(8),fp0
  2011. fmovex fp0,a6@(ETEMP)
  2012. lea a6@(ETEMP),a0
  2013. bsrl __l_tag
  2014. moveb d0,a6@(STAG)
  2015. tstb d0
  2016. jne  L_1112
  2017. bsrl __l_ssinh |  normalized (regular) number
  2018. jra  L_1116
  2019. L_1112:
  2020. cmpb #0x20,d0 |  zero?
  2021. jne  L_1113
  2022. bsrl __l_szero
  2023. jra  L_1116
  2024. L_1113:
  2025. cmpb #0x40,d0 |  infinity?
  2026. jne  L_1114
  2027. bsrl __l_sinf
  2028. jra  L_1116
  2029. L_1114:
  2030. cmpb #0x60,d0 |  NaN?
  2031. jne  L_1115
  2032. bsrl __l_mon_nan
  2033. jra  L_1116
  2034. L_1115:
  2035. bsrl __l_ssinhd |  assuming a denorm...
  2036. L_1116:
  2037. fmovel fpsr,d0 |  update status register
  2038. orb a6@(USER_FPSR+3),d0 | add previously accrued exceptions
  2039. fmovel d0,fpsr
  2040. |
  2041. | Result is now in FP0
  2042. |
  2043. moveml a6@(USER_DA),d0-d1/a0-a1
  2044. fmovemx a6@(USER_FP1),fp1-fp3 |  note: fp0 not restored
  2045. fmovel a6@(USER_FPCR),fpcr | fpcr restored
  2046. unlk a6
  2047. rts
  2048. .globl __l_fsinhd
  2049. __l_fsinhd:
  2050. link a6,#-LOCAL_SIZE
  2051. moveml d0-d1/a0-a1,a6@(USER_DA)
  2052. fmovemx fp0-fp3,a6@(USER_FP0)
  2053. fmovel fpsr,a6@(USER_FPSR)
  2054. fmovel fpcr,a6@(USER_FPCR)
  2055. fmovel fpcr,d1 /* |  user's rounding mode/precision */
  2056. fmovel #0,fpcr |  force rounding mode/prec to extended,rn
  2057. |
  2058. | copy, convert and tag input argument
  2059. |
  2060. fmoved a6@(8),fp0
  2061. fmovex fp0,a6@(ETEMP)
  2062. lea a6@(ETEMP),a0
  2063. bsrl __l_tag
  2064. moveb d0,a6@(STAG)
  2065. tstb d0
  2066. jne  L_1117
  2067. bsrl __l_ssinh |  normalized (regular) number
  2068. jra  L_111B
  2069. L_1117:
  2070. cmpb #0x20,d0 |  zero?
  2071. jne  L_1118
  2072. bsrl __l_szero
  2073. jra  L_111B
  2074. L_1118:
  2075. cmpb #0x40,d0 |  infinity?
  2076. jne  L_1119
  2077. bsrl __l_sinf
  2078. jra  L_111B
  2079. L_1119:
  2080. cmpb #0x60,d0 |  NaN?
  2081. jne  L_111A
  2082. bsrl __l_mon_nan
  2083. jra  L_111B
  2084. L_111A:
  2085. bsrl __l_ssinhd |  assuming a denorm...
  2086. L_111B:
  2087. fmovel fpsr,d0 |  update status register
  2088. orb a6@(USER_FPSR+3),d0 | add previously accrued exceptions
  2089. fmovel d0,fpsr
  2090. |
  2091. | Result is now in FP0
  2092. |
  2093. moveml a6@(USER_DA),d0-d1/a0-a1
  2094. fmovemx a6@(USER_FP1),fp1-fp3 |  note: fp0 not restored
  2095. fmovel a6@(USER_FPCR),fpcr | fpcr restored
  2096. unlk a6
  2097. rts
  2098. .globl __l_fsinhx
  2099. __l_fsinhx:
  2100. link a6,#-LOCAL_SIZE
  2101. moveml d0-d1/a0-a1,a6@(USER_DA)
  2102. fmovemx fp0-fp3,a6@(USER_FP0)
  2103. fmovel fpsr,a6@(USER_FPSR)
  2104. fmovel fpcr,a6@(USER_FPCR)
  2105. fmovel fpcr,d1 /* |  user's rounding mode/precision */
  2106. fmovel #0,fpcr |  force rounding mode/prec to extended,rn
  2107. |
  2108. | copy, convert and tag input argument
  2109. |
  2110. fmovex a6@(8),fp0
  2111. fmovex fp0,a6@(ETEMP)
  2112. lea a6@(ETEMP),a0
  2113. bsrl __l_tag
  2114. moveb d0,a6@(STAG)
  2115. tstb d0
  2116. jne  L_111C
  2117. bsrl __l_ssinh |  normalized (regular) number
  2118. jra  L_111G
  2119. L_111C:
  2120. cmpb #0x20,d0 |  zero?
  2121. jne  L_111D
  2122. bsrl __l_szero
  2123. jra  L_111G
  2124. L_111D:
  2125. cmpb #0x40,d0 |  infinity?
  2126. jne  L_111E
  2127. bsrl __l_sinf
  2128. jra  L_111G
  2129. L_111E:
  2130. cmpb #0x60,d0 |  NaN?
  2131. jne  L_111F
  2132. bsrl __l_mon_nan
  2133. jra  L_111G
  2134. L_111F:
  2135. bsrl __l_ssinhd |  assuming a denorm...
  2136. L_111G:
  2137. fmovel fpsr,d0 |  update status register
  2138. orb a6@(USER_FPSR+3),d0 | add previously accrued exceptions
  2139. fmovel d0,fpsr
  2140. |
  2141. | Result is now in FP0
  2142. |
  2143. moveml a6@(USER_DA),d0-d1/a0-a1
  2144. fmovemx a6@(USER_FP1),fp1-fp3 |  note: fp0 not restored
  2145. fmovel a6@(USER_FPCR),fpcr | fpcr restored
  2146. unlk a6
  2147. rts
  2148. |
  2149. | MONADIC.GEN 1.3 4/30/91
  2150. |
  2151. | MONADIC.GEN --- generic MONADIC template
  2152. |
  2153. | This version saves all registers that will be used by the emulation
  2154. | routines and restores all but FP0 on exit.  The FPSR is
  2155. | updated to reflect the result of the operation.  Return value
  2156. | is placed in FP0 for single, double and extended results.
  2157. |
  2158. | The package subroutines expect the incoming fpcr to be zeroed
  2159. | since they need extended precision to work properly.  The
  2160. /* | 'final' fpcr is expected in d1 so that the calculated result */
  2161. | can be properly sized and rounded.  Also, if the incoming fpcr
  2162. | has enabled any exceptions, the exception will be taken on the
  2163. | final fmovem in this template.
  2164. |
  2165. | Customizations:
  2166. | 1. Remove the moveml at the entry and exit of
  2167. |    each routine if your compiler treats those
  2168. |    registers as scratch.
  2169. /* | 2. Likewise, don't save FP0/FP1 if they are scratch */
  2170. |    registers.
  2171. | 3. Delete handling of the fpsr if you only care about
  2172. |    the result.
  2173. | 4. Some (most?) C compilers convert all float arguments
  2174. |    to double, and provide no support at all for extended
  2175. |    precision so remove the __l_ftans and __l_ftanx entry points.
  2176. | 5. Move the result to d0/d1 if the compiler is that old.
  2177. | Copyright (C) Motorola, Inc. 1991
  2178. | All Rights Reserved
  2179. |
  2180. | THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
  2181. | The copyright notice above does not evidence any
  2182. | actual or intended publication of such source code.
  2183. | xref __l_tag
  2184. | xref __l_stan
  2185. | xref __l_szero
  2186. | xref __l_t_operr
  2187. | xref __l_mon_nan
  2188. | xref __l_stand
  2189. .globl __l_ftans
  2190. __l_ftans:
  2191. link a6,#-LOCAL_SIZE
  2192. moveml d0-d1/a0-a1,a6@(USER_DA)
  2193. fmovemx fp0-fp3,a6@(USER_FP0)
  2194. fmovel fpsr,a6@(USER_FPSR)
  2195. fmovel fpcr,a6@(USER_FPCR)
  2196. fmovel fpcr,d1 /* |  user's rounding mode/precision */
  2197. fmovel #0,fpcr |  force rounding mode/prec to extended,rn
  2198. |
  2199. | copy, convert and tag input argument
  2200. |
  2201. fmoves a6@(8),fp0
  2202. fmovex fp0,a6@(ETEMP)
  2203. lea a6@(ETEMP),a0
  2204. bsrl __l_tag
  2205. moveb d0,a6@(STAG)
  2206. tstb d0
  2207. jne  L_1122
  2208. bsrl __l_stan |  normalized (regular) number
  2209. jra  L_1126
  2210. L_1122:
  2211. cmpb #0x20,d0 |  zero?
  2212. jne  L_1123
  2213. bsrl __l_szero
  2214. jra  L_1126
  2215. L_1123:
  2216. cmpb #0x40,d0 |  infinity?
  2217. jne  L_1124
  2218. bsrl __l_t_operr
  2219. jra  L_1126
  2220. L_1124:
  2221. cmpb #0x60,d0 |  NaN?
  2222. jne  L_1125
  2223. bsrl __l_mon_nan
  2224. jra  L_1126
  2225. L_1125:
  2226. bsrl __l_stand |  assuming a denorm...
  2227. L_1126:
  2228. fmovel fpsr,d0 |  update status register
  2229. orb a6@(USER_FPSR+3),d0 | add previously accrued exceptions
  2230. fmovel d0,fpsr
  2231. |
  2232. | Result is now in FP0
  2233. |
  2234. moveml a6@(USER_DA),d0-d1/a0-a1
  2235. fmovemx a6@(USER_FP1),fp1-fp3 |  note: fp0 not restored
  2236. fmovel a6@(USER_FPCR),fpcr | fpcr restored
  2237. unlk a6
  2238. rts
  2239. .globl __l_ftand
  2240. __l_ftand:
  2241. link a6,#-LOCAL_SIZE
  2242. moveml d0-d1/a0-a1,a6@(USER_DA)
  2243. fmovemx fp0-fp3,a6@(USER_FP0)
  2244. fmovel fpsr,a6@(USER_FPSR)
  2245. fmovel fpcr,a6@(USER_FPCR)
  2246. fmovel fpcr,d1 /* |  user's rounding mode/precision */
  2247. fmovel #0,fpcr |  force rounding mode/prec to extended,rn
  2248. |
  2249. | copy, convert and tag input argument
  2250. |
  2251. fmoved a6@(8),fp0
  2252. fmovex fp0,a6@(ETEMP)
  2253. lea a6@(ETEMP),a0
  2254. bsrl __l_tag
  2255. moveb d0,a6@(STAG)
  2256. tstb d0
  2257. jne  L_1127
  2258. bsrl __l_stan |  normalized (regular) number
  2259. jra  L_112B
  2260. L_1127:
  2261. cmpb #0x20,d0 |  zero?
  2262. jne  L_1128
  2263. bsrl __l_szero
  2264. jra  L_112B
  2265. L_1128:
  2266. cmpb #0x40,d0 |  infinity?
  2267. jne  L_1129
  2268. bsrl __l_t_operr
  2269. jra  L_112B
  2270. L_1129:
  2271. cmpb #0x60,d0 |  NaN?
  2272. jne  L_112A
  2273. bsrl __l_mon_nan
  2274. jra  L_112B
  2275. L_112A:
  2276. bsrl __l_stand |  assuming a denorm...
  2277. L_112B:
  2278. fmovel fpsr,d0 |  update status register
  2279. orb a6@(USER_FPSR+3),d0 | add previously accrued exceptions
  2280. fmovel d0,fpsr
  2281. |
  2282. | Result is now in FP0
  2283. |
  2284. moveml a6@(USER_DA),d0-d1/a0-a1
  2285. fmovemx a6@(USER_FP1),fp1-fp3 |  note: fp0 not restored
  2286. fmovel a6@(USER_FPCR),fpcr | fpcr restored
  2287. unlk a6
  2288. rts
  2289. .globl __l_ftanx
  2290. __l_ftanx:
  2291. link a6,#-LOCAL_SIZE
  2292. moveml d0-d1/a0-a1,a6@(USER_DA)
  2293. fmovemx fp0-fp3,a6@(USER_FP0)
  2294. fmovel fpsr,a6@(USER_FPSR)
  2295. fmovel fpcr,a6@(USER_FPCR)
  2296. fmovel fpcr,d1 /* |  user's rounding mode/precision */
  2297. fmovel #0,fpcr |  force rounding mode/prec to extended,rn
  2298. |
  2299. | copy, convert and tag input argument
  2300. |
  2301. fmovex a6@(8),fp0
  2302. fmovex fp0,a6@(ETEMP)
  2303. lea a6@(ETEMP),a0
  2304. bsrl __l_tag
  2305. moveb d0,a6@(STAG)
  2306. tstb d0
  2307. jne  L_112C
  2308. bsrl __l_stan |  normalized (regular) number
  2309. jra  L_112G
  2310. L_112C:
  2311. cmpb #0x20,d0 |  zero?
  2312. jne  L_112D
  2313. bsrl __l_szero
  2314. jra  L_112G
  2315. L_112D:
  2316. cmpb #0x40,d0 |  infinity?
  2317. jne  L_112E
  2318. bsrl __l_t_operr
  2319. jra  L_112G
  2320. L_112E:
  2321. cmpb #0x60,d0 |  NaN?
  2322. jne  L_112F
  2323. bsrl __l_mon_nan
  2324. jra  L_112G
  2325. L_112F:
  2326. bsrl __l_stand |  assuming a denorm...
  2327. L_112G:
  2328. fmovel fpsr,d0 |  update status register
  2329. orb a6@(USER_FPSR+3),d0 | add previously accrued exceptions
  2330. fmovel d0,fpsr
  2331. |
  2332. | Result is now in FP0
  2333. |
  2334. moveml a6@(USER_DA),d0-d1/a0-a1
  2335. fmovemx a6@(USER_FP1),fp1-fp3 |  note: fp0 not restored
  2336. fmovel a6@(USER_FPCR),fpcr | fpcr restored
  2337. unlk a6
  2338. rts
  2339. |
  2340. | MONADIC.GEN 1.3 4/30/91
  2341. |
  2342. | MONADIC.GEN --- generic MONADIC template
  2343. |
  2344. | This version saves all registers that will be used by the emulation
  2345. | routines and restores all but FP0 on exit.  The FPSR is
  2346. | updated to reflect the result of the operation.  Return value
  2347. | is placed in FP0 for single, double and extended results.
  2348. |
  2349. | The package subroutines expect the incoming fpcr to be zeroed
  2350. | since they need extended precision to work properly.  The
  2351. /* | 'final' fpcr is expected in d1 so that the calculated result */
  2352. | can be properly sized and rounded.  Also, if the incoming fpcr
  2353. | has enabled any exceptions, the exception will be taken on the
  2354. | final fmovem in this template.
  2355. |
  2356. | Customizations:
  2357. | 1. Remove the moveml at the entry and exit of
  2358. |    each routine if your compiler treats those
  2359. |    registers as scratch.
  2360. /* | 2. Likewise, don't save FP0/FP1 if they are scratch */
  2361. |    registers.
  2362. | 3. Delete handling of the fpsr if you only care about
  2363. |    the result.
  2364. | 4. Some (most?) C compilers convert all float arguments
  2365. |    to double, and provide no support at all for extended
  2366. |    precision so remove the __l_ftanhs and __l_ftanhx entry points.
  2367. | 5. Move the result to d0/d1 if the compiler is that old.
  2368. | Copyright (C) Motorola, Inc. 1991
  2369. | All Rights Reserved
  2370. |
  2371. | THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
  2372. | The copyright notice above does not evidence any
  2373. | actual or intended publication of such source code.
  2374. | xref __l_tag
  2375. | xref __l_stanh
  2376. | xref __l_szero
  2377. | xref __l_sone
  2378. | xref __l_mon_nan
  2379. | xref __l_stanhd
  2380. .globl __l_ftanhs
  2381. __l_ftanhs:
  2382. link a6,#-LOCAL_SIZE
  2383. moveml d0-d1/a0-a1,a6@(USER_DA)
  2384. fmovemx fp0-fp3,a6@(USER_FP0)
  2385. fmovel fpsr,a6@(USER_FPSR)
  2386. fmovel fpcr,a6@(USER_FPCR)
  2387. fmovel fpcr,d1 /* |  user's rounding mode/precision */
  2388. fmovel #0,fpcr |  force rounding mode/prec to extended,rn
  2389. |
  2390. | copy, convert and tag input argument
  2391. |
  2392. fmoves a6@(8),fp0
  2393. fmovex fp0,a6@(ETEMP)
  2394. lea a6@(ETEMP),a0
  2395. bsrl __l_tag
  2396. moveb d0,a6@(STAG)
  2397. tstb d0
  2398. jne  L_1132
  2399. bsrl __l_stanh |  normalized (regular) number
  2400. jra  L_1136
  2401. L_1132:
  2402. cmpb #0x20,d0 |  zero?
  2403. jne  L_1133
  2404. bsrl __l_szero
  2405. jra  L_1136
  2406. L_1133:
  2407. cmpb #0x40,d0 |  infinity?
  2408. jne  L_1134
  2409. bsrl __l_sone
  2410. jra  L_1136
  2411. L_1134:
  2412. cmpb #0x60,d0 |  NaN?
  2413. jne  L_1135
  2414. bsrl __l_mon_nan
  2415. jra  L_1136
  2416. L_1135:
  2417. bsrl __l_stanhd |  assuming a denorm...
  2418. L_1136:
  2419. fmovel fpsr,d0 |  update status register
  2420. orb a6@(USER_FPSR+3),d0 | add previously accrued exceptions
  2421. fmovel d0,fpsr
  2422. |
  2423. | Result is now in FP0
  2424. |
  2425. moveml a6@(USER_DA),d0-d1/a0-a1
  2426. fmovemx a6@(USER_FP1),fp1-fp3 |  note: fp0 not restored
  2427. fmovel a6@(USER_FPCR),fpcr | fpcr restored
  2428. unlk a6
  2429. rts
  2430. .globl __l_ftanhd
  2431. __l_ftanhd:
  2432. link a6,#-LOCAL_SIZE
  2433. moveml d0-d1/a0-a1,a6@(USER_DA)
  2434. fmovemx fp0-fp3,a6@(USER_FP0)
  2435. fmovel fpsr,a6@(USER_FPSR)
  2436. fmovel fpcr,a6@(USER_FPCR)
  2437. fmovel fpcr,d1 /* |  user's rounding mode/precision */
  2438. fmovel #0,fpcr |  force rounding mode/prec to extended,rn
  2439. |
  2440. | copy, convert and tag input argument
  2441. |
  2442. fmoved a6@(8),fp0
  2443. fmovex fp0,a6@(ETEMP)
  2444. lea a6@(ETEMP),a0
  2445. bsrl __l_tag
  2446. moveb d0,a6@(STAG)
  2447. tstb d0
  2448. jne  L_1137
  2449. bsrl __l_stanh |  normalized (regular) number
  2450. jra  L_113B
  2451. L_1137:
  2452. cmpb #0x20,d0 |  zero?
  2453. jne  L_1138
  2454. bsrl __l_szero
  2455. jra  L_113B
  2456. L_1138:
  2457. cmpb #0x40,d0 |  infinity?
  2458. jne  L_1139
  2459. bsrl __l_sone
  2460. jra  L_113B
  2461. L_1139:
  2462. cmpb #0x60,d0 |  NaN?
  2463. jne  L_113A
  2464. bsrl __l_mon_nan
  2465. jra  L_113B
  2466. L_113A:
  2467. bsrl __l_stanhd |  assuming a denorm...
  2468. L_113B:
  2469. fmovel fpsr,d0 |  update status register
  2470. orb a6@(USER_FPSR+3),d0 | add previously accrued exceptions
  2471. fmovel d0,fpsr
  2472. |
  2473. | Result is now in FP0
  2474. |
  2475. moveml a6@(USER_DA),d0-d1/a0-a1
  2476. fmovemx a6@(USER_FP1),fp1-fp3 |  note: fp0 not restored
  2477. fmovel a6@(USER_FPCR),fpcr | fpcr restored
  2478. unlk a6
  2479. rts
  2480. .globl __l_ftanhx
  2481. __l_ftanhx:
  2482. link a6,#-LOCAL_SIZE
  2483. moveml d0-d1/a0-a1,a6@(USER_DA)
  2484. fmovemx fp0-fp3,a6@(USER_FP0)
  2485. fmovel fpsr,a6@(USER_FPSR)
  2486. fmovel fpcr,a6@(USER_FPCR)
  2487. fmovel fpcr,d1 /* |  user's rounding mode/precision */
  2488. fmovel #0,fpcr |  force rounding mode/prec to extended,rn
  2489. |
  2490. | copy, convert and tag input argument
  2491. |
  2492. fmovex a6@(8),fp0
  2493. fmovex fp0,a6@(ETEMP)
  2494. lea a6@(ETEMP),a0
  2495. bsrl __l_tag
  2496. moveb d0,a6@(STAG)
  2497. tstb d0
  2498. jne  L_113C
  2499. bsrl __l_stanh |  normalized (regular) number
  2500. jra  L_113G
  2501. L_113C:
  2502. cmpb #0x20,d0 |  zero?
  2503. jne  L_113D
  2504. bsrl __l_szero
  2505. jra  L_113G
  2506. L_113D:
  2507. cmpb #0x40,d0 |  infinity?
  2508. jne  L_113E
  2509. bsrl __l_sone
  2510. jra  L_113G
  2511. L_113E:
  2512. cmpb #0x60,d0 |  NaN?
  2513. jne  L_113F
  2514. bsrl __l_mon_nan
  2515. jra  L_113G
  2516. L_113F:
  2517. bsrl __l_stanhd |  assuming a denorm...
  2518. L_113G:
  2519. fmovel fpsr,d0 |  update status register
  2520. orb a6@(USER_FPSR+3),d0 | add previously accrued exceptions
  2521. fmovel d0,fpsr
  2522. |
  2523. | Result is now in FP0
  2524. |
  2525. moveml a6@(USER_DA),d0-d1/a0-a1
  2526. fmovemx a6@(USER_FP1),fp1-fp3 |  note: fp0 not restored
  2527. fmovel a6@(USER_FPCR),fpcr | fpcr restored
  2528. unlk a6
  2529. rts
  2530. |
  2531. | MONADIC.GEN 1.3 4/30/91
  2532. |
  2533. | MONADIC.GEN --- generic MONADIC template
  2534. |
  2535. | This version saves all registers that will be used by the emulation
  2536. | routines and restores all but FP0 on exit.  The FPSR is
  2537. | updated to reflect the result of the operation.  Return value
  2538. | is placed in FP0 for single, double and extended results.
  2539. |
  2540. | The package subroutines expect the incoming fpcr to be zeroed
  2541. | since they need extended precision to work properly.  The
  2542. /* | 'final' fpcr is expected in d1 so that the calculated result */
  2543. | can be properly sized and rounded.  Also, if the incoming fpcr
  2544. | has enabled any exceptions, the exception will be taken on the
  2545. | final fmovem in this template.
  2546. |
  2547. | Customizations:
  2548. | 1. Remove the moveml at the entry and exit of
  2549. |    each routine if your compiler treats those
  2550. |    registers as scratch.
  2551. /* | 2. Likewise, don't save FP0/FP1 if they are scratch */
  2552. |    registers.
  2553. | 3. Delete handling of the fpsr if you only care about
  2554. |    the result.
  2555. | 4. Some (most?) C compilers convert all float arguments
  2556. |    to double, and provide no support at all for extended
  2557. |    precision so remove the __l_ftentoxs and __l_ftentoxx entry points.
  2558. | 5. Move the result to d0/d1 if the compiler is that old.
  2559. | Copyright (C) Motorola, Inc. 1991
  2560. | All Rights Reserved
  2561. |
  2562. | THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
  2563. | The copyright notice above does not evidence any
  2564. | actual or intended publication of such source code.
  2565. | xref __l_tag
  2566. | xref __l_stentox
  2567. | xref __l_ld_pone
  2568. | xref __l_szr_inf
  2569. | xref __l_mon_nan
  2570. | xref __l_stentoxd
  2571. .globl __l_ftentoxs
  2572. __l_ftentoxs:
  2573. link a6,#-LOCAL_SIZE
  2574. moveml d0-d1/a0-a1,a6@(USER_DA)
  2575. fmovemx fp0-fp3,a6@(USER_FP0)
  2576. fmovel fpsr,a6@(USER_FPSR)
  2577. fmovel fpcr,a6@(USER_FPCR)
  2578. fmovel fpcr,d1 /* |  user's rounding mode/precision */
  2579. fmovel #0,fpcr |  force rounding mode/prec to extended,rn
  2580. |
  2581. | copy, convert and tag input argument
  2582. |
  2583. fmoves a6@(8),fp0
  2584. fmovex fp0,a6@(ETEMP)
  2585. lea a6@(ETEMP),a0
  2586. bsrl __l_tag
  2587. moveb d0,a6@(STAG)
  2588. tstb d0
  2589. jne  L_1142
  2590. bsrl __l_stentox |  normalized (regular) number
  2591. jra  L_1146
  2592. L_1142:
  2593. cmpb #0x20,d0 |  zero?
  2594. jne  L_1143
  2595. bsrl __l_ld_pone
  2596. jra  L_1146
  2597. L_1143:
  2598. cmpb #0x40,d0 |  infinity?
  2599. jne  L_1144
  2600. bsrl __l_szr_inf
  2601. jra  L_1146
  2602. L_1144:
  2603. cmpb #0x60,d0 |  NaN?
  2604. jne  L_1145
  2605. bsrl __l_mon_nan
  2606. jra  L_1146
  2607. L_1145:
  2608. bsrl __l_stentoxd |  assuming a denorm...
  2609. L_1146:
  2610. fmovel fpsr,d0 |  update status register
  2611. orb a6@(USER_FPSR+3),d0 | add previously accrued exceptions
  2612. fmovel d0,fpsr
  2613. |
  2614. | Result is now in FP0
  2615. |
  2616. moveml a6@(USER_DA),d0-d1/a0-a1
  2617. fmovemx a6@(USER_FP1),fp1-fp3 |  note: fp0 not restored
  2618. fmovel a6@(USER_FPCR),fpcr | fpcr restored
  2619. unlk a6
  2620. rts
  2621. .globl __l_ftentoxd
  2622. __l_ftentoxd:
  2623. link a6,#-LOCAL_SIZE
  2624. moveml d0-d1/a0-a1,a6@(USER_DA)
  2625. fmovemx fp0-fp3,a6@(USER_FP0)
  2626. fmovel fpsr,a6@(USER_FPSR)
  2627. fmovel fpcr,a6@(USER_FPCR)
  2628. fmovel fpcr,d1 /* |  user's rounding mode/precision */
  2629. fmovel #0,fpcr |  force rounding mode/prec to extended,rn
  2630. |
  2631. | copy, convert and tag input argument
  2632. |
  2633. fmoved a6@(8),fp0
  2634. fmovex fp0,a6@(ETEMP)
  2635. lea a6@(ETEMP),a0
  2636. bsrl __l_tag
  2637. moveb d0,a6@(STAG)
  2638. tstb d0
  2639. jne  L_1147
  2640. bsrl __l_stentox |  normalized (regular) number
  2641. jra  L_114B
  2642. L_1147:
  2643. cmpb #0x20,d0 |  zero?
  2644. jne  L_1148
  2645. bsrl __l_ld_pone
  2646. jra  L_114B
  2647. L_1148:
  2648. cmpb #0x40,d0 |  infinity?
  2649. jne  L_1149
  2650. bsrl __l_szr_inf
  2651. jra  L_114B
  2652. L_1149:
  2653. cmpb #0x60,d0 |  NaN?
  2654. jne  L_114A
  2655. bsrl __l_mon_nan
  2656. jra  L_114B
  2657. L_114A:
  2658. bsrl __l_stentoxd |  assuming a denorm...
  2659. L_114B:
  2660. fmovel fpsr,d0 |  update status register
  2661. orb a6@(USER_FPSR+3),d0 | add previously accrued exceptions
  2662. fmovel d0,fpsr
  2663. |
  2664. | Result is now in FP0
  2665. |
  2666. moveml a6@(USER_DA),d0-d1/a0-a1
  2667. fmovemx a6@(USER_FP1),fp1-fp3 |  note: fp0 not restored
  2668. fmovel a6@(USER_FPCR),fpcr | fpcr restored
  2669. unlk a6
  2670. rts
  2671. .globl __l_ftentoxx
  2672. __l_ftentoxx:
  2673. link a6,#-LOCAL_SIZE
  2674. moveml d0-d1/a0-a1,a6@(USER_DA)
  2675. fmovemx fp0-fp3,a6@(USER_FP0)
  2676. fmovel fpsr,a6@(USER_FPSR)
  2677. fmovel fpcr,a6@(USER_FPCR)
  2678. fmovel fpcr,d1 /* |  user's rounding mode/precision */
  2679. fmovel #0,fpcr |  force rounding mode/prec to extended,rn
  2680. |
  2681. | copy, convert and tag input argument
  2682. |
  2683. fmovex a6@(8),fp0
  2684. fmovex fp0,a6@(ETEMP)
  2685. lea a6@(ETEMP),a0
  2686. bsrl __l_tag
  2687. moveb d0,a6@(STAG)
  2688. tstb d0
  2689. jne  L_114C
  2690. bsrl __l_stentox |  normalized (regular) number
  2691. jra  L_114G
  2692. L_114C:
  2693. cmpb #0x20,d0 |  zero?
  2694. jne  L_114D
  2695. bsrl __l_ld_pone
  2696. jra  L_114G
  2697. L_114D:
  2698. cmpb #0x40,d0 |  infinity?
  2699. jne  L_114E
  2700. bsrl __l_szr_inf
  2701. jra  L_114G
  2702. L_114E:
  2703. cmpb #0x60,d0 |  NaN?
  2704. jne  L_114F
  2705. bsrl __l_mon_nan
  2706. jra  L_114G
  2707. L_114F:
  2708. bsrl __l_stentoxd |  assuming a denorm...
  2709. L_114G:
  2710. fmovel fpsr,d0 |  update status register
  2711. orb a6@(USER_FPSR+3),d0 | add previously accrued exceptions
  2712. fmovel d0,fpsr
  2713. |
  2714. | Result is now in FP0
  2715. |
  2716. moveml a6@(USER_DA),d0-d1/a0-a1
  2717. fmovemx a6@(USER_FP1),fp1-fp3 |  note: fp0 not restored
  2718. fmovel a6@(USER_FPCR),fpcr | fpcr restored
  2719. unlk a6
  2720. rts
  2721. |
  2722. | MONADIC.GEN 1.3 4/30/91
  2723. |
  2724. | MONADIC.GEN --- generic MONADIC template
  2725. |
  2726. | This version saves all registers that will be used by the emulation
  2727. | routines and restores all but FP0 on exit.  The FPSR is
  2728. | updated to reflect the result of the operation.  Return value
  2729. | is placed in FP0 for single, double and extended results.
  2730. |
  2731. | The package subroutines expect the incoming fpcr to be zeroed
  2732. | since they need extended precision to work properly.  The
  2733. /* | 'final' fpcr is expected in d1 so that the calculated result */
  2734. | can be properly sized and rounded.  Also, if the incoming fpcr
  2735. | has enabled any exceptions, the exception will be taken on the
  2736. | final fmovem in this template.
  2737. |
  2738. | Customizations:
  2739. | 1. Remove the moveml at the entry and exit of
  2740. |    each routine if your compiler treats those
  2741. |    registers as scratch.
  2742. /* | 2. Likewise, don't save FP0/FP1 if they are scratch */
  2743. |    registers.
  2744. | 3. Delete handling of the fpsr if you only care about
  2745. |    the result.
  2746. | 4. Some (most?) C compilers convert all float arguments
  2747. |    to double, and provide no support at all for extended
  2748. |    precision so remove the __l_ftwotoxs and __l_ftwotoxx entry points.
  2749. | 5. Move the result to d0/d1 if the compiler is that old.
  2750. | Copyright (C) Motorola, Inc. 1991
  2751. | All Rights Reserved
  2752. |
  2753. | THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
  2754. | The copyright notice above does not evidence any
  2755. | actual or intended publication of such source code.
  2756. | xref __l_tag
  2757. | xref __l_stwotox
  2758. | xref __l_ld_pone
  2759. | xref __l_szr_inf
  2760. | xref __l_mon_nan
  2761. | xref __l_stwotoxd
  2762. .globl __l_ftwotoxs
  2763. __l_ftwotoxs:
  2764. link a6,#-LOCAL_SIZE
  2765. moveml d0-d1/a0-a1,a6@(USER_DA)
  2766. fmovemx fp0-fp3,a6@(USER_FP0)
  2767. fmovel fpsr,a6@(USER_FPSR)
  2768. fmovel fpcr,a6@(USER_FPCR)
  2769. fmovel fpcr,d1 /* |  user's rounding mode/precision */
  2770. fmovel #0,fpcr |  force rounding mode/prec to extended,rn
  2771. |
  2772. | copy, convert and tag input argument
  2773. |
  2774. fmoves a6@(8),fp0
  2775. fmovex fp0,a6@(ETEMP)
  2776. lea a6@(ETEMP),a0
  2777. bsrl __l_tag
  2778. moveb d0,a6@(STAG)
  2779. tstb d0
  2780. jne  L_1152
  2781. bsrl __l_stwotox |  normalized (regular) number
  2782. jra  L_1156
  2783. L_1152:
  2784. cmpb #0x20,d0 |  zero?
  2785. jne  L_1153
  2786. bsrl __l_ld_pone
  2787. jra  L_1156
  2788. L_1153:
  2789. cmpb #0x40,d0 |  infinity?
  2790. jne  L_1154
  2791. bsrl __l_szr_inf
  2792. jra  L_1156
  2793. L_1154:
  2794. cmpb #0x60,d0 |  NaN?
  2795. jne  L_1155
  2796. bsrl __l_mon_nan
  2797. jra  L_1156
  2798. L_1155:
  2799. bsrl __l_stwotoxd |  assuming a denorm...
  2800. L_1156:
  2801. fmovel fpsr,d0 |  update status register
  2802. orb a6@(USER_FPSR+3),d0 | add previously accrued exceptions
  2803. fmovel d0,fpsr
  2804. |
  2805. | Result is now in FP0
  2806. |
  2807. moveml a6@(USER_DA),d0-d1/a0-a1
  2808. fmovemx a6@(USER_FP1),fp1-fp3 |  note: fp0 not restored
  2809. fmovel a6@(USER_FPCR),fpcr | fpcr restored
  2810. unlk a6
  2811. rts
  2812. .globl __l_ftwotoxd
  2813. __l_ftwotoxd:
  2814. link a6,#-LOCAL_SIZE
  2815. moveml d0-d1/a0-a1,a6@(USER_DA)
  2816. fmovemx fp0-fp3,a6@(USER_FP0)
  2817. fmovel fpsr,a6@(USER_FPSR)
  2818. fmovel fpcr,a6@(USER_FPCR)
  2819. fmovel fpcr,d1 /* |  user's rounding mode/precision */
  2820. fmovel #0,fpcr |  force rounding mode/prec to extended,rn
  2821. |
  2822. | copy, convert and tag input argument
  2823. |
  2824. fmoved a6@(8),fp0
  2825. fmovex fp0,a6@(ETEMP)
  2826. lea a6@(ETEMP),a0
  2827. bsrl __l_tag
  2828. moveb d0,a6@(STAG)
  2829. tstb d0
  2830. jne  L_1157
  2831. bsrl __l_stwotox |  normalized (regular) number
  2832. jra  L_115B
  2833. L_1157:
  2834. cmpb #0x20,d0 |  zero?
  2835. jne  L_1158
  2836. bsrl __l_ld_pone
  2837. jra  L_115B
  2838. L_1158:
  2839. cmpb #0x40,d0 |  infinity?
  2840. jne  L_1159
  2841. bsrl __l_szr_inf
  2842. jra  L_115B
  2843. L_1159:
  2844. cmpb #0x60,d0 |  NaN?
  2845. jne  L_115A
  2846. bsrl __l_mon_nan
  2847. jra  L_115B
  2848. L_115A:
  2849. bsrl __l_stwotoxd |  assuming a denorm...
  2850. L_115B:
  2851. fmovel fpsr,d0 |  update status register
  2852. orb a6@(USER_FPSR+3),d0 | add previously accrued exceptions
  2853. fmovel d0,fpsr
  2854. |
  2855. | Result is now in FP0
  2856. |
  2857. moveml a6@(USER_DA),d0-d1/a0-a1
  2858. fmovemx a6@(USER_FP1),fp1-fp3 |  note: fp0 not restored
  2859. fmovel a6@(USER_FPCR),fpcr | fpcr restored
  2860. unlk a6
  2861. rts
  2862. .globl __l_ftwotoxx
  2863. __l_ftwotoxx:
  2864. link a6,#-LOCAL_SIZE
  2865. moveml d0-d1/a0-a1,a6@(USER_DA)
  2866. fmovemx fp0-fp3,a6@(USER_FP0)
  2867. fmovel fpsr,a6@(USER_FPSR)
  2868. fmovel fpcr,a6@(USER_FPCR)
  2869. fmovel fpcr,d1 /* |  user's rounding mode/precision */
  2870. fmovel #0,fpcr |  force rounding mode/prec to extended,rn
  2871. |
  2872. | copy, convert and tag input argument
  2873. |
  2874. fmovex a6@(8),fp0
  2875. fmovex fp0,a6@(ETEMP)
  2876. lea a6@(ETEMP),a0
  2877. bsrl __l_tag
  2878. moveb d0,a6@(STAG)
  2879. tstb d0
  2880. jne  L_115C
  2881. bsrl __l_stwotox |  normalized (regular) number
  2882. jra  L_115G
  2883. L_115C:
  2884. cmpb #0x20,d0 |  zero?
  2885. jne  L_115D
  2886. bsrl __l_ld_pone
  2887. jra  L_115G
  2888. L_115D:
  2889. cmpb #0x40,d0 |  infinity?
  2890. jne  L_115E
  2891. bsrl __l_szr_inf
  2892. jra  L_115G
  2893. L_115E:
  2894. cmpb #0x60,d0 |  NaN?
  2895. jne  L_115F
  2896. bsrl __l_mon_nan
  2897. jra  L_115G
  2898. L_115F:
  2899. bsrl __l_stwotoxd |  assuming a denorm...
  2900. L_115G:
  2901. fmovel fpsr,d0 |  update status register
  2902. orb a6@(USER_FPSR+3),d0 | add previously accrued exceptions
  2903. fmovel d0,fpsr
  2904. |
  2905. | Result is now in FP0
  2906. |
  2907. moveml a6@(USER_DA),d0-d1/a0-a1
  2908. fmovemx a6@(USER_FP1),fp1-fp3 |  note: fp0 not restored
  2909. fmovel a6@(USER_FPCR),fpcr | fpcr restored
  2910. unlk a6
  2911. rts
  2912. |
  2913. | MONADIC.GEN 1.3 4/30/91
  2914. |
  2915. | MONADIC.GEN --- generic MONADIC template
  2916. |
  2917. | This version saves all registers that will be used by the emulation
  2918. | routines and restores all but FP0 on exit.  The FPSR is
  2919. | updated to reflect the result of the operation.  Return value
  2920. | is placed in FP0 for single, double and extended results.
  2921. |
  2922. | The package subroutines expect the incoming fpcr to be zeroed
  2923. | since they need extended precision to work properly.  The
  2924. /* | 'final' fpcr is expected in d1 so that the calculated result */
  2925. | can be properly sized and rounded.  Also, if the incoming fpcr
  2926. | has enabled any exceptions, the exception will be taken on the
  2927. | final fmovem in this template.
  2928. |
  2929. | Customizations:
  2930. | 1. Remove the moveml at the entry and exit of
  2931. |    each routine if your compiler treats those
  2932. |    registers as scratch.
  2933. /* | 2. Likewise, don't save FP0/FP1 if they are scratch */