//===-- X86InstrXOP.td - XOP Instruction Set ---------------*- tablegen -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// This file describes XOP (eXtended OPerations)
//
//===----------------------------------------------------------------------===//

multiclass xop2op<bits<8> opc, string OpcodeStr, Intrinsic Int> {
  def rr : IXOP<opc, MRMSrcReg, (outs VR128:$dst), (ins VR128:$src),
           !strconcat(OpcodeStr, "\t{$src, $dst|$dst, $src}"),
           [(set VR128:$dst, (Int VR128:$src))]>, XOP, Sched<[SchedWriteVecALU.XMM]>;
  def rm : IXOP<opc, MRMSrcMem, (outs VR128:$dst), (ins i128mem:$src),
           !strconcat(OpcodeStr, "\t{$src, $dst|$dst, $src}"),
           [(set VR128:$dst, (Int (load addr:$src)))]>, XOP,
           Sched<[SchedWriteVecALU.XMM.Folded, SchedWriteVecALU.XMM.ReadAfterFold]>;
}

let ExeDomain = SSEPackedInt in {
  defm VPHSUBWD  : xop2op<0xE2, "vphsubwd", int_x86_xop_vphsubwd>;
  defm VPHSUBDQ  : xop2op<0xE3, "vphsubdq", int_x86_xop_vphsubdq>;
  defm VPHSUBBW  : xop2op<0xE1, "vphsubbw", int_x86_xop_vphsubbw>;
  defm VPHADDWQ  : xop2op<0xC7, "vphaddwq", int_x86_xop_vphaddwq>;
  defm VPHADDWD  : xop2op<0xC6, "vphaddwd", int_x86_xop_vphaddwd>;
  defm VPHADDUWQ : xop2op<0xD7, "vphadduwq", int_x86_xop_vphadduwq>;
  defm VPHADDUWD : xop2op<0xD6, "vphadduwd", int_x86_xop_vphadduwd>;
  defm VPHADDUDQ : xop2op<0xDB, "vphaddudq", int_x86_xop_vphaddudq>;
  defm VPHADDUBW : xop2op<0xD1, "vphaddubw", int_x86_xop_vphaddubw>;
  defm VPHADDUBQ : xop2op<0xD3, "vphaddubq", int_x86_xop_vphaddubq>;
  defm VPHADDUBD : xop2op<0xD2, "vphaddubd", int_x86_xop_vphaddubd>;
  defm VPHADDDQ  : xop2op<0xCB, "vphadddq", int_x86_xop_vphadddq>;
  defm VPHADDBW  : xop2op<0xC1, "vphaddbw", int_x86_xop_vphaddbw>;
  defm VPHADDBQ  : xop2op<0xC3, "vphaddbq", int_x86_xop_vphaddbq>;
  defm VPHADDBD  : xop2op<0xC2, "vphaddbd", int_x86_xop_vphaddbd>;
}

// Scalar load 2 addr operand instructions
multiclass xop2opsld<bits<8> opc, string OpcodeStr, Intrinsic Int,
                     Operand memop, PatFrags mem_frags,
                     X86FoldableSchedWrite sched> {
  def rr : IXOP<opc, MRMSrcReg, (outs VR128:$dst), (ins VR128:$src),
           !strconcat(OpcodeStr, "\t{$src, $dst|$dst, $src}"),
           [(set VR128:$dst, (Int VR128:$src))]>, XOP, Sched<[sched]>;
  def rm : IXOP<opc, MRMSrcMem, (outs VR128:$dst), (ins memop:$src),
           !strconcat(OpcodeStr, "\t{$src, $dst|$dst, $src}"),
           [(set VR128:$dst, (Int (mem_frags addr:$src)))]>, XOP,
           Sched<[sched.Folded, sched.ReadAfterFold]>;
}

