diff options
author | Artur Grabowski <art@cvs.openbsd.org> | 2005-07-26 08:11:12 +0000 |
---|---|---|
committer | Artur Grabowski <art@cvs.openbsd.org> | 2005-07-26 08:11:12 +0000 |
commit | ccc79ca8cf3a21d866f9ab04cfdf0aaf9f0e221e (patch) | |
tree | af8ff58da807e0daa1a34886470fe3a05d4b782c /sys | |
parent | 897e6187cf9e656bcc47a0b6a18fe3e662681442 (diff) |
Microoptimizations.
- Use cmov instead of jmp in mtx_enter
- Don't spllower in mtx_leave unless we really have to.
tested by many.
Diffstat (limited to 'sys')
-rw-r--r-- | sys/arch/amd64/amd64/mutex.S | 25 |
1 files changed, 14 insertions, 11 deletions
diff --git a/sys/arch/amd64/amd64/mutex.S b/sys/arch/amd64/amd64/mutex.S index 4eb4b841f14..17905d3bc5e 100644 --- a/sys/arch/amd64/amd64/mutex.S +++ b/sys/arch/amd64/amd64/mutex.S @@ -1,4 +1,4 @@ -/* $OpenBSD: mutex.S,v 1.3 2005/04/08 07:07:06 jolan Exp $ */ +/* $OpenBSD: mutex.S,v 1.4 2005/07/26 08:11:11 art Exp $ */ /* * Copyright (c) 2004 Artur Grabowski <art@openbsd.org> @@ -48,10 +48,10 @@ ENTRY(mtx_enter) 1: movl MTX_WANTIPL(%rdi), %eax movq CPUVAR(SELF), %rcx movl CPU_INFO_ILEVEL(%rcx), %edx # oipl = cpl; - cmpl %edx, %eax # if (cpl < mtx->mtx_wantipl) - jle 2f + cmpl %eax, %edx # if (cpl < mtx->mtx_wantipl) + cmovge %edx, %eax movl %eax, CPU_INFO_ILEVEL(%rcx) # cpl = mtx->mtx_wantipl; -2: /* + /* * %edx - the old ipl * %rcx - curcpu() */ @@ -60,29 +60,29 @@ ENTRY(mtx_enter) lock #endif cmpxchgq %rcx, MTX_OWNER(%rdi) # test_and_set(mtx->mtx_owner) - jne 3f + jne 2f movl %edx, MTX_OLDIPL(%rdi) ret /* We failed to obtain the lock. splx, spin and retry. */ -3: pushq %rdi +2: pushq %rdi movl %edx, %edi call _C_LABEL(spllower) popq %rdi #ifdef DIAGNOSTIC movq CPUVAR(SELF), %rcx cmpq MTX_OWNER(%rdi), %rcx - je 5f + je 4f #endif -4: +3: movq MTX_OWNER(%rdi), %rax testq %rax, %rax jz 1b - jmp 4b + jmp 3b #ifdef DIAGNOSTIC -5: movq $6f, %rdi +4: movq $5f, %rdi call _C_LABEL(panic) -6: .asciz "mtx_enter: locking against myself" +5: .asciz "mtx_enter: locking against myself" #endif ENTRY(mtx_leave) @@ -91,5 +91,8 @@ ENTRY(mtx_leave) movl MTX_OLDIPL(%rax), %edi movl %ecx, MTX_OLDIPL(%rax) movq %rcx, MTX_OWNER(%rax) + cmpl %edi, CPUVAR(ILEVEL) + je 1f call _C_LABEL(spllower) +1: ret |