summaryrefslogtreecommitdiffstats
path: root/ldap/servers/slapd/slapi_counter_sunos_sparcv9.S
diff options
context:
space:
mode:
authorNoriko Hosoi <nhosoi@redhat.com>2008-10-22 20:24:37 +0000
committerNoriko Hosoi <nhosoi@redhat.com>2008-10-22 20:24:37 +0000
commitc56e4415b2de4f72c0e6da144e4156b70912685d (patch)
tree034c42d7ccb75a406e32113a26ea5230ffbba2a6 /ldap/servers/slapd/slapi_counter_sunos_sparcv9.S
parentb330c3504778b2ec6bae877ff63122653874a72c (diff)
downloadds-c56e4415b2de4f72c0e6da144e4156b70912685d.tar.gz
ds-c56e4415b2de4f72c0e6da144e4156b70912685d.tar.xz
ds-c56e4415b2de4f72c0e6da144e4156b70912685d.zip
Resolves: 207457
Summary: (64bitcounters) rhds 7.1 - server stats use 32-bit integers - entrycachehitratio 1503% Change description: 1) Makefile.am: instead of the inline assembly langauge file .il, include an independent .S file to the libslapd_la_SOURCES list. 2) add AM_PROG_AS to configure.ac to accept CCAS and CCASFLAGS. 3) slapi_counter.c: adjusted to slapi_counter_sunos_sparcv9.S. 4) add slapi_counter_sunos_sparcv9.S 5) remove slapi_counter_sunos_sparcv9.il
Diffstat (limited to 'ldap/servers/slapd/slapi_counter_sunos_sparcv9.S')
-rw-r--r--ldap/servers/slapd/slapi_counter_sunos_sparcv9.S134
1 files changed, 134 insertions, 0 deletions
diff --git a/ldap/servers/slapd/slapi_counter_sunos_sparcv9.S b/ldap/servers/slapd/slapi_counter_sunos_sparcv9.S
new file mode 100644
index 00000000..34dff541
--- /dev/null
+++ b/ldap/servers/slapd/slapi_counter_sunos_sparcv9.S
@@ -0,0 +1,134 @@
+! BEGIN COPYRIGHT BLOCK
+! This Program is free software; you can redistribute it and/or modify it under
+! the terms of the GNU General Public License as published by the Free Software
+! Foundation; version 2 of the License.
+!
+! This Program is distributed in the hope that it will be useful, but WITHOUT
+! ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+! FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+!
+! You should have received a copy of the GNU General Public License along with
+! this Program; if not, write to the Free Software Foundation, Inc., 59 Temple
+! Place, Suite 330, Boston, MA 02111-1307 USA.
+!
+! In addition, as a special exception, Red Hat, Inc. gives You the additional
+! right to link the code of this Program with code not covered under the GNU
+! General Public License ("Non-GPL Code") and to distribute linked combinations
+! including the two, subject to the limitations in this paragraph. Non-GPL Code
+! permitted under this exception must only link to the code of this Program
+! through those well defined interfaces identified in the file named EXCEPTION
+! found in the source code files (the "Approved Interfaces"). The files of
+! Non-GPL Code may instantiate templates or use macros or inline functions from
+! the Approved Interfaces without causing the resulting work to be covered by
+! the GNU General Public License. Only Red Hat, Inc. may make changes or
+! additions to the list of Approved Interfaces. You must obey the GNU General
+! Public License in all respects for all of the Program code and other code used
+! in conjunction with the Program except the Non-GPL Code covered by this
+! exception. If you modify this file, you may extend this exception to your
+! version of the file, but you are not obligated to do so. If you do not wish to
+! provide this exception without modification, you must delete this exception
+! statement from your version and license this file solely under the GPL without
+! exception.
+!
+!
+! The Original Code is the Netscape Portable Runtime (NSPR).
+!
+! The Initial Developer of the Original Code is
+! Netscape Communications Corporation.
+! Portions created by the Initial Developer are Copyright (C) 1998-2000
+! the Initial Developer. All Rights Reserved.
+!
+! The original code has been modified to support 64-bit atomic increments by
+! Red Hat, Inc. These portions are Copyright (C) 2008 Red Hat, Inc. All Rights
+! reserved.
+!
+! END COPYRIGHT BLOCK
+!
+
+#include <sys/asm_linkage.h>
+
+! ======================================================================
+!
+! Perform the sequence a = b atomically with respect to other
+! fetch-and-stores to location a in a wait-free fashion.
+!
+! usage : old_val = PR_AtomicSet(address, newval)
+!
+! -----------------------
+! Note on REGISTER USAGE:
+! as this is a LEAF procedure, a new stack frame is not created;
+! we use the caller's stack frame so what would normally be %i (input)
+! registers are actually %o (output registers). Also, we must not
+! overwrite the contents of %l (local) registers as they are not
+! assumed to be volatile during calls.
+! -----------------------
+
+ ENTRY(_sparcv9_AtomicSet) ! standard assembler/ELF prologue
+
+retryAS:
+ ldx [%o0], %o2 ! set o2 to the current value
+ mov %o1, %o3 ! set up the new value
+ casx [%o0], %o2, %o3 ! atomically set if o0 hasn't changed
+ cmp %o2, %o3 ! see if we set the value
+ bne retryAS ! if not, try again
+ nop ! empty out the branch pipeline
+ retl ! return back to the caller
+ mov %o3, %o0 ! set the return code to the prev value
+
+ SET_SIZE(_sparcv9_AtomicSet) ! standard assembler/ELF epilogue
+
+!
+! end
+!
+! ======================================================================
+!
+! Perform the sequence a = a + b atomically with respect to other
+! fetch-and-adds to location a in a wait-free fashion.
+!
+! usage : newval = PR_AtomicAdd(address, val)
+! return: the value after addition
+!
+ ENTRY(_sparcv9_AtomicAdd) ! standard assembler/ELF prologue
+
+retryAA:
+ ldx [%o0], %o2 ! set o2 to the current value
+ addx %o2, %o1, %o3 ! calc the new value
+ mov %o3, %o4 ! save the return value
+ casx [%o0], %o2, %o3 ! atomically set if o0 hasn't changed
+ cmp %o2, %o3 ! see if we set the value
+ bne retryAA ! if not, try again
+ nop ! empty out the branch pipeline
+ retl ! return back to the caller
+ mov %o4, %o0 ! set the return code to the new value
+
+ SET_SIZE(_sparcv9_AtomicAdd) ! standard assembler/ELF epilogue
+
+!
+! end
+!
+! ======================================================================
+!
+! Perform the sequence a = a - b atomically with respect to other
+! fetch-and-subs to location a in a wait-free fashion.
+!
+! usage : newval = PR_AtomicSub(address, val)
+! return: the value after addition
+!
+ ENTRY(_sparcv9_AtomicSub) ! standard assembler/ELF prologue
+
+retryAU:
+ ldx [%o0], %o2 ! set o2 to the current value
+ subx %o2, %o1, %o3 ! calc the new value
+ mov %o3, %o4 ! save the return value
+ casx [%o0], %o2, %o3 ! atomically set if o0 hasn't changed
+ cmp %o2, %o3 ! see if we set the value
+ bne retryAU ! if not, try again
+ nop ! empty out the branch pipeline
+ retl ! return back to the caller
+ mov %o4, %o0 ! set the return code to the new value
+
+ SET_SIZE(_sparcv9_AtomicSub) ! standard assembler/ELF epilogue
+
+!
+! end
+!