multiclass xop2op128<bits<8> opc, string OpcodeStr, Intrinsic Int,
                     X86FoldableSchedWrite sched> {
  def rr : IXOP<opc, MRMSrcReg, (outs VR128:$dst), (ins VR128:$src),
           !strconcat(OpcodeStr, "\t{$src, $dst|$dst, $src}"),
           [(set VR128:$dst, (Int VR128:$src))]>, XOP, Sched<[sched]>;
  def rm : IXOP<opc, MRMSrcMem, (outs VR128:$dst), (ins f128mem:$src),
           !strconcat(OpcodeStr, "\t{$src, $dst|$dst, $src}"),
           [(set VR128:$dst, (Int (load addr:$src)))]>, XOP,
           Sched<[sched.Folded, sched.ReadAfterFold]>;
}

multiclass xop2op256<bits<8> opc, string OpcodeStr, Intrinsic Int,
                     X86FoldableSchedWrite sched> {
  def Yrr : IXOP<opc, MRMSrcReg, (outs VR256:$dst), (ins VR256:$src),
           !strconcat(OpcodeStr, "\t{$src, $dst|$dst, $src}"),
           [(set VR256:$dst, (Int VR256:$src))]>, XOP, VEX_L, Sched<[sched]>;
  def Yrm : IXOP<opc, MRMSrcMem, (outs VR256:$dst), (ins f256mem:$src),
           !strconcat(OpcodeStr, "\t{$src, $dst|$dst, $src}"),
           [(set VR256:$dst, (Int (load addr:$src)))]>, XOP, VEX_L,
           Sched<[sched.Folded, sched.ReadAfterFold]>;
}

let ExeDomain = SSEPackedSingle in {
  defm VFRCZSS : xop2opsld<0x82, "vfrczss", int_x86_xop_vfrcz_ss,
                           ssmem, sse_load_f32, SchedWriteFRnd.Scl>;
  defm VFRCZPS : xop2op128<0x80, "vfrczps", int_x86_xop_vfrcz_ps,
                           SchedWriteFRnd.XMM>;
  defm VFRCZPS : xop2op256<0x80, "vfrczps", int_x86_xop_vfrcz_ps_256,
                           SchedWriteFRnd.YMM>;
}

let ExeDomain = SSEPackedDouble in {
  defm VFRCZSD : xop2opsld<0x83, "vfrczsd", int_x86_xop_vfrcz_sd,
                           sdmem, sse_load_f64, SchedWriteFRnd.Scl>;
  defm VFRCZPD : xop2op128<0x81, "vfrczpd", int_x86_xop_vfrcz_pd,
                           SchedWriteFRnd.XMM>;
  defm VFRCZPD : xop2op256<0x81, "vfrczpd", int_x86_xop_vfrcz_pd_256,
                           SchedWriteFRnd.YMM>;
}

multiclass xop3op<bits<8> opc, string OpcodeStr, SDNode OpNode,
                  ValueType vt128, X86FoldableSchedWrite sched> {
  def rr : IXOP<opc, MRMSrcReg4VOp3, (outs VR128:$dst),
           (ins VR128:$src1, VR128:$src2),
           !strconcat(OpcodeStr, "\t{$src2, $src1, $dst|$dst, $src1, $src2}"),
           [(set VR128:$dst,
              (vt128 (OpNode (vt128 VR128:$src1), (vt128 VR128:$src2))))]>,
           XOP, Sched<[sched]>;
  def rm : IXOP<opc, MRMSrcMem, (outs VR128:$dst),
           (ins VR128:$src1, i128mem:$src2),
           !strconcat(OpcodeStr, "\t{$src2, $src1, $dst|$dst, $src1, $src2}"),
           [(set VR128:$dst,
              (vt128 (OpNode (vt128 VR128:$src1),
                             (vt128 (load addr:$src2)))))]>,
           XOP, VVVV, REX_W, Sched<[sched.Folded, sched.ReadAfterFold]>;
  def mr : IXOP<opc, MRMSrcMem4VOp3, (outs VR128:$dst),
           (ins i128mem:$src1, VR128:$src2),
           !strconcat(OpcodeStr, "\t{$src2, $src1, $dst|$dst, $src1, $src2}"),
           [(set VR128:$dst,
              (vt128 (OpNode (vt128 (load addr:$src1)),
                             (vt128 VR128:$src2))))]>,
             XOP, Sched<[sched.Folded, sched.ReadAfterFold]>;
  // For disassembler
  let isCodeGenOnly = 1, ForceDisassemble = 1, hasSideEffects = 0 in
  def rr_REV : IXOP<opc, MRMSrcReg, (outs VR128:$dst),
               (ins VR128:$src1, VR128:$src2),
               !strconcat(OpcodeStr, "\t{$src2, $src1, $dst|$dst, $src1, $src2}"),
               []>,
               XOP, VVVV, REX_W, Sched<[sched]>;
}

