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 (define-vop (%sse-add
/simple-array-single-float-1
)
11 (:args
(result :scs
(descriptor-reg))
12 (vect1 :scs
(descriptor-reg))
13 (vect2 :scs
(descriptor-reg))
14 (index :scs
(unsigned-reg)))
16 (:arg-types simple-array-single-float simple-array-single-float simple-array-single-float fixnum
)
18 (:temporary
(:sc sse-reg
) sse-temp1
)
19 (:temporary
(:sc sse-reg
) sse-temp2
)
23 ;; scale index by 4 (size-of single-float)
27 (inst movups sse-temp1
(vect-ea vect1 index
))
28 (inst movups sse-temp2
(vect-ea vect2 index
))
31 (inst addps sse-temp1 sse-temp2
)
34 (inst movups
(vect-ea result index
) sse-temp1
)
37 (define-vop (%sse-sub
/simple-array-single-float-1
)
40 (:args
(result :scs
(descriptor-reg))
41 (vect1 :scs
(descriptor-reg))
42 (vect2 :scs
(descriptor-reg))
43 (index :scs
(unsigned-reg)))
45 (:arg-types simple-array-single-float simple-array-single-float simple-array-single-float fixnum
)
47 (:temporary
(:sc sse-reg
) sse-temp1
)
48 (:temporary
(:sc sse-reg
) sse-temp2
)
52 ;; scale index by 4 (size-of single-float)
56 (inst movups sse-temp1
(vect-ea vect1 index
))
57 (inst movups sse-temp2
(vect-ea vect2 index
))
60 (inst subps sse-temp1 sse-temp2
)
63 (inst movups
(vect-ea result index
) sse-temp1
)
66 (define-vop (%sse-mul
/simple-array-single-float-1
)
69 (:args
(result :scs
(descriptor-reg))
70 (vect1 :scs
(descriptor-reg))
71 (vect2 :scs
(descriptor-reg))
72 (index :scs
(unsigned-reg)))
74 (:arg-types simple-array-single-float simple-array-single-float simple-array-single-float fixnum
)
76 (:temporary
(:sc sse-reg
) sse-temp1
)
77 (:temporary
(:sc sse-reg
) sse-temp2
)
81 ;; scale index by 4 (size-of single-float)
85 (inst movups sse-temp1
(vect-ea vect1 index
))
86 (inst movups sse-temp2
(vect-ea vect2 index
))
89 (inst mulps sse-temp1 sse-temp2
)
92 (inst movups
(vect-ea result index
) sse-temp1
)
95 (define-vop (%sse-div
/simple-array-single-float-1
)
98 (:args
(result :scs
(descriptor-reg))
99 (vect1 :scs
(descriptor-reg))
100 (vect2 :scs
(descriptor-reg))
101 (index :scs
(unsigned-reg)))
103 (:arg-types simple-array-single-float simple-array-single-float simple-array-single-float fixnum
)
105 (:temporary
(:sc sse-reg
) sse-temp1
)
106 (:temporary
(:sc sse-reg
) sse-temp2
)
110 ;; scale index by 4 (size-of single-float)
114 (inst movups sse-temp1
(vect-ea vect1 index
))
115 (inst movups sse-temp2
(vect-ea vect2 index
))
118 (inst divps sse-temp1 sse-temp2
)
121 (inst movups
(vect-ea result index
) sse-temp1
)
124 (define-vop (%sse-sqrt
/simple-array-single-float-1
)
127 (:args
(result :scs
(descriptor-reg))
128 (vect1 :scs
(descriptor-reg))
129 (index :scs
(unsigned-reg)))
131 (:arg-types simple-array-single-float simple-array-single-float fixnum
)
133 (:temporary
(:sc sse-reg
) sse-temp1
)
134 (:temporary
(:sc sse-reg
) sse-temp2
)
138 ;; scale index by 4 (size-of single-float)
142 (inst movups sse-temp1
(vect-ea vect1 index
))
145 (inst sqrtps sse-temp2 sse-temp1
)
148 (inst movups
(vect-ea result index
) sse-temp2
)
152 (define-vop (%sse-recip
/simple-array-single-float-1
)
155 (:args
(result :scs
(descriptor-reg))
156 (vect1 :scs
(descriptor-reg))
157 (index :scs
(unsigned-reg)))
159 (:arg-types simple-array-single-float simple-array-single-float fixnum
)
161 (:temporary
(:sc sse-reg
) sse-temp1
)
162 (:temporary
(:sc sse-reg
) sse-temp2
)
166 ;; scale index by 4 (size-of single-float)
170 (inst movups sse-temp1
(vect-ea vect1 index
))
173 (inst rcpps sse-temp2 sse-temp1
)
176 (inst movups
(vect-ea result index
) sse-temp2
)
180 (define-vop (%sse-recip-sqrt
/simple-array-single-float-1
)
183 (:args
(result :scs
(descriptor-reg))
184 (vect1 :scs
(descriptor-reg))
185 (index :scs
(unsigned-reg)))
187 (:arg-types simple-array-single-float simple-array-single-float fixnum
)
189 (:temporary
(:sc sse-reg
) sse-temp1
)
190 (:temporary
(:sc sse-reg
) sse-temp2
)
194 ;; scale index by 4 (size-of single-float)
198 (inst movups sse-temp1
(vect-ea vect1 index
))
201 (inst rsqrtps sse-temp2 sse-temp1
)
204 (inst movups
(vect-ea result index
) sse-temp2
)