1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
  
     | 
    
      //===----------- 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">;
 
     |