let ExeDomain = SSEPackedInt in {
  defm VPROTB : xop3op<0x90, "vprotb", rotl, v16i8, SchedWriteVarVecShift.XMM>;
  defm VPROTD : xop3op<0x92, "vprotd", rotl, v4i32, SchedWriteVarVecShift.XMM>;
  defm VPROTQ : xop3op<0x93, "vprotq", rotl, v2i64, SchedWriteVarVecShift.XMM>;
  defm VPROTW : xop3op<0x91, "vprotw", rotl, v8i16, SchedWriteVarVecShift.XMM>;
  defm VPSHAB : xop3op<0x98, "vpshab", X86vpsha, v16i8, SchedWriteVarVecShift.XMM>;
  defm VPSHAD : xop3op<0x9A, "vpshad", X86vpsha, v4i32, SchedWriteVarVecShift.XMM>;
  defm VPSHAQ : xop3op<0x9B, "vpshaq", X86vpsha, v2i64, SchedWriteVarVecShift.XMM>;
  defm VPSHAW : xop3op<0x99, "vpshaw", X86vpsha, v8i16, SchedWriteVarVecShift.XMM>;
  defm VPSHLB : xop3op<0x94, "vpshlb", X86vpshl, v16i8, SchedWriteVarVecShift.XMM>;
  defm VPSHLD : xop3op<0x96, "vpshld", X86vpshl, v4i32, SchedWriteVarVecShift.XMM>;
  defm VPSHLQ : xop3op<0x97, "vpshlq", X86vpshl, v2i64, SchedWriteVarVecShift.XMM>;
  defm VPSHLW : xop3op<0x95, "vpshlw", X86vpshl, v8i16, SchedWriteVarVecShift.XMM>;
}

multiclass xop3opimm<bits<8> opc, string OpcodeStr, SDNode OpNode,
                     ValueType vt128, X86FoldableSchedWrite sched> {
  def ri : IXOPi8<opc, MRMSrcReg, (outs VR128:$dst),
           (ins VR128:$src1, u8imm:$src2),
           !strconcat(OpcodeStr, "\t{$src2, $src1, $dst|$dst, $src1, $src2}"),
           [(set VR128:$dst,
              (vt128 (OpNode (vt128 VR128:$src1), timm:$src2)))]>,
           XOP, Sched<[sched]>;
  def mi : IXOPi8<opc, MRMSrcMem, (outs VR128:$dst),
           (ins i128mem:$src1, u8imm:$src2),
           !strconcat(OpcodeStr, "\t{$src2, $src1, $dst|$dst, $src1, $src2}"),
           [(set VR128:$dst,
              (vt128 (OpNode (vt128 (load addr:$src1)), timm:$src2)))]>,
           XOP, Sched<[sched.Folded, sched.ReadAfterFold]>;
}

let ExeDomain = SSEPackedInt in {
  defm VPROTB : xop3opimm<0xC0, "vprotb", X86vrotli, v16i8,
                          SchedWriteVecShiftImm.XMM>;
  defm VPROTD : xop3opimm<0xC2, "vprotd", X86vrotli, v4i32,
                          SchedWriteVecShiftImm.XMM>;
  defm VPROTQ : xop3opimm<0xC3, "vprotq", X86vrotli, v2i64,
                          SchedWriteVecShiftImm.XMM>;
  defm VPROTW : xop3opimm<0xC1, "vprotw", X86vrotli, v8i16,
                          SchedWriteVecShiftImm.XMM>;
}

