(inst push other)
(inst push target)
(emit-label get-tls-index-lock)
- (inst mov target 1)
- (inst xor eax-tn eax-tn)
- (inst cmpxchg (make-ea-for-symbol-value *tls-index-lock*) target :lock)
- (inst jmp :ne get-tls-index-lock)
+ (let ((not-eax ,(if (eql 'eax reg) 'other 'target)))
+ (inst mov not-eax 1)
+ (inst xor eax-tn eax-tn)
+ (inst cmpxchg (make-ea-for-symbol-value *tls-index-lock*)
+ not-eax :lock)
+ (inst jmp :ne get-tls-index-lock))
;; The symbol is now in OTHER.
(inst pop other)
;; Now with the lock held, see if the symbol's tls index has been
(inst jmp :ne release-tls-index-lock)
;; Allocate a new tls-index.
(load-symbol-value target *free-tls-index*)
- (let ((error (generate-error-code nil 'tls-exhausted-error)))
+ (let ((not-error (gen-label))
+ (error (generate-error-code nil 'tls-exhausted-error)))
(inst cmp target (fixnumize tls-size))
- (inst jmp :ge error))
+ (inst jmp :l not-error)
+ (%clear-pseudo-atomic)
+ (inst jmp error)
+ (emit-label not-error))
(inst add (make-ea-for-symbol-value *free-tls-index*)
(fixnumize 1))
(storew target other symbol-tls-index-slot other-pointer-lowtag)
(emit-label release-tls-index-lock)
+ ;; No need for barriers on x86/x86-64 on unlock.
(store-symbol-value 0 *tls-index-lock*)
;; Restore OTHER.
(inst pop other))