..
[sb-simd.git] / generate-sse-instructions.lisp
blob7619416db8556b758063186d32252c0584ccd953
1 #|
3 instruction reference:
5 http://www.amd.com/us-en/assets/content_type/white_papers_and_tech_docs/26568.pdf
8 TODO:
10 FXRSTOR. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
11 FXSAVE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
13 LDMXCSR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
15 MOVDQ2Q . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178
17 MOVQ2DQ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208
19 (ib-forms:)
20 PSLLD. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323
21 PSLLDQ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 326
22 PSLLQ. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328
23 PSLLW . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 330
24 PSRAD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333
25 PSRAW . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336
26 PSRLD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 339
27 PSRLDQ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 342
28 PSRLQ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 344
29 PSRLW . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 347
31 STMXCSR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 410
36 (declaim (optimize (debug 3)))
38 (defun emit-ops (ops)
39 (loop for op in ops
40 collect `(emit-byte segment ,op) into result
41 finally (return result)))
44 (defun gen-ops (&optional (stream t))
46 ;;; instructions like:
47 ;;; ADDPS xmm1, xmm2/mem128 0F 58 /r
48 (loop for (inst . ops) in
50 ;; single precision float
51 (addps #x0F #x58)
52 (addsubps #xF2 #x0F #xD0)
53 (andnps #x0F #x55)
54 (andps #x0F #x54)
55 (divps #x0F #x5E)
56 (haddps #xF2 #x0F #x7C)
57 (hsubps #xF2 #x0F #x7D)
58 (maxps #x0F #x5F)
59 (minps #x0F #x5D)
60 (mulps #x0F #x59)
61 (orps #x0F #x56)
62 (rcpps #x0F #x53)
63 (rsqrtps #x0F #x52)
64 (sqrtps #x0F #x51)
65 (subps #x0F #x5C)
66 (unpckhps #x0F #x15)
67 (unpcklps #x0F #x14)
68 (xorps #x0F #x57)
70 ;; double precision float
71 (addpd #x66 #x0F #x58)
72 (addsubpd #x66 #x0F #xD0)
73 (andnpd #x66 #x0F #x55)
74 (andpd #x66 #x0F #x54)
75 (divpd #x66 #x0F #x5E)
76 (haddpd #x66 #x0F #x7C)
77 (hsubpd #x66 #x0F #x7D)
78 (maxpd #x66 #x0F #x5F)
79 (minpd #x66 #x0F #x5D)
80 (mulpd #x66 #x0F #x59)
81 (orpd #x66 #x0F #x56)
82 (sqrtpd #x66 #x0F #x51)
83 (subpd #x66 #x0F #x5C)
84 (unpckhpd #x66 #x0F #x15)
85 (unpcklpd #x66 #x0F #x14)
86 (xorpd #x66 #x0F #x57)
88 ;; scalar double precision float
89 (addsd #xF2 #x0F #x58)
90 (comisd #x66 #x0F #x2F)
91 (divsd #xF2 #x0F #x5E)
92 (maxsd #xF2 #x0F #x5F)
93 (minsd #xF2 #x0F #x5D)
94 (mulsd #xF2 #x0F #x59)
95 (sqrtsd #xF2 #x0F #x51)
96 (subsd #xF2 #x0F #x5C)
97 (ucomisd #x66 #x0F #x2E)
99 ;; scalar single precision float
100 (addss #xF3 #x0F #x58)
101 (comiss #x0F #x2F)
102 (divss #xF3 #x0F #x5E)
103 (maxss #xF3 #x0F #x5F)
104 (minss #xF3 #x0F #x5D)
105 (mulss #xF3 #x0F #x59)
106 (rcpss #xF3 #x0F #x53)
107 (rsqrtss #xF3 #x0F #x52)
108 (sqrtss #xF3 #x0F #x51)
109 (subss #xF3 #x0F #x5C)
110 (ucomiss #x0F #x2E)
113 ;; packed integer
114 (packssdw #x66 #x0F #x6B)
115 (packsswb #x66 #x0F #x63)
116 (packuswb #x66 #x0F #x67)
118 (paddb #x66 #x0F #xFC)
119 (paddd #x66 #x0F #xFE)
120 (paddq #x66 #x0F #xD4)
121 (paddsb #x66 #x0F #xEC)
122 (paddsw #x66 #x0F #xED)
123 (paddusb #x66 #x0F #xDC)
124 (paddusw #x66 #x0F #xDD)
125 (paddw #x66 #x0F #xFD)
127 (pand #x66 #x0F #xDB)
128 (pandn #x66 #x0F #xDF)
130 (pavgb #x66 #x0F #xE0)
131 (pavgw #x66 #x0F #xE3)
133 (pcmpeqb #x66 #x0F #x74)
134 (pcmpeqd #x66 #x0F #x76)
135 (pcmpeqw #x66 #x0F #x75)
136 (pcmpgtb #x66 #x0F #x64)
137 (pcmpgtd #x66 #x0F #x66)
138 (pcmpgtw #x66 #x0F #x65)
140 (pmaddwd #x66 #x0F #xF5)
142 (pmaxsw #x66 #x0F #xEE)
143 (pmaxub #x66 #x0F #xDE)
145 (pminsw #x66 #x0F #xEA)
146 (pminub #x66 #x0F #xDA)
148 (pmovmskb #x66 #x0F #xD7)
150 (pmulhuw #x66 #x0F #xE4)
151 (pmulhw #x66 #x0F #xE5)
152 (pmullw #x66 #x0F #xD5)
153 (pmuludq #x66 #x0F #xF4)
155 (por #x66 #x0F #xEB)
157 (psadbw #x66 #x0F #xF6)
158 (pssld #x66 #x0F #xF2)
159 (psllq #x66 #x0F #xF3)
160 (psllw #x66 #x0F #xF1)
161 (psrad #x66 #x0F #xE2)
162 (psraw #x66 #x0F #xE2)
163 (psrld #x66 #x0F #xD2)
164 (psrlq #x66 #x0F #xD3)
165 (psrlw #x66 #x0F #xD1)
167 (psubb #x66 #x0F #xF8)
168 (psubd #x66 #x0F #xFA)
169 (psubq #x66 #x0F #xFB)
170 (psubsb #x66 #x0F #xE8)
171 (psubsw #x66 #x0F #xE9)
172 (psubusb #x66 #x0F #xD8)
173 (psubusw #x66 #x0F #xD9)
174 (psubw #x66 #x0F #xF9)
176 (punpckhbw #x66 #x0F #x68)
177 (punpckhdq #x66 #x0F #x6A)
178 (punpckhqdq #x66 #x0F #x6D)
179 (punpckhwd #x66 #x0F #x69)
180 (punpcklbw #x66 #x0F #x60)
181 (punpckldq #x66 #x0F #x62)
182 (punpcklqdq #x66 #x0F #x6C)
183 (punpcklwd #x66 #x0F #x61)
185 (pxor #x66 #x0F #xEF)
187 ;; convert
188 (cvtdq2pd #xF3 #x0F #xE6)
189 (cvtdq2ps #x0F #x5B)
190 (cvtpd2dq #xF2 #x0F #xE6)
191 (cvtpd2pi #x66 #x0F #x2D)
192 (cvtpd2ps #x66 #x0F #x5A)
193 (cvtpi2pd #x66 #x0F #x2A)
194 (cvtpi2ps #x0F #x2A)
195 (cvtps2dq #x66 #x0F #x5B)
196 (cvtps2pd #x0F #x5A)
197 (cvtps2pi #x0F #x2D)
198 (cvtsd2si #xF2 #x0F #x2D)
199 (cvtsd2ss #xF2 #x0F #x5A)
200 (cvtsi2sd #xF2 #x0F #x2A)
201 (cvtsi2ss #xF3 #x0F #x2A)
202 (cvtss2sd #xF3 #x0F #x5A)
203 (cvtss2si #xF3 #x0F #x2D)
204 (cvttpd2dq #x66 #x0F #xE6)
205 (cvttpd2pi #x66 #x0F #x2C)
206 (cvttps2dq #xF3 #x0F #x5B)
207 (cvttps2pi #x0F #x2C)
208 (cvttsd2si #xF2 #x0F #x2C)
209 (cvttss2si #xF3 #x0F #x2C)
211 ;; misc
212 (lddqu #xF2 #x0F #xF0)
213 (maskmovdqu #x66 #x0F #xF7)
214 (movddup #xF2 #x0F #x12)
215 (movhlps #x0F #x12)
216 (movlhps #x0F #x16)
217 (movmskpd #x66 #x0F #x50)
218 (movmskps #x0F #x50)
219 (movntdq #x66 #x0F #XE7)
220 (movntpd #x66 #x0F #x2B)
221 (movntps #x0F #x2B)
222 (movshdup #xF3 #x0F #x16)
223 (movsldup #xF3 #x0F #x12)
226 (format stream "~S~%~%"
227 `(define-instruction ,(intern (symbol-name inst)) (segment dst src)
228 (:emitter
229 ,@(emit-ops ops)
230 (emit-ea segment src (reg-tn-encoding dst))))))
233 ;; INSTRUCTIONS WITH /r IB8
234 (loop for (inst . ops) in
236 (pextrw #X66 #x0F #xC5)
237 (pinsrw #x66 #x0F #xC4)
239 (pshufd #x66 #x0F #x70)
240 (pshufhw #xF3 #x0F #x70)
241 (pshuflw #xF2 #x0F #x70)
243 (shufpd #x66 #x0F #xC6)
244 (shufps #x0F #xC6)
248 (format stream "~S~%~%"
249 `(define-instruction ,(intern (symbol-name inst)) (segment dst src byte)
250 (:emitter
251 ,@(emit-ops ops)
252 (emit-ea segment src (reg-tn-encoding dst))
253 (emit-sized-immediate segment :byte byte)
254 ))))
256 ;; COMPARE
257 (loop for (inst . ops) in
259 (cmppd #x66 #x0F #xC2)
260 (cmpps #x0F #xC2)
261 (cmpsd #xF2 #x0F #xC2)
262 (cmpss #xF3 #x0F #xC2)
265 (format stream "~S~%~%"
266 `(define-instruction ,(intern (symbol-name inst)) (segment dst src cond)
267 (:emitter
268 ,@(emit-ops ops)
269 (emit-ea segment src (reg-tn-encoding dst))
270 (emit-sized-immediate segment :byte (cdr (assoc cond
271 '((:eq . #b000) (:e . #b000) (:z . #b000)
272 (:l . #b001) (:nge . #b001)
273 (:le . #b010) (:ng . #b010)
274 (:unord . #b011)
275 (:ne . #b100) (:nz . #b100)
276 (:nl . #b101) (:ge . #b101)
277 (:nle . #b110) (:g . #b110)
278 (:ord . #b111)
279 ))))
280 ))))
282 ;; MOVES
283 (loop for (inst ops-m2r ops-r2m) in
285 (movapd (#x66 #x0F #x28) (#x66 #x0F #x29))
286 (movaps (#x0F #x28) (#x0F #x29))
288 (movd (#x66 #x0F #x6E) (#x66 #x0F #x7E))
290 (movdqa (#x66 #x0F #x6F) (#x66 #x0F #x7F))
291 (movdqu (#xF3 #x0F #x6F) (#xF3 #x0F #x7F))
293 (movhpd (#x66 #x0F #x16) (#x66 #x0F #x17))
294 (movhps (#x0F #x16) (#x0F #x17))
296 (movlpd (#x66 #x0F #x12) (#x66 #x0F #x13))
297 (movlps (#x0F #x12) (#x0F #x13))
299 (movq (#xF3 #x0F #x7E) (#x66 #x0F #xD6))
301 (movsd (#xF2 #x0F #x10) (#xF2 #x0F #x11))
303 (movss (#xF3 #x0F #x10) (#xF3 #x0F #x11))
305 (movupd (#x66 #x0F #x10) (#x66 #x0F #x11))
306 (movups (#x0F #x10) (#x0F #x11))
309 (format stream "~S~%~%"
310 `(define-instruction ,(intern (symbol-name inst)) (segment dst src)
311 (:emitter
312 (cond ((sse-register-p dst)
313 ,@(emit-ops ops-m2r)
314 (emit-ea segment src (reg-tn-encoding dst)))
315 (t ,@(emit-ops ops-r2m)
316 (emit-ea segment dst (reg-tn-encoding src)))))))))
318 (defun gen-ops-to-file (filename)
319 (with-open-file (stream filename :direction :output :if-exists :supersede)
320 (gen-ops stream)))