Add comments that Solaris Sun compiler only supports sparc9 ASM,
authorBruce Momjian
Wed, 17 May 2006 23:57:03 +0000 (23:57 +0000)
committerBruce Momjian
Wed, 17 May 2006 23:57:03 +0000 (23:57 +0000)
src/backend/port/tas/solaris_sparc.s
src/include/storage/s_lock.h

index d35a854c181bb38e89c31b2f3e695b9be85cd2a1..59c44874998d3b30d17a593defb4151af5d0c644 100644 (file)
    .global pg_atomic_cas
 pg_atomic_cas:
    
+   ! "cas" only works on sparcv9 chips, and requies a compiler
+   ! that is targeting sparcv9.  It will fail on a compiler
+   ! targeting sparcv8, and of course will not be understood
+   ! by a sparcv8 CPU.  If this fails on existing Solaris
+   ! systems, we need to use a !defined(__sparcv9) test
+   ! to fall back to the old "ldstub" call for sparcv8 compiles.
+   ! gcc continues to use "ldstub" because there is no indication
+   ! which sparc version it is targeting.
+   !
+   ! There actually is a trick for embedding "cas" for a compiler
+   ! that is targeting sparcv8:
+   !
+   !   http://cvs.opensolaris.org/source/xref/on/usr/src/lib/libc/sparc/threads/sparc.il
+   !
+   ! This might work for sparc8:
+   ! ldstub [%o0],%o1  ! moves only a byte
+
    cas     [%o0],%o2,%o1
    mov     %o1,%o0
    retl
index 67ac61903669c19cc1f777b593aa946b6fabc790..6a13565672eaaf0cd9c72e8291da3d430cf68041 100644 (file)
@@ -66,7 +66,7 @@
  * Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- *   $PostgreSQL: pgsql/src/include/storage/s_lock.h,v 1.152 2006/04/29 11:55:19 momjian Exp $
+ *   $PostgreSQL: pgsql/src/include/storage/s_lock.h,v 1.153 2006/05/17 23:57:03 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -311,6 +311,10 @@ tas(volatile slock_t *lock)
 {
    register slock_t _res;
 
+   /*
+    *  See comment in /pg/backend/port/tas/solaris_sparc.s for why this
+    *  uses "ldstub", and that file uses "cas".
+    */
    __asm__ __volatile__(
        "   ldstub  [%2], %0    \n"
 :      "=r"(_res), "+m"(*lock)