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 200eae32dcSDimitry Andricmulticlass Binary_rv<SDPatternOperator OpNode, 210eae32dcSDimitry Andric ValueType ScalarVT, ValueType DataVT, 220eae32dcSDimitry Andric ValueType MaskVT, string OpBaseName> { 23*04eeddc0SDimitry Andric // Masked with passthru, broadcast. 24*04eeddc0SDimitry Andric def : Pat<(vvp_select 25*04eeddc0SDimitry Andric (OpNode 26*04eeddc0SDimitry Andric (any_broadcast ScalarVT:$sx), 27*04eeddc0SDimitry Andric DataVT:$vy, 28*04eeddc0SDimitry Andric (MaskVT srcvalue), 29*04eeddc0SDimitry Andric (i32 srcvalue)), 30*04eeddc0SDimitry Andric DataVT:$vfalse, 31*04eeddc0SDimitry Andric MaskVT:$mask, 32*04eeddc0SDimitry Andric i32:$pivot), 33*04eeddc0SDimitry Andric (!cast<Instruction>(OpBaseName#"rvml_v") 34*04eeddc0SDimitry Andric ScalarVT:$sx, 35*04eeddc0SDimitry Andric $vy, 36*04eeddc0SDimitry Andric $mask, 37*04eeddc0SDimitry Andric $pivot, 38*04eeddc0SDimitry Andric $vfalse)>; 390eae32dcSDimitry Andric 400eae32dcSDimitry Andric // Unmasked, broadcast. 41e8d8bef9SDimitry Andric def : Pat<(OpNode 420eae32dcSDimitry Andric (any_broadcast ScalarVT:$sx), DataVT:$vy, 430eae32dcSDimitry Andric (MaskVT true_mask), 440eae32dcSDimitry Andric i32:$avl), 45e8d8bef9SDimitry Andric (!cast<Instruction>(OpBaseName#"rvl") 46e8d8bef9SDimitry Andric ScalarVT:$sx, $vy, $avl)>; 470eae32dcSDimitry Andric // Masked, broadcast. 480eae32dcSDimitry Andric def : Pat<(OpNode 490eae32dcSDimitry Andric (any_broadcast ScalarVT:$sx), DataVT:$vy, 500eae32dcSDimitry Andric MaskVT:$mask, 510eae32dcSDimitry Andric i32:$avl), 520eae32dcSDimitry Andric (!cast<Instruction>(OpBaseName#"rvml") 530eae32dcSDimitry Andric ScalarVT:$sx, $vy, $mask, $avl)>; 540eae32dcSDimitry Andric} 550eae32dcSDimitry Andric 560eae32dcSDimitry Andricmulticlass Binary_vr<SDPatternOperator OpNode, 570eae32dcSDimitry Andric ValueType ScalarVT, ValueType DataVT, 580eae32dcSDimitry Andric ValueType MaskVT, string OpBaseName> { 59*04eeddc0SDimitry Andric // Masked with passthru, broadcast. 60*04eeddc0SDimitry Andric def : Pat<(vvp_select 61*04eeddc0SDimitry Andric (OpNode 62*04eeddc0SDimitry Andric DataVT:$vx, 63*04eeddc0SDimitry Andric (any_broadcast ScalarVT:$sy), 64*04eeddc0SDimitry Andric (MaskVT srcvalue), 65*04eeddc0SDimitry Andric (i32 srcvalue)), 66*04eeddc0SDimitry Andric DataVT:$vfalse, 67*04eeddc0SDimitry Andric MaskVT:$mask, 68*04eeddc0SDimitry Andric i32:$pivot), 69*04eeddc0SDimitry Andric (!cast<Instruction>(OpBaseName#"vrml_v") 70*04eeddc0SDimitry Andric $vx, 71*04eeddc0SDimitry Andric ScalarVT:$sy, 72*04eeddc0SDimitry Andric $mask, 73*04eeddc0SDimitry Andric $pivot, 74*04eeddc0SDimitry Andric $vfalse)>; 750eae32dcSDimitry Andric 760eae32dcSDimitry Andric // Unmasked, broadcast. 770eae32dcSDimitry Andric def : Pat<(OpNode 780eae32dcSDimitry Andric DataVT:$vx, (any_broadcast ScalarVT:$sy), 790eae32dcSDimitry Andric (MaskVT true_mask), 800eae32dcSDimitry Andric i32:$avl), 810eae32dcSDimitry Andric (!cast<Instruction>(OpBaseName#"vrl") 820eae32dcSDimitry Andric $vx, ScalarVT:$sy, $avl)>; 830eae32dcSDimitry Andric // Masked, broadcast. 840eae32dcSDimitry Andric def : Pat<(OpNode 850eae32dcSDimitry Andric DataVT:$vx, (any_broadcast ScalarVT:$sy), 860eae32dcSDimitry Andric MaskVT:$mask, 870eae32dcSDimitry Andric i32:$avl), 880eae32dcSDimitry Andric (!cast<Instruction>(OpBaseName#"vrml") 890eae32dcSDimitry Andric $vx, ScalarVT:$sy, $mask, $avl)>; 900eae32dcSDimitry Andric} 910eae32dcSDimitry Andric 920eae32dcSDimitry Andricmulticlass Binary_vv<SDPatternOperator OpNode, 930eae32dcSDimitry Andric ValueType DataVT, 940eae32dcSDimitry Andric ValueType MaskVT, string OpBaseName> { 95*04eeddc0SDimitry Andric // Masked with passthru, broadcast. 96*04eeddc0SDimitry Andric def : Pat<(vvp_select 97*04eeddc0SDimitry Andric (OpNode 98*04eeddc0SDimitry Andric DataVT:$vx, 99*04eeddc0SDimitry Andric DataVT:$vy, 100*04eeddc0SDimitry Andric (MaskVT srcvalue), 101*04eeddc0SDimitry Andric (i32 srcvalue)), 102*04eeddc0SDimitry Andric DataVT:$vfalse, 103*04eeddc0SDimitry Andric MaskVT:$mask, 104*04eeddc0SDimitry Andric i32:$pivot), 105*04eeddc0SDimitry Andric (!cast<Instruction>(OpBaseName#"vvml_v") 106*04eeddc0SDimitry Andric $vx, 107*04eeddc0SDimitry Andric $vy, 108*04eeddc0SDimitry Andric $mask, 109*04eeddc0SDimitry Andric $pivot, 110*04eeddc0SDimitry Andric $vfalse)>; 111*04eeddc0SDimitry Andric 1120eae32dcSDimitry Andric // Masked with select. 1130eae32dcSDimitry Andric // TODO 1140eae32dcSDimitry Andric 1150eae32dcSDimitry Andric // Unmasked. 1160eae32dcSDimitry Andric def : Pat<(OpNode 1170eae32dcSDimitry Andric DataVT:$vx, DataVT:$vy, 1180eae32dcSDimitry Andric (MaskVT true_mask), 1190eae32dcSDimitry Andric i32:$avl), 120e8d8bef9SDimitry Andric (!cast<Instruction>(OpBaseName#"vvl") 121e8d8bef9SDimitry Andric $vx, $vy, $avl)>; 122e8d8bef9SDimitry Andric 1230eae32dcSDimitry Andric // Masked. 124e8d8bef9SDimitry Andric def : Pat<(OpNode 1250eae32dcSDimitry Andric DataVT:$vx, DataVT:$vy, 1260eae32dcSDimitry Andric MaskVT:$mask, 1270eae32dcSDimitry Andric i32:$avl), 128e8d8bef9SDimitry Andric (!cast<Instruction>(OpBaseName#"vvml") 129e8d8bef9SDimitry Andric $vx, $vy, $mask, $avl)>; 1300eae32dcSDimitry Andric} 131e8d8bef9SDimitry Andric 1320eae32dcSDimitry Andricmulticlass Binary_rv_vv< 1330eae32dcSDimitry Andric SDPatternOperator OpNode, 1340eae32dcSDimitry Andric ValueType ScalarVT, ValueType DataVT, ValueType MaskVT, 1350eae32dcSDimitry Andric string OpBaseName> { 1360eae32dcSDimitry Andric defm : Binary_rv<OpNode, ScalarVT, DataVT, MaskVT, OpBaseName>; 1370eae32dcSDimitry Andric defm : Binary_vv<OpNode, DataVT, MaskVT, OpBaseName>; 1380eae32dcSDimitry Andric} 139e8d8bef9SDimitry Andric 1400eae32dcSDimitry Andricmulticlass Binary_vr_vv< 1410eae32dcSDimitry Andric SDPatternOperator OpNode, 1420eae32dcSDimitry Andric ValueType ScalarVT, ValueType DataVT, ValueType MaskVT, 1430eae32dcSDimitry Andric string OpBaseName> { 1440eae32dcSDimitry Andric defm : Binary_vr<OpNode, ScalarVT, DataVT, MaskVT, OpBaseName>; 1450eae32dcSDimitry Andric defm : Binary_vv<OpNode, DataVT, MaskVT, OpBaseName>; 1460eae32dcSDimitry Andric} 1470eae32dcSDimitry Andric 1480eae32dcSDimitry Andricmulticlass Binary_rv_vr_vv< 1490eae32dcSDimitry Andric SDPatternOperator OpNode, 1500eae32dcSDimitry Andric ValueType ScalarVT, ValueType DataVT, ValueType MaskVT, 1510eae32dcSDimitry Andric string OpBaseName> { 1520eae32dcSDimitry Andric defm : Binary_rv<OpNode, ScalarVT, DataVT, MaskVT, OpBaseName>; 1530eae32dcSDimitry Andric defm : Binary_vr_vv<OpNode, ScalarVT, DataVT, MaskVT, OpBaseName>; 154e8d8bef9SDimitry Andric} 155e8d8bef9SDimitry Andric 156e8d8bef9SDimitry Andric// Expand both 64bit and 32 bit variant (256 elements) 1570eae32dcSDimitry Andricmulticlass Binary_rv_vv_ShortLong< 158e8d8bef9SDimitry Andric SDPatternOperator OpNode, 159e8d8bef9SDimitry Andric ValueType LongScalarVT, ValueType LongDataVT, string LongOpBaseName, 160e8d8bef9SDimitry Andric ValueType ShortScalarVT, ValueType ShortDataVT, string ShortOpBaseName> { 1610eae32dcSDimitry Andric defm : Binary_rv_vv<OpNode, 162e8d8bef9SDimitry Andric LongScalarVT, LongDataVT, v256i1, 163349cc55cSDimitry Andric LongOpBaseName>; 1640eae32dcSDimitry Andric defm : Binary_rv_vv<OpNode, 165e8d8bef9SDimitry Andric ShortScalarVT, ShortDataVT, v256i1, 166349cc55cSDimitry Andric ShortOpBaseName>; 167e8d8bef9SDimitry Andric} 168e8d8bef9SDimitry Andric 1690eae32dcSDimitry Andricmulticlass Binary_vr_vv_ShortLong< 1700eae32dcSDimitry Andric SDPatternOperator OpNode, 1710eae32dcSDimitry Andric ValueType LongScalarVT, ValueType LongDataVT, string LongOpBaseName, 1720eae32dcSDimitry Andric ValueType ShortScalarVT, ValueType ShortDataVT, string ShortOpBaseName> { 1730eae32dcSDimitry Andric defm : Binary_vr_vv<OpNode, 1740eae32dcSDimitry Andric LongScalarVT, LongDataVT, v256i1, 1750eae32dcSDimitry Andric LongOpBaseName>; 1760eae32dcSDimitry Andric defm : Binary_vr_vv<OpNode, 1770eae32dcSDimitry Andric ShortScalarVT, ShortDataVT, v256i1, 1780eae32dcSDimitry Andric ShortOpBaseName>; 1790eae32dcSDimitry Andric} 180e8d8bef9SDimitry Andric 1810eae32dcSDimitry Andricmulticlass Binary_rv_vr_vv_ShortLong< 1820eae32dcSDimitry Andric SDPatternOperator OpNode, 1830eae32dcSDimitry Andric ValueType LongScalarVT, ValueType LongDataVT, string LongOpBaseName, 1840eae32dcSDimitry Andric ValueType ShortScalarVT, ValueType ShortDataVT, string ShortOpBaseName> { 1850eae32dcSDimitry Andric defm : Binary_rv_vr_vv<OpNode, 1860eae32dcSDimitry Andric LongScalarVT, LongDataVT, v256i1, 1870eae32dcSDimitry Andric LongOpBaseName>; 1880eae32dcSDimitry Andric defm : Binary_rv_vr_vv<OpNode, 1890eae32dcSDimitry Andric ShortScalarVT, ShortDataVT, v256i1, 1900eae32dcSDimitry Andric ShortOpBaseName>; 1910eae32dcSDimitry Andric} 1920eae32dcSDimitry Andric 1930eae32dcSDimitry Andricdefm : Binary_rv_vv_ShortLong<c_vvp_add, 194e8d8bef9SDimitry Andric i64, v256i64, "VADDSL", 195e8d8bef9SDimitry Andric i32, v256i32, "VADDSWSX">; 1960eae32dcSDimitry Andricdefm : Binary_rv_vv_ShortLong<vvp_sub, 1970eae32dcSDimitry Andric i64, v256i64, "VSUBSL", 1980eae32dcSDimitry Andric i32, v256i32, "VSUBSWSX">; 1990eae32dcSDimitry Andricdefm : Binary_rv_vv_ShortLong<c_vvp_mul, 2000eae32dcSDimitry Andric i64, v256i64, "VMULSL", 2010eae32dcSDimitry Andric i32, v256i32, "VMULSWSX">; 2020eae32dcSDimitry Andricdefm : Binary_rv_vr_vv_ShortLong<vvp_sdiv, 2030eae32dcSDimitry Andric i64, v256i64, "VDIVSL", 2040eae32dcSDimitry Andric i32, v256i32, "VDIVSWSX">; 2050eae32dcSDimitry Andricdefm : Binary_rv_vr_vv_ShortLong<vvp_udiv, 2060eae32dcSDimitry Andric i64, v256i64, "VDIVUL", 2070eae32dcSDimitry Andric i32, v256i32, "VDIVUW">; 2080eae32dcSDimitry Andricdefm : Binary_rv_vv_ShortLong<c_vvp_and, 209e8d8bef9SDimitry Andric i64, v256i64, "VAND", 210e8d8bef9SDimitry Andric i32, v256i32, "PVANDLO">; 2110eae32dcSDimitry Andricdefm : Binary_rv_vv_ShortLong<c_vvp_or, 2120eae32dcSDimitry Andric i64, v256i64, "VOR", 2130eae32dcSDimitry Andric i32, v256i32, "PVORLO">; 2140eae32dcSDimitry Andricdefm : Binary_rv_vv_ShortLong<c_vvp_xor, 2150eae32dcSDimitry Andric i64, v256i64, "VXOR", 2160eae32dcSDimitry Andric i32, v256i32, "PVXORLO">; 2170eae32dcSDimitry Andricdefm : Binary_vr_vv_ShortLong<vvp_shl, 2180eae32dcSDimitry Andric i64, v256i64, "VSLL", 2190eae32dcSDimitry Andric i32, v256i32, "PVSLLLO">; 2200eae32dcSDimitry Andricdefm : Binary_vr_vv_ShortLong<vvp_sra, 2210eae32dcSDimitry Andric i64, v256i64, "VSRAL", 2220eae32dcSDimitry Andric i32, v256i32, "PVSRALO">; 2230eae32dcSDimitry Andricdefm : Binary_vr_vv_ShortLong<vvp_srl, 2240eae32dcSDimitry Andric i64, v256i64, "VSRL", 2250eae32dcSDimitry Andric i32, v256i32, "PVSRLLO">; 2260eae32dcSDimitry Andric 2270eae32dcSDimitry Andricdefm : Binary_rv_vv_ShortLong<c_vvp_fadd, 2280eae32dcSDimitry Andric f64, v256f64, "VFADDD", 2290eae32dcSDimitry Andric f32, v256f32, "PVFADDUP">; 2300eae32dcSDimitry Andricdefm : Binary_rv_vv_ShortLong<c_vvp_fmul, 2310eae32dcSDimitry Andric f64, v256f64, "VFMULD", 2320eae32dcSDimitry Andric f32, v256f32, "PVFMULUP">; 2330eae32dcSDimitry Andricdefm : Binary_rv_vv_ShortLong<vvp_fsub, 2340eae32dcSDimitry Andric f64, v256f64, "VFSUBD", 2350eae32dcSDimitry Andric f32, v256f32, "PVFSUBUP">; 2360eae32dcSDimitry Andricdefm : Binary_rv_vr_vv_ShortLong<vvp_fdiv, 2370eae32dcSDimitry Andric f64, v256f64, "VFDIVD", 2380eae32dcSDimitry Andric f32, v256f32, "VFDIVS">; 239*04eeddc0SDimitry Andric 240*04eeddc0SDimitry Andricmulticlass Merge_mvv< 241*04eeddc0SDimitry Andric SDPatternOperator OpNode, 242*04eeddc0SDimitry Andric ValueType DataVT, ValueType MaskVT, 243*04eeddc0SDimitry Andric string OpBaseName> { 244*04eeddc0SDimitry Andric // Masked. 245*04eeddc0SDimitry Andric def : Pat<(OpNode 246*04eeddc0SDimitry Andric DataVT:$vtrue, DataVT:$vfalse, 247*04eeddc0SDimitry Andric MaskVT:$vm, 248*04eeddc0SDimitry Andric i32:$avl), 249*04eeddc0SDimitry Andric (!cast<Instruction>(OpBaseName#"vvml_v") 250*04eeddc0SDimitry Andric $vfalse, $vtrue, $vm, $avl, $vfalse)>; 251*04eeddc0SDimitry Andric} 252*04eeddc0SDimitry Andric 253*04eeddc0SDimitry Andricmulticlass Merge_mvv_ShortLong< 254*04eeddc0SDimitry Andric SDPatternOperator OpNode, 255*04eeddc0SDimitry Andric ValueType LongDataVT, ValueType ShortDataVT, 256*04eeddc0SDimitry Andric string OpBaseName> { 257*04eeddc0SDimitry Andric defm : Merge_mvv<OpNode, 258*04eeddc0SDimitry Andric LongDataVT, v256i1, 259*04eeddc0SDimitry Andric OpBaseName>; 260*04eeddc0SDimitry Andric defm : Merge_mvv<OpNode, 261*04eeddc0SDimitry Andric ShortDataVT, v256i1, 262*04eeddc0SDimitry Andric OpBaseName>; 263*04eeddc0SDimitry Andric} 264*04eeddc0SDimitry Andric 265*04eeddc0SDimitry Andricdefm : Merge_mvv_ShortLong<vvp_select, 266*04eeddc0SDimitry Andric v256f64, 267*04eeddc0SDimitry Andric v256f32, "VMRG">; 268*04eeddc0SDimitry Andricdefm : Merge_mvv_ShortLong<vvp_select, 269*04eeddc0SDimitry Andric v256i64, 270*04eeddc0SDimitry Andric v256i32, "VMRG">; 271