xref: /freebsd/contrib/llvm-project/llvm/lib/Target/VE/VEInstrPatternsVec.td (revision fe6060f10f634930ff71b7c50291ddc610da2475)
1e8d8bef9SDimitry Andric//===-- VEInstrPatternsVec.td - VEC_-type SDNodes and isel for VE Target --===//
2e8d8bef9SDimitry Andric//
3e8d8bef9SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4e8d8bef9SDimitry Andric// See https://llvm.org/LICENSE.txt for license information.
5e8d8bef9SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6e8d8bef9SDimitry Andric//
7e8d8bef9SDimitry Andric//===----------------------------------------------------------------------===//
8e8d8bef9SDimitry Andric//
9e8d8bef9SDimitry Andric// This file describes the VEC_* prefixed intermediate SDNodes and their
10e8d8bef9SDimitry Andric// isel patterns.
11e8d8bef9SDimitry Andric//
12e8d8bef9SDimitry Andric//===----------------------------------------------------------------------===//
13e8d8bef9SDimitry Andric
14e8d8bef9SDimitry Andric//===----------------------------------------------------------------------===//
15e8d8bef9SDimitry Andric// Instruction format superclass
16e8d8bef9SDimitry Andric//===----------------------------------------------------------------------===//
17e8d8bef9SDimitry Andric
18e8d8bef9SDimitry Andricmulticlass vbrd_elem32<ValueType v32, ValueType s32, SDPatternOperator ImmOp,
19*fe6060f1SDimitry Andric                       SDNodeXForm ImmCast, OutPatFrag SuperRegCast> {
20e8d8bef9SDimitry Andric  // VBRDil
21e8d8bef9SDimitry Andric  def : Pat<(v32 (vec_broadcast (s32 ImmOp:$sy), i32:$vl)),
22e8d8bef9SDimitry Andric            (VBRDil (ImmCast $sy), i32:$vl)>;
23e8d8bef9SDimitry Andric
24e8d8bef9SDimitry Andric  // VBRDrl
25e8d8bef9SDimitry Andric  def : Pat<(v32 (vec_broadcast s32:$sy, i32:$vl)),
26e8d8bef9SDimitry Andric            (VBRDrl (SuperRegCast $sy), i32:$vl)>;
27e8d8bef9SDimitry Andric}
28e8d8bef9SDimitry Andric
29e8d8bef9SDimitry Andricmulticlass vbrd_elem64<ValueType v64, ValueType s64,
30e8d8bef9SDimitry Andric                       SDPatternOperator ImmOp, SDNodeXForm ImmCast> {
31e8d8bef9SDimitry Andric  // VBRDil
32e8d8bef9SDimitry Andric  def : Pat<(v64 (vec_broadcast (s64 ImmOp:$sy), i32:$vl)),
33e8d8bef9SDimitry Andric            (VBRDil (ImmCast $sy), i32:$vl)>;
34e8d8bef9SDimitry Andric
35e8d8bef9SDimitry Andric  // VBRDrl
36e8d8bef9SDimitry Andric  def : Pat<(v64 (vec_broadcast s64:$sy, i32:$vl)),
37e8d8bef9SDimitry Andric            (VBRDrl s64:$sy, i32:$vl)>;
38e8d8bef9SDimitry Andric}
39e8d8bef9SDimitry Andric
40e8d8bef9SDimitry Andricmulticlass extract_insert_elem32<ValueType v32, ValueType s32,
41*fe6060f1SDimitry Andric                                 OutPatFrag SubRegCast,
42*fe6060f1SDimitry Andric                                 OutPatFrag SuperRegCast> {
43e8d8bef9SDimitry Andric  // LVSvi
44e8d8bef9SDimitry Andric  def: Pat<(s32 (extractelt v32:$vec, uimm7:$idx)),
45e8d8bef9SDimitry Andric           (SubRegCast (LVSvi v32:$vec, (ULO7 $idx)))>;
46e8d8bef9SDimitry Andric  // LVSvr
47e8d8bef9SDimitry Andric  def: Pat<(s32 (extractelt v32:$vec, i64:$idx)),
48e8d8bef9SDimitry Andric           (SubRegCast (LVSvr v32:$vec, $idx))>;
49e8d8bef9SDimitry Andric
50e8d8bef9SDimitry Andric  // LSVir
51e8d8bef9SDimitry Andric  def: Pat<(v32 (insertelt v32:$vec, s32:$val, uimm7:$idx)),
52e8d8bef9SDimitry Andric           (LSVir_v (ULO7 $idx), (SuperRegCast $val), $vec)>;
53e8d8bef9SDimitry Andric  // LSVrr
54e8d8bef9SDimitry Andric  def: Pat<(v32 (insertelt v32:$vec, s32:$val, i64:$idx)),
55e8d8bef9SDimitry Andric           (LSVrr_v $idx, (SuperRegCast $val), $vec)>;
56e8d8bef9SDimitry Andric}
57e8d8bef9SDimitry Andric
58e8d8bef9SDimitry Andricmulticlass extract_insert_elem64<ValueType v64, ValueType s64> {
59e8d8bef9SDimitry Andric  // LVSvi
60e8d8bef9SDimitry Andric  def: Pat<(s64 (extractelt v64:$vec, uimm7:$idx)),
61e8d8bef9SDimitry Andric           (LVSvi v64:$vec, (ULO7 $idx))>;
62e8d8bef9SDimitry Andric  // LVSvr
63e8d8bef9SDimitry Andric  def: Pat<(s64 (extractelt v64:$vec, i64:$idx)),
64e8d8bef9SDimitry Andric           (LVSvr v64:$vec, $idx)>;
65e8d8bef9SDimitry Andric
66e8d8bef9SDimitry Andric  // LSVir
67e8d8bef9SDimitry Andric  def: Pat<(v64 (insertelt v64:$vec, s64:$val, uimm7:$idx)),
68e8d8bef9SDimitry Andric           (LSVir_v (ULO7 $idx), $val, $vec)>;
69e8d8bef9SDimitry Andric  // LSVrr
70e8d8bef9SDimitry Andric  def: Pat<(v64 (insertelt v64:$vec, s64:$val, i64:$idx)),
71e8d8bef9SDimitry Andric           (LSVrr_v $idx, $val, $vec)>;
72e8d8bef9SDimitry Andric}
73e8d8bef9SDimitry Andric
74e8d8bef9SDimitry Andricmulticlass patterns_elem32<ValueType v32, ValueType s32,
75e8d8bef9SDimitry Andric                           SDPatternOperator ImmOp, SDNodeXForm ImmCast,
76*fe6060f1SDimitry Andric                           OutPatFrag SubRegCast, OutPatFrag SuperRegCast> {
77e8d8bef9SDimitry Andric  defm : vbrd_elem32<v32, s32, ImmOp, ImmCast, SuperRegCast>;
78e8d8bef9SDimitry Andric  defm : extract_insert_elem32<v32, s32, SubRegCast, SuperRegCast>;
79e8d8bef9SDimitry Andric}
80e8d8bef9SDimitry Andric
81e8d8bef9SDimitry Andricmulticlass patterns_elem64<ValueType v64, ValueType s64,
82e8d8bef9SDimitry Andric                           SDPatternOperator ImmOp, SDNodeXForm ImmCast> {
83e8d8bef9SDimitry Andric  defm : vbrd_elem64<v64, s64, ImmOp, ImmCast>;
84e8d8bef9SDimitry Andric  defm : extract_insert_elem64<v64, s64>;
85e8d8bef9SDimitry Andric}
86e8d8bef9SDimitry Andric
87e8d8bef9SDimitry Andricdefm : patterns_elem32<v256i32, i32, simm7, LO7, l2i, i2l>;
88e8d8bef9SDimitry Andricdefm : patterns_elem32<v256f32, f32, simm7fp, LO7FP, l2f, f2l>;
89e8d8bef9SDimitry Andric
90e8d8bef9SDimitry Andricdefm : patterns_elem64<v256i64, i64, simm7, LO7>;
91e8d8bef9SDimitry Andricdefm : patterns_elem64<v256f64, f64, simm7fp, LO7FP>;
92