..
[sb-simd.git] / sse-vop.lisp
blobbb1e8801f7b66042cdbcd63ed4dc424bd5d04161
1 (in-package :sb-vm)
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)
9 (:policy :fast-safe)
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)
21 (:generator 10
23 ;; scale index by 4 (size-of single-float)
24 (inst shl index 2)
26 ;; load
27 (inst movups sse-temp1 (vect-ea vect1 index))
28 (inst movups sse-temp2 (vect-ea vect2 index))
30 ;; operate
31 (inst addps sse-temp1 sse-temp2)
33 ;; store
34 (inst movups (vect-ea result index) sse-temp1)
37 (define-vop (%sse-sub/simple-array-single-float-1)
38 (:policy :fast-safe)
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)
50 (:generator 10
52 ;; scale index by 4 (size-of single-float)
53 (inst shl index 2)
55 ;; load
56 (inst movups sse-temp1 (vect-ea vect1 index))
57 (inst movups sse-temp2 (vect-ea vect2 index))
59 ;; operate
60 (inst subps sse-temp1 sse-temp2)
62 ;; store
63 (inst movups (vect-ea result index) sse-temp1)
66 (define-vop (%sse-mul/simple-array-single-float-1)
67 (:policy :fast-safe)
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)
79 (:generator 10
81 ;; scale index by 4 (size-of single-float)
82 (inst shl index 2)
84 ;; load
85 (inst movups sse-temp1 (vect-ea vect1 index))
86 (inst movups sse-temp2 (vect-ea vect2 index))
88 ;; operate
89 (inst mulps sse-temp1 sse-temp2)
91 ;; store
92 (inst movups (vect-ea result index) sse-temp1)
95 (define-vop (%sse-div/simple-array-single-float-1)
96 (:policy :fast-safe)
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)
108 (:generator 10
110 ;; scale index by 4 (size-of single-float)
111 (inst shl index 2)
113 ;; load
114 (inst movups sse-temp1 (vect-ea vect1 index))
115 (inst movups sse-temp2 (vect-ea vect2 index))
117 ;; operate
118 (inst divps sse-temp1 sse-temp2)
120 ;; store
121 (inst movups (vect-ea result index) sse-temp1)
124 (define-vop (%sse-sqrt/simple-array-single-float-1)
125 (:policy :fast-safe)
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)
136 (:generator 10
138 ;; scale index by 4 (size-of single-float)
139 (inst shl index 2)
141 ;; load
142 (inst movups sse-temp1 (vect-ea vect1 index))
144 ;; operate
145 (inst sqrtps sse-temp2 sse-temp1)
147 ;; store
148 (inst movups (vect-ea result index) sse-temp2)
152 (define-vop (%sse-recip/simple-array-single-float-1)
153 (:policy :fast-safe)
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)
164 (:generator 10
166 ;; scale index by 4 (size-of single-float)
167 (inst shl index 2)
169 ;; load
170 (inst movups sse-temp1 (vect-ea vect1 index))
172 ;; operate
173 (inst rcpps sse-temp2 sse-temp1)
175 ;; store
176 (inst movups (vect-ea result index) sse-temp2)
180 (define-vop (%sse-recip-sqrt/simple-array-single-float-1)
181 (:policy :fast-safe)
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)
192 (:generator 10
194 ;; scale index by 4 (size-of single-float)
195 (inst shl index 2)
197 ;; load
198 (inst movups sse-temp1 (vect-ea vect1 index))
200 ;; operate
201 (inst rsqrtps sse-temp2 sse-temp1)
203 ;; store
204 (inst movups (vect-ea result index) sse-temp2)