1e8d8bef9SDimitry Andric//===----------- VVPInstrPatternsVec.td - VVP_* SDNode patterns -----------===// 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 how VVP_* SDNodes are lowered to machine instructions. 10e8d8bef9SDimitry Andric// 11e8d8bef9SDimitry Andric//===----------------------------------------------------------------------===// 12e8d8bef9SDimitry Andric 13e8d8bef9SDimitry Andric//===----------------------------------------------------------------------===// 14e8d8bef9SDimitry Andric// 15e8d8bef9SDimitry Andric// VVP SDNode definitions. 16e8d8bef9SDimitry Andric// 17e8d8bef9SDimitry Andric//===----------------------------------------------------------------------===// 18e8d8bef9SDimitry Andricinclude "VVPInstrInfo.td" 19e8d8bef9SDimitry Andric 20*0eae32dcSDimitry Andricmulticlass Binary_rv<SDPatternOperator OpNode, 21*0eae32dcSDimitry Andric ValueType ScalarVT, ValueType DataVT, 22*0eae32dcSDimitry Andric ValueType MaskVT, string OpBaseName> { 23*0eae32dcSDimitry Andric // Masked with select, broadcast. 24*0eae32dcSDimitry Andric // TODO 25*0eae32dcSDimitry Andric 26*0eae32dcSDimitry Andric // Unmasked, broadcast. 27e8d8bef9SDimitry Andric def : Pat<(OpNode 28*0eae32dcSDimitry Andric (any_broadcast ScalarVT:$sx), DataVT:$vy, 29*0eae32dcSDimitry Andric (MaskVT true_mask), 30*0eae32dcSDimitry Andric i32:$avl), 31e8d8bef9SDimitry Andric (!cast<Instruction>(OpBaseName#"rvl") 32e8d8bef9SDimitry Andric ScalarVT:$sx, $vy, $avl)>; 33*0eae32dcSDimitry Andric // Masked, broadcast. 34*0eae32dcSDimitry Andric def : Pat<(OpNode 35*0eae32dcSDimitry Andric (any_broadcast ScalarVT:$sx), DataVT:$vy, 36*0eae32dcSDimitry Andric MaskVT:$mask, 37*0eae32dcSDimitry Andric i32:$avl), 38*0eae32dcSDimitry Andric (!cast<Instruction>(OpBaseName#"rvml") 39*0eae32dcSDimitry Andric ScalarVT:$sx, $vy, $mask, $avl)>; 40*0eae32dcSDimitry Andric} 41*0eae32dcSDimitry Andric 42*0eae32dcSDimitry Andricmulticlass Binary_vr<SDPatternOperator OpNode, 43*0eae32dcSDimitry Andric ValueType ScalarVT, ValueType DataVT, 44*0eae32dcSDimitry Andric ValueType MaskVT, string OpBaseName> { 45*0eae32dcSDimitry Andric // Masked with select, broadcast. 46*0eae32dcSDimitry Andric // TODO 47*0eae32dcSDimitry Andric 48*0eae32dcSDimitry Andric // Unmasked, broadcast. 49*0eae32dcSDimitry Andric def : Pat<(OpNode 50*0eae32dcSDimitry Andric DataVT:$vx, (any_broadcast ScalarVT:$sy), 51*0eae32dcSDimitry Andric (MaskVT true_mask), 52*0eae32dcSDimitry Andric i32:$avl), 53*0eae32dcSDimitry Andric (!cast<Instruction>(OpBaseName#"vrl") 54*0eae32dcSDimitry Andric $vx, ScalarVT:$sy, $avl)>; 55*0eae32dcSDimitry Andric // Masked, broadcast. 56*0eae32dcSDimitry Andric def : Pat<(OpNode 57*0eae32dcSDimitry Andric DataVT:$vx, (any_broadcast ScalarVT:$sy), 58*0eae32dcSDimitry Andric MaskVT:$mask, 59*0eae32dcSDimitry Andric i32:$avl), 60*0eae32dcSDimitry Andric (!cast<Instruction>(OpBaseName#"vrml") 61*0eae32dcSDimitry Andric $vx, ScalarVT:$sy, $mask, $avl)>; 62*0eae32dcSDimitry Andric} 63*0eae32dcSDimitry Andric 64*0eae32dcSDimitry Andricmulticlass Binary_vv<SDPatternOperator OpNode, 65*0eae32dcSDimitry Andric ValueType DataVT, 66*0eae32dcSDimitry Andric ValueType MaskVT, string OpBaseName> { 67*0eae32dcSDimitry Andric // Masked with select. 68*0eae32dcSDimitry Andric // TODO 69*0eae32dcSDimitry Andric 70*0eae32dcSDimitry Andric // Unmasked. 71*0eae32dcSDimitry Andric def : Pat<(OpNode 72*0eae32dcSDimitry Andric DataVT:$vx, DataVT:$vy, 73*0eae32dcSDimitry Andric (MaskVT true_mask), 74*0eae32dcSDimitry Andric i32:$avl), 75e8d8bef9SDimitry Andric (!cast<Instruction>(OpBaseName#"vvl") 76e8d8bef9SDimitry Andric $vx, $vy, $avl)>; 77e8d8bef9SDimitry Andric 78*0eae32dcSDimitry Andric // Masked. 79e8d8bef9SDimitry Andric def : Pat<(OpNode 80*0eae32dcSDimitry Andric DataVT:$vx, DataVT:$vy, 81*0eae32dcSDimitry Andric MaskVT:$mask, 82*0eae32dcSDimitry Andric i32:$avl), 83e8d8bef9SDimitry Andric (!cast<Instruction>(OpBaseName#"vvml") 84e8d8bef9SDimitry Andric $vx, $vy, $mask, $avl)>; 85*0eae32dcSDimitry Andric} 86e8d8bef9SDimitry Andric 87*0eae32dcSDimitry Andricmulticlass Binary_rv_vv< 88*0eae32dcSDimitry Andric SDPatternOperator OpNode, 89*0eae32dcSDimitry Andric ValueType ScalarVT, ValueType DataVT, ValueType MaskVT, 90*0eae32dcSDimitry Andric string OpBaseName> { 91*0eae32dcSDimitry Andric defm : Binary_rv<OpNode, ScalarVT, DataVT, MaskVT, OpBaseName>; 92*0eae32dcSDimitry Andric defm : Binary_vv<OpNode, DataVT, MaskVT, OpBaseName>; 93*0eae32dcSDimitry Andric} 94e8d8bef9SDimitry Andric 95*0eae32dcSDimitry Andricmulticlass Binary_vr_vv< 96*0eae32dcSDimitry Andric SDPatternOperator OpNode, 97*0eae32dcSDimitry Andric ValueType ScalarVT, ValueType DataVT, ValueType MaskVT, 98*0eae32dcSDimitry Andric string OpBaseName> { 99*0eae32dcSDimitry Andric defm : Binary_vr<OpNode, ScalarVT, DataVT, MaskVT, OpBaseName>; 100*0eae32dcSDimitry Andric defm : Binary_vv<OpNode, DataVT, MaskVT, OpBaseName>; 101*0eae32dcSDimitry Andric} 102*0eae32dcSDimitry Andric 103*0eae32dcSDimitry Andricmulticlass Binary_rv_vr_vv< 104*0eae32dcSDimitry Andric SDPatternOperator OpNode, 105*0eae32dcSDimitry Andric ValueType ScalarVT, ValueType DataVT, ValueType MaskVT, 106*0eae32dcSDimitry Andric string OpBaseName> { 107*0eae32dcSDimitry Andric defm : Binary_rv<OpNode, ScalarVT, DataVT, MaskVT, OpBaseName>; 108*0eae32dcSDimitry Andric defm : Binary_vr_vv<OpNode, ScalarVT, DataVT, MaskVT, OpBaseName>; 109e8d8bef9SDimitry Andric} 110e8d8bef9SDimitry Andric 111e8d8bef9SDimitry Andric// Expand both 64bit and 32 bit variant (256 elements) 112*0eae32dcSDimitry Andricmulticlass Binary_rv_vv_ShortLong< 113e8d8bef9SDimitry Andric SDPatternOperator OpNode, 114e8d8bef9SDimitry Andric ValueType LongScalarVT, ValueType LongDataVT, string LongOpBaseName, 115e8d8bef9SDimitry Andric ValueType ShortScalarVT, ValueType ShortDataVT, string ShortOpBaseName> { 116*0eae32dcSDimitry Andric defm : Binary_rv_vv<OpNode, 117e8d8bef9SDimitry Andric LongScalarVT, LongDataVT, v256i1, 118349cc55cSDimitry Andric LongOpBaseName>; 119*0eae32dcSDimitry Andric defm : Binary_rv_vv<OpNode, 120e8d8bef9SDimitry Andric ShortScalarVT, ShortDataVT, v256i1, 121349cc55cSDimitry Andric ShortOpBaseName>; 122e8d8bef9SDimitry Andric} 123e8d8bef9SDimitry Andric 124*0eae32dcSDimitry Andricmulticlass Binary_vr_vv_ShortLong< 125*0eae32dcSDimitry Andric SDPatternOperator OpNode, 126*0eae32dcSDimitry Andric ValueType LongScalarVT, ValueType LongDataVT, string LongOpBaseName, 127*0eae32dcSDimitry Andric ValueType ShortScalarVT, ValueType ShortDataVT, string ShortOpBaseName> { 128*0eae32dcSDimitry Andric defm : Binary_vr_vv<OpNode, 129*0eae32dcSDimitry Andric LongScalarVT, LongDataVT, v256i1, 130*0eae32dcSDimitry Andric LongOpBaseName>; 131*0eae32dcSDimitry Andric defm : Binary_vr_vv<OpNode, 132*0eae32dcSDimitry Andric ShortScalarVT, ShortDataVT, v256i1, 133*0eae32dcSDimitry Andric ShortOpBaseName>; 134*0eae32dcSDimitry Andric} 135e8d8bef9SDimitry Andric 136*0eae32dcSDimitry Andricmulticlass Binary_rv_vr_vv_ShortLong< 137*0eae32dcSDimitry Andric SDPatternOperator OpNode, 138*0eae32dcSDimitry Andric ValueType LongScalarVT, ValueType LongDataVT, string LongOpBaseName, 139*0eae32dcSDimitry Andric ValueType ShortScalarVT, ValueType ShortDataVT, string ShortOpBaseName> { 140*0eae32dcSDimitry Andric defm : Binary_rv_vr_vv<OpNode, 141*0eae32dcSDimitry Andric LongScalarVT, LongDataVT, v256i1, 142*0eae32dcSDimitry Andric LongOpBaseName>; 143*0eae32dcSDimitry Andric defm : Binary_rv_vr_vv<OpNode, 144*0eae32dcSDimitry Andric ShortScalarVT, ShortDataVT, v256i1, 145*0eae32dcSDimitry Andric ShortOpBaseName>; 146*0eae32dcSDimitry Andric} 147*0eae32dcSDimitry Andric 148*0eae32dcSDimitry Andricdefm : Binary_rv_vv_ShortLong<c_vvp_add, 149e8d8bef9SDimitry Andric i64, v256i64, "VADDSL", 150e8d8bef9SDimitry Andric i32, v256i32, "VADDSWSX">; 151*0eae32dcSDimitry Andricdefm : Binary_rv_vv_ShortLong<vvp_sub, 152*0eae32dcSDimitry Andric i64, v256i64, "VSUBSL", 153*0eae32dcSDimitry Andric i32, v256i32, "VSUBSWSX">; 154*0eae32dcSDimitry Andricdefm : Binary_rv_vv_ShortLong<c_vvp_mul, 155*0eae32dcSDimitry Andric i64, v256i64, "VMULSL", 156*0eae32dcSDimitry Andric i32, v256i32, "VMULSWSX">; 157*0eae32dcSDimitry Andricdefm : Binary_rv_vr_vv_ShortLong<vvp_sdiv, 158*0eae32dcSDimitry Andric i64, v256i64, "VDIVSL", 159*0eae32dcSDimitry Andric i32, v256i32, "VDIVSWSX">; 160*0eae32dcSDimitry Andricdefm : Binary_rv_vr_vv_ShortLong<vvp_udiv, 161*0eae32dcSDimitry Andric i64, v256i64, "VDIVUL", 162*0eae32dcSDimitry Andric i32, v256i32, "VDIVUW">; 163*0eae32dcSDimitry Andricdefm : Binary_rv_vv_ShortLong<c_vvp_and, 164e8d8bef9SDimitry Andric i64, v256i64, "VAND", 165e8d8bef9SDimitry Andric i32, v256i32, "PVANDLO">; 166*0eae32dcSDimitry Andricdefm : Binary_rv_vv_ShortLong<c_vvp_or, 167*0eae32dcSDimitry Andric i64, v256i64, "VOR", 168*0eae32dcSDimitry Andric i32, v256i32, "PVORLO">; 169*0eae32dcSDimitry Andricdefm : Binary_rv_vv_ShortLong<c_vvp_xor, 170*0eae32dcSDimitry Andric i64, v256i64, "VXOR", 171*0eae32dcSDimitry Andric i32, v256i32, "PVXORLO">; 172*0eae32dcSDimitry Andricdefm : Binary_vr_vv_ShortLong<vvp_shl, 173*0eae32dcSDimitry Andric i64, v256i64, "VSLL", 174*0eae32dcSDimitry Andric i32, v256i32, "PVSLLLO">; 175*0eae32dcSDimitry Andricdefm : Binary_vr_vv_ShortLong<vvp_sra, 176*0eae32dcSDimitry Andric i64, v256i64, "VSRAL", 177*0eae32dcSDimitry Andric i32, v256i32, "PVSRALO">; 178*0eae32dcSDimitry Andricdefm : Binary_vr_vv_ShortLong<vvp_srl, 179*0eae32dcSDimitry Andric i64, v256i64, "VSRL", 180*0eae32dcSDimitry Andric i32, v256i32, "PVSRLLO">; 181*0eae32dcSDimitry Andric 182*0eae32dcSDimitry Andricdefm : Binary_rv_vv_ShortLong<c_vvp_fadd, 183*0eae32dcSDimitry Andric f64, v256f64, "VFADDD", 184*0eae32dcSDimitry Andric f32, v256f32, "PVFADDUP">; 185*0eae32dcSDimitry Andricdefm : Binary_rv_vv_ShortLong<c_vvp_fmul, 186*0eae32dcSDimitry Andric f64, v256f64, "VFMULD", 187*0eae32dcSDimitry Andric f32, v256f32, "PVFMULUP">; 188*0eae32dcSDimitry Andricdefm : Binary_rv_vv_ShortLong<vvp_fsub, 189*0eae32dcSDimitry Andric f64, v256f64, "VFSUBD", 190*0eae32dcSDimitry Andric f32, v256f32, "PVFSUBUP">; 191*0eae32dcSDimitry Andricdefm : Binary_rv_vr_vv_ShortLong<vvp_fdiv, 192*0eae32dcSDimitry Andric f64, v256f64, "VFDIVD", 193*0eae32dcSDimitry Andric f32, v256f32, "VFDIVS">; 194