pthread_cond_wait.S 13 KB

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