:load-if (not (sc-is y ,constant-sc))))
(:arg-types ,type ,type)
(:temporary (:sc ,sc :from :eval) mask)
- (:temporary (:sc any-reg) bits)
+ (:temporary (:sc dword-reg) bits)
(:conditional :e)
(:generator ,cost
(when (or (location= y mask)
(setf y (register-inline-constant :aligned (tn-value y))))
(inst pcmpeqd mask y)
(inst movmskps bits mask)
- (inst cmp bits #b1111)))))
+ (inst cmp (if (location= bits eax-tn) al-tn bits)
+ #b1111)))))
(define-float-eql eql/single-float 4
single-reg fp-single-immediate single-float)
(define-float-eql eql/double-float 4
:load-if (not (sc-is y ,complex-constant-sc))))
(:arg-types ,complex-type ,complex-type)
(:temporary (:sc ,complex-sc :from :eval) cmp)
- (:temporary (:sc unsigned-reg) bits)
+ (:temporary (:sc dword-reg) bits)
(:info)
(:conditional :e)
(:generator 3
(note-this-location vop :internal-error)
(inst ,cmp-inst :eq cmp y)
(inst ,mask-inst bits cmp)
- (inst cmp bits ,mask)))
+ (inst cmp (if (location= bits eax-tn) al-tn bits)
+ ,mask)))
(define-vop (,complex-real-name ,complex-complex-name)
(:args (x :scs (,complex-sc ,complex-constant-sc)
:target cmp
(:policy :fast-safe)
(:vop-var vop)
(:generator 5
- (sc-case float
- (double-reg
- (inst movsd temp float)
- (move lo-bits temp))
- (double-stack
- (loadw lo-bits ebp-tn (frame-word-offset (tn-offset float))))
- (descriptor-reg
- (loadw lo-bits float double-float-value-slot
- other-pointer-lowtag)))
- (inst shl lo-bits 32)
- (inst shr lo-bits 32)))
+ (let ((dword-lo-bits (reg-in-size lo-bits :dword)))
+ (sc-case float
+ (double-reg
+ (inst movsd temp float)
+ (inst mov dword-lo-bits
+ (make-ea :dword :base rbp-tn
+ :disp (frame-byte-offset (tn-offset temp)))))
+ (double-stack
+ (inst mov dword-lo-bits
+ (make-ea :dword :base rbp-tn
+ :disp (frame-byte-offset (tn-offset float)))))
+ (descriptor-reg
+ (inst mov dword-lo-bits
+ (make-ea-for-object-slot-half float double-float-value-slot
+ other-pointer-lowtag)))))))
\f