1// Code generated by command: avogen -output zctors.go ctors. DO NOT EDIT.
2
3package x86
4
5import (
6	"errors"
7
8	intrep "github.com/mmcloughlin/avo/ir"
9	"github.com/mmcloughlin/avo/operand"
10	"github.com/mmcloughlin/avo/reg"
11)
12
13// ADCB: Add with Carry.
14//
15// Forms:
16//
17// 	ADCB imm8 al
18// 	ADCB imm8 r8
19// 	ADCB r8   r8
20// 	ADCB m8   r8
21// 	ADCB imm8 m8
22// 	ADCB r8   m8
23func ADCB(imr, amr operand.Op) (*intrep.Instruction, error) {
24	switch {
25	case operand.IsIMM8(imr) && operand.IsAL(amr):
26		return &intrep.Instruction{
27			Opcode:   "ADCB",
28			Operands: []operand.Op{imr, amr},
29			Inputs:   []operand.Op{amr},
30			Outputs:  []operand.Op{amr},
31		}, nil
32	case operand.IsIMM8(imr) && operand.IsR8(amr):
33		return &intrep.Instruction{
34			Opcode:   "ADCB",
35			Operands: []operand.Op{imr, amr},
36			Inputs:   []operand.Op{amr},
37			Outputs:  []operand.Op{amr},
38		}, nil
39	case operand.IsR8(imr) && operand.IsR8(amr):
40		return &intrep.Instruction{
41			Opcode:   "ADCB",
42			Operands: []operand.Op{imr, amr},
43			Inputs:   []operand.Op{imr, amr},
44			Outputs:  []operand.Op{amr},
45		}, nil
46	case operand.IsM8(imr) && operand.IsR8(amr):
47		return &intrep.Instruction{
48			Opcode:   "ADCB",
49			Operands: []operand.Op{imr, amr},
50			Inputs:   []operand.Op{imr, amr},
51			Outputs:  []operand.Op{amr},
52		}, nil
53	case operand.IsIMM8(imr) && operand.IsM8(amr):
54		return &intrep.Instruction{
55			Opcode:   "ADCB",
56			Operands: []operand.Op{imr, amr},
57			Inputs:   []operand.Op{amr},
58			Outputs:  []operand.Op{amr},
59		}, nil
60	case operand.IsR8(imr) && operand.IsM8(amr):
61		return &intrep.Instruction{
62			Opcode:   "ADCB",
63			Operands: []operand.Op{imr, amr},
64			Inputs:   []operand.Op{imr, amr},
65			Outputs:  []operand.Op{amr},
66		}, nil
67	}
68	return nil, errors.New("ADCB: bad operands")
69}
70
71// ADCL: Add with Carry.
72//
73// Forms:
74//
75// 	ADCL imm32 eax
76// 	ADCL imm8  r32
77// 	ADCL imm32 r32
78// 	ADCL r32   r32
79// 	ADCL m32   r32
80// 	ADCL imm8  m32
81// 	ADCL imm32 m32
82// 	ADCL r32   m32
83func ADCL(imr, emr operand.Op) (*intrep.Instruction, error) {
84	switch {
85	case operand.IsIMM32(imr) && operand.IsEAX(emr):
86		return &intrep.Instruction{
87			Opcode:   "ADCL",
88			Operands: []operand.Op{imr, emr},
89			Inputs:   []operand.Op{emr},
90			Outputs:  []operand.Op{emr},
91		}, nil
92	case operand.IsIMM8(imr) && operand.IsR32(emr):
93		return &intrep.Instruction{
94			Opcode:   "ADCL",
95			Operands: []operand.Op{imr, emr},
96			Inputs:   []operand.Op{emr},
97			Outputs:  []operand.Op{emr},
98		}, nil
99	case operand.IsIMM32(imr) && operand.IsR32(emr):
100		return &intrep.Instruction{
101			Opcode:   "ADCL",
102			Operands: []operand.Op{imr, emr},
103			Inputs:   []operand.Op{emr},
104			Outputs:  []operand.Op{emr},
105		}, nil
106	case operand.IsR32(imr) && operand.IsR32(emr):
107		return &intrep.Instruction{
108			Opcode:   "ADCL",
109			Operands: []operand.Op{imr, emr},
110			Inputs:   []operand.Op{imr, emr},
111			Outputs:  []operand.Op{emr},
112		}, nil
113	case operand.IsM32(imr) && operand.IsR32(emr):
114		return &intrep.Instruction{
115			Opcode:   "ADCL",
116			Operands: []operand.Op{imr, emr},
117			Inputs:   []operand.Op{imr, emr},
118			Outputs:  []operand.Op{emr},
119		}, nil
120	case operand.IsIMM8(imr) && operand.IsM32(emr):
121		return &intrep.Instruction{
122			Opcode:   "ADCL",
123			Operands: []operand.Op{imr, emr},
124			Inputs:   []operand.Op{emr},
125			Outputs:  []operand.Op{emr},
126		}, nil
127	case operand.IsIMM32(imr) && operand.IsM32(emr):
128		return &intrep.Instruction{
129			Opcode:   "ADCL",
130			Operands: []operand.Op{imr, emr},
131			Inputs:   []operand.Op{emr},
132			Outputs:  []operand.Op{emr},
133		}, nil
134	case operand.IsR32(imr) && operand.IsM32(emr):
135		return &intrep.Instruction{
136			Opcode:   "ADCL",
137			Operands: []operand.Op{imr, emr},
138			Inputs:   []operand.Op{imr, emr},
139			Outputs:  []operand.Op{emr},
140		}, nil
141	}
142	return nil, errors.New("ADCL: bad operands")
143}
144
145// ADCQ: Add with Carry.
146//
147// Forms:
148//
149// 	ADCQ imm32 rax
150// 	ADCQ imm8  r64
151// 	ADCQ imm32 r64
152// 	ADCQ r64   r64
153// 	ADCQ m64   r64
154// 	ADCQ imm8  m64
155// 	ADCQ imm32 m64
156// 	ADCQ r64   m64
157func ADCQ(imr, mr operand.Op) (*intrep.Instruction, error) {
158	switch {
159	case operand.IsIMM32(imr) && operand.IsRAX(mr):
160		return &intrep.Instruction{
161			Opcode:   "ADCQ",
162			Operands: []operand.Op{imr, mr},
163			Inputs:   []operand.Op{mr},
164			Outputs:  []operand.Op{mr},
165		}, nil
166	case operand.IsIMM8(imr) && operand.IsR64(mr):
167		return &intrep.Instruction{
168			Opcode:   "ADCQ",
169			Operands: []operand.Op{imr, mr},
170			Inputs:   []operand.Op{mr},
171			Outputs:  []operand.Op{mr},
172		}, nil
173	case operand.IsIMM32(imr) && operand.IsR64(mr):
174		return &intrep.Instruction{
175			Opcode:   "ADCQ",
176			Operands: []operand.Op{imr, mr},
177			Inputs:   []operand.Op{mr},
178			Outputs:  []operand.Op{mr},
179		}, nil
180	case operand.IsR64(imr) && operand.IsR64(mr):
181		return &intrep.Instruction{
182			Opcode:   "ADCQ",
183			Operands: []operand.Op{imr, mr},
184			Inputs:   []operand.Op{imr, mr},
185			Outputs:  []operand.Op{mr},
186		}, nil
187	case operand.IsM64(imr) && operand.IsR64(mr):
188		return &intrep.Instruction{
189			Opcode:   "ADCQ",
190			Operands: []operand.Op{imr, mr},
191			Inputs:   []operand.Op{imr, mr},
192			Outputs:  []operand.Op{mr},
193		}, nil
194	case operand.IsIMM8(imr) && operand.IsM64(mr):
195		return &intrep.Instruction{
196			Opcode:   "ADCQ",
197			Operands: []operand.Op{imr, mr},
198			Inputs:   []operand.Op{mr},
199			Outputs:  []operand.Op{mr},
200		}, nil
201	case operand.IsIMM32(imr) && operand.IsM64(mr):
202		return &intrep.Instruction{
203			Opcode:   "ADCQ",
204			Operands: []operand.Op{imr, mr},
205			Inputs:   []operand.Op{mr},
206			Outputs:  []operand.Op{mr},
207		}, nil
208	case operand.IsR64(imr) && operand.IsM64(mr):
209		return &intrep.Instruction{
210			Opcode:   "ADCQ",
211			Operands: []operand.Op{imr, mr},
212			Inputs:   []operand.Op{imr, mr},
213			Outputs:  []operand.Op{mr},
214		}, nil
215	}
216	return nil, errors.New("ADCQ: bad operands")
217}
218
219// ADCW: Add with Carry.
220//
221// Forms:
222//
223// 	ADCW imm16 ax
224// 	ADCW imm8  r16
225// 	ADCW imm16 r16
226// 	ADCW r16   r16
227// 	ADCW m16   r16
228// 	ADCW imm8  m16
229// 	ADCW imm16 m16
230// 	ADCW r16   m16
231func ADCW(imr, amr operand.Op) (*intrep.Instruction, error) {
232	switch {
233	case operand.IsIMM16(imr) && operand.IsAX(amr):
234		return &intrep.Instruction{
235			Opcode:   "ADCW",
236			Operands: []operand.Op{imr, amr},
237			Inputs:   []operand.Op{amr},
238			Outputs:  []operand.Op{amr},
239		}, nil
240	case operand.IsIMM8(imr) && operand.IsR16(amr):
241		return &intrep.Instruction{
242			Opcode:   "ADCW",
243			Operands: []operand.Op{imr, amr},
244			Inputs:   []operand.Op{amr},
245			Outputs:  []operand.Op{amr},
246		}, nil
247	case operand.IsIMM16(imr) && operand.IsR16(amr):
248		return &intrep.Instruction{
249			Opcode:   "ADCW",
250			Operands: []operand.Op{imr, amr},
251			Inputs:   []operand.Op{amr},
252			Outputs:  []operand.Op{amr},
253		}, nil
254	case operand.IsR16(imr) && operand.IsR16(amr):
255		return &intrep.Instruction{
256			Opcode:   "ADCW",
257			Operands: []operand.Op{imr, amr},
258			Inputs:   []operand.Op{imr, amr},
259			Outputs:  []operand.Op{amr},
260		}, nil
261	case operand.IsM16(imr) && operand.IsR16(amr):
262		return &intrep.Instruction{
263			Opcode:   "ADCW",
264			Operands: []operand.Op{imr, amr},
265			Inputs:   []operand.Op{imr, amr},
266			Outputs:  []operand.Op{amr},
267		}, nil
268	case operand.IsIMM8(imr) && operand.IsM16(amr):
269		return &intrep.Instruction{
270			Opcode:   "ADCW",
271			Operands: []operand.Op{imr, amr},
272			Inputs:   []operand.Op{amr},
273			Outputs:  []operand.Op{amr},
274		}, nil
275	case operand.IsIMM16(imr) && operand.IsM16(amr):
276		return &intrep.Instruction{
277			Opcode:   "ADCW",
278			Operands: []operand.Op{imr, amr},
279			Inputs:   []operand.Op{amr},
280			Outputs:  []operand.Op{amr},
281		}, nil
282	case operand.IsR16(imr) && operand.IsM16(amr):
283		return &intrep.Instruction{
284			Opcode:   "ADCW",
285			Operands: []operand.Op{imr, amr},
286			Inputs:   []operand.Op{imr, amr},
287			Outputs:  []operand.Op{amr},
288		}, nil
289	}
290	return nil, errors.New("ADCW: bad operands")
291}
292
293// ADCXL: Unsigned Integer Addition of Two Operands with Carry Flag.
294//
295// Forms:
296//
297// 	ADCXL r32 r32
298// 	ADCXL m32 r32
299func ADCXL(mr, r operand.Op) (*intrep.Instruction, error) {
300	switch {
301	case operand.IsR32(mr) && operand.IsR32(r):
302		return &intrep.Instruction{
303			Opcode:   "ADCXL",
304			Operands: []operand.Op{mr, r},
305			Inputs:   []operand.Op{mr, r},
306			Outputs:  []operand.Op{r},
307			ISA:      []string{"ADX"},
308		}, nil
309	case operand.IsM32(mr) && operand.IsR32(r):
310		return &intrep.Instruction{
311			Opcode:   "ADCXL",
312			Operands: []operand.Op{mr, r},
313			Inputs:   []operand.Op{mr, r},
314			Outputs:  []operand.Op{r},
315			ISA:      []string{"ADX"},
316		}, nil
317	}
318	return nil, errors.New("ADCXL: bad operands")
319}
320
321// ADCXQ: Unsigned Integer Addition of Two Operands with Carry Flag.
322//
323// Forms:
324//
325// 	ADCXQ r64 r64
326// 	ADCXQ m64 r64
327func ADCXQ(mr, r operand.Op) (*intrep.Instruction, error) {
328	switch {
329	case operand.IsR64(mr) && operand.IsR64(r):
330		return &intrep.Instruction{
331			Opcode:   "ADCXQ",
332			Operands: []operand.Op{mr, r},
333			Inputs:   []operand.Op{mr, r},
334			Outputs:  []operand.Op{r},
335			ISA:      []string{"ADX"},
336		}, nil
337	case operand.IsM64(mr) && operand.IsR64(r):
338		return &intrep.Instruction{
339			Opcode:   "ADCXQ",
340			Operands: []operand.Op{mr, r},
341			Inputs:   []operand.Op{mr, r},
342			Outputs:  []operand.Op{r},
343			ISA:      []string{"ADX"},
344		}, nil
345	}
346	return nil, errors.New("ADCXQ: bad operands")
347}
348
349// ADDB: Add.
350//
351// Forms:
352//
353// 	ADDB imm8 al
354// 	ADDB imm8 r8
355// 	ADDB r8   r8
356// 	ADDB m8   r8
357// 	ADDB imm8 m8
358// 	ADDB r8   m8
359func ADDB(imr, amr operand.Op) (*intrep.Instruction, error) {
360	switch {
361	case operand.IsIMM8(imr) && operand.IsAL(amr):
362		return &intrep.Instruction{
363			Opcode:   "ADDB",
364			Operands: []operand.Op{imr, amr},
365			Inputs:   []operand.Op{amr},
366			Outputs:  []operand.Op{amr},
367		}, nil
368	case operand.IsIMM8(imr) && operand.IsR8(amr):
369		return &intrep.Instruction{
370			Opcode:   "ADDB",
371			Operands: []operand.Op{imr, amr},
372			Inputs:   []operand.Op{amr},
373			Outputs:  []operand.Op{amr},
374		}, nil
375	case operand.IsR8(imr) && operand.IsR8(amr):
376		return &intrep.Instruction{
377			Opcode:   "ADDB",
378			Operands: []operand.Op{imr, amr},
379			Inputs:   []operand.Op{imr, amr},
380			Outputs:  []operand.Op{amr},
381		}, nil
382	case operand.IsM8(imr) && operand.IsR8(amr):
383		return &intrep.Instruction{
384			Opcode:   "ADDB",
385			Operands: []operand.Op{imr, amr},
386			Inputs:   []operand.Op{imr, amr},
387			Outputs:  []operand.Op{amr},
388		}, nil
389	case operand.IsIMM8(imr) && operand.IsM8(amr):
390		return &intrep.Instruction{
391			Opcode:   "ADDB",
392			Operands: []operand.Op{imr, amr},
393			Inputs:   []operand.Op{amr},
394			Outputs:  []operand.Op{amr},
395		}, nil
396	case operand.IsR8(imr) && operand.IsM8(amr):
397		return &intrep.Instruction{
398			Opcode:   "ADDB",
399			Operands: []operand.Op{imr, amr},
400			Inputs:   []operand.Op{imr, amr},
401			Outputs:  []operand.Op{amr},
402		}, nil
403	}
404	return nil, errors.New("ADDB: bad operands")
405}
406
407// ADDL: Add.
408//
409// Forms:
410//
411// 	ADDL imm32 eax
412// 	ADDL imm8  r32
413// 	ADDL imm32 r32
414// 	ADDL r32   r32
415// 	ADDL m32   r32
416// 	ADDL imm8  m32
417// 	ADDL imm32 m32
418// 	ADDL r32   m32
419func ADDL(imr, emr operand.Op) (*intrep.Instruction, error) {
420	switch {
421	case operand.IsIMM32(imr) && operand.IsEAX(emr):
422		return &intrep.Instruction{
423			Opcode:   "ADDL",
424			Operands: []operand.Op{imr, emr},
425			Inputs:   []operand.Op{emr},
426			Outputs:  []operand.Op{emr},
427		}, nil
428	case operand.IsIMM8(imr) && operand.IsR32(emr):
429		return &intrep.Instruction{
430			Opcode:   "ADDL",
431			Operands: []operand.Op{imr, emr},
432			Inputs:   []operand.Op{emr},
433			Outputs:  []operand.Op{emr},
434		}, nil
435	case operand.IsIMM32(imr) && operand.IsR32(emr):
436		return &intrep.Instruction{
437			Opcode:   "ADDL",
438			Operands: []operand.Op{imr, emr},
439			Inputs:   []operand.Op{emr},
440			Outputs:  []operand.Op{emr},
441		}, nil
442	case operand.IsR32(imr) && operand.IsR32(emr):
443		return &intrep.Instruction{
444			Opcode:   "ADDL",
445			Operands: []operand.Op{imr, emr},
446			Inputs:   []operand.Op{imr, emr},
447			Outputs:  []operand.Op{emr},
448		}, nil
449	case operand.IsM32(imr) && operand.IsR32(emr):
450		return &intrep.Instruction{
451			Opcode:   "ADDL",
452			Operands: []operand.Op{imr, emr},
453			Inputs:   []operand.Op{imr, emr},
454			Outputs:  []operand.Op{emr},
455		}, nil
456	case operand.IsIMM8(imr) && operand.IsM32(emr):
457		return &intrep.Instruction{
458			Opcode:   "ADDL",
459			Operands: []operand.Op{imr, emr},
460			Inputs:   []operand.Op{emr},
461			Outputs:  []operand.Op{emr},
462		}, nil
463	case operand.IsIMM32(imr) && operand.IsM32(emr):
464		return &intrep.Instruction{
465			Opcode:   "ADDL",
466			Operands: []operand.Op{imr, emr},
467			Inputs:   []operand.Op{emr},
468			Outputs:  []operand.Op{emr},
469		}, nil
470	case operand.IsR32(imr) && operand.IsM32(emr):
471		return &intrep.Instruction{
472			Opcode:   "ADDL",
473			Operands: []operand.Op{imr, emr},
474			Inputs:   []operand.Op{imr, emr},
475			Outputs:  []operand.Op{emr},
476		}, nil
477	}
478	return nil, errors.New("ADDL: bad operands")
479}
480
481// ADDPD: Add Packed Double-Precision Floating-Point Values.
482//
483// Forms:
484//
485// 	ADDPD xmm  xmm
486// 	ADDPD m128 xmm
487func ADDPD(mx, x operand.Op) (*intrep.Instruction, error) {
488	switch {
489	case operand.IsXMM(mx) && operand.IsXMM(x):
490		return &intrep.Instruction{
491			Opcode:   "ADDPD",
492			Operands: []operand.Op{mx, x},
493			Inputs:   []operand.Op{mx, x},
494			Outputs:  []operand.Op{x},
495			ISA:      []string{"SSE2"},
496		}, nil
497	case operand.IsM128(mx) && operand.IsXMM(x):
498		return &intrep.Instruction{
499			Opcode:   "ADDPD",
500			Operands: []operand.Op{mx, x},
501			Inputs:   []operand.Op{mx, x},
502			Outputs:  []operand.Op{x},
503			ISA:      []string{"SSE2"},
504		}, nil
505	}
506	return nil, errors.New("ADDPD: bad operands")
507}
508
509// ADDPS: Add Packed Single-Precision Floating-Point Values.
510//
511// Forms:
512//
513// 	ADDPS xmm  xmm
514// 	ADDPS m128 xmm
515func ADDPS(mx, x operand.Op) (*intrep.Instruction, error) {
516	switch {
517	case operand.IsXMM(mx) && operand.IsXMM(x):
518		return &intrep.Instruction{
519			Opcode:   "ADDPS",
520			Operands: []operand.Op{mx, x},
521			Inputs:   []operand.Op{mx, x},
522			Outputs:  []operand.Op{x},
523			ISA:      []string{"SSE"},
524		}, nil
525	case operand.IsM128(mx) && operand.IsXMM(x):
526		return &intrep.Instruction{
527			Opcode:   "ADDPS",
528			Operands: []operand.Op{mx, x},
529			Inputs:   []operand.Op{mx, x},
530			Outputs:  []operand.Op{x},
531			ISA:      []string{"SSE"},
532		}, nil
533	}
534	return nil, errors.New("ADDPS: bad operands")
535}
536
537// ADDQ: Add.
538//
539// Forms:
540//
541// 	ADDQ imm32 rax
542// 	ADDQ imm8  r64
543// 	ADDQ imm32 r64
544// 	ADDQ r64   r64
545// 	ADDQ m64   r64
546// 	ADDQ imm8  m64
547// 	ADDQ imm32 m64
548// 	ADDQ r64   m64
549func ADDQ(imr, mr operand.Op) (*intrep.Instruction, error) {
550	switch {
551	case operand.IsIMM32(imr) && operand.IsRAX(mr):
552		return &intrep.Instruction{
553			Opcode:   "ADDQ",
554			Operands: []operand.Op{imr, mr},
555			Inputs:   []operand.Op{mr},
556			Outputs:  []operand.Op{mr},
557		}, nil
558	case operand.IsIMM8(imr) && operand.IsR64(mr):
559		return &intrep.Instruction{
560			Opcode:   "ADDQ",
561			Operands: []operand.Op{imr, mr},
562			Inputs:   []operand.Op{mr},
563			Outputs:  []operand.Op{mr},
564		}, nil
565	case operand.IsIMM32(imr) && operand.IsR64(mr):
566		return &intrep.Instruction{
567			Opcode:   "ADDQ",
568			Operands: []operand.Op{imr, mr},
569			Inputs:   []operand.Op{mr},
570			Outputs:  []operand.Op{mr},
571		}, nil
572	case operand.IsR64(imr) && operand.IsR64(mr):
573		return &intrep.Instruction{
574			Opcode:   "ADDQ",
575			Operands: []operand.Op{imr, mr},
576			Inputs:   []operand.Op{imr, mr},
577			Outputs:  []operand.Op{mr},
578		}, nil
579	case operand.IsM64(imr) && operand.IsR64(mr):
580		return &intrep.Instruction{
581			Opcode:   "ADDQ",
582			Operands: []operand.Op{imr, mr},
583			Inputs:   []operand.Op{imr, mr},
584			Outputs:  []operand.Op{mr},
585		}, nil
586	case operand.IsIMM8(imr) && operand.IsM64(mr):
587		return &intrep.Instruction{
588			Opcode:   "ADDQ",
589			Operands: []operand.Op{imr, mr},
590			Inputs:   []operand.Op{mr},
591			Outputs:  []operand.Op{mr},
592		}, nil
593	case operand.IsIMM32(imr) && operand.IsM64(mr):
594		return &intrep.Instruction{
595			Opcode:   "ADDQ",
596			Operands: []operand.Op{imr, mr},
597			Inputs:   []operand.Op{mr},
598			Outputs:  []operand.Op{mr},
599		}, nil
600	case operand.IsR64(imr) && operand.IsM64(mr):
601		return &intrep.Instruction{
602			Opcode:   "ADDQ",
603			Operands: []operand.Op{imr, mr},
604			Inputs:   []operand.Op{imr, mr},
605			Outputs:  []operand.Op{mr},
606		}, nil
607	}
608	return nil, errors.New("ADDQ: bad operands")
609}
610
611// ADDSD: Add Scalar Double-Precision Floating-Point Values.
612//
613// Forms:
614//
615// 	ADDSD xmm xmm
616// 	ADDSD m64 xmm
617func ADDSD(mx, x operand.Op) (*intrep.Instruction, error) {
618	switch {
619	case operand.IsXMM(mx) && operand.IsXMM(x):
620		return &intrep.Instruction{
621			Opcode:   "ADDSD",
622			Operands: []operand.Op{mx, x},
623			Inputs:   []operand.Op{mx, x},
624			Outputs:  []operand.Op{x},
625			ISA:      []string{"SSE2"},
626		}, nil
627	case operand.IsM64(mx) && operand.IsXMM(x):
628		return &intrep.Instruction{
629			Opcode:   "ADDSD",
630			Operands: []operand.Op{mx, x},
631			Inputs:   []operand.Op{mx, x},
632			Outputs:  []operand.Op{x},
633			ISA:      []string{"SSE2"},
634		}, nil
635	}
636	return nil, errors.New("ADDSD: bad operands")
637}
638
639// ADDSS: Add Scalar Single-Precision Floating-Point Values.
640//
641// Forms:
642//
643// 	ADDSS xmm xmm
644// 	ADDSS m32 xmm
645func ADDSS(mx, x operand.Op) (*intrep.Instruction, error) {
646	switch {
647	case operand.IsXMM(mx) && operand.IsXMM(x):
648		return &intrep.Instruction{
649			Opcode:   "ADDSS",
650			Operands: []operand.Op{mx, x},
651			Inputs:   []operand.Op{mx, x},
652			Outputs:  []operand.Op{x},
653			ISA:      []string{"SSE"},
654		}, nil
655	case operand.IsM32(mx) && operand.IsXMM(x):
656		return &intrep.Instruction{
657			Opcode:   "ADDSS",
658			Operands: []operand.Op{mx, x},
659			Inputs:   []operand.Op{mx, x},
660			Outputs:  []operand.Op{x},
661			ISA:      []string{"SSE"},
662		}, nil
663	}
664	return nil, errors.New("ADDSS: bad operands")
665}
666
667// ADDSUBPD: Packed Double-FP Add/Subtract.
668//
669// Forms:
670//
671// 	ADDSUBPD xmm  xmm
672// 	ADDSUBPD m128 xmm
673func ADDSUBPD(mx, x operand.Op) (*intrep.Instruction, error) {
674	switch {
675	case operand.IsXMM(mx) && operand.IsXMM(x):
676		return &intrep.Instruction{
677			Opcode:   "ADDSUBPD",
678			Operands: []operand.Op{mx, x},
679			Inputs:   []operand.Op{mx, x},
680			Outputs:  []operand.Op{x},
681			ISA:      []string{"SSE3"},
682		}, nil
683	case operand.IsM128(mx) && operand.IsXMM(x):
684		return &intrep.Instruction{
685			Opcode:   "ADDSUBPD",
686			Operands: []operand.Op{mx, x},
687			Inputs:   []operand.Op{mx, x},
688			Outputs:  []operand.Op{x},
689			ISA:      []string{"SSE3"},
690		}, nil
691	}
692	return nil, errors.New("ADDSUBPD: bad operands")
693}
694
695// ADDSUBPS: Packed Single-FP Add/Subtract.
696//
697// Forms:
698//
699// 	ADDSUBPS xmm  xmm
700// 	ADDSUBPS m128 xmm
701func ADDSUBPS(mx, x operand.Op) (*intrep.Instruction, error) {
702	switch {
703	case operand.IsXMM(mx) && operand.IsXMM(x):
704		return &intrep.Instruction{
705			Opcode:   "ADDSUBPS",
706			Operands: []operand.Op{mx, x},
707			Inputs:   []operand.Op{mx, x},
708			Outputs:  []operand.Op{x},
709			ISA:      []string{"SSE3"},
710		}, nil
711	case operand.IsM128(mx) && operand.IsXMM(x):
712		return &intrep.Instruction{
713			Opcode:   "ADDSUBPS",
714			Operands: []operand.Op{mx, x},
715			Inputs:   []operand.Op{mx, x},
716			Outputs:  []operand.Op{x},
717			ISA:      []string{"SSE3"},
718		}, nil
719	}
720	return nil, errors.New("ADDSUBPS: bad operands")
721}
722
723// ADDW: Add.
724//
725// Forms:
726//
727// 	ADDW imm16 ax
728// 	ADDW imm8  r16
729// 	ADDW imm16 r16
730// 	ADDW r16   r16
731// 	ADDW m16   r16
732// 	ADDW imm8  m16
733// 	ADDW imm16 m16
734// 	ADDW r16   m16
735func ADDW(imr, amr operand.Op) (*intrep.Instruction, error) {
736	switch {
737	case operand.IsIMM16(imr) && operand.IsAX(amr):
738		return &intrep.Instruction{
739			Opcode:   "ADDW",
740			Operands: []operand.Op{imr, amr},
741			Inputs:   []operand.Op{amr},
742			Outputs:  []operand.Op{amr},
743		}, nil
744	case operand.IsIMM8(imr) && operand.IsR16(amr):
745		return &intrep.Instruction{
746			Opcode:   "ADDW",
747			Operands: []operand.Op{imr, amr},
748			Inputs:   []operand.Op{amr},
749			Outputs:  []operand.Op{amr},
750		}, nil
751	case operand.IsIMM16(imr) && operand.IsR16(amr):
752		return &intrep.Instruction{
753			Opcode:   "ADDW",
754			Operands: []operand.Op{imr, amr},
755			Inputs:   []operand.Op{amr},
756			Outputs:  []operand.Op{amr},
757		}, nil
758	case operand.IsR16(imr) && operand.IsR16(amr):
759		return &intrep.Instruction{
760			Opcode:   "ADDW",
761			Operands: []operand.Op{imr, amr},
762			Inputs:   []operand.Op{imr, amr},
763			Outputs:  []operand.Op{amr},
764		}, nil
765	case operand.IsM16(imr) && operand.IsR16(amr):
766		return &intrep.Instruction{
767			Opcode:   "ADDW",
768			Operands: []operand.Op{imr, amr},
769			Inputs:   []operand.Op{imr, amr},
770			Outputs:  []operand.Op{amr},
771		}, nil
772	case operand.IsIMM8(imr) && operand.IsM16(amr):
773		return &intrep.Instruction{
774			Opcode:   "ADDW",
775			Operands: []operand.Op{imr, amr},
776			Inputs:   []operand.Op{amr},
777			Outputs:  []operand.Op{amr},
778		}, nil
779	case operand.IsIMM16(imr) && operand.IsM16(amr):
780		return &intrep.Instruction{
781			Opcode:   "ADDW",
782			Operands: []operand.Op{imr, amr},
783			Inputs:   []operand.Op{amr},
784			Outputs:  []operand.Op{amr},
785		}, nil
786	case operand.IsR16(imr) && operand.IsM16(amr):
787		return &intrep.Instruction{
788			Opcode:   "ADDW",
789			Operands: []operand.Op{imr, amr},
790			Inputs:   []operand.Op{imr, amr},
791			Outputs:  []operand.Op{amr},
792		}, nil
793	}
794	return nil, errors.New("ADDW: bad operands")
795}
796
797// ADOXL: Unsigned Integer Addition of Two Operands with Overflow Flag.
798//
799// Forms:
800//
801// 	ADOXL r32 r32
802// 	ADOXL m32 r32
803func ADOXL(mr, r operand.Op) (*intrep.Instruction, error) {
804	switch {
805	case operand.IsR32(mr) && operand.IsR32(r):
806		return &intrep.Instruction{
807			Opcode:   "ADOXL",
808			Operands: []operand.Op{mr, r},
809			Inputs:   []operand.Op{mr, r},
810			Outputs:  []operand.Op{r},
811			ISA:      []string{"ADX"},
812		}, nil
813	case operand.IsM32(mr) && operand.IsR32(r):
814		return &intrep.Instruction{
815			Opcode:   "ADOXL",
816			Operands: []operand.Op{mr, r},
817			Inputs:   []operand.Op{mr, r},
818			Outputs:  []operand.Op{r},
819			ISA:      []string{"ADX"},
820		}, nil
821	}
822	return nil, errors.New("ADOXL: bad operands")
823}
824
825// ADOXQ: Unsigned Integer Addition of Two Operands with Overflow Flag.
826//
827// Forms:
828//
829// 	ADOXQ r64 r64
830// 	ADOXQ m64 r64
831func ADOXQ(mr, r operand.Op) (*intrep.Instruction, error) {
832	switch {
833	case operand.IsR64(mr) && operand.IsR64(r):
834		return &intrep.Instruction{
835			Opcode:   "ADOXQ",
836			Operands: []operand.Op{mr, r},
837			Inputs:   []operand.Op{mr, r},
838			Outputs:  []operand.Op{r},
839			ISA:      []string{"ADX"},
840		}, nil
841	case operand.IsM64(mr) && operand.IsR64(r):
842		return &intrep.Instruction{
843			Opcode:   "ADOXQ",
844			Operands: []operand.Op{mr, r},
845			Inputs:   []operand.Op{mr, r},
846			Outputs:  []operand.Op{r},
847			ISA:      []string{"ADX"},
848		}, nil
849	}
850	return nil, errors.New("ADOXQ: bad operands")
851}
852
853// AESDEC: Perform One Round of an AES Decryption Flow.
854//
855// Forms:
856//
857// 	AESDEC xmm  xmm
858// 	AESDEC m128 xmm
859func AESDEC(mx, x operand.Op) (*intrep.Instruction, error) {
860	switch {
861	case operand.IsXMM(mx) && operand.IsXMM(x):
862		return &intrep.Instruction{
863			Opcode:   "AESDEC",
864			Operands: []operand.Op{mx, x},
865			Inputs:   []operand.Op{mx},
866			Outputs:  []operand.Op{x},
867			ISA:      []string{"AES"},
868		}, nil
869	case operand.IsM128(mx) && operand.IsXMM(x):
870		return &intrep.Instruction{
871			Opcode:   "AESDEC",
872			Operands: []operand.Op{mx, x},
873			Inputs:   []operand.Op{mx},
874			Outputs:  []operand.Op{x},
875			ISA:      []string{"AES"},
876		}, nil
877	}
878	return nil, errors.New("AESDEC: bad operands")
879}
880
881// AESDECLAST: Perform Last Round of an AES Decryption Flow.
882//
883// Forms:
884//
885// 	AESDECLAST xmm  xmm
886// 	AESDECLAST m128 xmm
887func AESDECLAST(mx, x operand.Op) (*intrep.Instruction, error) {
888	switch {
889	case operand.IsXMM(mx) && operand.IsXMM(x):
890		return &intrep.Instruction{
891			Opcode:   "AESDECLAST",
892			Operands: []operand.Op{mx, x},
893			Inputs:   []operand.Op{mx},
894			Outputs:  []operand.Op{x},
895			ISA:      []string{"AES"},
896		}, nil
897	case operand.IsM128(mx) && operand.IsXMM(x):
898		return &intrep.Instruction{
899			Opcode:   "AESDECLAST",
900			Operands: []operand.Op{mx, x},
901			Inputs:   []operand.Op{mx},
902			Outputs:  []operand.Op{x},
903			ISA:      []string{"AES"},
904		}, nil
905	}
906	return nil, errors.New("AESDECLAST: bad operands")
907}
908
909// AESENC: Perform One Round of an AES Encryption Flow.
910//
911// Forms:
912//
913// 	AESENC xmm  xmm
914// 	AESENC m128 xmm
915func AESENC(mx, x operand.Op) (*intrep.Instruction, error) {
916	switch {
917	case operand.IsXMM(mx) && operand.IsXMM(x):
918		return &intrep.Instruction{
919			Opcode:   "AESENC",
920			Operands: []operand.Op{mx, x},
921			Inputs:   []operand.Op{mx, x},
922			Outputs:  []operand.Op{x},
923			ISA:      []string{"AES"},
924		}, nil
925	case operand.IsM128(mx) && operand.IsXMM(x):
926		return &intrep.Instruction{
927			Opcode:   "AESENC",
928			Operands: []operand.Op{mx, x},
929			Inputs:   []operand.Op{mx, x},
930			Outputs:  []operand.Op{x},
931			ISA:      []string{"AES"},
932		}, nil
933	}
934	return nil, errors.New("AESENC: bad operands")
935}
936
937// AESENCLAST: Perform Last Round of an AES Encryption Flow.
938//
939// Forms:
940//
941// 	AESENCLAST xmm  xmm
942// 	AESENCLAST m128 xmm
943func AESENCLAST(mx, x operand.Op) (*intrep.Instruction, error) {
944	switch {
945	case operand.IsXMM(mx) && operand.IsXMM(x):
946		return &intrep.Instruction{
947			Opcode:   "AESENCLAST",
948			Operands: []operand.Op{mx, x},
949			Inputs:   []operand.Op{mx, x},
950			Outputs:  []operand.Op{x},
951			ISA:      []string{"AES"},
952		}, nil
953	case operand.IsM128(mx) && operand.IsXMM(x):
954		return &intrep.Instruction{
955			Opcode:   "AESENCLAST",
956			Operands: []operand.Op{mx, x},
957			Inputs:   []operand.Op{mx, x},
958			Outputs:  []operand.Op{x},
959			ISA:      []string{"AES"},
960		}, nil
961	}
962	return nil, errors.New("AESENCLAST: bad operands")
963}
964
965// AESIMC: Perform the AES InvMixColumn Transformation.
966//
967// Forms:
968//
969// 	AESIMC xmm  xmm
970// 	AESIMC m128 xmm
971func AESIMC(mx, x operand.Op) (*intrep.Instruction, error) {
972	switch {
973	case operand.IsXMM(mx) && operand.IsXMM(x):
974		return &intrep.Instruction{
975			Opcode:   "AESIMC",
976			Operands: []operand.Op{mx, x},
977			Inputs:   []operand.Op{mx},
978			Outputs:  []operand.Op{x},
979			ISA:      []string{"AES"},
980		}, nil
981	case operand.IsM128(mx) && operand.IsXMM(x):
982		return &intrep.Instruction{
983			Opcode:   "AESIMC",
984			Operands: []operand.Op{mx, x},
985			Inputs:   []operand.Op{mx},
986			Outputs:  []operand.Op{x},
987			ISA:      []string{"AES"},
988		}, nil
989	}
990	return nil, errors.New("AESIMC: bad operands")
991}
992
993// AESKEYGENASSIST: AES Round Key Generation Assist.
994//
995// Forms:
996//
997// 	AESKEYGENASSIST imm8 xmm  xmm
998// 	AESKEYGENASSIST imm8 m128 xmm
999func AESKEYGENASSIST(i, mx, x operand.Op) (*intrep.Instruction, error) {
1000	switch {
1001	case operand.IsIMM8(i) && operand.IsXMM(mx) && operand.IsXMM(x):
1002		return &intrep.Instruction{
1003			Opcode:   "AESKEYGENASSIST",
1004			Operands: []operand.Op{i, mx, x},
1005			Inputs:   []operand.Op{mx},
1006			Outputs:  []operand.Op{x},
1007			ISA:      []string{"AES"},
1008		}, nil
1009	case operand.IsIMM8(i) && operand.IsM128(mx) && operand.IsXMM(x):
1010		return &intrep.Instruction{
1011			Opcode:   "AESKEYGENASSIST",
1012			Operands: []operand.Op{i, mx, x},
1013			Inputs:   []operand.Op{mx},
1014			Outputs:  []operand.Op{x},
1015			ISA:      []string{"AES"},
1016		}, nil
1017	}
1018	return nil, errors.New("AESKEYGENASSIST: bad operands")
1019}
1020
1021// ANDB: Logical AND.
1022//
1023// Forms:
1024//
1025// 	ANDB imm8 al
1026// 	ANDB imm8 r8
1027// 	ANDB r8   r8
1028// 	ANDB m8   r8
1029// 	ANDB imm8 m8
1030// 	ANDB r8   m8
1031func ANDB(imr, amr operand.Op) (*intrep.Instruction, error) {
1032	switch {
1033	case operand.IsIMM8(imr) && operand.IsAL(amr):
1034		return &intrep.Instruction{
1035			Opcode:   "ANDB",
1036			Operands: []operand.Op{imr, amr},
1037			Inputs:   []operand.Op{amr},
1038			Outputs:  []operand.Op{amr},
1039		}, nil
1040	case operand.IsIMM8(imr) && operand.IsR8(amr):
1041		return &intrep.Instruction{
1042			Opcode:   "ANDB",
1043			Operands: []operand.Op{imr, amr},
1044			Inputs:   []operand.Op{amr},
1045			Outputs:  []operand.Op{amr},
1046		}, nil
1047	case operand.IsR8(imr) && operand.IsR8(amr):
1048		return &intrep.Instruction{
1049			Opcode:   "ANDB",
1050			Operands: []operand.Op{imr, amr},
1051			Inputs:   []operand.Op{imr, amr},
1052			Outputs:  []operand.Op{amr},
1053		}, nil
1054	case operand.IsM8(imr) && operand.IsR8(amr):
1055		return &intrep.Instruction{
1056			Opcode:   "ANDB",
1057			Operands: []operand.Op{imr, amr},
1058			Inputs:   []operand.Op{imr, amr},
1059			Outputs:  []operand.Op{amr},
1060		}, nil
1061	case operand.IsIMM8(imr) && operand.IsM8(amr):
1062		return &intrep.Instruction{
1063			Opcode:   "ANDB",
1064			Operands: []operand.Op{imr, amr},
1065			Inputs:   []operand.Op{amr},
1066			Outputs:  []operand.Op{amr},
1067		}, nil
1068	case operand.IsR8(imr) && operand.IsM8(amr):
1069		return &intrep.Instruction{
1070			Opcode:   "ANDB",
1071			Operands: []operand.Op{imr, amr},
1072			Inputs:   []operand.Op{imr, amr},
1073			Outputs:  []operand.Op{amr},
1074		}, nil
1075	}
1076	return nil, errors.New("ANDB: bad operands")
1077}
1078
1079// ANDL: Logical AND.
1080//
1081// Forms:
1082//
1083// 	ANDL imm32 eax
1084// 	ANDL imm8  r32
1085// 	ANDL imm32 r32
1086// 	ANDL r32   r32
1087// 	ANDL m32   r32
1088// 	ANDL imm8  m32
1089// 	ANDL imm32 m32
1090// 	ANDL r32   m32
1091func ANDL(imr, emr operand.Op) (*intrep.Instruction, error) {
1092	switch {
1093	case operand.IsIMM32(imr) && operand.IsEAX(emr):
1094		return &intrep.Instruction{
1095			Opcode:   "ANDL",
1096			Operands: []operand.Op{imr, emr},
1097			Inputs:   []operand.Op{emr},
1098			Outputs:  []operand.Op{emr},
1099		}, nil
1100	case operand.IsIMM8(imr) && operand.IsR32(emr):
1101		return &intrep.Instruction{
1102			Opcode:   "ANDL",
1103			Operands: []operand.Op{imr, emr},
1104			Inputs:   []operand.Op{emr},
1105			Outputs:  []operand.Op{emr},
1106		}, nil
1107	case operand.IsIMM32(imr) && operand.IsR32(emr):
1108		return &intrep.Instruction{
1109			Opcode:   "ANDL",
1110			Operands: []operand.Op{imr, emr},
1111			Inputs:   []operand.Op{emr},
1112			Outputs:  []operand.Op{emr},
1113		}, nil
1114	case operand.IsR32(imr) && operand.IsR32(emr):
1115		return &intrep.Instruction{
1116			Opcode:   "ANDL",
1117			Operands: []operand.Op{imr, emr},
1118			Inputs:   []operand.Op{imr, emr},
1119			Outputs:  []operand.Op{emr},
1120		}, nil
1121	case operand.IsM32(imr) && operand.IsR32(emr):
1122		return &intrep.Instruction{
1123			Opcode:   "ANDL",
1124			Operands: []operand.Op{imr, emr},
1125			Inputs:   []operand.Op{imr, emr},
1126			Outputs:  []operand.Op{emr},
1127		}, nil
1128	case operand.IsIMM8(imr) && operand.IsM32(emr):
1129		return &intrep.Instruction{
1130			Opcode:   "ANDL",
1131			Operands: []operand.Op{imr, emr},
1132			Inputs:   []operand.Op{emr},
1133			Outputs:  []operand.Op{emr},
1134		}, nil
1135	case operand.IsIMM32(imr) && operand.IsM32(emr):
1136		return &intrep.Instruction{
1137			Opcode:   "ANDL",
1138			Operands: []operand.Op{imr, emr},
1139			Inputs:   []operand.Op{emr},
1140			Outputs:  []operand.Op{emr},
1141		}, nil
1142	case operand.IsR32(imr) && operand.IsM32(emr):
1143		return &intrep.Instruction{
1144			Opcode:   "ANDL",
1145			Operands: []operand.Op{imr, emr},
1146			Inputs:   []operand.Op{imr, emr},
1147			Outputs:  []operand.Op{emr},
1148		}, nil
1149	}
1150	return nil, errors.New("ANDL: bad operands")
1151}
1152
1153// ANDNL: Logical AND NOT.
1154//
1155// Forms:
1156//
1157// 	ANDNL r32 r32 r32
1158// 	ANDNL m32 r32 r32
1159func ANDNL(mr, r, r1 operand.Op) (*intrep.Instruction, error) {
1160	switch {
1161	case operand.IsR32(mr) && operand.IsR32(r) && operand.IsR32(r1):
1162		return &intrep.Instruction{
1163			Opcode:           "ANDNL",
1164			Operands:         []operand.Op{mr, r, r1},
1165			Inputs:           []operand.Op{mr, r},
1166			Outputs:          []operand.Op{r1},
1167			ISA:              []string{"BMI"},
1168			CancellingInputs: true,
1169		}, nil
1170	case operand.IsM32(mr) && operand.IsR32(r) && operand.IsR32(r1):
1171		return &intrep.Instruction{
1172			Opcode:   "ANDNL",
1173			Operands: []operand.Op{mr, r, r1},
1174			Inputs:   []operand.Op{mr, r},
1175			Outputs:  []operand.Op{r1},
1176			ISA:      []string{"BMI"},
1177		}, nil
1178	}
1179	return nil, errors.New("ANDNL: bad operands")
1180}
1181
1182// ANDNPD: Bitwise Logical AND NOT of Packed Double-Precision Floating-Point Values.
1183//
1184// Forms:
1185//
1186// 	ANDNPD xmm  xmm
1187// 	ANDNPD m128 xmm
1188func ANDNPD(mx, x operand.Op) (*intrep.Instruction, error) {
1189	switch {
1190	case operand.IsXMM(mx) && operand.IsXMM(x):
1191		return &intrep.Instruction{
1192			Opcode:           "ANDNPD",
1193			Operands:         []operand.Op{mx, x},
1194			Inputs:           []operand.Op{mx, x},
1195			Outputs:          []operand.Op{x},
1196			ISA:              []string{"SSE2"},
1197			CancellingInputs: true,
1198		}, nil
1199	case operand.IsM128(mx) && operand.IsXMM(x):
1200		return &intrep.Instruction{
1201			Opcode:   "ANDNPD",
1202			Operands: []operand.Op{mx, x},
1203			Inputs:   []operand.Op{mx, x},
1204			Outputs:  []operand.Op{x},
1205			ISA:      []string{"SSE2"},
1206		}, nil
1207	}
1208	return nil, errors.New("ANDNPD: bad operands")
1209}
1210
1211// ANDNPS: Bitwise Logical AND NOT of Packed Single-Precision Floating-Point Values.
1212//
1213// Forms:
1214//
1215// 	ANDNPS xmm  xmm
1216// 	ANDNPS m128 xmm
1217func ANDNPS(mx, x operand.Op) (*intrep.Instruction, error) {
1218	switch {
1219	case operand.IsXMM(mx) && operand.IsXMM(x):
1220		return &intrep.Instruction{
1221			Opcode:           "ANDNPS",
1222			Operands:         []operand.Op{mx, x},
1223			Inputs:           []operand.Op{mx, x},
1224			Outputs:          []operand.Op{x},
1225			ISA:              []string{"SSE"},
1226			CancellingInputs: true,
1227		}, nil
1228	case operand.IsM128(mx) && operand.IsXMM(x):
1229		return &intrep.Instruction{
1230			Opcode:   "ANDNPS",
1231			Operands: []operand.Op{mx, x},
1232			Inputs:   []operand.Op{mx, x},
1233			Outputs:  []operand.Op{x},
1234			ISA:      []string{"SSE"},
1235		}, nil
1236	}
1237	return nil, errors.New("ANDNPS: bad operands")
1238}
1239
1240// ANDNQ: Logical AND NOT.
1241//
1242// Forms:
1243//
1244// 	ANDNQ r64 r64 r64
1245// 	ANDNQ m64 r64 r64
1246func ANDNQ(mr, r, r1 operand.Op) (*intrep.Instruction, error) {
1247	switch {
1248	case operand.IsR64(mr) && operand.IsR64(r) && operand.IsR64(r1):
1249		return &intrep.Instruction{
1250			Opcode:           "ANDNQ",
1251			Operands:         []operand.Op{mr, r, r1},
1252			Inputs:           []operand.Op{mr, r},
1253			Outputs:          []operand.Op{r1},
1254			ISA:              []string{"BMI"},
1255			CancellingInputs: true,
1256		}, nil
1257	case operand.IsM64(mr) && operand.IsR64(r) && operand.IsR64(r1):
1258		return &intrep.Instruction{
1259			Opcode:   "ANDNQ",
1260			Operands: []operand.Op{mr, r, r1},
1261			Inputs:   []operand.Op{mr, r},
1262			Outputs:  []operand.Op{r1},
1263			ISA:      []string{"BMI"},
1264		}, nil
1265	}
1266	return nil, errors.New("ANDNQ: bad operands")
1267}
1268
1269// ANDPD: Bitwise Logical AND of Packed Double-Precision Floating-Point Values.
1270//
1271// Forms:
1272//
1273// 	ANDPD xmm  xmm
1274// 	ANDPD m128 xmm
1275func ANDPD(mx, x operand.Op) (*intrep.Instruction, error) {
1276	switch {
1277	case operand.IsXMM(mx) && operand.IsXMM(x):
1278		return &intrep.Instruction{
1279			Opcode:   "ANDPD",
1280			Operands: []operand.Op{mx, x},
1281			Inputs:   []operand.Op{mx, x},
1282			Outputs:  []operand.Op{x},
1283			ISA:      []string{"SSE2"},
1284		}, nil
1285	case operand.IsM128(mx) && operand.IsXMM(x):
1286		return &intrep.Instruction{
1287			Opcode:   "ANDPD",
1288			Operands: []operand.Op{mx, x},
1289			Inputs:   []operand.Op{mx, x},
1290			Outputs:  []operand.Op{x},
1291			ISA:      []string{"SSE2"},
1292		}, nil
1293	}
1294	return nil, errors.New("ANDPD: bad operands")
1295}
1296
1297// ANDPS: Bitwise Logical AND of Packed Single-Precision Floating-Point Values.
1298//
1299// Forms:
1300//
1301// 	ANDPS xmm  xmm
1302// 	ANDPS m128 xmm
1303func ANDPS(mx, x operand.Op) (*intrep.Instruction, error) {
1304	switch {
1305	case operand.IsXMM(mx) && operand.IsXMM(x):
1306		return &intrep.Instruction{
1307			Opcode:   "ANDPS",
1308			Operands: []operand.Op{mx, x},
1309			Inputs:   []operand.Op{mx, x},
1310			Outputs:  []operand.Op{x},
1311			ISA:      []string{"SSE"},
1312		}, nil
1313	case operand.IsM128(mx) && operand.IsXMM(x):
1314		return &intrep.Instruction{
1315			Opcode:   "ANDPS",
1316			Operands: []operand.Op{mx, x},
1317			Inputs:   []operand.Op{mx, x},
1318			Outputs:  []operand.Op{x},
1319			ISA:      []string{"SSE"},
1320		}, nil
1321	}
1322	return nil, errors.New("ANDPS: bad operands")
1323}
1324
1325// ANDQ: Logical AND.
1326//
1327// Forms:
1328//
1329// 	ANDQ imm32 rax
1330// 	ANDQ imm8  r64
1331// 	ANDQ imm32 r64
1332// 	ANDQ r64   r64
1333// 	ANDQ m64   r64
1334// 	ANDQ imm8  m64
1335// 	ANDQ imm32 m64
1336// 	ANDQ r64   m64
1337func ANDQ(imr, mr operand.Op) (*intrep.Instruction, error) {
1338	switch {
1339	case operand.IsIMM32(imr) && operand.IsRAX(mr):
1340		return &intrep.Instruction{
1341			Opcode:   "ANDQ",
1342			Operands: []operand.Op{imr, mr},
1343			Inputs:   []operand.Op{mr},
1344			Outputs:  []operand.Op{mr},
1345		}, nil
1346	case operand.IsIMM8(imr) && operand.IsR64(mr):
1347		return &intrep.Instruction{
1348			Opcode:   "ANDQ",
1349			Operands: []operand.Op{imr, mr},
1350			Inputs:   []operand.Op{mr},
1351			Outputs:  []operand.Op{mr},
1352		}, nil
1353	case operand.IsIMM32(imr) && operand.IsR64(mr):
1354		return &intrep.Instruction{
1355			Opcode:   "ANDQ",
1356			Operands: []operand.Op{imr, mr},
1357			Inputs:   []operand.Op{mr},
1358			Outputs:  []operand.Op{mr},
1359		}, nil
1360	case operand.IsR64(imr) && operand.IsR64(mr):
1361		return &intrep.Instruction{
1362			Opcode:   "ANDQ",
1363			Operands: []operand.Op{imr, mr},
1364			Inputs:   []operand.Op{imr, mr},
1365			Outputs:  []operand.Op{mr},
1366		}, nil
1367	case operand.IsM64(imr) && operand.IsR64(mr):
1368		return &intrep.Instruction{
1369			Opcode:   "ANDQ",
1370			Operands: []operand.Op{imr, mr},
1371			Inputs:   []operand.Op{imr, mr},
1372			Outputs:  []operand.Op{mr},
1373		}, nil
1374	case operand.IsIMM8(imr) && operand.IsM64(mr):
1375		return &intrep.Instruction{
1376			Opcode:   "ANDQ",
1377			Operands: []operand.Op{imr, mr},
1378			Inputs:   []operand.Op{mr},
1379			Outputs:  []operand.Op{mr},
1380		}, nil
1381	case operand.IsIMM32(imr) && operand.IsM64(mr):
1382		return &intrep.Instruction{
1383			Opcode:   "ANDQ",
1384			Operands: []operand.Op{imr, mr},
1385			Inputs:   []operand.Op{mr},
1386			Outputs:  []operand.Op{mr},
1387		}, nil
1388	case operand.IsR64(imr) && operand.IsM64(mr):
1389		return &intrep.Instruction{
1390			Opcode:   "ANDQ",
1391			Operands: []operand.Op{imr, mr},
1392			Inputs:   []operand.Op{imr, mr},
1393			Outputs:  []operand.Op{mr},
1394		}, nil
1395	}
1396	return nil, errors.New("ANDQ: bad operands")
1397}
1398
1399// ANDW: Logical AND.
1400//
1401// Forms:
1402//
1403// 	ANDW imm16 ax
1404// 	ANDW imm8  r16
1405// 	ANDW imm16 r16
1406// 	ANDW r16   r16
1407// 	ANDW m16   r16
1408// 	ANDW imm8  m16
1409// 	ANDW imm16 m16
1410// 	ANDW r16   m16
1411func ANDW(imr, amr operand.Op) (*intrep.Instruction, error) {
1412	switch {
1413	case operand.IsIMM16(imr) && operand.IsAX(amr):
1414		return &intrep.Instruction{
1415			Opcode:   "ANDW",
1416			Operands: []operand.Op{imr, amr},
1417			Inputs:   []operand.Op{amr},
1418			Outputs:  []operand.Op{amr},
1419		}, nil
1420	case operand.IsIMM8(imr) && operand.IsR16(amr):
1421		return &intrep.Instruction{
1422			Opcode:   "ANDW",
1423			Operands: []operand.Op{imr, amr},
1424			Inputs:   []operand.Op{amr},
1425			Outputs:  []operand.Op{amr},
1426		}, nil
1427	case operand.IsIMM16(imr) && operand.IsR16(amr):
1428		return &intrep.Instruction{
1429			Opcode:   "ANDW",
1430			Operands: []operand.Op{imr, amr},
1431			Inputs:   []operand.Op{amr},
1432			Outputs:  []operand.Op{amr},
1433		}, nil
1434	case operand.IsR16(imr) && operand.IsR16(amr):
1435		return &intrep.Instruction{
1436			Opcode:   "ANDW",
1437			Operands: []operand.Op{imr, amr},
1438			Inputs:   []operand.Op{imr, amr},
1439			Outputs:  []operand.Op{amr},
1440		}, nil
1441	case operand.IsM16(imr) && operand.IsR16(amr):
1442		return &intrep.Instruction{
1443			Opcode:   "ANDW",
1444			Operands: []operand.Op{imr, amr},
1445			Inputs:   []operand.Op{imr, amr},
1446			Outputs:  []operand.Op{amr},
1447		}, nil
1448	case operand.IsIMM8(imr) && operand.IsM16(amr):
1449		return &intrep.Instruction{
1450			Opcode:   "ANDW",
1451			Operands: []operand.Op{imr, amr},
1452			Inputs:   []operand.Op{amr},
1453			Outputs:  []operand.Op{amr},
1454		}, nil
1455	case operand.IsIMM16(imr) && operand.IsM16(amr):
1456		return &intrep.Instruction{
1457			Opcode:   "ANDW",
1458			Operands: []operand.Op{imr, amr},
1459			Inputs:   []operand.Op{amr},
1460			Outputs:  []operand.Op{amr},
1461		}, nil
1462	case operand.IsR16(imr) && operand.IsM16(amr):
1463		return &intrep.Instruction{
1464			Opcode:   "ANDW",
1465			Operands: []operand.Op{imr, amr},
1466			Inputs:   []operand.Op{imr, amr},
1467			Outputs:  []operand.Op{amr},
1468		}, nil
1469	}
1470	return nil, errors.New("ANDW: bad operands")
1471}
1472
1473// BEXTRL: Bit Field Extract.
1474//
1475// Forms:
1476//
1477// 	BEXTRL r32 r32 r32
1478// 	BEXTRL r32 m32 r32
1479func BEXTRL(r, mr, r1 operand.Op) (*intrep.Instruction, error) {
1480	switch {
1481	case operand.IsR32(r) && operand.IsR32(mr) && operand.IsR32(r1):
1482		return &intrep.Instruction{
1483			Opcode:   "BEXTRL",
1484			Operands: []operand.Op{r, mr, r1},
1485			Inputs:   []operand.Op{r, mr},
1486			Outputs:  []operand.Op{r1},
1487			ISA:      []string{"BMI"},
1488		}, nil
1489	case operand.IsR32(r) && operand.IsM32(mr) && operand.IsR32(r1):
1490		return &intrep.Instruction{
1491			Opcode:   "BEXTRL",
1492			Operands: []operand.Op{r, mr, r1},
1493			Inputs:   []operand.Op{r, mr},
1494			Outputs:  []operand.Op{r1},
1495			ISA:      []string{"BMI"},
1496		}, nil
1497	}
1498	return nil, errors.New("BEXTRL: bad operands")
1499}
1500
1501// BEXTRQ: Bit Field Extract.
1502//
1503// Forms:
1504//
1505// 	BEXTRQ r64 r64 r64
1506// 	BEXTRQ r64 m64 r64
1507func BEXTRQ(r, mr, r1 operand.Op) (*intrep.Instruction, error) {
1508	switch {
1509	case operand.IsR64(r) && operand.IsR64(mr) && operand.IsR64(r1):
1510		return &intrep.Instruction{
1511			Opcode:   "BEXTRQ",
1512			Operands: []operand.Op{r, mr, r1},
1513			Inputs:   []operand.Op{r, mr},
1514			Outputs:  []operand.Op{r1},
1515			ISA:      []string{"BMI"},
1516		}, nil
1517	case operand.IsR64(r) && operand.IsM64(mr) && operand.IsR64(r1):
1518		return &intrep.Instruction{
1519			Opcode:   "BEXTRQ",
1520			Operands: []operand.Op{r, mr, r1},
1521			Inputs:   []operand.Op{r, mr},
1522			Outputs:  []operand.Op{r1},
1523			ISA:      []string{"BMI"},
1524		}, nil
1525	}
1526	return nil, errors.New("BEXTRQ: bad operands")
1527}
1528
1529// BLENDPD: Blend Packed Double Precision Floating-Point Values.
1530//
1531// Forms:
1532//
1533// 	BLENDPD imm8 xmm  xmm
1534// 	BLENDPD imm8 m128 xmm
1535func BLENDPD(i, mx, x operand.Op) (*intrep.Instruction, error) {
1536	switch {
1537	case operand.IsIMM8(i) && operand.IsXMM(mx) && operand.IsXMM(x):
1538		return &intrep.Instruction{
1539			Opcode:   "BLENDPD",
1540			Operands: []operand.Op{i, mx, x},
1541			Inputs:   []operand.Op{mx, x},
1542			Outputs:  []operand.Op{x},
1543			ISA:      []string{"SSE4.1"},
1544		}, nil
1545	case operand.IsIMM8(i) && operand.IsM128(mx) && operand.IsXMM(x):
1546		return &intrep.Instruction{
1547			Opcode:   "BLENDPD",
1548			Operands: []operand.Op{i, mx, x},
1549			Inputs:   []operand.Op{mx, x},
1550			Outputs:  []operand.Op{x},
1551			ISA:      []string{"SSE4.1"},
1552		}, nil
1553	}
1554	return nil, errors.New("BLENDPD: bad operands")
1555}
1556
1557// BLENDPS:  Blend Packed Single Precision Floating-Point Values.
1558//
1559// Forms:
1560//
1561// 	BLENDPS imm8 xmm  xmm
1562// 	BLENDPS imm8 m128 xmm
1563func BLENDPS(i, mx, x operand.Op) (*intrep.Instruction, error) {
1564	switch {
1565	case operand.IsIMM8(i) && operand.IsXMM(mx) && operand.IsXMM(x):
1566		return &intrep.Instruction{
1567			Opcode:   "BLENDPS",
1568			Operands: []operand.Op{i, mx, x},
1569			Inputs:   []operand.Op{mx, x},
1570			Outputs:  []operand.Op{x},
1571			ISA:      []string{"SSE4.1"},
1572		}, nil
1573	case operand.IsIMM8(i) && operand.IsM128(mx) && operand.IsXMM(x):
1574		return &intrep.Instruction{
1575			Opcode:   "BLENDPS",
1576			Operands: []operand.Op{i, mx, x},
1577			Inputs:   []operand.Op{mx, x},
1578			Outputs:  []operand.Op{x},
1579			ISA:      []string{"SSE4.1"},
1580		}, nil
1581	}
1582	return nil, errors.New("BLENDPS: bad operands")
1583}
1584
1585// BLENDVPD:  Variable Blend Packed Double Precision Floating-Point Values.
1586//
1587// Forms:
1588//
1589// 	BLENDVPD xmm0 xmm  xmm
1590// 	BLENDVPD xmm0 m128 xmm
1591func BLENDVPD(x, mx, x1 operand.Op) (*intrep.Instruction, error) {
1592	switch {
1593	case operand.IsXMM0(x) && operand.IsXMM(mx) && operand.IsXMM(x1):
1594		return &intrep.Instruction{
1595			Opcode:   "BLENDVPD",
1596			Operands: []operand.Op{x, mx, x1},
1597			Inputs:   []operand.Op{x, mx, x1},
1598			Outputs:  []operand.Op{x1},
1599			ISA:      []string{"SSE4.1"},
1600		}, nil
1601	case operand.IsXMM0(x) && operand.IsM128(mx) && operand.IsXMM(x1):
1602		return &intrep.Instruction{
1603			Opcode:   "BLENDVPD",
1604			Operands: []operand.Op{x, mx, x1},
1605			Inputs:   []operand.Op{x, mx, x1},
1606			Outputs:  []operand.Op{x1},
1607			ISA:      []string{"SSE4.1"},
1608		}, nil
1609	}
1610	return nil, errors.New("BLENDVPD: bad operands")
1611}
1612
1613// BLENDVPS:  Variable Blend Packed Single Precision Floating-Point Values.
1614//
1615// Forms:
1616//
1617// 	BLENDVPS xmm0 xmm  xmm
1618// 	BLENDVPS xmm0 m128 xmm
1619func BLENDVPS(x, mx, x1 operand.Op) (*intrep.Instruction, error) {
1620	switch {
1621	case operand.IsXMM0(x) && operand.IsXMM(mx) && operand.IsXMM(x1):
1622		return &intrep.Instruction{
1623			Opcode:   "BLENDVPS",
1624			Operands: []operand.Op{x, mx, x1},
1625			Inputs:   []operand.Op{x, mx, x1},
1626			Outputs:  []operand.Op{x1},
1627			ISA:      []string{"SSE4.1"},
1628		}, nil
1629	case operand.IsXMM0(x) && operand.IsM128(mx) && operand.IsXMM(x1):
1630		return &intrep.Instruction{
1631			Opcode:   "BLENDVPS",
1632			Operands: []operand.Op{x, mx, x1},
1633			Inputs:   []operand.Op{x, mx, x1},
1634			Outputs:  []operand.Op{x1},
1635			ISA:      []string{"SSE4.1"},
1636		}, nil
1637	}
1638	return nil, errors.New("BLENDVPS: bad operands")
1639}
1640
1641// BLSIL: Isolate Lowest Set Bit.
1642//
1643// Forms:
1644//
1645// 	BLSIL r32 r32
1646// 	BLSIL m32 r32
1647func BLSIL(mr, r operand.Op) (*intrep.Instruction, error) {
1648	switch {
1649	case operand.IsR32(mr) && operand.IsR32(r):
1650		return &intrep.Instruction{
1651			Opcode:   "BLSIL",
1652			Operands: []operand.Op{mr, r},
1653			Inputs:   []operand.Op{mr},
1654			Outputs:  []operand.Op{r},
1655			ISA:      []string{"BMI"},
1656		}, nil
1657	case operand.IsM32(mr) && operand.IsR32(r):
1658		return &intrep.Instruction{
1659			Opcode:   "BLSIL",
1660			Operands: []operand.Op{mr, r},
1661			Inputs:   []operand.Op{mr},
1662			Outputs:  []operand.Op{r},
1663			ISA:      []string{"BMI"},
1664		}, nil
1665	}
1666	return nil, errors.New("BLSIL: bad operands")
1667}
1668
1669// BLSIQ: Isolate Lowest Set Bit.
1670//
1671// Forms:
1672//
1673// 	BLSIQ r64 r64
1674// 	BLSIQ m64 r64
1675func BLSIQ(mr, r operand.Op) (*intrep.Instruction, error) {
1676	switch {
1677	case operand.IsR64(mr) && operand.IsR64(r):
1678		return &intrep.Instruction{
1679			Opcode:   "BLSIQ",
1680			Operands: []operand.Op{mr, r},
1681			Inputs:   []operand.Op{mr},
1682			Outputs:  []operand.Op{r},
1683			ISA:      []string{"BMI"},
1684		}, nil
1685	case operand.IsM64(mr) && operand.IsR64(r):
1686		return &intrep.Instruction{
1687			Opcode:   "BLSIQ",
1688			Operands: []operand.Op{mr, r},
1689			Inputs:   []operand.Op{mr},
1690			Outputs:  []operand.Op{r},
1691			ISA:      []string{"BMI"},
1692		}, nil
1693	}
1694	return nil, errors.New("BLSIQ: bad operands")
1695}
1696
1697// BLSMSKL: Mask From Lowest Set Bit.
1698//
1699// Forms:
1700//
1701// 	BLSMSKL r32 r32
1702// 	BLSMSKL m32 r32
1703func BLSMSKL(mr, r operand.Op) (*intrep.Instruction, error) {
1704	switch {
1705	case operand.IsR32(mr) && operand.IsR32(r):
1706		return &intrep.Instruction{
1707			Opcode:   "BLSMSKL",
1708			Operands: []operand.Op{mr, r},
1709			Inputs:   []operand.Op{mr},
1710			Outputs:  []operand.Op{r},
1711			ISA:      []string{"BMI"},
1712		}, nil
1713	case operand.IsM32(mr) && operand.IsR32(r):
1714		return &intrep.Instruction{
1715			Opcode:   "BLSMSKL",
1716			Operands: []operand.Op{mr, r},
1717			Inputs:   []operand.Op{mr},
1718			Outputs:  []operand.Op{r},
1719			ISA:      []string{"BMI"},
1720		}, nil
1721	}
1722	return nil, errors.New("BLSMSKL: bad operands")
1723}
1724
1725// BLSMSKQ: Mask From Lowest Set Bit.
1726//
1727// Forms:
1728//
1729// 	BLSMSKQ r64 r64
1730// 	BLSMSKQ m64 r64
1731func BLSMSKQ(mr, r operand.Op) (*intrep.Instruction, error) {
1732	switch {
1733	case operand.IsR64(mr) && operand.IsR64(r):
1734		return &intrep.Instruction{
1735			Opcode:   "BLSMSKQ",
1736			Operands: []operand.Op{mr, r},
1737			Inputs:   []operand.Op{mr},
1738			Outputs:  []operand.Op{r},
1739			ISA:      []string{"BMI"},
1740		}, nil
1741	case operand.IsM64(mr) && operand.IsR64(r):
1742		return &intrep.Instruction{
1743			Opcode:   "BLSMSKQ",
1744			Operands: []operand.Op{mr, r},
1745			Inputs:   []operand.Op{mr},
1746			Outputs:  []operand.Op{r},
1747			ISA:      []string{"BMI"},
1748		}, nil
1749	}
1750	return nil, errors.New("BLSMSKQ: bad operands")
1751}
1752
1753// BLSRL: Reset Lowest Set Bit.
1754//
1755// Forms:
1756//
1757// 	BLSRL r32 r32
1758// 	BLSRL m32 r32
1759func BLSRL(mr, r operand.Op) (*intrep.Instruction, error) {
1760	switch {
1761	case operand.IsR32(mr) && operand.IsR32(r):
1762		return &intrep.Instruction{
1763			Opcode:   "BLSRL",
1764			Operands: []operand.Op{mr, r},
1765			Inputs:   []operand.Op{mr},
1766			Outputs:  []operand.Op{r},
1767			ISA:      []string{"BMI"},
1768		}, nil
1769	case operand.IsM32(mr) && operand.IsR32(r):
1770		return &intrep.Instruction{
1771			Opcode:   "BLSRL",
1772			Operands: []operand.Op{mr, r},
1773			Inputs:   []operand.Op{mr},
1774			Outputs:  []operand.Op{r},
1775			ISA:      []string{"BMI"},
1776		}, nil
1777	}
1778	return nil, errors.New("BLSRL: bad operands")
1779}
1780
1781// BLSRQ: Reset Lowest Set Bit.
1782//
1783// Forms:
1784//
1785// 	BLSRQ r64 r64
1786// 	BLSRQ m64 r64
1787func BLSRQ(mr, r operand.Op) (*intrep.Instruction, error) {
1788	switch {
1789	case operand.IsR64(mr) && operand.IsR64(r):
1790		return &intrep.Instruction{
1791			Opcode:   "BLSRQ",
1792			Operands: []operand.Op{mr, r},
1793			Inputs:   []operand.Op{mr},
1794			Outputs:  []operand.Op{r},
1795			ISA:      []string{"BMI"},
1796		}, nil
1797	case operand.IsM64(mr) && operand.IsR64(r):
1798		return &intrep.Instruction{
1799			Opcode:   "BLSRQ",
1800			Operands: []operand.Op{mr, r},
1801			Inputs:   []operand.Op{mr},
1802			Outputs:  []operand.Op{r},
1803			ISA:      []string{"BMI"},
1804		}, nil
1805	}
1806	return nil, errors.New("BLSRQ: bad operands")
1807}
1808
1809// BSFL: Bit Scan Forward.
1810//
1811// Forms:
1812//
1813// 	BSFL r32 r32
1814// 	BSFL m32 r32
1815func BSFL(mr, r operand.Op) (*intrep.Instruction, error) {
1816	switch {
1817	case operand.IsR32(mr) && operand.IsR32(r):
1818		return &intrep.Instruction{
1819			Opcode:   "BSFL",
1820			Operands: []operand.Op{mr, r},
1821			Inputs:   []operand.Op{mr, r},
1822			Outputs:  []operand.Op{r},
1823		}, nil
1824	case operand.IsM32(mr) && operand.IsR32(r):
1825		return &intrep.Instruction{
1826			Opcode:   "BSFL",
1827			Operands: []operand.Op{mr, r},
1828			Inputs:   []operand.Op{mr, r},
1829			Outputs:  []operand.Op{r},
1830		}, nil
1831	}
1832	return nil, errors.New("BSFL: bad operands")
1833}
1834
1835// BSFQ: Bit Scan Forward.
1836//
1837// Forms:
1838//
1839// 	BSFQ r64 r64
1840// 	BSFQ m64 r64
1841func BSFQ(mr, r operand.Op) (*intrep.Instruction, error) {
1842	switch {
1843	case operand.IsR64(mr) && operand.IsR64(r):
1844		return &intrep.Instruction{
1845			Opcode:   "BSFQ",
1846			Operands: []operand.Op{mr, r},
1847			Inputs:   []operand.Op{mr, r},
1848			Outputs:  []operand.Op{r},
1849		}, nil
1850	case operand.IsM64(mr) && operand.IsR64(r):
1851		return &intrep.Instruction{
1852			Opcode:   "BSFQ",
1853			Operands: []operand.Op{mr, r},
1854			Inputs:   []operand.Op{mr, r},
1855			Outputs:  []operand.Op{r},
1856		}, nil
1857	}
1858	return nil, errors.New("BSFQ: bad operands")
1859}
1860
1861// BSFW: Bit Scan Forward.
1862//
1863// Forms:
1864//
1865// 	BSFW r16 r16
1866// 	BSFW m16 r16
1867func BSFW(mr, r operand.Op) (*intrep.Instruction, error) {
1868	switch {
1869	case operand.IsR16(mr) && operand.IsR16(r):
1870		return &intrep.Instruction{
1871			Opcode:   "BSFW",
1872			Operands: []operand.Op{mr, r},
1873			Inputs:   []operand.Op{mr, r},
1874			Outputs:  []operand.Op{r},
1875		}, nil
1876	case operand.IsM16(mr) && operand.IsR16(r):
1877		return &intrep.Instruction{
1878			Opcode:   "BSFW",
1879			Operands: []operand.Op{mr, r},
1880			Inputs:   []operand.Op{mr, r},
1881			Outputs:  []operand.Op{r},
1882		}, nil
1883	}
1884	return nil, errors.New("BSFW: bad operands")
1885}
1886
1887// BSRL: Bit Scan Reverse.
1888//
1889// Forms:
1890//
1891// 	BSRL r32 r32
1892// 	BSRL m32 r32
1893func BSRL(mr, r operand.Op) (*intrep.Instruction, error) {
1894	switch {
1895	case operand.IsR32(mr) && operand.IsR32(r):
1896		return &intrep.Instruction{
1897			Opcode:   "BSRL",
1898			Operands: []operand.Op{mr, r},
1899			Inputs:   []operand.Op{mr, r},
1900			Outputs:  []operand.Op{r},
1901		}, nil
1902	case operand.IsM32(mr) && operand.IsR32(r):
1903		return &intrep.Instruction{
1904			Opcode:   "BSRL",
1905			Operands: []operand.Op{mr, r},
1906			Inputs:   []operand.Op{mr, r},
1907			Outputs:  []operand.Op{r},
1908		}, nil
1909	}
1910	return nil, errors.New("BSRL: bad operands")
1911}
1912
1913// BSRQ: Bit Scan Reverse.
1914//
1915// Forms:
1916//
1917// 	BSRQ r64 r64
1918// 	BSRQ m64 r64
1919func BSRQ(mr, r operand.Op) (*intrep.Instruction, error) {
1920	switch {
1921	case operand.IsR64(mr) && operand.IsR64(r):
1922		return &intrep.Instruction{
1923			Opcode:   "BSRQ",
1924			Operands: []operand.Op{mr, r},
1925			Inputs:   []operand.Op{mr, r},
1926			Outputs:  []operand.Op{r},
1927		}, nil
1928	case operand.IsM64(mr) && operand.IsR64(r):
1929		return &intrep.Instruction{
1930			Opcode:   "BSRQ",
1931			Operands: []operand.Op{mr, r},
1932			Inputs:   []operand.Op{mr, r},
1933			Outputs:  []operand.Op{r},
1934		}, nil
1935	}
1936	return nil, errors.New("BSRQ: bad operands")
1937}
1938
1939// BSRW: Bit Scan Reverse.
1940//
1941// Forms:
1942//
1943// 	BSRW r16 r16
1944// 	BSRW m16 r16
1945func BSRW(mr, r operand.Op) (*intrep.Instruction, error) {
1946	switch {
1947	case operand.IsR16(mr) && operand.IsR16(r):
1948		return &intrep.Instruction{
1949			Opcode:   "BSRW",
1950			Operands: []operand.Op{mr, r},
1951			Inputs:   []operand.Op{mr, r},
1952			Outputs:  []operand.Op{r},
1953		}, nil
1954	case operand.IsM16(mr) && operand.IsR16(r):
1955		return &intrep.Instruction{
1956			Opcode:   "BSRW",
1957			Operands: []operand.Op{mr, r},
1958			Inputs:   []operand.Op{mr, r},
1959			Outputs:  []operand.Op{r},
1960		}, nil
1961	}
1962	return nil, errors.New("BSRW: bad operands")
1963}
1964
1965// BSWAPL: Byte Swap.
1966//
1967// Forms:
1968//
1969// 	BSWAPL r32
1970func BSWAPL(r operand.Op) (*intrep.Instruction, error) {
1971	switch {
1972	case operand.IsR32(r):
1973		return &intrep.Instruction{
1974			Opcode:   "BSWAPL",
1975			Operands: []operand.Op{r},
1976			Inputs:   []operand.Op{r},
1977			Outputs:  []operand.Op{r},
1978		}, nil
1979	}
1980	return nil, errors.New("BSWAPL: bad operands")
1981}
1982
1983// BSWAPQ: Byte Swap.
1984//
1985// Forms:
1986//
1987// 	BSWAPQ r64
1988func BSWAPQ(r operand.Op) (*intrep.Instruction, error) {
1989	switch {
1990	case operand.IsR64(r):
1991		return &intrep.Instruction{
1992			Opcode:   "BSWAPQ",
1993			Operands: []operand.Op{r},
1994			Inputs:   []operand.Op{r},
1995			Outputs:  []operand.Op{r},
1996		}, nil
1997	}
1998	return nil, errors.New("BSWAPQ: bad operands")
1999}
2000
2001// BTCL: Bit Test and Complement.
2002//
2003// Forms:
2004//
2005// 	BTCL imm8 r32
2006// 	BTCL r32  r32
2007// 	BTCL imm8 m32
2008// 	BTCL r32  m32
2009func BTCL(ir, mr operand.Op) (*intrep.Instruction, error) {
2010	switch {
2011	case operand.IsIMM8(ir) && operand.IsR32(mr):
2012		return &intrep.Instruction{
2013			Opcode:   "BTCL",
2014			Operands: []operand.Op{ir, mr},
2015			Inputs:   []operand.Op{mr},
2016			Outputs:  []operand.Op{mr},
2017		}, nil
2018	case operand.IsR32(ir) && operand.IsR32(mr):
2019		return &intrep.Instruction{
2020			Opcode:   "BTCL",
2021			Operands: []operand.Op{ir, mr},
2022			Inputs:   []operand.Op{ir, mr},
2023			Outputs:  []operand.Op{mr},
2024		}, nil
2025	case operand.IsIMM8(ir) && operand.IsM32(mr):
2026		return &intrep.Instruction{
2027			Opcode:   "BTCL",
2028			Operands: []operand.Op{ir, mr},
2029			Inputs:   []operand.Op{mr},
2030			Outputs:  []operand.Op{mr},
2031		}, nil
2032	case operand.IsR32(ir) && operand.IsM32(mr):
2033		return &intrep.Instruction{
2034			Opcode:   "BTCL",
2035			Operands: []operand.Op{ir, mr},
2036			Inputs:   []operand.Op{ir, mr},
2037			Outputs:  []operand.Op{mr},
2038		}, nil
2039	}
2040	return nil, errors.New("BTCL: bad operands")
2041}
2042
2043// BTCQ: Bit Test and Complement.
2044//
2045// Forms:
2046//
2047// 	BTCQ imm8 r64
2048// 	BTCQ r64  r64
2049// 	BTCQ imm8 m64
2050// 	BTCQ r64  m64
2051func BTCQ(ir, mr operand.Op) (*intrep.Instruction, error) {
2052	switch {
2053	case operand.IsIMM8(ir) && operand.IsR64(mr):
2054		return &intrep.Instruction{
2055			Opcode:   "BTCQ",
2056			Operands: []operand.Op{ir, mr},
2057			Inputs:   []operand.Op{mr},
2058			Outputs:  []operand.Op{mr},
2059		}, nil
2060	case operand.IsR64(ir) && operand.IsR64(mr):
2061		return &intrep.Instruction{
2062			Opcode:   "BTCQ",
2063			Operands: []operand.Op{ir, mr},
2064			Inputs:   []operand.Op{ir, mr},
2065			Outputs:  []operand.Op{mr},
2066		}, nil
2067	case operand.IsIMM8(ir) && operand.IsM64(mr):
2068		return &intrep.Instruction{
2069			Opcode:   "BTCQ",
2070			Operands: []operand.Op{ir, mr},
2071			Inputs:   []operand.Op{mr},
2072			Outputs:  []operand.Op{mr},
2073		}, nil
2074	case operand.IsR64(ir) && operand.IsM64(mr):
2075		return &intrep.Instruction{
2076			Opcode:   "BTCQ",
2077			Operands: []operand.Op{ir, mr},
2078			Inputs:   []operand.Op{ir, mr},
2079			Outputs:  []operand.Op{mr},
2080		}, nil
2081	}
2082	return nil, errors.New("BTCQ: bad operands")
2083}
2084
2085// BTCW: Bit Test and Complement.
2086//
2087// Forms:
2088//
2089// 	BTCW imm8 r16
2090// 	BTCW r16  r16
2091// 	BTCW imm8 m16
2092// 	BTCW r16  m16
2093func BTCW(ir, mr operand.Op) (*intrep.Instruction, error) {
2094	switch {
2095	case operand.IsIMM8(ir) && operand.IsR16(mr):
2096		return &intrep.Instruction{
2097			Opcode:   "BTCW",
2098			Operands: []operand.Op{ir, mr},
2099			Inputs:   []operand.Op{mr},
2100			Outputs:  []operand.Op{mr},
2101		}, nil
2102	case operand.IsR16(ir) && operand.IsR16(mr):
2103		return &intrep.Instruction{
2104			Opcode:   "BTCW",
2105			Operands: []operand.Op{ir, mr},
2106			Inputs:   []operand.Op{ir, mr},
2107			Outputs:  []operand.Op{mr},
2108		}, nil
2109	case operand.IsIMM8(ir) && operand.IsM16(mr):
2110		return &intrep.Instruction{
2111			Opcode:   "BTCW",
2112			Operands: []operand.Op{ir, mr},
2113			Inputs:   []operand.Op{mr},
2114			Outputs:  []operand.Op{mr},
2115		}, nil
2116	case operand.IsR16(ir) && operand.IsM16(mr):
2117		return &intrep.Instruction{
2118			Opcode:   "BTCW",
2119			Operands: []operand.Op{ir, mr},
2120			Inputs:   []operand.Op{ir, mr},
2121			Outputs:  []operand.Op{mr},
2122		}, nil
2123	}
2124	return nil, errors.New("BTCW: bad operands")
2125}
2126
2127// BTL: Bit Test.
2128//
2129// Forms:
2130//
2131// 	BTL imm8 r32
2132// 	BTL r32  r32
2133// 	BTL imm8 m32
2134// 	BTL r32  m32
2135func BTL(ir, mr operand.Op) (*intrep.Instruction, error) {
2136	switch {
2137	case operand.IsIMM8(ir) && operand.IsR32(mr):
2138		return &intrep.Instruction{
2139			Opcode:   "BTL",
2140			Operands: []operand.Op{ir, mr},
2141			Inputs:   []operand.Op{mr},
2142			Outputs:  []operand.Op{},
2143		}, nil
2144	case operand.IsR32(ir) && operand.IsR32(mr):
2145		return &intrep.Instruction{
2146			Opcode:   "BTL",
2147			Operands: []operand.Op{ir, mr},
2148			Inputs:   []operand.Op{ir, mr},
2149			Outputs:  []operand.Op{},
2150		}, nil
2151	case operand.IsIMM8(ir) && operand.IsM32(mr):
2152		return &intrep.Instruction{
2153			Opcode:   "BTL",
2154			Operands: []operand.Op{ir, mr},
2155			Inputs:   []operand.Op{mr},
2156			Outputs:  []operand.Op{},
2157		}, nil
2158	case operand.IsR32(ir) && operand.IsM32(mr):
2159		return &intrep.Instruction{
2160			Opcode:   "BTL",
2161			Operands: []operand.Op{ir, mr},
2162			Inputs:   []operand.Op{ir, mr},
2163			Outputs:  []operand.Op{},
2164		}, nil
2165	}
2166	return nil, errors.New("BTL: bad operands")
2167}
2168
2169// BTQ: Bit Test.
2170//
2171// Forms:
2172//
2173// 	BTQ imm8 r64
2174// 	BTQ r64  r64
2175// 	BTQ imm8 m64
2176// 	BTQ r64  m64
2177func BTQ(ir, mr operand.Op) (*intrep.Instruction, error) {
2178	switch {
2179	case operand.IsIMM8(ir) && operand.IsR64(mr):
2180		return &intrep.Instruction{
2181			Opcode:   "BTQ",
2182			Operands: []operand.Op{ir, mr},
2183			Inputs:   []operand.Op{mr},
2184			Outputs:  []operand.Op{},
2185		}, nil
2186	case operand.IsR64(ir) && operand.IsR64(mr):
2187		return &intrep.Instruction{
2188			Opcode:   "BTQ",
2189			Operands: []operand.Op{ir, mr},
2190			Inputs:   []operand.Op{ir, mr},
2191			Outputs:  []operand.Op{},
2192		}, nil
2193	case operand.IsIMM8(ir) && operand.IsM64(mr):
2194		return &intrep.Instruction{
2195			Opcode:   "BTQ",
2196			Operands: []operand.Op{ir, mr},
2197			Inputs:   []operand.Op{mr},
2198			Outputs:  []operand.Op{},
2199		}, nil
2200	case operand.IsR64(ir) && operand.IsM64(mr):
2201		return &intrep.Instruction{
2202			Opcode:   "BTQ",
2203			Operands: []operand.Op{ir, mr},
2204			Inputs:   []operand.Op{ir, mr},
2205			Outputs:  []operand.Op{},
2206		}, nil
2207	}
2208	return nil, errors.New("BTQ: bad operands")
2209}
2210
2211// BTRL: Bit Test and Reset.
2212//
2213// Forms:
2214//
2215// 	BTRL imm8 r32
2216// 	BTRL r32  r32
2217// 	BTRL imm8 m32
2218// 	BTRL r32  m32
2219func BTRL(ir, mr operand.Op) (*intrep.Instruction, error) {
2220	switch {
2221	case operand.IsIMM8(ir) && operand.IsR32(mr):
2222		return &intrep.Instruction{
2223			Opcode:   "BTRL",
2224			Operands: []operand.Op{ir, mr},
2225			Inputs:   []operand.Op{mr},
2226			Outputs:  []operand.Op{mr},
2227		}, nil
2228	case operand.IsR32(ir) && operand.IsR32(mr):
2229		return &intrep.Instruction{
2230			Opcode:   "BTRL",
2231			Operands: []operand.Op{ir, mr},
2232			Inputs:   []operand.Op{ir, mr},
2233			Outputs:  []operand.Op{mr},
2234		}, nil
2235	case operand.IsIMM8(ir) && operand.IsM32(mr):
2236		return &intrep.Instruction{
2237			Opcode:   "BTRL",
2238			Operands: []operand.Op{ir, mr},
2239			Inputs:   []operand.Op{mr},
2240			Outputs:  []operand.Op{mr},
2241		}, nil
2242	case operand.IsR32(ir) && operand.IsM32(mr):
2243		return &intrep.Instruction{
2244			Opcode:   "BTRL",
2245			Operands: []operand.Op{ir, mr},
2246			Inputs:   []operand.Op{ir, mr},
2247			Outputs:  []operand.Op{mr},
2248		}, nil
2249	}
2250	return nil, errors.New("BTRL: bad operands")
2251}
2252
2253// BTRQ: Bit Test and Reset.
2254//
2255// Forms:
2256//
2257// 	BTRQ imm8 r64
2258// 	BTRQ r64  r64
2259// 	BTRQ imm8 m64
2260// 	BTRQ r64  m64
2261func BTRQ(ir, mr operand.Op) (*intrep.Instruction, error) {
2262	switch {
2263	case operand.IsIMM8(ir) && operand.IsR64(mr):
2264		return &intrep.Instruction{
2265			Opcode:   "BTRQ",
2266			Operands: []operand.Op{ir, mr},
2267			Inputs:   []operand.Op{mr},
2268			Outputs:  []operand.Op{mr},
2269		}, nil
2270	case operand.IsR64(ir) && operand.IsR64(mr):
2271		return &intrep.Instruction{
2272			Opcode:   "BTRQ",
2273			Operands: []operand.Op{ir, mr},
2274			Inputs:   []operand.Op{ir, mr},
2275			Outputs:  []operand.Op{mr},
2276		}, nil
2277	case operand.IsIMM8(ir) && operand.IsM64(mr):
2278		return &intrep.Instruction{
2279			Opcode:   "BTRQ",
2280			Operands: []operand.Op{ir, mr},
2281			Inputs:   []operand.Op{mr},
2282			Outputs:  []operand.Op{mr},
2283		}, nil
2284	case operand.IsR64(ir) && operand.IsM64(mr):
2285		return &intrep.Instruction{
2286			Opcode:   "BTRQ",
2287			Operands: []operand.Op{ir, mr},
2288			Inputs:   []operand.Op{ir, mr},
2289			Outputs:  []operand.Op{mr},
2290		}, nil
2291	}
2292	return nil, errors.New("BTRQ: bad operands")
2293}
2294
2295// BTRW: Bit Test and Reset.
2296//
2297// Forms:
2298//
2299// 	BTRW imm8 r16
2300// 	BTRW r16  r16
2301// 	BTRW imm8 m16
2302// 	BTRW r16  m16
2303func BTRW(ir, mr operand.Op) (*intrep.Instruction, error) {
2304	switch {
2305	case operand.IsIMM8(ir) && operand.IsR16(mr):
2306		return &intrep.Instruction{
2307			Opcode:   "BTRW",
2308			Operands: []operand.Op{ir, mr},
2309			Inputs:   []operand.Op{mr},
2310			Outputs:  []operand.Op{mr},
2311		}, nil
2312	case operand.IsR16(ir) && operand.IsR16(mr):
2313		return &intrep.Instruction{
2314			Opcode:   "BTRW",
2315			Operands: []operand.Op{ir, mr},
2316			Inputs:   []operand.Op{ir, mr},
2317			Outputs:  []operand.Op{mr},
2318		}, nil
2319	case operand.IsIMM8(ir) && operand.IsM16(mr):
2320		return &intrep.Instruction{
2321			Opcode:   "BTRW",
2322			Operands: []operand.Op{ir, mr},
2323			Inputs:   []operand.Op{mr},
2324			Outputs:  []operand.Op{mr},
2325		}, nil
2326	case operand.IsR16(ir) && operand.IsM16(mr):
2327		return &intrep.Instruction{
2328			Opcode:   "BTRW",
2329			Operands: []operand.Op{ir, mr},
2330			Inputs:   []operand.Op{ir, mr},
2331			Outputs:  []operand.Op{mr},
2332		}, nil
2333	}
2334	return nil, errors.New("BTRW: bad operands")
2335}
2336
2337// BTSL: Bit Test and Set.
2338//
2339// Forms:
2340//
2341// 	BTSL imm8 r32
2342// 	BTSL r32  r32
2343// 	BTSL imm8 m32
2344// 	BTSL r32  m32
2345func BTSL(ir, mr operand.Op) (*intrep.Instruction, error) {
2346	switch {
2347	case operand.IsIMM8(ir) && operand.IsR32(mr):
2348		return &intrep.Instruction{
2349			Opcode:   "BTSL",
2350			Operands: []operand.Op{ir, mr},
2351			Inputs:   []operand.Op{mr},
2352			Outputs:  []operand.Op{mr},
2353		}, nil
2354	case operand.IsR32(ir) && operand.IsR32(mr):
2355		return &intrep.Instruction{
2356			Opcode:   "BTSL",
2357			Operands: []operand.Op{ir, mr},
2358			Inputs:   []operand.Op{ir, mr},
2359			Outputs:  []operand.Op{mr},
2360		}, nil
2361	case operand.IsIMM8(ir) && operand.IsM32(mr):
2362		return &intrep.Instruction{
2363			Opcode:   "BTSL",
2364			Operands: []operand.Op{ir, mr},
2365			Inputs:   []operand.Op{mr},
2366			Outputs:  []operand.Op{mr},
2367		}, nil
2368	case operand.IsR32(ir) && operand.IsM32(mr):
2369		return &intrep.Instruction{
2370			Opcode:   "BTSL",
2371			Operands: []operand.Op{ir, mr},
2372			Inputs:   []operand.Op{ir, mr},
2373			Outputs:  []operand.Op{mr},
2374		}, nil
2375	}
2376	return nil, errors.New("BTSL: bad operands")
2377}
2378
2379// BTSQ: Bit Test and Set.
2380//
2381// Forms:
2382//
2383// 	BTSQ imm8 r64
2384// 	BTSQ r64  r64
2385// 	BTSQ imm8 m64
2386// 	BTSQ r64  m64
2387func BTSQ(ir, mr operand.Op) (*intrep.Instruction, error) {
2388	switch {
2389	case operand.IsIMM8(ir) && operand.IsR64(mr):
2390		return &intrep.Instruction{
2391			Opcode:   "BTSQ",
2392			Operands: []operand.Op{ir, mr},
2393			Inputs:   []operand.Op{mr},
2394			Outputs:  []operand.Op{mr},
2395		}, nil
2396	case operand.IsR64(ir) && operand.IsR64(mr):
2397		return &intrep.Instruction{
2398			Opcode:   "BTSQ",
2399			Operands: []operand.Op{ir, mr},
2400			Inputs:   []operand.Op{ir, mr},
2401			Outputs:  []operand.Op{mr},
2402		}, nil
2403	case operand.IsIMM8(ir) && operand.IsM64(mr):
2404		return &intrep.Instruction{
2405			Opcode:   "BTSQ",
2406			Operands: []operand.Op{ir, mr},
2407			Inputs:   []operand.Op{mr},
2408			Outputs:  []operand.Op{mr},
2409		}, nil
2410	case operand.IsR64(ir) && operand.IsM64(mr):
2411		return &intrep.Instruction{
2412			Opcode:   "BTSQ",
2413			Operands: []operand.Op{ir, mr},
2414			Inputs:   []operand.Op{ir, mr},
2415			Outputs:  []operand.Op{mr},
2416		}, nil
2417	}
2418	return nil, errors.New("BTSQ: bad operands")
2419}
2420
2421// BTSW: Bit Test and Set.
2422//
2423// Forms:
2424//
2425// 	BTSW imm8 r16
2426// 	BTSW r16  r16
2427// 	BTSW imm8 m16
2428// 	BTSW r16  m16
2429func BTSW(ir, mr operand.Op) (*intrep.Instruction, error) {
2430	switch {
2431	case operand.IsIMM8(ir) && operand.IsR16(mr):
2432		return &intrep.Instruction{
2433			Opcode:   "BTSW",
2434			Operands: []operand.Op{ir, mr},
2435			Inputs:   []operand.Op{mr},
2436			Outputs:  []operand.Op{mr},
2437		}, nil
2438	case operand.IsR16(ir) && operand.IsR16(mr):
2439		return &intrep.Instruction{
2440			Opcode:   "BTSW",
2441			Operands: []operand.Op{ir, mr},
2442			Inputs:   []operand.Op{ir, mr},
2443			Outputs:  []operand.Op{mr},
2444		}, nil
2445	case operand.IsIMM8(ir) && operand.IsM16(mr):
2446		return &intrep.Instruction{
2447			Opcode:   "BTSW",
2448			Operands: []operand.Op{ir, mr},
2449			Inputs:   []operand.Op{mr},
2450			Outputs:  []operand.Op{mr},
2451		}, nil
2452	case operand.IsR16(ir) && operand.IsM16(mr):
2453		return &intrep.Instruction{
2454			Opcode:   "BTSW",
2455			Operands: []operand.Op{ir, mr},
2456			Inputs:   []operand.Op{ir, mr},
2457			Outputs:  []operand.Op{mr},
2458		}, nil
2459	}
2460	return nil, errors.New("BTSW: bad operands")
2461}
2462
2463// BTW: Bit Test.
2464//
2465// Forms:
2466//
2467// 	BTW imm8 r16
2468// 	BTW r16  r16
2469// 	BTW imm8 m16
2470// 	BTW r16  m16
2471func BTW(ir, mr operand.Op) (*intrep.Instruction, error) {
2472	switch {
2473	case operand.IsIMM8(ir) && operand.IsR16(mr):
2474		return &intrep.Instruction{
2475			Opcode:   "BTW",
2476			Operands: []operand.Op{ir, mr},
2477			Inputs:   []operand.Op{mr},
2478			Outputs:  []operand.Op{},
2479		}, nil
2480	case operand.IsR16(ir) && operand.IsR16(mr):
2481		return &intrep.Instruction{
2482			Opcode:   "BTW",
2483			Operands: []operand.Op{ir, mr},
2484			Inputs:   []operand.Op{ir, mr},
2485			Outputs:  []operand.Op{},
2486		}, nil
2487	case operand.IsIMM8(ir) && operand.IsM16(mr):
2488		return &intrep.Instruction{
2489			Opcode:   "BTW",
2490			Operands: []operand.Op{ir, mr},
2491			Inputs:   []operand.Op{mr},
2492			Outputs:  []operand.Op{},
2493		}, nil
2494	case operand.IsR16(ir) && operand.IsM16(mr):
2495		return &intrep.Instruction{
2496			Opcode:   "BTW",
2497			Operands: []operand.Op{ir, mr},
2498			Inputs:   []operand.Op{ir, mr},
2499			Outputs:  []operand.Op{},
2500		}, nil
2501	}
2502	return nil, errors.New("BTW: bad operands")
2503}
2504
2505// BZHIL: Zero High Bits Starting with Specified Bit Position.
2506//
2507// Forms:
2508//
2509// 	BZHIL r32 r32 r32
2510// 	BZHIL r32 m32 r32
2511func BZHIL(r, mr, r1 operand.Op) (*intrep.Instruction, error) {
2512	switch {
2513	case operand.IsR32(r) && operand.IsR32(mr) && operand.IsR32(r1):
2514		return &intrep.Instruction{
2515			Opcode:   "BZHIL",
2516			Operands: []operand.Op{r, mr, r1},
2517			Inputs:   []operand.Op{r, mr},
2518			Outputs:  []operand.Op{r1},
2519			ISA:      []string{"BMI2"},
2520		}, nil
2521	case operand.IsR32(r) && operand.IsM32(mr) && operand.IsR32(r1):
2522		return &intrep.Instruction{
2523			Opcode:   "BZHIL",
2524			Operands: []operand.Op{r, mr, r1},
2525			Inputs:   []operand.Op{r, mr},
2526			Outputs:  []operand.Op{r1},
2527			ISA:      []string{"BMI2"},
2528		}, nil
2529	}
2530	return nil, errors.New("BZHIL: bad operands")
2531}
2532
2533// BZHIQ: Zero High Bits Starting with Specified Bit Position.
2534//
2535// Forms:
2536//
2537// 	BZHIQ r64 r64 r64
2538// 	BZHIQ r64 m64 r64
2539func BZHIQ(r, mr, r1 operand.Op) (*intrep.Instruction, error) {
2540	switch {
2541	case operand.IsR64(r) && operand.IsR64(mr) && operand.IsR64(r1):
2542		return &intrep.Instruction{
2543			Opcode:   "BZHIQ",
2544			Operands: []operand.Op{r, mr, r1},
2545			Inputs:   []operand.Op{r, mr},
2546			Outputs:  []operand.Op{r1},
2547			ISA:      []string{"BMI2"},
2548		}, nil
2549	case operand.IsR64(r) && operand.IsM64(mr) && operand.IsR64(r1):
2550		return &intrep.Instruction{
2551			Opcode:   "BZHIQ",
2552			Operands: []operand.Op{r, mr, r1},
2553			Inputs:   []operand.Op{r, mr},
2554			Outputs:  []operand.Op{r1},
2555			ISA:      []string{"BMI2"},
2556		}, nil
2557	}
2558	return nil, errors.New("BZHIQ: bad operands")
2559}
2560
2561// CALL: Call Procedure.
2562//
2563// Forms:
2564//
2565// 	CALL rel32
2566func CALL(r operand.Op) (*intrep.Instruction, error) {
2567	switch {
2568	case operand.IsREL32(r):
2569		return &intrep.Instruction{
2570			Opcode:   "CALL",
2571			Operands: []operand.Op{r},
2572			Inputs:   []operand.Op{},
2573			Outputs:  []operand.Op{},
2574		}, nil
2575	}
2576	return nil, errors.New("CALL: bad operands")
2577}
2578
2579// CBW: Convert Byte to Word.
2580//
2581// Forms:
2582//
2583// 	CBW
2584func CBW() (*intrep.Instruction, error) {
2585	return &intrep.Instruction{
2586		Opcode:   "CBW",
2587		Operands: nil,
2588		Inputs:   []operand.Op{reg.AL},
2589		Outputs:  []operand.Op{reg.AX},
2590	}, nil
2591}
2592
2593// CDQ: Convert Doubleword to Quadword.
2594//
2595// Forms:
2596//
2597// 	CDQ
2598func CDQ() (*intrep.Instruction, error) {
2599	return &intrep.Instruction{
2600		Opcode:   "CDQ",
2601		Operands: nil,
2602		Inputs:   []operand.Op{reg.EAX},
2603		Outputs:  []operand.Op{reg.EDX},
2604	}, nil
2605}
2606
2607// CDQE: Convert Doubleword to Quadword.
2608//
2609// Forms:
2610//
2611// 	CDQE
2612func CDQE() (*intrep.Instruction, error) {
2613	return &intrep.Instruction{
2614		Opcode:   "CDQE",
2615		Operands: nil,
2616		Inputs:   []operand.Op{reg.EAX},
2617		Outputs:  []operand.Op{reg.RAX},
2618	}, nil
2619}
2620
2621// CLC: Clear Carry Flag.
2622//
2623// Forms:
2624//
2625// 	CLC
2626func CLC() (*intrep.Instruction, error) {
2627	return &intrep.Instruction{
2628		Opcode:   "CLC",
2629		Operands: nil,
2630		Inputs:   []operand.Op{},
2631		Outputs:  []operand.Op{},
2632	}, nil
2633}
2634
2635// CLD: Clear Direction Flag.
2636//
2637// Forms:
2638//
2639// 	CLD
2640func CLD() (*intrep.Instruction, error) {
2641	return &intrep.Instruction{
2642		Opcode:   "CLD",
2643		Operands: nil,
2644		Inputs:   []operand.Op{},
2645		Outputs:  []operand.Op{},
2646	}, nil
2647}
2648
2649// CLFLUSH: Flush Cache Line.
2650//
2651// Forms:
2652//
2653// 	CLFLUSH m8
2654func CLFLUSH(m operand.Op) (*intrep.Instruction, error) {
2655	switch {
2656	case operand.IsM8(m):
2657		return &intrep.Instruction{
2658			Opcode:   "CLFLUSH",
2659			Operands: []operand.Op{m},
2660			Inputs:   []operand.Op{m},
2661			Outputs:  []operand.Op{},
2662			ISA:      []string{"CLFLUSH"},
2663		}, nil
2664	}
2665	return nil, errors.New("CLFLUSH: bad operands")
2666}
2667
2668// CLFLUSHOPT: Flush Cache Line Optimized.
2669//
2670// Forms:
2671//
2672// 	CLFLUSHOPT m8
2673func CLFLUSHOPT(m operand.Op) (*intrep.Instruction, error) {
2674	switch {
2675	case operand.IsM8(m):
2676		return &intrep.Instruction{
2677			Opcode:   "CLFLUSHOPT",
2678			Operands: []operand.Op{m},
2679			Inputs:   []operand.Op{m},
2680			Outputs:  []operand.Op{},
2681			ISA:      []string{"CLFLUSHOPT"},
2682		}, nil
2683	}
2684	return nil, errors.New("CLFLUSHOPT: bad operands")
2685}
2686
2687// CMC: Complement Carry Flag.
2688//
2689// Forms:
2690//
2691// 	CMC
2692func CMC() (*intrep.Instruction, error) {
2693	return &intrep.Instruction{
2694		Opcode:   "CMC",
2695		Operands: nil,
2696		Inputs:   []operand.Op{},
2697		Outputs:  []operand.Op{},
2698	}, nil
2699}
2700
2701// CMOVLCC: Move if above or equal (CF == 0).
2702//
2703// Forms:
2704//
2705// 	CMOVLCC r32 r32
2706// 	CMOVLCC m32 r32
2707func CMOVLCC(mr, r operand.Op) (*intrep.Instruction, error) {
2708	switch {
2709	case operand.IsR32(mr) && operand.IsR32(r):
2710		return &intrep.Instruction{
2711			Opcode:   "CMOVLCC",
2712			Operands: []operand.Op{mr, r},
2713			Inputs:   []operand.Op{mr, r},
2714			Outputs:  []operand.Op{r},
2715			ISA:      []string{"CMOV"},
2716		}, nil
2717	case operand.IsM32(mr) && operand.IsR32(r):
2718		return &intrep.Instruction{
2719			Opcode:   "CMOVLCC",
2720			Operands: []operand.Op{mr, r},
2721			Inputs:   []operand.Op{mr, r},
2722			Outputs:  []operand.Op{r},
2723			ISA:      []string{"CMOV"},
2724		}, nil
2725	}
2726	return nil, errors.New("CMOVLCC: bad operands")
2727}
2728
2729// CMOVLCS: Move if below (CF == 1).
2730//
2731// Forms:
2732//
2733// 	CMOVLCS r32 r32
2734// 	CMOVLCS m32 r32
2735func CMOVLCS(mr, r operand.Op) (*intrep.Instruction, error) {
2736	switch {
2737	case operand.IsR32(mr) && operand.IsR32(r):
2738		return &intrep.Instruction{
2739			Opcode:   "CMOVLCS",
2740			Operands: []operand.Op{mr, r},
2741			Inputs:   []operand.Op{mr, r},
2742			Outputs:  []operand.Op{r},
2743			ISA:      []string{"CMOV"},
2744		}, nil
2745	case operand.IsM32(mr) && operand.IsR32(r):
2746		return &intrep.Instruction{
2747			Opcode:   "CMOVLCS",
2748			Operands: []operand.Op{mr, r},
2749			Inputs:   []operand.Op{mr, r},
2750			Outputs:  []operand.Op{r},
2751			ISA:      []string{"CMOV"},
2752		}, nil
2753	}
2754	return nil, errors.New("CMOVLCS: bad operands")
2755}
2756
2757// CMOVLEQ: Move if equal (ZF == 1).
2758//
2759// Forms:
2760//
2761// 	CMOVLEQ r32 r32
2762// 	CMOVLEQ m32 r32
2763func CMOVLEQ(mr, r operand.Op) (*intrep.Instruction, error) {
2764	switch {
2765	case operand.IsR32(mr) && operand.IsR32(r):
2766		return &intrep.Instruction{
2767			Opcode:   "CMOVLEQ",
2768			Operands: []operand.Op{mr, r},
2769			Inputs:   []operand.Op{mr, r},
2770			Outputs:  []operand.Op{r},
2771			ISA:      []string{"CMOV"},
2772		}, nil
2773	case operand.IsM32(mr) && operand.IsR32(r):
2774		return &intrep.Instruction{
2775			Opcode:   "CMOVLEQ",
2776			Operands: []operand.Op{mr, r},
2777			Inputs:   []operand.Op{mr, r},
2778			Outputs:  []operand.Op{r},
2779			ISA:      []string{"CMOV"},
2780		}, nil
2781	}
2782	return nil, errors.New("CMOVLEQ: bad operands")
2783}
2784
2785// CMOVLGE: Move if greater or equal (SF == OF).
2786//
2787// Forms:
2788//
2789// 	CMOVLGE r32 r32
2790// 	CMOVLGE m32 r32
2791func CMOVLGE(mr, r operand.Op) (*intrep.Instruction, error) {
2792	switch {
2793	case operand.IsR32(mr) && operand.IsR32(r):
2794		return &intrep.Instruction{
2795			Opcode:   "CMOVLGE",
2796			Operands: []operand.Op{mr, r},
2797			Inputs:   []operand.Op{mr, r},
2798			Outputs:  []operand.Op{r},
2799			ISA:      []string{"CMOV"},
2800		}, nil
2801	case operand.IsM32(mr) && operand.IsR32(r):
2802		return &intrep.Instruction{
2803			Opcode:   "CMOVLGE",
2804			Operands: []operand.Op{mr, r},
2805			Inputs:   []operand.Op{mr, r},
2806			Outputs:  []operand.Op{r},
2807			ISA:      []string{"CMOV"},
2808		}, nil
2809	}
2810	return nil, errors.New("CMOVLGE: bad operands")
2811}
2812
2813// CMOVLGT: Move if greater (ZF == 0 and SF == OF).
2814//
2815// Forms:
2816//
2817// 	CMOVLGT r32 r32
2818// 	CMOVLGT m32 r32
2819func CMOVLGT(mr, r operand.Op) (*intrep.Instruction, error) {
2820	switch {
2821	case operand.IsR32(mr) && operand.IsR32(r):
2822		return &intrep.Instruction{
2823			Opcode:   "CMOVLGT",
2824			Operands: []operand.Op{mr, r},
2825			Inputs:   []operand.Op{mr, r},
2826			Outputs:  []operand.Op{r},
2827			ISA:      []string{"CMOV"},
2828		}, nil
2829	case operand.IsM32(mr) && operand.IsR32(r):
2830		return &intrep.Instruction{
2831			Opcode:   "CMOVLGT",
2832			Operands: []operand.Op{mr, r},
2833			Inputs:   []operand.Op{mr, r},
2834			Outputs:  []operand.Op{r},
2835			ISA:      []string{"CMOV"},
2836		}, nil
2837	}
2838	return nil, errors.New("CMOVLGT: bad operands")
2839}
2840
2841// CMOVLHI: Move if above (CF == 0 and ZF == 0).
2842//
2843// Forms:
2844//
2845// 	CMOVLHI r32 r32
2846// 	CMOVLHI m32 r32
2847func CMOVLHI(mr, r operand.Op) (*intrep.Instruction, error) {
2848	switch {
2849	case operand.IsR32(mr) && operand.IsR32(r):
2850		return &intrep.Instruction{
2851			Opcode:   "CMOVLHI",
2852			Operands: []operand.Op{mr, r},
2853			Inputs:   []operand.Op{mr, r},
2854			Outputs:  []operand.Op{r},
2855			ISA:      []string{"CMOV"},
2856		}, nil
2857	case operand.IsM32(mr) && operand.IsR32(r):
2858		return &intrep.Instruction{
2859			Opcode:   "CMOVLHI",
2860			Operands: []operand.Op{mr, r},
2861			Inputs:   []operand.Op{mr, r},
2862			Outputs:  []operand.Op{r},
2863			ISA:      []string{"CMOV"},
2864		}, nil
2865	}
2866	return nil, errors.New("CMOVLHI: bad operands")
2867}
2868
2869// CMOVLLE: Move if less or equal (ZF == 1 or SF != OF).
2870//
2871// Forms:
2872//
2873// 	CMOVLLE r32 r32
2874// 	CMOVLLE m32 r32
2875func CMOVLLE(mr, r operand.Op) (*intrep.Instruction, error) {
2876	switch {
2877	case operand.IsR32(mr) && operand.IsR32(r):
2878		return &intrep.Instruction{
2879			Opcode:   "CMOVLLE",
2880			Operands: []operand.Op{mr, r},
2881			Inputs:   []operand.Op{mr, r},
2882			Outputs:  []operand.Op{r},
2883			ISA:      []string{"CMOV"},
2884		}, nil
2885	case operand.IsM32(mr) && operand.IsR32(r):
2886		return &intrep.Instruction{
2887			Opcode:   "CMOVLLE",
2888			Operands: []operand.Op{mr, r},
2889			Inputs:   []operand.Op{mr, r},
2890			Outputs:  []operand.Op{r},
2891			ISA:      []string{"CMOV"},
2892		}, nil
2893	}
2894	return nil, errors.New("CMOVLLE: bad operands")
2895}
2896
2897// CMOVLLS: Move if below or equal (CF == 1 or ZF == 1).
2898//
2899// Forms:
2900//
2901// 	CMOVLLS r32 r32
2902// 	CMOVLLS m32 r32
2903func CMOVLLS(mr, r operand.Op) (*intrep.Instruction, error) {
2904	switch {
2905	case operand.IsR32(mr) && operand.IsR32(r):
2906		return &intrep.Instruction{
2907			Opcode:   "CMOVLLS",
2908			Operands: []operand.Op{mr, r},
2909			Inputs:   []operand.Op{mr, r},
2910			Outputs:  []operand.Op{r},
2911			ISA:      []string{"CMOV"},
2912		}, nil
2913	case operand.IsM32(mr) && operand.IsR32(r):
2914		return &intrep.Instruction{
2915			Opcode:   "CMOVLLS",
2916			Operands: []operand.Op{mr, r},
2917			Inputs:   []operand.Op{mr, r},
2918			Outputs:  []operand.Op{r},
2919			ISA:      []string{"CMOV"},
2920		}, nil
2921	}
2922	return nil, errors.New("CMOVLLS: bad operands")
2923}
2924
2925// CMOVLLT: Move if less (SF != OF).
2926//
2927// Forms:
2928//
2929// 	CMOVLLT r32 r32
2930// 	CMOVLLT m32 r32
2931func CMOVLLT(mr, r operand.Op) (*intrep.Instruction, error) {
2932	switch {
2933	case operand.IsR32(mr) && operand.IsR32(r):
2934		return &intrep.Instruction{
2935			Opcode:   "CMOVLLT",
2936			Operands: []operand.Op{mr, r},
2937			Inputs:   []operand.Op{mr, r},
2938			Outputs:  []operand.Op{r},
2939			ISA:      []string{"CMOV"},
2940		}, nil
2941	case operand.IsM32(mr) && operand.IsR32(r):
2942		return &intrep.Instruction{
2943			Opcode:   "CMOVLLT",
2944			Operands: []operand.Op{mr, r},
2945			Inputs:   []operand.Op{mr, r},
2946			Outputs:  []operand.Op{r},
2947			ISA:      []string{"CMOV"},
2948		}, nil
2949	}
2950	return nil, errors.New("CMOVLLT: bad operands")
2951}
2952
2953// CMOVLMI: Move if sign (SF == 1).
2954//
2955// Forms:
2956//
2957// 	CMOVLMI r32 r32
2958// 	CMOVLMI m32 r32
2959func CMOVLMI(mr, r operand.Op) (*intrep.Instruction, error) {
2960	switch {
2961	case operand.IsR32(mr) && operand.IsR32(r):
2962		return &intrep.Instruction{
2963			Opcode:   "CMOVLMI",
2964			Operands: []operand.Op{mr, r},
2965			Inputs:   []operand.Op{mr, r},
2966			Outputs:  []operand.Op{r},
2967			ISA:      []string{"CMOV"},
2968		}, nil
2969	case operand.IsM32(mr) && operand.IsR32(r):
2970		return &intrep.Instruction{
2971			Opcode:   "CMOVLMI",
2972			Operands: []operand.Op{mr, r},
2973			Inputs:   []operand.Op{mr, r},
2974			Outputs:  []operand.Op{r},
2975			ISA:      []string{"CMOV"},
2976		}, nil
2977	}
2978	return nil, errors.New("CMOVLMI: bad operands")
2979}
2980
2981// CMOVLNE: Move if not equal (ZF == 0).
2982//
2983// Forms:
2984//
2985// 	CMOVLNE r32 r32
2986// 	CMOVLNE m32 r32
2987func CMOVLNE(mr, r operand.Op) (*intrep.Instruction, error) {
2988	switch {
2989	case operand.IsR32(mr) && operand.IsR32(r):
2990		return &intrep.Instruction{
2991			Opcode:   "CMOVLNE",
2992			Operands: []operand.Op{mr, r},
2993			Inputs:   []operand.Op{mr, r},
2994			Outputs:  []operand.Op{r},
2995			ISA:      []string{"CMOV"},
2996		}, nil
2997	case operand.IsM32(mr) && operand.IsR32(r):
2998		return &intrep.Instruction{
2999			Opcode:   "CMOVLNE",
3000			Operands: []operand.Op{mr, r},
3001			Inputs:   []operand.Op{mr, r},
3002			Outputs:  []operand.Op{r},
3003			ISA:      []string{"CMOV"},
3004		}, nil
3005	}
3006	return nil, errors.New("CMOVLNE: bad operands")
3007}
3008
3009// CMOVLOC: Move if not overflow (OF == 0).
3010//
3011// Forms:
3012//
3013// 	CMOVLOC r32 r32
3014// 	CMOVLOC m32 r32
3015func CMOVLOC(mr, r operand.Op) (*intrep.Instruction, error) {
3016	switch {
3017	case operand.IsR32(mr) && operand.IsR32(r):
3018		return &intrep.Instruction{
3019			Opcode:   "CMOVLOC",
3020			Operands: []operand.Op{mr, r},
3021			Inputs:   []operand.Op{mr, r},
3022			Outputs:  []operand.Op{r},
3023			ISA:      []string{"CMOV"},
3024		}, nil
3025	case operand.IsM32(mr) && operand.IsR32(r):
3026		return &intrep.Instruction{
3027			Opcode:   "CMOVLOC",
3028			Operands: []operand.Op{mr, r},
3029			Inputs:   []operand.Op{mr, r},
3030			Outputs:  []operand.Op{r},
3031			ISA:      []string{"CMOV"},
3032		}, nil
3033	}
3034	return nil, errors.New("CMOVLOC: bad operands")
3035}
3036
3037// CMOVLOS: Move if overflow (OF == 1).
3038//
3039// Forms:
3040//
3041// 	CMOVLOS r32 r32
3042// 	CMOVLOS m32 r32
3043func CMOVLOS(mr, r operand.Op) (*intrep.Instruction, error) {
3044	switch {
3045	case operand.IsR32(mr) && operand.IsR32(r):
3046		return &intrep.Instruction{
3047			Opcode:   "CMOVLOS",
3048			Operands: []operand.Op{mr, r},
3049			Inputs:   []operand.Op{mr, r},
3050			Outputs:  []operand.Op{r},
3051			ISA:      []string{"CMOV"},
3052		}, nil
3053	case operand.IsM32(mr) && operand.IsR32(r):
3054		return &intrep.Instruction{
3055			Opcode:   "CMOVLOS",
3056			Operands: []operand.Op{mr, r},
3057			Inputs:   []operand.Op{mr, r},
3058			Outputs:  []operand.Op{r},
3059			ISA:      []string{"CMOV"},
3060		}, nil
3061	}
3062	return nil, errors.New("CMOVLOS: bad operands")
3063}
3064
3065// CMOVLPC: Move if not parity (PF == 0).
3066//
3067// Forms:
3068//
3069// 	CMOVLPC r32 r32
3070// 	CMOVLPC m32 r32
3071func CMOVLPC(mr, r operand.Op) (*intrep.Instruction, error) {
3072	switch {
3073	case operand.IsR32(mr) && operand.IsR32(r):
3074		return &intrep.Instruction{
3075			Opcode:   "CMOVLPC",
3076			Operands: []operand.Op{mr, r},
3077			Inputs:   []operand.Op{mr, r},
3078			Outputs:  []operand.Op{r},
3079			ISA:      []string{"CMOV"},
3080		}, nil
3081	case operand.IsM32(mr) && operand.IsR32(r):
3082		return &intrep.Instruction{
3083			Opcode:   "CMOVLPC",
3084			Operands: []operand.Op{mr, r},
3085			Inputs:   []operand.Op{mr, r},
3086			Outputs:  []operand.Op{r},
3087			ISA:      []string{"CMOV"},
3088		}, nil
3089	}
3090	return nil, errors.New("CMOVLPC: bad operands")
3091}
3092
3093// CMOVLPL: Move if not sign (SF == 0).
3094//
3095// Forms:
3096//
3097// 	CMOVLPL r32 r32
3098// 	CMOVLPL m32 r32
3099func CMOVLPL(mr, r operand.Op) (*intrep.Instruction, error) {
3100	switch {
3101	case operand.IsR32(mr) && operand.IsR32(r):
3102		return &intrep.Instruction{
3103			Opcode:   "CMOVLPL",
3104			Operands: []operand.Op{mr, r},
3105			Inputs:   []operand.Op{mr, r},
3106			Outputs:  []operand.Op{r},
3107			ISA:      []string{"CMOV"},
3108		}, nil
3109	case operand.IsM32(mr) && operand.IsR32(r):
3110		return &intrep.Instruction{
3111			Opcode:   "CMOVLPL",
3112			Operands: []operand.Op{mr, r},
3113			Inputs:   []operand.Op{mr, r},
3114			Outputs:  []operand.Op{r},
3115			ISA:      []string{"CMOV"},
3116		}, nil
3117	}
3118	return nil, errors.New("CMOVLPL: bad operands")
3119}
3120
3121// CMOVLPS: Move if parity (PF == 1).
3122//
3123// Forms:
3124//
3125// 	CMOVLPS r32 r32
3126// 	CMOVLPS m32 r32
3127func CMOVLPS(mr, r operand.Op) (*intrep.Instruction, error) {
3128	switch {
3129	case operand.IsR32(mr) && operand.IsR32(r):
3130		return &intrep.Instruction{
3131			Opcode:   "CMOVLPS",
3132			Operands: []operand.Op{mr, r},
3133			Inputs:   []operand.Op{mr, r},
3134			Outputs:  []operand.Op{r},
3135			ISA:      []string{"CMOV"},
3136		}, nil
3137	case operand.IsM32(mr) && operand.IsR32(r):
3138		return &intrep.Instruction{
3139			Opcode:   "CMOVLPS",
3140			Operands: []operand.Op{mr, r},
3141			Inputs:   []operand.Op{mr, r},
3142			Outputs:  []operand.Op{r},
3143			ISA:      []string{"CMOV"},
3144		}, nil
3145	}
3146	return nil, errors.New("CMOVLPS: bad operands")
3147}
3148
3149// CMOVQCC: Move if above or equal (CF == 0).
3150//
3151// Forms:
3152//
3153// 	CMOVQCC r64 r64
3154// 	CMOVQCC m64 r64
3155func CMOVQCC(mr, r operand.Op) (*intrep.Instruction, error) {
3156	switch {
3157	case operand.IsR64(mr) && operand.IsR64(r):
3158		return &intrep.Instruction{
3159			Opcode:   "CMOVQCC",
3160			Operands: []operand.Op{mr, r},
3161			Inputs:   []operand.Op{mr, r},
3162			Outputs:  []operand.Op{r},
3163			ISA:      []string{"CMOV"},
3164		}, nil
3165	case operand.IsM64(mr) && operand.IsR64(r):
3166		return &intrep.Instruction{
3167			Opcode:   "CMOVQCC",
3168			Operands: []operand.Op{mr, r},
3169			Inputs:   []operand.Op{mr, r},
3170			Outputs:  []operand.Op{r},
3171			ISA:      []string{"CMOV"},
3172		}, nil
3173	}
3174	return nil, errors.New("CMOVQCC: bad operands")
3175}
3176
3177// CMOVQCS: Move if below (CF == 1).
3178//
3179// Forms:
3180//
3181// 	CMOVQCS r64 r64
3182// 	CMOVQCS m64 r64
3183func CMOVQCS(mr, r operand.Op) (*intrep.Instruction, error) {
3184	switch {
3185	case operand.IsR64(mr) && operand.IsR64(r):
3186		return &intrep.Instruction{
3187			Opcode:   "CMOVQCS",
3188			Operands: []operand.Op{mr, r},
3189			Inputs:   []operand.Op{mr, r},
3190			Outputs:  []operand.Op{r},
3191			ISA:      []string{"CMOV"},
3192		}, nil
3193	case operand.IsM64(mr) && operand.IsR64(r):
3194		return &intrep.Instruction{
3195			Opcode:   "CMOVQCS",
3196			Operands: []operand.Op{mr, r},
3197			Inputs:   []operand.Op{mr, r},
3198			Outputs:  []operand.Op{r},
3199			ISA:      []string{"CMOV"},
3200		}, nil
3201	}
3202	return nil, errors.New("CMOVQCS: bad operands")
3203}
3204
3205// CMOVQEQ: Move if equal (ZF == 1).
3206//
3207// Forms:
3208//
3209// 	CMOVQEQ r64 r64
3210// 	CMOVQEQ m64 r64
3211func CMOVQEQ(mr, r operand.Op) (*intrep.Instruction, error) {
3212	switch {
3213	case operand.IsR64(mr) && operand.IsR64(r):
3214		return &intrep.Instruction{
3215			Opcode:   "CMOVQEQ",
3216			Operands: []operand.Op{mr, r},
3217			Inputs:   []operand.Op{mr, r},
3218			Outputs:  []operand.Op{r},
3219			ISA:      []string{"CMOV"},
3220		}, nil
3221	case operand.IsM64(mr) && operand.IsR64(r):
3222		return &intrep.Instruction{
3223			Opcode:   "CMOVQEQ",
3224			Operands: []operand.Op{mr, r},
3225			Inputs:   []operand.Op{mr, r},
3226			Outputs:  []operand.Op{r},
3227			ISA:      []string{"CMOV"},
3228		}, nil
3229	}
3230	return nil, errors.New("CMOVQEQ: bad operands")
3231}
3232
3233// CMOVQGE: Move if greater or equal (SF == OF).
3234//
3235// Forms:
3236//
3237// 	CMOVQGE r64 r64
3238// 	CMOVQGE m64 r64
3239func CMOVQGE(mr, r operand.Op) (*intrep.Instruction, error) {
3240	switch {
3241	case operand.IsR64(mr) && operand.IsR64(r):
3242		return &intrep.Instruction{
3243			Opcode:   "CMOVQGE",
3244			Operands: []operand.Op{mr, r},
3245			Inputs:   []operand.Op{mr, r},
3246			Outputs:  []operand.Op{r},
3247			ISA:      []string{"CMOV"},
3248		}, nil
3249	case operand.IsM64(mr) && operand.IsR64(r):
3250		return &intrep.Instruction{
3251			Opcode:   "CMOVQGE",
3252			Operands: []operand.Op{mr, r},
3253			Inputs:   []operand.Op{mr, r},
3254			Outputs:  []operand.Op{r},
3255			ISA:      []string{"CMOV"},
3256		}, nil
3257	}
3258	return nil, errors.New("CMOVQGE: bad operands")
3259}
3260
3261// CMOVQGT: Move if greater (ZF == 0 and SF == OF).
3262//
3263// Forms:
3264//
3265// 	CMOVQGT r64 r64
3266// 	CMOVQGT m64 r64
3267func CMOVQGT(mr, r operand.Op) (*intrep.Instruction, error) {
3268	switch {
3269	case operand.IsR64(mr) && operand.IsR64(r):
3270		return &intrep.Instruction{
3271			Opcode:   "CMOVQGT",
3272			Operands: []operand.Op{mr, r},
3273			Inputs:   []operand.Op{mr, r},
3274			Outputs:  []operand.Op{r},
3275			ISA:      []string{"CMOV"},
3276		}, nil
3277	case operand.IsM64(mr) && operand.IsR64(r):
3278		return &intrep.Instruction{
3279			Opcode:   "CMOVQGT",
3280			Operands: []operand.Op{mr, r},
3281			Inputs:   []operand.Op{mr, r},
3282			Outputs:  []operand.Op{r},
3283			ISA:      []string{"CMOV"},
3284		}, nil
3285	}
3286	return nil, errors.New("CMOVQGT: bad operands")
3287}
3288
3289// CMOVQHI: Move if above (CF == 0 and ZF == 0).
3290//
3291// Forms:
3292//
3293// 	CMOVQHI r64 r64
3294// 	CMOVQHI m64 r64
3295func CMOVQHI(mr, r operand.Op) (*intrep.Instruction, error) {
3296	switch {
3297	case operand.IsR64(mr) && operand.IsR64(r):
3298		return &intrep.Instruction{
3299			Opcode:   "CMOVQHI",
3300			Operands: []operand.Op{mr, r},
3301			Inputs:   []operand.Op{mr, r},
3302			Outputs:  []operand.Op{r},
3303			ISA:      []string{"CMOV"},
3304		}, nil
3305	case operand.IsM64(mr) && operand.IsR64(r):
3306		return &intrep.Instruction{
3307			Opcode:   "CMOVQHI",
3308			Operands: []operand.Op{mr, r},
3309			Inputs:   []operand.Op{mr, r},
3310			Outputs:  []operand.Op{r},
3311			ISA:      []string{"CMOV"},
3312		}, nil
3313	}
3314	return nil, errors.New("CMOVQHI: bad operands")
3315}
3316
3317// CMOVQLE: Move if less or equal (ZF == 1 or SF != OF).
3318//
3319// Forms:
3320//
3321// 	CMOVQLE r64 r64
3322// 	CMOVQLE m64 r64
3323func CMOVQLE(mr, r operand.Op) (*intrep.Instruction, error) {
3324	switch {
3325	case operand.IsR64(mr) && operand.IsR64(r):
3326		return &intrep.Instruction{
3327			Opcode:   "CMOVQLE",
3328			Operands: []operand.Op{mr, r},
3329			Inputs:   []operand.Op{mr, r},
3330			Outputs:  []operand.Op{r},
3331			ISA:      []string{"CMOV"},
3332		}, nil
3333	case operand.IsM64(mr) && operand.IsR64(r):
3334		return &intrep.Instruction{
3335			Opcode:   "CMOVQLE",
3336			Operands: []operand.Op{mr, r},
3337			Inputs:   []operand.Op{mr, r},
3338			Outputs:  []operand.Op{r},
3339			ISA:      []string{"CMOV"},
3340		}, nil
3341	}
3342	return nil, errors.New("CMOVQLE: bad operands")
3343}
3344
3345// CMOVQLS: Move if below or equal (CF == 1 or ZF == 1).
3346//
3347// Forms:
3348//
3349// 	CMOVQLS r64 r64
3350// 	CMOVQLS m64 r64
3351func CMOVQLS(mr, r operand.Op) (*intrep.Instruction, error) {
3352	switch {
3353	case operand.IsR64(mr) && operand.IsR64(r):
3354		return &intrep.Instruction{
3355			Opcode:   "CMOVQLS",
3356			Operands: []operand.Op{mr, r},
3357			Inputs:   []operand.Op{mr, r},
3358			Outputs:  []operand.Op{r},
3359			ISA:      []string{"CMOV"},
3360		}, nil
3361	case operand.IsM64(mr) && operand.IsR64(r):
3362		return &intrep.Instruction{
3363			Opcode:   "CMOVQLS",
3364			Operands: []operand.Op{mr, r},
3365			Inputs:   []operand.Op{mr, r},
3366			Outputs:  []operand.Op{r},
3367			ISA:      []string{"CMOV"},
3368		}, nil
3369	}
3370	return nil, errors.New("CMOVQLS: bad operands")
3371}
3372
3373// CMOVQLT: Move if less (SF != OF).
3374//
3375// Forms:
3376//
3377// 	CMOVQLT r64 r64
3378// 	CMOVQLT m64 r64
3379func CMOVQLT(mr, r operand.Op) (*intrep.Instruction, error) {
3380	switch {
3381	case operand.IsR64(mr) && operand.IsR64(r):
3382		return &intrep.Instruction{
3383			Opcode:   "CMOVQLT",
3384			Operands: []operand.Op{mr, r},
3385			Inputs:   []operand.Op{mr, r},
3386			Outputs:  []operand.Op{r},
3387			ISA:      []string{"CMOV"},
3388		}, nil
3389	case operand.IsM64(mr) && operand.IsR64(r):
3390		return &intrep.Instruction{
3391			Opcode:   "CMOVQLT",
3392			Operands: []operand.Op{mr, r},
3393			Inputs:   []operand.Op{mr, r},
3394			Outputs:  []operand.Op{r},
3395			ISA:      []string{"CMOV"},
3396		}, nil
3397	}
3398	return nil, errors.New("CMOVQLT: bad operands")
3399}
3400
3401// CMOVQMI: Move if sign (SF == 1).
3402//
3403// Forms:
3404//
3405// 	CMOVQMI r64 r64
3406// 	CMOVQMI m64 r64
3407func CMOVQMI(mr, r operand.Op) (*intrep.Instruction, error) {
3408	switch {
3409	case operand.IsR64(mr) && operand.IsR64(r):
3410		return &intrep.Instruction{
3411			Opcode:   "CMOVQMI",
3412			Operands: []operand.Op{mr, r},
3413			Inputs:   []operand.Op{mr, r},
3414			Outputs:  []operand.Op{r},
3415			ISA:      []string{"CMOV"},
3416		}, nil
3417	case operand.IsM64(mr) && operand.IsR64(r):
3418		return &intrep.Instruction{
3419			Opcode:   "CMOVQMI",
3420			Operands: []operand.Op{mr, r},
3421			Inputs:   []operand.Op{mr, r},
3422			Outputs:  []operand.Op{r},
3423			ISA:      []string{"CMOV"},
3424		}, nil
3425	}
3426	return nil, errors.New("CMOVQMI: bad operands")
3427}
3428
3429// CMOVQNE: Move if not equal (ZF == 0).
3430//
3431// Forms:
3432//
3433// 	CMOVQNE r64 r64
3434// 	CMOVQNE m64 r64
3435func CMOVQNE(mr, r operand.Op) (*intrep.Instruction, error) {
3436	switch {
3437	case operand.IsR64(mr) && operand.IsR64(r):
3438		return &intrep.Instruction{
3439			Opcode:   "CMOVQNE",
3440			Operands: []operand.Op{mr, r},
3441			Inputs:   []operand.Op{mr, r},
3442			Outputs:  []operand.Op{r},
3443			ISA:      []string{"CMOV"},
3444		}, nil
3445	case operand.IsM64(mr) && operand.IsR64(r):
3446		return &intrep.Instruction{
3447			Opcode:   "CMOVQNE",
3448			Operands: []operand.Op{mr, r},
3449			Inputs:   []operand.Op{mr, r},
3450			Outputs:  []operand.Op{r},
3451			ISA:      []string{"CMOV"},
3452		}, nil
3453	}
3454	return nil, errors.New("CMOVQNE: bad operands")
3455}
3456
3457// CMOVQOC: Move if not overflow (OF == 0).
3458//
3459// Forms:
3460//
3461// 	CMOVQOC r64 r64
3462// 	CMOVQOC m64 r64
3463func CMOVQOC(mr, r operand.Op) (*intrep.Instruction, error) {
3464	switch {
3465	case operand.IsR64(mr) && operand.IsR64(r):
3466		return &intrep.Instruction{
3467			Opcode:   "CMOVQOC",
3468			Operands: []operand.Op{mr, r},
3469			Inputs:   []operand.Op{mr, r},
3470			Outputs:  []operand.Op{r},
3471			ISA:      []string{"CMOV"},
3472		}, nil
3473	case operand.IsM64(mr) && operand.IsR64(r):
3474		return &intrep.Instruction{
3475			Opcode:   "CMOVQOC",
3476			Operands: []operand.Op{mr, r},
3477			Inputs:   []operand.Op{mr, r},
3478			Outputs:  []operand.Op{r},
3479			ISA:      []string{"CMOV"},
3480		}, nil
3481	}
3482	return nil, errors.New("CMOVQOC: bad operands")
3483}
3484
3485// CMOVQOS: Move if overflow (OF == 1).
3486//
3487// Forms:
3488//
3489// 	CMOVQOS r64 r64
3490// 	CMOVQOS m64 r64
3491func CMOVQOS(mr, r operand.Op) (*intrep.Instruction, error) {
3492	switch {
3493	case operand.IsR64(mr) && operand.IsR64(r):
3494		return &intrep.Instruction{
3495			Opcode:   "CMOVQOS",
3496			Operands: []operand.Op{mr, r},
3497			Inputs:   []operand.Op{mr, r},
3498			Outputs:  []operand.Op{r},
3499			ISA:      []string{"CMOV"},
3500		}, nil
3501	case operand.IsM64(mr) && operand.IsR64(r):
3502		return &intrep.Instruction{
3503			Opcode:   "CMOVQOS",
3504			Operands: []operand.Op{mr, r},
3505			Inputs:   []operand.Op{mr, r},
3506			Outputs:  []operand.Op{r},
3507			ISA:      []string{"CMOV"},
3508		}, nil
3509	}
3510	return nil, errors.New("CMOVQOS: bad operands")
3511}
3512
3513// CMOVQPC: Move if not parity (PF == 0).
3514//
3515// Forms:
3516//
3517// 	CMOVQPC r64 r64
3518// 	CMOVQPC m64 r64
3519func CMOVQPC(mr, r operand.Op) (*intrep.Instruction, error) {
3520	switch {
3521	case operand.IsR64(mr) && operand.IsR64(r):
3522		return &intrep.Instruction{
3523			Opcode:   "CMOVQPC",
3524			Operands: []operand.Op{mr, r},
3525			Inputs:   []operand.Op{mr, r},
3526			Outputs:  []operand.Op{r},
3527			ISA:      []string{"CMOV"},
3528		}, nil
3529	case operand.IsM64(mr) && operand.IsR64(r):
3530		return &intrep.Instruction{
3531			Opcode:   "CMOVQPC",
3532			Operands: []operand.Op{mr, r},
3533			Inputs:   []operand.Op{mr, r},
3534			Outputs:  []operand.Op{r},
3535			ISA:      []string{"CMOV"},
3536		}, nil
3537	}
3538	return nil, errors.New("CMOVQPC: bad operands")
3539}
3540
3541// CMOVQPL: Move if not sign (SF == 0).
3542//
3543// Forms:
3544//
3545// 	CMOVQPL r64 r64
3546// 	CMOVQPL m64 r64
3547func CMOVQPL(mr, r operand.Op) (*intrep.Instruction, error) {
3548	switch {
3549	case operand.IsR64(mr) && operand.IsR64(r):
3550		return &intrep.Instruction{
3551			Opcode:   "CMOVQPL",
3552			Operands: []operand.Op{mr, r},
3553			Inputs:   []operand.Op{mr, r},
3554			Outputs:  []operand.Op{r},
3555			ISA:      []string{"CMOV"},
3556		}, nil
3557	case operand.IsM64(mr) && operand.IsR64(r):
3558		return &intrep.Instruction{
3559			Opcode:   "CMOVQPL",
3560			Operands: []operand.Op{mr, r},
3561			Inputs:   []operand.Op{mr, r},
3562			Outputs:  []operand.Op{r},
3563			ISA:      []string{"CMOV"},
3564		}, nil
3565	}
3566	return nil, errors.New("CMOVQPL: bad operands")
3567}
3568
3569// CMOVQPS: Move if parity (PF == 1).
3570//
3571// Forms:
3572//
3573// 	CMOVQPS r64 r64
3574// 	CMOVQPS m64 r64
3575func CMOVQPS(mr, r operand.Op) (*intrep.Instruction, error) {
3576	switch {
3577	case operand.IsR64(mr) && operand.IsR64(r):
3578		return &intrep.Instruction{
3579			Opcode:   "CMOVQPS",
3580			Operands: []operand.Op{mr, r},
3581			Inputs:   []operand.Op{mr, r},
3582			Outputs:  []operand.Op{r},
3583			ISA:      []string{"CMOV"},
3584		}, nil
3585	case operand.IsM64(mr) && operand.IsR64(r):
3586		return &intrep.Instruction{
3587			Opcode:   "CMOVQPS",
3588			Operands: []operand.Op{mr, r},
3589			Inputs:   []operand.Op{mr, r},
3590			Outputs:  []operand.Op{r},
3591			ISA:      []string{"CMOV"},
3592		}, nil
3593	}
3594	return nil, errors.New("CMOVQPS: bad operands")
3595}
3596
3597// CMOVWCC: Move if above or equal (CF == 0).
3598//
3599// Forms:
3600//
3601// 	CMOVWCC r16 r16
3602// 	CMOVWCC m16 r16
3603func CMOVWCC(mr, r operand.Op) (*intrep.Instruction, error) {
3604	switch {
3605	case operand.IsR16(mr) && operand.IsR16(r):
3606		return &intrep.Instruction{
3607			Opcode:   "CMOVWCC",
3608			Operands: []operand.Op{mr, r},
3609			Inputs:   []operand.Op{mr, r},
3610			Outputs:  []operand.Op{r},
3611			ISA:      []string{"CMOV"},
3612		}, nil
3613	case operand.IsM16(mr) && operand.IsR16(r):
3614		return &intrep.Instruction{
3615			Opcode:   "CMOVWCC",
3616			Operands: []operand.Op{mr, r},
3617			Inputs:   []operand.Op{mr, r},
3618			Outputs:  []operand.Op{r},
3619			ISA:      []string{"CMOV"},
3620		}, nil
3621	}
3622	return nil, errors.New("CMOVWCC: bad operands")
3623}
3624
3625// CMOVWCS: Move if below (CF == 1).
3626//
3627// Forms:
3628//
3629// 	CMOVWCS r16 r16
3630// 	CMOVWCS m16 r16
3631func CMOVWCS(mr, r operand.Op) (*intrep.Instruction, error) {
3632	switch {
3633	case operand.IsR16(mr) && operand.IsR16(r):
3634		return &intrep.Instruction{
3635			Opcode:   "CMOVWCS",
3636			Operands: []operand.Op{mr, r},
3637			Inputs:   []operand.Op{mr, r},
3638			Outputs:  []operand.Op{r},
3639			ISA:      []string{"CMOV"},
3640		}, nil
3641	case operand.IsM16(mr) && operand.IsR16(r):
3642		return &intrep.Instruction{
3643			Opcode:   "CMOVWCS",
3644			Operands: []operand.Op{mr, r},
3645			Inputs:   []operand.Op{mr, r},
3646			Outputs:  []operand.Op{r},
3647			ISA:      []string{"CMOV"},
3648		}, nil
3649	}
3650	return nil, errors.New("CMOVWCS: bad operands")
3651}
3652
3653// CMOVWEQ: Move if equal (ZF == 1).
3654//
3655// Forms:
3656//
3657// 	CMOVWEQ r16 r16
3658// 	CMOVWEQ m16 r16
3659func CMOVWEQ(mr, r operand.Op) (*intrep.Instruction, error) {
3660	switch {
3661	case operand.IsR16(mr) && operand.IsR16(r):
3662		return &intrep.Instruction{
3663			Opcode:   "CMOVWEQ",
3664			Operands: []operand.Op{mr, r},
3665			Inputs:   []operand.Op{mr, r},
3666			Outputs:  []operand.Op{r},
3667			ISA:      []string{"CMOV"},
3668		}, nil
3669	case operand.IsM16(mr) && operand.IsR16(r):
3670		return &intrep.Instruction{
3671			Opcode:   "CMOVWEQ",
3672			Operands: []operand.Op{mr, r},
3673			Inputs:   []operand.Op{mr, r},
3674			Outputs:  []operand.Op{r},
3675			ISA:      []string{"CMOV"},
3676		}, nil
3677	}
3678	return nil, errors.New("CMOVWEQ: bad operands")
3679}
3680
3681// CMOVWGE: Move if greater or equal (SF == OF).
3682//
3683// Forms:
3684//
3685// 	CMOVWGE r16 r16
3686// 	CMOVWGE m16 r16
3687func CMOVWGE(mr, r operand.Op) (*intrep.Instruction, error) {
3688	switch {
3689	case operand.IsR16(mr) && operand.IsR16(r):
3690		return &intrep.Instruction{
3691			Opcode:   "CMOVWGE",
3692			Operands: []operand.Op{mr, r},
3693			Inputs:   []operand.Op{mr, r},
3694			Outputs:  []operand.Op{r},
3695			ISA:      []string{"CMOV"},
3696		}, nil
3697	case operand.IsM16(mr) && operand.IsR16(r):
3698		return &intrep.Instruction{
3699			Opcode:   "CMOVWGE",
3700			Operands: []operand.Op{mr, r},
3701			Inputs:   []operand.Op{mr, r},
3702			Outputs:  []operand.Op{r},
3703			ISA:      []string{"CMOV"},
3704		}, nil
3705	}
3706	return nil, errors.New("CMOVWGE: bad operands")
3707}
3708
3709// CMOVWGT: Move if greater (ZF == 0 and SF == OF).
3710//
3711// Forms:
3712//
3713// 	CMOVWGT r16 r16
3714// 	CMOVWGT m16 r16
3715func CMOVWGT(mr, r operand.Op) (*intrep.Instruction, error) {
3716	switch {
3717	case operand.IsR16(mr) && operand.IsR16(r):
3718		return &intrep.Instruction{
3719			Opcode:   "CMOVWGT",
3720			Operands: []operand.Op{mr, r},
3721			Inputs:   []operand.Op{mr, r},
3722			Outputs:  []operand.Op{r},
3723			ISA:      []string{"CMOV"},
3724		}, nil
3725	case operand.IsM16(mr) && operand.IsR16(r):
3726		return &intrep.Instruction{
3727			Opcode:   "CMOVWGT",
3728			Operands: []operand.Op{mr, r},
3729			Inputs:   []operand.Op{mr, r},
3730			Outputs:  []operand.Op{r},
3731			ISA:      []string{"CMOV"},
3732		}, nil
3733	}
3734	return nil, errors.New("CMOVWGT: bad operands")
3735}
3736
3737// CMOVWHI: Move if above (CF == 0 and ZF == 0).
3738//
3739// Forms:
3740//
3741// 	CMOVWHI r16 r16
3742// 	CMOVWHI m16 r16
3743func CMOVWHI(mr, r operand.Op) (*intrep.Instruction, error) {
3744	switch {
3745	case operand.IsR16(mr) && operand.IsR16(r):
3746		return &intrep.Instruction{
3747			Opcode:   "CMOVWHI",
3748			Operands: []operand.Op{mr, r},
3749			Inputs:   []operand.Op{mr, r},
3750			Outputs:  []operand.Op{r},
3751			ISA:      []string{"CMOV"},
3752		}, nil
3753	case operand.IsM16(mr) && operand.IsR16(r):
3754		return &intrep.Instruction{
3755			Opcode:   "CMOVWHI",
3756			Operands: []operand.Op{mr, r},
3757			Inputs:   []operand.Op{mr, r},
3758			Outputs:  []operand.Op{r},
3759			ISA:      []string{"CMOV"},
3760		}, nil
3761	}
3762	return nil, errors.New("CMOVWHI: bad operands")
3763}
3764
3765// CMOVWLE: Move if less or equal (ZF == 1 or SF != OF).
3766//
3767// Forms:
3768//
3769// 	CMOVWLE r16 r16
3770// 	CMOVWLE m16 r16
3771func CMOVWLE(mr, r operand.Op) (*intrep.Instruction, error) {
3772	switch {
3773	case operand.IsR16(mr) && operand.IsR16(r):
3774		return &intrep.Instruction{
3775			Opcode:   "CMOVWLE",
3776			Operands: []operand.Op{mr, r},
3777			Inputs:   []operand.Op{mr, r},
3778			Outputs:  []operand.Op{r},
3779			ISA:      []string{"CMOV"},
3780		}, nil
3781	case operand.IsM16(mr) && operand.IsR16(r):
3782		return &intrep.Instruction{
3783			Opcode:   "CMOVWLE",
3784			Operands: []operand.Op{mr, r},
3785			Inputs:   []operand.Op{mr, r},
3786			Outputs:  []operand.Op{r},
3787			ISA:      []string{"CMOV"},
3788		}, nil
3789	}
3790	return nil, errors.New("CMOVWLE: bad operands")
3791}
3792
3793// CMOVWLS: Move if below or equal (CF == 1 or ZF == 1).
3794//
3795// Forms:
3796//
3797// 	CMOVWLS r16 r16
3798// 	CMOVWLS m16 r16
3799func CMOVWLS(mr, r operand.Op) (*intrep.Instruction, error) {
3800	switch {
3801	case operand.IsR16(mr) && operand.IsR16(r):
3802		return &intrep.Instruction{
3803			Opcode:   "CMOVWLS",
3804			Operands: []operand.Op{mr, r},
3805			Inputs:   []operand.Op{mr, r},
3806			Outputs:  []operand.Op{r},
3807			ISA:      []string{"CMOV"},
3808		}, nil
3809	case operand.IsM16(mr) && operand.IsR16(r):
3810		return &intrep.Instruction{
3811			Opcode:   "CMOVWLS",
3812			Operands: []operand.Op{mr, r},
3813			Inputs:   []operand.Op{mr, r},
3814			Outputs:  []operand.Op{r},
3815			ISA:      []string{"CMOV"},
3816		}, nil
3817	}
3818	return nil, errors.New("CMOVWLS: bad operands")
3819}
3820
3821// CMOVWLT: Move if less (SF != OF).
3822//
3823// Forms:
3824//
3825// 	CMOVWLT r16 r16
3826// 	CMOVWLT m16 r16
3827func CMOVWLT(mr, r operand.Op) (*intrep.Instruction, error) {
3828	switch {
3829	case operand.IsR16(mr) && operand.IsR16(r):
3830		return &intrep.Instruction{
3831			Opcode:   "CMOVWLT",
3832			Operands: []operand.Op{mr, r},
3833			Inputs:   []operand.Op{mr, r},
3834			Outputs:  []operand.Op{r},
3835			ISA:      []string{"CMOV"},
3836		}, nil
3837	case operand.IsM16(mr) && operand.IsR16(r):
3838		return &intrep.Instruction{
3839			Opcode:   "CMOVWLT",
3840			Operands: []operand.Op{mr, r},
3841			Inputs:   []operand.Op{mr, r},
3842			Outputs:  []operand.Op{r},
3843			ISA:      []string{"CMOV"},
3844		}, nil
3845	}
3846	return nil, errors.New("CMOVWLT: bad operands")
3847}
3848
3849// CMOVWMI: Move if sign (SF == 1).
3850//
3851// Forms:
3852//
3853// 	CMOVWMI r16 r16
3854// 	CMOVWMI m16 r16
3855func CMOVWMI(mr, r operand.Op) (*intrep.Instruction, error) {
3856	switch {
3857	case operand.IsR16(mr) && operand.IsR16(r):
3858		return &intrep.Instruction{
3859			Opcode:   "CMOVWMI",
3860			Operands: []operand.Op{mr, r},
3861			Inputs:   []operand.Op{mr, r},
3862			Outputs:  []operand.Op{r},
3863			ISA:      []string{"CMOV"},
3864		}, nil
3865	case operand.IsM16(mr) && operand.IsR16(r):
3866		return &intrep.Instruction{
3867			Opcode:   "CMOVWMI",
3868			Operands: []operand.Op{mr, r},
3869			Inputs:   []operand.Op{mr, r},
3870			Outputs:  []operand.Op{r},
3871			ISA:      []string{"CMOV"},
3872		}, nil
3873	}
3874	return nil, errors.New("CMOVWMI: bad operands")
3875}
3876
3877// CMOVWNE: Move if not equal (ZF == 0).
3878//
3879// Forms:
3880//
3881// 	CMOVWNE r16 r16
3882// 	CMOVWNE m16 r16
3883func CMOVWNE(mr, r operand.Op) (*intrep.Instruction, error) {
3884	switch {
3885	case operand.IsR16(mr) && operand.IsR16(r):
3886		return &intrep.Instruction{
3887			Opcode:   "CMOVWNE",
3888			Operands: []operand.Op{mr, r},
3889			Inputs:   []operand.Op{mr, r},
3890			Outputs:  []operand.Op{r},
3891			ISA:      []string{"CMOV"},
3892		}, nil
3893	case operand.IsM16(mr) && operand.IsR16(r):
3894		return &intrep.Instruction{
3895			Opcode:   "CMOVWNE",
3896			Operands: []operand.Op{mr, r},
3897			Inputs:   []operand.Op{mr, r},
3898			Outputs:  []operand.Op{r},
3899			ISA:      []string{"CMOV"},
3900		}, nil
3901	}
3902	return nil, errors.New("CMOVWNE: bad operands")
3903}
3904
3905// CMOVWOC: Move if not overflow (OF == 0).
3906//
3907// Forms:
3908//
3909// 	CMOVWOC r16 r16
3910// 	CMOVWOC m16 r16
3911func CMOVWOC(mr, r operand.Op) (*intrep.Instruction, error) {
3912	switch {
3913	case operand.IsR16(mr) && operand.IsR16(r):
3914		return &intrep.Instruction{
3915			Opcode:   "CMOVWOC",
3916			Operands: []operand.Op{mr, r},
3917			Inputs:   []operand.Op{mr, r},
3918			Outputs:  []operand.Op{r},
3919			ISA:      []string{"CMOV"},
3920		}, nil
3921	case operand.IsM16(mr) && operand.IsR16(r):
3922		return &intrep.Instruction{
3923			Opcode:   "CMOVWOC",
3924			Operands: []operand.Op{mr, r},
3925			Inputs:   []operand.Op{mr, r},
3926			Outputs:  []operand.Op{r},
3927			ISA:      []string{"CMOV"},
3928		}, nil
3929	}
3930	return nil, errors.New("CMOVWOC: bad operands")
3931}
3932
3933// CMOVWOS: Move if overflow (OF == 1).
3934//
3935// Forms:
3936//
3937// 	CMOVWOS r16 r16
3938// 	CMOVWOS m16 r16
3939func CMOVWOS(mr, r operand.Op) (*intrep.Instruction, error) {
3940	switch {
3941	case operand.IsR16(mr) && operand.IsR16(r):
3942		return &intrep.Instruction{
3943			Opcode:   "CMOVWOS",
3944			Operands: []operand.Op{mr, r},
3945			Inputs:   []operand.Op{mr, r},
3946			Outputs:  []operand.Op{r},
3947			ISA:      []string{"CMOV"},
3948		}, nil
3949	case operand.IsM16(mr) && operand.IsR16(r):
3950		return &intrep.Instruction{
3951			Opcode:   "CMOVWOS",
3952			Operands: []operand.Op{mr, r},
3953			Inputs:   []operand.Op{mr, r},
3954			Outputs:  []operand.Op{r},
3955			ISA:      []string{"CMOV"},
3956		}, nil
3957	}
3958	return nil, errors.New("CMOVWOS: bad operands")
3959}
3960
3961// CMOVWPC: Move if not parity (PF == 0).
3962//
3963// Forms:
3964//
3965// 	CMOVWPC r16 r16
3966// 	CMOVWPC m16 r16
3967func CMOVWPC(mr, r operand.Op) (*intrep.Instruction, error) {
3968	switch {
3969	case operand.IsR16(mr) && operand.IsR16(r):
3970		return &intrep.Instruction{
3971			Opcode:   "CMOVWPC",
3972			Operands: []operand.Op{mr, r},
3973			Inputs:   []operand.Op{mr, r},
3974			Outputs:  []operand.Op{r},
3975			ISA:      []string{"CMOV"},
3976		}, nil
3977	case operand.IsM16(mr) && operand.IsR16(r):
3978		return &intrep.Instruction{
3979			Opcode:   "CMOVWPC",
3980			Operands: []operand.Op{mr, r},
3981			Inputs:   []operand.Op{mr, r},
3982			Outputs:  []operand.Op{r},
3983			ISA:      []string{"CMOV"},
3984		}, nil
3985	}
3986	return nil, errors.New("CMOVWPC: bad operands")
3987}
3988
3989// CMOVWPL: Move if not sign (SF == 0).
3990//
3991// Forms:
3992//
3993// 	CMOVWPL r16 r16
3994// 	CMOVWPL m16 r16
3995func CMOVWPL(mr, r operand.Op) (*intrep.Instruction, error) {
3996	switch {
3997	case operand.IsR16(mr) && operand.IsR16(r):
3998		return &intrep.Instruction{
3999			Opcode:   "CMOVWPL",
4000			Operands: []operand.Op{mr, r},
4001			Inputs:   []operand.Op{mr, r},
4002			Outputs:  []operand.Op{r},
4003			ISA:      []string{"CMOV"},
4004		}, nil
4005	case operand.IsM16(mr) && operand.IsR16(r):
4006		return &intrep.Instruction{
4007			Opcode:   "CMOVWPL",
4008			Operands: []operand.Op{mr, r},
4009			Inputs:   []operand.Op{mr, r},
4010			Outputs:  []operand.Op{r},
4011			ISA:      []string{"CMOV"},
4012		}, nil
4013	}
4014	return nil, errors.New("CMOVWPL: bad operands")
4015}
4016
4017// CMOVWPS: Move if parity (PF == 1).
4018//
4019// Forms:
4020//
4021// 	CMOVWPS r16 r16
4022// 	CMOVWPS m16 r16
4023func CMOVWPS(mr, r operand.Op) (*intrep.Instruction, error) {
4024	switch {
4025	case operand.IsR16(mr) && operand.IsR16(r):
4026		return &intrep.Instruction{
4027			Opcode:   "CMOVWPS",
4028			Operands: []operand.Op{mr, r},
4029			Inputs:   []operand.Op{mr, r},
4030			Outputs:  []operand.Op{r},
4031			ISA:      []string{"CMOV"},
4032		}, nil
4033	case operand.IsM16(mr) && operand.IsR16(r):
4034		return &intrep.Instruction{
4035			Opcode:   "CMOVWPS",
4036			Operands: []operand.Op{mr, r},
4037			Inputs:   []operand.Op{mr, r},
4038			Outputs:  []operand.Op{r},
4039			ISA:      []string{"CMOV"},
4040		}, nil
4041	}
4042	return nil, errors.New("CMOVWPS: bad operands")
4043}
4044
4045// CMPB: Compare Two Operands.
4046//
4047// Forms:
4048//
4049// 	CMPB al imm8
4050// 	CMPB r8 imm8
4051// 	CMPB r8 r8
4052// 	CMPB r8 m8
4053// 	CMPB m8 imm8
4054// 	CMPB m8 r8
4055func CMPB(amr, imr operand.Op) (*intrep.Instruction, error) {
4056	switch {
4057	case operand.IsAL(amr) && operand.IsIMM8(imr):
4058		return &intrep.Instruction{
4059			Opcode:   "CMPB",
4060			Operands: []operand.Op{amr, imr},
4061			Inputs:   []operand.Op{amr},
4062			Outputs:  []operand.Op{},
4063		}, nil
4064	case operand.IsR8(amr) && operand.IsIMM8(imr):
4065		return &intrep.Instruction{
4066			Opcode:   "CMPB",
4067			Operands: []operand.Op{amr, imr},
4068			Inputs:   []operand.Op{amr},
4069			Outputs:  []operand.Op{},
4070		}, nil
4071	case operand.IsR8(amr) && operand.IsR8(imr):
4072		return &intrep.Instruction{
4073			Opcode:           "CMPB",
4074			Operands:         []operand.Op{amr, imr},
4075			Inputs:           []operand.Op{amr, imr},
4076			Outputs:          []operand.Op{},
4077			CancellingInputs: true,
4078		}, nil
4079	case operand.IsR8(amr) && operand.IsM8(imr):
4080		return &intrep.Instruction{
4081			Opcode:   "CMPB",
4082			Operands: []operand.Op{amr, imr},
4083			Inputs:   []operand.Op{amr, imr},
4084			Outputs:  []operand.Op{},
4085		}, nil
4086	case operand.IsM8(amr) && operand.IsIMM8(imr):
4087		return &intrep.Instruction{
4088			Opcode:   "CMPB",
4089			Operands: []operand.Op{amr, imr},
4090			Inputs:   []operand.Op{amr},
4091			Outputs:  []operand.Op{},
4092		}, nil
4093	case operand.IsM8(amr) && operand.IsR8(imr):
4094		return &intrep.Instruction{
4095			Opcode:   "CMPB",
4096			Operands: []operand.Op{amr, imr},
4097			Inputs:   []operand.Op{amr, imr},
4098			Outputs:  []operand.Op{},
4099		}, nil
4100	}
4101	return nil, errors.New("CMPB: bad operands")
4102}
4103
4104// CMPL: Compare Two Operands.
4105//
4106// Forms:
4107//
4108// 	CMPL eax imm32
4109// 	CMPL r32 imm8
4110// 	CMPL r32 imm32
4111// 	CMPL r32 r32
4112// 	CMPL r32 m32
4113// 	CMPL m32 imm8
4114// 	CMPL m32 imm32
4115// 	CMPL m32 r32
4116func CMPL(emr, imr operand.Op) (*intrep.Instruction, error) {
4117	switch {
4118	case operand.IsEAX(emr) && operand.IsIMM32(imr):
4119		return &intrep.Instruction{
4120			Opcode:   "CMPL",
4121			Operands: []operand.Op{emr, imr},
4122			Inputs:   []operand.Op{emr},
4123			Outputs:  []operand.Op{},
4124		}, nil
4125	case operand.IsR32(emr) && operand.IsIMM8(imr):
4126		return &intrep.Instruction{
4127			Opcode:   "CMPL",
4128			Operands: []operand.Op{emr, imr},
4129			Inputs:   []operand.Op{emr},
4130			Outputs:  []operand.Op{},
4131		}, nil
4132	case operand.IsR32(emr) && operand.IsIMM32(imr):
4133		return &intrep.Instruction{
4134			Opcode:   "CMPL",
4135			Operands: []operand.Op{emr, imr},
4136			Inputs:   []operand.Op{emr},
4137			Outputs:  []operand.Op{},
4138		}, nil
4139	case operand.IsR32(emr) && operand.IsR32(imr):
4140		return &intrep.Instruction{
4141			Opcode:           "CMPL",
4142			Operands:         []operand.Op{emr, imr},
4143			Inputs:           []operand.Op{emr, imr},
4144			Outputs:          []operand.Op{},
4145			CancellingInputs: true,
4146		}, nil
4147	case operand.IsR32(emr) && operand.IsM32(imr):
4148		return &intrep.Instruction{
4149			Opcode:   "CMPL",
4150			Operands: []operand.Op{emr, imr},
4151			Inputs:   []operand.Op{emr, imr},
4152			Outputs:  []operand.Op{},
4153		}, nil
4154	case operand.IsM32(emr) && operand.IsIMM8(imr):
4155		return &intrep.Instruction{
4156			Opcode:   "CMPL",
4157			Operands: []operand.Op{emr, imr},
4158			Inputs:   []operand.Op{emr},
4159			Outputs:  []operand.Op{},
4160		}, nil
4161	case operand.IsM32(emr) && operand.IsIMM32(imr):
4162		return &intrep.Instruction{
4163			Opcode:   "CMPL",
4164			Operands: []operand.Op{emr, imr},
4165			Inputs:   []operand.Op{emr},
4166			Outputs:  []operand.Op{},
4167		}, nil
4168	case operand.IsM32(emr) && operand.IsR32(imr):
4169		return &intrep.Instruction{
4170			Opcode:   "CMPL",
4171			Operands: []operand.Op{emr, imr},
4172			Inputs:   []operand.Op{emr, imr},
4173			Outputs:  []operand.Op{},
4174		}, nil
4175	}
4176	return nil, errors.New("CMPL: bad operands")
4177}
4178
4179// CMPPD: Compare Packed Double-Precision Floating-Point Values.
4180//
4181// Forms:
4182//
4183// 	CMPPD xmm  xmm imm8
4184// 	CMPPD m128 xmm imm8
4185func CMPPD(mx, x, i operand.Op) (*intrep.Instruction, error) {
4186	switch {
4187	case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsIMM8(i):
4188		return &intrep.Instruction{
4189			Opcode:   "CMPPD",
4190			Operands: []operand.Op{mx, x, i},
4191			Inputs:   []operand.Op{mx, x},
4192			Outputs:  []operand.Op{x},
4193			ISA:      []string{"SSE2"},
4194		}, nil
4195	case operand.IsM128(mx) && operand.IsXMM(x) && operand.IsIMM8(i):
4196		return &intrep.Instruction{
4197			Opcode:   "CMPPD",
4198			Operands: []operand.Op{mx, x, i},
4199			Inputs:   []operand.Op{mx, x},
4200			Outputs:  []operand.Op{x},
4201			ISA:      []string{"SSE2"},
4202		}, nil
4203	}
4204	return nil, errors.New("CMPPD: bad operands")
4205}
4206
4207// CMPPS: Compare Packed Single-Precision Floating-Point Values.
4208//
4209// Forms:
4210//
4211// 	CMPPS xmm  xmm imm8
4212// 	CMPPS m128 xmm imm8
4213func CMPPS(mx, x, i operand.Op) (*intrep.Instruction, error) {
4214	switch {
4215	case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsIMM8(i):
4216		return &intrep.Instruction{
4217			Opcode:   "CMPPS",
4218			Operands: []operand.Op{mx, x, i},
4219			Inputs:   []operand.Op{mx, x},
4220			Outputs:  []operand.Op{x},
4221			ISA:      []string{"SSE"},
4222		}, nil
4223	case operand.IsM128(mx) && operand.IsXMM(x) && operand.IsIMM8(i):
4224		return &intrep.Instruction{
4225			Opcode:   "CMPPS",
4226			Operands: []operand.Op{mx, x, i},
4227			Inputs:   []operand.Op{mx, x},
4228			Outputs:  []operand.Op{x},
4229			ISA:      []string{"SSE"},
4230		}, nil
4231	}
4232	return nil, errors.New("CMPPS: bad operands")
4233}
4234
4235// CMPQ: Compare Two Operands.
4236//
4237// Forms:
4238//
4239// 	CMPQ rax imm32
4240// 	CMPQ r64 imm8
4241// 	CMPQ r64 imm32
4242// 	CMPQ r64 r64
4243// 	CMPQ r64 m64
4244// 	CMPQ m64 imm8
4245// 	CMPQ m64 imm32
4246// 	CMPQ m64 r64
4247func CMPQ(mr, imr operand.Op) (*intrep.Instruction, error) {
4248	switch {
4249	case operand.IsRAX(mr) && operand.IsIMM32(imr):
4250		return &intrep.Instruction{
4251			Opcode:   "CMPQ",
4252			Operands: []operand.Op{mr, imr},
4253			Inputs:   []operand.Op{mr},
4254			Outputs:  []operand.Op{},
4255		}, nil
4256	case operand.IsR64(mr) && operand.IsIMM8(imr):
4257		return &intrep.Instruction{
4258			Opcode:   "CMPQ",
4259			Operands: []operand.Op{mr, imr},
4260			Inputs:   []operand.Op{mr},
4261			Outputs:  []operand.Op{},
4262		}, nil
4263	case operand.IsR64(mr) && operand.IsIMM32(imr):
4264		return &intrep.Instruction{
4265			Opcode:   "CMPQ",
4266			Operands: []operand.Op{mr, imr},
4267			Inputs:   []operand.Op{mr},
4268			Outputs:  []operand.Op{},
4269		}, nil
4270	case operand.IsR64(mr) && operand.IsR64(imr):
4271		return &intrep.Instruction{
4272			Opcode:           "CMPQ",
4273			Operands:         []operand.Op{mr, imr},
4274			Inputs:           []operand.Op{mr, imr},
4275			Outputs:          []operand.Op{},
4276			CancellingInputs: true,
4277		}, nil
4278	case operand.IsR64(mr) && operand.IsM64(imr):
4279		return &intrep.Instruction{
4280			Opcode:   "CMPQ",
4281			Operands: []operand.Op{mr, imr},
4282			Inputs:   []operand.Op{mr, imr},
4283			Outputs:  []operand.Op{},
4284		}, nil
4285	case operand.IsM64(mr) && operand.IsIMM8(imr):
4286		return &intrep.Instruction{
4287			Opcode:   "CMPQ",
4288			Operands: []operand.Op{mr, imr},
4289			Inputs:   []operand.Op{mr},
4290			Outputs:  []operand.Op{},
4291		}, nil
4292	case operand.IsM64(mr) && operand.IsIMM32(imr):
4293		return &intrep.Instruction{
4294			Opcode:   "CMPQ",
4295			Operands: []operand.Op{mr, imr},
4296			Inputs:   []operand.Op{mr},
4297			Outputs:  []operand.Op{},
4298		}, nil
4299	case operand.IsM64(mr) && operand.IsR64(imr):
4300		return &intrep.Instruction{
4301			Opcode:   "CMPQ",
4302			Operands: []operand.Op{mr, imr},
4303			Inputs:   []operand.Op{mr, imr},
4304			Outputs:  []operand.Op{},
4305		}, nil
4306	}
4307	return nil, errors.New("CMPQ: bad operands")
4308}
4309
4310// CMPSD: Compare Scalar Double-Precision Floating-Point Values.
4311//
4312// Forms:
4313//
4314// 	CMPSD xmm xmm imm8
4315// 	CMPSD m64 xmm imm8
4316func CMPSD(mx, x, i operand.Op) (*intrep.Instruction, error) {
4317	switch {
4318	case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsIMM8(i):
4319		return &intrep.Instruction{
4320			Opcode:   "CMPSD",
4321			Operands: []operand.Op{mx, x, i},
4322			Inputs:   []operand.Op{mx, x},
4323			Outputs:  []operand.Op{x},
4324			ISA:      []string{"SSE2"},
4325		}, nil
4326	case operand.IsM64(mx) && operand.IsXMM(x) && operand.IsIMM8(i):
4327		return &intrep.Instruction{
4328			Opcode:   "CMPSD",
4329			Operands: []operand.Op{mx, x, i},
4330			Inputs:   []operand.Op{mx, x},
4331			Outputs:  []operand.Op{x},
4332			ISA:      []string{"SSE2"},
4333		}, nil
4334	}
4335	return nil, errors.New("CMPSD: bad operands")
4336}
4337
4338// CMPSS: Compare Scalar Single-Precision Floating-Point Values.
4339//
4340// Forms:
4341//
4342// 	CMPSS xmm xmm imm8
4343// 	CMPSS m32 xmm imm8
4344func CMPSS(mx, x, i operand.Op) (*intrep.Instruction, error) {
4345	switch {
4346	case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsIMM8(i):
4347		return &intrep.Instruction{
4348			Opcode:   "CMPSS",
4349			Operands: []operand.Op{mx, x, i},
4350			Inputs:   []operand.Op{mx, x},
4351			Outputs:  []operand.Op{x},
4352			ISA:      []string{"SSE"},
4353		}, nil
4354	case operand.IsM32(mx) && operand.IsXMM(x) && operand.IsIMM8(i):
4355		return &intrep.Instruction{
4356			Opcode:   "CMPSS",
4357			Operands: []operand.Op{mx, x, i},
4358			Inputs:   []operand.Op{mx, x},
4359			Outputs:  []operand.Op{x},
4360			ISA:      []string{"SSE"},
4361		}, nil
4362	}
4363	return nil, errors.New("CMPSS: bad operands")
4364}
4365
4366// CMPW: Compare Two Operands.
4367//
4368// Forms:
4369//
4370// 	CMPW ax  imm16
4371// 	CMPW r16 imm8
4372// 	CMPW r16 imm16
4373// 	CMPW r16 r16
4374// 	CMPW r16 m16
4375// 	CMPW m16 imm8
4376// 	CMPW m16 imm16
4377// 	CMPW m16 r16
4378func CMPW(amr, imr operand.Op) (*intrep.Instruction, error) {
4379	switch {
4380	case operand.IsAX(amr) && operand.IsIMM16(imr):
4381		return &intrep.Instruction{
4382			Opcode:   "CMPW",
4383			Operands: []operand.Op{amr, imr},
4384			Inputs:   []operand.Op{amr},
4385			Outputs:  []operand.Op{},
4386		}, nil
4387	case operand.IsR16(amr) && operand.IsIMM8(imr):
4388		return &intrep.Instruction{
4389			Opcode:   "CMPW",
4390			Operands: []operand.Op{amr, imr},
4391			Inputs:   []operand.Op{amr},
4392			Outputs:  []operand.Op{},
4393		}, nil
4394	case operand.IsR16(amr) && operand.IsIMM16(imr):
4395		return &intrep.Instruction{
4396			Opcode:   "CMPW",
4397			Operands: []operand.Op{amr, imr},
4398			Inputs:   []operand.Op{amr},
4399			Outputs:  []operand.Op{},
4400		}, nil
4401	case operand.IsR16(amr) && operand.IsR16(imr):
4402		return &intrep.Instruction{
4403			Opcode:           "CMPW",
4404			Operands:         []operand.Op{amr, imr},
4405			Inputs:           []operand.Op{amr, imr},
4406			Outputs:          []operand.Op{},
4407			CancellingInputs: true,
4408		}, nil
4409	case operand.IsR16(amr) && operand.IsM16(imr):
4410		return &intrep.Instruction{
4411			Opcode:   "CMPW",
4412			Operands: []operand.Op{amr, imr},
4413			Inputs:   []operand.Op{amr, imr},
4414			Outputs:  []operand.Op{},
4415		}, nil
4416	case operand.IsM16(amr) && operand.IsIMM8(imr):
4417		return &intrep.Instruction{
4418			Opcode:   "CMPW",
4419			Operands: []operand.Op{amr, imr},
4420			Inputs:   []operand.Op{amr},
4421			Outputs:  []operand.Op{},
4422		}, nil
4423	case operand.IsM16(amr) && operand.IsIMM16(imr):
4424		return &intrep.Instruction{
4425			Opcode:   "CMPW",
4426			Operands: []operand.Op{amr, imr},
4427			Inputs:   []operand.Op{amr},
4428			Outputs:  []operand.Op{},
4429		}, nil
4430	case operand.IsM16(amr) && operand.IsR16(imr):
4431		return &intrep.Instruction{
4432			Opcode:   "CMPW",
4433			Operands: []operand.Op{amr, imr},
4434			Inputs:   []operand.Op{amr, imr},
4435			Outputs:  []operand.Op{},
4436		}, nil
4437	}
4438	return nil, errors.New("CMPW: bad operands")
4439}
4440
4441// CMPXCHG16B: Compare and Exchange 16 Bytes.
4442//
4443// Forms:
4444//
4445// 	CMPXCHG16B m128
4446func CMPXCHG16B(m operand.Op) (*intrep.Instruction, error) {
4447	switch {
4448	case operand.IsM128(m):
4449		return &intrep.Instruction{
4450			Opcode:   "CMPXCHG16B",
4451			Operands: []operand.Op{m},
4452			Inputs:   []operand.Op{m, reg.RAX, reg.RBX, reg.RCX, reg.RDX},
4453			Outputs:  []operand.Op{reg.RAX, reg.RDX},
4454		}, nil
4455	}
4456	return nil, errors.New("CMPXCHG16B: bad operands")
4457}
4458
4459// CMPXCHG8B: Compare and Exchange 8 Bytes.
4460//
4461// Forms:
4462//
4463// 	CMPXCHG8B m64
4464func CMPXCHG8B(m operand.Op) (*intrep.Instruction, error) {
4465	switch {
4466	case operand.IsM64(m):
4467		return &intrep.Instruction{
4468			Opcode:   "CMPXCHG8B",
4469			Operands: []operand.Op{m},
4470			Inputs:   []operand.Op{m, reg.EAX, reg.EBX, reg.ECX, reg.EDX},
4471			Outputs:  []operand.Op{reg.EAX, reg.EDX},
4472		}, nil
4473	}
4474	return nil, errors.New("CMPXCHG8B: bad operands")
4475}
4476
4477// CMPXCHGB: Compare and Exchange.
4478//
4479// Forms:
4480//
4481// 	CMPXCHGB r8 r8
4482// 	CMPXCHGB r8 m8
4483func CMPXCHGB(r, mr operand.Op) (*intrep.Instruction, error) {
4484	switch {
4485	case operand.IsR8(r) && operand.IsR8(mr):
4486		return &intrep.Instruction{
4487			Opcode:   "CMPXCHGB",
4488			Operands: []operand.Op{r, mr},
4489			Inputs:   []operand.Op{r, mr},
4490			Outputs:  []operand.Op{mr},
4491		}, nil
4492	case operand.IsR8(r) && operand.IsM8(mr):
4493		return &intrep.Instruction{
4494			Opcode:   "CMPXCHGB",
4495			Operands: []operand.Op{r, mr},
4496			Inputs:   []operand.Op{r, mr},
4497			Outputs:  []operand.Op{mr},
4498		}, nil
4499	}
4500	return nil, errors.New("CMPXCHGB: bad operands")
4501}
4502
4503// CMPXCHGL: Compare and Exchange.
4504//
4505// Forms:
4506//
4507// 	CMPXCHGL r32 r32
4508// 	CMPXCHGL r32 m32
4509func CMPXCHGL(r, mr operand.Op) (*intrep.Instruction, error) {
4510	switch {
4511	case operand.IsR32(r) && operand.IsR32(mr):
4512		return &intrep.Instruction{
4513			Opcode:   "CMPXCHGL",
4514			Operands: []operand.Op{r, mr},
4515			Inputs:   []operand.Op{r, mr},
4516			Outputs:  []operand.Op{mr},
4517		}, nil
4518	case operand.IsR32(r) && operand.IsM32(mr):
4519		return &intrep.Instruction{
4520			Opcode:   "CMPXCHGL",
4521			Operands: []operand.Op{r, mr},
4522			Inputs:   []operand.Op{r, mr},
4523			Outputs:  []operand.Op{mr},
4524		}, nil
4525	}
4526	return nil, errors.New("CMPXCHGL: bad operands")
4527}
4528
4529// CMPXCHGQ: Compare and Exchange.
4530//
4531// Forms:
4532//
4533// 	CMPXCHGQ r64 r64
4534// 	CMPXCHGQ r64 m64
4535func CMPXCHGQ(r, mr operand.Op) (*intrep.Instruction, error) {
4536	switch {
4537	case operand.IsR64(r) && operand.IsR64(mr):
4538		return &intrep.Instruction{
4539			Opcode:   "CMPXCHGQ",
4540			Operands: []operand.Op{r, mr},
4541			Inputs:   []operand.Op{r, mr},
4542			Outputs:  []operand.Op{mr},
4543		}, nil
4544	case operand.IsR64(r) && operand.IsM64(mr):
4545		return &intrep.Instruction{
4546			Opcode:   "CMPXCHGQ",
4547			Operands: []operand.Op{r, mr},
4548			Inputs:   []operand.Op{r, mr},
4549			Outputs:  []operand.Op{mr},
4550		}, nil
4551	}
4552	return nil, errors.New("CMPXCHGQ: bad operands")
4553}
4554
4555// CMPXCHGW: Compare and Exchange.
4556//
4557// Forms:
4558//
4559// 	CMPXCHGW r16 r16
4560// 	CMPXCHGW r16 m16
4561func CMPXCHGW(r, mr operand.Op) (*intrep.Instruction, error) {
4562	switch {
4563	case operand.IsR16(r) && operand.IsR16(mr):
4564		return &intrep.Instruction{
4565			Opcode:   "CMPXCHGW",
4566			Operands: []operand.Op{r, mr},
4567			Inputs:   []operand.Op{r, mr},
4568			Outputs:  []operand.Op{mr},
4569		}, nil
4570	case operand.IsR16(r) && operand.IsM16(mr):
4571		return &intrep.Instruction{
4572			Opcode:   "CMPXCHGW",
4573			Operands: []operand.Op{r, mr},
4574			Inputs:   []operand.Op{r, mr},
4575			Outputs:  []operand.Op{mr},
4576		}, nil
4577	}
4578	return nil, errors.New("CMPXCHGW: bad operands")
4579}
4580
4581// COMISD: Compare Scalar Ordered Double-Precision Floating-Point Values and Set EFLAGS.
4582//
4583// Forms:
4584//
4585// 	COMISD xmm xmm
4586// 	COMISD m64 xmm
4587func COMISD(mx, x operand.Op) (*intrep.Instruction, error) {
4588	switch {
4589	case operand.IsXMM(mx) && operand.IsXMM(x):
4590		return &intrep.Instruction{
4591			Opcode:   "COMISD",
4592			Operands: []operand.Op{mx, x},
4593			Inputs:   []operand.Op{mx, x},
4594			Outputs:  []operand.Op{},
4595			ISA:      []string{"SSE2"},
4596		}, nil
4597	case operand.IsM64(mx) && operand.IsXMM(x):
4598		return &intrep.Instruction{
4599			Opcode:   "COMISD",
4600			Operands: []operand.Op{mx, x},
4601			Inputs:   []operand.Op{mx, x},
4602			Outputs:  []operand.Op{},
4603			ISA:      []string{"SSE2"},
4604		}, nil
4605	}
4606	return nil, errors.New("COMISD: bad operands")
4607}
4608
4609// COMISS: Compare Scalar Ordered Single-Precision Floating-Point Values and Set EFLAGS.
4610//
4611// Forms:
4612//
4613// 	COMISS xmm xmm
4614// 	COMISS m32 xmm
4615func COMISS(mx, x operand.Op) (*intrep.Instruction, error) {
4616	switch {
4617	case operand.IsXMM(mx) && operand.IsXMM(x):
4618		return &intrep.Instruction{
4619			Opcode:   "COMISS",
4620			Operands: []operand.Op{mx, x},
4621			Inputs:   []operand.Op{mx, x},
4622			Outputs:  []operand.Op{},
4623			ISA:      []string{"SSE"},
4624		}, nil
4625	case operand.IsM32(mx) && operand.IsXMM(x):
4626		return &intrep.Instruction{
4627			Opcode:   "COMISS",
4628			Operands: []operand.Op{mx, x},
4629			Inputs:   []operand.Op{mx, x},
4630			Outputs:  []operand.Op{},
4631			ISA:      []string{"SSE"},
4632		}, nil
4633	}
4634	return nil, errors.New("COMISS: bad operands")
4635}
4636
4637// CPUID: CPU Identification.
4638//
4639// Forms:
4640//
4641// 	CPUID
4642func CPUID() (*intrep.Instruction, error) {
4643	return &intrep.Instruction{
4644		Opcode:   "CPUID",
4645		Operands: nil,
4646		Inputs:   []operand.Op{reg.EAX, reg.ECX},
4647		Outputs:  []operand.Op{reg.EAX, reg.EBX, reg.ECX, reg.EDX},
4648		ISA:      []string{"CPUID"},
4649	}, nil
4650}
4651
4652// CQO: Convert Quadword to Octaword.
4653//
4654// Forms:
4655//
4656// 	CQO
4657func CQO() (*intrep.Instruction, error) {
4658	return &intrep.Instruction{
4659		Opcode:   "CQO",
4660		Operands: nil,
4661		Inputs:   []operand.Op{reg.RAX},
4662		Outputs:  []operand.Op{reg.RDX},
4663	}, nil
4664}
4665
4666// CRC32B: Accumulate CRC32 Value.
4667//
4668// Forms:
4669//
4670// 	CRC32B r8 r32
4671// 	CRC32B m8 r32
4672// 	CRC32B r8 r64
4673// 	CRC32B m8 r64
4674func CRC32B(mr, r operand.Op) (*intrep.Instruction, error) {
4675	switch {
4676	case operand.IsR8(mr) && operand.IsR32(r):
4677		return &intrep.Instruction{
4678			Opcode:   "CRC32B",
4679			Operands: []operand.Op{mr, r},
4680			Inputs:   []operand.Op{mr, r},
4681			Outputs:  []operand.Op{r},
4682			ISA:      []string{"SSE4.2"},
4683		}, nil
4684	case operand.IsM8(mr) && operand.IsR32(r):
4685		return &intrep.Instruction{
4686			Opcode:   "CRC32B",
4687			Operands: []operand.Op{mr, r},
4688			Inputs:   []operand.Op{mr, r},
4689			Outputs:  []operand.Op{r},
4690			ISA:      []string{"SSE4.2"},
4691		}, nil
4692	case operand.IsR8(mr) && operand.IsR64(r):
4693		return &intrep.Instruction{
4694			Opcode:   "CRC32B",
4695			Operands: []operand.Op{mr, r},
4696			Inputs:   []operand.Op{mr, r},
4697			Outputs:  []operand.Op{r},
4698			ISA:      []string{"SSE4.2"},
4699		}, nil
4700	case operand.IsM8(mr) && operand.IsR64(r):
4701		return &intrep.Instruction{
4702			Opcode:   "CRC32B",
4703			Operands: []operand.Op{mr, r},
4704			Inputs:   []operand.Op{mr, r},
4705			Outputs:  []operand.Op{r},
4706			ISA:      []string{"SSE4.2"},
4707		}, nil
4708	}
4709	return nil, errors.New("CRC32B: bad operands")
4710}
4711
4712// CRC32L: Accumulate CRC32 Value.
4713//
4714// Forms:
4715//
4716// 	CRC32L r32 r32
4717// 	CRC32L m32 r32
4718func CRC32L(mr, r operand.Op) (*intrep.Instruction, error) {
4719	switch {
4720	case operand.IsR32(mr) && operand.IsR32(r):
4721		return &intrep.Instruction{
4722			Opcode:   "CRC32L",
4723			Operands: []operand.Op{mr, r},
4724			Inputs:   []operand.Op{mr, r},
4725			Outputs:  []operand.Op{r},
4726			ISA:      []string{"SSE4.2"},
4727		}, nil
4728	case operand.IsM32(mr) && operand.IsR32(r):
4729		return &intrep.Instruction{
4730			Opcode:   "CRC32L",
4731			Operands: []operand.Op{mr, r},
4732			Inputs:   []operand.Op{mr, r},
4733			Outputs:  []operand.Op{r},
4734			ISA:      []string{"SSE4.2"},
4735		}, nil
4736	}
4737	return nil, errors.New("CRC32L: bad operands")
4738}
4739
4740// CRC32Q: Accumulate CRC32 Value.
4741//
4742// Forms:
4743//
4744// 	CRC32Q r64 r64
4745// 	CRC32Q m64 r64
4746func CRC32Q(mr, r operand.Op) (*intrep.Instruction, error) {
4747	switch {
4748	case operand.IsR64(mr) && operand.IsR64(r):
4749		return &intrep.Instruction{
4750			Opcode:   "CRC32Q",
4751			Operands: []operand.Op{mr, r},
4752			Inputs:   []operand.Op{mr, r},
4753			Outputs:  []operand.Op{r},
4754			ISA:      []string{"SSE4.2"},
4755		}, nil
4756	case operand.IsM64(mr) && operand.IsR64(r):
4757		return &intrep.Instruction{
4758			Opcode:   "CRC32Q",
4759			Operands: []operand.Op{mr, r},
4760			Inputs:   []operand.Op{mr, r},
4761			Outputs:  []operand.Op{r},
4762			ISA:      []string{"SSE4.2"},
4763		}, nil
4764	}
4765	return nil, errors.New("CRC32Q: bad operands")
4766}
4767
4768// CRC32W: Accumulate CRC32 Value.
4769//
4770// Forms:
4771//
4772// 	CRC32W r16 r32
4773// 	CRC32W m16 r32
4774func CRC32W(mr, r operand.Op) (*intrep.Instruction, error) {
4775	switch {
4776	case operand.IsR16(mr) && operand.IsR32(r):
4777		return &intrep.Instruction{
4778			Opcode:   "CRC32W",
4779			Operands: []operand.Op{mr, r},
4780			Inputs:   []operand.Op{mr, r},
4781			Outputs:  []operand.Op{r},
4782			ISA:      []string{"SSE4.2"},
4783		}, nil
4784	case operand.IsM16(mr) && operand.IsR32(r):
4785		return &intrep.Instruction{
4786			Opcode:   "CRC32W",
4787			Operands: []operand.Op{mr, r},
4788			Inputs:   []operand.Op{mr, r},
4789			Outputs:  []operand.Op{r},
4790			ISA:      []string{"SSE4.2"},
4791		}, nil
4792	}
4793	return nil, errors.New("CRC32W: bad operands")
4794}
4795
4796// CVTPD2PL: Convert Packed Double-Precision FP Values to Packed Dword Integers.
4797//
4798// Forms:
4799//
4800// 	CVTPD2PL xmm  xmm
4801// 	CVTPD2PL m128 xmm
4802func CVTPD2PL(mx, x operand.Op) (*intrep.Instruction, error) {
4803	switch {
4804	case operand.IsXMM(mx) && operand.IsXMM(x):
4805		return &intrep.Instruction{
4806			Opcode:   "CVTPD2PL",
4807			Operands: []operand.Op{mx, x},
4808			Inputs:   []operand.Op{mx},
4809			Outputs:  []operand.Op{x},
4810			ISA:      []string{"SSE2"},
4811		}, nil
4812	case operand.IsM128(mx) && operand.IsXMM(x):
4813		return &intrep.Instruction{
4814			Opcode:   "CVTPD2PL",
4815			Operands: []operand.Op{mx, x},
4816			Inputs:   []operand.Op{mx},
4817			Outputs:  []operand.Op{x},
4818			ISA:      []string{"SSE2"},
4819		}, nil
4820	}
4821	return nil, errors.New("CVTPD2PL: bad operands")
4822}
4823
4824// CVTPD2PS: Convert Packed Double-Precision FP Values to Packed Single-Precision FP Values.
4825//
4826// Forms:
4827//
4828// 	CVTPD2PS xmm  xmm
4829// 	CVTPD2PS m128 xmm
4830func CVTPD2PS(mx, x operand.Op) (*intrep.Instruction, error) {
4831	switch {
4832	case operand.IsXMM(mx) && operand.IsXMM(x):
4833		return &intrep.Instruction{
4834			Opcode:   "CVTPD2PS",
4835			Operands: []operand.Op{mx, x},
4836			Inputs:   []operand.Op{mx},
4837			Outputs:  []operand.Op{x},
4838			ISA:      []string{"SSE2"},
4839		}, nil
4840	case operand.IsM128(mx) && operand.IsXMM(x):
4841		return &intrep.Instruction{
4842			Opcode:   "CVTPD2PS",
4843			Operands: []operand.Op{mx, x},
4844			Inputs:   []operand.Op{mx},
4845			Outputs:  []operand.Op{x},
4846			ISA:      []string{"SSE2"},
4847		}, nil
4848	}
4849	return nil, errors.New("CVTPD2PS: bad operands")
4850}
4851
4852// CVTPL2PD: Convert Packed Dword Integers to Packed Double-Precision FP Values.
4853//
4854// Forms:
4855//
4856// 	CVTPL2PD xmm xmm
4857// 	CVTPL2PD m64 xmm
4858func CVTPL2PD(mx, x operand.Op) (*intrep.Instruction, error) {
4859	switch {
4860	case operand.IsXMM(mx) && operand.IsXMM(x):
4861		return &intrep.Instruction{
4862			Opcode:   "CVTPL2PD",
4863			Operands: []operand.Op{mx, x},
4864			Inputs:   []operand.Op{mx},
4865			Outputs:  []operand.Op{x},
4866			ISA:      []string{"SSE2"},
4867		}, nil
4868	case operand.IsM64(mx) && operand.IsXMM(x):
4869		return &intrep.Instruction{
4870			Opcode:   "CVTPL2PD",
4871			Operands: []operand.Op{mx, x},
4872			Inputs:   []operand.Op{mx},
4873			Outputs:  []operand.Op{x},
4874			ISA:      []string{"SSE2"},
4875		}, nil
4876	}
4877	return nil, errors.New("CVTPL2PD: bad operands")
4878}
4879
4880// CVTPL2PS: Convert Packed Dword Integers to Packed Single-Precision FP Values.
4881//
4882// Forms:
4883//
4884// 	CVTPL2PS xmm  xmm
4885// 	CVTPL2PS m128 xmm
4886func CVTPL2PS(mx, x operand.Op) (*intrep.Instruction, error) {
4887	switch {
4888	case operand.IsXMM(mx) && operand.IsXMM(x):
4889		return &intrep.Instruction{
4890			Opcode:   "CVTPL2PS",
4891			Operands: []operand.Op{mx, x},
4892			Inputs:   []operand.Op{mx},
4893			Outputs:  []operand.Op{x},
4894			ISA:      []string{"SSE2"},
4895		}, nil
4896	case operand.IsM128(mx) && operand.IsXMM(x):
4897		return &intrep.Instruction{
4898			Opcode:   "CVTPL2PS",
4899			Operands: []operand.Op{mx, x},
4900			Inputs:   []operand.Op{mx},
4901			Outputs:  []operand.Op{x},
4902			ISA:      []string{"SSE2"},
4903		}, nil
4904	}
4905	return nil, errors.New("CVTPL2PS: bad operands")
4906}
4907
4908// CVTPS2PD: Convert Packed Single-Precision FP Values to Packed Double-Precision FP Values.
4909//
4910// Forms:
4911//
4912// 	CVTPS2PD xmm xmm
4913// 	CVTPS2PD m64 xmm
4914func CVTPS2PD(mx, x operand.Op) (*intrep.Instruction, error) {
4915	switch {
4916	case operand.IsXMM(mx) && operand.IsXMM(x):
4917		return &intrep.Instruction{
4918			Opcode:   "CVTPS2PD",
4919			Operands: []operand.Op{mx, x},
4920			Inputs:   []operand.Op{mx},
4921			Outputs:  []operand.Op{x},
4922			ISA:      []string{"SSE2"},
4923		}, nil
4924	case operand.IsM64(mx) && operand.IsXMM(x):
4925		return &intrep.Instruction{
4926			Opcode:   "CVTPS2PD",
4927			Operands: []operand.Op{mx, x},
4928			Inputs:   []operand.Op{mx},
4929			Outputs:  []operand.Op{x},
4930			ISA:      []string{"SSE2"},
4931		}, nil
4932	}
4933	return nil, errors.New("CVTPS2PD: bad operands")
4934}
4935
4936// CVTPS2PL: Convert Packed Single-Precision FP Values to Packed Dword Integers.
4937//
4938// Forms:
4939//
4940// 	CVTPS2PL xmm  xmm
4941// 	CVTPS2PL m128 xmm
4942func CVTPS2PL(mx, x operand.Op) (*intrep.Instruction, error) {
4943	switch {
4944	case operand.IsXMM(mx) && operand.IsXMM(x):
4945		return &intrep.Instruction{
4946			Opcode:   "CVTPS2PL",
4947			Operands: []operand.Op{mx, x},
4948			Inputs:   []operand.Op{mx},
4949			Outputs:  []operand.Op{x},
4950			ISA:      []string{"SSE2"},
4951		}, nil
4952	case operand.IsM128(mx) && operand.IsXMM(x):
4953		return &intrep.Instruction{
4954			Opcode:   "CVTPS2PL",
4955			Operands: []operand.Op{mx, x},
4956			Inputs:   []operand.Op{mx},
4957			Outputs:  []operand.Op{x},
4958			ISA:      []string{"SSE2"},
4959		}, nil
4960	}
4961	return nil, errors.New("CVTPS2PL: bad operands")
4962}
4963
4964// CVTSD2SL: Convert Scalar Double-Precision FP Value to Integer.
4965//
4966// Forms:
4967//
4968// 	CVTSD2SL xmm r32
4969// 	CVTSD2SL m64 r32
4970// 	CVTSD2SL xmm r64
4971// 	CVTSD2SL m64 r64
4972func CVTSD2SL(mx, r operand.Op) (*intrep.Instruction, error) {
4973	switch {
4974	case operand.IsXMM(mx) && operand.IsR32(r):
4975		return &intrep.Instruction{
4976			Opcode:   "CVTSD2SL",
4977			Operands: []operand.Op{mx, r},
4978			Inputs:   []operand.Op{mx},
4979			Outputs:  []operand.Op{r},
4980			ISA:      []string{"SSE2"},
4981		}, nil
4982	case operand.IsM64(mx) && operand.IsR32(r):
4983		return &intrep.Instruction{
4984			Opcode:   "CVTSD2SL",
4985			Operands: []operand.Op{mx, r},
4986			Inputs:   []operand.Op{mx},
4987			Outputs:  []operand.Op{r},
4988			ISA:      []string{"SSE2"},
4989		}, nil
4990	case operand.IsXMM(mx) && operand.IsR64(r):
4991		return &intrep.Instruction{
4992			Opcode:   "CVTSD2SL",
4993			Operands: []operand.Op{mx, r},
4994			Inputs:   []operand.Op{mx},
4995			Outputs:  []operand.Op{r},
4996			ISA:      []string{"SSE2"},
4997		}, nil
4998	case operand.IsM64(mx) && operand.IsR64(r):
4999		return &intrep.Instruction{
5000			Opcode:   "CVTSD2SL",
5001			Operands: []operand.Op{mx, r},
5002			Inputs:   []operand.Op{mx},
5003			Outputs:  []operand.Op{r},
5004			ISA:      []string{"SSE2"},
5005		}, nil
5006	}
5007	return nil, errors.New("CVTSD2SL: bad operands")
5008}
5009
5010// CVTSD2SS: Convert Scalar Double-Precision FP Value to Scalar Single-Precision FP Value.
5011//
5012// Forms:
5013//
5014// 	CVTSD2SS xmm xmm
5015// 	CVTSD2SS m64 xmm
5016func CVTSD2SS(mx, x operand.Op) (*intrep.Instruction, error) {
5017	switch {
5018	case operand.IsXMM(mx) && operand.IsXMM(x):
5019		return &intrep.Instruction{
5020			Opcode:   "CVTSD2SS",
5021			Operands: []operand.Op{mx, x},
5022			Inputs:   []operand.Op{mx, x},
5023			Outputs:  []operand.Op{x},
5024			ISA:      []string{"SSE2"},
5025		}, nil
5026	case operand.IsM64(mx) && operand.IsXMM(x):
5027		return &intrep.Instruction{
5028			Opcode:   "CVTSD2SS",
5029			Operands: []operand.Op{mx, x},
5030			Inputs:   []operand.Op{mx, x},
5031			Outputs:  []operand.Op{x},
5032			ISA:      []string{"SSE2"},
5033		}, nil
5034	}
5035	return nil, errors.New("CVTSD2SS: bad operands")
5036}
5037
5038// CVTSL2SD: Convert Dword Integer to Scalar Double-Precision FP Value.
5039//
5040// Forms:
5041//
5042// 	CVTSL2SD r32 xmm
5043// 	CVTSL2SD m32 xmm
5044func CVTSL2SD(mr, x operand.Op) (*intrep.Instruction, error) {
5045	switch {
5046	case operand.IsR32(mr) && operand.IsXMM(x):
5047		return &intrep.Instruction{
5048			Opcode:   "CVTSL2SD",
5049			Operands: []operand.Op{mr, x},
5050			Inputs:   []operand.Op{mr, x},
5051			Outputs:  []operand.Op{x},
5052			ISA:      []string{"SSE2"},
5053		}, nil
5054	case operand.IsM32(mr) && operand.IsXMM(x):
5055		return &intrep.Instruction{
5056			Opcode:   "CVTSL2SD",
5057			Operands: []operand.Op{mr, x},
5058			Inputs:   []operand.Op{mr, x},
5059			Outputs:  []operand.Op{x},
5060			ISA:      []string{"SSE2"},
5061		}, nil
5062	}
5063	return nil, errors.New("CVTSL2SD: bad operands")
5064}
5065
5066// CVTSL2SS: Convert Dword Integer to Scalar Single-Precision FP Value.
5067//
5068// Forms:
5069//
5070// 	CVTSL2SS r32 xmm
5071// 	CVTSL2SS m32 xmm
5072func CVTSL2SS(mr, x operand.Op) (*intrep.Instruction, error) {
5073	switch {
5074	case operand.IsR32(mr) && operand.IsXMM(x):
5075		return &intrep.Instruction{
5076			Opcode:   "CVTSL2SS",
5077			Operands: []operand.Op{mr, x},
5078			Inputs:   []operand.Op{mr, x},
5079			Outputs:  []operand.Op{x},
5080			ISA:      []string{"SSE"},
5081		}, nil
5082	case operand.IsM32(mr) && operand.IsXMM(x):
5083		return &intrep.Instruction{
5084			Opcode:   "CVTSL2SS",
5085			Operands: []operand.Op{mr, x},
5086			Inputs:   []operand.Op{mr, x},
5087			Outputs:  []operand.Op{x},
5088			ISA:      []string{"SSE"},
5089		}, nil
5090	}
5091	return nil, errors.New("CVTSL2SS: bad operands")
5092}
5093
5094// CVTSQ2SD: Convert Dword Integer to Scalar Double-Precision FP Value.
5095//
5096// Forms:
5097//
5098// 	CVTSQ2SD r64 xmm
5099// 	CVTSQ2SD m64 xmm
5100func CVTSQ2SD(mr, x operand.Op) (*intrep.Instruction, error) {
5101	switch {
5102	case operand.IsR64(mr) && operand.IsXMM(x):
5103		return &intrep.Instruction{
5104			Opcode:   "CVTSQ2SD",
5105			Operands: []operand.Op{mr, x},
5106			Inputs:   []operand.Op{mr, x},
5107			Outputs:  []operand.Op{x},
5108			ISA:      []string{"SSE2"},
5109		}, nil
5110	case operand.IsM64(mr) && operand.IsXMM(x):
5111		return &intrep.Instruction{
5112			Opcode:   "CVTSQ2SD",
5113			Operands: []operand.Op{mr, x},
5114			Inputs:   []operand.Op{mr, x},
5115			Outputs:  []operand.Op{x},
5116			ISA:      []string{"SSE2"},
5117		}, nil
5118	}
5119	return nil, errors.New("CVTSQ2SD: bad operands")
5120}
5121
5122// CVTSQ2SS: Convert Dword Integer to Scalar Single-Precision FP Value.
5123//
5124// Forms:
5125//
5126// 	CVTSQ2SS r64 xmm
5127// 	CVTSQ2SS m64 xmm
5128func CVTSQ2SS(mr, x operand.Op) (*intrep.Instruction, error) {
5129	switch {
5130	case operand.IsR64(mr) && operand.IsXMM(x):
5131		return &intrep.Instruction{
5132			Opcode:   "CVTSQ2SS",
5133			Operands: []operand.Op{mr, x},
5134			Inputs:   []operand.Op{mr, x},
5135			Outputs:  []operand.Op{x},
5136			ISA:      []string{"SSE"},
5137		}, nil
5138	case operand.IsM64(mr) && operand.IsXMM(x):
5139		return &intrep.Instruction{
5140			Opcode:   "CVTSQ2SS",
5141			Operands: []operand.Op{mr, x},
5142			Inputs:   []operand.Op{mr, x},
5143			Outputs:  []operand.Op{x},
5144			ISA:      []string{"SSE"},
5145		}, nil
5146	}
5147	return nil, errors.New("CVTSQ2SS: bad operands")
5148}
5149
5150// CVTSS2SD: Convert Scalar Single-Precision FP Value to Scalar Double-Precision FP Value.
5151//
5152// Forms:
5153//
5154// 	CVTSS2SD xmm xmm
5155// 	CVTSS2SD m32 xmm
5156func CVTSS2SD(mx, x operand.Op) (*intrep.Instruction, error) {
5157	switch {
5158	case operand.IsXMM(mx) && operand.IsXMM(x):
5159		return &intrep.Instruction{
5160			Opcode:   "CVTSS2SD",
5161			Operands: []operand.Op{mx, x},
5162			Inputs:   []operand.Op{mx, x},
5163			Outputs:  []operand.Op{x},
5164			ISA:      []string{"SSE2"},
5165		}, nil
5166	case operand.IsM32(mx) && operand.IsXMM(x):
5167		return &intrep.Instruction{
5168			Opcode:   "CVTSS2SD",
5169			Operands: []operand.Op{mx, x},
5170			Inputs:   []operand.Op{mx, x},
5171			Outputs:  []operand.Op{x},
5172			ISA:      []string{"SSE2"},
5173		}, nil
5174	}
5175	return nil, errors.New("CVTSS2SD: bad operands")
5176}
5177
5178// CVTSS2SL: Convert Scalar Single-Precision FP Value to Dword Integer.
5179//
5180// Forms:
5181//
5182// 	CVTSS2SL xmm r32
5183// 	CVTSS2SL m32 r32
5184// 	CVTSS2SL xmm r64
5185// 	CVTSS2SL m32 r64
5186func CVTSS2SL(mx, r operand.Op) (*intrep.Instruction, error) {
5187	switch {
5188	case operand.IsXMM(mx) && operand.IsR32(r):
5189		return &intrep.Instruction{
5190			Opcode:   "CVTSS2SL",
5191			Operands: []operand.Op{mx, r},
5192			Inputs:   []operand.Op{mx},
5193			Outputs:  []operand.Op{r},
5194			ISA:      []string{"SSE"},
5195		}, nil
5196	case operand.IsM32(mx) && operand.IsR32(r):
5197		return &intrep.Instruction{
5198			Opcode:   "CVTSS2SL",
5199			Operands: []operand.Op{mx, r},
5200			Inputs:   []operand.Op{mx},
5201			Outputs:  []operand.Op{r},
5202			ISA:      []string{"SSE"},
5203		}, nil
5204	case operand.IsXMM(mx) && operand.IsR64(r):
5205		return &intrep.Instruction{
5206			Opcode:   "CVTSS2SL",
5207			Operands: []operand.Op{mx, r},
5208			Inputs:   []operand.Op{mx},
5209			Outputs:  []operand.Op{r},
5210			ISA:      []string{"SSE"},
5211		}, nil
5212	case operand.IsM32(mx) && operand.IsR64(r):
5213		return &intrep.Instruction{
5214			Opcode:   "CVTSS2SL",
5215			Operands: []operand.Op{mx, r},
5216			Inputs:   []operand.Op{mx},
5217			Outputs:  []operand.Op{r},
5218			ISA:      []string{"SSE"},
5219		}, nil
5220	}
5221	return nil, errors.New("CVTSS2SL: bad operands")
5222}
5223
5224// CVTTPD2PL: Convert with Truncation Packed Double-Precision FP Values to Packed Dword Integers.
5225//
5226// Forms:
5227//
5228// 	CVTTPD2PL xmm  xmm
5229// 	CVTTPD2PL m128 xmm
5230func CVTTPD2PL(mx, x operand.Op) (*intrep.Instruction, error) {
5231	switch {
5232	case operand.IsXMM(mx) && operand.IsXMM(x):
5233		return &intrep.Instruction{
5234			Opcode:   "CVTTPD2PL",
5235			Operands: []operand.Op{mx, x},
5236			Inputs:   []operand.Op{mx},
5237			Outputs:  []operand.Op{x},
5238			ISA:      []string{"SSE2"},
5239		}, nil
5240	case operand.IsM128(mx) && operand.IsXMM(x):
5241		return &intrep.Instruction{
5242			Opcode:   "CVTTPD2PL",
5243			Operands: []operand.Op{mx, x},
5244			Inputs:   []operand.Op{mx},
5245			Outputs:  []operand.Op{x},
5246			ISA:      []string{"SSE2"},
5247		}, nil
5248	}
5249	return nil, errors.New("CVTTPD2PL: bad operands")
5250}
5251
5252// CVTTPS2PL: Convert with Truncation Packed Single-Precision FP Values to Packed Dword Integers.
5253//
5254// Forms:
5255//
5256// 	CVTTPS2PL xmm  xmm
5257// 	CVTTPS2PL m128 xmm
5258func CVTTPS2PL(mx, x operand.Op) (*intrep.Instruction, error) {
5259	switch {
5260	case operand.IsXMM(mx) && operand.IsXMM(x):
5261		return &intrep.Instruction{
5262			Opcode:   "CVTTPS2PL",
5263			Operands: []operand.Op{mx, x},
5264			Inputs:   []operand.Op{mx},
5265			Outputs:  []operand.Op{x},
5266			ISA:      []string{"SSE2"},
5267		}, nil
5268	case operand.IsM128(mx) && operand.IsXMM(x):
5269		return &intrep.Instruction{
5270			Opcode:   "CVTTPS2PL",
5271			Operands: []operand.Op{mx, x},
5272			Inputs:   []operand.Op{mx},
5273			Outputs:  []operand.Op{x},
5274			ISA:      []string{"SSE2"},
5275		}, nil
5276	}
5277	return nil, errors.New("CVTTPS2PL: bad operands")
5278}
5279
5280// CVTTSD2SL: Convert with Truncation Scalar Double-Precision FP Value to Signed Integer.
5281//
5282// Forms:
5283//
5284// 	CVTTSD2SL xmm r32
5285// 	CVTTSD2SL m64 r32
5286func CVTTSD2SL(mx, r operand.Op) (*intrep.Instruction, error) {
5287	switch {
5288	case operand.IsXMM(mx) && operand.IsR32(r):
5289		return &intrep.Instruction{
5290			Opcode:   "CVTTSD2SL",
5291			Operands: []operand.Op{mx, r},
5292			Inputs:   []operand.Op{mx},
5293			Outputs:  []operand.Op{r},
5294			ISA:      []string{"SSE2"},
5295		}, nil
5296	case operand.IsM64(mx) && operand.IsR32(r):
5297		return &intrep.Instruction{
5298			Opcode:   "CVTTSD2SL",
5299			Operands: []operand.Op{mx, r},
5300			Inputs:   []operand.Op{mx},
5301			Outputs:  []operand.Op{r},
5302			ISA:      []string{"SSE2"},
5303		}, nil
5304	}
5305	return nil, errors.New("CVTTSD2SL: bad operands")
5306}
5307
5308// CVTTSD2SQ: Convert with Truncation Scalar Double-Precision FP Value to Signed Integer.
5309//
5310// Forms:
5311//
5312// 	CVTTSD2SQ xmm r64
5313// 	CVTTSD2SQ m64 r64
5314func CVTTSD2SQ(mx, r operand.Op) (*intrep.Instruction, error) {
5315	switch {
5316	case operand.IsXMM(mx) && operand.IsR64(r):
5317		return &intrep.Instruction{
5318			Opcode:   "CVTTSD2SQ",
5319			Operands: []operand.Op{mx, r},
5320			Inputs:   []operand.Op{mx},
5321			Outputs:  []operand.Op{r},
5322			ISA:      []string{"SSE2"},
5323		}, nil
5324	case operand.IsM64(mx) && operand.IsR64(r):
5325		return &intrep.Instruction{
5326			Opcode:   "CVTTSD2SQ",
5327			Operands: []operand.Op{mx, r},
5328			Inputs:   []operand.Op{mx},
5329			Outputs:  []operand.Op{r},
5330			ISA:      []string{"SSE2"},
5331		}, nil
5332	}
5333	return nil, errors.New("CVTTSD2SQ: bad operands")
5334}
5335
5336// CVTTSS2SL: Convert with Truncation Scalar Single-Precision FP Value to Dword Integer.
5337//
5338// Forms:
5339//
5340// 	CVTTSS2SL xmm r32
5341// 	CVTTSS2SL m32 r32
5342// 	CVTTSS2SL xmm r64
5343// 	CVTTSS2SL m32 r64
5344func CVTTSS2SL(mx, r operand.Op) (*intrep.Instruction, error) {
5345	switch {
5346	case operand.IsXMM(mx) && operand.IsR32(r):
5347		return &intrep.Instruction{
5348			Opcode:   "CVTTSS2SL",
5349			Operands: []operand.Op{mx, r},
5350			Inputs:   []operand.Op{mx},
5351			Outputs:  []operand.Op{r},
5352			ISA:      []string{"SSE"},
5353		}, nil
5354	case operand.IsM32(mx) && operand.IsR32(r):
5355		return &intrep.Instruction{
5356			Opcode:   "CVTTSS2SL",
5357			Operands: []operand.Op{mx, r},
5358			Inputs:   []operand.Op{mx},
5359			Outputs:  []operand.Op{r},
5360			ISA:      []string{"SSE"},
5361		}, nil
5362	case operand.IsXMM(mx) && operand.IsR64(r):
5363		return &intrep.Instruction{
5364			Opcode:   "CVTTSS2SL",
5365			Operands: []operand.Op{mx, r},
5366			Inputs:   []operand.Op{mx},
5367			Outputs:  []operand.Op{r},
5368			ISA:      []string{"SSE"},
5369		}, nil
5370	case operand.IsM32(mx) && operand.IsR64(r):
5371		return &intrep.Instruction{
5372			Opcode:   "CVTTSS2SL",
5373			Operands: []operand.Op{mx, r},
5374			Inputs:   []operand.Op{mx},
5375			Outputs:  []operand.Op{r},
5376			ISA:      []string{"SSE"},
5377		}, nil
5378	}
5379	return nil, errors.New("CVTTSS2SL: bad operands")
5380}
5381
5382// CWD: Convert Word to Doubleword.
5383//
5384// Forms:
5385//
5386// 	CWD
5387func CWD() (*intrep.Instruction, error) {
5388	return &intrep.Instruction{
5389		Opcode:   "CWD",
5390		Operands: nil,
5391		Inputs:   []operand.Op{reg.AX},
5392		Outputs:  []operand.Op{reg.DX},
5393	}, nil
5394}
5395
5396// CWDE: Convert Word to Doubleword.
5397//
5398// Forms:
5399//
5400// 	CWDE
5401func CWDE() (*intrep.Instruction, error) {
5402	return &intrep.Instruction{
5403		Opcode:   "CWDE",
5404		Operands: nil,
5405		Inputs:   []operand.Op{reg.AX},
5406		Outputs:  []operand.Op{reg.EAX},
5407	}, nil
5408}
5409
5410// DECB: Decrement by 1.
5411//
5412// Forms:
5413//
5414// 	DECB r8
5415// 	DECB m8
5416func DECB(mr operand.Op) (*intrep.Instruction, error) {
5417	switch {
5418	case operand.IsR8(mr):
5419		return &intrep.Instruction{
5420			Opcode:   "DECB",
5421			Operands: []operand.Op{mr},
5422			Inputs:   []operand.Op{mr},
5423			Outputs:  []operand.Op{mr},
5424		}, nil
5425	case operand.IsM8(mr):
5426		return &intrep.Instruction{
5427			Opcode:   "DECB",
5428			Operands: []operand.Op{mr},
5429			Inputs:   []operand.Op{mr},
5430			Outputs:  []operand.Op{mr},
5431		}, nil
5432	}
5433	return nil, errors.New("DECB: bad operands")
5434}
5435
5436// DECL: Decrement by 1.
5437//
5438// Forms:
5439//
5440// 	DECL r32
5441// 	DECL m32
5442func DECL(mr operand.Op) (*intrep.Instruction, error) {
5443	switch {
5444	case operand.IsR32(mr):
5445		return &intrep.Instruction{
5446			Opcode:   "DECL",
5447			Operands: []operand.Op{mr},
5448			Inputs:   []operand.Op{mr},
5449			Outputs:  []operand.Op{mr},
5450		}, nil
5451	case operand.IsM32(mr):
5452		return &intrep.Instruction{
5453			Opcode:   "DECL",
5454			Operands: []operand.Op{mr},
5455			Inputs:   []operand.Op{mr},
5456			Outputs:  []operand.Op{mr},
5457		}, nil
5458	}
5459	return nil, errors.New("DECL: bad operands")
5460}
5461
5462// DECQ: Decrement by 1.
5463//
5464// Forms:
5465//
5466// 	DECQ r64
5467// 	DECQ m64
5468func DECQ(mr operand.Op) (*intrep.Instruction, error) {
5469	switch {
5470	case operand.IsR64(mr):
5471		return &intrep.Instruction{
5472			Opcode:   "DECQ",
5473			Operands: []operand.Op{mr},
5474			Inputs:   []operand.Op{mr},
5475			Outputs:  []operand.Op{mr},
5476		}, nil
5477	case operand.IsM64(mr):
5478		return &intrep.Instruction{
5479			Opcode:   "DECQ",
5480			Operands: []operand.Op{mr},
5481			Inputs:   []operand.Op{mr},
5482			Outputs:  []operand.Op{mr},
5483		}, nil
5484	}
5485	return nil, errors.New("DECQ: bad operands")
5486}
5487
5488// DECW: Decrement by 1.
5489//
5490// Forms:
5491//
5492// 	DECW r16
5493// 	DECW m16
5494func DECW(mr operand.Op) (*intrep.Instruction, error) {
5495	switch {
5496	case operand.IsR16(mr):
5497		return &intrep.Instruction{
5498			Opcode:   "DECW",
5499			Operands: []operand.Op{mr},
5500			Inputs:   []operand.Op{mr},
5501			Outputs:  []operand.Op{mr},
5502		}, nil
5503	case operand.IsM16(mr):
5504		return &intrep.Instruction{
5505			Opcode:   "DECW",
5506			Operands: []operand.Op{mr},
5507			Inputs:   []operand.Op{mr},
5508			Outputs:  []operand.Op{mr},
5509		}, nil
5510	}
5511	return nil, errors.New("DECW: bad operands")
5512}
5513
5514// DIVB: Unsigned Divide.
5515//
5516// Forms:
5517//
5518// 	DIVB r8
5519// 	DIVB m8
5520func DIVB(mr operand.Op) (*intrep.Instruction, error) {
5521	switch {
5522	case operand.IsR8(mr):
5523		return &intrep.Instruction{
5524			Opcode:   "DIVB",
5525			Operands: []operand.Op{mr},
5526			Inputs:   []operand.Op{mr, reg.AX},
5527			Outputs:  []operand.Op{reg.AX},
5528		}, nil
5529	case operand.IsM8(mr):
5530		return &intrep.Instruction{
5531			Opcode:   "DIVB",
5532			Operands: []operand.Op{mr},
5533			Inputs:   []operand.Op{mr, reg.AX},
5534			Outputs:  []operand.Op{reg.AX},
5535		}, nil
5536	}
5537	return nil, errors.New("DIVB: bad operands")
5538}
5539
5540// DIVL: Unsigned Divide.
5541//
5542// Forms:
5543//
5544// 	DIVL r32
5545// 	DIVL m32
5546func DIVL(mr operand.Op) (*intrep.Instruction, error) {
5547	switch {
5548	case operand.IsR32(mr):
5549		return &intrep.Instruction{
5550			Opcode:   "DIVL",
5551			Operands: []operand.Op{mr},
5552			Inputs:   []operand.Op{mr, reg.EAX, reg.EDX},
5553			Outputs:  []operand.Op{reg.EAX, reg.EDX},
5554		}, nil
5555	case operand.IsM32(mr):
5556		return &intrep.Instruction{
5557			Opcode:   "DIVL",
5558			Operands: []operand.Op{mr},
5559			Inputs:   []operand.Op{mr, reg.EAX, reg.EDX},
5560			Outputs:  []operand.Op{reg.EAX, reg.EDX},
5561		}, nil
5562	}
5563	return nil, errors.New("DIVL: bad operands")
5564}
5565
5566// DIVPD: Divide Packed Double-Precision Floating-Point Values.
5567//
5568// Forms:
5569//
5570// 	DIVPD xmm  xmm
5571// 	DIVPD m128 xmm
5572func DIVPD(mx, x operand.Op) (*intrep.Instruction, error) {
5573	switch {
5574	case operand.IsXMM(mx) && operand.IsXMM(x):
5575		return &intrep.Instruction{
5576			Opcode:   "DIVPD",
5577			Operands: []operand.Op{mx, x},
5578			Inputs:   []operand.Op{mx, x},
5579			Outputs:  []operand.Op{x},
5580			ISA:      []string{"SSE2"},
5581		}, nil
5582	case operand.IsM128(mx) && operand.IsXMM(x):
5583		return &intrep.Instruction{
5584			Opcode:   "DIVPD",
5585			Operands: []operand.Op{mx, x},
5586			Inputs:   []operand.Op{mx, x},
5587			Outputs:  []operand.Op{x},
5588			ISA:      []string{"SSE2"},
5589		}, nil
5590	}
5591	return nil, errors.New("DIVPD: bad operands")
5592}
5593
5594// DIVPS: Divide Packed Single-Precision Floating-Point Values.
5595//
5596// Forms:
5597//
5598// 	DIVPS xmm  xmm
5599// 	DIVPS m128 xmm
5600func DIVPS(mx, x operand.Op) (*intrep.Instruction, error) {
5601	switch {
5602	case operand.IsXMM(mx) && operand.IsXMM(x):
5603		return &intrep.Instruction{
5604			Opcode:   "DIVPS",
5605			Operands: []operand.Op{mx, x},
5606			Inputs:   []operand.Op{mx, x},
5607			Outputs:  []operand.Op{x},
5608			ISA:      []string{"SSE"},
5609		}, nil
5610	case operand.IsM128(mx) && operand.IsXMM(x):
5611		return &intrep.Instruction{
5612			Opcode:   "DIVPS",
5613			Operands: []operand.Op{mx, x},
5614			Inputs:   []operand.Op{mx, x},
5615			Outputs:  []operand.Op{x},
5616			ISA:      []string{"SSE"},
5617		}, nil
5618	}
5619	return nil, errors.New("DIVPS: bad operands")
5620}
5621
5622// DIVQ: Unsigned Divide.
5623//
5624// Forms:
5625//
5626// 	DIVQ r64
5627// 	DIVQ m64
5628func DIVQ(mr operand.Op) (*intrep.Instruction, error) {
5629	switch {
5630	case operand.IsR64(mr):
5631		return &intrep.Instruction{
5632			Opcode:   "DIVQ",
5633			Operands: []operand.Op{mr},
5634			Inputs:   []operand.Op{mr, reg.RAX, reg.RDX},
5635			Outputs:  []operand.Op{reg.RAX, reg.RDX},
5636		}, nil
5637	case operand.IsM64(mr):
5638		return &intrep.Instruction{
5639			Opcode:   "DIVQ",
5640			Operands: []operand.Op{mr},
5641			Inputs:   []operand.Op{mr, reg.RAX, reg.RDX},
5642			Outputs:  []operand.Op{reg.RAX, reg.RDX},
5643		}, nil
5644	}
5645	return nil, errors.New("DIVQ: bad operands")
5646}
5647
5648// DIVSD: Divide Scalar Double-Precision Floating-Point Values.
5649//
5650// Forms:
5651//
5652// 	DIVSD xmm xmm
5653// 	DIVSD m64 xmm
5654func DIVSD(mx, x operand.Op) (*intrep.Instruction, error) {
5655	switch {
5656	case operand.IsXMM(mx) && operand.IsXMM(x):
5657		return &intrep.Instruction{
5658			Opcode:   "DIVSD",
5659			Operands: []operand.Op{mx, x},
5660			Inputs:   []operand.Op{mx, x},
5661			Outputs:  []operand.Op{x},
5662			ISA:      []string{"SSE2"},
5663		}, nil
5664	case operand.IsM64(mx) && operand.IsXMM(x):
5665		return &intrep.Instruction{
5666			Opcode:   "DIVSD",
5667			Operands: []operand.Op{mx, x},
5668			Inputs:   []operand.Op{mx, x},
5669			Outputs:  []operand.Op{x},
5670			ISA:      []string{"SSE2"},
5671		}, nil
5672	}
5673	return nil, errors.New("DIVSD: bad operands")
5674}
5675
5676// DIVSS: Divide Scalar Single-Precision Floating-Point Values.
5677//
5678// Forms:
5679//
5680// 	DIVSS xmm xmm
5681// 	DIVSS m32 xmm
5682func DIVSS(mx, x operand.Op) (*intrep.Instruction, error) {
5683	switch {
5684	case operand.IsXMM(mx) && operand.IsXMM(x):
5685		return &intrep.Instruction{
5686			Opcode:   "DIVSS",
5687			Operands: []operand.Op{mx, x},
5688			Inputs:   []operand.Op{mx, x},
5689			Outputs:  []operand.Op{x},
5690			ISA:      []string{"SSE"},
5691		}, nil
5692	case operand.IsM32(mx) && operand.IsXMM(x):
5693		return &intrep.Instruction{
5694			Opcode:   "DIVSS",
5695			Operands: []operand.Op{mx, x},
5696			Inputs:   []operand.Op{mx, x},
5697			Outputs:  []operand.Op{x},
5698			ISA:      []string{"SSE"},
5699		}, nil
5700	}
5701	return nil, errors.New("DIVSS: bad operands")
5702}
5703
5704// DIVW: Unsigned Divide.
5705//
5706// Forms:
5707//
5708// 	DIVW r16
5709// 	DIVW m16
5710func DIVW(mr operand.Op) (*intrep.Instruction, error) {
5711	switch {
5712	case operand.IsR16(mr):
5713		return &intrep.Instruction{
5714			Opcode:   "DIVW",
5715			Operands: []operand.Op{mr},
5716			Inputs:   []operand.Op{mr, reg.AX, reg.DX},
5717			Outputs:  []operand.Op{reg.AX, reg.DX},
5718		}, nil
5719	case operand.IsM16(mr):
5720		return &intrep.Instruction{
5721			Opcode:   "DIVW",
5722			Operands: []operand.Op{mr},
5723			Inputs:   []operand.Op{mr, reg.AX, reg.DX},
5724			Outputs:  []operand.Op{reg.AX, reg.DX},
5725		}, nil
5726	}
5727	return nil, errors.New("DIVW: bad operands")
5728}
5729
5730// DPPD: Dot Product of Packed Double Precision Floating-Point Values.
5731//
5732// Forms:
5733//
5734// 	DPPD imm8 xmm  xmm
5735// 	DPPD imm8 m128 xmm
5736func DPPD(i, mx, x operand.Op) (*intrep.Instruction, error) {
5737	switch {
5738	case operand.IsIMM8(i) && operand.IsXMM(mx) && operand.IsXMM(x):
5739		return &intrep.Instruction{
5740			Opcode:   "DPPD",
5741			Operands: []operand.Op{i, mx, x},
5742			Inputs:   []operand.Op{mx, x},
5743			Outputs:  []operand.Op{x},
5744			ISA:      []string{"SSE4.1"},
5745		}, nil
5746	case operand.IsIMM8(i) && operand.IsM128(mx) && operand.IsXMM(x):
5747		return &intrep.Instruction{
5748			Opcode:   "DPPD",
5749			Operands: []operand.Op{i, mx, x},
5750			Inputs:   []operand.Op{mx, x},
5751			Outputs:  []operand.Op{x},
5752			ISA:      []string{"SSE4.1"},
5753		}, nil
5754	}
5755	return nil, errors.New("DPPD: bad operands")
5756}
5757
5758// DPPS: Dot Product of Packed Single Precision Floating-Point Values.
5759//
5760// Forms:
5761//
5762// 	DPPS imm8 xmm  xmm
5763// 	DPPS imm8 m128 xmm
5764func DPPS(i, mx, x operand.Op) (*intrep.Instruction, error) {
5765	switch {
5766	case operand.IsIMM8(i) && operand.IsXMM(mx) && operand.IsXMM(x):
5767		return &intrep.Instruction{
5768			Opcode:   "DPPS",
5769			Operands: []operand.Op{i, mx, x},
5770			Inputs:   []operand.Op{mx, x},
5771			Outputs:  []operand.Op{x},
5772			ISA:      []string{"SSE4.1"},
5773		}, nil
5774	case operand.IsIMM8(i) && operand.IsM128(mx) && operand.IsXMM(x):
5775		return &intrep.Instruction{
5776			Opcode:   "DPPS",
5777			Operands: []operand.Op{i, mx, x},
5778			Inputs:   []operand.Op{mx, x},
5779			Outputs:  []operand.Op{x},
5780			ISA:      []string{"SSE4.1"},
5781		}, nil
5782	}
5783	return nil, errors.New("DPPS: bad operands")
5784}
5785
5786// EXTRACTPS: Extract Packed Single Precision Floating-Point Value.
5787//
5788// Forms:
5789//
5790// 	EXTRACTPS imm2u xmm r32
5791// 	EXTRACTPS imm2u xmm m32
5792func EXTRACTPS(i, x, mr operand.Op) (*intrep.Instruction, error) {
5793	switch {
5794	case operand.IsIMM2U(i) && operand.IsXMM(x) && operand.IsR32(mr):
5795		return &intrep.Instruction{
5796			Opcode:   "EXTRACTPS",
5797			Operands: []operand.Op{i, x, mr},
5798			Inputs:   []operand.Op{x},
5799			Outputs:  []operand.Op{mr},
5800			ISA:      []string{"SSE4.1"},
5801		}, nil
5802	case operand.IsIMM2U(i) && operand.IsXMM(x) && operand.IsM32(mr):
5803		return &intrep.Instruction{
5804			Opcode:   "EXTRACTPS",
5805			Operands: []operand.Op{i, x, mr},
5806			Inputs:   []operand.Op{x},
5807			Outputs:  []operand.Op{mr},
5808			ISA:      []string{"SSE4.1"},
5809		}, nil
5810	}
5811	return nil, errors.New("EXTRACTPS: bad operands")
5812}
5813
5814// HADDPD: Packed Double-FP Horizontal Add.
5815//
5816// Forms:
5817//
5818// 	HADDPD xmm  xmm
5819// 	HADDPD m128 xmm
5820func HADDPD(mx, x operand.Op) (*intrep.Instruction, error) {
5821	switch {
5822	case operand.IsXMM(mx) && operand.IsXMM(x):
5823		return &intrep.Instruction{
5824			Opcode:   "HADDPD",
5825			Operands: []operand.Op{mx, x},
5826			Inputs:   []operand.Op{mx, x},
5827			Outputs:  []operand.Op{x},
5828			ISA:      []string{"SSE3"},
5829		}, nil
5830	case operand.IsM128(mx) && operand.IsXMM(x):
5831		return &intrep.Instruction{
5832			Opcode:   "HADDPD",
5833			Operands: []operand.Op{mx, x},
5834			Inputs:   []operand.Op{mx, x},
5835			Outputs:  []operand.Op{x},
5836			ISA:      []string{"SSE3"},
5837		}, nil
5838	}
5839	return nil, errors.New("HADDPD: bad operands")
5840}
5841
5842// HADDPS: Packed Single-FP Horizontal Add.
5843//
5844// Forms:
5845//
5846// 	HADDPS xmm  xmm
5847// 	HADDPS m128 xmm
5848func HADDPS(mx, x operand.Op) (*intrep.Instruction, error) {
5849	switch {
5850	case operand.IsXMM(mx) && operand.IsXMM(x):
5851		return &intrep.Instruction{
5852			Opcode:   "HADDPS",
5853			Operands: []operand.Op{mx, x},
5854			Inputs:   []operand.Op{mx, x},
5855			Outputs:  []operand.Op{x},
5856			ISA:      []string{"SSE3"},
5857		}, nil
5858	case operand.IsM128(mx) && operand.IsXMM(x):
5859		return &intrep.Instruction{
5860			Opcode:   "HADDPS",
5861			Operands: []operand.Op{mx, x},
5862			Inputs:   []operand.Op{mx, x},
5863			Outputs:  []operand.Op{x},
5864			ISA:      []string{"SSE3"},
5865		}, nil
5866	}
5867	return nil, errors.New("HADDPS: bad operands")
5868}
5869
5870// HSUBPD: Packed Double-FP Horizontal Subtract.
5871//
5872// Forms:
5873//
5874// 	HSUBPD xmm  xmm
5875// 	HSUBPD m128 xmm
5876func HSUBPD(mx, x operand.Op) (*intrep.Instruction, error) {
5877	switch {
5878	case operand.IsXMM(mx) && operand.IsXMM(x):
5879		return &intrep.Instruction{
5880			Opcode:   "HSUBPD",
5881			Operands: []operand.Op{mx, x},
5882			Inputs:   []operand.Op{mx, x},
5883			Outputs:  []operand.Op{x},
5884			ISA:      []string{"SSE3"},
5885		}, nil
5886	case operand.IsM128(mx) && operand.IsXMM(x):
5887		return &intrep.Instruction{
5888			Opcode:   "HSUBPD",
5889			Operands: []operand.Op{mx, x},
5890			Inputs:   []operand.Op{mx, x},
5891			Outputs:  []operand.Op{x},
5892			ISA:      []string{"SSE3"},
5893		}, nil
5894	}
5895	return nil, errors.New("HSUBPD: bad operands")
5896}
5897
5898// HSUBPS: Packed Single-FP Horizontal Subtract.
5899//
5900// Forms:
5901//
5902// 	HSUBPS xmm  xmm
5903// 	HSUBPS m128 xmm
5904func HSUBPS(mx, x operand.Op) (*intrep.Instruction, error) {
5905	switch {
5906	case operand.IsXMM(mx) && operand.IsXMM(x):
5907		return &intrep.Instruction{
5908			Opcode:   "HSUBPS",
5909			Operands: []operand.Op{mx, x},
5910			Inputs:   []operand.Op{mx, x},
5911			Outputs:  []operand.Op{x},
5912			ISA:      []string{"SSE3"},
5913		}, nil
5914	case operand.IsM128(mx) && operand.IsXMM(x):
5915		return &intrep.Instruction{
5916			Opcode:   "HSUBPS",
5917			Operands: []operand.Op{mx, x},
5918			Inputs:   []operand.Op{mx, x},
5919			Outputs:  []operand.Op{x},
5920			ISA:      []string{"SSE3"},
5921		}, nil
5922	}
5923	return nil, errors.New("HSUBPS: bad operands")
5924}
5925
5926// IDIVB: Signed Divide.
5927//
5928// Forms:
5929//
5930// 	IDIVB r8
5931// 	IDIVB m8
5932func IDIVB(mr operand.Op) (*intrep.Instruction, error) {
5933	switch {
5934	case operand.IsR8(mr):
5935		return &intrep.Instruction{
5936			Opcode:   "IDIVB",
5937			Operands: []operand.Op{mr},
5938			Inputs:   []operand.Op{mr, reg.AX},
5939			Outputs:  []operand.Op{reg.AX},
5940		}, nil
5941	case operand.IsM8(mr):
5942		return &intrep.Instruction{
5943			Opcode:   "IDIVB",
5944			Operands: []operand.Op{mr},
5945			Inputs:   []operand.Op{mr, reg.AX},
5946			Outputs:  []operand.Op{reg.AX},
5947		}, nil
5948	}
5949	return nil, errors.New("IDIVB: bad operands")
5950}
5951
5952// IDIVL: Signed Divide.
5953//
5954// Forms:
5955//
5956// 	IDIVL r32
5957// 	IDIVL m32
5958func IDIVL(mr operand.Op) (*intrep.Instruction, error) {
5959	switch {
5960	case operand.IsR32(mr):
5961		return &intrep.Instruction{
5962			Opcode:   "IDIVL",
5963			Operands: []operand.Op{mr},
5964			Inputs:   []operand.Op{mr, reg.EAX, reg.EDX},
5965			Outputs:  []operand.Op{reg.EAX, reg.EDX},
5966		}, nil
5967	case operand.IsM32(mr):
5968		return &intrep.Instruction{
5969			Opcode:   "IDIVL",
5970			Operands: []operand.Op{mr},
5971			Inputs:   []operand.Op{mr, reg.EAX, reg.EDX},
5972			Outputs:  []operand.Op{reg.EAX, reg.EDX},
5973		}, nil
5974	}
5975	return nil, errors.New("IDIVL: bad operands")
5976}
5977
5978// IDIVQ: Signed Divide.
5979//
5980// Forms:
5981//
5982// 	IDIVQ r64
5983// 	IDIVQ m64
5984func IDIVQ(mr operand.Op) (*intrep.Instruction, error) {
5985	switch {
5986	case operand.IsR64(mr):
5987		return &intrep.Instruction{
5988			Opcode:   "IDIVQ",
5989			Operands: []operand.Op{mr},
5990			Inputs:   []operand.Op{mr, reg.RAX, reg.RDX},
5991			Outputs:  []operand.Op{reg.RAX, reg.RDX},
5992		}, nil
5993	case operand.IsM64(mr):
5994		return &intrep.Instruction{
5995			Opcode:   "IDIVQ",
5996			Operands: []operand.Op{mr},
5997			Inputs:   []operand.Op{mr, reg.RAX, reg.RDX},
5998			Outputs:  []operand.Op{reg.RAX, reg.RDX},
5999		}, nil
6000	}
6001	return nil, errors.New("IDIVQ: bad operands")
6002}
6003
6004// IDIVW: Signed Divide.
6005//
6006// Forms:
6007//
6008// 	IDIVW r16
6009// 	IDIVW m16
6010func IDIVW(mr operand.Op) (*intrep.Instruction, error) {
6011	switch {
6012	case operand.IsR16(mr):
6013		return &intrep.Instruction{
6014			Opcode:   "IDIVW",
6015			Operands: []operand.Op{mr},
6016			Inputs:   []operand.Op{mr, reg.AX, reg.DX},
6017			Outputs:  []operand.Op{reg.AX, reg.DX},
6018		}, nil
6019	case operand.IsM16(mr):
6020		return &intrep.Instruction{
6021			Opcode:   "IDIVW",
6022			Operands: []operand.Op{mr},
6023			Inputs:   []operand.Op{mr, reg.AX, reg.DX},
6024			Outputs:  []operand.Op{reg.AX, reg.DX},
6025		}, nil
6026	}
6027	return nil, errors.New("IDIVW: bad operands")
6028}
6029
6030// IMUL3L: Signed Multiply.
6031//
6032// Forms:
6033//
6034// 	IMUL3L imm8  r32 r32
6035// 	IMUL3L imm32 r32 r32
6036// 	IMUL3L imm8  m32 r32
6037// 	IMUL3L imm32 m32 r32
6038func IMUL3L(i, mr, r operand.Op) (*intrep.Instruction, error) {
6039	switch {
6040	case operand.IsIMM8(i) && operand.IsR32(mr) && operand.IsR32(r):
6041		return &intrep.Instruction{
6042			Opcode:   "IMUL3L",
6043			Operands: []operand.Op{i, mr, r},
6044			Inputs:   []operand.Op{mr},
6045			Outputs:  []operand.Op{r},
6046		}, nil
6047	case operand.IsIMM32(i) && operand.IsR32(mr) && operand.IsR32(r):
6048		return &intrep.Instruction{
6049			Opcode:   "IMUL3L",
6050			Operands: []operand.Op{i, mr, r},
6051			Inputs:   []operand.Op{mr},
6052			Outputs:  []operand.Op{r},
6053		}, nil
6054	case operand.IsIMM8(i) && operand.IsM32(mr) && operand.IsR32(r):
6055		return &intrep.Instruction{
6056			Opcode:   "IMUL3L",
6057			Operands: []operand.Op{i, mr, r},
6058			Inputs:   []operand.Op{mr},
6059			Outputs:  []operand.Op{r},
6060		}, nil
6061	case operand.IsIMM32(i) && operand.IsM32(mr) && operand.IsR32(r):
6062		return &intrep.Instruction{
6063			Opcode:   "IMUL3L",
6064			Operands: []operand.Op{i, mr, r},
6065			Inputs:   []operand.Op{mr},
6066			Outputs:  []operand.Op{r},
6067		}, nil
6068	}
6069	return nil, errors.New("IMUL3L: bad operands")
6070}
6071
6072// IMUL3Q: Signed Multiply.
6073//
6074// Forms:
6075//
6076// 	IMUL3Q imm8  r64 r64
6077// 	IMUL3Q imm32 r64 r64
6078// 	IMUL3Q imm8  m64 r64
6079// 	IMUL3Q imm32 m64 r64
6080func IMUL3Q(i, mr, r operand.Op) (*intrep.Instruction, error) {
6081	switch {
6082	case operand.IsIMM8(i) && operand.IsR64(mr) && operand.IsR64(r):
6083		return &intrep.Instruction{
6084			Opcode:   "IMUL3Q",
6085			Operands: []operand.Op{i, mr, r},
6086			Inputs:   []operand.Op{mr},
6087			Outputs:  []operand.Op{r},
6088		}, nil
6089	case operand.IsIMM32(i) && operand.IsR64(mr) && operand.IsR64(r):
6090		return &intrep.Instruction{
6091			Opcode:   "IMUL3Q",
6092			Operands: []operand.Op{i, mr, r},
6093			Inputs:   []operand.Op{mr},
6094			Outputs:  []operand.Op{r},
6095		}, nil
6096	case operand.IsIMM8(i) && operand.IsM64(mr) && operand.IsR64(r):
6097		return &intrep.Instruction{
6098			Opcode:   "IMUL3Q",
6099			Operands: []operand.Op{i, mr, r},
6100			Inputs:   []operand.Op{mr},
6101			Outputs:  []operand.Op{r},
6102		}, nil
6103	case operand.IsIMM32(i) && operand.IsM64(mr) && operand.IsR64(r):
6104		return &intrep.Instruction{
6105			Opcode:   "IMUL3Q",
6106			Operands: []operand.Op{i, mr, r},
6107			Inputs:   []operand.Op{mr},
6108			Outputs:  []operand.Op{r},
6109		}, nil
6110	}
6111	return nil, errors.New("IMUL3Q: bad operands")
6112}
6113
6114// IMUL3W: Signed Multiply.
6115//
6116// Forms:
6117//
6118// 	IMUL3W imm8  r16 r16
6119// 	IMUL3W imm16 r16 r16
6120// 	IMUL3W imm8  m16 r16
6121// 	IMUL3W imm16 m16 r16
6122func IMUL3W(i, mr, r operand.Op) (*intrep.Instruction, error) {
6123	switch {
6124	case operand.IsIMM8(i) && operand.IsR16(mr) && operand.IsR16(r):
6125		return &intrep.Instruction{
6126			Opcode:   "IMUL3W",
6127			Operands: []operand.Op{i, mr, r},
6128			Inputs:   []operand.Op{mr},
6129			Outputs:  []operand.Op{r},
6130		}, nil
6131	case operand.IsIMM16(i) && operand.IsR16(mr) && operand.IsR16(r):
6132		return &intrep.Instruction{
6133			Opcode:   "IMUL3W",
6134			Operands: []operand.Op{i, mr, r},
6135			Inputs:   []operand.Op{mr},
6136			Outputs:  []operand.Op{r},
6137		}, nil
6138	case operand.IsIMM8(i) && operand.IsM16(mr) && operand.IsR16(r):
6139		return &intrep.Instruction{
6140			Opcode:   "IMUL3W",
6141			Operands: []operand.Op{i, mr, r},
6142			Inputs:   []operand.Op{mr},
6143			Outputs:  []operand.Op{r},
6144		}, nil
6145	case operand.IsIMM16(i) && operand.IsM16(mr) && operand.IsR16(r):
6146		return &intrep.Instruction{
6147			Opcode:   "IMUL3W",
6148			Operands: []operand.Op{i, mr, r},
6149			Inputs:   []operand.Op{mr},
6150			Outputs:  []operand.Op{r},
6151		}, nil
6152	}
6153	return nil, errors.New("IMUL3W: bad operands")
6154}
6155
6156// IMULB: Signed Multiply.
6157//
6158// Forms:
6159//
6160// 	IMULB r8
6161// 	IMULB m8
6162func IMULB(mr operand.Op) (*intrep.Instruction, error) {
6163	switch {
6164	case operand.IsR8(mr):
6165		return &intrep.Instruction{
6166			Opcode:   "IMULB",
6167			Operands: []operand.Op{mr},
6168			Inputs:   []operand.Op{mr, reg.AL},
6169			Outputs:  []operand.Op{reg.AX},
6170		}, nil
6171	case operand.IsM8(mr):
6172		return &intrep.Instruction{
6173			Opcode:   "IMULB",
6174			Operands: []operand.Op{mr},
6175			Inputs:   []operand.Op{mr, reg.AL},
6176			Outputs:  []operand.Op{reg.AX},
6177		}, nil
6178	}
6179	return nil, errors.New("IMULB: bad operands")
6180}
6181
6182// IMULL: Signed Multiply.
6183//
6184// Forms:
6185//
6186// 	IMULL r32
6187// 	IMULL m32
6188// 	IMULL r32 r32
6189// 	IMULL m32 r32
6190func IMULL(ops ...operand.Op) (*intrep.Instruction, error) {
6191	switch {
6192	case len(ops) == 1 && operand.IsR32(ops[0]):
6193		return &intrep.Instruction{
6194			Opcode:   "IMULL",
6195			Operands: ops,
6196			Inputs:   []operand.Op{ops[0], reg.EAX},
6197			Outputs:  []operand.Op{reg.EAX, reg.EDX},
6198		}, nil
6199	case len(ops) == 1 && operand.IsM32(ops[0]):
6200		return &intrep.Instruction{
6201			Opcode:   "IMULL",
6202			Operands: ops,
6203			Inputs:   []operand.Op{ops[0], reg.EAX},
6204			Outputs:  []operand.Op{reg.EAX, reg.EDX},
6205		}, nil
6206	case len(ops) == 2 && operand.IsR32(ops[0]) && operand.IsR32(ops[1]):
6207		return &intrep.Instruction{
6208			Opcode:   "IMULL",
6209			Operands: ops,
6210			Inputs:   []operand.Op{ops[0], ops[1]},
6211			Outputs:  []operand.Op{ops[1]},
6212		}, nil
6213	case len(ops) == 2 && operand.IsM32(ops[0]) && operand.IsR32(ops[1]):
6214		return &intrep.Instruction{
6215			Opcode:   "IMULL",
6216			Operands: ops,
6217			Inputs:   []operand.Op{ops[0], ops[1]},
6218			Outputs:  []operand.Op{ops[1]},
6219		}, nil
6220	}
6221	return nil, errors.New("IMULL: bad operands")
6222}
6223
6224// IMULQ: Signed Multiply.
6225//
6226// Forms:
6227//
6228// 	IMULQ r64
6229// 	IMULQ m64
6230// 	IMULQ r64 r64
6231// 	IMULQ m64 r64
6232func IMULQ(ops ...operand.Op) (*intrep.Instruction, error) {
6233	switch {
6234	case len(ops) == 1 && operand.IsR64(ops[0]):
6235		return &intrep.Instruction{
6236			Opcode:   "IMULQ",
6237			Operands: ops,
6238			Inputs:   []operand.Op{ops[0], reg.RAX},
6239			Outputs:  []operand.Op{reg.RAX, reg.RDX},
6240		}, nil
6241	case len(ops) == 1 && operand.IsM64(ops[0]):
6242		return &intrep.Instruction{
6243			Opcode:   "IMULQ",
6244			Operands: ops,
6245			Inputs:   []operand.Op{ops[0], reg.RAX},
6246			Outputs:  []operand.Op{reg.RAX, reg.RDX},
6247		}, nil
6248	case len(ops) == 2 && operand.IsR64(ops[0]) && operand.IsR64(ops[1]):
6249		return &intrep.Instruction{
6250			Opcode:   "IMULQ",
6251			Operands: ops,
6252			Inputs:   []operand.Op{ops[0], ops[1]},
6253			Outputs:  []operand.Op{ops[1]},
6254		}, nil
6255	case len(ops) == 2 && operand.IsM64(ops[0]) && operand.IsR64(ops[1]):
6256		return &intrep.Instruction{
6257			Opcode:   "IMULQ",
6258			Operands: ops,
6259			Inputs:   []operand.Op{ops[0], ops[1]},
6260			Outputs:  []operand.Op{ops[1]},
6261		}, nil
6262	}
6263	return nil, errors.New("IMULQ: bad operands")
6264}
6265
6266// IMULW: Signed Multiply.
6267//
6268// Forms:
6269//
6270// 	IMULW r16
6271// 	IMULW m16
6272// 	IMULW r16 r16
6273// 	IMULW m16 r16
6274func IMULW(ops ...operand.Op) (*intrep.Instruction, error) {
6275	switch {
6276	case len(ops) == 1 && operand.IsR16(ops[0]):
6277		return &intrep.Instruction{
6278			Opcode:   "IMULW",
6279			Operands: ops,
6280			Inputs:   []operand.Op{ops[0], reg.AX},
6281			Outputs:  []operand.Op{reg.AX, reg.DX},
6282		}, nil
6283	case len(ops) == 1 && operand.IsM16(ops[0]):
6284		return &intrep.Instruction{
6285			Opcode:   "IMULW",
6286			Operands: ops,
6287			Inputs:   []operand.Op{ops[0], reg.AX},
6288			Outputs:  []operand.Op{reg.AX, reg.DX},
6289		}, nil
6290	case len(ops) == 2 && operand.IsR16(ops[0]) && operand.IsR16(ops[1]):
6291		return &intrep.Instruction{
6292			Opcode:   "IMULW",
6293			Operands: ops,
6294			Inputs:   []operand.Op{ops[0], ops[1]},
6295			Outputs:  []operand.Op{ops[1]},
6296		}, nil
6297	case len(ops) == 2 && operand.IsM16(ops[0]) && operand.IsR16(ops[1]):
6298		return &intrep.Instruction{
6299			Opcode:   "IMULW",
6300			Operands: ops,
6301			Inputs:   []operand.Op{ops[0], ops[1]},
6302			Outputs:  []operand.Op{ops[1]},
6303		}, nil
6304	}
6305	return nil, errors.New("IMULW: bad operands")
6306}
6307
6308// INCB: Increment by 1.
6309//
6310// Forms:
6311//
6312// 	INCB r8
6313// 	INCB m8
6314func INCB(mr operand.Op) (*intrep.Instruction, error) {
6315	switch {
6316	case operand.IsR8(mr):
6317		return &intrep.Instruction{
6318			Opcode:   "INCB",
6319			Operands: []operand.Op{mr},
6320			Inputs:   []operand.Op{mr},
6321			Outputs:  []operand.Op{mr},
6322		}, nil
6323	case operand.IsM8(mr):
6324		return &intrep.Instruction{
6325			Opcode:   "INCB",
6326			Operands: []operand.Op{mr},
6327			Inputs:   []operand.Op{mr},
6328			Outputs:  []operand.Op{mr},
6329		}, nil
6330	}
6331	return nil, errors.New("INCB: bad operands")
6332}
6333
6334// INCL: Increment by 1.
6335//
6336// Forms:
6337//
6338// 	INCL r32
6339// 	INCL m32
6340func INCL(mr operand.Op) (*intrep.Instruction, error) {
6341	switch {
6342	case operand.IsR32(mr):
6343		return &intrep.Instruction{
6344			Opcode:   "INCL",
6345			Operands: []operand.Op{mr},
6346			Inputs:   []operand.Op{mr},
6347			Outputs:  []operand.Op{mr},
6348		}, nil
6349	case operand.IsM32(mr):
6350		return &intrep.Instruction{
6351			Opcode:   "INCL",
6352			Operands: []operand.Op{mr},
6353			Inputs:   []operand.Op{mr},
6354			Outputs:  []operand.Op{mr},
6355		}, nil
6356	}
6357	return nil, errors.New("INCL: bad operands")
6358}
6359
6360// INCQ: Increment by 1.
6361//
6362// Forms:
6363//
6364// 	INCQ r64
6365// 	INCQ m64
6366func INCQ(mr operand.Op) (*intrep.Instruction, error) {
6367	switch {
6368	case operand.IsR64(mr):
6369		return &intrep.Instruction{
6370			Opcode:   "INCQ",
6371			Operands: []operand.Op{mr},
6372			Inputs:   []operand.Op{mr},
6373			Outputs:  []operand.Op{mr},
6374		}, nil
6375	case operand.IsM64(mr):
6376		return &intrep.Instruction{
6377			Opcode:   "INCQ",
6378			Operands: []operand.Op{mr},
6379			Inputs:   []operand.Op{mr},
6380			Outputs:  []operand.Op{mr},
6381		}, nil
6382	}
6383	return nil, errors.New("INCQ: bad operands")
6384}
6385
6386// INCW: Increment by 1.
6387//
6388// Forms:
6389//
6390// 	INCW r16
6391// 	INCW m16
6392func INCW(mr operand.Op) (*intrep.Instruction, error) {
6393	switch {
6394	case operand.IsR16(mr):
6395		return &intrep.Instruction{
6396			Opcode:   "INCW",
6397			Operands: []operand.Op{mr},
6398			Inputs:   []operand.Op{mr},
6399			Outputs:  []operand.Op{mr},
6400		}, nil
6401	case operand.IsM16(mr):
6402		return &intrep.Instruction{
6403			Opcode:   "INCW",
6404			Operands: []operand.Op{mr},
6405			Inputs:   []operand.Op{mr},
6406			Outputs:  []operand.Op{mr},
6407		}, nil
6408	}
6409	return nil, errors.New("INCW: bad operands")
6410}
6411
6412// INSERTPS: Insert Packed Single Precision Floating-Point Value.
6413//
6414// Forms:
6415//
6416// 	INSERTPS imm8 xmm xmm
6417// 	INSERTPS imm8 m32 xmm
6418func INSERTPS(i, mx, x operand.Op) (*intrep.Instruction, error) {
6419	switch {
6420	case operand.IsIMM8(i) && operand.IsXMM(mx) && operand.IsXMM(x):
6421		return &intrep.Instruction{
6422			Opcode:   "INSERTPS",
6423			Operands: []operand.Op{i, mx, x},
6424			Inputs:   []operand.Op{mx, x},
6425			Outputs:  []operand.Op{x},
6426			ISA:      []string{"SSE4.1"},
6427		}, nil
6428	case operand.IsIMM8(i) && operand.IsM32(mx) && operand.IsXMM(x):
6429		return &intrep.Instruction{
6430			Opcode:   "INSERTPS",
6431			Operands: []operand.Op{i, mx, x},
6432			Inputs:   []operand.Op{mx, x},
6433			Outputs:  []operand.Op{x},
6434			ISA:      []string{"SSE4.1"},
6435		}, nil
6436	}
6437	return nil, errors.New("INSERTPS: bad operands")
6438}
6439
6440// INT: Call to Interrupt Procedure.
6441//
6442// Forms:
6443//
6444// 	INT 3
6445// 	INT imm8
6446func INT(i operand.Op) (*intrep.Instruction, error) {
6447	switch {
6448	case operand.Is3(i):
6449		return &intrep.Instruction{
6450			Opcode:   "INT",
6451			Operands: []operand.Op{i},
6452			Inputs:   []operand.Op{},
6453			Outputs:  []operand.Op{},
6454		}, nil
6455	case operand.IsIMM8(i):
6456		return &intrep.Instruction{
6457			Opcode:   "INT",
6458			Operands: []operand.Op{i},
6459			Inputs:   []operand.Op{},
6460			Outputs:  []operand.Op{},
6461		}, nil
6462	}
6463	return nil, errors.New("INT: bad operands")
6464}
6465
6466// JA: Jump if above (CF == 0 and ZF == 0).
6467//
6468// Forms:
6469//
6470// 	JA rel8
6471// 	JA rel32
6472func JA(r operand.Op) (*intrep.Instruction, error) {
6473	switch {
6474	case operand.IsREL8(r):
6475		return &intrep.Instruction{
6476			Opcode:        "JA",
6477			Operands:      []operand.Op{r},
6478			Inputs:        []operand.Op{},
6479			Outputs:       []operand.Op{},
6480			IsBranch:      true,
6481			IsConditional: true,
6482		}, nil
6483	case operand.IsREL32(r):
6484		return &intrep.Instruction{
6485			Opcode:        "JA",
6486			Operands:      []operand.Op{r},
6487			Inputs:        []operand.Op{},
6488			Outputs:       []operand.Op{},
6489			IsBranch:      true,
6490			IsConditional: true,
6491		}, nil
6492	}
6493	return nil, errors.New("JA: bad operands")
6494}
6495
6496// JAE: Jump if above or equal (CF == 0).
6497//
6498// Forms:
6499//
6500// 	JAE rel8
6501// 	JAE rel32
6502func JAE(r operand.Op) (*intrep.Instruction, error) {
6503	switch {
6504	case operand.IsREL8(r):
6505		return &intrep.Instruction{
6506			Opcode:        "JAE",
6507			Operands:      []operand.Op{r},
6508			Inputs:        []operand.Op{},
6509			Outputs:       []operand.Op{},
6510			IsBranch:      true,
6511			IsConditional: true,
6512		}, nil
6513	case operand.IsREL32(r):
6514		return &intrep.Instruction{
6515			Opcode:        "JAE",
6516			Operands:      []operand.Op{r},
6517			Inputs:        []operand.Op{},
6518			Outputs:       []operand.Op{},
6519			IsBranch:      true,
6520			IsConditional: true,
6521		}, nil
6522	}
6523	return nil, errors.New("JAE: bad operands")
6524}
6525
6526// JB: Jump if below (CF == 1).
6527//
6528// Forms:
6529//
6530// 	JB rel8
6531// 	JB rel32
6532func JB(r operand.Op) (*intrep.Instruction, error) {
6533	switch {
6534	case operand.IsREL8(r):
6535		return &intrep.Instruction{
6536			Opcode:        "JB",
6537			Operands:      []operand.Op{r},
6538			Inputs:        []operand.Op{},
6539			Outputs:       []operand.Op{},
6540			IsBranch:      true,
6541			IsConditional: true,
6542		}, nil
6543	case operand.IsREL32(r):
6544		return &intrep.Instruction{
6545			Opcode:        "JB",
6546			Operands:      []operand.Op{r},
6547			Inputs:        []operand.Op{},
6548			Outputs:       []operand.Op{},
6549			IsBranch:      true,
6550			IsConditional: true,
6551		}, nil
6552	}
6553	return nil, errors.New("JB: bad operands")
6554}
6555
6556// JBE: Jump if below or equal (CF == 1 or ZF == 1).
6557//
6558// Forms:
6559//
6560// 	JBE rel8
6561// 	JBE rel32
6562func JBE(r operand.Op) (*intrep.Instruction, error) {
6563	switch {
6564	case operand.IsREL8(r):
6565		return &intrep.Instruction{
6566			Opcode:        "JBE",
6567			Operands:      []operand.Op{r},
6568			Inputs:        []operand.Op{},
6569			Outputs:       []operand.Op{},
6570			IsBranch:      true,
6571			IsConditional: true,
6572		}, nil
6573	case operand.IsREL32(r):
6574		return &intrep.Instruction{
6575			Opcode:        "JBE",
6576			Operands:      []operand.Op{r},
6577			Inputs:        []operand.Op{},
6578			Outputs:       []operand.Op{},
6579			IsBranch:      true,
6580			IsConditional: true,
6581		}, nil
6582	}
6583	return nil, errors.New("JBE: bad operands")
6584}
6585
6586// JC: Jump if below (CF == 1).
6587//
6588// Forms:
6589//
6590// 	JC rel8
6591// 	JC rel32
6592func JC(r operand.Op) (*intrep.Instruction, error) {
6593	switch {
6594	case operand.IsREL8(r):
6595		return &intrep.Instruction{
6596			Opcode:        "JC",
6597			Operands:      []operand.Op{r},
6598			Inputs:        []operand.Op{},
6599			Outputs:       []operand.Op{},
6600			IsBranch:      true,
6601			IsConditional: true,
6602		}, nil
6603	case operand.IsREL32(r):
6604		return &intrep.Instruction{
6605			Opcode:        "JC",
6606			Operands:      []operand.Op{r},
6607			Inputs:        []operand.Op{},
6608			Outputs:       []operand.Op{},
6609			IsBranch:      true,
6610			IsConditional: true,
6611		}, nil
6612	}
6613	return nil, errors.New("JC: bad operands")
6614}
6615
6616// JCC: Jump if above or equal (CF == 0).
6617//
6618// Forms:
6619//
6620// 	JCC rel8
6621// 	JCC rel32
6622func JCC(r operand.Op) (*intrep.Instruction, error) {
6623	switch {
6624	case operand.IsREL8(r):
6625		return &intrep.Instruction{
6626			Opcode:        "JCC",
6627			Operands:      []operand.Op{r},
6628			Inputs:        []operand.Op{},
6629			Outputs:       []operand.Op{},
6630			IsBranch:      true,
6631			IsConditional: true,
6632		}, nil
6633	case operand.IsREL32(r):
6634		return &intrep.Instruction{
6635			Opcode:        "JCC",
6636			Operands:      []operand.Op{r},
6637			Inputs:        []operand.Op{},
6638			Outputs:       []operand.Op{},
6639			IsBranch:      true,
6640			IsConditional: true,
6641		}, nil
6642	}
6643	return nil, errors.New("JCC: bad operands")
6644}
6645
6646// JCS: Jump if below (CF == 1).
6647//
6648// Forms:
6649//
6650// 	JCS rel8
6651// 	JCS rel32
6652func JCS(r operand.Op) (*intrep.Instruction, error) {
6653	switch {
6654	case operand.IsREL8(r):
6655		return &intrep.Instruction{
6656			Opcode:        "JCS",
6657			Operands:      []operand.Op{r},
6658			Inputs:        []operand.Op{},
6659			Outputs:       []operand.Op{},
6660			IsBranch:      true,
6661			IsConditional: true,
6662		}, nil
6663	case operand.IsREL32(r):
6664		return &intrep.Instruction{
6665			Opcode:        "JCS",
6666			Operands:      []operand.Op{r},
6667			Inputs:        []operand.Op{},
6668			Outputs:       []operand.Op{},
6669			IsBranch:      true,
6670			IsConditional: true,
6671		}, nil
6672	}
6673	return nil, errors.New("JCS: bad operands")
6674}
6675
6676// JCXZL: Jump if ECX register is 0.
6677//
6678// Forms:
6679//
6680// 	JCXZL rel8
6681func JCXZL(r operand.Op) (*intrep.Instruction, error) {
6682	switch {
6683	case operand.IsREL8(r):
6684		return &intrep.Instruction{
6685			Opcode:        "JCXZL",
6686			Operands:      []operand.Op{r},
6687			Inputs:        []operand.Op{reg.ECX},
6688			Outputs:       []operand.Op{},
6689			IsBranch:      true,
6690			IsConditional: true,
6691		}, nil
6692	}
6693	return nil, errors.New("JCXZL: bad operands")
6694}
6695
6696// JCXZQ: Jump if RCX register is 0.
6697//
6698// Forms:
6699//
6700// 	JCXZQ rel8
6701func JCXZQ(r operand.Op) (*intrep.Instruction, error) {
6702	switch {
6703	case operand.IsREL8(r):
6704		return &intrep.Instruction{
6705			Opcode:        "JCXZQ",
6706			Operands:      []operand.Op{r},
6707			Inputs:        []operand.Op{reg.RCX},
6708			Outputs:       []operand.Op{},
6709			IsBranch:      true,
6710			IsConditional: true,
6711		}, nil
6712	}
6713	return nil, errors.New("JCXZQ: bad operands")
6714}
6715
6716// JE: Jump if equal (ZF == 1).
6717//
6718// Forms:
6719//
6720// 	JE rel8
6721// 	JE rel32
6722func JE(r operand.Op) (*intrep.Instruction, error) {
6723	switch {
6724	case operand.IsREL8(r):
6725		return &intrep.Instruction{
6726			Opcode:        "JE",
6727			Operands:      []operand.Op{r},
6728			Inputs:        []operand.Op{},
6729			Outputs:       []operand.Op{},
6730			IsBranch:      true,
6731			IsConditional: true,
6732		}, nil
6733	case operand.IsREL32(r):
6734		return &intrep.Instruction{
6735			Opcode:        "JE",
6736			Operands:      []operand.Op{r},
6737			Inputs:        []operand.Op{},
6738			Outputs:       []operand.Op{},
6739			IsBranch:      true,
6740			IsConditional: true,
6741		}, nil
6742	}
6743	return nil, errors.New("JE: bad operands")
6744}
6745
6746// JEQ: Jump if equal (ZF == 1).
6747//
6748// Forms:
6749//
6750// 	JEQ rel8
6751// 	JEQ rel32
6752func JEQ(r operand.Op) (*intrep.Instruction, error) {
6753	switch {
6754	case operand.IsREL8(r):
6755		return &intrep.Instruction{
6756			Opcode:        "JEQ",
6757			Operands:      []operand.Op{r},
6758			Inputs:        []operand.Op{},
6759			Outputs:       []operand.Op{},
6760			IsBranch:      true,
6761			IsConditional: true,
6762		}, nil
6763	case operand.IsREL32(r):
6764		return &intrep.Instruction{
6765			Opcode:        "JEQ",
6766			Operands:      []operand.Op{r},
6767			Inputs:        []operand.Op{},
6768			Outputs:       []operand.Op{},
6769			IsBranch:      true,
6770			IsConditional: true,
6771		}, nil
6772	}
6773	return nil, errors.New("JEQ: bad operands")
6774}
6775
6776// JG: Jump if greater (ZF == 0 and SF == OF).
6777//
6778// Forms:
6779//
6780// 	JG rel8
6781// 	JG rel32
6782func JG(r operand.Op) (*intrep.Instruction, error) {
6783	switch {
6784	case operand.IsREL8(r):
6785		return &intrep.Instruction{
6786			Opcode:        "JG",
6787			Operands:      []operand.Op{r},
6788			Inputs:        []operand.Op{},
6789			Outputs:       []operand.Op{},
6790			IsBranch:      true,
6791			IsConditional: true,
6792		}, nil
6793	case operand.IsREL32(r):
6794		return &intrep.Instruction{
6795			Opcode:        "JG",
6796			Operands:      []operand.Op{r},
6797			Inputs:        []operand.Op{},
6798			Outputs:       []operand.Op{},
6799			IsBranch:      true,
6800			IsConditional: true,
6801		}, nil
6802	}
6803	return nil, errors.New("JG: bad operands")
6804}
6805
6806// JGE: Jump if greater or equal (SF == OF).
6807//
6808// Forms:
6809//
6810// 	JGE rel8
6811// 	JGE rel32
6812func JGE(r operand.Op) (*intrep.Instruction, error) {
6813	switch {
6814	case operand.IsREL8(r):
6815		return &intrep.Instruction{
6816			Opcode:        "JGE",
6817			Operands:      []operand.Op{r},
6818			Inputs:        []operand.Op{},
6819			Outputs:       []operand.Op{},
6820			IsBranch:      true,
6821			IsConditional: true,
6822		}, nil
6823	case operand.IsREL32(r):
6824		return &intrep.Instruction{
6825			Opcode:        "JGE",
6826			Operands:      []operand.Op{r},
6827			Inputs:        []operand.Op{},
6828			Outputs:       []operand.Op{},
6829			IsBranch:      true,
6830			IsConditional: true,
6831		}, nil
6832	}
6833	return nil, errors.New("JGE: bad operands")
6834}
6835
6836// JGT: Jump if greater (ZF == 0 and SF == OF).
6837//
6838// Forms:
6839//
6840// 	JGT rel8
6841// 	JGT rel32
6842func JGT(r operand.Op) (*intrep.Instruction, error) {
6843	switch {
6844	case operand.IsREL8(r):
6845		return &intrep.Instruction{
6846			Opcode:        "JGT",
6847			Operands:      []operand.Op{r},
6848			Inputs:        []operand.Op{},
6849			Outputs:       []operand.Op{},
6850			IsBranch:      true,
6851			IsConditional: true,
6852		}, nil
6853	case operand.IsREL32(r):
6854		return &intrep.Instruction{
6855			Opcode:        "JGT",
6856			Operands:      []operand.Op{r},
6857			Inputs:        []operand.Op{},
6858			Outputs:       []operand.Op{},
6859			IsBranch:      true,
6860			IsConditional: true,
6861		}, nil
6862	}
6863	return nil, errors.New("JGT: bad operands")
6864}
6865
6866// JHI: Jump if above (CF == 0 and ZF == 0).
6867//
6868// Forms:
6869//
6870// 	JHI rel8
6871// 	JHI rel32
6872func JHI(r operand.Op) (*intrep.Instruction, error) {
6873	switch {
6874	case operand.IsREL8(r):
6875		return &intrep.Instruction{
6876			Opcode:        "JHI",
6877			Operands:      []operand.Op{r},
6878			Inputs:        []operand.Op{},
6879			Outputs:       []operand.Op{},
6880			IsBranch:      true,
6881			IsConditional: true,
6882		}, nil
6883	case operand.IsREL32(r):
6884		return &intrep.Instruction{
6885			Opcode:        "JHI",
6886			Operands:      []operand.Op{r},
6887			Inputs:        []operand.Op{},
6888			Outputs:       []operand.Op{},
6889			IsBranch:      true,
6890			IsConditional: true,
6891		}, nil
6892	}
6893	return nil, errors.New("JHI: bad operands")
6894}
6895
6896// JHS: Jump if above or equal (CF == 0).
6897//
6898// Forms:
6899//
6900// 	JHS rel8
6901// 	JHS rel32
6902func JHS(r operand.Op) (*intrep.Instruction, error) {
6903	switch {
6904	case operand.IsREL8(r):
6905		return &intrep.Instruction{
6906			Opcode:        "JHS",
6907			Operands:      []operand.Op{r},
6908			Inputs:        []operand.Op{},
6909			Outputs:       []operand.Op{},
6910			IsBranch:      true,
6911			IsConditional: true,
6912		}, nil
6913	case operand.IsREL32(r):
6914		return &intrep.Instruction{
6915			Opcode:        "JHS",
6916			Operands:      []operand.Op{r},
6917			Inputs:        []operand.Op{},
6918			Outputs:       []operand.Op{},
6919			IsBranch:      true,
6920			IsConditional: true,
6921		}, nil
6922	}
6923	return nil, errors.New("JHS: bad operands")
6924}
6925
6926// JL: Jump if less (SF != OF).
6927//
6928// Forms:
6929//
6930// 	JL rel8
6931// 	JL rel32
6932func JL(r operand.Op) (*intrep.Instruction, error) {
6933	switch {
6934	case operand.IsREL8(r):
6935		return &intrep.Instruction{
6936			Opcode:        "JL",
6937			Operands:      []operand.Op{r},
6938			Inputs:        []operand.Op{},
6939			Outputs:       []operand.Op{},
6940			IsBranch:      true,
6941			IsConditional: true,
6942		}, nil
6943	case operand.IsREL32(r):
6944		return &intrep.Instruction{
6945			Opcode:        "JL",
6946			Operands:      []operand.Op{r},
6947			Inputs:        []operand.Op{},
6948			Outputs:       []operand.Op{},
6949			IsBranch:      true,
6950			IsConditional: true,
6951		}, nil
6952	}
6953	return nil, errors.New("JL: bad operands")
6954}
6955
6956// JLE: Jump if less or equal (ZF == 1 or SF != OF).
6957//
6958// Forms:
6959//
6960// 	JLE rel8
6961// 	JLE rel32
6962func JLE(r operand.Op) (*intrep.Instruction, error) {
6963	switch {
6964	case operand.IsREL8(r):
6965		return &intrep.Instruction{
6966			Opcode:        "JLE",
6967			Operands:      []operand.Op{r},
6968			Inputs:        []operand.Op{},
6969			Outputs:       []operand.Op{},
6970			IsBranch:      true,
6971			IsConditional: true,
6972		}, nil
6973	case operand.IsREL32(r):
6974		return &intrep.Instruction{
6975			Opcode:        "JLE",
6976			Operands:      []operand.Op{r},
6977			Inputs:        []operand.Op{},
6978			Outputs:       []operand.Op{},
6979			IsBranch:      true,
6980			IsConditional: true,
6981		}, nil
6982	}
6983	return nil, errors.New("JLE: bad operands")
6984}
6985
6986// JLO: Jump if below (CF == 1).
6987//
6988// Forms:
6989//
6990// 	JLO rel8
6991// 	JLO rel32
6992func JLO(r operand.Op) (*intrep.Instruction, error) {
6993	switch {
6994	case operand.IsREL8(r):
6995		return &intrep.Instruction{
6996			Opcode:        "JLO",
6997			Operands:      []operand.Op{r},
6998			Inputs:        []operand.Op{},
6999			Outputs:       []operand.Op{},
7000			IsBranch:      true,
7001			IsConditional: true,
7002		}, nil
7003	case operand.IsREL32(r):
7004		return &intrep.Instruction{
7005			Opcode:        "JLO",
7006			Operands:      []operand.Op{r},
7007			Inputs:        []operand.Op{},
7008			Outputs:       []operand.Op{},
7009			IsBranch:      true,
7010			IsConditional: true,
7011		}, nil
7012	}
7013	return nil, errors.New("JLO: bad operands")
7014}
7015
7016// JLS: Jump if below or equal (CF == 1 or ZF == 1).
7017//
7018// Forms:
7019//
7020// 	JLS rel8
7021// 	JLS rel32
7022func JLS(r operand.Op) (*intrep.Instruction, error) {
7023	switch {
7024	case operand.IsREL8(r):
7025		return &intrep.Instruction{
7026			Opcode:        "JLS",
7027			Operands:      []operand.Op{r},
7028			Inputs:        []operand.Op{},
7029			Outputs:       []operand.Op{},
7030			IsBranch:      true,
7031			IsConditional: true,
7032		}, nil
7033	case operand.IsREL32(r):
7034		return &intrep.Instruction{
7035			Opcode:        "JLS",
7036			Operands:      []operand.Op{r},
7037			Inputs:        []operand.Op{},
7038			Outputs:       []operand.Op{},
7039			IsBranch:      true,
7040			IsConditional: true,
7041		}, nil
7042	}
7043	return nil, errors.New("JLS: bad operands")
7044}
7045
7046// JLT: Jump if less (SF != OF).
7047//
7048// Forms:
7049//
7050// 	JLT rel8
7051// 	JLT rel32
7052func JLT(r operand.Op) (*intrep.Instruction, error) {
7053	switch {
7054	case operand.IsREL8(r):
7055		return &intrep.Instruction{
7056			Opcode:        "JLT",
7057			Operands:      []operand.Op{r},
7058			Inputs:        []operand.Op{},
7059			Outputs:       []operand.Op{},
7060			IsBranch:      true,
7061			IsConditional: true,
7062		}, nil
7063	case operand.IsREL32(r):
7064		return &intrep.Instruction{
7065			Opcode:        "JLT",
7066			Operands:      []operand.Op{r},
7067			Inputs:        []operand.Op{},
7068			Outputs:       []operand.Op{},
7069			IsBranch:      true,
7070			IsConditional: true,
7071		}, nil
7072	}
7073	return nil, errors.New("JLT: bad operands")
7074}
7075
7076// JMI: Jump if sign (SF == 1).
7077//
7078// Forms:
7079//
7080// 	JMI rel8
7081// 	JMI rel32
7082func JMI(r operand.Op) (*intrep.Instruction, error) {
7083	switch {
7084	case operand.IsREL8(r):
7085		return &intrep.Instruction{
7086			Opcode:        "JMI",
7087			Operands:      []operand.Op{r},
7088			Inputs:        []operand.Op{},
7089			Outputs:       []operand.Op{},
7090			IsBranch:      true,
7091			IsConditional: true,
7092		}, nil
7093	case operand.IsREL32(r):
7094		return &intrep.Instruction{
7095			Opcode:        "JMI",
7096			Operands:      []operand.Op{r},
7097			Inputs:        []operand.Op{},
7098			Outputs:       []operand.Op{},
7099			IsBranch:      true,
7100			IsConditional: true,
7101		}, nil
7102	}
7103	return nil, errors.New("JMI: bad operands")
7104}
7105
7106// JMP: Jump Unconditionally.
7107//
7108// Forms:
7109//
7110// 	JMP rel8
7111// 	JMP rel32
7112// 	JMP r64
7113// 	JMP m64
7114func JMP(mr operand.Op) (*intrep.Instruction, error) {
7115	switch {
7116	case operand.IsREL8(mr):
7117		return &intrep.Instruction{
7118			Opcode:        "JMP",
7119			Operands:      []operand.Op{mr},
7120			Inputs:        []operand.Op{},
7121			Outputs:       []operand.Op{},
7122			IsBranch:      true,
7123			IsConditional: false,
7124		}, nil
7125	case operand.IsREL32(mr):
7126		return &intrep.Instruction{
7127			Opcode:        "JMP",
7128			Operands:      []operand.Op{mr},
7129			Inputs:        []operand.Op{},
7130			Outputs:       []operand.Op{},
7131			IsBranch:      true,
7132			IsConditional: false,
7133		}, nil
7134	case operand.IsR64(mr):
7135		return &intrep.Instruction{
7136			Opcode:        "JMP",
7137			Operands:      []operand.Op{mr},
7138			Inputs:        []operand.Op{mr},
7139			Outputs:       []operand.Op{},
7140			IsBranch:      true,
7141			IsConditional: false,
7142		}, nil
7143	case operand.IsM64(mr):
7144		return &intrep.Instruction{
7145			Opcode:        "JMP",
7146			Operands:      []operand.Op{mr},
7147			Inputs:        []operand.Op{mr},
7148			Outputs:       []operand.Op{},
7149			IsBranch:      true,
7150			IsConditional: false,
7151		}, nil
7152	}
7153	return nil, errors.New("JMP: bad operands")
7154}
7155
7156// JNA: Jump if below or equal (CF == 1 or ZF == 1).
7157//
7158// Forms:
7159//
7160// 	JNA rel8
7161// 	JNA rel32
7162func JNA(r operand.Op) (*intrep.Instruction, error) {
7163	switch {
7164	case operand.IsREL8(r):
7165		return &intrep.Instruction{
7166			Opcode:        "JNA",
7167			Operands:      []operand.Op{r},
7168			Inputs:        []operand.Op{},
7169			Outputs:       []operand.Op{},
7170			IsBranch:      true,
7171			IsConditional: true,
7172		}, nil
7173	case operand.IsREL32(r):
7174		return &intrep.Instruction{
7175			Opcode:        "JNA",
7176			Operands:      []operand.Op{r},
7177			Inputs:        []operand.Op{},
7178			Outputs:       []operand.Op{},
7179			IsBranch:      true,
7180			IsConditional: true,
7181		}, nil
7182	}
7183	return nil, errors.New("JNA: bad operands")
7184}
7185
7186// JNAE: Jump if below (CF == 1).
7187//
7188// Forms:
7189//
7190// 	JNAE rel8
7191// 	JNAE rel32
7192func JNAE(r operand.Op) (*intrep.Instruction, error) {
7193	switch {
7194	case operand.IsREL8(r):
7195		return &intrep.Instruction{
7196			Opcode:        "JNAE",
7197			Operands:      []operand.Op{r},
7198			Inputs:        []operand.Op{},
7199			Outputs:       []operand.Op{},
7200			IsBranch:      true,
7201			IsConditional: true,
7202		}, nil
7203	case operand.IsREL32(r):
7204		return &intrep.Instruction{
7205			Opcode:        "JNAE",
7206			Operands:      []operand.Op{r},
7207			Inputs:        []operand.Op{},
7208			Outputs:       []operand.Op{},
7209			IsBranch:      true,
7210			IsConditional: true,
7211		}, nil
7212	}
7213	return nil, errors.New("JNAE: bad operands")
7214}
7215
7216// JNB: Jump if above or equal (CF == 0).
7217//
7218// Forms:
7219//
7220// 	JNB rel8
7221// 	JNB rel32
7222func JNB(r operand.Op) (*intrep.Instruction, error) {
7223	switch {
7224	case operand.IsREL8(r):
7225		return &intrep.Instruction{
7226			Opcode:        "JNB",
7227			Operands:      []operand.Op{r},
7228			Inputs:        []operand.Op{},
7229			Outputs:       []operand.Op{},
7230			IsBranch:      true,
7231			IsConditional: true,
7232		}, nil
7233	case operand.IsREL32(r):
7234		return &intrep.Instruction{
7235			Opcode:        "JNB",
7236			Operands:      []operand.Op{r},
7237			Inputs:        []operand.Op{},
7238			Outputs:       []operand.Op{},
7239			IsBranch:      true,
7240			IsConditional: true,
7241		}, nil
7242	}
7243	return nil, errors.New("JNB: bad operands")
7244}
7245
7246// JNBE: Jump if above (CF == 0 and ZF == 0).
7247//
7248// Forms:
7249//
7250// 	JNBE rel8
7251// 	JNBE rel32
7252func JNBE(r operand.Op) (*intrep.Instruction, error) {
7253	switch {
7254	case operand.IsREL8(r):
7255		return &intrep.Instruction{
7256			Opcode:        "JNBE",
7257			Operands:      []operand.Op{r},
7258			Inputs:        []operand.Op{},
7259			Outputs:       []operand.Op{},
7260			IsBranch:      true,
7261			IsConditional: true,
7262		}, nil
7263	case operand.IsREL32(r):
7264		return &intrep.Instruction{
7265			Opcode:        "JNBE",
7266			Operands:      []operand.Op{r},
7267			Inputs:        []operand.Op{},
7268			Outputs:       []operand.Op{},
7269			IsBranch:      true,
7270			IsConditional: true,
7271		}, nil
7272	}
7273	return nil, errors.New("JNBE: bad operands")
7274}
7275
7276// JNC: Jump if above or equal (CF == 0).
7277//
7278// Forms:
7279//
7280// 	JNC rel8
7281// 	JNC rel32
7282func JNC(r operand.Op) (*intrep.Instruction, error) {
7283	switch {
7284	case operand.IsREL8(r):
7285		return &intrep.Instruction{
7286			Opcode:        "JNC",
7287			Operands:      []operand.Op{r},
7288			Inputs:        []operand.Op{},
7289			Outputs:       []operand.Op{},
7290			IsBranch:      true,
7291			IsConditional: true,
7292		}, nil
7293	case operand.IsREL32(r):
7294		return &intrep.Instruction{
7295			Opcode:        "JNC",
7296			Operands:      []operand.Op{r},
7297			Inputs:        []operand.Op{},
7298			Outputs:       []operand.Op{},
7299			IsBranch:      true,
7300			IsConditional: true,
7301		}, nil
7302	}
7303	return nil, errors.New("JNC: bad operands")
7304}
7305
7306// JNE: Jump if not equal (ZF == 0).
7307//
7308// Forms:
7309//
7310// 	JNE rel8
7311// 	JNE rel32
7312func JNE(r operand.Op) (*intrep.Instruction, error) {
7313	switch {
7314	case operand.IsREL8(r):
7315		return &intrep.Instruction{
7316			Opcode:        "JNE",
7317			Operands:      []operand.Op{r},
7318			Inputs:        []operand.Op{},
7319			Outputs:       []operand.Op{},
7320			IsBranch:      true,
7321			IsConditional: true,
7322		}, nil
7323	case operand.IsREL32(r):
7324		return &intrep.Instruction{
7325			Opcode:        "JNE",
7326			Operands:      []operand.Op{r},
7327			Inputs:        []operand.Op{},
7328			Outputs:       []operand.Op{},
7329			IsBranch:      true,
7330			IsConditional: true,
7331		}, nil
7332	}
7333	return nil, errors.New("JNE: bad operands")
7334}
7335
7336// JNG: Jump if less or equal (ZF == 1 or SF != OF).
7337//
7338// Forms:
7339//
7340// 	JNG rel8
7341// 	JNG rel32
7342func JNG(r operand.Op) (*intrep.Instruction, error) {
7343	switch {
7344	case operand.IsREL8(r):
7345		return &intrep.Instruction{
7346			Opcode:        "JNG",
7347			Operands:      []operand.Op{r},
7348			Inputs:        []operand.Op{},
7349			Outputs:       []operand.Op{},
7350			IsBranch:      true,
7351			IsConditional: true,
7352		}, nil
7353	case operand.IsREL32(r):
7354		return &intrep.Instruction{
7355			Opcode:        "JNG",
7356			Operands:      []operand.Op{r},
7357			Inputs:        []operand.Op{},
7358			Outputs:       []operand.Op{},
7359			IsBranch:      true,
7360			IsConditional: true,
7361		}, nil
7362	}
7363	return nil, errors.New("JNG: bad operands")
7364}
7365
7366// JNGE: Jump if less (SF != OF).
7367//
7368// Forms:
7369//
7370// 	JNGE rel8
7371// 	JNGE rel32
7372func JNGE(r operand.Op) (*intrep.Instruction, error) {
7373	switch {
7374	case operand.IsREL8(r):
7375		return &intrep.Instruction{
7376			Opcode:        "JNGE",
7377			Operands:      []operand.Op{r},
7378			Inputs:        []operand.Op{},
7379			Outputs:       []operand.Op{},
7380			IsBranch:      true,
7381			IsConditional: true,
7382		}, nil
7383	case operand.IsREL32(r):
7384		return &intrep.Instruction{
7385			Opcode:        "JNGE",
7386			Operands:      []operand.Op{r},
7387			Inputs:        []operand.Op{},
7388			Outputs:       []operand.Op{},
7389			IsBranch:      true,
7390			IsConditional: true,
7391		}, nil
7392	}
7393	return nil, errors.New("JNGE: bad operands")
7394}
7395
7396// JNL: Jump if greater or equal (SF == OF).
7397//
7398// Forms:
7399//
7400// 	JNL rel8
7401// 	JNL rel32
7402func JNL(r operand.Op) (*intrep.Instruction, error) {
7403	switch {
7404	case operand.IsREL8(r):
7405		return &intrep.Instruction{
7406			Opcode:        "JNL",
7407			Operands:      []operand.Op{r},
7408			Inputs:        []operand.Op{},
7409			Outputs:       []operand.Op{},
7410			IsBranch:      true,
7411			IsConditional: true,
7412		}, nil
7413	case operand.IsREL32(r):
7414		return &intrep.Instruction{
7415			Opcode:        "JNL",
7416			Operands:      []operand.Op{r},
7417			Inputs:        []operand.Op{},
7418			Outputs:       []operand.Op{},
7419			IsBranch:      true,
7420			IsConditional: true,
7421		}, nil
7422	}
7423	return nil, errors.New("JNL: bad operands")
7424}
7425
7426// JNLE: Jump if greater (ZF == 0 and SF == OF).
7427//
7428// Forms:
7429//
7430// 	JNLE rel8
7431// 	JNLE rel32
7432func JNLE(r operand.Op) (*intrep.Instruction, error) {
7433	switch {
7434	case operand.IsREL8(r):
7435		return &intrep.Instruction{
7436			Opcode:        "JNLE",
7437			Operands:      []operand.Op{r},
7438			Inputs:        []operand.Op{},
7439			Outputs:       []operand.Op{},
7440			IsBranch:      true,
7441			IsConditional: true,
7442		}, nil
7443	case operand.IsREL32(r):
7444		return &intrep.Instruction{
7445			Opcode:        "JNLE",
7446			Operands:      []operand.Op{r},
7447			Inputs:        []operand.Op{},
7448			Outputs:       []operand.Op{},
7449			IsBranch:      true,
7450			IsConditional: true,
7451		}, nil
7452	}
7453	return nil, errors.New("JNLE: bad operands")
7454}
7455
7456// JNO: Jump if not overflow (OF == 0).
7457//
7458// Forms:
7459//
7460// 	JNO rel8
7461// 	JNO rel32
7462func JNO(r operand.Op) (*intrep.Instruction, error) {
7463	switch {
7464	case operand.IsREL8(r):
7465		return &intrep.Instruction{
7466			Opcode:        "JNO",
7467			Operands:      []operand.Op{r},
7468			Inputs:        []operand.Op{},
7469			Outputs:       []operand.Op{},
7470			IsBranch:      true,
7471			IsConditional: true,
7472		}, nil
7473	case operand.IsREL32(r):
7474		return &intrep.Instruction{
7475			Opcode:        "JNO",
7476			Operands:      []operand.Op{r},
7477			Inputs:        []operand.Op{},
7478			Outputs:       []operand.Op{},
7479			IsBranch:      true,
7480			IsConditional: true,
7481		}, nil
7482	}
7483	return nil, errors.New("JNO: bad operands")
7484}
7485
7486// JNP: Jump if not parity (PF == 0).
7487//
7488// Forms:
7489//
7490// 	JNP rel8
7491// 	JNP rel32
7492func JNP(r operand.Op) (*intrep.Instruction, error) {
7493	switch {
7494	case operand.IsREL8(r):
7495		return &intrep.Instruction{
7496			Opcode:        "JNP",
7497			Operands:      []operand.Op{r},
7498			Inputs:        []operand.Op{},
7499			Outputs:       []operand.Op{},
7500			IsBranch:      true,
7501			IsConditional: true,
7502		}, nil
7503	case operand.IsREL32(r):
7504		return &intrep.Instruction{
7505			Opcode:        "JNP",
7506			Operands:      []operand.Op{r},
7507			Inputs:        []operand.Op{},
7508			Outputs:       []operand.Op{},
7509			IsBranch:      true,
7510			IsConditional: true,
7511		}, nil
7512	}
7513	return nil, errors.New("JNP: bad operands")
7514}
7515
7516// JNS: Jump if not sign (SF == 0).
7517//
7518// Forms:
7519//
7520// 	JNS rel8
7521// 	JNS rel32
7522func JNS(r operand.Op) (*intrep.Instruction, error) {
7523	switch {
7524	case operand.IsREL8(r):
7525		return &intrep.Instruction{
7526			Opcode:        "JNS",
7527			Operands:      []operand.Op{r},
7528			Inputs:        []operand.Op{},
7529			Outputs:       []operand.Op{},
7530			IsBranch:      true,
7531			IsConditional: true,
7532		}, nil
7533	case operand.IsREL32(r):
7534		return &intrep.Instruction{
7535			Opcode:        "JNS",
7536			Operands:      []operand.Op{r},
7537			Inputs:        []operand.Op{},
7538			Outputs:       []operand.Op{},
7539			IsBranch:      true,
7540			IsConditional: true,
7541		}, nil
7542	}
7543	return nil, errors.New("JNS: bad operands")
7544}
7545
7546// JNZ: Jump if not equal (ZF == 0).
7547//
7548// Forms:
7549//
7550// 	JNZ rel8
7551// 	JNZ rel32
7552func JNZ(r operand.Op) (*intrep.Instruction, error) {
7553	switch {
7554	case operand.IsREL8(r):
7555		return &intrep.Instruction{
7556			Opcode:        "JNZ",
7557			Operands:      []operand.Op{r},
7558			Inputs:        []operand.Op{},
7559			Outputs:       []operand.Op{},
7560			IsBranch:      true,
7561			IsConditional: true,
7562		}, nil
7563	case operand.IsREL32(r):
7564		return &intrep.Instruction{
7565			Opcode:        "JNZ",
7566			Operands:      []operand.Op{r},
7567			Inputs:        []operand.Op{},
7568			Outputs:       []operand.Op{},
7569			IsBranch:      true,
7570			IsConditional: true,
7571		}, nil
7572	}
7573	return nil, errors.New("JNZ: bad operands")
7574}
7575
7576// JO: Jump if overflow (OF == 1).
7577//
7578// Forms:
7579//
7580// 	JO rel8
7581// 	JO rel32
7582func JO(r operand.Op) (*intrep.Instruction, error) {
7583	switch {
7584	case operand.IsREL8(r):
7585		return &intrep.Instruction{
7586			Opcode:        "JO",
7587			Operands:      []operand.Op{r},
7588			Inputs:        []operand.Op{},
7589			Outputs:       []operand.Op{},
7590			IsBranch:      true,
7591			IsConditional: true,
7592		}, nil
7593	case operand.IsREL32(r):
7594		return &intrep.Instruction{
7595			Opcode:        "JO",
7596			Operands:      []operand.Op{r},
7597			Inputs:        []operand.Op{},
7598			Outputs:       []operand.Op{},
7599			IsBranch:      true,
7600			IsConditional: true,
7601		}, nil
7602	}
7603	return nil, errors.New("JO: bad operands")
7604}
7605
7606// JOC: Jump if not overflow (OF == 0).
7607//
7608// Forms:
7609//
7610// 	JOC rel8
7611// 	JOC rel32
7612func JOC(r operand.Op) (*intrep.Instruction, error) {
7613	switch {
7614	case operand.IsREL8(r):
7615		return &intrep.Instruction{
7616			Opcode:        "JOC",
7617			Operands:      []operand.Op{r},
7618			Inputs:        []operand.Op{},
7619			Outputs:       []operand.Op{},
7620			IsBranch:      true,
7621			IsConditional: true,
7622		}, nil
7623	case operand.IsREL32(r):
7624		return &intrep.Instruction{
7625			Opcode:        "JOC",
7626			Operands:      []operand.Op{r},
7627			Inputs:        []operand.Op{},
7628			Outputs:       []operand.Op{},
7629			IsBranch:      true,
7630			IsConditional: true,
7631		}, nil
7632	}
7633	return nil, errors.New("JOC: bad operands")
7634}
7635
7636// JOS: Jump if overflow (OF == 1).
7637//
7638// Forms:
7639//
7640// 	JOS rel8
7641// 	JOS rel32
7642func JOS(r operand.Op) (*intrep.Instruction, error) {
7643	switch {
7644	case operand.IsREL8(r):
7645		return &intrep.Instruction{
7646			Opcode:        "JOS",
7647			Operands:      []operand.Op{r},
7648			Inputs:        []operand.Op{},
7649			Outputs:       []operand.Op{},
7650			IsBranch:      true,
7651			IsConditional: true,
7652		}, nil
7653	case operand.IsREL32(r):
7654		return &intrep.Instruction{
7655			Opcode:        "JOS",
7656			Operands:      []operand.Op{r},
7657			Inputs:        []operand.Op{},
7658			Outputs:       []operand.Op{},
7659			IsBranch:      true,
7660			IsConditional: true,
7661		}, nil
7662	}
7663	return nil, errors.New("JOS: bad operands")
7664}
7665
7666// JP: Jump if parity (PF == 1).
7667//
7668// Forms:
7669//
7670// 	JP rel8
7671// 	JP rel32
7672func JP(r operand.Op) (*intrep.Instruction, error) {
7673	switch {
7674	case operand.IsREL8(r):
7675		return &intrep.Instruction{
7676			Opcode:        "JP",
7677			Operands:      []operand.Op{r},
7678			Inputs:        []operand.Op{},
7679			Outputs:       []operand.Op{},
7680			IsBranch:      true,
7681			IsConditional: true,
7682		}, nil
7683	case operand.IsREL32(r):
7684		return &intrep.Instruction{
7685			Opcode:        "JP",
7686			Operands:      []operand.Op{r},
7687			Inputs:        []operand.Op{},
7688			Outputs:       []operand.Op{},
7689			IsBranch:      true,
7690			IsConditional: true,
7691		}, nil
7692	}
7693	return nil, errors.New("JP: bad operands")
7694}
7695
7696// JPC: Jump if not parity (PF == 0).
7697//
7698// Forms:
7699//
7700// 	JPC rel8
7701// 	JPC rel32
7702func JPC(r operand.Op) (*intrep.Instruction, error) {
7703	switch {
7704	case operand.IsREL8(r):
7705		return &intrep.Instruction{
7706			Opcode:        "JPC",
7707			Operands:      []operand.Op{r},
7708			Inputs:        []operand.Op{},
7709			Outputs:       []operand.Op{},
7710			IsBranch:      true,
7711			IsConditional: true,
7712		}, nil
7713	case operand.IsREL32(r):
7714		return &intrep.Instruction{
7715			Opcode:        "JPC",
7716			Operands:      []operand.Op{r},
7717			Inputs:        []operand.Op{},
7718			Outputs:       []operand.Op{},
7719			IsBranch:      true,
7720			IsConditional: true,
7721		}, nil
7722	}
7723	return nil, errors.New("JPC: bad operands")
7724}
7725
7726// JPE: Jump if parity (PF == 1).
7727//
7728// Forms:
7729//
7730// 	JPE rel8
7731// 	JPE rel32
7732func JPE(r operand.Op) (*intrep.Instruction, error) {
7733	switch {
7734	case operand.IsREL8(r):
7735		return &intrep.Instruction{
7736			Opcode:        "JPE",
7737			Operands:      []operand.Op{r},
7738			Inputs:        []operand.Op{},
7739			Outputs:       []operand.Op{},
7740			IsBranch:      true,
7741			IsConditional: true,
7742		}, nil
7743	case operand.IsREL32(r):
7744		return &intrep.Instruction{
7745			Opcode:        "JPE",
7746			Operands:      []operand.Op{r},
7747			Inputs:        []operand.Op{},
7748			Outputs:       []operand.Op{},
7749			IsBranch:      true,
7750			IsConditional: true,
7751		}, nil
7752	}
7753	return nil, errors.New("JPE: bad operands")
7754}
7755
7756// JPL: Jump if not sign (SF == 0).
7757//
7758// Forms:
7759//
7760// 	JPL rel8
7761// 	JPL rel32
7762func JPL(r operand.Op) (*intrep.Instruction, error) {
7763	switch {
7764	case operand.IsREL8(r):
7765		return &intrep.Instruction{
7766			Opcode:        "JPL",
7767			Operands:      []operand.Op{r},
7768			Inputs:        []operand.Op{},
7769			Outputs:       []operand.Op{},
7770			IsBranch:      true,
7771			IsConditional: true,
7772		}, nil
7773	case operand.IsREL32(r):
7774		return &intrep.Instruction{
7775			Opcode:        "JPL",
7776			Operands:      []operand.Op{r},
7777			Inputs:        []operand.Op{},
7778			Outputs:       []operand.Op{},
7779			IsBranch:      true,
7780			IsConditional: true,
7781		}, nil
7782	}
7783	return nil, errors.New("JPL: bad operands")
7784}
7785
7786// JPO: Jump if not parity (PF == 0).
7787//
7788// Forms:
7789//
7790// 	JPO rel8
7791// 	JPO rel32
7792func JPO(r operand.Op) (*intrep.Instruction, error) {
7793	switch {
7794	case operand.IsREL8(r):
7795		return &intrep.Instruction{
7796			Opcode:        "JPO",
7797			Operands:      []operand.Op{r},
7798			Inputs:        []operand.Op{},
7799			Outputs:       []operand.Op{},
7800			IsBranch:      true,
7801			IsConditional: true,
7802		}, nil
7803	case operand.IsREL32(r):
7804		return &intrep.Instruction{
7805			Opcode:        "JPO",
7806			Operands:      []operand.Op{r},
7807			Inputs:        []operand.Op{},
7808			Outputs:       []operand.Op{},
7809			IsBranch:      true,
7810			IsConditional: true,
7811		}, nil
7812	}
7813	return nil, errors.New("JPO: bad operands")
7814}
7815
7816// JPS: Jump if parity (PF == 1).
7817//
7818// Forms:
7819//
7820// 	JPS rel8
7821// 	JPS rel32
7822func JPS(r operand.Op) (*intrep.Instruction, error) {
7823	switch {
7824	case operand.IsREL8(r):
7825		return &intrep.Instruction{
7826			Opcode:        "JPS",
7827			Operands:      []operand.Op{r},
7828			Inputs:        []operand.Op{},
7829			Outputs:       []operand.Op{},
7830			IsBranch:      true,
7831			IsConditional: true,
7832		}, nil
7833	case operand.IsREL32(r):
7834		return &intrep.Instruction{
7835			Opcode:        "JPS",
7836			Operands:      []operand.Op{r},
7837			Inputs:        []operand.Op{},
7838			Outputs:       []operand.Op{},
7839			IsBranch:      true,
7840			IsConditional: true,
7841		}, nil
7842	}
7843	return nil, errors.New("JPS: bad operands")
7844}
7845
7846// JS: Jump if sign (SF == 1).
7847//
7848// Forms:
7849//
7850// 	JS rel8
7851// 	JS rel32
7852func JS(r operand.Op) (*intrep.Instruction, error) {
7853	switch {
7854	case operand.IsREL8(r):
7855		return &intrep.Instruction{
7856			Opcode:        "JS",
7857			Operands:      []operand.Op{r},
7858			Inputs:        []operand.Op{},
7859			Outputs:       []operand.Op{},
7860			IsBranch:      true,
7861			IsConditional: true,
7862		}, nil
7863	case operand.IsREL32(r):
7864		return &intrep.Instruction{
7865			Opcode:        "JS",
7866			Operands:      []operand.Op{r},
7867			Inputs:        []operand.Op{},
7868			Outputs:       []operand.Op{},
7869			IsBranch:      true,
7870			IsConditional: true,
7871		}, nil
7872	}
7873	return nil, errors.New("JS: bad operands")
7874}
7875
7876// JZ: Jump if equal (ZF == 1).
7877//
7878// Forms:
7879//
7880// 	JZ rel8
7881// 	JZ rel32
7882func JZ(r operand.Op) (*intrep.Instruction, error) {
7883	switch {
7884	case operand.IsREL8(r):
7885		return &intrep.Instruction{
7886			Opcode:        "JZ",
7887			Operands:      []operand.Op{r},
7888			Inputs:        []operand.Op{},
7889			Outputs:       []operand.Op{},
7890			IsBranch:      true,
7891			IsConditional: true,
7892		}, nil
7893	case operand.IsREL32(r):
7894		return &intrep.Instruction{
7895			Opcode:        "JZ",
7896			Operands:      []operand.Op{r},
7897			Inputs:        []operand.Op{},
7898			Outputs:       []operand.Op{},
7899			IsBranch:      true,
7900			IsConditional: true,
7901		}, nil
7902	}
7903	return nil, errors.New("JZ: bad operands")
7904}
7905
7906// LDDQU: Load Unaligned Integer 128 Bits.
7907//
7908// Forms:
7909//
7910// 	LDDQU m128 xmm
7911func LDDQU(m, x operand.Op) (*intrep.Instruction, error) {
7912	switch {
7913	case operand.IsM128(m) && operand.IsXMM(x):
7914		return &intrep.Instruction{
7915			Opcode:   "LDDQU",
7916			Operands: []operand.Op{m, x},
7917			Inputs:   []operand.Op{m},
7918			Outputs:  []operand.Op{x},
7919			ISA:      []string{"SSE3"},
7920		}, nil
7921	}
7922	return nil, errors.New("LDDQU: bad operands")
7923}
7924
7925// LDMXCSR: Load MXCSR Register.
7926//
7927// Forms:
7928//
7929// 	LDMXCSR m32
7930func LDMXCSR(m operand.Op) (*intrep.Instruction, error) {
7931	switch {
7932	case operand.IsM32(m):
7933		return &intrep.Instruction{
7934			Opcode:   "LDMXCSR",
7935			Operands: []operand.Op{m},
7936			Inputs:   []operand.Op{m},
7937			Outputs:  []operand.Op{},
7938			ISA:      []string{"SSE"},
7939		}, nil
7940	}
7941	return nil, errors.New("LDMXCSR: bad operands")
7942}
7943
7944// LEAL: Load Effective Address.
7945//
7946// Forms:
7947//
7948// 	LEAL m r32
7949func LEAL(m, r operand.Op) (*intrep.Instruction, error) {
7950	switch {
7951	case operand.IsM(m) && operand.IsR32(r):
7952		return &intrep.Instruction{
7953			Opcode:   "LEAL",
7954			Operands: []operand.Op{m, r},
7955			Inputs:   []operand.Op{m},
7956			Outputs:  []operand.Op{r},
7957		}, nil
7958	}
7959	return nil, errors.New("LEAL: bad operands")
7960}
7961
7962// LEAQ: Load Effective Address.
7963//
7964// Forms:
7965//
7966// 	LEAQ m r64
7967func LEAQ(m, r operand.Op) (*intrep.Instruction, error) {
7968	switch {
7969	case operand.IsM(m) && operand.IsR64(r):
7970		return &intrep.Instruction{
7971			Opcode:   "LEAQ",
7972			Operands: []operand.Op{m, r},
7973			Inputs:   []operand.Op{m},
7974			Outputs:  []operand.Op{r},
7975		}, nil
7976	}
7977	return nil, errors.New("LEAQ: bad operands")
7978}
7979
7980// LEAW: Load Effective Address.
7981//
7982// Forms:
7983//
7984// 	LEAW m r16
7985func LEAW(m, r operand.Op) (*intrep.Instruction, error) {
7986	switch {
7987	case operand.IsM(m) && operand.IsR16(r):
7988		return &intrep.Instruction{
7989			Opcode:   "LEAW",
7990			Operands: []operand.Op{m, r},
7991			Inputs:   []operand.Op{m},
7992			Outputs:  []operand.Op{r},
7993		}, nil
7994	}
7995	return nil, errors.New("LEAW: bad operands")
7996}
7997
7998// LFENCE: Load Fence.
7999//
8000// Forms:
8001//
8002// 	LFENCE
8003func LFENCE() (*intrep.Instruction, error) {
8004	return &intrep.Instruction{
8005		Opcode:   "LFENCE",
8006		Operands: nil,
8007		Inputs:   []operand.Op{},
8008		Outputs:  []operand.Op{},
8009		ISA:      []string{"SSE2"},
8010	}, nil
8011}
8012
8013// LZCNTL: Count the Number of Leading Zero Bits.
8014//
8015// Forms:
8016//
8017// 	LZCNTL r32 r32
8018// 	LZCNTL m32 r32
8019func LZCNTL(mr, r operand.Op) (*intrep.Instruction, error) {
8020	switch {
8021	case operand.IsR32(mr) && operand.IsR32(r):
8022		return &intrep.Instruction{
8023			Opcode:   "LZCNTL",
8024			Operands: []operand.Op{mr, r},
8025			Inputs:   []operand.Op{mr},
8026			Outputs:  []operand.Op{r},
8027			ISA:      []string{"LZCNT"},
8028		}, nil
8029	case operand.IsM32(mr) && operand.IsR32(r):
8030		return &intrep.Instruction{
8031			Opcode:   "LZCNTL",
8032			Operands: []operand.Op{mr, r},
8033			Inputs:   []operand.Op{mr},
8034			Outputs:  []operand.Op{r},
8035			ISA:      []string{"LZCNT"},
8036		}, nil
8037	}
8038	return nil, errors.New("LZCNTL: bad operands")
8039}
8040
8041// LZCNTQ: Count the Number of Leading Zero Bits.
8042//
8043// Forms:
8044//
8045// 	LZCNTQ r64 r64
8046// 	LZCNTQ m64 r64
8047func LZCNTQ(mr, r operand.Op) (*intrep.Instruction, error) {
8048	switch {
8049	case operand.IsR64(mr) && operand.IsR64(r):
8050		return &intrep.Instruction{
8051			Opcode:   "LZCNTQ",
8052			Operands: []operand.Op{mr, r},
8053			Inputs:   []operand.Op{mr},
8054			Outputs:  []operand.Op{r},
8055			ISA:      []string{"LZCNT"},
8056		}, nil
8057	case operand.IsM64(mr) && operand.IsR64(r):
8058		return &intrep.Instruction{
8059			Opcode:   "LZCNTQ",
8060			Operands: []operand.Op{mr, r},
8061			Inputs:   []operand.Op{mr},
8062			Outputs:  []operand.Op{r},
8063			ISA:      []string{"LZCNT"},
8064		}, nil
8065	}
8066	return nil, errors.New("LZCNTQ: bad operands")
8067}
8068
8069// LZCNTW: Count the Number of Leading Zero Bits.
8070//
8071// Forms:
8072//
8073// 	LZCNTW r16 r16
8074// 	LZCNTW m16 r16
8075func LZCNTW(mr, r operand.Op) (*intrep.Instruction, error) {
8076	switch {
8077	case operand.IsR16(mr) && operand.IsR16(r):
8078		return &intrep.Instruction{
8079			Opcode:   "LZCNTW",
8080			Operands: []operand.Op{mr, r},
8081			Inputs:   []operand.Op{mr},
8082			Outputs:  []operand.Op{r},
8083			ISA:      []string{"LZCNT"},
8084		}, nil
8085	case operand.IsM16(mr) && operand.IsR16(r):
8086		return &intrep.Instruction{
8087			Opcode:   "LZCNTW",
8088			Operands: []operand.Op{mr, r},
8089			Inputs:   []operand.Op{mr},
8090			Outputs:  []operand.Op{r},
8091			ISA:      []string{"LZCNT"},
8092		}, nil
8093	}
8094	return nil, errors.New("LZCNTW: bad operands")
8095}
8096
8097// MASKMOVDQU: Store Selected Bytes of Double Quadword.
8098//
8099// Forms:
8100//
8101// 	MASKMOVDQU xmm xmm
8102func MASKMOVDQU(x, x1 operand.Op) (*intrep.Instruction, error) {
8103	switch {
8104	case operand.IsXMM(x) && operand.IsXMM(x1):
8105		return &intrep.Instruction{
8106			Opcode:   "MASKMOVDQU",
8107			Operands: []operand.Op{x, x1},
8108			Inputs:   []operand.Op{x, x1, reg.RDI},
8109			Outputs:  []operand.Op{},
8110			ISA:      []string{"SSE2"},
8111		}, nil
8112	}
8113	return nil, errors.New("MASKMOVDQU: bad operands")
8114}
8115
8116// MASKMOVOU: Store Selected Bytes of Double Quadword.
8117//
8118// Forms:
8119//
8120// 	MASKMOVOU xmm xmm
8121func MASKMOVOU(x, x1 operand.Op) (*intrep.Instruction, error) {
8122	switch {
8123	case operand.IsXMM(x) && operand.IsXMM(x1):
8124		return &intrep.Instruction{
8125			Opcode:   "MASKMOVOU",
8126			Operands: []operand.Op{x, x1},
8127			Inputs:   []operand.Op{x, x1, reg.RDI},
8128			Outputs:  []operand.Op{},
8129			ISA:      []string{"SSE2"},
8130		}, nil
8131	}
8132	return nil, errors.New("MASKMOVOU: bad operands")
8133}
8134
8135// MAXPD: Return Maximum Packed Double-Precision Floating-Point Values.
8136//
8137// Forms:
8138//
8139// 	MAXPD xmm  xmm
8140// 	MAXPD m128 xmm
8141func MAXPD(mx, x operand.Op) (*intrep.Instruction, error) {
8142	switch {
8143	case operand.IsXMM(mx) && operand.IsXMM(x):
8144		return &intrep.Instruction{
8145			Opcode:   "MAXPD",
8146			Operands: []operand.Op{mx, x},
8147			Inputs:   []operand.Op{mx, x},
8148			Outputs:  []operand.Op{x},
8149			ISA:      []string{"SSE2"},
8150		}, nil
8151	case operand.IsM128(mx) && operand.IsXMM(x):
8152		return &intrep.Instruction{
8153			Opcode:   "MAXPD",
8154			Operands: []operand.Op{mx, x},
8155			Inputs:   []operand.Op{mx, x},
8156			Outputs:  []operand.Op{x},
8157			ISA:      []string{"SSE2"},
8158		}, nil
8159	}
8160	return nil, errors.New("MAXPD: bad operands")
8161}
8162
8163// MAXPS: Return Maximum Packed Single-Precision Floating-Point Values.
8164//
8165// Forms:
8166//
8167// 	MAXPS xmm  xmm
8168// 	MAXPS m128 xmm
8169func MAXPS(mx, x operand.Op) (*intrep.Instruction, error) {
8170	switch {
8171	case operand.IsXMM(mx) && operand.IsXMM(x):
8172		return &intrep.Instruction{
8173			Opcode:   "MAXPS",
8174			Operands: []operand.Op{mx, x},
8175			Inputs:   []operand.Op{mx, x},
8176			Outputs:  []operand.Op{x},
8177			ISA:      []string{"SSE"},
8178		}, nil
8179	case operand.IsM128(mx) && operand.IsXMM(x):
8180		return &intrep.Instruction{
8181			Opcode:   "MAXPS",
8182			Operands: []operand.Op{mx, x},
8183			Inputs:   []operand.Op{mx, x},
8184			Outputs:  []operand.Op{x},
8185			ISA:      []string{"SSE"},
8186		}, nil
8187	}
8188	return nil, errors.New("MAXPS: bad operands")
8189}
8190
8191// MAXSD: Return Maximum Scalar Double-Precision Floating-Point Value.
8192//
8193// Forms:
8194//
8195// 	MAXSD xmm xmm
8196// 	MAXSD m64 xmm
8197func MAXSD(mx, x operand.Op) (*intrep.Instruction, error) {
8198	switch {
8199	case operand.IsXMM(mx) && operand.IsXMM(x):
8200		return &intrep.Instruction{
8201			Opcode:   "MAXSD",
8202			Operands: []operand.Op{mx, x},
8203			Inputs:   []operand.Op{mx, x},
8204			Outputs:  []operand.Op{x},
8205			ISA:      []string{"SSE2"},
8206		}, nil
8207	case operand.IsM64(mx) && operand.IsXMM(x):
8208		return &intrep.Instruction{
8209			Opcode:   "MAXSD",
8210			Operands: []operand.Op{mx, x},
8211			Inputs:   []operand.Op{mx, x},
8212			Outputs:  []operand.Op{x},
8213			ISA:      []string{"SSE2"},
8214		}, nil
8215	}
8216	return nil, errors.New("MAXSD: bad operands")
8217}
8218
8219// MAXSS: Return Maximum Scalar Single-Precision Floating-Point Value.
8220//
8221// Forms:
8222//
8223// 	MAXSS xmm xmm
8224// 	MAXSS m32 xmm
8225func MAXSS(mx, x operand.Op) (*intrep.Instruction, error) {
8226	switch {
8227	case operand.IsXMM(mx) && operand.IsXMM(x):
8228		return &intrep.Instruction{
8229			Opcode:   "MAXSS",
8230			Operands: []operand.Op{mx, x},
8231			Inputs:   []operand.Op{mx, x},
8232			Outputs:  []operand.Op{x},
8233			ISA:      []string{"SSE"},
8234		}, nil
8235	case operand.IsM32(mx) && operand.IsXMM(x):
8236		return &intrep.Instruction{
8237			Opcode:   "MAXSS",
8238			Operands: []operand.Op{mx, x},
8239			Inputs:   []operand.Op{mx, x},
8240			Outputs:  []operand.Op{x},
8241			ISA:      []string{"SSE"},
8242		}, nil
8243	}
8244	return nil, errors.New("MAXSS: bad operands")
8245}
8246
8247// MFENCE: Memory Fence.
8248//
8249// Forms:
8250//
8251// 	MFENCE
8252func MFENCE() (*intrep.Instruction, error) {
8253	return &intrep.Instruction{
8254		Opcode:   "MFENCE",
8255		Operands: nil,
8256		Inputs:   []operand.Op{},
8257		Outputs:  []operand.Op{},
8258		ISA:      []string{"SSE2"},
8259	}, nil
8260}
8261
8262// MINPD: Return Minimum Packed Double-Precision Floating-Point Values.
8263//
8264// Forms:
8265//
8266// 	MINPD xmm  xmm
8267// 	MINPD m128 xmm
8268func MINPD(mx, x operand.Op) (*intrep.Instruction, error) {
8269	switch {
8270	case operand.IsXMM(mx) && operand.IsXMM(x):
8271		return &intrep.Instruction{
8272			Opcode:   "MINPD",
8273			Operands: []operand.Op{mx, x},
8274			Inputs:   []operand.Op{mx, x},
8275			Outputs:  []operand.Op{x},
8276			ISA:      []string{"SSE2"},
8277		}, nil
8278	case operand.IsM128(mx) && operand.IsXMM(x):
8279		return &intrep.Instruction{
8280			Opcode:   "MINPD",
8281			Operands: []operand.Op{mx, x},
8282			Inputs:   []operand.Op{mx, x},
8283			Outputs:  []operand.Op{x},
8284			ISA:      []string{"SSE2"},
8285		}, nil
8286	}
8287	return nil, errors.New("MINPD: bad operands")
8288}
8289
8290// MINPS: Return Minimum Packed Single-Precision Floating-Point Values.
8291//
8292// Forms:
8293//
8294// 	MINPS xmm  xmm
8295// 	MINPS m128 xmm
8296func MINPS(mx, x operand.Op) (*intrep.Instruction, error) {
8297	switch {
8298	case operand.IsXMM(mx) && operand.IsXMM(x):
8299		return &intrep.Instruction{
8300			Opcode:   "MINPS",
8301			Operands: []operand.Op{mx, x},
8302			Inputs:   []operand.Op{mx, x},
8303			Outputs:  []operand.Op{x},
8304			ISA:      []string{"SSE"},
8305		}, nil
8306	case operand.IsM128(mx) && operand.IsXMM(x):
8307		return &intrep.Instruction{
8308			Opcode:   "MINPS",
8309			Operands: []operand.Op{mx, x},
8310			Inputs:   []operand.Op{mx, x},
8311			Outputs:  []operand.Op{x},
8312			ISA:      []string{"SSE"},
8313		}, nil
8314	}
8315	return nil, errors.New("MINPS: bad operands")
8316}
8317
8318// MINSD: Return Minimum Scalar Double-Precision Floating-Point Value.
8319//
8320// Forms:
8321//
8322// 	MINSD xmm xmm
8323// 	MINSD m64 xmm
8324func MINSD(mx, x operand.Op) (*intrep.Instruction, error) {
8325	switch {
8326	case operand.IsXMM(mx) && operand.IsXMM(x):
8327		return &intrep.Instruction{
8328			Opcode:   "MINSD",
8329			Operands: []operand.Op{mx, x},
8330			Inputs:   []operand.Op{mx, x},
8331			Outputs:  []operand.Op{x},
8332			ISA:      []string{"SSE2"},
8333		}, nil
8334	case operand.IsM64(mx) && operand.IsXMM(x):
8335		return &intrep.Instruction{
8336			Opcode:   "MINSD",
8337			Operands: []operand.Op{mx, x},
8338			Inputs:   []operand.Op{mx, x},
8339			Outputs:  []operand.Op{x},
8340			ISA:      []string{"SSE2"},
8341		}, nil
8342	}
8343	return nil, errors.New("MINSD: bad operands")
8344}
8345
8346// MINSS: Return Minimum Scalar Single-Precision Floating-Point Value.
8347//
8348// Forms:
8349//
8350// 	MINSS xmm xmm
8351// 	MINSS m32 xmm
8352func MINSS(mx, x operand.Op) (*intrep.Instruction, error) {
8353	switch {
8354	case operand.IsXMM(mx) && operand.IsXMM(x):
8355		return &intrep.Instruction{
8356			Opcode:   "MINSS",
8357			Operands: []operand.Op{mx, x},
8358			Inputs:   []operand.Op{mx, x},
8359			Outputs:  []operand.Op{x},
8360			ISA:      []string{"SSE"},
8361		}, nil
8362	case operand.IsM32(mx) && operand.IsXMM(x):
8363		return &intrep.Instruction{
8364			Opcode:   "MINSS",
8365			Operands: []operand.Op{mx, x},
8366			Inputs:   []operand.Op{mx, x},
8367			Outputs:  []operand.Op{x},
8368			ISA:      []string{"SSE"},
8369		}, nil
8370	}
8371	return nil, errors.New("MINSS: bad operands")
8372}
8373
8374// MONITOR: Monitor a Linear Address Range.
8375//
8376// Forms:
8377//
8378// 	MONITOR
8379func MONITOR() (*intrep.Instruction, error) {
8380	return &intrep.Instruction{
8381		Opcode:   "MONITOR",
8382		Operands: nil,
8383		Inputs:   []operand.Op{reg.RAX, reg.ECX, reg.EDX},
8384		Outputs:  []operand.Op{},
8385		ISA:      []string{"MONITOR"},
8386	}, nil
8387}
8388
8389// MOVAPD: Move Aligned Packed Double-Precision Floating-Point Values.
8390//
8391// Forms:
8392//
8393// 	MOVAPD xmm  xmm
8394// 	MOVAPD m128 xmm
8395// 	MOVAPD xmm  m128
8396func MOVAPD(mx, mx1 operand.Op) (*intrep.Instruction, error) {
8397	switch {
8398	case operand.IsXMM(mx) && operand.IsXMM(mx1):
8399		return &intrep.Instruction{
8400			Opcode:   "MOVAPD",
8401			Operands: []operand.Op{mx, mx1},
8402			Inputs:   []operand.Op{mx},
8403			Outputs:  []operand.Op{mx1},
8404			ISA:      []string{"SSE2"},
8405		}, nil
8406	case operand.IsM128(mx) && operand.IsXMM(mx1):
8407		return &intrep.Instruction{
8408			Opcode:   "MOVAPD",
8409			Operands: []operand.Op{mx, mx1},
8410			Inputs:   []operand.Op{mx},
8411			Outputs:  []operand.Op{mx1},
8412			ISA:      []string{"SSE2"},
8413		}, nil
8414	case operand.IsXMM(mx) && operand.IsM128(mx1):
8415		return &intrep.Instruction{
8416			Opcode:   "MOVAPD",
8417			Operands: []operand.Op{mx, mx1},
8418			Inputs:   []operand.Op{mx},
8419			Outputs:  []operand.Op{mx1},
8420			ISA:      []string{"SSE2"},
8421		}, nil
8422	}
8423	return nil, errors.New("MOVAPD: bad operands")
8424}
8425
8426// MOVAPS: Move Aligned Packed Single-Precision Floating-Point Values.
8427//
8428// Forms:
8429//
8430// 	MOVAPS xmm  xmm
8431// 	MOVAPS m128 xmm
8432// 	MOVAPS xmm  m128
8433func MOVAPS(mx, mx1 operand.Op) (*intrep.Instruction, error) {
8434	switch {
8435	case operand.IsXMM(mx) && operand.IsXMM(mx1):
8436		return &intrep.Instruction{
8437			Opcode:   "MOVAPS",
8438			Operands: []operand.Op{mx, mx1},
8439			Inputs:   []operand.Op{mx},
8440			Outputs:  []operand.Op{mx1},
8441			ISA:      []string{"SSE"},
8442		}, nil
8443	case operand.IsM128(mx) && operand.IsXMM(mx1):
8444		return &intrep.Instruction{
8445			Opcode:   "MOVAPS",
8446			Operands: []operand.Op{mx, mx1},
8447			Inputs:   []operand.Op{mx},
8448			Outputs:  []operand.Op{mx1},
8449			ISA:      []string{"SSE"},
8450		}, nil
8451	case operand.IsXMM(mx) && operand.IsM128(mx1):
8452		return &intrep.Instruction{
8453			Opcode:   "MOVAPS",
8454			Operands: []operand.Op{mx, mx1},
8455			Inputs:   []operand.Op{mx},
8456			Outputs:  []operand.Op{mx1},
8457			ISA:      []string{"SSE"},
8458		}, nil
8459	}
8460	return nil, errors.New("MOVAPS: bad operands")
8461}
8462
8463// MOVB: Move.
8464//
8465// Forms:
8466//
8467// 	MOVB imm8 r8
8468// 	MOVB r8   r8
8469// 	MOVB m8   r8
8470// 	MOVB imm8 m8
8471// 	MOVB r8   m8
8472func MOVB(imr, mr operand.Op) (*intrep.Instruction, error) {
8473	switch {
8474	case operand.IsIMM8(imr) && operand.IsR8(mr):
8475		return &intrep.Instruction{
8476			Opcode:   "MOVB",
8477			Operands: []operand.Op{imr, mr},
8478			Inputs:   []operand.Op{},
8479			Outputs:  []operand.Op{mr},
8480		}, nil
8481	case operand.IsR8(imr) && operand.IsR8(mr):
8482		return &intrep.Instruction{
8483			Opcode:   "MOVB",
8484			Operands: []operand.Op{imr, mr},
8485			Inputs:   []operand.Op{imr},
8486			Outputs:  []operand.Op{mr},
8487		}, nil
8488	case operand.IsM8(imr) && operand.IsR8(mr):
8489		return &intrep.Instruction{
8490			Opcode:   "MOVB",
8491			Operands: []operand.Op{imr, mr},
8492			Inputs:   []operand.Op{imr},
8493			Outputs:  []operand.Op{mr},
8494		}, nil
8495	case operand.IsIMM8(imr) && operand.IsM8(mr):
8496		return &intrep.Instruction{
8497			Opcode:   "MOVB",
8498			Operands: []operand.Op{imr, mr},
8499			Inputs:   []operand.Op{},
8500			Outputs:  []operand.Op{mr},
8501		}, nil
8502	case operand.IsR8(imr) && operand.IsM8(mr):
8503		return &intrep.Instruction{
8504			Opcode:   "MOVB",
8505			Operands: []operand.Op{imr, mr},
8506			Inputs:   []operand.Op{imr},
8507			Outputs:  []operand.Op{mr},
8508		}, nil
8509	}
8510	return nil, errors.New("MOVB: bad operands")
8511}
8512
8513// MOVBELL: Move Data After Swapping Bytes.
8514//
8515// Forms:
8516//
8517// 	MOVBELL m32 r32
8518// 	MOVBELL r32 m32
8519func MOVBELL(mr, mr1 operand.Op) (*intrep.Instruction, error) {
8520	switch {
8521	case operand.IsM32(mr) && operand.IsR32(mr1):
8522		return &intrep.Instruction{
8523			Opcode:   "MOVBELL",
8524			Operands: []operand.Op{mr, mr1},
8525			Inputs:   []operand.Op{mr},
8526			Outputs:  []operand.Op{mr1},
8527			ISA:      []string{"MOVBE"},
8528		}, nil
8529	case operand.IsR32(mr) && operand.IsM32(mr1):
8530		return &intrep.Instruction{
8531			Opcode:   "MOVBELL",
8532			Operands: []operand.Op{mr, mr1},
8533			Inputs:   []operand.Op{mr},
8534			Outputs:  []operand.Op{mr1},
8535			ISA:      []string{"MOVBE"},
8536		}, nil
8537	}
8538	return nil, errors.New("MOVBELL: bad operands")
8539}
8540
8541// MOVBEQQ: Move Data After Swapping Bytes.
8542//
8543// Forms:
8544//
8545// 	MOVBEQQ m64 r64
8546// 	MOVBEQQ r64 m64
8547func MOVBEQQ(mr, mr1 operand.Op) (*intrep.Instruction, error) {
8548	switch {
8549	case operand.IsM64(mr) && operand.IsR64(mr1):
8550		return &intrep.Instruction{
8551			Opcode:   "MOVBEQQ",
8552			Operands: []operand.Op{mr, mr1},
8553			Inputs:   []operand.Op{mr},
8554			Outputs:  []operand.Op{mr1},
8555			ISA:      []string{"MOVBE"},
8556		}, nil
8557	case operand.IsR64(mr) && operand.IsM64(mr1):
8558		return &intrep.Instruction{
8559			Opcode:   "MOVBEQQ",
8560			Operands: []operand.Op{mr, mr1},
8561			Inputs:   []operand.Op{mr},
8562			Outputs:  []operand.Op{mr1},
8563			ISA:      []string{"MOVBE"},
8564		}, nil
8565	}
8566	return nil, errors.New("MOVBEQQ: bad operands")
8567}
8568
8569// MOVBEWW: Move Data After Swapping Bytes.
8570//
8571// Forms:
8572//
8573// 	MOVBEWW m16 r16
8574// 	MOVBEWW r16 m16
8575func MOVBEWW(mr, mr1 operand.Op) (*intrep.Instruction, error) {
8576	switch {
8577	case operand.IsM16(mr) && operand.IsR16(mr1):
8578		return &intrep.Instruction{
8579			Opcode:   "MOVBEWW",
8580			Operands: []operand.Op{mr, mr1},
8581			Inputs:   []operand.Op{mr},
8582			Outputs:  []operand.Op{mr1},
8583			ISA:      []string{"MOVBE"},
8584		}, nil
8585	case operand.IsR16(mr) && operand.IsM16(mr1):
8586		return &intrep.Instruction{
8587			Opcode:   "MOVBEWW",
8588			Operands: []operand.Op{mr, mr1},
8589			Inputs:   []operand.Op{mr},
8590			Outputs:  []operand.Op{mr1},
8591			ISA:      []string{"MOVBE"},
8592		}, nil
8593	}
8594	return nil, errors.New("MOVBEWW: bad operands")
8595}
8596
8597// MOVBLSX: Move with Sign-Extension.
8598//
8599// Forms:
8600//
8601// 	MOVBLSX r8 r32
8602// 	MOVBLSX m8 r32
8603func MOVBLSX(mr, r operand.Op) (*intrep.Instruction, error) {
8604	switch {
8605	case operand.IsR8(mr) && operand.IsR32(r):
8606		return &intrep.Instruction{
8607			Opcode:   "MOVBLSX",
8608			Operands: []operand.Op{mr, r},
8609			Inputs:   []operand.Op{mr},
8610			Outputs:  []operand.Op{r},
8611		}, nil
8612	case operand.IsM8(mr) && operand.IsR32(r):
8613		return &intrep.Instruction{
8614			Opcode:   "MOVBLSX",
8615			Operands: []operand.Op{mr, r},
8616			Inputs:   []operand.Op{mr},
8617			Outputs:  []operand.Op{r},
8618		}, nil
8619	}
8620	return nil, errors.New("MOVBLSX: bad operands")
8621}
8622
8623// MOVBLZX: Move with Zero-Extend.
8624//
8625// Forms:
8626//
8627// 	MOVBLZX r8 r32
8628// 	MOVBLZX m8 r32
8629func MOVBLZX(mr, r operand.Op) (*intrep.Instruction, error) {
8630	switch {
8631	case operand.IsR8(mr) && operand.IsR32(r):
8632		return &intrep.Instruction{
8633			Opcode:   "MOVBLZX",
8634			Operands: []operand.Op{mr, r},
8635			Inputs:   []operand.Op{mr},
8636			Outputs:  []operand.Op{r},
8637		}, nil
8638	case operand.IsM8(mr) && operand.IsR32(r):
8639		return &intrep.Instruction{
8640			Opcode:   "MOVBLZX",
8641			Operands: []operand.Op{mr, r},
8642			Inputs:   []operand.Op{mr},
8643			Outputs:  []operand.Op{r},
8644		}, nil
8645	}
8646	return nil, errors.New("MOVBLZX: bad operands")
8647}
8648
8649// MOVBQSX: Move with Sign-Extension.
8650//
8651// Forms:
8652//
8653// 	MOVBQSX r8 r64
8654// 	MOVBQSX m8 r64
8655func MOVBQSX(mr, r operand.Op) (*intrep.Instruction, error) {
8656	switch {
8657	case operand.IsR8(mr) && operand.IsR64(r):
8658		return &intrep.Instruction{
8659			Opcode:   "MOVBQSX",
8660			Operands: []operand.Op{mr, r},
8661			Inputs:   []operand.Op{mr},
8662			Outputs:  []operand.Op{r},
8663		}, nil
8664	case operand.IsM8(mr) && operand.IsR64(r):
8665		return &intrep.Instruction{
8666			Opcode:   "MOVBQSX",
8667			Operands: []operand.Op{mr, r},
8668			Inputs:   []operand.Op{mr},
8669			Outputs:  []operand.Op{r},
8670		}, nil
8671	}
8672	return nil, errors.New("MOVBQSX: bad operands")
8673}
8674
8675// MOVBQZX: Move with Zero-Extend.
8676//
8677// Forms:
8678//
8679// 	MOVBQZX r8 r64
8680// 	MOVBQZX m8 r64
8681func MOVBQZX(mr, r operand.Op) (*intrep.Instruction, error) {
8682	switch {
8683	case operand.IsR8(mr) && operand.IsR64(r):
8684		return &intrep.Instruction{
8685			Opcode:   "MOVBQZX",
8686			Operands: []operand.Op{mr, r},
8687			Inputs:   []operand.Op{mr},
8688			Outputs:  []operand.Op{r},
8689		}, nil
8690	case operand.IsM8(mr) && operand.IsR64(r):
8691		return &intrep.Instruction{
8692			Opcode:   "MOVBQZX",
8693			Operands: []operand.Op{mr, r},
8694			Inputs:   []operand.Op{mr},
8695			Outputs:  []operand.Op{r},
8696		}, nil
8697	}
8698	return nil, errors.New("MOVBQZX: bad operands")
8699}
8700
8701// MOVBWSX: Move with Sign-Extension.
8702//
8703// Forms:
8704//
8705// 	MOVBWSX r8 r16
8706// 	MOVBWSX m8 r16
8707func MOVBWSX(mr, r operand.Op) (*intrep.Instruction, error) {
8708	switch {
8709	case operand.IsR8(mr) && operand.IsR16(r):
8710		return &intrep.Instruction{
8711			Opcode:   "MOVBWSX",
8712			Operands: []operand.Op{mr, r},
8713			Inputs:   []operand.Op{mr},
8714			Outputs:  []operand.Op{r},
8715		}, nil
8716	case operand.IsM8(mr) && operand.IsR16(r):
8717		return &intrep.Instruction{
8718			Opcode:   "MOVBWSX",
8719			Operands: []operand.Op{mr, r},
8720			Inputs:   []operand.Op{mr},
8721			Outputs:  []operand.Op{r},
8722		}, nil
8723	}
8724	return nil, errors.New("MOVBWSX: bad operands")
8725}
8726
8727// MOVBWZX: Move with Zero-Extend.
8728//
8729// Forms:
8730//
8731// 	MOVBWZX r8 r16
8732// 	MOVBWZX m8 r16
8733func MOVBWZX(mr, r operand.Op) (*intrep.Instruction, error) {
8734	switch {
8735	case operand.IsR8(mr) && operand.IsR16(r):
8736		return &intrep.Instruction{
8737			Opcode:   "MOVBWZX",
8738			Operands: []operand.Op{mr, r},
8739			Inputs:   []operand.Op{mr},
8740			Outputs:  []operand.Op{r},
8741		}, nil
8742	case operand.IsM8(mr) && operand.IsR16(r):
8743		return &intrep.Instruction{
8744			Opcode:   "MOVBWZX",
8745			Operands: []operand.Op{mr, r},
8746			Inputs:   []operand.Op{mr},
8747			Outputs:  []operand.Op{r},
8748		}, nil
8749	}
8750	return nil, errors.New("MOVBWZX: bad operands")
8751}
8752
8753// MOVD: Move.
8754//
8755// Forms:
8756//
8757// 	MOVD imm32 r64
8758// 	MOVD imm64 r64
8759// 	MOVD r64   r64
8760// 	MOVD m64   r64
8761// 	MOVD imm32 m64
8762// 	MOVD r64   m64
8763// 	MOVD xmm   r64
8764// 	MOVD r64   xmm
8765// 	MOVD xmm   xmm
8766// 	MOVD m64   xmm
8767// 	MOVD xmm   m64
8768// 	MOVD xmm   r32
8769// 	MOVD r32   xmm
8770// 	MOVD m32   xmm
8771// 	MOVD xmm   m32
8772func MOVD(imrx, mrx operand.Op) (*intrep.Instruction, error) {
8773	switch {
8774	case operand.IsIMM32(imrx) && operand.IsR64(mrx):
8775		return &intrep.Instruction{
8776			Opcode:   "MOVD",
8777			Operands: []operand.Op{imrx, mrx},
8778			Inputs:   []operand.Op{},
8779			Outputs:  []operand.Op{mrx},
8780		}, nil
8781	case operand.IsIMM64(imrx) && operand.IsR64(mrx):
8782		return &intrep.Instruction{
8783			Opcode:   "MOVD",
8784			Operands: []operand.Op{imrx, mrx},
8785			Inputs:   []operand.Op{},
8786			Outputs:  []operand.Op{mrx},
8787		}, nil
8788	case operand.IsR64(imrx) && operand.IsR64(mrx):
8789		return &intrep.Instruction{
8790			Opcode:   "MOVD",
8791			Operands: []operand.Op{imrx, mrx},
8792			Inputs:   []operand.Op{imrx},
8793			Outputs:  []operand.Op{mrx},
8794		}, nil
8795	case operand.IsM64(imrx) && operand.IsR64(mrx):
8796		return &intrep.Instruction{
8797			Opcode:   "MOVD",
8798			Operands: []operand.Op{imrx, mrx},
8799			Inputs:   []operand.Op{imrx},
8800			Outputs:  []operand.Op{mrx},
8801		}, nil
8802	case operand.IsIMM32(imrx) && operand.IsM64(mrx):
8803		return &intrep.Instruction{
8804			Opcode:   "MOVD",
8805			Operands: []operand.Op{imrx, mrx},
8806			Inputs:   []operand.Op{},
8807			Outputs:  []operand.Op{mrx},
8808		}, nil
8809	case operand.IsR64(imrx) && operand.IsM64(mrx):
8810		return &intrep.Instruction{
8811			Opcode:   "MOVD",
8812			Operands: []operand.Op{imrx, mrx},
8813			Inputs:   []operand.Op{imrx},
8814			Outputs:  []operand.Op{mrx},
8815		}, nil
8816	case operand.IsXMM(imrx) && operand.IsR64(mrx):
8817		return &intrep.Instruction{
8818			Opcode:   "MOVD",
8819			Operands: []operand.Op{imrx, mrx},
8820			Inputs:   []operand.Op{imrx},
8821			Outputs:  []operand.Op{mrx},
8822			ISA:      []string{"SSE2"},
8823		}, nil
8824	case operand.IsR64(imrx) && operand.IsXMM(mrx):
8825		return &intrep.Instruction{
8826			Opcode:   "MOVD",
8827			Operands: []operand.Op{imrx, mrx},
8828			Inputs:   []operand.Op{imrx},
8829			Outputs:  []operand.Op{mrx},
8830			ISA:      []string{"SSE2"},
8831		}, nil
8832	case operand.IsXMM(imrx) && operand.IsXMM(mrx):
8833		return &intrep.Instruction{
8834			Opcode:   "MOVD",
8835			Operands: []operand.Op{imrx, mrx},
8836			Inputs:   []operand.Op{imrx},
8837			Outputs:  []operand.Op{mrx},
8838			ISA:      []string{"SSE2"},
8839		}, nil
8840	case operand.IsM64(imrx) && operand.IsXMM(mrx):
8841		return &intrep.Instruction{
8842			Opcode:   "MOVD",
8843			Operands: []operand.Op{imrx, mrx},
8844			Inputs:   []operand.Op{imrx},
8845			Outputs:  []operand.Op{mrx},
8846			ISA:      []string{"SSE2"},
8847		}, nil
8848	case operand.IsXMM(imrx) && operand.IsM64(mrx):
8849		return &intrep.Instruction{
8850			Opcode:   "MOVD",
8851			Operands: []operand.Op{imrx, mrx},
8852			Inputs:   []operand.Op{imrx},
8853			Outputs:  []operand.Op{mrx},
8854			ISA:      []string{"SSE2"},
8855		}, nil
8856	case operand.IsXMM(imrx) && operand.IsR32(mrx):
8857		return &intrep.Instruction{
8858			Opcode:   "MOVD",
8859			Operands: []operand.Op{imrx, mrx},
8860			Inputs:   []operand.Op{imrx},
8861			Outputs:  []operand.Op{mrx},
8862			ISA:      []string{"SSE2"},
8863		}, nil
8864	case operand.IsR32(imrx) && operand.IsXMM(mrx):
8865		return &intrep.Instruction{
8866			Opcode:   "MOVD",
8867			Operands: []operand.Op{imrx, mrx},
8868			Inputs:   []operand.Op{imrx},
8869			Outputs:  []operand.Op{mrx},
8870			ISA:      []string{"SSE2"},
8871		}, nil
8872	case operand.IsM32(imrx) && operand.IsXMM(mrx):
8873		return &intrep.Instruction{
8874			Opcode:   "MOVD",
8875			Operands: []operand.Op{imrx, mrx},
8876			Inputs:   []operand.Op{imrx},
8877			Outputs:  []operand.Op{mrx},
8878			ISA:      []string{"SSE2"},
8879		}, nil
8880	case operand.IsXMM(imrx) && operand.IsM32(mrx):
8881		return &intrep.Instruction{
8882			Opcode:   "MOVD",
8883			Operands: []operand.Op{imrx, mrx},
8884			Inputs:   []operand.Op{imrx},
8885			Outputs:  []operand.Op{mrx},
8886			ISA:      []string{"SSE2"},
8887		}, nil
8888	}
8889	return nil, errors.New("MOVD: bad operands")
8890}
8891
8892// MOVDDUP: Move One Double-FP and Duplicate.
8893//
8894// Forms:
8895//
8896// 	MOVDDUP xmm xmm
8897// 	MOVDDUP m64 xmm
8898func MOVDDUP(mx, x operand.Op) (*intrep.Instruction, error) {
8899	switch {
8900	case operand.IsXMM(mx) && operand.IsXMM(x):
8901		return &intrep.Instruction{
8902			Opcode:   "MOVDDUP",
8903			Operands: []operand.Op{mx, x},
8904			Inputs:   []operand.Op{mx},
8905			Outputs:  []operand.Op{x},
8906			ISA:      []string{"SSE3"},
8907		}, nil
8908	case operand.IsM64(mx) && operand.IsXMM(x):
8909		return &intrep.Instruction{
8910			Opcode:   "MOVDDUP",
8911			Operands: []operand.Op{mx, x},
8912			Inputs:   []operand.Op{mx},
8913			Outputs:  []operand.Op{x},
8914			ISA:      []string{"SSE3"},
8915		}, nil
8916	}
8917	return nil, errors.New("MOVDDUP: bad operands")
8918}
8919
8920// MOVDQ2Q: Move.
8921//
8922// Forms:
8923//
8924// 	MOVDQ2Q imm32 r64
8925// 	MOVDQ2Q imm64 r64
8926// 	MOVDQ2Q r64   r64
8927// 	MOVDQ2Q m64   r64
8928// 	MOVDQ2Q imm32 m64
8929// 	MOVDQ2Q r64   m64
8930// 	MOVDQ2Q xmm   r64
8931// 	MOVDQ2Q r64   xmm
8932// 	MOVDQ2Q xmm   xmm
8933// 	MOVDQ2Q m64   xmm
8934// 	MOVDQ2Q xmm   m64
8935// 	MOVDQ2Q xmm   r32
8936// 	MOVDQ2Q r32   xmm
8937// 	MOVDQ2Q m32   xmm
8938// 	MOVDQ2Q xmm   m32
8939func MOVDQ2Q(imrx, mrx operand.Op) (*intrep.Instruction, error) {
8940	switch {
8941	case operand.IsIMM32(imrx) && operand.IsR64(mrx):
8942		return &intrep.Instruction{
8943			Opcode:   "MOVDQ2Q",
8944			Operands: []operand.Op{imrx, mrx},
8945			Inputs:   []operand.Op{},
8946			Outputs:  []operand.Op{mrx},
8947		}, nil
8948	case operand.IsIMM64(imrx) && operand.IsR64(mrx):
8949		return &intrep.Instruction{
8950			Opcode:   "MOVDQ2Q",
8951			Operands: []operand.Op{imrx, mrx},
8952			Inputs:   []operand.Op{},
8953			Outputs:  []operand.Op{mrx},
8954		}, nil
8955	case operand.IsR64(imrx) && operand.IsR64(mrx):
8956		return &intrep.Instruction{
8957			Opcode:   "MOVDQ2Q",
8958			Operands: []operand.Op{imrx, mrx},
8959			Inputs:   []operand.Op{imrx},
8960			Outputs:  []operand.Op{mrx},
8961		}, nil
8962	case operand.IsM64(imrx) && operand.IsR64(mrx):
8963		return &intrep.Instruction{
8964			Opcode:   "MOVDQ2Q",
8965			Operands: []operand.Op{imrx, mrx},
8966			Inputs:   []operand.Op{imrx},
8967			Outputs:  []operand.Op{mrx},
8968		}, nil
8969	case operand.IsIMM32(imrx) && operand.IsM64(mrx):
8970		return &intrep.Instruction{
8971			Opcode:   "MOVDQ2Q",
8972			Operands: []operand.Op{imrx, mrx},
8973			Inputs:   []operand.Op{},
8974			Outputs:  []operand.Op{mrx},
8975		}, nil
8976	case operand.IsR64(imrx) && operand.IsM64(mrx):
8977		return &intrep.Instruction{
8978			Opcode:   "MOVDQ2Q",
8979			Operands: []operand.Op{imrx, mrx},
8980			Inputs:   []operand.Op{imrx},
8981			Outputs:  []operand.Op{mrx},
8982		}, nil
8983	case operand.IsXMM(imrx) && operand.IsR64(mrx):
8984		return &intrep.Instruction{
8985			Opcode:   "MOVDQ2Q",
8986			Operands: []operand.Op{imrx, mrx},
8987			Inputs:   []operand.Op{imrx},
8988			Outputs:  []operand.Op{mrx},
8989			ISA:      []string{"SSE2"},
8990		}, nil
8991	case operand.IsR64(imrx) && operand.IsXMM(mrx):
8992		return &intrep.Instruction{
8993			Opcode:   "MOVDQ2Q",
8994			Operands: []operand.Op{imrx, mrx},
8995			Inputs:   []operand.Op{imrx},
8996			Outputs:  []operand.Op{mrx},
8997			ISA:      []string{"SSE2"},
8998		}, nil
8999	case operand.IsXMM(imrx) && operand.IsXMM(mrx):
9000		return &intrep.Instruction{
9001			Opcode:   "MOVDQ2Q",
9002			Operands: []operand.Op{imrx, mrx},
9003			Inputs:   []operand.Op{imrx},
9004			Outputs:  []operand.Op{mrx},
9005			ISA:      []string{"SSE2"},
9006		}, nil
9007	case operand.IsM64(imrx) && operand.IsXMM(mrx):
9008		return &intrep.Instruction{
9009			Opcode:   "MOVDQ2Q",
9010			Operands: []operand.Op{imrx, mrx},
9011			Inputs:   []operand.Op{imrx},
9012			Outputs:  []operand.Op{mrx},
9013			ISA:      []string{"SSE2"},
9014		}, nil
9015	case operand.IsXMM(imrx) && operand.IsM64(mrx):
9016		return &intrep.Instruction{
9017			Opcode:   "MOVDQ2Q",
9018			Operands: []operand.Op{imrx, mrx},
9019			Inputs:   []operand.Op{imrx},
9020			Outputs:  []operand.Op{mrx},
9021			ISA:      []string{"SSE2"},
9022		}, nil
9023	case operand.IsXMM(imrx) && operand.IsR32(mrx):
9024		return &intrep.Instruction{
9025			Opcode:   "MOVDQ2Q",
9026			Operands: []operand.Op{imrx, mrx},
9027			Inputs:   []operand.Op{imrx},
9028			Outputs:  []operand.Op{mrx},
9029			ISA:      []string{"SSE2"},
9030		}, nil
9031	case operand.IsR32(imrx) && operand.IsXMM(mrx):
9032		return &intrep.Instruction{
9033			Opcode:   "MOVDQ2Q",
9034			Operands: []operand.Op{imrx, mrx},
9035			Inputs:   []operand.Op{imrx},
9036			Outputs:  []operand.Op{mrx},
9037			ISA:      []string{"SSE2"},
9038		}, nil
9039	case operand.IsM32(imrx) && operand.IsXMM(mrx):
9040		return &intrep.Instruction{
9041			Opcode:   "MOVDQ2Q",
9042			Operands: []operand.Op{imrx, mrx},
9043			Inputs:   []operand.Op{imrx},
9044			Outputs:  []operand.Op{mrx},
9045			ISA:      []string{"SSE2"},
9046		}, nil
9047	case operand.IsXMM(imrx) && operand.IsM32(mrx):
9048		return &intrep.Instruction{
9049			Opcode:   "MOVDQ2Q",
9050			Operands: []operand.Op{imrx, mrx},
9051			Inputs:   []operand.Op{imrx},
9052			Outputs:  []operand.Op{mrx},
9053			ISA:      []string{"SSE2"},
9054		}, nil
9055	}
9056	return nil, errors.New("MOVDQ2Q: bad operands")
9057}
9058
9059// MOVHLPS: Move Packed Single-Precision Floating-Point Values High to Low.
9060//
9061// Forms:
9062//
9063// 	MOVHLPS xmm xmm
9064func MOVHLPS(x, x1 operand.Op) (*intrep.Instruction, error) {
9065	switch {
9066	case operand.IsXMM(x) && operand.IsXMM(x1):
9067		return &intrep.Instruction{
9068			Opcode:   "MOVHLPS",
9069			Operands: []operand.Op{x, x1},
9070			Inputs:   []operand.Op{x, x1},
9071			Outputs:  []operand.Op{x1},
9072			ISA:      []string{"SSE"},
9073		}, nil
9074	}
9075	return nil, errors.New("MOVHLPS: bad operands")
9076}
9077
9078// MOVHPD: Move High Packed Double-Precision Floating-Point Value.
9079//
9080// Forms:
9081//
9082// 	MOVHPD m64 xmm
9083// 	MOVHPD xmm m64
9084func MOVHPD(mx, mx1 operand.Op) (*intrep.Instruction, error) {
9085	switch {
9086	case operand.IsM64(mx) && operand.IsXMM(mx1):
9087		return &intrep.Instruction{
9088			Opcode:   "MOVHPD",
9089			Operands: []operand.Op{mx, mx1},
9090			Inputs:   []operand.Op{mx, mx1},
9091			Outputs:  []operand.Op{mx1},
9092			ISA:      []string{"SSE2"},
9093		}, nil
9094	case operand.IsXMM(mx) && operand.IsM64(mx1):
9095		return &intrep.Instruction{
9096			Opcode:   "MOVHPD",
9097			Operands: []operand.Op{mx, mx1},
9098			Inputs:   []operand.Op{mx},
9099			Outputs:  []operand.Op{mx1},
9100			ISA:      []string{"SSE2"},
9101		}, nil
9102	}
9103	return nil, errors.New("MOVHPD: bad operands")
9104}
9105
9106// MOVHPS: Move High Packed Single-Precision Floating-Point Values.
9107//
9108// Forms:
9109//
9110// 	MOVHPS m64 xmm
9111// 	MOVHPS xmm m64
9112func MOVHPS(mx, mx1 operand.Op) (*intrep.Instruction, error) {
9113	switch {
9114	case operand.IsM64(mx) && operand.IsXMM(mx1):
9115		return &intrep.Instruction{
9116			Opcode:   "MOVHPS",
9117			Operands: []operand.Op{mx, mx1},
9118			Inputs:   []operand.Op{mx, mx1},
9119			Outputs:  []operand.Op{mx1},
9120			ISA:      []string{"SSE"},
9121		}, nil
9122	case operand.IsXMM(mx) && operand.IsM64(mx1):
9123		return &intrep.Instruction{
9124			Opcode:   "MOVHPS",
9125			Operands: []operand.Op{mx, mx1},
9126			Inputs:   []operand.Op{mx},
9127			Outputs:  []operand.Op{mx1},
9128			ISA:      []string{"SSE"},
9129		}, nil
9130	}
9131	return nil, errors.New("MOVHPS: bad operands")
9132}
9133
9134// MOVL: Move.
9135//
9136// Forms:
9137//
9138// 	MOVL imm32 r32
9139// 	MOVL r32   r32
9140// 	MOVL m32   r32
9141// 	MOVL imm32 m32
9142// 	MOVL r32   m32
9143func MOVL(imr, mr operand.Op) (*intrep.Instruction, error) {
9144	switch {
9145	case operand.IsIMM32(imr) && operand.IsR32(mr):
9146		return &intrep.Instruction{
9147			Opcode:   "MOVL",
9148			Operands: []operand.Op{imr, mr},
9149			Inputs:   []operand.Op{},
9150			Outputs:  []operand.Op{mr},
9151		}, nil
9152	case operand.IsR32(imr) && operand.IsR32(mr):
9153		return &intrep.Instruction{
9154			Opcode:   "MOVL",
9155			Operands: []operand.Op{imr, mr},
9156			Inputs:   []operand.Op{imr},
9157			Outputs:  []operand.Op{mr},
9158		}, nil
9159	case operand.IsM32(imr) && operand.IsR32(mr):
9160		return &intrep.Instruction{
9161			Opcode:   "MOVL",
9162			Operands: []operand.Op{imr, mr},
9163			Inputs:   []operand.Op{imr},
9164			Outputs:  []operand.Op{mr},
9165		}, nil
9166	case operand.IsIMM32(imr) && operand.IsM32(mr):
9167		return &intrep.Instruction{
9168			Opcode:   "MOVL",
9169			Operands: []operand.Op{imr, mr},
9170			Inputs:   []operand.Op{},
9171			Outputs:  []operand.Op{mr},
9172		}, nil
9173	case operand.IsR32(imr) && operand.IsM32(mr):
9174		return &intrep.Instruction{
9175			Opcode:   "MOVL",
9176			Operands: []operand.Op{imr, mr},
9177			Inputs:   []operand.Op{imr},
9178			Outputs:  []operand.Op{mr},
9179		}, nil
9180	}
9181	return nil, errors.New("MOVL: bad operands")
9182}
9183
9184// MOVLHPS: Move Packed Single-Precision Floating-Point Values Low to High.
9185//
9186// Forms:
9187//
9188// 	MOVLHPS xmm xmm
9189func MOVLHPS(x, x1 operand.Op) (*intrep.Instruction, error) {
9190	switch {
9191	case operand.IsXMM(x) && operand.IsXMM(x1):
9192		return &intrep.Instruction{
9193			Opcode:   "MOVLHPS",
9194			Operands: []operand.Op{x, x1},
9195			Inputs:   []operand.Op{x, x1},
9196			Outputs:  []operand.Op{x1},
9197			ISA:      []string{"SSE"},
9198		}, nil
9199	}
9200	return nil, errors.New("MOVLHPS: bad operands")
9201}
9202
9203// MOVLPD: Move Low Packed Double-Precision Floating-Point Value.
9204//
9205// Forms:
9206//
9207// 	MOVLPD m64 xmm
9208// 	MOVLPD xmm m64
9209func MOVLPD(mx, mx1 operand.Op) (*intrep.Instruction, error) {
9210	switch {
9211	case operand.IsM64(mx) && operand.IsXMM(mx1):
9212		return &intrep.Instruction{
9213			Opcode:   "MOVLPD",
9214			Operands: []operand.Op{mx, mx1},
9215			Inputs:   []operand.Op{mx, mx1},
9216			Outputs:  []operand.Op{mx1},
9217			ISA:      []string{"SSE2"},
9218		}, nil
9219	case operand.IsXMM(mx) && operand.IsM64(mx1):
9220		return &intrep.Instruction{
9221			Opcode:   "MOVLPD",
9222			Operands: []operand.Op{mx, mx1},
9223			Inputs:   []operand.Op{mx},
9224			Outputs:  []operand.Op{mx1},
9225			ISA:      []string{"SSE2"},
9226		}, nil
9227	}
9228	return nil, errors.New("MOVLPD: bad operands")
9229}
9230
9231// MOVLPS: Move Low Packed Single-Precision Floating-Point Values.
9232//
9233// Forms:
9234//
9235// 	MOVLPS m64 xmm
9236// 	MOVLPS xmm m64
9237func MOVLPS(mx, mx1 operand.Op) (*intrep.Instruction, error) {
9238	switch {
9239	case operand.IsM64(mx) && operand.IsXMM(mx1):
9240		return &intrep.Instruction{
9241			Opcode:   "MOVLPS",
9242			Operands: []operand.Op{mx, mx1},
9243			Inputs:   []operand.Op{mx, mx1},
9244			Outputs:  []operand.Op{mx1},
9245			ISA:      []string{"SSE"},
9246		}, nil
9247	case operand.IsXMM(mx) && operand.IsM64(mx1):
9248		return &intrep.Instruction{
9249			Opcode:   "MOVLPS",
9250			Operands: []operand.Op{mx, mx1},
9251			Inputs:   []operand.Op{mx},
9252			Outputs:  []operand.Op{mx1},
9253			ISA:      []string{"SSE"},
9254		}, nil
9255	}
9256	return nil, errors.New("MOVLPS: bad operands")
9257}
9258
9259// MOVLQSX: Move Doubleword to Quadword with Sign-Extension.
9260//
9261// Forms:
9262//
9263// 	MOVLQSX r32 r64
9264// 	MOVLQSX m32 r64
9265func MOVLQSX(mr, r operand.Op) (*intrep.Instruction, error) {
9266	switch {
9267	case operand.IsR32(mr) && operand.IsR64(r):
9268		return &intrep.Instruction{
9269			Opcode:   "MOVLQSX",
9270			Operands: []operand.Op{mr, r},
9271			Inputs:   []operand.Op{mr},
9272			Outputs:  []operand.Op{r},
9273		}, nil
9274	case operand.IsM32(mr) && operand.IsR64(r):
9275		return &intrep.Instruction{
9276			Opcode:   "MOVLQSX",
9277			Operands: []operand.Op{mr, r},
9278			Inputs:   []operand.Op{mr},
9279			Outputs:  []operand.Op{r},
9280		}, nil
9281	}
9282	return nil, errors.New("MOVLQSX: bad operands")
9283}
9284
9285// MOVLQZX: Move with Zero-Extend.
9286//
9287// Forms:
9288//
9289// 	MOVLQZX m32 r64
9290func MOVLQZX(m, r operand.Op) (*intrep.Instruction, error) {
9291	switch {
9292	case operand.IsM32(m) && operand.IsR64(r):
9293		return &intrep.Instruction{
9294			Opcode:   "MOVLQZX",
9295			Operands: []operand.Op{m, r},
9296			Inputs:   []operand.Op{m},
9297			Outputs:  []operand.Op{r},
9298		}, nil
9299	}
9300	return nil, errors.New("MOVLQZX: bad operands")
9301}
9302
9303// MOVMSKPD: Extract Packed Double-Precision Floating-Point Sign Mask.
9304//
9305// Forms:
9306//
9307// 	MOVMSKPD xmm r32
9308func MOVMSKPD(x, r operand.Op) (*intrep.Instruction, error) {
9309	switch {
9310	case operand.IsXMM(x) && operand.IsR32(r):
9311		return &intrep.Instruction{
9312			Opcode:   "MOVMSKPD",
9313			Operands: []operand.Op{x, r},
9314			Inputs:   []operand.Op{x},
9315			Outputs:  []operand.Op{r},
9316			ISA:      []string{"SSE2"},
9317		}, nil
9318	}
9319	return nil, errors.New("MOVMSKPD: bad operands")
9320}
9321
9322// MOVMSKPS: Extract Packed Single-Precision Floating-Point Sign Mask.
9323//
9324// Forms:
9325//
9326// 	MOVMSKPS xmm r32
9327func MOVMSKPS(x, r operand.Op) (*intrep.Instruction, error) {
9328	switch {
9329	case operand.IsXMM(x) && operand.IsR32(r):
9330		return &intrep.Instruction{
9331			Opcode:   "MOVMSKPS",
9332			Operands: []operand.Op{x, r},
9333			Inputs:   []operand.Op{x},
9334			Outputs:  []operand.Op{r},
9335			ISA:      []string{"SSE"},
9336		}, nil
9337	}
9338	return nil, errors.New("MOVMSKPS: bad operands")
9339}
9340
9341// MOVNTDQ: Store Double Quadword Using Non-Temporal Hint.
9342//
9343// Forms:
9344//
9345// 	MOVNTDQ xmm m128
9346func MOVNTDQ(x, m operand.Op) (*intrep.Instruction, error) {
9347	switch {
9348	case operand.IsXMM(x) && operand.IsM128(m):
9349		return &intrep.Instruction{
9350			Opcode:   "MOVNTDQ",
9351			Operands: []operand.Op{x, m},
9352			Inputs:   []operand.Op{x},
9353			Outputs:  []operand.Op{m},
9354			ISA:      []string{"SSE2"},
9355		}, nil
9356	}
9357	return nil, errors.New("MOVNTDQ: bad operands")
9358}
9359
9360// MOVNTDQA: Load Double Quadword Non-Temporal Aligned Hint.
9361//
9362// Forms:
9363//
9364// 	MOVNTDQA m128 xmm
9365func MOVNTDQA(m, x operand.Op) (*intrep.Instruction, error) {
9366	switch {
9367	case operand.IsM128(m) && operand.IsXMM(x):
9368		return &intrep.Instruction{
9369			Opcode:   "MOVNTDQA",
9370			Operands: []operand.Op{m, x},
9371			Inputs:   []operand.Op{m},
9372			Outputs:  []operand.Op{x},
9373			ISA:      []string{"SSE4.1"},
9374		}, nil
9375	}
9376	return nil, errors.New("MOVNTDQA: bad operands")
9377}
9378
9379// MOVNTIL: Store Doubleword Using Non-Temporal Hint.
9380//
9381// Forms:
9382//
9383// 	MOVNTIL r32 m32
9384func MOVNTIL(r, m operand.Op) (*intrep.Instruction, error) {
9385	switch {
9386	case operand.IsR32(r) && operand.IsM32(m):
9387		return &intrep.Instruction{
9388			Opcode:   "MOVNTIL",
9389			Operands: []operand.Op{r, m},
9390			Inputs:   []operand.Op{r},
9391			Outputs:  []operand.Op{m},
9392			ISA:      []string{"SSE2"},
9393		}, nil
9394	}
9395	return nil, errors.New("MOVNTIL: bad operands")
9396}
9397
9398// MOVNTIQ: Store Doubleword Using Non-Temporal Hint.
9399//
9400// Forms:
9401//
9402// 	MOVNTIQ r64 m64
9403func MOVNTIQ(r, m operand.Op) (*intrep.Instruction, error) {
9404	switch {
9405	case operand.IsR64(r) && operand.IsM64(m):
9406		return &intrep.Instruction{
9407			Opcode:   "MOVNTIQ",
9408			Operands: []operand.Op{r, m},
9409			Inputs:   []operand.Op{r},
9410			Outputs:  []operand.Op{m},
9411			ISA:      []string{"SSE2"},
9412		}, nil
9413	}
9414	return nil, errors.New("MOVNTIQ: bad operands")
9415}
9416
9417// MOVNTO: Store Double Quadword Using Non-Temporal Hint.
9418//
9419// Forms:
9420//
9421// 	MOVNTO xmm m128
9422func MOVNTO(x, m operand.Op) (*intrep.Instruction, error) {
9423	switch {
9424	case operand.IsXMM(x) && operand.IsM128(m):
9425		return &intrep.Instruction{
9426			Opcode:   "MOVNTO",
9427			Operands: []operand.Op{x, m},
9428			Inputs:   []operand.Op{x},
9429			Outputs:  []operand.Op{m},
9430			ISA:      []string{"SSE2"},
9431		}, nil
9432	}
9433	return nil, errors.New("MOVNTO: bad operands")
9434}
9435
9436// MOVNTPD: Store Packed Double-Precision Floating-Point Values Using Non-Temporal Hint.
9437//
9438// Forms:
9439//
9440// 	MOVNTPD xmm m128
9441func MOVNTPD(x, m operand.Op) (*intrep.Instruction, error) {
9442	switch {
9443	case operand.IsXMM(x) && operand.IsM128(m):
9444		return &intrep.Instruction{
9445			Opcode:   "MOVNTPD",
9446			Operands: []operand.Op{x, m},
9447			Inputs:   []operand.Op{x},
9448			Outputs:  []operand.Op{m},
9449			ISA:      []string{"SSE2"},
9450		}, nil
9451	}
9452	return nil, errors.New("MOVNTPD: bad operands")
9453}
9454
9455// MOVNTPS: Store Packed Single-Precision Floating-Point Values Using Non-Temporal Hint.
9456//
9457// Forms:
9458//
9459// 	MOVNTPS xmm m128
9460func MOVNTPS(x, m operand.Op) (*intrep.Instruction, error) {
9461	switch {
9462	case operand.IsXMM(x) && operand.IsM128(m):
9463		return &intrep.Instruction{
9464			Opcode:   "MOVNTPS",
9465			Operands: []operand.Op{x, m},
9466			Inputs:   []operand.Op{x},
9467			Outputs:  []operand.Op{m},
9468			ISA:      []string{"SSE"},
9469		}, nil
9470	}
9471	return nil, errors.New("MOVNTPS: bad operands")
9472}
9473
9474// MOVO: Move Aligned Double Quadword.
9475//
9476// Forms:
9477//
9478// 	MOVO xmm  xmm
9479// 	MOVO m128 xmm
9480// 	MOVO xmm  m128
9481func MOVO(mx, mx1 operand.Op) (*intrep.Instruction, error) {
9482	switch {
9483	case operand.IsXMM(mx) && operand.IsXMM(mx1):
9484		return &intrep.Instruction{
9485			Opcode:   "MOVO",
9486			Operands: []operand.Op{mx, mx1},
9487			Inputs:   []operand.Op{mx},
9488			Outputs:  []operand.Op{mx1},
9489			ISA:      []string{"SSE2"},
9490		}, nil
9491	case operand.IsM128(mx) && operand.IsXMM(mx1):
9492		return &intrep.Instruction{
9493			Opcode:   "MOVO",
9494			Operands: []operand.Op{mx, mx1},
9495			Inputs:   []operand.Op{mx},
9496			Outputs:  []operand.Op{mx1},
9497			ISA:      []string{"SSE2"},
9498		}, nil
9499	case operand.IsXMM(mx) && operand.IsM128(mx1):
9500		return &intrep.Instruction{
9501			Opcode:   "MOVO",
9502			Operands: []operand.Op{mx, mx1},
9503			Inputs:   []operand.Op{mx},
9504			Outputs:  []operand.Op{mx1},
9505			ISA:      []string{"SSE2"},
9506		}, nil
9507	}
9508	return nil, errors.New("MOVO: bad operands")
9509}
9510
9511// MOVOA: Move Aligned Double Quadword.
9512//
9513// Forms:
9514//
9515// 	MOVOA xmm  xmm
9516// 	MOVOA m128 xmm
9517// 	MOVOA xmm  m128
9518func MOVOA(mx, mx1 operand.Op) (*intrep.Instruction, error) {
9519	switch {
9520	case operand.IsXMM(mx) && operand.IsXMM(mx1):
9521		return &intrep.Instruction{
9522			Opcode:   "MOVOA",
9523			Operands: []operand.Op{mx, mx1},
9524			Inputs:   []operand.Op{mx},
9525			Outputs:  []operand.Op{mx1},
9526			ISA:      []string{"SSE2"},
9527		}, nil
9528	case operand.IsM128(mx) && operand.IsXMM(mx1):
9529		return &intrep.Instruction{
9530			Opcode:   "MOVOA",
9531			Operands: []operand.Op{mx, mx1},
9532			Inputs:   []operand.Op{mx},
9533			Outputs:  []operand.Op{mx1},
9534			ISA:      []string{"SSE2"},
9535		}, nil
9536	case operand.IsXMM(mx) && operand.IsM128(mx1):
9537		return &intrep.Instruction{
9538			Opcode:   "MOVOA",
9539			Operands: []operand.Op{mx, mx1},
9540			Inputs:   []operand.Op{mx},
9541			Outputs:  []operand.Op{mx1},
9542			ISA:      []string{"SSE2"},
9543		}, nil
9544	}
9545	return nil, errors.New("MOVOA: bad operands")
9546}
9547
9548// MOVOU: Move Unaligned Double Quadword.
9549//
9550// Forms:
9551//
9552// 	MOVOU xmm  xmm
9553// 	MOVOU m128 xmm
9554// 	MOVOU xmm  m128
9555func MOVOU(mx, mx1 operand.Op) (*intrep.Instruction, error) {
9556	switch {
9557	case operand.IsXMM(mx) && operand.IsXMM(mx1):
9558		return &intrep.Instruction{
9559			Opcode:   "MOVOU",
9560			Operands: []operand.Op{mx, mx1},
9561			Inputs:   []operand.Op{mx},
9562			Outputs:  []operand.Op{mx1},
9563			ISA:      []string{"SSE2"},
9564		}, nil
9565	case operand.IsM128(mx) && operand.IsXMM(mx1):
9566		return &intrep.Instruction{
9567			Opcode:   "MOVOU",
9568			Operands: []operand.Op{mx, mx1},
9569			Inputs:   []operand.Op{mx},
9570			Outputs:  []operand.Op{mx1},
9571			ISA:      []string{"SSE2"},
9572		}, nil
9573	case operand.IsXMM(mx) && operand.IsM128(mx1):
9574		return &intrep.Instruction{
9575			Opcode:   "MOVOU",
9576			Operands: []operand.Op{mx, mx1},
9577			Inputs:   []operand.Op{mx},
9578			Outputs:  []operand.Op{mx1},
9579			ISA:      []string{"SSE2"},
9580		}, nil
9581	}
9582	return nil, errors.New("MOVOU: bad operands")
9583}
9584
9585// MOVQ: Move.
9586//
9587// Forms:
9588//
9589// 	MOVQ imm32 r64
9590// 	MOVQ imm64 r64
9591// 	MOVQ r64   r64
9592// 	MOVQ m64   r64
9593// 	MOVQ imm32 m64
9594// 	MOVQ r64   m64
9595// 	MOVQ xmm   r64
9596// 	MOVQ r64   xmm
9597// 	MOVQ xmm   xmm
9598// 	MOVQ m64   xmm
9599// 	MOVQ xmm   m64
9600// 	MOVQ xmm   r32
9601// 	MOVQ r32   xmm
9602// 	MOVQ m32   xmm
9603// 	MOVQ xmm   m32
9604func MOVQ(imrx, mrx operand.Op) (*intrep.Instruction, error) {
9605	switch {
9606	case operand.IsIMM32(imrx) && operand.IsR64(mrx):
9607		return &intrep.Instruction{
9608			Opcode:   "MOVQ",
9609			Operands: []operand.Op{imrx, mrx},
9610			Inputs:   []operand.Op{},
9611			Outputs:  []operand.Op{mrx},
9612		}, nil
9613	case operand.IsIMM64(imrx) && operand.IsR64(mrx):
9614		return &intrep.Instruction{
9615			Opcode:   "MOVQ",
9616			Operands: []operand.Op{imrx, mrx},
9617			Inputs:   []operand.Op{},
9618			Outputs:  []operand.Op{mrx},
9619		}, nil
9620	case operand.IsR64(imrx) && operand.IsR64(mrx):
9621		return &intrep.Instruction{
9622			Opcode:   "MOVQ",
9623			Operands: []operand.Op{imrx, mrx},
9624			Inputs:   []operand.Op{imrx},
9625			Outputs:  []operand.Op{mrx},
9626		}, nil
9627	case operand.IsM64(imrx) && operand.IsR64(mrx):
9628		return &intrep.Instruction{
9629			Opcode:   "MOVQ",
9630			Operands: []operand.Op{imrx, mrx},
9631			Inputs:   []operand.Op{imrx},
9632			Outputs:  []operand.Op{mrx},
9633		}, nil
9634	case operand.IsIMM32(imrx) && operand.IsM64(mrx):
9635		return &intrep.Instruction{
9636			Opcode:   "MOVQ",
9637			Operands: []operand.Op{imrx, mrx},
9638			Inputs:   []operand.Op{},
9639			Outputs:  []operand.Op{mrx},
9640		}, nil
9641	case operand.IsR64(imrx) && operand.IsM64(mrx):
9642		return &intrep.Instruction{
9643			Opcode:   "MOVQ",
9644			Operands: []operand.Op{imrx, mrx},
9645			Inputs:   []operand.Op{imrx},
9646			Outputs:  []operand.Op{mrx},
9647		}, nil
9648	case operand.IsXMM(imrx) && operand.IsR64(mrx):
9649		return &intrep.Instruction{
9650			Opcode:   "MOVQ",
9651			Operands: []operand.Op{imrx, mrx},
9652			Inputs:   []operand.Op{imrx},
9653			Outputs:  []operand.Op{mrx},
9654			ISA:      []string{"SSE2"},
9655		}, nil
9656	case operand.IsR64(imrx) && operand.IsXMM(mrx):
9657		return &intrep.Instruction{
9658			Opcode:   "MOVQ",
9659			Operands: []operand.Op{imrx, mrx},
9660			Inputs:   []operand.Op{imrx},
9661			Outputs:  []operand.Op{mrx},
9662			ISA:      []string{"SSE2"},
9663		}, nil
9664	case operand.IsXMM(imrx) && operand.IsXMM(mrx):
9665		return &intrep.Instruction{
9666			Opcode:   "MOVQ",
9667			Operands: []operand.Op{imrx, mrx},
9668			Inputs:   []operand.Op{imrx},
9669			Outputs:  []operand.Op{mrx},
9670			ISA:      []string{"SSE2"},
9671		}, nil
9672	case operand.IsM64(imrx) && operand.IsXMM(mrx):
9673		return &intrep.Instruction{
9674			Opcode:   "MOVQ",
9675			Operands: []operand.Op{imrx, mrx},
9676			Inputs:   []operand.Op{imrx},
9677			Outputs:  []operand.Op{mrx},
9678			ISA:      []string{"SSE2"},
9679		}, nil
9680	case operand.IsXMM(imrx) && operand.IsM64(mrx):
9681		return &intrep.Instruction{
9682			Opcode:   "MOVQ",
9683			Operands: []operand.Op{imrx, mrx},
9684			Inputs:   []operand.Op{imrx},
9685			Outputs:  []operand.Op{mrx},
9686			ISA:      []string{"SSE2"},
9687		}, nil
9688	case operand.IsXMM(imrx) && operand.IsR32(mrx):
9689		return &intrep.Instruction{
9690			Opcode:   "MOVQ",
9691			Operands: []operand.Op{imrx, mrx},
9692			Inputs:   []operand.Op{imrx},
9693			Outputs:  []operand.Op{mrx},
9694			ISA:      []string{"SSE2"},
9695		}, nil
9696	case operand.IsR32(imrx) && operand.IsXMM(mrx):
9697		return &intrep.Instruction{
9698			Opcode:   "MOVQ",
9699			Operands: []operand.Op{imrx, mrx},
9700			Inputs:   []operand.Op{imrx},
9701			Outputs:  []operand.Op{mrx},
9702			ISA:      []string{"SSE2"},
9703		}, nil
9704	case operand.IsM32(imrx) && operand.IsXMM(mrx):
9705		return &intrep.Instruction{
9706			Opcode:   "MOVQ",
9707			Operands: []operand.Op{imrx, mrx},
9708			Inputs:   []operand.Op{imrx},
9709			Outputs:  []operand.Op{mrx},
9710			ISA:      []string{"SSE2"},
9711		}, nil
9712	case operand.IsXMM(imrx) && operand.IsM32(mrx):
9713		return &intrep.Instruction{
9714			Opcode:   "MOVQ",
9715			Operands: []operand.Op{imrx, mrx},
9716			Inputs:   []operand.Op{imrx},
9717			Outputs:  []operand.Op{mrx},
9718			ISA:      []string{"SSE2"},
9719		}, nil
9720	}
9721	return nil, errors.New("MOVQ: bad operands")
9722}
9723
9724// MOVSD: Move Scalar Double-Precision Floating-Point Value.
9725//
9726// Forms:
9727//
9728// 	MOVSD xmm xmm
9729// 	MOVSD m64 xmm
9730// 	MOVSD xmm m64
9731func MOVSD(mx, mx1 operand.Op) (*intrep.Instruction, error) {
9732	switch {
9733	case operand.IsXMM(mx) && operand.IsXMM(mx1):
9734		return &intrep.Instruction{
9735			Opcode:   "MOVSD",
9736			Operands: []operand.Op{mx, mx1},
9737			Inputs:   []operand.Op{mx, mx1},
9738			Outputs:  []operand.Op{mx1},
9739			ISA:      []string{"SSE2"},
9740		}, nil
9741	case operand.IsM64(mx) && operand.IsXMM(mx1):
9742		return &intrep.Instruction{
9743			Opcode:   "MOVSD",
9744			Operands: []operand.Op{mx, mx1},
9745			Inputs:   []operand.Op{mx},
9746			Outputs:  []operand.Op{mx1},
9747			ISA:      []string{"SSE2"},
9748		}, nil
9749	case operand.IsXMM(mx) && operand.IsM64(mx1):
9750		return &intrep.Instruction{
9751			Opcode:   "MOVSD",
9752			Operands: []operand.Op{mx, mx1},
9753			Inputs:   []operand.Op{mx},
9754			Outputs:  []operand.Op{mx1},
9755			ISA:      []string{"SSE2"},
9756		}, nil
9757	}
9758	return nil, errors.New("MOVSD: bad operands")
9759}
9760
9761// MOVSHDUP: Move Packed Single-FP High and Duplicate.
9762//
9763// Forms:
9764//
9765// 	MOVSHDUP xmm  xmm
9766// 	MOVSHDUP m128 xmm
9767func MOVSHDUP(mx, x operand.Op) (*intrep.Instruction, error) {
9768	switch {
9769	case operand.IsXMM(mx) && operand.IsXMM(x):
9770		return &intrep.Instruction{
9771			Opcode:   "MOVSHDUP",
9772			Operands: []operand.Op{mx, x},
9773			Inputs:   []operand.Op{mx},
9774			Outputs:  []operand.Op{x},
9775			ISA:      []string{"SSE3"},
9776		}, nil
9777	case operand.IsM128(mx) && operand.IsXMM(x):
9778		return &intrep.Instruction{
9779			Opcode:   "MOVSHDUP",
9780			Operands: []operand.Op{mx, x},
9781			Inputs:   []operand.Op{mx},
9782			Outputs:  []operand.Op{x},
9783			ISA:      []string{"SSE3"},
9784		}, nil
9785	}
9786	return nil, errors.New("MOVSHDUP: bad operands")
9787}
9788
9789// MOVSLDUP: Move Packed Single-FP Low and Duplicate.
9790//
9791// Forms:
9792//
9793// 	MOVSLDUP xmm  xmm
9794// 	MOVSLDUP m128 xmm
9795func MOVSLDUP(mx, x operand.Op) (*intrep.Instruction, error) {
9796	switch {
9797	case operand.IsXMM(mx) && operand.IsXMM(x):
9798		return &intrep.Instruction{
9799			Opcode:   "MOVSLDUP",
9800			Operands: []operand.Op{mx, x},
9801			Inputs:   []operand.Op{mx},
9802			Outputs:  []operand.Op{x},
9803			ISA:      []string{"SSE3"},
9804		}, nil
9805	case operand.IsM128(mx) && operand.IsXMM(x):
9806		return &intrep.Instruction{
9807			Opcode:   "MOVSLDUP",
9808			Operands: []operand.Op{mx, x},
9809			Inputs:   []operand.Op{mx},
9810			Outputs:  []operand.Op{x},
9811			ISA:      []string{"SSE3"},
9812		}, nil
9813	}
9814	return nil, errors.New("MOVSLDUP: bad operands")
9815}
9816
9817// MOVSS: Move Scalar Single-Precision Floating-Point Values.
9818//
9819// Forms:
9820//
9821// 	MOVSS xmm xmm
9822// 	MOVSS m32 xmm
9823// 	MOVSS xmm m32
9824func MOVSS(mx, mx1 operand.Op) (*intrep.Instruction, error) {
9825	switch {
9826	case operand.IsXMM(mx) && operand.IsXMM(mx1):
9827		return &intrep.Instruction{
9828			Opcode:   "MOVSS",
9829			Operands: []operand.Op{mx, mx1},
9830			Inputs:   []operand.Op{mx, mx1},
9831			Outputs:  []operand.Op{mx1},
9832			ISA:      []string{"SSE"},
9833		}, nil
9834	case operand.IsM32(mx) && operand.IsXMM(mx1):
9835		return &intrep.Instruction{
9836			Opcode:   "MOVSS",
9837			Operands: []operand.Op{mx, mx1},
9838			Inputs:   []operand.Op{mx},
9839			Outputs:  []operand.Op{mx1},
9840			ISA:      []string{"SSE"},
9841		}, nil
9842	case operand.IsXMM(mx) && operand.IsM32(mx1):
9843		return &intrep.Instruction{
9844			Opcode:   "MOVSS",
9845			Operands: []operand.Op{mx, mx1},
9846			Inputs:   []operand.Op{mx},
9847			Outputs:  []operand.Op{mx1},
9848			ISA:      []string{"SSE"},
9849		}, nil
9850	}
9851	return nil, errors.New("MOVSS: bad operands")
9852}
9853
9854// MOVUPD: Move Unaligned Packed Double-Precision Floating-Point Values.
9855//
9856// Forms:
9857//
9858// 	MOVUPD xmm  xmm
9859// 	MOVUPD m128 xmm
9860// 	MOVUPD xmm  m128
9861func MOVUPD(mx, mx1 operand.Op) (*intrep.Instruction, error) {
9862	switch {
9863	case operand.IsXMM(mx) && operand.IsXMM(mx1):
9864		return &intrep.Instruction{
9865			Opcode:   "MOVUPD",
9866			Operands: []operand.Op{mx, mx1},
9867			Inputs:   []operand.Op{mx},
9868			Outputs:  []operand.Op{mx1},
9869			ISA:      []string{"SSE2"},
9870		}, nil
9871	case operand.IsM128(mx) && operand.IsXMM(mx1):
9872		return &intrep.Instruction{
9873			Opcode:   "MOVUPD",
9874			Operands: []operand.Op{mx, mx1},
9875			Inputs:   []operand.Op{mx},
9876			Outputs:  []operand.Op{mx1},
9877			ISA:      []string{"SSE2"},
9878		}, nil
9879	case operand.IsXMM(mx) && operand.IsM128(mx1):
9880		return &intrep.Instruction{
9881			Opcode:   "MOVUPD",
9882			Operands: []operand.Op{mx, mx1},
9883			Inputs:   []operand.Op{mx},
9884			Outputs:  []operand.Op{mx1},
9885			ISA:      []string{"SSE2"},
9886		}, nil
9887	}
9888	return nil, errors.New("MOVUPD: bad operands")
9889}
9890
9891// MOVUPS: Move Unaligned Packed Single-Precision Floating-Point Values.
9892//
9893// Forms:
9894//
9895// 	MOVUPS xmm  xmm
9896// 	MOVUPS m128 xmm
9897// 	MOVUPS xmm  m128
9898func MOVUPS(mx, mx1 operand.Op) (*intrep.Instruction, error) {
9899	switch {
9900	case operand.IsXMM(mx) && operand.IsXMM(mx1):
9901		return &intrep.Instruction{
9902			Opcode:   "MOVUPS",
9903			Operands: []operand.Op{mx, mx1},
9904			Inputs:   []operand.Op{mx},
9905			Outputs:  []operand.Op{mx1},
9906			ISA:      []string{"SSE"},
9907		}, nil
9908	case operand.IsM128(mx) && operand.IsXMM(mx1):
9909		return &intrep.Instruction{
9910			Opcode:   "MOVUPS",
9911			Operands: []operand.Op{mx, mx1},
9912			Inputs:   []operand.Op{mx},
9913			Outputs:  []operand.Op{mx1},
9914			ISA:      []string{"SSE"},
9915		}, nil
9916	case operand.IsXMM(mx) && operand.IsM128(mx1):
9917		return &intrep.Instruction{
9918			Opcode:   "MOVUPS",
9919			Operands: []operand.Op{mx, mx1},
9920			Inputs:   []operand.Op{mx},
9921			Outputs:  []operand.Op{mx1},
9922			ISA:      []string{"SSE"},
9923		}, nil
9924	}
9925	return nil, errors.New("MOVUPS: bad operands")
9926}
9927
9928// MOVW: Move.
9929//
9930// Forms:
9931//
9932// 	MOVW imm16 r16
9933// 	MOVW r16   r16
9934// 	MOVW m16   r16
9935// 	MOVW imm16 m16
9936// 	MOVW r16   m16
9937func MOVW(imr, mr operand.Op) (*intrep.Instruction, error) {
9938	switch {
9939	case operand.IsIMM16(imr) && operand.IsR16(mr):
9940		return &intrep.Instruction{
9941			Opcode:   "MOVW",
9942			Operands: []operand.Op{imr, mr},
9943			Inputs:   []operand.Op{},
9944			Outputs:  []operand.Op{mr},
9945		}, nil
9946	case operand.IsR16(imr) && operand.IsR16(mr):
9947		return &intrep.Instruction{
9948			Opcode:   "MOVW",
9949			Operands: []operand.Op{imr, mr},
9950			Inputs:   []operand.Op{imr},
9951			Outputs:  []operand.Op{mr},
9952		}, nil
9953	case operand.IsM16(imr) && operand.IsR16(mr):
9954		return &intrep.Instruction{
9955			Opcode:   "MOVW",
9956			Operands: []operand.Op{imr, mr},
9957			Inputs:   []operand.Op{imr},
9958			Outputs:  []operand.Op{mr},
9959		}, nil
9960	case operand.IsIMM16(imr) && operand.IsM16(mr):
9961		return &intrep.Instruction{
9962			Opcode:   "MOVW",
9963			Operands: []operand.Op{imr, mr},
9964			Inputs:   []operand.Op{},
9965			Outputs:  []operand.Op{mr},
9966		}, nil
9967	case operand.IsR16(imr) && operand.IsM16(mr):
9968		return &intrep.Instruction{
9969			Opcode:   "MOVW",
9970			Operands: []operand.Op{imr, mr},
9971			Inputs:   []operand.Op{imr},
9972			Outputs:  []operand.Op{mr},
9973		}, nil
9974	}
9975	return nil, errors.New("MOVW: bad operands")
9976}
9977
9978// MOVWLSX: Move with Sign-Extension.
9979//
9980// Forms:
9981//
9982// 	MOVWLSX r16 r32
9983// 	MOVWLSX m16 r32
9984func MOVWLSX(mr, r operand.Op) (*intrep.Instruction, error) {
9985	switch {
9986	case operand.IsR16(mr) && operand.IsR32(r):
9987		return &intrep.Instruction{
9988			Opcode:   "MOVWLSX",
9989			Operands: []operand.Op{mr, r},
9990			Inputs:   []operand.Op{mr},
9991			Outputs:  []operand.Op{r},
9992		}, nil
9993	case operand.IsM16(mr) && operand.IsR32(r):
9994		return &intrep.Instruction{
9995			Opcode:   "MOVWLSX",
9996			Operands: []operand.Op{mr, r},
9997			Inputs:   []operand.Op{mr},
9998			Outputs:  []operand.Op{r},
9999		}, nil
10000	}
10001	return nil, errors.New("MOVWLSX: bad operands")
10002}
10003
10004// MOVWLZX: Move with Zero-Extend.
10005//
10006// Forms:
10007//
10008// 	MOVWLZX r16 r32
10009// 	MOVWLZX m16 r32
10010func MOVWLZX(mr, r operand.Op) (*intrep.Instruction, error) {
10011	switch {
10012	case operand.IsR16(mr) && operand.IsR32(r):
10013		return &intrep.Instruction{
10014			Opcode:   "MOVWLZX",
10015			Operands: []operand.Op{mr, r},
10016			Inputs:   []operand.Op{mr},
10017			Outputs:  []operand.Op{r},
10018		}, nil
10019	case operand.IsM16(mr) && operand.IsR32(r):
10020		return &intrep.Instruction{
10021			Opcode:   "MOVWLZX",
10022			Operands: []operand.Op{mr, r},
10023			Inputs:   []operand.Op{mr},
10024			Outputs:  []operand.Op{r},
10025		}, nil
10026	}
10027	return nil, errors.New("MOVWLZX: bad operands")
10028}
10029
10030// MOVWQSX: Move with Sign-Extension.
10031//
10032// Forms:
10033//
10034// 	MOVWQSX r16 r64
10035// 	MOVWQSX m16 r64
10036func MOVWQSX(mr, r operand.Op) (*intrep.Instruction, error) {
10037	switch {
10038	case operand.IsR16(mr) && operand.IsR64(r):
10039		return &intrep.Instruction{
10040			Opcode:   "MOVWQSX",
10041			Operands: []operand.Op{mr, r},
10042			Inputs:   []operand.Op{mr},
10043			Outputs:  []operand.Op{r},
10044		}, nil
10045	case operand.IsM16(mr) && operand.IsR64(r):
10046		return &intrep.Instruction{
10047			Opcode:   "MOVWQSX",
10048			Operands: []operand.Op{mr, r},
10049			Inputs:   []operand.Op{mr},
10050			Outputs:  []operand.Op{r},
10051		}, nil
10052	}
10053	return nil, errors.New("MOVWQSX: bad operands")
10054}
10055
10056// MOVWQZX: Move with Zero-Extend.
10057//
10058// Forms:
10059//
10060// 	MOVWQZX r16 r64
10061// 	MOVWQZX m16 r64
10062func MOVWQZX(mr, r operand.Op) (*intrep.Instruction, error) {
10063	switch {
10064	case operand.IsR16(mr) && operand.IsR64(r):
10065		return &intrep.Instruction{
10066			Opcode:   "MOVWQZX",
10067			Operands: []operand.Op{mr, r},
10068			Inputs:   []operand.Op{mr},
10069			Outputs:  []operand.Op{r},
10070		}, nil
10071	case operand.IsM16(mr) && operand.IsR64(r):
10072		return &intrep.Instruction{
10073			Opcode:   "MOVWQZX",
10074			Operands: []operand.Op{mr, r},
10075			Inputs:   []operand.Op{mr},
10076			Outputs:  []operand.Op{r},
10077		}, nil
10078	}
10079	return nil, errors.New("MOVWQZX: bad operands")
10080}
10081
10082// MPSADBW: Compute Multiple Packed Sums of Absolute Difference.
10083//
10084// Forms:
10085//
10086// 	MPSADBW imm8 xmm  xmm
10087// 	MPSADBW imm8 m128 xmm
10088func MPSADBW(i, mx, x operand.Op) (*intrep.Instruction, error) {
10089	switch {
10090	case operand.IsIMM8(i) && operand.IsXMM(mx) && operand.IsXMM(x):
10091		return &intrep.Instruction{
10092			Opcode:   "MPSADBW",
10093			Operands: []operand.Op{i, mx, x},
10094			Inputs:   []operand.Op{mx, x},
10095			Outputs:  []operand.Op{x},
10096			ISA:      []string{"SSE4.1"},
10097		}, nil
10098	case operand.IsIMM8(i) && operand.IsM128(mx) && operand.IsXMM(x):
10099		return &intrep.Instruction{
10100			Opcode:   "MPSADBW",
10101			Operands: []operand.Op{i, mx, x},
10102			Inputs:   []operand.Op{mx, x},
10103			Outputs:  []operand.Op{x},
10104			ISA:      []string{"SSE4.1"},
10105		}, nil
10106	}
10107	return nil, errors.New("MPSADBW: bad operands")
10108}
10109
10110// MULB: Unsigned Multiply.
10111//
10112// Forms:
10113//
10114// 	MULB r8
10115// 	MULB m8
10116func MULB(mr operand.Op) (*intrep.Instruction, error) {
10117	switch {
10118	case operand.IsR8(mr):
10119		return &intrep.Instruction{
10120			Opcode:   "MULB",
10121			Operands: []operand.Op{mr},
10122			Inputs:   []operand.Op{mr, reg.AL},
10123			Outputs:  []operand.Op{reg.AX},
10124		}, nil
10125	case operand.IsM8(mr):
10126		return &intrep.Instruction{
10127			Opcode:   "MULB",
10128			Operands: []operand.Op{mr},
10129			Inputs:   []operand.Op{mr, reg.AL},
10130			Outputs:  []operand.Op{reg.AX},
10131		}, nil
10132	}
10133	return nil, errors.New("MULB: bad operands")
10134}
10135
10136// MULL: Unsigned Multiply.
10137//
10138// Forms:
10139//
10140// 	MULL r32
10141// 	MULL m32
10142func MULL(mr operand.Op) (*intrep.Instruction, error) {
10143	switch {
10144	case operand.IsR32(mr):
10145		return &intrep.Instruction{
10146			Opcode:   "MULL",
10147			Operands: []operand.Op{mr},
10148			Inputs:   []operand.Op{mr, reg.EAX},
10149			Outputs:  []operand.Op{reg.EAX, reg.EDX},
10150		}, nil
10151	case operand.IsM32(mr):
10152		return &intrep.Instruction{
10153			Opcode:   "MULL",
10154			Operands: []operand.Op{mr},
10155			Inputs:   []operand.Op{mr, reg.EAX},
10156			Outputs:  []operand.Op{reg.EAX, reg.EDX},
10157		}, nil
10158	}
10159	return nil, errors.New("MULL: bad operands")
10160}
10161
10162// MULPD: Multiply Packed Double-Precision Floating-Point Values.
10163//
10164// Forms:
10165//
10166// 	MULPD xmm  xmm
10167// 	MULPD m128 xmm
10168func MULPD(mx, x operand.Op) (*intrep.Instruction, error) {
10169	switch {
10170	case operand.IsXMM(mx) && operand.IsXMM(x):
10171		return &intrep.Instruction{
10172			Opcode:   "MULPD",
10173			Operands: []operand.Op{mx, x},
10174			Inputs:   []operand.Op{mx, x},
10175			Outputs:  []operand.Op{x},
10176			ISA:      []string{"SSE2"},
10177		}, nil
10178	case operand.IsM128(mx) && operand.IsXMM(x):
10179		return &intrep.Instruction{
10180			Opcode:   "MULPD",
10181			Operands: []operand.Op{mx, x},
10182			Inputs:   []operand.Op{mx, x},
10183			Outputs:  []operand.Op{x},
10184			ISA:      []string{"SSE2"},
10185		}, nil
10186	}
10187	return nil, errors.New("MULPD: bad operands")
10188}
10189
10190// MULPS: Multiply Packed Single-Precision Floating-Point Values.
10191//
10192// Forms:
10193//
10194// 	MULPS xmm  xmm
10195// 	MULPS m128 xmm
10196func MULPS(mx, x operand.Op) (*intrep.Instruction, error) {
10197	switch {
10198	case operand.IsXMM(mx) && operand.IsXMM(x):
10199		return &intrep.Instruction{
10200			Opcode:   "MULPS",
10201			Operands: []operand.Op{mx, x},
10202			Inputs:   []operand.Op{mx, x},
10203			Outputs:  []operand.Op{x},
10204			ISA:      []string{"SSE"},
10205		}, nil
10206	case operand.IsM128(mx) && operand.IsXMM(x):
10207		return &intrep.Instruction{
10208			Opcode:   "MULPS",
10209			Operands: []operand.Op{mx, x},
10210			Inputs:   []operand.Op{mx, x},
10211			Outputs:  []operand.Op{x},
10212			ISA:      []string{"SSE"},
10213		}, nil
10214	}
10215	return nil, errors.New("MULPS: bad operands")
10216}
10217
10218// MULQ: Unsigned Multiply.
10219//
10220// Forms:
10221//
10222// 	MULQ r64
10223// 	MULQ m64
10224func MULQ(mr operand.Op) (*intrep.Instruction, error) {
10225	switch {
10226	case operand.IsR64(mr):
10227		return &intrep.Instruction{
10228			Opcode:   "MULQ",
10229			Operands: []operand.Op{mr},
10230			Inputs:   []operand.Op{mr, reg.RAX},
10231			Outputs:  []operand.Op{reg.RAX, reg.RDX},
10232		}, nil
10233	case operand.IsM64(mr):
10234		return &intrep.Instruction{
10235			Opcode:   "MULQ",
10236			Operands: []operand.Op{mr},
10237			Inputs:   []operand.Op{mr, reg.RAX},
10238			Outputs:  []operand.Op{reg.RAX, reg.RDX},
10239		}, nil
10240	}
10241	return nil, errors.New("MULQ: bad operands")
10242}
10243
10244// MULSD: Multiply Scalar Double-Precision Floating-Point Values.
10245//
10246// Forms:
10247//
10248// 	MULSD xmm xmm
10249// 	MULSD m64 xmm
10250func MULSD(mx, x operand.Op) (*intrep.Instruction, error) {
10251	switch {
10252	case operand.IsXMM(mx) && operand.IsXMM(x):
10253		return &intrep.Instruction{
10254			Opcode:   "MULSD",
10255			Operands: []operand.Op{mx, x},
10256			Inputs:   []operand.Op{mx, x},
10257			Outputs:  []operand.Op{x},
10258			ISA:      []string{"SSE2"},
10259		}, nil
10260	case operand.IsM64(mx) && operand.IsXMM(x):
10261		return &intrep.Instruction{
10262			Opcode:   "MULSD",
10263			Operands: []operand.Op{mx, x},
10264			Inputs:   []operand.Op{mx, x},
10265			Outputs:  []operand.Op{x},
10266			ISA:      []string{"SSE2"},
10267		}, nil
10268	}
10269	return nil, errors.New("MULSD: bad operands")
10270}
10271
10272// MULSS: Multiply Scalar Single-Precision Floating-Point Values.
10273//
10274// Forms:
10275//
10276// 	MULSS xmm xmm
10277// 	MULSS m32 xmm
10278func MULSS(mx, x operand.Op) (*intrep.Instruction, error) {
10279	switch {
10280	case operand.IsXMM(mx) && operand.IsXMM(x):
10281		return &intrep.Instruction{
10282			Opcode:   "MULSS",
10283			Operands: []operand.Op{mx, x},
10284			Inputs:   []operand.Op{mx, x},
10285			Outputs:  []operand.Op{x},
10286			ISA:      []string{"SSE"},
10287		}, nil
10288	case operand.IsM32(mx) && operand.IsXMM(x):
10289		return &intrep.Instruction{
10290			Opcode:   "MULSS",
10291			Operands: []operand.Op{mx, x},
10292			Inputs:   []operand.Op{mx, x},
10293			Outputs:  []operand.Op{x},
10294			ISA:      []string{"SSE"},
10295		}, nil
10296	}
10297	return nil, errors.New("MULSS: bad operands")
10298}
10299
10300// MULW: Unsigned Multiply.
10301//
10302// Forms:
10303//
10304// 	MULW r16
10305// 	MULW m16
10306func MULW(mr operand.Op) (*intrep.Instruction, error) {
10307	switch {
10308	case operand.IsR16(mr):
10309		return &intrep.Instruction{
10310			Opcode:   "MULW",
10311			Operands: []operand.Op{mr},
10312			Inputs:   []operand.Op{mr, reg.AX},
10313			Outputs:  []operand.Op{reg.AX, reg.DX},
10314		}, nil
10315	case operand.IsM16(mr):
10316		return &intrep.Instruction{
10317			Opcode:   "MULW",
10318			Operands: []operand.Op{mr},
10319			Inputs:   []operand.Op{mr, reg.AX},
10320			Outputs:  []operand.Op{reg.AX, reg.DX},
10321		}, nil
10322	}
10323	return nil, errors.New("MULW: bad operands")
10324}
10325
10326// MULXL: Unsigned Multiply Without Affecting Flags.
10327//
10328// Forms:
10329//
10330// 	MULXL r32 r32 r32
10331// 	MULXL m32 r32 r32
10332func MULXL(mr, r, r1 operand.Op) (*intrep.Instruction, error) {
10333	switch {
10334	case operand.IsR32(mr) && operand.IsR32(r) && operand.IsR32(r1):
10335		return &intrep.Instruction{
10336			Opcode:   "MULXL",
10337			Operands: []operand.Op{mr, r, r1},
10338			Inputs:   []operand.Op{mr, reg.EDX},
10339			Outputs:  []operand.Op{r, r1},
10340			ISA:      []string{"BMI2"},
10341		}, nil
10342	case operand.IsM32(mr) && operand.IsR32(r) && operand.IsR32(r1):
10343		return &intrep.Instruction{
10344			Opcode:   "MULXL",
10345			Operands: []operand.Op{mr, r, r1},
10346			Inputs:   []operand.Op{mr, reg.EDX},
10347			Outputs:  []operand.Op{r, r1},
10348			ISA:      []string{"BMI2"},
10349		}, nil
10350	}
10351	return nil, errors.New("MULXL: bad operands")
10352}
10353
10354// MULXQ: Unsigned Multiply Without Affecting Flags.
10355//
10356// Forms:
10357//
10358// 	MULXQ r64 r64 r64
10359// 	MULXQ m64 r64 r64
10360func MULXQ(mr, r, r1 operand.Op) (*intrep.Instruction, error) {
10361	switch {
10362	case operand.IsR64(mr) && operand.IsR64(r) && operand.IsR64(r1):
10363		return &intrep.Instruction{
10364			Opcode:   "MULXQ",
10365			Operands: []operand.Op{mr, r, r1},
10366			Inputs:   []operand.Op{mr, reg.RDX},
10367			Outputs:  []operand.Op{r, r1},
10368			ISA:      []string{"BMI2"},
10369		}, nil
10370	case operand.IsM64(mr) && operand.IsR64(r) && operand.IsR64(r1):
10371		return &intrep.Instruction{
10372			Opcode:   "MULXQ",
10373			Operands: []operand.Op{mr, r, r1},
10374			Inputs:   []operand.Op{mr, reg.RDX},
10375			Outputs:  []operand.Op{r, r1},
10376			ISA:      []string{"BMI2"},
10377		}, nil
10378	}
10379	return nil, errors.New("MULXQ: bad operands")
10380}
10381
10382// MWAIT: Monitor Wait.
10383//
10384// Forms:
10385//
10386// 	MWAIT
10387func MWAIT() (*intrep.Instruction, error) {
10388	return &intrep.Instruction{
10389		Opcode:   "MWAIT",
10390		Operands: nil,
10391		Inputs:   []operand.Op{reg.EAX, reg.ECX},
10392		Outputs:  []operand.Op{},
10393		ISA:      []string{"MONITOR"},
10394	}, nil
10395}
10396
10397// NEGB: Two's Complement Negation.
10398//
10399// Forms:
10400//
10401// 	NEGB r8
10402// 	NEGB m8
10403func NEGB(mr operand.Op) (*intrep.Instruction, error) {
10404	switch {
10405	case operand.IsR8(mr):
10406		return &intrep.Instruction{
10407			Opcode:   "NEGB",
10408			Operands: []operand.Op{mr},
10409			Inputs:   []operand.Op{mr},
10410			Outputs:  []operand.Op{mr},
10411		}, nil
10412	case operand.IsM8(mr):
10413		return &intrep.Instruction{
10414			Opcode:   "NEGB",
10415			Operands: []operand.Op{mr},
10416			Inputs:   []operand.Op{mr},
10417			Outputs:  []operand.Op{mr},
10418		}, nil
10419	}
10420	return nil, errors.New("NEGB: bad operands")
10421}
10422
10423// NEGL: Two's Complement Negation.
10424//
10425// Forms:
10426//
10427// 	NEGL r32
10428// 	NEGL m32
10429func NEGL(mr operand.Op) (*intrep.Instruction, error) {
10430	switch {
10431	case operand.IsR32(mr):
10432		return &intrep.Instruction{
10433			Opcode:   "NEGL",
10434			Operands: []operand.Op{mr},
10435			Inputs:   []operand.Op{mr},
10436			Outputs:  []operand.Op{mr},
10437		}, nil
10438	case operand.IsM32(mr):
10439		return &intrep.Instruction{
10440			Opcode:   "NEGL",
10441			Operands: []operand.Op{mr},
10442			Inputs:   []operand.Op{mr},
10443			Outputs:  []operand.Op{mr},
10444		}, nil
10445	}
10446	return nil, errors.New("NEGL: bad operands")
10447}
10448
10449// NEGQ: Two's Complement Negation.
10450//
10451// Forms:
10452//
10453// 	NEGQ r64
10454// 	NEGQ m64
10455func NEGQ(mr operand.Op) (*intrep.Instruction, error) {
10456	switch {
10457	case operand.IsR64(mr):
10458		return &intrep.Instruction{
10459			Opcode:   "NEGQ",
10460			Operands: []operand.Op{mr},
10461			Inputs:   []operand.Op{mr},
10462			Outputs:  []operand.Op{mr},
10463		}, nil
10464	case operand.IsM64(mr):
10465		return &intrep.Instruction{
10466			Opcode:   "NEGQ",
10467			Operands: []operand.Op{mr},
10468			Inputs:   []operand.Op{mr},
10469			Outputs:  []operand.Op{mr},
10470		}, nil
10471	}
10472	return nil, errors.New("NEGQ: bad operands")
10473}
10474
10475// NEGW: Two's Complement Negation.
10476//
10477// Forms:
10478//
10479// 	NEGW r16
10480// 	NEGW m16
10481func NEGW(mr operand.Op) (*intrep.Instruction, error) {
10482	switch {
10483	case operand.IsR16(mr):
10484		return &intrep.Instruction{
10485			Opcode:   "NEGW",
10486			Operands: []operand.Op{mr},
10487			Inputs:   []operand.Op{mr},
10488			Outputs:  []operand.Op{mr},
10489		}, nil
10490	case operand.IsM16(mr):
10491		return &intrep.Instruction{
10492			Opcode:   "NEGW",
10493			Operands: []operand.Op{mr},
10494			Inputs:   []operand.Op{mr},
10495			Outputs:  []operand.Op{mr},
10496		}, nil
10497	}
10498	return nil, errors.New("NEGW: bad operands")
10499}
10500
10501// NOP: No Operation.
10502//
10503// Forms:
10504//
10505// 	NOP
10506func NOP() (*intrep.Instruction, error) {
10507	return &intrep.Instruction{
10508		Opcode:   "NOP",
10509		Operands: nil,
10510		Inputs:   []operand.Op{},
10511		Outputs:  []operand.Op{},
10512	}, nil
10513}
10514
10515// NOTB: One's Complement Negation.
10516//
10517// Forms:
10518//
10519// 	NOTB r8
10520// 	NOTB m8
10521func NOTB(mr operand.Op) (*intrep.Instruction, error) {
10522	switch {
10523	case operand.IsR8(mr):
10524		return &intrep.Instruction{
10525			Opcode:   "NOTB",
10526			Operands: []operand.Op{mr},
10527			Inputs:   []operand.Op{mr},
10528			Outputs:  []operand.Op{mr},
10529		}, nil
10530	case operand.IsM8(mr):
10531		return &intrep.Instruction{
10532			Opcode:   "NOTB",
10533			Operands: []operand.Op{mr},
10534			Inputs:   []operand.Op{mr},
10535			Outputs:  []operand.Op{mr},
10536		}, nil
10537	}
10538	return nil, errors.New("NOTB: bad operands")
10539}
10540
10541// NOTL: One's Complement Negation.
10542//
10543// Forms:
10544//
10545// 	NOTL r32
10546// 	NOTL m32
10547func NOTL(mr operand.Op) (*intrep.Instruction, error) {
10548	switch {
10549	case operand.IsR32(mr):
10550		return &intrep.Instruction{
10551			Opcode:   "NOTL",
10552			Operands: []operand.Op{mr},
10553			Inputs:   []operand.Op{mr},
10554			Outputs:  []operand.Op{mr},
10555		}, nil
10556	case operand.IsM32(mr):
10557		return &intrep.Instruction{
10558			Opcode:   "NOTL",
10559			Operands: []operand.Op{mr},
10560			Inputs:   []operand.Op{mr},
10561			Outputs:  []operand.Op{mr},
10562		}, nil
10563	}
10564	return nil, errors.New("NOTL: bad operands")
10565}
10566
10567// NOTQ: One's Complement Negation.
10568//
10569// Forms:
10570//
10571// 	NOTQ r64
10572// 	NOTQ m64
10573func NOTQ(mr operand.Op) (*intrep.Instruction, error) {
10574	switch {
10575	case operand.IsR64(mr):
10576		return &intrep.Instruction{
10577			Opcode:   "NOTQ",
10578			Operands: []operand.Op{mr},
10579			Inputs:   []operand.Op{mr},
10580			Outputs:  []operand.Op{mr},
10581		}, nil
10582	case operand.IsM64(mr):
10583		return &intrep.Instruction{
10584			Opcode:   "NOTQ",
10585			Operands: []operand.Op{mr},
10586			Inputs:   []operand.Op{mr},
10587			Outputs:  []operand.Op{mr},
10588		}, nil
10589	}
10590	return nil, errors.New("NOTQ: bad operands")
10591}
10592
10593// NOTW: One's Complement Negation.
10594//
10595// Forms:
10596//
10597// 	NOTW r16
10598// 	NOTW m16
10599func NOTW(mr operand.Op) (*intrep.Instruction, error) {
10600	switch {
10601	case operand.IsR16(mr):
10602		return &intrep.Instruction{
10603			Opcode:   "NOTW",
10604			Operands: []operand.Op{mr},
10605			Inputs:   []operand.Op{mr},
10606			Outputs:  []operand.Op{mr},
10607		}, nil
10608	case operand.IsM16(mr):
10609		return &intrep.Instruction{
10610			Opcode:   "NOTW",
10611			Operands: []operand.Op{mr},
10612			Inputs:   []operand.Op{mr},
10613			Outputs:  []operand.Op{mr},
10614		}, nil
10615	}
10616	return nil, errors.New("NOTW: bad operands")
10617}
10618
10619// ORB: Logical Inclusive OR.
10620//
10621// Forms:
10622//
10623// 	ORB imm8 al
10624// 	ORB imm8 r8
10625// 	ORB r8   r8
10626// 	ORB m8   r8
10627// 	ORB imm8 m8
10628// 	ORB r8   m8
10629func ORB(imr, amr operand.Op) (*intrep.Instruction, error) {
10630	switch {
10631	case operand.IsIMM8(imr) && operand.IsAL(amr):
10632		return &intrep.Instruction{
10633			Opcode:   "ORB",
10634			Operands: []operand.Op{imr, amr},
10635			Inputs:   []operand.Op{amr},
10636			Outputs:  []operand.Op{amr},
10637		}, nil
10638	case operand.IsIMM8(imr) && operand.IsR8(amr):
10639		return &intrep.Instruction{
10640			Opcode:   "ORB",
10641			Operands: []operand.Op{imr, amr},
10642			Inputs:   []operand.Op{amr},
10643			Outputs:  []operand.Op{amr},
10644		}, nil
10645	case operand.IsR8(imr) && operand.IsR8(amr):
10646		return &intrep.Instruction{
10647			Opcode:   "ORB",
10648			Operands: []operand.Op{imr, amr},
10649			Inputs:   []operand.Op{imr, amr},
10650			Outputs:  []operand.Op{amr},
10651		}, nil
10652	case operand.IsM8(imr) && operand.IsR8(amr):
10653		return &intrep.Instruction{
10654			Opcode:   "ORB",
10655			Operands: []operand.Op{imr, amr},
10656			Inputs:   []operand.Op{imr, amr},
10657			Outputs:  []operand.Op{amr},
10658		}, nil
10659	case operand.IsIMM8(imr) && operand.IsM8(amr):
10660		return &intrep.Instruction{
10661			Opcode:   "ORB",
10662			Operands: []operand.Op{imr, amr},
10663			Inputs:   []operand.Op{amr},
10664			Outputs:  []operand.Op{amr},
10665		}, nil
10666	case operand.IsR8(imr) && operand.IsM8(amr):
10667		return &intrep.Instruction{
10668			Opcode:   "ORB",
10669			Operands: []operand.Op{imr, amr},
10670			Inputs:   []operand.Op{imr, amr},
10671			Outputs:  []operand.Op{amr},
10672		}, nil
10673	}
10674	return nil, errors.New("ORB: bad operands")
10675}
10676
10677// ORL: Logical Inclusive OR.
10678//
10679// Forms:
10680//
10681// 	ORL imm32 eax
10682// 	ORL imm8  r32
10683// 	ORL imm32 r32
10684// 	ORL r32   r32
10685// 	ORL m32   r32
10686// 	ORL imm8  m32
10687// 	ORL imm32 m32
10688// 	ORL r32   m32
10689func ORL(imr, emr operand.Op) (*intrep.Instruction, error) {
10690	switch {
10691	case operand.IsIMM32(imr) && operand.IsEAX(emr):
10692		return &intrep.Instruction{
10693			Opcode:   "ORL",
10694			Operands: []operand.Op{imr, emr},
10695			Inputs:   []operand.Op{emr},
10696			Outputs:  []operand.Op{emr},
10697		}, nil
10698	case operand.IsIMM8(imr) && operand.IsR32(emr):
10699		return &intrep.Instruction{
10700			Opcode:   "ORL",
10701			Operands: []operand.Op{imr, emr},
10702			Inputs:   []operand.Op{emr},
10703			Outputs:  []operand.Op{emr},
10704		}, nil
10705	case operand.IsIMM32(imr) && operand.IsR32(emr):
10706		return &intrep.Instruction{
10707			Opcode:   "ORL",
10708			Operands: []operand.Op{imr, emr},
10709			Inputs:   []operand.Op{emr},
10710			Outputs:  []operand.Op{emr},
10711		}, nil
10712	case operand.IsR32(imr) && operand.IsR32(emr):
10713		return &intrep.Instruction{
10714			Opcode:   "ORL",
10715			Operands: []operand.Op{imr, emr},
10716			Inputs:   []operand.Op{imr, emr},
10717			Outputs:  []operand.Op{emr},
10718		}, nil
10719	case operand.IsM32(imr) && operand.IsR32(emr):
10720		return &intrep.Instruction{
10721			Opcode:   "ORL",
10722			Operands: []operand.Op{imr, emr},
10723			Inputs:   []operand.Op{imr, emr},
10724			Outputs:  []operand.Op{emr},
10725		}, nil
10726	case operand.IsIMM8(imr) && operand.IsM32(emr):
10727		return &intrep.Instruction{
10728			Opcode:   "ORL",
10729			Operands: []operand.Op{imr, emr},
10730			Inputs:   []operand.Op{emr},
10731			Outputs:  []operand.Op{emr},
10732		}, nil
10733	case operand.IsIMM32(imr) && operand.IsM32(emr):
10734		return &intrep.Instruction{
10735			Opcode:   "ORL",
10736			Operands: []operand.Op{imr, emr},
10737			Inputs:   []operand.Op{emr},
10738			Outputs:  []operand.Op{emr},
10739		}, nil
10740	case operand.IsR32(imr) && operand.IsM32(emr):
10741		return &intrep.Instruction{
10742			Opcode:   "ORL",
10743			Operands: []operand.Op{imr, emr},
10744			Inputs:   []operand.Op{imr, emr},
10745			Outputs:  []operand.Op{emr},
10746		}, nil
10747	}
10748	return nil, errors.New("ORL: bad operands")
10749}
10750
10751// ORPD: Bitwise Logical OR of Double-Precision Floating-Point Values.
10752//
10753// Forms:
10754//
10755// 	ORPD xmm  xmm
10756// 	ORPD m128 xmm
10757func ORPD(mx, x operand.Op) (*intrep.Instruction, error) {
10758	switch {
10759	case operand.IsXMM(mx) && operand.IsXMM(x):
10760		return &intrep.Instruction{
10761			Opcode:   "ORPD",
10762			Operands: []operand.Op{mx, x},
10763			Inputs:   []operand.Op{mx, x},
10764			Outputs:  []operand.Op{x},
10765			ISA:      []string{"SSE2"},
10766		}, nil
10767	case operand.IsM128(mx) && operand.IsXMM(x):
10768		return &intrep.Instruction{
10769			Opcode:   "ORPD",
10770			Operands: []operand.Op{mx, x},
10771			Inputs:   []operand.Op{mx, x},
10772			Outputs:  []operand.Op{x},
10773			ISA:      []string{"SSE2"},
10774		}, nil
10775	}
10776	return nil, errors.New("ORPD: bad operands")
10777}
10778
10779// ORPS: Bitwise Logical OR of Single-Precision Floating-Point Values.
10780//
10781// Forms:
10782//
10783// 	ORPS xmm  xmm
10784// 	ORPS m128 xmm
10785func ORPS(mx, x operand.Op) (*intrep.Instruction, error) {
10786	switch {
10787	case operand.IsXMM(mx) && operand.IsXMM(x):
10788		return &intrep.Instruction{
10789			Opcode:   "ORPS",
10790			Operands: []operand.Op{mx, x},
10791			Inputs:   []operand.Op{mx, x},
10792			Outputs:  []operand.Op{x},
10793			ISA:      []string{"SSE"},
10794		}, nil
10795	case operand.IsM128(mx) && operand.IsXMM(x):
10796		return &intrep.Instruction{
10797			Opcode:   "ORPS",
10798			Operands: []operand.Op{mx, x},
10799			Inputs:   []operand.Op{mx, x},
10800			Outputs:  []operand.Op{x},
10801			ISA:      []string{"SSE"},
10802		}, nil
10803	}
10804	return nil, errors.New("ORPS: bad operands")
10805}
10806
10807// ORQ: Logical Inclusive OR.
10808//
10809// Forms:
10810//
10811// 	ORQ imm32 rax
10812// 	ORQ imm8  r64
10813// 	ORQ imm32 r64
10814// 	ORQ r64   r64
10815// 	ORQ m64   r64
10816// 	ORQ imm8  m64
10817// 	ORQ imm32 m64
10818// 	ORQ r64   m64
10819func ORQ(imr, mr operand.Op) (*intrep.Instruction, error) {
10820	switch {
10821	case operand.IsIMM32(imr) && operand.IsRAX(mr):
10822		return &intrep.Instruction{
10823			Opcode:   "ORQ",
10824			Operands: []operand.Op{imr, mr},
10825			Inputs:   []operand.Op{mr},
10826			Outputs:  []operand.Op{mr},
10827		}, nil
10828	case operand.IsIMM8(imr) && operand.IsR64(mr):
10829		return &intrep.Instruction{
10830			Opcode:   "ORQ",
10831			Operands: []operand.Op{imr, mr},
10832			Inputs:   []operand.Op{mr},
10833			Outputs:  []operand.Op{mr},
10834		}, nil
10835	case operand.IsIMM32(imr) && operand.IsR64(mr):
10836		return &intrep.Instruction{
10837			Opcode:   "ORQ",
10838			Operands: []operand.Op{imr, mr},
10839			Inputs:   []operand.Op{mr},
10840			Outputs:  []operand.Op{mr},
10841		}, nil
10842	case operand.IsR64(imr) && operand.IsR64(mr):
10843		return &intrep.Instruction{
10844			Opcode:   "ORQ",
10845			Operands: []operand.Op{imr, mr},
10846			Inputs:   []operand.Op{imr, mr},
10847			Outputs:  []operand.Op{mr},
10848		}, nil
10849	case operand.IsM64(imr) && operand.IsR64(mr):
10850		return &intrep.Instruction{
10851			Opcode:   "ORQ",
10852			Operands: []operand.Op{imr, mr},
10853			Inputs:   []operand.Op{imr, mr},
10854			Outputs:  []operand.Op{mr},
10855		}, nil
10856	case operand.IsIMM8(imr) && operand.IsM64(mr):
10857		return &intrep.Instruction{
10858			Opcode:   "ORQ",
10859			Operands: []operand.Op{imr, mr},
10860			Inputs:   []operand.Op{mr},
10861			Outputs:  []operand.Op{mr},
10862		}, nil
10863	case operand.IsIMM32(imr) && operand.IsM64(mr):
10864		return &intrep.Instruction{
10865			Opcode:   "ORQ",
10866			Operands: []operand.Op{imr, mr},
10867			Inputs:   []operand.Op{mr},
10868			Outputs:  []operand.Op{mr},
10869		}, nil
10870	case operand.IsR64(imr) && operand.IsM64(mr):
10871		return &intrep.Instruction{
10872			Opcode:   "ORQ",
10873			Operands: []operand.Op{imr, mr},
10874			Inputs:   []operand.Op{imr, mr},
10875			Outputs:  []operand.Op{mr},
10876		}, nil
10877	}
10878	return nil, errors.New("ORQ: bad operands")
10879}
10880
10881// ORW: Logical Inclusive OR.
10882//
10883// Forms:
10884//
10885// 	ORW imm16 ax
10886// 	ORW imm8  r16
10887// 	ORW imm16 r16
10888// 	ORW r16   r16
10889// 	ORW m16   r16
10890// 	ORW imm8  m16
10891// 	ORW imm16 m16
10892// 	ORW r16   m16
10893func ORW(imr, amr operand.Op) (*intrep.Instruction, error) {
10894	switch {
10895	case operand.IsIMM16(imr) && operand.IsAX(amr):
10896		return &intrep.Instruction{
10897			Opcode:   "ORW",
10898			Operands: []operand.Op{imr, amr},
10899			Inputs:   []operand.Op{amr},
10900			Outputs:  []operand.Op{amr},
10901		}, nil
10902	case operand.IsIMM8(imr) && operand.IsR16(amr):
10903		return &intrep.Instruction{
10904			Opcode:   "ORW",
10905			Operands: []operand.Op{imr, amr},
10906			Inputs:   []operand.Op{amr},
10907			Outputs:  []operand.Op{amr},
10908		}, nil
10909	case operand.IsIMM16(imr) && operand.IsR16(amr):
10910		return &intrep.Instruction{
10911			Opcode:   "ORW",
10912			Operands: []operand.Op{imr, amr},
10913			Inputs:   []operand.Op{amr},
10914			Outputs:  []operand.Op{amr},
10915		}, nil
10916	case operand.IsR16(imr) && operand.IsR16(amr):
10917		return &intrep.Instruction{
10918			Opcode:   "ORW",
10919			Operands: []operand.Op{imr, amr},
10920			Inputs:   []operand.Op{imr, amr},
10921			Outputs:  []operand.Op{amr},
10922		}, nil
10923	case operand.IsM16(imr) && operand.IsR16(amr):
10924		return &intrep.Instruction{
10925			Opcode:   "ORW",
10926			Operands: []operand.Op{imr, amr},
10927			Inputs:   []operand.Op{imr, amr},
10928			Outputs:  []operand.Op{amr},
10929		}, nil
10930	case operand.IsIMM8(imr) && operand.IsM16(amr):
10931		return &intrep.Instruction{
10932			Opcode:   "ORW",
10933			Operands: []operand.Op{imr, amr},
10934			Inputs:   []operand.Op{amr},
10935			Outputs:  []operand.Op{amr},
10936		}, nil
10937	case operand.IsIMM16(imr) && operand.IsM16(amr):
10938		return &intrep.Instruction{
10939			Opcode:   "ORW",
10940			Operands: []operand.Op{imr, amr},
10941			Inputs:   []operand.Op{amr},
10942			Outputs:  []operand.Op{amr},
10943		}, nil
10944	case operand.IsR16(imr) && operand.IsM16(amr):
10945		return &intrep.Instruction{
10946			Opcode:   "ORW",
10947			Operands: []operand.Op{imr, amr},
10948			Inputs:   []operand.Op{imr, amr},
10949			Outputs:  []operand.Op{amr},
10950		}, nil
10951	}
10952	return nil, errors.New("ORW: bad operands")
10953}
10954
10955// PABSB: Packed Absolute Value of Byte Integers.
10956//
10957// Forms:
10958//
10959// 	PABSB xmm  xmm
10960// 	PABSB m128 xmm
10961func PABSB(mx, x operand.Op) (*intrep.Instruction, error) {
10962	switch {
10963	case operand.IsXMM(mx) && operand.IsXMM(x):
10964		return &intrep.Instruction{
10965			Opcode:   "PABSB",
10966			Operands: []operand.Op{mx, x},
10967			Inputs:   []operand.Op{mx},
10968			Outputs:  []operand.Op{x},
10969			ISA:      []string{"SSSE3"},
10970		}, nil
10971	case operand.IsM128(mx) && operand.IsXMM(x):
10972		return &intrep.Instruction{
10973			Opcode:   "PABSB",
10974			Operands: []operand.Op{mx, x},
10975			Inputs:   []operand.Op{mx},
10976			Outputs:  []operand.Op{x},
10977			ISA:      []string{"SSSE3"},
10978		}, nil
10979	}
10980	return nil, errors.New("PABSB: bad operands")
10981}
10982
10983// PABSD: Packed Absolute Value of Doubleword Integers.
10984//
10985// Forms:
10986//
10987// 	PABSD xmm  xmm
10988// 	PABSD m128 xmm
10989func PABSD(mx, x operand.Op) (*intrep.Instruction, error) {
10990	switch {
10991	case operand.IsXMM(mx) && operand.IsXMM(x):
10992		return &intrep.Instruction{
10993			Opcode:   "PABSD",
10994			Operands: []operand.Op{mx, x},
10995			Inputs:   []operand.Op{mx},
10996			Outputs:  []operand.Op{x},
10997			ISA:      []string{"SSSE3"},
10998		}, nil
10999	case operand.IsM128(mx) && operand.IsXMM(x):
11000		return &intrep.Instruction{
11001			Opcode:   "PABSD",
11002			Operands: []operand.Op{mx, x},
11003			Inputs:   []operand.Op{mx},
11004			Outputs:  []operand.Op{x},
11005			ISA:      []string{"SSSE3"},
11006		}, nil
11007	}
11008	return nil, errors.New("PABSD: bad operands")
11009}
11010
11011// PABSW: Packed Absolute Value of Word Integers.
11012//
11013// Forms:
11014//
11015// 	PABSW xmm  xmm
11016// 	PABSW m128 xmm
11017func PABSW(mx, x operand.Op) (*intrep.Instruction, error) {
11018	switch {
11019	case operand.IsXMM(mx) && operand.IsXMM(x):
11020		return &intrep.Instruction{
11021			Opcode:   "PABSW",
11022			Operands: []operand.Op{mx, x},
11023			Inputs:   []operand.Op{mx},
11024			Outputs:  []operand.Op{x},
11025			ISA:      []string{"SSSE3"},
11026		}, nil
11027	case operand.IsM128(mx) && operand.IsXMM(x):
11028		return &intrep.Instruction{
11029			Opcode:   "PABSW",
11030			Operands: []operand.Op{mx, x},
11031			Inputs:   []operand.Op{mx},
11032			Outputs:  []operand.Op{x},
11033			ISA:      []string{"SSSE3"},
11034		}, nil
11035	}
11036	return nil, errors.New("PABSW: bad operands")
11037}
11038
11039// PACKSSLW: Pack Doublewords into Words with Signed Saturation.
11040//
11041// Forms:
11042//
11043// 	PACKSSLW xmm  xmm
11044// 	PACKSSLW m128 xmm
11045func PACKSSLW(mx, x operand.Op) (*intrep.Instruction, error) {
11046	switch {
11047	case operand.IsXMM(mx) && operand.IsXMM(x):
11048		return &intrep.Instruction{
11049			Opcode:   "PACKSSLW",
11050			Operands: []operand.Op{mx, x},
11051			Inputs:   []operand.Op{mx, x},
11052			Outputs:  []operand.Op{x},
11053			ISA:      []string{"SSE2"},
11054		}, nil
11055	case operand.IsM128(mx) && operand.IsXMM(x):
11056		return &intrep.Instruction{
11057			Opcode:   "PACKSSLW",
11058			Operands: []operand.Op{mx, x},
11059			Inputs:   []operand.Op{mx, x},
11060			Outputs:  []operand.Op{x},
11061			ISA:      []string{"SSE2"},
11062		}, nil
11063	}
11064	return nil, errors.New("PACKSSLW: bad operands")
11065}
11066
11067// PACKSSWB: Pack Words into Bytes with Signed Saturation.
11068//
11069// Forms:
11070//
11071// 	PACKSSWB xmm  xmm
11072// 	PACKSSWB m128 xmm
11073func PACKSSWB(mx, x operand.Op) (*intrep.Instruction, error) {
11074	switch {
11075	case operand.IsXMM(mx) && operand.IsXMM(x):
11076		return &intrep.Instruction{
11077			Opcode:   "PACKSSWB",
11078			Operands: []operand.Op{mx, x},
11079			Inputs:   []operand.Op{mx, x},
11080			Outputs:  []operand.Op{x},
11081			ISA:      []string{"SSE2"},
11082		}, nil
11083	case operand.IsM128(mx) && operand.IsXMM(x):
11084		return &intrep.Instruction{
11085			Opcode:   "PACKSSWB",
11086			Operands: []operand.Op{mx, x},
11087			Inputs:   []operand.Op{mx, x},
11088			Outputs:  []operand.Op{x},
11089			ISA:      []string{"SSE2"},
11090		}, nil
11091	}
11092	return nil, errors.New("PACKSSWB: bad operands")
11093}
11094
11095// PACKUSDW: Pack Doublewords into Words with Unsigned Saturation.
11096//
11097// Forms:
11098//
11099// 	PACKUSDW xmm  xmm
11100// 	PACKUSDW m128 xmm
11101func PACKUSDW(mx, x operand.Op) (*intrep.Instruction, error) {
11102	switch {
11103	case operand.IsXMM(mx) && operand.IsXMM(x):
11104		return &intrep.Instruction{
11105			Opcode:   "PACKUSDW",
11106			Operands: []operand.Op{mx, x},
11107			Inputs:   []operand.Op{mx, x},
11108			Outputs:  []operand.Op{x},
11109			ISA:      []string{"SSE4.1"},
11110		}, nil
11111	case operand.IsM128(mx) && operand.IsXMM(x):
11112		return &intrep.Instruction{
11113			Opcode:   "PACKUSDW",
11114			Operands: []operand.Op{mx, x},
11115			Inputs:   []operand.Op{mx, x},
11116			Outputs:  []operand.Op{x},
11117			ISA:      []string{"SSE4.1"},
11118		}, nil
11119	}
11120	return nil, errors.New("PACKUSDW: bad operands")
11121}
11122
11123// PACKUSWB: Pack Words into Bytes with Unsigned Saturation.
11124//
11125// Forms:
11126//
11127// 	PACKUSWB xmm  xmm
11128// 	PACKUSWB m128 xmm
11129func PACKUSWB(mx, x operand.Op) (*intrep.Instruction, error) {
11130	switch {
11131	case operand.IsXMM(mx) && operand.IsXMM(x):
11132		return &intrep.Instruction{
11133			Opcode:   "PACKUSWB",
11134			Operands: []operand.Op{mx, x},
11135			Inputs:   []operand.Op{mx, x},
11136			Outputs:  []operand.Op{x},
11137			ISA:      []string{"SSE2"},
11138		}, nil
11139	case operand.IsM128(mx) && operand.IsXMM(x):
11140		return &intrep.Instruction{
11141			Opcode:   "PACKUSWB",
11142			Operands: []operand.Op{mx, x},
11143			Inputs:   []operand.Op{mx, x},
11144			Outputs:  []operand.Op{x},
11145			ISA:      []string{"SSE2"},
11146		}, nil
11147	}
11148	return nil, errors.New("PACKUSWB: bad operands")
11149}
11150
11151// PADDB: Add Packed Byte Integers.
11152//
11153// Forms:
11154//
11155// 	PADDB xmm  xmm
11156// 	PADDB m128 xmm
11157func PADDB(mx, x operand.Op) (*intrep.Instruction, error) {
11158	switch {
11159	case operand.IsXMM(mx) && operand.IsXMM(x):
11160		return &intrep.Instruction{
11161			Opcode:   "PADDB",
11162			Operands: []operand.Op{mx, x},
11163			Inputs:   []operand.Op{mx, x},
11164			Outputs:  []operand.Op{x},
11165			ISA:      []string{"SSE2"},
11166		}, nil
11167	case operand.IsM128(mx) && operand.IsXMM(x):
11168		return &intrep.Instruction{
11169			Opcode:   "PADDB",
11170			Operands: []operand.Op{mx, x},
11171			Inputs:   []operand.Op{mx, x},
11172			Outputs:  []operand.Op{x},
11173			ISA:      []string{"SSE2"},
11174		}, nil
11175	}
11176	return nil, errors.New("PADDB: bad operands")
11177}
11178
11179// PADDD: Add Packed Doubleword Integers.
11180//
11181// Forms:
11182//
11183// 	PADDD xmm  xmm
11184// 	PADDD m128 xmm
11185func PADDD(mx, x operand.Op) (*intrep.Instruction, error) {
11186	switch {
11187	case operand.IsXMM(mx) && operand.IsXMM(x):
11188		return &intrep.Instruction{
11189			Opcode:   "PADDD",
11190			Operands: []operand.Op{mx, x},
11191			Inputs:   []operand.Op{mx, x},
11192			Outputs:  []operand.Op{x},
11193			ISA:      []string{"SSE2"},
11194		}, nil
11195	case operand.IsM128(mx) && operand.IsXMM(x):
11196		return &intrep.Instruction{
11197			Opcode:   "PADDD",
11198			Operands: []operand.Op{mx, x},
11199			Inputs:   []operand.Op{mx, x},
11200			Outputs:  []operand.Op{x},
11201			ISA:      []string{"SSE2"},
11202		}, nil
11203	}
11204	return nil, errors.New("PADDD: bad operands")
11205}
11206
11207// PADDL: Add Packed Doubleword Integers.
11208//
11209// Forms:
11210//
11211// 	PADDL xmm  xmm
11212// 	PADDL m128 xmm
11213func PADDL(mx, x operand.Op) (*intrep.Instruction, error) {
11214	switch {
11215	case operand.IsXMM(mx) && operand.IsXMM(x):
11216		return &intrep.Instruction{
11217			Opcode:   "PADDL",
11218			Operands: []operand.Op{mx, x},
11219			Inputs:   []operand.Op{mx, x},
11220			Outputs:  []operand.Op{x},
11221			ISA:      []string{"SSE2"},
11222		}, nil
11223	case operand.IsM128(mx) && operand.IsXMM(x):
11224		return &intrep.Instruction{
11225			Opcode:   "PADDL",
11226			Operands: []operand.Op{mx, x},
11227			Inputs:   []operand.Op{mx, x},
11228			Outputs:  []operand.Op{x},
11229			ISA:      []string{"SSE2"},
11230		}, nil
11231	}
11232	return nil, errors.New("PADDL: bad operands")
11233}
11234
11235// PADDQ: Add Packed Quadword Integers.
11236//
11237// Forms:
11238//
11239// 	PADDQ xmm  xmm
11240// 	PADDQ m128 xmm
11241func PADDQ(mx, x operand.Op) (*intrep.Instruction, error) {
11242	switch {
11243	case operand.IsXMM(mx) && operand.IsXMM(x):
11244		return &intrep.Instruction{
11245			Opcode:   "PADDQ",
11246			Operands: []operand.Op{mx, x},
11247			Inputs:   []operand.Op{mx, x},
11248			Outputs:  []operand.Op{x},
11249			ISA:      []string{"SSE2"},
11250		}, nil
11251	case operand.IsM128(mx) && operand.IsXMM(x):
11252		return &intrep.Instruction{
11253			Opcode:   "PADDQ",
11254			Operands: []operand.Op{mx, x},
11255			Inputs:   []operand.Op{mx, x},
11256			Outputs:  []operand.Op{x},
11257			ISA:      []string{"SSE2"},
11258		}, nil
11259	}
11260	return nil, errors.New("PADDQ: bad operands")
11261}
11262
11263// PADDSB: Add Packed Signed Byte Integers with Signed Saturation.
11264//
11265// Forms:
11266//
11267// 	PADDSB xmm  xmm
11268// 	PADDSB m128 xmm
11269func PADDSB(mx, x operand.Op) (*intrep.Instruction, error) {
11270	switch {
11271	case operand.IsXMM(mx) && operand.IsXMM(x):
11272		return &intrep.Instruction{
11273			Opcode:   "PADDSB",
11274			Operands: []operand.Op{mx, x},
11275			Inputs:   []operand.Op{mx, x},
11276			Outputs:  []operand.Op{x},
11277			ISA:      []string{"SSE2"},
11278		}, nil
11279	case operand.IsM128(mx) && operand.IsXMM(x):
11280		return &intrep.Instruction{
11281			Opcode:   "PADDSB",
11282			Operands: []operand.Op{mx, x},
11283			Inputs:   []operand.Op{mx, x},
11284			Outputs:  []operand.Op{x},
11285			ISA:      []string{"SSE2"},
11286		}, nil
11287	}
11288	return nil, errors.New("PADDSB: bad operands")
11289}
11290
11291// PADDSW: Add Packed Signed Word Integers with Signed Saturation.
11292//
11293// Forms:
11294//
11295// 	PADDSW xmm  xmm
11296// 	PADDSW m128 xmm
11297func PADDSW(mx, x operand.Op) (*intrep.Instruction, error) {
11298	switch {
11299	case operand.IsXMM(mx) && operand.IsXMM(x):
11300		return &intrep.Instruction{
11301			Opcode:   "PADDSW",
11302			Operands: []operand.Op{mx, x},
11303			Inputs:   []operand.Op{mx, x},
11304			Outputs:  []operand.Op{x},
11305			ISA:      []string{"SSE2"},
11306		}, nil
11307	case operand.IsM128(mx) && operand.IsXMM(x):
11308		return &intrep.Instruction{
11309			Opcode:   "PADDSW",
11310			Operands: []operand.Op{mx, x},
11311			Inputs:   []operand.Op{mx, x},
11312			Outputs:  []operand.Op{x},
11313			ISA:      []string{"SSE2"},
11314		}, nil
11315	}
11316	return nil, errors.New("PADDSW: bad operands")
11317}
11318
11319// PADDUSB: Add Packed Unsigned Byte Integers with Unsigned Saturation.
11320//
11321// Forms:
11322//
11323// 	PADDUSB xmm  xmm
11324// 	PADDUSB m128 xmm
11325func PADDUSB(mx, x operand.Op) (*intrep.Instruction, error) {
11326	switch {
11327	case operand.IsXMM(mx) && operand.IsXMM(x):
11328		return &intrep.Instruction{
11329			Opcode:   "PADDUSB",
11330			Operands: []operand.Op{mx, x},
11331			Inputs:   []operand.Op{mx, x},
11332			Outputs:  []operand.Op{x},
11333			ISA:      []string{"SSE2"},
11334		}, nil
11335	case operand.IsM128(mx) && operand.IsXMM(x):
11336		return &intrep.Instruction{
11337			Opcode:   "PADDUSB",
11338			Operands: []operand.Op{mx, x},
11339			Inputs:   []operand.Op{mx, x},
11340			Outputs:  []operand.Op{x},
11341			ISA:      []string{"SSE2"},
11342		}, nil
11343	}
11344	return nil, errors.New("PADDUSB: bad operands")
11345}
11346
11347// PADDUSW: Add Packed Unsigned Word Integers with Unsigned Saturation.
11348//
11349// Forms:
11350//
11351// 	PADDUSW xmm  xmm
11352// 	PADDUSW m128 xmm
11353func PADDUSW(mx, x operand.Op) (*intrep.Instruction, error) {
11354	switch {
11355	case operand.IsXMM(mx) && operand.IsXMM(x):
11356		return &intrep.Instruction{
11357			Opcode:   "PADDUSW",
11358			Operands: []operand.Op{mx, x},
11359			Inputs:   []operand.Op{mx, x},
11360			Outputs:  []operand.Op{x},
11361			ISA:      []string{"SSE2"},
11362		}, nil
11363	case operand.IsM128(mx) && operand.IsXMM(x):
11364		return &intrep.Instruction{
11365			Opcode:   "PADDUSW",
11366			Operands: []operand.Op{mx, x},
11367			Inputs:   []operand.Op{mx, x},
11368			Outputs:  []operand.Op{x},
11369			ISA:      []string{"SSE2"},
11370		}, nil
11371	}
11372	return nil, errors.New("PADDUSW: bad operands")
11373}
11374
11375// PADDW: Add Packed Word Integers.
11376//
11377// Forms:
11378//
11379// 	PADDW xmm  xmm
11380// 	PADDW m128 xmm
11381func PADDW(mx, x operand.Op) (*intrep.Instruction, error) {
11382	switch {
11383	case operand.IsXMM(mx) && operand.IsXMM(x):
11384		return &intrep.Instruction{
11385			Opcode:   "PADDW",
11386			Operands: []operand.Op{mx, x},
11387			Inputs:   []operand.Op{mx, x},
11388			Outputs:  []operand.Op{x},
11389			ISA:      []string{"SSE2"},
11390		}, nil
11391	case operand.IsM128(mx) && operand.IsXMM(x):
11392		return &intrep.Instruction{
11393			Opcode:   "PADDW",
11394			Operands: []operand.Op{mx, x},
11395			Inputs:   []operand.Op{mx, x},
11396			Outputs:  []operand.Op{x},
11397			ISA:      []string{"SSE2"},
11398		}, nil
11399	}
11400	return nil, errors.New("PADDW: bad operands")
11401}
11402
11403// PALIGNR: Packed Align Right.
11404//
11405// Forms:
11406//
11407// 	PALIGNR imm8 xmm  xmm
11408// 	PALIGNR imm8 m128 xmm
11409func PALIGNR(i, mx, x operand.Op) (*intrep.Instruction, error) {
11410	switch {
11411	case operand.IsIMM8(i) && operand.IsXMM(mx) && operand.IsXMM(x):
11412		return &intrep.Instruction{
11413			Opcode:   "PALIGNR",
11414			Operands: []operand.Op{i, mx, x},
11415			Inputs:   []operand.Op{mx, x},
11416			Outputs:  []operand.Op{x},
11417			ISA:      []string{"SSSE3"},
11418		}, nil
11419	case operand.IsIMM8(i) && operand.IsM128(mx) && operand.IsXMM(x):
11420		return &intrep.Instruction{
11421			Opcode:   "PALIGNR",
11422			Operands: []operand.Op{i, mx, x},
11423			Inputs:   []operand.Op{mx, x},
11424			Outputs:  []operand.Op{x},
11425			ISA:      []string{"SSSE3"},
11426		}, nil
11427	}
11428	return nil, errors.New("PALIGNR: bad operands")
11429}
11430
11431// PAND: Packed Bitwise Logical AND.
11432//
11433// Forms:
11434//
11435// 	PAND xmm  xmm
11436// 	PAND m128 xmm
11437func PAND(mx, x operand.Op) (*intrep.Instruction, error) {
11438	switch {
11439	case operand.IsXMM(mx) && operand.IsXMM(x):
11440		return &intrep.Instruction{
11441			Opcode:   "PAND",
11442			Operands: []operand.Op{mx, x},
11443			Inputs:   []operand.Op{mx, x},
11444			Outputs:  []operand.Op{x},
11445			ISA:      []string{"SSE2"},
11446		}, nil
11447	case operand.IsM128(mx) && operand.IsXMM(x):
11448		return &intrep.Instruction{
11449			Opcode:   "PAND",
11450			Operands: []operand.Op{mx, x},
11451			Inputs:   []operand.Op{mx, x},
11452			Outputs:  []operand.Op{x},
11453			ISA:      []string{"SSE2"},
11454		}, nil
11455	}
11456	return nil, errors.New("PAND: bad operands")
11457}
11458
11459// PANDN: Packed Bitwise Logical AND NOT.
11460//
11461// Forms:
11462//
11463// 	PANDN xmm  xmm
11464// 	PANDN m128 xmm
11465func PANDN(mx, x operand.Op) (*intrep.Instruction, error) {
11466	switch {
11467	case operand.IsXMM(mx) && operand.IsXMM(x):
11468		return &intrep.Instruction{
11469			Opcode:           "PANDN",
11470			Operands:         []operand.Op{mx, x},
11471			Inputs:           []operand.Op{mx, x},
11472			Outputs:          []operand.Op{x},
11473			ISA:              []string{"SSE2"},
11474			CancellingInputs: true,
11475		}, nil
11476	case operand.IsM128(mx) && operand.IsXMM(x):
11477		return &intrep.Instruction{
11478			Opcode:   "PANDN",
11479			Operands: []operand.Op{mx, x},
11480			Inputs:   []operand.Op{mx, x},
11481			Outputs:  []operand.Op{x},
11482			ISA:      []string{"SSE2"},
11483		}, nil
11484	}
11485	return nil, errors.New("PANDN: bad operands")
11486}
11487
11488// PAUSE: Spin Loop Hint.
11489//
11490// Forms:
11491//
11492// 	PAUSE
11493func PAUSE() (*intrep.Instruction, error) {
11494	return &intrep.Instruction{
11495		Opcode:   "PAUSE",
11496		Operands: nil,
11497		Inputs:   []operand.Op{},
11498		Outputs:  []operand.Op{},
11499	}, nil
11500}
11501
11502// PAVGB: Average Packed Byte Integers.
11503//
11504// Forms:
11505//
11506// 	PAVGB xmm  xmm
11507// 	PAVGB m128 xmm
11508func PAVGB(mx, x operand.Op) (*intrep.Instruction, error) {
11509	switch {
11510	case operand.IsXMM(mx) && operand.IsXMM(x):
11511		return &intrep.Instruction{
11512			Opcode:   "PAVGB",
11513			Operands: []operand.Op{mx, x},
11514			Inputs:   []operand.Op{mx, x},
11515			Outputs:  []operand.Op{x},
11516			ISA:      []string{"SSE2"},
11517		}, nil
11518	case operand.IsM128(mx) && operand.IsXMM(x):
11519		return &intrep.Instruction{
11520			Opcode:   "PAVGB",
11521			Operands: []operand.Op{mx, x},
11522			Inputs:   []operand.Op{mx, x},
11523			Outputs:  []operand.Op{x},
11524			ISA:      []string{"SSE2"},
11525		}, nil
11526	}
11527	return nil, errors.New("PAVGB: bad operands")
11528}
11529
11530// PAVGW: Average Packed Word Integers.
11531//
11532// Forms:
11533//
11534// 	PAVGW xmm  xmm
11535// 	PAVGW m128 xmm
11536func PAVGW(mx, x operand.Op) (*intrep.Instruction, error) {
11537	switch {
11538	case operand.IsXMM(mx) && operand.IsXMM(x):
11539		return &intrep.Instruction{
11540			Opcode:   "PAVGW",
11541			Operands: []operand.Op{mx, x},
11542			Inputs:   []operand.Op{mx, x},
11543			Outputs:  []operand.Op{x},
11544			ISA:      []string{"SSE2"},
11545		}, nil
11546	case operand.IsM128(mx) && operand.IsXMM(x):
11547		return &intrep.Instruction{
11548			Opcode:   "PAVGW",
11549			Operands: []operand.Op{mx, x},
11550			Inputs:   []operand.Op{mx, x},
11551			Outputs:  []operand.Op{x},
11552			ISA:      []string{"SSE2"},
11553		}, nil
11554	}
11555	return nil, errors.New("PAVGW: bad operands")
11556}
11557
11558// PBLENDVB: Variable Blend Packed Bytes.
11559//
11560// Forms:
11561//
11562// 	PBLENDVB xmm0 xmm  xmm
11563// 	PBLENDVB xmm0 m128 xmm
11564func PBLENDVB(x, mx, x1 operand.Op) (*intrep.Instruction, error) {
11565	switch {
11566	case operand.IsXMM0(x) && operand.IsXMM(mx) && operand.IsXMM(x1):
11567		return &intrep.Instruction{
11568			Opcode:   "PBLENDVB",
11569			Operands: []operand.Op{x, mx, x1},
11570			Inputs:   []operand.Op{x, mx, x1},
11571			Outputs:  []operand.Op{x1},
11572			ISA:      []string{"SSE4.1"},
11573		}, nil
11574	case operand.IsXMM0(x) && operand.IsM128(mx) && operand.IsXMM(x1):
11575		return &intrep.Instruction{
11576			Opcode:   "PBLENDVB",
11577			Operands: []operand.Op{x, mx, x1},
11578			Inputs:   []operand.Op{x, mx, x1},
11579			Outputs:  []operand.Op{x1},
11580			ISA:      []string{"SSE4.1"},
11581		}, nil
11582	}
11583	return nil, errors.New("PBLENDVB: bad operands")
11584}
11585
11586// PBLENDW: Blend Packed Words.
11587//
11588// Forms:
11589//
11590// 	PBLENDW imm8 xmm  xmm
11591// 	PBLENDW imm8 m128 xmm
11592func PBLENDW(i, mx, x operand.Op) (*intrep.Instruction, error) {
11593	switch {
11594	case operand.IsIMM8(i) && operand.IsXMM(mx) && operand.IsXMM(x):
11595		return &intrep.Instruction{
11596			Opcode:   "PBLENDW",
11597			Operands: []operand.Op{i, mx, x},
11598			Inputs:   []operand.Op{mx, x},
11599			Outputs:  []operand.Op{x},
11600			ISA:      []string{"SSE4.1"},
11601		}, nil
11602	case operand.IsIMM8(i) && operand.IsM128(mx) && operand.IsXMM(x):
11603		return &intrep.Instruction{
11604			Opcode:   "PBLENDW",
11605			Operands: []operand.Op{i, mx, x},
11606			Inputs:   []operand.Op{mx, x},
11607			Outputs:  []operand.Op{x},
11608			ISA:      []string{"SSE4.1"},
11609		}, nil
11610	}
11611	return nil, errors.New("PBLENDW: bad operands")
11612}
11613
11614// PCLMULQDQ: Carry-Less Quadword Multiplication.
11615//
11616// Forms:
11617//
11618// 	PCLMULQDQ imm8 xmm  xmm
11619// 	PCLMULQDQ imm8 m128 xmm
11620func PCLMULQDQ(i, mx, x operand.Op) (*intrep.Instruction, error) {
11621	switch {
11622	case operand.IsIMM8(i) && operand.IsXMM(mx) && operand.IsXMM(x):
11623		return &intrep.Instruction{
11624			Opcode:   "PCLMULQDQ",
11625			Operands: []operand.Op{i, mx, x},
11626			Inputs:   []operand.Op{mx, x},
11627			Outputs:  []operand.Op{x},
11628			ISA:      []string{"PCLMULQDQ"},
11629		}, nil
11630	case operand.IsIMM8(i) && operand.IsM128(mx) && operand.IsXMM(x):
11631		return &intrep.Instruction{
11632			Opcode:   "PCLMULQDQ",
11633			Operands: []operand.Op{i, mx, x},
11634			Inputs:   []operand.Op{mx, x},
11635			Outputs:  []operand.Op{x},
11636			ISA:      []string{"PCLMULQDQ"},
11637		}, nil
11638	}
11639	return nil, errors.New("PCLMULQDQ: bad operands")
11640}
11641
11642// PCMPEQB: Compare Packed Byte Data for Equality.
11643//
11644// Forms:
11645//
11646// 	PCMPEQB xmm  xmm
11647// 	PCMPEQB m128 xmm
11648func PCMPEQB(mx, x operand.Op) (*intrep.Instruction, error) {
11649	switch {
11650	case operand.IsXMM(mx) && operand.IsXMM(x):
11651		return &intrep.Instruction{
11652			Opcode:           "PCMPEQB",
11653			Operands:         []operand.Op{mx, x},
11654			Inputs:           []operand.Op{mx, x},
11655			Outputs:          []operand.Op{x},
11656			ISA:              []string{"SSE2"},
11657			CancellingInputs: true,
11658		}, nil
11659	case operand.IsM128(mx) && operand.IsXMM(x):
11660		return &intrep.Instruction{
11661			Opcode:   "PCMPEQB",
11662			Operands: []operand.Op{mx, x},
11663			Inputs:   []operand.Op{mx, x},
11664			Outputs:  []operand.Op{x},
11665			ISA:      []string{"SSE2"},
11666		}, nil
11667	}
11668	return nil, errors.New("PCMPEQB: bad operands")
11669}
11670
11671// PCMPEQL: Compare Packed Doubleword Data for Equality.
11672//
11673// Forms:
11674//
11675// 	PCMPEQL xmm  xmm
11676// 	PCMPEQL m128 xmm
11677func PCMPEQL(mx, x operand.Op) (*intrep.Instruction, error) {
11678	switch {
11679	case operand.IsXMM(mx) && operand.IsXMM(x):
11680		return &intrep.Instruction{
11681			Opcode:           "PCMPEQL",
11682			Operands:         []operand.Op{mx, x},
11683			Inputs:           []operand.Op{mx, x},
11684			Outputs:          []operand.Op{x},
11685			ISA:              []string{"SSE2"},
11686			CancellingInputs: true,
11687		}, nil
11688	case operand.IsM128(mx) && operand.IsXMM(x):
11689		return &intrep.Instruction{
11690			Opcode:   "PCMPEQL",
11691			Operands: []operand.Op{mx, x},
11692			Inputs:   []operand.Op{mx, x},
11693			Outputs:  []operand.Op{x},
11694			ISA:      []string{"SSE2"},
11695		}, nil
11696	}
11697	return nil, errors.New("PCMPEQL: bad operands")
11698}
11699
11700// PCMPEQQ: Compare Packed Quadword Data for Equality.
11701//
11702// Forms:
11703//
11704// 	PCMPEQQ xmm  xmm
11705// 	PCMPEQQ m128 xmm
11706func PCMPEQQ(mx, x operand.Op) (*intrep.Instruction, error) {
11707	switch {
11708	case operand.IsXMM(mx) && operand.IsXMM(x):
11709		return &intrep.Instruction{
11710			Opcode:           "PCMPEQQ",
11711			Operands:         []operand.Op{mx, x},
11712			Inputs:           []operand.Op{mx, x},
11713			Outputs:          []operand.Op{x},
11714			ISA:              []string{"SSE4.1"},
11715			CancellingInputs: true,
11716		}, nil
11717	case operand.IsM128(mx) && operand.IsXMM(x):
11718		return &intrep.Instruction{
11719			Opcode:   "PCMPEQQ",
11720			Operands: []operand.Op{mx, x},
11721			Inputs:   []operand.Op{mx, x},
11722			Outputs:  []operand.Op{x},
11723			ISA:      []string{"SSE4.1"},
11724		}, nil
11725	}
11726	return nil, errors.New("PCMPEQQ: bad operands")
11727}
11728
11729// PCMPEQW: Compare Packed Word Data for Equality.
11730//
11731// Forms:
11732//
11733// 	PCMPEQW xmm  xmm
11734// 	PCMPEQW m128 xmm
11735func PCMPEQW(mx, x operand.Op) (*intrep.Instruction, error) {
11736	switch {
11737	case operand.IsXMM(mx) && operand.IsXMM(x):
11738		return &intrep.Instruction{
11739			Opcode:           "PCMPEQW",
11740			Operands:         []operand.Op{mx, x},
11741			Inputs:           []operand.Op{mx, x},
11742			Outputs:          []operand.Op{x},
11743			ISA:              []string{"SSE2"},
11744			CancellingInputs: true,
11745		}, nil
11746	case operand.IsM128(mx) && operand.IsXMM(x):
11747		return &intrep.Instruction{
11748			Opcode:   "PCMPEQW",
11749			Operands: []operand.Op{mx, x},
11750			Inputs:   []operand.Op{mx, x},
11751			Outputs:  []operand.Op{x},
11752			ISA:      []string{"SSE2"},
11753		}, nil
11754	}
11755	return nil, errors.New("PCMPEQW: bad operands")
11756}
11757
11758// PCMPESTRI: Packed Compare Explicit Length Strings, Return Index.
11759//
11760// Forms:
11761//
11762// 	PCMPESTRI imm8 xmm  xmm
11763// 	PCMPESTRI imm8 m128 xmm
11764func PCMPESTRI(i, mx, x operand.Op) (*intrep.Instruction, error) {
11765	switch {
11766	case operand.IsIMM8(i) && operand.IsXMM(mx) && operand.IsXMM(x):
11767		return &intrep.Instruction{
11768			Opcode:   "PCMPESTRI",
11769			Operands: []operand.Op{i, mx, x},
11770			Inputs:   []operand.Op{mx, x, reg.EAX, reg.EDX},
11771			Outputs:  []operand.Op{reg.ECX},
11772			ISA:      []string{"SSE4.2"},
11773		}, nil
11774	case operand.IsIMM8(i) && operand.IsM128(mx) && operand.IsXMM(x):
11775		return &intrep.Instruction{
11776			Opcode:   "PCMPESTRI",
11777			Operands: []operand.Op{i, mx, x},
11778			Inputs:   []operand.Op{mx, x, reg.EAX, reg.EDX},
11779			Outputs:  []operand.Op{reg.ECX},
11780			ISA:      []string{"SSE4.2"},
11781		}, nil
11782	}
11783	return nil, errors.New("PCMPESTRI: bad operands")
11784}
11785
11786// PCMPESTRM: Packed Compare Explicit Length Strings, Return Mask.
11787//
11788// Forms:
11789//
11790// 	PCMPESTRM imm8 xmm  xmm
11791// 	PCMPESTRM imm8 m128 xmm
11792func PCMPESTRM(i, mx, x operand.Op) (*intrep.Instruction, error) {
11793	switch {
11794	case operand.IsIMM8(i) && operand.IsXMM(mx) && operand.IsXMM(x):
11795		return &intrep.Instruction{
11796			Opcode:   "PCMPESTRM",
11797			Operands: []operand.Op{i, mx, x},
11798			Inputs:   []operand.Op{mx, x, reg.EAX, reg.EDX},
11799			Outputs:  []operand.Op{reg.X0},
11800			ISA:      []string{"SSE4.2"},
11801		}, nil
11802	case operand.IsIMM8(i) && operand.IsM128(mx) && operand.IsXMM(x):
11803		return &intrep.Instruction{
11804			Opcode:   "PCMPESTRM",
11805			Operands: []operand.Op{i, mx, x},
11806			Inputs:   []operand.Op{mx, x, reg.EAX, reg.EDX},
11807			Outputs:  []operand.Op{reg.X0},
11808			ISA:      []string{"SSE4.2"},
11809		}, nil
11810	}
11811	return nil, errors.New("PCMPESTRM: bad operands")
11812}
11813
11814// PCMPGTB: Compare Packed Signed Byte Integers for Greater Than.
11815//
11816// Forms:
11817//
11818// 	PCMPGTB xmm  xmm
11819// 	PCMPGTB m128 xmm
11820func PCMPGTB(mx, x operand.Op) (*intrep.Instruction, error) {
11821	switch {
11822	case operand.IsXMM(mx) && operand.IsXMM(x):
11823		return &intrep.Instruction{
11824			Opcode:           "PCMPGTB",
11825			Operands:         []operand.Op{mx, x},
11826			Inputs:           []operand.Op{mx, x},
11827			Outputs:          []operand.Op{x},
11828			ISA:              []string{"SSE2"},
11829			CancellingInputs: true,
11830		}, nil
11831	case operand.IsM128(mx) && operand.IsXMM(x):
11832		return &intrep.Instruction{
11833			Opcode:   "PCMPGTB",
11834			Operands: []operand.Op{mx, x},
11835			Inputs:   []operand.Op{mx, x},
11836			Outputs:  []operand.Op{x},
11837			ISA:      []string{"SSE2"},
11838		}, nil
11839	}
11840	return nil, errors.New("PCMPGTB: bad operands")
11841}
11842
11843// PCMPGTL: Compare Packed Signed Doubleword Integers for Greater Than.
11844//
11845// Forms:
11846//
11847// 	PCMPGTL xmm  xmm
11848// 	PCMPGTL m128 xmm
11849func PCMPGTL(mx, x operand.Op) (*intrep.Instruction, error) {
11850	switch {
11851	case operand.IsXMM(mx) && operand.IsXMM(x):
11852		return &intrep.Instruction{
11853			Opcode:           "PCMPGTL",
11854			Operands:         []operand.Op{mx, x},
11855			Inputs:           []operand.Op{mx, x},
11856			Outputs:          []operand.Op{x},
11857			ISA:              []string{"SSE2"},
11858			CancellingInputs: true,
11859		}, nil
11860	case operand.IsM128(mx) && operand.IsXMM(x):
11861		return &intrep.Instruction{
11862			Opcode:   "PCMPGTL",
11863			Operands: []operand.Op{mx, x},
11864			Inputs:   []operand.Op{mx, x},
11865			Outputs:  []operand.Op{x},
11866			ISA:      []string{"SSE2"},
11867		}, nil
11868	}
11869	return nil, errors.New("PCMPGTL: bad operands")
11870}
11871
11872// PCMPGTQ: Compare Packed Data for Greater Than.
11873//
11874// Forms:
11875//
11876// 	PCMPGTQ xmm  xmm
11877// 	PCMPGTQ m128 xmm
11878func PCMPGTQ(mx, x operand.Op) (*intrep.Instruction, error) {
11879	switch {
11880	case operand.IsXMM(mx) && operand.IsXMM(x):
11881		return &intrep.Instruction{
11882			Opcode:           "PCMPGTQ",
11883			Operands:         []operand.Op{mx, x},
11884			Inputs:           []operand.Op{mx, x},
11885			Outputs:          []operand.Op{x},
11886			ISA:              []string{"SSE4.2"},
11887			CancellingInputs: true,
11888		}, nil
11889	case operand.IsM128(mx) && operand.IsXMM(x):
11890		return &intrep.Instruction{
11891			Opcode:   "PCMPGTQ",
11892			Operands: []operand.Op{mx, x},
11893			Inputs:   []operand.Op{mx, x},
11894			Outputs:  []operand.Op{x},
11895			ISA:      []string{"SSE4.2"},
11896		}, nil
11897	}
11898	return nil, errors.New("PCMPGTQ: bad operands")
11899}
11900
11901// PCMPGTW: Compare Packed Signed Word Integers for Greater Than.
11902//
11903// Forms:
11904//
11905// 	PCMPGTW xmm  xmm
11906// 	PCMPGTW m128 xmm
11907func PCMPGTW(mx, x operand.Op) (*intrep.Instruction, error) {
11908	switch {
11909	case operand.IsXMM(mx) && operand.IsXMM(x):
11910		return &intrep.Instruction{
11911			Opcode:           "PCMPGTW",
11912			Operands:         []operand.Op{mx, x},
11913			Inputs:           []operand.Op{mx, x},
11914			Outputs:          []operand.Op{x},
11915			ISA:              []string{"SSE2"},
11916			CancellingInputs: true,
11917		}, nil
11918	case operand.IsM128(mx) && operand.IsXMM(x):
11919		return &intrep.Instruction{
11920			Opcode:   "PCMPGTW",
11921			Operands: []operand.Op{mx, x},
11922			Inputs:   []operand.Op{mx, x},
11923			Outputs:  []operand.Op{x},
11924			ISA:      []string{"SSE2"},
11925		}, nil
11926	}
11927	return nil, errors.New("PCMPGTW: bad operands")
11928}
11929
11930// PCMPISTRI: Packed Compare Implicit Length Strings, Return Index.
11931//
11932// Forms:
11933//
11934// 	PCMPISTRI imm8 xmm  xmm
11935// 	PCMPISTRI imm8 m128 xmm
11936func PCMPISTRI(i, mx, x operand.Op) (*intrep.Instruction, error) {
11937	switch {
11938	case operand.IsIMM8(i) && operand.IsXMM(mx) && operand.IsXMM(x):
11939		return &intrep.Instruction{
11940			Opcode:   "PCMPISTRI",
11941			Operands: []operand.Op{i, mx, x},
11942			Inputs:   []operand.Op{mx, x},
11943			Outputs:  []operand.Op{reg.ECX},
11944			ISA:      []string{"SSE4.2"},
11945		}, nil
11946	case operand.IsIMM8(i) && operand.IsM128(mx) && operand.IsXMM(x):
11947		return &intrep.Instruction{
11948			Opcode:   "PCMPISTRI",
11949			Operands: []operand.Op{i, mx, x},
11950			Inputs:   []operand.Op{mx, x},
11951			Outputs:  []operand.Op{reg.ECX},
11952			ISA:      []string{"SSE4.2"},
11953		}, nil
11954	}
11955	return nil, errors.New("PCMPISTRI: bad operands")
11956}
11957
11958// PCMPISTRM: Packed Compare Implicit Length Strings, Return Mask.
11959//
11960// Forms:
11961//
11962// 	PCMPISTRM imm8 xmm  xmm
11963// 	PCMPISTRM imm8 m128 xmm
11964func PCMPISTRM(i, mx, x operand.Op) (*intrep.Instruction, error) {
11965	switch {
11966	case operand.IsIMM8(i) && operand.IsXMM(mx) && operand.IsXMM(x):
11967		return &intrep.Instruction{
11968			Opcode:   "PCMPISTRM",
11969			Operands: []operand.Op{i, mx, x},
11970			Inputs:   []operand.Op{mx, x},
11971			Outputs:  []operand.Op{reg.X0},
11972			ISA:      []string{"SSE4.2"},
11973		}, nil
11974	case operand.IsIMM8(i) && operand.IsM128(mx) && operand.IsXMM(x):
11975		return &intrep.Instruction{
11976			Opcode:   "PCMPISTRM",
11977			Operands: []operand.Op{i, mx, x},
11978			Inputs:   []operand.Op{mx, x},
11979			Outputs:  []operand.Op{reg.X0},
11980			ISA:      []string{"SSE4.2"},
11981		}, nil
11982	}
11983	return nil, errors.New("PCMPISTRM: bad operands")
11984}
11985
11986// PDEPL: Parallel Bits Deposit.
11987//
11988// Forms:
11989//
11990// 	PDEPL r32 r32 r32
11991// 	PDEPL m32 r32 r32
11992func PDEPL(mr, r, r1 operand.Op) (*intrep.Instruction, error) {
11993	switch {
11994	case operand.IsR32(mr) && operand.IsR32(r) && operand.IsR32(r1):
11995		return &intrep.Instruction{
11996			Opcode:   "PDEPL",
11997			Operands: []operand.Op{mr, r, r1},
11998			Inputs:   []operand.Op{mr, r},
11999			Outputs:  []operand.Op{r1},
12000			ISA:      []string{"BMI2"},
12001		}, nil
12002	case operand.IsM32(mr) && operand.IsR32(r) && operand.IsR32(r1):
12003		return &intrep.Instruction{
12004			Opcode:   "PDEPL",
12005			Operands: []operand.Op{mr, r, r1},
12006			Inputs:   []operand.Op{mr, r},
12007			Outputs:  []operand.Op{r1},
12008			ISA:      []string{"BMI2"},
12009		}, nil
12010	}
12011	return nil, errors.New("PDEPL: bad operands")
12012}
12013
12014// PDEPQ: Parallel Bits Deposit.
12015//
12016// Forms:
12017//
12018// 	PDEPQ r64 r64 r64
12019// 	PDEPQ m64 r64 r64
12020func PDEPQ(mr, r, r1 operand.Op) (*intrep.Instruction, error) {
12021	switch {
12022	case operand.IsR64(mr) && operand.IsR64(r) && operand.IsR64(r1):
12023		return &intrep.Instruction{
12024			Opcode:   "PDEPQ",
12025			Operands: []operand.Op{mr, r, r1},
12026			Inputs:   []operand.Op{mr, r},
12027			Outputs:  []operand.Op{r1},
12028			ISA:      []string{"BMI2"},
12029		}, nil
12030	case operand.IsM64(mr) && operand.IsR64(r) && operand.IsR64(r1):
12031		return &intrep.Instruction{
12032			Opcode:   "PDEPQ",
12033			Operands: []operand.Op{mr, r, r1},
12034			Inputs:   []operand.Op{mr, r},
12035			Outputs:  []operand.Op{r1},
12036			ISA:      []string{"BMI2"},
12037		}, nil
12038	}
12039	return nil, errors.New("PDEPQ: bad operands")
12040}
12041
12042// PEXTL: Parallel Bits Extract.
12043//
12044// Forms:
12045//
12046// 	PEXTL r32 r32 r32
12047// 	PEXTL m32 r32 r32
12048func PEXTL(mr, r, r1 operand.Op) (*intrep.Instruction, error) {
12049	switch {
12050	case operand.IsR32(mr) && operand.IsR32(r) && operand.IsR32(r1):
12051		return &intrep.Instruction{
12052			Opcode:   "PEXTL",
12053			Operands: []operand.Op{mr, r, r1},
12054			Inputs:   []operand.Op{mr, r},
12055			Outputs:  []operand.Op{r1},
12056			ISA:      []string{"BMI2"},
12057		}, nil
12058	case operand.IsM32(mr) && operand.IsR32(r) && operand.IsR32(r1):
12059		return &intrep.Instruction{
12060			Opcode:   "PEXTL",
12061			Operands: []operand.Op{mr, r, r1},
12062			Inputs:   []operand.Op{mr, r},
12063			Outputs:  []operand.Op{r1},
12064			ISA:      []string{"BMI2"},
12065		}, nil
12066	}
12067	return nil, errors.New("PEXTL: bad operands")
12068}
12069
12070// PEXTQ: Parallel Bits Extract.
12071//
12072// Forms:
12073//
12074// 	PEXTQ r64 r64 r64
12075// 	PEXTQ m64 r64 r64
12076func PEXTQ(mr, r, r1 operand.Op) (*intrep.Instruction, error) {
12077	switch {
12078	case operand.IsR64(mr) && operand.IsR64(r) && operand.IsR64(r1):
12079		return &intrep.Instruction{
12080			Opcode:   "PEXTQ",
12081			Operands: []operand.Op{mr, r, r1},
12082			Inputs:   []operand.Op{mr, r},
12083			Outputs:  []operand.Op{r1},
12084			ISA:      []string{"BMI2"},
12085		}, nil
12086	case operand.IsM64(mr) && operand.IsR64(r) && operand.IsR64(r1):
12087		return &intrep.Instruction{
12088			Opcode:   "PEXTQ",
12089			Operands: []operand.Op{mr, r, r1},
12090			Inputs:   []operand.Op{mr, r},
12091			Outputs:  []operand.Op{r1},
12092			ISA:      []string{"BMI2"},
12093		}, nil
12094	}
12095	return nil, errors.New("PEXTQ: bad operands")
12096}
12097
12098// PEXTRB: Extract Byte.
12099//
12100// Forms:
12101//
12102// 	PEXTRB imm8 xmm r32
12103// 	PEXTRB imm8 xmm m8
12104func PEXTRB(i, x, mr operand.Op) (*intrep.Instruction, error) {
12105	switch {
12106	case operand.IsIMM8(i) && operand.IsXMM(x) && operand.IsR32(mr):
12107		return &intrep.Instruction{
12108			Opcode:   "PEXTRB",
12109			Operands: []operand.Op{i, x, mr},
12110			Inputs:   []operand.Op{x},
12111			Outputs:  []operand.Op{mr},
12112			ISA:      []string{"SSE4.1"},
12113		}, nil
12114	case operand.IsIMM8(i) && operand.IsXMM(x) && operand.IsM8(mr):
12115		return &intrep.Instruction{
12116			Opcode:   "PEXTRB",
12117			Operands: []operand.Op{i, x, mr},
12118			Inputs:   []operand.Op{x},
12119			Outputs:  []operand.Op{mr},
12120			ISA:      []string{"SSE4.1"},
12121		}, nil
12122	}
12123	return nil, errors.New("PEXTRB: bad operands")
12124}
12125
12126// PEXTRD: Extract Doubleword.
12127//
12128// Forms:
12129//
12130// 	PEXTRD imm8 xmm r32
12131// 	PEXTRD imm8 xmm m32
12132func PEXTRD(i, x, mr operand.Op) (*intrep.Instruction, error) {
12133	switch {
12134	case operand.IsIMM8(i) && operand.IsXMM(x) && operand.IsR32(mr):
12135		return &intrep.Instruction{
12136			Opcode:   "PEXTRD",
12137			Operands: []operand.Op{i, x, mr},
12138			Inputs:   []operand.Op{x},
12139			Outputs:  []operand.Op{mr},
12140			ISA:      []string{"SSE4.1"},
12141		}, nil
12142	case operand.IsIMM8(i) && operand.IsXMM(x) && operand.IsM32(mr):
12143		return &intrep.Instruction{
12144			Opcode:   "PEXTRD",
12145			Operands: []operand.Op{i, x, mr},
12146			Inputs:   []operand.Op{x},
12147			Outputs:  []operand.Op{mr},
12148			ISA:      []string{"SSE4.1"},
12149		}, nil
12150	}
12151	return nil, errors.New("PEXTRD: bad operands")
12152}
12153
12154// PEXTRQ: Extract Quadword.
12155//
12156// Forms:
12157//
12158// 	PEXTRQ imm8 xmm r64
12159// 	PEXTRQ imm8 xmm m64
12160func PEXTRQ(i, x, mr operand.Op) (*intrep.Instruction, error) {
12161	switch {
12162	case operand.IsIMM8(i) && operand.IsXMM(x) && operand.IsR64(mr):
12163		return &intrep.Instruction{
12164			Opcode:   "PEXTRQ",
12165			Operands: []operand.Op{i, x, mr},
12166			Inputs:   []operand.Op{x},
12167			Outputs:  []operand.Op{mr},
12168			ISA:      []string{"SSE4.1"},
12169		}, nil
12170	case operand.IsIMM8(i) && operand.IsXMM(x) && operand.IsM64(mr):
12171		return &intrep.Instruction{
12172			Opcode:   "PEXTRQ",
12173			Operands: []operand.Op{i, x, mr},
12174			Inputs:   []operand.Op{x},
12175			Outputs:  []operand.Op{mr},
12176			ISA:      []string{"SSE4.1"},
12177		}, nil
12178	}
12179	return nil, errors.New("PEXTRQ: bad operands")
12180}
12181
12182// PEXTRW: Extract Word.
12183//
12184// Forms:
12185//
12186// 	PEXTRW imm8 xmm r32
12187// 	PEXTRW imm8 xmm m16
12188func PEXTRW(i, x, mr operand.Op) (*intrep.Instruction, error) {
12189	switch {
12190	case operand.IsIMM8(i) && operand.IsXMM(x) && operand.IsR32(mr):
12191		return &intrep.Instruction{
12192			Opcode:   "PEXTRW",
12193			Operands: []operand.Op{i, x, mr},
12194			Inputs:   []operand.Op{x},
12195			Outputs:  []operand.Op{mr},
12196			ISA:      []string{"SSE4.1"},
12197		}, nil
12198	case operand.IsIMM8(i) && operand.IsXMM(x) && operand.IsM16(mr):
12199		return &intrep.Instruction{
12200			Opcode:   "PEXTRW",
12201			Operands: []operand.Op{i, x, mr},
12202			Inputs:   []operand.Op{x},
12203			Outputs:  []operand.Op{mr},
12204			ISA:      []string{"SSE4.1"},
12205		}, nil
12206	}
12207	return nil, errors.New("PEXTRW: bad operands")
12208}
12209
12210// PHADDD: Packed Horizontal Add Doubleword Integer.
12211//
12212// Forms:
12213//
12214// 	PHADDD xmm  xmm
12215// 	PHADDD m128 xmm
12216func PHADDD(mx, x operand.Op) (*intrep.Instruction, error) {
12217	switch {
12218	case operand.IsXMM(mx) && operand.IsXMM(x):
12219		return &intrep.Instruction{
12220			Opcode:   "PHADDD",
12221			Operands: []operand.Op{mx, x},
12222			Inputs:   []operand.Op{mx, x},
12223			Outputs:  []operand.Op{x},
12224			ISA:      []string{"SSSE3"},
12225		}, nil
12226	case operand.IsM128(mx) && operand.IsXMM(x):
12227		return &intrep.Instruction{
12228			Opcode:   "PHADDD",
12229			Operands: []operand.Op{mx, x},
12230			Inputs:   []operand.Op{mx, x},
12231			Outputs:  []operand.Op{x},
12232			ISA:      []string{"SSSE3"},
12233		}, nil
12234	}
12235	return nil, errors.New("PHADDD: bad operands")
12236}
12237
12238// PHADDSW: Packed Horizontal Add Signed Word Integers with Signed Saturation.
12239//
12240// Forms:
12241//
12242// 	PHADDSW xmm  xmm
12243// 	PHADDSW m128 xmm
12244func PHADDSW(mx, x operand.Op) (*intrep.Instruction, error) {
12245	switch {
12246	case operand.IsXMM(mx) && operand.IsXMM(x):
12247		return &intrep.Instruction{
12248			Opcode:   "PHADDSW",
12249			Operands: []operand.Op{mx, x},
12250			Inputs:   []operand.Op{mx, x},
12251			Outputs:  []operand.Op{x},
12252			ISA:      []string{"SSSE3"},
12253		}, nil
12254	case operand.IsM128(mx) && operand.IsXMM(x):
12255		return &intrep.Instruction{
12256			Opcode:   "PHADDSW",
12257			Operands: []operand.Op{mx, x},
12258			Inputs:   []operand.Op{mx, x},
12259			Outputs:  []operand.Op{x},
12260			ISA:      []string{"SSSE3"},
12261		}, nil
12262	}
12263	return nil, errors.New("PHADDSW: bad operands")
12264}
12265
12266// PHADDW: Packed Horizontal Add Word Integers.
12267//
12268// Forms:
12269//
12270// 	PHADDW xmm  xmm
12271// 	PHADDW m128 xmm
12272func PHADDW(mx, x operand.Op) (*intrep.Instruction, error) {
12273	switch {
12274	case operand.IsXMM(mx) && operand.IsXMM(x):
12275		return &intrep.Instruction{
12276			Opcode:   "PHADDW",
12277			Operands: []operand.Op{mx, x},
12278			Inputs:   []operand.Op{mx, x},
12279			Outputs:  []operand.Op{x},
12280			ISA:      []string{"SSSE3"},
12281		}, nil
12282	case operand.IsM128(mx) && operand.IsXMM(x):
12283		return &intrep.Instruction{
12284			Opcode:   "PHADDW",
12285			Operands: []operand.Op{mx, x},
12286			Inputs:   []operand.Op{mx, x},
12287			Outputs:  []operand.Op{x},
12288			ISA:      []string{"SSSE3"},
12289		}, nil
12290	}
12291	return nil, errors.New("PHADDW: bad operands")
12292}
12293
12294// PHMINPOSUW: Packed Horizontal Minimum of Unsigned Word Integers.
12295//
12296// Forms:
12297//
12298// 	PHMINPOSUW xmm  xmm
12299// 	PHMINPOSUW m128 xmm
12300func PHMINPOSUW(mx, x operand.Op) (*intrep.Instruction, error) {
12301	switch {
12302	case operand.IsXMM(mx) && operand.IsXMM(x):
12303		return &intrep.Instruction{
12304			Opcode:   "PHMINPOSUW",
12305			Operands: []operand.Op{mx, x},
12306			Inputs:   []operand.Op{mx},
12307			Outputs:  []operand.Op{x},
12308			ISA:      []string{"SSE4.1"},
12309		}, nil
12310	case operand.IsM128(mx) && operand.IsXMM(x):
12311		return &intrep.Instruction{
12312			Opcode:   "PHMINPOSUW",
12313			Operands: []operand.Op{mx, x},
12314			Inputs:   []operand.Op{mx},
12315			Outputs:  []operand.Op{x},
12316			ISA:      []string{"SSE4.1"},
12317		}, nil
12318	}
12319	return nil, errors.New("PHMINPOSUW: bad operands")
12320}
12321
12322// PHSUBD: Packed Horizontal Subtract Doubleword Integers.
12323//
12324// Forms:
12325//
12326// 	PHSUBD xmm  xmm
12327// 	PHSUBD m128 xmm
12328func PHSUBD(mx, x operand.Op) (*intrep.Instruction, error) {
12329	switch {
12330	case operand.IsXMM(mx) && operand.IsXMM(x):
12331		return &intrep.Instruction{
12332			Opcode:           "PHSUBD",
12333			Operands:         []operand.Op{mx, x},
12334			Inputs:           []operand.Op{mx, x},
12335			Outputs:          []operand.Op{x},
12336			ISA:              []string{"SSSE3"},
12337			CancellingInputs: true,
12338		}, nil
12339	case operand.IsM128(mx) && operand.IsXMM(x):
12340		return &intrep.Instruction{
12341			Opcode:   "PHSUBD",
12342			Operands: []operand.Op{mx, x},
12343			Inputs:   []operand.Op{mx, x},
12344			Outputs:  []operand.Op{x},
12345			ISA:      []string{"SSSE3"},
12346		}, nil
12347	}
12348	return nil, errors.New("PHSUBD: bad operands")
12349}
12350
12351// PHSUBSW: Packed Horizontal Subtract Signed Word Integers with Signed Saturation.
12352//
12353// Forms:
12354//
12355// 	PHSUBSW xmm  xmm
12356// 	PHSUBSW m128 xmm
12357func PHSUBSW(mx, x operand.Op) (*intrep.Instruction, error) {
12358	switch {
12359	case operand.IsXMM(mx) && operand.IsXMM(x):
12360		return &intrep.Instruction{
12361			Opcode:           "PHSUBSW",
12362			Operands:         []operand.Op{mx, x},
12363			Inputs:           []operand.Op{mx, x},
12364			Outputs:          []operand.Op{x},
12365			ISA:              []string{"SSSE3"},
12366			CancellingInputs: true,
12367		}, nil
12368	case operand.IsM128(mx) && operand.IsXMM(x):
12369		return &intrep.Instruction{
12370			Opcode:   "PHSUBSW",
12371			Operands: []operand.Op{mx, x},
12372			Inputs:   []operand.Op{mx, x},
12373			Outputs:  []operand.Op{x},
12374			ISA:      []string{"SSSE3"},
12375		}, nil
12376	}
12377	return nil, errors.New("PHSUBSW: bad operands")
12378}
12379
12380// PHSUBW: Packed Horizontal Subtract Word Integers.
12381//
12382// Forms:
12383//
12384// 	PHSUBW xmm  xmm
12385// 	PHSUBW m128 xmm
12386func PHSUBW(mx, x operand.Op) (*intrep.Instruction, error) {
12387	switch {
12388	case operand.IsXMM(mx) && operand.IsXMM(x):
12389		return &intrep.Instruction{
12390			Opcode:           "PHSUBW",
12391			Operands:         []operand.Op{mx, x},
12392			Inputs:           []operand.Op{mx, x},
12393			Outputs:          []operand.Op{x},
12394			ISA:              []string{"SSSE3"},
12395			CancellingInputs: true,
12396		}, nil
12397	case operand.IsM128(mx) && operand.IsXMM(x):
12398		return &intrep.Instruction{
12399			Opcode:   "PHSUBW",
12400			Operands: []operand.Op{mx, x},
12401			Inputs:   []operand.Op{mx, x},
12402			Outputs:  []operand.Op{x},
12403			ISA:      []string{"SSSE3"},
12404		}, nil
12405	}
12406	return nil, errors.New("PHSUBW: bad operands")
12407}
12408
12409// PINSRB: Insert Byte.
12410//
12411// Forms:
12412//
12413// 	PINSRB imm8 r32 xmm
12414// 	PINSRB imm8 m8  xmm
12415func PINSRB(i, mr, x operand.Op) (*intrep.Instruction, error) {
12416	switch {
12417	case operand.IsIMM8(i) && operand.IsR32(mr) && operand.IsXMM(x):
12418		return &intrep.Instruction{
12419			Opcode:   "PINSRB",
12420			Operands: []operand.Op{i, mr, x},
12421			Inputs:   []operand.Op{mr, x},
12422			Outputs:  []operand.Op{x},
12423			ISA:      []string{"SSE4.1"},
12424		}, nil
12425	case operand.IsIMM8(i) && operand.IsM8(mr) && operand.IsXMM(x):
12426		return &intrep.Instruction{
12427			Opcode:   "PINSRB",
12428			Operands: []operand.Op{i, mr, x},
12429			Inputs:   []operand.Op{mr, x},
12430			Outputs:  []operand.Op{x},
12431			ISA:      []string{"SSE4.1"},
12432		}, nil
12433	}
12434	return nil, errors.New("PINSRB: bad operands")
12435}
12436
12437// PINSRD: Insert Doubleword.
12438//
12439// Forms:
12440//
12441// 	PINSRD imm8 r32 xmm
12442// 	PINSRD imm8 m32 xmm
12443func PINSRD(i, mr, x operand.Op) (*intrep.Instruction, error) {
12444	switch {
12445	case operand.IsIMM8(i) && operand.IsR32(mr) && operand.IsXMM(x):
12446		return &intrep.Instruction{
12447			Opcode:   "PINSRD",
12448			Operands: []operand.Op{i, mr, x},
12449			Inputs:   []operand.Op{mr, x},
12450			Outputs:  []operand.Op{x},
12451			ISA:      []string{"SSE4.1"},
12452		}, nil
12453	case operand.IsIMM8(i) && operand.IsM32(mr) && operand.IsXMM(x):
12454		return &intrep.Instruction{
12455			Opcode:   "PINSRD",
12456			Operands: []operand.Op{i, mr, x},
12457			Inputs:   []operand.Op{mr, x},
12458			Outputs:  []operand.Op{x},
12459			ISA:      []string{"SSE4.1"},
12460		}, nil
12461	}
12462	return nil, errors.New("PINSRD: bad operands")
12463}
12464
12465// PINSRQ: Insert Quadword.
12466//
12467// Forms:
12468//
12469// 	PINSRQ imm8 r64 xmm
12470// 	PINSRQ imm8 m64 xmm
12471func PINSRQ(i, mr, x operand.Op) (*intrep.Instruction, error) {
12472	switch {
12473	case operand.IsIMM8(i) && operand.IsR64(mr) && operand.IsXMM(x):
12474		return &intrep.Instruction{
12475			Opcode:   "PINSRQ",
12476			Operands: []operand.Op{i, mr, x},
12477			Inputs:   []operand.Op{mr, x},
12478			Outputs:  []operand.Op{x},
12479			ISA:      []string{"SSE4.1"},
12480		}, nil
12481	case operand.IsIMM8(i) && operand.IsM64(mr) && operand.IsXMM(x):
12482		return &intrep.Instruction{
12483			Opcode:   "PINSRQ",
12484			Operands: []operand.Op{i, mr, x},
12485			Inputs:   []operand.Op{mr, x},
12486			Outputs:  []operand.Op{x},
12487			ISA:      []string{"SSE4.1"},
12488		}, nil
12489	}
12490	return nil, errors.New("PINSRQ: bad operands")
12491}
12492
12493// PINSRW: Insert Word.
12494//
12495// Forms:
12496//
12497// 	PINSRW imm8 r32 xmm
12498// 	PINSRW imm8 m16 xmm
12499func PINSRW(i, mr, x operand.Op) (*intrep.Instruction, error) {
12500	switch {
12501	case operand.IsIMM8(i) && operand.IsR32(mr) && operand.IsXMM(x):
12502		return &intrep.Instruction{
12503			Opcode:   "PINSRW",
12504			Operands: []operand.Op{i, mr, x},
12505			Inputs:   []operand.Op{mr, x},
12506			Outputs:  []operand.Op{x},
12507			ISA:      []string{"SSE2"},
12508		}, nil
12509	case operand.IsIMM8(i) && operand.IsM16(mr) && operand.IsXMM(x):
12510		return &intrep.Instruction{
12511			Opcode:   "PINSRW",
12512			Operands: []operand.Op{i, mr, x},
12513			Inputs:   []operand.Op{mr, x},
12514			Outputs:  []operand.Op{x},
12515			ISA:      []string{"SSE2"},
12516		}, nil
12517	}
12518	return nil, errors.New("PINSRW: bad operands")
12519}
12520
12521// PMADDUBSW: Multiply and Add Packed Signed and Unsigned Byte Integers.
12522//
12523// Forms:
12524//
12525// 	PMADDUBSW xmm  xmm
12526// 	PMADDUBSW m128 xmm
12527func PMADDUBSW(mx, x operand.Op) (*intrep.Instruction, error) {
12528	switch {
12529	case operand.IsXMM(mx) && operand.IsXMM(x):
12530		return &intrep.Instruction{
12531			Opcode:   "PMADDUBSW",
12532			Operands: []operand.Op{mx, x},
12533			Inputs:   []operand.Op{mx, x},
12534			Outputs:  []operand.Op{x},
12535			ISA:      []string{"SSSE3"},
12536		}, nil
12537	case operand.IsM128(mx) && operand.IsXMM(x):
12538		return &intrep.Instruction{
12539			Opcode:   "PMADDUBSW",
12540			Operands: []operand.Op{mx, x},
12541			Inputs:   []operand.Op{mx, x},
12542			Outputs:  []operand.Op{x},
12543			ISA:      []string{"SSSE3"},
12544		}, nil
12545	}
12546	return nil, errors.New("PMADDUBSW: bad operands")
12547}
12548
12549// PMADDWL: Multiply and Add Packed Signed Word Integers.
12550//
12551// Forms:
12552//
12553// 	PMADDWL xmm  xmm
12554// 	PMADDWL m128 xmm
12555func PMADDWL(mx, x operand.Op) (*intrep.Instruction, error) {
12556	switch {
12557	case operand.IsXMM(mx) && operand.IsXMM(x):
12558		return &intrep.Instruction{
12559			Opcode:   "PMADDWL",
12560			Operands: []operand.Op{mx, x},
12561			Inputs:   []operand.Op{mx, x},
12562			Outputs:  []operand.Op{x},
12563			ISA:      []string{"SSE2"},
12564		}, nil
12565	case operand.IsM128(mx) && operand.IsXMM(x):
12566		return &intrep.Instruction{
12567			Opcode:   "PMADDWL",
12568			Operands: []operand.Op{mx, x},
12569			Inputs:   []operand.Op{mx, x},
12570			Outputs:  []operand.Op{x},
12571			ISA:      []string{"SSE2"},
12572		}, nil
12573	}
12574	return nil, errors.New("PMADDWL: bad operands")
12575}
12576
12577// PMAXSB: Maximum of Packed Signed Byte Integers.
12578//
12579// Forms:
12580//
12581// 	PMAXSB xmm  xmm
12582// 	PMAXSB m128 xmm
12583func PMAXSB(mx, x operand.Op) (*intrep.Instruction, error) {
12584	switch {
12585	case operand.IsXMM(mx) && operand.IsXMM(x):
12586		return &intrep.Instruction{
12587			Opcode:   "PMAXSB",
12588			Operands: []operand.Op{mx, x},
12589			Inputs:   []operand.Op{mx, x},
12590			Outputs:  []operand.Op{x},
12591			ISA:      []string{"SSE4.1"},
12592		}, nil
12593	case operand.IsM128(mx) && operand.IsXMM(x):
12594		return &intrep.Instruction{
12595			Opcode:   "PMAXSB",
12596			Operands: []operand.Op{mx, x},
12597			Inputs:   []operand.Op{mx, x},
12598			Outputs:  []operand.Op{x},
12599			ISA:      []string{"SSE4.1"},
12600		}, nil
12601	}
12602	return nil, errors.New("PMAXSB: bad operands")
12603}
12604
12605// PMAXSD: Maximum of Packed Signed Doubleword Integers.
12606//
12607// Forms:
12608//
12609// 	PMAXSD xmm  xmm
12610// 	PMAXSD m128 xmm
12611func PMAXSD(mx, x operand.Op) (*intrep.Instruction, error) {
12612	switch {
12613	case operand.IsXMM(mx) && operand.IsXMM(x):
12614		return &intrep.Instruction{
12615			Opcode:   "PMAXSD",
12616			Operands: []operand.Op{mx, x},
12617			Inputs:   []operand.Op{mx, x},
12618			Outputs:  []operand.Op{x},
12619			ISA:      []string{"SSE4.1"},
12620		}, nil
12621	case operand.IsM128(mx) && operand.IsXMM(x):
12622		return &intrep.Instruction{
12623			Opcode:   "PMAXSD",
12624			Operands: []operand.Op{mx, x},
12625			Inputs:   []operand.Op{mx, x},
12626			Outputs:  []operand.Op{x},
12627			ISA:      []string{"SSE4.1"},
12628		}, nil
12629	}
12630	return nil, errors.New("PMAXSD: bad operands")
12631}
12632
12633// PMAXSW: Maximum of Packed Signed Word Integers.
12634//
12635// Forms:
12636//
12637// 	PMAXSW xmm  xmm
12638// 	PMAXSW m128 xmm
12639func PMAXSW(mx, x operand.Op) (*intrep.Instruction, error) {
12640	switch {
12641	case operand.IsXMM(mx) && operand.IsXMM(x):
12642		return &intrep.Instruction{
12643			Opcode:   "PMAXSW",
12644			Operands: []operand.Op{mx, x},
12645			Inputs:   []operand.Op{mx, x},
12646			Outputs:  []operand.Op{x},
12647			ISA:      []string{"SSE2"},
12648		}, nil
12649	case operand.IsM128(mx) && operand.IsXMM(x):
12650		return &intrep.Instruction{
12651			Opcode:   "PMAXSW",
12652			Operands: []operand.Op{mx, x},
12653			Inputs:   []operand.Op{mx, x},
12654			Outputs:  []operand.Op{x},
12655			ISA:      []string{"SSE2"},
12656		}, nil
12657	}
12658	return nil, errors.New("PMAXSW: bad operands")
12659}
12660
12661// PMAXUB: Maximum of Packed Unsigned Byte Integers.
12662//
12663// Forms:
12664//
12665// 	PMAXUB xmm  xmm
12666// 	PMAXUB m128 xmm
12667func PMAXUB(mx, x operand.Op) (*intrep.Instruction, error) {
12668	switch {
12669	case operand.IsXMM(mx) && operand.IsXMM(x):
12670		return &intrep.Instruction{
12671			Opcode:   "PMAXUB",
12672			Operands: []operand.Op{mx, x},
12673			Inputs:   []operand.Op{mx, x},
12674			Outputs:  []operand.Op{x},
12675			ISA:      []string{"SSE2"},
12676		}, nil
12677	case operand.IsM128(mx) && operand.IsXMM(x):
12678		return &intrep.Instruction{
12679			Opcode:   "PMAXUB",
12680			Operands: []operand.Op{mx, x},
12681			Inputs:   []operand.Op{mx, x},
12682			Outputs:  []operand.Op{x},
12683			ISA:      []string{"SSE2"},
12684		}, nil
12685	}
12686	return nil, errors.New("PMAXUB: bad operands")
12687}
12688
12689// PMAXUD: Maximum of Packed Unsigned Doubleword Integers.
12690//
12691// Forms:
12692//
12693// 	PMAXUD xmm  xmm
12694// 	PMAXUD m128 xmm
12695func PMAXUD(mx, x operand.Op) (*intrep.Instruction, error) {
12696	switch {
12697	case operand.IsXMM(mx) && operand.IsXMM(x):
12698		return &intrep.Instruction{
12699			Opcode:   "PMAXUD",
12700			Operands: []operand.Op{mx, x},
12701			Inputs:   []operand.Op{mx, x},
12702			Outputs:  []operand.Op{x},
12703			ISA:      []string{"SSE4.1"},
12704		}, nil
12705	case operand.IsM128(mx) && operand.IsXMM(x):
12706		return &intrep.Instruction{
12707			Opcode:   "PMAXUD",
12708			Operands: []operand.Op{mx, x},
12709			Inputs:   []operand.Op{mx, x},
12710			Outputs:  []operand.Op{x},
12711			ISA:      []string{"SSE4.1"},
12712		}, nil
12713	}
12714	return nil, errors.New("PMAXUD: bad operands")
12715}
12716
12717// PMAXUW: Maximum of Packed Unsigned Word Integers.
12718//
12719// Forms:
12720//
12721// 	PMAXUW xmm  xmm
12722// 	PMAXUW m128 xmm
12723func PMAXUW(mx, x operand.Op) (*intrep.Instruction, error) {
12724	switch {
12725	case operand.IsXMM(mx) && operand.IsXMM(x):
12726		return &intrep.Instruction{
12727			Opcode:   "PMAXUW",
12728			Operands: []operand.Op{mx, x},
12729			Inputs:   []operand.Op{mx, x},
12730			Outputs:  []operand.Op{x},
12731			ISA:      []string{"SSE4.1"},
12732		}, nil
12733	case operand.IsM128(mx) && operand.IsXMM(x):
12734		return &intrep.Instruction{
12735			Opcode:   "PMAXUW",
12736			Operands: []operand.Op{mx, x},
12737			Inputs:   []operand.Op{mx, x},
12738			Outputs:  []operand.Op{x},
12739			ISA:      []string{"SSE4.1"},
12740		}, nil
12741	}
12742	return nil, errors.New("PMAXUW: bad operands")
12743}
12744
12745// PMINSB: Minimum of Packed Signed Byte Integers.
12746//
12747// Forms:
12748//
12749// 	PMINSB xmm  xmm
12750// 	PMINSB m128 xmm
12751func PMINSB(mx, x operand.Op) (*intrep.Instruction, error) {
12752	switch {
12753	case operand.IsXMM(mx) && operand.IsXMM(x):
12754		return &intrep.Instruction{
12755			Opcode:   "PMINSB",
12756			Operands: []operand.Op{mx, x},
12757			Inputs:   []operand.Op{mx, x},
12758			Outputs:  []operand.Op{x},
12759			ISA:      []string{"SSE4.1"},
12760		}, nil
12761	case operand.IsM128(mx) && operand.IsXMM(x):
12762		return &intrep.Instruction{
12763			Opcode:   "PMINSB",
12764			Operands: []operand.Op{mx, x},
12765			Inputs:   []operand.Op{mx, x},
12766			Outputs:  []operand.Op{x},
12767			ISA:      []string{"SSE4.1"},
12768		}, nil
12769	}
12770	return nil, errors.New("PMINSB: bad operands")
12771}
12772
12773// PMINSD: Minimum of Packed Signed Doubleword Integers.
12774//
12775// Forms:
12776//
12777// 	PMINSD xmm  xmm
12778// 	PMINSD m128 xmm
12779func PMINSD(mx, x operand.Op) (*intrep.Instruction, error) {
12780	switch {
12781	case operand.IsXMM(mx) && operand.IsXMM(x):
12782		return &intrep.Instruction{
12783			Opcode:   "PMINSD",
12784			Operands: []operand.Op{mx, x},
12785			Inputs:   []operand.Op{mx, x},
12786			Outputs:  []operand.Op{x},
12787			ISA:      []string{"SSE4.1"},
12788		}, nil
12789	case operand.IsM128(mx) && operand.IsXMM(x):
12790		return &intrep.Instruction{
12791			Opcode:   "PMINSD",
12792			Operands: []operand.Op{mx, x},
12793			Inputs:   []operand.Op{mx, x},
12794			Outputs:  []operand.Op{x},
12795			ISA:      []string{"SSE4.1"},
12796		}, nil
12797	}
12798	return nil, errors.New("PMINSD: bad operands")
12799}
12800
12801// PMINSW: Minimum of Packed Signed Word Integers.
12802//
12803// Forms:
12804//
12805// 	PMINSW xmm  xmm
12806// 	PMINSW m128 xmm
12807func PMINSW(mx, x operand.Op) (*intrep.Instruction, error) {
12808	switch {
12809	case operand.IsXMM(mx) && operand.IsXMM(x):
12810		return &intrep.Instruction{
12811			Opcode:   "PMINSW",
12812			Operands: []operand.Op{mx, x},
12813			Inputs:   []operand.Op{mx, x},
12814			Outputs:  []operand.Op{x},
12815			ISA:      []string{"SSE2"},
12816		}, nil
12817	case operand.IsM128(mx) && operand.IsXMM(x):
12818		return &intrep.Instruction{
12819			Opcode:   "PMINSW",
12820			Operands: []operand.Op{mx, x},
12821			Inputs:   []operand.Op{mx, x},
12822			Outputs:  []operand.Op{x},
12823			ISA:      []string{"SSE2"},
12824		}, nil
12825	}
12826	return nil, errors.New("PMINSW: bad operands")
12827}
12828
12829// PMINUB: Minimum of Packed Unsigned Byte Integers.
12830//
12831// Forms:
12832//
12833// 	PMINUB xmm  xmm
12834// 	PMINUB m128 xmm
12835func PMINUB(mx, x operand.Op) (*intrep.Instruction, error) {
12836	switch {
12837	case operand.IsXMM(mx) && operand.IsXMM(x):
12838		return &intrep.Instruction{
12839			Opcode:   "PMINUB",
12840			Operands: []operand.Op{mx, x},
12841			Inputs:   []operand.Op{mx, x},
12842			Outputs:  []operand.Op{x},
12843			ISA:      []string{"SSE2"},
12844		}, nil
12845	case operand.IsM128(mx) && operand.IsXMM(x):
12846		return &intrep.Instruction{
12847			Opcode:   "PMINUB",
12848			Operands: []operand.Op{mx, x},
12849			Inputs:   []operand.Op{mx, x},
12850			Outputs:  []operand.Op{x},
12851			ISA:      []string{"SSE2"},
12852		}, nil
12853	}
12854	return nil, errors.New("PMINUB: bad operands")
12855}
12856
12857// PMINUD: Minimum of Packed Unsigned Doubleword Integers.
12858//
12859// Forms:
12860//
12861// 	PMINUD xmm  xmm
12862// 	PMINUD m128 xmm
12863func PMINUD(mx, x operand.Op) (*intrep.Instruction, error) {
12864	switch {
12865	case operand.IsXMM(mx) && operand.IsXMM(x):
12866		return &intrep.Instruction{
12867			Opcode:   "PMINUD",
12868			Operands: []operand.Op{mx, x},
12869			Inputs:   []operand.Op{mx, x},
12870			Outputs:  []operand.Op{x},
12871			ISA:      []string{"SSE4.1"},
12872		}, nil
12873	case operand.IsM128(mx) && operand.IsXMM(x):
12874		return &intrep.Instruction{
12875			Opcode:   "PMINUD",
12876			Operands: []operand.Op{mx, x},
12877			Inputs:   []operand.Op{mx, x},
12878			Outputs:  []operand.Op{x},
12879			ISA:      []string{"SSE4.1"},
12880		}, nil
12881	}
12882	return nil, errors.New("PMINUD: bad operands")
12883}
12884
12885// PMINUW: Minimum of Packed Unsigned Word Integers.
12886//
12887// Forms:
12888//
12889// 	PMINUW xmm  xmm
12890// 	PMINUW m128 xmm
12891func PMINUW(mx, x operand.Op) (*intrep.Instruction, error) {
12892	switch {
12893	case operand.IsXMM(mx) && operand.IsXMM(x):
12894		return &intrep.Instruction{
12895			Opcode:   "PMINUW",
12896			Operands: []operand.Op{mx, x},
12897			Inputs:   []operand.Op{mx, x},
12898			Outputs:  []operand.Op{x},
12899			ISA:      []string{"SSE4.1"},
12900		}, nil
12901	case operand.IsM128(mx) && operand.IsXMM(x):
12902		return &intrep.Instruction{
12903			Opcode:   "PMINUW",
12904			Operands: []operand.Op{mx, x},
12905			Inputs:   []operand.Op{mx, x},
12906			Outputs:  []operand.Op{x},
12907			ISA:      []string{"SSE4.1"},
12908		}, nil
12909	}
12910	return nil, errors.New("PMINUW: bad operands")
12911}
12912
12913// PMOVMSKB: Move Byte Mask.
12914//
12915// Forms:
12916//
12917// 	PMOVMSKB xmm r32
12918func PMOVMSKB(x, r operand.Op) (*intrep.Instruction, error) {
12919	switch {
12920	case operand.IsXMM(x) && operand.IsR32(r):
12921		return &intrep.Instruction{
12922			Opcode:   "PMOVMSKB",
12923			Operands: []operand.Op{x, r},
12924			Inputs:   []operand.Op{x},
12925			Outputs:  []operand.Op{r},
12926			ISA:      []string{"SSE2"},
12927		}, nil
12928	}
12929	return nil, errors.New("PMOVMSKB: bad operands")
12930}
12931
12932// PMOVSXBD: Move Packed Byte Integers to Doubleword Integers with Sign Extension.
12933//
12934// Forms:
12935//
12936// 	PMOVSXBD xmm xmm
12937// 	PMOVSXBD m32 xmm
12938func PMOVSXBD(mx, x operand.Op) (*intrep.Instruction, error) {
12939	switch {
12940	case operand.IsXMM(mx) && operand.IsXMM(x):
12941		return &intrep.Instruction{
12942			Opcode:   "PMOVSXBD",
12943			Operands: []operand.Op{mx, x},
12944			Inputs:   []operand.Op{mx},
12945			Outputs:  []operand.Op{x},
12946			ISA:      []string{"SSE4.1"},
12947		}, nil
12948	case operand.IsM32(mx) && operand.IsXMM(x):
12949		return &intrep.Instruction{
12950			Opcode:   "PMOVSXBD",
12951			Operands: []operand.Op{mx, x},
12952			Inputs:   []operand.Op{mx},
12953			Outputs:  []operand.Op{x},
12954			ISA:      []string{"SSE4.1"},
12955		}, nil
12956	}
12957	return nil, errors.New("PMOVSXBD: bad operands")
12958}
12959
12960// PMOVSXBQ: Move Packed Byte Integers to Quadword Integers with Sign Extension.
12961//
12962// Forms:
12963//
12964// 	PMOVSXBQ xmm xmm
12965// 	PMOVSXBQ m16 xmm
12966func PMOVSXBQ(mx, x operand.Op) (*intrep.Instruction, error) {
12967	switch {
12968	case operand.IsXMM(mx) && operand.IsXMM(x):
12969		return &intrep.Instruction{
12970			Opcode:   "PMOVSXBQ",
12971			Operands: []operand.Op{mx, x},
12972			Inputs:   []operand.Op{mx},
12973			Outputs:  []operand.Op{x},
12974			ISA:      []string{"SSE4.1"},
12975		}, nil
12976	case operand.IsM16(mx) && operand.IsXMM(x):
12977		return &intrep.Instruction{
12978			Opcode:   "PMOVSXBQ",
12979			Operands: []operand.Op{mx, x},
12980			Inputs:   []operand.Op{mx},
12981			Outputs:  []operand.Op{x},
12982			ISA:      []string{"SSE4.1"},
12983		}, nil
12984	}
12985	return nil, errors.New("PMOVSXBQ: bad operands")
12986}
12987
12988// PMOVSXBW: Move Packed Byte Integers to Word Integers with Sign Extension.
12989//
12990// Forms:
12991//
12992// 	PMOVSXBW xmm xmm
12993// 	PMOVSXBW m64 xmm
12994func PMOVSXBW(mx, x operand.Op) (*intrep.Instruction, error) {
12995	switch {
12996	case operand.IsXMM(mx) && operand.IsXMM(x):
12997		return &intrep.Instruction{
12998			Opcode:   "PMOVSXBW",
12999			Operands: []operand.Op{mx, x},
13000			Inputs:   []operand.Op{mx},
13001			Outputs:  []operand.Op{x},
13002			ISA:      []string{"SSE4.1"},
13003		}, nil
13004	case operand.IsM64(mx) && operand.IsXMM(x):
13005		return &intrep.Instruction{
13006			Opcode:   "PMOVSXBW",
13007			Operands: []operand.Op{mx, x},
13008			Inputs:   []operand.Op{mx},
13009			Outputs:  []operand.Op{x},
13010			ISA:      []string{"SSE4.1"},
13011		}, nil
13012	}
13013	return nil, errors.New("PMOVSXBW: bad operands")
13014}
13015
13016// PMOVSXDQ: Move Packed Doubleword Integers to Quadword Integers with Sign Extension.
13017//
13018// Forms:
13019//
13020// 	PMOVSXDQ xmm xmm
13021// 	PMOVSXDQ m64 xmm
13022func PMOVSXDQ(mx, x operand.Op) (*intrep.Instruction, error) {
13023	switch {
13024	case operand.IsXMM(mx) && operand.IsXMM(x):
13025		return &intrep.Instruction{
13026			Opcode:   "PMOVSXDQ",
13027			Operands: []operand.Op{mx, x},
13028			Inputs:   []operand.Op{mx},
13029			Outputs:  []operand.Op{x},
13030			ISA:      []string{"SSE4.1"},
13031		}, nil
13032	case operand.IsM64(mx) && operand.IsXMM(x):
13033		return &intrep.Instruction{
13034			Opcode:   "PMOVSXDQ",
13035			Operands: []operand.Op{mx, x},
13036			Inputs:   []operand.Op{mx},
13037			Outputs:  []operand.Op{x},
13038			ISA:      []string{"SSE4.1"},
13039		}, nil
13040	}
13041	return nil, errors.New("PMOVSXDQ: bad operands")
13042}
13043
13044// PMOVSXWD: Move Packed Word Integers to Doubleword Integers with Sign Extension.
13045//
13046// Forms:
13047//
13048// 	PMOVSXWD xmm xmm
13049// 	PMOVSXWD m64 xmm
13050func PMOVSXWD(mx, x operand.Op) (*intrep.Instruction, error) {
13051	switch {
13052	case operand.IsXMM(mx) && operand.IsXMM(x):
13053		return &intrep.Instruction{
13054			Opcode:   "PMOVSXWD",
13055			Operands: []operand.Op{mx, x},
13056			Inputs:   []operand.Op{mx},
13057			Outputs:  []operand.Op{x},
13058			ISA:      []string{"SSE4.1"},
13059		}, nil
13060	case operand.IsM64(mx) && operand.IsXMM(x):
13061		return &intrep.Instruction{
13062			Opcode:   "PMOVSXWD",
13063			Operands: []operand.Op{mx, x},
13064			Inputs:   []operand.Op{mx},
13065			Outputs:  []operand.Op{x},
13066			ISA:      []string{"SSE4.1"},
13067		}, nil
13068	}
13069	return nil, errors.New("PMOVSXWD: bad operands")
13070}
13071
13072// PMOVSXWQ: Move Packed Word Integers to Quadword Integers with Sign Extension.
13073//
13074// Forms:
13075//
13076// 	PMOVSXWQ xmm xmm
13077// 	PMOVSXWQ m32 xmm
13078func PMOVSXWQ(mx, x operand.Op) (*intrep.Instruction, error) {
13079	switch {
13080	case operand.IsXMM(mx) && operand.IsXMM(x):
13081		return &intrep.Instruction{
13082			Opcode:   "PMOVSXWQ",
13083			Operands: []operand.Op{mx, x},
13084			Inputs:   []operand.Op{mx},
13085			Outputs:  []operand.Op{x},
13086			ISA:      []string{"SSE4.1"},
13087		}, nil
13088	case operand.IsM32(mx) && operand.IsXMM(x):
13089		return &intrep.Instruction{
13090			Opcode:   "PMOVSXWQ",
13091			Operands: []operand.Op{mx, x},
13092			Inputs:   []operand.Op{mx},
13093			Outputs:  []operand.Op{x},
13094			ISA:      []string{"SSE4.1"},
13095		}, nil
13096	}
13097	return nil, errors.New("PMOVSXWQ: bad operands")
13098}
13099
13100// PMOVZXBD: Move Packed Byte Integers to Doubleword Integers with Zero Extension.
13101//
13102// Forms:
13103//
13104// 	PMOVZXBD xmm xmm
13105// 	PMOVZXBD m32 xmm
13106func PMOVZXBD(mx, x operand.Op) (*intrep.Instruction, error) {
13107	switch {
13108	case operand.IsXMM(mx) && operand.IsXMM(x):
13109		return &intrep.Instruction{
13110			Opcode:   "PMOVZXBD",
13111			Operands: []operand.Op{mx, x},
13112			Inputs:   []operand.Op{mx},
13113			Outputs:  []operand.Op{x},
13114			ISA:      []string{"SSE4.1"},
13115		}, nil
13116	case operand.IsM32(mx) && operand.IsXMM(x):
13117		return &intrep.Instruction{
13118			Opcode:   "PMOVZXBD",
13119			Operands: []operand.Op{mx, x},
13120			Inputs:   []operand.Op{mx},
13121			Outputs:  []operand.Op{x},
13122			ISA:      []string{"SSE4.1"},
13123		}, nil
13124	}
13125	return nil, errors.New("PMOVZXBD: bad operands")
13126}
13127
13128// PMOVZXBQ: Move Packed Byte Integers to Quadword Integers with Zero Extension.
13129//
13130// Forms:
13131//
13132// 	PMOVZXBQ xmm xmm
13133// 	PMOVZXBQ m16 xmm
13134func PMOVZXBQ(mx, x operand.Op) (*intrep.Instruction, error) {
13135	switch {
13136	case operand.IsXMM(mx) && operand.IsXMM(x):
13137		return &intrep.Instruction{
13138			Opcode:   "PMOVZXBQ",
13139			Operands: []operand.Op{mx, x},
13140			Inputs:   []operand.Op{mx},
13141			Outputs:  []operand.Op{x},
13142			ISA:      []string{"SSE4.1"},
13143		}, nil
13144	case operand.IsM16(mx) && operand.IsXMM(x):
13145		return &intrep.Instruction{
13146			Opcode:   "PMOVZXBQ",
13147			Operands: []operand.Op{mx, x},
13148			Inputs:   []operand.Op{mx},
13149			Outputs:  []operand.Op{x},
13150			ISA:      []string{"SSE4.1"},
13151		}, nil
13152	}
13153	return nil, errors.New("PMOVZXBQ: bad operands")
13154}
13155
13156// PMOVZXBW: Move Packed Byte Integers to Word Integers with Zero Extension.
13157//
13158// Forms:
13159//
13160// 	PMOVZXBW xmm xmm
13161// 	PMOVZXBW m64 xmm
13162func PMOVZXBW(mx, x operand.Op) (*intrep.Instruction, error) {
13163	switch {
13164	case operand.IsXMM(mx) && operand.IsXMM(x):
13165		return &intrep.Instruction{
13166			Opcode:   "PMOVZXBW",
13167			Operands: []operand.Op{mx, x},
13168			Inputs:   []operand.Op{mx},
13169			Outputs:  []operand.Op{x},
13170			ISA:      []string{"SSE4.1"},
13171		}, nil
13172	case operand.IsM64(mx) && operand.IsXMM(x):
13173		return &intrep.Instruction{
13174			Opcode:   "PMOVZXBW",
13175			Operands: []operand.Op{mx, x},
13176			Inputs:   []operand.Op{mx},
13177			Outputs:  []operand.Op{x},
13178			ISA:      []string{"SSE4.1"},
13179		}, nil
13180	}
13181	return nil, errors.New("PMOVZXBW: bad operands")
13182}
13183
13184// PMOVZXDQ: Move Packed Doubleword Integers to Quadword Integers with Zero Extension.
13185//
13186// Forms:
13187//
13188// 	PMOVZXDQ xmm xmm
13189// 	PMOVZXDQ m64 xmm
13190func PMOVZXDQ(mx, x operand.Op) (*intrep.Instruction, error) {
13191	switch {
13192	case operand.IsXMM(mx) && operand.IsXMM(x):
13193		return &intrep.Instruction{
13194			Opcode:   "PMOVZXDQ",
13195			Operands: []operand.Op{mx, x},
13196			Inputs:   []operand.Op{mx},
13197			Outputs:  []operand.Op{x},
13198			ISA:      []string{"SSE4.1"},
13199		}, nil
13200	case operand.IsM64(mx) && operand.IsXMM(x):
13201		return &intrep.Instruction{
13202			Opcode:   "PMOVZXDQ",
13203			Operands: []operand.Op{mx, x},
13204			Inputs:   []operand.Op{mx},
13205			Outputs:  []operand.Op{x},
13206			ISA:      []string{"SSE4.1"},
13207		}, nil
13208	}
13209	return nil, errors.New("PMOVZXDQ: bad operands")
13210}
13211
13212// PMOVZXWD: Move Packed Word Integers to Doubleword Integers with Zero Extension.
13213//
13214// Forms:
13215//
13216// 	PMOVZXWD xmm xmm
13217// 	PMOVZXWD m64 xmm
13218func PMOVZXWD(mx, x operand.Op) (*intrep.Instruction, error) {
13219	switch {
13220	case operand.IsXMM(mx) && operand.IsXMM(x):
13221		return &intrep.Instruction{
13222			Opcode:   "PMOVZXWD",
13223			Operands: []operand.Op{mx, x},
13224			Inputs:   []operand.Op{mx},
13225			Outputs:  []operand.Op{x},
13226			ISA:      []string{"SSE4.1"},
13227		}, nil
13228	case operand.IsM64(mx) && operand.IsXMM(x):
13229		return &intrep.Instruction{
13230			Opcode:   "PMOVZXWD",
13231			Operands: []operand.Op{mx, x},
13232			Inputs:   []operand.Op{mx},
13233			Outputs:  []operand.Op{x},
13234			ISA:      []string{"SSE4.1"},
13235		}, nil
13236	}
13237	return nil, errors.New("PMOVZXWD: bad operands")
13238}
13239
13240// PMOVZXWQ: Move Packed Word Integers to Quadword Integers with Zero Extension.
13241//
13242// Forms:
13243//
13244// 	PMOVZXWQ xmm xmm
13245// 	PMOVZXWQ m32 xmm
13246func PMOVZXWQ(mx, x operand.Op) (*intrep.Instruction, error) {
13247	switch {
13248	case operand.IsXMM(mx) && operand.IsXMM(x):
13249		return &intrep.Instruction{
13250			Opcode:   "PMOVZXWQ",
13251			Operands: []operand.Op{mx, x},
13252			Inputs:   []operand.Op{mx},
13253			Outputs:  []operand.Op{x},
13254			ISA:      []string{"SSE4.1"},
13255		}, nil
13256	case operand.IsM32(mx) && operand.IsXMM(x):
13257		return &intrep.Instruction{
13258			Opcode:   "PMOVZXWQ",
13259			Operands: []operand.Op{mx, x},
13260			Inputs:   []operand.Op{mx},
13261			Outputs:  []operand.Op{x},
13262			ISA:      []string{"SSE4.1"},
13263		}, nil
13264	}
13265	return nil, errors.New("PMOVZXWQ: bad operands")
13266}
13267
13268// PMULDQ: Multiply Packed Signed Doubleword Integers and Store Quadword Result.
13269//
13270// Forms:
13271//
13272// 	PMULDQ xmm  xmm
13273// 	PMULDQ m128 xmm
13274func PMULDQ(mx, x operand.Op) (*intrep.Instruction, error) {
13275	switch {
13276	case operand.IsXMM(mx) && operand.IsXMM(x):
13277		return &intrep.Instruction{
13278			Opcode:   "PMULDQ",
13279			Operands: []operand.Op{mx, x},
13280			Inputs:   []operand.Op{mx, x},
13281			Outputs:  []operand.Op{x},
13282			ISA:      []string{"SSE4.1"},
13283		}, nil
13284	case operand.IsM128(mx) && operand.IsXMM(x):
13285		return &intrep.Instruction{
13286			Opcode:   "PMULDQ",
13287			Operands: []operand.Op{mx, x},
13288			Inputs:   []operand.Op{mx, x},
13289			Outputs:  []operand.Op{x},
13290			ISA:      []string{"SSE4.1"},
13291		}, nil
13292	}
13293	return nil, errors.New("PMULDQ: bad operands")
13294}
13295
13296// PMULHRSW: Packed Multiply Signed Word Integers and Store High Result with Round and Scale.
13297//
13298// Forms:
13299//
13300// 	PMULHRSW xmm  xmm
13301// 	PMULHRSW m128 xmm
13302func PMULHRSW(mx, x operand.Op) (*intrep.Instruction, error) {
13303	switch {
13304	case operand.IsXMM(mx) && operand.IsXMM(x):
13305		return &intrep.Instruction{
13306			Opcode:   "PMULHRSW",
13307			Operands: []operand.Op{mx, x},
13308			Inputs:   []operand.Op{mx, x},
13309			Outputs:  []operand.Op{x},
13310			ISA:      []string{"SSSE3"},
13311		}, nil
13312	case operand.IsM128(mx) && operand.IsXMM(x):
13313		return &intrep.Instruction{
13314			Opcode:   "PMULHRSW",
13315			Operands: []operand.Op{mx, x},
13316			Inputs:   []operand.Op{mx, x},
13317			Outputs:  []operand.Op{x},
13318			ISA:      []string{"SSSE3"},
13319		}, nil
13320	}
13321	return nil, errors.New("PMULHRSW: bad operands")
13322}
13323
13324// PMULHUW: Multiply Packed Unsigned Word Integers and Store High Result.
13325//
13326// Forms:
13327//
13328// 	PMULHUW xmm  xmm
13329// 	PMULHUW m128 xmm
13330func PMULHUW(mx, x operand.Op) (*intrep.Instruction, error) {
13331	switch {
13332	case operand.IsXMM(mx) && operand.IsXMM(x):
13333		return &intrep.Instruction{
13334			Opcode:   "PMULHUW",
13335			Operands: []operand.Op{mx, x},
13336			Inputs:   []operand.Op{mx, x},
13337			Outputs:  []operand.Op{x},
13338			ISA:      []string{"SSE2"},
13339		}, nil
13340	case operand.IsM128(mx) && operand.IsXMM(x):
13341		return &intrep.Instruction{
13342			Opcode:   "PMULHUW",
13343			Operands: []operand.Op{mx, x},
13344			Inputs:   []operand.Op{mx, x},
13345			Outputs:  []operand.Op{x},
13346			ISA:      []string{"SSE2"},
13347		}, nil
13348	}
13349	return nil, errors.New("PMULHUW: bad operands")
13350}
13351
13352// PMULHW: Multiply Packed Signed Word Integers and Store High Result.
13353//
13354// Forms:
13355//
13356// 	PMULHW xmm  xmm
13357// 	PMULHW m128 xmm
13358func PMULHW(mx, x operand.Op) (*intrep.Instruction, error) {
13359	switch {
13360	case operand.IsXMM(mx) && operand.IsXMM(x):
13361		return &intrep.Instruction{
13362			Opcode:   "PMULHW",
13363			Operands: []operand.Op{mx, x},
13364			Inputs:   []operand.Op{mx, x},
13365			Outputs:  []operand.Op{x},
13366			ISA:      []string{"SSE2"},
13367		}, nil
13368	case operand.IsM128(mx) && operand.IsXMM(x):
13369		return &intrep.Instruction{
13370			Opcode:   "PMULHW",
13371			Operands: []operand.Op{mx, x},
13372			Inputs:   []operand.Op{mx, x},
13373			Outputs:  []operand.Op{x},
13374			ISA:      []string{"SSE2"},
13375		}, nil
13376	}
13377	return nil, errors.New("PMULHW: bad operands")
13378}
13379
13380// PMULLD: Multiply Packed Signed Doubleword Integers and Store Low Result.
13381//
13382// Forms:
13383//
13384// 	PMULLD xmm  xmm
13385// 	PMULLD m128 xmm
13386func PMULLD(mx, x operand.Op) (*intrep.Instruction, error) {
13387	switch {
13388	case operand.IsXMM(mx) && operand.IsXMM(x):
13389		return &intrep.Instruction{
13390			Opcode:   "PMULLD",
13391			Operands: []operand.Op{mx, x},
13392			Inputs:   []operand.Op{mx, x},
13393			Outputs:  []operand.Op{x},
13394			ISA:      []string{"SSE4.1"},
13395		}, nil
13396	case operand.IsM128(mx) && operand.IsXMM(x):
13397		return &intrep.Instruction{
13398			Opcode:   "PMULLD",
13399			Operands: []operand.Op{mx, x},
13400			Inputs:   []operand.Op{mx, x},
13401			Outputs:  []operand.Op{x},
13402			ISA:      []string{"SSE4.1"},
13403		}, nil
13404	}
13405	return nil, errors.New("PMULLD: bad operands")
13406}
13407
13408// PMULLW: Multiply Packed Signed Word Integers and Store Low Result.
13409//
13410// Forms:
13411//
13412// 	PMULLW xmm  xmm
13413// 	PMULLW m128 xmm
13414func PMULLW(mx, x operand.Op) (*intrep.Instruction, error) {
13415	switch {
13416	case operand.IsXMM(mx) && operand.IsXMM(x):
13417		return &intrep.Instruction{
13418			Opcode:   "PMULLW",
13419			Operands: []operand.Op{mx, x},
13420			Inputs:   []operand.Op{mx, x},
13421			Outputs:  []operand.Op{x},
13422			ISA:      []string{"SSE2"},
13423		}, nil
13424	case operand.IsM128(mx) && operand.IsXMM(x):
13425		return &intrep.Instruction{
13426			Opcode:   "PMULLW",
13427			Operands: []operand.Op{mx, x},
13428			Inputs:   []operand.Op{mx, x},
13429			Outputs:  []operand.Op{x},
13430			ISA:      []string{"SSE2"},
13431		}, nil
13432	}
13433	return nil, errors.New("PMULLW: bad operands")
13434}
13435
13436// PMULULQ: Multiply Packed Unsigned Doubleword Integers.
13437//
13438// Forms:
13439//
13440// 	PMULULQ xmm  xmm
13441// 	PMULULQ m128 xmm
13442func PMULULQ(mx, x operand.Op) (*intrep.Instruction, error) {
13443	switch {
13444	case operand.IsXMM(mx) && operand.IsXMM(x):
13445		return &intrep.Instruction{
13446			Opcode:   "PMULULQ",
13447			Operands: []operand.Op{mx, x},
13448			Inputs:   []operand.Op{mx, x},
13449			Outputs:  []operand.Op{x},
13450			ISA:      []string{"SSE2"},
13451		}, nil
13452	case operand.IsM128(mx) && operand.IsXMM(x):
13453		return &intrep.Instruction{
13454			Opcode:   "PMULULQ",
13455			Operands: []operand.Op{mx, x},
13456			Inputs:   []operand.Op{mx, x},
13457			Outputs:  []operand.Op{x},
13458			ISA:      []string{"SSE2"},
13459		}, nil
13460	}
13461	return nil, errors.New("PMULULQ: bad operands")
13462}
13463
13464// POPCNTL: Count of Number of Bits Set to 1.
13465//
13466// Forms:
13467//
13468// 	POPCNTL r32 r32
13469// 	POPCNTL m32 r32
13470func POPCNTL(mr, r operand.Op) (*intrep.Instruction, error) {
13471	switch {
13472	case operand.IsR32(mr) && operand.IsR32(r):
13473		return &intrep.Instruction{
13474			Opcode:   "POPCNTL",
13475			Operands: []operand.Op{mr, r},
13476			Inputs:   []operand.Op{mr},
13477			Outputs:  []operand.Op{r},
13478			ISA:      []string{"POPCNT"},
13479		}, nil
13480	case operand.IsM32(mr) && operand.IsR32(r):
13481		return &intrep.Instruction{
13482			Opcode:   "POPCNTL",
13483			Operands: []operand.Op{mr, r},
13484			Inputs:   []operand.Op{mr},
13485			Outputs:  []operand.Op{r},
13486			ISA:      []string{"POPCNT"},
13487		}, nil
13488	}
13489	return nil, errors.New("POPCNTL: bad operands")
13490}
13491
13492// POPCNTQ: Count of Number of Bits Set to 1.
13493//
13494// Forms:
13495//
13496// 	POPCNTQ r64 r64
13497// 	POPCNTQ m64 r64
13498func POPCNTQ(mr, r operand.Op) (*intrep.Instruction, error) {
13499	switch {
13500	case operand.IsR64(mr) && operand.IsR64(r):
13501		return &intrep.Instruction{
13502			Opcode:   "POPCNTQ",
13503			Operands: []operand.Op{mr, r},
13504			Inputs:   []operand.Op{mr},
13505			Outputs:  []operand.Op{r},
13506			ISA:      []string{"POPCNT"},
13507		}, nil
13508	case operand.IsM64(mr) && operand.IsR64(r):
13509		return &intrep.Instruction{
13510			Opcode:   "POPCNTQ",
13511			Operands: []operand.Op{mr, r},
13512			Inputs:   []operand.Op{mr},
13513			Outputs:  []operand.Op{r},
13514			ISA:      []string{"POPCNT"},
13515		}, nil
13516	}
13517	return nil, errors.New("POPCNTQ: bad operands")
13518}
13519
13520// POPCNTW: Count of Number of Bits Set to 1.
13521//
13522// Forms:
13523//
13524// 	POPCNTW r16 r16
13525// 	POPCNTW m16 r16
13526func POPCNTW(mr, r operand.Op) (*intrep.Instruction, error) {
13527	switch {
13528	case operand.IsR16(mr) && operand.IsR16(r):
13529		return &intrep.Instruction{
13530			Opcode:   "POPCNTW",
13531			Operands: []operand.Op{mr, r},
13532			Inputs:   []operand.Op{mr},
13533			Outputs:  []operand.Op{r},
13534			ISA:      []string{"POPCNT"},
13535		}, nil
13536	case operand.IsM16(mr) && operand.IsR16(r):
13537		return &intrep.Instruction{
13538			Opcode:   "POPCNTW",
13539			Operands: []operand.Op{mr, r},
13540			Inputs:   []operand.Op{mr},
13541			Outputs:  []operand.Op{r},
13542			ISA:      []string{"POPCNT"},
13543		}, nil
13544	}
13545	return nil, errors.New("POPCNTW: bad operands")
13546}
13547
13548// POPQ: Pop a Value from the Stack.
13549//
13550// Forms:
13551//
13552// 	POPQ r64
13553// 	POPQ m64
13554func POPQ(mr operand.Op) (*intrep.Instruction, error) {
13555	switch {
13556	case operand.IsR64(mr):
13557		return &intrep.Instruction{
13558			Opcode:   "POPQ",
13559			Operands: []operand.Op{mr},
13560			Inputs:   []operand.Op{},
13561			Outputs:  []operand.Op{mr},
13562		}, nil
13563	case operand.IsM64(mr):
13564		return &intrep.Instruction{
13565			Opcode:   "POPQ",
13566			Operands: []operand.Op{mr},
13567			Inputs:   []operand.Op{},
13568			Outputs:  []operand.Op{mr},
13569		}, nil
13570	}
13571	return nil, errors.New("POPQ: bad operands")
13572}
13573
13574// POPW: Pop a Value from the Stack.
13575//
13576// Forms:
13577//
13578// 	POPW r16
13579// 	POPW m16
13580func POPW(mr operand.Op) (*intrep.Instruction, error) {
13581	switch {
13582	case operand.IsR16(mr):
13583		return &intrep.Instruction{
13584			Opcode:   "POPW",
13585			Operands: []operand.Op{mr},
13586			Inputs:   []operand.Op{},
13587			Outputs:  []operand.Op{mr},
13588		}, nil
13589	case operand.IsM16(mr):
13590		return &intrep.Instruction{
13591			Opcode:   "POPW",
13592			Operands: []operand.Op{mr},
13593			Inputs:   []operand.Op{},
13594			Outputs:  []operand.Op{mr},
13595		}, nil
13596	}
13597	return nil, errors.New("POPW: bad operands")
13598}
13599
13600// POR: Packed Bitwise Logical OR.
13601//
13602// Forms:
13603//
13604// 	POR xmm  xmm
13605// 	POR m128 xmm
13606func POR(mx, x operand.Op) (*intrep.Instruction, error) {
13607	switch {
13608	case operand.IsXMM(mx) && operand.IsXMM(x):
13609		return &intrep.Instruction{
13610			Opcode:   "POR",
13611			Operands: []operand.Op{mx, x},
13612			Inputs:   []operand.Op{mx, x},
13613			Outputs:  []operand.Op{x},
13614			ISA:      []string{"SSE2"},
13615		}, nil
13616	case operand.IsM128(mx) && operand.IsXMM(x):
13617		return &intrep.Instruction{
13618			Opcode:   "POR",
13619			Operands: []operand.Op{mx, x},
13620			Inputs:   []operand.Op{mx, x},
13621			Outputs:  []operand.Op{x},
13622			ISA:      []string{"SSE2"},
13623		}, nil
13624	}
13625	return nil, errors.New("POR: bad operands")
13626}
13627
13628// PREFETCHNTA: Prefetch Data Into Caches using NTA Hint.
13629//
13630// Forms:
13631//
13632// 	PREFETCHNTA m8
13633func PREFETCHNTA(m operand.Op) (*intrep.Instruction, error) {
13634	switch {
13635	case operand.IsM8(m):
13636		return &intrep.Instruction{
13637			Opcode:   "PREFETCHNTA",
13638			Operands: []operand.Op{m},
13639			Inputs:   []operand.Op{m},
13640			Outputs:  []operand.Op{},
13641			ISA:      []string{"MMX+"},
13642		}, nil
13643	}
13644	return nil, errors.New("PREFETCHNTA: bad operands")
13645}
13646
13647// PREFETCHT0: Prefetch Data Into Caches using T0 Hint.
13648//
13649// Forms:
13650//
13651// 	PREFETCHT0 m8
13652func PREFETCHT0(m operand.Op) (*intrep.Instruction, error) {
13653	switch {
13654	case operand.IsM8(m):
13655		return &intrep.Instruction{
13656			Opcode:   "PREFETCHT0",
13657			Operands: []operand.Op{m},
13658			Inputs:   []operand.Op{m},
13659			Outputs:  []operand.Op{},
13660			ISA:      []string{"MMX+"},
13661		}, nil
13662	}
13663	return nil, errors.New("PREFETCHT0: bad operands")
13664}
13665
13666// PREFETCHT1: Prefetch Data Into Caches using T1 Hint.
13667//
13668// Forms:
13669//
13670// 	PREFETCHT1 m8
13671func PREFETCHT1(m operand.Op) (*intrep.Instruction, error) {
13672	switch {
13673	case operand.IsM8(m):
13674		return &intrep.Instruction{
13675			Opcode:   "PREFETCHT1",
13676			Operands: []operand.Op{m},
13677			Inputs:   []operand.Op{m},
13678			Outputs:  []operand.Op{},
13679			ISA:      []string{"MMX+"},
13680		}, nil
13681	}
13682	return nil, errors.New("PREFETCHT1: bad operands")
13683}
13684
13685// PREFETCHT2: Prefetch Data Into Caches using T2 Hint.
13686//
13687// Forms:
13688//
13689// 	PREFETCHT2 m8
13690func PREFETCHT2(m operand.Op) (*intrep.Instruction, error) {
13691	switch {
13692	case operand.IsM8(m):
13693		return &intrep.Instruction{
13694			Opcode:   "PREFETCHT2",
13695			Operands: []operand.Op{m},
13696			Inputs:   []operand.Op{m},
13697			Outputs:  []operand.Op{},
13698			ISA:      []string{"MMX+"},
13699		}, nil
13700	}
13701	return nil, errors.New("PREFETCHT2: bad operands")
13702}
13703
13704// PSADBW: Compute Sum of Absolute Differences.
13705//
13706// Forms:
13707//
13708// 	PSADBW xmm  xmm
13709// 	PSADBW m128 xmm
13710func PSADBW(mx, x operand.Op) (*intrep.Instruction, error) {
13711	switch {
13712	case operand.IsXMM(mx) && operand.IsXMM(x):
13713		return &intrep.Instruction{
13714			Opcode:           "PSADBW",
13715			Operands:         []operand.Op{mx, x},
13716			Inputs:           []operand.Op{mx, x},
13717			Outputs:          []operand.Op{x},
13718			ISA:              []string{"SSE2"},
13719			CancellingInputs: true,
13720		}, nil
13721	case operand.IsM128(mx) && operand.IsXMM(x):
13722		return &intrep.Instruction{
13723			Opcode:   "PSADBW",
13724			Operands: []operand.Op{mx, x},
13725			Inputs:   []operand.Op{mx, x},
13726			Outputs:  []operand.Op{x},
13727			ISA:      []string{"SSE2"},
13728		}, nil
13729	}
13730	return nil, errors.New("PSADBW: bad operands")
13731}
13732
13733// PSHUFB: Packed Shuffle Bytes.
13734//
13735// Forms:
13736//
13737// 	PSHUFB xmm  xmm
13738// 	PSHUFB m128 xmm
13739func PSHUFB(mx, x operand.Op) (*intrep.Instruction, error) {
13740	switch {
13741	case operand.IsXMM(mx) && operand.IsXMM(x):
13742		return &intrep.Instruction{
13743			Opcode:   "PSHUFB",
13744			Operands: []operand.Op{mx, x},
13745			Inputs:   []operand.Op{mx, x},
13746			Outputs:  []operand.Op{x},
13747			ISA:      []string{"SSSE3"},
13748		}, nil
13749	case operand.IsM128(mx) && operand.IsXMM(x):
13750		return &intrep.Instruction{
13751			Opcode:   "PSHUFB",
13752			Operands: []operand.Op{mx, x},
13753			Inputs:   []operand.Op{mx, x},
13754			Outputs:  []operand.Op{x},
13755			ISA:      []string{"SSSE3"},
13756		}, nil
13757	}
13758	return nil, errors.New("PSHUFB: bad operands")
13759}
13760
13761// PSHUFD: Shuffle Packed Doublewords.
13762//
13763// Forms:
13764//
13765// 	PSHUFD imm8 xmm  xmm
13766// 	PSHUFD imm8 m128 xmm
13767func PSHUFD(i, mx, x operand.Op) (*intrep.Instruction, error) {
13768	switch {
13769	case operand.IsIMM8(i) && operand.IsXMM(mx) && operand.IsXMM(x):
13770		return &intrep.Instruction{
13771			Opcode:   "PSHUFD",
13772			Operands: []operand.Op{i, mx, x},
13773			Inputs:   []operand.Op{mx},
13774			Outputs:  []operand.Op{x},
13775			ISA:      []string{"SSE2"},
13776		}, nil
13777	case operand.IsIMM8(i) && operand.IsM128(mx) && operand.IsXMM(x):
13778		return &intrep.Instruction{
13779			Opcode:   "PSHUFD",
13780			Operands: []operand.Op{i, mx, x},
13781			Inputs:   []operand.Op{mx},
13782			Outputs:  []operand.Op{x},
13783			ISA:      []string{"SSE2"},
13784		}, nil
13785	}
13786	return nil, errors.New("PSHUFD: bad operands")
13787}
13788
13789// PSHUFHW: Shuffle Packed High Words.
13790//
13791// Forms:
13792//
13793// 	PSHUFHW imm8 xmm  xmm
13794// 	PSHUFHW imm8 m128 xmm
13795func PSHUFHW(i, mx, x operand.Op) (*intrep.Instruction, error) {
13796	switch {
13797	case operand.IsIMM8(i) && operand.IsXMM(mx) && operand.IsXMM(x):
13798		return &intrep.Instruction{
13799			Opcode:   "PSHUFHW",
13800			Operands: []operand.Op{i, mx, x},
13801			Inputs:   []operand.Op{mx, x},
13802			Outputs:  []operand.Op{x},
13803			ISA:      []string{"SSE2"},
13804		}, nil
13805	case operand.IsIMM8(i) && operand.IsM128(mx) && operand.IsXMM(x):
13806		return &intrep.Instruction{
13807			Opcode:   "PSHUFHW",
13808			Operands: []operand.Op{i, mx, x},
13809			Inputs:   []operand.Op{mx, x},
13810			Outputs:  []operand.Op{x},
13811			ISA:      []string{"SSE2"},
13812		}, nil
13813	}
13814	return nil, errors.New("PSHUFHW: bad operands")
13815}
13816
13817// PSHUFL: Shuffle Packed Doublewords.
13818//
13819// Forms:
13820//
13821// 	PSHUFL imm8 xmm  xmm
13822// 	PSHUFL imm8 m128 xmm
13823func PSHUFL(i, mx, x operand.Op) (*intrep.Instruction, error) {
13824	switch {
13825	case operand.IsIMM8(i) && operand.IsXMM(mx) && operand.IsXMM(x):
13826		return &intrep.Instruction{
13827			Opcode:   "PSHUFL",
13828			Operands: []operand.Op{i, mx, x},
13829			Inputs:   []operand.Op{mx},
13830			Outputs:  []operand.Op{x},
13831			ISA:      []string{"SSE2"},
13832		}, nil
13833	case operand.IsIMM8(i) && operand.IsM128(mx) && operand.IsXMM(x):
13834		return &intrep.Instruction{
13835			Opcode:   "PSHUFL",
13836			Operands: []operand.Op{i, mx, x},
13837			Inputs:   []operand.Op{mx},
13838			Outputs:  []operand.Op{x},
13839			ISA:      []string{"SSE2"},
13840		}, nil
13841	}
13842	return nil, errors.New("PSHUFL: bad operands")
13843}
13844
13845// PSHUFLW: Shuffle Packed Low Words.
13846//
13847// Forms:
13848//
13849// 	PSHUFLW imm8 xmm  xmm
13850// 	PSHUFLW imm8 m128 xmm
13851func PSHUFLW(i, mx, x operand.Op) (*intrep.Instruction, error) {
13852	switch {
13853	case operand.IsIMM8(i) && operand.IsXMM(mx) && operand.IsXMM(x):
13854		return &intrep.Instruction{
13855			Opcode:   "PSHUFLW",
13856			Operands: []operand.Op{i, mx, x},
13857			Inputs:   []operand.Op{mx, x},
13858			Outputs:  []operand.Op{x},
13859			ISA:      []string{"SSE2"},
13860		}, nil
13861	case operand.IsIMM8(i) && operand.IsM128(mx) && operand.IsXMM(x):
13862		return &intrep.Instruction{
13863			Opcode:   "PSHUFLW",
13864			Operands: []operand.Op{i, mx, x},
13865			Inputs:   []operand.Op{mx, x},
13866			Outputs:  []operand.Op{x},
13867			ISA:      []string{"SSE2"},
13868		}, nil
13869	}
13870	return nil, errors.New("PSHUFLW: bad operands")
13871}
13872
13873// PSIGNB: Packed Sign of Byte Integers.
13874//
13875// Forms:
13876//
13877// 	PSIGNB xmm  xmm
13878// 	PSIGNB m128 xmm
13879func PSIGNB(mx, x operand.Op) (*intrep.Instruction, error) {
13880	switch {
13881	case operand.IsXMM(mx) && operand.IsXMM(x):
13882		return &intrep.Instruction{
13883			Opcode:   "PSIGNB",
13884			Operands: []operand.Op{mx, x},
13885			Inputs:   []operand.Op{mx},
13886			Outputs:  []operand.Op{x},
13887			ISA:      []string{"SSSE3"},
13888		}, nil
13889	case operand.IsM128(mx) && operand.IsXMM(x):
13890		return &intrep.Instruction{
13891			Opcode:   "PSIGNB",
13892			Operands: []operand.Op{mx, x},
13893			Inputs:   []operand.Op{mx},
13894			Outputs:  []operand.Op{x},
13895			ISA:      []string{"SSSE3"},
13896		}, nil
13897	}
13898	return nil, errors.New("PSIGNB: bad operands")
13899}
13900
13901// PSIGND: Packed Sign of Doubleword Integers.
13902//
13903// Forms:
13904//
13905// 	PSIGND xmm  xmm
13906// 	PSIGND m128 xmm
13907func PSIGND(mx, x operand.Op) (*intrep.Instruction, error) {
13908	switch {
13909	case operand.IsXMM(mx) && operand.IsXMM(x):
13910		return &intrep.Instruction{
13911			Opcode:   "PSIGND",
13912			Operands: []operand.Op{mx, x},
13913			Inputs:   []operand.Op{mx},
13914			Outputs:  []operand.Op{x},
13915			ISA:      []string{"SSSE3"},
13916		}, nil
13917	case operand.IsM128(mx) && operand.IsXMM(x):
13918		return &intrep.Instruction{
13919			Opcode:   "PSIGND",
13920			Operands: []operand.Op{mx, x},
13921			Inputs:   []operand.Op{mx},
13922			Outputs:  []operand.Op{x},
13923			ISA:      []string{"SSSE3"},
13924		}, nil
13925	}
13926	return nil, errors.New("PSIGND: bad operands")
13927}
13928
13929// PSIGNW: Packed Sign of Word Integers.
13930//
13931// Forms:
13932//
13933// 	PSIGNW xmm  xmm
13934// 	PSIGNW m128 xmm
13935func PSIGNW(mx, x operand.Op) (*intrep.Instruction, error) {
13936	switch {
13937	case operand.IsXMM(mx) && operand.IsXMM(x):
13938		return &intrep.Instruction{
13939			Opcode:   "PSIGNW",
13940			Operands: []operand.Op{mx, x},
13941			Inputs:   []operand.Op{mx},
13942			Outputs:  []operand.Op{x},
13943			ISA:      []string{"SSSE3"},
13944		}, nil
13945	case operand.IsM128(mx) && operand.IsXMM(x):
13946		return &intrep.Instruction{
13947			Opcode:   "PSIGNW",
13948			Operands: []operand.Op{mx, x},
13949			Inputs:   []operand.Op{mx},
13950			Outputs:  []operand.Op{x},
13951			ISA:      []string{"SSSE3"},
13952		}, nil
13953	}
13954	return nil, errors.New("PSIGNW: bad operands")
13955}
13956
13957// PSLLDQ: Shift Packed Double Quadword Left Logical.
13958//
13959// Forms:
13960//
13961// 	PSLLDQ imm8 xmm
13962func PSLLDQ(i, x operand.Op) (*intrep.Instruction, error) {
13963	switch {
13964	case operand.IsIMM8(i) && operand.IsXMM(x):
13965		return &intrep.Instruction{
13966			Opcode:   "PSLLDQ",
13967			Operands: []operand.Op{i, x},
13968			Inputs:   []operand.Op{x},
13969			Outputs:  []operand.Op{x},
13970			ISA:      []string{"SSE2"},
13971		}, nil
13972	}
13973	return nil, errors.New("PSLLDQ: bad operands")
13974}
13975
13976// PSLLL: Shift Packed Doubleword Data Left Logical.
13977//
13978// Forms:
13979//
13980// 	PSLLL imm8 xmm
13981// 	PSLLL xmm  xmm
13982// 	PSLLL m128 xmm
13983func PSLLL(imx, x operand.Op) (*intrep.Instruction, error) {
13984	switch {
13985	case operand.IsIMM8(imx) && operand.IsXMM(x):
13986		return &intrep.Instruction{
13987			Opcode:   "PSLLL",
13988			Operands: []operand.Op{imx, x},
13989			Inputs:   []operand.Op{x},
13990			Outputs:  []operand.Op{x},
13991			ISA:      []string{"SSE2"},
13992		}, nil
13993	case operand.IsXMM(imx) && operand.IsXMM(x):
13994		return &intrep.Instruction{
13995			Opcode:   "PSLLL",
13996			Operands: []operand.Op{imx, x},
13997			Inputs:   []operand.Op{imx, x},
13998			Outputs:  []operand.Op{x},
13999			ISA:      []string{"SSE2"},
14000		}, nil
14001	case operand.IsM128(imx) && operand.IsXMM(x):
14002		return &intrep.Instruction{
14003			Opcode:   "PSLLL",
14004			Operands: []operand.Op{imx, x},
14005			Inputs:   []operand.Op{imx, x},
14006			Outputs:  []operand.Op{x},
14007			ISA:      []string{"SSE2"},
14008		}, nil
14009	}
14010	return nil, errors.New("PSLLL: bad operands")
14011}
14012
14013// PSLLO: Shift Packed Double Quadword Left Logical.
14014//
14015// Forms:
14016//
14017// 	PSLLO imm8 xmm
14018func PSLLO(i, x operand.Op) (*intrep.Instruction, error) {
14019	switch {
14020	case operand.IsIMM8(i) && operand.IsXMM(x):
14021		return &intrep.Instruction{
14022			Opcode:   "PSLLO",
14023			Operands: []operand.Op{i, x},
14024			Inputs:   []operand.Op{x},
14025			Outputs:  []operand.Op{x},
14026			ISA:      []string{"SSE2"},
14027		}, nil
14028	}
14029	return nil, errors.New("PSLLO: bad operands")
14030}
14031
14032// PSLLQ: Shift Packed Quadword Data Left Logical.
14033//
14034// Forms:
14035//
14036// 	PSLLQ imm8 xmm
14037// 	PSLLQ xmm  xmm
14038// 	PSLLQ m128 xmm
14039func PSLLQ(imx, x operand.Op) (*intrep.Instruction, error) {
14040	switch {
14041	case operand.IsIMM8(imx) && operand.IsXMM(x):
14042		return &intrep.Instruction{
14043			Opcode:   "PSLLQ",
14044			Operands: []operand.Op{imx, x},
14045			Inputs:   []operand.Op{x},
14046			Outputs:  []operand.Op{x},
14047			ISA:      []string{"SSE2"},
14048		}, nil
14049	case operand.IsXMM(imx) && operand.IsXMM(x):
14050		return &intrep.Instruction{
14051			Opcode:   "PSLLQ",
14052			Operands: []operand.Op{imx, x},
14053			Inputs:   []operand.Op{imx, x},
14054			Outputs:  []operand.Op{x},
14055			ISA:      []string{"SSE2"},
14056		}, nil
14057	case operand.IsM128(imx) && operand.IsXMM(x):
14058		return &intrep.Instruction{
14059			Opcode:   "PSLLQ",
14060			Operands: []operand.Op{imx, x},
14061			Inputs:   []operand.Op{imx, x},
14062			Outputs:  []operand.Op{x},
14063			ISA:      []string{"SSE2"},
14064		}, nil
14065	}
14066	return nil, errors.New("PSLLQ: bad operands")
14067}
14068
14069// PSLLW: Shift Packed Word Data Left Logical.
14070//
14071// Forms:
14072//
14073// 	PSLLW imm8 xmm
14074// 	PSLLW xmm  xmm
14075// 	PSLLW m128 xmm
14076func PSLLW(imx, x operand.Op) (*intrep.Instruction, error) {
14077	switch {
14078	case operand.IsIMM8(imx) && operand.IsXMM(x):
14079		return &intrep.Instruction{
14080			Opcode:   "PSLLW",
14081			Operands: []operand.Op{imx, x},
14082			Inputs:   []operand.Op{x},
14083			Outputs:  []operand.Op{x},
14084			ISA:      []string{"SSE2"},
14085		}, nil
14086	case operand.IsXMM(imx) && operand.IsXMM(x):
14087		return &intrep.Instruction{
14088			Opcode:   "PSLLW",
14089			Operands: []operand.Op{imx, x},
14090			Inputs:   []operand.Op{imx, x},
14091			Outputs:  []operand.Op{x},
14092			ISA:      []string{"SSE2"},
14093		}, nil
14094	case operand.IsM128(imx) && operand.IsXMM(x):
14095		return &intrep.Instruction{
14096			Opcode:   "PSLLW",
14097			Operands: []operand.Op{imx, x},
14098			Inputs:   []operand.Op{imx, x},
14099			Outputs:  []operand.Op{x},
14100			ISA:      []string{"SSE2"},
14101		}, nil
14102	}
14103	return nil, errors.New("PSLLW: bad operands")
14104}
14105
14106// PSRAL: Shift Packed Doubleword Data Right Arithmetic.
14107//
14108// Forms:
14109//
14110// 	PSRAL imm8 xmm
14111// 	PSRAL xmm  xmm
14112// 	PSRAL m128 xmm
14113func PSRAL(imx, x operand.Op) (*intrep.Instruction, error) {
14114	switch {
14115	case operand.IsIMM8(imx) && operand.IsXMM(x):
14116		return &intrep.Instruction{
14117			Opcode:   "PSRAL",
14118			Operands: []operand.Op{imx, x},
14119			Inputs:   []operand.Op{x},
14120			Outputs:  []operand.Op{x},
14121			ISA:      []string{"SSE2"},
14122		}, nil
14123	case operand.IsXMM(imx) && operand.IsXMM(x):
14124		return &intrep.Instruction{
14125			Opcode:   "PSRAL",
14126			Operands: []operand.Op{imx, x},
14127			Inputs:   []operand.Op{imx, x},
14128			Outputs:  []operand.Op{x},
14129			ISA:      []string{"SSE2"},
14130		}, nil
14131	case operand.IsM128(imx) && operand.IsXMM(x):
14132		return &intrep.Instruction{
14133			Opcode:   "PSRAL",
14134			Operands: []operand.Op{imx, x},
14135			Inputs:   []operand.Op{imx, x},
14136			Outputs:  []operand.Op{x},
14137			ISA:      []string{"SSE2"},
14138		}, nil
14139	}
14140	return nil, errors.New("PSRAL: bad operands")
14141}
14142
14143// PSRAW: Shift Packed Word Data Right Arithmetic.
14144//
14145// Forms:
14146//
14147// 	PSRAW imm8 xmm
14148// 	PSRAW xmm  xmm
14149// 	PSRAW m128 xmm
14150func PSRAW(imx, x operand.Op) (*intrep.Instruction, error) {
14151	switch {
14152	case operand.IsIMM8(imx) && operand.IsXMM(x):
14153		return &intrep.Instruction{
14154			Opcode:   "PSRAW",
14155			Operands: []operand.Op{imx, x},
14156			Inputs:   []operand.Op{x},
14157			Outputs:  []operand.Op{x},
14158			ISA:      []string{"SSE2"},
14159		}, nil
14160	case operand.IsXMM(imx) && operand.IsXMM(x):
14161		return &intrep.Instruction{
14162			Opcode:   "PSRAW",
14163			Operands: []operand.Op{imx, x},
14164			Inputs:   []operand.Op{imx, x},
14165			Outputs:  []operand.Op{x},
14166			ISA:      []string{"SSE2"},
14167		}, nil
14168	case operand.IsM128(imx) && operand.IsXMM(x):
14169		return &intrep.Instruction{
14170			Opcode:   "PSRAW",
14171			Operands: []operand.Op{imx, x},
14172			Inputs:   []operand.Op{imx, x},
14173			Outputs:  []operand.Op{x},
14174			ISA:      []string{"SSE2"},
14175		}, nil
14176	}
14177	return nil, errors.New("PSRAW: bad operands")
14178}
14179
14180// PSRLDQ: Shift Packed Double Quadword Right Logical.
14181//
14182// Forms:
14183//
14184// 	PSRLDQ imm8 xmm
14185func PSRLDQ(i, x operand.Op) (*intrep.Instruction, error) {
14186	switch {
14187	case operand.IsIMM8(i) && operand.IsXMM(x):
14188		return &intrep.Instruction{
14189			Opcode:   "PSRLDQ",
14190			Operands: []operand.Op{i, x},
14191			Inputs:   []operand.Op{x},
14192			Outputs:  []operand.Op{x},
14193			ISA:      []string{"SSE2"},
14194		}, nil
14195	}
14196	return nil, errors.New("PSRLDQ: bad operands")
14197}
14198
14199// PSRLL: Shift Packed Doubleword Data Right Logical.
14200//
14201// Forms:
14202//
14203// 	PSRLL imm8 xmm
14204// 	PSRLL xmm  xmm
14205// 	PSRLL m128 xmm
14206func PSRLL(imx, x operand.Op) (*intrep.Instruction, error) {
14207	switch {
14208	case operand.IsIMM8(imx) && operand.IsXMM(x):
14209		return &intrep.Instruction{
14210			Opcode:   "PSRLL",
14211			Operands: []operand.Op{imx, x},
14212			Inputs:   []operand.Op{x},
14213			Outputs:  []operand.Op{x},
14214			ISA:      []string{"SSE2"},
14215		}, nil
14216	case operand.IsXMM(imx) && operand.IsXMM(x):
14217		return &intrep.Instruction{
14218			Opcode:   "PSRLL",
14219			Operands: []operand.Op{imx, x},
14220			Inputs:   []operand.Op{imx, x},
14221			Outputs:  []operand.Op{x},
14222			ISA:      []string{"SSE2"},
14223		}, nil
14224	case operand.IsM128(imx) && operand.IsXMM(x):
14225		return &intrep.Instruction{
14226			Opcode:   "PSRLL",
14227			Operands: []operand.Op{imx, x},
14228			Inputs:   []operand.Op{imx, x},
14229			Outputs:  []operand.Op{x},
14230			ISA:      []string{"SSE2"},
14231		}, nil
14232	}
14233	return nil, errors.New("PSRLL: bad operands")
14234}
14235
14236// PSRLO: Shift Packed Double Quadword Right Logical.
14237//
14238// Forms:
14239//
14240// 	PSRLO imm8 xmm
14241func PSRLO(i, x operand.Op) (*intrep.Instruction, error) {
14242	switch {
14243	case operand.IsIMM8(i) && operand.IsXMM(x):
14244		return &intrep.Instruction{
14245			Opcode:   "PSRLO",
14246			Operands: []operand.Op{i, x},
14247			Inputs:   []operand.Op{x},
14248			Outputs:  []operand.Op{x},
14249			ISA:      []string{"SSE2"},
14250		}, nil
14251	}
14252	return nil, errors.New("PSRLO: bad operands")
14253}
14254
14255// PSRLQ: Shift Packed Quadword Data Right Logical.
14256//
14257// Forms:
14258//
14259// 	PSRLQ imm8 xmm
14260// 	PSRLQ xmm  xmm
14261// 	PSRLQ m128 xmm
14262func PSRLQ(imx, x operand.Op) (*intrep.Instruction, error) {
14263	switch {
14264	case operand.IsIMM8(imx) && operand.IsXMM(x):
14265		return &intrep.Instruction{
14266			Opcode:   "PSRLQ",
14267			Operands: []operand.Op{imx, x},
14268			Inputs:   []operand.Op{x},
14269			Outputs:  []operand.Op{x},
14270			ISA:      []string{"SSE2"},
14271		}, nil
14272	case operand.IsXMM(imx) && operand.IsXMM(x):
14273		return &intrep.Instruction{
14274			Opcode:   "PSRLQ",
14275			Operands: []operand.Op{imx, x},
14276			Inputs:   []operand.Op{imx, x},
14277			Outputs:  []operand.Op{x},
14278			ISA:      []string{"SSE2"},
14279		}, nil
14280	case operand.IsM128(imx) && operand.IsXMM(x):
14281		return &intrep.Instruction{
14282			Opcode:   "PSRLQ",
14283			Operands: []operand.Op{imx, x},
14284			Inputs:   []operand.Op{imx, x},
14285			Outputs:  []operand.Op{x},
14286			ISA:      []string{"SSE2"},
14287		}, nil
14288	}
14289	return nil, errors.New("PSRLQ: bad operands")
14290}
14291
14292// PSRLW: Shift Packed Word Data Right Logical.
14293//
14294// Forms:
14295//
14296// 	PSRLW imm8 xmm
14297// 	PSRLW xmm  xmm
14298// 	PSRLW m128 xmm
14299func PSRLW(imx, x operand.Op) (*intrep.Instruction, error) {
14300	switch {
14301	case operand.IsIMM8(imx) && operand.IsXMM(x):
14302		return &intrep.Instruction{
14303			Opcode:   "PSRLW",
14304			Operands: []operand.Op{imx, x},
14305			Inputs:   []operand.Op{x},
14306			Outputs:  []operand.Op{x},
14307			ISA:      []string{"SSE2"},
14308		}, nil
14309	case operand.IsXMM(imx) && operand.IsXMM(x):
14310		return &intrep.Instruction{
14311			Opcode:   "PSRLW",
14312			Operands: []operand.Op{imx, x},
14313			Inputs:   []operand.Op{imx, x},
14314			Outputs:  []operand.Op{x},
14315			ISA:      []string{"SSE2"},
14316		}, nil
14317	case operand.IsM128(imx) && operand.IsXMM(x):
14318		return &intrep.Instruction{
14319			Opcode:   "PSRLW",
14320			Operands: []operand.Op{imx, x},
14321			Inputs:   []operand.Op{imx, x},
14322			Outputs:  []operand.Op{x},
14323			ISA:      []string{"SSE2"},
14324		}, nil
14325	}
14326	return nil, errors.New("PSRLW: bad operands")
14327}
14328
14329// PSUBB: Subtract Packed Byte Integers.
14330//
14331// Forms:
14332//
14333// 	PSUBB xmm  xmm
14334// 	PSUBB m128 xmm
14335func PSUBB(mx, x operand.Op) (*intrep.Instruction, error) {
14336	switch {
14337	case operand.IsXMM(mx) && operand.IsXMM(x):
14338		return &intrep.Instruction{
14339			Opcode:           "PSUBB",
14340			Operands:         []operand.Op{mx, x},
14341			Inputs:           []operand.Op{mx, x},
14342			Outputs:          []operand.Op{x},
14343			ISA:              []string{"SSE2"},
14344			CancellingInputs: true,
14345		}, nil
14346	case operand.IsM128(mx) && operand.IsXMM(x):
14347		return &intrep.Instruction{
14348			Opcode:   "PSUBB",
14349			Operands: []operand.Op{mx, x},
14350			Inputs:   []operand.Op{mx, x},
14351			Outputs:  []operand.Op{x},
14352			ISA:      []string{"SSE2"},
14353		}, nil
14354	}
14355	return nil, errors.New("PSUBB: bad operands")
14356}
14357
14358// PSUBL: Subtract Packed Doubleword Integers.
14359//
14360// Forms:
14361//
14362// 	PSUBL xmm  xmm
14363// 	PSUBL m128 xmm
14364func PSUBL(mx, x operand.Op) (*intrep.Instruction, error) {
14365	switch {
14366	case operand.IsXMM(mx) && operand.IsXMM(x):
14367		return &intrep.Instruction{
14368			Opcode:           "PSUBL",
14369			Operands:         []operand.Op{mx, x},
14370			Inputs:           []operand.Op{mx, x},
14371			Outputs:          []operand.Op{x},
14372			ISA:              []string{"SSE2"},
14373			CancellingInputs: true,
14374		}, nil
14375	case operand.IsM128(mx) && operand.IsXMM(x):
14376		return &intrep.Instruction{
14377			Opcode:   "PSUBL",
14378			Operands: []operand.Op{mx, x},
14379			Inputs:   []operand.Op{mx, x},
14380			Outputs:  []operand.Op{x},
14381			ISA:      []string{"SSE2"},
14382		}, nil
14383	}
14384	return nil, errors.New("PSUBL: bad operands")
14385}
14386
14387// PSUBQ: Subtract Packed Quadword Integers.
14388//
14389// Forms:
14390//
14391// 	PSUBQ xmm  xmm
14392// 	PSUBQ m128 xmm
14393func PSUBQ(mx, x operand.Op) (*intrep.Instruction, error) {
14394	switch {
14395	case operand.IsXMM(mx) && operand.IsXMM(x):
14396		return &intrep.Instruction{
14397			Opcode:           "PSUBQ",
14398			Operands:         []operand.Op{mx, x},
14399			Inputs:           []operand.Op{mx, x},
14400			Outputs:          []operand.Op{x},
14401			ISA:              []string{"SSE2"},
14402			CancellingInputs: true,
14403		}, nil
14404	case operand.IsM128(mx) && operand.IsXMM(x):
14405		return &intrep.Instruction{
14406			Opcode:   "PSUBQ",
14407			Operands: []operand.Op{mx, x},
14408			Inputs:   []operand.Op{mx, x},
14409			Outputs:  []operand.Op{x},
14410			ISA:      []string{"SSE2"},
14411		}, nil
14412	}
14413	return nil, errors.New("PSUBQ: bad operands")
14414}
14415
14416// PSUBSB: Subtract Packed Signed Byte Integers with Signed Saturation.
14417//
14418// Forms:
14419//
14420// 	PSUBSB xmm  xmm
14421// 	PSUBSB m128 xmm
14422func PSUBSB(mx, x operand.Op) (*intrep.Instruction, error) {
14423	switch {
14424	case operand.IsXMM(mx) && operand.IsXMM(x):
14425		return &intrep.Instruction{
14426			Opcode:           "PSUBSB",
14427			Operands:         []operand.Op{mx, x},
14428			Inputs:           []operand.Op{mx, x},
14429			Outputs:          []operand.Op{x},
14430			ISA:              []string{"SSE2"},
14431			CancellingInputs: true,
14432		}, nil
14433	case operand.IsM128(mx) && operand.IsXMM(x):
14434		return &intrep.Instruction{
14435			Opcode:   "PSUBSB",
14436			Operands: []operand.Op{mx, x},
14437			Inputs:   []operand.Op{mx, x},
14438			Outputs:  []operand.Op{x},
14439			ISA:      []string{"SSE2"},
14440		}, nil
14441	}
14442	return nil, errors.New("PSUBSB: bad operands")
14443}
14444
14445// PSUBSW: Subtract Packed Signed Word Integers with Signed Saturation.
14446//
14447// Forms:
14448//
14449// 	PSUBSW xmm  xmm
14450// 	PSUBSW m128 xmm
14451func PSUBSW(mx, x operand.Op) (*intrep.Instruction, error) {
14452	switch {
14453	case operand.IsXMM(mx) && operand.IsXMM(x):
14454		return &intrep.Instruction{
14455			Opcode:           "PSUBSW",
14456			Operands:         []operand.Op{mx, x},
14457			Inputs:           []operand.Op{mx, x},
14458			Outputs:          []operand.Op{x},
14459			ISA:              []string{"SSE2"},
14460			CancellingInputs: true,
14461		}, nil
14462	case operand.IsM128(mx) && operand.IsXMM(x):
14463		return &intrep.Instruction{
14464			Opcode:   "PSUBSW",
14465			Operands: []operand.Op{mx, x},
14466			Inputs:   []operand.Op{mx, x},
14467			Outputs:  []operand.Op{x},
14468			ISA:      []string{"SSE2"},
14469		}, nil
14470	}
14471	return nil, errors.New("PSUBSW: bad operands")
14472}
14473
14474// PSUBUSB: Subtract Packed Unsigned Byte Integers with Unsigned Saturation.
14475//
14476// Forms:
14477//
14478// 	PSUBUSB xmm  xmm
14479// 	PSUBUSB m128 xmm
14480func PSUBUSB(mx, x operand.Op) (*intrep.Instruction, error) {
14481	switch {
14482	case operand.IsXMM(mx) && operand.IsXMM(x):
14483		return &intrep.Instruction{
14484			Opcode:           "PSUBUSB",
14485			Operands:         []operand.Op{mx, x},
14486			Inputs:           []operand.Op{mx, x},
14487			Outputs:          []operand.Op{x},
14488			ISA:              []string{"SSE2"},
14489			CancellingInputs: true,
14490		}, nil
14491	case operand.IsM128(mx) && operand.IsXMM(x):
14492		return &intrep.Instruction{
14493			Opcode:   "PSUBUSB",
14494			Operands: []operand.Op{mx, x},
14495			Inputs:   []operand.Op{mx, x},
14496			Outputs:  []operand.Op{x},
14497			ISA:      []string{"SSE2"},
14498		}, nil
14499	}
14500	return nil, errors.New("PSUBUSB: bad operands")
14501}
14502
14503// PSUBUSW: Subtract Packed Unsigned Word Integers with Unsigned Saturation.
14504//
14505// Forms:
14506//
14507// 	PSUBUSW xmm  xmm
14508// 	PSUBUSW m128 xmm
14509func PSUBUSW(mx, x operand.Op) (*intrep.Instruction, error) {
14510	switch {
14511	case operand.IsXMM(mx) && operand.IsXMM(x):
14512		return &intrep.Instruction{
14513			Opcode:           "PSUBUSW",
14514			Operands:         []operand.Op{mx, x},
14515			Inputs:           []operand.Op{mx, x},
14516			Outputs:          []operand.Op{x},
14517			ISA:              []string{"SSE2"},
14518			CancellingInputs: true,
14519		}, nil
14520	case operand.IsM128(mx) && operand.IsXMM(x):
14521		return &intrep.Instruction{
14522			Opcode:   "PSUBUSW",
14523			Operands: []operand.Op{mx, x},
14524			Inputs:   []operand.Op{mx, x},
14525			Outputs:  []operand.Op{x},
14526			ISA:      []string{"SSE2"},
14527		}, nil
14528	}
14529	return nil, errors.New("PSUBUSW: bad operands")
14530}
14531
14532// PSUBW: Subtract Packed Word Integers.
14533//
14534// Forms:
14535//
14536// 	PSUBW xmm  xmm
14537// 	PSUBW m128 xmm
14538func PSUBW(mx, x operand.Op) (*intrep.Instruction, error) {
14539	switch {
14540	case operand.IsXMM(mx) && operand.IsXMM(x):
14541		return &intrep.Instruction{
14542			Opcode:           "PSUBW",
14543			Operands:         []operand.Op{mx, x},
14544			Inputs:           []operand.Op{mx, x},
14545			Outputs:          []operand.Op{x},
14546			ISA:              []string{"SSE2"},
14547			CancellingInputs: true,
14548		}, nil
14549	case operand.IsM128(mx) && operand.IsXMM(x):
14550		return &intrep.Instruction{
14551			Opcode:   "PSUBW",
14552			Operands: []operand.Op{mx, x},
14553			Inputs:   []operand.Op{mx, x},
14554			Outputs:  []operand.Op{x},
14555			ISA:      []string{"SSE2"},
14556		}, nil
14557	}
14558	return nil, errors.New("PSUBW: bad operands")
14559}
14560
14561// PTEST: Packed Logical Compare.
14562//
14563// Forms:
14564//
14565// 	PTEST xmm  xmm
14566// 	PTEST m128 xmm
14567func PTEST(mx, x operand.Op) (*intrep.Instruction, error) {
14568	switch {
14569	case operand.IsXMM(mx) && operand.IsXMM(x):
14570		return &intrep.Instruction{
14571			Opcode:   "PTEST",
14572			Operands: []operand.Op{mx, x},
14573			Inputs:   []operand.Op{mx, x},
14574			Outputs:  []operand.Op{},
14575			ISA:      []string{"SSE4.1"},
14576		}, nil
14577	case operand.IsM128(mx) && operand.IsXMM(x):
14578		return &intrep.Instruction{
14579			Opcode:   "PTEST",
14580			Operands: []operand.Op{mx, x},
14581			Inputs:   []operand.Op{mx, x},
14582			Outputs:  []operand.Op{},
14583			ISA:      []string{"SSE4.1"},
14584		}, nil
14585	}
14586	return nil, errors.New("PTEST: bad operands")
14587}
14588
14589// PUNPCKHBW: Unpack and Interleave High-Order Bytes into Words.
14590//
14591// Forms:
14592//
14593// 	PUNPCKHBW xmm  xmm
14594// 	PUNPCKHBW m128 xmm
14595func PUNPCKHBW(mx, x operand.Op) (*intrep.Instruction, error) {
14596	switch {
14597	case operand.IsXMM(mx) && operand.IsXMM(x):
14598		return &intrep.Instruction{
14599			Opcode:   "PUNPCKHBW",
14600			Operands: []operand.Op{mx, x},
14601			Inputs:   []operand.Op{mx, x},
14602			Outputs:  []operand.Op{x},
14603			ISA:      []string{"SSE2"},
14604		}, nil
14605	case operand.IsM128(mx) && operand.IsXMM(x):
14606		return &intrep.Instruction{
14607			Opcode:   "PUNPCKHBW",
14608			Operands: []operand.Op{mx, x},
14609			Inputs:   []operand.Op{mx, x},
14610			Outputs:  []operand.Op{x},
14611			ISA:      []string{"SSE2"},
14612		}, nil
14613	}
14614	return nil, errors.New("PUNPCKHBW: bad operands")
14615}
14616
14617// PUNPCKHLQ: Unpack and Interleave High-Order Doublewords into Quadwords.
14618//
14619// Forms:
14620//
14621// 	PUNPCKHLQ xmm  xmm
14622// 	PUNPCKHLQ m128 xmm
14623func PUNPCKHLQ(mx, x operand.Op) (*intrep.Instruction, error) {
14624	switch {
14625	case operand.IsXMM(mx) && operand.IsXMM(x):
14626		return &intrep.Instruction{
14627			Opcode:   "PUNPCKHLQ",
14628			Operands: []operand.Op{mx, x},
14629			Inputs:   []operand.Op{mx, x},
14630			Outputs:  []operand.Op{x},
14631			ISA:      []string{"SSE2"},
14632		}, nil
14633	case operand.IsM128(mx) && operand.IsXMM(x):
14634		return &intrep.Instruction{
14635			Opcode:   "PUNPCKHLQ",
14636			Operands: []operand.Op{mx, x},
14637			Inputs:   []operand.Op{mx, x},
14638			Outputs:  []operand.Op{x},
14639			ISA:      []string{"SSE2"},
14640		}, nil
14641	}
14642	return nil, errors.New("PUNPCKHLQ: bad operands")
14643}
14644
14645// PUNPCKHQDQ: Unpack and Interleave High-Order Quadwords into Double Quadwords.
14646//
14647// Forms:
14648//
14649// 	PUNPCKHQDQ xmm  xmm
14650// 	PUNPCKHQDQ m128 xmm
14651func PUNPCKHQDQ(mx, x operand.Op) (*intrep.Instruction, error) {
14652	switch {
14653	case operand.IsXMM(mx) && operand.IsXMM(x):
14654		return &intrep.Instruction{
14655			Opcode:   "PUNPCKHQDQ",
14656			Operands: []operand.Op{mx, x},
14657			Inputs:   []operand.Op{mx, x},
14658			Outputs:  []operand.Op{x},
14659			ISA:      []string{"SSE2"},
14660		}, nil
14661	case operand.IsM128(mx) && operand.IsXMM(x):
14662		return &intrep.Instruction{
14663			Opcode:   "PUNPCKHQDQ",
14664			Operands: []operand.Op{mx, x},
14665			Inputs:   []operand.Op{mx, x},
14666			Outputs:  []operand.Op{x},
14667			ISA:      []string{"SSE2"},
14668		}, nil
14669	}
14670	return nil, errors.New("PUNPCKHQDQ: bad operands")
14671}
14672
14673// PUNPCKHWL: Unpack and Interleave High-Order Words into Doublewords.
14674//
14675// Forms:
14676//
14677// 	PUNPCKHWL xmm  xmm
14678// 	PUNPCKHWL m128 xmm
14679func PUNPCKHWL(mx, x operand.Op) (*intrep.Instruction, error) {
14680	switch {
14681	case operand.IsXMM(mx) && operand.IsXMM(x):
14682		return &intrep.Instruction{
14683			Opcode:   "PUNPCKHWL",
14684			Operands: []operand.Op{mx, x},
14685			Inputs:   []operand.Op{mx, x},
14686			Outputs:  []operand.Op{x},
14687			ISA:      []string{"SSE2"},
14688		}, nil
14689	case operand.IsM128(mx) && operand.IsXMM(x):
14690		return &intrep.Instruction{
14691			Opcode:   "PUNPCKHWL",
14692			Operands: []operand.Op{mx, x},
14693			Inputs:   []operand.Op{mx, x},
14694			Outputs:  []operand.Op{x},
14695			ISA:      []string{"SSE2"},
14696		}, nil
14697	}
14698	return nil, errors.New("PUNPCKHWL: bad operands")
14699}
14700
14701// PUNPCKLBW: Unpack and Interleave Low-Order Bytes into Words.
14702//
14703// Forms:
14704//
14705// 	PUNPCKLBW xmm  xmm
14706// 	PUNPCKLBW m128 xmm
14707func PUNPCKLBW(mx, x operand.Op) (*intrep.Instruction, error) {
14708	switch {
14709	case operand.IsXMM(mx) && operand.IsXMM(x):
14710		return &intrep.Instruction{
14711			Opcode:   "PUNPCKLBW",
14712			Operands: []operand.Op{mx, x},
14713			Inputs:   []operand.Op{mx, x},
14714			Outputs:  []operand.Op{x},
14715			ISA:      []string{"SSE2"},
14716		}, nil
14717	case operand.IsM128(mx) && operand.IsXMM(x):
14718		return &intrep.Instruction{
14719			Opcode:   "PUNPCKLBW",
14720			Operands: []operand.Op{mx, x},
14721			Inputs:   []operand.Op{mx, x},
14722			Outputs:  []operand.Op{x},
14723			ISA:      []string{"SSE2"},
14724		}, nil
14725	}
14726	return nil, errors.New("PUNPCKLBW: bad operands")
14727}
14728
14729// PUNPCKLLQ: Unpack and Interleave Low-Order Doublewords into Quadwords.
14730//
14731// Forms:
14732//
14733// 	PUNPCKLLQ xmm  xmm
14734// 	PUNPCKLLQ m128 xmm
14735func PUNPCKLLQ(mx, x operand.Op) (*intrep.Instruction, error) {
14736	switch {
14737	case operand.IsXMM(mx) && operand.IsXMM(x):
14738		return &intrep.Instruction{
14739			Opcode:   "PUNPCKLLQ",
14740			Operands: []operand.Op{mx, x},
14741			Inputs:   []operand.Op{mx, x},
14742			Outputs:  []operand.Op{x},
14743			ISA:      []string{"SSE2"},
14744		}, nil
14745	case operand.IsM128(mx) && operand.IsXMM(x):
14746		return &intrep.Instruction{
14747			Opcode:   "PUNPCKLLQ",
14748			Operands: []operand.Op{mx, x},
14749			Inputs:   []operand.Op{mx, x},
14750			Outputs:  []operand.Op{x},
14751			ISA:      []string{"SSE2"},
14752		}, nil
14753	}
14754	return nil, errors.New("PUNPCKLLQ: bad operands")
14755}
14756
14757// PUNPCKLQDQ: Unpack and Interleave Low-Order Quadwords into Double Quadwords.
14758//
14759// Forms:
14760//
14761// 	PUNPCKLQDQ xmm  xmm
14762// 	PUNPCKLQDQ m128 xmm
14763func PUNPCKLQDQ(mx, x operand.Op) (*intrep.Instruction, error) {
14764	switch {
14765	case operand.IsXMM(mx) && operand.IsXMM(x):
14766		return &intrep.Instruction{
14767			Opcode:   "PUNPCKLQDQ",
14768			Operands: []operand.Op{mx, x},
14769			Inputs:   []operand.Op{mx, x},
14770			Outputs:  []operand.Op{x},
14771			ISA:      []string{"SSE2"},
14772		}, nil
14773	case operand.IsM128(mx) && operand.IsXMM(x):
14774		return &intrep.Instruction{
14775			Opcode:   "PUNPCKLQDQ",
14776			Operands: []operand.Op{mx, x},
14777			Inputs:   []operand.Op{mx, x},
14778			Outputs:  []operand.Op{x},
14779			ISA:      []string{"SSE2"},
14780		}, nil
14781	}
14782	return nil, errors.New("PUNPCKLQDQ: bad operands")
14783}
14784
14785// PUNPCKLWL: Unpack and Interleave Low-Order Words into Doublewords.
14786//
14787// Forms:
14788//
14789// 	PUNPCKLWL xmm  xmm
14790// 	PUNPCKLWL m128 xmm
14791func PUNPCKLWL(mx, x operand.Op) (*intrep.Instruction, error) {
14792	switch {
14793	case operand.IsXMM(mx) && operand.IsXMM(x):
14794		return &intrep.Instruction{
14795			Opcode:   "PUNPCKLWL",
14796			Operands: []operand.Op{mx, x},
14797			Inputs:   []operand.Op{mx, x},
14798			Outputs:  []operand.Op{x},
14799			ISA:      []string{"SSE2"},
14800		}, nil
14801	case operand.IsM128(mx) && operand.IsXMM(x):
14802		return &intrep.Instruction{
14803			Opcode:   "PUNPCKLWL",
14804			Operands: []operand.Op{mx, x},
14805			Inputs:   []operand.Op{mx, x},
14806			Outputs:  []operand.Op{x},
14807			ISA:      []string{"SSE2"},
14808		}, nil
14809	}
14810	return nil, errors.New("PUNPCKLWL: bad operands")
14811}
14812
14813// PUSHQ: Push Value Onto the Stack.
14814//
14815// Forms:
14816//
14817// 	PUSHQ imm8
14818// 	PUSHQ imm32
14819// 	PUSHQ r64
14820// 	PUSHQ m64
14821func PUSHQ(imr operand.Op) (*intrep.Instruction, error) {
14822	switch {
14823	case operand.IsIMM8(imr):
14824		return &intrep.Instruction{
14825			Opcode:   "PUSHQ",
14826			Operands: []operand.Op{imr},
14827			Inputs:   []operand.Op{},
14828			Outputs:  []operand.Op{},
14829		}, nil
14830	case operand.IsIMM32(imr):
14831		return &intrep.Instruction{
14832			Opcode:   "PUSHQ",
14833			Operands: []operand.Op{imr},
14834			Inputs:   []operand.Op{},
14835			Outputs:  []operand.Op{},
14836		}, nil
14837	case operand.IsR64(imr):
14838		return &intrep.Instruction{
14839			Opcode:   "PUSHQ",
14840			Operands: []operand.Op{imr},
14841			Inputs:   []operand.Op{imr},
14842			Outputs:  []operand.Op{},
14843		}, nil
14844	case operand.IsM64(imr):
14845		return &intrep.Instruction{
14846			Opcode:   "PUSHQ",
14847			Operands: []operand.Op{imr},
14848			Inputs:   []operand.Op{imr},
14849			Outputs:  []operand.Op{},
14850		}, nil
14851	}
14852	return nil, errors.New("PUSHQ: bad operands")
14853}
14854
14855// PUSHW: Push Value Onto the Stack.
14856//
14857// Forms:
14858//
14859// 	PUSHW r16
14860// 	PUSHW m16
14861func PUSHW(mr operand.Op) (*intrep.Instruction, error) {
14862	switch {
14863	case operand.IsR16(mr):
14864		return &intrep.Instruction{
14865			Opcode:   "PUSHW",
14866			Operands: []operand.Op{mr},
14867			Inputs:   []operand.Op{mr},
14868			Outputs:  []operand.Op{},
14869		}, nil
14870	case operand.IsM16(mr):
14871		return &intrep.Instruction{
14872			Opcode:   "PUSHW",
14873			Operands: []operand.Op{mr},
14874			Inputs:   []operand.Op{mr},
14875			Outputs:  []operand.Op{},
14876		}, nil
14877	}
14878	return nil, errors.New("PUSHW: bad operands")
14879}
14880
14881// PXOR: Packed Bitwise Logical Exclusive OR.
14882//
14883// Forms:
14884//
14885// 	PXOR xmm  xmm
14886// 	PXOR m128 xmm
14887func PXOR(mx, x operand.Op) (*intrep.Instruction, error) {
14888	switch {
14889	case operand.IsXMM(mx) && operand.IsXMM(x):
14890		return &intrep.Instruction{
14891			Opcode:           "PXOR",
14892			Operands:         []operand.Op{mx, x},
14893			Inputs:           []operand.Op{mx, x},
14894			Outputs:          []operand.Op{x},
14895			ISA:              []string{"SSE2"},
14896			CancellingInputs: true,
14897		}, nil
14898	case operand.IsM128(mx) && operand.IsXMM(x):
14899		return &intrep.Instruction{
14900			Opcode:   "PXOR",
14901			Operands: []operand.Op{mx, x},
14902			Inputs:   []operand.Op{mx, x},
14903			Outputs:  []operand.Op{x},
14904			ISA:      []string{"SSE2"},
14905		}, nil
14906	}
14907	return nil, errors.New("PXOR: bad operands")
14908}
14909
14910// RCLB: Rotate Left through Carry Flag.
14911//
14912// Forms:
14913//
14914// 	RCLB 1    r8
14915// 	RCLB imm8 r8
14916// 	RCLB cl   r8
14917// 	RCLB 1    m8
14918// 	RCLB imm8 m8
14919// 	RCLB cl   m8
14920func RCLB(ci, mr operand.Op) (*intrep.Instruction, error) {
14921	switch {
14922	case operand.Is1(ci) && operand.IsR8(mr):
14923		return &intrep.Instruction{
14924			Opcode:   "RCLB",
14925			Operands: []operand.Op{ci, mr},
14926			Inputs:   []operand.Op{mr},
14927			Outputs:  []operand.Op{mr},
14928		}, nil
14929	case operand.IsIMM8(ci) && operand.IsR8(mr):
14930		return &intrep.Instruction{
14931			Opcode:   "RCLB",
14932			Operands: []operand.Op{ci, mr},
14933			Inputs:   []operand.Op{mr},
14934			Outputs:  []operand.Op{mr},
14935		}, nil
14936	case operand.IsCL(ci) && operand.IsR8(mr):
14937		return &intrep.Instruction{
14938			Opcode:   "RCLB",
14939			Operands: []operand.Op{ci, mr},
14940			Inputs:   []operand.Op{ci, mr},
14941			Outputs:  []operand.Op{mr},
14942		}, nil
14943	case operand.Is1(ci) && operand.IsM8(mr):
14944		return &intrep.Instruction{
14945			Opcode:   "RCLB",
14946			Operands: []operand.Op{ci, mr},
14947			Inputs:   []operand.Op{mr},
14948			Outputs:  []operand.Op{mr},
14949		}, nil
14950	case operand.IsIMM8(ci) && operand.IsM8(mr):
14951		return &intrep.Instruction{
14952			Opcode:   "RCLB",
14953			Operands: []operand.Op{ci, mr},
14954			Inputs:   []operand.Op{mr},
14955			Outputs:  []operand.Op{mr},
14956		}, nil
14957	case operand.IsCL(ci) && operand.IsM8(mr):
14958		return &intrep.Instruction{
14959			Opcode:   "RCLB",
14960			Operands: []operand.Op{ci, mr},
14961			Inputs:   []operand.Op{ci, mr},
14962			Outputs:  []operand.Op{mr},
14963		}, nil
14964	}
14965	return nil, errors.New("RCLB: bad operands")
14966}
14967
14968// RCLL: Rotate Left through Carry Flag.
14969//
14970// Forms:
14971//
14972// 	RCLL 1    r32
14973// 	RCLL imm8 r32
14974// 	RCLL cl   r32
14975// 	RCLL 1    m32
14976// 	RCLL imm8 m32
14977// 	RCLL cl   m32
14978func RCLL(ci, mr operand.Op) (*intrep.Instruction, error) {
14979	switch {
14980	case operand.Is1(ci) && operand.IsR32(mr):
14981		return &intrep.Instruction{
14982			Opcode:   "RCLL",
14983			Operands: []operand.Op{ci, mr},
14984			Inputs:   []operand.Op{mr},
14985			Outputs:  []operand.Op{mr},
14986		}, nil
14987	case operand.IsIMM8(ci) && operand.IsR32(mr):
14988		return &intrep.Instruction{
14989			Opcode:   "RCLL",
14990			Operands: []operand.Op{ci, mr},
14991			Inputs:   []operand.Op{mr},
14992			Outputs:  []operand.Op{mr},
14993		}, nil
14994	case operand.IsCL(ci) && operand.IsR32(mr):
14995		return &intrep.Instruction{
14996			Opcode:   "RCLL",
14997			Operands: []operand.Op{ci, mr},
14998			Inputs:   []operand.Op{ci, mr},
14999			Outputs:  []operand.Op{mr},
15000		}, nil
15001	case operand.Is1(ci) && operand.IsM32(mr):
15002		return &intrep.Instruction{
15003			Opcode:   "RCLL",
15004			Operands: []operand.Op{ci, mr},
15005			Inputs:   []operand.Op{mr},
15006			Outputs:  []operand.Op{mr},
15007		}, nil
15008	case operand.IsIMM8(ci) && operand.IsM32(mr):
15009		return &intrep.Instruction{
15010			Opcode:   "RCLL",
15011			Operands: []operand.Op{ci, mr},
15012			Inputs:   []operand.Op{mr},
15013			Outputs:  []operand.Op{mr},
15014		}, nil
15015	case operand.IsCL(ci) && operand.IsM32(mr):
15016		return &intrep.Instruction{
15017			Opcode:   "RCLL",
15018			Operands: []operand.Op{ci, mr},
15019			Inputs:   []operand.Op{ci, mr},
15020			Outputs:  []operand.Op{mr},
15021		}, nil
15022	}
15023	return nil, errors.New("RCLL: bad operands")
15024}
15025
15026// RCLQ: Rotate Left through Carry Flag.
15027//
15028// Forms:
15029//
15030// 	RCLQ 1    r64
15031// 	RCLQ imm8 r64
15032// 	RCLQ cl   r64
15033// 	RCLQ 1    m64
15034// 	RCLQ imm8 m64
15035// 	RCLQ cl   m64
15036func RCLQ(ci, mr operand.Op) (*intrep.Instruction, error) {
15037	switch {
15038	case operand.Is1(ci) && operand.IsR64(mr):
15039		return &intrep.Instruction{
15040			Opcode:   "RCLQ",
15041			Operands: []operand.Op{ci, mr},
15042			Inputs:   []operand.Op{mr},
15043			Outputs:  []operand.Op{mr},
15044		}, nil
15045	case operand.IsIMM8(ci) && operand.IsR64(mr):
15046		return &intrep.Instruction{
15047			Opcode:   "RCLQ",
15048			Operands: []operand.Op{ci, mr},
15049			Inputs:   []operand.Op{mr},
15050			Outputs:  []operand.Op{mr},
15051		}, nil
15052	case operand.IsCL(ci) && operand.IsR64(mr):
15053		return &intrep.Instruction{
15054			Opcode:   "RCLQ",
15055			Operands: []operand.Op{ci, mr},
15056			Inputs:   []operand.Op{ci, mr},
15057			Outputs:  []operand.Op{mr},
15058		}, nil
15059	case operand.Is1(ci) && operand.IsM64(mr):
15060		return &intrep.Instruction{
15061			Opcode:   "RCLQ",
15062			Operands: []operand.Op{ci, mr},
15063			Inputs:   []operand.Op{mr},
15064			Outputs:  []operand.Op{mr},
15065		}, nil
15066	case operand.IsIMM8(ci) && operand.IsM64(mr):
15067		return &intrep.Instruction{
15068			Opcode:   "RCLQ",
15069			Operands: []operand.Op{ci, mr},
15070			Inputs:   []operand.Op{mr},
15071			Outputs:  []operand.Op{mr},
15072		}, nil
15073	case operand.IsCL(ci) && operand.IsM64(mr):
15074		return &intrep.Instruction{
15075			Opcode:   "RCLQ",
15076			Operands: []operand.Op{ci, mr},
15077			Inputs:   []operand.Op{ci, mr},
15078			Outputs:  []operand.Op{mr},
15079		}, nil
15080	}
15081	return nil, errors.New("RCLQ: bad operands")
15082}
15083
15084// RCLW: Rotate Left through Carry Flag.
15085//
15086// Forms:
15087//
15088// 	RCLW 1    r16
15089// 	RCLW imm8 r16
15090// 	RCLW cl   r16
15091// 	RCLW 1    m16
15092// 	RCLW imm8 m16
15093// 	RCLW cl   m16
15094func RCLW(ci, mr operand.Op) (*intrep.Instruction, error) {
15095	switch {
15096	case operand.Is1(ci) && operand.IsR16(mr):
15097		return &intrep.Instruction{
15098			Opcode:   "RCLW",
15099			Operands: []operand.Op{ci, mr},
15100			Inputs:   []operand.Op{mr},
15101			Outputs:  []operand.Op{mr},
15102		}, nil
15103	case operand.IsIMM8(ci) && operand.IsR16(mr):
15104		return &intrep.Instruction{
15105			Opcode:   "RCLW",
15106			Operands: []operand.Op{ci, mr},
15107			Inputs:   []operand.Op{mr},
15108			Outputs:  []operand.Op{mr},
15109		}, nil
15110	case operand.IsCL(ci) && operand.IsR16(mr):
15111		return &intrep.Instruction{
15112			Opcode:   "RCLW",
15113			Operands: []operand.Op{ci, mr},
15114			Inputs:   []operand.Op{ci, mr},
15115			Outputs:  []operand.Op{mr},
15116		}, nil
15117	case operand.Is1(ci) && operand.IsM16(mr):
15118		return &intrep.Instruction{
15119			Opcode:   "RCLW",
15120			Operands: []operand.Op{ci, mr},
15121			Inputs:   []operand.Op{mr},
15122			Outputs:  []operand.Op{mr},
15123		}, nil
15124	case operand.IsIMM8(ci) && operand.IsM16(mr):
15125		return &intrep.Instruction{
15126			Opcode:   "RCLW",
15127			Operands: []operand.Op{ci, mr},
15128			Inputs:   []operand.Op{mr},
15129			Outputs:  []operand.Op{mr},
15130		}, nil
15131	case operand.IsCL(ci) && operand.IsM16(mr):
15132		return &intrep.Instruction{
15133			Opcode:   "RCLW",
15134			Operands: []operand.Op{ci, mr},
15135			Inputs:   []operand.Op{ci, mr},
15136			Outputs:  []operand.Op{mr},
15137		}, nil
15138	}
15139	return nil, errors.New("RCLW: bad operands")
15140}
15141
15142// RCPPS: Compute Approximate Reciprocals of Packed Single-Precision Floating-Point Values.
15143//
15144// Forms:
15145//
15146// 	RCPPS xmm  xmm
15147// 	RCPPS m128 xmm
15148func RCPPS(mx, x operand.Op) (*intrep.Instruction, error) {
15149	switch {
15150	case operand.IsXMM(mx) && operand.IsXMM(x):
15151		return &intrep.Instruction{
15152			Opcode:   "RCPPS",
15153			Operands: []operand.Op{mx, x},
15154			Inputs:   []operand.Op{mx},
15155			Outputs:  []operand.Op{x},
15156			ISA:      []string{"SSE"},
15157		}, nil
15158	case operand.IsM128(mx) && operand.IsXMM(x):
15159		return &intrep.Instruction{
15160			Opcode:   "RCPPS",
15161			Operands: []operand.Op{mx, x},
15162			Inputs:   []operand.Op{mx},
15163			Outputs:  []operand.Op{x},
15164			ISA:      []string{"SSE"},
15165		}, nil
15166	}
15167	return nil, errors.New("RCPPS: bad operands")
15168}
15169
15170// RCPSS: Compute Approximate Reciprocal of Scalar Single-Precision Floating-Point Values.
15171//
15172// Forms:
15173//
15174// 	RCPSS xmm xmm
15175// 	RCPSS m32 xmm
15176func RCPSS(mx, x operand.Op) (*intrep.Instruction, error) {
15177	switch {
15178	case operand.IsXMM(mx) && operand.IsXMM(x):
15179		return &intrep.Instruction{
15180			Opcode:   "RCPSS",
15181			Operands: []operand.Op{mx, x},
15182			Inputs:   []operand.Op{mx, x},
15183			Outputs:  []operand.Op{x},
15184			ISA:      []string{"SSE"},
15185		}, nil
15186	case operand.IsM32(mx) && operand.IsXMM(x):
15187		return &intrep.Instruction{
15188			Opcode:   "RCPSS",
15189			Operands: []operand.Op{mx, x},
15190			Inputs:   []operand.Op{mx, x},
15191			Outputs:  []operand.Op{x},
15192			ISA:      []string{"SSE"},
15193		}, nil
15194	}
15195	return nil, errors.New("RCPSS: bad operands")
15196}
15197
15198// RCRB: Rotate Right through Carry Flag.
15199//
15200// Forms:
15201//
15202// 	RCRB 1    r8
15203// 	RCRB imm8 r8
15204// 	RCRB cl   r8
15205// 	RCRB 1    m8
15206// 	RCRB imm8 m8
15207// 	RCRB cl   m8
15208func RCRB(ci, mr operand.Op) (*intrep.Instruction, error) {
15209	switch {
15210	case operand.Is1(ci) && operand.IsR8(mr):
15211		return &intrep.Instruction{
15212			Opcode:   "RCRB",
15213			Operands: []operand.Op{ci, mr},
15214			Inputs:   []operand.Op{mr},
15215			Outputs:  []operand.Op{mr},
15216		}, nil
15217	case operand.IsIMM8(ci) && operand.IsR8(mr):
15218		return &intrep.Instruction{
15219			Opcode:   "RCRB",
15220			Operands: []operand.Op{ci, mr},
15221			Inputs:   []operand.Op{mr},
15222			Outputs:  []operand.Op{mr},
15223		}, nil
15224	case operand.IsCL(ci) && operand.IsR8(mr):
15225		return &intrep.Instruction{
15226			Opcode:   "RCRB",
15227			Operands: []operand.Op{ci, mr},
15228			Inputs:   []operand.Op{ci, mr},
15229			Outputs:  []operand.Op{mr},
15230		}, nil
15231	case operand.Is1(ci) && operand.IsM8(mr):
15232		return &intrep.Instruction{
15233			Opcode:   "RCRB",
15234			Operands: []operand.Op{ci, mr},
15235			Inputs:   []operand.Op{mr},
15236			Outputs:  []operand.Op{mr},
15237		}, nil
15238	case operand.IsIMM8(ci) && operand.IsM8(mr):
15239		return &intrep.Instruction{
15240			Opcode:   "RCRB",
15241			Operands: []operand.Op{ci, mr},
15242			Inputs:   []operand.Op{mr},
15243			Outputs:  []operand.Op{mr},
15244		}, nil
15245	case operand.IsCL(ci) && operand.IsM8(mr):
15246		return &intrep.Instruction{
15247			Opcode:   "RCRB",
15248			Operands: []operand.Op{ci, mr},
15249			Inputs:   []operand.Op{ci, mr},
15250			Outputs:  []operand.Op{mr},
15251		}, nil
15252	}
15253	return nil, errors.New("RCRB: bad operands")
15254}
15255
15256// RCRL: Rotate Right through Carry Flag.
15257//
15258// Forms:
15259//
15260// 	RCRL 1    r32
15261// 	RCRL imm8 r32
15262// 	RCRL cl   r32
15263// 	RCRL 1    m32
15264// 	RCRL imm8 m32
15265// 	RCRL cl   m32
15266func RCRL(ci, mr operand.Op) (*intrep.Instruction, error) {
15267	switch {
15268	case operand.Is1(ci) && operand.IsR32(mr):
15269		return &intrep.Instruction{
15270			Opcode:   "RCRL",
15271			Operands: []operand.Op{ci, mr},
15272			Inputs:   []operand.Op{mr},
15273			Outputs:  []operand.Op{mr},
15274		}, nil
15275	case operand.IsIMM8(ci) && operand.IsR32(mr):
15276		return &intrep.Instruction{
15277			Opcode:   "RCRL",
15278			Operands: []operand.Op{ci, mr},
15279			Inputs:   []operand.Op{mr},
15280			Outputs:  []operand.Op{mr},
15281		}, nil
15282	case operand.IsCL(ci) && operand.IsR32(mr):
15283		return &intrep.Instruction{
15284			Opcode:   "RCRL",
15285			Operands: []operand.Op{ci, mr},
15286			Inputs:   []operand.Op{ci, mr},
15287			Outputs:  []operand.Op{mr},
15288		}, nil
15289	case operand.Is1(ci) && operand.IsM32(mr):
15290		return &intrep.Instruction{
15291			Opcode:   "RCRL",
15292			Operands: []operand.Op{ci, mr},
15293			Inputs:   []operand.Op{mr},
15294			Outputs:  []operand.Op{mr},
15295		}, nil
15296	case operand.IsIMM8(ci) && operand.IsM32(mr):
15297		return &intrep.Instruction{
15298			Opcode:   "RCRL",
15299			Operands: []operand.Op{ci, mr},
15300			Inputs:   []operand.Op{mr},
15301			Outputs:  []operand.Op{mr},
15302		}, nil
15303	case operand.IsCL(ci) && operand.IsM32(mr):
15304		return &intrep.Instruction{
15305			Opcode:   "RCRL",
15306			Operands: []operand.Op{ci, mr},
15307			Inputs:   []operand.Op{ci, mr},
15308			Outputs:  []operand.Op{mr},
15309		}, nil
15310	}
15311	return nil, errors.New("RCRL: bad operands")
15312}
15313
15314// RCRQ: Rotate Right through Carry Flag.
15315//
15316// Forms:
15317//
15318// 	RCRQ 1    r64
15319// 	RCRQ imm8 r64
15320// 	RCRQ cl   r64
15321// 	RCRQ 1    m64
15322// 	RCRQ imm8 m64
15323// 	RCRQ cl   m64
15324func RCRQ(ci, mr operand.Op) (*intrep.Instruction, error) {
15325	switch {
15326	case operand.Is1(ci) && operand.IsR64(mr):
15327		return &intrep.Instruction{
15328			Opcode:   "RCRQ",
15329			Operands: []operand.Op{ci, mr},
15330			Inputs:   []operand.Op{mr},
15331			Outputs:  []operand.Op{mr},
15332		}, nil
15333	case operand.IsIMM8(ci) && operand.IsR64(mr):
15334		return &intrep.Instruction{
15335			Opcode:   "RCRQ",
15336			Operands: []operand.Op{ci, mr},
15337			Inputs:   []operand.Op{mr},
15338			Outputs:  []operand.Op{mr},
15339		}, nil
15340	case operand.IsCL(ci) && operand.IsR64(mr):
15341		return &intrep.Instruction{
15342			Opcode:   "RCRQ",
15343			Operands: []operand.Op{ci, mr},
15344			Inputs:   []operand.Op{ci, mr},
15345			Outputs:  []operand.Op{mr},
15346		}, nil
15347	case operand.Is1(ci) && operand.IsM64(mr):
15348		return &intrep.Instruction{
15349			Opcode:   "RCRQ",
15350			Operands: []operand.Op{ci, mr},
15351			Inputs:   []operand.Op{mr},
15352			Outputs:  []operand.Op{mr},
15353		}, nil
15354	case operand.IsIMM8(ci) && operand.IsM64(mr):
15355		return &intrep.Instruction{
15356			Opcode:   "RCRQ",
15357			Operands: []operand.Op{ci, mr},
15358			Inputs:   []operand.Op{mr},
15359			Outputs:  []operand.Op{mr},
15360		}, nil
15361	case operand.IsCL(ci) && operand.IsM64(mr):
15362		return &intrep.Instruction{
15363			Opcode:   "RCRQ",
15364			Operands: []operand.Op{ci, mr},
15365			Inputs:   []operand.Op{ci, mr},
15366			Outputs:  []operand.Op{mr},
15367		}, nil
15368	}
15369	return nil, errors.New("RCRQ: bad operands")
15370}
15371
15372// RCRW: Rotate Right through Carry Flag.
15373//
15374// Forms:
15375//
15376// 	RCRW 1    r16
15377// 	RCRW imm8 r16
15378// 	RCRW cl   r16
15379// 	RCRW 1    m16
15380// 	RCRW imm8 m16
15381// 	RCRW cl   m16
15382func RCRW(ci, mr operand.Op) (*intrep.Instruction, error) {
15383	switch {
15384	case operand.Is1(ci) && operand.IsR16(mr):
15385		return &intrep.Instruction{
15386			Opcode:   "RCRW",
15387			Operands: []operand.Op{ci, mr},
15388			Inputs:   []operand.Op{mr},
15389			Outputs:  []operand.Op{mr},
15390		}, nil
15391	case operand.IsIMM8(ci) && operand.IsR16(mr):
15392		return &intrep.Instruction{
15393			Opcode:   "RCRW",
15394			Operands: []operand.Op{ci, mr},
15395			Inputs:   []operand.Op{mr},
15396			Outputs:  []operand.Op{mr},
15397		}, nil
15398	case operand.IsCL(ci) && operand.IsR16(mr):
15399		return &intrep.Instruction{
15400			Opcode:   "RCRW",
15401			Operands: []operand.Op{ci, mr},
15402			Inputs:   []operand.Op{ci, mr},
15403			Outputs:  []operand.Op{mr},
15404		}, nil
15405	case operand.Is1(ci) && operand.IsM16(mr):
15406		return &intrep.Instruction{
15407			Opcode:   "RCRW",
15408			Operands: []operand.Op{ci, mr},
15409			Inputs:   []operand.Op{mr},
15410			Outputs:  []operand.Op{mr},
15411		}, nil
15412	case operand.IsIMM8(ci) && operand.IsM16(mr):
15413		return &intrep.Instruction{
15414			Opcode:   "RCRW",
15415			Operands: []operand.Op{ci, mr},
15416			Inputs:   []operand.Op{mr},
15417			Outputs:  []operand.Op{mr},
15418		}, nil
15419	case operand.IsCL(ci) && operand.IsM16(mr):
15420		return &intrep.Instruction{
15421			Opcode:   "RCRW",
15422			Operands: []operand.Op{ci, mr},
15423			Inputs:   []operand.Op{ci, mr},
15424			Outputs:  []operand.Op{mr},
15425		}, nil
15426	}
15427	return nil, errors.New("RCRW: bad operands")
15428}
15429
15430// RDRANDL: Read Random Number.
15431//
15432// Forms:
15433//
15434// 	RDRANDL r32
15435func RDRANDL(r operand.Op) (*intrep.Instruction, error) {
15436	switch {
15437	case operand.IsR32(r):
15438		return &intrep.Instruction{
15439			Opcode:   "RDRANDL",
15440			Operands: []operand.Op{r},
15441			Inputs:   []operand.Op{},
15442			Outputs:  []operand.Op{r},
15443			ISA:      []string{"RDRAND"},
15444		}, nil
15445	}
15446	return nil, errors.New("RDRANDL: bad operands")
15447}
15448
15449// RDRANDQ: Read Random Number.
15450//
15451// Forms:
15452//
15453// 	RDRANDQ r64
15454func RDRANDQ(r operand.Op) (*intrep.Instruction, error) {
15455	switch {
15456	case operand.IsR64(r):
15457		return &intrep.Instruction{
15458			Opcode:   "RDRANDQ",
15459			Operands: []operand.Op{r},
15460			Inputs:   []operand.Op{},
15461			Outputs:  []operand.Op{r},
15462			ISA:      []string{"RDRAND"},
15463		}, nil
15464	}
15465	return nil, errors.New("RDRANDQ: bad operands")
15466}
15467
15468// RDRANDW: Read Random Number.
15469//
15470// Forms:
15471//
15472// 	RDRANDW r16
15473func RDRANDW(r operand.Op) (*intrep.Instruction, error) {
15474	switch {
15475	case operand.IsR16(r):
15476		return &intrep.Instruction{
15477			Opcode:   "RDRANDW",
15478			Operands: []operand.Op{r},
15479			Inputs:   []operand.Op{},
15480			Outputs:  []operand.Op{r},
15481			ISA:      []string{"RDRAND"},
15482		}, nil
15483	}
15484	return nil, errors.New("RDRANDW: bad operands")
15485}
15486
15487// RDSEEDL: Read Random SEED.
15488//
15489// Forms:
15490//
15491// 	RDSEEDL r32
15492func RDSEEDL(r operand.Op) (*intrep.Instruction, error) {
15493	switch {
15494	case operand.IsR32(r):
15495		return &intrep.Instruction{
15496			Opcode:   "RDSEEDL",
15497			Operands: []operand.Op{r},
15498			Inputs:   []operand.Op{},
15499			Outputs:  []operand.Op{r},
15500			ISA:      []string{"RDSEED"},
15501		}, nil
15502	}
15503	return nil, errors.New("RDSEEDL: bad operands")
15504}
15505
15506// RDSEEDQ: Read Random SEED.
15507//
15508// Forms:
15509//
15510// 	RDSEEDQ r64
15511func RDSEEDQ(r operand.Op) (*intrep.Instruction, error) {
15512	switch {
15513	case operand.IsR64(r):
15514		return &intrep.Instruction{
15515			Opcode:   "RDSEEDQ",
15516			Operands: []operand.Op{r},
15517			Inputs:   []operand.Op{},
15518			Outputs:  []operand.Op{r},
15519			ISA:      []string{"RDSEED"},
15520		}, nil
15521	}
15522	return nil, errors.New("RDSEEDQ: bad operands")
15523}
15524
15525// RDSEEDW: Read Random SEED.
15526//
15527// Forms:
15528//
15529// 	RDSEEDW r16
15530func RDSEEDW(r operand.Op) (*intrep.Instruction, error) {
15531	switch {
15532	case operand.IsR16(r):
15533		return &intrep.Instruction{
15534			Opcode:   "RDSEEDW",
15535			Operands: []operand.Op{r},
15536			Inputs:   []operand.Op{},
15537			Outputs:  []operand.Op{r},
15538			ISA:      []string{"RDSEED"},
15539		}, nil
15540	}
15541	return nil, errors.New("RDSEEDW: bad operands")
15542}
15543
15544// RDTSC: Read Time-Stamp Counter.
15545//
15546// Forms:
15547//
15548// 	RDTSC
15549func RDTSC() (*intrep.Instruction, error) {
15550	return &intrep.Instruction{
15551		Opcode:   "RDTSC",
15552		Operands: nil,
15553		Inputs:   []operand.Op{},
15554		Outputs:  []operand.Op{reg.EAX, reg.EDX},
15555		ISA:      []string{"RDTSC"},
15556	}, nil
15557}
15558
15559// RDTSCP: Read Time-Stamp Counter and Processor ID.
15560//
15561// Forms:
15562//
15563// 	RDTSCP
15564func RDTSCP() (*intrep.Instruction, error) {
15565	return &intrep.Instruction{
15566		Opcode:   "RDTSCP",
15567		Operands: nil,
15568		Inputs:   []operand.Op{},
15569		Outputs:  []operand.Op{reg.EAX, reg.ECX, reg.EDX},
15570		ISA:      []string{"RDTSCP"},
15571	}, nil
15572}
15573
15574// RET: Return from Procedure.
15575//
15576// Forms:
15577//
15578// 	RET
15579func RET() (*intrep.Instruction, error) {
15580	return &intrep.Instruction{
15581		Opcode:     "RET",
15582		Operands:   nil,
15583		Inputs:     []operand.Op{},
15584		Outputs:    []operand.Op{},
15585		IsTerminal: true,
15586	}, nil
15587}
15588
15589// RETFL: Return from Procedure.
15590//
15591// Forms:
15592//
15593// 	RETFL imm16
15594func RETFL(i operand.Op) (*intrep.Instruction, error) {
15595	switch {
15596	case operand.IsIMM16(i):
15597		return &intrep.Instruction{
15598			Opcode:   "RETFL",
15599			Operands: []operand.Op{i},
15600			Inputs:   []operand.Op{},
15601			Outputs:  []operand.Op{},
15602		}, nil
15603	}
15604	return nil, errors.New("RETFL: bad operands")
15605}
15606
15607// RETFQ: Return from Procedure.
15608//
15609// Forms:
15610//
15611// 	RETFQ imm16
15612func RETFQ(i operand.Op) (*intrep.Instruction, error) {
15613	switch {
15614	case operand.IsIMM16(i):
15615		return &intrep.Instruction{
15616			Opcode:   "RETFQ",
15617			Operands: []operand.Op{i},
15618			Inputs:   []operand.Op{},
15619			Outputs:  []operand.Op{},
15620		}, nil
15621	}
15622	return nil, errors.New("RETFQ: bad operands")
15623}
15624
15625// RETFW: Return from Procedure.
15626//
15627// Forms:
15628//
15629// 	RETFW imm16
15630func RETFW(i operand.Op) (*intrep.Instruction, error) {
15631	switch {
15632	case operand.IsIMM16(i):
15633		return &intrep.Instruction{
15634			Opcode:   "RETFW",
15635			Operands: []operand.Op{i},
15636			Inputs:   []operand.Op{},
15637			Outputs:  []operand.Op{},
15638		}, nil
15639	}
15640	return nil, errors.New("RETFW: bad operands")
15641}
15642
15643// ROLB: Rotate Left.
15644//
15645// Forms:
15646//
15647// 	ROLB 1    r8
15648// 	ROLB imm8 r8
15649// 	ROLB cl   r8
15650// 	ROLB 1    m8
15651// 	ROLB imm8 m8
15652// 	ROLB cl   m8
15653func ROLB(ci, mr operand.Op) (*intrep.Instruction, error) {
15654	switch {
15655	case operand.Is1(ci) && operand.IsR8(mr):
15656		return &intrep.Instruction{
15657			Opcode:   "ROLB",
15658			Operands: []operand.Op{ci, mr},
15659			Inputs:   []operand.Op{mr},
15660			Outputs:  []operand.Op{mr},
15661		}, nil
15662	case operand.IsIMM8(ci) && operand.IsR8(mr):
15663		return &intrep.Instruction{
15664			Opcode:   "ROLB",
15665			Operands: []operand.Op{ci, mr},
15666			Inputs:   []operand.Op{mr},
15667			Outputs:  []operand.Op{mr},
15668		}, nil
15669	case operand.IsCL(ci) && operand.IsR8(mr):
15670		return &intrep.Instruction{
15671			Opcode:   "ROLB",
15672			Operands: []operand.Op{ci, mr},
15673			Inputs:   []operand.Op{ci, mr},
15674			Outputs:  []operand.Op{mr},
15675		}, nil
15676	case operand.Is1(ci) && operand.IsM8(mr):
15677		return &intrep.Instruction{
15678			Opcode:   "ROLB",
15679			Operands: []operand.Op{ci, mr},
15680			Inputs:   []operand.Op{mr},
15681			Outputs:  []operand.Op{mr},
15682		}, nil
15683	case operand.IsIMM8(ci) && operand.IsM8(mr):
15684		return &intrep.Instruction{
15685			Opcode:   "ROLB",
15686			Operands: []operand.Op{ci, mr},
15687			Inputs:   []operand.Op{mr},
15688			Outputs:  []operand.Op{mr},
15689		}, nil
15690	case operand.IsCL(ci) && operand.IsM8(mr):
15691		return &intrep.Instruction{
15692			Opcode:   "ROLB",
15693			Operands: []operand.Op{ci, mr},
15694			Inputs:   []operand.Op{ci, mr},
15695			Outputs:  []operand.Op{mr},
15696		}, nil
15697	}
15698	return nil, errors.New("ROLB: bad operands")
15699}
15700
15701// ROLL: Rotate Left.
15702//
15703// Forms:
15704//
15705// 	ROLL 1    r32
15706// 	ROLL imm8 r32
15707// 	ROLL cl   r32
15708// 	ROLL 1    m32
15709// 	ROLL imm8 m32
15710// 	ROLL cl   m32
15711func ROLL(ci, mr operand.Op) (*intrep.Instruction, error) {
15712	switch {
15713	case operand.Is1(ci) && operand.IsR32(mr):
15714		return &intrep.Instruction{
15715			Opcode:   "ROLL",
15716			Operands: []operand.Op{ci, mr},
15717			Inputs:   []operand.Op{mr},
15718			Outputs:  []operand.Op{mr},
15719		}, nil
15720	case operand.IsIMM8(ci) && operand.IsR32(mr):
15721		return &intrep.Instruction{
15722			Opcode:   "ROLL",
15723			Operands: []operand.Op{ci, mr},
15724			Inputs:   []operand.Op{mr},
15725			Outputs:  []operand.Op{mr},
15726		}, nil
15727	case operand.IsCL(ci) && operand.IsR32(mr):
15728		return &intrep.Instruction{
15729			Opcode:   "ROLL",
15730			Operands: []operand.Op{ci, mr},
15731			Inputs:   []operand.Op{ci, mr},
15732			Outputs:  []operand.Op{mr},
15733		}, nil
15734	case operand.Is1(ci) && operand.IsM32(mr):
15735		return &intrep.Instruction{
15736			Opcode:   "ROLL",
15737			Operands: []operand.Op{ci, mr},
15738			Inputs:   []operand.Op{mr},
15739			Outputs:  []operand.Op{mr},
15740		}, nil
15741	case operand.IsIMM8(ci) && operand.IsM32(mr):
15742		return &intrep.Instruction{
15743			Opcode:   "ROLL",
15744			Operands: []operand.Op{ci, mr},
15745			Inputs:   []operand.Op{mr},
15746			Outputs:  []operand.Op{mr},
15747		}, nil
15748	case operand.IsCL(ci) && operand.IsM32(mr):
15749		return &intrep.Instruction{
15750			Opcode:   "ROLL",
15751			Operands: []operand.Op{ci, mr},
15752			Inputs:   []operand.Op{ci, mr},
15753			Outputs:  []operand.Op{mr},
15754		}, nil
15755	}
15756	return nil, errors.New("ROLL: bad operands")
15757}
15758
15759// ROLQ: Rotate Left.
15760//
15761// Forms:
15762//
15763// 	ROLQ 1    r64
15764// 	ROLQ imm8 r64
15765// 	ROLQ cl   r64
15766// 	ROLQ 1    m64
15767// 	ROLQ imm8 m64
15768// 	ROLQ cl   m64
15769func ROLQ(ci, mr operand.Op) (*intrep.Instruction, error) {
15770	switch {
15771	case operand.Is1(ci) && operand.IsR64(mr):
15772		return &intrep.Instruction{
15773			Opcode:   "ROLQ",
15774			Operands: []operand.Op{ci, mr},
15775			Inputs:   []operand.Op{mr},
15776			Outputs:  []operand.Op{mr},
15777		}, nil
15778	case operand.IsIMM8(ci) && operand.IsR64(mr):
15779		return &intrep.Instruction{
15780			Opcode:   "ROLQ",
15781			Operands: []operand.Op{ci, mr},
15782			Inputs:   []operand.Op{mr},
15783			Outputs:  []operand.Op{mr},
15784		}, nil
15785	case operand.IsCL(ci) && operand.IsR64(mr):
15786		return &intrep.Instruction{
15787			Opcode:   "ROLQ",
15788			Operands: []operand.Op{ci, mr},
15789			Inputs:   []operand.Op{ci, mr},
15790			Outputs:  []operand.Op{mr},
15791		}, nil
15792	case operand.Is1(ci) && operand.IsM64(mr):
15793		return &intrep.Instruction{
15794			Opcode:   "ROLQ",
15795			Operands: []operand.Op{ci, mr},
15796			Inputs:   []operand.Op{mr},
15797			Outputs:  []operand.Op{mr},
15798		}, nil
15799	case operand.IsIMM8(ci) && operand.IsM64(mr):
15800		return &intrep.Instruction{
15801			Opcode:   "ROLQ",
15802			Operands: []operand.Op{ci, mr},
15803			Inputs:   []operand.Op{mr},
15804			Outputs:  []operand.Op{mr},
15805		}, nil
15806	case operand.IsCL(ci) && operand.IsM64(mr):
15807		return &intrep.Instruction{
15808			Opcode:   "ROLQ",
15809			Operands: []operand.Op{ci, mr},
15810			Inputs:   []operand.Op{ci, mr},
15811			Outputs:  []operand.Op{mr},
15812		}, nil
15813	}
15814	return nil, errors.New("ROLQ: bad operands")
15815}
15816
15817// ROLW: Rotate Left.
15818//
15819// Forms:
15820//
15821// 	ROLW 1    r16
15822// 	ROLW imm8 r16
15823// 	ROLW cl   r16
15824// 	ROLW 1    m16
15825// 	ROLW imm8 m16
15826// 	ROLW cl   m16
15827func ROLW(ci, mr operand.Op) (*intrep.Instruction, error) {
15828	switch {
15829	case operand.Is1(ci) && operand.IsR16(mr):
15830		return &intrep.Instruction{
15831			Opcode:   "ROLW",
15832			Operands: []operand.Op{ci, mr},
15833			Inputs:   []operand.Op{mr},
15834			Outputs:  []operand.Op{mr},
15835		}, nil
15836	case operand.IsIMM8(ci) && operand.IsR16(mr):
15837		return &intrep.Instruction{
15838			Opcode:   "ROLW",
15839			Operands: []operand.Op{ci, mr},
15840			Inputs:   []operand.Op{mr},
15841			Outputs:  []operand.Op{mr},
15842		}, nil
15843	case operand.IsCL(ci) && operand.IsR16(mr):
15844		return &intrep.Instruction{
15845			Opcode:   "ROLW",
15846			Operands: []operand.Op{ci, mr},
15847			Inputs:   []operand.Op{ci, mr},
15848			Outputs:  []operand.Op{mr},
15849		}, nil
15850	case operand.Is1(ci) && operand.IsM16(mr):
15851		return &intrep.Instruction{
15852			Opcode:   "ROLW",
15853			Operands: []operand.Op{ci, mr},
15854			Inputs:   []operand.Op{mr},
15855			Outputs:  []operand.Op{mr},
15856		}, nil
15857	case operand.IsIMM8(ci) && operand.IsM16(mr):
15858		return &intrep.Instruction{
15859			Opcode:   "ROLW",
15860			Operands: []operand.Op{ci, mr},
15861			Inputs:   []operand.Op{mr},
15862			Outputs:  []operand.Op{mr},
15863		}, nil
15864	case operand.IsCL(ci) && operand.IsM16(mr):
15865		return &intrep.Instruction{
15866			Opcode:   "ROLW",
15867			Operands: []operand.Op{ci, mr},
15868			Inputs:   []operand.Op{ci, mr},
15869			Outputs:  []operand.Op{mr},
15870		}, nil
15871	}
15872	return nil, errors.New("ROLW: bad operands")
15873}
15874
15875// RORB: Rotate Right.
15876//
15877// Forms:
15878//
15879// 	RORB 1    r8
15880// 	RORB imm8 r8
15881// 	RORB cl   r8
15882// 	RORB 1    m8
15883// 	RORB imm8 m8
15884// 	RORB cl   m8
15885func RORB(ci, mr operand.Op) (*intrep.Instruction, error) {
15886	switch {
15887	case operand.Is1(ci) && operand.IsR8(mr):
15888		return &intrep.Instruction{
15889			Opcode:   "RORB",
15890			Operands: []operand.Op{ci, mr},
15891			Inputs:   []operand.Op{mr},
15892			Outputs:  []operand.Op{mr},
15893		}, nil
15894	case operand.IsIMM8(ci) && operand.IsR8(mr):
15895		return &intrep.Instruction{
15896			Opcode:   "RORB",
15897			Operands: []operand.Op{ci, mr},
15898			Inputs:   []operand.Op{mr},
15899			Outputs:  []operand.Op{mr},
15900		}, nil
15901	case operand.IsCL(ci) && operand.IsR8(mr):
15902		return &intrep.Instruction{
15903			Opcode:   "RORB",
15904			Operands: []operand.Op{ci, mr},
15905			Inputs:   []operand.Op{ci, mr},
15906			Outputs:  []operand.Op{mr},
15907		}, nil
15908	case operand.Is1(ci) && operand.IsM8(mr):
15909		return &intrep.Instruction{
15910			Opcode:   "RORB",
15911			Operands: []operand.Op{ci, mr},
15912			Inputs:   []operand.Op{mr},
15913			Outputs:  []operand.Op{mr},
15914		}, nil
15915	case operand.IsIMM8(ci) && operand.IsM8(mr):
15916		return &intrep.Instruction{
15917			Opcode:   "RORB",
15918			Operands: []operand.Op{ci, mr},
15919			Inputs:   []operand.Op{mr},
15920			Outputs:  []operand.Op{mr},
15921		}, nil
15922	case operand.IsCL(ci) && operand.IsM8(mr):
15923		return &intrep.Instruction{
15924			Opcode:   "RORB",
15925			Operands: []operand.Op{ci, mr},
15926			Inputs:   []operand.Op{ci, mr},
15927			Outputs:  []operand.Op{mr},
15928		}, nil
15929	}
15930	return nil, errors.New("RORB: bad operands")
15931}
15932
15933// RORL: Rotate Right.
15934//
15935// Forms:
15936//
15937// 	RORL 1    r32
15938// 	RORL imm8 r32
15939// 	RORL cl   r32
15940// 	RORL 1    m32
15941// 	RORL imm8 m32
15942// 	RORL cl   m32
15943func RORL(ci, mr operand.Op) (*intrep.Instruction, error) {
15944	switch {
15945	case operand.Is1(ci) && operand.IsR32(mr):
15946		return &intrep.Instruction{
15947			Opcode:   "RORL",
15948			Operands: []operand.Op{ci, mr},
15949			Inputs:   []operand.Op{mr},
15950			Outputs:  []operand.Op{mr},
15951		}, nil
15952	case operand.IsIMM8(ci) && operand.IsR32(mr):
15953		return &intrep.Instruction{
15954			Opcode:   "RORL",
15955			Operands: []operand.Op{ci, mr},
15956			Inputs:   []operand.Op{mr},
15957			Outputs:  []operand.Op{mr},
15958		}, nil
15959	case operand.IsCL(ci) && operand.IsR32(mr):
15960		return &intrep.Instruction{
15961			Opcode:   "RORL",
15962			Operands: []operand.Op{ci, mr},
15963			Inputs:   []operand.Op{ci, mr},
15964			Outputs:  []operand.Op{mr},
15965		}, nil
15966	case operand.Is1(ci) && operand.IsM32(mr):
15967		return &intrep.Instruction{
15968			Opcode:   "RORL",
15969			Operands: []operand.Op{ci, mr},
15970			Inputs:   []operand.Op{mr},
15971			Outputs:  []operand.Op{mr},
15972		}, nil
15973	case operand.IsIMM8(ci) && operand.IsM32(mr):
15974		return &intrep.Instruction{
15975			Opcode:   "RORL",
15976			Operands: []operand.Op{ci, mr},
15977			Inputs:   []operand.Op{mr},
15978			Outputs:  []operand.Op{mr},
15979		}, nil
15980	case operand.IsCL(ci) && operand.IsM32(mr):
15981		return &intrep.Instruction{
15982			Opcode:   "RORL",
15983			Operands: []operand.Op{ci, mr},
15984			Inputs:   []operand.Op{ci, mr},
15985			Outputs:  []operand.Op{mr},
15986		}, nil
15987	}
15988	return nil, errors.New("RORL: bad operands")
15989}
15990
15991// RORQ: Rotate Right.
15992//
15993// Forms:
15994//
15995// 	RORQ 1    r64
15996// 	RORQ imm8 r64
15997// 	RORQ cl   r64
15998// 	RORQ 1    m64
15999// 	RORQ imm8 m64
16000// 	RORQ cl   m64
16001func RORQ(ci, mr operand.Op) (*intrep.Instruction, error) {
16002	switch {
16003	case operand.Is1(ci) && operand.IsR64(mr):
16004		return &intrep.Instruction{
16005			Opcode:   "RORQ",
16006			Operands: []operand.Op{ci, mr},
16007			Inputs:   []operand.Op{mr},
16008			Outputs:  []operand.Op{mr},
16009		}, nil
16010	case operand.IsIMM8(ci) && operand.IsR64(mr):
16011		return &intrep.Instruction{
16012			Opcode:   "RORQ",
16013			Operands: []operand.Op{ci, mr},
16014			Inputs:   []operand.Op{mr},
16015			Outputs:  []operand.Op{mr},
16016		}, nil
16017	case operand.IsCL(ci) && operand.IsR64(mr):
16018		return &intrep.Instruction{
16019			Opcode:   "RORQ",
16020			Operands: []operand.Op{ci, mr},
16021			Inputs:   []operand.Op{ci, mr},
16022			Outputs:  []operand.Op{mr},
16023		}, nil
16024	case operand.Is1(ci) && operand.IsM64(mr):
16025		return &intrep.Instruction{
16026			Opcode:   "RORQ",
16027			Operands: []operand.Op{ci, mr},
16028			Inputs:   []operand.Op{mr},
16029			Outputs:  []operand.Op{mr},
16030		}, nil
16031	case operand.IsIMM8(ci) && operand.IsM64(mr):
16032		return &intrep.Instruction{
16033			Opcode:   "RORQ",
16034			Operands: []operand.Op{ci, mr},
16035			Inputs:   []operand.Op{mr},
16036			Outputs:  []operand.Op{mr},
16037		}, nil
16038	case operand.IsCL(ci) && operand.IsM64(mr):
16039		return &intrep.Instruction{
16040			Opcode:   "RORQ",
16041			Operands: []operand.Op{ci, mr},
16042			Inputs:   []operand.Op{ci, mr},
16043			Outputs:  []operand.Op{mr},
16044		}, nil
16045	}
16046	return nil, errors.New("RORQ: bad operands")
16047}
16048
16049// RORW: Rotate Right.
16050//
16051// Forms:
16052//
16053// 	RORW 1    r16
16054// 	RORW imm8 r16
16055// 	RORW cl   r16
16056// 	RORW 1    m16
16057// 	RORW imm8 m16
16058// 	RORW cl   m16
16059func RORW(ci, mr operand.Op) (*intrep.Instruction, error) {
16060	switch {
16061	case operand.Is1(ci) && operand.IsR16(mr):
16062		return &intrep.Instruction{
16063			Opcode:   "RORW",
16064			Operands: []operand.Op{ci, mr},
16065			Inputs:   []operand.Op{mr},
16066			Outputs:  []operand.Op{mr},
16067		}, nil
16068	case operand.IsIMM8(ci) && operand.IsR16(mr):
16069		return &intrep.Instruction{
16070			Opcode:   "RORW",
16071			Operands: []operand.Op{ci, mr},
16072			Inputs:   []operand.Op{mr},
16073			Outputs:  []operand.Op{mr},
16074		}, nil
16075	case operand.IsCL(ci) && operand.IsR16(mr):
16076		return &intrep.Instruction{
16077			Opcode:   "RORW",
16078			Operands: []operand.Op{ci, mr},
16079			Inputs:   []operand.Op{ci, mr},
16080			Outputs:  []operand.Op{mr},
16081		}, nil
16082	case operand.Is1(ci) && operand.IsM16(mr):
16083		return &intrep.Instruction{
16084			Opcode:   "RORW",
16085			Operands: []operand.Op{ci, mr},
16086			Inputs:   []operand.Op{mr},
16087			Outputs:  []operand.Op{mr},
16088		}, nil
16089	case operand.IsIMM8(ci) && operand.IsM16(mr):
16090		return &intrep.Instruction{
16091			Opcode:   "RORW",
16092			Operands: []operand.Op{ci, mr},
16093			Inputs:   []operand.Op{mr},
16094			Outputs:  []operand.Op{mr},
16095		}, nil
16096	case operand.IsCL(ci) && operand.IsM16(mr):
16097		return &intrep.Instruction{
16098			Opcode:   "RORW",
16099			Operands: []operand.Op{ci, mr},
16100			Inputs:   []operand.Op{ci, mr},
16101			Outputs:  []operand.Op{mr},
16102		}, nil
16103	}
16104	return nil, errors.New("RORW: bad operands")
16105}
16106
16107// RORXL: Rotate Right Logical Without Affecting Flags.
16108//
16109// Forms:
16110//
16111// 	RORXL imm8 r32 r32
16112// 	RORXL imm8 m32 r32
16113func RORXL(i, mr, r operand.Op) (*intrep.Instruction, error) {
16114	switch {
16115	case operand.IsIMM8(i) && operand.IsR32(mr) && operand.IsR32(r):
16116		return &intrep.Instruction{
16117			Opcode:   "RORXL",
16118			Operands: []operand.Op{i, mr, r},
16119			Inputs:   []operand.Op{mr},
16120			Outputs:  []operand.Op{r},
16121			ISA:      []string{"BMI2"},
16122		}, nil
16123	case operand.IsIMM8(i) && operand.IsM32(mr) && operand.IsR32(r):
16124		return &intrep.Instruction{
16125			Opcode:   "RORXL",
16126			Operands: []operand.Op{i, mr, r},
16127			Inputs:   []operand.Op{mr},
16128			Outputs:  []operand.Op{r},
16129			ISA:      []string{"BMI2"},
16130		}, nil
16131	}
16132	return nil, errors.New("RORXL: bad operands")
16133}
16134
16135// RORXQ: Rotate Right Logical Without Affecting Flags.
16136//
16137// Forms:
16138//
16139// 	RORXQ imm8 r64 r64
16140// 	RORXQ imm8 m64 r64
16141func RORXQ(i, mr, r operand.Op) (*intrep.Instruction, error) {
16142	switch {
16143	case operand.IsIMM8(i) && operand.IsR64(mr) && operand.IsR64(r):
16144		return &intrep.Instruction{
16145			Opcode:   "RORXQ",
16146			Operands: []operand.Op{i, mr, r},
16147			Inputs:   []operand.Op{mr},
16148			Outputs:  []operand.Op{r},
16149			ISA:      []string{"BMI2"},
16150		}, nil
16151	case operand.IsIMM8(i) && operand.IsM64(mr) && operand.IsR64(r):
16152		return &intrep.Instruction{
16153			Opcode:   "RORXQ",
16154			Operands: []operand.Op{i, mr, r},
16155			Inputs:   []operand.Op{mr},
16156			Outputs:  []operand.Op{r},
16157			ISA:      []string{"BMI2"},
16158		}, nil
16159	}
16160	return nil, errors.New("RORXQ: bad operands")
16161}
16162
16163// ROUNDPD: Round Packed Double Precision Floating-Point Values.
16164//
16165// Forms:
16166//
16167// 	ROUNDPD imm8 xmm  xmm
16168// 	ROUNDPD imm8 m128 xmm
16169func ROUNDPD(i, mx, x operand.Op) (*intrep.Instruction, error) {
16170	switch {
16171	case operand.IsIMM8(i) && operand.IsXMM(mx) && operand.IsXMM(x):
16172		return &intrep.Instruction{
16173			Opcode:   "ROUNDPD",
16174			Operands: []operand.Op{i, mx, x},
16175			Inputs:   []operand.Op{mx},
16176			Outputs:  []operand.Op{x},
16177			ISA:      []string{"SSE4.1"},
16178		}, nil
16179	case operand.IsIMM8(i) && operand.IsM128(mx) && operand.IsXMM(x):
16180		return &intrep.Instruction{
16181			Opcode:   "ROUNDPD",
16182			Operands: []operand.Op{i, mx, x},
16183			Inputs:   []operand.Op{mx},
16184			Outputs:  []operand.Op{x},
16185			ISA:      []string{"SSE4.1"},
16186		}, nil
16187	}
16188	return nil, errors.New("ROUNDPD: bad operands")
16189}
16190
16191// ROUNDPS: Round Packed Single Precision Floating-Point Values.
16192//
16193// Forms:
16194//
16195// 	ROUNDPS imm8 xmm  xmm
16196// 	ROUNDPS imm8 m128 xmm
16197func ROUNDPS(i, mx, x operand.Op) (*intrep.Instruction, error) {
16198	switch {
16199	case operand.IsIMM8(i) && operand.IsXMM(mx) && operand.IsXMM(x):
16200		return &intrep.Instruction{
16201			Opcode:   "ROUNDPS",
16202			Operands: []operand.Op{i, mx, x},
16203			Inputs:   []operand.Op{mx},
16204			Outputs:  []operand.Op{x},
16205			ISA:      []string{"SSE4.1"},
16206		}, nil
16207	case operand.IsIMM8(i) && operand.IsM128(mx) && operand.IsXMM(x):
16208		return &intrep.Instruction{
16209			Opcode:   "ROUNDPS",
16210			Operands: []operand.Op{i, mx, x},
16211			Inputs:   []operand.Op{mx},
16212			Outputs:  []operand.Op{x},
16213			ISA:      []string{"SSE4.1"},
16214		}, nil
16215	}
16216	return nil, errors.New("ROUNDPS: bad operands")
16217}
16218
16219// ROUNDSD: Round Scalar Double Precision Floating-Point Values.
16220//
16221// Forms:
16222//
16223// 	ROUNDSD imm8 xmm xmm
16224// 	ROUNDSD imm8 m64 xmm
16225func ROUNDSD(i, mx, x operand.Op) (*intrep.Instruction, error) {
16226	switch {
16227	case operand.IsIMM8(i) && operand.IsXMM(mx) && operand.IsXMM(x):
16228		return &intrep.Instruction{
16229			Opcode:   "ROUNDSD",
16230			Operands: []operand.Op{i, mx, x},
16231			Inputs:   []operand.Op{mx, x},
16232			Outputs:  []operand.Op{x},
16233			ISA:      []string{"SSE4.1"},
16234		}, nil
16235	case operand.IsIMM8(i) && operand.IsM64(mx) && operand.IsXMM(x):
16236		return &intrep.Instruction{
16237			Opcode:   "ROUNDSD",
16238			Operands: []operand.Op{i, mx, x},
16239			Inputs:   []operand.Op{mx, x},
16240			Outputs:  []operand.Op{x},
16241			ISA:      []string{"SSE4.1"},
16242		}, nil
16243	}
16244	return nil, errors.New("ROUNDSD: bad operands")
16245}
16246
16247// ROUNDSS: Round Scalar Single Precision Floating-Point Values.
16248//
16249// Forms:
16250//
16251// 	ROUNDSS imm8 xmm xmm
16252// 	ROUNDSS imm8 m32 xmm
16253func ROUNDSS(i, mx, x operand.Op) (*intrep.Instruction, error) {
16254	switch {
16255	case operand.IsIMM8(i) && operand.IsXMM(mx) && operand.IsXMM(x):
16256		return &intrep.Instruction{
16257			Opcode:   "ROUNDSS",
16258			Operands: []operand.Op{i, mx, x},
16259			Inputs:   []operand.Op{mx, x},
16260			Outputs:  []operand.Op{x},
16261			ISA:      []string{"SSE4.1"},
16262		}, nil
16263	case operand.IsIMM8(i) && operand.IsM32(mx) && operand.IsXMM(x):
16264		return &intrep.Instruction{
16265			Opcode:   "ROUNDSS",
16266			Operands: []operand.Op{i, mx, x},
16267			Inputs:   []operand.Op{mx, x},
16268			Outputs:  []operand.Op{x},
16269			ISA:      []string{"SSE4.1"},
16270		}, nil
16271	}
16272	return nil, errors.New("ROUNDSS: bad operands")
16273}
16274
16275// RSQRTPS: Compute Reciprocals of Square Roots of Packed Single-Precision Floating-Point Values.
16276//
16277// Forms:
16278//
16279// 	RSQRTPS xmm  xmm
16280// 	RSQRTPS m128 xmm
16281func RSQRTPS(mx, x operand.Op) (*intrep.Instruction, error) {
16282	switch {
16283	case operand.IsXMM(mx) && operand.IsXMM(x):
16284		return &intrep.Instruction{
16285			Opcode:   "RSQRTPS",
16286			Operands: []operand.Op{mx, x},
16287			Inputs:   []operand.Op{mx},
16288			Outputs:  []operand.Op{x},
16289			ISA:      []string{"SSE"},
16290		}, nil
16291	case operand.IsM128(mx) && operand.IsXMM(x):
16292		return &intrep.Instruction{
16293			Opcode:   "RSQRTPS",
16294			Operands: []operand.Op{mx, x},
16295			Inputs:   []operand.Op{mx},
16296			Outputs:  []operand.Op{x},
16297			ISA:      []string{"SSE"},
16298		}, nil
16299	}
16300	return nil, errors.New("RSQRTPS: bad operands")
16301}
16302
16303// RSQRTSS: Compute Reciprocal of Square Root of Scalar Single-Precision Floating-Point Value.
16304//
16305// Forms:
16306//
16307// 	RSQRTSS xmm xmm
16308// 	RSQRTSS m32 xmm
16309func RSQRTSS(mx, x operand.Op) (*intrep.Instruction, error) {
16310	switch {
16311	case operand.IsXMM(mx) && operand.IsXMM(x):
16312		return &intrep.Instruction{
16313			Opcode:   "RSQRTSS",
16314			Operands: []operand.Op{mx, x},
16315			Inputs:   []operand.Op{mx, x},
16316			Outputs:  []operand.Op{x},
16317			ISA:      []string{"SSE"},
16318		}, nil
16319	case operand.IsM32(mx) && operand.IsXMM(x):
16320		return &intrep.Instruction{
16321			Opcode:   "RSQRTSS",
16322			Operands: []operand.Op{mx, x},
16323			Inputs:   []operand.Op{mx, x},
16324			Outputs:  []operand.Op{x},
16325			ISA:      []string{"SSE"},
16326		}, nil
16327	}
16328	return nil, errors.New("RSQRTSS: bad operands")
16329}
16330
16331// SALB: Arithmetic Shift Left.
16332//
16333// Forms:
16334//
16335// 	SALB 1    r8
16336// 	SALB imm8 r8
16337// 	SALB cl   r8
16338// 	SALB 1    m8
16339// 	SALB imm8 m8
16340// 	SALB cl   m8
16341func SALB(ci, mr operand.Op) (*intrep.Instruction, error) {
16342	switch {
16343	case operand.Is1(ci) && operand.IsR8(mr):
16344		return &intrep.Instruction{
16345			Opcode:   "SALB",
16346			Operands: []operand.Op{ci, mr},
16347			Inputs:   []operand.Op{mr},
16348			Outputs:  []operand.Op{mr},
16349		}, nil
16350	case operand.IsIMM8(ci) && operand.IsR8(mr):
16351		return &intrep.Instruction{
16352			Opcode:   "SALB",
16353			Operands: []operand.Op{ci, mr},
16354			Inputs:   []operand.Op{mr},
16355			Outputs:  []operand.Op{mr},
16356		}, nil
16357	case operand.IsCL(ci) && operand.IsR8(mr):
16358		return &intrep.Instruction{
16359			Opcode:   "SALB",
16360			Operands: []operand.Op{ci, mr},
16361			Inputs:   []operand.Op{ci, mr},
16362			Outputs:  []operand.Op{mr},
16363		}, nil
16364	case operand.Is1(ci) && operand.IsM8(mr):
16365		return &intrep.Instruction{
16366			Opcode:   "SALB",
16367			Operands: []operand.Op{ci, mr},
16368			Inputs:   []operand.Op{mr},
16369			Outputs:  []operand.Op{mr},
16370		}, nil
16371	case operand.IsIMM8(ci) && operand.IsM8(mr):
16372		return &intrep.Instruction{
16373			Opcode:   "SALB",
16374			Operands: []operand.Op{ci, mr},
16375			Inputs:   []operand.Op{mr},
16376			Outputs:  []operand.Op{mr},
16377		}, nil
16378	case operand.IsCL(ci) && operand.IsM8(mr):
16379		return &intrep.Instruction{
16380			Opcode:   "SALB",
16381			Operands: []operand.Op{ci, mr},
16382			Inputs:   []operand.Op{ci, mr},
16383			Outputs:  []operand.Op{mr},
16384		}, nil
16385	}
16386	return nil, errors.New("SALB: bad operands")
16387}
16388
16389// SALL: Arithmetic Shift Left.
16390//
16391// Forms:
16392//
16393// 	SALL 1    r32
16394// 	SALL imm8 r32
16395// 	SALL cl   r32
16396// 	SALL 1    m32
16397// 	SALL imm8 m32
16398// 	SALL cl   m32
16399func SALL(ci, mr operand.Op) (*intrep.Instruction, error) {
16400	switch {
16401	case operand.Is1(ci) && operand.IsR32(mr):
16402		return &intrep.Instruction{
16403			Opcode:   "SALL",
16404			Operands: []operand.Op{ci, mr},
16405			Inputs:   []operand.Op{mr},
16406			Outputs:  []operand.Op{mr},
16407		}, nil
16408	case operand.IsIMM8(ci) && operand.IsR32(mr):
16409		return &intrep.Instruction{
16410			Opcode:   "SALL",
16411			Operands: []operand.Op{ci, mr},
16412			Inputs:   []operand.Op{mr},
16413			Outputs:  []operand.Op{mr},
16414		}, nil
16415	case operand.IsCL(ci) && operand.IsR32(mr):
16416		return &intrep.Instruction{
16417			Opcode:   "SALL",
16418			Operands: []operand.Op{ci, mr},
16419			Inputs:   []operand.Op{ci, mr},
16420			Outputs:  []operand.Op{mr},
16421		}, nil
16422	case operand.Is1(ci) && operand.IsM32(mr):
16423		return &intrep.Instruction{
16424			Opcode:   "SALL",
16425			Operands: []operand.Op{ci, mr},
16426			Inputs:   []operand.Op{mr},
16427			Outputs:  []operand.Op{mr},
16428		}, nil
16429	case operand.IsIMM8(ci) && operand.IsM32(mr):
16430		return &intrep.Instruction{
16431			Opcode:   "SALL",
16432			Operands: []operand.Op{ci, mr},
16433			Inputs:   []operand.Op{mr},
16434			Outputs:  []operand.Op{mr},
16435		}, nil
16436	case operand.IsCL(ci) && operand.IsM32(mr):
16437		return &intrep.Instruction{
16438			Opcode:   "SALL",
16439			Operands: []operand.Op{ci, mr},
16440			Inputs:   []operand.Op{ci, mr},
16441			Outputs:  []operand.Op{mr},
16442		}, nil
16443	}
16444	return nil, errors.New("SALL: bad operands")
16445}
16446
16447// SALQ: Arithmetic Shift Left.
16448//
16449// Forms:
16450//
16451// 	SALQ 1    r64
16452// 	SALQ imm8 r64
16453// 	SALQ cl   r64
16454// 	SALQ 1    m64
16455// 	SALQ imm8 m64
16456// 	SALQ cl   m64
16457func SALQ(ci, mr operand.Op) (*intrep.Instruction, error) {
16458	switch {
16459	case operand.Is1(ci) && operand.IsR64(mr):
16460		return &intrep.Instruction{
16461			Opcode:   "SALQ",
16462			Operands: []operand.Op{ci, mr},
16463			Inputs:   []operand.Op{mr},
16464			Outputs:  []operand.Op{mr},
16465		}, nil
16466	case operand.IsIMM8(ci) && operand.IsR64(mr):
16467		return &intrep.Instruction{
16468			Opcode:   "SALQ",
16469			Operands: []operand.Op{ci, mr},
16470			Inputs:   []operand.Op{mr},
16471			Outputs:  []operand.Op{mr},
16472		}, nil
16473	case operand.IsCL(ci) && operand.IsR64(mr):
16474		return &intrep.Instruction{
16475			Opcode:   "SALQ",
16476			Operands: []operand.Op{ci, mr},
16477			Inputs:   []operand.Op{ci, mr},
16478			Outputs:  []operand.Op{mr},
16479		}, nil
16480	case operand.Is1(ci) && operand.IsM64(mr):
16481		return &intrep.Instruction{
16482			Opcode:   "SALQ",
16483			Operands: []operand.Op{ci, mr},
16484			Inputs:   []operand.Op{mr},
16485			Outputs:  []operand.Op{mr},
16486		}, nil
16487	case operand.IsIMM8(ci) && operand.IsM64(mr):
16488		return &intrep.Instruction{
16489			Opcode:   "SALQ",
16490			Operands: []operand.Op{ci, mr},
16491			Inputs:   []operand.Op{mr},
16492			Outputs:  []operand.Op{mr},
16493		}, nil
16494	case operand.IsCL(ci) && operand.IsM64(mr):
16495		return &intrep.Instruction{
16496			Opcode:   "SALQ",
16497			Operands: []operand.Op{ci, mr},
16498			Inputs:   []operand.Op{ci, mr},
16499			Outputs:  []operand.Op{mr},
16500		}, nil
16501	}
16502	return nil, errors.New("SALQ: bad operands")
16503}
16504
16505// SALW: Arithmetic Shift Left.
16506//
16507// Forms:
16508//
16509// 	SALW 1    r16
16510// 	SALW imm8 r16
16511// 	SALW cl   r16
16512// 	SALW 1    m16
16513// 	SALW imm8 m16
16514// 	SALW cl   m16
16515func SALW(ci, mr operand.Op) (*intrep.Instruction, error) {
16516	switch {
16517	case operand.Is1(ci) && operand.IsR16(mr):
16518		return &intrep.Instruction{
16519			Opcode:   "SALW",
16520			Operands: []operand.Op{ci, mr},
16521			Inputs:   []operand.Op{mr},
16522			Outputs:  []operand.Op{mr},
16523		}, nil
16524	case operand.IsIMM8(ci) && operand.IsR16(mr):
16525		return &intrep.Instruction{
16526			Opcode:   "SALW",
16527			Operands: []operand.Op{ci, mr},
16528			Inputs:   []operand.Op{mr},
16529			Outputs:  []operand.Op{mr},
16530		}, nil
16531	case operand.IsCL(ci) && operand.IsR16(mr):
16532		return &intrep.Instruction{
16533			Opcode:   "SALW",
16534			Operands: []operand.Op{ci, mr},
16535			Inputs:   []operand.Op{ci, mr},
16536			Outputs:  []operand.Op{mr},
16537		}, nil
16538	case operand.Is1(ci) && operand.IsM16(mr):
16539		return &intrep.Instruction{
16540			Opcode:   "SALW",
16541			Operands: []operand.Op{ci, mr},
16542			Inputs:   []operand.Op{mr},
16543			Outputs:  []operand.Op{mr},
16544		}, nil
16545	case operand.IsIMM8(ci) && operand.IsM16(mr):
16546		return &intrep.Instruction{
16547			Opcode:   "SALW",
16548			Operands: []operand.Op{ci, mr},
16549			Inputs:   []operand.Op{mr},
16550			Outputs:  []operand.Op{mr},
16551		}, nil
16552	case operand.IsCL(ci) && operand.IsM16(mr):
16553		return &intrep.Instruction{
16554			Opcode:   "SALW",
16555			Operands: []operand.Op{ci, mr},
16556			Inputs:   []operand.Op{ci, mr},
16557			Outputs:  []operand.Op{mr},
16558		}, nil
16559	}
16560	return nil, errors.New("SALW: bad operands")
16561}
16562
16563// SARB: Arithmetic Shift Right.
16564//
16565// Forms:
16566//
16567// 	SARB 1    r8
16568// 	SARB imm8 r8
16569// 	SARB cl   r8
16570// 	SARB 1    m8
16571// 	SARB imm8 m8
16572// 	SARB cl   m8
16573func SARB(ci, mr operand.Op) (*intrep.Instruction, error) {
16574	switch {
16575	case operand.Is1(ci) && operand.IsR8(mr):
16576		return &intrep.Instruction{
16577			Opcode:   "SARB",
16578			Operands: []operand.Op{ci, mr},
16579			Inputs:   []operand.Op{mr},
16580			Outputs:  []operand.Op{mr},
16581		}, nil
16582	case operand.IsIMM8(ci) && operand.IsR8(mr):
16583		return &intrep.Instruction{
16584			Opcode:   "SARB",
16585			Operands: []operand.Op{ci, mr},
16586			Inputs:   []operand.Op{mr},
16587			Outputs:  []operand.Op{mr},
16588		}, nil
16589	case operand.IsCL(ci) && operand.IsR8(mr):
16590		return &intrep.Instruction{
16591			Opcode:   "SARB",
16592			Operands: []operand.Op{ci, mr},
16593			Inputs:   []operand.Op{ci, mr},
16594			Outputs:  []operand.Op{mr},
16595		}, nil
16596	case operand.Is1(ci) && operand.IsM8(mr):
16597		return &intrep.Instruction{
16598			Opcode:   "SARB",
16599			Operands: []operand.Op{ci, mr},
16600			Inputs:   []operand.Op{mr},
16601			Outputs:  []operand.Op{mr},
16602		}, nil
16603	case operand.IsIMM8(ci) && operand.IsM8(mr):
16604		return &intrep.Instruction{
16605			Opcode:   "SARB",
16606			Operands: []operand.Op{ci, mr},
16607			Inputs:   []operand.Op{mr},
16608			Outputs:  []operand.Op{mr},
16609		}, nil
16610	case operand.IsCL(ci) && operand.IsM8(mr):
16611		return &intrep.Instruction{
16612			Opcode:   "SARB",
16613			Operands: []operand.Op{ci, mr},
16614			Inputs:   []operand.Op{ci, mr},
16615			Outputs:  []operand.Op{mr},
16616		}, nil
16617	}
16618	return nil, errors.New("SARB: bad operands")
16619}
16620
16621// SARL: Arithmetic Shift Right.
16622//
16623// Forms:
16624//
16625// 	SARL 1    r32
16626// 	SARL imm8 r32
16627// 	SARL cl   r32
16628// 	SARL 1    m32
16629// 	SARL imm8 m32
16630// 	SARL cl   m32
16631func SARL(ci, mr operand.Op) (*intrep.Instruction, error) {
16632	switch {
16633	case operand.Is1(ci) && operand.IsR32(mr):
16634		return &intrep.Instruction{
16635			Opcode:   "SARL",
16636			Operands: []operand.Op{ci, mr},
16637			Inputs:   []operand.Op{mr},
16638			Outputs:  []operand.Op{mr},
16639		}, nil
16640	case operand.IsIMM8(ci) && operand.IsR32(mr):
16641		return &intrep.Instruction{
16642			Opcode:   "SARL",
16643			Operands: []operand.Op{ci, mr},
16644			Inputs:   []operand.Op{mr},
16645			Outputs:  []operand.Op{mr},
16646		}, nil
16647	case operand.IsCL(ci) && operand.IsR32(mr):
16648		return &intrep.Instruction{
16649			Opcode:   "SARL",
16650			Operands: []operand.Op{ci, mr},
16651			Inputs:   []operand.Op{ci, mr},
16652			Outputs:  []operand.Op{mr},
16653		}, nil
16654	case operand.Is1(ci) && operand.IsM32(mr):
16655		return &intrep.Instruction{
16656			Opcode:   "SARL",
16657			Operands: []operand.Op{ci, mr},
16658			Inputs:   []operand.Op{mr},
16659			Outputs:  []operand.Op{mr},
16660		}, nil
16661	case operand.IsIMM8(ci) && operand.IsM32(mr):
16662		return &intrep.Instruction{
16663			Opcode:   "SARL",
16664			Operands: []operand.Op{ci, mr},
16665			Inputs:   []operand.Op{mr},
16666			Outputs:  []operand.Op{mr},
16667		}, nil
16668	case operand.IsCL(ci) && operand.IsM32(mr):
16669		return &intrep.Instruction{
16670			Opcode:   "SARL",
16671			Operands: []operand.Op{ci, mr},
16672			Inputs:   []operand.Op{ci, mr},
16673			Outputs:  []operand.Op{mr},
16674		}, nil
16675	}
16676	return nil, errors.New("SARL: bad operands")
16677}
16678
16679// SARQ: Arithmetic Shift Right.
16680//
16681// Forms:
16682//
16683// 	SARQ 1    r64
16684// 	SARQ imm8 r64
16685// 	SARQ cl   r64
16686// 	SARQ 1    m64
16687// 	SARQ imm8 m64
16688// 	SARQ cl   m64
16689func SARQ(ci, mr operand.Op) (*intrep.Instruction, error) {
16690	switch {
16691	case operand.Is1(ci) && operand.IsR64(mr):
16692		return &intrep.Instruction{
16693			Opcode:   "SARQ",
16694			Operands: []operand.Op{ci, mr},
16695			Inputs:   []operand.Op{mr},
16696			Outputs:  []operand.Op{mr},
16697		}, nil
16698	case operand.IsIMM8(ci) && operand.IsR64(mr):
16699		return &intrep.Instruction{
16700			Opcode:   "SARQ",
16701			Operands: []operand.Op{ci, mr},
16702			Inputs:   []operand.Op{mr},
16703			Outputs:  []operand.Op{mr},
16704		}, nil
16705	case operand.IsCL(ci) && operand.IsR64(mr):
16706		return &intrep.Instruction{
16707			Opcode:   "SARQ",
16708			Operands: []operand.Op{ci, mr},
16709			Inputs:   []operand.Op{ci, mr},
16710			Outputs:  []operand.Op{mr},
16711		}, nil
16712	case operand.Is1(ci) && operand.IsM64(mr):
16713		return &intrep.Instruction{
16714			Opcode:   "SARQ",
16715			Operands: []operand.Op{ci, mr},
16716			Inputs:   []operand.Op{mr},
16717			Outputs:  []operand.Op{mr},
16718		}, nil
16719	case operand.IsIMM8(ci) && operand.IsM64(mr):
16720		return &intrep.Instruction{
16721			Opcode:   "SARQ",
16722			Operands: []operand.Op{ci, mr},
16723			Inputs:   []operand.Op{mr},
16724			Outputs:  []operand.Op{mr},
16725		}, nil
16726	case operand.IsCL(ci) && operand.IsM64(mr):
16727		return &intrep.Instruction{
16728			Opcode:   "SARQ",
16729			Operands: []operand.Op{ci, mr},
16730			Inputs:   []operand.Op{ci, mr},
16731			Outputs:  []operand.Op{mr},
16732		}, nil
16733	}
16734	return nil, errors.New("SARQ: bad operands")
16735}
16736
16737// SARW: Arithmetic Shift Right.
16738//
16739// Forms:
16740//
16741// 	SARW 1    r16
16742// 	SARW imm8 r16
16743// 	SARW cl   r16
16744// 	SARW 1    m16
16745// 	SARW imm8 m16
16746// 	SARW cl   m16
16747func SARW(ci, mr operand.Op) (*intrep.Instruction, error) {
16748	switch {
16749	case operand.Is1(ci) && operand.IsR16(mr):
16750		return &intrep.Instruction{
16751			Opcode:   "SARW",
16752			Operands: []operand.Op{ci, mr},
16753			Inputs:   []operand.Op{mr},
16754			Outputs:  []operand.Op{mr},
16755		}, nil
16756	case operand.IsIMM8(ci) && operand.IsR16(mr):
16757		return &intrep.Instruction{
16758			Opcode:   "SARW",
16759			Operands: []operand.Op{ci, mr},
16760			Inputs:   []operand.Op{mr},
16761			Outputs:  []operand.Op{mr},
16762		}, nil
16763	case operand.IsCL(ci) && operand.IsR16(mr):
16764		return &intrep.Instruction{
16765			Opcode:   "SARW",
16766			Operands: []operand.Op{ci, mr},
16767			Inputs:   []operand.Op{ci, mr},
16768			Outputs:  []operand.Op{mr},
16769		}, nil
16770	case operand.Is1(ci) && operand.IsM16(mr):
16771		return &intrep.Instruction{
16772			Opcode:   "SARW",
16773			Operands: []operand.Op{ci, mr},
16774			Inputs:   []operand.Op{mr},
16775			Outputs:  []operand.Op{mr},
16776		}, nil
16777	case operand.IsIMM8(ci) && operand.IsM16(mr):
16778		return &intrep.Instruction{
16779			Opcode:   "SARW",
16780			Operands: []operand.Op{ci, mr},
16781			Inputs:   []operand.Op{mr},
16782			Outputs:  []operand.Op{mr},
16783		}, nil
16784	case operand.IsCL(ci) && operand.IsM16(mr):
16785		return &intrep.Instruction{
16786			Opcode:   "SARW",
16787			Operands: []operand.Op{ci, mr},
16788			Inputs:   []operand.Op{ci, mr},
16789			Outputs:  []operand.Op{mr},
16790		}, nil
16791	}
16792	return nil, errors.New("SARW: bad operands")
16793}
16794
16795// SARXL: Arithmetic Shift Right Without Affecting Flags.
16796//
16797// Forms:
16798//
16799// 	SARXL r32 r32 r32
16800// 	SARXL r32 m32 r32
16801func SARXL(r, mr, r1 operand.Op) (*intrep.Instruction, error) {
16802	switch {
16803	case operand.IsR32(r) && operand.IsR32(mr) && operand.IsR32(r1):
16804		return &intrep.Instruction{
16805			Opcode:   "SARXL",
16806			Operands: []operand.Op{r, mr, r1},
16807			Inputs:   []operand.Op{r, mr},
16808			Outputs:  []operand.Op{r1},
16809			ISA:      []string{"BMI2"},
16810		}, nil
16811	case operand.IsR32(r) && operand.IsM32(mr) && operand.IsR32(r1):
16812		return &intrep.Instruction{
16813			Opcode:   "SARXL",
16814			Operands: []operand.Op{r, mr, r1},
16815			Inputs:   []operand.Op{r, mr},
16816			Outputs:  []operand.Op{r1},
16817			ISA:      []string{"BMI2"},
16818		}, nil
16819	}
16820	return nil, errors.New("SARXL: bad operands")
16821}
16822
16823// SARXQ: Arithmetic Shift Right Without Affecting Flags.
16824//
16825// Forms:
16826//
16827// 	SARXQ r64 r64 r64
16828// 	SARXQ r64 m64 r64
16829func SARXQ(r, mr, r1 operand.Op) (*intrep.Instruction, error) {
16830	switch {
16831	case operand.IsR64(r) && operand.IsR64(mr) && operand.IsR64(r1):
16832		return &intrep.Instruction{
16833			Opcode:   "SARXQ",
16834			Operands: []operand.Op{r, mr, r1},
16835			Inputs:   []operand.Op{r, mr},
16836			Outputs:  []operand.Op{r1},
16837			ISA:      []string{"BMI2"},
16838		}, nil
16839	case operand.IsR64(r) && operand.IsM64(mr) && operand.IsR64(r1):
16840		return &intrep.Instruction{
16841			Opcode:   "SARXQ",
16842			Operands: []operand.Op{r, mr, r1},
16843			Inputs:   []operand.Op{r, mr},
16844			Outputs:  []operand.Op{r1},
16845			ISA:      []string{"BMI2"},
16846		}, nil
16847	}
16848	return nil, errors.New("SARXQ: bad operands")
16849}
16850
16851// SBBB: Subtract with Borrow.
16852//
16853// Forms:
16854//
16855// 	SBBB imm8 al
16856// 	SBBB imm8 r8
16857// 	SBBB r8   r8
16858// 	SBBB m8   r8
16859// 	SBBB imm8 m8
16860// 	SBBB r8   m8
16861func SBBB(imr, amr operand.Op) (*intrep.Instruction, error) {
16862	switch {
16863	case operand.IsIMM8(imr) && operand.IsAL(amr):
16864		return &intrep.Instruction{
16865			Opcode:   "SBBB",
16866			Operands: []operand.Op{imr, amr},
16867			Inputs:   []operand.Op{amr},
16868			Outputs:  []operand.Op{amr},
16869		}, nil
16870	case operand.IsIMM8(imr) && operand.IsR8(amr):
16871		return &intrep.Instruction{
16872			Opcode:   "SBBB",
16873			Operands: []operand.Op{imr, amr},
16874			Inputs:   []operand.Op{amr},
16875			Outputs:  []operand.Op{amr},
16876		}, nil
16877	case operand.IsR8(imr) && operand.IsR8(amr):
16878		return &intrep.Instruction{
16879			Opcode:           "SBBB",
16880			Operands:         []operand.Op{imr, amr},
16881			Inputs:           []operand.Op{imr, amr},
16882			Outputs:          []operand.Op{amr},
16883			CancellingInputs: true,
16884		}, nil
16885	case operand.IsM8(imr) && operand.IsR8(amr):
16886		return &intrep.Instruction{
16887			Opcode:   "SBBB",
16888			Operands: []operand.Op{imr, amr},
16889			Inputs:   []operand.Op{imr, amr},
16890			Outputs:  []operand.Op{amr},
16891		}, nil
16892	case operand.IsIMM8(imr) && operand.IsM8(amr):
16893		return &intrep.Instruction{
16894			Opcode:   "SBBB",
16895			Operands: []operand.Op{imr, amr},
16896			Inputs:   []operand.Op{amr},
16897			Outputs:  []operand.Op{amr},
16898		}, nil
16899	case operand.IsR8(imr) && operand.IsM8(amr):
16900		return &intrep.Instruction{
16901			Opcode:   "SBBB",
16902			Operands: []operand.Op{imr, amr},
16903			Inputs:   []operand.Op{imr, amr},
16904			Outputs:  []operand.Op{amr},
16905		}, nil
16906	}
16907	return nil, errors.New("SBBB: bad operands")
16908}
16909
16910// SBBL: Subtract with Borrow.
16911//
16912// Forms:
16913//
16914// 	SBBL imm32 eax
16915// 	SBBL imm8  r32
16916// 	SBBL imm32 r32
16917// 	SBBL r32   r32
16918// 	SBBL m32   r32
16919// 	SBBL imm8  m32
16920// 	SBBL imm32 m32
16921// 	SBBL r32   m32
16922func SBBL(imr, emr operand.Op) (*intrep.Instruction, error) {
16923	switch {
16924	case operand.IsIMM32(imr) && operand.IsEAX(emr):
16925		return &intrep.Instruction{
16926			Opcode:   "SBBL",
16927			Operands: []operand.Op{imr, emr},
16928			Inputs:   []operand.Op{emr},
16929			Outputs:  []operand.Op{emr},
16930		}, nil
16931	case operand.IsIMM8(imr) && operand.IsR32(emr):
16932		return &intrep.Instruction{
16933			Opcode:   "SBBL",
16934			Operands: []operand.Op{imr, emr},
16935			Inputs:   []operand.Op{emr},
16936			Outputs:  []operand.Op{emr},
16937		}, nil
16938	case operand.IsIMM32(imr) && operand.IsR32(emr):
16939		return &intrep.Instruction{
16940			Opcode:   "SBBL",
16941			Operands: []operand.Op{imr, emr},
16942			Inputs:   []operand.Op{emr},
16943			Outputs:  []operand.Op{emr},
16944		}, nil
16945	case operand.IsR32(imr) && operand.IsR32(emr):
16946		return &intrep.Instruction{
16947			Opcode:           "SBBL",
16948			Operands:         []operand.Op{imr, emr},
16949			Inputs:           []operand.Op{imr, emr},
16950			Outputs:          []operand.Op{emr},
16951			CancellingInputs: true,
16952		}, nil
16953	case operand.IsM32(imr) && operand.IsR32(emr):
16954		return &intrep.Instruction{
16955			Opcode:   "SBBL",
16956			Operands: []operand.Op{imr, emr},
16957			Inputs:   []operand.Op{imr, emr},
16958			Outputs:  []operand.Op{emr},
16959		}, nil
16960	case operand.IsIMM8(imr) && operand.IsM32(emr):
16961		return &intrep.Instruction{
16962			Opcode:   "SBBL",
16963			Operands: []operand.Op{imr, emr},
16964			Inputs:   []operand.Op{emr},
16965			Outputs:  []operand.Op{emr},
16966		}, nil
16967	case operand.IsIMM32(imr) && operand.IsM32(emr):
16968		return &intrep.Instruction{
16969			Opcode:   "SBBL",
16970			Operands: []operand.Op{imr, emr},
16971			Inputs:   []operand.Op{emr},
16972			Outputs:  []operand.Op{emr},
16973		}, nil
16974	case operand.IsR32(imr) && operand.IsM32(emr):
16975		return &intrep.Instruction{
16976			Opcode:   "SBBL",
16977			Operands: []operand.Op{imr, emr},
16978			Inputs:   []operand.Op{imr, emr},
16979			Outputs:  []operand.Op{emr},
16980		}, nil
16981	}
16982	return nil, errors.New("SBBL: bad operands")
16983}
16984
16985// SBBQ: Subtract with Borrow.
16986//
16987// Forms:
16988//
16989// 	SBBQ imm32 rax
16990// 	SBBQ imm8  r64
16991// 	SBBQ imm32 r64
16992// 	SBBQ r64   r64
16993// 	SBBQ m64   r64
16994// 	SBBQ imm8  m64
16995// 	SBBQ imm32 m64
16996// 	SBBQ r64   m64
16997func SBBQ(imr, mr operand.Op) (*intrep.Instruction, error) {
16998	switch {
16999	case operand.IsIMM32(imr) && operand.IsRAX(mr):
17000		return &intrep.Instruction{
17001			Opcode:   "SBBQ",
17002			Operands: []operand.Op{imr, mr},
17003			Inputs:   []operand.Op{mr},
17004			Outputs:  []operand.Op{mr},
17005		}, nil
17006	case operand.IsIMM8(imr) && operand.IsR64(mr):
17007		return &intrep.Instruction{
17008			Opcode:   "SBBQ",
17009			Operands: []operand.Op{imr, mr},
17010			Inputs:   []operand.Op{mr},
17011			Outputs:  []operand.Op{mr},
17012		}, nil
17013	case operand.IsIMM32(imr) && operand.IsR64(mr):
17014		return &intrep.Instruction{
17015			Opcode:   "SBBQ",
17016			Operands: []operand.Op{imr, mr},
17017			Inputs:   []operand.Op{mr},
17018			Outputs:  []operand.Op{mr},
17019		}, nil
17020	case operand.IsR64(imr) && operand.IsR64(mr):
17021		return &intrep.Instruction{
17022			Opcode:           "SBBQ",
17023			Operands:         []operand.Op{imr, mr},
17024			Inputs:           []operand.Op{imr, mr},
17025			Outputs:          []operand.Op{mr},
17026			CancellingInputs: true,
17027		}, nil
17028	case operand.IsM64(imr) && operand.IsR64(mr):
17029		return &intrep.Instruction{
17030			Opcode:   "SBBQ",
17031			Operands: []operand.Op{imr, mr},
17032			Inputs:   []operand.Op{imr, mr},
17033			Outputs:  []operand.Op{mr},
17034		}, nil
17035	case operand.IsIMM8(imr) && operand.IsM64(mr):
17036		return &intrep.Instruction{
17037			Opcode:   "SBBQ",
17038			Operands: []operand.Op{imr, mr},
17039			Inputs:   []operand.Op{mr},
17040			Outputs:  []operand.Op{mr},
17041		}, nil
17042	case operand.IsIMM32(imr) && operand.IsM64(mr):
17043		return &intrep.Instruction{
17044			Opcode:   "SBBQ",
17045			Operands: []operand.Op{imr, mr},
17046			Inputs:   []operand.Op{mr},
17047			Outputs:  []operand.Op{mr},
17048		}, nil
17049	case operand.IsR64(imr) && operand.IsM64(mr):
17050		return &intrep.Instruction{
17051			Opcode:   "SBBQ",
17052			Operands: []operand.Op{imr, mr},
17053			Inputs:   []operand.Op{imr, mr},
17054			Outputs:  []operand.Op{mr},
17055		}, nil
17056	}
17057	return nil, errors.New("SBBQ: bad operands")
17058}
17059
17060// SBBW: Subtract with Borrow.
17061//
17062// Forms:
17063//
17064// 	SBBW imm16 ax
17065// 	SBBW imm8  r16
17066// 	SBBW imm16 r16
17067// 	SBBW r16   r16
17068// 	SBBW m16   r16
17069// 	SBBW imm8  m16
17070// 	SBBW imm16 m16
17071// 	SBBW r16   m16
17072func SBBW(imr, amr operand.Op) (*intrep.Instruction, error) {
17073	switch {
17074	case operand.IsIMM16(imr) && operand.IsAX(amr):
17075		return &intrep.Instruction{
17076			Opcode:   "SBBW",
17077			Operands: []operand.Op{imr, amr},
17078			Inputs:   []operand.Op{amr},
17079			Outputs:  []operand.Op{amr},
17080		}, nil
17081	case operand.IsIMM8(imr) && operand.IsR16(amr):
17082		return &intrep.Instruction{
17083			Opcode:   "SBBW",
17084			Operands: []operand.Op{imr, amr},
17085			Inputs:   []operand.Op{amr},
17086			Outputs:  []operand.Op{amr},
17087		}, nil
17088	case operand.IsIMM16(imr) && operand.IsR16(amr):
17089		return &intrep.Instruction{
17090			Opcode:   "SBBW",
17091			Operands: []operand.Op{imr, amr},
17092			Inputs:   []operand.Op{amr},
17093			Outputs:  []operand.Op{amr},
17094		}, nil
17095	case operand.IsR16(imr) && operand.IsR16(amr):
17096		return &intrep.Instruction{
17097			Opcode:           "SBBW",
17098			Operands:         []operand.Op{imr, amr},
17099			Inputs:           []operand.Op{imr, amr},
17100			Outputs:          []operand.Op{amr},
17101			CancellingInputs: true,
17102		}, nil
17103	case operand.IsM16(imr) && operand.IsR16(amr):
17104		return &intrep.Instruction{
17105			Opcode:   "SBBW",
17106			Operands: []operand.Op{imr, amr},
17107			Inputs:   []operand.Op{imr, amr},
17108			Outputs:  []operand.Op{amr},
17109		}, nil
17110	case operand.IsIMM8(imr) && operand.IsM16(amr):
17111		return &intrep.Instruction{
17112			Opcode:   "SBBW",
17113			Operands: []operand.Op{imr, amr},
17114			Inputs:   []operand.Op{amr},
17115			Outputs:  []operand.Op{amr},
17116		}, nil
17117	case operand.IsIMM16(imr) && operand.IsM16(amr):
17118		return &intrep.Instruction{
17119			Opcode:   "SBBW",
17120			Operands: []operand.Op{imr, amr},
17121			Inputs:   []operand.Op{amr},
17122			Outputs:  []operand.Op{amr},
17123		}, nil
17124	case operand.IsR16(imr) && operand.IsM16(amr):
17125		return &intrep.Instruction{
17126			Opcode:   "SBBW",
17127			Operands: []operand.Op{imr, amr},
17128			Inputs:   []operand.Op{imr, amr},
17129			Outputs:  []operand.Op{amr},
17130		}, nil
17131	}
17132	return nil, errors.New("SBBW: bad operands")
17133}
17134
17135// SETCC: Set byte if above or equal (CF == 0).
17136//
17137// Forms:
17138//
17139// 	SETCC r8
17140// 	SETCC m8
17141func SETCC(mr operand.Op) (*intrep.Instruction, error) {
17142	switch {
17143	case operand.IsR8(mr):
17144		return &intrep.Instruction{
17145			Opcode:   "SETCC",
17146			Operands: []operand.Op{mr},
17147			Inputs:   []operand.Op{},
17148			Outputs:  []operand.Op{mr},
17149		}, nil
17150	case operand.IsM8(mr):
17151		return &intrep.Instruction{
17152			Opcode:   "SETCC",
17153			Operands: []operand.Op{mr},
17154			Inputs:   []operand.Op{},
17155			Outputs:  []operand.Op{mr},
17156		}, nil
17157	}
17158	return nil, errors.New("SETCC: bad operands")
17159}
17160
17161// SETCS: Set byte if below (CF == 1).
17162//
17163// Forms:
17164//
17165// 	SETCS r8
17166// 	SETCS m8
17167func SETCS(mr operand.Op) (*intrep.Instruction, error) {
17168	switch {
17169	case operand.IsR8(mr):
17170		return &intrep.Instruction{
17171			Opcode:   "SETCS",
17172			Operands: []operand.Op{mr},
17173			Inputs:   []operand.Op{},
17174			Outputs:  []operand.Op{mr},
17175		}, nil
17176	case operand.IsM8(mr):
17177		return &intrep.Instruction{
17178			Opcode:   "SETCS",
17179			Operands: []operand.Op{mr},
17180			Inputs:   []operand.Op{},
17181			Outputs:  []operand.Op{mr},
17182		}, nil
17183	}
17184	return nil, errors.New("SETCS: bad operands")
17185}
17186
17187// SETEQ: Set byte if equal (ZF == 1).
17188//
17189// Forms:
17190//
17191// 	SETEQ r8
17192// 	SETEQ m8
17193func SETEQ(mr operand.Op) (*intrep.Instruction, error) {
17194	switch {
17195	case operand.IsR8(mr):
17196		return &intrep.Instruction{
17197			Opcode:   "SETEQ",
17198			Operands: []operand.Op{mr},
17199			Inputs:   []operand.Op{},
17200			Outputs:  []operand.Op{mr},
17201		}, nil
17202	case operand.IsM8(mr):
17203		return &intrep.Instruction{
17204			Opcode:   "SETEQ",
17205			Operands: []operand.Op{mr},
17206			Inputs:   []operand.Op{},
17207			Outputs:  []operand.Op{mr},
17208		}, nil
17209	}
17210	return nil, errors.New("SETEQ: bad operands")
17211}
17212
17213// SETGE: Set byte if greater or equal (SF == OF).
17214//
17215// Forms:
17216//
17217// 	SETGE r8
17218// 	SETGE m8
17219func SETGE(mr operand.Op) (*intrep.Instruction, error) {
17220	switch {
17221	case operand.IsR8(mr):
17222		return &intrep.Instruction{
17223			Opcode:   "SETGE",
17224			Operands: []operand.Op{mr},
17225			Inputs:   []operand.Op{},
17226			Outputs:  []operand.Op{mr},
17227		}, nil
17228	case operand.IsM8(mr):
17229		return &intrep.Instruction{
17230			Opcode:   "SETGE",
17231			Operands: []operand.Op{mr},
17232			Inputs:   []operand.Op{},
17233			Outputs:  []operand.Op{mr},
17234		}, nil
17235	}
17236	return nil, errors.New("SETGE: bad operands")
17237}
17238
17239// SETGT: Set byte if greater (ZF == 0 and SF == OF).
17240//
17241// Forms:
17242//
17243// 	SETGT r8
17244// 	SETGT m8
17245func SETGT(mr operand.Op) (*intrep.Instruction, error) {
17246	switch {
17247	case operand.IsR8(mr):
17248		return &intrep.Instruction{
17249			Opcode:   "SETGT",
17250			Operands: []operand.Op{mr},
17251			Inputs:   []operand.Op{},
17252			Outputs:  []operand.Op{mr},
17253		}, nil
17254	case operand.IsM8(mr):
17255		return &intrep.Instruction{
17256			Opcode:   "SETGT",
17257			Operands: []operand.Op{mr},
17258			Inputs:   []operand.Op{},
17259			Outputs:  []operand.Op{mr},
17260		}, nil
17261	}
17262	return nil, errors.New("SETGT: bad operands")
17263}
17264
17265// SETHI: Set byte if above (CF == 0 and ZF == 0).
17266//
17267// Forms:
17268//
17269// 	SETHI r8
17270// 	SETHI m8
17271func SETHI(mr operand.Op) (*intrep.Instruction, error) {
17272	switch {
17273	case operand.IsR8(mr):
17274		return &intrep.Instruction{
17275			Opcode:   "SETHI",
17276			Operands: []operand.Op{mr},
17277			Inputs:   []operand.Op{},
17278			Outputs:  []operand.Op{mr},
17279		}, nil
17280	case operand.IsM8(mr):
17281		return &intrep.Instruction{
17282			Opcode:   "SETHI",
17283			Operands: []operand.Op{mr},
17284			Inputs:   []operand.Op{},
17285			Outputs:  []operand.Op{mr},
17286		}, nil
17287	}
17288	return nil, errors.New("SETHI: bad operands")
17289}
17290
17291// SETLE: Set byte if less or equal (ZF == 1 or SF != OF).
17292//
17293// Forms:
17294//
17295// 	SETLE r8
17296// 	SETLE m8
17297func SETLE(mr operand.Op) (*intrep.Instruction, error) {
17298	switch {
17299	case operand.IsR8(mr):
17300		return &intrep.Instruction{
17301			Opcode:   "SETLE",
17302			Operands: []operand.Op{mr},
17303			Inputs:   []operand.Op{},
17304			Outputs:  []operand.Op{mr},
17305		}, nil
17306	case operand.IsM8(mr):
17307		return &intrep.Instruction{
17308			Opcode:   "SETLE",
17309			Operands: []operand.Op{mr},
17310			Inputs:   []operand.Op{},
17311			Outputs:  []operand.Op{mr},
17312		}, nil
17313	}
17314	return nil, errors.New("SETLE: bad operands")
17315}
17316
17317// SETLS: Set byte if below or equal (CF == 1 or ZF == 1).
17318//
17319// Forms:
17320//
17321// 	SETLS r8
17322// 	SETLS m8
17323func SETLS(mr operand.Op) (*intrep.Instruction, error) {
17324	switch {
17325	case operand.IsR8(mr):
17326		return &intrep.Instruction{
17327			Opcode:   "SETLS",
17328			Operands: []operand.Op{mr},
17329			Inputs:   []operand.Op{},
17330			Outputs:  []operand.Op{mr},
17331		}, nil
17332	case operand.IsM8(mr):
17333		return &intrep.Instruction{
17334			Opcode:   "SETLS",
17335			Operands: []operand.Op{mr},
17336			Inputs:   []operand.Op{},
17337			Outputs:  []operand.Op{mr},
17338		}, nil
17339	}
17340	return nil, errors.New("SETLS: bad operands")
17341}
17342
17343// SETLT: Set byte if less (SF != OF).
17344//
17345// Forms:
17346//
17347// 	SETLT r8
17348// 	SETLT m8
17349func SETLT(mr operand.Op) (*intrep.Instruction, error) {
17350	switch {
17351	case operand.IsR8(mr):
17352		return &intrep.Instruction{
17353			Opcode:   "SETLT",
17354			Operands: []operand.Op{mr},
17355			Inputs:   []operand.Op{},
17356			Outputs:  []operand.Op{mr},
17357		}, nil
17358	case operand.IsM8(mr):
17359		return &intrep.Instruction{
17360			Opcode:   "SETLT",
17361			Operands: []operand.Op{mr},
17362			Inputs:   []operand.Op{},
17363			Outputs:  []operand.Op{mr},
17364		}, nil
17365	}
17366	return nil, errors.New("SETLT: bad operands")
17367}
17368
17369// SETMI: Set byte if sign (SF == 1).
17370//
17371// Forms:
17372//
17373// 	SETMI r8
17374// 	SETMI m8
17375func SETMI(mr operand.Op) (*intrep.Instruction, error) {
17376	switch {
17377	case operand.IsR8(mr):
17378		return &intrep.Instruction{
17379			Opcode:   "SETMI",
17380			Operands: []operand.Op{mr},
17381			Inputs:   []operand.Op{},
17382			Outputs:  []operand.Op{mr},
17383		}, nil
17384	case operand.IsM8(mr):
17385		return &intrep.Instruction{
17386			Opcode:   "SETMI",
17387			Operands: []operand.Op{mr},
17388			Inputs:   []operand.Op{},
17389			Outputs:  []operand.Op{mr},
17390		}, nil
17391	}
17392	return nil, errors.New("SETMI: bad operands")
17393}
17394
17395// SETNE: Set byte if not equal (ZF == 0).
17396//
17397// Forms:
17398//
17399// 	SETNE r8
17400// 	SETNE m8
17401func SETNE(mr operand.Op) (*intrep.Instruction, error) {
17402	switch {
17403	case operand.IsR8(mr):
17404		return &intrep.Instruction{
17405			Opcode:   "SETNE",
17406			Operands: []operand.Op{mr},
17407			Inputs:   []operand.Op{},
17408			Outputs:  []operand.Op{mr},
17409		}, nil
17410	case operand.IsM8(mr):
17411		return &intrep.Instruction{
17412			Opcode:   "SETNE",
17413			Operands: []operand.Op{mr},
17414			Inputs:   []operand.Op{},
17415			Outputs:  []operand.Op{mr},
17416		}, nil
17417	}
17418	return nil, errors.New("SETNE: bad operands")
17419}
17420
17421// SETOC: Set byte if not overflow (OF == 0).
17422//
17423// Forms:
17424//
17425// 	SETOC r8
17426// 	SETOC m8
17427func SETOC(mr operand.Op) (*intrep.Instruction, error) {
17428	switch {
17429	case operand.IsR8(mr):
17430		return &intrep.Instruction{
17431			Opcode:   "SETOC",
17432			Operands: []operand.Op{mr},
17433			Inputs:   []operand.Op{},
17434			Outputs:  []operand.Op{mr},
17435		}, nil
17436	case operand.IsM8(mr):
17437		return &intrep.Instruction{
17438			Opcode:   "SETOC",
17439			Operands: []operand.Op{mr},
17440			Inputs:   []operand.Op{},
17441			Outputs:  []operand.Op{mr},
17442		}, nil
17443	}
17444	return nil, errors.New("SETOC: bad operands")
17445}
17446
17447// SETOS: Set byte if overflow (OF == 1).
17448//
17449// Forms:
17450//
17451// 	SETOS r8
17452// 	SETOS m8
17453func SETOS(mr operand.Op) (*intrep.Instruction, error) {
17454	switch {
17455	case operand.IsR8(mr):
17456		return &intrep.Instruction{
17457			Opcode:   "SETOS",
17458			Operands: []operand.Op{mr},
17459			Inputs:   []operand.Op{},
17460			Outputs:  []operand.Op{mr},
17461		}, nil
17462	case operand.IsM8(mr):
17463		return &intrep.Instruction{
17464			Opcode:   "SETOS",
17465			Operands: []operand.Op{mr},
17466			Inputs:   []operand.Op{},
17467			Outputs:  []operand.Op{mr},
17468		}, nil
17469	}
17470	return nil, errors.New("SETOS: bad operands")
17471}
17472
17473// SETPC: Set byte if not parity (PF == 0).
17474//
17475// Forms:
17476//
17477// 	SETPC r8
17478// 	SETPC m8
17479func SETPC(mr operand.Op) (*intrep.Instruction, error) {
17480	switch {
17481	case operand.IsR8(mr):
17482		return &intrep.Instruction{
17483			Opcode:   "SETPC",
17484			Operands: []operand.Op{mr},
17485			Inputs:   []operand.Op{},
17486			Outputs:  []operand.Op{mr},
17487		}, nil
17488	case operand.IsM8(mr):
17489		return &intrep.Instruction{
17490			Opcode:   "SETPC",
17491			Operands: []operand.Op{mr},
17492			Inputs:   []operand.Op{},
17493			Outputs:  []operand.Op{mr},
17494		}, nil
17495	}
17496	return nil, errors.New("SETPC: bad operands")
17497}
17498
17499// SETPL: Set byte if not sign (SF == 0).
17500//
17501// Forms:
17502//
17503// 	SETPL r8
17504// 	SETPL m8
17505func SETPL(mr operand.Op) (*intrep.Instruction, error) {
17506	switch {
17507	case operand.IsR8(mr):
17508		return &intrep.Instruction{
17509			Opcode:   "SETPL",
17510			Operands: []operand.Op{mr},
17511			Inputs:   []operand.Op{},
17512			Outputs:  []operand.Op{mr},
17513		}, nil
17514	case operand.IsM8(mr):
17515		return &intrep.Instruction{
17516			Opcode:   "SETPL",
17517			Operands: []operand.Op{mr},
17518			Inputs:   []operand.Op{},
17519			Outputs:  []operand.Op{mr},
17520		}, nil
17521	}
17522	return nil, errors.New("SETPL: bad operands")
17523}
17524
17525// SETPS: Set byte if parity (PF == 1).
17526//
17527// Forms:
17528//
17529// 	SETPS r8
17530// 	SETPS m8
17531func SETPS(mr operand.Op) (*intrep.Instruction, error) {
17532	switch {
17533	case operand.IsR8(mr):
17534		return &intrep.Instruction{
17535			Opcode:   "SETPS",
17536			Operands: []operand.Op{mr},
17537			Inputs:   []operand.Op{},
17538			Outputs:  []operand.Op{mr},
17539		}, nil
17540	case operand.IsM8(mr):
17541		return &intrep.Instruction{
17542			Opcode:   "SETPS",
17543			Operands: []operand.Op{mr},
17544			Inputs:   []operand.Op{},
17545			Outputs:  []operand.Op{mr},
17546		}, nil
17547	}
17548	return nil, errors.New("SETPS: bad operands")
17549}
17550
17551// SFENCE: Store Fence.
17552//
17553// Forms:
17554//
17555// 	SFENCE
17556func SFENCE() (*intrep.Instruction, error) {
17557	return &intrep.Instruction{
17558		Opcode:   "SFENCE",
17559		Operands: nil,
17560		Inputs:   []operand.Op{},
17561		Outputs:  []operand.Op{},
17562		ISA:      []string{"MMX+"},
17563	}, nil
17564}
17565
17566// SHA1MSG1: Perform an Intermediate Calculation for the Next Four SHA1 Message Doublewords.
17567//
17568// Forms:
17569//
17570// 	SHA1MSG1 xmm  xmm
17571// 	SHA1MSG1 m128 xmm
17572func SHA1MSG1(mx, x operand.Op) (*intrep.Instruction, error) {
17573	switch {
17574	case operand.IsXMM(mx) && operand.IsXMM(x):
17575		return &intrep.Instruction{
17576			Opcode:   "SHA1MSG1",
17577			Operands: []operand.Op{mx, x},
17578			Inputs:   []operand.Op{mx, x},
17579			Outputs:  []operand.Op{x},
17580			ISA:      []string{"SHA"},
17581		}, nil
17582	case operand.IsM128(mx) && operand.IsXMM(x):
17583		return &intrep.Instruction{
17584			Opcode:   "SHA1MSG1",
17585			Operands: []operand.Op{mx, x},
17586			Inputs:   []operand.Op{mx, x},
17587			Outputs:  []operand.Op{x},
17588			ISA:      []string{"SHA"},
17589		}, nil
17590	}
17591	return nil, errors.New("SHA1MSG1: bad operands")
17592}
17593
17594// SHA1MSG2: Perform a Final Calculation for the Next Four SHA1 Message Doublewords.
17595//
17596// Forms:
17597//
17598// 	SHA1MSG2 xmm  xmm
17599// 	SHA1MSG2 m128 xmm
17600func SHA1MSG2(mx, x operand.Op) (*intrep.Instruction, error) {
17601	switch {
17602	case operand.IsXMM(mx) && operand.IsXMM(x):
17603		return &intrep.Instruction{
17604			Opcode:   "SHA1MSG2",
17605			Operands: []operand.Op{mx, x},
17606			Inputs:   []operand.Op{mx, x},
17607			Outputs:  []operand.Op{x},
17608			ISA:      []string{"SHA"},
17609		}, nil
17610	case operand.IsM128(mx) && operand.IsXMM(x):
17611		return &intrep.Instruction{
17612			Opcode:   "SHA1MSG2",
17613			Operands: []operand.Op{mx, x},
17614			Inputs:   []operand.Op{mx, x},
17615			Outputs:  []operand.Op{x},
17616			ISA:      []string{"SHA"},
17617		}, nil
17618	}
17619	return nil, errors.New("SHA1MSG2: bad operands")
17620}
17621
17622// SHA1NEXTE: Calculate SHA1 State Variable E after Four Rounds.
17623//
17624// Forms:
17625//
17626// 	SHA1NEXTE xmm  xmm
17627// 	SHA1NEXTE m128 xmm
17628func SHA1NEXTE(mx, x operand.Op) (*intrep.Instruction, error) {
17629	switch {
17630	case operand.IsXMM(mx) && operand.IsXMM(x):
17631		return &intrep.Instruction{
17632			Opcode:   "SHA1NEXTE",
17633			Operands: []operand.Op{mx, x},
17634			Inputs:   []operand.Op{mx, x},
17635			Outputs:  []operand.Op{x},
17636			ISA:      []string{"SHA"},
17637		}, nil
17638	case operand.IsM128(mx) && operand.IsXMM(x):
17639		return &intrep.Instruction{
17640			Opcode:   "SHA1NEXTE",
17641			Operands: []operand.Op{mx, x},
17642			Inputs:   []operand.Op{mx, x},
17643			Outputs:  []operand.Op{x},
17644			ISA:      []string{"SHA"},
17645		}, nil
17646	}
17647	return nil, errors.New("SHA1NEXTE: bad operands")
17648}
17649
17650// SHA1RNDS4: Perform Four Rounds of SHA1 Operation.
17651//
17652// Forms:
17653//
17654// 	SHA1RNDS4 imm2u xmm  xmm
17655// 	SHA1RNDS4 imm2u m128 xmm
17656func SHA1RNDS4(i, mx, x operand.Op) (*intrep.Instruction, error) {
17657	switch {
17658	case operand.IsIMM2U(i) && operand.IsXMM(mx) && operand.IsXMM(x):
17659		return &intrep.Instruction{
17660			Opcode:   "SHA1RNDS4",
17661			Operands: []operand.Op{i, mx, x},
17662			Inputs:   []operand.Op{mx, x},
17663			Outputs:  []operand.Op{x},
17664			ISA:      []string{"SHA"},
17665		}, nil
17666	case operand.IsIMM2U(i) && operand.IsM128(mx) && operand.IsXMM(x):
17667		return &intrep.Instruction{
17668			Opcode:   "SHA1RNDS4",
17669			Operands: []operand.Op{i, mx, x},
17670			Inputs:   []operand.Op{mx, x},
17671			Outputs:  []operand.Op{x},
17672			ISA:      []string{"SHA"},
17673		}, nil
17674	}
17675	return nil, errors.New("SHA1RNDS4: bad operands")
17676}
17677
17678// SHA256MSG1: Perform an Intermediate Calculation for the Next Four SHA256 Message Doublewords.
17679//
17680// Forms:
17681//
17682// 	SHA256MSG1 xmm  xmm
17683// 	SHA256MSG1 m128 xmm
17684func SHA256MSG1(mx, x operand.Op) (*intrep.Instruction, error) {
17685	switch {
17686	case operand.IsXMM(mx) && operand.IsXMM(x):
17687		return &intrep.Instruction{
17688			Opcode:   "SHA256MSG1",
17689			Operands: []operand.Op{mx, x},
17690			Inputs:   []operand.Op{mx, x},
17691			Outputs:  []operand.Op{x},
17692			ISA:      []string{"SHA"},
17693		}, nil
17694	case operand.IsM128(mx) && operand.IsXMM(x):
17695		return &intrep.Instruction{
17696			Opcode:   "SHA256MSG1",
17697			Operands: []operand.Op{mx, x},
17698			Inputs:   []operand.Op{mx, x},
17699			Outputs:  []operand.Op{x},
17700			ISA:      []string{"SHA"},
17701		}, nil
17702	}
17703	return nil, errors.New("SHA256MSG1: bad operands")
17704}
17705
17706// SHA256MSG2: Perform a Final Calculation for the Next Four SHA256 Message Doublewords.
17707//
17708// Forms:
17709//
17710// 	SHA256MSG2 xmm  xmm
17711// 	SHA256MSG2 m128 xmm
17712func SHA256MSG2(mx, x operand.Op) (*intrep.Instruction, error) {
17713	switch {
17714	case operand.IsXMM(mx) && operand.IsXMM(x):
17715		return &intrep.Instruction{
17716			Opcode:   "SHA256MSG2",
17717			Operands: []operand.Op{mx, x},
17718			Inputs:   []operand.Op{mx, x},
17719			Outputs:  []operand.Op{x},
17720			ISA:      []string{"SHA"},
17721		}, nil
17722	case operand.IsM128(mx) && operand.IsXMM(x):
17723		return &intrep.Instruction{
17724			Opcode:   "SHA256MSG2",
17725			Operands: []operand.Op{mx, x},
17726			Inputs:   []operand.Op{mx, x},
17727			Outputs:  []operand.Op{x},
17728			ISA:      []string{"SHA"},
17729		}, nil
17730	}
17731	return nil, errors.New("SHA256MSG2: bad operands")
17732}
17733
17734// SHA256RNDS2: Perform Two Rounds of SHA256 Operation.
17735//
17736// Forms:
17737//
17738// 	SHA256RNDS2 xmm0 xmm  xmm
17739// 	SHA256RNDS2 xmm0 m128 xmm
17740func SHA256RNDS2(x, mx, x1 operand.Op) (*intrep.Instruction, error) {
17741	switch {
17742	case operand.IsXMM0(x) && operand.IsXMM(mx) && operand.IsXMM(x1):
17743		return &intrep.Instruction{
17744			Opcode:   "SHA256RNDS2",
17745			Operands: []operand.Op{x, mx, x1},
17746			Inputs:   []operand.Op{x, mx, x1},
17747			Outputs:  []operand.Op{x1},
17748			ISA:      []string{"SHA"},
17749		}, nil
17750	case operand.IsXMM0(x) && operand.IsM128(mx) && operand.IsXMM(x1):
17751		return &intrep.Instruction{
17752			Opcode:   "SHA256RNDS2",
17753			Operands: []operand.Op{x, mx, x1},
17754			Inputs:   []operand.Op{x, mx, x1},
17755			Outputs:  []operand.Op{x1},
17756			ISA:      []string{"SHA"},
17757		}, nil
17758	}
17759	return nil, errors.New("SHA256RNDS2: bad operands")
17760}
17761
17762// SHLB: Logical Shift Left.
17763//
17764// Forms:
17765//
17766// 	SHLB 1    r8
17767// 	SHLB imm8 r8
17768// 	SHLB cl   r8
17769// 	SHLB 1    m8
17770// 	SHLB imm8 m8
17771// 	SHLB cl   m8
17772func SHLB(ci, mr operand.Op) (*intrep.Instruction, error) {
17773	switch {
17774	case operand.Is1(ci) && operand.IsR8(mr):
17775		return &intrep.Instruction{
17776			Opcode:   "SHLB",
17777			Operands: []operand.Op{ci, mr},
17778			Inputs:   []operand.Op{mr},
17779			Outputs:  []operand.Op{mr},
17780		}, nil
17781	case operand.IsIMM8(ci) && operand.IsR8(mr):
17782		return &intrep.Instruction{
17783			Opcode:   "SHLB",
17784			Operands: []operand.Op{ci, mr},
17785			Inputs:   []operand.Op{mr},
17786			Outputs:  []operand.Op{mr},
17787		}, nil
17788	case operand.IsCL(ci) && operand.IsR8(mr):
17789		return &intrep.Instruction{
17790			Opcode:   "SHLB",
17791			Operands: []operand.Op{ci, mr},
17792			Inputs:   []operand.Op{ci, mr},
17793			Outputs:  []operand.Op{mr},
17794		}, nil
17795	case operand.Is1(ci) && operand.IsM8(mr):
17796		return &intrep.Instruction{
17797			Opcode:   "SHLB",
17798			Operands: []operand.Op{ci, mr},
17799			Inputs:   []operand.Op{mr},
17800			Outputs:  []operand.Op{mr},
17801		}, nil
17802	case operand.IsIMM8(ci) && operand.IsM8(mr):
17803		return &intrep.Instruction{
17804			Opcode:   "SHLB",
17805			Operands: []operand.Op{ci, mr},
17806			Inputs:   []operand.Op{mr},
17807			Outputs:  []operand.Op{mr},
17808		}, nil
17809	case operand.IsCL(ci) && operand.IsM8(mr):
17810		return &intrep.Instruction{
17811			Opcode:   "SHLB",
17812			Operands: []operand.Op{ci, mr},
17813			Inputs:   []operand.Op{ci, mr},
17814			Outputs:  []operand.Op{mr},
17815		}, nil
17816	}
17817	return nil, errors.New("SHLB: bad operands")
17818}
17819
17820// SHLL: Logical Shift Left.
17821//
17822// Forms:
17823//
17824// 	SHLL 1    r32
17825// 	SHLL imm8 r32
17826// 	SHLL cl   r32
17827// 	SHLL 1    m32
17828// 	SHLL imm8 m32
17829// 	SHLL cl   m32
17830// 	SHLL imm8 r32 r32
17831// 	SHLL cl   r32 r32
17832// 	SHLL imm8 r32 m32
17833// 	SHLL cl   r32 m32
17834func SHLL(ops ...operand.Op) (*intrep.Instruction, error) {
17835	switch {
17836	case len(ops) == 2 && operand.Is1(ops[0]) && operand.IsR32(ops[1]):
17837		return &intrep.Instruction{
17838			Opcode:   "SHLL",
17839			Operands: ops,
17840			Inputs:   []operand.Op{ops[1]},
17841			Outputs:  []operand.Op{ops[1]},
17842		}, nil
17843	case len(ops) == 2 && operand.IsIMM8(ops[0]) && operand.IsR32(ops[1]):
17844		return &intrep.Instruction{
17845			Opcode:   "SHLL",
17846			Operands: ops,
17847			Inputs:   []operand.Op{ops[1]},
17848			Outputs:  []operand.Op{ops[1]},
17849		}, nil
17850	case len(ops) == 2 && operand.IsCL(ops[0]) && operand.IsR32(ops[1]):
17851		return &intrep.Instruction{
17852			Opcode:   "SHLL",
17853			Operands: ops,
17854			Inputs:   []operand.Op{ops[0], ops[1]},
17855			Outputs:  []operand.Op{ops[1]},
17856		}, nil
17857	case len(ops) == 2 && operand.Is1(ops[0]) && operand.IsM32(ops[1]):
17858		return &intrep.Instruction{
17859			Opcode:   "SHLL",
17860			Operands: ops,
17861			Inputs:   []operand.Op{ops[1]},
17862			Outputs:  []operand.Op{ops[1]},
17863		}, nil
17864	case len(ops) == 2 && operand.IsIMM8(ops[0]) && operand.IsM32(ops[1]):
17865		return &intrep.Instruction{
17866			Opcode:   "SHLL",
17867			Operands: ops,
17868			Inputs:   []operand.Op{ops[1]},
17869			Outputs:  []operand.Op{ops[1]},
17870		}, nil
17871	case len(ops) == 2 && operand.IsCL(ops[0]) && operand.IsM32(ops[1]):
17872		return &intrep.Instruction{
17873			Opcode:   "SHLL",
17874			Operands: ops,
17875			Inputs:   []operand.Op{ops[0], ops[1]},
17876			Outputs:  []operand.Op{ops[1]},
17877		}, nil
17878	case len(ops) == 3 && operand.IsIMM8(ops[0]) && operand.IsR32(ops[1]) && operand.IsR32(ops[2]):
17879		return &intrep.Instruction{
17880			Opcode:   "SHLL",
17881			Operands: ops,
17882			Inputs:   []operand.Op{ops[1], ops[2]},
17883			Outputs:  []operand.Op{ops[2]},
17884		}, nil
17885	case len(ops) == 3 && operand.IsCL(ops[0]) && operand.IsR32(ops[1]) && operand.IsR32(ops[2]):
17886		return &intrep.Instruction{
17887			Opcode:   "SHLL",
17888			Operands: ops,
17889			Inputs:   []operand.Op{ops[0], ops[1], ops[2]},
17890			Outputs:  []operand.Op{ops[2]},
17891		}, nil
17892	case len(ops) == 3 && operand.IsIMM8(ops[0]) && operand.IsR32(ops[1]) && operand.IsM32(ops[2]):
17893		return &intrep.Instruction{
17894			Opcode:   "SHLL",
17895			Operands: ops,
17896			Inputs:   []operand.Op{ops[1], ops[2]},
17897			Outputs:  []operand.Op{ops[2]},
17898		}, nil
17899	case len(ops) == 3 && operand.IsCL(ops[0]) && operand.IsR32(ops[1]) && operand.IsM32(ops[2]):
17900		return &intrep.Instruction{
17901			Opcode:   "SHLL",
17902			Operands: ops,
17903			Inputs:   []operand.Op{ops[0], ops[1], ops[2]},
17904			Outputs:  []operand.Op{ops[2]},
17905		}, nil
17906	}
17907	return nil, errors.New("SHLL: bad operands")
17908}
17909
17910// SHLQ: Logical Shift Left.
17911//
17912// Forms:
17913//
17914// 	SHLQ 1    r64
17915// 	SHLQ imm8 r64
17916// 	SHLQ cl   r64
17917// 	SHLQ 1    m64
17918// 	SHLQ imm8 m64
17919// 	SHLQ cl   m64
17920// 	SHLQ imm8 r64 r64
17921// 	SHLQ cl   r64 r64
17922// 	SHLQ imm8 r64 m64
17923// 	SHLQ cl   r64 m64
17924func SHLQ(ops ...operand.Op) (*intrep.Instruction, error) {
17925	switch {
17926	case len(ops) == 2 && operand.Is1(ops[0]) && operand.IsR64(ops[1]):
17927		return &intrep.Instruction{
17928			Opcode:   "SHLQ",
17929			Operands: ops,
17930			Inputs:   []operand.Op{ops[1]},
17931			Outputs:  []operand.Op{ops[1]},
17932		}, nil
17933	case len(ops) == 2 && operand.IsIMM8(ops[0]) && operand.IsR64(ops[1]):
17934		return &intrep.Instruction{
17935			Opcode:   "SHLQ",
17936			Operands: ops,
17937			Inputs:   []operand.Op{ops[1]},
17938			Outputs:  []operand.Op{ops[1]},
17939		}, nil
17940	case len(ops) == 2 && operand.IsCL(ops[0]) && operand.IsR64(ops[1]):
17941		return &intrep.Instruction{
17942			Opcode:   "SHLQ",
17943			Operands: ops,
17944			Inputs:   []operand.Op{ops[0], ops[1]},
17945			Outputs:  []operand.Op{ops[1]},
17946		}, nil
17947	case len(ops) == 2 && operand.Is1(ops[0]) && operand.IsM64(ops[1]):
17948		return &intrep.Instruction{
17949			Opcode:   "SHLQ",
17950			Operands: ops,
17951			Inputs:   []operand.Op{ops[1]},
17952			Outputs:  []operand.Op{ops[1]},
17953		}, nil
17954	case len(ops) == 2 && operand.IsIMM8(ops[0]) && operand.IsM64(ops[1]):
17955		return &intrep.Instruction{
17956			Opcode:   "SHLQ",
17957			Operands: ops,
17958			Inputs:   []operand.Op{ops[1]},
17959			Outputs:  []operand.Op{ops[1]},
17960		}, nil
17961	case len(ops) == 2 && operand.IsCL(ops[0]) && operand.IsM64(ops[1]):
17962		return &intrep.Instruction{
17963			Opcode:   "SHLQ",
17964			Operands: ops,
17965			Inputs:   []operand.Op{ops[0], ops[1]},
17966			Outputs:  []operand.Op{ops[1]},
17967		}, nil
17968	case len(ops) == 3 && operand.IsIMM8(ops[0]) && operand.IsR64(ops[1]) && operand.IsR64(ops[2]):
17969		return &intrep.Instruction{
17970			Opcode:   "SHLQ",
17971			Operands: ops,
17972			Inputs:   []operand.Op{ops[1], ops[2]},
17973			Outputs:  []operand.Op{ops[2]},
17974		}, nil
17975	case len(ops) == 3 && operand.IsCL(ops[0]) && operand.IsR64(ops[1]) && operand.IsR64(ops[2]):
17976		return &intrep.Instruction{
17977			Opcode:   "SHLQ",
17978			Operands: ops,
17979			Inputs:   []operand.Op{ops[0], ops[1], ops[2]},
17980			Outputs:  []operand.Op{ops[2]},
17981		}, nil
17982	case len(ops) == 3 && operand.IsIMM8(ops[0]) && operand.IsR64(ops[1]) && operand.IsM64(ops[2]):
17983		return &intrep.Instruction{
17984			Opcode:   "SHLQ",
17985			Operands: ops,
17986			Inputs:   []operand.Op{ops[1], ops[2]},
17987			Outputs:  []operand.Op{ops[2]},
17988		}, nil
17989	case len(ops) == 3 && operand.IsCL(ops[0]) && operand.IsR64(ops[1]) && operand.IsM64(ops[2]):
17990		return &intrep.Instruction{
17991			Opcode:   "SHLQ",
17992			Operands: ops,
17993			Inputs:   []operand.Op{ops[0], ops[1], ops[2]},
17994			Outputs:  []operand.Op{ops[2]},
17995		}, nil
17996	}
17997	return nil, errors.New("SHLQ: bad operands")
17998}
17999
18000// SHLW: Logical Shift Left.
18001//
18002// Forms:
18003//
18004// 	SHLW 1    r16
18005// 	SHLW imm8 r16
18006// 	SHLW cl   r16
18007// 	SHLW 1    m16
18008// 	SHLW imm8 m16
18009// 	SHLW cl   m16
18010// 	SHLW imm8 r16 r16
18011// 	SHLW cl   r16 r16
18012// 	SHLW imm8 r16 m16
18013// 	SHLW cl   r16 m16
18014func SHLW(ops ...operand.Op) (*intrep.Instruction, error) {
18015	switch {
18016	case len(ops) == 2 && operand.Is1(ops[0]) && operand.IsR16(ops[1]):
18017		return &intrep.Instruction{
18018			Opcode:   "SHLW",
18019			Operands: ops,
18020			Inputs:   []operand.Op{ops[1]},
18021			Outputs:  []operand.Op{ops[1]},
18022		}, nil
18023	case len(ops) == 2 && operand.IsIMM8(ops[0]) && operand.IsR16(ops[1]):
18024		return &intrep.Instruction{
18025			Opcode:   "SHLW",
18026			Operands: ops,
18027			Inputs:   []operand.Op{ops[1]},
18028			Outputs:  []operand.Op{ops[1]},
18029		}, nil
18030	case len(ops) == 2 && operand.IsCL(ops[0]) && operand.IsR16(ops[1]):
18031		return &intrep.Instruction{
18032			Opcode:   "SHLW",
18033			Operands: ops,
18034			Inputs:   []operand.Op{ops[0], ops[1]},
18035			Outputs:  []operand.Op{ops[1]},
18036		}, nil
18037	case len(ops) == 2 && operand.Is1(ops[0]) && operand.IsM16(ops[1]):
18038		return &intrep.Instruction{
18039			Opcode:   "SHLW",
18040			Operands: ops,
18041			Inputs:   []operand.Op{ops[1]},
18042			Outputs:  []operand.Op{ops[1]},
18043		}, nil
18044	case len(ops) == 2 && operand.IsIMM8(ops[0]) && operand.IsM16(ops[1]):
18045		return &intrep.Instruction{
18046			Opcode:   "SHLW",
18047			Operands: ops,
18048			Inputs:   []operand.Op{ops[1]},
18049			Outputs:  []operand.Op{ops[1]},
18050		}, nil
18051	case len(ops) == 2 && operand.IsCL(ops[0]) && operand.IsM16(ops[1]):
18052		return &intrep.Instruction{
18053			Opcode:   "SHLW",
18054			Operands: ops,
18055			Inputs:   []operand.Op{ops[0], ops[1]},
18056			Outputs:  []operand.Op{ops[1]},
18057		}, nil
18058	case len(ops) == 3 && operand.IsIMM8(ops[0]) && operand.IsR16(ops[1]) && operand.IsR16(ops[2]):
18059		return &intrep.Instruction{
18060			Opcode:   "SHLW",
18061			Operands: ops,
18062			Inputs:   []operand.Op{ops[1], ops[2]},
18063			Outputs:  []operand.Op{ops[2]},
18064		}, nil
18065	case len(ops) == 3 && operand.IsCL(ops[0]) && operand.IsR16(ops[1]) && operand.IsR16(ops[2]):
18066		return &intrep.Instruction{
18067			Opcode:   "SHLW",
18068			Operands: ops,
18069			Inputs:   []operand.Op{ops[0], ops[1], ops[2]},
18070			Outputs:  []operand.Op{ops[2]},
18071		}, nil
18072	case len(ops) == 3 && operand.IsIMM8(ops[0]) && operand.IsR16(ops[1]) && operand.IsM16(ops[2]):
18073		return &intrep.Instruction{
18074			Opcode:   "SHLW",
18075			Operands: ops,
18076			Inputs:   []operand.Op{ops[1], ops[2]},
18077			Outputs:  []operand.Op{ops[2]},
18078		}, nil
18079	case len(ops) == 3 && operand.IsCL(ops[0]) && operand.IsR16(ops[1]) && operand.IsM16(ops[2]):
18080		return &intrep.Instruction{
18081			Opcode:   "SHLW",
18082			Operands: ops,
18083			Inputs:   []operand.Op{ops[0], ops[1], ops[2]},
18084			Outputs:  []operand.Op{ops[2]},
18085		}, nil
18086	}
18087	return nil, errors.New("SHLW: bad operands")
18088}
18089
18090// SHLXL: Logical Shift Left Without Affecting Flags.
18091//
18092// Forms:
18093//
18094// 	SHLXL r32 r32 r32
18095// 	SHLXL r32 m32 r32
18096func SHLXL(r, mr, r1 operand.Op) (*intrep.Instruction, error) {
18097	switch {
18098	case operand.IsR32(r) && operand.IsR32(mr) && operand.IsR32(r1):
18099		return &intrep.Instruction{
18100			Opcode:   "SHLXL",
18101			Operands: []operand.Op{r, mr, r1},
18102			Inputs:   []operand.Op{r, mr},
18103			Outputs:  []operand.Op{r1},
18104			ISA:      []string{"BMI2"},
18105		}, nil
18106	case operand.IsR32(r) && operand.IsM32(mr) && operand.IsR32(r1):
18107		return &intrep.Instruction{
18108			Opcode:   "SHLXL",
18109			Operands: []operand.Op{r, mr, r1},
18110			Inputs:   []operand.Op{r, mr},
18111			Outputs:  []operand.Op{r1},
18112			ISA:      []string{"BMI2"},
18113		}, nil
18114	}
18115	return nil, errors.New("SHLXL: bad operands")
18116}
18117
18118// SHLXQ: Logical Shift Left Without Affecting Flags.
18119//
18120// Forms:
18121//
18122// 	SHLXQ r64 r64 r64
18123// 	SHLXQ r64 m64 r64
18124func SHLXQ(r, mr, r1 operand.Op) (*intrep.Instruction, error) {
18125	switch {
18126	case operand.IsR64(r) && operand.IsR64(mr) && operand.IsR64(r1):
18127		return &intrep.Instruction{
18128			Opcode:   "SHLXQ",
18129			Operands: []operand.Op{r, mr, r1},
18130			Inputs:   []operand.Op{r, mr},
18131			Outputs:  []operand.Op{r1},
18132			ISA:      []string{"BMI2"},
18133		}, nil
18134	case operand.IsR64(r) && operand.IsM64(mr) && operand.IsR64(r1):
18135		return &intrep.Instruction{
18136			Opcode:   "SHLXQ",
18137			Operands: []operand.Op{r, mr, r1},
18138			Inputs:   []operand.Op{r, mr},
18139			Outputs:  []operand.Op{r1},
18140			ISA:      []string{"BMI2"},
18141		}, nil
18142	}
18143	return nil, errors.New("SHLXQ: bad operands")
18144}
18145
18146// SHRB: Logical Shift Right.
18147//
18148// Forms:
18149//
18150// 	SHRB 1    r8
18151// 	SHRB imm8 r8
18152// 	SHRB cl   r8
18153// 	SHRB 1    m8
18154// 	SHRB imm8 m8
18155// 	SHRB cl   m8
18156func SHRB(ci, mr operand.Op) (*intrep.Instruction, error) {
18157	switch {
18158	case operand.Is1(ci) && operand.IsR8(mr):
18159		return &intrep.Instruction{
18160			Opcode:   "SHRB",
18161			Operands: []operand.Op{ci, mr},
18162			Inputs:   []operand.Op{mr},
18163			Outputs:  []operand.Op{mr},
18164		}, nil
18165	case operand.IsIMM8(ci) && operand.IsR8(mr):
18166		return &intrep.Instruction{
18167			Opcode:   "SHRB",
18168			Operands: []operand.Op{ci, mr},
18169			Inputs:   []operand.Op{mr},
18170			Outputs:  []operand.Op{mr},
18171		}, nil
18172	case operand.IsCL(ci) && operand.IsR8(mr):
18173		return &intrep.Instruction{
18174			Opcode:   "SHRB",
18175			Operands: []operand.Op{ci, mr},
18176			Inputs:   []operand.Op{ci, mr},
18177			Outputs:  []operand.Op{mr},
18178		}, nil
18179	case operand.Is1(ci) && operand.IsM8(mr):
18180		return &intrep.Instruction{
18181			Opcode:   "SHRB",
18182			Operands: []operand.Op{ci, mr},
18183			Inputs:   []operand.Op{mr},
18184			Outputs:  []operand.Op{mr},
18185		}, nil
18186	case operand.IsIMM8(ci) && operand.IsM8(mr):
18187		return &intrep.Instruction{
18188			Opcode:   "SHRB",
18189			Operands: []operand.Op{ci, mr},
18190			Inputs:   []operand.Op{mr},
18191			Outputs:  []operand.Op{mr},
18192		}, nil
18193	case operand.IsCL(ci) && operand.IsM8(mr):
18194		return &intrep.Instruction{
18195			Opcode:   "SHRB",
18196			Operands: []operand.Op{ci, mr},
18197			Inputs:   []operand.Op{ci, mr},
18198			Outputs:  []operand.Op{mr},
18199		}, nil
18200	}
18201	return nil, errors.New("SHRB: bad operands")
18202}
18203
18204// SHRL: Logical Shift Right.
18205//
18206// Forms:
18207//
18208// 	SHRL 1    r32
18209// 	SHRL imm8 r32
18210// 	SHRL cl   r32
18211// 	SHRL 1    m32
18212// 	SHRL imm8 m32
18213// 	SHRL cl   m32
18214// 	SHRL imm8 r32 r32
18215// 	SHRL cl   r32 r32
18216// 	SHRL imm8 r32 m32
18217// 	SHRL cl   r32 m32
18218func SHRL(ops ...operand.Op) (*intrep.Instruction, error) {
18219	switch {
18220	case len(ops) == 2 && operand.Is1(ops[0]) && operand.IsR32(ops[1]):
18221		return &intrep.Instruction{
18222			Opcode:   "SHRL",
18223			Operands: ops,
18224			Inputs:   []operand.Op{ops[1]},
18225			Outputs:  []operand.Op{ops[1]},
18226		}, nil
18227	case len(ops) == 2 && operand.IsIMM8(ops[0]) && operand.IsR32(ops[1]):
18228		return &intrep.Instruction{
18229			Opcode:   "SHRL",
18230			Operands: ops,
18231			Inputs:   []operand.Op{ops[1]},
18232			Outputs:  []operand.Op{ops[1]},
18233		}, nil
18234	case len(ops) == 2 && operand.IsCL(ops[0]) && operand.IsR32(ops[1]):
18235		return &intrep.Instruction{
18236			Opcode:   "SHRL",
18237			Operands: ops,
18238			Inputs:   []operand.Op{ops[0], ops[1]},
18239			Outputs:  []operand.Op{ops[1]},
18240		}, nil
18241	case len(ops) == 2 && operand.Is1(ops[0]) && operand.IsM32(ops[1]):
18242		return &intrep.Instruction{
18243			Opcode:   "SHRL",
18244			Operands: ops,
18245			Inputs:   []operand.Op{ops[1]},
18246			Outputs:  []operand.Op{ops[1]},
18247		}, nil
18248	case len(ops) == 2 && operand.IsIMM8(ops[0]) && operand.IsM32(ops[1]):
18249		return &intrep.Instruction{
18250			Opcode:   "SHRL",
18251			Operands: ops,
18252			Inputs:   []operand.Op{ops[1]},
18253			Outputs:  []operand.Op{ops[1]},
18254		}, nil
18255	case len(ops) == 2 && operand.IsCL(ops[0]) && operand.IsM32(ops[1]):
18256		return &intrep.Instruction{
18257			Opcode:   "SHRL",
18258			Operands: ops,
18259			Inputs:   []operand.Op{ops[0], ops[1]},
18260			Outputs:  []operand.Op{ops[1]},
18261		}, nil
18262	case len(ops) == 3 && operand.IsIMM8(ops[0]) && operand.IsR32(ops[1]) && operand.IsR32(ops[2]):
18263		return &intrep.Instruction{
18264			Opcode:   "SHRL",
18265			Operands: ops,
18266			Inputs:   []operand.Op{ops[1], ops[2]},
18267			Outputs:  []operand.Op{ops[2]},
18268		}, nil
18269	case len(ops) == 3 && operand.IsCL(ops[0]) && operand.IsR32(ops[1]) && operand.IsR32(ops[2]):
18270		return &intrep.Instruction{
18271			Opcode:   "SHRL",
18272			Operands: ops,
18273			Inputs:   []operand.Op{ops[0], ops[1], ops[2]},
18274			Outputs:  []operand.Op{ops[2]},
18275		}, nil
18276	case len(ops) == 3 && operand.IsIMM8(ops[0]) && operand.IsR32(ops[1]) && operand.IsM32(ops[2]):
18277		return &intrep.Instruction{
18278			Opcode:   "SHRL",
18279			Operands: ops,
18280			Inputs:   []operand.Op{ops[1], ops[2]},
18281			Outputs:  []operand.Op{ops[2]},
18282		}, nil
18283	case len(ops) == 3 && operand.IsCL(ops[0]) && operand.IsR32(ops[1]) && operand.IsM32(ops[2]):
18284		return &intrep.Instruction{
18285			Opcode:   "SHRL",
18286			Operands: ops,
18287			Inputs:   []operand.Op{ops[0], ops[1], ops[2]},
18288			Outputs:  []operand.Op{ops[2]},
18289		}, nil
18290	}
18291	return nil, errors.New("SHRL: bad operands")
18292}
18293
18294// SHRQ: Logical Shift Right.
18295//
18296// Forms:
18297//
18298// 	SHRQ 1    r64
18299// 	SHRQ imm8 r64
18300// 	SHRQ cl   r64
18301// 	SHRQ 1    m64
18302// 	SHRQ imm8 m64
18303// 	SHRQ cl   m64
18304// 	SHRQ imm8 r64 r64
18305// 	SHRQ cl   r64 r64
18306// 	SHRQ imm8 r64 m64
18307// 	SHRQ cl   r64 m64
18308func SHRQ(ops ...operand.Op) (*intrep.Instruction, error) {
18309	switch {
18310	case len(ops) == 2 && operand.Is1(ops[0]) && operand.IsR64(ops[1]):
18311		return &intrep.Instruction{
18312			Opcode:   "SHRQ",
18313			Operands: ops,
18314			Inputs:   []operand.Op{ops[1]},
18315			Outputs:  []operand.Op{ops[1]},
18316		}, nil
18317	case len(ops) == 2 && operand.IsIMM8(ops[0]) && operand.IsR64(ops[1]):
18318		return &intrep.Instruction{
18319			Opcode:   "SHRQ",
18320			Operands: ops,
18321			Inputs:   []operand.Op{ops[1]},
18322			Outputs:  []operand.Op{ops[1]},
18323		}, nil
18324	case len(ops) == 2 && operand.IsCL(ops[0]) && operand.IsR64(ops[1]):
18325		return &intrep.Instruction{
18326			Opcode:   "SHRQ",
18327			Operands: ops,
18328			Inputs:   []operand.Op{ops[0], ops[1]},
18329			Outputs:  []operand.Op{ops[1]},
18330		}, nil
18331	case len(ops) == 2 && operand.Is1(ops[0]) && operand.IsM64(ops[1]):
18332		return &intrep.Instruction{
18333			Opcode:   "SHRQ",
18334			Operands: ops,
18335			Inputs:   []operand.Op{ops[1]},
18336			Outputs:  []operand.Op{ops[1]},
18337		}, nil
18338	case len(ops) == 2 && operand.IsIMM8(ops[0]) && operand.IsM64(ops[1]):
18339		return &intrep.Instruction{
18340			Opcode:   "SHRQ",
18341			Operands: ops,
18342			Inputs:   []operand.Op{ops[1]},
18343			Outputs:  []operand.Op{ops[1]},
18344		}, nil
18345	case len(ops) == 2 && operand.IsCL(ops[0]) && operand.IsM64(ops[1]):
18346		return &intrep.Instruction{
18347			Opcode:   "SHRQ",
18348			Operands: ops,
18349			Inputs:   []operand.Op{ops[0], ops[1]},
18350			Outputs:  []operand.Op{ops[1]},
18351		}, nil
18352	case len(ops) == 3 && operand.IsIMM8(ops[0]) && operand.IsR64(ops[1]) && operand.IsR64(ops[2]):
18353		return &intrep.Instruction{
18354			Opcode:   "SHRQ",
18355			Operands: ops,
18356			Inputs:   []operand.Op{ops[1], ops[2]},
18357			Outputs:  []operand.Op{ops[2]},
18358		}, nil
18359	case len(ops) == 3 && operand.IsCL(ops[0]) && operand.IsR64(ops[1]) && operand.IsR64(ops[2]):
18360		return &intrep.Instruction{
18361			Opcode:   "SHRQ",
18362			Operands: ops,
18363			Inputs:   []operand.Op{ops[0], ops[1], ops[2]},
18364			Outputs:  []operand.Op{ops[2]},
18365		}, nil
18366	case len(ops) == 3 && operand.IsIMM8(ops[0]) && operand.IsR64(ops[1]) && operand.IsM64(ops[2]):
18367		return &intrep.Instruction{
18368			Opcode:   "SHRQ",
18369			Operands: ops,
18370			Inputs:   []operand.Op{ops[1], ops[2]},
18371			Outputs:  []operand.Op{ops[2]},
18372		}, nil
18373	case len(ops) == 3 && operand.IsCL(ops[0]) && operand.IsR64(ops[1]) && operand.IsM64(ops[2]):
18374		return &intrep.Instruction{
18375			Opcode:   "SHRQ",
18376			Operands: ops,
18377			Inputs:   []operand.Op{ops[0], ops[1], ops[2]},
18378			Outputs:  []operand.Op{ops[2]},
18379		}, nil
18380	}
18381	return nil, errors.New("SHRQ: bad operands")
18382}
18383
18384// SHRW: Logical Shift Right.
18385//
18386// Forms:
18387//
18388// 	SHRW 1    r16
18389// 	SHRW imm8 r16
18390// 	SHRW cl   r16
18391// 	SHRW 1    m16
18392// 	SHRW imm8 m16
18393// 	SHRW cl   m16
18394// 	SHRW imm8 r16 r16
18395// 	SHRW cl   r16 r16
18396// 	SHRW imm8 r16 m16
18397// 	SHRW cl   r16 m16
18398func SHRW(ops ...operand.Op) (*intrep.Instruction, error) {
18399	switch {
18400	case len(ops) == 2 && operand.Is1(ops[0]) && operand.IsR16(ops[1]):
18401		return &intrep.Instruction{
18402			Opcode:   "SHRW",
18403			Operands: ops,
18404			Inputs:   []operand.Op{ops[1]},
18405			Outputs:  []operand.Op{ops[1]},
18406		}, nil
18407	case len(ops) == 2 && operand.IsIMM8(ops[0]) && operand.IsR16(ops[1]):
18408		return &intrep.Instruction{
18409			Opcode:   "SHRW",
18410			Operands: ops,
18411			Inputs:   []operand.Op{ops[1]},
18412			Outputs:  []operand.Op{ops[1]},
18413		}, nil
18414	case len(ops) == 2 && operand.IsCL(ops[0]) && operand.IsR16(ops[1]):
18415		return &intrep.Instruction{
18416			Opcode:   "SHRW",
18417			Operands: ops,
18418			Inputs:   []operand.Op{ops[0], ops[1]},
18419			Outputs:  []operand.Op{ops[1]},
18420		}, nil
18421	case len(ops) == 2 && operand.Is1(ops[0]) && operand.IsM16(ops[1]):
18422		return &intrep.Instruction{
18423			Opcode:   "SHRW",
18424			Operands: ops,
18425			Inputs:   []operand.Op{ops[1]},
18426			Outputs:  []operand.Op{ops[1]},
18427		}, nil
18428	case len(ops) == 2 && operand.IsIMM8(ops[0]) && operand.IsM16(ops[1]):
18429		return &intrep.Instruction{
18430			Opcode:   "SHRW",
18431			Operands: ops,
18432			Inputs:   []operand.Op{ops[1]},
18433			Outputs:  []operand.Op{ops[1]},
18434		}, nil
18435	case len(ops) == 2 && operand.IsCL(ops[0]) && operand.IsM16(ops[1]):
18436		return &intrep.Instruction{
18437			Opcode:   "SHRW",
18438			Operands: ops,
18439			Inputs:   []operand.Op{ops[0], ops[1]},
18440			Outputs:  []operand.Op{ops[1]},
18441		}, nil
18442	case len(ops) == 3 && operand.IsIMM8(ops[0]) && operand.IsR16(ops[1]) && operand.IsR16(ops[2]):
18443		return &intrep.Instruction{
18444			Opcode:   "SHRW",
18445			Operands: ops,
18446			Inputs:   []operand.Op{ops[1], ops[2]},
18447			Outputs:  []operand.Op{ops[2]},
18448		}, nil
18449	case len(ops) == 3 && operand.IsCL(ops[0]) && operand.IsR16(ops[1]) && operand.IsR16(ops[2]):
18450		return &intrep.Instruction{
18451			Opcode:   "SHRW",
18452			Operands: ops,
18453			Inputs:   []operand.Op{ops[0], ops[1], ops[2]},
18454			Outputs:  []operand.Op{ops[2]},
18455		}, nil
18456	case len(ops) == 3 && operand.IsIMM8(ops[0]) && operand.IsR16(ops[1]) && operand.IsM16(ops[2]):
18457		return &intrep.Instruction{
18458			Opcode:   "SHRW",
18459			Operands: ops,
18460			Inputs:   []operand.Op{ops[1], ops[2]},
18461			Outputs:  []operand.Op{ops[2]},
18462		}, nil
18463	case len(ops) == 3 && operand.IsCL(ops[0]) && operand.IsR16(ops[1]) && operand.IsM16(ops[2]):
18464		return &intrep.Instruction{
18465			Opcode:   "SHRW",
18466			Operands: ops,
18467			Inputs:   []operand.Op{ops[0], ops[1], ops[2]},
18468			Outputs:  []operand.Op{ops[2]},
18469		}, nil
18470	}
18471	return nil, errors.New("SHRW: bad operands")
18472}
18473
18474// SHRXL: Logical Shift Right Without Affecting Flags.
18475//
18476// Forms:
18477//
18478// 	SHRXL r32 r32 r32
18479// 	SHRXL r32 m32 r32
18480func SHRXL(r, mr, r1 operand.Op) (*intrep.Instruction, error) {
18481	switch {
18482	case operand.IsR32(r) && operand.IsR32(mr) && operand.IsR32(r1):
18483		return &intrep.Instruction{
18484			Opcode:   "SHRXL",
18485			Operands: []operand.Op{r, mr, r1},
18486			Inputs:   []operand.Op{r, mr},
18487			Outputs:  []operand.Op{r1},
18488			ISA:      []string{"BMI2"},
18489		}, nil
18490	case operand.IsR32(r) && operand.IsM32(mr) && operand.IsR32(r1):
18491		return &intrep.Instruction{
18492			Opcode:   "SHRXL",
18493			Operands: []operand.Op{r, mr, r1},
18494			Inputs:   []operand.Op{r, mr},
18495			Outputs:  []operand.Op{r1},
18496			ISA:      []string{"BMI2"},
18497		}, nil
18498	}
18499	return nil, errors.New("SHRXL: bad operands")
18500}
18501
18502// SHRXQ: Logical Shift Right Without Affecting Flags.
18503//
18504// Forms:
18505//
18506// 	SHRXQ r64 r64 r64
18507// 	SHRXQ r64 m64 r64
18508func SHRXQ(r, mr, r1 operand.Op) (*intrep.Instruction, error) {
18509	switch {
18510	case operand.IsR64(r) && operand.IsR64(mr) && operand.IsR64(r1):
18511		return &intrep.Instruction{
18512			Opcode:   "SHRXQ",
18513			Operands: []operand.Op{r, mr, r1},
18514			Inputs:   []operand.Op{r, mr},
18515			Outputs:  []operand.Op{r1},
18516			ISA:      []string{"BMI2"},
18517		}, nil
18518	case operand.IsR64(r) && operand.IsM64(mr) && operand.IsR64(r1):
18519		return &intrep.Instruction{
18520			Opcode:   "SHRXQ",
18521			Operands: []operand.Op{r, mr, r1},
18522			Inputs:   []operand.Op{r, mr},
18523			Outputs:  []operand.Op{r1},
18524			ISA:      []string{"BMI2"},
18525		}, nil
18526	}
18527	return nil, errors.New("SHRXQ: bad operands")
18528}
18529
18530// SHUFPD: Shuffle Packed Double-Precision Floating-Point Values.
18531//
18532// Forms:
18533//
18534// 	SHUFPD imm8 xmm  xmm
18535// 	SHUFPD imm8 m128 xmm
18536func SHUFPD(i, mx, x operand.Op) (*intrep.Instruction, error) {
18537	switch {
18538	case operand.IsIMM8(i) && operand.IsXMM(mx) && operand.IsXMM(x):
18539		return &intrep.Instruction{
18540			Opcode:   "SHUFPD",
18541			Operands: []operand.Op{i, mx, x},
18542			Inputs:   []operand.Op{mx, x},
18543			Outputs:  []operand.Op{x},
18544			ISA:      []string{"SSE2"},
18545		}, nil
18546	case operand.IsIMM8(i) && operand.IsM128(mx) && operand.IsXMM(x):
18547		return &intrep.Instruction{
18548			Opcode:   "SHUFPD",
18549			Operands: []operand.Op{i, mx, x},
18550			Inputs:   []operand.Op{mx, x},
18551			Outputs:  []operand.Op{x},
18552			ISA:      []string{"SSE2"},
18553		}, nil
18554	}
18555	return nil, errors.New("SHUFPD: bad operands")
18556}
18557
18558// SHUFPS: Shuffle Packed Single-Precision Floating-Point Values.
18559//
18560// Forms:
18561//
18562// 	SHUFPS imm8 xmm  xmm
18563// 	SHUFPS imm8 m128 xmm
18564func SHUFPS(i, mx, x operand.Op) (*intrep.Instruction, error) {
18565	switch {
18566	case operand.IsIMM8(i) && operand.IsXMM(mx) && operand.IsXMM(x):
18567		return &intrep.Instruction{
18568			Opcode:   "SHUFPS",
18569			Operands: []operand.Op{i, mx, x},
18570			Inputs:   []operand.Op{mx, x},
18571			Outputs:  []operand.Op{x},
18572			ISA:      []string{"SSE"},
18573		}, nil
18574	case operand.IsIMM8(i) && operand.IsM128(mx) && operand.IsXMM(x):
18575		return &intrep.Instruction{
18576			Opcode:   "SHUFPS",
18577			Operands: []operand.Op{i, mx, x},
18578			Inputs:   []operand.Op{mx, x},
18579			Outputs:  []operand.Op{x},
18580			ISA:      []string{"SSE"},
18581		}, nil
18582	}
18583	return nil, errors.New("SHUFPS: bad operands")
18584}
18585
18586// SQRTPD: Compute Square Roots of Packed Double-Precision Floating-Point Values.
18587//
18588// Forms:
18589//
18590// 	SQRTPD xmm  xmm
18591// 	SQRTPD m128 xmm
18592func SQRTPD(mx, x operand.Op) (*intrep.Instruction, error) {
18593	switch {
18594	case operand.IsXMM(mx) && operand.IsXMM(x):
18595		return &intrep.Instruction{
18596			Opcode:   "SQRTPD",
18597			Operands: []operand.Op{mx, x},
18598			Inputs:   []operand.Op{mx},
18599			Outputs:  []operand.Op{x},
18600			ISA:      []string{"SSE2"},
18601		}, nil
18602	case operand.IsM128(mx) && operand.IsXMM(x):
18603		return &intrep.Instruction{
18604			Opcode:   "SQRTPD",
18605			Operands: []operand.Op{mx, x},
18606			Inputs:   []operand.Op{mx},
18607			Outputs:  []operand.Op{x},
18608			ISA:      []string{"SSE2"},
18609		}, nil
18610	}
18611	return nil, errors.New("SQRTPD: bad operands")
18612}
18613
18614// SQRTPS: Compute Square Roots of Packed Single-Precision Floating-Point Values.
18615//
18616// Forms:
18617//
18618// 	SQRTPS xmm  xmm
18619// 	SQRTPS m128 xmm
18620func SQRTPS(mx, x operand.Op) (*intrep.Instruction, error) {
18621	switch {
18622	case operand.IsXMM(mx) && operand.IsXMM(x):
18623		return &intrep.Instruction{
18624			Opcode:   "SQRTPS",
18625			Operands: []operand.Op{mx, x},
18626			Inputs:   []operand.Op{mx},
18627			Outputs:  []operand.Op{x},
18628			ISA:      []string{"SSE"},
18629		}, nil
18630	case operand.IsM128(mx) && operand.IsXMM(x):
18631		return &intrep.Instruction{
18632			Opcode:   "SQRTPS",
18633			Operands: []operand.Op{mx, x},
18634			Inputs:   []operand.Op{mx},
18635			Outputs:  []operand.Op{x},
18636			ISA:      []string{"SSE"},
18637		}, nil
18638	}
18639	return nil, errors.New("SQRTPS: bad operands")
18640}
18641
18642// SQRTSD: Compute Square Root of Scalar Double-Precision Floating-Point Value.
18643//
18644// Forms:
18645//
18646// 	SQRTSD xmm xmm
18647// 	SQRTSD m64 xmm
18648func SQRTSD(mx, x operand.Op) (*intrep.Instruction, error) {
18649	switch {
18650	case operand.IsXMM(mx) && operand.IsXMM(x):
18651		return &intrep.Instruction{
18652			Opcode:   "SQRTSD",
18653			Operands: []operand.Op{mx, x},
18654			Inputs:   []operand.Op{mx, x},
18655			Outputs:  []operand.Op{x},
18656			ISA:      []string{"SSE2"},
18657		}, nil
18658	case operand.IsM64(mx) && operand.IsXMM(x):
18659		return &intrep.Instruction{
18660			Opcode:   "SQRTSD",
18661			Operands: []operand.Op{mx, x},
18662			Inputs:   []operand.Op{mx, x},
18663			Outputs:  []operand.Op{x},
18664			ISA:      []string{"SSE2"},
18665		}, nil
18666	}
18667	return nil, errors.New("SQRTSD: bad operands")
18668}
18669
18670// SQRTSS: Compute Square Root of Scalar Single-Precision Floating-Point Value.
18671//
18672// Forms:
18673//
18674// 	SQRTSS xmm xmm
18675// 	SQRTSS m32 xmm
18676func SQRTSS(mx, x operand.Op) (*intrep.Instruction, error) {
18677	switch {
18678	case operand.IsXMM(mx) && operand.IsXMM(x):
18679		return &intrep.Instruction{
18680			Opcode:   "SQRTSS",
18681			Operands: []operand.Op{mx, x},
18682			Inputs:   []operand.Op{mx, x},
18683			Outputs:  []operand.Op{x},
18684			ISA:      []string{"SSE"},
18685		}, nil
18686	case operand.IsM32(mx) && operand.IsXMM(x):
18687		return &intrep.Instruction{
18688			Opcode:   "SQRTSS",
18689			Operands: []operand.Op{mx, x},
18690			Inputs:   []operand.Op{mx, x},
18691			Outputs:  []operand.Op{x},
18692			ISA:      []string{"SSE"},
18693		}, nil
18694	}
18695	return nil, errors.New("SQRTSS: bad operands")
18696}
18697
18698// STC: Set Carry Flag.
18699//
18700// Forms:
18701//
18702// 	STC
18703func STC() (*intrep.Instruction, error) {
18704	return &intrep.Instruction{
18705		Opcode:   "STC",
18706		Operands: nil,
18707		Inputs:   []operand.Op{},
18708		Outputs:  []operand.Op{},
18709	}, nil
18710}
18711
18712// STD: Set Direction Flag.
18713//
18714// Forms:
18715//
18716// 	STD
18717func STD() (*intrep.Instruction, error) {
18718	return &intrep.Instruction{
18719		Opcode:   "STD",
18720		Operands: nil,
18721		Inputs:   []operand.Op{},
18722		Outputs:  []operand.Op{},
18723	}, nil
18724}
18725
18726// STMXCSR: Store MXCSR Register State.
18727//
18728// Forms:
18729//
18730// 	STMXCSR m32
18731func STMXCSR(m operand.Op) (*intrep.Instruction, error) {
18732	switch {
18733	case operand.IsM32(m):
18734		return &intrep.Instruction{
18735			Opcode:   "STMXCSR",
18736			Operands: []operand.Op{m},
18737			Inputs:   []operand.Op{},
18738			Outputs:  []operand.Op{m},
18739			ISA:      []string{"SSE"},
18740		}, nil
18741	}
18742	return nil, errors.New("STMXCSR: bad operands")
18743}
18744
18745// SUBB: Subtract.
18746//
18747// Forms:
18748//
18749// 	SUBB imm8 al
18750// 	SUBB imm8 r8
18751// 	SUBB r8   r8
18752// 	SUBB m8   r8
18753// 	SUBB imm8 m8
18754// 	SUBB r8   m8
18755func SUBB(imr, amr operand.Op) (*intrep.Instruction, error) {
18756	switch {
18757	case operand.IsIMM8(imr) && operand.IsAL(amr):
18758		return &intrep.Instruction{
18759			Opcode:   "SUBB",
18760			Operands: []operand.Op{imr, amr},
18761			Inputs:   []operand.Op{amr},
18762			Outputs:  []operand.Op{amr},
18763		}, nil
18764	case operand.IsIMM8(imr) && operand.IsR8(amr):
18765		return &intrep.Instruction{
18766			Opcode:   "SUBB",
18767			Operands: []operand.Op{imr, amr},
18768			Inputs:   []operand.Op{amr},
18769			Outputs:  []operand.Op{amr},
18770		}, nil
18771	case operand.IsR8(imr) && operand.IsR8(amr):
18772		return &intrep.Instruction{
18773			Opcode:           "SUBB",
18774			Operands:         []operand.Op{imr, amr},
18775			Inputs:           []operand.Op{imr, amr},
18776			Outputs:          []operand.Op{amr},
18777			CancellingInputs: true,
18778		}, nil
18779	case operand.IsM8(imr) && operand.IsR8(amr):
18780		return &intrep.Instruction{
18781			Opcode:   "SUBB",
18782			Operands: []operand.Op{imr, amr},
18783			Inputs:   []operand.Op{imr, amr},
18784			Outputs:  []operand.Op{amr},
18785		}, nil
18786	case operand.IsIMM8(imr) && operand.IsM8(amr):
18787		return &intrep.Instruction{
18788			Opcode:   "SUBB",
18789			Operands: []operand.Op{imr, amr},
18790			Inputs:   []operand.Op{amr},
18791			Outputs:  []operand.Op{amr},
18792		}, nil
18793	case operand.IsR8(imr) && operand.IsM8(amr):
18794		return &intrep.Instruction{
18795			Opcode:   "SUBB",
18796			Operands: []operand.Op{imr, amr},
18797			Inputs:   []operand.Op{imr, amr},
18798			Outputs:  []operand.Op{amr},
18799		}, nil
18800	}
18801	return nil, errors.New("SUBB: bad operands")
18802}
18803
18804// SUBL: Subtract.
18805//
18806// Forms:
18807//
18808// 	SUBL imm32 eax
18809// 	SUBL imm8  r32
18810// 	SUBL imm32 r32
18811// 	SUBL r32   r32
18812// 	SUBL m32   r32
18813// 	SUBL imm8  m32
18814// 	SUBL imm32 m32
18815// 	SUBL r32   m32
18816func SUBL(imr, emr operand.Op) (*intrep.Instruction, error) {
18817	switch {
18818	case operand.IsIMM32(imr) && operand.IsEAX(emr):
18819		return &intrep.Instruction{
18820			Opcode:   "SUBL",
18821			Operands: []operand.Op{imr, emr},
18822			Inputs:   []operand.Op{emr},
18823			Outputs:  []operand.Op{emr},
18824		}, nil
18825	case operand.IsIMM8(imr) && operand.IsR32(emr):
18826		return &intrep.Instruction{
18827			Opcode:   "SUBL",
18828			Operands: []operand.Op{imr, emr},
18829			Inputs:   []operand.Op{emr},
18830			Outputs:  []operand.Op{emr},
18831		}, nil
18832	case operand.IsIMM32(imr) && operand.IsR32(emr):
18833		return &intrep.Instruction{
18834			Opcode:   "SUBL",
18835			Operands: []operand.Op{imr, emr},
18836			Inputs:   []operand.Op{emr},
18837			Outputs:  []operand.Op{emr},
18838		}, nil
18839	case operand.IsR32(imr) && operand.IsR32(emr):
18840		return &intrep.Instruction{
18841			Opcode:           "SUBL",
18842			Operands:         []operand.Op{imr, emr},
18843			Inputs:           []operand.Op{imr, emr},
18844			Outputs:          []operand.Op{emr},
18845			CancellingInputs: true,
18846		}, nil
18847	case operand.IsM32(imr) && operand.IsR32(emr):
18848		return &intrep.Instruction{
18849			Opcode:   "SUBL",
18850			Operands: []operand.Op{imr, emr},
18851			Inputs:   []operand.Op{imr, emr},
18852			Outputs:  []operand.Op{emr},
18853		}, nil
18854	case operand.IsIMM8(imr) && operand.IsM32(emr):
18855		return &intrep.Instruction{
18856			Opcode:   "SUBL",
18857			Operands: []operand.Op{imr, emr},
18858			Inputs:   []operand.Op{emr},
18859			Outputs:  []operand.Op{emr},
18860		}, nil
18861	case operand.IsIMM32(imr) && operand.IsM32(emr):
18862		return &intrep.Instruction{
18863			Opcode:   "SUBL",
18864			Operands: []operand.Op{imr, emr},
18865			Inputs:   []operand.Op{emr},
18866			Outputs:  []operand.Op{emr},
18867		}, nil
18868	case operand.IsR32(imr) && operand.IsM32(emr):
18869		return &intrep.Instruction{
18870			Opcode:   "SUBL",
18871			Operands: []operand.Op{imr, emr},
18872			Inputs:   []operand.Op{imr, emr},
18873			Outputs:  []operand.Op{emr},
18874		}, nil
18875	}
18876	return nil, errors.New("SUBL: bad operands")
18877}
18878
18879// SUBPD: Subtract Packed Double-Precision Floating-Point Values.
18880//
18881// Forms:
18882//
18883// 	SUBPD xmm  xmm
18884// 	SUBPD m128 xmm
18885func SUBPD(mx, x operand.Op) (*intrep.Instruction, error) {
18886	switch {
18887	case operand.IsXMM(mx) && operand.IsXMM(x):
18888		return &intrep.Instruction{
18889			Opcode:   "SUBPD",
18890			Operands: []operand.Op{mx, x},
18891			Inputs:   []operand.Op{mx, x},
18892			Outputs:  []operand.Op{x},
18893			ISA:      []string{"SSE2"},
18894		}, nil
18895	case operand.IsM128(mx) && operand.IsXMM(x):
18896		return &intrep.Instruction{
18897			Opcode:   "SUBPD",
18898			Operands: []operand.Op{mx, x},
18899			Inputs:   []operand.Op{mx, x},
18900			Outputs:  []operand.Op{x},
18901			ISA:      []string{"SSE2"},
18902		}, nil
18903	}
18904	return nil, errors.New("SUBPD: bad operands")
18905}
18906
18907// SUBPS: Subtract Packed Single-Precision Floating-Point Values.
18908//
18909// Forms:
18910//
18911// 	SUBPS xmm  xmm
18912// 	SUBPS m128 xmm
18913func SUBPS(mx, x operand.Op) (*intrep.Instruction, error) {
18914	switch {
18915	case operand.IsXMM(mx) && operand.IsXMM(x):
18916		return &intrep.Instruction{
18917			Opcode:   "SUBPS",
18918			Operands: []operand.Op{mx, x},
18919			Inputs:   []operand.Op{mx, x},
18920			Outputs:  []operand.Op{x},
18921			ISA:      []string{"SSE"},
18922		}, nil
18923	case operand.IsM128(mx) && operand.IsXMM(x):
18924		return &intrep.Instruction{
18925			Opcode:   "SUBPS",
18926			Operands: []operand.Op{mx, x},
18927			Inputs:   []operand.Op{mx, x},
18928			Outputs:  []operand.Op{x},
18929			ISA:      []string{"SSE"},
18930		}, nil
18931	}
18932	return nil, errors.New("SUBPS: bad operands")
18933}
18934
18935// SUBQ: Subtract.
18936//
18937// Forms:
18938//
18939// 	SUBQ imm32 rax
18940// 	SUBQ imm8  r64
18941// 	SUBQ imm32 r64
18942// 	SUBQ r64   r64
18943// 	SUBQ m64   r64
18944// 	SUBQ imm8  m64
18945// 	SUBQ imm32 m64
18946// 	SUBQ r64   m64
18947func SUBQ(imr, mr operand.Op) (*intrep.Instruction, error) {
18948	switch {
18949	case operand.IsIMM32(imr) && operand.IsRAX(mr):
18950		return &intrep.Instruction{
18951			Opcode:   "SUBQ",
18952			Operands: []operand.Op{imr, mr},
18953			Inputs:   []operand.Op{mr},
18954			Outputs:  []operand.Op{mr},
18955		}, nil
18956	case operand.IsIMM8(imr) && operand.IsR64(mr):
18957		return &intrep.Instruction{
18958			Opcode:   "SUBQ",
18959			Operands: []operand.Op{imr, mr},
18960			Inputs:   []operand.Op{mr},
18961			Outputs:  []operand.Op{mr},
18962		}, nil
18963	case operand.IsIMM32(imr) && operand.IsR64(mr):
18964		return &intrep.Instruction{
18965			Opcode:   "SUBQ",
18966			Operands: []operand.Op{imr, mr},
18967			Inputs:   []operand.Op{mr},
18968			Outputs:  []operand.Op{mr},
18969		}, nil
18970	case operand.IsR64(imr) && operand.IsR64(mr):
18971		return &intrep.Instruction{
18972			Opcode:           "SUBQ",
18973			Operands:         []operand.Op{imr, mr},
18974			Inputs:           []operand.Op{imr, mr},
18975			Outputs:          []operand.Op{mr},
18976			CancellingInputs: true,
18977		}, nil
18978	case operand.IsM64(imr) && operand.IsR64(mr):
18979		return &intrep.Instruction{
18980			Opcode:   "SUBQ",
18981			Operands: []operand.Op{imr, mr},
18982			Inputs:   []operand.Op{imr, mr},
18983			Outputs:  []operand.Op{mr},
18984		}, nil
18985	case operand.IsIMM8(imr) && operand.IsM64(mr):
18986		return &intrep.Instruction{
18987			Opcode:   "SUBQ",
18988			Operands: []operand.Op{imr, mr},
18989			Inputs:   []operand.Op{mr},
18990			Outputs:  []operand.Op{mr},
18991		}, nil
18992	case operand.IsIMM32(imr) && operand.IsM64(mr):
18993		return &intrep.Instruction{
18994			Opcode:   "SUBQ",
18995			Operands: []operand.Op{imr, mr},
18996			Inputs:   []operand.Op{mr},
18997			Outputs:  []operand.Op{mr},
18998		}, nil
18999	case operand.IsR64(imr) && operand.IsM64(mr):
19000		return &intrep.Instruction{
19001			Opcode:   "SUBQ",
19002			Operands: []operand.Op{imr, mr},
19003			Inputs:   []operand.Op{imr, mr},
19004			Outputs:  []operand.Op{mr},
19005		}, nil
19006	}
19007	return nil, errors.New("SUBQ: bad operands")
19008}
19009
19010// SUBSD: Subtract Scalar Double-Precision Floating-Point Values.
19011//
19012// Forms:
19013//
19014// 	SUBSD xmm xmm
19015// 	SUBSD m64 xmm
19016func SUBSD(mx, x operand.Op) (*intrep.Instruction, error) {
19017	switch {
19018	case operand.IsXMM(mx) && operand.IsXMM(x):
19019		return &intrep.Instruction{
19020			Opcode:   "SUBSD",
19021			Operands: []operand.Op{mx, x},
19022			Inputs:   []operand.Op{mx, x},
19023			Outputs:  []operand.Op{x},
19024			ISA:      []string{"SSE2"},
19025		}, nil
19026	case operand.IsM64(mx) && operand.IsXMM(x):
19027		return &intrep.Instruction{
19028			Opcode:   "SUBSD",
19029			Operands: []operand.Op{mx, x},
19030			Inputs:   []operand.Op{mx, x},
19031			Outputs:  []operand.Op{x},
19032			ISA:      []string{"SSE2"},
19033		}, nil
19034	}
19035	return nil, errors.New("SUBSD: bad operands")
19036}
19037
19038// SUBSS: Subtract Scalar Single-Precision Floating-Point Values.
19039//
19040// Forms:
19041//
19042// 	SUBSS xmm xmm
19043// 	SUBSS m32 xmm
19044func SUBSS(mx, x operand.Op) (*intrep.Instruction, error) {
19045	switch {
19046	case operand.IsXMM(mx) && operand.IsXMM(x):
19047		return &intrep.Instruction{
19048			Opcode:   "SUBSS",
19049			Operands: []operand.Op{mx, x},
19050			Inputs:   []operand.Op{mx, x},
19051			Outputs:  []operand.Op{x},
19052			ISA:      []string{"SSE"},
19053		}, nil
19054	case operand.IsM32(mx) && operand.IsXMM(x):
19055		return &intrep.Instruction{
19056			Opcode:   "SUBSS",
19057			Operands: []operand.Op{mx, x},
19058			Inputs:   []operand.Op{mx, x},
19059			Outputs:  []operand.Op{x},
19060			ISA:      []string{"SSE"},
19061		}, nil
19062	}
19063	return nil, errors.New("SUBSS: bad operands")
19064}
19065
19066// SUBW: Subtract.
19067//
19068// Forms:
19069//
19070// 	SUBW imm16 ax
19071// 	SUBW imm8  r16
19072// 	SUBW imm16 r16
19073// 	SUBW r16   r16
19074// 	SUBW m16   r16
19075// 	SUBW imm8  m16
19076// 	SUBW imm16 m16
19077// 	SUBW r16   m16
19078func SUBW(imr, amr operand.Op) (*intrep.Instruction, error) {
19079	switch {
19080	case operand.IsIMM16(imr) && operand.IsAX(amr):
19081		return &intrep.Instruction{
19082			Opcode:   "SUBW",
19083			Operands: []operand.Op{imr, amr},
19084			Inputs:   []operand.Op{amr},
19085			Outputs:  []operand.Op{amr},
19086		}, nil
19087	case operand.IsIMM8(imr) && operand.IsR16(amr):
19088		return &intrep.Instruction{
19089			Opcode:   "SUBW",
19090			Operands: []operand.Op{imr, amr},
19091			Inputs:   []operand.Op{amr},
19092			Outputs:  []operand.Op{amr},
19093		}, nil
19094	case operand.IsIMM16(imr) && operand.IsR16(amr):
19095		return &intrep.Instruction{
19096			Opcode:   "SUBW",
19097			Operands: []operand.Op{imr, amr},
19098			Inputs:   []operand.Op{amr},
19099			Outputs:  []operand.Op{amr},
19100		}, nil
19101	case operand.IsR16(imr) && operand.IsR16(amr):
19102		return &intrep.Instruction{
19103			Opcode:           "SUBW",
19104			Operands:         []operand.Op{imr, amr},
19105			Inputs:           []operand.Op{imr, amr},
19106			Outputs:          []operand.Op{amr},
19107			CancellingInputs: true,
19108		}, nil
19109	case operand.IsM16(imr) && operand.IsR16(amr):
19110		return &intrep.Instruction{
19111			Opcode:   "SUBW",
19112			Operands: []operand.Op{imr, amr},
19113			Inputs:   []operand.Op{imr, amr},
19114			Outputs:  []operand.Op{amr},
19115		}, nil
19116	case operand.IsIMM8(imr) && operand.IsM16(amr):
19117		return &intrep.Instruction{
19118			Opcode:   "SUBW",
19119			Operands: []operand.Op{imr, amr},
19120			Inputs:   []operand.Op{amr},
19121			Outputs:  []operand.Op{amr},
19122		}, nil
19123	case operand.IsIMM16(imr) && operand.IsM16(amr):
19124		return &intrep.Instruction{
19125			Opcode:   "SUBW",
19126			Operands: []operand.Op{imr, amr},
19127			Inputs:   []operand.Op{amr},
19128			Outputs:  []operand.Op{amr},
19129		}, nil
19130	case operand.IsR16(imr) && operand.IsM16(amr):
19131		return &intrep.Instruction{
19132			Opcode:   "SUBW",
19133			Operands: []operand.Op{imr, amr},
19134			Inputs:   []operand.Op{imr, amr},
19135			Outputs:  []operand.Op{amr},
19136		}, nil
19137	}
19138	return nil, errors.New("SUBW: bad operands")
19139}
19140
19141// SYSCALL: Fast System Call.
19142//
19143// Forms:
19144//
19145// 	SYSCALL
19146func SYSCALL() (*intrep.Instruction, error) {
19147	return &intrep.Instruction{
19148		Opcode:   "SYSCALL",
19149		Operands: nil,
19150		Inputs:   []operand.Op{},
19151		Outputs:  []operand.Op{reg.R11, reg.RCX},
19152	}, nil
19153}
19154
19155// TESTB: Logical Compare.
19156//
19157// Forms:
19158//
19159// 	TESTB imm8 al
19160// 	TESTB imm8 r8
19161// 	TESTB r8   r8
19162// 	TESTB imm8 m8
19163// 	TESTB r8   m8
19164func TESTB(ir, amr operand.Op) (*intrep.Instruction, error) {
19165	switch {
19166	case operand.IsIMM8(ir) && operand.IsAL(amr):
19167		return &intrep.Instruction{
19168			Opcode:   "TESTB",
19169			Operands: []operand.Op{ir, amr},
19170			Inputs:   []operand.Op{amr},
19171			Outputs:  []operand.Op{},
19172		}, nil
19173	case operand.IsIMM8(ir) && operand.IsR8(amr):
19174		return &intrep.Instruction{
19175			Opcode:   "TESTB",
19176			Operands: []operand.Op{ir, amr},
19177			Inputs:   []operand.Op{amr},
19178			Outputs:  []operand.Op{},
19179		}, nil
19180	case operand.IsR8(ir) && operand.IsR8(amr):
19181		return &intrep.Instruction{
19182			Opcode:   "TESTB",
19183			Operands: []operand.Op{ir, amr},
19184			Inputs:   []operand.Op{ir, amr},
19185			Outputs:  []operand.Op{},
19186		}, nil
19187	case operand.IsIMM8(ir) && operand.IsM8(amr):
19188		return &intrep.Instruction{
19189			Opcode:   "TESTB",
19190			Operands: []operand.Op{ir, amr},
19191			Inputs:   []operand.Op{amr},
19192			Outputs:  []operand.Op{},
19193		}, nil
19194	case operand.IsR8(ir) && operand.IsM8(amr):
19195		return &intrep.Instruction{
19196			Opcode:   "TESTB",
19197			Operands: []operand.Op{ir, amr},
19198			Inputs:   []operand.Op{ir, amr},
19199			Outputs:  []operand.Op{},
19200		}, nil
19201	}
19202	return nil, errors.New("TESTB: bad operands")
19203}
19204
19205// TESTL: Logical Compare.
19206//
19207// Forms:
19208//
19209// 	TESTL imm32 eax
19210// 	TESTL imm32 r32
19211// 	TESTL r32   r32
19212// 	TESTL imm32 m32
19213// 	TESTL r32   m32
19214func TESTL(ir, emr operand.Op) (*intrep.Instruction, error) {
19215	switch {
19216	case operand.IsIMM32(ir) && operand.IsEAX(emr):
19217		return &intrep.Instruction{
19218			Opcode:   "TESTL",
19219			Operands: []operand.Op{ir, emr},
19220			Inputs:   []operand.Op{emr},
19221			Outputs:  []operand.Op{},
19222		}, nil
19223	case operand.IsIMM32(ir) && operand.IsR32(emr):
19224		return &intrep.Instruction{
19225			Opcode:   "TESTL",
19226			Operands: []operand.Op{ir, emr},
19227			Inputs:   []operand.Op{emr},
19228			Outputs:  []operand.Op{},
19229		}, nil
19230	case operand.IsR32(ir) && operand.IsR32(emr):
19231		return &intrep.Instruction{
19232			Opcode:   "TESTL",
19233			Operands: []operand.Op{ir, emr},
19234			Inputs:   []operand.Op{ir, emr},
19235			Outputs:  []operand.Op{},
19236		}, nil
19237	case operand.IsIMM32(ir) && operand.IsM32(emr):
19238		return &intrep.Instruction{
19239			Opcode:   "TESTL",
19240			Operands: []operand.Op{ir, emr},
19241			Inputs:   []operand.Op{emr},
19242			Outputs:  []operand.Op{},
19243		}, nil
19244	case operand.IsR32(ir) && operand.IsM32(emr):
19245		return &intrep.Instruction{
19246			Opcode:   "TESTL",
19247			Operands: []operand.Op{ir, emr},
19248			Inputs:   []operand.Op{ir, emr},
19249			Outputs:  []operand.Op{},
19250		}, nil
19251	}
19252	return nil, errors.New("TESTL: bad operands")
19253}
19254
19255// TESTQ: Logical Compare.
19256//
19257// Forms:
19258//
19259// 	TESTQ imm32 rax
19260// 	TESTQ imm32 r64
19261// 	TESTQ r64   r64
19262// 	TESTQ imm32 m64
19263// 	TESTQ r64   m64
19264func TESTQ(ir, mr operand.Op) (*intrep.Instruction, error) {
19265	switch {
19266	case operand.IsIMM32(ir) && operand.IsRAX(mr):
19267		return &intrep.Instruction{
19268			Opcode:   "TESTQ",
19269			Operands: []operand.Op{ir, mr},
19270			Inputs:   []operand.Op{mr},
19271			Outputs:  []operand.Op{},
19272		}, nil
19273	case operand.IsIMM32(ir) && operand.IsR64(mr):
19274		return &intrep.Instruction{
19275			Opcode:   "TESTQ",
19276			Operands: []operand.Op{ir, mr},
19277			Inputs:   []operand.Op{mr},
19278			Outputs:  []operand.Op{},
19279		}, nil
19280	case operand.IsR64(ir) && operand.IsR64(mr):
19281		return &intrep.Instruction{
19282			Opcode:   "TESTQ",
19283			Operands: []operand.Op{ir, mr},
19284			Inputs:   []operand.Op{ir, mr},
19285			Outputs:  []operand.Op{},
19286		}, nil
19287	case operand.IsIMM32(ir) && operand.IsM64(mr):
19288		return &intrep.Instruction{
19289			Opcode:   "TESTQ",
19290			Operands: []operand.Op{ir, mr},
19291			Inputs:   []operand.Op{mr},
19292			Outputs:  []operand.Op{},
19293		}, nil
19294	case operand.IsR64(ir) && operand.IsM64(mr):
19295		return &intrep.Instruction{
19296			Opcode:   "TESTQ",
19297			Operands: []operand.Op{ir, mr},
19298			Inputs:   []operand.Op{ir, mr},
19299			Outputs:  []operand.Op{},
19300		}, nil
19301	}
19302	return nil, errors.New("TESTQ: bad operands")
19303}
19304
19305// TESTW: Logical Compare.
19306//
19307// Forms:
19308//
19309// 	TESTW imm16 ax
19310// 	TESTW imm16 r16
19311// 	TESTW r16   r16
19312// 	TESTW imm16 m16
19313// 	TESTW r16   m16
19314func TESTW(ir, amr operand.Op) (*intrep.Instruction, error) {
19315	switch {
19316	case operand.IsIMM16(ir) && operand.IsAX(amr):
19317		return &intrep.Instruction{
19318			Opcode:   "TESTW",
19319			Operands: []operand.Op{ir, amr},
19320			Inputs:   []operand.Op{amr},
19321			Outputs:  []operand.Op{},
19322		}, nil
19323	case operand.IsIMM16(ir) && operand.IsR16(amr):
19324		return &intrep.Instruction{
19325			Opcode:   "TESTW",
19326			Operands: []operand.Op{ir, amr},
19327			Inputs:   []operand.Op{amr},
19328			Outputs:  []operand.Op{},
19329		}, nil
19330	case operand.IsR16(ir) && operand.IsR16(amr):
19331		return &intrep.Instruction{
19332			Opcode:   "TESTW",
19333			Operands: []operand.Op{ir, amr},
19334			Inputs:   []operand.Op{ir, amr},
19335			Outputs:  []operand.Op{},
19336		}, nil
19337	case operand.IsIMM16(ir) && operand.IsM16(amr):
19338		return &intrep.Instruction{
19339			Opcode:   "TESTW",
19340			Operands: []operand.Op{ir, amr},
19341			Inputs:   []operand.Op{amr},
19342			Outputs:  []operand.Op{},
19343		}, nil
19344	case operand.IsR16(ir) && operand.IsM16(amr):
19345		return &intrep.Instruction{
19346			Opcode:   "TESTW",
19347			Operands: []operand.Op{ir, amr},
19348			Inputs:   []operand.Op{ir, amr},
19349			Outputs:  []operand.Op{},
19350		}, nil
19351	}
19352	return nil, errors.New("TESTW: bad operands")
19353}
19354
19355// TZCNTL: Count the Number of Trailing Zero Bits.
19356//
19357// Forms:
19358//
19359// 	TZCNTL r32 r32
19360// 	TZCNTL m32 r32
19361func TZCNTL(mr, r operand.Op) (*intrep.Instruction, error) {
19362	switch {
19363	case operand.IsR32(mr) && operand.IsR32(r):
19364		return &intrep.Instruction{
19365			Opcode:   "TZCNTL",
19366			Operands: []operand.Op{mr, r},
19367			Inputs:   []operand.Op{mr},
19368			Outputs:  []operand.Op{r},
19369			ISA:      []string{"BMI"},
19370		}, nil
19371	case operand.IsM32(mr) && operand.IsR32(r):
19372		return &intrep.Instruction{
19373			Opcode:   "TZCNTL",
19374			Operands: []operand.Op{mr, r},
19375			Inputs:   []operand.Op{mr},
19376			Outputs:  []operand.Op{r},
19377			ISA:      []string{"BMI"},
19378		}, nil
19379	}
19380	return nil, errors.New("TZCNTL: bad operands")
19381}
19382
19383// TZCNTQ: Count the Number of Trailing Zero Bits.
19384//
19385// Forms:
19386//
19387// 	TZCNTQ r64 r64
19388// 	TZCNTQ m64 r64
19389func TZCNTQ(mr, r operand.Op) (*intrep.Instruction, error) {
19390	switch {
19391	case operand.IsR64(mr) && operand.IsR64(r):
19392		return &intrep.Instruction{
19393			Opcode:   "TZCNTQ",
19394			Operands: []operand.Op{mr, r},
19395			Inputs:   []operand.Op{mr},
19396			Outputs:  []operand.Op{r},
19397			ISA:      []string{"BMI"},
19398		}, nil
19399	case operand.IsM64(mr) && operand.IsR64(r):
19400		return &intrep.Instruction{
19401			Opcode:   "TZCNTQ",
19402			Operands: []operand.Op{mr, r},
19403			Inputs:   []operand.Op{mr},
19404			Outputs:  []operand.Op{r},
19405			ISA:      []string{"BMI"},
19406		}, nil
19407	}
19408	return nil, errors.New("TZCNTQ: bad operands")
19409}
19410
19411// TZCNTW: Count the Number of Trailing Zero Bits.
19412//
19413// Forms:
19414//
19415// 	TZCNTW r16 r16
19416// 	TZCNTW m16 r16
19417func TZCNTW(mr, r operand.Op) (*intrep.Instruction, error) {
19418	switch {
19419	case operand.IsR16(mr) && operand.IsR16(r):
19420		return &intrep.Instruction{
19421			Opcode:   "TZCNTW",
19422			Operands: []operand.Op{mr, r},
19423			Inputs:   []operand.Op{mr},
19424			Outputs:  []operand.Op{r},
19425			ISA:      []string{"BMI"},
19426		}, nil
19427	case operand.IsM16(mr) && operand.IsR16(r):
19428		return &intrep.Instruction{
19429			Opcode:   "TZCNTW",
19430			Operands: []operand.Op{mr, r},
19431			Inputs:   []operand.Op{mr},
19432			Outputs:  []operand.Op{r},
19433			ISA:      []string{"BMI"},
19434		}, nil
19435	}
19436	return nil, errors.New("TZCNTW: bad operands")
19437}
19438
19439// UCOMISD: Unordered Compare Scalar Double-Precision Floating-Point Values and Set EFLAGS.
19440//
19441// Forms:
19442//
19443// 	UCOMISD xmm xmm
19444// 	UCOMISD m64 xmm
19445func UCOMISD(mx, x operand.Op) (*intrep.Instruction, error) {
19446	switch {
19447	case operand.IsXMM(mx) && operand.IsXMM(x):
19448		return &intrep.Instruction{
19449			Opcode:   "UCOMISD",
19450			Operands: []operand.Op{mx, x},
19451			Inputs:   []operand.Op{mx, x},
19452			Outputs:  []operand.Op{},
19453			ISA:      []string{"SSE2"},
19454		}, nil
19455	case operand.IsM64(mx) && operand.IsXMM(x):
19456		return &intrep.Instruction{
19457			Opcode:   "UCOMISD",
19458			Operands: []operand.Op{mx, x},
19459			Inputs:   []operand.Op{mx, x},
19460			Outputs:  []operand.Op{},
19461			ISA:      []string{"SSE2"},
19462		}, nil
19463	}
19464	return nil, errors.New("UCOMISD: bad operands")
19465}
19466
19467// UCOMISS: Unordered Compare Scalar Single-Precision Floating-Point Values and Set EFLAGS.
19468//
19469// Forms:
19470//
19471// 	UCOMISS xmm xmm
19472// 	UCOMISS m32 xmm
19473func UCOMISS(mx, x operand.Op) (*intrep.Instruction, error) {
19474	switch {
19475	case operand.IsXMM(mx) && operand.IsXMM(x):
19476		return &intrep.Instruction{
19477			Opcode:   "UCOMISS",
19478			Operands: []operand.Op{mx, x},
19479			Inputs:   []operand.Op{mx, x},
19480			Outputs:  []operand.Op{},
19481			ISA:      []string{"SSE"},
19482		}, nil
19483	case operand.IsM32(mx) && operand.IsXMM(x):
19484		return &intrep.Instruction{
19485			Opcode:   "UCOMISS",
19486			Operands: []operand.Op{mx, x},
19487			Inputs:   []operand.Op{mx, x},
19488			Outputs:  []operand.Op{},
19489			ISA:      []string{"SSE"},
19490		}, nil
19491	}
19492	return nil, errors.New("UCOMISS: bad operands")
19493}
19494
19495// UD2: Undefined Instruction.
19496//
19497// Forms:
19498//
19499// 	UD2
19500func UD2() (*intrep.Instruction, error) {
19501	return &intrep.Instruction{
19502		Opcode:   "UD2",
19503		Operands: nil,
19504		Inputs:   []operand.Op{},
19505		Outputs:  []operand.Op{},
19506	}, nil
19507}
19508
19509// UNPCKHPD: Unpack and Interleave High Packed Double-Precision Floating-Point Values.
19510//
19511// Forms:
19512//
19513// 	UNPCKHPD xmm  xmm
19514// 	UNPCKHPD m128 xmm
19515func UNPCKHPD(mx, x operand.Op) (*intrep.Instruction, error) {
19516	switch {
19517	case operand.IsXMM(mx) && operand.IsXMM(x):
19518		return &intrep.Instruction{
19519			Opcode:   "UNPCKHPD",
19520			Operands: []operand.Op{mx, x},
19521			Inputs:   []operand.Op{mx, x},
19522			Outputs:  []operand.Op{x},
19523			ISA:      []string{"SSE2"},
19524		}, nil
19525	case operand.IsM128(mx) && operand.IsXMM(x):
19526		return &intrep.Instruction{
19527			Opcode:   "UNPCKHPD",
19528			Operands: []operand.Op{mx, x},
19529			Inputs:   []operand.Op{mx, x},
19530			Outputs:  []operand.Op{x},
19531			ISA:      []string{"SSE2"},
19532		}, nil
19533	}
19534	return nil, errors.New("UNPCKHPD: bad operands")
19535}
19536
19537// UNPCKHPS: Unpack and Interleave High Packed Single-Precision Floating-Point Values.
19538//
19539// Forms:
19540//
19541// 	UNPCKHPS xmm  xmm
19542// 	UNPCKHPS m128 xmm
19543func UNPCKHPS(mx, x operand.Op) (*intrep.Instruction, error) {
19544	switch {
19545	case operand.IsXMM(mx) && operand.IsXMM(x):
19546		return &intrep.Instruction{
19547			Opcode:   "UNPCKHPS",
19548			Operands: []operand.Op{mx, x},
19549			Inputs:   []operand.Op{mx, x},
19550			Outputs:  []operand.Op{x},
19551			ISA:      []string{"SSE"},
19552		}, nil
19553	case operand.IsM128(mx) && operand.IsXMM(x):
19554		return &intrep.Instruction{
19555			Opcode:   "UNPCKHPS",
19556			Operands: []operand.Op{mx, x},
19557			Inputs:   []operand.Op{mx, x},
19558			Outputs:  []operand.Op{x},
19559			ISA:      []string{"SSE"},
19560		}, nil
19561	}
19562	return nil, errors.New("UNPCKHPS: bad operands")
19563}
19564
19565// UNPCKLPD: Unpack and Interleave Low Packed Double-Precision Floating-Point Values.
19566//
19567// Forms:
19568//
19569// 	UNPCKLPD xmm  xmm
19570// 	UNPCKLPD m128 xmm
19571func UNPCKLPD(mx, x operand.Op) (*intrep.Instruction, error) {
19572	switch {
19573	case operand.IsXMM(mx) && operand.IsXMM(x):
19574		return &intrep.Instruction{
19575			Opcode:   "UNPCKLPD",
19576			Operands: []operand.Op{mx, x},
19577			Inputs:   []operand.Op{mx, x},
19578			Outputs:  []operand.Op{x},
19579			ISA:      []string{"SSE2"},
19580		}, nil
19581	case operand.IsM128(mx) && operand.IsXMM(x):
19582		return &intrep.Instruction{
19583			Opcode:   "UNPCKLPD",
19584			Operands: []operand.Op{mx, x},
19585			Inputs:   []operand.Op{mx, x},
19586			Outputs:  []operand.Op{x},
19587			ISA:      []string{"SSE2"},
19588		}, nil
19589	}
19590	return nil, errors.New("UNPCKLPD: bad operands")
19591}
19592
19593// UNPCKLPS: Unpack and Interleave Low Packed Single-Precision Floating-Point Values.
19594//
19595// Forms:
19596//
19597// 	UNPCKLPS xmm  xmm
19598// 	UNPCKLPS m128 xmm
19599func UNPCKLPS(mx, x operand.Op) (*intrep.Instruction, error) {
19600	switch {
19601	case operand.IsXMM(mx) && operand.IsXMM(x):
19602		return &intrep.Instruction{
19603			Opcode:   "UNPCKLPS",
19604			Operands: []operand.Op{mx, x},
19605			Inputs:   []operand.Op{mx, x},
19606			Outputs:  []operand.Op{x},
19607			ISA:      []string{"SSE"},
19608		}, nil
19609	case operand.IsM128(mx) && operand.IsXMM(x):
19610		return &intrep.Instruction{
19611			Opcode:   "UNPCKLPS",
19612			Operands: []operand.Op{mx, x},
19613			Inputs:   []operand.Op{mx, x},
19614			Outputs:  []operand.Op{x},
19615			ISA:      []string{"SSE"},
19616		}, nil
19617	}
19618	return nil, errors.New("UNPCKLPS: bad operands")
19619}
19620
19621// VADDPD: Add Packed Double-Precision Floating-Point Values.
19622//
19623// Forms:
19624//
19625// 	VADDPD xmm  xmm xmm
19626// 	VADDPD m128 xmm xmm
19627// 	VADDPD ymm  ymm ymm
19628// 	VADDPD m256 ymm ymm
19629func VADDPD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
19630	switch {
19631	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
19632		return &intrep.Instruction{
19633			Opcode:   "VADDPD",
19634			Operands: []operand.Op{mxy, xy, xy1},
19635			Inputs:   []operand.Op{mxy, xy},
19636			Outputs:  []operand.Op{xy1},
19637			ISA:      []string{"AVX"},
19638		}, nil
19639	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
19640		return &intrep.Instruction{
19641			Opcode:   "VADDPD",
19642			Operands: []operand.Op{mxy, xy, xy1},
19643			Inputs:   []operand.Op{mxy, xy},
19644			Outputs:  []operand.Op{xy1},
19645			ISA:      []string{"AVX"},
19646		}, nil
19647	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
19648		return &intrep.Instruction{
19649			Opcode:   "VADDPD",
19650			Operands: []operand.Op{mxy, xy, xy1},
19651			Inputs:   []operand.Op{mxy, xy},
19652			Outputs:  []operand.Op{xy1},
19653			ISA:      []string{"AVX"},
19654		}, nil
19655	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
19656		return &intrep.Instruction{
19657			Opcode:   "VADDPD",
19658			Operands: []operand.Op{mxy, xy, xy1},
19659			Inputs:   []operand.Op{mxy, xy},
19660			Outputs:  []operand.Op{xy1},
19661			ISA:      []string{"AVX"},
19662		}, nil
19663	}
19664	return nil, errors.New("VADDPD: bad operands")
19665}
19666
19667// VADDPS: Add Packed Single-Precision Floating-Point Values.
19668//
19669// Forms:
19670//
19671// 	VADDPS xmm  xmm xmm
19672// 	VADDPS m128 xmm xmm
19673// 	VADDPS ymm  ymm ymm
19674// 	VADDPS m256 ymm ymm
19675func VADDPS(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
19676	switch {
19677	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
19678		return &intrep.Instruction{
19679			Opcode:   "VADDPS",
19680			Operands: []operand.Op{mxy, xy, xy1},
19681			Inputs:   []operand.Op{mxy, xy},
19682			Outputs:  []operand.Op{xy1},
19683			ISA:      []string{"AVX"},
19684		}, nil
19685	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
19686		return &intrep.Instruction{
19687			Opcode:   "VADDPS",
19688			Operands: []operand.Op{mxy, xy, xy1},
19689			Inputs:   []operand.Op{mxy, xy},
19690			Outputs:  []operand.Op{xy1},
19691			ISA:      []string{"AVX"},
19692		}, nil
19693	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
19694		return &intrep.Instruction{
19695			Opcode:   "VADDPS",
19696			Operands: []operand.Op{mxy, xy, xy1},
19697			Inputs:   []operand.Op{mxy, xy},
19698			Outputs:  []operand.Op{xy1},
19699			ISA:      []string{"AVX"},
19700		}, nil
19701	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
19702		return &intrep.Instruction{
19703			Opcode:   "VADDPS",
19704			Operands: []operand.Op{mxy, xy, xy1},
19705			Inputs:   []operand.Op{mxy, xy},
19706			Outputs:  []operand.Op{xy1},
19707			ISA:      []string{"AVX"},
19708		}, nil
19709	}
19710	return nil, errors.New("VADDPS: bad operands")
19711}
19712
19713// VADDSD: Add Scalar Double-Precision Floating-Point Values.
19714//
19715// Forms:
19716//
19717// 	VADDSD xmm xmm xmm
19718// 	VADDSD m64 xmm xmm
19719func VADDSD(mx, x, x1 operand.Op) (*intrep.Instruction, error) {
19720	switch {
19721	case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
19722		return &intrep.Instruction{
19723			Opcode:   "VADDSD",
19724			Operands: []operand.Op{mx, x, x1},
19725			Inputs:   []operand.Op{mx, x},
19726			Outputs:  []operand.Op{x1},
19727			ISA:      []string{"AVX"},
19728		}, nil
19729	case operand.IsM64(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
19730		return &intrep.Instruction{
19731			Opcode:   "VADDSD",
19732			Operands: []operand.Op{mx, x, x1},
19733			Inputs:   []operand.Op{mx, x},
19734			Outputs:  []operand.Op{x1},
19735			ISA:      []string{"AVX"},
19736		}, nil
19737	}
19738	return nil, errors.New("VADDSD: bad operands")
19739}
19740
19741// VADDSS: Add Scalar Single-Precision Floating-Point Values.
19742//
19743// Forms:
19744//
19745// 	VADDSS xmm xmm xmm
19746// 	VADDSS m32 xmm xmm
19747func VADDSS(mx, x, x1 operand.Op) (*intrep.Instruction, error) {
19748	switch {
19749	case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
19750		return &intrep.Instruction{
19751			Opcode:   "VADDSS",
19752			Operands: []operand.Op{mx, x, x1},
19753			Inputs:   []operand.Op{mx, x},
19754			Outputs:  []operand.Op{x1},
19755			ISA:      []string{"AVX"},
19756		}, nil
19757	case operand.IsM32(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
19758		return &intrep.Instruction{
19759			Opcode:   "VADDSS",
19760			Operands: []operand.Op{mx, x, x1},
19761			Inputs:   []operand.Op{mx, x},
19762			Outputs:  []operand.Op{x1},
19763			ISA:      []string{"AVX"},
19764		}, nil
19765	}
19766	return nil, errors.New("VADDSS: bad operands")
19767}
19768
19769// VADDSUBPD: Packed Double-FP Add/Subtract.
19770//
19771// Forms:
19772//
19773// 	VADDSUBPD xmm  xmm xmm
19774// 	VADDSUBPD m128 xmm xmm
19775// 	VADDSUBPD ymm  ymm ymm
19776// 	VADDSUBPD m256 ymm ymm
19777func VADDSUBPD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
19778	switch {
19779	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
19780		return &intrep.Instruction{
19781			Opcode:   "VADDSUBPD",
19782			Operands: []operand.Op{mxy, xy, xy1},
19783			Inputs:   []operand.Op{mxy, xy},
19784			Outputs:  []operand.Op{xy1},
19785			ISA:      []string{"AVX"},
19786		}, nil
19787	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
19788		return &intrep.Instruction{
19789			Opcode:   "VADDSUBPD",
19790			Operands: []operand.Op{mxy, xy, xy1},
19791			Inputs:   []operand.Op{mxy, xy},
19792			Outputs:  []operand.Op{xy1},
19793			ISA:      []string{"AVX"},
19794		}, nil
19795	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
19796		return &intrep.Instruction{
19797			Opcode:   "VADDSUBPD",
19798			Operands: []operand.Op{mxy, xy, xy1},
19799			Inputs:   []operand.Op{mxy, xy},
19800			Outputs:  []operand.Op{xy1},
19801			ISA:      []string{"AVX"},
19802		}, nil
19803	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
19804		return &intrep.Instruction{
19805			Opcode:   "VADDSUBPD",
19806			Operands: []operand.Op{mxy, xy, xy1},
19807			Inputs:   []operand.Op{mxy, xy},
19808			Outputs:  []operand.Op{xy1},
19809			ISA:      []string{"AVX"},
19810		}, nil
19811	}
19812	return nil, errors.New("VADDSUBPD: bad operands")
19813}
19814
19815// VADDSUBPS: Packed Single-FP Add/Subtract.
19816//
19817// Forms:
19818//
19819// 	VADDSUBPS xmm  xmm xmm
19820// 	VADDSUBPS m128 xmm xmm
19821// 	VADDSUBPS ymm  ymm ymm
19822// 	VADDSUBPS m256 ymm ymm
19823func VADDSUBPS(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
19824	switch {
19825	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
19826		return &intrep.Instruction{
19827			Opcode:   "VADDSUBPS",
19828			Operands: []operand.Op{mxy, xy, xy1},
19829			Inputs:   []operand.Op{mxy, xy},
19830			Outputs:  []operand.Op{xy1},
19831			ISA:      []string{"AVX"},
19832		}, nil
19833	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
19834		return &intrep.Instruction{
19835			Opcode:   "VADDSUBPS",
19836			Operands: []operand.Op{mxy, xy, xy1},
19837			Inputs:   []operand.Op{mxy, xy},
19838			Outputs:  []operand.Op{xy1},
19839			ISA:      []string{"AVX"},
19840		}, nil
19841	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
19842		return &intrep.Instruction{
19843			Opcode:   "VADDSUBPS",
19844			Operands: []operand.Op{mxy, xy, xy1},
19845			Inputs:   []operand.Op{mxy, xy},
19846			Outputs:  []operand.Op{xy1},
19847			ISA:      []string{"AVX"},
19848		}, nil
19849	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
19850		return &intrep.Instruction{
19851			Opcode:   "VADDSUBPS",
19852			Operands: []operand.Op{mxy, xy, xy1},
19853			Inputs:   []operand.Op{mxy, xy},
19854			Outputs:  []operand.Op{xy1},
19855			ISA:      []string{"AVX"},
19856		}, nil
19857	}
19858	return nil, errors.New("VADDSUBPS: bad operands")
19859}
19860
19861// VAESDEC: Perform One Round of an AES Decryption Flow.
19862//
19863// Forms:
19864//
19865// 	VAESDEC xmm  xmm xmm
19866// 	VAESDEC m128 xmm xmm
19867func VAESDEC(mx, x, x1 operand.Op) (*intrep.Instruction, error) {
19868	switch {
19869	case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
19870		return &intrep.Instruction{
19871			Opcode:   "VAESDEC",
19872			Operands: []operand.Op{mx, x, x1},
19873			Inputs:   []operand.Op{mx, x},
19874			Outputs:  []operand.Op{x1},
19875			ISA:      []string{"AVX", "AES"},
19876		}, nil
19877	case operand.IsM128(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
19878		return &intrep.Instruction{
19879			Opcode:   "VAESDEC",
19880			Operands: []operand.Op{mx, x, x1},
19881			Inputs:   []operand.Op{mx, x},
19882			Outputs:  []operand.Op{x1},
19883			ISA:      []string{"AVX", "AES"},
19884		}, nil
19885	}
19886	return nil, errors.New("VAESDEC: bad operands")
19887}
19888
19889// VAESDECLAST: Perform Last Round of an AES Decryption Flow.
19890//
19891// Forms:
19892//
19893// 	VAESDECLAST xmm  xmm xmm
19894// 	VAESDECLAST m128 xmm xmm
19895func VAESDECLAST(mx, x, x1 operand.Op) (*intrep.Instruction, error) {
19896	switch {
19897	case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
19898		return &intrep.Instruction{
19899			Opcode:   "VAESDECLAST",
19900			Operands: []operand.Op{mx, x, x1},
19901			Inputs:   []operand.Op{mx, x},
19902			Outputs:  []operand.Op{x1},
19903			ISA:      []string{"AVX", "AES"},
19904		}, nil
19905	case operand.IsM128(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
19906		return &intrep.Instruction{
19907			Opcode:   "VAESDECLAST",
19908			Operands: []operand.Op{mx, x, x1},
19909			Inputs:   []operand.Op{mx, x},
19910			Outputs:  []operand.Op{x1},
19911			ISA:      []string{"AVX", "AES"},
19912		}, nil
19913	}
19914	return nil, errors.New("VAESDECLAST: bad operands")
19915}
19916
19917// VAESENC: Perform One Round of an AES Encryption Flow.
19918//
19919// Forms:
19920//
19921// 	VAESENC xmm  xmm xmm
19922// 	VAESENC m128 xmm xmm
19923func VAESENC(mx, x, x1 operand.Op) (*intrep.Instruction, error) {
19924	switch {
19925	case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
19926		return &intrep.Instruction{
19927			Opcode:   "VAESENC",
19928			Operands: []operand.Op{mx, x, x1},
19929			Inputs:   []operand.Op{mx, x},
19930			Outputs:  []operand.Op{x1},
19931			ISA:      []string{"AVX", "AES"},
19932		}, nil
19933	case operand.IsM128(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
19934		return &intrep.Instruction{
19935			Opcode:   "VAESENC",
19936			Operands: []operand.Op{mx, x, x1},
19937			Inputs:   []operand.Op{mx, x},
19938			Outputs:  []operand.Op{x1},
19939			ISA:      []string{"AVX", "AES"},
19940		}, nil
19941	}
19942	return nil, errors.New("VAESENC: bad operands")
19943}
19944
19945// VAESENCLAST: Perform Last Round of an AES Encryption Flow.
19946//
19947// Forms:
19948//
19949// 	VAESENCLAST xmm  xmm xmm
19950// 	VAESENCLAST m128 xmm xmm
19951func VAESENCLAST(mx, x, x1 operand.Op) (*intrep.Instruction, error) {
19952	switch {
19953	case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
19954		return &intrep.Instruction{
19955			Opcode:   "VAESENCLAST",
19956			Operands: []operand.Op{mx, x, x1},
19957			Inputs:   []operand.Op{mx, x},
19958			Outputs:  []operand.Op{x1},
19959			ISA:      []string{"AVX", "AES"},
19960		}, nil
19961	case operand.IsM128(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
19962		return &intrep.Instruction{
19963			Opcode:   "VAESENCLAST",
19964			Operands: []operand.Op{mx, x, x1},
19965			Inputs:   []operand.Op{mx, x},
19966			Outputs:  []operand.Op{x1},
19967			ISA:      []string{"AVX", "AES"},
19968		}, nil
19969	}
19970	return nil, errors.New("VAESENCLAST: bad operands")
19971}
19972
19973// VAESIMC: Perform the AES InvMixColumn Transformation.
19974//
19975// Forms:
19976//
19977// 	VAESIMC xmm  xmm
19978// 	VAESIMC m128 xmm
19979func VAESIMC(mx, x operand.Op) (*intrep.Instruction, error) {
19980	switch {
19981	case operand.IsXMM(mx) && operand.IsXMM(x):
19982		return &intrep.Instruction{
19983			Opcode:   "VAESIMC",
19984			Operands: []operand.Op{mx, x},
19985			Inputs:   []operand.Op{mx},
19986			Outputs:  []operand.Op{x},
19987			ISA:      []string{"AVX", "AES"},
19988		}, nil
19989	case operand.IsM128(mx) && operand.IsXMM(x):
19990		return &intrep.Instruction{
19991			Opcode:   "VAESIMC",
19992			Operands: []operand.Op{mx, x},
19993			Inputs:   []operand.Op{mx},
19994			Outputs:  []operand.Op{x},
19995			ISA:      []string{"AVX", "AES"},
19996		}, nil
19997	}
19998	return nil, errors.New("VAESIMC: bad operands")
19999}
20000
20001// VAESKEYGENASSIST: AES Round Key Generation Assist.
20002//
20003// Forms:
20004//
20005// 	VAESKEYGENASSIST imm8 xmm  xmm
20006// 	VAESKEYGENASSIST imm8 m128 xmm
20007func VAESKEYGENASSIST(i, mx, x operand.Op) (*intrep.Instruction, error) {
20008	switch {
20009	case operand.IsIMM8(i) && operand.IsXMM(mx) && operand.IsXMM(x):
20010		return &intrep.Instruction{
20011			Opcode:   "VAESKEYGENASSIST",
20012			Operands: []operand.Op{i, mx, x},
20013			Inputs:   []operand.Op{mx},
20014			Outputs:  []operand.Op{x},
20015			ISA:      []string{"AVX", "AES"},
20016		}, nil
20017	case operand.IsIMM8(i) && operand.IsM128(mx) && operand.IsXMM(x):
20018		return &intrep.Instruction{
20019			Opcode:   "VAESKEYGENASSIST",
20020			Operands: []operand.Op{i, mx, x},
20021			Inputs:   []operand.Op{mx},
20022			Outputs:  []operand.Op{x},
20023			ISA:      []string{"AVX", "AES"},
20024		}, nil
20025	}
20026	return nil, errors.New("VAESKEYGENASSIST: bad operands")
20027}
20028
20029// VANDNPD: Bitwise Logical AND NOT of Packed Double-Precision Floating-Point Values.
20030//
20031// Forms:
20032//
20033// 	VANDNPD xmm  xmm xmm
20034// 	VANDNPD m128 xmm xmm
20035// 	VANDNPD ymm  ymm ymm
20036// 	VANDNPD m256 ymm ymm
20037func VANDNPD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
20038	switch {
20039	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
20040		return &intrep.Instruction{
20041			Opcode:           "VANDNPD",
20042			Operands:         []operand.Op{mxy, xy, xy1},
20043			Inputs:           []operand.Op{mxy, xy},
20044			Outputs:          []operand.Op{xy1},
20045			ISA:              []string{"AVX"},
20046			CancellingInputs: true,
20047		}, nil
20048	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
20049		return &intrep.Instruction{
20050			Opcode:   "VANDNPD",
20051			Operands: []operand.Op{mxy, xy, xy1},
20052			Inputs:   []operand.Op{mxy, xy},
20053			Outputs:  []operand.Op{xy1},
20054			ISA:      []string{"AVX"},
20055		}, nil
20056	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
20057		return &intrep.Instruction{
20058			Opcode:           "VANDNPD",
20059			Operands:         []operand.Op{mxy, xy, xy1},
20060			Inputs:           []operand.Op{mxy, xy},
20061			Outputs:          []operand.Op{xy1},
20062			ISA:              []string{"AVX"},
20063			CancellingInputs: true,
20064		}, nil
20065	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
20066		return &intrep.Instruction{
20067			Opcode:   "VANDNPD",
20068			Operands: []operand.Op{mxy, xy, xy1},
20069			Inputs:   []operand.Op{mxy, xy},
20070			Outputs:  []operand.Op{xy1},
20071			ISA:      []string{"AVX"},
20072		}, nil
20073	}
20074	return nil, errors.New("VANDNPD: bad operands")
20075}
20076
20077// VANDNPS: Bitwise Logical AND NOT of Packed Single-Precision Floating-Point Values.
20078//
20079// Forms:
20080//
20081// 	VANDNPS xmm  xmm xmm
20082// 	VANDNPS m128 xmm xmm
20083// 	VANDNPS ymm  ymm ymm
20084// 	VANDNPS m256 ymm ymm
20085func VANDNPS(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
20086	switch {
20087	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
20088		return &intrep.Instruction{
20089			Opcode:           "VANDNPS",
20090			Operands:         []operand.Op{mxy, xy, xy1},
20091			Inputs:           []operand.Op{mxy, xy},
20092			Outputs:          []operand.Op{xy1},
20093			ISA:              []string{"AVX"},
20094			CancellingInputs: true,
20095		}, nil
20096	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
20097		return &intrep.Instruction{
20098			Opcode:   "VANDNPS",
20099			Operands: []operand.Op{mxy, xy, xy1},
20100			Inputs:   []operand.Op{mxy, xy},
20101			Outputs:  []operand.Op{xy1},
20102			ISA:      []string{"AVX"},
20103		}, nil
20104	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
20105		return &intrep.Instruction{
20106			Opcode:           "VANDNPS",
20107			Operands:         []operand.Op{mxy, xy, xy1},
20108			Inputs:           []operand.Op{mxy, xy},
20109			Outputs:          []operand.Op{xy1},
20110			ISA:              []string{"AVX"},
20111			CancellingInputs: true,
20112		}, nil
20113	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
20114		return &intrep.Instruction{
20115			Opcode:   "VANDNPS",
20116			Operands: []operand.Op{mxy, xy, xy1},
20117			Inputs:   []operand.Op{mxy, xy},
20118			Outputs:  []operand.Op{xy1},
20119			ISA:      []string{"AVX"},
20120		}, nil
20121	}
20122	return nil, errors.New("VANDNPS: bad operands")
20123}
20124
20125// VANDPD: Bitwise Logical AND of Packed Double-Precision Floating-Point Values.
20126//
20127// Forms:
20128//
20129// 	VANDPD xmm  xmm xmm
20130// 	VANDPD m128 xmm xmm
20131// 	VANDPD ymm  ymm ymm
20132// 	VANDPD m256 ymm ymm
20133func VANDPD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
20134	switch {
20135	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
20136		return &intrep.Instruction{
20137			Opcode:   "VANDPD",
20138			Operands: []operand.Op{mxy, xy, xy1},
20139			Inputs:   []operand.Op{mxy, xy},
20140			Outputs:  []operand.Op{xy1},
20141			ISA:      []string{"AVX"},
20142		}, nil
20143	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
20144		return &intrep.Instruction{
20145			Opcode:   "VANDPD",
20146			Operands: []operand.Op{mxy, xy, xy1},
20147			Inputs:   []operand.Op{mxy, xy},
20148			Outputs:  []operand.Op{xy1},
20149			ISA:      []string{"AVX"},
20150		}, nil
20151	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
20152		return &intrep.Instruction{
20153			Opcode:   "VANDPD",
20154			Operands: []operand.Op{mxy, xy, xy1},
20155			Inputs:   []operand.Op{mxy, xy},
20156			Outputs:  []operand.Op{xy1},
20157			ISA:      []string{"AVX"},
20158		}, nil
20159	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
20160		return &intrep.Instruction{
20161			Opcode:   "VANDPD",
20162			Operands: []operand.Op{mxy, xy, xy1},
20163			Inputs:   []operand.Op{mxy, xy},
20164			Outputs:  []operand.Op{xy1},
20165			ISA:      []string{"AVX"},
20166		}, nil
20167	}
20168	return nil, errors.New("VANDPD: bad operands")
20169}
20170
20171// VANDPS: Bitwise Logical AND of Packed Single-Precision Floating-Point Values.
20172//
20173// Forms:
20174//
20175// 	VANDPS xmm  xmm xmm
20176// 	VANDPS m128 xmm xmm
20177// 	VANDPS ymm  ymm ymm
20178// 	VANDPS m256 ymm ymm
20179func VANDPS(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
20180	switch {
20181	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
20182		return &intrep.Instruction{
20183			Opcode:   "VANDPS",
20184			Operands: []operand.Op{mxy, xy, xy1},
20185			Inputs:   []operand.Op{mxy, xy},
20186			Outputs:  []operand.Op{xy1},
20187			ISA:      []string{"AVX"},
20188		}, nil
20189	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
20190		return &intrep.Instruction{
20191			Opcode:   "VANDPS",
20192			Operands: []operand.Op{mxy, xy, xy1},
20193			Inputs:   []operand.Op{mxy, xy},
20194			Outputs:  []operand.Op{xy1},
20195			ISA:      []string{"AVX"},
20196		}, nil
20197	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
20198		return &intrep.Instruction{
20199			Opcode:   "VANDPS",
20200			Operands: []operand.Op{mxy, xy, xy1},
20201			Inputs:   []operand.Op{mxy, xy},
20202			Outputs:  []operand.Op{xy1},
20203			ISA:      []string{"AVX"},
20204		}, nil
20205	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
20206		return &intrep.Instruction{
20207			Opcode:   "VANDPS",
20208			Operands: []operand.Op{mxy, xy, xy1},
20209			Inputs:   []operand.Op{mxy, xy},
20210			Outputs:  []operand.Op{xy1},
20211			ISA:      []string{"AVX"},
20212		}, nil
20213	}
20214	return nil, errors.New("VANDPS: bad operands")
20215}
20216
20217// VBLENDPD: Blend Packed Double Precision Floating-Point Values.
20218//
20219// Forms:
20220//
20221// 	VBLENDPD imm8 xmm  xmm xmm
20222// 	VBLENDPD imm8 m128 xmm xmm
20223// 	VBLENDPD imm8 ymm  ymm ymm
20224// 	VBLENDPD imm8 m256 ymm ymm
20225func VBLENDPD(i, mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
20226	switch {
20227	case operand.IsIMM8(i) && operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
20228		return &intrep.Instruction{
20229			Opcode:   "VBLENDPD",
20230			Operands: []operand.Op{i, mxy, xy, xy1},
20231			Inputs:   []operand.Op{mxy, xy},
20232			Outputs:  []operand.Op{xy1},
20233			ISA:      []string{"AVX"},
20234		}, nil
20235	case operand.IsIMM8(i) && operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
20236		return &intrep.Instruction{
20237			Opcode:   "VBLENDPD",
20238			Operands: []operand.Op{i, mxy, xy, xy1},
20239			Inputs:   []operand.Op{mxy, xy},
20240			Outputs:  []operand.Op{xy1},
20241			ISA:      []string{"AVX"},
20242		}, nil
20243	case operand.IsIMM8(i) && operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
20244		return &intrep.Instruction{
20245			Opcode:   "VBLENDPD",
20246			Operands: []operand.Op{i, mxy, xy, xy1},
20247			Inputs:   []operand.Op{mxy, xy},
20248			Outputs:  []operand.Op{xy1},
20249			ISA:      []string{"AVX"},
20250		}, nil
20251	case operand.IsIMM8(i) && operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
20252		return &intrep.Instruction{
20253			Opcode:   "VBLENDPD",
20254			Operands: []operand.Op{i, mxy, xy, xy1},
20255			Inputs:   []operand.Op{mxy, xy},
20256			Outputs:  []operand.Op{xy1},
20257			ISA:      []string{"AVX"},
20258		}, nil
20259	}
20260	return nil, errors.New("VBLENDPD: bad operands")
20261}
20262
20263// VBLENDPS:  Blend Packed Single Precision Floating-Point Values.
20264//
20265// Forms:
20266//
20267// 	VBLENDPS imm8 xmm  xmm xmm
20268// 	VBLENDPS imm8 m128 xmm xmm
20269// 	VBLENDPS imm8 ymm  ymm ymm
20270// 	VBLENDPS imm8 m256 ymm ymm
20271func VBLENDPS(i, mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
20272	switch {
20273	case operand.IsIMM8(i) && operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
20274		return &intrep.Instruction{
20275			Opcode:   "VBLENDPS",
20276			Operands: []operand.Op{i, mxy, xy, xy1},
20277			Inputs:   []operand.Op{mxy, xy},
20278			Outputs:  []operand.Op{xy1},
20279			ISA:      []string{"AVX"},
20280		}, nil
20281	case operand.IsIMM8(i) && operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
20282		return &intrep.Instruction{
20283			Opcode:   "VBLENDPS",
20284			Operands: []operand.Op{i, mxy, xy, xy1},
20285			Inputs:   []operand.Op{mxy, xy},
20286			Outputs:  []operand.Op{xy1},
20287			ISA:      []string{"AVX"},
20288		}, nil
20289	case operand.IsIMM8(i) && operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
20290		return &intrep.Instruction{
20291			Opcode:   "VBLENDPS",
20292			Operands: []operand.Op{i, mxy, xy, xy1},
20293			Inputs:   []operand.Op{mxy, xy},
20294			Outputs:  []operand.Op{xy1},
20295			ISA:      []string{"AVX"},
20296		}, nil
20297	case operand.IsIMM8(i) && operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
20298		return &intrep.Instruction{
20299			Opcode:   "VBLENDPS",
20300			Operands: []operand.Op{i, mxy, xy, xy1},
20301			Inputs:   []operand.Op{mxy, xy},
20302			Outputs:  []operand.Op{xy1},
20303			ISA:      []string{"AVX"},
20304		}, nil
20305	}
20306	return nil, errors.New("VBLENDPS: bad operands")
20307}
20308
20309// VBLENDVPD:  Variable Blend Packed Double Precision Floating-Point Values.
20310//
20311// Forms:
20312//
20313// 	VBLENDVPD xmm xmm  xmm xmm
20314// 	VBLENDVPD xmm m128 xmm xmm
20315// 	VBLENDVPD ymm ymm  ymm ymm
20316// 	VBLENDVPD ymm m256 ymm ymm
20317func VBLENDVPD(xy, mxy, xy1, xy2 operand.Op) (*intrep.Instruction, error) {
20318	switch {
20319	case operand.IsXMM(xy) && operand.IsXMM(mxy) && operand.IsXMM(xy1) && operand.IsXMM(xy2):
20320		return &intrep.Instruction{
20321			Opcode:   "VBLENDVPD",
20322			Operands: []operand.Op{xy, mxy, xy1, xy2},
20323			Inputs:   []operand.Op{xy, mxy, xy1},
20324			Outputs:  []operand.Op{xy2},
20325			ISA:      []string{"AVX"},
20326		}, nil
20327	case operand.IsXMM(xy) && operand.IsM128(mxy) && operand.IsXMM(xy1) && operand.IsXMM(xy2):
20328		return &intrep.Instruction{
20329			Opcode:   "VBLENDVPD",
20330			Operands: []operand.Op{xy, mxy, xy1, xy2},
20331			Inputs:   []operand.Op{xy, mxy, xy1},
20332			Outputs:  []operand.Op{xy2},
20333			ISA:      []string{"AVX"},
20334		}, nil
20335	case operand.IsYMM(xy) && operand.IsYMM(mxy) && operand.IsYMM(xy1) && operand.IsYMM(xy2):
20336		return &intrep.Instruction{
20337			Opcode:   "VBLENDVPD",
20338			Operands: []operand.Op{xy, mxy, xy1, xy2},
20339			Inputs:   []operand.Op{xy, mxy, xy1},
20340			Outputs:  []operand.Op{xy2},
20341			ISA:      []string{"AVX"},
20342		}, nil
20343	case operand.IsYMM(xy) && operand.IsM256(mxy) && operand.IsYMM(xy1) && operand.IsYMM(xy2):
20344		return &intrep.Instruction{
20345			Opcode:   "VBLENDVPD",
20346			Operands: []operand.Op{xy, mxy, xy1, xy2},
20347			Inputs:   []operand.Op{xy, mxy, xy1},
20348			Outputs:  []operand.Op{xy2},
20349			ISA:      []string{"AVX"},
20350		}, nil
20351	}
20352	return nil, errors.New("VBLENDVPD: bad operands")
20353}
20354
20355// VBLENDVPS:  Variable Blend Packed Single Precision Floating-Point Values.
20356//
20357// Forms:
20358//
20359// 	VBLENDVPS xmm xmm  xmm xmm
20360// 	VBLENDVPS xmm m128 xmm xmm
20361// 	VBLENDVPS ymm ymm  ymm ymm
20362// 	VBLENDVPS ymm m256 ymm ymm
20363func VBLENDVPS(xy, mxy, xy1, xy2 operand.Op) (*intrep.Instruction, error) {
20364	switch {
20365	case operand.IsXMM(xy) && operand.IsXMM(mxy) && operand.IsXMM(xy1) && operand.IsXMM(xy2):
20366		return &intrep.Instruction{
20367			Opcode:   "VBLENDVPS",
20368			Operands: []operand.Op{xy, mxy, xy1, xy2},
20369			Inputs:   []operand.Op{xy, mxy, xy1},
20370			Outputs:  []operand.Op{xy2},
20371			ISA:      []string{"AVX"},
20372		}, nil
20373	case operand.IsXMM(xy) && operand.IsM128(mxy) && operand.IsXMM(xy1) && operand.IsXMM(xy2):
20374		return &intrep.Instruction{
20375			Opcode:   "VBLENDVPS",
20376			Operands: []operand.Op{xy, mxy, xy1, xy2},
20377			Inputs:   []operand.Op{xy, mxy, xy1},
20378			Outputs:  []operand.Op{xy2},
20379			ISA:      []string{"AVX"},
20380		}, nil
20381	case operand.IsYMM(xy) && operand.IsYMM(mxy) && operand.IsYMM(xy1) && operand.IsYMM(xy2):
20382		return &intrep.Instruction{
20383			Opcode:   "VBLENDVPS",
20384			Operands: []operand.Op{xy, mxy, xy1, xy2},
20385			Inputs:   []operand.Op{xy, mxy, xy1},
20386			Outputs:  []operand.Op{xy2},
20387			ISA:      []string{"AVX"},
20388		}, nil
20389	case operand.IsYMM(xy) && operand.IsM256(mxy) && operand.IsYMM(xy1) && operand.IsYMM(xy2):
20390		return &intrep.Instruction{
20391			Opcode:   "VBLENDVPS",
20392			Operands: []operand.Op{xy, mxy, xy1, xy2},
20393			Inputs:   []operand.Op{xy, mxy, xy1},
20394			Outputs:  []operand.Op{xy2},
20395			ISA:      []string{"AVX"},
20396		}, nil
20397	}
20398	return nil, errors.New("VBLENDVPS: bad operands")
20399}
20400
20401// VBROADCASTF128: Broadcast 128 Bit of Floating-Point Data.
20402//
20403// Forms:
20404//
20405// 	VBROADCASTF128 m128 ymm
20406func VBROADCASTF128(m, y operand.Op) (*intrep.Instruction, error) {
20407	switch {
20408	case operand.IsM128(m) && operand.IsYMM(y):
20409		return &intrep.Instruction{
20410			Opcode:   "VBROADCASTF128",
20411			Operands: []operand.Op{m, y},
20412			Inputs:   []operand.Op{m},
20413			Outputs:  []operand.Op{y},
20414			ISA:      []string{"AVX"},
20415		}, nil
20416	}
20417	return nil, errors.New("VBROADCASTF128: bad operands")
20418}
20419
20420// VBROADCASTI128: Broadcast 128 Bits of Integer Data.
20421//
20422// Forms:
20423//
20424// 	VBROADCASTI128 m128 ymm
20425func VBROADCASTI128(m, y operand.Op) (*intrep.Instruction, error) {
20426	switch {
20427	case operand.IsM128(m) && operand.IsYMM(y):
20428		return &intrep.Instruction{
20429			Opcode:   "VBROADCASTI128",
20430			Operands: []operand.Op{m, y},
20431			Inputs:   []operand.Op{m},
20432			Outputs:  []operand.Op{y},
20433			ISA:      []string{"AVX2"},
20434		}, nil
20435	}
20436	return nil, errors.New("VBROADCASTI128: bad operands")
20437}
20438
20439// VBROADCASTSD: Broadcast Double-Precision Floating-Point Element.
20440//
20441// Forms:
20442//
20443// 	VBROADCASTSD xmm ymm
20444// 	VBROADCASTSD m64 ymm
20445func VBROADCASTSD(mx, y operand.Op) (*intrep.Instruction, error) {
20446	switch {
20447	case operand.IsXMM(mx) && operand.IsYMM(y):
20448		return &intrep.Instruction{
20449			Opcode:   "VBROADCASTSD",
20450			Operands: []operand.Op{mx, y},
20451			Inputs:   []operand.Op{mx},
20452			Outputs:  []operand.Op{y},
20453			ISA:      []string{"AVX2"},
20454		}, nil
20455	case operand.IsM64(mx) && operand.IsYMM(y):
20456		return &intrep.Instruction{
20457			Opcode:   "VBROADCASTSD",
20458			Operands: []operand.Op{mx, y},
20459			Inputs:   []operand.Op{mx},
20460			Outputs:  []operand.Op{y},
20461			ISA:      []string{"AVX"},
20462		}, nil
20463	}
20464	return nil, errors.New("VBROADCASTSD: bad operands")
20465}
20466
20467// VBROADCASTSS: Broadcast Single-Precision Floating-Point Element.
20468//
20469// Forms:
20470//
20471// 	VBROADCASTSS xmm xmm
20472// 	VBROADCASTSS m32 xmm
20473// 	VBROADCASTSS xmm ymm
20474// 	VBROADCASTSS m32 ymm
20475func VBROADCASTSS(mx, xy operand.Op) (*intrep.Instruction, error) {
20476	switch {
20477	case operand.IsXMM(mx) && operand.IsXMM(xy):
20478		return &intrep.Instruction{
20479			Opcode:   "VBROADCASTSS",
20480			Operands: []operand.Op{mx, xy},
20481			Inputs:   []operand.Op{mx},
20482			Outputs:  []operand.Op{xy},
20483			ISA:      []string{"AVX2"},
20484		}, nil
20485	case operand.IsM32(mx) && operand.IsXMM(xy):
20486		return &intrep.Instruction{
20487			Opcode:   "VBROADCASTSS",
20488			Operands: []operand.Op{mx, xy},
20489			Inputs:   []operand.Op{mx},
20490			Outputs:  []operand.Op{xy},
20491			ISA:      []string{"AVX"},
20492		}, nil
20493	case operand.IsXMM(mx) && operand.IsYMM(xy):
20494		return &intrep.Instruction{
20495			Opcode:   "VBROADCASTSS",
20496			Operands: []operand.Op{mx, xy},
20497			Inputs:   []operand.Op{mx},
20498			Outputs:  []operand.Op{xy},
20499			ISA:      []string{"AVX2"},
20500		}, nil
20501	case operand.IsM32(mx) && operand.IsYMM(xy):
20502		return &intrep.Instruction{
20503			Opcode:   "VBROADCASTSS",
20504			Operands: []operand.Op{mx, xy},
20505			Inputs:   []operand.Op{mx},
20506			Outputs:  []operand.Op{xy},
20507			ISA:      []string{"AVX"},
20508		}, nil
20509	}
20510	return nil, errors.New("VBROADCASTSS: bad operands")
20511}
20512
20513// VCMPPD: Compare Packed Double-Precision Floating-Point Values.
20514//
20515// Forms:
20516//
20517// 	VCMPPD imm8 xmm  xmm xmm
20518// 	VCMPPD imm8 m128 xmm xmm
20519// 	VCMPPD imm8 ymm  ymm ymm
20520// 	VCMPPD imm8 m256 ymm ymm
20521func VCMPPD(i, mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
20522	switch {
20523	case operand.IsIMM8(i) && operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
20524		return &intrep.Instruction{
20525			Opcode:   "VCMPPD",
20526			Operands: []operand.Op{i, mxy, xy, xy1},
20527			Inputs:   []operand.Op{mxy, xy},
20528			Outputs:  []operand.Op{xy1},
20529			ISA:      []string{"AVX"},
20530		}, nil
20531	case operand.IsIMM8(i) && operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
20532		return &intrep.Instruction{
20533			Opcode:   "VCMPPD",
20534			Operands: []operand.Op{i, mxy, xy, xy1},
20535			Inputs:   []operand.Op{mxy, xy},
20536			Outputs:  []operand.Op{xy1},
20537			ISA:      []string{"AVX"},
20538		}, nil
20539	case operand.IsIMM8(i) && operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
20540		return &intrep.Instruction{
20541			Opcode:   "VCMPPD",
20542			Operands: []operand.Op{i, mxy, xy, xy1},
20543			Inputs:   []operand.Op{mxy, xy},
20544			Outputs:  []operand.Op{xy1},
20545			ISA:      []string{"AVX"},
20546		}, nil
20547	case operand.IsIMM8(i) && operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
20548		return &intrep.Instruction{
20549			Opcode:   "VCMPPD",
20550			Operands: []operand.Op{i, mxy, xy, xy1},
20551			Inputs:   []operand.Op{mxy, xy},
20552			Outputs:  []operand.Op{xy1},
20553			ISA:      []string{"AVX"},
20554		}, nil
20555	}
20556	return nil, errors.New("VCMPPD: bad operands")
20557}
20558
20559// VCMPPS: Compare Packed Single-Precision Floating-Point Values.
20560//
20561// Forms:
20562//
20563// 	VCMPPS imm8 xmm  xmm xmm
20564// 	VCMPPS imm8 m128 xmm xmm
20565// 	VCMPPS imm8 ymm  ymm ymm
20566// 	VCMPPS imm8 m256 ymm ymm
20567func VCMPPS(i, mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
20568	switch {
20569	case operand.IsIMM8(i) && operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
20570		return &intrep.Instruction{
20571			Opcode:   "VCMPPS",
20572			Operands: []operand.Op{i, mxy, xy, xy1},
20573			Inputs:   []operand.Op{mxy, xy},
20574			Outputs:  []operand.Op{xy1},
20575			ISA:      []string{"AVX"},
20576		}, nil
20577	case operand.IsIMM8(i) && operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
20578		return &intrep.Instruction{
20579			Opcode:   "VCMPPS",
20580			Operands: []operand.Op{i, mxy, xy, xy1},
20581			Inputs:   []operand.Op{mxy, xy},
20582			Outputs:  []operand.Op{xy1},
20583			ISA:      []string{"AVX"},
20584		}, nil
20585	case operand.IsIMM8(i) && operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
20586		return &intrep.Instruction{
20587			Opcode:   "VCMPPS",
20588			Operands: []operand.Op{i, mxy, xy, xy1},
20589			Inputs:   []operand.Op{mxy, xy},
20590			Outputs:  []operand.Op{xy1},
20591			ISA:      []string{"AVX"},
20592		}, nil
20593	case operand.IsIMM8(i) && operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
20594		return &intrep.Instruction{
20595			Opcode:   "VCMPPS",
20596			Operands: []operand.Op{i, mxy, xy, xy1},
20597			Inputs:   []operand.Op{mxy, xy},
20598			Outputs:  []operand.Op{xy1},
20599			ISA:      []string{"AVX"},
20600		}, nil
20601	}
20602	return nil, errors.New("VCMPPS: bad operands")
20603}
20604
20605// VCMPSD: Compare Scalar Double-Precision Floating-Point Values.
20606//
20607// Forms:
20608//
20609// 	VCMPSD imm8 xmm xmm xmm
20610// 	VCMPSD imm8 m64 xmm xmm
20611func VCMPSD(i, mx, x, x1 operand.Op) (*intrep.Instruction, error) {
20612	switch {
20613	case operand.IsIMM8(i) && operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
20614		return &intrep.Instruction{
20615			Opcode:   "VCMPSD",
20616			Operands: []operand.Op{i, mx, x, x1},
20617			Inputs:   []operand.Op{mx, x},
20618			Outputs:  []operand.Op{x1},
20619			ISA:      []string{"AVX"},
20620		}, nil
20621	case operand.IsIMM8(i) && operand.IsM64(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
20622		return &intrep.Instruction{
20623			Opcode:   "VCMPSD",
20624			Operands: []operand.Op{i, mx, x, x1},
20625			Inputs:   []operand.Op{mx, x},
20626			Outputs:  []operand.Op{x1},
20627			ISA:      []string{"AVX"},
20628		}, nil
20629	}
20630	return nil, errors.New("VCMPSD: bad operands")
20631}
20632
20633// VCMPSS: Compare Scalar Single-Precision Floating-Point Values.
20634//
20635// Forms:
20636//
20637// 	VCMPSS imm8 xmm xmm xmm
20638// 	VCMPSS imm8 m32 xmm xmm
20639func VCMPSS(i, mx, x, x1 operand.Op) (*intrep.Instruction, error) {
20640	switch {
20641	case operand.IsIMM8(i) && operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
20642		return &intrep.Instruction{
20643			Opcode:   "VCMPSS",
20644			Operands: []operand.Op{i, mx, x, x1},
20645			Inputs:   []operand.Op{mx, x},
20646			Outputs:  []operand.Op{x1},
20647			ISA:      []string{"AVX"},
20648		}, nil
20649	case operand.IsIMM8(i) && operand.IsM32(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
20650		return &intrep.Instruction{
20651			Opcode:   "VCMPSS",
20652			Operands: []operand.Op{i, mx, x, x1},
20653			Inputs:   []operand.Op{mx, x},
20654			Outputs:  []operand.Op{x1},
20655			ISA:      []string{"AVX"},
20656		}, nil
20657	}
20658	return nil, errors.New("VCMPSS: bad operands")
20659}
20660
20661// VCOMISD: Compare Scalar Ordered Double-Precision Floating-Point Values and Set EFLAGS.
20662//
20663// Forms:
20664//
20665// 	VCOMISD xmm xmm
20666// 	VCOMISD m64 xmm
20667func VCOMISD(mx, x operand.Op) (*intrep.Instruction, error) {
20668	switch {
20669	case operand.IsXMM(mx) && operand.IsXMM(x):
20670		return &intrep.Instruction{
20671			Opcode:   "VCOMISD",
20672			Operands: []operand.Op{mx, x},
20673			Inputs:   []operand.Op{mx, x},
20674			Outputs:  []operand.Op{},
20675			ISA:      []string{"AVX"},
20676		}, nil
20677	case operand.IsM64(mx) && operand.IsXMM(x):
20678		return &intrep.Instruction{
20679			Opcode:   "VCOMISD",
20680			Operands: []operand.Op{mx, x},
20681			Inputs:   []operand.Op{mx, x},
20682			Outputs:  []operand.Op{},
20683			ISA:      []string{"AVX"},
20684		}, nil
20685	}
20686	return nil, errors.New("VCOMISD: bad operands")
20687}
20688
20689// VCOMISS: Compare Scalar Ordered Single-Precision Floating-Point Values and Set EFLAGS.
20690//
20691// Forms:
20692//
20693// 	VCOMISS xmm xmm
20694// 	VCOMISS m32 xmm
20695func VCOMISS(mx, x operand.Op) (*intrep.Instruction, error) {
20696	switch {
20697	case operand.IsXMM(mx) && operand.IsXMM(x):
20698		return &intrep.Instruction{
20699			Opcode:   "VCOMISS",
20700			Operands: []operand.Op{mx, x},
20701			Inputs:   []operand.Op{mx, x},
20702			Outputs:  []operand.Op{},
20703			ISA:      []string{"AVX"},
20704		}, nil
20705	case operand.IsM32(mx) && operand.IsXMM(x):
20706		return &intrep.Instruction{
20707			Opcode:   "VCOMISS",
20708			Operands: []operand.Op{mx, x},
20709			Inputs:   []operand.Op{mx, x},
20710			Outputs:  []operand.Op{},
20711			ISA:      []string{"AVX"},
20712		}, nil
20713	}
20714	return nil, errors.New("VCOMISS: bad operands")
20715}
20716
20717// VCVTDQ2PD: Convert Packed Dword Integers to Packed Double-Precision FP Values.
20718//
20719// Forms:
20720//
20721// 	VCVTDQ2PD xmm  xmm
20722// 	VCVTDQ2PD m64  xmm
20723// 	VCVTDQ2PD xmm  ymm
20724// 	VCVTDQ2PD m128 ymm
20725func VCVTDQ2PD(mx, xy operand.Op) (*intrep.Instruction, error) {
20726	switch {
20727	case operand.IsXMM(mx) && operand.IsXMM(xy):
20728		return &intrep.Instruction{
20729			Opcode:   "VCVTDQ2PD",
20730			Operands: []operand.Op{mx, xy},
20731			Inputs:   []operand.Op{mx},
20732			Outputs:  []operand.Op{xy},
20733			ISA:      []string{"AVX"},
20734		}, nil
20735	case operand.IsM64(mx) && operand.IsXMM(xy):
20736		return &intrep.Instruction{
20737			Opcode:   "VCVTDQ2PD",
20738			Operands: []operand.Op{mx, xy},
20739			Inputs:   []operand.Op{mx},
20740			Outputs:  []operand.Op{xy},
20741			ISA:      []string{"AVX"},
20742		}, nil
20743	case operand.IsXMM(mx) && operand.IsYMM(xy):
20744		return &intrep.Instruction{
20745			Opcode:   "VCVTDQ2PD",
20746			Operands: []operand.Op{mx, xy},
20747			Inputs:   []operand.Op{mx},
20748			Outputs:  []operand.Op{xy},
20749			ISA:      []string{"AVX"},
20750		}, nil
20751	case operand.IsM128(mx) && operand.IsYMM(xy):
20752		return &intrep.Instruction{
20753			Opcode:   "VCVTDQ2PD",
20754			Operands: []operand.Op{mx, xy},
20755			Inputs:   []operand.Op{mx},
20756			Outputs:  []operand.Op{xy},
20757			ISA:      []string{"AVX"},
20758		}, nil
20759	}
20760	return nil, errors.New("VCVTDQ2PD: bad operands")
20761}
20762
20763// VCVTDQ2PS: Convert Packed Dword Integers to Packed Single-Precision FP Values.
20764//
20765// Forms:
20766//
20767// 	VCVTDQ2PS xmm  xmm
20768// 	VCVTDQ2PS m128 xmm
20769// 	VCVTDQ2PS ymm  ymm
20770// 	VCVTDQ2PS m256 ymm
20771func VCVTDQ2PS(mxy, xy operand.Op) (*intrep.Instruction, error) {
20772	switch {
20773	case operand.IsXMM(mxy) && operand.IsXMM(xy):
20774		return &intrep.Instruction{
20775			Opcode:   "VCVTDQ2PS",
20776			Operands: []operand.Op{mxy, xy},
20777			Inputs:   []operand.Op{mxy},
20778			Outputs:  []operand.Op{xy},
20779			ISA:      []string{"AVX"},
20780		}, nil
20781	case operand.IsM128(mxy) && operand.IsXMM(xy):
20782		return &intrep.Instruction{
20783			Opcode:   "VCVTDQ2PS",
20784			Operands: []operand.Op{mxy, xy},
20785			Inputs:   []operand.Op{mxy},
20786			Outputs:  []operand.Op{xy},
20787			ISA:      []string{"AVX"},
20788		}, nil
20789	case operand.IsYMM(mxy) && operand.IsYMM(xy):
20790		return &intrep.Instruction{
20791			Opcode:   "VCVTDQ2PS",
20792			Operands: []operand.Op{mxy, xy},
20793			Inputs:   []operand.Op{mxy},
20794			Outputs:  []operand.Op{xy},
20795			ISA:      []string{"AVX"},
20796		}, nil
20797	case operand.IsM256(mxy) && operand.IsYMM(xy):
20798		return &intrep.Instruction{
20799			Opcode:   "VCVTDQ2PS",
20800			Operands: []operand.Op{mxy, xy},
20801			Inputs:   []operand.Op{mxy},
20802			Outputs:  []operand.Op{xy},
20803			ISA:      []string{"AVX"},
20804		}, nil
20805	}
20806	return nil, errors.New("VCVTDQ2PS: bad operands")
20807}
20808
20809// VCVTPD2DQX: Convert Packed Double-Precision FP Values to Packed Dword Integers.
20810//
20811// Forms:
20812//
20813// 	VCVTPD2DQX xmm  xmm
20814// 	VCVTPD2DQX m128 xmm
20815func VCVTPD2DQX(mx, x operand.Op) (*intrep.Instruction, error) {
20816	switch {
20817	case operand.IsXMM(mx) && operand.IsXMM(x):
20818		return &intrep.Instruction{
20819			Opcode:   "VCVTPD2DQX",
20820			Operands: []operand.Op{mx, x},
20821			Inputs:   []operand.Op{mx},
20822			Outputs:  []operand.Op{x},
20823			ISA:      []string{"AVX"},
20824		}, nil
20825	case operand.IsM128(mx) && operand.IsXMM(x):
20826		return &intrep.Instruction{
20827			Opcode:   "VCVTPD2DQX",
20828			Operands: []operand.Op{mx, x},
20829			Inputs:   []operand.Op{mx},
20830			Outputs:  []operand.Op{x},
20831			ISA:      []string{"AVX"},
20832		}, nil
20833	}
20834	return nil, errors.New("VCVTPD2DQX: bad operands")
20835}
20836
20837// VCVTPD2DQY: Convert Packed Double-Precision FP Values to Packed Dword Integers.
20838//
20839// Forms:
20840//
20841// 	VCVTPD2DQY ymm  xmm
20842// 	VCVTPD2DQY m256 xmm
20843func VCVTPD2DQY(my, x operand.Op) (*intrep.Instruction, error) {
20844	switch {
20845	case operand.IsYMM(my) && operand.IsXMM(x):
20846		return &intrep.Instruction{
20847			Opcode:   "VCVTPD2DQY",
20848			Operands: []operand.Op{my, x},
20849			Inputs:   []operand.Op{my},
20850			Outputs:  []operand.Op{x},
20851			ISA:      []string{"AVX"},
20852		}, nil
20853	case operand.IsM256(my) && operand.IsXMM(x):
20854		return &intrep.Instruction{
20855			Opcode:   "VCVTPD2DQY",
20856			Operands: []operand.Op{my, x},
20857			Inputs:   []operand.Op{my},
20858			Outputs:  []operand.Op{x},
20859			ISA:      []string{"AVX"},
20860		}, nil
20861	}
20862	return nil, errors.New("VCVTPD2DQY: bad operands")
20863}
20864
20865// VCVTPD2PSX: Convert Packed Double-Precision FP Values to Packed Single-Precision FP Values.
20866//
20867// Forms:
20868//
20869// 	VCVTPD2PSX xmm  xmm
20870// 	VCVTPD2PSX m128 xmm
20871func VCVTPD2PSX(mx, x operand.Op) (*intrep.Instruction, error) {
20872	switch {
20873	case operand.IsXMM(mx) && operand.IsXMM(x):
20874		return &intrep.Instruction{
20875			Opcode:   "VCVTPD2PSX",
20876			Operands: []operand.Op{mx, x},
20877			Inputs:   []operand.Op{mx},
20878			Outputs:  []operand.Op{x},
20879			ISA:      []string{"AVX"},
20880		}, nil
20881	case operand.IsM128(mx) && operand.IsXMM(x):
20882		return &intrep.Instruction{
20883			Opcode:   "VCVTPD2PSX",
20884			Operands: []operand.Op{mx, x},
20885			Inputs:   []operand.Op{mx},
20886			Outputs:  []operand.Op{x},
20887			ISA:      []string{"AVX"},
20888		}, nil
20889	}
20890	return nil, errors.New("VCVTPD2PSX: bad operands")
20891}
20892
20893// VCVTPD2PSY: Convert Packed Double-Precision FP Values to Packed Single-Precision FP Values.
20894//
20895// Forms:
20896//
20897// 	VCVTPD2PSY ymm  xmm
20898// 	VCVTPD2PSY m256 xmm
20899func VCVTPD2PSY(my, x operand.Op) (*intrep.Instruction, error) {
20900	switch {
20901	case operand.IsYMM(my) && operand.IsXMM(x):
20902		return &intrep.Instruction{
20903			Opcode:   "VCVTPD2PSY",
20904			Operands: []operand.Op{my, x},
20905			Inputs:   []operand.Op{my},
20906			Outputs:  []operand.Op{x},
20907			ISA:      []string{"AVX"},
20908		}, nil
20909	case operand.IsM256(my) && operand.IsXMM(x):
20910		return &intrep.Instruction{
20911			Opcode:   "VCVTPD2PSY",
20912			Operands: []operand.Op{my, x},
20913			Inputs:   []operand.Op{my},
20914			Outputs:  []operand.Op{x},
20915			ISA:      []string{"AVX"},
20916		}, nil
20917	}
20918	return nil, errors.New("VCVTPD2PSY: bad operands")
20919}
20920
20921// VCVTPH2PS: Convert Half-Precision FP Values to Single-Precision FP Values.
20922//
20923// Forms:
20924//
20925// 	VCVTPH2PS xmm  xmm
20926// 	VCVTPH2PS m64  xmm
20927// 	VCVTPH2PS xmm  ymm
20928// 	VCVTPH2PS m128 ymm
20929func VCVTPH2PS(mx, xy operand.Op) (*intrep.Instruction, error) {
20930	switch {
20931	case operand.IsXMM(mx) && operand.IsXMM(xy):
20932		return &intrep.Instruction{
20933			Opcode:   "VCVTPH2PS",
20934			Operands: []operand.Op{mx, xy},
20935			Inputs:   []operand.Op{mx},
20936			Outputs:  []operand.Op{xy},
20937			ISA:      []string{"F16C"},
20938		}, nil
20939	case operand.IsM64(mx) && operand.IsXMM(xy):
20940		return &intrep.Instruction{
20941			Opcode:   "VCVTPH2PS",
20942			Operands: []operand.Op{mx, xy},
20943			Inputs:   []operand.Op{mx},
20944			Outputs:  []operand.Op{xy},
20945			ISA:      []string{"F16C"},
20946		}, nil
20947	case operand.IsXMM(mx) && operand.IsYMM(xy):
20948		return &intrep.Instruction{
20949			Opcode:   "VCVTPH2PS",
20950			Operands: []operand.Op{mx, xy},
20951			Inputs:   []operand.Op{mx},
20952			Outputs:  []operand.Op{xy},
20953			ISA:      []string{"F16C"},
20954		}, nil
20955	case operand.IsM128(mx) && operand.IsYMM(xy):
20956		return &intrep.Instruction{
20957			Opcode:   "VCVTPH2PS",
20958			Operands: []operand.Op{mx, xy},
20959			Inputs:   []operand.Op{mx},
20960			Outputs:  []operand.Op{xy},
20961			ISA:      []string{"F16C"},
20962		}, nil
20963	}
20964	return nil, errors.New("VCVTPH2PS: bad operands")
20965}
20966
20967// VCVTPS2DQ: Convert Packed Single-Precision FP Values to Packed Dword Integers.
20968//
20969// Forms:
20970//
20971// 	VCVTPS2DQ xmm  xmm
20972// 	VCVTPS2DQ m128 xmm
20973// 	VCVTPS2DQ ymm  ymm
20974// 	VCVTPS2DQ m256 ymm
20975func VCVTPS2DQ(mxy, xy operand.Op) (*intrep.Instruction, error) {
20976	switch {
20977	case operand.IsXMM(mxy) && operand.IsXMM(xy):
20978		return &intrep.Instruction{
20979			Opcode:   "VCVTPS2DQ",
20980			Operands: []operand.Op{mxy, xy},
20981			Inputs:   []operand.Op{mxy},
20982			Outputs:  []operand.Op{xy},
20983			ISA:      []string{"AVX"},
20984		}, nil
20985	case operand.IsM128(mxy) && operand.IsXMM(xy):
20986		return &intrep.Instruction{
20987			Opcode:   "VCVTPS2DQ",
20988			Operands: []operand.Op{mxy, xy},
20989			Inputs:   []operand.Op{mxy},
20990			Outputs:  []operand.Op{xy},
20991			ISA:      []string{"AVX"},
20992		}, nil
20993	case operand.IsYMM(mxy) && operand.IsYMM(xy):
20994		return &intrep.Instruction{
20995			Opcode:   "VCVTPS2DQ",
20996			Operands: []operand.Op{mxy, xy},
20997			Inputs:   []operand.Op{mxy},
20998			Outputs:  []operand.Op{xy},
20999			ISA:      []string{"AVX"},
21000		}, nil
21001	case operand.IsM256(mxy) && operand.IsYMM(xy):
21002		return &intrep.Instruction{
21003			Opcode:   "VCVTPS2DQ",
21004			Operands: []operand.Op{mxy, xy},
21005			Inputs:   []operand.Op{mxy},
21006			Outputs:  []operand.Op{xy},
21007			ISA:      []string{"AVX"},
21008		}, nil
21009	}
21010	return nil, errors.New("VCVTPS2DQ: bad operands")
21011}
21012
21013// VCVTPS2PD: Convert Packed Single-Precision FP Values to Packed Double-Precision FP Values.
21014//
21015// Forms:
21016//
21017// 	VCVTPS2PD xmm  xmm
21018// 	VCVTPS2PD m64  xmm
21019// 	VCVTPS2PD xmm  ymm
21020// 	VCVTPS2PD m128 ymm
21021func VCVTPS2PD(mx, xy operand.Op) (*intrep.Instruction, error) {
21022	switch {
21023	case operand.IsXMM(mx) && operand.IsXMM(xy):
21024		return &intrep.Instruction{
21025			Opcode:   "VCVTPS2PD",
21026			Operands: []operand.Op{mx, xy},
21027			Inputs:   []operand.Op{mx},
21028			Outputs:  []operand.Op{xy},
21029			ISA:      []string{"AVX"},
21030		}, nil
21031	case operand.IsM64(mx) && operand.IsXMM(xy):
21032		return &intrep.Instruction{
21033			Opcode:   "VCVTPS2PD",
21034			Operands: []operand.Op{mx, xy},
21035			Inputs:   []operand.Op{mx},
21036			Outputs:  []operand.Op{xy},
21037			ISA:      []string{"AVX"},
21038		}, nil
21039	case operand.IsXMM(mx) && operand.IsYMM(xy):
21040		return &intrep.Instruction{
21041			Opcode:   "VCVTPS2PD",
21042			Operands: []operand.Op{mx, xy},
21043			Inputs:   []operand.Op{mx},
21044			Outputs:  []operand.Op{xy},
21045			ISA:      []string{"AVX"},
21046		}, nil
21047	case operand.IsM128(mx) && operand.IsYMM(xy):
21048		return &intrep.Instruction{
21049			Opcode:   "VCVTPS2PD",
21050			Operands: []operand.Op{mx, xy},
21051			Inputs:   []operand.Op{mx},
21052			Outputs:  []operand.Op{xy},
21053			ISA:      []string{"AVX"},
21054		}, nil
21055	}
21056	return nil, errors.New("VCVTPS2PD: bad operands")
21057}
21058
21059// VCVTPS2PH: Convert Single-Precision FP value to Half-Precision FP value.
21060//
21061// Forms:
21062//
21063// 	VCVTPS2PH imm8 xmm xmm
21064// 	VCVTPS2PH imm8 ymm xmm
21065// 	VCVTPS2PH imm8 xmm m64
21066// 	VCVTPS2PH imm8 ymm m128
21067func VCVTPS2PH(i, xy, mx operand.Op) (*intrep.Instruction, error) {
21068	switch {
21069	case operand.IsIMM8(i) && operand.IsXMM(xy) && operand.IsXMM(mx):
21070		return &intrep.Instruction{
21071			Opcode:   "VCVTPS2PH",
21072			Operands: []operand.Op{i, xy, mx},
21073			Inputs:   []operand.Op{xy},
21074			Outputs:  []operand.Op{mx},
21075			ISA:      []string{"F16C"},
21076		}, nil
21077	case operand.IsIMM8(i) && operand.IsYMM(xy) && operand.IsXMM(mx):
21078		return &intrep.Instruction{
21079			Opcode:   "VCVTPS2PH",
21080			Operands: []operand.Op{i, xy, mx},
21081			Inputs:   []operand.Op{xy},
21082			Outputs:  []operand.Op{mx},
21083			ISA:      []string{"F16C"},
21084		}, nil
21085	case operand.IsIMM8(i) && operand.IsXMM(xy) && operand.IsM64(mx):
21086		return &intrep.Instruction{
21087			Opcode:   "VCVTPS2PH",
21088			Operands: []operand.Op{i, xy, mx},
21089			Inputs:   []operand.Op{xy},
21090			Outputs:  []operand.Op{mx},
21091			ISA:      []string{"F16C"},
21092		}, nil
21093	case operand.IsIMM8(i) && operand.IsYMM(xy) && operand.IsM128(mx):
21094		return &intrep.Instruction{
21095			Opcode:   "VCVTPS2PH",
21096			Operands: []operand.Op{i, xy, mx},
21097			Inputs:   []operand.Op{xy},
21098			Outputs:  []operand.Op{mx},
21099			ISA:      []string{"F16C"},
21100		}, nil
21101	}
21102	return nil, errors.New("VCVTPS2PH: bad operands")
21103}
21104
21105// VCVTSD2SI: Convert Scalar Double-Precision FP Value to Integer.
21106//
21107// Forms:
21108//
21109// 	VCVTSD2SI xmm r32
21110// 	VCVTSD2SI m64 r32
21111func VCVTSD2SI(mx, r operand.Op) (*intrep.Instruction, error) {
21112	switch {
21113	case operand.IsXMM(mx) && operand.IsR32(r):
21114		return &intrep.Instruction{
21115			Opcode:   "VCVTSD2SI",
21116			Operands: []operand.Op{mx, r},
21117			Inputs:   []operand.Op{mx},
21118			Outputs:  []operand.Op{r},
21119			ISA:      []string{"AVX"},
21120		}, nil
21121	case operand.IsM64(mx) && operand.IsR32(r):
21122		return &intrep.Instruction{
21123			Opcode:   "VCVTSD2SI",
21124			Operands: []operand.Op{mx, r},
21125			Inputs:   []operand.Op{mx},
21126			Outputs:  []operand.Op{r},
21127			ISA:      []string{"AVX"},
21128		}, nil
21129	}
21130	return nil, errors.New("VCVTSD2SI: bad operands")
21131}
21132
21133// VCVTSD2SIQ: Convert Scalar Double-Precision FP Value to Integer.
21134//
21135// Forms:
21136//
21137// 	VCVTSD2SIQ xmm r64
21138// 	VCVTSD2SIQ m64 r64
21139func VCVTSD2SIQ(mx, r operand.Op) (*intrep.Instruction, error) {
21140	switch {
21141	case operand.IsXMM(mx) && operand.IsR64(r):
21142		return &intrep.Instruction{
21143			Opcode:   "VCVTSD2SIQ",
21144			Operands: []operand.Op{mx, r},
21145			Inputs:   []operand.Op{mx},
21146			Outputs:  []operand.Op{r},
21147			ISA:      []string{"AVX"},
21148		}, nil
21149	case operand.IsM64(mx) && operand.IsR64(r):
21150		return &intrep.Instruction{
21151			Opcode:   "VCVTSD2SIQ",
21152			Operands: []operand.Op{mx, r},
21153			Inputs:   []operand.Op{mx},
21154			Outputs:  []operand.Op{r},
21155			ISA:      []string{"AVX"},
21156		}, nil
21157	}
21158	return nil, errors.New("VCVTSD2SIQ: bad operands")
21159}
21160
21161// VCVTSD2SS: Convert Scalar Double-Precision FP Value to Scalar Single-Precision FP Value.
21162//
21163// Forms:
21164//
21165// 	VCVTSD2SS xmm xmm xmm
21166// 	VCVTSD2SS m64 xmm xmm
21167func VCVTSD2SS(mx, x, x1 operand.Op) (*intrep.Instruction, error) {
21168	switch {
21169	case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
21170		return &intrep.Instruction{
21171			Opcode:   "VCVTSD2SS",
21172			Operands: []operand.Op{mx, x, x1},
21173			Inputs:   []operand.Op{mx, x},
21174			Outputs:  []operand.Op{x1},
21175			ISA:      []string{"AVX"},
21176		}, nil
21177	case operand.IsM64(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
21178		return &intrep.Instruction{
21179			Opcode:   "VCVTSD2SS",
21180			Operands: []operand.Op{mx, x, x1},
21181			Inputs:   []operand.Op{mx, x},
21182			Outputs:  []operand.Op{x1},
21183			ISA:      []string{"AVX"},
21184		}, nil
21185	}
21186	return nil, errors.New("VCVTSD2SS: bad operands")
21187}
21188
21189// VCVTSI2SDL: Convert Dword Integer to Scalar Double-Precision FP Value.
21190//
21191// Forms:
21192//
21193// 	VCVTSI2SDL r32 xmm xmm
21194// 	VCVTSI2SDL m32 xmm xmm
21195func VCVTSI2SDL(mr, x, x1 operand.Op) (*intrep.Instruction, error) {
21196	switch {
21197	case operand.IsR32(mr) && operand.IsXMM(x) && operand.IsXMM(x1):
21198		return &intrep.Instruction{
21199			Opcode:   "VCVTSI2SDL",
21200			Operands: []operand.Op{mr, x, x1},
21201			Inputs:   []operand.Op{mr, x},
21202			Outputs:  []operand.Op{x1},
21203			ISA:      []string{"AVX"},
21204		}, nil
21205	case operand.IsM32(mr) && operand.IsXMM(x) && operand.IsXMM(x1):
21206		return &intrep.Instruction{
21207			Opcode:   "VCVTSI2SDL",
21208			Operands: []operand.Op{mr, x, x1},
21209			Inputs:   []operand.Op{mr, x},
21210			Outputs:  []operand.Op{x1},
21211			ISA:      []string{"AVX"},
21212		}, nil
21213	}
21214	return nil, errors.New("VCVTSI2SDL: bad operands")
21215}
21216
21217// VCVTSI2SDQ: Convert Dword Integer to Scalar Double-Precision FP Value.
21218//
21219// Forms:
21220//
21221// 	VCVTSI2SDQ r64 xmm xmm
21222// 	VCVTSI2SDQ m64 xmm xmm
21223func VCVTSI2SDQ(mr, x, x1 operand.Op) (*intrep.Instruction, error) {
21224	switch {
21225	case operand.IsR64(mr) && operand.IsXMM(x) && operand.IsXMM(x1):
21226		return &intrep.Instruction{
21227			Opcode:   "VCVTSI2SDQ",
21228			Operands: []operand.Op{mr, x, x1},
21229			Inputs:   []operand.Op{mr, x},
21230			Outputs:  []operand.Op{x1},
21231			ISA:      []string{"AVX"},
21232		}, nil
21233	case operand.IsM64(mr) && operand.IsXMM(x) && operand.IsXMM(x1):
21234		return &intrep.Instruction{
21235			Opcode:   "VCVTSI2SDQ",
21236			Operands: []operand.Op{mr, x, x1},
21237			Inputs:   []operand.Op{mr, x},
21238			Outputs:  []operand.Op{x1},
21239			ISA:      []string{"AVX"},
21240		}, nil
21241	}
21242	return nil, errors.New("VCVTSI2SDQ: bad operands")
21243}
21244
21245// VCVTSI2SSL: Convert Dword Integer to Scalar Single-Precision FP Value.
21246//
21247// Forms:
21248//
21249// 	VCVTSI2SSL r32 xmm xmm
21250// 	VCVTSI2SSL m32 xmm xmm
21251func VCVTSI2SSL(mr, x, x1 operand.Op) (*intrep.Instruction, error) {
21252	switch {
21253	case operand.IsR32(mr) && operand.IsXMM(x) && operand.IsXMM(x1):
21254		return &intrep.Instruction{
21255			Opcode:   "VCVTSI2SSL",
21256			Operands: []operand.Op{mr, x, x1},
21257			Inputs:   []operand.Op{mr, x},
21258			Outputs:  []operand.Op{x1},
21259			ISA:      []string{"AVX"},
21260		}, nil
21261	case operand.IsM32(mr) && operand.IsXMM(x) && operand.IsXMM(x1):
21262		return &intrep.Instruction{
21263			Opcode:   "VCVTSI2SSL",
21264			Operands: []operand.Op{mr, x, x1},
21265			Inputs:   []operand.Op{mr, x},
21266			Outputs:  []operand.Op{x1},
21267			ISA:      []string{"AVX"},
21268		}, nil
21269	}
21270	return nil, errors.New("VCVTSI2SSL: bad operands")
21271}
21272
21273// VCVTSI2SSQ: Convert Dword Integer to Scalar Single-Precision FP Value.
21274//
21275// Forms:
21276//
21277// 	VCVTSI2SSQ r64 xmm xmm
21278// 	VCVTSI2SSQ m64 xmm xmm
21279func VCVTSI2SSQ(mr, x, x1 operand.Op) (*intrep.Instruction, error) {
21280	switch {
21281	case operand.IsR64(mr) && operand.IsXMM(x) && operand.IsXMM(x1):
21282		return &intrep.Instruction{
21283			Opcode:   "VCVTSI2SSQ",
21284			Operands: []operand.Op{mr, x, x1},
21285			Inputs:   []operand.Op{mr, x},
21286			Outputs:  []operand.Op{x1},
21287			ISA:      []string{"AVX"},
21288		}, nil
21289	case operand.IsM64(mr) && operand.IsXMM(x) && operand.IsXMM(x1):
21290		return &intrep.Instruction{
21291			Opcode:   "VCVTSI2SSQ",
21292			Operands: []operand.Op{mr, x, x1},
21293			Inputs:   []operand.Op{mr, x},
21294			Outputs:  []operand.Op{x1},
21295			ISA:      []string{"AVX"},
21296		}, nil
21297	}
21298	return nil, errors.New("VCVTSI2SSQ: bad operands")
21299}
21300
21301// VCVTSS2SD: Convert Scalar Single-Precision FP Value to Scalar Double-Precision FP Value.
21302//
21303// Forms:
21304//
21305// 	VCVTSS2SD xmm xmm xmm
21306// 	VCVTSS2SD m32 xmm xmm
21307func VCVTSS2SD(mx, x, x1 operand.Op) (*intrep.Instruction, error) {
21308	switch {
21309	case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
21310		return &intrep.Instruction{
21311			Opcode:   "VCVTSS2SD",
21312			Operands: []operand.Op{mx, x, x1},
21313			Inputs:   []operand.Op{mx, x},
21314			Outputs:  []operand.Op{x1},
21315			ISA:      []string{"AVX"},
21316		}, nil
21317	case operand.IsM32(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
21318		return &intrep.Instruction{
21319			Opcode:   "VCVTSS2SD",
21320			Operands: []operand.Op{mx, x, x1},
21321			Inputs:   []operand.Op{mx, x},
21322			Outputs:  []operand.Op{x1},
21323			ISA:      []string{"AVX"},
21324		}, nil
21325	}
21326	return nil, errors.New("VCVTSS2SD: bad operands")
21327}
21328
21329// VCVTSS2SI: Convert Scalar Single-Precision FP Value to Dword Integer.
21330//
21331// Forms:
21332//
21333// 	VCVTSS2SI xmm r32
21334// 	VCVTSS2SI m32 r32
21335func VCVTSS2SI(mx, r operand.Op) (*intrep.Instruction, error) {
21336	switch {
21337	case operand.IsXMM(mx) && operand.IsR32(r):
21338		return &intrep.Instruction{
21339			Opcode:   "VCVTSS2SI",
21340			Operands: []operand.Op{mx, r},
21341			Inputs:   []operand.Op{mx},
21342			Outputs:  []operand.Op{r},
21343			ISA:      []string{"AVX"},
21344		}, nil
21345	case operand.IsM32(mx) && operand.IsR32(r):
21346		return &intrep.Instruction{
21347			Opcode:   "VCVTSS2SI",
21348			Operands: []operand.Op{mx, r},
21349			Inputs:   []operand.Op{mx},
21350			Outputs:  []operand.Op{r},
21351			ISA:      []string{"AVX"},
21352		}, nil
21353	}
21354	return nil, errors.New("VCVTSS2SI: bad operands")
21355}
21356
21357// VCVTSS2SIQ: Convert Scalar Single-Precision FP Value to Dword Integer.
21358//
21359// Forms:
21360//
21361// 	VCVTSS2SIQ xmm r64
21362// 	VCVTSS2SIQ m32 r64
21363func VCVTSS2SIQ(mx, r operand.Op) (*intrep.Instruction, error) {
21364	switch {
21365	case operand.IsXMM(mx) && operand.IsR64(r):
21366		return &intrep.Instruction{
21367			Opcode:   "VCVTSS2SIQ",
21368			Operands: []operand.Op{mx, r},
21369			Inputs:   []operand.Op{mx},
21370			Outputs:  []operand.Op{r},
21371			ISA:      []string{"AVX"},
21372		}, nil
21373	case operand.IsM32(mx) && operand.IsR64(r):
21374		return &intrep.Instruction{
21375			Opcode:   "VCVTSS2SIQ",
21376			Operands: []operand.Op{mx, r},
21377			Inputs:   []operand.Op{mx},
21378			Outputs:  []operand.Op{r},
21379			ISA:      []string{"AVX"},
21380		}, nil
21381	}
21382	return nil, errors.New("VCVTSS2SIQ: bad operands")
21383}
21384
21385// VCVTTPD2DQX: Convert with Truncation Packed Double-Precision FP Values to Packed Dword Integers.
21386//
21387// Forms:
21388//
21389// 	VCVTTPD2DQX xmm  xmm
21390// 	VCVTTPD2DQX m128 xmm
21391func VCVTTPD2DQX(mx, x operand.Op) (*intrep.Instruction, error) {
21392	switch {
21393	case operand.IsXMM(mx) && operand.IsXMM(x):
21394		return &intrep.Instruction{
21395			Opcode:   "VCVTTPD2DQX",
21396			Operands: []operand.Op{mx, x},
21397			Inputs:   []operand.Op{mx},
21398			Outputs:  []operand.Op{x},
21399			ISA:      []string{"AVX"},
21400		}, nil
21401	case operand.IsM128(mx) && operand.IsXMM(x):
21402		return &intrep.Instruction{
21403			Opcode:   "VCVTTPD2DQX",
21404			Operands: []operand.Op{mx, x},
21405			Inputs:   []operand.Op{mx},
21406			Outputs:  []operand.Op{x},
21407			ISA:      []string{"AVX"},
21408		}, nil
21409	}
21410	return nil, errors.New("VCVTTPD2DQX: bad operands")
21411}
21412
21413// VCVTTPD2DQY: Convert with Truncation Packed Double-Precision FP Values to Packed Dword Integers.
21414//
21415// Forms:
21416//
21417// 	VCVTTPD2DQY ymm  xmm
21418// 	VCVTTPD2DQY m256 xmm
21419func VCVTTPD2DQY(my, x operand.Op) (*intrep.Instruction, error) {
21420	switch {
21421	case operand.IsYMM(my) && operand.IsXMM(x):
21422		return &intrep.Instruction{
21423			Opcode:   "VCVTTPD2DQY",
21424			Operands: []operand.Op{my, x},
21425			Inputs:   []operand.Op{my},
21426			Outputs:  []operand.Op{x},
21427			ISA:      []string{"AVX"},
21428		}, nil
21429	case operand.IsM256(my) && operand.IsXMM(x):
21430		return &intrep.Instruction{
21431			Opcode:   "VCVTTPD2DQY",
21432			Operands: []operand.Op{my, x},
21433			Inputs:   []operand.Op{my},
21434			Outputs:  []operand.Op{x},
21435			ISA:      []string{"AVX"},
21436		}, nil
21437	}
21438	return nil, errors.New("VCVTTPD2DQY: bad operands")
21439}
21440
21441// VCVTTPS2DQ: Convert with Truncation Packed Single-Precision FP Values to Packed Dword Integers.
21442//
21443// Forms:
21444//
21445// 	VCVTTPS2DQ xmm  xmm
21446// 	VCVTTPS2DQ m128 xmm
21447// 	VCVTTPS2DQ ymm  ymm
21448// 	VCVTTPS2DQ m256 ymm
21449func VCVTTPS2DQ(mxy, xy operand.Op) (*intrep.Instruction, error) {
21450	switch {
21451	case operand.IsXMM(mxy) && operand.IsXMM(xy):
21452		return &intrep.Instruction{
21453			Opcode:   "VCVTTPS2DQ",
21454			Operands: []operand.Op{mxy, xy},
21455			Inputs:   []operand.Op{mxy},
21456			Outputs:  []operand.Op{xy},
21457			ISA:      []string{"AVX"},
21458		}, nil
21459	case operand.IsM128(mxy) && operand.IsXMM(xy):
21460		return &intrep.Instruction{
21461			Opcode:   "VCVTTPS2DQ",
21462			Operands: []operand.Op{mxy, xy},
21463			Inputs:   []operand.Op{mxy},
21464			Outputs:  []operand.Op{xy},
21465			ISA:      []string{"AVX"},
21466		}, nil
21467	case operand.IsYMM(mxy) && operand.IsYMM(xy):
21468		return &intrep.Instruction{
21469			Opcode:   "VCVTTPS2DQ",
21470			Operands: []operand.Op{mxy, xy},
21471			Inputs:   []operand.Op{mxy},
21472			Outputs:  []operand.Op{xy},
21473			ISA:      []string{"AVX"},
21474		}, nil
21475	case operand.IsM256(mxy) && operand.IsYMM(xy):
21476		return &intrep.Instruction{
21477			Opcode:   "VCVTTPS2DQ",
21478			Operands: []operand.Op{mxy, xy},
21479			Inputs:   []operand.Op{mxy},
21480			Outputs:  []operand.Op{xy},
21481			ISA:      []string{"AVX"},
21482		}, nil
21483	}
21484	return nil, errors.New("VCVTTPS2DQ: bad operands")
21485}
21486
21487// VCVTTSD2SI: Convert with Truncation Scalar Double-Precision FP Value to Signed Integer.
21488//
21489// Forms:
21490//
21491// 	VCVTTSD2SI xmm r32
21492// 	VCVTTSD2SI m64 r32
21493func VCVTTSD2SI(mx, r operand.Op) (*intrep.Instruction, error) {
21494	switch {
21495	case operand.IsXMM(mx) && operand.IsR32(r):
21496		return &intrep.Instruction{
21497			Opcode:   "VCVTTSD2SI",
21498			Operands: []operand.Op{mx, r},
21499			Inputs:   []operand.Op{mx},
21500			Outputs:  []operand.Op{r},
21501			ISA:      []string{"AVX"},
21502		}, nil
21503	case operand.IsM64(mx) && operand.IsR32(r):
21504		return &intrep.Instruction{
21505			Opcode:   "VCVTTSD2SI",
21506			Operands: []operand.Op{mx, r},
21507			Inputs:   []operand.Op{mx},
21508			Outputs:  []operand.Op{r},
21509			ISA:      []string{"AVX"},
21510		}, nil
21511	}
21512	return nil, errors.New("VCVTTSD2SI: bad operands")
21513}
21514
21515// VCVTTSD2SIQ: Convert with Truncation Scalar Double-Precision FP Value to Signed Integer.
21516//
21517// Forms:
21518//
21519// 	VCVTTSD2SIQ xmm r64
21520// 	VCVTTSD2SIQ m64 r64
21521func VCVTTSD2SIQ(mx, r operand.Op) (*intrep.Instruction, error) {
21522	switch {
21523	case operand.IsXMM(mx) && operand.IsR64(r):
21524		return &intrep.Instruction{
21525			Opcode:   "VCVTTSD2SIQ",
21526			Operands: []operand.Op{mx, r},
21527			Inputs:   []operand.Op{mx},
21528			Outputs:  []operand.Op{r},
21529			ISA:      []string{"AVX"},
21530		}, nil
21531	case operand.IsM64(mx) && operand.IsR64(r):
21532		return &intrep.Instruction{
21533			Opcode:   "VCVTTSD2SIQ",
21534			Operands: []operand.Op{mx, r},
21535			Inputs:   []operand.Op{mx},
21536			Outputs:  []operand.Op{r},
21537			ISA:      []string{"AVX"},
21538		}, nil
21539	}
21540	return nil, errors.New("VCVTTSD2SIQ: bad operands")
21541}
21542
21543// VCVTTSS2SI: Convert with Truncation Scalar Single-Precision FP Value to Dword Integer.
21544//
21545// Forms:
21546//
21547// 	VCVTTSS2SI xmm r32
21548// 	VCVTTSS2SI m32 r32
21549func VCVTTSS2SI(mx, r operand.Op) (*intrep.Instruction, error) {
21550	switch {
21551	case operand.IsXMM(mx) && operand.IsR32(r):
21552		return &intrep.Instruction{
21553			Opcode:   "VCVTTSS2SI",
21554			Operands: []operand.Op{mx, r},
21555			Inputs:   []operand.Op{mx},
21556			Outputs:  []operand.Op{r},
21557			ISA:      []string{"AVX"},
21558		}, nil
21559	case operand.IsM32(mx) && operand.IsR32(r):
21560		return &intrep.Instruction{
21561			Opcode:   "VCVTTSS2SI",
21562			Operands: []operand.Op{mx, r},
21563			Inputs:   []operand.Op{mx},
21564			Outputs:  []operand.Op{r},
21565			ISA:      []string{"AVX"},
21566		}, nil
21567	}
21568	return nil, errors.New("VCVTTSS2SI: bad operands")
21569}
21570
21571// VCVTTSS2SIQ: Convert with Truncation Scalar Single-Precision FP Value to Dword Integer.
21572//
21573// Forms:
21574//
21575// 	VCVTTSS2SIQ xmm r64
21576// 	VCVTTSS2SIQ m32 r64
21577func VCVTTSS2SIQ(mx, r operand.Op) (*intrep.Instruction, error) {
21578	switch {
21579	case operand.IsXMM(mx) && operand.IsR64(r):
21580		return &intrep.Instruction{
21581			Opcode:   "VCVTTSS2SIQ",
21582			Operands: []operand.Op{mx, r},
21583			Inputs:   []operand.Op{mx},
21584			Outputs:  []operand.Op{r},
21585			ISA:      []string{"AVX"},
21586		}, nil
21587	case operand.IsM32(mx) && operand.IsR64(r):
21588		return &intrep.Instruction{
21589			Opcode:   "VCVTTSS2SIQ",
21590			Operands: []operand.Op{mx, r},
21591			Inputs:   []operand.Op{mx},
21592			Outputs:  []operand.Op{r},
21593			ISA:      []string{"AVX"},
21594		}, nil
21595	}
21596	return nil, errors.New("VCVTTSS2SIQ: bad operands")
21597}
21598
21599// VDIVPD: Divide Packed Double-Precision Floating-Point Values.
21600//
21601// Forms:
21602//
21603// 	VDIVPD xmm  xmm xmm
21604// 	VDIVPD m128 xmm xmm
21605// 	VDIVPD ymm  ymm ymm
21606// 	VDIVPD m256 ymm ymm
21607func VDIVPD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
21608	switch {
21609	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
21610		return &intrep.Instruction{
21611			Opcode:   "VDIVPD",
21612			Operands: []operand.Op{mxy, xy, xy1},
21613			Inputs:   []operand.Op{mxy, xy},
21614			Outputs:  []operand.Op{xy1},
21615			ISA:      []string{"AVX"},
21616		}, nil
21617	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
21618		return &intrep.Instruction{
21619			Opcode:   "VDIVPD",
21620			Operands: []operand.Op{mxy, xy, xy1},
21621			Inputs:   []operand.Op{mxy, xy},
21622			Outputs:  []operand.Op{xy1},
21623			ISA:      []string{"AVX"},
21624		}, nil
21625	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
21626		return &intrep.Instruction{
21627			Opcode:   "VDIVPD",
21628			Operands: []operand.Op{mxy, xy, xy1},
21629			Inputs:   []operand.Op{mxy, xy},
21630			Outputs:  []operand.Op{xy1},
21631			ISA:      []string{"AVX"},
21632		}, nil
21633	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
21634		return &intrep.Instruction{
21635			Opcode:   "VDIVPD",
21636			Operands: []operand.Op{mxy, xy, xy1},
21637			Inputs:   []operand.Op{mxy, xy},
21638			Outputs:  []operand.Op{xy1},
21639			ISA:      []string{"AVX"},
21640		}, nil
21641	}
21642	return nil, errors.New("VDIVPD: bad operands")
21643}
21644
21645// VDIVPS: Divide Packed Single-Precision Floating-Point Values.
21646//
21647// Forms:
21648//
21649// 	VDIVPS xmm  xmm xmm
21650// 	VDIVPS m128 xmm xmm
21651// 	VDIVPS ymm  ymm ymm
21652// 	VDIVPS m256 ymm ymm
21653func VDIVPS(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
21654	switch {
21655	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
21656		return &intrep.Instruction{
21657			Opcode:   "VDIVPS",
21658			Operands: []operand.Op{mxy, xy, xy1},
21659			Inputs:   []operand.Op{mxy, xy},
21660			Outputs:  []operand.Op{xy1},
21661			ISA:      []string{"AVX"},
21662		}, nil
21663	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
21664		return &intrep.Instruction{
21665			Opcode:   "VDIVPS",
21666			Operands: []operand.Op{mxy, xy, xy1},
21667			Inputs:   []operand.Op{mxy, xy},
21668			Outputs:  []operand.Op{xy1},
21669			ISA:      []string{"AVX"},
21670		}, nil
21671	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
21672		return &intrep.Instruction{
21673			Opcode:   "VDIVPS",
21674			Operands: []operand.Op{mxy, xy, xy1},
21675			Inputs:   []operand.Op{mxy, xy},
21676			Outputs:  []operand.Op{xy1},
21677			ISA:      []string{"AVX"},
21678		}, nil
21679	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
21680		return &intrep.Instruction{
21681			Opcode:   "VDIVPS",
21682			Operands: []operand.Op{mxy, xy, xy1},
21683			Inputs:   []operand.Op{mxy, xy},
21684			Outputs:  []operand.Op{xy1},
21685			ISA:      []string{"AVX"},
21686		}, nil
21687	}
21688	return nil, errors.New("VDIVPS: bad operands")
21689}
21690
21691// VDIVSD: Divide Scalar Double-Precision Floating-Point Values.
21692//
21693// Forms:
21694//
21695// 	VDIVSD xmm xmm xmm
21696// 	VDIVSD m64 xmm xmm
21697func VDIVSD(mx, x, x1 operand.Op) (*intrep.Instruction, error) {
21698	switch {
21699	case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
21700		return &intrep.Instruction{
21701			Opcode:   "VDIVSD",
21702			Operands: []operand.Op{mx, x, x1},
21703			Inputs:   []operand.Op{mx, x},
21704			Outputs:  []operand.Op{x1},
21705			ISA:      []string{"AVX"},
21706		}, nil
21707	case operand.IsM64(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
21708		return &intrep.Instruction{
21709			Opcode:   "VDIVSD",
21710			Operands: []operand.Op{mx, x, x1},
21711			Inputs:   []operand.Op{mx, x},
21712			Outputs:  []operand.Op{x1},
21713			ISA:      []string{"AVX"},
21714		}, nil
21715	}
21716	return nil, errors.New("VDIVSD: bad operands")
21717}
21718
21719// VDIVSS: Divide Scalar Single-Precision Floating-Point Values.
21720//
21721// Forms:
21722//
21723// 	VDIVSS xmm xmm xmm
21724// 	VDIVSS m32 xmm xmm
21725func VDIVSS(mx, x, x1 operand.Op) (*intrep.Instruction, error) {
21726	switch {
21727	case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
21728		return &intrep.Instruction{
21729			Opcode:   "VDIVSS",
21730			Operands: []operand.Op{mx, x, x1},
21731			Inputs:   []operand.Op{mx, x},
21732			Outputs:  []operand.Op{x1},
21733			ISA:      []string{"AVX"},
21734		}, nil
21735	case operand.IsM32(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
21736		return &intrep.Instruction{
21737			Opcode:   "VDIVSS",
21738			Operands: []operand.Op{mx, x, x1},
21739			Inputs:   []operand.Op{mx, x},
21740			Outputs:  []operand.Op{x1},
21741			ISA:      []string{"AVX"},
21742		}, nil
21743	}
21744	return nil, errors.New("VDIVSS: bad operands")
21745}
21746
21747// VDPPD: Dot Product of Packed Double Precision Floating-Point Values.
21748//
21749// Forms:
21750//
21751// 	VDPPD imm8 xmm  xmm xmm
21752// 	VDPPD imm8 m128 xmm xmm
21753func VDPPD(i, mx, x, x1 operand.Op) (*intrep.Instruction, error) {
21754	switch {
21755	case operand.IsIMM8(i) && operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
21756		return &intrep.Instruction{
21757			Opcode:   "VDPPD",
21758			Operands: []operand.Op{i, mx, x, x1},
21759			Inputs:   []operand.Op{mx, x},
21760			Outputs:  []operand.Op{x1},
21761			ISA:      []string{"AVX"},
21762		}, nil
21763	case operand.IsIMM8(i) && operand.IsM128(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
21764		return &intrep.Instruction{
21765			Opcode:   "VDPPD",
21766			Operands: []operand.Op{i, mx, x, x1},
21767			Inputs:   []operand.Op{mx, x},
21768			Outputs:  []operand.Op{x1},
21769			ISA:      []string{"AVX"},
21770		}, nil
21771	}
21772	return nil, errors.New("VDPPD: bad operands")
21773}
21774
21775// VDPPS: Dot Product of Packed Single Precision Floating-Point Values.
21776//
21777// Forms:
21778//
21779// 	VDPPS imm8 xmm  xmm xmm
21780// 	VDPPS imm8 m128 xmm xmm
21781// 	VDPPS imm8 ymm  ymm ymm
21782// 	VDPPS imm8 m256 ymm ymm
21783func VDPPS(i, mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
21784	switch {
21785	case operand.IsIMM8(i) && operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
21786		return &intrep.Instruction{
21787			Opcode:   "VDPPS",
21788			Operands: []operand.Op{i, mxy, xy, xy1},
21789			Inputs:   []operand.Op{mxy, xy},
21790			Outputs:  []operand.Op{xy1},
21791			ISA:      []string{"AVX"},
21792		}, nil
21793	case operand.IsIMM8(i) && operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
21794		return &intrep.Instruction{
21795			Opcode:   "VDPPS",
21796			Operands: []operand.Op{i, mxy, xy, xy1},
21797			Inputs:   []operand.Op{mxy, xy},
21798			Outputs:  []operand.Op{xy1},
21799			ISA:      []string{"AVX"},
21800		}, nil
21801	case operand.IsIMM8(i) && operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
21802		return &intrep.Instruction{
21803			Opcode:   "VDPPS",
21804			Operands: []operand.Op{i, mxy, xy, xy1},
21805			Inputs:   []operand.Op{mxy, xy},
21806			Outputs:  []operand.Op{xy1},
21807			ISA:      []string{"AVX"},
21808		}, nil
21809	case operand.IsIMM8(i) && operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
21810		return &intrep.Instruction{
21811			Opcode:   "VDPPS",
21812			Operands: []operand.Op{i, mxy, xy, xy1},
21813			Inputs:   []operand.Op{mxy, xy},
21814			Outputs:  []operand.Op{xy1},
21815			ISA:      []string{"AVX"},
21816		}, nil
21817	}
21818	return nil, errors.New("VDPPS: bad operands")
21819}
21820
21821// VEXTRACTF128: Extract Packed Floating-Point Values.
21822//
21823// Forms:
21824//
21825// 	VEXTRACTF128 imm8 ymm xmm
21826// 	VEXTRACTF128 imm8 ymm m128
21827func VEXTRACTF128(i, y, mx operand.Op) (*intrep.Instruction, error) {
21828	switch {
21829	case operand.IsIMM8(i) && operand.IsYMM(y) && operand.IsXMM(mx):
21830		return &intrep.Instruction{
21831			Opcode:   "VEXTRACTF128",
21832			Operands: []operand.Op{i, y, mx},
21833			Inputs:   []operand.Op{y},
21834			Outputs:  []operand.Op{mx},
21835			ISA:      []string{"AVX"},
21836		}, nil
21837	case operand.IsIMM8(i) && operand.IsYMM(y) && operand.IsM128(mx):
21838		return &intrep.Instruction{
21839			Opcode:   "VEXTRACTF128",
21840			Operands: []operand.Op{i, y, mx},
21841			Inputs:   []operand.Op{y},
21842			Outputs:  []operand.Op{mx},
21843			ISA:      []string{"AVX"},
21844		}, nil
21845	}
21846	return nil, errors.New("VEXTRACTF128: bad operands")
21847}
21848
21849// VEXTRACTI128: Extract Packed Integer Values.
21850//
21851// Forms:
21852//
21853// 	VEXTRACTI128 imm8 ymm xmm
21854// 	VEXTRACTI128 imm8 ymm m128
21855func VEXTRACTI128(i, y, mx operand.Op) (*intrep.Instruction, error) {
21856	switch {
21857	case operand.IsIMM8(i) && operand.IsYMM(y) && operand.IsXMM(mx):
21858		return &intrep.Instruction{
21859			Opcode:   "VEXTRACTI128",
21860			Operands: []operand.Op{i, y, mx},
21861			Inputs:   []operand.Op{y},
21862			Outputs:  []operand.Op{mx},
21863			ISA:      []string{"AVX2"},
21864		}, nil
21865	case operand.IsIMM8(i) && operand.IsYMM(y) && operand.IsM128(mx):
21866		return &intrep.Instruction{
21867			Opcode:   "VEXTRACTI128",
21868			Operands: []operand.Op{i, y, mx},
21869			Inputs:   []operand.Op{y},
21870			Outputs:  []operand.Op{mx},
21871			ISA:      []string{"AVX2"},
21872		}, nil
21873	}
21874	return nil, errors.New("VEXTRACTI128: bad operands")
21875}
21876
21877// VEXTRACTPS: Extract Packed Single Precision Floating-Point Value.
21878//
21879// Forms:
21880//
21881// 	VEXTRACTPS imm8 xmm r32
21882// 	VEXTRACTPS imm8 xmm m32
21883func VEXTRACTPS(i, x, mr operand.Op) (*intrep.Instruction, error) {
21884	switch {
21885	case operand.IsIMM8(i) && operand.IsXMM(x) && operand.IsR32(mr):
21886		return &intrep.Instruction{
21887			Opcode:   "VEXTRACTPS",
21888			Operands: []operand.Op{i, x, mr},
21889			Inputs:   []operand.Op{x},
21890			Outputs:  []operand.Op{mr},
21891			ISA:      []string{"AVX"},
21892		}, nil
21893	case operand.IsIMM8(i) && operand.IsXMM(x) && operand.IsM32(mr):
21894		return &intrep.Instruction{
21895			Opcode:   "VEXTRACTPS",
21896			Operands: []operand.Op{i, x, mr},
21897			Inputs:   []operand.Op{x},
21898			Outputs:  []operand.Op{mr},
21899			ISA:      []string{"AVX"},
21900		}, nil
21901	}
21902	return nil, errors.New("VEXTRACTPS: bad operands")
21903}
21904
21905// VFMADD132PD: Fused Multiply-Add of Packed Double-Precision Floating-Point Values.
21906//
21907// Forms:
21908//
21909// 	VFMADD132PD xmm  xmm xmm
21910// 	VFMADD132PD m128 xmm xmm
21911// 	VFMADD132PD ymm  ymm ymm
21912// 	VFMADD132PD m256 ymm ymm
21913func VFMADD132PD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
21914	switch {
21915	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
21916		return &intrep.Instruction{
21917			Opcode:   "VFMADD132PD",
21918			Operands: []operand.Op{mxy, xy, xy1},
21919			Inputs:   []operand.Op{mxy, xy, xy1},
21920			Outputs:  []operand.Op{xy1},
21921			ISA:      []string{"FMA3"},
21922		}, nil
21923	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
21924		return &intrep.Instruction{
21925			Opcode:   "VFMADD132PD",
21926			Operands: []operand.Op{mxy, xy, xy1},
21927			Inputs:   []operand.Op{mxy, xy, xy1},
21928			Outputs:  []operand.Op{xy1},
21929			ISA:      []string{"FMA3"},
21930		}, nil
21931	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
21932		return &intrep.Instruction{
21933			Opcode:   "VFMADD132PD",
21934			Operands: []operand.Op{mxy, xy, xy1},
21935			Inputs:   []operand.Op{mxy, xy, xy1},
21936			Outputs:  []operand.Op{xy1},
21937			ISA:      []string{"FMA3"},
21938		}, nil
21939	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
21940		return &intrep.Instruction{
21941			Opcode:   "VFMADD132PD",
21942			Operands: []operand.Op{mxy, xy, xy1},
21943			Inputs:   []operand.Op{mxy, xy, xy1},
21944			Outputs:  []operand.Op{xy1},
21945			ISA:      []string{"FMA3"},
21946		}, nil
21947	}
21948	return nil, errors.New("VFMADD132PD: bad operands")
21949}
21950
21951// VFMADD132PS: Fused Multiply-Add of Packed Single-Precision Floating-Point Values.
21952//
21953// Forms:
21954//
21955// 	VFMADD132PS xmm  xmm xmm
21956// 	VFMADD132PS m128 xmm xmm
21957// 	VFMADD132PS ymm  ymm ymm
21958// 	VFMADD132PS m256 ymm ymm
21959func VFMADD132PS(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
21960	switch {
21961	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
21962		return &intrep.Instruction{
21963			Opcode:   "VFMADD132PS",
21964			Operands: []operand.Op{mxy, xy, xy1},
21965			Inputs:   []operand.Op{mxy, xy, xy1},
21966			Outputs:  []operand.Op{xy1},
21967			ISA:      []string{"FMA3"},
21968		}, nil
21969	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
21970		return &intrep.Instruction{
21971			Opcode:   "VFMADD132PS",
21972			Operands: []operand.Op{mxy, xy, xy1},
21973			Inputs:   []operand.Op{mxy, xy, xy1},
21974			Outputs:  []operand.Op{xy1},
21975			ISA:      []string{"FMA3"},
21976		}, nil
21977	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
21978		return &intrep.Instruction{
21979			Opcode:   "VFMADD132PS",
21980			Operands: []operand.Op{mxy, xy, xy1},
21981			Inputs:   []operand.Op{mxy, xy, xy1},
21982			Outputs:  []operand.Op{xy1},
21983			ISA:      []string{"FMA3"},
21984		}, nil
21985	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
21986		return &intrep.Instruction{
21987			Opcode:   "VFMADD132PS",
21988			Operands: []operand.Op{mxy, xy, xy1},
21989			Inputs:   []operand.Op{mxy, xy, xy1},
21990			Outputs:  []operand.Op{xy1},
21991			ISA:      []string{"FMA3"},
21992		}, nil
21993	}
21994	return nil, errors.New("VFMADD132PS: bad operands")
21995}
21996
21997// VFMADD132SD: Fused Multiply-Add of Scalar Double-Precision Floating-Point Values.
21998//
21999// Forms:
22000//
22001// 	VFMADD132SD xmm xmm xmm
22002// 	VFMADD132SD m64 xmm xmm
22003func VFMADD132SD(mx, x, x1 operand.Op) (*intrep.Instruction, error) {
22004	switch {
22005	case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
22006		return &intrep.Instruction{
22007			Opcode:   "VFMADD132SD",
22008			Operands: []operand.Op{mx, x, x1},
22009			Inputs:   []operand.Op{mx, x, x1},
22010			Outputs:  []operand.Op{x1},
22011			ISA:      []string{"FMA3"},
22012		}, nil
22013	case operand.IsM64(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
22014		return &intrep.Instruction{
22015			Opcode:   "VFMADD132SD",
22016			Operands: []operand.Op{mx, x, x1},
22017			Inputs:   []operand.Op{mx, x, x1},
22018			Outputs:  []operand.Op{x1},
22019			ISA:      []string{"FMA3"},
22020		}, nil
22021	}
22022	return nil, errors.New("VFMADD132SD: bad operands")
22023}
22024
22025// VFMADD132SS: Fused Multiply-Add of Scalar Single-Precision Floating-Point Values.
22026//
22027// Forms:
22028//
22029// 	VFMADD132SS xmm xmm xmm
22030// 	VFMADD132SS m32 xmm xmm
22031func VFMADD132SS(mx, x, x1 operand.Op) (*intrep.Instruction, error) {
22032	switch {
22033	case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
22034		return &intrep.Instruction{
22035			Opcode:   "VFMADD132SS",
22036			Operands: []operand.Op{mx, x, x1},
22037			Inputs:   []operand.Op{mx, x, x1},
22038			Outputs:  []operand.Op{x1},
22039			ISA:      []string{"FMA3"},
22040		}, nil
22041	case operand.IsM32(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
22042		return &intrep.Instruction{
22043			Opcode:   "VFMADD132SS",
22044			Operands: []operand.Op{mx, x, x1},
22045			Inputs:   []operand.Op{mx, x, x1},
22046			Outputs:  []operand.Op{x1},
22047			ISA:      []string{"FMA3"},
22048		}, nil
22049	}
22050	return nil, errors.New("VFMADD132SS: bad operands")
22051}
22052
22053// VFMADD213PD: Fused Multiply-Add of Packed Double-Precision Floating-Point Values.
22054//
22055// Forms:
22056//
22057// 	VFMADD213PD xmm  xmm xmm
22058// 	VFMADD213PD m128 xmm xmm
22059// 	VFMADD213PD ymm  ymm ymm
22060// 	VFMADD213PD m256 ymm ymm
22061func VFMADD213PD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
22062	switch {
22063	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
22064		return &intrep.Instruction{
22065			Opcode:   "VFMADD213PD",
22066			Operands: []operand.Op{mxy, xy, xy1},
22067			Inputs:   []operand.Op{mxy, xy, xy1},
22068			Outputs:  []operand.Op{xy1},
22069			ISA:      []string{"FMA3"},
22070		}, nil
22071	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
22072		return &intrep.Instruction{
22073			Opcode:   "VFMADD213PD",
22074			Operands: []operand.Op{mxy, xy, xy1},
22075			Inputs:   []operand.Op{mxy, xy, xy1},
22076			Outputs:  []operand.Op{xy1},
22077			ISA:      []string{"FMA3"},
22078		}, nil
22079	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
22080		return &intrep.Instruction{
22081			Opcode:   "VFMADD213PD",
22082			Operands: []operand.Op{mxy, xy, xy1},
22083			Inputs:   []operand.Op{mxy, xy, xy1},
22084			Outputs:  []operand.Op{xy1},
22085			ISA:      []string{"FMA3"},
22086		}, nil
22087	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
22088		return &intrep.Instruction{
22089			Opcode:   "VFMADD213PD",
22090			Operands: []operand.Op{mxy, xy, xy1},
22091			Inputs:   []operand.Op{mxy, xy, xy1},
22092			Outputs:  []operand.Op{xy1},
22093			ISA:      []string{"FMA3"},
22094		}, nil
22095	}
22096	return nil, errors.New("VFMADD213PD: bad operands")
22097}
22098
22099// VFMADD213PS: Fused Multiply-Add of Packed Single-Precision Floating-Point Values.
22100//
22101// Forms:
22102//
22103// 	VFMADD213PS xmm  xmm xmm
22104// 	VFMADD213PS m128 xmm xmm
22105// 	VFMADD213PS ymm  ymm ymm
22106// 	VFMADD213PS m256 ymm ymm
22107func VFMADD213PS(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
22108	switch {
22109	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
22110		return &intrep.Instruction{
22111			Opcode:   "VFMADD213PS",
22112			Operands: []operand.Op{mxy, xy, xy1},
22113			Inputs:   []operand.Op{mxy, xy, xy1},
22114			Outputs:  []operand.Op{xy1},
22115			ISA:      []string{"FMA3"},
22116		}, nil
22117	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
22118		return &intrep.Instruction{
22119			Opcode:   "VFMADD213PS",
22120			Operands: []operand.Op{mxy, xy, xy1},
22121			Inputs:   []operand.Op{mxy, xy, xy1},
22122			Outputs:  []operand.Op{xy1},
22123			ISA:      []string{"FMA3"},
22124		}, nil
22125	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
22126		return &intrep.Instruction{
22127			Opcode:   "VFMADD213PS",
22128			Operands: []operand.Op{mxy, xy, xy1},
22129			Inputs:   []operand.Op{mxy, xy, xy1},
22130			Outputs:  []operand.Op{xy1},
22131			ISA:      []string{"FMA3"},
22132		}, nil
22133	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
22134		return &intrep.Instruction{
22135			Opcode:   "VFMADD213PS",
22136			Operands: []operand.Op{mxy, xy, xy1},
22137			Inputs:   []operand.Op{mxy, xy, xy1},
22138			Outputs:  []operand.Op{xy1},
22139			ISA:      []string{"FMA3"},
22140		}, nil
22141	}
22142	return nil, errors.New("VFMADD213PS: bad operands")
22143}
22144
22145// VFMADD213SD: Fused Multiply-Add of Scalar Double-Precision Floating-Point Values.
22146//
22147// Forms:
22148//
22149// 	VFMADD213SD xmm xmm xmm
22150// 	VFMADD213SD m64 xmm xmm
22151func VFMADD213SD(mx, x, x1 operand.Op) (*intrep.Instruction, error) {
22152	switch {
22153	case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
22154		return &intrep.Instruction{
22155			Opcode:   "VFMADD213SD",
22156			Operands: []operand.Op{mx, x, x1},
22157			Inputs:   []operand.Op{mx, x, x1},
22158			Outputs:  []operand.Op{x1},
22159			ISA:      []string{"FMA3"},
22160		}, nil
22161	case operand.IsM64(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
22162		return &intrep.Instruction{
22163			Opcode:   "VFMADD213SD",
22164			Operands: []operand.Op{mx, x, x1},
22165			Inputs:   []operand.Op{mx, x, x1},
22166			Outputs:  []operand.Op{x1},
22167			ISA:      []string{"FMA3"},
22168		}, nil
22169	}
22170	return nil, errors.New("VFMADD213SD: bad operands")
22171}
22172
22173// VFMADD213SS: Fused Multiply-Add of Scalar Single-Precision Floating-Point Values.
22174//
22175// Forms:
22176//
22177// 	VFMADD213SS xmm xmm xmm
22178// 	VFMADD213SS m32 xmm xmm
22179func VFMADD213SS(mx, x, x1 operand.Op) (*intrep.Instruction, error) {
22180	switch {
22181	case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
22182		return &intrep.Instruction{
22183			Opcode:   "VFMADD213SS",
22184			Operands: []operand.Op{mx, x, x1},
22185			Inputs:   []operand.Op{mx, x, x1},
22186			Outputs:  []operand.Op{x1},
22187			ISA:      []string{"FMA3"},
22188		}, nil
22189	case operand.IsM32(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
22190		return &intrep.Instruction{
22191			Opcode:   "VFMADD213SS",
22192			Operands: []operand.Op{mx, x, x1},
22193			Inputs:   []operand.Op{mx, x, x1},
22194			Outputs:  []operand.Op{x1},
22195			ISA:      []string{"FMA3"},
22196		}, nil
22197	}
22198	return nil, errors.New("VFMADD213SS: bad operands")
22199}
22200
22201// VFMADD231PD: Fused Multiply-Add of Packed Double-Precision Floating-Point Values.
22202//
22203// Forms:
22204//
22205// 	VFMADD231PD xmm  xmm xmm
22206// 	VFMADD231PD m128 xmm xmm
22207// 	VFMADD231PD ymm  ymm ymm
22208// 	VFMADD231PD m256 ymm ymm
22209func VFMADD231PD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
22210	switch {
22211	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
22212		return &intrep.Instruction{
22213			Opcode:   "VFMADD231PD",
22214			Operands: []operand.Op{mxy, xy, xy1},
22215			Inputs:   []operand.Op{mxy, xy, xy1},
22216			Outputs:  []operand.Op{xy1},
22217			ISA:      []string{"FMA3"},
22218		}, nil
22219	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
22220		return &intrep.Instruction{
22221			Opcode:   "VFMADD231PD",
22222			Operands: []operand.Op{mxy, xy, xy1},
22223			Inputs:   []operand.Op{mxy, xy, xy1},
22224			Outputs:  []operand.Op{xy1},
22225			ISA:      []string{"FMA3"},
22226		}, nil
22227	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
22228		return &intrep.Instruction{
22229			Opcode:   "VFMADD231PD",
22230			Operands: []operand.Op{mxy, xy, xy1},
22231			Inputs:   []operand.Op{mxy, xy, xy1},
22232			Outputs:  []operand.Op{xy1},
22233			ISA:      []string{"FMA3"},
22234		}, nil
22235	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
22236		return &intrep.Instruction{
22237			Opcode:   "VFMADD231PD",
22238			Operands: []operand.Op{mxy, xy, xy1},
22239			Inputs:   []operand.Op{mxy, xy, xy1},
22240			Outputs:  []operand.Op{xy1},
22241			ISA:      []string{"FMA3"},
22242		}, nil
22243	}
22244	return nil, errors.New("VFMADD231PD: bad operands")
22245}
22246
22247// VFMADD231PS: Fused Multiply-Add of Packed Single-Precision Floating-Point Values.
22248//
22249// Forms:
22250//
22251// 	VFMADD231PS xmm  xmm xmm
22252// 	VFMADD231PS m128 xmm xmm
22253// 	VFMADD231PS ymm  ymm ymm
22254// 	VFMADD231PS m256 ymm ymm
22255func VFMADD231PS(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
22256	switch {
22257	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
22258		return &intrep.Instruction{
22259			Opcode:   "VFMADD231PS",
22260			Operands: []operand.Op{mxy, xy, xy1},
22261			Inputs:   []operand.Op{mxy, xy, xy1},
22262			Outputs:  []operand.Op{xy1},
22263			ISA:      []string{"FMA3"},
22264		}, nil
22265	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
22266		return &intrep.Instruction{
22267			Opcode:   "VFMADD231PS",
22268			Operands: []operand.Op{mxy, xy, xy1},
22269			Inputs:   []operand.Op{mxy, xy, xy1},
22270			Outputs:  []operand.Op{xy1},
22271			ISA:      []string{"FMA3"},
22272		}, nil
22273	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
22274		return &intrep.Instruction{
22275			Opcode:   "VFMADD231PS",
22276			Operands: []operand.Op{mxy, xy, xy1},
22277			Inputs:   []operand.Op{mxy, xy, xy1},
22278			Outputs:  []operand.Op{xy1},
22279			ISA:      []string{"FMA3"},
22280		}, nil
22281	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
22282		return &intrep.Instruction{
22283			Opcode:   "VFMADD231PS",
22284			Operands: []operand.Op{mxy, xy, xy1},
22285			Inputs:   []operand.Op{mxy, xy, xy1},
22286			Outputs:  []operand.Op{xy1},
22287			ISA:      []string{"FMA3"},
22288		}, nil
22289	}
22290	return nil, errors.New("VFMADD231PS: bad operands")
22291}
22292
22293// VFMADD231SD: Fused Multiply-Add of Scalar Double-Precision Floating-Point Values.
22294//
22295// Forms:
22296//
22297// 	VFMADD231SD xmm xmm xmm
22298// 	VFMADD231SD m64 xmm xmm
22299func VFMADD231SD(mx, x, x1 operand.Op) (*intrep.Instruction, error) {
22300	switch {
22301	case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
22302		return &intrep.Instruction{
22303			Opcode:   "VFMADD231SD",
22304			Operands: []operand.Op{mx, x, x1},
22305			Inputs:   []operand.Op{mx, x, x1},
22306			Outputs:  []operand.Op{x1},
22307			ISA:      []string{"FMA3"},
22308		}, nil
22309	case operand.IsM64(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
22310		return &intrep.Instruction{
22311			Opcode:   "VFMADD231SD",
22312			Operands: []operand.Op{mx, x, x1},
22313			Inputs:   []operand.Op{mx, x, x1},
22314			Outputs:  []operand.Op{x1},
22315			ISA:      []string{"FMA3"},
22316		}, nil
22317	}
22318	return nil, errors.New("VFMADD231SD: bad operands")
22319}
22320
22321// VFMADD231SS: Fused Multiply-Add of Scalar Single-Precision Floating-Point Values.
22322//
22323// Forms:
22324//
22325// 	VFMADD231SS xmm xmm xmm
22326// 	VFMADD231SS m32 xmm xmm
22327func VFMADD231SS(mx, x, x1 operand.Op) (*intrep.Instruction, error) {
22328	switch {
22329	case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
22330		return &intrep.Instruction{
22331			Opcode:   "VFMADD231SS",
22332			Operands: []operand.Op{mx, x, x1},
22333			Inputs:   []operand.Op{mx, x, x1},
22334			Outputs:  []operand.Op{x1},
22335			ISA:      []string{"FMA3"},
22336		}, nil
22337	case operand.IsM32(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
22338		return &intrep.Instruction{
22339			Opcode:   "VFMADD231SS",
22340			Operands: []operand.Op{mx, x, x1},
22341			Inputs:   []operand.Op{mx, x, x1},
22342			Outputs:  []operand.Op{x1},
22343			ISA:      []string{"FMA3"},
22344		}, nil
22345	}
22346	return nil, errors.New("VFMADD231SS: bad operands")
22347}
22348
22349// VFMADDSUB132PD: Fused Multiply-Alternating Add/Subtract of Packed Double-Precision Floating-Point Values.
22350//
22351// Forms:
22352//
22353// 	VFMADDSUB132PD xmm  xmm xmm
22354// 	VFMADDSUB132PD m128 xmm xmm
22355// 	VFMADDSUB132PD ymm  ymm ymm
22356// 	VFMADDSUB132PD m256 ymm ymm
22357func VFMADDSUB132PD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
22358	switch {
22359	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
22360		return &intrep.Instruction{
22361			Opcode:   "VFMADDSUB132PD",
22362			Operands: []operand.Op{mxy, xy, xy1},
22363			Inputs:   []operand.Op{mxy, xy, xy1},
22364			Outputs:  []operand.Op{xy1},
22365			ISA:      []string{"FMA3"},
22366		}, nil
22367	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
22368		return &intrep.Instruction{
22369			Opcode:   "VFMADDSUB132PD",
22370			Operands: []operand.Op{mxy, xy, xy1},
22371			Inputs:   []operand.Op{mxy, xy, xy1},
22372			Outputs:  []operand.Op{xy1},
22373			ISA:      []string{"FMA3"},
22374		}, nil
22375	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
22376		return &intrep.Instruction{
22377			Opcode:   "VFMADDSUB132PD",
22378			Operands: []operand.Op{mxy, xy, xy1},
22379			Inputs:   []operand.Op{mxy, xy, xy1},
22380			Outputs:  []operand.Op{xy1},
22381			ISA:      []string{"FMA3"},
22382		}, nil
22383	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
22384		return &intrep.Instruction{
22385			Opcode:   "VFMADDSUB132PD",
22386			Operands: []operand.Op{mxy, xy, xy1},
22387			Inputs:   []operand.Op{mxy, xy, xy1},
22388			Outputs:  []operand.Op{xy1},
22389			ISA:      []string{"FMA3"},
22390		}, nil
22391	}
22392	return nil, errors.New("VFMADDSUB132PD: bad operands")
22393}
22394
22395// VFMADDSUB132PS: Fused Multiply-Alternating Add/Subtract of Packed Single-Precision Floating-Point Values.
22396//
22397// Forms:
22398//
22399// 	VFMADDSUB132PS xmm  xmm xmm
22400// 	VFMADDSUB132PS m128 xmm xmm
22401// 	VFMADDSUB132PS ymm  ymm ymm
22402// 	VFMADDSUB132PS m256 ymm ymm
22403func VFMADDSUB132PS(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
22404	switch {
22405	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
22406		return &intrep.Instruction{
22407			Opcode:   "VFMADDSUB132PS",
22408			Operands: []operand.Op{mxy, xy, xy1},
22409			Inputs:   []operand.Op{mxy, xy, xy1},
22410			Outputs:  []operand.Op{xy1},
22411			ISA:      []string{"FMA3"},
22412		}, nil
22413	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
22414		return &intrep.Instruction{
22415			Opcode:   "VFMADDSUB132PS",
22416			Operands: []operand.Op{mxy, xy, xy1},
22417			Inputs:   []operand.Op{mxy, xy, xy1},
22418			Outputs:  []operand.Op{xy1},
22419			ISA:      []string{"FMA3"},
22420		}, nil
22421	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
22422		return &intrep.Instruction{
22423			Opcode:   "VFMADDSUB132PS",
22424			Operands: []operand.Op{mxy, xy, xy1},
22425			Inputs:   []operand.Op{mxy, xy, xy1},
22426			Outputs:  []operand.Op{xy1},
22427			ISA:      []string{"FMA3"},
22428		}, nil
22429	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
22430		return &intrep.Instruction{
22431			Opcode:   "VFMADDSUB132PS",
22432			Operands: []operand.Op{mxy, xy, xy1},
22433			Inputs:   []operand.Op{mxy, xy, xy1},
22434			Outputs:  []operand.Op{xy1},
22435			ISA:      []string{"FMA3"},
22436		}, nil
22437	}
22438	return nil, errors.New("VFMADDSUB132PS: bad operands")
22439}
22440
22441// VFMADDSUB213PD: Fused Multiply-Alternating Add/Subtract of Packed Double-Precision Floating-Point Values.
22442//
22443// Forms:
22444//
22445// 	VFMADDSUB213PD xmm  xmm xmm
22446// 	VFMADDSUB213PD m128 xmm xmm
22447// 	VFMADDSUB213PD ymm  ymm ymm
22448// 	VFMADDSUB213PD m256 ymm ymm
22449func VFMADDSUB213PD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
22450	switch {
22451	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
22452		return &intrep.Instruction{
22453			Opcode:   "VFMADDSUB213PD",
22454			Operands: []operand.Op{mxy, xy, xy1},
22455			Inputs:   []operand.Op{mxy, xy, xy1},
22456			Outputs:  []operand.Op{xy1},
22457			ISA:      []string{"FMA3"},
22458		}, nil
22459	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
22460		return &intrep.Instruction{
22461			Opcode:   "VFMADDSUB213PD",
22462			Operands: []operand.Op{mxy, xy, xy1},
22463			Inputs:   []operand.Op{mxy, xy, xy1},
22464			Outputs:  []operand.Op{xy1},
22465			ISA:      []string{"FMA3"},
22466		}, nil
22467	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
22468		return &intrep.Instruction{
22469			Opcode:   "VFMADDSUB213PD",
22470			Operands: []operand.Op{mxy, xy, xy1},
22471			Inputs:   []operand.Op{mxy, xy, xy1},
22472			Outputs:  []operand.Op{xy1},
22473			ISA:      []string{"FMA3"},
22474		}, nil
22475	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
22476		return &intrep.Instruction{
22477			Opcode:   "VFMADDSUB213PD",
22478			Operands: []operand.Op{mxy, xy, xy1},
22479			Inputs:   []operand.Op{mxy, xy, xy1},
22480			Outputs:  []operand.Op{xy1},
22481			ISA:      []string{"FMA3"},
22482		}, nil
22483	}
22484	return nil, errors.New("VFMADDSUB213PD: bad operands")
22485}
22486
22487// VFMADDSUB213PS: Fused Multiply-Alternating Add/Subtract of Packed Single-Precision Floating-Point Values.
22488//
22489// Forms:
22490//
22491// 	VFMADDSUB213PS xmm  xmm xmm
22492// 	VFMADDSUB213PS m128 xmm xmm
22493// 	VFMADDSUB213PS ymm  ymm ymm
22494// 	VFMADDSUB213PS m256 ymm ymm
22495func VFMADDSUB213PS(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
22496	switch {
22497	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
22498		return &intrep.Instruction{
22499			Opcode:   "VFMADDSUB213PS",
22500			Operands: []operand.Op{mxy, xy, xy1},
22501			Inputs:   []operand.Op{mxy, xy, xy1},
22502			Outputs:  []operand.Op{xy1},
22503			ISA:      []string{"FMA3"},
22504		}, nil
22505	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
22506		return &intrep.Instruction{
22507			Opcode:   "VFMADDSUB213PS",
22508			Operands: []operand.Op{mxy, xy, xy1},
22509			Inputs:   []operand.Op{mxy, xy, xy1},
22510			Outputs:  []operand.Op{xy1},
22511			ISA:      []string{"FMA3"},
22512		}, nil
22513	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
22514		return &intrep.Instruction{
22515			Opcode:   "VFMADDSUB213PS",
22516			Operands: []operand.Op{mxy, xy, xy1},
22517			Inputs:   []operand.Op{mxy, xy, xy1},
22518			Outputs:  []operand.Op{xy1},
22519			ISA:      []string{"FMA3"},
22520		}, nil
22521	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
22522		return &intrep.Instruction{
22523			Opcode:   "VFMADDSUB213PS",
22524			Operands: []operand.Op{mxy, xy, xy1},
22525			Inputs:   []operand.Op{mxy, xy, xy1},
22526			Outputs:  []operand.Op{xy1},
22527			ISA:      []string{"FMA3"},
22528		}, nil
22529	}
22530	return nil, errors.New("VFMADDSUB213PS: bad operands")
22531}
22532
22533// VFMADDSUB231PD: Fused Multiply-Alternating Add/Subtract of Packed Double-Precision Floating-Point Values.
22534//
22535// Forms:
22536//
22537// 	VFMADDSUB231PD xmm  xmm xmm
22538// 	VFMADDSUB231PD m128 xmm xmm
22539// 	VFMADDSUB231PD ymm  ymm ymm
22540// 	VFMADDSUB231PD m256 ymm ymm
22541func VFMADDSUB231PD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
22542	switch {
22543	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
22544		return &intrep.Instruction{
22545			Opcode:   "VFMADDSUB231PD",
22546			Operands: []operand.Op{mxy, xy, xy1},
22547			Inputs:   []operand.Op{mxy, xy, xy1},
22548			Outputs:  []operand.Op{xy1},
22549			ISA:      []string{"FMA3"},
22550		}, nil
22551	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
22552		return &intrep.Instruction{
22553			Opcode:   "VFMADDSUB231PD",
22554			Operands: []operand.Op{mxy, xy, xy1},
22555			Inputs:   []operand.Op{mxy, xy, xy1},
22556			Outputs:  []operand.Op{xy1},
22557			ISA:      []string{"FMA3"},
22558		}, nil
22559	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
22560		return &intrep.Instruction{
22561			Opcode:   "VFMADDSUB231PD",
22562			Operands: []operand.Op{mxy, xy, xy1},
22563			Inputs:   []operand.Op{mxy, xy, xy1},
22564			Outputs:  []operand.Op{xy1},
22565			ISA:      []string{"FMA3"},
22566		}, nil
22567	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
22568		return &intrep.Instruction{
22569			Opcode:   "VFMADDSUB231PD",
22570			Operands: []operand.Op{mxy, xy, xy1},
22571			Inputs:   []operand.Op{mxy, xy, xy1},
22572			Outputs:  []operand.Op{xy1},
22573			ISA:      []string{"FMA3"},
22574		}, nil
22575	}
22576	return nil, errors.New("VFMADDSUB231PD: bad operands")
22577}
22578
22579// VFMADDSUB231PS: Fused Multiply-Alternating Add/Subtract of Packed Single-Precision Floating-Point Values.
22580//
22581// Forms:
22582//
22583// 	VFMADDSUB231PS xmm  xmm xmm
22584// 	VFMADDSUB231PS m128 xmm xmm
22585// 	VFMADDSUB231PS ymm  ymm ymm
22586// 	VFMADDSUB231PS m256 ymm ymm
22587func VFMADDSUB231PS(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
22588	switch {
22589	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
22590		return &intrep.Instruction{
22591			Opcode:   "VFMADDSUB231PS",
22592			Operands: []operand.Op{mxy, xy, xy1},
22593			Inputs:   []operand.Op{mxy, xy, xy1},
22594			Outputs:  []operand.Op{xy1},
22595			ISA:      []string{"FMA3"},
22596		}, nil
22597	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
22598		return &intrep.Instruction{
22599			Opcode:   "VFMADDSUB231PS",
22600			Operands: []operand.Op{mxy, xy, xy1},
22601			Inputs:   []operand.Op{mxy, xy, xy1},
22602			Outputs:  []operand.Op{xy1},
22603			ISA:      []string{"FMA3"},
22604		}, nil
22605	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
22606		return &intrep.Instruction{
22607			Opcode:   "VFMADDSUB231PS",
22608			Operands: []operand.Op{mxy, xy, xy1},
22609			Inputs:   []operand.Op{mxy, xy, xy1},
22610			Outputs:  []operand.Op{xy1},
22611			ISA:      []string{"FMA3"},
22612		}, nil
22613	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
22614		return &intrep.Instruction{
22615			Opcode:   "VFMADDSUB231PS",
22616			Operands: []operand.Op{mxy, xy, xy1},
22617			Inputs:   []operand.Op{mxy, xy, xy1},
22618			Outputs:  []operand.Op{xy1},
22619			ISA:      []string{"FMA3"},
22620		}, nil
22621	}
22622	return nil, errors.New("VFMADDSUB231PS: bad operands")
22623}
22624
22625// VFMSUB132PD: Fused Multiply-Subtract of Packed Double-Precision Floating-Point Values.
22626//
22627// Forms:
22628//
22629// 	VFMSUB132PD xmm  xmm xmm
22630// 	VFMSUB132PD m128 xmm xmm
22631// 	VFMSUB132PD ymm  ymm ymm
22632// 	VFMSUB132PD m256 ymm ymm
22633func VFMSUB132PD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
22634	switch {
22635	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
22636		return &intrep.Instruction{
22637			Opcode:   "VFMSUB132PD",
22638			Operands: []operand.Op{mxy, xy, xy1},
22639			Inputs:   []operand.Op{mxy, xy, xy1},
22640			Outputs:  []operand.Op{xy1},
22641			ISA:      []string{"FMA3"},
22642		}, nil
22643	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
22644		return &intrep.Instruction{
22645			Opcode:   "VFMSUB132PD",
22646			Operands: []operand.Op{mxy, xy, xy1},
22647			Inputs:   []operand.Op{mxy, xy, xy1},
22648			Outputs:  []operand.Op{xy1},
22649			ISA:      []string{"FMA3"},
22650		}, nil
22651	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
22652		return &intrep.Instruction{
22653			Opcode:   "VFMSUB132PD",
22654			Operands: []operand.Op{mxy, xy, xy1},
22655			Inputs:   []operand.Op{mxy, xy, xy1},
22656			Outputs:  []operand.Op{xy1},
22657			ISA:      []string{"FMA3"},
22658		}, nil
22659	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
22660		return &intrep.Instruction{
22661			Opcode:   "VFMSUB132PD",
22662			Operands: []operand.Op{mxy, xy, xy1},
22663			Inputs:   []operand.Op{mxy, xy, xy1},
22664			Outputs:  []operand.Op{xy1},
22665			ISA:      []string{"FMA3"},
22666		}, nil
22667	}
22668	return nil, errors.New("VFMSUB132PD: bad operands")
22669}
22670
22671// VFMSUB132PS: Fused Multiply-Subtract of Packed Single-Precision Floating-Point Values.
22672//
22673// Forms:
22674//
22675// 	VFMSUB132PS xmm  xmm xmm
22676// 	VFMSUB132PS m128 xmm xmm
22677// 	VFMSUB132PS ymm  ymm ymm
22678// 	VFMSUB132PS m256 ymm ymm
22679func VFMSUB132PS(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
22680	switch {
22681	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
22682		return &intrep.Instruction{
22683			Opcode:   "VFMSUB132PS",
22684			Operands: []operand.Op{mxy, xy, xy1},
22685			Inputs:   []operand.Op{mxy, xy, xy1},
22686			Outputs:  []operand.Op{xy1},
22687			ISA:      []string{"FMA3"},
22688		}, nil
22689	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
22690		return &intrep.Instruction{
22691			Opcode:   "VFMSUB132PS",
22692			Operands: []operand.Op{mxy, xy, xy1},
22693			Inputs:   []operand.Op{mxy, xy, xy1},
22694			Outputs:  []operand.Op{xy1},
22695			ISA:      []string{"FMA3"},
22696		}, nil
22697	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
22698		return &intrep.Instruction{
22699			Opcode:   "VFMSUB132PS",
22700			Operands: []operand.Op{mxy, xy, xy1},
22701			Inputs:   []operand.Op{mxy, xy, xy1},
22702			Outputs:  []operand.Op{xy1},
22703			ISA:      []string{"FMA3"},
22704		}, nil
22705	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
22706		return &intrep.Instruction{
22707			Opcode:   "VFMSUB132PS",
22708			Operands: []operand.Op{mxy, xy, xy1},
22709			Inputs:   []operand.Op{mxy, xy, xy1},
22710			Outputs:  []operand.Op{xy1},
22711			ISA:      []string{"FMA3"},
22712		}, nil
22713	}
22714	return nil, errors.New("VFMSUB132PS: bad operands")
22715}
22716
22717// VFMSUB132SD: Fused Multiply-Subtract of Scalar Double-Precision Floating-Point Values.
22718//
22719// Forms:
22720//
22721// 	VFMSUB132SD xmm xmm xmm
22722// 	VFMSUB132SD m64 xmm xmm
22723func VFMSUB132SD(mx, x, x1 operand.Op) (*intrep.Instruction, error) {
22724	switch {
22725	case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
22726		return &intrep.Instruction{
22727			Opcode:   "VFMSUB132SD",
22728			Operands: []operand.Op{mx, x, x1},
22729			Inputs:   []operand.Op{mx, x, x1},
22730			Outputs:  []operand.Op{x1},
22731			ISA:      []string{"FMA3"},
22732		}, nil
22733	case operand.IsM64(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
22734		return &intrep.Instruction{
22735			Opcode:   "VFMSUB132SD",
22736			Operands: []operand.Op{mx, x, x1},
22737			Inputs:   []operand.Op{mx, x, x1},
22738			Outputs:  []operand.Op{x1},
22739			ISA:      []string{"FMA3"},
22740		}, nil
22741	}
22742	return nil, errors.New("VFMSUB132SD: bad operands")
22743}
22744
22745// VFMSUB132SS: Fused Multiply-Subtract of Scalar Single-Precision Floating-Point Values.
22746//
22747// Forms:
22748//
22749// 	VFMSUB132SS xmm xmm xmm
22750// 	VFMSUB132SS m32 xmm xmm
22751func VFMSUB132SS(mx, x, x1 operand.Op) (*intrep.Instruction, error) {
22752	switch {
22753	case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
22754		return &intrep.Instruction{
22755			Opcode:   "VFMSUB132SS",
22756			Operands: []operand.Op{mx, x, x1},
22757			Inputs:   []operand.Op{mx, x, x1},
22758			Outputs:  []operand.Op{x1},
22759			ISA:      []string{"FMA3"},
22760		}, nil
22761	case operand.IsM32(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
22762		return &intrep.Instruction{
22763			Opcode:   "VFMSUB132SS",
22764			Operands: []operand.Op{mx, x, x1},
22765			Inputs:   []operand.Op{mx, x, x1},
22766			Outputs:  []operand.Op{x1},
22767			ISA:      []string{"FMA3"},
22768		}, nil
22769	}
22770	return nil, errors.New("VFMSUB132SS: bad operands")
22771}
22772
22773// VFMSUB213PD: Fused Multiply-Subtract of Packed Double-Precision Floating-Point Values.
22774//
22775// Forms:
22776//
22777// 	VFMSUB213PD xmm  xmm xmm
22778// 	VFMSUB213PD m128 xmm xmm
22779// 	VFMSUB213PD ymm  ymm ymm
22780// 	VFMSUB213PD m256 ymm ymm
22781func VFMSUB213PD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
22782	switch {
22783	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
22784		return &intrep.Instruction{
22785			Opcode:   "VFMSUB213PD",
22786			Operands: []operand.Op{mxy, xy, xy1},
22787			Inputs:   []operand.Op{mxy, xy, xy1},
22788			Outputs:  []operand.Op{xy1},
22789			ISA:      []string{"FMA3"},
22790		}, nil
22791	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
22792		return &intrep.Instruction{
22793			Opcode:   "VFMSUB213PD",
22794			Operands: []operand.Op{mxy, xy, xy1},
22795			Inputs:   []operand.Op{mxy, xy, xy1},
22796			Outputs:  []operand.Op{xy1},
22797			ISA:      []string{"FMA3"},
22798		}, nil
22799	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
22800		return &intrep.Instruction{
22801			Opcode:   "VFMSUB213PD",
22802			Operands: []operand.Op{mxy, xy, xy1},
22803			Inputs:   []operand.Op{mxy, xy, xy1},
22804			Outputs:  []operand.Op{xy1},
22805			ISA:      []string{"FMA3"},
22806		}, nil
22807	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
22808		return &intrep.Instruction{
22809			Opcode:   "VFMSUB213PD",
22810			Operands: []operand.Op{mxy, xy, xy1},
22811			Inputs:   []operand.Op{mxy, xy, xy1},
22812			Outputs:  []operand.Op{xy1},
22813			ISA:      []string{"FMA3"},
22814		}, nil
22815	}
22816	return nil, errors.New("VFMSUB213PD: bad operands")
22817}
22818
22819// VFMSUB213PS: Fused Multiply-Subtract of Packed Single-Precision Floating-Point Values.
22820//
22821// Forms:
22822//
22823// 	VFMSUB213PS xmm  xmm xmm
22824// 	VFMSUB213PS m128 xmm xmm
22825// 	VFMSUB213PS ymm  ymm ymm
22826// 	VFMSUB213PS m256 ymm ymm
22827func VFMSUB213PS(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
22828	switch {
22829	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
22830		return &intrep.Instruction{
22831			Opcode:   "VFMSUB213PS",
22832			Operands: []operand.Op{mxy, xy, xy1},
22833			Inputs:   []operand.Op{mxy, xy, xy1},
22834			Outputs:  []operand.Op{xy1},
22835			ISA:      []string{"FMA3"},
22836		}, nil
22837	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
22838		return &intrep.Instruction{
22839			Opcode:   "VFMSUB213PS",
22840			Operands: []operand.Op{mxy, xy, xy1},
22841			Inputs:   []operand.Op{mxy, xy, xy1},
22842			Outputs:  []operand.Op{xy1},
22843			ISA:      []string{"FMA3"},
22844		}, nil
22845	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
22846		return &intrep.Instruction{
22847			Opcode:   "VFMSUB213PS",
22848			Operands: []operand.Op{mxy, xy, xy1},
22849			Inputs:   []operand.Op{mxy, xy, xy1},
22850			Outputs:  []operand.Op{xy1},
22851			ISA:      []string{"FMA3"},
22852		}, nil
22853	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
22854		return &intrep.Instruction{
22855			Opcode:   "VFMSUB213PS",
22856			Operands: []operand.Op{mxy, xy, xy1},
22857			Inputs:   []operand.Op{mxy, xy, xy1},
22858			Outputs:  []operand.Op{xy1},
22859			ISA:      []string{"FMA3"},
22860		}, nil
22861	}
22862	return nil, errors.New("VFMSUB213PS: bad operands")
22863}
22864
22865// VFMSUB213SD: Fused Multiply-Subtract of Scalar Double-Precision Floating-Point Values.
22866//
22867// Forms:
22868//
22869// 	VFMSUB213SD xmm xmm xmm
22870// 	VFMSUB213SD m64 xmm xmm
22871func VFMSUB213SD(mx, x, x1 operand.Op) (*intrep.Instruction, error) {
22872	switch {
22873	case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
22874		return &intrep.Instruction{
22875			Opcode:   "VFMSUB213SD",
22876			Operands: []operand.Op{mx, x, x1},
22877			Inputs:   []operand.Op{mx, x, x1},
22878			Outputs:  []operand.Op{x1},
22879			ISA:      []string{"FMA3"},
22880		}, nil
22881	case operand.IsM64(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
22882		return &intrep.Instruction{
22883			Opcode:   "VFMSUB213SD",
22884			Operands: []operand.Op{mx, x, x1},
22885			Inputs:   []operand.Op{mx, x, x1},
22886			Outputs:  []operand.Op{x1},
22887			ISA:      []string{"FMA3"},
22888		}, nil
22889	}
22890	return nil, errors.New("VFMSUB213SD: bad operands")
22891}
22892
22893// VFMSUB213SS: Fused Multiply-Subtract of Scalar Single-Precision Floating-Point Values.
22894//
22895// Forms:
22896//
22897// 	VFMSUB213SS xmm xmm xmm
22898// 	VFMSUB213SS m32 xmm xmm
22899func VFMSUB213SS(mx, x, x1 operand.Op) (*intrep.Instruction, error) {
22900	switch {
22901	case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
22902		return &intrep.Instruction{
22903			Opcode:   "VFMSUB213SS",
22904			Operands: []operand.Op{mx, x, x1},
22905			Inputs:   []operand.Op{mx, x, x1},
22906			Outputs:  []operand.Op{x1},
22907			ISA:      []string{"FMA3"},
22908		}, nil
22909	case operand.IsM32(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
22910		return &intrep.Instruction{
22911			Opcode:   "VFMSUB213SS",
22912			Operands: []operand.Op{mx, x, x1},
22913			Inputs:   []operand.Op{mx, x, x1},
22914			Outputs:  []operand.Op{x1},
22915			ISA:      []string{"FMA3"},
22916		}, nil
22917	}
22918	return nil, errors.New("VFMSUB213SS: bad operands")
22919}
22920
22921// VFMSUB231PD: Fused Multiply-Subtract of Packed Double-Precision Floating-Point Values.
22922//
22923// Forms:
22924//
22925// 	VFMSUB231PD xmm  xmm xmm
22926// 	VFMSUB231PD m128 xmm xmm
22927// 	VFMSUB231PD ymm  ymm ymm
22928// 	VFMSUB231PD m256 ymm ymm
22929func VFMSUB231PD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
22930	switch {
22931	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
22932		return &intrep.Instruction{
22933			Opcode:   "VFMSUB231PD",
22934			Operands: []operand.Op{mxy, xy, xy1},
22935			Inputs:   []operand.Op{mxy, xy, xy1},
22936			Outputs:  []operand.Op{xy1},
22937			ISA:      []string{"FMA3"},
22938		}, nil
22939	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
22940		return &intrep.Instruction{
22941			Opcode:   "VFMSUB231PD",
22942			Operands: []operand.Op{mxy, xy, xy1},
22943			Inputs:   []operand.Op{mxy, xy, xy1},
22944			Outputs:  []operand.Op{xy1},
22945			ISA:      []string{"FMA3"},
22946		}, nil
22947	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
22948		return &intrep.Instruction{
22949			Opcode:   "VFMSUB231PD",
22950			Operands: []operand.Op{mxy, xy, xy1},
22951			Inputs:   []operand.Op{mxy, xy, xy1},
22952			Outputs:  []operand.Op{xy1},
22953			ISA:      []string{"FMA3"},
22954		}, nil
22955	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
22956		return &intrep.Instruction{
22957			Opcode:   "VFMSUB231PD",
22958			Operands: []operand.Op{mxy, xy, xy1},
22959			Inputs:   []operand.Op{mxy, xy, xy1},
22960			Outputs:  []operand.Op{xy1},
22961			ISA:      []string{"FMA3"},
22962		}, nil
22963	}
22964	return nil, errors.New("VFMSUB231PD: bad operands")
22965}
22966
22967// VFMSUB231PS: Fused Multiply-Subtract of Packed Single-Precision Floating-Point Values.
22968//
22969// Forms:
22970//
22971// 	VFMSUB231PS xmm  xmm xmm
22972// 	VFMSUB231PS m128 xmm xmm
22973// 	VFMSUB231PS ymm  ymm ymm
22974// 	VFMSUB231PS m256 ymm ymm
22975func VFMSUB231PS(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
22976	switch {
22977	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
22978		return &intrep.Instruction{
22979			Opcode:   "VFMSUB231PS",
22980			Operands: []operand.Op{mxy, xy, xy1},
22981			Inputs:   []operand.Op{mxy, xy, xy1},
22982			Outputs:  []operand.Op{xy1},
22983			ISA:      []string{"FMA3"},
22984		}, nil
22985	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
22986		return &intrep.Instruction{
22987			Opcode:   "VFMSUB231PS",
22988			Operands: []operand.Op{mxy, xy, xy1},
22989			Inputs:   []operand.Op{mxy, xy, xy1},
22990			Outputs:  []operand.Op{xy1},
22991			ISA:      []string{"FMA3"},
22992		}, nil
22993	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
22994		return &intrep.Instruction{
22995			Opcode:   "VFMSUB231PS",
22996			Operands: []operand.Op{mxy, xy, xy1},
22997			Inputs:   []operand.Op{mxy, xy, xy1},
22998			Outputs:  []operand.Op{xy1},
22999			ISA:      []string{"FMA3"},
23000		}, nil
23001	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
23002		return &intrep.Instruction{
23003			Opcode:   "VFMSUB231PS",
23004			Operands: []operand.Op{mxy, xy, xy1},
23005			Inputs:   []operand.Op{mxy, xy, xy1},
23006			Outputs:  []operand.Op{xy1},
23007			ISA:      []string{"FMA3"},
23008		}, nil
23009	}
23010	return nil, errors.New("VFMSUB231PS: bad operands")
23011}
23012
23013// VFMSUB231SD: Fused Multiply-Subtract of Scalar Double-Precision Floating-Point Values.
23014//
23015// Forms:
23016//
23017// 	VFMSUB231SD xmm xmm xmm
23018// 	VFMSUB231SD m64 xmm xmm
23019func VFMSUB231SD(mx, x, x1 operand.Op) (*intrep.Instruction, error) {
23020	switch {
23021	case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
23022		return &intrep.Instruction{
23023			Opcode:   "VFMSUB231SD",
23024			Operands: []operand.Op{mx, x, x1},
23025			Inputs:   []operand.Op{mx, x, x1},
23026			Outputs:  []operand.Op{x1},
23027			ISA:      []string{"FMA3"},
23028		}, nil
23029	case operand.IsM64(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
23030		return &intrep.Instruction{
23031			Opcode:   "VFMSUB231SD",
23032			Operands: []operand.Op{mx, x, x1},
23033			Inputs:   []operand.Op{mx, x, x1},
23034			Outputs:  []operand.Op{x1},
23035			ISA:      []string{"FMA3"},
23036		}, nil
23037	}
23038	return nil, errors.New("VFMSUB231SD: bad operands")
23039}
23040
23041// VFMSUB231SS: Fused Multiply-Subtract of Scalar Single-Precision Floating-Point Values.
23042//
23043// Forms:
23044//
23045// 	VFMSUB231SS xmm xmm xmm
23046// 	VFMSUB231SS m32 xmm xmm
23047func VFMSUB231SS(mx, x, x1 operand.Op) (*intrep.Instruction, error) {
23048	switch {
23049	case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
23050		return &intrep.Instruction{
23051			Opcode:   "VFMSUB231SS",
23052			Operands: []operand.Op{mx, x, x1},
23053			Inputs:   []operand.Op{mx, x, x1},
23054			Outputs:  []operand.Op{x1},
23055			ISA:      []string{"FMA3"},
23056		}, nil
23057	case operand.IsM32(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
23058		return &intrep.Instruction{
23059			Opcode:   "VFMSUB231SS",
23060			Operands: []operand.Op{mx, x, x1},
23061			Inputs:   []operand.Op{mx, x, x1},
23062			Outputs:  []operand.Op{x1},
23063			ISA:      []string{"FMA3"},
23064		}, nil
23065	}
23066	return nil, errors.New("VFMSUB231SS: bad operands")
23067}
23068
23069// VFMSUBADD132PD: Fused Multiply-Alternating Subtract/Add of Packed Double-Precision Floating-Point Values.
23070//
23071// Forms:
23072//
23073// 	VFMSUBADD132PD xmm  xmm xmm
23074// 	VFMSUBADD132PD m128 xmm xmm
23075// 	VFMSUBADD132PD ymm  ymm ymm
23076// 	VFMSUBADD132PD m256 ymm ymm
23077func VFMSUBADD132PD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
23078	switch {
23079	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
23080		return &intrep.Instruction{
23081			Opcode:   "VFMSUBADD132PD",
23082			Operands: []operand.Op{mxy, xy, xy1},
23083			Inputs:   []operand.Op{mxy, xy, xy1},
23084			Outputs:  []operand.Op{xy1},
23085			ISA:      []string{"FMA3"},
23086		}, nil
23087	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
23088		return &intrep.Instruction{
23089			Opcode:   "VFMSUBADD132PD",
23090			Operands: []operand.Op{mxy, xy, xy1},
23091			Inputs:   []operand.Op{mxy, xy, xy1},
23092			Outputs:  []operand.Op{xy1},
23093			ISA:      []string{"FMA3"},
23094		}, nil
23095	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
23096		return &intrep.Instruction{
23097			Opcode:   "VFMSUBADD132PD",
23098			Operands: []operand.Op{mxy, xy, xy1},
23099			Inputs:   []operand.Op{mxy, xy, xy1},
23100			Outputs:  []operand.Op{xy1},
23101			ISA:      []string{"FMA3"},
23102		}, nil
23103	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
23104		return &intrep.Instruction{
23105			Opcode:   "VFMSUBADD132PD",
23106			Operands: []operand.Op{mxy, xy, xy1},
23107			Inputs:   []operand.Op{mxy, xy, xy1},
23108			Outputs:  []operand.Op{xy1},
23109			ISA:      []string{"FMA3"},
23110		}, nil
23111	}
23112	return nil, errors.New("VFMSUBADD132PD: bad operands")
23113}
23114
23115// VFMSUBADD132PS: Fused Multiply-Alternating Subtract/Add of Packed Single-Precision Floating-Point Values.
23116//
23117// Forms:
23118//
23119// 	VFMSUBADD132PS xmm  xmm xmm
23120// 	VFMSUBADD132PS m128 xmm xmm
23121// 	VFMSUBADD132PS ymm  ymm ymm
23122// 	VFMSUBADD132PS m256 ymm ymm
23123func VFMSUBADD132PS(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
23124	switch {
23125	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
23126		return &intrep.Instruction{
23127			Opcode:   "VFMSUBADD132PS",
23128			Operands: []operand.Op{mxy, xy, xy1},
23129			Inputs:   []operand.Op{mxy, xy, xy1},
23130			Outputs:  []operand.Op{xy1},
23131			ISA:      []string{"FMA3"},
23132		}, nil
23133	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
23134		return &intrep.Instruction{
23135			Opcode:   "VFMSUBADD132PS",
23136			Operands: []operand.Op{mxy, xy, xy1},
23137			Inputs:   []operand.Op{mxy, xy, xy1},
23138			Outputs:  []operand.Op{xy1},
23139			ISA:      []string{"FMA3"},
23140		}, nil
23141	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
23142		return &intrep.Instruction{
23143			Opcode:   "VFMSUBADD132PS",
23144			Operands: []operand.Op{mxy, xy, xy1},
23145			Inputs:   []operand.Op{mxy, xy, xy1},
23146			Outputs:  []operand.Op{xy1},
23147			ISA:      []string{"FMA3"},
23148		}, nil
23149	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
23150		return &intrep.Instruction{
23151			Opcode:   "VFMSUBADD132PS",
23152			Operands: []operand.Op{mxy, xy, xy1},
23153			Inputs:   []operand.Op{mxy, xy, xy1},
23154			Outputs:  []operand.Op{xy1},
23155			ISA:      []string{"FMA3"},
23156		}, nil
23157	}
23158	return nil, errors.New("VFMSUBADD132PS: bad operands")
23159}
23160
23161// VFMSUBADD213PD: Fused Multiply-Alternating Subtract/Add of Packed Double-Precision Floating-Point Values.
23162//
23163// Forms:
23164//
23165// 	VFMSUBADD213PD xmm  xmm xmm
23166// 	VFMSUBADD213PD m128 xmm xmm
23167// 	VFMSUBADD213PD ymm  ymm ymm
23168// 	VFMSUBADD213PD m256 ymm ymm
23169func VFMSUBADD213PD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
23170	switch {
23171	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
23172		return &intrep.Instruction{
23173			Opcode:   "VFMSUBADD213PD",
23174			Operands: []operand.Op{mxy, xy, xy1},
23175			Inputs:   []operand.Op{mxy, xy, xy1},
23176			Outputs:  []operand.Op{xy1},
23177			ISA:      []string{"FMA3"},
23178		}, nil
23179	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
23180		return &intrep.Instruction{
23181			Opcode:   "VFMSUBADD213PD",
23182			Operands: []operand.Op{mxy, xy, xy1},
23183			Inputs:   []operand.Op{mxy, xy, xy1},
23184			Outputs:  []operand.Op{xy1},
23185			ISA:      []string{"FMA3"},
23186		}, nil
23187	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
23188		return &intrep.Instruction{
23189			Opcode:   "VFMSUBADD213PD",
23190			Operands: []operand.Op{mxy, xy, xy1},
23191			Inputs:   []operand.Op{mxy, xy, xy1},
23192			Outputs:  []operand.Op{xy1},
23193			ISA:      []string{"FMA3"},
23194		}, nil
23195	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
23196		return &intrep.Instruction{
23197			Opcode:   "VFMSUBADD213PD",
23198			Operands: []operand.Op{mxy, xy, xy1},
23199			Inputs:   []operand.Op{mxy, xy, xy1},
23200			Outputs:  []operand.Op{xy1},
23201			ISA:      []string{"FMA3"},
23202		}, nil
23203	}
23204	return nil, errors.New("VFMSUBADD213PD: bad operands")
23205}
23206
23207// VFMSUBADD213PS: Fused Multiply-Alternating Subtract/Add of Packed Single-Precision Floating-Point Values.
23208//
23209// Forms:
23210//
23211// 	VFMSUBADD213PS xmm  xmm xmm
23212// 	VFMSUBADD213PS m128 xmm xmm
23213// 	VFMSUBADD213PS ymm  ymm ymm
23214// 	VFMSUBADD213PS m256 ymm ymm
23215func VFMSUBADD213PS(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
23216	switch {
23217	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
23218		return &intrep.Instruction{
23219			Opcode:   "VFMSUBADD213PS",
23220			Operands: []operand.Op{mxy, xy, xy1},
23221			Inputs:   []operand.Op{mxy, xy, xy1},
23222			Outputs:  []operand.Op{xy1},
23223			ISA:      []string{"FMA3"},
23224		}, nil
23225	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
23226		return &intrep.Instruction{
23227			Opcode:   "VFMSUBADD213PS",
23228			Operands: []operand.Op{mxy, xy, xy1},
23229			Inputs:   []operand.Op{mxy, xy, xy1},
23230			Outputs:  []operand.Op{xy1},
23231			ISA:      []string{"FMA3"},
23232		}, nil
23233	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
23234		return &intrep.Instruction{
23235			Opcode:   "VFMSUBADD213PS",
23236			Operands: []operand.Op{mxy, xy, xy1},
23237			Inputs:   []operand.Op{mxy, xy, xy1},
23238			Outputs:  []operand.Op{xy1},
23239			ISA:      []string{"FMA3"},
23240		}, nil
23241	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
23242		return &intrep.Instruction{
23243			Opcode:   "VFMSUBADD213PS",
23244			Operands: []operand.Op{mxy, xy, xy1},
23245			Inputs:   []operand.Op{mxy, xy, xy1},
23246			Outputs:  []operand.Op{xy1},
23247			ISA:      []string{"FMA3"},
23248		}, nil
23249	}
23250	return nil, errors.New("VFMSUBADD213PS: bad operands")
23251}
23252
23253// VFMSUBADD231PD: Fused Multiply-Alternating Subtract/Add of Packed Double-Precision Floating-Point Values.
23254//
23255// Forms:
23256//
23257// 	VFMSUBADD231PD xmm  xmm xmm
23258// 	VFMSUBADD231PD m128 xmm xmm
23259// 	VFMSUBADD231PD ymm  ymm ymm
23260// 	VFMSUBADD231PD m256 ymm ymm
23261func VFMSUBADD231PD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
23262	switch {
23263	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
23264		return &intrep.Instruction{
23265			Opcode:   "VFMSUBADD231PD",
23266			Operands: []operand.Op{mxy, xy, xy1},
23267			Inputs:   []operand.Op{mxy, xy, xy1},
23268			Outputs:  []operand.Op{xy1},
23269			ISA:      []string{"FMA3"},
23270		}, nil
23271	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
23272		return &intrep.Instruction{
23273			Opcode:   "VFMSUBADD231PD",
23274			Operands: []operand.Op{mxy, xy, xy1},
23275			Inputs:   []operand.Op{mxy, xy, xy1},
23276			Outputs:  []operand.Op{xy1},
23277			ISA:      []string{"FMA3"},
23278		}, nil
23279	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
23280		return &intrep.Instruction{
23281			Opcode:   "VFMSUBADD231PD",
23282			Operands: []operand.Op{mxy, xy, xy1},
23283			Inputs:   []operand.Op{mxy, xy, xy1},
23284			Outputs:  []operand.Op{xy1},
23285			ISA:      []string{"FMA3"},
23286		}, nil
23287	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
23288		return &intrep.Instruction{
23289			Opcode:   "VFMSUBADD231PD",
23290			Operands: []operand.Op{mxy, xy, xy1},
23291			Inputs:   []operand.Op{mxy, xy, xy1},
23292			Outputs:  []operand.Op{xy1},
23293			ISA:      []string{"FMA3"},
23294		}, nil
23295	}
23296	return nil, errors.New("VFMSUBADD231PD: bad operands")
23297}
23298
23299// VFMSUBADD231PS: Fused Multiply-Alternating Subtract/Add of Packed Single-Precision Floating-Point Values.
23300//
23301// Forms:
23302//
23303// 	VFMSUBADD231PS xmm  xmm xmm
23304// 	VFMSUBADD231PS m128 xmm xmm
23305// 	VFMSUBADD231PS ymm  ymm ymm
23306// 	VFMSUBADD231PS m256 ymm ymm
23307func VFMSUBADD231PS(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
23308	switch {
23309	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
23310		return &intrep.Instruction{
23311			Opcode:   "VFMSUBADD231PS",
23312			Operands: []operand.Op{mxy, xy, xy1},
23313			Inputs:   []operand.Op{mxy, xy, xy1},
23314			Outputs:  []operand.Op{xy1},
23315			ISA:      []string{"FMA3"},
23316		}, nil
23317	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
23318		return &intrep.Instruction{
23319			Opcode:   "VFMSUBADD231PS",
23320			Operands: []operand.Op{mxy, xy, xy1},
23321			Inputs:   []operand.Op{mxy, xy, xy1},
23322			Outputs:  []operand.Op{xy1},
23323			ISA:      []string{"FMA3"},
23324		}, nil
23325	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
23326		return &intrep.Instruction{
23327			Opcode:   "VFMSUBADD231PS",
23328			Operands: []operand.Op{mxy, xy, xy1},
23329			Inputs:   []operand.Op{mxy, xy, xy1},
23330			Outputs:  []operand.Op{xy1},
23331			ISA:      []string{"FMA3"},
23332		}, nil
23333	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
23334		return &intrep.Instruction{
23335			Opcode:   "VFMSUBADD231PS",
23336			Operands: []operand.Op{mxy, xy, xy1},
23337			Inputs:   []operand.Op{mxy, xy, xy1},
23338			Outputs:  []operand.Op{xy1},
23339			ISA:      []string{"FMA3"},
23340		}, nil
23341	}
23342	return nil, errors.New("VFMSUBADD231PS: bad operands")
23343}
23344
23345// VFNMADD132PD: Fused Negative Multiply-Add of Packed Double-Precision Floating-Point Values.
23346//
23347// Forms:
23348//
23349// 	VFNMADD132PD xmm  xmm xmm
23350// 	VFNMADD132PD m128 xmm xmm
23351// 	VFNMADD132PD ymm  ymm ymm
23352// 	VFNMADD132PD m256 ymm ymm
23353func VFNMADD132PD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
23354	switch {
23355	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
23356		return &intrep.Instruction{
23357			Opcode:   "VFNMADD132PD",
23358			Operands: []operand.Op{mxy, xy, xy1},
23359			Inputs:   []operand.Op{mxy, xy, xy1},
23360			Outputs:  []operand.Op{xy1},
23361			ISA:      []string{"FMA3"},
23362		}, nil
23363	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
23364		return &intrep.Instruction{
23365			Opcode:   "VFNMADD132PD",
23366			Operands: []operand.Op{mxy, xy, xy1},
23367			Inputs:   []operand.Op{mxy, xy, xy1},
23368			Outputs:  []operand.Op{xy1},
23369			ISA:      []string{"FMA3"},
23370		}, nil
23371	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
23372		return &intrep.Instruction{
23373			Opcode:   "VFNMADD132PD",
23374			Operands: []operand.Op{mxy, xy, xy1},
23375			Inputs:   []operand.Op{mxy, xy, xy1},
23376			Outputs:  []operand.Op{xy1},
23377			ISA:      []string{"FMA3"},
23378		}, nil
23379	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
23380		return &intrep.Instruction{
23381			Opcode:   "VFNMADD132PD",
23382			Operands: []operand.Op{mxy, xy, xy1},
23383			Inputs:   []operand.Op{mxy, xy, xy1},
23384			Outputs:  []operand.Op{xy1},
23385			ISA:      []string{"FMA3"},
23386		}, nil
23387	}
23388	return nil, errors.New("VFNMADD132PD: bad operands")
23389}
23390
23391// VFNMADD132PS: Fused Negative Multiply-Add of Packed Single-Precision Floating-Point Values.
23392//
23393// Forms:
23394//
23395// 	VFNMADD132PS xmm  xmm xmm
23396// 	VFNMADD132PS m128 xmm xmm
23397// 	VFNMADD132PS ymm  ymm ymm
23398// 	VFNMADD132PS m256 ymm ymm
23399func VFNMADD132PS(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
23400	switch {
23401	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
23402		return &intrep.Instruction{
23403			Opcode:   "VFNMADD132PS",
23404			Operands: []operand.Op{mxy, xy, xy1},
23405			Inputs:   []operand.Op{mxy, xy, xy1},
23406			Outputs:  []operand.Op{xy1},
23407			ISA:      []string{"FMA3"},
23408		}, nil
23409	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
23410		return &intrep.Instruction{
23411			Opcode:   "VFNMADD132PS",
23412			Operands: []operand.Op{mxy, xy, xy1},
23413			Inputs:   []operand.Op{mxy, xy, xy1},
23414			Outputs:  []operand.Op{xy1},
23415			ISA:      []string{"FMA3"},
23416		}, nil
23417	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
23418		return &intrep.Instruction{
23419			Opcode:   "VFNMADD132PS",
23420			Operands: []operand.Op{mxy, xy, xy1},
23421			Inputs:   []operand.Op{mxy, xy, xy1},
23422			Outputs:  []operand.Op{xy1},
23423			ISA:      []string{"FMA3"},
23424		}, nil
23425	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
23426		return &intrep.Instruction{
23427			Opcode:   "VFNMADD132PS",
23428			Operands: []operand.Op{mxy, xy, xy1},
23429			Inputs:   []operand.Op{mxy, xy, xy1},
23430			Outputs:  []operand.Op{xy1},
23431			ISA:      []string{"FMA3"},
23432		}, nil
23433	}
23434	return nil, errors.New("VFNMADD132PS: bad operands")
23435}
23436
23437// VFNMADD132SD: Fused Negative Multiply-Add of Scalar Double-Precision Floating-Point Values.
23438//
23439// Forms:
23440//
23441// 	VFNMADD132SD xmm xmm xmm
23442// 	VFNMADD132SD m64 xmm xmm
23443func VFNMADD132SD(mx, x, x1 operand.Op) (*intrep.Instruction, error) {
23444	switch {
23445	case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
23446		return &intrep.Instruction{
23447			Opcode:   "VFNMADD132SD",
23448			Operands: []operand.Op{mx, x, x1},
23449			Inputs:   []operand.Op{mx, x, x1},
23450			Outputs:  []operand.Op{x1},
23451			ISA:      []string{"FMA3"},
23452		}, nil
23453	case operand.IsM64(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
23454		return &intrep.Instruction{
23455			Opcode:   "VFNMADD132SD",
23456			Operands: []operand.Op{mx, x, x1},
23457			Inputs:   []operand.Op{mx, x, x1},
23458			Outputs:  []operand.Op{x1},
23459			ISA:      []string{"FMA3"},
23460		}, nil
23461	}
23462	return nil, errors.New("VFNMADD132SD: bad operands")
23463}
23464
23465// VFNMADD132SS: Fused Negative Multiply-Add of Scalar Single-Precision Floating-Point Values.
23466//
23467// Forms:
23468//
23469// 	VFNMADD132SS xmm xmm xmm
23470// 	VFNMADD132SS m32 xmm xmm
23471func VFNMADD132SS(mx, x, x1 operand.Op) (*intrep.Instruction, error) {
23472	switch {
23473	case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
23474		return &intrep.Instruction{
23475			Opcode:   "VFNMADD132SS",
23476			Operands: []operand.Op{mx, x, x1},
23477			Inputs:   []operand.Op{mx, x, x1},
23478			Outputs:  []operand.Op{x1},
23479			ISA:      []string{"FMA3"},
23480		}, nil
23481	case operand.IsM32(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
23482		return &intrep.Instruction{
23483			Opcode:   "VFNMADD132SS",
23484			Operands: []operand.Op{mx, x, x1},
23485			Inputs:   []operand.Op{mx, x, x1},
23486			Outputs:  []operand.Op{x1},
23487			ISA:      []string{"FMA3"},
23488		}, nil
23489	}
23490	return nil, errors.New("VFNMADD132SS: bad operands")
23491}
23492
23493// VFNMADD213PD: Fused Negative Multiply-Add of Packed Double-Precision Floating-Point Values.
23494//
23495// Forms:
23496//
23497// 	VFNMADD213PD xmm  xmm xmm
23498// 	VFNMADD213PD m128 xmm xmm
23499// 	VFNMADD213PD ymm  ymm ymm
23500// 	VFNMADD213PD m256 ymm ymm
23501func VFNMADD213PD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
23502	switch {
23503	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
23504		return &intrep.Instruction{
23505			Opcode:   "VFNMADD213PD",
23506			Operands: []operand.Op{mxy, xy, xy1},
23507			Inputs:   []operand.Op{mxy, xy, xy1},
23508			Outputs:  []operand.Op{xy1},
23509			ISA:      []string{"FMA3"},
23510		}, nil
23511	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
23512		return &intrep.Instruction{
23513			Opcode:   "VFNMADD213PD",
23514			Operands: []operand.Op{mxy, xy, xy1},
23515			Inputs:   []operand.Op{mxy, xy, xy1},
23516			Outputs:  []operand.Op{xy1},
23517			ISA:      []string{"FMA3"},
23518		}, nil
23519	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
23520		return &intrep.Instruction{
23521			Opcode:   "VFNMADD213PD",
23522			Operands: []operand.Op{mxy, xy, xy1},
23523			Inputs:   []operand.Op{mxy, xy, xy1},
23524			Outputs:  []operand.Op{xy1},
23525			ISA:      []string{"FMA3"},
23526		}, nil
23527	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
23528		return &intrep.Instruction{
23529			Opcode:   "VFNMADD213PD",
23530			Operands: []operand.Op{mxy, xy, xy1},
23531			Inputs:   []operand.Op{mxy, xy, xy1},
23532			Outputs:  []operand.Op{xy1},
23533			ISA:      []string{"FMA3"},
23534		}, nil
23535	}
23536	return nil, errors.New("VFNMADD213PD: bad operands")
23537}
23538
23539// VFNMADD213PS: Fused Negative Multiply-Add of Packed Single-Precision Floating-Point Values.
23540//
23541// Forms:
23542//
23543// 	VFNMADD213PS xmm  xmm xmm
23544// 	VFNMADD213PS m128 xmm xmm
23545// 	VFNMADD213PS ymm  ymm ymm
23546// 	VFNMADD213PS m256 ymm ymm
23547func VFNMADD213PS(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
23548	switch {
23549	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
23550		return &intrep.Instruction{
23551			Opcode:   "VFNMADD213PS",
23552			Operands: []operand.Op{mxy, xy, xy1},
23553			Inputs:   []operand.Op{mxy, xy, xy1},
23554			Outputs:  []operand.Op{xy1},
23555			ISA:      []string{"FMA3"},
23556		}, nil
23557	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
23558		return &intrep.Instruction{
23559			Opcode:   "VFNMADD213PS",
23560			Operands: []operand.Op{mxy, xy, xy1},
23561			Inputs:   []operand.Op{mxy, xy, xy1},
23562			Outputs:  []operand.Op{xy1},
23563			ISA:      []string{"FMA3"},
23564		}, nil
23565	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
23566		return &intrep.Instruction{
23567			Opcode:   "VFNMADD213PS",
23568			Operands: []operand.Op{mxy, xy, xy1},
23569			Inputs:   []operand.Op{mxy, xy, xy1},
23570			Outputs:  []operand.Op{xy1},
23571			ISA:      []string{"FMA3"},
23572		}, nil
23573	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
23574		return &intrep.Instruction{
23575			Opcode:   "VFNMADD213PS",
23576			Operands: []operand.Op{mxy, xy, xy1},
23577			Inputs:   []operand.Op{mxy, xy, xy1},
23578			Outputs:  []operand.Op{xy1},
23579			ISA:      []string{"FMA3"},
23580		}, nil
23581	}
23582	return nil, errors.New("VFNMADD213PS: bad operands")
23583}
23584
23585// VFNMADD213SD: Fused Negative Multiply-Add of Scalar Double-Precision Floating-Point Values.
23586//
23587// Forms:
23588//
23589// 	VFNMADD213SD xmm xmm xmm
23590// 	VFNMADD213SD m64 xmm xmm
23591func VFNMADD213SD(mx, x, x1 operand.Op) (*intrep.Instruction, error) {
23592	switch {
23593	case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
23594		return &intrep.Instruction{
23595			Opcode:   "VFNMADD213SD",
23596			Operands: []operand.Op{mx, x, x1},
23597			Inputs:   []operand.Op{mx, x, x1},
23598			Outputs:  []operand.Op{x1},
23599			ISA:      []string{"FMA3"},
23600		}, nil
23601	case operand.IsM64(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
23602		return &intrep.Instruction{
23603			Opcode:   "VFNMADD213SD",
23604			Operands: []operand.Op{mx, x, x1},
23605			Inputs:   []operand.Op{mx, x, x1},
23606			Outputs:  []operand.Op{x1},
23607			ISA:      []string{"FMA3"},
23608		}, nil
23609	}
23610	return nil, errors.New("VFNMADD213SD: bad operands")
23611}
23612
23613// VFNMADD213SS: Fused Negative Multiply-Add of Scalar Single-Precision Floating-Point Values.
23614//
23615// Forms:
23616//
23617// 	VFNMADD213SS xmm xmm xmm
23618// 	VFNMADD213SS m32 xmm xmm
23619func VFNMADD213SS(mx, x, x1 operand.Op) (*intrep.Instruction, error) {
23620	switch {
23621	case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
23622		return &intrep.Instruction{
23623			Opcode:   "VFNMADD213SS",
23624			Operands: []operand.Op{mx, x, x1},
23625			Inputs:   []operand.Op{mx, x, x1},
23626			Outputs:  []operand.Op{x1},
23627			ISA:      []string{"FMA3"},
23628		}, nil
23629	case operand.IsM32(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
23630		return &intrep.Instruction{
23631			Opcode:   "VFNMADD213SS",
23632			Operands: []operand.Op{mx, x, x1},
23633			Inputs:   []operand.Op{mx, x, x1},
23634			Outputs:  []operand.Op{x1},
23635			ISA:      []string{"FMA3"},
23636		}, nil
23637	}
23638	return nil, errors.New("VFNMADD213SS: bad operands")
23639}
23640
23641// VFNMADD231PD: Fused Negative Multiply-Add of Packed Double-Precision Floating-Point Values.
23642//
23643// Forms:
23644//
23645// 	VFNMADD231PD xmm  xmm xmm
23646// 	VFNMADD231PD m128 xmm xmm
23647// 	VFNMADD231PD ymm  ymm ymm
23648// 	VFNMADD231PD m256 ymm ymm
23649func VFNMADD231PD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
23650	switch {
23651	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
23652		return &intrep.Instruction{
23653			Opcode:   "VFNMADD231PD",
23654			Operands: []operand.Op{mxy, xy, xy1},
23655			Inputs:   []operand.Op{mxy, xy, xy1},
23656			Outputs:  []operand.Op{xy1},
23657			ISA:      []string{"FMA3"},
23658		}, nil
23659	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
23660		return &intrep.Instruction{
23661			Opcode:   "VFNMADD231PD",
23662			Operands: []operand.Op{mxy, xy, xy1},
23663			Inputs:   []operand.Op{mxy, xy, xy1},
23664			Outputs:  []operand.Op{xy1},
23665			ISA:      []string{"FMA3"},
23666		}, nil
23667	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
23668		return &intrep.Instruction{
23669			Opcode:   "VFNMADD231PD",
23670			Operands: []operand.Op{mxy, xy, xy1},
23671			Inputs:   []operand.Op{mxy, xy, xy1},
23672			Outputs:  []operand.Op{xy1},
23673			ISA:      []string{"FMA3"},
23674		}, nil
23675	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
23676		return &intrep.Instruction{
23677			Opcode:   "VFNMADD231PD",
23678			Operands: []operand.Op{mxy, xy, xy1},
23679			Inputs:   []operand.Op{mxy, xy, xy1},
23680			Outputs:  []operand.Op{xy1},
23681			ISA:      []string{"FMA3"},
23682		}, nil
23683	}
23684	return nil, errors.New("VFNMADD231PD: bad operands")
23685}
23686
23687// VFNMADD231PS: Fused Negative Multiply-Add of Packed Single-Precision Floating-Point Values.
23688//
23689// Forms:
23690//
23691// 	VFNMADD231PS xmm  xmm xmm
23692// 	VFNMADD231PS m128 xmm xmm
23693// 	VFNMADD231PS ymm  ymm ymm
23694// 	VFNMADD231PS m256 ymm ymm
23695func VFNMADD231PS(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
23696	switch {
23697	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
23698		return &intrep.Instruction{
23699			Opcode:   "VFNMADD231PS",
23700			Operands: []operand.Op{mxy, xy, xy1},
23701			Inputs:   []operand.Op{mxy, xy, xy1},
23702			Outputs:  []operand.Op{xy1},
23703			ISA:      []string{"FMA3"},
23704		}, nil
23705	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
23706		return &intrep.Instruction{
23707			Opcode:   "VFNMADD231PS",
23708			Operands: []operand.Op{mxy, xy, xy1},
23709			Inputs:   []operand.Op{mxy, xy, xy1},
23710			Outputs:  []operand.Op{xy1},
23711			ISA:      []string{"FMA3"},
23712		}, nil
23713	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
23714		return &intrep.Instruction{
23715			Opcode:   "VFNMADD231PS",
23716			Operands: []operand.Op{mxy, xy, xy1},
23717			Inputs:   []operand.Op{mxy, xy, xy1},
23718			Outputs:  []operand.Op{xy1},
23719			ISA:      []string{"FMA3"},
23720		}, nil
23721	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
23722		return &intrep.Instruction{
23723			Opcode:   "VFNMADD231PS",
23724			Operands: []operand.Op{mxy, xy, xy1},
23725			Inputs:   []operand.Op{mxy, xy, xy1},
23726			Outputs:  []operand.Op{xy1},
23727			ISA:      []string{"FMA3"},
23728		}, nil
23729	}
23730	return nil, errors.New("VFNMADD231PS: bad operands")
23731}
23732
23733// VFNMADD231SD: Fused Negative Multiply-Add of Scalar Double-Precision Floating-Point Values.
23734//
23735// Forms:
23736//
23737// 	VFNMADD231SD xmm xmm xmm
23738// 	VFNMADD231SD m64 xmm xmm
23739func VFNMADD231SD(mx, x, x1 operand.Op) (*intrep.Instruction, error) {
23740	switch {
23741	case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
23742		return &intrep.Instruction{
23743			Opcode:   "VFNMADD231SD",
23744			Operands: []operand.Op{mx, x, x1},
23745			Inputs:   []operand.Op{mx, x, x1},
23746			Outputs:  []operand.Op{x1},
23747			ISA:      []string{"FMA3"},
23748		}, nil
23749	case operand.IsM64(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
23750		return &intrep.Instruction{
23751			Opcode:   "VFNMADD231SD",
23752			Operands: []operand.Op{mx, x, x1},
23753			Inputs:   []operand.Op{mx, x, x1},
23754			Outputs:  []operand.Op{x1},
23755			ISA:      []string{"FMA3"},
23756		}, nil
23757	}
23758	return nil, errors.New("VFNMADD231SD: bad operands")
23759}
23760
23761// VFNMADD231SS: Fused Negative Multiply-Add of Scalar Single-Precision Floating-Point Values.
23762//
23763// Forms:
23764//
23765// 	VFNMADD231SS xmm xmm xmm
23766// 	VFNMADD231SS m32 xmm xmm
23767func VFNMADD231SS(mx, x, x1 operand.Op) (*intrep.Instruction, error) {
23768	switch {
23769	case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
23770		return &intrep.Instruction{
23771			Opcode:   "VFNMADD231SS",
23772			Operands: []operand.Op{mx, x, x1},
23773			Inputs:   []operand.Op{mx, x, x1},
23774			Outputs:  []operand.Op{x1},
23775			ISA:      []string{"FMA3"},
23776		}, nil
23777	case operand.IsM32(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
23778		return &intrep.Instruction{
23779			Opcode:   "VFNMADD231SS",
23780			Operands: []operand.Op{mx, x, x1},
23781			Inputs:   []operand.Op{mx, x, x1},
23782			Outputs:  []operand.Op{x1},
23783			ISA:      []string{"FMA3"},
23784		}, nil
23785	}
23786	return nil, errors.New("VFNMADD231SS: bad operands")
23787}
23788
23789// VFNMSUB132PD: Fused Negative Multiply-Subtract of Packed Double-Precision Floating-Point Values.
23790//
23791// Forms:
23792//
23793// 	VFNMSUB132PD xmm  xmm xmm
23794// 	VFNMSUB132PD m128 xmm xmm
23795// 	VFNMSUB132PD ymm  ymm ymm
23796// 	VFNMSUB132PD m256 ymm ymm
23797func VFNMSUB132PD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
23798	switch {
23799	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
23800		return &intrep.Instruction{
23801			Opcode:   "VFNMSUB132PD",
23802			Operands: []operand.Op{mxy, xy, xy1},
23803			Inputs:   []operand.Op{mxy, xy, xy1},
23804			Outputs:  []operand.Op{xy1},
23805			ISA:      []string{"FMA3"},
23806		}, nil
23807	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
23808		return &intrep.Instruction{
23809			Opcode:   "VFNMSUB132PD",
23810			Operands: []operand.Op{mxy, xy, xy1},
23811			Inputs:   []operand.Op{mxy, xy, xy1},
23812			Outputs:  []operand.Op{xy1},
23813			ISA:      []string{"FMA3"},
23814		}, nil
23815	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
23816		return &intrep.Instruction{
23817			Opcode:   "VFNMSUB132PD",
23818			Operands: []operand.Op{mxy, xy, xy1},
23819			Inputs:   []operand.Op{mxy, xy, xy1},
23820			Outputs:  []operand.Op{xy1},
23821			ISA:      []string{"FMA3"},
23822		}, nil
23823	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
23824		return &intrep.Instruction{
23825			Opcode:   "VFNMSUB132PD",
23826			Operands: []operand.Op{mxy, xy, xy1},
23827			Inputs:   []operand.Op{mxy, xy, xy1},
23828			Outputs:  []operand.Op{xy1},
23829			ISA:      []string{"FMA3"},
23830		}, nil
23831	}
23832	return nil, errors.New("VFNMSUB132PD: bad operands")
23833}
23834
23835// VFNMSUB132PS: Fused Negative Multiply-Subtract of Packed Single-Precision Floating-Point Values.
23836//
23837// Forms:
23838//
23839// 	VFNMSUB132PS xmm  xmm xmm
23840// 	VFNMSUB132PS m128 xmm xmm
23841// 	VFNMSUB132PS ymm  ymm ymm
23842// 	VFNMSUB132PS m256 ymm ymm
23843func VFNMSUB132PS(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
23844	switch {
23845	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
23846		return &intrep.Instruction{
23847			Opcode:   "VFNMSUB132PS",
23848			Operands: []operand.Op{mxy, xy, xy1},
23849			Inputs:   []operand.Op{mxy, xy, xy1},
23850			Outputs:  []operand.Op{xy1},
23851			ISA:      []string{"FMA3"},
23852		}, nil
23853	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
23854		return &intrep.Instruction{
23855			Opcode:   "VFNMSUB132PS",
23856			Operands: []operand.Op{mxy, xy, xy1},
23857			Inputs:   []operand.Op{mxy, xy, xy1},
23858			Outputs:  []operand.Op{xy1},
23859			ISA:      []string{"FMA3"},
23860		}, nil
23861	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
23862		return &intrep.Instruction{
23863			Opcode:   "VFNMSUB132PS",
23864			Operands: []operand.Op{mxy, xy, xy1},
23865			Inputs:   []operand.Op{mxy, xy, xy1},
23866			Outputs:  []operand.Op{xy1},
23867			ISA:      []string{"FMA3"},
23868		}, nil
23869	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
23870		return &intrep.Instruction{
23871			Opcode:   "VFNMSUB132PS",
23872			Operands: []operand.Op{mxy, xy, xy1},
23873			Inputs:   []operand.Op{mxy, xy, xy1},
23874			Outputs:  []operand.Op{xy1},
23875			ISA:      []string{"FMA3"},
23876		}, nil
23877	}
23878	return nil, errors.New("VFNMSUB132PS: bad operands")
23879}
23880
23881// VFNMSUB132SD: Fused Negative Multiply-Subtract of Scalar Double-Precision Floating-Point Values.
23882//
23883// Forms:
23884//
23885// 	VFNMSUB132SD xmm xmm xmm
23886// 	VFNMSUB132SD m64 xmm xmm
23887func VFNMSUB132SD(mx, x, x1 operand.Op) (*intrep.Instruction, error) {
23888	switch {
23889	case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
23890		return &intrep.Instruction{
23891			Opcode:   "VFNMSUB132SD",
23892			Operands: []operand.Op{mx, x, x1},
23893			Inputs:   []operand.Op{mx, x, x1},
23894			Outputs:  []operand.Op{x1},
23895			ISA:      []string{"FMA3"},
23896		}, nil
23897	case operand.IsM64(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
23898		return &intrep.Instruction{
23899			Opcode:   "VFNMSUB132SD",
23900			Operands: []operand.Op{mx, x, x1},
23901			Inputs:   []operand.Op{mx, x, x1},
23902			Outputs:  []operand.Op{x1},
23903			ISA:      []string{"FMA3"},
23904		}, nil
23905	}
23906	return nil, errors.New("VFNMSUB132SD: bad operands")
23907}
23908
23909// VFNMSUB132SS: Fused Negative Multiply-Subtract of Scalar Single-Precision Floating-Point Values.
23910//
23911// Forms:
23912//
23913// 	VFNMSUB132SS xmm xmm xmm
23914// 	VFNMSUB132SS m32 xmm xmm
23915func VFNMSUB132SS(mx, x, x1 operand.Op) (*intrep.Instruction, error) {
23916	switch {
23917	case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
23918		return &intrep.Instruction{
23919			Opcode:   "VFNMSUB132SS",
23920			Operands: []operand.Op{mx, x, x1},
23921			Inputs:   []operand.Op{mx, x, x1},
23922			Outputs:  []operand.Op{x1},
23923			ISA:      []string{"FMA3"},
23924		}, nil
23925	case operand.IsM32(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
23926		return &intrep.Instruction{
23927			Opcode:   "VFNMSUB132SS",
23928			Operands: []operand.Op{mx, x, x1},
23929			Inputs:   []operand.Op{mx, x, x1},
23930			Outputs:  []operand.Op{x1},
23931			ISA:      []string{"FMA3"},
23932		}, nil
23933	}
23934	return nil, errors.New("VFNMSUB132SS: bad operands")
23935}
23936
23937// VFNMSUB213PD: Fused Negative Multiply-Subtract of Packed Double-Precision Floating-Point Values.
23938//
23939// Forms:
23940//
23941// 	VFNMSUB213PD xmm  xmm xmm
23942// 	VFNMSUB213PD m128 xmm xmm
23943// 	VFNMSUB213PD ymm  ymm ymm
23944// 	VFNMSUB213PD m256 ymm ymm
23945func VFNMSUB213PD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
23946	switch {
23947	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
23948		return &intrep.Instruction{
23949			Opcode:   "VFNMSUB213PD",
23950			Operands: []operand.Op{mxy, xy, xy1},
23951			Inputs:   []operand.Op{mxy, xy, xy1},
23952			Outputs:  []operand.Op{xy1},
23953			ISA:      []string{"FMA3"},
23954		}, nil
23955	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
23956		return &intrep.Instruction{
23957			Opcode:   "VFNMSUB213PD",
23958			Operands: []operand.Op{mxy, xy, xy1},
23959			Inputs:   []operand.Op{mxy, xy, xy1},
23960			Outputs:  []operand.Op{xy1},
23961			ISA:      []string{"FMA3"},
23962		}, nil
23963	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
23964		return &intrep.Instruction{
23965			Opcode:   "VFNMSUB213PD",
23966			Operands: []operand.Op{mxy, xy, xy1},
23967			Inputs:   []operand.Op{mxy, xy, xy1},
23968			Outputs:  []operand.Op{xy1},
23969			ISA:      []string{"FMA3"},
23970		}, nil
23971	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
23972		return &intrep.Instruction{
23973			Opcode:   "VFNMSUB213PD",
23974			Operands: []operand.Op{mxy, xy, xy1},
23975			Inputs:   []operand.Op{mxy, xy, xy1},
23976			Outputs:  []operand.Op{xy1},
23977			ISA:      []string{"FMA3"},
23978		}, nil
23979	}
23980	return nil, errors.New("VFNMSUB213PD: bad operands")
23981}
23982
23983// VFNMSUB213PS: Fused Negative Multiply-Subtract of Packed Single-Precision Floating-Point Values.
23984//
23985// Forms:
23986//
23987// 	VFNMSUB213PS xmm  xmm xmm
23988// 	VFNMSUB213PS m128 xmm xmm
23989// 	VFNMSUB213PS ymm  ymm ymm
23990// 	VFNMSUB213PS m256 ymm ymm
23991func VFNMSUB213PS(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
23992	switch {
23993	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
23994		return &intrep.Instruction{
23995			Opcode:   "VFNMSUB213PS",
23996			Operands: []operand.Op{mxy, xy, xy1},
23997			Inputs:   []operand.Op{mxy, xy, xy1},
23998			Outputs:  []operand.Op{xy1},
23999			ISA:      []string{"FMA3"},
24000		}, nil
24001	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
24002		return &intrep.Instruction{
24003			Opcode:   "VFNMSUB213PS",
24004			Operands: []operand.Op{mxy, xy, xy1},
24005			Inputs:   []operand.Op{mxy, xy, xy1},
24006			Outputs:  []operand.Op{xy1},
24007			ISA:      []string{"FMA3"},
24008		}, nil
24009	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
24010		return &intrep.Instruction{
24011			Opcode:   "VFNMSUB213PS",
24012			Operands: []operand.Op{mxy, xy, xy1},
24013			Inputs:   []operand.Op{mxy, xy, xy1},
24014			Outputs:  []operand.Op{xy1},
24015			ISA:      []string{"FMA3"},
24016		}, nil
24017	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
24018		return &intrep.Instruction{
24019			Opcode:   "VFNMSUB213PS",
24020			Operands: []operand.Op{mxy, xy, xy1},
24021			Inputs:   []operand.Op{mxy, xy, xy1},
24022			Outputs:  []operand.Op{xy1},
24023			ISA:      []string{"FMA3"},
24024		}, nil
24025	}
24026	return nil, errors.New("VFNMSUB213PS: bad operands")
24027}
24028
24029// VFNMSUB213SD: Fused Negative Multiply-Subtract of Scalar Double-Precision Floating-Point Values.
24030//
24031// Forms:
24032//
24033// 	VFNMSUB213SD xmm xmm xmm
24034// 	VFNMSUB213SD m64 xmm xmm
24035func VFNMSUB213SD(mx, x, x1 operand.Op) (*intrep.Instruction, error) {
24036	switch {
24037	case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
24038		return &intrep.Instruction{
24039			Opcode:   "VFNMSUB213SD",
24040			Operands: []operand.Op{mx, x, x1},
24041			Inputs:   []operand.Op{mx, x, x1},
24042			Outputs:  []operand.Op{x1},
24043			ISA:      []string{"FMA3"},
24044		}, nil
24045	case operand.IsM64(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
24046		return &intrep.Instruction{
24047			Opcode:   "VFNMSUB213SD",
24048			Operands: []operand.Op{mx, x, x1},
24049			Inputs:   []operand.Op{mx, x, x1},
24050			Outputs:  []operand.Op{x1},
24051			ISA:      []string{"FMA3"},
24052		}, nil
24053	}
24054	return nil, errors.New("VFNMSUB213SD: bad operands")
24055}
24056
24057// VFNMSUB213SS: Fused Negative Multiply-Subtract of Scalar Single-Precision Floating-Point Values.
24058//
24059// Forms:
24060//
24061// 	VFNMSUB213SS xmm xmm xmm
24062// 	VFNMSUB213SS m32 xmm xmm
24063func VFNMSUB213SS(mx, x, x1 operand.Op) (*intrep.Instruction, error) {
24064	switch {
24065	case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
24066		return &intrep.Instruction{
24067			Opcode:   "VFNMSUB213SS",
24068			Operands: []operand.Op{mx, x, x1},
24069			Inputs:   []operand.Op{mx, x, x1},
24070			Outputs:  []operand.Op{x1},
24071			ISA:      []string{"FMA3"},
24072		}, nil
24073	case operand.IsM32(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
24074		return &intrep.Instruction{
24075			Opcode:   "VFNMSUB213SS",
24076			Operands: []operand.Op{mx, x, x1},
24077			Inputs:   []operand.Op{mx, x, x1},
24078			Outputs:  []operand.Op{x1},
24079			ISA:      []string{"FMA3"},
24080		}, nil
24081	}
24082	return nil, errors.New("VFNMSUB213SS: bad operands")
24083}
24084
24085// VFNMSUB231PD: Fused Negative Multiply-Subtract of Packed Double-Precision Floating-Point Values.
24086//
24087// Forms:
24088//
24089// 	VFNMSUB231PD xmm  xmm xmm
24090// 	VFNMSUB231PD m128 xmm xmm
24091// 	VFNMSUB231PD ymm  ymm ymm
24092// 	VFNMSUB231PD m256 ymm ymm
24093func VFNMSUB231PD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
24094	switch {
24095	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
24096		return &intrep.Instruction{
24097			Opcode:   "VFNMSUB231PD",
24098			Operands: []operand.Op{mxy, xy, xy1},
24099			Inputs:   []operand.Op{mxy, xy, xy1},
24100			Outputs:  []operand.Op{xy1},
24101			ISA:      []string{"FMA3"},
24102		}, nil
24103	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
24104		return &intrep.Instruction{
24105			Opcode:   "VFNMSUB231PD",
24106			Operands: []operand.Op{mxy, xy, xy1},
24107			Inputs:   []operand.Op{mxy, xy, xy1},
24108			Outputs:  []operand.Op{xy1},
24109			ISA:      []string{"FMA3"},
24110		}, nil
24111	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
24112		return &intrep.Instruction{
24113			Opcode:   "VFNMSUB231PD",
24114			Operands: []operand.Op{mxy, xy, xy1},
24115			Inputs:   []operand.Op{mxy, xy, xy1},
24116			Outputs:  []operand.Op{xy1},
24117			ISA:      []string{"FMA3"},
24118		}, nil
24119	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
24120		return &intrep.Instruction{
24121			Opcode:   "VFNMSUB231PD",
24122			Operands: []operand.Op{mxy, xy, xy1},
24123			Inputs:   []operand.Op{mxy, xy, xy1},
24124			Outputs:  []operand.Op{xy1},
24125			ISA:      []string{"FMA3"},
24126		}, nil
24127	}
24128	return nil, errors.New("VFNMSUB231PD: bad operands")
24129}
24130
24131// VFNMSUB231PS: Fused Negative Multiply-Subtract of Packed Single-Precision Floating-Point Values.
24132//
24133// Forms:
24134//
24135// 	VFNMSUB231PS xmm  xmm xmm
24136// 	VFNMSUB231PS m128 xmm xmm
24137// 	VFNMSUB231PS ymm  ymm ymm
24138// 	VFNMSUB231PS m256 ymm ymm
24139func VFNMSUB231PS(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
24140	switch {
24141	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
24142		return &intrep.Instruction{
24143			Opcode:   "VFNMSUB231PS",
24144			Operands: []operand.Op{mxy, xy, xy1},
24145			Inputs:   []operand.Op{mxy, xy, xy1},
24146			Outputs:  []operand.Op{xy1},
24147			ISA:      []string{"FMA3"},
24148		}, nil
24149	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
24150		return &intrep.Instruction{
24151			Opcode:   "VFNMSUB231PS",
24152			Operands: []operand.Op{mxy, xy, xy1},
24153			Inputs:   []operand.Op{mxy, xy, xy1},
24154			Outputs:  []operand.Op{xy1},
24155			ISA:      []string{"FMA3"},
24156		}, nil
24157	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
24158		return &intrep.Instruction{
24159			Opcode:   "VFNMSUB231PS",
24160			Operands: []operand.Op{mxy, xy, xy1},
24161			Inputs:   []operand.Op{mxy, xy, xy1},
24162			Outputs:  []operand.Op{xy1},
24163			ISA:      []string{"FMA3"},
24164		}, nil
24165	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
24166		return &intrep.Instruction{
24167			Opcode:   "VFNMSUB231PS",
24168			Operands: []operand.Op{mxy, xy, xy1},
24169			Inputs:   []operand.Op{mxy, xy, xy1},
24170			Outputs:  []operand.Op{xy1},
24171			ISA:      []string{"FMA3"},
24172		}, nil
24173	}
24174	return nil, errors.New("VFNMSUB231PS: bad operands")
24175}
24176
24177// VFNMSUB231SD: Fused Negative Multiply-Subtract of Scalar Double-Precision Floating-Point Values.
24178//
24179// Forms:
24180//
24181// 	VFNMSUB231SD xmm xmm xmm
24182// 	VFNMSUB231SD m64 xmm xmm
24183func VFNMSUB231SD(mx, x, x1 operand.Op) (*intrep.Instruction, error) {
24184	switch {
24185	case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
24186		return &intrep.Instruction{
24187			Opcode:   "VFNMSUB231SD",
24188			Operands: []operand.Op{mx, x, x1},
24189			Inputs:   []operand.Op{mx, x, x1},
24190			Outputs:  []operand.Op{x1},
24191			ISA:      []string{"FMA3"},
24192		}, nil
24193	case operand.IsM64(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
24194		return &intrep.Instruction{
24195			Opcode:   "VFNMSUB231SD",
24196			Operands: []operand.Op{mx, x, x1},
24197			Inputs:   []operand.Op{mx, x, x1},
24198			Outputs:  []operand.Op{x1},
24199			ISA:      []string{"FMA3"},
24200		}, nil
24201	}
24202	return nil, errors.New("VFNMSUB231SD: bad operands")
24203}
24204
24205// VFNMSUB231SS: Fused Negative Multiply-Subtract of Scalar Single-Precision Floating-Point Values.
24206//
24207// Forms:
24208//
24209// 	VFNMSUB231SS xmm xmm xmm
24210// 	VFNMSUB231SS m32 xmm xmm
24211func VFNMSUB231SS(mx, x, x1 operand.Op) (*intrep.Instruction, error) {
24212	switch {
24213	case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
24214		return &intrep.Instruction{
24215			Opcode:   "VFNMSUB231SS",
24216			Operands: []operand.Op{mx, x, x1},
24217			Inputs:   []operand.Op{mx, x, x1},
24218			Outputs:  []operand.Op{x1},
24219			ISA:      []string{"FMA3"},
24220		}, nil
24221	case operand.IsM32(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
24222		return &intrep.Instruction{
24223			Opcode:   "VFNMSUB231SS",
24224			Operands: []operand.Op{mx, x, x1},
24225			Inputs:   []operand.Op{mx, x, x1},
24226			Outputs:  []operand.Op{x1},
24227			ISA:      []string{"FMA3"},
24228		}, nil
24229	}
24230	return nil, errors.New("VFNMSUB231SS: bad operands")
24231}
24232
24233// VGATHERDPD: Gather Packed Double-Precision Floating-Point Values Using Signed Doubleword Indices.
24234//
24235// Forms:
24236//
24237// 	VGATHERDPD xmm vm32x xmm
24238// 	VGATHERDPD ymm vm32x ymm
24239func VGATHERDPD(xy, v, xy1 operand.Op) (*intrep.Instruction, error) {
24240	switch {
24241	case operand.IsXMM(xy) && operand.IsVM32X(v) && operand.IsXMM(xy1):
24242		return &intrep.Instruction{
24243			Opcode:   "VGATHERDPD",
24244			Operands: []operand.Op{xy, v, xy1},
24245			Inputs:   []operand.Op{xy, v, xy1},
24246			Outputs:  []operand.Op{xy, xy1},
24247			ISA:      []string{"AVX2"},
24248		}, nil
24249	case operand.IsYMM(xy) && operand.IsVM32X(v) && operand.IsYMM(xy1):
24250		return &intrep.Instruction{
24251			Opcode:   "VGATHERDPD",
24252			Operands: []operand.Op{xy, v, xy1},
24253			Inputs:   []operand.Op{xy, v, xy1},
24254			Outputs:  []operand.Op{xy, xy1},
24255			ISA:      []string{"AVX2"},
24256		}, nil
24257	}
24258	return nil, errors.New("VGATHERDPD: bad operands")
24259}
24260
24261// VGATHERDPS: Gather Packed Single-Precision Floating-Point Values Using Signed Doubleword Indices.
24262//
24263// Forms:
24264//
24265// 	VGATHERDPS xmm vm32x xmm
24266// 	VGATHERDPS ymm vm32y ymm
24267func VGATHERDPS(xy, v, xy1 operand.Op) (*intrep.Instruction, error) {
24268	switch {
24269	case operand.IsXMM(xy) && operand.IsVM32X(v) && operand.IsXMM(xy1):
24270		return &intrep.Instruction{
24271			Opcode:   "VGATHERDPS",
24272			Operands: []operand.Op{xy, v, xy1},
24273			Inputs:   []operand.Op{xy, v, xy1},
24274			Outputs:  []operand.Op{xy, xy1},
24275			ISA:      []string{"AVX2"},
24276		}, nil
24277	case operand.IsYMM(xy) && operand.IsVM32Y(v) && operand.IsYMM(xy1):
24278		return &intrep.Instruction{
24279			Opcode:   "VGATHERDPS",
24280			Operands: []operand.Op{xy, v, xy1},
24281			Inputs:   []operand.Op{xy, v, xy1},
24282			Outputs:  []operand.Op{xy, xy1},
24283			ISA:      []string{"AVX2"},
24284		}, nil
24285	}
24286	return nil, errors.New("VGATHERDPS: bad operands")
24287}
24288
24289// VGATHERQPD: Gather Packed Double-Precision Floating-Point Values Using Signed Quadword Indices.
24290//
24291// Forms:
24292//
24293// 	VGATHERQPD xmm vm64x xmm
24294// 	VGATHERQPD ymm vm64y ymm
24295func VGATHERQPD(xy, v, xy1 operand.Op) (*intrep.Instruction, error) {
24296	switch {
24297	case operand.IsXMM(xy) && operand.IsVM64X(v) && operand.IsXMM(xy1):
24298		return &intrep.Instruction{
24299			Opcode:   "VGATHERQPD",
24300			Operands: []operand.Op{xy, v, xy1},
24301			Inputs:   []operand.Op{xy, v, xy1},
24302			Outputs:  []operand.Op{xy, xy1},
24303			ISA:      []string{"AVX2"},
24304		}, nil
24305	case operand.IsYMM(xy) && operand.IsVM64Y(v) && operand.IsYMM(xy1):
24306		return &intrep.Instruction{
24307			Opcode:   "VGATHERQPD",
24308			Operands: []operand.Op{xy, v, xy1},
24309			Inputs:   []operand.Op{xy, v, xy1},
24310			Outputs:  []operand.Op{xy, xy1},
24311			ISA:      []string{"AVX2"},
24312		}, nil
24313	}
24314	return nil, errors.New("VGATHERQPD: bad operands")
24315}
24316
24317// VGATHERQPS: Gather Packed Single-Precision Floating-Point Values Using Signed Quadword Indices.
24318//
24319// Forms:
24320//
24321// 	VGATHERQPS xmm vm64x xmm
24322// 	VGATHERQPS xmm vm64y xmm
24323func VGATHERQPS(x, v, x1 operand.Op) (*intrep.Instruction, error) {
24324	switch {
24325	case operand.IsXMM(x) && operand.IsVM64X(v) && operand.IsXMM(x1):
24326		return &intrep.Instruction{
24327			Opcode:   "VGATHERQPS",
24328			Operands: []operand.Op{x, v, x1},
24329			Inputs:   []operand.Op{x, v, x1},
24330			Outputs:  []operand.Op{x, x1},
24331			ISA:      []string{"AVX2"},
24332		}, nil
24333	case operand.IsXMM(x) && operand.IsVM64Y(v) && operand.IsXMM(x1):
24334		return &intrep.Instruction{
24335			Opcode:   "VGATHERQPS",
24336			Operands: []operand.Op{x, v, x1},
24337			Inputs:   []operand.Op{x, v, x1},
24338			Outputs:  []operand.Op{x, x1},
24339			ISA:      []string{"AVX2"},
24340		}, nil
24341	}
24342	return nil, errors.New("VGATHERQPS: bad operands")
24343}
24344
24345// VHADDPD: Packed Double-FP Horizontal Add.
24346//
24347// Forms:
24348//
24349// 	VHADDPD xmm  xmm xmm
24350// 	VHADDPD m128 xmm xmm
24351// 	VHADDPD ymm  ymm ymm
24352// 	VHADDPD m256 ymm ymm
24353func VHADDPD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
24354	switch {
24355	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
24356		return &intrep.Instruction{
24357			Opcode:   "VHADDPD",
24358			Operands: []operand.Op{mxy, xy, xy1},
24359			Inputs:   []operand.Op{mxy, xy},
24360			Outputs:  []operand.Op{xy1},
24361			ISA:      []string{"AVX"},
24362		}, nil
24363	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
24364		return &intrep.Instruction{
24365			Opcode:   "VHADDPD",
24366			Operands: []operand.Op{mxy, xy, xy1},
24367			Inputs:   []operand.Op{mxy, xy},
24368			Outputs:  []operand.Op{xy1},
24369			ISA:      []string{"AVX"},
24370		}, nil
24371	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
24372		return &intrep.Instruction{
24373			Opcode:   "VHADDPD",
24374			Operands: []operand.Op{mxy, xy, xy1},
24375			Inputs:   []operand.Op{mxy, xy},
24376			Outputs:  []operand.Op{xy1},
24377			ISA:      []string{"AVX"},
24378		}, nil
24379	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
24380		return &intrep.Instruction{
24381			Opcode:   "VHADDPD",
24382			Operands: []operand.Op{mxy, xy, xy1},
24383			Inputs:   []operand.Op{mxy, xy},
24384			Outputs:  []operand.Op{xy1},
24385			ISA:      []string{"AVX"},
24386		}, nil
24387	}
24388	return nil, errors.New("VHADDPD: bad operands")
24389}
24390
24391// VHADDPS: Packed Single-FP Horizontal Add.
24392//
24393// Forms:
24394//
24395// 	VHADDPS xmm  xmm xmm
24396// 	VHADDPS m128 xmm xmm
24397// 	VHADDPS ymm  ymm ymm
24398// 	VHADDPS m256 ymm ymm
24399func VHADDPS(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
24400	switch {
24401	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
24402		return &intrep.Instruction{
24403			Opcode:   "VHADDPS",
24404			Operands: []operand.Op{mxy, xy, xy1},
24405			Inputs:   []operand.Op{mxy, xy},
24406			Outputs:  []operand.Op{xy1},
24407			ISA:      []string{"AVX"},
24408		}, nil
24409	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
24410		return &intrep.Instruction{
24411			Opcode:   "VHADDPS",
24412			Operands: []operand.Op{mxy, xy, xy1},
24413			Inputs:   []operand.Op{mxy, xy},
24414			Outputs:  []operand.Op{xy1},
24415			ISA:      []string{"AVX"},
24416		}, nil
24417	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
24418		return &intrep.Instruction{
24419			Opcode:   "VHADDPS",
24420			Operands: []operand.Op{mxy, xy, xy1},
24421			Inputs:   []operand.Op{mxy, xy},
24422			Outputs:  []operand.Op{xy1},
24423			ISA:      []string{"AVX"},
24424		}, nil
24425	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
24426		return &intrep.Instruction{
24427			Opcode:   "VHADDPS",
24428			Operands: []operand.Op{mxy, xy, xy1},
24429			Inputs:   []operand.Op{mxy, xy},
24430			Outputs:  []operand.Op{xy1},
24431			ISA:      []string{"AVX"},
24432		}, nil
24433	}
24434	return nil, errors.New("VHADDPS: bad operands")
24435}
24436
24437// VHSUBPD: Packed Double-FP Horizontal Subtract.
24438//
24439// Forms:
24440//
24441// 	VHSUBPD xmm  xmm xmm
24442// 	VHSUBPD m128 xmm xmm
24443// 	VHSUBPD ymm  ymm ymm
24444// 	VHSUBPD m256 ymm ymm
24445func VHSUBPD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
24446	switch {
24447	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
24448		return &intrep.Instruction{
24449			Opcode:   "VHSUBPD",
24450			Operands: []operand.Op{mxy, xy, xy1},
24451			Inputs:   []operand.Op{mxy, xy},
24452			Outputs:  []operand.Op{xy1},
24453			ISA:      []string{"AVX"},
24454		}, nil
24455	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
24456		return &intrep.Instruction{
24457			Opcode:   "VHSUBPD",
24458			Operands: []operand.Op{mxy, xy, xy1},
24459			Inputs:   []operand.Op{mxy, xy},
24460			Outputs:  []operand.Op{xy1},
24461			ISA:      []string{"AVX"},
24462		}, nil
24463	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
24464		return &intrep.Instruction{
24465			Opcode:   "VHSUBPD",
24466			Operands: []operand.Op{mxy, xy, xy1},
24467			Inputs:   []operand.Op{mxy, xy},
24468			Outputs:  []operand.Op{xy1},
24469			ISA:      []string{"AVX"},
24470		}, nil
24471	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
24472		return &intrep.Instruction{
24473			Opcode:   "VHSUBPD",
24474			Operands: []operand.Op{mxy, xy, xy1},
24475			Inputs:   []operand.Op{mxy, xy},
24476			Outputs:  []operand.Op{xy1},
24477			ISA:      []string{"AVX"},
24478		}, nil
24479	}
24480	return nil, errors.New("VHSUBPD: bad operands")
24481}
24482
24483// VHSUBPS: Packed Single-FP Horizontal Subtract.
24484//
24485// Forms:
24486//
24487// 	VHSUBPS xmm  xmm xmm
24488// 	VHSUBPS m128 xmm xmm
24489// 	VHSUBPS ymm  ymm ymm
24490// 	VHSUBPS m256 ymm ymm
24491func VHSUBPS(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
24492	switch {
24493	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
24494		return &intrep.Instruction{
24495			Opcode:   "VHSUBPS",
24496			Operands: []operand.Op{mxy, xy, xy1},
24497			Inputs:   []operand.Op{mxy, xy},
24498			Outputs:  []operand.Op{xy1},
24499			ISA:      []string{"AVX"},
24500		}, nil
24501	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
24502		return &intrep.Instruction{
24503			Opcode:   "VHSUBPS",
24504			Operands: []operand.Op{mxy, xy, xy1},
24505			Inputs:   []operand.Op{mxy, xy},
24506			Outputs:  []operand.Op{xy1},
24507			ISA:      []string{"AVX"},
24508		}, nil
24509	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
24510		return &intrep.Instruction{
24511			Opcode:   "VHSUBPS",
24512			Operands: []operand.Op{mxy, xy, xy1},
24513			Inputs:   []operand.Op{mxy, xy},
24514			Outputs:  []operand.Op{xy1},
24515			ISA:      []string{"AVX"},
24516		}, nil
24517	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
24518		return &intrep.Instruction{
24519			Opcode:   "VHSUBPS",
24520			Operands: []operand.Op{mxy, xy, xy1},
24521			Inputs:   []operand.Op{mxy, xy},
24522			Outputs:  []operand.Op{xy1},
24523			ISA:      []string{"AVX"},
24524		}, nil
24525	}
24526	return nil, errors.New("VHSUBPS: bad operands")
24527}
24528
24529// VINSERTF128: Insert Packed Floating-Point Values.
24530//
24531// Forms:
24532//
24533// 	VINSERTF128 imm8 xmm  ymm ymm
24534// 	VINSERTF128 imm8 m128 ymm ymm
24535func VINSERTF128(i, mx, y, y1 operand.Op) (*intrep.Instruction, error) {
24536	switch {
24537	case operand.IsIMM8(i) && operand.IsXMM(mx) && operand.IsYMM(y) && operand.IsYMM(y1):
24538		return &intrep.Instruction{
24539			Opcode:   "VINSERTF128",
24540			Operands: []operand.Op{i, mx, y, y1},
24541			Inputs:   []operand.Op{mx, y},
24542			Outputs:  []operand.Op{y1},
24543			ISA:      []string{"AVX"},
24544		}, nil
24545	case operand.IsIMM8(i) && operand.IsM128(mx) && operand.IsYMM(y) && operand.IsYMM(y1):
24546		return &intrep.Instruction{
24547			Opcode:   "VINSERTF128",
24548			Operands: []operand.Op{i, mx, y, y1},
24549			Inputs:   []operand.Op{mx, y},
24550			Outputs:  []operand.Op{y1},
24551			ISA:      []string{"AVX"},
24552		}, nil
24553	}
24554	return nil, errors.New("VINSERTF128: bad operands")
24555}
24556
24557// VINSERTI128: Insert Packed Integer Values.
24558//
24559// Forms:
24560//
24561// 	VINSERTI128 imm8 xmm  ymm ymm
24562// 	VINSERTI128 imm8 m128 ymm ymm
24563func VINSERTI128(i, mx, y, y1 operand.Op) (*intrep.Instruction, error) {
24564	switch {
24565	case operand.IsIMM8(i) && operand.IsXMM(mx) && operand.IsYMM(y) && operand.IsYMM(y1):
24566		return &intrep.Instruction{
24567			Opcode:   "VINSERTI128",
24568			Operands: []operand.Op{i, mx, y, y1},
24569			Inputs:   []operand.Op{mx, y},
24570			Outputs:  []operand.Op{y1},
24571			ISA:      []string{"AVX2"},
24572		}, nil
24573	case operand.IsIMM8(i) && operand.IsM128(mx) && operand.IsYMM(y) && operand.IsYMM(y1):
24574		return &intrep.Instruction{
24575			Opcode:   "VINSERTI128",
24576			Operands: []operand.Op{i, mx, y, y1},
24577			Inputs:   []operand.Op{mx, y},
24578			Outputs:  []operand.Op{y1},
24579			ISA:      []string{"AVX2"},
24580		}, nil
24581	}
24582	return nil, errors.New("VINSERTI128: bad operands")
24583}
24584
24585// VINSERTPS: Insert Packed Single Precision Floating-Point Value.
24586//
24587// Forms:
24588//
24589// 	VINSERTPS imm8 xmm xmm xmm
24590// 	VINSERTPS imm8 m32 xmm xmm
24591func VINSERTPS(i, mx, x, x1 operand.Op) (*intrep.Instruction, error) {
24592	switch {
24593	case operand.IsIMM8(i) && operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
24594		return &intrep.Instruction{
24595			Opcode:   "VINSERTPS",
24596			Operands: []operand.Op{i, mx, x, x1},
24597			Inputs:   []operand.Op{mx, x},
24598			Outputs:  []operand.Op{x1},
24599			ISA:      []string{"AVX"},
24600		}, nil
24601	case operand.IsIMM8(i) && operand.IsM32(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
24602		return &intrep.Instruction{
24603			Opcode:   "VINSERTPS",
24604			Operands: []operand.Op{i, mx, x, x1},
24605			Inputs:   []operand.Op{mx, x},
24606			Outputs:  []operand.Op{x1},
24607			ISA:      []string{"AVX"},
24608		}, nil
24609	}
24610	return nil, errors.New("VINSERTPS: bad operands")
24611}
24612
24613// VLDDQU: Load Unaligned Integer 128 Bits.
24614//
24615// Forms:
24616//
24617// 	VLDDQU m128 xmm
24618// 	VLDDQU m256 ymm
24619func VLDDQU(m, xy operand.Op) (*intrep.Instruction, error) {
24620	switch {
24621	case operand.IsM128(m) && operand.IsXMM(xy):
24622		return &intrep.Instruction{
24623			Opcode:   "VLDDQU",
24624			Operands: []operand.Op{m, xy},
24625			Inputs:   []operand.Op{m},
24626			Outputs:  []operand.Op{xy},
24627			ISA:      []string{"AVX"},
24628		}, nil
24629	case operand.IsM256(m) && operand.IsYMM(xy):
24630		return &intrep.Instruction{
24631			Opcode:   "VLDDQU",
24632			Operands: []operand.Op{m, xy},
24633			Inputs:   []operand.Op{m},
24634			Outputs:  []operand.Op{xy},
24635			ISA:      []string{"AVX"},
24636		}, nil
24637	}
24638	return nil, errors.New("VLDDQU: bad operands")
24639}
24640
24641// VLDMXCSR: Load MXCSR Register.
24642//
24643// Forms:
24644//
24645// 	VLDMXCSR m32
24646func VLDMXCSR(m operand.Op) (*intrep.Instruction, error) {
24647	switch {
24648	case operand.IsM32(m):
24649		return &intrep.Instruction{
24650			Opcode:   "VLDMXCSR",
24651			Operands: []operand.Op{m},
24652			Inputs:   []operand.Op{m},
24653			Outputs:  []operand.Op{},
24654			ISA:      []string{"AVX"},
24655		}, nil
24656	}
24657	return nil, errors.New("VLDMXCSR: bad operands")
24658}
24659
24660// VMASKMOVDQU: Store Selected Bytes of Double Quadword.
24661//
24662// Forms:
24663//
24664// 	VMASKMOVDQU xmm xmm
24665func VMASKMOVDQU(x, x1 operand.Op) (*intrep.Instruction, error) {
24666	switch {
24667	case operand.IsXMM(x) && operand.IsXMM(x1):
24668		return &intrep.Instruction{
24669			Opcode:   "VMASKMOVDQU",
24670			Operands: []operand.Op{x, x1},
24671			Inputs:   []operand.Op{x, x1, reg.RDI},
24672			Outputs:  []operand.Op{},
24673			ISA:      []string{"AVX"},
24674		}, nil
24675	}
24676	return nil, errors.New("VMASKMOVDQU: bad operands")
24677}
24678
24679// VMASKMOVPD: Conditional Move Packed Double-Precision Floating-Point Values.
24680//
24681// Forms:
24682//
24683// 	VMASKMOVPD m128 xmm xmm
24684// 	VMASKMOVPD m256 ymm ymm
24685// 	VMASKMOVPD xmm  xmm m128
24686// 	VMASKMOVPD ymm  ymm m256
24687func VMASKMOVPD(mxy, xy, mxy1 operand.Op) (*intrep.Instruction, error) {
24688	switch {
24689	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(mxy1):
24690		return &intrep.Instruction{
24691			Opcode:   "VMASKMOVPD",
24692			Operands: []operand.Op{mxy, xy, mxy1},
24693			Inputs:   []operand.Op{mxy, xy},
24694			Outputs:  []operand.Op{mxy1},
24695			ISA:      []string{"AVX"},
24696		}, nil
24697	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(mxy1):
24698		return &intrep.Instruction{
24699			Opcode:   "VMASKMOVPD",
24700			Operands: []operand.Op{mxy, xy, mxy1},
24701			Inputs:   []operand.Op{mxy, xy},
24702			Outputs:  []operand.Op{mxy1},
24703			ISA:      []string{"AVX"},
24704		}, nil
24705	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsM128(mxy1):
24706		return &intrep.Instruction{
24707			Opcode:   "VMASKMOVPD",
24708			Operands: []operand.Op{mxy, xy, mxy1},
24709			Inputs:   []operand.Op{mxy, xy},
24710			Outputs:  []operand.Op{mxy1},
24711			ISA:      []string{"AVX"},
24712		}, nil
24713	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsM256(mxy1):
24714		return &intrep.Instruction{
24715			Opcode:   "VMASKMOVPD",
24716			Operands: []operand.Op{mxy, xy, mxy1},
24717			Inputs:   []operand.Op{mxy, xy},
24718			Outputs:  []operand.Op{mxy1},
24719			ISA:      []string{"AVX"},
24720		}, nil
24721	}
24722	return nil, errors.New("VMASKMOVPD: bad operands")
24723}
24724
24725// VMASKMOVPS: Conditional Move Packed Single-Precision Floating-Point Values.
24726//
24727// Forms:
24728//
24729// 	VMASKMOVPS m128 xmm xmm
24730// 	VMASKMOVPS m256 ymm ymm
24731// 	VMASKMOVPS xmm  xmm m128
24732// 	VMASKMOVPS ymm  ymm m256
24733func VMASKMOVPS(mxy, xy, mxy1 operand.Op) (*intrep.Instruction, error) {
24734	switch {
24735	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(mxy1):
24736		return &intrep.Instruction{
24737			Opcode:   "VMASKMOVPS",
24738			Operands: []operand.Op{mxy, xy, mxy1},
24739			Inputs:   []operand.Op{mxy, xy},
24740			Outputs:  []operand.Op{mxy1},
24741			ISA:      []string{"AVX"},
24742		}, nil
24743	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(mxy1):
24744		return &intrep.Instruction{
24745			Opcode:   "VMASKMOVPS",
24746			Operands: []operand.Op{mxy, xy, mxy1},
24747			Inputs:   []operand.Op{mxy, xy},
24748			Outputs:  []operand.Op{mxy1},
24749			ISA:      []string{"AVX"},
24750		}, nil
24751	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsM128(mxy1):
24752		return &intrep.Instruction{
24753			Opcode:   "VMASKMOVPS",
24754			Operands: []operand.Op{mxy, xy, mxy1},
24755			Inputs:   []operand.Op{mxy, xy},
24756			Outputs:  []operand.Op{mxy1},
24757			ISA:      []string{"AVX"},
24758		}, nil
24759	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsM256(mxy1):
24760		return &intrep.Instruction{
24761			Opcode:   "VMASKMOVPS",
24762			Operands: []operand.Op{mxy, xy, mxy1},
24763			Inputs:   []operand.Op{mxy, xy},
24764			Outputs:  []operand.Op{mxy1},
24765			ISA:      []string{"AVX"},
24766		}, nil
24767	}
24768	return nil, errors.New("VMASKMOVPS: bad operands")
24769}
24770
24771// VMAXPD: Return Maximum Packed Double-Precision Floating-Point Values.
24772//
24773// Forms:
24774//
24775// 	VMAXPD xmm  xmm xmm
24776// 	VMAXPD m128 xmm xmm
24777// 	VMAXPD ymm  ymm ymm
24778// 	VMAXPD m256 ymm ymm
24779func VMAXPD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
24780	switch {
24781	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
24782		return &intrep.Instruction{
24783			Opcode:   "VMAXPD",
24784			Operands: []operand.Op{mxy, xy, xy1},
24785			Inputs:   []operand.Op{mxy, xy},
24786			Outputs:  []operand.Op{xy1},
24787			ISA:      []string{"AVX"},
24788		}, nil
24789	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
24790		return &intrep.Instruction{
24791			Opcode:   "VMAXPD",
24792			Operands: []operand.Op{mxy, xy, xy1},
24793			Inputs:   []operand.Op{mxy, xy},
24794			Outputs:  []operand.Op{xy1},
24795			ISA:      []string{"AVX"},
24796		}, nil
24797	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
24798		return &intrep.Instruction{
24799			Opcode:   "VMAXPD",
24800			Operands: []operand.Op{mxy, xy, xy1},
24801			Inputs:   []operand.Op{mxy, xy},
24802			Outputs:  []operand.Op{xy1},
24803			ISA:      []string{"AVX"},
24804		}, nil
24805	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
24806		return &intrep.Instruction{
24807			Opcode:   "VMAXPD",
24808			Operands: []operand.Op{mxy, xy, xy1},
24809			Inputs:   []operand.Op{mxy, xy},
24810			Outputs:  []operand.Op{xy1},
24811			ISA:      []string{"AVX"},
24812		}, nil
24813	}
24814	return nil, errors.New("VMAXPD: bad operands")
24815}
24816
24817// VMAXPS: Return Maximum Packed Single-Precision Floating-Point Values.
24818//
24819// Forms:
24820//
24821// 	VMAXPS xmm  xmm xmm
24822// 	VMAXPS m128 xmm xmm
24823// 	VMAXPS ymm  ymm ymm
24824// 	VMAXPS m256 ymm ymm
24825func VMAXPS(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
24826	switch {
24827	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
24828		return &intrep.Instruction{
24829			Opcode:   "VMAXPS",
24830			Operands: []operand.Op{mxy, xy, xy1},
24831			Inputs:   []operand.Op{mxy, xy},
24832			Outputs:  []operand.Op{xy1},
24833			ISA:      []string{"AVX"},
24834		}, nil
24835	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
24836		return &intrep.Instruction{
24837			Opcode:   "VMAXPS",
24838			Operands: []operand.Op{mxy, xy, xy1},
24839			Inputs:   []operand.Op{mxy, xy},
24840			Outputs:  []operand.Op{xy1},
24841			ISA:      []string{"AVX"},
24842		}, nil
24843	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
24844		return &intrep.Instruction{
24845			Opcode:   "VMAXPS",
24846			Operands: []operand.Op{mxy, xy, xy1},
24847			Inputs:   []operand.Op{mxy, xy},
24848			Outputs:  []operand.Op{xy1},
24849			ISA:      []string{"AVX"},
24850		}, nil
24851	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
24852		return &intrep.Instruction{
24853			Opcode:   "VMAXPS",
24854			Operands: []operand.Op{mxy, xy, xy1},
24855			Inputs:   []operand.Op{mxy, xy},
24856			Outputs:  []operand.Op{xy1},
24857			ISA:      []string{"AVX"},
24858		}, nil
24859	}
24860	return nil, errors.New("VMAXPS: bad operands")
24861}
24862
24863// VMAXSD: Return Maximum Scalar Double-Precision Floating-Point Value.
24864//
24865// Forms:
24866//
24867// 	VMAXSD xmm xmm xmm
24868// 	VMAXSD m64 xmm xmm
24869func VMAXSD(mx, x, x1 operand.Op) (*intrep.Instruction, error) {
24870	switch {
24871	case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
24872		return &intrep.Instruction{
24873			Opcode:   "VMAXSD",
24874			Operands: []operand.Op{mx, x, x1},
24875			Inputs:   []operand.Op{mx, x},
24876			Outputs:  []operand.Op{x1},
24877			ISA:      []string{"AVX"},
24878		}, nil
24879	case operand.IsM64(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
24880		return &intrep.Instruction{
24881			Opcode:   "VMAXSD",
24882			Operands: []operand.Op{mx, x, x1},
24883			Inputs:   []operand.Op{mx, x},
24884			Outputs:  []operand.Op{x1},
24885			ISA:      []string{"AVX"},
24886		}, nil
24887	}
24888	return nil, errors.New("VMAXSD: bad operands")
24889}
24890
24891// VMAXSS: Return Maximum Scalar Single-Precision Floating-Point Value.
24892//
24893// Forms:
24894//
24895// 	VMAXSS xmm xmm xmm
24896// 	VMAXSS m32 xmm xmm
24897func VMAXSS(mx, x, x1 operand.Op) (*intrep.Instruction, error) {
24898	switch {
24899	case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
24900		return &intrep.Instruction{
24901			Opcode:   "VMAXSS",
24902			Operands: []operand.Op{mx, x, x1},
24903			Inputs:   []operand.Op{mx, x},
24904			Outputs:  []operand.Op{x1},
24905			ISA:      []string{"AVX"},
24906		}, nil
24907	case operand.IsM32(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
24908		return &intrep.Instruction{
24909			Opcode:   "VMAXSS",
24910			Operands: []operand.Op{mx, x, x1},
24911			Inputs:   []operand.Op{mx, x},
24912			Outputs:  []operand.Op{x1},
24913			ISA:      []string{"AVX"},
24914		}, nil
24915	}
24916	return nil, errors.New("VMAXSS: bad operands")
24917}
24918
24919// VMINPD: Return Minimum Packed Double-Precision Floating-Point Values.
24920//
24921// Forms:
24922//
24923// 	VMINPD xmm  xmm xmm
24924// 	VMINPD m128 xmm xmm
24925// 	VMINPD ymm  ymm ymm
24926// 	VMINPD m256 ymm ymm
24927func VMINPD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
24928	switch {
24929	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
24930		return &intrep.Instruction{
24931			Opcode:   "VMINPD",
24932			Operands: []operand.Op{mxy, xy, xy1},
24933			Inputs:   []operand.Op{mxy, xy},
24934			Outputs:  []operand.Op{xy1},
24935			ISA:      []string{"AVX"},
24936		}, nil
24937	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
24938		return &intrep.Instruction{
24939			Opcode:   "VMINPD",
24940			Operands: []operand.Op{mxy, xy, xy1},
24941			Inputs:   []operand.Op{mxy, xy},
24942			Outputs:  []operand.Op{xy1},
24943			ISA:      []string{"AVX"},
24944		}, nil
24945	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
24946		return &intrep.Instruction{
24947			Opcode:   "VMINPD",
24948			Operands: []operand.Op{mxy, xy, xy1},
24949			Inputs:   []operand.Op{mxy, xy},
24950			Outputs:  []operand.Op{xy1},
24951			ISA:      []string{"AVX"},
24952		}, nil
24953	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
24954		return &intrep.Instruction{
24955			Opcode:   "VMINPD",
24956			Operands: []operand.Op{mxy, xy, xy1},
24957			Inputs:   []operand.Op{mxy, xy},
24958			Outputs:  []operand.Op{xy1},
24959			ISA:      []string{"AVX"},
24960		}, nil
24961	}
24962	return nil, errors.New("VMINPD: bad operands")
24963}
24964
24965// VMINPS: Return Minimum Packed Single-Precision Floating-Point Values.
24966//
24967// Forms:
24968//
24969// 	VMINPS xmm  xmm xmm
24970// 	VMINPS m128 xmm xmm
24971// 	VMINPS ymm  ymm ymm
24972// 	VMINPS m256 ymm ymm
24973func VMINPS(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
24974	switch {
24975	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
24976		return &intrep.Instruction{
24977			Opcode:   "VMINPS",
24978			Operands: []operand.Op{mxy, xy, xy1},
24979			Inputs:   []operand.Op{mxy, xy},
24980			Outputs:  []operand.Op{xy1},
24981			ISA:      []string{"AVX"},
24982		}, nil
24983	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
24984		return &intrep.Instruction{
24985			Opcode:   "VMINPS",
24986			Operands: []operand.Op{mxy, xy, xy1},
24987			Inputs:   []operand.Op{mxy, xy},
24988			Outputs:  []operand.Op{xy1},
24989			ISA:      []string{"AVX"},
24990		}, nil
24991	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
24992		return &intrep.Instruction{
24993			Opcode:   "VMINPS",
24994			Operands: []operand.Op{mxy, xy, xy1},
24995			Inputs:   []operand.Op{mxy, xy},
24996			Outputs:  []operand.Op{xy1},
24997			ISA:      []string{"AVX"},
24998		}, nil
24999	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
25000		return &intrep.Instruction{
25001			Opcode:   "VMINPS",
25002			Operands: []operand.Op{mxy, xy, xy1},
25003			Inputs:   []operand.Op{mxy, xy},
25004			Outputs:  []operand.Op{xy1},
25005			ISA:      []string{"AVX"},
25006		}, nil
25007	}
25008	return nil, errors.New("VMINPS: bad operands")
25009}
25010
25011// VMINSD: Return Minimum Scalar Double-Precision Floating-Point Value.
25012//
25013// Forms:
25014//
25015// 	VMINSD xmm xmm xmm
25016// 	VMINSD m64 xmm xmm
25017func VMINSD(mx, x, x1 operand.Op) (*intrep.Instruction, error) {
25018	switch {
25019	case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
25020		return &intrep.Instruction{
25021			Opcode:   "VMINSD",
25022			Operands: []operand.Op{mx, x, x1},
25023			Inputs:   []operand.Op{mx, x},
25024			Outputs:  []operand.Op{x1},
25025			ISA:      []string{"AVX"},
25026		}, nil
25027	case operand.IsM64(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
25028		return &intrep.Instruction{
25029			Opcode:   "VMINSD",
25030			Operands: []operand.Op{mx, x, x1},
25031			Inputs:   []operand.Op{mx, x},
25032			Outputs:  []operand.Op{x1},
25033			ISA:      []string{"AVX"},
25034		}, nil
25035	}
25036	return nil, errors.New("VMINSD: bad operands")
25037}
25038
25039// VMINSS: Return Minimum Scalar Single-Precision Floating-Point Value.
25040//
25041// Forms:
25042//
25043// 	VMINSS xmm xmm xmm
25044// 	VMINSS m32 xmm xmm
25045func VMINSS(mx, x, x1 operand.Op) (*intrep.Instruction, error) {
25046	switch {
25047	case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
25048		return &intrep.Instruction{
25049			Opcode:   "VMINSS",
25050			Operands: []operand.Op{mx, x, x1},
25051			Inputs:   []operand.Op{mx, x},
25052			Outputs:  []operand.Op{x1},
25053			ISA:      []string{"AVX"},
25054		}, nil
25055	case operand.IsM32(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
25056		return &intrep.Instruction{
25057			Opcode:   "VMINSS",
25058			Operands: []operand.Op{mx, x, x1},
25059			Inputs:   []operand.Op{mx, x},
25060			Outputs:  []operand.Op{x1},
25061			ISA:      []string{"AVX"},
25062		}, nil
25063	}
25064	return nil, errors.New("VMINSS: bad operands")
25065}
25066
25067// VMOVAPD: Move Aligned Packed Double-Precision Floating-Point Values.
25068//
25069// Forms:
25070//
25071// 	VMOVAPD xmm  xmm
25072// 	VMOVAPD m128 xmm
25073// 	VMOVAPD ymm  ymm
25074// 	VMOVAPD m256 ymm
25075// 	VMOVAPD xmm  m128
25076// 	VMOVAPD ymm  m256
25077func VMOVAPD(mxy, mxy1 operand.Op) (*intrep.Instruction, error) {
25078	switch {
25079	case operand.IsXMM(mxy) && operand.IsXMM(mxy1):
25080		return &intrep.Instruction{
25081			Opcode:   "VMOVAPD",
25082			Operands: []operand.Op{mxy, mxy1},
25083			Inputs:   []operand.Op{mxy},
25084			Outputs:  []operand.Op{mxy1},
25085			ISA:      []string{"AVX"},
25086		}, nil
25087	case operand.IsM128(mxy) && operand.IsXMM(mxy1):
25088		return &intrep.Instruction{
25089			Opcode:   "VMOVAPD",
25090			Operands: []operand.Op{mxy, mxy1},
25091			Inputs:   []operand.Op{mxy},
25092			Outputs:  []operand.Op{mxy1},
25093			ISA:      []string{"AVX"},
25094		}, nil
25095	case operand.IsYMM(mxy) && operand.IsYMM(mxy1):
25096		return &intrep.Instruction{
25097			Opcode:   "VMOVAPD",
25098			Operands: []operand.Op{mxy, mxy1},
25099			Inputs:   []operand.Op{mxy},
25100			Outputs:  []operand.Op{mxy1},
25101			ISA:      []string{"AVX"},
25102		}, nil
25103	case operand.IsM256(mxy) && operand.IsYMM(mxy1):
25104		return &intrep.Instruction{
25105			Opcode:   "VMOVAPD",
25106			Operands: []operand.Op{mxy, mxy1},
25107			Inputs:   []operand.Op{mxy},
25108			Outputs:  []operand.Op{mxy1},
25109			ISA:      []string{"AVX"},
25110		}, nil
25111	case operand.IsXMM(mxy) && operand.IsM128(mxy1):
25112		return &intrep.Instruction{
25113			Opcode:   "VMOVAPD",
25114			Operands: []operand.Op{mxy, mxy1},
25115			Inputs:   []operand.Op{mxy},
25116			Outputs:  []operand.Op{mxy1},
25117			ISA:      []string{"AVX"},
25118		}, nil
25119	case operand.IsYMM(mxy) && operand.IsM256(mxy1):
25120		return &intrep.Instruction{
25121			Opcode:   "VMOVAPD",
25122			Operands: []operand.Op{mxy, mxy1},
25123			Inputs:   []operand.Op{mxy},
25124			Outputs:  []operand.Op{mxy1},
25125			ISA:      []string{"AVX"},
25126		}, nil
25127	}
25128	return nil, errors.New("VMOVAPD: bad operands")
25129}
25130
25131// VMOVAPS: Move Aligned Packed Single-Precision Floating-Point Values.
25132//
25133// Forms:
25134//
25135// 	VMOVAPS xmm  xmm
25136// 	VMOVAPS m128 xmm
25137// 	VMOVAPS ymm  ymm
25138// 	VMOVAPS m256 ymm
25139// 	VMOVAPS xmm  m128
25140// 	VMOVAPS ymm  m256
25141func VMOVAPS(mxy, mxy1 operand.Op) (*intrep.Instruction, error) {
25142	switch {
25143	case operand.IsXMM(mxy) && operand.IsXMM(mxy1):
25144		return &intrep.Instruction{
25145			Opcode:   "VMOVAPS",
25146			Operands: []operand.Op{mxy, mxy1},
25147			Inputs:   []operand.Op{mxy},
25148			Outputs:  []operand.Op{mxy1},
25149			ISA:      []string{"AVX"},
25150		}, nil
25151	case operand.IsM128(mxy) && operand.IsXMM(mxy1):
25152		return &intrep.Instruction{
25153			Opcode:   "VMOVAPS",
25154			Operands: []operand.Op{mxy, mxy1},
25155			Inputs:   []operand.Op{mxy},
25156			Outputs:  []operand.Op{mxy1},
25157			ISA:      []string{"AVX"},
25158		}, nil
25159	case operand.IsYMM(mxy) && operand.IsYMM(mxy1):
25160		return &intrep.Instruction{
25161			Opcode:   "VMOVAPS",
25162			Operands: []operand.Op{mxy, mxy1},
25163			Inputs:   []operand.Op{mxy},
25164			Outputs:  []operand.Op{mxy1},
25165			ISA:      []string{"AVX"},
25166		}, nil
25167	case operand.IsM256(mxy) && operand.IsYMM(mxy1):
25168		return &intrep.Instruction{
25169			Opcode:   "VMOVAPS",
25170			Operands: []operand.Op{mxy, mxy1},
25171			Inputs:   []operand.Op{mxy},
25172			Outputs:  []operand.Op{mxy1},
25173			ISA:      []string{"AVX"},
25174		}, nil
25175	case operand.IsXMM(mxy) && operand.IsM128(mxy1):
25176		return &intrep.Instruction{
25177			Opcode:   "VMOVAPS",
25178			Operands: []operand.Op{mxy, mxy1},
25179			Inputs:   []operand.Op{mxy},
25180			Outputs:  []operand.Op{mxy1},
25181			ISA:      []string{"AVX"},
25182		}, nil
25183	case operand.IsYMM(mxy) && operand.IsM256(mxy1):
25184		return &intrep.Instruction{
25185			Opcode:   "VMOVAPS",
25186			Operands: []operand.Op{mxy, mxy1},
25187			Inputs:   []operand.Op{mxy},
25188			Outputs:  []operand.Op{mxy1},
25189			ISA:      []string{"AVX"},
25190		}, nil
25191	}
25192	return nil, errors.New("VMOVAPS: bad operands")
25193}
25194
25195// VMOVD: Move Doubleword.
25196//
25197// Forms:
25198//
25199// 	VMOVD xmm r32
25200// 	VMOVD r32 xmm
25201// 	VMOVD m32 xmm
25202// 	VMOVD xmm m32
25203func VMOVD(mrx, mrx1 operand.Op) (*intrep.Instruction, error) {
25204	switch {
25205	case operand.IsXMM(mrx) && operand.IsR32(mrx1):
25206		return &intrep.Instruction{
25207			Opcode:   "VMOVD",
25208			Operands: []operand.Op{mrx, mrx1},
25209			Inputs:   []operand.Op{mrx},
25210			Outputs:  []operand.Op{mrx1},
25211			ISA:      []string{"AVX"},
25212		}, nil
25213	case operand.IsR32(mrx) && operand.IsXMM(mrx1):
25214		return &intrep.Instruction{
25215			Opcode:   "VMOVD",
25216			Operands: []operand.Op{mrx, mrx1},
25217			Inputs:   []operand.Op{mrx},
25218			Outputs:  []operand.Op{mrx1},
25219			ISA:      []string{"AVX"},
25220		}, nil
25221	case operand.IsM32(mrx) && operand.IsXMM(mrx1):
25222		return &intrep.Instruction{
25223			Opcode:   "VMOVD",
25224			Operands: []operand.Op{mrx, mrx1},
25225			Inputs:   []operand.Op{mrx},
25226			Outputs:  []operand.Op{mrx1},
25227			ISA:      []string{"AVX"},
25228		}, nil
25229	case operand.IsXMM(mrx) && operand.IsM32(mrx1):
25230		return &intrep.Instruction{
25231			Opcode:   "VMOVD",
25232			Operands: []operand.Op{mrx, mrx1},
25233			Inputs:   []operand.Op{mrx},
25234			Outputs:  []operand.Op{mrx1},
25235			ISA:      []string{"AVX"},
25236		}, nil
25237	}
25238	return nil, errors.New("VMOVD: bad operands")
25239}
25240
25241// VMOVDDUP: Move One Double-FP and Duplicate.
25242//
25243// Forms:
25244//
25245// 	VMOVDDUP xmm  xmm
25246// 	VMOVDDUP m64  xmm
25247// 	VMOVDDUP ymm  ymm
25248// 	VMOVDDUP m256 ymm
25249func VMOVDDUP(mxy, xy operand.Op) (*intrep.Instruction, error) {
25250	switch {
25251	case operand.IsXMM(mxy) && operand.IsXMM(xy):
25252		return &intrep.Instruction{
25253			Opcode:   "VMOVDDUP",
25254			Operands: []operand.Op{mxy, xy},
25255			Inputs:   []operand.Op{mxy},
25256			Outputs:  []operand.Op{xy},
25257			ISA:      []string{"AVX"},
25258		}, nil
25259	case operand.IsM64(mxy) && operand.IsXMM(xy):
25260		return &intrep.Instruction{
25261			Opcode:   "VMOVDDUP",
25262			Operands: []operand.Op{mxy, xy},
25263			Inputs:   []operand.Op{mxy},
25264			Outputs:  []operand.Op{xy},
25265			ISA:      []string{"AVX"},
25266		}, nil
25267	case operand.IsYMM(mxy) && operand.IsYMM(xy):
25268		return &intrep.Instruction{
25269			Opcode:   "VMOVDDUP",
25270			Operands: []operand.Op{mxy, xy},
25271			Inputs:   []operand.Op{mxy},
25272			Outputs:  []operand.Op{xy},
25273			ISA:      []string{"AVX"},
25274		}, nil
25275	case operand.IsM256(mxy) && operand.IsYMM(xy):
25276		return &intrep.Instruction{
25277			Opcode:   "VMOVDDUP",
25278			Operands: []operand.Op{mxy, xy},
25279			Inputs:   []operand.Op{mxy},
25280			Outputs:  []operand.Op{xy},
25281			ISA:      []string{"AVX"},
25282		}, nil
25283	}
25284	return nil, errors.New("VMOVDDUP: bad operands")
25285}
25286
25287// VMOVDQA: Move Aligned Double Quadword.
25288//
25289// Forms:
25290//
25291// 	VMOVDQA xmm  xmm
25292// 	VMOVDQA m128 xmm
25293// 	VMOVDQA ymm  ymm
25294// 	VMOVDQA m256 ymm
25295// 	VMOVDQA xmm  m128
25296// 	VMOVDQA ymm  m256
25297func VMOVDQA(mxy, mxy1 operand.Op) (*intrep.Instruction, error) {
25298	switch {
25299	case operand.IsXMM(mxy) && operand.IsXMM(mxy1):
25300		return &intrep.Instruction{
25301			Opcode:   "VMOVDQA",
25302			Operands: []operand.Op{mxy, mxy1},
25303			Inputs:   []operand.Op{mxy},
25304			Outputs:  []operand.Op{mxy1},
25305			ISA:      []string{"AVX"},
25306		}, nil
25307	case operand.IsM128(mxy) && operand.IsXMM(mxy1):
25308		return &intrep.Instruction{
25309			Opcode:   "VMOVDQA",
25310			Operands: []operand.Op{mxy, mxy1},
25311			Inputs:   []operand.Op{mxy},
25312			Outputs:  []operand.Op{mxy1},
25313			ISA:      []string{"AVX"},
25314		}, nil
25315	case operand.IsYMM(mxy) && operand.IsYMM(mxy1):
25316		return &intrep.Instruction{
25317			Opcode:   "VMOVDQA",
25318			Operands: []operand.Op{mxy, mxy1},
25319			Inputs:   []operand.Op{mxy},
25320			Outputs:  []operand.Op{mxy1},
25321			ISA:      []string{"AVX"},
25322		}, nil
25323	case operand.IsM256(mxy) && operand.IsYMM(mxy1):
25324		return &intrep.Instruction{
25325			Opcode:   "VMOVDQA",
25326			Operands: []operand.Op{mxy, mxy1},
25327			Inputs:   []operand.Op{mxy},
25328			Outputs:  []operand.Op{mxy1},
25329			ISA:      []string{"AVX"},
25330		}, nil
25331	case operand.IsXMM(mxy) && operand.IsM128(mxy1):
25332		return &intrep.Instruction{
25333			Opcode:   "VMOVDQA",
25334			Operands: []operand.Op{mxy, mxy1},
25335			Inputs:   []operand.Op{mxy},
25336			Outputs:  []operand.Op{mxy1},
25337			ISA:      []string{"AVX"},
25338		}, nil
25339	case operand.IsYMM(mxy) && operand.IsM256(mxy1):
25340		return &intrep.Instruction{
25341			Opcode:   "VMOVDQA",
25342			Operands: []operand.Op{mxy, mxy1},
25343			Inputs:   []operand.Op{mxy},
25344			Outputs:  []operand.Op{mxy1},
25345			ISA:      []string{"AVX"},
25346		}, nil
25347	}
25348	return nil, errors.New("VMOVDQA: bad operands")
25349}
25350
25351// VMOVDQU: Move Unaligned Double Quadword.
25352//
25353// Forms:
25354//
25355// 	VMOVDQU xmm  xmm
25356// 	VMOVDQU m128 xmm
25357// 	VMOVDQU ymm  ymm
25358// 	VMOVDQU m256 ymm
25359// 	VMOVDQU xmm  m128
25360// 	VMOVDQU ymm  m256
25361func VMOVDQU(mxy, mxy1 operand.Op) (*intrep.Instruction, error) {
25362	switch {
25363	case operand.IsXMM(mxy) && operand.IsXMM(mxy1):
25364		return &intrep.Instruction{
25365			Opcode:   "VMOVDQU",
25366			Operands: []operand.Op{mxy, mxy1},
25367			Inputs:   []operand.Op{mxy},
25368			Outputs:  []operand.Op{mxy1},
25369			ISA:      []string{"AVX"},
25370		}, nil
25371	case operand.IsM128(mxy) && operand.IsXMM(mxy1):
25372		return &intrep.Instruction{
25373			Opcode:   "VMOVDQU",
25374			Operands: []operand.Op{mxy, mxy1},
25375			Inputs:   []operand.Op{mxy},
25376			Outputs:  []operand.Op{mxy1},
25377			ISA:      []string{"AVX"},
25378		}, nil
25379	case operand.IsYMM(mxy) && operand.IsYMM(mxy1):
25380		return &intrep.Instruction{
25381			Opcode:   "VMOVDQU",
25382			Operands: []operand.Op{mxy, mxy1},
25383			Inputs:   []operand.Op{mxy},
25384			Outputs:  []operand.Op{mxy1},
25385			ISA:      []string{"AVX"},
25386		}, nil
25387	case operand.IsM256(mxy) && operand.IsYMM(mxy1):
25388		return &intrep.Instruction{
25389			Opcode:   "VMOVDQU",
25390			Operands: []operand.Op{mxy, mxy1},
25391			Inputs:   []operand.Op{mxy},
25392			Outputs:  []operand.Op{mxy1},
25393			ISA:      []string{"AVX"},
25394		}, nil
25395	case operand.IsXMM(mxy) && operand.IsM128(mxy1):
25396		return &intrep.Instruction{
25397			Opcode:   "VMOVDQU",
25398			Operands: []operand.Op{mxy, mxy1},
25399			Inputs:   []operand.Op{mxy},
25400			Outputs:  []operand.Op{mxy1},
25401			ISA:      []string{"AVX"},
25402		}, nil
25403	case operand.IsYMM(mxy) && operand.IsM256(mxy1):
25404		return &intrep.Instruction{
25405			Opcode:   "VMOVDQU",
25406			Operands: []operand.Op{mxy, mxy1},
25407			Inputs:   []operand.Op{mxy},
25408			Outputs:  []operand.Op{mxy1},
25409			ISA:      []string{"AVX"},
25410		}, nil
25411	}
25412	return nil, errors.New("VMOVDQU: bad operands")
25413}
25414
25415// VMOVHLPS: Move Packed Single-Precision Floating-Point Values High to Low.
25416//
25417// Forms:
25418//
25419// 	VMOVHLPS xmm xmm xmm
25420func VMOVHLPS(x, x1, x2 operand.Op) (*intrep.Instruction, error) {
25421	switch {
25422	case operand.IsXMM(x) && operand.IsXMM(x1) && operand.IsXMM(x2):
25423		return &intrep.Instruction{
25424			Opcode:   "VMOVHLPS",
25425			Operands: []operand.Op{x, x1, x2},
25426			Inputs:   []operand.Op{x, x1},
25427			Outputs:  []operand.Op{x2},
25428			ISA:      []string{"AVX"},
25429		}, nil
25430	}
25431	return nil, errors.New("VMOVHLPS: bad operands")
25432}
25433
25434// VMOVHPD: Move High Packed Double-Precision Floating-Point Value.
25435//
25436// Forms:
25437//
25438// 	VMOVHPD xmm m64
25439// 	VMOVHPD m64 xmm xmm
25440func VMOVHPD(ops ...operand.Op) (*intrep.Instruction, error) {
25441	switch {
25442	case len(ops) == 2 && operand.IsXMM(ops[0]) && operand.IsM64(ops[1]):
25443		return &intrep.Instruction{
25444			Opcode:   "VMOVHPD",
25445			Operands: ops,
25446			Inputs:   []operand.Op{ops[0]},
25447			Outputs:  []operand.Op{ops[1]},
25448			ISA:      []string{"AVX"},
25449		}, nil
25450	case len(ops) == 3 && operand.IsM64(ops[0]) && operand.IsXMM(ops[1]) && operand.IsXMM(ops[2]):
25451		return &intrep.Instruction{
25452			Opcode:   "VMOVHPD",
25453			Operands: ops,
25454			Inputs:   []operand.Op{ops[0], ops[1]},
25455			Outputs:  []operand.Op{ops[2]},
25456			ISA:      []string{"AVX"},
25457		}, nil
25458	}
25459	return nil, errors.New("VMOVHPD: bad operands")
25460}
25461
25462// VMOVHPS: Move High Packed Single-Precision Floating-Point Values.
25463//
25464// Forms:
25465//
25466// 	VMOVHPS xmm m64
25467// 	VMOVHPS m64 xmm xmm
25468func VMOVHPS(ops ...operand.Op) (*intrep.Instruction, error) {
25469	switch {
25470	case len(ops) == 2 && operand.IsXMM(ops[0]) && operand.IsM64(ops[1]):
25471		return &intrep.Instruction{
25472			Opcode:   "VMOVHPS",
25473			Operands: ops,
25474			Inputs:   []operand.Op{ops[0]},
25475			Outputs:  []operand.Op{ops[1]},
25476			ISA:      []string{"AVX"},
25477		}, nil
25478	case len(ops) == 3 && operand.IsM64(ops[0]) && operand.IsXMM(ops[1]) && operand.IsXMM(ops[2]):
25479		return &intrep.Instruction{
25480			Opcode:   "VMOVHPS",
25481			Operands: ops,
25482			Inputs:   []operand.Op{ops[0], ops[1]},
25483			Outputs:  []operand.Op{ops[2]},
25484			ISA:      []string{"AVX"},
25485		}, nil
25486	}
25487	return nil, errors.New("VMOVHPS: bad operands")
25488}
25489
25490// VMOVLHPS: Move Packed Single-Precision Floating-Point Values Low to High.
25491//
25492// Forms:
25493//
25494// 	VMOVLHPS xmm xmm xmm
25495func VMOVLHPS(x, x1, x2 operand.Op) (*intrep.Instruction, error) {
25496	switch {
25497	case operand.IsXMM(x) && operand.IsXMM(x1) && operand.IsXMM(x2):
25498		return &intrep.Instruction{
25499			Opcode:   "VMOVLHPS",
25500			Operands: []operand.Op{x, x1, x2},
25501			Inputs:   []operand.Op{x, x1},
25502			Outputs:  []operand.Op{x2},
25503			ISA:      []string{"AVX"},
25504		}, nil
25505	}
25506	return nil, errors.New("VMOVLHPS: bad operands")
25507}
25508
25509// VMOVLPD: Move Low Packed Double-Precision Floating-Point Value.
25510//
25511// Forms:
25512//
25513// 	VMOVLPD xmm m64
25514// 	VMOVLPD m64 xmm xmm
25515func VMOVLPD(ops ...operand.Op) (*intrep.Instruction, error) {
25516	switch {
25517	case len(ops) == 2 && operand.IsXMM(ops[0]) && operand.IsM64(ops[1]):
25518		return &intrep.Instruction{
25519			Opcode:   "VMOVLPD",
25520			Operands: ops,
25521			Inputs:   []operand.Op{ops[0]},
25522			Outputs:  []operand.Op{ops[1]},
25523			ISA:      []string{"AVX"},
25524		}, nil
25525	case len(ops) == 3 && operand.IsM64(ops[0]) && operand.IsXMM(ops[1]) && operand.IsXMM(ops[2]):
25526		return &intrep.Instruction{
25527			Opcode:   "VMOVLPD",
25528			Operands: ops,
25529			Inputs:   []operand.Op{ops[0], ops[1]},
25530			Outputs:  []operand.Op{ops[2]},
25531			ISA:      []string{"AVX"},
25532		}, nil
25533	}
25534	return nil, errors.New("VMOVLPD: bad operands")
25535}
25536
25537// VMOVLPS: Move Low Packed Single-Precision Floating-Point Values.
25538//
25539// Forms:
25540//
25541// 	VMOVLPS xmm m64
25542// 	VMOVLPS m64 xmm xmm
25543func VMOVLPS(ops ...operand.Op) (*intrep.Instruction, error) {
25544	switch {
25545	case len(ops) == 2 && operand.IsXMM(ops[0]) && operand.IsM64(ops[1]):
25546		return &intrep.Instruction{
25547			Opcode:   "VMOVLPS",
25548			Operands: ops,
25549			Inputs:   []operand.Op{ops[0]},
25550			Outputs:  []operand.Op{ops[1]},
25551			ISA:      []string{"AVX"},
25552		}, nil
25553	case len(ops) == 3 && operand.IsM64(ops[0]) && operand.IsXMM(ops[1]) && operand.IsXMM(ops[2]):
25554		return &intrep.Instruction{
25555			Opcode:   "VMOVLPS",
25556			Operands: ops,
25557			Inputs:   []operand.Op{ops[0], ops[1]},
25558			Outputs:  []operand.Op{ops[2]},
25559			ISA:      []string{"AVX"},
25560		}, nil
25561	}
25562	return nil, errors.New("VMOVLPS: bad operands")
25563}
25564
25565// VMOVMSKPD: Extract Packed Double-Precision Floating-Point Sign Mask.
25566//
25567// Forms:
25568//
25569// 	VMOVMSKPD xmm r32
25570// 	VMOVMSKPD ymm r32
25571func VMOVMSKPD(xy, r operand.Op) (*intrep.Instruction, error) {
25572	switch {
25573	case operand.IsXMM(xy) && operand.IsR32(r):
25574		return &intrep.Instruction{
25575			Opcode:   "VMOVMSKPD",
25576			Operands: []operand.Op{xy, r},
25577			Inputs:   []operand.Op{xy},
25578			Outputs:  []operand.Op{r},
25579			ISA:      []string{"AVX"},
25580		}, nil
25581	case operand.IsYMM(xy) && operand.IsR32(r):
25582		return &intrep.Instruction{
25583			Opcode:   "VMOVMSKPD",
25584			Operands: []operand.Op{xy, r},
25585			Inputs:   []operand.Op{xy},
25586			Outputs:  []operand.Op{r},
25587			ISA:      []string{"AVX"},
25588		}, nil
25589	}
25590	return nil, errors.New("VMOVMSKPD: bad operands")
25591}
25592
25593// VMOVMSKPS: Extract Packed Single-Precision Floating-Point Sign Mask.
25594//
25595// Forms:
25596//
25597// 	VMOVMSKPS xmm r32
25598// 	VMOVMSKPS ymm r32
25599func VMOVMSKPS(xy, r operand.Op) (*intrep.Instruction, error) {
25600	switch {
25601	case operand.IsXMM(xy) && operand.IsR32(r):
25602		return &intrep.Instruction{
25603			Opcode:   "VMOVMSKPS",
25604			Operands: []operand.Op{xy, r},
25605			Inputs:   []operand.Op{xy},
25606			Outputs:  []operand.Op{r},
25607			ISA:      []string{"AVX"},
25608		}, nil
25609	case operand.IsYMM(xy) && operand.IsR32(r):
25610		return &intrep.Instruction{
25611			Opcode:   "VMOVMSKPS",
25612			Operands: []operand.Op{xy, r},
25613			Inputs:   []operand.Op{xy},
25614			Outputs:  []operand.Op{r},
25615			ISA:      []string{"AVX"},
25616		}, nil
25617	}
25618	return nil, errors.New("VMOVMSKPS: bad operands")
25619}
25620
25621// VMOVNTDQ: Store Double Quadword Using Non-Temporal Hint.
25622//
25623// Forms:
25624//
25625// 	VMOVNTDQ xmm m128
25626// 	VMOVNTDQ ymm m256
25627func VMOVNTDQ(xy, m operand.Op) (*intrep.Instruction, error) {
25628	switch {
25629	case operand.IsXMM(xy) && operand.IsM128(m):
25630		return &intrep.Instruction{
25631			Opcode:   "VMOVNTDQ",
25632			Operands: []operand.Op{xy, m},
25633			Inputs:   []operand.Op{xy},
25634			Outputs:  []operand.Op{m},
25635			ISA:      []string{"AVX"},
25636		}, nil
25637	case operand.IsYMM(xy) && operand.IsM256(m):
25638		return &intrep.Instruction{
25639			Opcode:   "VMOVNTDQ",
25640			Operands: []operand.Op{xy, m},
25641			Inputs:   []operand.Op{xy},
25642			Outputs:  []operand.Op{m},
25643			ISA:      []string{"AVX"},
25644		}, nil
25645	}
25646	return nil, errors.New("VMOVNTDQ: bad operands")
25647}
25648
25649// VMOVNTDQA: Load Double Quadword Non-Temporal Aligned Hint.
25650//
25651// Forms:
25652//
25653// 	VMOVNTDQA m128 xmm
25654// 	VMOVNTDQA m256 ymm
25655func VMOVNTDQA(m, xy operand.Op) (*intrep.Instruction, error) {
25656	switch {
25657	case operand.IsM128(m) && operand.IsXMM(xy):
25658		return &intrep.Instruction{
25659			Opcode:   "VMOVNTDQA",
25660			Operands: []operand.Op{m, xy},
25661			Inputs:   []operand.Op{m},
25662			Outputs:  []operand.Op{xy},
25663			ISA:      []string{"AVX"},
25664		}, nil
25665	case operand.IsM256(m) && operand.IsYMM(xy):
25666		return &intrep.Instruction{
25667			Opcode:   "VMOVNTDQA",
25668			Operands: []operand.Op{m, xy},
25669			Inputs:   []operand.Op{m},
25670			Outputs:  []operand.Op{xy},
25671			ISA:      []string{"AVX2"},
25672		}, nil
25673	}
25674	return nil, errors.New("VMOVNTDQA: bad operands")
25675}
25676
25677// VMOVNTPD: Store Packed Double-Precision Floating-Point Values Using Non-Temporal Hint.
25678//
25679// Forms:
25680//
25681// 	VMOVNTPD xmm m128
25682// 	VMOVNTPD ymm m256
25683func VMOVNTPD(xy, m operand.Op) (*intrep.Instruction, error) {
25684	switch {
25685	case operand.IsXMM(xy) && operand.IsM128(m):
25686		return &intrep.Instruction{
25687			Opcode:   "VMOVNTPD",
25688			Operands: []operand.Op{xy, m},
25689			Inputs:   []operand.Op{xy},
25690			Outputs:  []operand.Op{m},
25691			ISA:      []string{"AVX"},
25692		}, nil
25693	case operand.IsYMM(xy) && operand.IsM256(m):
25694		return &intrep.Instruction{
25695			Opcode:   "VMOVNTPD",
25696			Operands: []operand.Op{xy, m},
25697			Inputs:   []operand.Op{xy},
25698			Outputs:  []operand.Op{m},
25699			ISA:      []string{"AVX"},
25700		}, nil
25701	}
25702	return nil, errors.New("VMOVNTPD: bad operands")
25703}
25704
25705// VMOVNTPS: Store Packed Single-Precision Floating-Point Values Using Non-Temporal Hint.
25706//
25707// Forms:
25708//
25709// 	VMOVNTPS xmm m128
25710// 	VMOVNTPS ymm m256
25711func VMOVNTPS(xy, m operand.Op) (*intrep.Instruction, error) {
25712	switch {
25713	case operand.IsXMM(xy) && operand.IsM128(m):
25714		return &intrep.Instruction{
25715			Opcode:   "VMOVNTPS",
25716			Operands: []operand.Op{xy, m},
25717			Inputs:   []operand.Op{xy},
25718			Outputs:  []operand.Op{m},
25719			ISA:      []string{"AVX"},
25720		}, nil
25721	case operand.IsYMM(xy) && operand.IsM256(m):
25722		return &intrep.Instruction{
25723			Opcode:   "VMOVNTPS",
25724			Operands: []operand.Op{xy, m},
25725			Inputs:   []operand.Op{xy},
25726			Outputs:  []operand.Op{m},
25727			ISA:      []string{"AVX"},
25728		}, nil
25729	}
25730	return nil, errors.New("VMOVNTPS: bad operands")
25731}
25732
25733// VMOVQ: Move Quadword.
25734//
25735// Forms:
25736//
25737// 	VMOVQ xmm r64
25738// 	VMOVQ r64 xmm
25739// 	VMOVQ xmm xmm
25740// 	VMOVQ m64 xmm
25741// 	VMOVQ xmm m64
25742func VMOVQ(mrx, mrx1 operand.Op) (*intrep.Instruction, error) {
25743	switch {
25744	case operand.IsXMM(mrx) && operand.IsR64(mrx1):
25745		return &intrep.Instruction{
25746			Opcode:   "VMOVQ",
25747			Operands: []operand.Op{mrx, mrx1},
25748			Inputs:   []operand.Op{mrx},
25749			Outputs:  []operand.Op{mrx1},
25750			ISA:      []string{"AVX"},
25751		}, nil
25752	case operand.IsR64(mrx) && operand.IsXMM(mrx1):
25753		return &intrep.Instruction{
25754			Opcode:   "VMOVQ",
25755			Operands: []operand.Op{mrx, mrx1},
25756			Inputs:   []operand.Op{mrx},
25757			Outputs:  []operand.Op{mrx1},
25758			ISA:      []string{"AVX"},
25759		}, nil
25760	case operand.IsXMM(mrx) && operand.IsXMM(mrx1):
25761		return &intrep.Instruction{
25762			Opcode:   "VMOVQ",
25763			Operands: []operand.Op{mrx, mrx1},
25764			Inputs:   []operand.Op{mrx},
25765			Outputs:  []operand.Op{mrx1},
25766			ISA:      []string{"AVX"},
25767		}, nil
25768	case operand.IsM64(mrx) && operand.IsXMM(mrx1):
25769		return &intrep.Instruction{
25770			Opcode:   "VMOVQ",
25771			Operands: []operand.Op{mrx, mrx1},
25772			Inputs:   []operand.Op{mrx},
25773			Outputs:  []operand.Op{mrx1},
25774			ISA:      []string{"AVX"},
25775		}, nil
25776	case operand.IsXMM(mrx) && operand.IsM64(mrx1):
25777		return &intrep.Instruction{
25778			Opcode:   "VMOVQ",
25779			Operands: []operand.Op{mrx, mrx1},
25780			Inputs:   []operand.Op{mrx},
25781			Outputs:  []operand.Op{mrx1},
25782			ISA:      []string{"AVX"},
25783		}, nil
25784	}
25785	return nil, errors.New("VMOVQ: bad operands")
25786}
25787
25788// VMOVSD: Move Scalar Double-Precision Floating-Point Value.
25789//
25790// Forms:
25791//
25792// 	VMOVSD m64 xmm
25793// 	VMOVSD xmm m64
25794// 	VMOVSD xmm xmm xmm
25795func VMOVSD(ops ...operand.Op) (*intrep.Instruction, error) {
25796	switch {
25797	case len(ops) == 2 && operand.IsM64(ops[0]) && operand.IsXMM(ops[1]):
25798		return &intrep.Instruction{
25799			Opcode:   "VMOVSD",
25800			Operands: ops,
25801			Inputs:   []operand.Op{ops[0]},
25802			Outputs:  []operand.Op{ops[1]},
25803			ISA:      []string{"AVX"},
25804		}, nil
25805	case len(ops) == 2 && operand.IsXMM(ops[0]) && operand.IsM64(ops[1]):
25806		return &intrep.Instruction{
25807			Opcode:   "VMOVSD",
25808			Operands: ops,
25809			Inputs:   []operand.Op{ops[0]},
25810			Outputs:  []operand.Op{ops[1]},
25811			ISA:      []string{"AVX"},
25812		}, nil
25813	case len(ops) == 3 && operand.IsXMM(ops[0]) && operand.IsXMM(ops[1]) && operand.IsXMM(ops[2]):
25814		return &intrep.Instruction{
25815			Opcode:   "VMOVSD",
25816			Operands: ops,
25817			Inputs:   []operand.Op{ops[0], ops[1]},
25818			Outputs:  []operand.Op{ops[2]},
25819			ISA:      []string{"AVX"},
25820		}, nil
25821	}
25822	return nil, errors.New("VMOVSD: bad operands")
25823}
25824
25825// VMOVSHDUP: Move Packed Single-FP High and Duplicate.
25826//
25827// Forms:
25828//
25829// 	VMOVSHDUP xmm  xmm
25830// 	VMOVSHDUP m128 xmm
25831// 	VMOVSHDUP ymm  ymm
25832// 	VMOVSHDUP m256 ymm
25833func VMOVSHDUP(mxy, xy operand.Op) (*intrep.Instruction, error) {
25834	switch {
25835	case operand.IsXMM(mxy) && operand.IsXMM(xy):
25836		return &intrep.Instruction{
25837			Opcode:   "VMOVSHDUP",
25838			Operands: []operand.Op{mxy, xy},
25839			Inputs:   []operand.Op{mxy},
25840			Outputs:  []operand.Op{xy},
25841			ISA:      []string{"AVX"},
25842		}, nil
25843	case operand.IsM128(mxy) && operand.IsXMM(xy):
25844		return &intrep.Instruction{
25845			Opcode:   "VMOVSHDUP",
25846			Operands: []operand.Op{mxy, xy},
25847			Inputs:   []operand.Op{mxy},
25848			Outputs:  []operand.Op{xy},
25849			ISA:      []string{"AVX"},
25850		}, nil
25851	case operand.IsYMM(mxy) && operand.IsYMM(xy):
25852		return &intrep.Instruction{
25853			Opcode:   "VMOVSHDUP",
25854			Operands: []operand.Op{mxy, xy},
25855			Inputs:   []operand.Op{mxy},
25856			Outputs:  []operand.Op{xy},
25857			ISA:      []string{"AVX"},
25858		}, nil
25859	case operand.IsM256(mxy) && operand.IsYMM(xy):
25860		return &intrep.Instruction{
25861			Opcode:   "VMOVSHDUP",
25862			Operands: []operand.Op{mxy, xy},
25863			Inputs:   []operand.Op{mxy},
25864			Outputs:  []operand.Op{xy},
25865			ISA:      []string{"AVX"},
25866		}, nil
25867	}
25868	return nil, errors.New("VMOVSHDUP: bad operands")
25869}
25870
25871// VMOVSLDUP: Move Packed Single-FP Low and Duplicate.
25872//
25873// Forms:
25874//
25875// 	VMOVSLDUP xmm  xmm
25876// 	VMOVSLDUP m128 xmm
25877// 	VMOVSLDUP ymm  ymm
25878// 	VMOVSLDUP m256 ymm
25879func VMOVSLDUP(mxy, xy operand.Op) (*intrep.Instruction, error) {
25880	switch {
25881	case operand.IsXMM(mxy) && operand.IsXMM(xy):
25882		return &intrep.Instruction{
25883			Opcode:   "VMOVSLDUP",
25884			Operands: []operand.Op{mxy, xy},
25885			Inputs:   []operand.Op{mxy},
25886			Outputs:  []operand.Op{xy},
25887			ISA:      []string{"AVX"},
25888		}, nil
25889	case operand.IsM128(mxy) && operand.IsXMM(xy):
25890		return &intrep.Instruction{
25891			Opcode:   "VMOVSLDUP",
25892			Operands: []operand.Op{mxy, xy},
25893			Inputs:   []operand.Op{mxy},
25894			Outputs:  []operand.Op{xy},
25895			ISA:      []string{"AVX"},
25896		}, nil
25897	case operand.IsYMM(mxy) && operand.IsYMM(xy):
25898		return &intrep.Instruction{
25899			Opcode:   "VMOVSLDUP",
25900			Operands: []operand.Op{mxy, xy},
25901			Inputs:   []operand.Op{mxy},
25902			Outputs:  []operand.Op{xy},
25903			ISA:      []string{"AVX"},
25904		}, nil
25905	case operand.IsM256(mxy) && operand.IsYMM(xy):
25906		return &intrep.Instruction{
25907			Opcode:   "VMOVSLDUP",
25908			Operands: []operand.Op{mxy, xy},
25909			Inputs:   []operand.Op{mxy},
25910			Outputs:  []operand.Op{xy},
25911			ISA:      []string{"AVX"},
25912		}, nil
25913	}
25914	return nil, errors.New("VMOVSLDUP: bad operands")
25915}
25916
25917// VMOVSS: Move Scalar Single-Precision Floating-Point Values.
25918//
25919// Forms:
25920//
25921// 	VMOVSS m32 xmm
25922// 	VMOVSS xmm m32
25923// 	VMOVSS xmm xmm xmm
25924func VMOVSS(ops ...operand.Op) (*intrep.Instruction, error) {
25925	switch {
25926	case len(ops) == 2 && operand.IsM32(ops[0]) && operand.IsXMM(ops[1]):
25927		return &intrep.Instruction{
25928			Opcode:   "VMOVSS",
25929			Operands: ops,
25930			Inputs:   []operand.Op{ops[0]},
25931			Outputs:  []operand.Op{ops[1]},
25932			ISA:      []string{"AVX"},
25933		}, nil
25934	case len(ops) == 2 && operand.IsXMM(ops[0]) && operand.IsM32(ops[1]):
25935		return &intrep.Instruction{
25936			Opcode:   "VMOVSS",
25937			Operands: ops,
25938			Inputs:   []operand.Op{ops[0]},
25939			Outputs:  []operand.Op{ops[1]},
25940			ISA:      []string{"AVX"},
25941		}, nil
25942	case len(ops) == 3 && operand.IsXMM(ops[0]) && operand.IsXMM(ops[1]) && operand.IsXMM(ops[2]):
25943		return &intrep.Instruction{
25944			Opcode:   "VMOVSS",
25945			Operands: ops,
25946			Inputs:   []operand.Op{ops[0], ops[1]},
25947			Outputs:  []operand.Op{ops[2]},
25948			ISA:      []string{"AVX"},
25949		}, nil
25950	}
25951	return nil, errors.New("VMOVSS: bad operands")
25952}
25953
25954// VMOVUPD: Move Unaligned Packed Double-Precision Floating-Point Values.
25955//
25956// Forms:
25957//
25958// 	VMOVUPD xmm  xmm
25959// 	VMOVUPD m128 xmm
25960// 	VMOVUPD ymm  ymm
25961// 	VMOVUPD m256 ymm
25962// 	VMOVUPD xmm  m128
25963// 	VMOVUPD ymm  m256
25964func VMOVUPD(mxy, mxy1 operand.Op) (*intrep.Instruction, error) {
25965	switch {
25966	case operand.IsXMM(mxy) && operand.IsXMM(mxy1):
25967		return &intrep.Instruction{
25968			Opcode:   "VMOVUPD",
25969			Operands: []operand.Op{mxy, mxy1},
25970			Inputs:   []operand.Op{mxy},
25971			Outputs:  []operand.Op{mxy1},
25972			ISA:      []string{"AVX"},
25973		}, nil
25974	case operand.IsM128(mxy) && operand.IsXMM(mxy1):
25975		return &intrep.Instruction{
25976			Opcode:   "VMOVUPD",
25977			Operands: []operand.Op{mxy, mxy1},
25978			Inputs:   []operand.Op{mxy},
25979			Outputs:  []operand.Op{mxy1},
25980			ISA:      []string{"AVX"},
25981		}, nil
25982	case operand.IsYMM(mxy) && operand.IsYMM(mxy1):
25983		return &intrep.Instruction{
25984			Opcode:   "VMOVUPD",
25985			Operands: []operand.Op{mxy, mxy1},
25986			Inputs:   []operand.Op{mxy},
25987			Outputs:  []operand.Op{mxy1},
25988			ISA:      []string{"AVX"},
25989		}, nil
25990	case operand.IsM256(mxy) && operand.IsYMM(mxy1):
25991		return &intrep.Instruction{
25992			Opcode:   "VMOVUPD",
25993			Operands: []operand.Op{mxy, mxy1},
25994			Inputs:   []operand.Op{mxy},
25995			Outputs:  []operand.Op{mxy1},
25996			ISA:      []string{"AVX"},
25997		}, nil
25998	case operand.IsXMM(mxy) && operand.IsM128(mxy1):
25999		return &intrep.Instruction{
26000			Opcode:   "VMOVUPD",
26001			Operands: []operand.Op{mxy, mxy1},
26002			Inputs:   []operand.Op{mxy},
26003			Outputs:  []operand.Op{mxy1},
26004			ISA:      []string{"AVX"},
26005		}, nil
26006	case operand.IsYMM(mxy) && operand.IsM256(mxy1):
26007		return &intrep.Instruction{
26008			Opcode:   "VMOVUPD",
26009			Operands: []operand.Op{mxy, mxy1},
26010			Inputs:   []operand.Op{mxy},
26011			Outputs:  []operand.Op{mxy1},
26012			ISA:      []string{"AVX"},
26013		}, nil
26014	}
26015	return nil, errors.New("VMOVUPD: bad operands")
26016}
26017
26018// VMOVUPS: Move Unaligned Packed Single-Precision Floating-Point Values.
26019//
26020// Forms:
26021//
26022// 	VMOVUPS xmm  xmm
26023// 	VMOVUPS m128 xmm
26024// 	VMOVUPS ymm  ymm
26025// 	VMOVUPS m256 ymm
26026// 	VMOVUPS xmm  m128
26027// 	VMOVUPS ymm  m256
26028func VMOVUPS(mxy, mxy1 operand.Op) (*intrep.Instruction, error) {
26029	switch {
26030	case operand.IsXMM(mxy) && operand.IsXMM(mxy1):
26031		return &intrep.Instruction{
26032			Opcode:   "VMOVUPS",
26033			Operands: []operand.Op{mxy, mxy1},
26034			Inputs:   []operand.Op{mxy},
26035			Outputs:  []operand.Op{mxy1},
26036			ISA:      []string{"AVX"},
26037		}, nil
26038	case operand.IsM128(mxy) && operand.IsXMM(mxy1):
26039		return &intrep.Instruction{
26040			Opcode:   "VMOVUPS",
26041			Operands: []operand.Op{mxy, mxy1},
26042			Inputs:   []operand.Op{mxy},
26043			Outputs:  []operand.Op{mxy1},
26044			ISA:      []string{"AVX"},
26045		}, nil
26046	case operand.IsYMM(mxy) && operand.IsYMM(mxy1):
26047		return &intrep.Instruction{
26048			Opcode:   "VMOVUPS",
26049			Operands: []operand.Op{mxy, mxy1},
26050			Inputs:   []operand.Op{mxy},
26051			Outputs:  []operand.Op{mxy1},
26052			ISA:      []string{"AVX"},
26053		}, nil
26054	case operand.IsM256(mxy) && operand.IsYMM(mxy1):
26055		return &intrep.Instruction{
26056			Opcode:   "VMOVUPS",
26057			Operands: []operand.Op{mxy, mxy1},
26058			Inputs:   []operand.Op{mxy},
26059			Outputs:  []operand.Op{mxy1},
26060			ISA:      []string{"AVX"},
26061		}, nil
26062	case operand.IsXMM(mxy) && operand.IsM128(mxy1):
26063		return &intrep.Instruction{
26064			Opcode:   "VMOVUPS",
26065			Operands: []operand.Op{mxy, mxy1},
26066			Inputs:   []operand.Op{mxy},
26067			Outputs:  []operand.Op{mxy1},
26068			ISA:      []string{"AVX"},
26069		}, nil
26070	case operand.IsYMM(mxy) && operand.IsM256(mxy1):
26071		return &intrep.Instruction{
26072			Opcode:   "VMOVUPS",
26073			Operands: []operand.Op{mxy, mxy1},
26074			Inputs:   []operand.Op{mxy},
26075			Outputs:  []operand.Op{mxy1},
26076			ISA:      []string{"AVX"},
26077		}, nil
26078	}
26079	return nil, errors.New("VMOVUPS: bad operands")
26080}
26081
26082// VMPSADBW: Compute Multiple Packed Sums of Absolute Difference.
26083//
26084// Forms:
26085//
26086// 	VMPSADBW imm8 xmm  xmm xmm
26087// 	VMPSADBW imm8 m128 xmm xmm
26088// 	VMPSADBW imm8 ymm  ymm ymm
26089// 	VMPSADBW imm8 m256 ymm ymm
26090func VMPSADBW(i, mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
26091	switch {
26092	case operand.IsIMM8(i) && operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
26093		return &intrep.Instruction{
26094			Opcode:   "VMPSADBW",
26095			Operands: []operand.Op{i, mxy, xy, xy1},
26096			Inputs:   []operand.Op{mxy, xy},
26097			Outputs:  []operand.Op{xy1},
26098			ISA:      []string{"AVX"},
26099		}, nil
26100	case operand.IsIMM8(i) && operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
26101		return &intrep.Instruction{
26102			Opcode:   "VMPSADBW",
26103			Operands: []operand.Op{i, mxy, xy, xy1},
26104			Inputs:   []operand.Op{mxy, xy},
26105			Outputs:  []operand.Op{xy1},
26106			ISA:      []string{"AVX"},
26107		}, nil
26108	case operand.IsIMM8(i) && operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
26109		return &intrep.Instruction{
26110			Opcode:   "VMPSADBW",
26111			Operands: []operand.Op{i, mxy, xy, xy1},
26112			Inputs:   []operand.Op{mxy, xy},
26113			Outputs:  []operand.Op{xy1},
26114			ISA:      []string{"AVX2"},
26115		}, nil
26116	case operand.IsIMM8(i) && operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
26117		return &intrep.Instruction{
26118			Opcode:   "VMPSADBW",
26119			Operands: []operand.Op{i, mxy, xy, xy1},
26120			Inputs:   []operand.Op{mxy, xy},
26121			Outputs:  []operand.Op{xy1},
26122			ISA:      []string{"AVX2"},
26123		}, nil
26124	}
26125	return nil, errors.New("VMPSADBW: bad operands")
26126}
26127
26128// VMULPD: Multiply Packed Double-Precision Floating-Point Values.
26129//
26130// Forms:
26131//
26132// 	VMULPD xmm  xmm xmm
26133// 	VMULPD m128 xmm xmm
26134// 	VMULPD ymm  ymm ymm
26135// 	VMULPD m256 ymm ymm
26136func VMULPD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
26137	switch {
26138	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
26139		return &intrep.Instruction{
26140			Opcode:   "VMULPD",
26141			Operands: []operand.Op{mxy, xy, xy1},
26142			Inputs:   []operand.Op{mxy, xy},
26143			Outputs:  []operand.Op{xy1},
26144			ISA:      []string{"AVX"},
26145		}, nil
26146	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
26147		return &intrep.Instruction{
26148			Opcode:   "VMULPD",
26149			Operands: []operand.Op{mxy, xy, xy1},
26150			Inputs:   []operand.Op{mxy, xy},
26151			Outputs:  []operand.Op{xy1},
26152			ISA:      []string{"AVX"},
26153		}, nil
26154	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
26155		return &intrep.Instruction{
26156			Opcode:   "VMULPD",
26157			Operands: []operand.Op{mxy, xy, xy1},
26158			Inputs:   []operand.Op{mxy, xy},
26159			Outputs:  []operand.Op{xy1},
26160			ISA:      []string{"AVX"},
26161		}, nil
26162	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
26163		return &intrep.Instruction{
26164			Opcode:   "VMULPD",
26165			Operands: []operand.Op{mxy, xy, xy1},
26166			Inputs:   []operand.Op{mxy, xy},
26167			Outputs:  []operand.Op{xy1},
26168			ISA:      []string{"AVX"},
26169		}, nil
26170	}
26171	return nil, errors.New("VMULPD: bad operands")
26172}
26173
26174// VMULPS: Multiply Packed Single-Precision Floating-Point Values.
26175//
26176// Forms:
26177//
26178// 	VMULPS xmm  xmm xmm
26179// 	VMULPS m128 xmm xmm
26180// 	VMULPS ymm  ymm ymm
26181// 	VMULPS m256 ymm ymm
26182func VMULPS(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
26183	switch {
26184	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
26185		return &intrep.Instruction{
26186			Opcode:   "VMULPS",
26187			Operands: []operand.Op{mxy, xy, xy1},
26188			Inputs:   []operand.Op{mxy, xy},
26189			Outputs:  []operand.Op{xy1},
26190			ISA:      []string{"AVX"},
26191		}, nil
26192	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
26193		return &intrep.Instruction{
26194			Opcode:   "VMULPS",
26195			Operands: []operand.Op{mxy, xy, xy1},
26196			Inputs:   []operand.Op{mxy, xy},
26197			Outputs:  []operand.Op{xy1},
26198			ISA:      []string{"AVX"},
26199		}, nil
26200	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
26201		return &intrep.Instruction{
26202			Opcode:   "VMULPS",
26203			Operands: []operand.Op{mxy, xy, xy1},
26204			Inputs:   []operand.Op{mxy, xy},
26205			Outputs:  []operand.Op{xy1},
26206			ISA:      []string{"AVX"},
26207		}, nil
26208	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
26209		return &intrep.Instruction{
26210			Opcode:   "VMULPS",
26211			Operands: []operand.Op{mxy, xy, xy1},
26212			Inputs:   []operand.Op{mxy, xy},
26213			Outputs:  []operand.Op{xy1},
26214			ISA:      []string{"AVX"},
26215		}, nil
26216	}
26217	return nil, errors.New("VMULPS: bad operands")
26218}
26219
26220// VMULSD: Multiply Scalar Double-Precision Floating-Point Values.
26221//
26222// Forms:
26223//
26224// 	VMULSD xmm xmm xmm
26225// 	VMULSD m64 xmm xmm
26226func VMULSD(mx, x, x1 operand.Op) (*intrep.Instruction, error) {
26227	switch {
26228	case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
26229		return &intrep.Instruction{
26230			Opcode:   "VMULSD",
26231			Operands: []operand.Op{mx, x, x1},
26232			Inputs:   []operand.Op{mx, x},
26233			Outputs:  []operand.Op{x1},
26234			ISA:      []string{"AVX"},
26235		}, nil
26236	case operand.IsM64(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
26237		return &intrep.Instruction{
26238			Opcode:   "VMULSD",
26239			Operands: []operand.Op{mx, x, x1},
26240			Inputs:   []operand.Op{mx, x},
26241			Outputs:  []operand.Op{x1},
26242			ISA:      []string{"AVX"},
26243		}, nil
26244	}
26245	return nil, errors.New("VMULSD: bad operands")
26246}
26247
26248// VMULSS: Multiply Scalar Single-Precision Floating-Point Values.
26249//
26250// Forms:
26251//
26252// 	VMULSS xmm xmm xmm
26253// 	VMULSS m32 xmm xmm
26254func VMULSS(mx, x, x1 operand.Op) (*intrep.Instruction, error) {
26255	switch {
26256	case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
26257		return &intrep.Instruction{
26258			Opcode:   "VMULSS",
26259			Operands: []operand.Op{mx, x, x1},
26260			Inputs:   []operand.Op{mx, x},
26261			Outputs:  []operand.Op{x1},
26262			ISA:      []string{"AVX"},
26263		}, nil
26264	case operand.IsM32(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
26265		return &intrep.Instruction{
26266			Opcode:   "VMULSS",
26267			Operands: []operand.Op{mx, x, x1},
26268			Inputs:   []operand.Op{mx, x},
26269			Outputs:  []operand.Op{x1},
26270			ISA:      []string{"AVX"},
26271		}, nil
26272	}
26273	return nil, errors.New("VMULSS: bad operands")
26274}
26275
26276// VORPD: Bitwise Logical OR of Double-Precision Floating-Point Values.
26277//
26278// Forms:
26279//
26280// 	VORPD xmm  xmm xmm
26281// 	VORPD m128 xmm xmm
26282// 	VORPD ymm  ymm ymm
26283// 	VORPD m256 ymm ymm
26284func VORPD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
26285	switch {
26286	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
26287		return &intrep.Instruction{
26288			Opcode:   "VORPD",
26289			Operands: []operand.Op{mxy, xy, xy1},
26290			Inputs:   []operand.Op{mxy, xy},
26291			Outputs:  []operand.Op{xy1},
26292			ISA:      []string{"AVX"},
26293		}, nil
26294	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
26295		return &intrep.Instruction{
26296			Opcode:   "VORPD",
26297			Operands: []operand.Op{mxy, xy, xy1},
26298			Inputs:   []operand.Op{mxy, xy},
26299			Outputs:  []operand.Op{xy1},
26300			ISA:      []string{"AVX"},
26301		}, nil
26302	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
26303		return &intrep.Instruction{
26304			Opcode:   "VORPD",
26305			Operands: []operand.Op{mxy, xy, xy1},
26306			Inputs:   []operand.Op{mxy, xy},
26307			Outputs:  []operand.Op{xy1},
26308			ISA:      []string{"AVX"},
26309		}, nil
26310	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
26311		return &intrep.Instruction{
26312			Opcode:   "VORPD",
26313			Operands: []operand.Op{mxy, xy, xy1},
26314			Inputs:   []operand.Op{mxy, xy},
26315			Outputs:  []operand.Op{xy1},
26316			ISA:      []string{"AVX"},
26317		}, nil
26318	}
26319	return nil, errors.New("VORPD: bad operands")
26320}
26321
26322// VORPS: Bitwise Logical OR of Single-Precision Floating-Point Values.
26323//
26324// Forms:
26325//
26326// 	VORPS xmm  xmm xmm
26327// 	VORPS m128 xmm xmm
26328// 	VORPS ymm  ymm ymm
26329// 	VORPS m256 ymm ymm
26330func VORPS(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
26331	switch {
26332	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
26333		return &intrep.Instruction{
26334			Opcode:   "VORPS",
26335			Operands: []operand.Op{mxy, xy, xy1},
26336			Inputs:   []operand.Op{mxy, xy},
26337			Outputs:  []operand.Op{xy1},
26338			ISA:      []string{"AVX"},
26339		}, nil
26340	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
26341		return &intrep.Instruction{
26342			Opcode:   "VORPS",
26343			Operands: []operand.Op{mxy, xy, xy1},
26344			Inputs:   []operand.Op{mxy, xy},
26345			Outputs:  []operand.Op{xy1},
26346			ISA:      []string{"AVX"},
26347		}, nil
26348	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
26349		return &intrep.Instruction{
26350			Opcode:   "VORPS",
26351			Operands: []operand.Op{mxy, xy, xy1},
26352			Inputs:   []operand.Op{mxy, xy},
26353			Outputs:  []operand.Op{xy1},
26354			ISA:      []string{"AVX"},
26355		}, nil
26356	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
26357		return &intrep.Instruction{
26358			Opcode:   "VORPS",
26359			Operands: []operand.Op{mxy, xy, xy1},
26360			Inputs:   []operand.Op{mxy, xy},
26361			Outputs:  []operand.Op{xy1},
26362			ISA:      []string{"AVX"},
26363		}, nil
26364	}
26365	return nil, errors.New("VORPS: bad operands")
26366}
26367
26368// VPABSB: Packed Absolute Value of Byte Integers.
26369//
26370// Forms:
26371//
26372// 	VPABSB xmm  xmm
26373// 	VPABSB m128 xmm
26374// 	VPABSB ymm  ymm
26375// 	VPABSB m256 ymm
26376func VPABSB(mxy, xy operand.Op) (*intrep.Instruction, error) {
26377	switch {
26378	case operand.IsXMM(mxy) && operand.IsXMM(xy):
26379		return &intrep.Instruction{
26380			Opcode:   "VPABSB",
26381			Operands: []operand.Op{mxy, xy},
26382			Inputs:   []operand.Op{mxy},
26383			Outputs:  []operand.Op{xy},
26384			ISA:      []string{"AVX"},
26385		}, nil
26386	case operand.IsM128(mxy) && operand.IsXMM(xy):
26387		return &intrep.Instruction{
26388			Opcode:   "VPABSB",
26389			Operands: []operand.Op{mxy, xy},
26390			Inputs:   []operand.Op{mxy},
26391			Outputs:  []operand.Op{xy},
26392			ISA:      []string{"AVX"},
26393		}, nil
26394	case operand.IsYMM(mxy) && operand.IsYMM(xy):
26395		return &intrep.Instruction{
26396			Opcode:   "VPABSB",
26397			Operands: []operand.Op{mxy, xy},
26398			Inputs:   []operand.Op{mxy},
26399			Outputs:  []operand.Op{xy},
26400			ISA:      []string{"AVX2"},
26401		}, nil
26402	case operand.IsM256(mxy) && operand.IsYMM(xy):
26403		return &intrep.Instruction{
26404			Opcode:   "VPABSB",
26405			Operands: []operand.Op{mxy, xy},
26406			Inputs:   []operand.Op{mxy},
26407			Outputs:  []operand.Op{xy},
26408			ISA:      []string{"AVX2"},
26409		}, nil
26410	}
26411	return nil, errors.New("VPABSB: bad operands")
26412}
26413
26414// VPABSD: Packed Absolute Value of Doubleword Integers.
26415//
26416// Forms:
26417//
26418// 	VPABSD xmm  xmm
26419// 	VPABSD m128 xmm
26420// 	VPABSD ymm  ymm
26421// 	VPABSD m256 ymm
26422func VPABSD(mxy, xy operand.Op) (*intrep.Instruction, error) {
26423	switch {
26424	case operand.IsXMM(mxy) && operand.IsXMM(xy):
26425		return &intrep.Instruction{
26426			Opcode:   "VPABSD",
26427			Operands: []operand.Op{mxy, xy},
26428			Inputs:   []operand.Op{mxy},
26429			Outputs:  []operand.Op{xy},
26430			ISA:      []string{"AVX"},
26431		}, nil
26432	case operand.IsM128(mxy) && operand.IsXMM(xy):
26433		return &intrep.Instruction{
26434			Opcode:   "VPABSD",
26435			Operands: []operand.Op{mxy, xy},
26436			Inputs:   []operand.Op{mxy},
26437			Outputs:  []operand.Op{xy},
26438			ISA:      []string{"AVX"},
26439		}, nil
26440	case operand.IsYMM(mxy) && operand.IsYMM(xy):
26441		return &intrep.Instruction{
26442			Opcode:   "VPABSD",
26443			Operands: []operand.Op{mxy, xy},
26444			Inputs:   []operand.Op{mxy},
26445			Outputs:  []operand.Op{xy},
26446			ISA:      []string{"AVX2"},
26447		}, nil
26448	case operand.IsM256(mxy) && operand.IsYMM(xy):
26449		return &intrep.Instruction{
26450			Opcode:   "VPABSD",
26451			Operands: []operand.Op{mxy, xy},
26452			Inputs:   []operand.Op{mxy},
26453			Outputs:  []operand.Op{xy},
26454			ISA:      []string{"AVX2"},
26455		}, nil
26456	}
26457	return nil, errors.New("VPABSD: bad operands")
26458}
26459
26460// VPABSW: Packed Absolute Value of Word Integers.
26461//
26462// Forms:
26463//
26464// 	VPABSW xmm  xmm
26465// 	VPABSW m128 xmm
26466// 	VPABSW ymm  ymm
26467// 	VPABSW m256 ymm
26468func VPABSW(mxy, xy operand.Op) (*intrep.Instruction, error) {
26469	switch {
26470	case operand.IsXMM(mxy) && operand.IsXMM(xy):
26471		return &intrep.Instruction{
26472			Opcode:   "VPABSW",
26473			Operands: []operand.Op{mxy, xy},
26474			Inputs:   []operand.Op{mxy},
26475			Outputs:  []operand.Op{xy},
26476			ISA:      []string{"AVX"},
26477		}, nil
26478	case operand.IsM128(mxy) && operand.IsXMM(xy):
26479		return &intrep.Instruction{
26480			Opcode:   "VPABSW",
26481			Operands: []operand.Op{mxy, xy},
26482			Inputs:   []operand.Op{mxy},
26483			Outputs:  []operand.Op{xy},
26484			ISA:      []string{"AVX"},
26485		}, nil
26486	case operand.IsYMM(mxy) && operand.IsYMM(xy):
26487		return &intrep.Instruction{
26488			Opcode:   "VPABSW",
26489			Operands: []operand.Op{mxy, xy},
26490			Inputs:   []operand.Op{mxy},
26491			Outputs:  []operand.Op{xy},
26492			ISA:      []string{"AVX2"},
26493		}, nil
26494	case operand.IsM256(mxy) && operand.IsYMM(xy):
26495		return &intrep.Instruction{
26496			Opcode:   "VPABSW",
26497			Operands: []operand.Op{mxy, xy},
26498			Inputs:   []operand.Op{mxy},
26499			Outputs:  []operand.Op{xy},
26500			ISA:      []string{"AVX2"},
26501		}, nil
26502	}
26503	return nil, errors.New("VPABSW: bad operands")
26504}
26505
26506// VPACKSSDW: Pack Doublewords into Words with Signed Saturation.
26507//
26508// Forms:
26509//
26510// 	VPACKSSDW xmm  xmm xmm
26511// 	VPACKSSDW m128 xmm xmm
26512// 	VPACKSSDW ymm  ymm ymm
26513// 	VPACKSSDW m256 ymm ymm
26514func VPACKSSDW(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
26515	switch {
26516	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
26517		return &intrep.Instruction{
26518			Opcode:   "VPACKSSDW",
26519			Operands: []operand.Op{mxy, xy, xy1},
26520			Inputs:   []operand.Op{mxy, xy},
26521			Outputs:  []operand.Op{xy1},
26522			ISA:      []string{"AVX"},
26523		}, nil
26524	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
26525		return &intrep.Instruction{
26526			Opcode:   "VPACKSSDW",
26527			Operands: []operand.Op{mxy, xy, xy1},
26528			Inputs:   []operand.Op{mxy, xy},
26529			Outputs:  []operand.Op{xy1},
26530			ISA:      []string{"AVX"},
26531		}, nil
26532	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
26533		return &intrep.Instruction{
26534			Opcode:   "VPACKSSDW",
26535			Operands: []operand.Op{mxy, xy, xy1},
26536			Inputs:   []operand.Op{mxy, xy},
26537			Outputs:  []operand.Op{xy1},
26538			ISA:      []string{"AVX2"},
26539		}, nil
26540	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
26541		return &intrep.Instruction{
26542			Opcode:   "VPACKSSDW",
26543			Operands: []operand.Op{mxy, xy, xy1},
26544			Inputs:   []operand.Op{mxy, xy},
26545			Outputs:  []operand.Op{xy1},
26546			ISA:      []string{"AVX2"},
26547		}, nil
26548	}
26549	return nil, errors.New("VPACKSSDW: bad operands")
26550}
26551
26552// VPACKSSWB: Pack Words into Bytes with Signed Saturation.
26553//
26554// Forms:
26555//
26556// 	VPACKSSWB xmm  xmm xmm
26557// 	VPACKSSWB m128 xmm xmm
26558// 	VPACKSSWB ymm  ymm ymm
26559// 	VPACKSSWB m256 ymm ymm
26560func VPACKSSWB(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
26561	switch {
26562	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
26563		return &intrep.Instruction{
26564			Opcode:   "VPACKSSWB",
26565			Operands: []operand.Op{mxy, xy, xy1},
26566			Inputs:   []operand.Op{mxy, xy},
26567			Outputs:  []operand.Op{xy1},
26568			ISA:      []string{"AVX"},
26569		}, nil
26570	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
26571		return &intrep.Instruction{
26572			Opcode:   "VPACKSSWB",
26573			Operands: []operand.Op{mxy, xy, xy1},
26574			Inputs:   []operand.Op{mxy, xy},
26575			Outputs:  []operand.Op{xy1},
26576			ISA:      []string{"AVX"},
26577		}, nil
26578	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
26579		return &intrep.Instruction{
26580			Opcode:   "VPACKSSWB",
26581			Operands: []operand.Op{mxy, xy, xy1},
26582			Inputs:   []operand.Op{mxy, xy},
26583			Outputs:  []operand.Op{xy1},
26584			ISA:      []string{"AVX2"},
26585		}, nil
26586	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
26587		return &intrep.Instruction{
26588			Opcode:   "VPACKSSWB",
26589			Operands: []operand.Op{mxy, xy, xy1},
26590			Inputs:   []operand.Op{mxy, xy},
26591			Outputs:  []operand.Op{xy1},
26592			ISA:      []string{"AVX2"},
26593		}, nil
26594	}
26595	return nil, errors.New("VPACKSSWB: bad operands")
26596}
26597
26598// VPACKUSDW: Pack Doublewords into Words with Unsigned Saturation.
26599//
26600// Forms:
26601//
26602// 	VPACKUSDW xmm  xmm xmm
26603// 	VPACKUSDW m128 xmm xmm
26604// 	VPACKUSDW ymm  ymm ymm
26605// 	VPACKUSDW m256 ymm ymm
26606func VPACKUSDW(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
26607	switch {
26608	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
26609		return &intrep.Instruction{
26610			Opcode:   "VPACKUSDW",
26611			Operands: []operand.Op{mxy, xy, xy1},
26612			Inputs:   []operand.Op{mxy, xy},
26613			Outputs:  []operand.Op{xy1},
26614			ISA:      []string{"AVX"},
26615		}, nil
26616	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
26617		return &intrep.Instruction{
26618			Opcode:   "VPACKUSDW",
26619			Operands: []operand.Op{mxy, xy, xy1},
26620			Inputs:   []operand.Op{mxy, xy},
26621			Outputs:  []operand.Op{xy1},
26622			ISA:      []string{"AVX"},
26623		}, nil
26624	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
26625		return &intrep.Instruction{
26626			Opcode:   "VPACKUSDW",
26627			Operands: []operand.Op{mxy, xy, xy1},
26628			Inputs:   []operand.Op{mxy, xy},
26629			Outputs:  []operand.Op{xy1},
26630			ISA:      []string{"AVX2"},
26631		}, nil
26632	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
26633		return &intrep.Instruction{
26634			Opcode:   "VPACKUSDW",
26635			Operands: []operand.Op{mxy, xy, xy1},
26636			Inputs:   []operand.Op{mxy, xy},
26637			Outputs:  []operand.Op{xy1},
26638			ISA:      []string{"AVX2"},
26639		}, nil
26640	}
26641	return nil, errors.New("VPACKUSDW: bad operands")
26642}
26643
26644// VPACKUSWB: Pack Words into Bytes with Unsigned Saturation.
26645//
26646// Forms:
26647//
26648// 	VPACKUSWB xmm  xmm xmm
26649// 	VPACKUSWB m128 xmm xmm
26650// 	VPACKUSWB ymm  ymm ymm
26651// 	VPACKUSWB m256 ymm ymm
26652func VPACKUSWB(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
26653	switch {
26654	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
26655		return &intrep.Instruction{
26656			Opcode:   "VPACKUSWB",
26657			Operands: []operand.Op{mxy, xy, xy1},
26658			Inputs:   []operand.Op{mxy, xy},
26659			Outputs:  []operand.Op{xy1},
26660			ISA:      []string{"AVX"},
26661		}, nil
26662	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
26663		return &intrep.Instruction{
26664			Opcode:   "VPACKUSWB",
26665			Operands: []operand.Op{mxy, xy, xy1},
26666			Inputs:   []operand.Op{mxy, xy},
26667			Outputs:  []operand.Op{xy1},
26668			ISA:      []string{"AVX"},
26669		}, nil
26670	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
26671		return &intrep.Instruction{
26672			Opcode:   "VPACKUSWB",
26673			Operands: []operand.Op{mxy, xy, xy1},
26674			Inputs:   []operand.Op{mxy, xy},
26675			Outputs:  []operand.Op{xy1},
26676			ISA:      []string{"AVX2"},
26677		}, nil
26678	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
26679		return &intrep.Instruction{
26680			Opcode:   "VPACKUSWB",
26681			Operands: []operand.Op{mxy, xy, xy1},
26682			Inputs:   []operand.Op{mxy, xy},
26683			Outputs:  []operand.Op{xy1},
26684			ISA:      []string{"AVX2"},
26685		}, nil
26686	}
26687	return nil, errors.New("VPACKUSWB: bad operands")
26688}
26689
26690// VPADDB: Add Packed Byte Integers.
26691//
26692// Forms:
26693//
26694// 	VPADDB xmm  xmm xmm
26695// 	VPADDB m128 xmm xmm
26696// 	VPADDB ymm  ymm ymm
26697// 	VPADDB m256 ymm ymm
26698func VPADDB(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
26699	switch {
26700	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
26701		return &intrep.Instruction{
26702			Opcode:   "VPADDB",
26703			Operands: []operand.Op{mxy, xy, xy1},
26704			Inputs:   []operand.Op{mxy, xy},
26705			Outputs:  []operand.Op{xy1},
26706			ISA:      []string{"AVX"},
26707		}, nil
26708	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
26709		return &intrep.Instruction{
26710			Opcode:   "VPADDB",
26711			Operands: []operand.Op{mxy, xy, xy1},
26712			Inputs:   []operand.Op{mxy, xy},
26713			Outputs:  []operand.Op{xy1},
26714			ISA:      []string{"AVX"},
26715		}, nil
26716	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
26717		return &intrep.Instruction{
26718			Opcode:   "VPADDB",
26719			Operands: []operand.Op{mxy, xy, xy1},
26720			Inputs:   []operand.Op{mxy, xy},
26721			Outputs:  []operand.Op{xy1},
26722			ISA:      []string{"AVX2"},
26723		}, nil
26724	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
26725		return &intrep.Instruction{
26726			Opcode:   "VPADDB",
26727			Operands: []operand.Op{mxy, xy, xy1},
26728			Inputs:   []operand.Op{mxy, xy},
26729			Outputs:  []operand.Op{xy1},
26730			ISA:      []string{"AVX2"},
26731		}, nil
26732	}
26733	return nil, errors.New("VPADDB: bad operands")
26734}
26735
26736// VPADDD: Add Packed Doubleword Integers.
26737//
26738// Forms:
26739//
26740// 	VPADDD xmm  xmm xmm
26741// 	VPADDD m128 xmm xmm
26742// 	VPADDD ymm  ymm ymm
26743// 	VPADDD m256 ymm ymm
26744func VPADDD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
26745	switch {
26746	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
26747		return &intrep.Instruction{
26748			Opcode:   "VPADDD",
26749			Operands: []operand.Op{mxy, xy, xy1},
26750			Inputs:   []operand.Op{mxy, xy},
26751			Outputs:  []operand.Op{xy1},
26752			ISA:      []string{"AVX"},
26753		}, nil
26754	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
26755		return &intrep.Instruction{
26756			Opcode:   "VPADDD",
26757			Operands: []operand.Op{mxy, xy, xy1},
26758			Inputs:   []operand.Op{mxy, xy},
26759			Outputs:  []operand.Op{xy1},
26760			ISA:      []string{"AVX"},
26761		}, nil
26762	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
26763		return &intrep.Instruction{
26764			Opcode:   "VPADDD",
26765			Operands: []operand.Op{mxy, xy, xy1},
26766			Inputs:   []operand.Op{mxy, xy},
26767			Outputs:  []operand.Op{xy1},
26768			ISA:      []string{"AVX2"},
26769		}, nil
26770	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
26771		return &intrep.Instruction{
26772			Opcode:   "VPADDD",
26773			Operands: []operand.Op{mxy, xy, xy1},
26774			Inputs:   []operand.Op{mxy, xy},
26775			Outputs:  []operand.Op{xy1},
26776			ISA:      []string{"AVX2"},
26777		}, nil
26778	}
26779	return nil, errors.New("VPADDD: bad operands")
26780}
26781
26782// VPADDQ: Add Packed Quadword Integers.
26783//
26784// Forms:
26785//
26786// 	VPADDQ xmm  xmm xmm
26787// 	VPADDQ m128 xmm xmm
26788// 	VPADDQ ymm  ymm ymm
26789// 	VPADDQ m256 ymm ymm
26790func VPADDQ(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
26791	switch {
26792	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
26793		return &intrep.Instruction{
26794			Opcode:   "VPADDQ",
26795			Operands: []operand.Op{mxy, xy, xy1},
26796			Inputs:   []operand.Op{mxy, xy},
26797			Outputs:  []operand.Op{xy1},
26798			ISA:      []string{"AVX"},
26799		}, nil
26800	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
26801		return &intrep.Instruction{
26802			Opcode:   "VPADDQ",
26803			Operands: []operand.Op{mxy, xy, xy1},
26804			Inputs:   []operand.Op{mxy, xy},
26805			Outputs:  []operand.Op{xy1},
26806			ISA:      []string{"AVX"},
26807		}, nil
26808	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
26809		return &intrep.Instruction{
26810			Opcode:   "VPADDQ",
26811			Operands: []operand.Op{mxy, xy, xy1},
26812			Inputs:   []operand.Op{mxy, xy},
26813			Outputs:  []operand.Op{xy1},
26814			ISA:      []string{"AVX2"},
26815		}, nil
26816	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
26817		return &intrep.Instruction{
26818			Opcode:   "VPADDQ",
26819			Operands: []operand.Op{mxy, xy, xy1},
26820			Inputs:   []operand.Op{mxy, xy},
26821			Outputs:  []operand.Op{xy1},
26822			ISA:      []string{"AVX2"},
26823		}, nil
26824	}
26825	return nil, errors.New("VPADDQ: bad operands")
26826}
26827
26828// VPADDSB: Add Packed Signed Byte Integers with Signed Saturation.
26829//
26830// Forms:
26831//
26832// 	VPADDSB xmm  xmm xmm
26833// 	VPADDSB m128 xmm xmm
26834// 	VPADDSB ymm  ymm ymm
26835// 	VPADDSB m256 ymm ymm
26836func VPADDSB(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
26837	switch {
26838	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
26839		return &intrep.Instruction{
26840			Opcode:   "VPADDSB",
26841			Operands: []operand.Op{mxy, xy, xy1},
26842			Inputs:   []operand.Op{mxy, xy},
26843			Outputs:  []operand.Op{xy1},
26844			ISA:      []string{"AVX"},
26845		}, nil
26846	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
26847		return &intrep.Instruction{
26848			Opcode:   "VPADDSB",
26849			Operands: []operand.Op{mxy, xy, xy1},
26850			Inputs:   []operand.Op{mxy, xy},
26851			Outputs:  []operand.Op{xy1},
26852			ISA:      []string{"AVX"},
26853		}, nil
26854	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
26855		return &intrep.Instruction{
26856			Opcode:   "VPADDSB",
26857			Operands: []operand.Op{mxy, xy, xy1},
26858			Inputs:   []operand.Op{mxy, xy},
26859			Outputs:  []operand.Op{xy1},
26860			ISA:      []string{"AVX2"},
26861		}, nil
26862	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
26863		return &intrep.Instruction{
26864			Opcode:   "VPADDSB",
26865			Operands: []operand.Op{mxy, xy, xy1},
26866			Inputs:   []operand.Op{mxy, xy},
26867			Outputs:  []operand.Op{xy1},
26868			ISA:      []string{"AVX2"},
26869		}, nil
26870	}
26871	return nil, errors.New("VPADDSB: bad operands")
26872}
26873
26874// VPADDSW: Add Packed Signed Word Integers with Signed Saturation.
26875//
26876// Forms:
26877//
26878// 	VPADDSW xmm  xmm xmm
26879// 	VPADDSW m128 xmm xmm
26880// 	VPADDSW ymm  ymm ymm
26881// 	VPADDSW m256 ymm ymm
26882func VPADDSW(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
26883	switch {
26884	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
26885		return &intrep.Instruction{
26886			Opcode:   "VPADDSW",
26887			Operands: []operand.Op{mxy, xy, xy1},
26888			Inputs:   []operand.Op{mxy, xy},
26889			Outputs:  []operand.Op{xy1},
26890			ISA:      []string{"AVX"},
26891		}, nil
26892	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
26893		return &intrep.Instruction{
26894			Opcode:   "VPADDSW",
26895			Operands: []operand.Op{mxy, xy, xy1},
26896			Inputs:   []operand.Op{mxy, xy},
26897			Outputs:  []operand.Op{xy1},
26898			ISA:      []string{"AVX"},
26899		}, nil
26900	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
26901		return &intrep.Instruction{
26902			Opcode:   "VPADDSW",
26903			Operands: []operand.Op{mxy, xy, xy1},
26904			Inputs:   []operand.Op{mxy, xy},
26905			Outputs:  []operand.Op{xy1},
26906			ISA:      []string{"AVX2"},
26907		}, nil
26908	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
26909		return &intrep.Instruction{
26910			Opcode:   "VPADDSW",
26911			Operands: []operand.Op{mxy, xy, xy1},
26912			Inputs:   []operand.Op{mxy, xy},
26913			Outputs:  []operand.Op{xy1},
26914			ISA:      []string{"AVX2"},
26915		}, nil
26916	}
26917	return nil, errors.New("VPADDSW: bad operands")
26918}
26919
26920// VPADDUSB: Add Packed Unsigned Byte Integers with Unsigned Saturation.
26921//
26922// Forms:
26923//
26924// 	VPADDUSB xmm  xmm xmm
26925// 	VPADDUSB m128 xmm xmm
26926// 	VPADDUSB ymm  ymm ymm
26927// 	VPADDUSB m256 ymm ymm
26928func VPADDUSB(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
26929	switch {
26930	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
26931		return &intrep.Instruction{
26932			Opcode:   "VPADDUSB",
26933			Operands: []operand.Op{mxy, xy, xy1},
26934			Inputs:   []operand.Op{mxy, xy},
26935			Outputs:  []operand.Op{xy1},
26936			ISA:      []string{"AVX"},
26937		}, nil
26938	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
26939		return &intrep.Instruction{
26940			Opcode:   "VPADDUSB",
26941			Operands: []operand.Op{mxy, xy, xy1},
26942			Inputs:   []operand.Op{mxy, xy},
26943			Outputs:  []operand.Op{xy1},
26944			ISA:      []string{"AVX"},
26945		}, nil
26946	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
26947		return &intrep.Instruction{
26948			Opcode:   "VPADDUSB",
26949			Operands: []operand.Op{mxy, xy, xy1},
26950			Inputs:   []operand.Op{mxy, xy},
26951			Outputs:  []operand.Op{xy1},
26952			ISA:      []string{"AVX2"},
26953		}, nil
26954	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
26955		return &intrep.Instruction{
26956			Opcode:   "VPADDUSB",
26957			Operands: []operand.Op{mxy, xy, xy1},
26958			Inputs:   []operand.Op{mxy, xy},
26959			Outputs:  []operand.Op{xy1},
26960			ISA:      []string{"AVX2"},
26961		}, nil
26962	}
26963	return nil, errors.New("VPADDUSB: bad operands")
26964}
26965
26966// VPADDUSW: Add Packed Unsigned Word Integers with Unsigned Saturation.
26967//
26968// Forms:
26969//
26970// 	VPADDUSW xmm  xmm xmm
26971// 	VPADDUSW m128 xmm xmm
26972// 	VPADDUSW ymm  ymm ymm
26973// 	VPADDUSW m256 ymm ymm
26974func VPADDUSW(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
26975	switch {
26976	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
26977		return &intrep.Instruction{
26978			Opcode:   "VPADDUSW",
26979			Operands: []operand.Op{mxy, xy, xy1},
26980			Inputs:   []operand.Op{mxy, xy},
26981			Outputs:  []operand.Op{xy1},
26982			ISA:      []string{"AVX"},
26983		}, nil
26984	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
26985		return &intrep.Instruction{
26986			Opcode:   "VPADDUSW",
26987			Operands: []operand.Op{mxy, xy, xy1},
26988			Inputs:   []operand.Op{mxy, xy},
26989			Outputs:  []operand.Op{xy1},
26990			ISA:      []string{"AVX"},
26991		}, nil
26992	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
26993		return &intrep.Instruction{
26994			Opcode:   "VPADDUSW",
26995			Operands: []operand.Op{mxy, xy, xy1},
26996			Inputs:   []operand.Op{mxy, xy},
26997			Outputs:  []operand.Op{xy1},
26998			ISA:      []string{"AVX2"},
26999		}, nil
27000	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
27001		return &intrep.Instruction{
27002			Opcode:   "VPADDUSW",
27003			Operands: []operand.Op{mxy, xy, xy1},
27004			Inputs:   []operand.Op{mxy, xy},
27005			Outputs:  []operand.Op{xy1},
27006			ISA:      []string{"AVX2"},
27007		}, nil
27008	}
27009	return nil, errors.New("VPADDUSW: bad operands")
27010}
27011
27012// VPADDW: Add Packed Word Integers.
27013//
27014// Forms:
27015//
27016// 	VPADDW xmm  xmm xmm
27017// 	VPADDW m128 xmm xmm
27018// 	VPADDW ymm  ymm ymm
27019// 	VPADDW m256 ymm ymm
27020func VPADDW(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
27021	switch {
27022	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
27023		return &intrep.Instruction{
27024			Opcode:   "VPADDW",
27025			Operands: []operand.Op{mxy, xy, xy1},
27026			Inputs:   []operand.Op{mxy, xy},
27027			Outputs:  []operand.Op{xy1},
27028			ISA:      []string{"AVX"},
27029		}, nil
27030	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
27031		return &intrep.Instruction{
27032			Opcode:   "VPADDW",
27033			Operands: []operand.Op{mxy, xy, xy1},
27034			Inputs:   []operand.Op{mxy, xy},
27035			Outputs:  []operand.Op{xy1},
27036			ISA:      []string{"AVX"},
27037		}, nil
27038	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
27039		return &intrep.Instruction{
27040			Opcode:   "VPADDW",
27041			Operands: []operand.Op{mxy, xy, xy1},
27042			Inputs:   []operand.Op{mxy, xy},
27043			Outputs:  []operand.Op{xy1},
27044			ISA:      []string{"AVX2"},
27045		}, nil
27046	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
27047		return &intrep.Instruction{
27048			Opcode:   "VPADDW",
27049			Operands: []operand.Op{mxy, xy, xy1},
27050			Inputs:   []operand.Op{mxy, xy},
27051			Outputs:  []operand.Op{xy1},
27052			ISA:      []string{"AVX2"},
27053		}, nil
27054	}
27055	return nil, errors.New("VPADDW: bad operands")
27056}
27057
27058// VPALIGNR: Packed Align Right.
27059//
27060// Forms:
27061//
27062// 	VPALIGNR imm8 xmm  xmm xmm
27063// 	VPALIGNR imm8 m128 xmm xmm
27064// 	VPALIGNR imm8 ymm  ymm ymm
27065// 	VPALIGNR imm8 m256 ymm ymm
27066func VPALIGNR(i, mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
27067	switch {
27068	case operand.IsIMM8(i) && operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
27069		return &intrep.Instruction{
27070			Opcode:   "VPALIGNR",
27071			Operands: []operand.Op{i, mxy, xy, xy1},
27072			Inputs:   []operand.Op{mxy, xy},
27073			Outputs:  []operand.Op{xy1},
27074			ISA:      []string{"AVX"},
27075		}, nil
27076	case operand.IsIMM8(i) && operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
27077		return &intrep.Instruction{
27078			Opcode:   "VPALIGNR",
27079			Operands: []operand.Op{i, mxy, xy, xy1},
27080			Inputs:   []operand.Op{mxy, xy},
27081			Outputs:  []operand.Op{xy1},
27082			ISA:      []string{"AVX"},
27083		}, nil
27084	case operand.IsIMM8(i) && operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
27085		return &intrep.Instruction{
27086			Opcode:   "VPALIGNR",
27087			Operands: []operand.Op{i, mxy, xy, xy1},
27088			Inputs:   []operand.Op{mxy, xy},
27089			Outputs:  []operand.Op{xy1},
27090			ISA:      []string{"AVX2"},
27091		}, nil
27092	case operand.IsIMM8(i) && operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
27093		return &intrep.Instruction{
27094			Opcode:   "VPALIGNR",
27095			Operands: []operand.Op{i, mxy, xy, xy1},
27096			Inputs:   []operand.Op{mxy, xy},
27097			Outputs:  []operand.Op{xy1},
27098			ISA:      []string{"AVX2"},
27099		}, nil
27100	}
27101	return nil, errors.New("VPALIGNR: bad operands")
27102}
27103
27104// VPAND: Packed Bitwise Logical AND.
27105//
27106// Forms:
27107//
27108// 	VPAND xmm  xmm xmm
27109// 	VPAND m128 xmm xmm
27110// 	VPAND ymm  ymm ymm
27111// 	VPAND m256 ymm ymm
27112func VPAND(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
27113	switch {
27114	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
27115		return &intrep.Instruction{
27116			Opcode:   "VPAND",
27117			Operands: []operand.Op{mxy, xy, xy1},
27118			Inputs:   []operand.Op{mxy, xy},
27119			Outputs:  []operand.Op{xy1},
27120			ISA:      []string{"AVX"},
27121		}, nil
27122	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
27123		return &intrep.Instruction{
27124			Opcode:   "VPAND",
27125			Operands: []operand.Op{mxy, xy, xy1},
27126			Inputs:   []operand.Op{mxy, xy},
27127			Outputs:  []operand.Op{xy1},
27128			ISA:      []string{"AVX"},
27129		}, nil
27130	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
27131		return &intrep.Instruction{
27132			Opcode:   "VPAND",
27133			Operands: []operand.Op{mxy, xy, xy1},
27134			Inputs:   []operand.Op{mxy, xy},
27135			Outputs:  []operand.Op{xy1},
27136			ISA:      []string{"AVX2"},
27137		}, nil
27138	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
27139		return &intrep.Instruction{
27140			Opcode:   "VPAND",
27141			Operands: []operand.Op{mxy, xy, xy1},
27142			Inputs:   []operand.Op{mxy, xy},
27143			Outputs:  []operand.Op{xy1},
27144			ISA:      []string{"AVX2"},
27145		}, nil
27146	}
27147	return nil, errors.New("VPAND: bad operands")
27148}
27149
27150// VPANDN: Packed Bitwise Logical AND NOT.
27151//
27152// Forms:
27153//
27154// 	VPANDN xmm  xmm xmm
27155// 	VPANDN m128 xmm xmm
27156// 	VPANDN ymm  ymm ymm
27157// 	VPANDN m256 ymm ymm
27158func VPANDN(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
27159	switch {
27160	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
27161		return &intrep.Instruction{
27162			Opcode:           "VPANDN",
27163			Operands:         []operand.Op{mxy, xy, xy1},
27164			Inputs:           []operand.Op{mxy, xy},
27165			Outputs:          []operand.Op{xy1},
27166			ISA:              []string{"AVX"},
27167			CancellingInputs: true,
27168		}, nil
27169	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
27170		return &intrep.Instruction{
27171			Opcode:   "VPANDN",
27172			Operands: []operand.Op{mxy, xy, xy1},
27173			Inputs:   []operand.Op{mxy, xy},
27174			Outputs:  []operand.Op{xy1},
27175			ISA:      []string{"AVX"},
27176		}, nil
27177	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
27178		return &intrep.Instruction{
27179			Opcode:           "VPANDN",
27180			Operands:         []operand.Op{mxy, xy, xy1},
27181			Inputs:           []operand.Op{mxy, xy},
27182			Outputs:          []operand.Op{xy1},
27183			ISA:              []string{"AVX2"},
27184			CancellingInputs: true,
27185		}, nil
27186	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
27187		return &intrep.Instruction{
27188			Opcode:   "VPANDN",
27189			Operands: []operand.Op{mxy, xy, xy1},
27190			Inputs:   []operand.Op{mxy, xy},
27191			Outputs:  []operand.Op{xy1},
27192			ISA:      []string{"AVX2"},
27193		}, nil
27194	}
27195	return nil, errors.New("VPANDN: bad operands")
27196}
27197
27198// VPAVGB: Average Packed Byte Integers.
27199//
27200// Forms:
27201//
27202// 	VPAVGB xmm  xmm xmm
27203// 	VPAVGB m128 xmm xmm
27204// 	VPAVGB ymm  ymm ymm
27205// 	VPAVGB m256 ymm ymm
27206func VPAVGB(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
27207	switch {
27208	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
27209		return &intrep.Instruction{
27210			Opcode:   "VPAVGB",
27211			Operands: []operand.Op{mxy, xy, xy1},
27212			Inputs:   []operand.Op{mxy, xy},
27213			Outputs:  []operand.Op{xy1},
27214			ISA:      []string{"AVX"},
27215		}, nil
27216	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
27217		return &intrep.Instruction{
27218			Opcode:   "VPAVGB",
27219			Operands: []operand.Op{mxy, xy, xy1},
27220			Inputs:   []operand.Op{mxy, xy},
27221			Outputs:  []operand.Op{xy1},
27222			ISA:      []string{"AVX"},
27223		}, nil
27224	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
27225		return &intrep.Instruction{
27226			Opcode:   "VPAVGB",
27227			Operands: []operand.Op{mxy, xy, xy1},
27228			Inputs:   []operand.Op{mxy, xy},
27229			Outputs:  []operand.Op{xy1},
27230			ISA:      []string{"AVX2"},
27231		}, nil
27232	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
27233		return &intrep.Instruction{
27234			Opcode:   "VPAVGB",
27235			Operands: []operand.Op{mxy, xy, xy1},
27236			Inputs:   []operand.Op{mxy, xy},
27237			Outputs:  []operand.Op{xy1},
27238			ISA:      []string{"AVX2"},
27239		}, nil
27240	}
27241	return nil, errors.New("VPAVGB: bad operands")
27242}
27243
27244// VPAVGW: Average Packed Word Integers.
27245//
27246// Forms:
27247//
27248// 	VPAVGW xmm  xmm xmm
27249// 	VPAVGW m128 xmm xmm
27250// 	VPAVGW ymm  ymm ymm
27251// 	VPAVGW m256 ymm ymm
27252func VPAVGW(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
27253	switch {
27254	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
27255		return &intrep.Instruction{
27256			Opcode:   "VPAVGW",
27257			Operands: []operand.Op{mxy, xy, xy1},
27258			Inputs:   []operand.Op{mxy, xy},
27259			Outputs:  []operand.Op{xy1},
27260			ISA:      []string{"AVX"},
27261		}, nil
27262	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
27263		return &intrep.Instruction{
27264			Opcode:   "VPAVGW",
27265			Operands: []operand.Op{mxy, xy, xy1},
27266			Inputs:   []operand.Op{mxy, xy},
27267			Outputs:  []operand.Op{xy1},
27268			ISA:      []string{"AVX"},
27269		}, nil
27270	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
27271		return &intrep.Instruction{
27272			Opcode:   "VPAVGW",
27273			Operands: []operand.Op{mxy, xy, xy1},
27274			Inputs:   []operand.Op{mxy, xy},
27275			Outputs:  []operand.Op{xy1},
27276			ISA:      []string{"AVX2"},
27277		}, nil
27278	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
27279		return &intrep.Instruction{
27280			Opcode:   "VPAVGW",
27281			Operands: []operand.Op{mxy, xy, xy1},
27282			Inputs:   []operand.Op{mxy, xy},
27283			Outputs:  []operand.Op{xy1},
27284			ISA:      []string{"AVX2"},
27285		}, nil
27286	}
27287	return nil, errors.New("VPAVGW: bad operands")
27288}
27289
27290// VPBLENDD: Blend Packed Doublewords.
27291//
27292// Forms:
27293//
27294// 	VPBLENDD imm8 xmm  xmm xmm
27295// 	VPBLENDD imm8 m128 xmm xmm
27296// 	VPBLENDD imm8 ymm  ymm ymm
27297// 	VPBLENDD imm8 m256 ymm ymm
27298func VPBLENDD(i, mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
27299	switch {
27300	case operand.IsIMM8(i) && operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
27301		return &intrep.Instruction{
27302			Opcode:   "VPBLENDD",
27303			Operands: []operand.Op{i, mxy, xy, xy1},
27304			Inputs:   []operand.Op{mxy, xy},
27305			Outputs:  []operand.Op{xy1},
27306			ISA:      []string{"AVX2"},
27307		}, nil
27308	case operand.IsIMM8(i) && operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
27309		return &intrep.Instruction{
27310			Opcode:   "VPBLENDD",
27311			Operands: []operand.Op{i, mxy, xy, xy1},
27312			Inputs:   []operand.Op{mxy, xy},
27313			Outputs:  []operand.Op{xy1},
27314			ISA:      []string{"AVX2"},
27315		}, nil
27316	case operand.IsIMM8(i) && operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
27317		return &intrep.Instruction{
27318			Opcode:   "VPBLENDD",
27319			Operands: []operand.Op{i, mxy, xy, xy1},
27320			Inputs:   []operand.Op{mxy, xy},
27321			Outputs:  []operand.Op{xy1},
27322			ISA:      []string{"AVX2"},
27323		}, nil
27324	case operand.IsIMM8(i) && operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
27325		return &intrep.Instruction{
27326			Opcode:   "VPBLENDD",
27327			Operands: []operand.Op{i, mxy, xy, xy1},
27328			Inputs:   []operand.Op{mxy, xy},
27329			Outputs:  []operand.Op{xy1},
27330			ISA:      []string{"AVX2"},
27331		}, nil
27332	}
27333	return nil, errors.New("VPBLENDD: bad operands")
27334}
27335
27336// VPBLENDVB: Variable Blend Packed Bytes.
27337//
27338// Forms:
27339//
27340// 	VPBLENDVB xmm xmm  xmm xmm
27341// 	VPBLENDVB xmm m128 xmm xmm
27342// 	VPBLENDVB ymm ymm  ymm ymm
27343// 	VPBLENDVB ymm m256 ymm ymm
27344func VPBLENDVB(xy, mxy, xy1, xy2 operand.Op) (*intrep.Instruction, error) {
27345	switch {
27346	case operand.IsXMM(xy) && operand.IsXMM(mxy) && operand.IsXMM(xy1) && operand.IsXMM(xy2):
27347		return &intrep.Instruction{
27348			Opcode:   "VPBLENDVB",
27349			Operands: []operand.Op{xy, mxy, xy1, xy2},
27350			Inputs:   []operand.Op{xy, mxy, xy1},
27351			Outputs:  []operand.Op{xy2},
27352			ISA:      []string{"AVX"},
27353		}, nil
27354	case operand.IsXMM(xy) && operand.IsM128(mxy) && operand.IsXMM(xy1) && operand.IsXMM(xy2):
27355		return &intrep.Instruction{
27356			Opcode:   "VPBLENDVB",
27357			Operands: []operand.Op{xy, mxy, xy1, xy2},
27358			Inputs:   []operand.Op{xy, mxy, xy1},
27359			Outputs:  []operand.Op{xy2},
27360			ISA:      []string{"AVX"},
27361		}, nil
27362	case operand.IsYMM(xy) && operand.IsYMM(mxy) && operand.IsYMM(xy1) && operand.IsYMM(xy2):
27363		return &intrep.Instruction{
27364			Opcode:   "VPBLENDVB",
27365			Operands: []operand.Op{xy, mxy, xy1, xy2},
27366			Inputs:   []operand.Op{xy, mxy, xy1},
27367			Outputs:  []operand.Op{xy2},
27368			ISA:      []string{"AVX2"},
27369		}, nil
27370	case operand.IsYMM(xy) && operand.IsM256(mxy) && operand.IsYMM(xy1) && operand.IsYMM(xy2):
27371		return &intrep.Instruction{
27372			Opcode:   "VPBLENDVB",
27373			Operands: []operand.Op{xy, mxy, xy1, xy2},
27374			Inputs:   []operand.Op{xy, mxy, xy1},
27375			Outputs:  []operand.Op{xy2},
27376			ISA:      []string{"AVX2"},
27377		}, nil
27378	}
27379	return nil, errors.New("VPBLENDVB: bad operands")
27380}
27381
27382// VPBLENDW: Blend Packed Words.
27383//
27384// Forms:
27385//
27386// 	VPBLENDW imm8 xmm  xmm xmm
27387// 	VPBLENDW imm8 m128 xmm xmm
27388// 	VPBLENDW imm8 ymm  ymm ymm
27389// 	VPBLENDW imm8 m256 ymm ymm
27390func VPBLENDW(i, mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
27391	switch {
27392	case operand.IsIMM8(i) && operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
27393		return &intrep.Instruction{
27394			Opcode:   "VPBLENDW",
27395			Operands: []operand.Op{i, mxy, xy, xy1},
27396			Inputs:   []operand.Op{mxy, xy},
27397			Outputs:  []operand.Op{xy1},
27398			ISA:      []string{"AVX"},
27399		}, nil
27400	case operand.IsIMM8(i) && operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
27401		return &intrep.Instruction{
27402			Opcode:   "VPBLENDW",
27403			Operands: []operand.Op{i, mxy, xy, xy1},
27404			Inputs:   []operand.Op{mxy, xy},
27405			Outputs:  []operand.Op{xy1},
27406			ISA:      []string{"AVX"},
27407		}, nil
27408	case operand.IsIMM8(i) && operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
27409		return &intrep.Instruction{
27410			Opcode:   "VPBLENDW",
27411			Operands: []operand.Op{i, mxy, xy, xy1},
27412			Inputs:   []operand.Op{mxy, xy},
27413			Outputs:  []operand.Op{xy1},
27414			ISA:      []string{"AVX2"},
27415		}, nil
27416	case operand.IsIMM8(i) && operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
27417		return &intrep.Instruction{
27418			Opcode:   "VPBLENDW",
27419			Operands: []operand.Op{i, mxy, xy, xy1},
27420			Inputs:   []operand.Op{mxy, xy},
27421			Outputs:  []operand.Op{xy1},
27422			ISA:      []string{"AVX2"},
27423		}, nil
27424	}
27425	return nil, errors.New("VPBLENDW: bad operands")
27426}
27427
27428// VPBROADCASTB: Broadcast Byte Integer.
27429//
27430// Forms:
27431//
27432// 	VPBROADCASTB xmm xmm
27433// 	VPBROADCASTB m8  xmm
27434// 	VPBROADCASTB xmm ymm
27435// 	VPBROADCASTB m8  ymm
27436func VPBROADCASTB(mx, xy operand.Op) (*intrep.Instruction, error) {
27437	switch {
27438	case operand.IsXMM(mx) && operand.IsXMM(xy):
27439		return &intrep.Instruction{
27440			Opcode:   "VPBROADCASTB",
27441			Operands: []operand.Op{mx, xy},
27442			Inputs:   []operand.Op{mx},
27443			Outputs:  []operand.Op{xy},
27444			ISA:      []string{"AVX2"},
27445		}, nil
27446	case operand.IsM8(mx) && operand.IsXMM(xy):
27447		return &intrep.Instruction{
27448			Opcode:   "VPBROADCASTB",
27449			Operands: []operand.Op{mx, xy},
27450			Inputs:   []operand.Op{mx},
27451			Outputs:  []operand.Op{xy},
27452			ISA:      []string{"AVX2"},
27453		}, nil
27454	case operand.IsXMM(mx) && operand.IsYMM(xy):
27455		return &intrep.Instruction{
27456			Opcode:   "VPBROADCASTB",
27457			Operands: []operand.Op{mx, xy},
27458			Inputs:   []operand.Op{mx},
27459			Outputs:  []operand.Op{xy},
27460			ISA:      []string{"AVX2"},
27461		}, nil
27462	case operand.IsM8(mx) && operand.IsYMM(xy):
27463		return &intrep.Instruction{
27464			Opcode:   "VPBROADCASTB",
27465			Operands: []operand.Op{mx, xy},
27466			Inputs:   []operand.Op{mx},
27467			Outputs:  []operand.Op{xy},
27468			ISA:      []string{"AVX2"},
27469		}, nil
27470	}
27471	return nil, errors.New("VPBROADCASTB: bad operands")
27472}
27473
27474// VPBROADCASTD: Broadcast Doubleword Integer.
27475//
27476// Forms:
27477//
27478// 	VPBROADCASTD xmm xmm
27479// 	VPBROADCASTD m32 xmm
27480// 	VPBROADCASTD xmm ymm
27481// 	VPBROADCASTD m32 ymm
27482func VPBROADCASTD(mx, xy operand.Op) (*intrep.Instruction, error) {
27483	switch {
27484	case operand.IsXMM(mx) && operand.IsXMM(xy):
27485		return &intrep.Instruction{
27486			Opcode:   "VPBROADCASTD",
27487			Operands: []operand.Op{mx, xy},
27488			Inputs:   []operand.Op{mx},
27489			Outputs:  []operand.Op{xy},
27490			ISA:      []string{"AVX2"},
27491		}, nil
27492	case operand.IsM32(mx) && operand.IsXMM(xy):
27493		return &intrep.Instruction{
27494			Opcode:   "VPBROADCASTD",
27495			Operands: []operand.Op{mx, xy},
27496			Inputs:   []operand.Op{mx},
27497			Outputs:  []operand.Op{xy},
27498			ISA:      []string{"AVX2"},
27499		}, nil
27500	case operand.IsXMM(mx) && operand.IsYMM(xy):
27501		return &intrep.Instruction{
27502			Opcode:   "VPBROADCASTD",
27503			Operands: []operand.Op{mx, xy},
27504			Inputs:   []operand.Op{mx},
27505			Outputs:  []operand.Op{xy},
27506			ISA:      []string{"AVX2"},
27507		}, nil
27508	case operand.IsM32(mx) && operand.IsYMM(xy):
27509		return &intrep.Instruction{
27510			Opcode:   "VPBROADCASTD",
27511			Operands: []operand.Op{mx, xy},
27512			Inputs:   []operand.Op{mx},
27513			Outputs:  []operand.Op{xy},
27514			ISA:      []string{"AVX2"},
27515		}, nil
27516	}
27517	return nil, errors.New("VPBROADCASTD: bad operands")
27518}
27519
27520// VPBROADCASTQ: Broadcast Quadword Integer.
27521//
27522// Forms:
27523//
27524// 	VPBROADCASTQ xmm xmm
27525// 	VPBROADCASTQ m64 xmm
27526// 	VPBROADCASTQ xmm ymm
27527// 	VPBROADCASTQ m64 ymm
27528func VPBROADCASTQ(mx, xy operand.Op) (*intrep.Instruction, error) {
27529	switch {
27530	case operand.IsXMM(mx) && operand.IsXMM(xy):
27531		return &intrep.Instruction{
27532			Opcode:   "VPBROADCASTQ",
27533			Operands: []operand.Op{mx, xy},
27534			Inputs:   []operand.Op{mx},
27535			Outputs:  []operand.Op{xy},
27536			ISA:      []string{"AVX2"},
27537		}, nil
27538	case operand.IsM64(mx) && operand.IsXMM(xy):
27539		return &intrep.Instruction{
27540			Opcode:   "VPBROADCASTQ",
27541			Operands: []operand.Op{mx, xy},
27542			Inputs:   []operand.Op{mx},
27543			Outputs:  []operand.Op{xy},
27544			ISA:      []string{"AVX2"},
27545		}, nil
27546	case operand.IsXMM(mx) && operand.IsYMM(xy):
27547		return &intrep.Instruction{
27548			Opcode:   "VPBROADCASTQ",
27549			Operands: []operand.Op{mx, xy},
27550			Inputs:   []operand.Op{mx},
27551			Outputs:  []operand.Op{xy},
27552			ISA:      []string{"AVX2"},
27553		}, nil
27554	case operand.IsM64(mx) && operand.IsYMM(xy):
27555		return &intrep.Instruction{
27556			Opcode:   "VPBROADCASTQ",
27557			Operands: []operand.Op{mx, xy},
27558			Inputs:   []operand.Op{mx},
27559			Outputs:  []operand.Op{xy},
27560			ISA:      []string{"AVX2"},
27561		}, nil
27562	}
27563	return nil, errors.New("VPBROADCASTQ: bad operands")
27564}
27565
27566// VPBROADCASTW: Broadcast Word Integer.
27567//
27568// Forms:
27569//
27570// 	VPBROADCASTW xmm xmm
27571// 	VPBROADCASTW m16 xmm
27572// 	VPBROADCASTW xmm ymm
27573// 	VPBROADCASTW m16 ymm
27574func VPBROADCASTW(mx, xy operand.Op) (*intrep.Instruction, error) {
27575	switch {
27576	case operand.IsXMM(mx) && operand.IsXMM(xy):
27577		return &intrep.Instruction{
27578			Opcode:   "VPBROADCASTW",
27579			Operands: []operand.Op{mx, xy},
27580			Inputs:   []operand.Op{mx},
27581			Outputs:  []operand.Op{xy},
27582			ISA:      []string{"AVX2"},
27583		}, nil
27584	case operand.IsM16(mx) && operand.IsXMM(xy):
27585		return &intrep.Instruction{
27586			Opcode:   "VPBROADCASTW",
27587			Operands: []operand.Op{mx, xy},
27588			Inputs:   []operand.Op{mx},
27589			Outputs:  []operand.Op{xy},
27590			ISA:      []string{"AVX2"},
27591		}, nil
27592	case operand.IsXMM(mx) && operand.IsYMM(xy):
27593		return &intrep.Instruction{
27594			Opcode:   "VPBROADCASTW",
27595			Operands: []operand.Op{mx, xy},
27596			Inputs:   []operand.Op{mx},
27597			Outputs:  []operand.Op{xy},
27598			ISA:      []string{"AVX2"},
27599		}, nil
27600	case operand.IsM16(mx) && operand.IsYMM(xy):
27601		return &intrep.Instruction{
27602			Opcode:   "VPBROADCASTW",
27603			Operands: []operand.Op{mx, xy},
27604			Inputs:   []operand.Op{mx},
27605			Outputs:  []operand.Op{xy},
27606			ISA:      []string{"AVX2"},
27607		}, nil
27608	}
27609	return nil, errors.New("VPBROADCASTW: bad operands")
27610}
27611
27612// VPCLMULQDQ: Carry-Less Quadword Multiplication.
27613//
27614// Forms:
27615//
27616// 	VPCLMULQDQ imm8 xmm  xmm xmm
27617// 	VPCLMULQDQ imm8 m128 xmm xmm
27618func VPCLMULQDQ(i, mx, x, x1 operand.Op) (*intrep.Instruction, error) {
27619	switch {
27620	case operand.IsIMM8(i) && operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
27621		return &intrep.Instruction{
27622			Opcode:   "VPCLMULQDQ",
27623			Operands: []operand.Op{i, mx, x, x1},
27624			Inputs:   []operand.Op{mx, x},
27625			Outputs:  []operand.Op{x1},
27626			ISA:      []string{"AVX", "PCLMULQDQ"},
27627		}, nil
27628	case operand.IsIMM8(i) && operand.IsM128(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
27629		return &intrep.Instruction{
27630			Opcode:   "VPCLMULQDQ",
27631			Operands: []operand.Op{i, mx, x, x1},
27632			Inputs:   []operand.Op{mx, x},
27633			Outputs:  []operand.Op{x1},
27634			ISA:      []string{"AVX", "PCLMULQDQ"},
27635		}, nil
27636	}
27637	return nil, errors.New("VPCLMULQDQ: bad operands")
27638}
27639
27640// VPCMPEQB: Compare Packed Byte Data for Equality.
27641//
27642// Forms:
27643//
27644// 	VPCMPEQB xmm  xmm xmm
27645// 	VPCMPEQB m128 xmm xmm
27646// 	VPCMPEQB ymm  ymm ymm
27647// 	VPCMPEQB m256 ymm ymm
27648func VPCMPEQB(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
27649	switch {
27650	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
27651		return &intrep.Instruction{
27652			Opcode:           "VPCMPEQB",
27653			Operands:         []operand.Op{mxy, xy, xy1},
27654			Inputs:           []operand.Op{mxy, xy},
27655			Outputs:          []operand.Op{xy1},
27656			ISA:              []string{"AVX"},
27657			CancellingInputs: true,
27658		}, nil
27659	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
27660		return &intrep.Instruction{
27661			Opcode:   "VPCMPEQB",
27662			Operands: []operand.Op{mxy, xy, xy1},
27663			Inputs:   []operand.Op{mxy, xy},
27664			Outputs:  []operand.Op{xy1},
27665			ISA:      []string{"AVX"},
27666		}, nil
27667	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
27668		return &intrep.Instruction{
27669			Opcode:           "VPCMPEQB",
27670			Operands:         []operand.Op{mxy, xy, xy1},
27671			Inputs:           []operand.Op{mxy, xy},
27672			Outputs:          []operand.Op{xy1},
27673			ISA:              []string{"AVX2"},
27674			CancellingInputs: true,
27675		}, nil
27676	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
27677		return &intrep.Instruction{
27678			Opcode:   "VPCMPEQB",
27679			Operands: []operand.Op{mxy, xy, xy1},
27680			Inputs:   []operand.Op{mxy, xy},
27681			Outputs:  []operand.Op{xy1},
27682			ISA:      []string{"AVX2"},
27683		}, nil
27684	}
27685	return nil, errors.New("VPCMPEQB: bad operands")
27686}
27687
27688// VPCMPEQD: Compare Packed Doubleword Data for Equality.
27689//
27690// Forms:
27691//
27692// 	VPCMPEQD xmm  xmm xmm
27693// 	VPCMPEQD m128 xmm xmm
27694// 	VPCMPEQD ymm  ymm ymm
27695// 	VPCMPEQD m256 ymm ymm
27696func VPCMPEQD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
27697	switch {
27698	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
27699		return &intrep.Instruction{
27700			Opcode:           "VPCMPEQD",
27701			Operands:         []operand.Op{mxy, xy, xy1},
27702			Inputs:           []operand.Op{mxy, xy},
27703			Outputs:          []operand.Op{xy1},
27704			ISA:              []string{"AVX"},
27705			CancellingInputs: true,
27706		}, nil
27707	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
27708		return &intrep.Instruction{
27709			Opcode:   "VPCMPEQD",
27710			Operands: []operand.Op{mxy, xy, xy1},
27711			Inputs:   []operand.Op{mxy, xy},
27712			Outputs:  []operand.Op{xy1},
27713			ISA:      []string{"AVX"},
27714		}, nil
27715	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
27716		return &intrep.Instruction{
27717			Opcode:           "VPCMPEQD",
27718			Operands:         []operand.Op{mxy, xy, xy1},
27719			Inputs:           []operand.Op{mxy, xy},
27720			Outputs:          []operand.Op{xy1},
27721			ISA:              []string{"AVX2"},
27722			CancellingInputs: true,
27723		}, nil
27724	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
27725		return &intrep.Instruction{
27726			Opcode:   "VPCMPEQD",
27727			Operands: []operand.Op{mxy, xy, xy1},
27728			Inputs:   []operand.Op{mxy, xy},
27729			Outputs:  []operand.Op{xy1},
27730			ISA:      []string{"AVX2"},
27731		}, nil
27732	}
27733	return nil, errors.New("VPCMPEQD: bad operands")
27734}
27735
27736// VPCMPEQQ: Compare Packed Quadword Data for Equality.
27737//
27738// Forms:
27739//
27740// 	VPCMPEQQ xmm  xmm xmm
27741// 	VPCMPEQQ m128 xmm xmm
27742// 	VPCMPEQQ ymm  ymm ymm
27743// 	VPCMPEQQ m256 ymm ymm
27744func VPCMPEQQ(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
27745	switch {
27746	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
27747		return &intrep.Instruction{
27748			Opcode:           "VPCMPEQQ",
27749			Operands:         []operand.Op{mxy, xy, xy1},
27750			Inputs:           []operand.Op{mxy, xy},
27751			Outputs:          []operand.Op{xy1},
27752			ISA:              []string{"AVX"},
27753			CancellingInputs: true,
27754		}, nil
27755	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
27756		return &intrep.Instruction{
27757			Opcode:   "VPCMPEQQ",
27758			Operands: []operand.Op{mxy, xy, xy1},
27759			Inputs:   []operand.Op{mxy, xy},
27760			Outputs:  []operand.Op{xy1},
27761			ISA:      []string{"AVX"},
27762		}, nil
27763	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
27764		return &intrep.Instruction{
27765			Opcode:           "VPCMPEQQ",
27766			Operands:         []operand.Op{mxy, xy, xy1},
27767			Inputs:           []operand.Op{mxy, xy},
27768			Outputs:          []operand.Op{xy1},
27769			ISA:              []string{"AVX2"},
27770			CancellingInputs: true,
27771		}, nil
27772	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
27773		return &intrep.Instruction{
27774			Opcode:   "VPCMPEQQ",
27775			Operands: []operand.Op{mxy, xy, xy1},
27776			Inputs:   []operand.Op{mxy, xy},
27777			Outputs:  []operand.Op{xy1},
27778			ISA:      []string{"AVX2"},
27779		}, nil
27780	}
27781	return nil, errors.New("VPCMPEQQ: bad operands")
27782}
27783
27784// VPCMPEQW: Compare Packed Word Data for Equality.
27785//
27786// Forms:
27787//
27788// 	VPCMPEQW xmm  xmm xmm
27789// 	VPCMPEQW m128 xmm xmm
27790// 	VPCMPEQW ymm  ymm ymm
27791// 	VPCMPEQW m256 ymm ymm
27792func VPCMPEQW(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
27793	switch {
27794	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
27795		return &intrep.Instruction{
27796			Opcode:           "VPCMPEQW",
27797			Operands:         []operand.Op{mxy, xy, xy1},
27798			Inputs:           []operand.Op{mxy, xy},
27799			Outputs:          []operand.Op{xy1},
27800			ISA:              []string{"AVX"},
27801			CancellingInputs: true,
27802		}, nil
27803	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
27804		return &intrep.Instruction{
27805			Opcode:   "VPCMPEQW",
27806			Operands: []operand.Op{mxy, xy, xy1},
27807			Inputs:   []operand.Op{mxy, xy},
27808			Outputs:  []operand.Op{xy1},
27809			ISA:      []string{"AVX"},
27810		}, nil
27811	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
27812		return &intrep.Instruction{
27813			Opcode:           "VPCMPEQW",
27814			Operands:         []operand.Op{mxy, xy, xy1},
27815			Inputs:           []operand.Op{mxy, xy},
27816			Outputs:          []operand.Op{xy1},
27817			ISA:              []string{"AVX2"},
27818			CancellingInputs: true,
27819		}, nil
27820	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
27821		return &intrep.Instruction{
27822			Opcode:   "VPCMPEQW",
27823			Operands: []operand.Op{mxy, xy, xy1},
27824			Inputs:   []operand.Op{mxy, xy},
27825			Outputs:  []operand.Op{xy1},
27826			ISA:      []string{"AVX2"},
27827		}, nil
27828	}
27829	return nil, errors.New("VPCMPEQW: bad operands")
27830}
27831
27832// VPCMPESTRI: Packed Compare Explicit Length Strings, Return Index.
27833//
27834// Forms:
27835//
27836// 	VPCMPESTRI imm8 xmm  xmm
27837// 	VPCMPESTRI imm8 m128 xmm
27838func VPCMPESTRI(i, mx, x operand.Op) (*intrep.Instruction, error) {
27839	switch {
27840	case operand.IsIMM8(i) && operand.IsXMM(mx) && operand.IsXMM(x):
27841		return &intrep.Instruction{
27842			Opcode:   "VPCMPESTRI",
27843			Operands: []operand.Op{i, mx, x},
27844			Inputs:   []operand.Op{mx, x, reg.EAX, reg.EDX},
27845			Outputs:  []operand.Op{reg.ECX},
27846			ISA:      []string{"AVX"},
27847		}, nil
27848	case operand.IsIMM8(i) && operand.IsM128(mx) && operand.IsXMM(x):
27849		return &intrep.Instruction{
27850			Opcode:   "VPCMPESTRI",
27851			Operands: []operand.Op{i, mx, x},
27852			Inputs:   []operand.Op{mx, x, reg.EAX, reg.EDX},
27853			Outputs:  []operand.Op{reg.ECX},
27854			ISA:      []string{"AVX"},
27855		}, nil
27856	}
27857	return nil, errors.New("VPCMPESTRI: bad operands")
27858}
27859
27860// VPCMPESTRM: Packed Compare Explicit Length Strings, Return Mask.
27861//
27862// Forms:
27863//
27864// 	VPCMPESTRM imm8 xmm  xmm
27865// 	VPCMPESTRM imm8 m128 xmm
27866func VPCMPESTRM(i, mx, x operand.Op) (*intrep.Instruction, error) {
27867	switch {
27868	case operand.IsIMM8(i) && operand.IsXMM(mx) && operand.IsXMM(x):
27869		return &intrep.Instruction{
27870			Opcode:   "VPCMPESTRM",
27871			Operands: []operand.Op{i, mx, x},
27872			Inputs:   []operand.Op{mx, x, reg.EAX, reg.EDX},
27873			Outputs:  []operand.Op{reg.X0},
27874			ISA:      []string{"AVX"},
27875		}, nil
27876	case operand.IsIMM8(i) && operand.IsM128(mx) && operand.IsXMM(x):
27877		return &intrep.Instruction{
27878			Opcode:   "VPCMPESTRM",
27879			Operands: []operand.Op{i, mx, x},
27880			Inputs:   []operand.Op{mx, x, reg.EAX, reg.EDX},
27881			Outputs:  []operand.Op{reg.X0},
27882			ISA:      []string{"AVX"},
27883		}, nil
27884	}
27885	return nil, errors.New("VPCMPESTRM: bad operands")
27886}
27887
27888// VPCMPGTB: Compare Packed Signed Byte Integers for Greater Than.
27889//
27890// Forms:
27891//
27892// 	VPCMPGTB xmm  xmm xmm
27893// 	VPCMPGTB m128 xmm xmm
27894// 	VPCMPGTB ymm  ymm ymm
27895// 	VPCMPGTB m256 ymm ymm
27896func VPCMPGTB(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
27897	switch {
27898	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
27899		return &intrep.Instruction{
27900			Opcode:           "VPCMPGTB",
27901			Operands:         []operand.Op{mxy, xy, xy1},
27902			Inputs:           []operand.Op{mxy, xy},
27903			Outputs:          []operand.Op{xy1},
27904			ISA:              []string{"AVX"},
27905			CancellingInputs: true,
27906		}, nil
27907	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
27908		return &intrep.Instruction{
27909			Opcode:   "VPCMPGTB",
27910			Operands: []operand.Op{mxy, xy, xy1},
27911			Inputs:   []operand.Op{mxy, xy},
27912			Outputs:  []operand.Op{xy1},
27913			ISA:      []string{"AVX"},
27914		}, nil
27915	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
27916		return &intrep.Instruction{
27917			Opcode:           "VPCMPGTB",
27918			Operands:         []operand.Op{mxy, xy, xy1},
27919			Inputs:           []operand.Op{mxy, xy},
27920			Outputs:          []operand.Op{xy1},
27921			ISA:              []string{"AVX2"},
27922			CancellingInputs: true,
27923		}, nil
27924	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
27925		return &intrep.Instruction{
27926			Opcode:   "VPCMPGTB",
27927			Operands: []operand.Op{mxy, xy, xy1},
27928			Inputs:   []operand.Op{mxy, xy},
27929			Outputs:  []operand.Op{xy1},
27930			ISA:      []string{"AVX2"},
27931		}, nil
27932	}
27933	return nil, errors.New("VPCMPGTB: bad operands")
27934}
27935
27936// VPCMPGTD: Compare Packed Signed Doubleword Integers for Greater Than.
27937//
27938// Forms:
27939//
27940// 	VPCMPGTD xmm  xmm xmm
27941// 	VPCMPGTD m128 xmm xmm
27942// 	VPCMPGTD ymm  ymm ymm
27943// 	VPCMPGTD m256 ymm ymm
27944func VPCMPGTD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
27945	switch {
27946	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
27947		return &intrep.Instruction{
27948			Opcode:           "VPCMPGTD",
27949			Operands:         []operand.Op{mxy, xy, xy1},
27950			Inputs:           []operand.Op{mxy, xy},
27951			Outputs:          []operand.Op{xy1},
27952			ISA:              []string{"AVX"},
27953			CancellingInputs: true,
27954		}, nil
27955	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
27956		return &intrep.Instruction{
27957			Opcode:   "VPCMPGTD",
27958			Operands: []operand.Op{mxy, xy, xy1},
27959			Inputs:   []operand.Op{mxy, xy},
27960			Outputs:  []operand.Op{xy1},
27961			ISA:      []string{"AVX"},
27962		}, nil
27963	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
27964		return &intrep.Instruction{
27965			Opcode:           "VPCMPGTD",
27966			Operands:         []operand.Op{mxy, xy, xy1},
27967			Inputs:           []operand.Op{mxy, xy},
27968			Outputs:          []operand.Op{xy1},
27969			ISA:              []string{"AVX2"},
27970			CancellingInputs: true,
27971		}, nil
27972	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
27973		return &intrep.Instruction{
27974			Opcode:   "VPCMPGTD",
27975			Operands: []operand.Op{mxy, xy, xy1},
27976			Inputs:   []operand.Op{mxy, xy},
27977			Outputs:  []operand.Op{xy1},
27978			ISA:      []string{"AVX2"},
27979		}, nil
27980	}
27981	return nil, errors.New("VPCMPGTD: bad operands")
27982}
27983
27984// VPCMPGTQ: Compare Packed Data for Greater Than.
27985//
27986// Forms:
27987//
27988// 	VPCMPGTQ xmm  xmm xmm
27989// 	VPCMPGTQ m128 xmm xmm
27990// 	VPCMPGTQ ymm  ymm ymm
27991// 	VPCMPGTQ m256 ymm ymm
27992func VPCMPGTQ(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
27993	switch {
27994	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
27995		return &intrep.Instruction{
27996			Opcode:           "VPCMPGTQ",
27997			Operands:         []operand.Op{mxy, xy, xy1},
27998			Inputs:           []operand.Op{mxy, xy},
27999			Outputs:          []operand.Op{xy1},
28000			ISA:              []string{"AVX"},
28001			CancellingInputs: true,
28002		}, nil
28003	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
28004		return &intrep.Instruction{
28005			Opcode:   "VPCMPGTQ",
28006			Operands: []operand.Op{mxy, xy, xy1},
28007			Inputs:   []operand.Op{mxy, xy},
28008			Outputs:  []operand.Op{xy1},
28009			ISA:      []string{"AVX"},
28010		}, nil
28011	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
28012		return &intrep.Instruction{
28013			Opcode:           "VPCMPGTQ",
28014			Operands:         []operand.Op{mxy, xy, xy1},
28015			Inputs:           []operand.Op{mxy, xy},
28016			Outputs:          []operand.Op{xy1},
28017			ISA:              []string{"AVX2"},
28018			CancellingInputs: true,
28019		}, nil
28020	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
28021		return &intrep.Instruction{
28022			Opcode:   "VPCMPGTQ",
28023			Operands: []operand.Op{mxy, xy, xy1},
28024			Inputs:   []operand.Op{mxy, xy},
28025			Outputs:  []operand.Op{xy1},
28026			ISA:      []string{"AVX2"},
28027		}, nil
28028	}
28029	return nil, errors.New("VPCMPGTQ: bad operands")
28030}
28031
28032// VPCMPGTW: Compare Packed Signed Word Integers for Greater Than.
28033//
28034// Forms:
28035//
28036// 	VPCMPGTW xmm  xmm xmm
28037// 	VPCMPGTW m128 xmm xmm
28038// 	VPCMPGTW ymm  ymm ymm
28039// 	VPCMPGTW m256 ymm ymm
28040func VPCMPGTW(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
28041	switch {
28042	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
28043		return &intrep.Instruction{
28044			Opcode:           "VPCMPGTW",
28045			Operands:         []operand.Op{mxy, xy, xy1},
28046			Inputs:           []operand.Op{mxy, xy},
28047			Outputs:          []operand.Op{xy1},
28048			ISA:              []string{"AVX"},
28049			CancellingInputs: true,
28050		}, nil
28051	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
28052		return &intrep.Instruction{
28053			Opcode:   "VPCMPGTW",
28054			Operands: []operand.Op{mxy, xy, xy1},
28055			Inputs:   []operand.Op{mxy, xy},
28056			Outputs:  []operand.Op{xy1},
28057			ISA:      []string{"AVX"},
28058		}, nil
28059	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
28060		return &intrep.Instruction{
28061			Opcode:           "VPCMPGTW",
28062			Operands:         []operand.Op{mxy, xy, xy1},
28063			Inputs:           []operand.Op{mxy, xy},
28064			Outputs:          []operand.Op{xy1},
28065			ISA:              []string{"AVX2"},
28066			CancellingInputs: true,
28067		}, nil
28068	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
28069		return &intrep.Instruction{
28070			Opcode:   "VPCMPGTW",
28071			Operands: []operand.Op{mxy, xy, xy1},
28072			Inputs:   []operand.Op{mxy, xy},
28073			Outputs:  []operand.Op{xy1},
28074			ISA:      []string{"AVX2"},
28075		}, nil
28076	}
28077	return nil, errors.New("VPCMPGTW: bad operands")
28078}
28079
28080// VPCMPISTRI: Packed Compare Implicit Length Strings, Return Index.
28081//
28082// Forms:
28083//
28084// 	VPCMPISTRI imm8 xmm  xmm
28085// 	VPCMPISTRI imm8 m128 xmm
28086func VPCMPISTRI(i, mx, x operand.Op) (*intrep.Instruction, error) {
28087	switch {
28088	case operand.IsIMM8(i) && operand.IsXMM(mx) && operand.IsXMM(x):
28089		return &intrep.Instruction{
28090			Opcode:   "VPCMPISTRI",
28091			Operands: []operand.Op{i, mx, x},
28092			Inputs:   []operand.Op{mx, x},
28093			Outputs:  []operand.Op{reg.ECX},
28094			ISA:      []string{"AVX"},
28095		}, nil
28096	case operand.IsIMM8(i) && operand.IsM128(mx) && operand.IsXMM(x):
28097		return &intrep.Instruction{
28098			Opcode:   "VPCMPISTRI",
28099			Operands: []operand.Op{i, mx, x},
28100			Inputs:   []operand.Op{mx, x},
28101			Outputs:  []operand.Op{reg.ECX},
28102			ISA:      []string{"AVX"},
28103		}, nil
28104	}
28105	return nil, errors.New("VPCMPISTRI: bad operands")
28106}
28107
28108// VPCMPISTRM: Packed Compare Implicit Length Strings, Return Mask.
28109//
28110// Forms:
28111//
28112// 	VPCMPISTRM imm8 xmm  xmm
28113// 	VPCMPISTRM imm8 m128 xmm
28114func VPCMPISTRM(i, mx, x operand.Op) (*intrep.Instruction, error) {
28115	switch {
28116	case operand.IsIMM8(i) && operand.IsXMM(mx) && operand.IsXMM(x):
28117		return &intrep.Instruction{
28118			Opcode:   "VPCMPISTRM",
28119			Operands: []operand.Op{i, mx, x},
28120			Inputs:   []operand.Op{mx, x},
28121			Outputs:  []operand.Op{reg.X0},
28122			ISA:      []string{"AVX"},
28123		}, nil
28124	case operand.IsIMM8(i) && operand.IsM128(mx) && operand.IsXMM(x):
28125		return &intrep.Instruction{
28126			Opcode:   "VPCMPISTRM",
28127			Operands: []operand.Op{i, mx, x},
28128			Inputs:   []operand.Op{mx, x},
28129			Outputs:  []operand.Op{reg.X0},
28130			ISA:      []string{"AVX"},
28131		}, nil
28132	}
28133	return nil, errors.New("VPCMPISTRM: bad operands")
28134}
28135
28136// VPERM2F128: Permute Floating-Point Values.
28137//
28138// Forms:
28139//
28140// 	VPERM2F128 imm8 ymm  ymm ymm
28141// 	VPERM2F128 imm8 m256 ymm ymm
28142func VPERM2F128(i, my, y, y1 operand.Op) (*intrep.Instruction, error) {
28143	switch {
28144	case operand.IsIMM8(i) && operand.IsYMM(my) && operand.IsYMM(y) && operand.IsYMM(y1):
28145		return &intrep.Instruction{
28146			Opcode:   "VPERM2F128",
28147			Operands: []operand.Op{i, my, y, y1},
28148			Inputs:   []operand.Op{my, y},
28149			Outputs:  []operand.Op{y1},
28150			ISA:      []string{"AVX"},
28151		}, nil
28152	case operand.IsIMM8(i) && operand.IsM256(my) && operand.IsYMM(y) && operand.IsYMM(y1):
28153		return &intrep.Instruction{
28154			Opcode:   "VPERM2F128",
28155			Operands: []operand.Op{i, my, y, y1},
28156			Inputs:   []operand.Op{my, y},
28157			Outputs:  []operand.Op{y1},
28158			ISA:      []string{"AVX"},
28159		}, nil
28160	}
28161	return nil, errors.New("VPERM2F128: bad operands")
28162}
28163
28164// VPERM2I128: Permute 128-Bit Integer Values.
28165//
28166// Forms:
28167//
28168// 	VPERM2I128 imm8 ymm  ymm ymm
28169// 	VPERM2I128 imm8 m256 ymm ymm
28170func VPERM2I128(i, my, y, y1 operand.Op) (*intrep.Instruction, error) {
28171	switch {
28172	case operand.IsIMM8(i) && operand.IsYMM(my) && operand.IsYMM(y) && operand.IsYMM(y1):
28173		return &intrep.Instruction{
28174			Opcode:   "VPERM2I128",
28175			Operands: []operand.Op{i, my, y, y1},
28176			Inputs:   []operand.Op{my, y},
28177			Outputs:  []operand.Op{y1},
28178			ISA:      []string{"AVX2"},
28179		}, nil
28180	case operand.IsIMM8(i) && operand.IsM256(my) && operand.IsYMM(y) && operand.IsYMM(y1):
28181		return &intrep.Instruction{
28182			Opcode:   "VPERM2I128",
28183			Operands: []operand.Op{i, my, y, y1},
28184			Inputs:   []operand.Op{my, y},
28185			Outputs:  []operand.Op{y1},
28186			ISA:      []string{"AVX2"},
28187		}, nil
28188	}
28189	return nil, errors.New("VPERM2I128: bad operands")
28190}
28191
28192// VPERMD: Permute Doubleword Integers.
28193//
28194// Forms:
28195//
28196// 	VPERMD ymm  ymm ymm
28197// 	VPERMD m256 ymm ymm
28198func VPERMD(my, y, y1 operand.Op) (*intrep.Instruction, error) {
28199	switch {
28200	case operand.IsYMM(my) && operand.IsYMM(y) && operand.IsYMM(y1):
28201		return &intrep.Instruction{
28202			Opcode:   "VPERMD",
28203			Operands: []operand.Op{my, y, y1},
28204			Inputs:   []operand.Op{my, y},
28205			Outputs:  []operand.Op{y1},
28206			ISA:      []string{"AVX2"},
28207		}, nil
28208	case operand.IsM256(my) && operand.IsYMM(y) && operand.IsYMM(y1):
28209		return &intrep.Instruction{
28210			Opcode:   "VPERMD",
28211			Operands: []operand.Op{my, y, y1},
28212			Inputs:   []operand.Op{my, y},
28213			Outputs:  []operand.Op{y1},
28214			ISA:      []string{"AVX2"},
28215		}, nil
28216	}
28217	return nil, errors.New("VPERMD: bad operands")
28218}
28219
28220// VPERMILPD: Permute Double-Precision Floating-Point Values.
28221//
28222// Forms:
28223//
28224// 	VPERMILPD imm8 xmm  xmm
28225// 	VPERMILPD xmm  xmm  xmm
28226// 	VPERMILPD m128 xmm  xmm
28227// 	VPERMILPD imm8 m128 xmm
28228// 	VPERMILPD imm8 ymm  ymm
28229// 	VPERMILPD ymm  ymm  ymm
28230// 	VPERMILPD m256 ymm  ymm
28231// 	VPERMILPD imm8 m256 ymm
28232func VPERMILPD(imxy, mxy, xy operand.Op) (*intrep.Instruction, error) {
28233	switch {
28234	case operand.IsIMM8(imxy) && operand.IsXMM(mxy) && operand.IsXMM(xy):
28235		return &intrep.Instruction{
28236			Opcode:   "VPERMILPD",
28237			Operands: []operand.Op{imxy, mxy, xy},
28238			Inputs:   []operand.Op{mxy},
28239			Outputs:  []operand.Op{xy},
28240			ISA:      []string{"AVX"},
28241		}, nil
28242	case operand.IsXMM(imxy) && operand.IsXMM(mxy) && operand.IsXMM(xy):
28243		return &intrep.Instruction{
28244			Opcode:   "VPERMILPD",
28245			Operands: []operand.Op{imxy, mxy, xy},
28246			Inputs:   []operand.Op{imxy, mxy},
28247			Outputs:  []operand.Op{xy},
28248			ISA:      []string{"AVX"},
28249		}, nil
28250	case operand.IsM128(imxy) && operand.IsXMM(mxy) && operand.IsXMM(xy):
28251		return &intrep.Instruction{
28252			Opcode:   "VPERMILPD",
28253			Operands: []operand.Op{imxy, mxy, xy},
28254			Inputs:   []operand.Op{imxy, mxy},
28255			Outputs:  []operand.Op{xy},
28256			ISA:      []string{"AVX"},
28257		}, nil
28258	case operand.IsIMM8(imxy) && operand.IsM128(mxy) && operand.IsXMM(xy):
28259		return &intrep.Instruction{
28260			Opcode:   "VPERMILPD",
28261			Operands: []operand.Op{imxy, mxy, xy},
28262			Inputs:   []operand.Op{mxy},
28263			Outputs:  []operand.Op{xy},
28264			ISA:      []string{"AVX"},
28265		}, nil
28266	case operand.IsIMM8(imxy) && operand.IsYMM(mxy) && operand.IsYMM(xy):
28267		return &intrep.Instruction{
28268			Opcode:   "VPERMILPD",
28269			Operands: []operand.Op{imxy, mxy, xy},
28270			Inputs:   []operand.Op{mxy},
28271			Outputs:  []operand.Op{xy},
28272			ISA:      []string{"AVX"},
28273		}, nil
28274	case operand.IsYMM(imxy) && operand.IsYMM(mxy) && operand.IsYMM(xy):
28275		return &intrep.Instruction{
28276			Opcode:   "VPERMILPD",
28277			Operands: []operand.Op{imxy, mxy, xy},
28278			Inputs:   []operand.Op{imxy, mxy},
28279			Outputs:  []operand.Op{xy},
28280			ISA:      []string{"AVX"},
28281		}, nil
28282	case operand.IsM256(imxy) && operand.IsYMM(mxy) && operand.IsYMM(xy):
28283		return &intrep.Instruction{
28284			Opcode:   "VPERMILPD",
28285			Operands: []operand.Op{imxy, mxy, xy},
28286			Inputs:   []operand.Op{imxy, mxy},
28287			Outputs:  []operand.Op{xy},
28288			ISA:      []string{"AVX"},
28289		}, nil
28290	case operand.IsIMM8(imxy) && operand.IsM256(mxy) && operand.IsYMM(xy):
28291		return &intrep.Instruction{
28292			Opcode:   "VPERMILPD",
28293			Operands: []operand.Op{imxy, mxy, xy},
28294			Inputs:   []operand.Op{mxy},
28295			Outputs:  []operand.Op{xy},
28296			ISA:      []string{"AVX"},
28297		}, nil
28298	}
28299	return nil, errors.New("VPERMILPD: bad operands")
28300}
28301
28302// VPERMILPS: Permute Single-Precision Floating-Point Values.
28303//
28304// Forms:
28305//
28306// 	VPERMILPS imm8 xmm  xmm
28307// 	VPERMILPS xmm  xmm  xmm
28308// 	VPERMILPS m128 xmm  xmm
28309// 	VPERMILPS imm8 m128 xmm
28310// 	VPERMILPS imm8 ymm  ymm
28311// 	VPERMILPS ymm  ymm  ymm
28312// 	VPERMILPS m256 ymm  ymm
28313// 	VPERMILPS imm8 m256 ymm
28314func VPERMILPS(imxy, mxy, xy operand.Op) (*intrep.Instruction, error) {
28315	switch {
28316	case operand.IsIMM8(imxy) && operand.IsXMM(mxy) && operand.IsXMM(xy):
28317		return &intrep.Instruction{
28318			Opcode:   "VPERMILPS",
28319			Operands: []operand.Op{imxy, mxy, xy},
28320			Inputs:   []operand.Op{mxy},
28321			Outputs:  []operand.Op{xy},
28322			ISA:      []string{"AVX"},
28323		}, nil
28324	case operand.IsXMM(imxy) && operand.IsXMM(mxy) && operand.IsXMM(xy):
28325		return &intrep.Instruction{
28326			Opcode:   "VPERMILPS",
28327			Operands: []operand.Op{imxy, mxy, xy},
28328			Inputs:   []operand.Op{imxy, mxy},
28329			Outputs:  []operand.Op{xy},
28330			ISA:      []string{"AVX"},
28331		}, nil
28332	case operand.IsM128(imxy) && operand.IsXMM(mxy) && operand.IsXMM(xy):
28333		return &intrep.Instruction{
28334			Opcode:   "VPERMILPS",
28335			Operands: []operand.Op{imxy, mxy, xy},
28336			Inputs:   []operand.Op{imxy, mxy},
28337			Outputs:  []operand.Op{xy},
28338			ISA:      []string{"AVX"},
28339		}, nil
28340	case operand.IsIMM8(imxy) && operand.IsM128(mxy) && operand.IsXMM(xy):
28341		return &intrep.Instruction{
28342			Opcode:   "VPERMILPS",
28343			Operands: []operand.Op{imxy, mxy, xy},
28344			Inputs:   []operand.Op{mxy},
28345			Outputs:  []operand.Op{xy},
28346			ISA:      []string{"AVX"},
28347		}, nil
28348	case operand.IsIMM8(imxy) && operand.IsYMM(mxy) && operand.IsYMM(xy):
28349		return &intrep.Instruction{
28350			Opcode:   "VPERMILPS",
28351			Operands: []operand.Op{imxy, mxy, xy},
28352			Inputs:   []operand.Op{mxy},
28353			Outputs:  []operand.Op{xy},
28354			ISA:      []string{"AVX"},
28355		}, nil
28356	case operand.IsYMM(imxy) && operand.IsYMM(mxy) && operand.IsYMM(xy):
28357		return &intrep.Instruction{
28358			Opcode:   "VPERMILPS",
28359			Operands: []operand.Op{imxy, mxy, xy},
28360			Inputs:   []operand.Op{imxy, mxy},
28361			Outputs:  []operand.Op{xy},
28362			ISA:      []string{"AVX"},
28363		}, nil
28364	case operand.IsM256(imxy) && operand.IsYMM(mxy) && operand.IsYMM(xy):
28365		return &intrep.Instruction{
28366			Opcode:   "VPERMILPS",
28367			Operands: []operand.Op{imxy, mxy, xy},
28368			Inputs:   []operand.Op{imxy, mxy},
28369			Outputs:  []operand.Op{xy},
28370			ISA:      []string{"AVX"},
28371		}, nil
28372	case operand.IsIMM8(imxy) && operand.IsM256(mxy) && operand.IsYMM(xy):
28373		return &intrep.Instruction{
28374			Opcode:   "VPERMILPS",
28375			Operands: []operand.Op{imxy, mxy, xy},
28376			Inputs:   []operand.Op{mxy},
28377			Outputs:  []operand.Op{xy},
28378			ISA:      []string{"AVX"},
28379		}, nil
28380	}
28381	return nil, errors.New("VPERMILPS: bad operands")
28382}
28383
28384// VPERMPD: Permute Double-Precision Floating-Point Elements.
28385//
28386// Forms:
28387//
28388// 	VPERMPD imm8 ymm  ymm
28389// 	VPERMPD imm8 m256 ymm
28390func VPERMPD(i, my, y operand.Op) (*intrep.Instruction, error) {
28391	switch {
28392	case operand.IsIMM8(i) && operand.IsYMM(my) && operand.IsYMM(y):
28393		return &intrep.Instruction{
28394			Opcode:   "VPERMPD",
28395			Operands: []operand.Op{i, my, y},
28396			Inputs:   []operand.Op{my},
28397			Outputs:  []operand.Op{y},
28398			ISA:      []string{"AVX2"},
28399		}, nil
28400	case operand.IsIMM8(i) && operand.IsM256(my) && operand.IsYMM(y):
28401		return &intrep.Instruction{
28402			Opcode:   "VPERMPD",
28403			Operands: []operand.Op{i, my, y},
28404			Inputs:   []operand.Op{my},
28405			Outputs:  []operand.Op{y},
28406			ISA:      []string{"AVX2"},
28407		}, nil
28408	}
28409	return nil, errors.New("VPERMPD: bad operands")
28410}
28411
28412// VPERMPS: Permute Single-Precision Floating-Point Elements.
28413//
28414// Forms:
28415//
28416// 	VPERMPS ymm  ymm ymm
28417// 	VPERMPS m256 ymm ymm
28418func VPERMPS(my, y, y1 operand.Op) (*intrep.Instruction, error) {
28419	switch {
28420	case operand.IsYMM(my) && operand.IsYMM(y) && operand.IsYMM(y1):
28421		return &intrep.Instruction{
28422			Opcode:   "VPERMPS",
28423			Operands: []operand.Op{my, y, y1},
28424			Inputs:   []operand.Op{my, y},
28425			Outputs:  []operand.Op{y1},
28426			ISA:      []string{"AVX2"},
28427		}, nil
28428	case operand.IsM256(my) && operand.IsYMM(y) && operand.IsYMM(y1):
28429		return &intrep.Instruction{
28430			Opcode:   "VPERMPS",
28431			Operands: []operand.Op{my, y, y1},
28432			Inputs:   []operand.Op{my, y},
28433			Outputs:  []operand.Op{y1},
28434			ISA:      []string{"AVX2"},
28435		}, nil
28436	}
28437	return nil, errors.New("VPERMPS: bad operands")
28438}
28439
28440// VPERMQ: Permute Quadword Integers.
28441//
28442// Forms:
28443//
28444// 	VPERMQ imm8 ymm  ymm
28445// 	VPERMQ imm8 m256 ymm
28446func VPERMQ(i, my, y operand.Op) (*intrep.Instruction, error) {
28447	switch {
28448	case operand.IsIMM8(i) && operand.IsYMM(my) && operand.IsYMM(y):
28449		return &intrep.Instruction{
28450			Opcode:   "VPERMQ",
28451			Operands: []operand.Op{i, my, y},
28452			Inputs:   []operand.Op{my},
28453			Outputs:  []operand.Op{y},
28454			ISA:      []string{"AVX2"},
28455		}, nil
28456	case operand.IsIMM8(i) && operand.IsM256(my) && operand.IsYMM(y):
28457		return &intrep.Instruction{
28458			Opcode:   "VPERMQ",
28459			Operands: []operand.Op{i, my, y},
28460			Inputs:   []operand.Op{my},
28461			Outputs:  []operand.Op{y},
28462			ISA:      []string{"AVX2"},
28463		}, nil
28464	}
28465	return nil, errors.New("VPERMQ: bad operands")
28466}
28467
28468// VPEXTRB: Extract Byte.
28469//
28470// Forms:
28471//
28472// 	VPEXTRB imm8 xmm r32
28473// 	VPEXTRB imm8 xmm m8
28474func VPEXTRB(i, x, mr operand.Op) (*intrep.Instruction, error) {
28475	switch {
28476	case operand.IsIMM8(i) && operand.IsXMM(x) && operand.IsR32(mr):
28477		return &intrep.Instruction{
28478			Opcode:   "VPEXTRB",
28479			Operands: []operand.Op{i, x, mr},
28480			Inputs:   []operand.Op{x},
28481			Outputs:  []operand.Op{mr},
28482			ISA:      []string{"AVX"},
28483		}, nil
28484	case operand.IsIMM8(i) && operand.IsXMM(x) && operand.IsM8(mr):
28485		return &intrep.Instruction{
28486			Opcode:   "VPEXTRB",
28487			Operands: []operand.Op{i, x, mr},
28488			Inputs:   []operand.Op{x},
28489			Outputs:  []operand.Op{mr},
28490			ISA:      []string{"AVX"},
28491		}, nil
28492	}
28493	return nil, errors.New("VPEXTRB: bad operands")
28494}
28495
28496// VPEXTRD: Extract Doubleword.
28497//
28498// Forms:
28499//
28500// 	VPEXTRD imm8 xmm r32
28501// 	VPEXTRD imm8 xmm m32
28502func VPEXTRD(i, x, mr operand.Op) (*intrep.Instruction, error) {
28503	switch {
28504	case operand.IsIMM8(i) && operand.IsXMM(x) && operand.IsR32(mr):
28505		return &intrep.Instruction{
28506			Opcode:   "VPEXTRD",
28507			Operands: []operand.Op{i, x, mr},
28508			Inputs:   []operand.Op{x},
28509			Outputs:  []operand.Op{mr},
28510			ISA:      []string{"AVX"},
28511		}, nil
28512	case operand.IsIMM8(i) && operand.IsXMM(x) && operand.IsM32(mr):
28513		return &intrep.Instruction{
28514			Opcode:   "VPEXTRD",
28515			Operands: []operand.Op{i, x, mr},
28516			Inputs:   []operand.Op{x},
28517			Outputs:  []operand.Op{mr},
28518			ISA:      []string{"AVX"},
28519		}, nil
28520	}
28521	return nil, errors.New("VPEXTRD: bad operands")
28522}
28523
28524// VPEXTRQ: Extract Quadword.
28525//
28526// Forms:
28527//
28528// 	VPEXTRQ imm8 xmm r64
28529// 	VPEXTRQ imm8 xmm m64
28530func VPEXTRQ(i, x, mr operand.Op) (*intrep.Instruction, error) {
28531	switch {
28532	case operand.IsIMM8(i) && operand.IsXMM(x) && operand.IsR64(mr):
28533		return &intrep.Instruction{
28534			Opcode:   "VPEXTRQ",
28535			Operands: []operand.Op{i, x, mr},
28536			Inputs:   []operand.Op{x},
28537			Outputs:  []operand.Op{mr},
28538			ISA:      []string{"AVX"},
28539		}, nil
28540	case operand.IsIMM8(i) && operand.IsXMM(x) && operand.IsM64(mr):
28541		return &intrep.Instruction{
28542			Opcode:   "VPEXTRQ",
28543			Operands: []operand.Op{i, x, mr},
28544			Inputs:   []operand.Op{x},
28545			Outputs:  []operand.Op{mr},
28546			ISA:      []string{"AVX"},
28547		}, nil
28548	}
28549	return nil, errors.New("VPEXTRQ: bad operands")
28550}
28551
28552// VPEXTRW: Extract Word.
28553//
28554// Forms:
28555//
28556// 	VPEXTRW imm8 xmm r32
28557// 	VPEXTRW imm8 xmm m16
28558func VPEXTRW(i, x, mr operand.Op) (*intrep.Instruction, error) {
28559	switch {
28560	case operand.IsIMM8(i) && operand.IsXMM(x) && operand.IsR32(mr):
28561		return &intrep.Instruction{
28562			Opcode:   "VPEXTRW",
28563			Operands: []operand.Op{i, x, mr},
28564			Inputs:   []operand.Op{x},
28565			Outputs:  []operand.Op{mr},
28566			ISA:      []string{"AVX"},
28567		}, nil
28568	case operand.IsIMM8(i) && operand.IsXMM(x) && operand.IsM16(mr):
28569		return &intrep.Instruction{
28570			Opcode:   "VPEXTRW",
28571			Operands: []operand.Op{i, x, mr},
28572			Inputs:   []operand.Op{x},
28573			Outputs:  []operand.Op{mr},
28574			ISA:      []string{"AVX"},
28575		}, nil
28576	}
28577	return nil, errors.New("VPEXTRW: bad operands")
28578}
28579
28580// VPGATHERDD: Gather Packed Doubleword Values Using Signed Doubleword Indices.
28581//
28582// Forms:
28583//
28584// 	VPGATHERDD xmm vm32x xmm
28585// 	VPGATHERDD ymm vm32y ymm
28586func VPGATHERDD(xy, v, xy1 operand.Op) (*intrep.Instruction, error) {
28587	switch {
28588	case operand.IsXMM(xy) && operand.IsVM32X(v) && operand.IsXMM(xy1):
28589		return &intrep.Instruction{
28590			Opcode:   "VPGATHERDD",
28591			Operands: []operand.Op{xy, v, xy1},
28592			Inputs:   []operand.Op{xy, v, xy1},
28593			Outputs:  []operand.Op{xy, xy1},
28594			ISA:      []string{"AVX2"},
28595		}, nil
28596	case operand.IsYMM(xy) && operand.IsVM32Y(v) && operand.IsYMM(xy1):
28597		return &intrep.Instruction{
28598			Opcode:   "VPGATHERDD",
28599			Operands: []operand.Op{xy, v, xy1},
28600			Inputs:   []operand.Op{xy, v, xy1},
28601			Outputs:  []operand.Op{xy, xy1},
28602			ISA:      []string{"AVX2"},
28603		}, nil
28604	}
28605	return nil, errors.New("VPGATHERDD: bad operands")
28606}
28607
28608// VPGATHERDQ: Gather Packed Quadword Values Using Signed Doubleword Indices.
28609//
28610// Forms:
28611//
28612// 	VPGATHERDQ xmm vm32x xmm
28613// 	VPGATHERDQ ymm vm32x ymm
28614func VPGATHERDQ(xy, v, xy1 operand.Op) (*intrep.Instruction, error) {
28615	switch {
28616	case operand.IsXMM(xy) && operand.IsVM32X(v) && operand.IsXMM(xy1):
28617		return &intrep.Instruction{
28618			Opcode:   "VPGATHERDQ",
28619			Operands: []operand.Op{xy, v, xy1},
28620			Inputs:   []operand.Op{xy, v, xy1},
28621			Outputs:  []operand.Op{xy, xy1},
28622			ISA:      []string{"AVX2"},
28623		}, nil
28624	case operand.IsYMM(xy) && operand.IsVM32X(v) && operand.IsYMM(xy1):
28625		return &intrep.Instruction{
28626			Opcode:   "VPGATHERDQ",
28627			Operands: []operand.Op{xy, v, xy1},
28628			Inputs:   []operand.Op{xy, v, xy1},
28629			Outputs:  []operand.Op{xy, xy1},
28630			ISA:      []string{"AVX2"},
28631		}, nil
28632	}
28633	return nil, errors.New("VPGATHERDQ: bad operands")
28634}
28635
28636// VPGATHERQD: Gather Packed Doubleword Values Using Signed Quadword Indices.
28637//
28638// Forms:
28639//
28640// 	VPGATHERQD xmm vm64x xmm
28641// 	VPGATHERQD xmm vm64y xmm
28642func VPGATHERQD(x, v, x1 operand.Op) (*intrep.Instruction, error) {
28643	switch {
28644	case operand.IsXMM(x) && operand.IsVM64X(v) && operand.IsXMM(x1):
28645		return &intrep.Instruction{
28646			Opcode:   "VPGATHERQD",
28647			Operands: []operand.Op{x, v, x1},
28648			Inputs:   []operand.Op{x, v, x1},
28649			Outputs:  []operand.Op{x, x1},
28650			ISA:      []string{"AVX2"},
28651		}, nil
28652	case operand.IsXMM(x) && operand.IsVM64Y(v) && operand.IsXMM(x1):
28653		return &intrep.Instruction{
28654			Opcode:   "VPGATHERQD",
28655			Operands: []operand.Op{x, v, x1},
28656			Inputs:   []operand.Op{x, v, x1},
28657			Outputs:  []operand.Op{x, x1},
28658			ISA:      []string{"AVX2"},
28659		}, nil
28660	}
28661	return nil, errors.New("VPGATHERQD: bad operands")
28662}
28663
28664// VPGATHERQQ: Gather Packed Quadword Values Using Signed Quadword Indices.
28665//
28666// Forms:
28667//
28668// 	VPGATHERQQ xmm vm64x xmm
28669// 	VPGATHERQQ ymm vm64y ymm
28670func VPGATHERQQ(xy, v, xy1 operand.Op) (*intrep.Instruction, error) {
28671	switch {
28672	case operand.IsXMM(xy) && operand.IsVM64X(v) && operand.IsXMM(xy1):
28673		return &intrep.Instruction{
28674			Opcode:   "VPGATHERQQ",
28675			Operands: []operand.Op{xy, v, xy1},
28676			Inputs:   []operand.Op{xy, v, xy1},
28677			Outputs:  []operand.Op{xy, xy1},
28678			ISA:      []string{"AVX2"},
28679		}, nil
28680	case operand.IsYMM(xy) && operand.IsVM64Y(v) && operand.IsYMM(xy1):
28681		return &intrep.Instruction{
28682			Opcode:   "VPGATHERQQ",
28683			Operands: []operand.Op{xy, v, xy1},
28684			Inputs:   []operand.Op{xy, v, xy1},
28685			Outputs:  []operand.Op{xy, xy1},
28686			ISA:      []string{"AVX2"},
28687		}, nil
28688	}
28689	return nil, errors.New("VPGATHERQQ: bad operands")
28690}
28691
28692// VPHADDD: Packed Horizontal Add Doubleword Integer.
28693//
28694// Forms:
28695//
28696// 	VPHADDD xmm  xmm xmm
28697// 	VPHADDD m128 xmm xmm
28698// 	VPHADDD ymm  ymm ymm
28699// 	VPHADDD m256 ymm ymm
28700func VPHADDD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
28701	switch {
28702	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
28703		return &intrep.Instruction{
28704			Opcode:   "VPHADDD",
28705			Operands: []operand.Op{mxy, xy, xy1},
28706			Inputs:   []operand.Op{mxy, xy},
28707			Outputs:  []operand.Op{xy1},
28708			ISA:      []string{"AVX"},
28709		}, nil
28710	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
28711		return &intrep.Instruction{
28712			Opcode:   "VPHADDD",
28713			Operands: []operand.Op{mxy, xy, xy1},
28714			Inputs:   []operand.Op{mxy, xy},
28715			Outputs:  []operand.Op{xy1},
28716			ISA:      []string{"AVX"},
28717		}, nil
28718	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
28719		return &intrep.Instruction{
28720			Opcode:   "VPHADDD",
28721			Operands: []operand.Op{mxy, xy, xy1},
28722			Inputs:   []operand.Op{mxy, xy},
28723			Outputs:  []operand.Op{xy1},
28724			ISA:      []string{"AVX2"},
28725		}, nil
28726	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
28727		return &intrep.Instruction{
28728			Opcode:   "VPHADDD",
28729			Operands: []operand.Op{mxy, xy, xy1},
28730			Inputs:   []operand.Op{mxy, xy},
28731			Outputs:  []operand.Op{xy1},
28732			ISA:      []string{"AVX2"},
28733		}, nil
28734	}
28735	return nil, errors.New("VPHADDD: bad operands")
28736}
28737
28738// VPHADDSW: Packed Horizontal Add Signed Word Integers with Signed Saturation.
28739//
28740// Forms:
28741//
28742// 	VPHADDSW xmm  xmm xmm
28743// 	VPHADDSW m128 xmm xmm
28744// 	VPHADDSW ymm  ymm ymm
28745// 	VPHADDSW m256 ymm ymm
28746func VPHADDSW(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
28747	switch {
28748	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
28749		return &intrep.Instruction{
28750			Opcode:   "VPHADDSW",
28751			Operands: []operand.Op{mxy, xy, xy1},
28752			Inputs:   []operand.Op{mxy, xy},
28753			Outputs:  []operand.Op{xy1},
28754			ISA:      []string{"AVX"},
28755		}, nil
28756	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
28757		return &intrep.Instruction{
28758			Opcode:   "VPHADDSW",
28759			Operands: []operand.Op{mxy, xy, xy1},
28760			Inputs:   []operand.Op{mxy, xy},
28761			Outputs:  []operand.Op{xy1},
28762			ISA:      []string{"AVX"},
28763		}, nil
28764	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
28765		return &intrep.Instruction{
28766			Opcode:   "VPHADDSW",
28767			Operands: []operand.Op{mxy, xy, xy1},
28768			Inputs:   []operand.Op{mxy, xy},
28769			Outputs:  []operand.Op{xy1},
28770			ISA:      []string{"AVX2"},
28771		}, nil
28772	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
28773		return &intrep.Instruction{
28774			Opcode:   "VPHADDSW",
28775			Operands: []operand.Op{mxy, xy, xy1},
28776			Inputs:   []operand.Op{mxy, xy},
28777			Outputs:  []operand.Op{xy1},
28778			ISA:      []string{"AVX2"},
28779		}, nil
28780	}
28781	return nil, errors.New("VPHADDSW: bad operands")
28782}
28783
28784// VPHADDW: Packed Horizontal Add Word Integers.
28785//
28786// Forms:
28787//
28788// 	VPHADDW xmm  xmm xmm
28789// 	VPHADDW m128 xmm xmm
28790// 	VPHADDW ymm  ymm ymm
28791// 	VPHADDW m256 ymm ymm
28792func VPHADDW(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
28793	switch {
28794	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
28795		return &intrep.Instruction{
28796			Opcode:   "VPHADDW",
28797			Operands: []operand.Op{mxy, xy, xy1},
28798			Inputs:   []operand.Op{mxy, xy},
28799			Outputs:  []operand.Op{xy1},
28800			ISA:      []string{"AVX"},
28801		}, nil
28802	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
28803		return &intrep.Instruction{
28804			Opcode:   "VPHADDW",
28805			Operands: []operand.Op{mxy, xy, xy1},
28806			Inputs:   []operand.Op{mxy, xy},
28807			Outputs:  []operand.Op{xy1},
28808			ISA:      []string{"AVX"},
28809		}, nil
28810	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
28811		return &intrep.Instruction{
28812			Opcode:   "VPHADDW",
28813			Operands: []operand.Op{mxy, xy, xy1},
28814			Inputs:   []operand.Op{mxy, xy},
28815			Outputs:  []operand.Op{xy1},
28816			ISA:      []string{"AVX2"},
28817		}, nil
28818	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
28819		return &intrep.Instruction{
28820			Opcode:   "VPHADDW",
28821			Operands: []operand.Op{mxy, xy, xy1},
28822			Inputs:   []operand.Op{mxy, xy},
28823			Outputs:  []operand.Op{xy1},
28824			ISA:      []string{"AVX2"},
28825		}, nil
28826	}
28827	return nil, errors.New("VPHADDW: bad operands")
28828}
28829
28830// VPHMINPOSUW: Packed Horizontal Minimum of Unsigned Word Integers.
28831//
28832// Forms:
28833//
28834// 	VPHMINPOSUW xmm  xmm
28835// 	VPHMINPOSUW m128 xmm
28836func VPHMINPOSUW(mx, x operand.Op) (*intrep.Instruction, error) {
28837	switch {
28838	case operand.IsXMM(mx) && operand.IsXMM(x):
28839		return &intrep.Instruction{
28840			Opcode:   "VPHMINPOSUW",
28841			Operands: []operand.Op{mx, x},
28842			Inputs:   []operand.Op{mx},
28843			Outputs:  []operand.Op{x},
28844			ISA:      []string{"AVX"},
28845		}, nil
28846	case operand.IsM128(mx) && operand.IsXMM(x):
28847		return &intrep.Instruction{
28848			Opcode:   "VPHMINPOSUW",
28849			Operands: []operand.Op{mx, x},
28850			Inputs:   []operand.Op{mx},
28851			Outputs:  []operand.Op{x},
28852			ISA:      []string{"AVX"},
28853		}, nil
28854	}
28855	return nil, errors.New("VPHMINPOSUW: bad operands")
28856}
28857
28858// VPHSUBD: Packed Horizontal Subtract Doubleword Integers.
28859//
28860// Forms:
28861//
28862// 	VPHSUBD xmm  xmm xmm
28863// 	VPHSUBD m128 xmm xmm
28864// 	VPHSUBD ymm  ymm ymm
28865// 	VPHSUBD m256 ymm ymm
28866func VPHSUBD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
28867	switch {
28868	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
28869		return &intrep.Instruction{
28870			Opcode:           "VPHSUBD",
28871			Operands:         []operand.Op{mxy, xy, xy1},
28872			Inputs:           []operand.Op{mxy, xy},
28873			Outputs:          []operand.Op{xy1},
28874			ISA:              []string{"AVX"},
28875			CancellingInputs: true,
28876		}, nil
28877	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
28878		return &intrep.Instruction{
28879			Opcode:   "VPHSUBD",
28880			Operands: []operand.Op{mxy, xy, xy1},
28881			Inputs:   []operand.Op{mxy, xy},
28882			Outputs:  []operand.Op{xy1},
28883			ISA:      []string{"AVX"},
28884		}, nil
28885	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
28886		return &intrep.Instruction{
28887			Opcode:           "VPHSUBD",
28888			Operands:         []operand.Op{mxy, xy, xy1},
28889			Inputs:           []operand.Op{mxy, xy},
28890			Outputs:          []operand.Op{xy1},
28891			ISA:              []string{"AVX2"},
28892			CancellingInputs: true,
28893		}, nil
28894	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
28895		return &intrep.Instruction{
28896			Opcode:   "VPHSUBD",
28897			Operands: []operand.Op{mxy, xy, xy1},
28898			Inputs:   []operand.Op{mxy, xy},
28899			Outputs:  []operand.Op{xy1},
28900			ISA:      []string{"AVX2"},
28901		}, nil
28902	}
28903	return nil, errors.New("VPHSUBD: bad operands")
28904}
28905
28906// VPHSUBSW: Packed Horizontal Subtract Signed Word Integers with Signed Saturation.
28907//
28908// Forms:
28909//
28910// 	VPHSUBSW xmm  xmm xmm
28911// 	VPHSUBSW m128 xmm xmm
28912// 	VPHSUBSW ymm  ymm ymm
28913// 	VPHSUBSW m256 ymm ymm
28914func VPHSUBSW(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
28915	switch {
28916	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
28917		return &intrep.Instruction{
28918			Opcode:           "VPHSUBSW",
28919			Operands:         []operand.Op{mxy, xy, xy1},
28920			Inputs:           []operand.Op{mxy, xy},
28921			Outputs:          []operand.Op{xy1},
28922			ISA:              []string{"AVX"},
28923			CancellingInputs: true,
28924		}, nil
28925	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
28926		return &intrep.Instruction{
28927			Opcode:   "VPHSUBSW",
28928			Operands: []operand.Op{mxy, xy, xy1},
28929			Inputs:   []operand.Op{mxy, xy},
28930			Outputs:  []operand.Op{xy1},
28931			ISA:      []string{"AVX"},
28932		}, nil
28933	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
28934		return &intrep.Instruction{
28935			Opcode:           "VPHSUBSW",
28936			Operands:         []operand.Op{mxy, xy, xy1},
28937			Inputs:           []operand.Op{mxy, xy},
28938			Outputs:          []operand.Op{xy1},
28939			ISA:              []string{"AVX2"},
28940			CancellingInputs: true,
28941		}, nil
28942	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
28943		return &intrep.Instruction{
28944			Opcode:   "VPHSUBSW",
28945			Operands: []operand.Op{mxy, xy, xy1},
28946			Inputs:   []operand.Op{mxy, xy},
28947			Outputs:  []operand.Op{xy1},
28948			ISA:      []string{"AVX2"},
28949		}, nil
28950	}
28951	return nil, errors.New("VPHSUBSW: bad operands")
28952}
28953
28954// VPHSUBW: Packed Horizontal Subtract Word Integers.
28955//
28956// Forms:
28957//
28958// 	VPHSUBW xmm  xmm xmm
28959// 	VPHSUBW m128 xmm xmm
28960// 	VPHSUBW ymm  ymm ymm
28961// 	VPHSUBW m256 ymm ymm
28962func VPHSUBW(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
28963	switch {
28964	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
28965		return &intrep.Instruction{
28966			Opcode:           "VPHSUBW",
28967			Operands:         []operand.Op{mxy, xy, xy1},
28968			Inputs:           []operand.Op{mxy, xy},
28969			Outputs:          []operand.Op{xy1},
28970			ISA:              []string{"AVX"},
28971			CancellingInputs: true,
28972		}, nil
28973	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
28974		return &intrep.Instruction{
28975			Opcode:   "VPHSUBW",
28976			Operands: []operand.Op{mxy, xy, xy1},
28977			Inputs:   []operand.Op{mxy, xy},
28978			Outputs:  []operand.Op{xy1},
28979			ISA:      []string{"AVX"},
28980		}, nil
28981	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
28982		return &intrep.Instruction{
28983			Opcode:           "VPHSUBW",
28984			Operands:         []operand.Op{mxy, xy, xy1},
28985			Inputs:           []operand.Op{mxy, xy},
28986			Outputs:          []operand.Op{xy1},
28987			ISA:              []string{"AVX2"},
28988			CancellingInputs: true,
28989		}, nil
28990	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
28991		return &intrep.Instruction{
28992			Opcode:   "VPHSUBW",
28993			Operands: []operand.Op{mxy, xy, xy1},
28994			Inputs:   []operand.Op{mxy, xy},
28995			Outputs:  []operand.Op{xy1},
28996			ISA:      []string{"AVX2"},
28997		}, nil
28998	}
28999	return nil, errors.New("VPHSUBW: bad operands")
29000}
29001
29002// VPINSRB: Insert Byte.
29003//
29004// Forms:
29005//
29006// 	VPINSRB imm8 r32 xmm xmm
29007// 	VPINSRB imm8 m8  xmm xmm
29008func VPINSRB(i, mr, x, x1 operand.Op) (*intrep.Instruction, error) {
29009	switch {
29010	case operand.IsIMM8(i) && operand.IsR32(mr) && operand.IsXMM(x) && operand.IsXMM(x1):
29011		return &intrep.Instruction{
29012			Opcode:   "VPINSRB",
29013			Operands: []operand.Op{i, mr, x, x1},
29014			Inputs:   []operand.Op{mr, x},
29015			Outputs:  []operand.Op{x1},
29016			ISA:      []string{"AVX"},
29017		}, nil
29018	case operand.IsIMM8(i) && operand.IsM8(mr) && operand.IsXMM(x) && operand.IsXMM(x1):
29019		return &intrep.Instruction{
29020			Opcode:   "VPINSRB",
29021			Operands: []operand.Op{i, mr, x, x1},
29022			Inputs:   []operand.Op{mr, x},
29023			Outputs:  []operand.Op{x1},
29024			ISA:      []string{"AVX"},
29025		}, nil
29026	}
29027	return nil, errors.New("VPINSRB: bad operands")
29028}
29029
29030// VPINSRD: Insert Doubleword.
29031//
29032// Forms:
29033//
29034// 	VPINSRD imm8 r32 xmm xmm
29035// 	VPINSRD imm8 m32 xmm xmm
29036func VPINSRD(i, mr, x, x1 operand.Op) (*intrep.Instruction, error) {
29037	switch {
29038	case operand.IsIMM8(i) && operand.IsR32(mr) && operand.IsXMM(x) && operand.IsXMM(x1):
29039		return &intrep.Instruction{
29040			Opcode:   "VPINSRD",
29041			Operands: []operand.Op{i, mr, x, x1},
29042			Inputs:   []operand.Op{mr, x},
29043			Outputs:  []operand.Op{x1},
29044			ISA:      []string{"AVX"},
29045		}, nil
29046	case operand.IsIMM8(i) && operand.IsM32(mr) && operand.IsXMM(x) && operand.IsXMM(x1):
29047		return &intrep.Instruction{
29048			Opcode:   "VPINSRD",
29049			Operands: []operand.Op{i, mr, x, x1},
29050			Inputs:   []operand.Op{mr, x},
29051			Outputs:  []operand.Op{x1},
29052			ISA:      []string{"AVX"},
29053		}, nil
29054	}
29055	return nil, errors.New("VPINSRD: bad operands")
29056}
29057
29058// VPINSRQ: Insert Quadword.
29059//
29060// Forms:
29061//
29062// 	VPINSRQ imm8 r64 xmm xmm
29063// 	VPINSRQ imm8 m64 xmm xmm
29064func VPINSRQ(i, mr, x, x1 operand.Op) (*intrep.Instruction, error) {
29065	switch {
29066	case operand.IsIMM8(i) && operand.IsR64(mr) && operand.IsXMM(x) && operand.IsXMM(x1):
29067		return &intrep.Instruction{
29068			Opcode:   "VPINSRQ",
29069			Operands: []operand.Op{i, mr, x, x1},
29070			Inputs:   []operand.Op{mr, x},
29071			Outputs:  []operand.Op{x1},
29072			ISA:      []string{"AVX"},
29073		}, nil
29074	case operand.IsIMM8(i) && operand.IsM64(mr) && operand.IsXMM(x) && operand.IsXMM(x1):
29075		return &intrep.Instruction{
29076			Opcode:   "VPINSRQ",
29077			Operands: []operand.Op{i, mr, x, x1},
29078			Inputs:   []operand.Op{mr, x},
29079			Outputs:  []operand.Op{x1},
29080			ISA:      []string{"AVX"},
29081		}, nil
29082	}
29083	return nil, errors.New("VPINSRQ: bad operands")
29084}
29085
29086// VPINSRW: Insert Word.
29087//
29088// Forms:
29089//
29090// 	VPINSRW imm8 r32 xmm xmm
29091// 	VPINSRW imm8 m16 xmm xmm
29092func VPINSRW(i, mr, x, x1 operand.Op) (*intrep.Instruction, error) {
29093	switch {
29094	case operand.IsIMM8(i) && operand.IsR32(mr) && operand.IsXMM(x) && operand.IsXMM(x1):
29095		return &intrep.Instruction{
29096			Opcode:   "VPINSRW",
29097			Operands: []operand.Op{i, mr, x, x1},
29098			Inputs:   []operand.Op{mr, x},
29099			Outputs:  []operand.Op{x1},
29100			ISA:      []string{"AVX"},
29101		}, nil
29102	case operand.IsIMM8(i) && operand.IsM16(mr) && operand.IsXMM(x) && operand.IsXMM(x1):
29103		return &intrep.Instruction{
29104			Opcode:   "VPINSRW",
29105			Operands: []operand.Op{i, mr, x, x1},
29106			Inputs:   []operand.Op{mr, x},
29107			Outputs:  []operand.Op{x1},
29108			ISA:      []string{"AVX"},
29109		}, nil
29110	}
29111	return nil, errors.New("VPINSRW: bad operands")
29112}
29113
29114// VPMADDUBSW: Multiply and Add Packed Signed and Unsigned Byte Integers.
29115//
29116// Forms:
29117//
29118// 	VPMADDUBSW xmm  xmm xmm
29119// 	VPMADDUBSW m128 xmm xmm
29120// 	VPMADDUBSW ymm  ymm ymm
29121// 	VPMADDUBSW m256 ymm ymm
29122func VPMADDUBSW(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
29123	switch {
29124	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
29125		return &intrep.Instruction{
29126			Opcode:   "VPMADDUBSW",
29127			Operands: []operand.Op{mxy, xy, xy1},
29128			Inputs:   []operand.Op{mxy, xy},
29129			Outputs:  []operand.Op{xy1},
29130			ISA:      []string{"AVX"},
29131		}, nil
29132	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
29133		return &intrep.Instruction{
29134			Opcode:   "VPMADDUBSW",
29135			Operands: []operand.Op{mxy, xy, xy1},
29136			Inputs:   []operand.Op{mxy, xy},
29137			Outputs:  []operand.Op{xy1},
29138			ISA:      []string{"AVX"},
29139		}, nil
29140	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
29141		return &intrep.Instruction{
29142			Opcode:   "VPMADDUBSW",
29143			Operands: []operand.Op{mxy, xy, xy1},
29144			Inputs:   []operand.Op{mxy, xy},
29145			Outputs:  []operand.Op{xy1},
29146			ISA:      []string{"AVX2"},
29147		}, nil
29148	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
29149		return &intrep.Instruction{
29150			Opcode:   "VPMADDUBSW",
29151			Operands: []operand.Op{mxy, xy, xy1},
29152			Inputs:   []operand.Op{mxy, xy},
29153			Outputs:  []operand.Op{xy1},
29154			ISA:      []string{"AVX2"},
29155		}, nil
29156	}
29157	return nil, errors.New("VPMADDUBSW: bad operands")
29158}
29159
29160// VPMADDWD: Multiply and Add Packed Signed Word Integers.
29161//
29162// Forms:
29163//
29164// 	VPMADDWD xmm  xmm xmm
29165// 	VPMADDWD m128 xmm xmm
29166// 	VPMADDWD ymm  ymm ymm
29167// 	VPMADDWD m256 ymm ymm
29168func VPMADDWD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
29169	switch {
29170	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
29171		return &intrep.Instruction{
29172			Opcode:   "VPMADDWD",
29173			Operands: []operand.Op{mxy, xy, xy1},
29174			Inputs:   []operand.Op{mxy, xy},
29175			Outputs:  []operand.Op{xy1},
29176			ISA:      []string{"AVX"},
29177		}, nil
29178	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
29179		return &intrep.Instruction{
29180			Opcode:   "VPMADDWD",
29181			Operands: []operand.Op{mxy, xy, xy1},
29182			Inputs:   []operand.Op{mxy, xy},
29183			Outputs:  []operand.Op{xy1},
29184			ISA:      []string{"AVX"},
29185		}, nil
29186	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
29187		return &intrep.Instruction{
29188			Opcode:   "VPMADDWD",
29189			Operands: []operand.Op{mxy, xy, xy1},
29190			Inputs:   []operand.Op{mxy, xy},
29191			Outputs:  []operand.Op{xy1},
29192			ISA:      []string{"AVX2"},
29193		}, nil
29194	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
29195		return &intrep.Instruction{
29196			Opcode:   "VPMADDWD",
29197			Operands: []operand.Op{mxy, xy, xy1},
29198			Inputs:   []operand.Op{mxy, xy},
29199			Outputs:  []operand.Op{xy1},
29200			ISA:      []string{"AVX2"},
29201		}, nil
29202	}
29203	return nil, errors.New("VPMADDWD: bad operands")
29204}
29205
29206// VPMASKMOVD: Conditional Move Packed Doubleword Integers.
29207//
29208// Forms:
29209//
29210// 	VPMASKMOVD m128 xmm xmm
29211// 	VPMASKMOVD m256 ymm ymm
29212// 	VPMASKMOVD xmm  xmm m128
29213// 	VPMASKMOVD ymm  ymm m256
29214func VPMASKMOVD(mxy, xy, mxy1 operand.Op) (*intrep.Instruction, error) {
29215	switch {
29216	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(mxy1):
29217		return &intrep.Instruction{
29218			Opcode:   "VPMASKMOVD",
29219			Operands: []operand.Op{mxy, xy, mxy1},
29220			Inputs:   []operand.Op{mxy, xy},
29221			Outputs:  []operand.Op{mxy1},
29222			ISA:      []string{"AVX2"},
29223		}, nil
29224	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(mxy1):
29225		return &intrep.Instruction{
29226			Opcode:   "VPMASKMOVD",
29227			Operands: []operand.Op{mxy, xy, mxy1},
29228			Inputs:   []operand.Op{mxy, xy},
29229			Outputs:  []operand.Op{mxy1},
29230			ISA:      []string{"AVX2"},
29231		}, nil
29232	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsM128(mxy1):
29233		return &intrep.Instruction{
29234			Opcode:   "VPMASKMOVD",
29235			Operands: []operand.Op{mxy, xy, mxy1},
29236			Inputs:   []operand.Op{mxy, xy},
29237			Outputs:  []operand.Op{mxy1},
29238			ISA:      []string{"AVX2"},
29239		}, nil
29240	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsM256(mxy1):
29241		return &intrep.Instruction{
29242			Opcode:   "VPMASKMOVD",
29243			Operands: []operand.Op{mxy, xy, mxy1},
29244			Inputs:   []operand.Op{mxy, xy},
29245			Outputs:  []operand.Op{mxy1},
29246			ISA:      []string{"AVX2"},
29247		}, nil
29248	}
29249	return nil, errors.New("VPMASKMOVD: bad operands")
29250}
29251
29252// VPMASKMOVQ: Conditional Move Packed Quadword Integers.
29253//
29254// Forms:
29255//
29256// 	VPMASKMOVQ m128 xmm xmm
29257// 	VPMASKMOVQ m256 ymm ymm
29258// 	VPMASKMOVQ xmm  xmm m128
29259// 	VPMASKMOVQ ymm  ymm m256
29260func VPMASKMOVQ(mxy, xy, mxy1 operand.Op) (*intrep.Instruction, error) {
29261	switch {
29262	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(mxy1):
29263		return &intrep.Instruction{
29264			Opcode:   "VPMASKMOVQ",
29265			Operands: []operand.Op{mxy, xy, mxy1},
29266			Inputs:   []operand.Op{mxy, xy},
29267			Outputs:  []operand.Op{mxy1},
29268			ISA:      []string{"AVX2"},
29269		}, nil
29270	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(mxy1):
29271		return &intrep.Instruction{
29272			Opcode:   "VPMASKMOVQ",
29273			Operands: []operand.Op{mxy, xy, mxy1},
29274			Inputs:   []operand.Op{mxy, xy},
29275			Outputs:  []operand.Op{mxy1},
29276			ISA:      []string{"AVX2"},
29277		}, nil
29278	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsM128(mxy1):
29279		return &intrep.Instruction{
29280			Opcode:   "VPMASKMOVQ",
29281			Operands: []operand.Op{mxy, xy, mxy1},
29282			Inputs:   []operand.Op{mxy, xy},
29283			Outputs:  []operand.Op{mxy1},
29284			ISA:      []string{"AVX2"},
29285		}, nil
29286	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsM256(mxy1):
29287		return &intrep.Instruction{
29288			Opcode:   "VPMASKMOVQ",
29289			Operands: []operand.Op{mxy, xy, mxy1},
29290			Inputs:   []operand.Op{mxy, xy},
29291			Outputs:  []operand.Op{mxy1},
29292			ISA:      []string{"AVX2"},
29293		}, nil
29294	}
29295	return nil, errors.New("VPMASKMOVQ: bad operands")
29296}
29297
29298// VPMAXSB: Maximum of Packed Signed Byte Integers.
29299//
29300// Forms:
29301//
29302// 	VPMAXSB xmm  xmm xmm
29303// 	VPMAXSB m128 xmm xmm
29304// 	VPMAXSB ymm  ymm ymm
29305// 	VPMAXSB m256 ymm ymm
29306func VPMAXSB(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
29307	switch {
29308	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
29309		return &intrep.Instruction{
29310			Opcode:   "VPMAXSB",
29311			Operands: []operand.Op{mxy, xy, xy1},
29312			Inputs:   []operand.Op{mxy, xy},
29313			Outputs:  []operand.Op{xy1},
29314			ISA:      []string{"AVX"},
29315		}, nil
29316	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
29317		return &intrep.Instruction{
29318			Opcode:   "VPMAXSB",
29319			Operands: []operand.Op{mxy, xy, xy1},
29320			Inputs:   []operand.Op{mxy, xy},
29321			Outputs:  []operand.Op{xy1},
29322			ISA:      []string{"AVX"},
29323		}, nil
29324	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
29325		return &intrep.Instruction{
29326			Opcode:   "VPMAXSB",
29327			Operands: []operand.Op{mxy, xy, xy1},
29328			Inputs:   []operand.Op{mxy, xy},
29329			Outputs:  []operand.Op{xy1},
29330			ISA:      []string{"AVX2"},
29331		}, nil
29332	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
29333		return &intrep.Instruction{
29334			Opcode:   "VPMAXSB",
29335			Operands: []operand.Op{mxy, xy, xy1},
29336			Inputs:   []operand.Op{mxy, xy},
29337			Outputs:  []operand.Op{xy1},
29338			ISA:      []string{"AVX2"},
29339		}, nil
29340	}
29341	return nil, errors.New("VPMAXSB: bad operands")
29342}
29343
29344// VPMAXSD: Maximum of Packed Signed Doubleword Integers.
29345//
29346// Forms:
29347//
29348// 	VPMAXSD xmm  xmm xmm
29349// 	VPMAXSD m128 xmm xmm
29350// 	VPMAXSD ymm  ymm ymm
29351// 	VPMAXSD m256 ymm ymm
29352func VPMAXSD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
29353	switch {
29354	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
29355		return &intrep.Instruction{
29356			Opcode:   "VPMAXSD",
29357			Operands: []operand.Op{mxy, xy, xy1},
29358			Inputs:   []operand.Op{mxy, xy},
29359			Outputs:  []operand.Op{xy1},
29360			ISA:      []string{"AVX"},
29361		}, nil
29362	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
29363		return &intrep.Instruction{
29364			Opcode:   "VPMAXSD",
29365			Operands: []operand.Op{mxy, xy, xy1},
29366			Inputs:   []operand.Op{mxy, xy},
29367			Outputs:  []operand.Op{xy1},
29368			ISA:      []string{"AVX"},
29369		}, nil
29370	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
29371		return &intrep.Instruction{
29372			Opcode:   "VPMAXSD",
29373			Operands: []operand.Op{mxy, xy, xy1},
29374			Inputs:   []operand.Op{mxy, xy},
29375			Outputs:  []operand.Op{xy1},
29376			ISA:      []string{"AVX2"},
29377		}, nil
29378	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
29379		return &intrep.Instruction{
29380			Opcode:   "VPMAXSD",
29381			Operands: []operand.Op{mxy, xy, xy1},
29382			Inputs:   []operand.Op{mxy, xy},
29383			Outputs:  []operand.Op{xy1},
29384			ISA:      []string{"AVX2"},
29385		}, nil
29386	}
29387	return nil, errors.New("VPMAXSD: bad operands")
29388}
29389
29390// VPMAXSW: Maximum of Packed Signed Word Integers.
29391//
29392// Forms:
29393//
29394// 	VPMAXSW xmm  xmm xmm
29395// 	VPMAXSW m128 xmm xmm
29396// 	VPMAXSW ymm  ymm ymm
29397// 	VPMAXSW m256 ymm ymm
29398func VPMAXSW(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
29399	switch {
29400	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
29401		return &intrep.Instruction{
29402			Opcode:   "VPMAXSW",
29403			Operands: []operand.Op{mxy, xy, xy1},
29404			Inputs:   []operand.Op{mxy, xy},
29405			Outputs:  []operand.Op{xy1},
29406			ISA:      []string{"AVX"},
29407		}, nil
29408	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
29409		return &intrep.Instruction{
29410			Opcode:   "VPMAXSW",
29411			Operands: []operand.Op{mxy, xy, xy1},
29412			Inputs:   []operand.Op{mxy, xy},
29413			Outputs:  []operand.Op{xy1},
29414			ISA:      []string{"AVX"},
29415		}, nil
29416	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
29417		return &intrep.Instruction{
29418			Opcode:   "VPMAXSW",
29419			Operands: []operand.Op{mxy, xy, xy1},
29420			Inputs:   []operand.Op{mxy, xy},
29421			Outputs:  []operand.Op{xy1},
29422			ISA:      []string{"AVX2"},
29423		}, nil
29424	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
29425		return &intrep.Instruction{
29426			Opcode:   "VPMAXSW",
29427			Operands: []operand.Op{mxy, xy, xy1},
29428			Inputs:   []operand.Op{mxy, xy},
29429			Outputs:  []operand.Op{xy1},
29430			ISA:      []string{"AVX2"},
29431		}, nil
29432	}
29433	return nil, errors.New("VPMAXSW: bad operands")
29434}
29435
29436// VPMAXUB: Maximum of Packed Unsigned Byte Integers.
29437//
29438// Forms:
29439//
29440// 	VPMAXUB xmm  xmm xmm
29441// 	VPMAXUB m128 xmm xmm
29442// 	VPMAXUB ymm  ymm ymm
29443// 	VPMAXUB m256 ymm ymm
29444func VPMAXUB(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
29445	switch {
29446	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
29447		return &intrep.Instruction{
29448			Opcode:   "VPMAXUB",
29449			Operands: []operand.Op{mxy, xy, xy1},
29450			Inputs:   []operand.Op{mxy, xy},
29451			Outputs:  []operand.Op{xy1},
29452			ISA:      []string{"AVX"},
29453		}, nil
29454	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
29455		return &intrep.Instruction{
29456			Opcode:   "VPMAXUB",
29457			Operands: []operand.Op{mxy, xy, xy1},
29458			Inputs:   []operand.Op{mxy, xy},
29459			Outputs:  []operand.Op{xy1},
29460			ISA:      []string{"AVX"},
29461		}, nil
29462	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
29463		return &intrep.Instruction{
29464			Opcode:   "VPMAXUB",
29465			Operands: []operand.Op{mxy, xy, xy1},
29466			Inputs:   []operand.Op{mxy, xy},
29467			Outputs:  []operand.Op{xy1},
29468			ISA:      []string{"AVX2"},
29469		}, nil
29470	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
29471		return &intrep.Instruction{
29472			Opcode:   "VPMAXUB",
29473			Operands: []operand.Op{mxy, xy, xy1},
29474			Inputs:   []operand.Op{mxy, xy},
29475			Outputs:  []operand.Op{xy1},
29476			ISA:      []string{"AVX2"},
29477		}, nil
29478	}
29479	return nil, errors.New("VPMAXUB: bad operands")
29480}
29481
29482// VPMAXUD: Maximum of Packed Unsigned Doubleword Integers.
29483//
29484// Forms:
29485//
29486// 	VPMAXUD xmm  xmm xmm
29487// 	VPMAXUD m128 xmm xmm
29488// 	VPMAXUD ymm  ymm ymm
29489// 	VPMAXUD m256 ymm ymm
29490func VPMAXUD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
29491	switch {
29492	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
29493		return &intrep.Instruction{
29494			Opcode:   "VPMAXUD",
29495			Operands: []operand.Op{mxy, xy, xy1},
29496			Inputs:   []operand.Op{mxy, xy},
29497			Outputs:  []operand.Op{xy1},
29498			ISA:      []string{"AVX"},
29499		}, nil
29500	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
29501		return &intrep.Instruction{
29502			Opcode:   "VPMAXUD",
29503			Operands: []operand.Op{mxy, xy, xy1},
29504			Inputs:   []operand.Op{mxy, xy},
29505			Outputs:  []operand.Op{xy1},
29506			ISA:      []string{"AVX"},
29507		}, nil
29508	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
29509		return &intrep.Instruction{
29510			Opcode:   "VPMAXUD",
29511			Operands: []operand.Op{mxy, xy, xy1},
29512			Inputs:   []operand.Op{mxy, xy},
29513			Outputs:  []operand.Op{xy1},
29514			ISA:      []string{"AVX2"},
29515		}, nil
29516	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
29517		return &intrep.Instruction{
29518			Opcode:   "VPMAXUD",
29519			Operands: []operand.Op{mxy, xy, xy1},
29520			Inputs:   []operand.Op{mxy, xy},
29521			Outputs:  []operand.Op{xy1},
29522			ISA:      []string{"AVX2"},
29523		}, nil
29524	}
29525	return nil, errors.New("VPMAXUD: bad operands")
29526}
29527
29528// VPMAXUW: Maximum of Packed Unsigned Word Integers.
29529//
29530// Forms:
29531//
29532// 	VPMAXUW xmm  xmm xmm
29533// 	VPMAXUW m128 xmm xmm
29534// 	VPMAXUW ymm  ymm ymm
29535// 	VPMAXUW m256 ymm ymm
29536func VPMAXUW(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
29537	switch {
29538	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
29539		return &intrep.Instruction{
29540			Opcode:   "VPMAXUW",
29541			Operands: []operand.Op{mxy, xy, xy1},
29542			Inputs:   []operand.Op{mxy, xy},
29543			Outputs:  []operand.Op{xy1},
29544			ISA:      []string{"AVX"},
29545		}, nil
29546	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
29547		return &intrep.Instruction{
29548			Opcode:   "VPMAXUW",
29549			Operands: []operand.Op{mxy, xy, xy1},
29550			Inputs:   []operand.Op{mxy, xy},
29551			Outputs:  []operand.Op{xy1},
29552			ISA:      []string{"AVX"},
29553		}, nil
29554	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
29555		return &intrep.Instruction{
29556			Opcode:   "VPMAXUW",
29557			Operands: []operand.Op{mxy, xy, xy1},
29558			Inputs:   []operand.Op{mxy, xy},
29559			Outputs:  []operand.Op{xy1},
29560			ISA:      []string{"AVX2"},
29561		}, nil
29562	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
29563		return &intrep.Instruction{
29564			Opcode:   "VPMAXUW",
29565			Operands: []operand.Op{mxy, xy, xy1},
29566			Inputs:   []operand.Op{mxy, xy},
29567			Outputs:  []operand.Op{xy1},
29568			ISA:      []string{"AVX2"},
29569		}, nil
29570	}
29571	return nil, errors.New("VPMAXUW: bad operands")
29572}
29573
29574// VPMINSB: Minimum of Packed Signed Byte Integers.
29575//
29576// Forms:
29577//
29578// 	VPMINSB xmm  xmm xmm
29579// 	VPMINSB m128 xmm xmm
29580// 	VPMINSB ymm  ymm ymm
29581// 	VPMINSB m256 ymm ymm
29582func VPMINSB(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
29583	switch {
29584	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
29585		return &intrep.Instruction{
29586			Opcode:   "VPMINSB",
29587			Operands: []operand.Op{mxy, xy, xy1},
29588			Inputs:   []operand.Op{mxy, xy},
29589			Outputs:  []operand.Op{xy1},
29590			ISA:      []string{"AVX"},
29591		}, nil
29592	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
29593		return &intrep.Instruction{
29594			Opcode:   "VPMINSB",
29595			Operands: []operand.Op{mxy, xy, xy1},
29596			Inputs:   []operand.Op{mxy, xy},
29597			Outputs:  []operand.Op{xy1},
29598			ISA:      []string{"AVX"},
29599		}, nil
29600	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
29601		return &intrep.Instruction{
29602			Opcode:   "VPMINSB",
29603			Operands: []operand.Op{mxy, xy, xy1},
29604			Inputs:   []operand.Op{mxy, xy},
29605			Outputs:  []operand.Op{xy1},
29606			ISA:      []string{"AVX2"},
29607		}, nil
29608	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
29609		return &intrep.Instruction{
29610			Opcode:   "VPMINSB",
29611			Operands: []operand.Op{mxy, xy, xy1},
29612			Inputs:   []operand.Op{mxy, xy},
29613			Outputs:  []operand.Op{xy1},
29614			ISA:      []string{"AVX2"},
29615		}, nil
29616	}
29617	return nil, errors.New("VPMINSB: bad operands")
29618}
29619
29620// VPMINSD: Minimum of Packed Signed Doubleword Integers.
29621//
29622// Forms:
29623//
29624// 	VPMINSD xmm  xmm xmm
29625// 	VPMINSD m128 xmm xmm
29626// 	VPMINSD ymm  ymm ymm
29627// 	VPMINSD m256 ymm ymm
29628func VPMINSD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
29629	switch {
29630	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
29631		return &intrep.Instruction{
29632			Opcode:   "VPMINSD",
29633			Operands: []operand.Op{mxy, xy, xy1},
29634			Inputs:   []operand.Op{mxy, xy},
29635			Outputs:  []operand.Op{xy1},
29636			ISA:      []string{"AVX"},
29637		}, nil
29638	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
29639		return &intrep.Instruction{
29640			Opcode:   "VPMINSD",
29641			Operands: []operand.Op{mxy, xy, xy1},
29642			Inputs:   []operand.Op{mxy, xy},
29643			Outputs:  []operand.Op{xy1},
29644			ISA:      []string{"AVX"},
29645		}, nil
29646	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
29647		return &intrep.Instruction{
29648			Opcode:   "VPMINSD",
29649			Operands: []operand.Op{mxy, xy, xy1},
29650			Inputs:   []operand.Op{mxy, xy},
29651			Outputs:  []operand.Op{xy1},
29652			ISA:      []string{"AVX2"},
29653		}, nil
29654	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
29655		return &intrep.Instruction{
29656			Opcode:   "VPMINSD",
29657			Operands: []operand.Op{mxy, xy, xy1},
29658			Inputs:   []operand.Op{mxy, xy},
29659			Outputs:  []operand.Op{xy1},
29660			ISA:      []string{"AVX2"},
29661		}, nil
29662	}
29663	return nil, errors.New("VPMINSD: bad operands")
29664}
29665
29666// VPMINSW: Minimum of Packed Signed Word Integers.
29667//
29668// Forms:
29669//
29670// 	VPMINSW xmm  xmm xmm
29671// 	VPMINSW m128 xmm xmm
29672// 	VPMINSW ymm  ymm ymm
29673// 	VPMINSW m256 ymm ymm
29674func VPMINSW(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
29675	switch {
29676	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
29677		return &intrep.Instruction{
29678			Opcode:   "VPMINSW",
29679			Operands: []operand.Op{mxy, xy, xy1},
29680			Inputs:   []operand.Op{mxy, xy},
29681			Outputs:  []operand.Op{xy1},
29682			ISA:      []string{"AVX"},
29683		}, nil
29684	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
29685		return &intrep.Instruction{
29686			Opcode:   "VPMINSW",
29687			Operands: []operand.Op{mxy, xy, xy1},
29688			Inputs:   []operand.Op{mxy, xy},
29689			Outputs:  []operand.Op{xy1},
29690			ISA:      []string{"AVX"},
29691		}, nil
29692	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
29693		return &intrep.Instruction{
29694			Opcode:   "VPMINSW",
29695			Operands: []operand.Op{mxy, xy, xy1},
29696			Inputs:   []operand.Op{mxy, xy},
29697			Outputs:  []operand.Op{xy1},
29698			ISA:      []string{"AVX2"},
29699		}, nil
29700	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
29701		return &intrep.Instruction{
29702			Opcode:   "VPMINSW",
29703			Operands: []operand.Op{mxy, xy, xy1},
29704			Inputs:   []operand.Op{mxy, xy},
29705			Outputs:  []operand.Op{xy1},
29706			ISA:      []string{"AVX2"},
29707		}, nil
29708	}
29709	return nil, errors.New("VPMINSW: bad operands")
29710}
29711
29712// VPMINUB: Minimum of Packed Unsigned Byte Integers.
29713//
29714// Forms:
29715//
29716// 	VPMINUB xmm  xmm xmm
29717// 	VPMINUB m128 xmm xmm
29718// 	VPMINUB ymm  ymm ymm
29719// 	VPMINUB m256 ymm ymm
29720func VPMINUB(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
29721	switch {
29722	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
29723		return &intrep.Instruction{
29724			Opcode:   "VPMINUB",
29725			Operands: []operand.Op{mxy, xy, xy1},
29726			Inputs:   []operand.Op{mxy, xy},
29727			Outputs:  []operand.Op{xy1},
29728			ISA:      []string{"AVX"},
29729		}, nil
29730	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
29731		return &intrep.Instruction{
29732			Opcode:   "VPMINUB",
29733			Operands: []operand.Op{mxy, xy, xy1},
29734			Inputs:   []operand.Op{mxy, xy},
29735			Outputs:  []operand.Op{xy1},
29736			ISA:      []string{"AVX"},
29737		}, nil
29738	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
29739		return &intrep.Instruction{
29740			Opcode:   "VPMINUB",
29741			Operands: []operand.Op{mxy, xy, xy1},
29742			Inputs:   []operand.Op{mxy, xy},
29743			Outputs:  []operand.Op{xy1},
29744			ISA:      []string{"AVX2"},
29745		}, nil
29746	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
29747		return &intrep.Instruction{
29748			Opcode:   "VPMINUB",
29749			Operands: []operand.Op{mxy, xy, xy1},
29750			Inputs:   []operand.Op{mxy, xy},
29751			Outputs:  []operand.Op{xy1},
29752			ISA:      []string{"AVX2"},
29753		}, nil
29754	}
29755	return nil, errors.New("VPMINUB: bad operands")
29756}
29757
29758// VPMINUD: Minimum of Packed Unsigned Doubleword Integers.
29759//
29760// Forms:
29761//
29762// 	VPMINUD xmm  xmm xmm
29763// 	VPMINUD m128 xmm xmm
29764// 	VPMINUD ymm  ymm ymm
29765// 	VPMINUD m256 ymm ymm
29766func VPMINUD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
29767	switch {
29768	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
29769		return &intrep.Instruction{
29770			Opcode:   "VPMINUD",
29771			Operands: []operand.Op{mxy, xy, xy1},
29772			Inputs:   []operand.Op{mxy, xy},
29773			Outputs:  []operand.Op{xy1},
29774			ISA:      []string{"AVX"},
29775		}, nil
29776	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
29777		return &intrep.Instruction{
29778			Opcode:   "VPMINUD",
29779			Operands: []operand.Op{mxy, xy, xy1},
29780			Inputs:   []operand.Op{mxy, xy},
29781			Outputs:  []operand.Op{xy1},
29782			ISA:      []string{"AVX"},
29783		}, nil
29784	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
29785		return &intrep.Instruction{
29786			Opcode:   "VPMINUD",
29787			Operands: []operand.Op{mxy, xy, xy1},
29788			Inputs:   []operand.Op{mxy, xy},
29789			Outputs:  []operand.Op{xy1},
29790			ISA:      []string{"AVX2"},
29791		}, nil
29792	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
29793		return &intrep.Instruction{
29794			Opcode:   "VPMINUD",
29795			Operands: []operand.Op{mxy, xy, xy1},
29796			Inputs:   []operand.Op{mxy, xy},
29797			Outputs:  []operand.Op{xy1},
29798			ISA:      []string{"AVX2"},
29799		}, nil
29800	}
29801	return nil, errors.New("VPMINUD: bad operands")
29802}
29803
29804// VPMINUW: Minimum of Packed Unsigned Word Integers.
29805//
29806// Forms:
29807//
29808// 	VPMINUW xmm  xmm xmm
29809// 	VPMINUW m128 xmm xmm
29810// 	VPMINUW ymm  ymm ymm
29811// 	VPMINUW m256 ymm ymm
29812func VPMINUW(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
29813	switch {
29814	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
29815		return &intrep.Instruction{
29816			Opcode:   "VPMINUW",
29817			Operands: []operand.Op{mxy, xy, xy1},
29818			Inputs:   []operand.Op{mxy, xy},
29819			Outputs:  []operand.Op{xy1},
29820			ISA:      []string{"AVX"},
29821		}, nil
29822	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
29823		return &intrep.Instruction{
29824			Opcode:   "VPMINUW",
29825			Operands: []operand.Op{mxy, xy, xy1},
29826			Inputs:   []operand.Op{mxy, xy},
29827			Outputs:  []operand.Op{xy1},
29828			ISA:      []string{"AVX"},
29829		}, nil
29830	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
29831		return &intrep.Instruction{
29832			Opcode:   "VPMINUW",
29833			Operands: []operand.Op{mxy, xy, xy1},
29834			Inputs:   []operand.Op{mxy, xy},
29835			Outputs:  []operand.Op{xy1},
29836			ISA:      []string{"AVX2"},
29837		}, nil
29838	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
29839		return &intrep.Instruction{
29840			Opcode:   "VPMINUW",
29841			Operands: []operand.Op{mxy, xy, xy1},
29842			Inputs:   []operand.Op{mxy, xy},
29843			Outputs:  []operand.Op{xy1},
29844			ISA:      []string{"AVX2"},
29845		}, nil
29846	}
29847	return nil, errors.New("VPMINUW: bad operands")
29848}
29849
29850// VPMOVMSKB: Move Byte Mask.
29851//
29852// Forms:
29853//
29854// 	VPMOVMSKB xmm r32
29855// 	VPMOVMSKB ymm r32
29856func VPMOVMSKB(xy, r operand.Op) (*intrep.Instruction, error) {
29857	switch {
29858	case operand.IsXMM(xy) && operand.IsR32(r):
29859		return &intrep.Instruction{
29860			Opcode:   "VPMOVMSKB",
29861			Operands: []operand.Op{xy, r},
29862			Inputs:   []operand.Op{xy},
29863			Outputs:  []operand.Op{r},
29864			ISA:      []string{"AVX"},
29865		}, nil
29866	case operand.IsYMM(xy) && operand.IsR32(r):
29867		return &intrep.Instruction{
29868			Opcode:   "VPMOVMSKB",
29869			Operands: []operand.Op{xy, r},
29870			Inputs:   []operand.Op{xy},
29871			Outputs:  []operand.Op{r},
29872			ISA:      []string{"AVX2"},
29873		}, nil
29874	}
29875	return nil, errors.New("VPMOVMSKB: bad operands")
29876}
29877
29878// VPMOVSXBD: Move Packed Byte Integers to Doubleword Integers with Sign Extension.
29879//
29880// Forms:
29881//
29882// 	VPMOVSXBD xmm xmm
29883// 	VPMOVSXBD m32 xmm
29884// 	VPMOVSXBD xmm ymm
29885// 	VPMOVSXBD m64 ymm
29886func VPMOVSXBD(mx, xy operand.Op) (*intrep.Instruction, error) {
29887	switch {
29888	case operand.IsXMM(mx) && operand.IsXMM(xy):
29889		return &intrep.Instruction{
29890			Opcode:   "VPMOVSXBD",
29891			Operands: []operand.Op{mx, xy},
29892			Inputs:   []operand.Op{mx},
29893			Outputs:  []operand.Op{xy},
29894			ISA:      []string{"AVX"},
29895		}, nil
29896	case operand.IsM32(mx) && operand.IsXMM(xy):
29897		return &intrep.Instruction{
29898			Opcode:   "VPMOVSXBD",
29899			Operands: []operand.Op{mx, xy},
29900			Inputs:   []operand.Op{mx},
29901			Outputs:  []operand.Op{xy},
29902			ISA:      []string{"AVX"},
29903		}, nil
29904	case operand.IsXMM(mx) && operand.IsYMM(xy):
29905		return &intrep.Instruction{
29906			Opcode:   "VPMOVSXBD",
29907			Operands: []operand.Op{mx, xy},
29908			Inputs:   []operand.Op{mx},
29909			Outputs:  []operand.Op{xy},
29910			ISA:      []string{"AVX2"},
29911		}, nil
29912	case operand.IsM64(mx) && operand.IsYMM(xy):
29913		return &intrep.Instruction{
29914			Opcode:   "VPMOVSXBD",
29915			Operands: []operand.Op{mx, xy},
29916			Inputs:   []operand.Op{mx},
29917			Outputs:  []operand.Op{xy},
29918			ISA:      []string{"AVX2"},
29919		}, nil
29920	}
29921	return nil, errors.New("VPMOVSXBD: bad operands")
29922}
29923
29924// VPMOVSXBQ: Move Packed Byte Integers to Quadword Integers with Sign Extension.
29925//
29926// Forms:
29927//
29928// 	VPMOVSXBQ xmm xmm
29929// 	VPMOVSXBQ m16 xmm
29930// 	VPMOVSXBQ xmm ymm
29931// 	VPMOVSXBQ m32 ymm
29932func VPMOVSXBQ(mx, xy operand.Op) (*intrep.Instruction, error) {
29933	switch {
29934	case operand.IsXMM(mx) && operand.IsXMM(xy):
29935		return &intrep.Instruction{
29936			Opcode:   "VPMOVSXBQ",
29937			Operands: []operand.Op{mx, xy},
29938			Inputs:   []operand.Op{mx},
29939			Outputs:  []operand.Op{xy},
29940			ISA:      []string{"AVX"},
29941		}, nil
29942	case operand.IsM16(mx) && operand.IsXMM(xy):
29943		return &intrep.Instruction{
29944			Opcode:   "VPMOVSXBQ",
29945			Operands: []operand.Op{mx, xy},
29946			Inputs:   []operand.Op{mx},
29947			Outputs:  []operand.Op{xy},
29948			ISA:      []string{"AVX"},
29949		}, nil
29950	case operand.IsXMM(mx) && operand.IsYMM(xy):
29951		return &intrep.Instruction{
29952			Opcode:   "VPMOVSXBQ",
29953			Operands: []operand.Op{mx, xy},
29954			Inputs:   []operand.Op{mx},
29955			Outputs:  []operand.Op{xy},
29956			ISA:      []string{"AVX2"},
29957		}, nil
29958	case operand.IsM32(mx) && operand.IsYMM(xy):
29959		return &intrep.Instruction{
29960			Opcode:   "VPMOVSXBQ",
29961			Operands: []operand.Op{mx, xy},
29962			Inputs:   []operand.Op{mx},
29963			Outputs:  []operand.Op{xy},
29964			ISA:      []string{"AVX2"},
29965		}, nil
29966	}
29967	return nil, errors.New("VPMOVSXBQ: bad operands")
29968}
29969
29970// VPMOVSXBW: Move Packed Byte Integers to Word Integers with Sign Extension.
29971//
29972// Forms:
29973//
29974// 	VPMOVSXBW xmm  xmm
29975// 	VPMOVSXBW m64  xmm
29976// 	VPMOVSXBW xmm  ymm
29977// 	VPMOVSXBW m128 ymm
29978func VPMOVSXBW(mx, xy operand.Op) (*intrep.Instruction, error) {
29979	switch {
29980	case operand.IsXMM(mx) && operand.IsXMM(xy):
29981		return &intrep.Instruction{
29982			Opcode:   "VPMOVSXBW",
29983			Operands: []operand.Op{mx, xy},
29984			Inputs:   []operand.Op{mx},
29985			Outputs:  []operand.Op{xy},
29986			ISA:      []string{"AVX"},
29987		}, nil
29988	case operand.IsM64(mx) && operand.IsXMM(xy):
29989		return &intrep.Instruction{
29990			Opcode:   "VPMOVSXBW",
29991			Operands: []operand.Op{mx, xy},
29992			Inputs:   []operand.Op{mx},
29993			Outputs:  []operand.Op{xy},
29994			ISA:      []string{"AVX"},
29995		}, nil
29996	case operand.IsXMM(mx) && operand.IsYMM(xy):
29997		return &intrep.Instruction{
29998			Opcode:   "VPMOVSXBW",
29999			Operands: []operand.Op{mx, xy},
30000			Inputs:   []operand.Op{mx},
30001			Outputs:  []operand.Op{xy},
30002			ISA:      []string{"AVX2"},
30003		}, nil
30004	case operand.IsM128(mx) && operand.IsYMM(xy):
30005		return &intrep.Instruction{
30006			Opcode:   "VPMOVSXBW",
30007			Operands: []operand.Op{mx, xy},
30008			Inputs:   []operand.Op{mx},
30009			Outputs:  []operand.Op{xy},
30010			ISA:      []string{"AVX2"},
30011		}, nil
30012	}
30013	return nil, errors.New("VPMOVSXBW: bad operands")
30014}
30015
30016// VPMOVSXDQ: Move Packed Doubleword Integers to Quadword Integers with Sign Extension.
30017//
30018// Forms:
30019//
30020// 	VPMOVSXDQ xmm  xmm
30021// 	VPMOVSXDQ m64  xmm
30022// 	VPMOVSXDQ xmm  ymm
30023// 	VPMOVSXDQ m128 ymm
30024func VPMOVSXDQ(mx, xy operand.Op) (*intrep.Instruction, error) {
30025	switch {
30026	case operand.IsXMM(mx) && operand.IsXMM(xy):
30027		return &intrep.Instruction{
30028			Opcode:   "VPMOVSXDQ",
30029			Operands: []operand.Op{mx, xy},
30030			Inputs:   []operand.Op{mx},
30031			Outputs:  []operand.Op{xy},
30032			ISA:      []string{"AVX"},
30033		}, nil
30034	case operand.IsM64(mx) && operand.IsXMM(xy):
30035		return &intrep.Instruction{
30036			Opcode:   "VPMOVSXDQ",
30037			Operands: []operand.Op{mx, xy},
30038			Inputs:   []operand.Op{mx},
30039			Outputs:  []operand.Op{xy},
30040			ISA:      []string{"AVX"},
30041		}, nil
30042	case operand.IsXMM(mx) && operand.IsYMM(xy):
30043		return &intrep.Instruction{
30044			Opcode:   "VPMOVSXDQ",
30045			Operands: []operand.Op{mx, xy},
30046			Inputs:   []operand.Op{mx},
30047			Outputs:  []operand.Op{xy},
30048			ISA:      []string{"AVX2"},
30049		}, nil
30050	case operand.IsM128(mx) && operand.IsYMM(xy):
30051		return &intrep.Instruction{
30052			Opcode:   "VPMOVSXDQ",
30053			Operands: []operand.Op{mx, xy},
30054			Inputs:   []operand.Op{mx},
30055			Outputs:  []operand.Op{xy},
30056			ISA:      []string{"AVX2"},
30057		}, nil
30058	}
30059	return nil, errors.New("VPMOVSXDQ: bad operands")
30060}
30061
30062// VPMOVSXWD: Move Packed Word Integers to Doubleword Integers with Sign Extension.
30063//
30064// Forms:
30065//
30066// 	VPMOVSXWD xmm  xmm
30067// 	VPMOVSXWD m64  xmm
30068// 	VPMOVSXWD xmm  ymm
30069// 	VPMOVSXWD m128 ymm
30070func VPMOVSXWD(mx, xy operand.Op) (*intrep.Instruction, error) {
30071	switch {
30072	case operand.IsXMM(mx) && operand.IsXMM(xy):
30073		return &intrep.Instruction{
30074			Opcode:   "VPMOVSXWD",
30075			Operands: []operand.Op{mx, xy},
30076			Inputs:   []operand.Op{mx},
30077			Outputs:  []operand.Op{xy},
30078			ISA:      []string{"AVX"},
30079		}, nil
30080	case operand.IsM64(mx) && operand.IsXMM(xy):
30081		return &intrep.Instruction{
30082			Opcode:   "VPMOVSXWD",
30083			Operands: []operand.Op{mx, xy},
30084			Inputs:   []operand.Op{mx},
30085			Outputs:  []operand.Op{xy},
30086			ISA:      []string{"AVX"},
30087		}, nil
30088	case operand.IsXMM(mx) && operand.IsYMM(xy):
30089		return &intrep.Instruction{
30090			Opcode:   "VPMOVSXWD",
30091			Operands: []operand.Op{mx, xy},
30092			Inputs:   []operand.Op{mx},
30093			Outputs:  []operand.Op{xy},
30094			ISA:      []string{"AVX2"},
30095		}, nil
30096	case operand.IsM128(mx) && operand.IsYMM(xy):
30097		return &intrep.Instruction{
30098			Opcode:   "VPMOVSXWD",
30099			Operands: []operand.Op{mx, xy},
30100			Inputs:   []operand.Op{mx},
30101			Outputs:  []operand.Op{xy},
30102			ISA:      []string{"AVX2"},
30103		}, nil
30104	}
30105	return nil, errors.New("VPMOVSXWD: bad operands")
30106}
30107
30108// VPMOVSXWQ: Move Packed Word Integers to Quadword Integers with Sign Extension.
30109//
30110// Forms:
30111//
30112// 	VPMOVSXWQ xmm xmm
30113// 	VPMOVSXWQ m32 xmm
30114// 	VPMOVSXWQ xmm ymm
30115// 	VPMOVSXWQ m64 ymm
30116func VPMOVSXWQ(mx, xy operand.Op) (*intrep.Instruction, error) {
30117	switch {
30118	case operand.IsXMM(mx) && operand.IsXMM(xy):
30119		return &intrep.Instruction{
30120			Opcode:   "VPMOVSXWQ",
30121			Operands: []operand.Op{mx, xy},
30122			Inputs:   []operand.Op{mx},
30123			Outputs:  []operand.Op{xy},
30124			ISA:      []string{"AVX"},
30125		}, nil
30126	case operand.IsM32(mx) && operand.IsXMM(xy):
30127		return &intrep.Instruction{
30128			Opcode:   "VPMOVSXWQ",
30129			Operands: []operand.Op{mx, xy},
30130			Inputs:   []operand.Op{mx},
30131			Outputs:  []operand.Op{xy},
30132			ISA:      []string{"AVX"},
30133		}, nil
30134	case operand.IsXMM(mx) && operand.IsYMM(xy):
30135		return &intrep.Instruction{
30136			Opcode:   "VPMOVSXWQ",
30137			Operands: []operand.Op{mx, xy},
30138			Inputs:   []operand.Op{mx},
30139			Outputs:  []operand.Op{xy},
30140			ISA:      []string{"AVX2"},
30141		}, nil
30142	case operand.IsM64(mx) && operand.IsYMM(xy):
30143		return &intrep.Instruction{
30144			Opcode:   "VPMOVSXWQ",
30145			Operands: []operand.Op{mx, xy},
30146			Inputs:   []operand.Op{mx},
30147			Outputs:  []operand.Op{xy},
30148			ISA:      []string{"AVX2"},
30149		}, nil
30150	}
30151	return nil, errors.New("VPMOVSXWQ: bad operands")
30152}
30153
30154// VPMOVZXBD: Move Packed Byte Integers to Doubleword Integers with Zero Extension.
30155//
30156// Forms:
30157//
30158// 	VPMOVZXBD xmm xmm
30159// 	VPMOVZXBD m32 xmm
30160// 	VPMOVZXBD xmm ymm
30161// 	VPMOVZXBD m64 ymm
30162func VPMOVZXBD(mx, xy operand.Op) (*intrep.Instruction, error) {
30163	switch {
30164	case operand.IsXMM(mx) && operand.IsXMM(xy):
30165		return &intrep.Instruction{
30166			Opcode:   "VPMOVZXBD",
30167			Operands: []operand.Op{mx, xy},
30168			Inputs:   []operand.Op{mx},
30169			Outputs:  []operand.Op{xy},
30170			ISA:      []string{"AVX"},
30171		}, nil
30172	case operand.IsM32(mx) && operand.IsXMM(xy):
30173		return &intrep.Instruction{
30174			Opcode:   "VPMOVZXBD",
30175			Operands: []operand.Op{mx, xy},
30176			Inputs:   []operand.Op{mx},
30177			Outputs:  []operand.Op{xy},
30178			ISA:      []string{"AVX"},
30179		}, nil
30180	case operand.IsXMM(mx) && operand.IsYMM(xy):
30181		return &intrep.Instruction{
30182			Opcode:   "VPMOVZXBD",
30183			Operands: []operand.Op{mx, xy},
30184			Inputs:   []operand.Op{mx},
30185			Outputs:  []operand.Op{xy},
30186			ISA:      []string{"AVX2"},
30187		}, nil
30188	case operand.IsM64(mx) && operand.IsYMM(xy):
30189		return &intrep.Instruction{
30190			Opcode:   "VPMOVZXBD",
30191			Operands: []operand.Op{mx, xy},
30192			Inputs:   []operand.Op{mx},
30193			Outputs:  []operand.Op{xy},
30194			ISA:      []string{"AVX2"},
30195		}, nil
30196	}
30197	return nil, errors.New("VPMOVZXBD: bad operands")
30198}
30199
30200// VPMOVZXBQ: Move Packed Byte Integers to Quadword Integers with Zero Extension.
30201//
30202// Forms:
30203//
30204// 	VPMOVZXBQ xmm xmm
30205// 	VPMOVZXBQ m16 xmm
30206// 	VPMOVZXBQ xmm ymm
30207// 	VPMOVZXBQ m32 ymm
30208func VPMOVZXBQ(mx, xy operand.Op) (*intrep.Instruction, error) {
30209	switch {
30210	case operand.IsXMM(mx) && operand.IsXMM(xy):
30211		return &intrep.Instruction{
30212			Opcode:   "VPMOVZXBQ",
30213			Operands: []operand.Op{mx, xy},
30214			Inputs:   []operand.Op{mx},
30215			Outputs:  []operand.Op{xy},
30216			ISA:      []string{"AVX"},
30217		}, nil
30218	case operand.IsM16(mx) && operand.IsXMM(xy):
30219		return &intrep.Instruction{
30220			Opcode:   "VPMOVZXBQ",
30221			Operands: []operand.Op{mx, xy},
30222			Inputs:   []operand.Op{mx},
30223			Outputs:  []operand.Op{xy},
30224			ISA:      []string{"AVX"},
30225		}, nil
30226	case operand.IsXMM(mx) && operand.IsYMM(xy):
30227		return &intrep.Instruction{
30228			Opcode:   "VPMOVZXBQ",
30229			Operands: []operand.Op{mx, xy},
30230			Inputs:   []operand.Op{mx},
30231			Outputs:  []operand.Op{xy},
30232			ISA:      []string{"AVX2"},
30233		}, nil
30234	case operand.IsM32(mx) && operand.IsYMM(xy):
30235		return &intrep.Instruction{
30236			Opcode:   "VPMOVZXBQ",
30237			Operands: []operand.Op{mx, xy},
30238			Inputs:   []operand.Op{mx},
30239			Outputs:  []operand.Op{xy},
30240			ISA:      []string{"AVX2"},
30241		}, nil
30242	}
30243	return nil, errors.New("VPMOVZXBQ: bad operands")
30244}
30245
30246// VPMOVZXBW: Move Packed Byte Integers to Word Integers with Zero Extension.
30247//
30248// Forms:
30249//
30250// 	VPMOVZXBW xmm  xmm
30251// 	VPMOVZXBW m64  xmm
30252// 	VPMOVZXBW xmm  ymm
30253// 	VPMOVZXBW m128 ymm
30254func VPMOVZXBW(mx, xy operand.Op) (*intrep.Instruction, error) {
30255	switch {
30256	case operand.IsXMM(mx) && operand.IsXMM(xy):
30257		return &intrep.Instruction{
30258			Opcode:   "VPMOVZXBW",
30259			Operands: []operand.Op{mx, xy},
30260			Inputs:   []operand.Op{mx},
30261			Outputs:  []operand.Op{xy},
30262			ISA:      []string{"AVX"},
30263		}, nil
30264	case operand.IsM64(mx) && operand.IsXMM(xy):
30265		return &intrep.Instruction{
30266			Opcode:   "VPMOVZXBW",
30267			Operands: []operand.Op{mx, xy},
30268			Inputs:   []operand.Op{mx},
30269			Outputs:  []operand.Op{xy},
30270			ISA:      []string{"AVX"},
30271		}, nil
30272	case operand.IsXMM(mx) && operand.IsYMM(xy):
30273		return &intrep.Instruction{
30274			Opcode:   "VPMOVZXBW",
30275			Operands: []operand.Op{mx, xy},
30276			Inputs:   []operand.Op{mx},
30277			Outputs:  []operand.Op{xy},
30278			ISA:      []string{"AVX2"},
30279		}, nil
30280	case operand.IsM128(mx) && operand.IsYMM(xy):
30281		return &intrep.Instruction{
30282			Opcode:   "VPMOVZXBW",
30283			Operands: []operand.Op{mx, xy},
30284			Inputs:   []operand.Op{mx},
30285			Outputs:  []operand.Op{xy},
30286			ISA:      []string{"AVX2"},
30287		}, nil
30288	}
30289	return nil, errors.New("VPMOVZXBW: bad operands")
30290}
30291
30292// VPMOVZXDQ: Move Packed Doubleword Integers to Quadword Integers with Zero Extension.
30293//
30294// Forms:
30295//
30296// 	VPMOVZXDQ xmm  xmm
30297// 	VPMOVZXDQ m64  xmm
30298// 	VPMOVZXDQ xmm  ymm
30299// 	VPMOVZXDQ m128 ymm
30300func VPMOVZXDQ(mx, xy operand.Op) (*intrep.Instruction, error) {
30301	switch {
30302	case operand.IsXMM(mx) && operand.IsXMM(xy):
30303		return &intrep.Instruction{
30304			Opcode:   "VPMOVZXDQ",
30305			Operands: []operand.Op{mx, xy},
30306			Inputs:   []operand.Op{mx},
30307			Outputs:  []operand.Op{xy},
30308			ISA:      []string{"AVX"},
30309		}, nil
30310	case operand.IsM64(mx) && operand.IsXMM(xy):
30311		return &intrep.Instruction{
30312			Opcode:   "VPMOVZXDQ",
30313			Operands: []operand.Op{mx, xy},
30314			Inputs:   []operand.Op{mx},
30315			Outputs:  []operand.Op{xy},
30316			ISA:      []string{"AVX"},
30317		}, nil
30318	case operand.IsXMM(mx) && operand.IsYMM(xy):
30319		return &intrep.Instruction{
30320			Opcode:   "VPMOVZXDQ",
30321			Operands: []operand.Op{mx, xy},
30322			Inputs:   []operand.Op{mx},
30323			Outputs:  []operand.Op{xy},
30324			ISA:      []string{"AVX2"},
30325		}, nil
30326	case operand.IsM128(mx) && operand.IsYMM(xy):
30327		return &intrep.Instruction{
30328			Opcode:   "VPMOVZXDQ",
30329			Operands: []operand.Op{mx, xy},
30330			Inputs:   []operand.Op{mx},
30331			Outputs:  []operand.Op{xy},
30332			ISA:      []string{"AVX2"},
30333		}, nil
30334	}
30335	return nil, errors.New("VPMOVZXDQ: bad operands")
30336}
30337
30338// VPMOVZXWD: Move Packed Word Integers to Doubleword Integers with Zero Extension.
30339//
30340// Forms:
30341//
30342// 	VPMOVZXWD xmm  xmm
30343// 	VPMOVZXWD m64  xmm
30344// 	VPMOVZXWD xmm  ymm
30345// 	VPMOVZXWD m128 ymm
30346func VPMOVZXWD(mx, xy operand.Op) (*intrep.Instruction, error) {
30347	switch {
30348	case operand.IsXMM(mx) && operand.IsXMM(xy):
30349		return &intrep.Instruction{
30350			Opcode:   "VPMOVZXWD",
30351			Operands: []operand.Op{mx, xy},
30352			Inputs:   []operand.Op{mx},
30353			Outputs:  []operand.Op{xy},
30354			ISA:      []string{"AVX"},
30355		}, nil
30356	case operand.IsM64(mx) && operand.IsXMM(xy):
30357		return &intrep.Instruction{
30358			Opcode:   "VPMOVZXWD",
30359			Operands: []operand.Op{mx, xy},
30360			Inputs:   []operand.Op{mx},
30361			Outputs:  []operand.Op{xy},
30362			ISA:      []string{"AVX"},
30363		}, nil
30364	case operand.IsXMM(mx) && operand.IsYMM(xy):
30365		return &intrep.Instruction{
30366			Opcode:   "VPMOVZXWD",
30367			Operands: []operand.Op{mx, xy},
30368			Inputs:   []operand.Op{mx},
30369			Outputs:  []operand.Op{xy},
30370			ISA:      []string{"AVX2"},
30371		}, nil
30372	case operand.IsM128(mx) && operand.IsYMM(xy):
30373		return &intrep.Instruction{
30374			Opcode:   "VPMOVZXWD",
30375			Operands: []operand.Op{mx, xy},
30376			Inputs:   []operand.Op{mx},
30377			Outputs:  []operand.Op{xy},
30378			ISA:      []string{"AVX2"},
30379		}, nil
30380	}
30381	return nil, errors.New("VPMOVZXWD: bad operands")
30382}
30383
30384// VPMOVZXWQ: Move Packed Word Integers to Quadword Integers with Zero Extension.
30385//
30386// Forms:
30387//
30388// 	VPMOVZXWQ xmm xmm
30389// 	VPMOVZXWQ m32 xmm
30390// 	VPMOVZXWQ xmm ymm
30391// 	VPMOVZXWQ m64 ymm
30392func VPMOVZXWQ(mx, xy operand.Op) (*intrep.Instruction, error) {
30393	switch {
30394	case operand.IsXMM(mx) && operand.IsXMM(xy):
30395		return &intrep.Instruction{
30396			Opcode:   "VPMOVZXWQ",
30397			Operands: []operand.Op{mx, xy},
30398			Inputs:   []operand.Op{mx},
30399			Outputs:  []operand.Op{xy},
30400			ISA:      []string{"AVX"},
30401		}, nil
30402	case operand.IsM32(mx) && operand.IsXMM(xy):
30403		return &intrep.Instruction{
30404			Opcode:   "VPMOVZXWQ",
30405			Operands: []operand.Op{mx, xy},
30406			Inputs:   []operand.Op{mx},
30407			Outputs:  []operand.Op{xy},
30408			ISA:      []string{"AVX"},
30409		}, nil
30410	case operand.IsXMM(mx) && operand.IsYMM(xy):
30411		return &intrep.Instruction{
30412			Opcode:   "VPMOVZXWQ",
30413			Operands: []operand.Op{mx, xy},
30414			Inputs:   []operand.Op{mx},
30415			Outputs:  []operand.Op{xy},
30416			ISA:      []string{"AVX2"},
30417		}, nil
30418	case operand.IsM64(mx) && operand.IsYMM(xy):
30419		return &intrep.Instruction{
30420			Opcode:   "VPMOVZXWQ",
30421			Operands: []operand.Op{mx, xy},
30422			Inputs:   []operand.Op{mx},
30423			Outputs:  []operand.Op{xy},
30424			ISA:      []string{"AVX2"},
30425		}, nil
30426	}
30427	return nil, errors.New("VPMOVZXWQ: bad operands")
30428}
30429
30430// VPMULDQ: Multiply Packed Signed Doubleword Integers and Store Quadword Result.
30431//
30432// Forms:
30433//
30434// 	VPMULDQ xmm  xmm xmm
30435// 	VPMULDQ m128 xmm xmm
30436// 	VPMULDQ ymm  ymm ymm
30437// 	VPMULDQ m256 ymm ymm
30438func VPMULDQ(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
30439	switch {
30440	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
30441		return &intrep.Instruction{
30442			Opcode:   "VPMULDQ",
30443			Operands: []operand.Op{mxy, xy, xy1},
30444			Inputs:   []operand.Op{mxy, xy},
30445			Outputs:  []operand.Op{xy1},
30446			ISA:      []string{"AVX"},
30447		}, nil
30448	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
30449		return &intrep.Instruction{
30450			Opcode:   "VPMULDQ",
30451			Operands: []operand.Op{mxy, xy, xy1},
30452			Inputs:   []operand.Op{mxy, xy},
30453			Outputs:  []operand.Op{xy1},
30454			ISA:      []string{"AVX"},
30455		}, nil
30456	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
30457		return &intrep.Instruction{
30458			Opcode:   "VPMULDQ",
30459			Operands: []operand.Op{mxy, xy, xy1},
30460			Inputs:   []operand.Op{mxy, xy},
30461			Outputs:  []operand.Op{xy1},
30462			ISA:      []string{"AVX2"},
30463		}, nil
30464	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
30465		return &intrep.Instruction{
30466			Opcode:   "VPMULDQ",
30467			Operands: []operand.Op{mxy, xy, xy1},
30468			Inputs:   []operand.Op{mxy, xy},
30469			Outputs:  []operand.Op{xy1},
30470			ISA:      []string{"AVX2"},
30471		}, nil
30472	}
30473	return nil, errors.New("VPMULDQ: bad operands")
30474}
30475
30476// VPMULHRSW: Packed Multiply Signed Word Integers and Store High Result with Round and Scale.
30477//
30478// Forms:
30479//
30480// 	VPMULHRSW xmm  xmm xmm
30481// 	VPMULHRSW m128 xmm xmm
30482// 	VPMULHRSW ymm  ymm ymm
30483// 	VPMULHRSW m256 ymm ymm
30484func VPMULHRSW(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
30485	switch {
30486	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
30487		return &intrep.Instruction{
30488			Opcode:   "VPMULHRSW",
30489			Operands: []operand.Op{mxy, xy, xy1},
30490			Inputs:   []operand.Op{mxy, xy},
30491			Outputs:  []operand.Op{xy1},
30492			ISA:      []string{"AVX"},
30493		}, nil
30494	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
30495		return &intrep.Instruction{
30496			Opcode:   "VPMULHRSW",
30497			Operands: []operand.Op{mxy, xy, xy1},
30498			Inputs:   []operand.Op{mxy, xy},
30499			Outputs:  []operand.Op{xy1},
30500			ISA:      []string{"AVX"},
30501		}, nil
30502	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
30503		return &intrep.Instruction{
30504			Opcode:   "VPMULHRSW",
30505			Operands: []operand.Op{mxy, xy, xy1},
30506			Inputs:   []operand.Op{mxy, xy},
30507			Outputs:  []operand.Op{xy1},
30508			ISA:      []string{"AVX2"},
30509		}, nil
30510	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
30511		return &intrep.Instruction{
30512			Opcode:   "VPMULHRSW",
30513			Operands: []operand.Op{mxy, xy, xy1},
30514			Inputs:   []operand.Op{mxy, xy},
30515			Outputs:  []operand.Op{xy1},
30516			ISA:      []string{"AVX2"},
30517		}, nil
30518	}
30519	return nil, errors.New("VPMULHRSW: bad operands")
30520}
30521
30522// VPMULHUW: Multiply Packed Unsigned Word Integers and Store High Result.
30523//
30524// Forms:
30525//
30526// 	VPMULHUW xmm  xmm xmm
30527// 	VPMULHUW m128 xmm xmm
30528// 	VPMULHUW ymm  ymm ymm
30529// 	VPMULHUW m256 ymm ymm
30530func VPMULHUW(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
30531	switch {
30532	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
30533		return &intrep.Instruction{
30534			Opcode:   "VPMULHUW",
30535			Operands: []operand.Op{mxy, xy, xy1},
30536			Inputs:   []operand.Op{mxy, xy},
30537			Outputs:  []operand.Op{xy1},
30538			ISA:      []string{"AVX"},
30539		}, nil
30540	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
30541		return &intrep.Instruction{
30542			Opcode:   "VPMULHUW",
30543			Operands: []operand.Op{mxy, xy, xy1},
30544			Inputs:   []operand.Op{mxy, xy},
30545			Outputs:  []operand.Op{xy1},
30546			ISA:      []string{"AVX"},
30547		}, nil
30548	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
30549		return &intrep.Instruction{
30550			Opcode:   "VPMULHUW",
30551			Operands: []operand.Op{mxy, xy, xy1},
30552			Inputs:   []operand.Op{mxy, xy},
30553			Outputs:  []operand.Op{xy1},
30554			ISA:      []string{"AVX2"},
30555		}, nil
30556	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
30557		return &intrep.Instruction{
30558			Opcode:   "VPMULHUW",
30559			Operands: []operand.Op{mxy, xy, xy1},
30560			Inputs:   []operand.Op{mxy, xy},
30561			Outputs:  []operand.Op{xy1},
30562			ISA:      []string{"AVX2"},
30563		}, nil
30564	}
30565	return nil, errors.New("VPMULHUW: bad operands")
30566}
30567
30568// VPMULHW: Multiply Packed Signed Word Integers and Store High Result.
30569//
30570// Forms:
30571//
30572// 	VPMULHW xmm  xmm xmm
30573// 	VPMULHW m128 xmm xmm
30574// 	VPMULHW ymm  ymm ymm
30575// 	VPMULHW m256 ymm ymm
30576func VPMULHW(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
30577	switch {
30578	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
30579		return &intrep.Instruction{
30580			Opcode:   "VPMULHW",
30581			Operands: []operand.Op{mxy, xy, xy1},
30582			Inputs:   []operand.Op{mxy, xy},
30583			Outputs:  []operand.Op{xy1},
30584			ISA:      []string{"AVX"},
30585		}, nil
30586	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
30587		return &intrep.Instruction{
30588			Opcode:   "VPMULHW",
30589			Operands: []operand.Op{mxy, xy, xy1},
30590			Inputs:   []operand.Op{mxy, xy},
30591			Outputs:  []operand.Op{xy1},
30592			ISA:      []string{"AVX"},
30593		}, nil
30594	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
30595		return &intrep.Instruction{
30596			Opcode:   "VPMULHW",
30597			Operands: []operand.Op{mxy, xy, xy1},
30598			Inputs:   []operand.Op{mxy, xy},
30599			Outputs:  []operand.Op{xy1},
30600			ISA:      []string{"AVX2"},
30601		}, nil
30602	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
30603		return &intrep.Instruction{
30604			Opcode:   "VPMULHW",
30605			Operands: []operand.Op{mxy, xy, xy1},
30606			Inputs:   []operand.Op{mxy, xy},
30607			Outputs:  []operand.Op{xy1},
30608			ISA:      []string{"AVX2"},
30609		}, nil
30610	}
30611	return nil, errors.New("VPMULHW: bad operands")
30612}
30613
30614// VPMULLD: Multiply Packed Signed Doubleword Integers and Store Low Result.
30615//
30616// Forms:
30617//
30618// 	VPMULLD xmm  xmm xmm
30619// 	VPMULLD m128 xmm xmm
30620// 	VPMULLD ymm  ymm ymm
30621// 	VPMULLD m256 ymm ymm
30622func VPMULLD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
30623	switch {
30624	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
30625		return &intrep.Instruction{
30626			Opcode:   "VPMULLD",
30627			Operands: []operand.Op{mxy, xy, xy1},
30628			Inputs:   []operand.Op{mxy, xy},
30629			Outputs:  []operand.Op{xy1},
30630			ISA:      []string{"AVX"},
30631		}, nil
30632	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
30633		return &intrep.Instruction{
30634			Opcode:   "VPMULLD",
30635			Operands: []operand.Op{mxy, xy, xy1},
30636			Inputs:   []operand.Op{mxy, xy},
30637			Outputs:  []operand.Op{xy1},
30638			ISA:      []string{"AVX"},
30639		}, nil
30640	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
30641		return &intrep.Instruction{
30642			Opcode:   "VPMULLD",
30643			Operands: []operand.Op{mxy, xy, xy1},
30644			Inputs:   []operand.Op{mxy, xy},
30645			Outputs:  []operand.Op{xy1},
30646			ISA:      []string{"AVX2"},
30647		}, nil
30648	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
30649		return &intrep.Instruction{
30650			Opcode:   "VPMULLD",
30651			Operands: []operand.Op{mxy, xy, xy1},
30652			Inputs:   []operand.Op{mxy, xy},
30653			Outputs:  []operand.Op{xy1},
30654			ISA:      []string{"AVX2"},
30655		}, nil
30656	}
30657	return nil, errors.New("VPMULLD: bad operands")
30658}
30659
30660// VPMULLW: Multiply Packed Signed Word Integers and Store Low Result.
30661//
30662// Forms:
30663//
30664// 	VPMULLW xmm  xmm xmm
30665// 	VPMULLW m128 xmm xmm
30666// 	VPMULLW ymm  ymm ymm
30667// 	VPMULLW m256 ymm ymm
30668func VPMULLW(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
30669	switch {
30670	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
30671		return &intrep.Instruction{
30672			Opcode:   "VPMULLW",
30673			Operands: []operand.Op{mxy, xy, xy1},
30674			Inputs:   []operand.Op{mxy, xy},
30675			Outputs:  []operand.Op{xy1},
30676			ISA:      []string{"AVX"},
30677		}, nil
30678	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
30679		return &intrep.Instruction{
30680			Opcode:   "VPMULLW",
30681			Operands: []operand.Op{mxy, xy, xy1},
30682			Inputs:   []operand.Op{mxy, xy},
30683			Outputs:  []operand.Op{xy1},
30684			ISA:      []string{"AVX"},
30685		}, nil
30686	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
30687		return &intrep.Instruction{
30688			Opcode:   "VPMULLW",
30689			Operands: []operand.Op{mxy, xy, xy1},
30690			Inputs:   []operand.Op{mxy, xy},
30691			Outputs:  []operand.Op{xy1},
30692			ISA:      []string{"AVX2"},
30693		}, nil
30694	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
30695		return &intrep.Instruction{
30696			Opcode:   "VPMULLW",
30697			Operands: []operand.Op{mxy, xy, xy1},
30698			Inputs:   []operand.Op{mxy, xy},
30699			Outputs:  []operand.Op{xy1},
30700			ISA:      []string{"AVX2"},
30701		}, nil
30702	}
30703	return nil, errors.New("VPMULLW: bad operands")
30704}
30705
30706// VPMULUDQ: Multiply Packed Unsigned Doubleword Integers.
30707//
30708// Forms:
30709//
30710// 	VPMULUDQ xmm  xmm xmm
30711// 	VPMULUDQ m128 xmm xmm
30712// 	VPMULUDQ ymm  ymm ymm
30713// 	VPMULUDQ m256 ymm ymm
30714func VPMULUDQ(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
30715	switch {
30716	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
30717		return &intrep.Instruction{
30718			Opcode:   "VPMULUDQ",
30719			Operands: []operand.Op{mxy, xy, xy1},
30720			Inputs:   []operand.Op{mxy, xy},
30721			Outputs:  []operand.Op{xy1},
30722			ISA:      []string{"AVX"},
30723		}, nil
30724	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
30725		return &intrep.Instruction{
30726			Opcode:   "VPMULUDQ",
30727			Operands: []operand.Op{mxy, xy, xy1},
30728			Inputs:   []operand.Op{mxy, xy},
30729			Outputs:  []operand.Op{xy1},
30730			ISA:      []string{"AVX"},
30731		}, nil
30732	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
30733		return &intrep.Instruction{
30734			Opcode:   "VPMULUDQ",
30735			Operands: []operand.Op{mxy, xy, xy1},
30736			Inputs:   []operand.Op{mxy, xy},
30737			Outputs:  []operand.Op{xy1},
30738			ISA:      []string{"AVX2"},
30739		}, nil
30740	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
30741		return &intrep.Instruction{
30742			Opcode:   "VPMULUDQ",
30743			Operands: []operand.Op{mxy, xy, xy1},
30744			Inputs:   []operand.Op{mxy, xy},
30745			Outputs:  []operand.Op{xy1},
30746			ISA:      []string{"AVX2"},
30747		}, nil
30748	}
30749	return nil, errors.New("VPMULUDQ: bad operands")
30750}
30751
30752// VPOR: Packed Bitwise Logical OR.
30753//
30754// Forms:
30755//
30756// 	VPOR xmm  xmm xmm
30757// 	VPOR m128 xmm xmm
30758// 	VPOR ymm  ymm ymm
30759// 	VPOR m256 ymm ymm
30760func VPOR(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
30761	switch {
30762	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
30763		return &intrep.Instruction{
30764			Opcode:   "VPOR",
30765			Operands: []operand.Op{mxy, xy, xy1},
30766			Inputs:   []operand.Op{mxy, xy},
30767			Outputs:  []operand.Op{xy1},
30768			ISA:      []string{"AVX"},
30769		}, nil
30770	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
30771		return &intrep.Instruction{
30772			Opcode:   "VPOR",
30773			Operands: []operand.Op{mxy, xy, xy1},
30774			Inputs:   []operand.Op{mxy, xy},
30775			Outputs:  []operand.Op{xy1},
30776			ISA:      []string{"AVX"},
30777		}, nil
30778	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
30779		return &intrep.Instruction{
30780			Opcode:   "VPOR",
30781			Operands: []operand.Op{mxy, xy, xy1},
30782			Inputs:   []operand.Op{mxy, xy},
30783			Outputs:  []operand.Op{xy1},
30784			ISA:      []string{"AVX2"},
30785		}, nil
30786	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
30787		return &intrep.Instruction{
30788			Opcode:   "VPOR",
30789			Operands: []operand.Op{mxy, xy, xy1},
30790			Inputs:   []operand.Op{mxy, xy},
30791			Outputs:  []operand.Op{xy1},
30792			ISA:      []string{"AVX2"},
30793		}, nil
30794	}
30795	return nil, errors.New("VPOR: bad operands")
30796}
30797
30798// VPSADBW: Compute Sum of Absolute Differences.
30799//
30800// Forms:
30801//
30802// 	VPSADBW xmm  xmm xmm
30803// 	VPSADBW m128 xmm xmm
30804// 	VPSADBW ymm  ymm ymm
30805// 	VPSADBW m256 ymm ymm
30806func VPSADBW(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
30807	switch {
30808	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
30809		return &intrep.Instruction{
30810			Opcode:           "VPSADBW",
30811			Operands:         []operand.Op{mxy, xy, xy1},
30812			Inputs:           []operand.Op{mxy, xy},
30813			Outputs:          []operand.Op{xy1},
30814			ISA:              []string{"AVX"},
30815			CancellingInputs: true,
30816		}, nil
30817	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
30818		return &intrep.Instruction{
30819			Opcode:   "VPSADBW",
30820			Operands: []operand.Op{mxy, xy, xy1},
30821			Inputs:   []operand.Op{mxy, xy},
30822			Outputs:  []operand.Op{xy1},
30823			ISA:      []string{"AVX"},
30824		}, nil
30825	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
30826		return &intrep.Instruction{
30827			Opcode:           "VPSADBW",
30828			Operands:         []operand.Op{mxy, xy, xy1},
30829			Inputs:           []operand.Op{mxy, xy},
30830			Outputs:          []operand.Op{xy1},
30831			ISA:              []string{"AVX2"},
30832			CancellingInputs: true,
30833		}, nil
30834	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
30835		return &intrep.Instruction{
30836			Opcode:   "VPSADBW",
30837			Operands: []operand.Op{mxy, xy, xy1},
30838			Inputs:   []operand.Op{mxy, xy},
30839			Outputs:  []operand.Op{xy1},
30840			ISA:      []string{"AVX2"},
30841		}, nil
30842	}
30843	return nil, errors.New("VPSADBW: bad operands")
30844}
30845
30846// VPSHUFB: Packed Shuffle Bytes.
30847//
30848// Forms:
30849//
30850// 	VPSHUFB xmm  xmm xmm
30851// 	VPSHUFB m128 xmm xmm
30852// 	VPSHUFB ymm  ymm ymm
30853// 	VPSHUFB m256 ymm ymm
30854func VPSHUFB(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
30855	switch {
30856	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
30857		return &intrep.Instruction{
30858			Opcode:   "VPSHUFB",
30859			Operands: []operand.Op{mxy, xy, xy1},
30860			Inputs:   []operand.Op{mxy, xy},
30861			Outputs:  []operand.Op{xy1},
30862			ISA:      []string{"AVX"},
30863		}, nil
30864	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
30865		return &intrep.Instruction{
30866			Opcode:   "VPSHUFB",
30867			Operands: []operand.Op{mxy, xy, xy1},
30868			Inputs:   []operand.Op{mxy, xy},
30869			Outputs:  []operand.Op{xy1},
30870			ISA:      []string{"AVX"},
30871		}, nil
30872	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
30873		return &intrep.Instruction{
30874			Opcode:   "VPSHUFB",
30875			Operands: []operand.Op{mxy, xy, xy1},
30876			Inputs:   []operand.Op{mxy, xy},
30877			Outputs:  []operand.Op{xy1},
30878			ISA:      []string{"AVX2"},
30879		}, nil
30880	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
30881		return &intrep.Instruction{
30882			Opcode:   "VPSHUFB",
30883			Operands: []operand.Op{mxy, xy, xy1},
30884			Inputs:   []operand.Op{mxy, xy},
30885			Outputs:  []operand.Op{xy1},
30886			ISA:      []string{"AVX2"},
30887		}, nil
30888	}
30889	return nil, errors.New("VPSHUFB: bad operands")
30890}
30891
30892// VPSHUFD: Shuffle Packed Doublewords.
30893//
30894// Forms:
30895//
30896// 	VPSHUFD imm8 xmm  xmm
30897// 	VPSHUFD imm8 m128 xmm
30898// 	VPSHUFD imm8 ymm  ymm
30899// 	VPSHUFD imm8 m256 ymm
30900func VPSHUFD(i, mxy, xy operand.Op) (*intrep.Instruction, error) {
30901	switch {
30902	case operand.IsIMM8(i) && operand.IsXMM(mxy) && operand.IsXMM(xy):
30903		return &intrep.Instruction{
30904			Opcode:   "VPSHUFD",
30905			Operands: []operand.Op{i, mxy, xy},
30906			Inputs:   []operand.Op{mxy},
30907			Outputs:  []operand.Op{xy},
30908			ISA:      []string{"AVX"},
30909		}, nil
30910	case operand.IsIMM8(i) && operand.IsM128(mxy) && operand.IsXMM(xy):
30911		return &intrep.Instruction{
30912			Opcode:   "VPSHUFD",
30913			Operands: []operand.Op{i, mxy, xy},
30914			Inputs:   []operand.Op{mxy},
30915			Outputs:  []operand.Op{xy},
30916			ISA:      []string{"AVX"},
30917		}, nil
30918	case operand.IsIMM8(i) && operand.IsYMM(mxy) && operand.IsYMM(xy):
30919		return &intrep.Instruction{
30920			Opcode:   "VPSHUFD",
30921			Operands: []operand.Op{i, mxy, xy},
30922			Inputs:   []operand.Op{mxy},
30923			Outputs:  []operand.Op{xy},
30924			ISA:      []string{"AVX2"},
30925		}, nil
30926	case operand.IsIMM8(i) && operand.IsM256(mxy) && operand.IsYMM(xy):
30927		return &intrep.Instruction{
30928			Opcode:   "VPSHUFD",
30929			Operands: []operand.Op{i, mxy, xy},
30930			Inputs:   []operand.Op{mxy},
30931			Outputs:  []operand.Op{xy},
30932			ISA:      []string{"AVX2"},
30933		}, nil
30934	}
30935	return nil, errors.New("VPSHUFD: bad operands")
30936}
30937
30938// VPSHUFHW: Shuffle Packed High Words.
30939//
30940// Forms:
30941//
30942// 	VPSHUFHW imm8 xmm  xmm
30943// 	VPSHUFHW imm8 m128 xmm
30944// 	VPSHUFHW imm8 ymm  ymm
30945// 	VPSHUFHW imm8 m256 ymm
30946func VPSHUFHW(i, mxy, xy operand.Op) (*intrep.Instruction, error) {
30947	switch {
30948	case operand.IsIMM8(i) && operand.IsXMM(mxy) && operand.IsXMM(xy):
30949		return &intrep.Instruction{
30950			Opcode:   "VPSHUFHW",
30951			Operands: []operand.Op{i, mxy, xy},
30952			Inputs:   []operand.Op{mxy},
30953			Outputs:  []operand.Op{xy},
30954			ISA:      []string{"AVX"},
30955		}, nil
30956	case operand.IsIMM8(i) && operand.IsM128(mxy) && operand.IsXMM(xy):
30957		return &intrep.Instruction{
30958			Opcode:   "VPSHUFHW",
30959			Operands: []operand.Op{i, mxy, xy},
30960			Inputs:   []operand.Op{mxy},
30961			Outputs:  []operand.Op{xy},
30962			ISA:      []string{"AVX"},
30963		}, nil
30964	case operand.IsIMM8(i) && operand.IsYMM(mxy) && operand.IsYMM(xy):
30965		return &intrep.Instruction{
30966			Opcode:   "VPSHUFHW",
30967			Operands: []operand.Op{i, mxy, xy},
30968			Inputs:   []operand.Op{mxy},
30969			Outputs:  []operand.Op{xy},
30970			ISA:      []string{"AVX2"},
30971		}, nil
30972	case operand.IsIMM8(i) && operand.IsM256(mxy) && operand.IsYMM(xy):
30973		return &intrep.Instruction{
30974			Opcode:   "VPSHUFHW",
30975			Operands: []operand.Op{i, mxy, xy},
30976			Inputs:   []operand.Op{mxy},
30977			Outputs:  []operand.Op{xy},
30978			ISA:      []string{"AVX2"},
30979		}, nil
30980	}
30981	return nil, errors.New("VPSHUFHW: bad operands")
30982}
30983
30984// VPSHUFLW: Shuffle Packed Low Words.
30985//
30986// Forms:
30987//
30988// 	VPSHUFLW imm8 xmm  xmm
30989// 	VPSHUFLW imm8 m128 xmm
30990// 	VPSHUFLW imm8 ymm  ymm
30991// 	VPSHUFLW imm8 m256 ymm
30992func VPSHUFLW(i, mxy, xy operand.Op) (*intrep.Instruction, error) {
30993	switch {
30994	case operand.IsIMM8(i) && operand.IsXMM(mxy) && operand.IsXMM(xy):
30995		return &intrep.Instruction{
30996			Opcode:   "VPSHUFLW",
30997			Operands: []operand.Op{i, mxy, xy},
30998			Inputs:   []operand.Op{mxy},
30999			Outputs:  []operand.Op{xy},
31000			ISA:      []string{"AVX"},
31001		}, nil
31002	case operand.IsIMM8(i) && operand.IsM128(mxy) && operand.IsXMM(xy):
31003		return &intrep.Instruction{
31004			Opcode:   "VPSHUFLW",
31005			Operands: []operand.Op{i, mxy, xy},
31006			Inputs:   []operand.Op{mxy},
31007			Outputs:  []operand.Op{xy},
31008			ISA:      []string{"AVX"},
31009		}, nil
31010	case operand.IsIMM8(i) && operand.IsYMM(mxy) && operand.IsYMM(xy):
31011		return &intrep.Instruction{
31012			Opcode:   "VPSHUFLW",
31013			Operands: []operand.Op{i, mxy, xy},
31014			Inputs:   []operand.Op{mxy},
31015			Outputs:  []operand.Op{xy},
31016			ISA:      []string{"AVX2"},
31017		}, nil
31018	case operand.IsIMM8(i) && operand.IsM256(mxy) && operand.IsYMM(xy):
31019		return &intrep.Instruction{
31020			Opcode:   "VPSHUFLW",
31021			Operands: []operand.Op{i, mxy, xy},
31022			Inputs:   []operand.Op{mxy},
31023			Outputs:  []operand.Op{xy},
31024			ISA:      []string{"AVX2"},
31025		}, nil
31026	}
31027	return nil, errors.New("VPSHUFLW: bad operands")
31028}
31029
31030// VPSIGNB: Packed Sign of Byte Integers.
31031//
31032// Forms:
31033//
31034// 	VPSIGNB xmm  xmm xmm
31035// 	VPSIGNB m128 xmm xmm
31036// 	VPSIGNB ymm  ymm ymm
31037// 	VPSIGNB m256 ymm ymm
31038func VPSIGNB(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
31039	switch {
31040	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
31041		return &intrep.Instruction{
31042			Opcode:   "VPSIGNB",
31043			Operands: []operand.Op{mxy, xy, xy1},
31044			Inputs:   []operand.Op{mxy, xy},
31045			Outputs:  []operand.Op{xy1},
31046			ISA:      []string{"AVX"},
31047		}, nil
31048	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
31049		return &intrep.Instruction{
31050			Opcode:   "VPSIGNB",
31051			Operands: []operand.Op{mxy, xy, xy1},
31052			Inputs:   []operand.Op{mxy, xy},
31053			Outputs:  []operand.Op{xy1},
31054			ISA:      []string{"AVX"},
31055		}, nil
31056	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
31057		return &intrep.Instruction{
31058			Opcode:   "VPSIGNB",
31059			Operands: []operand.Op{mxy, xy, xy1},
31060			Inputs:   []operand.Op{mxy, xy},
31061			Outputs:  []operand.Op{xy1},
31062			ISA:      []string{"AVX2"},
31063		}, nil
31064	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
31065		return &intrep.Instruction{
31066			Opcode:   "VPSIGNB",
31067			Operands: []operand.Op{mxy, xy, xy1},
31068			Inputs:   []operand.Op{mxy, xy},
31069			Outputs:  []operand.Op{xy1},
31070			ISA:      []string{"AVX2"},
31071		}, nil
31072	}
31073	return nil, errors.New("VPSIGNB: bad operands")
31074}
31075
31076// VPSIGND: Packed Sign of Doubleword Integers.
31077//
31078// Forms:
31079//
31080// 	VPSIGND xmm  xmm xmm
31081// 	VPSIGND m128 xmm xmm
31082// 	VPSIGND ymm  ymm ymm
31083// 	VPSIGND m256 ymm ymm
31084func VPSIGND(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
31085	switch {
31086	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
31087		return &intrep.Instruction{
31088			Opcode:   "VPSIGND",
31089			Operands: []operand.Op{mxy, xy, xy1},
31090			Inputs:   []operand.Op{mxy, xy},
31091			Outputs:  []operand.Op{xy1},
31092			ISA:      []string{"AVX"},
31093		}, nil
31094	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
31095		return &intrep.Instruction{
31096			Opcode:   "VPSIGND",
31097			Operands: []operand.Op{mxy, xy, xy1},
31098			Inputs:   []operand.Op{mxy, xy},
31099			Outputs:  []operand.Op{xy1},
31100			ISA:      []string{"AVX"},
31101		}, nil
31102	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
31103		return &intrep.Instruction{
31104			Opcode:   "VPSIGND",
31105			Operands: []operand.Op{mxy, xy, xy1},
31106			Inputs:   []operand.Op{mxy, xy},
31107			Outputs:  []operand.Op{xy1},
31108			ISA:      []string{"AVX2"},
31109		}, nil
31110	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
31111		return &intrep.Instruction{
31112			Opcode:   "VPSIGND",
31113			Operands: []operand.Op{mxy, xy, xy1},
31114			Inputs:   []operand.Op{mxy, xy},
31115			Outputs:  []operand.Op{xy1},
31116			ISA:      []string{"AVX2"},
31117		}, nil
31118	}
31119	return nil, errors.New("VPSIGND: bad operands")
31120}
31121
31122// VPSIGNW: Packed Sign of Word Integers.
31123//
31124// Forms:
31125//
31126// 	VPSIGNW xmm  xmm xmm
31127// 	VPSIGNW m128 xmm xmm
31128// 	VPSIGNW ymm  ymm ymm
31129// 	VPSIGNW m256 ymm ymm
31130func VPSIGNW(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
31131	switch {
31132	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
31133		return &intrep.Instruction{
31134			Opcode:   "VPSIGNW",
31135			Operands: []operand.Op{mxy, xy, xy1},
31136			Inputs:   []operand.Op{mxy, xy},
31137			Outputs:  []operand.Op{xy1},
31138			ISA:      []string{"AVX"},
31139		}, nil
31140	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
31141		return &intrep.Instruction{
31142			Opcode:   "VPSIGNW",
31143			Operands: []operand.Op{mxy, xy, xy1},
31144			Inputs:   []operand.Op{mxy, xy},
31145			Outputs:  []operand.Op{xy1},
31146			ISA:      []string{"AVX"},
31147		}, nil
31148	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
31149		return &intrep.Instruction{
31150			Opcode:   "VPSIGNW",
31151			Operands: []operand.Op{mxy, xy, xy1},
31152			Inputs:   []operand.Op{mxy, xy},
31153			Outputs:  []operand.Op{xy1},
31154			ISA:      []string{"AVX2"},
31155		}, nil
31156	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
31157		return &intrep.Instruction{
31158			Opcode:   "VPSIGNW",
31159			Operands: []operand.Op{mxy, xy, xy1},
31160			Inputs:   []operand.Op{mxy, xy},
31161			Outputs:  []operand.Op{xy1},
31162			ISA:      []string{"AVX2"},
31163		}, nil
31164	}
31165	return nil, errors.New("VPSIGNW: bad operands")
31166}
31167
31168// VPSLLD: Shift Packed Doubleword Data Left Logical.
31169//
31170// Forms:
31171//
31172// 	VPSLLD imm8 xmm xmm
31173// 	VPSLLD xmm  xmm xmm
31174// 	VPSLLD m128 xmm xmm
31175// 	VPSLLD imm8 ymm ymm
31176// 	VPSLLD xmm  ymm ymm
31177// 	VPSLLD m128 ymm ymm
31178func VPSLLD(imx, xy, xy1 operand.Op) (*intrep.Instruction, error) {
31179	switch {
31180	case operand.IsIMM8(imx) && operand.IsXMM(xy) && operand.IsXMM(xy1):
31181		return &intrep.Instruction{
31182			Opcode:   "VPSLLD",
31183			Operands: []operand.Op{imx, xy, xy1},
31184			Inputs:   []operand.Op{xy},
31185			Outputs:  []operand.Op{xy1},
31186			ISA:      []string{"AVX"},
31187		}, nil
31188	case operand.IsXMM(imx) && operand.IsXMM(xy) && operand.IsXMM(xy1):
31189		return &intrep.Instruction{
31190			Opcode:   "VPSLLD",
31191			Operands: []operand.Op{imx, xy, xy1},
31192			Inputs:   []operand.Op{imx, xy},
31193			Outputs:  []operand.Op{xy1},
31194			ISA:      []string{"AVX"},
31195		}, nil
31196	case operand.IsM128(imx) && operand.IsXMM(xy) && operand.IsXMM(xy1):
31197		return &intrep.Instruction{
31198			Opcode:   "VPSLLD",
31199			Operands: []operand.Op{imx, xy, xy1},
31200			Inputs:   []operand.Op{imx, xy},
31201			Outputs:  []operand.Op{xy1},
31202			ISA:      []string{"AVX"},
31203		}, nil
31204	case operand.IsIMM8(imx) && operand.IsYMM(xy) && operand.IsYMM(xy1):
31205		return &intrep.Instruction{
31206			Opcode:   "VPSLLD",
31207			Operands: []operand.Op{imx, xy, xy1},
31208			Inputs:   []operand.Op{xy},
31209			Outputs:  []operand.Op{xy1},
31210			ISA:      []string{"AVX2"},
31211		}, nil
31212	case operand.IsXMM(imx) && operand.IsYMM(xy) && operand.IsYMM(xy1):
31213		return &intrep.Instruction{
31214			Opcode:   "VPSLLD",
31215			Operands: []operand.Op{imx, xy, xy1},
31216			Inputs:   []operand.Op{imx, xy},
31217			Outputs:  []operand.Op{xy1},
31218			ISA:      []string{"AVX2"},
31219		}, nil
31220	case operand.IsM128(imx) && operand.IsYMM(xy) && operand.IsYMM(xy1):
31221		return &intrep.Instruction{
31222			Opcode:   "VPSLLD",
31223			Operands: []operand.Op{imx, xy, xy1},
31224			Inputs:   []operand.Op{imx, xy},
31225			Outputs:  []operand.Op{xy1},
31226			ISA:      []string{"AVX2"},
31227		}, nil
31228	}
31229	return nil, errors.New("VPSLLD: bad operands")
31230}
31231
31232// VPSLLDQ: Shift Packed Double Quadword Left Logical.
31233//
31234// Forms:
31235//
31236// 	VPSLLDQ imm8 xmm xmm
31237// 	VPSLLDQ imm8 ymm ymm
31238func VPSLLDQ(i, xy, xy1 operand.Op) (*intrep.Instruction, error) {
31239	switch {
31240	case operand.IsIMM8(i) && operand.IsXMM(xy) && operand.IsXMM(xy1):
31241		return &intrep.Instruction{
31242			Opcode:   "VPSLLDQ",
31243			Operands: []operand.Op{i, xy, xy1},
31244			Inputs:   []operand.Op{xy},
31245			Outputs:  []operand.Op{xy1},
31246			ISA:      []string{"AVX"},
31247		}, nil
31248	case operand.IsIMM8(i) && operand.IsYMM(xy) && operand.IsYMM(xy1):
31249		return &intrep.Instruction{
31250			Opcode:   "VPSLLDQ",
31251			Operands: []operand.Op{i, xy, xy1},
31252			Inputs:   []operand.Op{xy},
31253			Outputs:  []operand.Op{xy1},
31254			ISA:      []string{"AVX2"},
31255		}, nil
31256	}
31257	return nil, errors.New("VPSLLDQ: bad operands")
31258}
31259
31260// VPSLLQ: Shift Packed Quadword Data Left Logical.
31261//
31262// Forms:
31263//
31264// 	VPSLLQ imm8 xmm xmm
31265// 	VPSLLQ xmm  xmm xmm
31266// 	VPSLLQ m128 xmm xmm
31267// 	VPSLLQ imm8 ymm ymm
31268// 	VPSLLQ xmm  ymm ymm
31269// 	VPSLLQ m128 ymm ymm
31270func VPSLLQ(imx, xy, xy1 operand.Op) (*intrep.Instruction, error) {
31271	switch {
31272	case operand.IsIMM8(imx) && operand.IsXMM(xy) && operand.IsXMM(xy1):
31273		return &intrep.Instruction{
31274			Opcode:   "VPSLLQ",
31275			Operands: []operand.Op{imx, xy, xy1},
31276			Inputs:   []operand.Op{xy},
31277			Outputs:  []operand.Op{xy1},
31278			ISA:      []string{"AVX"},
31279		}, nil
31280	case operand.IsXMM(imx) && operand.IsXMM(xy) && operand.IsXMM(xy1):
31281		return &intrep.Instruction{
31282			Opcode:   "VPSLLQ",
31283			Operands: []operand.Op{imx, xy, xy1},
31284			Inputs:   []operand.Op{imx, xy},
31285			Outputs:  []operand.Op{xy1},
31286			ISA:      []string{"AVX"},
31287		}, nil
31288	case operand.IsM128(imx) && operand.IsXMM(xy) && operand.IsXMM(xy1):
31289		return &intrep.Instruction{
31290			Opcode:   "VPSLLQ",
31291			Operands: []operand.Op{imx, xy, xy1},
31292			Inputs:   []operand.Op{imx, xy},
31293			Outputs:  []operand.Op{xy1},
31294			ISA:      []string{"AVX"},
31295		}, nil
31296	case operand.IsIMM8(imx) && operand.IsYMM(xy) && operand.IsYMM(xy1):
31297		return &intrep.Instruction{
31298			Opcode:   "VPSLLQ",
31299			Operands: []operand.Op{imx, xy, xy1},
31300			Inputs:   []operand.Op{xy},
31301			Outputs:  []operand.Op{xy1},
31302			ISA:      []string{"AVX2"},
31303		}, nil
31304	case operand.IsXMM(imx) && operand.IsYMM(xy) && operand.IsYMM(xy1):
31305		return &intrep.Instruction{
31306			Opcode:   "VPSLLQ",
31307			Operands: []operand.Op{imx, xy, xy1},
31308			Inputs:   []operand.Op{imx, xy},
31309			Outputs:  []operand.Op{xy1},
31310			ISA:      []string{"AVX2"},
31311		}, nil
31312	case operand.IsM128(imx) && operand.IsYMM(xy) && operand.IsYMM(xy1):
31313		return &intrep.Instruction{
31314			Opcode:   "VPSLLQ",
31315			Operands: []operand.Op{imx, xy, xy1},
31316			Inputs:   []operand.Op{imx, xy},
31317			Outputs:  []operand.Op{xy1},
31318			ISA:      []string{"AVX2"},
31319		}, nil
31320	}
31321	return nil, errors.New("VPSLLQ: bad operands")
31322}
31323
31324// VPSLLVD: Variable Shift Packed Doubleword Data Left Logical.
31325//
31326// Forms:
31327//
31328// 	VPSLLVD xmm  xmm xmm
31329// 	VPSLLVD m128 xmm xmm
31330// 	VPSLLVD ymm  ymm ymm
31331// 	VPSLLVD m256 ymm ymm
31332func VPSLLVD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
31333	switch {
31334	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
31335		return &intrep.Instruction{
31336			Opcode:   "VPSLLVD",
31337			Operands: []operand.Op{mxy, xy, xy1},
31338			Inputs:   []operand.Op{mxy, xy},
31339			Outputs:  []operand.Op{xy1},
31340			ISA:      []string{"AVX2"},
31341		}, nil
31342	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
31343		return &intrep.Instruction{
31344			Opcode:   "VPSLLVD",
31345			Operands: []operand.Op{mxy, xy, xy1},
31346			Inputs:   []operand.Op{mxy, xy},
31347			Outputs:  []operand.Op{xy1},
31348			ISA:      []string{"AVX2"},
31349		}, nil
31350	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
31351		return &intrep.Instruction{
31352			Opcode:   "VPSLLVD",
31353			Operands: []operand.Op{mxy, xy, xy1},
31354			Inputs:   []operand.Op{mxy, xy},
31355			Outputs:  []operand.Op{xy1},
31356			ISA:      []string{"AVX2"},
31357		}, nil
31358	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
31359		return &intrep.Instruction{
31360			Opcode:   "VPSLLVD",
31361			Operands: []operand.Op{mxy, xy, xy1},
31362			Inputs:   []operand.Op{mxy, xy},
31363			Outputs:  []operand.Op{xy1},
31364			ISA:      []string{"AVX2"},
31365		}, nil
31366	}
31367	return nil, errors.New("VPSLLVD: bad operands")
31368}
31369
31370// VPSLLVQ: Variable Shift Packed Quadword Data Left Logical.
31371//
31372// Forms:
31373//
31374// 	VPSLLVQ xmm  xmm xmm
31375// 	VPSLLVQ m128 xmm xmm
31376// 	VPSLLVQ ymm  ymm ymm
31377// 	VPSLLVQ m256 ymm ymm
31378func VPSLLVQ(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
31379	switch {
31380	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
31381		return &intrep.Instruction{
31382			Opcode:   "VPSLLVQ",
31383			Operands: []operand.Op{mxy, xy, xy1},
31384			Inputs:   []operand.Op{mxy, xy},
31385			Outputs:  []operand.Op{xy1},
31386			ISA:      []string{"AVX2"},
31387		}, nil
31388	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
31389		return &intrep.Instruction{
31390			Opcode:   "VPSLLVQ",
31391			Operands: []operand.Op{mxy, xy, xy1},
31392			Inputs:   []operand.Op{mxy, xy},
31393			Outputs:  []operand.Op{xy1},
31394			ISA:      []string{"AVX2"},
31395		}, nil
31396	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
31397		return &intrep.Instruction{
31398			Opcode:   "VPSLLVQ",
31399			Operands: []operand.Op{mxy, xy, xy1},
31400			Inputs:   []operand.Op{mxy, xy},
31401			Outputs:  []operand.Op{xy1},
31402			ISA:      []string{"AVX2"},
31403		}, nil
31404	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
31405		return &intrep.Instruction{
31406			Opcode:   "VPSLLVQ",
31407			Operands: []operand.Op{mxy, xy, xy1},
31408			Inputs:   []operand.Op{mxy, xy},
31409			Outputs:  []operand.Op{xy1},
31410			ISA:      []string{"AVX2"},
31411		}, nil
31412	}
31413	return nil, errors.New("VPSLLVQ: bad operands")
31414}
31415
31416// VPSLLW: Shift Packed Word Data Left Logical.
31417//
31418// Forms:
31419//
31420// 	VPSLLW imm8 xmm xmm
31421// 	VPSLLW xmm  xmm xmm
31422// 	VPSLLW m128 xmm xmm
31423// 	VPSLLW imm8 ymm ymm
31424// 	VPSLLW xmm  ymm ymm
31425// 	VPSLLW m128 ymm ymm
31426func VPSLLW(imx, xy, xy1 operand.Op) (*intrep.Instruction, error) {
31427	switch {
31428	case operand.IsIMM8(imx) && operand.IsXMM(xy) && operand.IsXMM(xy1):
31429		return &intrep.Instruction{
31430			Opcode:   "VPSLLW",
31431			Operands: []operand.Op{imx, xy, xy1},
31432			Inputs:   []operand.Op{xy},
31433			Outputs:  []operand.Op{xy1},
31434			ISA:      []string{"AVX"},
31435		}, nil
31436	case operand.IsXMM(imx) && operand.IsXMM(xy) && operand.IsXMM(xy1):
31437		return &intrep.Instruction{
31438			Opcode:   "VPSLLW",
31439			Operands: []operand.Op{imx, xy, xy1},
31440			Inputs:   []operand.Op{imx, xy},
31441			Outputs:  []operand.Op{xy1},
31442			ISA:      []string{"AVX"},
31443		}, nil
31444	case operand.IsM128(imx) && operand.IsXMM(xy) && operand.IsXMM(xy1):
31445		return &intrep.Instruction{
31446			Opcode:   "VPSLLW",
31447			Operands: []operand.Op{imx, xy, xy1},
31448			Inputs:   []operand.Op{imx, xy},
31449			Outputs:  []operand.Op{xy1},
31450			ISA:      []string{"AVX"},
31451		}, nil
31452	case operand.IsIMM8(imx) && operand.IsYMM(xy) && operand.IsYMM(xy1):
31453		return &intrep.Instruction{
31454			Opcode:   "VPSLLW",
31455			Operands: []operand.Op{imx, xy, xy1},
31456			Inputs:   []operand.Op{xy},
31457			Outputs:  []operand.Op{xy1},
31458			ISA:      []string{"AVX2"},
31459		}, nil
31460	case operand.IsXMM(imx) && operand.IsYMM(xy) && operand.IsYMM(xy1):
31461		return &intrep.Instruction{
31462			Opcode:   "VPSLLW",
31463			Operands: []operand.Op{imx, xy, xy1},
31464			Inputs:   []operand.Op{imx, xy},
31465			Outputs:  []operand.Op{xy1},
31466			ISA:      []string{"AVX2"},
31467		}, nil
31468	case operand.IsM128(imx) && operand.IsYMM(xy) && operand.IsYMM(xy1):
31469		return &intrep.Instruction{
31470			Opcode:   "VPSLLW",
31471			Operands: []operand.Op{imx, xy, xy1},
31472			Inputs:   []operand.Op{imx, xy},
31473			Outputs:  []operand.Op{xy1},
31474			ISA:      []string{"AVX2"},
31475		}, nil
31476	}
31477	return nil, errors.New("VPSLLW: bad operands")
31478}
31479
31480// VPSRAD: Shift Packed Doubleword Data Right Arithmetic.
31481//
31482// Forms:
31483//
31484// 	VPSRAD imm8 xmm xmm
31485// 	VPSRAD xmm  xmm xmm
31486// 	VPSRAD m128 xmm xmm
31487// 	VPSRAD imm8 ymm ymm
31488// 	VPSRAD xmm  ymm ymm
31489// 	VPSRAD m128 ymm ymm
31490func VPSRAD(imx, xy, xy1 operand.Op) (*intrep.Instruction, error) {
31491	switch {
31492	case operand.IsIMM8(imx) && operand.IsXMM(xy) && operand.IsXMM(xy1):
31493		return &intrep.Instruction{
31494			Opcode:   "VPSRAD",
31495			Operands: []operand.Op{imx, xy, xy1},
31496			Inputs:   []operand.Op{xy},
31497			Outputs:  []operand.Op{xy1},
31498			ISA:      []string{"AVX"},
31499		}, nil
31500	case operand.IsXMM(imx) && operand.IsXMM(xy) && operand.IsXMM(xy1):
31501		return &intrep.Instruction{
31502			Opcode:   "VPSRAD",
31503			Operands: []operand.Op{imx, xy, xy1},
31504			Inputs:   []operand.Op{imx, xy},
31505			Outputs:  []operand.Op{xy1},
31506			ISA:      []string{"AVX"},
31507		}, nil
31508	case operand.IsM128(imx) && operand.IsXMM(xy) && operand.IsXMM(xy1):
31509		return &intrep.Instruction{
31510			Opcode:   "VPSRAD",
31511			Operands: []operand.Op{imx, xy, xy1},
31512			Inputs:   []operand.Op{imx, xy},
31513			Outputs:  []operand.Op{xy1},
31514			ISA:      []string{"AVX"},
31515		}, nil
31516	case operand.IsIMM8(imx) && operand.IsYMM(xy) && operand.IsYMM(xy1):
31517		return &intrep.Instruction{
31518			Opcode:   "VPSRAD",
31519			Operands: []operand.Op{imx, xy, xy1},
31520			Inputs:   []operand.Op{xy},
31521			Outputs:  []operand.Op{xy1},
31522			ISA:      []string{"AVX2"},
31523		}, nil
31524	case operand.IsXMM(imx) && operand.IsYMM(xy) && operand.IsYMM(xy1):
31525		return &intrep.Instruction{
31526			Opcode:   "VPSRAD",
31527			Operands: []operand.Op{imx, xy, xy1},
31528			Inputs:   []operand.Op{imx, xy},
31529			Outputs:  []operand.Op{xy1},
31530			ISA:      []string{"AVX2"},
31531		}, nil
31532	case operand.IsM128(imx) && operand.IsYMM(xy) && operand.IsYMM(xy1):
31533		return &intrep.Instruction{
31534			Opcode:   "VPSRAD",
31535			Operands: []operand.Op{imx, xy, xy1},
31536			Inputs:   []operand.Op{imx, xy},
31537			Outputs:  []operand.Op{xy1},
31538			ISA:      []string{"AVX2"},
31539		}, nil
31540	}
31541	return nil, errors.New("VPSRAD: bad operands")
31542}
31543
31544// VPSRAVD: Variable Shift Packed Doubleword Data Right Arithmetic.
31545//
31546// Forms:
31547//
31548// 	VPSRAVD xmm  xmm xmm
31549// 	VPSRAVD m128 xmm xmm
31550// 	VPSRAVD ymm  ymm ymm
31551// 	VPSRAVD m256 ymm ymm
31552func VPSRAVD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
31553	switch {
31554	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
31555		return &intrep.Instruction{
31556			Opcode:   "VPSRAVD",
31557			Operands: []operand.Op{mxy, xy, xy1},
31558			Inputs:   []operand.Op{mxy, xy},
31559			Outputs:  []operand.Op{xy1},
31560			ISA:      []string{"AVX2"},
31561		}, nil
31562	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
31563		return &intrep.Instruction{
31564			Opcode:   "VPSRAVD",
31565			Operands: []operand.Op{mxy, xy, xy1},
31566			Inputs:   []operand.Op{mxy, xy},
31567			Outputs:  []operand.Op{xy1},
31568			ISA:      []string{"AVX2"},
31569		}, nil
31570	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
31571		return &intrep.Instruction{
31572			Opcode:   "VPSRAVD",
31573			Operands: []operand.Op{mxy, xy, xy1},
31574			Inputs:   []operand.Op{mxy, xy},
31575			Outputs:  []operand.Op{xy1},
31576			ISA:      []string{"AVX2"},
31577		}, nil
31578	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
31579		return &intrep.Instruction{
31580			Opcode:   "VPSRAVD",
31581			Operands: []operand.Op{mxy, xy, xy1},
31582			Inputs:   []operand.Op{mxy, xy},
31583			Outputs:  []operand.Op{xy1},
31584			ISA:      []string{"AVX2"},
31585		}, nil
31586	}
31587	return nil, errors.New("VPSRAVD: bad operands")
31588}
31589
31590// VPSRAW: Shift Packed Word Data Right Arithmetic.
31591//
31592// Forms:
31593//
31594// 	VPSRAW imm8 xmm xmm
31595// 	VPSRAW xmm  xmm xmm
31596// 	VPSRAW m128 xmm xmm
31597// 	VPSRAW imm8 ymm ymm
31598// 	VPSRAW xmm  ymm ymm
31599// 	VPSRAW m128 ymm ymm
31600func VPSRAW(imx, xy, xy1 operand.Op) (*intrep.Instruction, error) {
31601	switch {
31602	case operand.IsIMM8(imx) && operand.IsXMM(xy) && operand.IsXMM(xy1):
31603		return &intrep.Instruction{
31604			Opcode:   "VPSRAW",
31605			Operands: []operand.Op{imx, xy, xy1},
31606			Inputs:   []operand.Op{xy},
31607			Outputs:  []operand.Op{xy1},
31608			ISA:      []string{"AVX"},
31609		}, nil
31610	case operand.IsXMM(imx) && operand.IsXMM(xy) && operand.IsXMM(xy1):
31611		return &intrep.Instruction{
31612			Opcode:   "VPSRAW",
31613			Operands: []operand.Op{imx, xy, xy1},
31614			Inputs:   []operand.Op{imx, xy},
31615			Outputs:  []operand.Op{xy1},
31616			ISA:      []string{"AVX"},
31617		}, nil
31618	case operand.IsM128(imx) && operand.IsXMM(xy) && operand.IsXMM(xy1):
31619		return &intrep.Instruction{
31620			Opcode:   "VPSRAW",
31621			Operands: []operand.Op{imx, xy, xy1},
31622			Inputs:   []operand.Op{imx, xy},
31623			Outputs:  []operand.Op{xy1},
31624			ISA:      []string{"AVX"},
31625		}, nil
31626	case operand.IsIMM8(imx) && operand.IsYMM(xy) && operand.IsYMM(xy1):
31627		return &intrep.Instruction{
31628			Opcode:   "VPSRAW",
31629			Operands: []operand.Op{imx, xy, xy1},
31630			Inputs:   []operand.Op{xy},
31631			Outputs:  []operand.Op{xy1},
31632			ISA:      []string{"AVX2"},
31633		}, nil
31634	case operand.IsXMM(imx) && operand.IsYMM(xy) && operand.IsYMM(xy1):
31635		return &intrep.Instruction{
31636			Opcode:   "VPSRAW",
31637			Operands: []operand.Op{imx, xy, xy1},
31638			Inputs:   []operand.Op{imx, xy},
31639			Outputs:  []operand.Op{xy1},
31640			ISA:      []string{"AVX2"},
31641		}, nil
31642	case operand.IsM128(imx) && operand.IsYMM(xy) && operand.IsYMM(xy1):
31643		return &intrep.Instruction{
31644			Opcode:   "VPSRAW",
31645			Operands: []operand.Op{imx, xy, xy1},
31646			Inputs:   []operand.Op{imx, xy},
31647			Outputs:  []operand.Op{xy1},
31648			ISA:      []string{"AVX2"},
31649		}, nil
31650	}
31651	return nil, errors.New("VPSRAW: bad operands")
31652}
31653
31654// VPSRLD: Shift Packed Doubleword Data Right Logical.
31655//
31656// Forms:
31657//
31658// 	VPSRLD imm8 xmm xmm
31659// 	VPSRLD xmm  xmm xmm
31660// 	VPSRLD m128 xmm xmm
31661// 	VPSRLD imm8 ymm ymm
31662// 	VPSRLD xmm  ymm ymm
31663// 	VPSRLD m128 ymm ymm
31664func VPSRLD(imx, xy, xy1 operand.Op) (*intrep.Instruction, error) {
31665	switch {
31666	case operand.IsIMM8(imx) && operand.IsXMM(xy) && operand.IsXMM(xy1):
31667		return &intrep.Instruction{
31668			Opcode:   "VPSRLD",
31669			Operands: []operand.Op{imx, xy, xy1},
31670			Inputs:   []operand.Op{xy},
31671			Outputs:  []operand.Op{xy1},
31672			ISA:      []string{"AVX"},
31673		}, nil
31674	case operand.IsXMM(imx) && operand.IsXMM(xy) && operand.IsXMM(xy1):
31675		return &intrep.Instruction{
31676			Opcode:   "VPSRLD",
31677			Operands: []operand.Op{imx, xy, xy1},
31678			Inputs:   []operand.Op{imx, xy},
31679			Outputs:  []operand.Op{xy1},
31680			ISA:      []string{"AVX"},
31681		}, nil
31682	case operand.IsM128(imx) && operand.IsXMM(xy) && operand.IsXMM(xy1):
31683		return &intrep.Instruction{
31684			Opcode:   "VPSRLD",
31685			Operands: []operand.Op{imx, xy, xy1},
31686			Inputs:   []operand.Op{imx, xy},
31687			Outputs:  []operand.Op{xy1},
31688			ISA:      []string{"AVX"},
31689		}, nil
31690	case operand.IsIMM8(imx) && operand.IsYMM(xy) && operand.IsYMM(xy1):
31691		return &intrep.Instruction{
31692			Opcode:   "VPSRLD",
31693			Operands: []operand.Op{imx, xy, xy1},
31694			Inputs:   []operand.Op{xy},
31695			Outputs:  []operand.Op{xy1},
31696			ISA:      []string{"AVX2"},
31697		}, nil
31698	case operand.IsXMM(imx) && operand.IsYMM(xy) && operand.IsYMM(xy1):
31699		return &intrep.Instruction{
31700			Opcode:   "VPSRLD",
31701			Operands: []operand.Op{imx, xy, xy1},
31702			Inputs:   []operand.Op{imx, xy},
31703			Outputs:  []operand.Op{xy1},
31704			ISA:      []string{"AVX2"},
31705		}, nil
31706	case operand.IsM128(imx) && operand.IsYMM(xy) && operand.IsYMM(xy1):
31707		return &intrep.Instruction{
31708			Opcode:   "VPSRLD",
31709			Operands: []operand.Op{imx, xy, xy1},
31710			Inputs:   []operand.Op{imx, xy},
31711			Outputs:  []operand.Op{xy1},
31712			ISA:      []string{"AVX2"},
31713		}, nil
31714	}
31715	return nil, errors.New("VPSRLD: bad operands")
31716}
31717
31718// VPSRLDQ: Shift Packed Double Quadword Right Logical.
31719//
31720// Forms:
31721//
31722// 	VPSRLDQ imm8 xmm xmm
31723// 	VPSRLDQ imm8 ymm ymm
31724func VPSRLDQ(i, xy, xy1 operand.Op) (*intrep.Instruction, error) {
31725	switch {
31726	case operand.IsIMM8(i) && operand.IsXMM(xy) && operand.IsXMM(xy1):
31727		return &intrep.Instruction{
31728			Opcode:   "VPSRLDQ",
31729			Operands: []operand.Op{i, xy, xy1},
31730			Inputs:   []operand.Op{xy},
31731			Outputs:  []operand.Op{xy1},
31732			ISA:      []string{"AVX"},
31733		}, nil
31734	case operand.IsIMM8(i) && operand.IsYMM(xy) && operand.IsYMM(xy1):
31735		return &intrep.Instruction{
31736			Opcode:   "VPSRLDQ",
31737			Operands: []operand.Op{i, xy, xy1},
31738			Inputs:   []operand.Op{xy},
31739			Outputs:  []operand.Op{xy1},
31740			ISA:      []string{"AVX2"},
31741		}, nil
31742	}
31743	return nil, errors.New("VPSRLDQ: bad operands")
31744}
31745
31746// VPSRLQ: Shift Packed Quadword Data Right Logical.
31747//
31748// Forms:
31749//
31750// 	VPSRLQ imm8 xmm xmm
31751// 	VPSRLQ xmm  xmm xmm
31752// 	VPSRLQ m128 xmm xmm
31753// 	VPSRLQ imm8 ymm ymm
31754// 	VPSRLQ xmm  ymm ymm
31755// 	VPSRLQ m128 ymm ymm
31756func VPSRLQ(imx, xy, xy1 operand.Op) (*intrep.Instruction, error) {
31757	switch {
31758	case operand.IsIMM8(imx) && operand.IsXMM(xy) && operand.IsXMM(xy1):
31759		return &intrep.Instruction{
31760			Opcode:   "VPSRLQ",
31761			Operands: []operand.Op{imx, xy, xy1},
31762			Inputs:   []operand.Op{xy},
31763			Outputs:  []operand.Op{xy1},
31764			ISA:      []string{"AVX"},
31765		}, nil
31766	case operand.IsXMM(imx) && operand.IsXMM(xy) && operand.IsXMM(xy1):
31767		return &intrep.Instruction{
31768			Opcode:   "VPSRLQ",
31769			Operands: []operand.Op{imx, xy, xy1},
31770			Inputs:   []operand.Op{imx, xy},
31771			Outputs:  []operand.Op{xy1},
31772			ISA:      []string{"AVX"},
31773		}, nil
31774	case operand.IsM128(imx) && operand.IsXMM(xy) && operand.IsXMM(xy1):
31775		return &intrep.Instruction{
31776			Opcode:   "VPSRLQ",
31777			Operands: []operand.Op{imx, xy, xy1},
31778			Inputs:   []operand.Op{imx, xy},
31779			Outputs:  []operand.Op{xy1},
31780			ISA:      []string{"AVX"},
31781		}, nil
31782	case operand.IsIMM8(imx) && operand.IsYMM(xy) && operand.IsYMM(xy1):
31783		return &intrep.Instruction{
31784			Opcode:   "VPSRLQ",
31785			Operands: []operand.Op{imx, xy, xy1},
31786			Inputs:   []operand.Op{xy},
31787			Outputs:  []operand.Op{xy1},
31788			ISA:      []string{"AVX2"},
31789		}, nil
31790	case operand.IsXMM(imx) && operand.IsYMM(xy) && operand.IsYMM(xy1):
31791		return &intrep.Instruction{
31792			Opcode:   "VPSRLQ",
31793			Operands: []operand.Op{imx, xy, xy1},
31794			Inputs:   []operand.Op{imx, xy},
31795			Outputs:  []operand.Op{xy1},
31796			ISA:      []string{"AVX2"},
31797		}, nil
31798	case operand.IsM128(imx) && operand.IsYMM(xy) && operand.IsYMM(xy1):
31799		return &intrep.Instruction{
31800			Opcode:   "VPSRLQ",
31801			Operands: []operand.Op{imx, xy, xy1},
31802			Inputs:   []operand.Op{imx, xy},
31803			Outputs:  []operand.Op{xy1},
31804			ISA:      []string{"AVX2"},
31805		}, nil
31806	}
31807	return nil, errors.New("VPSRLQ: bad operands")
31808}
31809
31810// VPSRLVD: Variable Shift Packed Doubleword Data Right Logical.
31811//
31812// Forms:
31813//
31814// 	VPSRLVD xmm  xmm xmm
31815// 	VPSRLVD m128 xmm xmm
31816// 	VPSRLVD ymm  ymm ymm
31817// 	VPSRLVD m256 ymm ymm
31818func VPSRLVD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
31819	switch {
31820	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
31821		return &intrep.Instruction{
31822			Opcode:   "VPSRLVD",
31823			Operands: []operand.Op{mxy, xy, xy1},
31824			Inputs:   []operand.Op{mxy, xy},
31825			Outputs:  []operand.Op{xy1},
31826			ISA:      []string{"AVX2"},
31827		}, nil
31828	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
31829		return &intrep.Instruction{
31830			Opcode:   "VPSRLVD",
31831			Operands: []operand.Op{mxy, xy, xy1},
31832			Inputs:   []operand.Op{mxy, xy},
31833			Outputs:  []operand.Op{xy1},
31834			ISA:      []string{"AVX2"},
31835		}, nil
31836	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
31837		return &intrep.Instruction{
31838			Opcode:   "VPSRLVD",
31839			Operands: []operand.Op{mxy, xy, xy1},
31840			Inputs:   []operand.Op{mxy, xy},
31841			Outputs:  []operand.Op{xy1},
31842			ISA:      []string{"AVX2"},
31843		}, nil
31844	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
31845		return &intrep.Instruction{
31846			Opcode:   "VPSRLVD",
31847			Operands: []operand.Op{mxy, xy, xy1},
31848			Inputs:   []operand.Op{mxy, xy},
31849			Outputs:  []operand.Op{xy1},
31850			ISA:      []string{"AVX2"},
31851		}, nil
31852	}
31853	return nil, errors.New("VPSRLVD: bad operands")
31854}
31855
31856// VPSRLVQ: Variable Shift Packed Quadword Data Right Logical.
31857//
31858// Forms:
31859//
31860// 	VPSRLVQ xmm  xmm xmm
31861// 	VPSRLVQ m128 xmm xmm
31862// 	VPSRLVQ ymm  ymm ymm
31863// 	VPSRLVQ m256 ymm ymm
31864func VPSRLVQ(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
31865	switch {
31866	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
31867		return &intrep.Instruction{
31868			Opcode:   "VPSRLVQ",
31869			Operands: []operand.Op{mxy, xy, xy1},
31870			Inputs:   []operand.Op{mxy, xy},
31871			Outputs:  []operand.Op{xy1},
31872			ISA:      []string{"AVX2"},
31873		}, nil
31874	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
31875		return &intrep.Instruction{
31876			Opcode:   "VPSRLVQ",
31877			Operands: []operand.Op{mxy, xy, xy1},
31878			Inputs:   []operand.Op{mxy, xy},
31879			Outputs:  []operand.Op{xy1},
31880			ISA:      []string{"AVX2"},
31881		}, nil
31882	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
31883		return &intrep.Instruction{
31884			Opcode:   "VPSRLVQ",
31885			Operands: []operand.Op{mxy, xy, xy1},
31886			Inputs:   []operand.Op{mxy, xy},
31887			Outputs:  []operand.Op{xy1},
31888			ISA:      []string{"AVX2"},
31889		}, nil
31890	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
31891		return &intrep.Instruction{
31892			Opcode:   "VPSRLVQ",
31893			Operands: []operand.Op{mxy, xy, xy1},
31894			Inputs:   []operand.Op{mxy, xy},
31895			Outputs:  []operand.Op{xy1},
31896			ISA:      []string{"AVX2"},
31897		}, nil
31898	}
31899	return nil, errors.New("VPSRLVQ: bad operands")
31900}
31901
31902// VPSRLW: Shift Packed Word Data Right Logical.
31903//
31904// Forms:
31905//
31906// 	VPSRLW imm8 xmm xmm
31907// 	VPSRLW xmm  xmm xmm
31908// 	VPSRLW m128 xmm xmm
31909// 	VPSRLW imm8 ymm ymm
31910// 	VPSRLW xmm  ymm ymm
31911// 	VPSRLW m128 ymm ymm
31912func VPSRLW(imx, xy, xy1 operand.Op) (*intrep.Instruction, error) {
31913	switch {
31914	case operand.IsIMM8(imx) && operand.IsXMM(xy) && operand.IsXMM(xy1):
31915		return &intrep.Instruction{
31916			Opcode:   "VPSRLW",
31917			Operands: []operand.Op{imx, xy, xy1},
31918			Inputs:   []operand.Op{xy},
31919			Outputs:  []operand.Op{xy1},
31920			ISA:      []string{"AVX"},
31921		}, nil
31922	case operand.IsXMM(imx) && operand.IsXMM(xy) && operand.IsXMM(xy1):
31923		return &intrep.Instruction{
31924			Opcode:   "VPSRLW",
31925			Operands: []operand.Op{imx, xy, xy1},
31926			Inputs:   []operand.Op{imx, xy},
31927			Outputs:  []operand.Op{xy1},
31928			ISA:      []string{"AVX"},
31929		}, nil
31930	case operand.IsM128(imx) && operand.IsXMM(xy) && operand.IsXMM(xy1):
31931		return &intrep.Instruction{
31932			Opcode:   "VPSRLW",
31933			Operands: []operand.Op{imx, xy, xy1},
31934			Inputs:   []operand.Op{imx, xy},
31935			Outputs:  []operand.Op{xy1},
31936			ISA:      []string{"AVX"},
31937		}, nil
31938	case operand.IsIMM8(imx) && operand.IsYMM(xy) && operand.IsYMM(xy1):
31939		return &intrep.Instruction{
31940			Opcode:   "VPSRLW",
31941			Operands: []operand.Op{imx, xy, xy1},
31942			Inputs:   []operand.Op{xy},
31943			Outputs:  []operand.Op{xy1},
31944			ISA:      []string{"AVX2"},
31945		}, nil
31946	case operand.IsXMM(imx) && operand.IsYMM(xy) && operand.IsYMM(xy1):
31947		return &intrep.Instruction{
31948			Opcode:   "VPSRLW",
31949			Operands: []operand.Op{imx, xy, xy1},
31950			Inputs:   []operand.Op{imx, xy},
31951			Outputs:  []operand.Op{xy1},
31952			ISA:      []string{"AVX2"},
31953		}, nil
31954	case operand.IsM128(imx) && operand.IsYMM(xy) && operand.IsYMM(xy1):
31955		return &intrep.Instruction{
31956			Opcode:   "VPSRLW",
31957			Operands: []operand.Op{imx, xy, xy1},
31958			Inputs:   []operand.Op{imx, xy},
31959			Outputs:  []operand.Op{xy1},
31960			ISA:      []string{"AVX2"},
31961		}, nil
31962	}
31963	return nil, errors.New("VPSRLW: bad operands")
31964}
31965
31966// VPSUBB: Subtract Packed Byte Integers.
31967//
31968// Forms:
31969//
31970// 	VPSUBB xmm  xmm xmm
31971// 	VPSUBB m128 xmm xmm
31972// 	VPSUBB ymm  ymm ymm
31973// 	VPSUBB m256 ymm ymm
31974func VPSUBB(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
31975	switch {
31976	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
31977		return &intrep.Instruction{
31978			Opcode:           "VPSUBB",
31979			Operands:         []operand.Op{mxy, xy, xy1},
31980			Inputs:           []operand.Op{mxy, xy},
31981			Outputs:          []operand.Op{xy1},
31982			ISA:              []string{"AVX"},
31983			CancellingInputs: true,
31984		}, nil
31985	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
31986		return &intrep.Instruction{
31987			Opcode:   "VPSUBB",
31988			Operands: []operand.Op{mxy, xy, xy1},
31989			Inputs:   []operand.Op{mxy, xy},
31990			Outputs:  []operand.Op{xy1},
31991			ISA:      []string{"AVX"},
31992		}, nil
31993	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
31994		return &intrep.Instruction{
31995			Opcode:           "VPSUBB",
31996			Operands:         []operand.Op{mxy, xy, xy1},
31997			Inputs:           []operand.Op{mxy, xy},
31998			Outputs:          []operand.Op{xy1},
31999			ISA:              []string{"AVX2"},
32000			CancellingInputs: true,
32001		}, nil
32002	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
32003		return &intrep.Instruction{
32004			Opcode:   "VPSUBB",
32005			Operands: []operand.Op{mxy, xy, xy1},
32006			Inputs:   []operand.Op{mxy, xy},
32007			Outputs:  []operand.Op{xy1},
32008			ISA:      []string{"AVX2"},
32009		}, nil
32010	}
32011	return nil, errors.New("VPSUBB: bad operands")
32012}
32013
32014// VPSUBD: Subtract Packed Doubleword Integers.
32015//
32016// Forms:
32017//
32018// 	VPSUBD xmm  xmm xmm
32019// 	VPSUBD m128 xmm xmm
32020// 	VPSUBD ymm  ymm ymm
32021// 	VPSUBD m256 ymm ymm
32022func VPSUBD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
32023	switch {
32024	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
32025		return &intrep.Instruction{
32026			Opcode:           "VPSUBD",
32027			Operands:         []operand.Op{mxy, xy, xy1},
32028			Inputs:           []operand.Op{mxy, xy},
32029			Outputs:          []operand.Op{xy1},
32030			ISA:              []string{"AVX"},
32031			CancellingInputs: true,
32032		}, nil
32033	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
32034		return &intrep.Instruction{
32035			Opcode:   "VPSUBD",
32036			Operands: []operand.Op{mxy, xy, xy1},
32037			Inputs:   []operand.Op{mxy, xy},
32038			Outputs:  []operand.Op{xy1},
32039			ISA:      []string{"AVX"},
32040		}, nil
32041	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
32042		return &intrep.Instruction{
32043			Opcode:           "VPSUBD",
32044			Operands:         []operand.Op{mxy, xy, xy1},
32045			Inputs:           []operand.Op{mxy, xy},
32046			Outputs:          []operand.Op{xy1},
32047			ISA:              []string{"AVX2"},
32048			CancellingInputs: true,
32049		}, nil
32050	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
32051		return &intrep.Instruction{
32052			Opcode:   "VPSUBD",
32053			Operands: []operand.Op{mxy, xy, xy1},
32054			Inputs:   []operand.Op{mxy, xy},
32055			Outputs:  []operand.Op{xy1},
32056			ISA:      []string{"AVX2"},
32057		}, nil
32058	}
32059	return nil, errors.New("VPSUBD: bad operands")
32060}
32061
32062// VPSUBQ: Subtract Packed Quadword Integers.
32063//
32064// Forms:
32065//
32066// 	VPSUBQ xmm  xmm xmm
32067// 	VPSUBQ m128 xmm xmm
32068// 	VPSUBQ ymm  ymm ymm
32069// 	VPSUBQ m256 ymm ymm
32070func VPSUBQ(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
32071	switch {
32072	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
32073		return &intrep.Instruction{
32074			Opcode:           "VPSUBQ",
32075			Operands:         []operand.Op{mxy, xy, xy1},
32076			Inputs:           []operand.Op{mxy, xy},
32077			Outputs:          []operand.Op{xy1},
32078			ISA:              []string{"AVX"},
32079			CancellingInputs: true,
32080		}, nil
32081	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
32082		return &intrep.Instruction{
32083			Opcode:   "VPSUBQ",
32084			Operands: []operand.Op{mxy, xy, xy1},
32085			Inputs:   []operand.Op{mxy, xy},
32086			Outputs:  []operand.Op{xy1},
32087			ISA:      []string{"AVX"},
32088		}, nil
32089	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
32090		return &intrep.Instruction{
32091			Opcode:           "VPSUBQ",
32092			Operands:         []operand.Op{mxy, xy, xy1},
32093			Inputs:           []operand.Op{mxy, xy},
32094			Outputs:          []operand.Op{xy1},
32095			ISA:              []string{"AVX2"},
32096			CancellingInputs: true,
32097		}, nil
32098	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
32099		return &intrep.Instruction{
32100			Opcode:   "VPSUBQ",
32101			Operands: []operand.Op{mxy, xy, xy1},
32102			Inputs:   []operand.Op{mxy, xy},
32103			Outputs:  []operand.Op{xy1},
32104			ISA:      []string{"AVX2"},
32105		}, nil
32106	}
32107	return nil, errors.New("VPSUBQ: bad operands")
32108}
32109
32110// VPSUBSB: Subtract Packed Signed Byte Integers with Signed Saturation.
32111//
32112// Forms:
32113//
32114// 	VPSUBSB xmm  xmm xmm
32115// 	VPSUBSB m128 xmm xmm
32116// 	VPSUBSB ymm  ymm ymm
32117// 	VPSUBSB m256 ymm ymm
32118func VPSUBSB(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
32119	switch {
32120	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
32121		return &intrep.Instruction{
32122			Opcode:           "VPSUBSB",
32123			Operands:         []operand.Op{mxy, xy, xy1},
32124			Inputs:           []operand.Op{mxy, xy},
32125			Outputs:          []operand.Op{xy1},
32126			ISA:              []string{"AVX"},
32127			CancellingInputs: true,
32128		}, nil
32129	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
32130		return &intrep.Instruction{
32131			Opcode:   "VPSUBSB",
32132			Operands: []operand.Op{mxy, xy, xy1},
32133			Inputs:   []operand.Op{mxy, xy},
32134			Outputs:  []operand.Op{xy1},
32135			ISA:      []string{"AVX"},
32136		}, nil
32137	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
32138		return &intrep.Instruction{
32139			Opcode:           "VPSUBSB",
32140			Operands:         []operand.Op{mxy, xy, xy1},
32141			Inputs:           []operand.Op{mxy, xy},
32142			Outputs:          []operand.Op{xy1},
32143			ISA:              []string{"AVX2"},
32144			CancellingInputs: true,
32145		}, nil
32146	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
32147		return &intrep.Instruction{
32148			Opcode:   "VPSUBSB",
32149			Operands: []operand.Op{mxy, xy, xy1},
32150			Inputs:   []operand.Op{mxy, xy},
32151			Outputs:  []operand.Op{xy1},
32152			ISA:      []string{"AVX2"},
32153		}, nil
32154	}
32155	return nil, errors.New("VPSUBSB: bad operands")
32156}
32157
32158// VPSUBSW: Subtract Packed Signed Word Integers with Signed Saturation.
32159//
32160// Forms:
32161//
32162// 	VPSUBSW xmm  xmm xmm
32163// 	VPSUBSW m128 xmm xmm
32164// 	VPSUBSW ymm  ymm ymm
32165// 	VPSUBSW m256 ymm ymm
32166func VPSUBSW(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
32167	switch {
32168	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
32169		return &intrep.Instruction{
32170			Opcode:           "VPSUBSW",
32171			Operands:         []operand.Op{mxy, xy, xy1},
32172			Inputs:           []operand.Op{mxy, xy},
32173			Outputs:          []operand.Op{xy1},
32174			ISA:              []string{"AVX"},
32175			CancellingInputs: true,
32176		}, nil
32177	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
32178		return &intrep.Instruction{
32179			Opcode:   "VPSUBSW",
32180			Operands: []operand.Op{mxy, xy, xy1},
32181			Inputs:   []operand.Op{mxy, xy},
32182			Outputs:  []operand.Op{xy1},
32183			ISA:      []string{"AVX"},
32184		}, nil
32185	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
32186		return &intrep.Instruction{
32187			Opcode:           "VPSUBSW",
32188			Operands:         []operand.Op{mxy, xy, xy1},
32189			Inputs:           []operand.Op{mxy, xy},
32190			Outputs:          []operand.Op{xy1},
32191			ISA:              []string{"AVX2"},
32192			CancellingInputs: true,
32193		}, nil
32194	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
32195		return &intrep.Instruction{
32196			Opcode:   "VPSUBSW",
32197			Operands: []operand.Op{mxy, xy, xy1},
32198			Inputs:   []operand.Op{mxy, xy},
32199			Outputs:  []operand.Op{xy1},
32200			ISA:      []string{"AVX2"},
32201		}, nil
32202	}
32203	return nil, errors.New("VPSUBSW: bad operands")
32204}
32205
32206// VPSUBUSB: Subtract Packed Unsigned Byte Integers with Unsigned Saturation.
32207//
32208// Forms:
32209//
32210// 	VPSUBUSB xmm  xmm xmm
32211// 	VPSUBUSB m128 xmm xmm
32212// 	VPSUBUSB ymm  ymm ymm
32213// 	VPSUBUSB m256 ymm ymm
32214func VPSUBUSB(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
32215	switch {
32216	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
32217		return &intrep.Instruction{
32218			Opcode:           "VPSUBUSB",
32219			Operands:         []operand.Op{mxy, xy, xy1},
32220			Inputs:           []operand.Op{mxy, xy},
32221			Outputs:          []operand.Op{xy1},
32222			ISA:              []string{"AVX"},
32223			CancellingInputs: true,
32224		}, nil
32225	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
32226		return &intrep.Instruction{
32227			Opcode:   "VPSUBUSB",
32228			Operands: []operand.Op{mxy, xy, xy1},
32229			Inputs:   []operand.Op{mxy, xy},
32230			Outputs:  []operand.Op{xy1},
32231			ISA:      []string{"AVX"},
32232		}, nil
32233	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
32234		return &intrep.Instruction{
32235			Opcode:           "VPSUBUSB",
32236			Operands:         []operand.Op{mxy, xy, xy1},
32237			Inputs:           []operand.Op{mxy, xy},
32238			Outputs:          []operand.Op{xy1},
32239			ISA:              []string{"AVX2"},
32240			CancellingInputs: true,
32241		}, nil
32242	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
32243		return &intrep.Instruction{
32244			Opcode:   "VPSUBUSB",
32245			Operands: []operand.Op{mxy, xy, xy1},
32246			Inputs:   []operand.Op{mxy, xy},
32247			Outputs:  []operand.Op{xy1},
32248			ISA:      []string{"AVX2"},
32249		}, nil
32250	}
32251	return nil, errors.New("VPSUBUSB: bad operands")
32252}
32253
32254// VPSUBUSW: Subtract Packed Unsigned Word Integers with Unsigned Saturation.
32255//
32256// Forms:
32257//
32258// 	VPSUBUSW xmm  xmm xmm
32259// 	VPSUBUSW m128 xmm xmm
32260// 	VPSUBUSW ymm  ymm ymm
32261// 	VPSUBUSW m256 ymm ymm
32262func VPSUBUSW(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
32263	switch {
32264	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
32265		return &intrep.Instruction{
32266			Opcode:           "VPSUBUSW",
32267			Operands:         []operand.Op{mxy, xy, xy1},
32268			Inputs:           []operand.Op{mxy, xy},
32269			Outputs:          []operand.Op{xy1},
32270			ISA:              []string{"AVX"},
32271			CancellingInputs: true,
32272		}, nil
32273	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
32274		return &intrep.Instruction{
32275			Opcode:   "VPSUBUSW",
32276			Operands: []operand.Op{mxy, xy, xy1},
32277			Inputs:   []operand.Op{mxy, xy},
32278			Outputs:  []operand.Op{xy1},
32279			ISA:      []string{"AVX"},
32280		}, nil
32281	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
32282		return &intrep.Instruction{
32283			Opcode:           "VPSUBUSW",
32284			Operands:         []operand.Op{mxy, xy, xy1},
32285			Inputs:           []operand.Op{mxy, xy},
32286			Outputs:          []operand.Op{xy1},
32287			ISA:              []string{"AVX2"},
32288			CancellingInputs: true,
32289		}, nil
32290	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
32291		return &intrep.Instruction{
32292			Opcode:   "VPSUBUSW",
32293			Operands: []operand.Op{mxy, xy, xy1},
32294			Inputs:   []operand.Op{mxy, xy},
32295			Outputs:  []operand.Op{xy1},
32296			ISA:      []string{"AVX2"},
32297		}, nil
32298	}
32299	return nil, errors.New("VPSUBUSW: bad operands")
32300}
32301
32302// VPSUBW: Subtract Packed Word Integers.
32303//
32304// Forms:
32305//
32306// 	VPSUBW xmm  xmm xmm
32307// 	VPSUBW m128 xmm xmm
32308// 	VPSUBW ymm  ymm ymm
32309// 	VPSUBW m256 ymm ymm
32310func VPSUBW(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
32311	switch {
32312	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
32313		return &intrep.Instruction{
32314			Opcode:           "VPSUBW",
32315			Operands:         []operand.Op{mxy, xy, xy1},
32316			Inputs:           []operand.Op{mxy, xy},
32317			Outputs:          []operand.Op{xy1},
32318			ISA:              []string{"AVX"},
32319			CancellingInputs: true,
32320		}, nil
32321	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
32322		return &intrep.Instruction{
32323			Opcode:   "VPSUBW",
32324			Operands: []operand.Op{mxy, xy, xy1},
32325			Inputs:   []operand.Op{mxy, xy},
32326			Outputs:  []operand.Op{xy1},
32327			ISA:      []string{"AVX"},
32328		}, nil
32329	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
32330		return &intrep.Instruction{
32331			Opcode:           "VPSUBW",
32332			Operands:         []operand.Op{mxy, xy, xy1},
32333			Inputs:           []operand.Op{mxy, xy},
32334			Outputs:          []operand.Op{xy1},
32335			ISA:              []string{"AVX2"},
32336			CancellingInputs: true,
32337		}, nil
32338	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
32339		return &intrep.Instruction{
32340			Opcode:   "VPSUBW",
32341			Operands: []operand.Op{mxy, xy, xy1},
32342			Inputs:   []operand.Op{mxy, xy},
32343			Outputs:  []operand.Op{xy1},
32344			ISA:      []string{"AVX2"},
32345		}, nil
32346	}
32347	return nil, errors.New("VPSUBW: bad operands")
32348}
32349
32350// VPTEST: Packed Logical Compare.
32351//
32352// Forms:
32353//
32354// 	VPTEST xmm  xmm
32355// 	VPTEST m128 xmm
32356// 	VPTEST ymm  ymm
32357// 	VPTEST m256 ymm
32358func VPTEST(mxy, xy operand.Op) (*intrep.Instruction, error) {
32359	switch {
32360	case operand.IsXMM(mxy) && operand.IsXMM(xy):
32361		return &intrep.Instruction{
32362			Opcode:   "VPTEST",
32363			Operands: []operand.Op{mxy, xy},
32364			Inputs:   []operand.Op{mxy, xy},
32365			Outputs:  []operand.Op{},
32366			ISA:      []string{"AVX"},
32367		}, nil
32368	case operand.IsM128(mxy) && operand.IsXMM(xy):
32369		return &intrep.Instruction{
32370			Opcode:   "VPTEST",
32371			Operands: []operand.Op{mxy, xy},
32372			Inputs:   []operand.Op{mxy, xy},
32373			Outputs:  []operand.Op{},
32374			ISA:      []string{"AVX"},
32375		}, nil
32376	case operand.IsYMM(mxy) && operand.IsYMM(xy):
32377		return &intrep.Instruction{
32378			Opcode:   "VPTEST",
32379			Operands: []operand.Op{mxy, xy},
32380			Inputs:   []operand.Op{mxy, xy},
32381			Outputs:  []operand.Op{},
32382			ISA:      []string{"AVX"},
32383		}, nil
32384	case operand.IsM256(mxy) && operand.IsYMM(xy):
32385		return &intrep.Instruction{
32386			Opcode:   "VPTEST",
32387			Operands: []operand.Op{mxy, xy},
32388			Inputs:   []operand.Op{mxy, xy},
32389			Outputs:  []operand.Op{},
32390			ISA:      []string{"AVX"},
32391		}, nil
32392	}
32393	return nil, errors.New("VPTEST: bad operands")
32394}
32395
32396// VPUNPCKHBW: Unpack and Interleave High-Order Bytes into Words.
32397//
32398// Forms:
32399//
32400// 	VPUNPCKHBW xmm  xmm xmm
32401// 	VPUNPCKHBW m128 xmm xmm
32402// 	VPUNPCKHBW ymm  ymm ymm
32403// 	VPUNPCKHBW m256 ymm ymm
32404func VPUNPCKHBW(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
32405	switch {
32406	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
32407		return &intrep.Instruction{
32408			Opcode:   "VPUNPCKHBW",
32409			Operands: []operand.Op{mxy, xy, xy1},
32410			Inputs:   []operand.Op{mxy, xy},
32411			Outputs:  []operand.Op{xy1},
32412			ISA:      []string{"AVX"},
32413		}, nil
32414	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
32415		return &intrep.Instruction{
32416			Opcode:   "VPUNPCKHBW",
32417			Operands: []operand.Op{mxy, xy, xy1},
32418			Inputs:   []operand.Op{mxy, xy},
32419			Outputs:  []operand.Op{xy1},
32420			ISA:      []string{"AVX"},
32421		}, nil
32422	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
32423		return &intrep.Instruction{
32424			Opcode:   "VPUNPCKHBW",
32425			Operands: []operand.Op{mxy, xy, xy1},
32426			Inputs:   []operand.Op{mxy, xy},
32427			Outputs:  []operand.Op{xy1},
32428			ISA:      []string{"AVX2"},
32429		}, nil
32430	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
32431		return &intrep.Instruction{
32432			Opcode:   "VPUNPCKHBW",
32433			Operands: []operand.Op{mxy, xy, xy1},
32434			Inputs:   []operand.Op{mxy, xy},
32435			Outputs:  []operand.Op{xy1},
32436			ISA:      []string{"AVX2"},
32437		}, nil
32438	}
32439	return nil, errors.New("VPUNPCKHBW: bad operands")
32440}
32441
32442// VPUNPCKHDQ: Unpack and Interleave High-Order Doublewords into Quadwords.
32443//
32444// Forms:
32445//
32446// 	VPUNPCKHDQ xmm  xmm xmm
32447// 	VPUNPCKHDQ m128 xmm xmm
32448// 	VPUNPCKHDQ ymm  ymm ymm
32449// 	VPUNPCKHDQ m256 ymm ymm
32450func VPUNPCKHDQ(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
32451	switch {
32452	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
32453		return &intrep.Instruction{
32454			Opcode:   "VPUNPCKHDQ",
32455			Operands: []operand.Op{mxy, xy, xy1},
32456			Inputs:   []operand.Op{mxy, xy},
32457			Outputs:  []operand.Op{xy1},
32458			ISA:      []string{"AVX"},
32459		}, nil
32460	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
32461		return &intrep.Instruction{
32462			Opcode:   "VPUNPCKHDQ",
32463			Operands: []operand.Op{mxy, xy, xy1},
32464			Inputs:   []operand.Op{mxy, xy},
32465			Outputs:  []operand.Op{xy1},
32466			ISA:      []string{"AVX"},
32467		}, nil
32468	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
32469		return &intrep.Instruction{
32470			Opcode:   "VPUNPCKHDQ",
32471			Operands: []operand.Op{mxy, xy, xy1},
32472			Inputs:   []operand.Op{mxy, xy},
32473			Outputs:  []operand.Op{xy1},
32474			ISA:      []string{"AVX2"},
32475		}, nil
32476	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
32477		return &intrep.Instruction{
32478			Opcode:   "VPUNPCKHDQ",
32479			Operands: []operand.Op{mxy, xy, xy1},
32480			Inputs:   []operand.Op{mxy, xy},
32481			Outputs:  []operand.Op{xy1},
32482			ISA:      []string{"AVX2"},
32483		}, nil
32484	}
32485	return nil, errors.New("VPUNPCKHDQ: bad operands")
32486}
32487
32488// VPUNPCKHQDQ: Unpack and Interleave High-Order Quadwords into Double Quadwords.
32489//
32490// Forms:
32491//
32492// 	VPUNPCKHQDQ xmm  xmm xmm
32493// 	VPUNPCKHQDQ m128 xmm xmm
32494// 	VPUNPCKHQDQ ymm  ymm ymm
32495// 	VPUNPCKHQDQ m256 ymm ymm
32496func VPUNPCKHQDQ(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
32497	switch {
32498	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
32499		return &intrep.Instruction{
32500			Opcode:   "VPUNPCKHQDQ",
32501			Operands: []operand.Op{mxy, xy, xy1},
32502			Inputs:   []operand.Op{mxy, xy},
32503			Outputs:  []operand.Op{xy1},
32504			ISA:      []string{"AVX"},
32505		}, nil
32506	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
32507		return &intrep.Instruction{
32508			Opcode:   "VPUNPCKHQDQ",
32509			Operands: []operand.Op{mxy, xy, xy1},
32510			Inputs:   []operand.Op{mxy, xy},
32511			Outputs:  []operand.Op{xy1},
32512			ISA:      []string{"AVX"},
32513		}, nil
32514	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
32515		return &intrep.Instruction{
32516			Opcode:   "VPUNPCKHQDQ",
32517			Operands: []operand.Op{mxy, xy, xy1},
32518			Inputs:   []operand.Op{mxy, xy},
32519			Outputs:  []operand.Op{xy1},
32520			ISA:      []string{"AVX2"},
32521		}, nil
32522	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
32523		return &intrep.Instruction{
32524			Opcode:   "VPUNPCKHQDQ",
32525			Operands: []operand.Op{mxy, xy, xy1},
32526			Inputs:   []operand.Op{mxy, xy},
32527			Outputs:  []operand.Op{xy1},
32528			ISA:      []string{"AVX2"},
32529		}, nil
32530	}
32531	return nil, errors.New("VPUNPCKHQDQ: bad operands")
32532}
32533
32534// VPUNPCKHWD: Unpack and Interleave High-Order Words into Doublewords.
32535//
32536// Forms:
32537//
32538// 	VPUNPCKHWD xmm  xmm xmm
32539// 	VPUNPCKHWD m128 xmm xmm
32540// 	VPUNPCKHWD ymm  ymm ymm
32541// 	VPUNPCKHWD m256 ymm ymm
32542func VPUNPCKHWD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
32543	switch {
32544	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
32545		return &intrep.Instruction{
32546			Opcode:   "VPUNPCKHWD",
32547			Operands: []operand.Op{mxy, xy, xy1},
32548			Inputs:   []operand.Op{mxy, xy},
32549			Outputs:  []operand.Op{xy1},
32550			ISA:      []string{"AVX"},
32551		}, nil
32552	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
32553		return &intrep.Instruction{
32554			Opcode:   "VPUNPCKHWD",
32555			Operands: []operand.Op{mxy, xy, xy1},
32556			Inputs:   []operand.Op{mxy, xy},
32557			Outputs:  []operand.Op{xy1},
32558			ISA:      []string{"AVX"},
32559		}, nil
32560	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
32561		return &intrep.Instruction{
32562			Opcode:   "VPUNPCKHWD",
32563			Operands: []operand.Op{mxy, xy, xy1},
32564			Inputs:   []operand.Op{mxy, xy},
32565			Outputs:  []operand.Op{xy1},
32566			ISA:      []string{"AVX2"},
32567		}, nil
32568	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
32569		return &intrep.Instruction{
32570			Opcode:   "VPUNPCKHWD",
32571			Operands: []operand.Op{mxy, xy, xy1},
32572			Inputs:   []operand.Op{mxy, xy},
32573			Outputs:  []operand.Op{xy1},
32574			ISA:      []string{"AVX2"},
32575		}, nil
32576	}
32577	return nil, errors.New("VPUNPCKHWD: bad operands")
32578}
32579
32580// VPUNPCKLBW: Unpack and Interleave Low-Order Bytes into Words.
32581//
32582// Forms:
32583//
32584// 	VPUNPCKLBW xmm  xmm xmm
32585// 	VPUNPCKLBW m128 xmm xmm
32586// 	VPUNPCKLBW ymm  ymm ymm
32587// 	VPUNPCKLBW m256 ymm ymm
32588func VPUNPCKLBW(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
32589	switch {
32590	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
32591		return &intrep.Instruction{
32592			Opcode:   "VPUNPCKLBW",
32593			Operands: []operand.Op{mxy, xy, xy1},
32594			Inputs:   []operand.Op{mxy, xy},
32595			Outputs:  []operand.Op{xy1},
32596			ISA:      []string{"AVX"},
32597		}, nil
32598	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
32599		return &intrep.Instruction{
32600			Opcode:   "VPUNPCKLBW",
32601			Operands: []operand.Op{mxy, xy, xy1},
32602			Inputs:   []operand.Op{mxy, xy},
32603			Outputs:  []operand.Op{xy1},
32604			ISA:      []string{"AVX"},
32605		}, nil
32606	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
32607		return &intrep.Instruction{
32608			Opcode:   "VPUNPCKLBW",
32609			Operands: []operand.Op{mxy, xy, xy1},
32610			Inputs:   []operand.Op{mxy, xy},
32611			Outputs:  []operand.Op{xy1},
32612			ISA:      []string{"AVX2"},
32613		}, nil
32614	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
32615		return &intrep.Instruction{
32616			Opcode:   "VPUNPCKLBW",
32617			Operands: []operand.Op{mxy, xy, xy1},
32618			Inputs:   []operand.Op{mxy, xy},
32619			Outputs:  []operand.Op{xy1},
32620			ISA:      []string{"AVX2"},
32621		}, nil
32622	}
32623	return nil, errors.New("VPUNPCKLBW: bad operands")
32624}
32625
32626// VPUNPCKLDQ: Unpack and Interleave Low-Order Doublewords into Quadwords.
32627//
32628// Forms:
32629//
32630// 	VPUNPCKLDQ xmm  xmm xmm
32631// 	VPUNPCKLDQ m128 xmm xmm
32632// 	VPUNPCKLDQ ymm  ymm ymm
32633// 	VPUNPCKLDQ m256 ymm ymm
32634func VPUNPCKLDQ(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
32635	switch {
32636	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
32637		return &intrep.Instruction{
32638			Opcode:   "VPUNPCKLDQ",
32639			Operands: []operand.Op{mxy, xy, xy1},
32640			Inputs:   []operand.Op{mxy, xy},
32641			Outputs:  []operand.Op{xy1},
32642			ISA:      []string{"AVX"},
32643		}, nil
32644	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
32645		return &intrep.Instruction{
32646			Opcode:   "VPUNPCKLDQ",
32647			Operands: []operand.Op{mxy, xy, xy1},
32648			Inputs:   []operand.Op{mxy, xy},
32649			Outputs:  []operand.Op{xy1},
32650			ISA:      []string{"AVX"},
32651		}, nil
32652	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
32653		return &intrep.Instruction{
32654			Opcode:   "VPUNPCKLDQ",
32655			Operands: []operand.Op{mxy, xy, xy1},
32656			Inputs:   []operand.Op{mxy, xy},
32657			Outputs:  []operand.Op{xy1},
32658			ISA:      []string{"AVX2"},
32659		}, nil
32660	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
32661		return &intrep.Instruction{
32662			Opcode:   "VPUNPCKLDQ",
32663			Operands: []operand.Op{mxy, xy, xy1},
32664			Inputs:   []operand.Op{mxy, xy},
32665			Outputs:  []operand.Op{xy1},
32666			ISA:      []string{"AVX2"},
32667		}, nil
32668	}
32669	return nil, errors.New("VPUNPCKLDQ: bad operands")
32670}
32671
32672// VPUNPCKLQDQ: Unpack and Interleave Low-Order Quadwords into Double Quadwords.
32673//
32674// Forms:
32675//
32676// 	VPUNPCKLQDQ xmm  xmm xmm
32677// 	VPUNPCKLQDQ m128 xmm xmm
32678// 	VPUNPCKLQDQ ymm  ymm ymm
32679// 	VPUNPCKLQDQ m256 ymm ymm
32680func VPUNPCKLQDQ(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
32681	switch {
32682	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
32683		return &intrep.Instruction{
32684			Opcode:   "VPUNPCKLQDQ",
32685			Operands: []operand.Op{mxy, xy, xy1},
32686			Inputs:   []operand.Op{mxy, xy},
32687			Outputs:  []operand.Op{xy1},
32688			ISA:      []string{"AVX"},
32689		}, nil
32690	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
32691		return &intrep.Instruction{
32692			Opcode:   "VPUNPCKLQDQ",
32693			Operands: []operand.Op{mxy, xy, xy1},
32694			Inputs:   []operand.Op{mxy, xy},
32695			Outputs:  []operand.Op{xy1},
32696			ISA:      []string{"AVX"},
32697		}, nil
32698	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
32699		return &intrep.Instruction{
32700			Opcode:   "VPUNPCKLQDQ",
32701			Operands: []operand.Op{mxy, xy, xy1},
32702			Inputs:   []operand.Op{mxy, xy},
32703			Outputs:  []operand.Op{xy1},
32704			ISA:      []string{"AVX2"},
32705		}, nil
32706	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
32707		return &intrep.Instruction{
32708			Opcode:   "VPUNPCKLQDQ",
32709			Operands: []operand.Op{mxy, xy, xy1},
32710			Inputs:   []operand.Op{mxy, xy},
32711			Outputs:  []operand.Op{xy1},
32712			ISA:      []string{"AVX2"},
32713		}, nil
32714	}
32715	return nil, errors.New("VPUNPCKLQDQ: bad operands")
32716}
32717
32718// VPUNPCKLWD: Unpack and Interleave Low-Order Words into Doublewords.
32719//
32720// Forms:
32721//
32722// 	VPUNPCKLWD xmm  xmm xmm
32723// 	VPUNPCKLWD m128 xmm xmm
32724// 	VPUNPCKLWD ymm  ymm ymm
32725// 	VPUNPCKLWD m256 ymm ymm
32726func VPUNPCKLWD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
32727	switch {
32728	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
32729		return &intrep.Instruction{
32730			Opcode:   "VPUNPCKLWD",
32731			Operands: []operand.Op{mxy, xy, xy1},
32732			Inputs:   []operand.Op{mxy, xy},
32733			Outputs:  []operand.Op{xy1},
32734			ISA:      []string{"AVX"},
32735		}, nil
32736	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
32737		return &intrep.Instruction{
32738			Opcode:   "VPUNPCKLWD",
32739			Operands: []operand.Op{mxy, xy, xy1},
32740			Inputs:   []operand.Op{mxy, xy},
32741			Outputs:  []operand.Op{xy1},
32742			ISA:      []string{"AVX"},
32743		}, nil
32744	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
32745		return &intrep.Instruction{
32746			Opcode:   "VPUNPCKLWD",
32747			Operands: []operand.Op{mxy, xy, xy1},
32748			Inputs:   []operand.Op{mxy, xy},
32749			Outputs:  []operand.Op{xy1},
32750			ISA:      []string{"AVX2"},
32751		}, nil
32752	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
32753		return &intrep.Instruction{
32754			Opcode:   "VPUNPCKLWD",
32755			Operands: []operand.Op{mxy, xy, xy1},
32756			Inputs:   []operand.Op{mxy, xy},
32757			Outputs:  []operand.Op{xy1},
32758			ISA:      []string{"AVX2"},
32759		}, nil
32760	}
32761	return nil, errors.New("VPUNPCKLWD: bad operands")
32762}
32763
32764// VPXOR: Packed Bitwise Logical Exclusive OR.
32765//
32766// Forms:
32767//
32768// 	VPXOR xmm  xmm xmm
32769// 	VPXOR m128 xmm xmm
32770// 	VPXOR ymm  ymm ymm
32771// 	VPXOR m256 ymm ymm
32772func VPXOR(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
32773	switch {
32774	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
32775		return &intrep.Instruction{
32776			Opcode:           "VPXOR",
32777			Operands:         []operand.Op{mxy, xy, xy1},
32778			Inputs:           []operand.Op{mxy, xy},
32779			Outputs:          []operand.Op{xy1},
32780			ISA:              []string{"AVX"},
32781			CancellingInputs: true,
32782		}, nil
32783	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
32784		return &intrep.Instruction{
32785			Opcode:   "VPXOR",
32786			Operands: []operand.Op{mxy, xy, xy1},
32787			Inputs:   []operand.Op{mxy, xy},
32788			Outputs:  []operand.Op{xy1},
32789			ISA:      []string{"AVX"},
32790		}, nil
32791	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
32792		return &intrep.Instruction{
32793			Opcode:           "VPXOR",
32794			Operands:         []operand.Op{mxy, xy, xy1},
32795			Inputs:           []operand.Op{mxy, xy},
32796			Outputs:          []operand.Op{xy1},
32797			ISA:              []string{"AVX2"},
32798			CancellingInputs: true,
32799		}, nil
32800	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
32801		return &intrep.Instruction{
32802			Opcode:   "VPXOR",
32803			Operands: []operand.Op{mxy, xy, xy1},
32804			Inputs:   []operand.Op{mxy, xy},
32805			Outputs:  []operand.Op{xy1},
32806			ISA:      []string{"AVX2"},
32807		}, nil
32808	}
32809	return nil, errors.New("VPXOR: bad operands")
32810}
32811
32812// VRCPPS: Compute Approximate Reciprocals of Packed Single-Precision Floating-Point Values.
32813//
32814// Forms:
32815//
32816// 	VRCPPS xmm  xmm
32817// 	VRCPPS m128 xmm
32818// 	VRCPPS ymm  ymm
32819// 	VRCPPS m256 ymm
32820func VRCPPS(mxy, xy operand.Op) (*intrep.Instruction, error) {
32821	switch {
32822	case operand.IsXMM(mxy) && operand.IsXMM(xy):
32823		return &intrep.Instruction{
32824			Opcode:   "VRCPPS",
32825			Operands: []operand.Op{mxy, xy},
32826			Inputs:   []operand.Op{mxy},
32827			Outputs:  []operand.Op{xy},
32828			ISA:      []string{"AVX"},
32829		}, nil
32830	case operand.IsM128(mxy) && operand.IsXMM(xy):
32831		return &intrep.Instruction{
32832			Opcode:   "VRCPPS",
32833			Operands: []operand.Op{mxy, xy},
32834			Inputs:   []operand.Op{mxy},
32835			Outputs:  []operand.Op{xy},
32836			ISA:      []string{"AVX"},
32837		}, nil
32838	case operand.IsYMM(mxy) && operand.IsYMM(xy):
32839		return &intrep.Instruction{
32840			Opcode:   "VRCPPS",
32841			Operands: []operand.Op{mxy, xy},
32842			Inputs:   []operand.Op{mxy},
32843			Outputs:  []operand.Op{xy},
32844			ISA:      []string{"AVX"},
32845		}, nil
32846	case operand.IsM256(mxy) && operand.IsYMM(xy):
32847		return &intrep.Instruction{
32848			Opcode:   "VRCPPS",
32849			Operands: []operand.Op{mxy, xy},
32850			Inputs:   []operand.Op{mxy},
32851			Outputs:  []operand.Op{xy},
32852			ISA:      []string{"AVX"},
32853		}, nil
32854	}
32855	return nil, errors.New("VRCPPS: bad operands")
32856}
32857
32858// VRCPSS: Compute Approximate Reciprocal of Scalar Single-Precision Floating-Point Values.
32859//
32860// Forms:
32861//
32862// 	VRCPSS xmm xmm xmm
32863// 	VRCPSS m32 xmm xmm
32864func VRCPSS(mx, x, x1 operand.Op) (*intrep.Instruction, error) {
32865	switch {
32866	case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
32867		return &intrep.Instruction{
32868			Opcode:   "VRCPSS",
32869			Operands: []operand.Op{mx, x, x1},
32870			Inputs:   []operand.Op{mx, x},
32871			Outputs:  []operand.Op{x1},
32872			ISA:      []string{"AVX"},
32873		}, nil
32874	case operand.IsM32(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
32875		return &intrep.Instruction{
32876			Opcode:   "VRCPSS",
32877			Operands: []operand.Op{mx, x, x1},
32878			Inputs:   []operand.Op{mx, x},
32879			Outputs:  []operand.Op{x1},
32880			ISA:      []string{"AVX"},
32881		}, nil
32882	}
32883	return nil, errors.New("VRCPSS: bad operands")
32884}
32885
32886// VROUNDPD: Round Packed Double Precision Floating-Point Values.
32887//
32888// Forms:
32889//
32890// 	VROUNDPD imm8 xmm  xmm
32891// 	VROUNDPD imm8 m128 xmm
32892// 	VROUNDPD imm8 ymm  ymm
32893// 	VROUNDPD imm8 m256 ymm
32894func VROUNDPD(i, mxy, xy operand.Op) (*intrep.Instruction, error) {
32895	switch {
32896	case operand.IsIMM8(i) && operand.IsXMM(mxy) && operand.IsXMM(xy):
32897		return &intrep.Instruction{
32898			Opcode:   "VROUNDPD",
32899			Operands: []operand.Op{i, mxy, xy},
32900			Inputs:   []operand.Op{mxy},
32901			Outputs:  []operand.Op{xy},
32902			ISA:      []string{"AVX"},
32903		}, nil
32904	case operand.IsIMM8(i) && operand.IsM128(mxy) && operand.IsXMM(xy):
32905		return &intrep.Instruction{
32906			Opcode:   "VROUNDPD",
32907			Operands: []operand.Op{i, mxy, xy},
32908			Inputs:   []operand.Op{mxy},
32909			Outputs:  []operand.Op{xy},
32910			ISA:      []string{"AVX"},
32911		}, nil
32912	case operand.IsIMM8(i) && operand.IsYMM(mxy) && operand.IsYMM(xy):
32913		return &intrep.Instruction{
32914			Opcode:   "VROUNDPD",
32915			Operands: []operand.Op{i, mxy, xy},
32916			Inputs:   []operand.Op{mxy},
32917			Outputs:  []operand.Op{xy},
32918			ISA:      []string{"AVX"},
32919		}, nil
32920	case operand.IsIMM8(i) && operand.IsM256(mxy) && operand.IsYMM(xy):
32921		return &intrep.Instruction{
32922			Opcode:   "VROUNDPD",
32923			Operands: []operand.Op{i, mxy, xy},
32924			Inputs:   []operand.Op{mxy},
32925			Outputs:  []operand.Op{xy},
32926			ISA:      []string{"AVX"},
32927		}, nil
32928	}
32929	return nil, errors.New("VROUNDPD: bad operands")
32930}
32931
32932// VROUNDPS: Round Packed Single Precision Floating-Point Values.
32933//
32934// Forms:
32935//
32936// 	VROUNDPS imm8 xmm  xmm
32937// 	VROUNDPS imm8 m128 xmm
32938// 	VROUNDPS imm8 ymm  ymm
32939// 	VROUNDPS imm8 m256 ymm
32940func VROUNDPS(i, mxy, xy operand.Op) (*intrep.Instruction, error) {
32941	switch {
32942	case operand.IsIMM8(i) && operand.IsXMM(mxy) && operand.IsXMM(xy):
32943		return &intrep.Instruction{
32944			Opcode:   "VROUNDPS",
32945			Operands: []operand.Op{i, mxy, xy},
32946			Inputs:   []operand.Op{mxy},
32947			Outputs:  []operand.Op{xy},
32948			ISA:      []string{"AVX"},
32949		}, nil
32950	case operand.IsIMM8(i) && operand.IsM128(mxy) && operand.IsXMM(xy):
32951		return &intrep.Instruction{
32952			Opcode:   "VROUNDPS",
32953			Operands: []operand.Op{i, mxy, xy},
32954			Inputs:   []operand.Op{mxy},
32955			Outputs:  []operand.Op{xy},
32956			ISA:      []string{"AVX"},
32957		}, nil
32958	case operand.IsIMM8(i) && operand.IsYMM(mxy) && operand.IsYMM(xy):
32959		return &intrep.Instruction{
32960			Opcode:   "VROUNDPS",
32961			Operands: []operand.Op{i, mxy, xy},
32962			Inputs:   []operand.Op{mxy},
32963			Outputs:  []operand.Op{xy},
32964			ISA:      []string{"AVX"},
32965		}, nil
32966	case operand.IsIMM8(i) && operand.IsM256(mxy) && operand.IsYMM(xy):
32967		return &intrep.Instruction{
32968			Opcode:   "VROUNDPS",
32969			Operands: []operand.Op{i, mxy, xy},
32970			Inputs:   []operand.Op{mxy},
32971			Outputs:  []operand.Op{xy},
32972			ISA:      []string{"AVX"},
32973		}, nil
32974	}
32975	return nil, errors.New("VROUNDPS: bad operands")
32976}
32977
32978// VROUNDSD: Round Scalar Double Precision Floating-Point Values.
32979//
32980// Forms:
32981//
32982// 	VROUNDSD imm8 xmm xmm xmm
32983// 	VROUNDSD imm8 m64 xmm xmm
32984func VROUNDSD(i, mx, x, x1 operand.Op) (*intrep.Instruction, error) {
32985	switch {
32986	case operand.IsIMM8(i) && operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
32987		return &intrep.Instruction{
32988			Opcode:   "VROUNDSD",
32989			Operands: []operand.Op{i, mx, x, x1},
32990			Inputs:   []operand.Op{mx, x},
32991			Outputs:  []operand.Op{x1},
32992			ISA:      []string{"AVX"},
32993		}, nil
32994	case operand.IsIMM8(i) && operand.IsM64(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
32995		return &intrep.Instruction{
32996			Opcode:   "VROUNDSD",
32997			Operands: []operand.Op{i, mx, x, x1},
32998			Inputs:   []operand.Op{mx, x},
32999			Outputs:  []operand.Op{x1},
33000			ISA:      []string{"AVX"},
33001		}, nil
33002	}
33003	return nil, errors.New("VROUNDSD: bad operands")
33004}
33005
33006// VROUNDSS: Round Scalar Single Precision Floating-Point Values.
33007//
33008// Forms:
33009//
33010// 	VROUNDSS imm8 xmm xmm xmm
33011// 	VROUNDSS imm8 m32 xmm xmm
33012func VROUNDSS(i, mx, x, x1 operand.Op) (*intrep.Instruction, error) {
33013	switch {
33014	case operand.IsIMM8(i) && operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
33015		return &intrep.Instruction{
33016			Opcode:   "VROUNDSS",
33017			Operands: []operand.Op{i, mx, x, x1},
33018			Inputs:   []operand.Op{mx, x},
33019			Outputs:  []operand.Op{x1},
33020			ISA:      []string{"AVX"},
33021		}, nil
33022	case operand.IsIMM8(i) && operand.IsM32(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
33023		return &intrep.Instruction{
33024			Opcode:   "VROUNDSS",
33025			Operands: []operand.Op{i, mx, x, x1},
33026			Inputs:   []operand.Op{mx, x},
33027			Outputs:  []operand.Op{x1},
33028			ISA:      []string{"AVX"},
33029		}, nil
33030	}
33031	return nil, errors.New("VROUNDSS: bad operands")
33032}
33033
33034// VRSQRTPS: Compute Reciprocals of Square Roots of Packed Single-Precision Floating-Point Values.
33035//
33036// Forms:
33037//
33038// 	VRSQRTPS xmm  xmm
33039// 	VRSQRTPS m128 xmm
33040// 	VRSQRTPS ymm  ymm
33041// 	VRSQRTPS m256 ymm
33042func VRSQRTPS(mxy, xy operand.Op) (*intrep.Instruction, error) {
33043	switch {
33044	case operand.IsXMM(mxy) && operand.IsXMM(xy):
33045		return &intrep.Instruction{
33046			Opcode:   "VRSQRTPS",
33047			Operands: []operand.Op{mxy, xy},
33048			Inputs:   []operand.Op{mxy},
33049			Outputs:  []operand.Op{xy},
33050			ISA:      []string{"AVX"},
33051		}, nil
33052	case operand.IsM128(mxy) && operand.IsXMM(xy):
33053		return &intrep.Instruction{
33054			Opcode:   "VRSQRTPS",
33055			Operands: []operand.Op{mxy, xy},
33056			Inputs:   []operand.Op{mxy},
33057			Outputs:  []operand.Op{xy},
33058			ISA:      []string{"AVX"},
33059		}, nil
33060	case operand.IsYMM(mxy) && operand.IsYMM(xy):
33061		return &intrep.Instruction{
33062			Opcode:   "VRSQRTPS",
33063			Operands: []operand.Op{mxy, xy},
33064			Inputs:   []operand.Op{mxy},
33065			Outputs:  []operand.Op{xy},
33066			ISA:      []string{"AVX"},
33067		}, nil
33068	case operand.IsM256(mxy) && operand.IsYMM(xy):
33069		return &intrep.Instruction{
33070			Opcode:   "VRSQRTPS",
33071			Operands: []operand.Op{mxy, xy},
33072			Inputs:   []operand.Op{mxy},
33073			Outputs:  []operand.Op{xy},
33074			ISA:      []string{"AVX"},
33075		}, nil
33076	}
33077	return nil, errors.New("VRSQRTPS: bad operands")
33078}
33079
33080// VRSQRTSS: Compute Reciprocal of Square Root of Scalar Single-Precision Floating-Point Value.
33081//
33082// Forms:
33083//
33084// 	VRSQRTSS xmm xmm xmm
33085// 	VRSQRTSS m32 xmm xmm
33086func VRSQRTSS(mx, x, x1 operand.Op) (*intrep.Instruction, error) {
33087	switch {
33088	case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
33089		return &intrep.Instruction{
33090			Opcode:   "VRSQRTSS",
33091			Operands: []operand.Op{mx, x, x1},
33092			Inputs:   []operand.Op{mx, x},
33093			Outputs:  []operand.Op{x1},
33094			ISA:      []string{"AVX"},
33095		}, nil
33096	case operand.IsM32(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
33097		return &intrep.Instruction{
33098			Opcode:   "VRSQRTSS",
33099			Operands: []operand.Op{mx, x, x1},
33100			Inputs:   []operand.Op{mx, x},
33101			Outputs:  []operand.Op{x1},
33102			ISA:      []string{"AVX"},
33103		}, nil
33104	}
33105	return nil, errors.New("VRSQRTSS: bad operands")
33106}
33107
33108// VSHUFPD: Shuffle Packed Double-Precision Floating-Point Values.
33109//
33110// Forms:
33111//
33112// 	VSHUFPD imm8 xmm  xmm xmm
33113// 	VSHUFPD imm8 m128 xmm xmm
33114// 	VSHUFPD imm8 ymm  ymm ymm
33115// 	VSHUFPD imm8 m256 ymm ymm
33116func VSHUFPD(i, mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
33117	switch {
33118	case operand.IsIMM8(i) && operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
33119		return &intrep.Instruction{
33120			Opcode:   "VSHUFPD",
33121			Operands: []operand.Op{i, mxy, xy, xy1},
33122			Inputs:   []operand.Op{mxy, xy},
33123			Outputs:  []operand.Op{xy1},
33124			ISA:      []string{"AVX"},
33125		}, nil
33126	case operand.IsIMM8(i) && operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
33127		return &intrep.Instruction{
33128			Opcode:   "VSHUFPD",
33129			Operands: []operand.Op{i, mxy, xy, xy1},
33130			Inputs:   []operand.Op{mxy, xy},
33131			Outputs:  []operand.Op{xy1},
33132			ISA:      []string{"AVX"},
33133		}, nil
33134	case operand.IsIMM8(i) && operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
33135		return &intrep.Instruction{
33136			Opcode:   "VSHUFPD",
33137			Operands: []operand.Op{i, mxy, xy, xy1},
33138			Inputs:   []operand.Op{mxy, xy},
33139			Outputs:  []operand.Op{xy1},
33140			ISA:      []string{"AVX"},
33141		}, nil
33142	case operand.IsIMM8(i) && operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
33143		return &intrep.Instruction{
33144			Opcode:   "VSHUFPD",
33145			Operands: []operand.Op{i, mxy, xy, xy1},
33146			Inputs:   []operand.Op{mxy, xy},
33147			Outputs:  []operand.Op{xy1},
33148			ISA:      []string{"AVX"},
33149		}, nil
33150	}
33151	return nil, errors.New("VSHUFPD: bad operands")
33152}
33153
33154// VSHUFPS: Shuffle Packed Single-Precision Floating-Point Values.
33155//
33156// Forms:
33157//
33158// 	VSHUFPS imm8 xmm  xmm xmm
33159// 	VSHUFPS imm8 m128 xmm xmm
33160// 	VSHUFPS imm8 ymm  ymm ymm
33161// 	VSHUFPS imm8 m256 ymm ymm
33162func VSHUFPS(i, mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
33163	switch {
33164	case operand.IsIMM8(i) && operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
33165		return &intrep.Instruction{
33166			Opcode:   "VSHUFPS",
33167			Operands: []operand.Op{i, mxy, xy, xy1},
33168			Inputs:   []operand.Op{mxy, xy},
33169			Outputs:  []operand.Op{xy1},
33170			ISA:      []string{"AVX"},
33171		}, nil
33172	case operand.IsIMM8(i) && operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
33173		return &intrep.Instruction{
33174			Opcode:   "VSHUFPS",
33175			Operands: []operand.Op{i, mxy, xy, xy1},
33176			Inputs:   []operand.Op{mxy, xy},
33177			Outputs:  []operand.Op{xy1},
33178			ISA:      []string{"AVX"},
33179		}, nil
33180	case operand.IsIMM8(i) && operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
33181		return &intrep.Instruction{
33182			Opcode:   "VSHUFPS",
33183			Operands: []operand.Op{i, mxy, xy, xy1},
33184			Inputs:   []operand.Op{mxy, xy},
33185			Outputs:  []operand.Op{xy1},
33186			ISA:      []string{"AVX"},
33187		}, nil
33188	case operand.IsIMM8(i) && operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
33189		return &intrep.Instruction{
33190			Opcode:   "VSHUFPS",
33191			Operands: []operand.Op{i, mxy, xy, xy1},
33192			Inputs:   []operand.Op{mxy, xy},
33193			Outputs:  []operand.Op{xy1},
33194			ISA:      []string{"AVX"},
33195		}, nil
33196	}
33197	return nil, errors.New("VSHUFPS: bad operands")
33198}
33199
33200// VSQRTPD: Compute Square Roots of Packed Double-Precision Floating-Point Values.
33201//
33202// Forms:
33203//
33204// 	VSQRTPD xmm  xmm
33205// 	VSQRTPD m128 xmm
33206// 	VSQRTPD ymm  ymm
33207// 	VSQRTPD m256 ymm
33208func VSQRTPD(mxy, xy operand.Op) (*intrep.Instruction, error) {
33209	switch {
33210	case operand.IsXMM(mxy) && operand.IsXMM(xy):
33211		return &intrep.Instruction{
33212			Opcode:   "VSQRTPD",
33213			Operands: []operand.Op{mxy, xy},
33214			Inputs:   []operand.Op{mxy},
33215			Outputs:  []operand.Op{xy},
33216			ISA:      []string{"AVX"},
33217		}, nil
33218	case operand.IsM128(mxy) && operand.IsXMM(xy):
33219		return &intrep.Instruction{
33220			Opcode:   "VSQRTPD",
33221			Operands: []operand.Op{mxy, xy},
33222			Inputs:   []operand.Op{mxy},
33223			Outputs:  []operand.Op{xy},
33224			ISA:      []string{"AVX"},
33225		}, nil
33226	case operand.IsYMM(mxy) && operand.IsYMM(xy):
33227		return &intrep.Instruction{
33228			Opcode:   "VSQRTPD",
33229			Operands: []operand.Op{mxy, xy},
33230			Inputs:   []operand.Op{mxy},
33231			Outputs:  []operand.Op{xy},
33232			ISA:      []string{"AVX"},
33233		}, nil
33234	case operand.IsM256(mxy) && operand.IsYMM(xy):
33235		return &intrep.Instruction{
33236			Opcode:   "VSQRTPD",
33237			Operands: []operand.Op{mxy, xy},
33238			Inputs:   []operand.Op{mxy},
33239			Outputs:  []operand.Op{xy},
33240			ISA:      []string{"AVX"},
33241		}, nil
33242	}
33243	return nil, errors.New("VSQRTPD: bad operands")
33244}
33245
33246// VSQRTPS: Compute Square Roots of Packed Single-Precision Floating-Point Values.
33247//
33248// Forms:
33249//
33250// 	VSQRTPS xmm  xmm
33251// 	VSQRTPS m128 xmm
33252// 	VSQRTPS ymm  ymm
33253// 	VSQRTPS m256 ymm
33254func VSQRTPS(mxy, xy operand.Op) (*intrep.Instruction, error) {
33255	switch {
33256	case operand.IsXMM(mxy) && operand.IsXMM(xy):
33257		return &intrep.Instruction{
33258			Opcode:   "VSQRTPS",
33259			Operands: []operand.Op{mxy, xy},
33260			Inputs:   []operand.Op{mxy},
33261			Outputs:  []operand.Op{xy},
33262			ISA:      []string{"AVX"},
33263		}, nil
33264	case operand.IsM128(mxy) && operand.IsXMM(xy):
33265		return &intrep.Instruction{
33266			Opcode:   "VSQRTPS",
33267			Operands: []operand.Op{mxy, xy},
33268			Inputs:   []operand.Op{mxy},
33269			Outputs:  []operand.Op{xy},
33270			ISA:      []string{"AVX"},
33271		}, nil
33272	case operand.IsYMM(mxy) && operand.IsYMM(xy):
33273		return &intrep.Instruction{
33274			Opcode:   "VSQRTPS",
33275			Operands: []operand.Op{mxy, xy},
33276			Inputs:   []operand.Op{mxy},
33277			Outputs:  []operand.Op{xy},
33278			ISA:      []string{"AVX"},
33279		}, nil
33280	case operand.IsM256(mxy) && operand.IsYMM(xy):
33281		return &intrep.Instruction{
33282			Opcode:   "VSQRTPS",
33283			Operands: []operand.Op{mxy, xy},
33284			Inputs:   []operand.Op{mxy},
33285			Outputs:  []operand.Op{xy},
33286			ISA:      []string{"AVX"},
33287		}, nil
33288	}
33289	return nil, errors.New("VSQRTPS: bad operands")
33290}
33291
33292// VSQRTSD: Compute Square Root of Scalar Double-Precision Floating-Point Value.
33293//
33294// Forms:
33295//
33296// 	VSQRTSD xmm xmm xmm
33297// 	VSQRTSD m64 xmm xmm
33298func VSQRTSD(mx, x, x1 operand.Op) (*intrep.Instruction, error) {
33299	switch {
33300	case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
33301		return &intrep.Instruction{
33302			Opcode:   "VSQRTSD",
33303			Operands: []operand.Op{mx, x, x1},
33304			Inputs:   []operand.Op{mx, x},
33305			Outputs:  []operand.Op{x1},
33306			ISA:      []string{"AVX"},
33307		}, nil
33308	case operand.IsM64(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
33309		return &intrep.Instruction{
33310			Opcode:   "VSQRTSD",
33311			Operands: []operand.Op{mx, x, x1},
33312			Inputs:   []operand.Op{mx, x},
33313			Outputs:  []operand.Op{x1},
33314			ISA:      []string{"AVX"},
33315		}, nil
33316	}
33317	return nil, errors.New("VSQRTSD: bad operands")
33318}
33319
33320// VSQRTSS: Compute Square Root of Scalar Single-Precision Floating-Point Value.
33321//
33322// Forms:
33323//
33324// 	VSQRTSS xmm xmm xmm
33325// 	VSQRTSS m32 xmm xmm
33326func VSQRTSS(mx, x, x1 operand.Op) (*intrep.Instruction, error) {
33327	switch {
33328	case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
33329		return &intrep.Instruction{
33330			Opcode:   "VSQRTSS",
33331			Operands: []operand.Op{mx, x, x1},
33332			Inputs:   []operand.Op{mx, x},
33333			Outputs:  []operand.Op{x1},
33334			ISA:      []string{"AVX"},
33335		}, nil
33336	case operand.IsM32(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
33337		return &intrep.Instruction{
33338			Opcode:   "VSQRTSS",
33339			Operands: []operand.Op{mx, x, x1},
33340			Inputs:   []operand.Op{mx, x},
33341			Outputs:  []operand.Op{x1},
33342			ISA:      []string{"AVX"},
33343		}, nil
33344	}
33345	return nil, errors.New("VSQRTSS: bad operands")
33346}
33347
33348// VSTMXCSR: Store MXCSR Register State.
33349//
33350// Forms:
33351//
33352// 	VSTMXCSR m32
33353func VSTMXCSR(m operand.Op) (*intrep.Instruction, error) {
33354	switch {
33355	case operand.IsM32(m):
33356		return &intrep.Instruction{
33357			Opcode:   "VSTMXCSR",
33358			Operands: []operand.Op{m},
33359			Inputs:   []operand.Op{},
33360			Outputs:  []operand.Op{m},
33361			ISA:      []string{"AVX"},
33362		}, nil
33363	}
33364	return nil, errors.New("VSTMXCSR: bad operands")
33365}
33366
33367// VSUBPD: Subtract Packed Double-Precision Floating-Point Values.
33368//
33369// Forms:
33370//
33371// 	VSUBPD xmm  xmm xmm
33372// 	VSUBPD m128 xmm xmm
33373// 	VSUBPD ymm  ymm ymm
33374// 	VSUBPD m256 ymm ymm
33375func VSUBPD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
33376	switch {
33377	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
33378		return &intrep.Instruction{
33379			Opcode:   "VSUBPD",
33380			Operands: []operand.Op{mxy, xy, xy1},
33381			Inputs:   []operand.Op{mxy, xy},
33382			Outputs:  []operand.Op{xy1},
33383			ISA:      []string{"AVX"},
33384		}, nil
33385	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
33386		return &intrep.Instruction{
33387			Opcode:   "VSUBPD",
33388			Operands: []operand.Op{mxy, xy, xy1},
33389			Inputs:   []operand.Op{mxy, xy},
33390			Outputs:  []operand.Op{xy1},
33391			ISA:      []string{"AVX"},
33392		}, nil
33393	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
33394		return &intrep.Instruction{
33395			Opcode:   "VSUBPD",
33396			Operands: []operand.Op{mxy, xy, xy1},
33397			Inputs:   []operand.Op{mxy, xy},
33398			Outputs:  []operand.Op{xy1},
33399			ISA:      []string{"AVX"},
33400		}, nil
33401	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
33402		return &intrep.Instruction{
33403			Opcode:   "VSUBPD",
33404			Operands: []operand.Op{mxy, xy, xy1},
33405			Inputs:   []operand.Op{mxy, xy},
33406			Outputs:  []operand.Op{xy1},
33407			ISA:      []string{"AVX"},
33408		}, nil
33409	}
33410	return nil, errors.New("VSUBPD: bad operands")
33411}
33412
33413// VSUBPS: Subtract Packed Single-Precision Floating-Point Values.
33414//
33415// Forms:
33416//
33417// 	VSUBPS xmm  xmm xmm
33418// 	VSUBPS m128 xmm xmm
33419// 	VSUBPS ymm  ymm ymm
33420// 	VSUBPS m256 ymm ymm
33421func VSUBPS(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
33422	switch {
33423	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
33424		return &intrep.Instruction{
33425			Opcode:   "VSUBPS",
33426			Operands: []operand.Op{mxy, xy, xy1},
33427			Inputs:   []operand.Op{mxy, xy},
33428			Outputs:  []operand.Op{xy1},
33429			ISA:      []string{"AVX"},
33430		}, nil
33431	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
33432		return &intrep.Instruction{
33433			Opcode:   "VSUBPS",
33434			Operands: []operand.Op{mxy, xy, xy1},
33435			Inputs:   []operand.Op{mxy, xy},
33436			Outputs:  []operand.Op{xy1},
33437			ISA:      []string{"AVX"},
33438		}, nil
33439	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
33440		return &intrep.Instruction{
33441			Opcode:   "VSUBPS",
33442			Operands: []operand.Op{mxy, xy, xy1},
33443			Inputs:   []operand.Op{mxy, xy},
33444			Outputs:  []operand.Op{xy1},
33445			ISA:      []string{"AVX"},
33446		}, nil
33447	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
33448		return &intrep.Instruction{
33449			Opcode:   "VSUBPS",
33450			Operands: []operand.Op{mxy, xy, xy1},
33451			Inputs:   []operand.Op{mxy, xy},
33452			Outputs:  []operand.Op{xy1},
33453			ISA:      []string{"AVX"},
33454		}, nil
33455	}
33456	return nil, errors.New("VSUBPS: bad operands")
33457}
33458
33459// VSUBSD: Subtract Scalar Double-Precision Floating-Point Values.
33460//
33461// Forms:
33462//
33463// 	VSUBSD xmm xmm xmm
33464// 	VSUBSD m64 xmm xmm
33465func VSUBSD(mx, x, x1 operand.Op) (*intrep.Instruction, error) {
33466	switch {
33467	case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
33468		return &intrep.Instruction{
33469			Opcode:   "VSUBSD",
33470			Operands: []operand.Op{mx, x, x1},
33471			Inputs:   []operand.Op{mx, x},
33472			Outputs:  []operand.Op{x1},
33473			ISA:      []string{"AVX"},
33474		}, nil
33475	case operand.IsM64(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
33476		return &intrep.Instruction{
33477			Opcode:   "VSUBSD",
33478			Operands: []operand.Op{mx, x, x1},
33479			Inputs:   []operand.Op{mx, x},
33480			Outputs:  []operand.Op{x1},
33481			ISA:      []string{"AVX"},
33482		}, nil
33483	}
33484	return nil, errors.New("VSUBSD: bad operands")
33485}
33486
33487// VSUBSS: Subtract Scalar Single-Precision Floating-Point Values.
33488//
33489// Forms:
33490//
33491// 	VSUBSS xmm xmm xmm
33492// 	VSUBSS m32 xmm xmm
33493func VSUBSS(mx, x, x1 operand.Op) (*intrep.Instruction, error) {
33494	switch {
33495	case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
33496		return &intrep.Instruction{
33497			Opcode:   "VSUBSS",
33498			Operands: []operand.Op{mx, x, x1},
33499			Inputs:   []operand.Op{mx, x},
33500			Outputs:  []operand.Op{x1},
33501			ISA:      []string{"AVX"},
33502		}, nil
33503	case operand.IsM32(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
33504		return &intrep.Instruction{
33505			Opcode:   "VSUBSS",
33506			Operands: []operand.Op{mx, x, x1},
33507			Inputs:   []operand.Op{mx, x},
33508			Outputs:  []operand.Op{x1},
33509			ISA:      []string{"AVX"},
33510		}, nil
33511	}
33512	return nil, errors.New("VSUBSS: bad operands")
33513}
33514
33515// VTESTPD: Packed Double-Precision Floating-Point Bit Test.
33516//
33517// Forms:
33518//
33519// 	VTESTPD xmm  xmm
33520// 	VTESTPD m128 xmm
33521// 	VTESTPD ymm  ymm
33522// 	VTESTPD m256 ymm
33523func VTESTPD(mxy, xy operand.Op) (*intrep.Instruction, error) {
33524	switch {
33525	case operand.IsXMM(mxy) && operand.IsXMM(xy):
33526		return &intrep.Instruction{
33527			Opcode:   "VTESTPD",
33528			Operands: []operand.Op{mxy, xy},
33529			Inputs:   []operand.Op{mxy, xy},
33530			Outputs:  []operand.Op{},
33531			ISA:      []string{"AVX"},
33532		}, nil
33533	case operand.IsM128(mxy) && operand.IsXMM(xy):
33534		return &intrep.Instruction{
33535			Opcode:   "VTESTPD",
33536			Operands: []operand.Op{mxy, xy},
33537			Inputs:   []operand.Op{mxy, xy},
33538			Outputs:  []operand.Op{},
33539			ISA:      []string{"AVX"},
33540		}, nil
33541	case operand.IsYMM(mxy) && operand.IsYMM(xy):
33542		return &intrep.Instruction{
33543			Opcode:   "VTESTPD",
33544			Operands: []operand.Op{mxy, xy},
33545			Inputs:   []operand.Op{mxy, xy},
33546			Outputs:  []operand.Op{},
33547			ISA:      []string{"AVX"},
33548		}, nil
33549	case operand.IsM256(mxy) && operand.IsYMM(xy):
33550		return &intrep.Instruction{
33551			Opcode:   "VTESTPD",
33552			Operands: []operand.Op{mxy, xy},
33553			Inputs:   []operand.Op{mxy, xy},
33554			Outputs:  []operand.Op{},
33555			ISA:      []string{"AVX"},
33556		}, nil
33557	}
33558	return nil, errors.New("VTESTPD: bad operands")
33559}
33560
33561// VTESTPS: Packed Single-Precision Floating-Point Bit Test.
33562//
33563// Forms:
33564//
33565// 	VTESTPS xmm  xmm
33566// 	VTESTPS m128 xmm
33567// 	VTESTPS ymm  ymm
33568// 	VTESTPS m256 ymm
33569func VTESTPS(mxy, xy operand.Op) (*intrep.Instruction, error) {
33570	switch {
33571	case operand.IsXMM(mxy) && operand.IsXMM(xy):
33572		return &intrep.Instruction{
33573			Opcode:   "VTESTPS",
33574			Operands: []operand.Op{mxy, xy},
33575			Inputs:   []operand.Op{mxy, xy},
33576			Outputs:  []operand.Op{},
33577			ISA:      []string{"AVX"},
33578		}, nil
33579	case operand.IsM128(mxy) && operand.IsXMM(xy):
33580		return &intrep.Instruction{
33581			Opcode:   "VTESTPS",
33582			Operands: []operand.Op{mxy, xy},
33583			Inputs:   []operand.Op{mxy, xy},
33584			Outputs:  []operand.Op{},
33585			ISA:      []string{"AVX"},
33586		}, nil
33587	case operand.IsYMM(mxy) && operand.IsYMM(xy):
33588		return &intrep.Instruction{
33589			Opcode:   "VTESTPS",
33590			Operands: []operand.Op{mxy, xy},
33591			Inputs:   []operand.Op{mxy, xy},
33592			Outputs:  []operand.Op{},
33593			ISA:      []string{"AVX"},
33594		}, nil
33595	case operand.IsM256(mxy) && operand.IsYMM(xy):
33596		return &intrep.Instruction{
33597			Opcode:   "VTESTPS",
33598			Operands: []operand.Op{mxy, xy},
33599			Inputs:   []operand.Op{mxy, xy},
33600			Outputs:  []operand.Op{},
33601			ISA:      []string{"AVX"},
33602		}, nil
33603	}
33604	return nil, errors.New("VTESTPS: bad operands")
33605}
33606
33607// VUCOMISD: Unordered Compare Scalar Double-Precision Floating-Point Values and Set EFLAGS.
33608//
33609// Forms:
33610//
33611// 	VUCOMISD xmm xmm
33612// 	VUCOMISD m64 xmm
33613func VUCOMISD(mx, x operand.Op) (*intrep.Instruction, error) {
33614	switch {
33615	case operand.IsXMM(mx) && operand.IsXMM(x):
33616		return &intrep.Instruction{
33617			Opcode:   "VUCOMISD",
33618			Operands: []operand.Op{mx, x},
33619			Inputs:   []operand.Op{mx, x},
33620			Outputs:  []operand.Op{},
33621			ISA:      []string{"AVX"},
33622		}, nil
33623	case operand.IsM64(mx) && operand.IsXMM(x):
33624		return &intrep.Instruction{
33625			Opcode:   "VUCOMISD",
33626			Operands: []operand.Op{mx, x},
33627			Inputs:   []operand.Op{mx, x},
33628			Outputs:  []operand.Op{},
33629			ISA:      []string{"AVX"},
33630		}, nil
33631	}
33632	return nil, errors.New("VUCOMISD: bad operands")
33633}
33634
33635// VUCOMISS: Unordered Compare Scalar Single-Precision Floating-Point Values and Set EFLAGS.
33636//
33637// Forms:
33638//
33639// 	VUCOMISS xmm xmm
33640// 	VUCOMISS m32 xmm
33641func VUCOMISS(mx, x operand.Op) (*intrep.Instruction, error) {
33642	switch {
33643	case operand.IsXMM(mx) && operand.IsXMM(x):
33644		return &intrep.Instruction{
33645			Opcode:   "VUCOMISS",
33646			Operands: []operand.Op{mx, x},
33647			Inputs:   []operand.Op{mx, x},
33648			Outputs:  []operand.Op{},
33649			ISA:      []string{"AVX"},
33650		}, nil
33651	case operand.IsM32(mx) && operand.IsXMM(x):
33652		return &intrep.Instruction{
33653			Opcode:   "VUCOMISS",
33654			Operands: []operand.Op{mx, x},
33655			Inputs:   []operand.Op{mx, x},
33656			Outputs:  []operand.Op{},
33657			ISA:      []string{"AVX"},
33658		}, nil
33659	}
33660	return nil, errors.New("VUCOMISS: bad operands")
33661}
33662
33663// VUNPCKHPD: Unpack and Interleave High Packed Double-Precision Floating-Point Values.
33664//
33665// Forms:
33666//
33667// 	VUNPCKHPD xmm  xmm xmm
33668// 	VUNPCKHPD m128 xmm xmm
33669// 	VUNPCKHPD ymm  ymm ymm
33670// 	VUNPCKHPD m256 ymm ymm
33671func VUNPCKHPD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
33672	switch {
33673	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
33674		return &intrep.Instruction{
33675			Opcode:   "VUNPCKHPD",
33676			Operands: []operand.Op{mxy, xy, xy1},
33677			Inputs:   []operand.Op{mxy, xy},
33678			Outputs:  []operand.Op{xy1},
33679			ISA:      []string{"AVX"},
33680		}, nil
33681	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
33682		return &intrep.Instruction{
33683			Opcode:   "VUNPCKHPD",
33684			Operands: []operand.Op{mxy, xy, xy1},
33685			Inputs:   []operand.Op{mxy, xy},
33686			Outputs:  []operand.Op{xy1},
33687			ISA:      []string{"AVX"},
33688		}, nil
33689	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
33690		return &intrep.Instruction{
33691			Opcode:   "VUNPCKHPD",
33692			Operands: []operand.Op{mxy, xy, xy1},
33693			Inputs:   []operand.Op{mxy, xy},
33694			Outputs:  []operand.Op{xy1},
33695			ISA:      []string{"AVX"},
33696		}, nil
33697	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
33698		return &intrep.Instruction{
33699			Opcode:   "VUNPCKHPD",
33700			Operands: []operand.Op{mxy, xy, xy1},
33701			Inputs:   []operand.Op{mxy, xy},
33702			Outputs:  []operand.Op{xy1},
33703			ISA:      []string{"AVX"},
33704		}, nil
33705	}
33706	return nil, errors.New("VUNPCKHPD: bad operands")
33707}
33708
33709// VUNPCKHPS: Unpack and Interleave High Packed Single-Precision Floating-Point Values.
33710//
33711// Forms:
33712//
33713// 	VUNPCKHPS xmm  xmm xmm
33714// 	VUNPCKHPS m128 xmm xmm
33715// 	VUNPCKHPS ymm  ymm ymm
33716// 	VUNPCKHPS m256 ymm ymm
33717func VUNPCKHPS(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
33718	switch {
33719	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
33720		return &intrep.Instruction{
33721			Opcode:   "VUNPCKHPS",
33722			Operands: []operand.Op{mxy, xy, xy1},
33723			Inputs:   []operand.Op{mxy, xy},
33724			Outputs:  []operand.Op{xy1},
33725			ISA:      []string{"AVX"},
33726		}, nil
33727	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
33728		return &intrep.Instruction{
33729			Opcode:   "VUNPCKHPS",
33730			Operands: []operand.Op{mxy, xy, xy1},
33731			Inputs:   []operand.Op{mxy, xy},
33732			Outputs:  []operand.Op{xy1},
33733			ISA:      []string{"AVX"},
33734		}, nil
33735	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
33736		return &intrep.Instruction{
33737			Opcode:   "VUNPCKHPS",
33738			Operands: []operand.Op{mxy, xy, xy1},
33739			Inputs:   []operand.Op{mxy, xy},
33740			Outputs:  []operand.Op{xy1},
33741			ISA:      []string{"AVX"},
33742		}, nil
33743	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
33744		return &intrep.Instruction{
33745			Opcode:   "VUNPCKHPS",
33746			Operands: []operand.Op{mxy, xy, xy1},
33747			Inputs:   []operand.Op{mxy, xy},
33748			Outputs:  []operand.Op{xy1},
33749			ISA:      []string{"AVX"},
33750		}, nil
33751	}
33752	return nil, errors.New("VUNPCKHPS: bad operands")
33753}
33754
33755// VUNPCKLPD: Unpack and Interleave Low Packed Double-Precision Floating-Point Values.
33756//
33757// Forms:
33758//
33759// 	VUNPCKLPD xmm  xmm xmm
33760// 	VUNPCKLPD m128 xmm xmm
33761// 	VUNPCKLPD ymm  ymm ymm
33762// 	VUNPCKLPD m256 ymm ymm
33763func VUNPCKLPD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
33764	switch {
33765	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
33766		return &intrep.Instruction{
33767			Opcode:   "VUNPCKLPD",
33768			Operands: []operand.Op{mxy, xy, xy1},
33769			Inputs:   []operand.Op{mxy, xy},
33770			Outputs:  []operand.Op{xy1},
33771			ISA:      []string{"AVX"},
33772		}, nil
33773	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
33774		return &intrep.Instruction{
33775			Opcode:   "VUNPCKLPD",
33776			Operands: []operand.Op{mxy, xy, xy1},
33777			Inputs:   []operand.Op{mxy, xy},
33778			Outputs:  []operand.Op{xy1},
33779			ISA:      []string{"AVX"},
33780		}, nil
33781	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
33782		return &intrep.Instruction{
33783			Opcode:   "VUNPCKLPD",
33784			Operands: []operand.Op{mxy, xy, xy1},
33785			Inputs:   []operand.Op{mxy, xy},
33786			Outputs:  []operand.Op{xy1},
33787			ISA:      []string{"AVX"},
33788		}, nil
33789	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
33790		return &intrep.Instruction{
33791			Opcode:   "VUNPCKLPD",
33792			Operands: []operand.Op{mxy, xy, xy1},
33793			Inputs:   []operand.Op{mxy, xy},
33794			Outputs:  []operand.Op{xy1},
33795			ISA:      []string{"AVX"},
33796		}, nil
33797	}
33798	return nil, errors.New("VUNPCKLPD: bad operands")
33799}
33800
33801// VUNPCKLPS: Unpack and Interleave Low Packed Single-Precision Floating-Point Values.
33802//
33803// Forms:
33804//
33805// 	VUNPCKLPS xmm  xmm xmm
33806// 	VUNPCKLPS m128 xmm xmm
33807// 	VUNPCKLPS ymm  ymm ymm
33808// 	VUNPCKLPS m256 ymm ymm
33809func VUNPCKLPS(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
33810	switch {
33811	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
33812		return &intrep.Instruction{
33813			Opcode:   "VUNPCKLPS",
33814			Operands: []operand.Op{mxy, xy, xy1},
33815			Inputs:   []operand.Op{mxy, xy},
33816			Outputs:  []operand.Op{xy1},
33817			ISA:      []string{"AVX"},
33818		}, nil
33819	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
33820		return &intrep.Instruction{
33821			Opcode:   "VUNPCKLPS",
33822			Operands: []operand.Op{mxy, xy, xy1},
33823			Inputs:   []operand.Op{mxy, xy},
33824			Outputs:  []operand.Op{xy1},
33825			ISA:      []string{"AVX"},
33826		}, nil
33827	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
33828		return &intrep.Instruction{
33829			Opcode:   "VUNPCKLPS",
33830			Operands: []operand.Op{mxy, xy, xy1},
33831			Inputs:   []operand.Op{mxy, xy},
33832			Outputs:  []operand.Op{xy1},
33833			ISA:      []string{"AVX"},
33834		}, nil
33835	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
33836		return &intrep.Instruction{
33837			Opcode:   "VUNPCKLPS",
33838			Operands: []operand.Op{mxy, xy, xy1},
33839			Inputs:   []operand.Op{mxy, xy},
33840			Outputs:  []operand.Op{xy1},
33841			ISA:      []string{"AVX"},
33842		}, nil
33843	}
33844	return nil, errors.New("VUNPCKLPS: bad operands")
33845}
33846
33847// VXORPD: Bitwise Logical XOR for Double-Precision Floating-Point Values.
33848//
33849// Forms:
33850//
33851// 	VXORPD xmm  xmm xmm
33852// 	VXORPD m128 xmm xmm
33853// 	VXORPD ymm  ymm ymm
33854// 	VXORPD m256 ymm ymm
33855func VXORPD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
33856	switch {
33857	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
33858		return &intrep.Instruction{
33859			Opcode:           "VXORPD",
33860			Operands:         []operand.Op{mxy, xy, xy1},
33861			Inputs:           []operand.Op{mxy, xy},
33862			Outputs:          []operand.Op{xy1},
33863			ISA:              []string{"AVX"},
33864			CancellingInputs: true,
33865		}, nil
33866	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
33867		return &intrep.Instruction{
33868			Opcode:   "VXORPD",
33869			Operands: []operand.Op{mxy, xy, xy1},
33870			Inputs:   []operand.Op{mxy, xy},
33871			Outputs:  []operand.Op{xy1},
33872			ISA:      []string{"AVX"},
33873		}, nil
33874	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
33875		return &intrep.Instruction{
33876			Opcode:           "VXORPD",
33877			Operands:         []operand.Op{mxy, xy, xy1},
33878			Inputs:           []operand.Op{mxy, xy},
33879			Outputs:          []operand.Op{xy1},
33880			ISA:              []string{"AVX"},
33881			CancellingInputs: true,
33882		}, nil
33883	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
33884		return &intrep.Instruction{
33885			Opcode:   "VXORPD",
33886			Operands: []operand.Op{mxy, xy, xy1},
33887			Inputs:   []operand.Op{mxy, xy},
33888			Outputs:  []operand.Op{xy1},
33889			ISA:      []string{"AVX"},
33890		}, nil
33891	}
33892	return nil, errors.New("VXORPD: bad operands")
33893}
33894
33895// VXORPS: Bitwise Logical XOR for Single-Precision Floating-Point Values.
33896//
33897// Forms:
33898//
33899// 	VXORPS xmm  xmm xmm
33900// 	VXORPS m128 xmm xmm
33901// 	VXORPS ymm  ymm ymm
33902// 	VXORPS m256 ymm ymm
33903func VXORPS(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
33904	switch {
33905	case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
33906		return &intrep.Instruction{
33907			Opcode:           "VXORPS",
33908			Operands:         []operand.Op{mxy, xy, xy1},
33909			Inputs:           []operand.Op{mxy, xy},
33910			Outputs:          []operand.Op{xy1},
33911			ISA:              []string{"AVX"},
33912			CancellingInputs: true,
33913		}, nil
33914	case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
33915		return &intrep.Instruction{
33916			Opcode:   "VXORPS",
33917			Operands: []operand.Op{mxy, xy, xy1},
33918			Inputs:   []operand.Op{mxy, xy},
33919			Outputs:  []operand.Op{xy1},
33920			ISA:      []string{"AVX"},
33921		}, nil
33922	case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
33923		return &intrep.Instruction{
33924			Opcode:           "VXORPS",
33925			Operands:         []operand.Op{mxy, xy, xy1},
33926			Inputs:           []operand.Op{mxy, xy},
33927			Outputs:          []operand.Op{xy1},
33928			ISA:              []string{"AVX"},
33929			CancellingInputs: true,
33930		}, nil
33931	case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
33932		return &intrep.Instruction{
33933			Opcode:   "VXORPS",
33934			Operands: []operand.Op{mxy, xy, xy1},
33935			Inputs:   []operand.Op{mxy, xy},
33936			Outputs:  []operand.Op{xy1},
33937			ISA:      []string{"AVX"},
33938		}, nil
33939	}
33940	return nil, errors.New("VXORPS: bad operands")
33941}
33942
33943// VZEROALL: Zero All YMM Registers.
33944//
33945// Forms:
33946//
33947// 	VZEROALL
33948func VZEROALL() (*intrep.Instruction, error) {
33949	return &intrep.Instruction{
33950		Opcode:   "VZEROALL",
33951		Operands: nil,
33952		Inputs:   []operand.Op{},
33953		Outputs:  []operand.Op{},
33954		ISA:      []string{"AVX"},
33955	}, nil
33956}
33957
33958// VZEROUPPER: Zero Upper Bits of YMM Registers.
33959//
33960// Forms:
33961//
33962// 	VZEROUPPER
33963func VZEROUPPER() (*intrep.Instruction, error) {
33964	return &intrep.Instruction{
33965		Opcode:   "VZEROUPPER",
33966		Operands: nil,
33967		Inputs:   []operand.Op{},
33968		Outputs:  []operand.Op{},
33969		ISA:      []string{"AVX"},
33970	}, nil
33971}
33972
33973// XADDB: Exchange and Add.
33974//
33975// Forms:
33976//
33977// 	XADDB r8 r8
33978// 	XADDB r8 m8
33979func XADDB(r, mr operand.Op) (*intrep.Instruction, error) {
33980	switch {
33981	case operand.IsR8(r) && operand.IsR8(mr):
33982		return &intrep.Instruction{
33983			Opcode:   "XADDB",
33984			Operands: []operand.Op{r, mr},
33985			Inputs:   []operand.Op{r, mr},
33986			Outputs:  []operand.Op{r, mr},
33987		}, nil
33988	case operand.IsR8(r) && operand.IsM8(mr):
33989		return &intrep.Instruction{
33990			Opcode:   "XADDB",
33991			Operands: []operand.Op{r, mr},
33992			Inputs:   []operand.Op{r, mr},
33993			Outputs:  []operand.Op{r, mr},
33994		}, nil
33995	}
33996	return nil, errors.New("XADDB: bad operands")
33997}
33998
33999// XADDL: Exchange and Add.
34000//
34001// Forms:
34002//
34003// 	XADDL r32 r32
34004// 	XADDL r32 m32
34005func XADDL(r, mr operand.Op) (*intrep.Instruction, error) {
34006	switch {
34007	case operand.IsR32(r) && operand.IsR32(mr):
34008		return &intrep.Instruction{
34009			Opcode:   "XADDL",
34010			Operands: []operand.Op{r, mr},
34011			Inputs:   []operand.Op{r, mr},
34012			Outputs:  []operand.Op{r, mr},
34013		}, nil
34014	case operand.IsR32(r) && operand.IsM32(mr):
34015		return &intrep.Instruction{
34016			Opcode:   "XADDL",
34017			Operands: []operand.Op{r, mr},
34018			Inputs:   []operand.Op{r, mr},
34019			Outputs:  []operand.Op{r, mr},
34020		}, nil
34021	}
34022	return nil, errors.New("XADDL: bad operands")
34023}
34024
34025// XADDQ: Exchange and Add.
34026//
34027// Forms:
34028//
34029// 	XADDQ r64 r64
34030// 	XADDQ r64 m64
34031func XADDQ(r, mr operand.Op) (*intrep.Instruction, error) {
34032	switch {
34033	case operand.IsR64(r) && operand.IsR64(mr):
34034		return &intrep.Instruction{
34035			Opcode:   "XADDQ",
34036			Operands: []operand.Op{r, mr},
34037			Inputs:   []operand.Op{r, mr},
34038			Outputs:  []operand.Op{r, mr},
34039		}, nil
34040	case operand.IsR64(r) && operand.IsM64(mr):
34041		return &intrep.Instruction{
34042			Opcode:   "XADDQ",
34043			Operands: []operand.Op{r, mr},
34044			Inputs:   []operand.Op{r, mr},
34045			Outputs:  []operand.Op{r, mr},
34046		}, nil
34047	}
34048	return nil, errors.New("XADDQ: bad operands")
34049}
34050
34051// XADDW: Exchange and Add.
34052//
34053// Forms:
34054//
34055// 	XADDW r16 r16
34056// 	XADDW r16 m16
34057func XADDW(r, mr operand.Op) (*intrep.Instruction, error) {
34058	switch {
34059	case operand.IsR16(r) && operand.IsR16(mr):
34060		return &intrep.Instruction{
34061			Opcode:   "XADDW",
34062			Operands: []operand.Op{r, mr},
34063			Inputs:   []operand.Op{r, mr},
34064			Outputs:  []operand.Op{r, mr},
34065		}, nil
34066	case operand.IsR16(r) && operand.IsM16(mr):
34067		return &intrep.Instruction{
34068			Opcode:   "XADDW",
34069			Operands: []operand.Op{r, mr},
34070			Inputs:   []operand.Op{r, mr},
34071			Outputs:  []operand.Op{r, mr},
34072		}, nil
34073	}
34074	return nil, errors.New("XADDW: bad operands")
34075}
34076
34077// XCHGB: Exchange Register/Memory with Register.
34078//
34079// Forms:
34080//
34081// 	XCHGB r8 r8
34082// 	XCHGB m8 r8
34083// 	XCHGB r8 m8
34084func XCHGB(mr, mr1 operand.Op) (*intrep.Instruction, error) {
34085	switch {
34086	case operand.IsR8(mr) && operand.IsR8(mr1):
34087		return &intrep.Instruction{
34088			Opcode:   "XCHGB",
34089			Operands: []operand.Op{mr, mr1},
34090			Inputs:   []operand.Op{mr, mr1},
34091			Outputs:  []operand.Op{mr, mr1},
34092		}, nil
34093	case operand.IsM8(mr) && operand.IsR8(mr1):
34094		return &intrep.Instruction{
34095			Opcode:   "XCHGB",
34096			Operands: []operand.Op{mr, mr1},
34097			Inputs:   []operand.Op{mr, mr1},
34098			Outputs:  []operand.Op{mr, mr1},
34099		}, nil
34100	case operand.IsR8(mr) && operand.IsM8(mr1):
34101		return &intrep.Instruction{
34102			Opcode:   "XCHGB",
34103			Operands: []operand.Op{mr, mr1},
34104			Inputs:   []operand.Op{mr, mr1},
34105			Outputs:  []operand.Op{mr, mr1},
34106		}, nil
34107	}
34108	return nil, errors.New("XCHGB: bad operands")
34109}
34110
34111// XCHGL: Exchange Register/Memory with Register.
34112//
34113// Forms:
34114//
34115// 	XCHGL r32 eax
34116// 	XCHGL eax r32
34117// 	XCHGL r32 r32
34118// 	XCHGL m32 r32
34119// 	XCHGL r32 m32
34120func XCHGL(emr, emr1 operand.Op) (*intrep.Instruction, error) {
34121	switch {
34122	case operand.IsR32(emr) && operand.IsEAX(emr1):
34123		return &intrep.Instruction{
34124			Opcode:   "XCHGL",
34125			Operands: []operand.Op{emr, emr1},
34126			Inputs:   []operand.Op{emr, emr1},
34127			Outputs:  []operand.Op{emr, emr1},
34128		}, nil
34129	case operand.IsEAX(emr) && operand.IsR32(emr1):
34130		return &intrep.Instruction{
34131			Opcode:   "XCHGL",
34132			Operands: []operand.Op{emr, emr1},
34133			Inputs:   []operand.Op{emr, emr1},
34134			Outputs:  []operand.Op{emr, emr1},
34135		}, nil
34136	case operand.IsR32(emr) && operand.IsR32(emr1):
34137		return &intrep.Instruction{
34138			Opcode:   "XCHGL",
34139			Operands: []operand.Op{emr, emr1},
34140			Inputs:   []operand.Op{emr, emr1},
34141			Outputs:  []operand.Op{emr, emr1},
34142		}, nil
34143	case operand.IsM32(emr) && operand.IsR32(emr1):
34144		return &intrep.Instruction{
34145			Opcode:   "XCHGL",
34146			Operands: []operand.Op{emr, emr1},
34147			Inputs:   []operand.Op{emr, emr1},
34148			Outputs:  []operand.Op{emr, emr1},
34149		}, nil
34150	case operand.IsR32(emr) && operand.IsM32(emr1):
34151		return &intrep.Instruction{
34152			Opcode:   "XCHGL",
34153			Operands: []operand.Op{emr, emr1},
34154			Inputs:   []operand.Op{emr, emr1},
34155			Outputs:  []operand.Op{emr, emr1},
34156		}, nil
34157	}
34158	return nil, errors.New("XCHGL: bad operands")
34159}
34160
34161// XCHGQ: Exchange Register/Memory with Register.
34162//
34163// Forms:
34164//
34165// 	XCHGQ r64 rax
34166// 	XCHGQ rax r64
34167// 	XCHGQ r64 r64
34168// 	XCHGQ m64 r64
34169// 	XCHGQ r64 m64
34170func XCHGQ(mr, mr1 operand.Op) (*intrep.Instruction, error) {
34171	switch {
34172	case operand.IsR64(mr) && operand.IsRAX(mr1):
34173		return &intrep.Instruction{
34174			Opcode:   "XCHGQ",
34175			Operands: []operand.Op{mr, mr1},
34176			Inputs:   []operand.Op{mr, mr1},
34177			Outputs:  []operand.Op{mr, mr1},
34178		}, nil
34179	case operand.IsRAX(mr) && operand.IsR64(mr1):
34180		return &intrep.Instruction{
34181			Opcode:   "XCHGQ",
34182			Operands: []operand.Op{mr, mr1},
34183			Inputs:   []operand.Op{mr, mr1},
34184			Outputs:  []operand.Op{mr, mr1},
34185		}, nil
34186	case operand.IsR64(mr) && operand.IsR64(mr1):
34187		return &intrep.Instruction{
34188			Opcode:   "XCHGQ",
34189			Operands: []operand.Op{mr, mr1},
34190			Inputs:   []operand.Op{mr, mr1},
34191			Outputs:  []operand.Op{mr, mr1},
34192		}, nil
34193	case operand.IsM64(mr) && operand.IsR64(mr1):
34194		return &intrep.Instruction{
34195			Opcode:   "XCHGQ",
34196			Operands: []operand.Op{mr, mr1},
34197			Inputs:   []operand.Op{mr, mr1},
34198			Outputs:  []operand.Op{mr, mr1},
34199		}, nil
34200	case operand.IsR64(mr) && operand.IsM64(mr1):
34201		return &intrep.Instruction{
34202			Opcode:   "XCHGQ",
34203			Operands: []operand.Op{mr, mr1},
34204			Inputs:   []operand.Op{mr, mr1},
34205			Outputs:  []operand.Op{mr, mr1},
34206		}, nil
34207	}
34208	return nil, errors.New("XCHGQ: bad operands")
34209}
34210
34211// XCHGW: Exchange Register/Memory with Register.
34212//
34213// Forms:
34214//
34215// 	XCHGW r16 ax
34216// 	XCHGW ax  r16
34217// 	XCHGW r16 r16
34218// 	XCHGW m16 r16
34219// 	XCHGW r16 m16
34220func XCHGW(amr, amr1 operand.Op) (*intrep.Instruction, error) {
34221	switch {
34222	case operand.IsR16(amr) && operand.IsAX(amr1):
34223		return &intrep.Instruction{
34224			Opcode:   "XCHGW",
34225			Operands: []operand.Op{amr, amr1},
34226			Inputs:   []operand.Op{amr, amr1},
34227			Outputs:  []operand.Op{amr, amr1},
34228		}, nil
34229	case operand.IsAX(amr) && operand.IsR16(amr1):
34230		return &intrep.Instruction{
34231			Opcode:   "XCHGW",
34232			Operands: []operand.Op{amr, amr1},
34233			Inputs:   []operand.Op{amr, amr1},
34234			Outputs:  []operand.Op{amr, amr1},
34235		}, nil
34236	case operand.IsR16(amr) && operand.IsR16(amr1):
34237		return &intrep.Instruction{
34238			Opcode:   "XCHGW",
34239			Operands: []operand.Op{amr, amr1},
34240			Inputs:   []operand.Op{amr, amr1},
34241			Outputs:  []operand.Op{amr, amr1},
34242		}, nil
34243	case operand.IsM16(amr) && operand.IsR16(amr1):
34244		return &intrep.Instruction{
34245			Opcode:   "XCHGW",
34246			Operands: []operand.Op{amr, amr1},
34247			Inputs:   []operand.Op{amr, amr1},
34248			Outputs:  []operand.Op{amr, amr1},
34249		}, nil
34250	case operand.IsR16(amr) && operand.IsM16(amr1):
34251		return &intrep.Instruction{
34252			Opcode:   "XCHGW",
34253			Operands: []operand.Op{amr, amr1},
34254			Inputs:   []operand.Op{amr, amr1},
34255			Outputs:  []operand.Op{amr, amr1},
34256		}, nil
34257	}
34258	return nil, errors.New("XCHGW: bad operands")
34259}
34260
34261// XGETBV: Get Value of Extended Control Register.
34262//
34263// Forms:
34264//
34265// 	XGETBV
34266func XGETBV() (*intrep.Instruction, error) {
34267	return &intrep.Instruction{
34268		Opcode:   "XGETBV",
34269		Operands: nil,
34270		Inputs:   []operand.Op{reg.ECX},
34271		Outputs:  []operand.Op{reg.EAX, reg.EDX},
34272	}, nil
34273}
34274
34275// XLAT: Table Look-up Translation.
34276//
34277// Forms:
34278//
34279// 	XLAT
34280func XLAT() (*intrep.Instruction, error) {
34281	return &intrep.Instruction{
34282		Opcode:   "XLAT",
34283		Operands: nil,
34284		Inputs:   []operand.Op{reg.AL, reg.EBX},
34285		Outputs:  []operand.Op{reg.AL},
34286	}, nil
34287}
34288
34289// XORB: Logical Exclusive OR.
34290//
34291// Forms:
34292//
34293// 	XORB imm8 al
34294// 	XORB imm8 r8
34295// 	XORB r8   r8
34296// 	XORB m8   r8
34297// 	XORB imm8 m8
34298// 	XORB r8   m8
34299func XORB(imr, amr operand.Op) (*intrep.Instruction, error) {
34300	switch {
34301	case operand.IsIMM8(imr) && operand.IsAL(amr):
34302		return &intrep.Instruction{
34303			Opcode:   "XORB",
34304			Operands: []operand.Op{imr, amr},
34305			Inputs:   []operand.Op{amr},
34306			Outputs:  []operand.Op{amr},
34307		}, nil
34308	case operand.IsIMM8(imr) && operand.IsR8(amr):
34309		return &intrep.Instruction{
34310			Opcode:   "XORB",
34311			Operands: []operand.Op{imr, amr},
34312			Inputs:   []operand.Op{amr},
34313			Outputs:  []operand.Op{amr},
34314		}, nil
34315	case operand.IsR8(imr) && operand.IsR8(amr):
34316		return &intrep.Instruction{
34317			Opcode:           "XORB",
34318			Operands:         []operand.Op{imr, amr},
34319			Inputs:           []operand.Op{imr, amr},
34320			Outputs:          []operand.Op{amr},
34321			CancellingInputs: true,
34322		}, nil
34323	case operand.IsM8(imr) && operand.IsR8(amr):
34324		return &intrep.Instruction{
34325			Opcode:   "XORB",
34326			Operands: []operand.Op{imr, amr},
34327			Inputs:   []operand.Op{imr, amr},
34328			Outputs:  []operand.Op{amr},
34329		}, nil
34330	case operand.IsIMM8(imr) && operand.IsM8(amr):
34331		return &intrep.Instruction{
34332			Opcode:   "XORB",
34333			Operands: []operand.Op{imr, amr},
34334			Inputs:   []operand.Op{amr},
34335			Outputs:  []operand.Op{amr},
34336		}, nil
34337	case operand.IsR8(imr) && operand.IsM8(amr):
34338		return &intrep.Instruction{
34339			Opcode:   "XORB",
34340			Operands: []operand.Op{imr, amr},
34341			Inputs:   []operand.Op{imr, amr},
34342			Outputs:  []operand.Op{amr},
34343		}, nil
34344	}
34345	return nil, errors.New("XORB: bad operands")
34346}
34347
34348// XORL: Logical Exclusive OR.
34349//
34350// Forms:
34351//
34352// 	XORL imm32 eax
34353// 	XORL imm8  r32
34354// 	XORL imm32 r32
34355// 	XORL r32   r32
34356// 	XORL m32   r32
34357// 	XORL imm8  m32
34358// 	XORL imm32 m32
34359// 	XORL r32   m32
34360func XORL(imr, emr operand.Op) (*intrep.Instruction, error) {
34361	switch {
34362	case operand.IsIMM32(imr) && operand.IsEAX(emr):
34363		return &intrep.Instruction{
34364			Opcode:   "XORL",
34365			Operands: []operand.Op{imr, emr},
34366			Inputs:   []operand.Op{emr},
34367			Outputs:  []operand.Op{emr},
34368		}, nil
34369	case operand.IsIMM8(imr) && operand.IsR32(emr):
34370		return &intrep.Instruction{
34371			Opcode:   "XORL",
34372			Operands: []operand.Op{imr, emr},
34373			Inputs:   []operand.Op{emr},
34374			Outputs:  []operand.Op{emr},
34375		}, nil
34376	case operand.IsIMM32(imr) && operand.IsR32(emr):
34377		return &intrep.Instruction{
34378			Opcode:   "XORL",
34379			Operands: []operand.Op{imr, emr},
34380			Inputs:   []operand.Op{emr},
34381			Outputs:  []operand.Op{emr},
34382		}, nil
34383	case operand.IsR32(imr) && operand.IsR32(emr):
34384		return &intrep.Instruction{
34385			Opcode:           "XORL",
34386			Operands:         []operand.Op{imr, emr},
34387			Inputs:           []operand.Op{imr, emr},
34388			Outputs:          []operand.Op{emr},
34389			CancellingInputs: true,
34390		}, nil
34391	case operand.IsM32(imr) && operand.IsR32(emr):
34392		return &intrep.Instruction{
34393			Opcode:   "XORL",
34394			Operands: []operand.Op{imr, emr},
34395			Inputs:   []operand.Op{imr, emr},
34396			Outputs:  []operand.Op{emr},
34397		}, nil
34398	case operand.IsIMM8(imr) && operand.IsM32(emr):
34399		return &intrep.Instruction{
34400			Opcode:   "XORL",
34401			Operands: []operand.Op{imr, emr},
34402			Inputs:   []operand.Op{emr},
34403			Outputs:  []operand.Op{emr},
34404		}, nil
34405	case operand.IsIMM32(imr) && operand.IsM32(emr):
34406		return &intrep.Instruction{
34407			Opcode:   "XORL",
34408			Operands: []operand.Op{imr, emr},
34409			Inputs:   []operand.Op{emr},
34410			Outputs:  []operand.Op{emr},
34411		}, nil
34412	case operand.IsR32(imr) && operand.IsM32(emr):
34413		return &intrep.Instruction{
34414			Opcode:   "XORL",
34415			Operands: []operand.Op{imr, emr},
34416			Inputs:   []operand.Op{imr, emr},
34417			Outputs:  []operand.Op{emr},
34418		}, nil
34419	}
34420	return nil, errors.New("XORL: bad operands")
34421}
34422
34423// XORPD: Bitwise Logical XOR for Double-Precision Floating-Point Values.
34424//
34425// Forms:
34426//
34427// 	XORPD xmm  xmm
34428// 	XORPD m128 xmm
34429func XORPD(mx, x operand.Op) (*intrep.Instruction, error) {
34430	switch {
34431	case operand.IsXMM(mx) && operand.IsXMM(x):
34432		return &intrep.Instruction{
34433			Opcode:           "XORPD",
34434			Operands:         []operand.Op{mx, x},
34435			Inputs:           []operand.Op{mx, x},
34436			Outputs:          []operand.Op{x},
34437			ISA:              []string{"SSE2"},
34438			CancellingInputs: true,
34439		}, nil
34440	case operand.IsM128(mx) && operand.IsXMM(x):
34441		return &intrep.Instruction{
34442			Opcode:   "XORPD",
34443			Operands: []operand.Op{mx, x},
34444			Inputs:   []operand.Op{mx, x},
34445			Outputs:  []operand.Op{x},
34446			ISA:      []string{"SSE2"},
34447		}, nil
34448	}
34449	return nil, errors.New("XORPD: bad operands")
34450}
34451
34452// XORPS: Bitwise Logical XOR for Single-Precision Floating-Point Values.
34453//
34454// Forms:
34455//
34456// 	XORPS xmm  xmm
34457// 	XORPS m128 xmm
34458func XORPS(mx, x operand.Op) (*intrep.Instruction, error) {
34459	switch {
34460	case operand.IsXMM(mx) && operand.IsXMM(x):
34461		return &intrep.Instruction{
34462			Opcode:           "XORPS",
34463			Operands:         []operand.Op{mx, x},
34464			Inputs:           []operand.Op{mx, x},
34465			Outputs:          []operand.Op{x},
34466			ISA:              []string{"SSE"},
34467			CancellingInputs: true,
34468		}, nil
34469	case operand.IsM128(mx) && operand.IsXMM(x):
34470		return &intrep.Instruction{
34471			Opcode:   "XORPS",
34472			Operands: []operand.Op{mx, x},
34473			Inputs:   []operand.Op{mx, x},
34474			Outputs:  []operand.Op{x},
34475			ISA:      []string{"SSE"},
34476		}, nil
34477	}
34478	return nil, errors.New("XORPS: bad operands")
34479}
34480
34481// XORQ: Logical Exclusive OR.
34482//
34483// Forms:
34484//
34485// 	XORQ imm32 rax
34486// 	XORQ imm8  r64
34487// 	XORQ imm32 r64
34488// 	XORQ r64   r64
34489// 	XORQ m64   r64
34490// 	XORQ imm8  m64
34491// 	XORQ imm32 m64
34492// 	XORQ r64   m64
34493func XORQ(imr, mr operand.Op) (*intrep.Instruction, error) {
34494	switch {
34495	case operand.IsIMM32(imr) && operand.IsRAX(mr):
34496		return &intrep.Instruction{
34497			Opcode:   "XORQ",
34498			Operands: []operand.Op{imr, mr},
34499			Inputs:   []operand.Op{mr},
34500			Outputs:  []operand.Op{mr},
34501		}, nil
34502	case operand.IsIMM8(imr) && operand.IsR64(mr):
34503		return &intrep.Instruction{
34504			Opcode:   "XORQ",
34505			Operands: []operand.Op{imr, mr},
34506			Inputs:   []operand.Op{mr},
34507			Outputs:  []operand.Op{mr},
34508		}, nil
34509	case operand.IsIMM32(imr) && operand.IsR64(mr):
34510		return &intrep.Instruction{
34511			Opcode:   "XORQ",
34512			Operands: []operand.Op{imr, mr},
34513			Inputs:   []operand.Op{mr},
34514			Outputs:  []operand.Op{mr},
34515		}, nil
34516	case operand.IsR64(imr) && operand.IsR64(mr):
34517		return &intrep.Instruction{
34518			Opcode:           "XORQ",
34519			Operands:         []operand.Op{imr, mr},
34520			Inputs:           []operand.Op{imr, mr},
34521			Outputs:          []operand.Op{mr},
34522			CancellingInputs: true,
34523		}, nil
34524	case operand.IsM64(imr) && operand.IsR64(mr):
34525		return &intrep.Instruction{
34526			Opcode:   "XORQ",
34527			Operands: []operand.Op{imr, mr},
34528			Inputs:   []operand.Op{imr, mr},
34529			Outputs:  []operand.Op{mr},
34530		}, nil
34531	case operand.IsIMM8(imr) && operand.IsM64(mr):
34532		return &intrep.Instruction{
34533			Opcode:   "XORQ",
34534			Operands: []operand.Op{imr, mr},
34535			Inputs:   []operand.Op{mr},
34536			Outputs:  []operand.Op{mr},
34537		}, nil
34538	case operand.IsIMM32(imr) && operand.IsM64(mr):
34539		return &intrep.Instruction{
34540			Opcode:   "XORQ",
34541			Operands: []operand.Op{imr, mr},
34542			Inputs:   []operand.Op{mr},
34543			Outputs:  []operand.Op{mr},
34544		}, nil
34545	case operand.IsR64(imr) && operand.IsM64(mr):
34546		return &intrep.Instruction{
34547			Opcode:   "XORQ",
34548			Operands: []operand.Op{imr, mr},
34549			Inputs:   []operand.Op{imr, mr},
34550			Outputs:  []operand.Op{mr},
34551		}, nil
34552	}
34553	return nil, errors.New("XORQ: bad operands")
34554}
34555
34556// XORW: Logical Exclusive OR.
34557//
34558// Forms:
34559//
34560// 	XORW imm16 ax
34561// 	XORW imm8  r16
34562// 	XORW imm16 r16
34563// 	XORW r16   r16
34564// 	XORW m16   r16
34565// 	XORW imm8  m16
34566// 	XORW imm16 m16
34567// 	XORW r16   m16
34568func XORW(imr, amr operand.Op) (*intrep.Instruction, error) {
34569	switch {
34570	case operand.IsIMM16(imr) && operand.IsAX(amr):
34571		return &intrep.Instruction{
34572			Opcode:   "XORW",
34573			Operands: []operand.Op{imr, amr},
34574			Inputs:   []operand.Op{amr},
34575			Outputs:  []operand.Op{amr},
34576		}, nil
34577	case operand.IsIMM8(imr) && operand.IsR16(amr):
34578		return &intrep.Instruction{
34579			Opcode:   "XORW",
34580			Operands: []operand.Op{imr, amr},
34581			Inputs:   []operand.Op{amr},
34582			Outputs:  []operand.Op{amr},
34583		}, nil
34584	case operand.IsIMM16(imr) && operand.IsR16(amr):
34585		return &intrep.Instruction{
34586			Opcode:   "XORW",
34587			Operands: []operand.Op{imr, amr},
34588			Inputs:   []operand.Op{amr},
34589			Outputs:  []operand.Op{amr},
34590		}, nil
34591	case operand.IsR16(imr) && operand.IsR16(amr):
34592		return &intrep.Instruction{
34593			Opcode:           "XORW",
34594			Operands:         []operand.Op{imr, amr},
34595			Inputs:           []operand.Op{imr, amr},
34596			Outputs:          []operand.Op{amr},
34597			CancellingInputs: true,
34598		}, nil
34599	case operand.IsM16(imr) && operand.IsR16(amr):
34600		return &intrep.Instruction{
34601			Opcode:   "XORW",
34602			Operands: []operand.Op{imr, amr},
34603			Inputs:   []operand.Op{imr, amr},
34604			Outputs:  []operand.Op{amr},
34605		}, nil
34606	case operand.IsIMM8(imr) && operand.IsM16(amr):
34607		return &intrep.Instruction{
34608			Opcode:   "XORW",
34609			Operands: []operand.Op{imr, amr},
34610			Inputs:   []operand.Op{amr},
34611			Outputs:  []operand.Op{amr},
34612		}, nil
34613	case operand.IsIMM16(imr) && operand.IsM16(amr):
34614		return &intrep.Instruction{
34615			Opcode:   "XORW",
34616			Operands: []operand.Op{imr, amr},
34617			Inputs:   []operand.Op{amr},
34618			Outputs:  []operand.Op{amr},
34619		}, nil
34620	case operand.IsR16(imr) && operand.IsM16(amr):
34621		return &intrep.Instruction{
34622			Opcode:   "XORW",
34623			Operands: []operand.Op{imr, amr},
34624			Inputs:   []operand.Op{imr, amr},
34625			Outputs:  []operand.Op{amr},
34626		}, nil
34627	}
34628	return nil, errors.New("XORW: bad operands")
34629}
34630