Please wait. This can take some minutes ...
Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance.
Project price only 1 $
You can buy this project and download/modify it how often you want.
vendor.github.com.mmcloughlin.avo.x86.zctors.go Maven / Gradle / Ivy
// Code generated by command: avogen -output zctors.go ctors. DO NOT EDIT.
package x86
import (
"errors"
intrep "github.com/mmcloughlin/avo/ir"
"github.com/mmcloughlin/avo/operand"
"github.com/mmcloughlin/avo/reg"
)
// ADCB: Add with Carry.
//
// Forms:
//
// ADCB imm8 al
// ADCB imm8 r8
// ADCB r8 r8
// ADCB m8 r8
// ADCB imm8 m8
// ADCB r8 m8
func ADCB(imr, amr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(imr) && operand.IsAL(amr):
return &intrep.Instruction{
Opcode: "ADCB",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{amr},
Outputs: []operand.Op{amr},
}, nil
case operand.IsIMM8(imr) && operand.IsR8(amr):
return &intrep.Instruction{
Opcode: "ADCB",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{amr},
Outputs: []operand.Op{amr},
}, nil
case operand.IsR8(imr) && operand.IsR8(amr):
return &intrep.Instruction{
Opcode: "ADCB",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{imr, amr},
Outputs: []operand.Op{amr},
}, nil
case operand.IsM8(imr) && operand.IsR8(amr):
return &intrep.Instruction{
Opcode: "ADCB",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{imr, amr},
Outputs: []operand.Op{amr},
}, nil
case operand.IsIMM8(imr) && operand.IsM8(amr):
return &intrep.Instruction{
Opcode: "ADCB",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{amr},
Outputs: []operand.Op{amr},
}, nil
case operand.IsR8(imr) && operand.IsM8(amr):
return &intrep.Instruction{
Opcode: "ADCB",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{imr, amr},
Outputs: []operand.Op{amr},
}, nil
}
return nil, errors.New("ADCB: bad operands")
}
// ADCL: Add with Carry.
//
// Forms:
//
// ADCL imm32 eax
// ADCL imm8 r32
// ADCL imm32 r32
// ADCL r32 r32
// ADCL m32 r32
// ADCL imm8 m32
// ADCL imm32 m32
// ADCL r32 m32
func ADCL(imr, emr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM32(imr) && operand.IsEAX(emr):
return &intrep.Instruction{
Opcode: "ADCL",
Operands: []operand.Op{imr, emr},
Inputs: []operand.Op{emr},
Outputs: []operand.Op{emr},
}, nil
case operand.IsIMM8(imr) && operand.IsR32(emr):
return &intrep.Instruction{
Opcode: "ADCL",
Operands: []operand.Op{imr, emr},
Inputs: []operand.Op{emr},
Outputs: []operand.Op{emr},
}, nil
case operand.IsIMM32(imr) && operand.IsR32(emr):
return &intrep.Instruction{
Opcode: "ADCL",
Operands: []operand.Op{imr, emr},
Inputs: []operand.Op{emr},
Outputs: []operand.Op{emr},
}, nil
case operand.IsR32(imr) && operand.IsR32(emr):
return &intrep.Instruction{
Opcode: "ADCL",
Operands: []operand.Op{imr, emr},
Inputs: []operand.Op{imr, emr},
Outputs: []operand.Op{emr},
}, nil
case operand.IsM32(imr) && operand.IsR32(emr):
return &intrep.Instruction{
Opcode: "ADCL",
Operands: []operand.Op{imr, emr},
Inputs: []operand.Op{imr, emr},
Outputs: []operand.Op{emr},
}, nil
case operand.IsIMM8(imr) && operand.IsM32(emr):
return &intrep.Instruction{
Opcode: "ADCL",
Operands: []operand.Op{imr, emr},
Inputs: []operand.Op{emr},
Outputs: []operand.Op{emr},
}, nil
case operand.IsIMM32(imr) && operand.IsM32(emr):
return &intrep.Instruction{
Opcode: "ADCL",
Operands: []operand.Op{imr, emr},
Inputs: []operand.Op{emr},
Outputs: []operand.Op{emr},
}, nil
case operand.IsR32(imr) && operand.IsM32(emr):
return &intrep.Instruction{
Opcode: "ADCL",
Operands: []operand.Op{imr, emr},
Inputs: []operand.Op{imr, emr},
Outputs: []operand.Op{emr},
}, nil
}
return nil, errors.New("ADCL: bad operands")
}
// ADCQ: Add with Carry.
//
// Forms:
//
// ADCQ imm32 rax
// ADCQ imm8 r64
// ADCQ imm32 r64
// ADCQ r64 r64
// ADCQ m64 r64
// ADCQ imm8 m64
// ADCQ imm32 m64
// ADCQ r64 m64
func ADCQ(imr, mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM32(imr) && operand.IsRAX(mr):
return &intrep.Instruction{
Opcode: "ADCQ",
Operands: []operand.Op{imr, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsIMM8(imr) && operand.IsR64(mr):
return &intrep.Instruction{
Opcode: "ADCQ",
Operands: []operand.Op{imr, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsIMM32(imr) && operand.IsR64(mr):
return &intrep.Instruction{
Opcode: "ADCQ",
Operands: []operand.Op{imr, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsR64(imr) && operand.IsR64(mr):
return &intrep.Instruction{
Opcode: "ADCQ",
Operands: []operand.Op{imr, mr},
Inputs: []operand.Op{imr, mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsM64(imr) && operand.IsR64(mr):
return &intrep.Instruction{
Opcode: "ADCQ",
Operands: []operand.Op{imr, mr},
Inputs: []operand.Op{imr, mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsIMM8(imr) && operand.IsM64(mr):
return &intrep.Instruction{
Opcode: "ADCQ",
Operands: []operand.Op{imr, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsIMM32(imr) && operand.IsM64(mr):
return &intrep.Instruction{
Opcode: "ADCQ",
Operands: []operand.Op{imr, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsR64(imr) && operand.IsM64(mr):
return &intrep.Instruction{
Opcode: "ADCQ",
Operands: []operand.Op{imr, mr},
Inputs: []operand.Op{imr, mr},
Outputs: []operand.Op{mr},
}, nil
}
return nil, errors.New("ADCQ: bad operands")
}
// ADCW: Add with Carry.
//
// Forms:
//
// ADCW imm16 ax
// ADCW imm8 r16
// ADCW imm16 r16
// ADCW r16 r16
// ADCW m16 r16
// ADCW imm8 m16
// ADCW imm16 m16
// ADCW r16 m16
func ADCW(imr, amr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM16(imr) && operand.IsAX(amr):
return &intrep.Instruction{
Opcode: "ADCW",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{amr},
Outputs: []operand.Op{amr},
}, nil
case operand.IsIMM8(imr) && operand.IsR16(amr):
return &intrep.Instruction{
Opcode: "ADCW",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{amr},
Outputs: []operand.Op{amr},
}, nil
case operand.IsIMM16(imr) && operand.IsR16(amr):
return &intrep.Instruction{
Opcode: "ADCW",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{amr},
Outputs: []operand.Op{amr},
}, nil
case operand.IsR16(imr) && operand.IsR16(amr):
return &intrep.Instruction{
Opcode: "ADCW",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{imr, amr},
Outputs: []operand.Op{amr},
}, nil
case operand.IsM16(imr) && operand.IsR16(amr):
return &intrep.Instruction{
Opcode: "ADCW",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{imr, amr},
Outputs: []operand.Op{amr},
}, nil
case operand.IsIMM8(imr) && operand.IsM16(amr):
return &intrep.Instruction{
Opcode: "ADCW",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{amr},
Outputs: []operand.Op{amr},
}, nil
case operand.IsIMM16(imr) && operand.IsM16(amr):
return &intrep.Instruction{
Opcode: "ADCW",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{amr},
Outputs: []operand.Op{amr},
}, nil
case operand.IsR16(imr) && operand.IsM16(amr):
return &intrep.Instruction{
Opcode: "ADCW",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{imr, amr},
Outputs: []operand.Op{amr},
}, nil
}
return nil, errors.New("ADCW: bad operands")
}
// ADCXL: Unsigned Integer Addition of Two Operands with Carry Flag.
//
// Forms:
//
// ADCXL r32 r32
// ADCXL m32 r32
func ADCXL(mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR32(mr) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "ADCXL",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"ADX"},
}, nil
case operand.IsM32(mr) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "ADCXL",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"ADX"},
}, nil
}
return nil, errors.New("ADCXL: bad operands")
}
// ADCXQ: Unsigned Integer Addition of Two Operands with Carry Flag.
//
// Forms:
//
// ADCXQ r64 r64
// ADCXQ m64 r64
func ADCXQ(mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR64(mr) && operand.IsR64(r):
return &intrep.Instruction{
Opcode: "ADCXQ",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"ADX"},
}, nil
case operand.IsM64(mr) && operand.IsR64(r):
return &intrep.Instruction{
Opcode: "ADCXQ",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"ADX"},
}, nil
}
return nil, errors.New("ADCXQ: bad operands")
}
// ADDB: Add.
//
// Forms:
//
// ADDB imm8 al
// ADDB imm8 r8
// ADDB r8 r8
// ADDB m8 r8
// ADDB imm8 m8
// ADDB r8 m8
func ADDB(imr, amr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(imr) && operand.IsAL(amr):
return &intrep.Instruction{
Opcode: "ADDB",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{amr},
Outputs: []operand.Op{amr},
}, nil
case operand.IsIMM8(imr) && operand.IsR8(amr):
return &intrep.Instruction{
Opcode: "ADDB",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{amr},
Outputs: []operand.Op{amr},
}, nil
case operand.IsR8(imr) && operand.IsR8(amr):
return &intrep.Instruction{
Opcode: "ADDB",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{imr, amr},
Outputs: []operand.Op{amr},
}, nil
case operand.IsM8(imr) && operand.IsR8(amr):
return &intrep.Instruction{
Opcode: "ADDB",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{imr, amr},
Outputs: []operand.Op{amr},
}, nil
case operand.IsIMM8(imr) && operand.IsM8(amr):
return &intrep.Instruction{
Opcode: "ADDB",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{amr},
Outputs: []operand.Op{amr},
}, nil
case operand.IsR8(imr) && operand.IsM8(amr):
return &intrep.Instruction{
Opcode: "ADDB",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{imr, amr},
Outputs: []operand.Op{amr},
}, nil
}
return nil, errors.New("ADDB: bad operands")
}
// ADDL: Add.
//
// Forms:
//
// ADDL imm32 eax
// ADDL imm8 r32
// ADDL imm32 r32
// ADDL r32 r32
// ADDL m32 r32
// ADDL imm8 m32
// ADDL imm32 m32
// ADDL r32 m32
func ADDL(imr, emr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM32(imr) && operand.IsEAX(emr):
return &intrep.Instruction{
Opcode: "ADDL",
Operands: []operand.Op{imr, emr},
Inputs: []operand.Op{emr},
Outputs: []operand.Op{emr},
}, nil
case operand.IsIMM8(imr) && operand.IsR32(emr):
return &intrep.Instruction{
Opcode: "ADDL",
Operands: []operand.Op{imr, emr},
Inputs: []operand.Op{emr},
Outputs: []operand.Op{emr},
}, nil
case operand.IsIMM32(imr) && operand.IsR32(emr):
return &intrep.Instruction{
Opcode: "ADDL",
Operands: []operand.Op{imr, emr},
Inputs: []operand.Op{emr},
Outputs: []operand.Op{emr},
}, nil
case operand.IsR32(imr) && operand.IsR32(emr):
return &intrep.Instruction{
Opcode: "ADDL",
Operands: []operand.Op{imr, emr},
Inputs: []operand.Op{imr, emr},
Outputs: []operand.Op{emr},
}, nil
case operand.IsM32(imr) && operand.IsR32(emr):
return &intrep.Instruction{
Opcode: "ADDL",
Operands: []operand.Op{imr, emr},
Inputs: []operand.Op{imr, emr},
Outputs: []operand.Op{emr},
}, nil
case operand.IsIMM8(imr) && operand.IsM32(emr):
return &intrep.Instruction{
Opcode: "ADDL",
Operands: []operand.Op{imr, emr},
Inputs: []operand.Op{emr},
Outputs: []operand.Op{emr},
}, nil
case operand.IsIMM32(imr) && operand.IsM32(emr):
return &intrep.Instruction{
Opcode: "ADDL",
Operands: []operand.Op{imr, emr},
Inputs: []operand.Op{emr},
Outputs: []operand.Op{emr},
}, nil
case operand.IsR32(imr) && operand.IsM32(emr):
return &intrep.Instruction{
Opcode: "ADDL",
Operands: []operand.Op{imr, emr},
Inputs: []operand.Op{imr, emr},
Outputs: []operand.Op{emr},
}, nil
}
return nil, errors.New("ADDL: bad operands")
}
// ADDPD: Add Packed Double-Precision Floating-Point Values.
//
// Forms:
//
// ADDPD xmm xmm
// ADDPD m128 xmm
func ADDPD(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "ADDPD",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "ADDPD",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("ADDPD: bad operands")
}
// ADDPS: Add Packed Single-Precision Floating-Point Values.
//
// Forms:
//
// ADDPS xmm xmm
// ADDPS m128 xmm
func ADDPS(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "ADDPS",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "ADDPS",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE"},
}, nil
}
return nil, errors.New("ADDPS: bad operands")
}
// ADDQ: Add.
//
// Forms:
//
// ADDQ imm32 rax
// ADDQ imm8 r64
// ADDQ imm32 r64
// ADDQ r64 r64
// ADDQ m64 r64
// ADDQ imm8 m64
// ADDQ imm32 m64
// ADDQ r64 m64
func ADDQ(imr, mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM32(imr) && operand.IsRAX(mr):
return &intrep.Instruction{
Opcode: "ADDQ",
Operands: []operand.Op{imr, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsIMM8(imr) && operand.IsR64(mr):
return &intrep.Instruction{
Opcode: "ADDQ",
Operands: []operand.Op{imr, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsIMM32(imr) && operand.IsR64(mr):
return &intrep.Instruction{
Opcode: "ADDQ",
Operands: []operand.Op{imr, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsR64(imr) && operand.IsR64(mr):
return &intrep.Instruction{
Opcode: "ADDQ",
Operands: []operand.Op{imr, mr},
Inputs: []operand.Op{imr, mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsM64(imr) && operand.IsR64(mr):
return &intrep.Instruction{
Opcode: "ADDQ",
Operands: []operand.Op{imr, mr},
Inputs: []operand.Op{imr, mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsIMM8(imr) && operand.IsM64(mr):
return &intrep.Instruction{
Opcode: "ADDQ",
Operands: []operand.Op{imr, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsIMM32(imr) && operand.IsM64(mr):
return &intrep.Instruction{
Opcode: "ADDQ",
Operands: []operand.Op{imr, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsR64(imr) && operand.IsM64(mr):
return &intrep.Instruction{
Opcode: "ADDQ",
Operands: []operand.Op{imr, mr},
Inputs: []operand.Op{imr, mr},
Outputs: []operand.Op{mr},
}, nil
}
return nil, errors.New("ADDQ: bad operands")
}
// ADDSD: Add Scalar Double-Precision Floating-Point Values.
//
// Forms:
//
// ADDSD xmm xmm
// ADDSD m64 xmm
func ADDSD(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "ADDSD",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
case operand.IsM64(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "ADDSD",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("ADDSD: bad operands")
}
// ADDSS: Add Scalar Single-Precision Floating-Point Values.
//
// Forms:
//
// ADDSS xmm xmm
// ADDSS m32 xmm
func ADDSS(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "ADDSS",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE"},
}, nil
case operand.IsM32(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "ADDSS",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE"},
}, nil
}
return nil, errors.New("ADDSS: bad operands")
}
// ADDSUBPD: Packed Double-FP Add/Subtract.
//
// Forms:
//
// ADDSUBPD xmm xmm
// ADDSUBPD m128 xmm
func ADDSUBPD(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "ADDSUBPD",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE3"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "ADDSUBPD",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE3"},
}, nil
}
return nil, errors.New("ADDSUBPD: bad operands")
}
// ADDSUBPS: Packed Single-FP Add/Subtract.
//
// Forms:
//
// ADDSUBPS xmm xmm
// ADDSUBPS m128 xmm
func ADDSUBPS(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "ADDSUBPS",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE3"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "ADDSUBPS",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE3"},
}, nil
}
return nil, errors.New("ADDSUBPS: bad operands")
}
// ADDW: Add.
//
// Forms:
//
// ADDW imm16 ax
// ADDW imm8 r16
// ADDW imm16 r16
// ADDW r16 r16
// ADDW m16 r16
// ADDW imm8 m16
// ADDW imm16 m16
// ADDW r16 m16
func ADDW(imr, amr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM16(imr) && operand.IsAX(amr):
return &intrep.Instruction{
Opcode: "ADDW",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{amr},
Outputs: []operand.Op{amr},
}, nil
case operand.IsIMM8(imr) && operand.IsR16(amr):
return &intrep.Instruction{
Opcode: "ADDW",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{amr},
Outputs: []operand.Op{amr},
}, nil
case operand.IsIMM16(imr) && operand.IsR16(amr):
return &intrep.Instruction{
Opcode: "ADDW",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{amr},
Outputs: []operand.Op{amr},
}, nil
case operand.IsR16(imr) && operand.IsR16(amr):
return &intrep.Instruction{
Opcode: "ADDW",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{imr, amr},
Outputs: []operand.Op{amr},
}, nil
case operand.IsM16(imr) && operand.IsR16(amr):
return &intrep.Instruction{
Opcode: "ADDW",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{imr, amr},
Outputs: []operand.Op{amr},
}, nil
case operand.IsIMM8(imr) && operand.IsM16(amr):
return &intrep.Instruction{
Opcode: "ADDW",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{amr},
Outputs: []operand.Op{amr},
}, nil
case operand.IsIMM16(imr) && operand.IsM16(amr):
return &intrep.Instruction{
Opcode: "ADDW",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{amr},
Outputs: []operand.Op{amr},
}, nil
case operand.IsR16(imr) && operand.IsM16(amr):
return &intrep.Instruction{
Opcode: "ADDW",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{imr, amr},
Outputs: []operand.Op{amr},
}, nil
}
return nil, errors.New("ADDW: bad operands")
}
// ADOXL: Unsigned Integer Addition of Two Operands with Overflow Flag.
//
// Forms:
//
// ADOXL r32 r32
// ADOXL m32 r32
func ADOXL(mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR32(mr) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "ADOXL",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"ADX"},
}, nil
case operand.IsM32(mr) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "ADOXL",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"ADX"},
}, nil
}
return nil, errors.New("ADOXL: bad operands")
}
// ADOXQ: Unsigned Integer Addition of Two Operands with Overflow Flag.
//
// Forms:
//
// ADOXQ r64 r64
// ADOXQ m64 r64
func ADOXQ(mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR64(mr) && operand.IsR64(r):
return &intrep.Instruction{
Opcode: "ADOXQ",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"ADX"},
}, nil
case operand.IsM64(mr) && operand.IsR64(r):
return &intrep.Instruction{
Opcode: "ADOXQ",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"ADX"},
}, nil
}
return nil, errors.New("ADOXQ: bad operands")
}
// AESDEC: Perform One Round of an AES Decryption Flow.
//
// Forms:
//
// AESDEC xmm xmm
// AESDEC m128 xmm
func AESDEC(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "AESDEC",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"AES"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "AESDEC",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"AES"},
}, nil
}
return nil, errors.New("AESDEC: bad operands")
}
// AESDECLAST: Perform Last Round of an AES Decryption Flow.
//
// Forms:
//
// AESDECLAST xmm xmm
// AESDECLAST m128 xmm
func AESDECLAST(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "AESDECLAST",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"AES"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "AESDECLAST",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"AES"},
}, nil
}
return nil, errors.New("AESDECLAST: bad operands")
}
// AESENC: Perform One Round of an AES Encryption Flow.
//
// Forms:
//
// AESENC xmm xmm
// AESENC m128 xmm
func AESENC(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "AESENC",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"AES"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "AESENC",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"AES"},
}, nil
}
return nil, errors.New("AESENC: bad operands")
}
// AESENCLAST: Perform Last Round of an AES Encryption Flow.
//
// Forms:
//
// AESENCLAST xmm xmm
// AESENCLAST m128 xmm
func AESENCLAST(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "AESENCLAST",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"AES"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "AESENCLAST",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"AES"},
}, nil
}
return nil, errors.New("AESENCLAST: bad operands")
}
// AESIMC: Perform the AES InvMixColumn Transformation.
//
// Forms:
//
// AESIMC xmm xmm
// AESIMC m128 xmm
func AESIMC(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "AESIMC",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"AES"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "AESIMC",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"AES"},
}, nil
}
return nil, errors.New("AESIMC: bad operands")
}
// AESKEYGENASSIST: AES Round Key Generation Assist.
//
// Forms:
//
// AESKEYGENASSIST imm8 xmm xmm
// AESKEYGENASSIST imm8 m128 xmm
func AESKEYGENASSIST(i, mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(i) && operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "AESKEYGENASSIST",
Operands: []operand.Op{i, mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"AES"},
}, nil
case operand.IsIMM8(i) && operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "AESKEYGENASSIST",
Operands: []operand.Op{i, mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"AES"},
}, nil
}
return nil, errors.New("AESKEYGENASSIST: bad operands")
}
// ANDB: Logical AND.
//
// Forms:
//
// ANDB imm8 al
// ANDB imm8 r8
// ANDB r8 r8
// ANDB m8 r8
// ANDB imm8 m8
// ANDB r8 m8
func ANDB(imr, amr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(imr) && operand.IsAL(amr):
return &intrep.Instruction{
Opcode: "ANDB",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{amr},
Outputs: []operand.Op{amr},
}, nil
case operand.IsIMM8(imr) && operand.IsR8(amr):
return &intrep.Instruction{
Opcode: "ANDB",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{amr},
Outputs: []operand.Op{amr},
}, nil
case operand.IsR8(imr) && operand.IsR8(amr):
return &intrep.Instruction{
Opcode: "ANDB",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{imr, amr},
Outputs: []operand.Op{amr},
}, nil
case operand.IsM8(imr) && operand.IsR8(amr):
return &intrep.Instruction{
Opcode: "ANDB",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{imr, amr},
Outputs: []operand.Op{amr},
}, nil
case operand.IsIMM8(imr) && operand.IsM8(amr):
return &intrep.Instruction{
Opcode: "ANDB",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{amr},
Outputs: []operand.Op{amr},
}, nil
case operand.IsR8(imr) && operand.IsM8(amr):
return &intrep.Instruction{
Opcode: "ANDB",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{imr, amr},
Outputs: []operand.Op{amr},
}, nil
}
return nil, errors.New("ANDB: bad operands")
}
// ANDL: Logical AND.
//
// Forms:
//
// ANDL imm32 eax
// ANDL imm8 r32
// ANDL imm32 r32
// ANDL r32 r32
// ANDL m32 r32
// ANDL imm8 m32
// ANDL imm32 m32
// ANDL r32 m32
func ANDL(imr, emr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM32(imr) && operand.IsEAX(emr):
return &intrep.Instruction{
Opcode: "ANDL",
Operands: []operand.Op{imr, emr},
Inputs: []operand.Op{emr},
Outputs: []operand.Op{emr},
}, nil
case operand.IsIMM8(imr) && operand.IsR32(emr):
return &intrep.Instruction{
Opcode: "ANDL",
Operands: []operand.Op{imr, emr},
Inputs: []operand.Op{emr},
Outputs: []operand.Op{emr},
}, nil
case operand.IsIMM32(imr) && operand.IsR32(emr):
return &intrep.Instruction{
Opcode: "ANDL",
Operands: []operand.Op{imr, emr},
Inputs: []operand.Op{emr},
Outputs: []operand.Op{emr},
}, nil
case operand.IsR32(imr) && operand.IsR32(emr):
return &intrep.Instruction{
Opcode: "ANDL",
Operands: []operand.Op{imr, emr},
Inputs: []operand.Op{imr, emr},
Outputs: []operand.Op{emr},
}, nil
case operand.IsM32(imr) && operand.IsR32(emr):
return &intrep.Instruction{
Opcode: "ANDL",
Operands: []operand.Op{imr, emr},
Inputs: []operand.Op{imr, emr},
Outputs: []operand.Op{emr},
}, nil
case operand.IsIMM8(imr) && operand.IsM32(emr):
return &intrep.Instruction{
Opcode: "ANDL",
Operands: []operand.Op{imr, emr},
Inputs: []operand.Op{emr},
Outputs: []operand.Op{emr},
}, nil
case operand.IsIMM32(imr) && operand.IsM32(emr):
return &intrep.Instruction{
Opcode: "ANDL",
Operands: []operand.Op{imr, emr},
Inputs: []operand.Op{emr},
Outputs: []operand.Op{emr},
}, nil
case operand.IsR32(imr) && operand.IsM32(emr):
return &intrep.Instruction{
Opcode: "ANDL",
Operands: []operand.Op{imr, emr},
Inputs: []operand.Op{imr, emr},
Outputs: []operand.Op{emr},
}, nil
}
return nil, errors.New("ANDL: bad operands")
}
// ANDNL: Logical AND NOT.
//
// Forms:
//
// ANDNL r32 r32 r32
// ANDNL m32 r32 r32
func ANDNL(mr, r, r1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR32(mr) && operand.IsR32(r) && operand.IsR32(r1):
return &intrep.Instruction{
Opcode: "ANDNL",
Operands: []operand.Op{mr, r, r1},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r1},
ISA: []string{"BMI"},
CancellingInputs: true,
}, nil
case operand.IsM32(mr) && operand.IsR32(r) && operand.IsR32(r1):
return &intrep.Instruction{
Opcode: "ANDNL",
Operands: []operand.Op{mr, r, r1},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r1},
ISA: []string{"BMI"},
}, nil
}
return nil, errors.New("ANDNL: bad operands")
}
// ANDNPD: Bitwise Logical AND NOT of Packed Double-Precision Floating-Point Values.
//
// Forms:
//
// ANDNPD xmm xmm
// ANDNPD m128 xmm
func ANDNPD(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "ANDNPD",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
CancellingInputs: true,
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "ANDNPD",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("ANDNPD: bad operands")
}
// ANDNPS: Bitwise Logical AND NOT of Packed Single-Precision Floating-Point Values.
//
// Forms:
//
// ANDNPS xmm xmm
// ANDNPS m128 xmm
func ANDNPS(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "ANDNPS",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE"},
CancellingInputs: true,
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "ANDNPS",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE"},
}, nil
}
return nil, errors.New("ANDNPS: bad operands")
}
// ANDNQ: Logical AND NOT.
//
// Forms:
//
// ANDNQ r64 r64 r64
// ANDNQ m64 r64 r64
func ANDNQ(mr, r, r1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR64(mr) && operand.IsR64(r) && operand.IsR64(r1):
return &intrep.Instruction{
Opcode: "ANDNQ",
Operands: []operand.Op{mr, r, r1},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r1},
ISA: []string{"BMI"},
CancellingInputs: true,
}, nil
case operand.IsM64(mr) && operand.IsR64(r) && operand.IsR64(r1):
return &intrep.Instruction{
Opcode: "ANDNQ",
Operands: []operand.Op{mr, r, r1},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r1},
ISA: []string{"BMI"},
}, nil
}
return nil, errors.New("ANDNQ: bad operands")
}
// ANDPD: Bitwise Logical AND of Packed Double-Precision Floating-Point Values.
//
// Forms:
//
// ANDPD xmm xmm
// ANDPD m128 xmm
func ANDPD(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "ANDPD",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "ANDPD",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("ANDPD: bad operands")
}
// ANDPS: Bitwise Logical AND of Packed Single-Precision Floating-Point Values.
//
// Forms:
//
// ANDPS xmm xmm
// ANDPS m128 xmm
func ANDPS(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "ANDPS",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "ANDPS",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE"},
}, nil
}
return nil, errors.New("ANDPS: bad operands")
}
// ANDQ: Logical AND.
//
// Forms:
//
// ANDQ imm32 rax
// ANDQ imm8 r64
// ANDQ imm32 r64
// ANDQ r64 r64
// ANDQ m64 r64
// ANDQ imm8 m64
// ANDQ imm32 m64
// ANDQ r64 m64
func ANDQ(imr, mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM32(imr) && operand.IsRAX(mr):
return &intrep.Instruction{
Opcode: "ANDQ",
Operands: []operand.Op{imr, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsIMM8(imr) && operand.IsR64(mr):
return &intrep.Instruction{
Opcode: "ANDQ",
Operands: []operand.Op{imr, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsIMM32(imr) && operand.IsR64(mr):
return &intrep.Instruction{
Opcode: "ANDQ",
Operands: []operand.Op{imr, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsR64(imr) && operand.IsR64(mr):
return &intrep.Instruction{
Opcode: "ANDQ",
Operands: []operand.Op{imr, mr},
Inputs: []operand.Op{imr, mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsM64(imr) && operand.IsR64(mr):
return &intrep.Instruction{
Opcode: "ANDQ",
Operands: []operand.Op{imr, mr},
Inputs: []operand.Op{imr, mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsIMM8(imr) && operand.IsM64(mr):
return &intrep.Instruction{
Opcode: "ANDQ",
Operands: []operand.Op{imr, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsIMM32(imr) && operand.IsM64(mr):
return &intrep.Instruction{
Opcode: "ANDQ",
Operands: []operand.Op{imr, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsR64(imr) && operand.IsM64(mr):
return &intrep.Instruction{
Opcode: "ANDQ",
Operands: []operand.Op{imr, mr},
Inputs: []operand.Op{imr, mr},
Outputs: []operand.Op{mr},
}, nil
}
return nil, errors.New("ANDQ: bad operands")
}
// ANDW: Logical AND.
//
// Forms:
//
// ANDW imm16 ax
// ANDW imm8 r16
// ANDW imm16 r16
// ANDW r16 r16
// ANDW m16 r16
// ANDW imm8 m16
// ANDW imm16 m16
// ANDW r16 m16
func ANDW(imr, amr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM16(imr) && operand.IsAX(amr):
return &intrep.Instruction{
Opcode: "ANDW",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{amr},
Outputs: []operand.Op{amr},
}, nil
case operand.IsIMM8(imr) && operand.IsR16(amr):
return &intrep.Instruction{
Opcode: "ANDW",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{amr},
Outputs: []operand.Op{amr},
}, nil
case operand.IsIMM16(imr) && operand.IsR16(amr):
return &intrep.Instruction{
Opcode: "ANDW",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{amr},
Outputs: []operand.Op{amr},
}, nil
case operand.IsR16(imr) && operand.IsR16(amr):
return &intrep.Instruction{
Opcode: "ANDW",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{imr, amr},
Outputs: []operand.Op{amr},
}, nil
case operand.IsM16(imr) && operand.IsR16(amr):
return &intrep.Instruction{
Opcode: "ANDW",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{imr, amr},
Outputs: []operand.Op{amr},
}, nil
case operand.IsIMM8(imr) && operand.IsM16(amr):
return &intrep.Instruction{
Opcode: "ANDW",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{amr},
Outputs: []operand.Op{amr},
}, nil
case operand.IsIMM16(imr) && operand.IsM16(amr):
return &intrep.Instruction{
Opcode: "ANDW",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{amr},
Outputs: []operand.Op{amr},
}, nil
case operand.IsR16(imr) && operand.IsM16(amr):
return &intrep.Instruction{
Opcode: "ANDW",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{imr, amr},
Outputs: []operand.Op{amr},
}, nil
}
return nil, errors.New("ANDW: bad operands")
}
// BEXTRL: Bit Field Extract.
//
// Forms:
//
// BEXTRL r32 r32 r32
// BEXTRL r32 m32 r32
func BEXTRL(r, mr, r1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR32(r) && operand.IsR32(mr) && operand.IsR32(r1):
return &intrep.Instruction{
Opcode: "BEXTRL",
Operands: []operand.Op{r, mr, r1},
Inputs: []operand.Op{r, mr},
Outputs: []operand.Op{r1},
ISA: []string{"BMI"},
}, nil
case operand.IsR32(r) && operand.IsM32(mr) && operand.IsR32(r1):
return &intrep.Instruction{
Opcode: "BEXTRL",
Operands: []operand.Op{r, mr, r1},
Inputs: []operand.Op{r, mr},
Outputs: []operand.Op{r1},
ISA: []string{"BMI"},
}, nil
}
return nil, errors.New("BEXTRL: bad operands")
}
// BEXTRQ: Bit Field Extract.
//
// Forms:
//
// BEXTRQ r64 r64 r64
// BEXTRQ r64 m64 r64
func BEXTRQ(r, mr, r1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR64(r) && operand.IsR64(mr) && operand.IsR64(r1):
return &intrep.Instruction{
Opcode: "BEXTRQ",
Operands: []operand.Op{r, mr, r1},
Inputs: []operand.Op{r, mr},
Outputs: []operand.Op{r1},
ISA: []string{"BMI"},
}, nil
case operand.IsR64(r) && operand.IsM64(mr) && operand.IsR64(r1):
return &intrep.Instruction{
Opcode: "BEXTRQ",
Operands: []operand.Op{r, mr, r1},
Inputs: []operand.Op{r, mr},
Outputs: []operand.Op{r1},
ISA: []string{"BMI"},
}, nil
}
return nil, errors.New("BEXTRQ: bad operands")
}
// BLENDPD: Blend Packed Double Precision Floating-Point Values.
//
// Forms:
//
// BLENDPD imm8 xmm xmm
// BLENDPD imm8 m128 xmm
func BLENDPD(i, mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(i) && operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "BLENDPD",
Operands: []operand.Op{i, mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE4.1"},
}, nil
case operand.IsIMM8(i) && operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "BLENDPD",
Operands: []operand.Op{i, mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE4.1"},
}, nil
}
return nil, errors.New("BLENDPD: bad operands")
}
// BLENDPS: Blend Packed Single Precision Floating-Point Values.
//
// Forms:
//
// BLENDPS imm8 xmm xmm
// BLENDPS imm8 m128 xmm
func BLENDPS(i, mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(i) && operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "BLENDPS",
Operands: []operand.Op{i, mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE4.1"},
}, nil
case operand.IsIMM8(i) && operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "BLENDPS",
Operands: []operand.Op{i, mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE4.1"},
}, nil
}
return nil, errors.New("BLENDPS: bad operands")
}
// BLENDVPD: Variable Blend Packed Double Precision Floating-Point Values.
//
// Forms:
//
// BLENDVPD xmm0 xmm xmm
// BLENDVPD xmm0 m128 xmm
func BLENDVPD(x, mx, x1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM0(x) && operand.IsXMM(mx) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "BLENDVPD",
Operands: []operand.Op{x, mx, x1},
Inputs: []operand.Op{x, mx, x1},
Outputs: []operand.Op{x1},
ISA: []string{"SSE4.1"},
}, nil
case operand.IsXMM0(x) && operand.IsM128(mx) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "BLENDVPD",
Operands: []operand.Op{x, mx, x1},
Inputs: []operand.Op{x, mx, x1},
Outputs: []operand.Op{x1},
ISA: []string{"SSE4.1"},
}, nil
}
return nil, errors.New("BLENDVPD: bad operands")
}
// BLENDVPS: Variable Blend Packed Single Precision Floating-Point Values.
//
// Forms:
//
// BLENDVPS xmm0 xmm xmm
// BLENDVPS xmm0 m128 xmm
func BLENDVPS(x, mx, x1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM0(x) && operand.IsXMM(mx) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "BLENDVPS",
Operands: []operand.Op{x, mx, x1},
Inputs: []operand.Op{x, mx, x1},
Outputs: []operand.Op{x1},
ISA: []string{"SSE4.1"},
}, nil
case operand.IsXMM0(x) && operand.IsM128(mx) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "BLENDVPS",
Operands: []operand.Op{x, mx, x1},
Inputs: []operand.Op{x, mx, x1},
Outputs: []operand.Op{x1},
ISA: []string{"SSE4.1"},
}, nil
}
return nil, errors.New("BLENDVPS: bad operands")
}
// BLSIL: Isolate Lowest Set Bit.
//
// Forms:
//
// BLSIL r32 r32
// BLSIL m32 r32
func BLSIL(mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR32(mr) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "BLSIL",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{r},
ISA: []string{"BMI"},
}, nil
case operand.IsM32(mr) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "BLSIL",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{r},
ISA: []string{"BMI"},
}, nil
}
return nil, errors.New("BLSIL: bad operands")
}
// BLSIQ: Isolate Lowest Set Bit.
//
// Forms:
//
// BLSIQ r64 r64
// BLSIQ m64 r64
func BLSIQ(mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR64(mr) && operand.IsR64(r):
return &intrep.Instruction{
Opcode: "BLSIQ",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{r},
ISA: []string{"BMI"},
}, nil
case operand.IsM64(mr) && operand.IsR64(r):
return &intrep.Instruction{
Opcode: "BLSIQ",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{r},
ISA: []string{"BMI"},
}, nil
}
return nil, errors.New("BLSIQ: bad operands")
}
// BLSMSKL: Mask From Lowest Set Bit.
//
// Forms:
//
// BLSMSKL r32 r32
// BLSMSKL m32 r32
func BLSMSKL(mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR32(mr) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "BLSMSKL",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{r},
ISA: []string{"BMI"},
}, nil
case operand.IsM32(mr) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "BLSMSKL",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{r},
ISA: []string{"BMI"},
}, nil
}
return nil, errors.New("BLSMSKL: bad operands")
}
// BLSMSKQ: Mask From Lowest Set Bit.
//
// Forms:
//
// BLSMSKQ r64 r64
// BLSMSKQ m64 r64
func BLSMSKQ(mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR64(mr) && operand.IsR64(r):
return &intrep.Instruction{
Opcode: "BLSMSKQ",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{r},
ISA: []string{"BMI"},
}, nil
case operand.IsM64(mr) && operand.IsR64(r):
return &intrep.Instruction{
Opcode: "BLSMSKQ",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{r},
ISA: []string{"BMI"},
}, nil
}
return nil, errors.New("BLSMSKQ: bad operands")
}
// BLSRL: Reset Lowest Set Bit.
//
// Forms:
//
// BLSRL r32 r32
// BLSRL m32 r32
func BLSRL(mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR32(mr) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "BLSRL",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{r},
ISA: []string{"BMI"},
}, nil
case operand.IsM32(mr) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "BLSRL",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{r},
ISA: []string{"BMI"},
}, nil
}
return nil, errors.New("BLSRL: bad operands")
}
// BLSRQ: Reset Lowest Set Bit.
//
// Forms:
//
// BLSRQ r64 r64
// BLSRQ m64 r64
func BLSRQ(mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR64(mr) && operand.IsR64(r):
return &intrep.Instruction{
Opcode: "BLSRQ",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{r},
ISA: []string{"BMI"},
}, nil
case operand.IsM64(mr) && operand.IsR64(r):
return &intrep.Instruction{
Opcode: "BLSRQ",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{r},
ISA: []string{"BMI"},
}, nil
}
return nil, errors.New("BLSRQ: bad operands")
}
// BSFL: Bit Scan Forward.
//
// Forms:
//
// BSFL r32 r32
// BSFL m32 r32
func BSFL(mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR32(mr) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "BSFL",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
}, nil
case operand.IsM32(mr) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "BSFL",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
}, nil
}
return nil, errors.New("BSFL: bad operands")
}
// BSFQ: Bit Scan Forward.
//
// Forms:
//
// BSFQ r64 r64
// BSFQ m64 r64
func BSFQ(mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR64(mr) && operand.IsR64(r):
return &intrep.Instruction{
Opcode: "BSFQ",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
}, nil
case operand.IsM64(mr) && operand.IsR64(r):
return &intrep.Instruction{
Opcode: "BSFQ",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
}, nil
}
return nil, errors.New("BSFQ: bad operands")
}
// BSFW: Bit Scan Forward.
//
// Forms:
//
// BSFW r16 r16
// BSFW m16 r16
func BSFW(mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR16(mr) && operand.IsR16(r):
return &intrep.Instruction{
Opcode: "BSFW",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
}, nil
case operand.IsM16(mr) && operand.IsR16(r):
return &intrep.Instruction{
Opcode: "BSFW",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
}, nil
}
return nil, errors.New("BSFW: bad operands")
}
// BSRL: Bit Scan Reverse.
//
// Forms:
//
// BSRL r32 r32
// BSRL m32 r32
func BSRL(mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR32(mr) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "BSRL",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
}, nil
case operand.IsM32(mr) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "BSRL",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
}, nil
}
return nil, errors.New("BSRL: bad operands")
}
// BSRQ: Bit Scan Reverse.
//
// Forms:
//
// BSRQ r64 r64
// BSRQ m64 r64
func BSRQ(mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR64(mr) && operand.IsR64(r):
return &intrep.Instruction{
Opcode: "BSRQ",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
}, nil
case operand.IsM64(mr) && operand.IsR64(r):
return &intrep.Instruction{
Opcode: "BSRQ",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
}, nil
}
return nil, errors.New("BSRQ: bad operands")
}
// BSRW: Bit Scan Reverse.
//
// Forms:
//
// BSRW r16 r16
// BSRW m16 r16
func BSRW(mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR16(mr) && operand.IsR16(r):
return &intrep.Instruction{
Opcode: "BSRW",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
}, nil
case operand.IsM16(mr) && operand.IsR16(r):
return &intrep.Instruction{
Opcode: "BSRW",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
}, nil
}
return nil, errors.New("BSRW: bad operands")
}
// BSWAPL: Byte Swap.
//
// Forms:
//
// BSWAPL r32
func BSWAPL(r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR32(r):
return &intrep.Instruction{
Opcode: "BSWAPL",
Operands: []operand.Op{r},
Inputs: []operand.Op{r},
Outputs: []operand.Op{r},
}, nil
}
return nil, errors.New("BSWAPL: bad operands")
}
// BSWAPQ: Byte Swap.
//
// Forms:
//
// BSWAPQ r64
func BSWAPQ(r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR64(r):
return &intrep.Instruction{
Opcode: "BSWAPQ",
Operands: []operand.Op{r},
Inputs: []operand.Op{r},
Outputs: []operand.Op{r},
}, nil
}
return nil, errors.New("BSWAPQ: bad operands")
}
// BTCL: Bit Test and Complement.
//
// Forms:
//
// BTCL imm8 r32
// BTCL r32 r32
// BTCL imm8 m32
// BTCL r32 m32
func BTCL(ir, mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(ir) && operand.IsR32(mr):
return &intrep.Instruction{
Opcode: "BTCL",
Operands: []operand.Op{ir, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsR32(ir) && operand.IsR32(mr):
return &intrep.Instruction{
Opcode: "BTCL",
Operands: []operand.Op{ir, mr},
Inputs: []operand.Op{ir, mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsIMM8(ir) && operand.IsM32(mr):
return &intrep.Instruction{
Opcode: "BTCL",
Operands: []operand.Op{ir, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsR32(ir) && operand.IsM32(mr):
return &intrep.Instruction{
Opcode: "BTCL",
Operands: []operand.Op{ir, mr},
Inputs: []operand.Op{ir, mr},
Outputs: []operand.Op{mr},
}, nil
}
return nil, errors.New("BTCL: bad operands")
}
// BTCQ: Bit Test and Complement.
//
// Forms:
//
// BTCQ imm8 r64
// BTCQ r64 r64
// BTCQ imm8 m64
// BTCQ r64 m64
func BTCQ(ir, mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(ir) && operand.IsR64(mr):
return &intrep.Instruction{
Opcode: "BTCQ",
Operands: []operand.Op{ir, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsR64(ir) && operand.IsR64(mr):
return &intrep.Instruction{
Opcode: "BTCQ",
Operands: []operand.Op{ir, mr},
Inputs: []operand.Op{ir, mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsIMM8(ir) && operand.IsM64(mr):
return &intrep.Instruction{
Opcode: "BTCQ",
Operands: []operand.Op{ir, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsR64(ir) && operand.IsM64(mr):
return &intrep.Instruction{
Opcode: "BTCQ",
Operands: []operand.Op{ir, mr},
Inputs: []operand.Op{ir, mr},
Outputs: []operand.Op{mr},
}, nil
}
return nil, errors.New("BTCQ: bad operands")
}
// BTCW: Bit Test and Complement.
//
// Forms:
//
// BTCW imm8 r16
// BTCW r16 r16
// BTCW imm8 m16
// BTCW r16 m16
func BTCW(ir, mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(ir) && operand.IsR16(mr):
return &intrep.Instruction{
Opcode: "BTCW",
Operands: []operand.Op{ir, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsR16(ir) && operand.IsR16(mr):
return &intrep.Instruction{
Opcode: "BTCW",
Operands: []operand.Op{ir, mr},
Inputs: []operand.Op{ir, mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsIMM8(ir) && operand.IsM16(mr):
return &intrep.Instruction{
Opcode: "BTCW",
Operands: []operand.Op{ir, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsR16(ir) && operand.IsM16(mr):
return &intrep.Instruction{
Opcode: "BTCW",
Operands: []operand.Op{ir, mr},
Inputs: []operand.Op{ir, mr},
Outputs: []operand.Op{mr},
}, nil
}
return nil, errors.New("BTCW: bad operands")
}
// BTL: Bit Test.
//
// Forms:
//
// BTL imm8 r32
// BTL r32 r32
// BTL imm8 m32
// BTL r32 m32
func BTL(ir, mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(ir) && operand.IsR32(mr):
return &intrep.Instruction{
Opcode: "BTL",
Operands: []operand.Op{ir, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{},
}, nil
case operand.IsR32(ir) && operand.IsR32(mr):
return &intrep.Instruction{
Opcode: "BTL",
Operands: []operand.Op{ir, mr},
Inputs: []operand.Op{ir, mr},
Outputs: []operand.Op{},
}, nil
case operand.IsIMM8(ir) && operand.IsM32(mr):
return &intrep.Instruction{
Opcode: "BTL",
Operands: []operand.Op{ir, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{},
}, nil
case operand.IsR32(ir) && operand.IsM32(mr):
return &intrep.Instruction{
Opcode: "BTL",
Operands: []operand.Op{ir, mr},
Inputs: []operand.Op{ir, mr},
Outputs: []operand.Op{},
}, nil
}
return nil, errors.New("BTL: bad operands")
}
// BTQ: Bit Test.
//
// Forms:
//
// BTQ imm8 r64
// BTQ r64 r64
// BTQ imm8 m64
// BTQ r64 m64
func BTQ(ir, mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(ir) && operand.IsR64(mr):
return &intrep.Instruction{
Opcode: "BTQ",
Operands: []operand.Op{ir, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{},
}, nil
case operand.IsR64(ir) && operand.IsR64(mr):
return &intrep.Instruction{
Opcode: "BTQ",
Operands: []operand.Op{ir, mr},
Inputs: []operand.Op{ir, mr},
Outputs: []operand.Op{},
}, nil
case operand.IsIMM8(ir) && operand.IsM64(mr):
return &intrep.Instruction{
Opcode: "BTQ",
Operands: []operand.Op{ir, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{},
}, nil
case operand.IsR64(ir) && operand.IsM64(mr):
return &intrep.Instruction{
Opcode: "BTQ",
Operands: []operand.Op{ir, mr},
Inputs: []operand.Op{ir, mr},
Outputs: []operand.Op{},
}, nil
}
return nil, errors.New("BTQ: bad operands")
}
// BTRL: Bit Test and Reset.
//
// Forms:
//
// BTRL imm8 r32
// BTRL r32 r32
// BTRL imm8 m32
// BTRL r32 m32
func BTRL(ir, mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(ir) && operand.IsR32(mr):
return &intrep.Instruction{
Opcode: "BTRL",
Operands: []operand.Op{ir, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsR32(ir) && operand.IsR32(mr):
return &intrep.Instruction{
Opcode: "BTRL",
Operands: []operand.Op{ir, mr},
Inputs: []operand.Op{ir, mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsIMM8(ir) && operand.IsM32(mr):
return &intrep.Instruction{
Opcode: "BTRL",
Operands: []operand.Op{ir, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsR32(ir) && operand.IsM32(mr):
return &intrep.Instruction{
Opcode: "BTRL",
Operands: []operand.Op{ir, mr},
Inputs: []operand.Op{ir, mr},
Outputs: []operand.Op{mr},
}, nil
}
return nil, errors.New("BTRL: bad operands")
}
// BTRQ: Bit Test and Reset.
//
// Forms:
//
// BTRQ imm8 r64
// BTRQ r64 r64
// BTRQ imm8 m64
// BTRQ r64 m64
func BTRQ(ir, mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(ir) && operand.IsR64(mr):
return &intrep.Instruction{
Opcode: "BTRQ",
Operands: []operand.Op{ir, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsR64(ir) && operand.IsR64(mr):
return &intrep.Instruction{
Opcode: "BTRQ",
Operands: []operand.Op{ir, mr},
Inputs: []operand.Op{ir, mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsIMM8(ir) && operand.IsM64(mr):
return &intrep.Instruction{
Opcode: "BTRQ",
Operands: []operand.Op{ir, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsR64(ir) && operand.IsM64(mr):
return &intrep.Instruction{
Opcode: "BTRQ",
Operands: []operand.Op{ir, mr},
Inputs: []operand.Op{ir, mr},
Outputs: []operand.Op{mr},
}, nil
}
return nil, errors.New("BTRQ: bad operands")
}
// BTRW: Bit Test and Reset.
//
// Forms:
//
// BTRW imm8 r16
// BTRW r16 r16
// BTRW imm8 m16
// BTRW r16 m16
func BTRW(ir, mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(ir) && operand.IsR16(mr):
return &intrep.Instruction{
Opcode: "BTRW",
Operands: []operand.Op{ir, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsR16(ir) && operand.IsR16(mr):
return &intrep.Instruction{
Opcode: "BTRW",
Operands: []operand.Op{ir, mr},
Inputs: []operand.Op{ir, mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsIMM8(ir) && operand.IsM16(mr):
return &intrep.Instruction{
Opcode: "BTRW",
Operands: []operand.Op{ir, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsR16(ir) && operand.IsM16(mr):
return &intrep.Instruction{
Opcode: "BTRW",
Operands: []operand.Op{ir, mr},
Inputs: []operand.Op{ir, mr},
Outputs: []operand.Op{mr},
}, nil
}
return nil, errors.New("BTRW: bad operands")
}
// BTSL: Bit Test and Set.
//
// Forms:
//
// BTSL imm8 r32
// BTSL r32 r32
// BTSL imm8 m32
// BTSL r32 m32
func BTSL(ir, mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(ir) && operand.IsR32(mr):
return &intrep.Instruction{
Opcode: "BTSL",
Operands: []operand.Op{ir, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsR32(ir) && operand.IsR32(mr):
return &intrep.Instruction{
Opcode: "BTSL",
Operands: []operand.Op{ir, mr},
Inputs: []operand.Op{ir, mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsIMM8(ir) && operand.IsM32(mr):
return &intrep.Instruction{
Opcode: "BTSL",
Operands: []operand.Op{ir, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsR32(ir) && operand.IsM32(mr):
return &intrep.Instruction{
Opcode: "BTSL",
Operands: []operand.Op{ir, mr},
Inputs: []operand.Op{ir, mr},
Outputs: []operand.Op{mr},
}, nil
}
return nil, errors.New("BTSL: bad operands")
}
// BTSQ: Bit Test and Set.
//
// Forms:
//
// BTSQ imm8 r64
// BTSQ r64 r64
// BTSQ imm8 m64
// BTSQ r64 m64
func BTSQ(ir, mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(ir) && operand.IsR64(mr):
return &intrep.Instruction{
Opcode: "BTSQ",
Operands: []operand.Op{ir, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsR64(ir) && operand.IsR64(mr):
return &intrep.Instruction{
Opcode: "BTSQ",
Operands: []operand.Op{ir, mr},
Inputs: []operand.Op{ir, mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsIMM8(ir) && operand.IsM64(mr):
return &intrep.Instruction{
Opcode: "BTSQ",
Operands: []operand.Op{ir, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsR64(ir) && operand.IsM64(mr):
return &intrep.Instruction{
Opcode: "BTSQ",
Operands: []operand.Op{ir, mr},
Inputs: []operand.Op{ir, mr},
Outputs: []operand.Op{mr},
}, nil
}
return nil, errors.New("BTSQ: bad operands")
}
// BTSW: Bit Test and Set.
//
// Forms:
//
// BTSW imm8 r16
// BTSW r16 r16
// BTSW imm8 m16
// BTSW r16 m16
func BTSW(ir, mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(ir) && operand.IsR16(mr):
return &intrep.Instruction{
Opcode: "BTSW",
Operands: []operand.Op{ir, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsR16(ir) && operand.IsR16(mr):
return &intrep.Instruction{
Opcode: "BTSW",
Operands: []operand.Op{ir, mr},
Inputs: []operand.Op{ir, mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsIMM8(ir) && operand.IsM16(mr):
return &intrep.Instruction{
Opcode: "BTSW",
Operands: []operand.Op{ir, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsR16(ir) && operand.IsM16(mr):
return &intrep.Instruction{
Opcode: "BTSW",
Operands: []operand.Op{ir, mr},
Inputs: []operand.Op{ir, mr},
Outputs: []operand.Op{mr},
}, nil
}
return nil, errors.New("BTSW: bad operands")
}
// BTW: Bit Test.
//
// Forms:
//
// BTW imm8 r16
// BTW r16 r16
// BTW imm8 m16
// BTW r16 m16
func BTW(ir, mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(ir) && operand.IsR16(mr):
return &intrep.Instruction{
Opcode: "BTW",
Operands: []operand.Op{ir, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{},
}, nil
case operand.IsR16(ir) && operand.IsR16(mr):
return &intrep.Instruction{
Opcode: "BTW",
Operands: []operand.Op{ir, mr},
Inputs: []operand.Op{ir, mr},
Outputs: []operand.Op{},
}, nil
case operand.IsIMM8(ir) && operand.IsM16(mr):
return &intrep.Instruction{
Opcode: "BTW",
Operands: []operand.Op{ir, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{},
}, nil
case operand.IsR16(ir) && operand.IsM16(mr):
return &intrep.Instruction{
Opcode: "BTW",
Operands: []operand.Op{ir, mr},
Inputs: []operand.Op{ir, mr},
Outputs: []operand.Op{},
}, nil
}
return nil, errors.New("BTW: bad operands")
}
// BZHIL: Zero High Bits Starting with Specified Bit Position.
//
// Forms:
//
// BZHIL r32 r32 r32
// BZHIL r32 m32 r32
func BZHIL(r, mr, r1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR32(r) && operand.IsR32(mr) && operand.IsR32(r1):
return &intrep.Instruction{
Opcode: "BZHIL",
Operands: []operand.Op{r, mr, r1},
Inputs: []operand.Op{r, mr},
Outputs: []operand.Op{r1},
ISA: []string{"BMI2"},
}, nil
case operand.IsR32(r) && operand.IsM32(mr) && operand.IsR32(r1):
return &intrep.Instruction{
Opcode: "BZHIL",
Operands: []operand.Op{r, mr, r1},
Inputs: []operand.Op{r, mr},
Outputs: []operand.Op{r1},
ISA: []string{"BMI2"},
}, nil
}
return nil, errors.New("BZHIL: bad operands")
}
// BZHIQ: Zero High Bits Starting with Specified Bit Position.
//
// Forms:
//
// BZHIQ r64 r64 r64
// BZHIQ r64 m64 r64
func BZHIQ(r, mr, r1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR64(r) && operand.IsR64(mr) && operand.IsR64(r1):
return &intrep.Instruction{
Opcode: "BZHIQ",
Operands: []operand.Op{r, mr, r1},
Inputs: []operand.Op{r, mr},
Outputs: []operand.Op{r1},
ISA: []string{"BMI2"},
}, nil
case operand.IsR64(r) && operand.IsM64(mr) && operand.IsR64(r1):
return &intrep.Instruction{
Opcode: "BZHIQ",
Operands: []operand.Op{r, mr, r1},
Inputs: []operand.Op{r, mr},
Outputs: []operand.Op{r1},
ISA: []string{"BMI2"},
}, nil
}
return nil, errors.New("BZHIQ: bad operands")
}
// CALL: Call Procedure.
//
// Forms:
//
// CALL rel32
func CALL(r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsREL32(r):
return &intrep.Instruction{
Opcode: "CALL",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
}, nil
}
return nil, errors.New("CALL: bad operands")
}
// CBW: Convert Byte to Word.
//
// Forms:
//
// CBW
func CBW() (*intrep.Instruction, error) {
return &intrep.Instruction{
Opcode: "CBW",
Operands: nil,
Inputs: []operand.Op{reg.AL},
Outputs: []operand.Op{reg.AX},
}, nil
}
// CDQ: Convert Doubleword to Quadword.
//
// Forms:
//
// CDQ
func CDQ() (*intrep.Instruction, error) {
return &intrep.Instruction{
Opcode: "CDQ",
Operands: nil,
Inputs: []operand.Op{reg.EAX},
Outputs: []operand.Op{reg.EDX},
}, nil
}
// CDQE: Convert Doubleword to Quadword.
//
// Forms:
//
// CDQE
func CDQE() (*intrep.Instruction, error) {
return &intrep.Instruction{
Opcode: "CDQE",
Operands: nil,
Inputs: []operand.Op{reg.EAX},
Outputs: []operand.Op{reg.RAX},
}, nil
}
// CLC: Clear Carry Flag.
//
// Forms:
//
// CLC
func CLC() (*intrep.Instruction, error) {
return &intrep.Instruction{
Opcode: "CLC",
Operands: nil,
Inputs: []operand.Op{},
Outputs: []operand.Op{},
}, nil
}
// CLD: Clear Direction Flag.
//
// Forms:
//
// CLD
func CLD() (*intrep.Instruction, error) {
return &intrep.Instruction{
Opcode: "CLD",
Operands: nil,
Inputs: []operand.Op{},
Outputs: []operand.Op{},
}, nil
}
// CLFLUSH: Flush Cache Line.
//
// Forms:
//
// CLFLUSH m8
func CLFLUSH(m operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsM8(m):
return &intrep.Instruction{
Opcode: "CLFLUSH",
Operands: []operand.Op{m},
Inputs: []operand.Op{m},
Outputs: []operand.Op{},
ISA: []string{"CLFLUSH"},
}, nil
}
return nil, errors.New("CLFLUSH: bad operands")
}
// CLFLUSHOPT: Flush Cache Line Optimized.
//
// Forms:
//
// CLFLUSHOPT m8
func CLFLUSHOPT(m operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsM8(m):
return &intrep.Instruction{
Opcode: "CLFLUSHOPT",
Operands: []operand.Op{m},
Inputs: []operand.Op{m},
Outputs: []operand.Op{},
ISA: []string{"CLFLUSHOPT"},
}, nil
}
return nil, errors.New("CLFLUSHOPT: bad operands")
}
// CMC: Complement Carry Flag.
//
// Forms:
//
// CMC
func CMC() (*intrep.Instruction, error) {
return &intrep.Instruction{
Opcode: "CMC",
Operands: nil,
Inputs: []operand.Op{},
Outputs: []operand.Op{},
}, nil
}
// CMOVLCC: Move if above or equal (CF == 0).
//
// Forms:
//
// CMOVLCC r32 r32
// CMOVLCC m32 r32
func CMOVLCC(mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR32(mr) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "CMOVLCC",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
case operand.IsM32(mr) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "CMOVLCC",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
}
return nil, errors.New("CMOVLCC: bad operands")
}
// CMOVLCS: Move if below (CF == 1).
//
// Forms:
//
// CMOVLCS r32 r32
// CMOVLCS m32 r32
func CMOVLCS(mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR32(mr) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "CMOVLCS",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
case operand.IsM32(mr) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "CMOVLCS",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
}
return nil, errors.New("CMOVLCS: bad operands")
}
// CMOVLEQ: Move if equal (ZF == 1).
//
// Forms:
//
// CMOVLEQ r32 r32
// CMOVLEQ m32 r32
func CMOVLEQ(mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR32(mr) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "CMOVLEQ",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
case operand.IsM32(mr) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "CMOVLEQ",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
}
return nil, errors.New("CMOVLEQ: bad operands")
}
// CMOVLGE: Move if greater or equal (SF == OF).
//
// Forms:
//
// CMOVLGE r32 r32
// CMOVLGE m32 r32
func CMOVLGE(mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR32(mr) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "CMOVLGE",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
case operand.IsM32(mr) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "CMOVLGE",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
}
return nil, errors.New("CMOVLGE: bad operands")
}
// CMOVLGT: Move if greater (ZF == 0 and SF == OF).
//
// Forms:
//
// CMOVLGT r32 r32
// CMOVLGT m32 r32
func CMOVLGT(mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR32(mr) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "CMOVLGT",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
case operand.IsM32(mr) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "CMOVLGT",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
}
return nil, errors.New("CMOVLGT: bad operands")
}
// CMOVLHI: Move if above (CF == 0 and ZF == 0).
//
// Forms:
//
// CMOVLHI r32 r32
// CMOVLHI m32 r32
func CMOVLHI(mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR32(mr) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "CMOVLHI",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
case operand.IsM32(mr) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "CMOVLHI",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
}
return nil, errors.New("CMOVLHI: bad operands")
}
// CMOVLLE: Move if less or equal (ZF == 1 or SF != OF).
//
// Forms:
//
// CMOVLLE r32 r32
// CMOVLLE m32 r32
func CMOVLLE(mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR32(mr) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "CMOVLLE",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
case operand.IsM32(mr) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "CMOVLLE",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
}
return nil, errors.New("CMOVLLE: bad operands")
}
// CMOVLLS: Move if below or equal (CF == 1 or ZF == 1).
//
// Forms:
//
// CMOVLLS r32 r32
// CMOVLLS m32 r32
func CMOVLLS(mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR32(mr) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "CMOVLLS",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
case operand.IsM32(mr) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "CMOVLLS",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
}
return nil, errors.New("CMOVLLS: bad operands")
}
// CMOVLLT: Move if less (SF != OF).
//
// Forms:
//
// CMOVLLT r32 r32
// CMOVLLT m32 r32
func CMOVLLT(mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR32(mr) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "CMOVLLT",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
case operand.IsM32(mr) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "CMOVLLT",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
}
return nil, errors.New("CMOVLLT: bad operands")
}
// CMOVLMI: Move if sign (SF == 1).
//
// Forms:
//
// CMOVLMI r32 r32
// CMOVLMI m32 r32
func CMOVLMI(mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR32(mr) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "CMOVLMI",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
case operand.IsM32(mr) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "CMOVLMI",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
}
return nil, errors.New("CMOVLMI: bad operands")
}
// CMOVLNE: Move if not equal (ZF == 0).
//
// Forms:
//
// CMOVLNE r32 r32
// CMOVLNE m32 r32
func CMOVLNE(mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR32(mr) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "CMOVLNE",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
case operand.IsM32(mr) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "CMOVLNE",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
}
return nil, errors.New("CMOVLNE: bad operands")
}
// CMOVLOC: Move if not overflow (OF == 0).
//
// Forms:
//
// CMOVLOC r32 r32
// CMOVLOC m32 r32
func CMOVLOC(mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR32(mr) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "CMOVLOC",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
case operand.IsM32(mr) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "CMOVLOC",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
}
return nil, errors.New("CMOVLOC: bad operands")
}
// CMOVLOS: Move if overflow (OF == 1).
//
// Forms:
//
// CMOVLOS r32 r32
// CMOVLOS m32 r32
func CMOVLOS(mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR32(mr) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "CMOVLOS",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
case operand.IsM32(mr) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "CMOVLOS",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
}
return nil, errors.New("CMOVLOS: bad operands")
}
// CMOVLPC: Move if not parity (PF == 0).
//
// Forms:
//
// CMOVLPC r32 r32
// CMOVLPC m32 r32
func CMOVLPC(mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR32(mr) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "CMOVLPC",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
case operand.IsM32(mr) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "CMOVLPC",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
}
return nil, errors.New("CMOVLPC: bad operands")
}
// CMOVLPL: Move if not sign (SF == 0).
//
// Forms:
//
// CMOVLPL r32 r32
// CMOVLPL m32 r32
func CMOVLPL(mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR32(mr) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "CMOVLPL",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
case operand.IsM32(mr) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "CMOVLPL",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
}
return nil, errors.New("CMOVLPL: bad operands")
}
// CMOVLPS: Move if parity (PF == 1).
//
// Forms:
//
// CMOVLPS r32 r32
// CMOVLPS m32 r32
func CMOVLPS(mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR32(mr) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "CMOVLPS",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
case operand.IsM32(mr) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "CMOVLPS",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
}
return nil, errors.New("CMOVLPS: bad operands")
}
// CMOVQCC: Move if above or equal (CF == 0).
//
// Forms:
//
// CMOVQCC r64 r64
// CMOVQCC m64 r64
func CMOVQCC(mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR64(mr) && operand.IsR64(r):
return &intrep.Instruction{
Opcode: "CMOVQCC",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
case operand.IsM64(mr) && operand.IsR64(r):
return &intrep.Instruction{
Opcode: "CMOVQCC",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
}
return nil, errors.New("CMOVQCC: bad operands")
}
// CMOVQCS: Move if below (CF == 1).
//
// Forms:
//
// CMOVQCS r64 r64
// CMOVQCS m64 r64
func CMOVQCS(mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR64(mr) && operand.IsR64(r):
return &intrep.Instruction{
Opcode: "CMOVQCS",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
case operand.IsM64(mr) && operand.IsR64(r):
return &intrep.Instruction{
Opcode: "CMOVQCS",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
}
return nil, errors.New("CMOVQCS: bad operands")
}
// CMOVQEQ: Move if equal (ZF == 1).
//
// Forms:
//
// CMOVQEQ r64 r64
// CMOVQEQ m64 r64
func CMOVQEQ(mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR64(mr) && operand.IsR64(r):
return &intrep.Instruction{
Opcode: "CMOVQEQ",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
case operand.IsM64(mr) && operand.IsR64(r):
return &intrep.Instruction{
Opcode: "CMOVQEQ",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
}
return nil, errors.New("CMOVQEQ: bad operands")
}
// CMOVQGE: Move if greater or equal (SF == OF).
//
// Forms:
//
// CMOVQGE r64 r64
// CMOVQGE m64 r64
func CMOVQGE(mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR64(mr) && operand.IsR64(r):
return &intrep.Instruction{
Opcode: "CMOVQGE",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
case operand.IsM64(mr) && operand.IsR64(r):
return &intrep.Instruction{
Opcode: "CMOVQGE",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
}
return nil, errors.New("CMOVQGE: bad operands")
}
// CMOVQGT: Move if greater (ZF == 0 and SF == OF).
//
// Forms:
//
// CMOVQGT r64 r64
// CMOVQGT m64 r64
func CMOVQGT(mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR64(mr) && operand.IsR64(r):
return &intrep.Instruction{
Opcode: "CMOVQGT",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
case operand.IsM64(mr) && operand.IsR64(r):
return &intrep.Instruction{
Opcode: "CMOVQGT",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
}
return nil, errors.New("CMOVQGT: bad operands")
}
// CMOVQHI: Move if above (CF == 0 and ZF == 0).
//
// Forms:
//
// CMOVQHI r64 r64
// CMOVQHI m64 r64
func CMOVQHI(mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR64(mr) && operand.IsR64(r):
return &intrep.Instruction{
Opcode: "CMOVQHI",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
case operand.IsM64(mr) && operand.IsR64(r):
return &intrep.Instruction{
Opcode: "CMOVQHI",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
}
return nil, errors.New("CMOVQHI: bad operands")
}
// CMOVQLE: Move if less or equal (ZF == 1 or SF != OF).
//
// Forms:
//
// CMOVQLE r64 r64
// CMOVQLE m64 r64
func CMOVQLE(mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR64(mr) && operand.IsR64(r):
return &intrep.Instruction{
Opcode: "CMOVQLE",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
case operand.IsM64(mr) && operand.IsR64(r):
return &intrep.Instruction{
Opcode: "CMOVQLE",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
}
return nil, errors.New("CMOVQLE: bad operands")
}
// CMOVQLS: Move if below or equal (CF == 1 or ZF == 1).
//
// Forms:
//
// CMOVQLS r64 r64
// CMOVQLS m64 r64
func CMOVQLS(mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR64(mr) && operand.IsR64(r):
return &intrep.Instruction{
Opcode: "CMOVQLS",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
case operand.IsM64(mr) && operand.IsR64(r):
return &intrep.Instruction{
Opcode: "CMOVQLS",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
}
return nil, errors.New("CMOVQLS: bad operands")
}
// CMOVQLT: Move if less (SF != OF).
//
// Forms:
//
// CMOVQLT r64 r64
// CMOVQLT m64 r64
func CMOVQLT(mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR64(mr) && operand.IsR64(r):
return &intrep.Instruction{
Opcode: "CMOVQLT",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
case operand.IsM64(mr) && operand.IsR64(r):
return &intrep.Instruction{
Opcode: "CMOVQLT",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
}
return nil, errors.New("CMOVQLT: bad operands")
}
// CMOVQMI: Move if sign (SF == 1).
//
// Forms:
//
// CMOVQMI r64 r64
// CMOVQMI m64 r64
func CMOVQMI(mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR64(mr) && operand.IsR64(r):
return &intrep.Instruction{
Opcode: "CMOVQMI",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
case operand.IsM64(mr) && operand.IsR64(r):
return &intrep.Instruction{
Opcode: "CMOVQMI",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
}
return nil, errors.New("CMOVQMI: bad operands")
}
// CMOVQNE: Move if not equal (ZF == 0).
//
// Forms:
//
// CMOVQNE r64 r64
// CMOVQNE m64 r64
func CMOVQNE(mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR64(mr) && operand.IsR64(r):
return &intrep.Instruction{
Opcode: "CMOVQNE",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
case operand.IsM64(mr) && operand.IsR64(r):
return &intrep.Instruction{
Opcode: "CMOVQNE",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
}
return nil, errors.New("CMOVQNE: bad operands")
}
// CMOVQOC: Move if not overflow (OF == 0).
//
// Forms:
//
// CMOVQOC r64 r64
// CMOVQOC m64 r64
func CMOVQOC(mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR64(mr) && operand.IsR64(r):
return &intrep.Instruction{
Opcode: "CMOVQOC",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
case operand.IsM64(mr) && operand.IsR64(r):
return &intrep.Instruction{
Opcode: "CMOVQOC",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
}
return nil, errors.New("CMOVQOC: bad operands")
}
// CMOVQOS: Move if overflow (OF == 1).
//
// Forms:
//
// CMOVQOS r64 r64
// CMOVQOS m64 r64
func CMOVQOS(mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR64(mr) && operand.IsR64(r):
return &intrep.Instruction{
Opcode: "CMOVQOS",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
case operand.IsM64(mr) && operand.IsR64(r):
return &intrep.Instruction{
Opcode: "CMOVQOS",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
}
return nil, errors.New("CMOVQOS: bad operands")
}
// CMOVQPC: Move if not parity (PF == 0).
//
// Forms:
//
// CMOVQPC r64 r64
// CMOVQPC m64 r64
func CMOVQPC(mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR64(mr) && operand.IsR64(r):
return &intrep.Instruction{
Opcode: "CMOVQPC",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
case operand.IsM64(mr) && operand.IsR64(r):
return &intrep.Instruction{
Opcode: "CMOVQPC",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
}
return nil, errors.New("CMOVQPC: bad operands")
}
// CMOVQPL: Move if not sign (SF == 0).
//
// Forms:
//
// CMOVQPL r64 r64
// CMOVQPL m64 r64
func CMOVQPL(mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR64(mr) && operand.IsR64(r):
return &intrep.Instruction{
Opcode: "CMOVQPL",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
case operand.IsM64(mr) && operand.IsR64(r):
return &intrep.Instruction{
Opcode: "CMOVQPL",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
}
return nil, errors.New("CMOVQPL: bad operands")
}
// CMOVQPS: Move if parity (PF == 1).
//
// Forms:
//
// CMOVQPS r64 r64
// CMOVQPS m64 r64
func CMOVQPS(mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR64(mr) && operand.IsR64(r):
return &intrep.Instruction{
Opcode: "CMOVQPS",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
case operand.IsM64(mr) && operand.IsR64(r):
return &intrep.Instruction{
Opcode: "CMOVQPS",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
}
return nil, errors.New("CMOVQPS: bad operands")
}
// CMOVWCC: Move if above or equal (CF == 0).
//
// Forms:
//
// CMOVWCC r16 r16
// CMOVWCC m16 r16
func CMOVWCC(mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR16(mr) && operand.IsR16(r):
return &intrep.Instruction{
Opcode: "CMOVWCC",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
case operand.IsM16(mr) && operand.IsR16(r):
return &intrep.Instruction{
Opcode: "CMOVWCC",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
}
return nil, errors.New("CMOVWCC: bad operands")
}
// CMOVWCS: Move if below (CF == 1).
//
// Forms:
//
// CMOVWCS r16 r16
// CMOVWCS m16 r16
func CMOVWCS(mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR16(mr) && operand.IsR16(r):
return &intrep.Instruction{
Opcode: "CMOVWCS",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
case operand.IsM16(mr) && operand.IsR16(r):
return &intrep.Instruction{
Opcode: "CMOVWCS",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
}
return nil, errors.New("CMOVWCS: bad operands")
}
// CMOVWEQ: Move if equal (ZF == 1).
//
// Forms:
//
// CMOVWEQ r16 r16
// CMOVWEQ m16 r16
func CMOVWEQ(mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR16(mr) && operand.IsR16(r):
return &intrep.Instruction{
Opcode: "CMOVWEQ",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
case operand.IsM16(mr) && operand.IsR16(r):
return &intrep.Instruction{
Opcode: "CMOVWEQ",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
}
return nil, errors.New("CMOVWEQ: bad operands")
}
// CMOVWGE: Move if greater or equal (SF == OF).
//
// Forms:
//
// CMOVWGE r16 r16
// CMOVWGE m16 r16
func CMOVWGE(mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR16(mr) && operand.IsR16(r):
return &intrep.Instruction{
Opcode: "CMOVWGE",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
case operand.IsM16(mr) && operand.IsR16(r):
return &intrep.Instruction{
Opcode: "CMOVWGE",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
}
return nil, errors.New("CMOVWGE: bad operands")
}
// CMOVWGT: Move if greater (ZF == 0 and SF == OF).
//
// Forms:
//
// CMOVWGT r16 r16
// CMOVWGT m16 r16
func CMOVWGT(mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR16(mr) && operand.IsR16(r):
return &intrep.Instruction{
Opcode: "CMOVWGT",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
case operand.IsM16(mr) && operand.IsR16(r):
return &intrep.Instruction{
Opcode: "CMOVWGT",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
}
return nil, errors.New("CMOVWGT: bad operands")
}
// CMOVWHI: Move if above (CF == 0 and ZF == 0).
//
// Forms:
//
// CMOVWHI r16 r16
// CMOVWHI m16 r16
func CMOVWHI(mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR16(mr) && operand.IsR16(r):
return &intrep.Instruction{
Opcode: "CMOVWHI",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
case operand.IsM16(mr) && operand.IsR16(r):
return &intrep.Instruction{
Opcode: "CMOVWHI",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
}
return nil, errors.New("CMOVWHI: bad operands")
}
// CMOVWLE: Move if less or equal (ZF == 1 or SF != OF).
//
// Forms:
//
// CMOVWLE r16 r16
// CMOVWLE m16 r16
func CMOVWLE(mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR16(mr) && operand.IsR16(r):
return &intrep.Instruction{
Opcode: "CMOVWLE",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
case operand.IsM16(mr) && operand.IsR16(r):
return &intrep.Instruction{
Opcode: "CMOVWLE",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
}
return nil, errors.New("CMOVWLE: bad operands")
}
// CMOVWLS: Move if below or equal (CF == 1 or ZF == 1).
//
// Forms:
//
// CMOVWLS r16 r16
// CMOVWLS m16 r16
func CMOVWLS(mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR16(mr) && operand.IsR16(r):
return &intrep.Instruction{
Opcode: "CMOVWLS",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
case operand.IsM16(mr) && operand.IsR16(r):
return &intrep.Instruction{
Opcode: "CMOVWLS",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
}
return nil, errors.New("CMOVWLS: bad operands")
}
// CMOVWLT: Move if less (SF != OF).
//
// Forms:
//
// CMOVWLT r16 r16
// CMOVWLT m16 r16
func CMOVWLT(mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR16(mr) && operand.IsR16(r):
return &intrep.Instruction{
Opcode: "CMOVWLT",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
case operand.IsM16(mr) && operand.IsR16(r):
return &intrep.Instruction{
Opcode: "CMOVWLT",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
}
return nil, errors.New("CMOVWLT: bad operands")
}
// CMOVWMI: Move if sign (SF == 1).
//
// Forms:
//
// CMOVWMI r16 r16
// CMOVWMI m16 r16
func CMOVWMI(mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR16(mr) && operand.IsR16(r):
return &intrep.Instruction{
Opcode: "CMOVWMI",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
case operand.IsM16(mr) && operand.IsR16(r):
return &intrep.Instruction{
Opcode: "CMOVWMI",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
}
return nil, errors.New("CMOVWMI: bad operands")
}
// CMOVWNE: Move if not equal (ZF == 0).
//
// Forms:
//
// CMOVWNE r16 r16
// CMOVWNE m16 r16
func CMOVWNE(mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR16(mr) && operand.IsR16(r):
return &intrep.Instruction{
Opcode: "CMOVWNE",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
case operand.IsM16(mr) && operand.IsR16(r):
return &intrep.Instruction{
Opcode: "CMOVWNE",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
}
return nil, errors.New("CMOVWNE: bad operands")
}
// CMOVWOC: Move if not overflow (OF == 0).
//
// Forms:
//
// CMOVWOC r16 r16
// CMOVWOC m16 r16
func CMOVWOC(mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR16(mr) && operand.IsR16(r):
return &intrep.Instruction{
Opcode: "CMOVWOC",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
case operand.IsM16(mr) && operand.IsR16(r):
return &intrep.Instruction{
Opcode: "CMOVWOC",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
}
return nil, errors.New("CMOVWOC: bad operands")
}
// CMOVWOS: Move if overflow (OF == 1).
//
// Forms:
//
// CMOVWOS r16 r16
// CMOVWOS m16 r16
func CMOVWOS(mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR16(mr) && operand.IsR16(r):
return &intrep.Instruction{
Opcode: "CMOVWOS",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
case operand.IsM16(mr) && operand.IsR16(r):
return &intrep.Instruction{
Opcode: "CMOVWOS",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
}
return nil, errors.New("CMOVWOS: bad operands")
}
// CMOVWPC: Move if not parity (PF == 0).
//
// Forms:
//
// CMOVWPC r16 r16
// CMOVWPC m16 r16
func CMOVWPC(mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR16(mr) && operand.IsR16(r):
return &intrep.Instruction{
Opcode: "CMOVWPC",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
case operand.IsM16(mr) && operand.IsR16(r):
return &intrep.Instruction{
Opcode: "CMOVWPC",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
}
return nil, errors.New("CMOVWPC: bad operands")
}
// CMOVWPL: Move if not sign (SF == 0).
//
// Forms:
//
// CMOVWPL r16 r16
// CMOVWPL m16 r16
func CMOVWPL(mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR16(mr) && operand.IsR16(r):
return &intrep.Instruction{
Opcode: "CMOVWPL",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
case operand.IsM16(mr) && operand.IsR16(r):
return &intrep.Instruction{
Opcode: "CMOVWPL",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
}
return nil, errors.New("CMOVWPL: bad operands")
}
// CMOVWPS: Move if parity (PF == 1).
//
// Forms:
//
// CMOVWPS r16 r16
// CMOVWPS m16 r16
func CMOVWPS(mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR16(mr) && operand.IsR16(r):
return &intrep.Instruction{
Opcode: "CMOVWPS",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
case operand.IsM16(mr) && operand.IsR16(r):
return &intrep.Instruction{
Opcode: "CMOVWPS",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"CMOV"},
}, nil
}
return nil, errors.New("CMOVWPS: bad operands")
}
// CMPB: Compare Two Operands.
//
// Forms:
//
// CMPB al imm8
// CMPB r8 imm8
// CMPB r8 r8
// CMPB r8 m8
// CMPB m8 imm8
// CMPB m8 r8
func CMPB(amr, imr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsAL(amr) && operand.IsIMM8(imr):
return &intrep.Instruction{
Opcode: "CMPB",
Operands: []operand.Op{amr, imr},
Inputs: []operand.Op{amr},
Outputs: []operand.Op{},
}, nil
case operand.IsR8(amr) && operand.IsIMM8(imr):
return &intrep.Instruction{
Opcode: "CMPB",
Operands: []operand.Op{amr, imr},
Inputs: []operand.Op{amr},
Outputs: []operand.Op{},
}, nil
case operand.IsR8(amr) && operand.IsR8(imr):
return &intrep.Instruction{
Opcode: "CMPB",
Operands: []operand.Op{amr, imr},
Inputs: []operand.Op{amr, imr},
Outputs: []operand.Op{},
CancellingInputs: true,
}, nil
case operand.IsR8(amr) && operand.IsM8(imr):
return &intrep.Instruction{
Opcode: "CMPB",
Operands: []operand.Op{amr, imr},
Inputs: []operand.Op{amr, imr},
Outputs: []operand.Op{},
}, nil
case operand.IsM8(amr) && operand.IsIMM8(imr):
return &intrep.Instruction{
Opcode: "CMPB",
Operands: []operand.Op{amr, imr},
Inputs: []operand.Op{amr},
Outputs: []operand.Op{},
}, nil
case operand.IsM8(amr) && operand.IsR8(imr):
return &intrep.Instruction{
Opcode: "CMPB",
Operands: []operand.Op{amr, imr},
Inputs: []operand.Op{amr, imr},
Outputs: []operand.Op{},
}, nil
}
return nil, errors.New("CMPB: bad operands")
}
// CMPL: Compare Two Operands.
//
// Forms:
//
// CMPL eax imm32
// CMPL r32 imm8
// CMPL r32 imm32
// CMPL r32 r32
// CMPL r32 m32
// CMPL m32 imm8
// CMPL m32 imm32
// CMPL m32 r32
func CMPL(emr, imr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsEAX(emr) && operand.IsIMM32(imr):
return &intrep.Instruction{
Opcode: "CMPL",
Operands: []operand.Op{emr, imr},
Inputs: []operand.Op{emr},
Outputs: []operand.Op{},
}, nil
case operand.IsR32(emr) && operand.IsIMM8(imr):
return &intrep.Instruction{
Opcode: "CMPL",
Operands: []operand.Op{emr, imr},
Inputs: []operand.Op{emr},
Outputs: []operand.Op{},
}, nil
case operand.IsR32(emr) && operand.IsIMM32(imr):
return &intrep.Instruction{
Opcode: "CMPL",
Operands: []operand.Op{emr, imr},
Inputs: []operand.Op{emr},
Outputs: []operand.Op{},
}, nil
case operand.IsR32(emr) && operand.IsR32(imr):
return &intrep.Instruction{
Opcode: "CMPL",
Operands: []operand.Op{emr, imr},
Inputs: []operand.Op{emr, imr},
Outputs: []operand.Op{},
CancellingInputs: true,
}, nil
case operand.IsR32(emr) && operand.IsM32(imr):
return &intrep.Instruction{
Opcode: "CMPL",
Operands: []operand.Op{emr, imr},
Inputs: []operand.Op{emr, imr},
Outputs: []operand.Op{},
}, nil
case operand.IsM32(emr) && operand.IsIMM8(imr):
return &intrep.Instruction{
Opcode: "CMPL",
Operands: []operand.Op{emr, imr},
Inputs: []operand.Op{emr},
Outputs: []operand.Op{},
}, nil
case operand.IsM32(emr) && operand.IsIMM32(imr):
return &intrep.Instruction{
Opcode: "CMPL",
Operands: []operand.Op{emr, imr},
Inputs: []operand.Op{emr},
Outputs: []operand.Op{},
}, nil
case operand.IsM32(emr) && operand.IsR32(imr):
return &intrep.Instruction{
Opcode: "CMPL",
Operands: []operand.Op{emr, imr},
Inputs: []operand.Op{emr, imr},
Outputs: []operand.Op{},
}, nil
}
return nil, errors.New("CMPL: bad operands")
}
// CMPPD: Compare Packed Double-Precision Floating-Point Values.
//
// Forms:
//
// CMPPD xmm xmm imm8
// CMPPD m128 xmm imm8
func CMPPD(mx, x, i operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsIMM8(i):
return &intrep.Instruction{
Opcode: "CMPPD",
Operands: []operand.Op{mx, x, i},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x) && operand.IsIMM8(i):
return &intrep.Instruction{
Opcode: "CMPPD",
Operands: []operand.Op{mx, x, i},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("CMPPD: bad operands")
}
// CMPPS: Compare Packed Single-Precision Floating-Point Values.
//
// Forms:
//
// CMPPS xmm xmm imm8
// CMPPS m128 xmm imm8
func CMPPS(mx, x, i operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsIMM8(i):
return &intrep.Instruction{
Opcode: "CMPPS",
Operands: []operand.Op{mx, x, i},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x) && operand.IsIMM8(i):
return &intrep.Instruction{
Opcode: "CMPPS",
Operands: []operand.Op{mx, x, i},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE"},
}, nil
}
return nil, errors.New("CMPPS: bad operands")
}
// CMPQ: Compare Two Operands.
//
// Forms:
//
// CMPQ rax imm32
// CMPQ r64 imm8
// CMPQ r64 imm32
// CMPQ r64 r64
// CMPQ r64 m64
// CMPQ m64 imm8
// CMPQ m64 imm32
// CMPQ m64 r64
func CMPQ(mr, imr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsRAX(mr) && operand.IsIMM32(imr):
return &intrep.Instruction{
Opcode: "CMPQ",
Operands: []operand.Op{mr, imr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{},
}, nil
case operand.IsR64(mr) && operand.IsIMM8(imr):
return &intrep.Instruction{
Opcode: "CMPQ",
Operands: []operand.Op{mr, imr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{},
}, nil
case operand.IsR64(mr) && operand.IsIMM32(imr):
return &intrep.Instruction{
Opcode: "CMPQ",
Operands: []operand.Op{mr, imr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{},
}, nil
case operand.IsR64(mr) && operand.IsR64(imr):
return &intrep.Instruction{
Opcode: "CMPQ",
Operands: []operand.Op{mr, imr},
Inputs: []operand.Op{mr, imr},
Outputs: []operand.Op{},
CancellingInputs: true,
}, nil
case operand.IsR64(mr) && operand.IsM64(imr):
return &intrep.Instruction{
Opcode: "CMPQ",
Operands: []operand.Op{mr, imr},
Inputs: []operand.Op{mr, imr},
Outputs: []operand.Op{},
}, nil
case operand.IsM64(mr) && operand.IsIMM8(imr):
return &intrep.Instruction{
Opcode: "CMPQ",
Operands: []operand.Op{mr, imr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{},
}, nil
case operand.IsM64(mr) && operand.IsIMM32(imr):
return &intrep.Instruction{
Opcode: "CMPQ",
Operands: []operand.Op{mr, imr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{},
}, nil
case operand.IsM64(mr) && operand.IsR64(imr):
return &intrep.Instruction{
Opcode: "CMPQ",
Operands: []operand.Op{mr, imr},
Inputs: []operand.Op{mr, imr},
Outputs: []operand.Op{},
}, nil
}
return nil, errors.New("CMPQ: bad operands")
}
// CMPSD: Compare Scalar Double-Precision Floating-Point Values.
//
// Forms:
//
// CMPSD xmm xmm imm8
// CMPSD m64 xmm imm8
func CMPSD(mx, x, i operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsIMM8(i):
return &intrep.Instruction{
Opcode: "CMPSD",
Operands: []operand.Op{mx, x, i},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
case operand.IsM64(mx) && operand.IsXMM(x) && operand.IsIMM8(i):
return &intrep.Instruction{
Opcode: "CMPSD",
Operands: []operand.Op{mx, x, i},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("CMPSD: bad operands")
}
// CMPSS: Compare Scalar Single-Precision Floating-Point Values.
//
// Forms:
//
// CMPSS xmm xmm imm8
// CMPSS m32 xmm imm8
func CMPSS(mx, x, i operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsIMM8(i):
return &intrep.Instruction{
Opcode: "CMPSS",
Operands: []operand.Op{mx, x, i},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE"},
}, nil
case operand.IsM32(mx) && operand.IsXMM(x) && operand.IsIMM8(i):
return &intrep.Instruction{
Opcode: "CMPSS",
Operands: []operand.Op{mx, x, i},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE"},
}, nil
}
return nil, errors.New("CMPSS: bad operands")
}
// CMPW: Compare Two Operands.
//
// Forms:
//
// CMPW ax imm16
// CMPW r16 imm8
// CMPW r16 imm16
// CMPW r16 r16
// CMPW r16 m16
// CMPW m16 imm8
// CMPW m16 imm16
// CMPW m16 r16
func CMPW(amr, imr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsAX(amr) && operand.IsIMM16(imr):
return &intrep.Instruction{
Opcode: "CMPW",
Operands: []operand.Op{amr, imr},
Inputs: []operand.Op{amr},
Outputs: []operand.Op{},
}, nil
case operand.IsR16(amr) && operand.IsIMM8(imr):
return &intrep.Instruction{
Opcode: "CMPW",
Operands: []operand.Op{amr, imr},
Inputs: []operand.Op{amr},
Outputs: []operand.Op{},
}, nil
case operand.IsR16(amr) && operand.IsIMM16(imr):
return &intrep.Instruction{
Opcode: "CMPW",
Operands: []operand.Op{amr, imr},
Inputs: []operand.Op{amr},
Outputs: []operand.Op{},
}, nil
case operand.IsR16(amr) && operand.IsR16(imr):
return &intrep.Instruction{
Opcode: "CMPW",
Operands: []operand.Op{amr, imr},
Inputs: []operand.Op{amr, imr},
Outputs: []operand.Op{},
CancellingInputs: true,
}, nil
case operand.IsR16(amr) && operand.IsM16(imr):
return &intrep.Instruction{
Opcode: "CMPW",
Operands: []operand.Op{amr, imr},
Inputs: []operand.Op{amr, imr},
Outputs: []operand.Op{},
}, nil
case operand.IsM16(amr) && operand.IsIMM8(imr):
return &intrep.Instruction{
Opcode: "CMPW",
Operands: []operand.Op{amr, imr},
Inputs: []operand.Op{amr},
Outputs: []operand.Op{},
}, nil
case operand.IsM16(amr) && operand.IsIMM16(imr):
return &intrep.Instruction{
Opcode: "CMPW",
Operands: []operand.Op{amr, imr},
Inputs: []operand.Op{amr},
Outputs: []operand.Op{},
}, nil
case operand.IsM16(amr) && operand.IsR16(imr):
return &intrep.Instruction{
Opcode: "CMPW",
Operands: []operand.Op{amr, imr},
Inputs: []operand.Op{amr, imr},
Outputs: []operand.Op{},
}, nil
}
return nil, errors.New("CMPW: bad operands")
}
// CMPXCHG16B: Compare and Exchange 16 Bytes.
//
// Forms:
//
// CMPXCHG16B m128
func CMPXCHG16B(m operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsM128(m):
return &intrep.Instruction{
Opcode: "CMPXCHG16B",
Operands: []operand.Op{m},
Inputs: []operand.Op{m, reg.RAX, reg.RBX, reg.RCX, reg.RDX},
Outputs: []operand.Op{reg.RAX, reg.RDX},
}, nil
}
return nil, errors.New("CMPXCHG16B: bad operands")
}
// CMPXCHG8B: Compare and Exchange 8 Bytes.
//
// Forms:
//
// CMPXCHG8B m64
func CMPXCHG8B(m operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsM64(m):
return &intrep.Instruction{
Opcode: "CMPXCHG8B",
Operands: []operand.Op{m},
Inputs: []operand.Op{m, reg.EAX, reg.EBX, reg.ECX, reg.EDX},
Outputs: []operand.Op{reg.EAX, reg.EDX},
}, nil
}
return nil, errors.New("CMPXCHG8B: bad operands")
}
// CMPXCHGB: Compare and Exchange.
//
// Forms:
//
// CMPXCHGB r8 r8
// CMPXCHGB r8 m8
func CMPXCHGB(r, mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR8(r) && operand.IsR8(mr):
return &intrep.Instruction{
Opcode: "CMPXCHGB",
Operands: []operand.Op{r, mr},
Inputs: []operand.Op{r, mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsR8(r) && operand.IsM8(mr):
return &intrep.Instruction{
Opcode: "CMPXCHGB",
Operands: []operand.Op{r, mr},
Inputs: []operand.Op{r, mr},
Outputs: []operand.Op{mr},
}, nil
}
return nil, errors.New("CMPXCHGB: bad operands")
}
// CMPXCHGL: Compare and Exchange.
//
// Forms:
//
// CMPXCHGL r32 r32
// CMPXCHGL r32 m32
func CMPXCHGL(r, mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR32(r) && operand.IsR32(mr):
return &intrep.Instruction{
Opcode: "CMPXCHGL",
Operands: []operand.Op{r, mr},
Inputs: []operand.Op{r, mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsR32(r) && operand.IsM32(mr):
return &intrep.Instruction{
Opcode: "CMPXCHGL",
Operands: []operand.Op{r, mr},
Inputs: []operand.Op{r, mr},
Outputs: []operand.Op{mr},
}, nil
}
return nil, errors.New("CMPXCHGL: bad operands")
}
// CMPXCHGQ: Compare and Exchange.
//
// Forms:
//
// CMPXCHGQ r64 r64
// CMPXCHGQ r64 m64
func CMPXCHGQ(r, mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR64(r) && operand.IsR64(mr):
return &intrep.Instruction{
Opcode: "CMPXCHGQ",
Operands: []operand.Op{r, mr},
Inputs: []operand.Op{r, mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsR64(r) && operand.IsM64(mr):
return &intrep.Instruction{
Opcode: "CMPXCHGQ",
Operands: []operand.Op{r, mr},
Inputs: []operand.Op{r, mr},
Outputs: []operand.Op{mr},
}, nil
}
return nil, errors.New("CMPXCHGQ: bad operands")
}
// CMPXCHGW: Compare and Exchange.
//
// Forms:
//
// CMPXCHGW r16 r16
// CMPXCHGW r16 m16
func CMPXCHGW(r, mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR16(r) && operand.IsR16(mr):
return &intrep.Instruction{
Opcode: "CMPXCHGW",
Operands: []operand.Op{r, mr},
Inputs: []operand.Op{r, mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsR16(r) && operand.IsM16(mr):
return &intrep.Instruction{
Opcode: "CMPXCHGW",
Operands: []operand.Op{r, mr},
Inputs: []operand.Op{r, mr},
Outputs: []operand.Op{mr},
}, nil
}
return nil, errors.New("CMPXCHGW: bad operands")
}
// COMISD: Compare Scalar Ordered Double-Precision Floating-Point Values and Set EFLAGS.
//
// Forms:
//
// COMISD xmm xmm
// COMISD m64 xmm
func COMISD(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "COMISD",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{},
ISA: []string{"SSE2"},
}, nil
case operand.IsM64(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "COMISD",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("COMISD: bad operands")
}
// COMISS: Compare Scalar Ordered Single-Precision Floating-Point Values and Set EFLAGS.
//
// Forms:
//
// COMISS xmm xmm
// COMISS m32 xmm
func COMISS(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "COMISS",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{},
ISA: []string{"SSE"},
}, nil
case operand.IsM32(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "COMISS",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{},
ISA: []string{"SSE"},
}, nil
}
return nil, errors.New("COMISS: bad operands")
}
// CPUID: CPU Identification.
//
// Forms:
//
// CPUID
func CPUID() (*intrep.Instruction, error) {
return &intrep.Instruction{
Opcode: "CPUID",
Operands: nil,
Inputs: []operand.Op{reg.EAX, reg.ECX},
Outputs: []operand.Op{reg.EAX, reg.EBX, reg.ECX, reg.EDX},
ISA: []string{"CPUID"},
}, nil
}
// CQO: Convert Quadword to Octaword.
//
// Forms:
//
// CQO
func CQO() (*intrep.Instruction, error) {
return &intrep.Instruction{
Opcode: "CQO",
Operands: nil,
Inputs: []operand.Op{reg.RAX},
Outputs: []operand.Op{reg.RDX},
}, nil
}
// CRC32B: Accumulate CRC32 Value.
//
// Forms:
//
// CRC32B r8 r32
// CRC32B m8 r32
// CRC32B r8 r64
// CRC32B m8 r64
func CRC32B(mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR8(mr) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "CRC32B",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"SSE4.2"},
}, nil
case operand.IsM8(mr) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "CRC32B",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"SSE4.2"},
}, nil
case operand.IsR8(mr) && operand.IsR64(r):
return &intrep.Instruction{
Opcode: "CRC32B",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"SSE4.2"},
}, nil
case operand.IsM8(mr) && operand.IsR64(r):
return &intrep.Instruction{
Opcode: "CRC32B",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"SSE4.2"},
}, nil
}
return nil, errors.New("CRC32B: bad operands")
}
// CRC32L: Accumulate CRC32 Value.
//
// Forms:
//
// CRC32L r32 r32
// CRC32L m32 r32
func CRC32L(mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR32(mr) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "CRC32L",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"SSE4.2"},
}, nil
case operand.IsM32(mr) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "CRC32L",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"SSE4.2"},
}, nil
}
return nil, errors.New("CRC32L: bad operands")
}
// CRC32Q: Accumulate CRC32 Value.
//
// Forms:
//
// CRC32Q r64 r64
// CRC32Q m64 r64
func CRC32Q(mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR64(mr) && operand.IsR64(r):
return &intrep.Instruction{
Opcode: "CRC32Q",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"SSE4.2"},
}, nil
case operand.IsM64(mr) && operand.IsR64(r):
return &intrep.Instruction{
Opcode: "CRC32Q",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"SSE4.2"},
}, nil
}
return nil, errors.New("CRC32Q: bad operands")
}
// CRC32W: Accumulate CRC32 Value.
//
// Forms:
//
// CRC32W r16 r32
// CRC32W m16 r32
func CRC32W(mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR16(mr) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "CRC32W",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"SSE4.2"},
}, nil
case operand.IsM16(mr) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "CRC32W",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r},
ISA: []string{"SSE4.2"},
}, nil
}
return nil, errors.New("CRC32W: bad operands")
}
// CVTPD2PL: Convert Packed Double-Precision FP Values to Packed Dword Integers.
//
// Forms:
//
// CVTPD2PL xmm xmm
// CVTPD2PL m128 xmm
func CVTPD2PL(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "CVTPD2PL",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "CVTPD2PL",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("CVTPD2PL: bad operands")
}
// CVTPD2PS: Convert Packed Double-Precision FP Values to Packed Single-Precision FP Values.
//
// Forms:
//
// CVTPD2PS xmm xmm
// CVTPD2PS m128 xmm
func CVTPD2PS(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "CVTPD2PS",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "CVTPD2PS",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("CVTPD2PS: bad operands")
}
// CVTPL2PD: Convert Packed Dword Integers to Packed Double-Precision FP Values.
//
// Forms:
//
// CVTPL2PD xmm xmm
// CVTPL2PD m64 xmm
func CVTPL2PD(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "CVTPL2PD",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
case operand.IsM64(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "CVTPL2PD",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("CVTPL2PD: bad operands")
}
// CVTPL2PS: Convert Packed Dword Integers to Packed Single-Precision FP Values.
//
// Forms:
//
// CVTPL2PS xmm xmm
// CVTPL2PS m128 xmm
func CVTPL2PS(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "CVTPL2PS",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "CVTPL2PS",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("CVTPL2PS: bad operands")
}
// CVTPS2PD: Convert Packed Single-Precision FP Values to Packed Double-Precision FP Values.
//
// Forms:
//
// CVTPS2PD xmm xmm
// CVTPS2PD m64 xmm
func CVTPS2PD(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "CVTPS2PD",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
case operand.IsM64(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "CVTPS2PD",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("CVTPS2PD: bad operands")
}
// CVTPS2PL: Convert Packed Single-Precision FP Values to Packed Dword Integers.
//
// Forms:
//
// CVTPS2PL xmm xmm
// CVTPS2PL m128 xmm
func CVTPS2PL(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "CVTPS2PL",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "CVTPS2PL",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("CVTPS2PL: bad operands")
}
// CVTSD2SL: Convert Scalar Double-Precision FP Value to Integer.
//
// Forms:
//
// CVTSD2SL xmm r32
// CVTSD2SL m64 r32
// CVTSD2SL xmm r64
// CVTSD2SL m64 r64
func CVTSD2SL(mx, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "CVTSD2SL",
Operands: []operand.Op{mx, r},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{r},
ISA: []string{"SSE2"},
}, nil
case operand.IsM64(mx) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "CVTSD2SL",
Operands: []operand.Op{mx, r},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{r},
ISA: []string{"SSE2"},
}, nil
case operand.IsXMM(mx) && operand.IsR64(r):
return &intrep.Instruction{
Opcode: "CVTSD2SL",
Operands: []operand.Op{mx, r},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{r},
ISA: []string{"SSE2"},
}, nil
case operand.IsM64(mx) && operand.IsR64(r):
return &intrep.Instruction{
Opcode: "CVTSD2SL",
Operands: []operand.Op{mx, r},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{r},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("CVTSD2SL: bad operands")
}
// CVTSD2SS: Convert Scalar Double-Precision FP Value to Scalar Single-Precision FP Value.
//
// Forms:
//
// CVTSD2SS xmm xmm
// CVTSD2SS m64 xmm
func CVTSD2SS(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "CVTSD2SS",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
case operand.IsM64(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "CVTSD2SS",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("CVTSD2SS: bad operands")
}
// CVTSL2SD: Convert Dword Integer to Scalar Double-Precision FP Value.
//
// Forms:
//
// CVTSL2SD r32 xmm
// CVTSL2SD m32 xmm
func CVTSL2SD(mr, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR32(mr) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "CVTSL2SD",
Operands: []operand.Op{mr, x},
Inputs: []operand.Op{mr, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
case operand.IsM32(mr) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "CVTSL2SD",
Operands: []operand.Op{mr, x},
Inputs: []operand.Op{mr, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("CVTSL2SD: bad operands")
}
// CVTSL2SS: Convert Dword Integer to Scalar Single-Precision FP Value.
//
// Forms:
//
// CVTSL2SS r32 xmm
// CVTSL2SS m32 xmm
func CVTSL2SS(mr, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR32(mr) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "CVTSL2SS",
Operands: []operand.Op{mr, x},
Inputs: []operand.Op{mr, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE"},
}, nil
case operand.IsM32(mr) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "CVTSL2SS",
Operands: []operand.Op{mr, x},
Inputs: []operand.Op{mr, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE"},
}, nil
}
return nil, errors.New("CVTSL2SS: bad operands")
}
// CVTSQ2SD: Convert Dword Integer to Scalar Double-Precision FP Value.
//
// Forms:
//
// CVTSQ2SD r64 xmm
// CVTSQ2SD m64 xmm
func CVTSQ2SD(mr, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR64(mr) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "CVTSQ2SD",
Operands: []operand.Op{mr, x},
Inputs: []operand.Op{mr, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
case operand.IsM64(mr) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "CVTSQ2SD",
Operands: []operand.Op{mr, x},
Inputs: []operand.Op{mr, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("CVTSQ2SD: bad operands")
}
// CVTSQ2SS: Convert Dword Integer to Scalar Single-Precision FP Value.
//
// Forms:
//
// CVTSQ2SS r64 xmm
// CVTSQ2SS m64 xmm
func CVTSQ2SS(mr, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR64(mr) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "CVTSQ2SS",
Operands: []operand.Op{mr, x},
Inputs: []operand.Op{mr, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE"},
}, nil
case operand.IsM64(mr) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "CVTSQ2SS",
Operands: []operand.Op{mr, x},
Inputs: []operand.Op{mr, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE"},
}, nil
}
return nil, errors.New("CVTSQ2SS: bad operands")
}
// CVTSS2SD: Convert Scalar Single-Precision FP Value to Scalar Double-Precision FP Value.
//
// Forms:
//
// CVTSS2SD xmm xmm
// CVTSS2SD m32 xmm
func CVTSS2SD(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "CVTSS2SD",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
case operand.IsM32(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "CVTSS2SD",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("CVTSS2SD: bad operands")
}
// CVTSS2SL: Convert Scalar Single-Precision FP Value to Dword Integer.
//
// Forms:
//
// CVTSS2SL xmm r32
// CVTSS2SL m32 r32
// CVTSS2SL xmm r64
// CVTSS2SL m32 r64
func CVTSS2SL(mx, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "CVTSS2SL",
Operands: []operand.Op{mx, r},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{r},
ISA: []string{"SSE"},
}, nil
case operand.IsM32(mx) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "CVTSS2SL",
Operands: []operand.Op{mx, r},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{r},
ISA: []string{"SSE"},
}, nil
case operand.IsXMM(mx) && operand.IsR64(r):
return &intrep.Instruction{
Opcode: "CVTSS2SL",
Operands: []operand.Op{mx, r},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{r},
ISA: []string{"SSE"},
}, nil
case operand.IsM32(mx) && operand.IsR64(r):
return &intrep.Instruction{
Opcode: "CVTSS2SL",
Operands: []operand.Op{mx, r},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{r},
ISA: []string{"SSE"},
}, nil
}
return nil, errors.New("CVTSS2SL: bad operands")
}
// CVTTPD2PL: Convert with Truncation Packed Double-Precision FP Values to Packed Dword Integers.
//
// Forms:
//
// CVTTPD2PL xmm xmm
// CVTTPD2PL m128 xmm
func CVTTPD2PL(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "CVTTPD2PL",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "CVTTPD2PL",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("CVTTPD2PL: bad operands")
}
// CVTTPS2PL: Convert with Truncation Packed Single-Precision FP Values to Packed Dword Integers.
//
// Forms:
//
// CVTTPS2PL xmm xmm
// CVTTPS2PL m128 xmm
func CVTTPS2PL(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "CVTTPS2PL",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "CVTTPS2PL",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("CVTTPS2PL: bad operands")
}
// CVTTSD2SL: Convert with Truncation Scalar Double-Precision FP Value to Signed Integer.
//
// Forms:
//
// CVTTSD2SL xmm r32
// CVTTSD2SL m64 r32
func CVTTSD2SL(mx, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "CVTTSD2SL",
Operands: []operand.Op{mx, r},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{r},
ISA: []string{"SSE2"},
}, nil
case operand.IsM64(mx) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "CVTTSD2SL",
Operands: []operand.Op{mx, r},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{r},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("CVTTSD2SL: bad operands")
}
// CVTTSD2SQ: Convert with Truncation Scalar Double-Precision FP Value to Signed Integer.
//
// Forms:
//
// CVTTSD2SQ xmm r64
// CVTTSD2SQ m64 r64
func CVTTSD2SQ(mx, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsR64(r):
return &intrep.Instruction{
Opcode: "CVTTSD2SQ",
Operands: []operand.Op{mx, r},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{r},
ISA: []string{"SSE2"},
}, nil
case operand.IsM64(mx) && operand.IsR64(r):
return &intrep.Instruction{
Opcode: "CVTTSD2SQ",
Operands: []operand.Op{mx, r},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{r},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("CVTTSD2SQ: bad operands")
}
// CVTTSS2SL: Convert with Truncation Scalar Single-Precision FP Value to Dword Integer.
//
// Forms:
//
// CVTTSS2SL xmm r32
// CVTTSS2SL m32 r32
// CVTTSS2SL xmm r64
// CVTTSS2SL m32 r64
func CVTTSS2SL(mx, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "CVTTSS2SL",
Operands: []operand.Op{mx, r},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{r},
ISA: []string{"SSE"},
}, nil
case operand.IsM32(mx) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "CVTTSS2SL",
Operands: []operand.Op{mx, r},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{r},
ISA: []string{"SSE"},
}, nil
case operand.IsXMM(mx) && operand.IsR64(r):
return &intrep.Instruction{
Opcode: "CVTTSS2SL",
Operands: []operand.Op{mx, r},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{r},
ISA: []string{"SSE"},
}, nil
case operand.IsM32(mx) && operand.IsR64(r):
return &intrep.Instruction{
Opcode: "CVTTSS2SL",
Operands: []operand.Op{mx, r},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{r},
ISA: []string{"SSE"},
}, nil
}
return nil, errors.New("CVTTSS2SL: bad operands")
}
// CWD: Convert Word to Doubleword.
//
// Forms:
//
// CWD
func CWD() (*intrep.Instruction, error) {
return &intrep.Instruction{
Opcode: "CWD",
Operands: nil,
Inputs: []operand.Op{reg.AX},
Outputs: []operand.Op{reg.DX},
}, nil
}
// CWDE: Convert Word to Doubleword.
//
// Forms:
//
// CWDE
func CWDE() (*intrep.Instruction, error) {
return &intrep.Instruction{
Opcode: "CWDE",
Operands: nil,
Inputs: []operand.Op{reg.AX},
Outputs: []operand.Op{reg.EAX},
}, nil
}
// DECB: Decrement by 1.
//
// Forms:
//
// DECB r8
// DECB m8
func DECB(mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR8(mr):
return &intrep.Instruction{
Opcode: "DECB",
Operands: []operand.Op{mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsM8(mr):
return &intrep.Instruction{
Opcode: "DECB",
Operands: []operand.Op{mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
}
return nil, errors.New("DECB: bad operands")
}
// DECL: Decrement by 1.
//
// Forms:
//
// DECL r32
// DECL m32
func DECL(mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR32(mr):
return &intrep.Instruction{
Opcode: "DECL",
Operands: []operand.Op{mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsM32(mr):
return &intrep.Instruction{
Opcode: "DECL",
Operands: []operand.Op{mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
}
return nil, errors.New("DECL: bad operands")
}
// DECQ: Decrement by 1.
//
// Forms:
//
// DECQ r64
// DECQ m64
func DECQ(mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR64(mr):
return &intrep.Instruction{
Opcode: "DECQ",
Operands: []operand.Op{mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsM64(mr):
return &intrep.Instruction{
Opcode: "DECQ",
Operands: []operand.Op{mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
}
return nil, errors.New("DECQ: bad operands")
}
// DECW: Decrement by 1.
//
// Forms:
//
// DECW r16
// DECW m16
func DECW(mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR16(mr):
return &intrep.Instruction{
Opcode: "DECW",
Operands: []operand.Op{mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsM16(mr):
return &intrep.Instruction{
Opcode: "DECW",
Operands: []operand.Op{mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
}
return nil, errors.New("DECW: bad operands")
}
// DIVB: Unsigned Divide.
//
// Forms:
//
// DIVB r8
// DIVB m8
func DIVB(mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR8(mr):
return &intrep.Instruction{
Opcode: "DIVB",
Operands: []operand.Op{mr},
Inputs: []operand.Op{mr, reg.AX},
Outputs: []operand.Op{reg.AX},
}, nil
case operand.IsM8(mr):
return &intrep.Instruction{
Opcode: "DIVB",
Operands: []operand.Op{mr},
Inputs: []operand.Op{mr, reg.AX},
Outputs: []operand.Op{reg.AX},
}, nil
}
return nil, errors.New("DIVB: bad operands")
}
// DIVL: Unsigned Divide.
//
// Forms:
//
// DIVL r32
// DIVL m32
func DIVL(mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR32(mr):
return &intrep.Instruction{
Opcode: "DIVL",
Operands: []operand.Op{mr},
Inputs: []operand.Op{mr, reg.EAX, reg.EDX},
Outputs: []operand.Op{reg.EAX, reg.EDX},
}, nil
case operand.IsM32(mr):
return &intrep.Instruction{
Opcode: "DIVL",
Operands: []operand.Op{mr},
Inputs: []operand.Op{mr, reg.EAX, reg.EDX},
Outputs: []operand.Op{reg.EAX, reg.EDX},
}, nil
}
return nil, errors.New("DIVL: bad operands")
}
// DIVPD: Divide Packed Double-Precision Floating-Point Values.
//
// Forms:
//
// DIVPD xmm xmm
// DIVPD m128 xmm
func DIVPD(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "DIVPD",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "DIVPD",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("DIVPD: bad operands")
}
// DIVPS: Divide Packed Single-Precision Floating-Point Values.
//
// Forms:
//
// DIVPS xmm xmm
// DIVPS m128 xmm
func DIVPS(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "DIVPS",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "DIVPS",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE"},
}, nil
}
return nil, errors.New("DIVPS: bad operands")
}
// DIVQ: Unsigned Divide.
//
// Forms:
//
// DIVQ r64
// DIVQ m64
func DIVQ(mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR64(mr):
return &intrep.Instruction{
Opcode: "DIVQ",
Operands: []operand.Op{mr},
Inputs: []operand.Op{mr, reg.RAX, reg.RDX},
Outputs: []operand.Op{reg.RAX, reg.RDX},
}, nil
case operand.IsM64(mr):
return &intrep.Instruction{
Opcode: "DIVQ",
Operands: []operand.Op{mr},
Inputs: []operand.Op{mr, reg.RAX, reg.RDX},
Outputs: []operand.Op{reg.RAX, reg.RDX},
}, nil
}
return nil, errors.New("DIVQ: bad operands")
}
// DIVSD: Divide Scalar Double-Precision Floating-Point Values.
//
// Forms:
//
// DIVSD xmm xmm
// DIVSD m64 xmm
func DIVSD(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "DIVSD",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
case operand.IsM64(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "DIVSD",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("DIVSD: bad operands")
}
// DIVSS: Divide Scalar Single-Precision Floating-Point Values.
//
// Forms:
//
// DIVSS xmm xmm
// DIVSS m32 xmm
func DIVSS(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "DIVSS",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE"},
}, nil
case operand.IsM32(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "DIVSS",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE"},
}, nil
}
return nil, errors.New("DIVSS: bad operands")
}
// DIVW: Unsigned Divide.
//
// Forms:
//
// DIVW r16
// DIVW m16
func DIVW(mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR16(mr):
return &intrep.Instruction{
Opcode: "DIVW",
Operands: []operand.Op{mr},
Inputs: []operand.Op{mr, reg.AX, reg.DX},
Outputs: []operand.Op{reg.AX, reg.DX},
}, nil
case operand.IsM16(mr):
return &intrep.Instruction{
Opcode: "DIVW",
Operands: []operand.Op{mr},
Inputs: []operand.Op{mr, reg.AX, reg.DX},
Outputs: []operand.Op{reg.AX, reg.DX},
}, nil
}
return nil, errors.New("DIVW: bad operands")
}
// DPPD: Dot Product of Packed Double Precision Floating-Point Values.
//
// Forms:
//
// DPPD imm8 xmm xmm
// DPPD imm8 m128 xmm
func DPPD(i, mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(i) && operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "DPPD",
Operands: []operand.Op{i, mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE4.1"},
}, nil
case operand.IsIMM8(i) && operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "DPPD",
Operands: []operand.Op{i, mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE4.1"},
}, nil
}
return nil, errors.New("DPPD: bad operands")
}
// DPPS: Dot Product of Packed Single Precision Floating-Point Values.
//
// Forms:
//
// DPPS imm8 xmm xmm
// DPPS imm8 m128 xmm
func DPPS(i, mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(i) && operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "DPPS",
Operands: []operand.Op{i, mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE4.1"},
}, nil
case operand.IsIMM8(i) && operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "DPPS",
Operands: []operand.Op{i, mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE4.1"},
}, nil
}
return nil, errors.New("DPPS: bad operands")
}
// EXTRACTPS: Extract Packed Single Precision Floating-Point Value.
//
// Forms:
//
// EXTRACTPS imm2u xmm r32
// EXTRACTPS imm2u xmm m32
func EXTRACTPS(i, x, mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM2U(i) && operand.IsXMM(x) && operand.IsR32(mr):
return &intrep.Instruction{
Opcode: "EXTRACTPS",
Operands: []operand.Op{i, x, mr},
Inputs: []operand.Op{x},
Outputs: []operand.Op{mr},
ISA: []string{"SSE4.1"},
}, nil
case operand.IsIMM2U(i) && operand.IsXMM(x) && operand.IsM32(mr):
return &intrep.Instruction{
Opcode: "EXTRACTPS",
Operands: []operand.Op{i, x, mr},
Inputs: []operand.Op{x},
Outputs: []operand.Op{mr},
ISA: []string{"SSE4.1"},
}, nil
}
return nil, errors.New("EXTRACTPS: bad operands")
}
// HADDPD: Packed Double-FP Horizontal Add.
//
// Forms:
//
// HADDPD xmm xmm
// HADDPD m128 xmm
func HADDPD(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "HADDPD",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE3"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "HADDPD",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE3"},
}, nil
}
return nil, errors.New("HADDPD: bad operands")
}
// HADDPS: Packed Single-FP Horizontal Add.
//
// Forms:
//
// HADDPS xmm xmm
// HADDPS m128 xmm
func HADDPS(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "HADDPS",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE3"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "HADDPS",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE3"},
}, nil
}
return nil, errors.New("HADDPS: bad operands")
}
// HSUBPD: Packed Double-FP Horizontal Subtract.
//
// Forms:
//
// HSUBPD xmm xmm
// HSUBPD m128 xmm
func HSUBPD(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "HSUBPD",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE3"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "HSUBPD",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE3"},
}, nil
}
return nil, errors.New("HSUBPD: bad operands")
}
// HSUBPS: Packed Single-FP Horizontal Subtract.
//
// Forms:
//
// HSUBPS xmm xmm
// HSUBPS m128 xmm
func HSUBPS(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "HSUBPS",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE3"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "HSUBPS",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE3"},
}, nil
}
return nil, errors.New("HSUBPS: bad operands")
}
// IDIVB: Signed Divide.
//
// Forms:
//
// IDIVB r8
// IDIVB m8
func IDIVB(mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR8(mr):
return &intrep.Instruction{
Opcode: "IDIVB",
Operands: []operand.Op{mr},
Inputs: []operand.Op{mr, reg.AX},
Outputs: []operand.Op{reg.AX},
}, nil
case operand.IsM8(mr):
return &intrep.Instruction{
Opcode: "IDIVB",
Operands: []operand.Op{mr},
Inputs: []operand.Op{mr, reg.AX},
Outputs: []operand.Op{reg.AX},
}, nil
}
return nil, errors.New("IDIVB: bad operands")
}
// IDIVL: Signed Divide.
//
// Forms:
//
// IDIVL r32
// IDIVL m32
func IDIVL(mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR32(mr):
return &intrep.Instruction{
Opcode: "IDIVL",
Operands: []operand.Op{mr},
Inputs: []operand.Op{mr, reg.EAX, reg.EDX},
Outputs: []operand.Op{reg.EAX, reg.EDX},
}, nil
case operand.IsM32(mr):
return &intrep.Instruction{
Opcode: "IDIVL",
Operands: []operand.Op{mr},
Inputs: []operand.Op{mr, reg.EAX, reg.EDX},
Outputs: []operand.Op{reg.EAX, reg.EDX},
}, nil
}
return nil, errors.New("IDIVL: bad operands")
}
// IDIVQ: Signed Divide.
//
// Forms:
//
// IDIVQ r64
// IDIVQ m64
func IDIVQ(mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR64(mr):
return &intrep.Instruction{
Opcode: "IDIVQ",
Operands: []operand.Op{mr},
Inputs: []operand.Op{mr, reg.RAX, reg.RDX},
Outputs: []operand.Op{reg.RAX, reg.RDX},
}, nil
case operand.IsM64(mr):
return &intrep.Instruction{
Opcode: "IDIVQ",
Operands: []operand.Op{mr},
Inputs: []operand.Op{mr, reg.RAX, reg.RDX},
Outputs: []operand.Op{reg.RAX, reg.RDX},
}, nil
}
return nil, errors.New("IDIVQ: bad operands")
}
// IDIVW: Signed Divide.
//
// Forms:
//
// IDIVW r16
// IDIVW m16
func IDIVW(mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR16(mr):
return &intrep.Instruction{
Opcode: "IDIVW",
Operands: []operand.Op{mr},
Inputs: []operand.Op{mr, reg.AX, reg.DX},
Outputs: []operand.Op{reg.AX, reg.DX},
}, nil
case operand.IsM16(mr):
return &intrep.Instruction{
Opcode: "IDIVW",
Operands: []operand.Op{mr},
Inputs: []operand.Op{mr, reg.AX, reg.DX},
Outputs: []operand.Op{reg.AX, reg.DX},
}, nil
}
return nil, errors.New("IDIVW: bad operands")
}
// IMUL3L: Signed Multiply.
//
// Forms:
//
// IMUL3L imm8 r32 r32
// IMUL3L imm32 r32 r32
// IMUL3L imm8 m32 r32
// IMUL3L imm32 m32 r32
func IMUL3L(i, mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(i) && operand.IsR32(mr) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "IMUL3L",
Operands: []operand.Op{i, mr, r},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{r},
}, nil
case operand.IsIMM32(i) && operand.IsR32(mr) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "IMUL3L",
Operands: []operand.Op{i, mr, r},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{r},
}, nil
case operand.IsIMM8(i) && operand.IsM32(mr) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "IMUL3L",
Operands: []operand.Op{i, mr, r},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{r},
}, nil
case operand.IsIMM32(i) && operand.IsM32(mr) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "IMUL3L",
Operands: []operand.Op{i, mr, r},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{r},
}, nil
}
return nil, errors.New("IMUL3L: bad operands")
}
// IMUL3Q: Signed Multiply.
//
// Forms:
//
// IMUL3Q imm8 r64 r64
// IMUL3Q imm32 r64 r64
// IMUL3Q imm8 m64 r64
// IMUL3Q imm32 m64 r64
func IMUL3Q(i, mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(i) && operand.IsR64(mr) && operand.IsR64(r):
return &intrep.Instruction{
Opcode: "IMUL3Q",
Operands: []operand.Op{i, mr, r},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{r},
}, nil
case operand.IsIMM32(i) && operand.IsR64(mr) && operand.IsR64(r):
return &intrep.Instruction{
Opcode: "IMUL3Q",
Operands: []operand.Op{i, mr, r},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{r},
}, nil
case operand.IsIMM8(i) && operand.IsM64(mr) && operand.IsR64(r):
return &intrep.Instruction{
Opcode: "IMUL3Q",
Operands: []operand.Op{i, mr, r},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{r},
}, nil
case operand.IsIMM32(i) && operand.IsM64(mr) && operand.IsR64(r):
return &intrep.Instruction{
Opcode: "IMUL3Q",
Operands: []operand.Op{i, mr, r},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{r},
}, nil
}
return nil, errors.New("IMUL3Q: bad operands")
}
// IMUL3W: Signed Multiply.
//
// Forms:
//
// IMUL3W imm8 r16 r16
// IMUL3W imm16 r16 r16
// IMUL3W imm8 m16 r16
// IMUL3W imm16 m16 r16
func IMUL3W(i, mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(i) && operand.IsR16(mr) && operand.IsR16(r):
return &intrep.Instruction{
Opcode: "IMUL3W",
Operands: []operand.Op{i, mr, r},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{r},
}, nil
case operand.IsIMM16(i) && operand.IsR16(mr) && operand.IsR16(r):
return &intrep.Instruction{
Opcode: "IMUL3W",
Operands: []operand.Op{i, mr, r},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{r},
}, nil
case operand.IsIMM8(i) && operand.IsM16(mr) && operand.IsR16(r):
return &intrep.Instruction{
Opcode: "IMUL3W",
Operands: []operand.Op{i, mr, r},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{r},
}, nil
case operand.IsIMM16(i) && operand.IsM16(mr) && operand.IsR16(r):
return &intrep.Instruction{
Opcode: "IMUL3W",
Operands: []operand.Op{i, mr, r},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{r},
}, nil
}
return nil, errors.New("IMUL3W: bad operands")
}
// IMULB: Signed Multiply.
//
// Forms:
//
// IMULB r8
// IMULB m8
func IMULB(mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR8(mr):
return &intrep.Instruction{
Opcode: "IMULB",
Operands: []operand.Op{mr},
Inputs: []operand.Op{mr, reg.AL},
Outputs: []operand.Op{reg.AX},
}, nil
case operand.IsM8(mr):
return &intrep.Instruction{
Opcode: "IMULB",
Operands: []operand.Op{mr},
Inputs: []operand.Op{mr, reg.AL},
Outputs: []operand.Op{reg.AX},
}, nil
}
return nil, errors.New("IMULB: bad operands")
}
// IMULL: Signed Multiply.
//
// Forms:
//
// IMULL r32
// IMULL m32
// IMULL r32 r32
// IMULL m32 r32
func IMULL(ops ...operand.Op) (*intrep.Instruction, error) {
switch {
case len(ops) == 1 && operand.IsR32(ops[0]):
return &intrep.Instruction{
Opcode: "IMULL",
Operands: ops,
Inputs: []operand.Op{ops[0], reg.EAX},
Outputs: []operand.Op{reg.EAX, reg.EDX},
}, nil
case len(ops) == 1 && operand.IsM32(ops[0]):
return &intrep.Instruction{
Opcode: "IMULL",
Operands: ops,
Inputs: []operand.Op{ops[0], reg.EAX},
Outputs: []operand.Op{reg.EAX, reg.EDX},
}, nil
case len(ops) == 2 && operand.IsR32(ops[0]) && operand.IsR32(ops[1]):
return &intrep.Instruction{
Opcode: "IMULL",
Operands: ops,
Inputs: []operand.Op{ops[0], ops[1]},
Outputs: []operand.Op{ops[1]},
}, nil
case len(ops) == 2 && operand.IsM32(ops[0]) && operand.IsR32(ops[1]):
return &intrep.Instruction{
Opcode: "IMULL",
Operands: ops,
Inputs: []operand.Op{ops[0], ops[1]},
Outputs: []operand.Op{ops[1]},
}, nil
}
return nil, errors.New("IMULL: bad operands")
}
// IMULQ: Signed Multiply.
//
// Forms:
//
// IMULQ r64
// IMULQ m64
// IMULQ r64 r64
// IMULQ m64 r64
func IMULQ(ops ...operand.Op) (*intrep.Instruction, error) {
switch {
case len(ops) == 1 && operand.IsR64(ops[0]):
return &intrep.Instruction{
Opcode: "IMULQ",
Operands: ops,
Inputs: []operand.Op{ops[0], reg.RAX},
Outputs: []operand.Op{reg.RAX, reg.RDX},
}, nil
case len(ops) == 1 && operand.IsM64(ops[0]):
return &intrep.Instruction{
Opcode: "IMULQ",
Operands: ops,
Inputs: []operand.Op{ops[0], reg.RAX},
Outputs: []operand.Op{reg.RAX, reg.RDX},
}, nil
case len(ops) == 2 && operand.IsR64(ops[0]) && operand.IsR64(ops[1]):
return &intrep.Instruction{
Opcode: "IMULQ",
Operands: ops,
Inputs: []operand.Op{ops[0], ops[1]},
Outputs: []operand.Op{ops[1]},
}, nil
case len(ops) == 2 && operand.IsM64(ops[0]) && operand.IsR64(ops[1]):
return &intrep.Instruction{
Opcode: "IMULQ",
Operands: ops,
Inputs: []operand.Op{ops[0], ops[1]},
Outputs: []operand.Op{ops[1]},
}, nil
}
return nil, errors.New("IMULQ: bad operands")
}
// IMULW: Signed Multiply.
//
// Forms:
//
// IMULW r16
// IMULW m16
// IMULW r16 r16
// IMULW m16 r16
func IMULW(ops ...operand.Op) (*intrep.Instruction, error) {
switch {
case len(ops) == 1 && operand.IsR16(ops[0]):
return &intrep.Instruction{
Opcode: "IMULW",
Operands: ops,
Inputs: []operand.Op{ops[0], reg.AX},
Outputs: []operand.Op{reg.AX, reg.DX},
}, nil
case len(ops) == 1 && operand.IsM16(ops[0]):
return &intrep.Instruction{
Opcode: "IMULW",
Operands: ops,
Inputs: []operand.Op{ops[0], reg.AX},
Outputs: []operand.Op{reg.AX, reg.DX},
}, nil
case len(ops) == 2 && operand.IsR16(ops[0]) && operand.IsR16(ops[1]):
return &intrep.Instruction{
Opcode: "IMULW",
Operands: ops,
Inputs: []operand.Op{ops[0], ops[1]},
Outputs: []operand.Op{ops[1]},
}, nil
case len(ops) == 2 && operand.IsM16(ops[0]) && operand.IsR16(ops[1]):
return &intrep.Instruction{
Opcode: "IMULW",
Operands: ops,
Inputs: []operand.Op{ops[0], ops[1]},
Outputs: []operand.Op{ops[1]},
}, nil
}
return nil, errors.New("IMULW: bad operands")
}
// INCB: Increment by 1.
//
// Forms:
//
// INCB r8
// INCB m8
func INCB(mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR8(mr):
return &intrep.Instruction{
Opcode: "INCB",
Operands: []operand.Op{mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsM8(mr):
return &intrep.Instruction{
Opcode: "INCB",
Operands: []operand.Op{mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
}
return nil, errors.New("INCB: bad operands")
}
// INCL: Increment by 1.
//
// Forms:
//
// INCL r32
// INCL m32
func INCL(mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR32(mr):
return &intrep.Instruction{
Opcode: "INCL",
Operands: []operand.Op{mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsM32(mr):
return &intrep.Instruction{
Opcode: "INCL",
Operands: []operand.Op{mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
}
return nil, errors.New("INCL: bad operands")
}
// INCQ: Increment by 1.
//
// Forms:
//
// INCQ r64
// INCQ m64
func INCQ(mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR64(mr):
return &intrep.Instruction{
Opcode: "INCQ",
Operands: []operand.Op{mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsM64(mr):
return &intrep.Instruction{
Opcode: "INCQ",
Operands: []operand.Op{mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
}
return nil, errors.New("INCQ: bad operands")
}
// INCW: Increment by 1.
//
// Forms:
//
// INCW r16
// INCW m16
func INCW(mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR16(mr):
return &intrep.Instruction{
Opcode: "INCW",
Operands: []operand.Op{mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsM16(mr):
return &intrep.Instruction{
Opcode: "INCW",
Operands: []operand.Op{mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
}
return nil, errors.New("INCW: bad operands")
}
// INSERTPS: Insert Packed Single Precision Floating-Point Value.
//
// Forms:
//
// INSERTPS imm8 xmm xmm
// INSERTPS imm8 m32 xmm
func INSERTPS(i, mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(i) && operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "INSERTPS",
Operands: []operand.Op{i, mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE4.1"},
}, nil
case operand.IsIMM8(i) && operand.IsM32(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "INSERTPS",
Operands: []operand.Op{i, mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE4.1"},
}, nil
}
return nil, errors.New("INSERTPS: bad operands")
}
// INT: Call to Interrupt Procedure.
//
// Forms:
//
// INT 3
// INT imm8
func INT(i operand.Op) (*intrep.Instruction, error) {
switch {
case operand.Is3(i):
return &intrep.Instruction{
Opcode: "INT",
Operands: []operand.Op{i},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
}, nil
case operand.IsIMM8(i):
return &intrep.Instruction{
Opcode: "INT",
Operands: []operand.Op{i},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
}, nil
}
return nil, errors.New("INT: bad operands")
}
// JA: Jump if above (CF == 0 and ZF == 0).
//
// Forms:
//
// JA rel8
// JA rel32
func JA(r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsREL8(r):
return &intrep.Instruction{
Opcode: "JA",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: true,
}, nil
case operand.IsREL32(r):
return &intrep.Instruction{
Opcode: "JA",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: true,
}, nil
}
return nil, errors.New("JA: bad operands")
}
// JAE: Jump if above or equal (CF == 0).
//
// Forms:
//
// JAE rel8
// JAE rel32
func JAE(r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsREL8(r):
return &intrep.Instruction{
Opcode: "JAE",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: true,
}, nil
case operand.IsREL32(r):
return &intrep.Instruction{
Opcode: "JAE",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: true,
}, nil
}
return nil, errors.New("JAE: bad operands")
}
// JB: Jump if below (CF == 1).
//
// Forms:
//
// JB rel8
// JB rel32
func JB(r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsREL8(r):
return &intrep.Instruction{
Opcode: "JB",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: true,
}, nil
case operand.IsREL32(r):
return &intrep.Instruction{
Opcode: "JB",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: true,
}, nil
}
return nil, errors.New("JB: bad operands")
}
// JBE: Jump if below or equal (CF == 1 or ZF == 1).
//
// Forms:
//
// JBE rel8
// JBE rel32
func JBE(r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsREL8(r):
return &intrep.Instruction{
Opcode: "JBE",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: true,
}, nil
case operand.IsREL32(r):
return &intrep.Instruction{
Opcode: "JBE",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: true,
}, nil
}
return nil, errors.New("JBE: bad operands")
}
// JC: Jump if below (CF == 1).
//
// Forms:
//
// JC rel8
// JC rel32
func JC(r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsREL8(r):
return &intrep.Instruction{
Opcode: "JC",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: true,
}, nil
case operand.IsREL32(r):
return &intrep.Instruction{
Opcode: "JC",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: true,
}, nil
}
return nil, errors.New("JC: bad operands")
}
// JCC: Jump if above or equal (CF == 0).
//
// Forms:
//
// JCC rel8
// JCC rel32
func JCC(r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsREL8(r):
return &intrep.Instruction{
Opcode: "JCC",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: true,
}, nil
case operand.IsREL32(r):
return &intrep.Instruction{
Opcode: "JCC",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: true,
}, nil
}
return nil, errors.New("JCC: bad operands")
}
// JCS: Jump if below (CF == 1).
//
// Forms:
//
// JCS rel8
// JCS rel32
func JCS(r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsREL8(r):
return &intrep.Instruction{
Opcode: "JCS",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: true,
}, nil
case operand.IsREL32(r):
return &intrep.Instruction{
Opcode: "JCS",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: true,
}, nil
}
return nil, errors.New("JCS: bad operands")
}
// JCXZL: Jump if ECX register is 0.
//
// Forms:
//
// JCXZL rel8
func JCXZL(r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsREL8(r):
return &intrep.Instruction{
Opcode: "JCXZL",
Operands: []operand.Op{r},
Inputs: []operand.Op{reg.ECX},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: true,
}, nil
}
return nil, errors.New("JCXZL: bad operands")
}
// JCXZQ: Jump if RCX register is 0.
//
// Forms:
//
// JCXZQ rel8
func JCXZQ(r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsREL8(r):
return &intrep.Instruction{
Opcode: "JCXZQ",
Operands: []operand.Op{r},
Inputs: []operand.Op{reg.RCX},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: true,
}, nil
}
return nil, errors.New("JCXZQ: bad operands")
}
// JE: Jump if equal (ZF == 1).
//
// Forms:
//
// JE rel8
// JE rel32
func JE(r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsREL8(r):
return &intrep.Instruction{
Opcode: "JE",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: true,
}, nil
case operand.IsREL32(r):
return &intrep.Instruction{
Opcode: "JE",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: true,
}, nil
}
return nil, errors.New("JE: bad operands")
}
// JEQ: Jump if equal (ZF == 1).
//
// Forms:
//
// JEQ rel8
// JEQ rel32
func JEQ(r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsREL8(r):
return &intrep.Instruction{
Opcode: "JEQ",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: true,
}, nil
case operand.IsREL32(r):
return &intrep.Instruction{
Opcode: "JEQ",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: true,
}, nil
}
return nil, errors.New("JEQ: bad operands")
}
// JG: Jump if greater (ZF == 0 and SF == OF).
//
// Forms:
//
// JG rel8
// JG rel32
func JG(r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsREL8(r):
return &intrep.Instruction{
Opcode: "JG",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: true,
}, nil
case operand.IsREL32(r):
return &intrep.Instruction{
Opcode: "JG",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: true,
}, nil
}
return nil, errors.New("JG: bad operands")
}
// JGE: Jump if greater or equal (SF == OF).
//
// Forms:
//
// JGE rel8
// JGE rel32
func JGE(r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsREL8(r):
return &intrep.Instruction{
Opcode: "JGE",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: true,
}, nil
case operand.IsREL32(r):
return &intrep.Instruction{
Opcode: "JGE",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: true,
}, nil
}
return nil, errors.New("JGE: bad operands")
}
// JGT: Jump if greater (ZF == 0 and SF == OF).
//
// Forms:
//
// JGT rel8
// JGT rel32
func JGT(r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsREL8(r):
return &intrep.Instruction{
Opcode: "JGT",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: true,
}, nil
case operand.IsREL32(r):
return &intrep.Instruction{
Opcode: "JGT",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: true,
}, nil
}
return nil, errors.New("JGT: bad operands")
}
// JHI: Jump if above (CF == 0 and ZF == 0).
//
// Forms:
//
// JHI rel8
// JHI rel32
func JHI(r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsREL8(r):
return &intrep.Instruction{
Opcode: "JHI",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: true,
}, nil
case operand.IsREL32(r):
return &intrep.Instruction{
Opcode: "JHI",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: true,
}, nil
}
return nil, errors.New("JHI: bad operands")
}
// JHS: Jump if above or equal (CF == 0).
//
// Forms:
//
// JHS rel8
// JHS rel32
func JHS(r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsREL8(r):
return &intrep.Instruction{
Opcode: "JHS",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: true,
}, nil
case operand.IsREL32(r):
return &intrep.Instruction{
Opcode: "JHS",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: true,
}, nil
}
return nil, errors.New("JHS: bad operands")
}
// JL: Jump if less (SF != OF).
//
// Forms:
//
// JL rel8
// JL rel32
func JL(r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsREL8(r):
return &intrep.Instruction{
Opcode: "JL",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: true,
}, nil
case operand.IsREL32(r):
return &intrep.Instruction{
Opcode: "JL",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: true,
}, nil
}
return nil, errors.New("JL: bad operands")
}
// JLE: Jump if less or equal (ZF == 1 or SF != OF).
//
// Forms:
//
// JLE rel8
// JLE rel32
func JLE(r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsREL8(r):
return &intrep.Instruction{
Opcode: "JLE",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: true,
}, nil
case operand.IsREL32(r):
return &intrep.Instruction{
Opcode: "JLE",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: true,
}, nil
}
return nil, errors.New("JLE: bad operands")
}
// JLO: Jump if below (CF == 1).
//
// Forms:
//
// JLO rel8
// JLO rel32
func JLO(r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsREL8(r):
return &intrep.Instruction{
Opcode: "JLO",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: true,
}, nil
case operand.IsREL32(r):
return &intrep.Instruction{
Opcode: "JLO",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: true,
}, nil
}
return nil, errors.New("JLO: bad operands")
}
// JLS: Jump if below or equal (CF == 1 or ZF == 1).
//
// Forms:
//
// JLS rel8
// JLS rel32
func JLS(r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsREL8(r):
return &intrep.Instruction{
Opcode: "JLS",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: true,
}, nil
case operand.IsREL32(r):
return &intrep.Instruction{
Opcode: "JLS",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: true,
}, nil
}
return nil, errors.New("JLS: bad operands")
}
// JLT: Jump if less (SF != OF).
//
// Forms:
//
// JLT rel8
// JLT rel32
func JLT(r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsREL8(r):
return &intrep.Instruction{
Opcode: "JLT",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: true,
}, nil
case operand.IsREL32(r):
return &intrep.Instruction{
Opcode: "JLT",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: true,
}, nil
}
return nil, errors.New("JLT: bad operands")
}
// JMI: Jump if sign (SF == 1).
//
// Forms:
//
// JMI rel8
// JMI rel32
func JMI(r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsREL8(r):
return &intrep.Instruction{
Opcode: "JMI",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: true,
}, nil
case operand.IsREL32(r):
return &intrep.Instruction{
Opcode: "JMI",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: true,
}, nil
}
return nil, errors.New("JMI: bad operands")
}
// JMP: Jump Unconditionally.
//
// Forms:
//
// JMP rel8
// JMP rel32
// JMP r64
// JMP m64
func JMP(mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsREL8(mr):
return &intrep.Instruction{
Opcode: "JMP",
Operands: []operand.Op{mr},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: false,
}, nil
case operand.IsREL32(mr):
return &intrep.Instruction{
Opcode: "JMP",
Operands: []operand.Op{mr},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: false,
}, nil
case operand.IsR64(mr):
return &intrep.Instruction{
Opcode: "JMP",
Operands: []operand.Op{mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: false,
}, nil
case operand.IsM64(mr):
return &intrep.Instruction{
Opcode: "JMP",
Operands: []operand.Op{mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: false,
}, nil
}
return nil, errors.New("JMP: bad operands")
}
// JNA: Jump if below or equal (CF == 1 or ZF == 1).
//
// Forms:
//
// JNA rel8
// JNA rel32
func JNA(r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsREL8(r):
return &intrep.Instruction{
Opcode: "JNA",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: true,
}, nil
case operand.IsREL32(r):
return &intrep.Instruction{
Opcode: "JNA",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: true,
}, nil
}
return nil, errors.New("JNA: bad operands")
}
// JNAE: Jump if below (CF == 1).
//
// Forms:
//
// JNAE rel8
// JNAE rel32
func JNAE(r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsREL8(r):
return &intrep.Instruction{
Opcode: "JNAE",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: true,
}, nil
case operand.IsREL32(r):
return &intrep.Instruction{
Opcode: "JNAE",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: true,
}, nil
}
return nil, errors.New("JNAE: bad operands")
}
// JNB: Jump if above or equal (CF == 0).
//
// Forms:
//
// JNB rel8
// JNB rel32
func JNB(r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsREL8(r):
return &intrep.Instruction{
Opcode: "JNB",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: true,
}, nil
case operand.IsREL32(r):
return &intrep.Instruction{
Opcode: "JNB",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: true,
}, nil
}
return nil, errors.New("JNB: bad operands")
}
// JNBE: Jump if above (CF == 0 and ZF == 0).
//
// Forms:
//
// JNBE rel8
// JNBE rel32
func JNBE(r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsREL8(r):
return &intrep.Instruction{
Opcode: "JNBE",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: true,
}, nil
case operand.IsREL32(r):
return &intrep.Instruction{
Opcode: "JNBE",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: true,
}, nil
}
return nil, errors.New("JNBE: bad operands")
}
// JNC: Jump if above or equal (CF == 0).
//
// Forms:
//
// JNC rel8
// JNC rel32
func JNC(r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsREL8(r):
return &intrep.Instruction{
Opcode: "JNC",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: true,
}, nil
case operand.IsREL32(r):
return &intrep.Instruction{
Opcode: "JNC",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: true,
}, nil
}
return nil, errors.New("JNC: bad operands")
}
// JNE: Jump if not equal (ZF == 0).
//
// Forms:
//
// JNE rel8
// JNE rel32
func JNE(r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsREL8(r):
return &intrep.Instruction{
Opcode: "JNE",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: true,
}, nil
case operand.IsREL32(r):
return &intrep.Instruction{
Opcode: "JNE",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: true,
}, nil
}
return nil, errors.New("JNE: bad operands")
}
// JNG: Jump if less or equal (ZF == 1 or SF != OF).
//
// Forms:
//
// JNG rel8
// JNG rel32
func JNG(r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsREL8(r):
return &intrep.Instruction{
Opcode: "JNG",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: true,
}, nil
case operand.IsREL32(r):
return &intrep.Instruction{
Opcode: "JNG",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: true,
}, nil
}
return nil, errors.New("JNG: bad operands")
}
// JNGE: Jump if less (SF != OF).
//
// Forms:
//
// JNGE rel8
// JNGE rel32
func JNGE(r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsREL8(r):
return &intrep.Instruction{
Opcode: "JNGE",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: true,
}, nil
case operand.IsREL32(r):
return &intrep.Instruction{
Opcode: "JNGE",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: true,
}, nil
}
return nil, errors.New("JNGE: bad operands")
}
// JNL: Jump if greater or equal (SF == OF).
//
// Forms:
//
// JNL rel8
// JNL rel32
func JNL(r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsREL8(r):
return &intrep.Instruction{
Opcode: "JNL",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: true,
}, nil
case operand.IsREL32(r):
return &intrep.Instruction{
Opcode: "JNL",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: true,
}, nil
}
return nil, errors.New("JNL: bad operands")
}
// JNLE: Jump if greater (ZF == 0 and SF == OF).
//
// Forms:
//
// JNLE rel8
// JNLE rel32
func JNLE(r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsREL8(r):
return &intrep.Instruction{
Opcode: "JNLE",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: true,
}, nil
case operand.IsREL32(r):
return &intrep.Instruction{
Opcode: "JNLE",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: true,
}, nil
}
return nil, errors.New("JNLE: bad operands")
}
// JNO: Jump if not overflow (OF == 0).
//
// Forms:
//
// JNO rel8
// JNO rel32
func JNO(r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsREL8(r):
return &intrep.Instruction{
Opcode: "JNO",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: true,
}, nil
case operand.IsREL32(r):
return &intrep.Instruction{
Opcode: "JNO",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: true,
}, nil
}
return nil, errors.New("JNO: bad operands")
}
// JNP: Jump if not parity (PF == 0).
//
// Forms:
//
// JNP rel8
// JNP rel32
func JNP(r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsREL8(r):
return &intrep.Instruction{
Opcode: "JNP",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: true,
}, nil
case operand.IsREL32(r):
return &intrep.Instruction{
Opcode: "JNP",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: true,
}, nil
}
return nil, errors.New("JNP: bad operands")
}
// JNS: Jump if not sign (SF == 0).
//
// Forms:
//
// JNS rel8
// JNS rel32
func JNS(r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsREL8(r):
return &intrep.Instruction{
Opcode: "JNS",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: true,
}, nil
case operand.IsREL32(r):
return &intrep.Instruction{
Opcode: "JNS",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: true,
}, nil
}
return nil, errors.New("JNS: bad operands")
}
// JNZ: Jump if not equal (ZF == 0).
//
// Forms:
//
// JNZ rel8
// JNZ rel32
func JNZ(r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsREL8(r):
return &intrep.Instruction{
Opcode: "JNZ",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: true,
}, nil
case operand.IsREL32(r):
return &intrep.Instruction{
Opcode: "JNZ",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: true,
}, nil
}
return nil, errors.New("JNZ: bad operands")
}
// JO: Jump if overflow (OF == 1).
//
// Forms:
//
// JO rel8
// JO rel32
func JO(r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsREL8(r):
return &intrep.Instruction{
Opcode: "JO",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: true,
}, nil
case operand.IsREL32(r):
return &intrep.Instruction{
Opcode: "JO",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: true,
}, nil
}
return nil, errors.New("JO: bad operands")
}
// JOC: Jump if not overflow (OF == 0).
//
// Forms:
//
// JOC rel8
// JOC rel32
func JOC(r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsREL8(r):
return &intrep.Instruction{
Opcode: "JOC",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: true,
}, nil
case operand.IsREL32(r):
return &intrep.Instruction{
Opcode: "JOC",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: true,
}, nil
}
return nil, errors.New("JOC: bad operands")
}
// JOS: Jump if overflow (OF == 1).
//
// Forms:
//
// JOS rel8
// JOS rel32
func JOS(r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsREL8(r):
return &intrep.Instruction{
Opcode: "JOS",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: true,
}, nil
case operand.IsREL32(r):
return &intrep.Instruction{
Opcode: "JOS",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: true,
}, nil
}
return nil, errors.New("JOS: bad operands")
}
// JP: Jump if parity (PF == 1).
//
// Forms:
//
// JP rel8
// JP rel32
func JP(r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsREL8(r):
return &intrep.Instruction{
Opcode: "JP",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: true,
}, nil
case operand.IsREL32(r):
return &intrep.Instruction{
Opcode: "JP",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: true,
}, nil
}
return nil, errors.New("JP: bad operands")
}
// JPC: Jump if not parity (PF == 0).
//
// Forms:
//
// JPC rel8
// JPC rel32
func JPC(r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsREL8(r):
return &intrep.Instruction{
Opcode: "JPC",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: true,
}, nil
case operand.IsREL32(r):
return &intrep.Instruction{
Opcode: "JPC",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: true,
}, nil
}
return nil, errors.New("JPC: bad operands")
}
// JPE: Jump if parity (PF == 1).
//
// Forms:
//
// JPE rel8
// JPE rel32
func JPE(r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsREL8(r):
return &intrep.Instruction{
Opcode: "JPE",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: true,
}, nil
case operand.IsREL32(r):
return &intrep.Instruction{
Opcode: "JPE",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: true,
}, nil
}
return nil, errors.New("JPE: bad operands")
}
// JPL: Jump if not sign (SF == 0).
//
// Forms:
//
// JPL rel8
// JPL rel32
func JPL(r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsREL8(r):
return &intrep.Instruction{
Opcode: "JPL",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: true,
}, nil
case operand.IsREL32(r):
return &intrep.Instruction{
Opcode: "JPL",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: true,
}, nil
}
return nil, errors.New("JPL: bad operands")
}
// JPO: Jump if not parity (PF == 0).
//
// Forms:
//
// JPO rel8
// JPO rel32
func JPO(r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsREL8(r):
return &intrep.Instruction{
Opcode: "JPO",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: true,
}, nil
case operand.IsREL32(r):
return &intrep.Instruction{
Opcode: "JPO",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: true,
}, nil
}
return nil, errors.New("JPO: bad operands")
}
// JPS: Jump if parity (PF == 1).
//
// Forms:
//
// JPS rel8
// JPS rel32
func JPS(r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsREL8(r):
return &intrep.Instruction{
Opcode: "JPS",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: true,
}, nil
case operand.IsREL32(r):
return &intrep.Instruction{
Opcode: "JPS",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: true,
}, nil
}
return nil, errors.New("JPS: bad operands")
}
// JS: Jump if sign (SF == 1).
//
// Forms:
//
// JS rel8
// JS rel32
func JS(r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsREL8(r):
return &intrep.Instruction{
Opcode: "JS",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: true,
}, nil
case operand.IsREL32(r):
return &intrep.Instruction{
Opcode: "JS",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: true,
}, nil
}
return nil, errors.New("JS: bad operands")
}
// JZ: Jump if equal (ZF == 1).
//
// Forms:
//
// JZ rel8
// JZ rel32
func JZ(r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsREL8(r):
return &intrep.Instruction{
Opcode: "JZ",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: true,
}, nil
case operand.IsREL32(r):
return &intrep.Instruction{
Opcode: "JZ",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsBranch: true,
IsConditional: true,
}, nil
}
return nil, errors.New("JZ: bad operands")
}
// LDDQU: Load Unaligned Integer 128 Bits.
//
// Forms:
//
// LDDQU m128 xmm
func LDDQU(m, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsM128(m) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "LDDQU",
Operands: []operand.Op{m, x},
Inputs: []operand.Op{m},
Outputs: []operand.Op{x},
ISA: []string{"SSE3"},
}, nil
}
return nil, errors.New("LDDQU: bad operands")
}
// LDMXCSR: Load MXCSR Register.
//
// Forms:
//
// LDMXCSR m32
func LDMXCSR(m operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsM32(m):
return &intrep.Instruction{
Opcode: "LDMXCSR",
Operands: []operand.Op{m},
Inputs: []operand.Op{m},
Outputs: []operand.Op{},
ISA: []string{"SSE"},
}, nil
}
return nil, errors.New("LDMXCSR: bad operands")
}
// LEAL: Load Effective Address.
//
// Forms:
//
// LEAL m r32
func LEAL(m, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsM(m) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "LEAL",
Operands: []operand.Op{m, r},
Inputs: []operand.Op{m},
Outputs: []operand.Op{r},
}, nil
}
return nil, errors.New("LEAL: bad operands")
}
// LEAQ: Load Effective Address.
//
// Forms:
//
// LEAQ m r64
func LEAQ(m, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsM(m) && operand.IsR64(r):
return &intrep.Instruction{
Opcode: "LEAQ",
Operands: []operand.Op{m, r},
Inputs: []operand.Op{m},
Outputs: []operand.Op{r},
}, nil
}
return nil, errors.New("LEAQ: bad operands")
}
// LEAW: Load Effective Address.
//
// Forms:
//
// LEAW m r16
func LEAW(m, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsM(m) && operand.IsR16(r):
return &intrep.Instruction{
Opcode: "LEAW",
Operands: []operand.Op{m, r},
Inputs: []operand.Op{m},
Outputs: []operand.Op{r},
}, nil
}
return nil, errors.New("LEAW: bad operands")
}
// LFENCE: Load Fence.
//
// Forms:
//
// LFENCE
func LFENCE() (*intrep.Instruction, error) {
return &intrep.Instruction{
Opcode: "LFENCE",
Operands: nil,
Inputs: []operand.Op{},
Outputs: []operand.Op{},
ISA: []string{"SSE2"},
}, nil
}
// LZCNTL: Count the Number of Leading Zero Bits.
//
// Forms:
//
// LZCNTL r32 r32
// LZCNTL m32 r32
func LZCNTL(mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR32(mr) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "LZCNTL",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{r},
ISA: []string{"LZCNT"},
}, nil
case operand.IsM32(mr) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "LZCNTL",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{r},
ISA: []string{"LZCNT"},
}, nil
}
return nil, errors.New("LZCNTL: bad operands")
}
// LZCNTQ: Count the Number of Leading Zero Bits.
//
// Forms:
//
// LZCNTQ r64 r64
// LZCNTQ m64 r64
func LZCNTQ(mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR64(mr) && operand.IsR64(r):
return &intrep.Instruction{
Opcode: "LZCNTQ",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{r},
ISA: []string{"LZCNT"},
}, nil
case operand.IsM64(mr) && operand.IsR64(r):
return &intrep.Instruction{
Opcode: "LZCNTQ",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{r},
ISA: []string{"LZCNT"},
}, nil
}
return nil, errors.New("LZCNTQ: bad operands")
}
// LZCNTW: Count the Number of Leading Zero Bits.
//
// Forms:
//
// LZCNTW r16 r16
// LZCNTW m16 r16
func LZCNTW(mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR16(mr) && operand.IsR16(r):
return &intrep.Instruction{
Opcode: "LZCNTW",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{r},
ISA: []string{"LZCNT"},
}, nil
case operand.IsM16(mr) && operand.IsR16(r):
return &intrep.Instruction{
Opcode: "LZCNTW",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{r},
ISA: []string{"LZCNT"},
}, nil
}
return nil, errors.New("LZCNTW: bad operands")
}
// MASKMOVDQU: Store Selected Bytes of Double Quadword.
//
// Forms:
//
// MASKMOVDQU xmm xmm
func MASKMOVDQU(x, x1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "MASKMOVDQU",
Operands: []operand.Op{x, x1},
Inputs: []operand.Op{x, x1, reg.RDI},
Outputs: []operand.Op{},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("MASKMOVDQU: bad operands")
}
// MASKMOVOU: Store Selected Bytes of Double Quadword.
//
// Forms:
//
// MASKMOVOU xmm xmm
func MASKMOVOU(x, x1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "MASKMOVOU",
Operands: []operand.Op{x, x1},
Inputs: []operand.Op{x, x1, reg.RDI},
Outputs: []operand.Op{},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("MASKMOVOU: bad operands")
}
// MAXPD: Return Maximum Packed Double-Precision Floating-Point Values.
//
// Forms:
//
// MAXPD xmm xmm
// MAXPD m128 xmm
func MAXPD(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "MAXPD",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "MAXPD",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("MAXPD: bad operands")
}
// MAXPS: Return Maximum Packed Single-Precision Floating-Point Values.
//
// Forms:
//
// MAXPS xmm xmm
// MAXPS m128 xmm
func MAXPS(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "MAXPS",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "MAXPS",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE"},
}, nil
}
return nil, errors.New("MAXPS: bad operands")
}
// MAXSD: Return Maximum Scalar Double-Precision Floating-Point Value.
//
// Forms:
//
// MAXSD xmm xmm
// MAXSD m64 xmm
func MAXSD(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "MAXSD",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
case operand.IsM64(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "MAXSD",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("MAXSD: bad operands")
}
// MAXSS: Return Maximum Scalar Single-Precision Floating-Point Value.
//
// Forms:
//
// MAXSS xmm xmm
// MAXSS m32 xmm
func MAXSS(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "MAXSS",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE"},
}, nil
case operand.IsM32(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "MAXSS",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE"},
}, nil
}
return nil, errors.New("MAXSS: bad operands")
}
// MFENCE: Memory Fence.
//
// Forms:
//
// MFENCE
func MFENCE() (*intrep.Instruction, error) {
return &intrep.Instruction{
Opcode: "MFENCE",
Operands: nil,
Inputs: []operand.Op{},
Outputs: []operand.Op{},
ISA: []string{"SSE2"},
}, nil
}
// MINPD: Return Minimum Packed Double-Precision Floating-Point Values.
//
// Forms:
//
// MINPD xmm xmm
// MINPD m128 xmm
func MINPD(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "MINPD",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "MINPD",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("MINPD: bad operands")
}
// MINPS: Return Minimum Packed Single-Precision Floating-Point Values.
//
// Forms:
//
// MINPS xmm xmm
// MINPS m128 xmm
func MINPS(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "MINPS",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "MINPS",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE"},
}, nil
}
return nil, errors.New("MINPS: bad operands")
}
// MINSD: Return Minimum Scalar Double-Precision Floating-Point Value.
//
// Forms:
//
// MINSD xmm xmm
// MINSD m64 xmm
func MINSD(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "MINSD",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
case operand.IsM64(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "MINSD",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("MINSD: bad operands")
}
// MINSS: Return Minimum Scalar Single-Precision Floating-Point Value.
//
// Forms:
//
// MINSS xmm xmm
// MINSS m32 xmm
func MINSS(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "MINSS",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE"},
}, nil
case operand.IsM32(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "MINSS",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE"},
}, nil
}
return nil, errors.New("MINSS: bad operands")
}
// MONITOR: Monitor a Linear Address Range.
//
// Forms:
//
// MONITOR
func MONITOR() (*intrep.Instruction, error) {
return &intrep.Instruction{
Opcode: "MONITOR",
Operands: nil,
Inputs: []operand.Op{reg.RAX, reg.ECX, reg.EDX},
Outputs: []operand.Op{},
ISA: []string{"MONITOR"},
}, nil
}
// MOVAPD: Move Aligned Packed Double-Precision Floating-Point Values.
//
// Forms:
//
// MOVAPD xmm xmm
// MOVAPD m128 xmm
// MOVAPD xmm m128
func MOVAPD(mx, mx1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(mx1):
return &intrep.Instruction{
Opcode: "MOVAPD",
Operands: []operand.Op{mx, mx1},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{mx1},
ISA: []string{"SSE2"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(mx1):
return &intrep.Instruction{
Opcode: "MOVAPD",
Operands: []operand.Op{mx, mx1},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{mx1},
ISA: []string{"SSE2"},
}, nil
case operand.IsXMM(mx) && operand.IsM128(mx1):
return &intrep.Instruction{
Opcode: "MOVAPD",
Operands: []operand.Op{mx, mx1},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{mx1},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("MOVAPD: bad operands")
}
// MOVAPS: Move Aligned Packed Single-Precision Floating-Point Values.
//
// Forms:
//
// MOVAPS xmm xmm
// MOVAPS m128 xmm
// MOVAPS xmm m128
func MOVAPS(mx, mx1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(mx1):
return &intrep.Instruction{
Opcode: "MOVAPS",
Operands: []operand.Op{mx, mx1},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{mx1},
ISA: []string{"SSE"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(mx1):
return &intrep.Instruction{
Opcode: "MOVAPS",
Operands: []operand.Op{mx, mx1},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{mx1},
ISA: []string{"SSE"},
}, nil
case operand.IsXMM(mx) && operand.IsM128(mx1):
return &intrep.Instruction{
Opcode: "MOVAPS",
Operands: []operand.Op{mx, mx1},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{mx1},
ISA: []string{"SSE"},
}, nil
}
return nil, errors.New("MOVAPS: bad operands")
}
// MOVB: Move.
//
// Forms:
//
// MOVB imm8 r8
// MOVB r8 r8
// MOVB m8 r8
// MOVB imm8 m8
// MOVB r8 m8
func MOVB(imr, mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(imr) && operand.IsR8(mr):
return &intrep.Instruction{
Opcode: "MOVB",
Operands: []operand.Op{imr, mr},
Inputs: []operand.Op{},
Outputs: []operand.Op{mr},
}, nil
case operand.IsR8(imr) && operand.IsR8(mr):
return &intrep.Instruction{
Opcode: "MOVB",
Operands: []operand.Op{imr, mr},
Inputs: []operand.Op{imr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsM8(imr) && operand.IsR8(mr):
return &intrep.Instruction{
Opcode: "MOVB",
Operands: []operand.Op{imr, mr},
Inputs: []operand.Op{imr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsIMM8(imr) && operand.IsM8(mr):
return &intrep.Instruction{
Opcode: "MOVB",
Operands: []operand.Op{imr, mr},
Inputs: []operand.Op{},
Outputs: []operand.Op{mr},
}, nil
case operand.IsR8(imr) && operand.IsM8(mr):
return &intrep.Instruction{
Opcode: "MOVB",
Operands: []operand.Op{imr, mr},
Inputs: []operand.Op{imr},
Outputs: []operand.Op{mr},
}, nil
}
return nil, errors.New("MOVB: bad operands")
}
// MOVBELL: Move Data After Swapping Bytes.
//
// Forms:
//
// MOVBELL m32 r32
// MOVBELL r32 m32
func MOVBELL(mr, mr1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsM32(mr) && operand.IsR32(mr1):
return &intrep.Instruction{
Opcode: "MOVBELL",
Operands: []operand.Op{mr, mr1},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr1},
ISA: []string{"MOVBE"},
}, nil
case operand.IsR32(mr) && operand.IsM32(mr1):
return &intrep.Instruction{
Opcode: "MOVBELL",
Operands: []operand.Op{mr, mr1},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr1},
ISA: []string{"MOVBE"},
}, nil
}
return nil, errors.New("MOVBELL: bad operands")
}
// MOVBEQQ: Move Data After Swapping Bytes.
//
// Forms:
//
// MOVBEQQ m64 r64
// MOVBEQQ r64 m64
func MOVBEQQ(mr, mr1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsM64(mr) && operand.IsR64(mr1):
return &intrep.Instruction{
Opcode: "MOVBEQQ",
Operands: []operand.Op{mr, mr1},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr1},
ISA: []string{"MOVBE"},
}, nil
case operand.IsR64(mr) && operand.IsM64(mr1):
return &intrep.Instruction{
Opcode: "MOVBEQQ",
Operands: []operand.Op{mr, mr1},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr1},
ISA: []string{"MOVBE"},
}, nil
}
return nil, errors.New("MOVBEQQ: bad operands")
}
// MOVBEWW: Move Data After Swapping Bytes.
//
// Forms:
//
// MOVBEWW m16 r16
// MOVBEWW r16 m16
func MOVBEWW(mr, mr1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsM16(mr) && operand.IsR16(mr1):
return &intrep.Instruction{
Opcode: "MOVBEWW",
Operands: []operand.Op{mr, mr1},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr1},
ISA: []string{"MOVBE"},
}, nil
case operand.IsR16(mr) && operand.IsM16(mr1):
return &intrep.Instruction{
Opcode: "MOVBEWW",
Operands: []operand.Op{mr, mr1},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr1},
ISA: []string{"MOVBE"},
}, nil
}
return nil, errors.New("MOVBEWW: bad operands")
}
// MOVBLSX: Move with Sign-Extension.
//
// Forms:
//
// MOVBLSX r8 r32
// MOVBLSX m8 r32
func MOVBLSX(mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR8(mr) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "MOVBLSX",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{r},
}, nil
case operand.IsM8(mr) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "MOVBLSX",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{r},
}, nil
}
return nil, errors.New("MOVBLSX: bad operands")
}
// MOVBLZX: Move with Zero-Extend.
//
// Forms:
//
// MOVBLZX r8 r32
// MOVBLZX m8 r32
func MOVBLZX(mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR8(mr) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "MOVBLZX",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{r},
}, nil
case operand.IsM8(mr) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "MOVBLZX",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{r},
}, nil
}
return nil, errors.New("MOVBLZX: bad operands")
}
// MOVBQSX: Move with Sign-Extension.
//
// Forms:
//
// MOVBQSX r8 r64
// MOVBQSX m8 r64
func MOVBQSX(mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR8(mr) && operand.IsR64(r):
return &intrep.Instruction{
Opcode: "MOVBQSX",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{r},
}, nil
case operand.IsM8(mr) && operand.IsR64(r):
return &intrep.Instruction{
Opcode: "MOVBQSX",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{r},
}, nil
}
return nil, errors.New("MOVBQSX: bad operands")
}
// MOVBQZX: Move with Zero-Extend.
//
// Forms:
//
// MOVBQZX r8 r64
// MOVBQZX m8 r64
func MOVBQZX(mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR8(mr) && operand.IsR64(r):
return &intrep.Instruction{
Opcode: "MOVBQZX",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{r},
}, nil
case operand.IsM8(mr) && operand.IsR64(r):
return &intrep.Instruction{
Opcode: "MOVBQZX",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{r},
}, nil
}
return nil, errors.New("MOVBQZX: bad operands")
}
// MOVBWSX: Move with Sign-Extension.
//
// Forms:
//
// MOVBWSX r8 r16
// MOVBWSX m8 r16
func MOVBWSX(mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR8(mr) && operand.IsR16(r):
return &intrep.Instruction{
Opcode: "MOVBWSX",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{r},
}, nil
case operand.IsM8(mr) && operand.IsR16(r):
return &intrep.Instruction{
Opcode: "MOVBWSX",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{r},
}, nil
}
return nil, errors.New("MOVBWSX: bad operands")
}
// MOVBWZX: Move with Zero-Extend.
//
// Forms:
//
// MOVBWZX r8 r16
// MOVBWZX m8 r16
func MOVBWZX(mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR8(mr) && operand.IsR16(r):
return &intrep.Instruction{
Opcode: "MOVBWZX",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{r},
}, nil
case operand.IsM8(mr) && operand.IsR16(r):
return &intrep.Instruction{
Opcode: "MOVBWZX",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{r},
}, nil
}
return nil, errors.New("MOVBWZX: bad operands")
}
// MOVD: Move.
//
// Forms:
//
// MOVD imm32 r64
// MOVD imm64 r64
// MOVD r64 r64
// MOVD m64 r64
// MOVD imm32 m64
// MOVD r64 m64
// MOVD xmm r64
// MOVD r64 xmm
// MOVD xmm xmm
// MOVD m64 xmm
// MOVD xmm m64
// MOVD xmm r32
// MOVD r32 xmm
// MOVD m32 xmm
// MOVD xmm m32
func MOVD(imrx, mrx operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM32(imrx) && operand.IsR64(mrx):
return &intrep.Instruction{
Opcode: "MOVD",
Operands: []operand.Op{imrx, mrx},
Inputs: []operand.Op{},
Outputs: []operand.Op{mrx},
}, nil
case operand.IsIMM64(imrx) && operand.IsR64(mrx):
return &intrep.Instruction{
Opcode: "MOVD",
Operands: []operand.Op{imrx, mrx},
Inputs: []operand.Op{},
Outputs: []operand.Op{mrx},
}, nil
case operand.IsR64(imrx) && operand.IsR64(mrx):
return &intrep.Instruction{
Opcode: "MOVD",
Operands: []operand.Op{imrx, mrx},
Inputs: []operand.Op{imrx},
Outputs: []operand.Op{mrx},
}, nil
case operand.IsM64(imrx) && operand.IsR64(mrx):
return &intrep.Instruction{
Opcode: "MOVD",
Operands: []operand.Op{imrx, mrx},
Inputs: []operand.Op{imrx},
Outputs: []operand.Op{mrx},
}, nil
case operand.IsIMM32(imrx) && operand.IsM64(mrx):
return &intrep.Instruction{
Opcode: "MOVD",
Operands: []operand.Op{imrx, mrx},
Inputs: []operand.Op{},
Outputs: []operand.Op{mrx},
}, nil
case operand.IsR64(imrx) && operand.IsM64(mrx):
return &intrep.Instruction{
Opcode: "MOVD",
Operands: []operand.Op{imrx, mrx},
Inputs: []operand.Op{imrx},
Outputs: []operand.Op{mrx},
}, nil
case operand.IsXMM(imrx) && operand.IsR64(mrx):
return &intrep.Instruction{
Opcode: "MOVD",
Operands: []operand.Op{imrx, mrx},
Inputs: []operand.Op{imrx},
Outputs: []operand.Op{mrx},
ISA: []string{"SSE2"},
}, nil
case operand.IsR64(imrx) && operand.IsXMM(mrx):
return &intrep.Instruction{
Opcode: "MOVD",
Operands: []operand.Op{imrx, mrx},
Inputs: []operand.Op{imrx},
Outputs: []operand.Op{mrx},
ISA: []string{"SSE2"},
}, nil
case operand.IsXMM(imrx) && operand.IsXMM(mrx):
return &intrep.Instruction{
Opcode: "MOVD",
Operands: []operand.Op{imrx, mrx},
Inputs: []operand.Op{imrx},
Outputs: []operand.Op{mrx},
ISA: []string{"SSE2"},
}, nil
case operand.IsM64(imrx) && operand.IsXMM(mrx):
return &intrep.Instruction{
Opcode: "MOVD",
Operands: []operand.Op{imrx, mrx},
Inputs: []operand.Op{imrx},
Outputs: []operand.Op{mrx},
ISA: []string{"SSE2"},
}, nil
case operand.IsXMM(imrx) && operand.IsM64(mrx):
return &intrep.Instruction{
Opcode: "MOVD",
Operands: []operand.Op{imrx, mrx},
Inputs: []operand.Op{imrx},
Outputs: []operand.Op{mrx},
ISA: []string{"SSE2"},
}, nil
case operand.IsXMM(imrx) && operand.IsR32(mrx):
return &intrep.Instruction{
Opcode: "MOVD",
Operands: []operand.Op{imrx, mrx},
Inputs: []operand.Op{imrx},
Outputs: []operand.Op{mrx},
ISA: []string{"SSE2"},
}, nil
case operand.IsR32(imrx) && operand.IsXMM(mrx):
return &intrep.Instruction{
Opcode: "MOVD",
Operands: []operand.Op{imrx, mrx},
Inputs: []operand.Op{imrx},
Outputs: []operand.Op{mrx},
ISA: []string{"SSE2"},
}, nil
case operand.IsM32(imrx) && operand.IsXMM(mrx):
return &intrep.Instruction{
Opcode: "MOVD",
Operands: []operand.Op{imrx, mrx},
Inputs: []operand.Op{imrx},
Outputs: []operand.Op{mrx},
ISA: []string{"SSE2"},
}, nil
case operand.IsXMM(imrx) && operand.IsM32(mrx):
return &intrep.Instruction{
Opcode: "MOVD",
Operands: []operand.Op{imrx, mrx},
Inputs: []operand.Op{imrx},
Outputs: []operand.Op{mrx},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("MOVD: bad operands")
}
// MOVDDUP: Move One Double-FP and Duplicate.
//
// Forms:
//
// MOVDDUP xmm xmm
// MOVDDUP m64 xmm
func MOVDDUP(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "MOVDDUP",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"SSE3"},
}, nil
case operand.IsM64(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "MOVDDUP",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"SSE3"},
}, nil
}
return nil, errors.New("MOVDDUP: bad operands")
}
// MOVDQ2Q: Move.
//
// Forms:
//
// MOVDQ2Q imm32 r64
// MOVDQ2Q imm64 r64
// MOVDQ2Q r64 r64
// MOVDQ2Q m64 r64
// MOVDQ2Q imm32 m64
// MOVDQ2Q r64 m64
// MOVDQ2Q xmm r64
// MOVDQ2Q r64 xmm
// MOVDQ2Q xmm xmm
// MOVDQ2Q m64 xmm
// MOVDQ2Q xmm m64
// MOVDQ2Q xmm r32
// MOVDQ2Q r32 xmm
// MOVDQ2Q m32 xmm
// MOVDQ2Q xmm m32
func MOVDQ2Q(imrx, mrx operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM32(imrx) && operand.IsR64(mrx):
return &intrep.Instruction{
Opcode: "MOVDQ2Q",
Operands: []operand.Op{imrx, mrx},
Inputs: []operand.Op{},
Outputs: []operand.Op{mrx},
}, nil
case operand.IsIMM64(imrx) && operand.IsR64(mrx):
return &intrep.Instruction{
Opcode: "MOVDQ2Q",
Operands: []operand.Op{imrx, mrx},
Inputs: []operand.Op{},
Outputs: []operand.Op{mrx},
}, nil
case operand.IsR64(imrx) && operand.IsR64(mrx):
return &intrep.Instruction{
Opcode: "MOVDQ2Q",
Operands: []operand.Op{imrx, mrx},
Inputs: []operand.Op{imrx},
Outputs: []operand.Op{mrx},
}, nil
case operand.IsM64(imrx) && operand.IsR64(mrx):
return &intrep.Instruction{
Opcode: "MOVDQ2Q",
Operands: []operand.Op{imrx, mrx},
Inputs: []operand.Op{imrx},
Outputs: []operand.Op{mrx},
}, nil
case operand.IsIMM32(imrx) && operand.IsM64(mrx):
return &intrep.Instruction{
Opcode: "MOVDQ2Q",
Operands: []operand.Op{imrx, mrx},
Inputs: []operand.Op{},
Outputs: []operand.Op{mrx},
}, nil
case operand.IsR64(imrx) && operand.IsM64(mrx):
return &intrep.Instruction{
Opcode: "MOVDQ2Q",
Operands: []operand.Op{imrx, mrx},
Inputs: []operand.Op{imrx},
Outputs: []operand.Op{mrx},
}, nil
case operand.IsXMM(imrx) && operand.IsR64(mrx):
return &intrep.Instruction{
Opcode: "MOVDQ2Q",
Operands: []operand.Op{imrx, mrx},
Inputs: []operand.Op{imrx},
Outputs: []operand.Op{mrx},
ISA: []string{"SSE2"},
}, nil
case operand.IsR64(imrx) && operand.IsXMM(mrx):
return &intrep.Instruction{
Opcode: "MOVDQ2Q",
Operands: []operand.Op{imrx, mrx},
Inputs: []operand.Op{imrx},
Outputs: []operand.Op{mrx},
ISA: []string{"SSE2"},
}, nil
case operand.IsXMM(imrx) && operand.IsXMM(mrx):
return &intrep.Instruction{
Opcode: "MOVDQ2Q",
Operands: []operand.Op{imrx, mrx},
Inputs: []operand.Op{imrx},
Outputs: []operand.Op{mrx},
ISA: []string{"SSE2"},
}, nil
case operand.IsM64(imrx) && operand.IsXMM(mrx):
return &intrep.Instruction{
Opcode: "MOVDQ2Q",
Operands: []operand.Op{imrx, mrx},
Inputs: []operand.Op{imrx},
Outputs: []operand.Op{mrx},
ISA: []string{"SSE2"},
}, nil
case operand.IsXMM(imrx) && operand.IsM64(mrx):
return &intrep.Instruction{
Opcode: "MOVDQ2Q",
Operands: []operand.Op{imrx, mrx},
Inputs: []operand.Op{imrx},
Outputs: []operand.Op{mrx},
ISA: []string{"SSE2"},
}, nil
case operand.IsXMM(imrx) && operand.IsR32(mrx):
return &intrep.Instruction{
Opcode: "MOVDQ2Q",
Operands: []operand.Op{imrx, mrx},
Inputs: []operand.Op{imrx},
Outputs: []operand.Op{mrx},
ISA: []string{"SSE2"},
}, nil
case operand.IsR32(imrx) && operand.IsXMM(mrx):
return &intrep.Instruction{
Opcode: "MOVDQ2Q",
Operands: []operand.Op{imrx, mrx},
Inputs: []operand.Op{imrx},
Outputs: []operand.Op{mrx},
ISA: []string{"SSE2"},
}, nil
case operand.IsM32(imrx) && operand.IsXMM(mrx):
return &intrep.Instruction{
Opcode: "MOVDQ2Q",
Operands: []operand.Op{imrx, mrx},
Inputs: []operand.Op{imrx},
Outputs: []operand.Op{mrx},
ISA: []string{"SSE2"},
}, nil
case operand.IsXMM(imrx) && operand.IsM32(mrx):
return &intrep.Instruction{
Opcode: "MOVDQ2Q",
Operands: []operand.Op{imrx, mrx},
Inputs: []operand.Op{imrx},
Outputs: []operand.Op{mrx},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("MOVDQ2Q: bad operands")
}
// MOVHLPS: Move Packed Single-Precision Floating-Point Values High to Low.
//
// Forms:
//
// MOVHLPS xmm xmm
func MOVHLPS(x, x1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "MOVHLPS",
Operands: []operand.Op{x, x1},
Inputs: []operand.Op{x, x1},
Outputs: []operand.Op{x1},
ISA: []string{"SSE"},
}, nil
}
return nil, errors.New("MOVHLPS: bad operands")
}
// MOVHPD: Move High Packed Double-Precision Floating-Point Value.
//
// Forms:
//
// MOVHPD m64 xmm
// MOVHPD xmm m64
func MOVHPD(mx, mx1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsM64(mx) && operand.IsXMM(mx1):
return &intrep.Instruction{
Opcode: "MOVHPD",
Operands: []operand.Op{mx, mx1},
Inputs: []operand.Op{mx, mx1},
Outputs: []operand.Op{mx1},
ISA: []string{"SSE2"},
}, nil
case operand.IsXMM(mx) && operand.IsM64(mx1):
return &intrep.Instruction{
Opcode: "MOVHPD",
Operands: []operand.Op{mx, mx1},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{mx1},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("MOVHPD: bad operands")
}
// MOVHPS: Move High Packed Single-Precision Floating-Point Values.
//
// Forms:
//
// MOVHPS m64 xmm
// MOVHPS xmm m64
func MOVHPS(mx, mx1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsM64(mx) && operand.IsXMM(mx1):
return &intrep.Instruction{
Opcode: "MOVHPS",
Operands: []operand.Op{mx, mx1},
Inputs: []operand.Op{mx, mx1},
Outputs: []operand.Op{mx1},
ISA: []string{"SSE"},
}, nil
case operand.IsXMM(mx) && operand.IsM64(mx1):
return &intrep.Instruction{
Opcode: "MOVHPS",
Operands: []operand.Op{mx, mx1},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{mx1},
ISA: []string{"SSE"},
}, nil
}
return nil, errors.New("MOVHPS: bad operands")
}
// MOVL: Move.
//
// Forms:
//
// MOVL imm32 r32
// MOVL r32 r32
// MOVL m32 r32
// MOVL imm32 m32
// MOVL r32 m32
func MOVL(imr, mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM32(imr) && operand.IsR32(mr):
return &intrep.Instruction{
Opcode: "MOVL",
Operands: []operand.Op{imr, mr},
Inputs: []operand.Op{},
Outputs: []operand.Op{mr},
}, nil
case operand.IsR32(imr) && operand.IsR32(mr):
return &intrep.Instruction{
Opcode: "MOVL",
Operands: []operand.Op{imr, mr},
Inputs: []operand.Op{imr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsM32(imr) && operand.IsR32(mr):
return &intrep.Instruction{
Opcode: "MOVL",
Operands: []operand.Op{imr, mr},
Inputs: []operand.Op{imr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsIMM32(imr) && operand.IsM32(mr):
return &intrep.Instruction{
Opcode: "MOVL",
Operands: []operand.Op{imr, mr},
Inputs: []operand.Op{},
Outputs: []operand.Op{mr},
}, nil
case operand.IsR32(imr) && operand.IsM32(mr):
return &intrep.Instruction{
Opcode: "MOVL",
Operands: []operand.Op{imr, mr},
Inputs: []operand.Op{imr},
Outputs: []operand.Op{mr},
}, nil
}
return nil, errors.New("MOVL: bad operands")
}
// MOVLHPS: Move Packed Single-Precision Floating-Point Values Low to High.
//
// Forms:
//
// MOVLHPS xmm xmm
func MOVLHPS(x, x1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "MOVLHPS",
Operands: []operand.Op{x, x1},
Inputs: []operand.Op{x, x1},
Outputs: []operand.Op{x1},
ISA: []string{"SSE"},
}, nil
}
return nil, errors.New("MOVLHPS: bad operands")
}
// MOVLPD: Move Low Packed Double-Precision Floating-Point Value.
//
// Forms:
//
// MOVLPD m64 xmm
// MOVLPD xmm m64
func MOVLPD(mx, mx1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsM64(mx) && operand.IsXMM(mx1):
return &intrep.Instruction{
Opcode: "MOVLPD",
Operands: []operand.Op{mx, mx1},
Inputs: []operand.Op{mx, mx1},
Outputs: []operand.Op{mx1},
ISA: []string{"SSE2"},
}, nil
case operand.IsXMM(mx) && operand.IsM64(mx1):
return &intrep.Instruction{
Opcode: "MOVLPD",
Operands: []operand.Op{mx, mx1},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{mx1},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("MOVLPD: bad operands")
}
// MOVLPS: Move Low Packed Single-Precision Floating-Point Values.
//
// Forms:
//
// MOVLPS m64 xmm
// MOVLPS xmm m64
func MOVLPS(mx, mx1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsM64(mx) && operand.IsXMM(mx1):
return &intrep.Instruction{
Opcode: "MOVLPS",
Operands: []operand.Op{mx, mx1},
Inputs: []operand.Op{mx, mx1},
Outputs: []operand.Op{mx1},
ISA: []string{"SSE"},
}, nil
case operand.IsXMM(mx) && operand.IsM64(mx1):
return &intrep.Instruction{
Opcode: "MOVLPS",
Operands: []operand.Op{mx, mx1},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{mx1},
ISA: []string{"SSE"},
}, nil
}
return nil, errors.New("MOVLPS: bad operands")
}
// MOVLQSX: Move Doubleword to Quadword with Sign-Extension.
//
// Forms:
//
// MOVLQSX r32 r64
// MOVLQSX m32 r64
func MOVLQSX(mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR32(mr) && operand.IsR64(r):
return &intrep.Instruction{
Opcode: "MOVLQSX",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{r},
}, nil
case operand.IsM32(mr) && operand.IsR64(r):
return &intrep.Instruction{
Opcode: "MOVLQSX",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{r},
}, nil
}
return nil, errors.New("MOVLQSX: bad operands")
}
// MOVLQZX: Move with Zero-Extend.
//
// Forms:
//
// MOVLQZX m32 r64
func MOVLQZX(m, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsM32(m) && operand.IsR64(r):
return &intrep.Instruction{
Opcode: "MOVLQZX",
Operands: []operand.Op{m, r},
Inputs: []operand.Op{m},
Outputs: []operand.Op{r},
}, nil
}
return nil, errors.New("MOVLQZX: bad operands")
}
// MOVMSKPD: Extract Packed Double-Precision Floating-Point Sign Mask.
//
// Forms:
//
// MOVMSKPD xmm r32
func MOVMSKPD(x, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(x) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "MOVMSKPD",
Operands: []operand.Op{x, r},
Inputs: []operand.Op{x},
Outputs: []operand.Op{r},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("MOVMSKPD: bad operands")
}
// MOVMSKPS: Extract Packed Single-Precision Floating-Point Sign Mask.
//
// Forms:
//
// MOVMSKPS xmm r32
func MOVMSKPS(x, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(x) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "MOVMSKPS",
Operands: []operand.Op{x, r},
Inputs: []operand.Op{x},
Outputs: []operand.Op{r},
ISA: []string{"SSE"},
}, nil
}
return nil, errors.New("MOVMSKPS: bad operands")
}
// MOVNTDQ: Store Double Quadword Using Non-Temporal Hint.
//
// Forms:
//
// MOVNTDQ xmm m128
func MOVNTDQ(x, m operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(x) && operand.IsM128(m):
return &intrep.Instruction{
Opcode: "MOVNTDQ",
Operands: []operand.Op{x, m},
Inputs: []operand.Op{x},
Outputs: []operand.Op{m},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("MOVNTDQ: bad operands")
}
// MOVNTDQA: Load Double Quadword Non-Temporal Aligned Hint.
//
// Forms:
//
// MOVNTDQA m128 xmm
func MOVNTDQA(m, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsM128(m) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "MOVNTDQA",
Operands: []operand.Op{m, x},
Inputs: []operand.Op{m},
Outputs: []operand.Op{x},
ISA: []string{"SSE4.1"},
}, nil
}
return nil, errors.New("MOVNTDQA: bad operands")
}
// MOVNTIL: Store Doubleword Using Non-Temporal Hint.
//
// Forms:
//
// MOVNTIL r32 m32
func MOVNTIL(r, m operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR32(r) && operand.IsM32(m):
return &intrep.Instruction{
Opcode: "MOVNTIL",
Operands: []operand.Op{r, m},
Inputs: []operand.Op{r},
Outputs: []operand.Op{m},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("MOVNTIL: bad operands")
}
// MOVNTIQ: Store Doubleword Using Non-Temporal Hint.
//
// Forms:
//
// MOVNTIQ r64 m64
func MOVNTIQ(r, m operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR64(r) && operand.IsM64(m):
return &intrep.Instruction{
Opcode: "MOVNTIQ",
Operands: []operand.Op{r, m},
Inputs: []operand.Op{r},
Outputs: []operand.Op{m},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("MOVNTIQ: bad operands")
}
// MOVNTO: Store Double Quadword Using Non-Temporal Hint.
//
// Forms:
//
// MOVNTO xmm m128
func MOVNTO(x, m operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(x) && operand.IsM128(m):
return &intrep.Instruction{
Opcode: "MOVNTO",
Operands: []operand.Op{x, m},
Inputs: []operand.Op{x},
Outputs: []operand.Op{m},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("MOVNTO: bad operands")
}
// MOVNTPD: Store Packed Double-Precision Floating-Point Values Using Non-Temporal Hint.
//
// Forms:
//
// MOVNTPD xmm m128
func MOVNTPD(x, m operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(x) && operand.IsM128(m):
return &intrep.Instruction{
Opcode: "MOVNTPD",
Operands: []operand.Op{x, m},
Inputs: []operand.Op{x},
Outputs: []operand.Op{m},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("MOVNTPD: bad operands")
}
// MOVNTPS: Store Packed Single-Precision Floating-Point Values Using Non-Temporal Hint.
//
// Forms:
//
// MOVNTPS xmm m128
func MOVNTPS(x, m operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(x) && operand.IsM128(m):
return &intrep.Instruction{
Opcode: "MOVNTPS",
Operands: []operand.Op{x, m},
Inputs: []operand.Op{x},
Outputs: []operand.Op{m},
ISA: []string{"SSE"},
}, nil
}
return nil, errors.New("MOVNTPS: bad operands")
}
// MOVO: Move Aligned Double Quadword.
//
// Forms:
//
// MOVO xmm xmm
// MOVO m128 xmm
// MOVO xmm m128
func MOVO(mx, mx1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(mx1):
return &intrep.Instruction{
Opcode: "MOVO",
Operands: []operand.Op{mx, mx1},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{mx1},
ISA: []string{"SSE2"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(mx1):
return &intrep.Instruction{
Opcode: "MOVO",
Operands: []operand.Op{mx, mx1},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{mx1},
ISA: []string{"SSE2"},
}, nil
case operand.IsXMM(mx) && operand.IsM128(mx1):
return &intrep.Instruction{
Opcode: "MOVO",
Operands: []operand.Op{mx, mx1},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{mx1},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("MOVO: bad operands")
}
// MOVOA: Move Aligned Double Quadword.
//
// Forms:
//
// MOVOA xmm xmm
// MOVOA m128 xmm
// MOVOA xmm m128
func MOVOA(mx, mx1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(mx1):
return &intrep.Instruction{
Opcode: "MOVOA",
Operands: []operand.Op{mx, mx1},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{mx1},
ISA: []string{"SSE2"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(mx1):
return &intrep.Instruction{
Opcode: "MOVOA",
Operands: []operand.Op{mx, mx1},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{mx1},
ISA: []string{"SSE2"},
}, nil
case operand.IsXMM(mx) && operand.IsM128(mx1):
return &intrep.Instruction{
Opcode: "MOVOA",
Operands: []operand.Op{mx, mx1},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{mx1},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("MOVOA: bad operands")
}
// MOVOU: Move Unaligned Double Quadword.
//
// Forms:
//
// MOVOU xmm xmm
// MOVOU m128 xmm
// MOVOU xmm m128
func MOVOU(mx, mx1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(mx1):
return &intrep.Instruction{
Opcode: "MOVOU",
Operands: []operand.Op{mx, mx1},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{mx1},
ISA: []string{"SSE2"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(mx1):
return &intrep.Instruction{
Opcode: "MOVOU",
Operands: []operand.Op{mx, mx1},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{mx1},
ISA: []string{"SSE2"},
}, nil
case operand.IsXMM(mx) && operand.IsM128(mx1):
return &intrep.Instruction{
Opcode: "MOVOU",
Operands: []operand.Op{mx, mx1},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{mx1},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("MOVOU: bad operands")
}
// MOVQ: Move.
//
// Forms:
//
// MOVQ imm32 r64
// MOVQ imm64 r64
// MOVQ r64 r64
// MOVQ m64 r64
// MOVQ imm32 m64
// MOVQ r64 m64
// MOVQ xmm r64
// MOVQ r64 xmm
// MOVQ xmm xmm
// MOVQ m64 xmm
// MOVQ xmm m64
// MOVQ xmm r32
// MOVQ r32 xmm
// MOVQ m32 xmm
// MOVQ xmm m32
func MOVQ(imrx, mrx operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM32(imrx) && operand.IsR64(mrx):
return &intrep.Instruction{
Opcode: "MOVQ",
Operands: []operand.Op{imrx, mrx},
Inputs: []operand.Op{},
Outputs: []operand.Op{mrx},
}, nil
case operand.IsIMM64(imrx) && operand.IsR64(mrx):
return &intrep.Instruction{
Opcode: "MOVQ",
Operands: []operand.Op{imrx, mrx},
Inputs: []operand.Op{},
Outputs: []operand.Op{mrx},
}, nil
case operand.IsR64(imrx) && operand.IsR64(mrx):
return &intrep.Instruction{
Opcode: "MOVQ",
Operands: []operand.Op{imrx, mrx},
Inputs: []operand.Op{imrx},
Outputs: []operand.Op{mrx},
}, nil
case operand.IsM64(imrx) && operand.IsR64(mrx):
return &intrep.Instruction{
Opcode: "MOVQ",
Operands: []operand.Op{imrx, mrx},
Inputs: []operand.Op{imrx},
Outputs: []operand.Op{mrx},
}, nil
case operand.IsIMM32(imrx) && operand.IsM64(mrx):
return &intrep.Instruction{
Opcode: "MOVQ",
Operands: []operand.Op{imrx, mrx},
Inputs: []operand.Op{},
Outputs: []operand.Op{mrx},
}, nil
case operand.IsR64(imrx) && operand.IsM64(mrx):
return &intrep.Instruction{
Opcode: "MOVQ",
Operands: []operand.Op{imrx, mrx},
Inputs: []operand.Op{imrx},
Outputs: []operand.Op{mrx},
}, nil
case operand.IsXMM(imrx) && operand.IsR64(mrx):
return &intrep.Instruction{
Opcode: "MOVQ",
Operands: []operand.Op{imrx, mrx},
Inputs: []operand.Op{imrx},
Outputs: []operand.Op{mrx},
ISA: []string{"SSE2"},
}, nil
case operand.IsR64(imrx) && operand.IsXMM(mrx):
return &intrep.Instruction{
Opcode: "MOVQ",
Operands: []operand.Op{imrx, mrx},
Inputs: []operand.Op{imrx},
Outputs: []operand.Op{mrx},
ISA: []string{"SSE2"},
}, nil
case operand.IsXMM(imrx) && operand.IsXMM(mrx):
return &intrep.Instruction{
Opcode: "MOVQ",
Operands: []operand.Op{imrx, mrx},
Inputs: []operand.Op{imrx},
Outputs: []operand.Op{mrx},
ISA: []string{"SSE2"},
}, nil
case operand.IsM64(imrx) && operand.IsXMM(mrx):
return &intrep.Instruction{
Opcode: "MOVQ",
Operands: []operand.Op{imrx, mrx},
Inputs: []operand.Op{imrx},
Outputs: []operand.Op{mrx},
ISA: []string{"SSE2"},
}, nil
case operand.IsXMM(imrx) && operand.IsM64(mrx):
return &intrep.Instruction{
Opcode: "MOVQ",
Operands: []operand.Op{imrx, mrx},
Inputs: []operand.Op{imrx},
Outputs: []operand.Op{mrx},
ISA: []string{"SSE2"},
}, nil
case operand.IsXMM(imrx) && operand.IsR32(mrx):
return &intrep.Instruction{
Opcode: "MOVQ",
Operands: []operand.Op{imrx, mrx},
Inputs: []operand.Op{imrx},
Outputs: []operand.Op{mrx},
ISA: []string{"SSE2"},
}, nil
case operand.IsR32(imrx) && operand.IsXMM(mrx):
return &intrep.Instruction{
Opcode: "MOVQ",
Operands: []operand.Op{imrx, mrx},
Inputs: []operand.Op{imrx},
Outputs: []operand.Op{mrx},
ISA: []string{"SSE2"},
}, nil
case operand.IsM32(imrx) && operand.IsXMM(mrx):
return &intrep.Instruction{
Opcode: "MOVQ",
Operands: []operand.Op{imrx, mrx},
Inputs: []operand.Op{imrx},
Outputs: []operand.Op{mrx},
ISA: []string{"SSE2"},
}, nil
case operand.IsXMM(imrx) && operand.IsM32(mrx):
return &intrep.Instruction{
Opcode: "MOVQ",
Operands: []operand.Op{imrx, mrx},
Inputs: []operand.Op{imrx},
Outputs: []operand.Op{mrx},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("MOVQ: bad operands")
}
// MOVSD: Move Scalar Double-Precision Floating-Point Value.
//
// Forms:
//
// MOVSD xmm xmm
// MOVSD m64 xmm
// MOVSD xmm m64
func MOVSD(mx, mx1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(mx1):
return &intrep.Instruction{
Opcode: "MOVSD",
Operands: []operand.Op{mx, mx1},
Inputs: []operand.Op{mx, mx1},
Outputs: []operand.Op{mx1},
ISA: []string{"SSE2"},
}, nil
case operand.IsM64(mx) && operand.IsXMM(mx1):
return &intrep.Instruction{
Opcode: "MOVSD",
Operands: []operand.Op{mx, mx1},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{mx1},
ISA: []string{"SSE2"},
}, nil
case operand.IsXMM(mx) && operand.IsM64(mx1):
return &intrep.Instruction{
Opcode: "MOVSD",
Operands: []operand.Op{mx, mx1},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{mx1},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("MOVSD: bad operands")
}
// MOVSHDUP: Move Packed Single-FP High and Duplicate.
//
// Forms:
//
// MOVSHDUP xmm xmm
// MOVSHDUP m128 xmm
func MOVSHDUP(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "MOVSHDUP",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"SSE3"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "MOVSHDUP",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"SSE3"},
}, nil
}
return nil, errors.New("MOVSHDUP: bad operands")
}
// MOVSLDUP: Move Packed Single-FP Low and Duplicate.
//
// Forms:
//
// MOVSLDUP xmm xmm
// MOVSLDUP m128 xmm
func MOVSLDUP(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "MOVSLDUP",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"SSE3"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "MOVSLDUP",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"SSE3"},
}, nil
}
return nil, errors.New("MOVSLDUP: bad operands")
}
// MOVSS: Move Scalar Single-Precision Floating-Point Values.
//
// Forms:
//
// MOVSS xmm xmm
// MOVSS m32 xmm
// MOVSS xmm m32
func MOVSS(mx, mx1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(mx1):
return &intrep.Instruction{
Opcode: "MOVSS",
Operands: []operand.Op{mx, mx1},
Inputs: []operand.Op{mx, mx1},
Outputs: []operand.Op{mx1},
ISA: []string{"SSE"},
}, nil
case operand.IsM32(mx) && operand.IsXMM(mx1):
return &intrep.Instruction{
Opcode: "MOVSS",
Operands: []operand.Op{mx, mx1},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{mx1},
ISA: []string{"SSE"},
}, nil
case operand.IsXMM(mx) && operand.IsM32(mx1):
return &intrep.Instruction{
Opcode: "MOVSS",
Operands: []operand.Op{mx, mx1},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{mx1},
ISA: []string{"SSE"},
}, nil
}
return nil, errors.New("MOVSS: bad operands")
}
// MOVUPD: Move Unaligned Packed Double-Precision Floating-Point Values.
//
// Forms:
//
// MOVUPD xmm xmm
// MOVUPD m128 xmm
// MOVUPD xmm m128
func MOVUPD(mx, mx1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(mx1):
return &intrep.Instruction{
Opcode: "MOVUPD",
Operands: []operand.Op{mx, mx1},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{mx1},
ISA: []string{"SSE2"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(mx1):
return &intrep.Instruction{
Opcode: "MOVUPD",
Operands: []operand.Op{mx, mx1},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{mx1},
ISA: []string{"SSE2"},
}, nil
case operand.IsXMM(mx) && operand.IsM128(mx1):
return &intrep.Instruction{
Opcode: "MOVUPD",
Operands: []operand.Op{mx, mx1},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{mx1},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("MOVUPD: bad operands")
}
// MOVUPS: Move Unaligned Packed Single-Precision Floating-Point Values.
//
// Forms:
//
// MOVUPS xmm xmm
// MOVUPS m128 xmm
// MOVUPS xmm m128
func MOVUPS(mx, mx1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(mx1):
return &intrep.Instruction{
Opcode: "MOVUPS",
Operands: []operand.Op{mx, mx1},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{mx1},
ISA: []string{"SSE"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(mx1):
return &intrep.Instruction{
Opcode: "MOVUPS",
Operands: []operand.Op{mx, mx1},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{mx1},
ISA: []string{"SSE"},
}, nil
case operand.IsXMM(mx) && operand.IsM128(mx1):
return &intrep.Instruction{
Opcode: "MOVUPS",
Operands: []operand.Op{mx, mx1},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{mx1},
ISA: []string{"SSE"},
}, nil
}
return nil, errors.New("MOVUPS: bad operands")
}
// MOVW: Move.
//
// Forms:
//
// MOVW imm16 r16
// MOVW r16 r16
// MOVW m16 r16
// MOVW imm16 m16
// MOVW r16 m16
func MOVW(imr, mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM16(imr) && operand.IsR16(mr):
return &intrep.Instruction{
Opcode: "MOVW",
Operands: []operand.Op{imr, mr},
Inputs: []operand.Op{},
Outputs: []operand.Op{mr},
}, nil
case operand.IsR16(imr) && operand.IsR16(mr):
return &intrep.Instruction{
Opcode: "MOVW",
Operands: []operand.Op{imr, mr},
Inputs: []operand.Op{imr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsM16(imr) && operand.IsR16(mr):
return &intrep.Instruction{
Opcode: "MOVW",
Operands: []operand.Op{imr, mr},
Inputs: []operand.Op{imr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsIMM16(imr) && operand.IsM16(mr):
return &intrep.Instruction{
Opcode: "MOVW",
Operands: []operand.Op{imr, mr},
Inputs: []operand.Op{},
Outputs: []operand.Op{mr},
}, nil
case operand.IsR16(imr) && operand.IsM16(mr):
return &intrep.Instruction{
Opcode: "MOVW",
Operands: []operand.Op{imr, mr},
Inputs: []operand.Op{imr},
Outputs: []operand.Op{mr},
}, nil
}
return nil, errors.New("MOVW: bad operands")
}
// MOVWLSX: Move with Sign-Extension.
//
// Forms:
//
// MOVWLSX r16 r32
// MOVWLSX m16 r32
func MOVWLSX(mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR16(mr) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "MOVWLSX",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{r},
}, nil
case operand.IsM16(mr) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "MOVWLSX",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{r},
}, nil
}
return nil, errors.New("MOVWLSX: bad operands")
}
// MOVWLZX: Move with Zero-Extend.
//
// Forms:
//
// MOVWLZX r16 r32
// MOVWLZX m16 r32
func MOVWLZX(mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR16(mr) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "MOVWLZX",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{r},
}, nil
case operand.IsM16(mr) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "MOVWLZX",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{r},
}, nil
}
return nil, errors.New("MOVWLZX: bad operands")
}
// MOVWQSX: Move with Sign-Extension.
//
// Forms:
//
// MOVWQSX r16 r64
// MOVWQSX m16 r64
func MOVWQSX(mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR16(mr) && operand.IsR64(r):
return &intrep.Instruction{
Opcode: "MOVWQSX",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{r},
}, nil
case operand.IsM16(mr) && operand.IsR64(r):
return &intrep.Instruction{
Opcode: "MOVWQSX",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{r},
}, nil
}
return nil, errors.New("MOVWQSX: bad operands")
}
// MOVWQZX: Move with Zero-Extend.
//
// Forms:
//
// MOVWQZX r16 r64
// MOVWQZX m16 r64
func MOVWQZX(mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR16(mr) && operand.IsR64(r):
return &intrep.Instruction{
Opcode: "MOVWQZX",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{r},
}, nil
case operand.IsM16(mr) && operand.IsR64(r):
return &intrep.Instruction{
Opcode: "MOVWQZX",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{r},
}, nil
}
return nil, errors.New("MOVWQZX: bad operands")
}
// MPSADBW: Compute Multiple Packed Sums of Absolute Difference.
//
// Forms:
//
// MPSADBW imm8 xmm xmm
// MPSADBW imm8 m128 xmm
func MPSADBW(i, mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(i) && operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "MPSADBW",
Operands: []operand.Op{i, mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE4.1"},
}, nil
case operand.IsIMM8(i) && operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "MPSADBW",
Operands: []operand.Op{i, mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE4.1"},
}, nil
}
return nil, errors.New("MPSADBW: bad operands")
}
// MULB: Unsigned Multiply.
//
// Forms:
//
// MULB r8
// MULB m8
func MULB(mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR8(mr):
return &intrep.Instruction{
Opcode: "MULB",
Operands: []operand.Op{mr},
Inputs: []operand.Op{mr, reg.AL},
Outputs: []operand.Op{reg.AX},
}, nil
case operand.IsM8(mr):
return &intrep.Instruction{
Opcode: "MULB",
Operands: []operand.Op{mr},
Inputs: []operand.Op{mr, reg.AL},
Outputs: []operand.Op{reg.AX},
}, nil
}
return nil, errors.New("MULB: bad operands")
}
// MULL: Unsigned Multiply.
//
// Forms:
//
// MULL r32
// MULL m32
func MULL(mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR32(mr):
return &intrep.Instruction{
Opcode: "MULL",
Operands: []operand.Op{mr},
Inputs: []operand.Op{mr, reg.EAX},
Outputs: []operand.Op{reg.EAX, reg.EDX},
}, nil
case operand.IsM32(mr):
return &intrep.Instruction{
Opcode: "MULL",
Operands: []operand.Op{mr},
Inputs: []operand.Op{mr, reg.EAX},
Outputs: []operand.Op{reg.EAX, reg.EDX},
}, nil
}
return nil, errors.New("MULL: bad operands")
}
// MULPD: Multiply Packed Double-Precision Floating-Point Values.
//
// Forms:
//
// MULPD xmm xmm
// MULPD m128 xmm
func MULPD(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "MULPD",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "MULPD",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("MULPD: bad operands")
}
// MULPS: Multiply Packed Single-Precision Floating-Point Values.
//
// Forms:
//
// MULPS xmm xmm
// MULPS m128 xmm
func MULPS(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "MULPS",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "MULPS",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE"},
}, nil
}
return nil, errors.New("MULPS: bad operands")
}
// MULQ: Unsigned Multiply.
//
// Forms:
//
// MULQ r64
// MULQ m64
func MULQ(mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR64(mr):
return &intrep.Instruction{
Opcode: "MULQ",
Operands: []operand.Op{mr},
Inputs: []operand.Op{mr, reg.RAX},
Outputs: []operand.Op{reg.RAX, reg.RDX},
}, nil
case operand.IsM64(mr):
return &intrep.Instruction{
Opcode: "MULQ",
Operands: []operand.Op{mr},
Inputs: []operand.Op{mr, reg.RAX},
Outputs: []operand.Op{reg.RAX, reg.RDX},
}, nil
}
return nil, errors.New("MULQ: bad operands")
}
// MULSD: Multiply Scalar Double-Precision Floating-Point Values.
//
// Forms:
//
// MULSD xmm xmm
// MULSD m64 xmm
func MULSD(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "MULSD",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
case operand.IsM64(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "MULSD",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("MULSD: bad operands")
}
// MULSS: Multiply Scalar Single-Precision Floating-Point Values.
//
// Forms:
//
// MULSS xmm xmm
// MULSS m32 xmm
func MULSS(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "MULSS",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE"},
}, nil
case operand.IsM32(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "MULSS",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE"},
}, nil
}
return nil, errors.New("MULSS: bad operands")
}
// MULW: Unsigned Multiply.
//
// Forms:
//
// MULW r16
// MULW m16
func MULW(mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR16(mr):
return &intrep.Instruction{
Opcode: "MULW",
Operands: []operand.Op{mr},
Inputs: []operand.Op{mr, reg.AX},
Outputs: []operand.Op{reg.AX, reg.DX},
}, nil
case operand.IsM16(mr):
return &intrep.Instruction{
Opcode: "MULW",
Operands: []operand.Op{mr},
Inputs: []operand.Op{mr, reg.AX},
Outputs: []operand.Op{reg.AX, reg.DX},
}, nil
}
return nil, errors.New("MULW: bad operands")
}
// MULXL: Unsigned Multiply Without Affecting Flags.
//
// Forms:
//
// MULXL r32 r32 r32
// MULXL m32 r32 r32
func MULXL(mr, r, r1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR32(mr) && operand.IsR32(r) && operand.IsR32(r1):
return &intrep.Instruction{
Opcode: "MULXL",
Operands: []operand.Op{mr, r, r1},
Inputs: []operand.Op{mr, reg.EDX},
Outputs: []operand.Op{r, r1},
ISA: []string{"BMI2"},
}, nil
case operand.IsM32(mr) && operand.IsR32(r) && operand.IsR32(r1):
return &intrep.Instruction{
Opcode: "MULXL",
Operands: []operand.Op{mr, r, r1},
Inputs: []operand.Op{mr, reg.EDX},
Outputs: []operand.Op{r, r1},
ISA: []string{"BMI2"},
}, nil
}
return nil, errors.New("MULXL: bad operands")
}
// MULXQ: Unsigned Multiply Without Affecting Flags.
//
// Forms:
//
// MULXQ r64 r64 r64
// MULXQ m64 r64 r64
func MULXQ(mr, r, r1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR64(mr) && operand.IsR64(r) && operand.IsR64(r1):
return &intrep.Instruction{
Opcode: "MULXQ",
Operands: []operand.Op{mr, r, r1},
Inputs: []operand.Op{mr, reg.RDX},
Outputs: []operand.Op{r, r1},
ISA: []string{"BMI2"},
}, nil
case operand.IsM64(mr) && operand.IsR64(r) && operand.IsR64(r1):
return &intrep.Instruction{
Opcode: "MULXQ",
Operands: []operand.Op{mr, r, r1},
Inputs: []operand.Op{mr, reg.RDX},
Outputs: []operand.Op{r, r1},
ISA: []string{"BMI2"},
}, nil
}
return nil, errors.New("MULXQ: bad operands")
}
// MWAIT: Monitor Wait.
//
// Forms:
//
// MWAIT
func MWAIT() (*intrep.Instruction, error) {
return &intrep.Instruction{
Opcode: "MWAIT",
Operands: nil,
Inputs: []operand.Op{reg.EAX, reg.ECX},
Outputs: []operand.Op{},
ISA: []string{"MONITOR"},
}, nil
}
// NEGB: Two's Complement Negation.
//
// Forms:
//
// NEGB r8
// NEGB m8
func NEGB(mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR8(mr):
return &intrep.Instruction{
Opcode: "NEGB",
Operands: []operand.Op{mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsM8(mr):
return &intrep.Instruction{
Opcode: "NEGB",
Operands: []operand.Op{mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
}
return nil, errors.New("NEGB: bad operands")
}
// NEGL: Two's Complement Negation.
//
// Forms:
//
// NEGL r32
// NEGL m32
func NEGL(mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR32(mr):
return &intrep.Instruction{
Opcode: "NEGL",
Operands: []operand.Op{mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsM32(mr):
return &intrep.Instruction{
Opcode: "NEGL",
Operands: []operand.Op{mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
}
return nil, errors.New("NEGL: bad operands")
}
// NEGQ: Two's Complement Negation.
//
// Forms:
//
// NEGQ r64
// NEGQ m64
func NEGQ(mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR64(mr):
return &intrep.Instruction{
Opcode: "NEGQ",
Operands: []operand.Op{mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsM64(mr):
return &intrep.Instruction{
Opcode: "NEGQ",
Operands: []operand.Op{mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
}
return nil, errors.New("NEGQ: bad operands")
}
// NEGW: Two's Complement Negation.
//
// Forms:
//
// NEGW r16
// NEGW m16
func NEGW(mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR16(mr):
return &intrep.Instruction{
Opcode: "NEGW",
Operands: []operand.Op{mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsM16(mr):
return &intrep.Instruction{
Opcode: "NEGW",
Operands: []operand.Op{mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
}
return nil, errors.New("NEGW: bad operands")
}
// NOP: No Operation.
//
// Forms:
//
// NOP
func NOP() (*intrep.Instruction, error) {
return &intrep.Instruction{
Opcode: "NOP",
Operands: nil,
Inputs: []operand.Op{},
Outputs: []operand.Op{},
}, nil
}
// NOTB: One's Complement Negation.
//
// Forms:
//
// NOTB r8
// NOTB m8
func NOTB(mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR8(mr):
return &intrep.Instruction{
Opcode: "NOTB",
Operands: []operand.Op{mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsM8(mr):
return &intrep.Instruction{
Opcode: "NOTB",
Operands: []operand.Op{mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
}
return nil, errors.New("NOTB: bad operands")
}
// NOTL: One's Complement Negation.
//
// Forms:
//
// NOTL r32
// NOTL m32
func NOTL(mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR32(mr):
return &intrep.Instruction{
Opcode: "NOTL",
Operands: []operand.Op{mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsM32(mr):
return &intrep.Instruction{
Opcode: "NOTL",
Operands: []operand.Op{mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
}
return nil, errors.New("NOTL: bad operands")
}
// NOTQ: One's Complement Negation.
//
// Forms:
//
// NOTQ r64
// NOTQ m64
func NOTQ(mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR64(mr):
return &intrep.Instruction{
Opcode: "NOTQ",
Operands: []operand.Op{mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsM64(mr):
return &intrep.Instruction{
Opcode: "NOTQ",
Operands: []operand.Op{mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
}
return nil, errors.New("NOTQ: bad operands")
}
// NOTW: One's Complement Negation.
//
// Forms:
//
// NOTW r16
// NOTW m16
func NOTW(mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR16(mr):
return &intrep.Instruction{
Opcode: "NOTW",
Operands: []operand.Op{mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsM16(mr):
return &intrep.Instruction{
Opcode: "NOTW",
Operands: []operand.Op{mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
}
return nil, errors.New("NOTW: bad operands")
}
// ORB: Logical Inclusive OR.
//
// Forms:
//
// ORB imm8 al
// ORB imm8 r8
// ORB r8 r8
// ORB m8 r8
// ORB imm8 m8
// ORB r8 m8
func ORB(imr, amr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(imr) && operand.IsAL(amr):
return &intrep.Instruction{
Opcode: "ORB",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{amr},
Outputs: []operand.Op{amr},
}, nil
case operand.IsIMM8(imr) && operand.IsR8(amr):
return &intrep.Instruction{
Opcode: "ORB",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{amr},
Outputs: []operand.Op{amr},
}, nil
case operand.IsR8(imr) && operand.IsR8(amr):
return &intrep.Instruction{
Opcode: "ORB",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{imr, amr},
Outputs: []operand.Op{amr},
}, nil
case operand.IsM8(imr) && operand.IsR8(amr):
return &intrep.Instruction{
Opcode: "ORB",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{imr, amr},
Outputs: []operand.Op{amr},
}, nil
case operand.IsIMM8(imr) && operand.IsM8(amr):
return &intrep.Instruction{
Opcode: "ORB",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{amr},
Outputs: []operand.Op{amr},
}, nil
case operand.IsR8(imr) && operand.IsM8(amr):
return &intrep.Instruction{
Opcode: "ORB",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{imr, amr},
Outputs: []operand.Op{amr},
}, nil
}
return nil, errors.New("ORB: bad operands")
}
// ORL: Logical Inclusive OR.
//
// Forms:
//
// ORL imm32 eax
// ORL imm8 r32
// ORL imm32 r32
// ORL r32 r32
// ORL m32 r32
// ORL imm8 m32
// ORL imm32 m32
// ORL r32 m32
func ORL(imr, emr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM32(imr) && operand.IsEAX(emr):
return &intrep.Instruction{
Opcode: "ORL",
Operands: []operand.Op{imr, emr},
Inputs: []operand.Op{emr},
Outputs: []operand.Op{emr},
}, nil
case operand.IsIMM8(imr) && operand.IsR32(emr):
return &intrep.Instruction{
Opcode: "ORL",
Operands: []operand.Op{imr, emr},
Inputs: []operand.Op{emr},
Outputs: []operand.Op{emr},
}, nil
case operand.IsIMM32(imr) && operand.IsR32(emr):
return &intrep.Instruction{
Opcode: "ORL",
Operands: []operand.Op{imr, emr},
Inputs: []operand.Op{emr},
Outputs: []operand.Op{emr},
}, nil
case operand.IsR32(imr) && operand.IsR32(emr):
return &intrep.Instruction{
Opcode: "ORL",
Operands: []operand.Op{imr, emr},
Inputs: []operand.Op{imr, emr},
Outputs: []operand.Op{emr},
}, nil
case operand.IsM32(imr) && operand.IsR32(emr):
return &intrep.Instruction{
Opcode: "ORL",
Operands: []operand.Op{imr, emr},
Inputs: []operand.Op{imr, emr},
Outputs: []operand.Op{emr},
}, nil
case operand.IsIMM8(imr) && operand.IsM32(emr):
return &intrep.Instruction{
Opcode: "ORL",
Operands: []operand.Op{imr, emr},
Inputs: []operand.Op{emr},
Outputs: []operand.Op{emr},
}, nil
case operand.IsIMM32(imr) && operand.IsM32(emr):
return &intrep.Instruction{
Opcode: "ORL",
Operands: []operand.Op{imr, emr},
Inputs: []operand.Op{emr},
Outputs: []operand.Op{emr},
}, nil
case operand.IsR32(imr) && operand.IsM32(emr):
return &intrep.Instruction{
Opcode: "ORL",
Operands: []operand.Op{imr, emr},
Inputs: []operand.Op{imr, emr},
Outputs: []operand.Op{emr},
}, nil
}
return nil, errors.New("ORL: bad operands")
}
// ORPD: Bitwise Logical OR of Double-Precision Floating-Point Values.
//
// Forms:
//
// ORPD xmm xmm
// ORPD m128 xmm
func ORPD(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "ORPD",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "ORPD",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("ORPD: bad operands")
}
// ORPS: Bitwise Logical OR of Single-Precision Floating-Point Values.
//
// Forms:
//
// ORPS xmm xmm
// ORPS m128 xmm
func ORPS(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "ORPS",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "ORPS",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE"},
}, nil
}
return nil, errors.New("ORPS: bad operands")
}
// ORQ: Logical Inclusive OR.
//
// Forms:
//
// ORQ imm32 rax
// ORQ imm8 r64
// ORQ imm32 r64
// ORQ r64 r64
// ORQ m64 r64
// ORQ imm8 m64
// ORQ imm32 m64
// ORQ r64 m64
func ORQ(imr, mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM32(imr) && operand.IsRAX(mr):
return &intrep.Instruction{
Opcode: "ORQ",
Operands: []operand.Op{imr, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsIMM8(imr) && operand.IsR64(mr):
return &intrep.Instruction{
Opcode: "ORQ",
Operands: []operand.Op{imr, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsIMM32(imr) && operand.IsR64(mr):
return &intrep.Instruction{
Opcode: "ORQ",
Operands: []operand.Op{imr, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsR64(imr) && operand.IsR64(mr):
return &intrep.Instruction{
Opcode: "ORQ",
Operands: []operand.Op{imr, mr},
Inputs: []operand.Op{imr, mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsM64(imr) && operand.IsR64(mr):
return &intrep.Instruction{
Opcode: "ORQ",
Operands: []operand.Op{imr, mr},
Inputs: []operand.Op{imr, mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsIMM8(imr) && operand.IsM64(mr):
return &intrep.Instruction{
Opcode: "ORQ",
Operands: []operand.Op{imr, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsIMM32(imr) && operand.IsM64(mr):
return &intrep.Instruction{
Opcode: "ORQ",
Operands: []operand.Op{imr, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsR64(imr) && operand.IsM64(mr):
return &intrep.Instruction{
Opcode: "ORQ",
Operands: []operand.Op{imr, mr},
Inputs: []operand.Op{imr, mr},
Outputs: []operand.Op{mr},
}, nil
}
return nil, errors.New("ORQ: bad operands")
}
// ORW: Logical Inclusive OR.
//
// Forms:
//
// ORW imm16 ax
// ORW imm8 r16
// ORW imm16 r16
// ORW r16 r16
// ORW m16 r16
// ORW imm8 m16
// ORW imm16 m16
// ORW r16 m16
func ORW(imr, amr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM16(imr) && operand.IsAX(amr):
return &intrep.Instruction{
Opcode: "ORW",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{amr},
Outputs: []operand.Op{amr},
}, nil
case operand.IsIMM8(imr) && operand.IsR16(amr):
return &intrep.Instruction{
Opcode: "ORW",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{amr},
Outputs: []operand.Op{amr},
}, nil
case operand.IsIMM16(imr) && operand.IsR16(amr):
return &intrep.Instruction{
Opcode: "ORW",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{amr},
Outputs: []operand.Op{amr},
}, nil
case operand.IsR16(imr) && operand.IsR16(amr):
return &intrep.Instruction{
Opcode: "ORW",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{imr, amr},
Outputs: []operand.Op{amr},
}, nil
case operand.IsM16(imr) && operand.IsR16(amr):
return &intrep.Instruction{
Opcode: "ORW",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{imr, amr},
Outputs: []operand.Op{amr},
}, nil
case operand.IsIMM8(imr) && operand.IsM16(amr):
return &intrep.Instruction{
Opcode: "ORW",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{amr},
Outputs: []operand.Op{amr},
}, nil
case operand.IsIMM16(imr) && operand.IsM16(amr):
return &intrep.Instruction{
Opcode: "ORW",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{amr},
Outputs: []operand.Op{amr},
}, nil
case operand.IsR16(imr) && operand.IsM16(amr):
return &intrep.Instruction{
Opcode: "ORW",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{imr, amr},
Outputs: []operand.Op{amr},
}, nil
}
return nil, errors.New("ORW: bad operands")
}
// PABSB: Packed Absolute Value of Byte Integers.
//
// Forms:
//
// PABSB xmm xmm
// PABSB m128 xmm
func PABSB(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PABSB",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"SSSE3"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PABSB",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"SSSE3"},
}, nil
}
return nil, errors.New("PABSB: bad operands")
}
// PABSD: Packed Absolute Value of Doubleword Integers.
//
// Forms:
//
// PABSD xmm xmm
// PABSD m128 xmm
func PABSD(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PABSD",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"SSSE3"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PABSD",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"SSSE3"},
}, nil
}
return nil, errors.New("PABSD: bad operands")
}
// PABSW: Packed Absolute Value of Word Integers.
//
// Forms:
//
// PABSW xmm xmm
// PABSW m128 xmm
func PABSW(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PABSW",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"SSSE3"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PABSW",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"SSSE3"},
}, nil
}
return nil, errors.New("PABSW: bad operands")
}
// PACKSSLW: Pack Doublewords into Words with Signed Saturation.
//
// Forms:
//
// PACKSSLW xmm xmm
// PACKSSLW m128 xmm
func PACKSSLW(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PACKSSLW",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PACKSSLW",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("PACKSSLW: bad operands")
}
// PACKSSWB: Pack Words into Bytes with Signed Saturation.
//
// Forms:
//
// PACKSSWB xmm xmm
// PACKSSWB m128 xmm
func PACKSSWB(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PACKSSWB",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PACKSSWB",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("PACKSSWB: bad operands")
}
// PACKUSDW: Pack Doublewords into Words with Unsigned Saturation.
//
// Forms:
//
// PACKUSDW xmm xmm
// PACKUSDW m128 xmm
func PACKUSDW(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PACKUSDW",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE4.1"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PACKUSDW",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE4.1"},
}, nil
}
return nil, errors.New("PACKUSDW: bad operands")
}
// PACKUSWB: Pack Words into Bytes with Unsigned Saturation.
//
// Forms:
//
// PACKUSWB xmm xmm
// PACKUSWB m128 xmm
func PACKUSWB(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PACKUSWB",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PACKUSWB",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("PACKUSWB: bad operands")
}
// PADDB: Add Packed Byte Integers.
//
// Forms:
//
// PADDB xmm xmm
// PADDB m128 xmm
func PADDB(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PADDB",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PADDB",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("PADDB: bad operands")
}
// PADDD: Add Packed Doubleword Integers.
//
// Forms:
//
// PADDD xmm xmm
// PADDD m128 xmm
func PADDD(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PADDD",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PADDD",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("PADDD: bad operands")
}
// PADDL: Add Packed Doubleword Integers.
//
// Forms:
//
// PADDL xmm xmm
// PADDL m128 xmm
func PADDL(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PADDL",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PADDL",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("PADDL: bad operands")
}
// PADDQ: Add Packed Quadword Integers.
//
// Forms:
//
// PADDQ xmm xmm
// PADDQ m128 xmm
func PADDQ(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PADDQ",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PADDQ",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("PADDQ: bad operands")
}
// PADDSB: Add Packed Signed Byte Integers with Signed Saturation.
//
// Forms:
//
// PADDSB xmm xmm
// PADDSB m128 xmm
func PADDSB(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PADDSB",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PADDSB",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("PADDSB: bad operands")
}
// PADDSW: Add Packed Signed Word Integers with Signed Saturation.
//
// Forms:
//
// PADDSW xmm xmm
// PADDSW m128 xmm
func PADDSW(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PADDSW",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PADDSW",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("PADDSW: bad operands")
}
// PADDUSB: Add Packed Unsigned Byte Integers with Unsigned Saturation.
//
// Forms:
//
// PADDUSB xmm xmm
// PADDUSB m128 xmm
func PADDUSB(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PADDUSB",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PADDUSB",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("PADDUSB: bad operands")
}
// PADDUSW: Add Packed Unsigned Word Integers with Unsigned Saturation.
//
// Forms:
//
// PADDUSW xmm xmm
// PADDUSW m128 xmm
func PADDUSW(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PADDUSW",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PADDUSW",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("PADDUSW: bad operands")
}
// PADDW: Add Packed Word Integers.
//
// Forms:
//
// PADDW xmm xmm
// PADDW m128 xmm
func PADDW(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PADDW",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PADDW",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("PADDW: bad operands")
}
// PALIGNR: Packed Align Right.
//
// Forms:
//
// PALIGNR imm8 xmm xmm
// PALIGNR imm8 m128 xmm
func PALIGNR(i, mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(i) && operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PALIGNR",
Operands: []operand.Op{i, mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSSE3"},
}, nil
case operand.IsIMM8(i) && operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PALIGNR",
Operands: []operand.Op{i, mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSSE3"},
}, nil
}
return nil, errors.New("PALIGNR: bad operands")
}
// PAND: Packed Bitwise Logical AND.
//
// Forms:
//
// PAND xmm xmm
// PAND m128 xmm
func PAND(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PAND",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PAND",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("PAND: bad operands")
}
// PANDN: Packed Bitwise Logical AND NOT.
//
// Forms:
//
// PANDN xmm xmm
// PANDN m128 xmm
func PANDN(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PANDN",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
CancellingInputs: true,
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PANDN",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("PANDN: bad operands")
}
// PAUSE: Spin Loop Hint.
//
// Forms:
//
// PAUSE
func PAUSE() (*intrep.Instruction, error) {
return &intrep.Instruction{
Opcode: "PAUSE",
Operands: nil,
Inputs: []operand.Op{},
Outputs: []operand.Op{},
}, nil
}
// PAVGB: Average Packed Byte Integers.
//
// Forms:
//
// PAVGB xmm xmm
// PAVGB m128 xmm
func PAVGB(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PAVGB",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PAVGB",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("PAVGB: bad operands")
}
// PAVGW: Average Packed Word Integers.
//
// Forms:
//
// PAVGW xmm xmm
// PAVGW m128 xmm
func PAVGW(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PAVGW",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PAVGW",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("PAVGW: bad operands")
}
// PBLENDVB: Variable Blend Packed Bytes.
//
// Forms:
//
// PBLENDVB xmm0 xmm xmm
// PBLENDVB xmm0 m128 xmm
func PBLENDVB(x, mx, x1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM0(x) && operand.IsXMM(mx) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "PBLENDVB",
Operands: []operand.Op{x, mx, x1},
Inputs: []operand.Op{x, mx, x1},
Outputs: []operand.Op{x1},
ISA: []string{"SSE4.1"},
}, nil
case operand.IsXMM0(x) && operand.IsM128(mx) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "PBLENDVB",
Operands: []operand.Op{x, mx, x1},
Inputs: []operand.Op{x, mx, x1},
Outputs: []operand.Op{x1},
ISA: []string{"SSE4.1"},
}, nil
}
return nil, errors.New("PBLENDVB: bad operands")
}
// PBLENDW: Blend Packed Words.
//
// Forms:
//
// PBLENDW imm8 xmm xmm
// PBLENDW imm8 m128 xmm
func PBLENDW(i, mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(i) && operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PBLENDW",
Operands: []operand.Op{i, mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE4.1"},
}, nil
case operand.IsIMM8(i) && operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PBLENDW",
Operands: []operand.Op{i, mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE4.1"},
}, nil
}
return nil, errors.New("PBLENDW: bad operands")
}
// PCLMULQDQ: Carry-Less Quadword Multiplication.
//
// Forms:
//
// PCLMULQDQ imm8 xmm xmm
// PCLMULQDQ imm8 m128 xmm
func PCLMULQDQ(i, mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(i) && operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PCLMULQDQ",
Operands: []operand.Op{i, mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"PCLMULQDQ"},
}, nil
case operand.IsIMM8(i) && operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PCLMULQDQ",
Operands: []operand.Op{i, mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"PCLMULQDQ"},
}, nil
}
return nil, errors.New("PCLMULQDQ: bad operands")
}
// PCMPEQB: Compare Packed Byte Data for Equality.
//
// Forms:
//
// PCMPEQB xmm xmm
// PCMPEQB m128 xmm
func PCMPEQB(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PCMPEQB",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
CancellingInputs: true,
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PCMPEQB",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("PCMPEQB: bad operands")
}
// PCMPEQL: Compare Packed Doubleword Data for Equality.
//
// Forms:
//
// PCMPEQL xmm xmm
// PCMPEQL m128 xmm
func PCMPEQL(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PCMPEQL",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
CancellingInputs: true,
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PCMPEQL",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("PCMPEQL: bad operands")
}
// PCMPEQQ: Compare Packed Quadword Data for Equality.
//
// Forms:
//
// PCMPEQQ xmm xmm
// PCMPEQQ m128 xmm
func PCMPEQQ(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PCMPEQQ",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE4.1"},
CancellingInputs: true,
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PCMPEQQ",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE4.1"},
}, nil
}
return nil, errors.New("PCMPEQQ: bad operands")
}
// PCMPEQW: Compare Packed Word Data for Equality.
//
// Forms:
//
// PCMPEQW xmm xmm
// PCMPEQW m128 xmm
func PCMPEQW(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PCMPEQW",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
CancellingInputs: true,
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PCMPEQW",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("PCMPEQW: bad operands")
}
// PCMPESTRI: Packed Compare Explicit Length Strings, Return Index.
//
// Forms:
//
// PCMPESTRI imm8 xmm xmm
// PCMPESTRI imm8 m128 xmm
func PCMPESTRI(i, mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(i) && operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PCMPESTRI",
Operands: []operand.Op{i, mx, x},
Inputs: []operand.Op{mx, x, reg.EAX, reg.EDX},
Outputs: []operand.Op{reg.ECX},
ISA: []string{"SSE4.2"},
}, nil
case operand.IsIMM8(i) && operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PCMPESTRI",
Operands: []operand.Op{i, mx, x},
Inputs: []operand.Op{mx, x, reg.EAX, reg.EDX},
Outputs: []operand.Op{reg.ECX},
ISA: []string{"SSE4.2"},
}, nil
}
return nil, errors.New("PCMPESTRI: bad operands")
}
// PCMPESTRM: Packed Compare Explicit Length Strings, Return Mask.
//
// Forms:
//
// PCMPESTRM imm8 xmm xmm
// PCMPESTRM imm8 m128 xmm
func PCMPESTRM(i, mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(i) && operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PCMPESTRM",
Operands: []operand.Op{i, mx, x},
Inputs: []operand.Op{mx, x, reg.EAX, reg.EDX},
Outputs: []operand.Op{reg.X0},
ISA: []string{"SSE4.2"},
}, nil
case operand.IsIMM8(i) && operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PCMPESTRM",
Operands: []operand.Op{i, mx, x},
Inputs: []operand.Op{mx, x, reg.EAX, reg.EDX},
Outputs: []operand.Op{reg.X0},
ISA: []string{"SSE4.2"},
}, nil
}
return nil, errors.New("PCMPESTRM: bad operands")
}
// PCMPGTB: Compare Packed Signed Byte Integers for Greater Than.
//
// Forms:
//
// PCMPGTB xmm xmm
// PCMPGTB m128 xmm
func PCMPGTB(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PCMPGTB",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
CancellingInputs: true,
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PCMPGTB",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("PCMPGTB: bad operands")
}
// PCMPGTL: Compare Packed Signed Doubleword Integers for Greater Than.
//
// Forms:
//
// PCMPGTL xmm xmm
// PCMPGTL m128 xmm
func PCMPGTL(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PCMPGTL",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
CancellingInputs: true,
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PCMPGTL",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("PCMPGTL: bad operands")
}
// PCMPGTQ: Compare Packed Data for Greater Than.
//
// Forms:
//
// PCMPGTQ xmm xmm
// PCMPGTQ m128 xmm
func PCMPGTQ(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PCMPGTQ",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE4.2"},
CancellingInputs: true,
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PCMPGTQ",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE4.2"},
}, nil
}
return nil, errors.New("PCMPGTQ: bad operands")
}
// PCMPGTW: Compare Packed Signed Word Integers for Greater Than.
//
// Forms:
//
// PCMPGTW xmm xmm
// PCMPGTW m128 xmm
func PCMPGTW(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PCMPGTW",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
CancellingInputs: true,
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PCMPGTW",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("PCMPGTW: bad operands")
}
// PCMPISTRI: Packed Compare Implicit Length Strings, Return Index.
//
// Forms:
//
// PCMPISTRI imm8 xmm xmm
// PCMPISTRI imm8 m128 xmm
func PCMPISTRI(i, mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(i) && operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PCMPISTRI",
Operands: []operand.Op{i, mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{reg.ECX},
ISA: []string{"SSE4.2"},
}, nil
case operand.IsIMM8(i) && operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PCMPISTRI",
Operands: []operand.Op{i, mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{reg.ECX},
ISA: []string{"SSE4.2"},
}, nil
}
return nil, errors.New("PCMPISTRI: bad operands")
}
// PCMPISTRM: Packed Compare Implicit Length Strings, Return Mask.
//
// Forms:
//
// PCMPISTRM imm8 xmm xmm
// PCMPISTRM imm8 m128 xmm
func PCMPISTRM(i, mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(i) && operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PCMPISTRM",
Operands: []operand.Op{i, mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{reg.X0},
ISA: []string{"SSE4.2"},
}, nil
case operand.IsIMM8(i) && operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PCMPISTRM",
Operands: []operand.Op{i, mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{reg.X0},
ISA: []string{"SSE4.2"},
}, nil
}
return nil, errors.New("PCMPISTRM: bad operands")
}
// PDEPL: Parallel Bits Deposit.
//
// Forms:
//
// PDEPL r32 r32 r32
// PDEPL m32 r32 r32
func PDEPL(mr, r, r1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR32(mr) && operand.IsR32(r) && operand.IsR32(r1):
return &intrep.Instruction{
Opcode: "PDEPL",
Operands: []operand.Op{mr, r, r1},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r1},
ISA: []string{"BMI2"},
}, nil
case operand.IsM32(mr) && operand.IsR32(r) && operand.IsR32(r1):
return &intrep.Instruction{
Opcode: "PDEPL",
Operands: []operand.Op{mr, r, r1},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r1},
ISA: []string{"BMI2"},
}, nil
}
return nil, errors.New("PDEPL: bad operands")
}
// PDEPQ: Parallel Bits Deposit.
//
// Forms:
//
// PDEPQ r64 r64 r64
// PDEPQ m64 r64 r64
func PDEPQ(mr, r, r1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR64(mr) && operand.IsR64(r) && operand.IsR64(r1):
return &intrep.Instruction{
Opcode: "PDEPQ",
Operands: []operand.Op{mr, r, r1},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r1},
ISA: []string{"BMI2"},
}, nil
case operand.IsM64(mr) && operand.IsR64(r) && operand.IsR64(r1):
return &intrep.Instruction{
Opcode: "PDEPQ",
Operands: []operand.Op{mr, r, r1},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r1},
ISA: []string{"BMI2"},
}, nil
}
return nil, errors.New("PDEPQ: bad operands")
}
// PEXTL: Parallel Bits Extract.
//
// Forms:
//
// PEXTL r32 r32 r32
// PEXTL m32 r32 r32
func PEXTL(mr, r, r1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR32(mr) && operand.IsR32(r) && operand.IsR32(r1):
return &intrep.Instruction{
Opcode: "PEXTL",
Operands: []operand.Op{mr, r, r1},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r1},
ISA: []string{"BMI2"},
}, nil
case operand.IsM32(mr) && operand.IsR32(r) && operand.IsR32(r1):
return &intrep.Instruction{
Opcode: "PEXTL",
Operands: []operand.Op{mr, r, r1},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r1},
ISA: []string{"BMI2"},
}, nil
}
return nil, errors.New("PEXTL: bad operands")
}
// PEXTQ: Parallel Bits Extract.
//
// Forms:
//
// PEXTQ r64 r64 r64
// PEXTQ m64 r64 r64
func PEXTQ(mr, r, r1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR64(mr) && operand.IsR64(r) && operand.IsR64(r1):
return &intrep.Instruction{
Opcode: "PEXTQ",
Operands: []operand.Op{mr, r, r1},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r1},
ISA: []string{"BMI2"},
}, nil
case operand.IsM64(mr) && operand.IsR64(r) && operand.IsR64(r1):
return &intrep.Instruction{
Opcode: "PEXTQ",
Operands: []operand.Op{mr, r, r1},
Inputs: []operand.Op{mr, r},
Outputs: []operand.Op{r1},
ISA: []string{"BMI2"},
}, nil
}
return nil, errors.New("PEXTQ: bad operands")
}
// PEXTRB: Extract Byte.
//
// Forms:
//
// PEXTRB imm8 xmm r32
// PEXTRB imm8 xmm m8
func PEXTRB(i, x, mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(i) && operand.IsXMM(x) && operand.IsR32(mr):
return &intrep.Instruction{
Opcode: "PEXTRB",
Operands: []operand.Op{i, x, mr},
Inputs: []operand.Op{x},
Outputs: []operand.Op{mr},
ISA: []string{"SSE4.1"},
}, nil
case operand.IsIMM8(i) && operand.IsXMM(x) && operand.IsM8(mr):
return &intrep.Instruction{
Opcode: "PEXTRB",
Operands: []operand.Op{i, x, mr},
Inputs: []operand.Op{x},
Outputs: []operand.Op{mr},
ISA: []string{"SSE4.1"},
}, nil
}
return nil, errors.New("PEXTRB: bad operands")
}
// PEXTRD: Extract Doubleword.
//
// Forms:
//
// PEXTRD imm8 xmm r32
// PEXTRD imm8 xmm m32
func PEXTRD(i, x, mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(i) && operand.IsXMM(x) && operand.IsR32(mr):
return &intrep.Instruction{
Opcode: "PEXTRD",
Operands: []operand.Op{i, x, mr},
Inputs: []operand.Op{x},
Outputs: []operand.Op{mr},
ISA: []string{"SSE4.1"},
}, nil
case operand.IsIMM8(i) && operand.IsXMM(x) && operand.IsM32(mr):
return &intrep.Instruction{
Opcode: "PEXTRD",
Operands: []operand.Op{i, x, mr},
Inputs: []operand.Op{x},
Outputs: []operand.Op{mr},
ISA: []string{"SSE4.1"},
}, nil
}
return nil, errors.New("PEXTRD: bad operands")
}
// PEXTRQ: Extract Quadword.
//
// Forms:
//
// PEXTRQ imm8 xmm r64
// PEXTRQ imm8 xmm m64
func PEXTRQ(i, x, mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(i) && operand.IsXMM(x) && operand.IsR64(mr):
return &intrep.Instruction{
Opcode: "PEXTRQ",
Operands: []operand.Op{i, x, mr},
Inputs: []operand.Op{x},
Outputs: []operand.Op{mr},
ISA: []string{"SSE4.1"},
}, nil
case operand.IsIMM8(i) && operand.IsXMM(x) && operand.IsM64(mr):
return &intrep.Instruction{
Opcode: "PEXTRQ",
Operands: []operand.Op{i, x, mr},
Inputs: []operand.Op{x},
Outputs: []operand.Op{mr},
ISA: []string{"SSE4.1"},
}, nil
}
return nil, errors.New("PEXTRQ: bad operands")
}
// PEXTRW: Extract Word.
//
// Forms:
//
// PEXTRW imm8 xmm r32
// PEXTRW imm8 xmm m16
func PEXTRW(i, x, mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(i) && operand.IsXMM(x) && operand.IsR32(mr):
return &intrep.Instruction{
Opcode: "PEXTRW",
Operands: []operand.Op{i, x, mr},
Inputs: []operand.Op{x},
Outputs: []operand.Op{mr},
ISA: []string{"SSE4.1"},
}, nil
case operand.IsIMM8(i) && operand.IsXMM(x) && operand.IsM16(mr):
return &intrep.Instruction{
Opcode: "PEXTRW",
Operands: []operand.Op{i, x, mr},
Inputs: []operand.Op{x},
Outputs: []operand.Op{mr},
ISA: []string{"SSE4.1"},
}, nil
}
return nil, errors.New("PEXTRW: bad operands")
}
// PHADDD: Packed Horizontal Add Doubleword Integer.
//
// Forms:
//
// PHADDD xmm xmm
// PHADDD m128 xmm
func PHADDD(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PHADDD",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSSE3"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PHADDD",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSSE3"},
}, nil
}
return nil, errors.New("PHADDD: bad operands")
}
// PHADDSW: Packed Horizontal Add Signed Word Integers with Signed Saturation.
//
// Forms:
//
// PHADDSW xmm xmm
// PHADDSW m128 xmm
func PHADDSW(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PHADDSW",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSSE3"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PHADDSW",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSSE3"},
}, nil
}
return nil, errors.New("PHADDSW: bad operands")
}
// PHADDW: Packed Horizontal Add Word Integers.
//
// Forms:
//
// PHADDW xmm xmm
// PHADDW m128 xmm
func PHADDW(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PHADDW",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSSE3"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PHADDW",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSSE3"},
}, nil
}
return nil, errors.New("PHADDW: bad operands")
}
// PHMINPOSUW: Packed Horizontal Minimum of Unsigned Word Integers.
//
// Forms:
//
// PHMINPOSUW xmm xmm
// PHMINPOSUW m128 xmm
func PHMINPOSUW(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PHMINPOSUW",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"SSE4.1"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PHMINPOSUW",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"SSE4.1"},
}, nil
}
return nil, errors.New("PHMINPOSUW: bad operands")
}
// PHSUBD: Packed Horizontal Subtract Doubleword Integers.
//
// Forms:
//
// PHSUBD xmm xmm
// PHSUBD m128 xmm
func PHSUBD(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PHSUBD",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSSE3"},
CancellingInputs: true,
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PHSUBD",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSSE3"},
}, nil
}
return nil, errors.New("PHSUBD: bad operands")
}
// PHSUBSW: Packed Horizontal Subtract Signed Word Integers with Signed Saturation.
//
// Forms:
//
// PHSUBSW xmm xmm
// PHSUBSW m128 xmm
func PHSUBSW(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PHSUBSW",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSSE3"},
CancellingInputs: true,
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PHSUBSW",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSSE3"},
}, nil
}
return nil, errors.New("PHSUBSW: bad operands")
}
// PHSUBW: Packed Horizontal Subtract Word Integers.
//
// Forms:
//
// PHSUBW xmm xmm
// PHSUBW m128 xmm
func PHSUBW(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PHSUBW",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSSE3"},
CancellingInputs: true,
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PHSUBW",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSSE3"},
}, nil
}
return nil, errors.New("PHSUBW: bad operands")
}
// PINSRB: Insert Byte.
//
// Forms:
//
// PINSRB imm8 r32 xmm
// PINSRB imm8 m8 xmm
func PINSRB(i, mr, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(i) && operand.IsR32(mr) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PINSRB",
Operands: []operand.Op{i, mr, x},
Inputs: []operand.Op{mr, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE4.1"},
}, nil
case operand.IsIMM8(i) && operand.IsM8(mr) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PINSRB",
Operands: []operand.Op{i, mr, x},
Inputs: []operand.Op{mr, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE4.1"},
}, nil
}
return nil, errors.New("PINSRB: bad operands")
}
// PINSRD: Insert Doubleword.
//
// Forms:
//
// PINSRD imm8 r32 xmm
// PINSRD imm8 m32 xmm
func PINSRD(i, mr, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(i) && operand.IsR32(mr) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PINSRD",
Operands: []operand.Op{i, mr, x},
Inputs: []operand.Op{mr, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE4.1"},
}, nil
case operand.IsIMM8(i) && operand.IsM32(mr) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PINSRD",
Operands: []operand.Op{i, mr, x},
Inputs: []operand.Op{mr, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE4.1"},
}, nil
}
return nil, errors.New("PINSRD: bad operands")
}
// PINSRQ: Insert Quadword.
//
// Forms:
//
// PINSRQ imm8 r64 xmm
// PINSRQ imm8 m64 xmm
func PINSRQ(i, mr, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(i) && operand.IsR64(mr) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PINSRQ",
Operands: []operand.Op{i, mr, x},
Inputs: []operand.Op{mr, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE4.1"},
}, nil
case operand.IsIMM8(i) && operand.IsM64(mr) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PINSRQ",
Operands: []operand.Op{i, mr, x},
Inputs: []operand.Op{mr, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE4.1"},
}, nil
}
return nil, errors.New("PINSRQ: bad operands")
}
// PINSRW: Insert Word.
//
// Forms:
//
// PINSRW imm8 r32 xmm
// PINSRW imm8 m16 xmm
func PINSRW(i, mr, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(i) && operand.IsR32(mr) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PINSRW",
Operands: []operand.Op{i, mr, x},
Inputs: []operand.Op{mr, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
case operand.IsIMM8(i) && operand.IsM16(mr) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PINSRW",
Operands: []operand.Op{i, mr, x},
Inputs: []operand.Op{mr, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("PINSRW: bad operands")
}
// PMADDUBSW: Multiply and Add Packed Signed and Unsigned Byte Integers.
//
// Forms:
//
// PMADDUBSW xmm xmm
// PMADDUBSW m128 xmm
func PMADDUBSW(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PMADDUBSW",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSSE3"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PMADDUBSW",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSSE3"},
}, nil
}
return nil, errors.New("PMADDUBSW: bad operands")
}
// PMADDWL: Multiply and Add Packed Signed Word Integers.
//
// Forms:
//
// PMADDWL xmm xmm
// PMADDWL m128 xmm
func PMADDWL(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PMADDWL",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PMADDWL",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("PMADDWL: bad operands")
}
// PMAXSB: Maximum of Packed Signed Byte Integers.
//
// Forms:
//
// PMAXSB xmm xmm
// PMAXSB m128 xmm
func PMAXSB(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PMAXSB",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE4.1"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PMAXSB",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE4.1"},
}, nil
}
return nil, errors.New("PMAXSB: bad operands")
}
// PMAXSD: Maximum of Packed Signed Doubleword Integers.
//
// Forms:
//
// PMAXSD xmm xmm
// PMAXSD m128 xmm
func PMAXSD(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PMAXSD",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE4.1"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PMAXSD",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE4.1"},
}, nil
}
return nil, errors.New("PMAXSD: bad operands")
}
// PMAXSW: Maximum of Packed Signed Word Integers.
//
// Forms:
//
// PMAXSW xmm xmm
// PMAXSW m128 xmm
func PMAXSW(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PMAXSW",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PMAXSW",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("PMAXSW: bad operands")
}
// PMAXUB: Maximum of Packed Unsigned Byte Integers.
//
// Forms:
//
// PMAXUB xmm xmm
// PMAXUB m128 xmm
func PMAXUB(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PMAXUB",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PMAXUB",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("PMAXUB: bad operands")
}
// PMAXUD: Maximum of Packed Unsigned Doubleword Integers.
//
// Forms:
//
// PMAXUD xmm xmm
// PMAXUD m128 xmm
func PMAXUD(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PMAXUD",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE4.1"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PMAXUD",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE4.1"},
}, nil
}
return nil, errors.New("PMAXUD: bad operands")
}
// PMAXUW: Maximum of Packed Unsigned Word Integers.
//
// Forms:
//
// PMAXUW xmm xmm
// PMAXUW m128 xmm
func PMAXUW(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PMAXUW",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE4.1"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PMAXUW",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE4.1"},
}, nil
}
return nil, errors.New("PMAXUW: bad operands")
}
// PMINSB: Minimum of Packed Signed Byte Integers.
//
// Forms:
//
// PMINSB xmm xmm
// PMINSB m128 xmm
func PMINSB(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PMINSB",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE4.1"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PMINSB",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE4.1"},
}, nil
}
return nil, errors.New("PMINSB: bad operands")
}
// PMINSD: Minimum of Packed Signed Doubleword Integers.
//
// Forms:
//
// PMINSD xmm xmm
// PMINSD m128 xmm
func PMINSD(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PMINSD",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE4.1"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PMINSD",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE4.1"},
}, nil
}
return nil, errors.New("PMINSD: bad operands")
}
// PMINSW: Minimum of Packed Signed Word Integers.
//
// Forms:
//
// PMINSW xmm xmm
// PMINSW m128 xmm
func PMINSW(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PMINSW",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PMINSW",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("PMINSW: bad operands")
}
// PMINUB: Minimum of Packed Unsigned Byte Integers.
//
// Forms:
//
// PMINUB xmm xmm
// PMINUB m128 xmm
func PMINUB(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PMINUB",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PMINUB",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("PMINUB: bad operands")
}
// PMINUD: Minimum of Packed Unsigned Doubleword Integers.
//
// Forms:
//
// PMINUD xmm xmm
// PMINUD m128 xmm
func PMINUD(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PMINUD",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE4.1"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PMINUD",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE4.1"},
}, nil
}
return nil, errors.New("PMINUD: bad operands")
}
// PMINUW: Minimum of Packed Unsigned Word Integers.
//
// Forms:
//
// PMINUW xmm xmm
// PMINUW m128 xmm
func PMINUW(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PMINUW",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE4.1"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PMINUW",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE4.1"},
}, nil
}
return nil, errors.New("PMINUW: bad operands")
}
// PMOVMSKB: Move Byte Mask.
//
// Forms:
//
// PMOVMSKB xmm r32
func PMOVMSKB(x, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(x) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "PMOVMSKB",
Operands: []operand.Op{x, r},
Inputs: []operand.Op{x},
Outputs: []operand.Op{r},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("PMOVMSKB: bad operands")
}
// PMOVSXBD: Move Packed Byte Integers to Doubleword Integers with Sign Extension.
//
// Forms:
//
// PMOVSXBD xmm xmm
// PMOVSXBD m32 xmm
func PMOVSXBD(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PMOVSXBD",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"SSE4.1"},
}, nil
case operand.IsM32(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PMOVSXBD",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"SSE4.1"},
}, nil
}
return nil, errors.New("PMOVSXBD: bad operands")
}
// PMOVSXBQ: Move Packed Byte Integers to Quadword Integers with Sign Extension.
//
// Forms:
//
// PMOVSXBQ xmm xmm
// PMOVSXBQ m16 xmm
func PMOVSXBQ(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PMOVSXBQ",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"SSE4.1"},
}, nil
case operand.IsM16(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PMOVSXBQ",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"SSE4.1"},
}, nil
}
return nil, errors.New("PMOVSXBQ: bad operands")
}
// PMOVSXBW: Move Packed Byte Integers to Word Integers with Sign Extension.
//
// Forms:
//
// PMOVSXBW xmm xmm
// PMOVSXBW m64 xmm
func PMOVSXBW(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PMOVSXBW",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"SSE4.1"},
}, nil
case operand.IsM64(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PMOVSXBW",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"SSE4.1"},
}, nil
}
return nil, errors.New("PMOVSXBW: bad operands")
}
// PMOVSXDQ: Move Packed Doubleword Integers to Quadword Integers with Sign Extension.
//
// Forms:
//
// PMOVSXDQ xmm xmm
// PMOVSXDQ m64 xmm
func PMOVSXDQ(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PMOVSXDQ",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"SSE4.1"},
}, nil
case operand.IsM64(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PMOVSXDQ",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"SSE4.1"},
}, nil
}
return nil, errors.New("PMOVSXDQ: bad operands")
}
// PMOVSXWD: Move Packed Word Integers to Doubleword Integers with Sign Extension.
//
// Forms:
//
// PMOVSXWD xmm xmm
// PMOVSXWD m64 xmm
func PMOVSXWD(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PMOVSXWD",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"SSE4.1"},
}, nil
case operand.IsM64(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PMOVSXWD",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"SSE4.1"},
}, nil
}
return nil, errors.New("PMOVSXWD: bad operands")
}
// PMOVSXWQ: Move Packed Word Integers to Quadword Integers with Sign Extension.
//
// Forms:
//
// PMOVSXWQ xmm xmm
// PMOVSXWQ m32 xmm
func PMOVSXWQ(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PMOVSXWQ",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"SSE4.1"},
}, nil
case operand.IsM32(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PMOVSXWQ",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"SSE4.1"},
}, nil
}
return nil, errors.New("PMOVSXWQ: bad operands")
}
// PMOVZXBD: Move Packed Byte Integers to Doubleword Integers with Zero Extension.
//
// Forms:
//
// PMOVZXBD xmm xmm
// PMOVZXBD m32 xmm
func PMOVZXBD(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PMOVZXBD",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"SSE4.1"},
}, nil
case operand.IsM32(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PMOVZXBD",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"SSE4.1"},
}, nil
}
return nil, errors.New("PMOVZXBD: bad operands")
}
// PMOVZXBQ: Move Packed Byte Integers to Quadword Integers with Zero Extension.
//
// Forms:
//
// PMOVZXBQ xmm xmm
// PMOVZXBQ m16 xmm
func PMOVZXBQ(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PMOVZXBQ",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"SSE4.1"},
}, nil
case operand.IsM16(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PMOVZXBQ",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"SSE4.1"},
}, nil
}
return nil, errors.New("PMOVZXBQ: bad operands")
}
// PMOVZXBW: Move Packed Byte Integers to Word Integers with Zero Extension.
//
// Forms:
//
// PMOVZXBW xmm xmm
// PMOVZXBW m64 xmm
func PMOVZXBW(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PMOVZXBW",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"SSE4.1"},
}, nil
case operand.IsM64(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PMOVZXBW",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"SSE4.1"},
}, nil
}
return nil, errors.New("PMOVZXBW: bad operands")
}
// PMOVZXDQ: Move Packed Doubleword Integers to Quadword Integers with Zero Extension.
//
// Forms:
//
// PMOVZXDQ xmm xmm
// PMOVZXDQ m64 xmm
func PMOVZXDQ(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PMOVZXDQ",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"SSE4.1"},
}, nil
case operand.IsM64(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PMOVZXDQ",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"SSE4.1"},
}, nil
}
return nil, errors.New("PMOVZXDQ: bad operands")
}
// PMOVZXWD: Move Packed Word Integers to Doubleword Integers with Zero Extension.
//
// Forms:
//
// PMOVZXWD xmm xmm
// PMOVZXWD m64 xmm
func PMOVZXWD(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PMOVZXWD",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"SSE4.1"},
}, nil
case operand.IsM64(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PMOVZXWD",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"SSE4.1"},
}, nil
}
return nil, errors.New("PMOVZXWD: bad operands")
}
// PMOVZXWQ: Move Packed Word Integers to Quadword Integers with Zero Extension.
//
// Forms:
//
// PMOVZXWQ xmm xmm
// PMOVZXWQ m32 xmm
func PMOVZXWQ(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PMOVZXWQ",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"SSE4.1"},
}, nil
case operand.IsM32(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PMOVZXWQ",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"SSE4.1"},
}, nil
}
return nil, errors.New("PMOVZXWQ: bad operands")
}
// PMULDQ: Multiply Packed Signed Doubleword Integers and Store Quadword Result.
//
// Forms:
//
// PMULDQ xmm xmm
// PMULDQ m128 xmm
func PMULDQ(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PMULDQ",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE4.1"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PMULDQ",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE4.1"},
}, nil
}
return nil, errors.New("PMULDQ: bad operands")
}
// PMULHRSW: Packed Multiply Signed Word Integers and Store High Result with Round and Scale.
//
// Forms:
//
// PMULHRSW xmm xmm
// PMULHRSW m128 xmm
func PMULHRSW(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PMULHRSW",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSSE3"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PMULHRSW",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSSE3"},
}, nil
}
return nil, errors.New("PMULHRSW: bad operands")
}
// PMULHUW: Multiply Packed Unsigned Word Integers and Store High Result.
//
// Forms:
//
// PMULHUW xmm xmm
// PMULHUW m128 xmm
func PMULHUW(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PMULHUW",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PMULHUW",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("PMULHUW: bad operands")
}
// PMULHW: Multiply Packed Signed Word Integers and Store High Result.
//
// Forms:
//
// PMULHW xmm xmm
// PMULHW m128 xmm
func PMULHW(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PMULHW",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PMULHW",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("PMULHW: bad operands")
}
// PMULLD: Multiply Packed Signed Doubleword Integers and Store Low Result.
//
// Forms:
//
// PMULLD xmm xmm
// PMULLD m128 xmm
func PMULLD(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PMULLD",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE4.1"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PMULLD",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE4.1"},
}, nil
}
return nil, errors.New("PMULLD: bad operands")
}
// PMULLW: Multiply Packed Signed Word Integers and Store Low Result.
//
// Forms:
//
// PMULLW xmm xmm
// PMULLW m128 xmm
func PMULLW(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PMULLW",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PMULLW",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("PMULLW: bad operands")
}
// PMULULQ: Multiply Packed Unsigned Doubleword Integers.
//
// Forms:
//
// PMULULQ xmm xmm
// PMULULQ m128 xmm
func PMULULQ(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PMULULQ",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PMULULQ",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("PMULULQ: bad operands")
}
// POPCNTL: Count of Number of Bits Set to 1.
//
// Forms:
//
// POPCNTL r32 r32
// POPCNTL m32 r32
func POPCNTL(mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR32(mr) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "POPCNTL",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{r},
ISA: []string{"POPCNT"},
}, nil
case operand.IsM32(mr) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "POPCNTL",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{r},
ISA: []string{"POPCNT"},
}, nil
}
return nil, errors.New("POPCNTL: bad operands")
}
// POPCNTQ: Count of Number of Bits Set to 1.
//
// Forms:
//
// POPCNTQ r64 r64
// POPCNTQ m64 r64
func POPCNTQ(mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR64(mr) && operand.IsR64(r):
return &intrep.Instruction{
Opcode: "POPCNTQ",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{r},
ISA: []string{"POPCNT"},
}, nil
case operand.IsM64(mr) && operand.IsR64(r):
return &intrep.Instruction{
Opcode: "POPCNTQ",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{r},
ISA: []string{"POPCNT"},
}, nil
}
return nil, errors.New("POPCNTQ: bad operands")
}
// POPCNTW: Count of Number of Bits Set to 1.
//
// Forms:
//
// POPCNTW r16 r16
// POPCNTW m16 r16
func POPCNTW(mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR16(mr) && operand.IsR16(r):
return &intrep.Instruction{
Opcode: "POPCNTW",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{r},
ISA: []string{"POPCNT"},
}, nil
case operand.IsM16(mr) && operand.IsR16(r):
return &intrep.Instruction{
Opcode: "POPCNTW",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{r},
ISA: []string{"POPCNT"},
}, nil
}
return nil, errors.New("POPCNTW: bad operands")
}
// POPQ: Pop a Value from the Stack.
//
// Forms:
//
// POPQ r64
// POPQ m64
func POPQ(mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR64(mr):
return &intrep.Instruction{
Opcode: "POPQ",
Operands: []operand.Op{mr},
Inputs: []operand.Op{},
Outputs: []operand.Op{mr},
}, nil
case operand.IsM64(mr):
return &intrep.Instruction{
Opcode: "POPQ",
Operands: []operand.Op{mr},
Inputs: []operand.Op{},
Outputs: []operand.Op{mr},
}, nil
}
return nil, errors.New("POPQ: bad operands")
}
// POPW: Pop a Value from the Stack.
//
// Forms:
//
// POPW r16
// POPW m16
func POPW(mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR16(mr):
return &intrep.Instruction{
Opcode: "POPW",
Operands: []operand.Op{mr},
Inputs: []operand.Op{},
Outputs: []operand.Op{mr},
}, nil
case operand.IsM16(mr):
return &intrep.Instruction{
Opcode: "POPW",
Operands: []operand.Op{mr},
Inputs: []operand.Op{},
Outputs: []operand.Op{mr},
}, nil
}
return nil, errors.New("POPW: bad operands")
}
// POR: Packed Bitwise Logical OR.
//
// Forms:
//
// POR xmm xmm
// POR m128 xmm
func POR(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "POR",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "POR",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("POR: bad operands")
}
// PREFETCHNTA: Prefetch Data Into Caches using NTA Hint.
//
// Forms:
//
// PREFETCHNTA m8
func PREFETCHNTA(m operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsM8(m):
return &intrep.Instruction{
Opcode: "PREFETCHNTA",
Operands: []operand.Op{m},
Inputs: []operand.Op{m},
Outputs: []operand.Op{},
ISA: []string{"MMX+"},
}, nil
}
return nil, errors.New("PREFETCHNTA: bad operands")
}
// PREFETCHT0: Prefetch Data Into Caches using T0 Hint.
//
// Forms:
//
// PREFETCHT0 m8
func PREFETCHT0(m operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsM8(m):
return &intrep.Instruction{
Opcode: "PREFETCHT0",
Operands: []operand.Op{m},
Inputs: []operand.Op{m},
Outputs: []operand.Op{},
ISA: []string{"MMX+"},
}, nil
}
return nil, errors.New("PREFETCHT0: bad operands")
}
// PREFETCHT1: Prefetch Data Into Caches using T1 Hint.
//
// Forms:
//
// PREFETCHT1 m8
func PREFETCHT1(m operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsM8(m):
return &intrep.Instruction{
Opcode: "PREFETCHT1",
Operands: []operand.Op{m},
Inputs: []operand.Op{m},
Outputs: []operand.Op{},
ISA: []string{"MMX+"},
}, nil
}
return nil, errors.New("PREFETCHT1: bad operands")
}
// PREFETCHT2: Prefetch Data Into Caches using T2 Hint.
//
// Forms:
//
// PREFETCHT2 m8
func PREFETCHT2(m operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsM8(m):
return &intrep.Instruction{
Opcode: "PREFETCHT2",
Operands: []operand.Op{m},
Inputs: []operand.Op{m},
Outputs: []operand.Op{},
ISA: []string{"MMX+"},
}, nil
}
return nil, errors.New("PREFETCHT2: bad operands")
}
// PSADBW: Compute Sum of Absolute Differences.
//
// Forms:
//
// PSADBW xmm xmm
// PSADBW m128 xmm
func PSADBW(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PSADBW",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
CancellingInputs: true,
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PSADBW",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("PSADBW: bad operands")
}
// PSHUFB: Packed Shuffle Bytes.
//
// Forms:
//
// PSHUFB xmm xmm
// PSHUFB m128 xmm
func PSHUFB(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PSHUFB",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSSE3"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PSHUFB",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSSE3"},
}, nil
}
return nil, errors.New("PSHUFB: bad operands")
}
// PSHUFD: Shuffle Packed Doublewords.
//
// Forms:
//
// PSHUFD imm8 xmm xmm
// PSHUFD imm8 m128 xmm
func PSHUFD(i, mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(i) && operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PSHUFD",
Operands: []operand.Op{i, mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
case operand.IsIMM8(i) && operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PSHUFD",
Operands: []operand.Op{i, mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("PSHUFD: bad operands")
}
// PSHUFHW: Shuffle Packed High Words.
//
// Forms:
//
// PSHUFHW imm8 xmm xmm
// PSHUFHW imm8 m128 xmm
func PSHUFHW(i, mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(i) && operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PSHUFHW",
Operands: []operand.Op{i, mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
case operand.IsIMM8(i) && operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PSHUFHW",
Operands: []operand.Op{i, mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("PSHUFHW: bad operands")
}
// PSHUFL: Shuffle Packed Doublewords.
//
// Forms:
//
// PSHUFL imm8 xmm xmm
// PSHUFL imm8 m128 xmm
func PSHUFL(i, mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(i) && operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PSHUFL",
Operands: []operand.Op{i, mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
case operand.IsIMM8(i) && operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PSHUFL",
Operands: []operand.Op{i, mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("PSHUFL: bad operands")
}
// PSHUFLW: Shuffle Packed Low Words.
//
// Forms:
//
// PSHUFLW imm8 xmm xmm
// PSHUFLW imm8 m128 xmm
func PSHUFLW(i, mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(i) && operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PSHUFLW",
Operands: []operand.Op{i, mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
case operand.IsIMM8(i) && operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PSHUFLW",
Operands: []operand.Op{i, mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("PSHUFLW: bad operands")
}
// PSIGNB: Packed Sign of Byte Integers.
//
// Forms:
//
// PSIGNB xmm xmm
// PSIGNB m128 xmm
func PSIGNB(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PSIGNB",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"SSSE3"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PSIGNB",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"SSSE3"},
}, nil
}
return nil, errors.New("PSIGNB: bad operands")
}
// PSIGND: Packed Sign of Doubleword Integers.
//
// Forms:
//
// PSIGND xmm xmm
// PSIGND m128 xmm
func PSIGND(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PSIGND",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"SSSE3"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PSIGND",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"SSSE3"},
}, nil
}
return nil, errors.New("PSIGND: bad operands")
}
// PSIGNW: Packed Sign of Word Integers.
//
// Forms:
//
// PSIGNW xmm xmm
// PSIGNW m128 xmm
func PSIGNW(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PSIGNW",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"SSSE3"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PSIGNW",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"SSSE3"},
}, nil
}
return nil, errors.New("PSIGNW: bad operands")
}
// PSLLDQ: Shift Packed Double Quadword Left Logical.
//
// Forms:
//
// PSLLDQ imm8 xmm
func PSLLDQ(i, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(i) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PSLLDQ",
Operands: []operand.Op{i, x},
Inputs: []operand.Op{x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("PSLLDQ: bad operands")
}
// PSLLL: Shift Packed Doubleword Data Left Logical.
//
// Forms:
//
// PSLLL imm8 xmm
// PSLLL xmm xmm
// PSLLL m128 xmm
func PSLLL(imx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(imx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PSLLL",
Operands: []operand.Op{imx, x},
Inputs: []operand.Op{x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
case operand.IsXMM(imx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PSLLL",
Operands: []operand.Op{imx, x},
Inputs: []operand.Op{imx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
case operand.IsM128(imx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PSLLL",
Operands: []operand.Op{imx, x},
Inputs: []operand.Op{imx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("PSLLL: bad operands")
}
// PSLLO: Shift Packed Double Quadword Left Logical.
//
// Forms:
//
// PSLLO imm8 xmm
func PSLLO(i, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(i) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PSLLO",
Operands: []operand.Op{i, x},
Inputs: []operand.Op{x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("PSLLO: bad operands")
}
// PSLLQ: Shift Packed Quadword Data Left Logical.
//
// Forms:
//
// PSLLQ imm8 xmm
// PSLLQ xmm xmm
// PSLLQ m128 xmm
func PSLLQ(imx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(imx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PSLLQ",
Operands: []operand.Op{imx, x},
Inputs: []operand.Op{x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
case operand.IsXMM(imx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PSLLQ",
Operands: []operand.Op{imx, x},
Inputs: []operand.Op{imx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
case operand.IsM128(imx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PSLLQ",
Operands: []operand.Op{imx, x},
Inputs: []operand.Op{imx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("PSLLQ: bad operands")
}
// PSLLW: Shift Packed Word Data Left Logical.
//
// Forms:
//
// PSLLW imm8 xmm
// PSLLW xmm xmm
// PSLLW m128 xmm
func PSLLW(imx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(imx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PSLLW",
Operands: []operand.Op{imx, x},
Inputs: []operand.Op{x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
case operand.IsXMM(imx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PSLLW",
Operands: []operand.Op{imx, x},
Inputs: []operand.Op{imx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
case operand.IsM128(imx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PSLLW",
Operands: []operand.Op{imx, x},
Inputs: []operand.Op{imx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("PSLLW: bad operands")
}
// PSRAL: Shift Packed Doubleword Data Right Arithmetic.
//
// Forms:
//
// PSRAL imm8 xmm
// PSRAL xmm xmm
// PSRAL m128 xmm
func PSRAL(imx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(imx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PSRAL",
Operands: []operand.Op{imx, x},
Inputs: []operand.Op{x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
case operand.IsXMM(imx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PSRAL",
Operands: []operand.Op{imx, x},
Inputs: []operand.Op{imx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
case operand.IsM128(imx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PSRAL",
Operands: []operand.Op{imx, x},
Inputs: []operand.Op{imx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("PSRAL: bad operands")
}
// PSRAW: Shift Packed Word Data Right Arithmetic.
//
// Forms:
//
// PSRAW imm8 xmm
// PSRAW xmm xmm
// PSRAW m128 xmm
func PSRAW(imx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(imx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PSRAW",
Operands: []operand.Op{imx, x},
Inputs: []operand.Op{x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
case operand.IsXMM(imx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PSRAW",
Operands: []operand.Op{imx, x},
Inputs: []operand.Op{imx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
case operand.IsM128(imx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PSRAW",
Operands: []operand.Op{imx, x},
Inputs: []operand.Op{imx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("PSRAW: bad operands")
}
// PSRLDQ: Shift Packed Double Quadword Right Logical.
//
// Forms:
//
// PSRLDQ imm8 xmm
func PSRLDQ(i, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(i) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PSRLDQ",
Operands: []operand.Op{i, x},
Inputs: []operand.Op{x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("PSRLDQ: bad operands")
}
// PSRLL: Shift Packed Doubleword Data Right Logical.
//
// Forms:
//
// PSRLL imm8 xmm
// PSRLL xmm xmm
// PSRLL m128 xmm
func PSRLL(imx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(imx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PSRLL",
Operands: []operand.Op{imx, x},
Inputs: []operand.Op{x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
case operand.IsXMM(imx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PSRLL",
Operands: []operand.Op{imx, x},
Inputs: []operand.Op{imx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
case operand.IsM128(imx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PSRLL",
Operands: []operand.Op{imx, x},
Inputs: []operand.Op{imx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("PSRLL: bad operands")
}
// PSRLO: Shift Packed Double Quadword Right Logical.
//
// Forms:
//
// PSRLO imm8 xmm
func PSRLO(i, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(i) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PSRLO",
Operands: []operand.Op{i, x},
Inputs: []operand.Op{x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("PSRLO: bad operands")
}
// PSRLQ: Shift Packed Quadword Data Right Logical.
//
// Forms:
//
// PSRLQ imm8 xmm
// PSRLQ xmm xmm
// PSRLQ m128 xmm
func PSRLQ(imx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(imx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PSRLQ",
Operands: []operand.Op{imx, x},
Inputs: []operand.Op{x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
case operand.IsXMM(imx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PSRLQ",
Operands: []operand.Op{imx, x},
Inputs: []operand.Op{imx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
case operand.IsM128(imx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PSRLQ",
Operands: []operand.Op{imx, x},
Inputs: []operand.Op{imx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("PSRLQ: bad operands")
}
// PSRLW: Shift Packed Word Data Right Logical.
//
// Forms:
//
// PSRLW imm8 xmm
// PSRLW xmm xmm
// PSRLW m128 xmm
func PSRLW(imx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(imx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PSRLW",
Operands: []operand.Op{imx, x},
Inputs: []operand.Op{x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
case operand.IsXMM(imx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PSRLW",
Operands: []operand.Op{imx, x},
Inputs: []operand.Op{imx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
case operand.IsM128(imx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PSRLW",
Operands: []operand.Op{imx, x},
Inputs: []operand.Op{imx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("PSRLW: bad operands")
}
// PSUBB: Subtract Packed Byte Integers.
//
// Forms:
//
// PSUBB xmm xmm
// PSUBB m128 xmm
func PSUBB(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PSUBB",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
CancellingInputs: true,
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PSUBB",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("PSUBB: bad operands")
}
// PSUBL: Subtract Packed Doubleword Integers.
//
// Forms:
//
// PSUBL xmm xmm
// PSUBL m128 xmm
func PSUBL(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PSUBL",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
CancellingInputs: true,
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PSUBL",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("PSUBL: bad operands")
}
// PSUBQ: Subtract Packed Quadword Integers.
//
// Forms:
//
// PSUBQ xmm xmm
// PSUBQ m128 xmm
func PSUBQ(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PSUBQ",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
CancellingInputs: true,
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PSUBQ",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("PSUBQ: bad operands")
}
// PSUBSB: Subtract Packed Signed Byte Integers with Signed Saturation.
//
// Forms:
//
// PSUBSB xmm xmm
// PSUBSB m128 xmm
func PSUBSB(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PSUBSB",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
CancellingInputs: true,
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PSUBSB",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("PSUBSB: bad operands")
}
// PSUBSW: Subtract Packed Signed Word Integers with Signed Saturation.
//
// Forms:
//
// PSUBSW xmm xmm
// PSUBSW m128 xmm
func PSUBSW(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PSUBSW",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
CancellingInputs: true,
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PSUBSW",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("PSUBSW: bad operands")
}
// PSUBUSB: Subtract Packed Unsigned Byte Integers with Unsigned Saturation.
//
// Forms:
//
// PSUBUSB xmm xmm
// PSUBUSB m128 xmm
func PSUBUSB(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PSUBUSB",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
CancellingInputs: true,
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PSUBUSB",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("PSUBUSB: bad operands")
}
// PSUBUSW: Subtract Packed Unsigned Word Integers with Unsigned Saturation.
//
// Forms:
//
// PSUBUSW xmm xmm
// PSUBUSW m128 xmm
func PSUBUSW(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PSUBUSW",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
CancellingInputs: true,
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PSUBUSW",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("PSUBUSW: bad operands")
}
// PSUBW: Subtract Packed Word Integers.
//
// Forms:
//
// PSUBW xmm xmm
// PSUBW m128 xmm
func PSUBW(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PSUBW",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
CancellingInputs: true,
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PSUBW",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("PSUBW: bad operands")
}
// PTEST: Packed Logical Compare.
//
// Forms:
//
// PTEST xmm xmm
// PTEST m128 xmm
func PTEST(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PTEST",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{},
ISA: []string{"SSE4.1"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PTEST",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{},
ISA: []string{"SSE4.1"},
}, nil
}
return nil, errors.New("PTEST: bad operands")
}
// PUNPCKHBW: Unpack and Interleave High-Order Bytes into Words.
//
// Forms:
//
// PUNPCKHBW xmm xmm
// PUNPCKHBW m128 xmm
func PUNPCKHBW(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PUNPCKHBW",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PUNPCKHBW",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("PUNPCKHBW: bad operands")
}
// PUNPCKHLQ: Unpack and Interleave High-Order Doublewords into Quadwords.
//
// Forms:
//
// PUNPCKHLQ xmm xmm
// PUNPCKHLQ m128 xmm
func PUNPCKHLQ(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PUNPCKHLQ",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PUNPCKHLQ",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("PUNPCKHLQ: bad operands")
}
// PUNPCKHQDQ: Unpack and Interleave High-Order Quadwords into Double Quadwords.
//
// Forms:
//
// PUNPCKHQDQ xmm xmm
// PUNPCKHQDQ m128 xmm
func PUNPCKHQDQ(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PUNPCKHQDQ",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PUNPCKHQDQ",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("PUNPCKHQDQ: bad operands")
}
// PUNPCKHWL: Unpack and Interleave High-Order Words into Doublewords.
//
// Forms:
//
// PUNPCKHWL xmm xmm
// PUNPCKHWL m128 xmm
func PUNPCKHWL(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PUNPCKHWL",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PUNPCKHWL",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("PUNPCKHWL: bad operands")
}
// PUNPCKLBW: Unpack and Interleave Low-Order Bytes into Words.
//
// Forms:
//
// PUNPCKLBW xmm xmm
// PUNPCKLBW m128 xmm
func PUNPCKLBW(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PUNPCKLBW",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PUNPCKLBW",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("PUNPCKLBW: bad operands")
}
// PUNPCKLLQ: Unpack and Interleave Low-Order Doublewords into Quadwords.
//
// Forms:
//
// PUNPCKLLQ xmm xmm
// PUNPCKLLQ m128 xmm
func PUNPCKLLQ(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PUNPCKLLQ",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PUNPCKLLQ",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("PUNPCKLLQ: bad operands")
}
// PUNPCKLQDQ: Unpack and Interleave Low-Order Quadwords into Double Quadwords.
//
// Forms:
//
// PUNPCKLQDQ xmm xmm
// PUNPCKLQDQ m128 xmm
func PUNPCKLQDQ(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PUNPCKLQDQ",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PUNPCKLQDQ",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("PUNPCKLQDQ: bad operands")
}
// PUNPCKLWL: Unpack and Interleave Low-Order Words into Doublewords.
//
// Forms:
//
// PUNPCKLWL xmm xmm
// PUNPCKLWL m128 xmm
func PUNPCKLWL(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PUNPCKLWL",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PUNPCKLWL",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("PUNPCKLWL: bad operands")
}
// PUSHQ: Push Value Onto the Stack.
//
// Forms:
//
// PUSHQ imm8
// PUSHQ imm32
// PUSHQ r64
// PUSHQ m64
func PUSHQ(imr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(imr):
return &intrep.Instruction{
Opcode: "PUSHQ",
Operands: []operand.Op{imr},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
}, nil
case operand.IsIMM32(imr):
return &intrep.Instruction{
Opcode: "PUSHQ",
Operands: []operand.Op{imr},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
}, nil
case operand.IsR64(imr):
return &intrep.Instruction{
Opcode: "PUSHQ",
Operands: []operand.Op{imr},
Inputs: []operand.Op{imr},
Outputs: []operand.Op{},
}, nil
case operand.IsM64(imr):
return &intrep.Instruction{
Opcode: "PUSHQ",
Operands: []operand.Op{imr},
Inputs: []operand.Op{imr},
Outputs: []operand.Op{},
}, nil
}
return nil, errors.New("PUSHQ: bad operands")
}
// PUSHW: Push Value Onto the Stack.
//
// Forms:
//
// PUSHW r16
// PUSHW m16
func PUSHW(mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR16(mr):
return &intrep.Instruction{
Opcode: "PUSHW",
Operands: []operand.Op{mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{},
}, nil
case operand.IsM16(mr):
return &intrep.Instruction{
Opcode: "PUSHW",
Operands: []operand.Op{mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{},
}, nil
}
return nil, errors.New("PUSHW: bad operands")
}
// PXOR: Packed Bitwise Logical Exclusive OR.
//
// Forms:
//
// PXOR xmm xmm
// PXOR m128 xmm
func PXOR(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PXOR",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
CancellingInputs: true,
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "PXOR",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("PXOR: bad operands")
}
// RCLB: Rotate Left through Carry Flag.
//
// Forms:
//
// RCLB 1 r8
// RCLB imm8 r8
// RCLB cl r8
// RCLB 1 m8
// RCLB imm8 m8
// RCLB cl m8
func RCLB(ci, mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.Is1(ci) && operand.IsR8(mr):
return &intrep.Instruction{
Opcode: "RCLB",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsIMM8(ci) && operand.IsR8(mr):
return &intrep.Instruction{
Opcode: "RCLB",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsCL(ci) && operand.IsR8(mr):
return &intrep.Instruction{
Opcode: "RCLB",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{ci, mr},
Outputs: []operand.Op{mr},
}, nil
case operand.Is1(ci) && operand.IsM8(mr):
return &intrep.Instruction{
Opcode: "RCLB",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsIMM8(ci) && operand.IsM8(mr):
return &intrep.Instruction{
Opcode: "RCLB",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsCL(ci) && operand.IsM8(mr):
return &intrep.Instruction{
Opcode: "RCLB",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{ci, mr},
Outputs: []operand.Op{mr},
}, nil
}
return nil, errors.New("RCLB: bad operands")
}
// RCLL: Rotate Left through Carry Flag.
//
// Forms:
//
// RCLL 1 r32
// RCLL imm8 r32
// RCLL cl r32
// RCLL 1 m32
// RCLL imm8 m32
// RCLL cl m32
func RCLL(ci, mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.Is1(ci) && operand.IsR32(mr):
return &intrep.Instruction{
Opcode: "RCLL",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsIMM8(ci) && operand.IsR32(mr):
return &intrep.Instruction{
Opcode: "RCLL",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsCL(ci) && operand.IsR32(mr):
return &intrep.Instruction{
Opcode: "RCLL",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{ci, mr},
Outputs: []operand.Op{mr},
}, nil
case operand.Is1(ci) && operand.IsM32(mr):
return &intrep.Instruction{
Opcode: "RCLL",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsIMM8(ci) && operand.IsM32(mr):
return &intrep.Instruction{
Opcode: "RCLL",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsCL(ci) && operand.IsM32(mr):
return &intrep.Instruction{
Opcode: "RCLL",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{ci, mr},
Outputs: []operand.Op{mr},
}, nil
}
return nil, errors.New("RCLL: bad operands")
}
// RCLQ: Rotate Left through Carry Flag.
//
// Forms:
//
// RCLQ 1 r64
// RCLQ imm8 r64
// RCLQ cl r64
// RCLQ 1 m64
// RCLQ imm8 m64
// RCLQ cl m64
func RCLQ(ci, mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.Is1(ci) && operand.IsR64(mr):
return &intrep.Instruction{
Opcode: "RCLQ",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsIMM8(ci) && operand.IsR64(mr):
return &intrep.Instruction{
Opcode: "RCLQ",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsCL(ci) && operand.IsR64(mr):
return &intrep.Instruction{
Opcode: "RCLQ",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{ci, mr},
Outputs: []operand.Op{mr},
}, nil
case operand.Is1(ci) && operand.IsM64(mr):
return &intrep.Instruction{
Opcode: "RCLQ",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsIMM8(ci) && operand.IsM64(mr):
return &intrep.Instruction{
Opcode: "RCLQ",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsCL(ci) && operand.IsM64(mr):
return &intrep.Instruction{
Opcode: "RCLQ",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{ci, mr},
Outputs: []operand.Op{mr},
}, nil
}
return nil, errors.New("RCLQ: bad operands")
}
// RCLW: Rotate Left through Carry Flag.
//
// Forms:
//
// RCLW 1 r16
// RCLW imm8 r16
// RCLW cl r16
// RCLW 1 m16
// RCLW imm8 m16
// RCLW cl m16
func RCLW(ci, mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.Is1(ci) && operand.IsR16(mr):
return &intrep.Instruction{
Opcode: "RCLW",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsIMM8(ci) && operand.IsR16(mr):
return &intrep.Instruction{
Opcode: "RCLW",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsCL(ci) && operand.IsR16(mr):
return &intrep.Instruction{
Opcode: "RCLW",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{ci, mr},
Outputs: []operand.Op{mr},
}, nil
case operand.Is1(ci) && operand.IsM16(mr):
return &intrep.Instruction{
Opcode: "RCLW",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsIMM8(ci) && operand.IsM16(mr):
return &intrep.Instruction{
Opcode: "RCLW",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsCL(ci) && operand.IsM16(mr):
return &intrep.Instruction{
Opcode: "RCLW",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{ci, mr},
Outputs: []operand.Op{mr},
}, nil
}
return nil, errors.New("RCLW: bad operands")
}
// RCPPS: Compute Approximate Reciprocals of Packed Single-Precision Floating-Point Values.
//
// Forms:
//
// RCPPS xmm xmm
// RCPPS m128 xmm
func RCPPS(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "RCPPS",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"SSE"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "RCPPS",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"SSE"},
}, nil
}
return nil, errors.New("RCPPS: bad operands")
}
// RCPSS: Compute Approximate Reciprocal of Scalar Single-Precision Floating-Point Values.
//
// Forms:
//
// RCPSS xmm xmm
// RCPSS m32 xmm
func RCPSS(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "RCPSS",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE"},
}, nil
case operand.IsM32(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "RCPSS",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE"},
}, nil
}
return nil, errors.New("RCPSS: bad operands")
}
// RCRB: Rotate Right through Carry Flag.
//
// Forms:
//
// RCRB 1 r8
// RCRB imm8 r8
// RCRB cl r8
// RCRB 1 m8
// RCRB imm8 m8
// RCRB cl m8
func RCRB(ci, mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.Is1(ci) && operand.IsR8(mr):
return &intrep.Instruction{
Opcode: "RCRB",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsIMM8(ci) && operand.IsR8(mr):
return &intrep.Instruction{
Opcode: "RCRB",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsCL(ci) && operand.IsR8(mr):
return &intrep.Instruction{
Opcode: "RCRB",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{ci, mr},
Outputs: []operand.Op{mr},
}, nil
case operand.Is1(ci) && operand.IsM8(mr):
return &intrep.Instruction{
Opcode: "RCRB",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsIMM8(ci) && operand.IsM8(mr):
return &intrep.Instruction{
Opcode: "RCRB",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsCL(ci) && operand.IsM8(mr):
return &intrep.Instruction{
Opcode: "RCRB",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{ci, mr},
Outputs: []operand.Op{mr},
}, nil
}
return nil, errors.New("RCRB: bad operands")
}
// RCRL: Rotate Right through Carry Flag.
//
// Forms:
//
// RCRL 1 r32
// RCRL imm8 r32
// RCRL cl r32
// RCRL 1 m32
// RCRL imm8 m32
// RCRL cl m32
func RCRL(ci, mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.Is1(ci) && operand.IsR32(mr):
return &intrep.Instruction{
Opcode: "RCRL",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsIMM8(ci) && operand.IsR32(mr):
return &intrep.Instruction{
Opcode: "RCRL",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsCL(ci) && operand.IsR32(mr):
return &intrep.Instruction{
Opcode: "RCRL",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{ci, mr},
Outputs: []operand.Op{mr},
}, nil
case operand.Is1(ci) && operand.IsM32(mr):
return &intrep.Instruction{
Opcode: "RCRL",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsIMM8(ci) && operand.IsM32(mr):
return &intrep.Instruction{
Opcode: "RCRL",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsCL(ci) && operand.IsM32(mr):
return &intrep.Instruction{
Opcode: "RCRL",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{ci, mr},
Outputs: []operand.Op{mr},
}, nil
}
return nil, errors.New("RCRL: bad operands")
}
// RCRQ: Rotate Right through Carry Flag.
//
// Forms:
//
// RCRQ 1 r64
// RCRQ imm8 r64
// RCRQ cl r64
// RCRQ 1 m64
// RCRQ imm8 m64
// RCRQ cl m64
func RCRQ(ci, mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.Is1(ci) && operand.IsR64(mr):
return &intrep.Instruction{
Opcode: "RCRQ",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsIMM8(ci) && operand.IsR64(mr):
return &intrep.Instruction{
Opcode: "RCRQ",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsCL(ci) && operand.IsR64(mr):
return &intrep.Instruction{
Opcode: "RCRQ",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{ci, mr},
Outputs: []operand.Op{mr},
}, nil
case operand.Is1(ci) && operand.IsM64(mr):
return &intrep.Instruction{
Opcode: "RCRQ",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsIMM8(ci) && operand.IsM64(mr):
return &intrep.Instruction{
Opcode: "RCRQ",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsCL(ci) && operand.IsM64(mr):
return &intrep.Instruction{
Opcode: "RCRQ",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{ci, mr},
Outputs: []operand.Op{mr},
}, nil
}
return nil, errors.New("RCRQ: bad operands")
}
// RCRW: Rotate Right through Carry Flag.
//
// Forms:
//
// RCRW 1 r16
// RCRW imm8 r16
// RCRW cl r16
// RCRW 1 m16
// RCRW imm8 m16
// RCRW cl m16
func RCRW(ci, mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.Is1(ci) && operand.IsR16(mr):
return &intrep.Instruction{
Opcode: "RCRW",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsIMM8(ci) && operand.IsR16(mr):
return &intrep.Instruction{
Opcode: "RCRW",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsCL(ci) && operand.IsR16(mr):
return &intrep.Instruction{
Opcode: "RCRW",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{ci, mr},
Outputs: []operand.Op{mr},
}, nil
case operand.Is1(ci) && operand.IsM16(mr):
return &intrep.Instruction{
Opcode: "RCRW",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsIMM8(ci) && operand.IsM16(mr):
return &intrep.Instruction{
Opcode: "RCRW",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsCL(ci) && operand.IsM16(mr):
return &intrep.Instruction{
Opcode: "RCRW",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{ci, mr},
Outputs: []operand.Op{mr},
}, nil
}
return nil, errors.New("RCRW: bad operands")
}
// RDRANDL: Read Random Number.
//
// Forms:
//
// RDRANDL r32
func RDRANDL(r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR32(r):
return &intrep.Instruction{
Opcode: "RDRANDL",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{r},
ISA: []string{"RDRAND"},
}, nil
}
return nil, errors.New("RDRANDL: bad operands")
}
// RDRANDQ: Read Random Number.
//
// Forms:
//
// RDRANDQ r64
func RDRANDQ(r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR64(r):
return &intrep.Instruction{
Opcode: "RDRANDQ",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{r},
ISA: []string{"RDRAND"},
}, nil
}
return nil, errors.New("RDRANDQ: bad operands")
}
// RDRANDW: Read Random Number.
//
// Forms:
//
// RDRANDW r16
func RDRANDW(r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR16(r):
return &intrep.Instruction{
Opcode: "RDRANDW",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{r},
ISA: []string{"RDRAND"},
}, nil
}
return nil, errors.New("RDRANDW: bad operands")
}
// RDSEEDL: Read Random SEED.
//
// Forms:
//
// RDSEEDL r32
func RDSEEDL(r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR32(r):
return &intrep.Instruction{
Opcode: "RDSEEDL",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{r},
ISA: []string{"RDSEED"},
}, nil
}
return nil, errors.New("RDSEEDL: bad operands")
}
// RDSEEDQ: Read Random SEED.
//
// Forms:
//
// RDSEEDQ r64
func RDSEEDQ(r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR64(r):
return &intrep.Instruction{
Opcode: "RDSEEDQ",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{r},
ISA: []string{"RDSEED"},
}, nil
}
return nil, errors.New("RDSEEDQ: bad operands")
}
// RDSEEDW: Read Random SEED.
//
// Forms:
//
// RDSEEDW r16
func RDSEEDW(r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR16(r):
return &intrep.Instruction{
Opcode: "RDSEEDW",
Operands: []operand.Op{r},
Inputs: []operand.Op{},
Outputs: []operand.Op{r},
ISA: []string{"RDSEED"},
}, nil
}
return nil, errors.New("RDSEEDW: bad operands")
}
// RDTSC: Read Time-Stamp Counter.
//
// Forms:
//
// RDTSC
func RDTSC() (*intrep.Instruction, error) {
return &intrep.Instruction{
Opcode: "RDTSC",
Operands: nil,
Inputs: []operand.Op{},
Outputs: []operand.Op{reg.EAX, reg.EDX},
ISA: []string{"RDTSC"},
}, nil
}
// RDTSCP: Read Time-Stamp Counter and Processor ID.
//
// Forms:
//
// RDTSCP
func RDTSCP() (*intrep.Instruction, error) {
return &intrep.Instruction{
Opcode: "RDTSCP",
Operands: nil,
Inputs: []operand.Op{},
Outputs: []operand.Op{reg.EAX, reg.ECX, reg.EDX},
ISA: []string{"RDTSCP"},
}, nil
}
// RET: Return from Procedure.
//
// Forms:
//
// RET
func RET() (*intrep.Instruction, error) {
return &intrep.Instruction{
Opcode: "RET",
Operands: nil,
Inputs: []operand.Op{},
Outputs: []operand.Op{},
IsTerminal: true,
}, nil
}
// RETFL: Return from Procedure.
//
// Forms:
//
// RETFL imm16
func RETFL(i operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM16(i):
return &intrep.Instruction{
Opcode: "RETFL",
Operands: []operand.Op{i},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
}, nil
}
return nil, errors.New("RETFL: bad operands")
}
// RETFQ: Return from Procedure.
//
// Forms:
//
// RETFQ imm16
func RETFQ(i operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM16(i):
return &intrep.Instruction{
Opcode: "RETFQ",
Operands: []operand.Op{i},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
}, nil
}
return nil, errors.New("RETFQ: bad operands")
}
// RETFW: Return from Procedure.
//
// Forms:
//
// RETFW imm16
func RETFW(i operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM16(i):
return &intrep.Instruction{
Opcode: "RETFW",
Operands: []operand.Op{i},
Inputs: []operand.Op{},
Outputs: []operand.Op{},
}, nil
}
return nil, errors.New("RETFW: bad operands")
}
// ROLB: Rotate Left.
//
// Forms:
//
// ROLB 1 r8
// ROLB imm8 r8
// ROLB cl r8
// ROLB 1 m8
// ROLB imm8 m8
// ROLB cl m8
func ROLB(ci, mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.Is1(ci) && operand.IsR8(mr):
return &intrep.Instruction{
Opcode: "ROLB",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsIMM8(ci) && operand.IsR8(mr):
return &intrep.Instruction{
Opcode: "ROLB",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsCL(ci) && operand.IsR8(mr):
return &intrep.Instruction{
Opcode: "ROLB",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{ci, mr},
Outputs: []operand.Op{mr},
}, nil
case operand.Is1(ci) && operand.IsM8(mr):
return &intrep.Instruction{
Opcode: "ROLB",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsIMM8(ci) && operand.IsM8(mr):
return &intrep.Instruction{
Opcode: "ROLB",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsCL(ci) && operand.IsM8(mr):
return &intrep.Instruction{
Opcode: "ROLB",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{ci, mr},
Outputs: []operand.Op{mr},
}, nil
}
return nil, errors.New("ROLB: bad operands")
}
// ROLL: Rotate Left.
//
// Forms:
//
// ROLL 1 r32
// ROLL imm8 r32
// ROLL cl r32
// ROLL 1 m32
// ROLL imm8 m32
// ROLL cl m32
func ROLL(ci, mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.Is1(ci) && operand.IsR32(mr):
return &intrep.Instruction{
Opcode: "ROLL",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsIMM8(ci) && operand.IsR32(mr):
return &intrep.Instruction{
Opcode: "ROLL",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsCL(ci) && operand.IsR32(mr):
return &intrep.Instruction{
Opcode: "ROLL",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{ci, mr},
Outputs: []operand.Op{mr},
}, nil
case operand.Is1(ci) && operand.IsM32(mr):
return &intrep.Instruction{
Opcode: "ROLL",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsIMM8(ci) && operand.IsM32(mr):
return &intrep.Instruction{
Opcode: "ROLL",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsCL(ci) && operand.IsM32(mr):
return &intrep.Instruction{
Opcode: "ROLL",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{ci, mr},
Outputs: []operand.Op{mr},
}, nil
}
return nil, errors.New("ROLL: bad operands")
}
// ROLQ: Rotate Left.
//
// Forms:
//
// ROLQ 1 r64
// ROLQ imm8 r64
// ROLQ cl r64
// ROLQ 1 m64
// ROLQ imm8 m64
// ROLQ cl m64
func ROLQ(ci, mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.Is1(ci) && operand.IsR64(mr):
return &intrep.Instruction{
Opcode: "ROLQ",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsIMM8(ci) && operand.IsR64(mr):
return &intrep.Instruction{
Opcode: "ROLQ",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsCL(ci) && operand.IsR64(mr):
return &intrep.Instruction{
Opcode: "ROLQ",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{ci, mr},
Outputs: []operand.Op{mr},
}, nil
case operand.Is1(ci) && operand.IsM64(mr):
return &intrep.Instruction{
Opcode: "ROLQ",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsIMM8(ci) && operand.IsM64(mr):
return &intrep.Instruction{
Opcode: "ROLQ",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsCL(ci) && operand.IsM64(mr):
return &intrep.Instruction{
Opcode: "ROLQ",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{ci, mr},
Outputs: []operand.Op{mr},
}, nil
}
return nil, errors.New("ROLQ: bad operands")
}
// ROLW: Rotate Left.
//
// Forms:
//
// ROLW 1 r16
// ROLW imm8 r16
// ROLW cl r16
// ROLW 1 m16
// ROLW imm8 m16
// ROLW cl m16
func ROLW(ci, mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.Is1(ci) && operand.IsR16(mr):
return &intrep.Instruction{
Opcode: "ROLW",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsIMM8(ci) && operand.IsR16(mr):
return &intrep.Instruction{
Opcode: "ROLW",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsCL(ci) && operand.IsR16(mr):
return &intrep.Instruction{
Opcode: "ROLW",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{ci, mr},
Outputs: []operand.Op{mr},
}, nil
case operand.Is1(ci) && operand.IsM16(mr):
return &intrep.Instruction{
Opcode: "ROLW",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsIMM8(ci) && operand.IsM16(mr):
return &intrep.Instruction{
Opcode: "ROLW",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsCL(ci) && operand.IsM16(mr):
return &intrep.Instruction{
Opcode: "ROLW",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{ci, mr},
Outputs: []operand.Op{mr},
}, nil
}
return nil, errors.New("ROLW: bad operands")
}
// RORB: Rotate Right.
//
// Forms:
//
// RORB 1 r8
// RORB imm8 r8
// RORB cl r8
// RORB 1 m8
// RORB imm8 m8
// RORB cl m8
func RORB(ci, mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.Is1(ci) && operand.IsR8(mr):
return &intrep.Instruction{
Opcode: "RORB",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsIMM8(ci) && operand.IsR8(mr):
return &intrep.Instruction{
Opcode: "RORB",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsCL(ci) && operand.IsR8(mr):
return &intrep.Instruction{
Opcode: "RORB",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{ci, mr},
Outputs: []operand.Op{mr},
}, nil
case operand.Is1(ci) && operand.IsM8(mr):
return &intrep.Instruction{
Opcode: "RORB",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsIMM8(ci) && operand.IsM8(mr):
return &intrep.Instruction{
Opcode: "RORB",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsCL(ci) && operand.IsM8(mr):
return &intrep.Instruction{
Opcode: "RORB",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{ci, mr},
Outputs: []operand.Op{mr},
}, nil
}
return nil, errors.New("RORB: bad operands")
}
// RORL: Rotate Right.
//
// Forms:
//
// RORL 1 r32
// RORL imm8 r32
// RORL cl r32
// RORL 1 m32
// RORL imm8 m32
// RORL cl m32
func RORL(ci, mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.Is1(ci) && operand.IsR32(mr):
return &intrep.Instruction{
Opcode: "RORL",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsIMM8(ci) && operand.IsR32(mr):
return &intrep.Instruction{
Opcode: "RORL",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsCL(ci) && operand.IsR32(mr):
return &intrep.Instruction{
Opcode: "RORL",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{ci, mr},
Outputs: []operand.Op{mr},
}, nil
case operand.Is1(ci) && operand.IsM32(mr):
return &intrep.Instruction{
Opcode: "RORL",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsIMM8(ci) && operand.IsM32(mr):
return &intrep.Instruction{
Opcode: "RORL",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsCL(ci) && operand.IsM32(mr):
return &intrep.Instruction{
Opcode: "RORL",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{ci, mr},
Outputs: []operand.Op{mr},
}, nil
}
return nil, errors.New("RORL: bad operands")
}
// RORQ: Rotate Right.
//
// Forms:
//
// RORQ 1 r64
// RORQ imm8 r64
// RORQ cl r64
// RORQ 1 m64
// RORQ imm8 m64
// RORQ cl m64
func RORQ(ci, mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.Is1(ci) && operand.IsR64(mr):
return &intrep.Instruction{
Opcode: "RORQ",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsIMM8(ci) && operand.IsR64(mr):
return &intrep.Instruction{
Opcode: "RORQ",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsCL(ci) && operand.IsR64(mr):
return &intrep.Instruction{
Opcode: "RORQ",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{ci, mr},
Outputs: []operand.Op{mr},
}, nil
case operand.Is1(ci) && operand.IsM64(mr):
return &intrep.Instruction{
Opcode: "RORQ",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsIMM8(ci) && operand.IsM64(mr):
return &intrep.Instruction{
Opcode: "RORQ",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsCL(ci) && operand.IsM64(mr):
return &intrep.Instruction{
Opcode: "RORQ",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{ci, mr},
Outputs: []operand.Op{mr},
}, nil
}
return nil, errors.New("RORQ: bad operands")
}
// RORW: Rotate Right.
//
// Forms:
//
// RORW 1 r16
// RORW imm8 r16
// RORW cl r16
// RORW 1 m16
// RORW imm8 m16
// RORW cl m16
func RORW(ci, mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.Is1(ci) && operand.IsR16(mr):
return &intrep.Instruction{
Opcode: "RORW",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsIMM8(ci) && operand.IsR16(mr):
return &intrep.Instruction{
Opcode: "RORW",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsCL(ci) && operand.IsR16(mr):
return &intrep.Instruction{
Opcode: "RORW",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{ci, mr},
Outputs: []operand.Op{mr},
}, nil
case operand.Is1(ci) && operand.IsM16(mr):
return &intrep.Instruction{
Opcode: "RORW",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsIMM8(ci) && operand.IsM16(mr):
return &intrep.Instruction{
Opcode: "RORW",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsCL(ci) && operand.IsM16(mr):
return &intrep.Instruction{
Opcode: "RORW",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{ci, mr},
Outputs: []operand.Op{mr},
}, nil
}
return nil, errors.New("RORW: bad operands")
}
// RORXL: Rotate Right Logical Without Affecting Flags.
//
// Forms:
//
// RORXL imm8 r32 r32
// RORXL imm8 m32 r32
func RORXL(i, mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(i) && operand.IsR32(mr) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "RORXL",
Operands: []operand.Op{i, mr, r},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{r},
ISA: []string{"BMI2"},
}, nil
case operand.IsIMM8(i) && operand.IsM32(mr) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "RORXL",
Operands: []operand.Op{i, mr, r},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{r},
ISA: []string{"BMI2"},
}, nil
}
return nil, errors.New("RORXL: bad operands")
}
// RORXQ: Rotate Right Logical Without Affecting Flags.
//
// Forms:
//
// RORXQ imm8 r64 r64
// RORXQ imm8 m64 r64
func RORXQ(i, mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(i) && operand.IsR64(mr) && operand.IsR64(r):
return &intrep.Instruction{
Opcode: "RORXQ",
Operands: []operand.Op{i, mr, r},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{r},
ISA: []string{"BMI2"},
}, nil
case operand.IsIMM8(i) && operand.IsM64(mr) && operand.IsR64(r):
return &intrep.Instruction{
Opcode: "RORXQ",
Operands: []operand.Op{i, mr, r},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{r},
ISA: []string{"BMI2"},
}, nil
}
return nil, errors.New("RORXQ: bad operands")
}
// ROUNDPD: Round Packed Double Precision Floating-Point Values.
//
// Forms:
//
// ROUNDPD imm8 xmm xmm
// ROUNDPD imm8 m128 xmm
func ROUNDPD(i, mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(i) && operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "ROUNDPD",
Operands: []operand.Op{i, mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"SSE4.1"},
}, nil
case operand.IsIMM8(i) && operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "ROUNDPD",
Operands: []operand.Op{i, mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"SSE4.1"},
}, nil
}
return nil, errors.New("ROUNDPD: bad operands")
}
// ROUNDPS: Round Packed Single Precision Floating-Point Values.
//
// Forms:
//
// ROUNDPS imm8 xmm xmm
// ROUNDPS imm8 m128 xmm
func ROUNDPS(i, mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(i) && operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "ROUNDPS",
Operands: []operand.Op{i, mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"SSE4.1"},
}, nil
case operand.IsIMM8(i) && operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "ROUNDPS",
Operands: []operand.Op{i, mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"SSE4.1"},
}, nil
}
return nil, errors.New("ROUNDPS: bad operands")
}
// ROUNDSD: Round Scalar Double Precision Floating-Point Values.
//
// Forms:
//
// ROUNDSD imm8 xmm xmm
// ROUNDSD imm8 m64 xmm
func ROUNDSD(i, mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(i) && operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "ROUNDSD",
Operands: []operand.Op{i, mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE4.1"},
}, nil
case operand.IsIMM8(i) && operand.IsM64(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "ROUNDSD",
Operands: []operand.Op{i, mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE4.1"},
}, nil
}
return nil, errors.New("ROUNDSD: bad operands")
}
// ROUNDSS: Round Scalar Single Precision Floating-Point Values.
//
// Forms:
//
// ROUNDSS imm8 xmm xmm
// ROUNDSS imm8 m32 xmm
func ROUNDSS(i, mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(i) && operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "ROUNDSS",
Operands: []operand.Op{i, mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE4.1"},
}, nil
case operand.IsIMM8(i) && operand.IsM32(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "ROUNDSS",
Operands: []operand.Op{i, mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE4.1"},
}, nil
}
return nil, errors.New("ROUNDSS: bad operands")
}
// RSQRTPS: Compute Reciprocals of Square Roots of Packed Single-Precision Floating-Point Values.
//
// Forms:
//
// RSQRTPS xmm xmm
// RSQRTPS m128 xmm
func RSQRTPS(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "RSQRTPS",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"SSE"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "RSQRTPS",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"SSE"},
}, nil
}
return nil, errors.New("RSQRTPS: bad operands")
}
// RSQRTSS: Compute Reciprocal of Square Root of Scalar Single-Precision Floating-Point Value.
//
// Forms:
//
// RSQRTSS xmm xmm
// RSQRTSS m32 xmm
func RSQRTSS(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "RSQRTSS",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE"},
}, nil
case operand.IsM32(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "RSQRTSS",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE"},
}, nil
}
return nil, errors.New("RSQRTSS: bad operands")
}
// SALB: Arithmetic Shift Left.
//
// Forms:
//
// SALB 1 r8
// SALB imm8 r8
// SALB cl r8
// SALB 1 m8
// SALB imm8 m8
// SALB cl m8
func SALB(ci, mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.Is1(ci) && operand.IsR8(mr):
return &intrep.Instruction{
Opcode: "SALB",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsIMM8(ci) && operand.IsR8(mr):
return &intrep.Instruction{
Opcode: "SALB",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsCL(ci) && operand.IsR8(mr):
return &intrep.Instruction{
Opcode: "SALB",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{ci, mr},
Outputs: []operand.Op{mr},
}, nil
case operand.Is1(ci) && operand.IsM8(mr):
return &intrep.Instruction{
Opcode: "SALB",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsIMM8(ci) && operand.IsM8(mr):
return &intrep.Instruction{
Opcode: "SALB",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsCL(ci) && operand.IsM8(mr):
return &intrep.Instruction{
Opcode: "SALB",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{ci, mr},
Outputs: []operand.Op{mr},
}, nil
}
return nil, errors.New("SALB: bad operands")
}
// SALL: Arithmetic Shift Left.
//
// Forms:
//
// SALL 1 r32
// SALL imm8 r32
// SALL cl r32
// SALL 1 m32
// SALL imm8 m32
// SALL cl m32
func SALL(ci, mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.Is1(ci) && operand.IsR32(mr):
return &intrep.Instruction{
Opcode: "SALL",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsIMM8(ci) && operand.IsR32(mr):
return &intrep.Instruction{
Opcode: "SALL",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsCL(ci) && operand.IsR32(mr):
return &intrep.Instruction{
Opcode: "SALL",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{ci, mr},
Outputs: []operand.Op{mr},
}, nil
case operand.Is1(ci) && operand.IsM32(mr):
return &intrep.Instruction{
Opcode: "SALL",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsIMM8(ci) && operand.IsM32(mr):
return &intrep.Instruction{
Opcode: "SALL",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsCL(ci) && operand.IsM32(mr):
return &intrep.Instruction{
Opcode: "SALL",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{ci, mr},
Outputs: []operand.Op{mr},
}, nil
}
return nil, errors.New("SALL: bad operands")
}
// SALQ: Arithmetic Shift Left.
//
// Forms:
//
// SALQ 1 r64
// SALQ imm8 r64
// SALQ cl r64
// SALQ 1 m64
// SALQ imm8 m64
// SALQ cl m64
func SALQ(ci, mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.Is1(ci) && operand.IsR64(mr):
return &intrep.Instruction{
Opcode: "SALQ",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsIMM8(ci) && operand.IsR64(mr):
return &intrep.Instruction{
Opcode: "SALQ",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsCL(ci) && operand.IsR64(mr):
return &intrep.Instruction{
Opcode: "SALQ",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{ci, mr},
Outputs: []operand.Op{mr},
}, nil
case operand.Is1(ci) && operand.IsM64(mr):
return &intrep.Instruction{
Opcode: "SALQ",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsIMM8(ci) && operand.IsM64(mr):
return &intrep.Instruction{
Opcode: "SALQ",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsCL(ci) && operand.IsM64(mr):
return &intrep.Instruction{
Opcode: "SALQ",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{ci, mr},
Outputs: []operand.Op{mr},
}, nil
}
return nil, errors.New("SALQ: bad operands")
}
// SALW: Arithmetic Shift Left.
//
// Forms:
//
// SALW 1 r16
// SALW imm8 r16
// SALW cl r16
// SALW 1 m16
// SALW imm8 m16
// SALW cl m16
func SALW(ci, mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.Is1(ci) && operand.IsR16(mr):
return &intrep.Instruction{
Opcode: "SALW",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsIMM8(ci) && operand.IsR16(mr):
return &intrep.Instruction{
Opcode: "SALW",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsCL(ci) && operand.IsR16(mr):
return &intrep.Instruction{
Opcode: "SALW",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{ci, mr},
Outputs: []operand.Op{mr},
}, nil
case operand.Is1(ci) && operand.IsM16(mr):
return &intrep.Instruction{
Opcode: "SALW",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsIMM8(ci) && operand.IsM16(mr):
return &intrep.Instruction{
Opcode: "SALW",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsCL(ci) && operand.IsM16(mr):
return &intrep.Instruction{
Opcode: "SALW",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{ci, mr},
Outputs: []operand.Op{mr},
}, nil
}
return nil, errors.New("SALW: bad operands")
}
// SARB: Arithmetic Shift Right.
//
// Forms:
//
// SARB 1 r8
// SARB imm8 r8
// SARB cl r8
// SARB 1 m8
// SARB imm8 m8
// SARB cl m8
func SARB(ci, mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.Is1(ci) && operand.IsR8(mr):
return &intrep.Instruction{
Opcode: "SARB",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsIMM8(ci) && operand.IsR8(mr):
return &intrep.Instruction{
Opcode: "SARB",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsCL(ci) && operand.IsR8(mr):
return &intrep.Instruction{
Opcode: "SARB",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{ci, mr},
Outputs: []operand.Op{mr},
}, nil
case operand.Is1(ci) && operand.IsM8(mr):
return &intrep.Instruction{
Opcode: "SARB",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsIMM8(ci) && operand.IsM8(mr):
return &intrep.Instruction{
Opcode: "SARB",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsCL(ci) && operand.IsM8(mr):
return &intrep.Instruction{
Opcode: "SARB",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{ci, mr},
Outputs: []operand.Op{mr},
}, nil
}
return nil, errors.New("SARB: bad operands")
}
// SARL: Arithmetic Shift Right.
//
// Forms:
//
// SARL 1 r32
// SARL imm8 r32
// SARL cl r32
// SARL 1 m32
// SARL imm8 m32
// SARL cl m32
func SARL(ci, mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.Is1(ci) && operand.IsR32(mr):
return &intrep.Instruction{
Opcode: "SARL",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsIMM8(ci) && operand.IsR32(mr):
return &intrep.Instruction{
Opcode: "SARL",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsCL(ci) && operand.IsR32(mr):
return &intrep.Instruction{
Opcode: "SARL",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{ci, mr},
Outputs: []operand.Op{mr},
}, nil
case operand.Is1(ci) && operand.IsM32(mr):
return &intrep.Instruction{
Opcode: "SARL",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsIMM8(ci) && operand.IsM32(mr):
return &intrep.Instruction{
Opcode: "SARL",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsCL(ci) && operand.IsM32(mr):
return &intrep.Instruction{
Opcode: "SARL",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{ci, mr},
Outputs: []operand.Op{mr},
}, nil
}
return nil, errors.New("SARL: bad operands")
}
// SARQ: Arithmetic Shift Right.
//
// Forms:
//
// SARQ 1 r64
// SARQ imm8 r64
// SARQ cl r64
// SARQ 1 m64
// SARQ imm8 m64
// SARQ cl m64
func SARQ(ci, mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.Is1(ci) && operand.IsR64(mr):
return &intrep.Instruction{
Opcode: "SARQ",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsIMM8(ci) && operand.IsR64(mr):
return &intrep.Instruction{
Opcode: "SARQ",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsCL(ci) && operand.IsR64(mr):
return &intrep.Instruction{
Opcode: "SARQ",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{ci, mr},
Outputs: []operand.Op{mr},
}, nil
case operand.Is1(ci) && operand.IsM64(mr):
return &intrep.Instruction{
Opcode: "SARQ",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsIMM8(ci) && operand.IsM64(mr):
return &intrep.Instruction{
Opcode: "SARQ",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsCL(ci) && operand.IsM64(mr):
return &intrep.Instruction{
Opcode: "SARQ",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{ci, mr},
Outputs: []operand.Op{mr},
}, nil
}
return nil, errors.New("SARQ: bad operands")
}
// SARW: Arithmetic Shift Right.
//
// Forms:
//
// SARW 1 r16
// SARW imm8 r16
// SARW cl r16
// SARW 1 m16
// SARW imm8 m16
// SARW cl m16
func SARW(ci, mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.Is1(ci) && operand.IsR16(mr):
return &intrep.Instruction{
Opcode: "SARW",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsIMM8(ci) && operand.IsR16(mr):
return &intrep.Instruction{
Opcode: "SARW",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsCL(ci) && operand.IsR16(mr):
return &intrep.Instruction{
Opcode: "SARW",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{ci, mr},
Outputs: []operand.Op{mr},
}, nil
case operand.Is1(ci) && operand.IsM16(mr):
return &intrep.Instruction{
Opcode: "SARW",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsIMM8(ci) && operand.IsM16(mr):
return &intrep.Instruction{
Opcode: "SARW",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsCL(ci) && operand.IsM16(mr):
return &intrep.Instruction{
Opcode: "SARW",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{ci, mr},
Outputs: []operand.Op{mr},
}, nil
}
return nil, errors.New("SARW: bad operands")
}
// SARXL: Arithmetic Shift Right Without Affecting Flags.
//
// Forms:
//
// SARXL r32 r32 r32
// SARXL r32 m32 r32
func SARXL(r, mr, r1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR32(r) && operand.IsR32(mr) && operand.IsR32(r1):
return &intrep.Instruction{
Opcode: "SARXL",
Operands: []operand.Op{r, mr, r1},
Inputs: []operand.Op{r, mr},
Outputs: []operand.Op{r1},
ISA: []string{"BMI2"},
}, nil
case operand.IsR32(r) && operand.IsM32(mr) && operand.IsR32(r1):
return &intrep.Instruction{
Opcode: "SARXL",
Operands: []operand.Op{r, mr, r1},
Inputs: []operand.Op{r, mr},
Outputs: []operand.Op{r1},
ISA: []string{"BMI2"},
}, nil
}
return nil, errors.New("SARXL: bad operands")
}
// SARXQ: Arithmetic Shift Right Without Affecting Flags.
//
// Forms:
//
// SARXQ r64 r64 r64
// SARXQ r64 m64 r64
func SARXQ(r, mr, r1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR64(r) && operand.IsR64(mr) && operand.IsR64(r1):
return &intrep.Instruction{
Opcode: "SARXQ",
Operands: []operand.Op{r, mr, r1},
Inputs: []operand.Op{r, mr},
Outputs: []operand.Op{r1},
ISA: []string{"BMI2"},
}, nil
case operand.IsR64(r) && operand.IsM64(mr) && operand.IsR64(r1):
return &intrep.Instruction{
Opcode: "SARXQ",
Operands: []operand.Op{r, mr, r1},
Inputs: []operand.Op{r, mr},
Outputs: []operand.Op{r1},
ISA: []string{"BMI2"},
}, nil
}
return nil, errors.New("SARXQ: bad operands")
}
// SBBB: Subtract with Borrow.
//
// Forms:
//
// SBBB imm8 al
// SBBB imm8 r8
// SBBB r8 r8
// SBBB m8 r8
// SBBB imm8 m8
// SBBB r8 m8
func SBBB(imr, amr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(imr) && operand.IsAL(amr):
return &intrep.Instruction{
Opcode: "SBBB",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{amr},
Outputs: []operand.Op{amr},
}, nil
case operand.IsIMM8(imr) && operand.IsR8(amr):
return &intrep.Instruction{
Opcode: "SBBB",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{amr},
Outputs: []operand.Op{amr},
}, nil
case operand.IsR8(imr) && operand.IsR8(amr):
return &intrep.Instruction{
Opcode: "SBBB",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{imr, amr},
Outputs: []operand.Op{amr},
CancellingInputs: true,
}, nil
case operand.IsM8(imr) && operand.IsR8(amr):
return &intrep.Instruction{
Opcode: "SBBB",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{imr, amr},
Outputs: []operand.Op{amr},
}, nil
case operand.IsIMM8(imr) && operand.IsM8(amr):
return &intrep.Instruction{
Opcode: "SBBB",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{amr},
Outputs: []operand.Op{amr},
}, nil
case operand.IsR8(imr) && operand.IsM8(amr):
return &intrep.Instruction{
Opcode: "SBBB",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{imr, amr},
Outputs: []operand.Op{amr},
}, nil
}
return nil, errors.New("SBBB: bad operands")
}
// SBBL: Subtract with Borrow.
//
// Forms:
//
// SBBL imm32 eax
// SBBL imm8 r32
// SBBL imm32 r32
// SBBL r32 r32
// SBBL m32 r32
// SBBL imm8 m32
// SBBL imm32 m32
// SBBL r32 m32
func SBBL(imr, emr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM32(imr) && operand.IsEAX(emr):
return &intrep.Instruction{
Opcode: "SBBL",
Operands: []operand.Op{imr, emr},
Inputs: []operand.Op{emr},
Outputs: []operand.Op{emr},
}, nil
case operand.IsIMM8(imr) && operand.IsR32(emr):
return &intrep.Instruction{
Opcode: "SBBL",
Operands: []operand.Op{imr, emr},
Inputs: []operand.Op{emr},
Outputs: []operand.Op{emr},
}, nil
case operand.IsIMM32(imr) && operand.IsR32(emr):
return &intrep.Instruction{
Opcode: "SBBL",
Operands: []operand.Op{imr, emr},
Inputs: []operand.Op{emr},
Outputs: []operand.Op{emr},
}, nil
case operand.IsR32(imr) && operand.IsR32(emr):
return &intrep.Instruction{
Opcode: "SBBL",
Operands: []operand.Op{imr, emr},
Inputs: []operand.Op{imr, emr},
Outputs: []operand.Op{emr},
CancellingInputs: true,
}, nil
case operand.IsM32(imr) && operand.IsR32(emr):
return &intrep.Instruction{
Opcode: "SBBL",
Operands: []operand.Op{imr, emr},
Inputs: []operand.Op{imr, emr},
Outputs: []operand.Op{emr},
}, nil
case operand.IsIMM8(imr) && operand.IsM32(emr):
return &intrep.Instruction{
Opcode: "SBBL",
Operands: []operand.Op{imr, emr},
Inputs: []operand.Op{emr},
Outputs: []operand.Op{emr},
}, nil
case operand.IsIMM32(imr) && operand.IsM32(emr):
return &intrep.Instruction{
Opcode: "SBBL",
Operands: []operand.Op{imr, emr},
Inputs: []operand.Op{emr},
Outputs: []operand.Op{emr},
}, nil
case operand.IsR32(imr) && operand.IsM32(emr):
return &intrep.Instruction{
Opcode: "SBBL",
Operands: []operand.Op{imr, emr},
Inputs: []operand.Op{imr, emr},
Outputs: []operand.Op{emr},
}, nil
}
return nil, errors.New("SBBL: bad operands")
}
// SBBQ: Subtract with Borrow.
//
// Forms:
//
// SBBQ imm32 rax
// SBBQ imm8 r64
// SBBQ imm32 r64
// SBBQ r64 r64
// SBBQ m64 r64
// SBBQ imm8 m64
// SBBQ imm32 m64
// SBBQ r64 m64
func SBBQ(imr, mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM32(imr) && operand.IsRAX(mr):
return &intrep.Instruction{
Opcode: "SBBQ",
Operands: []operand.Op{imr, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsIMM8(imr) && operand.IsR64(mr):
return &intrep.Instruction{
Opcode: "SBBQ",
Operands: []operand.Op{imr, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsIMM32(imr) && operand.IsR64(mr):
return &intrep.Instruction{
Opcode: "SBBQ",
Operands: []operand.Op{imr, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsR64(imr) && operand.IsR64(mr):
return &intrep.Instruction{
Opcode: "SBBQ",
Operands: []operand.Op{imr, mr},
Inputs: []operand.Op{imr, mr},
Outputs: []operand.Op{mr},
CancellingInputs: true,
}, nil
case operand.IsM64(imr) && operand.IsR64(mr):
return &intrep.Instruction{
Opcode: "SBBQ",
Operands: []operand.Op{imr, mr},
Inputs: []operand.Op{imr, mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsIMM8(imr) && operand.IsM64(mr):
return &intrep.Instruction{
Opcode: "SBBQ",
Operands: []operand.Op{imr, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsIMM32(imr) && operand.IsM64(mr):
return &intrep.Instruction{
Opcode: "SBBQ",
Operands: []operand.Op{imr, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsR64(imr) && operand.IsM64(mr):
return &intrep.Instruction{
Opcode: "SBBQ",
Operands: []operand.Op{imr, mr},
Inputs: []operand.Op{imr, mr},
Outputs: []operand.Op{mr},
}, nil
}
return nil, errors.New("SBBQ: bad operands")
}
// SBBW: Subtract with Borrow.
//
// Forms:
//
// SBBW imm16 ax
// SBBW imm8 r16
// SBBW imm16 r16
// SBBW r16 r16
// SBBW m16 r16
// SBBW imm8 m16
// SBBW imm16 m16
// SBBW r16 m16
func SBBW(imr, amr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM16(imr) && operand.IsAX(amr):
return &intrep.Instruction{
Opcode: "SBBW",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{amr},
Outputs: []operand.Op{amr},
}, nil
case operand.IsIMM8(imr) && operand.IsR16(amr):
return &intrep.Instruction{
Opcode: "SBBW",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{amr},
Outputs: []operand.Op{amr},
}, nil
case operand.IsIMM16(imr) && operand.IsR16(amr):
return &intrep.Instruction{
Opcode: "SBBW",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{amr},
Outputs: []operand.Op{amr},
}, nil
case operand.IsR16(imr) && operand.IsR16(amr):
return &intrep.Instruction{
Opcode: "SBBW",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{imr, amr},
Outputs: []operand.Op{amr},
CancellingInputs: true,
}, nil
case operand.IsM16(imr) && operand.IsR16(amr):
return &intrep.Instruction{
Opcode: "SBBW",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{imr, amr},
Outputs: []operand.Op{amr},
}, nil
case operand.IsIMM8(imr) && operand.IsM16(amr):
return &intrep.Instruction{
Opcode: "SBBW",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{amr},
Outputs: []operand.Op{amr},
}, nil
case operand.IsIMM16(imr) && operand.IsM16(amr):
return &intrep.Instruction{
Opcode: "SBBW",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{amr},
Outputs: []operand.Op{amr},
}, nil
case operand.IsR16(imr) && operand.IsM16(amr):
return &intrep.Instruction{
Opcode: "SBBW",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{imr, amr},
Outputs: []operand.Op{amr},
}, nil
}
return nil, errors.New("SBBW: bad operands")
}
// SETCC: Set byte if above or equal (CF == 0).
//
// Forms:
//
// SETCC r8
// SETCC m8
func SETCC(mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR8(mr):
return &intrep.Instruction{
Opcode: "SETCC",
Operands: []operand.Op{mr},
Inputs: []operand.Op{},
Outputs: []operand.Op{mr},
}, nil
case operand.IsM8(mr):
return &intrep.Instruction{
Opcode: "SETCC",
Operands: []operand.Op{mr},
Inputs: []operand.Op{},
Outputs: []operand.Op{mr},
}, nil
}
return nil, errors.New("SETCC: bad operands")
}
// SETCS: Set byte if below (CF == 1).
//
// Forms:
//
// SETCS r8
// SETCS m8
func SETCS(mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR8(mr):
return &intrep.Instruction{
Opcode: "SETCS",
Operands: []operand.Op{mr},
Inputs: []operand.Op{},
Outputs: []operand.Op{mr},
}, nil
case operand.IsM8(mr):
return &intrep.Instruction{
Opcode: "SETCS",
Operands: []operand.Op{mr},
Inputs: []operand.Op{},
Outputs: []operand.Op{mr},
}, nil
}
return nil, errors.New("SETCS: bad operands")
}
// SETEQ: Set byte if equal (ZF == 1).
//
// Forms:
//
// SETEQ r8
// SETEQ m8
func SETEQ(mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR8(mr):
return &intrep.Instruction{
Opcode: "SETEQ",
Operands: []operand.Op{mr},
Inputs: []operand.Op{},
Outputs: []operand.Op{mr},
}, nil
case operand.IsM8(mr):
return &intrep.Instruction{
Opcode: "SETEQ",
Operands: []operand.Op{mr},
Inputs: []operand.Op{},
Outputs: []operand.Op{mr},
}, nil
}
return nil, errors.New("SETEQ: bad operands")
}
// SETGE: Set byte if greater or equal (SF == OF).
//
// Forms:
//
// SETGE r8
// SETGE m8
func SETGE(mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR8(mr):
return &intrep.Instruction{
Opcode: "SETGE",
Operands: []operand.Op{mr},
Inputs: []operand.Op{},
Outputs: []operand.Op{mr},
}, nil
case operand.IsM8(mr):
return &intrep.Instruction{
Opcode: "SETGE",
Operands: []operand.Op{mr},
Inputs: []operand.Op{},
Outputs: []operand.Op{mr},
}, nil
}
return nil, errors.New("SETGE: bad operands")
}
// SETGT: Set byte if greater (ZF == 0 and SF == OF).
//
// Forms:
//
// SETGT r8
// SETGT m8
func SETGT(mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR8(mr):
return &intrep.Instruction{
Opcode: "SETGT",
Operands: []operand.Op{mr},
Inputs: []operand.Op{},
Outputs: []operand.Op{mr},
}, nil
case operand.IsM8(mr):
return &intrep.Instruction{
Opcode: "SETGT",
Operands: []operand.Op{mr},
Inputs: []operand.Op{},
Outputs: []operand.Op{mr},
}, nil
}
return nil, errors.New("SETGT: bad operands")
}
// SETHI: Set byte if above (CF == 0 and ZF == 0).
//
// Forms:
//
// SETHI r8
// SETHI m8
func SETHI(mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR8(mr):
return &intrep.Instruction{
Opcode: "SETHI",
Operands: []operand.Op{mr},
Inputs: []operand.Op{},
Outputs: []operand.Op{mr},
}, nil
case operand.IsM8(mr):
return &intrep.Instruction{
Opcode: "SETHI",
Operands: []operand.Op{mr},
Inputs: []operand.Op{},
Outputs: []operand.Op{mr},
}, nil
}
return nil, errors.New("SETHI: bad operands")
}
// SETLE: Set byte if less or equal (ZF == 1 or SF != OF).
//
// Forms:
//
// SETLE r8
// SETLE m8
func SETLE(mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR8(mr):
return &intrep.Instruction{
Opcode: "SETLE",
Operands: []operand.Op{mr},
Inputs: []operand.Op{},
Outputs: []operand.Op{mr},
}, nil
case operand.IsM8(mr):
return &intrep.Instruction{
Opcode: "SETLE",
Operands: []operand.Op{mr},
Inputs: []operand.Op{},
Outputs: []operand.Op{mr},
}, nil
}
return nil, errors.New("SETLE: bad operands")
}
// SETLS: Set byte if below or equal (CF == 1 or ZF == 1).
//
// Forms:
//
// SETLS r8
// SETLS m8
func SETLS(mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR8(mr):
return &intrep.Instruction{
Opcode: "SETLS",
Operands: []operand.Op{mr},
Inputs: []operand.Op{},
Outputs: []operand.Op{mr},
}, nil
case operand.IsM8(mr):
return &intrep.Instruction{
Opcode: "SETLS",
Operands: []operand.Op{mr},
Inputs: []operand.Op{},
Outputs: []operand.Op{mr},
}, nil
}
return nil, errors.New("SETLS: bad operands")
}
// SETLT: Set byte if less (SF != OF).
//
// Forms:
//
// SETLT r8
// SETLT m8
func SETLT(mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR8(mr):
return &intrep.Instruction{
Opcode: "SETLT",
Operands: []operand.Op{mr},
Inputs: []operand.Op{},
Outputs: []operand.Op{mr},
}, nil
case operand.IsM8(mr):
return &intrep.Instruction{
Opcode: "SETLT",
Operands: []operand.Op{mr},
Inputs: []operand.Op{},
Outputs: []operand.Op{mr},
}, nil
}
return nil, errors.New("SETLT: bad operands")
}
// SETMI: Set byte if sign (SF == 1).
//
// Forms:
//
// SETMI r8
// SETMI m8
func SETMI(mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR8(mr):
return &intrep.Instruction{
Opcode: "SETMI",
Operands: []operand.Op{mr},
Inputs: []operand.Op{},
Outputs: []operand.Op{mr},
}, nil
case operand.IsM8(mr):
return &intrep.Instruction{
Opcode: "SETMI",
Operands: []operand.Op{mr},
Inputs: []operand.Op{},
Outputs: []operand.Op{mr},
}, nil
}
return nil, errors.New("SETMI: bad operands")
}
// SETNE: Set byte if not equal (ZF == 0).
//
// Forms:
//
// SETNE r8
// SETNE m8
func SETNE(mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR8(mr):
return &intrep.Instruction{
Opcode: "SETNE",
Operands: []operand.Op{mr},
Inputs: []operand.Op{},
Outputs: []operand.Op{mr},
}, nil
case operand.IsM8(mr):
return &intrep.Instruction{
Opcode: "SETNE",
Operands: []operand.Op{mr},
Inputs: []operand.Op{},
Outputs: []operand.Op{mr},
}, nil
}
return nil, errors.New("SETNE: bad operands")
}
// SETOC: Set byte if not overflow (OF == 0).
//
// Forms:
//
// SETOC r8
// SETOC m8
func SETOC(mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR8(mr):
return &intrep.Instruction{
Opcode: "SETOC",
Operands: []operand.Op{mr},
Inputs: []operand.Op{},
Outputs: []operand.Op{mr},
}, nil
case operand.IsM8(mr):
return &intrep.Instruction{
Opcode: "SETOC",
Operands: []operand.Op{mr},
Inputs: []operand.Op{},
Outputs: []operand.Op{mr},
}, nil
}
return nil, errors.New("SETOC: bad operands")
}
// SETOS: Set byte if overflow (OF == 1).
//
// Forms:
//
// SETOS r8
// SETOS m8
func SETOS(mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR8(mr):
return &intrep.Instruction{
Opcode: "SETOS",
Operands: []operand.Op{mr},
Inputs: []operand.Op{},
Outputs: []operand.Op{mr},
}, nil
case operand.IsM8(mr):
return &intrep.Instruction{
Opcode: "SETOS",
Operands: []operand.Op{mr},
Inputs: []operand.Op{},
Outputs: []operand.Op{mr},
}, nil
}
return nil, errors.New("SETOS: bad operands")
}
// SETPC: Set byte if not parity (PF == 0).
//
// Forms:
//
// SETPC r8
// SETPC m8
func SETPC(mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR8(mr):
return &intrep.Instruction{
Opcode: "SETPC",
Operands: []operand.Op{mr},
Inputs: []operand.Op{},
Outputs: []operand.Op{mr},
}, nil
case operand.IsM8(mr):
return &intrep.Instruction{
Opcode: "SETPC",
Operands: []operand.Op{mr},
Inputs: []operand.Op{},
Outputs: []operand.Op{mr},
}, nil
}
return nil, errors.New("SETPC: bad operands")
}
// SETPL: Set byte if not sign (SF == 0).
//
// Forms:
//
// SETPL r8
// SETPL m8
func SETPL(mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR8(mr):
return &intrep.Instruction{
Opcode: "SETPL",
Operands: []operand.Op{mr},
Inputs: []operand.Op{},
Outputs: []operand.Op{mr},
}, nil
case operand.IsM8(mr):
return &intrep.Instruction{
Opcode: "SETPL",
Operands: []operand.Op{mr},
Inputs: []operand.Op{},
Outputs: []operand.Op{mr},
}, nil
}
return nil, errors.New("SETPL: bad operands")
}
// SETPS: Set byte if parity (PF == 1).
//
// Forms:
//
// SETPS r8
// SETPS m8
func SETPS(mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR8(mr):
return &intrep.Instruction{
Opcode: "SETPS",
Operands: []operand.Op{mr},
Inputs: []operand.Op{},
Outputs: []operand.Op{mr},
}, nil
case operand.IsM8(mr):
return &intrep.Instruction{
Opcode: "SETPS",
Operands: []operand.Op{mr},
Inputs: []operand.Op{},
Outputs: []operand.Op{mr},
}, nil
}
return nil, errors.New("SETPS: bad operands")
}
// SFENCE: Store Fence.
//
// Forms:
//
// SFENCE
func SFENCE() (*intrep.Instruction, error) {
return &intrep.Instruction{
Opcode: "SFENCE",
Operands: nil,
Inputs: []operand.Op{},
Outputs: []operand.Op{},
ISA: []string{"MMX+"},
}, nil
}
// SHA1MSG1: Perform an Intermediate Calculation for the Next Four SHA1 Message Doublewords.
//
// Forms:
//
// SHA1MSG1 xmm xmm
// SHA1MSG1 m128 xmm
func SHA1MSG1(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "SHA1MSG1",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SHA"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "SHA1MSG1",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SHA"},
}, nil
}
return nil, errors.New("SHA1MSG1: bad operands")
}
// SHA1MSG2: Perform a Final Calculation for the Next Four SHA1 Message Doublewords.
//
// Forms:
//
// SHA1MSG2 xmm xmm
// SHA1MSG2 m128 xmm
func SHA1MSG2(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "SHA1MSG2",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SHA"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "SHA1MSG2",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SHA"},
}, nil
}
return nil, errors.New("SHA1MSG2: bad operands")
}
// SHA1NEXTE: Calculate SHA1 State Variable E after Four Rounds.
//
// Forms:
//
// SHA1NEXTE xmm xmm
// SHA1NEXTE m128 xmm
func SHA1NEXTE(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "SHA1NEXTE",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SHA"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "SHA1NEXTE",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SHA"},
}, nil
}
return nil, errors.New("SHA1NEXTE: bad operands")
}
// SHA1RNDS4: Perform Four Rounds of SHA1 Operation.
//
// Forms:
//
// SHA1RNDS4 imm2u xmm xmm
// SHA1RNDS4 imm2u m128 xmm
func SHA1RNDS4(i, mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM2U(i) && operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "SHA1RNDS4",
Operands: []operand.Op{i, mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SHA"},
}, nil
case operand.IsIMM2U(i) && operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "SHA1RNDS4",
Operands: []operand.Op{i, mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SHA"},
}, nil
}
return nil, errors.New("SHA1RNDS4: bad operands")
}
// SHA256MSG1: Perform an Intermediate Calculation for the Next Four SHA256 Message Doublewords.
//
// Forms:
//
// SHA256MSG1 xmm xmm
// SHA256MSG1 m128 xmm
func SHA256MSG1(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "SHA256MSG1",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SHA"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "SHA256MSG1",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SHA"},
}, nil
}
return nil, errors.New("SHA256MSG1: bad operands")
}
// SHA256MSG2: Perform a Final Calculation for the Next Four SHA256 Message Doublewords.
//
// Forms:
//
// SHA256MSG2 xmm xmm
// SHA256MSG2 m128 xmm
func SHA256MSG2(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "SHA256MSG2",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SHA"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "SHA256MSG2",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SHA"},
}, nil
}
return nil, errors.New("SHA256MSG2: bad operands")
}
// SHA256RNDS2: Perform Two Rounds of SHA256 Operation.
//
// Forms:
//
// SHA256RNDS2 xmm0 xmm xmm
// SHA256RNDS2 xmm0 m128 xmm
func SHA256RNDS2(x, mx, x1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM0(x) && operand.IsXMM(mx) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "SHA256RNDS2",
Operands: []operand.Op{x, mx, x1},
Inputs: []operand.Op{x, mx, x1},
Outputs: []operand.Op{x1},
ISA: []string{"SHA"},
}, nil
case operand.IsXMM0(x) && operand.IsM128(mx) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "SHA256RNDS2",
Operands: []operand.Op{x, mx, x1},
Inputs: []operand.Op{x, mx, x1},
Outputs: []operand.Op{x1},
ISA: []string{"SHA"},
}, nil
}
return nil, errors.New("SHA256RNDS2: bad operands")
}
// SHLB: Logical Shift Left.
//
// Forms:
//
// SHLB 1 r8
// SHLB imm8 r8
// SHLB cl r8
// SHLB 1 m8
// SHLB imm8 m8
// SHLB cl m8
func SHLB(ci, mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.Is1(ci) && operand.IsR8(mr):
return &intrep.Instruction{
Opcode: "SHLB",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsIMM8(ci) && operand.IsR8(mr):
return &intrep.Instruction{
Opcode: "SHLB",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsCL(ci) && operand.IsR8(mr):
return &intrep.Instruction{
Opcode: "SHLB",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{ci, mr},
Outputs: []operand.Op{mr},
}, nil
case operand.Is1(ci) && operand.IsM8(mr):
return &intrep.Instruction{
Opcode: "SHLB",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsIMM8(ci) && operand.IsM8(mr):
return &intrep.Instruction{
Opcode: "SHLB",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsCL(ci) && operand.IsM8(mr):
return &intrep.Instruction{
Opcode: "SHLB",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{ci, mr},
Outputs: []operand.Op{mr},
}, nil
}
return nil, errors.New("SHLB: bad operands")
}
// SHLL: Logical Shift Left.
//
// Forms:
//
// SHLL 1 r32
// SHLL imm8 r32
// SHLL cl r32
// SHLL 1 m32
// SHLL imm8 m32
// SHLL cl m32
// SHLL imm8 r32 r32
// SHLL cl r32 r32
// SHLL imm8 r32 m32
// SHLL cl r32 m32
func SHLL(ops ...operand.Op) (*intrep.Instruction, error) {
switch {
case len(ops) == 2 && operand.Is1(ops[0]) && operand.IsR32(ops[1]):
return &intrep.Instruction{
Opcode: "SHLL",
Operands: ops,
Inputs: []operand.Op{ops[1]},
Outputs: []operand.Op{ops[1]},
}, nil
case len(ops) == 2 && operand.IsIMM8(ops[0]) && operand.IsR32(ops[1]):
return &intrep.Instruction{
Opcode: "SHLL",
Operands: ops,
Inputs: []operand.Op{ops[1]},
Outputs: []operand.Op{ops[1]},
}, nil
case len(ops) == 2 && operand.IsCL(ops[0]) && operand.IsR32(ops[1]):
return &intrep.Instruction{
Opcode: "SHLL",
Operands: ops,
Inputs: []operand.Op{ops[0], ops[1]},
Outputs: []operand.Op{ops[1]},
}, nil
case len(ops) == 2 && operand.Is1(ops[0]) && operand.IsM32(ops[1]):
return &intrep.Instruction{
Opcode: "SHLL",
Operands: ops,
Inputs: []operand.Op{ops[1]},
Outputs: []operand.Op{ops[1]},
}, nil
case len(ops) == 2 && operand.IsIMM8(ops[0]) && operand.IsM32(ops[1]):
return &intrep.Instruction{
Opcode: "SHLL",
Operands: ops,
Inputs: []operand.Op{ops[1]},
Outputs: []operand.Op{ops[1]},
}, nil
case len(ops) == 2 && operand.IsCL(ops[0]) && operand.IsM32(ops[1]):
return &intrep.Instruction{
Opcode: "SHLL",
Operands: ops,
Inputs: []operand.Op{ops[0], ops[1]},
Outputs: []operand.Op{ops[1]},
}, nil
case len(ops) == 3 && operand.IsIMM8(ops[0]) && operand.IsR32(ops[1]) && operand.IsR32(ops[2]):
return &intrep.Instruction{
Opcode: "SHLL",
Operands: ops,
Inputs: []operand.Op{ops[1], ops[2]},
Outputs: []operand.Op{ops[2]},
}, nil
case len(ops) == 3 && operand.IsCL(ops[0]) && operand.IsR32(ops[1]) && operand.IsR32(ops[2]):
return &intrep.Instruction{
Opcode: "SHLL",
Operands: ops,
Inputs: []operand.Op{ops[0], ops[1], ops[2]},
Outputs: []operand.Op{ops[2]},
}, nil
case len(ops) == 3 && operand.IsIMM8(ops[0]) && operand.IsR32(ops[1]) && operand.IsM32(ops[2]):
return &intrep.Instruction{
Opcode: "SHLL",
Operands: ops,
Inputs: []operand.Op{ops[1], ops[2]},
Outputs: []operand.Op{ops[2]},
}, nil
case len(ops) == 3 && operand.IsCL(ops[0]) && operand.IsR32(ops[1]) && operand.IsM32(ops[2]):
return &intrep.Instruction{
Opcode: "SHLL",
Operands: ops,
Inputs: []operand.Op{ops[0], ops[1], ops[2]},
Outputs: []operand.Op{ops[2]},
}, nil
}
return nil, errors.New("SHLL: bad operands")
}
// SHLQ: Logical Shift Left.
//
// Forms:
//
// SHLQ 1 r64
// SHLQ imm8 r64
// SHLQ cl r64
// SHLQ 1 m64
// SHLQ imm8 m64
// SHLQ cl m64
// SHLQ imm8 r64 r64
// SHLQ cl r64 r64
// SHLQ imm8 r64 m64
// SHLQ cl r64 m64
func SHLQ(ops ...operand.Op) (*intrep.Instruction, error) {
switch {
case len(ops) == 2 && operand.Is1(ops[0]) && operand.IsR64(ops[1]):
return &intrep.Instruction{
Opcode: "SHLQ",
Operands: ops,
Inputs: []operand.Op{ops[1]},
Outputs: []operand.Op{ops[1]},
}, nil
case len(ops) == 2 && operand.IsIMM8(ops[0]) && operand.IsR64(ops[1]):
return &intrep.Instruction{
Opcode: "SHLQ",
Operands: ops,
Inputs: []operand.Op{ops[1]},
Outputs: []operand.Op{ops[1]},
}, nil
case len(ops) == 2 && operand.IsCL(ops[0]) && operand.IsR64(ops[1]):
return &intrep.Instruction{
Opcode: "SHLQ",
Operands: ops,
Inputs: []operand.Op{ops[0], ops[1]},
Outputs: []operand.Op{ops[1]},
}, nil
case len(ops) == 2 && operand.Is1(ops[0]) && operand.IsM64(ops[1]):
return &intrep.Instruction{
Opcode: "SHLQ",
Operands: ops,
Inputs: []operand.Op{ops[1]},
Outputs: []operand.Op{ops[1]},
}, nil
case len(ops) == 2 && operand.IsIMM8(ops[0]) && operand.IsM64(ops[1]):
return &intrep.Instruction{
Opcode: "SHLQ",
Operands: ops,
Inputs: []operand.Op{ops[1]},
Outputs: []operand.Op{ops[1]},
}, nil
case len(ops) == 2 && operand.IsCL(ops[0]) && operand.IsM64(ops[1]):
return &intrep.Instruction{
Opcode: "SHLQ",
Operands: ops,
Inputs: []operand.Op{ops[0], ops[1]},
Outputs: []operand.Op{ops[1]},
}, nil
case len(ops) == 3 && operand.IsIMM8(ops[0]) && operand.IsR64(ops[1]) && operand.IsR64(ops[2]):
return &intrep.Instruction{
Opcode: "SHLQ",
Operands: ops,
Inputs: []operand.Op{ops[1], ops[2]},
Outputs: []operand.Op{ops[2]},
}, nil
case len(ops) == 3 && operand.IsCL(ops[0]) && operand.IsR64(ops[1]) && operand.IsR64(ops[2]):
return &intrep.Instruction{
Opcode: "SHLQ",
Operands: ops,
Inputs: []operand.Op{ops[0], ops[1], ops[2]},
Outputs: []operand.Op{ops[2]},
}, nil
case len(ops) == 3 && operand.IsIMM8(ops[0]) && operand.IsR64(ops[1]) && operand.IsM64(ops[2]):
return &intrep.Instruction{
Opcode: "SHLQ",
Operands: ops,
Inputs: []operand.Op{ops[1], ops[2]},
Outputs: []operand.Op{ops[2]},
}, nil
case len(ops) == 3 && operand.IsCL(ops[0]) && operand.IsR64(ops[1]) && operand.IsM64(ops[2]):
return &intrep.Instruction{
Opcode: "SHLQ",
Operands: ops,
Inputs: []operand.Op{ops[0], ops[1], ops[2]},
Outputs: []operand.Op{ops[2]},
}, nil
}
return nil, errors.New("SHLQ: bad operands")
}
// SHLW: Logical Shift Left.
//
// Forms:
//
// SHLW 1 r16
// SHLW imm8 r16
// SHLW cl r16
// SHLW 1 m16
// SHLW imm8 m16
// SHLW cl m16
// SHLW imm8 r16 r16
// SHLW cl r16 r16
// SHLW imm8 r16 m16
// SHLW cl r16 m16
func SHLW(ops ...operand.Op) (*intrep.Instruction, error) {
switch {
case len(ops) == 2 && operand.Is1(ops[0]) && operand.IsR16(ops[1]):
return &intrep.Instruction{
Opcode: "SHLW",
Operands: ops,
Inputs: []operand.Op{ops[1]},
Outputs: []operand.Op{ops[1]},
}, nil
case len(ops) == 2 && operand.IsIMM8(ops[0]) && operand.IsR16(ops[1]):
return &intrep.Instruction{
Opcode: "SHLW",
Operands: ops,
Inputs: []operand.Op{ops[1]},
Outputs: []operand.Op{ops[1]},
}, nil
case len(ops) == 2 && operand.IsCL(ops[0]) && operand.IsR16(ops[1]):
return &intrep.Instruction{
Opcode: "SHLW",
Operands: ops,
Inputs: []operand.Op{ops[0], ops[1]},
Outputs: []operand.Op{ops[1]},
}, nil
case len(ops) == 2 && operand.Is1(ops[0]) && operand.IsM16(ops[1]):
return &intrep.Instruction{
Opcode: "SHLW",
Operands: ops,
Inputs: []operand.Op{ops[1]},
Outputs: []operand.Op{ops[1]},
}, nil
case len(ops) == 2 && operand.IsIMM8(ops[0]) && operand.IsM16(ops[1]):
return &intrep.Instruction{
Opcode: "SHLW",
Operands: ops,
Inputs: []operand.Op{ops[1]},
Outputs: []operand.Op{ops[1]},
}, nil
case len(ops) == 2 && operand.IsCL(ops[0]) && operand.IsM16(ops[1]):
return &intrep.Instruction{
Opcode: "SHLW",
Operands: ops,
Inputs: []operand.Op{ops[0], ops[1]},
Outputs: []operand.Op{ops[1]},
}, nil
case len(ops) == 3 && operand.IsIMM8(ops[0]) && operand.IsR16(ops[1]) && operand.IsR16(ops[2]):
return &intrep.Instruction{
Opcode: "SHLW",
Operands: ops,
Inputs: []operand.Op{ops[1], ops[2]},
Outputs: []operand.Op{ops[2]},
}, nil
case len(ops) == 3 && operand.IsCL(ops[0]) && operand.IsR16(ops[1]) && operand.IsR16(ops[2]):
return &intrep.Instruction{
Opcode: "SHLW",
Operands: ops,
Inputs: []operand.Op{ops[0], ops[1], ops[2]},
Outputs: []operand.Op{ops[2]},
}, nil
case len(ops) == 3 && operand.IsIMM8(ops[0]) && operand.IsR16(ops[1]) && operand.IsM16(ops[2]):
return &intrep.Instruction{
Opcode: "SHLW",
Operands: ops,
Inputs: []operand.Op{ops[1], ops[2]},
Outputs: []operand.Op{ops[2]},
}, nil
case len(ops) == 3 && operand.IsCL(ops[0]) && operand.IsR16(ops[1]) && operand.IsM16(ops[2]):
return &intrep.Instruction{
Opcode: "SHLW",
Operands: ops,
Inputs: []operand.Op{ops[0], ops[1], ops[2]},
Outputs: []operand.Op{ops[2]},
}, nil
}
return nil, errors.New("SHLW: bad operands")
}
// SHLXL: Logical Shift Left Without Affecting Flags.
//
// Forms:
//
// SHLXL r32 r32 r32
// SHLXL r32 m32 r32
func SHLXL(r, mr, r1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR32(r) && operand.IsR32(mr) && operand.IsR32(r1):
return &intrep.Instruction{
Opcode: "SHLXL",
Operands: []operand.Op{r, mr, r1},
Inputs: []operand.Op{r, mr},
Outputs: []operand.Op{r1},
ISA: []string{"BMI2"},
}, nil
case operand.IsR32(r) && operand.IsM32(mr) && operand.IsR32(r1):
return &intrep.Instruction{
Opcode: "SHLXL",
Operands: []operand.Op{r, mr, r1},
Inputs: []operand.Op{r, mr},
Outputs: []operand.Op{r1},
ISA: []string{"BMI2"},
}, nil
}
return nil, errors.New("SHLXL: bad operands")
}
// SHLXQ: Logical Shift Left Without Affecting Flags.
//
// Forms:
//
// SHLXQ r64 r64 r64
// SHLXQ r64 m64 r64
func SHLXQ(r, mr, r1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR64(r) && operand.IsR64(mr) && operand.IsR64(r1):
return &intrep.Instruction{
Opcode: "SHLXQ",
Operands: []operand.Op{r, mr, r1},
Inputs: []operand.Op{r, mr},
Outputs: []operand.Op{r1},
ISA: []string{"BMI2"},
}, nil
case operand.IsR64(r) && operand.IsM64(mr) && operand.IsR64(r1):
return &intrep.Instruction{
Opcode: "SHLXQ",
Operands: []operand.Op{r, mr, r1},
Inputs: []operand.Op{r, mr},
Outputs: []operand.Op{r1},
ISA: []string{"BMI2"},
}, nil
}
return nil, errors.New("SHLXQ: bad operands")
}
// SHRB: Logical Shift Right.
//
// Forms:
//
// SHRB 1 r8
// SHRB imm8 r8
// SHRB cl r8
// SHRB 1 m8
// SHRB imm8 m8
// SHRB cl m8
func SHRB(ci, mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.Is1(ci) && operand.IsR8(mr):
return &intrep.Instruction{
Opcode: "SHRB",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsIMM8(ci) && operand.IsR8(mr):
return &intrep.Instruction{
Opcode: "SHRB",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsCL(ci) && operand.IsR8(mr):
return &intrep.Instruction{
Opcode: "SHRB",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{ci, mr},
Outputs: []operand.Op{mr},
}, nil
case operand.Is1(ci) && operand.IsM8(mr):
return &intrep.Instruction{
Opcode: "SHRB",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsIMM8(ci) && operand.IsM8(mr):
return &intrep.Instruction{
Opcode: "SHRB",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsCL(ci) && operand.IsM8(mr):
return &intrep.Instruction{
Opcode: "SHRB",
Operands: []operand.Op{ci, mr},
Inputs: []operand.Op{ci, mr},
Outputs: []operand.Op{mr},
}, nil
}
return nil, errors.New("SHRB: bad operands")
}
// SHRL: Logical Shift Right.
//
// Forms:
//
// SHRL 1 r32
// SHRL imm8 r32
// SHRL cl r32
// SHRL 1 m32
// SHRL imm8 m32
// SHRL cl m32
// SHRL imm8 r32 r32
// SHRL cl r32 r32
// SHRL imm8 r32 m32
// SHRL cl r32 m32
func SHRL(ops ...operand.Op) (*intrep.Instruction, error) {
switch {
case len(ops) == 2 && operand.Is1(ops[0]) && operand.IsR32(ops[1]):
return &intrep.Instruction{
Opcode: "SHRL",
Operands: ops,
Inputs: []operand.Op{ops[1]},
Outputs: []operand.Op{ops[1]},
}, nil
case len(ops) == 2 && operand.IsIMM8(ops[0]) && operand.IsR32(ops[1]):
return &intrep.Instruction{
Opcode: "SHRL",
Operands: ops,
Inputs: []operand.Op{ops[1]},
Outputs: []operand.Op{ops[1]},
}, nil
case len(ops) == 2 && operand.IsCL(ops[0]) && operand.IsR32(ops[1]):
return &intrep.Instruction{
Opcode: "SHRL",
Operands: ops,
Inputs: []operand.Op{ops[0], ops[1]},
Outputs: []operand.Op{ops[1]},
}, nil
case len(ops) == 2 && operand.Is1(ops[0]) && operand.IsM32(ops[1]):
return &intrep.Instruction{
Opcode: "SHRL",
Operands: ops,
Inputs: []operand.Op{ops[1]},
Outputs: []operand.Op{ops[1]},
}, nil
case len(ops) == 2 && operand.IsIMM8(ops[0]) && operand.IsM32(ops[1]):
return &intrep.Instruction{
Opcode: "SHRL",
Operands: ops,
Inputs: []operand.Op{ops[1]},
Outputs: []operand.Op{ops[1]},
}, nil
case len(ops) == 2 && operand.IsCL(ops[0]) && operand.IsM32(ops[1]):
return &intrep.Instruction{
Opcode: "SHRL",
Operands: ops,
Inputs: []operand.Op{ops[0], ops[1]},
Outputs: []operand.Op{ops[1]},
}, nil
case len(ops) == 3 && operand.IsIMM8(ops[0]) && operand.IsR32(ops[1]) && operand.IsR32(ops[2]):
return &intrep.Instruction{
Opcode: "SHRL",
Operands: ops,
Inputs: []operand.Op{ops[1], ops[2]},
Outputs: []operand.Op{ops[2]},
}, nil
case len(ops) == 3 && operand.IsCL(ops[0]) && operand.IsR32(ops[1]) && operand.IsR32(ops[2]):
return &intrep.Instruction{
Opcode: "SHRL",
Operands: ops,
Inputs: []operand.Op{ops[0], ops[1], ops[2]},
Outputs: []operand.Op{ops[2]},
}, nil
case len(ops) == 3 && operand.IsIMM8(ops[0]) && operand.IsR32(ops[1]) && operand.IsM32(ops[2]):
return &intrep.Instruction{
Opcode: "SHRL",
Operands: ops,
Inputs: []operand.Op{ops[1], ops[2]},
Outputs: []operand.Op{ops[2]},
}, nil
case len(ops) == 3 && operand.IsCL(ops[0]) && operand.IsR32(ops[1]) && operand.IsM32(ops[2]):
return &intrep.Instruction{
Opcode: "SHRL",
Operands: ops,
Inputs: []operand.Op{ops[0], ops[1], ops[2]},
Outputs: []operand.Op{ops[2]},
}, nil
}
return nil, errors.New("SHRL: bad operands")
}
// SHRQ: Logical Shift Right.
//
// Forms:
//
// SHRQ 1 r64
// SHRQ imm8 r64
// SHRQ cl r64
// SHRQ 1 m64
// SHRQ imm8 m64
// SHRQ cl m64
// SHRQ imm8 r64 r64
// SHRQ cl r64 r64
// SHRQ imm8 r64 m64
// SHRQ cl r64 m64
func SHRQ(ops ...operand.Op) (*intrep.Instruction, error) {
switch {
case len(ops) == 2 && operand.Is1(ops[0]) && operand.IsR64(ops[1]):
return &intrep.Instruction{
Opcode: "SHRQ",
Operands: ops,
Inputs: []operand.Op{ops[1]},
Outputs: []operand.Op{ops[1]},
}, nil
case len(ops) == 2 && operand.IsIMM8(ops[0]) && operand.IsR64(ops[1]):
return &intrep.Instruction{
Opcode: "SHRQ",
Operands: ops,
Inputs: []operand.Op{ops[1]},
Outputs: []operand.Op{ops[1]},
}, nil
case len(ops) == 2 && operand.IsCL(ops[0]) && operand.IsR64(ops[1]):
return &intrep.Instruction{
Opcode: "SHRQ",
Operands: ops,
Inputs: []operand.Op{ops[0], ops[1]},
Outputs: []operand.Op{ops[1]},
}, nil
case len(ops) == 2 && operand.Is1(ops[0]) && operand.IsM64(ops[1]):
return &intrep.Instruction{
Opcode: "SHRQ",
Operands: ops,
Inputs: []operand.Op{ops[1]},
Outputs: []operand.Op{ops[1]},
}, nil
case len(ops) == 2 && operand.IsIMM8(ops[0]) && operand.IsM64(ops[1]):
return &intrep.Instruction{
Opcode: "SHRQ",
Operands: ops,
Inputs: []operand.Op{ops[1]},
Outputs: []operand.Op{ops[1]},
}, nil
case len(ops) == 2 && operand.IsCL(ops[0]) && operand.IsM64(ops[1]):
return &intrep.Instruction{
Opcode: "SHRQ",
Operands: ops,
Inputs: []operand.Op{ops[0], ops[1]},
Outputs: []operand.Op{ops[1]},
}, nil
case len(ops) == 3 && operand.IsIMM8(ops[0]) && operand.IsR64(ops[1]) && operand.IsR64(ops[2]):
return &intrep.Instruction{
Opcode: "SHRQ",
Operands: ops,
Inputs: []operand.Op{ops[1], ops[2]},
Outputs: []operand.Op{ops[2]},
}, nil
case len(ops) == 3 && operand.IsCL(ops[0]) && operand.IsR64(ops[1]) && operand.IsR64(ops[2]):
return &intrep.Instruction{
Opcode: "SHRQ",
Operands: ops,
Inputs: []operand.Op{ops[0], ops[1], ops[2]},
Outputs: []operand.Op{ops[2]},
}, nil
case len(ops) == 3 && operand.IsIMM8(ops[0]) && operand.IsR64(ops[1]) && operand.IsM64(ops[2]):
return &intrep.Instruction{
Opcode: "SHRQ",
Operands: ops,
Inputs: []operand.Op{ops[1], ops[2]},
Outputs: []operand.Op{ops[2]},
}, nil
case len(ops) == 3 && operand.IsCL(ops[0]) && operand.IsR64(ops[1]) && operand.IsM64(ops[2]):
return &intrep.Instruction{
Opcode: "SHRQ",
Operands: ops,
Inputs: []operand.Op{ops[0], ops[1], ops[2]},
Outputs: []operand.Op{ops[2]},
}, nil
}
return nil, errors.New("SHRQ: bad operands")
}
// SHRW: Logical Shift Right.
//
// Forms:
//
// SHRW 1 r16
// SHRW imm8 r16
// SHRW cl r16
// SHRW 1 m16
// SHRW imm8 m16
// SHRW cl m16
// SHRW imm8 r16 r16
// SHRW cl r16 r16
// SHRW imm8 r16 m16
// SHRW cl r16 m16
func SHRW(ops ...operand.Op) (*intrep.Instruction, error) {
switch {
case len(ops) == 2 && operand.Is1(ops[0]) && operand.IsR16(ops[1]):
return &intrep.Instruction{
Opcode: "SHRW",
Operands: ops,
Inputs: []operand.Op{ops[1]},
Outputs: []operand.Op{ops[1]},
}, nil
case len(ops) == 2 && operand.IsIMM8(ops[0]) && operand.IsR16(ops[1]):
return &intrep.Instruction{
Opcode: "SHRW",
Operands: ops,
Inputs: []operand.Op{ops[1]},
Outputs: []operand.Op{ops[1]},
}, nil
case len(ops) == 2 && operand.IsCL(ops[0]) && operand.IsR16(ops[1]):
return &intrep.Instruction{
Opcode: "SHRW",
Operands: ops,
Inputs: []operand.Op{ops[0], ops[1]},
Outputs: []operand.Op{ops[1]},
}, nil
case len(ops) == 2 && operand.Is1(ops[0]) && operand.IsM16(ops[1]):
return &intrep.Instruction{
Opcode: "SHRW",
Operands: ops,
Inputs: []operand.Op{ops[1]},
Outputs: []operand.Op{ops[1]},
}, nil
case len(ops) == 2 && operand.IsIMM8(ops[0]) && operand.IsM16(ops[1]):
return &intrep.Instruction{
Opcode: "SHRW",
Operands: ops,
Inputs: []operand.Op{ops[1]},
Outputs: []operand.Op{ops[1]},
}, nil
case len(ops) == 2 && operand.IsCL(ops[0]) && operand.IsM16(ops[1]):
return &intrep.Instruction{
Opcode: "SHRW",
Operands: ops,
Inputs: []operand.Op{ops[0], ops[1]},
Outputs: []operand.Op{ops[1]},
}, nil
case len(ops) == 3 && operand.IsIMM8(ops[0]) && operand.IsR16(ops[1]) && operand.IsR16(ops[2]):
return &intrep.Instruction{
Opcode: "SHRW",
Operands: ops,
Inputs: []operand.Op{ops[1], ops[2]},
Outputs: []operand.Op{ops[2]},
}, nil
case len(ops) == 3 && operand.IsCL(ops[0]) && operand.IsR16(ops[1]) && operand.IsR16(ops[2]):
return &intrep.Instruction{
Opcode: "SHRW",
Operands: ops,
Inputs: []operand.Op{ops[0], ops[1], ops[2]},
Outputs: []operand.Op{ops[2]},
}, nil
case len(ops) == 3 && operand.IsIMM8(ops[0]) && operand.IsR16(ops[1]) && operand.IsM16(ops[2]):
return &intrep.Instruction{
Opcode: "SHRW",
Operands: ops,
Inputs: []operand.Op{ops[1], ops[2]},
Outputs: []operand.Op{ops[2]},
}, nil
case len(ops) == 3 && operand.IsCL(ops[0]) && operand.IsR16(ops[1]) && operand.IsM16(ops[2]):
return &intrep.Instruction{
Opcode: "SHRW",
Operands: ops,
Inputs: []operand.Op{ops[0], ops[1], ops[2]},
Outputs: []operand.Op{ops[2]},
}, nil
}
return nil, errors.New("SHRW: bad operands")
}
// SHRXL: Logical Shift Right Without Affecting Flags.
//
// Forms:
//
// SHRXL r32 r32 r32
// SHRXL r32 m32 r32
func SHRXL(r, mr, r1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR32(r) && operand.IsR32(mr) && operand.IsR32(r1):
return &intrep.Instruction{
Opcode: "SHRXL",
Operands: []operand.Op{r, mr, r1},
Inputs: []operand.Op{r, mr},
Outputs: []operand.Op{r1},
ISA: []string{"BMI2"},
}, nil
case operand.IsR32(r) && operand.IsM32(mr) && operand.IsR32(r1):
return &intrep.Instruction{
Opcode: "SHRXL",
Operands: []operand.Op{r, mr, r1},
Inputs: []operand.Op{r, mr},
Outputs: []operand.Op{r1},
ISA: []string{"BMI2"},
}, nil
}
return nil, errors.New("SHRXL: bad operands")
}
// SHRXQ: Logical Shift Right Without Affecting Flags.
//
// Forms:
//
// SHRXQ r64 r64 r64
// SHRXQ r64 m64 r64
func SHRXQ(r, mr, r1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR64(r) && operand.IsR64(mr) && operand.IsR64(r1):
return &intrep.Instruction{
Opcode: "SHRXQ",
Operands: []operand.Op{r, mr, r1},
Inputs: []operand.Op{r, mr},
Outputs: []operand.Op{r1},
ISA: []string{"BMI2"},
}, nil
case operand.IsR64(r) && operand.IsM64(mr) && operand.IsR64(r1):
return &intrep.Instruction{
Opcode: "SHRXQ",
Operands: []operand.Op{r, mr, r1},
Inputs: []operand.Op{r, mr},
Outputs: []operand.Op{r1},
ISA: []string{"BMI2"},
}, nil
}
return nil, errors.New("SHRXQ: bad operands")
}
// SHUFPD: Shuffle Packed Double-Precision Floating-Point Values.
//
// Forms:
//
// SHUFPD imm8 xmm xmm
// SHUFPD imm8 m128 xmm
func SHUFPD(i, mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(i) && operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "SHUFPD",
Operands: []operand.Op{i, mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
case operand.IsIMM8(i) && operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "SHUFPD",
Operands: []operand.Op{i, mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("SHUFPD: bad operands")
}
// SHUFPS: Shuffle Packed Single-Precision Floating-Point Values.
//
// Forms:
//
// SHUFPS imm8 xmm xmm
// SHUFPS imm8 m128 xmm
func SHUFPS(i, mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(i) && operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "SHUFPS",
Operands: []operand.Op{i, mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE"},
}, nil
case operand.IsIMM8(i) && operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "SHUFPS",
Operands: []operand.Op{i, mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE"},
}, nil
}
return nil, errors.New("SHUFPS: bad operands")
}
// SQRTPD: Compute Square Roots of Packed Double-Precision Floating-Point Values.
//
// Forms:
//
// SQRTPD xmm xmm
// SQRTPD m128 xmm
func SQRTPD(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "SQRTPD",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "SQRTPD",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("SQRTPD: bad operands")
}
// SQRTPS: Compute Square Roots of Packed Single-Precision Floating-Point Values.
//
// Forms:
//
// SQRTPS xmm xmm
// SQRTPS m128 xmm
func SQRTPS(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "SQRTPS",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"SSE"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "SQRTPS",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"SSE"},
}, nil
}
return nil, errors.New("SQRTPS: bad operands")
}
// SQRTSD: Compute Square Root of Scalar Double-Precision Floating-Point Value.
//
// Forms:
//
// SQRTSD xmm xmm
// SQRTSD m64 xmm
func SQRTSD(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "SQRTSD",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
case operand.IsM64(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "SQRTSD",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("SQRTSD: bad operands")
}
// SQRTSS: Compute Square Root of Scalar Single-Precision Floating-Point Value.
//
// Forms:
//
// SQRTSS xmm xmm
// SQRTSS m32 xmm
func SQRTSS(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "SQRTSS",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE"},
}, nil
case operand.IsM32(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "SQRTSS",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE"},
}, nil
}
return nil, errors.New("SQRTSS: bad operands")
}
// STC: Set Carry Flag.
//
// Forms:
//
// STC
func STC() (*intrep.Instruction, error) {
return &intrep.Instruction{
Opcode: "STC",
Operands: nil,
Inputs: []operand.Op{},
Outputs: []operand.Op{},
}, nil
}
// STD: Set Direction Flag.
//
// Forms:
//
// STD
func STD() (*intrep.Instruction, error) {
return &intrep.Instruction{
Opcode: "STD",
Operands: nil,
Inputs: []operand.Op{},
Outputs: []operand.Op{},
}, nil
}
// STMXCSR: Store MXCSR Register State.
//
// Forms:
//
// STMXCSR m32
func STMXCSR(m operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsM32(m):
return &intrep.Instruction{
Opcode: "STMXCSR",
Operands: []operand.Op{m},
Inputs: []operand.Op{},
Outputs: []operand.Op{m},
ISA: []string{"SSE"},
}, nil
}
return nil, errors.New("STMXCSR: bad operands")
}
// SUBB: Subtract.
//
// Forms:
//
// SUBB imm8 al
// SUBB imm8 r8
// SUBB r8 r8
// SUBB m8 r8
// SUBB imm8 m8
// SUBB r8 m8
func SUBB(imr, amr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(imr) && operand.IsAL(amr):
return &intrep.Instruction{
Opcode: "SUBB",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{amr},
Outputs: []operand.Op{amr},
}, nil
case operand.IsIMM8(imr) && operand.IsR8(amr):
return &intrep.Instruction{
Opcode: "SUBB",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{amr},
Outputs: []operand.Op{amr},
}, nil
case operand.IsR8(imr) && operand.IsR8(amr):
return &intrep.Instruction{
Opcode: "SUBB",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{imr, amr},
Outputs: []operand.Op{amr},
CancellingInputs: true,
}, nil
case operand.IsM8(imr) && operand.IsR8(amr):
return &intrep.Instruction{
Opcode: "SUBB",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{imr, amr},
Outputs: []operand.Op{amr},
}, nil
case operand.IsIMM8(imr) && operand.IsM8(amr):
return &intrep.Instruction{
Opcode: "SUBB",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{amr},
Outputs: []operand.Op{amr},
}, nil
case operand.IsR8(imr) && operand.IsM8(amr):
return &intrep.Instruction{
Opcode: "SUBB",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{imr, amr},
Outputs: []operand.Op{amr},
}, nil
}
return nil, errors.New("SUBB: bad operands")
}
// SUBL: Subtract.
//
// Forms:
//
// SUBL imm32 eax
// SUBL imm8 r32
// SUBL imm32 r32
// SUBL r32 r32
// SUBL m32 r32
// SUBL imm8 m32
// SUBL imm32 m32
// SUBL r32 m32
func SUBL(imr, emr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM32(imr) && operand.IsEAX(emr):
return &intrep.Instruction{
Opcode: "SUBL",
Operands: []operand.Op{imr, emr},
Inputs: []operand.Op{emr},
Outputs: []operand.Op{emr},
}, nil
case operand.IsIMM8(imr) && operand.IsR32(emr):
return &intrep.Instruction{
Opcode: "SUBL",
Operands: []operand.Op{imr, emr},
Inputs: []operand.Op{emr},
Outputs: []operand.Op{emr},
}, nil
case operand.IsIMM32(imr) && operand.IsR32(emr):
return &intrep.Instruction{
Opcode: "SUBL",
Operands: []operand.Op{imr, emr},
Inputs: []operand.Op{emr},
Outputs: []operand.Op{emr},
}, nil
case operand.IsR32(imr) && operand.IsR32(emr):
return &intrep.Instruction{
Opcode: "SUBL",
Operands: []operand.Op{imr, emr},
Inputs: []operand.Op{imr, emr},
Outputs: []operand.Op{emr},
CancellingInputs: true,
}, nil
case operand.IsM32(imr) && operand.IsR32(emr):
return &intrep.Instruction{
Opcode: "SUBL",
Operands: []operand.Op{imr, emr},
Inputs: []operand.Op{imr, emr},
Outputs: []operand.Op{emr},
}, nil
case operand.IsIMM8(imr) && operand.IsM32(emr):
return &intrep.Instruction{
Opcode: "SUBL",
Operands: []operand.Op{imr, emr},
Inputs: []operand.Op{emr},
Outputs: []operand.Op{emr},
}, nil
case operand.IsIMM32(imr) && operand.IsM32(emr):
return &intrep.Instruction{
Opcode: "SUBL",
Operands: []operand.Op{imr, emr},
Inputs: []operand.Op{emr},
Outputs: []operand.Op{emr},
}, nil
case operand.IsR32(imr) && operand.IsM32(emr):
return &intrep.Instruction{
Opcode: "SUBL",
Operands: []operand.Op{imr, emr},
Inputs: []operand.Op{imr, emr},
Outputs: []operand.Op{emr},
}, nil
}
return nil, errors.New("SUBL: bad operands")
}
// SUBPD: Subtract Packed Double-Precision Floating-Point Values.
//
// Forms:
//
// SUBPD xmm xmm
// SUBPD m128 xmm
func SUBPD(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "SUBPD",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "SUBPD",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("SUBPD: bad operands")
}
// SUBPS: Subtract Packed Single-Precision Floating-Point Values.
//
// Forms:
//
// SUBPS xmm xmm
// SUBPS m128 xmm
func SUBPS(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "SUBPS",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "SUBPS",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE"},
}, nil
}
return nil, errors.New("SUBPS: bad operands")
}
// SUBQ: Subtract.
//
// Forms:
//
// SUBQ imm32 rax
// SUBQ imm8 r64
// SUBQ imm32 r64
// SUBQ r64 r64
// SUBQ m64 r64
// SUBQ imm8 m64
// SUBQ imm32 m64
// SUBQ r64 m64
func SUBQ(imr, mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM32(imr) && operand.IsRAX(mr):
return &intrep.Instruction{
Opcode: "SUBQ",
Operands: []operand.Op{imr, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsIMM8(imr) && operand.IsR64(mr):
return &intrep.Instruction{
Opcode: "SUBQ",
Operands: []operand.Op{imr, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsIMM32(imr) && operand.IsR64(mr):
return &intrep.Instruction{
Opcode: "SUBQ",
Operands: []operand.Op{imr, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsR64(imr) && operand.IsR64(mr):
return &intrep.Instruction{
Opcode: "SUBQ",
Operands: []operand.Op{imr, mr},
Inputs: []operand.Op{imr, mr},
Outputs: []operand.Op{mr},
CancellingInputs: true,
}, nil
case operand.IsM64(imr) && operand.IsR64(mr):
return &intrep.Instruction{
Opcode: "SUBQ",
Operands: []operand.Op{imr, mr},
Inputs: []operand.Op{imr, mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsIMM8(imr) && operand.IsM64(mr):
return &intrep.Instruction{
Opcode: "SUBQ",
Operands: []operand.Op{imr, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsIMM32(imr) && operand.IsM64(mr):
return &intrep.Instruction{
Opcode: "SUBQ",
Operands: []operand.Op{imr, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsR64(imr) && operand.IsM64(mr):
return &intrep.Instruction{
Opcode: "SUBQ",
Operands: []operand.Op{imr, mr},
Inputs: []operand.Op{imr, mr},
Outputs: []operand.Op{mr},
}, nil
}
return nil, errors.New("SUBQ: bad operands")
}
// SUBSD: Subtract Scalar Double-Precision Floating-Point Values.
//
// Forms:
//
// SUBSD xmm xmm
// SUBSD m64 xmm
func SUBSD(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "SUBSD",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
case operand.IsM64(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "SUBSD",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("SUBSD: bad operands")
}
// SUBSS: Subtract Scalar Single-Precision Floating-Point Values.
//
// Forms:
//
// SUBSS xmm xmm
// SUBSS m32 xmm
func SUBSS(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "SUBSS",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE"},
}, nil
case operand.IsM32(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "SUBSS",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE"},
}, nil
}
return nil, errors.New("SUBSS: bad operands")
}
// SUBW: Subtract.
//
// Forms:
//
// SUBW imm16 ax
// SUBW imm8 r16
// SUBW imm16 r16
// SUBW r16 r16
// SUBW m16 r16
// SUBW imm8 m16
// SUBW imm16 m16
// SUBW r16 m16
func SUBW(imr, amr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM16(imr) && operand.IsAX(amr):
return &intrep.Instruction{
Opcode: "SUBW",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{amr},
Outputs: []operand.Op{amr},
}, nil
case operand.IsIMM8(imr) && operand.IsR16(amr):
return &intrep.Instruction{
Opcode: "SUBW",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{amr},
Outputs: []operand.Op{amr},
}, nil
case operand.IsIMM16(imr) && operand.IsR16(amr):
return &intrep.Instruction{
Opcode: "SUBW",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{amr},
Outputs: []operand.Op{amr},
}, nil
case operand.IsR16(imr) && operand.IsR16(amr):
return &intrep.Instruction{
Opcode: "SUBW",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{imr, amr},
Outputs: []operand.Op{amr},
CancellingInputs: true,
}, nil
case operand.IsM16(imr) && operand.IsR16(amr):
return &intrep.Instruction{
Opcode: "SUBW",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{imr, amr},
Outputs: []operand.Op{amr},
}, nil
case operand.IsIMM8(imr) && operand.IsM16(amr):
return &intrep.Instruction{
Opcode: "SUBW",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{amr},
Outputs: []operand.Op{amr},
}, nil
case operand.IsIMM16(imr) && operand.IsM16(amr):
return &intrep.Instruction{
Opcode: "SUBW",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{amr},
Outputs: []operand.Op{amr},
}, nil
case operand.IsR16(imr) && operand.IsM16(amr):
return &intrep.Instruction{
Opcode: "SUBW",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{imr, amr},
Outputs: []operand.Op{amr},
}, nil
}
return nil, errors.New("SUBW: bad operands")
}
// SYSCALL: Fast System Call.
//
// Forms:
//
// SYSCALL
func SYSCALL() (*intrep.Instruction, error) {
return &intrep.Instruction{
Opcode: "SYSCALL",
Operands: nil,
Inputs: []operand.Op{},
Outputs: []operand.Op{reg.R11, reg.RCX},
}, nil
}
// TESTB: Logical Compare.
//
// Forms:
//
// TESTB imm8 al
// TESTB imm8 r8
// TESTB r8 r8
// TESTB imm8 m8
// TESTB r8 m8
func TESTB(ir, amr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(ir) && operand.IsAL(amr):
return &intrep.Instruction{
Opcode: "TESTB",
Operands: []operand.Op{ir, amr},
Inputs: []operand.Op{amr},
Outputs: []operand.Op{},
}, nil
case operand.IsIMM8(ir) && operand.IsR8(amr):
return &intrep.Instruction{
Opcode: "TESTB",
Operands: []operand.Op{ir, amr},
Inputs: []operand.Op{amr},
Outputs: []operand.Op{},
}, nil
case operand.IsR8(ir) && operand.IsR8(amr):
return &intrep.Instruction{
Opcode: "TESTB",
Operands: []operand.Op{ir, amr},
Inputs: []operand.Op{ir, amr},
Outputs: []operand.Op{},
}, nil
case operand.IsIMM8(ir) && operand.IsM8(amr):
return &intrep.Instruction{
Opcode: "TESTB",
Operands: []operand.Op{ir, amr},
Inputs: []operand.Op{amr},
Outputs: []operand.Op{},
}, nil
case operand.IsR8(ir) && operand.IsM8(amr):
return &intrep.Instruction{
Opcode: "TESTB",
Operands: []operand.Op{ir, amr},
Inputs: []operand.Op{ir, amr},
Outputs: []operand.Op{},
}, nil
}
return nil, errors.New("TESTB: bad operands")
}
// TESTL: Logical Compare.
//
// Forms:
//
// TESTL imm32 eax
// TESTL imm32 r32
// TESTL r32 r32
// TESTL imm32 m32
// TESTL r32 m32
func TESTL(ir, emr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM32(ir) && operand.IsEAX(emr):
return &intrep.Instruction{
Opcode: "TESTL",
Operands: []operand.Op{ir, emr},
Inputs: []operand.Op{emr},
Outputs: []operand.Op{},
}, nil
case operand.IsIMM32(ir) && operand.IsR32(emr):
return &intrep.Instruction{
Opcode: "TESTL",
Operands: []operand.Op{ir, emr},
Inputs: []operand.Op{emr},
Outputs: []operand.Op{},
}, nil
case operand.IsR32(ir) && operand.IsR32(emr):
return &intrep.Instruction{
Opcode: "TESTL",
Operands: []operand.Op{ir, emr},
Inputs: []operand.Op{ir, emr},
Outputs: []operand.Op{},
}, nil
case operand.IsIMM32(ir) && operand.IsM32(emr):
return &intrep.Instruction{
Opcode: "TESTL",
Operands: []operand.Op{ir, emr},
Inputs: []operand.Op{emr},
Outputs: []operand.Op{},
}, nil
case operand.IsR32(ir) && operand.IsM32(emr):
return &intrep.Instruction{
Opcode: "TESTL",
Operands: []operand.Op{ir, emr},
Inputs: []operand.Op{ir, emr},
Outputs: []operand.Op{},
}, nil
}
return nil, errors.New("TESTL: bad operands")
}
// TESTQ: Logical Compare.
//
// Forms:
//
// TESTQ imm32 rax
// TESTQ imm32 r64
// TESTQ r64 r64
// TESTQ imm32 m64
// TESTQ r64 m64
func TESTQ(ir, mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM32(ir) && operand.IsRAX(mr):
return &intrep.Instruction{
Opcode: "TESTQ",
Operands: []operand.Op{ir, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{},
}, nil
case operand.IsIMM32(ir) && operand.IsR64(mr):
return &intrep.Instruction{
Opcode: "TESTQ",
Operands: []operand.Op{ir, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{},
}, nil
case operand.IsR64(ir) && operand.IsR64(mr):
return &intrep.Instruction{
Opcode: "TESTQ",
Operands: []operand.Op{ir, mr},
Inputs: []operand.Op{ir, mr},
Outputs: []operand.Op{},
}, nil
case operand.IsIMM32(ir) && operand.IsM64(mr):
return &intrep.Instruction{
Opcode: "TESTQ",
Operands: []operand.Op{ir, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{},
}, nil
case operand.IsR64(ir) && operand.IsM64(mr):
return &intrep.Instruction{
Opcode: "TESTQ",
Operands: []operand.Op{ir, mr},
Inputs: []operand.Op{ir, mr},
Outputs: []operand.Op{},
}, nil
}
return nil, errors.New("TESTQ: bad operands")
}
// TESTW: Logical Compare.
//
// Forms:
//
// TESTW imm16 ax
// TESTW imm16 r16
// TESTW r16 r16
// TESTW imm16 m16
// TESTW r16 m16
func TESTW(ir, amr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM16(ir) && operand.IsAX(amr):
return &intrep.Instruction{
Opcode: "TESTW",
Operands: []operand.Op{ir, amr},
Inputs: []operand.Op{amr},
Outputs: []operand.Op{},
}, nil
case operand.IsIMM16(ir) && operand.IsR16(amr):
return &intrep.Instruction{
Opcode: "TESTW",
Operands: []operand.Op{ir, amr},
Inputs: []operand.Op{amr},
Outputs: []operand.Op{},
}, nil
case operand.IsR16(ir) && operand.IsR16(amr):
return &intrep.Instruction{
Opcode: "TESTW",
Operands: []operand.Op{ir, amr},
Inputs: []operand.Op{ir, amr},
Outputs: []operand.Op{},
}, nil
case operand.IsIMM16(ir) && operand.IsM16(amr):
return &intrep.Instruction{
Opcode: "TESTW",
Operands: []operand.Op{ir, amr},
Inputs: []operand.Op{amr},
Outputs: []operand.Op{},
}, nil
case operand.IsR16(ir) && operand.IsM16(amr):
return &intrep.Instruction{
Opcode: "TESTW",
Operands: []operand.Op{ir, amr},
Inputs: []operand.Op{ir, amr},
Outputs: []operand.Op{},
}, nil
}
return nil, errors.New("TESTW: bad operands")
}
// TZCNTL: Count the Number of Trailing Zero Bits.
//
// Forms:
//
// TZCNTL r32 r32
// TZCNTL m32 r32
func TZCNTL(mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR32(mr) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "TZCNTL",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{r},
ISA: []string{"BMI"},
}, nil
case operand.IsM32(mr) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "TZCNTL",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{r},
ISA: []string{"BMI"},
}, nil
}
return nil, errors.New("TZCNTL: bad operands")
}
// TZCNTQ: Count the Number of Trailing Zero Bits.
//
// Forms:
//
// TZCNTQ r64 r64
// TZCNTQ m64 r64
func TZCNTQ(mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR64(mr) && operand.IsR64(r):
return &intrep.Instruction{
Opcode: "TZCNTQ",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{r},
ISA: []string{"BMI"},
}, nil
case operand.IsM64(mr) && operand.IsR64(r):
return &intrep.Instruction{
Opcode: "TZCNTQ",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{r},
ISA: []string{"BMI"},
}, nil
}
return nil, errors.New("TZCNTQ: bad operands")
}
// TZCNTW: Count the Number of Trailing Zero Bits.
//
// Forms:
//
// TZCNTW r16 r16
// TZCNTW m16 r16
func TZCNTW(mr, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR16(mr) && operand.IsR16(r):
return &intrep.Instruction{
Opcode: "TZCNTW",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{r},
ISA: []string{"BMI"},
}, nil
case operand.IsM16(mr) && operand.IsR16(r):
return &intrep.Instruction{
Opcode: "TZCNTW",
Operands: []operand.Op{mr, r},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{r},
ISA: []string{"BMI"},
}, nil
}
return nil, errors.New("TZCNTW: bad operands")
}
// UCOMISD: Unordered Compare Scalar Double-Precision Floating-Point Values and Set EFLAGS.
//
// Forms:
//
// UCOMISD xmm xmm
// UCOMISD m64 xmm
func UCOMISD(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "UCOMISD",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{},
ISA: []string{"SSE2"},
}, nil
case operand.IsM64(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "UCOMISD",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("UCOMISD: bad operands")
}
// UCOMISS: Unordered Compare Scalar Single-Precision Floating-Point Values and Set EFLAGS.
//
// Forms:
//
// UCOMISS xmm xmm
// UCOMISS m32 xmm
func UCOMISS(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "UCOMISS",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{},
ISA: []string{"SSE"},
}, nil
case operand.IsM32(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "UCOMISS",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{},
ISA: []string{"SSE"},
}, nil
}
return nil, errors.New("UCOMISS: bad operands")
}
// UD2: Undefined Instruction.
//
// Forms:
//
// UD2
func UD2() (*intrep.Instruction, error) {
return &intrep.Instruction{
Opcode: "UD2",
Operands: nil,
Inputs: []operand.Op{},
Outputs: []operand.Op{},
}, nil
}
// UNPCKHPD: Unpack and Interleave High Packed Double-Precision Floating-Point Values.
//
// Forms:
//
// UNPCKHPD xmm xmm
// UNPCKHPD m128 xmm
func UNPCKHPD(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "UNPCKHPD",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "UNPCKHPD",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("UNPCKHPD: bad operands")
}
// UNPCKHPS: Unpack and Interleave High Packed Single-Precision Floating-Point Values.
//
// Forms:
//
// UNPCKHPS xmm xmm
// UNPCKHPS m128 xmm
func UNPCKHPS(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "UNPCKHPS",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "UNPCKHPS",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE"},
}, nil
}
return nil, errors.New("UNPCKHPS: bad operands")
}
// UNPCKLPD: Unpack and Interleave Low Packed Double-Precision Floating-Point Values.
//
// Forms:
//
// UNPCKLPD xmm xmm
// UNPCKLPD m128 xmm
func UNPCKLPD(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "UNPCKLPD",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "UNPCKLPD",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("UNPCKLPD: bad operands")
}
// UNPCKLPS: Unpack and Interleave Low Packed Single-Precision Floating-Point Values.
//
// Forms:
//
// UNPCKLPS xmm xmm
// UNPCKLPS m128 xmm
func UNPCKLPS(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "UNPCKLPS",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "UNPCKLPS",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE"},
}, nil
}
return nil, errors.New("UNPCKLPS: bad operands")
}
// VADDPD: Add Packed Double-Precision Floating-Point Values.
//
// Forms:
//
// VADDPD xmm xmm xmm
// VADDPD m128 xmm xmm
// VADDPD ymm ymm ymm
// VADDPD m256 ymm ymm
func VADDPD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VADDPD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VADDPD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VADDPD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VADDPD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VADDPD: bad operands")
}
// VADDPS: Add Packed Single-Precision Floating-Point Values.
//
// Forms:
//
// VADDPS xmm xmm xmm
// VADDPS m128 xmm xmm
// VADDPS ymm ymm ymm
// VADDPS m256 ymm ymm
func VADDPS(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VADDPS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VADDPS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VADDPS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VADDPS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VADDPS: bad operands")
}
// VADDSD: Add Scalar Double-Precision Floating-Point Values.
//
// Forms:
//
// VADDSD xmm xmm xmm
// VADDSD m64 xmm xmm
func VADDSD(mx, x, x1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VADDSD",
Operands: []operand.Op{mx, x, x1},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x1},
ISA: []string{"AVX"},
}, nil
case operand.IsM64(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VADDSD",
Operands: []operand.Op{mx, x, x1},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x1},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VADDSD: bad operands")
}
// VADDSS: Add Scalar Single-Precision Floating-Point Values.
//
// Forms:
//
// VADDSS xmm xmm xmm
// VADDSS m32 xmm xmm
func VADDSS(mx, x, x1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VADDSS",
Operands: []operand.Op{mx, x, x1},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x1},
ISA: []string{"AVX"},
}, nil
case operand.IsM32(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VADDSS",
Operands: []operand.Op{mx, x, x1},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x1},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VADDSS: bad operands")
}
// VADDSUBPD: Packed Double-FP Add/Subtract.
//
// Forms:
//
// VADDSUBPD xmm xmm xmm
// VADDSUBPD m128 xmm xmm
// VADDSUBPD ymm ymm ymm
// VADDSUBPD m256 ymm ymm
func VADDSUBPD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VADDSUBPD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VADDSUBPD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VADDSUBPD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VADDSUBPD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VADDSUBPD: bad operands")
}
// VADDSUBPS: Packed Single-FP Add/Subtract.
//
// Forms:
//
// VADDSUBPS xmm xmm xmm
// VADDSUBPS m128 xmm xmm
// VADDSUBPS ymm ymm ymm
// VADDSUBPS m256 ymm ymm
func VADDSUBPS(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VADDSUBPS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VADDSUBPS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VADDSUBPS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VADDSUBPS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VADDSUBPS: bad operands")
}
// VAESDEC: Perform One Round of an AES Decryption Flow.
//
// Forms:
//
// VAESDEC xmm xmm xmm
// VAESDEC m128 xmm xmm
func VAESDEC(mx, x, x1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VAESDEC",
Operands: []operand.Op{mx, x, x1},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x1},
ISA: []string{"AVX", "AES"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VAESDEC",
Operands: []operand.Op{mx, x, x1},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x1},
ISA: []string{"AVX", "AES"},
}, nil
}
return nil, errors.New("VAESDEC: bad operands")
}
// VAESDECLAST: Perform Last Round of an AES Decryption Flow.
//
// Forms:
//
// VAESDECLAST xmm xmm xmm
// VAESDECLAST m128 xmm xmm
func VAESDECLAST(mx, x, x1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VAESDECLAST",
Operands: []operand.Op{mx, x, x1},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x1},
ISA: []string{"AVX", "AES"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VAESDECLAST",
Operands: []operand.Op{mx, x, x1},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x1},
ISA: []string{"AVX", "AES"},
}, nil
}
return nil, errors.New("VAESDECLAST: bad operands")
}
// VAESENC: Perform One Round of an AES Encryption Flow.
//
// Forms:
//
// VAESENC xmm xmm xmm
// VAESENC m128 xmm xmm
func VAESENC(mx, x, x1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VAESENC",
Operands: []operand.Op{mx, x, x1},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x1},
ISA: []string{"AVX", "AES"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VAESENC",
Operands: []operand.Op{mx, x, x1},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x1},
ISA: []string{"AVX", "AES"},
}, nil
}
return nil, errors.New("VAESENC: bad operands")
}
// VAESENCLAST: Perform Last Round of an AES Encryption Flow.
//
// Forms:
//
// VAESENCLAST xmm xmm xmm
// VAESENCLAST m128 xmm xmm
func VAESENCLAST(mx, x, x1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VAESENCLAST",
Operands: []operand.Op{mx, x, x1},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x1},
ISA: []string{"AVX", "AES"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VAESENCLAST",
Operands: []operand.Op{mx, x, x1},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x1},
ISA: []string{"AVX", "AES"},
}, nil
}
return nil, errors.New("VAESENCLAST: bad operands")
}
// VAESIMC: Perform the AES InvMixColumn Transformation.
//
// Forms:
//
// VAESIMC xmm xmm
// VAESIMC m128 xmm
func VAESIMC(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "VAESIMC",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"AVX", "AES"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "VAESIMC",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"AVX", "AES"},
}, nil
}
return nil, errors.New("VAESIMC: bad operands")
}
// VAESKEYGENASSIST: AES Round Key Generation Assist.
//
// Forms:
//
// VAESKEYGENASSIST imm8 xmm xmm
// VAESKEYGENASSIST imm8 m128 xmm
func VAESKEYGENASSIST(i, mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(i) && operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "VAESKEYGENASSIST",
Operands: []operand.Op{i, mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"AVX", "AES"},
}, nil
case operand.IsIMM8(i) && operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "VAESKEYGENASSIST",
Operands: []operand.Op{i, mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"AVX", "AES"},
}, nil
}
return nil, errors.New("VAESKEYGENASSIST: bad operands")
}
// VANDNPD: Bitwise Logical AND NOT of Packed Double-Precision Floating-Point Values.
//
// Forms:
//
// VANDNPD xmm xmm xmm
// VANDNPD m128 xmm xmm
// VANDNPD ymm ymm ymm
// VANDNPD m256 ymm ymm
func VANDNPD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VANDNPD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
CancellingInputs: true,
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VANDNPD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VANDNPD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
CancellingInputs: true,
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VANDNPD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VANDNPD: bad operands")
}
// VANDNPS: Bitwise Logical AND NOT of Packed Single-Precision Floating-Point Values.
//
// Forms:
//
// VANDNPS xmm xmm xmm
// VANDNPS m128 xmm xmm
// VANDNPS ymm ymm ymm
// VANDNPS m256 ymm ymm
func VANDNPS(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VANDNPS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
CancellingInputs: true,
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VANDNPS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VANDNPS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
CancellingInputs: true,
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VANDNPS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VANDNPS: bad operands")
}
// VANDPD: Bitwise Logical AND of Packed Double-Precision Floating-Point Values.
//
// Forms:
//
// VANDPD xmm xmm xmm
// VANDPD m128 xmm xmm
// VANDPD ymm ymm ymm
// VANDPD m256 ymm ymm
func VANDPD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VANDPD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VANDPD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VANDPD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VANDPD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VANDPD: bad operands")
}
// VANDPS: Bitwise Logical AND of Packed Single-Precision Floating-Point Values.
//
// Forms:
//
// VANDPS xmm xmm xmm
// VANDPS m128 xmm xmm
// VANDPS ymm ymm ymm
// VANDPS m256 ymm ymm
func VANDPS(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VANDPS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VANDPS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VANDPS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VANDPS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VANDPS: bad operands")
}
// VBLENDPD: Blend Packed Double Precision Floating-Point Values.
//
// Forms:
//
// VBLENDPD imm8 xmm xmm xmm
// VBLENDPD imm8 m128 xmm xmm
// VBLENDPD imm8 ymm ymm ymm
// VBLENDPD imm8 m256 ymm ymm
func VBLENDPD(i, mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(i) && operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VBLENDPD",
Operands: []operand.Op{i, mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsIMM8(i) && operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VBLENDPD",
Operands: []operand.Op{i, mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsIMM8(i) && operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VBLENDPD",
Operands: []operand.Op{i, mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsIMM8(i) && operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VBLENDPD",
Operands: []operand.Op{i, mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VBLENDPD: bad operands")
}
// VBLENDPS: Blend Packed Single Precision Floating-Point Values.
//
// Forms:
//
// VBLENDPS imm8 xmm xmm xmm
// VBLENDPS imm8 m128 xmm xmm
// VBLENDPS imm8 ymm ymm ymm
// VBLENDPS imm8 m256 ymm ymm
func VBLENDPS(i, mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(i) && operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VBLENDPS",
Operands: []operand.Op{i, mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsIMM8(i) && operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VBLENDPS",
Operands: []operand.Op{i, mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsIMM8(i) && operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VBLENDPS",
Operands: []operand.Op{i, mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsIMM8(i) && operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VBLENDPS",
Operands: []operand.Op{i, mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VBLENDPS: bad operands")
}
// VBLENDVPD: Variable Blend Packed Double Precision Floating-Point Values.
//
// Forms:
//
// VBLENDVPD xmm xmm xmm xmm
// VBLENDVPD xmm m128 xmm xmm
// VBLENDVPD ymm ymm ymm ymm
// VBLENDVPD ymm m256 ymm ymm
func VBLENDVPD(xy, mxy, xy1, xy2 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(xy) && operand.IsXMM(mxy) && operand.IsXMM(xy1) && operand.IsXMM(xy2):
return &intrep.Instruction{
Opcode: "VBLENDVPD",
Operands: []operand.Op{xy, mxy, xy1, xy2},
Inputs: []operand.Op{xy, mxy, xy1},
Outputs: []operand.Op{xy2},
ISA: []string{"AVX"},
}, nil
case operand.IsXMM(xy) && operand.IsM128(mxy) && operand.IsXMM(xy1) && operand.IsXMM(xy2):
return &intrep.Instruction{
Opcode: "VBLENDVPD",
Operands: []operand.Op{xy, mxy, xy1, xy2},
Inputs: []operand.Op{xy, mxy, xy1},
Outputs: []operand.Op{xy2},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(xy) && operand.IsYMM(mxy) && operand.IsYMM(xy1) && operand.IsYMM(xy2):
return &intrep.Instruction{
Opcode: "VBLENDVPD",
Operands: []operand.Op{xy, mxy, xy1, xy2},
Inputs: []operand.Op{xy, mxy, xy1},
Outputs: []operand.Op{xy2},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(xy) && operand.IsM256(mxy) && operand.IsYMM(xy1) && operand.IsYMM(xy2):
return &intrep.Instruction{
Opcode: "VBLENDVPD",
Operands: []operand.Op{xy, mxy, xy1, xy2},
Inputs: []operand.Op{xy, mxy, xy1},
Outputs: []operand.Op{xy2},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VBLENDVPD: bad operands")
}
// VBLENDVPS: Variable Blend Packed Single Precision Floating-Point Values.
//
// Forms:
//
// VBLENDVPS xmm xmm xmm xmm
// VBLENDVPS xmm m128 xmm xmm
// VBLENDVPS ymm ymm ymm ymm
// VBLENDVPS ymm m256 ymm ymm
func VBLENDVPS(xy, mxy, xy1, xy2 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(xy) && operand.IsXMM(mxy) && operand.IsXMM(xy1) && operand.IsXMM(xy2):
return &intrep.Instruction{
Opcode: "VBLENDVPS",
Operands: []operand.Op{xy, mxy, xy1, xy2},
Inputs: []operand.Op{xy, mxy, xy1},
Outputs: []operand.Op{xy2},
ISA: []string{"AVX"},
}, nil
case operand.IsXMM(xy) && operand.IsM128(mxy) && operand.IsXMM(xy1) && operand.IsXMM(xy2):
return &intrep.Instruction{
Opcode: "VBLENDVPS",
Operands: []operand.Op{xy, mxy, xy1, xy2},
Inputs: []operand.Op{xy, mxy, xy1},
Outputs: []operand.Op{xy2},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(xy) && operand.IsYMM(mxy) && operand.IsYMM(xy1) && operand.IsYMM(xy2):
return &intrep.Instruction{
Opcode: "VBLENDVPS",
Operands: []operand.Op{xy, mxy, xy1, xy2},
Inputs: []operand.Op{xy, mxy, xy1},
Outputs: []operand.Op{xy2},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(xy) && operand.IsM256(mxy) && operand.IsYMM(xy1) && operand.IsYMM(xy2):
return &intrep.Instruction{
Opcode: "VBLENDVPS",
Operands: []operand.Op{xy, mxy, xy1, xy2},
Inputs: []operand.Op{xy, mxy, xy1},
Outputs: []operand.Op{xy2},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VBLENDVPS: bad operands")
}
// VBROADCASTF128: Broadcast 128 Bit of Floating-Point Data.
//
// Forms:
//
// VBROADCASTF128 m128 ymm
func VBROADCASTF128(m, y operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsM128(m) && operand.IsYMM(y):
return &intrep.Instruction{
Opcode: "VBROADCASTF128",
Operands: []operand.Op{m, y},
Inputs: []operand.Op{m},
Outputs: []operand.Op{y},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VBROADCASTF128: bad operands")
}
// VBROADCASTI128: Broadcast 128 Bits of Integer Data.
//
// Forms:
//
// VBROADCASTI128 m128 ymm
func VBROADCASTI128(m, y operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsM128(m) && operand.IsYMM(y):
return &intrep.Instruction{
Opcode: "VBROADCASTI128",
Operands: []operand.Op{m, y},
Inputs: []operand.Op{m},
Outputs: []operand.Op{y},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VBROADCASTI128: bad operands")
}
// VBROADCASTSD: Broadcast Double-Precision Floating-Point Element.
//
// Forms:
//
// VBROADCASTSD xmm ymm
// VBROADCASTSD m64 ymm
func VBROADCASTSD(mx, y operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsYMM(y):
return &intrep.Instruction{
Opcode: "VBROADCASTSD",
Operands: []operand.Op{mx, y},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{y},
ISA: []string{"AVX2"},
}, nil
case operand.IsM64(mx) && operand.IsYMM(y):
return &intrep.Instruction{
Opcode: "VBROADCASTSD",
Operands: []operand.Op{mx, y},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{y},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VBROADCASTSD: bad operands")
}
// VBROADCASTSS: Broadcast Single-Precision Floating-Point Element.
//
// Forms:
//
// VBROADCASTSS xmm xmm
// VBROADCASTSS m32 xmm
// VBROADCASTSS xmm ymm
// VBROADCASTSS m32 ymm
func VBROADCASTSS(mx, xy operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(xy):
return &intrep.Instruction{
Opcode: "VBROADCASTSS",
Operands: []operand.Op{mx, xy},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{xy},
ISA: []string{"AVX2"},
}, nil
case operand.IsM32(mx) && operand.IsXMM(xy):
return &intrep.Instruction{
Opcode: "VBROADCASTSS",
Operands: []operand.Op{mx, xy},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsXMM(mx) && operand.IsYMM(xy):
return &intrep.Instruction{
Opcode: "VBROADCASTSS",
Operands: []operand.Op{mx, xy},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{xy},
ISA: []string{"AVX2"},
}, nil
case operand.IsM32(mx) && operand.IsYMM(xy):
return &intrep.Instruction{
Opcode: "VBROADCASTSS",
Operands: []operand.Op{mx, xy},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VBROADCASTSS: bad operands")
}
// VCMPPD: Compare Packed Double-Precision Floating-Point Values.
//
// Forms:
//
// VCMPPD imm8 xmm xmm xmm
// VCMPPD imm8 m128 xmm xmm
// VCMPPD imm8 ymm ymm ymm
// VCMPPD imm8 m256 ymm ymm
func VCMPPD(i, mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(i) && operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VCMPPD",
Operands: []operand.Op{i, mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsIMM8(i) && operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VCMPPD",
Operands: []operand.Op{i, mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsIMM8(i) && operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VCMPPD",
Operands: []operand.Op{i, mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsIMM8(i) && operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VCMPPD",
Operands: []operand.Op{i, mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VCMPPD: bad operands")
}
// VCMPPS: Compare Packed Single-Precision Floating-Point Values.
//
// Forms:
//
// VCMPPS imm8 xmm xmm xmm
// VCMPPS imm8 m128 xmm xmm
// VCMPPS imm8 ymm ymm ymm
// VCMPPS imm8 m256 ymm ymm
func VCMPPS(i, mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(i) && operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VCMPPS",
Operands: []operand.Op{i, mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsIMM8(i) && operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VCMPPS",
Operands: []operand.Op{i, mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsIMM8(i) && operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VCMPPS",
Operands: []operand.Op{i, mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsIMM8(i) && operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VCMPPS",
Operands: []operand.Op{i, mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VCMPPS: bad operands")
}
// VCMPSD: Compare Scalar Double-Precision Floating-Point Values.
//
// Forms:
//
// VCMPSD imm8 xmm xmm xmm
// VCMPSD imm8 m64 xmm xmm
func VCMPSD(i, mx, x, x1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(i) && operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VCMPSD",
Operands: []operand.Op{i, mx, x, x1},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x1},
ISA: []string{"AVX"},
}, nil
case operand.IsIMM8(i) && operand.IsM64(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VCMPSD",
Operands: []operand.Op{i, mx, x, x1},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x1},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VCMPSD: bad operands")
}
// VCMPSS: Compare Scalar Single-Precision Floating-Point Values.
//
// Forms:
//
// VCMPSS imm8 xmm xmm xmm
// VCMPSS imm8 m32 xmm xmm
func VCMPSS(i, mx, x, x1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(i) && operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VCMPSS",
Operands: []operand.Op{i, mx, x, x1},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x1},
ISA: []string{"AVX"},
}, nil
case operand.IsIMM8(i) && operand.IsM32(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VCMPSS",
Operands: []operand.Op{i, mx, x, x1},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x1},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VCMPSS: bad operands")
}
// VCOMISD: Compare Scalar Ordered Double-Precision Floating-Point Values and Set EFLAGS.
//
// Forms:
//
// VCOMISD xmm xmm
// VCOMISD m64 xmm
func VCOMISD(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "VCOMISD",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{},
ISA: []string{"AVX"},
}, nil
case operand.IsM64(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "VCOMISD",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VCOMISD: bad operands")
}
// VCOMISS: Compare Scalar Ordered Single-Precision Floating-Point Values and Set EFLAGS.
//
// Forms:
//
// VCOMISS xmm xmm
// VCOMISS m32 xmm
func VCOMISS(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "VCOMISS",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{},
ISA: []string{"AVX"},
}, nil
case operand.IsM32(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "VCOMISS",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VCOMISS: bad operands")
}
// VCVTDQ2PD: Convert Packed Dword Integers to Packed Double-Precision FP Values.
//
// Forms:
//
// VCVTDQ2PD xmm xmm
// VCVTDQ2PD m64 xmm
// VCVTDQ2PD xmm ymm
// VCVTDQ2PD m128 ymm
func VCVTDQ2PD(mx, xy operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(xy):
return &intrep.Instruction{
Opcode: "VCVTDQ2PD",
Operands: []operand.Op{mx, xy},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsM64(mx) && operand.IsXMM(xy):
return &intrep.Instruction{
Opcode: "VCVTDQ2PD",
Operands: []operand.Op{mx, xy},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsXMM(mx) && operand.IsYMM(xy):
return &intrep.Instruction{
Opcode: "VCVTDQ2PD",
Operands: []operand.Op{mx, xy},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mx) && operand.IsYMM(xy):
return &intrep.Instruction{
Opcode: "VCVTDQ2PD",
Operands: []operand.Op{mx, xy},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VCVTDQ2PD: bad operands")
}
// VCVTDQ2PS: Convert Packed Dword Integers to Packed Single-Precision FP Values.
//
// Forms:
//
// VCVTDQ2PS xmm xmm
// VCVTDQ2PS m128 xmm
// VCVTDQ2PS ymm ymm
// VCVTDQ2PS m256 ymm
func VCVTDQ2PS(mxy, xy operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy):
return &intrep.Instruction{
Opcode: "VCVTDQ2PS",
Operands: []operand.Op{mxy, xy},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy):
return &intrep.Instruction{
Opcode: "VCVTDQ2PS",
Operands: []operand.Op{mxy, xy},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy):
return &intrep.Instruction{
Opcode: "VCVTDQ2PS",
Operands: []operand.Op{mxy, xy},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy):
return &intrep.Instruction{
Opcode: "VCVTDQ2PS",
Operands: []operand.Op{mxy, xy},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VCVTDQ2PS: bad operands")
}
// VCVTPD2DQX: Convert Packed Double-Precision FP Values to Packed Dword Integers.
//
// Forms:
//
// VCVTPD2DQX xmm xmm
// VCVTPD2DQX m128 xmm
func VCVTPD2DQX(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "VCVTPD2DQX",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "VCVTPD2DQX",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VCVTPD2DQX: bad operands")
}
// VCVTPD2DQY: Convert Packed Double-Precision FP Values to Packed Dword Integers.
//
// Forms:
//
// VCVTPD2DQY ymm xmm
// VCVTPD2DQY m256 xmm
func VCVTPD2DQY(my, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsYMM(my) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "VCVTPD2DQY",
Operands: []operand.Op{my, x},
Inputs: []operand.Op{my},
Outputs: []operand.Op{x},
ISA: []string{"AVX"},
}, nil
case operand.IsM256(my) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "VCVTPD2DQY",
Operands: []operand.Op{my, x},
Inputs: []operand.Op{my},
Outputs: []operand.Op{x},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VCVTPD2DQY: bad operands")
}
// VCVTPD2PSX: Convert Packed Double-Precision FP Values to Packed Single-Precision FP Values.
//
// Forms:
//
// VCVTPD2PSX xmm xmm
// VCVTPD2PSX m128 xmm
func VCVTPD2PSX(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "VCVTPD2PSX",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "VCVTPD2PSX",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VCVTPD2PSX: bad operands")
}
// VCVTPD2PSY: Convert Packed Double-Precision FP Values to Packed Single-Precision FP Values.
//
// Forms:
//
// VCVTPD2PSY ymm xmm
// VCVTPD2PSY m256 xmm
func VCVTPD2PSY(my, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsYMM(my) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "VCVTPD2PSY",
Operands: []operand.Op{my, x},
Inputs: []operand.Op{my},
Outputs: []operand.Op{x},
ISA: []string{"AVX"},
}, nil
case operand.IsM256(my) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "VCVTPD2PSY",
Operands: []operand.Op{my, x},
Inputs: []operand.Op{my},
Outputs: []operand.Op{x},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VCVTPD2PSY: bad operands")
}
// VCVTPH2PS: Convert Half-Precision FP Values to Single-Precision FP Values.
//
// Forms:
//
// VCVTPH2PS xmm xmm
// VCVTPH2PS m64 xmm
// VCVTPH2PS xmm ymm
// VCVTPH2PS m128 ymm
func VCVTPH2PS(mx, xy operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(xy):
return &intrep.Instruction{
Opcode: "VCVTPH2PS",
Operands: []operand.Op{mx, xy},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{xy},
ISA: []string{"F16C"},
}, nil
case operand.IsM64(mx) && operand.IsXMM(xy):
return &intrep.Instruction{
Opcode: "VCVTPH2PS",
Operands: []operand.Op{mx, xy},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{xy},
ISA: []string{"F16C"},
}, nil
case operand.IsXMM(mx) && operand.IsYMM(xy):
return &intrep.Instruction{
Opcode: "VCVTPH2PS",
Operands: []operand.Op{mx, xy},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{xy},
ISA: []string{"F16C"},
}, nil
case operand.IsM128(mx) && operand.IsYMM(xy):
return &intrep.Instruction{
Opcode: "VCVTPH2PS",
Operands: []operand.Op{mx, xy},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{xy},
ISA: []string{"F16C"},
}, nil
}
return nil, errors.New("VCVTPH2PS: bad operands")
}
// VCVTPS2DQ: Convert Packed Single-Precision FP Values to Packed Dword Integers.
//
// Forms:
//
// VCVTPS2DQ xmm xmm
// VCVTPS2DQ m128 xmm
// VCVTPS2DQ ymm ymm
// VCVTPS2DQ m256 ymm
func VCVTPS2DQ(mxy, xy operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy):
return &intrep.Instruction{
Opcode: "VCVTPS2DQ",
Operands: []operand.Op{mxy, xy},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy):
return &intrep.Instruction{
Opcode: "VCVTPS2DQ",
Operands: []operand.Op{mxy, xy},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy):
return &intrep.Instruction{
Opcode: "VCVTPS2DQ",
Operands: []operand.Op{mxy, xy},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy):
return &intrep.Instruction{
Opcode: "VCVTPS2DQ",
Operands: []operand.Op{mxy, xy},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VCVTPS2DQ: bad operands")
}
// VCVTPS2PD: Convert Packed Single-Precision FP Values to Packed Double-Precision FP Values.
//
// Forms:
//
// VCVTPS2PD xmm xmm
// VCVTPS2PD m64 xmm
// VCVTPS2PD xmm ymm
// VCVTPS2PD m128 ymm
func VCVTPS2PD(mx, xy operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(xy):
return &intrep.Instruction{
Opcode: "VCVTPS2PD",
Operands: []operand.Op{mx, xy},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsM64(mx) && operand.IsXMM(xy):
return &intrep.Instruction{
Opcode: "VCVTPS2PD",
Operands: []operand.Op{mx, xy},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsXMM(mx) && operand.IsYMM(xy):
return &intrep.Instruction{
Opcode: "VCVTPS2PD",
Operands: []operand.Op{mx, xy},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mx) && operand.IsYMM(xy):
return &intrep.Instruction{
Opcode: "VCVTPS2PD",
Operands: []operand.Op{mx, xy},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VCVTPS2PD: bad operands")
}
// VCVTPS2PH: Convert Single-Precision FP value to Half-Precision FP value.
//
// Forms:
//
// VCVTPS2PH imm8 xmm xmm
// VCVTPS2PH imm8 ymm xmm
// VCVTPS2PH imm8 xmm m64
// VCVTPS2PH imm8 ymm m128
func VCVTPS2PH(i, xy, mx operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(i) && operand.IsXMM(xy) && operand.IsXMM(mx):
return &intrep.Instruction{
Opcode: "VCVTPS2PH",
Operands: []operand.Op{i, xy, mx},
Inputs: []operand.Op{xy},
Outputs: []operand.Op{mx},
ISA: []string{"F16C"},
}, nil
case operand.IsIMM8(i) && operand.IsYMM(xy) && operand.IsXMM(mx):
return &intrep.Instruction{
Opcode: "VCVTPS2PH",
Operands: []operand.Op{i, xy, mx},
Inputs: []operand.Op{xy},
Outputs: []operand.Op{mx},
ISA: []string{"F16C"},
}, nil
case operand.IsIMM8(i) && operand.IsXMM(xy) && operand.IsM64(mx):
return &intrep.Instruction{
Opcode: "VCVTPS2PH",
Operands: []operand.Op{i, xy, mx},
Inputs: []operand.Op{xy},
Outputs: []operand.Op{mx},
ISA: []string{"F16C"},
}, nil
case operand.IsIMM8(i) && operand.IsYMM(xy) && operand.IsM128(mx):
return &intrep.Instruction{
Opcode: "VCVTPS2PH",
Operands: []operand.Op{i, xy, mx},
Inputs: []operand.Op{xy},
Outputs: []operand.Op{mx},
ISA: []string{"F16C"},
}, nil
}
return nil, errors.New("VCVTPS2PH: bad operands")
}
// VCVTSD2SI: Convert Scalar Double-Precision FP Value to Integer.
//
// Forms:
//
// VCVTSD2SI xmm r32
// VCVTSD2SI m64 r32
func VCVTSD2SI(mx, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "VCVTSD2SI",
Operands: []operand.Op{mx, r},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{r},
ISA: []string{"AVX"},
}, nil
case operand.IsM64(mx) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "VCVTSD2SI",
Operands: []operand.Op{mx, r},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{r},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VCVTSD2SI: bad operands")
}
// VCVTSD2SIQ: Convert Scalar Double-Precision FP Value to Integer.
//
// Forms:
//
// VCVTSD2SIQ xmm r64
// VCVTSD2SIQ m64 r64
func VCVTSD2SIQ(mx, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsR64(r):
return &intrep.Instruction{
Opcode: "VCVTSD2SIQ",
Operands: []operand.Op{mx, r},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{r},
ISA: []string{"AVX"},
}, nil
case operand.IsM64(mx) && operand.IsR64(r):
return &intrep.Instruction{
Opcode: "VCVTSD2SIQ",
Operands: []operand.Op{mx, r},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{r},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VCVTSD2SIQ: bad operands")
}
// VCVTSD2SS: Convert Scalar Double-Precision FP Value to Scalar Single-Precision FP Value.
//
// Forms:
//
// VCVTSD2SS xmm xmm xmm
// VCVTSD2SS m64 xmm xmm
func VCVTSD2SS(mx, x, x1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VCVTSD2SS",
Operands: []operand.Op{mx, x, x1},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x1},
ISA: []string{"AVX"},
}, nil
case operand.IsM64(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VCVTSD2SS",
Operands: []operand.Op{mx, x, x1},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x1},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VCVTSD2SS: bad operands")
}
// VCVTSI2SDL: Convert Dword Integer to Scalar Double-Precision FP Value.
//
// Forms:
//
// VCVTSI2SDL r32 xmm xmm
// VCVTSI2SDL m32 xmm xmm
func VCVTSI2SDL(mr, x, x1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR32(mr) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VCVTSI2SDL",
Operands: []operand.Op{mr, x, x1},
Inputs: []operand.Op{mr, x},
Outputs: []operand.Op{x1},
ISA: []string{"AVX"},
}, nil
case operand.IsM32(mr) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VCVTSI2SDL",
Operands: []operand.Op{mr, x, x1},
Inputs: []operand.Op{mr, x},
Outputs: []operand.Op{x1},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VCVTSI2SDL: bad operands")
}
// VCVTSI2SDQ: Convert Dword Integer to Scalar Double-Precision FP Value.
//
// Forms:
//
// VCVTSI2SDQ r64 xmm xmm
// VCVTSI2SDQ m64 xmm xmm
func VCVTSI2SDQ(mr, x, x1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR64(mr) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VCVTSI2SDQ",
Operands: []operand.Op{mr, x, x1},
Inputs: []operand.Op{mr, x},
Outputs: []operand.Op{x1},
ISA: []string{"AVX"},
}, nil
case operand.IsM64(mr) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VCVTSI2SDQ",
Operands: []operand.Op{mr, x, x1},
Inputs: []operand.Op{mr, x},
Outputs: []operand.Op{x1},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VCVTSI2SDQ: bad operands")
}
// VCVTSI2SSL: Convert Dword Integer to Scalar Single-Precision FP Value.
//
// Forms:
//
// VCVTSI2SSL r32 xmm xmm
// VCVTSI2SSL m32 xmm xmm
func VCVTSI2SSL(mr, x, x1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR32(mr) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VCVTSI2SSL",
Operands: []operand.Op{mr, x, x1},
Inputs: []operand.Op{mr, x},
Outputs: []operand.Op{x1},
ISA: []string{"AVX"},
}, nil
case operand.IsM32(mr) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VCVTSI2SSL",
Operands: []operand.Op{mr, x, x1},
Inputs: []operand.Op{mr, x},
Outputs: []operand.Op{x1},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VCVTSI2SSL: bad operands")
}
// VCVTSI2SSQ: Convert Dword Integer to Scalar Single-Precision FP Value.
//
// Forms:
//
// VCVTSI2SSQ r64 xmm xmm
// VCVTSI2SSQ m64 xmm xmm
func VCVTSI2SSQ(mr, x, x1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR64(mr) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VCVTSI2SSQ",
Operands: []operand.Op{mr, x, x1},
Inputs: []operand.Op{mr, x},
Outputs: []operand.Op{x1},
ISA: []string{"AVX"},
}, nil
case operand.IsM64(mr) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VCVTSI2SSQ",
Operands: []operand.Op{mr, x, x1},
Inputs: []operand.Op{mr, x},
Outputs: []operand.Op{x1},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VCVTSI2SSQ: bad operands")
}
// VCVTSS2SD: Convert Scalar Single-Precision FP Value to Scalar Double-Precision FP Value.
//
// Forms:
//
// VCVTSS2SD xmm xmm xmm
// VCVTSS2SD m32 xmm xmm
func VCVTSS2SD(mx, x, x1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VCVTSS2SD",
Operands: []operand.Op{mx, x, x1},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x1},
ISA: []string{"AVX"},
}, nil
case operand.IsM32(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VCVTSS2SD",
Operands: []operand.Op{mx, x, x1},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x1},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VCVTSS2SD: bad operands")
}
// VCVTSS2SI: Convert Scalar Single-Precision FP Value to Dword Integer.
//
// Forms:
//
// VCVTSS2SI xmm r32
// VCVTSS2SI m32 r32
func VCVTSS2SI(mx, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "VCVTSS2SI",
Operands: []operand.Op{mx, r},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{r},
ISA: []string{"AVX"},
}, nil
case operand.IsM32(mx) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "VCVTSS2SI",
Operands: []operand.Op{mx, r},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{r},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VCVTSS2SI: bad operands")
}
// VCVTSS2SIQ: Convert Scalar Single-Precision FP Value to Dword Integer.
//
// Forms:
//
// VCVTSS2SIQ xmm r64
// VCVTSS2SIQ m32 r64
func VCVTSS2SIQ(mx, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsR64(r):
return &intrep.Instruction{
Opcode: "VCVTSS2SIQ",
Operands: []operand.Op{mx, r},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{r},
ISA: []string{"AVX"},
}, nil
case operand.IsM32(mx) && operand.IsR64(r):
return &intrep.Instruction{
Opcode: "VCVTSS2SIQ",
Operands: []operand.Op{mx, r},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{r},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VCVTSS2SIQ: bad operands")
}
// VCVTTPD2DQX: Convert with Truncation Packed Double-Precision FP Values to Packed Dword Integers.
//
// Forms:
//
// VCVTTPD2DQX xmm xmm
// VCVTTPD2DQX m128 xmm
func VCVTTPD2DQX(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "VCVTTPD2DQX",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "VCVTTPD2DQX",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VCVTTPD2DQX: bad operands")
}
// VCVTTPD2DQY: Convert with Truncation Packed Double-Precision FP Values to Packed Dword Integers.
//
// Forms:
//
// VCVTTPD2DQY ymm xmm
// VCVTTPD2DQY m256 xmm
func VCVTTPD2DQY(my, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsYMM(my) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "VCVTTPD2DQY",
Operands: []operand.Op{my, x},
Inputs: []operand.Op{my},
Outputs: []operand.Op{x},
ISA: []string{"AVX"},
}, nil
case operand.IsM256(my) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "VCVTTPD2DQY",
Operands: []operand.Op{my, x},
Inputs: []operand.Op{my},
Outputs: []operand.Op{x},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VCVTTPD2DQY: bad operands")
}
// VCVTTPS2DQ: Convert with Truncation Packed Single-Precision FP Values to Packed Dword Integers.
//
// Forms:
//
// VCVTTPS2DQ xmm xmm
// VCVTTPS2DQ m128 xmm
// VCVTTPS2DQ ymm ymm
// VCVTTPS2DQ m256 ymm
func VCVTTPS2DQ(mxy, xy operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy):
return &intrep.Instruction{
Opcode: "VCVTTPS2DQ",
Operands: []operand.Op{mxy, xy},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy):
return &intrep.Instruction{
Opcode: "VCVTTPS2DQ",
Operands: []operand.Op{mxy, xy},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy):
return &intrep.Instruction{
Opcode: "VCVTTPS2DQ",
Operands: []operand.Op{mxy, xy},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy):
return &intrep.Instruction{
Opcode: "VCVTTPS2DQ",
Operands: []operand.Op{mxy, xy},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VCVTTPS2DQ: bad operands")
}
// VCVTTSD2SI: Convert with Truncation Scalar Double-Precision FP Value to Signed Integer.
//
// Forms:
//
// VCVTTSD2SI xmm r32
// VCVTTSD2SI m64 r32
func VCVTTSD2SI(mx, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "VCVTTSD2SI",
Operands: []operand.Op{mx, r},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{r},
ISA: []string{"AVX"},
}, nil
case operand.IsM64(mx) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "VCVTTSD2SI",
Operands: []operand.Op{mx, r},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{r},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VCVTTSD2SI: bad operands")
}
// VCVTTSD2SIQ: Convert with Truncation Scalar Double-Precision FP Value to Signed Integer.
//
// Forms:
//
// VCVTTSD2SIQ xmm r64
// VCVTTSD2SIQ m64 r64
func VCVTTSD2SIQ(mx, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsR64(r):
return &intrep.Instruction{
Opcode: "VCVTTSD2SIQ",
Operands: []operand.Op{mx, r},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{r},
ISA: []string{"AVX"},
}, nil
case operand.IsM64(mx) && operand.IsR64(r):
return &intrep.Instruction{
Opcode: "VCVTTSD2SIQ",
Operands: []operand.Op{mx, r},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{r},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VCVTTSD2SIQ: bad operands")
}
// VCVTTSS2SI: Convert with Truncation Scalar Single-Precision FP Value to Dword Integer.
//
// Forms:
//
// VCVTTSS2SI xmm r32
// VCVTTSS2SI m32 r32
func VCVTTSS2SI(mx, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "VCVTTSS2SI",
Operands: []operand.Op{mx, r},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{r},
ISA: []string{"AVX"},
}, nil
case operand.IsM32(mx) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "VCVTTSS2SI",
Operands: []operand.Op{mx, r},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{r},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VCVTTSS2SI: bad operands")
}
// VCVTTSS2SIQ: Convert with Truncation Scalar Single-Precision FP Value to Dword Integer.
//
// Forms:
//
// VCVTTSS2SIQ xmm r64
// VCVTTSS2SIQ m32 r64
func VCVTTSS2SIQ(mx, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsR64(r):
return &intrep.Instruction{
Opcode: "VCVTTSS2SIQ",
Operands: []operand.Op{mx, r},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{r},
ISA: []string{"AVX"},
}, nil
case operand.IsM32(mx) && operand.IsR64(r):
return &intrep.Instruction{
Opcode: "VCVTTSS2SIQ",
Operands: []operand.Op{mx, r},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{r},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VCVTTSS2SIQ: bad operands")
}
// VDIVPD: Divide Packed Double-Precision Floating-Point Values.
//
// Forms:
//
// VDIVPD xmm xmm xmm
// VDIVPD m128 xmm xmm
// VDIVPD ymm ymm ymm
// VDIVPD m256 ymm ymm
func VDIVPD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VDIVPD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VDIVPD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VDIVPD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VDIVPD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VDIVPD: bad operands")
}
// VDIVPS: Divide Packed Single-Precision Floating-Point Values.
//
// Forms:
//
// VDIVPS xmm xmm xmm
// VDIVPS m128 xmm xmm
// VDIVPS ymm ymm ymm
// VDIVPS m256 ymm ymm
func VDIVPS(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VDIVPS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VDIVPS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VDIVPS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VDIVPS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VDIVPS: bad operands")
}
// VDIVSD: Divide Scalar Double-Precision Floating-Point Values.
//
// Forms:
//
// VDIVSD xmm xmm xmm
// VDIVSD m64 xmm xmm
func VDIVSD(mx, x, x1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VDIVSD",
Operands: []operand.Op{mx, x, x1},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x1},
ISA: []string{"AVX"},
}, nil
case operand.IsM64(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VDIVSD",
Operands: []operand.Op{mx, x, x1},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x1},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VDIVSD: bad operands")
}
// VDIVSS: Divide Scalar Single-Precision Floating-Point Values.
//
// Forms:
//
// VDIVSS xmm xmm xmm
// VDIVSS m32 xmm xmm
func VDIVSS(mx, x, x1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VDIVSS",
Operands: []operand.Op{mx, x, x1},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x1},
ISA: []string{"AVX"},
}, nil
case operand.IsM32(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VDIVSS",
Operands: []operand.Op{mx, x, x1},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x1},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VDIVSS: bad operands")
}
// VDPPD: Dot Product of Packed Double Precision Floating-Point Values.
//
// Forms:
//
// VDPPD imm8 xmm xmm xmm
// VDPPD imm8 m128 xmm xmm
func VDPPD(i, mx, x, x1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(i) && operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VDPPD",
Operands: []operand.Op{i, mx, x, x1},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x1},
ISA: []string{"AVX"},
}, nil
case operand.IsIMM8(i) && operand.IsM128(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VDPPD",
Operands: []operand.Op{i, mx, x, x1},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x1},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VDPPD: bad operands")
}
// VDPPS: Dot Product of Packed Single Precision Floating-Point Values.
//
// Forms:
//
// VDPPS imm8 xmm xmm xmm
// VDPPS imm8 m128 xmm xmm
// VDPPS imm8 ymm ymm ymm
// VDPPS imm8 m256 ymm ymm
func VDPPS(i, mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(i) && operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VDPPS",
Operands: []operand.Op{i, mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsIMM8(i) && operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VDPPS",
Operands: []operand.Op{i, mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsIMM8(i) && operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VDPPS",
Operands: []operand.Op{i, mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsIMM8(i) && operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VDPPS",
Operands: []operand.Op{i, mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VDPPS: bad operands")
}
// VEXTRACTF128: Extract Packed Floating-Point Values.
//
// Forms:
//
// VEXTRACTF128 imm8 ymm xmm
// VEXTRACTF128 imm8 ymm m128
func VEXTRACTF128(i, y, mx operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(i) && operand.IsYMM(y) && operand.IsXMM(mx):
return &intrep.Instruction{
Opcode: "VEXTRACTF128",
Operands: []operand.Op{i, y, mx},
Inputs: []operand.Op{y},
Outputs: []operand.Op{mx},
ISA: []string{"AVX"},
}, nil
case operand.IsIMM8(i) && operand.IsYMM(y) && operand.IsM128(mx):
return &intrep.Instruction{
Opcode: "VEXTRACTF128",
Operands: []operand.Op{i, y, mx},
Inputs: []operand.Op{y},
Outputs: []operand.Op{mx},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VEXTRACTF128: bad operands")
}
// VEXTRACTI128: Extract Packed Integer Values.
//
// Forms:
//
// VEXTRACTI128 imm8 ymm xmm
// VEXTRACTI128 imm8 ymm m128
func VEXTRACTI128(i, y, mx operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(i) && operand.IsYMM(y) && operand.IsXMM(mx):
return &intrep.Instruction{
Opcode: "VEXTRACTI128",
Operands: []operand.Op{i, y, mx},
Inputs: []operand.Op{y},
Outputs: []operand.Op{mx},
ISA: []string{"AVX2"},
}, nil
case operand.IsIMM8(i) && operand.IsYMM(y) && operand.IsM128(mx):
return &intrep.Instruction{
Opcode: "VEXTRACTI128",
Operands: []operand.Op{i, y, mx},
Inputs: []operand.Op{y},
Outputs: []operand.Op{mx},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VEXTRACTI128: bad operands")
}
// VEXTRACTPS: Extract Packed Single Precision Floating-Point Value.
//
// Forms:
//
// VEXTRACTPS imm8 xmm r32
// VEXTRACTPS imm8 xmm m32
func VEXTRACTPS(i, x, mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(i) && operand.IsXMM(x) && operand.IsR32(mr):
return &intrep.Instruction{
Opcode: "VEXTRACTPS",
Operands: []operand.Op{i, x, mr},
Inputs: []operand.Op{x},
Outputs: []operand.Op{mr},
ISA: []string{"AVX"},
}, nil
case operand.IsIMM8(i) && operand.IsXMM(x) && operand.IsM32(mr):
return &intrep.Instruction{
Opcode: "VEXTRACTPS",
Operands: []operand.Op{i, x, mr},
Inputs: []operand.Op{x},
Outputs: []operand.Op{mr},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VEXTRACTPS: bad operands")
}
// VFMADD132PD: Fused Multiply-Add of Packed Double-Precision Floating-Point Values.
//
// Forms:
//
// VFMADD132PD xmm xmm xmm
// VFMADD132PD m128 xmm xmm
// VFMADD132PD ymm ymm ymm
// VFMADD132PD m256 ymm ymm
func VFMADD132PD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VFMADD132PD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VFMADD132PD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VFMADD132PD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VFMADD132PD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
}
return nil, errors.New("VFMADD132PD: bad operands")
}
// VFMADD132PS: Fused Multiply-Add of Packed Single-Precision Floating-Point Values.
//
// Forms:
//
// VFMADD132PS xmm xmm xmm
// VFMADD132PS m128 xmm xmm
// VFMADD132PS ymm ymm ymm
// VFMADD132PS m256 ymm ymm
func VFMADD132PS(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VFMADD132PS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VFMADD132PS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VFMADD132PS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VFMADD132PS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
}
return nil, errors.New("VFMADD132PS: bad operands")
}
// VFMADD132SD: Fused Multiply-Add of Scalar Double-Precision Floating-Point Values.
//
// Forms:
//
// VFMADD132SD xmm xmm xmm
// VFMADD132SD m64 xmm xmm
func VFMADD132SD(mx, x, x1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VFMADD132SD",
Operands: []operand.Op{mx, x, x1},
Inputs: []operand.Op{mx, x, x1},
Outputs: []operand.Op{x1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM64(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VFMADD132SD",
Operands: []operand.Op{mx, x, x1},
Inputs: []operand.Op{mx, x, x1},
Outputs: []operand.Op{x1},
ISA: []string{"FMA3"},
}, nil
}
return nil, errors.New("VFMADD132SD: bad operands")
}
// VFMADD132SS: Fused Multiply-Add of Scalar Single-Precision Floating-Point Values.
//
// Forms:
//
// VFMADD132SS xmm xmm xmm
// VFMADD132SS m32 xmm xmm
func VFMADD132SS(mx, x, x1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VFMADD132SS",
Operands: []operand.Op{mx, x, x1},
Inputs: []operand.Op{mx, x, x1},
Outputs: []operand.Op{x1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM32(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VFMADD132SS",
Operands: []operand.Op{mx, x, x1},
Inputs: []operand.Op{mx, x, x1},
Outputs: []operand.Op{x1},
ISA: []string{"FMA3"},
}, nil
}
return nil, errors.New("VFMADD132SS: bad operands")
}
// VFMADD213PD: Fused Multiply-Add of Packed Double-Precision Floating-Point Values.
//
// Forms:
//
// VFMADD213PD xmm xmm xmm
// VFMADD213PD m128 xmm xmm
// VFMADD213PD ymm ymm ymm
// VFMADD213PD m256 ymm ymm
func VFMADD213PD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VFMADD213PD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VFMADD213PD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VFMADD213PD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VFMADD213PD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
}
return nil, errors.New("VFMADD213PD: bad operands")
}
// VFMADD213PS: Fused Multiply-Add of Packed Single-Precision Floating-Point Values.
//
// Forms:
//
// VFMADD213PS xmm xmm xmm
// VFMADD213PS m128 xmm xmm
// VFMADD213PS ymm ymm ymm
// VFMADD213PS m256 ymm ymm
func VFMADD213PS(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VFMADD213PS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VFMADD213PS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VFMADD213PS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VFMADD213PS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
}
return nil, errors.New("VFMADD213PS: bad operands")
}
// VFMADD213SD: Fused Multiply-Add of Scalar Double-Precision Floating-Point Values.
//
// Forms:
//
// VFMADD213SD xmm xmm xmm
// VFMADD213SD m64 xmm xmm
func VFMADD213SD(mx, x, x1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VFMADD213SD",
Operands: []operand.Op{mx, x, x1},
Inputs: []operand.Op{mx, x, x1},
Outputs: []operand.Op{x1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM64(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VFMADD213SD",
Operands: []operand.Op{mx, x, x1},
Inputs: []operand.Op{mx, x, x1},
Outputs: []operand.Op{x1},
ISA: []string{"FMA3"},
}, nil
}
return nil, errors.New("VFMADD213SD: bad operands")
}
// VFMADD213SS: Fused Multiply-Add of Scalar Single-Precision Floating-Point Values.
//
// Forms:
//
// VFMADD213SS xmm xmm xmm
// VFMADD213SS m32 xmm xmm
func VFMADD213SS(mx, x, x1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VFMADD213SS",
Operands: []operand.Op{mx, x, x1},
Inputs: []operand.Op{mx, x, x1},
Outputs: []operand.Op{x1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM32(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VFMADD213SS",
Operands: []operand.Op{mx, x, x1},
Inputs: []operand.Op{mx, x, x1},
Outputs: []operand.Op{x1},
ISA: []string{"FMA3"},
}, nil
}
return nil, errors.New("VFMADD213SS: bad operands")
}
// VFMADD231PD: Fused Multiply-Add of Packed Double-Precision Floating-Point Values.
//
// Forms:
//
// VFMADD231PD xmm xmm xmm
// VFMADD231PD m128 xmm xmm
// VFMADD231PD ymm ymm ymm
// VFMADD231PD m256 ymm ymm
func VFMADD231PD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VFMADD231PD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VFMADD231PD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VFMADD231PD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VFMADD231PD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
}
return nil, errors.New("VFMADD231PD: bad operands")
}
// VFMADD231PS: Fused Multiply-Add of Packed Single-Precision Floating-Point Values.
//
// Forms:
//
// VFMADD231PS xmm xmm xmm
// VFMADD231PS m128 xmm xmm
// VFMADD231PS ymm ymm ymm
// VFMADD231PS m256 ymm ymm
func VFMADD231PS(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VFMADD231PS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VFMADD231PS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VFMADD231PS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VFMADD231PS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
}
return nil, errors.New("VFMADD231PS: bad operands")
}
// VFMADD231SD: Fused Multiply-Add of Scalar Double-Precision Floating-Point Values.
//
// Forms:
//
// VFMADD231SD xmm xmm xmm
// VFMADD231SD m64 xmm xmm
func VFMADD231SD(mx, x, x1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VFMADD231SD",
Operands: []operand.Op{mx, x, x1},
Inputs: []operand.Op{mx, x, x1},
Outputs: []operand.Op{x1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM64(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VFMADD231SD",
Operands: []operand.Op{mx, x, x1},
Inputs: []operand.Op{mx, x, x1},
Outputs: []operand.Op{x1},
ISA: []string{"FMA3"},
}, nil
}
return nil, errors.New("VFMADD231SD: bad operands")
}
// VFMADD231SS: Fused Multiply-Add of Scalar Single-Precision Floating-Point Values.
//
// Forms:
//
// VFMADD231SS xmm xmm xmm
// VFMADD231SS m32 xmm xmm
func VFMADD231SS(mx, x, x1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VFMADD231SS",
Operands: []operand.Op{mx, x, x1},
Inputs: []operand.Op{mx, x, x1},
Outputs: []operand.Op{x1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM32(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VFMADD231SS",
Operands: []operand.Op{mx, x, x1},
Inputs: []operand.Op{mx, x, x1},
Outputs: []operand.Op{x1},
ISA: []string{"FMA3"},
}, nil
}
return nil, errors.New("VFMADD231SS: bad operands")
}
// VFMADDSUB132PD: Fused Multiply-Alternating Add/Subtract of Packed Double-Precision Floating-Point Values.
//
// Forms:
//
// VFMADDSUB132PD xmm xmm xmm
// VFMADDSUB132PD m128 xmm xmm
// VFMADDSUB132PD ymm ymm ymm
// VFMADDSUB132PD m256 ymm ymm
func VFMADDSUB132PD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VFMADDSUB132PD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VFMADDSUB132PD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VFMADDSUB132PD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VFMADDSUB132PD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
}
return nil, errors.New("VFMADDSUB132PD: bad operands")
}
// VFMADDSUB132PS: Fused Multiply-Alternating Add/Subtract of Packed Single-Precision Floating-Point Values.
//
// Forms:
//
// VFMADDSUB132PS xmm xmm xmm
// VFMADDSUB132PS m128 xmm xmm
// VFMADDSUB132PS ymm ymm ymm
// VFMADDSUB132PS m256 ymm ymm
func VFMADDSUB132PS(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VFMADDSUB132PS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VFMADDSUB132PS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VFMADDSUB132PS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VFMADDSUB132PS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
}
return nil, errors.New("VFMADDSUB132PS: bad operands")
}
// VFMADDSUB213PD: Fused Multiply-Alternating Add/Subtract of Packed Double-Precision Floating-Point Values.
//
// Forms:
//
// VFMADDSUB213PD xmm xmm xmm
// VFMADDSUB213PD m128 xmm xmm
// VFMADDSUB213PD ymm ymm ymm
// VFMADDSUB213PD m256 ymm ymm
func VFMADDSUB213PD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VFMADDSUB213PD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VFMADDSUB213PD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VFMADDSUB213PD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VFMADDSUB213PD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
}
return nil, errors.New("VFMADDSUB213PD: bad operands")
}
// VFMADDSUB213PS: Fused Multiply-Alternating Add/Subtract of Packed Single-Precision Floating-Point Values.
//
// Forms:
//
// VFMADDSUB213PS xmm xmm xmm
// VFMADDSUB213PS m128 xmm xmm
// VFMADDSUB213PS ymm ymm ymm
// VFMADDSUB213PS m256 ymm ymm
func VFMADDSUB213PS(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VFMADDSUB213PS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VFMADDSUB213PS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VFMADDSUB213PS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VFMADDSUB213PS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
}
return nil, errors.New("VFMADDSUB213PS: bad operands")
}
// VFMADDSUB231PD: Fused Multiply-Alternating Add/Subtract of Packed Double-Precision Floating-Point Values.
//
// Forms:
//
// VFMADDSUB231PD xmm xmm xmm
// VFMADDSUB231PD m128 xmm xmm
// VFMADDSUB231PD ymm ymm ymm
// VFMADDSUB231PD m256 ymm ymm
func VFMADDSUB231PD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VFMADDSUB231PD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VFMADDSUB231PD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VFMADDSUB231PD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VFMADDSUB231PD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
}
return nil, errors.New("VFMADDSUB231PD: bad operands")
}
// VFMADDSUB231PS: Fused Multiply-Alternating Add/Subtract of Packed Single-Precision Floating-Point Values.
//
// Forms:
//
// VFMADDSUB231PS xmm xmm xmm
// VFMADDSUB231PS m128 xmm xmm
// VFMADDSUB231PS ymm ymm ymm
// VFMADDSUB231PS m256 ymm ymm
func VFMADDSUB231PS(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VFMADDSUB231PS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VFMADDSUB231PS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VFMADDSUB231PS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VFMADDSUB231PS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
}
return nil, errors.New("VFMADDSUB231PS: bad operands")
}
// VFMSUB132PD: Fused Multiply-Subtract of Packed Double-Precision Floating-Point Values.
//
// Forms:
//
// VFMSUB132PD xmm xmm xmm
// VFMSUB132PD m128 xmm xmm
// VFMSUB132PD ymm ymm ymm
// VFMSUB132PD m256 ymm ymm
func VFMSUB132PD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VFMSUB132PD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VFMSUB132PD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VFMSUB132PD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VFMSUB132PD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
}
return nil, errors.New("VFMSUB132PD: bad operands")
}
// VFMSUB132PS: Fused Multiply-Subtract of Packed Single-Precision Floating-Point Values.
//
// Forms:
//
// VFMSUB132PS xmm xmm xmm
// VFMSUB132PS m128 xmm xmm
// VFMSUB132PS ymm ymm ymm
// VFMSUB132PS m256 ymm ymm
func VFMSUB132PS(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VFMSUB132PS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VFMSUB132PS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VFMSUB132PS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VFMSUB132PS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
}
return nil, errors.New("VFMSUB132PS: bad operands")
}
// VFMSUB132SD: Fused Multiply-Subtract of Scalar Double-Precision Floating-Point Values.
//
// Forms:
//
// VFMSUB132SD xmm xmm xmm
// VFMSUB132SD m64 xmm xmm
func VFMSUB132SD(mx, x, x1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VFMSUB132SD",
Operands: []operand.Op{mx, x, x1},
Inputs: []operand.Op{mx, x, x1},
Outputs: []operand.Op{x1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM64(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VFMSUB132SD",
Operands: []operand.Op{mx, x, x1},
Inputs: []operand.Op{mx, x, x1},
Outputs: []operand.Op{x1},
ISA: []string{"FMA3"},
}, nil
}
return nil, errors.New("VFMSUB132SD: bad operands")
}
// VFMSUB132SS: Fused Multiply-Subtract of Scalar Single-Precision Floating-Point Values.
//
// Forms:
//
// VFMSUB132SS xmm xmm xmm
// VFMSUB132SS m32 xmm xmm
func VFMSUB132SS(mx, x, x1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VFMSUB132SS",
Operands: []operand.Op{mx, x, x1},
Inputs: []operand.Op{mx, x, x1},
Outputs: []operand.Op{x1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM32(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VFMSUB132SS",
Operands: []operand.Op{mx, x, x1},
Inputs: []operand.Op{mx, x, x1},
Outputs: []operand.Op{x1},
ISA: []string{"FMA3"},
}, nil
}
return nil, errors.New("VFMSUB132SS: bad operands")
}
// VFMSUB213PD: Fused Multiply-Subtract of Packed Double-Precision Floating-Point Values.
//
// Forms:
//
// VFMSUB213PD xmm xmm xmm
// VFMSUB213PD m128 xmm xmm
// VFMSUB213PD ymm ymm ymm
// VFMSUB213PD m256 ymm ymm
func VFMSUB213PD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VFMSUB213PD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VFMSUB213PD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VFMSUB213PD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VFMSUB213PD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
}
return nil, errors.New("VFMSUB213PD: bad operands")
}
// VFMSUB213PS: Fused Multiply-Subtract of Packed Single-Precision Floating-Point Values.
//
// Forms:
//
// VFMSUB213PS xmm xmm xmm
// VFMSUB213PS m128 xmm xmm
// VFMSUB213PS ymm ymm ymm
// VFMSUB213PS m256 ymm ymm
func VFMSUB213PS(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VFMSUB213PS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VFMSUB213PS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VFMSUB213PS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VFMSUB213PS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
}
return nil, errors.New("VFMSUB213PS: bad operands")
}
// VFMSUB213SD: Fused Multiply-Subtract of Scalar Double-Precision Floating-Point Values.
//
// Forms:
//
// VFMSUB213SD xmm xmm xmm
// VFMSUB213SD m64 xmm xmm
func VFMSUB213SD(mx, x, x1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VFMSUB213SD",
Operands: []operand.Op{mx, x, x1},
Inputs: []operand.Op{mx, x, x1},
Outputs: []operand.Op{x1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM64(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VFMSUB213SD",
Operands: []operand.Op{mx, x, x1},
Inputs: []operand.Op{mx, x, x1},
Outputs: []operand.Op{x1},
ISA: []string{"FMA3"},
}, nil
}
return nil, errors.New("VFMSUB213SD: bad operands")
}
// VFMSUB213SS: Fused Multiply-Subtract of Scalar Single-Precision Floating-Point Values.
//
// Forms:
//
// VFMSUB213SS xmm xmm xmm
// VFMSUB213SS m32 xmm xmm
func VFMSUB213SS(mx, x, x1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VFMSUB213SS",
Operands: []operand.Op{mx, x, x1},
Inputs: []operand.Op{mx, x, x1},
Outputs: []operand.Op{x1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM32(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VFMSUB213SS",
Operands: []operand.Op{mx, x, x1},
Inputs: []operand.Op{mx, x, x1},
Outputs: []operand.Op{x1},
ISA: []string{"FMA3"},
}, nil
}
return nil, errors.New("VFMSUB213SS: bad operands")
}
// VFMSUB231PD: Fused Multiply-Subtract of Packed Double-Precision Floating-Point Values.
//
// Forms:
//
// VFMSUB231PD xmm xmm xmm
// VFMSUB231PD m128 xmm xmm
// VFMSUB231PD ymm ymm ymm
// VFMSUB231PD m256 ymm ymm
func VFMSUB231PD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VFMSUB231PD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VFMSUB231PD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VFMSUB231PD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VFMSUB231PD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
}
return nil, errors.New("VFMSUB231PD: bad operands")
}
// VFMSUB231PS: Fused Multiply-Subtract of Packed Single-Precision Floating-Point Values.
//
// Forms:
//
// VFMSUB231PS xmm xmm xmm
// VFMSUB231PS m128 xmm xmm
// VFMSUB231PS ymm ymm ymm
// VFMSUB231PS m256 ymm ymm
func VFMSUB231PS(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VFMSUB231PS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VFMSUB231PS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VFMSUB231PS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VFMSUB231PS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
}
return nil, errors.New("VFMSUB231PS: bad operands")
}
// VFMSUB231SD: Fused Multiply-Subtract of Scalar Double-Precision Floating-Point Values.
//
// Forms:
//
// VFMSUB231SD xmm xmm xmm
// VFMSUB231SD m64 xmm xmm
func VFMSUB231SD(mx, x, x1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VFMSUB231SD",
Operands: []operand.Op{mx, x, x1},
Inputs: []operand.Op{mx, x, x1},
Outputs: []operand.Op{x1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM64(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VFMSUB231SD",
Operands: []operand.Op{mx, x, x1},
Inputs: []operand.Op{mx, x, x1},
Outputs: []operand.Op{x1},
ISA: []string{"FMA3"},
}, nil
}
return nil, errors.New("VFMSUB231SD: bad operands")
}
// VFMSUB231SS: Fused Multiply-Subtract of Scalar Single-Precision Floating-Point Values.
//
// Forms:
//
// VFMSUB231SS xmm xmm xmm
// VFMSUB231SS m32 xmm xmm
func VFMSUB231SS(mx, x, x1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VFMSUB231SS",
Operands: []operand.Op{mx, x, x1},
Inputs: []operand.Op{mx, x, x1},
Outputs: []operand.Op{x1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM32(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VFMSUB231SS",
Operands: []operand.Op{mx, x, x1},
Inputs: []operand.Op{mx, x, x1},
Outputs: []operand.Op{x1},
ISA: []string{"FMA3"},
}, nil
}
return nil, errors.New("VFMSUB231SS: bad operands")
}
// VFMSUBADD132PD: Fused Multiply-Alternating Subtract/Add of Packed Double-Precision Floating-Point Values.
//
// Forms:
//
// VFMSUBADD132PD xmm xmm xmm
// VFMSUBADD132PD m128 xmm xmm
// VFMSUBADD132PD ymm ymm ymm
// VFMSUBADD132PD m256 ymm ymm
func VFMSUBADD132PD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VFMSUBADD132PD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VFMSUBADD132PD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VFMSUBADD132PD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VFMSUBADD132PD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
}
return nil, errors.New("VFMSUBADD132PD: bad operands")
}
// VFMSUBADD132PS: Fused Multiply-Alternating Subtract/Add of Packed Single-Precision Floating-Point Values.
//
// Forms:
//
// VFMSUBADD132PS xmm xmm xmm
// VFMSUBADD132PS m128 xmm xmm
// VFMSUBADD132PS ymm ymm ymm
// VFMSUBADD132PS m256 ymm ymm
func VFMSUBADD132PS(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VFMSUBADD132PS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VFMSUBADD132PS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VFMSUBADD132PS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VFMSUBADD132PS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
}
return nil, errors.New("VFMSUBADD132PS: bad operands")
}
// VFMSUBADD213PD: Fused Multiply-Alternating Subtract/Add of Packed Double-Precision Floating-Point Values.
//
// Forms:
//
// VFMSUBADD213PD xmm xmm xmm
// VFMSUBADD213PD m128 xmm xmm
// VFMSUBADD213PD ymm ymm ymm
// VFMSUBADD213PD m256 ymm ymm
func VFMSUBADD213PD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VFMSUBADD213PD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VFMSUBADD213PD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VFMSUBADD213PD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VFMSUBADD213PD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
}
return nil, errors.New("VFMSUBADD213PD: bad operands")
}
// VFMSUBADD213PS: Fused Multiply-Alternating Subtract/Add of Packed Single-Precision Floating-Point Values.
//
// Forms:
//
// VFMSUBADD213PS xmm xmm xmm
// VFMSUBADD213PS m128 xmm xmm
// VFMSUBADD213PS ymm ymm ymm
// VFMSUBADD213PS m256 ymm ymm
func VFMSUBADD213PS(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VFMSUBADD213PS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VFMSUBADD213PS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VFMSUBADD213PS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VFMSUBADD213PS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
}
return nil, errors.New("VFMSUBADD213PS: bad operands")
}
// VFMSUBADD231PD: Fused Multiply-Alternating Subtract/Add of Packed Double-Precision Floating-Point Values.
//
// Forms:
//
// VFMSUBADD231PD xmm xmm xmm
// VFMSUBADD231PD m128 xmm xmm
// VFMSUBADD231PD ymm ymm ymm
// VFMSUBADD231PD m256 ymm ymm
func VFMSUBADD231PD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VFMSUBADD231PD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VFMSUBADD231PD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VFMSUBADD231PD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VFMSUBADD231PD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
}
return nil, errors.New("VFMSUBADD231PD: bad operands")
}
// VFMSUBADD231PS: Fused Multiply-Alternating Subtract/Add of Packed Single-Precision Floating-Point Values.
//
// Forms:
//
// VFMSUBADD231PS xmm xmm xmm
// VFMSUBADD231PS m128 xmm xmm
// VFMSUBADD231PS ymm ymm ymm
// VFMSUBADD231PS m256 ymm ymm
func VFMSUBADD231PS(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VFMSUBADD231PS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VFMSUBADD231PS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VFMSUBADD231PS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VFMSUBADD231PS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
}
return nil, errors.New("VFMSUBADD231PS: bad operands")
}
// VFNMADD132PD: Fused Negative Multiply-Add of Packed Double-Precision Floating-Point Values.
//
// Forms:
//
// VFNMADD132PD xmm xmm xmm
// VFNMADD132PD m128 xmm xmm
// VFNMADD132PD ymm ymm ymm
// VFNMADD132PD m256 ymm ymm
func VFNMADD132PD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VFNMADD132PD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VFNMADD132PD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VFNMADD132PD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VFNMADD132PD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
}
return nil, errors.New("VFNMADD132PD: bad operands")
}
// VFNMADD132PS: Fused Negative Multiply-Add of Packed Single-Precision Floating-Point Values.
//
// Forms:
//
// VFNMADD132PS xmm xmm xmm
// VFNMADD132PS m128 xmm xmm
// VFNMADD132PS ymm ymm ymm
// VFNMADD132PS m256 ymm ymm
func VFNMADD132PS(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VFNMADD132PS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VFNMADD132PS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VFNMADD132PS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VFNMADD132PS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
}
return nil, errors.New("VFNMADD132PS: bad operands")
}
// VFNMADD132SD: Fused Negative Multiply-Add of Scalar Double-Precision Floating-Point Values.
//
// Forms:
//
// VFNMADD132SD xmm xmm xmm
// VFNMADD132SD m64 xmm xmm
func VFNMADD132SD(mx, x, x1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VFNMADD132SD",
Operands: []operand.Op{mx, x, x1},
Inputs: []operand.Op{mx, x, x1},
Outputs: []operand.Op{x1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM64(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VFNMADD132SD",
Operands: []operand.Op{mx, x, x1},
Inputs: []operand.Op{mx, x, x1},
Outputs: []operand.Op{x1},
ISA: []string{"FMA3"},
}, nil
}
return nil, errors.New("VFNMADD132SD: bad operands")
}
// VFNMADD132SS: Fused Negative Multiply-Add of Scalar Single-Precision Floating-Point Values.
//
// Forms:
//
// VFNMADD132SS xmm xmm xmm
// VFNMADD132SS m32 xmm xmm
func VFNMADD132SS(mx, x, x1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VFNMADD132SS",
Operands: []operand.Op{mx, x, x1},
Inputs: []operand.Op{mx, x, x1},
Outputs: []operand.Op{x1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM32(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VFNMADD132SS",
Operands: []operand.Op{mx, x, x1},
Inputs: []operand.Op{mx, x, x1},
Outputs: []operand.Op{x1},
ISA: []string{"FMA3"},
}, nil
}
return nil, errors.New("VFNMADD132SS: bad operands")
}
// VFNMADD213PD: Fused Negative Multiply-Add of Packed Double-Precision Floating-Point Values.
//
// Forms:
//
// VFNMADD213PD xmm xmm xmm
// VFNMADD213PD m128 xmm xmm
// VFNMADD213PD ymm ymm ymm
// VFNMADD213PD m256 ymm ymm
func VFNMADD213PD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VFNMADD213PD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VFNMADD213PD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VFNMADD213PD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VFNMADD213PD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
}
return nil, errors.New("VFNMADD213PD: bad operands")
}
// VFNMADD213PS: Fused Negative Multiply-Add of Packed Single-Precision Floating-Point Values.
//
// Forms:
//
// VFNMADD213PS xmm xmm xmm
// VFNMADD213PS m128 xmm xmm
// VFNMADD213PS ymm ymm ymm
// VFNMADD213PS m256 ymm ymm
func VFNMADD213PS(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VFNMADD213PS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VFNMADD213PS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VFNMADD213PS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VFNMADD213PS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
}
return nil, errors.New("VFNMADD213PS: bad operands")
}
// VFNMADD213SD: Fused Negative Multiply-Add of Scalar Double-Precision Floating-Point Values.
//
// Forms:
//
// VFNMADD213SD xmm xmm xmm
// VFNMADD213SD m64 xmm xmm
func VFNMADD213SD(mx, x, x1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VFNMADD213SD",
Operands: []operand.Op{mx, x, x1},
Inputs: []operand.Op{mx, x, x1},
Outputs: []operand.Op{x1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM64(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VFNMADD213SD",
Operands: []operand.Op{mx, x, x1},
Inputs: []operand.Op{mx, x, x1},
Outputs: []operand.Op{x1},
ISA: []string{"FMA3"},
}, nil
}
return nil, errors.New("VFNMADD213SD: bad operands")
}
// VFNMADD213SS: Fused Negative Multiply-Add of Scalar Single-Precision Floating-Point Values.
//
// Forms:
//
// VFNMADD213SS xmm xmm xmm
// VFNMADD213SS m32 xmm xmm
func VFNMADD213SS(mx, x, x1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VFNMADD213SS",
Operands: []operand.Op{mx, x, x1},
Inputs: []operand.Op{mx, x, x1},
Outputs: []operand.Op{x1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM32(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VFNMADD213SS",
Operands: []operand.Op{mx, x, x1},
Inputs: []operand.Op{mx, x, x1},
Outputs: []operand.Op{x1},
ISA: []string{"FMA3"},
}, nil
}
return nil, errors.New("VFNMADD213SS: bad operands")
}
// VFNMADD231PD: Fused Negative Multiply-Add of Packed Double-Precision Floating-Point Values.
//
// Forms:
//
// VFNMADD231PD xmm xmm xmm
// VFNMADD231PD m128 xmm xmm
// VFNMADD231PD ymm ymm ymm
// VFNMADD231PD m256 ymm ymm
func VFNMADD231PD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VFNMADD231PD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VFNMADD231PD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VFNMADD231PD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VFNMADD231PD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
}
return nil, errors.New("VFNMADD231PD: bad operands")
}
// VFNMADD231PS: Fused Negative Multiply-Add of Packed Single-Precision Floating-Point Values.
//
// Forms:
//
// VFNMADD231PS xmm xmm xmm
// VFNMADD231PS m128 xmm xmm
// VFNMADD231PS ymm ymm ymm
// VFNMADD231PS m256 ymm ymm
func VFNMADD231PS(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VFNMADD231PS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VFNMADD231PS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VFNMADD231PS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VFNMADD231PS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
}
return nil, errors.New("VFNMADD231PS: bad operands")
}
// VFNMADD231SD: Fused Negative Multiply-Add of Scalar Double-Precision Floating-Point Values.
//
// Forms:
//
// VFNMADD231SD xmm xmm xmm
// VFNMADD231SD m64 xmm xmm
func VFNMADD231SD(mx, x, x1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VFNMADD231SD",
Operands: []operand.Op{mx, x, x1},
Inputs: []operand.Op{mx, x, x1},
Outputs: []operand.Op{x1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM64(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VFNMADD231SD",
Operands: []operand.Op{mx, x, x1},
Inputs: []operand.Op{mx, x, x1},
Outputs: []operand.Op{x1},
ISA: []string{"FMA3"},
}, nil
}
return nil, errors.New("VFNMADD231SD: bad operands")
}
// VFNMADD231SS: Fused Negative Multiply-Add of Scalar Single-Precision Floating-Point Values.
//
// Forms:
//
// VFNMADD231SS xmm xmm xmm
// VFNMADD231SS m32 xmm xmm
func VFNMADD231SS(mx, x, x1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VFNMADD231SS",
Operands: []operand.Op{mx, x, x1},
Inputs: []operand.Op{mx, x, x1},
Outputs: []operand.Op{x1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM32(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VFNMADD231SS",
Operands: []operand.Op{mx, x, x1},
Inputs: []operand.Op{mx, x, x1},
Outputs: []operand.Op{x1},
ISA: []string{"FMA3"},
}, nil
}
return nil, errors.New("VFNMADD231SS: bad operands")
}
// VFNMSUB132PD: Fused Negative Multiply-Subtract of Packed Double-Precision Floating-Point Values.
//
// Forms:
//
// VFNMSUB132PD xmm xmm xmm
// VFNMSUB132PD m128 xmm xmm
// VFNMSUB132PD ymm ymm ymm
// VFNMSUB132PD m256 ymm ymm
func VFNMSUB132PD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VFNMSUB132PD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VFNMSUB132PD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VFNMSUB132PD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VFNMSUB132PD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
}
return nil, errors.New("VFNMSUB132PD: bad operands")
}
// VFNMSUB132PS: Fused Negative Multiply-Subtract of Packed Single-Precision Floating-Point Values.
//
// Forms:
//
// VFNMSUB132PS xmm xmm xmm
// VFNMSUB132PS m128 xmm xmm
// VFNMSUB132PS ymm ymm ymm
// VFNMSUB132PS m256 ymm ymm
func VFNMSUB132PS(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VFNMSUB132PS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VFNMSUB132PS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VFNMSUB132PS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VFNMSUB132PS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
}
return nil, errors.New("VFNMSUB132PS: bad operands")
}
// VFNMSUB132SD: Fused Negative Multiply-Subtract of Scalar Double-Precision Floating-Point Values.
//
// Forms:
//
// VFNMSUB132SD xmm xmm xmm
// VFNMSUB132SD m64 xmm xmm
func VFNMSUB132SD(mx, x, x1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VFNMSUB132SD",
Operands: []operand.Op{mx, x, x1},
Inputs: []operand.Op{mx, x, x1},
Outputs: []operand.Op{x1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM64(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VFNMSUB132SD",
Operands: []operand.Op{mx, x, x1},
Inputs: []operand.Op{mx, x, x1},
Outputs: []operand.Op{x1},
ISA: []string{"FMA3"},
}, nil
}
return nil, errors.New("VFNMSUB132SD: bad operands")
}
// VFNMSUB132SS: Fused Negative Multiply-Subtract of Scalar Single-Precision Floating-Point Values.
//
// Forms:
//
// VFNMSUB132SS xmm xmm xmm
// VFNMSUB132SS m32 xmm xmm
func VFNMSUB132SS(mx, x, x1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VFNMSUB132SS",
Operands: []operand.Op{mx, x, x1},
Inputs: []operand.Op{mx, x, x1},
Outputs: []operand.Op{x1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM32(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VFNMSUB132SS",
Operands: []operand.Op{mx, x, x1},
Inputs: []operand.Op{mx, x, x1},
Outputs: []operand.Op{x1},
ISA: []string{"FMA3"},
}, nil
}
return nil, errors.New("VFNMSUB132SS: bad operands")
}
// VFNMSUB213PD: Fused Negative Multiply-Subtract of Packed Double-Precision Floating-Point Values.
//
// Forms:
//
// VFNMSUB213PD xmm xmm xmm
// VFNMSUB213PD m128 xmm xmm
// VFNMSUB213PD ymm ymm ymm
// VFNMSUB213PD m256 ymm ymm
func VFNMSUB213PD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VFNMSUB213PD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VFNMSUB213PD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VFNMSUB213PD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VFNMSUB213PD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
}
return nil, errors.New("VFNMSUB213PD: bad operands")
}
// VFNMSUB213PS: Fused Negative Multiply-Subtract of Packed Single-Precision Floating-Point Values.
//
// Forms:
//
// VFNMSUB213PS xmm xmm xmm
// VFNMSUB213PS m128 xmm xmm
// VFNMSUB213PS ymm ymm ymm
// VFNMSUB213PS m256 ymm ymm
func VFNMSUB213PS(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VFNMSUB213PS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VFNMSUB213PS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VFNMSUB213PS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VFNMSUB213PS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
}
return nil, errors.New("VFNMSUB213PS: bad operands")
}
// VFNMSUB213SD: Fused Negative Multiply-Subtract of Scalar Double-Precision Floating-Point Values.
//
// Forms:
//
// VFNMSUB213SD xmm xmm xmm
// VFNMSUB213SD m64 xmm xmm
func VFNMSUB213SD(mx, x, x1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VFNMSUB213SD",
Operands: []operand.Op{mx, x, x1},
Inputs: []operand.Op{mx, x, x1},
Outputs: []operand.Op{x1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM64(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VFNMSUB213SD",
Operands: []operand.Op{mx, x, x1},
Inputs: []operand.Op{mx, x, x1},
Outputs: []operand.Op{x1},
ISA: []string{"FMA3"},
}, nil
}
return nil, errors.New("VFNMSUB213SD: bad operands")
}
// VFNMSUB213SS: Fused Negative Multiply-Subtract of Scalar Single-Precision Floating-Point Values.
//
// Forms:
//
// VFNMSUB213SS xmm xmm xmm
// VFNMSUB213SS m32 xmm xmm
func VFNMSUB213SS(mx, x, x1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VFNMSUB213SS",
Operands: []operand.Op{mx, x, x1},
Inputs: []operand.Op{mx, x, x1},
Outputs: []operand.Op{x1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM32(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VFNMSUB213SS",
Operands: []operand.Op{mx, x, x1},
Inputs: []operand.Op{mx, x, x1},
Outputs: []operand.Op{x1},
ISA: []string{"FMA3"},
}, nil
}
return nil, errors.New("VFNMSUB213SS: bad operands")
}
// VFNMSUB231PD: Fused Negative Multiply-Subtract of Packed Double-Precision Floating-Point Values.
//
// Forms:
//
// VFNMSUB231PD xmm xmm xmm
// VFNMSUB231PD m128 xmm xmm
// VFNMSUB231PD ymm ymm ymm
// VFNMSUB231PD m256 ymm ymm
func VFNMSUB231PD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VFNMSUB231PD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VFNMSUB231PD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VFNMSUB231PD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VFNMSUB231PD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
}
return nil, errors.New("VFNMSUB231PD: bad operands")
}
// VFNMSUB231PS: Fused Negative Multiply-Subtract of Packed Single-Precision Floating-Point Values.
//
// Forms:
//
// VFNMSUB231PS xmm xmm xmm
// VFNMSUB231PS m128 xmm xmm
// VFNMSUB231PS ymm ymm ymm
// VFNMSUB231PS m256 ymm ymm
func VFNMSUB231PS(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VFNMSUB231PS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VFNMSUB231PS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VFNMSUB231PS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VFNMSUB231PS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy, xy1},
Outputs: []operand.Op{xy1},
ISA: []string{"FMA3"},
}, nil
}
return nil, errors.New("VFNMSUB231PS: bad operands")
}
// VFNMSUB231SD: Fused Negative Multiply-Subtract of Scalar Double-Precision Floating-Point Values.
//
// Forms:
//
// VFNMSUB231SD xmm xmm xmm
// VFNMSUB231SD m64 xmm xmm
func VFNMSUB231SD(mx, x, x1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VFNMSUB231SD",
Operands: []operand.Op{mx, x, x1},
Inputs: []operand.Op{mx, x, x1},
Outputs: []operand.Op{x1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM64(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VFNMSUB231SD",
Operands: []operand.Op{mx, x, x1},
Inputs: []operand.Op{mx, x, x1},
Outputs: []operand.Op{x1},
ISA: []string{"FMA3"},
}, nil
}
return nil, errors.New("VFNMSUB231SD: bad operands")
}
// VFNMSUB231SS: Fused Negative Multiply-Subtract of Scalar Single-Precision Floating-Point Values.
//
// Forms:
//
// VFNMSUB231SS xmm xmm xmm
// VFNMSUB231SS m32 xmm xmm
func VFNMSUB231SS(mx, x, x1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VFNMSUB231SS",
Operands: []operand.Op{mx, x, x1},
Inputs: []operand.Op{mx, x, x1},
Outputs: []operand.Op{x1},
ISA: []string{"FMA3"},
}, nil
case operand.IsM32(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VFNMSUB231SS",
Operands: []operand.Op{mx, x, x1},
Inputs: []operand.Op{mx, x, x1},
Outputs: []operand.Op{x1},
ISA: []string{"FMA3"},
}, nil
}
return nil, errors.New("VFNMSUB231SS: bad operands")
}
// VGATHERDPD: Gather Packed Double-Precision Floating-Point Values Using Signed Doubleword Indices.
//
// Forms:
//
// VGATHERDPD xmm vm32x xmm
// VGATHERDPD ymm vm32x ymm
func VGATHERDPD(xy, v, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(xy) && operand.IsVM32X(v) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VGATHERDPD",
Operands: []operand.Op{xy, v, xy1},
Inputs: []operand.Op{xy, v, xy1},
Outputs: []operand.Op{xy, xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsYMM(xy) && operand.IsVM32X(v) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VGATHERDPD",
Operands: []operand.Op{xy, v, xy1},
Inputs: []operand.Op{xy, v, xy1},
Outputs: []operand.Op{xy, xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VGATHERDPD: bad operands")
}
// VGATHERDPS: Gather Packed Single-Precision Floating-Point Values Using Signed Doubleword Indices.
//
// Forms:
//
// VGATHERDPS xmm vm32x xmm
// VGATHERDPS ymm vm32y ymm
func VGATHERDPS(xy, v, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(xy) && operand.IsVM32X(v) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VGATHERDPS",
Operands: []operand.Op{xy, v, xy1},
Inputs: []operand.Op{xy, v, xy1},
Outputs: []operand.Op{xy, xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsYMM(xy) && operand.IsVM32Y(v) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VGATHERDPS",
Operands: []operand.Op{xy, v, xy1},
Inputs: []operand.Op{xy, v, xy1},
Outputs: []operand.Op{xy, xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VGATHERDPS: bad operands")
}
// VGATHERQPD: Gather Packed Double-Precision Floating-Point Values Using Signed Quadword Indices.
//
// Forms:
//
// VGATHERQPD xmm vm64x xmm
// VGATHERQPD ymm vm64y ymm
func VGATHERQPD(xy, v, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(xy) && operand.IsVM64X(v) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VGATHERQPD",
Operands: []operand.Op{xy, v, xy1},
Inputs: []operand.Op{xy, v, xy1},
Outputs: []operand.Op{xy, xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsYMM(xy) && operand.IsVM64Y(v) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VGATHERQPD",
Operands: []operand.Op{xy, v, xy1},
Inputs: []operand.Op{xy, v, xy1},
Outputs: []operand.Op{xy, xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VGATHERQPD: bad operands")
}
// VGATHERQPS: Gather Packed Single-Precision Floating-Point Values Using Signed Quadword Indices.
//
// Forms:
//
// VGATHERQPS xmm vm64x xmm
// VGATHERQPS xmm vm64y xmm
func VGATHERQPS(x, v, x1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(x) && operand.IsVM64X(v) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VGATHERQPS",
Operands: []operand.Op{x, v, x1},
Inputs: []operand.Op{x, v, x1},
Outputs: []operand.Op{x, x1},
ISA: []string{"AVX2"},
}, nil
case operand.IsXMM(x) && operand.IsVM64Y(v) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VGATHERQPS",
Operands: []operand.Op{x, v, x1},
Inputs: []operand.Op{x, v, x1},
Outputs: []operand.Op{x, x1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VGATHERQPS: bad operands")
}
// VHADDPD: Packed Double-FP Horizontal Add.
//
// Forms:
//
// VHADDPD xmm xmm xmm
// VHADDPD m128 xmm xmm
// VHADDPD ymm ymm ymm
// VHADDPD m256 ymm ymm
func VHADDPD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VHADDPD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VHADDPD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VHADDPD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VHADDPD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VHADDPD: bad operands")
}
// VHADDPS: Packed Single-FP Horizontal Add.
//
// Forms:
//
// VHADDPS xmm xmm xmm
// VHADDPS m128 xmm xmm
// VHADDPS ymm ymm ymm
// VHADDPS m256 ymm ymm
func VHADDPS(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VHADDPS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VHADDPS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VHADDPS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VHADDPS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VHADDPS: bad operands")
}
// VHSUBPD: Packed Double-FP Horizontal Subtract.
//
// Forms:
//
// VHSUBPD xmm xmm xmm
// VHSUBPD m128 xmm xmm
// VHSUBPD ymm ymm ymm
// VHSUBPD m256 ymm ymm
func VHSUBPD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VHSUBPD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VHSUBPD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VHSUBPD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VHSUBPD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VHSUBPD: bad operands")
}
// VHSUBPS: Packed Single-FP Horizontal Subtract.
//
// Forms:
//
// VHSUBPS xmm xmm xmm
// VHSUBPS m128 xmm xmm
// VHSUBPS ymm ymm ymm
// VHSUBPS m256 ymm ymm
func VHSUBPS(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VHSUBPS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VHSUBPS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VHSUBPS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VHSUBPS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VHSUBPS: bad operands")
}
// VINSERTF128: Insert Packed Floating-Point Values.
//
// Forms:
//
// VINSERTF128 imm8 xmm ymm ymm
// VINSERTF128 imm8 m128 ymm ymm
func VINSERTF128(i, mx, y, y1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(i) && operand.IsXMM(mx) && operand.IsYMM(y) && operand.IsYMM(y1):
return &intrep.Instruction{
Opcode: "VINSERTF128",
Operands: []operand.Op{i, mx, y, y1},
Inputs: []operand.Op{mx, y},
Outputs: []operand.Op{y1},
ISA: []string{"AVX"},
}, nil
case operand.IsIMM8(i) && operand.IsM128(mx) && operand.IsYMM(y) && operand.IsYMM(y1):
return &intrep.Instruction{
Opcode: "VINSERTF128",
Operands: []operand.Op{i, mx, y, y1},
Inputs: []operand.Op{mx, y},
Outputs: []operand.Op{y1},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VINSERTF128: bad operands")
}
// VINSERTI128: Insert Packed Integer Values.
//
// Forms:
//
// VINSERTI128 imm8 xmm ymm ymm
// VINSERTI128 imm8 m128 ymm ymm
func VINSERTI128(i, mx, y, y1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(i) && operand.IsXMM(mx) && operand.IsYMM(y) && operand.IsYMM(y1):
return &intrep.Instruction{
Opcode: "VINSERTI128",
Operands: []operand.Op{i, mx, y, y1},
Inputs: []operand.Op{mx, y},
Outputs: []operand.Op{y1},
ISA: []string{"AVX2"},
}, nil
case operand.IsIMM8(i) && operand.IsM128(mx) && operand.IsYMM(y) && operand.IsYMM(y1):
return &intrep.Instruction{
Opcode: "VINSERTI128",
Operands: []operand.Op{i, mx, y, y1},
Inputs: []operand.Op{mx, y},
Outputs: []operand.Op{y1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VINSERTI128: bad operands")
}
// VINSERTPS: Insert Packed Single Precision Floating-Point Value.
//
// Forms:
//
// VINSERTPS imm8 xmm xmm xmm
// VINSERTPS imm8 m32 xmm xmm
func VINSERTPS(i, mx, x, x1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(i) && operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VINSERTPS",
Operands: []operand.Op{i, mx, x, x1},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x1},
ISA: []string{"AVX"},
}, nil
case operand.IsIMM8(i) && operand.IsM32(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VINSERTPS",
Operands: []operand.Op{i, mx, x, x1},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x1},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VINSERTPS: bad operands")
}
// VLDDQU: Load Unaligned Integer 128 Bits.
//
// Forms:
//
// VLDDQU m128 xmm
// VLDDQU m256 ymm
func VLDDQU(m, xy operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsM128(m) && operand.IsXMM(xy):
return &intrep.Instruction{
Opcode: "VLDDQU",
Operands: []operand.Op{m, xy},
Inputs: []operand.Op{m},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsM256(m) && operand.IsYMM(xy):
return &intrep.Instruction{
Opcode: "VLDDQU",
Operands: []operand.Op{m, xy},
Inputs: []operand.Op{m},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VLDDQU: bad operands")
}
// VLDMXCSR: Load MXCSR Register.
//
// Forms:
//
// VLDMXCSR m32
func VLDMXCSR(m operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsM32(m):
return &intrep.Instruction{
Opcode: "VLDMXCSR",
Operands: []operand.Op{m},
Inputs: []operand.Op{m},
Outputs: []operand.Op{},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VLDMXCSR: bad operands")
}
// VMASKMOVDQU: Store Selected Bytes of Double Quadword.
//
// Forms:
//
// VMASKMOVDQU xmm xmm
func VMASKMOVDQU(x, x1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VMASKMOVDQU",
Operands: []operand.Op{x, x1},
Inputs: []operand.Op{x, x1, reg.RDI},
Outputs: []operand.Op{},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VMASKMOVDQU: bad operands")
}
// VMASKMOVPD: Conditional Move Packed Double-Precision Floating-Point Values.
//
// Forms:
//
// VMASKMOVPD m128 xmm xmm
// VMASKMOVPD m256 ymm ymm
// VMASKMOVPD xmm xmm m128
// VMASKMOVPD ymm ymm m256
func VMASKMOVPD(mxy, xy, mxy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(mxy1):
return &intrep.Instruction{
Opcode: "VMASKMOVPD",
Operands: []operand.Op{mxy, xy, mxy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{mxy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(mxy1):
return &intrep.Instruction{
Opcode: "VMASKMOVPD",
Operands: []operand.Op{mxy, xy, mxy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{mxy1},
ISA: []string{"AVX"},
}, nil
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsM128(mxy1):
return &intrep.Instruction{
Opcode: "VMASKMOVPD",
Operands: []operand.Op{mxy, xy, mxy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{mxy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsM256(mxy1):
return &intrep.Instruction{
Opcode: "VMASKMOVPD",
Operands: []operand.Op{mxy, xy, mxy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{mxy1},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VMASKMOVPD: bad operands")
}
// VMASKMOVPS: Conditional Move Packed Single-Precision Floating-Point Values.
//
// Forms:
//
// VMASKMOVPS m128 xmm xmm
// VMASKMOVPS m256 ymm ymm
// VMASKMOVPS xmm xmm m128
// VMASKMOVPS ymm ymm m256
func VMASKMOVPS(mxy, xy, mxy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(mxy1):
return &intrep.Instruction{
Opcode: "VMASKMOVPS",
Operands: []operand.Op{mxy, xy, mxy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{mxy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(mxy1):
return &intrep.Instruction{
Opcode: "VMASKMOVPS",
Operands: []operand.Op{mxy, xy, mxy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{mxy1},
ISA: []string{"AVX"},
}, nil
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsM128(mxy1):
return &intrep.Instruction{
Opcode: "VMASKMOVPS",
Operands: []operand.Op{mxy, xy, mxy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{mxy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsM256(mxy1):
return &intrep.Instruction{
Opcode: "VMASKMOVPS",
Operands: []operand.Op{mxy, xy, mxy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{mxy1},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VMASKMOVPS: bad operands")
}
// VMAXPD: Return Maximum Packed Double-Precision Floating-Point Values.
//
// Forms:
//
// VMAXPD xmm xmm xmm
// VMAXPD m128 xmm xmm
// VMAXPD ymm ymm ymm
// VMAXPD m256 ymm ymm
func VMAXPD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VMAXPD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VMAXPD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VMAXPD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VMAXPD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VMAXPD: bad operands")
}
// VMAXPS: Return Maximum Packed Single-Precision Floating-Point Values.
//
// Forms:
//
// VMAXPS xmm xmm xmm
// VMAXPS m128 xmm xmm
// VMAXPS ymm ymm ymm
// VMAXPS m256 ymm ymm
func VMAXPS(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VMAXPS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VMAXPS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VMAXPS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VMAXPS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VMAXPS: bad operands")
}
// VMAXSD: Return Maximum Scalar Double-Precision Floating-Point Value.
//
// Forms:
//
// VMAXSD xmm xmm xmm
// VMAXSD m64 xmm xmm
func VMAXSD(mx, x, x1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VMAXSD",
Operands: []operand.Op{mx, x, x1},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x1},
ISA: []string{"AVX"},
}, nil
case operand.IsM64(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VMAXSD",
Operands: []operand.Op{mx, x, x1},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x1},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VMAXSD: bad operands")
}
// VMAXSS: Return Maximum Scalar Single-Precision Floating-Point Value.
//
// Forms:
//
// VMAXSS xmm xmm xmm
// VMAXSS m32 xmm xmm
func VMAXSS(mx, x, x1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VMAXSS",
Operands: []operand.Op{mx, x, x1},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x1},
ISA: []string{"AVX"},
}, nil
case operand.IsM32(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VMAXSS",
Operands: []operand.Op{mx, x, x1},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x1},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VMAXSS: bad operands")
}
// VMINPD: Return Minimum Packed Double-Precision Floating-Point Values.
//
// Forms:
//
// VMINPD xmm xmm xmm
// VMINPD m128 xmm xmm
// VMINPD ymm ymm ymm
// VMINPD m256 ymm ymm
func VMINPD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VMINPD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VMINPD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VMINPD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VMINPD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VMINPD: bad operands")
}
// VMINPS: Return Minimum Packed Single-Precision Floating-Point Values.
//
// Forms:
//
// VMINPS xmm xmm xmm
// VMINPS m128 xmm xmm
// VMINPS ymm ymm ymm
// VMINPS m256 ymm ymm
func VMINPS(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VMINPS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VMINPS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VMINPS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VMINPS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VMINPS: bad operands")
}
// VMINSD: Return Minimum Scalar Double-Precision Floating-Point Value.
//
// Forms:
//
// VMINSD xmm xmm xmm
// VMINSD m64 xmm xmm
func VMINSD(mx, x, x1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VMINSD",
Operands: []operand.Op{mx, x, x1},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x1},
ISA: []string{"AVX"},
}, nil
case operand.IsM64(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VMINSD",
Operands: []operand.Op{mx, x, x1},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x1},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VMINSD: bad operands")
}
// VMINSS: Return Minimum Scalar Single-Precision Floating-Point Value.
//
// Forms:
//
// VMINSS xmm xmm xmm
// VMINSS m32 xmm xmm
func VMINSS(mx, x, x1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VMINSS",
Operands: []operand.Op{mx, x, x1},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x1},
ISA: []string{"AVX"},
}, nil
case operand.IsM32(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VMINSS",
Operands: []operand.Op{mx, x, x1},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x1},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VMINSS: bad operands")
}
// VMOVAPD: Move Aligned Packed Double-Precision Floating-Point Values.
//
// Forms:
//
// VMOVAPD xmm xmm
// VMOVAPD m128 xmm
// VMOVAPD ymm ymm
// VMOVAPD m256 ymm
// VMOVAPD xmm m128
// VMOVAPD ymm m256
func VMOVAPD(mxy, mxy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(mxy1):
return &intrep.Instruction{
Opcode: "VMOVAPD",
Operands: []operand.Op{mxy, mxy1},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{mxy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(mxy1):
return &intrep.Instruction{
Opcode: "VMOVAPD",
Operands: []operand.Op{mxy, mxy1},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{mxy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(mxy1):
return &intrep.Instruction{
Opcode: "VMOVAPD",
Operands: []operand.Op{mxy, mxy1},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{mxy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(mxy1):
return &intrep.Instruction{
Opcode: "VMOVAPD",
Operands: []operand.Op{mxy, mxy1},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{mxy1},
ISA: []string{"AVX"},
}, nil
case operand.IsXMM(mxy) && operand.IsM128(mxy1):
return &intrep.Instruction{
Opcode: "VMOVAPD",
Operands: []operand.Op{mxy, mxy1},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{mxy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsM256(mxy1):
return &intrep.Instruction{
Opcode: "VMOVAPD",
Operands: []operand.Op{mxy, mxy1},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{mxy1},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VMOVAPD: bad operands")
}
// VMOVAPS: Move Aligned Packed Single-Precision Floating-Point Values.
//
// Forms:
//
// VMOVAPS xmm xmm
// VMOVAPS m128 xmm
// VMOVAPS ymm ymm
// VMOVAPS m256 ymm
// VMOVAPS xmm m128
// VMOVAPS ymm m256
func VMOVAPS(mxy, mxy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(mxy1):
return &intrep.Instruction{
Opcode: "VMOVAPS",
Operands: []operand.Op{mxy, mxy1},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{mxy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(mxy1):
return &intrep.Instruction{
Opcode: "VMOVAPS",
Operands: []operand.Op{mxy, mxy1},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{mxy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(mxy1):
return &intrep.Instruction{
Opcode: "VMOVAPS",
Operands: []operand.Op{mxy, mxy1},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{mxy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(mxy1):
return &intrep.Instruction{
Opcode: "VMOVAPS",
Operands: []operand.Op{mxy, mxy1},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{mxy1},
ISA: []string{"AVX"},
}, nil
case operand.IsXMM(mxy) && operand.IsM128(mxy1):
return &intrep.Instruction{
Opcode: "VMOVAPS",
Operands: []operand.Op{mxy, mxy1},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{mxy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsM256(mxy1):
return &intrep.Instruction{
Opcode: "VMOVAPS",
Operands: []operand.Op{mxy, mxy1},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{mxy1},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VMOVAPS: bad operands")
}
// VMOVD: Move Doubleword.
//
// Forms:
//
// VMOVD xmm r32
// VMOVD r32 xmm
// VMOVD m32 xmm
// VMOVD xmm m32
func VMOVD(mrx, mrx1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mrx) && operand.IsR32(mrx1):
return &intrep.Instruction{
Opcode: "VMOVD",
Operands: []operand.Op{mrx, mrx1},
Inputs: []operand.Op{mrx},
Outputs: []operand.Op{mrx1},
ISA: []string{"AVX"},
}, nil
case operand.IsR32(mrx) && operand.IsXMM(mrx1):
return &intrep.Instruction{
Opcode: "VMOVD",
Operands: []operand.Op{mrx, mrx1},
Inputs: []operand.Op{mrx},
Outputs: []operand.Op{mrx1},
ISA: []string{"AVX"},
}, nil
case operand.IsM32(mrx) && operand.IsXMM(mrx1):
return &intrep.Instruction{
Opcode: "VMOVD",
Operands: []operand.Op{mrx, mrx1},
Inputs: []operand.Op{mrx},
Outputs: []operand.Op{mrx1},
ISA: []string{"AVX"},
}, nil
case operand.IsXMM(mrx) && operand.IsM32(mrx1):
return &intrep.Instruction{
Opcode: "VMOVD",
Operands: []operand.Op{mrx, mrx1},
Inputs: []operand.Op{mrx},
Outputs: []operand.Op{mrx1},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VMOVD: bad operands")
}
// VMOVDDUP: Move One Double-FP and Duplicate.
//
// Forms:
//
// VMOVDDUP xmm xmm
// VMOVDDUP m64 xmm
// VMOVDDUP ymm ymm
// VMOVDDUP m256 ymm
func VMOVDDUP(mxy, xy operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy):
return &intrep.Instruction{
Opcode: "VMOVDDUP",
Operands: []operand.Op{mxy, xy},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsM64(mxy) && operand.IsXMM(xy):
return &intrep.Instruction{
Opcode: "VMOVDDUP",
Operands: []operand.Op{mxy, xy},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy):
return &intrep.Instruction{
Opcode: "VMOVDDUP",
Operands: []operand.Op{mxy, xy},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy):
return &intrep.Instruction{
Opcode: "VMOVDDUP",
Operands: []operand.Op{mxy, xy},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VMOVDDUP: bad operands")
}
// VMOVDQA: Move Aligned Double Quadword.
//
// Forms:
//
// VMOVDQA xmm xmm
// VMOVDQA m128 xmm
// VMOVDQA ymm ymm
// VMOVDQA m256 ymm
// VMOVDQA xmm m128
// VMOVDQA ymm m256
func VMOVDQA(mxy, mxy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(mxy1):
return &intrep.Instruction{
Opcode: "VMOVDQA",
Operands: []operand.Op{mxy, mxy1},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{mxy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(mxy1):
return &intrep.Instruction{
Opcode: "VMOVDQA",
Operands: []operand.Op{mxy, mxy1},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{mxy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(mxy1):
return &intrep.Instruction{
Opcode: "VMOVDQA",
Operands: []operand.Op{mxy, mxy1},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{mxy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(mxy1):
return &intrep.Instruction{
Opcode: "VMOVDQA",
Operands: []operand.Op{mxy, mxy1},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{mxy1},
ISA: []string{"AVX"},
}, nil
case operand.IsXMM(mxy) && operand.IsM128(mxy1):
return &intrep.Instruction{
Opcode: "VMOVDQA",
Operands: []operand.Op{mxy, mxy1},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{mxy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsM256(mxy1):
return &intrep.Instruction{
Opcode: "VMOVDQA",
Operands: []operand.Op{mxy, mxy1},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{mxy1},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VMOVDQA: bad operands")
}
// VMOVDQU: Move Unaligned Double Quadword.
//
// Forms:
//
// VMOVDQU xmm xmm
// VMOVDQU m128 xmm
// VMOVDQU ymm ymm
// VMOVDQU m256 ymm
// VMOVDQU xmm m128
// VMOVDQU ymm m256
func VMOVDQU(mxy, mxy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(mxy1):
return &intrep.Instruction{
Opcode: "VMOVDQU",
Operands: []operand.Op{mxy, mxy1},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{mxy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(mxy1):
return &intrep.Instruction{
Opcode: "VMOVDQU",
Operands: []operand.Op{mxy, mxy1},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{mxy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(mxy1):
return &intrep.Instruction{
Opcode: "VMOVDQU",
Operands: []operand.Op{mxy, mxy1},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{mxy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(mxy1):
return &intrep.Instruction{
Opcode: "VMOVDQU",
Operands: []operand.Op{mxy, mxy1},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{mxy1},
ISA: []string{"AVX"},
}, nil
case operand.IsXMM(mxy) && operand.IsM128(mxy1):
return &intrep.Instruction{
Opcode: "VMOVDQU",
Operands: []operand.Op{mxy, mxy1},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{mxy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsM256(mxy1):
return &intrep.Instruction{
Opcode: "VMOVDQU",
Operands: []operand.Op{mxy, mxy1},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{mxy1},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VMOVDQU: bad operands")
}
// VMOVHLPS: Move Packed Single-Precision Floating-Point Values High to Low.
//
// Forms:
//
// VMOVHLPS xmm xmm xmm
func VMOVHLPS(x, x1, x2 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(x) && operand.IsXMM(x1) && operand.IsXMM(x2):
return &intrep.Instruction{
Opcode: "VMOVHLPS",
Operands: []operand.Op{x, x1, x2},
Inputs: []operand.Op{x, x1},
Outputs: []operand.Op{x2},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VMOVHLPS: bad operands")
}
// VMOVHPD: Move High Packed Double-Precision Floating-Point Value.
//
// Forms:
//
// VMOVHPD xmm m64
// VMOVHPD m64 xmm xmm
func VMOVHPD(ops ...operand.Op) (*intrep.Instruction, error) {
switch {
case len(ops) == 2 && operand.IsXMM(ops[0]) && operand.IsM64(ops[1]):
return &intrep.Instruction{
Opcode: "VMOVHPD",
Operands: ops,
Inputs: []operand.Op{ops[0]},
Outputs: []operand.Op{ops[1]},
ISA: []string{"AVX"},
}, nil
case len(ops) == 3 && operand.IsM64(ops[0]) && operand.IsXMM(ops[1]) && operand.IsXMM(ops[2]):
return &intrep.Instruction{
Opcode: "VMOVHPD",
Operands: ops,
Inputs: []operand.Op{ops[0], ops[1]},
Outputs: []operand.Op{ops[2]},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VMOVHPD: bad operands")
}
// VMOVHPS: Move High Packed Single-Precision Floating-Point Values.
//
// Forms:
//
// VMOVHPS xmm m64
// VMOVHPS m64 xmm xmm
func VMOVHPS(ops ...operand.Op) (*intrep.Instruction, error) {
switch {
case len(ops) == 2 && operand.IsXMM(ops[0]) && operand.IsM64(ops[1]):
return &intrep.Instruction{
Opcode: "VMOVHPS",
Operands: ops,
Inputs: []operand.Op{ops[0]},
Outputs: []operand.Op{ops[1]},
ISA: []string{"AVX"},
}, nil
case len(ops) == 3 && operand.IsM64(ops[0]) && operand.IsXMM(ops[1]) && operand.IsXMM(ops[2]):
return &intrep.Instruction{
Opcode: "VMOVHPS",
Operands: ops,
Inputs: []operand.Op{ops[0], ops[1]},
Outputs: []operand.Op{ops[2]},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VMOVHPS: bad operands")
}
// VMOVLHPS: Move Packed Single-Precision Floating-Point Values Low to High.
//
// Forms:
//
// VMOVLHPS xmm xmm xmm
func VMOVLHPS(x, x1, x2 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(x) && operand.IsXMM(x1) && operand.IsXMM(x2):
return &intrep.Instruction{
Opcode: "VMOVLHPS",
Operands: []operand.Op{x, x1, x2},
Inputs: []operand.Op{x, x1},
Outputs: []operand.Op{x2},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VMOVLHPS: bad operands")
}
// VMOVLPD: Move Low Packed Double-Precision Floating-Point Value.
//
// Forms:
//
// VMOVLPD xmm m64
// VMOVLPD m64 xmm xmm
func VMOVLPD(ops ...operand.Op) (*intrep.Instruction, error) {
switch {
case len(ops) == 2 && operand.IsXMM(ops[0]) && operand.IsM64(ops[1]):
return &intrep.Instruction{
Opcode: "VMOVLPD",
Operands: ops,
Inputs: []operand.Op{ops[0]},
Outputs: []operand.Op{ops[1]},
ISA: []string{"AVX"},
}, nil
case len(ops) == 3 && operand.IsM64(ops[0]) && operand.IsXMM(ops[1]) && operand.IsXMM(ops[2]):
return &intrep.Instruction{
Opcode: "VMOVLPD",
Operands: ops,
Inputs: []operand.Op{ops[0], ops[1]},
Outputs: []operand.Op{ops[2]},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VMOVLPD: bad operands")
}
// VMOVLPS: Move Low Packed Single-Precision Floating-Point Values.
//
// Forms:
//
// VMOVLPS xmm m64
// VMOVLPS m64 xmm xmm
func VMOVLPS(ops ...operand.Op) (*intrep.Instruction, error) {
switch {
case len(ops) == 2 && operand.IsXMM(ops[0]) && operand.IsM64(ops[1]):
return &intrep.Instruction{
Opcode: "VMOVLPS",
Operands: ops,
Inputs: []operand.Op{ops[0]},
Outputs: []operand.Op{ops[1]},
ISA: []string{"AVX"},
}, nil
case len(ops) == 3 && operand.IsM64(ops[0]) && operand.IsXMM(ops[1]) && operand.IsXMM(ops[2]):
return &intrep.Instruction{
Opcode: "VMOVLPS",
Operands: ops,
Inputs: []operand.Op{ops[0], ops[1]},
Outputs: []operand.Op{ops[2]},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VMOVLPS: bad operands")
}
// VMOVMSKPD: Extract Packed Double-Precision Floating-Point Sign Mask.
//
// Forms:
//
// VMOVMSKPD xmm r32
// VMOVMSKPD ymm r32
func VMOVMSKPD(xy, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(xy) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "VMOVMSKPD",
Operands: []operand.Op{xy, r},
Inputs: []operand.Op{xy},
Outputs: []operand.Op{r},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(xy) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "VMOVMSKPD",
Operands: []operand.Op{xy, r},
Inputs: []operand.Op{xy},
Outputs: []operand.Op{r},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VMOVMSKPD: bad operands")
}
// VMOVMSKPS: Extract Packed Single-Precision Floating-Point Sign Mask.
//
// Forms:
//
// VMOVMSKPS xmm r32
// VMOVMSKPS ymm r32
func VMOVMSKPS(xy, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(xy) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "VMOVMSKPS",
Operands: []operand.Op{xy, r},
Inputs: []operand.Op{xy},
Outputs: []operand.Op{r},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(xy) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "VMOVMSKPS",
Operands: []operand.Op{xy, r},
Inputs: []operand.Op{xy},
Outputs: []operand.Op{r},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VMOVMSKPS: bad operands")
}
// VMOVNTDQ: Store Double Quadword Using Non-Temporal Hint.
//
// Forms:
//
// VMOVNTDQ xmm m128
// VMOVNTDQ ymm m256
func VMOVNTDQ(xy, m operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(xy) && operand.IsM128(m):
return &intrep.Instruction{
Opcode: "VMOVNTDQ",
Operands: []operand.Op{xy, m},
Inputs: []operand.Op{xy},
Outputs: []operand.Op{m},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(xy) && operand.IsM256(m):
return &intrep.Instruction{
Opcode: "VMOVNTDQ",
Operands: []operand.Op{xy, m},
Inputs: []operand.Op{xy},
Outputs: []operand.Op{m},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VMOVNTDQ: bad operands")
}
// VMOVNTDQA: Load Double Quadword Non-Temporal Aligned Hint.
//
// Forms:
//
// VMOVNTDQA m128 xmm
// VMOVNTDQA m256 ymm
func VMOVNTDQA(m, xy operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsM128(m) && operand.IsXMM(xy):
return &intrep.Instruction{
Opcode: "VMOVNTDQA",
Operands: []operand.Op{m, xy},
Inputs: []operand.Op{m},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsM256(m) && operand.IsYMM(xy):
return &intrep.Instruction{
Opcode: "VMOVNTDQA",
Operands: []operand.Op{m, xy},
Inputs: []operand.Op{m},
Outputs: []operand.Op{xy},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VMOVNTDQA: bad operands")
}
// VMOVNTPD: Store Packed Double-Precision Floating-Point Values Using Non-Temporal Hint.
//
// Forms:
//
// VMOVNTPD xmm m128
// VMOVNTPD ymm m256
func VMOVNTPD(xy, m operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(xy) && operand.IsM128(m):
return &intrep.Instruction{
Opcode: "VMOVNTPD",
Operands: []operand.Op{xy, m},
Inputs: []operand.Op{xy},
Outputs: []operand.Op{m},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(xy) && operand.IsM256(m):
return &intrep.Instruction{
Opcode: "VMOVNTPD",
Operands: []operand.Op{xy, m},
Inputs: []operand.Op{xy},
Outputs: []operand.Op{m},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VMOVNTPD: bad operands")
}
// VMOVNTPS: Store Packed Single-Precision Floating-Point Values Using Non-Temporal Hint.
//
// Forms:
//
// VMOVNTPS xmm m128
// VMOVNTPS ymm m256
func VMOVNTPS(xy, m operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(xy) && operand.IsM128(m):
return &intrep.Instruction{
Opcode: "VMOVNTPS",
Operands: []operand.Op{xy, m},
Inputs: []operand.Op{xy},
Outputs: []operand.Op{m},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(xy) && operand.IsM256(m):
return &intrep.Instruction{
Opcode: "VMOVNTPS",
Operands: []operand.Op{xy, m},
Inputs: []operand.Op{xy},
Outputs: []operand.Op{m},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VMOVNTPS: bad operands")
}
// VMOVQ: Move Quadword.
//
// Forms:
//
// VMOVQ xmm r64
// VMOVQ r64 xmm
// VMOVQ xmm xmm
// VMOVQ m64 xmm
// VMOVQ xmm m64
func VMOVQ(mrx, mrx1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mrx) && operand.IsR64(mrx1):
return &intrep.Instruction{
Opcode: "VMOVQ",
Operands: []operand.Op{mrx, mrx1},
Inputs: []operand.Op{mrx},
Outputs: []operand.Op{mrx1},
ISA: []string{"AVX"},
}, nil
case operand.IsR64(mrx) && operand.IsXMM(mrx1):
return &intrep.Instruction{
Opcode: "VMOVQ",
Operands: []operand.Op{mrx, mrx1},
Inputs: []operand.Op{mrx},
Outputs: []operand.Op{mrx1},
ISA: []string{"AVX"},
}, nil
case operand.IsXMM(mrx) && operand.IsXMM(mrx1):
return &intrep.Instruction{
Opcode: "VMOVQ",
Operands: []operand.Op{mrx, mrx1},
Inputs: []operand.Op{mrx},
Outputs: []operand.Op{mrx1},
ISA: []string{"AVX"},
}, nil
case operand.IsM64(mrx) && operand.IsXMM(mrx1):
return &intrep.Instruction{
Opcode: "VMOVQ",
Operands: []operand.Op{mrx, mrx1},
Inputs: []operand.Op{mrx},
Outputs: []operand.Op{mrx1},
ISA: []string{"AVX"},
}, nil
case operand.IsXMM(mrx) && operand.IsM64(mrx1):
return &intrep.Instruction{
Opcode: "VMOVQ",
Operands: []operand.Op{mrx, mrx1},
Inputs: []operand.Op{mrx},
Outputs: []operand.Op{mrx1},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VMOVQ: bad operands")
}
// VMOVSD: Move Scalar Double-Precision Floating-Point Value.
//
// Forms:
//
// VMOVSD m64 xmm
// VMOVSD xmm m64
// VMOVSD xmm xmm xmm
func VMOVSD(ops ...operand.Op) (*intrep.Instruction, error) {
switch {
case len(ops) == 2 && operand.IsM64(ops[0]) && operand.IsXMM(ops[1]):
return &intrep.Instruction{
Opcode: "VMOVSD",
Operands: ops,
Inputs: []operand.Op{ops[0]},
Outputs: []operand.Op{ops[1]},
ISA: []string{"AVX"},
}, nil
case len(ops) == 2 && operand.IsXMM(ops[0]) && operand.IsM64(ops[1]):
return &intrep.Instruction{
Opcode: "VMOVSD",
Operands: ops,
Inputs: []operand.Op{ops[0]},
Outputs: []operand.Op{ops[1]},
ISA: []string{"AVX"},
}, nil
case len(ops) == 3 && operand.IsXMM(ops[0]) && operand.IsXMM(ops[1]) && operand.IsXMM(ops[2]):
return &intrep.Instruction{
Opcode: "VMOVSD",
Operands: ops,
Inputs: []operand.Op{ops[0], ops[1]},
Outputs: []operand.Op{ops[2]},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VMOVSD: bad operands")
}
// VMOVSHDUP: Move Packed Single-FP High and Duplicate.
//
// Forms:
//
// VMOVSHDUP xmm xmm
// VMOVSHDUP m128 xmm
// VMOVSHDUP ymm ymm
// VMOVSHDUP m256 ymm
func VMOVSHDUP(mxy, xy operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy):
return &intrep.Instruction{
Opcode: "VMOVSHDUP",
Operands: []operand.Op{mxy, xy},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy):
return &intrep.Instruction{
Opcode: "VMOVSHDUP",
Operands: []operand.Op{mxy, xy},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy):
return &intrep.Instruction{
Opcode: "VMOVSHDUP",
Operands: []operand.Op{mxy, xy},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy):
return &intrep.Instruction{
Opcode: "VMOVSHDUP",
Operands: []operand.Op{mxy, xy},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VMOVSHDUP: bad operands")
}
// VMOVSLDUP: Move Packed Single-FP Low and Duplicate.
//
// Forms:
//
// VMOVSLDUP xmm xmm
// VMOVSLDUP m128 xmm
// VMOVSLDUP ymm ymm
// VMOVSLDUP m256 ymm
func VMOVSLDUP(mxy, xy operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy):
return &intrep.Instruction{
Opcode: "VMOVSLDUP",
Operands: []operand.Op{mxy, xy},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy):
return &intrep.Instruction{
Opcode: "VMOVSLDUP",
Operands: []operand.Op{mxy, xy},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy):
return &intrep.Instruction{
Opcode: "VMOVSLDUP",
Operands: []operand.Op{mxy, xy},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy):
return &intrep.Instruction{
Opcode: "VMOVSLDUP",
Operands: []operand.Op{mxy, xy},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VMOVSLDUP: bad operands")
}
// VMOVSS: Move Scalar Single-Precision Floating-Point Values.
//
// Forms:
//
// VMOVSS m32 xmm
// VMOVSS xmm m32
// VMOVSS xmm xmm xmm
func VMOVSS(ops ...operand.Op) (*intrep.Instruction, error) {
switch {
case len(ops) == 2 && operand.IsM32(ops[0]) && operand.IsXMM(ops[1]):
return &intrep.Instruction{
Opcode: "VMOVSS",
Operands: ops,
Inputs: []operand.Op{ops[0]},
Outputs: []operand.Op{ops[1]},
ISA: []string{"AVX"},
}, nil
case len(ops) == 2 && operand.IsXMM(ops[0]) && operand.IsM32(ops[1]):
return &intrep.Instruction{
Opcode: "VMOVSS",
Operands: ops,
Inputs: []operand.Op{ops[0]},
Outputs: []operand.Op{ops[1]},
ISA: []string{"AVX"},
}, nil
case len(ops) == 3 && operand.IsXMM(ops[0]) && operand.IsXMM(ops[1]) && operand.IsXMM(ops[2]):
return &intrep.Instruction{
Opcode: "VMOVSS",
Operands: ops,
Inputs: []operand.Op{ops[0], ops[1]},
Outputs: []operand.Op{ops[2]},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VMOVSS: bad operands")
}
// VMOVUPD: Move Unaligned Packed Double-Precision Floating-Point Values.
//
// Forms:
//
// VMOVUPD xmm xmm
// VMOVUPD m128 xmm
// VMOVUPD ymm ymm
// VMOVUPD m256 ymm
// VMOVUPD xmm m128
// VMOVUPD ymm m256
func VMOVUPD(mxy, mxy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(mxy1):
return &intrep.Instruction{
Opcode: "VMOVUPD",
Operands: []operand.Op{mxy, mxy1},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{mxy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(mxy1):
return &intrep.Instruction{
Opcode: "VMOVUPD",
Operands: []operand.Op{mxy, mxy1},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{mxy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(mxy1):
return &intrep.Instruction{
Opcode: "VMOVUPD",
Operands: []operand.Op{mxy, mxy1},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{mxy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(mxy1):
return &intrep.Instruction{
Opcode: "VMOVUPD",
Operands: []operand.Op{mxy, mxy1},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{mxy1},
ISA: []string{"AVX"},
}, nil
case operand.IsXMM(mxy) && operand.IsM128(mxy1):
return &intrep.Instruction{
Opcode: "VMOVUPD",
Operands: []operand.Op{mxy, mxy1},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{mxy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsM256(mxy1):
return &intrep.Instruction{
Opcode: "VMOVUPD",
Operands: []operand.Op{mxy, mxy1},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{mxy1},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VMOVUPD: bad operands")
}
// VMOVUPS: Move Unaligned Packed Single-Precision Floating-Point Values.
//
// Forms:
//
// VMOVUPS xmm xmm
// VMOVUPS m128 xmm
// VMOVUPS ymm ymm
// VMOVUPS m256 ymm
// VMOVUPS xmm m128
// VMOVUPS ymm m256
func VMOVUPS(mxy, mxy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(mxy1):
return &intrep.Instruction{
Opcode: "VMOVUPS",
Operands: []operand.Op{mxy, mxy1},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{mxy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(mxy1):
return &intrep.Instruction{
Opcode: "VMOVUPS",
Operands: []operand.Op{mxy, mxy1},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{mxy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(mxy1):
return &intrep.Instruction{
Opcode: "VMOVUPS",
Operands: []operand.Op{mxy, mxy1},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{mxy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(mxy1):
return &intrep.Instruction{
Opcode: "VMOVUPS",
Operands: []operand.Op{mxy, mxy1},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{mxy1},
ISA: []string{"AVX"},
}, nil
case operand.IsXMM(mxy) && operand.IsM128(mxy1):
return &intrep.Instruction{
Opcode: "VMOVUPS",
Operands: []operand.Op{mxy, mxy1},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{mxy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsM256(mxy1):
return &intrep.Instruction{
Opcode: "VMOVUPS",
Operands: []operand.Op{mxy, mxy1},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{mxy1},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VMOVUPS: bad operands")
}
// VMPSADBW: Compute Multiple Packed Sums of Absolute Difference.
//
// Forms:
//
// VMPSADBW imm8 xmm xmm xmm
// VMPSADBW imm8 m128 xmm xmm
// VMPSADBW imm8 ymm ymm ymm
// VMPSADBW imm8 m256 ymm ymm
func VMPSADBW(i, mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(i) && operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VMPSADBW",
Operands: []operand.Op{i, mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsIMM8(i) && operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VMPSADBW",
Operands: []operand.Op{i, mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsIMM8(i) && operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VMPSADBW",
Operands: []operand.Op{i, mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsIMM8(i) && operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VMPSADBW",
Operands: []operand.Op{i, mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VMPSADBW: bad operands")
}
// VMULPD: Multiply Packed Double-Precision Floating-Point Values.
//
// Forms:
//
// VMULPD xmm xmm xmm
// VMULPD m128 xmm xmm
// VMULPD ymm ymm ymm
// VMULPD m256 ymm ymm
func VMULPD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VMULPD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VMULPD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VMULPD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VMULPD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VMULPD: bad operands")
}
// VMULPS: Multiply Packed Single-Precision Floating-Point Values.
//
// Forms:
//
// VMULPS xmm xmm xmm
// VMULPS m128 xmm xmm
// VMULPS ymm ymm ymm
// VMULPS m256 ymm ymm
func VMULPS(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VMULPS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VMULPS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VMULPS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VMULPS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VMULPS: bad operands")
}
// VMULSD: Multiply Scalar Double-Precision Floating-Point Values.
//
// Forms:
//
// VMULSD xmm xmm xmm
// VMULSD m64 xmm xmm
func VMULSD(mx, x, x1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VMULSD",
Operands: []operand.Op{mx, x, x1},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x1},
ISA: []string{"AVX"},
}, nil
case operand.IsM64(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VMULSD",
Operands: []operand.Op{mx, x, x1},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x1},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VMULSD: bad operands")
}
// VMULSS: Multiply Scalar Single-Precision Floating-Point Values.
//
// Forms:
//
// VMULSS xmm xmm xmm
// VMULSS m32 xmm xmm
func VMULSS(mx, x, x1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VMULSS",
Operands: []operand.Op{mx, x, x1},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x1},
ISA: []string{"AVX"},
}, nil
case operand.IsM32(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VMULSS",
Operands: []operand.Op{mx, x, x1},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x1},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VMULSS: bad operands")
}
// VORPD: Bitwise Logical OR of Double-Precision Floating-Point Values.
//
// Forms:
//
// VORPD xmm xmm xmm
// VORPD m128 xmm xmm
// VORPD ymm ymm ymm
// VORPD m256 ymm ymm
func VORPD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VORPD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VORPD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VORPD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VORPD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VORPD: bad operands")
}
// VORPS: Bitwise Logical OR of Single-Precision Floating-Point Values.
//
// Forms:
//
// VORPS xmm xmm xmm
// VORPS m128 xmm xmm
// VORPS ymm ymm ymm
// VORPS m256 ymm ymm
func VORPS(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VORPS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VORPS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VORPS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VORPS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VORPS: bad operands")
}
// VPABSB: Packed Absolute Value of Byte Integers.
//
// Forms:
//
// VPABSB xmm xmm
// VPABSB m128 xmm
// VPABSB ymm ymm
// VPABSB m256 ymm
func VPABSB(mxy, xy operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy):
return &intrep.Instruction{
Opcode: "VPABSB",
Operands: []operand.Op{mxy, xy},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy):
return &intrep.Instruction{
Opcode: "VPABSB",
Operands: []operand.Op{mxy, xy},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy):
return &intrep.Instruction{
Opcode: "VPABSB",
Operands: []operand.Op{mxy, xy},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{xy},
ISA: []string{"AVX2"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy):
return &intrep.Instruction{
Opcode: "VPABSB",
Operands: []operand.Op{mxy, xy},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{xy},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPABSB: bad operands")
}
// VPABSD: Packed Absolute Value of Doubleword Integers.
//
// Forms:
//
// VPABSD xmm xmm
// VPABSD m128 xmm
// VPABSD ymm ymm
// VPABSD m256 ymm
func VPABSD(mxy, xy operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy):
return &intrep.Instruction{
Opcode: "VPABSD",
Operands: []operand.Op{mxy, xy},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy):
return &intrep.Instruction{
Opcode: "VPABSD",
Operands: []operand.Op{mxy, xy},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy):
return &intrep.Instruction{
Opcode: "VPABSD",
Operands: []operand.Op{mxy, xy},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{xy},
ISA: []string{"AVX2"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy):
return &intrep.Instruction{
Opcode: "VPABSD",
Operands: []operand.Op{mxy, xy},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{xy},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPABSD: bad operands")
}
// VPABSW: Packed Absolute Value of Word Integers.
//
// Forms:
//
// VPABSW xmm xmm
// VPABSW m128 xmm
// VPABSW ymm ymm
// VPABSW m256 ymm
func VPABSW(mxy, xy operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy):
return &intrep.Instruction{
Opcode: "VPABSW",
Operands: []operand.Op{mxy, xy},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy):
return &intrep.Instruction{
Opcode: "VPABSW",
Operands: []operand.Op{mxy, xy},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy):
return &intrep.Instruction{
Opcode: "VPABSW",
Operands: []operand.Op{mxy, xy},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{xy},
ISA: []string{"AVX2"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy):
return &intrep.Instruction{
Opcode: "VPABSW",
Operands: []operand.Op{mxy, xy},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{xy},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPABSW: bad operands")
}
// VPACKSSDW: Pack Doublewords into Words with Signed Saturation.
//
// Forms:
//
// VPACKSSDW xmm xmm xmm
// VPACKSSDW m128 xmm xmm
// VPACKSSDW ymm ymm ymm
// VPACKSSDW m256 ymm ymm
func VPACKSSDW(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPACKSSDW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPACKSSDW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPACKSSDW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPACKSSDW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPACKSSDW: bad operands")
}
// VPACKSSWB: Pack Words into Bytes with Signed Saturation.
//
// Forms:
//
// VPACKSSWB xmm xmm xmm
// VPACKSSWB m128 xmm xmm
// VPACKSSWB ymm ymm ymm
// VPACKSSWB m256 ymm ymm
func VPACKSSWB(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPACKSSWB",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPACKSSWB",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPACKSSWB",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPACKSSWB",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPACKSSWB: bad operands")
}
// VPACKUSDW: Pack Doublewords into Words with Unsigned Saturation.
//
// Forms:
//
// VPACKUSDW xmm xmm xmm
// VPACKUSDW m128 xmm xmm
// VPACKUSDW ymm ymm ymm
// VPACKUSDW m256 ymm ymm
func VPACKUSDW(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPACKUSDW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPACKUSDW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPACKUSDW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPACKUSDW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPACKUSDW: bad operands")
}
// VPACKUSWB: Pack Words into Bytes with Unsigned Saturation.
//
// Forms:
//
// VPACKUSWB xmm xmm xmm
// VPACKUSWB m128 xmm xmm
// VPACKUSWB ymm ymm ymm
// VPACKUSWB m256 ymm ymm
func VPACKUSWB(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPACKUSWB",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPACKUSWB",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPACKUSWB",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPACKUSWB",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPACKUSWB: bad operands")
}
// VPADDB: Add Packed Byte Integers.
//
// Forms:
//
// VPADDB xmm xmm xmm
// VPADDB m128 xmm xmm
// VPADDB ymm ymm ymm
// VPADDB m256 ymm ymm
func VPADDB(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPADDB",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPADDB",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPADDB",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPADDB",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPADDB: bad operands")
}
// VPADDD: Add Packed Doubleword Integers.
//
// Forms:
//
// VPADDD xmm xmm xmm
// VPADDD m128 xmm xmm
// VPADDD ymm ymm ymm
// VPADDD m256 ymm ymm
func VPADDD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPADDD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPADDD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPADDD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPADDD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPADDD: bad operands")
}
// VPADDQ: Add Packed Quadword Integers.
//
// Forms:
//
// VPADDQ xmm xmm xmm
// VPADDQ m128 xmm xmm
// VPADDQ ymm ymm ymm
// VPADDQ m256 ymm ymm
func VPADDQ(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPADDQ",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPADDQ",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPADDQ",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPADDQ",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPADDQ: bad operands")
}
// VPADDSB: Add Packed Signed Byte Integers with Signed Saturation.
//
// Forms:
//
// VPADDSB xmm xmm xmm
// VPADDSB m128 xmm xmm
// VPADDSB ymm ymm ymm
// VPADDSB m256 ymm ymm
func VPADDSB(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPADDSB",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPADDSB",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPADDSB",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPADDSB",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPADDSB: bad operands")
}
// VPADDSW: Add Packed Signed Word Integers with Signed Saturation.
//
// Forms:
//
// VPADDSW xmm xmm xmm
// VPADDSW m128 xmm xmm
// VPADDSW ymm ymm ymm
// VPADDSW m256 ymm ymm
func VPADDSW(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPADDSW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPADDSW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPADDSW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPADDSW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPADDSW: bad operands")
}
// VPADDUSB: Add Packed Unsigned Byte Integers with Unsigned Saturation.
//
// Forms:
//
// VPADDUSB xmm xmm xmm
// VPADDUSB m128 xmm xmm
// VPADDUSB ymm ymm ymm
// VPADDUSB m256 ymm ymm
func VPADDUSB(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPADDUSB",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPADDUSB",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPADDUSB",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPADDUSB",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPADDUSB: bad operands")
}
// VPADDUSW: Add Packed Unsigned Word Integers with Unsigned Saturation.
//
// Forms:
//
// VPADDUSW xmm xmm xmm
// VPADDUSW m128 xmm xmm
// VPADDUSW ymm ymm ymm
// VPADDUSW m256 ymm ymm
func VPADDUSW(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPADDUSW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPADDUSW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPADDUSW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPADDUSW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPADDUSW: bad operands")
}
// VPADDW: Add Packed Word Integers.
//
// Forms:
//
// VPADDW xmm xmm xmm
// VPADDW m128 xmm xmm
// VPADDW ymm ymm ymm
// VPADDW m256 ymm ymm
func VPADDW(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPADDW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPADDW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPADDW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPADDW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPADDW: bad operands")
}
// VPALIGNR: Packed Align Right.
//
// Forms:
//
// VPALIGNR imm8 xmm xmm xmm
// VPALIGNR imm8 m128 xmm xmm
// VPALIGNR imm8 ymm ymm ymm
// VPALIGNR imm8 m256 ymm ymm
func VPALIGNR(i, mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(i) && operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPALIGNR",
Operands: []operand.Op{i, mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsIMM8(i) && operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPALIGNR",
Operands: []operand.Op{i, mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsIMM8(i) && operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPALIGNR",
Operands: []operand.Op{i, mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsIMM8(i) && operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPALIGNR",
Operands: []operand.Op{i, mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPALIGNR: bad operands")
}
// VPAND: Packed Bitwise Logical AND.
//
// Forms:
//
// VPAND xmm xmm xmm
// VPAND m128 xmm xmm
// VPAND ymm ymm ymm
// VPAND m256 ymm ymm
func VPAND(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPAND",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPAND",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPAND",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPAND",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPAND: bad operands")
}
// VPANDN: Packed Bitwise Logical AND NOT.
//
// Forms:
//
// VPANDN xmm xmm xmm
// VPANDN m128 xmm xmm
// VPANDN ymm ymm ymm
// VPANDN m256 ymm ymm
func VPANDN(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPANDN",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
CancellingInputs: true,
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPANDN",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPANDN",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
CancellingInputs: true,
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPANDN",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPANDN: bad operands")
}
// VPAVGB: Average Packed Byte Integers.
//
// Forms:
//
// VPAVGB xmm xmm xmm
// VPAVGB m128 xmm xmm
// VPAVGB ymm ymm ymm
// VPAVGB m256 ymm ymm
func VPAVGB(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPAVGB",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPAVGB",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPAVGB",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPAVGB",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPAVGB: bad operands")
}
// VPAVGW: Average Packed Word Integers.
//
// Forms:
//
// VPAVGW xmm xmm xmm
// VPAVGW m128 xmm xmm
// VPAVGW ymm ymm ymm
// VPAVGW m256 ymm ymm
func VPAVGW(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPAVGW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPAVGW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPAVGW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPAVGW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPAVGW: bad operands")
}
// VPBLENDD: Blend Packed Doublewords.
//
// Forms:
//
// VPBLENDD imm8 xmm xmm xmm
// VPBLENDD imm8 m128 xmm xmm
// VPBLENDD imm8 ymm ymm ymm
// VPBLENDD imm8 m256 ymm ymm
func VPBLENDD(i, mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(i) && operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPBLENDD",
Operands: []operand.Op{i, mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsIMM8(i) && operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPBLENDD",
Operands: []operand.Op{i, mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsIMM8(i) && operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPBLENDD",
Operands: []operand.Op{i, mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsIMM8(i) && operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPBLENDD",
Operands: []operand.Op{i, mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPBLENDD: bad operands")
}
// VPBLENDVB: Variable Blend Packed Bytes.
//
// Forms:
//
// VPBLENDVB xmm xmm xmm xmm
// VPBLENDVB xmm m128 xmm xmm
// VPBLENDVB ymm ymm ymm ymm
// VPBLENDVB ymm m256 ymm ymm
func VPBLENDVB(xy, mxy, xy1, xy2 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(xy) && operand.IsXMM(mxy) && operand.IsXMM(xy1) && operand.IsXMM(xy2):
return &intrep.Instruction{
Opcode: "VPBLENDVB",
Operands: []operand.Op{xy, mxy, xy1, xy2},
Inputs: []operand.Op{xy, mxy, xy1},
Outputs: []operand.Op{xy2},
ISA: []string{"AVX"},
}, nil
case operand.IsXMM(xy) && operand.IsM128(mxy) && operand.IsXMM(xy1) && operand.IsXMM(xy2):
return &intrep.Instruction{
Opcode: "VPBLENDVB",
Operands: []operand.Op{xy, mxy, xy1, xy2},
Inputs: []operand.Op{xy, mxy, xy1},
Outputs: []operand.Op{xy2},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(xy) && operand.IsYMM(mxy) && operand.IsYMM(xy1) && operand.IsYMM(xy2):
return &intrep.Instruction{
Opcode: "VPBLENDVB",
Operands: []operand.Op{xy, mxy, xy1, xy2},
Inputs: []operand.Op{xy, mxy, xy1},
Outputs: []operand.Op{xy2},
ISA: []string{"AVX2"},
}, nil
case operand.IsYMM(xy) && operand.IsM256(mxy) && operand.IsYMM(xy1) && operand.IsYMM(xy2):
return &intrep.Instruction{
Opcode: "VPBLENDVB",
Operands: []operand.Op{xy, mxy, xy1, xy2},
Inputs: []operand.Op{xy, mxy, xy1},
Outputs: []operand.Op{xy2},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPBLENDVB: bad operands")
}
// VPBLENDW: Blend Packed Words.
//
// Forms:
//
// VPBLENDW imm8 xmm xmm xmm
// VPBLENDW imm8 m128 xmm xmm
// VPBLENDW imm8 ymm ymm ymm
// VPBLENDW imm8 m256 ymm ymm
func VPBLENDW(i, mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(i) && operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPBLENDW",
Operands: []operand.Op{i, mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsIMM8(i) && operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPBLENDW",
Operands: []operand.Op{i, mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsIMM8(i) && operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPBLENDW",
Operands: []operand.Op{i, mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsIMM8(i) && operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPBLENDW",
Operands: []operand.Op{i, mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPBLENDW: bad operands")
}
// VPBROADCASTB: Broadcast Byte Integer.
//
// Forms:
//
// VPBROADCASTB xmm xmm
// VPBROADCASTB m8 xmm
// VPBROADCASTB xmm ymm
// VPBROADCASTB m8 ymm
func VPBROADCASTB(mx, xy operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(xy):
return &intrep.Instruction{
Opcode: "VPBROADCASTB",
Operands: []operand.Op{mx, xy},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{xy},
ISA: []string{"AVX2"},
}, nil
case operand.IsM8(mx) && operand.IsXMM(xy):
return &intrep.Instruction{
Opcode: "VPBROADCASTB",
Operands: []operand.Op{mx, xy},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{xy},
ISA: []string{"AVX2"},
}, nil
case operand.IsXMM(mx) && operand.IsYMM(xy):
return &intrep.Instruction{
Opcode: "VPBROADCASTB",
Operands: []operand.Op{mx, xy},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{xy},
ISA: []string{"AVX2"},
}, nil
case operand.IsM8(mx) && operand.IsYMM(xy):
return &intrep.Instruction{
Opcode: "VPBROADCASTB",
Operands: []operand.Op{mx, xy},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{xy},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPBROADCASTB: bad operands")
}
// VPBROADCASTD: Broadcast Doubleword Integer.
//
// Forms:
//
// VPBROADCASTD xmm xmm
// VPBROADCASTD m32 xmm
// VPBROADCASTD xmm ymm
// VPBROADCASTD m32 ymm
func VPBROADCASTD(mx, xy operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(xy):
return &intrep.Instruction{
Opcode: "VPBROADCASTD",
Operands: []operand.Op{mx, xy},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{xy},
ISA: []string{"AVX2"},
}, nil
case operand.IsM32(mx) && operand.IsXMM(xy):
return &intrep.Instruction{
Opcode: "VPBROADCASTD",
Operands: []operand.Op{mx, xy},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{xy},
ISA: []string{"AVX2"},
}, nil
case operand.IsXMM(mx) && operand.IsYMM(xy):
return &intrep.Instruction{
Opcode: "VPBROADCASTD",
Operands: []operand.Op{mx, xy},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{xy},
ISA: []string{"AVX2"},
}, nil
case operand.IsM32(mx) && operand.IsYMM(xy):
return &intrep.Instruction{
Opcode: "VPBROADCASTD",
Operands: []operand.Op{mx, xy},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{xy},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPBROADCASTD: bad operands")
}
// VPBROADCASTQ: Broadcast Quadword Integer.
//
// Forms:
//
// VPBROADCASTQ xmm xmm
// VPBROADCASTQ m64 xmm
// VPBROADCASTQ xmm ymm
// VPBROADCASTQ m64 ymm
func VPBROADCASTQ(mx, xy operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(xy):
return &intrep.Instruction{
Opcode: "VPBROADCASTQ",
Operands: []operand.Op{mx, xy},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{xy},
ISA: []string{"AVX2"},
}, nil
case operand.IsM64(mx) && operand.IsXMM(xy):
return &intrep.Instruction{
Opcode: "VPBROADCASTQ",
Operands: []operand.Op{mx, xy},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{xy},
ISA: []string{"AVX2"},
}, nil
case operand.IsXMM(mx) && operand.IsYMM(xy):
return &intrep.Instruction{
Opcode: "VPBROADCASTQ",
Operands: []operand.Op{mx, xy},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{xy},
ISA: []string{"AVX2"},
}, nil
case operand.IsM64(mx) && operand.IsYMM(xy):
return &intrep.Instruction{
Opcode: "VPBROADCASTQ",
Operands: []operand.Op{mx, xy},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{xy},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPBROADCASTQ: bad operands")
}
// VPBROADCASTW: Broadcast Word Integer.
//
// Forms:
//
// VPBROADCASTW xmm xmm
// VPBROADCASTW m16 xmm
// VPBROADCASTW xmm ymm
// VPBROADCASTW m16 ymm
func VPBROADCASTW(mx, xy operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(xy):
return &intrep.Instruction{
Opcode: "VPBROADCASTW",
Operands: []operand.Op{mx, xy},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{xy},
ISA: []string{"AVX2"},
}, nil
case operand.IsM16(mx) && operand.IsXMM(xy):
return &intrep.Instruction{
Opcode: "VPBROADCASTW",
Operands: []operand.Op{mx, xy},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{xy},
ISA: []string{"AVX2"},
}, nil
case operand.IsXMM(mx) && operand.IsYMM(xy):
return &intrep.Instruction{
Opcode: "VPBROADCASTW",
Operands: []operand.Op{mx, xy},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{xy},
ISA: []string{"AVX2"},
}, nil
case operand.IsM16(mx) && operand.IsYMM(xy):
return &intrep.Instruction{
Opcode: "VPBROADCASTW",
Operands: []operand.Op{mx, xy},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{xy},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPBROADCASTW: bad operands")
}
// VPCLMULQDQ: Carry-Less Quadword Multiplication.
//
// Forms:
//
// VPCLMULQDQ imm8 xmm xmm xmm
// VPCLMULQDQ imm8 m128 xmm xmm
func VPCLMULQDQ(i, mx, x, x1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(i) && operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VPCLMULQDQ",
Operands: []operand.Op{i, mx, x, x1},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x1},
ISA: []string{"AVX", "PCLMULQDQ"},
}, nil
case operand.IsIMM8(i) && operand.IsM128(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VPCLMULQDQ",
Operands: []operand.Op{i, mx, x, x1},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x1},
ISA: []string{"AVX", "PCLMULQDQ"},
}, nil
}
return nil, errors.New("VPCLMULQDQ: bad operands")
}
// VPCMPEQB: Compare Packed Byte Data for Equality.
//
// Forms:
//
// VPCMPEQB xmm xmm xmm
// VPCMPEQB m128 xmm xmm
// VPCMPEQB ymm ymm ymm
// VPCMPEQB m256 ymm ymm
func VPCMPEQB(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPCMPEQB",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
CancellingInputs: true,
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPCMPEQB",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPCMPEQB",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
CancellingInputs: true,
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPCMPEQB",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPCMPEQB: bad operands")
}
// VPCMPEQD: Compare Packed Doubleword Data for Equality.
//
// Forms:
//
// VPCMPEQD xmm xmm xmm
// VPCMPEQD m128 xmm xmm
// VPCMPEQD ymm ymm ymm
// VPCMPEQD m256 ymm ymm
func VPCMPEQD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPCMPEQD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
CancellingInputs: true,
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPCMPEQD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPCMPEQD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
CancellingInputs: true,
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPCMPEQD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPCMPEQD: bad operands")
}
// VPCMPEQQ: Compare Packed Quadword Data for Equality.
//
// Forms:
//
// VPCMPEQQ xmm xmm xmm
// VPCMPEQQ m128 xmm xmm
// VPCMPEQQ ymm ymm ymm
// VPCMPEQQ m256 ymm ymm
func VPCMPEQQ(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPCMPEQQ",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
CancellingInputs: true,
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPCMPEQQ",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPCMPEQQ",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
CancellingInputs: true,
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPCMPEQQ",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPCMPEQQ: bad operands")
}
// VPCMPEQW: Compare Packed Word Data for Equality.
//
// Forms:
//
// VPCMPEQW xmm xmm xmm
// VPCMPEQW m128 xmm xmm
// VPCMPEQW ymm ymm ymm
// VPCMPEQW m256 ymm ymm
func VPCMPEQW(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPCMPEQW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
CancellingInputs: true,
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPCMPEQW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPCMPEQW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
CancellingInputs: true,
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPCMPEQW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPCMPEQW: bad operands")
}
// VPCMPESTRI: Packed Compare Explicit Length Strings, Return Index.
//
// Forms:
//
// VPCMPESTRI imm8 xmm xmm
// VPCMPESTRI imm8 m128 xmm
func VPCMPESTRI(i, mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(i) && operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "VPCMPESTRI",
Operands: []operand.Op{i, mx, x},
Inputs: []operand.Op{mx, x, reg.EAX, reg.EDX},
Outputs: []operand.Op{reg.ECX},
ISA: []string{"AVX"},
}, nil
case operand.IsIMM8(i) && operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "VPCMPESTRI",
Operands: []operand.Op{i, mx, x},
Inputs: []operand.Op{mx, x, reg.EAX, reg.EDX},
Outputs: []operand.Op{reg.ECX},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VPCMPESTRI: bad operands")
}
// VPCMPESTRM: Packed Compare Explicit Length Strings, Return Mask.
//
// Forms:
//
// VPCMPESTRM imm8 xmm xmm
// VPCMPESTRM imm8 m128 xmm
func VPCMPESTRM(i, mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(i) && operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "VPCMPESTRM",
Operands: []operand.Op{i, mx, x},
Inputs: []operand.Op{mx, x, reg.EAX, reg.EDX},
Outputs: []operand.Op{reg.X0},
ISA: []string{"AVX"},
}, nil
case operand.IsIMM8(i) && operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "VPCMPESTRM",
Operands: []operand.Op{i, mx, x},
Inputs: []operand.Op{mx, x, reg.EAX, reg.EDX},
Outputs: []operand.Op{reg.X0},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VPCMPESTRM: bad operands")
}
// VPCMPGTB: Compare Packed Signed Byte Integers for Greater Than.
//
// Forms:
//
// VPCMPGTB xmm xmm xmm
// VPCMPGTB m128 xmm xmm
// VPCMPGTB ymm ymm ymm
// VPCMPGTB m256 ymm ymm
func VPCMPGTB(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPCMPGTB",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
CancellingInputs: true,
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPCMPGTB",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPCMPGTB",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
CancellingInputs: true,
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPCMPGTB",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPCMPGTB: bad operands")
}
// VPCMPGTD: Compare Packed Signed Doubleword Integers for Greater Than.
//
// Forms:
//
// VPCMPGTD xmm xmm xmm
// VPCMPGTD m128 xmm xmm
// VPCMPGTD ymm ymm ymm
// VPCMPGTD m256 ymm ymm
func VPCMPGTD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPCMPGTD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
CancellingInputs: true,
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPCMPGTD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPCMPGTD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
CancellingInputs: true,
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPCMPGTD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPCMPGTD: bad operands")
}
// VPCMPGTQ: Compare Packed Data for Greater Than.
//
// Forms:
//
// VPCMPGTQ xmm xmm xmm
// VPCMPGTQ m128 xmm xmm
// VPCMPGTQ ymm ymm ymm
// VPCMPGTQ m256 ymm ymm
func VPCMPGTQ(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPCMPGTQ",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
CancellingInputs: true,
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPCMPGTQ",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPCMPGTQ",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
CancellingInputs: true,
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPCMPGTQ",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPCMPGTQ: bad operands")
}
// VPCMPGTW: Compare Packed Signed Word Integers for Greater Than.
//
// Forms:
//
// VPCMPGTW xmm xmm xmm
// VPCMPGTW m128 xmm xmm
// VPCMPGTW ymm ymm ymm
// VPCMPGTW m256 ymm ymm
func VPCMPGTW(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPCMPGTW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
CancellingInputs: true,
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPCMPGTW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPCMPGTW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
CancellingInputs: true,
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPCMPGTW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPCMPGTW: bad operands")
}
// VPCMPISTRI: Packed Compare Implicit Length Strings, Return Index.
//
// Forms:
//
// VPCMPISTRI imm8 xmm xmm
// VPCMPISTRI imm8 m128 xmm
func VPCMPISTRI(i, mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(i) && operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "VPCMPISTRI",
Operands: []operand.Op{i, mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{reg.ECX},
ISA: []string{"AVX"},
}, nil
case operand.IsIMM8(i) && operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "VPCMPISTRI",
Operands: []operand.Op{i, mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{reg.ECX},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VPCMPISTRI: bad operands")
}
// VPCMPISTRM: Packed Compare Implicit Length Strings, Return Mask.
//
// Forms:
//
// VPCMPISTRM imm8 xmm xmm
// VPCMPISTRM imm8 m128 xmm
func VPCMPISTRM(i, mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(i) && operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "VPCMPISTRM",
Operands: []operand.Op{i, mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{reg.X0},
ISA: []string{"AVX"},
}, nil
case operand.IsIMM8(i) && operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "VPCMPISTRM",
Operands: []operand.Op{i, mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{reg.X0},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VPCMPISTRM: bad operands")
}
// VPERM2F128: Permute Floating-Point Values.
//
// Forms:
//
// VPERM2F128 imm8 ymm ymm ymm
// VPERM2F128 imm8 m256 ymm ymm
func VPERM2F128(i, my, y, y1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(i) && operand.IsYMM(my) && operand.IsYMM(y) && operand.IsYMM(y1):
return &intrep.Instruction{
Opcode: "VPERM2F128",
Operands: []operand.Op{i, my, y, y1},
Inputs: []operand.Op{my, y},
Outputs: []operand.Op{y1},
ISA: []string{"AVX"},
}, nil
case operand.IsIMM8(i) && operand.IsM256(my) && operand.IsYMM(y) && operand.IsYMM(y1):
return &intrep.Instruction{
Opcode: "VPERM2F128",
Operands: []operand.Op{i, my, y, y1},
Inputs: []operand.Op{my, y},
Outputs: []operand.Op{y1},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VPERM2F128: bad operands")
}
// VPERM2I128: Permute 128-Bit Integer Values.
//
// Forms:
//
// VPERM2I128 imm8 ymm ymm ymm
// VPERM2I128 imm8 m256 ymm ymm
func VPERM2I128(i, my, y, y1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(i) && operand.IsYMM(my) && operand.IsYMM(y) && operand.IsYMM(y1):
return &intrep.Instruction{
Opcode: "VPERM2I128",
Operands: []operand.Op{i, my, y, y1},
Inputs: []operand.Op{my, y},
Outputs: []operand.Op{y1},
ISA: []string{"AVX2"},
}, nil
case operand.IsIMM8(i) && operand.IsM256(my) && operand.IsYMM(y) && operand.IsYMM(y1):
return &intrep.Instruction{
Opcode: "VPERM2I128",
Operands: []operand.Op{i, my, y, y1},
Inputs: []operand.Op{my, y},
Outputs: []operand.Op{y1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPERM2I128: bad operands")
}
// VPERMD: Permute Doubleword Integers.
//
// Forms:
//
// VPERMD ymm ymm ymm
// VPERMD m256 ymm ymm
func VPERMD(my, y, y1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsYMM(my) && operand.IsYMM(y) && operand.IsYMM(y1):
return &intrep.Instruction{
Opcode: "VPERMD",
Operands: []operand.Op{my, y, y1},
Inputs: []operand.Op{my, y},
Outputs: []operand.Op{y1},
ISA: []string{"AVX2"},
}, nil
case operand.IsM256(my) && operand.IsYMM(y) && operand.IsYMM(y1):
return &intrep.Instruction{
Opcode: "VPERMD",
Operands: []operand.Op{my, y, y1},
Inputs: []operand.Op{my, y},
Outputs: []operand.Op{y1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPERMD: bad operands")
}
// VPERMILPD: Permute Double-Precision Floating-Point Values.
//
// Forms:
//
// VPERMILPD imm8 xmm xmm
// VPERMILPD xmm xmm xmm
// VPERMILPD m128 xmm xmm
// VPERMILPD imm8 m128 xmm
// VPERMILPD imm8 ymm ymm
// VPERMILPD ymm ymm ymm
// VPERMILPD m256 ymm ymm
// VPERMILPD imm8 m256 ymm
func VPERMILPD(imxy, mxy, xy operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(imxy) && operand.IsXMM(mxy) && operand.IsXMM(xy):
return &intrep.Instruction{
Opcode: "VPERMILPD",
Operands: []operand.Op{imxy, mxy, xy},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsXMM(imxy) && operand.IsXMM(mxy) && operand.IsXMM(xy):
return &intrep.Instruction{
Opcode: "VPERMILPD",
Operands: []operand.Op{imxy, mxy, xy},
Inputs: []operand.Op{imxy, mxy},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(imxy) && operand.IsXMM(mxy) && operand.IsXMM(xy):
return &intrep.Instruction{
Opcode: "VPERMILPD",
Operands: []operand.Op{imxy, mxy, xy},
Inputs: []operand.Op{imxy, mxy},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsIMM8(imxy) && operand.IsM128(mxy) && operand.IsXMM(xy):
return &intrep.Instruction{
Opcode: "VPERMILPD",
Operands: []operand.Op{imxy, mxy, xy},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsIMM8(imxy) && operand.IsYMM(mxy) && operand.IsYMM(xy):
return &intrep.Instruction{
Opcode: "VPERMILPD",
Operands: []operand.Op{imxy, mxy, xy},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(imxy) && operand.IsYMM(mxy) && operand.IsYMM(xy):
return &intrep.Instruction{
Opcode: "VPERMILPD",
Operands: []operand.Op{imxy, mxy, xy},
Inputs: []operand.Op{imxy, mxy},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsM256(imxy) && operand.IsYMM(mxy) && operand.IsYMM(xy):
return &intrep.Instruction{
Opcode: "VPERMILPD",
Operands: []operand.Op{imxy, mxy, xy},
Inputs: []operand.Op{imxy, mxy},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsIMM8(imxy) && operand.IsM256(mxy) && operand.IsYMM(xy):
return &intrep.Instruction{
Opcode: "VPERMILPD",
Operands: []operand.Op{imxy, mxy, xy},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VPERMILPD: bad operands")
}
// VPERMILPS: Permute Single-Precision Floating-Point Values.
//
// Forms:
//
// VPERMILPS imm8 xmm xmm
// VPERMILPS xmm xmm xmm
// VPERMILPS m128 xmm xmm
// VPERMILPS imm8 m128 xmm
// VPERMILPS imm8 ymm ymm
// VPERMILPS ymm ymm ymm
// VPERMILPS m256 ymm ymm
// VPERMILPS imm8 m256 ymm
func VPERMILPS(imxy, mxy, xy operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(imxy) && operand.IsXMM(mxy) && operand.IsXMM(xy):
return &intrep.Instruction{
Opcode: "VPERMILPS",
Operands: []operand.Op{imxy, mxy, xy},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsXMM(imxy) && operand.IsXMM(mxy) && operand.IsXMM(xy):
return &intrep.Instruction{
Opcode: "VPERMILPS",
Operands: []operand.Op{imxy, mxy, xy},
Inputs: []operand.Op{imxy, mxy},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(imxy) && operand.IsXMM(mxy) && operand.IsXMM(xy):
return &intrep.Instruction{
Opcode: "VPERMILPS",
Operands: []operand.Op{imxy, mxy, xy},
Inputs: []operand.Op{imxy, mxy},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsIMM8(imxy) && operand.IsM128(mxy) && operand.IsXMM(xy):
return &intrep.Instruction{
Opcode: "VPERMILPS",
Operands: []operand.Op{imxy, mxy, xy},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsIMM8(imxy) && operand.IsYMM(mxy) && operand.IsYMM(xy):
return &intrep.Instruction{
Opcode: "VPERMILPS",
Operands: []operand.Op{imxy, mxy, xy},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(imxy) && operand.IsYMM(mxy) && operand.IsYMM(xy):
return &intrep.Instruction{
Opcode: "VPERMILPS",
Operands: []operand.Op{imxy, mxy, xy},
Inputs: []operand.Op{imxy, mxy},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsM256(imxy) && operand.IsYMM(mxy) && operand.IsYMM(xy):
return &intrep.Instruction{
Opcode: "VPERMILPS",
Operands: []operand.Op{imxy, mxy, xy},
Inputs: []operand.Op{imxy, mxy},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsIMM8(imxy) && operand.IsM256(mxy) && operand.IsYMM(xy):
return &intrep.Instruction{
Opcode: "VPERMILPS",
Operands: []operand.Op{imxy, mxy, xy},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VPERMILPS: bad operands")
}
// VPERMPD: Permute Double-Precision Floating-Point Elements.
//
// Forms:
//
// VPERMPD imm8 ymm ymm
// VPERMPD imm8 m256 ymm
func VPERMPD(i, my, y operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(i) && operand.IsYMM(my) && operand.IsYMM(y):
return &intrep.Instruction{
Opcode: "VPERMPD",
Operands: []operand.Op{i, my, y},
Inputs: []operand.Op{my},
Outputs: []operand.Op{y},
ISA: []string{"AVX2"},
}, nil
case operand.IsIMM8(i) && operand.IsM256(my) && operand.IsYMM(y):
return &intrep.Instruction{
Opcode: "VPERMPD",
Operands: []operand.Op{i, my, y},
Inputs: []operand.Op{my},
Outputs: []operand.Op{y},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPERMPD: bad operands")
}
// VPERMPS: Permute Single-Precision Floating-Point Elements.
//
// Forms:
//
// VPERMPS ymm ymm ymm
// VPERMPS m256 ymm ymm
func VPERMPS(my, y, y1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsYMM(my) && operand.IsYMM(y) && operand.IsYMM(y1):
return &intrep.Instruction{
Opcode: "VPERMPS",
Operands: []operand.Op{my, y, y1},
Inputs: []operand.Op{my, y},
Outputs: []operand.Op{y1},
ISA: []string{"AVX2"},
}, nil
case operand.IsM256(my) && operand.IsYMM(y) && operand.IsYMM(y1):
return &intrep.Instruction{
Opcode: "VPERMPS",
Operands: []operand.Op{my, y, y1},
Inputs: []operand.Op{my, y},
Outputs: []operand.Op{y1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPERMPS: bad operands")
}
// VPERMQ: Permute Quadword Integers.
//
// Forms:
//
// VPERMQ imm8 ymm ymm
// VPERMQ imm8 m256 ymm
func VPERMQ(i, my, y operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(i) && operand.IsYMM(my) && operand.IsYMM(y):
return &intrep.Instruction{
Opcode: "VPERMQ",
Operands: []operand.Op{i, my, y},
Inputs: []operand.Op{my},
Outputs: []operand.Op{y},
ISA: []string{"AVX2"},
}, nil
case operand.IsIMM8(i) && operand.IsM256(my) && operand.IsYMM(y):
return &intrep.Instruction{
Opcode: "VPERMQ",
Operands: []operand.Op{i, my, y},
Inputs: []operand.Op{my},
Outputs: []operand.Op{y},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPERMQ: bad operands")
}
// VPEXTRB: Extract Byte.
//
// Forms:
//
// VPEXTRB imm8 xmm r32
// VPEXTRB imm8 xmm m8
func VPEXTRB(i, x, mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(i) && operand.IsXMM(x) && operand.IsR32(mr):
return &intrep.Instruction{
Opcode: "VPEXTRB",
Operands: []operand.Op{i, x, mr},
Inputs: []operand.Op{x},
Outputs: []operand.Op{mr},
ISA: []string{"AVX"},
}, nil
case operand.IsIMM8(i) && operand.IsXMM(x) && operand.IsM8(mr):
return &intrep.Instruction{
Opcode: "VPEXTRB",
Operands: []operand.Op{i, x, mr},
Inputs: []operand.Op{x},
Outputs: []operand.Op{mr},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VPEXTRB: bad operands")
}
// VPEXTRD: Extract Doubleword.
//
// Forms:
//
// VPEXTRD imm8 xmm r32
// VPEXTRD imm8 xmm m32
func VPEXTRD(i, x, mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(i) && operand.IsXMM(x) && operand.IsR32(mr):
return &intrep.Instruction{
Opcode: "VPEXTRD",
Operands: []operand.Op{i, x, mr},
Inputs: []operand.Op{x},
Outputs: []operand.Op{mr},
ISA: []string{"AVX"},
}, nil
case operand.IsIMM8(i) && operand.IsXMM(x) && operand.IsM32(mr):
return &intrep.Instruction{
Opcode: "VPEXTRD",
Operands: []operand.Op{i, x, mr},
Inputs: []operand.Op{x},
Outputs: []operand.Op{mr},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VPEXTRD: bad operands")
}
// VPEXTRQ: Extract Quadword.
//
// Forms:
//
// VPEXTRQ imm8 xmm r64
// VPEXTRQ imm8 xmm m64
func VPEXTRQ(i, x, mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(i) && operand.IsXMM(x) && operand.IsR64(mr):
return &intrep.Instruction{
Opcode: "VPEXTRQ",
Operands: []operand.Op{i, x, mr},
Inputs: []operand.Op{x},
Outputs: []operand.Op{mr},
ISA: []string{"AVX"},
}, nil
case operand.IsIMM8(i) && operand.IsXMM(x) && operand.IsM64(mr):
return &intrep.Instruction{
Opcode: "VPEXTRQ",
Operands: []operand.Op{i, x, mr},
Inputs: []operand.Op{x},
Outputs: []operand.Op{mr},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VPEXTRQ: bad operands")
}
// VPEXTRW: Extract Word.
//
// Forms:
//
// VPEXTRW imm8 xmm r32
// VPEXTRW imm8 xmm m16
func VPEXTRW(i, x, mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(i) && operand.IsXMM(x) && operand.IsR32(mr):
return &intrep.Instruction{
Opcode: "VPEXTRW",
Operands: []operand.Op{i, x, mr},
Inputs: []operand.Op{x},
Outputs: []operand.Op{mr},
ISA: []string{"AVX"},
}, nil
case operand.IsIMM8(i) && operand.IsXMM(x) && operand.IsM16(mr):
return &intrep.Instruction{
Opcode: "VPEXTRW",
Operands: []operand.Op{i, x, mr},
Inputs: []operand.Op{x},
Outputs: []operand.Op{mr},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VPEXTRW: bad operands")
}
// VPGATHERDD: Gather Packed Doubleword Values Using Signed Doubleword Indices.
//
// Forms:
//
// VPGATHERDD xmm vm32x xmm
// VPGATHERDD ymm vm32y ymm
func VPGATHERDD(xy, v, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(xy) && operand.IsVM32X(v) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPGATHERDD",
Operands: []operand.Op{xy, v, xy1},
Inputs: []operand.Op{xy, v, xy1},
Outputs: []operand.Op{xy, xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsYMM(xy) && operand.IsVM32Y(v) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPGATHERDD",
Operands: []operand.Op{xy, v, xy1},
Inputs: []operand.Op{xy, v, xy1},
Outputs: []operand.Op{xy, xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPGATHERDD: bad operands")
}
// VPGATHERDQ: Gather Packed Quadword Values Using Signed Doubleword Indices.
//
// Forms:
//
// VPGATHERDQ xmm vm32x xmm
// VPGATHERDQ ymm vm32x ymm
func VPGATHERDQ(xy, v, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(xy) && operand.IsVM32X(v) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPGATHERDQ",
Operands: []operand.Op{xy, v, xy1},
Inputs: []operand.Op{xy, v, xy1},
Outputs: []operand.Op{xy, xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsYMM(xy) && operand.IsVM32X(v) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPGATHERDQ",
Operands: []operand.Op{xy, v, xy1},
Inputs: []operand.Op{xy, v, xy1},
Outputs: []operand.Op{xy, xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPGATHERDQ: bad operands")
}
// VPGATHERQD: Gather Packed Doubleword Values Using Signed Quadword Indices.
//
// Forms:
//
// VPGATHERQD xmm vm64x xmm
// VPGATHERQD xmm vm64y xmm
func VPGATHERQD(x, v, x1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(x) && operand.IsVM64X(v) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VPGATHERQD",
Operands: []operand.Op{x, v, x1},
Inputs: []operand.Op{x, v, x1},
Outputs: []operand.Op{x, x1},
ISA: []string{"AVX2"},
}, nil
case operand.IsXMM(x) && operand.IsVM64Y(v) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VPGATHERQD",
Operands: []operand.Op{x, v, x1},
Inputs: []operand.Op{x, v, x1},
Outputs: []operand.Op{x, x1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPGATHERQD: bad operands")
}
// VPGATHERQQ: Gather Packed Quadword Values Using Signed Quadword Indices.
//
// Forms:
//
// VPGATHERQQ xmm vm64x xmm
// VPGATHERQQ ymm vm64y ymm
func VPGATHERQQ(xy, v, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(xy) && operand.IsVM64X(v) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPGATHERQQ",
Operands: []operand.Op{xy, v, xy1},
Inputs: []operand.Op{xy, v, xy1},
Outputs: []operand.Op{xy, xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsYMM(xy) && operand.IsVM64Y(v) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPGATHERQQ",
Operands: []operand.Op{xy, v, xy1},
Inputs: []operand.Op{xy, v, xy1},
Outputs: []operand.Op{xy, xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPGATHERQQ: bad operands")
}
// VPHADDD: Packed Horizontal Add Doubleword Integer.
//
// Forms:
//
// VPHADDD xmm xmm xmm
// VPHADDD m128 xmm xmm
// VPHADDD ymm ymm ymm
// VPHADDD m256 ymm ymm
func VPHADDD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPHADDD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPHADDD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPHADDD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPHADDD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPHADDD: bad operands")
}
// VPHADDSW: Packed Horizontal Add Signed Word Integers with Signed Saturation.
//
// Forms:
//
// VPHADDSW xmm xmm xmm
// VPHADDSW m128 xmm xmm
// VPHADDSW ymm ymm ymm
// VPHADDSW m256 ymm ymm
func VPHADDSW(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPHADDSW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPHADDSW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPHADDSW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPHADDSW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPHADDSW: bad operands")
}
// VPHADDW: Packed Horizontal Add Word Integers.
//
// Forms:
//
// VPHADDW xmm xmm xmm
// VPHADDW m128 xmm xmm
// VPHADDW ymm ymm ymm
// VPHADDW m256 ymm ymm
func VPHADDW(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPHADDW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPHADDW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPHADDW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPHADDW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPHADDW: bad operands")
}
// VPHMINPOSUW: Packed Horizontal Minimum of Unsigned Word Integers.
//
// Forms:
//
// VPHMINPOSUW xmm xmm
// VPHMINPOSUW m128 xmm
func VPHMINPOSUW(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "VPHMINPOSUW",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "VPHMINPOSUW",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{x},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VPHMINPOSUW: bad operands")
}
// VPHSUBD: Packed Horizontal Subtract Doubleword Integers.
//
// Forms:
//
// VPHSUBD xmm xmm xmm
// VPHSUBD m128 xmm xmm
// VPHSUBD ymm ymm ymm
// VPHSUBD m256 ymm ymm
func VPHSUBD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPHSUBD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
CancellingInputs: true,
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPHSUBD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPHSUBD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
CancellingInputs: true,
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPHSUBD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPHSUBD: bad operands")
}
// VPHSUBSW: Packed Horizontal Subtract Signed Word Integers with Signed Saturation.
//
// Forms:
//
// VPHSUBSW xmm xmm xmm
// VPHSUBSW m128 xmm xmm
// VPHSUBSW ymm ymm ymm
// VPHSUBSW m256 ymm ymm
func VPHSUBSW(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPHSUBSW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
CancellingInputs: true,
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPHSUBSW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPHSUBSW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
CancellingInputs: true,
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPHSUBSW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPHSUBSW: bad operands")
}
// VPHSUBW: Packed Horizontal Subtract Word Integers.
//
// Forms:
//
// VPHSUBW xmm xmm xmm
// VPHSUBW m128 xmm xmm
// VPHSUBW ymm ymm ymm
// VPHSUBW m256 ymm ymm
func VPHSUBW(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPHSUBW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
CancellingInputs: true,
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPHSUBW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPHSUBW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
CancellingInputs: true,
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPHSUBW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPHSUBW: bad operands")
}
// VPINSRB: Insert Byte.
//
// Forms:
//
// VPINSRB imm8 r32 xmm xmm
// VPINSRB imm8 m8 xmm xmm
func VPINSRB(i, mr, x, x1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(i) && operand.IsR32(mr) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VPINSRB",
Operands: []operand.Op{i, mr, x, x1},
Inputs: []operand.Op{mr, x},
Outputs: []operand.Op{x1},
ISA: []string{"AVX"},
}, nil
case operand.IsIMM8(i) && operand.IsM8(mr) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VPINSRB",
Operands: []operand.Op{i, mr, x, x1},
Inputs: []operand.Op{mr, x},
Outputs: []operand.Op{x1},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VPINSRB: bad operands")
}
// VPINSRD: Insert Doubleword.
//
// Forms:
//
// VPINSRD imm8 r32 xmm xmm
// VPINSRD imm8 m32 xmm xmm
func VPINSRD(i, mr, x, x1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(i) && operand.IsR32(mr) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VPINSRD",
Operands: []operand.Op{i, mr, x, x1},
Inputs: []operand.Op{mr, x},
Outputs: []operand.Op{x1},
ISA: []string{"AVX"},
}, nil
case operand.IsIMM8(i) && operand.IsM32(mr) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VPINSRD",
Operands: []operand.Op{i, mr, x, x1},
Inputs: []operand.Op{mr, x},
Outputs: []operand.Op{x1},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VPINSRD: bad operands")
}
// VPINSRQ: Insert Quadword.
//
// Forms:
//
// VPINSRQ imm8 r64 xmm xmm
// VPINSRQ imm8 m64 xmm xmm
func VPINSRQ(i, mr, x, x1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(i) && operand.IsR64(mr) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VPINSRQ",
Operands: []operand.Op{i, mr, x, x1},
Inputs: []operand.Op{mr, x},
Outputs: []operand.Op{x1},
ISA: []string{"AVX"},
}, nil
case operand.IsIMM8(i) && operand.IsM64(mr) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VPINSRQ",
Operands: []operand.Op{i, mr, x, x1},
Inputs: []operand.Op{mr, x},
Outputs: []operand.Op{x1},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VPINSRQ: bad operands")
}
// VPINSRW: Insert Word.
//
// Forms:
//
// VPINSRW imm8 r32 xmm xmm
// VPINSRW imm8 m16 xmm xmm
func VPINSRW(i, mr, x, x1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(i) && operand.IsR32(mr) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VPINSRW",
Operands: []operand.Op{i, mr, x, x1},
Inputs: []operand.Op{mr, x},
Outputs: []operand.Op{x1},
ISA: []string{"AVX"},
}, nil
case operand.IsIMM8(i) && operand.IsM16(mr) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VPINSRW",
Operands: []operand.Op{i, mr, x, x1},
Inputs: []operand.Op{mr, x},
Outputs: []operand.Op{x1},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VPINSRW: bad operands")
}
// VPMADDUBSW: Multiply and Add Packed Signed and Unsigned Byte Integers.
//
// Forms:
//
// VPMADDUBSW xmm xmm xmm
// VPMADDUBSW m128 xmm xmm
// VPMADDUBSW ymm ymm ymm
// VPMADDUBSW m256 ymm ymm
func VPMADDUBSW(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPMADDUBSW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPMADDUBSW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPMADDUBSW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPMADDUBSW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPMADDUBSW: bad operands")
}
// VPMADDWD: Multiply and Add Packed Signed Word Integers.
//
// Forms:
//
// VPMADDWD xmm xmm xmm
// VPMADDWD m128 xmm xmm
// VPMADDWD ymm ymm ymm
// VPMADDWD m256 ymm ymm
func VPMADDWD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPMADDWD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPMADDWD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPMADDWD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPMADDWD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPMADDWD: bad operands")
}
// VPMASKMOVD: Conditional Move Packed Doubleword Integers.
//
// Forms:
//
// VPMASKMOVD m128 xmm xmm
// VPMASKMOVD m256 ymm ymm
// VPMASKMOVD xmm xmm m128
// VPMASKMOVD ymm ymm m256
func VPMASKMOVD(mxy, xy, mxy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(mxy1):
return &intrep.Instruction{
Opcode: "VPMASKMOVD",
Operands: []operand.Op{mxy, xy, mxy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{mxy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(mxy1):
return &intrep.Instruction{
Opcode: "VPMASKMOVD",
Operands: []operand.Op{mxy, xy, mxy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{mxy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsM128(mxy1):
return &intrep.Instruction{
Opcode: "VPMASKMOVD",
Operands: []operand.Op{mxy, xy, mxy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{mxy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsM256(mxy1):
return &intrep.Instruction{
Opcode: "VPMASKMOVD",
Operands: []operand.Op{mxy, xy, mxy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{mxy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPMASKMOVD: bad operands")
}
// VPMASKMOVQ: Conditional Move Packed Quadword Integers.
//
// Forms:
//
// VPMASKMOVQ m128 xmm xmm
// VPMASKMOVQ m256 ymm ymm
// VPMASKMOVQ xmm xmm m128
// VPMASKMOVQ ymm ymm m256
func VPMASKMOVQ(mxy, xy, mxy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(mxy1):
return &intrep.Instruction{
Opcode: "VPMASKMOVQ",
Operands: []operand.Op{mxy, xy, mxy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{mxy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(mxy1):
return &intrep.Instruction{
Opcode: "VPMASKMOVQ",
Operands: []operand.Op{mxy, xy, mxy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{mxy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsM128(mxy1):
return &intrep.Instruction{
Opcode: "VPMASKMOVQ",
Operands: []operand.Op{mxy, xy, mxy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{mxy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsM256(mxy1):
return &intrep.Instruction{
Opcode: "VPMASKMOVQ",
Operands: []operand.Op{mxy, xy, mxy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{mxy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPMASKMOVQ: bad operands")
}
// VPMAXSB: Maximum of Packed Signed Byte Integers.
//
// Forms:
//
// VPMAXSB xmm xmm xmm
// VPMAXSB m128 xmm xmm
// VPMAXSB ymm ymm ymm
// VPMAXSB m256 ymm ymm
func VPMAXSB(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPMAXSB",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPMAXSB",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPMAXSB",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPMAXSB",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPMAXSB: bad operands")
}
// VPMAXSD: Maximum of Packed Signed Doubleword Integers.
//
// Forms:
//
// VPMAXSD xmm xmm xmm
// VPMAXSD m128 xmm xmm
// VPMAXSD ymm ymm ymm
// VPMAXSD m256 ymm ymm
func VPMAXSD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPMAXSD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPMAXSD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPMAXSD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPMAXSD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPMAXSD: bad operands")
}
// VPMAXSW: Maximum of Packed Signed Word Integers.
//
// Forms:
//
// VPMAXSW xmm xmm xmm
// VPMAXSW m128 xmm xmm
// VPMAXSW ymm ymm ymm
// VPMAXSW m256 ymm ymm
func VPMAXSW(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPMAXSW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPMAXSW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPMAXSW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPMAXSW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPMAXSW: bad operands")
}
// VPMAXUB: Maximum of Packed Unsigned Byte Integers.
//
// Forms:
//
// VPMAXUB xmm xmm xmm
// VPMAXUB m128 xmm xmm
// VPMAXUB ymm ymm ymm
// VPMAXUB m256 ymm ymm
func VPMAXUB(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPMAXUB",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPMAXUB",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPMAXUB",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPMAXUB",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPMAXUB: bad operands")
}
// VPMAXUD: Maximum of Packed Unsigned Doubleword Integers.
//
// Forms:
//
// VPMAXUD xmm xmm xmm
// VPMAXUD m128 xmm xmm
// VPMAXUD ymm ymm ymm
// VPMAXUD m256 ymm ymm
func VPMAXUD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPMAXUD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPMAXUD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPMAXUD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPMAXUD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPMAXUD: bad operands")
}
// VPMAXUW: Maximum of Packed Unsigned Word Integers.
//
// Forms:
//
// VPMAXUW xmm xmm xmm
// VPMAXUW m128 xmm xmm
// VPMAXUW ymm ymm ymm
// VPMAXUW m256 ymm ymm
func VPMAXUW(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPMAXUW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPMAXUW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPMAXUW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPMAXUW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPMAXUW: bad operands")
}
// VPMINSB: Minimum of Packed Signed Byte Integers.
//
// Forms:
//
// VPMINSB xmm xmm xmm
// VPMINSB m128 xmm xmm
// VPMINSB ymm ymm ymm
// VPMINSB m256 ymm ymm
func VPMINSB(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPMINSB",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPMINSB",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPMINSB",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPMINSB",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPMINSB: bad operands")
}
// VPMINSD: Minimum of Packed Signed Doubleword Integers.
//
// Forms:
//
// VPMINSD xmm xmm xmm
// VPMINSD m128 xmm xmm
// VPMINSD ymm ymm ymm
// VPMINSD m256 ymm ymm
func VPMINSD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPMINSD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPMINSD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPMINSD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPMINSD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPMINSD: bad operands")
}
// VPMINSW: Minimum of Packed Signed Word Integers.
//
// Forms:
//
// VPMINSW xmm xmm xmm
// VPMINSW m128 xmm xmm
// VPMINSW ymm ymm ymm
// VPMINSW m256 ymm ymm
func VPMINSW(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPMINSW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPMINSW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPMINSW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPMINSW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPMINSW: bad operands")
}
// VPMINUB: Minimum of Packed Unsigned Byte Integers.
//
// Forms:
//
// VPMINUB xmm xmm xmm
// VPMINUB m128 xmm xmm
// VPMINUB ymm ymm ymm
// VPMINUB m256 ymm ymm
func VPMINUB(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPMINUB",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPMINUB",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPMINUB",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPMINUB",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPMINUB: bad operands")
}
// VPMINUD: Minimum of Packed Unsigned Doubleword Integers.
//
// Forms:
//
// VPMINUD xmm xmm xmm
// VPMINUD m128 xmm xmm
// VPMINUD ymm ymm ymm
// VPMINUD m256 ymm ymm
func VPMINUD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPMINUD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPMINUD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPMINUD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPMINUD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPMINUD: bad operands")
}
// VPMINUW: Minimum of Packed Unsigned Word Integers.
//
// Forms:
//
// VPMINUW xmm xmm xmm
// VPMINUW m128 xmm xmm
// VPMINUW ymm ymm ymm
// VPMINUW m256 ymm ymm
func VPMINUW(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPMINUW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPMINUW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPMINUW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPMINUW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPMINUW: bad operands")
}
// VPMOVMSKB: Move Byte Mask.
//
// Forms:
//
// VPMOVMSKB xmm r32
// VPMOVMSKB ymm r32
func VPMOVMSKB(xy, r operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(xy) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "VPMOVMSKB",
Operands: []operand.Op{xy, r},
Inputs: []operand.Op{xy},
Outputs: []operand.Op{r},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(xy) && operand.IsR32(r):
return &intrep.Instruction{
Opcode: "VPMOVMSKB",
Operands: []operand.Op{xy, r},
Inputs: []operand.Op{xy},
Outputs: []operand.Op{r},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPMOVMSKB: bad operands")
}
// VPMOVSXBD: Move Packed Byte Integers to Doubleword Integers with Sign Extension.
//
// Forms:
//
// VPMOVSXBD xmm xmm
// VPMOVSXBD m32 xmm
// VPMOVSXBD xmm ymm
// VPMOVSXBD m64 ymm
func VPMOVSXBD(mx, xy operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(xy):
return &intrep.Instruction{
Opcode: "VPMOVSXBD",
Operands: []operand.Op{mx, xy},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsM32(mx) && operand.IsXMM(xy):
return &intrep.Instruction{
Opcode: "VPMOVSXBD",
Operands: []operand.Op{mx, xy},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsXMM(mx) && operand.IsYMM(xy):
return &intrep.Instruction{
Opcode: "VPMOVSXBD",
Operands: []operand.Op{mx, xy},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{xy},
ISA: []string{"AVX2"},
}, nil
case operand.IsM64(mx) && operand.IsYMM(xy):
return &intrep.Instruction{
Opcode: "VPMOVSXBD",
Operands: []operand.Op{mx, xy},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{xy},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPMOVSXBD: bad operands")
}
// VPMOVSXBQ: Move Packed Byte Integers to Quadword Integers with Sign Extension.
//
// Forms:
//
// VPMOVSXBQ xmm xmm
// VPMOVSXBQ m16 xmm
// VPMOVSXBQ xmm ymm
// VPMOVSXBQ m32 ymm
func VPMOVSXBQ(mx, xy operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(xy):
return &intrep.Instruction{
Opcode: "VPMOVSXBQ",
Operands: []operand.Op{mx, xy},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsM16(mx) && operand.IsXMM(xy):
return &intrep.Instruction{
Opcode: "VPMOVSXBQ",
Operands: []operand.Op{mx, xy},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsXMM(mx) && operand.IsYMM(xy):
return &intrep.Instruction{
Opcode: "VPMOVSXBQ",
Operands: []operand.Op{mx, xy},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{xy},
ISA: []string{"AVX2"},
}, nil
case operand.IsM32(mx) && operand.IsYMM(xy):
return &intrep.Instruction{
Opcode: "VPMOVSXBQ",
Operands: []operand.Op{mx, xy},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{xy},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPMOVSXBQ: bad operands")
}
// VPMOVSXBW: Move Packed Byte Integers to Word Integers with Sign Extension.
//
// Forms:
//
// VPMOVSXBW xmm xmm
// VPMOVSXBW m64 xmm
// VPMOVSXBW xmm ymm
// VPMOVSXBW m128 ymm
func VPMOVSXBW(mx, xy operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(xy):
return &intrep.Instruction{
Opcode: "VPMOVSXBW",
Operands: []operand.Op{mx, xy},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsM64(mx) && operand.IsXMM(xy):
return &intrep.Instruction{
Opcode: "VPMOVSXBW",
Operands: []operand.Op{mx, xy},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsXMM(mx) && operand.IsYMM(xy):
return &intrep.Instruction{
Opcode: "VPMOVSXBW",
Operands: []operand.Op{mx, xy},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{xy},
ISA: []string{"AVX2"},
}, nil
case operand.IsM128(mx) && operand.IsYMM(xy):
return &intrep.Instruction{
Opcode: "VPMOVSXBW",
Operands: []operand.Op{mx, xy},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{xy},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPMOVSXBW: bad operands")
}
// VPMOVSXDQ: Move Packed Doubleword Integers to Quadword Integers with Sign Extension.
//
// Forms:
//
// VPMOVSXDQ xmm xmm
// VPMOVSXDQ m64 xmm
// VPMOVSXDQ xmm ymm
// VPMOVSXDQ m128 ymm
func VPMOVSXDQ(mx, xy operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(xy):
return &intrep.Instruction{
Opcode: "VPMOVSXDQ",
Operands: []operand.Op{mx, xy},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsM64(mx) && operand.IsXMM(xy):
return &intrep.Instruction{
Opcode: "VPMOVSXDQ",
Operands: []operand.Op{mx, xy},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsXMM(mx) && operand.IsYMM(xy):
return &intrep.Instruction{
Opcode: "VPMOVSXDQ",
Operands: []operand.Op{mx, xy},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{xy},
ISA: []string{"AVX2"},
}, nil
case operand.IsM128(mx) && operand.IsYMM(xy):
return &intrep.Instruction{
Opcode: "VPMOVSXDQ",
Operands: []operand.Op{mx, xy},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{xy},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPMOVSXDQ: bad operands")
}
// VPMOVSXWD: Move Packed Word Integers to Doubleword Integers with Sign Extension.
//
// Forms:
//
// VPMOVSXWD xmm xmm
// VPMOVSXWD m64 xmm
// VPMOVSXWD xmm ymm
// VPMOVSXWD m128 ymm
func VPMOVSXWD(mx, xy operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(xy):
return &intrep.Instruction{
Opcode: "VPMOVSXWD",
Operands: []operand.Op{mx, xy},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsM64(mx) && operand.IsXMM(xy):
return &intrep.Instruction{
Opcode: "VPMOVSXWD",
Operands: []operand.Op{mx, xy},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsXMM(mx) && operand.IsYMM(xy):
return &intrep.Instruction{
Opcode: "VPMOVSXWD",
Operands: []operand.Op{mx, xy},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{xy},
ISA: []string{"AVX2"},
}, nil
case operand.IsM128(mx) && operand.IsYMM(xy):
return &intrep.Instruction{
Opcode: "VPMOVSXWD",
Operands: []operand.Op{mx, xy},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{xy},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPMOVSXWD: bad operands")
}
// VPMOVSXWQ: Move Packed Word Integers to Quadword Integers with Sign Extension.
//
// Forms:
//
// VPMOVSXWQ xmm xmm
// VPMOVSXWQ m32 xmm
// VPMOVSXWQ xmm ymm
// VPMOVSXWQ m64 ymm
func VPMOVSXWQ(mx, xy operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(xy):
return &intrep.Instruction{
Opcode: "VPMOVSXWQ",
Operands: []operand.Op{mx, xy},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsM32(mx) && operand.IsXMM(xy):
return &intrep.Instruction{
Opcode: "VPMOVSXWQ",
Operands: []operand.Op{mx, xy},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsXMM(mx) && operand.IsYMM(xy):
return &intrep.Instruction{
Opcode: "VPMOVSXWQ",
Operands: []operand.Op{mx, xy},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{xy},
ISA: []string{"AVX2"},
}, nil
case operand.IsM64(mx) && operand.IsYMM(xy):
return &intrep.Instruction{
Opcode: "VPMOVSXWQ",
Operands: []operand.Op{mx, xy},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{xy},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPMOVSXWQ: bad operands")
}
// VPMOVZXBD: Move Packed Byte Integers to Doubleword Integers with Zero Extension.
//
// Forms:
//
// VPMOVZXBD xmm xmm
// VPMOVZXBD m32 xmm
// VPMOVZXBD xmm ymm
// VPMOVZXBD m64 ymm
func VPMOVZXBD(mx, xy operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(xy):
return &intrep.Instruction{
Opcode: "VPMOVZXBD",
Operands: []operand.Op{mx, xy},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsM32(mx) && operand.IsXMM(xy):
return &intrep.Instruction{
Opcode: "VPMOVZXBD",
Operands: []operand.Op{mx, xy},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsXMM(mx) && operand.IsYMM(xy):
return &intrep.Instruction{
Opcode: "VPMOVZXBD",
Operands: []operand.Op{mx, xy},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{xy},
ISA: []string{"AVX2"},
}, nil
case operand.IsM64(mx) && operand.IsYMM(xy):
return &intrep.Instruction{
Opcode: "VPMOVZXBD",
Operands: []operand.Op{mx, xy},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{xy},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPMOVZXBD: bad operands")
}
// VPMOVZXBQ: Move Packed Byte Integers to Quadword Integers with Zero Extension.
//
// Forms:
//
// VPMOVZXBQ xmm xmm
// VPMOVZXBQ m16 xmm
// VPMOVZXBQ xmm ymm
// VPMOVZXBQ m32 ymm
func VPMOVZXBQ(mx, xy operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(xy):
return &intrep.Instruction{
Opcode: "VPMOVZXBQ",
Operands: []operand.Op{mx, xy},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsM16(mx) && operand.IsXMM(xy):
return &intrep.Instruction{
Opcode: "VPMOVZXBQ",
Operands: []operand.Op{mx, xy},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsXMM(mx) && operand.IsYMM(xy):
return &intrep.Instruction{
Opcode: "VPMOVZXBQ",
Operands: []operand.Op{mx, xy},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{xy},
ISA: []string{"AVX2"},
}, nil
case operand.IsM32(mx) && operand.IsYMM(xy):
return &intrep.Instruction{
Opcode: "VPMOVZXBQ",
Operands: []operand.Op{mx, xy},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{xy},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPMOVZXBQ: bad operands")
}
// VPMOVZXBW: Move Packed Byte Integers to Word Integers with Zero Extension.
//
// Forms:
//
// VPMOVZXBW xmm xmm
// VPMOVZXBW m64 xmm
// VPMOVZXBW xmm ymm
// VPMOVZXBW m128 ymm
func VPMOVZXBW(mx, xy operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(xy):
return &intrep.Instruction{
Opcode: "VPMOVZXBW",
Operands: []operand.Op{mx, xy},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsM64(mx) && operand.IsXMM(xy):
return &intrep.Instruction{
Opcode: "VPMOVZXBW",
Operands: []operand.Op{mx, xy},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsXMM(mx) && operand.IsYMM(xy):
return &intrep.Instruction{
Opcode: "VPMOVZXBW",
Operands: []operand.Op{mx, xy},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{xy},
ISA: []string{"AVX2"},
}, nil
case operand.IsM128(mx) && operand.IsYMM(xy):
return &intrep.Instruction{
Opcode: "VPMOVZXBW",
Operands: []operand.Op{mx, xy},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{xy},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPMOVZXBW: bad operands")
}
// VPMOVZXDQ: Move Packed Doubleword Integers to Quadword Integers with Zero Extension.
//
// Forms:
//
// VPMOVZXDQ xmm xmm
// VPMOVZXDQ m64 xmm
// VPMOVZXDQ xmm ymm
// VPMOVZXDQ m128 ymm
func VPMOVZXDQ(mx, xy operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(xy):
return &intrep.Instruction{
Opcode: "VPMOVZXDQ",
Operands: []operand.Op{mx, xy},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsM64(mx) && operand.IsXMM(xy):
return &intrep.Instruction{
Opcode: "VPMOVZXDQ",
Operands: []operand.Op{mx, xy},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsXMM(mx) && operand.IsYMM(xy):
return &intrep.Instruction{
Opcode: "VPMOVZXDQ",
Operands: []operand.Op{mx, xy},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{xy},
ISA: []string{"AVX2"},
}, nil
case operand.IsM128(mx) && operand.IsYMM(xy):
return &intrep.Instruction{
Opcode: "VPMOVZXDQ",
Operands: []operand.Op{mx, xy},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{xy},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPMOVZXDQ: bad operands")
}
// VPMOVZXWD: Move Packed Word Integers to Doubleword Integers with Zero Extension.
//
// Forms:
//
// VPMOVZXWD xmm xmm
// VPMOVZXWD m64 xmm
// VPMOVZXWD xmm ymm
// VPMOVZXWD m128 ymm
func VPMOVZXWD(mx, xy operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(xy):
return &intrep.Instruction{
Opcode: "VPMOVZXWD",
Operands: []operand.Op{mx, xy},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsM64(mx) && operand.IsXMM(xy):
return &intrep.Instruction{
Opcode: "VPMOVZXWD",
Operands: []operand.Op{mx, xy},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsXMM(mx) && operand.IsYMM(xy):
return &intrep.Instruction{
Opcode: "VPMOVZXWD",
Operands: []operand.Op{mx, xy},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{xy},
ISA: []string{"AVX2"},
}, nil
case operand.IsM128(mx) && operand.IsYMM(xy):
return &intrep.Instruction{
Opcode: "VPMOVZXWD",
Operands: []operand.Op{mx, xy},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{xy},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPMOVZXWD: bad operands")
}
// VPMOVZXWQ: Move Packed Word Integers to Quadword Integers with Zero Extension.
//
// Forms:
//
// VPMOVZXWQ xmm xmm
// VPMOVZXWQ m32 xmm
// VPMOVZXWQ xmm ymm
// VPMOVZXWQ m64 ymm
func VPMOVZXWQ(mx, xy operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(xy):
return &intrep.Instruction{
Opcode: "VPMOVZXWQ",
Operands: []operand.Op{mx, xy},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsM32(mx) && operand.IsXMM(xy):
return &intrep.Instruction{
Opcode: "VPMOVZXWQ",
Operands: []operand.Op{mx, xy},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsXMM(mx) && operand.IsYMM(xy):
return &intrep.Instruction{
Opcode: "VPMOVZXWQ",
Operands: []operand.Op{mx, xy},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{xy},
ISA: []string{"AVX2"},
}, nil
case operand.IsM64(mx) && operand.IsYMM(xy):
return &intrep.Instruction{
Opcode: "VPMOVZXWQ",
Operands: []operand.Op{mx, xy},
Inputs: []operand.Op{mx},
Outputs: []operand.Op{xy},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPMOVZXWQ: bad operands")
}
// VPMULDQ: Multiply Packed Signed Doubleword Integers and Store Quadword Result.
//
// Forms:
//
// VPMULDQ xmm xmm xmm
// VPMULDQ m128 xmm xmm
// VPMULDQ ymm ymm ymm
// VPMULDQ m256 ymm ymm
func VPMULDQ(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPMULDQ",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPMULDQ",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPMULDQ",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPMULDQ",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPMULDQ: bad operands")
}
// VPMULHRSW: Packed Multiply Signed Word Integers and Store High Result with Round and Scale.
//
// Forms:
//
// VPMULHRSW xmm xmm xmm
// VPMULHRSW m128 xmm xmm
// VPMULHRSW ymm ymm ymm
// VPMULHRSW m256 ymm ymm
func VPMULHRSW(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPMULHRSW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPMULHRSW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPMULHRSW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPMULHRSW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPMULHRSW: bad operands")
}
// VPMULHUW: Multiply Packed Unsigned Word Integers and Store High Result.
//
// Forms:
//
// VPMULHUW xmm xmm xmm
// VPMULHUW m128 xmm xmm
// VPMULHUW ymm ymm ymm
// VPMULHUW m256 ymm ymm
func VPMULHUW(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPMULHUW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPMULHUW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPMULHUW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPMULHUW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPMULHUW: bad operands")
}
// VPMULHW: Multiply Packed Signed Word Integers and Store High Result.
//
// Forms:
//
// VPMULHW xmm xmm xmm
// VPMULHW m128 xmm xmm
// VPMULHW ymm ymm ymm
// VPMULHW m256 ymm ymm
func VPMULHW(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPMULHW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPMULHW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPMULHW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPMULHW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPMULHW: bad operands")
}
// VPMULLD: Multiply Packed Signed Doubleword Integers and Store Low Result.
//
// Forms:
//
// VPMULLD xmm xmm xmm
// VPMULLD m128 xmm xmm
// VPMULLD ymm ymm ymm
// VPMULLD m256 ymm ymm
func VPMULLD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPMULLD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPMULLD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPMULLD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPMULLD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPMULLD: bad operands")
}
// VPMULLW: Multiply Packed Signed Word Integers and Store Low Result.
//
// Forms:
//
// VPMULLW xmm xmm xmm
// VPMULLW m128 xmm xmm
// VPMULLW ymm ymm ymm
// VPMULLW m256 ymm ymm
func VPMULLW(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPMULLW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPMULLW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPMULLW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPMULLW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPMULLW: bad operands")
}
// VPMULUDQ: Multiply Packed Unsigned Doubleword Integers.
//
// Forms:
//
// VPMULUDQ xmm xmm xmm
// VPMULUDQ m128 xmm xmm
// VPMULUDQ ymm ymm ymm
// VPMULUDQ m256 ymm ymm
func VPMULUDQ(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPMULUDQ",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPMULUDQ",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPMULUDQ",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPMULUDQ",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPMULUDQ: bad operands")
}
// VPOR: Packed Bitwise Logical OR.
//
// Forms:
//
// VPOR xmm xmm xmm
// VPOR m128 xmm xmm
// VPOR ymm ymm ymm
// VPOR m256 ymm ymm
func VPOR(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPOR",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPOR",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPOR",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPOR",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPOR: bad operands")
}
// VPSADBW: Compute Sum of Absolute Differences.
//
// Forms:
//
// VPSADBW xmm xmm xmm
// VPSADBW m128 xmm xmm
// VPSADBW ymm ymm ymm
// VPSADBW m256 ymm ymm
func VPSADBW(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPSADBW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
CancellingInputs: true,
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPSADBW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPSADBW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
CancellingInputs: true,
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPSADBW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPSADBW: bad operands")
}
// VPSHUFB: Packed Shuffle Bytes.
//
// Forms:
//
// VPSHUFB xmm xmm xmm
// VPSHUFB m128 xmm xmm
// VPSHUFB ymm ymm ymm
// VPSHUFB m256 ymm ymm
func VPSHUFB(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPSHUFB",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPSHUFB",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPSHUFB",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPSHUFB",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPSHUFB: bad operands")
}
// VPSHUFD: Shuffle Packed Doublewords.
//
// Forms:
//
// VPSHUFD imm8 xmm xmm
// VPSHUFD imm8 m128 xmm
// VPSHUFD imm8 ymm ymm
// VPSHUFD imm8 m256 ymm
func VPSHUFD(i, mxy, xy operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(i) && operand.IsXMM(mxy) && operand.IsXMM(xy):
return &intrep.Instruction{
Opcode: "VPSHUFD",
Operands: []operand.Op{i, mxy, xy},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsIMM8(i) && operand.IsM128(mxy) && operand.IsXMM(xy):
return &intrep.Instruction{
Opcode: "VPSHUFD",
Operands: []operand.Op{i, mxy, xy},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsIMM8(i) && operand.IsYMM(mxy) && operand.IsYMM(xy):
return &intrep.Instruction{
Opcode: "VPSHUFD",
Operands: []operand.Op{i, mxy, xy},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{xy},
ISA: []string{"AVX2"},
}, nil
case operand.IsIMM8(i) && operand.IsM256(mxy) && operand.IsYMM(xy):
return &intrep.Instruction{
Opcode: "VPSHUFD",
Operands: []operand.Op{i, mxy, xy},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{xy},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPSHUFD: bad operands")
}
// VPSHUFHW: Shuffle Packed High Words.
//
// Forms:
//
// VPSHUFHW imm8 xmm xmm
// VPSHUFHW imm8 m128 xmm
// VPSHUFHW imm8 ymm ymm
// VPSHUFHW imm8 m256 ymm
func VPSHUFHW(i, mxy, xy operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(i) && operand.IsXMM(mxy) && operand.IsXMM(xy):
return &intrep.Instruction{
Opcode: "VPSHUFHW",
Operands: []operand.Op{i, mxy, xy},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsIMM8(i) && operand.IsM128(mxy) && operand.IsXMM(xy):
return &intrep.Instruction{
Opcode: "VPSHUFHW",
Operands: []operand.Op{i, mxy, xy},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsIMM8(i) && operand.IsYMM(mxy) && operand.IsYMM(xy):
return &intrep.Instruction{
Opcode: "VPSHUFHW",
Operands: []operand.Op{i, mxy, xy},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{xy},
ISA: []string{"AVX2"},
}, nil
case operand.IsIMM8(i) && operand.IsM256(mxy) && operand.IsYMM(xy):
return &intrep.Instruction{
Opcode: "VPSHUFHW",
Operands: []operand.Op{i, mxy, xy},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{xy},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPSHUFHW: bad operands")
}
// VPSHUFLW: Shuffle Packed Low Words.
//
// Forms:
//
// VPSHUFLW imm8 xmm xmm
// VPSHUFLW imm8 m128 xmm
// VPSHUFLW imm8 ymm ymm
// VPSHUFLW imm8 m256 ymm
func VPSHUFLW(i, mxy, xy operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(i) && operand.IsXMM(mxy) && operand.IsXMM(xy):
return &intrep.Instruction{
Opcode: "VPSHUFLW",
Operands: []operand.Op{i, mxy, xy},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsIMM8(i) && operand.IsM128(mxy) && operand.IsXMM(xy):
return &intrep.Instruction{
Opcode: "VPSHUFLW",
Operands: []operand.Op{i, mxy, xy},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsIMM8(i) && operand.IsYMM(mxy) && operand.IsYMM(xy):
return &intrep.Instruction{
Opcode: "VPSHUFLW",
Operands: []operand.Op{i, mxy, xy},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{xy},
ISA: []string{"AVX2"},
}, nil
case operand.IsIMM8(i) && operand.IsM256(mxy) && operand.IsYMM(xy):
return &intrep.Instruction{
Opcode: "VPSHUFLW",
Operands: []operand.Op{i, mxy, xy},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{xy},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPSHUFLW: bad operands")
}
// VPSIGNB: Packed Sign of Byte Integers.
//
// Forms:
//
// VPSIGNB xmm xmm xmm
// VPSIGNB m128 xmm xmm
// VPSIGNB ymm ymm ymm
// VPSIGNB m256 ymm ymm
func VPSIGNB(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPSIGNB",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPSIGNB",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPSIGNB",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPSIGNB",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPSIGNB: bad operands")
}
// VPSIGND: Packed Sign of Doubleword Integers.
//
// Forms:
//
// VPSIGND xmm xmm xmm
// VPSIGND m128 xmm xmm
// VPSIGND ymm ymm ymm
// VPSIGND m256 ymm ymm
func VPSIGND(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPSIGND",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPSIGND",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPSIGND",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPSIGND",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPSIGND: bad operands")
}
// VPSIGNW: Packed Sign of Word Integers.
//
// Forms:
//
// VPSIGNW xmm xmm xmm
// VPSIGNW m128 xmm xmm
// VPSIGNW ymm ymm ymm
// VPSIGNW m256 ymm ymm
func VPSIGNW(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPSIGNW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPSIGNW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPSIGNW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPSIGNW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPSIGNW: bad operands")
}
// VPSLLD: Shift Packed Doubleword Data Left Logical.
//
// Forms:
//
// VPSLLD imm8 xmm xmm
// VPSLLD xmm xmm xmm
// VPSLLD m128 xmm xmm
// VPSLLD imm8 ymm ymm
// VPSLLD xmm ymm ymm
// VPSLLD m128 ymm ymm
func VPSLLD(imx, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(imx) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPSLLD",
Operands: []operand.Op{imx, xy, xy1},
Inputs: []operand.Op{xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsXMM(imx) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPSLLD",
Operands: []operand.Op{imx, xy, xy1},
Inputs: []operand.Op{imx, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(imx) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPSLLD",
Operands: []operand.Op{imx, xy, xy1},
Inputs: []operand.Op{imx, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsIMM8(imx) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPSLLD",
Operands: []operand.Op{imx, xy, xy1},
Inputs: []operand.Op{xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsXMM(imx) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPSLLD",
Operands: []operand.Op{imx, xy, xy1},
Inputs: []operand.Op{imx, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsM128(imx) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPSLLD",
Operands: []operand.Op{imx, xy, xy1},
Inputs: []operand.Op{imx, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPSLLD: bad operands")
}
// VPSLLDQ: Shift Packed Double Quadword Left Logical.
//
// Forms:
//
// VPSLLDQ imm8 xmm xmm
// VPSLLDQ imm8 ymm ymm
func VPSLLDQ(i, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(i) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPSLLDQ",
Operands: []operand.Op{i, xy, xy1},
Inputs: []operand.Op{xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsIMM8(i) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPSLLDQ",
Operands: []operand.Op{i, xy, xy1},
Inputs: []operand.Op{xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPSLLDQ: bad operands")
}
// VPSLLQ: Shift Packed Quadword Data Left Logical.
//
// Forms:
//
// VPSLLQ imm8 xmm xmm
// VPSLLQ xmm xmm xmm
// VPSLLQ m128 xmm xmm
// VPSLLQ imm8 ymm ymm
// VPSLLQ xmm ymm ymm
// VPSLLQ m128 ymm ymm
func VPSLLQ(imx, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(imx) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPSLLQ",
Operands: []operand.Op{imx, xy, xy1},
Inputs: []operand.Op{xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsXMM(imx) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPSLLQ",
Operands: []operand.Op{imx, xy, xy1},
Inputs: []operand.Op{imx, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(imx) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPSLLQ",
Operands: []operand.Op{imx, xy, xy1},
Inputs: []operand.Op{imx, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsIMM8(imx) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPSLLQ",
Operands: []operand.Op{imx, xy, xy1},
Inputs: []operand.Op{xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsXMM(imx) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPSLLQ",
Operands: []operand.Op{imx, xy, xy1},
Inputs: []operand.Op{imx, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsM128(imx) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPSLLQ",
Operands: []operand.Op{imx, xy, xy1},
Inputs: []operand.Op{imx, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPSLLQ: bad operands")
}
// VPSLLVD: Variable Shift Packed Doubleword Data Left Logical.
//
// Forms:
//
// VPSLLVD xmm xmm xmm
// VPSLLVD m128 xmm xmm
// VPSLLVD ymm ymm ymm
// VPSLLVD m256 ymm ymm
func VPSLLVD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPSLLVD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPSLLVD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPSLLVD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPSLLVD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPSLLVD: bad operands")
}
// VPSLLVQ: Variable Shift Packed Quadword Data Left Logical.
//
// Forms:
//
// VPSLLVQ xmm xmm xmm
// VPSLLVQ m128 xmm xmm
// VPSLLVQ ymm ymm ymm
// VPSLLVQ m256 ymm ymm
func VPSLLVQ(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPSLLVQ",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPSLLVQ",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPSLLVQ",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPSLLVQ",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPSLLVQ: bad operands")
}
// VPSLLW: Shift Packed Word Data Left Logical.
//
// Forms:
//
// VPSLLW imm8 xmm xmm
// VPSLLW xmm xmm xmm
// VPSLLW m128 xmm xmm
// VPSLLW imm8 ymm ymm
// VPSLLW xmm ymm ymm
// VPSLLW m128 ymm ymm
func VPSLLW(imx, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(imx) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPSLLW",
Operands: []operand.Op{imx, xy, xy1},
Inputs: []operand.Op{xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsXMM(imx) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPSLLW",
Operands: []operand.Op{imx, xy, xy1},
Inputs: []operand.Op{imx, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(imx) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPSLLW",
Operands: []operand.Op{imx, xy, xy1},
Inputs: []operand.Op{imx, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsIMM8(imx) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPSLLW",
Operands: []operand.Op{imx, xy, xy1},
Inputs: []operand.Op{xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsXMM(imx) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPSLLW",
Operands: []operand.Op{imx, xy, xy1},
Inputs: []operand.Op{imx, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsM128(imx) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPSLLW",
Operands: []operand.Op{imx, xy, xy1},
Inputs: []operand.Op{imx, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPSLLW: bad operands")
}
// VPSRAD: Shift Packed Doubleword Data Right Arithmetic.
//
// Forms:
//
// VPSRAD imm8 xmm xmm
// VPSRAD xmm xmm xmm
// VPSRAD m128 xmm xmm
// VPSRAD imm8 ymm ymm
// VPSRAD xmm ymm ymm
// VPSRAD m128 ymm ymm
func VPSRAD(imx, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(imx) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPSRAD",
Operands: []operand.Op{imx, xy, xy1},
Inputs: []operand.Op{xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsXMM(imx) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPSRAD",
Operands: []operand.Op{imx, xy, xy1},
Inputs: []operand.Op{imx, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(imx) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPSRAD",
Operands: []operand.Op{imx, xy, xy1},
Inputs: []operand.Op{imx, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsIMM8(imx) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPSRAD",
Operands: []operand.Op{imx, xy, xy1},
Inputs: []operand.Op{xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsXMM(imx) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPSRAD",
Operands: []operand.Op{imx, xy, xy1},
Inputs: []operand.Op{imx, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsM128(imx) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPSRAD",
Operands: []operand.Op{imx, xy, xy1},
Inputs: []operand.Op{imx, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPSRAD: bad operands")
}
// VPSRAVD: Variable Shift Packed Doubleword Data Right Arithmetic.
//
// Forms:
//
// VPSRAVD xmm xmm xmm
// VPSRAVD m128 xmm xmm
// VPSRAVD ymm ymm ymm
// VPSRAVD m256 ymm ymm
func VPSRAVD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPSRAVD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPSRAVD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPSRAVD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPSRAVD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPSRAVD: bad operands")
}
// VPSRAW: Shift Packed Word Data Right Arithmetic.
//
// Forms:
//
// VPSRAW imm8 xmm xmm
// VPSRAW xmm xmm xmm
// VPSRAW m128 xmm xmm
// VPSRAW imm8 ymm ymm
// VPSRAW xmm ymm ymm
// VPSRAW m128 ymm ymm
func VPSRAW(imx, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(imx) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPSRAW",
Operands: []operand.Op{imx, xy, xy1},
Inputs: []operand.Op{xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsXMM(imx) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPSRAW",
Operands: []operand.Op{imx, xy, xy1},
Inputs: []operand.Op{imx, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(imx) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPSRAW",
Operands: []operand.Op{imx, xy, xy1},
Inputs: []operand.Op{imx, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsIMM8(imx) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPSRAW",
Operands: []operand.Op{imx, xy, xy1},
Inputs: []operand.Op{xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsXMM(imx) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPSRAW",
Operands: []operand.Op{imx, xy, xy1},
Inputs: []operand.Op{imx, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsM128(imx) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPSRAW",
Operands: []operand.Op{imx, xy, xy1},
Inputs: []operand.Op{imx, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPSRAW: bad operands")
}
// VPSRLD: Shift Packed Doubleword Data Right Logical.
//
// Forms:
//
// VPSRLD imm8 xmm xmm
// VPSRLD xmm xmm xmm
// VPSRLD m128 xmm xmm
// VPSRLD imm8 ymm ymm
// VPSRLD xmm ymm ymm
// VPSRLD m128 ymm ymm
func VPSRLD(imx, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(imx) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPSRLD",
Operands: []operand.Op{imx, xy, xy1},
Inputs: []operand.Op{xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsXMM(imx) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPSRLD",
Operands: []operand.Op{imx, xy, xy1},
Inputs: []operand.Op{imx, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(imx) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPSRLD",
Operands: []operand.Op{imx, xy, xy1},
Inputs: []operand.Op{imx, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsIMM8(imx) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPSRLD",
Operands: []operand.Op{imx, xy, xy1},
Inputs: []operand.Op{xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsXMM(imx) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPSRLD",
Operands: []operand.Op{imx, xy, xy1},
Inputs: []operand.Op{imx, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsM128(imx) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPSRLD",
Operands: []operand.Op{imx, xy, xy1},
Inputs: []operand.Op{imx, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPSRLD: bad operands")
}
// VPSRLDQ: Shift Packed Double Quadword Right Logical.
//
// Forms:
//
// VPSRLDQ imm8 xmm xmm
// VPSRLDQ imm8 ymm ymm
func VPSRLDQ(i, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(i) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPSRLDQ",
Operands: []operand.Op{i, xy, xy1},
Inputs: []operand.Op{xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsIMM8(i) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPSRLDQ",
Operands: []operand.Op{i, xy, xy1},
Inputs: []operand.Op{xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPSRLDQ: bad operands")
}
// VPSRLQ: Shift Packed Quadword Data Right Logical.
//
// Forms:
//
// VPSRLQ imm8 xmm xmm
// VPSRLQ xmm xmm xmm
// VPSRLQ m128 xmm xmm
// VPSRLQ imm8 ymm ymm
// VPSRLQ xmm ymm ymm
// VPSRLQ m128 ymm ymm
func VPSRLQ(imx, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(imx) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPSRLQ",
Operands: []operand.Op{imx, xy, xy1},
Inputs: []operand.Op{xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsXMM(imx) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPSRLQ",
Operands: []operand.Op{imx, xy, xy1},
Inputs: []operand.Op{imx, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(imx) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPSRLQ",
Operands: []operand.Op{imx, xy, xy1},
Inputs: []operand.Op{imx, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsIMM8(imx) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPSRLQ",
Operands: []operand.Op{imx, xy, xy1},
Inputs: []operand.Op{xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsXMM(imx) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPSRLQ",
Operands: []operand.Op{imx, xy, xy1},
Inputs: []operand.Op{imx, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsM128(imx) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPSRLQ",
Operands: []operand.Op{imx, xy, xy1},
Inputs: []operand.Op{imx, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPSRLQ: bad operands")
}
// VPSRLVD: Variable Shift Packed Doubleword Data Right Logical.
//
// Forms:
//
// VPSRLVD xmm xmm xmm
// VPSRLVD m128 xmm xmm
// VPSRLVD ymm ymm ymm
// VPSRLVD m256 ymm ymm
func VPSRLVD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPSRLVD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPSRLVD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPSRLVD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPSRLVD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPSRLVD: bad operands")
}
// VPSRLVQ: Variable Shift Packed Quadword Data Right Logical.
//
// Forms:
//
// VPSRLVQ xmm xmm xmm
// VPSRLVQ m128 xmm xmm
// VPSRLVQ ymm ymm ymm
// VPSRLVQ m256 ymm ymm
func VPSRLVQ(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPSRLVQ",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPSRLVQ",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPSRLVQ",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPSRLVQ",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPSRLVQ: bad operands")
}
// VPSRLW: Shift Packed Word Data Right Logical.
//
// Forms:
//
// VPSRLW imm8 xmm xmm
// VPSRLW xmm xmm xmm
// VPSRLW m128 xmm xmm
// VPSRLW imm8 ymm ymm
// VPSRLW xmm ymm ymm
// VPSRLW m128 ymm ymm
func VPSRLW(imx, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(imx) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPSRLW",
Operands: []operand.Op{imx, xy, xy1},
Inputs: []operand.Op{xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsXMM(imx) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPSRLW",
Operands: []operand.Op{imx, xy, xy1},
Inputs: []operand.Op{imx, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(imx) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPSRLW",
Operands: []operand.Op{imx, xy, xy1},
Inputs: []operand.Op{imx, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsIMM8(imx) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPSRLW",
Operands: []operand.Op{imx, xy, xy1},
Inputs: []operand.Op{xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsXMM(imx) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPSRLW",
Operands: []operand.Op{imx, xy, xy1},
Inputs: []operand.Op{imx, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsM128(imx) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPSRLW",
Operands: []operand.Op{imx, xy, xy1},
Inputs: []operand.Op{imx, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPSRLW: bad operands")
}
// VPSUBB: Subtract Packed Byte Integers.
//
// Forms:
//
// VPSUBB xmm xmm xmm
// VPSUBB m128 xmm xmm
// VPSUBB ymm ymm ymm
// VPSUBB m256 ymm ymm
func VPSUBB(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPSUBB",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
CancellingInputs: true,
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPSUBB",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPSUBB",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
CancellingInputs: true,
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPSUBB",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPSUBB: bad operands")
}
// VPSUBD: Subtract Packed Doubleword Integers.
//
// Forms:
//
// VPSUBD xmm xmm xmm
// VPSUBD m128 xmm xmm
// VPSUBD ymm ymm ymm
// VPSUBD m256 ymm ymm
func VPSUBD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPSUBD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
CancellingInputs: true,
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPSUBD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPSUBD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
CancellingInputs: true,
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPSUBD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPSUBD: bad operands")
}
// VPSUBQ: Subtract Packed Quadword Integers.
//
// Forms:
//
// VPSUBQ xmm xmm xmm
// VPSUBQ m128 xmm xmm
// VPSUBQ ymm ymm ymm
// VPSUBQ m256 ymm ymm
func VPSUBQ(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPSUBQ",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
CancellingInputs: true,
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPSUBQ",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPSUBQ",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
CancellingInputs: true,
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPSUBQ",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPSUBQ: bad operands")
}
// VPSUBSB: Subtract Packed Signed Byte Integers with Signed Saturation.
//
// Forms:
//
// VPSUBSB xmm xmm xmm
// VPSUBSB m128 xmm xmm
// VPSUBSB ymm ymm ymm
// VPSUBSB m256 ymm ymm
func VPSUBSB(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPSUBSB",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
CancellingInputs: true,
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPSUBSB",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPSUBSB",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
CancellingInputs: true,
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPSUBSB",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPSUBSB: bad operands")
}
// VPSUBSW: Subtract Packed Signed Word Integers with Signed Saturation.
//
// Forms:
//
// VPSUBSW xmm xmm xmm
// VPSUBSW m128 xmm xmm
// VPSUBSW ymm ymm ymm
// VPSUBSW m256 ymm ymm
func VPSUBSW(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPSUBSW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
CancellingInputs: true,
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPSUBSW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPSUBSW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
CancellingInputs: true,
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPSUBSW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPSUBSW: bad operands")
}
// VPSUBUSB: Subtract Packed Unsigned Byte Integers with Unsigned Saturation.
//
// Forms:
//
// VPSUBUSB xmm xmm xmm
// VPSUBUSB m128 xmm xmm
// VPSUBUSB ymm ymm ymm
// VPSUBUSB m256 ymm ymm
func VPSUBUSB(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPSUBUSB",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
CancellingInputs: true,
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPSUBUSB",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPSUBUSB",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
CancellingInputs: true,
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPSUBUSB",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPSUBUSB: bad operands")
}
// VPSUBUSW: Subtract Packed Unsigned Word Integers with Unsigned Saturation.
//
// Forms:
//
// VPSUBUSW xmm xmm xmm
// VPSUBUSW m128 xmm xmm
// VPSUBUSW ymm ymm ymm
// VPSUBUSW m256 ymm ymm
func VPSUBUSW(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPSUBUSW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
CancellingInputs: true,
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPSUBUSW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPSUBUSW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
CancellingInputs: true,
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPSUBUSW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPSUBUSW: bad operands")
}
// VPSUBW: Subtract Packed Word Integers.
//
// Forms:
//
// VPSUBW xmm xmm xmm
// VPSUBW m128 xmm xmm
// VPSUBW ymm ymm ymm
// VPSUBW m256 ymm ymm
func VPSUBW(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPSUBW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
CancellingInputs: true,
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPSUBW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPSUBW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
CancellingInputs: true,
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPSUBW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPSUBW: bad operands")
}
// VPTEST: Packed Logical Compare.
//
// Forms:
//
// VPTEST xmm xmm
// VPTEST m128 xmm
// VPTEST ymm ymm
// VPTEST m256 ymm
func VPTEST(mxy, xy operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy):
return &intrep.Instruction{
Opcode: "VPTEST",
Operands: []operand.Op{mxy, xy},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy):
return &intrep.Instruction{
Opcode: "VPTEST",
Operands: []operand.Op{mxy, xy},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy):
return &intrep.Instruction{
Opcode: "VPTEST",
Operands: []operand.Op{mxy, xy},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{},
ISA: []string{"AVX"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy):
return &intrep.Instruction{
Opcode: "VPTEST",
Operands: []operand.Op{mxy, xy},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VPTEST: bad operands")
}
// VPUNPCKHBW: Unpack and Interleave High-Order Bytes into Words.
//
// Forms:
//
// VPUNPCKHBW xmm xmm xmm
// VPUNPCKHBW m128 xmm xmm
// VPUNPCKHBW ymm ymm ymm
// VPUNPCKHBW m256 ymm ymm
func VPUNPCKHBW(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPUNPCKHBW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPUNPCKHBW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPUNPCKHBW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPUNPCKHBW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPUNPCKHBW: bad operands")
}
// VPUNPCKHDQ: Unpack and Interleave High-Order Doublewords into Quadwords.
//
// Forms:
//
// VPUNPCKHDQ xmm xmm xmm
// VPUNPCKHDQ m128 xmm xmm
// VPUNPCKHDQ ymm ymm ymm
// VPUNPCKHDQ m256 ymm ymm
func VPUNPCKHDQ(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPUNPCKHDQ",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPUNPCKHDQ",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPUNPCKHDQ",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPUNPCKHDQ",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPUNPCKHDQ: bad operands")
}
// VPUNPCKHQDQ: Unpack and Interleave High-Order Quadwords into Double Quadwords.
//
// Forms:
//
// VPUNPCKHQDQ xmm xmm xmm
// VPUNPCKHQDQ m128 xmm xmm
// VPUNPCKHQDQ ymm ymm ymm
// VPUNPCKHQDQ m256 ymm ymm
func VPUNPCKHQDQ(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPUNPCKHQDQ",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPUNPCKHQDQ",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPUNPCKHQDQ",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPUNPCKHQDQ",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPUNPCKHQDQ: bad operands")
}
// VPUNPCKHWD: Unpack and Interleave High-Order Words into Doublewords.
//
// Forms:
//
// VPUNPCKHWD xmm xmm xmm
// VPUNPCKHWD m128 xmm xmm
// VPUNPCKHWD ymm ymm ymm
// VPUNPCKHWD m256 ymm ymm
func VPUNPCKHWD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPUNPCKHWD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPUNPCKHWD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPUNPCKHWD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPUNPCKHWD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPUNPCKHWD: bad operands")
}
// VPUNPCKLBW: Unpack and Interleave Low-Order Bytes into Words.
//
// Forms:
//
// VPUNPCKLBW xmm xmm xmm
// VPUNPCKLBW m128 xmm xmm
// VPUNPCKLBW ymm ymm ymm
// VPUNPCKLBW m256 ymm ymm
func VPUNPCKLBW(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPUNPCKLBW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPUNPCKLBW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPUNPCKLBW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPUNPCKLBW",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPUNPCKLBW: bad operands")
}
// VPUNPCKLDQ: Unpack and Interleave Low-Order Doublewords into Quadwords.
//
// Forms:
//
// VPUNPCKLDQ xmm xmm xmm
// VPUNPCKLDQ m128 xmm xmm
// VPUNPCKLDQ ymm ymm ymm
// VPUNPCKLDQ m256 ymm ymm
func VPUNPCKLDQ(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPUNPCKLDQ",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPUNPCKLDQ",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPUNPCKLDQ",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPUNPCKLDQ",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPUNPCKLDQ: bad operands")
}
// VPUNPCKLQDQ: Unpack and Interleave Low-Order Quadwords into Double Quadwords.
//
// Forms:
//
// VPUNPCKLQDQ xmm xmm xmm
// VPUNPCKLQDQ m128 xmm xmm
// VPUNPCKLQDQ ymm ymm ymm
// VPUNPCKLQDQ m256 ymm ymm
func VPUNPCKLQDQ(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPUNPCKLQDQ",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPUNPCKLQDQ",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPUNPCKLQDQ",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPUNPCKLQDQ",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPUNPCKLQDQ: bad operands")
}
// VPUNPCKLWD: Unpack and Interleave Low-Order Words into Doublewords.
//
// Forms:
//
// VPUNPCKLWD xmm xmm xmm
// VPUNPCKLWD m128 xmm xmm
// VPUNPCKLWD ymm ymm ymm
// VPUNPCKLWD m256 ymm ymm
func VPUNPCKLWD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPUNPCKLWD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPUNPCKLWD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPUNPCKLWD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPUNPCKLWD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPUNPCKLWD: bad operands")
}
// VPXOR: Packed Bitwise Logical Exclusive OR.
//
// Forms:
//
// VPXOR xmm xmm xmm
// VPXOR m128 xmm xmm
// VPXOR ymm ymm ymm
// VPXOR m256 ymm ymm
func VPXOR(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPXOR",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
CancellingInputs: true,
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VPXOR",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPXOR",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
CancellingInputs: true,
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VPXOR",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX2"},
}, nil
}
return nil, errors.New("VPXOR: bad operands")
}
// VRCPPS: Compute Approximate Reciprocals of Packed Single-Precision Floating-Point Values.
//
// Forms:
//
// VRCPPS xmm xmm
// VRCPPS m128 xmm
// VRCPPS ymm ymm
// VRCPPS m256 ymm
func VRCPPS(mxy, xy operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy):
return &intrep.Instruction{
Opcode: "VRCPPS",
Operands: []operand.Op{mxy, xy},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy):
return &intrep.Instruction{
Opcode: "VRCPPS",
Operands: []operand.Op{mxy, xy},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy):
return &intrep.Instruction{
Opcode: "VRCPPS",
Operands: []operand.Op{mxy, xy},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy):
return &intrep.Instruction{
Opcode: "VRCPPS",
Operands: []operand.Op{mxy, xy},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VRCPPS: bad operands")
}
// VRCPSS: Compute Approximate Reciprocal of Scalar Single-Precision Floating-Point Values.
//
// Forms:
//
// VRCPSS xmm xmm xmm
// VRCPSS m32 xmm xmm
func VRCPSS(mx, x, x1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VRCPSS",
Operands: []operand.Op{mx, x, x1},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x1},
ISA: []string{"AVX"},
}, nil
case operand.IsM32(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VRCPSS",
Operands: []operand.Op{mx, x, x1},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x1},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VRCPSS: bad operands")
}
// VROUNDPD: Round Packed Double Precision Floating-Point Values.
//
// Forms:
//
// VROUNDPD imm8 xmm xmm
// VROUNDPD imm8 m128 xmm
// VROUNDPD imm8 ymm ymm
// VROUNDPD imm8 m256 ymm
func VROUNDPD(i, mxy, xy operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(i) && operand.IsXMM(mxy) && operand.IsXMM(xy):
return &intrep.Instruction{
Opcode: "VROUNDPD",
Operands: []operand.Op{i, mxy, xy},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsIMM8(i) && operand.IsM128(mxy) && operand.IsXMM(xy):
return &intrep.Instruction{
Opcode: "VROUNDPD",
Operands: []operand.Op{i, mxy, xy},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsIMM8(i) && operand.IsYMM(mxy) && operand.IsYMM(xy):
return &intrep.Instruction{
Opcode: "VROUNDPD",
Operands: []operand.Op{i, mxy, xy},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsIMM8(i) && operand.IsM256(mxy) && operand.IsYMM(xy):
return &intrep.Instruction{
Opcode: "VROUNDPD",
Operands: []operand.Op{i, mxy, xy},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VROUNDPD: bad operands")
}
// VROUNDPS: Round Packed Single Precision Floating-Point Values.
//
// Forms:
//
// VROUNDPS imm8 xmm xmm
// VROUNDPS imm8 m128 xmm
// VROUNDPS imm8 ymm ymm
// VROUNDPS imm8 m256 ymm
func VROUNDPS(i, mxy, xy operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(i) && operand.IsXMM(mxy) && operand.IsXMM(xy):
return &intrep.Instruction{
Opcode: "VROUNDPS",
Operands: []operand.Op{i, mxy, xy},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsIMM8(i) && operand.IsM128(mxy) && operand.IsXMM(xy):
return &intrep.Instruction{
Opcode: "VROUNDPS",
Operands: []operand.Op{i, mxy, xy},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsIMM8(i) && operand.IsYMM(mxy) && operand.IsYMM(xy):
return &intrep.Instruction{
Opcode: "VROUNDPS",
Operands: []operand.Op{i, mxy, xy},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsIMM8(i) && operand.IsM256(mxy) && operand.IsYMM(xy):
return &intrep.Instruction{
Opcode: "VROUNDPS",
Operands: []operand.Op{i, mxy, xy},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VROUNDPS: bad operands")
}
// VROUNDSD: Round Scalar Double Precision Floating-Point Values.
//
// Forms:
//
// VROUNDSD imm8 xmm xmm xmm
// VROUNDSD imm8 m64 xmm xmm
func VROUNDSD(i, mx, x, x1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(i) && operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VROUNDSD",
Operands: []operand.Op{i, mx, x, x1},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x1},
ISA: []string{"AVX"},
}, nil
case operand.IsIMM8(i) && operand.IsM64(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VROUNDSD",
Operands: []operand.Op{i, mx, x, x1},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x1},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VROUNDSD: bad operands")
}
// VROUNDSS: Round Scalar Single Precision Floating-Point Values.
//
// Forms:
//
// VROUNDSS imm8 xmm xmm xmm
// VROUNDSS imm8 m32 xmm xmm
func VROUNDSS(i, mx, x, x1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(i) && operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VROUNDSS",
Operands: []operand.Op{i, mx, x, x1},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x1},
ISA: []string{"AVX"},
}, nil
case operand.IsIMM8(i) && operand.IsM32(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VROUNDSS",
Operands: []operand.Op{i, mx, x, x1},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x1},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VROUNDSS: bad operands")
}
// VRSQRTPS: Compute Reciprocals of Square Roots of Packed Single-Precision Floating-Point Values.
//
// Forms:
//
// VRSQRTPS xmm xmm
// VRSQRTPS m128 xmm
// VRSQRTPS ymm ymm
// VRSQRTPS m256 ymm
func VRSQRTPS(mxy, xy operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy):
return &intrep.Instruction{
Opcode: "VRSQRTPS",
Operands: []operand.Op{mxy, xy},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy):
return &intrep.Instruction{
Opcode: "VRSQRTPS",
Operands: []operand.Op{mxy, xy},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy):
return &intrep.Instruction{
Opcode: "VRSQRTPS",
Operands: []operand.Op{mxy, xy},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy):
return &intrep.Instruction{
Opcode: "VRSQRTPS",
Operands: []operand.Op{mxy, xy},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VRSQRTPS: bad operands")
}
// VRSQRTSS: Compute Reciprocal of Square Root of Scalar Single-Precision Floating-Point Value.
//
// Forms:
//
// VRSQRTSS xmm xmm xmm
// VRSQRTSS m32 xmm xmm
func VRSQRTSS(mx, x, x1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VRSQRTSS",
Operands: []operand.Op{mx, x, x1},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x1},
ISA: []string{"AVX"},
}, nil
case operand.IsM32(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VRSQRTSS",
Operands: []operand.Op{mx, x, x1},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x1},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VRSQRTSS: bad operands")
}
// VSHUFPD: Shuffle Packed Double-Precision Floating-Point Values.
//
// Forms:
//
// VSHUFPD imm8 xmm xmm xmm
// VSHUFPD imm8 m128 xmm xmm
// VSHUFPD imm8 ymm ymm ymm
// VSHUFPD imm8 m256 ymm ymm
func VSHUFPD(i, mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(i) && operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VSHUFPD",
Operands: []operand.Op{i, mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsIMM8(i) && operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VSHUFPD",
Operands: []operand.Op{i, mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsIMM8(i) && operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VSHUFPD",
Operands: []operand.Op{i, mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsIMM8(i) && operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VSHUFPD",
Operands: []operand.Op{i, mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VSHUFPD: bad operands")
}
// VSHUFPS: Shuffle Packed Single-Precision Floating-Point Values.
//
// Forms:
//
// VSHUFPS imm8 xmm xmm xmm
// VSHUFPS imm8 m128 xmm xmm
// VSHUFPS imm8 ymm ymm ymm
// VSHUFPS imm8 m256 ymm ymm
func VSHUFPS(i, mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(i) && operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VSHUFPS",
Operands: []operand.Op{i, mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsIMM8(i) && operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VSHUFPS",
Operands: []operand.Op{i, mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsIMM8(i) && operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VSHUFPS",
Operands: []operand.Op{i, mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsIMM8(i) && operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VSHUFPS",
Operands: []operand.Op{i, mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VSHUFPS: bad operands")
}
// VSQRTPD: Compute Square Roots of Packed Double-Precision Floating-Point Values.
//
// Forms:
//
// VSQRTPD xmm xmm
// VSQRTPD m128 xmm
// VSQRTPD ymm ymm
// VSQRTPD m256 ymm
func VSQRTPD(mxy, xy operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy):
return &intrep.Instruction{
Opcode: "VSQRTPD",
Operands: []operand.Op{mxy, xy},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy):
return &intrep.Instruction{
Opcode: "VSQRTPD",
Operands: []operand.Op{mxy, xy},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy):
return &intrep.Instruction{
Opcode: "VSQRTPD",
Operands: []operand.Op{mxy, xy},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy):
return &intrep.Instruction{
Opcode: "VSQRTPD",
Operands: []operand.Op{mxy, xy},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VSQRTPD: bad operands")
}
// VSQRTPS: Compute Square Roots of Packed Single-Precision Floating-Point Values.
//
// Forms:
//
// VSQRTPS xmm xmm
// VSQRTPS m128 xmm
// VSQRTPS ymm ymm
// VSQRTPS m256 ymm
func VSQRTPS(mxy, xy operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy):
return &intrep.Instruction{
Opcode: "VSQRTPS",
Operands: []operand.Op{mxy, xy},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy):
return &intrep.Instruction{
Opcode: "VSQRTPS",
Operands: []operand.Op{mxy, xy},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy):
return &intrep.Instruction{
Opcode: "VSQRTPS",
Operands: []operand.Op{mxy, xy},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy):
return &intrep.Instruction{
Opcode: "VSQRTPS",
Operands: []operand.Op{mxy, xy},
Inputs: []operand.Op{mxy},
Outputs: []operand.Op{xy},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VSQRTPS: bad operands")
}
// VSQRTSD: Compute Square Root of Scalar Double-Precision Floating-Point Value.
//
// Forms:
//
// VSQRTSD xmm xmm xmm
// VSQRTSD m64 xmm xmm
func VSQRTSD(mx, x, x1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VSQRTSD",
Operands: []operand.Op{mx, x, x1},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x1},
ISA: []string{"AVX"},
}, nil
case operand.IsM64(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VSQRTSD",
Operands: []operand.Op{mx, x, x1},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x1},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VSQRTSD: bad operands")
}
// VSQRTSS: Compute Square Root of Scalar Single-Precision Floating-Point Value.
//
// Forms:
//
// VSQRTSS xmm xmm xmm
// VSQRTSS m32 xmm xmm
func VSQRTSS(mx, x, x1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VSQRTSS",
Operands: []operand.Op{mx, x, x1},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x1},
ISA: []string{"AVX"},
}, nil
case operand.IsM32(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VSQRTSS",
Operands: []operand.Op{mx, x, x1},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x1},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VSQRTSS: bad operands")
}
// VSTMXCSR: Store MXCSR Register State.
//
// Forms:
//
// VSTMXCSR m32
func VSTMXCSR(m operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsM32(m):
return &intrep.Instruction{
Opcode: "VSTMXCSR",
Operands: []operand.Op{m},
Inputs: []operand.Op{},
Outputs: []operand.Op{m},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VSTMXCSR: bad operands")
}
// VSUBPD: Subtract Packed Double-Precision Floating-Point Values.
//
// Forms:
//
// VSUBPD xmm xmm xmm
// VSUBPD m128 xmm xmm
// VSUBPD ymm ymm ymm
// VSUBPD m256 ymm ymm
func VSUBPD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VSUBPD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VSUBPD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VSUBPD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VSUBPD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VSUBPD: bad operands")
}
// VSUBPS: Subtract Packed Single-Precision Floating-Point Values.
//
// Forms:
//
// VSUBPS xmm xmm xmm
// VSUBPS m128 xmm xmm
// VSUBPS ymm ymm ymm
// VSUBPS m256 ymm ymm
func VSUBPS(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VSUBPS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VSUBPS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VSUBPS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VSUBPS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VSUBPS: bad operands")
}
// VSUBSD: Subtract Scalar Double-Precision Floating-Point Values.
//
// Forms:
//
// VSUBSD xmm xmm xmm
// VSUBSD m64 xmm xmm
func VSUBSD(mx, x, x1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VSUBSD",
Operands: []operand.Op{mx, x, x1},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x1},
ISA: []string{"AVX"},
}, nil
case operand.IsM64(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VSUBSD",
Operands: []operand.Op{mx, x, x1},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x1},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VSUBSD: bad operands")
}
// VSUBSS: Subtract Scalar Single-Precision Floating-Point Values.
//
// Forms:
//
// VSUBSS xmm xmm xmm
// VSUBSS m32 xmm xmm
func VSUBSS(mx, x, x1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VSUBSS",
Operands: []operand.Op{mx, x, x1},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x1},
ISA: []string{"AVX"},
}, nil
case operand.IsM32(mx) && operand.IsXMM(x) && operand.IsXMM(x1):
return &intrep.Instruction{
Opcode: "VSUBSS",
Operands: []operand.Op{mx, x, x1},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x1},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VSUBSS: bad operands")
}
// VTESTPD: Packed Double-Precision Floating-Point Bit Test.
//
// Forms:
//
// VTESTPD xmm xmm
// VTESTPD m128 xmm
// VTESTPD ymm ymm
// VTESTPD m256 ymm
func VTESTPD(mxy, xy operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy):
return &intrep.Instruction{
Opcode: "VTESTPD",
Operands: []operand.Op{mxy, xy},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy):
return &intrep.Instruction{
Opcode: "VTESTPD",
Operands: []operand.Op{mxy, xy},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy):
return &intrep.Instruction{
Opcode: "VTESTPD",
Operands: []operand.Op{mxy, xy},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{},
ISA: []string{"AVX"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy):
return &intrep.Instruction{
Opcode: "VTESTPD",
Operands: []operand.Op{mxy, xy},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VTESTPD: bad operands")
}
// VTESTPS: Packed Single-Precision Floating-Point Bit Test.
//
// Forms:
//
// VTESTPS xmm xmm
// VTESTPS m128 xmm
// VTESTPS ymm ymm
// VTESTPS m256 ymm
func VTESTPS(mxy, xy operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy):
return &intrep.Instruction{
Opcode: "VTESTPS",
Operands: []operand.Op{mxy, xy},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy):
return &intrep.Instruction{
Opcode: "VTESTPS",
Operands: []operand.Op{mxy, xy},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy):
return &intrep.Instruction{
Opcode: "VTESTPS",
Operands: []operand.Op{mxy, xy},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{},
ISA: []string{"AVX"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy):
return &intrep.Instruction{
Opcode: "VTESTPS",
Operands: []operand.Op{mxy, xy},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VTESTPS: bad operands")
}
// VUCOMISD: Unordered Compare Scalar Double-Precision Floating-Point Values and Set EFLAGS.
//
// Forms:
//
// VUCOMISD xmm xmm
// VUCOMISD m64 xmm
func VUCOMISD(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "VUCOMISD",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{},
ISA: []string{"AVX"},
}, nil
case operand.IsM64(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "VUCOMISD",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VUCOMISD: bad operands")
}
// VUCOMISS: Unordered Compare Scalar Single-Precision Floating-Point Values and Set EFLAGS.
//
// Forms:
//
// VUCOMISS xmm xmm
// VUCOMISS m32 xmm
func VUCOMISS(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "VUCOMISS",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{},
ISA: []string{"AVX"},
}, nil
case operand.IsM32(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "VUCOMISS",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VUCOMISS: bad operands")
}
// VUNPCKHPD: Unpack and Interleave High Packed Double-Precision Floating-Point Values.
//
// Forms:
//
// VUNPCKHPD xmm xmm xmm
// VUNPCKHPD m128 xmm xmm
// VUNPCKHPD ymm ymm ymm
// VUNPCKHPD m256 ymm ymm
func VUNPCKHPD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VUNPCKHPD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VUNPCKHPD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VUNPCKHPD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VUNPCKHPD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VUNPCKHPD: bad operands")
}
// VUNPCKHPS: Unpack and Interleave High Packed Single-Precision Floating-Point Values.
//
// Forms:
//
// VUNPCKHPS xmm xmm xmm
// VUNPCKHPS m128 xmm xmm
// VUNPCKHPS ymm ymm ymm
// VUNPCKHPS m256 ymm ymm
func VUNPCKHPS(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VUNPCKHPS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VUNPCKHPS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VUNPCKHPS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VUNPCKHPS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VUNPCKHPS: bad operands")
}
// VUNPCKLPD: Unpack and Interleave Low Packed Double-Precision Floating-Point Values.
//
// Forms:
//
// VUNPCKLPD xmm xmm xmm
// VUNPCKLPD m128 xmm xmm
// VUNPCKLPD ymm ymm ymm
// VUNPCKLPD m256 ymm ymm
func VUNPCKLPD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VUNPCKLPD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VUNPCKLPD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VUNPCKLPD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VUNPCKLPD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VUNPCKLPD: bad operands")
}
// VUNPCKLPS: Unpack and Interleave Low Packed Single-Precision Floating-Point Values.
//
// Forms:
//
// VUNPCKLPS xmm xmm xmm
// VUNPCKLPS m128 xmm xmm
// VUNPCKLPS ymm ymm ymm
// VUNPCKLPS m256 ymm ymm
func VUNPCKLPS(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VUNPCKLPS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VUNPCKLPS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VUNPCKLPS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VUNPCKLPS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VUNPCKLPS: bad operands")
}
// VXORPD: Bitwise Logical XOR for Double-Precision Floating-Point Values.
//
// Forms:
//
// VXORPD xmm xmm xmm
// VXORPD m128 xmm xmm
// VXORPD ymm ymm ymm
// VXORPD m256 ymm ymm
func VXORPD(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VXORPD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
CancellingInputs: true,
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VXORPD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VXORPD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
CancellingInputs: true,
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VXORPD",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VXORPD: bad operands")
}
// VXORPS: Bitwise Logical XOR for Single-Precision Floating-Point Values.
//
// Forms:
//
// VXORPS xmm xmm xmm
// VXORPS m128 xmm xmm
// VXORPS ymm ymm ymm
// VXORPS m256 ymm ymm
func VXORPS(mxy, xy, xy1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VXORPS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
CancellingInputs: true,
}, nil
case operand.IsM128(mxy) && operand.IsXMM(xy) && operand.IsXMM(xy1):
return &intrep.Instruction{
Opcode: "VXORPS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
case operand.IsYMM(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VXORPS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
CancellingInputs: true,
}, nil
case operand.IsM256(mxy) && operand.IsYMM(xy) && operand.IsYMM(xy1):
return &intrep.Instruction{
Opcode: "VXORPS",
Operands: []operand.Op{mxy, xy, xy1},
Inputs: []operand.Op{mxy, xy},
Outputs: []operand.Op{xy1},
ISA: []string{"AVX"},
}, nil
}
return nil, errors.New("VXORPS: bad operands")
}
// VZEROALL: Zero All YMM Registers.
//
// Forms:
//
// VZEROALL
func VZEROALL() (*intrep.Instruction, error) {
return &intrep.Instruction{
Opcode: "VZEROALL",
Operands: nil,
Inputs: []operand.Op{},
Outputs: []operand.Op{},
ISA: []string{"AVX"},
}, nil
}
// VZEROUPPER: Zero Upper Bits of YMM Registers.
//
// Forms:
//
// VZEROUPPER
func VZEROUPPER() (*intrep.Instruction, error) {
return &intrep.Instruction{
Opcode: "VZEROUPPER",
Operands: nil,
Inputs: []operand.Op{},
Outputs: []operand.Op{},
ISA: []string{"AVX"},
}, nil
}
// XADDB: Exchange and Add.
//
// Forms:
//
// XADDB r8 r8
// XADDB r8 m8
func XADDB(r, mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR8(r) && operand.IsR8(mr):
return &intrep.Instruction{
Opcode: "XADDB",
Operands: []operand.Op{r, mr},
Inputs: []operand.Op{r, mr},
Outputs: []operand.Op{r, mr},
}, nil
case operand.IsR8(r) && operand.IsM8(mr):
return &intrep.Instruction{
Opcode: "XADDB",
Operands: []operand.Op{r, mr},
Inputs: []operand.Op{r, mr},
Outputs: []operand.Op{r, mr},
}, nil
}
return nil, errors.New("XADDB: bad operands")
}
// XADDL: Exchange and Add.
//
// Forms:
//
// XADDL r32 r32
// XADDL r32 m32
func XADDL(r, mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR32(r) && operand.IsR32(mr):
return &intrep.Instruction{
Opcode: "XADDL",
Operands: []operand.Op{r, mr},
Inputs: []operand.Op{r, mr},
Outputs: []operand.Op{r, mr},
}, nil
case operand.IsR32(r) && operand.IsM32(mr):
return &intrep.Instruction{
Opcode: "XADDL",
Operands: []operand.Op{r, mr},
Inputs: []operand.Op{r, mr},
Outputs: []operand.Op{r, mr},
}, nil
}
return nil, errors.New("XADDL: bad operands")
}
// XADDQ: Exchange and Add.
//
// Forms:
//
// XADDQ r64 r64
// XADDQ r64 m64
func XADDQ(r, mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR64(r) && operand.IsR64(mr):
return &intrep.Instruction{
Opcode: "XADDQ",
Operands: []operand.Op{r, mr},
Inputs: []operand.Op{r, mr},
Outputs: []operand.Op{r, mr},
}, nil
case operand.IsR64(r) && operand.IsM64(mr):
return &intrep.Instruction{
Opcode: "XADDQ",
Operands: []operand.Op{r, mr},
Inputs: []operand.Op{r, mr},
Outputs: []operand.Op{r, mr},
}, nil
}
return nil, errors.New("XADDQ: bad operands")
}
// XADDW: Exchange and Add.
//
// Forms:
//
// XADDW r16 r16
// XADDW r16 m16
func XADDW(r, mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR16(r) && operand.IsR16(mr):
return &intrep.Instruction{
Opcode: "XADDW",
Operands: []operand.Op{r, mr},
Inputs: []operand.Op{r, mr},
Outputs: []operand.Op{r, mr},
}, nil
case operand.IsR16(r) && operand.IsM16(mr):
return &intrep.Instruction{
Opcode: "XADDW",
Operands: []operand.Op{r, mr},
Inputs: []operand.Op{r, mr},
Outputs: []operand.Op{r, mr},
}, nil
}
return nil, errors.New("XADDW: bad operands")
}
// XCHGB: Exchange Register/Memory with Register.
//
// Forms:
//
// XCHGB r8 r8
// XCHGB m8 r8
// XCHGB r8 m8
func XCHGB(mr, mr1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR8(mr) && operand.IsR8(mr1):
return &intrep.Instruction{
Opcode: "XCHGB",
Operands: []operand.Op{mr, mr1},
Inputs: []operand.Op{mr, mr1},
Outputs: []operand.Op{mr, mr1},
}, nil
case operand.IsM8(mr) && operand.IsR8(mr1):
return &intrep.Instruction{
Opcode: "XCHGB",
Operands: []operand.Op{mr, mr1},
Inputs: []operand.Op{mr, mr1},
Outputs: []operand.Op{mr, mr1},
}, nil
case operand.IsR8(mr) && operand.IsM8(mr1):
return &intrep.Instruction{
Opcode: "XCHGB",
Operands: []operand.Op{mr, mr1},
Inputs: []operand.Op{mr, mr1},
Outputs: []operand.Op{mr, mr1},
}, nil
}
return nil, errors.New("XCHGB: bad operands")
}
// XCHGL: Exchange Register/Memory with Register.
//
// Forms:
//
// XCHGL r32 eax
// XCHGL eax r32
// XCHGL r32 r32
// XCHGL m32 r32
// XCHGL r32 m32
func XCHGL(emr, emr1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR32(emr) && operand.IsEAX(emr1):
return &intrep.Instruction{
Opcode: "XCHGL",
Operands: []operand.Op{emr, emr1},
Inputs: []operand.Op{emr, emr1},
Outputs: []operand.Op{emr, emr1},
}, nil
case operand.IsEAX(emr) && operand.IsR32(emr1):
return &intrep.Instruction{
Opcode: "XCHGL",
Operands: []operand.Op{emr, emr1},
Inputs: []operand.Op{emr, emr1},
Outputs: []operand.Op{emr, emr1},
}, nil
case operand.IsR32(emr) && operand.IsR32(emr1):
return &intrep.Instruction{
Opcode: "XCHGL",
Operands: []operand.Op{emr, emr1},
Inputs: []operand.Op{emr, emr1},
Outputs: []operand.Op{emr, emr1},
}, nil
case operand.IsM32(emr) && operand.IsR32(emr1):
return &intrep.Instruction{
Opcode: "XCHGL",
Operands: []operand.Op{emr, emr1},
Inputs: []operand.Op{emr, emr1},
Outputs: []operand.Op{emr, emr1},
}, nil
case operand.IsR32(emr) && operand.IsM32(emr1):
return &intrep.Instruction{
Opcode: "XCHGL",
Operands: []operand.Op{emr, emr1},
Inputs: []operand.Op{emr, emr1},
Outputs: []operand.Op{emr, emr1},
}, nil
}
return nil, errors.New("XCHGL: bad operands")
}
// XCHGQ: Exchange Register/Memory with Register.
//
// Forms:
//
// XCHGQ r64 rax
// XCHGQ rax r64
// XCHGQ r64 r64
// XCHGQ m64 r64
// XCHGQ r64 m64
func XCHGQ(mr, mr1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR64(mr) && operand.IsRAX(mr1):
return &intrep.Instruction{
Opcode: "XCHGQ",
Operands: []operand.Op{mr, mr1},
Inputs: []operand.Op{mr, mr1},
Outputs: []operand.Op{mr, mr1},
}, nil
case operand.IsRAX(mr) && operand.IsR64(mr1):
return &intrep.Instruction{
Opcode: "XCHGQ",
Operands: []operand.Op{mr, mr1},
Inputs: []operand.Op{mr, mr1},
Outputs: []operand.Op{mr, mr1},
}, nil
case operand.IsR64(mr) && operand.IsR64(mr1):
return &intrep.Instruction{
Opcode: "XCHGQ",
Operands: []operand.Op{mr, mr1},
Inputs: []operand.Op{mr, mr1},
Outputs: []operand.Op{mr, mr1},
}, nil
case operand.IsM64(mr) && operand.IsR64(mr1):
return &intrep.Instruction{
Opcode: "XCHGQ",
Operands: []operand.Op{mr, mr1},
Inputs: []operand.Op{mr, mr1},
Outputs: []operand.Op{mr, mr1},
}, nil
case operand.IsR64(mr) && operand.IsM64(mr1):
return &intrep.Instruction{
Opcode: "XCHGQ",
Operands: []operand.Op{mr, mr1},
Inputs: []operand.Op{mr, mr1},
Outputs: []operand.Op{mr, mr1},
}, nil
}
return nil, errors.New("XCHGQ: bad operands")
}
// XCHGW: Exchange Register/Memory with Register.
//
// Forms:
//
// XCHGW r16 ax
// XCHGW ax r16
// XCHGW r16 r16
// XCHGW m16 r16
// XCHGW r16 m16
func XCHGW(amr, amr1 operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsR16(amr) && operand.IsAX(amr1):
return &intrep.Instruction{
Opcode: "XCHGW",
Operands: []operand.Op{amr, amr1},
Inputs: []operand.Op{amr, amr1},
Outputs: []operand.Op{amr, amr1},
}, nil
case operand.IsAX(amr) && operand.IsR16(amr1):
return &intrep.Instruction{
Opcode: "XCHGW",
Operands: []operand.Op{amr, amr1},
Inputs: []operand.Op{amr, amr1},
Outputs: []operand.Op{amr, amr1},
}, nil
case operand.IsR16(amr) && operand.IsR16(amr1):
return &intrep.Instruction{
Opcode: "XCHGW",
Operands: []operand.Op{amr, amr1},
Inputs: []operand.Op{amr, amr1},
Outputs: []operand.Op{amr, amr1},
}, nil
case operand.IsM16(amr) && operand.IsR16(amr1):
return &intrep.Instruction{
Opcode: "XCHGW",
Operands: []operand.Op{amr, amr1},
Inputs: []operand.Op{amr, amr1},
Outputs: []operand.Op{amr, amr1},
}, nil
case operand.IsR16(amr) && operand.IsM16(amr1):
return &intrep.Instruction{
Opcode: "XCHGW",
Operands: []operand.Op{amr, amr1},
Inputs: []operand.Op{amr, amr1},
Outputs: []operand.Op{amr, amr1},
}, nil
}
return nil, errors.New("XCHGW: bad operands")
}
// XGETBV: Get Value of Extended Control Register.
//
// Forms:
//
// XGETBV
func XGETBV() (*intrep.Instruction, error) {
return &intrep.Instruction{
Opcode: "XGETBV",
Operands: nil,
Inputs: []operand.Op{reg.ECX},
Outputs: []operand.Op{reg.EAX, reg.EDX},
}, nil
}
// XLAT: Table Look-up Translation.
//
// Forms:
//
// XLAT
func XLAT() (*intrep.Instruction, error) {
return &intrep.Instruction{
Opcode: "XLAT",
Operands: nil,
Inputs: []operand.Op{reg.AL, reg.EBX},
Outputs: []operand.Op{reg.AL},
}, nil
}
// XORB: Logical Exclusive OR.
//
// Forms:
//
// XORB imm8 al
// XORB imm8 r8
// XORB r8 r8
// XORB m8 r8
// XORB imm8 m8
// XORB r8 m8
func XORB(imr, amr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM8(imr) && operand.IsAL(amr):
return &intrep.Instruction{
Opcode: "XORB",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{amr},
Outputs: []operand.Op{amr},
}, nil
case operand.IsIMM8(imr) && operand.IsR8(amr):
return &intrep.Instruction{
Opcode: "XORB",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{amr},
Outputs: []operand.Op{amr},
}, nil
case operand.IsR8(imr) && operand.IsR8(amr):
return &intrep.Instruction{
Opcode: "XORB",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{imr, amr},
Outputs: []operand.Op{amr},
CancellingInputs: true,
}, nil
case operand.IsM8(imr) && operand.IsR8(amr):
return &intrep.Instruction{
Opcode: "XORB",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{imr, amr},
Outputs: []operand.Op{amr},
}, nil
case operand.IsIMM8(imr) && operand.IsM8(amr):
return &intrep.Instruction{
Opcode: "XORB",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{amr},
Outputs: []operand.Op{amr},
}, nil
case operand.IsR8(imr) && operand.IsM8(amr):
return &intrep.Instruction{
Opcode: "XORB",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{imr, amr},
Outputs: []operand.Op{amr},
}, nil
}
return nil, errors.New("XORB: bad operands")
}
// XORL: Logical Exclusive OR.
//
// Forms:
//
// XORL imm32 eax
// XORL imm8 r32
// XORL imm32 r32
// XORL r32 r32
// XORL m32 r32
// XORL imm8 m32
// XORL imm32 m32
// XORL r32 m32
func XORL(imr, emr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM32(imr) && operand.IsEAX(emr):
return &intrep.Instruction{
Opcode: "XORL",
Operands: []operand.Op{imr, emr},
Inputs: []operand.Op{emr},
Outputs: []operand.Op{emr},
}, nil
case operand.IsIMM8(imr) && operand.IsR32(emr):
return &intrep.Instruction{
Opcode: "XORL",
Operands: []operand.Op{imr, emr},
Inputs: []operand.Op{emr},
Outputs: []operand.Op{emr},
}, nil
case operand.IsIMM32(imr) && operand.IsR32(emr):
return &intrep.Instruction{
Opcode: "XORL",
Operands: []operand.Op{imr, emr},
Inputs: []operand.Op{emr},
Outputs: []operand.Op{emr},
}, nil
case operand.IsR32(imr) && operand.IsR32(emr):
return &intrep.Instruction{
Opcode: "XORL",
Operands: []operand.Op{imr, emr},
Inputs: []operand.Op{imr, emr},
Outputs: []operand.Op{emr},
CancellingInputs: true,
}, nil
case operand.IsM32(imr) && operand.IsR32(emr):
return &intrep.Instruction{
Opcode: "XORL",
Operands: []operand.Op{imr, emr},
Inputs: []operand.Op{imr, emr},
Outputs: []operand.Op{emr},
}, nil
case operand.IsIMM8(imr) && operand.IsM32(emr):
return &intrep.Instruction{
Opcode: "XORL",
Operands: []operand.Op{imr, emr},
Inputs: []operand.Op{emr},
Outputs: []operand.Op{emr},
}, nil
case operand.IsIMM32(imr) && operand.IsM32(emr):
return &intrep.Instruction{
Opcode: "XORL",
Operands: []operand.Op{imr, emr},
Inputs: []operand.Op{emr},
Outputs: []operand.Op{emr},
}, nil
case operand.IsR32(imr) && operand.IsM32(emr):
return &intrep.Instruction{
Opcode: "XORL",
Operands: []operand.Op{imr, emr},
Inputs: []operand.Op{imr, emr},
Outputs: []operand.Op{emr},
}, nil
}
return nil, errors.New("XORL: bad operands")
}
// XORPD: Bitwise Logical XOR for Double-Precision Floating-Point Values.
//
// Forms:
//
// XORPD xmm xmm
// XORPD m128 xmm
func XORPD(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "XORPD",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
CancellingInputs: true,
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "XORPD",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE2"},
}, nil
}
return nil, errors.New("XORPD: bad operands")
}
// XORPS: Bitwise Logical XOR for Single-Precision Floating-Point Values.
//
// Forms:
//
// XORPS xmm xmm
// XORPS m128 xmm
func XORPS(mx, x operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsXMM(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "XORPS",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE"},
CancellingInputs: true,
}, nil
case operand.IsM128(mx) && operand.IsXMM(x):
return &intrep.Instruction{
Opcode: "XORPS",
Operands: []operand.Op{mx, x},
Inputs: []operand.Op{mx, x},
Outputs: []operand.Op{x},
ISA: []string{"SSE"},
}, nil
}
return nil, errors.New("XORPS: bad operands")
}
// XORQ: Logical Exclusive OR.
//
// Forms:
//
// XORQ imm32 rax
// XORQ imm8 r64
// XORQ imm32 r64
// XORQ r64 r64
// XORQ m64 r64
// XORQ imm8 m64
// XORQ imm32 m64
// XORQ r64 m64
func XORQ(imr, mr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM32(imr) && operand.IsRAX(mr):
return &intrep.Instruction{
Opcode: "XORQ",
Operands: []operand.Op{imr, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsIMM8(imr) && operand.IsR64(mr):
return &intrep.Instruction{
Opcode: "XORQ",
Operands: []operand.Op{imr, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsIMM32(imr) && operand.IsR64(mr):
return &intrep.Instruction{
Opcode: "XORQ",
Operands: []operand.Op{imr, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsR64(imr) && operand.IsR64(mr):
return &intrep.Instruction{
Opcode: "XORQ",
Operands: []operand.Op{imr, mr},
Inputs: []operand.Op{imr, mr},
Outputs: []operand.Op{mr},
CancellingInputs: true,
}, nil
case operand.IsM64(imr) && operand.IsR64(mr):
return &intrep.Instruction{
Opcode: "XORQ",
Operands: []operand.Op{imr, mr},
Inputs: []operand.Op{imr, mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsIMM8(imr) && operand.IsM64(mr):
return &intrep.Instruction{
Opcode: "XORQ",
Operands: []operand.Op{imr, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsIMM32(imr) && operand.IsM64(mr):
return &intrep.Instruction{
Opcode: "XORQ",
Operands: []operand.Op{imr, mr},
Inputs: []operand.Op{mr},
Outputs: []operand.Op{mr},
}, nil
case operand.IsR64(imr) && operand.IsM64(mr):
return &intrep.Instruction{
Opcode: "XORQ",
Operands: []operand.Op{imr, mr},
Inputs: []operand.Op{imr, mr},
Outputs: []operand.Op{mr},
}, nil
}
return nil, errors.New("XORQ: bad operands")
}
// XORW: Logical Exclusive OR.
//
// Forms:
//
// XORW imm16 ax
// XORW imm8 r16
// XORW imm16 r16
// XORW r16 r16
// XORW m16 r16
// XORW imm8 m16
// XORW imm16 m16
// XORW r16 m16
func XORW(imr, amr operand.Op) (*intrep.Instruction, error) {
switch {
case operand.IsIMM16(imr) && operand.IsAX(amr):
return &intrep.Instruction{
Opcode: "XORW",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{amr},
Outputs: []operand.Op{amr},
}, nil
case operand.IsIMM8(imr) && operand.IsR16(amr):
return &intrep.Instruction{
Opcode: "XORW",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{amr},
Outputs: []operand.Op{amr},
}, nil
case operand.IsIMM16(imr) && operand.IsR16(amr):
return &intrep.Instruction{
Opcode: "XORW",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{amr},
Outputs: []operand.Op{amr},
}, nil
case operand.IsR16(imr) && operand.IsR16(amr):
return &intrep.Instruction{
Opcode: "XORW",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{imr, amr},
Outputs: []operand.Op{amr},
CancellingInputs: true,
}, nil
case operand.IsM16(imr) && operand.IsR16(amr):
return &intrep.Instruction{
Opcode: "XORW",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{imr, amr},
Outputs: []operand.Op{amr},
}, nil
case operand.IsIMM8(imr) && operand.IsM16(amr):
return &intrep.Instruction{
Opcode: "XORW",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{amr},
Outputs: []operand.Op{amr},
}, nil
case operand.IsIMM16(imr) && operand.IsM16(amr):
return &intrep.Instruction{
Opcode: "XORW",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{amr},
Outputs: []operand.Op{amr},
}, nil
case operand.IsR16(imr) && operand.IsM16(amr):
return &intrep.Instruction{
Opcode: "XORW",
Operands: []operand.Op{imr, amr},
Inputs: []operand.Op{imr, amr},
Outputs: []operand.Op{amr},
}, nil
}
return nil, errors.New("XORW: bad operands")
}