// Instruction where second source can be memory, but third must be register
multiclass xop4opm2<bits<8> opc, string OpcodeStr, Intrinsic Int,
                    X86FoldableSchedWrite sched> {
  let isCommutable = 1 in
  def rr : IXOPi8Reg<opc, MRMSrcReg, (outs VR128:$dst),
           (ins VR128:$src1, VR128:$src2, VR128:$src3),
           !strconcat(OpcodeStr,
           "\t{$src3, $src2, $src1, $dst|$dst, $src1, $src2, $src3}"),
           [(set VR128:$dst,
              (Int VR128:$src1, VR128:$src2, VR128:$src3))]>, XOP, VVVV,
           Sched<[sched]>;
  def rm : IXOPi8Reg<opc, MRMSrcMem, (outs VR128:$dst),
           (ins VR128:$src1, i128mem:$src2, VR128:$src3),
           !strconcat(OpcodeStr,
           "\t{$src3, $src2, $src1, $dst|$dst, $src1, $src2, $src3}"),
           [(set VR128:$dst,
              (Int VR128:$src1, (load addr:$src2),
              VR128:$src3))]>, XOP, VVVV, Sched<[sched.Folded, sched.ReadAfterFold]>;
}

let ExeDomain = SSEPackedInt in {
  defm VPMADCSWD  : xop4opm2<0xB6, "vpmadcswd",
                             int_x86_xop_vpmadcswd, SchedWriteVecIMul.XMM>;
  defm VPMADCSSWD : xop4opm2<0xA6, "vpmadcsswd",
                             int_x86_xop_vpmadcsswd, SchedWriteVecIMul.XMM>;
  defm VPMACSWW   : xop4opm2<0x95, "vpmacsww",
                             int_x86_xop_vpmacsww, SchedWriteVecIMul.XMM>;
  defm VPMACSWD   : xop4opm2<0x96, "vpmacswd",
                             int_x86_xop_vpmacswd, SchedWriteVecIMul.XMM>;
  defm VPMACSSWW  : xop4opm2<0x85, "vpmacssww",
                             int_x86_xop_vpmacssww, SchedWriteVecIMul.XMM>;
  defm VPMACSSWD  : xop4opm2<0x86, "vpmacsswd",
                             int_x86_xop_vpmacsswd, SchedWriteVecIMul.XMM>;
  defm VPMACSSDQL : xop4opm2<0x87, "vpmacssdql",
                             int_x86_xop_vpmacssdql, SchedWritePMULLD.XMM>;
  defm VPMACSSDQH : xop4opm2<0x8F, "vpmacssdqh",
                             int_x86_xop_vpmacssdqh, SchedWritePMULLD.XMM>;
  defm VPMACSSDD  : xop4opm2<0x8E, "vpmacssdd",
                             int_x86_xop_vpmacssdd, SchedWritePMULLD.XMM>;
  defm VPMACSDQL  : xop4opm2<0x97, "vpmacsdql",
                             int_x86_xop_vpmacsdql, SchedWritePMULLD.XMM>;
  defm VPMACSDQH  : xop4opm2<0x9F, "vpmacsdqh",
                             int_x86_xop_vpmacsdqh, SchedWritePMULLD.XMM>;
  defm VPMACSDD   : xop4opm2<0x9E, "vpmacsdd",
                             int_x86_xop_vpmacsdd, SchedWritePMULLD.XMM>;
}

// IFMA patterns - for cases where we can safely ignore the overflow bits from
// the multiply or easily match with existing intrinsics.
let Predicates = [HasXOP] in {
  def : Pat<(v8i16 (add (mul (v8i16 VR128:$src1), (v8i16 VR128:$src2)),
                        (v8i16 VR128:$src3))),
            (VPMACSWWrr VR128:$src1, VR128:$src2, VR128:$src3)>;
  def : Pat<(v4i32 (add (mul (v4i32 VR128:$src1), (v4i32 VR128:$src2)),
                        (v4i32 VR128:$src3))),
            (VPMACSDDrr VR128:$src1, VR128:$src2, VR128:$src3)>;
  def : Pat<(v2i64 (add (X86pmuldq (bc_v2i64 (X86PShufd (v4i32 VR128:$src1), (i8 -11))),
                                   (bc_v2i64 (X86PShufd (v4i32 VR128:$src2), (i8 -11)))),
                        (v2i64 VR128:$src3))),
            (VPMACSDQHrr VR128:$src1, VR128:$src2, VR128:$src3)>;
  def : Pat<(v2i64 (add (X86pmuldq (v2i64 VR128:$src1), (v2i64 VR128:$src2)),
                        (v2i64 VR128:$src3))),
            (VPMACSDQLrr VR128:$src1, VR128:$src2, VR128:$src3)>;
  def : Pat<(v4i32 (add (X86vpmaddwd (v8i16 VR128:$src1), (v8i16 VR128:$src2)),
                        (v4i32 VR128:$src3))),
            (VPMADCSWDrr VR128:$src1, VR128:$src2, VR128:$src3)>;
}

