..
[sb-simd.git] / generate-sse-instructions.lisp
blobe3254cfc5d3832d55e98b519777afd971ed9c185
1 #|
3 instruction reference:
5 http://www.amd.com/us-en/assets/content_type/white_papers_and_tech_docs/26568.pdf
8 TODO:
10 CMPPD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
11 CMPPS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
12 CMPSD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
13 CMPSS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
15 FXRSTOR. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
16 FXSAVE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
18 HADDPD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
19 HADDPS. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
20 HSUBPD. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
21 HSUBPS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
23 LDDQU. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138
24 LDMXCSR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
26 MASKMOVDQU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
28 MOVD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173
29 MOVDDUP. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176
30 MOVDQ2Q . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178
32 MOVHLPS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184
34 MOVLHPS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190
36 MOVMSKPD. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196
37 MOVMSKPS. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198
38 MOVNTDQ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200
39 MOVNTPD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
40 MOVNTPS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204
42 MOVQ2DQ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208
44 MOVSHDUP. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213
45 MOVSLDUP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215
47 PEXTRW. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284
48 PINSRW . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286
50 PSHUFD. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314
51 PSHUFHW . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317
52 PSHUFLW . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320
53 PSLLD. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323
54 PSLLDQ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 326
55 PSLLQ. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328
56 PSLLW . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 330
57 PSRAD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333
58 PSRAW . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336
59 PSRLD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 339
60 PSRLDQ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 342
61 PSRLQ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 344
62 PSRLW . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 347
64 SHUFPD. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 392
65 SHUFPS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 395
66 STMXCSR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 410
71 (declaim (optimize (debug 3)))
73 (defun emit-ops (ops)
74 (loop for op in ops
75 collect `(emit-byte segment ,op) into result
76 finally (return result)))
79 (defun gen-ops (&optional (stream t))
81 ;;; instructions like:
82 ;;; ADDPS xmm1, xmm2/mem128 0F 58 /r
83 (loop for (inst . ops) in
85 ;; single precision float
86 (addps #x0F #x58)
87 (addsubps #xF2 #x0F #xD0)
88 (andnps #x0F #x55)
89 (andps #x0F #x54)
90 (divps #x0F #x5E)
91 (maxps #x0F #x5F)
92 (minps #x0F #x5D)
93 (mulps #x0F #x59)
94 (orps #x0F #x56)
95 (rcpps #x0F #x53)
96 (rsqrtps #x0F #x52)
97 (sqrtps #x0F #x51)
98 (subps #x0F #x5C)
99 (unpckhps #x0F #x15)
100 (unpcklps #x0F #x14)
101 (xorps #x0F #x57)
103 ;; double precision float
104 (addpd #x66 #x0F #x58)
105 (addsubpd #x66 #x0F #xD0)
106 (andnpd #x66 #x0F #x55)
107 (andpd #x66 #x0F #x54)
108 (divpd #x66 #x0F #x5E)
109 (maxpd #x66 #x0F #x5F)
110 (minpd #x66 #x0F #x5D)
111 (mulpd #x66 #x0F #x59)
112 (orps #x66 #x0F #x56)
113 (sqrtpd #x66 #x0F #x51)
114 (subpd #x66 #x0F #x5C)
115 (unpckhpd #x66 #x0F #x15)
116 (unpcklpd #x66 #x0F #x14)
117 (xorpd #x66 #x0F #x57)
119 ;; scalar double precision float
120 (addsd #xF2 #x0F #x58)
121 (comisd #x66 #x0F #x2F)
122 (divsd #xF2 #x0F #x5E)
123 (maxsd #xF2 #x0F #x5F)
124 (minsd #xF2 #x0F #x5D)
125 (mulsd #xF2 #x0F #x59)
126 (sqrtsd #xF2 #x0F #x51)
127 (subsd #xF2 #x0F #x5C)
128 (ucomisd #x66 #x0F #x2E)
130 ;; scalar single precision float
131 (addss #xF3 #x0F #x58)
132 (comiss #x0F #x2F)
133 (divss #xF3 #x0F #x5E)
134 (maxss #xF3 #x0F #x5F)
135 (minss #xF3 #x0F #x5D)
136 (mulss #xF3 #x0F #x59)
137 (rcpss #xF3 #x0F #x53)
138 (rsqrtss #xF3 #x0F #x52)
139 (sqrtss #xF3 #x0F #x51)
140 (subss #xF3 #x0F #x5C)
141 (ucomiss #x0F #x2E)
144 ;; packed integer
145 (packssdw #x66 #x0F #x6B)
146 (packsswb #x66 #x0F #x63)
147 (packuswb #x66 #x0F #x67)
149 (paddb #x66 #x0F #xFC)
150 (paddd #x66 #x0F #xFE)
151 (paddq #x66 #x0F #xD4)
152 (paddsb #x66 #x0F #xEC)
153 (paddsw #x66 #x0F #xED)
154 (paddusb #x66 #x0F #xDC)
155 (paddusw #x66 #x0F #xDD)
156 (paddw #x66 #x0F #xFD)
158 (pand #x66 #x0F #xDB)
159 (pandn #x66 #x0F #xDF)
161 (pavgb #x66 #x0F #xE0)
162 (pavgw #x66 #x0F #xE3)
164 (pcmpeqb #x66 #x0F #x74)
165 (pcmpeqd #x66 #x0F #x76)
166 (pcmpeqw #x66 #x0F #x75)
167 (pcmpgtb #x66 #x0F #x64)
168 (pcmpgtd #x66 #x0F #x66)
169 (pcmpgtw #x66 #x0F #x65)
171 (pmaddwd #x66 #x0F #xF5)
173 (pmaxsw #x66 #x0F #xEE)
174 (pmaxub #x66 #x0F #xDE)
176 (pminsw #x66 #x0F #xEA)
177 (pminub #x66 #x0F #xDA)
179 (pmovmskb #x66 #x0F #xD7)
181 (pmulhuw #x66 #x0F #xE4)
182 (pmulhw #x66 #x0F #xE5)
183 (pmullw #x66 #x0F #xD5)
184 (pmuludq #x66 #x0F #xF4)
186 (por #x66 #x0F #xEB)
188 (psadbw #x66 #x0F #xF6)
189 (pssld #x66 #x0F #xF2)
190 (psllq #x66 #x0F #xF3)
191 (psllw #x66 #x0F #xF1)
192 (psrad #x66 #x0F #xE2)
193 (psraw #x66 #x0F #xE2)
194 (psrld #x66 #x0F #xD2)
195 (psrlq #x66 #x0F #xD3)
196 (psrlw #x66 #x0F #xD1)
198 (psubb #x66 #x0F #xF8)
199 (psubd #x66 #x0F #xFA)
200 (psubq #x66 #x0F #xFB)
201 (psubsb #x66 #x0F #xE8)
202 (psubsw #x66 #x0F #xE9)
203 (psubusb #x66 #x0F #xD8)
204 (psubusw #x66 #x0F #xD9)
205 (psubw #x66 #x0F #xF9)
207 (punpckhbw #x66 #x0F #x68)
208 (punpckhdq #x66 #x0F #x6A)
209 (punpckhqdq #x66 #x0F #x6D)
210 (punpckhwd #x66 #x0F #x69)
211 (punpcklbw #x66 #x0F #x60)
212 (punpckldq #x66 #x0F #x62)
213 (punpcklqdq #x66 #x0F #x6C)
214 (punpcklwd #x66 #x0F #x61)
216 (pxor #x66 #x0F #xEF)
218 ;; convert
219 (cvtdq2pd #xF3 #x0F #xE6)
220 (cvtdq2ps #x0F #x5B)
221 (cvtpd2dq #xF2 #x0F #xE6)
222 (cvtpd2pi #x66 #x0F #x2D)
223 (cvtpd2ps #x66 #x0F #x5A)
224 (cvtpi2pd #x66 #x0F #x2A)
225 (cvtpi2ps #x0F #x2A)
226 (cvtps2dq #x66 #x0F #x5B)
227 (cvtps2pd #x0F #x5A)
228 (cvtps2pi #x0F #x2D)
229 (cvtsd2si #xF2 #x0F #x2D)
230 (cvtsd2ss #xF2 #x0F #x5A)
231 (cvtsi2sd #xF2 #x0F #x2A)
232 (cvtsi2ss #xF3 #x0F #x2A)
233 (cvtss2sd #xF3 #x0F #x5A)
234 (cvtss2si #xF3 #x0F #x2D)
235 (cvttpd2dq #x66 #x0F #xE6)
236 (cvttpd2pi #x66 #x0F #x2C)
237 (cvttps2dq #xF3 #x0F #x5B)
238 (cvttps2pi #x0F #x2C)
239 (cvttsd2si #xF2 #x0F #x2C)
240 (cvttss2si #xF3 #x0F #x2C)
244 (format stream "~S~%~%"
245 `(define-instruction ,(intern (symbol-name inst)) (segment dst src)
246 (:emitter
247 ,@(emit-ops ops)
248 (emit-ea segment src (reg-tn-encoding dst))))))
250 ;; MOVES
251 (loop for (inst ops-m2r ops-r2m) in
253 (movapd (#x66 #x0F #x28) (#x66 #x0F #x29))
254 (movaps (#x0F #x28) (#x0F #x29))
256 (movdqa (#x66 #x0F #x6F) (#x66 #x0F #x7F))
257 (movdqu (#xF3 #x0F #x6F) (#xF3 #x0F #x7F))
259 (movhpd (#x66 #x0F #x16) (#x66 #x0F #x17))
260 (movhps (#x0F #x16) (#x0F #x17))
262 (movlpd (#x66 #x0F #x12) (#x66 #x0F #x13))
263 (movlps (#x0F #x12) (#x0F #x13))
265 (movq (#xF3 #x0F #x7E) (#x66 #x0F #xD6))
267 (movsd (#xF2 #x0F #x10) (#xF2 #x0F #x11))
269 (movss (#xF3 #x0F #x10) (#xF3 #x0F #x11))
271 (movupd (#x66 #x0F #x10) (#x66 #x0F #x11))
272 (movups (#x0F #x10) (#x0F #x11))
275 (format stream "~S~%~%"
276 `(define-instruction ,(intern (symbol-name inst)) (segment dst src)
277 (:emitter
278 (cond ((sse-register-p dst)
279 ,@(emit-ops ops-m2r)
280 (emit-ea segment src (reg-tn-encoding dst)))
281 (t ,@(emit-ops ops-r2m)
282 (emit-ea segment dst (reg-tn-encoding src)))))))))
284 (defun gen-ops-to-file (filename)
285 (with-open-file (stream filename :direction :output :if-exists :supersede)
286 (gen-ops stream)))