..
[sb-simd.git] / sse-vop.lisp
blob07550d08886e6bd9bdaf894d803d86288986098c
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)))
7 ;; TWO-ARG SSE VOPs
8 (loop for (op-name type mov-inst op-inst) in
9 '(
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)))
41 (:policy :fast-safe)
43 ;;(:guard (member :sse2 *backend-subfeatures*))
45 (:args
46 (result :scs (descriptor-reg))
47 (vect1 :scs (descriptor-reg))
48 (vect2 :scs (descriptor-reg))
49 (index :scs (unsigned-reg)))
51 (:arg-types
52 ,(intern (format nil "SIMPLE-ARRAY-~A" type))
53 ,(intern (format nil "SIMPLE-ARRAY-~A" type))
54 ,(intern (format nil "SIMPLE-ARRAY-~A" type))
55 fixnum)
57 (:temporary (:sc sse-reg) sse-temp1)
58 (:temporary (:sc sse-reg) sse-temp2)
60 (:generator 10
62 ;; scale index by 4 (size-of single-float)
63 (inst shl index 2)
65 ;; load
66 (inst ,mov-inst sse-temp1 (vect-ea vect1 index))
67 (inst ,mov-inst sse-temp2 (vect-ea vect2 index))
69 ;; operate
70 (inst ,op-inst sse-temp1 sse-temp2)
72 ;; store
73 (inst ,mov-inst (vect-ea result index) sse-temp1)
74 )))
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)))
87 (:policy :fast-safe)
89 ;;(:guard (member :sse2 *backend-subfeatures*))
91 (:args
92 (result :scs (descriptor-reg))
93 (vect1 :scs (descriptor-reg))
94 (index :scs (unsigned-reg)))
96 (:arg-types
97 ,(intern (format nil "SIMPLE-ARRAY-~A" type))
98 ,(intern (format nil "SIMPLE-ARRAY-~A" type))
99 fixnum)
101 (:temporary (:sc sse-reg) sse-temp1)
103 (:generator 10
105 ;; scale index by 4 (size-of single-float)
106 (inst shl index 2)
108 ;; load
109 (inst ,mov-inst sse-temp1 (vect-ea vect1 index))
111 ;; operate
112 (inst ,op-inst sse-temp1)
114 ;; store
115 (inst ,mov-inst (vect-ea result index) sse-temp1)