// Transforms to swizzle an immediate to help matching memory operand in first
// operand.
def CommuteVPCOMCC : SDNodeXForm<imm, [{
  uint8_t Imm = N->getZExtValue() & 0x7;
  Imm = X86::getSwappedVPCOMImm(Imm);
  return getI8Imm(Imm, SDLoc(N));
}]>;

// Instruction where second source can be memory, third must be imm8
multiclass xopvpcom<bits<8> opc, string Suffix, SDNode OpNode, ValueType vt128,
                    X86FoldableSchedWrite sched> {
  let ExeDomain = SSEPackedInt in { // SSE integer instructions
    let isCommutable = 1 in
    def ri : IXOPi8<opc, MRMSrcReg, (outs VR128:$dst),
             (ins VR128:$src1, VR128:$src2, u8imm:$cc),
             !strconcat("vpcom", Suffix,
             "\t{$cc, $src2, $src1, $dst|$dst, $src1, $src2, $cc}"),
             [(set VR128:$dst,
                (vt128 (OpNode (vt128 VR128:$src1), (vt128 VR128:$src2),
                               timm:$cc)))]>,
             XOP, VVVV, Sched<[sched]>;
    def mi : IXOPi8<opc, MRMSrcMem, (outs VR128:$dst),
             (ins VR128:$src1, i128mem:$src2, u8imm:$cc),
             !strconcat("vpcom", Suffix,
             "\t{$cc, $src2, $src1, $dst|$dst, $src1, $src2, $cc}"),
             [(set VR128:$dst,
                (vt128 (OpNode (vt128 VR128:$src1),
                               (vt128 (load addr:$src2)),
                                timm:$cc)))]>,
             XOP, VVVV, Sched<[sched.Folded, sched.ReadAfterFold]>;
  }

  def : Pat<(OpNode (load addr:$src2),
                    (vt128 VR128:$src1), timm:$cc),
            (!cast<Instruction>(NAME#"mi") VR128:$src1, addr:$src2,
                                           (CommuteVPCOMCC timm:$cc))>;
}

defm VPCOMB  : xopvpcom<0xCC, "b", X86vpcom, v16i8, SchedWriteVecALU.XMM>;
defm VPCOMW  : xopvpcom<0xCD, "w", X86vpcom, v8i16, SchedWriteVecALU.XMM>;
defm VPCOMD  : xopvpcom<0xCE, "d", X86vpcom, v4i32, SchedWriteVecALU.XMM>;
defm VPCOMQ  : xopvpcom<0xCF, "q", X86vpcom, v2i64, SchedWriteVecALU.XMM>;
defm VPCOMUB : xopvpcom<0xEC, "ub", X86vpcomu, v16i8, SchedWriteVecALU.XMM>;
defm VPCOMUW : xopvpcom<0xED, "uw", X86vpcomu, v8i16, SchedWriteVecALU.XMM>;
defm VPCOMUD : xopvpcom<0xEE, "ud", X86vpcomu, v4i32, SchedWriteVecALU.XMM>;
defm VPCOMUQ : xopvpcom<0xEF, "uq", X86vpcomu, v2i64, SchedWriteVecALU.XMM>;

multiclass xop4op<bits<8> opc, string OpcodeStr, SDNode OpNode,
                  ValueType vt128, X86FoldableSchedWrite sched> {
  def rrr : IXOPi8Reg<opc, MRMSrcReg, (outs VR128:$dst),
            (ins VR128:$src1, VR128:$src2, VR128:$src3),
            !strconcat(OpcodeStr,
            "\t{$src3, $src2, $src1, $dst|$dst, $src1, $src2, $src3}"),
            [(set VR128:$dst,
              (vt128 (OpNode (vt128 VR128:$src1), (vt128 VR128:$src2),
                             (vt128 VR128:$src3))))]>,
            XOP, VVVV, Sched<[sched]>;
  def rrm : IXOPi8Reg<opc, MRMSrcMemOp4, (outs VR128:$dst),
            (ins VR128:$src1, VR128:$src2, i128mem:$src3),
            !strconcat(OpcodeStr,
            "\t{$src3, $src2, $src1, $dst|$dst, $src1, $src2, $src3}"),
            [(set VR128:$dst,
              (vt128 (OpNode (vt128 VR128:$src1), (vt128 VR128:$src2),
                             (vt128 (load addr:$src3)))))]>,
            XOP, VVVV, REX_W, Sched<[sched.Folded, sched.ReadAfterFold, sched.ReadAfterFold]>;
  def rmr : IXOPi8Reg<opc, MRMSrcMem, (outs VR128:$dst),
            (ins VR128:$src1, i128mem:$src2, VR128:$src3),
            !strconcat(OpcodeStr,
            "\t{$src3, $src2, $src1, $dst|$dst, $src1, $src2, $src3}"),
            [(set VR128:$dst,
              (v16i8 (OpNode (vt128 VR128:$src1), (vt128 (load addr:$src2)),
                             (vt128 VR128:$src3))))]>,
            XOP, VVVV, Sched<[sched.Folded, sched.ReadAfterFold,
                           // 128mem:$src2
                           ReadDefault, ReadDefault, ReadDefault, ReadDefault,
                           ReadDefault,
                           // VR128:$src3
                           sched.ReadAfterFold]>;
  // For disassembler
  let isCodeGenOnly = 1, ForceDisassemble = 1, hasSideEffects = 0 in
  def rrr_REV : IXOPi8Reg<opc, MRMSrcRegOp4, (outs VR128:$dst),
                (ins VR128:$src1, VR128:$src2, VR128:$src3),
                !strconcat(OpcodeStr,
                "\t{$src3, $src2, $src1, $dst|$dst, $src1, $src2, $src3}"),
                []>, XOP, VVVV, REX_W, Sched<[sched]>;
}

let ExeDomain = SSEPackedInt in {
  defm VPPERM : xop4op<0xA3, "vpperm", X86vpperm, v16i8,
                       SchedWriteVarShuffle.XMM>;
}

// Instruction where either second or third source can be memory
multiclass xop4op_int<bits<8> opc, string OpcodeStr, RegisterClass RC,
                      X86MemOperand x86memop, ValueType VT,
                      X86FoldableSchedWrite sched> {
  def rrr : IXOPi8Reg<opc, MRMSrcReg, (outs RC:$dst),
            (ins RC:$src1, RC:$src2, RC:$src3),
            !strconcat(OpcodeStr,
            "\t{$src3, $src2, $src1, $dst|$dst, $src1, $src2, $src3}"),
            [(set RC:$dst, (VT (or (and RC:$src3, RC:$src1),
                                   (X86andnp RC:$src3, RC:$src2))))]>, XOP, VVVV,
            Sched<[sched]>;
  // FIXME: We can't write a pattern for this in tablegen.
  let hasSideEffects = 0, mayLoad = 1 in
  def rrm : IXOPi8Reg<opc, MRMSrcMemOp4, (outs RC:$dst),
            (ins RC:$src1, RC:$src2, x86memop:$src3),
            !strconcat(OpcodeStr,
            "\t{$src3, $src2, $src1, $dst|$dst, $src1, $src2, $src3}"),
            []>,
            XOP, VVVV, REX_W, Sched<[sched.Folded, sched.ReadAfterFold, sched.ReadAfterFold]>;
  def rmr : IXOPi8Reg<opc, MRMSrcMem, (outs RC:$dst),
            (ins RC:$src1, x86memop:$src2, RC:$src3),
            !strconcat(OpcodeStr,
            "\t{$src3, $src2, $src1, $dst|$dst, $src1, $src2, $src3}"),
            [(set RC:$dst, (VT (or (and RC:$src3, RC:$src1),
                                   (X86andnp RC:$src3, (load addr:$src2)))))]>,
            XOP, VVVV, Sched<[sched.Folded, sched.ReadAfterFold,
                           // x86memop:$src2
                           ReadDefault, ReadDefault, ReadDefault, ReadDefault,
                           ReadDefault,
                           // RC::$src3
                           sched.ReadAfterFold]>;
  // For disassembler
  let isCodeGenOnly = 1, ForceDisassemble = 1, hasSideEffects = 0 in
  def rrr_REV : IXOPi8Reg<opc, MRMSrcRegOp4, (outs RC:$dst),
            (ins RC:$src1, RC:$src2, RC:$src3),
            !strconcat(OpcodeStr,
            "\t{$src3, $src2, $src1, $dst|$dst, $src1, $src2, $src3}"),
            []>, XOP, VVVV, REX_W, Sched<[sched]>;
}

let ExeDomain = SSEPackedInt in {
  defm VPCMOV : xop4op_int<0xA2, "vpcmov", VR128, i128mem, v2i64,
                           SchedWriteShuffle.XMM>;
  defm VPCMOVY : xop4op_int<0xA2, "vpcmov", VR256, i256mem, v4i64,
                            SchedWriteShuffle.YMM>, VEX_L;
}

let Predicates = [HasXOP] in {
  def : Pat<(v16i8 (or (and VR128:$src3, VR128:$src1),
                   (X86andnp VR128:$src3, VR128:$src2))),
            (VPCMOVrrr VR128:$src1, VR128:$src2, VR128:$src3)>;
  def : Pat<(v8i16 (or (and VR128:$src3, VR128:$src1),
                   (X86andnp VR128:$src3, VR128:$src2))),
            (VPCMOVrrr VR128:$src1, VR128:$src2, VR128:$src3)>;
  def : Pat<(v4i32 (or (and VR128:$src3, VR128:$src1),
                   (X86andnp VR128:$src3, VR128:$src2))),
            (VPCMOVrrr VR128:$src1, VR128:$src2, VR128:$src3)>;

  def : Pat<(or (and VR128:$src3, VR128:$src1),
                (X86andnp VR128:$src3, (loadv16i8 addr:$src2))),
            (VPCMOVrmr VR128:$src1, addr:$src2, VR128:$src3)>;
  def : Pat<(or (and VR128:$src3, VR128:$src1),
                (X86andnp VR128:$src3, (loadv8i16 addr:$src2))),
            (VPCMOVrmr VR128:$src1, addr:$src2, VR128:$src3)>;
  def : Pat<(or (and VR128:$src3, VR128:$src1),
                (X86andnp VR128:$src3, (loadv4i32 addr:$src2))),
            (VPCMOVrmr VR128:$src1, addr:$src2, VR128:$src3)>;

  def : Pat<(v32i8 (or (and VR256:$src3, VR256:$src1),
                   (X86andnp VR256:$src3, VR256:$src2))),
            (VPCMOVYrrr VR256:$src1, VR256:$src2, VR256:$src3)>;
  def : Pat<(v16i16 (or (and VR256:$src3, VR256:$src1),
                    (X86andnp VR256:$src3, VR256:$src2))),
            (VPCMOVYrrr VR256:$src1, VR256:$src2, VR256:$src3)>;
  def : Pat<(v8i32 (or (and VR256:$src3, VR256:$src1),
                   (X86andnp VR256:$src3, VR256:$src2))),
            (VPCMOVYrrr VR256:$src1, VR256:$src2, VR256:$src3)>;

  def : Pat<(or (and VR256:$src3, VR256:$src1),
                (X86andnp VR256:$src3, (loadv32i8 addr:$src2))),
            (VPCMOVYrmr VR256:$src1, addr:$src2, VR256:$src3)>;
  def : Pat<(or (and VR256:$src3, VR256:$src1),
                (X86andnp VR256:$src3, (loadv16i16 addr:$src2))),
            (VPCMOVYrmr VR256:$src1, addr:$src2, VR256:$src3)>;
  def : Pat<(or (and VR256:$src3, VR256:$src1),
                (X86andnp VR256:$src3, (loadv8i32 addr:$src2))),
            (VPCMOVYrmr VR256:$src1, addr:$src2, VR256:$src3)>;
}

multiclass xop_vpermil2<bits<8> Opc, string OpcodeStr, RegisterClass RC,
                        X86MemOperand intmemop, X86MemOperand fpmemop,
                        ValueType VT, PatFrag FPLdFrag, PatFrag IntLdFrag,
                        X86FoldableSchedWrite sched> {
  def rr : IXOP5<Opc, MRMSrcReg, (outs RC:$dst),
        (ins RC:$src1, RC:$src2, RC:$src3, u4imm:$src4),
        !strconcat(OpcodeStr,
        "\t{$src4, $src3, $src2, $src1, $dst|$dst, $src1, $src2, $src3, $src4}"),
        [(set RC:$dst,
           (VT (X86vpermil2 RC:$src1, RC:$src2, RC:$src3, (i8 timm:$src4))))]>,
        Sched<[sched]>;
  def rm : IXOP5<Opc, MRMSrcMemOp4, (outs RC:$dst),
        (ins RC:$src1, RC:$src2, intmemop:$src3, u4imm:$src4),
        !strconcat(OpcodeStr,
        "\t{$src4, $src3, $src2, $src1, $dst|$dst, $src1, $src2, $src3, $src4}"),
        [(set RC:$dst,
          (VT (X86vpermil2 RC:$src1, RC:$src2, (IntLdFrag addr:$src3),
                           (i8 timm:$src4))))]>, REX_W,
        Sched<[sched.Folded, sched.ReadAfterFold, sched.ReadAfterFold]>;
  def mr : IXOP5<Opc, MRMSrcMem, (outs RC:$dst),
        (ins RC:$src1, fpmemop:$src2, RC:$src3, u4imm:$src4),
        !strconcat(OpcodeStr,
        "\t{$src4, $src3, $src2, $src1, $dst|$dst, $src1, $src2, $src3, $src4}"),
        [(set RC:$dst,
          (VT (X86vpermil2 RC:$src1, (FPLdFrag addr:$src2),
                           RC:$src3, (i8 timm:$src4))))]>,
        Sched<[sched.Folded, sched.ReadAfterFold,
               // fpmemop:$src2
               ReadDefault, ReadDefault, ReadDefault, ReadDefault, ReadDefault,
               // RC:$src3
               sched.ReadAfterFold]>;
  // For disassembler
  let isCodeGenOnly = 1, ForceDisassemble = 1, hasSideEffects = 0 in
  def rr_REV : IXOP5<Opc, MRMSrcRegOp4, (outs RC:$dst),
        (ins RC:$src1, RC:$src2, RC:$src3, u4imm:$src4),
        !strconcat(OpcodeStr,
        "\t{$src4, $src3, $src2, $src1, $dst|$dst, $src1, $src2, $src3, $src4}"),
        []>, REX_W, Sched<[sched]>;
}

let ExeDomain = SSEPackedDouble in {
  defm VPERMIL2PD : xop_vpermil2<0x49, "vpermil2pd", VR128, i128mem, f128mem,
                                 v2f64, loadv2f64, loadv2i64,
                                 SchedWriteFVarShuffle.XMM>;
  defm VPERMIL2PDY : xop_vpermil2<0x49, "vpermil2pd", VR256, i256mem, f256mem,
                                  v4f64, loadv4f64, loadv4i64,
                                  SchedWriteFVarShuffle.YMM>, VEX_L;
}

let ExeDomain = SSEPackedSingle in {
  defm VPERMIL2PS : xop_vpermil2<0x48, "vpermil2ps", VR128, i128mem, f128mem,
                                 v4f32, loadv4f32, loadv4i32,
                                 SchedWriteFVarShuffle.XMM>;
  defm VPERMIL2PSY : xop_vpermil2<0x48, "vpermil2ps", VR256, i256mem, f256mem,
                                  v8f32, loadv8f32, loadv8i32,
                                  SchedWriteFVarShuffle.YMM>, VEX_L;
}

