aboutsummaryrefslogtreecommitdiff
path: root/src/backend
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend')
-rw-r--r--src/backend/port/tas/solaris_sparc.s17
1 files changed, 17 insertions, 0 deletions
diff --git a/src/backend/port/tas/solaris_sparc.s b/src/backend/port/tas/solaris_sparc.s
index d35a854c181..59c44874998 100644
--- a/src/backend/port/tas/solaris_sparc.s
+++ b/src/backend/port/tas/solaris_sparc.s
@@ -16,6 +16,23 @@
.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