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