3 (defmacro vect-ea
(base &optional idx
(width :dword
))
5 (if (and idx
(numberp idx
))
6 `(+ (- (* VECTOR-DATA-OFFSET N-WORD-BYTES
) OTHER-POINTER-LOWTAG
) ,idx
)
7 `(- (* VECTOR-DATA-OFFSET N-WORD-BYTES
) OTHER-POINTER-LOWTAG
))))
9 ;; (format t "ea ~A ~A ~A~%" base idx (and idx (symbolp idx)))
10 (if (and idx
(symbolp idx
))
11 `(make-ea ,width
:base
,base
:index
,idx
:disp
,disp
)
12 `(make-ea ,width
:base
,base
:disp
,disp
))))
15 (DEFINE-VOP (%sse-seq
=)
17 (:ARGS
(seq1 :SCS
(DESCRIPTOR-REG))
18 (seq2 :SCS
(DESCRIPTOR-REG)))
19 (:ARG-TYPES simple-array-unsigned-byte-8 simple-array-unsigned-byte-8
)
21 (:results
(RESULT :SCS
(DESCRIPTOR-REG)))
23 (:result-types fixnum
)
25 (:TEMPORARY
(:SC XMM-REG
) X0
)
26 (:TEMPORARY
(:SC XMM-REG
) X1
)
27 (:TEMPORARY
(:SC XMM-REG
) X2
)
28 (:TEMPORARY
(:SC XMM-REG
) X3
)
29 (:TEMPORARY
(:SC XMM-REG
) X4
)
30 (:TEMPORARY
(:SC XMM-REG
) X5
)
32 (:TEMPORARY
(:SC unsigned-reg
:offset eax-offset
:to
(:result
0)) temp1
)
33 (:TEMPORARY
(:SC unsigned-reg
:offset edx-offset
) temp2
)
34 (:TEMPORARY
(:SC unsigned-reg
:offset ebx-offset
) index
)
35 (:TEMPORARY
(:SC unsigned-reg
:offset ecx-offset
) length
)
39 (let ((top (gen-label))
41 (length-ok (gen-label))
46 (loadw index seq1 vector-length-slot other-pointer-lowtag
)
47 (loadw length seq2 vector-length-slot other-pointer-lowtag
)
50 (inst cmp index length
)
51 (inst jmp
:eq length-ok
)
53 ;; not same length, fail
56 (emit-label length-ok
)
58 ;; un-fixnumize length
61 ;; calc number of 256bit blocks
62 (inst shr length
(floor (log (/ 256 8) 2)))
65 (inst xor index index
)
74 (inst movdqu x0
(vect-ea seq1 index
:xmmword
))
75 (inst movdqu x1
(vect-ea seq2 index
:xmmword
))
82 (make-ea :xmmword
:base seq1
:index index
83 :disp
(+ (- (* VECTOR-DATA-OFFSET N-WORD-BYTES
) OTHER-POINTER-LOWTAG
) 16)))
85 (make-ea :xmmword
:base seq2
:index index
86 :disp
(+ (- (* VECTOR-DATA-OFFSET N-WORD-BYTES
) OTHER-POINTER-LOWTAG
) 16)))
89 ;; xor first/second blocks (i.e. if equal, xor will be zero)
96 ;; check for non-equality
100 (inst pmovmskb temp1 x4
)
101 (inst pmovmskb temp2 x5
)
103 (inst cmp temp1
#x0000FFFF
)
106 (inst cmp temp2
#x0000FFFF
)
114 ;; all 256bit blocks done
117 ;; check remaining bytes
118 (loadw length seq1 vector-length-slot other-pointer-lowtag
)
120 (inst and length
(1- (/ 256 8)))
123 (inst test length length
)
126 (inst xor temp1 temp1
)
127 (inst xor temp2 temp2
)
132 (inst movzx temp1
(vect-ea seq1 index
:byte
))
133 (inst movzx temp2
(vect-ea seq2 index
:byte
))
134 (inst xor temp1 temp2
)
138 (inst test temp1 temp1
)
148 (inst mov result
(fixnumize 0))
153 (inst mov result
(fixnumize 1))