to be friendlier to the prediction heuristics implemented,
particularly with reference to CALL and RET pairing. (thanks to
Alastair Bridgewater)
+ * optimization: on x86, the code for access to thread-local symbol
+ values and binding/unbinding of thread-local symbols is smaller.
+ (thanks to Alastair Bridgewater)
* enhancement: CONSTANTP is now able to determine constantness of
more complex forms, including calls to constant-foldable standardized
functions and some special forms beyond QUOTE.
(ash symbol-tls-index-slot word-shift)
(- other-pointer-lowtag))))
(inst fs-segment-prefix)
- (inst sub (make-ea :dword :scale 1 :index temp) delta)))
+ (inst sub (make-ea :dword :base temp) delta)))
(load-tl-symbol-value result *alien-stack*))
#!-sb-thread
(:generator 0
(let ((delta (logandc2 (+ amount 3) 3)))
(inst mov temp
(make-ea :dword
- :disp (+ nil-value
- (static-symbol-offset '*alien-stack*)
+ :disp (+ nil-value
+ (static-symbol-offset '*alien-stack*)
(ash symbol-tls-index-slot word-shift)
(- other-pointer-lowtag))))
(inst fs-segment-prefix)
- (inst add (make-ea :dword :scale 1 :index temp) delta))))
+ (inst add (make-ea :dword :base temp) delta))))
#!-sb-thread
(:generator 0
(unless (zerop amount)
(inst or tls tls)
(inst jmp :z global-val)
(inst fs-segment-prefix)
- (inst cmp (make-ea :dword :scale 1 :index tls)
- no-tls-value-marker-widetag)
+ (inst cmp (make-ea :dword :base tls) no-tls-value-marker-widetag)
(inst jmp :z global-val)
(inst fs-segment-prefix)
- (inst mov (make-ea :dword :scale 1 :index tls) value)
+ (inst mov (make-ea :dword :base tls) value)
(inst jmp done)
(emit-label global-val)
(storew value symbol symbol-value-slot other-pointer-lowtag)
(ret-lab (gen-label)))
(loadw value object symbol-tls-index-slot other-pointer-lowtag)
(inst fs-segment-prefix)
- (inst mov value (make-ea :dword :index value :scale 1))
+ (inst mov value (make-ea :dword :base value))
(inst cmp value no-tls-value-marker-widetag)
(inst jmp :ne check-unbound-label)
(loadw value object symbol-value-slot other-pointer-lowtag)
(let ((ret-lab (gen-label)))
(loadw value object symbol-tls-index-slot other-pointer-lowtag)
(inst fs-segment-prefix)
- (inst mov value (make-ea :dword :index value :scale 1))
+ (inst mov value (make-ea :dword :base value))
(inst cmp value no-tls-value-marker-widetag)
(inst jmp :ne ret-lab)
(loadw value object symbol-value-slot other-pointer-lowtag)
(let ((check-unbound-label (gen-label)))
(loadw value object symbol-tls-index-slot other-pointer-lowtag)
(inst fs-segment-prefix)
- (inst mov value (make-ea :dword :index value :scale 1))
+ (inst mov value (make-ea :dword :base value))
(inst cmp value no-tls-value-marker-widetag)
(inst jmp :ne check-unbound-label)
(loadw value object symbol-value-slot other-pointer-lowtag)
(emit-label tls-index-valid)
(inst fs-segment-prefix)
- (inst mov temp (make-ea :dword :scale 1 :index tls-index))
+ (inst mov temp (make-ea :dword :base tls-index))
(storew temp bsp (- binding-value-slot binding-size))
(storew symbol bsp (- binding-symbol-slot binding-size))
(inst fs-segment-prefix)
- (inst mov (make-ea :dword :scale 1 :index tls-index) val))))
+ (inst mov (make-ea :dword :base tls-index) val))))
#!-sb-thread
(define-vop (bind)
(loadw tls-index symbol symbol-tls-index-slot other-pointer-lowtag)
(inst fs-segment-prefix)
- (inst mov (make-ea :dword :scale 1 :index tls-index) value)
+ (inst mov (make-ea :dword :base tls-index) value)
(storew 0 bsp (- binding-value-slot binding-size))
(storew 0 bsp (- binding-symbol-slot binding-size))
#!+sb-thread (loadw
tls-index symbol symbol-tls-index-slot other-pointer-lowtag)
#!+sb-thread (inst fs-segment-prefix)
- #!+sb-thread (inst mov (make-ea :dword :scale 1 :index tls-index) value)
+ #!+sb-thread (inst mov (make-ea :dword :base tls-index) value)
(storew 0 bsp (- binding-value-slot binding-size))
(storew 0 bsp (- binding-symbol-slot binding-size))
`(progn
(inst mov ,reg (make-ea-for-symbol-tls-index ,symbol))
(inst fs-segment-prefix)
- (inst mov ,reg (make-ea :dword :scale 1 :index ,reg))))
+ (inst mov ,reg (make-ea :dword :base ,reg))))
#!-sb-thread
(defmacro load-tl-symbol-value (reg symbol) `(load-symbol-value ,reg ,symbol))
`(progn
(inst mov ,temp (make-ea-for-symbol-tls-index ,symbol))
(inst fs-segment-prefix)
- (inst mov (make-ea :dword :scale 1 :index ,temp) ,reg)))
+ (inst mov (make-ea :dword :base ,temp) ,reg)))
#!-sb-thread
(defmacro store-tl-symbol-value (reg symbol temp)
(declare (ignore temp))