Index: src/runtime/runtime-atomics-x64.asm |
diff --git a/src/runtime/runtime-atomics-x64.asm b/src/runtime/runtime-atomics-x64.asm |
new file mode 100644 |
index 0000000000000000000000000000000000000000..50f4ad1309272159755c7c0376e0770d990a6d07 |
--- /dev/null |
+++ b/src/runtime/runtime-atomics-x64.asm |
@@ -0,0 +1,424 @@ |
+; Copyright 2016 the V8 project authors. All rights reserved. |
+; Use of this source code is governed by a BSD-style license that can be |
+; found in the LICENSE file. |
+ |
+.CODE |
+ |
+func MACRO name |
+PUBLIC name |
+name: |
+endm |
+ |
+;; LOAD ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
+; uint8_t v8::internal::atomics::LoadSeqCst(uint8_t*); |
+func ?LoadSeqCst@atomics@internal@v8@@YAEPEAE@Z |
+ mov al, [rcx] |
+ ret |
+ |
+; int8_t v8::internal::atomics::LoadSeqCst(int8_t*); |
+func ?LoadSeqCst@atomics@internal@v8@@YACPEAC@Z |
+ mov al, [rcx] |
+ ret |
+ |
+; uint16_t v8::internal::atomics::LoadSeqCst(uint16_t*); |
+func ?LoadSeqCst@atomics@internal@v8@@YAGPEAG@Z |
+ mov ax, [rcx] |
+ ret |
+ |
+; int16_t v8::internal::atomics::LoadSeqCst(int16_t*); |
+func ?LoadSeqCst@atomics@internal@v8@@YAFPEAF@Z |
+ mov ax, [rcx] |
+ ret |
+ |
+; uint32_t v8::internal::atomics::LoadSeqCst(uint32_t*); |
+func ?LoadSeqCst@atomics@internal@v8@@YAIPEAI@Z |
+ mov eax, [rcx] |
+ ret |
+ |
+; int32_t v8::internal::atomics::LoadSeqCst(int32_t*); |
+func ?LoadSeqCst@atomics@internal@v8@@YAHPEAH@Z |
+ mov eax, [rcx] |
+ ret |
+ |
+ |
+;; LOAD ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
+; void v8::internal::atomics::StoreSeqCst(uint8_t*, uint8_t); |
+func ?StoreSeqCst@atomics@internal@v8@@YAXPEAEE@Z |
+ xchg [rcx], dl |
+ ret |
+ |
+; void v8::internal::atomics::StoreSeqCst(int8_t*, int8_t); |
+func ?StoreSeqCst@atomics@internal@v8@@YAXPEACC@Z |
+ xchg [rcx], dl |
+ ret |
+ |
+; void v8::internal::atomics::StoreSeqCst(uint16_t*, uint16_t); |
+func ?StoreSeqCst@atomics@internal@v8@@YAXPEAGG@Z |
+ xchg [rcx], dx |
+ ret |
+ |
+; void v8::internal::atomics::StoreSeqCst(int16_t*, int16_t); |
+func ?StoreSeqCst@atomics@internal@v8@@YAXPEAFF@Z |
+ xchg [rcx], dx |
+ ret |
+ |
+; void v8::internal::atomics::StoreSeqCst(uint32_t*, uint32_t); |
+func ?StoreSeqCst@atomics@internal@v8@@YAXPEAII@Z |
+ xchg [rcx], edx |
+ ret |
+ |
+; void v8::internal::atomics::StoreSeqCst(int32_t*, int32_t); |
+func ?StoreSeqCst@atomics@internal@v8@@YAXPEAHH@Z |
+ xchg [rcx], edx |
+ ret |
+ |
+ |
+;; ADD ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
+; uint8_t v8::internal::atomics::AddSeqCst(uint8_t*, uint8_t); |
+func ?AddSeqCst@atomics@internal@v8@@YAEPEAEE@Z |
+ lock xadd [rcx], dl |
+ movzx eax, dl |
+ ret |
+ |
+; int8_t v8::internal::atomics::AddSeqCst(int8_t*, int8_t); |
+func ?AddSeqCst@atomics@internal@v8@@YACPEACC@Z |
+ lock xadd [rcx], dl |
+ movsx eax, dl |
+ ret |
+ |
+; uint16_t v8::internal::atomics::AddSeqCst(uint16_t*, uint16_t); |
+func ?AddSeqCst@atomics@internal@v8@@YAGPEAGG@Z |
+ lock xadd [rcx], dx |
+ movzx eax, dx |
+ ret |
+ |
+; int16_t v8::internal::atomics::AddSeqCst(int16_t*, int16_t); |
+func ?AddSeqCst@atomics@internal@v8@@YAFPEAFF@Z |
+ lock xadd [rcx], dx |
+ movsx eax, dx |
+ ret |
+ |
+; uint32_t v8::internal::atomics::AddSeqCst(uint32_t*, uint32_t); |
+func ?AddSeqCst@atomics@internal@v8@@YAIPEAII@Z |
+ lock xadd [rcx], edx |
+ mov eax, edx |
+ ret |
+ |
+; int32_t v8::internal::atomics::AddSeqCst(int32_t*, int32_t); |
+func ?AddSeqCst@atomics@internal@v8@@YAHPEAHH@Z |
+ lock xadd [rcx], edx |
+ mov eax, edx |
+ ret |
+ |
+ |
+;; SUB ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
+; uint8_t v8::internal::atomics::SubSeqCst(uint8_t*, uint8_t); |
+func ?SubSeqCst@atomics@internal@v8@@YAEPEAEE@Z |
+ neg dl |
+ lock xadd [rcx], dl |
+ movzx eax, dl |
+ ret |
+ |
+; int8_t v8::internal::atomics::SubSeqCst(int8_t*, int8_t); |
+func ?SubSeqCst@atomics@internal@v8@@YACPEACC@Z |
+ neg dl |
+ lock xadd [rcx], dl |
+ movsx eax, dl |
+ ret |
+ |
+; uint16_t v8::internal::atomics::SubSeqCst(uint16_t*, uint16_t); |
+func ?SubSeqCst@atomics@internal@v8@@YAGPEAGG@Z |
+ neg dx |
+ lock xadd [rcx], dx |
+ movzx eax, dx |
+ ret |
+ |
+; int16_t v8::internal::atomics::SubSeqCst(int16_t*, int16_t); |
+func ?SubSeqCst@atomics@internal@v8@@YAFPEAFF@Z |
+ neg dx |
+ lock xadd [rcx], dx |
+ movsx eax, dx |
+ ret |
+ |
+; uint32_t v8::internal::atomics::SubSeqCst(uint32_t*, uint32_t); |
+func ?SubSeqCst@atomics@internal@v8@@YAIPEAII@Z |
+ neg edx |
+ lock xadd [rcx], edx |
+ mov eax, edx |
+ ret |
+ |
+; int32_t v8::internal::atomics::SubSeqCst(int32_t*, int32_t); |
+func ?SubSeqCst@atomics@internal@v8@@YAHPEAHH@Z |
+ neg edx |
+ lock xadd [rcx], edx |
+ mov eax, edx |
+ ret |
+ |
+ |
+;; EXCHANGE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
+; uint8_t v8::internal::atomics::ExchangeSeqCst(uint8_t*, uint8_t); |
+func ?ExchangeSeqCst@atomics@internal@v8@@YAEPEAEE@Z |
+ xchg [rcx], dl |
+ movzx eax, dl |
+ ret |
+ |
+; int8_t v8::internal::atomics::ExchangeSeqCst(int8_t*, int8_t); |
+func ?ExchangeSeqCst@atomics@internal@v8@@YACPEACC@Z |
+ xchg [rcx], dl |
+ movsx eax, dl |
+ ret |
+ |
+; uint16_t v8::internal::atomics::ExchangeSeqCst(uint16_t*, uint16_t); |
+func ?ExchangeSeqCst@atomics@internal@v8@@YAGPEAGG@Z |
+ xchg [rcx], dx |
+ movzx eax, dx |
+ ret |
+ |
+; int16_t v8::internal::atomics::ExchangeSeqCst(int16_t*, int16_t); |
+func ?ExchangeSeqCst@atomics@internal@v8@@YAFPEAFF@Z |
+ xchg [rcx], dx |
+ movsx eax, dx |
+ ret |
+ |
+; uint32_t v8::internal::atomics::ExchangeSeqCst(uint32_t*, uint32_t); |
+func ?ExchangeSeqCst@atomics@internal@v8@@YAIPEAII@Z |
+ xchg [rcx], edx |
+ mov eax, edx |
+ ret |
+ |
+; int32_t v8::internal::atomics::ExchangeSeqCst(int32_t*, int32_t); |
+func ?ExchangeSeqCst@atomics@internal@v8@@YAHPEAHH@Z |
+ xchg [rcx], edx |
+ mov eax, edx |
+ ret |
+ |
+ |
+;; COMPARE EXCHANGE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
+; uint8_t v8::internal::atomics::CompareExchangeSeqCst( |
+; uint8_t*, uint8_t oldval, uint8_t newval); |
+func ?CompareExchangeSeqCst@atomics@internal@v8@@YAEPEAEEE@Z |
+ mov al, dl |
+ lock cmpxchg [rcx], r8b |
+ ret |
+ |
+; int8_t v8::internal::atomics::CompareExchangeSeqCst( |
+; int8_t*, int8_t oldval, int8_t newval); |
+func ?CompareExchangeSeqCst@atomics@internal@v8@@YACPEACCC@Z |
+ mov al, dl |
+ lock cmpxchg [rcx], r8b |
+ ret |
+ |
+; uint16_t v8::internal::atomics::CompareExchangeSeqCst( |
+; uint16_t*, uint16_t oldval, uint16_t newval); |
+func ?CompareExchangeSeqCst@atomics@internal@v8@@YAGPEAGGG@Z |
+ mov ax, dx |
+ lock cmpxchg [rcx], r8w |
+ ret |
+ |
+; int16_t v8::internal::atomics::CompareExchangeSeqCst( |
+; int16_t*, int16_t oldval, int16_t newval); |
+func ?CompareExchangeSeqCst@atomics@internal@v8@@YAFPEAFFF@Z |
+ mov ax, dx |
+ lock cmpxchg [rcx], r8w |
+ ret |
+ |
+; uint32_t v8::internal::atomics::CompareExchangeSeqCst( |
+; uint32_t*, uint32_t oldval, uint32_t newval); |
+func ?CompareExchangeSeqCst@atomics@internal@v8@@YAIPEAIII@Z |
+ mov eax, edx |
+ lock cmpxchg [rcx], r8d |
+ ret |
+ |
+; int32_t v8::internal::atomics::CompareExchangeSeqCst( |
+; int32_t*, int32_t oldval, int32_t newval); |
+func ?CompareExchangeSeqCst@atomics@internal@v8@@YAHPEAHHH@Z |
+ mov eax, edx |
+ lock cmpxchg [rcx], r8d |
+ ret |
+ |
+ |
+;; AND ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
+; uint8_t v8::internal::atomics::AndSeqCst(uint8_t*, uint8_t); |
+func ?AndSeqCst@atomics@internal@v8@@YAEPEAEE@Z |
+ mov al, [rcx] |
+@@: |
+ mov r8b, dl |
+ and r8b, al |
+ lock cmpxchg [rcx], r8b |
+ jnz short @B |
+ ret |
+ |
+; int8_t v8::internal::atomics::AndSeqCst(int8_t*, int8_t); |
+func ?AndSeqCst@atomics@internal@v8@@YACPEACC@Z |
+ mov al, [rcx] |
+@@: |
+ mov r8b, dl |
+ and r8b, al |
+ lock cmpxchg [rcx], r8b |
+ jnz short @B |
+ ret |
+ |
+; uint16_t v8::internal::atomics::AndSeqCst(uint16_t*, uint16_t); |
+func ?AndSeqCst@atomics@internal@v8@@YAGPEAGG@Z |
+ mov ax, [rcx] |
+@@: |
+ mov r8w, dx |
+ and r8w, ax |
+ lock cmpxchg [rcx], r8w |
+ jnz short @B |
+ ret |
+ |
+; int16_t v8::internal::atomics::AndSeqCst(int16_t*, int16_t); |
+func ?AndSeqCst@atomics@internal@v8@@YAFPEAFF@Z |
+ mov ax, [rcx] |
+@@: |
+ mov r8w, dx |
+ and r8w, ax |
+ lock cmpxchg [rcx], r8w |
+ jnz short @B |
+ ret |
+ |
+; uint32_t v8::internal::atomics::AndSeqCst(uint32_t*, uint32_t); |
+func ?AndSeqCst@atomics@internal@v8@@YAIPEAII@Z |
+ mov eax, [rcx] |
+@@: |
+ mov r8d, edx |
+ and r8d, eax |
+ lock cmpxchg [rcx], r8d |
+ ret |
+ |
+; int32_t v8::internal::atomics::AndSeqCst(int32_t*, int32_t); |
+func ?AndSeqCst@atomics@internal@v8@@YAHPEAHH@Z |
+ mov eax, [rcx] |
+@@: |
+ mov r8d, edx |
+ and r8d, eax |
+ lock cmpxchg [rcx], r8d |
+ jnz short @B |
+ ret |
+ |
+ |
+;; OR ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
+; uint8_t v8::internal::atomics::OrSeqCst(uint8_t*, uint8_t); |
+func ?OrSeqCst@atomics@internal@v8@@YAEPEAEE@Z |
+ mov al, [rcx] |
+@@: |
+ mov r8b, dl |
+ or r8b, al |
+ lock cmpxchg [rcx], r8b |
+ jnz short @B |
+ ret |
+ |
+; int8_t v8::internal::atomics::OrSeqCst(int8_t*, int8_t); |
+func ?OrSeqCst@atomics@internal@v8@@YACPEACC@Z |
+ mov al, [rcx] |
+@@: |
+ mov r8b, dl |
+ or r8b, al |
+ lock cmpxchg [rcx], r8b |
+ jnz short @B |
+ ret |
+ |
+; uint16_t v8::internal::atomics::OrSeqCst(uint16_t*, uint16_t); |
+func ?OrSeqCst@atomics@internal@v8@@YAGPEAGG@Z |
+ mov ax, [rcx] |
+@@: |
+ mov r8w, dx |
+ or r8w, ax |
+ lock cmpxchg [rcx], r8w |
+ jnz short @B |
+ ret |
+ |
+; int16_t v8::internal::atomics::OrSeqCst(int16_t*, int16_t); |
+func ?OrSeqCst@atomics@internal@v8@@YAFPEAFF@Z |
+ mov ax, [rcx] |
+@@: |
+ mov r8w, dx |
+ or r8w, ax |
+ lock cmpxchg [rcx], r8w |
+ jnz short @B |
+ ret |
+ |
+; uint32_t v8::internal::atomics::OrSeqCst(uint32_t*, uint32_t); |
+func ?OrSeqCst@atomics@internal@v8@@YAIPEAII@Z |
+ mov eax, [rcx] |
+@@: |
+ mov r8d, edx |
+ or r8d, eax |
+ lock cmpxchg [rcx], r8d |
+ jnz short @B |
+ ret |
+ |
+; int32_t v8::internal::atomics::OrSeqCst(int32_t*, int32_t); |
+func ?OrSeqCst@atomics@internal@v8@@YAHPEAHH@Z |
+ mov eax, [rcx] |
+@@: |
+ mov r8d, edx |
+ or r8d, eax |
+ lock cmpxchg [rcx], r8d |
+ jnz short @B |
+ ret |
+ |
+ |
+;; XOR ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
+; uint8_t v8::internal::atomics::XorSeqCst(uint8_t*, uint8_t); |
+func ?XorSeqCst@atomics@internal@v8@@YAEPEAEE@Z |
+ mov al, [rcx] |
+@@: |
+ mov r8b, dl |
+ xor r8b, al |
+ lock cmpxchg [rcx], r8b |
+ jnz short @B |
+ ret |
+ |
+; int8_t v8::internal::atomics::XorSeqCst(int8_t*, int8_t); |
+func ?XorSeqCst@atomics@internal@v8@@YACPEACC@Z |
+ mov al, [rcx] |
+@@: |
+ mov r8b, dl |
+ xor r8b, al |
+ lock cmpxchg [rcx], r8b |
+ jnz short @B |
+ ret |
+ |
+; uint16_t v8::internal::atomics::XorSeqCst(uint16_t*, uint16_t); |
+func ?XorSeqCst@atomics@internal@v8@@YAGPEAGG@Z |
+ mov ax, [rcx] |
+@@: |
+ mov r8w, dx |
+ xor r8w, ax |
+ lock cmpxchg [rcx], r8w |
+ jnz short @B |
+ ret |
+ |
+; int16_t v8::internal::atomics::XorSeqCst(int16_t*, int16_t); |
+func ?XorSeqCst@atomics@internal@v8@@YAFPEAFF@Z |
+ mov ax, [rcx] |
+@@: |
+ mov r8w, dx |
+ xor r8w, ax |
+ lock cmpxchg [rcx], r8w |
+ jnz short @B |
+ ret |
+ |
+; uint32_t v8::internal::atomics::XorSeqCst(uint32_t*, uint32_t); |
+func ?XorSeqCst@atomics@internal@v8@@YAIPEAII@Z |
+ mov eax, [rcx] |
+@@: |
+ mov r8d, edx |
+ xor r8d, eax |
+ lock cmpxchg [rcx], r8d |
+ jnz short @B |
+ ret |
+ |
+; int32_t v8::internal::atomics::XorSeqCst(int32_t*, int32_t); |
+func ?XorSeqCst@atomics@internal@v8@@YAHPEAHH@Z |
+ mov eax, [rcx] |
+@@: |
+ mov r8d, edx |
+ xor r8d, eax |
+ lock cmpxchg [rcx], r8d |
+ jnz short @B |
+ ret |
+ |
+END |