- (inst or (make-ea :byte
- :base thread-base-tn
- :disp (* 8 thread-pseudo-atomic-bits-slot))
- (fixnumize 1))
- ,@forms
- (inst xor (make-ea :byte
- :base thread-base-tn
- :disp (* 8 thread-pseudo-atomic-bits-slot))
- (fixnumize 1))
- (inst jmp :z ,label)
- ;; if PAI was set, interrupts were disabled at the same
- ;; time using the process signal mask.
- (inst break pending-interrupt-trap)
- (emit-label ,label))))
+ (inst mov (make-ea :qword
+ :base thread-base-tn
+ :disp (* n-word-bytes thread-pseudo-atomic-bits-slot))
+ rbp-tn)
+ ,@forms
+ (inst xor (make-ea :qword
+ :base thread-base-tn
+ :disp (* n-word-bytes thread-pseudo-atomic-bits-slot))
+ rbp-tn)
+ (inst jmp :z ,label)
+ ;; if PAI was set, interrupts were disabled at the same time
+ ;; using the process signal mask.
+ (inst break pending-interrupt-trap)
+ (emit-label ,label)
+ #!+sb-safepoint
+ ;; In this case, when allocation thinks a GC should be done, it
+ ;; does not mark PA as interrupted, but schedules a safepoint
+ ;; trap instead. Let's take the opportunity to trigger that
+ ;; safepoint right now.
+ (emit-safepoint))))