- (inst pop eax)
- (inst push rbp-tn)
- (inst lea rbp-tn (make-ea :qword
- :base rsp-tn
- :disp n-word-bytes))
- (inst sub rsp-tn (fixnumize 2)) ; FIXME: Push 2 words on stack,
- ; weirdly?
- (inst push eax)
- (inst mov ecx (fixnumize 2)) ; FIXME: FIXNUMIZE and
- ; SINGLE-FLOAT-BITS are parallel,
- ; should be named parallelly.
- (inst jmp (make-ea :qword
- :disp (+ nil-value
- (static-fun-offset ',static-fn)))))))
-
- (define-cond-assem-rtn generic-< < two-arg-< :ge)
- (define-cond-assem-rtn generic-> > two-arg-> :le))
-
+ (inst sub rsp-tn (fixnumize 3))
+ (inst mov (make-ea :qword :base rsp-tn
+ :disp (frame-byte-offset
+ (+ sp->fp-offset
+ -3
+ ocfp-save-offset)))
+ rbp-tn)
+ (inst lea rbp-tn (make-ea :qword :base rsp-tn
+ :disp (frame-byte-offset
+ (+ sp->fp-offset
+ -3
+ ocfp-save-offset))))
+ (inst mov rcx (fixnumize 2))
+ (inst call (make-ea :qword
+ :disp (+ nil-value
+ (static-fun-offset ',static-fn))))
+ ;; HACK: We depend on NIL having the lowest address of all
+ ;; static symbols (including T)
+ ,@(ecase test
+ (:l `((inst mov y (1+ nil-value))
+ (inst cmp y x)))
+ (:g `((inst cmp x (1+ nil-value)))))
+ (inst ret))
+ #-sb-assembling
+ `(define-vop (,name)
+ (:translate ,translate)
+ (:policy :safe)
+ (:save-p t)
+ (:args (x :scs (descriptor-reg any-reg) :target rdx)
+ (y :scs (descriptor-reg any-reg) :target rdi))
+
+ (:temporary (:sc unsigned-reg :offset rdx-offset
+ :from (:argument 0))
+ rdx)
+ (:temporary (:sc unsigned-reg :offset rdi-offset
+ :from (:argument 1))
+ rdi)
+
+ (:temporary (:sc unsigned-reg :offset rcx-offset
+ :from :eval)
+ rcx)
+ (:conditional ,test)
+ (:generator 10
+ (move rdx x)
+ (move rdi y)
+ (inst lea rcx (make-ea :qword
+ :disp (make-fixup ',name :assembly-routine)))
+ (inst call rcx)))))
+
+ (define-cond-assem-rtn generic-< < two-arg-< :l)
+ (define-cond-assem-rtn generic-> > two-arg-> :g))
+
+#+sb-assembling