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

VxWorks

开发平台:

C/C++

  1. /* do_func.s - Motorola 68040 FP routine jump table (EXC) */
  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. 01g,31may96,ms   updated to mototorola version 2.3
  10. 01f,14jun95,tpr  changed fbxx to fbxxl.
  11. 01e,21jul93,kdl  added .text (SPR #2372).
  12. 01d,23aug92,jcf  changed bxxx to jxx.
  13. 01c,26may92,rrr  the tree shuffle
  14. 01b,10jan92,kdl  added modification history; general cleanup.
  15. 01a,15aug91,kdl  original version, from Motorola FPSP v2.0.
  16. */
  17. /*
  18. DESCRIPTION
  19. do_funcsa 3.4 2/18/91
  20. Do_func performs the unimplemented operation.  The operation
  21. to be performed is determined from the lower 7 bits of the
  22. extension word (except in the case of fmovecr and fsincos).
  23. The opcode and tag bits form an index into a jump table in
  24. tbldosa.  Cases of zero, infinity and NaN are handled in
  25. __x_do_func by forcing the default result.  Normalized and
  26. denormalized (there are no unnormalized numbers at this
  27. point) are passed onto the emulation code.
  28. CMDREG1B and STAG are extracted from the fsave frame
  29. and combined to form the table index.  The function called
  30. will start with a0 pointing to the ETEMP operand.  Dyadic
  31. functions can find FPTEMP at a0@(-12).
  32. Called functions return their result in fp0.  Sincos returns
  33. sin(x) in fp0 and cos(x) in fp1.
  34. Copyright (C) Motorola, Inc. 1990
  35. All Rights Reserved
  36. THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
  37. The copyright notice above does not evidence any
  38. actual or intended publication of such source code.
  39. DO_FUNC idnt    2,1 Motorola 040 Floating Point Software Package
  40. section 8
  41. NOMANUAL
  42. */
  43. #include "fpsp040E.h"
  44. | xref __x_t_dz2
  45. | xref __x_t_operr
  46. | xref __x_t_inx2
  47. | xref  __x_t_resdnrm
  48. | xref __x_dst_nan
  49. | xref __x_src_nan
  50. | xref __x_nrm_set
  51. | xref __x_sto_cos
  52. | xref __x_tblpre
  53. | xref __x_slognp1,__x_slogn,__x_slog10,__x_slog2
  54. | xref __x_slognd,__x_slog10d,__x_slog2d
  55. | xref __x_smod,__x_srem
  56. | xref __x_sscale
  57. | xref __x_smovcr
  58. PONE: .long 0x3fff0000,0x80000000,0x00000000 | +1
  59. MONE: .long 0xbfff0000,0x80000000,0x00000000 | -1
  60. PZERO: .long 0x00000000,0x00000000,0x00000000 | +0
  61. MZERO: .long 0x80000000,0x00000000,0x00000000 | -0
  62. PINF: .long 0x7fff0000,0x00000000,0x00000000 | +inf
  63. MINF: .long 0xffff0000,0x00000000,0x00000000 | -inf
  64. QNAN: .long 0x7fff0000,0xffffffff,0xffffffff | non-signaling nan
  65. PPIBY2:  .long 0x3FFF0000,0xC90FDAA2,0x2168C235 | +PI/2
  66. MPIBY2:  .long 0xbFFF0000,0xC90FDAA2,0x2168C235 | -PI/2
  67. .globl __x_do_func
  68. .text
  69. __x_do_func:
  70. clrb a6@(CU_ONLY)
  71. |
  72. | Check for fmovecr.  It does not follow the format of fp gen
  73. | unimplemented instructions.  The test is on the upper 6 bits|
  74. | if they are 0x17, the inst is fmovecr.  Call entry __x_smovcr
  75. | directly.
  76. |
  77. bfextu a6@(CMDREG1B){#0:#6},d0 | get opclass and src fields
  78. cmpil #0x17,d0 | if op class and size fields are 0x17,
  79. | | it is FMOVECR|  if not, continue
  80. jne  not_fmovecr
  81. jmp __x_smovcr | fmovecr|  jmp directly to emulation
  82. not_fmovecr:
  83. movew a6@(CMDREG1B),d0
  84. andl #0x7F,d0
  85. cmpil #0x38,d0 | if the extension is >= 0x38,
  86. jge  __x_serror | it is illegal
  87. bfextu a6@(STAG){#0:#3},d1
  88. lsll #3,d0 | make room for STAG
  89. addl d1,d0 | combine for final index into table
  90. lea __x_tblpre,a1 | start of monster jump table
  91. movel a1@(d0:w:4),a1 | real target address
  92. lea a6@(ETEMP),a0 | a0 is pointer to src op
  93. movel a6@(USER_FPCR),d1
  94. andl #0xFF,d1 |  discard all but rounding mode/prec
  95. fmovel #0,fpcr
  96. jmp a1@
  97. |
  98. | ERROR
  99. |
  100. .globl __x_serror
  101. __x_serror:
  102. st a6@(STORE_FLG)
  103. rts
  104. |
  105. | These routines load forced values into fp0.  They are called
  106. | by index into tbldo.
  107. |
  108. | Load a signed zero to fp0 and set inex2/ainex
  109. |
  110. .globl __x_snzrinx
  111. __x_snzrinx:
  112. btst #sign_bit,a0@(LOCAL_EX) | get sign of source operand
  113. jne  ld_mzinx | if negative, branch
  114. bsrl __x_ld_pzero | bsr so we can return and set inx
  115. jra  __x_t_inx2 | now, set the inx for the next inst
  116. ld_mzinx:
  117. bsrl __x_ld_mzero | if neg, load neg zero, return here
  118. jra  __x_t_inx2 | now, set the inx for the next inst
  119. |
  120. | Load a signed zero to fp0|  do not set inex2/ainex
  121. |
  122. .globl __x_szero
  123. __x_szero:
  124. btst #sign_bit,a0@(LOCAL_EX) | get sign of source operand
  125. jne  __x_ld_mzero | if neg, load neg zero
  126. jra  __x_ld_pzero | load positive zero
  127. |
  128. | Load a signed infinity to fp0|  do not set inex2/ainex
  129. |
  130. .globl __x_sinf
  131. __x_sinf:
  132. btst #sign_bit,a0@(LOCAL_EX) | get sign of source operand
  133. jne  __x_ld_minf | if negative branch
  134. jra  __x_ld_pinf
  135. |
  136. | Load a signed one to fp0|  do not set inex2/ainex
  137. |
  138. .globl __x_sone
  139. __x_sone:
  140. btst #sign_bit,a0@(LOCAL_EX) | check sign of source
  141. jne  __x_ld_mone
  142. jra  __x_ld_pone
  143. |
  144. | Load a signed pi/2 to fp0|  do not set inex2/ainex
  145. |
  146. .globl __x_spi_2
  147. __x_spi_2:
  148. btst #sign_bit,a0@(LOCAL_EX) | check sign of source
  149. jne  __x_ld_mpi2
  150. jra  __x_ld_ppi2
  151. |
  152. | Load either a +0 or +inf for plus/minus operand
  153. |
  154. .globl __x_szr_inf
  155. __x_szr_inf:
  156. btst #sign_bit,a0@(LOCAL_EX) | check sign of source
  157. jne  __x_ld_pzero
  158. jra  __x_ld_pinf
  159. |
  160. | Result is either an operr or +inf for plus/minus operand
  161. | [Used by __x_slogn, __x_slognp1, __x_slog10, and __x_slog2]
  162. |
  163. .globl __x_sopr_inf
  164. __x_sopr_inf:
  165. btst #sign_bit,a0@(LOCAL_EX) | check sign of source
  166. jne  __x_t_operr
  167. jra  __x_ld_pinf
  168. |
  169. | FLOGNP1
  170. |
  171. .globl __x_sslognp1
  172. __x_sslognp1:
  173. fmovemx a0@,fp0-fp0
  174. fcmpb #-1,fp0
  175. fbgtl __x_slognp1
  176. fbeql __x_t_dz2 | if = -1, divide by zero exception
  177. fmovel #0,FPSR | clr N flag
  178. jra  __x_t_operr | take care of operands < -1
  179. |
  180. | FETOXM1
  181. |
  182. .globl __x_setoxm1i
  183. __x_setoxm1i:
  184. btst #sign_bit,a0@(LOCAL_EX) | check sign of source
  185. jne  __x_ld_mone
  186. jra  __x_ld_pinf
  187. |
  188. | FLOGN
  189. |
  190. | Test for 1.0 as an input argument, returning +zero.  Also check
  191. | the sign and return operr if negative.
  192. |
  193. .globl __x_sslogn
  194. __x_sslogn:
  195. btst #sign_bit,a0@(LOCAL_EX)
  196. jne  __x_t_operr | take care of operands < 0
  197. cmpiw #0x3fff,a0@(LOCAL_EX)  | test for 1.0 input
  198. jne  __x_slogn
  199. cmpil #0x80000000,a0@(LOCAL_HI)
  200. jne  __x_slogn
  201. tstl a0@(LOCAL_LO)
  202. jne  __x_slogn
  203. fmovex PZERO,fp0
  204. rts
  205. .globl __x_sslognd
  206. __x_sslognd:
  207. btst #sign_bit,a0@(LOCAL_EX)
  208. jeq  __x_slognd
  209. jra  __x_t_operr | take care of operands < 0
  210. |
  211. | FLOG10
  212. |
  213. .globl __x_sslog10
  214. __x_sslog10:
  215. btst #sign_bit,a0@(LOCAL_EX)
  216. jne  __x_t_operr | take care of operands < 0
  217. cmpiw #0x3fff,a0@(LOCAL_EX)  | test for 1.0 input
  218. jne  __x_slog10
  219. cmpil #0x80000000,a0@(LOCAL_HI)
  220. jne  __x_slog10
  221. tstl a0@(LOCAL_LO)
  222. jne  __x_slog10
  223. fmovex PZERO,fp0
  224. rts
  225. .globl __x_sslog10d
  226. __x_sslog10d:
  227. btst #sign_bit,a0@(LOCAL_EX)
  228. jeq  __x_slog10d
  229. jra  __x_t_operr | take care of operands < 0
  230. |
  231. | FLOG2
  232. |
  233. .globl __x_sslog2
  234. __x_sslog2:
  235. btst #sign_bit,a0@(LOCAL_EX)
  236. jne  __x_t_operr | take care of operands < 0
  237. cmpiw #0x3fff,a0@(LOCAL_EX)  | test for 1.0 input
  238. jne  __x_slog2
  239. cmpil #0x80000000,a0@(LOCAL_HI)
  240. jne  __x_slog2
  241. tstl a0@(LOCAL_LO)
  242. jne  __x_slog2
  243. fmovex PZERO,fp0
  244. rts
  245. .globl __x_sslog2d
  246. __x_sslog2d:
  247. btst #sign_bit,a0@(LOCAL_EX)
  248. jeq  __x_slog2d
  249. jra  __x_t_operr | take care of operands < 0
  250. |
  251. | FMOD
  252. |
  253. __x_pmodt:
  254. | | 0x21 fmod
  255. | | dtag,stag
  256. .long __x_smod |   00,00  norm,norm = normal
  257. .long __x_smod_oper |   00,01  norm,zero = nan with operr
  258. .long __x_smod_fpn |   00,10  norm,inf  = fpn
  259. .long __x_smod_snan |   00,11  norm,nan  = nan
  260. .long __x_smod_zro |   01,00  zero,norm = +-zero
  261. .long __x_smod_oper |   01,01  zero,zero = nan with operr
  262. .long __x_smod_zro |   01,10  zero,inf  = +-zero
  263. .long __x_smod_snan |   01,11  zero,nan  = nan
  264. .long __x_smod_oper |   10,00  inf,norm  = nan with operr
  265. .long __x_smod_oper |   10,01  inf,zero  = nan with operr
  266. .long __x_smod_oper |   10,10  inf,inf   = nan with operr
  267. .long __x_smod_snan |   10,11  inf,nan   = nan
  268. .long __x_smod_dnan |   11,00  nan,norm  = nan
  269. .long __x_smod_dnan |   11,01  nan,zero  = nan
  270. .long __x_smod_dnan |   11,10  nan,inf   = nan
  271. .long __x_smod_dnan |   11,11  nan,nan   = nan
  272. .globl __x_pmod
  273. __x_pmod:
  274. clr.b FPSR_QBYTE(a6)      | clear quotient field
  275. bfextu a6@(STAG){#0:#3},d0 | stag = d0
  276. bfextu a6@(DTAG){#0:#3},d1 | dtag = d1
  277. |
  278. | Alias extended denorms to norms for the jump table.
  279. |
  280. bclr #2,d0
  281. bclr #2,d1
  282. lslb #2,d1
  283. orb d0,d1 | d1{3:2} = dtag, d1{1:0} = stag
  284. | | Tag values:
  285. | | 00 = norm or denorm
  286. | | 01 = zero
  287. | | 10 = inf
  288. | | 11 = nan
  289. lea __x_pmodt,a1
  290. movel a1@(d1:w:4),a1
  291. jmp a1@
  292. __x_smod_snan:
  293. jra  __x_src_nan
  294. __x_smod_dnan:
  295. jra  __x_dst_nan
  296. __x_smod_oper:
  297. jra  __x_t_operr
  298. __x_smod_zro:
  299. moveb a6@(ETEMP),d1 | get sign of src op
  300. moveb a6@(FPTEMP),d0 | get sign of dst op
  301. eorb d0,d1 | get exor of sign bits
  302. btst #7,d1 | test for sign
  303. jeq  __x_smod_zsn | if clr, do not set sign big
  304. bset #q_sn_bit,a6@(FPSR_QBYTE) | set q-byte sign bit
  305. __x_smod_zsn:
  306. btst #7,d0 | test if + or -
  307. jeq  __x_ld_pzero | if pos then load +0
  308. jra  __x_ld_mzero | else neg load -0
  309. __x_smod_fpn:
  310. moveb a6@(ETEMP),d1 | get sign of src op
  311. moveb a6@(FPTEMP),d0 | get sign of dst op
  312. eorb d0,d1 | get exor of sign bits
  313. btst #7,d1 | test for sign
  314. jeq  __x_smod_fsn | if clr, do not set sign big
  315. bset #q_sn_bit,a6@(FPSR_QBYTE) | set q-byte sign bit
  316. __x_smod_fsn:
  317. tstb a6@(DTAG) | filter out denormal destination case
  318. jpl  __x_smod_nrm |
  319. lea a6@(FPTEMP),a0 | a0<- addr(FPTEMP)
  320. jra  __x_t_resdnrm | force UNFL(but exact) result
  321. __x_smod_nrm:
  322. fmovel a6@(USER_FPCR),fpcr /* | use user's rmode and precision */
  323. fmovex a6@(FPTEMP),fp0 | return dest to fp0
  324. rts
  325. |
  326. | FREM
  327. |
  328. __x_premt:
  329. | | 0x25 frem
  330. | | dtag,stag
  331. .long __x_srem |   00,00  norm,norm = normal
  332. .long __x_srem_oper |   00,01  norm,zero = nan with operr
  333. .long __x_srem_fpn |   00,10  norm,inf  = fpn
  334. .long __x_srem_snan |   00,11  norm,nan  = nan
  335. .long __x_srem_zro |   01,00  zero,norm = +-zero
  336. .long __x_srem_oper |   01,01  zero,zero = nan with operr
  337. .long __x_srem_zro |   01,10  zero,inf  = +-zero
  338. .long __x_srem_snan |   01,11  zero,nan  = nan
  339. .long __x_srem_oper |   10,00  inf,norm  = nan with operr
  340. .long __x_srem_oper |   10,01  inf,zero  = nan with operr
  341. .long __x_srem_oper |   10,10  inf,inf   = nan with operr
  342. .long __x_srem_snan |   10,11  inf,nan   = nan
  343. .long __x_srem_dnan |   11,00  nan,norm  = nan
  344. .long __x_srem_dnan |   11,01  nan,zero  = nan
  345. .long __x_srem_dnan |   11,10  nan,inf   = nan
  346. .long __x_srem_dnan |   11,11  nan,nan   = nan
  347. .globl __x_prem
  348. __x_prem:
  349. clr.b FPSR_QBYTE(a6)      | clear quotient field
  350. bfextu a6@(STAG){#0:#3},d0 | stag = d0
  351. bfextu a6@(DTAG){#0:#3},d1 | dtag = d1
  352. |
  353. | Alias extended denorms to norms for the jump table.
  354. |
  355. bclr #2,d0
  356. bclr #2,d1
  357. lslb #2,d1
  358. orb d0,d1 | d1{3:2} = dtag, d1{1:0} = stag
  359. | | Tag values:
  360. | | 00 = norm or denorm
  361. | | 01 = zero
  362. | | 10 = inf
  363. | | 11 = nan
  364. lea __x_premt,a1
  365. movel a1@(d1:w:4),a1
  366. jmp a1@
  367. __x_srem_snan:
  368. jra  __x_src_nan
  369. __x_srem_dnan:
  370. jra  __x_dst_nan
  371. __x_srem_oper:
  372. jra  __x_t_operr
  373. __x_srem_zro:
  374. moveb a6@(ETEMP),d1 | get sign of src op
  375. moveb a6@(FPTEMP),d0 | get sign of dst op
  376. eorb d0,d1 | get exor of sign bits
  377. btst #7,d1 | test for sign
  378. jeq  __x_srem_zsn | if clr, do not set sign big
  379. bset #q_sn_bit,a6@(FPSR_QBYTE) | set q-byte sign bit
  380. __x_srem_zsn:
  381. btst #7,d0 | test if + or -
  382. jeq  __x_ld_pzero | if pos then load +0
  383. jra  __x_ld_mzero | else neg load -0
  384. __x_srem_fpn:
  385. moveb a6@(ETEMP),d1 | get sign of src op
  386. moveb a6@(FPTEMP),d0 | get sign of dst op
  387. eorb d0,d1 | get exor of sign bits
  388. btst #7,d1 | test for sign
  389. jeq  __x_srem_fsn | if clr, do not set sign big
  390. bset #q_sn_bit,a6@(FPSR_QBYTE) | set q-byte sign bit
  391. __x_srem_fsn:
  392. tstb a6@(DTAG) | filter out denormal destination case
  393. jpl  __x_srem_nrm |
  394. lea a6@(FPTEMP),a0 | a0<- addr(FPTEMP)
  395. jra  __x_t_resdnrm | force UNFL(but exact) result
  396. __x_srem_nrm:
  397. fmovel a6@(USER_FPCR),fpcr /* | use user's rmode and precision */
  398. fmovex a6@(FPTEMP),fp0 | return dest to fp0
  399. rts
  400. |
  401. | FSCALE
  402. |
  403. __x_pscalet:
  404. | | 0x26 fscale
  405. | | dtag,stag
  406. .long __x_sscale |   00,00  norm,norm = result
  407. .long __x_sscale |   00,01  norm,zero = fpn
  408. .long scl_opr |   00,10  norm,inf  = nan with operr
  409. .long scl_snan |   00,11  norm,nan  = nan
  410. .long scl_zro |   01,00  zero,norm = +-zero
  411. .long scl_zro |   01,01  zero,zero = +-zero
  412. .long scl_opr |   01,10  zero,inf  = nan with operr
  413. .long scl_snan |   01,11  zero,nan  = nan
  414. .long scl_inf |   10,00  inf,norm  = +-inf
  415. .long scl_inf |   10,01  inf,zero  = +-inf
  416. .long scl_opr |   10,10  inf,inf   = nan with operr
  417.   .long scl_snan |   10,11  inf,nan   = nan
  418.   .long scl_dnan |   11,00  nan,norm  = nan
  419.   .long scl_dnan |   11,01  nan,zero  = nan
  420.   .long scl_dnan |   11,10  nan,inf   = nan
  421. .long scl_dnan |   11,11  nan,nan   = nan
  422. .globl __x_pscale
  423. __x_pscale:
  424. bfextu a6@(STAG){#0:#3},d0 | stag in d0
  425. bfextu a6@(DTAG){#0:#3},d1 | dtag in d1
  426. bclr #2,d0 | alias  denorm into norm
  427. bclr #2,d1 | alias  denorm into norm
  428. lslb #2,d1
  429. orb d0,d1 | d1{4:2} = dtag, d1{1:0} = stag
  430. | | dtag values     stag values:
  431. | | 000 = norm      00 = norm
  432. | | 001 = zero  01 = zero
  433. | | 010 = inf  10 = inf
  434. | | 011 = nan  11 = nan
  435. | | 100 = dnrm
  436. |
  437. |
  438. lea __x_pscalet,a1 | load start of jump table
  439. movel a1@(d1:w:4),a1 | load a1 with label depending on tag
  440. jmp a1@ | go to the routine
  441. scl_opr:
  442. jra  __x_t_operr
  443. scl_dnan:
  444. jra  __x_dst_nan
  445. scl_zro:
  446. btst #sign_bit,a6@(FPTEMP_EX) | test if + or -
  447. jeq  __x_ld_pzero | if pos then load +0
  448. jra  __x_ld_mzero | if neg then load -0
  449. scl_inf:
  450. btst #sign_bit,a6@(FPTEMP_EX) | test if + or -
  451. jeq  __x_ld_pinf | if pos then load +inf
  452. jra  __x_ld_minf | else neg load -inf
  453. scl_snan:
  454. jra  __x_src_nan
  455. |
  456. | FSINCOS
  457. |
  458. .globl __x_ssincosz
  459. __x_ssincosz:
  460. btst #sign_bit,a6@(ETEMP) | get sign
  461. jeq  sincosp
  462. fmovex MZERO,fp0
  463. jra  sincoscom
  464. sincosp:
  465. fmovex PZERO,fp0
  466. sincoscom:
  467.    fmovemx PONE,fp1-fp1 | do not allow FPSR to be affected
  468. jra  __x_sto_cos | store cosine result
  469. .globl __x_ssincosi
  470. __x_ssincosi:
  471. fmovex QNAN,fp1 | load NAN
  472. bsrl __x_sto_cos | store cosine result
  473. fmovex QNAN,fp0 | load NAN
  474. jra  __x_t_operr
  475. .globl __x_ssincosnan
  476. __x_ssincosnan:
  477. movel a6@(ETEMP_EX),a6@(FP_SCR1)
  478. movel a6@(ETEMP_HI),a6@(FP_SCR1+4)
  479. movel a6@(ETEMP_LO),a6@(FP_SCR1+8)
  480. bset #signan_bit,a6@(FP_SCR1+4)
  481. fmovemx a6@(FP_SCR1),fp1-fp1
  482. bsrl __x_sto_cos
  483. jra  __x_src_nan
  484. |
  485. | This code forces default values for the zero, inf, and nan cases
  486. | in the transcendentals code.  The CC bits must be set in the
  487. | stacked FPSR to be correctly reported.
  488. |
  489. |**Returns +PI/2
  490. .globl __x_ld_ppi2
  491. __x_ld_ppi2:
  492. fmovex PPIBY2,fp0 | load +pi/2
  493. jra  __x_t_inx2 | set inex2 exc
  494. |**Returns -PI/2
  495. .globl __x_ld_mpi2
  496. __x_ld_mpi2:
  497. fmovex MPIBY2,fp0 | load -pi/2
  498. orl #neg_mask,a6@(USER_FPSR) | set N bit
  499. jra  __x_t_inx2 | set inex2 exc
  500. |**Returns +inf
  501. .globl __x_ld_pinf
  502. __x_ld_pinf:
  503. fmovex PINF,fp0 | load +inf
  504. orl #inf_mask,a6@(USER_FPSR) | set I bit
  505. rts
  506. |**Returns -inf
  507. .globl __x_ld_minf
  508. __x_ld_minf:
  509. fmovex MINF,fp0 | load -inf
  510. orl #neg_mask+inf_mask,a6@(USER_FPSR) | set N and I bits
  511. rts
  512. |**Returns +1
  513. .globl __x_ld_pone
  514. __x_ld_pone:
  515. fmovex PONE,fp0 | load +1
  516. rts
  517. |**Returns -1
  518. .globl __x_ld_mone
  519. __x_ld_mone:
  520. fmovex MONE,fp0 | load -1
  521. orl #neg_mask,a6@(USER_FPSR) | set N bit
  522. rts
  523. |**Returns +0
  524. .globl __x_ld_pzero
  525. __x_ld_pzero:
  526. fmovex PZERO,fp0 | load +0
  527. orl #z_mask,a6@(USER_FPSR) | set Z bit
  528. rts
  529. |**Returns -0
  530. .globl __x_ld_mzero
  531. __x_ld_mzero:
  532. fmovex MZERO,fp0 | load -0
  533. orl #neg_mask+z_mask,a6@(USER_FPSR) | set N and Z bits
  534. rts
  535. | end