//===----------- VVPInstrPatternsVec.td - VVP_* SDNode patterns -----------===//
//
// 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 how VVP_* SDNodes are lowered to machine instructions.
//
//===----------------------------------------------------------------------===//

//===----------------------------------------------------------------------===//
//
// VVP SDNode definitions.
//
//===----------------------------------------------------------------------===//
include "VVPInstrInfo.td"

multiclass VectorBinaryArith<
    SDPatternOperator OpNode,
    ValueType ScalarVT, ValueType DataVT, ValueType MaskVT,
    string OpBaseName,
    SDPatternOperator ImmOp, SDNodeXForm ImmCast> {
  // No mask.
  def : Pat<(OpNode
                (any_broadcast ScalarVT:$sx),
                DataVT:$vy, (MaskVT true_mask), i32:$avl),
            (!cast<Instruction>(OpBaseName#"rvl")
                ScalarVT:$sx, $vy, $avl)>;
  def : Pat<(OpNode DataVT:$vx, DataVT:$vy, (MaskVT true_mask), i32:$avl),
            (!cast<Instruction>(OpBaseName#"vvl")
                $vx, $vy, $avl)>;

  // Mask.
  def : Pat<(OpNode
                (any_broadcast ScalarVT:$sx),
                DataVT:$vy, MaskVT:$mask, i32:$avl),
            (!cast<Instruction>(OpBaseName#"rvml")
                ScalarVT:$sx, $vy, $mask, $avl)>;
  def : Pat<(OpNode DataVT:$vx, DataVT:$vy, MaskVT:$mask, i32:$avl),
            (!cast<Instruction>(OpBaseName#"vvml")
                $vx, $vy, $mask, $avl)>;

  // TODO We do not specify patterns for the immediate variants here. There
  // will be an immediate folding pass that takes care of switching to the
  // immediate variant where applicable.

  // TODO Fold vvp_select into passthru.
}

// Expand both 64bit and 32 bit variant (256 elements)
multiclass VectorBinaryArith_ShortLong<
    SDPatternOperator OpNode,
    ValueType LongScalarVT, ValueType LongDataVT, string LongOpBaseName,
    ValueType ShortScalarVT, ValueType ShortDataVT, string ShortOpBaseName> {
  defm : VectorBinaryArith<OpNode,
                           LongScalarVT, LongDataVT, v256i1,
                           LongOpBaseName, simm7, LO7>;
  defm : VectorBinaryArith<OpNode,
                           ShortScalarVT, ShortDataVT, v256i1,
                           ShortOpBaseName, simm7, LO7>;
}


defm : VectorBinaryArith_ShortLong<c_vvp_add,
                                   i64, v256i64, "VADDSL",
                                   i32, v256i32, "VADDSWSX">;
defm : VectorBinaryArith_ShortLong<c_vvp_and,
                                   i64, v256i64, "VAND",
                                   i32, v256i32, "PVANDLO">;
