5 http
://www.amd.com
/us-en
/assets
/content_type
/white_papers_and_tech_docs
/26568.pdf
10 FXRSTOR. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
121
11 FXSAVE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
124
13 LDMXCSR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
140
15 MOVDQ2Q . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
178
17 MOVQ2DQ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
208
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)))
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
52 (addsubps #xF2
#x0F
#xD0
)
56 (haddps #xF2
#x0F
#x7C
)
57 (hsubps #xF2
#x0F
#x7D
)
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
)
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
)
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
)
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
)
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
)
188 (cvtdq2pd #xF3
#x0F
#xE6
)
190 (cvtpd2dq #xF2
#x0F
#xE6
)
191 (cvtpd2pi #x66
#x0F
#x2D
)
192 (cvtpd2ps #x66
#x0F
#x5A
)
193 (cvtpi2pd #x66
#x0F
#x2A
)
195 (cvtps2dq #x66
#x0F
#x5B
)
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
)
212 (lddqu #xF2
#x0F
#xF0
)
213 (maskmovdqu #x66
#x0F
#xF7
)
214 (movddup #xF2
#x0F
#x12
)
217 (movmskpd #x66
#x0F
#x50
)
219 (movntdq #x66
#x0F
#XE7
)
220 (movntpd #x66
#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
)
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
)
248 (format stream
"~S~%~%"
249 `(define-instruction ,(intern (symbol-name inst
)) (segment dst src byte
)
252 (emit-ea segment src
(reg-tn-encoding dst
))
253 (emit-sized-immediate segment
:byte byte
)
257 (loop for
(inst . ops
) in
259 (cmppd #x66
#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
)
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
)
275 (:ne .
#b100
) (:nz .
#b100
)
276 (:nl .
#b101
) (:ge .
#b101
)
277 (:nle .
#b110
) (:g .
#b110
)
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
)
312 (cond ((sse-register-p dst
)
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
)