aboutsummaryrefslogtreecommitdiff
path: root/src/backend
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend')
-rw-r--r--src/backend/port/tas/solaris_x86_64.s35
1 files changed, 35 insertions, 0 deletions
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 00000000000..4fad43e5a2a
--- /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
+