summaryrefslogtreecommitdiff
path: root/nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_wait.S
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2004-03-20 06:16:26 +0000
committerUlrich Drepper <drepper@redhat.com>2004-03-20 06:16:26 +0000
commit07bd2a3fda47e7cfa83e808eb99a0da9d1184a30 (patch)
treea0e41495d990b736c8981a58677bc28175621728 /nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_wait.S
parent3abb1ff7d1c7a2941df3c6234ec71b40a3879baa (diff)
Update.
2004-03-17 Kaz Kojima <kkojima@rr.iij4u.or.jp> * sysdeps/unix/sysv/linux/kernel-features.h (__ASSUME_CLONE_THREAD_FLAGS ): Define for newer SH kernel. (__ASSUME_TGKILL, __ASSUME_UTIMES): Likewise. * sysdeps/unix/sysv/linux/sh/socket.S: Add unwind information.
Diffstat (limited to 'nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_wait.S')
-rw-r--r--nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_wait.S464
1 files changed, 308 insertions, 156 deletions
diff --git a/nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_wait.S b/nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_wait.S
index a1967f4922..01b906eeed 100644
--- a/nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_wait.S
+++ b/nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_wait.S
@@ -1,4 +1,4 @@
-/* Copyright (C) 2003 Free Software Foundation, Inc.
+/* Copyright (C) 2003, 2004 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -28,119 +28,33 @@
.text
- .align 5
- .type __condvar_cleanup, @function
- .globl __condvar_cleanup
- .hidden __condvar_cleanup
-__condvar_cleanup:
- mov.l r8, @-r15
- mov.l r9, @-r15
- sts.l pr, @-r15
- mov r4, r9
- mov.l @(4,r9), r8
-
- /* Get internal lock. */
- mov #0, r3
- mov #1, r4
-#if cond_lock != 0
- CMPXCHG (r3, @(cond_lock,r8), r4, r2)
-#else
- CMPXCHG (r3, @r8, r4, r2)
-#endif
- bt 1f
- mov r8, r5
-#if cond_lock != 0
- add #cond_lock, r5
-#endif
- mov.l .Lwait0, r1
- bsrf r1
- mov r2, r4
-.Lwait0b:
-1:
- mov #1, r2
- mov #0, r3
-
- clrt
- mov.l @(wakeup_seq,r8),r0
- mov.l @(wakeup_seq+4,r8),r1
- addc r2, r0
- addc r3, r1
- mov.l r0,@(wakeup_seq,r8)
- mov.l r1,@(wakeup_seq+4,r8)
-
- clrt
- mov.l @(woken_seq,r8),r0
- mov.l @(woken_seq+4,r8),r1
- addc r2, r0
- addc r3, r1
- mov.l r0,@(woken_seq,r8)
- mov.l r1,@(woken_seq+4,r8)
-
- /* Release internal lock. */
-#if cond_lock != 0
- DEC (@(cond_lock,r8), r2)
-#else
- DEC (@r8, r2)
-#endif
- tst r2, r2
- bt 2f
-
- mov r8, r4
-#if cond_lock != 0
- add #cond_lock, r4
-#endif
- mov.l .Lwake0, r1
- bsrf r1
- nop
-.Lwake0b:
-2:
-
- /* Wake up all waiters to make sure no signal gets lost. */
- mov r8, r4
- add #wakeup_seq, r4
- mov #FUTEX_WAKE, r5
- mov #-1, r6
- shlr r6 /* r6 = 0x7fffffff */
- mov #0, r7
- mov #SYS_futex, r3
- extu.b r3, r3
- trapa #0x14
- SYSCALL_INST_PAD
-
- mov.l .Lmlocki1, r1
- bsrf r1
- mov.l @(8,r9), r4
-.Lmlocki1b:
-
- lds.l @r15+, pr
- mov.l @r15+, r9
- rts
- mov.l @r15+, r8
-
- .align 2
-.Lwait0:
- .long __lll_mutex_lock_wait-.Lwait0b
-.Lwake0:
- .long __lll_mutex_unlock_wake-.Lwake0b
-.Lmlocki1:
- .long __pthread_mutex_cond_lock-.Lmlocki1b
- .size __condvar_cleanup, .-__condvar_cleanup
-
-
/* int pthread_cond_wait (pthread_cond_t *cond, pthread_mutex_t *mutex) */
.globl __pthread_cond_wait
.type __pthread_cond_wait, @function
.align 5
__pthread_cond_wait:
+.LSTARTCODE:
mov.l r8, @-r15
+.Lpush_r8:
mov.l r9, @-r15
+.Lpush_r9:
mov.l r10, @-r15
+.Lpush_r10:
mov.l r11, @-r15
+.Lpush_r11:
mov.l r12, @-r15
+.Lpush_r12:
sts.l pr, @-r15
+.Lpush_pr:
add #-48, r15
+.Lalloc:
mov r4, r8
mov r5, r9
+#ifdef PIC
+ mova .Lgot0, r0
+ mov.l .Lgot0, r12
+ add r0, r12
+#endif
/* Get internal lock. */
mov #0, r3
@@ -153,12 +67,21 @@ __pthread_cond_wait:
bt 2f
bra 1f
nop
+#ifdef PIC
+ .align 2
+.Lgot0:
+ .long _GLOBAL_OFFSET_TABLE_
+#endif
2:
/* Store the reference to the mutex. If there is already a
different value in there this is a bad user bug. */
+ mov.l @(dep_mutex,r8),r0
+ cmp/eq #-1, r0
+ bt 15f
mov.l r9, @(dep_mutex,r8)
+15:
/* Unlock the mutex. */
mov.l .Lmunlock0, r1
mov #0, r5
@@ -182,28 +105,6 @@ __pthread_cond_wait:
mov.l r0,@(total_seq,r8)
mov.l r1,@(total_seq+4,r8)
- /* Install cancellation handler. */
-#ifdef PIC
- mova .Lgot0, r0
- mov.l .Lgot0, r12
- add r0, r12
- mov.l .Lccleanup0, r5
- add r12, r5
-#else
- mov.l .Lccleanup0, r5
-#endif
- mov r15, r4
- add #16, r4
-
- /* Prepare structure passed to cancellation handler. */
- mov.l r8, @(4,r15)
- mov.l r9, @(8,r15)
-
- mov.l .Lccpush0, r1
- bsrf r1
- mov r15, r6
-.Lccpush0b:
-
/* Get and store current wakeup_seq value. */
mov.l @(wakeup_seq,r8), r10
mov.l @(wakeup_seq+4,r8), r11
@@ -218,6 +119,7 @@ __pthread_cond_wait:
tst r2, r2
bf 3f
4:
+.LcleanupSTART:
mov.l .Lenable0, r1
bsrf r1
nop
@@ -238,6 +140,7 @@ __pthread_cond_wait:
bsrf r1
mov.l @r15, r4
.Ldisable0b:
+.LcleanupEND:
/* Lock. */
mov #0, r3
@@ -255,20 +158,15 @@ __pthread_cond_wait:
mov.l @(wakeup_seq,r8), r2
mov.l @(wakeup_seq+4,r8), r3
- cmp/hi r11, r3
- bt 7f
- cmp/hi r3, r11
- bt 8b
-
- cmp/hs r2, r10
+ cmp/eq r3, r11
+ bf 7f
+ cmp/eq r2, r10
bt 8b
7:
- cmp/hi r1, r3
- bt 9f
- cmp/hi r3, r1
+ cmp/eq r1, r3
+ bf 9f
+ cmp/eq r0, r2
bt 8b
- cmp/hi r0, r2
- bf 8b
9:
mov #1, r2
mov #0, r3
@@ -290,55 +188,41 @@ __pthread_cond_wait:
bf 10f
11:
- /* Remove cancellation handler. */
- mov r15, r4
- add #16, r4
- mov.l .Lcpop0, r1
- bsrf r1
- mov #0, r5
-.Lcpop0b:
-
- mov r9, r4
mov.l .Lmlocki0, r1
bsrf r1
- nop
+ mov r9, r4
.Lmlocki0b:
/* We return the result of the mutex_lock operation. */
14:
add #48, r15
+.Lfree:
lds.l @r15+, pr
+.Lpop_pr:
mov.l @r15+, r12
+.Lpop_r12:
mov.l @r15+, r11
+.Lpop_r11:
mov.l @r15+, r10
+.Lpop_r10:
mov.l @r15+, r9
+.Lpop_r9:
rts
mov.l @r15+, r8
+.Lpop_r8:
.align 2
.Lmunlock0:
.long __pthread_mutex_unlock_usercnt-.Lmunlock0b
-#ifdef PIC
-.Lgot0:
- .long _GLOBAL_OFFSET_TABLE_
-.Lccleanup0:
- .long __condvar_cleanup@GOTOFF
-#else
-.Lccleanup0:
- .long __condvar_cleanup
-#endif
-.Lccpush0:
- .long __pthread_cleanup_push-.Lccpush0b
.Lenable0:
.long __pthread_enable_asynccancel-.Lenable0b
.Ldisable0:
.long __pthread_disable_asynccancel-.Ldisable0b
-.Lcpop0:
- .long __pthread_cleanup_pop-.Lcpop0b
.Lmlocki0:
.long __pthread_mutex_cond_lock-.Lmlocki0b
1:
+.LSblSTART:
/* Initial locking failed. */
mov r8, r5
#if cond_lock != 0
@@ -412,6 +296,7 @@ __pthread_cond_wait:
13:
bra 14b
mov.l @(12,r15), r0
+.LSblEND:
.align 2
.Lmwait0:
@@ -427,3 +312,270 @@ __pthread_cond_wait:
.size __pthread_cond_wait, .-__pthread_cond_wait
versioned_symbol (libpthread, __pthread_cond_wait, pthread_cond_wait,
GLIBC_2_3_2)
+
+
+ .type __condvar_w_cleanup, @function
+__condvar_w_cleanup:
+ mov r4, r11
+
+ /* Get internal lock. */
+ mov #0, r3
+ mov #1, r4
+#if cond_lock != 0
+ CMPXCHG (r3, @(cond_lock,r8), r4, r2)
+#else
+ CMPXCHG (r3, @r8, r4, r2)
+#endif
+ bt 1f
+ nop
+
+ mov r8, r5
+#if cond_lock != 0
+ add #cond_lock, r5
+#endif
+ mov.l .Lmwait3, r1
+ bsrf r1
+ mov r2, r4
+.Lmwait3b:
+
+1:
+ mov #1, r2
+ mov #0, r3
+
+ clrt
+ mov.l @(wakeup_seq,r8),r0
+ mov.l @(wakeup_seq+4,r8),r1
+ addc r2, r0
+ addc r3, r1
+ mov.l r0,@(wakeup_seq,r8)
+ mov.l r1,@(wakeup_seq+4,r8)
+
+#if cond_lock != 0
+ DEC (@(cond_lock,r8), r2)
+#else
+ DEC (@r8, r2)
+#endif
+ tst r2, r2
+ bt 2f
+
+ mov r8, r4
+#if cond_lock != 0
+ add #cond_lock, r4
+#endif
+ mov.l .Lmwake3, r1
+ bsrf r1
+ nop
+.Lmwake3b:
+
+2:
+ /* Wake up all waiters to make sure no signal gets lost. */
+ mov r8, r4
+ add #wakeup_seq, r4
+ mov #FUTEX_WAKE, r5
+ mov #-1, r6
+ shlr r6 /* r6 = 0x7fffffff */
+ mov #0, r7
+ mov #SYS_futex, r3
+ extu.b r3, r3
+ trapa #0x14
+ SYSCALL_INST_PAD
+
+ mov.l .Lmlocki3, r1
+ bsrf r1
+ mov r9, r4
+.Lmlocki3b:
+
+.LcallUR:
+ mov.l .Lresume, r1
+#ifdef PIC
+ add r12, r1
+#endif
+ jsr @r1
+ mov r11, r4
+ sleep
+
+ .align 2
+.Lmwait3:
+ .long __lll_mutex_lock_wait-.Lmwait3b
+.Lmwake3:
+ .long __lll_mutex_unlock_wake-.Lmwake3b
+.Lmlocki3:
+ .long __pthread_mutex_cond_lock-.Lmlocki3b
+.Lresume:
+#ifdef PIC
+ .long _Unwind_Resume@GOTOFF
+#else
+ .long _Unwind_Resume
+#endif
+.LENDCODE:
+ .size __condvar_w_cleanup, .-__condvar_w_cleanup
+
+
+ .section .gcc_except_table,"a",@progbits
+.LexceptSTART:
+ .byte 0xff ! @LPStart format (omit)
+ .byte 0xff ! @TType format (omit)
+ .byte 0x0b ! call-site format
+ ! DW_EH_PE_sdata4
+ .uleb128 .Lcstend-.Lcstbegin
+.Lcstbegin:
+ .ualong .LcleanupSTART-.LSTARTCODE
+ .ualong .LcleanupEND-.LcleanupSTART
+ .ualong __condvar_w_cleanup-.LSTARTCODE
+ .uleb128 0
+ .ualong .LcallUR-.LSTARTCODE
+ .ualong .LENDCODE-.LcallUR
+ .ualong 0
+ .uleb128 0
+.Lcstend:
+
+ .section .eh_frame,"a",@progbits
+.LSTARTFRAME:
+ .ualong .LENDCIE-.LSTARTCIE ! Length of the CIE.
+.LSTARTCIE:
+ .ualong 0 ! CIE ID.
+ .byte 1 ! Version number.
+#ifdef SHARED
+ .string "zPLR" ! NUL-terminated augmentation
+ ! string.
+#else
+ .string "zPL" ! NUL-terminated augmentation
+ ! string.
+#endif
+ .uleb128 1 ! Code alignment factor.
+ .sleb128 -4 ! Data alignment factor.
+ .byte 0x11 ! Return address register
+ ! column.
+#ifdef SHARED
+ .uleb128 7 ! Augmentation value length.
+ .byte 0x9b ! Personality: DW_EH_PE_pcrel
+ ! + DW_EH_PE_sdata4
+ ! + DW_EH_PE_indirect
+ .ualong DW.ref.__gcc_personality_v0-.
+ .byte 0x1b ! LSDA Encoding: DW_EH_PE_pcrel
+ ! + DW_EH_PE_sdata4.
+ .byte 0x1b ! FDE Encoding: DW_EH_PE_pcrel
+ ! + DW_EH_PE_sdata4.
+#else
+ .uleb128 6 ! Augmentation value length.
+ .byte 0x0 ! Personality: absolute
+ .ualong __gcc_personality_v0
+ .byte 0x0 ! LSDA Encoding: absolute
+#endif
+ .byte 0x0c ! DW_CFA_def_cfa
+ .uleb128 0xf
+ .uleb128 0
+ .align 2
+.LENDCIE:
+
+ .ualong .LENDFDE-.LSTARTFDE ! Length of the FDE.
+.LSTARTFDE:
+ .ualong .LSTARTFDE-.LSTARTFRAME ! CIE pointer.
+#ifdef SHARED
+ .ualong .LSTARTCODE-. ! PC-relative start address
+ ! of the code.
+#else
+ .ualong .LSTARTCODE ! Start address of the code.
+#endif
+ .ualong .LENDCODE-.LSTARTCODE ! Length of the code.
+ .uleb128 4 ! Augmentation size
+#ifdef SHARED
+ .ualong .LexceptSTART-.
+#else
+ .ualong .LexceptSTART
+#endif
+ .byte 0x4
+ .ualong .Lpush_r8-.LSTARTCODE
+ .byte 0xe
+ .uleb128 4
+ .byte 0x88
+ .uleb128 1
+ .byte 0x4
+ .ualong .Lpush_r9-.Lpush_r8
+ .byte 0xe
+ .uleb128 8
+ .byte 0x89
+ .uleb128 2
+ .byte 0x4
+ .ualong .Lpush_r10-.Lpush_r9
+ .byte 0xe
+ .uleb128 12
+ .byte 0x8a
+ .uleb128 3
+ .byte 0x4
+ .ualong .Lpush_r11-.Lpush_r10
+ .byte 0xe
+ .uleb128 16
+ .byte 0x8b
+ .uleb128 4
+ .byte 0x4
+ .ualong .Lpush_r12-.Lpush_r11
+ .byte 0xe
+ .uleb128 20
+ .byte 0x8c
+ .uleb128 5
+ .byte 0x4
+ .ualong .Lpush_pr-.Lpush_r12
+ .byte 0xe
+ .uleb128 24
+ .byte 0x91
+ .uleb128 6
+ .byte 0x4
+ .ualong .Lalloc-.Lpush_pr
+ .byte 0xe
+ .uleb128 72
+ .byte 0x4
+ .ualong .Lfree-.Lalloc
+ .byte 0xe
+ .uleb128 24
+ .byte 0x4
+ .ualong .Lpop_pr-.Lfree
+ .byte 0xe
+ .uleb128 20
+ .byte 0xd1
+ .byte 0x4
+ .ualong .Lpop_r12-.Lpop_pr
+ .byte 0xe
+ .uleb128 16
+ .byte 0xcc
+ .byte 0x4
+ .ualong .Lpop_r11-.Lpop_r12
+ .byte 0xe
+ .uleb128 12
+ .byte 0xcb
+ .byte 0x4
+ .ualong .Lpop_r10-.Lpop_r11
+ .byte 0xe
+ .uleb128 8
+ .byte 0xca
+ .byte 0x4
+ .ualong .Lpop_r9-.Lpop_r10
+ .byte 0xe
+ .uleb128 4
+ .byte 0xc9
+ .byte 0x4
+ .ualong .Lpop_r8-.Lpop_r9
+ .byte 0xe
+ .uleb128 0
+ .byte 0xc8
+ .byte 0x4
+ .ualong .LSblSTART-.Lpop_r8
+ .byte 0xe
+ .uleb128 72
+ .byte 0x4
+ .ualong .LSblEND-.LSblSTART
+ .byte 0xe
+ .uleb128 72
+ .align 2
+.LENDFDE:
+
+#ifdef SHARED
+ .hidden DW.ref.__gcc_personality_v0
+ .weak DW.ref.__gcc_personality_v0
+ .section .gnu.linkonce.d.DW.ref.__gcc_personality_v0,"aw",@progbits
+ .align 4
+ .type DW.ref.__gcc_personality_v0, @object
+ .size DW.ref.__gcc_personality_v0, 4
+DW.ref.__gcc_personality_v0:
+ .long __gcc_personality_v0
+#endif