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