Skip to content

Commit 91fad11

Browse files
author
Simon Moll
committed
[VE] v512|256 f32|64 fneg isel and tests
fneg instruction isel and tests. We do this also in preparation of fused negatate-multiple-add fp operations. Reviewed By: kaz7 Differential Revision: https://reviews.llvm.org/D121620
1 parent e5822de commit 91fad11

File tree

8 files changed

+123
-3
lines changed

8 files changed

+123
-3
lines changed

llvm/lib/Target/VE/VECustomDAG.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,16 @@ bool isVVPOrVEC(unsigned Opcode) {
133133
return false;
134134
}
135135

136+
bool isVVPUnaryOp(unsigned VVPOpcode) {
137+
switch (VVPOpcode) {
138+
#define ADD_UNARY_VVP_OP(VVPNAME, ...) \
139+
case VEISD::VVPNAME: \
140+
return true;
141+
#include "VVPNodes.def"
142+
}
143+
return false;
144+
}
145+
136146
bool isVVPBinaryOp(unsigned VVPOpcode) {
137147
switch (VVPOpcode) {
138148
#define ADD_BINARY_VVP_OP(VVPNAME, ...) \

llvm/lib/Target/VE/VECustomDAG.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ namespace llvm {
2323

2424
Optional<unsigned> getVVPOpcode(unsigned Opcode);
2525

26+
bool isVVPUnaryOp(unsigned Opcode);
2627
bool isVVPBinaryOp(unsigned Opcode);
2728
bool isVVPReductionOp(unsigned Opcode);
2829

llvm/lib/Target/VE/VVPISelLowering.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -79,11 +79,12 @@ SDValue VETargetLowering::lowerToVVP(SDValue Op, SelectionDAG &DAG) const {
7979
if (!Mask)
8080
Mask = CDAG.getConstantMask(Packing, true);
8181

82-
if (isVVPBinaryOp(VVPOpcode)) {
83-
assert(LegalVecVT.isSimple());
82+
assert(LegalVecVT.isSimple());
83+
if (isVVPUnaryOp(VVPOpcode))
84+
return CDAG.getNode(VVPOpcode, LegalVecVT, {Op->getOperand(0), Mask, AVL});
85+
if (isVVPBinaryOp(VVPOpcode))
8486
return CDAG.getNode(VVPOpcode, LegalVecVT,
8587
{Op->getOperand(0), Op->getOperand(1), Mask, AVL});
86-
}
8788
if (isVVPReductionOp(VVPOpcode)) {
8889
auto SrcHasStart = hasReductionStartParam(Op->getOpcode());
8990
SDValue StartV = SrcHasStart ? Op->getOperand(0) : SDValue();

llvm/lib/Target/VE/VVPInstrInfo.td

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,15 @@ def SDTIntBinOpVVP : SDTypeProfile<1, 4, [ // vp_add, vp_and, etc.
6262
IsVLVT<4>
6363
]>;
6464

65+
// UnaryFPOp(x,mask,vl)
66+
def SDTFPUnaryOpVVP : SDTypeProfile<1, 3, [
67+
SDTCisSameAs<0, 1>,
68+
SDTCisFP<0>,
69+
SDTCisInt<2>,
70+
SDTCisSameNumEltsAs<0, 2>,
71+
IsVLVT<3>
72+
]>;
73+
6574
// BinaryFPOp(x,y,mask,vl)
6675
def SDTFPBinOpVVP : SDTypeProfile<1, 4, [ // vvp_fadd, etc.
6776
SDTCisSameAs<0, 1>,
@@ -152,6 +161,8 @@ def vvp_srl : SDNode<"VEISD::VVP_SRL", SDTIntBinOpVVP>;
152161
def vvp_sra : SDNode<"VEISD::VVP_SRA", SDTIntBinOpVVP>;
153162
def vvp_shl : SDNode<"VEISD::VVP_SHL", SDTIntBinOpVVP>;
154163

164+
def vvp_fneg : SDNode<"VEISD::VVP_FNEG", SDTFPUnaryOpVVP>;
165+
155166
def vvp_fadd : SDNode<"VEISD::VVP_FADD", SDTFPBinOpVVP>;
156167
def c_vvp_fadd : vvp_commutative<vvp_fadd>;
157168
def vvp_fsub : SDNode<"VEISD::VVP_FSUB", SDTFPBinOpVVP>;

llvm/lib/Target/VE/VVPInstrPatternsVec.td

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,53 @@ defm : VectorScatter<v256f32, v256i64, v256i1, "VSCU">;
131131
defm : VectorScatter<v256i32, v256i64, v256i1, "VSCL">;
132132

133133

134+
/// FNEG {
135+
// Directly modify the sign bit to flip the sign.
136+
137+
// Set sign bits in a pack of <2 x f32>.
138+
def packed_fneg_imm : OutPatFrag<(ins ),
139+
(i64 (SLLri (i64 (ORim 1, (i32 32))), 31))>;
140+
141+
142+
multiclass FNeg<ValueType DataVT> {
143+
// Masked with select.
144+
def : Pat<(vvp_select (vvp_fneg DataVT:$vx, (v256i1 srcvalue), (i32 srcvalue)),
145+
DataVT:$vfalse,
146+
v256i1:$mask,
147+
i32:$avl),
148+
(VXORmvml_v (i32 1), $vx, $mask, $avl, $vfalse)>;
149+
150+
// Unmasked.
151+
def : Pat<(vvp_fneg DataVT:$vx, (v256i1 true_mask), i32:$avl),
152+
(VXORmvl (i32 1), $vx, $avl)>;
153+
154+
// Masked.
155+
def : Pat<(vvp_fneg DataVT:$vx, v256i1:$mask, i32:$avl),
156+
(VXORmvml (i32 1), $vx, $mask, $avl)>;
157+
}
158+
159+
defm: FNeg<v256f32>;
160+
defm: FNeg<v256f64>;
161+
162+
///// Packed FNeg /////
163+
164+
// Masked with select.
165+
def : Pat<(vvp_select (vvp_fneg v512f32:$vx, (v512i1 srcvalue), (i32 srcvalue)),
166+
v512f32:$vfalse,
167+
v512i1:$mask,
168+
i32:$avl),
169+
(v512f32 (PVXORrvml_v (packed_fneg_imm ), $vx, $mask, $avl, $vfalse))>;
170+
171+
// Unmasked.
172+
def : Pat<(vvp_fneg v512f32:$vx, (v512i1 true_mask), i32:$avl),
173+
(v512f32 (PVXORrvl (packed_fneg_imm ), $vx, $avl))>;
174+
175+
// Masked.
176+
def : Pat<(vvp_fneg v512f32:$vx, v512i1:$mask, i32:$avl),
177+
(v512f32 (PVXORrvml (packed_fneg_imm ), $vx, $mask, $avl))>;
178+
179+
/// } FNEG
180+
134181
multiclass Binary_rv<SDPatternOperator OpNode,
135182
ValueType ScalarVT, ValueType DataVT,
136183
ValueType MaskVT, string OpBaseName> {

llvm/lib/Target/VE/VVPNodes.def

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,14 @@
2424
#define ADD_VVP_OP(X, Y)
2525
#endif
2626

27+
/// ADD_UNARY_VVP_OP(VVPNAME,SDNAME)
28+
/// \p VVPName is a VVP Unary operator.
29+
/// \p SDNAME is the generic SD opcode corresponding to \p VVPName.
30+
#ifndef ADD_UNARY_VVP_OP
31+
#define ADD_UNARY_VVP_OP(VVPNAME,SDNAME) \
32+
ADD_VVP_OP(VVPNAME,SDNAME)
33+
#endif
34+
2735
/// ADD_BINARY_VVP_OP(VVPNAME,SDNAME)
2836
/// \p VVPName is a VVP Binary operator.
2937
/// \p SDNAME is the generic SD opcode corresponding to \p VVPName.
@@ -100,6 +108,7 @@ ADD_BINARY_VVP_OP_COMPACT(OR) REGISTER_PACKED(VVP_OR)
100108
ADD_BINARY_VVP_OP_COMPACT(XOR) REGISTER_PACKED(VVP_XOR)
101109

102110
// FP arithmetic.
111+
ADD_UNARY_VVP_OP(VVP_FNEG, FNEG) HANDLE_VP_TO_VVP(VP_FNEG, VVP_FNEG) REGISTER_PACKED(VVP_FNEG)
103112
ADD_BINARY_VVP_OP_COMPACT(FADD) REGISTER_PACKED(VVP_FADD)
104113
ADD_BINARY_VVP_OP_COMPACT(FSUB) REGISTER_PACKED(VVP_FSUB)
105114
ADD_BINARY_VVP_OP_COMPACT(FMUL) REGISTER_PACKED(VVP_FMUL)
@@ -117,6 +126,7 @@ HANDLE_VP_TO_VVP(VP_MERGE, VVP_SELECT)
117126

118127
#undef ADD_BINARY_VVP_OP
119128
#undef ADD_TERNARY_VVP_OP
129+
#undef ADD_UNARY_VVP_OP
120130
#undef ADD_BINARY_VVP_OP_COMPACT
121131
#undef ADD_REDUCE_VVP_OP
122132
#undef ADD_VVP_OP
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2+
; RUN: llc < %s -march=ve -mattr=+vpu | FileCheck %s
3+
4+
define fastcc <512 x float> @test_vec_fneg_v512f32_v(<512 x float> %v) {
5+
; CHECK-LABEL: test_vec_fneg_v512f32_v:
6+
; CHECK: # %bb.0:
7+
; CHECK-NEXT: or %s0, 1, (32)1
8+
; CHECK-NEXT: sll %s0, %s0, 31
9+
; CHECK-NEXT: lea %s1, 512
10+
; CHECK-NEXT: lvl %s1
11+
; CHECK-NEXT: pvxor %v0, %s0, %v0
12+
; CHECK-NEXT: b.l.t (, %s10)
13+
%neg = fneg <512 x float> %v
14+
ret <512 x float> %neg
15+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2+
; RUN: llc < %s -march=ve -mattr=+vpu | FileCheck %s
3+
4+
define fastcc <256 x float> @test_vec_fneg_v256f32_v(<256 x float> %v) {
5+
; CHECK-LABEL: test_vec_fneg_v256f32_v:
6+
; CHECK: # %bb.0:
7+
; CHECK-NEXT: lea %s0, 256
8+
; CHECK-NEXT: lvl %s0
9+
; CHECK-NEXT: vxor %v0, (1)1, %v0
10+
; CHECK-NEXT: b.l.t (, %s10)
11+
%neg = fneg <256 x float> %v
12+
ret <256 x float> %neg
13+
}
14+
15+
define fastcc <256 x double> @test_vec_fneg_v256f64_v(<256 x double> %v) {
16+
; CHECK-LABEL: test_vec_fneg_v256f64_v:
17+
; CHECK: # %bb.0:
18+
; CHECK-NEXT: lea %s0, 256
19+
; CHECK-NEXT: lvl %s0
20+
; CHECK-NEXT: vxor %v0, (1)1, %v0
21+
; CHECK-NEXT: b.l.t (, %s10)
22+
%neg = fneg <256 x double> %v
23+
ret <256 x double> %neg
24+
}
25+

0 commit comments

Comments
 (0)