..
[sb-simd.git] / generate-sse-instructions.lisp
blobd634f45ac6658c6a80260ff7a849c07a8f09876c
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
14 COMISD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
15 COMISS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
16 CVTDQ2PD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
17 CVTDQ2PS. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
18 CVTPD2DQ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
19 CVTPD2PI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
20 CVTPD2PS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
21 CVTPI2PD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
22 CVTPI2PS. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
23 CVTPS2DQ. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
24 CVTPS2PD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
25 CVTPS2PI. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
26 CVTSD2SI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
27 CVTSD2SS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
28 CVTSI2SD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
29 CVTSI2SS. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
30 CVTSS2SD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
31 CVTSS2SI. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
32 CVTTPD2DQ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
33 CVTTPD2PI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
34 CVTTPS2DQ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
35 CVTTPS2PI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
36 CVTTSD2SI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
37 CVTTSS2SI. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
38 FXRSTOR. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
39 FXSAVE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
40 HADDPD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
41 HADDPS. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
42 HSUBPD. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
43 HSUBPS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
44 LDDQU. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138
45 LDMXCSR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
46 MASKMOVDQU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
47 MOVAPD. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168
48 MOVAPS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170
49 MOVD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173
50 MOVDDUP. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176
51 MOVDQ2Q . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178
52 MOVDQA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180
53 MOVDQU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182
54 MOVHLPS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184
55 MOVHPD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186
56 MOVHPS. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188
57 MOVLHPS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190
58 MOVLPD. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
59 MOVLPS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194
60 MOVMSKPD. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196
61 MOVMSKPS. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198
62 MOVNTDQ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200
63 MOVNTPD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
64 MOVNTPS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204
65 MOVQ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206
66 MOVQ2DQ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208
67 MOVSD. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210
68 MOVSHDUP. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213
69 MOVSLDUP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215
70 MOVSS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217
72 PEXTRW. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284
73 PINSRW . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286
75 PSHUFD. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314
76 PSHUFHW . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317
77 PSHUFLW . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320
78 PSLLD. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323
79 PSLLDQ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 326
80 PSLLQ. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328
81 PSLLW . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 330
82 PSRAD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333
83 PSRAW . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336
84 PSRLD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 339
85 PSRLDQ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 342
86 PSRLQ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 344
87 PSRLW . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 347
89 SHUFPD. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 392
90 SHUFPS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 395
91 STMXCSR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 410
92 UCOMISD. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 424
93 UCOMISS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 427
94 UNPCKHPD. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 430
95 UNPCKHPS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 432
96 UNPCKLPD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 434
97 UNPCKLPS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 436
101 (declaim (optimize (debug 3)))
103 (defun emit-ops (ops)
104 (loop for op in ops
105 collect `(emit-byte segment ,op) into result
106 finally (return result)))
109 (defun gen-ops (&optional (stream t))
111 ;;; instructions like:
112 ;;; ADDPS xmm1, xmm2/mem128 0F 58 /r
113 (loop for (inst . ops) in
115 ;; single precision float
116 (addps #x0F #x58)
117 (addsubps #xF2 #x0F #xD0)
118 (andnps #x0F #x55)
119 (andps #x0F #x54)
120 (divps #x0F #x5E)
121 (maxps #x0F #x5F)
122 (minps #x0F #x5D)
123 (mulps #x0F #x59)
124 (orps #x0F #x56)
125 (rcpps #x0F #x53)
126 (rsqrtps #x0F #x52)
127 (sqrtps #x0F #x51)
128 (subps #x0F #x5C)
129 (xorps #x0F #x57)
131 ;; double precision float
132 (addpd #x66 #x0F #x58)
133 (addsubpd #x66 #x0F #xD0)
134 (andnpd #x66 #x0F #x55)
135 (andpd #x66 #x0F #x54)
136 (divpd #x66 #x0F #x5E)
137 (maxpd #x66 #x0F #x5F)
138 (minpd #x66 #x0F #x5D)
139 (mulpd #x66 #x0F #x59)
140 (orps #x66 #x0F #x56)
141 (sqrtpd #x66 #x0F #x51)
142 (subpd #x66 #x0F #x5C)
143 (xorpd #x66 #x0F #x57)
145 ;; scalar double precision float
146 (addsd #xF2 #x0F #x58)
147 (divsd #xF2 #x0F #x5E)
148 (maxsd #xF2 #x0F #x5F)
149 (minsd #xF2 #x0F #x5D)
150 (mulsd #xF2 #x0F #x59)
151 (sqrtsd #xF2 #x0F #x51)
152 (subsd #xF2 #x0F #x5C)
154 ;; scalar single precision float
155 (addss #xF3 #x0F #x58)
156 (divss #xF3 #x0F #x5E)
157 (maxss #xF3 #x0F #x5F)
158 (minss #xF3 #x0F #x5D)
159 (mulss #xF3 #x0F #x59)
160 (rcpss #xF3 #x0F #x53)
161 (rsqrtss #xF3 #x0F #x52)
162 (sqrtss #xF3 #x0F #x51)
163 (subss #xF3 #x0F #x5C)
165 ;; packed integer
166 (packssdw #x66 #x0F #x6B)
167 (packsswb #x66 #x0F #x63)
168 (packuswb #x66 #x0F #x67)
170 (paddb #x66 #x0F #xFC)
171 (paddd #x66 #x0F #xFE)
172 (paddq #x66 #x0F #xD4)
173 (paddsb #x66 #x0F #xEC)
174 (paddsw #x66 #x0F #xED)
175 (paddusb #x66 #x0F #xDC)
176 (paddusw #x66 #x0F #xDD)
177 (paddw #x66 #x0F #xFD)
179 (pand #x66 #x0F #xDB)
180 (pandn #x66 #x0F #xDF)
182 (pavgb #x66 #x0F #xE0)
183 (pavgw #x66 #x0F #xE3)
185 (pcmpeqb #x66 #x0F #x74)
186 (pcmpeqd #x66 #x0F #x76)
187 (pcmpeqw #x66 #x0F #x75)
188 (pcmpgtb #x66 #x0F #x64)
189 (pcmpgtd #x66 #x0F #x66)
190 (pcmpgtw #x66 #x0F #x65)
192 (pmaddwd #x66 #x0F #xF5)
194 (pmaxsw #x66 #x0F #xEE)
195 (pmaxub #x66 #x0F #xDE)
197 (pminsw #x66 #x0F #xEA)
198 (pminub #x66 #x0F #xDA)
200 (pmovmskb #x66 #x0F #xD7)
202 (pmulhuw #x66 #x0F #xE4)
203 (pmulhw #x66 #x0F #xE5)
204 (pmullw #x66 #x0F #xD5)
205 (pmuludq #x66 #x0F #xF4)
207 (por #x66 #x0F #xEB)
209 (psadbw #x66 #x0F #xF6)
210 (pssld #x66 #x0F #xF2)
211 (psllq #x66 #x0F #xF3)
212 (psllw #x66 #x0F #xF1)
213 (psrad #x66 #x0F #xE2)
214 (psraw #x66 #x0F #xE2)
215 (psrld #x66 #x0F #xD2)
216 (psrlq #x66 #x0F #xD3)
217 (psrlw #x66 #x0F #xD1)
219 (psubb #x66 #x0F #xF8)
220 (psubd #x66 #x0F #xFA)
221 (psubq #x66 #x0F #xFB)
222 (psubsb #x66 #x0F #xE8)
223 (psubsw #x66 #x0F #xE9)
224 (psubusb #x66 #x0F #xD8)
225 (psubusw #x66 #x0F #xD9)
226 (psubw #x66 #x0F #xF9)
228 (punpckhbw #x66 #x0F #x68)
229 (punpckhdq #x66 #x0F #x6A)
230 (punpckhqdq #x66 #x0F #x6D)
231 (punpckhwd #x66 #x0F #x69)
232 (punpcklbw #x66 #x0F #x60)
233 (punpckldq #x66 #x0F #x62)
234 (punpcklqdq #x66 #x0F #x6C)
235 (punpcklwd #x66 #x0F #x61)
237 (pxor #x66 #x0F #xEF)
241 (format stream "~S~%~%"
242 `(define-instruction ,(intern (symbol-name inst)) (segment dst src)
243 (:emitter
244 ,@(emit-ops ops)
245 (emit-ea segment src (reg-tn-encoding dst))))))
247 ;; MOVUPS
248 (loop for (inst ops-m2r ops-r2m) in
250 (movups (#x0F #x10) (#x0F #x11))
251 (movupd (#x66 #x0F #x10) (#x66 #x0F #x11)))
253 (format stream "~S~%~%"
254 `(define-instruction ,(intern (symbol-name inst)) (segment dst src)
255 (:emitter
256 (cond ((sse-register-p dst)
257 ,@(emit-ops ops-m2r)
258 (emit-ea segment src (reg-tn-encoding dst)))
259 (t ,@(emit-ops ops-r2m)
260 (emit-ea segment dst (reg-tn-encoding src)))))))))
262 (defun gen-ops-to-file (filename)
263 (with-open-file (stream filename :direction :output :if-exists :supersede)
264 (gen-ops stream)))