Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

682 lines
19 KiB

  1. .file "acosf.s"
  2. // Copyright (c) 2000, Intel Corporation
  3. // All rights reserved.
  4. //
  5. // Contributed 2/2/2000 by John Harrison, Ted Kubaska, Bob Norin, Shane Story,
  6. // and Ping Tak Peter Tang of the Computational Software Lab, Intel Corporation.
  7. //
  8. // WARRANTY DISCLAIMER
  9. //
  10. // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  11. // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  12. // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  13. // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR ITS
  14. // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
  15. // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  16. // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
  17. // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
  18. // OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY OR TORT (INCLUDING
  19. // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  20. // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  21. //
  22. // Intel Corporation is the author of this code, and requests that all
  23. // problem reports or change requests be submitted to it directly at
  24. // http://developer.intel.com/opensource.
  25. // History
  26. //==============================================================
  27. // 2/02/00 Initial revision
  28. // 6/28/00 Improved speed
  29. // 6/31/00 Changed register allocation because of some duplicate macros
  30. // moved nan exit bundle up to gain a cycle.
  31. // 8/15/00 Bundle added after call to __libm_error_support to properly
  32. // set [the previously overwritten] GR_Parameter_RESULT.
  33. // 8/17/00 Changed predicate register macro-usage to direct predicate
  34. // names due to an assembler bug.
  35. // 10/17/00 Improved speed of x=0 and x=1 paths, set D flag if x denormal.
  36. // Description
  37. //=========================================
  38. // The acosf function computes the principle value of the arc sine of x.
  39. // A doman error occurs for arguments not in the range [-1,+1].
  40. // The acosf function returns the arc cosine in the range [0, +pi] radians.
  41. // acos(1) returns +0
  42. // acos(x) returns a Nan and raises the invalid exception for |x| >1
  43. // |x| <= sqrt(2)/2. get Ax and Bx
  44. // poly_p1 = x p1
  45. // poly_p3 = x2 p4 + p3
  46. // poly_p1 = x2 (poly_p1) + x = x2(x p1) + x
  47. // poly_p2 = x2( poly_p3) + p2 = x2(x2 p4 + p3) + p2
  48. // poly_Ax = x5(x2( poly_p3) + p2) + x2(x p1) + x
  49. // = x5(x2(x2 p4 + p3) + p2) + x2(x p1) + x
  50. // poly_p7 = x2 p8 + p7
  51. // poly_p5 = x2 p6 + p5
  52. // poly_p7 = x4 p9 + (x2 p8 + p7)
  53. // poly_Bx = x4 (x4 p9 + (x2 p8 + p7)) + x2 p6 + p5
  54. // sinf1 = x11(x4 (x4 p9 + (x2 p8 + p7)) + x2 p6 + p5) + x5(x2(x2 p4 + p3) + p2) + x2(x p1) + x
  55. // = x19 p9 + x17 p8 + x15 p7 x13 p6 + x11 p5 + x9 p4 + x7 p3 + x5 p2 + x3 p1 + x
  56. // answer1 = pi/2 - sinf1
  57. // |x| > sqrt(2)/2
  58. // Get z = sqrt(1-x2)
  59. // Get polynomial in t = 1-x2
  60. // t2 = t t
  61. // t4 = t2 t2
  62. // poly_p4 = t p5 + p4
  63. // poly_p1 = t p1 + 1
  64. // poly_p6 = t p7 + p6
  65. // poly_p2 = t p3 + p2
  66. // poly_p8 = t p9 + p8
  67. // poly_p4 = t2 poly_p6 + poly_p4
  68. // = t2 (t p7 + p6) + (t p5 + p4)
  69. // poly_p2 = t2 poly_p2 + poly_p1
  70. // = t2 (t p3 + p2) + (t p1 + 1)
  71. // poly_p4 = t4 poly_p8 + poly_p4
  72. // = t4 (t p9 + p8) + (t2 (t p7 + p6) + (t p5 + p4))
  73. // P(t) = poly_p2 + t4 poly_p8
  74. // = t2 (t p3 + p2) + (t p1 + 1) + t4 (t4 (t p9 + p8) + (t2 (t p7 + p6) + (t p5 + p4)))
  75. // = t3 p3 + t2 p2 + t p1 + 1 + t9 p9 + t8 p8 + t7 p7 + t6 p6 + t5 p5 + t4 p4
  76. // answer2 = sign(x) z P(t) if x>0
  77. // = sign(x) z P(t) + pi if x<0
  78. //
  79. // Assembly macros
  80. //=========================================
  81. // predicate registers
  82. //acosf_pred_LEsqrt2by2 = p7
  83. //acosf_pred_GTsqrt2by2 = p8
  84. // integer registers
  85. ACOSF_Addr1 = r33
  86. ACOSF_Addr2 = r34
  87. ACOSF_GR_1by2 = r35
  88. ACOSF_GR_3by2 = r36
  89. ACOSF_GR_5by2 = r37
  90. GR_SAVE_B0 = r38
  91. GR_SAVE_PFS = r39
  92. GR_SAVE_GP = r40
  93. GR_Parameter_X = r41
  94. GR_Parameter_Y = r42
  95. GR_Parameter_RESULT = r43
  96. GR_Parameter_TAG = r44
  97. // floating point registers
  98. acosf_y = f32
  99. acosf_abs_x = f33
  100. acosf_x2 = f34
  101. acosf_sgn_x = f35
  102. acosf_1by2 = f36
  103. acosf_3by2 = f37
  104. acosf_5by2 = f38
  105. acosf_coeff_P3 = f39
  106. acosf_coeff_P8 = f40
  107. acosf_coeff_P1 = f41
  108. acosf_coeff_P4 = f42
  109. acosf_coeff_P5 = f43
  110. acosf_coeff_P2 = f44
  111. acosf_coeff_P7 = f45
  112. acosf_coeff_P6 = f46
  113. acosf_coeff_P9 = f47
  114. acosf_x2 = f48
  115. acosf_x3 = f49
  116. acosf_x4 = f50
  117. acosf_x8 = f51
  118. acosf_x5 = f52
  119. acosf_const_piby2 = f53
  120. acosf_const_sqrt2by2 = f54
  121. acosf_x11 = f55
  122. acosf_poly_p1 = f56
  123. acosf_poly_p3 = f57
  124. acosf_sinf1 = f58
  125. acosf_poly_p2 = f59
  126. acosf_poly_Ax = f60
  127. acosf_poly_p7 = f61
  128. acosf_poly_p5 = f62
  129. acosf_sgnx_t4 = f63
  130. acosf_poly_Bx = f64
  131. acosf_t = f65
  132. acosf_yby2 = f66
  133. acosf_B = f67
  134. acosf_B2 = f68
  135. acosf_Az = f69
  136. acosf_dz = f70
  137. acosf_Sz = f71
  138. acosf_d2z = f72
  139. acosf_Fz = f73
  140. acosf_z = f74
  141. acosf_sgnx_z = f75
  142. acosf_t2 = f76
  143. acosf_2poly_p4 = f77
  144. acosf_2poly_p6 = f78
  145. acosf_2poly_p1 = f79
  146. acosf_2poly_p2 = f80
  147. acosf_2poly_p8 = f81
  148. acosf_t4 = f82
  149. acosf_Pt = f83
  150. acosf_sgnx_2poly_p2 = f84
  151. acosf_sgn_x_piby2 = f85
  152. acosf_poly_p7a = f86
  153. acosf_2poly_p4a = f87
  154. acosf_2poly_p4b = f88
  155. acosf_2poly_p2a = f89
  156. acosf_poly_p1a = f90
  157. // Data tables
  158. //==============================================================
  159. .data
  160. .align 16
  161. acosf_coeff_1_table:
  162. data8 0x3FC5555607DCF816 // P1
  163. data8 0x3F9CF81AD9BAB2C6 // P4
  164. data8 0x3FC59E0975074DF3 // P7
  165. data8 0xBFA6F4CC2780AA1D // P6
  166. data8 0x3FC2DD45292E93CB // P9
  167. data8 0x3fe6a09e667f3bcd // sqrt(2)/2
  168. acosf_coeff_2_table:
  169. data8 0x3FA6F108E31EFBA6 // P3
  170. data8 0xBFCA31BF175D82A0 // P8
  171. data8 0x3FA30C0337F6418B // P5
  172. data8 0x3FB332C9266CB1F9 // P2
  173. data8 0x3ff921fb54442d18 // pi_by_2
  174. .align 32
  175. .global acosf
  176. .section .text
  177. .proc acosf
  178. .align 32
  179. acosf:
  180. // Load the addresses of the two tables.
  181. // Then, load the coefficients and other constants.
  182. { .mfi
  183. alloc r32 = ar.pfs,1,8,4,0
  184. fnma.s1 acosf_t = f8,f8,f1
  185. dep.z ACOSF_GR_1by2 = 0x3f,24,8 // 0x3f000000
  186. }
  187. { .mfi
  188. addl ACOSF_Addr1 = @ltoff(acosf_coeff_1_table),gp
  189. fma.s1 acosf_x2 = f8,f8,f0
  190. addl ACOSF_Addr2 = @ltoff(acosf_coeff_2_table),gp ;;
  191. }
  192. { .mfi
  193. ld8 ACOSF_Addr1 = [ACOSF_Addr1]
  194. fmerge.s acosf_abs_x = f1,f8
  195. dep ACOSF_GR_3by2 = 1,r0,22,8 // 0x3fc00000
  196. }
  197. { .mlx
  198. nop.m 999
  199. movl ACOSF_GR_5by2 = 0x40200000;;
  200. }
  201. { .mfi
  202. setf.s acosf_1by2 = ACOSF_GR_1by2
  203. fmerge.s acosf_sgn_x = f8,f1
  204. nop.i 999
  205. }
  206. { .mfi
  207. ld8 ACOSF_Addr2 = [ACOSF_Addr2]
  208. nop.f 0
  209. nop.i 999;;
  210. }
  211. { .mfi
  212. setf.s acosf_5by2 = ACOSF_GR_5by2
  213. fcmp.lt.s1 p11,p12 = f8,f0
  214. nop.i 999;;
  215. }
  216. { .mmf
  217. ldfpd acosf_coeff_P1,acosf_coeff_P4 = [ACOSF_Addr1],16
  218. setf.s acosf_3by2 = ACOSF_GR_3by2
  219. fclass.m.unc p8,p0 = f8, 0xc3 ;; //@qnan | @snan
  220. }
  221. { .mfi
  222. ldfpd acosf_coeff_P7,acosf_coeff_P6 = [ACOSF_Addr1],16
  223. fma.s1 acosf_t2 = acosf_t,acosf_t,f0
  224. nop.i 999
  225. }
  226. { .mfi
  227. ldfpd acosf_coeff_P3,acosf_coeff_P8 = [ACOSF_Addr2],16
  228. fma.s1 acosf_x4 = acosf_x2,acosf_x2,f0
  229. nop.i 999;;
  230. }
  231. { .mfi
  232. ldfpd acosf_coeff_P9,acosf_const_sqrt2by2 = [ACOSF_Addr1]
  233. fclass.m.unc p10,p0 = f8, 0x07 //@zero
  234. nop.i 999
  235. }
  236. { .mfi
  237. ldfpd acosf_coeff_P5,acosf_coeff_P2 = [ACOSF_Addr2],16
  238. fma.s1 acosf_x3 = f8,acosf_x2,f0
  239. nop.i 999;;
  240. }
  241. { .mfi
  242. ldfd acosf_const_piby2 = [ACOSF_Addr2]
  243. frsqrta.s1 acosf_B,p0 = acosf_t
  244. nop.i 999
  245. }
  246. { .mfb
  247. nop.m 999
  248. (p8) fma.s f8 = f8,f1,f0
  249. (p8) br.ret.spnt b0 ;; // Exit if x=nan
  250. }
  251. { .mfb
  252. nop.m 999
  253. fcmp.eq.s1 p6,p0 = acosf_abs_x,f1
  254. (p10) br.cond.spnt ACOSF_ZERO ;; // Branch if x=0
  255. }
  256. { .mfi
  257. nop.m 999
  258. fcmp.gt.s1 p9,p0 = acosf_abs_x,f1
  259. nop.i 999;;
  260. }
  261. { .mfi
  262. nop.m 999
  263. fma.s1 acosf_x8 = acosf_x4,acosf_x4,f0
  264. nop.i 999
  265. }
  266. { .mfb
  267. nop.m 999
  268. fma.s1 acosf_t4 = acosf_t2,acosf_t2,f0
  269. (p6) br.cond.spnt ACOSF_ABS_ONE ;; // Branch if |x|=1
  270. }
  271. { .mfi
  272. nop.m 999
  273. fma.s1 acosf_x5 = acosf_x2,acosf_x3,f0
  274. nop.i 999
  275. }
  276. { .mfb
  277. (p9) mov GR_Parameter_TAG = 59
  278. fma.s1 acosf_yby2 = acosf_t,acosf_1by2,f0
  279. (p9) br.cond.spnt __libm_error_region ;; // Branch if |x|>1
  280. }
  281. { .mfi
  282. nop.m 999
  283. fma.s1 acosf_Az = acosf_t,acosf_B,f0
  284. nop.i 999
  285. }
  286. { .mfi
  287. nop.m 999
  288. fma.s1 acosf_B2 = acosf_B,acosf_B,f0
  289. nop.i 999;;
  290. }
  291. { .mfi
  292. nop.m 999
  293. fma.s1 acosf_poly_p1 = f8,acosf_coeff_P1,f0
  294. nop.i 999
  295. }
  296. { .mfi
  297. nop.m 999
  298. fma.s1 acosf_2poly_p1 = acosf_coeff_P1,acosf_t,f1
  299. nop.i 999;;
  300. }
  301. { .mfi
  302. nop.m 999
  303. fma.s1 acosf_poly_p3 = acosf_coeff_P4,acosf_x2,acosf_coeff_P3
  304. nop.i 999
  305. }
  306. { .mfi
  307. nop.m 999
  308. fma.s1 acosf_2poly_p6 = acosf_coeff_P7,acosf_t,acosf_coeff_P6
  309. nop.i 999;;
  310. }
  311. { .mfi
  312. nop.m 999
  313. fma.s1 acosf_poly_p7 = acosf_x2,acosf_coeff_P8,acosf_coeff_P7
  314. nop.i 999
  315. }
  316. { .mfi
  317. nop.m 999
  318. fma.s1 acosf_2poly_p2 = acosf_coeff_P3,acosf_t,acosf_coeff_P2
  319. nop.i 999;;
  320. }
  321. { .mfi
  322. nop.m 999
  323. fma.s1 acosf_poly_p5 = acosf_x2,acosf_coeff_P6,acosf_coeff_P5
  324. nop.i 999
  325. }
  326. { .mfi
  327. nop.m 999
  328. fma.s1 acosf_2poly_p4 = acosf_coeff_P5,acosf_t,acosf_coeff_P4
  329. nop.i 999;;
  330. }
  331. { .mfi
  332. nop.m 999
  333. fma.s1 acosf_x11 = acosf_x8,acosf_x3,f0
  334. nop.i 999
  335. }
  336. { .mfi
  337. nop.m 999
  338. fnma.s1 acosf_dz = acosf_B2,acosf_yby2,acosf_1by2
  339. nop.i 999;;
  340. }
  341. { .mfi
  342. nop.m 999
  343. fma.s1 acosf_poly_p1a = acosf_x2,acosf_poly_p1,f8
  344. nop.i 999
  345. }
  346. { .mfi
  347. nop.m 999
  348. fma.s1 acosf_2poly_p8 = acosf_coeff_P9,acosf_t,acosf_coeff_P8
  349. nop.i 999;;
  350. }
  351. // Get the absolute value of x and determine the region in which x lies
  352. { .mfi
  353. nop.m 999
  354. fcmp.le.s1 p7,p8 = acosf_abs_x,acosf_const_sqrt2by2
  355. nop.i 999
  356. }
  357. { .mfi
  358. nop.m 999
  359. fma.s1 acosf_poly_p2 = acosf_x2,acosf_poly_p3,acosf_coeff_P2
  360. nop.i 999;;
  361. }
  362. { .mfi
  363. nop.m 999
  364. fma.s1 acosf_poly_p7a = acosf_x4,acosf_coeff_P9,acosf_poly_p7
  365. nop.i 999
  366. }
  367. { .mfi
  368. nop.m 999
  369. fma.s1 acosf_2poly_p2a = acosf_2poly_p2,acosf_t2,acosf_2poly_p1
  370. nop.i 999;;
  371. }
  372. { .mfi
  373. nop.m 999
  374. (p8) fma.s1 acosf_sgnx_t4 = acosf_sgn_x,acosf_t4,f0
  375. nop.i 999
  376. }
  377. { .mfi
  378. nop.m 999
  379. (p8) fma.s1 acosf_2poly_p4a = acosf_2poly_p6,acosf_t2,acosf_2poly_p4
  380. nop.i 999;;
  381. }
  382. { .mfi
  383. nop.m 999
  384. (p8) fma.s1 acosf_Sz = acosf_5by2,acosf_dz,acosf_3by2
  385. nop.i 999
  386. }
  387. { .mfi
  388. nop.m 999
  389. (p8) fma.s1 acosf_d2z = acosf_dz,acosf_dz,f0
  390. nop.i 999;;
  391. }
  392. { .mfi
  393. nop.m 999
  394. (p8) fnma.d.s1 acosf_sgn_x_piby2 = acosf_sgn_x,acosf_const_piby2,acosf_const_piby2
  395. nop.i 999
  396. }
  397. { .mfi
  398. nop.m 999
  399. (p7) fma.s1 acosf_poly_Ax = acosf_x5,acosf_poly_p2,acosf_poly_p1a
  400. nop.i 999;;
  401. }
  402. { .mfi
  403. nop.m 999
  404. (p7) fma.s1 acosf_poly_Bx = acosf_x4,acosf_poly_p7a,acosf_poly_p5
  405. nop.i 999
  406. }
  407. { .mfi
  408. nop.m 999
  409. (p8) fma.s1 acosf_sgnx_2poly_p2 = acosf_sgn_x,acosf_2poly_p2a,f0
  410. nop.i 999;;
  411. }
  412. { .mfi
  413. nop.m 999
  414. fcmp.eq.s0 p6,p0 = f8,f0 // Only purpose is to set D if x denormal
  415. nop.i 999
  416. }
  417. { .mfi
  418. nop.m 999
  419. (p8) fma.s1 acosf_2poly_p4b = acosf_2poly_p8,acosf_t4,acosf_2poly_p4a
  420. nop.i 999;;
  421. }
  422. { .mfi
  423. nop.m 999
  424. (p8) fma.s1 acosf_Fz = acosf_d2z,acosf_Sz,acosf_dz
  425. nop.i 999;;
  426. }
  427. { .mfi
  428. nop.m 999
  429. (p8) fma.d.s1 acosf_Pt = acosf_2poly_p4b,acosf_sgnx_t4,acosf_sgnx_2poly_p2
  430. nop.i 999;;
  431. }
  432. { .mfi
  433. nop.m 999
  434. (p8) fma.d.s1 acosf_z = acosf_Az,acosf_Fz,acosf_Az
  435. nop.i 999 ;;
  436. }
  437. { .mfi
  438. nop.m 999
  439. (p7) fma.d.s1 acosf_sinf1 = acosf_x11,acosf_poly_Bx,acosf_poly_Ax
  440. nop.i 999;;
  441. }
  442. .pred.rel "mutex",p8,p7 //acosf_pred_GTsqrt2by2,acosf_pred_LEsqrt2by2
  443. { .mfi
  444. nop.m 999
  445. (p8) fma.s f8 = acosf_z,acosf_Pt,acosf_sgn_x_piby2
  446. nop.i 999
  447. }
  448. { .mfb
  449. nop.m 999
  450. (p7) fms.s f8 = acosf_const_piby2,f1,acosf_sinf1
  451. br.ret.sptk b0 ;;
  452. }
  453. ACOSF_ZERO:
  454. // Here if x=0
  455. { .mfb
  456. nop.m 999
  457. fma.s f8 = acosf_const_piby2,f1,f0 // acosf(0)=pi/2
  458. br.ret.sptk b0 ;;
  459. }
  460. .pred.rel "mutex",p11,p12
  461. ACOSF_ABS_ONE:
  462. // Here if |x|=1
  463. { .mfi
  464. nop.m 999
  465. (p11) fma.s f8 = acosf_const_piby2,f1,acosf_const_piby2 // acosf(-1)=pi
  466. nop.i 999
  467. }
  468. { .mfb
  469. nop.m 999
  470. (p12) fma.s f8 = f1,f0,f0 // acosf(1)=0
  471. br.ret.sptk b0 ;;
  472. }
  473. .endp acosf
  474. // Stack operations when calling error support.
  475. // (1) (2)
  476. // sp -> + psp -> +
  477. // | |
  478. // | | <- GR_Y
  479. // | |
  480. // | <-GR_Y Y2->|
  481. // | |
  482. // | | <- GR_X
  483. // | |
  484. // sp-64 -> + sp -> +
  485. // save ar.pfs save b0
  486. // save gp
  487. // Stack operations when calling error support.
  488. // (3) (call) (4)
  489. // psp -> + sp -> +
  490. // | |
  491. // R3 ->| <- GR_RESULT | -> f8
  492. // | |
  493. // Y2 ->| <- GR_Y |
  494. // | |
  495. // X1 ->| |
  496. // | |
  497. // sp -> + +
  498. // restore gp
  499. // restore ar.pfs
  500. .proc __libm_error_region
  501. __libm_error_region:
  502. .prologue
  503. { .mfi
  504. add GR_Parameter_Y=-32,sp // Parameter 2 value
  505. nop.f 999
  506. .save ar.pfs,GR_SAVE_PFS
  507. mov GR_SAVE_PFS=ar.pfs // Save ar.pfs
  508. }
  509. { .mfi
  510. .fframe 64
  511. add sp=-64,sp // Create new stack
  512. nop.f 0
  513. mov GR_SAVE_GP=gp // Save gp
  514. };;
  515. { .mmi
  516. stfs [GR_Parameter_Y] = f1,16 // Store Parameter 2 on stack
  517. add GR_Parameter_X = 16,sp // Parameter 1 address
  518. .save b0, GR_SAVE_B0
  519. mov GR_SAVE_B0=b0 // Save b0
  520. };;
  521. .body
  522. { .mfi
  523. nop.m 0
  524. frcpa.s0 f9,p0 = f0,f0
  525. nop.i 0
  526. };;
  527. { .mib
  528. stfs [GR_Parameter_X] = f8 // Store Parameter 1 on stack
  529. add GR_Parameter_RESULT = 0,GR_Parameter_Y
  530. nop.b 0 // Parameter 3 address
  531. }
  532. { .mib
  533. stfs [GR_Parameter_Y] = f9 // Store Parameter 3 on stack
  534. add GR_Parameter_Y = -16,GR_Parameter_Y
  535. br.call.sptk b0=__libm_error_support# // Call error handling function
  536. };;
  537. { .mmi
  538. nop.m 0
  539. nop.m 0
  540. add GR_Parameter_RESULT = 48,sp
  541. };;
  542. { .mmi
  543. ldfs f8 = [GR_Parameter_RESULT] // Get return result off stack
  544. .restore
  545. add sp = 64,sp // Restore stack pointer
  546. mov b0 = GR_SAVE_B0 // Restore return address
  547. };;
  548. { .mib
  549. mov gp = GR_SAVE_GP // Restore gp
  550. mov ar.pfs = GR_SAVE_PFS // Restore ar.pfs
  551. br.ret.sptk b0 // Return
  552. };;
  553. .endp __libm_error_region
  554. .type __libm_error_support#,@function
  555. .global __libm_error_support#