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*81ad6265SDimitry Andricmulticlass VectorStore<ValueType DataVT, 21*81ad6265SDimitry Andric ValueType PtrVT, ValueType MaskVT, 22*81ad6265SDimitry Andric string STWithMask, string STNoMask> { 23*81ad6265SDimitry Andric // Unmasked (imm stride). 24*81ad6265SDimitry Andric def : Pat<(vvp_store 25*81ad6265SDimitry Andric DataVT:$val, PtrVT:$addr, 26*81ad6265SDimitry Andric (i64 simm7:$stride), (MaskVT true_mask), i32:$avl), 27*81ad6265SDimitry Andric (!cast<Instruction>(STNoMask#"irvl") 28*81ad6265SDimitry Andric (LO7 $stride), $addr, $val, $avl)>; 29*81ad6265SDimitry Andric // Unmasked. 30*81ad6265SDimitry Andric def : Pat<(vvp_store 31*81ad6265SDimitry Andric DataVT:$val, PtrVT:$addr, 32*81ad6265SDimitry Andric i64:$stride, (MaskVT true_mask), i32:$avl), 33*81ad6265SDimitry Andric (!cast<Instruction>(STNoMask#"rrvl") 34*81ad6265SDimitry Andric $stride, $addr, $val, $avl)>; 35*81ad6265SDimitry Andric // Masked (imm stride). 36*81ad6265SDimitry Andric def : Pat<(vvp_store 37*81ad6265SDimitry Andric DataVT:$val, PtrVT:$addr, 38*81ad6265SDimitry Andric (i64 simm7:$stride), MaskVT:$mask, i32:$avl), 39*81ad6265SDimitry Andric (!cast<Instruction>(STWithMask#"irvml") 40*81ad6265SDimitry Andric (LO7 $stride), $addr, $val, $mask, $avl)>; 41*81ad6265SDimitry Andric // Masked. 42*81ad6265SDimitry Andric def : Pat<(vvp_store 43*81ad6265SDimitry Andric DataVT:$val, PtrVT:$addr, 44*81ad6265SDimitry Andric i64:$stride, MaskVT:$mask, i32:$avl), 45*81ad6265SDimitry Andric (!cast<Instruction>(STWithMask#"rrvml") 46*81ad6265SDimitry Andric $stride, $addr, $val, $mask, $avl)>; 47*81ad6265SDimitry Andric} 48*81ad6265SDimitry Andric 49*81ad6265SDimitry Andricdefm : VectorStore<v256f64, i64, v256i1, "VST", "VST">; 50*81ad6265SDimitry Andricdefm : VectorStore<v256i64, i64, v256i1, "VST", "VST">; 51*81ad6265SDimitry Andricdefm : VectorStore<v256f32, i64, v256i1, "VSTU", "VSTU">; 52*81ad6265SDimitry Andricdefm : VectorStore<v256i32, i64, v256i1, "VSTL", "VSTL">; 53*81ad6265SDimitry Andric 54*81ad6265SDimitry Andricmulticlass VectorLoad<ValueType DataVT, 55*81ad6265SDimitry Andric ValueType PtrVT, ValueType MaskVT, 56*81ad6265SDimitry Andric string GTWithMask, string LDNoMask> { 57*81ad6265SDimitry Andric // Unmasked (imm stride). 58*81ad6265SDimitry Andric def : Pat<(DataVT (vvp_load 59*81ad6265SDimitry Andric PtrVT:$addr, (i64 simm7:$stride), 60*81ad6265SDimitry Andric (MaskVT true_mask), i32:$avl)), 61*81ad6265SDimitry Andric (!cast<Instruction>(LDNoMask#"irl") 62*81ad6265SDimitry Andric (LO7 $stride), $addr, $avl)>; 63*81ad6265SDimitry Andric // Unmasked. 64*81ad6265SDimitry Andric def : Pat<(DataVT (vvp_load 65*81ad6265SDimitry Andric PtrVT:$addr, i64:$stride, 66*81ad6265SDimitry Andric (MaskVT true_mask), i32:$avl)), 67*81ad6265SDimitry Andric (!cast<Instruction>(LDNoMask#"rrl") 68*81ad6265SDimitry Andric $stride, PtrVT:$addr, $avl)>; 69*81ad6265SDimitry Andric // Masked (imm stride). 70*81ad6265SDimitry Andric def : Pat<(DataVT (vvp_load 71*81ad6265SDimitry Andric PtrVT:$addr, (i64 simm7:$stride), 72*81ad6265SDimitry Andric MaskVT:$mask, i32:$avl)), 73*81ad6265SDimitry Andric (!cast<Instruction>(GTWithMask#"vizml") 74*81ad6265SDimitry Andric (VADDULrvml $addr, 75*81ad6265SDimitry Andric (VMULULivml (LO7 $stride), (VSEQl $avl), $mask, $avl), 76*81ad6265SDimitry Andric $mask, $avl), 77*81ad6265SDimitry Andric 0, 0, 78*81ad6265SDimitry Andric $mask, 79*81ad6265SDimitry Andric $avl)>; 80*81ad6265SDimitry Andric // Masked. 81*81ad6265SDimitry Andric def : Pat<(DataVT (vvp_load 82*81ad6265SDimitry Andric PtrVT:$addr, i64:$stride, MaskVT:$mask, i32:$avl)), 83*81ad6265SDimitry Andric (!cast<Instruction>(GTWithMask#"vizml") 84*81ad6265SDimitry Andric (VADDULrvml $addr, 85*81ad6265SDimitry Andric (VMULULrvml $stride, (VSEQl $avl), $mask, $avl), 86*81ad6265SDimitry Andric $mask, $avl), 87*81ad6265SDimitry Andric 0, 0, 88*81ad6265SDimitry Andric $mask, 89*81ad6265SDimitry Andric $avl)>; 90*81ad6265SDimitry Andric} 91*81ad6265SDimitry Andric 92*81ad6265SDimitry Andricdefm : VectorLoad<v256f64, i64, v256i1, "VGT", "VLD">; 93*81ad6265SDimitry Andricdefm : VectorLoad<v256i64, i64, v256i1, "VGT", "VLD">; 94*81ad6265SDimitry Andricdefm : VectorLoad<v256f32, i64, v256i1, "VGTU", "VLDU">; 95*81ad6265SDimitry Andricdefm : VectorLoad<v256i32, i64, v256i1, "VGTLZX", "VLDLZX">; 96*81ad6265SDimitry Andric 97*81ad6265SDimitry Andric// Vector Gather and scatter 98*81ad6265SDimitry Andricmulticlass VectorGather<ValueType DataVT, 99*81ad6265SDimitry Andric ValueType PtrVT, ValueType MaskVT, 100*81ad6265SDimitry Andric string GTPrefix> { 101*81ad6265SDimitry Andric // Unmasked. 102*81ad6265SDimitry Andric def : Pat<(DataVT (vvp_gather 103*81ad6265SDimitry Andric PtrVT:$addr, (MaskVT true_mask), i32:$avl)), 104*81ad6265SDimitry Andric (!cast<Instruction>(GTPrefix#"vizl") $addr, 0, 0, $avl)>; 105*81ad6265SDimitry Andric // Masked. 106*81ad6265SDimitry Andric def : Pat<(DataVT (vvp_gather PtrVT:$addr, MaskVT:$mask, i32:$avl)), 107*81ad6265SDimitry Andric (!cast<Instruction>(GTPrefix#"vizml") $addr, 0, 0, $mask, $avl)>; 108*81ad6265SDimitry Andric} 109*81ad6265SDimitry Andric 110*81ad6265SDimitry Andricdefm : VectorGather<v256f64, v256i64, v256i1, "VGT">; 111*81ad6265SDimitry Andricdefm : VectorGather<v256i64, v256i64, v256i1, "VGT">; 112*81ad6265SDimitry Andricdefm : VectorGather<v256f32, v256i64, v256i1, "VGTU">; 113*81ad6265SDimitry Andricdefm : VectorGather<v256i32, v256i64, v256i1, "VGTLZX">; 114*81ad6265SDimitry Andric 115*81ad6265SDimitry Andricmulticlass VectorScatter<ValueType DataVT, 116*81ad6265SDimitry Andric ValueType PtrVT, ValueType MaskVT, 117*81ad6265SDimitry Andric string SCPrefix> { 118*81ad6265SDimitry Andric // Unmasked. 119*81ad6265SDimitry Andric def : Pat<(vvp_scatter 120*81ad6265SDimitry Andric DataVT:$data, PtrVT:$addr, (MaskVT true_mask), i32:$avl), 121*81ad6265SDimitry Andric (!cast<Instruction>(SCPrefix#"vizvl") $addr, 0, 0, $data, $avl)>; 122*81ad6265SDimitry Andric // Masked. 123*81ad6265SDimitry Andric def : Pat<(vvp_scatter 124*81ad6265SDimitry Andric DataVT:$data, PtrVT:$addr, MaskVT:$mask, i32:$avl), 125*81ad6265SDimitry Andric (!cast<Instruction>(SCPrefix#"vizvml") $addr, 0, 0, $data, $mask, $avl)>; 126*81ad6265SDimitry Andric} 127*81ad6265SDimitry Andric 128*81ad6265SDimitry Andricdefm : VectorScatter<v256f64, v256i64, v256i1, "VSC">; 129*81ad6265SDimitry Andricdefm : VectorScatter<v256i64, v256i64, v256i1, "VSC">; 130*81ad6265SDimitry Andricdefm : VectorScatter<v256f32, v256i64, v256i1, "VSCU">; 131*81ad6265SDimitry Andricdefm : VectorScatter<v256i32, v256i64, v256i1, "VSCL">; 132*81ad6265SDimitry Andric 133*81ad6265SDimitry Andric 134*81ad6265SDimitry Andric/// FNEG { 135*81ad6265SDimitry Andric// Directly modify the sign bit to flip the sign. 136*81ad6265SDimitry Andric 137*81ad6265SDimitry Andric// Set sign bits in a pack of <2 x f32>. 138*81ad6265SDimitry Andricdef packed_fneg_imm : OutPatFrag<(ins ), 139*81ad6265SDimitry Andric (i64 (SLLri (i64 (ORim 1, (i32 32))), 31))>; 140*81ad6265SDimitry Andric 141*81ad6265SDimitry Andric 142*81ad6265SDimitry Andricmulticlass FNeg<ValueType DataVT> { 143*81ad6265SDimitry Andric // Masked with select. 144*81ad6265SDimitry Andric def : Pat<(vvp_select (vvp_fneg DataVT:$vx, (v256i1 srcvalue), (i32 srcvalue)), 145*81ad6265SDimitry Andric DataVT:$vfalse, 146*81ad6265SDimitry Andric v256i1:$mask, 147*81ad6265SDimitry Andric i32:$avl), 148*81ad6265SDimitry Andric (VXORmvml_v (i32 1), $vx, $mask, $avl, $vfalse)>; 149*81ad6265SDimitry Andric 150*81ad6265SDimitry Andric // Unmasked. 151*81ad6265SDimitry Andric def : Pat<(vvp_fneg DataVT:$vx, (v256i1 true_mask), i32:$avl), 152*81ad6265SDimitry Andric (VXORmvl (i32 1), $vx, $avl)>; 153*81ad6265SDimitry Andric 154*81ad6265SDimitry Andric // Masked. 155*81ad6265SDimitry Andric def : Pat<(vvp_fneg DataVT:$vx, v256i1:$mask, i32:$avl), 156*81ad6265SDimitry Andric (VXORmvml (i32 1), $vx, $mask, $avl)>; 157*81ad6265SDimitry Andric} 158*81ad6265SDimitry Andric 159*81ad6265SDimitry Andricdefm: FNeg<v256f32>; 160*81ad6265SDimitry Andricdefm: FNeg<v256f64>; 161*81ad6265SDimitry Andric 162*81ad6265SDimitry Andric///// Packed FNeg ///// 163*81ad6265SDimitry Andric 164*81ad6265SDimitry Andric// Masked with select. 165*81ad6265SDimitry Andricdef : Pat<(vvp_select (vvp_fneg v512f32:$vx, (v512i1 srcvalue), (i32 srcvalue)), 166*81ad6265SDimitry Andric v512f32:$vfalse, 167*81ad6265SDimitry Andric v512i1:$mask, 168*81ad6265SDimitry Andric i32:$avl), 169*81ad6265SDimitry Andric (v512f32 (PVXORrvml_v (packed_fneg_imm ), $vx, $mask, $avl, $vfalse))>; 170*81ad6265SDimitry Andric 171*81ad6265SDimitry Andric// Unmasked. 172*81ad6265SDimitry Andricdef : Pat<(vvp_fneg v512f32:$vx, (v512i1 true_mask), i32:$avl), 173*81ad6265SDimitry Andric (v512f32 (PVXORrvl (packed_fneg_imm ), $vx, $avl))>; 174*81ad6265SDimitry Andric 175*81ad6265SDimitry Andric// Masked. 176*81ad6265SDimitry Andricdef : Pat<(vvp_fneg v512f32:$vx, v512i1:$mask, i32:$avl), 177*81ad6265SDimitry Andric (v512f32 (PVXORrvml (packed_fneg_imm ), $vx, $mask, $avl))>; 178*81ad6265SDimitry Andric 179*81ad6265SDimitry Andric/// } FNEG 180*81ad6265SDimitry Andric 1810eae32dcSDimitry Andricmulticlass Binary_rv<SDPatternOperator OpNode, 1820eae32dcSDimitry Andric ValueType ScalarVT, ValueType DataVT, 1830eae32dcSDimitry Andric ValueType MaskVT, string OpBaseName> { 18404eeddc0SDimitry Andric // Masked with passthru, broadcast. 18504eeddc0SDimitry Andric def : Pat<(vvp_select 18604eeddc0SDimitry Andric (OpNode 18704eeddc0SDimitry Andric (any_broadcast ScalarVT:$sx), 18804eeddc0SDimitry Andric DataVT:$vy, 18904eeddc0SDimitry Andric (MaskVT srcvalue), 19004eeddc0SDimitry Andric (i32 srcvalue)), 19104eeddc0SDimitry Andric DataVT:$vfalse, 19204eeddc0SDimitry Andric MaskVT:$mask, 19304eeddc0SDimitry Andric i32:$pivot), 19404eeddc0SDimitry Andric (!cast<Instruction>(OpBaseName#"rvml_v") 19504eeddc0SDimitry Andric ScalarVT:$sx, 19604eeddc0SDimitry Andric $vy, 19704eeddc0SDimitry Andric $mask, 19804eeddc0SDimitry Andric $pivot, 19904eeddc0SDimitry Andric $vfalse)>; 2000eae32dcSDimitry Andric 2010eae32dcSDimitry Andric // Unmasked, broadcast. 202e8d8bef9SDimitry Andric def : Pat<(OpNode 2030eae32dcSDimitry Andric (any_broadcast ScalarVT:$sx), DataVT:$vy, 2040eae32dcSDimitry Andric (MaskVT true_mask), 2050eae32dcSDimitry Andric i32:$avl), 206e8d8bef9SDimitry Andric (!cast<Instruction>(OpBaseName#"rvl") 207e8d8bef9SDimitry Andric ScalarVT:$sx, $vy, $avl)>; 2080eae32dcSDimitry Andric // Masked, broadcast. 2090eae32dcSDimitry Andric def : Pat<(OpNode 2100eae32dcSDimitry Andric (any_broadcast ScalarVT:$sx), DataVT:$vy, 2110eae32dcSDimitry Andric MaskVT:$mask, 2120eae32dcSDimitry Andric i32:$avl), 2130eae32dcSDimitry Andric (!cast<Instruction>(OpBaseName#"rvml") 2140eae32dcSDimitry Andric ScalarVT:$sx, $vy, $mask, $avl)>; 2150eae32dcSDimitry Andric} 2160eae32dcSDimitry Andric 2170eae32dcSDimitry Andricmulticlass Binary_vr<SDPatternOperator OpNode, 2180eae32dcSDimitry Andric ValueType ScalarVT, ValueType DataVT, 2190eae32dcSDimitry Andric ValueType MaskVT, string OpBaseName> { 22004eeddc0SDimitry Andric // Masked with passthru, broadcast. 22104eeddc0SDimitry Andric def : Pat<(vvp_select 22204eeddc0SDimitry Andric (OpNode 22304eeddc0SDimitry Andric DataVT:$vx, 22404eeddc0SDimitry Andric (any_broadcast ScalarVT:$sy), 22504eeddc0SDimitry Andric (MaskVT srcvalue), 22604eeddc0SDimitry Andric (i32 srcvalue)), 22704eeddc0SDimitry Andric DataVT:$vfalse, 22804eeddc0SDimitry Andric MaskVT:$mask, 22904eeddc0SDimitry Andric i32:$pivot), 23004eeddc0SDimitry Andric (!cast<Instruction>(OpBaseName#"vrml_v") 23104eeddc0SDimitry Andric $vx, 23204eeddc0SDimitry Andric ScalarVT:$sy, 23304eeddc0SDimitry Andric $mask, 23404eeddc0SDimitry Andric $pivot, 23504eeddc0SDimitry Andric $vfalse)>; 2360eae32dcSDimitry Andric 2370eae32dcSDimitry Andric // Unmasked, broadcast. 2380eae32dcSDimitry Andric def : Pat<(OpNode 2390eae32dcSDimitry Andric DataVT:$vx, (any_broadcast ScalarVT:$sy), 2400eae32dcSDimitry Andric (MaskVT true_mask), 2410eae32dcSDimitry Andric i32:$avl), 2420eae32dcSDimitry Andric (!cast<Instruction>(OpBaseName#"vrl") 2430eae32dcSDimitry Andric $vx, ScalarVT:$sy, $avl)>; 2440eae32dcSDimitry Andric // Masked, broadcast. 2450eae32dcSDimitry Andric def : Pat<(OpNode 2460eae32dcSDimitry Andric DataVT:$vx, (any_broadcast ScalarVT:$sy), 2470eae32dcSDimitry Andric MaskVT:$mask, 2480eae32dcSDimitry Andric i32:$avl), 2490eae32dcSDimitry Andric (!cast<Instruction>(OpBaseName#"vrml") 2500eae32dcSDimitry Andric $vx, ScalarVT:$sy, $mask, $avl)>; 2510eae32dcSDimitry Andric} 2520eae32dcSDimitry Andric 2530eae32dcSDimitry Andricmulticlass Binary_vv<SDPatternOperator OpNode, 2540eae32dcSDimitry Andric ValueType DataVT, 2550eae32dcSDimitry Andric ValueType MaskVT, string OpBaseName> { 25604eeddc0SDimitry Andric // Masked with passthru, broadcast. 25704eeddc0SDimitry Andric def : Pat<(vvp_select 25804eeddc0SDimitry Andric (OpNode 25904eeddc0SDimitry Andric DataVT:$vx, 26004eeddc0SDimitry Andric DataVT:$vy, 26104eeddc0SDimitry Andric (MaskVT srcvalue), 26204eeddc0SDimitry Andric (i32 srcvalue)), 26304eeddc0SDimitry Andric DataVT:$vfalse, 26404eeddc0SDimitry Andric MaskVT:$mask, 26504eeddc0SDimitry Andric i32:$pivot), 26604eeddc0SDimitry Andric (!cast<Instruction>(OpBaseName#"vvml_v") 26704eeddc0SDimitry Andric $vx, 26804eeddc0SDimitry Andric $vy, 26904eeddc0SDimitry Andric $mask, 27004eeddc0SDimitry Andric $pivot, 27104eeddc0SDimitry Andric $vfalse)>; 27204eeddc0SDimitry Andric 2730eae32dcSDimitry Andric // Masked with select. 2740eae32dcSDimitry Andric // TODO 2750eae32dcSDimitry Andric 2760eae32dcSDimitry Andric // Unmasked. 2770eae32dcSDimitry Andric def : Pat<(OpNode 2780eae32dcSDimitry Andric DataVT:$vx, DataVT:$vy, 2790eae32dcSDimitry Andric (MaskVT true_mask), 2800eae32dcSDimitry Andric i32:$avl), 281e8d8bef9SDimitry Andric (!cast<Instruction>(OpBaseName#"vvl") 282e8d8bef9SDimitry Andric $vx, $vy, $avl)>; 283e8d8bef9SDimitry Andric 2840eae32dcSDimitry Andric // Masked. 285e8d8bef9SDimitry Andric def : Pat<(OpNode 2860eae32dcSDimitry Andric DataVT:$vx, DataVT:$vy, 2870eae32dcSDimitry Andric MaskVT:$mask, 2880eae32dcSDimitry Andric i32:$avl), 289e8d8bef9SDimitry Andric (!cast<Instruction>(OpBaseName#"vvml") 290e8d8bef9SDimitry Andric $vx, $vy, $mask, $avl)>; 2910eae32dcSDimitry Andric} 292e8d8bef9SDimitry Andric 2930eae32dcSDimitry Andricmulticlass Binary_rv_vv< 2940eae32dcSDimitry Andric SDPatternOperator OpNode, 2950eae32dcSDimitry Andric ValueType ScalarVT, ValueType DataVT, ValueType MaskVT, 2960eae32dcSDimitry Andric string OpBaseName> { 2970eae32dcSDimitry Andric defm : Binary_rv<OpNode, ScalarVT, DataVT, MaskVT, OpBaseName>; 2980eae32dcSDimitry Andric defm : Binary_vv<OpNode, DataVT, MaskVT, OpBaseName>; 2990eae32dcSDimitry Andric} 300e8d8bef9SDimitry Andric 3010eae32dcSDimitry Andricmulticlass Binary_vr_vv< 3020eae32dcSDimitry Andric SDPatternOperator OpNode, 3030eae32dcSDimitry Andric ValueType ScalarVT, ValueType DataVT, ValueType MaskVT, 3040eae32dcSDimitry Andric string OpBaseName> { 3050eae32dcSDimitry Andric defm : Binary_vr<OpNode, ScalarVT, DataVT, MaskVT, OpBaseName>; 3060eae32dcSDimitry Andric defm : Binary_vv<OpNode, DataVT, MaskVT, OpBaseName>; 3070eae32dcSDimitry Andric} 3080eae32dcSDimitry Andric 3090eae32dcSDimitry Andricmulticlass Binary_rv_vr_vv< 3100eae32dcSDimitry Andric SDPatternOperator OpNode, 3110eae32dcSDimitry Andric ValueType ScalarVT, ValueType DataVT, ValueType MaskVT, 3120eae32dcSDimitry Andric string OpBaseName> { 3130eae32dcSDimitry Andric defm : Binary_rv<OpNode, ScalarVT, DataVT, MaskVT, OpBaseName>; 3140eae32dcSDimitry Andric defm : Binary_vr_vv<OpNode, ScalarVT, DataVT, MaskVT, OpBaseName>; 315e8d8bef9SDimitry Andric} 316e8d8bef9SDimitry Andric 317e8d8bef9SDimitry Andric// Expand both 64bit and 32 bit variant (256 elements) 3180eae32dcSDimitry Andricmulticlass Binary_rv_vv_ShortLong< 319e8d8bef9SDimitry Andric SDPatternOperator OpNode, 320e8d8bef9SDimitry Andric ValueType LongScalarVT, ValueType LongDataVT, string LongOpBaseName, 321e8d8bef9SDimitry Andric ValueType ShortScalarVT, ValueType ShortDataVT, string ShortOpBaseName> { 3220eae32dcSDimitry Andric defm : Binary_rv_vv<OpNode, 323e8d8bef9SDimitry Andric LongScalarVT, LongDataVT, v256i1, 324349cc55cSDimitry Andric LongOpBaseName>; 3250eae32dcSDimitry Andric defm : Binary_rv_vv<OpNode, 326e8d8bef9SDimitry Andric ShortScalarVT, ShortDataVT, v256i1, 327349cc55cSDimitry Andric ShortOpBaseName>; 328e8d8bef9SDimitry Andric} 329e8d8bef9SDimitry Andric 3300eae32dcSDimitry Andricmulticlass Binary_vr_vv_ShortLong< 3310eae32dcSDimitry Andric SDPatternOperator OpNode, 3320eae32dcSDimitry Andric ValueType LongScalarVT, ValueType LongDataVT, string LongOpBaseName, 3330eae32dcSDimitry Andric ValueType ShortScalarVT, ValueType ShortDataVT, string ShortOpBaseName> { 3340eae32dcSDimitry Andric defm : Binary_vr_vv<OpNode, 3350eae32dcSDimitry Andric LongScalarVT, LongDataVT, v256i1, 3360eae32dcSDimitry Andric LongOpBaseName>; 3370eae32dcSDimitry Andric defm : Binary_vr_vv<OpNode, 3380eae32dcSDimitry Andric ShortScalarVT, ShortDataVT, v256i1, 3390eae32dcSDimitry Andric ShortOpBaseName>; 3400eae32dcSDimitry Andric} 341e8d8bef9SDimitry Andric 3420eae32dcSDimitry Andricmulticlass Binary_rv_vr_vv_ShortLong< 3430eae32dcSDimitry Andric SDPatternOperator OpNode, 3440eae32dcSDimitry Andric ValueType LongScalarVT, ValueType LongDataVT, string LongOpBaseName, 3450eae32dcSDimitry Andric ValueType ShortScalarVT, ValueType ShortDataVT, string ShortOpBaseName> { 3460eae32dcSDimitry Andric defm : Binary_rv_vr_vv<OpNode, 3470eae32dcSDimitry Andric LongScalarVT, LongDataVT, v256i1, 3480eae32dcSDimitry Andric LongOpBaseName>; 3490eae32dcSDimitry Andric defm : Binary_rv_vr_vv<OpNode, 3500eae32dcSDimitry Andric ShortScalarVT, ShortDataVT, v256i1, 3510eae32dcSDimitry Andric ShortOpBaseName>; 3520eae32dcSDimitry Andric} 3530eae32dcSDimitry Andric 3540eae32dcSDimitry Andricdefm : Binary_rv_vv_ShortLong<c_vvp_add, 355e8d8bef9SDimitry Andric i64, v256i64, "VADDSL", 356e8d8bef9SDimitry Andric i32, v256i32, "VADDSWSX">; 3570eae32dcSDimitry Andricdefm : Binary_rv_vv_ShortLong<vvp_sub, 3580eae32dcSDimitry Andric i64, v256i64, "VSUBSL", 3590eae32dcSDimitry Andric i32, v256i32, "VSUBSWSX">; 3600eae32dcSDimitry Andricdefm : Binary_rv_vv_ShortLong<c_vvp_mul, 3610eae32dcSDimitry Andric i64, v256i64, "VMULSL", 3620eae32dcSDimitry Andric i32, v256i32, "VMULSWSX">; 3630eae32dcSDimitry Andricdefm : Binary_rv_vr_vv_ShortLong<vvp_sdiv, 3640eae32dcSDimitry Andric i64, v256i64, "VDIVSL", 3650eae32dcSDimitry Andric i32, v256i32, "VDIVSWSX">; 3660eae32dcSDimitry Andricdefm : Binary_rv_vr_vv_ShortLong<vvp_udiv, 3670eae32dcSDimitry Andric i64, v256i64, "VDIVUL", 3680eae32dcSDimitry Andric i32, v256i32, "VDIVUW">; 3690eae32dcSDimitry Andricdefm : Binary_rv_vv_ShortLong<c_vvp_and, 370e8d8bef9SDimitry Andric i64, v256i64, "VAND", 371e8d8bef9SDimitry Andric i32, v256i32, "PVANDLO">; 3720eae32dcSDimitry Andricdefm : Binary_rv_vv_ShortLong<c_vvp_or, 3730eae32dcSDimitry Andric i64, v256i64, "VOR", 3740eae32dcSDimitry Andric i32, v256i32, "PVORLO">; 3750eae32dcSDimitry Andricdefm : Binary_rv_vv_ShortLong<c_vvp_xor, 3760eae32dcSDimitry Andric i64, v256i64, "VXOR", 3770eae32dcSDimitry Andric i32, v256i32, "PVXORLO">; 3780eae32dcSDimitry Andricdefm : Binary_vr_vv_ShortLong<vvp_shl, 3790eae32dcSDimitry Andric i64, v256i64, "VSLL", 3800eae32dcSDimitry Andric i32, v256i32, "PVSLLLO">; 3810eae32dcSDimitry Andricdefm : Binary_vr_vv_ShortLong<vvp_sra, 3820eae32dcSDimitry Andric i64, v256i64, "VSRAL", 3830eae32dcSDimitry Andric i32, v256i32, "PVSRALO">; 3840eae32dcSDimitry Andricdefm : Binary_vr_vv_ShortLong<vvp_srl, 3850eae32dcSDimitry Andric i64, v256i64, "VSRL", 3860eae32dcSDimitry Andric i32, v256i32, "PVSRLLO">; 3870eae32dcSDimitry Andric 3880eae32dcSDimitry Andricdefm : Binary_rv_vv_ShortLong<c_vvp_fadd, 3890eae32dcSDimitry Andric f64, v256f64, "VFADDD", 3900eae32dcSDimitry Andric f32, v256f32, "PVFADDUP">; 3910eae32dcSDimitry Andricdefm : Binary_rv_vv_ShortLong<c_vvp_fmul, 3920eae32dcSDimitry Andric f64, v256f64, "VFMULD", 3930eae32dcSDimitry Andric f32, v256f32, "PVFMULUP">; 3940eae32dcSDimitry Andricdefm : Binary_rv_vv_ShortLong<vvp_fsub, 3950eae32dcSDimitry Andric f64, v256f64, "VFSUBD", 3960eae32dcSDimitry Andric f32, v256f32, "PVFSUBUP">; 3970eae32dcSDimitry Andricdefm : Binary_rv_vr_vv_ShortLong<vvp_fdiv, 3980eae32dcSDimitry Andric f64, v256f64, "VFDIVD", 3990eae32dcSDimitry Andric f32, v256f32, "VFDIVS">; 40004eeddc0SDimitry Andric 401*81ad6265SDimitry Andricdefm : Binary_rv_vv<c_vvp_and, 402*81ad6265SDimitry Andric i64, v512i32, v512i1, "PVAND">; 403*81ad6265SDimitry Andricdefm : Binary_rv_vv<c_vvp_or, 404*81ad6265SDimitry Andric i64, v512i32, v512i1, "PVOR">; 405*81ad6265SDimitry Andricdefm : Binary_rv_vv<c_vvp_xor, 406*81ad6265SDimitry Andric i64, v512i32, v512i1, "PVXOR">; 407*81ad6265SDimitry Andric 408*81ad6265SDimitry Andricdefm : Binary_rv_vv<c_vvp_add, 409*81ad6265SDimitry Andric i64, v512i32, v512i1, "PVADDU">; 410*81ad6265SDimitry Andricdefm : Binary_rv_vv<vvp_sub, 411*81ad6265SDimitry Andric i64, v512i32, v512i1, "PVSUBU">; 412*81ad6265SDimitry Andricdefm : Binary_vr_vv<vvp_srl, 413*81ad6265SDimitry Andric i64, v512i32, v512i1, "PVSRL">; 414*81ad6265SDimitry Andricdefm : Binary_vr_vv<vvp_sra, 415*81ad6265SDimitry Andric i64, v512i32, v512i1, "PVSRA">; 416*81ad6265SDimitry Andricdefm : Binary_vr_vv<vvp_shl, 417*81ad6265SDimitry Andric i64, v512i32, v512i1, "PVSLL">; 418*81ad6265SDimitry Andric 419*81ad6265SDimitry Andricdefm : Binary_rv_vv<c_vvp_fadd, 420*81ad6265SDimitry Andric i64, v512f32, v512i1, "PVFADD">; 421*81ad6265SDimitry Andricdefm : Binary_rv_vv<c_vvp_fmul, 422*81ad6265SDimitry Andric i64, v512f32, v512i1, "PVFMUL">; 423*81ad6265SDimitry Andricdefm : Binary_rv_vv<vvp_fsub, 424*81ad6265SDimitry Andric i64, v512f32, v512i1, "PVFSUB">; 425*81ad6265SDimitry Andric 426*81ad6265SDimitry Andricmulticlass Ternary_vvv< 427*81ad6265SDimitry Andric SDPatternOperator OpNode, ValueType DataVT, 428*81ad6265SDimitry Andric ValueType MaskVT, string OpBaseName> { 429*81ad6265SDimitry Andric // Masked with passthru. 430*81ad6265SDimitry Andric def : Pat<(vvp_select 431*81ad6265SDimitry Andric (OpNode DataVT:$vx, DataVT:$vy, DataVT:$vz, 432*81ad6265SDimitry Andric (MaskVT srcvalue), (i32 srcvalue)), 433*81ad6265SDimitry Andric DataVT:$vfalse, 434*81ad6265SDimitry Andric MaskVT:$mask, 435*81ad6265SDimitry Andric i32:$avl), 436*81ad6265SDimitry Andric (!cast<Instruction>(OpBaseName#"vvvml_v") 437*81ad6265SDimitry Andric $vx, $vy, $vz, $mask, $avl, $vfalse)>; 438*81ad6265SDimitry Andric 439*81ad6265SDimitry Andric // Unmasked. 440*81ad6265SDimitry Andric def : Pat<(OpNode DataVT:$vx, DataVT:$vy, DataVT:$vz, 441*81ad6265SDimitry Andric (MaskVT true_mask), i32:$avl), 442*81ad6265SDimitry Andric (!cast<Instruction>(OpBaseName#"vvvl") 443*81ad6265SDimitry Andric $vx, $vy, $vz, $avl)>; 444*81ad6265SDimitry Andric 445*81ad6265SDimitry Andric // Masked. 446*81ad6265SDimitry Andric def : Pat<(OpNode DataVT:$vx, DataVT:$vy, DataVT:$vz, 447*81ad6265SDimitry Andric MaskVT:$mask, i32:$avl), 448*81ad6265SDimitry Andric (!cast<Instruction>(OpBaseName#"vvvml") 449*81ad6265SDimitry Andric $vx, $vy, $vz, $mask, $avl)>; 450*81ad6265SDimitry Andric} 451*81ad6265SDimitry Andric 452*81ad6265SDimitry Andricmulticlass Ternary_rvv< 453*81ad6265SDimitry Andric SDPatternOperator OpNode, 454*81ad6265SDimitry Andric ValueType ScalarVT, ValueType DataVT, 455*81ad6265SDimitry Andric ValueType MaskVT, string OpBaseName> { 456*81ad6265SDimitry Andric // Masked with passthru, broadcast first. 457*81ad6265SDimitry Andric def : Pat<(vvp_select 458*81ad6265SDimitry Andric (OpNode 459*81ad6265SDimitry Andric (any_broadcast ScalarVT:$sx), DataVT:$vy, DataVT:$vz, 460*81ad6265SDimitry Andric (MaskVT srcvalue), (i32 srcvalue)), 461*81ad6265SDimitry Andric DataVT:$vfalse, 462*81ad6265SDimitry Andric MaskVT:$mask, 463*81ad6265SDimitry Andric i32:$avl), 464*81ad6265SDimitry Andric (!cast<Instruction>(OpBaseName#"rvvml_v") 465*81ad6265SDimitry Andric $sx, $vy, $vz, $mask, $avl, $vfalse)>; 466*81ad6265SDimitry Andric 467*81ad6265SDimitry Andric // Unmasked, broadcast first. 468*81ad6265SDimitry Andric def : Pat<(OpNode 469*81ad6265SDimitry Andric (any_broadcast ScalarVT:$sx), DataVT:$vy, DataVT:$vz, 470*81ad6265SDimitry Andric (MaskVT true_mask), i32:$avl), 471*81ad6265SDimitry Andric (!cast<Instruction>(OpBaseName#"rvvl") 472*81ad6265SDimitry Andric $sx, $vy, $vz, $avl)>; 473*81ad6265SDimitry Andric 474*81ad6265SDimitry Andric // Masked, broadcast first. 475*81ad6265SDimitry Andric def : Pat<(OpNode 476*81ad6265SDimitry Andric (any_broadcast ScalarVT:$sx), DataVT:$vy, DataVT:$vz, 477*81ad6265SDimitry Andric MaskVT:$mask, i32:$avl), 478*81ad6265SDimitry Andric (!cast<Instruction>(OpBaseName#"rvvml") 479*81ad6265SDimitry Andric $sx, $vy, $vz, $mask, $avl)>; 480*81ad6265SDimitry Andric} 481*81ad6265SDimitry Andric 482*81ad6265SDimitry Andricmulticlass Ternary_vrv< 483*81ad6265SDimitry Andric SDPatternOperator OpNode, 484*81ad6265SDimitry Andric ValueType ScalarVT, ValueType DataVT, 485*81ad6265SDimitry Andric ValueType MaskVT, string OpBaseName> { 486*81ad6265SDimitry Andric // Masked with passthru, broadcast second. 487*81ad6265SDimitry Andric def : Pat<(vvp_select 488*81ad6265SDimitry Andric (OpNode 489*81ad6265SDimitry Andric DataVT:$vx, (any_broadcast ScalarVT:$sy), DataVT:$vz, 490*81ad6265SDimitry Andric (MaskVT srcvalue), (i32 srcvalue)), 491*81ad6265SDimitry Andric DataVT:$vfalse, 492*81ad6265SDimitry Andric MaskVT:$mask, 493*81ad6265SDimitry Andric i32:$avl), 494*81ad6265SDimitry Andric (!cast<Instruction>(OpBaseName#"vrvml_v") 495*81ad6265SDimitry Andric $vx, $sy, $vz, 496*81ad6265SDimitry Andric $mask, $avl, $vfalse)>; 497*81ad6265SDimitry Andric 498*81ad6265SDimitry Andric // Unmasked, broadcast second. 499*81ad6265SDimitry Andric def : Pat<(OpNode 500*81ad6265SDimitry Andric DataVT:$vx, (any_broadcast ScalarVT:$sy), DataVT:$vz, 501*81ad6265SDimitry Andric (MaskVT true_mask), i32:$avl), 502*81ad6265SDimitry Andric (!cast<Instruction>(OpBaseName#"vrvl") 503*81ad6265SDimitry Andric $vx, $sy, $vz, $avl)>; 504*81ad6265SDimitry Andric 505*81ad6265SDimitry Andric // Masked, broadcast second. 506*81ad6265SDimitry Andric def : Pat<(OpNode 507*81ad6265SDimitry Andric DataVT:$vx, (any_broadcast ScalarVT:$sy), DataVT:$vz, 508*81ad6265SDimitry Andric MaskVT:$mask, i32:$avl), 509*81ad6265SDimitry Andric (!cast<Instruction>(OpBaseName#"vrvml") 510*81ad6265SDimitry Andric $vx, $sy, $vz, $mask, $avl)>; 511*81ad6265SDimitry Andric} 512*81ad6265SDimitry Andric 513*81ad6265SDimitry Andricmulticlass Ternary_rvv_vrv_vvv< 514*81ad6265SDimitry Andric SDPatternOperator OpNode, 515*81ad6265SDimitry Andric ValueType ScalarVT, ValueType DataVT, 516*81ad6265SDimitry Andric ValueType MaskVT, string OpBaseName> { 517*81ad6265SDimitry Andric defm : Ternary_rvv<OpNode, ScalarVT, DataVT, MaskVT, OpBaseName>; 518*81ad6265SDimitry Andric defm : Ternary_vrv<OpNode, ScalarVT, DataVT, MaskVT, OpBaseName>; 519*81ad6265SDimitry Andric defm : Ternary_vvv<OpNode, DataVT, MaskVT, OpBaseName>; 520*81ad6265SDimitry Andric} 521*81ad6265SDimitry Andric 522*81ad6265SDimitry Andric// Expand both 64bit and 32 bit variant (256 elements) 523*81ad6265SDimitry Andricmulticlass Ternary_ShortLong< 524*81ad6265SDimitry Andric SDPatternOperator OpNode, 525*81ad6265SDimitry Andric ValueType LongScalarVT, ValueType LongDataVT, string LongOpBaseName, 526*81ad6265SDimitry Andric ValueType ShortScalarVT, ValueType ShortDataVT, string ShortOpBaseName> { 527*81ad6265SDimitry Andric defm : Ternary_rvv_vrv_vvv<OpNode, LongScalarVT, LongDataVT, 528*81ad6265SDimitry Andric v256i1, LongOpBaseName>; 529*81ad6265SDimitry Andric defm : Ternary_rvv_vrv_vvv<OpNode, ShortScalarVT, ShortDataVT, 530*81ad6265SDimitry Andric v256i1, ShortOpBaseName>; 531*81ad6265SDimitry Andric} 532*81ad6265SDimitry Andric 533*81ad6265SDimitry Andricdefm : Ternary_ShortLong<c_vvp_ffma, 534*81ad6265SDimitry Andric f64, v256f64, "VFMADD", f32, v256f32, "VFMADS">; 535*81ad6265SDimitry Andricdefm : Ternary_rvv_vrv_vvv<c_vvp_ffma, 536*81ad6265SDimitry Andric i64, v512f32, v512i1, "PVFMAD">; 537*81ad6265SDimitry Andric 53804eeddc0SDimitry Andricmulticlass Merge_mvv< 53904eeddc0SDimitry Andric SDPatternOperator OpNode, 54004eeddc0SDimitry Andric ValueType DataVT, ValueType MaskVT, 54104eeddc0SDimitry Andric string OpBaseName> { 54204eeddc0SDimitry Andric // Masked. 54304eeddc0SDimitry Andric def : Pat<(OpNode 54404eeddc0SDimitry Andric DataVT:$vtrue, DataVT:$vfalse, 54504eeddc0SDimitry Andric MaskVT:$vm, 54604eeddc0SDimitry Andric i32:$avl), 54704eeddc0SDimitry Andric (!cast<Instruction>(OpBaseName#"vvml_v") 54804eeddc0SDimitry Andric $vfalse, $vtrue, $vm, $avl, $vfalse)>; 54904eeddc0SDimitry Andric} 55004eeddc0SDimitry Andric 55104eeddc0SDimitry Andricmulticlass Merge_mvv_ShortLong< 55204eeddc0SDimitry Andric SDPatternOperator OpNode, 55304eeddc0SDimitry Andric ValueType LongDataVT, ValueType ShortDataVT, 55404eeddc0SDimitry Andric string OpBaseName> { 55504eeddc0SDimitry Andric defm : Merge_mvv<OpNode, 55604eeddc0SDimitry Andric LongDataVT, v256i1, 55704eeddc0SDimitry Andric OpBaseName>; 55804eeddc0SDimitry Andric defm : Merge_mvv<OpNode, 55904eeddc0SDimitry Andric ShortDataVT, v256i1, 56004eeddc0SDimitry Andric OpBaseName>; 56104eeddc0SDimitry Andric} 56204eeddc0SDimitry Andric 56304eeddc0SDimitry Andricdefm : Merge_mvv_ShortLong<vvp_select, 56404eeddc0SDimitry Andric v256f64, 56504eeddc0SDimitry Andric v256f32, "VMRG">; 56604eeddc0SDimitry Andricdefm : Merge_mvv_ShortLong<vvp_select, 56704eeddc0SDimitry Andric v256i64, 56804eeddc0SDimitry Andric v256i32, "VMRG">; 569*81ad6265SDimitry Andric 570*81ad6265SDimitry Andricmulticlass Set_CC<ValueType DataVT, string FmkBaseName, string CmpBaseName, SDPatternOperator CCMatcher, SDNodeXForm CCConv> { 571*81ad6265SDimitry Andric // Unmasked. 572*81ad6265SDimitry Andric def : Pat<(v256i1 (vvp_setcc 573*81ad6265SDimitry Andric DataVT:$LHS, DataVT:$RHS, CCMatcher:$cond, (v256i1 true_mask), i32:$vl)), 574*81ad6265SDimitry Andric (!cast<Instruction>(FmkBaseName#"vl") 575*81ad6265SDimitry Andric (CCConv $cond), 576*81ad6265SDimitry Andric (!cast<Instruction>(CmpBaseName#"vvl") 577*81ad6265SDimitry Andric $LHS, $RHS, $vl), 578*81ad6265SDimitry Andric $vl)>; 579*81ad6265SDimitry Andric // Masked. 580*81ad6265SDimitry Andric def : Pat<(v256i1 (vvp_setcc 581*81ad6265SDimitry Andric DataVT:$LHS, DataVT:$RHS, CCMatcher:$cond, v256i1:$vm, i32:$vl)), 582*81ad6265SDimitry Andric (!cast<Instruction>(FmkBaseName#"vml") 583*81ad6265SDimitry Andric (CCConv $cond), 584*81ad6265SDimitry Andric (!cast<Instruction>(CmpBaseName#"vvl") 585*81ad6265SDimitry Andric $LHS, $RHS, $vl), 586*81ad6265SDimitry Andric $vm, $vl)>; 587*81ad6265SDimitry Andric} 588*81ad6265SDimitry Andric 589*81ad6265SDimitry Andricdefm : Set_CC<v256i64,"VFMKL","VCMPUL",CCUIOp,icond2cc>; 590*81ad6265SDimitry Andricdefm : Set_CC<v256i64,"VFMKL","VCMPSL",CCSIOp,icond2cc>; 591*81ad6265SDimitry Andricdefm : Set_CC<v256f64,"VFMKL","VFCMPD",cond,fcond2cc>; 592*81ad6265SDimitry Andric 593*81ad6265SDimitry Andricdefm : Set_CC<v256i32,"VFMKW","VCMPUW",CCUIOp,icond2cc>; 594*81ad6265SDimitry Andricdefm : Set_CC<v256i32,"VFMKW","VCMPSWZX",CCSIOp,icond2cc>; 595*81ad6265SDimitry Andricdefm : Set_CC<v256f32,"VFMKS","VFCMPS",cond,fcond2cc>; 596*81ad6265SDimitry Andric 597*81ad6265SDimitry Andricmulticlass Reduce_GenericInt<ValueType VectorVT, 598*81ad6265SDimitry Andric RegisterClass ResRC, ValueType ResVT, 599*81ad6265SDimitry Andric string VVPRedOp, string RedInstName> { 600*81ad6265SDimitry Andric // Unmasked. 601*81ad6265SDimitry Andric def : Pat <(ResVT (!cast<SDPatternOperator>("vvp_reduce_"#VVPRedOp) 602*81ad6265SDimitry Andric VectorVT:$vx, (v256i1 true_mask), i32:$vl)), 603*81ad6265SDimitry Andric (COPY_TO_REGCLASS 604*81ad6265SDimitry Andric (!cast<Instruction>("LVSvi") 605*81ad6265SDimitry Andric (!cast<Instruction>(RedInstName#"vl") $vx, $vl), 0), 606*81ad6265SDimitry Andric ResRC)>; 607*81ad6265SDimitry Andric 608*81ad6265SDimitry Andric // Masked. 609*81ad6265SDimitry Andric def : Pat <(ResVT (!cast<SDPatternOperator>("vvp_reduce_"#VVPRedOp) 610*81ad6265SDimitry Andric VectorVT:$vx, v256i1:$vm, i32:$vl)), 611*81ad6265SDimitry Andric (COPY_TO_REGCLASS 612*81ad6265SDimitry Andric (!cast<Instruction>("LVSvi") 613*81ad6265SDimitry Andric (!cast<Instruction>(RedInstName#"vml") $vx, $vm, $vl), 0), 614*81ad6265SDimitry Andric ResRC)>; 615*81ad6265SDimitry Andric} 616*81ad6265SDimitry Andric 617*81ad6265SDimitry Andricmulticlass IntReduce_ShortLong<ValueType VectorVT, 618*81ad6265SDimitry Andric RegisterClass ResRC, ValueType ResVT, 619*81ad6265SDimitry Andric string SumSuffix, string MinMaxSuffix> { 620*81ad6265SDimitry Andric defm: Reduce_GenericInt<VectorVT, ResRC, ResVT, "or", "VROR">; 621*81ad6265SDimitry Andric defm: Reduce_GenericInt<VectorVT, ResRC, ResVT, "and", "VRAND">; 622*81ad6265SDimitry Andric defm: Reduce_GenericInt<VectorVT, ResRC, ResVT, "xor", "VRXOR">; 623*81ad6265SDimitry Andric defm: Reduce_GenericInt<VectorVT, ResRC, ResVT, "add", "VSUM"#SumSuffix>; 624*81ad6265SDimitry Andric defm: Reduce_GenericInt<VectorVT, ResRC, ResVT, "smax", "VRMAX"#MinMaxSuffix>; 625*81ad6265SDimitry Andric} 626*81ad6265SDimitry Andric 627*81ad6265SDimitry Andricdefm: IntReduce_ShortLong<v256i64, I64, i64, "L","SLFST">; 628*81ad6265SDimitry Andricdefm: IntReduce_ShortLong<v256i32, I32, i32, "WSX","SWFSTSX">; 629