1.0.6.24: a more sophisticated UNWIND-TO-FRAME-AND-CALL for x86 and x86-64
[sbcl.git] / src / compiler / x86-64 / cell.lisp
index 5adb018..8c2dd11 100644 (file)
     (loadw symbol bsp (- binding-symbol-slot binding-size))
     (inst or symbol symbol)
     (inst jmp :z SKIP)
+    ;; Bind stack debug sentinels have the unbound marker in the symbol slot
+    (inst cmp symbol unbound-marker-widetag)
+    (inst jmp :eq SKIP)
     (loadw value bsp (- binding-value-slot binding-size))
     #!-sb-thread
     (storew value symbol symbol-value-slot other-pointer-lowtag)
     (store-binding-stack-pointer bsp)
 
     DONE))
+
+(define-vop (bind-sentinel)
+  (:temporary (:sc unsigned-reg) bsp)
+  (:generator 1
+     (load-binding-stack-pointer bsp)
+     (inst add bsp (* binding-size n-word-bytes))
+     (storew unbound-marker-widetag bsp (- binding-symbol-slot binding-size))
+     (storew rbp-tn bsp (- binding-value-slot binding-size))
+     (store-binding-stack-pointer bsp)))
+
+(define-vop (unbind-sentinel)
+  (:temporary (:sc unsigned-reg) bsp)
+  (:generator 1
+     (load-binding-stack-pointer bsp)
+     (storew 0 bsp (- binding-value-slot binding-size))
+     (storew 0 bsp (- binding-symbol-slot binding-size))
+     (inst sub bsp (* binding-size n-word-bytes))
+     (store-binding-stack-pointer bsp)))
+
 \f
 
 \f