diff --git a/src/Makefile.shlib b/src/Makefile.shlib
index 84d55069082365ab3f41923f3c09bba0c37f4f51..f869764d25f4858807e396a026155b9822df4fc2 100644
--- a/src/Makefile.shlib
+++ b/src/Makefile.shlib
@@ -6,7 +6,7 @@
 # Copyright (c) 1998, Regents of the University of California
 #
 # IDENTIFICATION
-#    $PostgreSQL: pgsql/src/Makefile.shlib,v 1.100 2005/12/09 21:19:34 petere Exp $
+#    $PostgreSQL: pgsql/src/Makefile.shlib,v 1.101 2005/12/30 21:43:41 momjian Exp $
 #
 #-------------------------------------------------------------------------
 
@@ -193,7 +193,7 @@ ifeq ($(PORTNAME), solaris)
   ifeq ($(GCC), yes)
     LINK.shared		= $(CC) -shared
   else
-    LINK.shared		= $(CC) -G
+    LINK.shared		= $(CC) -G $(CFLAGS)	# CFLAGS added for X86_64
   endif
   ifeq ($(with_gnu_ld), yes)
     LINK.shared		+= -Wl,-soname,$(soname)
diff --git a/src/backend/port/tas/solaris_x86_64.s b/src/backend/port/tas/solaris_x86_64.s
new file mode 100644
index 0000000000000000000000000000000000000000..4fad43e5a2a88000bce2a0c486426933cbf03ea1
--- /dev/null
+++ b/src/backend/port/tas/solaris_x86_64.s
@@ -0,0 +1,35 @@
+/=============================================================================
+/ tas.s -- test and set lock for solaris_i386
+/ based on i386 ASM with modifications outlined in
+/ http://www.x86-64.org/documentation/assembly
+/=============================================================================
+
+        .file   "tas.s"
+        .text
+        .align  16
+.L1.text:
+
+        .globl  tas
+tas:
+        pushq   %rbp            /save prev base pointer
+        movq    %rsp,%rbp       /new base pointer
+        pushq   %rbx            /save prev bx
+        movq    8(%rbp),%rbx    /load bx with address of lock
+        movq    $255,%rax       /put something in ax
+        xchgb   %al,(%rbx)      /swap lock value with "0"
+        cmpb    $0,%al          /did we get the lock?
+        jne     .Locked
+        subq    %rax,%rax       /yes, we got it -- return 0
+        jmp     .Finish
+        .align  8
+.Locked:
+        movq    $1,%rax         /no, we didn't get it - return 1
+.Finish:
+        popq    %rbx            /restore prev bx
+        movq    %rbp,%rsp       /restore stack state
+        popq    %rbp
+        ret                     /return
+        .align  8
+        .type   tas,@function
+        .size   tas,.-tas
+
diff --git a/src/include/storage/s_lock.h b/src/include/storage/s_lock.h
index 37d4e1253d416359a47049c9638df1d36508c1dd..8d85bfa727d477cb8a2db6871b177857af20fd64 100644
--- a/src/include/storage/s_lock.h
+++ b/src/include/storage/s_lock.h
@@ -66,7 +66,7 @@
  * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- *	  $PostgreSQL: pgsql/src/include/storage/s_lock.h,v 1.145 2005/12/17 21:08:24 momjian Exp $
+ *	  $PostgreSQL: pgsql/src/include/storage/s_lock.h,v 1.146 2005/12/30 21:43:41 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -791,7 +791,8 @@ typedef unsigned char slock_t;
 
 /* out-of-line assembler from src/backend/port/tas/foo.s */
 
-#if defined(__sun) && defined(__i386)	/* i386 using Sun compiler */
+/* i386/X86_64 using Sun compiler */
+#if defined(__sun) && (defined(__i386) || defined(__x86_64__)) 
 /*
  * Solaris/386 (we only get here for non-gcc case)
  */
diff --git a/src/template/solaris b/src/template/solaris
index 785fc3ea130c5753e5371088d5d10e691edbf7d9..4a9a5651bb028af43b32e7a2af64d0570e506a55 100644
--- a/src/template/solaris
+++ b/src/template/solaris
@@ -17,8 +17,15 @@ case $host in
     ;;
   i?86-*-solaris*)
 	if test "$GCC" != yes ; then
-		need_tas=yes
-		tas_file=solaris_i386.s
+		soarch=`isainfo`
+		if isainfo | grep amd64
+		then
+			need_tas=yes
+			tas_file=solaris_x86_64.s
+		else
+			need_tas=yes
+			tas_file=solaris_i386.s
+		fi
 	fi
     ;;
 esac