3 (defmacro vect-ea
(vect idx
)
4 `(make-ea :dword
:base
,vect
:index
,idx
5 :disp
(- (* vector-data-offset n-word-bytes
) other-pointer-lowtag
)))
8 (loop for
(op-name type mov-inst op-inst
) in
10 (add single-float movups addps
)
11 (addsub single-float movups addsubps
)
12 (andnot single-float movups andnps
)
13 (and single-float movups andps
)
14 (div single-float movups divps
)
15 (hadd single-float movups haddps
)
16 (hsub single-float movups hsubps
)
17 (max single-float movups maxps
)
18 (min single-float movups minps
)
19 (mul single-float movups mulps
)
20 (or single-float movups orps
)
21 (sub single-float movups subps
)
22 (xor single-float movups xorps
)
24 (add double-float movupd addpd
)
25 (addsub double-float movupd addsubpd
)
26 (andnot double-float movupd andnpd
)
27 (and double-float movupd andpd
)
28 (div double-float movupd divpd
)
29 (hadd double-float movupd haddpd
)
30 (hsub double-float movupd hsubpd
)
31 (max double-float movupd maxpd
)
32 (min double-float movupd minpd
)
33 (mul double-float movupd mulpd
)
34 (or double-float movupd orpd
)
35 (sub double-float movupd subpd
)
36 (xor double-float movupd xorpd
)
40 `(define-vop (,(intern (format nil
"%SSE-~A/SIMPLE-ARRAY-~A-1" op-name type
)))
43 ;;(:guard (member :sse2 *backend-subfeatures*))
46 (result :scs
(descriptor-reg))
47 (vect1 :scs
(descriptor-reg))
48 (vect2 :scs
(descriptor-reg))
49 (index :scs
(unsigned-reg)))
52 ,(intern (format nil
"SIMPLE-ARRAY-~A" type
))
53 ,(intern (format nil
"SIMPLE-ARRAY-~A" type
))
54 ,(intern (format nil
"SIMPLE-ARRAY-~A" type
))
57 (:temporary
(:sc sse-reg
) sse-temp1
)
58 (:temporary
(:sc sse-reg
) sse-temp2
)
62 ;; scale index by 4 (size-of single-float)
66 (inst ,mov-inst sse-temp1
(vect-ea vect1 index
))
67 (inst ,mov-inst sse-temp2
(vect-ea vect2 index
))
70 (inst ,op-inst sse-temp1 sse-temp2
)
73 (inst ,mov-inst
(vect-ea result index
) sse-temp1
)
76 ;; SINGLE-ARG SSE VOPs
77 (loop for
(op-name type mov-inst op-inst
) in
79 (recip single-float movups rcpps
)
80 (rsqrt single-float movups rsqrtps
)
81 (sqrt single-float movups sqrtps
)
82 (sqrt double-float movupd sqrtpd
)
86 `(define-vop (,(intern (format nil
"%SSE-~A/SIMPLE-ARRAY-~A-1" op-name type
)))
89 ;;(:guard (member :sse2 *backend-subfeatures*))
92 (result :scs
(descriptor-reg))
93 (vect1 :scs
(descriptor-reg))
94 (index :scs
(unsigned-reg)))
97 ,(intern (format nil
"SIMPLE-ARRAY-~A" type
))
98 ,(intern (format nil
"SIMPLE-ARRAY-~A" type
))
101 (:temporary
(:sc sse-reg
) sse-temp1
)
105 ;; scale index by 4 (size-of single-float)
109 (inst ,mov-inst sse-temp1
(vect-ea vect1 index
))
112 (inst ,op-inst sse-temp1
)
115 (inst ,mov-inst
(vect-ea result index
) sse-temp1
)