pthread_cond_wait.S 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753
  1. /* Copyright (C) 2003, 2004, 2006, 2007 Free Software Foundation, Inc.
  2. This file is part of the GNU C Library.
  3. The GNU C Library is free software; you can redistribute it and/or
  4. modify it under the terms of the GNU Lesser General Public
  5. License as published by the Free Software Foundation; either
  6. version 2.1 of the License, or (at your option) any later version.
  7. The GNU C Library is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  10. Lesser General Public License for more details.
  11. You should have received a copy of the GNU Lesser General Public
  12. License along with the GNU C Library; if not, see
  13. <http://www.gnu.org/licenses/>. */
  14. #include <sysdep.h>
  15. #include <lowlevellock.h>
  16. #include <lowlevelcond.h>
  17. #include <tcb-offsets.h>
  18. #include <bits/kernel-features.h>
  19. #include "lowlevel-atomic.h"
  20. .text
  21. /* int pthread_cond_wait (pthread_cond_t *cond, pthread_mutex_t *mutex) */
  22. .globl __pthread_cond_wait
  23. .type __pthread_cond_wait, @function
  24. .protected __pthread_cond_wait
  25. .align 5
  26. __pthread_cond_wait:
  27. .LSTARTCODE:
  28. mov.l r8, @-r15
  29. .Lpush_r8:
  30. mov.l r9, @-r15
  31. .Lpush_r9:
  32. mov.l r10, @-r15
  33. .Lpush_r10:
  34. mov.l r11, @-r15
  35. .Lpush_r11:
  36. mov.l r12, @-r15
  37. .Lpush_r12:
  38. sts.l pr, @-r15
  39. .Lpush_pr:
  40. add #-48, r15
  41. .Lalloc:
  42. mov r4, r8
  43. mov r5, r9
  44. #ifdef __PIC__
  45. mova .Lgot0, r0
  46. mov.l .Lgot0, r12
  47. add r0, r12
  48. #endif
  49. /* Get internal lock. */
  50. mov #0, r3
  51. mov #1, r4
  52. #if cond_lock != 0
  53. CMPXCHG (r3, @(cond_lock,r8), r4, r2)
  54. #else
  55. CMPXCHG (r3, @r8, r4, r2)
  56. #endif
  57. bt 2f
  58. bra 1f
  59. nop
  60. #ifdef __PIC__
  61. .align 2
  62. .Lgot0:
  63. .long _GLOBAL_OFFSET_TABLE_
  64. #endif
  65. 2:
  66. /* Store the reference to the mutex. If there is already a
  67. different value in there this is a bad user bug. */
  68. mov.l @(dep_mutex,r8),r0
  69. cmp/eq #-1, r0
  70. bt 15f
  71. mov.l r9, @(dep_mutex,r8)
  72. 15:
  73. /* Unlock the mutex. */
  74. mov.l .Lmunlock0, r1
  75. mov #0, r5
  76. bsrf r1
  77. mov r9, r4
  78. .Lmunlock0b:
  79. tst r0, r0
  80. bt 0f
  81. bra 12f
  82. nop
  83. 0:
  84. mov #1, r2
  85. mov #0, r3
  86. clrt
  87. mov.l @(total_seq,r8),r0
  88. mov.l @(total_seq+4,r8),r1
  89. addc r2, r0
  90. addc r3, r1
  91. mov.l r0,@(total_seq,r8)
  92. mov.l r1,@(total_seq+4,r8)
  93. mov.l @(cond_futex,r8),r0
  94. add r2, r0
  95. mov.l r0,@(cond_futex,r8)
  96. mov #(1 << nwaiters_shift), r2
  97. mov.l @(cond_nwaiters,r8), r0
  98. add r2, r0
  99. mov.l r0, @(cond_nwaiters,r8)
  100. /* Get and store current wakeup_seq value. */
  101. mov.l @(wakeup_seq,r8), r10
  102. mov.l @(wakeup_seq+4,r8), r11
  103. mov.l @(broadcast_seq,r8), r0
  104. mov.l r0, @(4,r15)
  105. 8:
  106. mov.l @(cond_futex,r8),r0
  107. mov.l r0, @(8,r15)
  108. /* Unlock. */
  109. #if cond_lock != 0
  110. DEC (@(cond_lock,r8), r2)
  111. #else
  112. DEC (@r8, r2)
  113. #endif
  114. tst r2, r2
  115. bf 3f
  116. 4:
  117. .LcleanupSTART:
  118. mov.l .Lenable0, r1
  119. bsrf r1
  120. nop
  121. .Lenable0b:
  122. mov.l r0, @r15
  123. mov #0, r7
  124. mov.l @(dep_mutex,r8), r0
  125. cmp/eq #-1, r0
  126. bt/s 99f
  127. mov #FUTEX_WAIT, r5
  128. #ifdef __ASSUME_PRIVATE_FUTEX
  129. mov #(FUTEX_WAIT|FUTEX_PRIVATE_FLAG), r5
  130. extu.b r5, r5
  131. #else
  132. stc gbr, r1
  133. mov.w .Lpfoff0, r2
  134. add r2, r1
  135. mov.l @r1, r5
  136. mov #FUTEX_WAIT, r0
  137. or r0, r5
  138. #endif
  139. 99:
  140. mov.l @(8,r15), r6
  141. mov r8, r4
  142. add #cond_futex, r4
  143. mov #SYS_futex, r3
  144. extu.b r3, r3
  145. trapa #0x14
  146. SYSCALL_INST_PAD
  147. mov.l .Ldisable0, r1
  148. bsrf r1
  149. mov.l @r15, r4
  150. .Ldisable0b:
  151. .LcleanupEND:
  152. /* Lock. */
  153. mov #0, r3
  154. mov #1, r4
  155. #if cond_lock != 0
  156. CMPXCHG (r3, @(cond_lock,r8), r4, r2)
  157. #else
  158. CMPXCHG (r3, @r8, r4, r2)
  159. #endif
  160. bf 5f
  161. 6:
  162. mov.l @(broadcast_seq,r8), r0
  163. mov.l @(4,r15), r1
  164. cmp/eq r0, r1
  165. bf 16f
  166. mov.l @(woken_seq,r8), r0
  167. mov.l @(woken_seq+4,r8), r1
  168. mov.l @(wakeup_seq,r8), r2
  169. mov.l @(wakeup_seq+4,r8), r3
  170. cmp/eq r3, r11
  171. bf 7f
  172. cmp/eq r2, r10
  173. bt 8b
  174. 7:
  175. cmp/eq r1, r3
  176. bf 9f
  177. cmp/eq r0, r2
  178. bt 8b
  179. 9:
  180. mov #1, r2
  181. mov #0, r3
  182. clrt
  183. mov.l @(woken_seq,r8),r0
  184. mov.l @(woken_seq+4,r8),r1
  185. addc r2, r0
  186. addc r3, r1
  187. mov.l r0,@(woken_seq,r8)
  188. mov.l r1,@(woken_seq+4,r8)
  189. 16:
  190. mov #(1 << nwaiters_shift), r2
  191. mov.l @(cond_nwaiters,r8),r0
  192. sub r2, r0
  193. mov.l r0,@(cond_nwaiters,r8)
  194. /* Wake up a thread which wants to destroy the condvar object. */
  195. mov.l @(total_seq,r8),r0
  196. mov.l @(total_seq+4,r8),r1
  197. and r1, r0
  198. not r0, r0
  199. cmp/eq #0, r0
  200. bf/s 17f
  201. mov #((1 << nwaiters_shift) - 1), r1
  202. not r1, r1
  203. mov.l @(cond_nwaiters,r8),r0
  204. tst r1, r0
  205. bf 17f
  206. mov r8, r4
  207. add #cond_nwaiters, r4
  208. mov.l @(dep_mutex,r8), r0
  209. cmp/eq #-1, r0
  210. bt/s 99f
  211. mov #FUTEX_WAKE, r5
  212. #ifdef __ASSUME_PRIVATE_FUTEX
  213. mov #(FUTEX_WAKE|FUTEX_PRIVATE_FLAG), r5
  214. extu.b r5, r5
  215. #else
  216. stc gbr, r1
  217. mov.w .Lpfoff0, r2
  218. add r2, r1
  219. mov.l @r1, r5
  220. mov #FUTEX_WAKE, r0
  221. or r0, r5
  222. #endif
  223. 99:
  224. mov #1, r6
  225. mov #0, r7
  226. mov #SYS_futex, r3
  227. extu.b r3, r3
  228. trapa #0x14
  229. SYSCALL_INST_PAD
  230. 17:
  231. #if cond_lock != 0
  232. DEC (@(cond_lock,r8), r2)
  233. #else
  234. DEC (@r8, r2)
  235. #endif
  236. tst r2, r2
  237. bf 10f
  238. 11:
  239. mov.l .Lmlocki0, r1
  240. bsrf r1
  241. mov r9, r4
  242. .Lmlocki0b:
  243. /* We return the result of the mutex_lock operation. */
  244. 14:
  245. add #48, r15
  246. lds.l @r15+, pr
  247. mov.l @r15+, r12
  248. mov.l @r15+, r11
  249. mov.l @r15+, r10
  250. mov.l @r15+, r9
  251. rts
  252. mov.l @r15+, r8
  253. #ifndef __ASSUME_PRIVATE_FUTEX
  254. .Lpfoff0:
  255. .word PRIVATE_FUTEX - TLS_PRE_TCB_SIZE
  256. #endif
  257. .align 2
  258. .Lmunlock0:
  259. .long __pthread_mutex_unlock_usercnt-.Lmunlock0b
  260. .Lenable0:
  261. .long __pthread_enable_asynccancel-.Lenable0b
  262. .Ldisable0:
  263. .long __pthread_disable_asynccancel-.Ldisable0b
  264. .Lmlocki0:
  265. .long __pthread_mutex_cond_lock-.Lmlocki0b
  266. 1:
  267. /* Initial locking failed. */
  268. mov r8, r5
  269. #if cond_lock != 0
  270. add #cond_lock, r5
  271. #endif
  272. mov.l @(dep_mutex,r8), r0
  273. cmp/eq #-1, r0
  274. bf/s 99f
  275. mov #LLL_PRIVATE, r6
  276. mov #LLL_SHARED, r6
  277. 99:
  278. extu.b r6, r6
  279. mov.l .Lwait0, r1
  280. bsrf r1
  281. mov r2, r4
  282. .Lwait0b:
  283. bra 2b
  284. nop
  285. 3:
  286. /* Unlock in loop requires waekup. */
  287. mov r8, r4
  288. #if cond_lock != 0
  289. add #cond_lock, r4
  290. #endif
  291. mov.l @(dep_mutex,r8), r0
  292. cmp/eq #-1, r0
  293. bf/s 99f
  294. mov #LLL_PRIVATE, r5
  295. mov #LLL_SHARED, r5
  296. 99:
  297. mov.l .Lwake0, r1
  298. bsrf r1
  299. extu.b r5, r5
  300. .Lwake0b:
  301. bra 4b
  302. nop
  303. 5:
  304. /* Locking in loop failed. */
  305. mov r8, r5
  306. #if cond_lock != 0
  307. add #cond_lock, r5
  308. #endif
  309. mov.l @(dep_mutex,r8), r0
  310. cmp/eq #-1, r0
  311. bf/s 99f
  312. mov #LLL_PRIVATE, r6
  313. mov #LLL_SHARED, r6
  314. 99:
  315. extu.b r6, r6
  316. mov.l .Lwait1, r1
  317. bsrf r1
  318. mov r2, r4
  319. .Lwait1b:
  320. bra 6b
  321. nop
  322. 10:
  323. /* Unlock after loop requires wakeup. */
  324. mov r8, r4
  325. #if cond_lock != 0
  326. add #cond_lock, r4
  327. #endif
  328. mov.l @(dep_mutex,r8), r0
  329. cmp/eq #-1, r0
  330. bf/s 99f
  331. mov #LLL_PRIVATE, r5
  332. mov #LLL_SHARED, r5
  333. 99:
  334. mov.l .Lwake1, r1
  335. bsrf r1
  336. extu.b r5, r5
  337. .Lwake1b:
  338. bra 11b
  339. nop
  340. 12:
  341. /* The initial unlocking of the mutex failed. */
  342. mov.l r0, @(12,r15)
  343. #if cond_lock != 0
  344. DEC (@(cond_lock,r8), r2)
  345. #else
  346. DEC (@r8, r2)
  347. #endif
  348. tst r2, r2
  349. bf 13f
  350. mov r8, r4
  351. #if cond_lock != 0
  352. add #cond_lock, r4
  353. #endif
  354. mov.l @(dep_mutex,r8), r0
  355. cmp/eq #-1, r0
  356. bf/s 99f
  357. mov #LLL_PRIVATE, r5
  358. mov #LLL_SHARED, r5
  359. 99:
  360. mov.l .Lwake2, r1
  361. bsrf r1
  362. extu.b r5, r5
  363. .Lwake2b:
  364. 13:
  365. bra 14b
  366. mov.l @(12,r15), r0
  367. .align 2
  368. .Lwait0:
  369. .long __lll_lock_wait-.Lwait0b
  370. .Lwake0:
  371. .long __lll_unlock_wake-.Lwake0b
  372. .Lwait1:
  373. .long __lll_lock_wait-.Lwait1b
  374. .Lwake1:
  375. .long __lll_unlock_wake-.Lwake1b
  376. .Lwake2:
  377. .long __lll_unlock_wake-.Lwake2b
  378. .size __pthread_cond_wait, .-__pthread_cond_wait
  379. weak_alias (__pthread_cond_wait, pthread_cond_wait)
  380. .type __condvar_w_cleanup, @function
  381. __condvar_w_cleanup:
  382. mov r4, r11
  383. /* Get internal lock. */
  384. mov #0, r3
  385. mov #1, r4
  386. #if cond_lock != 0
  387. CMPXCHG (r3, @(cond_lock,r8), r4, r2)
  388. #else
  389. CMPXCHG (r3, @r8, r4, r2)
  390. #endif
  391. bt 1f
  392. nop
  393. mov r8, r5
  394. #if cond_lock != 0
  395. add #cond_lock, r5
  396. #endif
  397. mov.l @(dep_mutex,r8), r0
  398. cmp/eq #-1, r0
  399. bf/s 99f
  400. mov #LLL_PRIVATE, r6
  401. mov #LLL_SHARED, r6
  402. 99:
  403. extu.b r6, r6
  404. mov.l .Lwait3, r1
  405. bsrf r1
  406. mov r2, r4
  407. .Lwait3b:
  408. 1:
  409. mov.l @(broadcast_seq,r8), r0
  410. mov.l @(4,r15), r1
  411. cmp/eq r0, r1
  412. bf 3f
  413. mov #1, r2
  414. mov #0, r3
  415. /* We increment the wakeup_seq counter only if it is lower than
  416. total_seq. If this is not the case the thread was woken and
  417. then canceled. In this case we ignore the signal. */
  418. mov.l @(total_seq+4,r8), r0
  419. mov.l @(wakeup_seq+4,r8), r1
  420. cmp/hi r1, r0
  421. bt/s 6f
  422. cmp/hi r0, r1
  423. bt 7f
  424. mov.l @(total_seq,r8), r0
  425. mov.l @(wakeup_seq,r8), r1
  426. cmp/hs r0, r1
  427. bt 7f
  428. 6:
  429. clrt
  430. mov.l @(wakeup_seq,r8),r0
  431. mov.l @(wakeup_seq+4,r8),r1
  432. addc r2, r0
  433. addc r3, r1
  434. mov.l r0,@(wakeup_seq,r8)
  435. mov.l r1,@(wakeup_seq+4,r8)
  436. mov.l @(cond_futex,r8),r0
  437. add r2, r0
  438. mov.l r0,@(cond_futex,r8)
  439. 7:
  440. clrt
  441. mov.l @(woken_seq,r8),r0
  442. mov.l @(woken_seq+4,r8),r1
  443. addc r2, r0
  444. addc r3, r1
  445. mov.l r0,@(woken_seq,r8)
  446. mov.l r1,@(woken_seq+4,r8)
  447. 3:
  448. mov #(1 << nwaiters_shift), r2
  449. mov.l @(cond_nwaiters,r8),r0
  450. sub r2, r0
  451. mov.l r0,@(cond_nwaiters,r8)
  452. /* Wake up a thread which wants to destroy the condvar object. */
  453. mov #0, r10
  454. mov.l @(total_seq,r8),r0
  455. mov.l @(total_seq+4,r8),r1
  456. and r1, r0
  457. not r0, r0
  458. cmp/eq #0, r0
  459. bf/s 4f
  460. mov #((1 << nwaiters_shift) - 1), r1
  461. not r1, r1
  462. mov.l @(cond_nwaiters,r8),r0
  463. tst r1, r0
  464. bf 4f
  465. mov r8, r4
  466. add #cond_nwaiters, r4
  467. mov.l @(dep_mutex,r8), r0
  468. cmp/eq #-1, r0
  469. bt/s 99f
  470. mov #FUTEX_WAKE, r5
  471. #ifdef __ASSUME_PRIVATE_FUTEX
  472. mov #(FUTEX_WAKE|FUTEX_PRIVATE_FLAG), r5
  473. extu.b r5, r5
  474. #else
  475. stc gbr, r1
  476. mov.w .Lpfoff1, r2
  477. add r2, r1
  478. mov.l @r1, r5
  479. mov #FUTEX_WAKE, r0
  480. or r0, r5
  481. #endif
  482. 99:
  483. mov #1, r6
  484. mov #0, r7
  485. mov #SYS_futex, r3
  486. extu.b r3, r3
  487. trapa #0x14
  488. SYSCALL_INST_PAD
  489. mov #1, r10
  490. 4:
  491. #if cond_lock != 0
  492. DEC (@(cond_lock,r8), r2)
  493. #else
  494. DEC (@r8, r2)
  495. #endif
  496. tst r2, r2
  497. bt 2f
  498. mov r8, r4
  499. #if cond_lock != 0
  500. add #cond_lock, r4
  501. #endif
  502. mov.l @(dep_mutex,r8), r0
  503. cmp/eq #-1, r0
  504. bf/s 99f
  505. mov #LLL_PRIVATE, r5
  506. mov #LLL_SHARED, r5
  507. 99:
  508. mov.l .Lwake3, r1
  509. bsrf r1
  510. extu.b r5, r5
  511. .Lwake3b:
  512. 2:
  513. /* Wake up all waiters to make sure no signal gets lost. */
  514. tst r10, r10
  515. bf/s 5f
  516. mov r8, r4
  517. add #cond_futex, r4
  518. mov.l @(dep_mutex,r8), r0
  519. cmp/eq #-1, r0
  520. bt/s 99f
  521. mov #FUTEX_WAKE, r5
  522. #ifdef __ASSUME_PRIVATE_FUTEX
  523. mov #(FUTEX_WAKE|FUTEX_PRIVATE_FLAG), r5
  524. extu.b r5, r5
  525. #else
  526. stc gbr, r1
  527. mov.w .Lpfoff1, r2
  528. add r2, r1
  529. mov.l @r1, r5
  530. mov #FUTEX_WAKE, r0
  531. or r0, r5
  532. #endif
  533. 99:
  534. mov #-1, r6
  535. shlr r6 /* r6 = 0x7fffffff */
  536. mov #0, r7
  537. mov #SYS_futex, r3
  538. extu.b r3, r3
  539. trapa #0x14
  540. SYSCALL_INST_PAD
  541. 5:
  542. mov.l .Lmlocki3, r1
  543. bsrf r1
  544. mov r9, r4
  545. .Lmlocki3b:
  546. .LcallUR:
  547. mov.l .Lresume, r1
  548. #ifdef __PIC__
  549. add r12, r1
  550. #endif
  551. jsr @r1
  552. mov r11, r4
  553. sleep
  554. #ifndef __ASSUME_PRIVATE_FUTEX
  555. .Lpfoff1:
  556. .word PRIVATE_FUTEX - TLS_PRE_TCB_SIZE
  557. #endif
  558. .align 2
  559. .Lwait3:
  560. .long __lll_lock_wait-.Lwait3b
  561. .Lwake3:
  562. .long __lll_unlock_wake-.Lwake3b
  563. .Lmlocki3:
  564. .long __pthread_mutex_cond_lock-.Lmlocki3b
  565. .Lresume:
  566. #ifdef __PIC__
  567. .long _Unwind_Resume@GOTOFF
  568. #else
  569. .long _Unwind_Resume
  570. #endif
  571. .LENDCODE:
  572. .size __condvar_w_cleanup, .-__condvar_w_cleanup
  573. .section .gcc_except_table,"a",@progbits
  574. .LexceptSTART:
  575. .byte 0xff ! @LPStart format (omit)
  576. .byte 0xff ! @TType format (omit)
  577. .byte 0x0b ! call-site format
  578. ! DW_EH_PE_sdata4
  579. .uleb128 .Lcstend-.Lcstbegin
  580. .Lcstbegin:
  581. .ualong .LcleanupSTART-.LSTARTCODE
  582. .ualong .LcleanupEND-.LcleanupSTART
  583. .ualong __condvar_w_cleanup-.LSTARTCODE
  584. .uleb128 0
  585. .ualong .LcallUR-.LSTARTCODE
  586. .ualong .LENDCODE-.LcallUR
  587. .ualong 0
  588. .uleb128 0
  589. .Lcstend:
  590. .section .eh_frame,"a",@progbits
  591. .LSTARTFRAME:
  592. .ualong .LENDCIE-.LSTARTCIE ! Length of the CIE.
  593. .LSTARTCIE:
  594. .ualong 0 ! CIE ID.
  595. .byte 1 ! Version number.
  596. #ifdef SHARED
  597. .string "zPLR" ! NUL-terminated augmentation
  598. ! string.
  599. #else
  600. .string "zPL" ! NUL-terminated augmentation
  601. ! string.
  602. #endif
  603. .uleb128 1 ! Code alignment factor.
  604. .sleb128 -4 ! Data alignment factor.
  605. .byte 0x11 ! Return address register
  606. ! column.
  607. #ifdef SHARED
  608. .uleb128 7 ! Augmentation value length.
  609. .byte 0x9b ! Personality: DW_EH_PE_pcrel
  610. ! + DW_EH_PE_sdata4
  611. ! + DW_EH_PE_indirect
  612. .ualong DW.ref.__gcc_personality_v0-.
  613. .byte 0x1b ! LSDA Encoding: DW_EH_PE_pcrel
  614. ! + DW_EH_PE_sdata4.
  615. .byte 0x1b ! FDE Encoding: DW_EH_PE_pcrel
  616. ! + DW_EH_PE_sdata4.
  617. #else
  618. .uleb128 6 ! Augmentation value length.
  619. .byte 0x0 ! Personality: absolute
  620. .ualong __gcc_personality_v0
  621. .byte 0x0 ! LSDA Encoding: absolute
  622. #endif
  623. .byte 0x0c ! DW_CFA_def_cfa
  624. .uleb128 0xf
  625. .uleb128 0
  626. .align 2
  627. .LENDCIE:
  628. .ualong .LENDFDE-.LSTARTFDE ! Length of the FDE.
  629. .LSTARTFDE:
  630. .ualong .LSTARTFDE-.LSTARTFRAME ! CIE pointer.
  631. #ifdef SHARED
  632. .ualong .LSTARTCODE-. ! PC-relative start address
  633. ! of the code.
  634. #else
  635. .ualong .LSTARTCODE ! Start address of the code.
  636. #endif
  637. .ualong .LENDCODE-.LSTARTCODE ! Length of the code.
  638. .uleb128 4 ! Augmentation size
  639. #ifdef SHARED
  640. .ualong .LexceptSTART-.
  641. #else
  642. .ualong .LexceptSTART
  643. #endif
  644. .byte 0x4
  645. .ualong .Lpush_r8-.LSTARTCODE
  646. .byte 0xe
  647. .uleb128 4
  648. .byte 0x88
  649. .uleb128 1
  650. .byte 0x4
  651. .ualong .Lpush_r9-.Lpush_r8
  652. .byte 0xe
  653. .uleb128 8
  654. .byte 0x89
  655. .uleb128 2
  656. .byte 0x4
  657. .ualong .Lpush_r10-.Lpush_r9
  658. .byte 0xe
  659. .uleb128 12
  660. .byte 0x8a
  661. .uleb128 3
  662. .byte 0x4
  663. .ualong .Lpush_r11-.Lpush_r10
  664. .byte 0xe
  665. .uleb128 16
  666. .byte 0x8b
  667. .uleb128 4
  668. .byte 0x4
  669. .ualong .Lpush_r12-.Lpush_r11
  670. .byte 0xe
  671. .uleb128 20
  672. .byte 0x8c
  673. .uleb128 5
  674. .byte 0x4
  675. .ualong .Lpush_pr-.Lpush_r12
  676. .byte 0xe
  677. .uleb128 24
  678. .byte 0x91
  679. .uleb128 6
  680. .byte 0x4
  681. .ualong .Lalloc-.Lpush_pr
  682. .byte 0xe
  683. .uleb128 72
  684. .align 2
  685. .LENDFDE:
  686. #ifdef SHARED
  687. .hidden DW.ref.__gcc_personality_v0
  688. .weak DW.ref.__gcc_personality_v0
  689. .section .gnu.linkonce.d.DW.ref.__gcc_personality_v0,"aw",@progbits
  690. .align 4
  691. .type DW.ref.__gcc_personality_v0, @object
  692. .size DW.ref.__gcc_personality_v0, 4
  693. DW.ref.__gcc_personality_v0:
  694. .long __gcc_personality_v0
  695. #endif